ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA2OTlhYQotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsMTE0IEBACisjCisjICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QsIEluYy4KKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgVGhpcyBkb2N1bWVudCBpcyB0aGUgcHJvcGVydHkgb2YgTmVzdC4gSXQgaXMgY29uc2lkZXJlZAorIyAgICBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uLgorIworIyAgICBUaGlzIGRvY3VtZW50IG1heSBub3QgYmUgcmVwcm9kdWNlZCBvciB0cmFuc21pdHRlZCBpbiBhbnkgZm9ybSwKKyMgICAgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgZXhwcmVzcyB3cml0dGVuIHBlcm1pc3Npb24gb2YKKyMgICAgTmVzdC4KKyMKKyMgICAgRGVzY3JpcHRpb246CisjICAgICAgVGhpcyBmaWxlIGlzIHRoZSBtYWtlZmlsZSBmb3IgdGhlIE9wZW4gU2VjdXJlIFNoZWxsIChTU0gpCisjICAgICAgY2xpZW50IGFuZCBzZXJ2ZXIuCisjCisKK0J1aWxkQ29uZmlnU3BlY2lhbGl6ZWQJOj0gTm8KK0J1aWxkUHJvZHVjdFNwZWNpYWxpemVkCTo9IE5vCisKK2luY2x1ZGUgcHJlLm1haworCitQYWNrYWdlTmFtZQkJOj0gb3BlbnNzaAorCitQYWNrYWdlRXh0ZW5zaW9uCTo9IHRhci5negorUGFja2FnZVNlcGFyYXRvcgk6PSAtCisKK1BhY2thZ2VQYXRjaEFyZ3MJOj0KKworUGFja2FnZUFyY2hpdmUJCTo9ICQoUGFja2FnZU5hbWUpLiQoUGFja2FnZUV4dGVuc2lvbikKK1BhY2thZ2VTb3VyY2VEaXIJOj0gJChQYWNrYWdlTmFtZSkkKFBhY2thZ2VTZXBhcmF0b3IpJChQYWNrYWdlVmVyc2lvbikKKworUGFja2FnZUJ1aWxkTWFrZWZpbGUJPSAkKGNhbGwgR2VuZXJhdGVCdWlsZFBhdGhzLE1ha2VmaWxlKQorCitDbGVhblBhdGhzCQkrPSAkKFBhY2thZ2VMaWNlbnNlRmlsZSkKKworT3BlblNTTERpcgkJOj0gc3cvdHBzL29wZW5zc2wKK09wZW5TU0xTZWFyY2hQYXRoCTo9ICQoY2FsbCBHZW5lcmF0ZVJlc3VsdFBhdGhzLCQoT3BlblNTTERpciksdXNyKQorVGNwV3JhcHBlcnNEaXIJCTo9IHN3L3Rwcy90Y3Bfd3JhcHBlcnMKK1RjcFdyYXBwZXJzU2VhcmNoUGF0aAk6PSAkKGNhbGwgR2VuZXJhdGVSZXN1bHRQYXRocywkKFRjcFdyYXBwZXJzRGlyKSx1c3IpCitabGliRGlyCQkJOj0gc3cvdHBzL3psaWIKK1psaWJTZWFyY2hQYXRoCQk6PSAkKGNhbGwgR2VuZXJhdGVSZXN1bHRQYXRocywkKFpsaWJEaXIpLHVzcikKKworYWxsOiAkKFBhY2thZ2VEZWZhdWx0R29hbCkKKworIyBHZW5lcmF0ZSB0aGUgcGFja2FnZSBsaWNlbnNlIGNvbnRlbnRzLgorCiskKFBhY2thZ2VTb3VyY2VEaXIpL0xJQ0VOQ0U6IHNvdXJjZQorCiskKFBhY2thZ2VMaWNlbnNlRmlsZSk6ICQoUGFja2FnZVNvdXJjZURpcikvTElDRU5DRQorCSQoY29weS1yZXN1bHQpCisKKyMgRXh0cmFjdCB0aGUgc291cmNlIGZyb20gdGhlIGFyY2hpdmUgYW5kIGFwcGx5IHBhdGNoZXMsIGlmIGFueS4KKworJChQYWNrYWdlU291cmNlRGlyKTogJChQYWNrYWdlQXJjaGl2ZSkgJChQYWNrYWdlUGF0Y2hQYXRocykKKwkkKGV4cGFuZC1hbmQtcGF0Y2gtcGFja2FnZSkKKworIyBQcmVwYXJlIHRoZSBzb3VyY2VzLgorCisuUEhPTlk6IHNvdXJjZQorc291cmNlOiB8ICQoUGFja2FnZVNvdXJjZURpcikKKworIyBQYXRjaCB0aGUgc291cmNlcywgaWYgbmVjZXNzYXJ5LgorCisuUEhPTlk6IHBhdGNoCitwYXRjaDogc291cmNlCisKKyMgR2VuZXJhdGUgdGhlIHBhY2thZ2UncyBidWlsZCBtYWtlZmlsZQorCiskKFBhY2thZ2VCdWlsZE1ha2VmaWxlKTogfCAkKFBhY2thZ2VTb3VyY2VEaXIpICQoQnVpbGREaXJlY3RvcnkpCisJJChWZXJib3NlKWNkICQoQnVpbGREaXJlY3RvcnkpICYmIFwKKwkkKENVUkRJUikvJChQYWNrYWdlU291cmNlRGlyKS9jb25maWd1cmUgXAorCUNDPSIkKENDKSIgQVI9JChBUikgUkFOTElCPSQoUkFOTElCKSBTVFJJUD0kKFNUUklQKSBcCisJSU5TVEFMTD0iJChJTlNUQUxMKSAkKElOU1RBTExGTEFHUykiIFwKKwktLWJ1aWxkPSQoSG9zdFR1cGxlKSBcCisJLS1ob3N0PSQoVGFyZ2V0VHVwbGUpIFwKKwktLXByZWZpeD0vdXNyIFwKKwktLXN5c2NvbmZkaXI9L2V0Yy9zc2ggXAorCS0tZGlzYWJsZS1zdHJpcCBcCisJLS13aXRoLXNzbC1kaXI9JChPcGVuU1NMU2VhcmNoUGF0aCkgXAorCS0td2l0aC10Y3Atd3JhcHBlcnM9JChUY3BXcmFwcGVyc1NlYXJjaFBhdGgpIFwKKwktLXdpdGgtemxpYj0kKFpsaWJTZWFyY2hQYXRoKQorCisjIENvbmZpZ3VyZSB0aGUgc291cmNlIGZvciBidWlsZGluZy4KKworLlBIT05ZOiBjb25maWd1cmUKK2NvbmZpZ3VyZTogc291cmNlICQoUGFja2FnZUJ1aWxkTWFrZWZpbGUpCisKKyMgQnVpbGQgdGhlIHNvdXJjZS4KKyMKKyMgV2UgaGF2ZSB0byB1bnNldCBNQUtFRkxBR1Mgc2luY2UgdGhleSBjb25mdXNlIHRoZSBwYWNrYWdlIGJ1aWxkIG90aGVyd2lzZS4KKworLlBIT05ZOiBidWlsZAorYnVpbGQ6IGNvbmZpZ3VyZQorCSQoVmVyYm9zZSl1bnNldCBNQUtFRkxBR1MgJiYgXAorCSQoTUFLRSkgJChKT0JTRkxBRykgLUMgJChCdWlsZERpcmVjdG9yeSkgXAorCWFsbAorCisjIFN0YWdlIHRoZSBidWlsZCB0byBhIHRlbXBvcmFyeSBpbnN0YWxsYXRpb24gYXJlYS4KKyMKKyMgV2UgaGF2ZSB0byB1bnNldCBNQUtFRkxBR1Mgc2luY2UgdGhleSBjb25mdXNlIHRoZSBwYWNrYWdlIGJ1aWxkIG90aGVyd2lzZS4KKworLlBIT05ZOiBzdGFnZQorc3RhZ2U6IGJ1aWxkIHwgJChSZXN1bHREaXJlY3RvcnkpCisJJChWZXJib3NlKXVuc2V0IE1BS0VGTEFHUyAmJiBcCisJJChNQUtFKSAkKEpPQlNGTEFHKSAtQyAkKEJ1aWxkRGlyZWN0b3J5KSBcCisJREVTVERJUj0kKFJlc3VsdERpcmVjdG9yeSkgXAorCWluc3RhbGwtbm9rZXlzCisKK2NsZWFuOgorCSQoVmVyYm9zZSkkKFJNKSAkKFJNRkxBR1MpIC1yICQoUGFja2FnZVNvdXJjZURpcikKKwkkKFZlcmJvc2UpJChSTSkgJChSTUZMQUdTKSAtciAkKEJ1aWxkRGlyZWN0b3J5KQorCSQoVmVyYm9zZSkkKFJNKSAkKFJNRkxBR1MpIC1yICQoUmVzdWx0RGlyZWN0b3J5KQorCitpbmNsdWRlIHBvc3QubWFrCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL0NSRURJVFMgYi9vcGVuc3NoLTYuMHAxL0NSRURJVFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFmMTA1YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvQ1JFRElUUwpAQCAtMCwwICsxLDEwNSBAQAorVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+IC0gQ3JlYXRvciBvZiBTU0gKKworQWFyb24gQ2FtcGJlbGwsIEJvYiBCZWNrLCBNYXJrdXMgRnJpZWRsLCBOaWVscyBQcm92b3MsCitUaGVvIGRlIFJhYWR0LCBhbmQgRHVnIFNvbmcgLSBDcmVhdG9ycyBvZiBPcGVuU1NICisKK0Foc2FuIFJhc2hpZCA8YXJtc0BzY28uY29tPiAtIFVuaXhXYXJlIGxvbmcgcGFzc3dvcmRzCitBbGFpbiBTdC1EZW5pcyA8QWxhaW4uU3QtRGVuaXNAZWMuZ2MuY2E+IC0gSXJpeCBmaXgKK0FsZXhhbmRyZSBPbGl2YSA8b2xpdmFAbHNkLmljLnVuaWNhbXAuYnI+IC0gQUlYIGZpeGVzCitBbmRyZSBMdWNhcyA8YW5kcmVAYWUtMzUuY29tPiAtIG5ldyBsb2dpbiBjb2RlLCBtYW55IGZpeGVzCitBbmRyZWFzIFN0ZWlubWV0eiA8YXN0QGRvbWR2LmRlPiAtIFNoYWRvdyBwYXNzd29yZCBleHBpcnkgc3VwcG9ydAorQW5kcmV3IE1jR2lsbCA8YW5kcmV3bUBkYXRyaXguY28uemE+IC0gU0NPIGZpeGVzCitBbmRyZXcgTW9yZ2FuIDxtb3JnYW5AdHJhbnNtZXRhLmNvbT4gLSBQQU0gYnVnZml4ZXMKK0FuZHJldyBTdHJpYmJsZWhpbGwgPGEuZC5zdHJpYmJsZWhpbGxAZHVyaGFtLmFjLnVrPiAtIEJ1Z2ZpeGVzCitBbmR5IFNsb2FuZSA8YW5keUBndWlsZHNvZnR3YXJlLmNvbT4gLSBidWdmaXhlcworQXJhbiBDb3ggPGFjb3hAY3YudGVsZWdyb3VwLmNvbT4gLSBTQ08gYnVnZml4ZXMKK0Fya2FkaXVzeiBNaXNraWV3aWN6IDxtaXNpZWtAcGxkLm9yZy5wbD4gLSBJUHY2IGNvbXBhdCBmaXhlcworQmVuIExpbmRzdHJvbSA8bW91cmluZ0BldmlsYWRtaW4ub3JnPiAtIE5lWFQgc3VwcG9ydAorQmVuIFRheWxvciA8YmVudEBjbGFyay5uZXQ+IC0gU29sYXJpcyBkZWJ1Z2dpbmcgYW5kIGZpeGVzCitCcmF0aXNsYXYgSUxJQ0ggPGJpbGljQHplcHRlci5ydT4gLSBDb25maWd1cmUgZml4CitDaGFybGVzIExldmVydCA8Y2hhcmxlc0Bjb21tLnBvbHltdGwuY2E+IC0gU3VuT1MgNCAmIGJ1ZyBmaXhlcworQ2hpcCBTYWx6ZW5iZXJnIDxjaGlwQHZhbGludXguY29tPiAtIEFzc29ydGVkIHBhdGNoZXMKK0NocmlzIEFkYW1zIDxjbWFkYW1zQGhpd2FheS5uZXQ+IC0gT1NGIFNJQSBzdXBwb3J0CitDaHJpcyBTYWlhIDxjc2FpYUB3dG93ZXIuY29tPiAtIFN1U0UgcGFja2FnaW5nCitDaHJpcywgdGhlIFlvdW5nIE9uZSA8Y2t5QHBvYm94LmNvbT4gLSBQYXNzd29yZCBhdXRoIGZpeGVzCitDaHJpc3RvcyBab3VsYXMgPGNocmlzdG9zQHpvdWxhcy5jb20+IC0gQXV0b2NvbmYgZml4ZXMKK0NodW4tQ2h1bmcgQ2hlbiA8Y2pqQHUud2FzaGluZ3Rvbi5lZHU+IC0gUlBNIGZpeGVzCitDb3Jpbm5hIFZpbnNjaGVuIDx2aW5zY2hlbkByZWRoYXQuY29tPiAtIEN5Z3dpbiBzdXBwb3J0CitDaGFkIE15bmhpZXIgPG15bmhpZXJAaW50ZXJzdGVsLm5ldD4gLSBTb2xhcmlzIFByb2Nlc3MgQ29udHJhY3Qgc3VwcG9ydAorRGFuIEJyb3NlbWVyIDxvZGluQGxpbnV4ZnJlYWsuY29tPiAtIEF1dG9jb25mIHN1cHBvcnQsIGJ1aWxkIGZpeGVzCitEYXJyZW4gSGFsbCA8ZGhhbGxAdmlyYWdlLm9yZz4gLSBBSVggcGF0Y2hlcworRGFycmVuIFR1Y2tlciA8ZHR1Y2tlckB6aXAuY29tLmF1PiAtIEFJWCBCRkYgcGFja2FnZSBzY3JpcHRzCitEYXZpZCBBZ3JheiA8ZGFncmF6QGphaG9vcGEuY29tPiAtIEJ1aWxkIGZpeGVzCitEYXZpZCBEZWwgUGllcm8gPERhdmlkLkRlbFBpZXJvQHFlZC5xbGQuZ292LmF1PiAtIGJ1ZyBmaXhlcworRGF2aWQgSGVzcHJpY2ggPGRhcmtncnVlQGd1ZS10ZWNoLm9yZz4gLSBDb25maWd1cmUgZml4ZXMKK0RhdmlkIFJhbmtpbiA8ZHJhbmtpbkBib2hlbWlhbnMubGV4aW5ndG9uLmt5LnVzPiAtIGxpYndyYXAsIEFJWCwgTmV0QlNEIGZpeGVzCitEYWctRXJsaW5nIFNt+HJncmF2IDxkZXMgYXQgZnJlZWJzZC5vcmc+IC0gQ2hhbGxlbmdlLVJlc3BvbnNlIFBBTSBjb2RlLgorRGhpcmFqIEd1bGF0aSA8ZGd1bGF0aUBzY28uY29tPiAtIFVuaXhXYXJlIGxvbmcgcGFzc3dvcmRzCitFZCBFZGVuIDxlZGUzNzBAc3RsLnJ1cmFsLnVzZGEuZ292PiAtIGNvbmZpZ3VyZSBmaXhlcworR2FycmljayBKYW1lcyA8Z2Fycmlja0BqYW1lcy5uZXQ+IC0gY29uZmlndXJlIGZpeGVzCitHYXJ5IEUuIE1pbGxlciA8Z2VtQHJlbGxpbS5jb20+IC0gU0NPIHN1cHBvcnQKK0dlZCBMb2RkZXIgPGxvZGRlckB5YWNjLmNvbS5hdT4gLSBIUFVYIGZpeGVzIGFuZCBlbmhhbmNlbWVudHMKK0dlcnQgRG9lcmluZyA8Z2RAaGlsYjEubWVkYXQuZGU+IC0gYnVnIGFuZCBwb3J0YWJpbGl0eSBmaXhlcworSEFSVVlBTUEgU2VpZ28gPGhhcnV5YW1hQHVuaXh1c2VyLm9yZz4gLSBUcmFuc2xhdGlvbnMgJiBkb2MgZml4ZXMKK0hpZGVha2kgWU9TSElGVUpJIDx5b3NoZnVqaUBlY2VpLnRvaG9rdS5hYy5qcD4gLSBJUHY2IGFuZCBidWcgZml4ZXMKK0hpcm9zaGkgVGFrZWthd2EgPHRha2VrYXdhQHNyMy50LnUtdG9reW8uYWMuanA+IC0gQ29uZmlndXJlIGZpeGVzCitIb2xnZXIgVHJhcHAgPEhvbGdlci5UcmFwcEBJbmZvcm1hdGlrLlRVLUNoZW1uaXR6LkRFPiAtIEtSQjQvQUZTIGNvbmZpZyBwYXRjaAorSVdBTVVSTyBNb3Rvbm9yaSA8aXdhQG1tcC5mdWppdHN1LmNvLmpwPiAtIGJ1Z2ZpeGVzCitKYW5pIEhha2FsYSA8amFoYWthbGFAY2Muanl1LmZpPiAtIFBhdGNoZXMKK0phcm5vIEh1dXNrb25lbiA8amh1dXNrb25AaHl0dGkudWt1LmZpPiAtIEJ1Z2ZpeGVzCitKaW0gS25vYmxlIDxqbWtub2JsZUBwb2JveC5jb20+IC0gTWFueSBwYXRjaGVzCitKb25jaGVuIChlbWFpbCB1bmtub3duKSAtIHRoZSBvcmlnaW5hbCBhdXRob3Igb2YgUEFNIHN1cHBvcnQgb2YgU1NICitKdWVyZ2VuIEtlaWwgPGprQHRvb2xzLmRlPiAtIHNjcCBidWdmaXhpbmcKK0tBTUFIQVJBIEp1bnpvIDxrYW1haGFyYUBjYy5rc2hvc2VuLmFjLmpwPiAtIENvbmZpZ3VyZSBmaXhlcworS2VlcyBDb29rIDxjb29rQGNwb2ludC5uZXQ+IC0gc2NwIGZpeGVzCitLZW5qaSBNaXlha2UgPGtlbmppQG1peWFrZS5vcmc+IC0gQ29uZmlndXJlIGZpeGVzCitLZXZpbiBDYXdsZmllbGQgPGNhd2xmaWVsQHVzLmlibS5jb20+IC0gQUlYIGZpeGVzLgorS2V2aW4gTydDb25ub3IgPGtldmluX29jb25ub3JAc3RhbmRhcmRhbmRwb29ycy5jb20+IC0gUlNBbGVzcyBvcGVyYXRpb24KK0tldmluIFN0ZXZlcyA8c3RldmVza0Bwb2JveC5jb20+IC0gSFAgc3VwcG9ydCwgYnVnZml4ZXMsIGltcHJvdmVtZW50cworS2l5b2thenUgU1VUTyA8c3V0b0Brcy1hbmQta3MubmUuanA+IC0gQnVnZml4ZXMKK0xhcnJ5IEpvbmVzIDxsYXJyeS5qb25lc0BzZHJjLmNvbT4gLSBCdWdmaXhlcworTHV0eiBKYWVuaWNrZSA8THV0ei5KYWVuaWNrZUBhZXQuVFUtQ290dGJ1cy5ERT4gLSBCdWdmaXhlcworTWFyYyBHLiBGb3VybmllciA8bWFyYy5mb3VybmllckBhY2FkaWF1LmNhPiAtIFNvbGFyaXMgcGF0Y2hlcworTWFyayBELiBCYXVzaGtlIDxtZGJAanVuaXBlci5uZXQ+IC0gYnVnIGZpeGVzCitNYXJ0aW4gSm9oYW5zc29uIDxmYXRib2JAYWNjLnVtdS5zZT4gLSBMaW51eCBmaXhlcworTWFyayBELiBSb3RoIDxyb3RoK29wZW5zc2hAZmVlcC5uZXQ+IC0gRmVhdHVyZXMsIGJ1ZyBmaXhlcworTWFyayBNaWxsZXIgPG1hcmttQHN3b29uLm5ldD4gLSBCdWdmaXhlcworTWF0dCBSaWNoYXJkcyA8djJtYXR0QGJ0di5pYm0uY29tPiAtIEFJWCBwYXRjaGVzCitNaWNoYWVsIFN0ZWZmZW5zIDxtaWNoYWVsX3N0ZWZmZW5zIGF0IGhwLmNvbT4gLSBIUC1VWCBmaXhlcworTWljaGFlbCBTdG9uZSA8bXN0b25lQGNzLmxveW9sYS5lZHU+IC0gSXJpeCBlbmhhbmNlbWVudHMKK05ha2FqaSBIaXJveXVraSA8bmFrYWppQHR1dHJwLnR1dC5hYy5qcD4gLSBTb255IE5ld3MtT1MgcGF0Y2gKK05hbGluIERhaHlhYmhhaSA8bmFsaW4uZGFoeWFiaGFpQHBvYm94LmNvbT4gLSBQQU0gZW52aXJvbm1lbnQgcGF0Y2gKK05hdGUgSXRraW4gPG5pdGtpbkBldXJvcGEuY29tPiAtIFN1bk9TIDQuMS54IGZpeGVzCitOaWVscyBLcmlzdGlhbiBCZWNoIEplbnNlbiA8bmtiakBpbWFnZS5kaz4gLSBBc3NvcnRlZCBwYXRjaGVzCitQYXZlbCBLYW5rb3Zza3kgPHBlYWtAYXJnby50cm9qYS5tZmYuY3VuaS5jej4gLSBTZWN1cml0eSBmaXhlcworUGF2ZWwgVHJvbGxlciA8cGF0cm9sQG9tbmkuc2ludXMuY3o+IC0gQnVnZml4ZXMKK1Bla2thIFNhdm9sYSA8cGVra2FzQG5ldGNvcmUuZmk+IC0gQnVnZml4ZXMKK1BldGVyIEtvY2tzIDxwZXRlci5rb2Nrc0BiYXlnYXRlLmNvbT4gLSBNYWtlZmlsZSBmaXhlcworUGV0ZXIgU3R1Z2UgPHN0dWdlQGNkeS5vcmc+IC0gbWRvYzJtYW4uYXdrIHNjcmlwdAorUGhpbCBIYW5kcyA8cGhpbEBoYW5kcy5jb20+IC0gRGViaWFuIHNjcmlwdHMsIGFzc29ydGVkIHBhdGNoZXMKK1BoaWwgS2FybiA8a2FybkBrYTlxLmFtcHIub3JnPiAtIEF1dG9jb25mIGZpeGVzCitQaGlsaXBwZSBXSUxMRU0gPFBoaWxpcHBlLldJTExFTUB1cnNzYWYuZnI+IC0gQnVnZml4ZXMKK1BoaWxsIENhbXAgPFAuUy5TLkNhbXBAdWtjLmFjLnVrPiAtIGxvZ2luIGNvZGUgZml4CitSaXAgTG9vbWlzIDxsb29taXNnQGNpc3Quc2FpYy5jb20+IC0gU29sYXJpcyBwYWNrYWdlIHN1cHBvcnQsIGZpeGVzCitSb2JlcnQgRGFobGVtIDxSb2JlcnQuRGFobGVtIGF0IHNpZW1lbnMuY29tPiAtIFJlbGlhbnQgVW5peCBmaXhlcworUm91bWVuIFBldHJvdiA8b3BlbnNzaEByb3VtZW5wZXRyb3YuaW5mbz4gLSBDb21waWxlICYgY29uZmlndXJlIGZpeGVzCitTQUtBSSBLaXlvdGFrYSA8a3Nha2FpQGtzby5uZXR3ay5udHQtYXQuY28uanA+IC0gTXVsdGlwbGUgYnVnZml4ZXMKK1NpbW9uIFdpbGtpbnNvbiA8c3h3QGRjcy5lZC5hYy51az4gLSBQQU0gZml4ZXMsIENvbXBhdCB3aXRoIE1JVCBLcmJWCitTb2xhciBEZXNpZ25lciA8c29sYXJAb3BlbndhbGwuY29tPiAtIG1hbnkgcGF0Y2hlcyBhbmQgdGVjaG5pY2FsIGFzc2lzdGFuY2UKK1N2YW50ZSBTaWduZWxsIDxzdmFudGUuc2lnbmVsbEB0ZWxpYS5jb20+IC0gQnVnZml4ZXMKK1Rob21hcyBOZXVtYW5uIDx0b21Ac21hcnQucnVoci5kZT4gLSBTaGFkb3cgcGFzc3dvcmRzCitUaW0gUmljZSA8dGltQG11bHRpdGFsZW50cy5uZXQ+IC0gUG9ydGFiaWxpdHkgJiBTQ08gZml4ZXMKK1RvYmlhcyBPZXRpa2VyIDxvZXRpa2VyQGVlLmV0aHouY2g+IC0gQnVnZml4ZXMKK1RvbSBCZXJ0ZWxzb24ncyA8dGJlcnRAYWJhYy5jb20+IC0gQUlYIGF1dGggZml4ZXMKK1Rvci1Ba2UgRnJhbnNzb24gPHRvcmFrZUBob3RtYWlsLmNvbT4gLSBBSVggc3VwcG9ydAorVHVkb3IgQm9zbWFuIDx0dWRvcmJAam0ubnU+IC0gTUQ1IHBhc3N3b3JkIHN1cHBvcnQKK1VkbyBTY2h3ZWlnZXJ0IDx1c3RAY2VydC5zaWVtZW5zLmRlPiAtIFJlbGlhbnRVTklYIHN1cHBvcnQKK1dlbmR5IFBhbG0gPHdlbmR5cCBhdCBjcmF5LmNvbT4gLSBDcmF5IHN1cHBvcnQuCitaYWNrIFdlaW5iZXJnIDx6YWNrQHdvbGVyeS5jdW1iLm9yZz4gLSBHTk9NRSBhc2twYXNzIGVuaGFuY2VtZW50CisKK0Fwb2xvZ2llcyB0byBhbnlvbmUgSSBoYXZlIG1pc3NlZC4KKworRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPgorCiskSWQ6IENSRURJVFMsdiAxLjgxIDIwMDYvMDgvMzAgMTc6MjQ6NDEgZGptIEV4cCAkCisKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvQ2hhbmdlTG9nIGIvb3BlbnNzaC02LjBwMS9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRmNzYxOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMjA1NCBAQAorMjAxMjA0MjAKKyAtIChkam0pIFtjb250cmliL2NhbGRlcmEvb3BlbnNzaC5zcGVjIGNvbnRyaWIvcmVkaGF0L29wZW5zc2guc3BlY10KKyAgIFtjb250cmliL3N1c2Uvb3BlbnNzaC5zcGVjXSBVcGRhdGUgZm9yIHJlbGVhc2UgNi4wCisgLSAoZGptKSBbUkVBRE1FXSBVcGRhdGUgVVJMIHRvIHJlbGVhc2Ugbm90ZXMuCisgLSAoZGptKSBSZWxlYXNlIG9wZW5zc2gtNi4wCisKKzIwMTIwNDE5CisgLSAoZGptKSBbY29uZmlndXJlLmFjXSBGaXggY29tcGlsYXRpb24gZXJyb3Igb24gRnJlZUJTRCwgd2hvc2UgbGlidXRpbAorICAgY29udGFpbnMgb3BlbnB0eSgpIGJ1dCBub3QgbG9naW4oKQorCisyMDEyMDQwNAorIC0gKGRqbSkgW01ha2VmaWxlLmluIGNvbmZpZ3VyZS5hYyBzYW5kYm94LXNlY2NvbXAtZmlsdGVyLmNdIEFkZCBzYW5kYm94CisgICBtb2RlIGZvciBMaW51eCdzIG5ldyBzZWNjb21wIGZpbHRlcjsgcGF0Y2ggZnJvbSBXaWxsIERyZXdyeTsgZmVlZGJhY2sKKyAgIGFuZCBvayBkdHVja2VyQAorCisyMDEyMDMzMAorIC0gKGR0dWNrZXIpIFtjb250cmliL3JlZGhhdC9vcGVuc3NoLnNwZWNdIEJ1ZyAjMTk5MjogcmVtb3ZlIG5vdy1nb25lIFdBUk5JTkcKKyAgIGZpbGUgZnJvbSBzcGVjIGZpbGUuICBGcm9tIGNyaWdodGVyIGF0IG51Y2xpb3NzIGNvbS4KKyAtIChkam0pIFtlbnRyb3B5LmNdIGJ6IzE5OTE6IHJlbGF4IE9wZW5TU0wgdmVyc2lvbiB0ZXN0IHRvIGFsbG93IHJ1bm5pbmcKKyAgIG9wZW5zc2ggYmluYXJpZXMgb24gYSBuZXdlciBmaXggcmVsZWFzZSB0aGFuIHRoZXkgd2VyZSBjb21waWxlZCBvbi4KKyAgIHdpdGggYW5kIG9rIGR0dWNrZXJACisgLSAoZGptKSBbb3BlbmJzZC1jb21wYXQvYnNkLWN5Z3dpbl91dGlsLmhdICN1bmRlZiBfV0lOMzIgdG8gYXZvaWQgaW5jb3JyZWN0CisgICBhc3N1bXB0aW9ucyB3aGVuIGJ1aWxkaW5nIG9uIEN5Z3dpbjsgcGF0Y2ggZnJvbSBDb3Jpbm5hIFZpbnNjaGVuCisKKzIwMTIwMzA5CisgLSAoZGptKSBbb3BlbmJzZC1jb21wYXQvcG9ydC1saW51eC5jXSBieiMxOTYwOiBmaXggY3Jhc2ggb24gU0VMaW51eCAKKyAgIHN5c3RlbXMgd2hlcmUgc3NoZCBpcyBydW4gaW4gdGUgd3JvbmcgY29udGV4dC4gUGF0Y2ggZnJvbSBTdmVuCisgICBWZXJtZXVsZW47IG9rIGR0dWNrZXJACisgLSAoZGptKSBbcGFja2V0LmNdIGJ6IzE5NjM6IEZpeCBJUFFvUyBub3QgYmVpbmcgc2V0IG9uIG5vbi1tYXBwZWQgdjQtaW4tdjYKKyAgIGFkZHJlc3NlZCBjb25uZWN0aW9ucy4gb2sgZHR1Y2tlckAKKworMjAxMjAyMjQKKyAtIChkdHVja2VyKSBbYXVkaXQtYnNtLmMgY29uZmlndXJlLmFjXSBidWcgIzE5Njg6IGVuYWJsZSB3b3JrYXJvdW5kcyBmb3IgQlNNCisgICBhdWRpdCBicmVha2FnZSBpbiBTb2xhcmlzIDExLiAgUGF0Y2ggZnJvbSBNYWdudXMgSm9oYW5zc29uLgorCisyMDEyMDIxNQorIC0gKHRpbSkgW29wZW5ic2QtY29tcGF0L2JzZC1taXNjLmggc3NoZC5jXSBGaXggY29uZmxpY3RpbmcgcmV0dXJuIHR5cGUgZm9yCisgICB1bnNldGVudiBkdWUgdG8gcmV2IDEuMTQgY2hhbmdlIHRvIHNldGVudi5jLiBDYXN0IHVuc2V0ZW52IHRvIHZvaWQgaW4gc3NoZC5jCisgICBvayBkdHVja2VyQAorIC0gKHRpbSkgW2RlZmluZXMuaF0gbW92ZSBjaHVuayBpbnRyb2R1Y2VkIGluIDEuMTI1IGJlZm9yZSBNQVhQQVRITEVOIHNvCisgICBpdCBhY3R1YWxseSB3b3Jrcy4KKyAtICh0aW0pIFtyZWdyZXNzL2tleXR5cGUuc2hdIHN0ZGVyciByZWRpcmVjdGlvbiBuZWVkcyB0byBiZSBpbnNpZGUgYmFjayBxdW90ZQorICAgdG8gd29yay4gU3BvdHRlZCBieSBBbmdlbCBHb256YWxlegorCisyMDEyMDIxNAorIC0gKGRqbSkgW29wZW5ic2QtY29tcGF0L2JzZC1jeWd3aW5fdXRpbC5jXSBBZGQgUFJPR1JBTUZJTEVTIHRvIGxpc3Qgb2YKKyAgIHByZXNlcnZlZCBDeWd3aW4gZW52aXJvbm1lbnQgdmFyaWFibGVzOyBmcm9tIENvcmlubmEgVmluc2NoZW4KKworMjAxMjAyMTEKKyAtIChkam0pIE9wZW5CU0QgQ1ZTIFN5bmMKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEyLzAxLzA1IDAwOjE2OjU2CisgICAgIFttb25pdG9yLmNdCisgICAgIG1lbWxlYWsgb24gZXJyb3IgcGF0aAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTIvMDEvMDcgMjE6MTE6MzYKKyAgICAgW211eC5jXQorICAgICBmaXggZG91YmxlLWZyZWUgaW4gbmV3IHNlc3Npb24gaGFuZGxlcgorICAgLSBtaW9kQGN2cy5vcGVuYnNkLm9yZyAyMDEyLzAxLzA4IDEzOjE3OjExCisgICAgIFtzc2gtZWNkc2EuY10KKyAgICAgRml4IG1lbW9yeSBsZWFrIGluIHNzaF9lY2RzYV92ZXJpZnkoKTsgZnJvbSBMb2dhbmFkZW4gVmVsdmluZHJvbiwKKyAgICAgb2sgbWFya3VzQAorICAgLSBtaW9kQGN2cy5vcGVuYnNkLm9yZyAyMDEyLzAxLzE2IDIwOjM0OjA5CisgICAgIFtzc2gtcGtjczExLWNsaWVudC5jXQorICAgICBGaXggYSBtZW1vcnkgbGVhayBpbiBwa2NzMTFfcnNhX3ByaXZhdGVfZW5jcnlwdCgpLCByZXBvcnRlZCBieSBKYW4gS2xlbWtvdy4KKyAgICAgV2hpbGUgdGhlcmUsIGJlIHN1cmUgdG8gYnVmZmVyX2NsZWFyKCkgYmV0d2VlbiBzZW5kX21zZygpIGFuZCByZWN2X21zZygpLgorICAgICBvayBtYXJrdXNACisgICAtIGR0dWNrZXJAY3ZzLm9wZW5ic2Qub3JnIDIwMTIvMDEvMTggMjE6NDY6NDMKKyAgICAgW2NsaWVudGxvb3AuY10KKyAgICAgRW5zdXJlIHRoYXQgJERJU1BMQVkgY29udGFpbnMgb25seSB2YWxpZCBjaGFyYWN0ZXJzIGJlZm9yZSB1c2luZyBpdCB0bworICAgICBleHRyYWN0IHhhdXRoIGRhdGEgc28gdGhhdCBpdCBjYW4ndCBiZSB1c2VkIHRvIHBsYXkgbG9jYWwgc2hlbGwKKyAgICAgbWV0YWNoYXJhY3RlciBnYW1lcy4gIFJlcG9ydCBmcm9tIHIwMHRfYXRpIGF0IGlodGVhbS5uZXQsIG9rIG1hcmt1cy4KKyAgIC0gbWFya3VzQGN2cy5vcGVuYnNkLm9yZyAyMDEyLzAxLzI1IDE5OjI2OjQzCisgICAgIFtwYWNrZXQuY10KKyAgICAgZG8gbm90IHBlcm1pdCBTU0gyX01TR19TRVJWSUNFX1JFUVVFU1QvQUNDRVBUIGR1cmluZyByZWtleWluZzsKKyAgICAgb2sgZHR1Y2tlckAsIGRqbUAKKyAgIC0gbWFya3VzQGN2cy5vcGVuYnNkLm9yZyAyMDEyLzAxLzI1IDE5OjM2OjMxCisgICAgIFthdXRoZmlsZS5jXQorICAgICBtZW1sZWFrIGluIGtleV9sb2FkX2ZpbGUoKTsgZnJvbSBKYW4gS2xlbWtvdworICAgLSBtYXJrdXNAY3ZzLm9wZW5ic2Qub3JnIDIwMTIvMDEvMjUgMTk6NDA6MDkKKyAgICAgW3BhY2tldC5jIHBhY2tldC5oXQorICAgICBwYWNrZXRfcmVhZF9wb2xsKCkgaXMgbm90IHVzZWQgYW55bW9yZS4KKyAgIC0gbWFya3VzQGN2cy5vcGVuYnNkLm9yZyAyMDEyLzAyLzA5IDIwOjAwOjE4CisgICAgIFt2ZXJzaW9uLmhdCisgICAgIG1vdmUgZnJvbSA2LjAtYmV0YSB0byA2LjAKKworMjAxMjAyMDYKKyAtIChkam0pIFtzc2gta2V5Z2VuLmNdIERvbid0IGZhaWwgaW4gZG9fZ2VuX2FsbF9ob3N0a2V5cyBvbiBwbGF0Zm9ybXMKKyAgIHRoYXQgZG9uJ3Qgc3VwcG9ydCBFQ0MuIFBhdGNoIGZyb20gUGhpbCBPbGVzb24KKworMjAxMTEyMTkKKyAtIE9wZW5CU0QgQ1ZTIFN5bmMKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzEyLzAyIDAwOjQxOjU2CisgICAgIFttdXguY10KKyAgICAgZml4IGJ6IzE5NDg6IHNzaCAtZiBkb2Vzbid0IGZvcmsgZm9yIG11bHRpcGxleGVkIGNvbm5lY3Rpb24uCisgICAgIG9rIGR0dWNrZXJACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8xMi8wMiAwMDo0Mzo1NworICAgICBbbWFjLmNdCisgICAgIGZpeCBieiMxOTM0OiBuZXdlciBPcGVuU1NMIHZlcnNpb25zIHdpbGwgcmVxdWlyZSBITUFDX0NUWF9Jbml0IGJlZm9yZQorICAgICBITUFDX2luaXQgKHRoaXMgY2hhbmdlIGluIHBvbGljeSBzZWVtcyBpbnNhbmUgdG8gbWUpCisgICAgIG9rIGR0dWNrZXJACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8xMi8wNCAyMzoxNjoxMgorICAgICBbbXV4LmNdCisgICAgIHJldmVydDoKKyAgICAgPiByZXZpc2lvbiAxLjMyCisgICAgID4gZGF0ZTogMjAxMS8xMi8wMiAwMDo0MTo1NjsgIGF1dGhvcjogZGptOyAgc3RhdGU6IEV4cDsgIGxpbmVzOiArNCAtMQorICAgICA+IGZpeCBieiMxOTQ4OiBzc2ggLWYgZG9lc24ndCBmb3JrIGZvciBtdWx0aXBsZXhlZCBjb25uZWN0aW9uLgorICAgICA+IG9rIGR0dWNrZXJACisgICAgIGl0IGludGVyYWN0cyBiYWRseSB3aXRoIENvbnRyb2xQZXJzaXN0CisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8xMi8wNyAwNTo0NDozOAorICAgICBbYXV0aDIuYyBkaC5jIHBhY2tldC5jIHJvYW1pbmcuaCByb2FtaW5nX2NsaWVudC5jIHJvYW1pbmdfY29tbW9uLmNdCisgICAgIGZpeCBzb21lIGhhcm1sZXNzIGFuZC9vciB1bnJlYWNoYWJsZSBpbnQgb3ZlcmZsb3dzOworICAgICByZXBvcnRlZCBYaSBXYW5nLCBvayBtYXJrdXNACisKKzIwMTExMTI1CisgLSBPcGVuQlNEIENWUyBTeW5jCisgICAtIG9nYUBjdnMub3BlbmJzZC5vcmcgMjAxMS8xMS8xNiAxMjoyNDoyOAorICAgICBbc2Z0cC5jXQorICAgICBEb24ndCBsZWFrIGxpc3QgaW4gY29tcGxldGVfY21kX3BhcnNlIGlmIHRoZXJlIGFyZSBubyBjb21tYW5kcyBmb3VuZC4KKyAgICAgRGlzY292ZXJlZCB3aGVuIEkgd2FzIGBgYm9ycm93aW5nJycgdGhpcyBjb2RlIGZvciBzb21ldGhpbmcgZWxzZS4KKyAgICAgb2sgZGptQAorCisyMDExMTEyMQorIC0gKGR0dWNrZXIpIFtjb25maWd1cmUuYWNdIFNldCBfRk9SVElGWV9TT1VSQ0UuICBvayBkam1ACisKKzIwMTExMTA0CisgLSAoZHR1Y2tlcikgT3BlbkJTRCBDVlMgU3luYworICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMTAvMTggMDU6MTU6MjgKKyAgICAgW3NzaC5jXQorICAgICBzc2goMSk6IHNraXAgYXR0ZW1wdGluZyB0byBjcmVhdGUgfi8uc3NoIHdoZW4gLUYgaXMgcGFzc2VkOyBvayBtYXJrdXNACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8xMC8xOCAyMzozNzo0MgorICAgICBbc3NoLWFkZC5jXQorICAgICBhZGQgLWsgdG8gdXNhZ2UoKTsgcmVtaW5kZWQgYnkgam1jQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMTAvMTkgMDA6MDY6MTAKKyAgICAgW21vZHVsaS5jXQorICAgICBzL3RtcGZpbGUvdG1wLyB0byBtYWtlIHRoaXMgLVdzaGFkb3cgY2xlYW4KKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzEwLzE5IDEwOjM5OjQ4CisgICAgIFt1bWFjLmNdCisgICAgIHR5cG8gaW4gY29tbWVudDsgcGF0Y2ggZnJvbSBNaWNoYWVsIFcuIEJvbWJhcmRpZXJpCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8xMC8yNCAwMjoxMDo0NgorICAgICBbc3NoLmNdCisgICAgIGJ6IzE5NDM6IHVuYnJlYWsgc3RkaW8gZm9yd2FyZGluZyB3aGVuIENvbnRyb2xQZXJzaXN0IGlzIGluIHVzZXIgLSBzc2gKKyAgICAgd2FzIGluY29ycmVjdGx5IHJlcXVlc3RpbmcgdGhlIGZvcndhcmQgaW4gYm90aCB0aGUgY29udHJvbCBtYXN0ZXIgYW5kCisgICAgIHNsYXZlLiBza2lwIHJlcXVlc3RpbmcgaXQgaW4gdGhlIG1hc3RlciB0byBmaXguIG9rIG1hcmt1c0AKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzEwLzI0IDAyOjEzOjEzCisgICAgIFtzZXNzaW9uLmNdCisgICAgIGJ6IzE4NTk6IHNlbmQgdHR5IGJyZWFrIHRvIHB0eSBtYXN0ZXIgaW5zdGVhZCBvZiAocHJvYmFibHkgYWxyZWFkeQorICAgICBjbG9zZWQpIHNsYXZlIHNpZGU7ICJsb29rcyBnb29kIiBtYXJrdXNACisgICAtIGR0dWNrZXJAY3ZzLm9wZW5ic2Qub3JnIDAxMS8xMS8wNCAwMDowOTozOQorICAgICBbbW9kdWxpXQorICAgICByZWdlbmVyYXRlZCBtb2R1bGkgZmlsZTsgb2sgZGVyYWFkdAorIC0gKGR0dWNrZXIpIFtJTlNUQUxMIExJQ0VOQ0UgY29uZmlndXJlLmFjIG9wZW5ic2QtY29tcGF0L01ha2VmaWxlLmluCisgICBvcGVuYnNkLWNvbXBhdC9nZXRycnNldGJ5bmFtZS1sZG5zLmMgb3BlbmJzZC1jb21wYXQvZ2V0cnJzZXRieW5hbWUuY10KKyAgIGJ6IDEzMjA6IEFkZCBvcHRpb25hbCBzdXBwb3J0IGZvciBMRE5TLCBhIEJTRCBsaWNlbnNlZCBETlMgcmVzb2x2ZXIgbGlicmFyeQorICAgd2hpY2ggc3VwcG9ydHMgRE5TU0VDLiAgUGF0Y2ggZnJvbSBTaW1vbiBWYWxsZXQgKHN2YWxsZXQgYXQgZ2Vub3Njb3BlIGNucyBmcikKKyAgIHdpdGggc29tZSByZXdvcmsgZnJvbSBteXNlbGYgYW5kIGRqbS4gIG9rIGRqbS4KKworMjAxMTEwMjUKKyAtIChkdHVja2VyKSBbY29udHJpYi9jeWd3aW4vTWFrZWZpbGVdIENvbnRpbnVlIGlmIGluc3RhbGxpbmcgYSBkb2MgZmlsZQorICAgZmFpbHMuICBQYXRjaCBmcm9tIENvcmlubmEgVmluc2NoZW4uCisKKzIwMTExMDE4CisgLSAoZGptKSBPcGVuQlNEIENWUyBTeW5jCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8xMC8wNCAxNDoxNzozMgorICAgICBbc2Z0cC1nbG9iLmNdCisgICAgIHNpbGVuY2UgZXJyb3Igc3BhbSBmb3IgImxzICovZm9vIiBpbiBkaXJlY3Rvcnkgd2l0aCBmaWxlczsgYnojMTY4MworICAgLSBkdHVja2VyQGN2cy5vcGVuYnNkLm9yZyAyMDExLzEwLzE2IDExOjAyOjQ2CisgICAgIFttb2R1bGkuYyBzc2gta2V5Z2VuLjEgc3NoLWtleWdlbi5jXQorICAgICBBZGQgb3B0aW9uYWwgY2hlY2twb2ludHMgZm9yIG1vZHVsaSBzY3JlZW5pbmcuICBmZWVkYmFjayAmIG9rIGRlcmFhZHQKKyAgIC0gam1jQGN2cy5vcGVuYnNkLm9yZyAyMDExLzEwLzE2IDE1OjAyOjQxCisgICAgIFtzc2gta2V5Z2VuLmNdCisgICAgIHB1dCAtSyBpbiB0aGUgcmlnaHQgcGxhY2UgKHVzYWdlKCkpOworICAgLSBzdHNwQGN2cy5vcGVuYnNkLm9yZyAyMDExLzEwLzE2IDE1OjUxOjM5CisgICAgIFttb2R1bGkuY10KKyAgICAgYWRkIG1pc3NpbmcgaW5jbHVkZXMgdG8gdW5icmVhayB0cmVlOyBmaXggZnJvbSBycG9pbnRlbAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMTAvMTggMDQ6NTg6MjYKKyAgICAgW2F1dGgtb3B0aW9ucy5jIGtleS5jXQorICAgICByZW1vdmUgZXhwbGljdCBzZWFyY2ggZm9yIFwwIGluIHBhY2tldCBzdHJpbmdzLCB0aGlzIGpvYiBpcyBub3cgZG9uZQorICAgICBpbXBsaWNpdGx5IGJ5IGJ1ZmZlcl9nZXRfY3N0cmluZzsgb2sgbWFya3VzCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8xMC8xOCAwNTowMDo0OAorICAgICBbc3NoLWFkZC4xIHNzaC1hZGQuY10KKyAgICAgbmV3ICJzc2gtYWRkIC1rIiBvcHRpb24gdG8gbG9hZCBwbGFpbiBrZXlzIChza2lwcGluZyBjZXJ0aWZpY2F0ZXMpOworICAgICAibG9va3Mgb2siIG1hcmt1c0AKKworMjAxMTEwMDEKKyAtIChkdHVja2VyKSBbb3BlbmJzZC1jb21wYXQvbWt0ZW1wLmNdIEZpeCBjb21waWxlciB3YXJuaW5nLiAgb2sgZGptCisgLSAoZHR1Y2tlcikgT3BlbkJTRCBDVlMgU3luYworICAgLSBkdHVja2VyQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA5LzIzIDAwOjIyOjA0CisgICAgIFtjaGFubmVscy5jIGF1dGgtb3B0aW9ucy5jIHNlcnZjb25mLmMgY2hhbm5lbHMuaCBzc2hkLjhdCisgICAgIEFkZCB3aWxkY2FyZCBzdXBwb3J0IHRvIFBlcm1pdE9wZW4sIGFsbG93aW5nIHRoaW5ncyBsaWtlICJQZXJtaXRPcGVuCisgICAgIGxvY2FsaG9zdDoqIi4gIGJ6ICMxODU3LCBvayBkam0gbWFya3VzLgorICAgLSBtYXJrdXNAY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDkvMjMgMDc6NDU6MDUKKyAgICAgW211eC5jIHJlYWRjb25mLmggY2hhbm5lbHMuaCBjb21wYXQuaCBjb21wYXQuYyBzc2guYyByZWFkY29uZi5jIGNoYW5uZWxzLmMKKyAgICAgdmVyc2lvbi5oXQorICAgICB1bmJyZWFrIHJlbW90ZSBwb3J0Zm9yd2FyZGluZyB3aXRoIGR5bmFtaWMgYWxsb2NhdGVkIGxpc3RlbiBwb3J0czoKKyAgICAgMSkgc2VuZCB0aGUgYWN0dWFsIGxpc3RlbiBwb3J0IGluIHRoZSBvcGVuIG1lc3NhZ2UgKGluc3RlYWQgb2YgMCkuCisgICAgICAgIHRoaXMgYWxsb3dzIG11bHRpcGxlIGZvcndhcmRpbmdzIHdpdGggYSBkeW5hbWljIGxpc3RlbiBwb3J0CisgICAgIDIpIHVwZGF0ZSB0aGUgbWF0Y2hpbmcgcGVybWl0LW9wZW4gZW50cnksIHNvIHdlIGNhbiBpZGVudGlmeSB3aGVyZQorICAgICAgICB0byBjb25uZWN0IHRvCisgICAgIHJlcG9ydDogZGVuIGF0IHNrYmtvbnR1ci5ydSBhbmQgUC4gU3pjenlnaWVsc2tpCisgICAgIGZlZWRiYWNrIGFuZCBvayBkam1ACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wOS8yNSAwNTo0NDo0NworICAgICBbYXV0aDItcHVia2V5LmNdCisgICAgIGltcHJvdmUgdGhlIEF1dGhvcml6ZWRQcmluY2lwYWxzRmlsZSBkZWJ1ZyBsb2cgbWVzc2FnZSB0byBpbmNsdWRlCisgICAgIGZpbGUgYW5kIGxpbmUgbnVtYmVyCisgICAtIGR0dWNrZXJAY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDkvMzAgMDA6NDc6MzcKKyAgICAgW3NzaGQuY10KKyAgICAgZG9uJ3QgYXR0ZW1wdCBwcml2c2VwIGNsZWFudXAgd2hlbiBub3QgdXNpbmcgcHJpdnNlcDsgb2sgbWFya3VzQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDkvMzAgMjE6MjI6NDkKKyAgICAgW3NzaGQuY10KKyAgICAgZml4IGludmVydGVkIHRlc3QgdGhhdCBjYXVzZWQgbG9nc3BhbTsgc3BvdHRlZCBieSBoZW5uaW5nQAorCisyMDExMDkyOQorIC0gKGRqbSkgW2NvbmZpZ3VyZS5hYyBkZWZpbmVzLmhdIE5vIG5lZWQgdG8gZGV0ZWN0IHNpemVvZihjaGFyKTsgcGF0Y2gKKyAgIGZyb20gZGVzIEFUIGRlcy5ubworIC0gKGR0dWNrZXIpIFtjb25maWd1cmUuYWMgb3BlbmJzZC1jb21wYXQvTWFrZWZpbGUuaW4KKyAgIG9wZW5ic2QtY29tcGF0L3N0cm5sZW4uY10gQWRkIHN0cm5sZW4gdG8gdGhlIGNvbXBhdCBsaWJyYXJ5LgorCisyMDExMDkyMworIC0gKGRqbSkgW29wZW5ic2QtY29tcGF0L2dldGN3ZC5jXSBSZW1vdmUgT3BlbkJTRCByY3NpZCBtYXJrZXIgc2luY2Ugd2Ugbm8KKyAgIGxvbmdlciB3YW50IHRvIHN5bmMgdGhpcyBmaWxlIChPcGVuQlNEIHVzZXMgYSBfX2dldGN3ZCBzeXNjYWxsIG5vdywgd2UKKyAgIHdhbnQgdGhpcyBsb25naGFuZCB2ZXJzaW9uKQorIC0gKGRqbSkgW29wZW5ic2QtY29tcGF0L2dldGdyb3VwbGlzdC5jXSBSZW1vdmUgT3BlbkJTRCByY3NpZCBtYXJrZXI6IHRoZQorICAgdXBzdHJlYW0gdmVyc2lvbiBpcyBZUGlmaWVkIGFuZCB3ZSBkb24ndCB3YW50IHRoaXMKKyAtIChkam0pIFtvcGVuYnNkLWNvbXBhdC9ta3RlbXAuY10gZm9ya2xpZnQgdXBncmFkZSB0byAtY3VycmVudCB2ZXJzaW9uLgorICAgVGhlIGZpbGUgd2FzIHRvdGFsbHkgcmV3cml0dGVuIGJldHdlZW4gd2hhdCB3ZSBoYWQgaW4gdHJlZSBhbmQgLWN1cnJlbnQuCisgLSAoZGptKSBbb3BlbmJzZC1jb21wYXQvc2hhMi5jIG9wZW5ic2QtY29tcGF0L3NoYTIuaF0gUmVtb3ZlIE9wZW5CU0QgcmNzaWQKKyAgIG1hcmtlci4gVGhlIHVwc3RyZWFtIEFQSSBoYXMgY2hhbmdlZCAoZnVuY3Rpb24gYW5kIHN0cnVjdHVyZSBuYW1lcykKKyAgIGVub3VnaCB0byBwdXQgaXQgb3V0IG9mIHN5bmMgd2l0aCBvdGhlciBwcm92aWRlcnMgb2YgdGhpcyBpbnRlcmZhY2UuCisgLSAoZGptKSBbb3BlbmJzZC1jb21wYXQvc2V0ZW52LmNdIEZvcmtsaWZ0IHVwZ3JhZGUsIGluY2x1ZGluZyBpbmNsdXNpb24KKyAgIG9mIHN0YXRpYyBfX2ZpbmRlbnYoKSBmdW5jdGlvbiBmcm9tIHVwc3RyZWFtIHNldGVudi5jCisgLSBPcGVuQlNEIENWUyBTeW5jCisgICAtIG1pbGxlcnRAY3ZzLm9wZW5ic2Qub3JnIDIwMDYvMDUvMDUgMTU6Mjc6MzgKKyAgICAgW29wZW5ic2QtY29tcGF0L3N0cmxjcHkuY10KKyAgICAgQ29udmVydCBkbyB7fSB3aGlsZSBsb29wIC0+IHdoaWxlIHt9IGZvciBjbGFyaXR5LiAgTm8gYmluYXJ5IGNoYW5nZQorICAgICBvbiBtb3N0IGFyY2hpdGVjdHVyZXMuICBGcm9tIE9saXZlciBTbWl0aC4gIE9LIGRlcmFhZHRAIGFuZCBoZW5uaW5nQAorICAgLSB0b2JpYXNAY3ZzLm9wZW5ic2Qub3JnIDIwMDcvMTAvMjEgMTE6MDk6MzAKKyAgICAgW29wZW5ic2QtY29tcGF0L21rdGVtcC5jXQorICAgICBDb21tZW50IGZpeCBhYm91dCB0aW1lIGNvbnN1bXB0aW9uIG9mIF9nZXR0ZW1wLgorICAgICBGcmVlQlNEIGRpZCB0aGlzIGluIHJldmlzaW9uIDEuMjAuCisgICAgIE9LIGRlcmFhZHRALCBrcndACisgICAtIGRlcmFhZHRAY3ZzLm9wZW5ic2Qub3JnIDIwMDgvMDcvMjIgMjE6NDc6NDUKKyAgICAgW29wZW5ic2QtY29tcGF0L21rdGVtcC5jXQorICAgICB1c2UgYXJjNHJhbmRvbV91bmlmb3JtKCk7IG9rIGRqbSBtaWxsZXJ0CisgICAtIG1pbGxlcnRAY3ZzLm9wZW5ic2Qub3JnIDIwMDgvMDgvMjEgMTY6NTQ6NDQKKyAgICAgW29wZW5ic2QtY29tcGF0L21rdGVtcC5jXQorICAgICBSZW1vdmUgdXNlbGVzcyBjb2RlLCB0aGUga2VybmVsIHdpbGwgc2V0IGVycm5vIGFwcHJvcHJpYXRlbHkgaWYgYW4KKyAgICAgZWxlbWVudCBpbiB0aGUgcGF0aCBkb2VzIG5vdCBleGlzdC4gIE9LIGRlcmFhZHRAIHB2YWxjaGV2QAorICAgLSBvdHRvQGN2cy5vcGVuYnNkLm9yZyAyMDA4LzEyLzA5IDE5OjM4OjM4CisgICAgIFtvcGVuYnNkLWNvbXBhdC9pbmV0X250b3AuY10KKyAgICAgZml4IGluZXRfbnRvcCgzKSBwcm90b3R5cGU7IG9rIG1pbGxlcnRAIGxpYmMgdG8gYmUgYnVtYmVkIHZlcnkgc29vbgorCisyMDExMDkyMgorIC0gT3BlbkJTRCBDVlMgU3luYworICAgLSBweXJAY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMTIgMDc6MTU6MTAKKyAgICAgW29wZW5ic2QtY29tcGF0L2dsb2IuY10KKyAgICAgV2hlbiB0aGUgbWF4IG51bWJlciBvZiBpdGVtcyBmb3IgYSBkaXJlY3RvcnkgaGFzIHJlYWNoZWQgR0xPQl9MSU1JVF9SRUFERElSCisgICAgIGFuIGVycm9yIGlzIHJldHVybmVkIGJ1dCBjbG9zZWRpcigpIGlzIG5vdCBjYWxsZWQuCisgICAgIHNwb3R0ZWQgYW5kIGZpeCBwcm92aWRlZCBieSBGcmFuayBEZW5pcyBvYnNkLXRlY2hAcHVyZWZ0cGQub3JnCisgICAgIG9rIG90dG9ALCBtaWxsZXJ0QAorICAgLSBzdHNwQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA5LzIwIDEwOjE4OjQ2CisgICAgIFtnbG9iLmNdCisgICAgIEluIGdsb2IoMyksIGxpbWl0IHJlY3Vyc2lvbiBkdXJpbmcgbWF0Y2hpbmcgYXR0ZW1wdHMuIFNpbWlsYXIgdG8KKyAgICAgZm5tYXRjaCBmaXguIEFsc28gY29sbGFwc2UgY29uc2VjdXRpdmUgJyonIChmcm9tIE5ldEJTRCkuCisgICAgIG9rIG1pb2QgZGVyYWFkdAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDkvMjIgMDY6Mjc6MjkKKyAgICAgW2dsb2IuY10KKyAgICAgZml4IEdMT0JfS0VFUFNUQVQgd2l0aG91dCBHTE9CX05PU09SVDsgdGhlIGltcGxpY2l0IHNvcnQgd2FzIGJlaW5nCisgICAgIGFwcGxpZWQgb25seSB0byB0aGUgZ2xfcGF0aHYgdmVjdG9yIGFuZCBub3QgdGhlIGNvcnJlc3BvbmRpbmcgZ2xfc3RhdHYKKyAgICAgYXJyYXkuIHJlcG9ydGVkIGluIE9wZW5TU0ggYnojMTkzNTsgZmVlZGJhY2sgYW5kIG9rYXkgbWF0dGhld0AKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA4LzI2IDAxOjQ1OjE1CisgICAgIFtzc2guMV0KKyAgICAgQWRkIHNvbWUgbWlzc2luZyBzc2hfY29uZmlnKDUpIG9wdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCBpbiBzc2goMSkncworICAgICAtbyBhcmd1bWVudC4gUGF0Y2ggZnJvbSBkdWNsYXJlIEFUIGd1dS5maQorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDkvMDUgMDU6NTY6MTMKKyAgICAgW3NjcC4xIHNmdHAuMV0KKyAgICAgbWVudGlvbiBDb250cm9sUGVyc2lzdCBhbmQgS2JkSW50ZXJhY3RpdmVBdXRoZW50aWNhdGlvbiBpbiB0aGUgLW8KKyAgICAgdmVyYmlhZ2UgaW4gdGhlc2UgcGFnZXMgdG9vIChwcm9tcHRlZCBieSBqbWNAKQorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDkvMDUgMDU6NTk6MDgKKyAgICAgW21pc2MuY10KKyAgICAgZml4IHR5cG8gaW4gSVBRb1MgcGFyc2luZzogdGhlcmUgaXMgbm8gIkFGMTQiIGNsYXNzLCBidXQgdGhlcmUgaXMKKyAgICAgYW4gIkFGMjEiIGNsYXNzLiBTcG90dGVkIGJ5IGdpZXNlbiBBVCBzbmlja2Vycy5vcmc7IG9rIG1hcmt1cyBzdGV2ZXNrCisgICAtIGptY0BjdnMub3BlbmJzZC5vcmcgMjAxMS8wOS8wNSAwNzowMTo0NAorICAgICBbc2NwLjFdCisgICAgIGtub2NrIG91dCBhIHVzZWxlc3MgTnM7CisgICAtIGRlcmFhZHRAY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDkvMDcgMDI6MTg6MzEKKyAgICAgW3NzaC1rZXlnZW4uMV0KKyAgICAgdHlwbyAodGhleSB2cyB0aGUpIGZvdW5kIGJ5IExhd3JlbmNlIFRlbworICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDkvMDkgMDA6NDM6MDAKKyAgICAgW3NzaF9jb25maWcuNSBzc2hkX2NvbmZpZy41XQorICAgICBmaXggdHlwbyBpbiBJUFFvUyBwYXJzaW5nOiB0aGVyZSBpcyBubyAiQUYxNCIgY2xhc3MsIGJ1dCB0aGVyZSBpcworICAgICBhbiAiQUYyMSIgY2xhc3MuIFNwb3R0ZWQgYnkgZ2llc2VuIEFUIHNuaWNrZXJzLm9yZzsgb2sgbWFya3VzIHN0ZXZlc2sKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA5LzA5IDAwOjQ0OjA3CisgICAgIFtQUk9UT0NPTC5tdXhdCisgICAgIE1VWF9DX0NMT1NFX0ZXRCBpbmNsdWRlcyBmb3J3YXJkIHR5cGUgaW4gbWVzc2FnZSAodGhvdWdoIGl0IGlzbid0CisgICAgIGltcGxlbWVudGVkIGFueXdheSkKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA5LzA5IDIyOjM3OjAxCisgICAgIFtzY3AuY10KKyAgICAgc3VwcHJlc3MgYWRkaW5nICctLScgdG8gcmVtb3RlIGNvbW1hbmRsaW5lcyB3aGVuIHRoZSBmaXJzdCBhcmd1bWVudAorICAgICBkb2VzIG5vdCBzdGFydCB3aXRoICctJy4gc2F2ZXMgYnJlYWthZ2Ugb24gc29tZSBkaWZmaWN1bHQtdG8tdXBncmFkZQorICAgICBlbWJlZGRlZC9yb3V0ZXIgcGxhdGZvcm1zOyBmZWVkYmFjayAmIG9rIGR0dWNrZXIgb2sgbWFya3VzCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wOS8wOSAyMjozODoyMQorICAgICBbc3NoZC5jXQorICAgICBraWxsIHRoZSBwcmVhdXRoIHByaXZzZXAgY2hpbGQgb24gZmF0YWwgZXJyb3JzIGluIHRoZSBtb25pdG9yOworICAgICBvayBtYXJrdXNACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wOS8wOSAyMjo0Njo0NAorICAgICBbY2hhbm5lbHMuYyBjaGFubmVscy5oIGNsaWVudGxvb3AuaCBtdXguYyBzc2guY10KKyAgICAgc3VwcG9ydCBmb3IgY2FuY2VsbGluZyBsb2NhbCBhbmQgcmVtb3RlIHBvcnQgZm9yd2FyZHMgdmlhIHRoZSBtdWx0aXBsZXgKKyAgICAgc29ja2V0LiBVc2Ugc3NoIC1PIGNhbmNlbCAtTCB4eDp4eDp4eCAtUiB5eTp5eTp5eSB1c2VyQGhvc3QiIHRvIHJlcXVlc3QKKyAgICAgdGhlIGNhbmNlbGxhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGZvcndhcmRpbmdzOyBvayBtYXJrdXNACisgICAtIG1hcmt1c0BjdnMub3BlbmJzZC5vcmcgMjAxMS8wOS8xMCAyMjoyNjozNAorICAgICBbY2hhbm5lbHMuYyBjaGFubmVscy5oIGNsaWVudGxvb3AuYyBzc2guMV0KKyAgICAgc3VwcG9ydCBjYW5jZWxsYXRpb24gb2YgbG9jYWwvZHluYW1pYyBmb3J3YXJkaW5ncyBmcm9tIH5DIGNvbW1hbmRsaW5lOworICAgICBvayAmIGZlZWRiYWNrIGRqbUAKKyAgIC0gb2thbkBjdnMub3BlbmJzZC5vcmcgMjAxMS8wOS8xMSAwNjo1OTowNQorICAgICBbc3NoLjFdCisgICAgIGRvY3VtZW50IG5ldyAtTyBjYW5jZWwgY29tbWFuZDsgb2sgZGptQAorICAgLSBtYXJrdXNAY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDkvMTEgMTY6MDc6MjYKKyAgICAgW3NmdHAtY2xpZW50LmNdCisgICAgIGZpeCBsZWFrcyBpbiBkb19oYXJkbGluaygpIGFuZCBkb19yZWFkbGluaygpOyBieiMxOTIxCisgICAgIGZyb20gTG9nYW5hZGVuIFZlbHZpbmRyb24KKyAgIC0gbWFya3VzQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA5LzEyIDA4OjQ2OjE1CisgICAgIFtzZnRwLWNsaWVudC5jXQorICAgICBmaXggbGVhayBpbiBkb19sc3JlYWRkaXIoKTsgb2sgZGptCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wOS8yMiAwNjoyOTowMworICAgICBbc2Z0cC5jXQorICAgICBkb24ndCBsZXQgcmVtb3RlX2dsb2IoKSBpbXBsaWNpdGx5IHNvcnQgaXRzIHJlc3VsdHMgaW4gZG9fZ2xvYmJlZF9scygpIC0KKyAgICAgaW4gYWxsIGxpa2VsaWhvb2QsIHRoZXkgd2lsbCBiZSByZXNvcnRlZCBhbnl3YXkKKworMjAxMTA5MDkKKyAtIChkdHVja2VyKSBbZW50cm9weS5oXSBCdWcgIzE5MzI6IHJlbW92ZSBvbGQgZGVmaW5pdGlvbiBvZiBpbml0X3JuZy4gIEZyb20KKyAgIENvbGluIFdhdHNvbi4KKworMjAxMTA5MDYKKyAtIChkam0pIFtSRUFETUUgdmVyc2lvbi5oXSBDb3JyZWN0IHZlcnNpb24KKyAtIChkam0pIFtjb250cmliL3JlZGhhdC9vcGVuc3NoLnNwZWNdIENvcnJlY3QgcmVzdG9yY29uID0+IHJlc3RvcmVjb24KKyAtIChkam0pIFJlc3BpbiBPcGVuU1NILTUuOXAxIHJlbGVhc2UKKworMjAxMTA5MDUKKyAtIChkam0pIFtSRUFETUUgY29udHJpYi9jYWxkZXJhL29wZW5zc2guc3BlYyBjb250cmliL3JlZGhhdC9vcGVuc3NoLnNwZWNdCisgICBbY29udHJpYi9zdXNlL29wZW5zc2guc3BlY10gVXBkYXRlIHZlcnNpb24gbnVtYmVycy4KKworMjAxMTA5MDQKKyAtIChkam0pIFtyZWdyZXNzL2Nvbm5lY3QtcHJpdnNlcC5zaCByZWdyZXNzL3Rlc3QtZXhlYy5zaF0gZGVtb3RlIGZhdGFsCisgICByZWdyZXNzIGVycm9ycyBmb3IgdGhlIHNhbmRib3ggdG8gd2FybmluZ3MuIG9rIHRpbSBkdHVja2VyCisgLSAoZHR1Y2tlcikgW3NzaC1rZXlnZW4uYyBzc2gtcGtjczExLmNdIEJ1ZyAjMTkyOTogYWRkIG51bGwgaW1wbGVtZW50YXRpb25zCisgICBvZnNoLXBrY3MxMS5jcGtjc19pbml0IGFuZCBwa2NzX3Rlcm1pbmF0ZSBmb3IgYnVpbGRpbmcgd2l0aG91dCBkbG9wZW4KKyAgIHN1cHBvcnQuCisKKzIwMTEwODI5CisgLSAoZGptKSBbb3BlbmJzZC1jb21wYXQvcG9ydC1saW51eC5jXSBTdXBwcmVzcyBsb2dnaW5nIHdoZW4gYXR0ZW1wdGluZworICAgdG8gc3dpdGNoIFNFTGludXggY29udGV4dCBhd2F5IGZyb20gdW5jb25maW5lZF90LCBiYXNlZCBvbiBwYXRjaCBmcm9tCisgICBKYW4gQ2hhZGltYTsgYnojMTkxOSBvayBkdHVja2VyQAorCisyMDExMDgyNworIC0gKGR0dWNrZXIpIFthdXRoLXNrZXkuY10gQWRkIGxvZy5oIHRvIGZpeCBidWlsZCAtLXdpdGgtc2tleS4KKworMjAxMTA4MTgKKyAtICh0aW0pIFtjb25maWd1cmUuYWNdIFR5cG8gaW4gZXJyb3IgbWVzc2FnZSBzcG90dGVkIGJ5IEFuZHkgVHNvdWxhZHplCisKKzIwMTEwODE3CisgLSAodGltKSBbbWFjLmMgbXlwcm9wb3NhbC5oXSBXcmFwIFNIQTI1NiBhbmQgU0hBNTEyIGluIGlmZGVmcyBmb3IKKyAgIE9wZW5TU0wgMC45LjcuIG9rIGRqbQorIC0gKGRqbSkgWyBvcGVuYnNkLWNvbXBhdC9ic2QtY3lnd2luX3V0aWwuYyBvcGVuYnNkLWNvbXBhdC9ic2QtY3lnd2luX3V0aWwuaF0KKyAgIGJpbmFyeV9waXBlIGlzIG5vIGxvbmdlciByZXF1aXJlZCBvbiBDeWd3aW47IHBhdGNoIGZyb20gQ29yaW5uYSBWaW5zY2hlbgorIC0gKGRqbSkgW2NvbmZpZ3VyZS5hY10gZXJyb3Igb3V0IGlmIHRoZSBob3N0IGxhY2tzIHRoZSBuZWNlc3NhcnkgYml0cyBmb3IKKyAgIGFuIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHNhbmRib3ggdHlwZQorIC0gKGRqbSkgW2NvbnRyaWIvc3NoLWNvcHktaWRdIE1pc3NpbmcgYmFja2xzbGFzaDsgc3BvdHRlZCBieQorICAgYmlzc29uIEFUIGFyY2hsaW51eC5vcmcKKyAtIChkam0pIE9wZW5CU0QgQ1ZTIFN5bmMKKyAgIC0gZHR1Y2tlckBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNi8wMyAwNTozNToxMAorICAgICBbcmVncmVzcy9jZmdtYXRjaC5zaF0KKyAgICAgdXNlIE9CSiB0byBmaW5kIHRlc3QgY29uZmlncywgcGF0Y2ggZnJvbSBUaW0gUmljZQorICAgLSBtYXJrdXNAY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDYvMzAgMjI6NDQ6NDMKKyAgICAgW3JlZ3Jlc3MvY29ubmVjdC1wcml2c2VwLnNoXQorICAgICB0ZXN0IHdpdGggc2FuZGJveCBlbmFibGVkOyBvayBkam1ACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wOC8wMiAwMToyMzo0MQorICAgICBbcmVncmVzcy9jaXBoZXItc3BlZWQuc2ggcmVncmVzcy90cnktY2lwaGVycy5zaF0KKyAgICAgYWRkIFNIQTI1Ni9TSEE1MTIgYmFzZWQgSE1BQyBtb2RlcworIC0gKGRqbSkgW3JlZ3Jlc3MvY2lwaGVyLXNwZWVkLnNoIHJlZ3Jlc3MvdHJ5LWNpcGhlcnMuc2hdIGRpc2FibGUgSE1BQy1TSEEyCisgICBNQUMgdGVzdHMgZm9yIHBsYXRmb3JtcyB0aGF0IGhhY2sgRVZQX1NIQTIgc3VwcG9ydAorCisyMDExMDgxMgorIC0gKGR0dWNrZXIpIFtvcGVuYnNkLWNvbXBhdC9wb3J0LWxpbnV4LmNdIEJ1ZyAxOTI0OiBJbXByb3ZlIHNlbGludXggY29udGV4dAorICAgY2hhbmdlIGVycm9yIGJ5IHJlcG9ydGluZyBvbGQgYW5kIG5ldyBjb250ZXh0IG5hbWVzICBQYXRjaCBmcm9tCisgICBqY2hhZGltYSBhdCByZWRoYXQuCisgLSAoZGptKSBbY29udHJpYi9yZWRoYXQvb3BlbnNzaC5zcGVjIGNvbnRyaWIvcmVkaGF0L3NzaGQuaW5pdF0KKyAgIFtjb250cmliL3N1c2Uvb3BlbnNzaC5zcGVjIGNvbnRyaWIvc3VzZS9yYy5zc2hkXSBVcGRhdGVkIFJIRUwgYW5kIFNMRVMKKyAgIGluaXQgc2NyaXBzIGZyb20gaW1vcmdhbiBBVCBuYXMubmFzYS5nb3Y7IGJ6IzE5MjAKKyAtIChkam0pIFtjb250cmliL3NzaC1jb3B5LWlkXSBGaXggZmFpbHVyZSBmb3IgY2FzZXMgd2hlcmUgdGhlIHBhdGggdG8gdGhlCisgICBpZGVudGlmeSBmaWxlIGNvbnRhaW5lZCB3aGl0ZXNwYWNlLiBieiMxODI4IHBhdGNoIGZyb20gZ3dlbmFlbC5sYW1icm91aW4KKyAgIEFUIGdtYWlsLmNvbTsgb2sgZHR1Y2tlckAKKworMjAxMTA4MDcKKyAtIChkdHVja2VyKSBPcGVuQlNEIENWUyBTeW5jCisgICAtIGptY0BjdnMub3BlbmJzZC5vcmcgMjAwOC8wNi8yNiAwNjo1OTozOQorICAgICBbbW9kdWxpLjVdCisgICAgIHR3ZWFrIHByZXZpb3VzOworICAgLSBzb2JyYWRvQGN2cy5vcGVuYnNkLm9yZyAyMDA5LzEwLzI4IDA4OjU2OjU0CisgICAgIFttb2R1bGkuNV0KKyAgICAgIkRpZmZpZS1IZWxsbWFuIiBpcyB0aGUgdXN1YWwgc3BlbGxpbmcgZm9yIHRoZSBjcnlwdG9ncmFwaGljIHByb3RvY29sCisgICAgIGZpcnN0IHB1Ymxpc2hlZCBieSBXaGl0ZmllbGQgRGlmZmllIGFuZCBNYXJ0aW4gSGVsbG1hbiBpbiAxOTc2LgorICAgICBvayBqbWNACisgICAtIGptY0BjdnMub3BlbmJzZC5vcmcgMjAxMC8xMC8xNCAyMDo0MToyOAorICAgICBbbW9kdWxpLjVdCisgICAgIHByb2JhYmFsaXN0aWMgLT4gcHJvYmFiaWxpc3RpYzsgZnJvbSBuYWRkeQorICAgLSBkdHVja2VyQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA4LzA3IDEyOjU1OjMwCisgICAgIFtzZnRwLjFdCisgICAgIHR5cG8sIGZpeCBmcm9tIExhdXJlbnQgR2F1dHJvdAorCisyMDExMDgwNQorIC0gT3BlbkJTRCBDVlMgU3luYworICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDYvMjMgMjM6MzU6NDIKKyAgICAgW21vbml0b3IuY10KKyAgICAgaWdub3JlIEVJTlRSIGVycm9ycyBmcm9tIHBvbGwoKQorICAgLSB0ZWR1QGN2cy5vcGVuYnNkLm9yZyAyMDExLzA3LzA2IDE4OjA5OjIxCisgICAgIFthdXRoZmQuY10KKyAgICAgYnplcm8gdGhlIGFnZW50IGFkZHJlc3MuICB0aGUga2VybmVsIHdhcyBmb3IgYSB3aGlsZSB2ZXJ5IGNyYW5reSBhYm91dAorICAgICB0aGVzZSB0aGluZ3MuICBldm5lIHRob3VnaCB0aGF0J3MgZml4ZWQsIGFsd2F5cyBnb29kIHRvIGluaXRpYWxpemUKKyAgICAgbWVtb3J5LiAgb2sgZGVyYWFkdCBkam0KKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA3LzI5IDE0OjQyOjQ1CisgICAgIFtzYW5kYm94LXN5c3RyYWNlLmNdCisgICAgIGZhaWwgb3BlbigyKSB3aXRoIEVQRVJNIHJhdGhlciB0aGFuIFNJR0tJTExpbmcgdGhlIHdob2xlIHByb2Nlc3MuIGxpYmMKKyAgICAgd2lsbCBjYWxsIG9wZW4oKSB0byBkbyBzdHJlcnJvcigpIHdoZW4gTkxTIGlzIGVuYWJsZWQ7CisgICAgIGZlZWRiYWNrIGFuZCBvayBtYXJrdXNACisgICAtIG1hcmt1c0BjdnMub3BlbmJzZC5vcmcgMjAxMS8wOC8wMSAxOToxODoxNQorICAgICBbZ3NzLXNlcnYuY10KKyAgICAgcHJldmVudCBwb3N0LWF1dGggcmVzb3VyY2UgZXhoYXVzdGlvbiAoaW50IG92ZXJmbG93IGxlYWRpbmcgdG8gNEdCIG1hbGxvYyk7CisgICAgIHJlcG9ydCBBZGFtIFphYnJvY2s7IG9rIGRqbUAsIGRlcmFhZHRACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wOC8wMiAwMToyMjoxMQorICAgICBbbWFjLmMgbXlwcm9wb3NhbC5oIHNzaC4xIHNzaF9jb25maWcuNSBzc2hkLjggc3NoZF9jb25maWcuNV0KKyAgICAgQWRkIG5ldyBTSEEyNTYgYW5kIFNIQTUxMiBiYXNlZCBITUFDIG1vZGVzIGZyb20KKyAgICAgaHR0cDovL3d3dy5pZXRmLm9yZy9pZC9kcmFmdC1kYmlkZXItc2hhMi1tYWMtZm9yLXNzaC0wMi50eHQKKyAgICAgUGF0Y2ggZnJvbSBtZGIgQVQganVuaXBlci5uZXQ7IGZlZWRiYWNrIGFuZCBvayBtYXJrdXNACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wOC8wMiAyMzoxMzowMQorICAgICBbdmVyc2lvbi5oXQorICAgICBjcmFuayBub3csIHJlbGVhc2UgbGF0ZXIKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA4LzAyIDIzOjE1OjAzCisgICAgIFtzc2guY10KKyAgICAgdHlwbyBpbiBjb21tZW50CisKKzIwMTEwNjI0CisgLSAoZGptKSBbY29uZmlndXJlLmFjIE1ha2VmaWxlLmluIHNhbmRib3gtZGFyd2luLmNdIEFkZCBhIHNhbmRib3ggZm9yCisgICBEYXJ3aW4vT1MgWCB1c2luZyBzYW5kYm94X2luaXQoKSArIHNldHJsaW1pdCgpOyBmZWVkYmFjayBhbmQgdGVzdGluZworICAgbWFya3VzQAorCisyMDExMDYyMworIC0gT3BlbkJTRCBDVlMgU3luYworICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDYvMjIgMjE6NDc6MjgKKyAgICAgW3NlcnZjb25mLmNdCisgICAgIHJldXNlIHRoZSBtdWx0aXN0YXRlIG9wdGlvbiBhcnJheXMgdG8gcHJldHR5LXByaW50IG9wdGlvbnMgZm9yICJzc2hkIC1UIgorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDYvMjIgMjE6NTc6MDEKKyAgICAgW3NlcnZjb25mLmMgc2VydmNvbmYuaCBzc2hkLmMgc3NoZF9jb25maWcuNV0KKyAgICAgW2NvbmZpZ3VyZS5hYyBNYWtlZmlsZS5pbl0KKyAgICAgaW50cm9kdWNlIHNhbmRib3hpbmcgb2YgdGhlIHByZS1hdXRoIHByaXZzZXAgY2hpbGQgdXNpbmcgc3lzdHJhY2UoNCkuCisgICAgIAorICAgICBUaGlzIGludHJvZHVjZXMgYSBuZXcgIlVzZVByaXZpbGVnZVNlcGFyYXRpb249c2FuZGJveCIgb3B0aW9uIGZvcgorICAgICBzc2hkX2NvbmZpZyB0aGF0IGFwcGxpZXMgbWFuZGF0b3J5IHJlc3RyaWN0aW9ucyBvbiB0aGUgc3lzY2FsbHMgdGhlCisgICAgIHByaXZzZXAgY2hpbGQgY2FuIHBlcmZvcm0uIFRoaXMgcHJldmVudHMgYSBjb21wcm9taXNlZCBwcml2c2VwIGNoaWxkCisgICAgIGZyb20gYmVpbmcgdXNlZCB0byBhdHRhY2sgb3RoZXIgaG9zdHMgKGJ5IG9wZW5pbmcgc29ja2V0cyBhbmQgcHJveHlpbmcpCisgICAgIG9yIHByb2JpbmcgbG9jYWwga2VybmVsIGF0dGFjayBzdXJmYWNlLgorICAgICAKKyAgICAgVGhlIHNhbmRib3ggaXMgaW1wbGVtZW50ZWQgdXNpbmcgc3lzdHJhY2UoNCkgaW4gdW5zdXBlcnZpc2VkICJmYXN0LXBhdGgiCisgICAgIG1vZGUsIHdoZXJlIGEgbGlzdCBvZiBwZXJtaXR0ZWQgc3lzY2FsbHMgaXMgc3VwcGxpZWQuIEFueSBzeXNjYWxsIG5vdAorICAgICBvbiB0aGUgbGlzdCByZXN1bHRzIGluIFNJR0tJTEwgYmVpbmcgc2VudCB0byB0aGUgcHJpdnNlcCBjaGlsZC4gTm90ZQorICAgICB0aGF0IHRoaXMgcmVxdWlyZXMgYSBrZXJuZWwgd2l0aCB0aGUgbmV3IFNZU1RSX1BPTElDWV9LSUxMIG9wdGlvbi4KKyAgICAgCisgICAgIFVzZVByaXZpbGVnZVNlcGFyYXRpb249c2FuZGJveCB3aWxsIGJlY29tZSB0aGUgZGVmYXVsdCBpbiB0aGUgZnV0dXJlCisgICAgIHNvIHBsZWFzZSBzdGFydCB0ZXN0aW5nIGl0IG5vdy4KKyAgICAgCisgICAgIGZlZWRiYWNrIGR0dWNrZXJAOyBvayBtYXJrdXNACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNi8yMiAyMjowODo0MgorICAgICBbY2hhbm5lbHMuYyBjaGFubmVscy5oIGNsaWVudGxvb3AuYyBjbGllbnRsb29wLmggbXV4LmMgc3NoLmNdCisgICAgIGhvb2sgdXAgYSBjaGFubmVsIGNvbmZpcm0gY2FsbGJhY2sgdG8gd2FybiB0aGUgdXNlciB0aGVuIHJlcXVlc3RlZCBYMTEKKyAgICAgZm9yd2FyZGluZyB3YXMgcmVmdXNlZCBieSB0aGUgc2VydmVyOyBvayBtYXJrdXNACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNi8yMyAwOTozNDoxMworICAgICBbc3NoZC5jIHNzaC1zYW5kYm94Lmggc2FuZGJveC5oIHNhbmRib3gtcmxpbWl0LmMgc2FuZGJveC1zeXN0cmFjZS5jXQorICAgICBbc2FuZGJveC1udWxsLmNdCisgICAgIHJlbmFtZSBzYW5kYm94LmggPT4gc3NoLXNhbmRib3guaCB0byBtYWtlIHRoaW5ncyBlYXNpZXIgZm9yIHBvcnRhYmxlCisgLSAoZGptKSBbc2FuZGJveC1udWxsLmNdIER1bW15IHNhbmRib3ggZm9yIHBsYXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQKKyAgIHNldHJsaW1pdCgyKQorCisyMDExMDYyMAorIC0gT3BlbkJTRCBDVlMgU3luYworICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDYvMDQgMDA6MTA6MjYKKyAgICAgW3NzaF9jb25maWcuNV0KKyAgICAgZXhwbGFpbiBJZGVudGlmeUZpbGUncyBzZW1hbnRpY3MgYSBsaXR0bGUgYmV0dGVyLCBwcm9tcHRlZCBieSBieiMxODk4CisgICAgIG9rIGR0dWNrZXIgam1jCisgICAtIG1hcmt1c0BjdnMub3BlbmJzZC5vcmcgMjAxMS8wNi8xNCAyMjo0OToxOAorICAgICBbYXV0aGZpbGUuY10KKyAgICAgbWFrZSBzdXJlIGtleV9wYXJzZV9wdWJsaWMvcHJpdmF0ZV9yc2ExKCkgbm8gbG9uZ2VyIGNvbnN1bWVzIGl0cyBpbnB1dAorICAgICBidWZmZXIuICBmaXhlcyBzc2gtYWRkIGZvciBwYXNzcGhyYXNlLXByb3RlY3RlZCBzc2gxLWtleXM7CisgICAgIG5vdGVkIGJ5IG5hZGR5QDsgb2sgZGptQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDYvMTcgMjE6NDQ6MzEKKyAgICAgW2xvZy5jIGxvZy5oIG1vbml0b3IuYyBtb25pdG9yLmggbW9uaXRvcl93cmFwLmMgbW9uaXRvcl93cmFwLmggc3NoZC5jXQorICAgICBtYWtlIHRoZSBwcmUtYXV0aCBwcml2c2VwIHNsYXZlIGxvZyB2aWEgYSBzb2NrZXRwYWlyIHNoYXJlZCB3aXRoIHRoZQorICAgICBtb25pdG9yIHJhdGhlciB0aGFuIC92YXIvZW1wdHkvZGV2L2xvZzsgb2sgZHR1Y2tlckAgZGVyYWFkdEAgbWFya3VzQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDYvMTcgMjE6NDY6MTYKKyAgICAgW3NmdHAtc2VydmVyLmNdCisgICAgIHRoZSBwcm90b2NvbCB2ZXJzaW9uIHNob3VsZCBiZSB1bnNpZ25lZDsgYnojMTkxMyByZXBvcnRlZCBieSBtYiBBVAorICAgICBzbWFydGZ0cC5jb20KKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA2LzE3IDIxOjQ3OjM1CisgICAgIFtzZXJ2Y29uZi5jXQorICAgICBmYWN0b3Igb3V0IG11bHRpLWNob2ljZSBvcHRpb24gcGFyc2luZyBpbnRvIGEgcGFyc2VfbXVsdGlzdGF0ZSBsYWJlbAorICAgICBhbmQgc29tZSBzdXBwb3J0IHN0cnVjdHVyZXM7IG9rIGR0dWNrZXJACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNi8xNyAyMTo1NzoyNQorICAgICBbY2xpZW50bG9vcC5jXQorICAgICBzZXRwcm9jdGl0bGUgZm9yIGEgbXV4IG1hc3RlciB0aGF0IGhhcyBiZWVuIGdyYWNlZnVsbHkgc3RvcHBlZDsKKyAgICAgYnojMTkxMSBmcm9tIEJlcnQuV2VzYXJnIEFUIGdvb2dsZW1haWwuY29tCisKKzIwMTEwNjAzCisgLSAoZHR1Y2tlcikgW1JFQURNRSB2ZXJzaW9uLmggY29udHJpYi9jYWxkZXJhL29wZW5zc2guc3BlYworICAgY29udHJpYi9yZWRoYXQvb3BlbnNzaC5zcGVjIGNvbnRyaWIvc3VzZS9vcGVuc3NoLnNwZWNdIFB1bGwgdGhlIHZlcnNpb24KKyAgIGJ1bXBzIGZyb20gdGhlIDUuOHAyIGJyYW5jaCBpbnRvIEhFQUQuICBvayBkam0uCisgLSAodGltKSBbY29uZmlndXJlLmFjIGRlZmluZXMuaF0gUnVuIHRlc3QgcHJvZ3JhbSB0byBkZXRlY3Qgc3lzdGVtIG1haWwKKyAgIGRpcmVjdG9yeS4gQWRkIC0td2l0aC1tYWlsZGlyIG9wdGlvbiB0byBvdmVycmlkZS4gRml4ZWQgT3BlblNlcnZlciA2CisgICBnZXR0aW5nIGl0IHdyb25nLiBGaXhlZCBtYW55IHN5c3RlbXMgaGF2aW5nIE1BSUw9L3Zhci9tYWlsLy91c2VybmFtZQorICAgb2sgZHR1Y2tlcgorIC0gKGR0dWNrZXIpIFttb25pdG9yLmNdIFJlbW92ZSB0aGUgIUhBVkVfU09DS0VUUEFJUiBjYXNlLiAgV2UgdXNlIHNvY2tldHBhaXIKKyAgIHVuY29uZGl0aW9uYWxseSBpbiBvdGhlciBwbGFjZXMgYW5kIHRoZSBzdXJ2ZXkgZGF0YSB3ZSBoYXZlIGRvZXMgbm90IHNob3cKKyAgIGFueSBzeXN0ZW1zIHRoYXQgdXNlIGl0LiAgIm51a2UgaXQiIGRqbUAKKyAtIChkam0pIFtjb25maWd1cmUuYWNdIGVuYWJsZSBzZXRwcm9jdGl0bGUgZW11bGF0aW9uIGZvciBPUyBYCisgLSAoZGptKSBPcGVuQlNEIENWUyBTeW5jCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNi8wMyAwMDo1NDozOAorICAgICBbc3NoLmNdCisgICAgIGJ6IzE4ODMgLSBzZXRwcm9jdGl0bGUoKSB0byBpZGVudGlmeSBtdXggbWFzdGVyOyBwYXRjaCBmcm9tIEJlcnQuV2VzYXJnCisgICAgIEFUIGdvb2dsZW1haWwuY29tOyBvayBkdHVja2VyQAorICAgICBOQi4gaW5jbHVkZXMgYWRkaXRpb25hbCBwb3J0YWJpbGl0eSBjb2RlIHRvIGVuYWJsZSBzZXRwcm9jdGl0bGUgZW11bGF0aW9uCisgICAgIG9uIHBsYXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQgaXQuCisgICAtIGR0dWNrZXJAY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDYvMDMgMDE6Mzc6NDAKKyAgICAgW3NzaC1hZ2VudC5jXQorICAgICBDaGVjayBjdXJyZW50IHBhcmVudCBwcm9jZXNzIElEIGFnYWluc3Qgc2F2ZWQgb25lIHRvIGRldGVybWluZSBpZiB0aGUgcGFyZW50CisgICAgIGhhcyBleGl0ZWQsIHJhdGhlciB0aGFuIGF0dGVtcHRpbmcgdG8gc2VuZCBhIHplcm8gc2lnbmFsLCBzaW5jZSB0aGUgbGF0dGVyCisgICAgIHdvbid0IHdvcmsgaWYgdGhlIHBhcmVudCBoYXMgY2hhbmdlZCBwcml2cy4gIGJ6IzE5MDUsIHBhdGNoIGZyb20gRGFuaWVsIEthaG4KKyAgICAgR2lsbG1vciwgb2sgZGptQAorICAgIC0gZHR1Y2tlckBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNS8zMSAwMjowMTo1OAorICAgICBbcmVncmVzcy9keW5hbWljLWZvcndhcmQuc2hdCisgICAgIGJhY2sgb3V0IHJldnMgMS42IGFuZCAxLjUgc2luY2UgaXQncyBub3QgcmVsaWFibGUKKyAgIC0gZHR1Y2tlckBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNS8zMSAwMjowMzozNAorICAgICBbcmVncmVzcy9keW5hbWljLWZvcndhcmQuc2hdCisgICAgIHdvcmsgYXJvdW5kIHN0YXJ0dXAgYW5kIHRlYXJkb3duIHJhY2VzOyBjYXVnaHQgYnkgZGVyYWFkdAorICAgLSBkdHVja2VyQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA2LzAzIDAwOjI5OjUyCisgICAgIFtyZWdyZXNzL2R5bmFtaWMtZm9yd2FyZC5zaF0KKyAgICAgUmV0cnkgZXN0YWJsaXNoaW5nIHRoZSBwb3J0IGZvcndhcmRpbmcgYWZ0ZXIgYSBzbWFsbCBkZWxheSwgc2hvdWxkIG1ha2UKKyAgICAgdGhlIHRlc3RzIGxlc3MgZmxha3kgd2hlbiB0aGUgcHJldmlvdXMgdGVzdCBpcyBzbG93IHRvIHNodXQgZG93biBhbmQgZnJlZQorICAgICB1cCB0aGUgcG9ydC4KKyAtICh0aW0pIFtyZWdyZXNzL2NmZ21hdGNoLnNoXSBCdWlsZC90ZXN0IG91dCBvZiB0cmVlIGZpeC4KKworMjAxMTA1MjkKKyAtIChkam0pIE9wZW5CU0QgQ1ZTIFN5bmMKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzIzIDAzOjMwOjA3CisgICAgIFthdXRoLXJzYS5jIGF1dGguYyBhdXRoLmggYXV0aDItcHVia2V5LmMgbW9uaXRvci5jIG1vbml0b3Jfd3JhcC5jXQorICAgICBbcGF0aG5hbWVzLmggc2VydmNvbmYuYyBzZXJ2Y29uZi5oIHNzaGQuOCBzc2hkX2NvbmZpZyBzc2hkX2NvbmZpZy41XQorICAgICBhbGxvdyBBdXRob3JpemVkS2V5c0ZpbGUgdG8gc3BlY2lmeSBtdWx0aXBsZSBmaWxlcywgc2VwYXJhdGVkIGJ5IHNwYWNlcy4KKyAgICAgQnJpbmcgYmFjayBhdXRob3JpemVkX2tleXMyIGFzIGEgZGVmYXVsdCBzZWFyY2ggcGF0aCAodG8gYXZvaWQgYnJlYWtpbmcKKyAgICAgZXhpc3RpbmcgdXNlcnMgb2YgdGhpcyBmaWxlKSwgYnV0IG92ZXJyaWRlIHRoaXMgaW4gc3NoZF9jb25maWcgc28gaXQgd2lsbAorICAgICBiZSBubyBsb25nZXIgdXNlZCBvbiBmcmVzaCBpbnN0YWxscy4gTWF5YmUgaW4gMjAxNSB3ZSBjYW4gcmVtb3ZlIGl0CisgICAgIGVudGllcmx5IDopCisgICAgIAorICAgICBmZWVkYmFjayBhbmQgb2sgbWFya3VzQCBkdHVja2VyQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMjMgMDM6MzM6MzgKKyAgICAgW2F1dGguY10KKyAgICAgbWFrZSBzZWN1cmVfZmlsZW5hbWUoKSBzcGFtIGRlYnVnIGxvZ3MgbGVzcworICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMjMgMDM6NTI6NTUKKyAgICAgW3NzaGNvbm5lY3QuY10KKyAgICAgcmVtb3ZlIGV4dHJhIG5ld2xpbmUKKyAgIC0gam1jQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzIzIDA3OjEwOjIxCisgICAgIFtzc2hkLjggc3NoZF9jb25maWcuNV0KKyAgICAgdHdlYWsgcHJldmlvdXM7IG9rIGRqbQorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMjMgMDc6MjQ6NTcKKyAgICAgW2F1dGhmaWxlLmNdCisgICAgIHJlYWQgaW4ga2V5IGNvbW1lbnRzIGZvciB2LjIga2V5cyAodGhvdWdoIG5vdGUgdGhhdCB0aGVzZSBhcmUgbm90CisgICAgIHBhc3NlZCBvdmVyIHRoZSBhZ2VudCBwcm90b2NvbCk7IGJ6IzQzOSwgYmFzZWQgb24gcGF0Y2ggZnJvbSBiaW5kZXIKKyAgICAgQVQgYXJhZ28uZGU7IG9rIG1hcmt1c0AKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzI0IDA3OjE1OjQ3CisgICAgIFtyZWFkY29uZi5jIHJlYWRjb25mLmggc3NoLmMgc3NoX2NvbmZpZy41IHNzaGNvbm5lY3QuYyBzc2hjb25uZWN0Mi5jXQorICAgICBSZW1vdmUgdW5kb2N1bWVudGVkIGxlZ2FjeSBvcHRpb25zIFVzZXJLbm93bkhvc3RzRmlsZTIgYW5kCisgICAgIEdsb2JhbEtub3duSG9zdHNGaWxlMiBieSBtYWtpbmcgVXNlcktub3duSG9zdHNGaWxlL0dsb2JhbEtub3duSG9zdHNGaWxlCisgICAgIGFjY2VwdCBtdWx0aXBsZSBwYXRocyBwZXIgbGluZSBhbmQgbWFraW5nIHRoZWlyIGRlZmF1bHRzIGluY2x1ZGUKKyAgICAga25vd25faG9zdHMyOyBvayBtYXJrdXMKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzIzIDAzOjMxOjMxCisgICAgIFtyZWdyZXNzL2NmZ21hdGNoLnNoXQorICAgICBpbmNsdWRlIHRlc3Rpbmcgb2YgbXVsdGlwbGUvb3ZlcnJpZGRlbiBBdXRob3JpemVkS2V5c0ZpbGVzCisgICAgIHJlZmFjdG9yIHRvIHNpbXBseSBkYWVtb24gc3RhcnQvc3RvcCBhbmQgZ2V0IHJpZCBvZiByYWN5IGNvbnN0cnVjdHMKKworMjAxMTA1MjAKKyAtIChkam0pIFtzZXNzaW9uLmNdIGNhbGwgc2V0ZXhlY2NvbigpIGJlZm9yZSBleGVjdXRpbmcgcGFzc3dkIGZvciBwdworICAgY2hhbmdlczsgYnojMTg5MSByZXBvcnRlZCBieSBqY2hhZGltYSBBVCByZWRoYXQuY29tOyBvayBkdHVja2VyQAorIC0gKGRqbSkgW2FjbG9jYWwubTQgY29uZmlndXJlLmFjXSBzaW5jZSBnY2MtNC54IGlnbm9yZXMgYWxsIC1Xbm8tb3B0aW9ucworICAgb3B0aW9ucywgd2Ugc2hvdWxkIGNvcnJlc3BvbmRpbmcgLVctb3B0aW9uIHdoZW4gdHJ5aW5nIHRvIGRldGVybWluZQorICAgd2hldGhlciBpdCBpcyBhY2NlcHRlZC4gIEFsc28gaW5jbHVkZXMgYSB3YXJuaW5nIGZpeCBvbiB0aGUgcHJvZ3JhbQorICAgZnJhZ21lbnQgdXNlcyAoYmFkIG1haW4oKSByZXR1cm4gdHlwZSkuCisgICBieiMxOTAwIGFuZCBieiMxOTAxIHJlcG9ydGVkIGJ5IGcuZXNwIEFUIGZyZWUuZnI7IG9rIGR0dWNrZXJACisgLSAoZGptKSBbc2VydmNvbmYuY10gcmVtb3ZlIGxlZnRvdmVyIGRyb3BwaW5ncyBvZiBBdXRob3JpemVkS2V5c0ZpbGUyCisgLSBPcGVuQlNEIENWUyBTeW5jCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNS8xNSAwODowOTowMQorICAgICBbYXV0aGZkLmMgbW9uaXRvci5jIHNlcnZlcmxvb3AuY10KKyAgICAgdXNlIEZEX0NMT0VYRUMgY29uc2lzdGVudGx5OyBwYXRjaCBmcm9tIHppb24gQVQgeDk2Lm9yZworICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMTcgMDc6MTM6MzEKKyAgICAgW2tleS5jXQorICAgICBmYXRhbCgpIGlmIGFza2VkIHRvIGdlbmVyYXRlIGEgbGVnYWN5IEVDRFNBIGNlcnQgKHRoZXNlIGRvbid0IGV4aXN0KQorICAgICBhbmQgZml4IHRoZSByZWdyZXNzIHRlc3QgdGhhdCB3YXMgdHJ5aW5nIHRvIGdlbmVyYXRlIHRoZW0gOikKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzIwIDAwOjU1OjAyCisgICAgIFtzZXJ2Y29uZi5jXQorICAgICB0aGUgb3B0aW9ucyBUcnVzdGVkVXNlckNBS2V5cywgUmV2b2tlZEtleXNGaWxlLCBBdXRob3JpemVkS2V5c0ZpbGUKKyAgICAgYW5kIEF1dGhvcml6ZWRQcmluY2lwYWxzRmlsZSB3ZXJlIG5vdCBiZWluZyBjb3JyZWN0bHkgYXBwbGllZCBpbgorICAgICBNYXRjaCBibG9ja3MsIGRlc3BpdGUgYmVpbmcgb3ZlcnJpZGFibGUgdGhlcmU7IG9rIGR0dWNrZXJACisgICAtIGR0dWNrZXJAY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMjAgMDI6MDA6MTkKKyAgICAgW3NlcnZjb25mLmNdCisgICAgIEFkZCBjb21tZW50IGRvY3VtZW50aW5nIHdoYXQgc2hvdWxkIGJlIGFmdGVyIHRoZSBwcmVhdXRoIGNoZWNrLiAgb2sgZGptCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNS8yMCAwMzoyNTo0NQorICAgICBbbW9uaXRvci5jIG1vbml0b3Jfd3JhcC5jIHNlcnZjb25mLmMgc2VydmNvbmYuaF0KKyAgICAgdXNlIGEgbWFjcm8gdG8gZGVmaW5lIHdoaWNoIHN0cmluZyBvcHRpb25zIHRvIGNvcHkgYmV0d2VlbiBjb25maWdzCisgICAgIGZvciBNYXRjaC4gVGhpcyBhdm9pZHMgcHJvYmxlbXMgY2F1c2VkIGJ5IGZvcmdldHRpbmcgdG8ga2VlcCB0aHJlZQorICAgICBjb2RlIGxvY2F0aW9ucyBpbiBwZXJmZWN0IHN5bmMgYW5kIG9yZGVyaW5nCisgICAgIAorICAgICAidGhpcyBpcyBhdCBvbmNlIGJlYXV0aWZ1bCBhbmQgaG9ycmlibGUiICsgb2sgZHR1Y2tlckAKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzE3IDA3OjEzOjMxCisgICAgIFtyZWdyZXNzL2NlcnQtdXNlcmtleS5zaF0KKyAgICAgZmF0YWwoKSBpZiBhc2tlZCB0byBnZW5lcmF0ZSBhIGxlZ2FjeSBFQ0RTQSBjZXJ0ICh0aGVzZSBkb24ndCBleGlzdCkKKyAgICAgYW5kIGZpeCB0aGUgcmVncmVzcyB0ZXN0IHRoYXQgd2FzIHRyeWluZyB0byBnZW5lcmF0ZSB0aGVtIDopCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNS8yMCAwMjo0MzozNgorICAgICBbY2VydC1ob3N0a2V5LnNoXQorICAgICBhbm90aGVyIGF0dGVtcHQgdG8gZ2VuZXJhdGUgYSB2MDAgRUNEU0Ega2V5IHRoYXQgYnJva2UgdGhlIHRlc3QKKyAgICAgSUQgc3luYyBvbmx5IC0gcG9ydGFibGUgYWxyZWFkeSBoYWQgdGhpcyBzb21laG93CisgICAtIGR0dWNrZXJAY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMjAgMDU6MTk6NTAKKyAgICAgW2R5bmFtaWMtZm9yd2FyZC5zaF0KKyAgICAgUHJldmVudCByYWNlcyBpbiBkeW5hbWljIGZvcndhcmRpbmcgdGVzdDsgb2sgZGptCisgICAtIGR0dWNrZXJAY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMjAgMDY6MzI6MzAKKyAgICAgW2R5bmFtaWMtZm9yd2FyZC5zaF0KKyAgICAgZml4IGR1bWIgZXJyb3IgaW4gZHluYW1pYy1mb3J3YXJkIHRlc3QKKworMjAxMTA1MTUKKyAtIChkam0pIE9wZW5CU0QgQ1ZTIFN5bmMKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzA1IDA1OjEyOjA4CisgICAgIFttdXguY10KKyAgICAgZ3JhY2VmdWxseSBmYWxsIGJhY2sgd2hlbiBDb250cm9sUGF0aCBpcyB0b28gbGFyZ2UgZm9yIGEKKyAgICAgc29ja2FkZHJfdW4uIG9rIG1hcmt1c0AgYXMgcGFydCBvZiBhIGxhcmdlciBkaWZmCisgICAtIGR0dWNrZXJAY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMDYgMDE6MDM6MzUKKyAgICAgW3NzaGRfY29uZmlnXQorICAgICBjbGFyaWZ5IGxhbmd1YWdlIGFib3V0IG92ZXJyaWRpbmcgZGVmYXVsdHMuICBieiMxODkyLCBmcm9tIFBldHIgQ2VybnkKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzA2IDAxOjA5OjUzCisgICAgIFtzZnRwLjFdCisgICAgIG1lbnRpb24gdGhhdCBJUHY2IGFkZHJlc3NlcyBtdXN0IGJlIGVuY2xvc2VkIGluIHNxdWFyZSBicmFja2V0czsKKyAgICAgYnojMTg0NQorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMDYgMDI6MDU6NDEKKyAgICAgW3NzaGNvbm5lY3QyLmNdCisgICAgIGZpeCBtZW1vcnkgbGVhazsgYnojMTg0OSBvayBkdHVja2VyQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMDYgMjE6MTQ6MDUKKyAgICAgW3BhY2tldC5jIHBhY2tldC5oXQorICAgICBzZXQgdHJhZmZpYyBjbGFzcyBmb3IgSVB2NiB0cmFmZmljIGFzIHdlIGRvIGZvciBJUHY0IFRPUzsKKyAgICAgcGF0Y2ggZnJvbSBsaW9uZWwgQVQgbWFtYW5lLmx1IHZpYSBDb2xpbiBXYXRzb24gaW4gYnojMTg1NTsKKyAgICAgb2sgbWFya3VzQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMDYgMjE6MTg6MDIKKyAgICAgW3NzaC5jIHNzaF9jb25maWcuNV0KKyAgICAgYWRkIGEgJUwgZXhwYW5zaW9uIChzaG9ydC1mb3JtIG9mIHRoZSBsb2NhbCBob3N0IG5hbWUpIGZvciBDb250cm9sUGF0aDsKKyAgICAgc3luYyBzb21lIG1vcmUgZXhwYW5zaW9ucyB3aXRoIExvY2FsQ29tbWFuZDsgb2sgbWFya3VzQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMDYgMjE6MzE6MzgKKyAgICAgW3JlYWRjb25mLmMgc3NoX2NvbmZpZy41XQorICAgICBzdXBwb3J0IG5lZ2F0ZWQgSG9zdCBtYXRjaGluZywgZS5nLgorICAgICAKKyAgICAgSG9zdCAqLmV4YW1wbGUub3JnICFjLmV4YW1wbGUub3JnCisgICAgICAgIFVzZXIgbWVrbWl0YXNkaWdvYXQKKyAgICAgCisgICAgIFdpbGwgbWF0Y2ggImEuZXhhbXBsZS5vcmciLCAiYi5leGFtcGxlLm9yZyIsIGJ1dCBub3QgImMuZXhhbXBsZS5vcmciCisgICAgIG9rIG1hcmt1c0AKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzA2IDIxOjM0OjMyCisgICAgIFtjbGllbnRsb29wLmMgbXV4LmMgcmVhZGNvbmYuYyByZWFkY29uZi5oIHNzaC5jIHNzaF9jb25maWcuNV0KKyAgICAgQWRkIGEgUmVxdWVzdFRUWSBzc2hfY29uZmlnIG9wdGlvbiB0byBhbGxvdyBjb25maWd1cmF0aW9uLWJhc2VkCisgICAgIGNvbnRyb2wgb3ZlciB0dHkgYWxsb2NhdGlvbiAobGlrZSAtdC8tVCk7IG9rIG1hcmt1c0AKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzA2IDIxOjM4OjU4CisgICAgIFtzc2guY10KKyAgICAgZml4IGRyb3BwaW5nIGZyb20gcHJldmlvdXMgZGlmZgorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMDYgMjI6MjA6MTAKKyAgICAgW1BST1RPQ09MLm11eF0KKyAgICAgZml4IG51bWJlcmluZzsgZnJvbSBiZXJ0Lndlc2FyZyBBVCBnb29nbGVtYWlsLmNvbQorICAgLSBqbWNAY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMDcgMjM6MTk6MzkKKyAgICAgW3NzaF9jb25maWcuNV0KKyAgICAgLSB0d2VhayBwcmV2aW91cworICAgICAtIGNvbWUgY29uc2lzdGVuY3kgZml4ZXMKKyAgICAgb2sgZGptCisgICAtIGptY0BjdnMub3BlbmJzZC5vcmcgMjAxMS8wNS8wNyAyMzoyMDoyNQorICAgICBbc3NoLjFdCisgICAgICsuSXQgUmVxdWVzdFRUWQorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMDggMTI6NTI6MDEKKyAgICAgW1BST1RPQ09MLm11eCBjbGllbnRsb29wLmMgY2xpZW50bG9vcC5oIG11eC5jXQorICAgICBpbXByb3ZlIG91ciBiZWhhdmlvdXIgd2hlbiBUVFkgYWxsb2NhdGlvbiBmYWlsczogaWYgd2UgYXJlIGluCisgICAgIFJlcXVlc3RUVFk9YXV0byBtb2RlICh0aGUgZGVmYXVsdCksIHRoZW4gZG8gbm90IHRyZWF0IGF0IFRUWQorICAgICBhbGxvY2F0aW9uIGVycm9yIGFzIGZhdGFsIGJ1dCByYXRoZXIganVzdCByZXN0b3JlIHRoZSBsb2NhbCBUVFkKKyAgICAgdG8gY29va2VkIG1vZGUgYW5kIGNvbnRpbnVlLiBUaGlzIGlzIG1vcmUgZ3JhY2VmdWwgb24gZGV2aWNlcyB0aGF0CisgICAgIG5ldmVyIGFsbG9jYXRlIFRUWXMuCisgICAgIAorICAgICBJZiBSZXF1ZXN0VFRZIGlzIHNldCB0byAieWVzIiBvciAiZm9yY2UiLCB0aGVuIGZhaWx1cmUgdG8gYWxsb2NhdGUKKyAgICAgYSBUVFkgaXMgZmF0YWwuCisgICAgIAorICAgICBvayBtYXJrdXNACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNS8xMCAwNTo0Njo0NgorICAgICBbYXV0aGZpbGUuY10KKyAgICAgZGVzcGFtIGRlYnVnKCkgbG9ncyBieSBkZXRlY3RpbmcgdGhhdCB3ZSBhcmUgdHJ5aW5nIHRvIGxvYWQgYSBwcml2YXRlIGtleQorICAgICBpbiBrZXlfdHJ5X2xvYWRfcHVibGljKCkgYW5kIHJldHVybmluZyBlYXJseTsgb2sgbWFya3VzQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMTEgMDQ6NDc6MDYKKyAgICAgW2F1dGguYyBhdXRoLmggYXV0aDItcHVia2V5LmMgcGF0aG5hbWVzLmggc2VydmNvbmYuYyBzZXJ2Y29uZi5oXQorICAgICByZW1vdmUgc3VwcG9ydCBmb3IgYXV0aG9yaXplZF9rZXlzMjsgaXQgaXMgYSByZWxpYyBmcm9tIHRoZSBlYXJseSBkYXlzCisgICAgIG9mIHByb3RvY29sIHYuMiBzdXBwb3J0IGFuZCBoYXMgYmVlbiB1bmRvY3VtZW50ZWQgZm9yIG1hbnkgeWVhcnM7CisgICAgIG9rIG1hcmt1c0AKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzEzIDAwOjA1OjM2CisgICAgIFthdXRoZmlsZS5jXQorICAgICB3YXJuIG9uIHVuZXhwZWN0ZWQga2V5IHR5cGUgaW4ga2V5X3BhcnNlX3ByaXZhdGVfdHlwZSgpCisgLSAoZGptKSBbcGFja2V0LmNdIHVuYnJlYWsgcG9ydGFiaWxpdHkgI2VuZGlmCisKKzIwMTEwNTEwCisgLSAoZHR1Y2tlcikgW29wZW5ic2QtY29tcGF0L29wZW5zc2wtY29tcGF0LntjLGh9XSBCdWcgIzE4ODI6IGZpeAorICAgLS13aXRoLXNzbC1lbmdpbmUgd2hpY2ggd2FzIGJyb2tlbiB3aXRoIHRoZSBjaGFuZ2UgZnJvbSBkZXByZWNhdGVkCisgICBTU0xlYXlfYWRkX2FsbF9hbGdvcml0aG1zKCkuICBvayBkam0KKworMjAxMTA1MDYKKyAtIChkdHVja2VyKSBbb3BlbmJzZC1jb21wYXQvcmVncmVzcy9jbG9zZWZyb210ZXN0LmNdIEJ1ZyAjMTg3NTogYWRkIHByb3RvdHlwZQorICAgZm9yIGNsb3NlZnJvbSgpIGluIHRlc3QgY29kZS4gIFJlcG9ydCBmcm9tIERhbiBXYWxsaXMgdmlhIEdlbnRvby4KKworMjAxMTA1MDUKKyAtIChkam0pIFtkZWZpbmVzLmhdIE1vdmUgdXAgaW5jbHVkZSBvZiBuZXRpbmV0L2lwLmggZm9yIElQVE9TCisgICBkZWZpbml0aW9ucy4gRnJvbSBkZXMgQVQgZGVzLm5vCisgLSAoZGptKSBbTWFrZWZpbGUuaW4gV0FSTklORy5STkcgYWNsb2NhbC5tNCBidWlsZHBrZy5zaC5pbiBjb25maWd1cmUuYWNdCisgICBbZW50cm9weS5jIHNzaC1hZGQuYyBzc2gtYWdlbnQuYyBzc2gta2V5Z2VuLmMgc3NoLWtleXNjYW4uY10KKyAgIFtzc2gta2V5c2lnbi5jIHNzaC1wa2NzMTEtaGVscGVyLmMgc3NoLXJhbmQtaGVscGVyLjggc3NoLXJhbmQtaGVscGVyLmNdCisgICBbc3NoLmMgc3NoX3BybmdfY21kcy5pbiBzc2hkLmMgY29udHJpYi9haXgvYnVpbGRiZmYuc2hdCisgICBbcmVncmVzcy9SRUFETUUucmVncmVzc10gUmVtb3ZlIHNzaC1yYW5kLWhlbHBlciBhbmQgYWxsIGl0cworICAgdGVudGFjbGVzLiBQUk5HZCBzZWVkaW5nIGhhcyBiZWVuIHJvbGxlZCBpbnRvIGVudHJvcHkuYyBkaXJlY3RseS4KKyAgIFRoYW5rcyB0byB0aW1AIGZvciB0ZXN0aW5nIG9uIGFmZmVjdGVkIHBsYXRmb3Jtcy4KKyAtIE9wZW5CU0QgQ1ZTIFN5bmMKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzAzLzEwIDAyOjUyOjU3CisgICAgIFthdXRoMi1nc3MuYyBhdXRoMi5jIGF1dGguaF0KKyAgICAgYWxsb3cgR1NTQVBJIGF1dGhlbnRpY2F0aW9uIHRvIGRldGVjdCB3aGVuIGEgc2VydmVyLXNpZGUgZmFpbHVyZSBjYXVzZXMKKyAgICAgYXV0aGVudGljYXRpb24gZmFpbHVyZSBhbmQgZG9uJ3QgY291bnQgc3VjaCBmYWlsdXJlcyBhZ2FpbnN0IE1heEF1dGhUcmllczsKKyAgICAgYnojMTI0NCBmcm9tIHNpbW9uIEFUIHN4dy5vcmcudWs7IG9rIG1hcmt1c0AgYmVmb3JlIGxvY2sKKyAgIC0gb2thbkBjdnMub3BlbmJzZC5vcmcgMjAxMS8wMy8xNSAxMDozNjowMgorICAgICBbc3NoLWtleXNjYW4uY10KKyAgICAgdXNlIHRpbWVyY2xlYXIgbWFjcm8KKyAgICAgb2sgZGptQAorICAgLSBzdGV2ZXNrQGN2cy5vcGVuYnNkLm9yZyAyMDExLzAzLzIzIDE1OjE2OjIyCisgICAgIFtzc2gta2V5Z2VuLjEgc3NoLWtleWdlbi5jXQorICAgICBBZGQgLUEgb3B0aW9uLiAgRm9yIGVhY2ggb2YgdGhlIGtleSB0eXBlcyAocnNhMSwgcnNhLCBkc2EgYW5kIGVjZHNhKQorICAgICBmb3Igd2hpY2ggaG9zdCBrZXlzIGRvIG5vdCBleGlzdCwgZ2VuZXJhdGUgdGhlIGhvc3Qga2V5cyB3aXRoIHRoZQorICAgICBkZWZhdWx0IGtleSBmaWxlIHBhdGgsIGFuIGVtcHR5IHBhc3NwaHJhc2UsIGRlZmF1bHQgYml0cyBmb3IgdGhlIGtleQorICAgICB0eXBlLCBhbmQgZGVmYXVsdCBjb21tZW50LiAgVGhpcyB3aWxsIGJlIHVzZWQgYnkgL2V0Yy9yYyB0byBnZW5lcmF0ZQorICAgICBuZXcgaG9zdCBrZXlzLiAgSWRlYSBmcm9tIGRlcmFhZHQuCisgICAgIG9rIGRlcmFhZHQKKyAgIC0gc3RldmVza0BjdnMub3BlbmJzZC5vcmcgMjAxMS8wMy8yMyAxNjoyNDo1NgorICAgICBbc3NoLWtleWdlbi4xXQorICAgICAtcSBub3QgdXNlZCBpbiAvZXRjL3JjIG5vdyBzbyByZW1vdmUgc3RhdGVtZW50LgorICAgLSBzdGV2ZXNrQGN2cy5vcGVuYnNkLm9yZyAyMDExLzAzLzIzIDE2OjUwOjA0CisgICAgIFtzc2gta2V5Z2VuLmNdCisgICAgIHJlbW92ZSAtZCwgZG9jdW1lbnRhdGlvbiByZW1vdmVkID4xMCB5ZWFycyBhZ287IG9rIG1hcmt1cworICAgLSBqbWNAY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDMvMjQgMTU6Mjk6MzAKKyAgICAgW3NzaC1rZXlnZW4uMV0KKyAgICAgemFwIHRyYWlsaW5nIHdoaXRlc3BhY2U7CisgICAtIHN0ZXZlc2tAY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDMvMjQgMjI6MTQ6NTQKKyAgICAgW3NzaC1rZXlnZW4uY10KKyAgICAgdXNlIHN0cmNhc2VjbXAoKSBmb3IgImNsZWFyIiBjZXJ0IHBlcm1pc3Npb24gb3B0aW9uIGFsc287IG9rIGRqbQorICAgLSBzdGV2ZXNrQGN2cy5vcGVuYnNkLm9yZyAyMDExLzAzLzI5IDE4OjU0OjE3CisgICAgIFttaXNjLmMgbWlzYy5oIHNlcnZjb25mLmNdCisgICAgIHByaW50IGlwcW9zIGZyaWVuZGx5IHN0cmluZyBmb3Igc3NoZCAtVDsgb2sgbWFya3VzCisgICAgICMgc3NoZCAtVGYgc3NoZF9jb25maWd8Z3JlcCBpcHFvcworICAgICBpcHFvcyBsb3dkZWxheSB0aHJvdWdocHV0CisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNC8xMiAwNDoyMzo1MAorICAgICBbc3NoLWtleWdlbi5jXQorICAgICBmaXggLVdzaGFkb3cKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA0LzEyIDA1OjMyOjQ5CisgICAgIFtzc2hkLmNdCisgICAgIGV4aXQgd2l0aCAwIHN0YXR1cyBvbiBTSUdURVJNOyBieiMxODc5CisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNC8xMyAwNDowMjo0OAorICAgICBbc3NoLWtleWdlbi4xXQorICAgICBpbXByb3ZlIHdvcmRpbmc7IGJ6IzE4NjEKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA0LzEzIDA0OjA5OjM3CisgICAgIFtzc2gta2V5Z2VuLjFdCisgICAgIG1lbnRpb24gdmFsaWQgLWIgc2l6ZXMgZm9yIEVDRFNBIGtleXM7IGJ6IzE4NjIKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA0LzE3IDIyOjQyOjQyCisgICAgIFtQUk9UT0NPTC5tdXggY2xpZW50bG9vcC5jIGNsaWVudGxvb3AuaCBtdXguYyBzc2guMSBzc2guY10KKyAgICAgYWxsb3cgZ3JhY2VmdWwgc2h1dGRvd24gb2YgbXVsdGlwbGV4aW5nOiByZXF1ZXN0IHRoYXQgYSBtdXggc2VydmVyCisgICAgIHJlbW92ZXMgaXRzIGxpc3RlbmVyIHNvY2tldCBhbmQgcmVmdXNlIGZ1dHVyZSBtdWx0aXBsZXhpbmcgcmVxdWVzdHM7CisgICAgIG9rIG1hcmt1c0AKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA0LzE4IDAwOjQ2OjA1CisgICAgIFtzc2gta2V5Z2VuLmNdCisgICAgIGNlcnRpZmljYXRlIG9wdGlvbnMgYXJlIHN1cHBvc2VkIHRvIGJlIHBhY2tlZCBpbiBsZXhpY2FsIG9yZGVyIG9mCisgICAgIG9wdGlvbiBuYW1lICh0aG91Z2ggd2UgZG9uJ3QgYWN0dWFsbHkgZW5mb3JjZSB0aGlzIGF0IHByZXNlbnQpLgorICAgICBNb3ZlIG9uZSB1cCB0aGF0IHdhcyBvdXQgb2Ygc2VxdWVuY2UKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzA0IDIxOjE1OjI5CisgICAgIFthdXRoZmlsZS5jIGF1dGhmaWxlLmggc3NoLWFkZC5jXQorICAgICBhbGxvdyAic3NoLWFkZCAtIDwga2V5IjsgZmVlZGJhY2sgYW5kIG9rIG1hcmt1c0AKKyAtICh0aW0pIFtjb25maWd1cmUuYWNdIEFkZCBBQ19MQU5HX1NPVVJDRSB0byBPUEVOU1NIX0NIRUNLX0NGTEFHX0NPTVBJTEUKKyAgIHNvIGF1dG9yZWNvbmYgMi42OCBpcyBoYXBweS4KKyAtICh0aW0pIFtkZWZpbmVzLmhdIERlYWwgd2l0aCBwbGF0Zm9ybXMgdGhhdCBkbyBub3QgaGF2ZSBTX0lGU09DSyBvayBkam1ACisKKzIwMTEwMjIxCisgLSAoZHR1Y2tlcikgW2NvbnRyaWIvY3lnd2luL3NzaC1ob3N0LWNvbmZpZ10gRnJvbSBDb3Jpbm5hOiByZXZhbXAgb2YgdGhlCisgICBDeWd3aW4tc3BlY2lmaWMgc2VydmljZSBpbnN0YWxsZXIgc2NyaXB0IHNzaC1ob3N0LWNvbmZpZy4gIFRoZSBhY3R1YWwKKyAgIGZ1bmN0aW9uYWxpdHkgaXMgdGhlIHNhbWUsIHRoZSByZXZpc2l0ZWQgdmVyc2lvbiBpcyBqdXN0IG1vcmUKKyAgIGV4YWN0IHdoZW4gaXQgY29tZXMgdG8gY2hlY2sgZm9yIHByb2JsZW1zIHdoaWNoIGRpc2FsbG93IHRvIHJ1bgorICAgY2VydGFpbiBhc3BlY3RzIG9mIHRoZSBzY3JpcHQuICBTbywgcGFydCBvZiB0aGlzIHNjcmlwdCBhbmQgdGhlIGFsc28KKyAgIHJlYXJyYW5nZWQgc2VydmljZSBoZWxwZXIgc2NyaXB0IGxpYnJhcnkgImNzaWgiIGlzIHRvIGNoZWNrIGlmIGFsbAorICAgdGhlIHRvb2xzIHJlcXVpcmVkIHRvIHJ1biB0aGUgc2NyaXB0IGFyZSBhdmFpbGFibGUgb24gdGhlIHN5c3RlbS4KKyAgIFRoZSBuZXcgc2NyaXB0IGFsc28gaXMgbW9yZSB0aG9yb3VnaCB0byBpbmZvcm0gdGhlIHVzZXIgd2h5IHRoZQorICAgc2NyaXB0IGZhaWxlZC4gIFBhdGNoIGZyb20gdmluc2NoZW4gYXQgcmVkaGF0IGNvbS4KKworMjAxMTAyMTgKKyAtIE9wZW5CU0QgQ1ZTIFN5bmMKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzAyLzE2IDAwOjMxOjE0CisgICAgIFtzc2gta2V5c2lnbi5jXQorICAgICBtYWtlIGhvc3RiYXNlZCBhdXRoIHdpdGggRUNEU0Ega2V5cyB3b3JrIGNvcnJlY3RseS4gQmFzZWQgb24gcGF0Y2gKKyAgICAgYnkgaGFydmV5LmVuZW1hbiBBVCBvcmFjbGUuY29tIGluIGJ6IzE4NTg7IG9rIG1hcmt1c0AgKHByZS1sb2NrKQorCisyMDExMDIwNgorIC0gKGR0dWNrZXIpIFtvcGVuYnNkLWNvbXBhdC9wb3J0LWxpbnV4LmNdIEJ1ZyAjMTg1MTogZml4IHN5bnRheCBlcnJvciBpbgorICAgc2VsaW51eCBjb2RlLiAgUGF0Y2ggZnJvbSBMZW9uYXJkbyBDaGlxdWl0dG8gCisgLSAoZHR1Y2tlcikgW2NvbnRyaWIvY3lnd2luL3NzaC17aG9zdCx1c2VyfS1jb25maWddICBBZGQgRUNEU0Ega2V5CisgICBnZW5lcmF0aW9uIGFuZCBzaW1wbGlmeS4gIFBhdGNoIGZyb20gQ29yaW5uYSBWaW5zY2hlbi4KKworMjAxMTAyMDQKKyAtIE9wZW5CU0QgQ1ZTIFN5bmMKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzAxLzMxIDIxOjQyOjE1CisgICAgIFtQUk9UT0NPTC5tdXhdCisgICAgIGN1dCduJ3Bhc3RvOyBmcm9tIGJlcnQud2VzYXJnIEFUIGdvb2dsZW1haWwuY29tCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wMi8wNCAwMDo0NDoyMQorICAgICBba2V5LmNdCisgICAgIGZpeCB1bmluaXRpYWxpc2VkIG5vbmNlIHZhcmlhYmxlOyByZXBvcnRlZCBieSBNYXRldXN6IEtvY2llbHNraQorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDIvMDQgMDA6NDQ6NDMKKyAgICAgW3ZlcnNpb24uaF0KKyAgICAgb3BlbnNzaC01LjgKKyAtIChkam0pIFtSRUFETUUgY29udHJpYi9jYWxkZXJhL29wZW5zc2guc3BlYyBjb250cmliL3JlZGhhdC9vcGVuc3NoLnNwZWNdCisgICBbY29udHJpYi9zdXNlL29wZW5zc2guc3BlY10gdXBkYXRlIHZlcnNpb25zIGluIGRvY3MgYW5kIHNwZWMgZmlsZXMuCisgLSBSZWxlYXNlIE9wZW5TU0ggNS44cDEKKworMjAxMTAxMjgKKyAtIChkam0pIFtvcGVuYnNkLWNvbXBhdC9wb3J0LWxpbnV4LmNdIENoZWNrIHdoZXRoZXIgU0VMaW51eCBpcyBlbmFibGVkCisgICBiZWZvcmUgYXR0ZW1wdGluZyBzZXRmc2NyZWF0ZWNvbigpLiBDaGVjayB3aGV0aGVyIG1hdGNocGF0aGNvbigpCisgICBzdWNjZWVkZWQgYmVmb3JlIHVzaW5nIGl0cyByZXN1bHQuIFBhdGNoIGZyb20gY2p3YXRzb24gQVQgZGViaWFuLm9yZzsKKyAgIGJ6IzE4NTEKKworMjAxMTAxMjcKKyAtICh0aW0pIFtjb25maWcuZ3Vlc3MgY29uZmlnLnN1Yl0gU3luYyB3aXRoIHVwc3RyZWFtLgorIC0gKHRpbSkgW2NvbmZpZ3VyZS5hY10gQ29uc2lzdGVudCBNNCBxdW90aW5nIHRocm91Z2hvdXQsIHVwZGF0ZWQgb2Jzb2xldGUKKyAgIEFDX1RSWV9DT01QSUxFIHdpdGggQUNfQ09NUElMRV9JRkVMU0UsIHVwZGF0ZWQgb2Jzb2xldGUgQUNfVFJZX0xJTksgd2l0aAorICAgQUNfTElOS19JRkVMU0UsIHVwZGF0ZWQgb2Jzb2xldGUgQUNfVFJZX1JVTiB3aXRoIEFDX1JVTl9JRkVMU0UsIG1pc2Mgd2hpdGUKKyAgIHNwYWNlIGNoYW5nZXMgZm9yIGNvbnNpc3RlbmN5L3JlYWRhYmlsaXR5LiBNYWtlcyBhdXRvY29uZiAyLjY4IGhhcHB5LgorICAgIk5pY2Ugd29yayIgZGptCisKKzIwMTEwMTI1CisgLSAoZGptKSBbY29uZmlndXJlLmFjIE1ha2VmaWxlLmluIHNzaC5jIG9wZW5ic2QtY29tcGF0L3BvcnQtbGludXguYworICAgb3BlbmJzZC1jb21wYXQvcG9ydC1saW51eC5oXSBNb3ZlIFNFTGludXgtc3BlY2lmaWMgY29kZSBmcm9tIHNzaC5jIHRvCisgICBwb3J0LWxpbnV4LmMgdG8gYXZvaWQgY29tcGlsYXRpb24gZXJyb3JzLiBBZGQgLWxzZWxpbnV4IHRvIHNzaCB3aGVuCisgICBidWlsZGluZyB3aXRoIFNFTGludXggc3VwcG9ydCB0byBhdm9pZCBsaW5raW5nIGZhaWx1cmU7IHJlcG9ydCBmcm9tCisgICBhbWsgQVQgc3BhbWZlbmNlLm5ldDsgb2sgZHR1Y2tlcgorCisyMDExMDEyMgorIC0gKGR0dWNrZXIpIFtjb25maWd1cmUuYWMgb3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQue2MsaH1dIEFkZAorICAgUlNBX2dldF9kZWZhdWx0X21ldGhvZCgpIGZvciB0aGUgYmVuZWZpdCBvZiBvcGVuc3NsIHZlcnNpb25zIHRoYXQgZG9uJ3QKKyAgIGhhdmUgaXQgKGF0IGxlYXN0IG9wZW5zc2wtZW5naW5lLTAuOS42YikuICBGb3VuZCBhbmQgdGVzdGVkIGJ5IEtldmluIEJyb3R0LAorICAgb2sgZGptQC4KKyAtIE9wZW5CU0QgQ1ZTIFN5bmMKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzAxLzIyIDA5OjE4OjUzCisgICAgIFt2ZXJzaW9uLmhdCisgICAgIGNyYW5rIHRvIE9wZW5TU0gtNS43CisgLSAoZGptKSBbUkVBRE1FIGNvbnRyaWIvY2FsZGVyYS9vcGVuc3NoLnNwZWMgY29udHJpYi9yZWRoYXQvb3BlbnNzaC5zcGVjXQorICAgW2NvbnRyaWIvc3VzZS9vcGVuc3NoLnNwZWNdIHVwZGF0ZSB2ZXJzaW9ucyBpbiBkb2NzIGFuZCBzcGVjIGZpbGVzLgorIC0gKGRqbSkgUmVsZWFzZSA1LjdwMQorCisyMDExMDExOQorIC0gKHRpbSkgW2NvbnRyaWIvY2FsZGVyYS9vcGVuc3NoLnNwZWNdIFVzZSBDRkxBR1MgZnJvbSBNYWtlZmlsZSBpbnN0ZWFkCisgICBvZiBSUE0gc28gYnVpbGQgY29tcGxldGVzLiBTaWduYXR1cmVzIHdlcmUgY2hhbmdlZCB0byAuYXNjIHNpbmNlIDQuMXAxLgorIC0gKGRqbSkgW2NvbmZpZ3VyZS5hY10gRGlzYWJsZSBFQ0Mgb24gT3BlblNTTCA8MC45LjhnLiBSZWxlYXNlcyBwcmlvciB0bworICAgMC45LjggbGFja2VkIGl0LCBhbmQgMC45LjhhIHRocm91Z2ggMC45LjhkIGhhdmUgcHJvdmVuIGJ1Z2d5IGluIHByZS0KKyAgIHJlbGVhc2UgdGVzdGluZyAocmFuZG9tIGNyYXNoZXMgYW5kIGZhaWx1cmUgdG8gbG9hZCBFQ0Mga2V5cykuCisgICBvayBkdHVja2VyQAorCisyMDExMDExNworIC0gKGRqbSkgW3JlZ3Jlc3MvTWFrZWZpbGVdIHVzZSAkVEVTVF9TU0hfS0VZR0VOIGluc3RlYWQgb2YgdGhlIG9uZSBpbgorICAgJFBBVEgsIGZpeCBjbGVhbnVwIG9mIGRyb3BwaW5nczsgcmVwb3J0ZWQgYnkgb3BlbnNzaCBBVAorICAgcm91bWVucGV0cm92LmluZm87IG9rIGR0dWNrZXJACisgLSAoZGptKSBbcmVncmVzcy9hZ2VudC1wdHJhY2Uuc2hdIEZpeCBmYWxzZSBmYWlsdXJlIG9uIE9TIFggYnkgYWRkaW5nCisgICBpdHMgdW5pcXVlIHNub3dmbGFrZSBvZiBhIGdkYiBlcnJvciB0byB0aGUgb25lcyB3ZSBsb29rIGZvci4KKyAtIChkam0pIFtyZWdyZXNzL2FnZW50LWdldHBlZXJlaWQuc2hdIGxlYXZlIHN0ZG91dCBhdHRhY2hlZCB3aGVuIHJ1bm5pbmcKKyAgIHNzaC1hZGQgdG8gYXZvaWQgJFNVRE8gZmFpbHVyZXMgb24gTGludXgKKyAtIChkdHVja2VyKSBbb3BlbmJzZC1jb21wYXQvcG9ydC1saW51eC5jXSBCdWcgIzE4Mzg6IEFkZCBzdXBwb3J0IGZvciB0aGUgbmV3CisgICBMaW51eCBPT00ta2lsbGVyIG1hZ2ljIHZhbHVlcyB0aGF0IGNoYW5nZWQgaW4gMi42LjM2IGtlcm5lbHMsIHdpdGggZmFsbGJhY2sKKyAgIHRvIHRoZSBvbGQgdmFsdWVzLiAgRmVlZGJhY2sgZnJvbSB2YXBpZXIgYXQgZ2VudG9vIG9yZyBhbmQgZGptLCBvayBkam0uCisgLSAoZGptKSBbY29uZmlndXJlLmFjIHJlZ3Jlc3MvYWdlbnQtZ2V0cGVlcmVpZC5zaCByZWdyZXNzL211bHRpcGxleC5zaF0KKyAgIFtyZWdyZXNzL3NmdHAtZ2xvYi5zaCByZWdyZXNzL3Rlc3QtZXhlYy5zaF0gUmV3b3JrIGhvdyBmZWF0dXJlIHRlc3RzIGFyZQorICAgZGlzYWJsZWQgb24gcGxhdGZvcm1zIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlbTsgYWRkIGEgImNvbmZpZ19kZWZpbmVkKCkiCisgICBzaGVsbCBmdW5jdGlvbiB0aGF0IGdyZXBzIGZvciBkZWZpbmVzIGluIGNvbmZpZy5oIGFuZCB1c2UgdGhlbSB0byBkZWNpZGUKKyAgIG9uIGZlYXR1cmUgdGVzdHMuCisgICBDb252ZXJ0IGEgY291cGxlIG9mIGV4aXN0aW5nIGdyZXAncyBvdmVyIGNvbmZpZy5oIHRvIHVzZSB0aGUgbmV3IGZ1bmN0aW9uCisgICBBZGQgYSBkZWZpbmUgIkZJTEVTWVNURU1fTk9fQkFDS1NMQVNIIiBmb3IgZmlsZXN5c3RlbSB0aGF0IGNhbid0IHJlcHJlc2VudAorICAgYmFja3NsYXNoIGNoYXJhY3RlcnMgaW4gZmlsZW5hbWVzLCBlbmFibGUgaXQgZm9yIEN5Z3dpbiBhbmQgdXNlIGl0IHRvIHR1cm4KKyAgIG9mIHRlc3RzIGZvciBxdW90ZXMgYmFja3NsYXNoZXMgaW4gc2Z0cC1nbG9iLnNoLgorICAgYmFzZWQgb24gZGlzY3Vzc2lvbiB3aXRoIHZpbnNjaGVuIEFUIHJlZGhhdC5jb20gYW5kIGR0dWNrZXJAOyBvayBkdHVja2VyQAorIC0gKHRpbSkgW3JlZ3Jlc3MvYWdlbnQtZ2V0cGVlcmVpZC5zaF0gc2hlbGwgcG9ydGFiaWxpdHkgZml4LgorIC0gKGR0dWNrZXIpIFtvcGVuYnNkLWNvbXBhdC9wb3J0LWxpbnV4LmNdIEZpeCBtaW5vciBidWcgY2F1Z2h0IGJ5IC1XZXJyb3Igb24KKyAgIHRoZSB0aW5kZXJib3guCisgLSAoZHR1Y2tlcikgW0xJQ0VOQ0UgTWFrZWZpbGUuaW4gYXVkaXQtYnNtLmMgYXVkaXQtbGludXguYyBhdWRpdC5jIGF1ZGl0LmgKKyAgIGNvbmZpZ3VyZS5hYyBkZWZpbmVzLmggbG9naW5yZWMuY10gIEJ1ZyAjMTQwMjogYWRkIGxpbnV4IGF1ZGl0IHN1YnN5c3RlbQorICAgc3VwcG9ydCwgYmFzZWQgb24gcGF0Y2hlcyBmcm9tIFRvbWFzIE1yYXogYW5kIGpjaGFkaW1hIGF0IHJlZGhhdC4KKworMjAxMTAxMTYKKyAtIChkdHVja2VyKSBbTWFrZWZpbGUuaW4gY29uZmlndXJlLmFjIHJlZ3Jlc3Mva2V4dHlwZS5zaF0gU2tpcCBzaGEyNTYtYmFzZWQKKyAgIG9uIGNvbmZpZ3VyYXRpb25zIHRoYXQgZG9uJ3QgaGF2ZSBpdC4KKyAtIE9wZW5CU0QgQ1ZTIFN5bmMKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzAxLzE2IDExOjUwOjA1CisgICAgIFtjbGllbnRsb29wLmNdCisgICAgIFVzZSBhdG9taWNpbyB3aGVuIGZsdXNoaW5nIHByb3RvY29sIDEgc3Rke291dCxlcnJ9IGJ1ZmZlcnMgYXQKKyAgICAgc2Vzc2lvbiBjbG9zZS4gVGhpcyB3YXMgYSBsYXRlbnQgYnVnIGV4cG9zZWQgYnkgc2V0dGluZyBhIFNJR0NITEQKKyAgICAgaGFuZGxlciBhbmQgc3BvdHRlZCBieSBrZXZpbi5icm90dCBBVCBnbWFpbC5jb207IG9rIGR0dWNrZXJACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wMS8xNiAxMTo1MDozNgorICAgICBbc3NoY29ubmVjdC5jXQorICAgICByZXNldCB0aGUgU0lHUElQRSBoYW5kbGVyIHdoZW4gZm9ya2luZyB0byBleGVjdXRlIGNoaWxkIHByb2Nlc3NlczsKKyAgICAgb2sgZHR1Y2tlckAKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzAxLzE2IDEyOjA1OjU5CisgICAgIFtjbGllbnRsb29wLmNdCisgICAgIGEgY291cGxlIG1vcmUgdHdlYWtzIHRvIHRoZSBwb3N0LWNsb3NlIHByb3RvY29sIDEgc3RkZXJyL3N0ZG91dCBmbHVzaDoKKyAgICAgbm93IHRoYXQgd2UgdXNlIGF0b21pY2lvKCksIGNvbnZlcnQgdGhlbSBmcm9tIHdoaWxlIGxvb3BzIHRvIGlmIHN0YXRlbWVudHMKKyAgICAgYWRkIHRlc3QgYW5kIGNhc3QgdG8gY29tcGlsZSBjbGVhbmx5IHdpdGggLVdzaWduZWQKKworMjAxMTAxMTQKKyAtIE9wZW5CU0QgQ1ZTIFN5bmMKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzAxLzEzIDIxOjU0OjUzCisgICAgIFttdXguY10KKyAgICAgY29ycmVjdCBlcnJvciBtZXNzYWdlczsgcGF0Y2ggZnJvbSBiZXJ0Lndlc2FyZyBBVCBnb29nbGVtYWlsLmNvbQorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDEvMTMgMjE6NTU6MjUKKyAgICAgW1BST1RPQ09MLm11eF0KKyAgICAgY29ycmVjdCBwcm90b2NvbCBuYW1lcyBhbmQgYWRkIGEgY291cGxlIG9mIG1pc3NpbmcgcHJvdG9jb2wgbnVtYmVyCisgICAgIGRlZmluZXM7IHBhdGNoIGZyb20gYmVydC53ZXNhcmcgQVQgZ29vZ2xlbWFpbC5jb20KKyAtIChkam0pIFtNYWtlZmlsZS5pbl0gVXNlIHNoZWxsIHRlc3QgdG8gZGlzYWJsZSBlY2RzYSBrZXkgZ2VuZXJhdGluZyBpbgorICAgaG9zdC1rZXktZm9yY2UgdGFyZ2V0IHJhdGhlciB0aGFuIGEgc3Vic3RpdHV0aW9uIHRoYXQgaXMgcmVwbGFjZWQgd2l0aCBhCisgICBjb21tZW50IHNvIHRoYXQgdGhlIE1ha2VmaWxlLmluIGlzIHN0aWxsIGEgc3ludGFjdGljYWxseSB2YWxpZCBNYWtlZmlsZQorICAgKHVzZWZ1bCB0byBydW4gdGhlIGRpc3RwcmVwIHRhcmdldCkKKyAtICh0aW0pIFtyZWdyZXNzL2NlcnQtaG9zdGtleS5zaF0gVHlwby4gTWlzc2luZyAkIG9uIHZhcmlhYmxlIG5hbWUuCisgLSAodGltKSBbcmVncmVzcy9jZXJ0LWhvc3RrZXkuc2hdIEFkZCBtaXNzaW5nIFRFU1RfU1NIX0VDQyBndWFyZCBhcm91bmQgc29tZQorICAgZWNkc2EgYml0cy4KKworMjAxMTAxMTMKKyAtIChkam0pIFttaXNjLmNdIGluY2x1ZGUgdGltZS5oIGZvciBuYW5vc2xlZXAoKSBwcm90b3R5cGUKKyAtICh0aW0pIFtNYWtlZmlsZS5pbl0gdGVzdCB0aGUgRUNDIGJpdHMgaWYgd2UgaGF2ZSB0aGUgY2FwYWJpbGl0eS4gb2sgZGptCisgLSAodGltKSBbTWFrZWZpbGUuaW4gY29uZmlndXJlLmFjIG9wZW5zc2hkLmluaXQuaW5dIEFkZCBzdXBwb3J0IGZvciBnZW5lcmF0aW5nCisgICBlY2RzYSBrZXlzLiBvayBkam0uCisgLSAoZGptKSBbZW50cm9weS5jXSBjYXN0IE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgdG8gdV9sb25nIHRvIGF2b2lkCisgICBnY2Mgd2FybmluZyBvbiBwbGF0Zm9ybXMgd2hlcmUgaXQgZGVmYXVsdHMgdG8gaW50CisgLSAoZGptKSBbcmVncmVzcy9NYWtlZmlsZV0gYWRkIGEgZmV3IG1vcmUgZ2VuZXJhdGVkIGZpbGVzIHRvIHRoZSBjbGVhbgorICAgdGFyZ2V0CisgLSAoZGptKSBbbXlwcm9wb3NhbC5oXSBGaXggcmV2ZXJzZWQgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiB0ZXN0IGFuZCBiYWQKKyAgICNkZWZpbmUgdGhhdCB3YXMgY2F1c2luZyBkaWZmaWUtaGVsbG1hbi1ncm91cC1leGNoYW5nZS1zaGEyNTYgdG8gYmUKKyAgIGluY29ycmVjdGx5IGRpc2FibGVkCisgLSAoZGptKSBbcmVncmVzcy9rZXh0eXBlLnNoXSBUZXN0aW5nIGRpZmZpZS1oZWxsbWFuLWdyb3VwLWV4Y2hhbmdlLXNoYTI1NgorICAgc2hvdWxkIG5vdCBkZXBlbmQgb24gRUNDIHN1cHBvcnQKKworMjAxMTAxMTIKKyAtIE9wZW5CU0QgQ1ZTIFN5bmMKKyAgIC0gbmljbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8xMC8wOCAyMTo0ODo0MgorICAgICBbb3BlbmJzZC1jb21wYXQvZ2xvYi5jXQorICAgICBFeHRlbmQgR0xPQl9MSU1JVCB0byBjb3ZlciByZWFkZGlyIGFuZCBzdGF0IGFuZCBidW1wIHRoZSBtYWxsb2MgbGltaXQKKyAgICAgZnJvbSBBUkdfTUFYIHRvIDY0Sy4KKyAgICAgRml4ZXMgZ2xvYi11c2luZyBwcm9ncmFtcyAobm90YWJseSBmdHApIGFibGUgdG8gYmUgdHJpZ2dlcmVkIHRvIGhpdAorICAgICByZXNvdXJjZSBsaW1pdHMuCisgICAgIElkZWEgZnJvbSBhIHNpbWlsYXIgTmV0QlNEIGNoYW5nZSwgb3JpZ2luYWwgcHJvYmxlbSByZXBvcnRlZCBieSBqYXNwZXJALgorICAgICBvayBtaWxsZXJ0IHRlZHUgamFzcGVyCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wMS8xMiAwMTo1MzoxNAorICAgICBhdm9pZCBzb21lIGludGVnZXIgb3ZlcmZsb3dzIG1vc3RseSB3aXRoIEdMT0JfQVBQRU5EIGFuZCBHTE9CX0RPT0ZGUworICAgICBhbmQgc2FuaXR5IGNoZWNrIGFyZ3VtZW50cyAodGhlc2Ugd2lsbCBiZSB1bm5lY2Vzc2FyeSB3aGVuIHdlIHN3aXRjaAorICAgICBzdHJ1Y3QgZ2xvYiBtZW1iZXJzIGZyb20gYmVpbmcgdHlwZSBpbnRvIHRvIHNpemVfdCBpbiB0aGUgZnV0dXJlKTsKKyAgICAgImxvb2tzIG9rIiB0ZWR1QCBmZWVkYmFjayBndWVudGhlckAKKyAtIChkam0pIFtjb25maWd1cmUuYWNdIFR1cm4gb24gLVduby11bnVzZWQtcmVzdWx0IGZvciBnY2MgPj0gNC40IHRvIGF2b2lkCisgICBzaWxseSB3YXJuaW5ncyBvbiB3cml0ZSgpIGNhbGxzIHdlIGRvbid0IGNhcmUgc3VjY2VlZCBvciBub3QuCisgLSAoZGptKSBbY29uZmlndXJlLmFjXSBGaXggYnJva2VuIHRlc3QgZm9yIGdjYyA+PSA0LjQgd2l0aCBwZXItY29tcGlsZXIKKyAgIGZsYWcgdGVzdHMgdGhhdCBkb24ndCBkZXBlbmQgb24gZ2NjIHZlcnNpb24gYXQgYWxsOyBzdWdnZXN0ZWQgYnkgYW5kCisgICBvayBkdHVja2VyQAorCisyMDExMDExMQorIC0gKHRpbSkgW3JlZ3Jlc3MvaG9zdC1leHBhbmQuc2hdIEZpeCBmb3IgYnVpbGRpbmcgb3V0c2lkZSBvZiByZWFkIG9ubHkKKyAgIHNvdXJjZSB0cmVlLgorIC0gKGRqbSkgW3BsYXRmb3JtLmNdIFNvbWUgbWlzc2luZyBpbmNsdWRlcyB0aGF0IHNob3cgdXAgdW5kZXIgLVdlcnJvcgorIC0gT3BlbkJTRCBDVlMgU3luYworICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDEvMDggMTA6NTE6NTEKKyAgICAgW2NsaWVudGxvb3AuY10KKyAgICAgdXNlIGhvc3QgYW5kIG5vdCBvcHRpb25zLmhvc3RuYW1lLCBhcyB0aGUgbGF0dGVyIG1heSBoYXZlIHVuZXNjYXBlZAorICAgICBzdWJzdGl0dXRpb24gY2hhcmFjdGVycworICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDEvMTEgMDY6MDY6MDkKKyAgICAgW3NzaGxvZ2luLmNdCisgICAgIGZkIGxlYWsgb24gZXJyb3IgcGF0aHM7IGZyb20gemlub3Zpa0AKKyAgICAgTkIuIElkIHN5bmMgb25seTsgd2UgdXNlIGxvZ2lucmVjLmMgdGhhdCB3YXMgYWxzbyBhdWRpdGVkIGFuZCBmaXhlZAorICAgICByZWNlbnRseQorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDEvMTEgMDY6MTM6MTAKKyAgICAgW2NsaWVudGxvb3AuYyBzc2gta2V5Z2VuLmMgc3NoZC5jXQorICAgICBzb21lIHVuc2lnbmVkIGxvbmcgbG9uZyBjYXN0cyB0aGF0IG1ha2UgdGhpbmdzIGEgYml0IGVhc2llciBmb3IKKyAgICAgcG9ydGFibGUgd2l0aG91dCByZXNvcnRpbmcgdG8gZHJvcHBpbmcgUFJJdTY0IGZvcm1hdHMgZXZlcnl3aGVyZQorCisyMDExMDEwOQorIC0gKGRqbSkgW01ha2VmaWxlLmluXSBsaXN0IHNzaF9ob3N0X2VjZHNhIGtleSBpbiBQQVRIU1VCUzsgc3BvdHRlZCBieQorICAgb3BlbnNzaCBBVCByb3VtZW5wZXRyb3YuaW5mbworCisyMDExMDEwOAorIC0gKGRqbSkgW3JlZ3Jlc3Mva2V5dHlwZS5zaF0gcy9lY2hvIC1uL2VjaG9uLyB0byByZXBhaXIgZmFpbGluZyByZWdyZXNzCisgICB0ZXN0IG9uIE9TWCBhbmQgb3RoZXJzLiBSZXBvcnRlZCBieSBpbW9yZ2FuIEFUIG5hcy5uYXNhLmdvdgorCisyMDExMDEwNworIC0gKGRqbSkgW3JlZ3Jlc3MvY2VydC1ob3N0a2V5LnNoIHJlZ3Jlc3MvY2VydC11c2Vya2V5LnNoXSBmaXggc2hlbGwgdGVzdAorICAgZm9yIG5vLUVDQyBjYXNlLiBQYXRjaCBmcm9tIGNyaXN0aWFuLmlvbmVzY3UtaWRib2hybiBBVCBheGlzLmNvbQorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDEvMDYgMjI6MjM6NTMKKyAgICAgW3NzaC5jXQorICAgICB1bmJyZWFrICVuIGV4cGFuc2lvbiBpbiBMb2NhbENvbW1hbmQ7IHBhdGNoIGZyb20gYmVydC53ZXNhcmcgQVQKKyAgICAgZ29vZ2xlbWFpbC5jb207IG9rIG1hcmt1c0AKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzAxLzA2IDIyOjIzOjAyCisgICAgIFtjbGllbnRsb29wLmNdCisgICAgIHdoZW4gZXhpdGluZyBkdWUgdG8gU2VydmVyQWxpdmVUaW1lb3V0LCBtZW50aW9uIHRoZSBob3N0bmFtZSB0aGF0IGNhdXNlZAorICAgICBpdCAodXNlZnVsIHdpdGggYmFja2dyb3VuZGVkIGNvbnRyb2xtYXN0ZXIpCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wMS8wNiAyMjo0NjoyMQorICAgICBbcmVncmVzcy9NYWtlZmlsZSByZWdyZXNzL2hvc3QtZXhwYW5kLnNoXQorICAgICByZWdyZXNzIHRlc3QgZm9yIExvY2FsQ29tbWFuZCAlbiBleHBhbnNpb24gZnJvbSBiZXJ0Lndlc2FyZyBBVAorICAgICBnb29nbGVtYWlsLmNvbTsgb2sgbWFya3VzQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDEvMDYgMjM6MDE6MzUKKyAgICAgW3NzaGNvbm5lY3QuY10KKyAgICAgcmVzZXQgU0lHQ0hMRCBoYW5kbGVyIHRvIFNJR19ERkwgd2hlbiBleGVjdXJpbmcgTG9jYWxDb21tYW5kOworICAgICBvayBtYXJrdXNACisKKzIwMTEwMTA2CisgLSAoZGptKSBPcGVuQlNEIENWUyBTeW5jCisgICAtIG1hcmt1c0BjdnMub3BlbmJzZC5vcmcgMjAxMC8xMi8wOCAyMjo0NjowMworICAgICBbc2NwLjEgc2NwLmNdCisgICAgIGFkZCBhIG5ldyAtMyBvcHRpb24gdG8gc2NwOiBDb3BpZXMgYmV0d2VlbiB0d28gcmVtb3RlIGhvc3RzIGFyZQorICAgICB0cmFuc2ZlcnJlZCB0aHJvdWdoIHRoZSBsb2NhbCBob3N0LiAgV2l0aG91dCB0aGlzIG9wdGlvbiB0aGUgZGF0YQorICAgICBpcyBjb3BpZWQgZGlyZWN0bHkgYmV0d2VlbiB0aGUgdHdvIHJlbW90ZSBob3N0cy4gb2sgZGptQCAoYnVnemlsbGEgIzE4MzcpCisgICAtIGptY0BjdnMub3BlbmJzZC5vcmcgMjAxMC8xMi8wOSAxNDoxMzozMworICAgICBbc2NwLjEgc2NwLmNdCisgICAgIHNjcC4xOiBncmFtbWVyIGZpeAorICAgICBzY3AuYzogYWRkIC0zIHRvIHVzYWdlKCkKKyAgIC0gbWFya3VzQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzEyLzE0IDExOjU5OjA2CisgICAgIFtzc2hjb25uZWN0LmNdCisgICAgIGRvbid0IG1lbnRpb24ga2V5IHR5cGUgaW4ga2V5LWNoYW5nZWQtd2FybmluZywgc2luY2Ugd2UgYWxzbyBwcmludAorICAgICB0aGlzIHdhcm5pbmcgaWYgYSBuZXcga2V5IHR5cGUgYXBwZWFycy4gb2sgZGptQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTIvMTUgMDA6NDk6MjcKKyAgICAgW3JlYWRwYXNzLmNdCisgICAgIGZpeCBDb250cm9sTWFzdGVyPWFzayByZWdyZXNzaW9uCisgICAgIHJlc2V0IFNJR0NITEQgaGFuZGxlciBiZWZvcmUgZm9yayAoYW5kIHJlc3RvcmUgaXQgYWZ0ZXIpIHNvIHdlIGRvbid0IG1pc3MKKyAgICAgdGhlIHRoZSBhc2twYXNzIGNoaWxkJ3MgZXhpdCBzdGF0dXMuIENvcnJlY3QgdGVzdCBmb3IgZXhpdCBzdGF0dXMvc2lnbmFsIHRvCisgICAgIGFjY291bnQgZm9yIHdhaXRwaWQoKSBmYWlsdXJlOyB3aXRoIGNsYXVkaW9AIG9rIGNsYXVkaW9AIG1hcmt1c0AKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzEyLzI0IDIxOjQxOjQ4CisgICAgIFthdXRoLW9wdGlvbnMuY10KKyAgICAgZG9uJ3Qgc2VuZCB0aGUgYWN0dWFsIGZvcmNlZCBjb21tYW5kIGluIGEgZGVidWcgbWVzc2FnZTsgb2sgbWFya3VzIGRlcmFhZHQKKyAgIC0gb3R0b0BjdnMub3BlbmJzZC5vcmcgMjAxMS8wMS8wNCAyMDo0NDoxMworICAgICBbc3NoLWtleXNjYW4uY10KKyAgICAgaGFuZGxlIGVjZHNhLXNoYTIgd2l0aCB2YXJpb3VzIGtleSBsZW5ndGhzOyBoaW50IGFuZCBvayBkam1ACisKKzIwMTEwMTA0CisgLSAoZGptKSBbY29uZmlndXJlLmFjIE1ha2VmaWxlLmluXSBVc2UgbWFuZG9jIGFzIHByZWZlcnJlZCBtYW5wYWdlCisgICBmb3JtYXR0ZXIgaWYgaXQgaXMgcHJlc2VudCwgZm9sbG93ZWQgYnkgbnJvZmYgYW5kIGdyb2ZmIHJlc3BlY3RpdmVseS4KKyAgIEZpeGVzIGRpc3RwcmVwIHRhcmdldCBvbiBPcGVuQlNEICh3aGljaCBoYXMgYnVtcGVkIGdyb2ZmL25yb2ZmIHRvIHBvcnRzCisgICBpbiBmYXZvdXIgb2YgbWFuZG9jKS4gZmVlZGJhY2sgYW5kIG9rIHRpbQorCisyMDExMDEwMworIC0gKGRqbSkgW01ha2VmaWxlLmluXSByZXZlcnQgbG9jYWwgaGFjayBJIGRpZG4ndCBpbnRlbmQgdG8gY29tbWl0CisKKzIwMTEwMTAyCisgLSAoZGptKSBbbG9naW5yZWMuY10gRml4IHNvbWUgZmQgbGVha3Mgb24gZXJyb3IgcGF0aHMuIG9rIGR0dWNrZXIKKyAtIChkam0pIFtjb25maWd1cmUuYWNdIENoZWNrIHdoZXRoZXIgbGliZGVzIGlzIG5lZWRlZCB3aGVuIGJ1aWxkaW5nCisgICB3aXRoIEhlaW1kYWwga3JiNSBzdXBwb3J0LiBPbiBPcGVuQlNEIHRoaXMgbGlicmFyeSBubyBsb25nZXIgZXhpc3RzLAorICAgc28gbGlua2luZyBpdCB1bmNvbmRpdGlvbmFsbHkgY2F1c2VzIGEgYnVpbGQgZmFpbHVyZTsgb2sgZHR1Y2tlcgorCisyMDEwMTIyNgorIC0gKGR0dWNrZXIpIE9wZW5CU0QgQ1ZTIFN5bmMKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzEyLzA4IDA0OjAyOjQ3CisgICAgIFtzc2hfY29uZmlnLjUgc3NoZF9jb25maWcuNV0KKyAgICAgZXhwbGFpbiB0aGF0IElQUW9TIGFyZ3VtZW50cyBhcmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2U7IGlpcmMgcmVxdWVzdGVkCisgICAgIGJ5IGptY0AgYSB3aGlsZSBiYWNrCisKKzIwMTAxMjA1CisgLSAoZHR1Y2tlcikgb3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQuY10gcmVtb3ZlIHNsZWVwIGxlZnRvdmVyIGZyb20KKyAgIGRlYnVnZ2luZy4gIFNwb3R0ZWQgYnkgZGptLgorIC0gKGR0dWNrZXIpIE9wZW5CU0QgQ1ZTIFN5bmMKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzEyLzAzIDIzOjQ5OjI2CisgICAgIFtzY2hub3JyLmNdCisgICAgIGNoZWNrIHRoYXQgZ154XnEgPT09IDEgbW9kIHA7IHJlY29tbWVuZGVkIGJ5IEpQQUtFIGF1dGhvciBGZW5nIEhhbworICAgICAodGhpcyBjb2RlIGlzIHN0aWxsIGRpc2FibGVkLCBidXQgYXBwcmVudGx5IHBlb3BsZSBhcmUgdHJlYXRpbmcgaXQgYXMKKyAgICAgYSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24pCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8xMi8wMyAyMzo1NToyNworICAgICBbYXV0aC1yc2EuY10KKyAgICAgbW92ZSBjaGVjayBmb3IgcmV2b2tlZCBrZXlzIHRvIHJ1biBlYXJsaWVyIChpbiBhdXRoX3JzYV9rZXlfYWxsb3dlZCkKKyAgICAgYnojMTgyOTsgcGF0Y2ggZnJvbSBsZHYgQVQgYWx0bGludXgub3JnOyBvayBtYXJrdXNACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8xMi8wNCAwMDoxODowMQorICAgICBbc2Z0cC1zZXJ2ZXIuYyBzZnRwLjEgc2Z0cC1jbGllbnQuaCBzZnRwLmMgUFJPVE9DT0wgc2Z0cC1jbGllbnQuY10KKyAgICAgYWRkIGEgcHJvdG9jb2wgZXh0ZW5zaW9uIHRvIHN1cHBvcnQgYSBoYXJkIGxpbmsgb3BlcmF0aW9uLiBJdCBpcworICAgICBhdmFpbGFibGUgdGhyb3VnaCB0aGUgImxuIiBjb21tYW5kIGluIHRoZSBjbGllbnQuIFRoZSBvbGQgImxuIgorICAgICBiZWhhdmlvdXIgb2YgY3JlYXRpbmcgYSBzeW1saW5rIGlzIGF2YWlsYWJsZSB1c2luZyBpdHMgIi1zIiBvcHRpb24KKyAgICAgb3IgdGhyb3VnaCB0aGUgcHJlZXhpc3RpbmcgInN5bWxpbmsiIGNvbW1hbmQ7IGJhc2VkIG9uIGEgcGF0Y2ggZnJvbQorICAgICBtaWtsb3MgQVQgc3plcmVkaS5odSBpbiBieiMxNTU1OyBvayBtYXJrdXNACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8xMi8wNCAxMzozMTozNworICAgICBbaG9zdGZpbGUuY10KKyAgICAgZml4IGZkIGxlYWs7IHNwb3R0ZWQgYW5kIG9rIGR0dWNrZXIKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzEyLzA0IDAwOjIxOjE5CisgICAgIFtyZWdyZXNzL3NmdHAtY21kcy5zaF0KKyAgICAgYWRqdXN0IGZvciBoYXJkLWxpbmsgc3VwcG9ydAorIC0gKGR0dWNrZXIpIFtyZWdyZXNzL01ha2VmaWxlXSBJZCBzeW5jLgorCisyMDEwMTIwNAorIC0gKGRqbSkgW29wZW5ic2QtY29tcGF0L2JpbmRyZXN2cG9ydC5jXSBVc2UgYXJjNHJhbmRvbV91bmlmb3JtKHJhbmdlKQorICAgaW5zdGVhZCBvZiAoYXJjNHJhbmRvbSgpICUgcmFuZ2UpCisgLSAoZHR1Y2tlcikgW2NvbmZpZ3VyZS5hYyBtb2R1bGkuYyBvcGVuYnNkLWNvbXBhdC9vcGVuc3NsLWNvbXBhdC57YyxofV0gIEFkZAorICAgc2hpbXMgZm9yIHRoZSBuZXcsIG5vbi1kZXByZWNhdGVkIE9wZW5TU0wga2V5IGdlbmVyYXRpb24gZnVuY3Rpb25zIGZvcgorICAgcGxhdGZvcm1zIHRoYXQgZG9uJ3QgaGF2ZSB0aGUgbmV3IGludGVyZmFjZXMuCisKKzIwMTAxMjAxCisgLSBPcGVuQlNEIENWUyBTeW5jCisgICAtIGRlcmFhZHRAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTEvMjAgMDU6MTI6MzgKKyAgICAgW2F1dGgyLXB1YmtleS5jXQorICAgICBjbGVhbiB1cCBjYXNlcyBvZiA7OworICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTEvMjEgMDE6MDE6MTMKKyAgICAgW2NsaWVudGxvb3AuYyBtaXNjLmMgbWlzYy5oIHNzaC1hZ2VudC4xIHNzaC1hZ2VudC5jXQorICAgICBob25vdXIgJFRNUERJUiBmb3IgY2xpZW50IHhhdXRoIGFuZCBzc2gtYWdlbnQgdGVtcG9yYXJ5IGRpcmVjdG9yaWVzOworICAgICBmZWVkYmFjayBhbmQgb2sgbWFya3VzQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTEvMjEgMTA6NTc6MDcKKyAgICAgW2F1dGhmaWxlLmNdCisgICAgIFJlZmFjdG9yIGludGVybmFscyBvZiBwcml2YXRlIGtleSBsb2FkaW5nIGFuZCBzYXZpbmcgdG8gd29yayBvbiBtZW1vcnkKKyAgICAgYnVmZmVycyByYXRoZXIgdGhhbiBkaXJlY3RseSBvbiBmaWxlcy4gVGhpcyB3aWxsIG1ha2UgYSBmZXcgdGhpbmdzCisgICAgIGVhc2llciB0byBkbyBpbiB0aGUgZnV0dXJlOyBvayBtYXJrdXNACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8xMS8yMyAwMjozNTo1MAorICAgICBbYXV0aC5jXQorICAgICB1c2Ugc3RyaWN0X21vZGVzIGFscmVhZHkgcGFzc2VkIGFzIGZ1bmN0aW9uIGFyZ3VtZW50IG92ZXIgcmVmZXJlbmNpbmcKKyAgICAgZ2xvYmFsIG9wdGlvbnMuc3RyaWN0X21vZGVzCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8xMS8yMyAyMzo1NzoyNAorICAgICBbY2xpZW50bG9vcC5jXQorICAgICBhdm9pZCBOVUxMIGRlcmVmIG9uIHJlY2VpdmluZyBhIGNoYW5uZWwgcmVxdWVzdCBvbiBhbiB1bmtub3duIG9yIGludmFsaWQKKyAgICAgY2hhbm5lbDsgcmVwb3J0IGJ6IzE4NDIgZnJvbSBqY2hhZGltYSBBVCByZWRoYXQuY29tOyBvayBkdHVja2VyQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTEvMjQgMDE6MjQ6MTQKKyAgICAgW2NoYW5uZWxzLmNdCisgICAgIHJlbW92ZSBhIGRlYnVnKCkgdGhhdCBwb2xsdXRlcyBzdGRlcnIgb24gY2xpZW50IGNvbm5lY3RpbmcgdG8gYSBzZXJ2ZXIKKyAgICAgaW4gZGVidWcgbW9kZSAoY2hhbm5lbF9jbG9zZV9mZHMgaXMgY2FsbGVkIHRyYW5zaXRpdmVseSBmcm9tIHRoZSBzZXNzaW9uCisgICAgIGNvZGUgcG9zdC1mb3JrKTsgYnojMTcxOSwgb2sgZHR1Y2tlcgorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTEvMjUgMDQ6MTA6MDkKKyAgICAgW3Nlc3Npb24uY10KKyAgICAgcmVwbGFjZSBjbG9zZSgpIGxvb3AgZm9yIGZkcyAzLT42NCB3aXRoIGNsb3NlZnJvbSgpOworICAgICBvayBtYXJrdXMgZGVyYWFkdCBkdHVja2VyCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8xMS8yNiAwNTo1Mjo0OQorICAgICBbc2NwLmNdCisgICAgIFBhc3MgdGhyb3VnaCBzc2ggY29tbWFuZC1saW5lIGZsYWdzIGFuZCBvcHRpb25zIHdoZW4gZG9pbmcgcmVtb3RlLXJlbW90ZQorICAgICB0cmFuc2ZlcnMsIGUuZy4gdG8gZW5hYmxlIGFnZW50IGZvcndhcmRpbmcgd2hpY2ggaXMgcGFydGljdWxhcmx5IHVzZWZ1bAorICAgICBpbiB0aGlzIGNhc2U7IGJ6IzE4Mzcgb2sgZHR1Y2tlckAKKyAgIC0gbWFya3VzQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzExLzI5IDE4OjU3OjA0CisgICAgIFthdXRoZmlsZS5jXQorICAgICBjb3JyZWN0bHkgbG9hZCBjb21tZW50IGZvciBlbmNyeXB0ZWQgcnNhMSBrZXlzOworICAgICByZXBvcnQvZml4IEpvYWNoaW0gU2NoaXBwZXI7IG9rIGRqbUAKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzExLzI5IDIzOjQ1OjUxCisgICAgIFthdXRoLmMgaG9zdGZpbGUuYyBob3N0ZmlsZS5oIHNzaC5jIHNzaF9jb25maWcuNSBzc2hjb25uZWN0LmNdCisgICAgIFtzc2hjb25uZWN0Lmggc3NoY29ubmVjdDIuY10KKyAgICAgYXV0b21hdGljYWxseSBvcmRlciB0aGUgaG9zdGtleXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQgYmFzZWQgb24KKyAgICAgd2hpY2ggaG9zdGtleXMgYXJlIGFscmVhZHkgcmVjb3JkZWQgaW4ga25vd25faG9zdHMuIFRoaXMgYXZvaWRzCisgICAgIGhvc3RrZXkgd2FybmluZ3Mgd2hlbiBjb25uZWN0aW5nIHRvIHNlcnZlcnMgd2l0aCBuZXcgRUNEU0Ega2V5cworICAgICB0aGF0IGFyZSBwcmVmZXJyZWQgYnkgZGVmYXVsdDsgd2l0aCBtYXJrdXNACisKKzIwMTAxMTI0CisgLSAoZHR1Y2tlcikgW3BsYXRmb3JtLmMgc2Vzc2lvbi5jXSBNb3ZlIHRoZSBnZXRsdWlkIGNhbGwgb3V0IG9mIHNlc3Npb24uYyBhbmQKKyAgIGludG8gdGhlIHBsYXRmb3JtLXNwZWNpZmljIGNvZGUgIE9ubHkgYWZmZWN0cyBTQ08sIHRlc3RlZCBieSBhbmQgb2sgdGltQC4KKyAtIChkam0pIFtsb2dpbnJlYy5jXSBSZWxheCBwZXJtaXNzaW9uIHJlcXVpcmVtZW50IG9uIGJ0bXAgbG9ncyB0byBhbGxvdworICAgZ3JvdXAgcmVhZC93cml0ZS4gb2sgZHR1Y2tlckAKKyAtIChkdHVja2VyKSBbcGFja2V0LmNdIFJlbW92ZSByZWR1bmRhbnQgbG9jYWwgZGVjbGFyYXRpb24gb2YgImludCB0b3MiLgorIC0gKGRqbSkgW2RlZmluZXMuaF0gQWRkIElQIERTQ1AgZGVmaW5lcworCisyMDEwMTEyMgorIC0gKGR0dWNrZXIpIEJ1ZyAjMTg0MDogZml4IHdhcm5pbmcgd2hlbiBjb25maWd1cmluZyAtLXdpdGgtc3NsLWVuZ2luZSwgcGF0Y2gKKyAgIGZyb20gdmFwaWVyIGF0IGdlbnRvbyBvcmcuCisKKzIwMTAxMTIwCisgLSBPcGVuQlNEIENWUyBTeW5jCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8xMS8wNSAwMjo0Njo0NworICAgICBbcGFja2V0LmNdCisgICAgIHdoaXRlc3BhY2UgS05GCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8xMS8xMCAwMTozMzowNworICAgICBba2V4ZGhjLmMga2V4ZGhzLmMga2V4Z2V4Yy5jIGtleGdleHMuYyBrZXkuYyBtb2R1bGkuY10KKyAgICAgdXNlIG9ubHkgbGliY3J5cHRvIEFQSXMgdGhhdCBhcmUgcmV0YWluZWQgd2l0aCBPUEVOU1NMX05PX0RFUFJFQ0FURUQuCisgICAgIHRoZXNlIGhhdmUgYmVlbiBhcm91bmQgZm9yIHllYXJzIGJ5IHRoaXMgdGltZS4gb2sgbWFya3VzCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8xMS8xMyAyMzoyNzo1MQorICAgICBbY2xpZW50bG9vcC5jIG1pc2MuYyBtaXNjLmggcGFja2V0LmMgcGFja2V0LmggcmVhZGNvbmYuYyByZWFkY29uZi5oXQorICAgICBbc2VydmNvbmYuYyBzZXJ2Y29uZi5oIHNlc3Npb24uYyBzc2guYyBzc2hfY29uZmlnLjUgc3NoZF9jb25maWcuNV0KKyAgICAgYWxsb3cgc3NoIGFuZCBzc2hkIHRvIHNldCBhcmJpdHJhcnkgVE9TL0RTQ1AvUW9TIHZhbHVlcyBpbnN0ZWFkIG9mCisgICAgIGhhcmRjb2RpbmcgbG93ZGVsYXkvdGhyb3VnaHB1dC4KKyAgICAgCisgICAgIGJ6IzE3MzMgcGF0Y2ggZnJvbSBwaGlsaXBwIEFUIHJlZGZpc2gtc29sdXRpb25zLmNvbTsgb2sgbWFya3VzQCBkZXJhYWR0QAorICAgLSBqbWNAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTEvMTUgMDc6NDA6MTQKKyAgICAgW3NzaF9jb25maWcuNV0KKyAgICAgbGliYXJ5IC0+IGxpYnJhcnk7CisgICAtIGptY0BjdnMub3BlbmJzZC5vcmcgMjAxMC8xMS8xOCAxNTowMTowMAorICAgICBbc2NwLjEgc2Z0cC4xIHNzaC4xIHNzaGRfY29uZmlnLjVdCisgICAgIGFkZCBJUFFvUyB0byB0aGUgdmFyaW91cyAtbyBsaXN0cywgYW5kIHphcCBzb21lIHRyYWlsaW5nIHdoaXRlc3BhY2U7CisKKzIwMTAxMTExCisgLSAoZGptKSBbc2VydmNvbmYuYyBzc2gtYWRkLmMgc3NoLWtleWdlbi5jXSBkb24ndCBsb29rIGZvciBFQ0RTQSBrZXlzIG9uCisgICBwbGF0Zm9ybXMgdGhhdCBkb24ndCBzdXBwb3J0IEVDQy4gRml4ZXMgc29tZSBzcHVyaW91cyB3YXJuaW5ncyByZXBvcnRlZAorICAgYnkgdGltQAorCisyMDEwMTEwOQorIC0gKHRpbSkgW3JlZ3Jlc3Mva2V4dHlwZS5zaF0gTm90IGFsbCBwbGF0Zm9ybXMgaGF2ZSB0aW1lIGluIC91c3IvYmluLgorICAgRmVlZGJhY2sgZnJvbSBkdHVja2VyQAorIC0gKHRpbSkgW2NvbmZpZ3VyZS5hYyBvcGVuYnNkLWNvbXBhdC9ic2QtbWlzYy5oIG9wZW5ic2QtY29tcGF0L2JzZC1taXNjLmNdIEFkZAorICAgc3VwcG9ydCBmb3IgcGxhdGZvcm1zIG1pc3NpbmcgaXNibGFuaygpLiBvayBkam1ACisKKzIwMTAxMTA4CisgLSAodGltKSBbcmVncmVzcy9NYWtlZmlsZV0gRml4ZXMgdG8gYWxsb3cgYnVpbGRpbmcvdGVzdGluZyBvdXRzaWRlIHNvdXJjZQorICAgdHJlZS4KKyAtICh0aW0pIFtyZWdyZXNzL2tleHR5cGUuc2hdIFNoZWxsIHBvcnRhYmlsaXR5IGZpeC4KKworMjAxMDExMDcKKyAtIChkdHVja2VyKSBbcGxhdGZvcm0uY10gaW5jbHVkZXMuaCBpbnN0ZWFkIG9mIGRlZmluZXMuaCBzbyB0aGF0IHdlIGdldAorICAgdGhlIGNvcnJlY3QgdHlwZWRlZnMuCisKKzIwMTAxMTA1CisgLSAoZGptKSBbbG9naW5yZWMuYyBsb2dpbnJlYy5oXSBVc2UgY29ycmVjdCB1aWRfdC9waWRfdCB0eXBlcyBpbnN0ZWFkIG9mCisgICBpbnQuIFNob3VsZCBmaXggYnojMTgxNyBjbGVhbmx5OyBvayBkdHVja2VyQAorIC0gT3BlbkJTRCBDVlMgU3luYworICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDkvMjIgMTI6MjY6MDUKKyAgICAgW3JlZ3Jlc3MvTWFrZWZpbGUgcmVncmVzcy9rZXh0eXBlLnNoXQorICAgICByZWdyZXNzIHRlc3QgZm9yIGVhY2ggb2YgdGhlIGtleSBleGNoYW5nZSBhbGdvcml0aG1zIHRoYXQgd2Ugc3VwcG9ydAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTAvMjggMTE6MjI6MDkKKyAgICAgW2F1dGhmaWxlLmMga2V5LmMga2V5Lmggc3NoLWtleWdlbi5jXQorICAgICBmaXggYSBwb3NzaWJsZSBOVUxMIGRlcmVmIG9uIGxvYWRpbmcgYSBjb3JydXB0IEVDREgga2V5CisgICAgIAorICAgICBzdG9yZSBFQ0RIIGdyb3VwIGluZm9ybWF0aW9uIGluIHByaXZhdGUga2V5cyBmaWxlcyBhcyAibmFtZWQgZ3JvdXBzIgorICAgICByYXRoZXIgdGhhbiBhcyBhIHNldCBvZiBleHBsaWNpdCBncm91cCBwYXJhbWV0ZXJzIChieSBzZXR0aW5nCisgICAgIHRoZSBPUEVOU1NMX0VDX05BTUVEX0NVUlZFIGZsYWcpLiBUaGlzIG1ha2VzIGZvciBzaG9ydGVyIGtleSBmaWxlcyBhbmQKKyAgICAgcmV0cmlldmVzIHRoZSBncm91cCdzIE9wZW5TU0wgTklEIHRoYXQgd2UgbmVlZCBmb3IgdmFyaW91cyB0aGluZ3MuCisgICAtIGptY0BjdnMub3BlbmJzZC5vcmcgMjAxMC8xMC8yOCAxODozMzoyOAorICAgICBbc2NwLjEgc3NoLWFkZC4xIHNzaC1rZXlnZW4uMSBzc2guMSBzc2hfY29uZmlnLjUgc3NoZC44IHNzaGRfY29uZmlnLjVdCisgICAgIGtub2NrIG91dCBzb21lICItKi0gbnJvZmYgLSotIiBsaW5lczsKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzExLzA0IDAyOjQ1OjM0CisgICAgIFtzZnRwLXNlcnZlci5jXQorICAgICB1bWFzayBzaG91bGQgYmUgcGFyc2VkIGFzIG9jdGFsLiByZXBvcnRlZCBieSBjYW5kbGFuZCBBVCB4bWlzc2lvbi5jb207CisgICAgIG9rIG1hcmt1c0AKKyAtIChkdHVja2VyKSBbY29uZmlndXJlLmFjIHBsYXRmb3JtLntjLGh9IHNlc3Npb24uYworICAgb3BlbmJzZC1jb21wYXQvcG9ydC1zb2xhcmlzLntjLGh9XSBCdWcgIzE4MjQ6IEFkZCBTb2xhcmlzIFByb2plY3Qgc3VwcG9ydC4KKyAgIFBhdGNoIGZyb20gY29yeS5lcmlja3NvbiBhdCBjc3UgbW5zY3UgZWR1IHdpdGggYSBiaXQgb2YgcmV3b3JrIGZyb20gbWUuCisgICBvayBkam1ACisgLSAoZHR1Y2tlcikgW3BsYXRmb3JtLmMgcGxhdGZvcm0uaCBzZXNzaW9uLmNdIEFkZCBhIHBsYXRmb3JtIGhvb2sgdG8gcnVuCisgICBhZnRlciB0aGUgdXNlcidzIGdyb3VwcyBhcmUgZXN0YWJsaXNoZWQgYW5kIG1vdmUgdGhlIHNlbGludXggY2FsbHMgaW50byBpdC4KKyAtIChkdHVja2VyKSBbcGxhdGZvcm0uYyBzZXNzaW9uLmNdIE1vdmUgdGhlIEFJWCBzZXRwY3JlZCtjaHJvb3QgaGFjayBpbnRvCisgICBwbGF0Zm9ybS5jCisgLSAoZHR1Y2tlcikgW3BsYXRmb3JtLmMgc2Vzc2lvbi5jXSBNb3ZlIHRoZSBCU0RJIHNldHBncnAgaW50byBwbGF0Zm9ybS5jLgorIC0gKGR0dWNrZXIpIFtwbGF0Zm9ybS5jXSBPbmx5IGNhbGwgc2V0cGdycCBvbiBCU0RJIGlmIHJ1bm5pbmcgYXMgcm9vdCB0bworICAgcmV0YWluIHByZXZpb3VzIGJlaGF2aW9yLgorIC0gKGR0dWNrZXIpIFtwbGF0Zm9ybS5jIHNlc3Npb24uY10gTW92ZSB0aGUgUEFNIGNyZWRlbnRpYWwgZXN0YWJsaXNobWVudCBmb3IKKyAgIHRoZSBMT0dJTl9DQVAgY2FzZSBpbnRvIHBsYXRmb3JtLmMuCisgLSAoZHR1Y2tlcikgcGxhdGZvcm0uYyBzZXNzaW9uLmNdIE1vdmUgdGhlIFVTRV9MSUJJQUYgZnJhZ21lbnQgaW50bworICAgcGxhdGZvcm0uYworIC0gKGR0dWNrZXIpIFtwbGF0Zm9ybS5jIHNlc3Npb24uY10gTW92ZSBhaXhfdXNyaW5mbyBmcmFtZW50IGludG8gcGxhdGZvcm0uYy4KKyAtIChkdHVja2VyKSBbcGxhdGZvcm0uYyBzZXNzaW9uLmNdIE1vdmUgaXJpeCBzZXR1c2VyY29udGV4dCBmcmFnbWVudCBpbnRvCisgICBwbGF0Zm9ybS5jLgorIC0gKGR0dWNrZXIpIFtwbGF0Zm9ybS5jIHNlc3Npb24uY10gTW92ZSBQQU0gY3JlZGVudGlhbCBlc3RhYmxpc2htZW50IGZvciB0aGUKKyAgIG5vbi1MT0dJTl9DQVAgY2FzZSBpbnRvIHBsYXRmb3JtLmMuCisgLSAoZHR1Y2tlcikgW3BsYXRmb3JtLmMgcGxhdGZvcm0uaCBzZXNzaW9uLmNdIE1vdmUgdGhlIEN5Z3dpbiBzcGVjaWFsLWNhc2UKKyAgIGNoZWNrIGludG8gcGxhdGZvcm0uYworIC0gKGR0dWNrZXIpIFtyZWdyZXNzL2tleXR5cGUuc2hdIEltcG9ydCBuZXcgdGVzdC4KKyAtIChkdHVja2VyKSBbTWFrZWZpbGUgY29uZmlndXJlLmFjIHJlZ3Jlc3MvTWFrZWZpbGUgcmVncmVzcy9rZXl0eXBlLnNoXQorICAgSW1wb3J0IHJlY2VudCBjaGFuZ2VzIHRvIHJlZ3Jlc3MvTWFrZWZpbGUsIHBhc3MgYSBmbGFnIHRvIGVuYWJsZSBFQ0MgdGVzdHMKKyAgIGZyb20gY29uZmlndXJlIHRocm91Z2ggdG8gcmVncmVzcy9NYWtlZmlsZSBhbmQgdXNlIGl0IGluIHRoZSB0ZXN0cy4KKyAtIChkdHVja2VyKSBbcmVncmVzcy9rZXh0eXBlLnNoXSBBZGQgbWlzc2luZyAidGVzdCIuCisgLSAoZHR1Y2tlcikgW3JlZ3Jlc3Mva2V4dHlwZS5zaF0gTWFrZSBzaGEyNTYgdGVzdCBkZXBlbmQgb24gRUNDLiAgVGhpcyBpcyBub3QKKyAgIHN0cmljdGx5IGNvcnJlY3Qgc2luY2Ugd2hpbGUgRUNDIHJlcXVpcmVzIHNoYTI1NiB0aGUgcmV2ZXJzZSBpcyBub3QgdHJ1ZQorICAgaG93ZXZlciBpdCBkb2VzIHByZXZlbnQgc3B1cmlvdXMgdGVzdCBmYWlsdXJlcy4KKyAtIChkdHVja2VyKSBbcGxhdGZvcm0uY10gTmVlZCBzZXJ2Y29uZi5oIGFuZCBleHRlcm4gb3B0aW9ucy4KKworMjAxMDEwMjUKKyAtICh0aW0pIFtvcGVuYnNkLWNvbXBhdC9nbG9iLmhdIFJlbW92ZSBzeXMvY2RlZnMuaCBpbmNsdWRlIHRoYXQgY2FtZSB3aXRoCisgICAxLjEyIHRvIHVuYnJlYWsgU29sYXJpcyBidWlsZC4KKyAgIG9rIGRqbUAKKyAtIChkdHVja2VyKSBbZGVmaW5lcy5oXSBVc2UgU0laRV9UX01BWCBmb3IgU0laRV9NQVggZm9yIHBsYXRmb3JtcyB0aGF0IGhhdmUgYQorICAgbmF0aXZlIG9uZS4KKworMjAxMDEwMjQKKyAtIChkdHVja2VyKSBbaW5jbHVkZXMuaF0gQWRkIG1pc3NpbmcgaWZkZWYgR0xPQl9IQVNfR0xfU1RBVFYgdG8gZml4IGJ1aWxkLgorIC0gKGR0dWNrZXIpIFtyZWdyZXNzL2NlcnQtaG9zdGtleS5zaF0gRGlzYWJsZSBFQ0MtYmFzZWQgdGVzdHMgb24gcGxhdGZvcm1zCisgICB3aGljaCBkb24ndCBoYXZlIEVDQyBzdXBwb3J0IGluIGxpYmNyeXB0by4KKyAtIChkdHVja2VyKSBbcmVncmVzcy9jZXJ0LXVzZXJrZXkuc2hdIERpc2FibGUgRUNDLWJhc2VkIHRlc3RzIG9uIHBsYXRmb3JtcworICAgd2hpY2ggZG9uJ3QgaGF2ZSBFQ0Mgc3VwcG9ydCBpbiBsaWJjcnlwdG8uCisgLSAoZHR1Y2tlcikgW2RlZmluZXMuaF0gQWRkIFNJWkVfTUFYIGZvciB0aGUgYmVuZWZpdCBvZiBwbGF0Zm9ybXMgdGhhdCBkb24ndAorICAgaGF2ZSBpdC4KKyAtIChkdHVja2VyKSBPcGVuQlNEIENWUyBTeW5jCisgICAtIHN0aGVuQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzEwLzIzIDIyOjA2OjEyCisgICAgIFtzZnRwLmNdCisgICAgIGVzY2FwZSAnWycgaW4gZmlsZW5hbWUgdGFiLWNvbXBsZXRpb247IGZpeCBhIHR5cGUgd2hpbGUgdGhlcmUuCisgICAgIG9rIGRqbUAKKworMjAxMDEwMjEKKyAtIE9wZW5CU0QgQ1ZTIFN5bmMKKyAgIC0gZHR1Y2tlckBjdnMub3BlbmJzZC5vcmcgMjAxMC8xMC8xMiAwMjoyMjoyNAorICAgICBbbXV4LmNdCisgICAgIFR5cG8gaW4gY29uZmlybWF0aW9uIG1lc3NhZ2UuICBieiMxODI3LCBwYXRjaCBmcm9tIGltb3JnYW4gYXQKKyAgICAgbmFzIG5hc2EgZ292CisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wOC8zMSAxMjoyNDowOQorICAgICBbcmVncmVzcy9jZXJ0LWhvc3RrZXkuc2ggcmVncmVzcy9jZXJ0LXVzZXJrZXkuc2hdCisgICAgIHRlc3RzIGZvciBFQ0RTQSBjZXJ0aWZpY2F0ZXMKKworMjAxMDEwMTEKKyAtIChkam0pIFtjYW5vaG9zdC5jXSBaZXJvIGE0IGluc3RlYWQgb2YgYWRkciB0byBiZXR0ZXIgbWF0Y2ggdHlwZS4KKyAgIGJ6IzE4MjUsIHJlcG9ydGVkIGJ5IGZvbyBBVCBtYWlsaW5hdG9yLmNvbQorIC0gKGRqbSkgW3NzaGNvbm5lY3QuY10gTmVlZCBzaWduYWwuaCBmb3IgcHJvdG90eXBlIGZvciBraWxsKDIpCisKKzIwMTAxMDExCisgLSAoZGptKSBbY29uZmlndXJlLmFjXSBVc2UgPSBpbnN0ZWFkIG9mID09IGluIHNoZWxsIHRlc3RzLiBQYXRjaCBmcm9tCisgICBkciBBVCB2YXNjby5jb20KKworMjAxMDEwMDcKKyAtIChkam0pIFtzc2gtYWdlbnQuY10gRml4IHR5cGUgZm9yIGN1cnZlIG5hbWUuCisgLSAoZGptKSBPcGVuQlNEIENWUyBTeW5jCisgICAtIG1hdHRoZXdAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDkvMjQgMTM6MzM6MDAKKyAgICAgW21pc2MuYyBtaXNjLmggY29uZmlndXJlLmFjIG9wZW5ic2QtY29tcGF0L29wZW5ic2QtY29tcGF0LmhdCisgICAgIFtvcGVuYnNkLWNvbXBhdC90aW1pbmdzYWZlX2JjbXAuY10KKyAgICAgQWRkIHRpbWluZ3NhZmVfYmNtcCgzKSB0byBsaWJjLCBtZW50aW9uIHRoYXQgaXQncyBhbHJlYWR5IGluIHRoZQorICAgICBrZXJuZWwgaW4ga2Vybig5KSwgYW5kIHJlbW92ZSBpdCBmcm9tIE9wZW5TU0guCisgICAgIG9rIGRlcmFhZHRALCBkam1ACisgICAgIE5CLiByZS1hZGRlZCB1bmRlciBvcGVuYnNkLWNvbXBhdC8gZm9yIHBvcnRhYmxlIE9wZW5TU0gKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA5LzI1IDA5OjMwOjE2CisgICAgIFtzZnRwLmMgY29uZmlndXJlLmFjIG9wZW5ic2QtY29tcGF0L2dsb2IuYyBvcGVuYnNkLWNvbXBhdC9nbG9iLmhdCisgICAgIG1ha2UgdXNlIG9mIG5ldyBnbG9iKDMpIEdMT0JfS0VFUFNUQVQgZXh0ZW5zaW9uIHRvIHNhdmUgZXh0cmEgc2VydmVyCisgICAgIHJvdW50cmlwcyB0byBmZXRjaCBwZXItZmlsZSBzdGF0KDIpIGluZm9ybWF0aW9uLgorICAgICBOQi4gdXBkYXRlIG9wZW5ic2QtY29tcGF0LyBnbG9iKDMpIGltcGxlbWVudGF0aW9uIGZyb20gT3BlbkJTRCBsaWJjIHRvCisgICAgIG1hdGNoLgorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDkvMjYgMjI6MjY6MzMKKyAgICAgW3NmdHAuY10KKyAgICAgd2hlbiBwZXJmb3JtaW5nIGFuICJscyIgaW4gY29sdW1uYXRlZCAoc2hvcnQpIG1vZGUsIG9ubHkgY2FsbAorICAgICBpb2N0bChUSU9DR1dJTlNaKSBvbmNlIHRvIGdldCB0aGUgd2luZG93IHdpZHRoIGluc3RlYWQgb2YgcGVyLQorICAgICBmaWxlbmFtZQorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDkvMzAgMTE6MDQ6NTEKKyAgICAgW3NlcnZjb25mLmNdCisgICAgIHByZXZlbnQgZnJlZSgpIG9mIHN0cmluZyBpbiAucm9kYXRhIHdoZW4gb3ZlcnJpZGluZyBBdXRob3JpemVkS2V5cyBpbgorICAgICBhIE1hdGNoIGJsb2NrOyBwYXRjaCBmcm9tIHJlaW4gQVQgYmFzZWZhcm0ubm8KKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzEwLzAxIDIzOjA1OjMyCisgICAgIFtjaXBoZXItM2RlczEuYyBjaXBoZXItYmYxLmMgY2lwaGVyLWN0ci5jIG9wZW5ic2QtY29tcGF0L29wZW5zc2wtY29tcGF0LmhdCisgICAgIGFkYXB0IHRvIEFQSSBjaGFuZ2VzIGluIG9wZW5zc2wtMS4wLjBhCisgICAgIE5CLiBjb250YWlucyBjb21wYXQgY29kZSB0byBzZWxlY3QgY29ycmVjdCBBUEkgZm9yIG9sZGVyIE9wZW5TU0wKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzEwLzA1IDA1OjEzOjE4CisgICAgIFtzZnRwLmMgc3NoY29ubmVjdC5jXQorICAgICB1c2UgZGVmYXVsdCBzaGVsbCAvYmluL3NoIGlmICRTSEVMTCBpcyAiIjsgb2sgbWFya3VzQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTAvMDYgMDY6Mzk6MjgKKyAgICAgW2NsaWVudGxvb3AuYyBzc2guYyBzc2hjb25uZWN0LmMgc3NoY29ubmVjdC5oXQorICAgICBraWxsIHByb3h5IGNvbW1hbmQgb24gZmF0YWwoKSAod2UgYWxyZWFkeSBraWxsIGl0IG9uIGNsZWFuIGV4aXQpOworICAgICBvayBtYXJrdXNACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8xMC8wNiAyMToxMDoyMQorICAgICBbc3NoY29ubmVjdC5jXQorICAgICBzd2FwcGVkIGFyZ3MgdG8ga2lsbCgyKQorIC0gKGRqbSkgW29wZW5ic2QtY29tcGF0L2dsb2IuY10gcmVzdG9yZSBBUkdfTUFYIGNvbXBhdCBjb2RlLgorIC0gKGRqbSkgW2NpcGhlci1hY3NzLmNdIEFkZCBtaXNzaW5nIGhlYWRlci4KKyAtIChkam0pIFtvcGVuYnNkLWNvbXBhdC9NYWtlZmlsZS5pbl0gQWN0dWFsbHkgbGluayB0aW1pbmdzYWZlX2JjbXAKKworMjAxMDA5MjQKKyAtIChkam0pIE9wZW5CU0QgQ1ZTIFN5bmMKKyAgIC0gbmFkZHlAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDkvMTAgMTU6MTk6MjkKKyAgICAgW3NzaC1rZXlnZW4uMV0KKyAgICAgKiBtZW50aW9uIEVDRFNBIGluIG1vcmUgcGxhY2VzCisgICAgICogbGVzcyByZXBldGl0aW9uIGluIEZJTEVTIHNlY3Rpb24KKyAgICAgKiBTU0h2MSBrZXlzIGFyZSBzdGlsbCBlbmNyeXB0ZWQgd2l0aCAzREVTCisgICAgIGhlbHAgYW5kIG9rIGptY0AKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA5LzExIDIxOjQ0OjIwCisgICAgIFtzc2guMV0KKyAgICAgbWVudGlvbiBSRkMgNTY1NiBmb3IgRUNDIHN0dWZmCisgICAtIGptY0BjdnMub3BlbmJzZC5vcmcgMjAxMC8wOS8xOSAyMTozMDowNQorICAgICBbc2Z0cC4xXQorICAgICBtb3JlIHdhY2t5IG1hY3JvIGZpeGluZzsKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA5LzIwIDA0OjQxOjQ3CisgICAgIFtzc2guY10KKyAgICAgaW5zdGFsbCBhIFNJR0NITEQgaGFuZGxlciB0byByZWFwIGV4cGlyaWVkIGNoaWxkIHByb2Nlc3M7IG9rIG1hcmt1c0AKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA5LzIwIDA0OjUwOjUzCisgICAgIFtqcGFrZS5jIHNjaG5vcnIuY10KKyAgICAgY2hlY2sgdGhhdCByZWNlaXZlZCB2YWx1ZXMgYXJlIHNtYWxsZXIgdGhhbiB0aGUgZ3JvdXAgc2l6ZSBpbiB0aGUKKyAgICAgZGlzYWJsZWQgYW5kIHVuZmluaXNoZWQgSi1QQUtFIGNvZGUuCisgICAgIGF2b2lkcyBjYXRhc3Ryb3BoaWMgc2VjdXJpdHkgZmFpbHVyZSBmb3VuZCBieSBTZWJhc3RpZW4gTWFydGluaQorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDkvMjAgMDQ6NTQ6MDcKKyAgICAgW2pwYWtlLmNdCisgICAgIG1pc3NpbmcgI2luY2x1ZGUKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA5LzIwIDA3OjE5OjI3CisgICAgIFttdXguY10KKyAgICAgImF0b21pY2FsbHkiIGNyZWF0ZSB0aGUgbGlzdGVuaW5nIG11eCBzb2NrZXQgYnkgYmluZGluZyBpdCBvbiBhIHRlbW9yYXJ5CisgICAgIG5hbWUgYW5kIHRoZW4gbGlua2luZyBpdCBpbnRvIHBvc2l0aW9uIGFmdGVyIGxpc3RlbigpIGhhcyBzdWNjZWVkZWQuCisgICAgIHRoaXMgYWxsb3dzIHRoZSBtdXggY2xpZW50cyB0byBkZXRlcm1pbmUgdGhhdCB0aGUgc2VydmVyIHNvY2tldCBpcworICAgICBlaXRoZXIgcmVhZHkgb3Igc3RhbGUgd2l0aG91dCByYWNlcy4gc3RhbGUgc2VydmVyIHNvY2tldHMgYXJlIG5vdworICAgICBhdXRvbWF0aWNhbGx5IHJlbW92ZWQKKyAgICAgb2sgZGVyYWFkdAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDkvMjIgMDU6MDE6MzAKKyAgICAgW2tleC5jIGtleC5oIGtleGVjZGguYyBrZXhlY2RoYy5jIGtleGVjZGhzLmMgcmVhZGNvbmYuYyByZWFkY29uZi5oXQorICAgICBbc2VydmNvbmYuYyBzZXJ2Y29uZi5oIHNzaF9jb25maWcuNSBzc2hjb25uZWN0Mi5jIHNzaGQuYyBzc2hkX2NvbmZpZy41XQorICAgICBhZGQgYSBLZXhBbGdvcml0aG1zIGtub2IgdG8gdGhlIGNsaWVudCBhbmQgc2VydmVyIGNvbmZpZ3VyYXRpb24gdG8gYWxsb3cKKyAgICAgc2VsZWN0aW9uIG9mIHdoaWNoIGtleSBleGNoYW5nZSBtZXRob2RzIGFyZSB1c2VkIGJ5IHNzaCgxKSBhbmQgc3NoZCg4KQorICAgICBhbmQgdGhlaXIgb3JkZXIgb2YgcHJlZmVyZW5jZS4KKyAgICAgb2sgbWFya3VzQAorICAgLSBqbWNAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDkvMjIgMDg6MzA6MDgKKyAgICAgW3NzaC4xIHNzaF9jb25maWcuNV0KKyAgICAgc3NoLjE6IGFkZCBrZXhhbGdvcml0aG1zIHRvIHRoZSAtbyBsaXN0CisgICAgIHNzaF9jb25maWcuNTogZm9ybWF0IHRoZSBrZXhhbGdvcml0aG1zIGluIGEgbW9yZSBjb25zaXN0ZW50CisgICAgIChwcmV0dGllciEpIHdheQorICAgICBvayBkam0KKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA5LzIyIDIyOjU4OjUxCisgICAgIFthdG9taWNpby5jIGF0b21pY2lvLmggbWlzYy5jIG1pc2MuaCBzY3AuYyBzZnRwLWNsaWVudC5jXQorICAgICBbc2Z0cC1jbGllbnQuaCBzZnRwLjEgc2Z0cC5jXQorICAgICBhZGQgYW4gb3B0aW9uIHBlci1yZWFkL3dyaXRlIGNhbGxiYWNrIHRvIGF0b21pY2lvCisKKyAgICAgZmFjdG9yIG91dCBiYW5kd2lkdGggbGltaXRpbmcgY29kZSBmcm9tIHNjcCgxKSBpbnRvIGEgZ2VuZXJpYyBiYW5kd2lkdGgKKyAgICAgbGltaXRlciB0aGF0IGNhbiBiZSBhdHRhY2hlZCB1c2luZyB0aGUgYXRvbWljaW8gY2FsbGJhY2sgbWVjaGFuaXNtCisKKyAgICAgYWRkIGEgYmFuZHdpZHRoIGxpbWl0IG9wdGlvbiB0byBzZnRwKDEpIHVzaW5nIHRoZSBhYm92ZQorICAgICAidmVyeSBuaWNlIiBtYXJrdXNACisgICAtIGptY0BjdnMub3BlbmJzZC5vcmcgMjAxMC8wOS8yMyAxMzozNDo0MworICAgICBbc2Z0cC5jXQorICAgICBhZGQgWy1sIGxpbWl0XSB0byB1c2FnZSgpOworICAgLSBqbWNAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDkvMjMgMTM6MzY6NDYKKyAgICAgW3NjcC4xIHNmdHAuMV0KKyAgICAgYWRkIEtleEFsZ29yaXRobXMgdG8gdGhlIC1vIGxpc3Q7CisKKzIwMTAwOTEwCisgLSAoZHR1Y2tlcikgW29wZW5ic2QtY29tcGF0L3BvcnQtbGludXguY10gQ2hlY2sgaXNfc2VsaW51eF9lbmFibGVkIGZvciBleGFjdAorICAgcmV0dXJuIGNvZGUgc2luY2UgaXQgY2FuIGFwcGFyZW50bHkgcmV0dXJuIC0xIHVuZGVyIHNvbWUgY29uZGl0aW9ucy4gIEZyb20KKyAgIG9wZW5zc2ggYnVncyB3ZXJiaXR0ZXdhcyBkZSwgb2sgZGptQAorIC0gT3BlbkJTRCBDVlMgU3luYworICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDgvMzEgMTI6MzM6MzgKKyAgICAgW3NzaC1hZGQuYyBzc2gtYWdlbnQuYyBzc2gta2V5Z2VuLmMgc3NoLWtleXNpZ24uYyBzc2guYyBzc2hkLmNdCisgICAgIHJlaW50cm9kdWNlIGNvbW1pdCBmcm9tIHRlZHVALCB3aGljaCBJIHB1bGxlZCBvdXQgZm9yIHJlbGVhc2UKKyAgICAgZW5naW5lZXJpbmc6CisgICAgICAgT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMgaXMgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHdlIGhhdmUgYQorICAgICAgIG1hbiBwYWdlIGZvciwgc28gdXNlIHRoYXQuICBvayBkam0KKyAgIC0gam1jQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA4LzMxIDE3OjQwOjU0CisgICAgIFtzc2gtYWdlbnQuMV0KKyAgICAgZml4IHNvbWUgbWFjcm8gYWJ1c2U7CisgICAtIGptY0BjdnMub3BlbmJzZC5vcmcgMjAxMC8wOC8zMSAyMToxNDo1OAorICAgICBbc3NoLjFdCisgICAgIHNtYWxsIHRleHQgdHdlYWsgdG8gYWNjb21tb2RhdGUgcHJldmlvdXM7CisgICAtIG5hZGR5QGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA5LzAxIDE1OjIxOjM1CisgICAgIFtzZXJ2Y29uZi5jXQorICAgICBwaWNrIHVwIEVDRFNBIGhvc3Qga2V5IGJ5IGRlZmF1bHQ7IG9rIGRqbUAKKyAgIC0gbWFya3VzQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA5LzAyIDE2OjA3OjI1CisgICAgIFtzc2gta2V5Z2VuLmNdCisgICAgIHBlcm1pdCAtYiAyNTYsIDM4NCBvciA1MjEgYXMga2V5IHNpemUgZm9yIEVDRFNBOyBvayBkam1ACisgICAtIG1hcmt1c0BjdnMub3BlbmJzZC5vcmcgMjAxMC8wOS8wMiAxNjowODozOQorICAgICBbc3NoLmNdCisgICAgIHVuYnJlYWsgQ29udHJvbFBlcnNpc3Q9eWVzIGZvciBDb250cm9sTWFzdGVyPXllczsgb2sgZGptQAorICAgLSBuYWRkeUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wOS8wMiAxNzoyMTo1MAorICAgICBbc3NoLWtleWdlbi5jXQorICAgICBTd2l0Y2ggRUNEU0EgZGVmYXVsdCBrZXkgc2l6ZSB0byAyNTYgYml0cywgd2hpY2ggYWNjb3JkaW5nIHRvIFJGQzU2NTYKKyAgICAgc2hvdWxkIHN0aWxsIGJlIGJldHRlciB0aGFuIG91ciBjdXJyZW50IFJTQS0yMDQ4IGRlZmF1bHQuCisgICAgIG9rIGRqbUAsIG1hcmt1c0AKKyAgIC0gam1jQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA5LzAzIDExOjA5OjI5CisgICAgIFtzY3AuMV0KKyAgICAgYWRkIGFuIEVYSVQgU1RBVFVTIHNlY3Rpb24gZm9yIC91c3IvYmluOworICAgLSBqbWNAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDkvMDQgMDk6Mzg6MzQKKyAgICAgW3NzaC1hZGQuMSBzc2guMV0KKyAgICAgdHdvIG1vcmUgRVhJVCBTVEFUVVMgc2VjdGlvbnM7CisgICAtIG5hZGR5QGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA5LzA2IDE3OjEwOjE5CisgICAgIFtzc2hkX2NvbmZpZ10KKyAgICAgYWRkIHNzaF9ob3N0X2VjZHNhX2tleSB0byAvZXRjOyBmcm9tIE1hdHRpZXUgQmFwdGlzdGUKKyAgICAgPG1hdHRpZXUuYkBnbWFpbC5jb20+CisgICAgIG9rIGRlcmFhZHRACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wOS8wOCAwMzo1NDozNgorICAgICBbYXV0aGZpbGUuY10KKyAgICAgdHlwbworICAgLSBkZXJhYWR0QGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA5LzA4IDA0OjEzOjMxCisgICAgIFtjb21wcmVzcy5jXQorICAgICB3b3JrIGFyb3VuZCBuYW1lLXNwYWNlIGNvbGxpc2lvbnMgc29tZSBidWdneSBjb21waWxlcnMgKGxvb2tpbmcgYXQgeW91CisgICAgIGdjYywgYXQgbGVhc3QgaW4gZWFybGllciB2ZXJzaW9ucywgYnV0IHRoaXMgZG9lcyBub3QgZm9yZ2l2ZSB5b3VyIGN1cnJlbnQKKyAgICAgdHJhbnNncmVzc2lvbnMpIHNlZW4gYmV0d2VlbiB6bGliIGFuZCBvcGVuc3NsCisgICAgIG9rIGRqbQorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDkvMDkgMTA6NDU6NDUKKyAgICAgW2tleC5jIGtleC5oIGtleGVjZGguYyBrZXkuYyBrZXkuaCBtb25pdG9yLmMgc3NoLWVjZHNhLmNdCisgICAgIEVDREgvRUNEU0EgY29tcGxpYW5jZSBmaXg6IHRoZXNlIG1ldGhvZHMgdmFyeSB0aGUgaGFzaCBmdW5jdGlvbiB0aGV5IHVzZQorICAgICAoU0hBMjU2LzM4NC81MTIpIGRlcGVuZGluZyBvbiB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJ2ZSBpbiB1c2UuIFRoZSBwcmV2aW91cworICAgICBjb2RlIGluY29ycmVjdGx5IHVzZWQgU0hBMjU2IGluIGFsbCBjYXNlcy4KKyAgICAgCisgICAgIFRoaXMgZml4IHdpbGwgY2F1c2UgYXV0aGVudGljYXRpb24gZmFpbHVyZSB3aGVuIHVzaW5nIDM4NCBvciA1MjEtYml0IGN1cnZlCisgICAgIGtleXMgaWYgb25lIHBlZXIgaGFzbid0IGJlZW4gdXBncmFkZWQgYW5kIHRoZSBvdGhlciBoYXMuICgyNTYtYml0IGN1cnZlCisgICAgIGtleXMgd29yayBvaykuIEluIHBhcnRpY3VsYXIgeW91IG1heSBuZWVkIHRvIHNwZWNpZnkgSG9zdGtleUFsZ29yaXRobXMKKyAgICAgd2hlbiBjb25uZWN0aW5nIHRvIGEgc2VydmVyIHRoYXQgaGFzIG5vdCBiZWVuIHVwZ3JhZGVkIGZyb20gYW4gdXBncmFkZWQKKyAgICAgY2xpZW50LgorICAgICAKKyAgICAgb2sgbmFkZHlACisgLSAoZGptKSBbYXV0aGZkLmMgYXV0aGZpbGUuYyBidWZlYy5jIGJ1ZmZlci5oIGNvbmZpZ3VyZS5hYyBrZXguaCBrZXhlY2RoLmNdCisgICBba2V4ZWNkaGMuYyBrZXhlY2Rocy5jIGtleS5jIGtleS5oIG15cHJvcG9zYWwuaCBwYWNrZXQuYyByZWFkY29uZi5jXQorICAgW3NzaC1hZ2VudC5jIHNzaC1lY2RzYS5jIHNzaC1rZXlnZW4uYyBzc2guY10gRGlzYWJsZSBFQ0RIIGFuZCBFQ0RTQSBvbgorICAgcGxhdGZvcm1zIHRoYXQgZG9uJ3QgaGF2ZSB0aGUgcmVxdWlzaXRlIE9wZW5TU0wgc3VwcG9ydC4gb2sgZHR1Y2tlckAKKyAtIChkdHVja2VyKSBba2V4Lmgga2V5LmMgcGFja2V0Lmggc3NoLWFnZW50LmMgc3NoLmNdIEEgZmV3IG1vcmUgRUNDIGlmZGVmcworICAgZm9yIG1pc3NpbmcgaGVhZGVycyBhbmQgY29tcGlsZXIgd2FybmluZ3MuCisKKzIwMTAwODMxCisgLSBPcGVuQlNEIENWUyBTeW5jCisgICAtIGptY0BjdnMub3BlbmJzZC5vcmcgMjAxMC8wOC8wOCAxOTozNjozMAorICAgICBbc3NoLWtleXNpZ24uOCBzc2guMSBzc2hkLjhdCisgICAgIHVzZSB0aGUgc2FtZSB0ZW1wbGF0ZSBmb3IgYWxsIEZJTEVTIHNlY3Rpb25zOyBpLmUuIC1jb21wYWN0Ly5QcCB3aGVyZSB3ZQorICAgICBoYXZlIG11bHRpcGxlIGl0ZW1zLCBhbmQgLlBhIGZvciBwYXRoIG5hbWVzOworICAgLSB0ZWR1QGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA4LzEyIDIzOjM0OjM5CisgICAgIFtzc2gtYWRkLmMgc3NoLWFnZW50LmMgc3NoLWtleWdlbi5jIHNzaC1rZXlzaWduLmMgc3NoLmMgc3NoZC5jXQorICAgICBPcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcyBpcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gd2UgaGF2ZSBhIG1hbiBwYWdlCisgICAgIGZvciwgc28gdXNlIHRoYXQuICBvayBkam0KKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA4LzE2IDA0OjA2OjA2CisgICAgIFtzc2gtYWRkLmMgc3NoLWFnZW50LmMgc3NoLWtleWdlbi5jIHNzaC1rZXlzaWduLmMgc3NoLmMgc3NoZC5jXQorICAgICBiYWNrb3V0IHByZXZpb3VzIHRlbXBvcmFyaWx5OyBkaXNjdXNzZWQgd2l0aCBkZXJhYWR0QAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDgvMzEgMDk6NTg6MzcKKyAgICAgW2F1dGgtb3B0aW9ucy5jIGF1dGgxLmMgYXV0aDIuYyBidWZhdXguYyBidWZmZXIuaCBrZXguYyBrZXkuYyBwYWNrZXQuY10KKyAgICAgW3BhY2tldC5oIHNzaC1kc3MuYyBzc2gtcnNhLmNdCisgICAgIEFkZCBidWZmZXJfZ2V0X2NzdHJpbmcoKSBhbmQgcmVsYXRlZCBmdW5jdGlvbnMgdGhhdCB2ZXJpZnkgdGhhdCB0aGUKKyAgICAgc3RyaW5nIGV4dHJhY3RlZCBmcm9tIHRoZSBidWZmZXIgY29udGFpbnMgbm8gZW1iZWRkZWQgXDAgY2hhcmFjdGVycyoKKyAgICAgVGhpcyBwcmV2ZW50cyByYW5kb20gKHBvc3NpYmx5IG1hbGljaW91cykgY3JhcCBmcm9tIGJlaW5nIGFwcGVuZGVkIHRvCisgICAgIHN0cmluZ3Mgd2hlcmUgaXQgd291bGQgbm90IGJlIG5vdGljZWQgaWYgdGhlIHN0cmluZyBpcyB1c2VkIHdpdGgKKyAgICAgYSBzdHJpbmcoMykgZnVuY3Rpb24uCisgICAgIAorICAgICBVc2UgdGhlIG5ldyBBUEkgaW4gYSBmZXcgc2Vuc2l0aXZlIHBsYWNlcy4KKyAgICAgCisgICAgICogYWN0dWFsbHksIHdlIGFsbG93IGEgc2luZ2xlIG9uZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgZm9yIG5vdyBiZWNhdXNlCisgICAgIHdlIGRvbid0IGtub3cgaG93IG1hbnkgZGVwbG95ZWQgaW1wbGVtZW50YXRpb25zIGdldCB0aGlzIHdyb25nLCBidXQgZG9uJ3QKKyAgICAgY291bnQgb24gdGhpcyB0byByZW1haW4gaW5kZWZpbml0ZWx5LgorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDgvMzEgMTE6NTQ6NDUKKyAgICAgW1BST1RPQ09MIFBST1RPQ09MLmFnZW50IFBST1RPQ09MLmNlcnRrZXlzIGF1dGgyLWpwYWtlLmMgYXV0aGZkLmNdCisgICAgIFthdXRoZmlsZS5jIGJ1ZmZlci5oIGRucy5jIGtleC5jIGtleC5oIGtleS5jIGtleS5oIG1vbml0b3IuY10KKyAgICAgW21vbml0b3Jfd3JhcC5jIG15cHJvcG9zYWwuaCBwYWNrZXQuYyBwYWNrZXQuaCBwYXRobmFtZXMuaCByZWFkY29uZi5jXQorICAgICBbc3NoLWFkZC4xIHNzaC1hZGQuYyBzc2gtYWdlbnQuMSBzc2gtYWdlbnQuYyBzc2gta2V5Z2VuLjEgc3NoLWtleWdlbi5jXQorICAgICBbc3NoLWtleXNjYW4uMSBzc2gta2V5c2Nhbi5jIHNzaC1rZXlzaWduLjggc3NoLjEgc3NoLmMgc3NoMi5oXQorICAgICBbc3NoX2NvbmZpZy41IHNzaGNvbm5lY3QuYyBzc2hjb25uZWN0Mi5jIHNzaGQuOCBzc2hkLmMgc3NoZF9jb25maWcuNV0KKyAgICAgW3V1ZW5jb2RlLmMgdXVlbmNvZGUuaCBidWZlYy5jIGtleGVjZGguYyBrZXhlY2RoYy5jIGtleGVjZGhzLmMgc3NoLWVjZHNhLmNdCisgICAgIEltcGxlbWVudCBFbGxpcHRpYyBDdXJ2ZSBDcnlwdG9ncmFwaHkgbW9kZXMgZm9yIGtleSBleGNoYW5nZSAoRUNESCkgYW5kCisgICAgIGhvc3QvdXNlciBrZXlzIChFQ0RTQSkgYXMgc3BlY2lmaWVkIGJ5IFJGQzU2NTYuIEVDREggYW5kIEVDRFNBIG9mZmVyCisgICAgIGJldHRlciBwZXJmb3JtYW5jZSB0aGFuIHBsYWluIERIIGFuZCBEU0EgYXQgdGhlIHNhbWUgZXF1aXZhbGVudCBzeW1tZXRyaWMKKyAgICAga2V5IGxlbmd0aCwgYXMgd2VsbCBhcyBtdWNoIHNob3J0ZXIga2V5cy4KKyAgICAgCisgICAgIE9ubHkgdGhlIG1hbmRhdG9yeSBzZWN0aW9ucyBvZiBSRkM1NjU2IGFyZSBpbXBsZW1lbnRlZCwgc3BlY2lmaWNhbGx5IHRoZQorICAgICB0aHJlZSBSRVFVSVJFRCBjdXJ2ZXMgbmlzdHAyNTYsIG5pc3RwMzg0IGFuZCBuaXN0cDUyMSBhbmQgb25seSBFQ0RIIGFuZAorICAgICBFQ0RTQS4gUG9pbnQgY29tcHJlc3Npb24gKG9wdGlvbmFsIGluIFJGQzU2NTYgaXMgTk9UIGltcGxlbWVudGVkKS4KKyAgICAgCisgICAgIENlcnRpZmljYXRlIGhvc3QgYW5kIHVzZXIga2V5cyB1c2luZyB0aGUgbmV3IEVDRFNBIGtleSB0eXBlcyBhcmUgc3VwcG9ydGVkLgorICAgICAKKyAgICAgTm90ZSB0aGF0IHRoaXMgY29kZSBoYXMgbm90IGJlZW4gdGVzdGVkIGZvciBpbnRlcm9wZXJhYmlsaXR5IGFuZCBtYXkgYmUKKyAgICAgc3ViamVjdCB0byBjaGFuZ2UuCisgICAgIAorICAgICBmZWVkYmFjayBhbmQgb2sgbWFya3VzQAorIC0gKGRqbSkgW01ha2VmaWxlLmluXSBBZGQgbmV3IEVDQyBmaWxlcworIC0gKGRqbSkgW2J1ZmVjLmMga2V4ZWNkaC5jIGtleGVjZGhjLmMga2V4ZWNkaHMuYyBzc2gtZWNkc2EuY10gaW5jbHVkZQorICAgaW5jbHVkZXMuaAorCisyMDEwMDgyNworIC0gKGR0dWNrZXIpIFtjb250cmliL3JlZGhhdC9zc2hkLmluaXRdIEJ1ZyAjMTgxMDogaW5pdGxvZyBpcyBkZXByZWNhdGVkLAorICAgcmVtb3ZlLiAgUGF0Y2ggZnJvbSBtYXJ0eW5hcyBhdCB2ZW5jayB1cyAKKworMjAxMDA4MjMKKyAtIChkam0pIFJlbGVhc2UgT3BlblNTSC01LjZwMQorCisyMDEwMDgxNgorIC0gKGR0dWNrZXIpIFtjb25maWd1cmUuYWMgb3BlbmJzZC1jb21wYXQvTWFrZWZpbGUuaW4KKyAgIG9wZW5ic2QtY29tcGF0L29wZW5ic2QtY29tcGF0Lmggb3BlbmJzZC1jb21wYXQvc3RycHRpbWUuY10gQWRkIHN0cnB0aW1lIHRvCisgICB0aGUgY29tcGF0IGxpYnJhcnkgd2hpY2ggaGVscHMgb24gcGxhdGZvcm1zIGxpa2Ugb2xkIElSSVguICBCYXNlZCBvbiB3b3JrCisgICBieSBkam0sIHRlc3RlZCBieSBUb20gQ2hyaXN0ZW5zZW4uCisgLSBPcGVuQlNEIENWUyBTeW5jCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wOC8xMiAyMTo0OTo0NAorICAgICBbc3NoLmNdCisgICAgIGNsb3NlIGFueSBleHRyYSBmaWxlIGRlc2NyaXB0b3JzIGluaGVyaXRlZCBmcm9tIHBhcmVudCBhdCBzdGFydCBhbmQKKyAgICAgcmVvcGVuIHN0ZGluL3N0ZG91dCB0byAvZGV2L251bGwgd2hlbiBmb3JraW5nIGZvciBDb250cm9sUGVyc2lzdC4KKyAgICAgCisgICAgIHByZXZlbnRzIHRvb2xzIHRoYXQgZm9yayBhbmQgcnVuIGEgY2FwdGl2ZSBzc2ggZm9yIGNvbW11bmljYXRpb24gZnJvbQorICAgICBmYWlsaW5nIHRvIGV4aXQgd2hlbiB0aGUgc3NoIGNvbXBsZXRlcyB3aGlsZSB0aGV5IHdhaXQgZm9yIHRoZXNlIGZkcyB0bworICAgICBjbG9zZS4gVGhlIGluaGVyaXRlZCBmZHMgbWF5IHBlcnNpc3QgYXJiaXRyYXJpbHkgbG9uZyBpZiBhIGJhY2tncm91bmQKKyAgICAgbXV4IG1hc3RlciBoYXMgYmVlbiBzdGFydGVkIGJ5IENvbnRyb2xQZXJzaXN0LiBjdnMgYW5kIHNjcCB3ZXJlIGVmZmVjdGVkCisgICAgIGJ5IHRoaXMuCisgICAgIAorICAgICAicGxlYXNlIGNvbW1pdCIgbWFya3VzQAorIC0gKGRqbSkgW3JlZ3Jlc3MvUkVBRE1FLnJlZ3Jlc3NdIHR5cG8KKworMjAxMDA4MTIKKyAtICh0aW0pIFtyZWdyZXNzL2xvZ2luLXRpbWVvdXQuc2ggcmVncmVzcy9yZWNvbmZpZ3VyZS5zaCByZWdyZXNzL3JlZXhlYy5zaAorICAgcmVncmVzcy90ZXN0LWV4ZWMuc2hdIFVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucyB3aGVuIHRlc3Rpbmcgd2l0aCBzdWRvCisgICB0ZXN0cyB3b3VsZCBmYWlsIGJlY2F1c2UgdGhlIHBpZGZpbGUgY291bGQgbm90IGJlIHJlYWQgYnkgYSByZWd1bGFyIHVzZXIuCisgICAiY2F0OiBjYW5ub3Qgb3BlbiAuLi4uLi9yZWdyZXNzL3BpZGZpbGU6IFBlcm1pc3Npb24gZGVuaWVkIChlcnJvciAxMykiCisgICBNYWtlIHN1cmUgY2F0IGlzIHJ1biBieSAkU1VETy4gIG5vIG9iamVjdGlvbiBmcm9tIG1lLiBkam1ACisgLSAodGltKSBbYXV0aC5jXSBhZGQgY2FzdCB0byBxdWlldCBjb21waWxlci4gQ2hhbmdlIG9ubHkgYWZmZWN0cyBTVlI1IHN5c3RlbXMuCisKKzIwMTAwODA5CisgLSAoZGptKSBieiMxNTYxOiBkb24ndCBib3RoZXIgc2V0dGluZyBJRkZfVVAgb24gdHVuKDQpIGRldmljZSBpZiBpdCBpcworICAgYWxyZWFkeSBzZXQuIE1ha2VzIEZyZWVCU0QgdXNlciBvcGVuYWJsZSB0dW5uZWxzIHVzZWZ1bDsgcGF0Y2ggZnJvbQorICAgcmljaGFyZC5idXJha293c2tpK29zc2ggQVQgbXJidXJhay5uZXQsIG9rIGR0dWNrZXJACisgLSAoZHR1Y2tlcikgYnVnICMxNTMwOiBzdHJpcCB0cmFpbGluZyAiOiIgZnJvbSBob3N0bmFtZSBpbiBzc2gtY29weS1pZC4KKyAgIGJhc2VkIGluIHBhcnQgb24gYSBwYXRjaCBmcm9tIENvbGluIFdhdHNvbiwgb2sgZGptQAorCisyMDEwMDgwOQorIC0gT3BlbkJTRCBDVlMgU3luYworICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDgvMDggMTY6MjY6NDIKKyAgICAgW3ZlcnNpb24uaF0KKyAgICAgY3JhbmsgdG8gNS42CisgLSAoZGptKSBbUkVBRE1FIGNvbnRyaWIvY2FsZGVyYS9vcGVuc3NoLnNwZWMgY29udHJpYi9yZWRoYXQvb3BlbnNzaC5zcGVjXQorICAgW2NvbnRyaWIvc3VzZS9vcGVuc3NoLnNwZWNdIENyYW5rIHZlcnNpb24gbnVtYmVycworCisyMDEwMDgwNQorIC0gT3BlbkJTRCBDVlMgU3luYworICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDgvMDQgMDU6Mzc6MDEKKyAgICAgW3NzaC4xIHNzaF9jb25maWcuNSBzc2hkLjhdCisgICAgIFJlbW92ZSBtZW50aW9ucyBvZiB3ZWlyZCAiYWRkci9wb3J0IiBhbHRlcm5hdGUgYWRkcmVzcyBmb3JtYXQgZm9yIElQdjYKKyAgICAgYWRkcmVzc2VzIGNvbWJpbmF0aW9ucy4gSXQgaGFzbid0IHdvcmtlZCBmb3IgYWdlcyBhbmQgd2UgaGF2ZSBzdXBwb3J0ZWQKKyAgICAgdGhlIG1vcmUgY29tbWVuICJbYWRkcl06cG9ydCIgZm9ybWF0IGZvciBhIGxvbmcgdGltZS4gb2sgam1jQCBtYXJrdXNACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wOC8wNCAwNTo0MDozOQorICAgICBbUFJPVE9DT0wuY2VydGtleXMgc3NoLWtleWdlbi5jXQorICAgICB0aWdodGVuIHRoZSBydWxlcyBmb3IgY2VydGlmaWNhdGUgZW5jb2RpbmcgYnkgcmVxdWlyaW5nIHRoYXQgb3B0aW9ucworICAgICBhcHBlYXIgaW4gbGV4aWNhbCBvcmRlciBhbmQgbWFrZSBvdXIgc3NoLWtleWdlbiBjb21wbHkuIG9rIG1hcmt1c0AKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA4LzA0IDA1OjQyOjQ3CisgICAgIFthdXRoLmMgYXV0aDItaG9zdGJhc2VkLmMgYXV0aGZpbGUuYyBhdXRoZmlsZS5oIHNzaC1rZXlzaWduLjhdCisgICAgIFtzc2gta2V5c2lnbi5jIHNzaC5jXQorICAgICBlbmFibGUgY2VydGlmaWNhdGVzIGZvciBob3N0YmFzZWQgYXV0aGVudGljYXRpb24sIGZyb20gSWFpbiBNb3JnYW47CisgICAgICJsb29rcyBvayIgbWFya3VzQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDgvMDQgMDU6NDk6MjIKKyAgICAgW2F1dGhmaWxlLmNdCisgICAgIGNvbW1pdGVkIHRoZSB3cm9uZyB2ZXJzaW9uIG9mIHRoZSBob3N0YmFzZWQgY2VydGlmaWNhdGUgZGlmZjsgdGhpcworICAgICB2ZXJzaW9uIHJlcGxhY2VzIHNvbWUgc3RybGN7cHksYXR9IHZlcmJvc2l0eSB3aXRoIHhhc3ByaW50ZigpIGF0CisgICAgIHRoZSByZXF1ZXN0IG9mIG1hcmt1c0AKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA4LzA0IDA2OjA3OjExCisgICAgIFtzc2gta2V5Z2VuLjEgc3NoLWtleWdlbi5jXQorICAgICBTdXBwb3J0IENBIGtleXMgaW4gUEtDUyMxMSB0b2tlbnM7IGZlZWRiYWNrIGFuZCBvayBtYXJrdXNACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wOC8wNCAwNjowODo0MAorICAgICBbc3NoLWtleXNpZ24uY10KKyAgICAgY2xlYW4gZm9yIC1XdW5pbml0aWFsaXplZCAoSWQgc3luYyBvbmx5OyBwb3J0YWJsZSBoYWQgdGhpcyBjaGFuZ2UpCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wOC8wNSAxMzowODo0MgorICAgICBbY2hhbm5lbHMuY10KKyAgICAgRml4IGEgdHJpbyBvZiBidWdzIGluIHRoZSBsb2NhbC9yZW1vdGUgd2luZG93IGNhbGN1bGF0aW9uIGZvciBkYXRhZ3JhbQorICAgICBkYXRhIGNoYW5uZWxzIChpLmUuIFR1bm5lbEZvcndhcmQpOgorICAgICAKKyAgICAgQ2FsY3VsYXRlIGxvY2FsX2NvbnN1bWVkIGNvcnJlY3RseSBpbiBjaGFubmVsX2hhbmRsZV93ZmQoKSBieSBtZWFzdXJpbmcKKyAgICAgdGhlIGRlbHRhIHRvIGJ1ZmZlcl9sZW4oYy0+b3V0cHV0KSBmcm9tIHdoZW4gd2Ugc3RhcnQgdG8gd2hlbiB3ZSBmaW5pc2guCisgICAgIFRoZSBwcm94aW1hbCBwcm9ibGVtIGhlcmUgaXMgdGhhdCB0aGUgb3V0cHV0X2ZpbHRlciB3ZSB1c2UgaW4gcG9ydGFibGUKKyAgICAgbW9kaWZpZWQgdGhlIGxlbmd0aCBvZiB0aGUgZGVxdWV1ZWQgZGF0YWdyYW0gKHRvIGZ1dHogd2l0aCB0aGUgaGVhZGVycworICAgICBmb3IgIU9wZW5CU0QpLgorICAgICAKKyAgICAgSW4gY2hhbm5lbF9vdXRwdXRfcG9sbCgpLCBkb24ndCBlbnF1ZXVlIGRhdGFncmFtcyB0aGF0IHdvbid0IGZpdCBpbiB0aGUKKyAgICAgcGVlcidzIGFkdmVydGlzZWQgcGFja2V0IHNpemUgKGhpZ2hseSB1bmxpa2VseSB0byBldmVyIG9jY3VyKSBvciB3aGljaAorICAgICB3b24ndCBmaXQgaW4gdGhlIHBlZXIncyByZW1haW5pbmcgd2luZG93IChtb3JlIGxpa2VseSkuCisgICAgIAorICAgICBJbiBjaGFubmVsX2lucHV0X2RhdGEoKSwgYWNjb3VudCBmb3IgdGhlIDQtYnl0ZSBzdHJpbmcgaGVhZGVyIGluCisgICAgIGRhdGFncmFtIHBhY2tldHMgdGhhdCB3ZSBhY2NlcHQgZnJvbSB0aGUgcGVlciBhbmQgZW5xdWV1ZSBpbiBjLT5vdXRwdXQuCisgICAgIAorICAgICByZXBvcnQsIGFuYWx5c2lzIGFuZCB0ZXN0aW5nIDIvMyBjYXNlcyBmcm9tIHdpZXJib3dzIEFUIHVzLmlibS5jb207CisgICAgICJsb29rcyBnb29kIiBtYXJrdXNACisKKzIwMTAwODAzCisgLSAoZHR1Y2tlcikgW21vbml0b3IuY10gQnVnICMxNzk1OiBJbml0aWFsaXplIHRoZSB2YWx1ZXMgdG8gYmUgcmV0dXJuZWQgZnJvbQorICAgUEFNIHRvIHNhbmUgdmFsdWVzIGluIGNhc2UgdGhlIFBBTSBtZXRob2QgZG9lc24ndCB3cml0ZSB0byB0aGVtLiAgU3BvdHRlZCBieQorICAgQml0bWFuIFpob3UsIG9rIGRqbUAuCisgLSBPcGVuQlNEIENWUyBTeW5jCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNy8xNiAwNDo0NTozMAorICAgICBbc3NoLWtleWdlbi5jXQorICAgICBhdm9pZCBib2d1cyBjb21waWxlciB3YXJuaW5nCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNy8xNiAxNDowNzozNQorICAgICBbc3NoLXJzYS5jXQorICAgICBtb3JlIHRpbWluZyBwYXJhbm9pYSAtIGNvbXBhcmUgYWxsIHBhcnRzIG9mIHRoZSBleHBlY3RlZCBkZWNyeXB0ZWQKKyAgICAgZGF0YSBiZWZvcmUgcmV0dXJuaW5nLiBBRkFJSyBub3QgZXhwbG9pdGFibGUgaW4gdGhlIFNTSCBwcm90b2NvbC4KKyAgICAgImdyb292eSIgZGVyYWFkdEAKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA3LzE5IDAzOjE2OjMzCisgICAgIFtzZnRwLWNsaWVudC5jXQorICAgICBieiMxNzk3OiBmaXggc3dhcHBlZCBhcmdzIGluIHVwbG9hZF9kaXJfaW50ZXJuYWwoKSwgYnJlYWtpbmcgcmVjdXJzaXZlCisgICAgIHVwbG9hZCBkZXB0aCBjaGVja3MgYW5kIGNhdXNpbmcgdmVyYm9zZSBwcmludGluZyBvZiB0cmFuc2ZlcnMgdG8gYWx3YXlzCisgICAgIGJlIHR1cm5lZCBvbjsgcGF0Y2ggZnJvbSBpbW9yZ2FuIEFUIG5hcy5uYXNhLmdvdgorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDcvMTkgMDk6MTU6MTIKKyAgICAgW2NsaWVudGxvb3AuYyByZWFkY29uZi5jIHJlYWRjb25mLmggc3NoLmMgc3NoX2NvbmZpZy41XQorICAgICBhZGQgYSAiQ29udHJvbFBlcnNpc3QiIG9wdGlvbiB0aGF0IGF1dG9tYXRpY2FsbHkgc3RhcnRzIGEgYmFja2dyb3VuZAorICAgICBzc2goMSkgbXVsdGlwbGV4IG1hc3RlciB3aGVuIGNvbm5lY3RpbmcuIFRoaXMgY29ubmVjdGlvbiBjYW4gc3RheSBhbGl2ZQorICAgICBpbmRlZmluaXRlbHksIG9yIGNhbiBiZSBzZXQgdG8gYXV0b21hdGljYWxseSBjbG9zZSBhZnRlciBhIHVzZXItc3BlY2lmaWVkCisgICAgIGR1cmF0aW9uIG9mIGluYWN0aXZpdHkuIGJ6IzEzMzAgLSBwYXRjaCBieSBkd213MiBBVCBpbmZyYWRlYWQub3JnLCBidXQKKyAgICAgZnVydGhlciBoYWNrZWQgb24gYnkgd21lcnRlbnMgQVQgY2lzY28uY29tLCBhcGIgQVQgY2VxdXJ1eC5jb20sCisgICAgIG1hcnRpbi1taW5kcm90LWJ1Z3ppbGxhIEFUIGVhcnRoLmxpIGFuZCBteXNlbGY7ICJsb29rcyBvayIgbWFya3VzQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDcvMjEgMDI6MTA6NTgKKyAgICAgW21pc2MuY10KKyAgICAgc3luYyB0aW1pbmdzYWZlX2JjbXAoKSB3aXRoIHRoZSBvbmUgZGVtcHNreUAgY29tbWl0dGVkIHRvIHN5cy9saWIvbGlia2VybgorICAgLSBkdHVja2VyQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA3LzIzIDA4OjQ5OjI1CisgICAgIFtzc2guMV0KKyAgICAgQ2lwaGVycyBpcyBkb2N1bWVudGVkIGluIHNzaF9jb25maWcoNSkgdGhlc2UgZGF5cworCisyMDEwMDgxOQorIC0gKGR0dWNrZXIpIFtjb250cmliL3NzaC1jb3B5LXVkLjFdIEJ1ZyAjMTc4NjogdXBkYXRlIHNzaC1jb3B5LWlkLjEgd2l0aCBtb3JlCisgICBkZXRhaWxzIGFib3V0IGl0cyBiZWhhdmlvdXIgV1JUIGV4aXN0aW5nIGRpcmVjdG9yaWVzLiAgUGF0Y2ggZnJvbQorICAgYXNndXRocmllIGF0IGdtYWlsIGNvbSwgb2sgZGptLgorCisyMDEwMDcxNgorIC0gKGRqbSkgT3BlbkJTRCBDVlMgU3luYworICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDcvMDIgMDQ6MzI6NDQKKyAgICAgW21pc2MuY10KKyAgICAgdW5icmVhayBzdHJkZWxpbSgpIHNraXBwaW5nIHBhc3QgcXVvdGVkIHN0cmluZ3MsIGUuZy4KKyAgICAgQWxsb3dVc2VycyAiYmxhaCBibGFoIiBibGFoCisgICAgIHdhcyBicm9rZW47IHJlcG9ydCBhbmQgZml4IGluIGJ6IzE3NTcgZnJvbSBiaXRtYW4uemhvdSBBVCBjZW50cmlmeS5jb20KKyAgICAgb2sgZHR1Y2tlcjsKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA3LzEyIDIyOjM4OjUyCisgICAgIFtzc2guY10KKyAgICAgTWFrZSBFeGl0T25Gb3J3YXJkRmFpbHVyZSB3b3JrIHdpdGggZm9yay1hZnRlci1hdXRoZW50aWNhdGlvbiAoInNzaCAtZiIpCisgICAgIGZvciBwcm90b2NvbCAyLiBvayBtYXJrdXNACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNy8xMiAyMjo0MToxMworICAgICBbc3NoLmMgc3NoX2NvbmZpZy41XQorICAgICBleHBhbmQgJWggdG8gdGhlIGhvc3RuYW1lIGluIHNzaF9jb25maWcgSG9zdG5hbWUgb3B0aW9ucy4gV2hpbGUgdGhpcworICAgICBzb3VuZHMgdXNlbGVzcywgaXQgaXMgYWN0dWFsbHkgaGFuZHkgZm9yIHdvcmtpbmcgd2l0aCB1bnF1YWxpZmllZAorICAgICBob3N0bmFtZXM6CisgICAgIAorICAgICBIb3N0ICouKgorICAgICAgICBIb3N0bmFtZSAlaAorICAgICBIb3N0ICoKKyAgICAgICAgSG9zdG5hbWUgJWguZXhhbXBsZS5vcmcKKyAgICAgCisgICAgICJJIGxpa2UgaXQiIG1hcmt1c0AKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA3LzEzIDExOjUyOjA2CisgICAgIFthdXRoLXJzYS5jIGNoYW5uZWxzLmMganBha2UuYyBrZXkuYyBtaXNjLmMgbWlzYy5oIG1vbml0b3IuY10KKyAgICAgW3BhY2tldC5jIHNzaC1yc2EuY10KKyAgICAgaW1wbGVtZW50IGEgdGltaW5nX3NhZmVfY21wKCkgZnVuY3Rpb24gdG8gY29tcGFyZSBtZW1vcnkgd2l0aG91dCBsZWFraW5nCisgICAgIHRpbWluZyBpbmZvcm1hdGlvbiBieSBzaG9ydC1jaXJjdWl0aW5nIGxpa2UgbWVtY21wKCkgYW5kIHVzZSBpdCBmb3IKKyAgICAgc29tZSBvZiB0aGUgbW9yZSBzZW5zaXRpdmUgY29tcGFyaXNvbnMgKHRob3VnaCBub3RoaW5nIGhpZ2gtdmFsdWUgd2FzCisgICAgIHJlYWRpbHkgYXR0YWNrYWJsZSBhbnl3YXkpOyAibG9va3Mgb2siIG1hcmt1c0AKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA3LzEzIDIzOjEzOjE2CisgICAgIFthdXRoLXJzYS5jIGNoYW5uZWxzLmMganBha2UuYyBrZXkuYyBtaXNjLmMgbWlzYy5oIG1vbml0b3IuYyBwYWNrZXQuY10KKyAgICAgW3NzaC1yc2EuY10KKyAgICAgcy90aW1pbmdfc2FmZV9jbXAvdGltaW5nc2FmZV9iY21wL2cKKyAgIC0gam1jQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA3LzE0IDE3OjA2OjU4CisgICAgIFtzc2guMV0KKyAgICAgZmluYWxseSBzc2ggc3lub3BzaXMgbG9va3MgbmljZSBhZ2FpbiEgdGhpcyBjb21taXQganVzdCByZW1vdmVzIGEgdG9uIG9mCisgICAgIGhhY2tzIHdlIGhhZCBpbiBwbGFjZSB0byBtYWtlIGl0IHdvcmsgd2l0aCBvbGQgZ3JvZmY7CisgICAtIHNjaHdhcnplQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA3LzE1IDIxOjIwOjM4CisgICAgIFtzc2gta2V5Z2VuLjFdCisgICAgIHJlcGFpciBpbmNvcnJlY3QgYmxvY2sgbmVzdGluZywgd2hpY2ggc2NyZXdlZCB1cCBpbmRlbnRhdGlvbjsKKyAgICAgcHJvYmxlbSByZXBvcnRlZCBhbmQgZml4IE9LIGJ5IGptY0AKKworMjAxMDA3MTQKKyAtICh0aW0pIFtjb250cmliL3JlZGhhdC9vcGVuc3NoLnNwZWNdIEJ1ZyAxNzk2OiBUZXN0IGZvciBza2lwX3gxMV9hc2twYXNzCisgICAobGluZSA3Nykgc2hvdWxkIGhhdmUgYmVlbiBmb3Igbm9feDExX2Fza3Bhc3MuIAorCisyMDEwMDcwMgorIC0gKGRqbSkgT3BlbkJTRCBDVlMgU3luYworICAgLSBqbWNAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDYvMjYgMDA6NTc6MDcKKyAgICAgW3NzaF9jb25maWcuNV0KKyAgICAgdHdlYWsgcHJldmlvdXM7CisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNi8yNiAyMzowNDowNAorICAgICBbc3NoLmNdCisgICAgIG9vcHMsIGZvcmdvdCB0byAjaW5jbHVkZSA8Y2Fub2hvc3QuaD47IHNwb3R0ZWQgYW5kIHBhdGNoIGZyb20gY2hsQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDYvMjkgMjM6MTU6MzAKKyAgICAgW3NzaC1rZXlnZW4uMSBzc2gta2V5Z2VuLmNdCisgICAgIGFsbG93IGltcG9ydCAoLWkpIGFuZCBleHBvcnQgKC1lKSBvZiBQRU0gYW5kIFBLQ1MjOCBlbmNvZGVkIGtleXM7CisgICAgIGJ6IzE3NDk7IG9rIG1hcmt1c0AKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA2LzI5IDIzOjE2OjQ2CisgICAgIFthdXRoMi1wdWJrZXkuYyBzc2hkX2NvbmZpZy41XQorICAgICBhbGxvdyBrZXkgb3B0aW9ucyAoY29tbWFuZD0iLi4uIiBhbmQgZnJpZW5kcykgaW4gQXV0aG9yaXplZFByaW5jaXBhbHM7CisgICAgIG9rIG1hcmt1c0AKKyAgIC0gam1jQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA2LzMwIDA3OjI0OjI1CisgICAgIFtzc2gta2V5Z2VuLjFdCisgICAgIHR3ZWFrIHByZXZpb3VzOworICAgLSBqbWNAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDYvMzAgMDc6MjY6MDMKKyAgICAgW3NzaC1rZXlnZW4uY10KKyAgICAgc29ydCB1c2FnZSgpOworICAgLSBqbWNAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDYvMzAgMDc6Mjg6MzQKKyAgICAgW3NzaGRfY29uZmlnLjVdCisgICAgIHR3ZWFrIHByZXZpb3VzOworICAgLSBtaWxsZXJ0QGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA3LzAxIDEzOjA2OjU5CisgICAgIFtzY3AuY10KKyAgICAgRml4IGEgbG9uZ3N0YW5kaW5nIHByb2JsZW0gd2hlcmUgaWYgeW91IHN1c3BlbmQgc2NwIGF0IHRoZQorICAgICBwYXNzd29yZC9wYXNzcGhyYXNlIHByb21wdCB0aGUgdGVybWluYWwgbW9kZSBpcyBub3QgcmVzdG9yZWQuCisgICAgIE9LIGRqbUAKKyAgIC0gcGhlc3NsZXJAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDYvMjcgMTk6MTk6NTYKKyAgICAgW3JlZ3Jlc3MvTWFrZWZpbGVdCisgICAgIGZpeCBob3cgd2UgcnVuIHRoZSB0ZXN0cyBzbyB3ZSBjYW4gc3VjY2Vzc2Z1bGx5IHVzZSBTVURPPSdzdWRvIC1FJworICAgICBpbiBvdXIgZW52CisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNi8yOSAyMzo1OTo1NAorICAgICBbY2VydC11c2Vya2V5LnNoXQorICAgICByZWdyZXNzIHRlc3RzIGZvciBrZXkgb3B0aW9ucyBpbiBBdXRob3JpemVkUHJpbmNpcGFscworCisyMDEwMDYyNworIC0gKHRpbSkgW29wZW5ic2QtY29tcGF0L3BvcnQtdXcuY10gUmVvcmRlciBpbmNsdWRlcy4gYXV0aC1vcHRpb25zLmggbm93IG5lZWRzCisgICBrZXkuaC4KKworMjAxMDA2MjYKKyAtIChkam0pIE9wZW5CU0QgQ1ZTIFN5bmMKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA1LzIxIDA1OjAwOjM2CisgICAgIFttaXNjLmNdCisgICAgIGNvbG9uKCkgcmV0dXJucyBjaGFyKiwgc28gcy9yZXR1cm4gKDApL3JldHVybiBOVUxMLworICAgLSBtYXJrdXNAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDYvMDggMjE6MzI6MTkKKyAgICAgW3NzaC1wa2NzMTEuY10KKyAgICAgY2hlY2sgbGVuZ3RoIG9mIHZhbHVlIHJldHVybmVkICBDX0dldEF0dHJpYnV0VmFsdWUgZm9yICE9IDAKKyAgICAgZnJvbSBtZHJ0YnVnemlsbGFAY29kZWZpdmUuY28udWs7IGJ1Z3ppbGxhICMxNzczOyBvayBkdHVja2VyQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDYvMTcgMDc6MDc6MzAKKyAgICAgW211eC5jXQorICAgICBDb3JyZWN0IHNpemluZyBvZiBvYmplY3QgdG8gYmUgYWxsb2NhdGVkIGJ5IGNhbGxvYygpLCByZXBsYWNpbmcKKyAgICAgc2l6ZW9mKHN0YXRlKSB3aXRoIHNpemVvZigqc3RhdGUpLiBUaGlzIHdvcmtlZCBieSBhY2NpZGVudCBzaW5jZQorICAgICB0aGUgc3RydWN0IGNvbnRhaW5lZCBhIHNpbmdsZSBpbnQgYXQgcHJlc2VudCwgYnV0IGNvdWxkIGhhdmUgYnJva2VuCisgICAgIGluIHRoZSBmdXR1cmUuIHBhdGNoIGZyb20gaHljIEFUIHN5bWFzLmNvbQorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDYvMTggMDA6NTg6MzkKKyAgICAgW3NmdHAuY10KKyAgICAgdW5icmVhayBscyBpbiB3b3JraW5nIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbnMgZ2xvYmJpbmcgY2hhcmFjdGVycyBpbgorICAgICB0aGVpciBwYXRobmFtZXMuIGJ6IzE2NTUgcmVwb3J0ZWQgYnkgdmdpZmZpbiBBVCBhcHBsZS5jb20KKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA2LzE4IDAzOjE2OjAzCisgICAgIFtzZXNzaW9uLmNdCisgICAgIE1pc3NpbmcgY2hlY2sgZm9yIGNocm9vdF9kaXJlY3RvciA9PSAibm9uZSIgKHdlIGFscmVhZHkgY2hlY2tlZCBhZ2FpbnN0CisgICAgIE5VTEwpOyBieiMxNTY0IGZyb20gSmFuLlBlY2hhbmVjIEFUIFN1bi5DT00KKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA2LzE4IDA0OjQzOjA4CisgICAgIFtzZnRwLWNsaWVudC5jXQorICAgICBmaXggbWVtb3J5IGxlYWsgaW4gZG9fcmVhbHBhdGgoKSBlcnJvciBwYXRoOyBieiMxNzcxLCBwYXRjaCBmcm9tCisgICAgIGFuaWNrYSBBVCBzdXNlLmN6CisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNi8yMiAwNDoyMjo1OQorICAgICBbc2VydmNvbmYuYyBzc2hkX2NvbmZpZy41XQorICAgICBleHBvc2Ugc29tZSBtb3JlIHNzaGRfY29uZmlnIG9wdGlvbnMgaW5zaWRlIE1hdGNoIGJsb2NrczoKKyAgICAgICBBdXRob3JpemVkS2V5c0ZpbGUgQXV0aG9yaXplZFByaW5jaXBhbHNGaWxlCisgICAgICAgSG9zdGJhc2VkVXNlc05hbWVGcm9tUGFja2V0T25seSBQZXJtaXRUdW5uZWwKKyAgICAgYnojMTc2NDsgZmVlZGJhY2sgZnJvbSBpbW9yZ2FuIEFUIG5hcy5uYXNhLmdvdjsgb2sgZHR1Y2tlckAKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA2LzIyIDA0OjMyOjA2CisgICAgIFtzc2gta2V5Z2VuLmNdCisgICAgIHN0YW5kYXJkaXNlIGVycm9yIG1lc3NhZ2VzIHdoZW4gYXR0ZW1wdGluZyB0byBvcGVuIHByaXZhdGUga2V5CisgICAgIGZpbGVzIHRvIGluY2x1ZGUgInByb2duYW1lOiBmaWxlbmFtZTogZXJyb3IgcmVhc29uIgorICAgICBieiMxNzgzOyBvayBkdHVja2VyQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDYvMjIgMDQ6NDk6NDcKKyAgICAgW2F1dGguY10KKyAgICAgcXVldWUgYXV0aCBkZWJ1ZyBtZXNzYWdlcyBmb3IgYmFkIG93bmVyc2hpcCBvciBwZXJtaXNzaW9ucyBvbiB0aGUgdXNlcidzCisgICAgIGtleWZpbGVzLiBUaGVzZSBtZXNzYWdlcyB3aWxsIGJlIHNlbnQgYWZ0ZXIgdGhlIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseQorICAgICBhdXRoZW50aWNhdGVkICh3aGVyZSBvdXIgY2xpZW50IHdpbGwgZGlzcGxheSB0aGVtIHdpdGggTG9nTGV2ZWw9ZGVidWcpLgorICAgICBieiMxNTU0OyBvayBkdHVja2VyQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDYvMjIgMDQ6NTQ6MzAKKyAgICAgW3NzaC1rZXlzY2FuLmNdCisgICAgIHJlcGxhY2UgdmVyYm9zZSBhbmQgb3ZlcmZsb3ctcHJvbmUgTGluZWJ1ZiBjb2RlIHdpdGggcmVhZF9rZXlmaWxlX2xpbmUoKQorICAgICBiYXNlZCBvbiBwYXRjaCBmcm9tIGpvYWNoaW0gQVQgam9hY2hpbXNjaGlwcGVyLm5sOyBieiMxNTY1OyBvayBkdHVja2VyQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDYvMjIgMDQ6NTk6MTIKKyAgICAgW3Nlc3Npb24uY10KKyAgICAgaW5jbHVkZSB0aGUgdXNlciBuYW1lIG9uICJzdWJzeXN0ZW0gcmVxdWVzdCBmb3IgLi4uIiBsb2cgbWVzc2FnZXM7CisgICAgIGJ6IzE1NzE7IG9rIGR0dWNrZXJACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNi8yMyAwMjo1OTowMgorICAgICBbc3NoLWtleWdlbi5jXQorICAgICBmaXggcHJpbnRpbmcgb2YgZXh0ZW5zaW9ucyBpbiB2MDEgY2VydGlmaWNhdGVzIHRoYXQgSSBicm9rZSBpbiByMS4xOTAKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA2LzI1IDA3OjE0OjQ2CisgICAgIFtjaGFubmVscy5jIG11eC5jIHJlYWRjb25mLmMgcmVhZGNvbmYuaCBzc2guaF0KKyAgICAgYnojMTMyNzogcmVtb3ZlIGhhcmRjb2RlZCBsaW1pdCBvZiAxMDAgcGVybWl0b3BlbiBjbGF1c2VzIGFuZCBwb3J0CisgICAgIGZvcndhcmRzIHBlciBkaXJlY3Rpb247IG9rIG1hcmt1c0Agc3RldmVza0AKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA2LzI1IDA3OjIwOjA0CisgICAgIFtjaGFubmVscy5jIHNlc3Npb24uY10KKyAgICAgYnojMTc1MDogZml4IHJlcXVpcmVtZW50IGZvciAvZGV2L251bGwgaW5zaWRlIENocm9vdERpcmVjdG9yeSBmb3IKKyAgICAgaW50ZXJuYWwtc2Z0cCBhY2NpZGVudGFsbHkgaW50cm9kdWNlZCBpbiByMS4yNTMgYnkgcmVtb3ZpbmcgdGhlIGNvZGUKKyAgICAgdGhhdCBvcGVucyBhbmQgZHVwIC9kZXYvbnVsbCB0byBzdGRlcnIgYW5kIG1vZGlmeWluZyB0aGUgY2hhbm5lbHMgY29kZQorICAgICB0byByZWFkIHN0ZGVyciBidXQgZGlzY2FyZCBpdCBpbnN0ZWFkOyBvayBtYXJrdXNACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNi8yNSAwODo0NjoxNworICAgICBbYXV0aDEuYyBhdXRoMi1ub25lLmNdCisgICAgIHNraXAgdGhlIGluaXRpYWwgY2hlY2sgZm9yIGFjY2VzcyB3aXRoIGFuIGVtcHR5IHBhc3N3b3JkIHdoZW4KKyAgICAgUGVybWl0RW1wdHlQYXNzd29yZHM9bm87IGJ6IzE2Mzg7IG9rIG1hcmt1c0AKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA2LzI1IDIzOjEwOjMwCisgICAgIFtzc2guY10KKyAgICAgbG9nIHRoZSBob3N0bmFtZSBhbmQgYWRkcmVzcyB0aGF0IHdlIGNvbm5lY3RlZCB0byBhdCBMb2dMZXZlbD12ZXJib3NlCisgICAgIGFmdGVyIGF1dGhlbnRpY2F0aW9uIGlzIHN1Y2Nlc3NmdWwgdG8gbWl0aWdhdGUgInBoaXNoaW5nIiBhdHRhY2tzIGJ5CisgICAgIHNlcnZlcnMgd2l0aCB0cnVzdGVkIGtleXMgdGhhdCBhY2NlcHQgYXV0aGVudGljYXRpb24gc2lsZW50bHkgYW5kCisgICAgIGF1dG9tYXRpY2FsbHkgYmVmb3JlIHByZXNlbnRpbmcgZmFrZSBwYXNzd29yZC9wYXNzcGhyYXNlIHByb21wdHM7CisgICAgICJuaWNlISIgbWFya3VzQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDYvMjUgMjM6MTA6MzAKKyAgICAgW3NzaC5jXQorICAgICBsb2cgdGhlIGhvc3RuYW1lIGFuZCBhZGRyZXNzIHRoYXQgd2UgY29ubmVjdGVkIHRvIGF0IExvZ0xldmVsPXZlcmJvc2UKKyAgICAgYWZ0ZXIgYXV0aGVudGljYXRpb24gaXMgc3VjY2Vzc2Z1bCB0byBtaXRpZ2F0ZSAicGhpc2hpbmciIGF0dGFja3MgYnkKKyAgICAgc2VydmVycyB3aXRoIHRydXN0ZWQga2V5cyB0aGF0IGFjY2VwdCBhdXRoZW50aWNhdGlvbiBzaWxlbnRseSBhbmQKKyAgICAgYXV0b21hdGljYWxseSBiZWZvcmUgcHJlc2VudGluZyBmYWtlIHBhc3N3b3JkL3Bhc3NwaHJhc2UgcHJvbXB0czsKKyAgICAgIm5pY2UhIiBtYXJrdXNACisKKzIwMTAwNjIyCisgLSAoZGptKSBbbG9naW5yZWMuY10gY3JhbmsgTElORk9fTkFNRVNJWkUgKHVzZXJuYW1lIGxlbmd0aCkgdG8gNTEyCisgICBieiMxNTc5OyBvayBkdHVja2VyCisKKzIwMTAwNjE4CisgLSAoZGptKSBbY29udHJpYi9zc2gtY29weS1pZF0gVXBkYXRlIGtleSBmaWxlIGV4cGxpY2l0bHkgdW5kZXIgfgorICAgcmF0aGVyIHRoYW4gYXNzdW1pbmcgdGhhdCAkQ1dEID09ICRIT01FLiBieiMxNTAwLCBwYXRjaCBmcm9tCisgICB0aW1vdGh5IEFUIGdlbHRlci5jb20KKworMjAxMDA2MTcKKyAtICh0aW0pIFtjb250cmliL2N5Z3dpbi9SRUFETUVdIFJlbW92ZSBhIHJlZmVyZW5jZSB0byB0aGUgb2Jzb2xldGUKKyAgIG1pbmlyZXMtZGV2ZWwgcGFja2FnZSwgYW5kIHRvIGFkZCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBsaWJlZGl0LWRldmVsCisgICBwYWNrYWdlIHNpbmNlIENZZ3dpbiBub3cgcHJvdmlkZXMgbGliZWRpdC4gUGF0Y2ggZnJvbSBDb3Jpbm5hIFZpbnNjaGVuLgorCisyMDEwMDUyMQorIC0gKGRqbSkgT3BlbkJTRCBDVlMgU3luYworICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDUvMDcgMTE6MzE6MjYKKyAgICAgW3JlZ3Jlc3MvTWFrZWZpbGUgcmVncmVzcy9jZXJ0LXVzZXJrZXkuc2hdCisgICAgIHJlZ3Jlc3MgdGVzdHMgZm9yIEF1dGhvcml6ZWRQcmluY2lwYWxzRmlsZSBhbmQgInByaW5jaXBhbHM9IiBrZXkgb3B0aW9uLgorICAgICBmZWVkYmFjayBhbmQgb2sgbWFya3VzQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDUvMTEgMDI6NTg6MDQKKyAgICAgW2F1dGgtcnNhLmNdCisgICAgIGRvbid0IGFjY2VwdCBjZXJ0aWZpY2F0ZXMgbWFya2VkIGFzICJjZXJ0LWF1dGhvcml0eSIgaGVyZTsgb2sgbWFya3VzQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDUvMTQgMDA6NDc6MjIKKyAgICAgW3NzaC1hZGQuY10KKyAgICAgY2hlY2sgdGhhdCB0aGUgY2VydGlmaWNhdGUgbWF0Y2hlcyB0aGUgY29ycmVzcG9uZGluZyBwcml2YXRlIGtleSBiZWZvcmUKKyAgICAgZ3JhZnRpbmcgaXQgb24KKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA1LzE0IDIzOjI5OjIzCisgICAgIFtjaGFubmVscy5jIGNoYW5uZWxzLmggbXV4LmMgc3NoLmNdCisgICAgIFBhdXNlIHRoZSBtdXggY2hhbm5lbCB3aGlsZSB3YWl0aW5nIGZvciByZXBseSBmcm9tIGF5bmNoIGNhbGxiYWNrcy4KKyAgICAgUHJldmVudHMgbWlzb3JkZXJpbmcgb2YgcmVwbGllcyBpZiBuZXcgcmVxdWVzdHMgYXJyaXZlIHdoaWxlIHdhaXRpbmcuCisgICAgIAorICAgICBFeHRlbmQgY2hhbm5lbCBvcGVuIGNvbmZpcm0gY2FsbGJhY2sgdG8gYWxsb3cgc2lnbmFsbGluZyBmYWlsdXJlCisgICAgIGNvbmRpdGlvbnMgYXMgd2VsbCBhcyBzdWNjZXNzLiBVc2UgdGhpcyB0byAxKSBmaXggYSBtZW1vcnkgbGVhaywgMikKKyAgICAgc3RhcnQgdXNpbmcgdGhlIGFib3ZlIHBhdXNlIG1lY2hhbmlzbSBhbmQgMykgZGVsYXkgc2VuZGluZyBhIHN1Y2Nlc3MvCisgICAgIGZhaWx1cmUgbWVzc2FnZSBvbiBtdXggc2xhdmUgc2Vzc2lvbiBvcGVuIHVudGlsIHdlIHJlY2VpdmUgYSByZXBseSBmcm9tCisgICAgIHRoZSBzZXJ2ZXIuCisgICAgIAorICAgICBtb3RpdmF0ZWQgYnkgYW5kIHdpdGggZmVlZGJhY2sgZnJvbSBtYXJrdXNACisgICAtIG1hcmt1c0BjdnMub3BlbmJzZC5vcmcgMjAxMC8wNS8xNiAxMjo1NTo1MQorICAgICBbUFJPVE9DT0wubXV4IGNsaWVudGxvb3AuaCBtdXguYyByZWFkY29uZi5jIHJlYWRjb25mLmggc3NoLjEgc3NoLmNdCisgICAgIG11eCBzdXBwb3J0IGZvciByZW1vdGUgZm9yd2FyZGluZyB3aXRoIGR5bmFtaWMgcG9ydCBhbGxvY2F0aW9uLAorICAgICB1c2Ugd2l0aAorICAgICAgICBMUE9SVD1gc3NoIC1TIG11eHNvY2tldCAtUjA6bG9jYWxob3N0OjI1IC1PIGZvcndhcmQgc29tZWhvc3RgCisgICAgIGZlZWRiYWNrIGFuZCBvayBkam1ACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNS8yMCAxMToyNToyNgorICAgICBbYXV0aDItcHVia2V5LmNdCisgICAgIGZpeCBsb2dzcGFtIHdoZW4ga2V5IG9wdGlvbnMgKGZyb209Ii4uLiIgZXNwZWNpYWxseSkgZGVueSBub24tbWF0Y2hpbmcKKyAgICAga2V5czsgcmVwb3J0ZWQgYnkgaGVubmluZ0AgYWxzbyBieiMxNzY1OyBvayBtYXJrdXNAIGR0dWNrZXJACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNS8yMCAyMzo0NjowMgorICAgICBbUFJPVE9DT0wuY2VydGtleXMgYXV0aC1vcHRpb25zLmMgc3NoLWtleWdlbi5jXQorICAgICBNb3ZlIHRoZSBwZXJtaXQtKiBvcHRpb25zIHRvIHRoZSBub24tY3JpdGljYWwgImV4dGVuc2lvbnMiIGZpZWxkIGZvciB2MDEKKyAgICAgY2VydGlmaWNhdGVzLiBUaGUgbG9naWMgaXMgdGhhdCBpZiBhbm90aGVyIGltcGxlbWVudGF0aW9uIGZhaWxzIHRvCisgICAgIGltcGxlbWVudCB0aGVtIHRoZW4gdGhlIGNvbm5lY3Rpb24ganVzdCBsb3NlcyBmZWF0dXJlcyByYXRoZXIgdGhhbiBmYWlscworICAgICBvdXRyaWdodC4KKyAgICAgCisgICAgIG9rIG1hcmt1c0AKKworMjAxMDA1MTEKKyAtIChkdHVja2VyKSBbTWFrZWZpbGUuaW5dIEJ1ZyAjMTc3MDogTGluayBsaWJvcGVuYnNkLWNvbXBhdCB0d2ljZSB0byBzb2x2ZQorICAgY2lyY3VsYXIgZGVwZW5kZW5jeSBwcm9ibGVtIG9uIG9sZCBvciBvZGQgcGxhdGZvcm1zLiAgRnJvbSBUb20gTGFuZSwgb2sKKyAgIGRqbUAuCisgLSAoZGptKSBbb3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQuaF0gRml4IGJ1aWxkIGJyZWFrYWdlIG9uIG9sZGVyCisgICBsaWJjcnlwdG8gYnkgZGVmaW5pbmcgT1BFTlNTTF9bRFJdU0FfTUFYX01PRFVMVVNfQklUUyBpZiB0aGV5IGFyZW4ndAorICAgYWxyZWFkeS4gb2sgZHR1Y2tlckAKKworMjAxMDA1MTAKKyAtIE9wZW5CU0QgQ1ZTIFN5bmMKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA0LzIzIDAxOjQ3OjQxCisgICAgIFtzc2gta2V5Z2VuLmNdCisgICAgIGJ6IzE3NDA6IGRpc3BsYXkgYSBtb3JlIGhlbHBmdWwgZXJyb3IgbWVzc2FnZSB3aGVuICRIT01FIGlzCisgICAgIGluYWNjZXNzaWJsZSB3aGlsZSB0cnlpbmcgdG8gY3JlYXRlIC5zc2ggZGlyZWN0b3J5LiBCYXNlZCBvbiBwYXRjaAorICAgICBmcm9tIGpjaGFkaW1hIEFUIHJlZGhhdC5jb207IG9rIGR0dWNrZXJACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNC8yMyAyMjoyNzozOAorICAgICBbbXV4LmNdCisgICAgIHNldCAiZGV0YWNoX2Nsb3NlIiBmbGFnIHdoZW4gcmVnaXN0ZXJpbmcgY2hhbm5lbCBjbGVhbnVwIGNhbGxiYWNrcy4KKyAgICAgVGhpcyBjYXVzZXMgdGhlIGNoYW5uZWwgdG8gY2xvc2Ugbm9ybWFsbHkgd2hlbiBpdHMgZmRzIGNsb3NlIGFuZAorICAgICBoYW5ncyB3aGVuIHRlcm1pbmF0aW5nIGEgbXV4IHNsYXZlIHVzaW5nIH4uIGJ6IzE3NTg7IG9rIG1hcmt1c0AKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA0LzIzIDIyOjQyOjA1CisgICAgIFtzZXNzaW9uLmNdCisgICAgIHNldCBzdGRlcnIgdG8gL2Rldi9udWxsIGZvciBzdWJzeXN0ZW1zIHJhdGhlciB0aGFuIGp1c3QgY2xvc2luZyBpdC4KKyAgICAgYXZvaWRzIGhhbmdzIGlmIGEgc3Vic3lzdGVtIG9yIHNoZWxsIGluaXRpYWxpc2F0aW9uIHdyaXRlcyB0byBzdGRlcnIuCisgICAgIGJ6IzE3NTA7IG9rIG1hcmt1c0AKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA0LzIzIDIyOjQ4OjMxCisgICAgIFtzc2gta2V5Z2VuLmNdCisgICAgIHJlZnVzZSB0byBnZW5lcmF0ZSBrZXlzIGxvbmdlciB0aGFuIE9QRU5TU0xfW1JEXVNBX01BWF9NT0RVTFVTX0JJVFMsCisgICAgIHNpbmNlIHdlIHdvdWxkIHJlZnVzZSB0byB1c2UgdGhlbSBhbnl3YXkuIGJ6IzE1MTY7IG9rIGR0dWNrZXJACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNC8yNiAyMjoyODoyNAorICAgICBbc3NoY29ubmVjdDIuY10KKyAgICAgYnojMTUwMjogYXV0aGN0eHQuc3VjY2VzcyBpcyBkZWNsYXJlZCBhcyBhbiBpbnQsIGJ1dCBwYXNzZWQgYnkKKyAgICAgcmVmZXJlbmNlIHRvIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBzaWdfYXRvbWljX3QqLiBDb252ZXJ0IGl0IHRvCisgICAgIHRoZSBsYXR0ZXI7IG9rIG1hcmt1c0AgZHR1Y2tlckAKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA1LzAxIDAyOjUwOjUwCisgICAgIFtQUk9UT0NPTC5jZXJ0a2V5c10KKyAgICAgdHlwbzsgam1lbHR6ZXJACisgICAtIGR0dWNrZXJAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDUvMDUgMDQ6MjI6MDkKKyAgICAgW3NmdHAuY10KKyAgICAgcmVzdG9yZSBtcHV0IGFuZCBtZ2V0IHdoaWNoIGdvdCBsb3N0IGluIHRoZSB0YWItY29tcGxldGlvbiBjaGFuZ2VzLgorICAgICBmb3VuZCBieSBLZW5uZXRoIFdoaXRha2VyLCBvayBkam1ACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNS8wNyAxMTozMDozMAorICAgICBbYXV0aC1vcHRpb25zLmMgYXV0aC1vcHRpb25zLmggYXV0aC5jIGF1dGguaCBhdXRoMi1wdWJrZXkuY10KKyAgICAgW2tleS5jIHNlcnZjb25mLmMgc2VydmNvbmYuaCBzc2hkLjggc3NoZF9jb25maWcuNV0KKyAgICAgYWRkIHNvbWUgb3B0aW9uYWwgaW5kaXJlY3Rpb24gdG8gbWF0Y2hpbmcgb2YgcHJpbmNpcGFsIG5hbWVzIGxpc3RlZAorICAgICBpbiBjZXJ0aWZpY2F0ZXMuIEN1cnJlbnRseSwgYSBjZXJ0aWZpY2F0ZSBtdXN0IGluY2x1ZGUgdGhlIGEgdXNlcidzIG5hbWUKKyAgICAgdG8gYmUgYWNjZXB0ZWQgZm9yIGF1dGhlbnRpY2F0aW9uLiBUaGlzIGNoYW5nZSBhZGRzIHRoZSBhYmlsaXR5IHRvCisgICAgIHNwZWNpZnkgYSBsaXN0IG9mIGNlcnRpZmljYXRlIHByaW5jaXBhbCBuYW1lcyB0aGF0IGFyZSBhY2NlcHRhYmxlLgorICAgICAKKyAgICAgV2hlbiBhdXRoZW50aWNhdGluZyB1c2luZyBhIENBIHRydXN0ZWQgdGhyb3VnaCB+Ly5zc2gvYXV0aG9yaXplZF9rZXlzLAorICAgICB0aGlzIGFkZHMgYSBuZXcgcHJpbmNpcGFscz0ibmFtZTFbLG5hbWUyLC4uLl0iIGtleSBvcHRpb24uCisgICAgIAorICAgICBGb3IgQ0FzIGxpc3RlZCB0aHJvdWdoIHNzaGRfY29uZmlnJ3MgVHJ1c3RlZENBS2V5cyBvcHRpb24sIGEgbmV3IGNvbmZpZworICAgICBvcHRpb24gIkF1dGhvcml6ZWRQcmluY2lwYWxzRmlsZSIgc3BlY2lmaWVzIGEgcGVyLXVzZXIgZmlsZSBjb250YWluaW5nCisgICAgIHRoZSBsaXN0IG9mIGFjY2VwdGFibGUgbmFtZXMuCisgICAgIAorICAgICBJZiBlaXRoZXIgb3B0aW9uIGlzIGFic2VudCwgdGhlIGN1cnJlbnQgYmVoYXZpb3VyIG9mIHJlcXVpcmluZyB0aGUKKyAgICAgdXNlcm5hbWUgdG8gYXBwZWFyIGluIHByaW5jaXBhbHMgY29udGludWVzIHRvIGFwcGx5LgorICAgICAKKyAgICAgVGhlc2Ugb3B0aW9ucyBhcmUgdXNlZnVsIGZvciByb2xlIGFjY291bnRzLCBkaXNqb2ludCBhY2NvdW50IG5hbWVzcGFjZXMKKyAgICAgYW5kICJ1c2VyQHJlYWxtIi1zdHlsZSBuYW1pbmcgcG9saWNpZXMgaW4gY2VydGlmaWNhdGVzLgorICAgICAKKyAgICAgZmVlZGJhY2sgYW5kIG9rIG1hcmt1c0AKKyAgIC0gam1jQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA1LzA3IDEyOjQ5OjE3CisgICAgIFtzc2hkX2NvbmZpZy41XQorICAgICB0d2VhayBwcmV2aW91czsKKworMjAxMDA0MjMKKyAtIChkdHVja2VyKSBbY29uZmlndXJlLmFjXSBCdWcgIzE3NTY6IENoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIGEgbGliNjQgZGlyCisgICBpbiB0aGUgb3BlbnNzbCBpbnN0YWxsIGRpcmVjdG9yeSAoc29tZSBuZXdlciBvcGVuc3NsIHZlcnNpb25zIGRvIHRoaXMgb24gYXQKKyAgIGxlYXN0IHNvbWUgYW1kNjQgcGxhdGZvcm1zKS4KKworMjAxMDA0MTgKKyAtIE9wZW5CU0QgQ1ZTIFN5bmMKKyAgIC0gam1jQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA0LzE2IDA2OjQ1OjAxCisgICAgIFtzc2hfY29uZmlnLjVdCisgICAgIHR3ZWFrIHByZXZpb3VzOyBvayBkam0KKyAgIC0gam1jQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA0LzE2IDA2OjQ3OjA0CisgICAgIFtzc2gta2V5Z2VuLjEgc3NoLWtleWdlbi5jXQorICAgICB0d2VhayBwcmV2aW91czsgb2sgZGptCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNC8xNiAyMToxNDoyNworICAgICBbc3NoY29ubmVjdC5jXQorICAgICBvb3BzLCAlciA9PiByZW1vdGUgdXNlcm5hbWUsIG5vdCAldQorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDQvMTYgMDE6NTg6NDUKKyAgICAgW3JlZ3Jlc3MvY2VydC1ob3N0a2V5LnNoIHJlZ3Jlc3MvY2VydC11c2Vya2V5LnNoXQorICAgICByZWdyZXNzaW9uIHRlc3RzIGZvciB2MDEgY2VydGlmaWNhdGUgZm9ybWF0CisgICAgIGluY2x1ZGVzIGludGVyb3AgdGVzdHMgZm9yIHYwMCBjZXJ0cworIC0gKGR0dWNrZXIpIFtjb250cmliL2FpeC9idWlsZGJmZi5zaF0gRml4IGNyZWF0aW9uIG9mIHNzaF9wcm5nX2NtZHMuZGVmYXVsdAorICAgZmlsZS4KKworMjAxMDA0MTYKKyAtIChkam0pIFJlbGVhc2Ugb3BlbnNzaC01LjVwMQorIC0gT3BlbkJTRCBDVlMgU3luYworICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDMvMjYgMDM6MTM6MTcKKyAgICAgW2J1ZmF1eC5jXQorICAgICBhbGxvdyBidWZmZXJfZ2V0X2ludF9yZXQvYnVmZmVyX2dldF9pbnQ2NF9yZXQgdG8gdGFrZSBhIE5VTEwgcG9pbnRlcgorICAgICBhcmd1bWVudCB0byBhbGxvdyBza2lwcGluZyBwYXN0IHZhbHVlcyBpbiBhIGJ1ZmZlcgorICAgLSBqbWNAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDMvMjYgMDY6NTQ6MzYKKyAgICAgW3NzaC4xXQorICAgICB0d2VhayBwcmV2aW91czsKKyAgIC0gam1jQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzAzLzI3IDE0OjI2OjU1CisgICAgIFtzc2hfY29uZmlnLjVdCisgICAgIHR3ZWFrIHByZXZpb3VzOyBvayBkdHVja2VyCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNC8xMCAwMDowMDoxNgorICAgICBbc3NoLmNdCisgICAgIGJ6IzE3NDYgLSBzdXBwcmVzcyBzcHVyaW91cyB0dHkgd2FybmluZyB3aGVuIHVzaW5nIC1PIGFuZCBzdGRpbgorICAgICBpcyBub3QgYSB0dHk7IG9rIGR0dWNrZXJAIG1hcmt1c0AKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA0LzEwIDAwOjA0OjMwCisgICAgIFtzc2hjb25uZWN0LmNdCisgICAgIGZpeCB0ZXJtaW5vbG9neTogd2UgZGlkbid0IGZpbmQgYSBjZXJ0aWZpY2F0ZSBpbiBrbm93bl9ob3N0cywgd2UgZm91bmQKKyAgICAgYSBDQSBrZXkKKyAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA0LzEwIDAyOjA4OjQ0CisgICAgIFtjbGllbnRsb29wLmNdCisgICAgIGJ6IzE2OTg6IGtpbGwgY2hhbm5lbCB3aGVuIHB0eSBhbGxvY2F0aW9uIHJlcXVlc3RzIGZhaWwuIEZpeGVkCisgICAgIHN0dWNrIGNsaWVudCBpZiB0aGUgc2VydmVyIHJlZnVzZXMgcHR5IGFsbG9jYXRpb24uCisgICAgIG9rIGR0dWNrZXJAICJ0aGluayBzbyIgbWFya3VzQAorICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDQvMTAgMDI6MTA6NTYKKyAgICAgW3NzaGNvbm5lY3QyLmNdCisgICAgIHNob3cgdGhlIGtleSB0eXBlIHRoYXQgd2UgYXJlIG9mZmVyaW5nIGluIGRlYnVnKCksIGhlbHBzIGRpc3Rpbmd1aXNoCisgICAgIGJldHdlZW4gY2VydHMgYW5kIHBsYWluIGtleXMgYXMgdGhlIHBhdGggdG8gdGhlIHByaXZhdGUga2V5IGlzIHVzdWFsbHkKKyAgICAgdGhlIHNhbWUuCisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNC8xMCAwNTo0ODoxNgorICAgICBbbXV4LmNdCisgICAgIGZpeCBOVUxMIGRlcmVmZXJlbmNlOyBmcm9tIG1hdHRoZXcuaGF1YiBBVCBhbHVtbmkuYWRlbGFpZGUuZWR1LmF1CisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNC8xNCAyMjoyNzo0MgorICAgICBbc3NoX2NvbmZpZy41IHNzaGNvbm5lY3QuY10KKyAgICAgZXhwYW5kICVyID0+IHJlbW90ZSB1c2VybmFtZSBpbiBzc2hfY29uZmlnOlByb3h5Q29tbWFuZDsKKyAgICAgb2sgZGVyYWFkdCBtYXJrdXMKKyAgIC0gbWFya3VzQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA0LzE1IDIwOjMyOjU1CisgICAgIFtzc2gtcGtjczExLmNdCisgICAgIHJldHJ5IGxvb2t1cCBmb3IgcHJpdmF0ZSBrZXkgaWYgdGhlcmUncyBubyBtYXRjaGluZyBrZXkgd2l0aCBDS0FfU0lHTgorICAgICBhdHRyaWJ1dGUgZW5hYmxlZDsgdGhpcyBmaXhlcyBmaXhlcyBNdXNjbGVDYXJkIHN1cHBvcnQgKGJ1Z3ppbGxhICMxNzM2KQorICAgICBvayBkam1ACisgICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNC8xNiAwMTo0NzoyNgorICAgICBbUFJPVE9DT0wuY2VydGtleXMgYXV0aC1vcHRpb25zLmMgYXV0aC1vcHRpb25zLmggYXV0aC1yc2EuY10KKyAgICAgW2F1dGgyLXB1YmtleS5jIGF1dGhmZC5jIGtleS5jIGtleS5oIG15cHJvcG9zYWwuaCBzc2gtYWRkLmNdCisgICAgIFtzc2gtYWdlbnQuYyBzc2gtZHNzLmMgc3NoLWtleWdlbi4xIHNzaC1rZXlnZW4uYyBzc2gtcnNhLmNdCisgICAgIFtzc2hjb25uZWN0LmMgc3NoY29ubmVjdDIuYyBzc2hkLmNdCisgICAgIHJldmlzZWQgY2VydGlmaWNhdGUgZm9ybWF0IHNzaC17ZHNzLHJzYX0tY2VydC12MDFAb3BlbnNzaC5jb20gd2l0aCB0aGUKKyAgICAgZm9sbG93aW5nIGNoYW5nZXM6CisgICAgIAorICAgICBtb3ZlIHRoZSBub25jZSBmaWVsZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjZXJ0aWZpY2F0ZSB3aGVyZSBpdCBjYW4KKyAgICAgYmV0dGVyIHByb3RlY3QgYWdhaW5zdCBjaG9zZW4tcHJlZml4IGF0dGFja3Mgb24gdGhlIHNpZ25hdHVyZSBoYXNoCisgICAgIAorICAgICBSZW5hbWUgImNvbnN0cmFpbnRzIiBmaWVsZCB0byAiY3JpdGljYWwgb3B0aW9ucyIKKyAgICAgCisgICAgIEFkZCBhIG5ldyBub24tY3JpdGljYWwgImV4dGVuc2lvbnMiIGZpZWxkCisgICAgIAorICAgICBBZGQgYSBzZXJpYWwgbnVtYmVyCisgICAgIAorICAgICBUaGUgb2xkZXIgZm9ybWF0IGlzIHN0aWxsIHN1cHBvcnQgZm9yIGF1dGhlbnRpY2F0aW9uIGFuZCBjZXJ0IGdlbmVyYXRpb24KKyAgICAgKHVzZSAic3NoLWtleWdlbiAtdCB2MDAgLXMgY2Ffa2V5IC4uLiIgdG8gZ2VuZXJhdGUgYSB2MDAgY2VydGlmaWNhdGUpCisgICAgIAorICAgICBvayBtYXJrdXNACmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL0lOU1RBTEwgYi9vcGVuc3NoLTYuMHAxL0lOU1RBTEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M2MDQ2OQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvSU5TVEFMTApAQCAtMCwwICsxLDI2OSBAQAorMS4gUHJlcmVxdWlzaXRlcworLS0tLS0tLS0tLS0tLS0tLQorCitZb3Ugd2lsbCBuZWVkIHdvcmtpbmcgaW5zdGFsbGF0aW9ucyBvZiBabGliIGFuZCBPcGVuU1NMLgorCitabGliIDEuMS40IG9yIDEuMi4xLjIgb3IgZ3JlYXRlciAoZWFsaWVyIDEuMi54IHZlcnNpb25zIGhhdmUgcHJvYmxlbXMpOgoraHR0cDovL3d3dy5nemlwLm9yZy96bGliLworCitPcGVuU1NMIDAuOS42IG9yIGdyZWF0ZXI6CitodHRwOi8vd3d3Lm9wZW5zc2wub3JnLworCisoT3BlblNTTCAwLjkuNWEgaXMgcGFydGlhbGx5IHN1cHBvcnRlZCwgYnV0IHNvbWUgY2lwaGVycyAoU1NIIHByb3RvY29sIDEKK0Jsb3dmaXNoKSBkbyBub3Qgd29yayBjb3JyZWN0bHkuKQorCitUaGUgcmVtYWluaW5nIGl0ZW1zIGFyZSBvcHRpb25hbC4KKworTkIuIElmIHlvdSBvcGVyYXRpbmcgc3lzdGVtIHN1cHBvcnRzIC9kZXYvcmFuZG9tLCB5b3Ugc2hvdWxkIGNvbmZpZ3VyZQorT3BlblNTTCB0byB1c2UgaXQuIE9wZW5TU0ggcmVsaWVzIG9uIE9wZW5TU0wncyBkaXJlY3Qgc3VwcG9ydCBvZgorL2Rldi9yYW5kb20sIG9yIGZhaWxpbmcgdGhhdCwgZWl0aGVyIHBybmdkIG9yIGVnZAorCitQUk5HRDoKKworSWYgeW91ciBzeXN0ZW0gbGFja3Mga2VybmVsLWJhc2VkIHJhbmRvbSBjb2xsZWN0aW9uLCB0aGUgdXNlIG9mIEx1dHoKK0phZW5pY2tlJ3MgUFJOR2QgaXMgcmVjb21tZW5kZWQuCisKK2h0dHA6Ly9wcm5nZC5zb3VyY2Vmb3JnZS5uZXQvCisKK0VHRDoKKworVGhlIEVudHJvcHkgR2F0aGVyaW5nIERhZW1vbiAoRUdEKSBpcyBzdXBwb3J0ZWQgaWYgeW91IGhhdmUgYSBzeXN0ZW0gd2hpY2gKK2xhY2tzIC9kZXYvcmFuZG9tIGFuZCBkb24ndCB3YW50IHRvIHVzZSBPcGVuU1NIJ3MgaW50ZXJuYWwgZW50cm9weSBjb2xsZWN0aW9uLgorCitodHRwOi8vd3d3LmxvdGhhci5jb20vdGVjaC9jcnlwdG8vCisKK1BBTToKKworT3BlblNTSCBjYW4gdXRpbGlzZSBQbHVnZ2FibGUgQXV0aGVudGljYXRpb24gTW9kdWxlcyAoUEFNKSBpZiB5b3VyCitzeXN0ZW0gc3VwcG9ydHMgaXQuIFBBTSBpcyBzdGFuZGFyZCBtb3N0IExpbnV4IGRpc3RyaWJ1dGlvbnMsIFNvbGFyaXMsCitIUC1VWCAxMSwgQUlYID49IDUuMiwgRnJlZUJTRCBhbmQgTmV0QlNELgorCitJbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFyaW91cyBQQU0gaW1wbGVtZW50YXRpb25zIGFyZSBhdmFpbGFibGU6CisKK1NvbGFyaXMgUEFNOglodHRwOi8vd3d3LnN1bi5jb20vc29mdHdhcmUvc29sYXJpcy9wYW0vCitMaW51eCBQQU06CWh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgvbGlicy9wYW0vCitPcGVuUEFNOglodHRwOi8vd3d3Lm9wZW5wYW0ub3JnLworCitJZiB5b3Ugd2lzaCB0byBidWlsZCB0aGUgR05PTUUgcGFzc3BocmFzZSByZXF1ZXN0ZXIsIHlvdSB3aWxsIG5lZWQgdGhlIEdOT01FCitsaWJyYXJpZXMgYW5kIGhlYWRlcnMuCisKK0dOT01FOgoraHR0cDovL3d3dy5nbm9tZS5vcmcvCisKK0FsdGVybmF0aXZlbHksIEppbSBLbm9ibGUgPGpta25vYmxlQHBvYm94LmNvbT4gaGFzIHdyaXR0ZW4gYW4gZXhjZWxsZW50IFgxMQorcGFzc3BocmFzZSByZXF1ZXN0ZXIuIFRoaXMgaXMgbWFpbnRhaW5lZCBzZXBhcmF0ZWx5IGF0OgorCitodHRwOi8vd3d3Lmpta25vYmxlLm5ldC9zb2Z0d2FyZS94MTEtc3NoLWFza3Bhc3MvCisKK1RDUCBXcmFwcGVyczoKKworSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBUQ1Agd3JhcHBlcnMgZnVuY3Rpb25hbGl0eSB5b3Ugd2lsbCBuZWVkIGF0IGxlYXN0Cit0Y3BkLmggYW5kIGxpYndyYXAuYSwgZWl0aGVyIGluIHRoZSBzdGFuZGFyZCBpbmNsdWRlIGFuZCBsaWJyYXJ5IHBhdGhzLAorb3IgaW4gdGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkgLS13aXRoLXRjcC13cmFwcGVycy4gIFZlcnNpb24gNy42IGlzCitrbm93biB0byB3b3JrLgorCitodHRwOi8vZnRwLnBvcmN1cGluZS5vcmcvcHViL3NlY3VyaXR5L2luZGV4Lmh0bWwKKworUy9LZXkgTGlicmFyaWVzOgorCitJZiB5b3Ugd2lzaCB0byB1c2UgLS13aXRoLXNrZXkgdGhlbiB5b3Ugd2lsbCBuZWVkIHRoZSBsaWJyYXJ5IGJlbG93CitpbnN0YWxsZWQuICBObyBvdGhlciBTL0tleSBsaWJyYXJ5IGlzIGN1cnJlbnRseSBrbm93biB0byBiZSBzdXBwb3J0ZWQuCisKK2h0dHA6Ly93d3cuc3BhcmMuc3BiLnN1L3NvbGFyaXMvc2tleS8KKworTGliRWRpdDoKKworc2Z0cCBzdXBwb3J0cyBjb21tYW5kLWxpbmUgZWRpdGluZyB2aWEgTmV0QlNEJ3MgbGliZWRpdC4gIElmIHlvdXIgcGxhdGZvcm0KK2hhcyBpdCBhdmFpbGFibGUgbmF0aXZlbHkgeW91IGNhbiB1c2UgdGhhdCwgYWx0ZXJuYXRpdmVseSB5b3UgbWlnaHQgdHJ5Cit0aGVzZSBtdWx0aS1wbGF0Zm9ybSBwb3J0czoKKworaHR0cDovL3d3dy50aHJ5c29lZS5kay9lZGl0bGluZS8KK2h0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGliZWRpdC8KKworTEROUzoKKworTEROUyBpcyBhIEROUyBCU0QtbGljZW5zZWQgcmVzb2x2ZXIgbGlicmFyeSB3aGljaCBzdXBwb3J0cyBETlNTRUMuCisKK2h0dHA6Ly9ubG5ldGxhYnMubmwvcHJvamVjdHMvbGRucy8KKworQXV0b2NvbmY6CisKK0lmIHlvdSBtb2RpZnkgY29uZmlndXJlLmFjIG9yIGNvbmZpZ3VyZSBkb2Vzbid0IGV4aXN0IChlZyBpZiB5b3UgY2hlY2tlZAordGhlIGNvZGUgb3V0IG9mIENWUyB5b3Vyc2VsZikgdGhlbiB5b3Ugd2lsbCBuZWVkIGF1dG9jb25mLTIuNjEgdG8gcmVidWlsZAordGhlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGVzIGJ5IHJ1bm5pbmcgImF1dG9yZWNvbmYiLiAgRWFybGllcgordmVyc2lvbnMgbWF5IGFsc28gd29yayBidXQgdGhpcyBpcyBub3QgZ3VhcmFudGVlZC4KKworaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLworCitCYXNpYyBTZWN1cml0eSBNb2R1bGUgKEJTTSk6CisKK05hdGl2ZSBCU00gc3VwcG9ydCBpcyBrbm93IHRvIGV4aXN0IGluIFNvbGFyaXMgZnJvbSBhdCBsZWFzdCAyLjUuMSwKK0ZyZWVCU0QgNi4xIGFuZCBPUyBYLiAgQWx0ZXJuYXRpdmVseSwgeW91IG1heSB1c2UgdGhlIE9wZW5CU00KK2ltcGxlbWVudGF0aW9uIChodHRwOi8vd3d3Lm9wZW5ic20ub3JnKS4KKworCisyLiBCdWlsZGluZyAvIEluc3RhbGxhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gaW5zdGFsbCBPcGVuU1NIIHdpdGggZGVmYXVsdCBvcHRpb25zOgorCisuL2NvbmZpZ3VyZQorbWFrZQorbWFrZSBpbnN0YWxsCisKK1RoaXMgd2lsbCBpbnN0YWxsIHRoZSBPcGVuU1NIIGJpbmFyaWVzIGluIC91c3IvbG9jYWwvYmluLCBjb25maWd1cmF0aW9uIGZpbGVzCitpbiAvdXNyL2xvY2FsL2V0YywgdGhlIHNlcnZlciBpbiAvdXNyL2xvY2FsL3NiaW4sIGV0Yy4gVG8gc3BlY2lmeSBhIGRpZmZlcmVudAoraW5zdGFsbGF0aW9uIHByZWZpeCwgdXNlIHRoZSAtLXByZWZpeCBvcHRpb24gdG8gY29uZmlndXJlOgorCisuL2NvbmZpZ3VyZSAtLXByZWZpeD0vb3B0CittYWtlCittYWtlIGluc3RhbGwKKworV2lsbCBpbnN0YWxsIE9wZW5TU0ggaW4gL29wdC97YmluLGV0YyxsaWIsc2Jpbn0uIFlvdSBjYW4gYWxzbyBvdmVycmlkZQorc3BlY2lmaWMgcGF0aHMsIGZvciBleGFtcGxlOgorCisuL2NvbmZpZ3VyZSAtLXByZWZpeD0vb3B0IC0tc3lzY29uZmRpcj0vZXRjL3NzaAorbWFrZQorbWFrZSBpbnN0YWxsCisKK1RoaXMgd2lsbCBpbnN0YWxsIHRoZSBiaW5hcmllcyBpbiAvb3B0L3tiaW4sbGliLHNiaW59LCBidXQgd2lsbCBwbGFjZSB0aGUKK2NvbmZpZ3VyYXRpb24gZmlsZXMgaW4gL2V0Yy9zc2guCisKK0lmIHlvdSBhcmUgdXNpbmcgUHJpdmlsZWdlIFNlcGFyYXRpb24gKHdoaWNoIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCkKK3RoZW4geW91IHdpbGwgYWxzbyBuZWVkIHRvIGNyZWF0ZSB0aGUgdXNlciwgZ3JvdXAgYW5kIGRpcmVjdG9yeSB1c2VkIGJ5Citzc2hkIGZvciBwcml2aWxlZ2Ugc2VwYXJhdGlvbi4gIFNlZSBSRUFETUUucHJpdnNlcCBmb3IgZGV0YWlscy4KKworSWYgeW91IGFyZSB1c2luZyBQQU0sIHlvdSBtYXkgbmVlZCB0byBtYW51YWxseSBpbnN0YWxsIGEgUEFNIGNvbnRyb2wKK2ZpbGUgYXMgIi9ldGMvcGFtLmQvc3NoZCIgKG9yIHdoZXJldmVyIHlvdXIgc3lzdGVtIHByZWZlcnMgdG8ga2VlcAordGhlbSkuICBOb3RlIHRoYXQgdGhlIHNlcnZpY2UgbmFtZSB1c2VkIHRvIHN0YXJ0IFBBTSBpcyBfX3Byb2duYW1lLAord2hpY2ggaXMgdGhlIGJhc2VuYW1lIG9mIHRoZSBwYXRoIG9mIHlvdXIgc3NoZCAoZS5nLiwgdGhlIHNlcnZpY2UgbmFtZQorZm9yIC91c3Ivc2Jpbi9vc3NoZCB3aWxsIGJlIG9zc2hkKS4gIElmIHlvdSBoYXZlIHJlbmFtZWQgeW91ciBzc2hkCitleGVjdXRhYmxlLCB5b3VyIFBBTSBjb25maWd1cmF0aW9uIG1heSBuZWVkIHRvIGJlIG1vZGlmaWVkLgorCitBIGdlbmVyaWMgUEFNIGNvbmZpZ3VyYXRpb24gaXMgaW5jbHVkZWQgYXMgImNvbnRyaWIvc3NoZC5wYW0uZ2VuZXJpYyIsCit5b3UgbWF5IG5lZWQgdG8gZWRpdCBpdCBiZWZvcmUgdXNpbmcgaXQgb24geW91ciBzeXN0ZW0uIElmIHlvdSBhcmUKK3VzaW5nIGEgcmVjZW50IHZlcnNpb24gb2YgUmVkIEhhdCBMaW51eCwgdGhlIGNvbmZpZyBmaWxlIGluCitjb250cmliL3JlZGhhdC9zc2hkLnBhbSBzaG91bGQgYmUgbW9yZSB1c2VmdWwuICBGYWlsdXJlIHRvIGluc3RhbGwgYQordmFsaWQgUEFNIGZpbGUgbWF5IHJlc3VsdCBpbiBhbiBpbmFiaWxpdHkgdG8gdXNlIHBhc3N3b3JkCithdXRoZW50aWNhdGlvbi4gIE9uIEhQLVVYIDExIGFuZCBTb2xhcmlzLCB0aGUgc3RhbmRhcmQgL2V0Yy9wYW0uY29uZgorY29uZmlndXJhdGlvbiB3aWxsIHdvcmsgd2l0aCBzc2hkIChzc2hkIHdpbGwgbWF0Y2ggdGhlIG90aGVyIHNlcnZpY2UKK25hbWUpLgorCitUaGVyZSBhcmUgYSBmZXcgb3RoZXIgb3B0aW9ucyB0byB0aGUgY29uZmlndXJlIHNjcmlwdDoKKworLS13aXRoLWF1ZGl0PVttb2R1bGVdIGVuYWJsZSBhZGRpdGlvbmFsIGF1ZGl0aW5nIHZpYSB0aGUgc3BlY2lmaWVkIG1vZHVsZS4KK0N1cnJlbnRseSwgZHJpdmVycyBmb3IgImRlYnVnIiAoYWRkaXRpb25hbCBpbmZvIHZpYSBzeXNsb2cpIGFuZCAiYnNtIgorKFN1bidzIEJhc2ljIFNlY3VyaXR5IE1vZHVsZSkgYXJlIHN1cHBvcnRlZC4KKworLS13aXRoLXBhbSBlbmFibGVzIFBBTSBzdXBwb3J0LiBJZiBQQU0gc3VwcG9ydCBpcyBjb21waWxlZCBpbiwgaXQgbXVzdAorYWxzbyBiZSBlbmFibGVkIGluIHNzaGRfY29uZmlnIChyZWZlciB0byB0aGUgVXNlUEFNIGRpcmVjdGl2ZSkuCisKKy0td2l0aC1wcm5nZC1zb2NrZXQ9L3NvbWUvZmlsZSBhbGxvd3MgeW91IHRvIGVuYWJsZSBFR0Qgb3IgUFJOR0QKK3N1cHBvcnQgYW5kIHRvIHNwZWNpZnkgYSBQUk5HZCBzb2NrZXQuIFVzZSB0aGlzIGlmIHlvdXIgVW5peCBsYWNrcworL2Rldi9yYW5kb20gYW5kIHlvdSBkb24ndCB3YW50IHRvIHVzZSBPcGVuU1NIJ3MgYnVpbHRpbiBlbnRyb3B5Citjb2xsZWN0aW9uIHN1cHBvcnQuCisKKy0td2l0aC1wcm5nZC1wb3J0PXBvcnRudW0gYWxsb3dzIHlvdSB0byBlbmFibGUgRUdEIG9yIFBSTkdEIHN1cHBvcnQKK2FuZCB0byBzcGVjaWZ5IGEgRUdEIGxvY2FsaG9zdCBUQ1AgcG9ydC4gVXNlIHRoaXMgaWYgeW91ciBVbml4IGxhY2tzCisvZGV2L3JhbmRvbSBhbmQgeW91IGRvbid0IHdhbnQgdG8gdXNlIE9wZW5TU0gncyBidWlsdGluIGVudHJvcHkKK2NvbGxlY3Rpb24gc3VwcG9ydC4KKworLS13aXRoLWxhc3Rsb2c9RklMRSB3aWxsIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSBsYXN0bG9nIGZpbGUuCisuL2NvbmZpZ3VyZSBzZWFyY2hlcyBhIGZldyBsb2NhdGlvbnMgZm9yIGxhc3Rsb2csIGJ1dCBtYXkgbm90IGZpbmQKK2l0IGlmIGxhc3Rsb2cgaXMgaW5zdGFsbGVkIGluIGEgZGlmZmVyZW50IHBsYWNlLgorCistLXdpdGhvdXQtbGFzdGxvZyB3aWxsIGRpc2FibGUgbGFzdGxvZyBzdXBwb3J0IGVudGlyZWx5LgorCistLXdpdGgtb3Nmc2lhLCAtLXdpdGhvdXQtb3Nmc2lhIHdpbGwgZW5hYmxlIG9yIGRpc2FibGUgT1NGMSdzIFNlY3VyaXR5CitJbnRlZ3JhdGlvbiBBcmNoaXRlY3R1cmUuICBUaGUgZGVmYXVsdCBmb3IgT1NGMSBtYWNoaW5lcyBpcyBlbmFibGUuCisKKy0td2l0aC1za2V5PVBBVEggd2lsbCBlbmFibGUgUy9LZXkgb25lIHRpbWUgcGFzc3dvcmQgc3VwcG9ydC4gWW91IHdpbGwKK25lZWQgdGhlIFMvS2V5IGxpYnJhcmllcyBhbmQgaGVhZGVyIGZpbGVzIGluc3RhbGxlZCBmb3IgdGhpcyB0byB3b3JrLgorCistLXdpdGgtdGNwLXdyYXBwZXJzIHdpbGwgZW5hYmxlIFRDUCBXcmFwcGVycyAoL2V0Yy9ob3N0cy5hbGxvd3xkZW55KQorc3VwcG9ydC4KKworLS13aXRoLW1kNS1wYXNzd29yZHMgd2lsbCBlbmFibGUgdGhlIHVzZSBvZiBNRDUgcGFzc3dvcmRzLiBFbmFibGUgdGhpcworaWYgeW91ciBvcGVyYXRpbmcgc3lzdGVtIHVzZXMgTUQ1IHBhc3N3b3JkcyBhbmQgdGhlIHN5c3RlbSBjcnlwdCgpIGRvZXMKK25vdCBzdXBwb3J0IHRoZW0gZGlyZWN0bHkgKHNlZSB0aGUgY3J5cHQoMy8zYykgbWFuIHBhZ2UpLiBJZiBlbmFibGVkLCB0aGUKK3Jlc3VsdGluZyBiaW5hcnkgd2lsbCBzdXBwb3J0IGJvdGggTUQ1IGFuZCB0cmFkaXRpb25hbCBjcnlwdCBwYXNzd29yZHMuCisKKy0td2l0aC11dG1weCBlbmFibGVzIHV0bXB4IHN1cHBvcnQuIHV0bXB4IHN1cHBvcnQgaXMgYXV0b21hdGljIGZvcgorc29tZSBwbGF0Zm9ybXMuCisKKy0td2l0aG91dC1zaGFkb3cgZGlzYWJsZXMgc2hhZG93IHBhc3N3b3JkIHN1cHBvcnQuCisKKy0td2l0aC1pcGFkZHItZGlzcGxheSBmb3JjZXMgdGhlIHVzZSBvZiBhIG51bWVyaWMgSVAgYWRkcmVzcyBpbiB0aGUKKyRESVNQTEFZIGVudmlyb25tZW50IHZhcmlhYmxlLiBTb21lIGJyb2tlbiBzeXN0ZW1zIG5lZWQgdGhpcy4KKworLS13aXRoLWRlZmF1bHQtcGF0aD1QQVRIIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBhIGRlZmF1bHQgJFBBVEggZm9yIHNlc3Npb25zCitzdGFydGVkIGJ5IHNzaGQuIFRoaXMgcmVwbGFjZXMgdGhlIHN0YW5kYXJkIHBhdGggZW50aXJlbHkuCisKKy0td2l0aC1waWQtZGlyPVBBVEggc3BlY2lmaWVzIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIHNzaGQucGlkIGZpbGUgaXMKK2NyZWF0ZWQuCisKKy0td2l0aC14YXV0aD1QQVRIIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIHhhdXRoIGJpbmFyeQorCistLXdpdGgtc3NsLWRpcj1ESVIgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHdoZXJlIHlvdXIgT3BlblNTTCBsaWJyYXJpZXMKK2FyZSBpbnN0YWxsZWQuCisKKy0td2l0aC1zc2wtZW5naW5lIGVuYWJsZXMgT3BlblNTTCdzIChoYXJkd2FyZSkgRU5HSU5FIHN1cHBvcnQKKworLS13aXRoLTRpbjYgQ2hlY2sgZm9yIElQdjQgaW4gSVB2NiBtYXBwZWQgYWRkcmVzc2VzIGFuZCBjb252ZXJ0IHRoZW0gdG8KK3JlYWwgKEFGX0lORVQpIElQdjQgYWRkcmVzc2VzLiBXb3JrcyBhcm91bmQgc29tZSBxdWlya3Mgb24gTGludXguCisKK0lmIHlvdSBuZWVkIHRvIHBhc3Mgc3BlY2lhbCBvcHRpb25zIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIsIHlvdQorY2FuIHNwZWNpZnkgdGhlc2UgYXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJlZm9yZSBydW5uaW5nIC4vY29uZmlndXJlLgorRm9yIGV4YW1wbGU6CisKK0NGTEFHUz0iLU8gLW00ODYiIExERkxBR1M9Ii1zIiBMSUJTPSItbHJ1YmJpc2giIExEPSIvdXNyL2Zvby9sZCIgLi9jb25maWd1cmUKKworMy4gQ29uZmlndXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgcnVudGltZSBjb25maWd1cmF0aW9uIGZpbGVzIGFyZSBpbnN0YWxsZWQgYnkgaW4gJHtwcmVmaXh9L2V0YyBvcgord2hhdGV2ZXIgeW91IHNwZWNpZmllZCBhcyB5b3VyIC0tc3lzY29uZmRpciAoL3Vzci9sb2NhbC9ldGMgYnkgZGVmYXVsdCkuCisKK1RoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIGluc3RhbnRseSB1c2FibGUsIHRob3VnaCB5b3Ugc2hvdWxkCityZXZpZXcgaXQgdG8gZW5zdXJlIHRoYXQgaXQgbWF0Y2hlcyB5b3VyIHNlY3VyaXR5IHJlcXVpcmVtZW50cy4KKworVG8gZ2VuZXJhdGUgYSBob3N0IGtleSwgcnVuICJtYWtlIGhvc3Qta2V5Ii4gQWx0ZXJuYXRlbHkgeW91IGNhbiBkbyBzbworbWFudWFsbHkgdXNpbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKKworICAgIHNzaC1rZXlnZW4gLXQgcnNhMSAtZiAvZXRjL3NzaC9zc2hfaG9zdF9rZXkgLU4gIiIKKyAgICBzc2gta2V5Z2VuIC10IHJzYSAtZiAvZXRjL3NzaC9zc2hfaG9zdF9yc2Ffa2V5IC1OICIiCisgICAgc3NoLWtleWdlbiAtdCBkc2EgLWYgL2V0Yy9zc2gvc3NoX2hvc3RfZHNhX2tleSAtTiAiIgorCitSZXBsYWNpbmcgL2V0Yy9zc2ggd2l0aCB0aGUgY29ycmVjdCBwYXRoIHRvIHRoZSBjb25maWd1cmF0aW9uIGRpcmVjdG9yeS4KKygke3ByZWZpeH0vZXRjIG9yIHdoYXRldmVyIHlvdSBzcGVjaWZpZWQgd2l0aCAtLXN5c2NvbmZkaXIgZHVyaW5nCitjb25maWd1cmF0aW9uKQorCitJZiB5b3UgaGF2ZSBjb25maWd1cmVkIE9wZW5TU0ggd2l0aCBFR0Qgc3VwcG9ydCwgZW5zdXJlIHRoYXQgRUdEIGlzCitydW5uaW5nIGFuZCBoYXMgY29sbGVjdGVkIHNvbWUgRW50cm9weS4KKworRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY29uZmlndXJhdGlvbiwgcGxlYXNlIHJlZmVyIHRvIHRoZSBtYW51YWwgcGFnZXMKK2ZvciBzc2hkLCBzc2ggYW5kIHNzaC1hZ2VudC4KKworNC4gKE9wdGlvbmFsKSBTZW5kIHN1cnZleQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiskIG1ha2Ugc3VydmV5CitbY2hlY2sgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlICJzdXJ2ZXkiIHRvIGVuc3VyZSB0aGVyZSdzIG5vIGluZm9ybWF0aW9uCit0aGF0IHlvdSBjb25zaWRlciBzZW5zaXRpdmVdCiskIG1ha2Ugc2VuZC1zdXJ2ZXkKKworVGhpcyB3aWxsIHNlbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkCitob3N0IHRvIGEgc3VydmV5IGFkZHJlc3MuICBUaGlzIHdpbGwgaGVscCBkZXRlcm1pbmUgd2hpY2ggY29uZmlndXJhdGlvbnMKK2FyZSBhY3R1YWxseSBpbiB1c2UsIGFuZCB3aGF0IHZhbGlkIGNvbWJpbmF0aW9ucyBvZiBjb25maWd1cmUgb3B0aW9ucworZXhpc3QuICBUaGUgcmF3IGRhdGEgaXMgYXZhaWxhYmxlIG9ubHkgdG8gdGhlIE9wZW5TU0ggZGV2ZWxvcGVycywgaG93ZXZlcgorc3VtbWFyeSBkYXRhIG1heSBiZSBwdWJsaXNoZWQuCisKKzUuIFByb2JsZW1zPworLS0tLS0tLS0tLS0tCisKK0lmIHlvdSBleHBlcmllbmNlIHByb2JsZW1zIGNvbXBpbGluZywgaW5zdGFsbGluZyBvciBydW5uaW5nIE9wZW5TU0guCitQbGVhc2UgcmVmZXIgdG8gdGhlICJyZXBvcnRpbmcgYnVncyIgc2VjdGlvbiBvZiB0aGUgd2VicGFnZSBhdAoraHR0cDovL3d3dy5vcGVuc3NoLmNvbS8KKworCiskSWQ6IElOU1RBTEwsdiAxLjg3IDIwMTEvMTEvMDQgMDA6MjU6MjUgZHR1Y2tlciBFeHAgJApkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9MSUNFTkNFIGIvb3BlbnNzaC02LjBwMS9MSUNFTkNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MjM4NzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL0xJQ0VOQ0UKQEAgLTAsMCArMSwzNDAgQEAKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBPcGVuU1NIIHNvZnR3YXJlLgorCitUaGUgbGljZW5jZXMgd2hpY2ggY29tcG9uZW50cyBvZiB0aGlzIHNvZnR3YXJlIGZhbGwgdW5kZXIgYXJlIGFzCitmb2xsb3dzLiAgRmlyc3QsIHdlIHdpbGwgc3VtbWFyaXplIGFuZCBzYXkgdGhhdCBhbGwgY29tcG9uZW50cworYXJlIHVuZGVyIGEgQlNEIGxpY2VuY2UsIG9yIGEgbGljZW5jZSBtb3JlIGZyZWUgdGhhbiB0aGF0LgorCitPcGVuU1NIIGNvbnRhaW5zIG5vIEdQTCBjb2RlLgorCisxKQorICAgICAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgICAgICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAgICAgKgorICAgICAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKKyAgICAgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICAgICAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAgICAgKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCisgICAgICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorCisgICAgW1RhdHUgY29udGludWVzXQorICAgICAqICBIb3dldmVyLCBJIGFtIG5vdCBpbXBseWluZyB0byBnaXZlIGFueSBsaWNlbnNlcyB0byBhbnkgcGF0ZW50cyBvcgorICAgICAqIGNvcHlyaWdodHMgaGVsZCBieSB0aGlyZCBwYXJ0aWVzLCBhbmQgdGhlIHNvZnR3YXJlIGluY2x1ZGVzIHBhcnRzIHRoYXQKKyAgICAgKiBhcmUgbm90IHVuZGVyIG15IGRpcmVjdCBjb250cm9sLiAgQXMgZmFyIGFzIEkga25vdywgYWxsIGluY2x1ZGVkCisgICAgICogc291cmNlIGNvZGUgaXMgdXNlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHJlbGV2YW50IGxpY2Vuc2UgYWdyZWVtZW50cworICAgICAqIGFuZCBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlICh0aGUgR05VIGxpY2Vuc2UgYmVpbmcgdGhlIG1vc3QKKyAgICAgKiByZXN0cmljdGl2ZSk7IHNlZSBiZWxvdyBmb3IgZGV0YWlscy4KKworICAgIFtIb3dldmVyLCBub25lIG9mIHRoYXQgdGVybSBpcyByZWxldmFudCBhdCB0aGlzIHBvaW50IGluIHRpbWUuICBBbGwgb2YKKyAgICB0aGVzZSByZXN0cmljdGl2ZWx5IGxpY2VuY2VkIHNvZnR3YXJlIGNvbXBvbmVudHMgd2hpY2ggaGUgdGFsa3MgYWJvdXQKKyAgICBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIE9wZW5TU0gsIGkuZS4sCisKKyAgICAgLSBSU0EgaXMgbm8gbG9uZ2VyIGluY2x1ZGVkLCBmb3VuZCBpbiB0aGUgT3BlblNTTCBsaWJyYXJ5CisgICAgIC0gSURFQSBpcyBubyBsb25nZXIgaW5jbHVkZWQsIGl0cyB1c2UgaXMgZGVwcmVjYXRlZAorICAgICAtIERFUyBpcyBub3cgZXh0ZXJuYWwsIGluIHRoZSBPcGVuU1NMIGxpYnJhcnkKKyAgICAgLSBHTVAgaXMgbm8gbG9uZ2VyIHVzZWQsIGFuZCBpbnN0ZWFkIHdlIGNhbGwgQk4gY29kZSBmcm9tIE9wZW5TU0wKKyAgICAgLSBabGliIGlzIG5vdyBleHRlcm5hbCwgaW4gYSBsaWJyYXJ5CisgICAgIC0gVGhlIG1ha2Utc3NoLWtub3duLWhvc3RzIHNjcmlwdCBpcyBubyBsb25nZXIgaW5jbHVkZWQKKyAgICAgLSBUU1MgaGFzIGJlZW4gcmVtb3ZlZAorICAgICAtIE1ENSBpcyBub3cgZXh0ZXJuYWwsIGluIHRoZSBPcGVuU1NMIGxpYnJhcnkKKyAgICAgLSBSQzQgc3VwcG9ydCBoYXMgYmVlbiByZXBsYWNlZCB3aXRoIEFSQzQgc3VwcG9ydCBmcm9tIE9wZW5TU0wKKyAgICAgLSBCbG93ZmlzaCBpcyBub3cgZXh0ZXJuYWwsIGluIHRoZSBPcGVuU1NMIGxpYnJhcnkKKworICAgIFtUaGUgbGljZW5jZSBjb250aW51ZXNdCisKKyAgICBOb3RlIHRoYXQgYW55IGluZm9ybWF0aW9uIGFuZCBjcnlwdG9ncmFwaGljIGFsZ29yaXRobXMgdXNlZCBpbiB0aGlzCisgICAgc29mdHdhcmUgYXJlIHB1YmxpY2x5IGF2YWlsYWJsZSBvbiB0aGUgSW50ZXJuZXQgYW5kIGF0IGFueSBtYWpvcgorICAgIGJvb2tzdG9yZSwgc2NpZW50aWZpYyBsaWJyYXJ5LCBhbmQgcGF0ZW50IG9mZmljZSB3b3JsZHdpZGUuICBNb3JlCisgICAgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGUuZy4gYXQgImh0dHA6Ly93d3cuY3MuaHV0LmZpL2NyeXB0byIuCisKKyAgICBUaGUgbGVnYWwgc3RhdHVzIG9mIHRoaXMgcHJvZ3JhbSBpcyBzb21lIGNvbWJpbmF0aW9uIG9mIGFsbCB0aGVzZQorICAgIHBlcm1pc3Npb25zIGFuZCByZXN0cmljdGlvbnMuICBVc2Ugb25seSBhdCB5b3VyIG93biByZXNwb25zaWJpbGl0eS4KKyAgICBZb3Ugd2lsbCBiZSByZXNwb25zaWJsZSBmb3IgYW55IGxlZ2FsIGNvbnNlcXVlbmNlcyB5b3Vyc2VsZjsgSSBhbSBub3QKKyAgICBtYWtpbmcgYW55IGNsYWltcyB3aGV0aGVyIHBvc3Nlc3Npbmcgb3IgdXNpbmcgdGhpcyBpcyBsZWdhbCBvciBub3QgaW4KKyAgICB5b3VyIGNvdW50cnksIGFuZCBJIGFtIG5vdCB0YWtpbmcgYW55IHJlc3BvbnNpYmlsaXR5IG9uIHlvdXIgYmVoYWxmLgorCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgICAgQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKKyAgICBGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KKyAgICBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCisgICAgUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKKyAgICBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICAgIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKKyAgICBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCisgICAgUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCisgICAgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgICBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKKyAgICBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCisgICAgUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKKyAgICBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKKyAgICBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECisgICAgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCisgICAgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKKyAgICBQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKzIpCisgICAgVGhlIDMyLWJpdCBDUkMgY29tcGVuc2F0aW9uIGF0dGFjayBkZXRlY3RvciBpbiBkZWF0dGFjay5jIHdhcworICAgIGNvbnRyaWJ1dGVkIGJ5IENPUkUgU0RJIFMuQS4gdW5kZXIgYSBCU0Qtc3R5bGUgbGljZW5zZS4KKworICAgICAqIENyeXB0b2dyYXBoaWMgYXR0YWNrIGRldGVjdG9yIGZvciBzc2ggLSBzb3VyY2UgY29kZQorICAgICAqCisgICAgICogQ29weXJpZ2h0IChjKSAxOTk4IENPUkUgU0RJIFMuQS4sIEJ1ZW5vcyBBaXJlcywgQXJnZW50aW5hLgorICAgICAqCisgICAgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeQorICAgICAqIGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQKKyAgICAgKiB0aGlzIGNvcHlyaWdodCBub3RpY2UgaXMgcmV0YWluZWQuCisgICAgICoKKyAgICAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICAgICAqIFdBUlJBTlRJRVMgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIENPUkUgU0RJIFMuQS4gQkUKKyAgICAgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlkgT1IKKyAgICAgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgUkVTVUxUSU5HIEZST00gVEhFIFVTRSBPUiBNSVNVU0UgT0YgVEhJUworICAgICAqIFNPRlRXQVJFLgorICAgICAqCisgICAgICogQXJpZWwgRnV0b3JhbnNreSA8ZnV0b0Bjb3JlLXNkaS5jb20+CisgICAgICogPGh0dHA6Ly93d3cuY29yZS1zZGkuY29tPgorCiszKQorICAgIHNzaC1rZXlzY2FuIHdhcyBjb250cmlidXRlZCBieSBEYXZpZCBNYXppZXJlcyB1bmRlciBhIEJTRC1zdHlsZQorICAgIGxpY2Vuc2UuCisKKyAgICAgKiBDb3B5cmlnaHQgMTk5NSwgMTk5NiBieSBEYXZpZCBNYXppZXJlcyA8ZG1AbGNzLm1pdC5lZHU+LgorICAgICAqCisgICAgICogTW9kaWZpY2F0aW9uIGFuZCByZWRpc3RyaWJ1dGlvbiBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBpcworICAgICAqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IGR1ZSBjcmVkaXQgaXMgZ2l2ZW4gdG8gdGhlIGF1dGhvciBhbmQgdGhlCisgICAgICogT3BlbkJTRCBwcm9qZWN0IGJ5IGxlYXZpbmcgdGhpcyBjb3B5cmlnaHQgbm90aWNlIGludGFjdC4KKworNCkKKyAgICBUaGUgUmlqbmRhZWwgaW1wbGVtZW50YXRpb24gYnkgVmluY2VudCBSaWptZW4sIEFudG9vbiBCb3NzZWxhZXJzCisgICAgYW5kIFBhdWxvIEJhcnJldG8gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4gYW5kIGRpc3RyaWJ1dGVkCisgICAgd2l0aCB0aGUgZm9sbG93aW5nIGxpY2Vuc2U6CisKKyAgICAgKiBAdmVyc2lvbiAzLjAgKERlY2VtYmVyIDIwMDApCisgICAgICoKKyAgICAgKiBPcHRpbWlzZWQgQU5TSSBDIGNvZGUgZm9yIHRoZSBSaWpuZGFlbCBjaXBoZXIgKG5vdyBBRVMpCisgICAgICoKKyAgICAgKiBAYXV0aG9yIFZpbmNlbnQgUmlqbWVuIDx2aW5jZW50LnJpam1lbkBlc2F0Lmt1bGV1dmVuLmFjLmJlPgorICAgICAqIEBhdXRob3IgQW50b29uIEJvc3NlbGFlcnMgPGFudG9vbi5ib3NzZWxhZXJzQGVzYXQua3VsZXV2ZW4uYWMuYmU+CisgICAgICogQGF1dGhvciBQYXVsbyBCYXJyZXRvIDxwYXVsby5iYXJyZXRvQHRlcnJhLmNvbS5icj4KKyAgICAgKgorICAgICAqIFRoaXMgY29kZSBpcyBoZXJlYnkgcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9tYWluLgorICAgICAqCisgICAgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SUyAnJ0FTIElTJycgQU5EIEFOWSBFWFBSRVNTCisgICAgICogT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAgICAgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAgICAgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPTlRSSUJVVE9SUyBCRQorICAgICAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAgICAgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICAgICAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICAgICAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICAgICAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgICAgICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwKKyAgICAgKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCis1KQorICAgIE9uZSBjb21wb25lbnQgb2YgdGhlIHNzaCBzb3VyY2UgY29kZSBpcyB1bmRlciBhIDMtY2xhdXNlIEJTRCBsaWNlbnNlLAorICAgIGhlbGQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgc2luY2Ugd2UgcHVsbGVkIHRoZXNlIHBhcnRzIGZyb20KKyAgICBvcmlnaW5hbCBCZXJrZWxleSBjb2RlLgorCisgICAgICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTkwLCAxOTkyLCAxOTkzLCAxOTk1CisgICAgICogICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgICAgKgorICAgICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgICAqIGFyZSBtZXQ6CisgICAgICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAgICAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAgICAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAgICAqCisgICAgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAgICAgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgICAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICAgICAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAgICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICAgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAgICAgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAgICAgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgICAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAgICAgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgICAgICogU1VDSCBEQU1BR0UuCisKKzYpCisgICAgUmVtYWluaW5nIGNvbXBvbmVudHMgb2YgdGhlIHNvZnR3YXJlIGFyZSBwcm92aWRlZCB1bmRlciBhIHN0YW5kYXJkCisgICAgMi10ZXJtIEJTRCBsaWNlbmNlIHdpdGggdGhlIGZvbGxvd2luZyBuYW1lcyBhcyBjb3B5cmlnaHQgaG9sZGVyczoKKworCU1hcmt1cyBGcmllZGwKKwlUaGVvIGRlIFJhYWR0CisJTmllbHMgUHJvdm9zCisJRHVnIFNvbmcKKwlBYXJvbiBDYW1wYmVsbAorCURhbWllbiBNaWxsZXIKKwlLZXZpbiBTdGV2ZXMKKwlEYW5pZWwgS291cmlsCisJV2VzbGV5IEdyaWZmaW4KKwlQZXIgQWxsYW5zc29uCisJTmlscyBOb3JkbWFuCisJU2ltb24gV2lsa2luc29uCisKKyAgICBQb3J0YWJsZSBPcGVuU1NIIGFkZGl0aW9uYWxseSBpbmNsdWRlcyBjb2RlIGZyb20gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQKKyAgICBob2xkZXJzLCBhbHNvIHVuZGVyIHRoZSAyLXRlcm0gQlNEIGxpY2Vuc2U6CisKKwlCZW4gTGluZHN0cm9tCisJVGltIFJpY2UKKwlBbmRyZSBMdWNhcworCUNocmlzIEFkYW1zCisJQ29yaW5uYSBWaW5zY2hlbgorCUNyYXkgSW5jLgorCURlbmlzIFBhcmtlcgorCUdlcnQgRG9lcmluZworCUpha29iIFNjaGx5dGVyCisJSmFzb24gRG93bnMKKwlKdWhhIFlyavZs5AorCU1pY2hhZWwgU3RvbmUKKwlOZXR3b3JrcyBBc3NvY2lhdGVzIFRlY2hub2xvZ3ksIEluYy4KKwlTb2xhciBEZXNpZ25lcgorCVRvZGQgQy4gTWlsbGVyCisJV2F5bmUgU2Nocm9lZGVyCisJV2lsbGlhbSBKb25lcworCURhcnJlbiBUdWNrZXIKKwlTdW4gTWljcm9zeXN0ZW1zCisJVGhlIFNDTyBHcm91cAorCURhbmllbCBXYWxzaAorCVJlZCBIYXQsIEluYworCVNpbW9uIFZhbGxldCAvIEdlbm9zY29wZQorCisgICAgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgICogYXJlIG1ldDoKKyAgICAgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgICAgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAqCisgICAgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAgICAgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgICAgICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAgICAgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgICAgICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICAgICAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICAgICAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAgICAgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAgICAgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCis4KSBQb3J0YWJsZSBPcGVuU1NIIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBsaWNlbnNlczoKKworICAgIGEpIG1kNWNyeXB0LmMsIG1kNWNyeXB0LmgKKworCSAqICJUSEUgQkVFUi1XQVJFIExJQ0VOU0UiIChSZXZpc2lvbiA0Mik6CisJICogPHBoa0Bsb2dpbi5ka25ldC5kaz4gd3JvdGUgdGhpcyBmaWxlLiAgQXMgbG9uZyBhcyB5b3UgcmV0YWluIHRoaXMKKwkgKiBub3RpY2UgeW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgc3R1ZmYuIElmIHdlIG1lZXQKKwkgKiBzb21lIGRheSwgYW5kIHlvdSB0aGluayB0aGlzIHN0dWZmIGlzIHdvcnRoIGl0LCB5b3UgY2FuIGJ1eSBtZSBhCisJICogYmVlciBpbiByZXR1cm4uICAgUG91bC1IZW5uaW5nIEthbXAKKworICAgIGIpIHNucHJpbnRmIHJlcGxhY2VtZW50CisKKwkqIENvcHlyaWdodCBQYXRyaWNrIFBvd2VsbCAxOTk1CisJKiBUaGlzIGNvZGUgaXMgYmFzZWQgb24gY29kZSB3cml0dGVuIGJ5IFBhdHJpY2sgUG93ZWxsCisJKiAocGFwb3dlbGxAYXN0YXJ0LmNvbSkgSXQgbWF5IGJlIHVzZWQgZm9yIGFueSBwdXJwb3NlIGFzIGxvbmcgYXMgdGhpcworCSogbm90aWNlIHJlbWFpbnMgaW50YWN0IG9uIGFsbCBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisKKyAgICBjKSBDb21wYXRpYmlsaXR5IGNvZGUgKG9wZW5ic2QtY29tcGF0KQorCisgICAgICAgQXBhcnQgZnJvbSB0aGUgcHJldmlvdXNseSBtZW50aW9uZWQgbGljZW5zZXMsIHZhcmlvdXMgcGllY2VzIG9mIGNvZGUKKyAgICAgICBpbiB0aGUgb3BlbmJzZC1jb21wYXQvIHN1YmRpcmVjdG9yeSBhcmUgbGljZW5zZWQgYXMgZm9sbG93czoKKworICAgICAgIFNvbWUgY29kZSBpcyBsaWNlbnNlZCB1bmRlciBhIDMtdGVybSBCU0QgbGljZW5zZSwgdG8gdGhlIGZvbGxvd2luZworICAgICAgIGNvcHlyaWdodCBob2xkZXJzOgorCisJVG9kZCBDLiBNaWxsZXIKKwlUaGVvIGRlIFJhYWR0CisJRGFtaWVuIE1pbGxlcgorCUVyaWMgUC4gQWxsbWFuCisJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQorCUNvbnN0YW50aW4gUy4gU3ZpbnRzb2ZmCisKKwkqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorCSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisJKiBhcmUgbWV0OgorCSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKwkqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKwkqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisJKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisJKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCSogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKwkqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorCSogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisJKgorCSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKwkqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorCSogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKwkqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorCSogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKwkqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisJKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKwkqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisJKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisJKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisJKiBTVUNIIERBTUFHRS4KKworICAgICAgIFNvbWUgY29kZSBpcyBsaWNlbnNlZCB1bmRlciBhbiBJU0Mtc3R5bGUgbGljZW5zZSwgdG8gdGhlIGZvbGxvd2luZworICAgICAgIGNvcHlyaWdodCBob2xkZXJzOgorCisJSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1bS4KKwlUb2RkIEMuIE1pbGxlcgorCVJleWsgRmxvZXRlcgorCUNoYWQgTXluaGllcgorCisJKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKwkqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKwkqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisJKgorCSogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRPREQgQy4gTUlMTEVSIERJU0NMQUlNUyBBTEwKKwkqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUworCSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUT0REIEMuIE1JTExFUiBCRSBMSUFCTEUKKwkqIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisJKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisJKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCisJKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisgICAgICAgU29tZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIGEgTUlULXN0eWxlIGxpY2Vuc2UgdG8gdGhlIGZvbGxvd2luZworICAgICAgIGNvcHlyaWdodCBob2xkZXJzOgorCisJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKwkqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisJKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorCSogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKwkqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisJKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorCSogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKwkqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisJKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCSogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKwkqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisJKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCSogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKwkqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisJKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorCSogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKwkqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisJKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorCSogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKwkqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisJKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorCSogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKwkqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisJKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLS0tLS0tCiskT3BlbkJTRDogTElDRU5DRSx2IDEuMTkgMjAwNC8wOC8zMCAwOToxODowOCBtYXJrdXMgRXhwICQKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvTWFrZWZpbGUuaW4gYi9vcGVuc3NoLTYuMHAxL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NmY1OGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNDQzIEBACisjICRJZDogTWFrZWZpbGUuaW4sdiAxLjMyNiAyMDEyLzA0LzA0IDAxOjI3OjU3IGRqbSBFeHAgJAorCisjIHVuY29tbWVudCBpZiB5b3UgcnVuIGEgbm9uIGJvdXJuZSBjb21wYXRhYmxlIHNoZWxsLiBJZS4gY3NoCisjU0hFTEwgPSBAU0hACisKK0FVVE9SRUNPTkY9YXV0b3JlY29uZgorCitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2JpbmRpcj1AYmluZGlyQAorc2JpbmRpcj1Ac2JpbmRpckAKK2xpYmV4ZWNkaXI9QGxpYmV4ZWNkaXJACitkYXRhZGlyPUBkYXRhZGlyQAorZGF0YXJvb3RkaXI9QGRhdGFyb290ZGlyQAorbWFuZGlyPUBtYW5kaXJACittYW5zdWJkaXI9QG1hbnN1YmRpckAKK3N5c2NvbmZkaXI9QHN5c2NvbmZkaXJACitwaWRkaXI9QHBpZGRpckAKK3NyY2Rpcj1Ac3JjZGlyQAordG9wX3NyY2Rpcj1AdG9wX3NyY2RpckAKKworREVTVERJUj0KK1ZQQVRIPUBzcmNkaXJACitTU0hfUFJPR1JBTT1AYmluZGlyQC9zc2gKK0FTS1BBU1NfUFJPR1JBTT0kKGxpYmV4ZWNkaXIpL3NzaC1hc2twYXNzCitTRlRQX1NFUlZFUj0kKGxpYmV4ZWNkaXIpL3NmdHAtc2VydmVyCitTU0hfS0VZU0lHTj0kKGxpYmV4ZWNkaXIpL3NzaC1rZXlzaWduCitTU0hfUEtDUzExX0hFTFBFUj0kKGxpYmV4ZWNkaXIpL3NzaC1wa2NzMTEtaGVscGVyCitQUklWU0VQX1BBVEg9QFBSSVZTRVBfUEFUSEAKK1NTSF9QUklWU0VQX1VTRVI9QFNTSF9QUklWU0VQX1VTRVJACitTVFJJUF9PUFQ9QFNUUklQX09QVEAKKworUEFUSFM9IC1EU1NIRElSPVwiJChzeXNjb25mZGlyKVwiIFwKKwktRF9QQVRIX1NTSF9QUk9HUkFNPVwiJChTU0hfUFJPR1JBTSlcIiBcCisJLURfUEFUSF9TU0hfQVNLUEFTU19ERUZBVUxUPVwiJChBU0tQQVNTX1BST0dSQU0pXCIgXAorCS1EX1BBVEhfU0ZUUF9TRVJWRVI9XCIkKFNGVFBfU0VSVkVSKVwiIFwKKwktRF9QQVRIX1NTSF9LRVlfU0lHTj1cIiQoU1NIX0tFWVNJR04pXCIgXAorCS1EX1BBVEhfU1NIX1BLQ1MxMV9IRUxQRVI9XCIkKFNTSF9QS0NTMTFfSEVMUEVSKVwiIFwKKwktRF9QQVRIX1NTSF9QSURESVI9XCIkKHBpZGRpcilcIiBcCisJLURfUEFUSF9QUklWU0VQX0NIUk9PVF9ESVI9XCIkKFBSSVZTRVBfUEFUSClcIiBcCisKK0NDPUBDQ0AKK0xEPUBMREAKK0NGTEFHUz1AQ0ZMQUdTQAorQ1BQRkxBR1M9LUkuIC1JJChzcmNkaXIpIEBDUFBGTEFHU0AgJChQQVRIUykgQERFRlNACitMSUJTPUBMSUJTQAorU1NITElCUz1AU1NITElCU0AKK1NTSERMSUJTPUBTU0hETElCU0AKK0xJQkVESVQ9QExJQkVESVRACitBUj1AQVJACitBV0s9QEFXS0AKK1JBTkxJQj1AUkFOTElCQAorSU5TVEFMTD1ASU5TVEFMTEAKK1BFUkw9QFBFUkxACitTRUQ9QFNFREAKK0VOVD1ARU5UQAorWEFVVEhfUEFUSD1AWEFVVEhfUEFUSEAKK0xERkxBR1M9LUwuIC1Mb3BlbmJzZC1jb21wYXQvIEBMREZMQUdTQAorRVhFRVhUPUBFWEVFWFRACitNQU5GTVQ9QE1BTkZNVEAKKworVEFSR0VUUz1zc2gkKEVYRUVYVCkgc3NoZCQoRVhFRVhUKSBzc2gtYWRkJChFWEVFWFQpIHNzaC1rZXlnZW4kKEVYRUVYVCkgc3NoLWtleXNjYW4ke0VYRUVYVH0gc3NoLWtleXNpZ24ke0VYRUVYVH0gc3NoLXBrY3MxMS1oZWxwZXIkKEVYRUVYVCkgc3NoLWFnZW50JChFWEVFWFQpIHNjcCQoRVhFRVhUKSBzZnRwLXNlcnZlciQoRVhFRVhUKSBzZnRwJChFWEVFWFQpCisKK0xJQlNTSF9PQkpTPWFjc3MubyBhdXRoZmQubyBhdXRoZmlsZS5vIGJ1ZmF1eC5vIGJ1ZmJuLm8gYnVmZmVyLm8gXAorCWNhbm9ob3N0Lm8gY2hhbm5lbHMubyBjaXBoZXIubyBjaXBoZXItYWNzcy5vIGNpcGhlci1hZXMubyBcCisJY2lwaGVyLWJmMS5vIGNpcGhlci1jdHIubyBjaXBoZXItM2RlczEubyBjbGVhbnVwLm8gXAorCWNvbXBhdC5vIGNvbXByZXNzLm8gY3JjMzIubyBkZWF0dGFjay5vIGZhdGFsLm8gaG9zdGZpbGUubyBcCisJbG9nLm8gbWF0Y2gubyBtZC1zaGEyNTYubyBtb2R1bGkubyBuY2hhbi5vIHBhY2tldC5vIFwKKwlyZWFkcGFzcy5vIHJzYS5vIHR0eW1vZGVzLm8geG1hbGxvYy5vIGFkZHJtYXRjaC5vIFwKKwlhdG9taWNpby5vIGtleS5vIGRpc3BhdGNoLm8ga2V4Lm8gbWFjLm8gdWlkc3dhcC5vIHV1ZW5jb2RlLm8gbWlzYy5vIFwKKwltb25pdG9yX2ZkcGFzcy5vIHJpam5kYWVsLm8gc3NoLWRzcy5vIHNzaC1lY2RzYS5vIHNzaC1yc2EubyBkaC5vIFwKKwlrZXhkaC5vIGtleGdleC5vIGtleGRoYy5vIGtleGdleGMubyBidWZlYy5vIGtleGVjZGgubyBrZXhlY2RoYy5vIFwKKwltc2cubyBwcm9ncmVzc21ldGVyLm8gZG5zLm8gZW50cm9weS5vIGdzcy1nZW5yLm8gdW1hYy5vIGpwYWtlLm8gXAorCXNjaG5vcnIubyBzc2gtcGtjczExLm8KKworU1NIT0JKUz0gc3NoLm8gcmVhZGNvbmYubyBjbGllbnRsb29wLm8gc3NodHR5Lm8gXAorCXNzaGNvbm5lY3QubyBzc2hjb25uZWN0MS5vIHNzaGNvbm5lY3QyLm8gbXV4Lm8gXAorCXJvYW1pbmdfY29tbW9uLm8gcm9hbWluZ19jbGllbnQubworCitTU0hET0JKUz1zc2hkLm8gYXV0aC1yaG9zdHMubyBhdXRoLXBhc3N3ZC5vIGF1dGgtcnNhLm8gYXV0aC1yaC1yc2EubyBcCisJYXVkaXQubyBhdWRpdC1ic20ubyBhdWRpdC1saW51eC5vIHBsYXRmb3JtLm8gXAorCXNzaHB0eS5vIHNzaGxvZ2luLm8gc2VydmNvbmYubyBzZXJ2ZXJsb29wLm8gXAorCWF1dGgubyBhdXRoMS5vIGF1dGgyLm8gYXV0aC1vcHRpb25zLm8gc2Vzc2lvbi5vIFwKKwlhdXRoLWNoYWxsLm8gYXV0aDItY2hhbGwubyBncm91cGFjY2Vzcy5vIFwKKwlhdXRoLXNrZXkubyBhdXRoLWJzZGF1dGgubyBhdXRoMi1ob3N0YmFzZWQubyBhdXRoMi1rYmRpbnQubyBcCisJYXV0aDItbm9uZS5vIGF1dGgyLXBhc3N3ZC5vIGF1dGgyLXB1YmtleS5vIGF1dGgyLWpwYWtlLm8gXAorCW1vbml0b3JfbW0ubyBtb25pdG9yLm8gbW9uaXRvcl93cmFwLm8ga2V4ZGhzLm8ga2V4Z2V4cy5vIGtleGVjZGhzLm8gXAorCWF1dGgta3JiNS5vIFwKKwlhdXRoMi1nc3MubyBnc3Mtc2Vydi5vIGdzcy1zZXJ2LWtyYjUubyBcCisJbG9naW5yZWMubyBhdXRoLXBhbS5vIGF1dGgtc2hhZG93Lm8gYXV0aC1zaWEubyBtZDVjcnlwdC5vIFwKKwlzZnRwLXNlcnZlci5vIHNmdHAtY29tbW9uLm8gXAorCXJvYW1pbmdfY29tbW9uLm8gcm9hbWluZ19zZXJ2Lm8gXAorCXNhbmRib3gtbnVsbC5vIHNhbmRib3gtcmxpbWl0Lm8gc2FuZGJveC1zeXN0cmFjZS5vIHNhbmRib3gtZGFyd2luLm8gXAorCXNhbmRib3gtc2VjY29tcC1maWx0ZXIubworCitNQU5QQUdFUwk9IG1vZHVsaS41Lm91dCBzY3AuMS5vdXQgc3NoLWFkZC4xLm91dCBzc2gtYWdlbnQuMS5vdXQgc3NoLWtleWdlbi4xLm91dCBzc2gta2V5c2Nhbi4xLm91dCBzc2guMS5vdXQgc3NoZC44Lm91dCBzZnRwLXNlcnZlci44Lm91dCBzZnRwLjEub3V0IHNzaC1rZXlzaWduLjgub3V0IHNzaC1wa2NzMTEtaGVscGVyLjgub3V0IHNzaGRfY29uZmlnLjUub3V0IHNzaF9jb25maWcuNS5vdXQKK01BTlBBR0VTX0lOCT0gbW9kdWxpLjUgc2NwLjEgc3NoLWFkZC4xIHNzaC1hZ2VudC4xIHNzaC1rZXlnZW4uMSBzc2gta2V5c2Nhbi4xIHNzaC4xIHNzaGQuOCBzZnRwLXNlcnZlci44IHNmdHAuMSBzc2gta2V5c2lnbi44IHNzaC1wa2NzMTEtaGVscGVyLjggc3NoZF9jb25maWcuNSBzc2hfY29uZmlnLjUKK01BTlRZUEUJCT0gQE1BTlRZUEVACisKK0NPTkZJR0ZJTEVTPXNzaGRfY29uZmlnLm91dCBzc2hfY29uZmlnLm91dCBtb2R1bGkub3V0CitDT05GSUdGSUxFU19JTj1zc2hkX2NvbmZpZyBzc2hfY29uZmlnIG1vZHVsaQorCitQQVRIU1VCUwk9IFwKKwktZSAnc3wvZXRjL3NzaC9zc2hfY29uZmlnfCQoc3lzY29uZmRpcikvc3NoX2NvbmZpZ3xnJyBcCisJLWUgJ3N8L2V0Yy9zc2gvc3NoX2tub3duX2hvc3RzfCQoc3lzY29uZmRpcikvc3NoX2tub3duX2hvc3RzfGcnIFwKKwktZSAnc3wvZXRjL3NzaC9zc2hkX2NvbmZpZ3wkKHN5c2NvbmZkaXIpL3NzaGRfY29uZmlnfGcnIFwKKwktZSAnc3wvdXNyL2xpYmV4ZWN8JChsaWJleGVjZGlyKXxnJyBcCisJLWUgJ3N8L2V0Yy9zaG9zdHMuZXF1aXZ8JChzeXNjb25mZGlyKS9zaG9zdHMuZXF1aXZ8ZycgXAorCS1lICdzfC9ldGMvc3NoL3NzaF9ob3N0X2tleXwkKHN5c2NvbmZkaXIpL3NzaF9ob3N0X2tleXxnJyBcCisJLWUgJ3N8L2V0Yy9zc2gvc3NoX2hvc3RfZWNkc2Ffa2V5fCQoc3lzY29uZmRpcikvc3NoX2hvc3RfZWNkc2Ffa2V5fGcnIFwKKwktZSAnc3wvZXRjL3NzaC9zc2hfaG9zdF9kc2Ffa2V5fCQoc3lzY29uZmRpcikvc3NoX2hvc3RfZHNhX2tleXxnJyBcCisJLWUgJ3N8L2V0Yy9zc2gvc3NoX2hvc3RfcnNhX2tleXwkKHN5c2NvbmZkaXIpL3NzaF9ob3N0X3JzYV9rZXl8ZycgXAorCS1lICdzfC92YXIvcnVuL3NzaGQucGlkfCQocGlkZGlyKS9zc2hkLnBpZHxnJyBcCisJLWUgJ3N8L2V0Yy9tb2R1bGl8JChzeXNjb25mZGlyKS9tb2R1bGl8ZycgXAorCS1lICdzfC9ldGMvc3NoL21vZHVsaXwkKHN5c2NvbmZkaXIpL21vZHVsaXxnJyBcCisJLWUgJ3N8L2V0Yy9zc2gvc3NocmN8JChzeXNjb25mZGlyKS9zc2hyY3xnJyBcCisJLWUgJ3N8L3Vzci9YMTFSNi9iaW4veGF1dGh8JChYQVVUSF9QQVRIKXxnJyBcCisJLWUgJ3N8L3Zhci9lbXB0eXwkKFBSSVZTRVBfUEFUSCl8ZycgXAorCS1lICdzfC91c3IvYmluOi9iaW46L3Vzci9zYmluOi9zYmlufEB1c2VyX3BhdGhAfGcnCisKK0ZJWFBBVEhTQ01ECT0gJChTRUQpICQoUEFUSFNVQlMpCisKK2FsbDogJChDT05GSUdGSUxFUykgJChNQU5QQUdFUykgJChUQVJHRVRTKQorCiskKExJQlNTSF9PQkpTKTogTWFrZWZpbGUuaW4gY29uZmlnLmgKKyQoU1NIT0JKUyk6IE1ha2VmaWxlLmluIGNvbmZpZy5oCiskKFNTSERPQkpTKTogTWFrZWZpbGUuaW4gY29uZmlnLmgKKworLmMubzoKKwkkKENDKSAkKENGTEFHUykgJChDUFBGTEFHUykgLWMgJDwKKworTElCQ09NUEFUPW9wZW5ic2QtY29tcGF0L2xpYm9wZW5ic2QtY29tcGF0LmEKKyQoTElCQ09NUEFUKTogYWx3YXlzCisJKGNkIG9wZW5ic2QtY29tcGF0ICYmICQoTUFLRSkpCithbHdheXM6CisKK2xpYnNzaC5hOiAkKExJQlNTSF9PQkpTKQorCSQoQVIpIHJ2ICRAICQoTElCU1NIX09CSlMpCisJJChSQU5MSUIpICRACisKK3NzaCQoRVhFRVhUKTogJChMSUJDT01QQVQpIGxpYnNzaC5hICQoU1NIT0JKUykKKwkkKExEKSAtbyAkQCAkKFNTSE9CSlMpICQoTERGTEFHUykgLWxzc2ggLWxvcGVuYnNkLWNvbXBhdCAkKFNTSExJQlMpICQoTElCUykKKworc3NoZCQoRVhFRVhUKTogbGlic3NoLmEJJChMSUJDT01QQVQpICQoU1NIRE9CSlMpCisJJChMRCkgLW8gJEAgJChTU0hET0JKUykgJChMREZMQUdTKSAtbHNzaCAtbG9wZW5ic2QtY29tcGF0ICQoU1NIRExJQlMpICQoTElCUykKKworc2NwJChFWEVFWFQpOiAkKExJQkNPTVBBVCkgbGlic3NoLmEgc2NwLm8gcHJvZ3Jlc3NtZXRlci5vCisJJChMRCkgLW8gJEAgc2NwLm8gcHJvZ3Jlc3NtZXRlci5vIGJ1ZmF1eC5vICQoTERGTEFHUykgLWxzc2ggLWxvcGVuYnNkLWNvbXBhdCAkKExJQlMpCisKK3NzaC1hZGQkKEVYRUVYVCk6ICQoTElCQ09NUEFUKSBsaWJzc2guYSBzc2gtYWRkLm8KKwkkKExEKSAtbyAkQCBzc2gtYWRkLm8gJChMREZMQUdTKSAtbHNzaCAtbG9wZW5ic2QtY29tcGF0ICQoTElCUykKKworc3NoLWFnZW50JChFWEVFWFQpOiAkKExJQkNPTVBBVCkgbGlic3NoLmEgc3NoLWFnZW50Lm8gc3NoLXBrY3MxMS1jbGllbnQubworCSQoTEQpIC1vICRAIHNzaC1hZ2VudC5vIHNzaC1wa2NzMTEtY2xpZW50Lm8gJChMREZMQUdTKSAtbHNzaCAtbG9wZW5ic2QtY29tcGF0ICQoTElCUykKKworc3NoLWtleWdlbiQoRVhFRVhUKTogJChMSUJDT01QQVQpIGxpYnNzaC5hIHNzaC1rZXlnZW4ubworCSQoTEQpIC1vICRAIHNzaC1rZXlnZW4ubyAkKExERkxBR1MpIC1sc3NoIC1sb3BlbmJzZC1jb21wYXQgJChMSUJTKQorCitzc2gta2V5c2lnbiQoRVhFRVhUKTogJChMSUJDT01QQVQpIGxpYnNzaC5hIHNzaC1rZXlzaWduLm8gcm9hbWluZ19kdW1teS5vIHJlYWRjb25mLm8KKwkkKExEKSAtbyAkQCBzc2gta2V5c2lnbi5vIHJlYWRjb25mLm8gcm9hbWluZ19kdW1teS5vICQoTERGTEFHUykgLWxzc2ggLWxvcGVuYnNkLWNvbXBhdCAkKExJQlMpCisKK3NzaC1wa2NzMTEtaGVscGVyJChFWEVFWFQpOiAkKExJQkNPTVBBVCkgbGlic3NoLmEgc3NoLXBrY3MxMS1oZWxwZXIubyBzc2gtcGtjczExLm8KKwkkKExEKSAtbyAkQCBzc2gtcGtjczExLWhlbHBlci5vIHNzaC1wa2NzMTEubyAkKExERkxBR1MpIC1sc3NoIC1sb3BlbmJzZC1jb21wYXQgLWxzc2ggLWxvcGVuYnNkLWNvbXBhdCAkKExJQlMpCisKK3NzaC1rZXlzY2FuJChFWEVFWFQpOiAkKExJQkNPTVBBVCkgbGlic3NoLmEgc3NoLWtleXNjYW4ubyByb2FtaW5nX2R1bW15Lm8KKwkkKExEKSAtbyAkQCBzc2gta2V5c2Nhbi5vIHJvYW1pbmdfZHVtbXkubyAkKExERkxBR1MpIC1sc3NoIC1sb3BlbmJzZC1jb21wYXQgLWxzc2ggJChMSUJTKQorCitzZnRwLXNlcnZlciQoRVhFRVhUKTogJChMSUJDT01QQVQpIGxpYnNzaC5hIHNmdHAubyBzZnRwLWNvbW1vbi5vIHNmdHAtc2VydmVyLm8gc2Z0cC1zZXJ2ZXItbWFpbi5vCisJJChMRCkgLW8gJEAgc2Z0cC1zZXJ2ZXIubyBzZnRwLWNvbW1vbi5vIHNmdHAtc2VydmVyLW1haW4ubyAkKExERkxBR1MpIC1sc3NoIC1sb3BlbmJzZC1jb21wYXQgJChMSUJTKQorCitzZnRwJChFWEVFWFQpOiAkKExJQkNPTVBBVCkgbGlic3NoLmEgc2Z0cC5vIHNmdHAtY2xpZW50Lm8gc2Z0cC1jb21tb24ubyBzZnRwLWdsb2IubyBwcm9ncmVzc21ldGVyLm8KKwkkKExEKSAtbyAkQCBwcm9ncmVzc21ldGVyLm8gc2Z0cC5vIHNmdHAtY2xpZW50Lm8gc2Z0cC1jb21tb24ubyBzZnRwLWdsb2IubyAkKExERkxBR1MpIC1sc3NoIC1sb3BlbmJzZC1jb21wYXQgJChMSUJTKSAkKExJQkVESVQpCisKKyMgdGVzdCBkcml2ZXIgZm9yIHRoZSBsb2dpbnJlYyBjb2RlIC0gbm90IGJ1aWx0IGJ5IGRlZmF1bHQKK2xvZ2ludGVzdDogbG9naW50ZXN0Lm8gJChMSUJDT01QQVQpIGxpYnNzaC5hIGxvZ2lucmVjLm8KKwkkKExEKSAtbyAkQCBsb2dpbnRlc3QubyAkKExERkxBR1MpIGxvZ2lucmVjLm8gLWxvcGVuYnNkLWNvbXBhdCAtbHNzaCAkKExJQlMpCisKKyQoTUFOUEFHRVMpOiAkKE1BTlBBR0VTX0lOKQorCWlmIHRlc3QgIiQoTUFOVFlQRSkiID0gImNhdCI7IHRoZW4gXAorCQltYW5wYWdlPSQoc3JjZGlyKS9gZWNobyAkQCB8IHNlZCAncy9cLlsxLTldXC5vdXQkJC9cLjAvJ2A7IFwKKwllbHNlIFwKKwkJbWFucGFnZT0kKHNyY2RpcikvYGVjaG8gJEAgfCBzZWQgJ3MvXC5vdXQkJC8vJ2A7IFwKKwlmaTsgXAorCWlmIHRlc3QgIiQoTUFOVFlQRSkiID0gIm1hbiI7IHRoZW4gXAorCQkkKEZJWFBBVEhTQ01EKSAkJHttYW5wYWdlfSB8ICQoQVdLKSAtZiAkKHNyY2RpcikvbWRvYzJtYW4uYXdrID4gJEA7IFwKKwllbHNlIFwKKwkJJChGSVhQQVRIU0NNRCkgJCR7bWFucGFnZX0gPiAkQDsgXAorCWZpCisKKyQoQ09ORklHRklMRVMpOiAkKENPTkZJR0ZJTEVTX0lOKQorCWNvbmZmaWxlPWBlY2hvICRAIHwgc2VkICdzLy5vdXQkJC8vJ2A7IFwKKwkkKEZJWFBBVEhTQ01EKSAkKHNyY2RpcikvJCR7Y29uZmZpbGV9ID4gJEAKKworIyBmYWtlIHJ1bGUgdG8gc3RvcCBtYWtlIHRyeWluZyB0byBjb21waWxlIG1vZHVsaS5vIGludG8gYSBiaW5hcnkgIm1vZHVsaS5vIgorbW9kdWxpOgorCWVjaG8KKworY2xlYW46CXJlZ3Jlc3NjbGVhbgorCXJtIC1mICoubyAqLmEgJChUQVJHRVRTKSBsb2dpbnRlc3QgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cKKwlybSAtZiAqLm91dCBjb3JlIHN1cnZleQorCShjZCBvcGVuYnNkLWNvbXBhdCAmJiAkKE1BS0UpIGNsZWFuKQorCitkaXN0Y2xlYW46CXJlZ3Jlc3NjbGVhbgorCXJtIC1mICoubyAqLmEgJChUQVJHRVRTKSBsb2dpbnRlc3QgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cKKwlybSAtZiAqLm91dCBjb3JlIG9wZW5zc2hkLmluaXQgb3BlbnNzaC54bWwKKwlybSAtZiBNYWtlZmlsZSBidWlsZHBrZy5zaCBjb25maWcuaCBjb25maWcuc3RhdHVzCisJcm0gLWYgc3VydmV5LnNoIG9wZW5ic2QtY29tcGF0L3JlZ3Jlc3MvTWFrZWZpbGUgKn4gCisJcm0gLXJmIGF1dG9tNHRlLmNhY2hlCisJKGNkIG9wZW5ic2QtY29tcGF0ICYmICQoTUFLRSkgZGlzdGNsZWFuKQorCWlmIHRlc3QgLWQgcGtnIDsgdGhlbiBcCisJCXJtIC1mciBwa2cgOyBcCisJZmkKKwordmVyeWNsZWFuOiBkaXN0Y2xlYW4KKwlybSAtZiBjb25maWd1cmUgY29uZmlnLmguaW4gKi4wCisKK2NsZWFuZGlyOiB2ZXJ5Y2xlYW4KKworbXJwcm9wZXI6IHZlcnljbGVhbgorCityZWFsY2xlYW46IHZlcnljbGVhbgorCitjYXRtYW4tZG86CisJQGZvciBmIGluICQoTUFOUEFHRVNfSU4pIDsgZG8gXAorCQliYXNlPWBlY2hvICQkZiB8IHNlZCAncy9cLi4qJCQvLydgIDsgXAorCQllY2hvICIkJGYgLT4gJCRiYXNlLjAiIDsgXAorCQkkKE1BTkZNVCkgJCRmIHwgY2F0IC12IHwgc2VkIC1lICdzLy5cXkgvL2cnIFwKKwkJCT4kJGJhc2UuMCA7IFwKKwlkb25lCisKK2Rpc3RwcmVwOiBjYXRtYW4tZG8KKwkkKEFVVE9SRUNPTkYpCisJLXJtIC1yZiBhdXRvbTR0ZS5jYWNoZQorCitpbnN0YWxsOiAkKENPTkZJR0ZJTEVTKSAkKE1BTlBBR0VTKSAkKFRBUkdFVFMpIGluc3RhbGwtZmlsZXMgaW5zdGFsbC1zeXNjb25mIGhvc3Qta2V5IGNoZWNrLWNvbmZpZworaW5zdGFsbC1ub2tleXM6ICQoQ09ORklHRklMRVMpICQoTUFOUEFHRVMpICQoVEFSR0VUUykgaW5zdGFsbC1maWxlcyBpbnN0YWxsLXN5c2NvbmYKK2luc3RhbGwtbm9zeXNjb25mOiAkKENPTkZJR0ZJTEVTKSAkKE1BTlBBR0VTKSAkKFRBUkdFVFMpIGluc3RhbGwtZmlsZXMKKworY2hlY2stY29uZmlnOgorCS0kKERFU1RESVIpJChzYmluZGlyKS9zc2hkIC10IC1mICQoREVTVERJUikkKHN5c2NvbmZkaXIpL3NzaGRfY29uZmlnCisKK2luc3RhbGwtZmlsZXM6CisJJChzcmNkaXIpL21raW5zdGFsbGRpcnMgJChERVNURElSKSQoYmluZGlyKQorCSQoc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoREVTVERJUikkKHNiaW5kaXIpCisJJChzcmNkaXIpL21raW5zdGFsbGRpcnMgJChERVNURElSKSQobWFuZGlyKQorCSQoc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpMQorCSQoc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpNQorCSQoc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpOAorCSQoc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoREVTVERJUikkKGxpYmV4ZWNkaXIpCisJKHVtYXNrIDAyMiA7ICQoc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoREVTVERJUikkKFBSSVZTRVBfUEFUSCkpCisJJChJTlNUQUxMKSAtbSAwNzU1ICQoU1RSSVBfT1BUKSBzc2gkKEVYRUVYVCkgJChERVNURElSKSQoYmluZGlyKS9zc2gkKEVYRUVYVCkKKwkkKElOU1RBTEwpIC1tIDA3NTUgJChTVFJJUF9PUFQpIHNjcCQoRVhFRVhUKSAkKERFU1RESVIpJChiaW5kaXIpL3NjcCQoRVhFRVhUKQorCSQoSU5TVEFMTCkgLW0gMDc1NSAkKFNUUklQX09QVCkgc3NoLWFkZCQoRVhFRVhUKSAkKERFU1RESVIpJChiaW5kaXIpL3NzaC1hZGQkKEVYRUVYVCkKKwkkKElOU1RBTEwpIC1tIDA3NTUgJChTVFJJUF9PUFQpIHNzaC1hZ2VudCQoRVhFRVhUKSAkKERFU1RESVIpJChiaW5kaXIpL3NzaC1hZ2VudCQoRVhFRVhUKQorCSQoSU5TVEFMTCkgLW0gMDc1NSAkKFNUUklQX09QVCkgc3NoLWtleWdlbiQoRVhFRVhUKSAkKERFU1RESVIpJChiaW5kaXIpL3NzaC1rZXlnZW4kKEVYRUVYVCkKKwkkKElOU1RBTEwpIC1tIDA3NTUgJChTVFJJUF9PUFQpIHNzaC1rZXlzY2FuJChFWEVFWFQpICQoREVTVERJUikkKGJpbmRpcikvc3NoLWtleXNjYW4kKEVYRUVYVCkKKwkkKElOU1RBTEwpIC1tIDA3NTUgJChTVFJJUF9PUFQpIHNzaGQkKEVYRUVYVCkgJChERVNURElSKSQoc2JpbmRpcikvc3NoZCQoRVhFRVhUKQorCSQoSU5TVEFMTCkgLW0gNDcxMSAkKFNUUklQX09QVCkgc3NoLWtleXNpZ24kKEVYRUVYVCkgJChERVNURElSKSQoU1NIX0tFWVNJR04pJChFWEVFWFQpCisJJChJTlNUQUxMKSAtbSAwNzU1ICQoU1RSSVBfT1BUKSBzc2gtcGtjczExLWhlbHBlciQoRVhFRVhUKSAkKERFU1RESVIpJChTU0hfUEtDUzExX0hFTFBFUikkKEVYRUVYVCkKKwkkKElOU1RBTEwpIC1tIDA3NTUgJChTVFJJUF9PUFQpIHNmdHAkKEVYRUVYVCkgJChERVNURElSKSQoYmluZGlyKS9zZnRwJChFWEVFWFQpCisJJChJTlNUQUxMKSAtbSAwNzU1ICQoU1RSSVBfT1BUKSBzZnRwLXNlcnZlciQoRVhFRVhUKSAkKERFU1RESVIpJChTRlRQX1NFUlZFUikkKEVYRUVYVCkKKwkkKElOU1RBTEwpIC1tIDY0NCBzc2guMS5vdXQgJChERVNURElSKSQobWFuZGlyKS8kKG1hbnN1YmRpcikxL3NzaC4xCisJJChJTlNUQUxMKSAtbSA2NDQgc2NwLjEub3V0ICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpMS9zY3AuMQorCSQoSU5TVEFMTCkgLW0gNjQ0IHNzaC1hZGQuMS5vdXQgJChERVNURElSKSQobWFuZGlyKS8kKG1hbnN1YmRpcikxL3NzaC1hZGQuMQorCSQoSU5TVEFMTCkgLW0gNjQ0IHNzaC1hZ2VudC4xLm91dCAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTEvc3NoLWFnZW50LjEKKwkkKElOU1RBTEwpIC1tIDY0NCBzc2gta2V5Z2VuLjEub3V0ICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpMS9zc2gta2V5Z2VuLjEKKwkkKElOU1RBTEwpIC1tIDY0NCBzc2gta2V5c2Nhbi4xLm91dCAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTEvc3NoLWtleXNjYW4uMQorCSQoSU5TVEFMTCkgLW0gNjQ0IG1vZHVsaS41Lm91dCAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTUvbW9kdWxpLjUKKwkkKElOU1RBTEwpIC1tIDY0NCBzc2hkX2NvbmZpZy41Lm91dCAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTUvc3NoZF9jb25maWcuNQorCSQoSU5TVEFMTCkgLW0gNjQ0IHNzaF9jb25maWcuNS5vdXQgJChERVNURElSKSQobWFuZGlyKS8kKG1hbnN1YmRpcik1L3NzaF9jb25maWcuNQorCSQoSU5TVEFMTCkgLW0gNjQ0IHNzaGQuOC5vdXQgJChERVNURElSKSQobWFuZGlyKS8kKG1hbnN1YmRpcik4L3NzaGQuOAorCSQoSU5TVEFMTCkgLW0gNjQ0IHNmdHAuMS5vdXQgJChERVNURElSKSQobWFuZGlyKS8kKG1hbnN1YmRpcikxL3NmdHAuMQorCSQoSU5TVEFMTCkgLW0gNjQ0IHNmdHAtc2VydmVyLjgub3V0ICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpOC9zZnRwLXNlcnZlci44CisJJChJTlNUQUxMKSAtbSA2NDQgc3NoLWtleXNpZ24uOC5vdXQgJChERVNURElSKSQobWFuZGlyKS8kKG1hbnN1YmRpcik4L3NzaC1rZXlzaWduLjgKKwkkKElOU1RBTEwpIC1tIDY0NCBzc2gtcGtjczExLWhlbHBlci44Lm91dCAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTgvc3NoLXBrY3MxMS1oZWxwZXIuOAorCS1ybSAtZiAkKERFU1RESVIpJChiaW5kaXIpL3Nsb2dpbgorCWxuIC1zIC4vc3NoJChFWEVFWFQpICQoREVTVERJUikkKGJpbmRpcikvc2xvZ2luCisJLXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpMS9zbG9naW4uMQorCWxuIC1zIC4vc3NoLjEgJChERVNURElSKSQobWFuZGlyKS8kKG1hbnN1YmRpcikxL3Nsb2dpbi4xCisKK2luc3RhbGwtc3lzY29uZjoKKwlpZiBbICEgLWQgJChERVNURElSKSQoc3lzY29uZmRpcikgXTsgdGhlbiBcCisJCSQoc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoREVTVERJUikkKHN5c2NvbmZkaXIpOyBcCisJZmkKKwlAaWYgWyAhIC1mICQoREVTVERJUikkKHN5c2NvbmZkaXIpL3NzaF9jb25maWcgXTsgdGhlbiBcCisJCSQoSU5TVEFMTCkgLW0gNjQ0IHNzaF9jb25maWcub3V0ICQoREVTVERJUikkKHN5c2NvbmZkaXIpL3NzaF9jb25maWc7IFwKKwllbHNlIFwKKwkJZWNobyAiJChERVNURElSKSQoc3lzY29uZmRpcikvc3NoX2NvbmZpZyBhbHJlYWR5IGV4aXN0cywgaW5zdGFsbCB3aWxsIG5vdCBvdmVyd3JpdGUiOyBcCisJZmkKKwlAaWYgWyAhIC1mICQoREVTVERJUikkKHN5c2NvbmZkaXIpL3NzaGRfY29uZmlnIF07IHRoZW4gXAorCQkkKElOU1RBTEwpIC1tIDY0NCBzc2hkX2NvbmZpZy5vdXQgJChERVNURElSKSQoc3lzY29uZmRpcikvc3NoZF9jb25maWc7IFwKKwllbHNlIFwKKwkJZWNobyAiJChERVNURElSKSQoc3lzY29uZmRpcikvc3NoZF9jb25maWcgYWxyZWFkeSBleGlzdHMsIGluc3RhbGwgd2lsbCBub3Qgb3ZlcndyaXRlIjsgXAorCWZpCisJQGlmIFsgISAtZiAkKERFU1RESVIpJChzeXNjb25mZGlyKS9tb2R1bGkgXTsgdGhlbiBcCisJCWlmIFsgLWYgJChERVNURElSKSQoc3lzY29uZmRpcikvcHJpbWVzIF07IHRoZW4gXAorCQkJZWNobyAibW92aW5nICQoREVTVERJUikkKHN5c2NvbmZkaXIpL3ByaW1lcyB0byAkKERFU1RESVIpJChzeXNjb25mZGlyKS9tb2R1bGkiOyBcCisJCQltdiAiJChERVNURElSKSQoc3lzY29uZmRpcikvcHJpbWVzIiAiJChERVNURElSKSQoc3lzY29uZmRpcikvbW9kdWxpIjsgXAorCQllbHNlIFwKKwkJCSQoSU5TVEFMTCkgLW0gNjQ0IG1vZHVsaS5vdXQgJChERVNURElSKSQoc3lzY29uZmRpcikvbW9kdWxpOyBcCisJCWZpIDsgXAorCWVsc2UgXAorCQllY2hvICIkKERFU1RESVIpJChzeXNjb25mZGlyKS9tb2R1bGkgYWxyZWFkeSBleGlzdHMsIGluc3RhbGwgd2lsbCBub3Qgb3ZlcndyaXRlIjsgXAorCWZpCisKK2hvc3Qta2V5OiBzc2gta2V5Z2VuJChFWEVFWFQpCisJQGlmIFsgLXogIiQoREVTVERJUikiIF0gOyB0aGVuIFwKKwkJaWYgWyAtZiAiJChzeXNjb25mZGlyKS9zc2hfaG9zdF9rZXkiIF0gOyB0aGVuIFwKKwkJCWVjaG8gIiQoc3lzY29uZmRpcikvc3NoX2hvc3Rfa2V5IGFscmVhZHkgZXhpc3RzLCBza2lwcGluZy4iIDsgXAorCQllbHNlIFwKKwkJCS4vc3NoLWtleWdlbiAtdCByc2ExIC1mICQoc3lzY29uZmRpcikvc3NoX2hvc3Rfa2V5IC1OICIiIDsgXAorCQlmaSA7IFwKKwkJaWYgWyAtZiAkKHN5c2NvbmZkaXIpL3NzaF9ob3N0X2RzYV9rZXkgXSA7IHRoZW4gXAorCQkJZWNobyAiJChzeXNjb25mZGlyKS9zc2hfaG9zdF9kc2Ffa2V5IGFscmVhZHkgZXhpc3RzLCBza2lwcGluZy4iIDsgXAorCQllbHNlIFwKKwkJCS4vc3NoLWtleWdlbiAtdCBkc2EgLWYgJChzeXNjb25mZGlyKS9zc2hfaG9zdF9kc2Ffa2V5IC1OICIiIDsgXAorCQlmaSA7IFwKKwkJaWYgWyAtZiAkKHN5c2NvbmZkaXIpL3NzaF9ob3N0X3JzYV9rZXkgXSA7IHRoZW4gXAorCQkJZWNobyAiJChzeXNjb25mZGlyKS9zc2hfaG9zdF9yc2Ffa2V5IGFscmVhZHkgZXhpc3RzLCBza2lwcGluZy4iIDsgXAorCQllbHNlIFwKKwkJCS4vc3NoLWtleWdlbiAtdCByc2EgLWYgJChzeXNjb25mZGlyKS9zc2hfaG9zdF9yc2Ffa2V5IC1OICIiIDsgXAorCQlmaSA7IFwKKwkJaWYgWyAteiAiQENPTU1FTlRfT1VUX0VDQ0AiIF0gOyB0aGVuIFwKKwkJICAgIGlmIFsgLWYgJChzeXNjb25mZGlyKS9zc2hfaG9zdF9lY2RzYV9rZXkgXSA7IHRoZW4gXAorCQkJZWNobyAiJChzeXNjb25mZGlyKS9zc2hfaG9zdF9lY2RzYV9rZXkgYWxyZWFkeSBleGlzdHMsIHNraXBwaW5nLiIgOyBcCisJCSAgICBlbHNlIFwKKwkJCS4vc3NoLWtleWdlbiAtdCBlY2RzYSAtZiAkKHN5c2NvbmZkaXIpL3NzaF9ob3N0X2VjZHNhX2tleSAtTiAiIiA7IFwKKwkJICAgIGZpIDsgXAorCQlmaSA7IFwKKwlmaSA7CisKK2hvc3Qta2V5LWZvcmNlOiBzc2gta2V5Z2VuJChFWEVFWFQpCisJLi9zc2gta2V5Z2VuIC10IHJzYTEgLWYgJChERVNURElSKSQoc3lzY29uZmRpcikvc3NoX2hvc3Rfa2V5IC1OICIiCisJLi9zc2gta2V5Z2VuIC10IGRzYSAtZiAkKERFU1RESVIpJChzeXNjb25mZGlyKS9zc2hfaG9zdF9kc2Ffa2V5IC1OICIiCisJLi9zc2gta2V5Z2VuIC10IHJzYSAtZiAkKERFU1RESVIpJChzeXNjb25mZGlyKS9zc2hfaG9zdF9yc2Ffa2V5IC1OICIiCisJdGVzdCAteiAiQENPTU1FTlRfT1VUX0VDQ0AiICYmIC4vc3NoLWtleWdlbiAtdCBlY2RzYSAtZiAkKERFU1RESVIpJChzeXNjb25mZGlyKS9zc2hfaG9zdF9lY2RzYV9rZXkgLU4gIiIKKwordW5pbnN0YWxsYWxsOgl1bmluc3RhbGwKKwktcm0gLWYgJChERVNURElSKSQoc3lzY29uZmRpcikvc3NoX2NvbmZpZworCS1ybSAtZiAkKERFU1RESVIpJChzeXNjb25mZGlyKS9zc2hkX2NvbmZpZworCS1ybWRpciAkKERFU1RESVIpJChzeXNjb25mZGlyKQorCS1ybWRpciAkKERFU1RESVIpJChiaW5kaXIpCisJLXJtZGlyICQoREVTVERJUikkKHNiaW5kaXIpCisJLXJtZGlyICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpMQorCS1ybWRpciAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTgKKwktcm1kaXIgJChERVNURElSKSQobWFuZGlyKQorCS1ybWRpciAkKERFU1RESVIpJChsaWJleGVjZGlyKQorCit1bmluc3RhbGw6CisJLXJtIC1mICQoREVTVERJUikkKGJpbmRpcikvc2xvZ2luCisJLXJtIC1mICQoREVTVERJUikkKGJpbmRpcikvc3NoJChFWEVFWFQpCisJLXJtIC1mICQoREVTVERJUikkKGJpbmRpcikvc2NwJChFWEVFWFQpCisJLXJtIC1mICQoREVTVERJUikkKGJpbmRpcikvc3NoLWFkZCQoRVhFRVhUKQorCS1ybSAtZiAkKERFU1RESVIpJChiaW5kaXIpL3NzaC1hZ2VudCQoRVhFRVhUKQorCS1ybSAtZiAkKERFU1RESVIpJChiaW5kaXIpL3NzaC1rZXlnZW4kKEVYRUVYVCkKKwktcm0gLWYgJChERVNURElSKSQoYmluZGlyKS9zc2gta2V5c2NhbiQoRVhFRVhUKQorCS1ybSAtZiAkKERFU1RESVIpJChiaW5kaXIpL3NmdHAkKEVYRUVYVCkKKwktcm0gLWYgJChERVNURElSKSQoc2JpbmRpcikvc3NoZCQoRVhFRVhUKQorCS1ybSAtciAkKERFU1RESVIpJChTRlRQX1NFUlZFUikkKEVYRUVYVCkKKwktcm0gLWYgJChERVNURElSKSQoU1NIX0tFWVNJR04pJChFWEVFWFQpCisJLXJtIC1mICQoREVTVERJUikkKFNTSF9QS0NTMTFfSEVMUEVSKSQoRVhFRVhUKQorCS1ybSAtZiAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTEvc3NoLjEKKwktcm0gLWYgJChERVNURElSKSQobWFuZGlyKS8kKG1hbnN1YmRpcikxL3NjcC4xCisJLXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpMS9zc2gtYWRkLjEKKwktcm0gLWYgJChERVNURElSKSQobWFuZGlyKS8kKG1hbnN1YmRpcikxL3NzaC1hZ2VudC4xCisJLXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpMS9zc2gta2V5Z2VuLjEKKwktcm0gLWYgJChERVNURElSKSQobWFuZGlyKS8kKG1hbnN1YmRpcikxL3NmdHAuMQorCS1ybSAtZiAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTEvc3NoLWtleXNjYW4uMQorCS1ybSAtZiAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTgvc3NoZC44CisJLXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpOC9zZnRwLXNlcnZlci44CisJLXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpOC9zc2gta2V5c2lnbi44CisJLXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpOC9zc2gtcGtjczExLWhlbHBlci44CisJLXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpMS9zbG9naW4uMQorCit0ZXN0cyBpbnRlcm9wLXRlc3RzOgkkKFRBUkdFVFMpCisJQlVJTERESVI9YHB3ZGA7IFwKKwlbIC1kIGBwd2RgL3JlZ3Jlc3MgXSAgfHwgIG1rZGlyIC1wIGBwd2RgL3JlZ3Jlc3M7IFwKKwlbIC1mIGBwd2RgL3JlZ3Jlc3MvTWFrZWZpbGUgXSAgfHwgXAorCSAgICBsbiAtcyBgY2QgJChzcmNkaXIpICYmIHB3ZGAvcmVncmVzcy9NYWtlZmlsZSBgcHdkYC9yZWdyZXNzL01ha2VmaWxlIDsgXAorCVRFU1RfU0hFTEw9IkBURVNUX1NIRUxMQCI7IFwKKwlURVNUX1NTSF9TU0g9IiQke0JVSUxERElSfS9zc2giOyBcCisJVEVTVF9TU0hfU1NIRD0iJCR7QlVJTERESVJ9L3NzaGQiOyBcCisJVEVTVF9TU0hfU1NIQUdFTlQ9IiQke0JVSUxERElSfS9zc2gtYWdlbnQiOyBcCisJVEVTVF9TU0hfU1NIQUREPSIkJHtCVUlMRERJUn0vc3NoLWFkZCI7IFwKKwlURVNUX1NTSF9TU0hLRVlHRU49IiQke0JVSUxERElSfS9zc2gta2V5Z2VuIjsgXAorCVRFU1RfU1NIX1NTSFBLQ1MxMUhFTFBFUj0iJCR7QlVJTERESVJ9L3NzaC1wa2NzMTEtaGVscGVyIjsgXAorCVRFU1RfU1NIX1NTSEtFWVNDQU49IiQke0JVSUxERElSfS9zc2gta2V5c2NhbiI7IFwKKwlURVNUX1NTSF9TRlRQPSIkJHtCVUlMRERJUn0vc2Z0cCI7IFwKKwlURVNUX1NTSF9TRlRQU0VSVkVSPSIkJHtCVUlMRERJUn0vc2Z0cC1zZXJ2ZXIiOyBcCisJVEVTVF9TU0hfUExJTks9InBsaW5rIjsgXAorCVRFU1RfU1NIX1BVVFRZR0VOPSJwdXR0eWdlbiI7IFwKKwlURVNUX1NTSF9DT05DSD0iY29uY2giOyBcCisJVEVTVF9TU0hfSVBWNj0iQFRFU1RfU1NIX0lQVjZAIiA7IFwKKwlURVNUX1NTSF9FQ0M9IkBURVNUX1NTSF9FQ0NAIiA7IFwKKwlURVNUX1NTSF9TSEEyNTY9IkBURVNUX1NTSF9TSEEyNTZAIiA7IFwKKwljZCAkKHNyY2RpcikvcmVncmVzcyB8fCBleGl0ICQkPzsgXAorCSQoTUFLRSkgXAorCQkuT0JKRElSPSIkJHtCVUlMRERJUn0vcmVncmVzcyIgXAorCQkuQ1VSRElSPSJgcHdkYCIgXAorCQlCVUlMRERJUj0iJCR7QlVJTERESVJ9IiBcCisJCU9CSj0iJCR7QlVJTERESVJ9L3JlZ3Jlc3MvIiBcCisJCVBBVEg9IiQke0JVSUxERElSfTokJHtQQVRIfSIgXAorCQlURVNUX1NIRUxMPSIkJHtURVNUX1NIRUxMfSIgXAorCQlURVNUX1NTSF9TU0g9IiQke1RFU1RfU1NIX1NTSH0iIFwKKwkJVEVTVF9TU0hfU1NIRD0iJCR7VEVTVF9TU0hfU1NIRH0iIFwKKwkJVEVTVF9TU0hfU1NIQUdFTlQ9IiQke1RFU1RfU1NIX1NTSEFHRU5UfSIgXAorCQlURVNUX1NTSF9TU0hBREQ9IiQke1RFU1RfU1NIX1NTSEFERH0iIFwKKwkJVEVTVF9TU0hfU1NIS0VZR0VOPSIkJHtURVNUX1NTSF9TU0hLRVlHRU59IiBcCisJCVRFU1RfU1NIX1NTSFBLQ1MxMUhFTFBFUj0iJCR7VEVTVF9TU0hfU1NIUEtDUzExSEVMUEVSfSIgXAorCQlURVNUX1NTSF9TU0hLRVlTQ0FOPSIkJHtURVNUX1NTSF9TU0hLRVlTQ0FOfSIgXAorCQlURVNUX1NTSF9TRlRQPSIkJHtURVNUX1NTSF9TRlRQfSIgXAorCQlURVNUX1NTSF9TRlRQU0VSVkVSPSIkJHtURVNUX1NTSF9TRlRQU0VSVkVSfSIgXAorCQlURVNUX1NTSF9QTElOSz0iJCR7VEVTVF9TU0hfUExJTkt9IiBcCisJCVRFU1RfU1NIX1BVVFRZR0VOPSIkJHtURVNUX1NTSF9QVVRUWUdFTn0iIFwKKwkJVEVTVF9TU0hfQ09OQ0g9IiQke1RFU1RfU1NIX0NPTkNIfSIgXAorCQlURVNUX1NTSF9JUFY2PSIkJHtURVNUX1NTSF9JUFY2fSIgXAorCQlURVNUX1NTSF9FQ0M9IiQke1RFU1RfU1NIX0VDQ30iIFwKKwkJVEVTVF9TU0hfU0hBMjU2PSIkJHtURVNUX1NTSF9TSEEyNTZ9IiBcCisJCUVYRUVYVD0iJChFWEVFWFQpIiBcCisJCSRAICYmIGVjaG8gYWxsIHRlc3RzIHBhc3NlZAorCitjb21wYXQtdGVzdHM6ICQoTElCQ09NUEFUKQorCShjZCBvcGVuYnNkLWNvbXBhdC9yZWdyZXNzICYmICQoTUFLRSkpCisKK3JlZ3Jlc3NjbGVhbjoKKwlpZiBbIC1mIHJlZ3Jlc3MvTWFrZWZpbGUgXSAmJiBbIC1yIHJlZ3Jlc3MvTWFrZWZpbGUgXTsgdGhlbiBcCisJCShjZCByZWdyZXNzICYmICQoTUFLRSkgY2xlYW4pIFwKKwlmaQorCitzdXJ2ZXk6IHN1cnZleS5zaCBzc2gKKwlAJChTSEVMTCkgLi9zdXJ2ZXkuc2ggPiBzdXJ2ZXkKKwlAZWNobyAnVGhlIHN1cnZleSByZXN1bHRzIGhhdmUgYmVlbiBwbGFjZWQgaW4gdGhlIGZpbGUgInN1cnZleSIgaW4gdGhlJworCUBlY2hvICdjdXJyZW50IGRpcmVjdG9yeS4gIFBsZWFzZSByZXZpZXcgdGhlIGZpbGUgdGhlbiBzZW5kIHdpdGgnCisJQGVjaG8gJyJtYWtlIHNlbmQtc3VydmV5Ii4nCisKK3NlbmQtc3VydmV5OglzdXJ2ZXkKKwltYWlsIHBvcnRhYmxlLXN1cnZleUBtaW5kcm90Lm9yZyA8c3VydmV5CisKK3BhY2thZ2U6ICQoQ09ORklHRklMRVMpICQoTUFOUEFHRVMpICQoVEFSR0VUUykKKwlpZiBbICJATUFLRV9QQUNLQUdFX1NVUFBPUlRFREAiID0geWVzIF07IHRoZW4gXAorCQlzaCBidWlsZHBrZy5zaDsgXAorCWZpCisKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvT1ZFUlZJRVcgYi9vcGVuc3NoLTYuMHAxL09WRVJWSUVXCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMWNjMGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL09WRVJWSUVXCkBAIC0wLDAgKzEsMTY4IEBACitbTm90ZTogVGhpcyBmaWxlIGhhcyBub3QgYmVlbiB1cGRhdGVkIGZvciBPcGVuU1NIIHZlcnNpb25zIGFmdGVyCitPcGVuU1NILTEuMiBhbmQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgT0JTT0xFVEUuICBJdCBoYXMgYmVlbiBsZWZ0IGluCit0aGUgZGlzdHJpYnV0aW9uIGJlY2F1c2Ugc29tZSBvZiBpdHMgaW5mb3JtYXRpb24gbWF5IHN0aWxsIGJlIHVzZWZ1bAordG8gZGV2ZWxvcGVycy5dCisKK1RoaXMgZG9jdW1lbnQgaXMgaW50ZW5kZWQgZm9yIHRob3NlIHdobyB3aXNoIHRvIHJlYWQgdGhlIHNzaCBzb3VyY2UKK2NvZGUuICBUaGlzIHRyaWVzIHRvIGdpdmUgYW4gb3ZlcnZpZXcgb2YgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZS4KKworQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorVXBkYXRlZCAxNyBOb3YgMTk5NS4KK1VwZGF0ZWQgMTkgT2N0IDE5OTkgZm9yIE9wZW5TU0gtMS4yCitVcGRhdGVkIDIwIE1heSAyMDAxIG5vdGUgb2Jzb2xldGUgZm9yID4gT3BlblNTSC0xLjIKKworVGhlIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHNzaCAoY2xpZW50KSwgc3NoZCAoc2VydmVyKSwgc2NwLCBzZGlzdCwgYW5kCit0aGUgYXV4aWxpYXJ5IHByb2dyYW1zIHNzaC1rZXlnZW4sIHNzaC1hZ2VudCwgc3NoLWFkZCwgYW5kCittYWtlLXNzaC1rbm93bi1ob3N0cy4gIFRoZSBtYWluIHByb2dyYW0gZm9yIGVhY2ggb2YgdGhlc2UgaXMgaW4gYSAuYworZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUuCisKK1RoZXJlIGFyZSBzb21lIHN1YnN5c3RlbXMvYWJzdHJhY3Rpb25zIHRoYXQgYXJlIHVzZWQgYnkgYSBudW1iZXIgb2YKK3RoZXNlIHByb2dyYW1zLgorCisgIEJ1ZmZlciBtYW5pcHVsYXRpb24gcm91dGluZXMKKworICAgIC0gVGhlc2UgcHJvdmlkZSBhbiBhcmJpdHJhcnkgc2l6ZSBidWZmZXIsIHdoZXJlIGRhdGEgY2FuIGJlIGFwcGVuZGVkLgorICAgICAgRGF0YSBjYW4gYmUgY29uc3VtZWQgZnJvbSBlaXRoZXIgZW5kLiAgVGhlIGNvZGUgaXMgdXNlZCBoZWF2aWx5CisgICAgICB0aHJvdWdob3V0IHNzaC4gIFRoZSBiYXNpYyBidWZmZXIgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyBhcmUgaW4KKyAgICAgIGJ1ZmZlci5jIChoZWFkZXIgYnVmZmVyLmgpLCBhbmQgYWRkaXRpb25hbCBjb2RlIHRvIG1hbmlwdWxhdGUgc3BlY2lmaWMKKyAgICAgIGRhdGEgdHlwZXMgaXMgaW4gYnVmYXV4LmMuCisKKyAgQ29tcHJlc3Npb24gTGlicmFyeQorCisgICAgLSBTc2ggdXNlcyB0aGUgR05VIEdaSVAgY29tcHJlc3Npb24gbGlicmFyeSAoWkxJQikuCisKKyAgRW5jcnlwdGlvbi9EZWNyeXB0aW9uCisKKyAgICAtIFNzaCBjb250YWlucyBzZXZlcmFsIGVuY3J5cHRpb24gYWxnb3JpdGhtcy4gIFRoZXNlIGFyZSBhbGwKKyAgICAgIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGNpcGhlci5oIGludGVyZmFjZS4gIFRoZSBpbnRlcmZhY2UgY29kZSBpcworICAgICAgaW4gY2lwaGVyLmMsIGFuZCB0aGUgaW1wbGVtZW50YXRpb25zIGFyZSBpbiBsaWJjLgorCisgIE11bHRpcGxlIFByZWNpc2lvbiBJbnRlZ2VyIExpYnJhcnkKKworICAgIC0gVXNlcyB0aGUgU1NMZWF5IEJJR05VTSBzdWJsaWJyYXJ5LgorCisgIFJhbmRvbSBOdW1iZXJzCisKKyAgICAtIFVzZXMgYXJjNHJhbmRvbSgpIGFuZCBzdWNoLgorCisgIFJTQSBrZXkgZ2VuZXJhdGlvbiwgZW5jcnlwdGlvbiwgZGVjcnlwdGlvbgorCisgICAgLSBTc2ggdXNlcyB0aGUgUlNBIHJvdXRpbmVzIGluIGxpYnNzbC4KKworICBSU0Ega2V5IGZpbGVzCisKKyAgICAtIFJTQSBrZXlzIGFyZSBzdG9yZWQgaW4gZmlsZXMgd2l0aCBhIHNwZWNpYWwgZm9ybWF0LiAgVGhlIGNvZGUgdG8KKyAgICAgIHJlYWQvd3JpdGUgdGhlc2UgZmlsZXMgaXMgaW4gYXV0aGZpbGUuYy4gIFRoZSBmaWxlcyBhcmUgbm9ybWFsbHkKKyAgICAgIGVuY3J5cHRlZCB3aXRoIGEgcGFzc3BocmFzZS4gIFRoZSBmdW5jdGlvbnMgdG8gcmVhZCBwYXNzcGhyYXNlcworICAgICAgYXJlIGluIHJlYWRwYXNzLmMgKHRoZSBzYW1lIGNvZGUgaXMgdXNlZCB0byByZWFkIHBhc3N3b3JkcykuCisKKyAgQmluYXJ5IHBhY2tldCBwcm90b2NvbAorCisgICAgLSBUaGUgc3NoIGJpbmFyeSBwYWNrZXQgcHJvdG9jb2wgaXMgaW1wbGVtZW50ZWQgaW4gcGFja2V0LmMuICBUaGUKKyAgICAgIGNvZGUgaW4gcGFja2V0LmMgZG9lcyBub3QgY29uY2VybiBpdHNlbGYgd2l0aCBwYWNrZXQgdHlwZXMgb3IgdGhlaXIKKyAgICAgIGV4ZWN1dGlvbjsgaXQgY29udGFpbnMgY29kZSB0byBidWlsZCBwYWNrZXRzLCB0byByZWNlaXZlIHRoZW0gYW5kCisgICAgICBleHRyYWN0IGRhdGEgZnJvbSB0aGVtLCBhbmQgdGhlIGNvZGUgdG8gY29tcHJlc3MgYW5kL29yIGVuY3J5cHQKKyAgICAgIHBhY2tldHMuICBDUkMgY29kZSBjb21lcyBmcm9tIGNyYzMyLmMuCisKKyAgICAtIFRoZSBjb2RlIGluIHBhY2tldC5jIGNhbGxzIHRoZSBidWZmZXIgbWFuaXB1bGF0aW9uIHJvdXRpbmVzCisgICAgICAoYnVmZmVyLmMsIGJ1ZmF1eC5jKSwgY29tcHJlc3Npb24gcm91dGluZXMgKGNvbXByZXNzLmMsIHpsaWIpLAorICAgICAgYW5kIHRoZSBlbmNyeXB0aW9uIHJvdXRpbmVzLgorCisgIFgxMSwgVENQL0lQLCBhbmQgQWdlbnQgZm9yd2FyZGluZworCisgICAgLSBDb2RlIGZvciB2YXJpb3VzIHR5cGVzIG9mIGNoYW5uZWwgZm9yd2FyZGluZyBpcyBpbiBjaGFubmVscy5jLgorICAgICAgVGhlIGZpbGUgZGVmaW5lcyBhIGdlbmVyaWMgZnJhbWV3b3JrIGZvciBhcmJpdHJhcnkgY29tbXVuaWNhdGlvbgorICAgICAgY2hhbm5lbHMgaW5zaWRlIHRoZSBzZWN1cmUgY2hhbm5lbCwgYW5kIHVzZXMgdGhpcyBmcmFtZXdvcmsgdG8KKyAgICAgIGltcGxlbWVudCBYMTEgZm9yd2FyZGluZywgVENQL0lQIGZvcndhcmRpbmcsIGFuZCBhdXRoZW50aWNhdGlvbgorICAgICAgYWdlbnQgZm9yd2FyZGluZy4KKyAgICAgIFRoZSBuZXcsIFByb3RvY29sIDEuNSwgY2hhbm5lbCBjbG9zZSBpbXBsZW1lbnRhdGlvbiBpcyBpbiBuY2hhbi5jCisKKyAgQXV0aGVudGljYXRpb24gYWdlbnQKKworICAgIC0gQ29kZSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBhdXRoZW50aWNhdGlvbiBhZ2VudCBpcyBpbiBhdXRoZmQuYy4KKworICBBdXRoZW50aWNhdGlvbiBtZXRob2RzCisKKyAgICAtIENvZGUgZm9yIHZhcmlvdXMgYXV0aGVudGljYXRpb24gbWV0aG9kcyByZXNpZGVzIGluIGF1dGgtKi5jCisgICAgICAoYXV0aC1wYXNzd2QuYywgYXV0aC1yaC1yc2EuYywgYXV0aC1yaG9zdHMuYywgYXV0aC1yc2EuYykuICBUaGlzCisgICAgICBjb2RlIGlzIGxpbmtlZCBpbnRvIHRoZSBzZXJ2ZXIuICBUaGUgcm91dGluZXMgYWxzbyBtYW5pcHVsYXRlCisgICAgICBrbm93biBob3N0cyBmaWxlcyB1c2luZyBjb2RlIGluIGhvc3RmaWxlLmMuICBDb2RlIGluIGNhbm9ob3N0LmMKKyAgICAgIGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIGNhbm9uaWNhbCBob3N0IG5hbWUgb2YgdGhlIHJlbW90ZSBob3N0LgorICAgICAgQ29kZSBpbiBtYXRjaC5jIGlzIHVzZWQgdG8gbWF0Y2ggaG9zdCBuYW1lcy4KKworICAgIC0gSW4gdGhlIGNsaWVudCBlbmQsIGF1dGhlbnRpY2F0aW9uIGNvZGUgaXMgaW4gc3NoY29ubmVjdC5jLiAgSXQKKyAgICAgIHJlYWRzIFBhc3N3b3Jkcy9wYXNzcGhyYXNlcyB1c2luZyBjb2RlIGluIHJlYWRwYXNzLmMuICBJdCByZWFkcworICAgICAgUlNBIGtleSBmaWxlcyB3aXRoIGF1dGhmaWxlLmMuICBJdCBjb21tdW5pY2F0ZXMgdGhlCisgICAgICBhdXRoZW50aWNhdGlvbiBhZ2VudCB1c2luZyBhdXRoZmQuYy4KKworICBUaGUgc3NoIGNsaWVudAorCisgICAgLSBUaGUgY2xpZW50IG1haW4gcHJvZ3JhbSBpcyBpbiBzc2guYy4gIEl0IGZpcnN0IHBhcnNlcyBhcmd1bWVudHMKKyAgICAgIGFuZCByZWFkcyBjb25maWd1cmF0aW9uIChyZWFkY29uZi5jKSwgdGhlbiBjYWxscyBzc2hfY29ubmVjdCAoaW4KKyAgICAgIHNzaGNvbm5lY3QuYykgdG8gb3BlbiBhIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciAocG9zc2libHkgdmlhIGEKKyAgICAgIHByb3h5KSwgYW5kIHBlcmZvcm1zIGF1dGhlbnRpY2F0aW9uIChzc2hfbG9naW4gaW4gc3NoY29ubmVjdC5jKS4KKyAgICAgIEl0IHRoZW4gbWFrZXMgYW55IHB0eSwgZm9yd2FyZGluZywgZXRjLiByZXF1ZXN0cy4gIEl0IG1heSBjYWxsCisgICAgICBjb2RlIGluIHR0eW1vZGVzLmMgdG8gZW5jb2RlIGN1cnJlbnQgdHR5IG1vZGVzLiAgRmluYWxseSBpdAorICAgICAgY2FsbHMgY2xpZW50X2xvb3AgaW4gY2xpZW50bG9vcC5jLiAgVGhpcyBkb2VzIHRoZSByZWFsIHdvcmsgZm9yCisgICAgICB0aGUgc2Vzc2lvbi4KKworICAgIC0gVGhlIGNsaWVudCBpcyBzdWlkIHJvb3QuICBJdCB0cmllcyB0byB0ZW1wb3JhcmlseSBnaXZlIHVwIHRoaXMKKyAgICAgIHJpZ2h0cyB3aGlsZSByZWFkaW5nIHRoZSBjb25maWd1cmF0aW9uIGRhdGEuICBUaGUgcm9vdAorICAgICAgcHJpdmlsZWdlcyBhcmUgb25seSB1c2VkIHRvIG1ha2UgdGhlIGNvbm5lY3Rpb24gKGZyb20gYQorICAgICAgcHJpdmlsZWdlZCBzb2NrZXQpLiAgQW55IGV4dHJhIHByaXZpbGVnZXMgYXJlIGRyb3BwZWQgYmVmb3JlCisgICAgICBjYWxsaW5nIHNzaF9sb2dpbi4KKworICBQc2V1ZG8tdHR5IG1hbmlwdWxhdGlvbiBhbmQgdHR5IG1vZGVzCisKKyAgICAtIENvZGUgdG8gYWxsb2NhdGUgYW5kIHVzZSBhIHBzZXVkbyB0dHkgaXMgaW4gcHR5LmMuICBDb2RlIHRvCisgICAgICBlbmNvZGUgYW5kIHNldCB0ZXJtaW5hbCBtb2RlcyBpcyBpbiB0dHltb2Rlcy5jLgorCisgIExvZ2dpbmcgaW4gKHVwZGF0aW5nIHV0bXAsIGxhc3Rsb2csIGV0Yy4pCisKKyAgICAtIFRoZSBjb2RlIHRvIGRvIHRoaW5ncyB0aGF0IGFyZSBkb25lIHdoZW4gYSB1c2VyIGxvZ3MgaW4gYXJlIGluCisgICAgICBsb2dpbi5jLiAgVGhpcyBpbmNsdWRlcyB0aGluZ3Mgc3VjaCBhcyB1cGRhdGluZyB0aGUgdXRtcCwgd3RtcCwKKyAgICAgIGFuZCBsYXN0bG9nIGZpbGVzLiAgU29tZSBvZiB0aGUgY29kZSBpcyBpbiBzc2hkLmMuCisKKyAgV3JpdGluZyB0byB0aGUgc3lzdGVtIGxvZyBhbmQgdGVybWluYWwKKworICAgIC0gVGhlIHByb2dyYW1zIHVzZSB0aGUgZnVuY3Rpb25zIGZhdGFsKCksIGxvZygpLCBkZWJ1ZygpLCBlcnJvcigpCisgICAgICBpbiBtYW55IHBsYWNlcyB0byB3cml0ZSBtZXNzYWdlcyB0byBzeXN0ZW0gbG9nIG9yIHVzZXIncworICAgICAgdGVybWluYWwuICBUaGUgaW1wbGVtZW50YXRpb24gdGhhdCBsb2dzIHRvIHN5c3RlbSBsb2cgaXMgaW4KKyAgICAgIGxvZy1zZXJ2ZXIuYzsgaXQgaXMgdXNlZCBpbiB0aGUgc2VydmVyIHByb2dyYW0uICBUaGUgb3RoZXIKKyAgICAgIHByb2dyYW1zIHVzZSBhbiBpbXBsZW1lbnRhdGlvbiB0aGF0IHNlbmRzIG91dHB1dCB0byBzdGRlcnI7IGl0CisgICAgICBpcyBpbiBsb2ctY2xpZW50LmMuICBUaGUgZGVmaW5pdGlvbnMgYXJlIGluIHNzaC5oLgorCisgIFRoZSBzc2hkIHNlcnZlciAoZGFlbW9uKQorCisgICAgLSBUaGUgc3NoZCBkYWVtb24gc3RhcnRzIGJ5IHByb2Nlc3NpbmcgYXJndW1lbnRzIGFuZCByZWFkaW5nIHRoZQorICAgICAgY29uZmlndXJhdGlvbiBmaWxlIChzZXJ2Y29uZi5jKS4gIEl0IHRoZW4gcmVhZHMgdGhlIGhvc3Qga2V5LAorICAgICAgc3RhcnRzIGxpc3RlbmluZyBmb3IgY29ubmVjdGlvbnMsIGFuZCBnZW5lcmF0ZXMgdGhlIHNlcnZlciBrZXkuCisgICAgICBUaGUgc2VydmVyIGtleSB3aWxsIGJlIHJlZ2VuZXJhdGVkIGV2ZXJ5IGhvdXIgYnkgYW4gYWxhcm0uCisKKyAgICAtIFdoZW4gdGhlIHNlcnZlciByZWNlaXZlcyBhIGNvbm5lY3Rpb24sIGl0IGZvcmtzLCBkaXNhYmxlcyB0aGUKKyAgICAgIHJlZ2VuZXJhdGlvbiBhbGFybSwgYW5kIHN0YXJ0cyBjb21tdW5pY2F0aW5nIHdpdGggdGhlIGNsaWVudC4KKyAgICAgIFRoZXkgZmlyc3QgcGVyZm9ybSBpZGVudGlmaWNhdGlvbiBzdHJpbmcgZXhjaGFuZ2UsIHRoZW4KKyAgICAgIG5lZ290aWF0ZSBlbmNyeXB0aW9uLCB0aGVuIHBlcmZvcm0gYXV0aGVudGljYXRpb24sIHByZXBhcmF0b3J5CisgICAgICBvcGVyYXRpb25zLCBhbmQgZmluYWxseSB0aGUgc2VydmVyIGVudGVycyB0aGUgbm9ybWFsIHNlc3Npb24KKyAgICAgIG1vZGUgYnkgY2FsbGluZyBzZXJ2ZXJfbG9vcCBpbiBzZXJ2ZXJsb29wLmMuICBUaGlzIGRvZXMgdGhlIHJlYWwKKyAgICAgIHdvcmssIGNhbGxpbmcgZnVuY3Rpb25zIGluIG90aGVyIG1vZHVsZXMuCisKKyAgICAtIFRoZSBjb2RlIGZvciB0aGUgc2VydmVyIGlzIGluIHNzaGQuYy4gIEl0IGNvbnRhaW5zIGEgbG90IG9mCisgICAgICBzdHVmZiwgaW5jbHVkaW5nOgorCS0gc2VydmVyIG1haW4gcHJvZ3JhbQorCS0gd2FpdGluZyBmb3IgY29ubmVjdGlvbnMKKwktIHByb2Nlc3NpbmcgbmV3IGNvbm5lY3Rpb24KKwktIGF1dGhlbnRpY2F0aW9uCisJLSBwcmVwYXJhdG9yeSBvcGVyYXRpb25zCisJLSBidWlsZGluZyB1cCB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50IGZvciB0aGUgdXNlciBwcm9ncmFtCisJLSBzdGFydGluZyB0aGUgdXNlciBwcm9ncmFtLgorCisgIEF1eGlsaWFyeSBmaWxlcworCisgICAgLSBUaGVyZSBhcmUgc2V2ZXJhbCBvdGhlciBmaWxlcyBpbiB0aGUgZGlzdHJpYnV0aW9uIHRoYXQgY29udGFpbgorICAgICAgdmFyaW91cyBhdXhpbGlhcnkgcm91dGluZXM6CisJc3NoLmgJICAgICB0aGUgbWFpbiBoZWFkZXIgZmlsZSBmb3Igc3NoICh2YXJpb3VzIGRlZmluaXRpb25zKQorCXVpZHN3YXAuYyAgICB1aWQtc3dhcHBpbmcKKwl4bWFsbG9jLmMgICAgInNhZmUiIG1hbGxvYyByb3V0aW5lcworCiskT3BlbkJTRDogT1ZFUlZJRVcsdiAxLjExIDIwMDYvMDgvMDMgMDM6MzQ6NDEgZGVyYWFkdCBFeHAgJApkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9QUk9UT0NPTCBiL29wZW5zc2gtNi4wcDEvUFJPVE9DT0wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI4MTk2MAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvUFJPVE9DT0wKQEAgLTAsMCArMSwyOTQgQEAKK1RoaXMgZG9jdW1lbnRzIE9wZW5TU0gncyBkZXZpYXRpb25zIGFuZCBleHRlbnNpb25zIHRvIHRoZSBwdWJsaXNoZWQgU1NICitwcm90b2NvbC4KKworTm90ZSB0aGF0IE9wZW5TU0gncyBzZnRwIGFuZCBzZnRwLXNlcnZlciBpbXBsZW1lbnQgcmV2aXNpb24gMyBvZiB0aGUgU1NICitmaWxleGZlciBwcm90b2NvbCBkZXNjcmliZWQgaW46CisKK2h0dHA6Ly93d3cub3BlbnNzaC5jb20vdHh0L2RyYWZ0LWlldGYtc2Vjc2gtZmlsZXhmZXItMDIudHh0CisKK05ld2VyIHZlcnNpb25zIG9mIHRoZSBkcmFmdCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQsIHRob3VnaCBzb21lIGZlYXR1cmVzCithcmUgaW5kaXZpZHVhbGx5IGltcGxlbWVudGVkIGFzIGV4dGVuc2lvbnMgZGVzY3JpYmVkIGJlbG93LgorCitUaGUgcHJvdG9jb2wgdXNlZCBieSBPcGVuU1NIJ3Mgc3NoLWFnZW50IGlzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZQorUFJPVE9DT0wuYWdlbnQKKworMS4gVHJhbnNwb3J0IHByb3RvY29sIGNoYW5nZXMKKworMS4xLiB0cmFuc3BvcnQ6IFByb3RvY29sIDIgTUFDIGFsZ29yaXRobSAidW1hYy02NEBvcGVuc3NoLmNvbSIKKworVGhpcyBpcyBhIG5ldyB0cmFuc3BvcnQtbGF5ZXIgTUFDIG1ldGhvZCB1c2luZyB0aGUgVU1BQyBhbGdvcml0aG0KKyhyZmM0NDE4KS4gVGhpcyBtZXRob2QgaXMgaWRlbnRpY2FsIHRvIHRoZSAidW1hYy02NCIgbWV0aG9kIGRvY3VtZW50ZWQKK2luOgorCitodHRwOi8vd3d3Lm9wZW5zc2guY29tL3R4dC9kcmFmdC1taWxsZXItc2Vjc2gtdW1hYy0wMS50eHQKKworMS4yLiB0cmFuc3BvcnQ6IFByb3RvY29sIDIgY29tcHJlc3Npb24gYWxnb3JpdGhtICJ6bGliQG9wZW5zc2guY29tIgorCitUaGlzIHRyYW5zcG9ydC1sYXllciBjb21wcmVzc2lvbiBtZXRob2QgdXNlcyB0aGUgemxpYiBjb21wcmVzc2lvbgorYWxnb3JpdGhtIChpZGVudGljYWwgdG8gdGhlICJ6bGliIiBtZXRob2QgaW4gcmZjNDI1MyksIGJ1dCBkZWxheXMgdGhlCitzdGFydCBvZiBjb21wcmVzc2lvbiB1bnRpbCBhZnRlciBhdXRoZW50aWNhdGlvbiBoYXMgY29tcGxldGVkLiBUaGlzCithdm9pZHMgZXhwb3NpbmcgY29tcHJlc3Npb24gY29kZSB0byBhdHRhY2tzIGZyb20gdW5hdXRoZW50aWNhdGVkIHVzZXJzLgorCitUaGUgbWV0aG9kIGlzIGRvY3VtZW50ZWQgaW46CisKK2h0dHA6Ly93d3cub3BlbnNzaC5jb20vdHh0L2RyYWZ0LW1pbGxlci1zZWNzaC1jb21wcmVzc2lvbi1kZWxheWVkLTAwLnR4dAorCisxLjMuIHRyYW5zcG9ydDogTmV3IHB1YmxpYyBrZXkgYWxnb3JpdGhtcyAic3NoLXJzYS1jZXJ0LXYwMEBvcGVuc3NoLmNvbSIsCisgICAgICJzc2gtZHNhLWNlcnQtdjAwQG9wZW5zc2guY29tIiwKKyAgICAgImVjZHNhLXNoYTItbmlzdHAyNTYtY2VydC12MDFAb3BlbnNzaC5jb20iLAorICAgICAiZWNkc2Etc2hhMi1uaXN0cDM4NC1jZXJ0LXYwMUBvcGVuc3NoLmNvbSIgYW5kCisgICAgICJlY2RzYS1zaGEyLW5pc3RwNTIxLWNlcnQtdjAxQG9wZW5zc2guY29tIgorCitPcGVuU1NIIGludHJvZHVjZXMgbmV3IHB1YmxpYyBrZXkgYWxnb3JpdGhtcyB0byBzdXBwb3J0IGNlcnRpZmljYXRlCithdXRoZW50aWNhdGlvbiBmb3IgdXNlcnMgYW5kIGhvc3RrZXlzLiBUaGVzZSBtZXRob2RzIGFyZSBkb2N1bWVudGVkIGluCit0aGUgZmlsZSBQUk9UT0NPTC5jZXJ0a2V5cworCisxLjQuIHRyYW5zcG9ydDogRWxsaXB0aWMgQ3VydmUgY3J5cHRvZ3JhcGh5CisKK09wZW5TU0ggc3VwcG9ydHMgRUNDIGtleSBleGNoYW5nZSBhbmQgcHVibGljIGtleSBhdXRoZW50aWNhdGlvbiBhcworc3BlY2lmaWVkIGluIFJGQzU2NTYuIE9ubHkgdGhlIGVjZHNhLXNoYTItbmlzdHAyNTYsIGVjZHNhLXNoYTItbmlzdHAzODQKK2FuZCBlY2RzYS1zaGEyLW5pc3RwNTIxIGN1cnZlcyBvdmVyIEdGKHApIGFyZSBzdXBwb3J0ZWQuIEVsbGlwdGljCitjdXJ2ZSBwb2ludHMgZW5jb2RlZCB1c2luZyBwb2ludCBjb21wcmVzc2lvbiBhcmUgTk9UIGFjY2VwdGVkIG9yCitnZW5lcmF0ZWQuCisKKzIuIENvbm5lY3Rpb24gcHJvdG9jb2wgY2hhbmdlcworCisyLjEuIGNvbm5lY3Rpb246IENoYW5uZWwgd3JpdGUgY2xvc2UgZXh0ZW5zaW9uICJlb3dAb3BlbnNzaC5jb20iCisKK1RoZSBTU0ggY29ubmVjdGlvbiBwcm90b2NvbCAocmZjNDI1NCkgcHJvdmlkZXMgdGhlIFNTSF9NU0dfQ0hBTk5FTF9FT0YKK21lc3NhZ2UgdG8gYWxsb3cgYW4gZW5kcG9pbnQgdG8gc2lnbmFsIGl0cyBwZWVyIHRoYXQgaXQgd2lsbCBzZW5kIG5vCittb3JlIGRhdGEgb3ZlciBhIGNoYW5uZWwuIFVuZm9ydHVuYXRlbHksIHRoZXJlIGlzIG5vIHN5bW1ldHJpYyB3YXkgZm9yCithbiBlbmRwb2ludCB0byByZXF1ZXN0IHRoYXQgaXRzIHBlZXIgc2hvdWxkIGNlYXNlIHNlbmRpbmcgZGF0YSB0byBpdAord2hpbGUgc3RpbGwga2VlcGluZyB0aGUgY2hhbm5lbCBvcGVuIGZvciB0aGUgZW5kcG9pbnQgdG8gc2VuZCBkYXRhIHRvCit0aGUgcGVlci4KKworVGhpcyBpcyBkZXNpcmFibGUsIHNpbmNlIGl0IHNhdmVzIHRoZSB0cmFuc21pc3Npb24gb2YgZGF0YSB0aGF0IHdvdWxkCitvdGhlcndpc2UgbmVlZCB0byBiZSBkaXNjYXJkZWQgYW5kIGl0IGFsbG93cyBhbiBlbmRwb2ludCB0byBzaWduYWwgbG9jYWwKK3Byb2Nlc3NlcyBvZiB0aGUgY29uZGl0aW9uLCBlLmcuIGJ5IGNsb3NpbmcgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZQorZGVzY3JpcHRvci4KKworT3BlblNTSCBpbXBsZW1lbnRzIGEgY2hhbm5lbCBleHRlbnNpb24gbWVzc2FnZSB0byBwZXJmb3JtIHRoaXMKK3NpZ25hbGxpbmc6ICJlb3dAb3BlbnNzaC5jb20iIChFbmQgT2YgV3JpdGUpLiBUaGlzIG1lc3NhZ2UgaXMgc2VudCBieQorYW4gZW5kcG9pbnQgd2hlbiB0aGUgbG9jYWwgb3V0cHV0IG9mIGEgc2Vzc2lvbiBjaGFubmVsIGlzIGNsb3NlZCBvcgorZXhwZXJpZW5jZXMgYSB3cml0ZSBlcnJvci4gVGhlIG1lc3NhZ2UgaXMgZm9ybWF0dGVkIGFzIGZvbGxvd3M6CisKKwlieXRlCQlTU0hfTVNHX0NIQU5ORUxfUkVRVUVTVAorCXVpbnQzMgkJcmVjaXBpZW50IGNoYW5uZWwKKwlzdHJpbmcJCSJlb3dAb3BlbnNzaC5jb20iCisJYm9vbGVhbgkJRkFMU0UKKworT24gcmVjZWl2aW5nIHRoaXMgbWVzc2FnZSwgdGhlIHBlZXIgU0hPVUxEIGNlYXNlIHNlbmRpbmcgZGF0YSBvZgordGhlIGNoYW5uZWwgYW5kIE1BWSBzaWduYWwgdGhlIHByb2Nlc3MgZnJvbSB3aGljaCB0aGUgY2hhbm5lbCBkYXRhCitvcmlnaW5hdGVzIChlLmcuIGJ5IGNsb3NpbmcgaXRzIHJlYWQgZmlsZSBkZXNjcmlwdG9yKS4KKworQXMgd2l0aCB0aGUgc3ltbWV0cmljIFNTSF9NU0dfQ0hBTk5FTF9FT0YgbWVzc2FnZSwgdGhlIGNoYW5uZWwgZG9lcworcmVtYWluIG9wZW4gYWZ0ZXIgYSAiZW93QG9wZW5zc2guY29tIiBoYXMgYmVlbiBzZW50IGFuZCBtb3JlIGRhdGEgbWF5CitzdGlsbCBiZSBzZW50IGluIHRoZSBvdGhlciBkaXJlY3Rpb24uIFRoaXMgbWVzc2FnZSBkb2VzIG5vdCBjb25zdW1lCit3aW5kb3cgc3BhY2UgYW5kIG1heSBiZSBzZW50IGV2ZW4gaWYgbm8gd2luZG93IHNwYWNlIGlzIGF2YWlsYWJsZS4KKworTkIuIGR1ZSB0byBjZXJ0YWluIGJyb2tlbiBTU0ggaW1wbGVtZW50YXRpb25zIGFib3J0aW5nIHVwb24gcmVjZWlwdAorb2YgdGhpcyBtZXNzYWdlIChpbiBjb250cmF2ZW50aW9uIG9mIFJGQzQyNTQgc2VjdGlvbiA1LjQpLCB0aGlzCittZXNzYWdlIGlzIG9ubHkgc2VudCB0byBPcGVuU1NIIHBlZXJzIChpZGVudGlmaWVkIGJ5IGJhbm5lcikuCitPdGhlciBTU0ggaW1wbGVtZW50YXRpb25zIG1heSBiZSB3aGl0ZWxpc3RlZCB0byByZWNlaXZlIHRoaXMgbWVzc2FnZQordXBvbiByZXF1ZXN0LgorCisyLjIuIGNvbm5lY3Rpb246IGRpc2FsbG93IGFkZGl0aW9uYWwgc2Vzc2lvbnMgZXh0ZW5zaW9uCisgICAgICJuby1tb3JlLXNlc3Npb25zQG9wZW5zc2guY29tIgorCitNb3N0IFNTSCBjb25uZWN0aW9ucyB3aWxsIG9ubHkgZXZlciByZXF1ZXN0IGEgc2luZ2xlIHNlc3Npb24sIGJ1dCBhCithdHRhY2tlciBtYXkgYWJ1c2UgYSBydW5uaW5nIHNzaCBjbGllbnQgdG8gc3VycmVwdGl0aW91c2x5IG9wZW4KK2FkZGl0aW9uYWwgc2Vzc2lvbnMgdW5kZXIgdGhlaXIgY29udHJvbC4gT3BlblNTSCBwcm92aWRlcyBhIGdsb2JhbAorcmVxdWVzdCAibm8tbW9yZS1zZXNzaW9uc0BvcGVuc3NoLmNvbSIgdG8gbWl0aWdhdGUgdGhpcyBhdHRhY2suCisKK1doZW4gYW4gT3BlblNTSCBjbGllbnQgZXhwZWN0cyB0aGF0IGl0IHdpbGwgbmV2ZXIgb3BlbiBhbm90aGVyIHNlc3Npb24KKyhpLmUuIGl0IGhhcyBiZWVuIHN0YXJ0ZWQgd2l0aCBjb25uZWN0aW9uIG11bHRpcGxleGluZyBkaXNhYmxlZCksIGl0Cit3aWxsIHNlbmQgdGhlIGZvbGxvd2luZyBnbG9iYWwgcmVxdWVzdDoKKworCWJ5dGUJCVNTSF9NU0dfR0xPQkFMX1JFUVVFU1QKKwlzdHJpbmcJCSJuby1tb3JlLXNlc3Npb25zQG9wZW5zc2guY29tIgorCWNoYXIJCXdhbnQtcmVwbHkKKworT24gcmVjZWlwdCBvZiBzdWNoIGEgbWVzc2FnZSwgYW4gT3BlblNTSCBzZXJ2ZXIgd2lsbCByZWZ1c2UgdG8gb3BlbgorZnV0dXJlIGNoYW5uZWxzIG9mIHR5cGUgInNlc3Npb24iIGFuZCBpbnN0ZWFkIGltbWVkaWF0ZWx5IGFib3J0IHRoZQorY29ubmVjdGlvbi4KKworTm90ZSB0aGF0IHRoaXMgaXMgbm90IGEgZ2VuZXJhbCBkZWZlbmNlIGFnYWluc3QgY29tcHJvbWlzZWQgY2xpZW50cworKHRoYXQgaXMgaW1wb3NzaWJsZSksIGJ1dCBpdCB0aHdhcnRzIGEgc2ltcGxlIGF0dGFjay4KKworTkIuIGR1ZSB0byBjZXJ0YWluIGJyb2tlbiBTU0ggaW1wbGVtZW50YXRpb25zIGFib3J0aW5nIHVwb24gcmVjZWlwdAorb2YgdGhpcyBtZXNzYWdlLCB0aGUgbm8tbW9yZS1zZXNzaW9ucyByZXF1ZXN0IGlzIG9ubHkgc2VudCB0byBPcGVuU1NICitzZXJ2ZXJzIChpZGVudGlmaWVkIGJ5IGJhbm5lcikuIE90aGVyIFNTSCBpbXBsZW1lbnRhdGlvbnMgbWF5IGJlCit3aGl0ZWxpc3RlZCB0byByZWNlaXZlIHRoaXMgbWVzc2FnZSB1cG9uIHJlcXVlc3QuCisKKzIuMy4gY29ubmVjdGlvbjogVHVubmVsIGZvcndhcmQgZXh0ZW5zaW9uICJ0dW5Ab3BlbnNzaC5jb20iCisKK09wZW5TU0ggc3VwcG9ydHMgbGF5ZXIgMiBhbmQgbGF5ZXIgMyB0dW5uZWxsaW5nIHZpYSB0aGUgInR1bkBvcGVuc3NoLmNvbSIKK2NoYW5uZWwgdHlwZS4gVGhpcyBjaGFubmVsIHR5cGUgc3VwcG9ydHMgZm9yd2FyZGluZyBvZiBuZXR3b3JrIHBhY2tldHMKK3dpdGggZGF0YWdyYW0gYm91bmRhcmllcyBpbnRhY3QgYmV0d2VlbiBlbmRwb2ludHMgZXF1aXBwZWQgd2l0aCAKK2ludGVyZmFjZXMgbGlrZSB0aGUgQlNEIHR1big0KSBkZXZpY2UuIFR1bm5lbCBmb3J3YXJkaW5nIGNoYW5uZWxzIGFyZQorcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQgd2l0aCB0aGUgZm9sbG93aW5nIHBhY2tldDoKKworCWJ5dGUJCVNTSF9NU0dfQ0hBTk5FTF9PUEVOCisJc3RyaW5nCQkidHVuQG9wZW5zc2guY29tIgorCXVpbnQzMgkJc2VuZGVyIGNoYW5uZWwKKwl1aW50MzIJCWluaXRpYWwgd2luZG93IHNpemUKKwl1aW50MzIJCW1heGltdW0gcGFja2V0IHNpemUKKwl1aW50MzIJCXR1bm5lbCBtb2RlCisJdWludDMyCQlyZW1vdGUgdW5pdCBudW1iZXIKKworVGhlICJ0dW5uZWwgbW9kZSIgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGV0aGVyIHRoZSB0dW5uZWwgc2hvdWxkIGZvcndhcmQKK2xheWVyIDIgZnJhbWVzIG9yIGxheWVyIDMgcGFja2V0cy4gSXQgbWF5IHRha2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorCisJU1NIX1RVTk1PREVfUE9JTlRPUE9JTlQgIDEJCS8qIGxheWVyIDMgcGFja2V0cyAqLworCVNTSF9UVU5NT0RFX0VUSEVSTkVUICAgICAyCQkvKiBsYXllciAyIGZyYW1lcyAqLworCitUaGUgInR1bm5lbCB1bml0IG51bWJlciIgc3BlY2lmaWVzIHRoZSByZW1vdGUgaW50ZXJmYWNlIG51bWJlciwgb3IgbWF5CitiZSAweDdmZmZmZmZmIHRvIGFsbG93IHRoZSBzZXJ2ZXIgdG8gYXV0b21hdGljYWxseSBjaG9zZSBhbiBpbnRlcmZhY2UuIEEKK3NlcnZlciB0aGF0IGlzIG5vdCB3aWxsaW5nIHRvIG9wZW4gYSBjbGllbnQtc3BlY2lmaWVkIHVuaXQgc2hvdWxkIHJlZnVzZQordGhlIHJlcXVlc3Qgd2l0aCBhIFNTSF9NU0dfQ0hBTk5FTF9PUEVOX0ZBSUxVUkUgZXJyb3IuIE9uIHN1Y2Nlc3NmdWwKK29wZW4sIHRoZSBzZXJ2ZXIgc2hvdWxkIHJlcGx5IHdpdGggU1NIX01TR19DSEFOTkVMX09QRU5fU1VDQ0VTUy4KKworT25jZSBlc3RhYmxpc2hlZCB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgbWF5IGV4Y2hhbmdlIHBhY2tldCBvciBmcmFtZXMKK292ZXIgdGhlIHR1bm5lbCBjaGFubmVsIGJ5IGVuY2Fwc3VsYXRpbmcgdGhlbSBpbiBTU0ggcHJvdG9jb2wgc3RyaW5ncworYW5kIHNlbmRpbmcgdGhlbSBhcyBjaGFubmVsIGRhdGEuIFRoaXMgZW5zdXJlcyB0aGF0IHBhY2tldCBib3VuZGFyaWVzCithcmUga2VwdCBpbnRhY3QuIFNwZWNpZmljYWxseSwgcGFja2V0cyBhcmUgdHJhbnNtaXR0ZWQgdXNpbmcgbm9ybWFsCitTU0hfTVNHX0NIQU5ORUxfREFUQSBwYWNrZXRzOgorCisJYnl0ZQkJU1NIX01TR19DSEFOTkVMX0RBVEEKKwl1aW50MzIJCXJlY2lwaWVudCBjaGFubmVsCisJc3RyaW5nCQlkYXRhCisKK1RoZSBjb250ZW50cyBvZiB0aGUgImRhdGEiIGZpZWxkIGZvciBsYXllciAzIHBhY2tldHMgaXM6CisKKwl1aW50MzIJCQlwYWNrZXQgbGVuZ3RoCisJdWludDMyCQkJYWRkcmVzcyBmYW1pbHkKKwlieXRlW3BhY2tldCBsZW5ndGggLSA0XQlwYWNrZXQgZGF0YQorCitUaGUgImFkZHJlc3MgZmFtaWx5IiBmaWVsZCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIHBhY2tldCBpbiB0aGUgbWVzc2FnZS4KK0l0IG1heSBiZSBvbmUgb2Y6CisKKwlTU0hfVFVOX0FGX0lORVQJCTIJCS8qIElQdjQgKi8KKwlTU0hfVFVOX0FGX0lORVQ2CTI0CQkvKiBJUHY2ICovCisKK1RoZSAicGFja2V0IGRhdGEiIGZpZWxkIGNvbnNpc3RzIG9mIHRoZSBJUHY0L0lQdjYgZGF0YWdyYW0gaXRzZWxmCit3aXRob3V0IGFueSBsaW5rIGxheWVyIGhlYWRlci4KKworVGhlIGNvbnRlbnRzIG9mIHRoZSAiZGF0YSIgZmllbGQgZm9yIGxheWVyIDIgcGFja2V0cyBpczoKKworCXVpbnQzMgkJCXBhY2tldCBsZW5ndGgKKwlieXRlW3BhY2tldCBsZW5ndGhdCWZyYW1lCisKK1RoZSAiZnJhbWUiIGZpZWxkIGNvbnRhaW5zIGFuIElFRUUgODAyLjMgRXRoZXJuZXQgZnJhbWUsIGluY2x1ZGluZworaGVhZGVyLgorCiszLiBTRlRQIHByb3RvY29sIGNoYW5nZXMKKworMy4xLiBzZnRwOiBSZXZlcnNhbCBvZiBhcmd1bWVudHMgdG8gU1NIX0ZYUF9TWU1MSU5LCisKK1doZW4gT3BlblNTSCdzIHNmdHAtc2VydmVyIHdhcyBpbXBsZW1lbnRlZCwgdGhlIG9yZGVyIG9mIHRoZSBhcmd1bWVudHMKK3RvIHRoZSBTU0hfRlhQX1NZTUxJTksgbWV0aG9kIHdhcyBpbmFkdmVydGVudGx5IHJldmVyc2VkLiBVbmZvcnR1bmF0ZWx5LAordGhlIHJldmVyc2FsIHdhcyBub3Qgbm90aWNlZCB1bnRpbCB0aGUgc2VydmVyIHdhcyB3aWRlbHkgZGVwbG95ZWQuIFNpbmNlCitmaXhpbmcgdGhpcyB0byBmb2xsb3cgdGhlIHNwZWNpZmljYXRpb24gd291bGQgY2F1c2UgaW5jb21wYXRpYmlsaXR5LCB0aGUKK2N1cnJlbnQgb3JkZXIgd2FzIHJldGFpbmVkLiBGb3IgY29ycmVjdCBvcGVyYXRpb24sIGNsaWVudHMgc2hvdWxkIHNlbmQKK1NTSF9GWFBfU1lNTElOSyBhcyBmb2xsb3dzOgorCisJdWludDMyCQlpZAorCXN0cmluZwkJdGFyZ2V0cGF0aAorCXN0cmluZwkJbGlua3BhdGgKKworMy4yLiBzZnRwOiBTZXJ2ZXIgZXh0ZW5zaW9uIGFubm91bmNlbWVudCBpbiBTU0hfRlhQX1ZFUlNJT04KKworT3BlblNTSCdzIHNmdHAtc2VydmVyIGxpc3RzIHRoZSBleHRlbnNpb25zIGl0IHN1cHBvcnRzIHVzaW5nIHRoZQorc3RhbmRhcmQgZXh0ZW5zaW9uIGFubm91bmNlbWVudCBtZWNoYW5pc20gaW4gdGhlIFNTSF9GWFBfVkVSU0lPTiBzZXJ2ZXIKK2hlbGxvIHBhY2tldDoKKworCXVpbnQzMgkJMwkJLyogcHJvdG9jb2wgdmVyc2lvbiAqLworCXN0cmluZwkJZXh0MS1uYW1lCisJc3RyaW5nCQlleHQxLXZlcnNpb24KKwlzdHJpbmcJCWV4dDItbmFtZQorCXN0cmluZwkJZXh0Mi12ZXJzaW9uCisJLi4uCisJc3RyaW5nCQlleHROLW5hbWUKKwlzdHJpbmcJCWV4dE4tdmVyc2lvbgorCitFYWNoIGV4dGVuc2lvbiByZXBvcnRzIGl0cyBpbnRlZ2VyIHZlcnNpb24gbnVtYmVyIGFzIGFuIEFTQ0lJIGVuY29kZWQKK3N0cmluZywgZS5nLiAiMSIuIFRoZSB2ZXJzaW9uIHdpbGwgYmUgaW5jcmVtZW50ZWQgaWYgdGhlIGV4dGVuc2lvbiBpcworZXZlciBjaGFuZ2VkIGluIGFuIGluY29tcGF0aWJsZSB3YXkuIFRoZSBzZXJ2ZXIgTUFZIGFkdmVydGlzZSB0aGUgc2FtZQorZXh0ZW5zaW9uIHdpdGggbXVsdGlwbGUgdmVyc2lvbnMgKHRob3VnaCB0aGlzIGlzIHVubGlrZWx5KS4gQ2xpZW50cyBNVVNUCitjaGVjayB0aGUgdmVyc2lvbiBudW1iZXIgYmVmb3JlIGF0dGVtcHRpbmcgdG8gdXNlIHRoZSBleHRlbnNpb24uCisKKzMuMy4gc2Z0cDogRXh0ZW5zaW9uIHJlcXVlc3QgInBvc2l4LXJlbmFtZUBvcGVuc3NoLmNvbSIKKworVGhpcyBvcGVyYXRpb24gcHJvdmlkZXMgYSByZW5hbWUgb3BlcmF0aW9uIHdpdGggUE9TSVggc2VtYW50aWNzLCB3aGljaAorYXJlIGRpZmZlcmVudCB0byB0aG9zZSBwcm92aWRlZCBieSB0aGUgc3RhbmRhcmQgU1NIX0ZYUF9SRU5BTUUgaW4KK2RyYWZ0LWlldGYtc2Vjc2gtZmlsZXhmZXItMDIudHh0LiBUaGlzIHJlcXVlc3QgaXMgaW1wbGVtZW50ZWQgYXMgYQorU1NIX0ZYUF9FWFRFTkRFRCByZXF1ZXN0IHdpdGggdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisKKwl1aW50MzIJCWlkCisJc3RyaW5nCQkicG9zaXgtcmVuYW1lQG9wZW5zc2guY29tIgorCXN0cmluZwkJb2xkcGF0aAorCXN0cmluZwkJbmV3cGF0aAorCitPbiByZWNlaXZpbmcgdGhpcyByZXF1ZXN0IHRoZSBzZXJ2ZXIgd2lsbCBwZXJmb3JtIHRoZSBQT1NJWCBvcGVyYXRpb24KK3JlbmFtZShvbGRwYXRoLCBuZXdwYXRoKSBhbmQgd2lsbCByZXNwb25kIHdpdGggYSBTU0hfRlhQX1NUQVRVUyBtZXNzYWdlLgorVGhpcyBleHRlbnNpb24gaXMgYWR2ZXJ0aXNlZCBpbiB0aGUgU1NIX0ZYUF9WRVJTSU9OIGhlbGxvIHdpdGggdmVyc2lvbgorIjEiLgorCiszLjQuIHNmdHA6IEV4dGVuc2lvbiByZXF1ZXN0cyAic3RhdHZmc0BvcGVuc3NoLmNvbSIgYW5kCisgICAgICAgICAiZnN0YXR2ZnNAb3BlbnNzaC5jb20iCisKK1RoZXNlIHJlcXVlc3RzIGNvcnJlc3BvbmQgdG8gdGhlIHN0YXR2ZnMgYW5kIGZzdGF0dmZzIFBPU0lYIHN5c3RlbQoraW50ZXJmYWNlcy4gVGhlICJzdGF0dmZzQG9wZW5zc2guY29tIiByZXF1ZXN0IG9wZXJhdGVzIG9uIGFuIGV4cGxpY2l0CitwYXRobmFtZSwgYW5kIGlzIGZvcm1hdHRlZCBhcyBmb2xsb3dzOgorCisJdWludDMyCQlpZAorCXN0cmluZwkJInN0YXR2ZnNAb3BlbnNzaC5jb20iCisJc3RyaW5nCQlwYXRoCisKK1RoZSAiZnN0YXR2ZnNAb3BlbnNzaC5jb20iIG9wZXJhdGVzIG9uIGFuIG9wZW4gZmlsZSBoYW5kbGU6CisKKwl1aW50MzIJCWlkCisJc3RyaW5nCQkiZnN0YXR2ZnNAb3BlbnNzaC5jb20iCisJc3RyaW5nCQloYW5kbGUKKworVGhlc2UgcmVxdWVzdHMgcmV0dXJuIGEgU1NIX0ZYUF9TVEFUVVMgcmVwbHkgb24gZmFpbHVyZS4gT24gc3VjY2VzcyB0aGV5CityZXR1cm4gdGhlIGZvbGxvd2luZyBTU0hfRlhQX0VYVEVOREVEX1JFUExZIHJlcGx5OgorCisJdWludDMyCQlpZAorCXVpbnQ2NAkJZl9ic2l6ZQkJLyogZmlsZSBzeXN0ZW0gYmxvY2sgc2l6ZSAqLworCXVpbnQ2NAkJZl9mcnNpemUJLyogZnVuZGFtZW50YWwgZnMgYmxvY2sgc2l6ZSAqLworCXVpbnQ2NAkJZl9ibG9ja3MJLyogbnVtYmVyIG9mIGJsb2NrcyAodW5pdCBmX2Zyc2l6ZSkgKi8KKwl1aW50NjQJCWZfYmZyZWUJCS8qIGZyZWUgYmxvY2tzIGluIGZpbGUgc3lzdGVtICovCisJdWludDY0CQlmX2JhdmFpbAkvKiBmcmVlIGJsb2NrcyBmb3Igbm9uLXJvb3QgKi8KKwl1aW50NjQJCWZfZmlsZXMJCS8qIHRvdGFsIGZpbGUgaW5vZGVzICovCisJdWludDY0CQlmX2ZmcmVlCQkvKiBmcmVlIGZpbGUgaW5vZGVzICovCisJdWludDY0CQlmX2ZhdmFpbAkvKiBmcmVlIGZpbGUgaW5vZGVzIGZvciB0byBub24tcm9vdCAqLworCXVpbnQ2NAkJZl9mc2lkCQkvKiBmaWxlIHN5c3RlbSBpZCAqLworCXVpbnQ2NAkJZl9mbGFnCQkvKiBiaXQgbWFzayBvZiBmX2ZsYWcgdmFsdWVzICovCisJdWludDY0CQlmX25hbWVtYXgJLyogbWF4aW11bSBmaWxlbmFtZSBsZW5ndGggKi8KKworVGhlIHZhbHVlcyBvZiB0aGUgZl9mbGFnIGJpdG1hc2sgYXJlIGFzIGZvbGxvd3M6CisKKwkjZGVmaW5lIFNTSF9GWEVfU1RBVFZGU19TVF9SRE9OTFkJMHgxCS8qIHJlYWQtb25seSAqLworCSNkZWZpbmUgU1NIX0ZYRV9TVEFUVkZTX1NUX05PU1VJRAkweDIJLyogbm8gc2V0dWlkICovCisKK0JvdGggdGhlICJzdGF0dmZzQG9wZW5zc2guY29tIiBhbmQgImZzdGF0dmZzQG9wZW5zc2guY29tIiBleHRlbnNpb25zIGFyZQorYWR2ZXJ0aXNlZCBpbiB0aGUgU1NIX0ZYUF9WRVJTSU9OIGhlbGxvIHdpdGggdmVyc2lvbiAiMiIuCisKKzEwLiBzZnRwOiBFeHRlbnNpb24gcmVxdWVzdCAiaGFyZGxpbmtAb3BlbnNzaC5jb20iCisKK1RoaXMgcmVxdWVzdCBpcyBmb3IgY3JlYXRpbmcgYSBoYXJkIGxpbmsgdG8gYSByZWd1bGFyIGZpbGUuIFRoaXMKK3JlcXVlc3QgaXMgaW1wbGVtZW50ZWQgYXMgYSBTU0hfRlhQX0VYVEVOREVEIHJlcXVlc3Qgd2l0aCB0aGUKK2ZvbGxvd2luZyBmb3JtYXQ6CisKKwl1aW50MzIJCWlkCisJc3RyaW5nCQkiaGFyZGxpbmtAb3BlbnNzaC5jb20iCisJc3RyaW5nCQlvbGRwYXRoCisJc3RyaW5nCQluZXdwYXRoCisKK09uIHJlY2VpdmluZyB0aGlzIHJlcXVlc3QgdGhlIHNlcnZlciB3aWxsIHBlcmZvcm0gdGhlIG9wZXJhdGlvbgorbGluayhvbGRwYXRoLCBuZXdwYXRoKSBhbmQgd2lsbCByZXNwb25kIHdpdGggYSBTU0hfRlhQX1NUQVRVUyBtZXNzYWdlLgorVGhpcyBleHRlbnNpb24gaXMgYWR2ZXJ0aXNlZCBpbiB0aGUgU1NIX0ZYUF9WRVJTSU9OIGhlbGxvIHdpdGggdmVyc2lvbgorIjEiLgorCiskT3BlbkJTRDogUFJPVE9DT0wsdiAxLjE3IDIwMTAvMTIvMDQgMDA6MTg6MDEgZGptIEV4cCAkCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL1BST1RPQ09MLmFnZW50IGIvb3BlbnNzaC02LjBwMS9QUk9UT0NPTC5hZ2VudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTk0ZDAzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9QUk9UT0NPTC5hZ2VudApAQCAtMCwwICsxLDU2MCBAQAorVGhpcyBkZXNjcmliZXMgdGhlIHByb3RvY29sIHVzZWQgYnkgT3BlblNTSCdzIHNzaC1hZ2VudC4KKworT3BlblNTSCdzIGFnZW50IHN1cHBvcnRzIG1hbmFnaW5nIGtleXMgZm9yIHRoZSBzdGFuZGFyZCBTU0ggcHJvdG9jb2wKKzIgYXMgd2VsbCBhcyB0aGUgbGVnYWN5IFNTSCBwcm90b2NvbCAxLiBTdXBwb3J0IGZvciB0aGVzZSBrZXkgdHlwZXMKK2lzIGFsbW9zdCBjb21wbGV0ZWx5IGRpc2pvaW50IC0gaW4gYWxsIGJ1dCBhIGZldyBjYXNlcywgb3BlcmF0aW9ucyBvbgorcHJvdG9jb2wgMiBrZXlzIGNhbm5vdCBzZWUgb3IgYWZmZWN0IHByb3RvY29sIDEga2V5cyBhbmQgdmljZS12ZXJzYS4KKworUHJvdG9jb2wgMSBhbmQgcHJvdG9jb2wgMiBrZXlzIGFyZSBzZXBhcmF0ZWQgYmVjYXVzZSBvZiB0aGUgZGlmZmVyaW5nCitjcnlwdG9ncmFwaGljIHVzYWdlOiBwcm90b2NvbCAxIHByaXZhdGUgUlNBIGtleXMgYXJlIHVzZWQgdG8gZGVjcnlwdAorY2hhbGxlbmdlcyB0aGF0IHdlcmUgZW5jcnlwdGVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcHVibGljIGtleSwKK3doZXJlYXMgcHJvdG9jb2wgMiBSU0EgcHJpdmF0ZSBrZXlzIGFyZSB1c2VkIHRvIHNpZ24gY2hhbGxlbmdlcyB3aXRoCithIHByaXZhdGUga2V5IGZvciB2ZXJpZmljYXRpb24gd2l0aCB0aGUgY29ycmVzcG9uZGluZyBwdWJsaWMga2V5LiBJdAoraXMgY29uc2lkZXJlZCB1bnNvdW5kIHByYWN0aWNlIHRvIHVzZSB0aGUgc2FtZSBrZXkgZm9yIHNpZ25pbmcgYW5kCitlbmNyeXB0aW9uLgorCitXaXRoIGEgY291cGxlIG9mIGV4Y2VwdGlvbnMsIHRoZSBwcm90b2NvbCBtZXNzYWdlIG5hbWVzIHVzZWQgaW4gdGhpcworZG9jdW1lbnQgaW5kaWNhdGUgd2hpY2ggdHlwZSBvZiBrZXkgdGhlIG1lc3NhZ2UgcmVsYXRlcyB0by4gU1NIXyoKK21lc3NhZ2VzIHJlZmVyIHRvIHByb3RvY29sIDEga2V5cyBvbmx5LiBTU0gyXyogbWVzc2FnZXMgcmVmZXIgdG8KK3Byb3RvY29sIDIga2V5cy4gRnVydGhlcm1vcmUsIHRoZSBuYW1lcyBhbHNvIGluZGljYXRlIHdoZXRoZXIgdGhlCittZXNzYWdlIGlzIGEgcmVxdWVzdCB0byB0aGUgYWdlbnQgKCpfQUdFTlRDXyopIG9yIGEgcmVwbHkgZnJvbSB0aGUKK2FnZW50ICgqX0FHRU5UXyopLiBTZWN0aW9uIDMgYmVsb3cgY29udGFpbnMgdGhlIG1hcHBpbmcgb2YgdGhlCitwcm90b2NvbCBtZXNzYWdlIG5hbWVzIHRvIHRoZWlyIGludGVnZXIgdmFsdWVzLgorCisxLiBEYXRhIHR5cGVzCisKK0JlY2F1c2Ugb2Ygc3VwcG9ydCBmb3IgbGVnYWN5IFNTSCBwcm90b2NvbCAxIGtleXMsIE9wZW5TU0gncyBhZ2VudAorcHJvdG9jb2wgbWFrZXMgdXNlIG9mIHNvbWUgZGF0YSB0eXBlcyBub3QgZGVmaW5lZCBpbiBSRkMgNDI1MS4KKworMS4xIHVpbnQxNgorCitUaGUgInVpbnQxNiIgZGF0YSB0eXBlIGlzIGEgc2ltcGxlIE1TQi1maXJzdCAxNiBiaXQgdW5zaWduZWQgaW50ZWdlcgorZW5jb2RlZCBpbiB0d28gYnl0ZXMuCisKKzEuMiBtcGludDEKKworVGhlICJtcGludDEiIHR5cGUgcmVwcmVzZW50cyBhbiBhcmJpdHJhcnkgcHJlY2lzaW9uIGludGVnZXIgKGJpZ251bSkuCitJdHMgZm9ybWF0IGlzIGFzIGZvbGxvd3M6CisKKwl1aW50MTYJCQliaXRzCisJYnl0ZVsoYml0cyArIDcpIC8gOF0JYmlnbnVtCisKKyJiaWdudW0iIGNvbnRhaW5zIGFuIHVuc2lnbmVkIGFyYml0cmFyeSBwcmVjaXNpb24gaW50ZWdlciBlbmNvZGVkIGFzCitlaWdodCBiaXRzIHBlciBieXRlIGluIGJpZy1lbmRpYW4gKE1TQiBmaXJzdCkgZm9ybWF0LgorCitOb3RlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlICJtcGludDEiIGVuY29kaW5nIGFuZCB0aGUgIm1waW50IgorZW5jb2RpbmcgZGVmaW5lZCBpbiBSRkMgNDI1MS4gQWxzbyBub3RlIHRoYXQgdGhlIGxlbmd0aCBvZiB0aGUgZW5jb2RlZAoraW50ZWdlciBpcyBzcGVjaWZpZWQgaW4gYml0cywgbm90IGJ5dGVzIGFuZCB0aGF0IHRoZSBieXRlIGxlbmd0aCBvZgordGhlIGludGVnZXIgbXVzdCBiZSBjYWxjdWxhdGVkIGJ5IHJvdW5kaW5nIHVwIHRoZSBudW1iZXIgb2YgYml0cyB0byB0aGUKK25lYXJlc3QgZWlnaHQuCisKKzIuIFByb3RvY29sIE1lc3NhZ2VzCisKK0FsbCBwcm90b2NvbCBtZXNzYWdlcyBhcmUgcHJlZml4ZWQgd2l0aCB0aGVpciBsZW5ndGggaW4gYnl0ZXMsIGVuY29kZWQKK2FzIGEgMzIgYml0IHVuc2lnbmVkIGludGVnZXIuIFNwZWNpZmljYWxseToKKworCXVpbnQzMgkJCW1lc3NhZ2VfbGVuZ3RoCisJYnl0ZVttZXNzYWdlX2xlbmd0aF0JbWVzc2FnZQorCitUaGUgZm9sbG93aW5nIG1lc3NhZ2UgZGVzY3JpcHRpb25zIHJlZmVyIG9ubHkgdG8gdGhlIGNvbnRlbnQgdGhlCisibWVzc2FnZSIgZmllbGQuCisKKzIuMSBHZW5lcmljIHNlcnZlciByZXNwb25zZXMKKworVGhlIGZvbGxvd2luZyBnZW5lcmljIG1lc3NhZ2VzIG1heSBiZSBzZW50IGJ5IHRoZSBzZXJ2ZXIgaW4gcmVzcG9uc2UgdG8KK3JlcXVlc3RzIGZyb20gdGhlIGNsaWVudC4gT24gc3VjY2VzcyB0aGUgYWdlbnQgbWF5IHJlcGx5IGVpdGhlciB3aXRoOgorCisJYnl0ZQkJCVNTSF9BR0VOVF9TVUNDRVNTCisKK29yIGEgcmVxdWVzdC1zcGVjaWZpYyBzdWNjZXNzIG1lc3NhZ2UuCisKK09uIGZhaWx1cmUsIHRoZSBhZ2VudCBtYXkgcmVwbHkgd2l0aDoKKworCWJ5dGUJCQlTU0hfQUdFTlRfRkFJTFVSRQorCitTU0hfQUdFTlRfRkFJTFVSRSBtZXNzYWdlcyBhcmUgYWxzbyBzZW50IGluIHJlcGx5IHRvIHVua25vd24gcmVxdWVzdAordHlwZXMuCisKKzIuMiBBZGRpbmcga2V5cyB0byB0aGUgYWdlbnQKKworS2V5cyBhcmUgYWRkZWQgdG8gdGhlIGFnZW50IHVzaW5nIHRoZSBTU0hfQUdFTlRDX0FERF9SU0FfSURFTlRJVFkgYW5kCitTU0gyX0FHRU5UQ19BRERfSURFTlRJVFkgcmVxdWVzdHMgZm9yIHByb3RvY29sIDEgYW5kIHByb3RvY29sIDIga2V5cworcmVzcGVjdGl2ZWx5LgorCitUd28gdmFyaWFudHMgb2YgdGhlc2UgcmVxdWVzdHMgYXJlIFNTSF9BR0VOVENfQUREX1JTQV9JRF9DT05TVFJBSU5FRAorYW5kIFNTSDJfQUdFTlRDX0FERF9JRF9DT05TVFJBSU5FRCAtIHRoZXNlIGFkZCBrZXlzIHdpdGggb3B0aW9uYWwKKyJjb25zdHJhaW50cyIgb24gdGhlaXIgdXNhZ2UuCisKK09wZW5TU0ggbWF5IGJlIGJ1aWx0IHdpdGggc3VwcG9ydCBmb3Iga2V5cyBob3N0ZWQgb24gYSBzbWFydGNhcmQKK29yIG90aGVyIGhhcmR3YXJlIHNlY3VyaXR5IG1vZHVsZS4gVGhlc2Uga2V5cyBtYXkgYmUgYWRkZWQKK3RvIHRoZSBhZ2VudCB1c2luZyB0aGUgU1NIX0FHRU5UQ19BRERfU01BUlRDQVJEX0tFWSBhbmQKK1NTSF9BR0VOVENfQUREX1NNQVJUQ0FSRF9LRVlfQ09OU1RSQUlORUQgcmVxdWVzdHMuCisKKzIuMi4xIEtleSBjb25zdHJhaW50cworCitUaGUgT3BlblNTSCBhZ2VudCBzdXBwb3J0cyBzb21lIGJhc2ljIG9wdGlvbmFsIGNvbnN0cmFpbnRzIG9uIGtleSB1c2FnZS4KK0F0IHByZXNlbnQgdGhlcmUgYXJlIHR3byBjb25zdHJhaW50cyBkZWZpbmVkLgorCitUaGUgZmlyc3QgY29uc3RyYWludCBsaW1pdHMgdGhlIHZhbGlkaXR5IGR1cmF0aW9uIG9mIGEga2V5LiBJdCBpcworZW5jb2RlZCBhczoKKworCWJ5dGUJCQlTU0hfQUdFTlRfQ09OU1RSQUlOX0xJRkVUSU1FCisJdWludDMyCQkJc2Vjb25kcworCitXaGVyZSAic2Vjb25kcyIgY29udGFpbnMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRoYXQgdGhlIGtleSBzaGFsbCByZW1haW4KK3ZhbGlkIG1lYXN1cmVkIGZyb20gdGhlIG1vbWVudCB0aGF0IHRoZSBhZ2VudCByZWNlaXZlcyBpdC4gQWZ0ZXIgdGhlCit2YWxpZGl0eSBwZXJpb2QgaGFzIGV4cGlyZWQsIE9wZW5TU0gncyBhZ2VudCB3aWxsIGVyYXNlIHRoZXNlIGtleXMgZnJvbQorbWVtb3J5LgorCitUaGUgc2Vjb25kIGNvbnN0cmFpbnQgcmVxdWlyZXMgdGhlIGFnZW50IHRvIHNlZWsgZXhwbGljaXQgdXNlcgorY29uZmlybWF0aW9uIGJlZm9yZSBwZXJmb3JtaW5nIHByaXZhdGUga2V5IG9wZXJhdGlvbnMgd2l0aCB0aGUgbG9hZGVkCitrZXkuIFRoaXMgY29uc3RyYWludCBpcyBlbmNvZGVkIGFzOgorCisJYnl0ZQkJCVNTSF9BR0VOVF9DT05TVFJBSU5fQ09ORklSTQorCitaZXJvIG9yIG1vcmUgY29uc3RyYWludHMgbWF5IGJlIHNwZWNpZmllZCB3aGVuIGFkZGluZyBhIGtleSB3aXRoIG9uZQorb2YgdGhlICpfQ09OU1RSQUlORUQgcmVxdWVzdHMuIE11bHRpcGxlIGNvbnN0cmFpbnRzIGFyZSBhcHBlbmRlZAorY29uc2VjdXRpdmVseSB0byB0aGUgZW5kIG9mIHRoZSByZXF1ZXN0OgorCisJYnl0ZQkJCWNvbnN0cmFpbnQxX3R5cGUKKwkuLi4uCQkJY29uc3RyYWludDFfZGF0YQorCWJ5dGUJCQljb25zdHJhaW50Ml90eXBlCisJLi4uLgkJCWNvbnN0cmFpbnQyX2RhdGEKKwkuLi4uCisJYnl0ZQkJCWNvbnN0cmFpbnROX3R5cGUKKwkuLi4uCQkJY29uc3RyYWludE5fZGF0YQorCitTdWNoIGEgc2VxdWVuY2Ugb2YgemVybyBvciBtb3JlIGNvbnN0cmFpbnRzIHdpbGwgYmUgcmVmZXJyZWQgdG8gYmVsb3cKK2FzICJjb25zdHJhaW50W10iLiBBZ2VudHMgbWF5IGRldGVybWluZSB3aGV0aGVyIHRoZXJlIGFyZSBjb25zdHJhaW50cworYnkgY2hlY2tpbmcgd2hldGhlciBhZGRpdGlvbmFsIGRhdGEgZXhpc3RzIGluIHRoZSAiYWRkIGtleSIgcmVxdWVzdAorYWZ0ZXIgdGhlIGtleSBkYXRhIGl0c2VsZi4gT3BlblNTSCB3aWxsIHJlZnVzZSB0byBhZGQgYSBrZXkgaWYgaXQKK2NvbnRhaW5zIHVua25vd24gY29uc3RyYWludHMuCisKKzIuMi4yIEFkZCBwcm90b2NvbCAxIGtleQorCitBIGNsaWVudCBtYXkgYWRkIGEgcHJvdG9jb2wgMSBrZXkgdG8gYW4gYWdlbnQgd2l0aCB0aGUgZm9sbG93aW5nCityZXF1ZXN0OgorCisJYnl0ZQkJCVNTSF9BR0VOVENfQUREX1JTQV9JREVOVElUWSBvcgorCQkJCVNTSF9BR0VOVENfQUREX1JTQV9JRF9DT05TVFJBSU5FRAorCXVpbnQzMgkJCWlnbm9yZWQKKwltcGludDEJCQlyc2FfbgorCW1waW50MQkJCXJzYV9lCisJbXBpbnQxCQkJcnNhX2QKKwltcGludDEJCQlyc2FfaXFtcAorCW1waW50MQkJCXJzYV9xCisJbXBpbnQxCQkJcnNhX3AKKwlzdHJpbmcJCQlrZXlfY29tbWVudAorCWNvbnN0cmFpbnRbXQkJa2V5X2NvbnN0cmFpbnRzCisKK05vdGUgdGhhdCB0aGVyZSBpcyBzb21lIHJlZHVuZGFuY3kgaW4gdGhlIGtleSBwYXJhbWV0ZXJzOyBhIGtleSBjb3VsZCBiZQorZnVsbHkgc3BlY2lmaWVkIHVzaW5nIGp1c3QgcnNhX3EsIHJzYV9wIGFuZCByc2FfZSBhdCB0aGUgY29zdCBvZiBleHRyYQorY29tcHV0YXRpb24uCisKKyJrZXlfY29uc3RyYWludHMiIG1heSBvbmx5IGJlIHByZXNlbnQgaWYgdGhlIHJlcXVlc3QgdHlwZSBpcworU1NIX0FHRU5UQ19BRERfUlNBX0lERU5USVRZLgorCitUaGUgYWdlbnQgd2lsbCByZXBseSB3aXRoIGEgU1NIX0FHRU5UX1NVQ0NFU1MgaWYgdGhlIGtleSBoYXMgYmVlbgorc3VjY2Vzc2Z1bGx5IGFkZGVkIG9yIGEgU1NIX0FHRU5UX0ZBSUxVUkUgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisKKzIuMi4zIEFkZCBwcm90b2NvbCAyIGtleQorCitUaGUgT3BlblNTSCBhZ2VudCBzdXBwb3J0cyBEU0EsIEVDRFNBIGFuZCBSU0Ega2V5cyBmb3IgcHJvdG9jb2wgMi4gRFNBCitrZXlzIG1heSBiZSBhZGRlZCB1c2luZyB0aGUgZm9sbG93aW5nIHJlcXVlc3QKKworCWJ5dGUJCQlTU0gyX0FHRU5UQ19BRERfSURFTlRJVFkgb3IKKwkJCQlTU0gyX0FHRU5UQ19BRERfSURfQ09OU1RSQUlORUQKKwlzdHJpbmcJCQkic3NoLWRzcyIKKwltcGludAkJCWRzYV9wCisJbXBpbnQJCQlkc2FfcQorCW1waW50CQkJZHNhX2cKKwltcGludAkJCWRzYV9wdWJsaWNfa2V5CisJbXBpbnQJCQlkc2FfcHJpdmF0ZV9rZXkKKwlzdHJpbmcJCQlrZXlfY29tbWVudAorCWNvbnN0cmFpbnRbXQkJa2V5X2NvbnN0cmFpbnRzCisKK0RTQSBjZXJ0aWZpY2F0ZXMgbWF5IGJlIGFkZGVkIHdpdGg6CisJYnl0ZQkJCVNTSDJfQUdFTlRDX0FERF9JREVOVElUWSBvcgorCQkJCVNTSDJfQUdFTlRDX0FERF9JRF9DT05TVFJBSU5FRAorCXN0cmluZwkJCSJzc2gtZHNzLWNlcnQtdjAwQG9wZW5zc2guY29tIgorCXN0cmluZwkJCWNlcnRpZmljYXRlCisJbXBpbnQJCQlkc2FfcHJpdmF0ZV9rZXkKKwlzdHJpbmcJCQlrZXlfY29tbWVudAorCWNvbnN0cmFpbnRbXQkJa2V5X2NvbnN0cmFpbnRzCisKK0VDRFNBIGtleXMgbWF5IGJlIGFkZGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgcmVxdWVzdAorCisJYnl0ZQkJCVNTSDJfQUdFTlRDX0FERF9JREVOVElUWSBvcgorCQkJCVNTSDJfQUdFTlRDX0FERF9JRF9DT05TVFJBSU5FRAorCXN0cmluZwkJCSJlY2RzYS1zaGEyLW5pc3RwMjU2IiB8CisJCQkJImVjZHNhLXNoYTItbmlzdHAzODQiIHwKKwkJCQkiZWNkc2Etc2hhMi1uaXN0cDUyMSIKKwlzdHJpbmcJCQllY2RzYV9jdXJ2ZV9uYW1lCisJc3RyaW5nCQkJZWNkc2FfcHVibGljX2tleQorCW1waW50CQkJZWNkc2FfcHJpdmF0ZQorCXN0cmluZwkJCWtleV9jb21tZW50CisJY29uc3RyYWludFtdCQlrZXlfY29uc3RyYWludHMKKworRUNEU0EgY2VydGlmaWNhdGVzIG1heSBiZSBhZGRlZCB3aXRoOgorCWJ5dGUJCQlTU0gyX0FHRU5UQ19BRERfSURFTlRJVFkgb3IKKwkJCQlTU0gyX0FHRU5UQ19BRERfSURfQ09OU1RSQUlORUQKKwlzdHJpbmcJCQkiZWNkc2Etc2hhMi1uaXN0cDI1Ni1jZXJ0LXYwMUBvcGVuc3NoLmNvbSIgfAorCQkJCSJlY2RzYS1zaGEyLW5pc3RwMzg0LWNlcnQtdjAxQG9wZW5zc2guY29tIiB8CisJCQkJImVjZHNhLXNoYTItbmlzdHA1MjEtY2VydC12MDFAb3BlbnNzaC5jb20iCisJc3RyaW5nCQkJY2VydGlmaWNhdGUKKwltcGludAkJCWVjZHNhX3ByaXZhdGVfa2V5CisJc3RyaW5nCQkJa2V5X2NvbW1lbnQKKwljb25zdHJhaW50W10JCWtleV9jb25zdHJhaW50cworCitSU0Ega2V5cyBtYXkgYmUgYWRkZWQgd2l0aCB0aGlzIHJlcXVlc3Q6CisKKwlieXRlCQkJU1NIMl9BR0VOVENfQUREX0lERU5USVRZIG9yCisJCQkJU1NIMl9BR0VOVENfQUREX0lEX0NPTlNUUkFJTkVECisJc3RyaW5nCQkJInNzaC1yc2EiCisJbXBpbnQJCQlyc2FfbgorCW1waW50CQkJcnNhX2UKKwltcGludAkJCXJzYV9kCisJbXBpbnQJCQlyc2FfaXFtcAorCW1waW50CQkJcnNhX3AKKwltcGludAkJCXJzYV9xCisJc3RyaW5nCQkJa2V5X2NvbW1lbnQKKwljb25zdHJhaW50W10JCWtleV9jb25zdHJhaW50cworCitSU0EgY2VydGlmaWNhdGVzIG1heSBiZSBhZGRlZCB3aXRoIHRoaXMgcmVxdWVzdDoKKworCWJ5dGUJCQlTU0gyX0FHRU5UQ19BRERfSURFTlRJVFkgb3IKKwkJCQlTU0gyX0FHRU5UQ19BRERfSURfQ09OU1RSQUlORUQKKwlzdHJpbmcJCQkic3NoLXJzYS1jZXJ0LXYwMEBvcGVuc3NoLmNvbSIKKwlzdHJpbmcJCQljZXJ0aWZpY2F0ZQorCW1waW50CQkJcnNhX2QKKwltcGludAkJCXJzYV9pcW1wCisJbXBpbnQJCQlyc2FfcAorCW1waW50CQkJcnNhX3EKKwlzdHJpbmcJCQlrZXlfY29tbWVudAorCWNvbnN0cmFpbnRbXQkJa2V5X2NvbnN0cmFpbnRzCisKK05vdGUgdGhhdCB0aGUgJ3JzYV9wJyBhbmQgJ3JzYV9xJyBwYXJhbWV0ZXJzIGFyZSBzZW50IGluIHRoZSByZXZlcnNlCitvcmRlciB0byB0aGUgcHJvdG9jb2wgMSBhZGQga2V5cyBtZXNzYWdlLiBBcyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nCitwcm90b2NvbCAxICJhZGQga2V5IiByZXF1ZXN0LCB0aGUgcHJpdmF0ZSBrZXkgaXMgb3ZlcnNwZWNpZmllZCB0byBhdm9pZAorcmVkdW5kYW50IHByb2Nlc3NpbmcuCisKK0ZvciBEU0EsIEVDRFNBIGFuZCBSU0Ega2V5IGFkZCByZXF1ZXN0cywgImtleV9jb25zdHJhaW50cyIgbWF5IG9ubHkgYmUKK3ByZXNlbnQgaWYgdGhlIHJlcXVlc3QgdHlwZSBpcyBTU0gyX0FHRU5UQ19BRERfSURfQ09OU1RSQUlORUQuCisKK1RoZSBhZ2VudCB3aWxsIHJlcGx5IHdpdGggYSBTU0hfQUdFTlRfU1VDQ0VTUyBpZiB0aGUga2V5IGhhcyBiZWVuCitzdWNjZXNzZnVsbHkgYWRkZWQgb3IgYSBTU0hfQUdFTlRfRkFJTFVSRSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKworMi4yLjQgTG9hZGluZyBrZXlzIGZyb20gYSBzbWFydGNhcmQKKworVGhlIE9wZW5TU0ggYWdlbnQgbWF5IGhhdmUgb3B0aW9uYWwgc21hcnRjYXJkIHN1cHBvcnQgYnVpbHQgaW4gdG8gaXQuIElmCitzbywgaXQgc3VwcG9ydHMgYW4gb3BlcmF0aW9uIHRvIGxvYWQga2V5cyBmcm9tIGEgc21hcnRjYXJkLiBUZWNobmljYWxseSwKK29ubHkgdGhlIHB1YmxpYyBjb21wb25lbnRzIG9mIHRoZSBrZXlzIGFyZSBsb2FkZWQgaW50byB0aGUgYWdlbnQgc28KK3RoaXMgb3BlcmF0aW9uIHJlYWxseSBhcnJhbmdlcyBmb3IgZnV0dXJlIHByaXZhdGUga2V5IG9wZXJhdGlvbnMgdG8gYmUKK2RlbGVnYXRlZCB0byB0aGUgc21hcnRjYXJkLgorCisJYnl0ZQkJCVNTSF9BR0VOVENfQUREX1NNQVJUQ0FSRF9LRVkgb3IKKwkJCQlTU0hfQUdFTlRDX0FERF9TTUFSVENBUkRfS0VZX0NPTlNUUkFJTkVECisJc3RyaW5nCQkJcmVhZGVyX2lkCisJc3RyaW5nCQkJcGluCisJY29uc3RyYWludFtdCQlrZXlfY29uc3RyYWludHMKKworInJlYWRlcl9pZCIgaXMgYW4gaWRlbnRpZmllciB0byBhIHNtYXJ0Y2FyZCByZWFkZXIgYW5kICJwaW4iCitpcyBhIFBJTiBvciBwYXNzcGhyYXNlIHVzZWQgdG8gdW5sb2NrIHRoZSBwcml2YXRlIGtleShzKSBvbiB0aGUKK2RldmljZS4gImtleV9jb25zdHJhaW50cyIgbWF5IG9ubHkgYmUgcHJlc2VudCBpZiB0aGUgcmVxdWVzdCB0eXBlIGlzCitTU0hfQUdFTlRDX0FERF9TTUFSVENBUkRfS0VZX0NPTlNUUkFJTkVELgorCitUaGlzIG9wZXJhdGlvbiBtYXkgbG9hZCBhbGwgU1NIIGtleXMgdGhhdCBhcmUgdW5sb2NrZWQgdXNpbmcgdGhlCisicGluIiBvbiB0aGUgc3BlY2lmaWVkIHJlYWRlci4gVGhlIHR5cGUgb2Yga2V5IGxvYWRlZCAocHJvdG9jb2wgMQorb3IgcHJvdG9jb2wgMikgd2lsbCBiZSBzcGVjaWZpZWQgYnkgdGhlIHNtYXJ0Y2FyZCBpdHNlbGYsIGl0IGlzIG5vdAorY2xpZW50LXNwZWNpZmllZC4KKworVGhlIGFnZW50IHdpbGwgcmVwbHkgd2l0aCBhIFNTSF9BR0VOVF9TVUNDRVNTIGlmIG9uZSBvciBtb3JlIGtleXMgaGF2ZQorYmVlbiBzdWNjZXNzZnVsbHkgbG9hZGVkIG9yIGEgU1NIX0FHRU5UX0ZBSUxVUkUgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCitUaGUgYWdlbnQgd2lsbCBhbHNvIHJldHVybiBTU0hfQUdFTlRfRkFJTFVSRSBpZiBpdCBkb2VzIG5vdCBzdXBwb3J0CitzbWFydGNhcmRzLgorCisyLjMgUmVtb3ZpbmcgbXVsdGlwbGUga2V5cworCitBIGNsaWVudCBtYXkgcmVxdWVzdCB0aGF0IGFuIGFnZW50IGRlbGV0ZSBhbGwgcHJvdG9jb2wgMSBrZXlzIHVzaW5nIHRoZQorZm9sbG93aW5nIHJlcXVlc3Q6CisKKwlieXRlCQkJU1NIX0FHRU5UQ19SRU1PVkVfQUxMX1JTQV9JREVOVElUSUVTCisKK1RoaXMgbWVzc2FnZSByZXF1ZXN0cyB0aGUgZGVsZXRpb24gb2YgYWxsIHByb3RvY29sIDIga2V5czoKKworCWJ5dGUJCQlTU0gyX0FHRU5UQ19SRU1PVkVfQUxMX0lERU5USVRJRVMKKworT24gc3VjY2VzcywgdGhlIGFnZW50IHdpbGwgZGVsZXRlIGFsbCBrZXlzIG9mIHRoZSByZXF1ZXN0ZWQgdHlwZSBhbmQKK3JlcGx5IHdpdGggYSBTU0hfQUdFTlRfU1VDQ0VTUyBtZXNzYWdlLiBJZiBhbiBlcnJvciBvY2N1cnJlZCwgdGhlIGFnZW50Cit3aWxsIHJlcGx5IHdpdGggU1NIX0FHRU5UX0ZBSUxVUkUuCisKK05vdGUgdGhhdCwgdG8gZGVsZXRlIGFsbCBrZXlzIChib3RoIHByb3RvY29sIDEgYW5kIDIpLCBhIGNsaWVudAorbXVzdCBzZW5kIGJvdGggYSBTU0hfQUdFTlRDX1JFTU9WRV9BTExfUlNBX0lERU5USVRJRVMgYW5kIGEKK1NTSDJfQUdFTlRDX1JFTU9WRV9BTExfSURFTlRJVElFUyByZXF1ZXN0LgorCisyLjQgUmVtb3Zpbmcgc3BlY2lmaWMga2V5cworCisyLjQuMSBSZW1vdmluZyBhIHByb3RvY29sIDEga2V5CisKK1JlbW92YWwgb2YgYSBwcm90b2NvbCAxIGtleSBtYXkgYmUgcmVxdWVzdGVkIHdpdGggdGhlIGZvbGxvd2luZyBtZXNzYWdlOgorCisJYnl0ZSAJCQlTU0hfQUdFTlRDX1JFTU9WRV9SU0FfSURFTlRJVFkKKwl1aW50MzIJCQlrZXlfYml0cworCW1waW50MQkJCXJzYV9lCisJbXBpbnQxCQkJcnNhX24KKworTm90ZSB0aGF0IGtleV9iaXRzIGlzIHN0cmljdGx5IHJlZHVuZGFudCwgYXMgaXQgbWF5IGJlIGluZmVycmVkIGJ5IHRoZQorbGVuZ3RoIG9mIHJzYV9uLgorCitUaGUgYWdlbnQgd2lsbCBkZWxldGUgYW55IHByaXZhdGUga2V5IG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgcHVibGljIGtleQorYW5kIHJldHVybiBTU0hfQUdFTlRfU1VDQ0VTUy4gSWYgbm8gc3VjaCBrZXkgd2FzIGZvdW5kLCB0aGUgYWdlbnQgd2lsbAorcmV0dXJuIFNTSF9BR0VOVF9GQUlMVVJFLgorCisyLjQuMiBSZW1vdmluZyBhIHByb3RvY29sIDIga2V5CisKK1Byb3RvY29sIDIga2V5cyBtYXkgYmUgcmVtb3ZlZCB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWVzdDoKKworCWJ5dGUJCQlTU0gyX0FHRU5UQ19SRU1PVkVfSURFTlRJVFkKKwlzdHJpbmcJCQlrZXlfYmxvYgorCitXaGVyZSAia2V5X2Jsb2IiIGlzIGVuY29kZWQgYXMgcGVyIFJGQyA0MjUzIHNlY3Rpb24gNi42ICJQdWJsaWMgS2V5CitBbGdvcml0aG1zIiBmb3IgYW55IG9mIHRoZSBzdXBwb3J0ZWQgcHJvdG9jb2wgMiBrZXkgdHlwZXMuCisKK1RoZSBhZ2VudCB3aWxsIGRlbGV0ZSBhbnkgcHJpdmF0ZSBrZXkgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBwdWJsaWMga2V5CithbmQgcmV0dXJuIFNTSF9BR0VOVF9TVUNDRVNTLiBJZiBubyBzdWNoIGtleSB3YXMgZm91bmQsIHRoZSBhZ2VudCB3aWxsCityZXR1cm4gU1NIX0FHRU5UX0ZBSUxVUkUuCisKKzIuNC4zIFJlbW92aW5nIGtleXMgbG9hZGVkIGZyb20gYSBzbWFydGNhcmQKKworQSBjbGllbnQgbWF5IHJlcXVlc3QgdGhhdCBhIHNlcnZlciByZW1vdmUgb25lIG9yIG1vcmUgc21hcnRjYXJkLWhvc3RlZAora2V5cyB1c2luZyB0aGlzIG1lc3NhZ2U6CisKKwlieXRlCQkJU1NIX0FHRU5UQ19SRU1PVkVfU01BUlRDQVJEX0tFWQorCXN0cmluZwkJCXJlYWRlcl9pZAorCXN0cmluZwkJCXBpbgorCisicmVhZGVyX2lkIiB0aGUgYW4gaWRlbnRpZmllciB0byBhIHNtYXJ0Y2FyZCByZWFkZXIgYW5kICJwaW4iIGlzIGEgUElOCitvciBwYXNzcGhyYXNlIHVzZWQgdG8gdW5sb2NrIHRoZSBwcml2YXRlIGtleShzKSBvbiB0aGUgZGV2aWNlLgorCitXaGVuIHRoaXMgbWVzc2FnZSBpcyByZWNlaXZlZCwgYW5kIGlmIHRoZSBhZ2VudCBzdXBwb3J0cworc21hcnRjYXJkLWhvc3RlZCBrZXlzLCBpdCB3aWxsIGRlbGV0ZSBhbGwga2V5cyB0aGF0IGFyZSBob3N0ZWQgb24gdGhlCitzcGVjaWZpZWQgc21hcnRjYXJkIHRoYXQgbWF5IGJlIGFjY2Vzc2VkIHdpdGggdGhlIGdpdmVuICJwaW4iLgorCitUaGUgYWdlbnQgd2lsbCByZXBseSB3aXRoIGEgU1NIX0FHRU5UX1NVQ0NFU1MgaWYgb25lIG9yIG1vcmUga2V5cyBoYXZlCitiZWVuIHN1Y2Nlc3NmdWxseSByZW1vdmVkIG9yIGEgU1NIX0FHRU5UX0ZBSUxVUkUgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCitUaGUgYWdlbnQgd2lsbCBhbHNvIHJldHVybiBTU0hfQUdFTlRfRkFJTFVSRSBpZiBpdCBkb2VzIG5vdCBzdXBwb3J0CitzbWFydGNhcmRzLgorCisyLjUgUmVxdWVzdGluZyBhIGxpc3Qgb2Yga25vd24ga2V5cworCitBbiBhZ2VudCBtYXkgYmUgcmVxdWVzdGVkIHRvIGxpc3Qgd2hpY2gga2V5cyBpdCBob2xkcy4gRGlmZmVyZW50CityZXF1ZXN0cyBleGlzdCBmb3IgcHJvdG9jb2wgMSBhbmQgcHJvdG9jb2wgMiBrZXlzLgorCisyLjUuMSBSZXF1ZXN0aW5nIGEgbGlzdCBvZiBwcm90b2NvbCAxIGtleXMKKworVG8gcmVxdWVzdCBhIGxpc3Qgb2YgcHJvdG9jb2wgMSBrZXlzIHRoYXQgYXJlIGhlbGQgaW4gdGhlIGFnZW50LCBhCitjbGllbnQgbWF5IHNlbmQgdGhlIGZvbGxvd2luZyBtZXNzYWdlOgorCisJYnl0ZQkJCVNTSF9BR0VOVENfUkVRVUVTVF9SU0FfSURFTlRJVElFUworCitUaGUgYWdlbnQgd2lsbCByZXBseSB3aXRoIHRoZSBmb2xsb3dpbmcgbWVzc2FnZToKKworCWJ5dGUJCQlTU0hfQUdFTlRfUlNBX0lERU5USVRJRVNfQU5TV0VSCisJdWludDMyCQkJbnVtX2tleXMKKworRm9sbG93ZWQgYnkgemVybyBvciBtb3JlIGNvbnNlY3V0aXZlIGtleXMsIGVuY29kZWQgYXM6CisKKwl1aW50MzIJCQliaXRzCisJbXBpbnQxCQkJcnNhX2UKKwltcGludDEJCQlyc2FfbgorCXN0cmluZwkJCWtleV9jb21tZW50CisKKzIuNS4yIFJlcXVlc3RpbmcgYSBsaXN0IG9mIHByb3RvY29sIDIga2V5cworCitBIGNsaWVudCBtYXkgc2VuZCB0aGUgZm9sbG93aW5nIG1lc3NhZ2UgdG8gcmVxdWVzdCBhIGxpc3Qgb2YKK3Byb3RvY29sIDIga2V5cyB0aGF0IGFyZSBzdG9yZWQgaW4gdGhlIGFnZW50OgorCisJYnl0ZQkJCVNTSDJfQUdFTlRDX1JFUVVFU1RfSURFTlRJVElFUworCitUaGUgYWdlbnQgd2lsbCByZXBseSB3aXRoIHRoZSBmb2xsb3dpbmcgbWVzc2FnZSBoZWFkZXI6CisKKwlieXRlCQkJU1NIMl9BR0VOVF9JREVOVElUSUVTX0FOU1dFUgorCXVpbnQzMgkJCW51bV9rZXlzCisKK0ZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBjb25zZWN1dGl2ZSBrZXlzLCBlbmNvZGVkIGFzOgorCisJc3RyaW5nCQkJa2V5X2Jsb2IKKwlzdHJpbmcJCQlrZXlfY29tbWVudAorCitXaGVyZSAia2V5X2Jsb2IiIGlzIGVuY29kZWQgYXMgcGVyIFJGQyA0MjUzIHNlY3Rpb24gNi42ICJQdWJsaWMgS2V5CitBbGdvcml0aG1zIiBmb3IgYW55IG9mIHRoZSBzdXBwb3J0ZWQgcHJvdG9jb2wgMiBrZXkgdHlwZXMuCisKKzIuNiBQcml2YXRlIGtleSBvcGVyYXRpb25zCisKK1RoZSBwdXJwb3NlIG9mIHRoZSBhZ2VudCBpcyB0byBwZXJmb3JtIHByaXZhdGUga2V5IG9wZXJhdGlvbnMsIHN1Y2ggYXMKK3NpZ25pbmcgYW5kIGVuY3J5cHRpb24gd2l0aG91dCByZXF1aXJpbmcgYSBwYXNzcGhyYXNlIHRvIHVubG9jayB0aGUKK2tleSBhbmQgd2l0aG91dCBhbGxvd2luZyB0aGUgcHJpdmF0ZSBrZXkgaXRzZWxmIHRvIGJlIGV4cG9zZWQuIFRoZXJlCithcmUgc2VwYXJhdGUgcmVxdWVzdHMgZm9yIHRoZSBwcm90b2NvbCAxIGFuZCBwcm90b2NvbCAyIHByaXZhdGUga2V5CitvcGVyYXRpb25zLgorCisyLjYuMSBQcm90b2NvbCAxIHByaXZhdGUga2V5IGNoYWxsZW5nZQorCitUaGUgcHJpdmF0ZSBrZXkgb3BlcmF0aW9uIHVzZWQgaW4gdmVyc2lvbiAxIG9mIHRoZSBTU0ggcHJvdG9jb2wgaXMKK2RlY3J5cHRpbmcgYSBjaGFsbGVuZ2UgdGhhdCBoYXMgYmVlbiBlbmNyeXB0ZWQgd2l0aCBhIHB1YmxpYyBrZXkuCitJdCBtYXkgYmUgcmVxdWVzdGVkIHVzaW5nIHRoaXMgbWVzc2FnZToKKworCWJ5dGUJCQlTU0hfQUdFTlRDX1JTQV9DSEFMTEVOR0UKKwl1aW50MzIJCQlpZ25vcmVkCisJbXBpbnQxCQkJcnNhX2UKKwltcGludDEJCQlyc2FfbgorCW1waW50MQkJCWVuY3J5cHRlZF9jaGFsbGVuZ2UKKwlieXRlWzE2XQkJc2Vzc2lvbl9pZAorCXVpbnQzMgkJCXJlc3BvbnNlX3R5cGUgLyogbXVzdCBiZSAxICovCisKKyJyc2FfZSIgYW5kICJyc2FfbiIgYXJlIHVzZWQgdG8gaWRlbnRpZnkgd2hpY2ggcHJpdmF0ZSBrZXkgdG8gdXNlLgorImVuY3J5cHRlZF9jaGFsbGVuZ2UiIGlzIGEgY2hhbGxlbmdlIGJsb2IgdGhhdCBoYXMgKHByZXN1bWFibHkpCitiZWVuIGVuY3J5cHRlZCB3aXRoIHRoZSBwdWJsaWMga2V5IGFuZCBtdXN0IGJlIGluIHRoZSByYW5nZSAKKzEgPD0gZW5jcnlwdGVkX2NoYWxsZW5nZSA8IDJeMjU2LiAic2Vzc2lvbl9pZCIgaXMgdGhlIFNTSCBwcm90b2NvbCAxCitzZXNzaW9uIElEIChjb21wdXRlZCBmcm9tIHRoZSBzZXJ2ZXIgaG9zdCBrZXksIHRoZSBzZXJ2ZXIgc2VtaS1lcGhlbWVyYWwKK2tleSBhbmQgdGhlIHNlc3Npb24gY29va2llKS4KKworImlnbm9yZWQiIGFuZCAicmVzcG9uc2VfdHlwZSIgZXhpc3QgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kKK2ltcGxlbWVudGF0aW9ucy4gInJlc3BvbnNlX3R5cGUiIG11c3QgYmUgZXF1YWwgdG8gMTsgb3RoZXIgcmVzcG9uc2UKK3R5cGVzIGFyZSBub3Qgc3VwcG9ydGVkLgorCitPbiByZWNlaXZpbmcgdGhpcyByZXF1ZXN0LCB0aGUgc2VydmVyIGRlY3J5cHRzIHRoZSAiZW5jcnlwdGVkX2NoYWxsZW5nZSIKK3VzaW5nIHRoZSBwcml2YXRlIGtleSBtYXRjaGluZyB0aGUgc3VwcGxpZWQgKHJzYV9lLCByc2FfbikgdmFsdWVzLiBGb3IKK3RoZSByZXNwb25zZSBkZXJpdmF0aW9uLCB0aGUgZGVjcnlwdGVkIGNoYWxsZW5nZSBpcyByZXByZXNlbnRlZCBhcyBhbgordW5zaWduZWQsIGJpZy1lbmRpYW4gaW50ZWdlciBlbmNvZGVkIGluIGEgMzIgYnl0ZSBidWZmZXIgKGkuZS4gdmFsdWVzCitzbWFsbGVyIHRoYW4gMl4yNDggd2lsbCBoYXZlIGxlYWRpbmcgMCBieXRlcykuCisKK1RoZSByZXNwb25zZSB2YWx1ZSBpcyB0aGVuIGNhbGN1bGF0ZWQgYXM6CisKKwlyZXNwb25zZSA9IE1ENShkZWNyeXB0ZWRfY2hhbGxlbmdlIHx8IHNlc3Npb25faWQpCisKK2FuZCByZXR1cm5lZCBpbiB0aGUgZm9sbG93aW5nIG1lc3NhZ2UKKworCWJ5dGUJCQlTU0hfQUdFTlRfUlNBX1JFU1BPTlNFCisJYnl0ZVsxNl0JCXJlc3BvbnNlCisKK0lmIHRoZSBhZ2VudCBjYW5ub3QgZmluZCB0aGUga2V5IHNwZWNpZmllZCBieSB0aGUgc3VwcGxpZWQgKHJzYV9lLAorcnNhX24pIHRoZW4gaXQgd2lsbCByZXR1cm4gU1NIX0FHRU5UX0ZBSUxVUkUuCisKKzIuNi4yIFByb3RvY29sIDIgcHJpdmF0ZSBrZXkgc2lnbmF0dXJlIHJlcXVlc3QKKworQSBjbGllbnQgbWF5IHVzZSB0aGUgZm9sbG93aW5nIG1lc3NhZ2UgdG8gcmVxdWVzdCBzaWduaW5nIG9mIGRhdGEgdXNpbmcKK2EgcHJvdG9jb2wgMiBrZXk6CisKKwlieXRlCQkJU1NIMl9BR0VOVENfU0lHTl9SRVFVRVNUCisJc3RyaW5nCQkJa2V5X2Jsb2IKKwlzdHJpbmcJCQlkYXRhCisJdWludDMyCQkJZmxhZ3MKKworV2hlcmUgImtleV9ibG9iIiBpcyBlbmNvZGVkIGFzIHBlciBSRkMgNDI1MyBzZWN0aW9uIDYuNiAiUHVibGljIEtleQorQWxnb3JpdGhtcyIgZm9yIGFueSBvZiB0aGUgc3VwcG9ydGVkIHByb3RvY29sIDIga2V5IHR5cGVzLiAiZmxhZ3MiIGlzCithIGJpdC1tYXNrLCBidXQgYXQgcHJlc2VudCBvbmx5IG9uZSBwb3NzaWJsZSB2YWx1ZSBpcyBkZWZpbmVkIChzZWUgYmVsb3cKK2ZvciBpdHMgbWVhbmluZyk6CisKKwlTU0hfQUdFTlRfT0xEX1NJR05BVFVSRQkJMQorCitVcG9uIHJlY2VpdmluZyB0aGlzIHJlcXVlc3QsIHRoZSBhZ2VudCB3aWxsIGxvb2sgdXAgdGhlIHByaXZhdGUga2V5IHRoYXQKK2NvcnJlc3BvbmRzIHRvIHRoZSBwdWJsaWMga2V5IGNvbnRhaW5lZCBpbiBrZXlfYmxvYi4gSXQgd2lsbCB1c2UgdGhpcworcHJpdmF0ZSBrZXkgdG8gc2lnbiB0aGUgImRhdGEiIGFuZCBwcm9kdWNlIGEgc2lnbmF0dXJlIGJsb2IgdXNpbmcgdGhlCitrZXkgdHlwZS1zcGVjaWZpYyBtZXRob2QgZGVzY3JpYmVkIGluIFJGQyA0MjUzIHNlY3Rpb24gNi42ICJQdWJsaWMgS2V5CitBbGdvcml0aG1zIi4KKworQW4gZXhjZXB0aW9uIHRvIHRoaXMgaXMgZm9yICJzc2gtZHNzIiBrZXlzIHdoZXJlIHRoZSAiZmxhZ3MiIHdvcmQKK2NvbnRhaW5zIHRoZSB2YWx1ZSBTU0hfQUdFTlRfT0xEX1NJR05BVFVSRS4gSW4gdGhpcyBjYXNlLCBhIGxlZ2FjeQorc2lnbmF0dXJlIGVuY29kaW5nIGlzIHVzZWQgaW4gbGlldSBvZiB0aGUgc3RhbmRhcmQgb25lLiBJbiB0aGlzIGNhc2UsCit0aGUgRFNBIHNpZ25hdHVyZSBibG9iIGlzIGVuY29kZWQgYXM6CisKKwlieXRlWzQwXQkJc2lnbmF0dXJlCisKK1RoZSBzaWduYXR1cmUgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgbWVzc2FnZToKKworCWJ5dGUJCQlTU0gyX0FHRU5UX1NJR05fUkVTUE9OU0UKKwlzdHJpbmcJCQlzaWduYXR1cmVfYmxvYgorCitJZiB0aGUgYWdlbnQgY2Fubm90IGZpbmQgdGhlIGtleSBzcGVjaWZpZWQgYnkgdGhlIHN1cHBsaWVkIGtleV9ibG9iIHRoZW4KK2l0IHdpbGwgcmV0dXJuIFNTSF9BR0VOVF9GQUlMVVJFLgorCisyLjcgTG9ja2luZyBvciB1bmxvY2tpbmcgYW4gYWdlbnQKKworVGhlIGFnZW50IHN1cHBvcnRzIHRlbXBvcmFyeSBsb2NraW5nIHdpdGggYSBwYXNzcGhyYXNlIHRvIHN1c3BlbmQKK3Byb2Nlc3Npbmcgb2Ygc2Vuc2l0aXZlIG9wZXJhdGlvbnMgdW50aWwgaXQgaGFzIGJlZW4gdW5sb2NrZWQgd2l0aCB0aGUKK3NhbWUgcGFzc3BocmFzZS4gVG8gbG9jayBhbiBhZ2VudCwgYSBjbGllbnQgc2VuZCB0aGUgZm9sbG93aW5nIHJlcXVlc3Q6CisKKwlieXRlCQkJU1NIX0FHRU5UQ19MT0NLCisJc3RyaW5nCQkJcGFzc3BocmFzZQorCitVcG9uIHJlY2VpcHQgb2YgdGhpcyBtZXNzYWdlIGFuZCBpZiB0aGUgYWdlbnQgaXMgbm90IGFscmVhZHkgbG9ja2VkLAoraXQgd2lsbCBzdXNwZW5kIHByb2Nlc3NpbmcgcmVxdWVzdHMgYW5kIHJldHVybiBhIFNTSF9BR0VOVF9TVUNDRVNTCityZXBseS4gSWYgdGhlIGFnZW50IGlzIGFscmVhZHkgbG9ja2VkLCBpdCB3aWxsIHJldHVybiBTU0hfQUdFTlRfRkFJTFVSRS4KKworV2hpbGUgbG9ja2VkLCB0aGUgYWdlbnQgd2lsbCByZWZ1c2UgYWxsIHJlcXVlc3RzIGV4Y2VwdAorU1NIX0FHRU5UQ19VTkxPQ0ssIFNTSF9BR0VOVENfUkVRVUVTVF9SU0FfSURFTlRJVElFUyBhbmQKK1NTSDJfQUdFTlRDX1JFUVVFU1RfSURFTlRJVElFUy4gVGhlICJyZXF1ZXN0IGlkZW50aXRpZXMiIHJlcXVlc3RzIGFyZQordHJlYXRlZCBzcGVjaWFsbHkgYnkgYSBsb2NrZWQgYWdlbnQ6IGl0IHdpbGwgYWx3YXlzIHJldHVybiBhbiBlbXB0eSBsaXN0CitvZiBrZXlzLgorCitUbyB1bmxvY2sgYW4gYWdlbnQsIGEgY2xpZW50IG1heSByZXF1ZXN0OgorCisJYnl0ZQkJCVNTSF9BR0VOVENfVU5MT0NLCisJc3RyaW5nCQkJcGFzc3BocmFzZQorCitJZiB0aGUgcGFzc3BocmFzZSBtYXRjaGVzIGFuZCB0aGUgYWdlbnQgaXMgbG9ja2VkLCB0aGVuIGl0IHdpbGwgcmVzdW1lCitwcm9jZXNzaW5nIGFsbCByZXF1ZXN0cyBhbmQgcmV0dXJuIFNTSF9BR0VOVF9TVUNDRVNTLiBJZiB0aGUgYWdlbnQKK2lzIG5vdCBsb2NrZWQgb3IgdGhlIHBhc3NwaHJhc2UgZG9lcyBub3QgbWF0Y2ggdGhlbiBpdCB3aWxsIHJldHVybgorU1NIX0FHRU5UX0ZBSUxVUkUuCisKK0xvY2tpbmcgYW5kIHVubG9ja2luZyBhZmZlY3RzIGJvdGggcHJvdG9jb2wgMSBhbmQgcHJvdG9jb2wgMiBrZXlzLgorCiszLiBQcm90b2NvbCBtZXNzYWdlIG51bWJlcnMKKworMy4xIFJlcXVlc3RzIGZyb20gY2xpZW50IHRvIGFnZW50IGZvciBwcm90b2NvbCAxIGtleSBvcGVyYXRpb25zCisKKwlTU0hfQUdFTlRDX1JFUVVFU1RfUlNBX0lERU5USVRJRVMJCTEKKwlTU0hfQUdFTlRDX1JTQV9DSEFMTEVOR0UJCQkzCisJU1NIX0FHRU5UQ19BRERfUlNBX0lERU5USVRZCQkJNworCVNTSF9BR0VOVENfUkVNT1ZFX1JTQV9JREVOVElUWQkJCTgKKwlTU0hfQUdFTlRDX1JFTU9WRV9BTExfUlNBX0lERU5USVRJRVMJCTkKKwlTU0hfQUdFTlRDX0FERF9SU0FfSURfQ09OU1RSQUlORUQJCTI0CisKKzMuMiBSZXF1ZXN0cyBmcm9tIGNsaWVudCB0byBhZ2VudCBmb3IgcHJvdG9jb2wgMiBrZXkgb3BlcmF0aW9ucworCisJU1NIMl9BR0VOVENfUkVRVUVTVF9JREVOVElUSUVTCQkJMTEKKwlTU0gyX0FHRU5UQ19TSUdOX1JFUVVFU1QJCQkxMworCVNTSDJfQUdFTlRDX0FERF9JREVOVElUWQkJCTE3CisJU1NIMl9BR0VOVENfUkVNT1ZFX0lERU5USVRZCQkJMTgKKwlTU0gyX0FHRU5UQ19SRU1PVkVfQUxMX0lERU5USVRJRVMJCTE5CisJU1NIMl9BR0VOVENfQUREX0lEX0NPTlNUUkFJTkVECQkJMjUKKworMy4zIEtleS10eXBlIGluZGVwZW5kZW50IHJlcXVlc3RzIGZyb20gY2xpZW50IHRvIGFnZW50CisKKwlTU0hfQUdFTlRDX0FERF9TTUFSVENBUkRfS0VZCQkJMjAKKwlTU0hfQUdFTlRDX1JFTU9WRV9TTUFSVENBUkRfS0VZCQkJMjEKKwlTU0hfQUdFTlRDX0xPQ0sJCQkJCTIyCisJU1NIX0FHRU5UQ19VTkxPQ0sJCQkJMjMKKwlTU0hfQUdFTlRDX0FERF9TTUFSVENBUkRfS0VZX0NPTlNUUkFJTkVECTI2CisKKzMuNCBHZW5lcmljIHJlcGxpZXMgZnJvbSBhZ2VudCB0byBjbGllbnQKKworCVNTSF9BR0VOVF9GQUlMVVJFCQkJCTUKKwlTU0hfQUdFTlRfU1VDQ0VTUwkJCQk2CisKKzMuNSBSZXBsaWVzIGZyb20gYWdlbnQgdG8gY2xpZW50IGZvciBwcm90b2NvbCAxIGtleSBvcGVyYXRpb25zCisKKwlTU0hfQUdFTlRfUlNBX0lERU5USVRJRVNfQU5TV0VSCQkJMgorCVNTSF9BR0VOVF9SU0FfUkVTUE9OU0UJCQkJNAorCiszLjYgUmVwbGllcyBmcm9tIGFnZW50IHRvIGNsaWVudCBmb3IgcHJvdG9jb2wgMiBrZXkgb3BlcmF0aW9ucworCisJU1NIMl9BR0VOVF9JREVOVElUSUVTX0FOU1dFUgkJCTEyCisJU1NIMl9BR0VOVF9TSUdOX1JFU1BPTlNFCQkJMTQKKworMy43IEtleSBjb25zdHJhaW50IGlkZW50aWZpZXJzCisKKwlTU0hfQUdFTlRfQ09OU1RSQUlOX0xJRkVUSU1FCQkJMQorCVNTSF9BR0VOVF9DT05TVFJBSU5fQ09ORklSTQkJCTIKKworJE9wZW5CU0Q6IFBST1RPQ09MLmFnZW50LHYgMS42IDIwMTAvMDgvMzEgMTE6NTQ6NDUgZGptIEV4cCAkCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL1BST1RPQ09MLmNlcnRrZXlzIGIvb3BlbnNzaC02LjBwMS9QUk9UT0NPTC5jZXJ0a2V5cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjk3NjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9QUk9UT0NPTC5jZXJ0a2V5cwpAQCAtMCwwICsxLDI1NiBAQAorVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgYSBzaW1wbGUgcHVibGljLWtleSBjZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbgorc3lzdGVtIGZvciB1c2UgYnkgU1NILgorCitCYWNrZ3JvdW5kCistLS0tLS0tLS0tCisKK1RoZSBTU0ggcHJvdG9jb2wgY3VycmVudGx5IHN1cHBvcnRzIGEgc2ltcGxlIHB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24KK21lY2hhbmlzbS4gVW5saWtlIG90aGVyIHB1YmxpYyBrZXkgaW1wbGVtZW50YXRpb25zLCBTU0ggZXNjaGV3cyB0aGUgdXNlCitvZiBYLjUwOSBjZXJ0aWZpY2F0ZXMgYW5kIHVzZXMgcmF3IGtleXMuIFRoaXMgYXBwcm9hY2ggaGFzIHNvbWUgYmVuZWZpdHMKK3JlbGF0aW5nIHRvIHNpbXBsaWNpdHkgb2YgY29uZmlndXJhdGlvbiBhbmQgbWluaW1pc2F0aW9uIG9mIGF0dGFjaworc3VyZmFjZSwgYnV0IGl0IGRvZXMgbm90IHN1cHBvcnQgdGhlIGltcG9ydGFudCB1c2UtY2FzZXMgb2YgY2VudHJhbGx5CittYW5hZ2VkLCBwYXNzd29yZGxlc3MgYXV0aGVudGljYXRpb24gYW5kIGNlbnRyYWxseSBjZXJ0aWZpZWQgaG9zdCBrZXlzLgorCitUaGVzZSBwcm90b2NvbCBleHRlbnNpb25zIGJ1aWxkIG9uIHRoZSBzaW1wbGUgcHVibGljIGtleSBhdXRoZW50aWNhdGlvbgorc3lzdGVtIGFscmVhZHkgaW4gU1NIIHRvIGFsbG93IGNlcnRpZmljYXRlLWJhc2VkIGF1dGhlbnRpY2F0aW9uLiBUaGUKK2NlcnRpZmljYXRlcyB1c2VkIGFyZSBub3QgdHJhZGl0aW9uYWwgWC41MDkgY2VydGlmaWNhdGVzLCB3aXRoIG51bWVyb3VzCitvcHRpb25zIGFuZCBjb21wbGV4IGVuY29kaW5nIHJ1bGVzLCBidXQgc29tZXRoaW5nIHJhdGhlciBtb3JlIG1pbmltYWw6IGEKK2tleSwgc29tZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBhbmQgdXNhZ2Ugb3B0aW9ucyB0aGF0IGhhdmUgYmVlbiBzaWduZWQKK3dpdGggc29tZSBvdGhlciB0cnVzdGVkIGtleS4KKworQSBzc2hkIHNlcnZlciBtYXkgYmUgY29uZmlndXJlZCB0byBhbGxvdyBhdXRoZW50aWNhdGlvbiB2aWEgY2VydGlmaWVkCitrZXlzLCBieSBleHRlbmRpbmcgdGhlIGV4aXN0aW5nIH4vLnNzaC9hdXRob3JpemVkX2tleXMgbWVjaGFuaXNtIHRvCithbGxvdyBzcGVjaWZpY2F0aW9uIG9mIGNlcnRpZmljYXRpb24gYXV0aG9yaXR5IGtleXMgaW4gYWRkaXRpb24gdG8KK3JhdyB1c2VyIGtleXMuIFRoZSBzc2ggY2xpZW50IHdpbGwgc3VwcG9ydCBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uIG9mCithY2NlcHRhbmNlIG9mIGNlcnRpZmllZCBob3N0IGtleXMsIGJ5IGFkZGluZyBhIHNpbWlsYXIgYWJpbGl0eSB0bworc3BlY2lmeSBDQSBrZXlzIGluIH4vLnNzaC9rbm93bl9ob3N0cy4KKworQ2VydGlmaWVkIGtleXMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIG5ldyBrZXkgdHlwZXM6CisKKyAgICBzc2gtcnNhLWNlcnQtdjAxQG9wZW5zc2guY29tCisgICAgc3NoLWRzcy1jZXJ0LXYwMUBvcGVuc3NoLmNvbQorICAgIGVjZHNhLXNoYTItbmlzdHAyNTYtY2VydC12MDFAb3BlbnNzaC5jb20KKyAgICBlY2RzYS1zaGEyLW5pc3RwMzg0LWNlcnQtdjAxQG9wZW5zc2guY29tCisgICAgZWNkc2Etc2hhMi1uaXN0cDUyMS1jZXJ0LXYwMUBvcGVuc3NoLmNvbQorCitUaGVzZSBpbmNsdWRlIGNlcnRpZmljYXRpb24gaW5mb3JtYXRpb24gYWxvbmcgd2l0aCB0aGUgcHVibGljIGtleQordGhhdCBpcyB1c2VkIHRvIHNpZ24gY2hhbGxlbmdlcy4gc3NoLWtleWdlbiBwZXJmb3JtcyB0aGUgQ0Egc2lnbmluZworb3BlcmF0aW9uLgorCitQcm90b2NvbCBleHRlbnNpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBTU0ggd2lyZSBwcm90b2NvbCBpbmNsdWRlcyBzZXZlcmFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcy4KK1RoZXNlIG1vZGlmaWNhdGlvbnMgc2hhbGwgdGFrZSBhZHZhbnRhZ2Ugb2YgbmFtZXNwYWNlZCBwdWJsaWMga2V5CithbGdvcml0aG0gbmFtZXMgdG8gYWRkIHN1cHBvcnQgZm9yIGNlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uIHdpdGhvdXQKK2JyZWFraW5nIHRoZSBwcm90b2NvbCAtIGltcGxlbWVudGF0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZQorZXh0ZW5zaW9ucyB3aWxsIHNpbXBseSBpZ25vcmUgdGhlbS4KKworQXV0aGVudGljYXRpb24gdXNpbmcgdGhlIG5ldyBrZXkgZm9ybWF0cyBkZXNjcmliZWQgYmVsb3cgcHJvY2VlZHMKK3VzaW5nIHRoZSBleGlzdGluZyBTU0ggInB1YmxpY2tleSIgYXV0aGVudGljYXRpb24gbWV0aG9kIGRlc2NyaWJlZAoraW4gUkZDNDI1MiBzZWN0aW9uIDcuCisKK05ldyBwdWJsaWMga2V5IGZvcm1hdHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGNlcnRpZmljYXRlIGtleSB0eXBlcyB0YWtlIGEgc2ltaWxhciBoaWdoLWxldmVsIGZvcm1hdCAobm90ZTogZGF0YQordHlwZXMgYW5kIGVuY29kaW5nIGFyZSBhcyBwZXIgUkZDNDI1MSBzZWN0aW9uIDUpLiBUaGUgc2VyaWFsaXNlZCB3aXJlCitlbmNvZGluZyBvZiB0aGVzZSBjZXJ0aWZpY2F0ZXMgaXMgYWxzbyB1c2VkIGZvciBzdG9yaW5nIHRoZW0gb24gZGlzay4KKworI2RlZmluZSBTU0hfQ0VSVF9UWVBFX1VTRVIgICAgMQorI2RlZmluZSBTU0hfQ0VSVF9UWVBFX0hPU1QgICAgMgorCitSU0EgY2VydGlmaWNhdGUKKworICAgIHN0cmluZyAgICAic3NoLXJzYS1jZXJ0LXYwMUBvcGVuc3NoLmNvbSIKKyAgICBzdHJpbmcgICAgbm9uY2UKKyAgICBtcGludCAgICAgZQorICAgIG1waW50ICAgICBuCisgICAgdWludDY0ICAgIHNlcmlhbAorICAgIHVpbnQzMiAgICB0eXBlCisgICAgc3RyaW5nICAgIGtleSBpZAorICAgIHN0cmluZyAgICB2YWxpZCBwcmluY2lwYWxzCisgICAgdWludDY0ICAgIHZhbGlkIGFmdGVyCisgICAgdWludDY0ICAgIHZhbGlkIGJlZm9yZQorICAgIHN0cmluZyAgICBjcml0aWNhbCBvcHRpb25zCisgICAgc3RyaW5nICAgIGV4dGVuc2lvbnMKKyAgICBzdHJpbmcgICAgcmVzZXJ2ZWQKKyAgICBzdHJpbmcgICAgc2lnbmF0dXJlIGtleQorICAgIHN0cmluZyAgICBzaWduYXR1cmUKKworRFNBIGNlcnRpZmljYXRlCisKKyAgICBzdHJpbmcgICAgInNzaC1kc3MtY2VydC12MDFAb3BlbnNzaC5jb20iCisgICAgc3RyaW5nICAgIG5vbmNlCisgICAgbXBpbnQgICAgIHAKKyAgICBtcGludCAgICAgcQorICAgIG1waW50ICAgICBnCisgICAgbXBpbnQgICAgIHkKKyAgICB1aW50NjQgICAgc2VyaWFsCisgICAgdWludDMyICAgIHR5cGUKKyAgICBzdHJpbmcgICAga2V5IGlkCisgICAgc3RyaW5nICAgIHZhbGlkIHByaW5jaXBhbHMKKyAgICB1aW50NjQgICAgdmFsaWQgYWZ0ZXIKKyAgICB1aW50NjQgICAgdmFsaWQgYmVmb3JlCisgICAgc3RyaW5nICAgIGNyaXRpY2FsIG9wdGlvbnMKKyAgICBzdHJpbmcgICAgZXh0ZW5zaW9ucworICAgIHN0cmluZyAgICByZXNlcnZlZAorICAgIHN0cmluZyAgICBzaWduYXR1cmUga2V5CisgICAgc3RyaW5nICAgIHNpZ25hdHVyZQorCitFQ0RTQSBjZXJ0aWZpY2F0ZQorCisgICAgc3RyaW5nICAgICJlY2RzYS1zaGEyLW5pc3RwMjU2QG9wZW5zc2guY29tIiB8CisgICAgICAgICAgICAgICJlY2RzYS1zaGEyLW5pc3RwMzg0QG9wZW5zc2guY29tIiB8CisgICAgICAgICAgICAgICJlY2RzYS1zaGEyLW5pc3RwNTIxQG9wZW5zc2guY29tIgorICAgIHN0cmluZyAgICBub25jZQorICAgIHN0cmluZyAgICBjdXJ2ZQorICAgIHN0cmluZyAgICBwdWJsaWNfa2V5CisgICAgdWludDY0ICAgIHNlcmlhbAorICAgIHVpbnQzMiAgICB0eXBlCisgICAgc3RyaW5nICAgIGtleSBpZAorICAgIHN0cmluZyAgICB2YWxpZCBwcmluY2lwYWxzCisgICAgdWludDY0ICAgIHZhbGlkIGFmdGVyCisgICAgdWludDY0ICAgIHZhbGlkIGJlZm9yZQorICAgIHN0cmluZyAgICBjcml0aWNhbCBvcHRpb25zCisgICAgc3RyaW5nICAgIGV4dGVuc2lvbnMKKyAgICBzdHJpbmcgICAgcmVzZXJ2ZWQKKyAgICBzdHJpbmcgICAgc2lnbmF0dXJlIGtleQorICAgIHN0cmluZyAgICBzaWduYXR1cmUKKworVGhlIG5vbmNlIGZpZWxkIGlzIGEgQ0EtcHJvdmlkZWQgcmFuZG9tIGJpdHN0cmluZyBvZiBhcmJpdHJhcnkgbGVuZ3RoCisoYnV0IHR5cGljYWxseSAxNiBvciAzMiBieXRlcykgaW5jbHVkZWQgdG8gbWFrZSBhdHRhY2tzIHRoYXQgZGVwZW5kIG9uCitpbmR1Y2luZyBjb2xsaXNpb25zIGluIHRoZSBzaWduYXR1cmUgaGFzaCBpbmZlYXNpYmxlLgorCitlIGFuZCBuIGFyZSB0aGUgUlNBIGV4cG9uZW50IGFuZCBwdWJsaWMgbW9kdWx1cyByZXNwZWN0aXZlbHkuCisKK3AsIHEsIGcsIHkgYXJlIHRoZSBEU0EgcGFyYW1ldGVycyBhcyBkZXNjcmliZWQgaW4gRklQUy0xODYtMi4KKworY3VydmUgYW5kIHB1YmxpYyBrZXkgYXJlIHJlc3BlY3RpdmVseSB0aGUgRUNEU0EgIltpZGVudGlmaWVyXSIgYW5kICJRIgorZGVmaW5lZCBpbiBzZWN0aW9uIDMuMSBvZiBSRkM1NjU2LgorCitzZXJpYWwgaXMgYW4gb3B0aW9uYWwgY2VydGlmaWNhdGUgc2VyaWFsIG51bWJlciBzZXQgYnkgdGhlIENBIHRvCitwcm92aWRlIGFuIGFiYnJldmlhdGVkIHdheSB0byByZWZlciB0byBjZXJ0aWZpY2F0ZXMgZnJvbSB0aGF0IENBLgorSWYgYSBDQSBkb2VzIG5vdCB3aXNoIHRvIG51bWJlciBpdHMgY2VydGlmaWNhdGVzIGl0IG11c3Qgc2V0IHRoaXMKK2ZpZWxkIHRvIHplcm8uCisKK3R5cGUgc3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBmb3IgaWRlbnRpZmljYXRpb24gb2YgYSB1c2VyCitvciBhIGhvc3QgdXNpbmcgYSBTU0hfQ0VSVF9UWVBFXy4uLiB2YWx1ZS4KKwora2V5IGlkIGlzIGEgZnJlZS1mb3JtIHRleHQgZmllbGQgdGhhdCBpcyBmaWxsZWQgaW4gYnkgdGhlIENBIGF0IHRoZSB0aW1lCitvZiBzaWduaW5nOyB0aGUgaW50ZW50aW9uIGlzIHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmllbGQgYXJlIHVzZWQgdG8KK2lkZW50aWZ5IHRoZSBpZGVudGl0eSBwcmluY2lwYWwgaW4gbG9nIG1lc3NhZ2VzLgorCisidmFsaWQgcHJpbmNpcGFscyIgaXMgYSBzdHJpbmcgY29udGFpbmluZyB6ZXJvIG9yIG1vcmUgcHJpbmNpcGFscyBhcworc3RyaW5ncyBwYWNrZWQgaW5zaWRlIGl0LiBUaGVzZSBwcmluY2lwYWxzIGxpc3QgdGhlIG5hbWVzIGZvciB3aGljaCB0aGlzCitjZXJ0aWZpY2F0ZSBpcyB2YWxpZDsgaG9zdG5hbWVzIGZvciBTU0hfQ0VSVF9UWVBFX0hPU1QgY2VydGlmaWNhdGVzIGFuZAordXNlcm5hbWVzIGZvciBTU0hfQ0VSVF9UWVBFX1VTRVIgY2VydGlmaWNhdGVzLiBBcyBhIHNwZWNpYWwgY2FzZSwgYQoremVyby1sZW5ndGggInZhbGlkIHByaW5jaXBhbHMiIGZpZWxkIG1lYW5zIHRoZSBjZXJ0aWZpY2F0ZSBpcyB2YWxpZCBmb3IKK2FueSBwcmluY2lwYWwgb2YgdGhlIHNwZWNpZmllZCB0eXBlLiBYWFggRE5TIHdpbGRjYXJkcz8KKworInZhbGlkIGFmdGVyIiBhbmQgInZhbGlkIGJlZm9yZSIgc3BlY2lmeSBhIHZhbGlkaXR5IHBlcmlvZCBmb3IgdGhlCitjZXJ0aWZpY2F0ZS4gRWFjaCByZXByZXNlbnRzIGEgdGltZSBpbiBzZWNvbmRzIHNpbmNlIDE5NzAtMDEtMDEKKzAwOjAwOjAwLiBBIGNlcnRpZmljYXRlIGlzIGNvbnNpZGVyZWQgdmFsaWQgaWY6CisKKyAgICB2YWxpZCBhZnRlciA8PSBjdXJyZW50IHRpbWUgPCB2YWxpZCBiZWZvcmUKKworY3JpdGljaWFsIG9wdGlvbnMgaXMgYSBzZXQgb2YgemVybyBvciBtb3JlIGtleSBvcHRpb25zIGVuY29kZWQgYXMKK2JlbG93LiBBbGwgc3VjaCBvcHRpb25zIGFyZSAiY3JpdGljYWwiIGluIHRoZSBzZW5zZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uCittdXN0IHJlZnVzZSB0byBhdXRob3Jpc2UgYSBrZXkgdGhhdCBoYXMgYW4gdW5yZWNvZ25pc2VkIG9wdGlvbi4KKworZXh0ZW5zaW9ucyBpcyBhIHNldCBvZiB6ZXJvIG9yIG1vcmUgb3B0aW9uYWwgZXh0ZW5zaW9ucy4gVGhlc2UgZXh0ZW5zaW9ucworYXJlIG5vdCBjcml0aWNhbCwgYW5kIGFuIGltcGxlbWVudGF0aW9uIHRoYXQgZW5jb3VudGVycyBvbmUgdGhhdCBpdCBkb2VzCitub3QgcmVjb2duaXNlIG1heSBzYWZlbHkgaWdub3JlIGl0LgorCitUaGUgcmVzZXJ2ZWQgZmllbGQgaXMgY3VycmVudGx5IHVudXNlZCBhbmQgaXMgaWdub3JlZCBpbiB0aGlzIHZlcnNpb24gb2YKK3RoZSBwcm90b2NvbC4KKworc2lnbmF0dXJlIGtleSBjb250YWlucyB0aGUgQ0Ega2V5IHVzZWQgdG8gc2lnbiB0aGUgY2VydGlmaWNhdGUuCitUaGUgdmFsaWQga2V5IHR5cGVzIGZvciBDQSBrZXlzIGFyZSBzc2gtcnNhLCBzc2gtZHNzIGFuZCB0aGUgRUNEU0EgdHlwZXMKK2VjZHNhLXNoYTItbmlzdHAyNTYsIGVjZHNhLXNoYTItbmlzdHAzODQsIGVjZHNhLXNoYTItbmlzdHA1MjEuICJDaGFpbmVkIgorY2VydGlmaWNhdGVzLCB3aGVyZSB0aGUgc2lnbmF0dXJlIGtleSB0eXBlIGlzIGEgY2VydGlmaWNhdGUgdHlwZSBpdHNlbGYKK2FyZSBOT1Qgc3VwcG9ydGVkLiBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgZm9yIGEgUlNBIGNlcnRpZmljYXRlIGtleSB0bworYmUgc2lnbmVkIGJ5IGEgRFNTIG9yIEVDRFNBIENBIGtleSBhbmQgdmljZS12ZXJzYS4KKworc2lnbmF0dXJlIGlzIGNvbXB1dGVkIG92ZXIgYWxsIHByZWNlZGluZyBmaWVsZHMgZnJvbSB0aGUgaW5pdGlhbCBzdHJpbmcKK3VwIHRvLCBhbmQgaW5jbHVkaW5nIHRoZSBzaWduYXR1cmUga2V5LiBTaWduYXR1cmVzIGFyZSBjb21wdXRlZCBhbmQKK2VuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBkZWZpbmVkIGZvciB0aGUgQ0EncyBwdWJsaWMga2V5IGFsZ29yaXRobQorKFJGQzQyNTMgc2VjdGlvbiA2LjYgZm9yIHNzaC1yc2EgYW5kIHNzaC1kc3MsIFJGQzU2NTYgZm9yIHRoZSBFQ0RTQQordHlwZXMpLgorCitDcml0aWNhbCBvcHRpb25zCistLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBjcml0aWNhbCBvcHRpb25zIHNlY3Rpb24gb2YgdGhlIGNlcnRpZmljYXRlIHNwZWNpZmllcyB6ZXJvIG9yIG1vcmUKK29wdGlvbnMgb24gdGhlIGNlcnRpZmljYXRlcyB2YWxpZGl0eS4gVGhlIGZvcm1hdCBvZiB0aGlzIGZpZWxkCitpcyBhIHNlcXVlbmNlIG9mIHplcm8gb3IgbW9yZSB0dXBsZXM6CisKKyAgICBzdHJpbmcgICAgICAgbmFtZQorICAgIHN0cmluZyAgICAgICBkYXRhCisKK09wdGlvbnMgbXVzdCBiZSBsZXhpY2FsbHkgb3JkZXJlZCBieSAibmFtZSIgaWYgdGhleSBhcHBlYXIgaW4gdGhlCitzZXF1ZW5jZS4KKworVGhlIG5hbWUgZmllbGQgaWRlbnRpZmllcyB0aGUgb3B0aW9uIGFuZCB0aGUgZGF0YSBmaWVsZCBlbmNvZGVzCitvcHRpb24tc3BlY2lmaWMgaW5mb3JtYXRpb24gKHNlZSBiZWxvdykuIEFsbCBvcHRpb25zIGFyZQorImNyaXRpY2FsIiwgaWYgYW4gaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVjb2duaXNlIGEgb3B0aW9uCit0aGVuIHRoZSB2YWxpZGF0aW5nIHBhcnR5IHNob3VsZCByZWZ1c2UgdG8gYWNjZXB0IHRoZSBjZXJ0aWZpY2F0ZS4KKworVGhlIHN1cHBvcnRlZCBvcHRpb25zIGFuZCB0aGUgY29udGVudHMgYW5kIHN0cnVjdHVyZSBvZiB0aGVpcgorZGF0YSBmaWVsZHMgYXJlOgorCitOYW1lICAgICAgICAgICAgICAgICAgICBGb3JtYXQgICAgICAgIERlc2NyaXB0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZm9yY2UtY29tbWFuZCAgICAgICAgICAgc3RyaW5nICAgICAgICBTcGVjaWZpZXMgYSBjb21tYW5kIHRoYXQgaXMgZXhlY3V0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcGxhY2luZyBhbnkgdGhlIHVzZXIgc3BlY2lmaWVkIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2ggY29tbWFuZC1saW5lKSB3aGVuZXZlciB0aGlzIGtleSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi4KKworc291cmNlLWFkZHJlc3MgICAgICAgICAgc3RyaW5nICAgICAgICBDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBzb3VyY2UgYWRkcmVzc2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gd2hpY2ggdGhpcyBjZXJ0aWZpY2F0ZSBpcyBhY2NlcHRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYXV0aGVudGljYXRpb24uIEFkZHJlc3NlcyBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGluIENJRFIgZm9ybWF0IChubi5ubi5ubi5ubi9ubgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBoaGhoOjpoaGhoL25uKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBvcHRpb24gaXMgbm90IHByZXNlbnQgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZXMgbWF5IGJlIHByZXNlbnRlZCBmcm9tIGFueQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgYWRkcmVzcy4KKworRXh0ZW5zaW9ucworLS0tLS0tLS0tLQorCitUaGUgZXh0ZW5zaW9ucyBzZWN0aW9uIG9mIHRoZSBjZXJ0aWZpY2F0ZSBzcGVjaWZpZXMgemVybyBvciBtb3JlCitub24tY3JpdGljYWwgY2VydGlmaWNhdGUgZXh0ZW5zaW9ucy4gVGhlIGVuY29kaW5nIGFuZCBvcmRlcmluZyBvZgorZXh0ZW5zaW9ucyBpbiB0aGlzIGZpZWxkIGlzIGlkZW50aWNhbCB0byB0aGF0IG9mIHRoZSBjcml0aWNhbCBvcHRpb25zLgorSWYgYW4gaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVjb2duaXNlIGFuIGV4dGVuc2lvbiwgdGhlbiBpdCBzaG91bGQKK2lnbm9yZSBpdC4KKworVGhlIHN1cHBvcnRlZCBleHRlbnNpb25zIGFuZCB0aGUgY29udGVudHMgYW5kIHN0cnVjdHVyZSBvZiB0aGVpciBkYXRhCitmaWVsZHMgYXJlOgorCitOYW1lICAgICAgICAgICAgICAgICAgICBGb3JtYXQgICAgICAgIERlc2NyaXB0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcGVybWl0LVgxMS1mb3J3YXJkaW5nICAgZW1wdHkgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhhdCBYMTEgZm9yd2FyZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgcGVybWl0dGVkLiBYMTEgZm9yd2FyZGluZyB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJlZnVzZWQgaWYgdGhpcyBvcHRpb24gaXMgYWJzZW50LgorCitwZXJtaXQtYWdlbnQtZm9yd2FyZGluZyBlbXB0eSAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGF0IGFnZW50IGZvcndhcmRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGFsbG93ZWQuIEFnZW50IGZvcndhcmRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBub3QgYmUgcGVybWl0dGVkIHVubGVzcyB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiBpcyBwcmVzZW50LgorCitwZXJtaXQtcG9ydC1mb3J3YXJkaW5nICBlbXB0eSAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGF0IHBvcnQtZm9yd2FyZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgYWxsb3dlZC4gSWYgdGhpcyBvcHRpb24gaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHByZXNlbnQgdGhlbiBubyBwb3J0IGZvcndhcmRpbmcgd2lsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBhbGxvd2VkLgorCitwZXJtaXQtcHR5ICAgICAgICAgICAgICBlbXB0eSAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGF0IFBUWSBhbGxvY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBwZXJtaXR0ZWQuIEluIHRoZSBhYnNlbmNlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgb3B0aW9uIFBUWSBhbGxvY2F0aW9uIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQuCisKK3Blcm1pdC11c2VyLXJjICAgICAgICAgIGVtcHR5ICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoYXQgZXhlY3V0aW9uIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4vLnNzaC9yYyBzaG91bGQgYmUgcGVybWl0dGVkLiBFeGVjdXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhpcyBzY3JpcHQgd2lsbCBub3QgYmUgcGVybWl0dGVkIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgb3B0aW9uIGlzIG5vdCBwcmVzZW50LgorCiskT3BlbkJTRDogUFJPVE9DT0wuY2VydGtleXMsdiAxLjggMjAxMC8wOC8zMSAxMTo1NDo0NSBkam0gRXhwICQKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvUFJPVE9DT0wubXV4IGIvb3BlbnNzaC02LjBwMS9QUk9UT0NPTC5tdXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDljYmU1YgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvUFJPVE9DT0wubXV4CkBAIC0wLDAgKzEsMjIyIEBACitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgbXVsdGlwbGV4aW5nIHByb3RvY29sIHVzZWQgYnkgc3NoKDEpJ3MKK0NvbnRyb2xNYXN0ZXIgY29ubmVjdGlvbi1zaGFyaW5nLgorCitNb3N0IG1lc3NhZ2VzIGZyb20gdGhlIGNsaWVudCB0byB0aGUgc2VydmVyIGNvbnRhaW4gYSAicmVxdWVzdCBpZCIgZmllbGQuCitUaGlzIGZpZWxkIGlzIHJldHVybmVkIGluIHJlcGxpZXMgYXMgImNsaWVudCByZXF1ZXN0IGlkIiB0byBmYWNpbGl0YXRlCittYXRjaGluZyBvZiByZXNwb25zZXMgdG8gcmVxdWVzdHMuCisKKzEuIENvbm5lY3Rpb24gc2V0dXAKKworV2hlbiBhIG11bHRpcGxleGluZyBjb25uZWN0aW9uIGlzIG1hZGUgdG8gYSBzc2goMSkgb3BlcmF0aW5nIGFzIGEKK0NvbnRyb2xNYXN0ZXIgZnJvbSBhIHNzaCgxKSBpbiBtdWx0aXBsZXggc2xhdmUgbW9kZSwgdGhlIGZpcnN0CithY3Rpb24gb2YgZWFjaCBpcyB0byBleGNoYW5nZSBoZWxsbyBtZXNzYWdlczoKKworCXVpbnQzMglNVVhfTVNHX0hFTExPCisJdWludDMyICBwcm90b2NvbCB2ZXJzaW9uCisJc3RyaW5nICBleHRlbnNpb24gbmFtZSBbb3B0aW9uYWxdCisJc3RyaW5nICBleHRlbnNpb24gdmFsdWUgW29wdGlvbmFsXQorCS4uLgorCitUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBtdXggcHJvdG9jb2wgaXMgNC4gQSBzbGF2ZSBzaG91bGQgcmVmdXNlCit0byBjb25uZWN0IHRvIGEgbWFzdGVyIHRoYXQgc3BlYWtzIGFuIHVuc3VwcG9ydGVkIHByb3RvY29sIHZlcnNpb24uCitGb2xsb3dpbmcgdGhlIHZlcnNpb24gaWRlbnRpZmllciBhcmUgemVybyBvciBtb3JlIGV4dGVuc2lvbnMKK3JlcHJlc2VudGVkIGFzIGEgbmFtZS92YWx1ZSBwYWlyLiBObyBleHRlbnNpb25zIGFyZSBjdXJyZW50bHkKK2RlZmluZWQuCisKKzIuIE9wZW5pbmcgc2Vzc2lvbnMKKworVG8gb3BlbiBhIG5ldyBtdWx0aXBsZXhlZCBzZXNzaW9uLCBhIGNsaWVudCBtYXkgc2VuZCB0aGUgZm9sbG93aW5nCityZXF1ZXN0OgorCisJdWludDMyCU1VWF9DX05FV19TRVNTSU9OCisJdWludDMyICByZXF1ZXN0IGlkCisJc3RyaW5nCXJlc2VydmVkCisJYm9vbAl3YW50IHR0eSBmbGFnCisJYm9vbAl3YW50IFgxMSBmb3J3YXJkaW5nIGZsYWcKKwlib29sCXdhbnQgYWdlbnQgZmxhZworCWJvb2wJc3Vic3lzdGVtIGZsYWcKKwl1aW50MzIJZXNjYXBlIGNoYXIKKwlzdHJpbmcJdGVybWluYWwgdHlwZQorCXN0cmluZwljb21tYW5kCisJc3RyaW5nCWVudmlyb25tZW50IHN0cmluZyAwIFtvcHRpb25hbF0KKwkuLi4KKworVG8gZGlzYWJsZSB0aGUgdXNlIG9mIGFuIGVzY2FwZSBjaGFyYWN0ZXIsICJlc2NhcGUgY2hhciIgbWF5IGJlIHNldAordG8gMHhmZmZmZmZmZi4gInRlcm1pbmFsIHR5cGUiIGlzIGdlbmVyYWxseSBzZXQgdG8gdGhlIHZhbHVlIG9mCiskVEVSTS4gemVybyBvciBtb3JlIGVudmlyb25tZW50IHN0cmluZ3MgbWF5IGZvbGxvdyB0aGUgY29tbWFuZC4KKworVGhlIGNsaWVudCB0aGVuIHNlbmRzIGl0cyBzdGFuZGFyZCBpbnB1dCwgb3V0cHV0IGFuZCBlcnJvciBmaWxlCitkZXNjcmlwdG9ycyAoaW4gdGhhdCBvcmRlcikgdXNpbmcgVW5peCBkb21haW4gc29ja2V0IGNvbnRyb2wgbWVzc2FnZXMuCisKK1RoZSBjb250ZW50cyBvZiAicmVzZXJ2ZWQiIGFyZSBjdXJyZW50bHkgaWdub3JlZC4KKworSWYgc3VjY2Vzc2Z1bCwgdGhlIHNlcnZlciB3aWxsIHJlcGx5IHdpdGggTVVYX1NfU0VTU0lPTl9PUEVORUQKKworCXVpbnQzMglNVVhfU19TRVNTSU9OX09QRU5FRAorCXVpbnQzMgljbGllbnQgcmVxdWVzdCBpZAorCXVpbnQzMglzZXNzaW9uIGlkCisKK090aGVyd2lzZSBpdCB3aWxsIHJlcGx5IHdpdGggYW4gZXJyb3I6IE1VWF9TX1BFUk1JU1NJT05fREVOSUVEIG9yCitNVVhfU19GQUlMVVJFLgorCitPbmNlIHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIHRoZSBmZHMsIGl0IHdpbGwgcmVzcG9uZCB3aXRoIE1VWF9TX09LCitpbmRpY2F0aW5nIHRoYXQgdGhlIHNlc3Npb24gaXMgdXAuIFRoZSBjbGllbnQgbm93IHdhaXRzIGZvciB0aGUKK3Nlc3Npb24gdG8gZW5kLiBXaGVuIGl0IGRvZXMsIHRoZSBzZXJ2ZXIgd2lsbCBzZW5kIGFuIGV4aXQgc3RhdHVzCittZXNzYWdlOgorCisJdWludDMyCU1VWF9TX0VYSVRfTUVTU0FHRQorCXVpbnQzMglzZXNzaW9uIGlkCisJdWludDMyCWV4aXQgdmFsdWUKKworVGhlIGNsaWVudCBzaG91bGQgZXhpdCB3aXRoIHRoaXMgdmFsdWUgdG8gbWltaWMgdGhlIGJlaGF2aW91ciBvZiBhCitub24tbXVsdGlwbGV4ZWQgc3NoKDEpIGNvbm5lY3Rpb24uIFR3byBhZGRpdGlvbmFsIGNhc2VzIHRoYXQgdGhlCitjbGllbnQgbXVzdCBjb3BlIHdpdGggYXJlIGl0IHJlY2VpdmluZyBhIHNpZ25hbCBpdHNlbGYgYW5kIHRoZQorc2VydmVyIGRpc2Nvbm5lY3Rpbmcgd2l0aG91dCBzZW5kaW5nIGFuIGV4aXQgbWVzc2FnZS4KKworQSBtYXN0ZXIgbWF5IGFsc28gc2VuZCBhIE1VWF9TX1RUWV9BTExPQ19GQUlMIGJlZm9yZSBNVVhfU19FWElUX01FU1NBR0UKK2lmIHJlbW90ZSBUVFkgYWxsb2NhdGlvbiB3YXMgdW5zdWNjZXNzZnVsLiBUaGUgY2xpZW50IG1heSB1c2UgdGhpcyB0bworcmV0dXJuIGl0cyBsb2NhbCB0dHkgdG8gImNvb2tlZCIgbW9kZS4KKworCXVpbnQzMglNVVhfU19UVFlfQUxMT0NfRkFJTAorCXVpbnQzMglzZXNzaW9uIGlkCisKKzMuIEhlYWx0aCBjaGVja3MKKworVGhlIGNsaWVudCBtYXkgcmVxdWVzdCBhIGhlYWx0aCBjaGVjay9QSUQgcmVwb3J0IGZyb20gYSBzZXJ2ZXI6CisKKwl1aW50MzIJTVVYX0NfQUxJVkVfQ0hFQ0sKKwl1aW50MzIJcmVxdWVzdCBpZAorCitUaGUgc2VydmVyIHJlcGxpZXMgd2l0aDoKKworCXVpbnQzMglNVVhfU19BTElWRQorCXVpbnQzMgljbGllbnQgcmVxdWVzdCBpZAorCXVpbnQzMglzZXJ2ZXIgcGlkCisKKzQuIFJlbW90ZWx5IHRlcm1pbmF0aW5nIGEgbWFzdGVyCisKK0EgY2xpZW50IG1heSByZXF1ZXN0IHRoYXQgYSBtYXN0ZXIgdGVybWluYXRlIGltbWVkaWF0ZWx5OgorCisJdWludDMyCU1VWF9DX1RFUk1JTkFURQorCXVpbnQzMglyZXF1ZXN0IGlkCisKK1RoZSBzZXJ2ZXIgd2lsbCByZXBseSB3aXRoIG9uZSBvZiBNVVhfU19PSyBvciBNVVhfU19QRVJNSVNTSU9OX0RFTklFRC4KKworNS4gUmVxdWVzdGluZyBlc3RhYmxpc2htZW50IG9mIHBvcnQgZm9yd2FyZHMKKworQSBjbGllbnQgbWF5IHJlcXVlc3QgdGhlIG1hc3RlciB0byBlc3RhYmxpc2ggYSBwb3J0IGZvcndhcmQ6CisKKwl1aW50MzIJTVVYX0NfT1BFTl9GV0QKKwl1aW50MzIJcmVxdWVzdCBpZAorCXVpbnQzMglmb3J3YXJkaW5nIHR5cGUKKwlzdHJpbmcJbGlzdGVuIGhvc3QKKwlzdHJpbmcJbGlzdGVuIHBvcnQKKwlzdHJpbmcJY29ubmVjdCBob3N0CisJc3RyaW5nCWNvbm5lY3QgcG9ydAorCitmb3J3YXJkaW5nIHR5cGUgbWF5IGJlIE1VWF9GV0RfTE9DQUwsIE1VWF9GV0RfUkVNT1RFLCBNVVhfRldEX0RZTkFNSUMuCisKK0Egc2VydmVyIG1heSByZXBseSB3aXRoIGEgTVVYX1NfT0ssIGEgTVVYX1NfUkVNT1RFX1BPUlQsIGEKK01VWF9TX1BFUk1JU1NJT05fREVOSUVEIG9yIGEgTVVYX1NfRkFJTFVSRS4KKworRm9yIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBsaXN0ZW4gcG9ydCB0aGUgc2VydmVyIHJlcGxpZXMgd2l0aAorCisJdWludDMyCU1VWF9TX1JFTU9URV9QT1JUCisJdWludDMyCWNsaWVudCByZXF1ZXN0IGlkCisJdWludDMyCWFsbG9jYXRlZCByZW1vdGUgbGlzdGVuIHBvcnQKKworNi4gUmVxdWVzdGluZyBjbG9zdXJlIG9mIHBvcnQgZm9yd2FyZHMKKworTm90ZTogY3VycmVudGx5IHVuaW1wbGVtZW50ZWQgKHNlcnZlciB3aWxsIGFsd2F5cyByZXBseSB3aXRoIE1VWF9TX0ZBSUxVUkUpLgorCitBIGNsaWVudCBtYXkgcmVxdWVzdCB0aGUgbWFzdGVyIHRvIGNsb3NlIGEgcG9ydCBmb3J3YXJkOgorCisJdWludDMyCU1VWF9DX0NMT1NFX0ZXRAorCXVpbnQzMglyZXF1ZXN0IGlkCisJdWludDMyCWZvcndhcmRpbmcgdHlwZQorCXN0cmluZwlsaXN0ZW4gaG9zdAorCXN0cmluZwlsaXN0ZW4gcG9ydAorCXN0cmluZwljb25uZWN0IGhvc3QKKwlzdHJpbmcJY29ubmVjdCBwb3J0CisKK0Egc2VydmVyIG1heSByZXBseSB3aXRoIGEgTVVYX1NfT0ssIGEgTVVYX1NfUEVSTUlTU0lPTl9ERU5JRUQgb3IgYQorTVVYX1NfRkFJTFVSRS4KKworNy4gUmVxdWVzdGluZyBzdGRpbyBmb3J3YXJkaW5nCisKK0EgY2xpZW50IG1heSByZXF1ZXN0IHRoZSBtYXN0ZXIgdG8gZXN0YWJsaXNoIGEgc3RkaW8gZm9yd2FyZGluZzoKKworCXVpbnQzMglNVVhfQ19ORVdfU1RESU9fRldECisJdWludDMyCXJlcXVlc3QgaWQKKwlzdHJpbmcJcmVzZXJ2ZWQKKwlzdHJpbmcJY29ubmVjdCBob3N0CisJc3RyaW5nCWNvbm5lY3QgcG9ydAorCitUaGUgY2xpZW50IHRoZW4gc2VuZHMgaXRzIHN0YW5kYXJkIGlucHV0IGFuZCBvdXRwdXQgZmlsZSBkZXNjcmlwdG9ycworKGluIHRoYXQgb3JkZXIpIHVzaW5nIFVuaXggZG9tYWluIHNvY2tldCBjb250cm9sIG1lc3NhZ2VzLgorCitUaGUgY29udGVudHMgb2YgInJlc2VydmVkIiBhcmUgY3VycmVudGx5IGlnbm9yZWQuCisKK0Egc2VydmVyIG1heSByZXBseSB3aXRoIGEgTVVYX1NfU0VTU0lPTl9PUEVORUQsIGEgTVVYX1NfUEVSTUlTU0lPTl9ERU5JRUQKK29yIGEgTVVYX1NfRkFJTFVSRS4KKworOC4gUmVxdWVzdGluZyBzaHV0ZG93biBvZiBtdXggbGlzdGVuZXIKKworQSBjbGllbnQgbWF5IHJlcXVlc3QgdGhlIG1hc3RlciB0byBzdG9wIGFjY2VwdGluZyBuZXcgbXVsdGlwbGV4aW5nIHJlcXVlc3RzCithbmQgcmVtb3ZlIGl0cyBsaXN0ZW5lciBzb2NrZXQuCisKKwl1aW50MzIJTVVYX0NfU1RPUF9MSVNURU5JTkcKKwl1aW50MzIJcmVxdWVzdCBpZAorCitBIHNlcnZlciBtYXkgcmVwbHkgd2l0aCBhIE1VWF9TX09LLCBhIE1VWF9TX1BFUk1JU1NJT05fREVOSUVEIG9yIGEKK01VWF9TX0ZBSUxVUkUuCisKKzkuIFN0YXR1cyBtZXNzYWdlcworCitUaGUgTVVYX1NfT0sgbWVzc2FnZSBpcyBlbXB0eToKKworCXVpbnQzMglNVVhfU19PSworCXVpbnQzMgljbGllbnQgcmVxdWVzdCBpZAorCitUaGUgTVVYX1NfUEVSTUlTU0lPTl9ERU5JRUQgYW5kIE1VWF9TX0ZBSUxVUkUgaW5jbHVkZSBhIHJlYXNvbjoKKworCXVpbnQzMglNVVhfU19QRVJNSVNTSU9OX0RFTklFRAorCXVpbnQzMgljbGllbnQgcmVxdWVzdCBpZAorCXN0cmluZwlyZWFzb24KKworCXVpbnQzMglNVVhfU19GQUlMVVJFCisJdWludDMyCWNsaWVudCByZXF1ZXN0IGlkCisJc3RyaW5nCXJlYXNvbgorCisxMC4gUHJvdG9jb2wgbnVtYmVycworCisjZGVmaW5lIE1VWF9NU0dfSEVMTE8JCTB4MDAwMDAwMDEKKyNkZWZpbmUgTVVYX0NfTkVXX1NFU1NJT04JMHgxMDAwMDAwMgorI2RlZmluZSBNVVhfQ19BTElWRV9DSEVDSwkweDEwMDAwMDA0CisjZGVmaW5lIE1VWF9DX1RFUk1JTkFURQkJMHgxMDAwMDAwNQorI2RlZmluZSBNVVhfQ19PUEVOX0ZXRAkJMHgxMDAwMDAwNgorI2RlZmluZSBNVVhfQ19DTE9TRV9GV0QJCTB4MTAwMDAwMDcKKyNkZWZpbmUgTVVYX0NfTkVXX1NURElPX0ZXRAkweDEwMDAwMDA4CisjZGVmaW5lIE1VWF9DX1NUT1BfTElTVEVOSU5HCTB4MTAwMDAwMDkKKyNkZWZpbmUgTVVYX1NfT0sJCTB4ODAwMDAwMDEKKyNkZWZpbmUgTVVYX1NfUEVSTUlTU0lPTl9ERU5JRUQJMHg4MDAwMDAwMgorI2RlZmluZSBNVVhfU19GQUlMVVJFCQkweDgwMDAwMDAzCisjZGVmaW5lIE1VWF9TX0VYSVRfTUVTU0FHRQkweDgwMDAwMDA0CisjZGVmaW5lIE1VWF9TX0FMSVZFCQkweDgwMDAwMDA1CisjZGVmaW5lIE1VWF9TX1NFU1NJT05fT1BFTkVECTB4ODAwMDAwMDYKKyNkZWZpbmUgTVVYX1NfUkVNT1RFX1BPUlQJMHg4MDAwMDAwNworI2RlZmluZSBNVVhfU19UVFlfQUxMT0NfRkFJTAkweDgwMDAwMDA4CisKKyNkZWZpbmUgTVVYX0ZXRF9MT0NBTAkxCisjZGVmaW5lIE1VWF9GV0RfUkVNT1RFCTIKKyNkZWZpbmUgTVVYX0ZXRF9EWU5BTUlDCTMKKworWFhYIFRPRE8KK1hYWCBleHRlbmRlZCBzdGF0dXMgKGUuZy4gcmVwb3J0IG9wZW4gY2hhbm5lbHMgLyBmb3J3YXJkcykKK1hYWCBsb2NrIChtYXliZSkKK1hYWCB3YXRjaCBpbi9vdXQgdHJhZmZpYyAocHJlL3Bvc3QgY3J5cHRvKQorWFhYIGluamVjdCBwYWNrZXQgKHdoYXQgYWJvdXQgcmVwbGllcykKK1hYWCBzZXJ2ZXItPmNsaWVudCBlcnJvci93YXJuaW5nIG5vdGlmaWNhdGlvbnMKK1hYWCBzZW5kIHNpZ25hbHMgdmlhIG11eAorCiskT3BlbkJTRDogUFJPVE9DT0wubXV4LHYgMS44IDIwMTEvMDkvMDkgMDA6NDQ6MDcgZGptIEV4cCAkCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL1JFQURNRSBiL29wZW5zc2gtNi4wcDEvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMmFkYzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL1JFQURNRQpAQCAtMCwwICsxLDY1IEBACitTZWUgaHR0cDovL3d3dy5vcGVuc3NoLmNvbS90eHQvcmVsZWFzZS02LjAgZm9yIHRoZSByZWxlYXNlIG5vdGVzLgorCistIEEgSmFwYW5lc2UgdHJhbnNsYXRpb24gb2YgdGhpcyBkb2N1bWVudCBhbmQgb2YgdGhlIE9wZW5TU0ggRkFRIGlzCistIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnVuaXh1c2VyLm9yZy9+aGFydXlhbWEvc2VjdXJpdHkvb3BlbnNzaC9pbmRleC5odG1sCistIFRoYW5rcyB0byBIQVJVWUFNQSBTZWlnbyA8aGFydXlhbWFAdW5peHVzZXIub3JnPgorCitUaGlzIGlzIHRoZSBwb3J0IG9mIE9wZW5CU0QncyBleGNlbGxlbnQgT3BlblNTSFswXSB0byBMaW51eCBhbmQgb3RoZXIKK1VuaWNlcy4KKworT3BlblNTSCBpcyBiYXNlZCBvbiB0aGUgbGFzdCBmcmVlIHZlcnNpb24gb2YgVGF0dSBZbG9uZW4ncyBzYW1wbGUKK2ltcGxlbWVudGF0aW9uIHdpdGggYWxsIHBhdGVudC1lbmN1bWJlcmVkIGFsZ29yaXRobXMgcmVtb3ZlZCAodG8KK2V4dGVybmFsIGxpYnJhcmllcyksIGFsbCBrbm93biBzZWN1cml0eSBidWdzIGZpeGVkLCBuZXcgZmVhdHVyZXMKK3JlaW50cm9kdWNlZCBhbmQgbWFueSBvdGhlciBjbGVhbi11cHMuICBPcGVuU1NIIGhhcyBiZWVuIGNyZWF0ZWQgYnkKK0Fhcm9uIENhbXBiZWxsLCBCb2IgQmVjaywgTWFya3VzIEZyaWVkbCwgTmllbHMgUHJvdm9zLCBUaGVvIGRlIFJhYWR0LAorYW5kIER1ZyBTb25nLiBJdCBoYXMgYSBob21lcGFnZSBhdCBodHRwOi8vd3d3Lm9wZW5zc2guY29tLworCitUaGlzIHBvcnQgY29uc2lzdHMgb2YgdGhlIHJlLWludHJvZHVjdGlvbiBvZiBhdXRvY29uZiBzdXBwb3J0LCBQQU0KK3N1cHBvcnQsIEVHRFsxXS9QUk5HRFsyXSBzdXBwb3J0IGFuZCByZXBsYWNlbWVudHMgZm9yIE9wZW5CU0QgbGlicmFyeQorZnVuY3Rpb25zIHRoYXQgYXJlIChyZWdyZXR0YWJseSkgYWJzZW50IGZyb20gb3RoZXIgdW5pY2VzLiBUaGlzIHBvcnQKK2hhcyBiZWVuIGJlc3QgdGVzdGVkIG9uIEFJWCwgQ3lnd2luLCBIUC1VWCwgTGludXgsIE1hY09TL1gsCitOZXRCU0QsIE9wZW5CU0QsIE9wZW5TZXJ2ZXIsIFNvbGFyaXMsIFVuaWNvcywgYW5kIFVuaXhXYXJlLgorCitUaGlzIHZlcnNpb24gYWN0aXZlbHkgdHJhY2tzIGNoYW5nZXMgaW4gdGhlIE9wZW5CU0QgQ1ZTIHJlcG9zaXRvcnkuCisKK1RoZSBQQU0gc3VwcG9ydCBpcyBub3cgbW9yZSBmdW5jdGlvbmFsIHRoYW4gdGhlIHBvcHVsYXIgcGFja2FnZXMgb2YKK2NvbW1lcmNpYWwgc3NoLTEuMi54LiBJdCBjaGVja3MgImFjY291bnQiIGFuZCAic2Vzc2lvbiIgbW9kdWxlcyBmb3IKK2FsbCBsb2dpbnMsIG5vdCBqdXN0IHdoZW4gdXNpbmcgcGFzc3dvcmQgYXV0aGVudGljYXRpb24uCisKK09wZW5TU0ggZGVwZW5kcyBvbiBabGliWzNdLCBPcGVuU1NMWzRdIGFuZCBvcHRpb25hbGx5IFBBTVs1XS4KKworVGhlcmUgaXMgbm93IHNldmVyYWwgbWFpbGluZyBsaXN0cyBmb3IgdGhpcyBwb3J0IG9mIE9wZW5TU0guIFBsZWFzZQorcmVmZXIgdG8gaHR0cDovL3d3dy5vcGVuc3NoLmNvbS9saXN0Lmh0bWwgZm9yIGRldGFpbHMgb24gaG93IHRvIGpvaW4uCisKK1BsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIGFuZCBwYXRjaGVzIHRvIHRoZSBtYWlsaW5nIGxpc3QKK29wZW5zc2gtdW5peC1kZXZAbWluZHJvdC5vcmcuIFRoZSBsaXN0IGlzIG9wZW4gdG8gcG9zdGluZyBieQordW5zdWJzY3JpYmVkIHVzZXJzLkNvZGUgY29udHJpYnV0aW9uIGFyZSB3ZWxjb21lZCwgYnV0IHBsZWFzZSBmb2xsb3cgdGhlIAorT3BlbkJTRCBzdHlsZSBndWlkZWxpbmVzWzZdLgorCitQbGVhc2UgcmVmZXIgdG8gdGhlIElOU1RBTEwgZG9jdW1lbnQgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBpbnN0YWxsCitPcGVuU1NIIG9uIHlvdXIgc3lzdGVtLiBUaGVyZSBhcmUgYSBudW1iZXIgb2YgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGlzCitwb3J0IG9mIE9wZW5TU0ggYW5kIEYtU2VjdXJlIFNTSCAxLngsIHBsZWFzZSByZWZlciB0byB0aGUgT3BlblNTSCBGQVFbN10KK2ZvciBkZXRhaWxzIGFuZCBnZW5lcmFsIHRpcHMuCisKK0RhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz4KKworTWlzY2VsbGFuaWEgLQorCitUaGlzIHZlcnNpb24gb2YgT3BlblNTSCBpcyBiYXNlZCB1cG9uIGNvZGUgcmV0cmlldmVkIGZyb20gdGhlIE9wZW5CU0QKK0NWUyByZXBvc2l0b3J5IHdoaWNoIGluIHR1cm4gd2FzIGJhc2VkIG9uIHRoZSBsYXN0IGZyZWUgc2FtcGxlCitpbXBsZW1lbnRhdGlvbiByZWxlYXNlZCBieSBUYXR1IFlsb25lbi4KKworUmVmZXJlbmNlcyAtCisKK1swXSBodHRwOi8vd3d3Lm9wZW5zc2guY29tL2ZhcS5odG1sCitbMV0gaHR0cDovL3d3dy5sb3RoYXIuY29tL3RlY2gvY3J5cHRvLworWzJdIGh0dHA6Ly93d3cuYWV0LnR1LWNvdHRidXMuZGUvcGVyc29uZW4vamFlbmlja2UvcG9zdGZpeF90bHMvcHJuZ2QuaHRtbAorWzNdIGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi8KK1s0XSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnLworWzVdIGh0dHA6Ly93d3cub3BlbnBhbS5vcmcKKyAgICBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L2xpYnMvcGFtLyAKKyAgICAoUEFNIGFsc28gaXMgc3RhbmRhcmQgb24gU29sYXJpcyBhbmQgSFAtVVggMTEpCitbNl0gaHR0cDovL3d3dy5vcGVuYnNkLm9yZy9jZ2ktYmluL21hbi5jZ2k/cXVlcnk9c3R5bGUmc2VrdGlvbj05CitbN10gaHR0cDovL3d3dy5vcGVuc3NoLmNvbS9mYXEuaHRtbAorCiskSWQ6IFJFQURNRSx2IDEuODAgMjAxMi8wNC8yMCAwNDoxMTowNCBkam0gRXhwICQKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvUkVBRE1FLmRucyBiL29wZW5zc2gtNi4wcDEvUkVBRE1FLmRucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Nzg3OTE4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9SRUFETUUuZG5zCkBAIC0wLDAgKzEsNDcgQEAKK0hvdyB0byB2ZXJpZnkgaG9zdCBrZXlzIHVzaW5nIE9wZW5TU0ggYW5kIEROUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK09wZW5TU0ggY29udGFpbnMgc3VwcG9ydCBmb3IgdmVyaWZ5aW5nIGhvc3Qga2V5cyB1c2luZyBETlMgYXMgZGVzY3JpYmVkIGluCitkcmFmdC1pZXRmLXNlY3NoLWRucy0wNS50eHQuIFRoZSBkb2N1bWVudCBjb250YWlucyB2ZXJ5IGJyaWVmIGluc3RydWN0aW9ucworb24gaG93IHRvIHVzZSB0aGlzIGZlYXR1cmUuIENvbmZpZ3VyaW5nIEROUyBpcyBvdXQgb2YgdGhlIHNjb3BlIG9mIHRoaXMKK2RvY3VtZW50LgorCisKKygxKSBTZXJ2ZXI6IEdlbmVyYXRlIGFuZCBwdWJsaXNoIHRoZSBETlMgUlIKKworVG8gY3JlYXRlIGEgRE5TIHJlc291cmNlIHJlY29yZCAoUlIpIGNvbnRhaW5pbmcgYSBmaW5nZXJwcmludCBvZiB0aGUKK3B1YmxpYyBob3N0IGtleSwgdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKworCXNzaC1rZXlnZW4gLXIgaG9zdG5hbWUgLWYga2V5ZmlsZSAtZworCit3aGVyZSAiaG9zdG5hbWUiIGlzIHlvdXIgZnVsbHkgcXVhbGlmaWVkIGhvc3RuYW1lIGFuZCAia2V5ZmlsZSIgaXMgdGhlCitmaWxlIGNvbnRhaW5pbmcgdGhlIHB1YmxpYyBob3N0IGtleSBmaWxlLiBJZiB5b3UgaGF2ZSBtdWx0aXBsZSBrZXlzLAoreW91IHNob3VsZCBnZW5lcmF0ZSBvbmUgUlIgZm9yIGVhY2gga2V5LgorCitJbiB0aGUgZXhhbXBsZSBhYm92ZSwgc3NoLWtleWdlbiB3aWxsIHByaW50IHRoZSBmaW5nZXJwcmludCBpbiBhCitnZW5lcmljIEROUyBSUiBmb3JtYXQgcGFyc2FibGUgYnkgbW9zdCBtb2Rlcm4gbmFtZSBzZXJ2ZXIKK2ltcGxlbWVudGF0aW9ucy4gSWYgeW91ciBuYW1lc2VydmVyIGhhcyBzdXBwb3J0IGZvciB0aGUgU1NIRlAgUlIKK3lvdSBjYW4gb21pdCB0aGUgLWcgZmxhZyBhbmQgc3NoLWtleWdlbiB3aWxsIHByaW50IGEgc3RhbmRhcmQgU1NIRlAgUlIuCisKK1RvIHB1Ymxpc2ggdGhlIGZpbmdlcnByaW50IHVzaW5nIHRoZSBETlMgeW91IG11c3QgYWRkIHRoZSBnZW5lcmF0ZWQgUlIKK3RvIHlvdXIgRE5TIHpvbmUgZmlsZSBhbmQgc2lnbiB5b3VyIHpvbmUuCisKKworKDIpIENsaWVudDogRW5hYmxlIHNzaCB0byB2ZXJpZnkgaG9zdCBrZXlzIHVzaW5nIEROUworCitUbyBlbmFibGUgdGhlIHNzaCBjbGllbnQgdG8gdmVyaWZ5IGhvc3Qga2V5cyB1c2luZyBETlMsIHlvdSBoYXZlIHRvCithZGQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdGhlIHNzaCBjb25maWd1cmF0aW9uIGZpbGUKKygkSE9NRS8uc3NoL2NvbmZpZyBvciAvZXRjL3NzaC9zc2hfY29uZmlnKToKKworICAgIFZlcmlmeUhvc3RLZXlETlMgeWVzCisKK1Vwb24gY29ubmVjdGlvbiB0aGUgY2xpZW50IHdpbGwgdHJ5IHRvIGxvb2sgdXAgdGhlIGZpbmdlcnByaW50IFJSCit1c2luZyBETlMuIElmIHRoZSBmaW5nZXJwcmludCByZWNlaXZlZCBmcm9tIHRoZSBETlMgc2VydmVyIG1hdGNoZXMKK3RoZSByZW1vdGUgaG9zdCBrZXksIHRoZSB1c2VyIHdpbGwgYmUgbm90aWZpZWQuCisKKworCUpha29iIFNjaGx5dGVyCisJV2VzbGV5IEdyaWZmaW4KKworCiskT3BlbkJTRDogUkVBRE1FLmRucyx2IDEuMiAyMDAzLzEwLzE0IDE5OjQzOjIzIGpha29iIEV4cCAkCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL1JFQURNRS5wbGF0Zm9ybSBiL29wZW5zc2gtNi4wcDEvUkVBRE1FLnBsYXRmb3JtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxOTgyMzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL1JFQURNRS5wbGF0Zm9ybQpAQCAtMCwwICsxLDk2IEBACitUaGlzIGZpbGUgY29udGFpbnMgbm90ZXMgYWJvdXQgT3BlblNTSCBvbiBzcGVjaWZpYyBwbGF0Zm9ybXMuCisKK0FJWAorLS0tCitBcyBvZiBPcGVuU1NIIDMuOHAxLCBzc2hkIHdpbGwgbm93IGhvbm91ciBhbiBhY2NvdW50cyBwYXNzd29yZCBleHBpcnkKK3NldHRpbmdzLCB3aGVyZSBwcmV2aW91c2x5IGl0IGRpZCBub3QuICBCZWNhdXNlIG9mIHRoaXMsIGl0J3MgcG9zc2libGUgZm9yCitzaXRlcyB0aGF0IGhhdmUgdXNlZCBPcGVuU1NIJ3Mgc3NoZCBleGNsdXNpdmVseSB0byBoYXZlIGFjY291bnRzIHdoaWNoCitoYXZlIHBhc3N3b3JkcyBleHBpcmVkIGxvbmdlciB0aGFuIHRoZSBpbmFjdGl2ZSB0aW1lIChpZSB0aGUgIldlZWtzIGJldHdlZW4KK3Bhc3N3b3JkIEVYUElSQVRJT04gYW5kIExPQ0tPVVQiIHNldHRpbmcgaW4gU01JVCBvciB0aGUgbWF4ZXhwaXJlZAorY2h1c2VyIGF0dHJpYnV0ZSkuCisKK0FjY291bnRzIGluIHRoaXMgc3RhdGUgbXVzdCBoYXZlIHRoZWlyIHBhc3N3b3JkcyByZXNldCBtYW51YWxseSBieSB0aGUKK2FkbWluaXN0cmF0b3IuICBBcyBhIHByZWNhdXRpb24sIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIGFkbWluaXN0cmF0aXZlCitwYXNzd29yZHMgYmUgcmVzZXQgYmVmb3JlIHVwZ3JhZGluZyBmcm9tIE9wZW5TU0ggPDMuOC4KKworQXMgb2YgT3BlblNTSCA0LjAsIGNvbmZpZ3VyZSB3aWxsIGF0dGVtcHQgdG8gZGV0ZWN0IGlmIHlvdXIgdmVyc2lvbgorYW5kIG1haW50ZW5hbmNlIGxldmVsIG9mIEFJWCBoYXMgYSB3b3JraW5nIGdldGFkZHJpbmZvLCBhbmQgd2lsbCB1c2UgaXQKK2lmIGZvdW5kLiAgVGhpcyB3aWxsIGVuYWJsZSBJUHY2IHN1cHBvcnQuICBJZiBmb3Igc29tZSByZWFzb24gY29uZmlndXJlCitnZXRzIGl0IHdyb25nLCBvciBpZiB5b3Ugd2FudCB0byBidWlsZCBiaW5hcmllcyB0byB3b3JrIG9uIGVhcmxpZXIgTUxzCit0aGFuIHRoZSBidWlsZCBob3N0IHRoZW4geW91IGNhbiBhZGQgIi1EQlJPS0VOX0dFVEFERFJJTkZPIiB0byBDRkxBR1MKK3RvIGZvcmNlIHRoZSBwcmV2aW91cyBJUHY0LW9ubHkgYmVoYXZpb3VyLgorCitJUHY2IGtub3duIHRvIHdvcms6IDUuMU1MNyA1LjJNTDIgNS4yTUw1CitJUHY2IGtub3duIGJyb2tlbjogNC4zLjNNTDExIDUuMU1MNAorCitJZiB5b3Ugd2lzaCB0byB1c2UgZHluYW1pYyBsaWJyYXJpZXMgdGhhdCBhcmVuJ3QgaW4gdGhlIG5vcm1hbCBzeXN0ZW0KK2xvY2F0aW9ucyAoZWcgSUJNJ3MgT3BlblNTTCBhbmQgemxpYiBwYWNrYWdlcykgdGhlbiB5b3Ugd2lsbCBuZWVkIHRvCitkZWZpbmUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGJsaWJwYXRoIGJlZm9yZSBydW5uaW5nIGNvbmZpZ3VyZSwgZWcKKworYmxpYnBhdGg9L2xpYjovdXNyL2xpYjovb3B0L2ZyZWV3YXJlL2xpYiAuL2NvbmZpZ3VyZSBcCisgIC0td2l0aC1zc2wtZGlyPS9vcHQvZnJlZXdhcmUgLS13aXRoLXpsaWI9L29wdC9mcmVld2FyZQorCitJZiBzc2hkIGlzIGJ1aWx0IHdpdGggdGhlIFdJVEhfQUlYQVVUSEVOVElDQVRFIG9wdGlvbiAod2hpY2ggaXMgZW5hYmxlZAorYnkgZGVmYXVsdCkgdGhlbiBzc2hkIGNoZWNrcyB0aGF0IHVzZXJzIGFyZSBwZXJtaXR0ZWQgdmlhIHRoZQorbG9naW5yZXN0cmljdGlvbnMoKSBmdW5jdGlvbiwgaW4gcGFydGljdWxhciB0aGF0IHRoZSB1c2VyIGhhcyB0aGUKKyJybG9naW4iIGF0dHJpYnV0ZSBzZXQuICBUaGlzIGNoZWNrIGlzIG5vdCBkb25lIGZvciB0aGUgcm9vdCBhY2NvdW50LAoraW5zdGVhZCB0aGUgUGVybWl0Um9vdExvZ2luIHNldHRpbmcgaW4gc3NoZF9jb25maWcgaXMgdXNlZC4KKworCitDeWd3aW4KKy0tLS0tLQorVG8gYnVpbGQgb24gQ3lnd2luLCBPcGVuU1NIIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgcGFja2FnZXM6CitnY2MsIGdjYy1taW5ndy1jb3JlLCBtaW5ndy1ydW50aW1lLCBiaW51dGlscywgbWFrZSwgb3BlbnNzbCwKK29wZW5zc2wtZGV2ZWwsIHpsaWIsIG1pbnJlcywgbWluaXJlcy1kZXZlbC4KKworCitEYXJ3aW4gYW5kIE1hY09TIFgKKy0tLS0tLS0tLS0tLS0tLS0tLQorRGFyd2luIGRvZXMgbm90IHByb3ZpZGUgYSB0dW4oNCkgZHJpdmVyIHJlcXVpcmVkIGZvciBPcGVuU1NILWJhc2VkCit2aXJ0dWFsIHByaXZhdGUgbmV0d29ya3MuIFRoZSBCU0QgbWFucGFnZSBzdGlsbCBleGlzdHMsIGJ1dCB0aGUgZHJpdmVyCitoYXMgYmVlbiByZW1vdmVkIGluIHJlY2VudCByZWxlYXNlcyBvZiBEYXJ3aW4gYW5kIE1hY09TIFguCisKK05ldmVydGhlbGVzcywgdHVubmVsIHN1cHBvcnQgaXMga25vd24gdG8gd29yayB3aXRoIERhcndpbiA4IGFuZAorTWFjT1MgWCAxMC40IGluIFBvaW50LXRvLVBvaW50IChMYXllciAzKSBhbmQgRXRoZXJuZXQgKExheWVyIDIpIG1vZGUKK3VzaW5nIGEgdGhpcmQgcGFydHkgZHJpdmVyLiBNb3JlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBhdDoKKwlodHRwOi8vd3d3LXVzZXIucmhyay51bmkta2wuZGUvfm5pc3NsZXIvdHVudGFwLworCisKK0xpbnV4CistLS0tLQorCitTb21lIExpbnV4IGRpc3RyaWJ1dGlvbnMgKGluY2x1ZGluZyBSZWQgSGF0L0ZlZG9yYS9DZW50T1MpIGluY2x1ZGUKK2hlYWRlcnMgYW5kIGxpYnJhcnkgbGlua3MgaW4gdGhlIC1kZXZlbCBSUE1zIHJhdGhlciB0aGFuIHRoZSBtYWluCitiaW5hcnkgUlBNcy4gSWYgeW91IGdldCBhbiBlcnJvciBhYm91dCBoZWFkZXJzLCBvciBjb21wbGFpbmluZyBhYm91dCBhCittaXNzaW5nIHByZXJlcXVpc2l0ZSB0aGVuIHlvdSBtYXkgbmVlZCB0byBpbnN0YWxsIHRoZSBlcXVpdmFsZW50CitkZXZlbG9wbWVudCBwYWNrYWdlcy4gIE9uIFJlZGhhdCBiYXNlZCBkaXN0cm9zIHRoZXNlIG1heSBiZSBvcGVuc3NsLWRldmVsLAoremxpYi1kZXZlbCBhbmQgcGFtLWRldmVsLCBvbiBEZWJpYW4gYmFzZWQgZGlzdHJvcyB0aGVzZSBtYXkgYmUKK2xpYnNzbC1kZXYsIGxpYnotZGV2IGFuZCBsaWJwYW0tZGV2LgorCisKK1NvbGFyaXMKKy0tLS0tLS0KK0lmIHlvdSBlbmFibGUgQlNNIGF1ZGl0aW5nIG9uIFNvbGFyaXMsIHlvdSBuZWVkIHRvIHVwZGF0ZSBhdWRpdF9ldmVudCg0KQorZm9yIHByYXVkaXQoMW0pIHRvIGdpdmUgc2Vuc2libGUgb3V0cHV0LiAgVGhlIGZvbGxvd2luZyBsaW5lIG5lZWRzIHRvIGJlCithZGRlZCB0byAvZXRjL3NlY3VyaXR5L2F1ZGl0X2V2ZW50OgorCisJMzI4MDA6QVVFX29wZW5zc2g6T3BlblNTSCBsb2dpbjpsbworCitUaGUgQlNNIGF1ZGl0IGV2ZW50IHJhbmdlIGF2YWlsYWJsZSBmb3IgdGhpcmQgcGFydHkgVENCIGFwcGxpY2F0aW9ucyBpcworMzI3NjggLSA2NTUzNS4gIEV2ZW50IG51bWJlciAzMjgwMCBoYXMgYmVlbiBjaG9vc2VuIGZvciBBVUVfb3BlbnNzaC4KK1RoZXJlIGlzIG5vIG9mZmljaWFsIHJlZ2lzdHJ5IG9mIDNyZCBwYXJ0eSBldmVudCBudW1iZXJzLCBzbyBpZiB0aGlzCitudW1iZXIgaXMgYWxyZWFkeSBpbiB1c2Ugb24geW91ciBzeXN0ZW0sIHlvdSBtYXkgY2hhbmdlIGl0IGF0IGJ1aWxkIHRpbWUKK2J5IGNvbmZpZ3VyZSdpbmcgLS13aXRoLWNmbGFncz0tREFVRV9vcGVuc3NoPTMyODAxIHRoZW4gcmVidWlsZGluZy4KKworCitQbGF0Zm9ybXMgdXNpbmcgUEFNCistLS0tLS0tLS0tLS0tLS0tLS0tCitBcyBvZiBPcGVuU1NIIDQuM3AxLCBzc2hkIHdpbGwgbm8gbG9uZ2VyIGNoZWNrIC9ldGMvbm9sb2dpbiBpdHNlbGYgd2hlbgorUEFNIGlzIGVuYWJsZWQuICBUbyBtYWludGFpbiBleGlzdGluZyBiZWhhdmlvdXIsIHBhbV9ub2xvZ2luIHNob3VsZCBiZQorYWRkZWQgdG8gc3NoZCdzIHNlc3Npb24gc3RhY2sgd2hpY2ggd2lsbCBwcmV2ZW50IHVzZXJzIGZyb20gc3RhcnRpbmcgc2hlbGwKK3Nlc3Npb25zLiAgQWx0ZXJuYXRpdmVseSwgcGFtX25vbG9naW4gY2FuIGJlIGFkZGVkIHRvIGVpdGhlciB0aGUgYXV0aCBvcgorYWNjb3VudCBzdGFja3Mgd2hpY2ggd2lsbCBwcmV2ZW50IGF1dGhlbnRpY2F0aW9uIGVudGlyZWx5LCBidXQgd2lsbCBzdGlsbAorcmV0dXJuIHRoZSBvdXRwdXQgZnJvbSBwYW1fbm9sb2dpbiB0byB0aGUgY2xpZW50LgorCisKKyRJZDogUkVBRE1FLnBsYXRmb3JtLHYgMS4xMCAyMDA5LzA4LzI4IDIzOjE0OjQ4IGR0dWNrZXIgRXhwICQKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvUkVBRE1FLnByaXZzZXAgYi9vcGVuc3NoLTYuMHAxL1JFQURNRS5wcml2c2VwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NjVlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL1JFQURNRS5wcml2c2VwCkBAIC0wLDAgKzEsNjMgQEAKK1ByaXZpbGVnZSBzZXBhcmF0aW9uLCBvciBwcml2c2VwLCBpcyBtZXRob2QgaW4gT3BlblNTSCBieSB3aGljaAorb3BlcmF0aW9ucyB0aGF0IHJlcXVpcmUgcm9vdCBwcml2aWxlZ2UgYXJlIHBlcmZvcm1lZCBieSBhIHNlcGFyYXRlCitwcml2aWxlZ2VkIG1vbml0b3IgcHJvY2Vzcy4gIEl0cyBwdXJwb3NlIGlzIHRvIHByZXZlbnQgcHJpdmlsZWdlCitlc2NhbGF0aW9uIGJ5IGNvbnRhaW5pbmcgY29ycnVwdGlvbiB0byBhbiB1bnByaXZpbGVnZWQgcHJvY2Vzcy4KK01vcmUgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGF0OgorCWh0dHA6Ly93d3cuY2l0aS51bWljaC5lZHUvdS9wcm92b3Mvc3NoL3ByaXZzZXAuaHRtbAorCitQcml2aWxlZ2Ugc2VwYXJhdGlvbiBpcyBub3cgZW5hYmxlZCBieSBkZWZhdWx0OyBzZWUgdGhlCitVc2VQcml2aWxlZ2VTZXBhcmF0aW9uIG9wdGlvbiBpbiBzc2hkX2NvbmZpZyg1KS4KKworT24gc3lzdGVtcyB3aGljaCBsYWNrIG1tYXAgb3IgYW5vbnltb3VzIChNQVBfQU5PTikgbWVtb3J5IG1hcHBpbmcsCitjb21wcmVzc2lvbiBtdXN0IGJlIGRpc2FibGVkIGluIG9yZGVyIGZvciBwcml2aWxlZ2Ugc2VwYXJhdGlvbiB0bworZnVuY3Rpb24uCisKK1doZW4gcHJpdnNlcCBpcyBlbmFibGVkLCBkdXJpbmcgdGhlIHByZS1hdXRoZW50aWNhdGlvbiBwaGFzZSBzc2hkIHdpbGwKK2Nocm9vdCgyKSB0byAiL3Zhci9lbXB0eSIgYW5kIGNoYW5nZSBpdHMgcHJpdmlsZWdlcyB0byB0aGUgInNzaGQiIHVzZXIKK2FuZCBpdHMgcHJpbWFyeSBncm91cC4gIHNzaGQgaXMgYSBwc2V1ZG8tYWNjb3VudCB0aGF0IHNob3VsZCBub3QgYmUKK3VzZWQgYnkgb3RoZXIgZGFlbW9ucywgYW5kIG11c3QgYmUgbG9ja2VkIGFuZCBzaG91bGQgY29udGFpbiBhCisibm9sb2dpbiIgb3IgaW52YWxpZCBzaGVsbC4KKworWW91IHNob3VsZCBkbyBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIHRvIHByZXBhcmUgdGhlIHByaXZzZXAKK3ByZWF1dGggZW52aXJvbm1lbnQ6CisKKwkjIG1rZGlyIC92YXIvZW1wdHkKKwkjIGNob3duIHJvb3Q6c3lzIC92YXIvZW1wdHkKKwkjIGNobW9kIDc1NSAvdmFyL2VtcHR5CisJIyBncm91cGFkZCBzc2hkCisJIyB1c2VyYWRkIC1nIHNzaGQgLWMgJ3NzaGQgcHJpdnNlcCcgLWQgL3Zhci9lbXB0eSAtcyAvYmluL2ZhbHNlIHNzaGQKKworL3Zhci9lbXB0eSBzaG91bGQgbm90IGNvbnRhaW4gYW55IGZpbGVzLgorCitjb25maWd1cmUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBvcHRpb25zIHRvIGNoYW5nZSB0aGUgZGVmYXVsdAorcHJpdnNlcCB1c2VyIGFuZCBjaHJvb3QgZGlyZWN0b3J5OgorCisgIC0td2l0aC1wcml2c2VwLXBhdGg9eHh4IFBhdGggZm9yIHByaXZpbGVnZSBzZXBhcmF0aW9uIGNocm9vdAorICAtLXdpdGgtcHJpdnNlcC11c2VyPXVzZXIgU3BlY2lmeSBub24tcHJpdmlsZWdlZCB1c2VyIGZvciBwcml2aWxlZ2Ugc2VwYXJhdGlvbgorCitQcml2c2VwIHJlcXVpcmVzIG9wZXJhdGluZyBzeXN0ZW0gc3VwcG9ydCBmb3IgZmlsZSBkZXNjcmlwdG9yIHBhc3NpbmcuCitDb21wcmVzc2lvbiB3aWxsIGJlIGRpc2FibGVkIG9uIHN5c3RlbXMgd2l0aG91dCBhIHdvcmtpbmcgbW1hcCBNQVBfQU5PTi4KKworUEFNLWVuYWJsZWQgT3BlblNTSCBpcyBrbm93biB0byBmdW5jdGlvbiB3aXRoIHByaXZzZXAgb24gQUlYLCBGcmVlQlNELCAKK0hQLVVYIChpbmNsdWRpbmcgVHJ1c3RlZCBNb2RlKSwgTGludXgsIE5ldEJTRCBhbmQgU29sYXJpcy4KKworT24gQ3lnd2luLCBUcnU2NCBVbml4LCBPcGVuU2VydmVyLCBhbmQgVW5pY29zIG9ubHkgdGhlIHByZS1hdXRoZW50aWNhdGlvbgorcGFydCBvZiBwcml2c2VwIGlzIHN1cHBvcnRlZC4gIFBvc3QtYXV0aGVudGljYXRpb24gcHJpdnNlcCBpcyBkaXNhYmxlZAorYXV0b21hdGljYWxseSAoc28geW91IHdvbid0IHNlZSB0aGUgYWRkaXRpb25hbCBwcm9jZXNzIG1lbnRpb25lZCBiZWxvdykuCisKK05vdGUgdGhhdCBmb3IgYSBub3JtYWwgaW50ZXJhY3RpdmUgbG9naW4gd2l0aCBhIHNoZWxsLCBlbmFibGluZyBwcml2c2VwCit3aWxsIHJlcXVpcmUgMSBhZGRpdGlvbmFsIHByb2Nlc3MgcGVyIGxvZ2luIHNlc3Npb24uCisKK0dpdmVuIHRoZSBmb2xsb3dpbmcgcHJvY2VzcyBsaXN0aW5nIChmcm9tIEhQLVVYKToKKworICAgICBVSUQgICBQSUQgIFBQSUQgIEMgICAgU1RJTUUgVFRZICAgICAgIFRJTUUgQ09NTUFORAorICAgIHJvb3QgIDEwMDUgICAgIDEgIDAgMTA6NDU6MTcgPyAgICAgICAgIDA6MDggL29wdC9vcGVuc3NoL3NiaW4vc3NoZCAtdTAKKyAgICByb290ICA2OTE3ICAxMDA1ICAwIDE1OjE5OjE2ID8gICAgICAgICAwOjAwIHNzaGQ6IHN0ZXZlc2sgW3ByaXZdCisgc3RldmVzayAgNjkxOSAgNjkxNyAgMCAxNToxOToxNyA/ICAgICAgICAgMDowMyBzc2hkOiBzdGV2ZXNrQDIKKyBzdGV2ZXNrICA2OTIxICA2OTE5ICAwIDE1OjE5OjE3IHB0cy8yICAgICAwOjAwIC1iYXNoCisKK3Byb2Nlc3MgMTAwNSBpcyB0aGUgc3NoZCBwcm9jZXNzIGxpc3RlbmluZyBmb3IgbmV3IGNvbm5lY3Rpb25zLgorcHJvY2VzcyA2OTE3IGlzIHRoZSBwcml2aWxlZ2VkIG1vbml0b3IgcHJvY2VzcywgNjkxOSBpcyB0aGUgdXNlciBvd25lZAorc3NoZCBwcm9jZXNzIGFuZCA2OTIxIGlzIHRoZSBzaGVsbCBwcm9jZXNzLgorCiskSWQ6IFJFQURNRS5wcml2c2VwLHYgMS4xNiAyMDA1LzA2LzA0IDIzOjIxOjQxIGRqbSBFeHAgJApkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9SRUFETUUudHVuIGIvb3BlbnNzaC02LjBwMS9SRUFETUUudHVuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMWNiMDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL1JFQURNRS50dW4KQEAgLTAsMCArMSwxMzIgQEAKK0hvdyB0byB1c2UgT3BlblNTSC1iYXNlZCB2aXJ0dWFsIHByaXZhdGUgbmV0d29ya3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT3BlblNTSCBjb250YWlucyBzdXBwb3J0IGZvciBWUE4gdHVubmVsaW5nIHVzaW5nIHRoZSB0dW4oNCkgbmV0d29yawordHVubmVsIHBzZXVkby1kZXZpY2Ugd2hpY2ggaXMgYXZhaWxhYmxlIG9uIG1vc3QgcGxhdGZvcm1zLCBlaXRoZXIgZm9yCitsYXllciAyIG9yIDMgdHJhZmZpYy4KKworVGhlIGZvbGxvd2luZyBicmllZiBpbnN0cnVjdGlvbnMgb24gaG93IHRvIHVzZSB0aGlzIGZlYXR1cmUgdXNlCithIG5ldHdvcmsgY29uZmlndXJhdGlvbiBzcGVjaWZpYyB0byB0aGUgT3BlbkJTRCBvcGVyYXRpbmcgc3lzdGVtLgorCisoMSkgU2VydmVyOiBFbmFibGUgc3VwcG9ydCBmb3IgU1NIIHR1bm5lbGluZworCitUbyBlbmFibGUgdGhlIHNzaCBzZXJ2ZXIgdG8gYWNjZXB0IHR1bm5lbCByZXF1ZXN0cyBmcm9tIHRoZSBjbGllbnQsIHlvdQoraGF2ZSB0byBhZGQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdGhlIHNzaCBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlCisoL2V0Yy9zc2gvc3NoZF9jb25maWcpOgorCisJUGVybWl0VHVubmVsIHllcworCitSZXN0YXJ0IHRoZSBzZXJ2ZXIgb3Igc2VuZCB0aGUgaGFuZ3VwIHNpZ25hbCAoU0lHSFVQKSB0byBsZXQgdGhlIHNlcnZlcgorcmVyZWFkIGl0J3MgY29uZmlndXJhdGlvbi4KKworKDIpIFNlcnZlcjogUmVzdHJpY3QgY2xpZW50IGFjY2VzcyBhbmQgYXNzaWduIHRoZSB0dW5uZWwKKworVGhlIE9wZW5TU0ggc2VydmVyIHNpbXBseSB1c2VzIHRoZSBmaWxlIC9yb290Ly5zc2gvYXV0aG9yaXplZF9rZXlzIHRvCityZXN0cmljdCB0aGUgY2xpZW50IHRvIGNvbm5lY3QgdG8gYSBzcGVjaWZpZWQgdHVubmVsIGFuZCB0bworYXV0b21hdGljYWxseSBzdGFydCB0aGUgcmVsYXRlZCBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBjb21tYW5kLiBUaGVzZQorc2V0dGluZ3MgYXJlIG9wdGlvbmFsIGJ1dCByZWNvbW1lbmRlZDoKKworCXR1bm5lbD0iMSIsY29tbWFuZD0ic2ggL2V0Yy9uZXRzdGFydCB0dW4xIiBzc2gtcnNhIC4uLiByZXlrQG9wZW5ic2Qub3JnCisKKygzKSBDbGllbnQ6IENvbmZpZ3VyZSB0aGUgbG9jYWwgbmV0d29yayB0dW5uZWwgaW50ZXJmYWNlCisKK1VzZSB0aGUgaG9zdG5hbWUuaWYoNSkgaW50ZXJmYWNlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBzZXQgdXAKK3RoZSBuZXR3b3JrIHR1bm5lbCBjb25maWd1cmF0aW9uIHdpdGggT3BlbkJTRC4gRm9yIGV4YW1wbGUsIHVzZSB0aGUKK2ZvbGxvd2luZyBjb25maWd1cmF0aW9uIGluIC9ldGMvaG9zdG5hbWUudHVuMCB0byBzZXQgdXAgdGhlIGxheWVyIDMKK3R1bm5lbCBvbiB0aGUgY2xpZW50OgorCisJaW5ldCAxOTIuMTY4LjUuMSAyNTUuMjU1LjI1NS4yNTIgMTkyLjE2OC41LjIKKworT3BlbkJTRCBhbHNvIHN1cHBvcnRzIGxheWVyIDIgdHVubmVsaW5nIG92ZXIgdGhlIHR1biBkZXZpY2UgYnkgYWRkaW5nCit0aGUgbGluazAgZmxhZzoKKworCWluZXQgMTkyLjE2OC4xLjc4IDI1NS4yNTUuMjU1LjAgMTkyLjE2OC4xLjI1NSBsaW5rMAorCitMYXllciAyIHR1bm5lbHMgY2FuIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBhbiBFdGhlcm5ldCBicmlkZ2UoNCkKK2ludGVyZmFjZSwgbGlrZSB0aGUgZm9sbG93aW5nIGV4YW1wbGUgZm9yIC9ldGMvYnJpZGdlbmFtZS5icmlkZ2UwOgorCisJYWRkIHR1bjAKKwlhZGQgc2lzMAorCXVwCisKKyg0KSBDbGllbnQ6IENvbmZpZ3VyZSB0aGUgT3BlblNTSCBjbGllbnQKKworVG8gZXN0YWJsaXNoIHR1bm5lbCBmb3J3YXJkaW5nIGZvciBjb25uZWN0aW9ucyB0byBhIHNwZWNpZmllZAorcmVtb3RlIGhvc3QgYnkgZGVmYXVsdCwgdXNlIHRoZSBmb2xsb3dpbmcgc3NoIGNsaWVudCBjb25maWd1cmF0aW9uIGZvcgordGhlIHByaXZpbGVnZWQgdXNlciAoaW4gL3Jvb3QvLnNzaC9jb25maWcpOgorCisJSG9zdCBzc2hnYXRld2F5CisJCVR1bm5lbCB5ZXMKKwkJVHVubmVsRGV2aWNlIDA6YW55CisJCVBlcm1pdExvY2FsQ29tbWFuZCB5ZXMKKwkgICAgICAgIExvY2FsQ29tbWFuZCBzaCAvZXRjL25ldHN0YXJ0IHR1bjAKKworQSBtb3JlIGNvbXBsaWNhdGVkIGNvbmZpZ3VyYXRpb24gaXMgcG9zc2libGUgdG8gZXN0YWJsaXNoIGEgdHVubmVsIHRvCithIHJlbW90ZSBob3N0IHdoaWNoIGlzIG5vdCBkaXJlY3RseSBhY2Nlc3NpYmxlIGJ5IHRoZSBjbGllbnQuCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVzY3JpYmVzIGEgY2xpZW50IGNvbmZpZ3VyYXRpb24gdG8gY29ubmVjdCB0bwordGhlIHJlbW90ZSBob3N0IG92ZXIgdHdvIHNzaCBob3BzIGluIGJldHdlZW4uIEl0IHVzZXMgdGhlIE9wZW5TU0gKK1Byb3h5Q29tbWFuZCBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBuYygxKSBwcm9ncmFtIHRvIGZvcndhcmQgdGhlIGZpbmFsCitzc2ggdHVubmVsIGRlc3RpbmF0aW9uIG92ZXIgbXVsdGlwbGUgc3NoIHNlc3Npb25zLgorCisJSG9zdCBhY2Nlc3Muc29tZXdoZXJlLm5ldAorCSAgICAgICAgVXNlciBwdWZmeQorCUhvc3QgZG16Z3cKKwkgICAgICAgIFVzZXIgcHVmZnkKKwkgICAgICAgIFByb3h5Q29tbWFuZCBzc2ggYWNjZXNzLnNvbWV3aGVyZS5uZXQgbmMgZG16Z3cgMjIKKwlIb3N0IHNzaGdhdGV3YXkKKwkgICAgICAgIFR1bm5lbCBFdGhlcm5ldAorCSAgICAgICAgVHVubmVsRGV2aWNlIDA6YW55CisJICAgICAgICBQZXJtaXRMb2NhbENvbW1hbmQgeWVzCisJICAgICAgICBMb2NhbENvbW1hbmQgc2ggL2V0Yy9uZXRzdGFydCB0dW4wCisJICAgICAgICBQcm94eUNvbW1hbmQgc3NoIGRtemd3IG5jIHNzaGdhdGV3YXkgMjIKKworVGhlIGZvbGxvd2luZyBuZXR3b3JrIHBsYW4gaWxsdXN0cmF0ZXMgdGhlIHByZXZpb3VzIGNvbmZpZ3VyYXRpb24gaW4KK2NvbWJpbmF0aW9uIHdpdGggbGF5ZXIgMiB0dW5uZWxpbmcgYW5kIEV0aGVybmV0IGJyaWRnaW5nLgorCisrLS0tLS0tLS0rICAgICAgICggICAgICAgICAgKSAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCBDbGllbnQgfC0tLS0tLSggIEludGVybmV0ICApLS0tLS18IGFjY2Vzcy5zb21ld2hlcmUubmV0IHwKKystLS0tLS0tLSsgICAgICAgKCAgICAgICAgICApICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgOiAxOTIuMTY4LjEuNzggICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICA6Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gICAgICAgICArLS0tLS0tLSsKKyAgICAgRm9yd2FyZGVkIHNzaCBjb25uZWN0aW9uICAgIDogICAgICAgICB8IGRtemd3IHwKKyAgICAgTGF5ZXIgMiB0dW5uZWwgICAgICAgICAgICAgIDogICAgICAgICArLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgKy0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDouLi4uLi58IHNzaGdhdGV3YXkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICstLS0tLS0tLS0tLS0rCistLS0gcmVhbCBjb25uZWN0aW9uICAgICAgICAgICAgICAgICBCcmlkZ2UgLT4gIHwgICAgICAgICAgKy0tLS0tLS0tLS0rCisuLi4gInZpcnR1YWwgY29ubmVjdGlvbiIgICAgICAgICAgICAgICAgICAgICBbIFggXS0tLS0tLS0tfCBzb21laG9zdCB8CitbWF0gc3dpdGNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyLjE2OC4xLjI1CisKKyg1KSBDbGllbnQ6IENvbm5lY3QgdG8gdGhlIHNlcnZlciBhbmQgZXN0YWJsaXNoIHRoZSB0dW5uZWwKKworRmluYWxseSBjb25uZWN0IHRvIHRoZSBPcGVuU1NIIHNlcnZlciB0byBlc3RhYmxpc2ggdGhlIHR1bm5lbCBieSB1c2luZwordGhlIGZvbGxvd2luZyBjb21tYW5kOgorCisJc3NoIHNzaGdhdGV3YXkKKworSXQgaXMgYWxzbyBwb3NzaWJsZSB0byB0ZWxsIHRoZSBjbGllbnQgdG8gZm9yayBpbnRvIHRoZSBiYWNrZ3JvdW5kIGFmdGVyCit0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQ6CisKKwlzc2ggLWYgc3NoZ2F0ZXdheSB0cnVlCisKK1dpdGhvdXQgdGhlIHNzaCBjb25maWd1cmF0aW9uIGRvbmUgaW4gc3RlcCAoNCksIGl0IGlzIGFsc28gcG9zc2libGUKK3RvIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgbGluZXM6CisKKwlzc2ggLWZ3IDA6MSBzc2hnYXRld2F5IHRydWUKKwlpZmNvbmZpZyB0dW4wIDE5Mi4xNjguNS4xIDE5Mi4xNjguNS4yIG5ldG1hc2sgMjU1LjI1NS4yNTUuMjUyCisKK1VzaW5nIE9wZW5TU0ggdHVubmVsIGZvcndhcmRpbmcgaXMgYSBzaW1wbGUgd2F5IHRvIGVzdGFibGlzaCBzZWN1cmUKK2FuZCBhZCBob2MgdmlydHVhbCBwcml2YXRlIG5ldHdvcmtzLiBQb3NzaWJsZSBmaWVsZHMgb2YgYXBwbGljYXRpb24KK2NvdWxkIGJlIHdpcmVsZXNzIG5ldHdvcmtzIG9yIGFkbWluaXN0cmF0aXZlIFZQTiB0dW5uZWxzLgorCitOZXZlcnRoZWxlc3MsIHNzaCB0dW5uZWxpbmcgcmVxdWlyZXMgc29tZSBwYWNrZXQgaGVhZGVyIG92ZXJoZWFkIGFuZAorcnVucyBvbiB0b3Agb2YgVENQLiBJdCBpcyBzdGlsbCBzdWdnZXN0ZWQgdG8gdXNlIHRoZSBJUCBTZWN1cml0eQorUHJvdG9jb2wgKElQU2VjKSBmb3Igcm9idXN0IGFuZCBwZXJtYW5lbnQgVlBOIGNvbm5lY3Rpb25zIGFuZCB0bworaW50ZXJjb25uZWN0IGNvcnBvcmF0ZSBuZXR3b3Jrcy4KKworCVJleWsgRmxvZXRlcgorCiskT3BlbkJTRDogUkVBRE1FLnR1bix2IDEuNCAyMDA2LzAzLzI4IDAwOjEyOjMxIGRlcmFhZHQgRXhwICQKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvVE9ETyBiL29wZW5zc2gtNi4wcDEvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGFhYTRiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9UT0RPCkBAIC0wLDAgKzEsODYgQEAKK0RvY3VtZW50YXRpb246CisKKy0gVXBkYXRlIHRoZSBkb2NzCisgIC0gVXBkYXRlIFJFQURNRQorICAtIFVwZGF0ZSBJTlNUQUxMCisgIC0gTWVyZ2UgSU5TVEFMTCAmIFJFQURNRS5wcml2c2VwCisKKy0gSW5zdGFsbCBGQVE/CisKKy0gR2VuZXJhbCBGQVEgb24gUy9LZXksIFRJUywgUlNBLCBSU0EyLCBEU0EsIGV0YyBhbmQgc3VnZ2VzdGlvbnMgb24gd2hlbiBpdAorICB3b3VsZCBiZSBiZXN0IHRvIHVzZSB0aGVtLgorCistIENyZWF0ZSBhIERvY3VtZW50YXRpb24vIGRpcmVjdG9yeT8KKworUHJvZ3JhbW1pbmc6CisKKy0gR3JlcCBmb3IgJ1hYWCcgY29tbWVudHMgYW5kIGZpeAorCistIExpbmsgb3JkZXIgaXMgaW5jb3JyZWN0IGZvciBzb21lIHN5c3RlbXMgdXNpbmcgS2VyYmVyb3MgNCBhbmQgQUZTLiBSZXN1bHQKKyAgaXMgbXVsdGlwbGUgaW5jbHVzaW9uIG9mIERFUyBzeW1ib2xzLiBIb2xnZXIgVHJhcHAKKyAgPGhvbGdlci50cmFwcEBocnoudHUtY2hlbW5pdHouZGU+IHJlcG9ydHMgdGhhdCBjaGFuZ2luZyB0aGUgY29uZmlndXJlCisgIGdlbmVyYXRlZCBsaW5rIG9yZGVyIGZyb206CisJLWxyZXNvbHYgLWxrcmIgLWx6IC1sbnNsICAtbHV0aWwgLWxrYWZzIC1sa3JiIC1sZGVzIC1sY3J5cHRvCisgIHRvOgorCS1scmVzb2x2IC1sa3JiIC1seiAtbG5zbCAgLWx1dGlsIC1sY3J5cHRvIC1sa2FmcyAtbGtyYiAtbGRlcworICBmaXhpbmcgdGhlIHByb2JsZW0uCisKKy0gV3JpdGUgYSB0ZXN0IHByb2dyYW0gdGhhdCBjYWxscyBzdGF0KCkgdG8gc2VhcmNoIGZvciBFR0QvUFJOR2Qgc29ja2V0CisgIHJhdGhlciB0aGFuIHVzZSB0aGUgKG5vbi1wb3J0YWJsZSkgInRlc3QgLVMiLgorCistIE1vcmUgcGxhdGZvcm1zIGZvciBmb3Igc2V0cHJvY3RpdGxlKCkgZW11bGF0aW9uICh0ZXN0aW5nIG5lZWRlZCkKKworLSBJbXByb3ZlIFBBTSBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uCisgLSBJbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCisgLSBVc2UgZGlmZmVyZW50IFBBTSBzZXJ2aWNlIG5hbWUgZm9yIGtiZGludCB2cyByZWd1bGFyIGF1dGggKHN1Z2dlc3QgZnJvbQorICAgU29sYXIgRGVzaWduZXIpCisgLSBBYmlsaXR5IHRvIHNlbGVjdCB3aGljaCBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9ucyBtYXkgYmUgdXNlZAorICAgYW5kIG9yZGVyIHRvIHRyeSB0aGVtIGluIGUuZy4gIkNoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24gc2tleSwgcGFtIgorCistIENvbXBsZXRlIFRydTY0IFNJQSBzdXBwb3J0CisgLSBJdCBsb29rcyBsaWtlIHdlIGNvdWxkIG1lcmdlIGl0IGludG8gdGhlIHBhc3N3b3JkIGF1dGggY29kZSB0byBjdXQgZG93bgorICAgb24gZGlmZiBzaXplLiBNYXliZSBQQU0gcGFzc3dvcmQgYXV0aCB0b28/CisKKy0gRmluaXNoIGludGVncmF0aW5nIGtlcm5lbC1sZXZlbCBhdWRpdGluZyBjb2RlIGZvciBJUklYIGFuZCBTT0xBUklTCisgIChHaWxiZXJ0LnIubG9vbWlzQHNhaWMuY29tKQorCistIDY0LWJpdCBidWlsZHMgb24gSFAtVVggMTEuWCAoc3RldmVza0Bwb2JveC5jb20pOgorICAtIHV0bXAvd3RtcCBnZXQgY29ycnVwdGVkIChzb21ldGhpbmcgaW4gbG9naW5yZWM/KQorICAtIGNhbid0IGJ1aWxkIHdpdGggUEFNIChubyA2NC1iaXQgbGlicGFtIHlldCkKKworQ2xlYW4gdXAgY29uZmlndXJlL21ha2VmaWxlczoKKy0gQ2xlYW4gdXAgY29uZmlndXJlLmFjIC0gVGhlcmUgYXJlIGEgZmV3IGRvdWJsZSAjZGVmaW5lZCB2YXJpYWJsZXMKKyAgbGVmdCB0byBkby4gIEhBVkVfTE9HSU4gaXMgb25lIG9mIHRoZW0uICBDb25zaWRlciBOT1QgbG9va2luZyBmb3IKKyAgaW5mb3JtYXRpb24gaW4gd3RtcHggb3IgdXRtcHggb3IgYW55IG9mIHRoYXQgc3R1ZmYgaWYgaXQncyBub3QgZGV0ZWN0ZWQKKyAgZnJvbSB0aGUgc3RhcnQKKworLSBSZXBsYWNlIHRoZSB3aG9sZSB1X2ludFhYX3QgZXZpbG5lc3MgaW4gYWNjb25maWcuaCB3aXRoIHNvbWV0aGluZyBiZXR0ZXI/Pz8KKyAtIERvIGl0IGluIGNvbmZpZ3VyZS5hYworCistIENvbnNpZGVyIHNwbGl0dGluZyB0aGUgdV9pbnRYWF90IHRlc3QgZm9yIHN5cy9iaXR5cGUuaCAgaW50byBzZXBlcmF0ZSB0ZXN0CisgIHRvIGFsbG93IHBlb3BsZSB0byAocmlnaHQvd3JvbmdmdWxseSkgbGluayBhZ2FpbnN0IEJpbmQgZGlyZWN0bHkuCisKKy0gQ29uc2lkZXIgc3BsaXR0aW5nIGNvbmZpZ3VyZS5hYyBpbnRvIHNlcGVyYXRlIGZpbGVzIHdoaWNoIGRvIGxvZ2ljYWxseQorICBzaW1pbGFyIHRlc3RzLiBFLmcgbW92ZSBhbGwgdGhlIHR5cGUgZGV0ZWN0aW9uIHN0dWZmIGludG8gb25lIGZpbGUsCisgIGVudHJvcHkgcmVsYXRlZCBzdHVmZiBpbnRvIGFub3RoZXIuCisKK1BhY2thZ2luZzoKKy0gSFAtVVg6IFByb3ZpZGUgREVQT1QgcGFja2FnZSBzY3JpcHRzLgorICAoZ2lsYmVydC5yLmxvb21pc0BzYWljLmNvbSkKKworUHJpdlNlcCBJc3N1ZXM6CistIG1tYXAoKSBpc3N1ZXMuCisgICsgL2Rldi96ZXJvIHNvbHV0aW9uIChTb2xhcmlzKQorICArIE5vL2Jyb2tlbiBNQVBfQU5PTiAoSXJpeCkKKyAgKyBicm9rZW4gL2Rldi96ZXJvIHBhcnNlIChMaW51eCkKKy0gUEFNCisgICsgU2VlIGFib3ZlIFBBTSBub3RlcworLSBBSVgKKyAgKyB1c3JpbmZvKCkgZG9lcyBub3Qgc2V0IFRUWSwgYnV0IG9ubHkgcmVxdWlyZWQgZm9yIGxlZ2FjeSBzeXN0ZW1zLiAgV29ya3MKKyAgICB3aXRoIFByaXZTZXAuCistIE9TRgorICArIFNJQSBpcyBicm9rZW4KKy0gQ3lnd2luCisgICsgUHJpdnNlcCBmb3IgUHJlLWF1dGggb25seSAobm8gZmQgcGFzc2luZykKKworJElkOiBUT0RPLHYgMS41OCAyMDA0LzEyLzA2IDExOjQwOjExIGR0dWNrZXIgRXhwICQKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvYWNsb2NhbC5tNCBiL29wZW5zc2gtNi4wcDEvYWNsb2NhbC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmRlYTVlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9hY2xvY2FsLm00CkBAIC0wLDAgKzEsOTQgQEAKK2RubCAkSWQ6IGFjbG9jYWwubTQsdiAxLjggMjAxMS8wNS8yMCAwMTo0NToyNSBkam0gRXhwICQKK2RubAorZG5sIE9wZW5TU0gtc3BlY2lmaWMgYXV0b2NvbmYgbWFjcm9zCitkbmwKKworZG5sIE9TU0hfQ0hFQ0tfQ0ZMQUdfQ09NUElMRShjaGVja19mbGFnWywgZGVmaW5lX2ZsYWddKQorZG5sIENoZWNrIHRoYXQgJENDIGFjY2VwdHMgYSBmbGFnICdjaGVja19mbGFnJy4gSWYgaXQgaXMgc3VwcG9ydGVkIGFwcGVuZAorZG5sICdkZWZpbmVfZmxhZycgdG8gJENGTEFHUy4gSWYgJ2RlZmluZV9mbGFnJyBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGFwcGVuZAorZG5sICdjaGVja19mbGFnJy4KK0FDX0RFRlVOKFtPU1NIX0NIRUNLX0NGTEFHX0NPTVBJTEVdLCBbeworCUFDX01TR19DSEVDS0lORyhbaWYgJENDIHN1cHBvcnRzICQxXSkKKwlzYXZlZF9DRkxBR1M9IiRDRkxBR1MiCisJQ0ZMQUdTPSIkQ0ZMQUdTICQxIgorCV9kZWZpbmVfZmxhZz0iJDIiCisJdGVzdCAieCRfZGVmaW5lX2ZsYWciID0gIngiICYmIF9kZWZpbmVfZmxhZz0iJDEiCisJQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtbaW50IG1haW4odm9pZCkgeyByZXR1cm4gMDsgfV1dKV0sCisJCVsgQUNfTVNHX1JFU1VMVChbeWVzXSkKKwkJICBDRkxBR1M9IiRzYXZlZF9DRkxBR1MgJF9kZWZpbmVfZmxhZyJdLAorCQlbIEFDX01TR19SRVNVTFQoW25vXSkKKwkJICBDRkxBR1M9IiRzYXZlZF9DRkxBR1MiIF0KKwkpCit9XSkKKworCitkbmwgT1NTSF9DSEVDS19IRUFERVJfRk9SX0ZJRUxEKGZpZWxkLCBoZWFkZXIsIHN5bWJvbCkKK2RubCBEb2VzIEFDX0VHUkVQX0hFQURFUiBvbiAnaGVhZGVyJyBmb3IgdGhlIHN0cmluZyAnZmllbGQnCitkbmwgSWYgZm91bmQsIHNldCAnc3ltYm9sJyB0byBiZSBkZWZpbmVkLiBDYWNoZSB0aGUgcmVzdWx0LgorZG5sIFRPRE86IFRoaXMgaXMgbm90IGZvb2xwcm9vZiwgYmV0dGVyIHRvIGNvbXBpbGUgYW5kIHJlYWQgZnJvbSB0aGVyZQorQUNfREVGVU4oT1NTSF9DSEVDS19IRUFERVJfRk9SX0ZJRUxELCBbCisjIGxvb2sgZm9yIGZpZWxkICckMScgaW4gaGVhZGVyICckMicKKwlkbmwgVGhpcyBzdHJpcHMgY2hhcmFjdGVycyBpbGxlZ2FsIHRvIG00IGZyb20gdGhlIGhlYWRlciBmaWxlbmFtZQorCW9zc2hfc2FmZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorCWRubAorCW9zc2hfdmFybmFtZT0ib3NzaF9jdl8kb3NzaF9zYWZlIiJfaGFzXyIkMQorCUFDX01TR19DSEVDS0lORyhmb3IgJDEgZmllbGQgaW4gJDIpCisJQUNfQ0FDSEVfVkFMKCRvc3NoX3Zhcm5hbWUsIFsKKwkJQUNfRUdSRVBfSEVBREVSKCQxLCAkMiwgWyBkbmwKKwkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9eWVzIiBkbmwKKwkJXSwgWyBkbmwKKwkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9bm8iIGRubAorCQldKSBkbmwKKwldKQorCW9zc2hfcmVzdWx0PWBldmFsICdlY2hvICQnIiRvc3NoX3Zhcm5hbWUiYAorCWlmIHRlc3QgLW4gImBlY2hvICRvc3NoX3Zhcm5hbWVgIjsgdGhlbgorCQlBQ19NU0dfUkVTVUxUKCRvc3NoX3Jlc3VsdCkKKwkJaWYgdGVzdCAieCRvc3NoX3Jlc3VsdCIgPSAieHllcyI7IHRoZW4KKwkJCUFDX0RFRklORSgkMywgMSwgW0RlZmluZSBpZiB5b3UgaGF2ZSAkMSBpbiAkMl0pCisJCWZpCisJZWxzZQorCQlBQ19NU0dfUkVTVUxUKG5vKQorCWZpCitdKQorCitkbmwgQ2hlY2sgZm9yIHNvY2tsZW5fdDogaGlzdG9yaWNhbGx5IG9uIEJTRCBpdCBpcyBhbiBpbnQsIGFuZCBpbgorZG5sIFBPU0lYIDFnIGl0IGlzIGEgdHlwZSBvZiBpdHMgb3duLCBidXQgc29tZSBwbGF0Zm9ybXMgdXNlIGRpZmZlcmVudAorZG5sIHR5cGVzIGZvciB0aGUgYXJndW1lbnQgdG8gZ2V0c29ja29wdCwgZ2V0cGVlcm5hbWUsIGV0Yy4gIFNvIHdlCitkbmwgaGF2ZSB0byB0ZXN0IHRvIGZpbmQgc29tZXRoaW5nIHRoYXQgd2lsbCB3b3JrLgorQUNfREVGVU4oW1RZUEVfU09DS0xFTl9UXSwKK1sKKyAgIEFDX0NIRUNLX1RZUEUoW3NvY2tsZW5fdF0sICxbCisgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzb2NrbGVuX3QgZXF1aXZhbGVudF0pCisgICAgICBBQ19DQUNIRV9WQUwoW2N1cmxfY3Zfc29ja2xlbl90X2VxdWl2XSwKKyAgICAgIFsKKwkgIyBTeXN0ZW1zIGhhdmUgZWl0aGVyICJzdHJ1Y3Qgc29ja2FkZHIgKiIgb3IKKwkgIyAidm9pZCAqIiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGdldHBlZXJuYW1lCisJIGN1cmxfY3Zfc29ja2xlbl90X2VxdWl2PQorCSBmb3IgYXJnMiBpbiAic3RydWN0IHNvY2thZGRyIiB2b2lkOyBkbworCSAgICBmb3IgdCBpbiBpbnQgc2l6ZV90IHVuc2lnbmVkIGxvbmcgInVuc2lnbmVkIGxvbmciOyBkbworCSAgICAgICBBQ19UUllfQ09NUElMRShbCisJCSAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCQkgICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKwkJICBpbnQgZ2V0cGVlcm5hbWUgKGludCwgJGFyZzIgKiwgJHQgKik7CisJICAgICAgIF0sWworCQkgICR0IGxlbjsKKwkJICBnZXRwZWVybmFtZSgwLDAsJmxlbik7CisJICAgICAgIF0sWworCQkgIGN1cmxfY3Zfc29ja2xlbl90X2VxdWl2PSIkdCIKKwkJICBicmVhaworCSAgICAgICBdKQorCSAgICBkb25lCisJIGRvbmUKKworCSBpZiB0ZXN0ICJ4JGN1cmxfY3Zfc29ja2xlbl90X2VxdWl2IiA9IHg7IHRoZW4KKwkgICAgQUNfTVNHX0VSUk9SKFtDYW5ub3QgZmluZCBhIHR5cGUgdG8gdXNlIGluIHBsYWNlIG9mIHNvY2tsZW5fdF0pCisJIGZpCisgICAgICBdKQorICAgICAgQUNfTVNHX1JFU1VMVCgkY3VybF9jdl9zb2NrbGVuX3RfZXF1aXYpCisgICAgICBBQ19ERUZJTkVfVU5RVU9URUQoc29ja2xlbl90LCAkY3VybF9jdl9zb2NrbGVuX3RfZXF1aXYsCisJCQlbdHlwZSB0byB1c2UgaW4gcGxhY2Ugb2Ygc29ja2xlbl90IGlmIG5vdCBkZWZpbmVkXSldLAorICAgICAgWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+XSkKK10pCisKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvYWNzcy5jIGIvb3BlbnNzaC02LjBwMS9hY3NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZlMmMwMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvYWNzcy5jCkBAIC0wLDAgKzEsMjY3IEBACisvKgkkSWQ6IGFjc3MuYyx2IDEuNCAyMDA2LzA3LzI0IDA0OjUxOjAxIGRqbSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBUaGUgT3BlbkJTRCBwcm9qZWN0CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisKKyNpZiAhZGVmaW5lZChFVlBfQ1RSTF9TRVRfQUNTU19NT0RFKSAmJiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDAwOTA2MDAwTCkKKworI2luY2x1ZGUgImFjc3MuaCIKKworLyogZGVjcnlwdGlvbiBzYm94ICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBzYm94ZGVjW10gPSB7CisJMHgzMywgMHg3MywgMHgzYiwgMHgyNiwgMHg2MywgMHgyMywgMHg2YiwgMHg3NiwKKwkweDNlLCAweDdlLCAweDM2LCAweDJiLCAweDZlLCAweDJlLCAweDY2LCAweDdiLAorCTB4ZDMsIDB4OTMsIDB4ZGIsIDB4MDYsIDB4NDMsIDB4MDMsIDB4NGIsIDB4OTYsCisJMHhkZSwgMHg5ZSwgMHhkNiwgMHgwYiwgMHg0ZSwgMHgwZSwgMHg0NiwgMHg5YiwKKwkweDU3LCAweDE3LCAweDVmLCAweDgyLCAweGM3LCAweDg3LCAweGNmLCAweDEyLAorCTB4NWEsIDB4MWEsIDB4NTIsIDB4OGYsIDB4Y2EsIDB4OGEsIDB4YzIsIDB4MWYsCisJMHhkOSwgMHg5OSwgMHhkMSwgMHgwMCwgMHg0OSwgMHgwOSwgMHg0MSwgMHg5MCwKKwkweGQ4LCAweDk4LCAweGQwLCAweDAxLCAweDQ4LCAweDA4LCAweDQwLCAweDkxLAorCTB4M2QsIDB4N2QsIDB4MzUsIDB4MjQsIDB4NmQsIDB4MmQsIDB4NjUsIDB4NzQsCisJMHgzYywgMHg3YywgMHgzNCwgMHgyNSwgMHg2YywgMHgyYywgMHg2NCwgMHg3NSwKKwkweGRkLCAweDlkLCAweGQ1LCAweDA0LCAweDRkLCAweDBkLCAweDQ1LCAweDk0LAorCTB4ZGMsIDB4OWMsIDB4ZDQsIDB4MDUsIDB4NGMsIDB4MGMsIDB4NDQsIDB4OTUsCisJMHg1OSwgMHgxOSwgMHg1MSwgMHg4MCwgMHhjOSwgMHg4OSwgMHhjMSwgMHgxMCwKKwkweDU4LCAweDE4LCAweDUwLCAweDgxLCAweGM4LCAweDg4LCAweGMwLCAweDExLAorCTB4ZDcsIDB4OTcsIDB4ZGYsIDB4MDIsIDB4NDcsIDB4MDcsIDB4NGYsIDB4OTIsCisJMHhkYSwgMHg5YSwgMHhkMiwgMHgwZiwgMHg0YSwgMHgwYSwgMHg0MiwgMHg5ZiwKKwkweDUzLCAweDEzLCAweDViLCAweDg2LCAweGMzLCAweDgzLCAweGNiLCAweDE2LAorCTB4NWUsIDB4MWUsIDB4NTYsIDB4OGIsIDB4Y2UsIDB4OGUsIDB4YzYsIDB4MWIsCisJMHhiMywgMHhmMywgMHhiYiwgMHhhNiwgMHhlMywgMHhhMywgMHhlYiwgMHhmNiwKKwkweGJlLCAweGZlLCAweGI2LCAweGFiLCAweGVlLCAweGFlLCAweGU2LCAweGZiLAorCTB4MzcsIDB4NzcsIDB4M2YsIDB4MjIsIDB4NjcsIDB4MjcsIDB4NmYsIDB4NzIsCisJMHgzYSwgMHg3YSwgMHgzMiwgMHgyZiwgMHg2YSwgMHgyYSwgMHg2MiwgMHg3ZiwKKwkweGI5LCAweGY5LCAweGIxLCAweGEwLCAweGU5LCAweGE5LCAweGUxLCAweGYwLAorCTB4YjgsIDB4ZjgsIDB4YjAsIDB4YTEsIDB4ZTgsIDB4YTgsIDB4ZTAsIDB4ZjEsCisJMHg1ZCwgMHgxZCwgMHg1NSwgMHg4NCwgMHhjZCwgMHg4ZCwgMHhjNSwgMHgxNCwKKwkweDVjLCAweDFjLCAweDU0LCAweDg1LCAweGNjLCAweDhjLCAweGM0LCAweDE1LAorCTB4YmQsIDB4ZmQsIDB4YjUsIDB4YTQsIDB4ZWQsIDB4YWQsIDB4ZTUsIDB4ZjQsCisJMHhiYywgMHhmYywgMHhiNCwgMHhhNSwgMHhlYywgMHhhYywgMHhlNCwgMHhmNSwKKwkweDM5LCAweDc5LCAweDMxLCAweDIwLCAweDY5LCAweDI5LCAweDYxLCAweDcwLAorCTB4MzgsIDB4NzgsIDB4MzAsIDB4MjEsIDB4NjgsIDB4MjgsIDB4NjAsIDB4NzEsCisJMHhiNywgMHhmNywgMHhiZiwgMHhhMiwgMHhlNywgMHhhNywgMHhlZiwgMHhmMiwKKwkweGJhLCAweGZhLCAweGIyLCAweGFmLCAweGVhLCAweGFhLCAweGUyLCAweGZmCit9OworCisvKiBlbmNyeXB0aW9uIHNib3ggKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNib3hlbmNbXSA9IHsKKwkweDMzLCAweDNiLCAweDczLCAweDE1LCAweDUzLCAweDViLCAweDEzLCAweDc1LAorCTB4M2QsIDB4MzUsIDB4N2QsIDB4MWIsIDB4NWQsIDB4NTUsIDB4MWQsIDB4N2IsCisJMHg2NywgMHg2ZiwgMHgyNywgMHg4MSwgMHhjNywgMHhjZiwgMHg4NywgMHgyMSwKKwkweDY5LCAweDYxLCAweDI5LCAweDhmLCAweGM5LCAweGMxLCAweDg5LCAweDJmLAorCTB4ZTMsIDB4ZWIsIDB4YTMsIDB4MDUsIDB4NDMsIDB4NGIsIDB4MDMsIDB4YTUsCisJMHhlZCwgMHhlNSwgMHhhZCwgMHgwYiwgMHg0ZCwgMHg0NSwgMHgwZCwgMHhhYiwKKwkweGVhLCAweGUyLCAweGFhLCAweDAwLCAweDRhLCAweDQyLCAweDBhLCAweGEwLAorCTB4ZTgsIDB4ZTAsIDB4YTgsIDB4MDIsIDB4NDgsIDB4NDAsIDB4MDgsIDB4YTIsCisJMHgzZSwgMHgzNiwgMHg3ZSwgMHgxNCwgMHg1ZSwgMHg1NiwgMHgxZSwgMHg3NCwKKwkweDNjLCAweDM0LCAweDdjLCAweDE2LCAweDVjLCAweDU0LCAweDFjLCAweDc2LAorCTB4NmEsIDB4NjIsIDB4MmEsIDB4ODAsIDB4Y2EsIDB4YzIsIDB4OGEsIDB4MjAsCisJMHg2OCwgMHg2MCwgMHgyOCwgMHg4MiwgMHhjOCwgMHhjMCwgMHg4OCwgMHgyMiwKKwkweGVlLCAweGU2LCAweGFlLCAweDA0LCAweDRlLCAweDQ2LCAweDBlLCAweGE0LAorCTB4ZWMsIDB4ZTQsIDB4YWMsIDB4MDYsIDB4NGMsIDB4NDQsIDB4MGMsIDB4YTYsCisJMHhlNywgMHhlZiwgMHhhNywgMHgwMSwgMHg0NywgMHg0ZiwgMHgwNywgMHhhMSwKKwkweGU5LCAweGUxLCAweGE5LCAweDBmLCAweDQ5LCAweDQxLCAweDA5LCAweGFmLAorCTB4NjMsIDB4NmIsIDB4MjMsIDB4ODUsIDB4YzMsIDB4Y2IsIDB4ODMsIDB4MjUsCisJMHg2ZCwgMHg2NSwgMHgyZCwgMHg4YiwgMHhjZCwgMHhjNSwgMHg4ZCwgMHgyYiwKKwkweDM3LCAweDNmLCAweDc3LCAweDExLCAweDU3LCAweDVmLCAweDE3LCAweDcxLAorCTB4MzksIDB4MzEsIDB4NzksIDB4MWYsIDB4NTksIDB4NTEsIDB4MTksIDB4N2YsCisJMHhiMywgMHhiYiwgMHhmMywgMHg5NSwgMHhkMywgMHhkYiwgMHg5MywgMHhmNSwKKwkweGJkLCAweGI1LCAweGZkLCAweDliLCAweGRkLCAweGQ1LCAweDlkLCAweGZiLAorCTB4YmEsIDB4YjIsIDB4ZmEsIDB4OTAsIDB4ZGEsIDB4ZDIsIDB4OWEsIDB4ZjAsCisJMHhiOCwgMHhiMCwgMHhmOCwgMHg5MiwgMHhkOCwgMHhkMCwgMHg5OCwgMHhmMiwKKwkweDZlLCAweDY2LCAweDJlLCAweDg0LCAweGNlLCAweGM2LCAweDhlLCAweDI0LAorCTB4NmMsIDB4NjQsIDB4MmMsIDB4ODYsIDB4Y2MsIDB4YzQsIDB4OGMsIDB4MjYsCisJMHgzYSwgMHgzMiwgMHg3YSwgMHgxMCwgMHg1YSwgMHg1MiwgMHgxYSwgMHg3MCwKKwkweDM4LCAweDMwLCAweDc4LCAweDEyLCAweDU4LCAweDUwLCAweDE4LCAweDcyLAorCTB4YmUsIDB4YjYsIDB4ZmUsIDB4OTQsIDB4ZGUsIDB4ZDYsIDB4OWUsIDB4ZjQsCisJMHhiYywgMHhiNCwgMHhmYywgMHg5NiwgMHhkYywgMHhkNCwgMHg5YywgMHhmNiwKKwkweGI3LCAweGJmLCAweGY3LCAweDkxLCAweGQ3LCAweGRmLCAweDk3LCAweGYxLAorCTB4YjksIDB4YjEsIDB4ZjksIDB4OWYsIDB4ZDksIDB4ZDEsIDB4OTksIDB4ZmYKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJldmVyc2VbXSA9IHsKKwkweDAwLCAweDgwLCAweDQwLCAweGMwLCAweDIwLCAweGEwLCAweDYwLCAweGUwLAorCTB4MTAsIDB4OTAsIDB4NTAsIDB4ZDAsIDB4MzAsIDB4YjAsIDB4NzAsIDB4ZjAsCisJMHgwOCwgMHg4OCwgMHg0OCwgMHhjOCwgMHgyOCwgMHhhOCwgMHg2OCwgMHhlOCwKKwkweDE4LCAweDk4LCAweDU4LCAweGQ4LCAweDM4LCAweGI4LCAweDc4LCAweGY4LAorCTB4MDQsIDB4ODQsIDB4NDQsIDB4YzQsIDB4MjQsIDB4YTQsIDB4NjQsIDB4ZTQsCisJMHgxNCwgMHg5NCwgMHg1NCwgMHhkNCwgMHgzNCwgMHhiNCwgMHg3NCwgMHhmNCwKKwkweDBjLCAweDhjLCAweDRjLCAweGNjLCAweDJjLCAweGFjLCAweDZjLCAweGVjLAorCTB4MWMsIDB4OWMsIDB4NWMsIDB4ZGMsIDB4M2MsIDB4YmMsIDB4N2MsIDB4ZmMsCisJMHgwMiwgMHg4MiwgMHg0MiwgMHhjMiwgMHgyMiwgMHhhMiwgMHg2MiwgMHhlMiwKKwkweDEyLCAweDkyLCAweDUyLCAweGQyLCAweDMyLCAweGIyLCAweDcyLCAweGYyLAorCTB4MGEsIDB4OGEsIDB4NGEsIDB4Y2EsIDB4MmEsIDB4YWEsIDB4NmEsIDB4ZWEsCisJMHgxYSwgMHg5YSwgMHg1YSwgMHhkYSwgMHgzYSwgMHhiYSwgMHg3YSwgMHhmYSwKKwkweDA2LCAweDg2LCAweDQ2LCAweGM2LCAweDI2LCAweGE2LCAweDY2LCAweGU2LAorCTB4MTYsIDB4OTYsIDB4NTYsIDB4ZDYsIDB4MzYsIDB4YjYsIDB4NzYsIDB4ZjYsCisJMHgwZSwgMHg4ZSwgMHg0ZSwgMHhjZSwgMHgyZSwgMHhhZSwgMHg2ZSwgMHhlZSwKKwkweDFlLCAweDllLCAweDVlLCAweGRlLCAweDNlLCAweGJlLCAweDdlLCAweGZlLAorCTB4MDEsIDB4ODEsIDB4NDEsIDB4YzEsIDB4MjEsIDB4YTEsIDB4NjEsIDB4ZTEsCisJMHgxMSwgMHg5MSwgMHg1MSwgMHhkMSwgMHgzMSwgMHhiMSwgMHg3MSwgMHhmMSwKKwkweDA5LCAweDg5LCAweDQ5LCAweGM5LCAweDI5LCAweGE5LCAweDY5LCAweGU5LAorCTB4MTksIDB4OTksIDB4NTksIDB4ZDksIDB4MzksIDB4YjksIDB4NzksIDB4ZjksCisJMHgwNSwgMHg4NSwgMHg0NSwgMHhjNSwgMHgyNSwgMHhhNSwgMHg2NSwgMHhlNSwKKwkweDE1LCAweDk1LCAweDU1LCAweGQ1LCAweDM1LCAweGI1LCAweDc1LCAweGY1LAorCTB4MGQsIDB4OGQsIDB4NGQsIDB4Y2QsIDB4MmQsIDB4YWQsIDB4NmQsIDB4ZWQsCisJMHgxZCwgMHg5ZCwgMHg1ZCwgMHhkZCwgMHgzZCwgMHhiZCwgMHg3ZCwgMHhmZCwKKwkweDAzLCAweDgzLCAweDQzLCAweGMzLCAweDIzLCAweGEzLCAweDYzLCAweGUzLAorCTB4MTMsIDB4OTMsIDB4NTMsIDB4ZDMsIDB4MzMsIDB4YjMsIDB4NzMsIDB4ZjMsCisJMHgwYiwgMHg4YiwgMHg0YiwgMHhjYiwgMHgyYiwgMHhhYiwgMHg2YiwgMHhlYiwKKwkweDFiLCAweDliLCAweDViLCAweGRiLCAweDNiLCAweGJiLCAweDdiLCAweGZiLAorCTB4MDcsIDB4ODcsIDB4NDcsIDB4YzcsIDB4MjcsIDB4YTcsIDB4NjcsIDB4ZTcsCisJMHgxNywgMHg5NywgMHg1NywgMHhkNywgMHgzNywgMHhiNywgMHg3NywgMHhmNywKKwkweDBmLCAweDhmLCAweDRmLCAweGNmLCAweDJmLCAweGFmLCAweDZmLCAweGVmLAorCTB4MWYsIDB4OWYsIDB4NWYsIDB4ZGYsIDB4M2YsIDB4YmYsIDB4N2YsIDB4ZmYKK307CisKKy8qCisgKiBUd28gbGluZWFyIGZlZWRiYWNrIHNoaWZ0IHJlZ2lzdGVycyBhcmUgdXNlZDoKKyAqCisgKiBsZnNyMTc6ICBwb2x5bm9taWFsIG9mIGRlZ3JlZSAxNywgcHJpbWl0aXZlIG1vZHVsbyAyIChsaXN0ZWQgaW4gU2NobmVpZXIpCisgKiAgICAgICAgICB4XjE1ICsgeCArIDEKKyAqIGxmc3IyNTogIHBvbHlub21pYWwgb2YgZGVncmVlIDI1LCBub3Qga25vdyBpZiBwcmltaXRpdmUgbW9kdWxvIDIKKyAqICAgICAgICAgIHheMTMgKyB4XjUgKyB4XjQgKyB4XjEgKyAxCisgKgorICogT3V0cHV0IGJpdHMgYXJlIGRpc2NhcmRlZCwgaW5zdGVhZCB0aGUgZmVlZGJhY2sgYml0cyBhcmUgYWRkZWQgdG8gcHJvZHVjZQorICogdGhlIGNpcGhlciBzdHJlYW0uICBEZXBlbmRpbmcgb24gdGhlIG1vZGUsIGZlZWRiYWNrIGJ5dGVzIG1heSBiZSBpbnZlcnRlZAorICogYml0LXdpc2UgYmVmb3JlIGFkZGl0aW9uLgorICoKKyAqIFRoZSBsZnNycyBhcmUgc2VlZGVkIHdpdGggYnl0ZXMgZnJvbSB0aGUgcmF3IGtleToKKyAqCisgKiBsZnNyMTc6ICBieXRlIDBbMDo3XSBhdCBiaXQgOQorICogICAgICAgICAgYnl0ZSAxWzA6N10gYXQgYml0IDAKKyAqCisgKiBsZnNyMjU6ICBieXRlIDJbMDo0XSBhdCBiaXQgMTYKKyAqICAgICAgICAgIGJ5dGUgMls1OjddIGF0IGJpdCAyMgorICogICAgICAgICAgYnl0ZSAzWzA6N10gYXQgYml0IDgKKyAqICAgICAgICAgIGJ5dGUgNFswOjddIGF0IGJpdCAwCisgKgorICogVG8gcHJldmVudCAwIGN5Y2xlcywgMSdzIGFyZSBpbmplY3QgYXQgYml0IDggaW4gbGZyczE3IGFuZCBiaXQgMjEgaW4KKyAqIGxmc3IyNS4KKyAqCisgKi8KKworaW50CithY3NzKEFDU1NfS0VZICprZXksIHVuc2lnbmVkIGxvbmcgbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwKKyAgICB1bnNpZ25lZCBjaGFyICpvdXQpCit7CisJdW5zaWduZWQgbG9uZyBpOworCXVuc2lnbmVkIGxvbmcgbGZzcjE3dG1wLCBsZnNyMjV0bXAsIGxmc3JzdW10bXA7CisKKwlsZnNyc3VtdG1wID0gbGZzcjE3dG1wID0gbGZzcjI1dG1wID0gMDsKKworCS8qIGtleXN0cmVhbSBpcyBzdW0gb2YgbGZzcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJbGZzcjE3dG1wID0ga2V5LT5sZnNyMTcgXiAoa2V5LT5sZnNyMTcgPj4gMTQpOworCQlrZXktPmxmc3IxNyA9IChrZXktPmxmc3IxNyA+PiA4KQorCQkJXiAobGZzcjE3dG1wIDw8IDkpCisJCQleIChsZnNyMTd0bXAgPDwgMTIpCisJCQleIChsZnNyMTd0bXAgPDwgMTUpOworCQlrZXktPmxmc3IxNyAmPSAweDFmZmZmOwkvKiAxNyBiaXQgTEZTUiAqLworCisJCWxmc3IyNXRtcCA9IGtleS0+bGZzcjI1CisJCQleIChrZXktPmxmc3IyNSA+PiAzKQorCQkJXiAoa2V5LT5sZnNyMjUgPj4gNCkKKwkJCV4gKGtleS0+bGZzcjI1ID4+IDEyKTsKKwkJa2V5LT5sZnNyMjUgPSAoa2V5LT5sZnNyMjUgPj4gOCkgXiAobGZzcjI1dG1wIDw8IDE3KTsKKwkJa2V5LT5sZnNyMjUgJj0gMHgxZmZmZmZmOwkvKiAyNSBiaXQgTEZTUiAqLworCisJCWxmc3JzdW10bXAgPSBrZXktPmxmc3JzdW07CisKKwkJLyogYWRkaXRpb24gKi8KKwkJc3dpdGNoIChrZXktPm1vZGUpIHsKKwkJY2FzZSBBQ1NTX0FVVEhFTlRJQ0FURToKKwkJY2FzZSBBQ1NTX0RBVEE6CisJCQlrZXktPmxmc3JzdW0gPSAweGZmICYgfihrZXktPmxmc3IxNyA+PiA5KTsKKwkJCWtleS0+bGZzcnN1bSArPSBrZXktPmxmc3IyNSA+PiAxNzsKKwkJCWJyZWFrOworCQljYXNlIEFDU1NfU0VTU0lPTktFWToKKwkJCWtleS0+bGZzcnN1bSA9IGtleS0+bGZzcjE3ID4+IDk7CisJCQlrZXktPmxmc3JzdW0gKz0ga2V5LT5sZnNyMjUgPj4gMTc7CisJCQlicmVhazsKKwkJY2FzZSBBQ1NTX1RJVExFS0VZOgorCQkJa2V5LT5sZnNyc3VtID0ga2V5LT5sZnNyMTcgPj4gOTsKKwkJCWtleS0+bGZzcnN1bSArPSAweGZmICYgfihrZXktPmxmc3IyNSA+PiAxNyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAxOworCQl9CisJCWtleS0+bGZzcnN1bSArPSAobGZzcnN1bXRtcCA+PiA4KTsKKworCQlpZiAoa2V5LT5lbmNyeXB0KSB7CisJCQlvdXRbaV0gPSBzYm94ZW5jWyhpbltpXSBeIGtleS0+bGZzcnN1bSkgJiAweGZmXTsKKwkJfSBlbHNlIHsKKwkJCW91dFtpXSA9IChzYm94ZGVjW2luW2ldXSBeIGtleS0+bGZzcnN1bSkgJiAweGZmOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCithY3NzX3NlZWQoQUNTU19LRVkgKmtleSkKK3sKKwlpbnQgaTsKKworCS8qIGlmIGF2YWlsYWJsZSwgbWFuZ2xlIHdpdGggc3Via2V5ICovCisJaWYgKGtleS0+c3Via2V5X2F2aWxhYmxlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBQ1NTX0tFWVNJWkU7IGkrKykKKwkJCWtleS0+c2VlZFtpXSA9IHJldmVyc2Vba2V5LT5kYXRhW2ldIF4ga2V5LT5zdWJrZXlbaV1dOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBBQ1NTX0tFWVNJWkU7IGkrKykKKwkJCWtleS0+c2VlZFtpXSA9IHJldmVyc2Vba2V5LT5kYXRhW2ldXTsKKwl9CisKKwkvKiBzZWVkIGxmc3JzICovCisJa2V5LT5sZnNyMTcgPSBrZXktPnNlZWRbMV0KKwkJfCAoa2V5LT5zZWVkWzBdIDw8IDkpCisJCXwgKDEgPDwgOCk7CS8qIGluamVjdCAxIGF0IGJpdCA5ICovCisJa2V5LT5sZnNyMjUgPSBrZXktPnNlZWRbNF0KKwkJfCAoa2V5LT5zZWVkWzNdIDw8IDgpCisJCXwgKChrZXktPnNlZWRbMl0gJiAweDFmKSA8PCAxNikKKwkJfCAoKGtleS0+c2VlZFsyXSAmIDB4ZTApIDw8IDE3KQorCQkJfCAoMSA8PCAyMSk7CS8qIGluamVjdCAxIGF0IGJpdCAyMiAqLworCisJa2V5LT5sZnNyc3VtID0gMDsKK30KKwordm9pZAorYWNzc19zZXRrZXkoQUNTU19LRVkgKmtleSwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGVuYywgaW50IG1vZGUpCit7CisJbWVtY3B5KGtleS0+ZGF0YSwgZGF0YSwgc2l6ZW9mKGtleS0+ZGF0YSkpOworCW1lbXNldChrZXktPnN1YmtleSwgMCwgc2l6ZW9mKGtleS0+c3Via2V5KSk7CisKKwlpZiAoZW5jICE9IC0xKQorCQlrZXktPmVuY3J5cHQgPSBlbmM7CisJa2V5LT5tb2RlID0gbW9kZTsKKwlrZXktPnN1YmtleV9hdmlsYWJsZSA9IDA7CisKKwlhY3NzX3NlZWQoa2V5KTsKK30KKwordm9pZAorYWNzc19zZXRzdWJrZXkoQUNTU19LRVkgKmtleSwgY29uc3QgdW5zaWduZWQgY2hhciAqc3Via2V5KQoreworCW1lbWNweShrZXktPnN1YmtleSwgc3Via2V5LCBzaXplb2Yoa2V5LT5zdWJrZXkpKTsKKwlrZXktPnN1YmtleV9hdmlsYWJsZSA9IDE7CisJYWNzc19zZWVkKGtleSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvYWNzcy5oIGIvb3BlbnNzaC02LjBwMS9hY3NzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFiNDg5NQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvYWNzcy5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCSRJZDogYWNzcy5oLHYgMS4yIDIwMDQvMDIvMDYgMDQ6MjI6NDMgZHR1Y2tlciBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBUaGUgT3BlbkJTRCBwcm9qZWN0CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfQUNTU19IXworI2RlZmluZSBfQUNTU19IXworCisvKiA0MGJpdCBrZXkgKi8KKyNkZWZpbmUgQUNTU19LRVlTSVpFCQk1CisKKy8qIG1vZGVzIG9mIGFjc3MgKi8KKyNkZWZpbmUgQUNTU19BVVRIRU5USUNBVEUJMAorI2RlZmluZSBBQ1NTX1NFU1NJT05LRVkJCTEKKyNkZWZpbmUgQUNTU19USVRMRUtFWQkJMgorI2RlZmluZSBBQ1NTX0RBVEEJCTMKKwordHlwZWRlZiBzdHJ1Y3QgYWNzc19rZXlfc3QgeworCXVuc2lnbmVkIGludAlsZnNyMTc7CQkvKiBjdXJyZW50IHN0YXRlIG9mIGxmc3JzICovCisJdW5zaWduZWQgaW50CWxmc3IyNTsKKwl1bnNpZ25lZCBpbnQJbGZzcnN1bTsKKwl1bnNpZ25lZCBjaGFyCXNlZWRbQUNTU19LRVlTSVpFXTsKKwl1bnNpZ25lZCBjaGFyCWRhdGFbQUNTU19LRVlTSVpFXTsKKwl1bnNpZ25lZCBjaGFyCXN1YmtleVtBQ1NTX0tFWVNJWkVdOworCWludAkJZW5jcnlwdDsJLyogWFhYIG1ha2UgdGhlc2UgYml0IGZsYWdzPyAqLworCWludAkJbW9kZTsKKwlpbnQJCXNlZWRlZDsKKwlpbnQJCXN1YmtleV9hdmlsYWJsZTsKK30gQUNTU19LRVk7CisKK3ZvaWQgYWNzc19zZXRrZXkoQUNTU19LRVkgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqLCBpbnQsIGludCk7Cit2b2lkIGFjc3Nfc2V0c3Via2V5KEFDU1NfS0VZICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKik7CitpbnQgYWNzcyhBQ1NTX0tFWSAqLCB1bnNpZ25lZCBsb25nLCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKik7CisKKyNlbmRpZiAvKiBpZm5kZWYgX0FDU1NfSF8gKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvYWRkcm1hdGNoLmMgYi9vcGVuc3NoLTYuMHAxL2FkZHJtYXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNjc3M2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2FkZHJtYXRjaC5jCkBAIC0wLDAgKzEsNTAwIEBACisvKgkkT3BlbkJTRDogYWRkcm1hdGNoLmMsdiAxLjUgMjAxMC8wMi8yNiAyMDoyOTo1NCBkam0gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA4IERhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJtYXRjaC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKworc3RydWN0IHhhZGRyIHsKKwlzYV9mYW1pbHlfdAlhZjsKKwl1bmlvbiB7CisJCXN0cnVjdCBpbl9hZGRyCQl2NDsKKwkJc3RydWN0IGluNl9hZGRyCQl2NjsKKwkJdV9pbnQ4X3QJCWFkZHI4WzE2XTsKKwkJdV9pbnQzMl90CQlhZGRyMzJbNF07CisJfSB4YTsJCSAgICAvKiAxMjgtYml0IGFkZHJlc3MgKi8KKwl1X2ludDMyX3QJc2NvcGVfaWQ7CS8qIGlmYWNlIHNjb3BlIGlkIGZvciB2NiAqLworI2RlZmluZSB2NAl4YS52NAorI2RlZmluZSB2Ngl4YS52NgorI2RlZmluZSBhZGRyOAl4YS5hZGRyOAorI2RlZmluZSBhZGRyMzIJeGEuYWRkcjMyCit9OworCitzdGF0aWMgaW50CithZGRyX3VuaWNhc3RfbWFza2xlbihpbnQgYWYpCit7CisJc3dpdGNoIChhZikgeworCWNhc2UgQUZfSU5FVDoKKwkJcmV0dXJuIDMyOworCWNhc2UgQUZfSU5FVDY6CisJCXJldHVybiAxMjg7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQKK21hc2tsZW5fdmFsaWQoaW50IGFmLCB1X2ludCBtYXNrbGVuKQoreworCXN3aXRjaCAoYWYpIHsKKwljYXNlIEFGX0lORVQ6CisJCXJldHVybiBtYXNrbGVuIDw9IDMyID8gMCA6IC0xOworCWNhc2UgQUZfSU5FVDY6CisJCXJldHVybiBtYXNrbGVuIDw9IDEyOCA/IDAgOiAtMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorfQorCisvKgorICogQ29udmVydCBzdHJ1Y3Qgc29ja2FkZHIgdG8gc3RydWN0IHhhZGRyCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludAorYWRkcl9zYV90b194YWRkcihzdHJ1Y3Qgc29ja2FkZHIgKnNhLCBzb2NrbGVuX3Qgc2xlbiwgc3RydWN0IHhhZGRyICp4YSkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmluNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICppbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhOworCisJbWVtc2V0KHhhLCAnXDAnLCBzaXplb2YoKnhhKSk7CisKKwlzd2l0Y2ggKHNhLT5zYV9mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCWlmIChzbGVuIDwgc2l6ZW9mKCppbjQpKQorCQkJcmV0dXJuIC0xOworCQl4YS0+YWYgPSBBRl9JTkVUOworCQltZW1jcHkoJnhhLT52NCwgJmluNC0+c2luX2FkZHIsIHNpemVvZih4YS0+djQpKTsKKwkJYnJlYWs7CisJY2FzZSBBRl9JTkVUNjoKKwkJaWYgKHNsZW4gPCBzaXplb2YoKmluNikpCisJCQlyZXR1cm4gLTE7CisJCXhhLT5hZiA9IEFGX0lORVQ2OworCQltZW1jcHkoJnhhLT52NiwgJmluNi0+c2luNl9hZGRyLCBzaXplb2YoeGEtPnY2KSk7CisjaWZkZWYgSEFWRV9TVFJVQ1RfU09DS0FERFJfSU42X1NJTjZfU0NPUEVfSUQKKwkJeGEtPnNjb3BlX2lkID0gaW42LT5zaW42X3Njb3BlX2lkOworI2VuZGlmCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbGN1bGF0ZSBhIG5ldG1hc2sgb2YgbGVuZ3RoICdsJyBmb3IgYWRkcmVzcyBmYW1pbHkgJ2FmJyBhbmQKKyAqIHN0b3JlIGl0IGluICduJy4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50CithZGRyX25ldG1hc2soaW50IGFmLCB1X2ludCBsLCBzdHJ1Y3QgeGFkZHIgKm4pCit7CisJaW50IGk7CisKKwlpZiAobWFza2xlbl92YWxpZChhZiwgbCkgIT0gMCB8fCBuID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCW1lbXNldChuLCAnXDAnLCBzaXplb2YoKm4pKTsKKwlzd2l0Y2ggKGFmKSB7CisJY2FzZSBBRl9JTkVUOgorCQluLT5hZiA9IEFGX0lORVQ7CisJCWlmIChsID09IDApCisJCQlyZXR1cm4gMDsKKwkJbi0+djQuc19hZGRyID0gaHRvbmwoKDB4ZmZmZmZmZmYgPDwgKDMyIC0gbCkpICYgMHhmZmZmZmZmZik7CisJCXJldHVybiAwOworCWNhc2UgQUZfSU5FVDY6CisJCW4tPmFmID0gQUZfSU5FVDY7CisJCWZvciAoaSA9IDA7IGkgPCA0ICYmIGwgPj0gMzI7IGkrKywgbCAtPSAzMikKKwkJCW4tPmFkZHIzMltpXSA9IDB4ZmZmZmZmZmZVOworCQlpZiAoaSA8IDQgJiYgbCAhPSAwKQorCQkJbi0+YWRkcjMyW2ldID0gaHRvbmwoKDB4ZmZmZmZmZmYgPDwgKDMyIC0gbCkpICYKKwkJCSAgICAweGZmZmZmZmZmKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KK30KKworLyoKKyAqIFBlcmZvcm0gbG9naWNhbCBBTkQgb2YgYWRkcmVzc2VzICdhJyBhbmQgJ2InLCBzdG9yaW5nIHJlc3VsdCBpbiAnZHN0Jy4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50CithZGRyX2FuZChzdHJ1Y3QgeGFkZHIgKmRzdCwgY29uc3Qgc3RydWN0IHhhZGRyICphLCBjb25zdCBzdHJ1Y3QgeGFkZHIgKmIpCit7CisJaW50IGk7CisKKwlpZiAoZHN0ID09IE5VTEwgfHwgYSA9PSBOVUxMIHx8IGIgPT0gTlVMTCB8fCBhLT5hZiAhPSBiLT5hZikKKwkJcmV0dXJuIC0xOworCisJbWVtY3B5KGRzdCwgYSwgc2l6ZW9mKCpkc3QpKTsKKwlzd2l0Y2ggKGEtPmFmKSB7CisJY2FzZSBBRl9JTkVUOgorCQlkc3QtPnY0LnNfYWRkciAmPSBiLT52NC5zX2FkZHI7CisJCXJldHVybiAwOworCWNhc2UgQUZfSU5FVDY6CisJCWRzdC0+c2NvcGVfaWQgPSBhLT5zY29wZV9pZDsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCWRzdC0+YWRkcjMyW2ldICY9IGItPmFkZHIzMltpXTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KK30KKworLyoKKyAqIENvbXBhcmUgYWRkcmVzc2VzICdhJyBhbmQgJ2InCisgKiBSZXR1cm4gMCBpZiBhZGRyZXNzZXMgYXJlIGlkZW50aWNhbCwgLTEgaWYgKGEgPCBiKSBvciAxIGlmIChhID4gYikKKyAqLworc3RhdGljIGludAorYWRkcl9jbXAoY29uc3Qgc3RydWN0IHhhZGRyICphLCBjb25zdCBzdHJ1Y3QgeGFkZHIgKmIpCit7CisJaW50IGk7CisKKwlpZiAoYS0+YWYgIT0gYi0+YWYpCisJCXJldHVybiBhLT5hZiA9PSBBRl9JTkVUNiA/IDEgOiAtMTsKKworCXN3aXRjaCAoYS0+YWYpIHsKKwljYXNlIEFGX0lORVQ6CisJCWlmIChhLT52NC5zX2FkZHIgPT0gYi0+djQuc19hZGRyKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiBudG9obChhLT52NC5zX2FkZHIpID4gbnRvaGwoYi0+djQuc19hZGRyKSA/IDEgOiAtMTsKKwljYXNlIEFGX0lORVQ2OgorCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJCWlmIChhLT5hZGRyOFtpXSAtIGItPmFkZHI4W2ldICE9IDApCisJCQkJcmV0dXJuIGEtPmFkZHI4W2ldID4gYi0+YWRkcjhbaV0gPyAxIDogLTE7CisJCWlmIChhLT5zY29wZV9pZCA9PSBiLT5zY29wZV9pZCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gYS0+c2NvcGVfaWQgPiBiLT5zY29wZV9pZCA/IDEgOiAtMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorfQorCisvKgorICogUGFyc2Ugc3RyaW5nIGFkZHJlc3MgJ3AnIGludG8gJ24nCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludAorYWRkcl9wdG9uKGNvbnN0IGNoYXIgKnAsIHN0cnVjdCB4YWRkciAqbikKK3sKKwlzdHJ1Y3QgYWRkcmluZm8gaGludHMsICphaTsKKworCW1lbXNldCgmaGludHMsICdcMCcsIHNpemVvZihoaW50cykpOworCWhpbnRzLmFpX2ZsYWdzID0gQUlfTlVNRVJJQ0hPU1Q7CisKKwlpZiAocCA9PSBOVUxMIHx8IGdldGFkZHJpbmZvKHAsIE5VTEwsICZoaW50cywgJmFpKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoYWkgPT0gTlVMTCB8fCBhaS0+YWlfYWRkciA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobiAhPSBOVUxMICYmCisJICAgIGFkZHJfc2FfdG9feGFkZHIoYWktPmFpX2FkZHIsIGFpLT5haV9hZGRybGVuLCBuKSA9PSAtMSkgeworCQlmcmVlYWRkcmluZm8oYWkpOworCQlyZXR1cm4gLTE7CisJfQorCisJZnJlZWFkZHJpbmZvKGFpKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBlcmZvcm0gYml0d2lzZSBuZWdhdGlvbiBvZiBhZGRyZXNzCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludAorYWRkcl9pbnZlcnQoc3RydWN0IHhhZGRyICpuKQoreworCWludCBpOworCisJaWYgKG4gPT0gTlVMTCkKKwkJcmV0dXJuICgtMSk7CisKKwlzd2l0Y2ggKG4tPmFmKSB7CisJY2FzZSBBRl9JTkVUOgorCQluLT52NC5zX2FkZHIgPSB+bi0+djQuc19hZGRyOworCQlyZXR1cm4gKDApOworCWNhc2UgQUZfSU5FVDY6CisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQluLT5hZGRyMzJbaV0gPSB+bi0+YWRkcjMyW2ldOworCQlyZXR1cm4gKDApOworCWRlZmF1bHQ6CisJCXJldHVybiAoLTEpOworCX0KK30KKworLyoKKyAqIENhbGN1bGF0ZSBhIG5ldG1hc2sgb2YgbGVuZ3RoICdsJyBmb3IgYWRkcmVzcyBmYW1pbHkgJ2FmJyBhbmQKKyAqIHN0b3JlIGl0IGluICduJy4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50CithZGRyX2hvc3RtYXNrKGludCBhZiwgdV9pbnQgbCwgc3RydWN0IHhhZGRyICpuKQoreworCWlmIChhZGRyX25ldG1hc2soYWYsIGwsIG4pID09IC0xIHx8IGFkZHJfaW52ZXJ0KG4pID09IC0xKQorCQlyZXR1cm4gKC0xKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogVGVzdCB3aGV0aGVyIGFkZHJlc3MgJ2EnIGlzIGFsbCB6ZXJvcyAoaS5lLiAwLjAuMC4wIG9yIDo6KQorICogUmV0dXJucyAwIG9uIGlmIGFkZHJlc3MgaXMgYWxsLXplcm9zLCAtMSBpZiBub3QgYWxsIHplcm9zIG9yIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQKK2FkZHJfaXNfYWxsMHMoY29uc3Qgc3RydWN0IHhhZGRyICphKQoreworCWludCBpOworCisJc3dpdGNoIChhLT5hZikgeworCWNhc2UgQUZfSU5FVDoKKwkJcmV0dXJuIChhLT52NC5zX2FkZHIgPT0gMCA/IDAgOiAtMSk7CisJY2FzZSBBRl9JTkVUNjo7CisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQlpZiAoYS0+YWRkcjMyW2ldICE9IDApCisJCQkJcmV0dXJuICgtMSk7CisJCXJldHVybiAoMCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuICgtMSk7CisJfQorfQorCisvKgorICogVGVzdCB3aGV0aGVyIGhvc3QgcG9ydGlvbiBvZiBhZGRyZXNzICdhJywgYXMgZGV0ZXJtaW5lZCBieSAnbWFza2xlbicKKyAqIGlzIGFsbCB6ZXJvcy4KKyAqIFJldHVybnMgMCBvbiBpZiBob3N0IHBvcnRpb24gb2YgYWRkcmVzcyBpcyBhbGwtemVyb3MsCisgKiAtMSBpZiBub3QgYWxsIHplcm9zIG9yIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQKK2FkZHJfaG9zdF9pc19hbGwwcyhjb25zdCBzdHJ1Y3QgeGFkZHIgKmEsIHVfaW50IG1hc2tsZW4pCit7CisJc3RydWN0IHhhZGRyIHRtcF9hZGRyLCB0bXBfbWFzaywgdG1wX3Jlc3VsdDsKKworCW1lbWNweSgmdG1wX2FkZHIsIGEsIHNpemVvZih0bXBfYWRkcikpOworCWlmIChhZGRyX2hvc3RtYXNrKGEtPmFmLCBtYXNrbGVuLCAmdG1wX21hc2spID09IC0xKQorCQlyZXR1cm4gKC0xKTsKKwlpZiAoYWRkcl9hbmQoJnRtcF9yZXN1bHQsICZ0bXBfYWRkciwgJnRtcF9tYXNrKSA9PSAtMSkKKwkJcmV0dXJuICgtMSk7CisJcmV0dXJuIChhZGRyX2lzX2FsbDBzKCZ0bXBfcmVzdWx0KSk7Cit9CisKKy8qCisgKiBQYXJzZSBhIENJRFIgYWRkcmVzcyAoeC54LngueC95IG9yIHh4eHg6eXl5eTo6L3opLgorICogUmV0dXJuIC0xIG9uIHBhcnNlIGVycm9yLCAtMiBvbiBpbmNvbnNpc3RlbmN5IG9yIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludAorYWRkcl9wdG9uX2NpZHIoY29uc3QgY2hhciAqcCwgc3RydWN0IHhhZGRyICpuLCB1X2ludCAqbCkKK3sKKwlzdHJ1Y3QgeGFkZHIgdG1wOworCWxvbmcgdW5zaWduZWQgaW50IG1hc2tsZW4gPSA5OTk7CisJY2hhciBhZGRyYnVmWzY0XSwgKm1wLCAqY3A7CisKKwkvKiBEb24ndCBtb2RpZnkgYXJndW1lbnQgKi8KKwlpZiAocCA9PSBOVUxMIHx8IHN0cmxjcHkoYWRkcmJ1ZiwgcCwgc2l6ZW9mKGFkZHJidWYpKSA+IHNpemVvZihhZGRyYnVmKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKChtcCA9IHN0cmNocihhZGRyYnVmLCAnLycpKSAhPSBOVUxMKSB7CisJCSptcCA9ICdcMCc7CisJCW1wKys7CisJCW1hc2tsZW4gPSBzdHJ0b3VsKG1wLCAmY3AsIDEwKTsKKwkJaWYgKCptcCA9PSAnXDAnIHx8ICpjcCAhPSAnXDAnIHx8IG1hc2tsZW4gPiAxMjgpCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGFkZHJfcHRvbihhZGRyYnVmLCAmdG1wKSA9PSAtMSkKKwkJcmV0dXJuIC0xOworCisJaWYgKG1wID09IE5VTEwpCisJCW1hc2tsZW4gPSBhZGRyX3VuaWNhc3RfbWFza2xlbih0bXAuYWYpOworCWlmIChtYXNrbGVuX3ZhbGlkKHRtcC5hZiwgbWFza2xlbikgPT0gLTEpCisJCXJldHVybiAtMjsKKwlpZiAoYWRkcl9ob3N0X2lzX2FsbDBzKCZ0bXAsIG1hc2tsZW4pICE9IDApCisJCXJldHVybiAtMjsKKworCWlmIChuICE9IE5VTEwpCisJCW1lbWNweShuLCAmdG1wLCBzaXplb2YoKm4pKTsKKwlpZiAobCAhPSBOVUxMKQorCQkqbCA9IG1hc2tsZW47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYWRkcl9uZXRtYXRjaChjb25zdCBzdHJ1Y3QgeGFkZHIgKmhvc3QsIGNvbnN0IHN0cnVjdCB4YWRkciAqbmV0LCB1X2ludCBtYXNrbGVuKQoreworCXN0cnVjdCB4YWRkciB0bXBfbWFzaywgdG1wX3Jlc3VsdDsKKworCWlmIChob3N0LT5hZiAhPSBuZXQtPmFmKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoYWRkcl9uZXRtYXNrKGhvc3QtPmFmLCBtYXNrbGVuLCAmdG1wX21hc2spID09IC0xKQorCQlyZXR1cm4gLTE7CisJaWYgKGFkZHJfYW5kKCZ0bXBfcmVzdWx0LCBob3N0LCAmdG1wX21hc2spID09IC0xKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIGFkZHJfY21wKCZ0bXBfcmVzdWx0LCBuZXQpOworfQorCisvKgorICogTWF0Y2ggImFkZHIiIGFnYWluc3QgbGlzdCBwYXR0ZXJuIGxpc3QgIl9saXN0Iiwgd2hpY2ggbWF5IGNvbnRhaW4gYQorICogbWl4IG9mIENJRFIgYWRkcmVzc2VzIGFuZCBvbGQtc2Nob29sIHdpbGRjYXJkcy4KKyAqCisgKiBJZiBhZGRyIGlzIE5VTEwsIHRoZW4gbm8gbWF0Y2hpbmcgaXMgcGVyZm9ybWVkLCBidXQgX2xpc3QgaXMgcGFyc2VkCisgKiBhbmQgY2hlY2tlZCBmb3Igd2VsbC1mb3JtZWRuZXNzLgorICoKKyAqIFJldHVybnMgMSBvbiBtYXRjaCBmb3VuZCAobmV2ZXIgcmV0dXJuZWQgd2hlbiBhZGRyID09IE5VTEwpLgorICogUmV0dXJucyAwIG9uIGlmIG5vIG1hdGNoIGZvdW5kLCBvciBubyBlcnJvcnMgZm91bmQgd2hlbiBhZGRyID09IE5VTEwuCisgKiBSZXR1cm5zIC0xIG9uIG5lZ2F0ZWQgbWF0Y2ggZm91bmQgKG5ldmVyIHJldHVybmVkIHdoZW4gYWRkciA9PSBOVUxMKS4KKyAqIFJldHVybnMgLTIgb24gaW52YWxpZCBsaXN0IGVudHJ5LgorICovCitpbnQKK2FkZHJfbWF0Y2hfbGlzdChjb25zdCBjaGFyICphZGRyLCBjb25zdCBjaGFyICpfbGlzdCkKK3sKKwljaGFyICpsaXN0LCAqY3AsICpvOworCXN0cnVjdCB4YWRkciB0cnlfYWRkciwgbWF0Y2hfYWRkcjsKKwl1X2ludCBtYXNrbGVuLCBuZWc7CisJaW50IHJldCA9IDAsIHI7CisKKwlpZiAoYWRkciAhPSBOVUxMICYmIGFkZHJfcHRvbihhZGRyLCAmdHJ5X2FkZHIpICE9IDApIHsKKwkJZGVidWcyKCIlczogY291bGRuJ3QgcGFyc2UgYWRkcmVzcyAlLjEwMHMiLCBfX2Z1bmNfXywgYWRkcik7CisJCXJldHVybiAwOworCX0KKwlpZiAoKG8gPSBsaXN0ID0gc3RyZHVwKF9saXN0KSkgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXdoaWxlICgoY3AgPSBzdHJzZXAoJmxpc3QsICIsIikpICE9IE5VTEwpIHsKKwkJbmVnID0gKmNwID09ICchJzsKKwkJaWYgKG5lZykKKwkJCWNwKys7CisJCWlmICgqY3AgPT0gJ1wwJykgeworCQkJcmV0ID0gLTI7CisJCQlicmVhazsKKwkJfQorCQkvKiBQcmVmZXIgQ0lEUiBhZGRyZXNzIG1hdGNoaW5nICovCisJCXIgPSBhZGRyX3B0b25fY2lkcihjcCwgJm1hdGNoX2FkZHIsICZtYXNrbGVuKTsKKwkJaWYgKHIgPT0gLTIpIHsKKwkJCWVycm9yKCJJbmNvbnNpc3RlbnQgbWFzayBsZW5ndGggZm9yICIKKwkJCSAgICAibmV0d29yayBcIiUuMTAwc1wiIiwgY3ApOworCQkJcmV0ID0gLTI7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChyID09IDApIHsKKwkJCWlmIChhZGRyICE9IE5VTEwgJiYgYWRkcl9uZXRtYXRjaCgmdHJ5X2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF0Y2hfYWRkciwgbWFza2xlbikgPT0gMCkgeworIGZvdW5kaXQ6CisJCQkJaWYgKG5lZykgeworCQkJCQlyZXQgPSAtMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXJldCA9IDE7CisJCQl9CisJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCS8qIElmIENJRFIgcGFyc2UgZmFpbGVkLCB0cnkgd2lsZGNhcmQgc3RyaW5nIG1hdGNoICovCisJCQlpZiAoYWRkciAhPSBOVUxMICYmIG1hdGNoX3BhdHRlcm4oYWRkciwgY3ApID09IDEpCisJCQkJZ290byBmb3VuZGl0OworCQl9CisJfQorCXhmcmVlKG8pOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIE1hdGNoICJhZGRyIiBhZ2FpbnN0IGxpc3QgQ0lEUiBsaXN0ICJfbGlzdCIuIExleGljYWwgd2lsZGNhcmRzIGFuZAorICogbmVnYXRpb24gYXJlIG5vdCBzdXBwb3J0ZWQuIElmICJhZGRyIiA9PSBOVUxMLCB3aWxsIHZlcmlmeSBzdHJ1Y3R1cmUKKyAqIG9mICJfbGlzdCIuCisgKgorICogUmV0dXJucyAxIG9uIG1hdGNoIGZvdW5kIChuZXZlciByZXR1cm5lZCB3aGVuIGFkZHIgPT0gTlVMTCkuCisgKiBSZXR1cm5zIDAgb24gaWYgbm8gbWF0Y2ggZm91bmQsIG9yIG5vIGVycm9ycyBmb3VuZCB3aGVuIGFkZHIgPT0gTlVMTC4KKyAqIFJldHVybnMgLTEgb24gZXJyb3IKKyAqLworaW50CithZGRyX21hdGNoX2NpZHJfbGlzdChjb25zdCBjaGFyICphZGRyLCBjb25zdCBjaGFyICpfbGlzdCkKK3sKKwljaGFyICpsaXN0LCAqY3AsICpvOworCXN0cnVjdCB4YWRkciB0cnlfYWRkciwgbWF0Y2hfYWRkcjsKKwl1X2ludCBtYXNrbGVuOworCWludCByZXQgPSAwLCByOworCisJaWYgKGFkZHIgIT0gTlVMTCAmJiBhZGRyX3B0b24oYWRkciwgJnRyeV9hZGRyKSAhPSAwKSB7CisJCWRlYnVnMigiJXM6IGNvdWxkbid0IHBhcnNlIGFkZHJlc3MgJS4xMDBzIiwgX19mdW5jX18sIGFkZHIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKChvID0gbGlzdCA9IHN0cmR1cChfbGlzdCkpID09IE5VTEwpCisJCXJldHVybiAtMTsKKwl3aGlsZSAoKGNwID0gc3Ryc2VwKCZsaXN0LCAiLCIpKSAhPSBOVUxMKSB7CisJCWlmICgqY3AgPT0gJ1wwJykgeworCQkJZXJyb3IoIiVzOiBlbXB0eSBlbnRyeSBpbiBsaXN0IFwiJS4xMDBzXCIiLAorCQkJICAgIF9fZnVuY19fLCBvKTsKKwkJCXJldCA9IC0xOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBOQi4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gcHJlLWF1dGggd2l0aCB1bnRydXN0ZWQgZGF0YSwKKwkJICogc28gYmUgZXh0cmEgcGFyYW5vaWQgYWJvdXQganVuayByZWFjaGluZyBnZXRhZGRyaW5vICh2aWEKKwkJICogYWRkcl9wdG9uX2NpZHIpLgorCQkgKi8KKworCQkvKiBTdG9wIGp1bmsgZnJvbSByZWFjaGluZyBnZXRhZGRyaW5mby4gKzMgaXMgZm9yIG1hc2tsZW4gKi8KKwkJaWYgKHN0cmxlbihjcCkgPiBJTkVUNl9BRERSU1RSTEVOICsgMykgeworCQkJZXJyb3IoIiVzOiBsaXN0IGVudHJ5IFwiJS4xMDBzXCIgdG9vIGxvbmciLAorCQkJICAgIF9fZnVuY19fLCBjcCk7CisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisjZGVmaW5lIFZBTElEX0NJRFJfQ0hBUlMgIjAxMjM0NTY3ODlhYmNkZWZBQkNERUYuOi8iCisJCWlmIChzdHJzcG4oY3AsIFZBTElEX0NJRFJfQ0hBUlMpICE9IHN0cmxlbihjcCkpIHsKKwkJCWVycm9yKCIlczogbGlzdCBlbnRyeSBcIiUuMTAwc1wiIGNvbnRhaW5zIGludmFsaWQgIgorCQkJICAgICJjaGFyYWN0ZXJzIiwgX19mdW5jX18sIGNwKTsKKwkJCXJldCA9IC0xOworCQl9CisKKwkJLyogUHJlZmVyIENJRFIgYWRkcmVzcyBtYXRjaGluZyAqLworCQlyID0gYWRkcl9wdG9uX2NpZHIoY3AsICZtYXRjaF9hZGRyLCAmbWFza2xlbik7CisJCWlmIChyID09IC0xKSB7CisJCQllcnJvcigiSW52YWxpZCBuZXR3b3JrIGVudHJ5IFwiJS4xMDBzXCIiLCBjcCk7CisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKHIgPT0gLTIpIHsKKwkJCWVycm9yKCJJbmNvbnNpc3RlbnQgbWFzayBsZW5ndGggZm9yICIKKwkJCSAgICAibmV0d29yayBcIiUuMTAwc1wiIiwgY3ApOworCQkJcmV0ID0gLTE7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChyID09IDAgJiYgYWRkciAhPSBOVUxMKSB7CisJCQlpZiAoYWRkcl9uZXRtYXRjaCgmdHJ5X2FkZHIsICZtYXRjaF9hZGRyLAorCQkJICAgIG1hc2tsZW4pID09IDApCisJCQkJcmV0ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCXhmcmVlKG8pOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvYXRvbWljaW8uYyBiL29wZW5zc2gtNi4wcDEvYXRvbWljaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDFiM2MzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9hdG9taWNpby5jCkBAIC0wLDAgKzEsMTY1IEBACisvKiAkT3BlbkJTRDogYXRvbWljaW8uYyx2IDEuMjYgMjAxMC8wOS8yMiAyMjo1ODo1MSBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgRGFtaWVuIE1pbGxlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBBbmlsIE1hZGhhdmFwZWRkeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NSwxOTk5IFRoZW8gZGUgUmFhZHQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2lmZGVmIEhBVkVfUE9MTF9ICisjaW5jbHVkZSA8cG9sbC5oPgorI2Vsc2UKKyMgaWZkZWYgSEFWRV9TWVNfUE9MTF9ICisjICBpbmNsdWRlIDxzeXMvcG9sbC5oPgorIyBlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJhdG9taWNpby5oIgorCisvKgorICogZW5zdXJlIGFsbCBvZiBkYXRhIG9uIHNvY2tldCBjb21lcyB0aHJvdWdoLiBmPT1yZWFkIHx8IGY9PXZ3cml0ZQorICovCitzaXplX3QKK2F0b21pY2lvNihzc2l6ZV90ICgqZikgKGludCwgdm9pZCAqLCBzaXplX3QpLCBpbnQgZmQsIHZvaWQgKl9zLCBzaXplX3QgbiwKKyAgICBpbnQgKCpjYikodm9pZCAqLCBzaXplX3QpLCB2b2lkICpjYl9hcmcpCit7CisJY2hhciAqcyA9IF9zOworCXNpemVfdCBwb3MgPSAwOworCXNzaXplX3QgcmVzOworCXN0cnVjdCBwb2xsZmQgcGZkOworCisJcGZkLmZkID0gZmQ7CisJcGZkLmV2ZW50cyA9IGYgPT0gcmVhZCA/IFBPTExJTiA6IFBPTExPVVQ7CisJd2hpbGUgKG4gPiBwb3MpIHsKKwkJcmVzID0gKGYpIChmZCwgcyArIHBvcywgbiAtIHBvcyk7CisJCXN3aXRjaCAocmVzKSB7CisJCWNhc2UgLTE6CisJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CisJCQlpZiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVXT1VMREJMT0NLKSB7CisJCQkJKHZvaWQpcG9sbCgmcGZkLCAxLCAtMSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAwOgorCQkJZXJybm8gPSBFUElQRTsKKwkJCXJldHVybiBwb3M7CisJCWRlZmF1bHQ6CisJCQlwb3MgKz0gKHNpemVfdClyZXM7CisJCQlpZiAoY2IgIT0gTlVMTCAmJiBjYihjYl9hcmcsIChzaXplX3QpcmVzKSA9PSAtMSkgeworCQkJCWVycm5vID0gRUlOVFI7CisJCQkJcmV0dXJuIHBvczsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcG9zOworfQorCitzaXplX3QKK2F0b21pY2lvKHNzaXplX3QgKCpmKSAoaW50LCB2b2lkICosIHNpemVfdCksIGludCBmZCwgdm9pZCAqX3MsIHNpemVfdCBuKQoreworCXJldHVybiBhdG9taWNpbzYoZiwgZmQsIF9zLCBuLCBOVUxMLCBOVUxMKTsKK30KKworLyoKKyAqIGVuc3VyZSBhbGwgb2YgZGF0YSBvbiBzb2NrZXQgY29tZXMgdGhyb3VnaC4gZj09cmVhZHYgfHwgZj09d3JpdGV2CisgKi8KK3NpemVfdAorYXRvbWljaW92Nihzc2l6ZV90ICgqZikgKGludCwgY29uc3Qgc3RydWN0IGlvdmVjICosIGludCksIGludCBmZCwKKyAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKl9pb3YsIGludCBpb3ZjbnQsCisgICAgaW50ICgqY2IpKHZvaWQgKiwgc2l6ZV90KSwgdm9pZCAqY2JfYXJnKQoreworCXNpemVfdCBwb3MgPSAwLCByZW07CisJc3NpemVfdCByZXM7CisJc3RydWN0IGlvdmVjIGlvdl9hcnJheVtJT1ZfTUFYXSwgKmlvdiA9IGlvdl9hcnJheTsKKwlzdHJ1Y3QgcG9sbGZkIHBmZDsKKworCWlmIChpb3ZjbnQgPiBJT1ZfTUFYKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gMDsKKwl9CisJLyogTWFrZSBhIGNvcHkgb2YgdGhlIGlvdiBhcnJheSBiZWNhdXNlIHdlIG1heSBtb2RpZnkgaXQgYmVsb3cgKi8KKwltZW1jcHkoaW92LCBfaW92LCBpb3ZjbnQgKiBzaXplb2YoKl9pb3YpKTsKKworI2lmbmRlZiBCUk9LRU5fUkVBRFZfQ09NUEFSSVNPTgorCXBmZC5mZCA9IGZkOworCXBmZC5ldmVudHMgPSBmID09IHJlYWR2ID8gUE9MTElOIDogUE9MTE9VVDsKKyNlbmRpZgorCWZvciAoOyBpb3ZjbnQgPiAwICYmIGlvdlswXS5pb3ZfbGVuID4gMDspIHsKKwkJcmVzID0gKGYpIChmZCwgaW92LCBpb3ZjbnQpOworCQlzd2l0Y2ggKHJlcykgeworCQljYXNlIC0xOgorCQkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykgeworI2lmbmRlZiBCUk9LRU5fUkVBRFZfQ09NUEFSSVNPTgorCQkJCSh2b2lkKXBvbGwoJnBmZCwgMSwgLTEpOworI2VuZGlmCisJCQkJY29udGludWU7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAwOgorCQkJZXJybm8gPSBFUElQRTsKKwkJCXJldHVybiBwb3M7CisJCWRlZmF1bHQ6CisJCQlyZW0gPSAoc2l6ZV90KXJlczsKKwkJCXBvcyArPSByZW07CisJCQkvKiBza2lwIGNvbXBsZXRlZCBpb3YgZW50cmllcyAqLworCQkJd2hpbGUgKGlvdmNudCA+IDAgJiYgcmVtID49IGlvdlswXS5pb3ZfbGVuKSB7CisJCQkJcmVtIC09IGlvdlswXS5pb3ZfbGVuOworCQkJCWlvdisrOworCQkJCWlvdmNudC0tOworCQkJfQorCQkJLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuLi4uICovCisJCQlpZiAocmVtID4gMCAmJiAoaW92Y250IDw9IDAgfHwgcmVtID4gaW92WzBdLmlvdl9sZW4pKSB7CisJCQkJZXJybm8gPSBFRkFVTFQ7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAoaW92Y250ID09IDApCisJCQkJYnJlYWs7CisJCQkvKiB1cGRhdGUgcG9pbnRlciBpbiBwYXJ0aWFsbHkgY29tcGxldGUgaW92ICovCisJCQlpb3ZbMF0uaW92X2Jhc2UgPSAoKGNoYXIgKilpb3ZbMF0uaW92X2Jhc2UpICsgcmVtOworCQkJaW92WzBdLmlvdl9sZW4gLT0gcmVtOworCQl9CisJCWlmIChjYiAhPSBOVUxMICYmIGNiKGNiX2FyZywgKHNpemVfdClyZXMpID09IC0xKSB7CisJCQllcnJubyA9IEVJTlRSOworCQkJcmV0dXJuIHBvczsKKwkJfQorCX0KKwlyZXR1cm4gcG9zOworfQorCitzaXplX3QKK2F0b21pY2lvdihzc2l6ZV90ICgqZikgKGludCwgY29uc3Qgc3RydWN0IGlvdmVjICosIGludCksIGludCBmZCwKKyAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKl9pb3YsIGludCBpb3ZjbnQpCit7CisJcmV0dXJuIGF0b21pY2lvdjYoZiwgZmQsIF9pb3YsIGlvdmNudCwgTlVMTCwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2F0b21pY2lvLmggYi9vcGVuc3NoLTYuMHAxL2F0b21pY2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ3MjhhYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvYXRvbWljaW8uaApAQCAtMCwwICsxLDUxIEBACisvKiAkT3BlbkJTRDogYXRvbWljaW8uaCx2IDEuMTEgMjAxMC8wOS8yMiAyMjo1ODo1MSBkam0gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBEYW1pZW4gTWlsbGVyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NSwxOTk5IFRoZW8gZGUgUmFhZHQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfQVRPTUlDSU9fSAorI2RlZmluZSBfQVRPTUlDSU9fSAorCisvKgorICogRW5zdXJlIGFsbCBvZiBkYXRhIG9uIHNvY2tldCBjb21lcyB0aHJvdWdoLiBmPT1yZWFkIHx8IGY9PXZ3cml0ZQorICovCitzaXplX3QKK2F0b21pY2lvNihzc2l6ZV90ICgqZikgKGludCwgdm9pZCAqLCBzaXplX3QpLCBpbnQgZmQsIHZvaWQgKl9zLCBzaXplX3QgbiwKKyAgICBpbnQgKCpjYikodm9pZCAqLCBzaXplX3QpLCB2b2lkICopOworc2l6ZV90CWF0b21pY2lvKHNzaXplX3QgKCopKGludCwgdm9pZCAqLCBzaXplX3QpLCBpbnQsIHZvaWQgKiwgc2l6ZV90KTsKKworI2RlZmluZSB2d3JpdGUgKHNzaXplX3QgKCopKGludCwgdm9pZCAqLCBzaXplX3QpKXdyaXRlCisKKy8qCisgKiBlbnN1cmUgYWxsIG9mIGRhdGEgb24gc29ja2V0IGNvbWVzIHRocm91Z2guIGY9PXJlYWR2IHx8IGY9PXdyaXRldgorICovCitzaXplX3QKK2F0b21pY2lvdjYoc3NpemVfdCAoKmYpIChpbnQsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLCBpbnQpLCBpbnQgZmQsCisgICAgY29uc3Qgc3RydWN0IGlvdmVjICpfaW92LCBpbnQgaW92Y250LCBpbnQgKCpjYikodm9pZCAqLCBzaXplX3QpLCB2b2lkICopOworc2l6ZV90CWF0b21pY2lvdihzc2l6ZV90ICgqKShpbnQsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLCBpbnQpLAorICAgIGludCwgY29uc3Qgc3RydWN0IGlvdmVjICosIGludCk7CisKKyNlbmRpZiAvKiBfQVRPTUlDSU9fSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9hdWRpdC1ic20uYyBiL29wZW5zc2gtNi4wcDEvYXVkaXQtYnNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzNTU5MQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvYXVkaXQtYnNtLmMKQEAgLTAsMCArMSw0NTcgQEAKKy8qICRJZDogYXVkaXQtYnNtLmMsdiAxLjggMjAxMi8wMi8yMyAyMzo0MDo0MyBkdHVja2VyIEV4cCAkICovCisKKy8qCisgKiBUT0RPCisgKgorICogLSBkZWFsIHdpdGggb3ZlcmxhcCBiZXR3ZWVuIHRoaXMgYW5kIHN5c19hdXRoX2FsbG93ZWRfdXNlcgorICogICBzeXNfYXV0aF9yZWNvcmRfbG9naW4gYW5kIHJlY29yZF9mYWlsZWRfbG9naW4uCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAxOTg4LTIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworLyogI3ByYWdtYSBpZGVudAkiQCgjKWJzbWF1ZGl0LmMJMS4xCTAxLzA5LzE3IFNNSSIgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisjaWYgZGVmaW5lZChVU0VfQlNNX0FVRElUKQorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZmRlZiBCUk9LRU5fQlNNX0FQSQorI2luY2x1ZGUgPGxpYnNjZi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzc2guaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJob3N0ZmlsZS5oIgorI2luY2x1ZGUgImF1dGguaCIKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisKKyNpZm5kZWYgQVVFX29wZW5zc2gKKyMgZGVmaW5lIEFVRV9vcGVuc3NoICAgICAzMjgwMAorI2VuZGlmCisjaW5jbHVkZSA8YnNtL2F1ZGl0Lmg+CisjaW5jbHVkZSA8YnNtL2xpYmJzbS5oPgorI2luY2x1ZGUgPGJzbS9hdWRpdF91ZXZlbnRzLmg+CisjaW5jbHVkZSA8YnNtL2F1ZGl0X3JlY29yZC5oPgorI2luY2x1ZGUgPGxvY2FsZS5oPgorCisjaWYgZGVmaW5lZChIQVZFX0dFVEFVRElUX0FERFIpCisjZGVmaW5lCUF1ZGl0SW5mb1N0cnVjdAkJYXVkaXRpbmZvX2FkZHIKKyNkZWZpbmUgQXVkaXRJbmZvVGVybUlECQlhdV90aWRfYWRkcl90CisjZGVmaW5lIFNldEF1ZGl0RnVuYyhhLGIpCXNldGF1ZGl0X2FkZHIoKGEpLChiKSkKKyNkZWZpbmUgU2V0QXVkaXRGdW5jVGV4dAkic2V0YXVkaXRfYWRkciIKKyNkZWZpbmUgQVVUb1N1YmplY3RGdW5jCQlhdV90b19zdWJqZWN0X2V4CisjZGVmaW5lIEFVVG9SZXR1cm5GdW5jKGEsYikJYXVfdG9fcmV0dXJuMzIoKGEpLCAoaW50MzJfdCkoYikpCisjZWxzZQorI2RlZmluZQlBdWRpdEluZm9TdHJ1Y3QJCWF1ZGl0aW5mbworI2RlZmluZSBBdWRpdEluZm9UZXJtSUQJCWF1X3RpZF90CisjZGVmaW5lIFNldEF1ZGl0RnVuYyhhLGIpCXNldGF1ZGl0KGEpCisjZGVmaW5lIFNldEF1ZGl0RnVuY1RleHQJInNldGF1ZGl0IgorI2RlZmluZSBBVVRvU3ViamVjdEZ1bmMJCWF1X3RvX3N1YmplY3QKKyNkZWZpbmUgQVVUb1JldHVybkZ1bmMoYSxiKQlhdV90b19yZXR1cm4oKGEpLCAodV9pbnQpKGIpKQorI2VuZGlmCisKKyNpZm5kZWYgY2Fubm90X2F1ZGl0CitleHRlcm4gaW50CWNhbm5vdF9hdWRpdChpbnQpOworI2VuZGlmCitleHRlcm4gdm9pZAlhdWdfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkCWF1Z19zYXZlX2F1aWQoYXVfaWRfdCk7CitleHRlcm4gdm9pZAlhdWdfc2F2ZV91aWQodWlkX3QpOworZXh0ZXJuIHZvaWQJYXVnX3NhdmVfZXVpZCh1aWRfdCk7CitleHRlcm4gdm9pZAlhdWdfc2F2ZV9naWQoZ2lkX3QpOworZXh0ZXJuIHZvaWQJYXVnX3NhdmVfZWdpZChnaWRfdCk7CitleHRlcm4gdm9pZAlhdWdfc2F2ZV9waWQocGlkX3QpOworZXh0ZXJuIHZvaWQJYXVnX3NhdmVfYXNpZChhdV9hc2lkX3QpOworZXh0ZXJuIHZvaWQJYXVnX3NhdmVfdGlkKGRldl90LCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQJYXVnX3NhdmVfdGlkX2V4KGRldl90LCB1X2ludDMyX3QgKiwgdV9pbnQzMl90KTsKK2V4dGVybiBpbnQJYXVnX3NhdmVfbWUodm9pZCk7CitleHRlcm4gaW50CWF1Z19zYXZlX25hbWFzayh2b2lkKTsKK2V4dGVybiB2b2lkCWF1Z19zYXZlX2V2ZW50KGF1X2V2ZW50X3QpOworZXh0ZXJuIHZvaWQJYXVnX3NhdmVfc29yZihpbnQpOworZXh0ZXJuIHZvaWQJYXVnX3NhdmVfdGV4dChjaGFyICopOworZXh0ZXJuIHZvaWQJYXVnX3NhdmVfdGV4dDEoY2hhciAqKTsKK2V4dGVybiB2b2lkCWF1Z19zYXZlX3RleHQyKGNoYXIgKik7CitleHRlcm4gdm9pZAlhdWdfc2F2ZV9uYShpbnQpOworZXh0ZXJuIHZvaWQJYXVnX3NhdmVfdXNlcihjaGFyICopOworZXh0ZXJuIHZvaWQJYXVnX3NhdmVfcGF0aChjaGFyICopOworZXh0ZXJuIGludAlhdWdfc2F2ZV9wb2xpY3kodm9pZCk7CitleHRlcm4gdm9pZAlhdWdfc2F2ZV9hZnVuYyhpbnQgKCopKGludCkpOworZXh0ZXJuIGludAlhdWdfYXVkaXQodm9pZCk7CitleHRlcm4gaW50CWF1Z19uYV9zZWxlY3RlZCh2b2lkKTsKK2V4dGVybiBpbnQJYXVnX3NlbGVjdGVkKHZvaWQpOworZXh0ZXJuIGludAlhdWdfZGFlbW9uX3Nlc3Npb24odm9pZCk7CisKKyNpZm5kZWYgSEFWRV9HRVRURVhUCisjIGRlZmluZSBnZXR0ZXh0KGEpCShhKQorI2VuZGlmCisKK2V4dGVybiBBdXRoY3R4dCAqdGhlX2F1dGhjdHh0Oworc3RhdGljIEF1ZGl0SW5mb1Rlcm1JRCBzc2hfYnNtX3RpZDsKKworI2lmZGVmIEJST0tFTl9CU01fQVBJCisvKiBGb3Igc29tZSByZWFzb24gdGhpcyBjb25zdGFudCBpcyBubyBsb25nZXIgZGVmaW5lZAorICAgaW4gU29sYXJpcyAxMS4gKi8KKyNkZWZpbmUgQlNNX1RFWFRCVUZTWiAyNTYKKyNlbmRpZgorCisvKiBCZWxvdyBpcyB0aGUgbG93LWxldmVsIEJTTSBpbnRlcmZhY2UgY29kZSAqLworCisvKgorICogYXVnX2dldF9tYWNoaW5lIGlzIG9ubHkgcmVxdWlyZWQgb24gSVB2NiBjYXBhYmxlIG1hY2hpbmVzLCB3ZSB1c2UgYQorICogZGlmZmVyZW50IG1lY2hhbmlzbSBpbiBhdWRpdF9jb25uZWN0aW9uX2Zyb20oKSBmb3IgSVB2NC1vbmx5IG1hY2hpbmVzLgorICogZ2V0YXVkaXRfYWRkcigpIGlzIG9ubHkgcHJlc2VudCBvbiBJUHY2IGNhcGFibGUgbWFjaGluZXMuCisgKi8KKyNpZiBkZWZpbmVkKEhBVkVfQVVHX0dFVF9NQUNISU5FKSB8fCAhZGVmaW5lZChIQVZFX0dFVEFVRElUX0FERFIpCitleHRlcm4gaW50IAlhdWdfZ2V0X21hY2hpbmUoY2hhciAqLCB1X2ludDMyX3QgKiwgdV9pbnQzMl90ICopOworI2Vsc2UKK3N0YXRpYyBpbnQKK2F1Z19nZXRfbWFjaGluZShjaGFyICpob3N0LCB1X2ludDMyX3QgKmFkZHIsIHVfaW50MzJfdCAqdHlwZSkKK3sKKwlzdHJ1Y3QgYWRkcmluZm8gKmFpOyAKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmluNDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICppbjY7CisJaW50IHJldCA9IDAsIHI7CisKKwlpZiAoKHIgPSBnZXRhZGRyaW5mbyhob3N0LCBOVUxMLCBOVUxMLCAmYWkpKSAhPSAwKSB7CisJCWVycm9yKCJCU00gYXVkaXQ6IGdldGFkZHJpbmZvIGZhaWxlZCBmb3IgJS4xMDBzOiAlLjEwMHMiLCBob3N0LAorCQkgICAgciA9PSBFQUlfU1lTVEVNID8gc3RyZXJyb3IoZXJybm8pIDogZ2FpX3N0cmVycm9yKHIpKTsKKwkJcmV0dXJuIC0xOworCX0KKwkKKwlzd2l0Y2ggKGFpLT5haV9mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCWluNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhaS0+YWlfYWRkcjsKKwkJKnR5cGUgPSBBVV9JUHY0OworCQltZW1jcHkoYWRkciwgJmluNC0+c2luX2FkZHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOworCQlicmVhazsKKyNpZmRlZiBBVV9JUHY2CisJY2FzZSBBRl9JTkVUNjogCisJCWluNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYWktPmFpX2FkZHI7CisJCSp0eXBlID0gQVVfSVB2NjsKKwkJbWVtY3B5KGFkZHIsICZpbjYtPnNpbjZfYWRkciwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCWVycm9yKCJCU00gYXVkaXQ6IHVua25vd24gYWRkcmVzcyBmYW1pbHkgZm9yICUuMTAwczogJWQiLAorCQkgICAgaG9zdCwgYWktPmFpX2ZhbWlseSk7CisJCXJldCA9IC0xOworCX0KKwlmcmVlYWRkcmluZm8oYWkpOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworI2lmZGVmIEJST0tFTl9CU01fQVBJCisvKgorICBJbiBTb2xhcmlzIDExIHRoZSBhdWRpdCBkYWVtb24gaGFzIGJlZW4gbW92ZWQgdG8gU01GLiBJbiB0aGUgcHJvY2VzcworICB0aGV5IHNpbXBseSBkcm9wcGVkIGdldGFjbmEoKSBmcm9tIHRoZSBBUEksIHNpbmNlIGl0IHJlYWQgZnJvbSBhIG5vdworICBub24tZXhpc3RlbnQgY29uZmlnIGZpbGUuIFRoaXMgZnVuY3Rpb24gcmUtaW1wbGVtZW50cyBnZXRhY25hKCkgdG8KKyAgcmVhZCBmcm9tIHRoZSBTTUYgcmVwb3NpdG9yeSBpbnN0ZWFkLgorICovCitpbnQKK2dldGFjbmEoY2hhciAqYXVkaXRzdHJpbmcsIGludCBsZW4pCit7CisJc2NmX2hhbmRsZV90ICpoYW5kbGUgPSBOVUxMOworCXNjZl9wcm9wZXJ0eV90ICpwcm9wZXJ0eSA9IE5VTEw7CisJc2NmX3ZhbHVlX3QgKnZhbHVlID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKworCWhhbmRsZSA9IHNjZl9oYW5kbGVfY3JlYXRlKFNDRl9WRVJTSU9OKTsKKwlpZiAoaGFuZGxlID09IE5VTEwpIAorCSAgICAgICAgcmV0dXJuIC0yOyAvKiBUaGUgbWFuIHBhZ2UgZm9yIGdldGFjbmEgb24gU29sYXJpcyAxMCBzdGF0ZXMKKwkJCSAgICAgIHdlIHNob3VsZCByZXR1cm4gLTIgaW4gY2FzZSBvZiBlcnJvciBhbmQgc2V0CisJCQkgICAgICBlcnJubyB0byBpbmRpY2F0ZSB0aGUgZXJyb3IuIFdlIGRvbid0IGJvdGhlcgorCQkJICAgICAgd2l0aCBlcnJubyBoZXJlLCB0aG91Z2gsIHNpbmNlIHRoZSBvbmx5IHVzZQorCQkJICAgICAgb2YgdGhpcyBmdW5jdGlvbiBiZWxvdyBkb2Vzbid0IGNoZWNrIGZvciBlcnJvcnMKKwkJCSAgICAgIGFueXdheS4gCisJCQkgICAqLworCisJcmV0ID0gc2NmX2hhbmRsZV9iaW5kKGhhbmRsZSk7CisJaWYgKHJldCA9PSAtMSkgCisJICAgICAgICByZXR1cm4gLTI7CisKKwlwcm9wZXJ0eSA9IHNjZl9wcm9wZXJ0eV9jcmVhdGUoaGFuZGxlKTsKKwlpZiAocHJvcGVydHkgPT0gTlVMTCkgCisJICAgICAgICByZXR1cm4gLTI7CisKKwlyZXQgPSBzY2ZfaGFuZGxlX2RlY29kZV9mbXJpKGhhbmRsZSwgCisJICAgICAic3ZjOi9zeXN0ZW0vYXVkaXRkOmRlZmF1bHQvOnByb3BlcnRpZXMvcHJlc2VsZWN0aW9uL25hZmxhZ3MiLAorCQkJCSAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgcHJvcGVydHksIDApOworCWlmIChyZXQgPT0gLTEpIAorCSAgICAgICAgcmV0dXJuIC0yOworCisJdmFsdWUgPSBzY2ZfdmFsdWVfY3JlYXRlKGhhbmRsZSk7CisJaWYgKHZhbHVlID09IE5VTEwpIAorCSAgICAgICAgcmV0dXJuIC0yOworCisJcmV0ID0gc2NmX3Byb3BlcnR5X2dldF92YWx1ZShwcm9wZXJ0eSwgdmFsdWUpOworCWlmIChyZXQgPT0gLTEpIAorCSAgICAgICAgcmV0dXJuIC0yOworCisJcmV0ID0gc2NmX3ZhbHVlX2dldF9hc3RyaW5nKHZhbHVlLCBhdWRpdHN0cmluZywgbGVuKTsKKwlpZiAocmV0ID09IC0xKSAKKwkgICAgICAgIHJldHVybiAtMjsKKworCXNjZl92YWx1ZV9kZXN0cm95KHZhbHVlKTsKKwlzY2ZfcHJvcGVydHlfZGVzdHJveShwcm9wZXJ0eSk7CisJc2NmX2hhbmRsZV9kZXN0cm95KGhhbmRsZSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKgorICogQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCBldmVudCBpcyBzZWxlY3RlZCAoZW5hYmxlZCkgZm9yIGF1ZGl0aW5nLgorICogUmV0dXJucyAxIGlmIHRoZSBldmVudCBpcyBzZWxlY3RlZCwgMCBpZiBub3QgYW5kIC0xIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQKK3NlbGVjdGVkKGNoYXIgKnVzZXJuYW1lLCB1aWRfdCB1aWQsIGF1X2V2ZW50X3QgZXZlbnQsIGludCBzZikKK3sKKwlpbnQgcmMsIHNvcmY7CisJY2hhciBuYWZsYWdzWzUxMl07CisJc3RydWN0IGF1X21hc2sgbWFzazsKKworCW1hc2suYW1fc3VjY2VzcyA9IG1hc2suYW1fZmFpbHVyZSA9IDA7CisJaWYgKHVpZCA8IDApIHsKKwkJLyogZ2V0IGZsYWdzIGZvciBub24tYXR0cmlidXRhYmxlICh0byBhIHJlYWwgdXNlcikgZXZlbnRzICovCisJCXJjID0gZ2V0YWNuYShuYWZsYWdzLCBzaXplb2YobmFmbGFncykpOworCQlpZiAocmMgPT0gMCkKKwkJCSh2b2lkKSBnZXRhdWRpdGZsYWdzYmluKG5hZmxhZ3MsICZtYXNrKTsKKwl9IGVsc2UKKwkJcmMgPSBhdV91c2VyX21hc2sodXNlcm5hbWUsICZtYXNrKTsKKworCXNvcmYgPSAoc2YgPT0gMCkgPyBBVV9QUlNfU1VDQ0VTUyA6IEFVX1BSU19GQUlMVVJFOworCXJldHVybihhdV9wcmVzZWxlY3QoZXZlbnQsICZtYXNrLCBzb3JmLCBBVV9QUlNfUkVSRUFEKSk7Cit9CisKK3N0YXRpYyB2b2lkCitic21fYXVkaXRfcmVjb3JkKGludCB0eXAsIGNoYXIgKnN0cmluZywgYXVfZXZlbnRfdCBldmVudF9ubykKK3sKKwlpbnQJCWFkLCByYywgc2VsOworCXVpZF90CQl1aWQgPSAtMTsKKwlnaWRfdAkJZ2lkID0gLTE7CisJcGlkX3QJCXBpZCA9IGdldHBpZCgpOworCUF1ZGl0SW5mb1Rlcm1JRAl0aWQgPSBzc2hfYnNtX3RpZDsKKworCWlmICh0aGVfYXV0aGN0eHQgIT0gTlVMTCAmJiB0aGVfYXV0aGN0eHQtPnZhbGlkKSB7CisJCXVpZCA9IHRoZV9hdXRoY3R4dC0+cHctPnB3X3VpZDsKKwkJZ2lkID0gdGhlX2F1dGhjdHh0LT5wdy0+cHdfZ2lkOworCX0KKworCXJjID0gKHR5cCA9PSAwKSA/IDAgOiAtMTsKKwlzZWwgPSBzZWxlY3RlZCh0aGVfYXV0aGN0eHQtPnVzZXIsIHVpZCwgZXZlbnRfbm8sIHJjKTsKKwlkZWJ1ZzMoIkJTTSBhdWRpdDogdHlwICVkIHJjICVkIFwiJXNcIiIsIHR5cCwgcmMsIHN0cmluZyk7CisJaWYgKCFzZWwpCisJCXJldHVybjsJLyogYXVkaXQgZXZlbnQgZG9lcyBub3QgbWF0Y2ggbWFzaywgZG8gbm90IHdyaXRlICovCisKKwlkZWJ1ZzMoIkJTTSBhdWRpdDogd3JpdGluZyBhdWRpdCBuZXcgcmVjb3JkIik7CisJYWQgPSBhdV9vcGVuKCk7CisKKwkodm9pZCkgYXVfd3JpdGUoYWQsIEFVVG9TdWJqZWN0RnVuYyh1aWQsIHVpZCwgZ2lkLCB1aWQsIGdpZCwKKwkgICAgcGlkLCBwaWQsICZ0aWQpKTsKKwkodm9pZCkgYXVfd3JpdGUoYWQsIGF1X3RvX3RleHQoc3RyaW5nKSk7CisJKHZvaWQpIGF1X3dyaXRlKGFkLCBBVVRvUmV0dXJuRnVuYyh0eXAsIHJjKSk7CisKKyNpZmRlZiBCUk9LRU5fQlNNX0FQSQorCS8qIFRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBldmVudCBtb2RpZmllciBmbGFncy4gRm9yCisJICAgc29tZSBzZWVtaW5nbHkgdW5kb2N1bWVudGVkIHJlYXNvbiBpdCB3YXMgYWRkZWQgaW4KKwkgICBTb2xhcmlzIDExLiAqLworCXJjID0gYXVfY2xvc2UoYWQsIEFVX1RPX1dSSVRFLCBldmVudF9ubywgMCk7CisjZWxzZQorCXJjID0gYXVfY2xvc2UoYWQsIEFVX1RPX1dSSVRFLCBldmVudF9ubyk7CisjZW5kaWYKKworCWlmIChyYyA8IDApCisJCWVycm9yKCJCU00gYXVkaXQ6ICVzIGZhaWxlZCB0byB3cml0ZSBcIiVzXCIgcmVjb3JkOiAlcyIsCisJCSAgICBfX2Z1bmNfXywgc3RyaW5nLCBzdHJlcnJvcihlcnJubykpOworfQorCitzdGF0aWMgdm9pZAorYnNtX2F1ZGl0X3Nlc3Npb25fc2V0dXAodm9pZCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IEF1ZGl0SW5mb1N0cnVjdCBpbmZvOworCWF1X21hc2tfdCBtYXNrOworCisJaWYgKHRoZV9hdXRoY3R4dCA9PSBOVUxMKSB7CisJCWVycm9yKCJCU00gYXVkaXQ6IHNlc3Npb24gc2V0dXAgaW50ZXJuYWwgZXJyb3IgKE5VTEwgY3R4dCkiKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh0aGVfYXV0aGN0eHQtPnZhbGlkKQorCQlpbmZvLmFpX2F1aWQgPSB0aGVfYXV0aGN0eHQtPnB3LT5wd191aWQ7CisJZWxzZQorCQlpbmZvLmFpX2F1aWQgPSAtMTsKKwlpbmZvLmFpX2FzaWQgPSBnZXRwaWQoKTsKKwltYXNrLmFtX3N1Y2Nlc3MgPSAwOworCW1hc2suYW1fZmFpbHVyZSA9IDA7CisKKwkodm9pZCkgYXVfdXNlcl9tYXNrKHRoZV9hdXRoY3R4dC0+dXNlciwgJm1hc2spOworCisJaW5mby5haV9tYXNrLmFtX3N1Y2Nlc3MgID0gbWFzay5hbV9zdWNjZXNzOworCWluZm8uYWlfbWFzay5hbV9mYWlsdXJlICA9IG1hc2suYW1fZmFpbHVyZTsKKworCWluZm8uYWlfdGVybWlkID0gc3NoX2JzbV90aWQ7CisKKwlyYyA9IFNldEF1ZGl0RnVuYygmaW5mbywgc2l6ZW9mKGluZm8pKTsKKwlpZiAocmMgPCAwKQorCQllcnJvcigiQlNNIGF1ZGl0OiAlczogJXMgZmFpbGVkOiAlcyIsIF9fZnVuY19fLAorCQkgICAgU2V0QXVkaXRGdW5jVGV4dCwgc3RyZXJyb3IoZXJybm8pKTsKK30KKworc3RhdGljIHZvaWQKK2JzbV9hdWRpdF9iYWRfbG9naW4oY29uc3QgY2hhciAqd2hhdCkKK3sKKwljaGFyIHRleHRidWZbQlNNX1RFWFRCVUZTWl07CisKKwlpZiAodGhlX2F1dGhjdHh0LT52YWxpZCkgeworCQkodm9pZCkgc25wcmludGYodGV4dGJ1Ziwgc2l6ZW9mICh0ZXh0YnVmKSwKKwkJCWdldHRleHQoImludmFsaWQgJXMgZm9yIHVzZXIgJXMiKSwKKwkJCSAgICB3aGF0LCB0aGVfYXV0aGN0eHQtPnVzZXIpOworCQlic21fYXVkaXRfcmVjb3JkKDQsIHRleHRidWYsIEFVRV9vcGVuc3NoKTsKKwl9IGVsc2UgeworCQkodm9pZCkgc25wcmludGYodGV4dGJ1Ziwgc2l6ZW9mICh0ZXh0YnVmKSwKKwkJCWdldHRleHQoImludmFsaWQgdXNlciBuYW1lIFwiJXNcIiIpLAorCQkJICAgIHRoZV9hdXRoY3R4dC0+dXNlcik7CisJCWJzbV9hdWRpdF9yZWNvcmQoMywgdGV4dGJ1ZiwgQVVFX29wZW5zc2gpOworCX0KK30KKworLyogQmVsb3cgaXMgdGhlIHNzaGQgYXVkaXQgQVBJIGNvZGUgKi8KKwordm9pZAorYXVkaXRfY29ubmVjdGlvbl9mcm9tKGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0KQoreworCUF1ZGl0SW5mb1Rlcm1JRCAqdGlkID0gJnNzaF9ic21fdGlkOworCWNoYXIgYnVmWzEwMjRdOworCisJaWYgKGNhbm5vdF9hdWRpdCgwKSkKKwkJcmV0dXJuOworCWRlYnVnMygiQlNNIGF1ZGl0OiBjb25uZWN0aW9uIGZyb20gJS4xMDBzIHBvcnQgJWQiLCBob3N0LCBwb3J0KTsKKworCS8qIHBvcHVsYXRlIG91ciB0ZXJtaW5hbCBpZCBzdHJ1Y3R1cmUgKi8KKyNpZiBkZWZpbmVkKEhBVkVfR0VUQVVESVRfQUREUikKKwl0aWQtPmF0X3BvcnQgPSAoZGV2X3QpcG9ydDsKKwlhdWdfZ2V0X21hY2hpbmUoKGNoYXIgKilob3N0LCAmKHRpZC0+YXRfYWRkclswXSksICYodGlkLT5hdF90eXBlKSk7CisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiUwOHggJTA4eCAlMDh4ICUwOHgiLCB0aWQtPmF0X2FkZHJbMF0sCisJICAgIHRpZC0+YXRfYWRkclsxXSwgdGlkLT5hdF9hZGRyWzJdLCB0aWQtPmF0X2FkZHJbM10pOworCWRlYnVnMygiQlNNIGF1ZGl0OiBpcHR5cGUgJWQgbWFjaGluZSBJRCAlcyIsIChpbnQpdGlkLT5hdF90eXBlLCBidWYpOworI2Vsc2UKKwkvKiB0aGlzIGlzIHVzZWQgb24gSVB2NC1vbmx5IG1hY2hpbmVzICovCisJdGlkLT5wb3J0ID0gKGRldl90KXBvcnQ7CisJdGlkLT5tYWNoaW5lID0gaW5ldF9hZGRyKGhvc3QpOworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlMDh4IiwgdGlkLT5tYWNoaW5lKTsKKwlkZWJ1ZzMoIkJTTSBhdWRpdDogbWFjaGluZSBJRCAlcyIsIGJ1Zik7CisjZW5kaWYKK30KKwordm9pZAorYXVkaXRfcnVuX2NvbW1hbmQoY29uc3QgY2hhciAqY29tbWFuZCkKK3sKKwkvKiBub3QgaW1wbGVtZW50ZWQgKi8KK30KKwordm9pZAorYXVkaXRfc2Vzc2lvbl9vcGVuKHN0cnVjdCBsb2dpbmluZm8gKmxpKQoreworCS8qIG5vdCBpbXBsZW1lbnRlZCAqLworfQorCit2b2lkCithdWRpdF9zZXNzaW9uX2Nsb3NlKHN0cnVjdCBsb2dpbmluZm8gKmxpKQoreworCS8qIG5vdCBpbXBsZW1lbnRlZCAqLworfQorCit2b2lkCithdWRpdF9ldmVudChzc2hfYXVkaXRfZXZlbnRfdCBldmVudCkKK3sKKwljaGFyICAgIHRleHRidWZbQlNNX1RFWFRCVUZTWl07CisJc3RhdGljIGludCBsb2dnZWRfaW4gPSAwOworCWNvbnN0IGNoYXIgKnVzZXIgPSB0aGVfYXV0aGN0eHQgPyB0aGVfYXV0aGN0eHQtPnVzZXIgOiAiKHVua25vd24gdXNlcikiOworCisJaWYgKGNhbm5vdF9hdWRpdCgwKSkKKwkJcmV0dXJuOworCisJc3dpdGNoKGV2ZW50KSB7CisJY2FzZSBTU0hfQVVUSF9TVUNDRVNTOgorCQlsb2dnZWRfaW4gPSAxOworCQlic21fYXVkaXRfc2Vzc2lvbl9zZXR1cCgpOworCQlzbnByaW50Zih0ZXh0YnVmLCBzaXplb2YodGV4dGJ1ZiksCisJCSAgICBnZXR0ZXh0KCJzdWNjZXNzZnVsIGxvZ2luICVzIiksIHVzZXIpOworCQlic21fYXVkaXRfcmVjb3JkKDAsIHRleHRidWYsIEFVRV9vcGVuc3NoKTsKKwkJYnJlYWs7CisKKwljYXNlIFNTSF9DT05ORUNUSU9OX0NMT1NFOgorCQkvKgorCQkgKiBXZSBjYW4gYWxzbyBnZXQgYSBjbG9zZSBldmVudCBpZiB0aGUgdXNlciBhdHRlbXB0ZWQgYXV0aAorCQkgKiBidXQgbmV2ZXIgc3VjY2VlZGVkLgorCQkgKi8KKwkJaWYgKGxvZ2dlZF9pbikgeworCQkJc25wcmludGYodGV4dGJ1Ziwgc2l6ZW9mKHRleHRidWYpLAorCQkJICAgIGdldHRleHQoInNzaGQgbG9nb3V0ICVzIiksIHRoZV9hdXRoY3R4dC0+dXNlcik7CisJCQlic21fYXVkaXRfcmVjb3JkKDAsIHRleHRidWYsIEFVRV9sb2dvdXQpOworCQl9IGVsc2UgeworCQkJZGVidWcoIiVzOiBjb25uZWN0aW9uIGNsb3NlZCB3aXRob3V0IGF1dGhlbnRpY2F0aW9uIiwKKwkJCSAgICBfX2Z1bmNfXyk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNTSF9OT0xPR0lOOgorCQlic21fYXVkaXRfcmVjb3JkKDEsCisJCSAgICBnZXR0ZXh0KCJsb2dpbnMgZGlzYWJsZWQgYnkgL2V0Yy9ub2xvZ2luIiksIEFVRV9vcGVuc3NoKTsKKwkJYnJlYWs7CisKKwljYXNlIFNTSF9MT0dJTl9FWENFRURfTUFYVFJJRVM6CisJCXNucHJpbnRmKHRleHRidWYsIHNpemVvZih0ZXh0YnVmKSwKKwkJICAgIGdldHRleHQoInRvbyBtYW55IHRyaWVzIGZvciB1c2VyICVzIiksIHRoZV9hdXRoY3R4dC0+dXNlcik7CisJCWJzbV9hdWRpdF9yZWNvcmQoMSwgdGV4dGJ1ZiwgQVVFX29wZW5zc2gpOworCQlicmVhazsKKworCWNhc2UgU1NIX0xPR0lOX1JPT1RfREVOSUVEOgorCQlic21fYXVkaXRfcmVjb3JkKDIsIGdldHRleHQoIm5vdF9jb25zb2xlIiksIEFVRV9vcGVuc3NoKTsKKwkJYnJlYWs7CisKKwljYXNlIFNTSF9BVVRIX0ZBSUxfUEFTU1dEOgorCQlic21fYXVkaXRfYmFkX2xvZ2luKCJwYXNzd29yZCIpOworCQlicmVhazsKKworCWNhc2UgU1NIX0FVVEhfRkFJTF9LQkRJTlQ6CisJCWJzbV9hdWRpdF9iYWRfbG9naW4oImludGVyYWN0aXZlIHBhc3N3b3JkIGVudHJ5Iik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGVidWcoIiVzOiB1bmhhbmRsZWQgZXZlbnQgJWQiLCBfX2Z1bmNfXywgZXZlbnQpOworCX0KK30KKyNlbmRpZiAvKiBCU00gKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvYXVkaXQtbGludXguYyBiL29wZW5zc2gtNi4wcDEvYXVkaXQtbGludXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2VlMmY0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9hdWRpdC1saW51eC5jCkBAIC0wLDAgKzEsMTI2IEBACisvKiAkSWQ6IGF1ZGl0LWxpbnV4LmMsdiAxLjEgMjAxMS8wMS8xNyAxMDoxNTozMCBkdHVja2VyIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogUmVkIEhhdCBhdXRob3I6IEphbiBGLiBDaGFkaW1hIDxqY2hhZGltYUByZWRoYXQuY29tPgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorI2lmIGRlZmluZWQoVVNFX0xJTlVYX0FVRElUKQorI2luY2x1ZGUgPGxpYmF1ZGl0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJhdWRpdC5oIgorI2luY2x1ZGUgImNhbm9ob3N0LmgiCisKK2NvbnN0IGNoYXIqIGF1ZGl0X3VzZXJuYW1lKHZvaWQpOworCitpbnQKK2xpbnV4X2F1ZGl0X3JlY29yZF9ldmVudChpbnQgdWlkLCBjb25zdCBjaGFyICp1c2VybmFtZSwKKyAgICBjb25zdCBjaGFyICpob3N0bmFtZSwgY29uc3QgY2hhciAqaXAsIGNvbnN0IGNoYXIgKnR0eW4sIGludCBzdWNjZXNzKQoreworCWludCBhdWRpdF9mZCwgcmMsIHNhdmVkX2Vycm5vOworCisJYXVkaXRfZmQgPSBhdWRpdF9vcGVuKCk7CisJaWYgKGF1ZGl0X2ZkIDwgMCkgeworCQlpZiAoZXJybm8gPT0gRUlOVkFMIHx8IGVycm5vID09IEVQUk9UT05PU1VQUE9SVCB8fAorCQkgICAgZXJybm8gPT0gRUFGTk9TVVBQT1JUKQorCQkJcmV0dXJuIDE7IC8qIE5vIGF1ZGl0IHN1cHBvcnQgaW4ga2VybmVsICovCisJCWVsc2UKKwkJCXJldHVybiAwOyAvKiBNdXN0IHByZXZlbnQgbG9naW4gKi8KKwl9CisJcmMgPSBhdWRpdF9sb2dfYWNjdF9tZXNzYWdlKGF1ZGl0X2ZkLCBBVURJVF9VU0VSX0xPR0lOLAorCSAgICBOVUxMLCAibG9naW4iLCB1c2VybmFtZSA/IHVzZXJuYW1lIDogIih1bmtub3duKSIsCisJICAgIHVzZXJuYW1lID09IE5VTEwgPyB1aWQgOiAtMSwgaG9zdG5hbWUsIGlwLCB0dHluLCBzdWNjZXNzKTsKKwlzYXZlZF9lcnJubyA9IGVycm5vOworCWNsb3NlKGF1ZGl0X2ZkKTsKKwkvKgorCSAqIERvIG5vdCByZXBvcnQgZXJyb3IgaWYgdGhlIGVycm9yIGlzIEVQRVJNIGFuZCBzc2hkIGlzIHJ1biBhcyBub24KKwkgKiByb290IHVzZXIuCisJICovCisJaWYgKChyYyA9PSAtRVBFUk0pICYmIChnZXRldWlkKCkgIT0gMCkpCisJCXJjID0gMDsKKwllcnJubyA9IHNhdmVkX2Vycm5vOworCXJldHVybiAocmMgPj0gMCk7Cit9CisKKy8qIEJlbG93IGlzIHRoZSBzc2hkIGF1ZGl0IEFQSSBjb2RlICovCisKK3ZvaWQKK2F1ZGl0X2Nvbm5lY3Rpb25fZnJvbShjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCkKK3sKK30KKwkvKiBub3QgaW1wbGVtZW50ZWQgKi8KKwordm9pZAorYXVkaXRfcnVuX2NvbW1hbmQoY29uc3QgY2hhciAqY29tbWFuZCkKK3sKKwkvKiBub3QgaW1wbGVtZW50ZWQgKi8KK30KKwordm9pZAorYXVkaXRfc2Vzc2lvbl9vcGVuKHN0cnVjdCBsb2dpbmluZm8gKmxpKQoreworCWlmIChsaW51eF9hdWRpdF9yZWNvcmRfZXZlbnQobGktPnVpZCwgTlVMTCwgbGktPmhvc3RuYW1lLAorCSAgICBOVUxMLCBsaS0+bGluZSwgMSkgPT0gMCkKKwkJZmF0YWwoImxpbnV4X2F1ZGl0X3dyaXRlX2VudHJ5IGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworfQorCit2b2lkCithdWRpdF9zZXNzaW9uX2Nsb3NlKHN0cnVjdCBsb2dpbmluZm8gKmxpKQoreworCS8qIG5vdCBpbXBsZW1lbnRlZCAqLworfQorCit2b2lkCithdWRpdF9ldmVudChzc2hfYXVkaXRfZXZlbnRfdCBldmVudCkKK3sKKwlzd2l0Y2goZXZlbnQpIHsKKwljYXNlIFNTSF9BVVRIX1NVQ0NFU1M6CisJY2FzZSBTU0hfQ09OTkVDVElPTl9DTE9TRToKKwljYXNlIFNTSF9OT0xPR0lOOgorCWNhc2UgU1NIX0xPR0lOX0VYQ0VFRF9NQVhUUklFUzoKKwljYXNlIFNTSF9MT0dJTl9ST09UX0RFTklFRDoKKwkJYnJlYWs7CisKKwljYXNlIFNTSF9BVVRIX0ZBSUxfTk9ORToKKwljYXNlIFNTSF9BVVRIX0ZBSUxfUEFTU1dEOgorCWNhc2UgU1NIX0FVVEhfRkFJTF9LQkRJTlQ6CisJY2FzZSBTU0hfQVVUSF9GQUlMX1BVQktFWToKKwljYXNlIFNTSF9BVVRIX0ZBSUxfSE9TVEJBU0VEOgorCWNhc2UgU1NIX0FVVEhfRkFJTF9HU1NBUEk6CisJY2FzZSBTU0hfSU5WQUxJRF9VU0VSOgorCQlsaW51eF9hdWRpdF9yZWNvcmRfZXZlbnQoLTEsIGF1ZGl0X3VzZXJuYW1lKCksIE5VTEwsCisJCQlnZXRfcmVtb3RlX2lwYWRkcigpLCAic3NoZCIsIDApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRlYnVnKCIlczogdW5oYW5kbGVkIGV2ZW50ICVkIiwgX19mdW5jX18sIGV2ZW50KTsKKwl9Cit9CisKKyNlbmRpZiAvKiBVU0VfTElOVVhfQVVESVQgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvYXVkaXQuYyBiL29wZW5zc2gtNi4wcDEvYXVkaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWQ1N2ZhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9hdWRpdC5jCkBAIC0wLDAgKzEsMTg2IEBACisvKiAkSWQ6IGF1ZGl0LmMsdiAxLjYgMjAxMS8wMS8xNyAxMDoxNTozMCBkdHVja2VyIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgRGFycmVuIFR1Y2tlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBTU0hfQVVESVRfRVZFTlRTCisKKyNpbmNsdWRlICJhdWRpdC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgImhvc3RmaWxlLmgiCisjaW5jbHVkZSAiYXV0aC5oIgorCisvKgorICogQ2FyZSBtdXN0IGJlIHRha2VuIHdoZW4gdXNpbmcgdGhpcyBzaW5jZSBpdCBXSUxMIE5PVCBiZSBpbml0aWFsaXplZCB3aGVuCisgKiBhdWRpdF9jb25uZWN0aW9uX2Zyb20oKSBpcyBjYWxsZWQgYW5kIE1BWSBOT1QgYmUgaW5pdGlhbGl6ZWQgd2hlbgorICogYXVkaXRfZXZlbnQoQ09OTkVDVElPTl9BQkFORE9OKSBpcyBjYWxsZWQuICBUZXN0IGZvciBOVUxMIGJlZm9yZSB1c2luZy4KKyAqLworZXh0ZXJuIEF1dGhjdHh0ICp0aGVfYXV0aGN0eHQ7CisKKy8qIE1heWJlIGFkZCB0aGUgYXVkaXQgY2xhc3MgdG8gc3RydWN0IEF1dGhtZXRob2Q/ICovCitzc2hfYXVkaXRfZXZlbnRfdAorYXVkaXRfY2xhc3NpZnlfYXV0aChjb25zdCBjaGFyICptZXRob2QpCit7CisJaWYgKHN0cmNtcChtZXRob2QsICJub25lIikgPT0gMCkKKwkJcmV0dXJuIFNTSF9BVVRIX0ZBSUxfTk9ORTsKKwllbHNlIGlmIChzdHJjbXAobWV0aG9kLCAicGFzc3dvcmQiKSA9PSAwKQorCQlyZXR1cm4gU1NIX0FVVEhfRkFJTF9QQVNTV0Q7CisJZWxzZSBpZiAoc3RyY21wKG1ldGhvZCwgInB1YmxpY2tleSIpID09IDAgfHwKKwkgICAgc3RyY21wKG1ldGhvZCwgInJzYSIpID09IDApCisJCXJldHVybiBTU0hfQVVUSF9GQUlMX1BVQktFWTsKKwllbHNlIGlmIChzdHJuY21wKG1ldGhvZCwgImtleWJvYXJkLWludGVyYWN0aXZlIiwgMjApID09IDAgfHwKKwkgICAgc3RyY21wKG1ldGhvZCwgImNoYWxsZW5nZS1yZXNwb25zZSIpID09IDApCisJCXJldHVybiBTU0hfQVVUSF9GQUlMX0tCRElOVDsKKwllbHNlIGlmIChzdHJjbXAobWV0aG9kLCAiaG9zdGJhc2VkIikgPT0gMCB8fAorCSAgICBzdHJjbXAobWV0aG9kLCAicmhvc3RzLXJzYSIpID09IDApCisJCXJldHVybiBTU0hfQVVUSF9GQUlMX0hPU1RCQVNFRDsKKwllbHNlIGlmIChzdHJjbXAobWV0aG9kLCAiZ3NzYXBpLXdpdGgtbWljIikgPT0gMCkKKwkJcmV0dXJuIFNTSF9BVVRIX0ZBSUxfR1NTQVBJOworCWVsc2UKKwkJcmV0dXJuIFNTSF9BVURJVF9VTktOT1dOOworfQorCisvKiBoZWxwZXIgdG8gcmV0dXJuIHN1cHBsaWVkIHVzZXJuYW1lICovCitjb25zdCBjaGFyICoKK2F1ZGl0X3VzZXJuYW1lKHZvaWQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgdW5rbm93bnVzZXJbXSA9ICIodW5rbm93biB1c2VyKSI7CisJc3RhdGljIGNvbnN0IGNoYXIgaW52YWxpZHVzZXJbXSA9ICIoaW52YWxpZCB1c2VyKSI7CisKKwlpZiAodGhlX2F1dGhjdHh0ID09IE5VTEwgfHwgdGhlX2F1dGhjdHh0LT51c2VyID09IE5VTEwpCisJCXJldHVybiAodW5rbm93bnVzZXIpOworCWlmICghdGhlX2F1dGhjdHh0LT52YWxpZCkKKwkJcmV0dXJuIChpbnZhbGlkdXNlcik7CisJcmV0dXJuICh0aGVfYXV0aGN0eHQtPnVzZXIpOworfQorCitjb25zdCBjaGFyICoKK2F1ZGl0X2V2ZW50X2xvb2t1cChzc2hfYXVkaXRfZXZlbnRfdCBldikKK3sKKwlpbnQgaTsKKwlzdGF0aWMgc3RydWN0IGV2ZW50X2xvb2t1cF9zdHJ1Y3QgeworCQlzc2hfYXVkaXRfZXZlbnRfdCBldmVudDsKKwkJY29uc3QgY2hhciAqbmFtZTsKKwl9IGV2ZW50X2xvb2t1cFtdID0geworCQl7U1NIX0xPR0lOX0VYQ0VFRF9NQVhUUklFUywJIkxPR0lOX0VYQ0VFRF9NQVhUUklFUyJ9LAorCQl7U1NIX0xPR0lOX1JPT1RfREVOSUVELAkJIkxPR0lOX1JPT1RfREVOSUVEIn0sCisJCXtTU0hfQVVUSF9TVUNDRVNTLAkJIkFVVEhfU1VDQ0VTUyJ9LAorCQl7U1NIX0FVVEhfRkFJTF9OT05FLAkJIkFVVEhfRkFJTF9OT05FIn0sCisJCXtTU0hfQVVUSF9GQUlMX1BBU1NXRCwJCSJBVVRIX0ZBSUxfUEFTU1dEIn0sCisJCXtTU0hfQVVUSF9GQUlMX0tCRElOVCwJCSJBVVRIX0ZBSUxfS0JESU5UIn0sCisJCXtTU0hfQVVUSF9GQUlMX1BVQktFWSwJCSJBVVRIX0ZBSUxfUFVCS0VZIn0sCisJCXtTU0hfQVVUSF9GQUlMX0hPU1RCQVNFRCwJIkFVVEhfRkFJTF9IT1NUQkFTRUQifSwKKwkJe1NTSF9BVVRIX0ZBSUxfR1NTQVBJLAkJIkFVVEhfRkFJTF9HU1NBUEkifSwKKwkJe1NTSF9JTlZBTElEX1VTRVIsCQkiSU5WQUxJRF9VU0VSIn0sCisJCXtTU0hfTk9MT0dJTiwJCQkiTk9MT0dJTiJ9LAorCQl7U1NIX0NPTk5FQ1RJT05fQ0xPU0UsCQkiQ09OTkVDVElPTl9DTE9TRSJ9LAorCQl7U1NIX0NPTk5FQ1RJT05fQUJBTkRPTiwJIkNPTk5FQ1RJT05fQUJBTkRPTiJ9LAorCQl7U1NIX0FVRElUX1VOS05PV04sCQkiQVVESVRfVU5LTk9XTiJ9CisJfTsKKworCWZvciAoaSA9IDA7IGV2ZW50X2xvb2t1cFtpXS5ldmVudCAhPSBTU0hfQVVESVRfVU5LTk9XTjsgaSsrKQorCQlpZiAoZXZlbnRfbG9va3VwW2ldLmV2ZW50ID09IGV2KQorCQkJYnJlYWs7CisJcmV0dXJuKGV2ZW50X2xvb2t1cFtpXS5uYW1lKTsKK30KKworIyBpZm5kZWYgQ1VTVE9NX1NTSF9BVURJVF9FVkVOVFMKKy8qCisgKiBOdWxsIGltcGxlbWVudGF0aW9ucyBvZiBhdWRpdCBmdW5jdGlvbnMuCisgKiBUaGVzZSBnZXQgdXNlZCBpZiBTU0hfQVVESVRfRVZFTlRTIGlzIGRlZmluZWQgYnV0IG5vIGF1ZGl0IG1vZHVsZSBpcyBlbmFibGVkLgorICovCisKKy8qCisgKiBDYWxsZWQgYWZ0ZXIgYSBjb25uZWN0aW9uIGhhcyBiZWVuIGFjY2VwdGVkIGJ1dCBiZWZvcmUgYW55IGF1dGhlbnRpY2F0aW9uCisgKiBoYXMgYmVlbiBhdHRlbXB0ZWQuCisgKi8KK3ZvaWQKK2F1ZGl0X2Nvbm5lY3Rpb25fZnJvbShjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCkKK3sKKwlkZWJ1ZygiYXVkaXQgY29ubmVjdGlvbiBmcm9tICVzIHBvcnQgJWQgZXVpZCAlZCIsIGhvc3QsIHBvcnQsCisJICAgIChpbnQpZ2V0ZXVpZCgpKTsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIHZhcmlvdXMgZXZlbnRzIG9jY3VyIChzZWUgYXVkaXQuaCBmb3IgYSBsaXN0IG9mIHBvc3NpYmxlCisgKiBldmVudHMgYW5kIHdoYXQgdGhleSBtZWFuKS4KKyAqLwordm9pZAorYXVkaXRfZXZlbnQoc3NoX2F1ZGl0X2V2ZW50X3QgZXZlbnQpCit7CisJZGVidWcoImF1ZGl0IGV2ZW50IGV1aWQgJWQgdXNlciAlcyBldmVudCAlZCAoJXMpIiwgZ2V0ZXVpZCgpLAorCSAgICBhdWRpdF91c2VybmFtZSgpLCBldmVudCwgYXVkaXRfZXZlbnRfbG9va3VwKGV2ZW50KSk7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiBhIHVzZXIgc2Vzc2lvbiBpcyBzdGFydGVkLiAgQXJndW1lbnQgaXMgdGhlIHR0eSBhbGxvY2F0ZWQgdG8KKyAqIHRoZSBzZXNzaW9uLCBvciBOVUxMIGlmIG5vIHR0eSB3YXMgYWxsb2NhdGVkLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgaWYgbXVsdGlwbGUgc2Vzc2lvbnMgYXJlIHVzZWQKKyAqIHdpdGhpbiBhIHNpbmdsZSBjb25uZWN0aW9uLgorICovCit2b2lkCithdWRpdF9zZXNzaW9uX29wZW4oc3RydWN0IGxvZ2luaW5mbyAqbGkpCit7CisJY29uc3QgY2hhciAqdCA9IGxpLT5saW5lID8gbGktPmxpbmUgOiAiKG5vIHR0eSkiOworCisJZGVidWcoImF1ZGl0IHNlc3Npb24gb3BlbiBldWlkICVkIHVzZXIgJXMgdHR5IG5hbWUgJXMiLCBnZXRldWlkKCksCisJICAgIGF1ZGl0X3VzZXJuYW1lKCksIHQpOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gYSB1c2VyIHNlc3Npb24gaXMgY2xvc2VkLiAgQXJndW1lbnQgaXMgdGhlIHR0eSBhbGxvY2F0ZWQgdG8KKyAqIHRoZSBzZXNzaW9uLCBvciBOVUxMIGlmIG5vIHR0eSB3YXMgYWxsb2NhdGVkLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgaWYgbXVsdGlwbGUgc2Vzc2lvbnMgYXJlIHVzZWQKKyAqIHdpdGhpbiBhIHNpbmdsZSBjb25uZWN0aW9uLgorICovCit2b2lkCithdWRpdF9zZXNzaW9uX2Nsb3NlKHN0cnVjdCBsb2dpbmluZm8gKmxpKQoreworCWNvbnN0IGNoYXIgKnQgPSBsaS0+bGluZSA/IGxpLT5saW5lIDogIihubyB0dHkpIjsKKworCWRlYnVnKCJhdWRpdCBzZXNzaW9uIGNsb3NlIGV1aWQgJWQgdXNlciAlcyB0dHkgbmFtZSAlcyIsIGdldGV1aWQoKSwKKwkgICAgYXVkaXRfdXNlcm5hbWUoKSwgdCk7Cit9CisKKy8qCisgKiBUaGlzIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSB1c2VyIHJ1bnMgYSBub24taW50ZXJhY3RpdmUgY29tbWFuZC4gIE5vdGUgdGhhdAorICogaXQgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBzaW5nbGUgY29ubmVjdGlvbiBzaW5jZSBTU0gyIGFsbG93cworICogbXVsdGlwbGUgc2Vzc2lvbnMgd2l0aGluIGEgc2luZ2xlIGNvbm5lY3Rpb24uCisgKi8KK3ZvaWQKK2F1ZGl0X3J1bl9jb21tYW5kKGNvbnN0IGNoYXIgKmNvbW1hbmQpCit7CisJZGVidWcoImF1ZGl0IHJ1biBjb21tYW5kIGV1aWQgJWQgdXNlciAlcyBjb21tYW5kICclLjIwMHMnIiwgZ2V0ZXVpZCgpLAorCSAgICBhdWRpdF91c2VybmFtZSgpLCBjb21tYW5kKTsKK30KKyMgZW5kaWYgIC8qICFkZWZpbmVkIENVU1RPTV9TU0hfQVVESVRfRVZFTlRTICovCisjZW5kaWYgLyogU1NIX0FVRElUX0VWRU5UUyAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9hdWRpdC5oIGIvb3BlbnNzaC02LjBwMS9hdWRpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZWRlNWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2F1ZGl0LmgKQEAgLTAsMCArMSw1NyBAQAorLyogJElkOiBhdWRpdC5oLHYgMS40IDIwMTEvMDEvMTcgMTA6MTU6MzAgZHR1Y2tlciBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IERhcnJlbiBUdWNrZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9TU0hfQVVESVRfSAorIyBkZWZpbmUgX1NTSF9BVURJVF9ICisKKyNpbmNsdWRlICJsb2dpbnJlYy5oIgorCitlbnVtIHNzaF9hdWRpdF9ldmVudF90eXBlIHsKKwlTU0hfTE9HSU5fRVhDRUVEX01BWFRSSUVTLAorCVNTSF9MT0dJTl9ST09UX0RFTklFRCwKKwlTU0hfQVVUSF9TVUNDRVNTLAorCVNTSF9BVVRIX0ZBSUxfTk9ORSwKKwlTU0hfQVVUSF9GQUlMX1BBU1NXRCwKKwlTU0hfQVVUSF9GQUlMX0tCRElOVCwJLyoga2V5Ym9hcmQtaW50ZXJhY3RpdmUgb3IgY2hhbGxlbmdlLXJlc3BvbnNlICovCisJU1NIX0FVVEhfRkFJTF9QVUJLRVksCS8qIHNzaDIgcHVia2V5IG9yIHNzaDEgcnNhICovCisJU1NIX0FVVEhfRkFJTF9IT1NUQkFTRUQsCS8qIHNzaDIgaG9zdGJhc2VkIG9yIHNzaDEgcmhvc3RzcnNhICovCisJU1NIX0FVVEhfRkFJTF9HU1NBUEksCisJU1NIX0lOVkFMSURfVVNFUiwKKwlTU0hfTk9MT0dJTiwJCS8qIGRlbmllZCBieSAvZXRjL25vbG9naW4sIG5vdCBpbXBsZW1lbnRlZCAqLworCVNTSF9DT05ORUNUSU9OX0NMT1NFLAkvKiBjbG9zZWQgYWZ0ZXIgYXR0ZW1wdGluZyBhdXRoIG9yIHNlc3Npb24gKi8KKwlTU0hfQ09OTkVDVElPTl9BQkFORE9OLAkvKiBjbG9zZWQgd2l0aG91dCBjb21wbGV0aW5nIGF1dGggKi8KKwlTU0hfQVVESVRfVU5LTk9XTgorfTsKK3R5cGVkZWYgZW51bSBzc2hfYXVkaXRfZXZlbnRfdHlwZSBzc2hfYXVkaXRfZXZlbnRfdDsKKwordm9pZAlhdWRpdF9jb25uZWN0aW9uX2Zyb20oY29uc3QgY2hhciAqLCBpbnQpOwordm9pZAlhdWRpdF9ldmVudChzc2hfYXVkaXRfZXZlbnRfdCk7Cit2b2lkCWF1ZGl0X3Nlc3Npb25fb3BlbihzdHJ1Y3QgbG9naW5pbmZvICopOwordm9pZAlhdWRpdF9zZXNzaW9uX2Nsb3NlKHN0cnVjdCBsb2dpbmluZm8gKik7Cit2b2lkCWF1ZGl0X3J1bl9jb21tYW5kKGNvbnN0IGNoYXIgKik7Citzc2hfYXVkaXRfZXZlbnRfdCBhdWRpdF9jbGFzc2lmeV9hdXRoKGNvbnN0IGNoYXIgKik7CisKKyNlbmRpZiAvKiBfU1NIX0FVRElUX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvYXV0aC1ic2RhdXRoLmMgYi9vcGVuc3NoLTYuMHAxL2F1dGgtYnNkYXV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzI2MmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2F1dGgtYnNkYXV0aC5jCkBAIC0wLDAgKzEsMTM4IEBACisvKiAkT3BlbkJTRDogYXV0aC1ic2RhdXRoLmMsdiAxLjExIDIwMDcvMDkvMjEgMDg6MTU6MjkgZGptIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpZmRlZiBCU0RfQVVUSAorI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJob3N0ZmlsZS5oIgorI2luY2x1ZGUgImF1dGguaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpZmRlZiBHU1NBUEkKKyNpbmNsdWRlICJzc2gtZ3NzLmgiCisjZW5kaWYKKyNpbmNsdWRlICJtb25pdG9yX3dyYXAuaCIKKworc3RhdGljIHZvaWQgKgorYnNkYXV0aF9pbml0X2N0eChBdXRoY3R4dCAqYXV0aGN0eHQpCit7CisJcmV0dXJuIGF1dGhjdHh0OworfQorCitpbnQKK2JzZGF1dGhfcXVlcnkodm9pZCAqY3R4LCBjaGFyICoqbmFtZSwgY2hhciAqKmluZm90eHQsCisgICB1X2ludCAqbnVtcHJvbXB0cywgY2hhciAqKipwcm9tcHRzLCB1X2ludCAqKmVjaG9fb24pCit7CisJQXV0aGN0eHQgKmF1dGhjdHh0ID0gY3R4OworCWNoYXIgKmNoYWxsZW5nZSA9IE5VTEw7CisKKwlpZiAoYXV0aGN0eHQtPmFzICE9IE5VTEwpIHsKKwkJZGVidWcyKCJic2RhdXRoX3F1ZXJ5OiB0cnkgcmV1c2Ugc2Vzc2lvbiIpOworCQljaGFsbGVuZ2UgPSBhdXRoX2dldGl0ZW0oYXV0aGN0eHQtPmFzLCBBVVRIVl9DSEFMTEVOR0UpOworCQlpZiAoY2hhbGxlbmdlID09IE5VTEwpIHsKKwkJCWF1dGhfY2xvc2UoYXV0aGN0eHQtPmFzKTsKKwkJCWF1dGhjdHh0LT5hcyA9IE5VTEw7CisJCX0KKwl9CisKKwlpZiAoY2hhbGxlbmdlID09IE5VTEwpIHsKKwkJZGVidWcyKCJic2RhdXRoX3F1ZXJ5OiBuZXcgYnNkIGF1dGggc2Vzc2lvbiIpOworCQlkZWJ1ZzMoImJzZGF1dGhfcXVlcnk6IHN0eWxlICVzIiwKKwkJICAgIGF1dGhjdHh0LT5zdHlsZSA/IGF1dGhjdHh0LT5zdHlsZSA6ICI8ZGVmYXVsdD4iKTsKKwkJYXV0aGN0eHQtPmFzID0gYXV0aF91c2VyY2hhbGxlbmdlKGF1dGhjdHh0LT51c2VyLAorCQkgICAgYXV0aGN0eHQtPnN0eWxlLCAiYXV0aC1zc2giLCAmY2hhbGxlbmdlKTsKKwkJaWYgKGF1dGhjdHh0LT5hcyA9PSBOVUxMKQorCQkJY2hhbGxlbmdlID0gTlVMTDsKKwkJZGVidWcyKCJic2RhdXRoX3F1ZXJ5OiA8JXM+IiwgY2hhbGxlbmdlID8gY2hhbGxlbmdlIDogImVtcHR5Iik7CisJfQorCisJaWYgKGNoYWxsZW5nZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwkqbmFtZSA9IHhzdHJkdXAoIiIpOworCSppbmZvdHh0ID0geHN0cmR1cCgiIik7CisJKm51bXByb21wdHMgPSAxOworCSpwcm9tcHRzID0geGNhbGxvYygqbnVtcHJvbXB0cywgc2l6ZW9mKGNoYXIgKikpOworCSplY2hvX29uID0geGNhbGxvYygqbnVtcHJvbXB0cywgc2l6ZW9mKHVfaW50KSk7CisJKCpwcm9tcHRzKVswXSA9IHhzdHJkdXAoY2hhbGxlbmdlKTsKKworCXJldHVybiAwOworfQorCitpbnQKK2JzZGF1dGhfcmVzcG9uZCh2b2lkICpjdHgsIHVfaW50IG51bXJlc3BvbnNlcywgY2hhciAqKnJlc3BvbnNlcykKK3sKKwlBdXRoY3R4dCAqYXV0aGN0eHQgPSBjdHg7CisJaW50IGF1dGhvazsKKworCWlmICghYXV0aGN0eHQtPnZhbGlkKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoYXV0aGN0eHQtPmFzID09IDApCisJCWVycm9yKCJic2RhdXRoX3Jlc3BvbmQ6IG5vIGJzZCBhdXRoIHNlc3Npb24iKTsKKworCWlmIChudW1yZXNwb25zZXMgIT0gMSkKKwkJcmV0dXJuIC0xOworCisJYXV0aG9rID0gYXV0aF91c2VycmVzcG9uc2UoYXV0aGN0eHQtPmFzLCByZXNwb25zZXNbMF0sIDApOworCWF1dGhjdHh0LT5hcyA9IE5VTEw7CisJZGVidWczKCJic2RhdXRoX3Jlc3BvbmQ6IDwlcz4gPSA8JWQ+IiwgcmVzcG9uc2VzWzBdLCBhdXRob2spOworCisJcmV0dXJuIChhdXRob2sgPT0gMCkgPyAtMSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkCitic2RhdXRoX2ZyZWVfY3R4KHZvaWQgKmN0eCkKK3sKKwlBdXRoY3R4dCAqYXV0aGN0eHQgPSBjdHg7CisKKwlpZiAoYXV0aGN0eHQgJiYgYXV0aGN0eHQtPmFzKSB7CisJCWF1dGhfY2xvc2UoYXV0aGN0eHQtPmFzKTsKKwkJYXV0aGN0eHQtPmFzID0gTlVMTDsKKwl9Cit9CisKK0tiZGludERldmljZSBic2RhdXRoX2RldmljZSA9IHsKKwkiYnNkYXV0aCIsCisJYnNkYXV0aF9pbml0X2N0eCwKKwlic2RhdXRoX3F1ZXJ5LAorCWJzZGF1dGhfcmVzcG9uZCwKKwlic2RhdXRoX2ZyZWVfY3R4Cit9OworCitLYmRpbnREZXZpY2UgbW1fYnNkYXV0aF9kZXZpY2UgPSB7CisJImJzZGF1dGgiLAorCWJzZGF1dGhfaW5pdF9jdHgsCisJbW1fYnNkYXV0aF9xdWVyeSwKKwltbV9ic2RhdXRoX3Jlc3BvbmQsCisJYnNkYXV0aF9mcmVlX2N0eAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9hdXRoLWNoYWxsLmMgYi9vcGVuc3NoLTYuMHAxL2F1dGgtY2hhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTliMWVhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9hdXRoLWNoYWxsLmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qICRPcGVuQlNEOiBhdXRoLWNoYWxsLmMsdiAxLjEyIDIwMDYvMDgvMDMgMDM6MzQ6NDEgZGVyYWFkdCBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgImhvc3RmaWxlLmgiCisjaW5jbHVkZSAiYXV0aC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInNlcnZjb25mLmgiCisKKy8qIGxpbWl0ZWQgcHJvdG9jb2wgdjEgaW50ZXJmYWNlIHRvIGtiZC1pbnRlcmFjdGl2ZSBhdXRoZW50aWNhdGlvbiAqLworCitleHRlcm4gS2JkaW50RGV2aWNlICpkZXZpY2VzW107CitzdGF0aWMgS2JkaW50RGV2aWNlICpkZXZpY2U7CitleHRlcm4gU2VydmVyT3B0aW9ucyBvcHRpb25zOworCitjaGFyICoKK2dldF9jaGFsbGVuZ2UoQXV0aGN0eHQgKmF1dGhjdHh0KQoreworCWNoYXIgKmNoYWxsZW5nZSwgKm5hbWUsICppbmZvLCAqKnByb21wdHM7CisJdV9pbnQgaSwgbnVtcHJvbXB0czsKKwl1X2ludCAqZWNob19vbjsKKworI2lmZGVmIFVTRV9QQU0KKwlpZiAoIW9wdGlvbnMudXNlX3BhbSkKKwkJcmVtb3ZlX2tiZGludF9kZXZpY2UoInBhbSIpOworI2VuZGlmCisKKwlkZXZpY2UgPSBkZXZpY2VzWzBdOyAvKiB3ZSBhbHdheXMgdXNlIHRoZSAxc3QgZGV2aWNlIGZvciBwcm90b2NvbCAxICovCisJaWYgKGRldmljZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKGF1dGhjdHh0LT5rYmRpbnRjdHh0ID0gZGV2aWNlLT5pbml0X2N0eChhdXRoY3R4dCkpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWlmIChkZXZpY2UtPnF1ZXJ5KGF1dGhjdHh0LT5rYmRpbnRjdHh0LCAmbmFtZSwgJmluZm8sCisJICAgICZudW1wcm9tcHRzLCAmcHJvbXB0cywgJmVjaG9fb24pKSB7CisJCWRldmljZS0+ZnJlZV9jdHgoYXV0aGN0eHQtPmtiZGludGN0eHQpOworCQlhdXRoY3R4dC0+a2JkaW50Y3R4dCA9IE5VTEw7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAobnVtcHJvbXB0cyA8IDEpCisJCWZhdGFsKCJnZXRfY2hhbGxlbmdlOiBudW1wcm9tcHRzIDwgMSIpOworCWNoYWxsZW5nZSA9IHhzdHJkdXAocHJvbXB0c1swXSk7CisJZm9yIChpID0gMDsgaSA8IG51bXByb21wdHM7IGkrKykKKwkJeGZyZWUocHJvbXB0c1tpXSk7CisJeGZyZWUocHJvbXB0cyk7CisJeGZyZWUobmFtZSk7CisJeGZyZWUoZWNob19vbik7CisJeGZyZWUoaW5mbyk7CisKKwlyZXR1cm4gKGNoYWxsZW5nZSk7Cit9CitpbnQKK3ZlcmlmeV9yZXNwb25zZShBdXRoY3R4dCAqYXV0aGN0eHQsIGNvbnN0IGNoYXIgKnJlc3BvbnNlKQoreworCWNoYXIgKnJlc3BbMV0sICpuYW1lLCAqaW5mbywgKipwcm9tcHRzOworCXVfaW50IGksIG51bXByb21wdHMsICplY2hvX29uOworCWludCBhdXRoZW50aWNhdGVkID0gMDsKKworCWlmIChkZXZpY2UgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaWYgKGF1dGhjdHh0LT5rYmRpbnRjdHh0ID09IE5VTEwpCisJCXJldHVybiAwOworCXJlc3BbMF0gPSAoY2hhciAqKXJlc3BvbnNlOworCXN3aXRjaCAoZGV2aWNlLT5yZXNwb25kKGF1dGhjdHh0LT5rYmRpbnRjdHh0LCAxLCByZXNwKSkgeworCWNhc2UgMDogLyogU3VjY2VzcyAqLworCQlhdXRoZW50aWNhdGVkID0gMTsKKwkJYnJlYWs7CisJY2FzZSAxOiAvKiBQb3N0cG9uZWQgLSByZXRyeSB3aXRoIGVtcHR5IHF1ZXJ5IGZvciBQQU0gKi8KKwkJaWYgKChkZXZpY2UtPnF1ZXJ5KGF1dGhjdHh0LT5rYmRpbnRjdHh0LCAmbmFtZSwgJmluZm8sCisJCSAgICAmbnVtcHJvbXB0cywgJnByb21wdHMsICZlY2hvX29uKSkgIT0gMCkKKwkJCWJyZWFrOworCQlpZiAobnVtcHJvbXB0cyA9PSAwICYmCisJCSAgICBkZXZpY2UtPnJlc3BvbmQoYXV0aGN0eHQtPmtiZGludGN0eHQsIDAsIHJlc3ApID09IDApCisJCQlhdXRoZW50aWNhdGVkID0gMTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnVtcHJvbXB0czsgaSsrKQorCQkJeGZyZWUocHJvbXB0c1tpXSk7CisJCXhmcmVlKHByb21wdHMpOworCQl4ZnJlZShuYW1lKTsKKwkJeGZyZWUoZWNob19vbik7CisJCXhmcmVlKGluZm8pOworCQlicmVhazsKKwl9CisJZGV2aWNlLT5mcmVlX2N0eChhdXRoY3R4dC0+a2JkaW50Y3R4dCk7CisJYXV0aGN0eHQtPmtiZGludGN0eHQgPSBOVUxMOworCXJldHVybiBhdXRoZW50aWNhdGVkOworfQordm9pZAorYWJhbmRvbl9jaGFsbGVuZ2VfcmVzcG9uc2UoQXV0aGN0eHQgKmF1dGhjdHh0KQoreworCWlmIChhdXRoY3R4dC0+a2JkaW50Y3R4dCAhPSBOVUxMKSB7CisJCWRldmljZS0+ZnJlZV9jdHgoYXV0aGN0eHQtPmtiZGludGN0eHQpOworCQlhdXRoY3R4dC0+a2JkaW50Y3R4dCA9IE5VTEw7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9hdXRoLWtyYjUuYyBiL29wZW5zc2gtNi4wcDEvYXV0aC1rcmI1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxOWZlMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvYXV0aC1rcmI1LmMKQEAgLTAsMCArMSwyNTYgQEAKKy8qICRPcGVuQlNEOiBhdXRoLWtyYjUuYyx2IDEuMTkgMjAwNi8wOC8wMyAwMzozNDo0MSBkZXJhYWR0IEV4cCAkICovCisvKgorICogICAgS2VyYmVyb3MgdjUgYXV0aGVudGljYXRpb24gYW5kIHRpY2tldC1wYXNzaW5nIHJvdXRpbmVzLgorICoKKyAqICRGcmVlQlNEOiBzcmMvY3J5cHRvL29wZW5zc2gvYXV0aC1rcmI1LmMsdiAxLjYgMjAwMS8wMi8xMyAxNjo1ODowNCBhc3NhciBFeHAgJAorICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIERhbmllbCBLb3VyaWwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgInNzaC5oIgorI2luY2x1ZGUgInNzaDEuaCIKKyNpbmNsdWRlICJwYWNrZXQuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJzZXJ2Y29uZi5oIgorI2luY2x1ZGUgInVpZHN3YXAuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJob3N0ZmlsZS5oIgorI2luY2x1ZGUgImF1dGguaCIKKworI2lmZGVmIEtSQjUKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGtyYjUuaD4KKworZXh0ZXJuIFNlcnZlck9wdGlvbnMJIG9wdGlvbnM7CisKK3N0YXRpYyBpbnQKK2tyYjVfaW5pdCh2b2lkICpjb250ZXh0KQoreworCUF1dGhjdHh0ICphdXRoY3R4dCA9IChBdXRoY3R4dCAqKWNvbnRleHQ7CisJa3JiNV9lcnJvcl9jb2RlIHByb2JsZW07CisKKwlpZiAoYXV0aGN0eHQtPmtyYjVfY3R4ID09IE5VTEwpIHsKKwkJcHJvYmxlbSA9IGtyYjVfaW5pdF9jb250ZXh0KCZhdXRoY3R4dC0+a3JiNV9jdHgpOworCQlpZiAocHJvYmxlbSkKKwkJCXJldHVybiAocHJvYmxlbSk7CisJfQorCXJldHVybiAoMCk7Cit9CisKK2ludAorYXV0aF9rcmI1X3Bhc3N3b3JkKEF1dGhjdHh0ICphdXRoY3R4dCwgY29uc3QgY2hhciAqcGFzc3dvcmQpCit7CisjaWZuZGVmIEhFSU1EQUwKKwlrcmI1X2NyZWRzIGNyZWRzOworCWtyYjVfcHJpbmNpcGFsIHNlcnZlcjsKKyNlbmRpZgorCWtyYjVfZXJyb3JfY29kZSBwcm9ibGVtOworCWtyYjVfY2NhY2hlIGNjYWNoZSA9IE5VTEw7CisJaW50IGxlbjsKKwljaGFyICpjbGllbnQsICpwbGF0Zm9ybV9jbGllbnQ7CisKKwkvKiBnZXQgcGxhdGZvcm0tc3BlY2lmaWMga2VyYmVyb3MgY2xpZW50IHByaW5jaXBhbCBuYW1lIChpZiBpdCBleGlzdHMpICovCisJcGxhdGZvcm1fY2xpZW50ID0gcGxhdGZvcm1fa3JiNV9nZXRfcHJpbmNpcGFsX25hbWUoYXV0aGN0eHQtPnB3LT5wd19uYW1lKTsKKwljbGllbnQgPSBwbGF0Zm9ybV9jbGllbnQgPyBwbGF0Zm9ybV9jbGllbnQgOiBhdXRoY3R4dC0+cHctPnB3X25hbWU7CisKKwl0ZW1wb3JhcmlseV91c2VfdWlkKGF1dGhjdHh0LT5wdyk7CisKKwlwcm9ibGVtID0ga3JiNV9pbml0KGF1dGhjdHh0KTsKKwlpZiAocHJvYmxlbSkKKwkJZ290byBvdXQ7CisKKwlwcm9ibGVtID0ga3JiNV9wYXJzZV9uYW1lKGF1dGhjdHh0LT5rcmI1X2N0eCwgY2xpZW50LAorCQkgICAgJmF1dGhjdHh0LT5rcmI1X3VzZXIpOworCWlmIChwcm9ibGVtKQorCQlnb3RvIG91dDsKKworI2lmZGVmIEhFSU1EQUwKKwlwcm9ibGVtID0ga3JiNV9jY19nZW5fbmV3KGF1dGhjdHh0LT5rcmI1X2N0eCwgJmtyYjVfbWNjX29wcywgJmNjYWNoZSk7CisJaWYgKHByb2JsZW0pCisJCWdvdG8gb3V0OworCisJcHJvYmxlbSA9IGtyYjVfY2NfaW5pdGlhbGl6ZShhdXRoY3R4dC0+a3JiNV9jdHgsIGNjYWNoZSwKKwkJYXV0aGN0eHQtPmtyYjVfdXNlcik7CisJaWYgKHByb2JsZW0pCisJCWdvdG8gb3V0OworCisJcmVzdG9yZV91aWQoKTsKKworCXByb2JsZW0gPSBrcmI1X3ZlcmlmeV91c2VyKGF1dGhjdHh0LT5rcmI1X2N0eCwgYXV0aGN0eHQtPmtyYjVfdXNlciwKKwkgICAgY2NhY2hlLCBwYXNzd29yZCwgMSwgTlVMTCk7CisKKwl0ZW1wb3JhcmlseV91c2VfdWlkKGF1dGhjdHh0LT5wdyk7CisKKwlpZiAocHJvYmxlbSkKKwkJZ290byBvdXQ7CisKKwlwcm9ibGVtID0ga3JiNV9jY19nZW5fbmV3KGF1dGhjdHh0LT5rcmI1X2N0eCwgJmtyYjVfZmNjX29wcywKKwkgICAgJmF1dGhjdHh0LT5rcmI1X2Z3ZF9jY2FjaGUpOworCWlmIChwcm9ibGVtKQorCQlnb3RvIG91dDsKKworCXByb2JsZW0gPSBrcmI1X2NjX2NvcHlfY2FjaGUoYXV0aGN0eHQtPmtyYjVfY3R4LCBjY2FjaGUsCisJICAgIGF1dGhjdHh0LT5rcmI1X2Z3ZF9jY2FjaGUpOworCWtyYjVfY2NfZGVzdHJveShhdXRoY3R4dC0+a3JiNV9jdHgsIGNjYWNoZSk7CisJY2NhY2hlID0gTlVMTDsKKwlpZiAocHJvYmxlbSkKKwkJZ290byBvdXQ7CisKKyNlbHNlCisJcHJvYmxlbSA9IGtyYjVfZ2V0X2luaXRfY3JlZHNfcGFzc3dvcmQoYXV0aGN0eHQtPmtyYjVfY3R4LCAmY3JlZHMsCisJICAgIGF1dGhjdHh0LT5rcmI1X3VzZXIsIChjaGFyICopcGFzc3dvcmQsIE5VTEwsIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworCWlmIChwcm9ibGVtKQorCQlnb3RvIG91dDsKKworCXByb2JsZW0gPSBrcmI1X3NuYW1lX3RvX3ByaW5jaXBhbChhdXRoY3R4dC0+a3JiNV9jdHgsIE5VTEwsIE5VTEwsCisJICAgIEtSQjVfTlRfU1JWX0hTVCwgJnNlcnZlcik7CisJaWYgKHByb2JsZW0pCisJCWdvdG8gb3V0OworCisJcmVzdG9yZV91aWQoKTsKKwlwcm9ibGVtID0ga3JiNV92ZXJpZnlfaW5pdF9jcmVkcyhhdXRoY3R4dC0+a3JiNV9jdHgsICZjcmVkcywgc2VydmVyLAorCSAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKwlrcmI1X2ZyZWVfcHJpbmNpcGFsKGF1dGhjdHh0LT5rcmI1X2N0eCwgc2VydmVyKTsKKwl0ZW1wb3JhcmlseV91c2VfdWlkKGF1dGhjdHh0LT5wdyk7CisJaWYgKHByb2JsZW0pCisJCWdvdG8gb3V0OworCisJaWYgKCFrcmI1X2t1c2Vyb2soYXV0aGN0eHQtPmtyYjVfY3R4LCBhdXRoY3R4dC0+a3JiNV91c2VyLCBjbGllbnQpKSB7CisJCXByb2JsZW0gPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJcHJvYmxlbSA9IHNzaF9rcmI1X2NjX2dlbihhdXRoY3R4dC0+a3JiNV9jdHgsICZhdXRoY3R4dC0+a3JiNV9md2RfY2NhY2hlKTsKKwlpZiAocHJvYmxlbSkKKwkJZ290byBvdXQ7CisKKwlwcm9ibGVtID0ga3JiNV9jY19pbml0aWFsaXplKGF1dGhjdHh0LT5rcmI1X2N0eCwgYXV0aGN0eHQtPmtyYjVfZndkX2NjYWNoZSwKKwkJCQkgICAgIGF1dGhjdHh0LT5rcmI1X3VzZXIpOworCWlmIChwcm9ibGVtKQorCQlnb3RvIG91dDsKKworCXByb2JsZW09IGtyYjVfY2Nfc3RvcmVfY3JlZChhdXRoY3R4dC0+a3JiNV9jdHgsIGF1dGhjdHh0LT5rcmI1X2Z3ZF9jY2FjaGUsCisJCQkJICZjcmVkcyk7CisJaWYgKHByb2JsZW0pCisJCWdvdG8gb3V0OworI2VuZGlmCisKKwlhdXRoY3R4dC0+a3JiNV90aWNrZXRfZmlsZSA9IChjaGFyICopa3JiNV9jY19nZXRfbmFtZShhdXRoY3R4dC0+a3JiNV9jdHgsIGF1dGhjdHh0LT5rcmI1X2Z3ZF9jY2FjaGUpOworCisJbGVuID0gc3RybGVuKGF1dGhjdHh0LT5rcmI1X3RpY2tldF9maWxlKSArIDY7CisJYXV0aGN0eHQtPmtyYjVfY2NuYW1lID0geG1hbGxvYyhsZW4pOworCXNucHJpbnRmKGF1dGhjdHh0LT5rcmI1X2NjbmFtZSwgbGVuLCAiRklMRTolcyIsCisJICAgIGF1dGhjdHh0LT5rcmI1X3RpY2tldF9maWxlKTsKKworI2lmZGVmIFVTRV9QQU0KKwlpZiAob3B0aW9ucy51c2VfcGFtKQorCQlkb19wYW1fcHV0ZW52KCJLUkI1Q0NOQU1FIiwgYXV0aGN0eHQtPmtyYjVfY2NuYW1lKTsKKyNlbmRpZgorCisgb3V0OgorCXJlc3RvcmVfdWlkKCk7CisJCisJaWYgKHBsYXRmb3JtX2NsaWVudCAhPSBOVUxMKQorCQl4ZnJlZShwbGF0Zm9ybV9jbGllbnQpOworCisJaWYgKHByb2JsZW0pIHsKKwkJaWYgKGNjYWNoZSkKKwkJCWtyYjVfY2NfZGVzdHJveShhdXRoY3R4dC0+a3JiNV9jdHgsIGNjYWNoZSk7CisKKwkJaWYgKGF1dGhjdHh0LT5rcmI1X2N0eCAhPSBOVUxMICYmIHByb2JsZW0hPS0xKQorCQkJZGVidWcoIktlcmJlcm9zIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIGZhaWxlZDogJXMiLAorCQkJICAgIGtyYjVfZ2V0X2Vycl90ZXh0KGF1dGhjdHh0LT5rcmI1X2N0eCwgcHJvYmxlbSkpOworCQllbHNlCisJCQlkZWJ1ZygiS2VyYmVyb3MgcGFzc3dvcmQgYXV0aGVudGljYXRpb24gZmFpbGVkOiAlZCIsCisJCQkgICAgcHJvYmxlbSk7CisKKwkJa3JiNV9jbGVhbnVwX3Byb2MoYXV0aGN0eHQpOworCisJCWlmIChvcHRpb25zLmtlcmJlcm9zX29yX2xvY2FsX3Bhc3N3ZCkKKwkJCXJldHVybiAoLTEpOworCQllbHNlCisJCQlyZXR1cm4gKDApOworCX0KKwlyZXR1cm4gKGF1dGhjdHh0LT52YWxpZCA/IDEgOiAwKTsKK30KKwordm9pZAora3JiNV9jbGVhbnVwX3Byb2MoQXV0aGN0eHQgKmF1dGhjdHh0KQoreworCWRlYnVnKCJrcmI1X2NsZWFudXBfcHJvYyBjYWxsZWQiKTsKKwlpZiAoYXV0aGN0eHQtPmtyYjVfZndkX2NjYWNoZSkgeworCQlrcmI1X2NjX2Rlc3Ryb3koYXV0aGN0eHQtPmtyYjVfY3R4LCBhdXRoY3R4dC0+a3JiNV9md2RfY2NhY2hlKTsKKwkJYXV0aGN0eHQtPmtyYjVfZndkX2NjYWNoZSA9IE5VTEw7CisJfQorCWlmIChhdXRoY3R4dC0+a3JiNV91c2VyKSB7CisJCWtyYjVfZnJlZV9wcmluY2lwYWwoYXV0aGN0eHQtPmtyYjVfY3R4LCBhdXRoY3R4dC0+a3JiNV91c2VyKTsKKwkJYXV0aGN0eHQtPmtyYjVfdXNlciA9IE5VTEw7CisJfQorCWlmIChhdXRoY3R4dC0+a3JiNV9jdHgpIHsKKwkJa3JiNV9mcmVlX2NvbnRleHQoYXV0aGN0eHQtPmtyYjVfY3R4KTsKKwkJYXV0aGN0eHQtPmtyYjVfY3R4ID0gTlVMTDsKKwl9Cit9CisKKyNpZm5kZWYgSEVJTURBTAora3JiNV9lcnJvcl9jb2RlCitzc2hfa3JiNV9jY19nZW4oa3JiNV9jb250ZXh0IGN0eCwga3JiNV9jY2FjaGUgKmNjYWNoZSkgeworCWludCB0bXBmZCwgcmV0OworCWNoYXIgY2NuYW1lWzQwXTsKKwltb2RlX3Qgb2xkX3VtYXNrOworCisJcmV0ID0gc25wcmludGYoY2NuYW1lLCBzaXplb2YoY2NuYW1lKSwKKwkgICAgIkZJTEU6L3RtcC9rcmI1Y2NfJWRfWFhYWFhYWFhYWCIsIGdldGV1aWQoKSk7CisJaWYgKHJldCA8IDAgfHwgKHNpemVfdClyZXQgPj0gc2l6ZW9mKGNjbmFtZSkpCisJCXJldHVybiBFTk9NRU07CisKKwlvbGRfdW1hc2sgPSB1bWFzaygwMTc3KTsKKwl0bXBmZCA9IG1rc3RlbXAoY2NuYW1lICsgc3RybGVuKCJGSUxFOiIpKTsKKwl1bWFzayhvbGRfdW1hc2spOworCWlmICh0bXBmZCA9PSAtMSkgeworCQlsb2dpdCgibWtzdGVtcCgpOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gZXJybm87CisJfQorCisJaWYgKGZjaG1vZCh0bXBmZCxTX0lSVVNSIHwgU19JV1VTUikgPT0gLTEpIHsKKwkJbG9naXQoImZjaG1vZCgpOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCQljbG9zZSh0bXBmZCk7CisJCXJldHVybiBlcnJubzsKKwl9CisJY2xvc2UodG1wZmQpOworCisJcmV0dXJuIChrcmI1X2NjX3Jlc29sdmUoY3R4LCBjY25hbWUsIGNjYWNoZSkpOworfQorI2VuZGlmIC8qICFIRUlNREFMICovCisjZW5kaWYgLyogS1JCNSAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9hdXRoLW9wdGlvbnMuYyBiL29wZW5zc2gtNi4wcDEvYXV0aC1vcHRpb25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2N2JkOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvYXV0aC1vcHRpb25zLmMKQEAgLTAsMCArMSw2MzUgQEAKKy8qICRPcGVuQlNEOiBhdXRoLW9wdGlvbnMuYyx2IDEuNTYgMjAxMS8xMC8xOCAwNDo1ODoyNiBkam0gRXhwICQgKi8KKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9zeXMtcXVldWUuaCIKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAibWF0Y2guaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJjYW5vaG9zdC5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImNoYW5uZWxzLmgiCisjaW5jbHVkZSAic2VydmNvbmYuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAia2V5LmgiCisjaW5jbHVkZSAiYXV0aC1vcHRpb25zLmgiCisjaW5jbHVkZSAiaG9zdGZpbGUuaCIKKyNpbmNsdWRlICJhdXRoLmgiCisjaWZkZWYgR1NTQVBJCisjaW5jbHVkZSAic3NoLWdzcy5oIgorI2VuZGlmCisjaW5jbHVkZSAibW9uaXRvcl93cmFwLmgiCisKKy8qIEZsYWdzIHNldCBhdXRob3JpemVkX2tleXMgZmxhZ3MgKi8KK2ludCBub19wb3J0X2ZvcndhcmRpbmdfZmxhZyA9IDA7CitpbnQgbm9fYWdlbnRfZm9yd2FyZGluZ19mbGFnID0gMDsKK2ludCBub194MTFfZm9yd2FyZGluZ19mbGFnID0gMDsKK2ludCBub19wdHlfZmxhZyA9IDA7CitpbnQgbm9fdXNlcl9yYyA9IDA7CitpbnQga2V5X2lzX2NlcnRfYXV0aG9yaXR5ID0gMDsKKworLyogImNvbW1hbmQ9IiBvcHRpb24uICovCitjaGFyICpmb3JjZWRfY29tbWFuZCA9IE5VTEw7CisKKy8qICJlbnZpcm9ubWVudD0iIG9wdGlvbnMuICovCitzdHJ1Y3QgZW52c3RyaW5nICpjdXN0b21fZW52aXJvbm1lbnQgPSBOVUxMOworCisvKiAidHVubmVsPSIgb3B0aW9uLiAqLworaW50IGZvcmNlZF90dW5fZGV2aWNlID0gLTE7CisKKy8qICJwcmluY2lwYWxzPSIgb3B0aW9uLiAqLworY2hhciAqYXV0aG9yaXplZF9wcmluY2lwYWxzID0gTlVMTDsKKworZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKKwordm9pZAorYXV0aF9jbGVhcl9vcHRpb25zKHZvaWQpCit7CisJbm9fYWdlbnRfZm9yd2FyZGluZ19mbGFnID0gMDsKKwlub19wb3J0X2ZvcndhcmRpbmdfZmxhZyA9IDA7CisJbm9fcHR5X2ZsYWcgPSAwOworCW5vX3gxMV9mb3J3YXJkaW5nX2ZsYWcgPSAwOworCW5vX3VzZXJfcmMgPSAwOworCWtleV9pc19jZXJ0X2F1dGhvcml0eSA9IDA7CisJd2hpbGUgKGN1c3RvbV9lbnZpcm9ubWVudCkgeworCQlzdHJ1Y3QgZW52c3RyaW5nICpjZSA9IGN1c3RvbV9lbnZpcm9ubWVudDsKKwkJY3VzdG9tX2Vudmlyb25tZW50ID0gY2UtPm5leHQ7CisJCXhmcmVlKGNlLT5zKTsKKwkJeGZyZWUoY2UpOworCX0KKwlpZiAoZm9yY2VkX2NvbW1hbmQpIHsKKwkJeGZyZWUoZm9yY2VkX2NvbW1hbmQpOworCQlmb3JjZWRfY29tbWFuZCA9IE5VTEw7CisJfQorCWlmIChhdXRob3JpemVkX3ByaW5jaXBhbHMpIHsKKwkJeGZyZWUoYXV0aG9yaXplZF9wcmluY2lwYWxzKTsKKwkJYXV0aG9yaXplZF9wcmluY2lwYWxzID0gTlVMTDsKKwl9CisJZm9yY2VkX3R1bl9kZXZpY2UgPSAtMTsKKwljaGFubmVsX2NsZWFyX3Blcm1pdHRlZF9vcGVucygpOworfQorCisvKgorICogcmV0dXJuIDEgaWYgYWNjZXNzIGlzIGdyYW50ZWQsIDAgaWYgbm90LgorICogc2lkZSBlZmZlY3Q6IHNldHMga2V5IG9wdGlvbiBmbGFncworICovCitpbnQKK2F1dGhfcGFyc2Vfb3B0aW9ucyhzdHJ1Y3QgcGFzc3dkICpwdywgY2hhciAqb3B0cywgY2hhciAqZmlsZSwgdV9sb25nIGxpbmVudW0pCit7CisJY29uc3QgY2hhciAqY3A7CisJaW50IGk7CisKKwkvKiByZXNldCBvcHRpb25zICovCisJYXV0aF9jbGVhcl9vcHRpb25zKCk7CisKKwlpZiAoIW9wdHMpCisJCXJldHVybiAxOworCisJd2hpbGUgKCpvcHRzICYmICpvcHRzICE9ICcgJyAmJiAqb3B0cyAhPSAnXHQnKSB7CisJCWNwID0gImNlcnQtYXV0aG9yaXR5IjsKKwkJaWYgKHN0cm5jYXNlY21wKG9wdHMsIGNwLCBzdHJsZW4oY3ApKSA9PSAwKSB7CisJCQlrZXlfaXNfY2VydF9hdXRob3JpdHkgPSAxOworCQkJb3B0cyArPSBzdHJsZW4oY3ApOworCQkJZ290byBuZXh0X29wdGlvbjsKKwkJfQorCQljcCA9ICJuby1wb3J0LWZvcndhcmRpbmciOworCQlpZiAoc3RybmNhc2VjbXAob3B0cywgY3AsIHN0cmxlbihjcCkpID09IDApIHsKKwkJCWF1dGhfZGVidWdfYWRkKCJQb3J0IGZvcndhcmRpbmcgZGlzYWJsZWQuIik7CisJCQlub19wb3J0X2ZvcndhcmRpbmdfZmxhZyA9IDE7CisJCQlvcHRzICs9IHN0cmxlbihjcCk7CisJCQlnb3RvIG5leHRfb3B0aW9uOworCQl9CisJCWNwID0gIm5vLWFnZW50LWZvcndhcmRpbmciOworCQlpZiAoc3RybmNhc2VjbXAob3B0cywgY3AsIHN0cmxlbihjcCkpID09IDApIHsKKwkJCWF1dGhfZGVidWdfYWRkKCJBZ2VudCBmb3J3YXJkaW5nIGRpc2FibGVkLiIpOworCQkJbm9fYWdlbnRfZm9yd2FyZGluZ19mbGFnID0gMTsKKwkJCW9wdHMgKz0gc3RybGVuKGNwKTsKKwkJCWdvdG8gbmV4dF9vcHRpb247CisJCX0KKwkJY3AgPSAibm8tWDExLWZvcndhcmRpbmciOworCQlpZiAoc3RybmNhc2VjbXAob3B0cywgY3AsIHN0cmxlbihjcCkpID09IDApIHsKKwkJCWF1dGhfZGVidWdfYWRkKCJYMTEgZm9yd2FyZGluZyBkaXNhYmxlZC4iKTsKKwkJCW5vX3gxMV9mb3J3YXJkaW5nX2ZsYWcgPSAxOworCQkJb3B0cyArPSBzdHJsZW4oY3ApOworCQkJZ290byBuZXh0X29wdGlvbjsKKwkJfQorCQljcCA9ICJuby1wdHkiOworCQlpZiAoc3RybmNhc2VjbXAob3B0cywgY3AsIHN0cmxlbihjcCkpID09IDApIHsKKwkJCWF1dGhfZGVidWdfYWRkKCJQdHkgYWxsb2NhdGlvbiBkaXNhYmxlZC4iKTsKKwkJCW5vX3B0eV9mbGFnID0gMTsKKwkJCW9wdHMgKz0gc3RybGVuKGNwKTsKKwkJCWdvdG8gbmV4dF9vcHRpb247CisJCX0KKwkJY3AgPSAibm8tdXNlci1yYyI7CisJCWlmIChzdHJuY2FzZWNtcChvcHRzLCBjcCwgc3RybGVuKGNwKSkgPT0gMCkgeworCQkJYXV0aF9kZWJ1Z19hZGQoIlVzZXIgcmMgZmlsZSBleGVjdXRpb24gZGlzYWJsZWQuIik7CisJCQlub191c2VyX3JjID0gMTsKKwkJCW9wdHMgKz0gc3RybGVuKGNwKTsKKwkJCWdvdG8gbmV4dF9vcHRpb247CisJCX0KKwkJY3AgPSAiY29tbWFuZD1cIiI7CisJCWlmIChzdHJuY2FzZWNtcChvcHRzLCBjcCwgc3RybGVuKGNwKSkgPT0gMCkgeworCQkJb3B0cyArPSBzdHJsZW4oY3ApOworCQkJaWYgKGZvcmNlZF9jb21tYW5kICE9IE5VTEwpCisJCQkJeGZyZWUoZm9yY2VkX2NvbW1hbmQpOworCQkJZm9yY2VkX2NvbW1hbmQgPSB4bWFsbG9jKHN0cmxlbihvcHRzKSArIDEpOworCQkJaSA9IDA7CisJCQl3aGlsZSAoKm9wdHMpIHsKKwkJCQlpZiAoKm9wdHMgPT0gJyInKQorCQkJCQlicmVhazsKKwkJCQlpZiAoKm9wdHMgPT0gJ1xcJyAmJiBvcHRzWzFdID09ICciJykgeworCQkJCQlvcHRzICs9IDI7CisJCQkJCWZvcmNlZF9jb21tYW5kW2krK10gPSAnIic7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlmb3JjZWRfY29tbWFuZFtpKytdID0gKm9wdHMrKzsKKwkJCX0KKwkJCWlmICghKm9wdHMpIHsKKwkJCQlkZWJ1ZygiJS4xMDBzLCBsaW5lICVsdTogbWlzc2luZyBlbmQgcXVvdGUiLAorCQkJCSAgICBmaWxlLCBsaW5lbnVtKTsKKwkJCQlhdXRoX2RlYnVnX2FkZCgiJS4xMDBzLCBsaW5lICVsdTogbWlzc2luZyBlbmQgcXVvdGUiLAorCQkJCSAgICBmaWxlLCBsaW5lbnVtKTsKKwkJCQl4ZnJlZShmb3JjZWRfY29tbWFuZCk7CisJCQkJZm9yY2VkX2NvbW1hbmQgPSBOVUxMOworCQkJCWdvdG8gYmFkX29wdGlvbjsKKwkJCX0KKwkJCWZvcmNlZF9jb21tYW5kW2ldID0gJ1wwJzsKKwkJCWF1dGhfZGVidWdfYWRkKCJGb3JjZWQgY29tbWFuZC4iKTsKKwkJCW9wdHMrKzsKKwkJCWdvdG8gbmV4dF9vcHRpb247CisJCX0KKwkJY3AgPSAicHJpbmNpcGFscz1cIiI7CisJCWlmIChzdHJuY2FzZWNtcChvcHRzLCBjcCwgc3RybGVuKGNwKSkgPT0gMCkgeworCQkJb3B0cyArPSBzdHJsZW4oY3ApOworCQkJaWYgKGF1dGhvcml6ZWRfcHJpbmNpcGFscyAhPSBOVUxMKQorCQkJCXhmcmVlKGF1dGhvcml6ZWRfcHJpbmNpcGFscyk7CisJCQlhdXRob3JpemVkX3ByaW5jaXBhbHMgPSB4bWFsbG9jKHN0cmxlbihvcHRzKSArIDEpOworCQkJaSA9IDA7CisJCQl3aGlsZSAoKm9wdHMpIHsKKwkJCQlpZiAoKm9wdHMgPT0gJyInKQorCQkJCQlicmVhazsKKwkJCQlpZiAoKm9wdHMgPT0gJ1xcJyAmJiBvcHRzWzFdID09ICciJykgeworCQkJCQlvcHRzICs9IDI7CisJCQkJCWF1dGhvcml6ZWRfcHJpbmNpcGFsc1tpKytdID0gJyInOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJYXV0aG9yaXplZF9wcmluY2lwYWxzW2krK10gPSAqb3B0cysrOworCQkJfQorCQkJaWYgKCEqb3B0cykgeworCQkJCWRlYnVnKCIlLjEwMHMsIGxpbmUgJWx1OiBtaXNzaW5nIGVuZCBxdW90ZSIsCisJCQkJICAgIGZpbGUsIGxpbmVudW0pOworCQkJCWF1dGhfZGVidWdfYWRkKCIlLjEwMHMsIGxpbmUgJWx1OiBtaXNzaW5nIGVuZCBxdW90ZSIsCisJCQkJICAgIGZpbGUsIGxpbmVudW0pOworCQkJCXhmcmVlKGF1dGhvcml6ZWRfcHJpbmNpcGFscyk7CisJCQkJYXV0aG9yaXplZF9wcmluY2lwYWxzID0gTlVMTDsKKwkJCQlnb3RvIGJhZF9vcHRpb247CisJCQl9CisJCQlhdXRob3JpemVkX3ByaW5jaXBhbHNbaV0gPSAnXDAnOworCQkJYXV0aF9kZWJ1Z19hZGQoInByaW5jaXBhbHM6ICUuOTAwcyIsCisJCQkgICAgYXV0aG9yaXplZF9wcmluY2lwYWxzKTsKKwkJCW9wdHMrKzsKKwkJCWdvdG8gbmV4dF9vcHRpb247CisJCX0KKwkJY3AgPSAiZW52aXJvbm1lbnQ9XCIiOworCQlpZiAob3B0aW9ucy5wZXJtaXRfdXNlcl9lbnYgJiYKKwkJICAgIHN0cm5jYXNlY21wKG9wdHMsIGNwLCBzdHJsZW4oY3ApKSA9PSAwKSB7CisJCQljaGFyICpzOworCQkJc3RydWN0IGVudnN0cmluZyAqbmV3X2VudnN0cmluZzsKKworCQkJb3B0cyArPSBzdHJsZW4oY3ApOworCQkJcyA9IHhtYWxsb2Moc3RybGVuKG9wdHMpICsgMSk7CisJCQlpID0gMDsKKwkJCXdoaWxlICgqb3B0cykgeworCQkJCWlmICgqb3B0cyA9PSAnIicpCisJCQkJCWJyZWFrOworCQkJCWlmICgqb3B0cyA9PSAnXFwnICYmIG9wdHNbMV0gPT0gJyInKSB7CisJCQkJCW9wdHMgKz0gMjsKKwkJCQkJc1tpKytdID0gJyInOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJc1tpKytdID0gKm9wdHMrKzsKKwkJCX0KKwkJCWlmICghKm9wdHMpIHsKKwkJCQlkZWJ1ZygiJS4xMDBzLCBsaW5lICVsdTogbWlzc2luZyBlbmQgcXVvdGUiLAorCQkJCSAgICBmaWxlLCBsaW5lbnVtKTsKKwkJCQlhdXRoX2RlYnVnX2FkZCgiJS4xMDBzLCBsaW5lICVsdTogbWlzc2luZyBlbmQgcXVvdGUiLAorCQkJCSAgICBmaWxlLCBsaW5lbnVtKTsKKwkJCQl4ZnJlZShzKTsKKwkJCQlnb3RvIGJhZF9vcHRpb247CisJCQl9CisJCQlzW2ldID0gJ1wwJzsKKwkJCWF1dGhfZGVidWdfYWRkKCJBZGRpbmcgdG8gZW52aXJvbm1lbnQ6ICUuOTAwcyIsIHMpOworCQkJZGVidWcoIkFkZGluZyB0byBlbnZpcm9ubWVudDogJS45MDBzIiwgcyk7CisJCQlvcHRzKys7CisJCQluZXdfZW52c3RyaW5nID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGVudnN0cmluZykpOworCQkJbmV3X2VudnN0cmluZy0+cyA9IHM7CisJCQluZXdfZW52c3RyaW5nLT5uZXh0ID0gY3VzdG9tX2Vudmlyb25tZW50OworCQkJY3VzdG9tX2Vudmlyb25tZW50ID0gbmV3X2VudnN0cmluZzsKKwkJCWdvdG8gbmV4dF9vcHRpb247CisJCX0KKwkJY3AgPSAiZnJvbT1cIiI7CisJCWlmIChzdHJuY2FzZWNtcChvcHRzLCBjcCwgc3RybGVuKGNwKSkgPT0gMCkgeworCQkJY29uc3QgY2hhciAqcmVtb3RlX2lwID0gZ2V0X3JlbW90ZV9pcGFkZHIoKTsKKwkJCWNvbnN0IGNoYXIgKnJlbW90ZV9ob3N0ID0gZ2V0X2Nhbm9uaWNhbF9ob3N0bmFtZSgKKwkJCSAgICBvcHRpb25zLnVzZV9kbnMpOworCQkJY2hhciAqcGF0dGVybnMgPSB4bWFsbG9jKHN0cmxlbihvcHRzKSArIDEpOworCisJCQlvcHRzICs9IHN0cmxlbihjcCk7CisJCQlpID0gMDsKKwkJCXdoaWxlICgqb3B0cykgeworCQkJCWlmICgqb3B0cyA9PSAnIicpCisJCQkJCWJyZWFrOworCQkJCWlmICgqb3B0cyA9PSAnXFwnICYmIG9wdHNbMV0gPT0gJyInKSB7CisJCQkJCW9wdHMgKz0gMjsKKwkJCQkJcGF0dGVybnNbaSsrXSA9ICciJzsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCXBhdHRlcm5zW2krK10gPSAqb3B0cysrOworCQkJfQorCQkJaWYgKCEqb3B0cykgeworCQkJCWRlYnVnKCIlLjEwMHMsIGxpbmUgJWx1OiBtaXNzaW5nIGVuZCBxdW90ZSIsCisJCQkJICAgIGZpbGUsIGxpbmVudW0pOworCQkJCWF1dGhfZGVidWdfYWRkKCIlLjEwMHMsIGxpbmUgJWx1OiBtaXNzaW5nIGVuZCBxdW90ZSIsCisJCQkJICAgIGZpbGUsIGxpbmVudW0pOworCQkJCXhmcmVlKHBhdHRlcm5zKTsKKwkJCQlnb3RvIGJhZF9vcHRpb247CisJCQl9CisJCQlwYXR0ZXJuc1tpXSA9ICdcMCc7CisJCQlvcHRzKys7CisJCQlzd2l0Y2ggKG1hdGNoX2hvc3RfYW5kX2lwKHJlbW90ZV9ob3N0LCByZW1vdGVfaXAsCisJCQkgICAgcGF0dGVybnMpKSB7CisJCQljYXNlIDE6CisJCQkJeGZyZWUocGF0dGVybnMpOworCQkJCS8qIEhvc3QgbmFtZSBtYXRjaGVzLiAqLworCQkJCWdvdG8gbmV4dF9vcHRpb247CisJCQljYXNlIC0xOgorCQkJCWRlYnVnKCIlLjEwMHMsIGxpbmUgJWx1OiBpbnZhbGlkIGNyaXRlcmlhIiwKKwkJCQkgICAgZmlsZSwgbGluZW51bSk7CisJCQkJYXV0aF9kZWJ1Z19hZGQoIiUuMTAwcywgbGluZSAlbHU6ICIKKwkJCQkgICAgImludmFsaWQgY3JpdGVyaWEiLCBmaWxlLCBsaW5lbnVtKTsKKwkJCQkvKiBGQUxMVEhST1VHSCAqLworCQkJY2FzZSAwOgorCQkJCXhmcmVlKHBhdHRlcm5zKTsKKwkJCQlsb2dpdCgiQXV0aGVudGljYXRpb24gdHJpZWQgZm9yICUuMTAwcyB3aXRoICIKKwkJCQkgICAgImNvcnJlY3Qga2V5IGJ1dCBub3QgZnJvbSBhIHBlcm1pdHRlZCAiCisJCQkJICAgICJob3N0IChob3N0PSUuMjAwcywgaXA9JS4yMDBzKS4iLAorCQkJCSAgICBwdy0+cHdfbmFtZSwgcmVtb3RlX2hvc3QsIHJlbW90ZV9pcCk7CisJCQkJYXV0aF9kZWJ1Z19hZGQoIllvdXIgaG9zdCAnJS4yMDBzJyBpcyBub3QgIgorCQkJCSAgICAicGVybWl0dGVkIHRvIHVzZSB0aGlzIGtleSBmb3IgbG9naW4uIiwKKwkJCQkgICAgcmVtb3RlX2hvc3QpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZGVueSBhY2Nlc3MgKi8KKwkJCXJldHVybiAwOworCQl9CisJCWNwID0gInBlcm1pdG9wZW49XCIiOworCQlpZiAoc3RybmNhc2VjbXAob3B0cywgY3AsIHN0cmxlbihjcCkpID09IDApIHsKKwkJCWNoYXIgKmhvc3QsICpwOworCQkJaW50IHBvcnQ7CisJCQljaGFyICpwYXR0ZXJucyA9IHhtYWxsb2Moc3RybGVuKG9wdHMpICsgMSk7CisKKwkJCW9wdHMgKz0gc3RybGVuKGNwKTsKKwkJCWkgPSAwOworCQkJd2hpbGUgKCpvcHRzKSB7CisJCQkJaWYgKCpvcHRzID09ICciJykKKwkJCQkJYnJlYWs7CisJCQkJaWYgKCpvcHRzID09ICdcXCcgJiYgb3B0c1sxXSA9PSAnIicpIHsKKwkJCQkJb3B0cyArPSAyOworCQkJCQlwYXR0ZXJuc1tpKytdID0gJyInOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJcGF0dGVybnNbaSsrXSA9ICpvcHRzKys7CisJCQl9CisJCQlpZiAoISpvcHRzKSB7CisJCQkJZGVidWcoIiUuMTAwcywgbGluZSAlbHU6IG1pc3NpbmcgZW5kIHF1b3RlIiwKKwkJCQkgICAgZmlsZSwgbGluZW51bSk7CisJCQkJYXV0aF9kZWJ1Z19hZGQoIiUuMTAwcywgbGluZSAlbHU6IG1pc3NpbmcgIgorCQkJCSAgICAiZW5kIHF1b3RlIiwgZmlsZSwgbGluZW51bSk7CisJCQkJeGZyZWUocGF0dGVybnMpOworCQkJCWdvdG8gYmFkX29wdGlvbjsKKwkJCX0KKwkJCXBhdHRlcm5zW2ldID0gJ1wwJzsKKwkJCW9wdHMrKzsKKwkJCXAgPSBwYXR0ZXJuczsKKwkJCWhvc3QgPSBocGRlbGltKCZwKTsKKwkJCWlmIChob3N0ID09IE5VTEwgfHwgc3RybGVuKGhvc3QpID49IE5JX01BWEhPU1QpIHsKKwkJCQlkZWJ1ZygiJS4xMDBzLCBsaW5lICVsdTogQmFkIHBlcm1pdG9wZW4gIgorCQkJCSAgICAic3BlY2lmaWNhdGlvbiA8JS4xMDBzPiIsIGZpbGUsIGxpbmVudW0sCisJCQkJICAgIHBhdHRlcm5zKTsKKwkJCQlhdXRoX2RlYnVnX2FkZCgiJS4xMDBzLCBsaW5lICVsdTogIgorCQkJCSAgICAiQmFkIHBlcm1pdG9wZW4gc3BlY2lmaWNhdGlvbiIsIGZpbGUsCisJCQkJICAgIGxpbmVudW0pOworCQkJCXhmcmVlKHBhdHRlcm5zKTsKKwkJCQlnb3RvIGJhZF9vcHRpb247CisJCQl9CisJCQlob3N0ID0gY2xlYW5ob3N0bmFtZShob3N0KTsKKwkJCWlmIChwID09IE5VTEwgfHwgKHBvcnQgPSBwZXJtaXRvcGVuX3BvcnQocCkpIDwgMCkgeworCQkJCWRlYnVnKCIlLjEwMHMsIGxpbmUgJWx1OiBCYWQgcGVybWl0b3BlbiBwb3J0ICIKKwkJCQkgICAgIjwlLjEwMHM+IiwgZmlsZSwgbGluZW51bSwgcCA/IHAgOiAiIik7CisJCQkJYXV0aF9kZWJ1Z19hZGQoIiUuMTAwcywgbGluZSAlbHU6ICIKKwkJCQkgICAgIkJhZCBwZXJtaXRvcGVuIHBvcnQiLCBmaWxlLCBsaW5lbnVtKTsKKwkJCQl4ZnJlZShwYXR0ZXJucyk7CisJCQkJZ290byBiYWRfb3B0aW9uOworCQkJfQorCQkJaWYgKG9wdGlvbnMuYWxsb3dfdGNwX2ZvcndhcmRpbmcpCisJCQkJY2hhbm5lbF9hZGRfcGVybWl0dGVkX29wZW5zKGhvc3QsIHBvcnQpOworCQkJeGZyZWUocGF0dGVybnMpOworCQkJZ290byBuZXh0X29wdGlvbjsKKwkJfQorCQljcCA9ICJ0dW5uZWw9XCIiOworCQlpZiAoc3RybmNhc2VjbXAob3B0cywgY3AsIHN0cmxlbihjcCkpID09IDApIHsKKwkJCWNoYXIgKnR1biA9IE5VTEw7CisJCQlvcHRzICs9IHN0cmxlbihjcCk7CisJCQl0dW4gPSB4bWFsbG9jKHN0cmxlbihvcHRzKSArIDEpOworCQkJaSA9IDA7CisJCQl3aGlsZSAoKm9wdHMpIHsKKwkJCQlpZiAoKm9wdHMgPT0gJyInKQorCQkJCQlicmVhazsKKwkJCQl0dW5baSsrXSA9ICpvcHRzKys7CisJCQl9CisJCQlpZiAoISpvcHRzKSB7CisJCQkJZGVidWcoIiUuMTAwcywgbGluZSAlbHU6IG1pc3NpbmcgZW5kIHF1b3RlIiwKKwkJCQkgICAgZmlsZSwgbGluZW51bSk7CisJCQkJYXV0aF9kZWJ1Z19hZGQoIiUuMTAwcywgbGluZSAlbHU6IG1pc3NpbmcgZW5kIHF1b3RlIiwKKwkJCQkgICAgZmlsZSwgbGluZW51bSk7CisJCQkJeGZyZWUodHVuKTsKKwkJCQlmb3JjZWRfdHVuX2RldmljZSA9IC0xOworCQkJCWdvdG8gYmFkX29wdGlvbjsKKwkJCX0KKwkJCXR1bltpXSA9ICdcMCc7CisJCQlmb3JjZWRfdHVuX2RldmljZSA9IGEydHVuKHR1biwgTlVMTCk7CisJCQl4ZnJlZSh0dW4pOworCQkJaWYgKGZvcmNlZF90dW5fZGV2aWNlID09IFNTSF9UVU5JRF9FUlIpIHsKKwkJCQlkZWJ1ZygiJS4xMDBzLCBsaW5lICVsdTogaW52YWxpZCB0dW4gZGV2aWNlIiwKKwkJCQkgICAgZmlsZSwgbGluZW51bSk7CisJCQkJYXV0aF9kZWJ1Z19hZGQoIiUuMTAwcywgbGluZSAlbHU6IGludmFsaWQgdHVuIGRldmljZSIsCisJCQkJICAgIGZpbGUsIGxpbmVudW0pOworCQkJCWZvcmNlZF90dW5fZGV2aWNlID0gLTE7CisJCQkJZ290byBiYWRfb3B0aW9uOworCQkJfQorCQkJYXV0aF9kZWJ1Z19hZGQoIkZvcmNlZCB0dW4gZGV2aWNlOiAlZCIsIGZvcmNlZF90dW5fZGV2aWNlKTsKKwkJCW9wdHMrKzsKKwkJCWdvdG8gbmV4dF9vcHRpb247CisJCX0KK25leHRfb3B0aW9uOgorCQkvKgorCQkgKiBTa2lwIHRoZSBjb21tYSwgYW5kIG1vdmUgdG8gdGhlIG5leHQgb3B0aW9uCisJCSAqIChvciBicmVhayBvdXQgaWYgdGhlcmUgYXJlIG5vIG1vcmUpLgorCQkgKi8KKwkJaWYgKCEqb3B0cykKKwkJCWZhdGFsKCJCdWdzIGluIGF1dGgtb3B0aW9ucy5jIG9wdGlvbiBwcm9jZXNzaW5nLiIpOworCQlpZiAoKm9wdHMgPT0gJyAnIHx8ICpvcHRzID09ICdcdCcpCisJCQlicmVhazsJCS8qIEVuZCBvZiBvcHRpb25zLiAqLworCQlpZiAoKm9wdHMgIT0gJywnKQorCQkJZ290byBiYWRfb3B0aW9uOworCQlvcHRzKys7CisJCS8qIFByb2Nlc3MgdGhlIG5leHQgb3B0aW9uLiAqLworCX0KKworCS8qIGdyYW50IGFjY2VzcyAqLworCXJldHVybiAxOworCitiYWRfb3B0aW9uOgorCWxvZ2l0KCJCYWQgb3B0aW9ucyBpbiAlLjEwMHMgZmlsZSwgbGluZSAlbHU6ICUuNTBzIiwKKwkgICAgZmlsZSwgbGluZW51bSwgb3B0cyk7CisJYXV0aF9kZWJ1Z19hZGQoIkJhZCBvcHRpb25zIGluICUuMTAwcyBmaWxlLCBsaW5lICVsdTogJS41MHMiLAorCSAgICBmaWxlLCBsaW5lbnVtLCBvcHRzKTsKKworCS8qIGRlbnkgYWNjZXNzICovCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT1BUSU9OU19DUklUSUNBTAkxCisjZGVmaW5lIE9QVElPTlNfRVhURU5TSU9OUwkyCitzdGF0aWMgaW50CitwYXJzZV9vcHRpb25fbGlzdCh1X2NoYXIgKm9wdGJsb2IsIHNpemVfdCBvcHRibG9iX2xlbiwgc3RydWN0IHBhc3N3ZCAqcHcsCisgICAgdV9pbnQgd2hpY2gsIGludCBjcml0LAorICAgIGludCAqY2VydF9ub19wb3J0X2ZvcndhcmRpbmdfZmxhZywKKyAgICBpbnQgKmNlcnRfbm9fYWdlbnRfZm9yd2FyZGluZ19mbGFnLAorICAgIGludCAqY2VydF9ub194MTFfZm9yd2FyZGluZ19mbGFnLAorICAgIGludCAqY2VydF9ub19wdHlfZmxhZywKKyAgICBpbnQgKmNlcnRfbm9fdXNlcl9yYywKKyAgICBjaGFyICoqY2VydF9mb3JjZWRfY29tbWFuZCwKKyAgICBpbnQgKmNlcnRfc291cmNlX2FkZHJlc3NfZG9uZSkKK3sKKwljaGFyICpjb21tYW5kLCAqYWxsb3dlZDsKKwljb25zdCBjaGFyICpyZW1vdGVfaXA7CisJdV9jaGFyICpuYW1lID0gTlVMTCwgKmRhdGFfYmxvYiA9IE5VTEw7CisJdV9pbnQgbmxlbiwgZGxlbiwgY2xlbjsKKwlCdWZmZXIgYywgZGF0YTsKKwlpbnQgcmV0ID0gLTEsIGZvdW5kOworCisJYnVmZmVyX2luaXQoJmRhdGEpOworCisJLyogTWFrZSBjb3B5IHRvIGF2b2lkIGFsdGVyaW5nIG9yaWdpbmFsICovCisJYnVmZmVyX2luaXQoJmMpOworCWJ1ZmZlcl9hcHBlbmQoJmMsIG9wdGJsb2IsIG9wdGJsb2JfbGVuKTsKKworCXdoaWxlIChidWZmZXJfbGVuKCZjKSA+IDApIHsKKwkJaWYgKChuYW1lID0gYnVmZmVyX2dldF9jc3RyaW5nX3JldCgmYywgJm5sZW4pKSA9PSBOVUxMIHx8CisJCSAgICAoZGF0YV9ibG9iID0gYnVmZmVyX2dldF9zdHJpbmdfcmV0KCZjLCAmZGxlbikpID09IE5VTEwpIHsKKwkJCWVycm9yKCJDZXJ0aWZpY2F0ZSBvcHRpb25zIGNvcnJ1cHQiKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWJ1ZmZlcl9hcHBlbmQoJmRhdGEsIGRhdGFfYmxvYiwgZGxlbik7CisJCWRlYnVnMygiZm91bmQgY2VydGlmaWNhdGUgb3B0aW9uIFwiJS4xMDBzXCIgbGVuICV1IiwKKwkJICAgIG5hbWUsIGRsZW4pOworCQlmb3VuZCA9IDA7CisJCWlmICgod2hpY2ggJiBPUFRJT05TX0VYVEVOU0lPTlMpICE9IDApIHsKKwkJCWlmIChzdHJjbXAobmFtZSwgInBlcm1pdC1YMTEtZm9yd2FyZGluZyIpID09IDApIHsKKwkJCQkqY2VydF9ub194MTFfZm9yd2FyZGluZ19mbGFnID0gMDsKKwkJCQlmb3VuZCA9IDE7CisJCQl9IGVsc2UgaWYgKHN0cmNtcChuYW1lLAorCQkJICAgICJwZXJtaXQtYWdlbnQtZm9yd2FyZGluZyIpID09IDApIHsKKwkJCQkqY2VydF9ub19hZ2VudF9mb3J3YXJkaW5nX2ZsYWcgPSAwOworCQkJCWZvdW5kID0gMTsKKwkJCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsCisJCQkgICAgInBlcm1pdC1wb3J0LWZvcndhcmRpbmciKSA9PSAwKSB7CisJCQkJKmNlcnRfbm9fcG9ydF9mb3J3YXJkaW5nX2ZsYWcgPSAwOworCQkJCWZvdW5kID0gMTsKKwkJCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJwZXJtaXQtcHR5IikgPT0gMCkgeworCQkJCSpjZXJ0X25vX3B0eV9mbGFnID0gMDsKKwkJCQlmb3VuZCA9IDE7CisJCQl9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAicGVybWl0LXVzZXItcmMiKSA9PSAwKSB7CisJCQkJKmNlcnRfbm9fdXNlcl9yYyA9IDA7CisJCQkJZm91bmQgPSAxOworCQkJfQorCQl9CisJCWlmICghZm91bmQgJiYgKHdoaWNoICYgT1BUSU9OU19DUklUSUNBTCkgIT0gMCkgeworCQkJaWYgKHN0cmNtcChuYW1lLCAiZm9yY2UtY29tbWFuZCIpID09IDApIHsKKwkJCQlpZiAoKGNvbW1hbmQgPSBidWZmZXJfZ2V0X2NzdHJpbmdfcmV0KCZkYXRhLAorCQkJCSAgICAmY2xlbikpID09IE5VTEwpIHsKKwkJCQkJZXJyb3IoIkNlcnRpZmljYXRlIGNvbnN0cmFpbnQgXCIlc1wiICIKKwkJCQkJICAgICJjb3JydXB0IiwgbmFtZSk7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZiAoKmNlcnRfZm9yY2VkX2NvbW1hbmQgIT0gTlVMTCkgeworCQkJCQllcnJvcigiQ2VydGlmaWNhdGUgaGFzIG11bHRpcGxlICIKKwkJCQkJICAgICJmb3JjZS1jb21tYW5kIG9wdGlvbnMiKTsKKwkJCQkJeGZyZWUoY29tbWFuZCk7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQkqY2VydF9mb3JjZWRfY29tbWFuZCA9IGNvbW1hbmQ7CisJCQkJZm91bmQgPSAxOworCQkJfQorCQkJaWYgKHN0cmNtcChuYW1lLCAic291cmNlLWFkZHJlc3MiKSA9PSAwKSB7CisJCQkJaWYgKChhbGxvd2VkID0gYnVmZmVyX2dldF9jc3RyaW5nX3JldCgmZGF0YSwKKwkJCQkgICAgJmNsZW4pKSA9PSBOVUxMKSB7CisJCQkJCWVycm9yKCJDZXJ0aWZpY2F0ZSBjb25zdHJhaW50ICIKKwkJCQkJICAgICJcIiVzXCIgY29ycnVwdCIsIG5hbWUpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJaWYgKCgqY2VydF9zb3VyY2VfYWRkcmVzc19kb25lKSsrKSB7CisJCQkJCWVycm9yKCJDZXJ0aWZpY2F0ZSBoYXMgbXVsdGlwbGUgIgorCQkJCQkgICAgInNvdXJjZS1hZGRyZXNzIG9wdGlvbnMiKTsKKwkJCQkJeGZyZWUoYWxsb3dlZCk7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlyZW1vdGVfaXAgPSBnZXRfcmVtb3RlX2lwYWRkcigpOworCQkJCXN3aXRjaCAoYWRkcl9tYXRjaF9jaWRyX2xpc3QocmVtb3RlX2lwLAorCQkJCSAgICBhbGxvd2VkKSkgeworCQkJCWNhc2UgMToKKwkJCQkJLyogYWNjZXB0ZWQgKi8KKwkJCQkJeGZyZWUoYWxsb3dlZCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMDoKKwkJCQkJLyogbm8gbWF0Y2ggKi8KKwkJCQkJbG9naXQoIkF1dGhlbnRpY2F0aW9uIHRyaWVkIGZvciAlLjEwMHMgIgorCQkJCQkgICAgIndpdGggdmFsaWQgY2VydGlmaWNhdGUgYnV0IG5vdCAiCisJCQkJCSAgICAiZnJvbSBhIHBlcm1pdHRlZCBob3N0ICIKKwkJCQkJICAgICIoaXA9JS4yMDBzKS4iLCBwdy0+cHdfbmFtZSwKKwkJCQkJICAgIHJlbW90ZV9pcCk7CisJCQkJCWF1dGhfZGVidWdfYWRkKCJZb3VyIGFkZHJlc3MgJyUuMjAwcycgIgorCQkJCQkgICAgImlzIG5vdCBwZXJtaXR0ZWQgdG8gdXNlIHRoaXMgIgorCQkJCQkgICAgImNlcnRpZmljYXRlIGZvciBsb2dpbi4iLAorCQkJCQkgICAgcmVtb3RlX2lwKTsKKwkJCQkJeGZyZWUoYWxsb3dlZCk7CisJCQkJCWdvdG8gb3V0OworCQkJCWNhc2UgLTE6CisJCQkJCWVycm9yKCJDZXJ0aWZpY2F0ZSBzb3VyY2UtYWRkcmVzcyAiCisJCQkJCSAgICAiY29udGVudHMgaW52YWxpZCIpOworCQkJCQl4ZnJlZShhbGxvd2VkKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCWZvdW5kID0gMTsKKwkJCX0KKwkJfQorCisJCWlmICghZm91bmQpIHsKKwkJCWlmIChjcml0KSB7CisJCQkJZXJyb3IoIkNlcnRpZmljYXRlIGNyaXRpY2FsIG9wdGlvbiBcIiVzXCIgIgorCQkJCSAgICAiaXMgbm90IHN1cHBvcnRlZCIsIG5hbWUpOworCQkJCWdvdG8gb3V0OworCQkJfSBlbHNlIHsKKwkJCQlsb2dpdCgiQ2VydGlmaWNhdGUgZXh0ZW5zaW9uIFwiJXNcIiAiCisJCQkJICAgICJpcyBub3Qgc3VwcG9ydGVkIiwgbmFtZSk7CisJCQl9CisJCX0gZWxzZSBpZiAoYnVmZmVyX2xlbigmZGF0YSkgIT0gMCkgeworCQkJZXJyb3IoIkNlcnRpZmljYXRlIG9wdGlvbiBcIiVzXCIgY29ycnVwdCAiCisJCQkgICAgIihleHRyYSBkYXRhKSIsIG5hbWUpOworCQkJZ290byBvdXQ7CisJCX0KKwkJYnVmZmVyX2NsZWFyKCZkYXRhKTsKKwkJeGZyZWUobmFtZSk7CisJCXhmcmVlKGRhdGFfYmxvYik7CisJCW5hbWUgPSBkYXRhX2Jsb2IgPSBOVUxMOworCX0KKwkvKiBzdWNjZXNzZnVsbHkgcGFyc2VkIGFsbCBvcHRpb25zICovCisJcmV0ID0gMDsKKworIG91dDoKKwlpZiAocmV0ICE9IDAgJiYKKwkgICAgY2VydF9mb3JjZWRfY29tbWFuZCAhPSBOVUxMICYmCisJICAgICpjZXJ0X2ZvcmNlZF9jb21tYW5kICE9IE5VTEwpIHsKKwkJeGZyZWUoKmNlcnRfZm9yY2VkX2NvbW1hbmQpOworCQkqY2VydF9mb3JjZWRfY29tbWFuZCA9IE5VTEw7CisJfQorCWlmIChuYW1lICE9IE5VTEwpCisJCXhmcmVlKG5hbWUpOworCWlmIChkYXRhX2Jsb2IgIT0gTlVMTCkKKwkJeGZyZWUoZGF0YV9ibG9iKTsKKwlidWZmZXJfZnJlZSgmZGF0YSk7CisJYnVmZmVyX2ZyZWUoJmMpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBTZXQgb3B0aW9ucyBmcm9tIGNyaXRpY2FsIGNlcnRpZmljYXRlIG9wdGlvbnMuIFRoZXNlIHN1cGVyc2VkZSB1c2VyIGtleQorICogb3B0aW9ucyBzbyB0aGlzIG11c3QgYmUgY2FsbGVkIGFmdGVyIGF1dGhfcGFyc2Vfb3B0aW9ucygpLgorICovCitpbnQKK2F1dGhfY2VydF9vcHRpb25zKEtleSAqaywgc3RydWN0IHBhc3N3ZCAqcHcpCit7CisJaW50IGNlcnRfbm9fcG9ydF9mb3J3YXJkaW5nX2ZsYWcgPSAxOworCWludCBjZXJ0X25vX2FnZW50X2ZvcndhcmRpbmdfZmxhZyA9IDE7CisJaW50IGNlcnRfbm9feDExX2ZvcndhcmRpbmdfZmxhZyA9IDE7CisJaW50IGNlcnRfbm9fcHR5X2ZsYWcgPSAxOworCWludCBjZXJ0X25vX3VzZXJfcmMgPSAxOworCWNoYXIgKmNlcnRfZm9yY2VkX2NvbW1hbmQgPSBOVUxMOworCWludCBjZXJ0X3NvdXJjZV9hZGRyZXNzX2RvbmUgPSAwOworCisJaWYgKGtleV9jZXJ0X2lzX2xlZ2FjeShrKSkgeworCQkvKiBBbGwgb3B0aW9ucyBhcmUgaW4gdGhlIG9uZSBmaWVsZCBmb3IgdjAwIGNlcnRzICovCisJCWlmIChwYXJzZV9vcHRpb25fbGlzdChidWZmZXJfcHRyKCZrLT5jZXJ0LT5jcml0aWNhbCksCisJCSAgICBidWZmZXJfbGVuKCZrLT5jZXJ0LT5jcml0aWNhbCksIHB3LAorCQkgICAgT1BUSU9OU19DUklUSUNBTHxPUFRJT05TX0VYVEVOU0lPTlMsIDEsCisJCSAgICAmY2VydF9ub19wb3J0X2ZvcndhcmRpbmdfZmxhZywKKwkJICAgICZjZXJ0X25vX2FnZW50X2ZvcndhcmRpbmdfZmxhZywKKwkJICAgICZjZXJ0X25vX3gxMV9mb3J3YXJkaW5nX2ZsYWcsCisJCSAgICAmY2VydF9ub19wdHlfZmxhZywKKwkJICAgICZjZXJ0X25vX3VzZXJfcmMsCisJCSAgICAmY2VydF9mb3JjZWRfY29tbWFuZCwKKwkJICAgICZjZXJ0X3NvdXJjZV9hZGRyZXNzX2RvbmUpID09IC0xKQorCQkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCS8qIFNlcGFyYXRlIG9wdGlvbnMgYW5kIGV4dGVuc2lvbnMgZm9yIHYwMSBjZXJ0cyAqLworCQlpZiAocGFyc2Vfb3B0aW9uX2xpc3QoYnVmZmVyX3B0cigmay0+Y2VydC0+Y3JpdGljYWwpLAorCQkgICAgYnVmZmVyX2xlbigmay0+Y2VydC0+Y3JpdGljYWwpLCBwdywKKwkJICAgIE9QVElPTlNfQ1JJVElDQUwsIDEsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSAgICAmY2VydF9mb3JjZWRfY29tbWFuZCwKKwkJICAgICZjZXJ0X3NvdXJjZV9hZGRyZXNzX2RvbmUpID09IC0xKQorCQkJcmV0dXJuIC0xOworCQlpZiAocGFyc2Vfb3B0aW9uX2xpc3QoYnVmZmVyX3B0cigmay0+Y2VydC0+ZXh0ZW5zaW9ucyksCisJCSAgICBidWZmZXJfbGVuKCZrLT5jZXJ0LT5leHRlbnNpb25zKSwgcHcsCisJCSAgICBPUFRJT05TX0VYVEVOU0lPTlMsIDEsCisJCSAgICAmY2VydF9ub19wb3J0X2ZvcndhcmRpbmdfZmxhZywKKwkJICAgICZjZXJ0X25vX2FnZW50X2ZvcndhcmRpbmdfZmxhZywKKwkJICAgICZjZXJ0X25vX3gxMV9mb3J3YXJkaW5nX2ZsYWcsCisJCSAgICAmY2VydF9ub19wdHlfZmxhZywKKwkJICAgICZjZXJ0X25vX3VzZXJfcmMsCisJCSAgICBOVUxMLCBOVUxMKSA9PSAtMSkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlub19wb3J0X2ZvcndhcmRpbmdfZmxhZyB8PSBjZXJ0X25vX3BvcnRfZm9yd2FyZGluZ19mbGFnOworCW5vX2FnZW50X2ZvcndhcmRpbmdfZmxhZyB8PSBjZXJ0X25vX2FnZW50X2ZvcndhcmRpbmdfZmxhZzsKKwlub194MTFfZm9yd2FyZGluZ19mbGFnIHw9IGNlcnRfbm9feDExX2ZvcndhcmRpbmdfZmxhZzsKKwlub19wdHlfZmxhZyB8PSBjZXJ0X25vX3B0eV9mbGFnOworCW5vX3VzZXJfcmMgfD0gY2VydF9ub191c2VyX3JjOworCS8qIENBLXNwZWNpZmllZCBmb3JjZWQgY29tbWFuZCBzdXBlcnNlZGVzIGtleSBvcHRpb24gKi8KKwlpZiAoY2VydF9mb3JjZWRfY29tbWFuZCAhPSBOVUxMKSB7CisJCWlmIChmb3JjZWRfY29tbWFuZCAhPSBOVUxMKQorCQkJeGZyZWUoZm9yY2VkX2NvbW1hbmQpOworCQlmb3JjZWRfY29tbWFuZCA9IGNlcnRfZm9yY2VkX2NvbW1hbmQ7CisJfQorCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2F1dGgtb3B0aW9ucy5oIGIvb3BlbnNzaC02LjBwMS9hdXRoLW9wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDU1Yzk0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9hdXRoLW9wdGlvbnMuaApAQCAtMCwwICsxLDQwIEBACisvKiAkT3BlbkJTRDogYXV0aC1vcHRpb25zLmgsdiAxLjIwIDIwMTAvMDUvMDcgMTE6MzA6MjkgZGptIEV4cCAkICovCisKKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqLworCisjaWZuZGVmIEFVVEhfT1BUSU9OU19ICisjZGVmaW5lIEFVVEhfT1BUSU9OU19ICisKKy8qIExpbmtlZCBsaXN0IG9mIGN1c3RvbSBlbnZpcm9ubWVudCBzdHJpbmdzICovCitzdHJ1Y3QgZW52c3RyaW5nIHsKKwlzdHJ1Y3QgZW52c3RyaW5nICpuZXh0OworCWNoYXIgICAqczsKK307CisKKy8qIEZsYWdzIHRoYXQgbWF5IGJlIHNldCBpbiBhdXRob3JpemVkX2tleXMgb3B0aW9ucy4gKi8KK2V4dGVybiBpbnQgbm9fcG9ydF9mb3J3YXJkaW5nX2ZsYWc7CitleHRlcm4gaW50IG5vX2FnZW50X2ZvcndhcmRpbmdfZmxhZzsKK2V4dGVybiBpbnQgbm9feDExX2ZvcndhcmRpbmdfZmxhZzsKK2V4dGVybiBpbnQgbm9fcHR5X2ZsYWc7CitleHRlcm4gaW50IG5vX3VzZXJfcmM7CitleHRlcm4gY2hhciAqZm9yY2VkX2NvbW1hbmQ7CitleHRlcm4gc3RydWN0IGVudnN0cmluZyAqY3VzdG9tX2Vudmlyb25tZW50OworZXh0ZXJuIGludCBmb3JjZWRfdHVuX2RldmljZTsKK2V4dGVybiBpbnQga2V5X2lzX2NlcnRfYXV0aG9yaXR5OworZXh0ZXJuIGNoYXIgKmF1dGhvcml6ZWRfcHJpbmNpcGFsczsKKworaW50CWF1dGhfcGFyc2Vfb3B0aW9ucyhzdHJ1Y3QgcGFzc3dkICosIGNoYXIgKiwgY2hhciAqLCB1X2xvbmcpOwordm9pZAlhdXRoX2NsZWFyX29wdGlvbnModm9pZCk7CitpbnQJYXV0aF9jZXJ0X29wdGlvbnMoS2V5ICosIHN0cnVjdCBwYXNzd2QgKik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9hdXRoLXBhbS5jIGIvb3BlbnNzaC02LjBwMS9hdXRoLXBhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NTAwNmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2F1dGgtcGFtLmMKQEAgLTAsMCArMSwxMjIxIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMiBOZXR3b3JrcyBBc3NvY2lhdGVzIFRlY2hub2xvZ3ksIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkIGZvciB0aGUgRnJlZUJTRCBQcm9qZWN0IGJ5IFRoaW5rU2VjIEFTIGFuZAorICogTkFJIExhYnMsIHRoZSBTZWN1cml0eSBSZXNlYXJjaCBEaXZpc2lvbiBvZiBOZXR3b3JrIEFzc29jaWF0ZXMsIEluYy4KKyAqIHVuZGVyIERBUlBBL1NQQVdBUiBjb250cmFjdCBONjYwMDEtMDEtQy04MDM1ICgiQ0JPU1MiKSwgYXMgcGFydCBvZiB0aGUKKyAqIERBUlBBIENIQVRTIHJlc2VhcmNoIHByb2dyYW0uCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsMjAwNCBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsMjAwNCBEYXJyZW4gVHVja2VyIDxkdHVja2VyQHppcC5jb20uYXU+CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyogQmFzZWQgb24gJEZyZWVCU0Q6IHNyYy9jcnlwdG8vb3BlbnNzaC9hdXRoMi1wYW0tZnJlZWJzZC5jLHYgMS4xMSAyMDAzLzAzLzMxIDEzOjQ4OjE4IGRlcyBFeHAgJCAqLworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZkZWYgVVNFX1BBTQorI2lmIGRlZmluZWQoSEFWRV9TRUNVUklUWV9QQU1fQVBQTF9IKQorI2luY2x1ZGUgPHNlY3VyaXR5L3BhbV9hcHBsLmg+CisjZWxpZiBkZWZpbmVkIChIQVZFX1BBTV9QQU1fQVBQTF9IKQorI2luY2x1ZGUgPHBhbS9wYW1fYXBwbC5oPgorI2VuZGlmCisKKy8qIE9wZW5Hcm91cCBSRkM4Ni4wIGFuZCBYU1NPIHNwZWNpZnkgbm8gImNvbnN0IiBvbiBhcmd1bWVudHMgKi8KKyNpZmRlZiBQQU1fU1VOX0NPREVCQVNFCisjIGRlZmluZSBzc2hwYW1fY29uc3QJCS8qIFNvbGFyaXMsIEhQLVVYLCBBSVggKi8KKyNlbHNlCisjIGRlZmluZSBzc2hwYW1fY29uc3QJY29uc3QJLyogTGludXhQQU0sIE9wZW5QQU0gKi8KKyNlbmRpZgorCisvKiBBbWJpZ3VpdHkgaW4gc3BlYzogaXMgaXQgYW4gYXJyYXkgb2YgcG9pbnRlcnMgb3IgYSBwb2ludGVyIHRvIGFuIGFycmF5PyAqLworI2lmZGVmIFBBTV9TVU5fQ09ERUJBU0UKKyMgZGVmaW5lIFBBTV9NU0dfTUVNQkVSKG1zZywgbiwgbWVtYmVyKSAoKCoobXNnKSlbKG4pXS5tZW1iZXIpCisjZWxzZQorIyBkZWZpbmUgUEFNX01TR19NRU1CRVIobXNnLCBuLCBtZW1iZXIpICgobXNnKVsobildLT5tZW1iZXIpCisjZW5kaWYKKworI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJob3N0ZmlsZS5oIgorI2luY2x1ZGUgImF1dGguaCIKKyNpbmNsdWRlICJhdXRoLXBhbS5oIgorI2luY2x1ZGUgImNhbm9ob3N0LmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAibXNnLmgiCisjaW5jbHVkZSAicGFja2V0LmgiCisjaW5jbHVkZSAibWlzYy5oIgorI2luY2x1ZGUgInNlcnZjb25mLmgiCisjaW5jbHVkZSAic3NoMi5oIgorI2luY2x1ZGUgImF1dGgtb3B0aW9ucy5oIgorI2lmZGVmIEdTU0FQSQorI2luY2x1ZGUgInNzaC1nc3MuaCIKKyNlbmRpZgorI2luY2x1ZGUgIm1vbml0b3Jfd3JhcC5oIgorCitleHRlcm4gU2VydmVyT3B0aW9ucyBvcHRpb25zOworZXh0ZXJuIEJ1ZmZlciBsb2dpbm1zZzsKK2V4dGVybiBpbnQgY29tcGF0MjA7CitleHRlcm4gdV9pbnQgdXRtcF9sZW47CisKKy8qIHNvIHdlIGRvbid0IHNpbGVudGx5IGNoYW5nZSBiZWhhdmlvdXIgKi8KKyNpZmRlZiBVU0VfUE9TSVhfVEhSRUFEUworIyBlcnJvciAiVVNFX1BPU0lYX1RIUkVBRFMgcmVwbGFjZWQgYnkgVU5TVVBQT1JURURfUE9TSVhfVEhSRUFEU19IQUNLIgorI2VuZGlmCisKKy8qCisgKiBGb3JtZXJseSBrbm93biBhcyBVU0VfUE9TSVhfVEhSRUFEUywgdXNpbmcgdGhpcyBpcyBjb21wbGV0ZWx5IHVuc3VwcG9ydGVkCisgKiBhbmQgZ2VuZXJhbGx5IGEgYmFkIGlkZWEuICBVc2UgYXQgb3duIHJpc2sgYW5kIGRvIG5vdCBleHBlY3Qgc3VwcG9ydCBpZgorICogdGhpcyBicmVha3MuCisgKi8KKyNpZmRlZiBVTlNVUFBPUlRFRF9QT1NJWF9USFJFQURTX0hBQ0sKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisvKgorICogQXZvaWQgbmFtZXNwYWNlIGNsYXNoIHdoZW4gKm5vdCogdXNpbmcgcHRocmVhZHMgZm9yIHN5c3RlbXMgKndpdGgqCisgKiBwdGhyZWFkcywgd2hpY2ggdW5jb25kaXRpb25hbGx5IGRlZmluZSBwdGhyZWFkX3QgdmlhIHN5cy90eXBlcy5oCisgKiAoZS5nLiBMaW51eCkKKyAqLwordHlwZWRlZiBwdGhyZWFkX3Qgc3BfcHRocmVhZF90OworI2Vsc2UKK3R5cGVkZWYgcGlkX3Qgc3BfcHRocmVhZF90OworI2VuZGlmCisKK3N0cnVjdCBwYW1fY3R4dCB7CisJc3BfcHRocmVhZF90CSBwYW1fdGhyZWFkOworCWludAkJIHBhbV9wc29jazsKKwlpbnQJCSBwYW1fY3NvY2s7CisJaW50CQkgcGFtX2RvbmU7Cit9OworCitzdGF0aWMgdm9pZCBzc2hwYW1fZnJlZV9jdHgodm9pZCAqKTsKK3N0YXRpYyBzdHJ1Y3QgcGFtX2N0eHQgKmNsZWFudXBfY3R4dDsKKworI2lmbmRlZiBVTlNVUFBPUlRFRF9QT1NJWF9USFJFQURTX0hBQ0sKKy8qCisgKiBTaW11bGF0ZSB0aHJlYWRzIHdpdGggcHJvY2Vzc2VzLgorICovCisKK3N0YXRpYyBpbnQgc3NocGFtX3RocmVhZF9zdGF0dXMgPSAtMTsKK3N0YXRpYyBteXNpZ190IHNzaHBhbV9vbGRzaWc7CisKK3N0YXRpYyB2b2lkCitzc2hwYW1fc2lnY2hsZF9oYW5kbGVyKGludCBzaWcpCit7CisJc2lnbmFsKFNJR0NITEQsIFNJR19ERkwpOworCWlmIChjbGVhbnVwX2N0eHQgPT0gTlVMTCkKKwkJcmV0dXJuOwkvKiBoYW5kbGVyIGNhbGxlZCBhZnRlciBQQU0gY2xlYW51cCwgc2hvdWxkbid0IGhhcHBlbiAqLworCWlmICh3YWl0cGlkKGNsZWFudXBfY3R4dC0+cGFtX3RocmVhZCwgJnNzaHBhbV90aHJlYWRfc3RhdHVzLCBXTk9IQU5HKQorCSAgICA8PSAwKSB7CisJCS8qIFBBTSB0aHJlYWQgaGFzIG5vdCBleGl0dGVkLCBwcml2c2VwIHNsYXZlIG11c3QgaGF2ZSAqLworCQlraWxsKGNsZWFudXBfY3R4dC0+cGFtX3RocmVhZCwgU0lHVEVSTSk7CisJCWlmICh3YWl0cGlkKGNsZWFudXBfY3R4dC0+cGFtX3RocmVhZCwgJnNzaHBhbV90aHJlYWRfc3RhdHVzLCAwKQorCQkgICAgPD0gMCkKKwkJCXJldHVybjsgLyogY291bGQgbm90IHdhaXQgKi8KKwl9CisJaWYgKFdJRlNJR05BTEVEKHNzaHBhbV90aHJlYWRfc3RhdHVzKSAmJgorCSAgICBXVEVSTVNJRyhzc2hwYW1fdGhyZWFkX3N0YXR1cykgPT0gU0lHVEVSTSkKKwkJcmV0dXJuOwkvKiB0ZXJtaW5hdGVkIGJ5IHB0aHJlYWRfY2FuY2VsICovCisJaWYgKCFXSUZFWElURUQoc3NocGFtX3RocmVhZF9zdGF0dXMpKQorCQlzaWdkaWUoIlBBTTogYXV0aGVudGljYXRpb24gdGhyZWFkIGV4aXRlZCB1bmV4cGVjdGVkbHkiKTsKKwlpZiAoV0VYSVRTVEFUVVMoc3NocGFtX3RocmVhZF9zdGF0dXMpICE9IDApCisJCXNpZ2RpZSgiUEFNOiBhdXRoZW50aWNhdGlvbiB0aHJlYWQgZXhpdGVkIHVuY2xlYW5seSIpOworfQorCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK3B0aHJlYWRfZXhpdCh2b2lkICp2YWx1ZSkKK3sKKwlfZXhpdCgwKTsKK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyBpbnQKK3B0aHJlYWRfY3JlYXRlKHNwX3B0aHJlYWRfdCAqdGhyZWFkLCBjb25zdCB2b2lkICphdHRyLAorICAgIHZvaWQgKigqdGhyZWFkX3N0YXJ0KSh2b2lkICopLCB2b2lkICphcmcpCit7CisJcGlkX3QgcGlkOworCXN0cnVjdCBwYW1fY3R4dCAqY3R4ID0gYXJnOworCisJc3NocGFtX3RocmVhZF9zdGF0dXMgPSAtMTsKKwlzd2l0Y2ggKChwaWQgPSBmb3JrKCkpKSB7CisJY2FzZSAtMToKKwkJZXJyb3IoImZvcmsoKTogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKC0xKTsKKwljYXNlIDA6CisJCWNsb3NlKGN0eC0+cGFtX3Bzb2NrKTsKKwkJY3R4LT5wYW1fcHNvY2sgPSAtMTsKKwkJdGhyZWFkX3N0YXJ0KGFyZyk7CisJCV9leGl0KDEpOworCWRlZmF1bHQ6CisJCSp0aHJlYWQgPSBwaWQ7CisJCWNsb3NlKGN0eC0+cGFtX2Nzb2NrKTsKKwkJY3R4LT5wYW1fY3NvY2sgPSAtMTsKKwkJc3NocGFtX29sZHNpZyA9IHNpZ25hbChTSUdDSExELCBzc2hwYW1fc2lnY2hsZF9oYW5kbGVyKTsKKwkJcmV0dXJuICgwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3B0aHJlYWRfY2FuY2VsKHNwX3B0aHJlYWRfdCB0aHJlYWQpCit7CisJc2lnbmFsKFNJR0NITEQsIHNzaHBhbV9vbGRzaWcpOworCXJldHVybiAoa2lsbCh0aHJlYWQsIFNJR1RFUk0pKTsKK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyBpbnQKK3B0aHJlYWRfam9pbihzcF9wdGhyZWFkX3QgdGhyZWFkLCB2b2lkICoqdmFsdWUpCit7CisJaW50IHN0YXR1czsKKworCWlmIChzc2hwYW1fdGhyZWFkX3N0YXR1cyAhPSAtMSkKKwkJcmV0dXJuIChzc2hwYW1fdGhyZWFkX3N0YXR1cyk7CisJc2lnbmFsKFNJR0NITEQsIHNzaHBhbV9vbGRzaWcpOworCXdhaXRwaWQodGhyZWFkLCAmc3RhdHVzLCAwKTsKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisjZW5kaWYKKworCitzdGF0aWMgcGFtX2hhbmRsZV90ICpzc2hwYW1faGFuZGxlID0gTlVMTDsKK3N0YXRpYyBpbnQgc3NocGFtX2VyciA9IDA7CitzdGF0aWMgaW50IHNzaHBhbV9hdXRoZW50aWNhdGVkID0gMDsKK3N0YXRpYyBpbnQgc3NocGFtX3Nlc3Npb25fb3BlbiA9IDA7CitzdGF0aWMgaW50IHNzaHBhbV9jcmVkX2VzdGFibGlzaGVkID0gMDsKK3N0YXRpYyBpbnQgc3NocGFtX2FjY291bnRfc3RhdHVzID0gLTE7CitzdGF0aWMgY2hhciAqKnNzaHBhbV9lbnYgPSBOVUxMOworc3RhdGljIEF1dGhjdHh0ICpzc2hwYW1fYXV0aGN0eHQgPSBOVUxMOworc3RhdGljIGNvbnN0IGNoYXIgKnNzaHBhbV9wYXNzd29yZCA9IE5VTEw7CitzdGF0aWMgY2hhciBiYWRwd1tdID0gIlxiXG5cclwxNzdJTkNPUlJFQ1QiOworCisvKiBTb21lIFBBTSBpbXBsZW1lbnRhdGlvbnMgZG9uJ3QgaW1wbGVtZW50IHRoaXMgKi8KKyNpZm5kZWYgSEFWRV9QQU1fR0VURU5WTElTVAorc3RhdGljIGNoYXIgKioKK3BhbV9nZXRlbnZsaXN0KHBhbV9oYW5kbGVfdCAqcGFtaCkKK3sKKwkvKgorCSAqIFhYWCAtIElmIG5lY2Vzc2FyeSwgd2UgY2FuIHN0aWxsIHN1cHBvcnQgZW52cmlvbm1lbnQgcGFzc2luZworCSAqIGZvciBwbGF0Zm9ybXMgd2l0aG91dCBwYW1fZ2V0ZW52bGlzdCBieSBzZWFyY2hpbmcgZm9yIGtub3duCisJICogZW52IHZhcnMgKGUuZy4gS1JCNUNDTkFNRSkgZnJvbSB0aGUgUEFNIGVudmlyb25tZW50LgorCSAqLworCSByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKgorICogU29tZSBwbGF0Zm9ybXMsIG5vdGFibHkgU29sYXJpcywgZG8gbm90IGVuZm9yY2UgcGFzc3dvcmQgY29tcGxleGl0eQorICogcnVsZXMgZHVyaW5nIHBhbV9jaGF1dGh0b2soKSBpZiB0aGUgcmVhbCB1aWQgb2YgdGhlIGNhbGxpbmcgcHJvY2VzcworICogaXMgMCwgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBpdCdzIGJlaW5nIGNhbGxlZCBieSAicGFzc3dkIiBydW4gYnkgcm9vdC4KKyAqIFRoaXMgd3JhcHMgcGFtX2NoYXV0aHRvayBhbmQgc2V0cy9yZXN0b3JlIHRoZSByZWFsIHVpZCBzbyBQQU0gd2lsbCBkbworICogdGhlIHJpZ2h0IHRoaW5nLgorICovCisjaWZkZWYgU1NIUEFNX0NIQVVUSFRPS19ORUVEU19SVUlECitzdGF0aWMgaW50Citzc2hwYW1fY2hhdXRodG9rX3J1aWQocGFtX2hhbmRsZV90ICpwYW1oLCBpbnQgZmxhZ3MpCit7CisJaW50IHJlc3VsdDsKKworCWlmIChzc2hwYW1fYXV0aGN0eHQgPT0gTlVMTCkKKwkJZmF0YWwoIlBBTTogc3NocGFtX2F1dGhjdHh0IG5vdCBpbml0aWFsaXplZCIpOworCWlmIChzZXRyZXVpZChzc2hwYW1fYXV0aGN0eHQtPnB3LT5wd191aWQsIC0xKSA9PSAtMSkKKwkJZmF0YWwoIiVzOiBzZXRyZXVpZCBmYWlsZWQ6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJcmVzdWx0ID0gcGFtX2NoYXV0aHRvayhwYW1oLCBmbGFncyk7CisJaWYgKHNldHJldWlkKDAsIC0xKSA9PSAtMSkKKwkJZmF0YWwoIiVzOiBzZXRyZXVpZCBmYWlsZWQ6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKyMgZGVmaW5lIHBhbV9jaGF1dGh0b2soYSxiKQkoc3NocGFtX2NoYXV0aHRva19ydWlkKChhKSwgKGIpKSkKKyNlbmRpZgorCit2b2lkCitzc2hwYW1fcGFzc3dvcmRfY2hhbmdlX3JlcXVpcmVkKGludCByZXFkKQoreworCWRlYnVnMygiJXMgJWQiLCBfX2Z1bmNfXywgcmVxZCk7CisJaWYgKHNzaHBhbV9hdXRoY3R4dCA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IFBBTSBhdXRoY3R4dCBub3QgaW5pdGlhbGl6ZWQiLCBfX2Z1bmNfXyk7CisJc3NocGFtX2F1dGhjdHh0LT5mb3JjZV9wd2NoYW5nZSA9IHJlcWQ7CisJaWYgKHJlcWQpIHsKKwkJbm9fcG9ydF9mb3J3YXJkaW5nX2ZsYWcgfD0gMjsKKwkJbm9fYWdlbnRfZm9yd2FyZGluZ19mbGFnIHw9IDI7CisJCW5vX3gxMV9mb3J3YXJkaW5nX2ZsYWcgfD0gMjsKKwl9IGVsc2UgeworCQlub19wb3J0X2ZvcndhcmRpbmdfZmxhZyAmPSB+MjsKKwkJbm9fYWdlbnRfZm9yd2FyZGluZ19mbGFnICY9IH4yOworCQlub194MTFfZm9yd2FyZGluZ19mbGFnICY9IH4yOworCX0KK30KKworLyogSW1wb3J0IHJlZ3VsYXIgYW5kIFBBTSBlbnZpcm9ubWVudCBmcm9tIHN1YnByb2Nlc3MgKi8KK3N0YXRpYyB2b2lkCitpbXBvcnRfZW52aXJvbm1lbnRzKEJ1ZmZlciAqYikKK3sKKwljaGFyICplbnY7CisJdV9pbnQgaSwgbnVtX2VudjsKKwlpbnQgZXJyOworCisJZGVidWczKCJQQU06ICVzIGVudGVyaW5nIiwgX19mdW5jX18pOworCisjaWZuZGVmIFVOU1VQUE9SVEVEX1BPU0lYX1RIUkVBRFNfSEFDSworCS8qIEltcG9ydCB2YXJpYWJsZXMgc2V0IGJ5IGRvX3BhbV9hY2NvdW50ICovCisJc3NocGFtX2FjY291bnRfc3RhdHVzID0gYnVmZmVyX2dldF9pbnQoYik7CisJc3NocGFtX3Bhc3N3b3JkX2NoYW5nZV9yZXF1aXJlZChidWZmZXJfZ2V0X2ludChiKSk7CisKKwkvKiBJbXBvcnQgZW52aXJvbm1lbnQgZnJvbSBzdWJwcm9jZXNzICovCisJbnVtX2VudiA9IGJ1ZmZlcl9nZXRfaW50KGIpOworCWlmIChudW1fZW52ID4gMTAyNCkKKwkJZmF0YWwoIiVzOiByZWNlaXZlZCAldSBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIGV4cGVjdGVkIDw9IDEwMjQiLAorCQkgICAgX19mdW5jX18sIG51bV9lbnYpOworCXNzaHBhbV9lbnYgPSB4Y2FsbG9jKG51bV9lbnYgKyAxLCBzaXplb2YoKnNzaHBhbV9lbnYpKTsKKwlkZWJ1ZzMoIlBBTTogbnVtIGVudiBzdHJpbmdzICVkIiwgbnVtX2Vudik7CisJZm9yKGkgPSAwOyBpIDwgbnVtX2VudjsgaSsrKQorCQlzc2hwYW1fZW52W2ldID0gYnVmZmVyX2dldF9zdHJpbmcoYiwgTlVMTCk7CisKKwlzc2hwYW1fZW52W251bV9lbnZdID0gTlVMTDsKKworCS8qIEltcG9ydCBQQU0gZW52aXJvbm1lbnQgZnJvbSBzdWJwcm9jZXNzICovCisJbnVtX2VudiA9IGJ1ZmZlcl9nZXRfaW50KGIpOworCWRlYnVnKCJQQU06IG51bSBQQU0gZW52IHN0cmluZ3MgJWQiLCBudW1fZW52KTsKKwlmb3IoaSA9IDA7IGkgPCBudW1fZW52OyBpKyspIHsKKwkJZW52ID0gYnVmZmVyX2dldF9zdHJpbmcoYiwgTlVMTCk7CisKKyNpZmRlZiBIQVZFX1BBTV9QVVRFTlYKKwkJLyogRXJyb3JzIGFyZSBub3QgZmF0YWwgaGVyZSAqLworCQlpZiAoKGVyciA9IHBhbV9wdXRlbnYoc3NocGFtX2hhbmRsZSwgZW52KSkgIT0gUEFNX1NVQ0NFU1MpIHsKKwkJCWVycm9yKCJQQU06IHBhbV9wdXRlbnY6ICVzIiwKKwkJCSAgICBwYW1fc3RyZXJyb3Ioc3NocGFtX2hhbmRsZSwgc3NocGFtX2VycikpOworCQl9CisjZW5kaWYKKwl9CisjZW5kaWYKK30KKworLyoKKyAqIENvbnZlcnNhdGlvbiBmdW5jdGlvbiBmb3IgYXV0aGVudGljYXRpb24gdGhyZWFkLgorICovCitzdGF0aWMgaW50Citzc2hwYW1fdGhyZWFkX2NvbnYoaW50IG4sIHNzaHBhbV9jb25zdCBzdHJ1Y3QgcGFtX21lc3NhZ2UgKiptc2csCisgICAgc3RydWN0IHBhbV9yZXNwb25zZSAqKnJlc3AsIHZvaWQgKmRhdGEpCit7CisJQnVmZmVyIGJ1ZmZlcjsKKwlzdHJ1Y3QgcGFtX2N0eHQgKmN0eHQ7CisJc3RydWN0IHBhbV9yZXNwb25zZSAqcmVwbHk7CisJaW50IGk7CisKKwlkZWJ1ZzMoIlBBTTogJXMgZW50ZXJpbmcsICVkIG1lc3NhZ2VzIiwgX19mdW5jX18sIG4pOworCSpyZXNwID0gTlVMTDsKKworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZXJyb3IoIlBBTTogY29udmVyc2F0aW9uIGZ1bmN0aW9uIHBhc3NlZCBhIG51bGwgY29udGV4dCIpOworCQlyZXR1cm4gKFBBTV9DT05WX0VSUik7CisJfQorCWN0eHQgPSBkYXRhOworCWlmIChuIDw9IDAgfHwgbiA+IFBBTV9NQVhfTlVNX01TRykKKwkJcmV0dXJuIChQQU1fQ09OVl9FUlIpOworCisJaWYgKChyZXBseSA9IGNhbGxvYyhuLCBzaXplb2YoKnJlcGx5KSkpID09IE5VTEwpCisJCXJldHVybiAoUEFNX0NPTlZfRVJSKTsKKworCWJ1ZmZlcl9pbml0KCZidWZmZXIpOworCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKwkJc3dpdGNoIChQQU1fTVNHX01FTUJFUihtc2csIGksIG1zZ19zdHlsZSkpIHsKKwkJY2FzZSBQQU1fUFJPTVBUX0VDSE9fT0ZGOgorCQkJYnVmZmVyX3B1dF9jc3RyaW5nKCZidWZmZXIsCisJCQkgICAgUEFNX01TR19NRU1CRVIobXNnLCBpLCBtc2cpKTsKKwkJCWlmIChzc2hfbXNnX3NlbmQoY3R4dC0+cGFtX2Nzb2NrLAorCQkJICAgIFBBTV9NU0dfTUVNQkVSKG1zZywgaSwgbXNnX3N0eWxlKSwgJmJ1ZmZlcikgPT0gLTEpCisJCQkJZ290byBmYWlsOworCQkJaWYgKHNzaF9tc2dfcmVjdihjdHh0LT5wYW1fY3NvY2ssICZidWZmZXIpID09IC0xKQorCQkJCWdvdG8gZmFpbDsKKwkJCWlmIChidWZmZXJfZ2V0X2NoYXIoJmJ1ZmZlcikgIT0gUEFNX0FVVEhUT0spCisJCQkJZ290byBmYWlsOworCQkJcmVwbHlbaV0ucmVzcCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZidWZmZXIsIE5VTEwpOworCQkJYnJlYWs7CisJCWNhc2UgUEFNX1BST01QVF9FQ0hPX09OOgorCQkJYnVmZmVyX3B1dF9jc3RyaW5nKCZidWZmZXIsCisJCQkgICAgUEFNX01TR19NRU1CRVIobXNnLCBpLCBtc2cpKTsKKwkJCWlmIChzc2hfbXNnX3NlbmQoY3R4dC0+cGFtX2Nzb2NrLAorCQkJICAgIFBBTV9NU0dfTUVNQkVSKG1zZywgaSwgbXNnX3N0eWxlKSwgJmJ1ZmZlcikgPT0gLTEpCisJCQkJZ290byBmYWlsOworCQkJaWYgKHNzaF9tc2dfcmVjdihjdHh0LT5wYW1fY3NvY2ssICZidWZmZXIpID09IC0xKQorCQkJCWdvdG8gZmFpbDsKKwkJCWlmIChidWZmZXJfZ2V0X2NoYXIoJmJ1ZmZlcikgIT0gUEFNX0FVVEhUT0spCisJCQkJZ290byBmYWlsOworCQkJcmVwbHlbaV0ucmVzcCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZidWZmZXIsIE5VTEwpOworCQkJYnJlYWs7CisJCWNhc2UgUEFNX0VSUk9SX01TRzoKKwkJCWJ1ZmZlcl9wdXRfY3N0cmluZygmYnVmZmVyLAorCQkJICAgIFBBTV9NU0dfTUVNQkVSKG1zZywgaSwgbXNnKSk7CisJCQlpZiAoc3NoX21zZ19zZW5kKGN0eHQtPnBhbV9jc29jaywKKwkJCSAgICBQQU1fTVNHX01FTUJFUihtc2csIGksIG1zZ19zdHlsZSksICZidWZmZXIpID09IC0xKQorCQkJCWdvdG8gZmFpbDsKKwkJCWJyZWFrOworCQljYXNlIFBBTV9URVhUX0lORk86CisJCQlidWZmZXJfcHV0X2NzdHJpbmcoJmJ1ZmZlciwKKwkJCSAgICBQQU1fTVNHX01FTUJFUihtc2csIGksIG1zZykpOworCQkJaWYgKHNzaF9tc2dfc2VuZChjdHh0LT5wYW1fY3NvY2ssCisJCQkgICAgUEFNX01TR19NRU1CRVIobXNnLCBpLCBtc2dfc3R5bGUpLCAmYnVmZmVyKSA9PSAtMSkKKwkJCQlnb3RvIGZhaWw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlidWZmZXJfY2xlYXIoJmJ1ZmZlcik7CisJfQorCWJ1ZmZlcl9mcmVlKCZidWZmZXIpOworCSpyZXNwID0gcmVwbHk7CisJcmV0dXJuIChQQU1fU1VDQ0VTUyk7CisKKyBmYWlsOgorCWZvcihpID0gMDsgaSA8IG47IGkrKykgeworCQlpZiAocmVwbHlbaV0ucmVzcCAhPSBOVUxMKQorCQkJeGZyZWUocmVwbHlbaV0ucmVzcCk7CisJfQorCXhmcmVlKHJlcGx5KTsKKwlidWZmZXJfZnJlZSgmYnVmZmVyKTsKKwlyZXR1cm4gKFBBTV9DT05WX0VSUik7Cit9CisKKy8qCisgKiBBdXRoZW50aWNhdGlvbiB0aHJlYWQuCisgKi8KK3N0YXRpYyB2b2lkICoKK3NzaHBhbV90aHJlYWQodm9pZCAqY3R4dHApCit7CisJc3RydWN0IHBhbV9jdHh0ICpjdHh0ID0gY3R4dHA7CisJQnVmZmVyIGJ1ZmZlcjsKKwlzdHJ1Y3QgcGFtX2NvbnYgc3NocGFtX2NvbnY7CisJaW50IGZsYWdzID0gKG9wdGlvbnMucGVybWl0X2VtcHR5X3Bhc3N3ZCA9PSAwID8KKwkgICAgUEFNX0RJU0FMTE9XX05VTExfQVVUSFRPSyA6IDApOworI2lmbmRlZiBVTlNVUFBPUlRFRF9QT1NJWF9USFJFQURTX0hBQ0sKKwlleHRlcm4gY2hhciAqKmVudmlyb247CisJY2hhciAqKmVudl9mcm9tX3BhbTsKKwl1X2ludCBpOworCWNvbnN0IGNoYXIgKnBhbV91c2VyOworCWNvbnN0IGNoYXIgKipwdHJfcGFtX3VzZXIgPSAmcGFtX3VzZXI7CisJY2hhciAqdHogPSBnZXRlbnYoIlRaIik7CisKKwlwYW1fZ2V0X2l0ZW0oc3NocGFtX2hhbmRsZSwgUEFNX1VTRVIsCisJICAgIChzc2hwYW1fY29uc3Qgdm9pZCAqKilwdHJfcGFtX3VzZXIpOworCisJZW52aXJvblswXSA9IE5VTEw7CisJaWYgKHR6ICE9IE5VTEwpCisJCWlmIChzZXRlbnYoIlRaIiwgdHosIDEpID09IC0xKQorCQkJZXJyb3IoIlBBTTogY291bGQgbm90IHNldCBUWiBlbnZpcm9ubWVudDogJXMiLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisKKwlpZiAoc3NocGFtX2F1dGhjdHh0ICE9IE5VTEwpIHsKKwkJc2V0cHJvY3RpdGxlKCIlcyBbcGFtXSIsCisJCSAgICBzc2hwYW1fYXV0aGN0eHQtPnZhbGlkID8gcGFtX3VzZXIgOiAidW5rbm93biIpOworCX0KKyNlbmRpZgorCisJc3NocGFtX2NvbnYuY29udiA9IHNzaHBhbV90aHJlYWRfY29udjsKKwlzc2hwYW1fY29udi5hcHBkYXRhX3B0ciA9IGN0eHQ7CisKKwlpZiAoc3NocGFtX2F1dGhjdHh0ID09IE5VTEwpCisJCWZhdGFsKCIlczogUEFNIGF1dGhjdHh0IG5vdCBpbml0aWFsaXplZCIsIF9fZnVuY19fKTsKKworCWJ1ZmZlcl9pbml0KCZidWZmZXIpOworCXNzaHBhbV9lcnIgPSBwYW1fc2V0X2l0ZW0oc3NocGFtX2hhbmRsZSwgUEFNX0NPTlYsCisJICAgIChjb25zdCB2b2lkICopJnNzaHBhbV9jb252KTsKKwlpZiAoc3NocGFtX2VyciAhPSBQQU1fU1VDQ0VTUykKKwkJZ290byBhdXRoX2ZhaWw7CisJc3NocGFtX2VyciA9IHBhbV9hdXRoZW50aWNhdGUoc3NocGFtX2hhbmRsZSwgZmxhZ3MpOworCWlmIChzc2hwYW1fZXJyICE9IFBBTV9TVUNDRVNTKQorCQlnb3RvIGF1dGhfZmFpbDsKKworCWlmIChjb21wYXQyMCkgeworCQlpZiAoIWRvX3BhbV9hY2NvdW50KCkpIHsKKwkJCXNzaHBhbV9lcnIgPSBQQU1fQUNDVF9FWFBJUkVEOworCQkJZ290byBhdXRoX2ZhaWw7CisJCX0KKwkJaWYgKHNzaHBhbV9hdXRoY3R4dC0+Zm9yY2VfcHdjaGFuZ2UpIHsKKwkJCXNzaHBhbV9lcnIgPSBwYW1fY2hhdXRodG9rKHNzaHBhbV9oYW5kbGUsCisJCQkgICAgUEFNX0NIQU5HRV9FWFBJUkVEX0FVVEhUT0spOworCQkJaWYgKHNzaHBhbV9lcnIgIT0gUEFNX1NVQ0NFU1MpCisJCQkJZ290byBhdXRoX2ZhaWw7CisJCQlzc2hwYW1fcGFzc3dvcmRfY2hhbmdlX3JlcXVpcmVkKDApOworCQl9CisJfQorCisJYnVmZmVyX3B1dF9jc3RyaW5nKCZidWZmZXIsICJPSyIpOworCisjaWZuZGVmIFVOU1VQUE9SVEVEX1BPU0lYX1RIUkVBRFNfSEFDSworCS8qIEV4cG9ydCB2YXJpYWJsZXMgc2V0IGJ5IGRvX3BhbV9hY2NvdW50ICovCisJYnVmZmVyX3B1dF9pbnQoJmJ1ZmZlciwgc3NocGFtX2FjY291bnRfc3RhdHVzKTsKKwlidWZmZXJfcHV0X2ludCgmYnVmZmVyLCBzc2hwYW1fYXV0aGN0eHQtPmZvcmNlX3B3Y2hhbmdlKTsKKworCS8qIEV4cG9ydCBhbnkgZW52aXJvbm1lbnQgc3RyaW5ncyBzZXQgaW4gY2hpbGQgKi8KKwlmb3IoaSA9IDA7IGVudmlyb25baV0gIT0gTlVMTDsgaSsrKQorCQk7IC8qIENvdW50ICovCisJYnVmZmVyX3B1dF9pbnQoJmJ1ZmZlciwgaSk7CisJZm9yKGkgPSAwOyBlbnZpcm9uW2ldICE9IE5VTEw7IGkrKykKKwkJYnVmZmVyX3B1dF9jc3RyaW5nKCZidWZmZXIsIGVudmlyb25baV0pOworCisJLyogRXhwb3J0IGFueSBlbnZpcm9ubWVudCBzdHJpbmdzIHNldCBieSBQQU0gaW4gY2hpbGQgKi8KKwllbnZfZnJvbV9wYW0gPSBwYW1fZ2V0ZW52bGlzdChzc2hwYW1faGFuZGxlKTsKKwlmb3IoaSA9IDA7IGVudl9mcm9tX3BhbSAhPSBOVUxMICYmIGVudl9mcm9tX3BhbVtpXSAhPSBOVUxMOyBpKyspCisJCTsgLyogQ291bnQgKi8KKwlidWZmZXJfcHV0X2ludCgmYnVmZmVyLCBpKTsKKwlmb3IoaSA9IDA7IGVudl9mcm9tX3BhbSAhPSBOVUxMICYmIGVudl9mcm9tX3BhbVtpXSAhPSBOVUxMOyBpKyspCisJCWJ1ZmZlcl9wdXRfY3N0cmluZygmYnVmZmVyLCBlbnZfZnJvbV9wYW1baV0pOworI2VuZGlmIC8qIFVOU1VQUE9SVEVEX1BPU0lYX1RIUkVBRFNfSEFDSyAqLworCisJLyogWFhYIC0gY2FuJ3QgZG8gbXVjaCBhYm91dCBhbiBlcnJvciBoZXJlICovCisJc3NoX21zZ19zZW5kKGN0eHQtPnBhbV9jc29jaywgc3NocGFtX2VyciwgJmJ1ZmZlcik7CisJYnVmZmVyX2ZyZWUoJmJ1ZmZlcik7CisJcHRocmVhZF9leGl0KE5VTEwpOworCisgYXV0aF9mYWlsOgorCWJ1ZmZlcl9wdXRfY3N0cmluZygmYnVmZmVyLAorCSAgICBwYW1fc3RyZXJyb3Ioc3NocGFtX2hhbmRsZSwgc3NocGFtX2VycikpOworCS8qIFhYWCAtIGNhbid0IGRvIG11Y2ggYWJvdXQgYW4gZXJyb3IgaGVyZSAqLworCWlmIChzc2hwYW1fZXJyID09IFBBTV9BQ0NUX0VYUElSRUQpCisJCXNzaF9tc2dfc2VuZChjdHh0LT5wYW1fY3NvY2ssIFBBTV9BQ0NUX0VYUElSRUQsICZidWZmZXIpOworCWVsc2UKKwkJc3NoX21zZ19zZW5kKGN0eHQtPnBhbV9jc29jaywgUEFNX0FVVEhfRVJSLCAmYnVmZmVyKTsKKwlidWZmZXJfZnJlZSgmYnVmZmVyKTsKKwlwdGhyZWFkX2V4aXQoTlVMTCk7CisKKwlyZXR1cm4gKE5VTEwpOyAvKiBBdm9pZCB3YXJuaW5nIGZvciBub24tcHRocmVhZCBjYXNlICovCit9CisKK3ZvaWQKK3NzaHBhbV90aHJlYWRfY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBwYW1fY3R4dCAqY3R4dCA9IGNsZWFudXBfY3R4dDsKKworCWRlYnVnMygiUEFNOiAlcyBlbnRlcmluZyIsIF9fZnVuY19fKTsKKwlpZiAoY3R4dCAhPSBOVUxMICYmIGN0eHQtPnBhbV90aHJlYWQgIT0gMCkgeworCQlwdGhyZWFkX2NhbmNlbChjdHh0LT5wYW1fdGhyZWFkKTsKKwkJcHRocmVhZF9qb2luKGN0eHQtPnBhbV90aHJlYWQsIE5VTEwpOworCQljbG9zZShjdHh0LT5wYW1fcHNvY2spOworCQljbG9zZShjdHh0LT5wYW1fY3NvY2spOworCQltZW1zZXQoY3R4dCwgMCwgc2l6ZW9mKCpjdHh0KSk7CisJCWNsZWFudXBfY3R4dCA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50Citzc2hwYW1fbnVsbF9jb252KGludCBuLCBzc2hwYW1fY29uc3Qgc3RydWN0IHBhbV9tZXNzYWdlICoqbXNnLAorICAgIHN0cnVjdCBwYW1fcmVzcG9uc2UgKipyZXNwLCB2b2lkICpkYXRhKQoreworCWRlYnVnMygiUEFNOiAlcyBlbnRlcmluZywgJWQgbWVzc2FnZXMiLCBfX2Z1bmNfXywgbik7CisJcmV0dXJuIChQQU1fQ09OVl9FUlIpOworfQorCitzdGF0aWMgc3RydWN0IHBhbV9jb252IG51bGxfY29udiA9IHsgc3NocGFtX251bGxfY29udiwgTlVMTCB9OworCitzdGF0aWMgaW50Citzc2hwYW1fc3RvcmVfY29udihpbnQgbiwgc3NocGFtX2NvbnN0IHN0cnVjdCBwYW1fbWVzc2FnZSAqKm1zZywKKyAgICBzdHJ1Y3QgcGFtX3Jlc3BvbnNlICoqcmVzcCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGFtX3Jlc3BvbnNlICpyZXBseTsKKwlpbnQgaTsKKwlzaXplX3QgbGVuOworCisJZGVidWczKCJQQU06ICVzIGNhbGxlZCB3aXRoICVkIG1lc3NhZ2VzIiwgX19mdW5jX18sIG4pOworCSpyZXNwID0gTlVMTDsKKworCWlmIChuIDw9IDAgfHwgbiA+IFBBTV9NQVhfTlVNX01TRykKKwkJcmV0dXJuIChQQU1fQ09OVl9FUlIpOworCisJaWYgKChyZXBseSA9IGNhbGxvYyhuLCBzaXplb2YoKnJlcGx5KSkpID09IE5VTEwpCisJCXJldHVybiAoUEFNX0NPTlZfRVJSKTsKKworCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKwkJc3dpdGNoIChQQU1fTVNHX01FTUJFUihtc2csIGksIG1zZ19zdHlsZSkpIHsKKwkJY2FzZSBQQU1fRVJST1JfTVNHOgorCQljYXNlIFBBTV9URVhUX0lORk86CisJCQlsZW4gPSBzdHJsZW4oUEFNX01TR19NRU1CRVIobXNnLCBpLCBtc2cpKTsKKwkJCWJ1ZmZlcl9hcHBlbmQoJmxvZ2lubXNnLCBQQU1fTVNHX01FTUJFUihtc2csIGksIG1zZyksIGxlbik7CisJCQlidWZmZXJfYXBwZW5kKCZsb2dpbm1zZywgIlxuIiwgMSApOworCQkJcmVwbHlbaV0ucmVzcF9yZXRjb2RlID0gUEFNX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKwkqcmVzcCA9IHJlcGx5OworCXJldHVybiAoUEFNX1NVQ0NFU1MpOworCisgZmFpbDoKKwlmb3IoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJaWYgKHJlcGx5W2ldLnJlc3AgIT0gTlVMTCkKKwkJCXhmcmVlKHJlcGx5W2ldLnJlc3ApOworCX0KKwl4ZnJlZShyZXBseSk7CisJcmV0dXJuIChQQU1fQ09OVl9FUlIpOworfQorCitzdGF0aWMgc3RydWN0IHBhbV9jb252IHN0b3JlX2NvbnYgPSB7IHNzaHBhbV9zdG9yZV9jb252LCBOVUxMIH07CisKK3ZvaWQKK3NzaHBhbV9jbGVhbnVwKHZvaWQpCit7CisJaWYgKHNzaHBhbV9oYW5kbGUgPT0gTlVMTCB8fCAodXNlX3ByaXZzZXAgJiYgIW1tX2lzX21vbml0b3IoKSkpCisJCXJldHVybjsKKwlkZWJ1ZygiUEFNOiBjbGVhbnVwIik7CisJcGFtX3NldF9pdGVtKHNzaHBhbV9oYW5kbGUsIFBBTV9DT05WLCAoY29uc3Qgdm9pZCAqKSZudWxsX2NvbnYpOworCWlmIChzc2hwYW1fc2Vzc2lvbl9vcGVuKSB7CisJCWRlYnVnKCJQQU06IGNsb3Npbmcgc2Vzc2lvbiIpOworCQlwYW1fY2xvc2Vfc2Vzc2lvbihzc2hwYW1faGFuZGxlLCBQQU1fU0lMRU5UKTsKKwkJc3NocGFtX3Nlc3Npb25fb3BlbiA9IDA7CisJfQorCWlmIChzc2hwYW1fY3JlZF9lc3RhYmxpc2hlZCkgeworCQlkZWJ1ZygiUEFNOiBkZWxldGluZyBjcmVkZW50aWFscyIpOworCQlwYW1fc2V0Y3JlZChzc2hwYW1faGFuZGxlLCBQQU1fREVMRVRFX0NSRUQpOworCQlzc2hwYW1fY3JlZF9lc3RhYmxpc2hlZCA9IDA7CisJfQorCXNzaHBhbV9hdXRoZW50aWNhdGVkID0gMDsKKwlwYW1fZW5kKHNzaHBhbV9oYW5kbGUsIHNzaHBhbV9lcnIpOworCXNzaHBhbV9oYW5kbGUgPSBOVUxMOworfQorCitzdGF0aWMgaW50Citzc2hwYW1faW5pdChBdXRoY3R4dCAqYXV0aGN0eHQpCit7CisJZXh0ZXJuIGNoYXIgKl9fcHJvZ25hbWU7CisJY29uc3QgY2hhciAqcGFtX3Job3N0LCAqcGFtX3VzZXIsICp1c2VyID0gYXV0aGN0eHQtPnVzZXI7CisJY29uc3QgY2hhciAqKnB0cl9wYW1fdXNlciA9ICZwYW1fdXNlcjsKKworCWlmIChzc2hwYW1faGFuZGxlICE9IE5VTEwpIHsKKwkJLyogV2UgYWxyZWFkeSBoYXZlIGEgUEFNIGNvbnRleHQ7IGNoZWNrIGlmIHRoZSB1c2VyIG1hdGNoZXMgKi8KKwkJc3NocGFtX2VyciA9IHBhbV9nZXRfaXRlbShzc2hwYW1faGFuZGxlLAorCQkgICAgUEFNX1VTRVIsIChzc2hwYW1fY29uc3Qgdm9pZCAqKilwdHJfcGFtX3VzZXIpOworCQlpZiAoc3NocGFtX2VyciA9PSBQQU1fU1VDQ0VTUyAmJiBzdHJjbXAodXNlciwgcGFtX3VzZXIpID09IDApCisJCQlyZXR1cm4gKDApOworCQlwYW1fZW5kKHNzaHBhbV9oYW5kbGUsIHNzaHBhbV9lcnIpOworCQlzc2hwYW1faGFuZGxlID0gTlVMTDsKKwl9CisJZGVidWcoIlBBTTogaW5pdGlhbGl6aW5nIGZvciBcIiVzXCIiLCB1c2VyKTsKKwlzc2hwYW1fZXJyID0KKwkgICAgcGFtX3N0YXJ0KFNTSERfUEFNX1NFUlZJQ0UsIHVzZXIsICZzdG9yZV9jb252LCAmc3NocGFtX2hhbmRsZSk7CisJc3NocGFtX2F1dGhjdHh0ID0gYXV0aGN0eHQ7CisKKwlpZiAoc3NocGFtX2VyciAhPSBQQU1fU1VDQ0VTUykgeworCQlwYW1fZW5kKHNzaHBhbV9oYW5kbGUsIHNzaHBhbV9lcnIpOworCQlzc2hwYW1faGFuZGxlID0gTlVMTDsKKwkJcmV0dXJuICgtMSk7CisJfQorCXBhbV9yaG9zdCA9IGdldF9yZW1vdGVfbmFtZV9vcl9pcCh1dG1wX2xlbiwgb3B0aW9ucy51c2VfZG5zKTsKKwlkZWJ1ZygiUEFNOiBzZXR0aW5nIFBBTV9SSE9TVCB0byBcIiVzXCIiLCBwYW1fcmhvc3QpOworCXNzaHBhbV9lcnIgPSBwYW1fc2V0X2l0ZW0oc3NocGFtX2hhbmRsZSwgUEFNX1JIT1NULCBwYW1fcmhvc3QpOworCWlmIChzc2hwYW1fZXJyICE9IFBBTV9TVUNDRVNTKSB7CisJCXBhbV9lbmQoc3NocGFtX2hhbmRsZSwgc3NocGFtX2Vycik7CisJCXNzaHBhbV9oYW5kbGUgPSBOVUxMOworCQlyZXR1cm4gKC0xKTsKKwl9CisjaWZkZWYgUEFNX1RUWV9LTFVER0UKKwkvKgorCSAqIFNvbWUgc2lsbHkgUEFNIG1vZHVsZXMgKGUuZy4gcGFtX3RpbWUpIHJlcXVpcmUgYSBUVFkgdG8gb3BlcmF0ZS4KKwkgKiBzc2hkIGRvZXNuJ3Qgc2V0IHRoZSB0dHkgdW50aWwgdG9vIGxhdGUgaW4gdGhlIGF1dGggcHJvY2VzcyBhbmQKKwkgKiBtYXkgbm90IGV2ZW4gc2V0IG9uZSAoZm9yIHR0eS1sZXNzIGNvbm5lY3Rpb25zKQorCSAqLworCWRlYnVnKCJQQU06IHNldHRpbmcgUEFNX1RUWSB0byBcInNzaFwiIik7CisJc3NocGFtX2VyciA9IHBhbV9zZXRfaXRlbShzc2hwYW1faGFuZGxlLCBQQU1fVFRZLCAic3NoIik7CisJaWYgKHNzaHBhbV9lcnIgIT0gUEFNX1NVQ0NFU1MpIHsKKwkJcGFtX2VuZChzc2hwYW1faGFuZGxlLCBzc2hwYW1fZXJyKTsKKwkJc3NocGFtX2hhbmRsZSA9IE5VTEw7CisJCXJldHVybiAoLTEpOworCX0KKyNlbmRpZgorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkICoKK3NzaHBhbV9pbml0X2N0eChBdXRoY3R4dCAqYXV0aGN0eHQpCit7CisJc3RydWN0IHBhbV9jdHh0ICpjdHh0OworCWludCBzb2Nrc1syXTsKKworCWRlYnVnMygiUEFNOiAlcyBlbnRlcmluZyIsIF9fZnVuY19fKTsKKwkvKgorCSAqIFJlZnVzZSB0byBzdGFydCBpZiB3ZSBkb24ndCBoYXZlIFBBTSBlbmFibGVkIG9yIGRvX3BhbV9hY2NvdW50CisJICogaGFzIHByZXZpb3VzbHkgZmFpbGVkLgorCSAqLworCWlmICghb3B0aW9ucy51c2VfcGFtIHx8IHNzaHBhbV9hY2NvdW50X3N0YXR1cyA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIEluaXRpYWxpemUgUEFNICovCisJaWYgKHNzaHBhbV9pbml0KGF1dGhjdHh0KSA9PSAtMSkgeworCQllcnJvcigiUEFNOiBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwljdHh0ID0geGNhbGxvYygxLCBzaXplb2YgKmN0eHQpOworCisJLyogU3RhcnQgdGhlIGF1dGhlbnRpY2F0aW9uIHRocmVhZCAqLworCWlmIChzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCBQRl9VTlNQRUMsIHNvY2tzKSA9PSAtMSkgeworCQllcnJvcigiUEFNOiBmYWlsZWQgY3JlYXRlIHNvY2tldHM6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJeGZyZWUoY3R4dCk7CisJCXJldHVybiAoTlVMTCk7CisJfQorCWN0eHQtPnBhbV9wc29jayA9IHNvY2tzWzBdOworCWN0eHQtPnBhbV9jc29jayA9IHNvY2tzWzFdOworCWlmIChwdGhyZWFkX2NyZWF0ZSgmY3R4dC0+cGFtX3RocmVhZCwgTlVMTCwgc3NocGFtX3RocmVhZCwgY3R4dCkgPT0gLTEpIHsKKwkJZXJyb3IoIlBBTTogZmFpbGVkIHRvIHN0YXJ0IGF1dGhlbnRpY2F0aW9uIHRocmVhZDogJXMiLAorCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2Uoc29ja3NbMF0pOworCQljbG9zZShzb2Nrc1sxXSk7CisJCXhmcmVlKGN0eHQpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwljbGVhbnVwX2N0eHQgPSBjdHh0OworCXJldHVybiAoY3R4dCk7Cit9CisKK3N0YXRpYyBpbnQKK3NzaHBhbV9xdWVyeSh2b2lkICpjdHgsIGNoYXIgKipuYW1lLCBjaGFyICoqaW5mbywKKyAgICB1X2ludCAqbnVtLCBjaGFyICoqKnByb21wdHMsIHVfaW50ICoqZWNob19vbikKK3sKKwlCdWZmZXIgYnVmZmVyOworCXN0cnVjdCBwYW1fY3R4dCAqY3R4dCA9IGN0eDsKKwlzaXplX3QgcGxlbjsKKwl1X2NoYXIgdHlwZTsKKwljaGFyICptc2c7CisJc2l6ZV90IGxlbiwgbWxlbjsKKworCWRlYnVnMygiUEFNOiAlcyBlbnRlcmluZyIsIF9fZnVuY19fKTsKKwlidWZmZXJfaW5pdCgmYnVmZmVyKTsKKwkqbmFtZSA9IHhzdHJkdXAoIiIpOworCSppbmZvID0geHN0cmR1cCgiIik7CisJKnByb21wdHMgPSB4bWFsbG9jKHNpemVvZihjaGFyICopKTsKKwkqKnByb21wdHMgPSBOVUxMOworCXBsZW4gPSAwOworCSplY2hvX29uID0geG1hbGxvYyhzaXplb2YodV9pbnQpKTsKKwl3aGlsZSAoc3NoX21zZ19yZWN2KGN0eHQtPnBhbV9wc29jaywgJmJ1ZmZlcikgPT0gMCkgeworCQl0eXBlID0gYnVmZmVyX2dldF9jaGFyKCZidWZmZXIpOworCQltc2cgPSBidWZmZXJfZ2V0X3N0cmluZygmYnVmZmVyLCBOVUxMKTsKKwkJbWxlbiA9IHN0cmxlbihtc2cpOworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBQQU1fUFJPTVBUX0VDSE9fT046CisJCWNhc2UgUEFNX1BST01QVF9FQ0hPX09GRjoKKwkJCSpudW0gPSAxOworCQkJbGVuID0gcGxlbiArIG1sZW4gKyAxOworCQkJKipwcm9tcHRzID0geHJlYWxsb2MoKipwcm9tcHRzLCAxLCBsZW4pOworCQkJc3RybGNweSgqKnByb21wdHMgKyBwbGVuLCBtc2csIGxlbiAtIHBsZW4pOworCQkJcGxlbiArPSBtbGVuOworCQkJKiplY2hvX29uID0gKHR5cGUgPT0gUEFNX1BST01QVF9FQ0hPX09OKTsKKwkJCXhmcmVlKG1zZyk7CisJCQlyZXR1cm4gKDApOworCQljYXNlIFBBTV9FUlJPUl9NU0c6CisJCWNhc2UgUEFNX1RFWFRfSU5GTzoKKwkJCS8qIGFjY3VtdWxhdGUgbWVzc2FnZXMgKi8KKwkJCWxlbiA9IHBsZW4gKyBtbGVuICsgMjsKKwkJCSoqcHJvbXB0cyA9IHhyZWFsbG9jKCoqcHJvbXB0cywgMSwgbGVuKTsKKwkJCXN0cmxjcHkoKipwcm9tcHRzICsgcGxlbiwgbXNnLCBsZW4gLSBwbGVuKTsKKwkJCXBsZW4gKz0gbWxlbjsKKwkJCXN0cmxjYXQoKipwcm9tcHRzICsgcGxlbiwgIlxuIiwgbGVuIC0gcGxlbik7CisJCQlwbGVuKys7CisJCQl4ZnJlZShtc2cpOworCQkJYnJlYWs7CisJCWNhc2UgUEFNX0FDQ1RfRVhQSVJFRDoKKwkJCXNzaHBhbV9hY2NvdW50X3N0YXR1cyA9IDA7CisJCQkvKiBGQUxMVEhST1VHSCAqLworCQljYXNlIFBBTV9BVVRIX0VSUjoKKwkJCWRlYnVnMygiUEFNOiAlcyIsIHBhbV9zdHJlcnJvcihzc2hwYW1faGFuZGxlLCB0eXBlKSk7CisJCQlpZiAoKipwcm9tcHRzICE9IE5VTEwgJiYgc3RybGVuKCoqcHJvbXB0cykgIT0gMCkgeworCQkJCSppbmZvID0gKipwcm9tcHRzOworCQkJCSoqcHJvbXB0cyA9IE5VTEw7CisJCQkJKm51bSA9IDA7CisJCQkJKiplY2hvX29uID0gMDsKKwkJCQljdHh0LT5wYW1fZG9uZSA9IC0xOworCQkJCXhmcmVlKG1zZyk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQkvKiBGQUxMVEhST1VHSCAqLworCQljYXNlIFBBTV9TVUNDRVNTOgorCQkJaWYgKCoqcHJvbXB0cyAhPSBOVUxMKSB7CisJCQkJLyogZHJhaW4gYW55IGFjY3VtdWxhdGVkIG1lc3NhZ2VzICovCisJCQkJZGVidWcoIlBBTTogJXMiLCAqKnByb21wdHMpOworCQkJCWJ1ZmZlcl9hcHBlbmQoJmxvZ2lubXNnLCAqKnByb21wdHMsCisJCQkJICAgIHN0cmxlbigqKnByb21wdHMpKTsKKwkJCQl4ZnJlZSgqKnByb21wdHMpOworCQkJCSoqcHJvbXB0cyA9IE5VTEw7CisJCQl9CisJCQlpZiAodHlwZSA9PSBQQU1fU1VDQ0VTUykgeworCQkJCWlmICghc3NocGFtX2F1dGhjdHh0LT52YWxpZCB8fAorCQkJCSAgICAoc3NocGFtX2F1dGhjdHh0LT5wdy0+cHdfdWlkID09IDAgJiYKKwkJCQkgICAgb3B0aW9ucy5wZXJtaXRfcm9vdF9sb2dpbiAhPSBQRVJNSVRfWUVTKSkKKwkJCQkJZmF0YWwoIkludGVybmFsIGVycm9yOiBQQU0gYXV0aCAiCisJCQkJCSAgICAic3VjY2VlZGVkIHdoZW4gaXQgc2hvdWxkIGhhdmUgIgorCQkJCQkgICAgImZhaWxlZCIpOworCQkJCWltcG9ydF9lbnZpcm9ubWVudHMoJmJ1ZmZlcik7CisJCQkJKm51bSA9IDA7CisJCQkJKiplY2hvX29uID0gMDsKKwkJCQljdHh0LT5wYW1fZG9uZSA9IDE7CisJCQkJeGZyZWUobXNnKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJZXJyb3IoIlBBTTogJXMgZm9yICVzJS4xMDBzIGZyb20gJS4xMDBzIiwgbXNnLAorCQkJICAgIHNzaHBhbV9hdXRoY3R4dC0+dmFsaWQgPyAiIiA6ICJpbGxlZ2FsIHVzZXIgIiwKKwkJCSAgICBzc2hwYW1fYXV0aGN0eHQtPnVzZXIsCisJCQkgICAgZ2V0X3JlbW90ZV9uYW1lX29yX2lwKHV0bXBfbGVuLCBvcHRpb25zLnVzZV9kbnMpKTsKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWRlZmF1bHQ6CisJCQkqbnVtID0gMDsKKwkJCSoqZWNob19vbiA9IDA7CisJCQl4ZnJlZShtc2cpOworCQkJY3R4dC0+cGFtX2RvbmUgPSAtMTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJfQorCXJldHVybiAoLTEpOworfQorCisvKiBYWFggLSBzZWUgYWxzbyBjb21tZW50IGluIGF1dGgtY2hhbGwuYzp2ZXJpZnlfcmVzcG9uc2UgKi8KK3N0YXRpYyBpbnQKK3NzaHBhbV9yZXNwb25kKHZvaWQgKmN0eCwgdV9pbnQgbnVtLCBjaGFyICoqcmVzcCkKK3sKKwlCdWZmZXIgYnVmZmVyOworCXN0cnVjdCBwYW1fY3R4dCAqY3R4dCA9IGN0eDsKKworCWRlYnVnMigiUEFNOiAlcyBlbnRlcmluZywgJXUgcmVzcG9uc2VzIiwgX19mdW5jX18sIG51bSk7CisJc3dpdGNoIChjdHh0LT5wYW1fZG9uZSkgeworCWNhc2UgMToKKwkJc3NocGFtX2F1dGhlbnRpY2F0ZWQgPSAxOworCQlyZXR1cm4gKDApOworCWNhc2UgMDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuICgtMSk7CisJfQorCWlmIChudW0gIT0gMSkgeworCQllcnJvcigiUEFNOiBleHBlY3RlZCBvbmUgcmVzcG9uc2UsIGdvdCAldSIsIG51bSk7CisJCXJldHVybiAoLTEpOworCX0KKwlidWZmZXJfaW5pdCgmYnVmZmVyKTsKKwlpZiAoc3NocGFtX2F1dGhjdHh0LT52YWxpZCAmJgorCSAgICAoc3NocGFtX2F1dGhjdHh0LT5wdy0+cHdfdWlkICE9IDAgfHwKKwkgICAgb3B0aW9ucy5wZXJtaXRfcm9vdF9sb2dpbiA9PSBQRVJNSVRfWUVTKSkKKwkJYnVmZmVyX3B1dF9jc3RyaW5nKCZidWZmZXIsICpyZXNwKTsKKwllbHNlCisJCWJ1ZmZlcl9wdXRfY3N0cmluZygmYnVmZmVyLCBiYWRwdyk7CisJaWYgKHNzaF9tc2dfc2VuZChjdHh0LT5wYW1fcHNvY2ssIFBBTV9BVVRIVE9LLCAmYnVmZmVyKSA9PSAtMSkgeworCQlidWZmZXJfZnJlZSgmYnVmZmVyKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCWJ1ZmZlcl9mcmVlKCZidWZmZXIpOworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitzc2hwYW1fZnJlZV9jdHgodm9pZCAqY3R4dHApCit7CisJc3RydWN0IHBhbV9jdHh0ICpjdHh0ID0gY3R4dHA7CisKKwlkZWJ1ZzMoIlBBTTogJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7CisJc3NocGFtX3RocmVhZF9jbGVhbnVwKCk7CisJeGZyZWUoY3R4dCk7CisJLyoKKwkgKiBXZSBkb24ndCBjYWxsIHNzaHBhbV9jbGVhbnVwKCkgaGVyZSBiZWNhdXNlIHdlIG1heSBuZWVkIHRoZSBQQU0KKwkgKiBoYW5kbGUgYXQgYSBsYXRlciBzdGFnZSwgZS5nLiB3aGVuIHNldHRpbmcgdXAgYSBzZXNzaW9uLiAgSXQncworCSAqIHN0aWxsIG9uIHRoZSBjbGVhbnVwIGxpc3QsIHNvIHBhbV9lbmQoKSAqd2lsbCogYmUgY2FsbGVkIGJlZm9yZQorCSAqIHRoZSBzZXJ2ZXIgcHJvY2VzcyB0ZXJtaW5hdGVzLgorCSAqLworfQorCitLYmRpbnREZXZpY2Ugc3NocGFtX2RldmljZSA9IHsKKwkicGFtIiwKKwlzc2hwYW1faW5pdF9jdHgsCisJc3NocGFtX3F1ZXJ5LAorCXNzaHBhbV9yZXNwb25kLAorCXNzaHBhbV9mcmVlX2N0eAorfTsKKworS2JkaW50RGV2aWNlIG1tX3NzaHBhbV9kZXZpY2UgPSB7CisJInBhbSIsCisJbW1fc3NocGFtX2luaXRfY3R4LAorCW1tX3NzaHBhbV9xdWVyeSwKKwltbV9zc2hwYW1fcmVzcG9uZCwKKwltbV9zc2hwYW1fZnJlZV9jdHgKK307CisKKy8qCisgKiBUaGlzIHJlcGxhY2VzIGF1dGgtcGFtLmMKKyAqLwordm9pZAorc3RhcnRfcGFtKEF1dGhjdHh0ICphdXRoY3R4dCkKK3sKKwlpZiAoIW9wdGlvbnMudXNlX3BhbSkKKwkJZmF0YWwoIlBBTTogaW5pdGlhbGlzYXRpb24gcmVxdWVzdGVkIHdoZW4gVXNlUEFNPW5vIik7CisKKwlpZiAoc3NocGFtX2luaXQoYXV0aGN0eHQpID09IC0xKQorCQlmYXRhbCgiUEFNOiBpbml0aWFsaXNhdGlvbiBmYWlsZWQiKTsKK30KKwordm9pZAorZmluaXNoX3BhbSh2b2lkKQoreworCXNzaHBhbV9jbGVhbnVwKCk7Cit9CisKK3VfaW50Citkb19wYW1fYWNjb3VudCh2b2lkKQoreworCWRlYnVnKCIlczogY2FsbGVkIiwgX19mdW5jX18pOworCWlmIChzc2hwYW1fYWNjb3VudF9zdGF0dXMgIT0gLTEpCisJCXJldHVybiAoc3NocGFtX2FjY291bnRfc3RhdHVzKTsKKworCXNzaHBhbV9lcnIgPSBwYW1fYWNjdF9tZ210KHNzaHBhbV9oYW5kbGUsIDApOworCWRlYnVnMygiUEFNOiAlcyBwYW1fYWNjdF9tZ210ID0gJWQgKCVzKSIsIF9fZnVuY19fLCBzc2hwYW1fZXJyLAorCSAgICBwYW1fc3RyZXJyb3Ioc3NocGFtX2hhbmRsZSwgc3NocGFtX2VycikpOworCisJaWYgKHNzaHBhbV9lcnIgIT0gUEFNX1NVQ0NFU1MgJiYgc3NocGFtX2VyciAhPSBQQU1fTkVXX0FVVEhUT0tfUkVRRCkgeworCQlzc2hwYW1fYWNjb3VudF9zdGF0dXMgPSAwOworCQlyZXR1cm4gKHNzaHBhbV9hY2NvdW50X3N0YXR1cyk7CisJfQorCisJaWYgKHNzaHBhbV9lcnIgPT0gUEFNX05FV19BVVRIVE9LX1JFUUQpCisJCXNzaHBhbV9wYXNzd29yZF9jaGFuZ2VfcmVxdWlyZWQoMSk7CisKKwlzc2hwYW1fYWNjb3VudF9zdGF0dXMgPSAxOworCXJldHVybiAoc3NocGFtX2FjY291bnRfc3RhdHVzKTsKK30KKwordm9pZAorZG9fcGFtX3NldF90dHkoY29uc3QgY2hhciAqdHR5KQoreworCWlmICh0dHkgIT0gTlVMTCkgeworCQlkZWJ1ZygiUEFNOiBzZXR0aW5nIFBBTV9UVFkgdG8gXCIlc1wiIiwgdHR5KTsKKwkJc3NocGFtX2VyciA9IHBhbV9zZXRfaXRlbShzc2hwYW1faGFuZGxlLCBQQU1fVFRZLCB0dHkpOworCQlpZiAoc3NocGFtX2VyciAhPSBQQU1fU1VDQ0VTUykKKwkJCWZhdGFsKCJQQU06IGZhaWxlZCB0byBzZXQgUEFNX1RUWTogJXMiLAorCQkJICAgIHBhbV9zdHJlcnJvcihzc2hwYW1faGFuZGxlLCBzc2hwYW1fZXJyKSk7CisJfQorfQorCit2b2lkCitkb19wYW1fc2V0Y3JlZChpbnQgaW5pdCkKK3sKKwlzc2hwYW1fZXJyID0gcGFtX3NldF9pdGVtKHNzaHBhbV9oYW5kbGUsIFBBTV9DT05WLAorCSAgICAoY29uc3Qgdm9pZCAqKSZzdG9yZV9jb252KTsKKwlpZiAoc3NocGFtX2VyciAhPSBQQU1fU1VDQ0VTUykKKwkJZmF0YWwoIlBBTTogZmFpbGVkIHRvIHNldCBQQU1fQ09OVjogJXMiLAorCQkgICAgcGFtX3N0cmVycm9yKHNzaHBhbV9oYW5kbGUsIHNzaHBhbV9lcnIpKTsKKwlpZiAoaW5pdCkgeworCQlkZWJ1ZygiUEFNOiBlc3RhYmxpc2hpbmcgY3JlZGVudGlhbHMiKTsKKwkJc3NocGFtX2VyciA9IHBhbV9zZXRjcmVkKHNzaHBhbV9oYW5kbGUsIFBBTV9FU1RBQkxJU0hfQ1JFRCk7CisJfSBlbHNlIHsKKwkJZGVidWcoIlBBTTogcmVpbml0aWFsaXppbmcgY3JlZGVudGlhbHMiKTsKKwkJc3NocGFtX2VyciA9IHBhbV9zZXRjcmVkKHNzaHBhbV9oYW5kbGUsIFBBTV9SRUlOSVRJQUxJWkVfQ1JFRCk7CisJfQorCWlmIChzc2hwYW1fZXJyID09IFBBTV9TVUNDRVNTKSB7CisJCXNzaHBhbV9jcmVkX2VzdGFibGlzaGVkID0gMTsKKwkJcmV0dXJuOworCX0KKwlpZiAoc3NocGFtX2F1dGhlbnRpY2F0ZWQpCisJCWZhdGFsKCJQQU06IHBhbV9zZXRjcmVkKCk6ICVzIiwKKwkJICAgIHBhbV9zdHJlcnJvcihzc2hwYW1faGFuZGxlLCBzc2hwYW1fZXJyKSk7CisJZWxzZQorCQlkZWJ1ZygiUEFNOiBwYW1fc2V0Y3JlZCgpOiAlcyIsCisJCSAgICBwYW1fc3RyZXJyb3Ioc3NocGFtX2hhbmRsZSwgc3NocGFtX2VycikpOworfQorCitzdGF0aWMgaW50Citzc2hwYW1fdHR5X2NvbnYoaW50IG4sIHNzaHBhbV9jb25zdCBzdHJ1Y3QgcGFtX21lc3NhZ2UgKiptc2csCisgICAgc3RydWN0IHBhbV9yZXNwb25zZSAqKnJlc3AsIHZvaWQgKmRhdGEpCit7CisJY2hhciBpbnB1dFtQQU1fTUFYX01TR19TSVpFXTsKKwlzdHJ1Y3QgcGFtX3Jlc3BvbnNlICpyZXBseTsKKwlpbnQgaTsKKworCWRlYnVnMygiUEFNOiAlcyBjYWxsZWQgd2l0aCAlZCBtZXNzYWdlcyIsIF9fZnVuY19fLCBuKTsKKworCSpyZXNwID0gTlVMTDsKKworCWlmIChuIDw9IDAgfHwgbiA+IFBBTV9NQVhfTlVNX01TRyB8fCAhaXNhdHR5KFNURElOX0ZJTEVOTykpCisJCXJldHVybiAoUEFNX0NPTlZfRVJSKTsKKworCWlmICgocmVwbHkgPSBjYWxsb2Mobiwgc2l6ZW9mKCpyZXBseSkpKSA9PSBOVUxMKQorCQlyZXR1cm4gKFBBTV9DT05WX0VSUik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisJCXN3aXRjaCAoUEFNX01TR19NRU1CRVIobXNnLCBpLCBtc2dfc3R5bGUpKSB7CisJCWNhc2UgUEFNX1BST01QVF9FQ0hPX09GRjoKKwkJCXJlcGx5W2ldLnJlc3AgPQorCQkJICAgIHJlYWRfcGFzc3BocmFzZShQQU1fTVNHX01FTUJFUihtc2csIGksIG1zZyksCisJCQkgICAgUlBfQUxMT1dfU1RESU4pOworCQkJcmVwbHlbaV0ucmVzcF9yZXRjb2RlID0gUEFNX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJY2FzZSBQQU1fUFJPTVBUX0VDSE9fT046CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBQQU1fTVNHX01FTUJFUihtc2csIGksIG1zZykpOworCQkJaWYgKGZnZXRzKGlucHV0LCBzaXplb2YgaW5wdXQsIHN0ZGluKSA9PSBOVUxMKQorCQkJCWlucHV0WzBdID0gJ1wwJzsKKwkJCWlmICgocmVwbHlbaV0ucmVzcCA9IHN0cmR1cChpbnB1dCkpID09IE5VTEwpCisJCQkJZ290byBmYWlsOworCQkJcmVwbHlbaV0ucmVzcF9yZXRjb2RlID0gUEFNX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJY2FzZSBQQU1fRVJST1JfTVNHOgorCQljYXNlIFBBTV9URVhUX0lORk86CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBQQU1fTVNHX01FTUJFUihtc2csIGksIG1zZykpOworCQkJcmVwbHlbaV0ucmVzcF9yZXRjb2RlID0gUEFNX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKwkqcmVzcCA9IHJlcGx5OworCXJldHVybiAoUEFNX1NVQ0NFU1MpOworCisgZmFpbDoKKwlmb3IoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJaWYgKHJlcGx5W2ldLnJlc3AgIT0gTlVMTCkKKwkJCXhmcmVlKHJlcGx5W2ldLnJlc3ApOworCX0KKwl4ZnJlZShyZXBseSk7CisJcmV0dXJuIChQQU1fQ09OVl9FUlIpOworfQorCitzdGF0aWMgc3RydWN0IHBhbV9jb252IHR0eV9jb252ID0geyBzc2hwYW1fdHR5X2NvbnYsIE5VTEwgfTsKKworLyoKKyAqIFhYWCB0aGlzIHNob3VsZCBiZSBkb25lIGluIHRoZSBhdXRoZW50aWNhdGlvbiBwaGFzZSwgYnV0IHNzaDEgZG9lc24ndAorICogc3VwcG9ydCB0aGF0CisgKi8KK3ZvaWQKK2RvX3BhbV9jaGF1dGh0b2sodm9pZCkKK3sKKwlpZiAodXNlX3ByaXZzZXApCisJCWZhdGFsKCJQYXNzd29yZCBleHBpcmVkICh1bmFibGUgdG8gY2hhbmdlIHdpdGggcHJpdnNlcCkiKTsKKwlzc2hwYW1fZXJyID0gcGFtX3NldF9pdGVtKHNzaHBhbV9oYW5kbGUsIFBBTV9DT05WLAorCSAgICAoY29uc3Qgdm9pZCAqKSZ0dHlfY29udik7CisJaWYgKHNzaHBhbV9lcnIgIT0gUEFNX1NVQ0NFU1MpCisJCWZhdGFsKCJQQU06IGZhaWxlZCB0byBzZXQgUEFNX0NPTlY6ICVzIiwKKwkJICAgIHBhbV9zdHJlcnJvcihzc2hwYW1faGFuZGxlLCBzc2hwYW1fZXJyKSk7CisJZGVidWcoIlBBTTogY2hhbmdpbmcgcGFzc3dvcmQiKTsKKwlzc2hwYW1fZXJyID0gcGFtX2NoYXV0aHRvayhzc2hwYW1faGFuZGxlLCBQQU1fQ0hBTkdFX0VYUElSRURfQVVUSFRPSyk7CisJaWYgKHNzaHBhbV9lcnIgIT0gUEFNX1NVQ0NFU1MpCisJCWZhdGFsKCJQQU06IHBhbV9jaGF1dGh0b2soKTogJXMiLAorCQkgICAgcGFtX3N0cmVycm9yKHNzaHBhbV9oYW5kbGUsIHNzaHBhbV9lcnIpKTsKK30KKwordm9pZAorZG9fcGFtX3Nlc3Npb24odm9pZCkKK3sKKwlkZWJ1ZzMoIlBBTTogb3BlbmluZyBzZXNzaW9uIik7CisJc3NocGFtX2VyciA9IHBhbV9zZXRfaXRlbShzc2hwYW1faGFuZGxlLCBQQU1fQ09OViwKKwkgICAgKGNvbnN0IHZvaWQgKikmc3RvcmVfY29udik7CisJaWYgKHNzaHBhbV9lcnIgIT0gUEFNX1NVQ0NFU1MpCisJCWZhdGFsKCJQQU06IGZhaWxlZCB0byBzZXQgUEFNX0NPTlY6ICVzIiwKKwkJICAgIHBhbV9zdHJlcnJvcihzc2hwYW1faGFuZGxlLCBzc2hwYW1fZXJyKSk7CisJc3NocGFtX2VyciA9IHBhbV9vcGVuX3Nlc3Npb24oc3NocGFtX2hhbmRsZSwgMCk7CisJaWYgKHNzaHBhbV9lcnIgPT0gUEFNX1NVQ0NFU1MpCisJCXNzaHBhbV9zZXNzaW9uX29wZW4gPSAxOworCWVsc2UgeworCQlzc2hwYW1fc2Vzc2lvbl9vcGVuID0gMDsKKwkJZGlzYWJsZV9mb3J3YXJkaW5nKCk7CisJCWVycm9yKCJQQU06IHBhbV9vcGVuX3Nlc3Npb24oKTogJXMiLAorCQkgICAgcGFtX3N0cmVycm9yKHNzaHBhbV9oYW5kbGUsIHNzaHBhbV9lcnIpKTsKKwl9CisKK30KKworaW50Citpc19wYW1fc2Vzc2lvbl9vcGVuKHZvaWQpCit7CisJcmV0dXJuIHNzaHBhbV9zZXNzaW9uX29wZW47Cit9CisKKy8qCisgKiBTZXQgYSBQQU0gZW52aXJvbm1lbnQgc3RyaW5nLiBXZSBuZWVkIHRvIGRvIHRoaXMgc28gdGhhdCB0aGUgc2Vzc2lvbgorICogbW9kdWxlcyBjYW4gaGFuZGxlIHRoaW5ncyBsaWtlIEtlcmJlcm9zL0dTSSBjcmVkZW50aWFscyB0aGF0IGFwcGVhcgorICogZHVyaW5nIHRoZSBzc2ggYXV0aGVudGljYXRpb24gcHJvY2Vzcy4KKyAqLworaW50Citkb19wYW1fcHV0ZW52KGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlKQoreworCWludCByZXQgPSAxOworI2lmZGVmIEhBVkVfUEFNX1BVVEVOVgorCWNoYXIgKmNvbXBvdW5kOworCXNpemVfdCBsZW47CisKKwlsZW4gPSBzdHJsZW4obmFtZSkgKyBzdHJsZW4odmFsdWUpICsgMjsKKwljb21wb3VuZCA9IHhtYWxsb2MobGVuKTsKKworCXNucHJpbnRmKGNvbXBvdW5kLCBsZW4sICIlcz0lcyIsIG5hbWUsIHZhbHVlKTsKKwlyZXQgPSBwYW1fcHV0ZW52KHNzaHBhbV9oYW5kbGUsIGNvbXBvdW5kKTsKKwl4ZnJlZShjb21wb3VuZCk7CisjZW5kaWYKKworCXJldHVybiAocmV0KTsKK30KKworY2hhciAqKgorZmV0Y2hfcGFtX2NoaWxkX2Vudmlyb25tZW50KHZvaWQpCit7CisJcmV0dXJuIHNzaHBhbV9lbnY7Cit9CisKK2NoYXIgKioKK2ZldGNoX3BhbV9lbnZpcm9ubWVudCh2b2lkKQoreworCXJldHVybiAocGFtX2dldGVudmxpc3Qoc3NocGFtX2hhbmRsZSkpOworfQorCit2b2lkCitmcmVlX3BhbV9lbnZpcm9ubWVudChjaGFyICoqZW52KQoreworCWNoYXIgKiplbnZwOworCisJaWYgKGVudiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlmb3IgKGVudnAgPSBlbnY7ICplbnZwOyBlbnZwKyspCisJCXhmcmVlKCplbnZwKTsKKwl4ZnJlZShlbnYpOworfQorCisvKgorICogIkJsaW5kIiBjb252ZXJzYXRpb24gZnVuY3Rpb24gZm9yIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uLiAgQXNzdW1lcyB0aGF0CisgKiBlY2hvLW9mZiBwcm9tcHRzIGFyZSBmb3IgdGhlIHBhc3N3b3JkIGFuZCBzdG9yZXMgbWVzc2FnZXMgZm9yIGxhdGVyCisgKiBkaXNwbGF5LgorICovCitzdGF0aWMgaW50Citzc2hwYW1fcGFzc3dkX2NvbnYoaW50IG4sIHNzaHBhbV9jb25zdCBzdHJ1Y3QgcGFtX21lc3NhZ2UgKiptc2csCisgICAgc3RydWN0IHBhbV9yZXNwb25zZSAqKnJlc3AsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBhbV9yZXNwb25zZSAqcmVwbHk7CisJaW50IGk7CisJc2l6ZV90IGxlbjsKKworCWRlYnVnMygiUEFNOiAlcyBjYWxsZWQgd2l0aCAlZCBtZXNzYWdlcyIsIF9fZnVuY19fLCBuKTsKKworCSpyZXNwID0gTlVMTDsKKworCWlmIChuIDw9IDAgfHwgbiA+IFBBTV9NQVhfTlVNX01TRykKKwkJcmV0dXJuIChQQU1fQ09OVl9FUlIpOworCisJaWYgKChyZXBseSA9IGNhbGxvYyhuLCBzaXplb2YoKnJlcGx5KSkpID09IE5VTEwpCisJCXJldHVybiAoUEFNX0NPTlZfRVJSKTsKKworCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKwkJc3dpdGNoIChQQU1fTVNHX01FTUJFUihtc2csIGksIG1zZ19zdHlsZSkpIHsKKwkJY2FzZSBQQU1fUFJPTVBUX0VDSE9fT0ZGOgorCQkJaWYgKHNzaHBhbV9wYXNzd29yZCA9PSBOVUxMKQorCQkJCWdvdG8gZmFpbDsKKwkJCWlmICgocmVwbHlbaV0ucmVzcCA9IHN0cmR1cChzc2hwYW1fcGFzc3dvcmQpKSA9PSBOVUxMKQorCQkJCWdvdG8gZmFpbDsKKwkJCXJlcGx5W2ldLnJlc3BfcmV0Y29kZSA9IFBBTV9TVUNDRVNTOworCQkJYnJlYWs7CisJCWNhc2UgUEFNX0VSUk9SX01TRzoKKwkJY2FzZSBQQU1fVEVYVF9JTkZPOgorCQkJbGVuID0gc3RybGVuKFBBTV9NU0dfTUVNQkVSKG1zZywgaSwgbXNnKSk7CisJCQlpZiAobGVuID4gMCkgeworCQkJCWJ1ZmZlcl9hcHBlbmQoJmxvZ2lubXNnLAorCQkJCSAgICBQQU1fTVNHX01FTUJFUihtc2csIGksIG1zZyksIGxlbik7CisJCQkJYnVmZmVyX2FwcGVuZCgmbG9naW5tc2csICJcbiIsIDEpOworCQkJfQorCQkJaWYgKChyZXBseVtpXS5yZXNwID0gc3RyZHVwKCIiKSkgPT0gTlVMTCkKKwkJCQlnb3RvIGZhaWw7CisJCQlyZXBseVtpXS5yZXNwX3JldGNvZGUgPSBQQU1fU1VDQ0VTUzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBmYWlsOworCQl9CisJfQorCSpyZXNwID0gcmVwbHk7CisJcmV0dXJuIChQQU1fU1VDQ0VTUyk7CisKKyBmYWlsOgorCWZvcihpID0gMDsgaSA8IG47IGkrKykgeworCQlpZiAocmVwbHlbaV0ucmVzcCAhPSBOVUxMKQorCQkJeGZyZWUocmVwbHlbaV0ucmVzcCk7CisJfQorCXhmcmVlKHJlcGx5KTsKKwlyZXR1cm4gKFBBTV9DT05WX0VSUik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFtX2NvbnYgcGFzc3dkX2NvbnYgPSB7IHNzaHBhbV9wYXNzd2RfY29udiwgTlVMTCB9OworCisvKgorICogQXR0ZW1wdCBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiB2aWEgUEFNCisgKi8KK2ludAorc3NocGFtX2F1dGhfcGFzc3dkKEF1dGhjdHh0ICphdXRoY3R4dCwgY29uc3QgY2hhciAqcGFzc3dvcmQpCit7CisJaW50IGZsYWdzID0gKG9wdGlvbnMucGVybWl0X2VtcHR5X3Bhc3N3ZCA9PSAwID8KKwkgICAgUEFNX0RJU0FMTE9XX05VTExfQVVUSFRPSyA6IDApOworCisJaWYgKCFvcHRpb25zLnVzZV9wYW0gfHwgc3NocGFtX2hhbmRsZSA9PSBOVUxMKQorCQlmYXRhbCgiUEFNOiAlcyBjYWxsZWQgd2hlbiBQQU0gZGlzYWJsZWQgb3IgZmFpbGVkIHRvICIKKwkJICAgICJpbml0aWFsaXNlLiIsIF9fZnVuY19fKTsKKworCXNzaHBhbV9wYXNzd29yZCA9IHBhc3N3b3JkOworCXNzaHBhbV9hdXRoY3R4dCA9IGF1dGhjdHh0OworCisJLyoKKwkgKiBJZiB0aGUgdXNlciBsb2dnaW5nIGluIGlzIGludmFsaWQsIG9yIGlzIHJvb3QgYnV0IGlzIG5vdCBwZXJtaXR0ZWQKKwkgKiBieSBQZXJtaXRSb290TG9naW4sIHVzZSBhbiBpbnZhbGlkIHBhc3N3b3JkIHRvIHByZXZlbnQgbGVha2luZworCSAqIGluZm9ybWF0aW9uIHZpYSB0aW1pbmcgKGVnIGlmIHRoZSBQQU0gY29uZmlnIGhhcyBhIGRlbGF5IG9uIGZhaWwpLgorCSAqLworCWlmICghYXV0aGN0eHQtPnZhbGlkIHx8IChhdXRoY3R4dC0+cHctPnB3X3VpZCA9PSAwICYmCisJICAgIG9wdGlvbnMucGVybWl0X3Jvb3RfbG9naW4gIT0gUEVSTUlUX1lFUykpCisJCXNzaHBhbV9wYXNzd29yZCA9IGJhZHB3OworCisJc3NocGFtX2VyciA9IHBhbV9zZXRfaXRlbShzc2hwYW1faGFuZGxlLCBQQU1fQ09OViwKKwkgICAgKGNvbnN0IHZvaWQgKikmcGFzc3dkX2NvbnYpOworCWlmIChzc2hwYW1fZXJyICE9IFBBTV9TVUNDRVNTKQorCQlmYXRhbCgiUEFNOiAlczogZmFpbGVkIHRvIHNldCBQQU1fQ09OVjogJXMiLCBfX2Z1bmNfXywKKwkJICAgIHBhbV9zdHJlcnJvcihzc2hwYW1faGFuZGxlLCBzc2hwYW1fZXJyKSk7CisKKwlzc2hwYW1fZXJyID0gcGFtX2F1dGhlbnRpY2F0ZShzc2hwYW1faGFuZGxlLCBmbGFncyk7CisJc3NocGFtX3Bhc3N3b3JkID0gTlVMTDsKKwlpZiAoc3NocGFtX2VyciA9PSBQQU1fU1VDQ0VTUyAmJiBhdXRoY3R4dC0+dmFsaWQpIHsKKwkJZGVidWcoIlBBTTogcGFzc3dvcmQgYXV0aGVudGljYXRpb24gYWNjZXB0ZWQgZm9yICUuMTAwcyIsCisJCSAgICBhdXRoY3R4dC0+dXNlcik7CisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCWRlYnVnKCJQQU06IHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCBmb3IgJS4xMDBzOiAlcyIsCisJCSAgICBhdXRoY3R4dC0+dmFsaWQgPyBhdXRoY3R4dC0+dXNlciA6ICJhbiBpbGxlZ2FsIHVzZXIiLAorCQkgICAgcGFtX3N0cmVycm9yKHNzaHBhbV9oYW5kbGUsIHNzaHBhbV9lcnIpKTsKKwkJcmV0dXJuIDA7CisJfQorfQorI2VuZGlmIC8qIFVTRV9QQU0gKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvYXV0aC1wYW0uaCBiL29wZW5zc2gtNi4wcDEvYXV0aC1wYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWEyYjUyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9hdXRoLXBhbS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qICRJZDogYXV0aC1wYW0uaCx2IDEuMjcgMjAwNC8wOS8xMSAxMjoxNzoyNiBkdHVja2VyIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgRGFtaWVuIE1pbGxlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorI2lmZGVmIFVTRV9QQU0KKworI2lmICFkZWZpbmVkKFNTSERfUEFNX1NFUlZJQ0UpCisjIGRlZmluZSBTU0hEX1BBTV9TRVJWSUNFCQlfX3Byb2duYW1lCisjZW5kaWYKKwordm9pZCBzdGFydF9wYW0oQXV0aGN0eHQgKik7Cit2b2lkIGZpbmlzaF9wYW0odm9pZCk7Cit1X2ludCBkb19wYW1fYWNjb3VudCh2b2lkKTsKK3ZvaWQgZG9fcGFtX3Nlc3Npb24odm9pZCk7Cit2b2lkIGRvX3BhbV9zZXRfdHR5KGNvbnN0IGNoYXIgKik7Cit2b2lkIGRvX3BhbV9zZXRjcmVkKGludCApOwordm9pZCBkb19wYW1fY2hhdXRodG9rKHZvaWQpOworaW50IGRvX3BhbV9wdXRlbnYoY2hhciAqLCBjaGFyICopOworY2hhciAqKiBmZXRjaF9wYW1fZW52aXJvbm1lbnQodm9pZCk7CitjaGFyICoqIGZldGNoX3BhbV9jaGlsZF9lbnZpcm9ubWVudCh2b2lkKTsKK3ZvaWQgZnJlZV9wYW1fZW52aXJvbm1lbnQoY2hhciAqKik7Cit2b2lkIHNzaHBhbV90aHJlYWRfY2xlYW51cCh2b2lkKTsKK3ZvaWQgc3NocGFtX2NsZWFudXAodm9pZCk7CitpbnQgc3NocGFtX2F1dGhfcGFzc3dkKEF1dGhjdHh0ICosIGNvbnN0IGNoYXIgKik7CitpbnQgaXNfcGFtX3Nlc3Npb25fb3Blbih2b2lkKTsKKworI2VuZGlmIC8qIFVTRV9QQU0gKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvYXV0aC1wYXNzd2QuYyBiL29wZW5zc2gtNi4wcDEvYXV0aC1wYXNzd2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWM2Y2UwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9hdXRoLXBhc3N3ZC5jCkBAIC0wLDAgKzEsMjE0IEBACisvKiAkT3BlbkJTRDogYXV0aC1wYXNzd2QuYyx2IDEuNDMgMjAwNy8wOS8yMSAwODoxNToyOSBkam0gRXhwICQgKi8KKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiBQYXNzd29yZCBhdXRoZW50aWNhdGlvbi4gIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZnVuY3Rpb25zIHRvIGNoZWNrIHdoZXRoZXIKKyAqIHRoZSBwYXNzd29yZCBpcyB2YWxpZCBmb3IgdGhlIHVzZXIuCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgRHVnIFNvbmcuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgInBhY2tldC5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInNlcnZjb25mLmgiCisjaW5jbHVkZSAia2V5LmgiCisjaW5jbHVkZSAiaG9zdGZpbGUuaCIKKyNpbmNsdWRlICJhdXRoLmgiCisjaW5jbHVkZSAiYXV0aC1vcHRpb25zLmgiCisKK2V4dGVybiBCdWZmZXIgbG9naW5tc2c7CitleHRlcm4gU2VydmVyT3B0aW9ucyBvcHRpb25zOworCisjaWZkZWYgSEFWRV9MT0dJTl9DQVAKK2V4dGVybiBsb2dpbl9jYXBfdCAqbGM7CisjZW5kaWYKKworCisjZGVmaW5lIERBWQkJKDI0TCAqIDYwICogNjApIC8qIDEgZGF5IGluIHNlY29uZHMgKi8KKyNkZWZpbmUgVFdPX1dFRUtTCSgyTCAqIDcgKiBEQVkpCS8qIDIgd2Vla3MgaW4gc2Vjb25kcyAqLworCit2b2lkCitkaXNhYmxlX2ZvcndhcmRpbmcodm9pZCkKK3sKKwlub19wb3J0X2ZvcndhcmRpbmdfZmxhZyA9IDE7CisJbm9fYWdlbnRfZm9yd2FyZGluZ19mbGFnID0gMTsKKwlub194MTFfZm9yd2FyZGluZ19mbGFnID0gMTsKK30KKworLyoKKyAqIFRyaWVzIHRvIGF1dGhlbnRpY2F0ZSB0aGUgdXNlciB1c2luZyBwYXNzd29yZC4gIFJldHVybnMgdHJ1ZSBpZgorICogYXV0aGVudGljYXRpb24gc3VjY2VlZHMuCisgKi8KK2ludAorYXV0aF9wYXNzd29yZChBdXRoY3R4dCAqYXV0aGN0eHQsIGNvbnN0IGNoYXIgKnBhc3N3b3JkKQoreworCXN0cnVjdCBwYXNzd2QgKiBwdyA9IGF1dGhjdHh0LT5wdzsKKwlpbnQgcmVzdWx0LCBvayA9IGF1dGhjdHh0LT52YWxpZDsKKyNpZiBkZWZpbmVkKFVTRV9TSEFET1cpICYmIGRlZmluZWQoSEFTX1NIQURPV19FWFBJUkUpCisJc3RhdGljIGludCBleHBpcmVfY2hlY2tlZCA9IDA7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0NZR1dJTgorCWlmIChwdy0+cHdfdWlkID09IDAgJiYgb3B0aW9ucy5wZXJtaXRfcm9vdF9sb2dpbiAhPSBQRVJNSVRfWUVTKQorCQlvayA9IDA7CisjZW5kaWYKKwlpZiAoKnBhc3N3b3JkID09ICdcMCcgJiYgb3B0aW9ucy5wZXJtaXRfZW1wdHlfcGFzc3dkID09IDApCisJCXJldHVybiAwOworCisjaWZkZWYgS1JCNQorCWlmIChvcHRpb25zLmtlcmJlcm9zX2F1dGhlbnRpY2F0aW9uID09IDEpIHsKKwkJaW50IHJldCA9IGF1dGhfa3JiNV9wYXNzd29yZChhdXRoY3R4dCwgcGFzc3dvcmQpOworCQlpZiAocmV0ID09IDEgfHwgcmV0ID09IDApCisJCQlyZXR1cm4gcmV0ICYmIG9rOworCQkvKiBGYWxsIGJhY2sgdG8gb3JkaW5hcnkgcGFzc3dkIGF1dGhlbnRpY2F0aW9uLiAqLworCX0KKyNlbmRpZgorI2lmZGVmIEhBVkVfQ1lHV0lOCisJeworCQlIQU5ETEUgaFRva2VuID0gY3lnd2luX2xvZ29uX3VzZXIocHcsIHBhc3N3b3JkKTsKKworCQlpZiAoaFRva2VuID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorCQkJcmV0dXJuIDA7CisJCWN5Z3dpbl9zZXRfaW1wZXJzb25hdGlvbl90b2tlbihoVG9rZW4pOworCQlyZXR1cm4gb2s7CisJfQorI2VuZGlmCisjaWZkZWYgVVNFX1BBTQorCWlmIChvcHRpb25zLnVzZV9wYW0pCisJCXJldHVybiAoc3NocGFtX2F1dGhfcGFzc3dkKGF1dGhjdHh0LCBwYXNzd29yZCkgJiYgb2spOworI2VuZGlmCisjaWYgZGVmaW5lZChVU0VfU0hBRE9XKSAmJiBkZWZpbmVkKEhBU19TSEFET1dfRVhQSVJFKQorCWlmICghZXhwaXJlX2NoZWNrZWQpIHsKKwkJZXhwaXJlX2NoZWNrZWQgPSAxOworCQlpZiAoYXV0aF9zaGFkb3dfcHdleHBpcmVkKGF1dGhjdHh0KSkKKwkJCWF1dGhjdHh0LT5mb3JjZV9wd2NoYW5nZSA9IDE7CisJfQorI2VuZGlmCisJcmVzdWx0ID0gc3lzX2F1dGhfcGFzc3dkKGF1dGhjdHh0LCBwYXNzd29yZCk7CisJaWYgKGF1dGhjdHh0LT5mb3JjZV9wd2NoYW5nZSkKKwkJZGlzYWJsZV9mb3J3YXJkaW5nKCk7CisJcmV0dXJuIChyZXN1bHQgJiYgb2spOworfQorCisjaWZkZWYgQlNEX0FVVEgKK3N0YXRpYyB2b2lkCit3YXJuX2V4cGlyeShBdXRoY3R4dCAqYXV0aGN0eHQsIGF1dGhfc2Vzc2lvbl90ICphcykKK3sKKwljaGFyIGJ1ZlsyNTZdOworCXF1YWRfdCBwd3RpbWVsZWZ0LCBhY3RpbWVsZWZ0LCBkYXlzbGVmdCwgcHd3YXJudGltZSwgYWN3YXJudGltZTsKKworCXB3d2FybnRpbWUgPSBhY3dhcm50aW1lID0gVFdPX1dFRUtTOworCisJcHd0aW1lbGVmdCA9IGF1dGhfY2hlY2tfY2hhbmdlKGFzKTsKKwlhY3RpbWVsZWZ0ID0gYXV0aF9jaGVja19leHBpcmUoYXMpOworI2lmZGVmIEhBVkVfTE9HSU5fQ0FQCisJaWYgKGF1dGhjdHh0LT52YWxpZCkgeworCQlwd3dhcm50aW1lID0gbG9naW5fZ2V0Y2FwdGltZShsYywgInBhc3N3b3JkLXdhcm4iLCBUV09fV0VFS1MsCisJCSAgICBUV09fV0VFS1MpOworCQlhY3dhcm50aW1lID0gbG9naW5fZ2V0Y2FwdGltZShsYywgImV4cGlyZS13YXJuIiwgVFdPX1dFRUtTLAorCQkgICAgVFdPX1dFRUtTKTsKKwl9CisjZW5kaWYKKwlpZiAocHd0aW1lbGVmdCAhPSAwICYmIHB3dGltZWxlZnQgPCBwd3dhcm50aW1lKSB7CisJCWRheXNsZWZ0ID0gcHd0aW1lbGVmdCAvIERBWSArIDE7CisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCSAgICAiWW91ciBwYXNzd29yZCB3aWxsIGV4cGlyZSBpbiAlbGxkIGRheSVzLlxuIiwKKwkJICAgIGRheXNsZWZ0LCBkYXlzbGVmdCA9PSAxID8gIiIgOiAicyIpOworCQlidWZmZXJfYXBwZW5kKCZsb2dpbm1zZywgYnVmLCBzdHJsZW4oYnVmKSk7CisJfQorCWlmIChhY3RpbWVsZWZ0ICE9IDAgJiYgYWN0aW1lbGVmdCA8IGFjd2FybnRpbWUpIHsKKwkJZGF5c2xlZnQgPSBhY3RpbWVsZWZ0IC8gREFZICsgMTsKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKwkJICAgICJZb3VyIGFjY291bnQgd2lsbCBleHBpcmUgaW4gJWxsZCBkYXklcy5cbiIsCisJCSAgICBkYXlzbGVmdCwgZGF5c2xlZnQgPT0gMSA/ICIiIDogInMiKTsKKwkJYnVmZmVyX2FwcGVuZCgmbG9naW5tc2csIGJ1Ziwgc3RybGVuKGJ1ZikpOworCX0KK30KKworaW50CitzeXNfYXV0aF9wYXNzd2QoQXV0aGN0eHQgKmF1dGhjdHh0LCBjb25zdCBjaGFyICpwYXNzd29yZCkKK3sKKwlzdHJ1Y3QgcGFzc3dkICpwdyA9IGF1dGhjdHh0LT5wdzsKKwlhdXRoX3Nlc3Npb25fdCAqYXM7CisJc3RhdGljIGludCBleHBpcmVfY2hlY2tlZCA9IDA7CisKKwlhcyA9IGF1dGhfdXNlcmNoZWNrKHB3LT5wd19uYW1lLCBhdXRoY3R4dC0+c3R5bGUsICJhdXRoLXNzaCIsCisJICAgIChjaGFyICopcGFzc3dvcmQpOworCWlmIChhcyA9PSBOVUxMKQorCQlyZXR1cm4gKDApOworCWlmIChhdXRoX2dldHN0YXRlKGFzKSAmIEFVVEhfUFdFWFBJUkVEKSB7CisJCWF1dGhfY2xvc2UoYXMpOworCQlkaXNhYmxlX2ZvcndhcmRpbmcoKTsKKwkJYXV0aGN0eHQtPmZvcmNlX3B3Y2hhbmdlID0gMTsKKwkJcmV0dXJuICgxKTsKKwl9IGVsc2UgeworCQlpZiAoIWV4cGlyZV9jaGVja2VkKSB7CisJCQlleHBpcmVfY2hlY2tlZCA9IDE7CisJCQl3YXJuX2V4cGlyeShhdXRoY3R4dCwgYXMpOworCQl9CisJCXJldHVybiAoYXV0aF9jbG9zZShhcykpOworCX0KK30KKyNlbGlmICFkZWZpbmVkKENVU1RPTV9TWVNfQVVUSF9QQVNTV0QpCitpbnQKK3N5c19hdXRoX3Bhc3N3ZChBdXRoY3R4dCAqYXV0aGN0eHQsIGNvbnN0IGNoYXIgKnBhc3N3b3JkKQoreworCXN0cnVjdCBwYXNzd2QgKnB3ID0gYXV0aGN0eHQtPnB3OworCWNoYXIgKmVuY3J5cHRlZF9wYXNzd29yZDsKKworCS8qIEp1c3QgdXNlIHRoZSBzdXBwbGllZCBmYWtlIHBhc3N3b3JkIGlmIGF1dGhjdHh0IGlzIGludmFsaWQgKi8KKwljaGFyICpwd19wYXNzd29yZCA9IGF1dGhjdHh0LT52YWxpZCA/IHNoYWRvd19wdyhwdykgOiBwdy0+cHdfcGFzc3dkOworCisJLyogQ2hlY2sgZm9yIHVzZXJzIHdpdGggbm8gcGFzc3dvcmQuICovCisJaWYgKHN0cmNtcChwd19wYXNzd29yZCwgIiIpID09IDAgJiYgc3RyY21wKHBhc3N3b3JkLCAiIikgPT0gMCkKKwkJcmV0dXJuICgxKTsKKworCS8qIEVuY3J5cHQgdGhlIGNhbmRpZGF0ZSBwYXNzd29yZCB1c2luZyB0aGUgcHJvcGVyIHNhbHQuICovCisJZW5jcnlwdGVkX3Bhc3N3b3JkID0geGNyeXB0KHBhc3N3b3JkLAorCSAgICAocHdfcGFzc3dvcmRbMF0gJiYgcHdfcGFzc3dvcmRbMV0pID8gcHdfcGFzc3dvcmQgOiAieHgiKTsKKworCS8qCisJICogQXV0aGVudGljYXRpb24gaXMgYWNjZXB0ZWQgaWYgdGhlIGVuY3J5cHRlZCBwYXNzd29yZHMKKwkgKiBhcmUgaWRlbnRpY2FsLgorCSAqLworCXJldHVybiAoc3RyY21wKGVuY3J5cHRlZF9wYXNzd29yZCwgcHdfcGFzc3dvcmQpID09IDApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2F1dGgtcmgtcnNhLmMgYi9vcGVuc3NoLTYuMHAxL2F1dGgtcmgtcnNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIxYTBmNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvYXV0aC1yaC1yc2EuYwpAQCAtMCwwICsxLDEwMyBAQAorLyogJE9wZW5CU0Q6IGF1dGgtcmgtcnNhLmMsdiAxLjQzIDIwMTAvMDMvMDQgMTA6MzY6MDMgZGptIEV4cCAkICovCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICogUmhvc3RzIG9yIC9ldGMvaG9zdHMuZXF1aXYgYXV0aGVudGljYXRpb24gY29tYmluZWQgd2l0aCBSU0EgaG9zdAorICogYXV0aGVudGljYXRpb24uCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJwYWNrZXQuaCIKKyNpbmNsdWRlICJ1aWRzd2FwLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAic2VydmNvbmYuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJob3N0ZmlsZS5oIgorI2luY2x1ZGUgInBhdGhuYW1lcy5oIgorI2luY2x1ZGUgImF1dGguaCIKKyNpbmNsdWRlICJjYW5vaG9zdC5oIgorI2lmZGVmIEdTU0FQSQorI2luY2x1ZGUgInNzaC1nc3MuaCIKKyNlbmRpZgorI2luY2x1ZGUgIm1vbml0b3Jfd3JhcC5oIgorCisvKiBpbXBvcnQgKi8KK2V4dGVybiBTZXJ2ZXJPcHRpb25zIG9wdGlvbnM7CisKK2ludAorYXV0aF9yaG9zdHNfcnNhX2tleV9hbGxvd2VkKHN0cnVjdCBwYXNzd2QgKnB3LCBjaGFyICpjdXNlciwgY2hhciAqY2hvc3QsCisgICAgS2V5ICpjbGllbnRfaG9zdF9rZXkpCit7CisJSG9zdFN0YXR1cyBob3N0X3N0YXR1czsKKworCWlmIChhdXRoX2tleV9pc19yZXZva2VkKGNsaWVudF9ob3N0X2tleSkpCisJCXJldHVybiAwOworCisJLyogQ2hlY2sgaWYgd2Ugd291bGQgYWNjZXB0IGl0IHVzaW5nIHJob3N0cyBhdXRoZW50aWNhdGlvbi4gKi8KKwlpZiAoIWF1dGhfcmhvc3RzKHB3LCBjdXNlcikpCisJCXJldHVybiAwOworCisJaG9zdF9zdGF0dXMgPSBjaGVja19rZXlfaW5faG9zdGZpbGVzKHB3LCBjbGllbnRfaG9zdF9rZXksCisJICAgIGNob3N0LCBfUEFUSF9TU0hfU1lTVEVNX0hPU1RGSUxFLAorCSAgICBvcHRpb25zLmlnbm9yZV91c2VyX2tub3duX2hvc3RzID8gTlVMTCA6IF9QQVRIX1NTSF9VU0VSX0hPU1RGSUxFKTsKKworCXJldHVybiAoaG9zdF9zdGF0dXMgPT0gSE9TVF9PSyk7Cit9CisKKy8qCisgKiBUcmllcyB0byBhdXRoZW50aWNhdGUgdGhlIHVzZXIgdXNpbmcgdGhlIC5yaG9zdHMgZmlsZSBhbmQgdGhlIGhvc3QgdXNpbmcKKyAqIGl0cyBob3N0IGtleS4gIFJldHVybnMgdHJ1ZSBpZiBhdXRoZW50aWNhdGlvbiBzdWNjZWVkcy4KKyAqLworaW50CithdXRoX3Job3N0c19yc2EoQXV0aGN0eHQgKmF1dGhjdHh0LCBjaGFyICpjdXNlciwgS2V5ICpjbGllbnRfaG9zdF9rZXkpCit7CisJY2hhciAqY2hvc3Q7CisJc3RydWN0IHBhc3N3ZCAqcHcgPSBhdXRoY3R4dC0+cHc7CisKKwlkZWJ1ZygiVHJ5aW5nIHJob3N0cyB3aXRoIFJTQSBob3N0IGF1dGhlbnRpY2F0aW9uIGZvciBjbGllbnQgdXNlciAlLjEwMHMiLAorCSAgICBjdXNlcik7CisKKwlpZiAoIWF1dGhjdHh0LT52YWxpZCB8fCBjbGllbnRfaG9zdF9rZXkgPT0gTlVMTCB8fAorCSAgICBjbGllbnRfaG9zdF9rZXktPnJzYSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWNob3N0ID0gKGNoYXIgKilnZXRfY2Fub25pY2FsX2hvc3RuYW1lKG9wdGlvbnMudXNlX2Rucyk7CisJZGVidWcoIlJob3N0cyBSU0EgYXV0aGVudGljYXRpb246IGNhbm9uaWNhbCBob3N0ICUuOTAwcyIsIGNob3N0KTsKKworCWlmICghUFJJVlNFUChhdXRoX3Job3N0c19yc2Ffa2V5X2FsbG93ZWQocHcsIGN1c2VyLCBjaG9zdCwgY2xpZW50X2hvc3Rfa2V5KSkpIHsKKwkJZGVidWcoIlJob3N0cyB3aXRoIFJTQSBob3N0IGF1dGhlbnRpY2F0aW9uIGRlbmllZDogdW5rbm93biBvciBpbnZhbGlkIGhvc3Qga2V5Iik7CisJCXBhY2tldF9zZW5kX2RlYnVnKCJZb3VyIGhvc3Qga2V5IGNhbm5vdCBiZSB2ZXJpZmllZDogdW5rbm93biBvciBpbnZhbGlkIGhvc3Qga2V5LiIpOworCQlyZXR1cm4gMDsKKwl9CisJLyogQSBtYXRjaGluZyBob3N0IGtleSB3YXMgZm91bmQgYW5kIGlzIGtub3duLiAqLworCisJLyogUGVyZm9ybSB0aGUgY2hhbGxlbmdlLXJlc3BvbnNlIGRpYWxvZyB3aXRoIHRoZSBjbGllbnQgZm9yIHRoZSBob3N0IGtleS4gKi8KKwlpZiAoIWF1dGhfcnNhX2NoYWxsZW5nZV9kaWFsb2coY2xpZW50X2hvc3Rfa2V5KSkgeworCQlsb2dpdCgiQ2xpZW50IG9uICUuODAwcyBmYWlsZWQgdG8gcmVzcG9uZCBjb3JyZWN0bHkgdG8gaG9zdCBhdXRoZW50aWNhdGlvbi4iLAorCQkgICAgY2hvc3QpOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBXZSBoYXZlIGF1dGhlbnRpY2F0ZWQgdGhlIHVzZXIgdXNpbmcgLnJob3N0cyBvciAvZXRjL2hvc3RzLmVxdWl2LAorCSAqIGFuZCB0aGUgaG9zdCB1c2luZyBSU0EuIFdlIGFjY2VwdCB0aGUgYXV0aGVudGljYXRpb24uCisJICovCisKKwl2ZXJib3NlKCJSaG9zdHMgd2l0aCBSU0EgaG9zdCBhdXRoZW50aWNhdGlvbiBhY2NlcHRlZCBmb3IgJS4xMDBzLCAlLjEwMHMgb24gJS43MDBzLiIsCisJICAgIHB3LT5wd19uYW1lLCBjdXNlciwgY2hvc3QpOworCXBhY2tldF9zZW5kX2RlYnVnKCJSaG9zdHMgd2l0aCBSU0EgaG9zdCBhdXRoZW50aWNhdGlvbiBhY2NlcHRlZC4iKTsKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvYXV0aC1yaG9zdHMuYyBiL29wZW5zc2gtNi4wcDEvYXV0aC1yaG9zdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmFlN2YwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9hdXRoLXJob3N0cy5jCkBAIC0wLDAgKzEsMzIxIEBACisvKiAkT3BlbkJTRDogYXV0aC1yaG9zdHMuYyx2IDEuNDQgMjAxMC8wMy8wNyAxMTo1NzoxMyBkdHVja2VyIEV4cCAkICovCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICogUmhvc3RzIGF1dGhlbnRpY2F0aW9uLiAgVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgdG8gY2hlY2sgd2hldGhlciB0byBhZG1pdAorICogdGhlIGxvZ2luIGJhc2VkIG9uIHJob3N0cyBhdXRoZW50aWNhdGlvbi4gIFRoaXMgZmlsZSBhbHNvIHByb2Nlc3NlcworICogL2V0Yy9ob3N0cy5lcXVpdi4KKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2lmZGVmIEhBVkVfTkVUR1JPVVBfSAorIyBpbmNsdWRlIDxuZXRncm91cC5oPgorI2VuZGlmCisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAicGFja2V0LmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAidWlkc3dhcC5oIgorI2luY2x1ZGUgInBhdGhuYW1lcy5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInNlcnZjb25mLmgiCisjaW5jbHVkZSAiY2Fub2hvc3QuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJob3N0ZmlsZS5oIgorI2luY2x1ZGUgImF1dGguaCIKKyNpbmNsdWRlICJtaXNjLmgiCisKKy8qIGltcG9ydCAqLworZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKK2V4dGVybiBpbnQgdXNlX3ByaXZzZXA7CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyBhbiByaG9zdHMtc3R5bGUgZmlsZSAoLnJob3N0cywgLnNob3N0cywgb3IKKyAqIC9ldGMvaG9zdHMuZXF1aXYpLiAgVGhpcyByZXR1cm5zIHRydWUgaWYgYXV0aGVudGljYXRpb24gY2FuIGJlIGdyYW50ZWQKKyAqIGJhc2VkIG9uIHRoZSBmaWxlLCBhbmQgcmV0dXJucyB6ZXJvIG90aGVyd2lzZS4KKyAqLworCitzdGF0aWMgaW50CitjaGVja19yaG9zdHNfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqaG9zdG5hbWUsCisJCSAgY29uc3QgY2hhciAqaXBhZGRyLCBjb25zdCBjaGFyICpjbGllbnRfdXNlciwKKwkJICBjb25zdCBjaGFyICpzZXJ2ZXJfdXNlcikKK3sKKwlGSUxFICpmOworCWNoYXIgYnVmWzEwMjRdOwkvKiBNdXN0IG5vdCBiZSBsYXJnZXIgdGhhbiBob3N0LCB1c2VyLCBkdW1teSBiZWxvdy4gKi8KKwlpbnQgZmQ7CisJc3RydWN0IHN0YXQgc3Q7CisKKwkvKiBPcGVuIHRoZSAucmhvc3RzIGZpbGUsIGRlbnkgaWYgdW5yZWFkYWJsZSAqLworCWlmICgoZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWXxPX05PTkJMT0NLKSkgPT0gLTEpCisJCXJldHVybiAwOworCWlmIChmc3RhdChmZCwgJnN0KSA9PSAtMSkgeworCQljbG9zZShmZCk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIVNfSVNSRUcoc3Quc3RfbW9kZSkpIHsKKwkJbG9naXQoIlVzZXIgJXMgaG9zdHMgZmlsZSAlcyBpcyBub3QgYSByZWd1bGFyIGZpbGUiLAorCQkgICAgc2VydmVyX3VzZXIsIGZpbGVuYW1lKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gMDsKKwl9CisJdW5zZXRfbm9uYmxvY2soZmQpOworCWlmICgoZiA9IGZkb3BlbihmZCwgInIiKSkgPT0gTlVMTCkgeworCQljbG9zZShmZCk7CisJCXJldHVybiAwOworCX0KKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZikpIHsKKwkJLyogQWxsIHRocmVlIG11c3QgYmUgYXQgbGVhc3QgYXMgYmlnIGFzIGJ1ZiB0byBhdm9pZCBvdmVyZmxvd3MuICovCisJCWNoYXIgaG9zdGJ1ZlsxMDI0XSwgdXNlcmJ1ZlsxMDI0XSwgZHVtbXlbMTAyNF0sICpob3N0LCAqdXNlciwgKmNwOworCQlpbnQgbmVnYXRlZDsKKworCQlmb3IgKGNwID0gYnVmOyAqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnOyBjcCsrKQorCQkJOworCQlpZiAoKmNwID09ICcjJyB8fCAqY3AgPT0gJ1xuJyB8fCAhKmNwKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogTk9fUExVUyBpcyBzdXBwb3J0ZWQgYXQgbGVhc3Qgb24gT1NGLzEuICBXZSBza2lwIGl0ICh3ZQorCQkgKiBkb24ndCBldmVyIHN1cHBvcnQgdGhlIHBsdXMgc3ludGF4KS4KKwkJICovCisJCWlmIChzdHJuY21wKGNwLCAiTk9fUExVUyIsIDcpID09IDApCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBUaGlzIHNob3VsZCBiZSBzYWZlIGJlY2F1c2UgZWFjaCBidWZmZXIgaXMgYXMgYmlnIGFzIHRoZQorCQkgKiB3aG9sZSBzdHJpbmcsIGFuZCB0aHVzIGNhbm5vdCBiZSBvdmVyd3JpdHRlbi4KKwkJICovCisJCXN3aXRjaCAoc3NjYW5mKGJ1ZiwgIiUxMDIzcyAlMTAyM3MgJTEwMjNzIiwgaG9zdGJ1ZiwgdXNlcmJ1ZiwKKwkJICAgIGR1bW15KSkgeworCQljYXNlIDA6CisJCQlhdXRoX2RlYnVnX2FkZCgiRm91bmQgZW1wdHkgbGluZSBpbiAlLjEwMHMuIiwgZmlsZW5hbWUpOworCQkJY29udGludWU7CisJCWNhc2UgMToKKwkJCS8qIEhvc3QgbmFtZSBvbmx5LiAqLworCQkJc3RybGNweSh1c2VyYnVmLCBzZXJ2ZXJfdXNlciwgc2l6ZW9mKHVzZXJidWYpKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQkvKiBHb3QgYm90aCBob3N0IGFuZCB1c2VyIG5hbWUuICovCisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJYXV0aF9kZWJ1Z19hZGQoIkZvdW5kIGdhcmJhZ2UgaW4gJS4xMDBzLiIsIGZpbGVuYW1lKTsKKwkJCWNvbnRpbnVlOworCQlkZWZhdWx0OgorCQkJLyogV2VpcmQuLi4gKi8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaG9zdCA9IGhvc3RidWY7CisJCXVzZXIgPSB1c2VyYnVmOworCQluZWdhdGVkID0gMDsKKworCQkvKiBQcm9jZXNzIG5lZ2F0ZWQgaG9zdCBuYW1lcywgb3IgcG9zaXRpdmUgbmV0Z3JvdXBzLiAqLworCQlpZiAoaG9zdFswXSA9PSAnLScpIHsKKwkJCW5lZ2F0ZWQgPSAxOworCQkJaG9zdCsrOworCQl9IGVsc2UgaWYgKGhvc3RbMF0gPT0gJysnKQorCQkJaG9zdCsrOworCisJCWlmICh1c2VyWzBdID09ICctJykgeworCQkJbmVnYXRlZCA9IDE7CisJCQl1c2VyKys7CisJCX0gZWxzZSBpZiAodXNlclswXSA9PSAnKycpCisJCQl1c2VyKys7CisKKwkJLyogQ2hlY2sgZm9yIGVtcHR5IGhvc3QvdXNlciBuYW1lcyAocGFydGljdWxhcmx5ICcrJykuICovCisJCWlmICghaG9zdFswXSB8fCAhdXNlclswXSkgeworCQkJLyogV2UgY29tZSBoZXJlIGlmIGVpdGhlciB3YXMgJysnIG9yICctJy4gKi8KKwkJCWF1dGhfZGVidWdfYWRkKCJJZ25vcmluZyB3aWxkIGhvc3QvdXNlciBuYW1lcyBpbiAlLjEwMHMuIiwKKwkJCSAgICBmaWxlbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBWZXJpZnkgdGhhdCBob3N0IG5hbWUgbWF0Y2hlcy4gKi8KKwkJaWYgKGhvc3RbMF0gPT0gJ0AnKSB7CisJCQlpZiAoIWlubmV0Z3IoaG9zdCArIDEsIGhvc3RuYW1lLCBOVUxMLCBOVUxMKSAmJgorCQkJICAgICFpbm5ldGdyKGhvc3QgKyAxLCBpcGFkZHIsIE5VTEwsIE5VTEwpKQorCQkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKHN0cmNhc2VjbXAoaG9zdCwgaG9zdG5hbWUpICYmIHN0cmNtcChob3N0LCBpcGFkZHIpICE9IDApCisJCQljb250aW51ZTsJLyogRGlmZmVyZW50IGhvc3RuYW1lLiAqLworCisJCS8qIFZlcmlmeSB0aGF0IHVzZXIgbmFtZSBtYXRjaGVzLiAqLworCQlpZiAodXNlclswXSA9PSAnQCcpIHsKKwkJCWlmICghaW5uZXRncih1c2VyICsgMSwgTlVMTCwgY2xpZW50X3VzZXIsIE5VTEwpKQorCQkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKHN0cmNtcCh1c2VyLCBjbGllbnRfdXNlcikgIT0gMCkKKwkJCWNvbnRpbnVlOwkvKiBEaWZmZXJlbnQgdXNlcm5hbWUuICovCisKKwkJLyogRm91bmQgdGhlIHVzZXIgYW5kIGhvc3QuICovCisJCWZjbG9zZShmKTsKKworCQkvKiBJZiB0aGUgZW50cnkgd2FzIG5lZ2F0ZWQsIGRlbnkgYWNjZXNzLiAqLworCQlpZiAobmVnYXRlZCkgeworCQkJYXV0aF9kZWJ1Z19hZGQoIk1hdGNoZWQgbmVnYXRpdmUgZW50cnkgaW4gJS4xMDBzLiIsCisJCQkgICAgZmlsZW5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyogQWNjZXB0IGF1dGhlbnRpY2F0aW9uLiAqLworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBBdXRoZW50aWNhdGlvbiB1c2luZyB0aGlzIGZpbGUgZGVuaWVkLiAqLworCWZjbG9zZShmKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRyaWVzIHRvIGF1dGhlbnRpY2F0ZSB0aGUgdXNlciB1c2luZyB0aGUgLnNob3N0cyBvciAucmhvc3RzIGZpbGUuIFJldHVybnMKKyAqIHRydWUgaWYgYXV0aGVudGljYXRpb24gc3VjY2VlZHMuICBJZiBpZ25vcmVfcmhvc3RzIGlzIHRydWUsIG9ubHkKKyAqIC9ldGMvaG9zdHMuZXF1aXYgd2lsbCBiZSBjb25zaWRlcmVkICgucmhvc3RzIGFuZCAuc2hvc3RzIGFyZSBpZ25vcmVkKS4KKyAqLworCitpbnQKK2F1dGhfcmhvc3RzKHN0cnVjdCBwYXNzd2QgKnB3LCBjb25zdCBjaGFyICpjbGllbnRfdXNlcikKK3sKKwljb25zdCBjaGFyICpob3N0bmFtZSwgKmlwYWRkcjsKKworCWhvc3RuYW1lID0gZ2V0X2Nhbm9uaWNhbF9ob3N0bmFtZShvcHRpb25zLnVzZV9kbnMpOworCWlwYWRkciA9IGdldF9yZW1vdGVfaXBhZGRyKCk7CisJcmV0dXJuIGF1dGhfcmhvc3RzMihwdywgY2xpZW50X3VzZXIsIGhvc3RuYW1lLCBpcGFkZHIpOworfQorCitzdGF0aWMgaW50CithdXRoX3Job3N0czJfcmF3KHN0cnVjdCBwYXNzd2QgKnB3LCBjb25zdCBjaGFyICpjbGllbnRfdXNlciwgY29uc3QgY2hhciAqaG9zdG5hbWUsCisgICAgY29uc3QgY2hhciAqaXBhZGRyKQoreworCWNoYXIgYnVmWzEwMjRdOworCXN0cnVjdCBzdGF0IHN0OworCXN0YXRpYyBjb25zdCBjaGFyICpyaG9zdHNfZmlsZXNbXSA9IHsiLnNob3N0cyIsICIucmhvc3RzIiwgTlVMTH07CisJdV9pbnQgcmhvc3RzX2ZpbGVfaW5kZXg7CisKKwlkZWJ1ZzIoImF1dGhfcmhvc3RzMjogY2xpZW50dXNlciAlcyBob3N0bmFtZSAlcyBpcGFkZHIgJXMiLAorCSAgICBjbGllbnRfdXNlciwgaG9zdG5hbWUsIGlwYWRkcik7CisKKwkvKiBTd2l0Y2ggdG8gdGhlIHVzZXIncyB1aWQuICovCisJdGVtcG9yYXJpbHlfdXNlX3VpZChwdyk7CisJLyoKKwkgKiBRdWljayBjaGVjazogaWYgdGhlIHVzZXIgaGFzIG5vIC5zaG9zdHMgb3IgLnJob3N0cyBmaWxlcywgcmV0dXJuCisJICogZmFpbHVyZSBpbW1lZGlhdGVseSB3aXRob3V0IGRvaW5nIGNvc3RseSBsb29rdXBzIGZyb20gbmFtZQorCSAqIHNlcnZlcnMuCisJICovCisJZm9yIChyaG9zdHNfZmlsZV9pbmRleCA9IDA7IHJob3N0c19maWxlc1tyaG9zdHNfZmlsZV9pbmRleF07CisJICAgIHJob3N0c19maWxlX2luZGV4KyspIHsKKwkJLyogQ2hlY2sgdXNlcnMgLnJob3N0cyBvciAuc2hvc3RzLiAqLworCQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsICIlLjUwMHMvJS4xMDBzIiwKKwkJCSBwdy0+cHdfZGlyLCByaG9zdHNfZmlsZXNbcmhvc3RzX2ZpbGVfaW5kZXhdKTsKKwkJaWYgKHN0YXQoYnVmLCAmc3QpID49IDApCisJCQlicmVhazsKKwl9CisJLyogU3dpdGNoIGJhY2sgdG8gcHJpdmlsZWdlZCB1aWQuICovCisJcmVzdG9yZV91aWQoKTsKKworCS8qIERlbnkgaWYgVGhlIHVzZXIgaGFzIG5vIC5zaG9zdHMgb3IgLnJob3N0cyBmaWxlIGFuZCB0aGVyZSBhcmUgbm8gc3lzdGVtLXdpZGUgZmlsZXMuICovCisJaWYgKCFyaG9zdHNfZmlsZXNbcmhvc3RzX2ZpbGVfaW5kZXhdICYmCisJICAgIHN0YXQoX1BBVEhfUkhPU1RTX0VRVUlWLCAmc3QpIDwgMCAmJgorCSAgICBzdGF0KF9QQVRIX1NTSF9IT1NUU19FUVVJViwgJnN0KSA8IDApCisJCXJldHVybiAwOworCisJLyogSWYgbm90IGxvZ2dpbmcgaW4gYXMgc3VwZXJ1c2VyLCB0cnkgL2V0Yy9ob3N0cy5lcXVpdiBhbmQgc2hvc3RzLmVxdWl2LiAqLworCWlmIChwdy0+cHdfdWlkICE9IDApIHsKKwkJaWYgKGNoZWNrX3Job3N0c19maWxlKF9QQVRIX1JIT1NUU19FUVVJViwgaG9zdG5hbWUsIGlwYWRkciwKKwkJICAgIGNsaWVudF91c2VyLCBwdy0+cHdfbmFtZSkpIHsKKwkJCWF1dGhfZGVidWdfYWRkKCJBY2NlcHRlZCBmb3IgJS4xMDBzIFslLjEwMHNdIGJ5IC9ldGMvaG9zdHMuZXF1aXYuIiwKKwkJCSAgICBob3N0bmFtZSwgaXBhZGRyKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChjaGVja19yaG9zdHNfZmlsZShfUEFUSF9TU0hfSE9TVFNfRVFVSVYsIGhvc3RuYW1lLCBpcGFkZHIsCisJCSAgICBjbGllbnRfdXNlciwgcHctPnB3X25hbWUpKSB7CisJCQlhdXRoX2RlYnVnX2FkZCgiQWNjZXB0ZWQgZm9yICUuMTAwcyBbJS4xMDBzXSBieSAlLjEwMHMuIiwKKwkJCSAgICBob3N0bmFtZSwgaXBhZGRyLCBfUEFUSF9TU0hfSE9TVFNfRVFVSVYpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJLyoKKwkgKiBDaGVjayB0aGF0IHRoZSBob21lIGRpcmVjdG9yeSBpcyBvd25lZCBieSByb290IG9yIHRoZSB1c2VyLCBhbmQgaXMKKwkgKiBub3QgZ3JvdXAgb3Igd29ybGQgd3JpdGFibGUuCisJICovCisJaWYgKHN0YXQocHctPnB3X2RpciwgJnN0KSA8IDApIHsKKwkJbG9naXQoIlJob3N0cyBhdXRoZW50aWNhdGlvbiByZWZ1c2VkIGZvciAlLjEwMHM6ICIKKwkJICAgICJubyBob21lIGRpcmVjdG9yeSAlLjIwMHMiLCBwdy0+cHdfbmFtZSwgcHctPnB3X2Rpcik7CisJCWF1dGhfZGVidWdfYWRkKCJSaG9zdHMgYXV0aGVudGljYXRpb24gcmVmdXNlZCBmb3IgJS4xMDBzOiAiCisJCSAgICAibm8gaG9tZSBkaXJlY3RvcnkgJS4yMDBzIiwgcHctPnB3X25hbWUsIHB3LT5wd19kaXIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKG9wdGlvbnMuc3RyaWN0X21vZGVzICYmCisJICAgICgoc3Quc3RfdWlkICE9IDAgJiYgc3Quc3RfdWlkICE9IHB3LT5wd191aWQpIHx8CisJICAgIChzdC5zdF9tb2RlICYgMDIyKSAhPSAwKSkgeworCQlsb2dpdCgiUmhvc3RzIGF1dGhlbnRpY2F0aW9uIHJlZnVzZWQgZm9yICUuMTAwczogIgorCQkgICAgImJhZCBvd25lcnNoaXAgb3IgbW9kZXMgZm9yIGhvbWUgZGlyZWN0b3J5LiIsIHB3LT5wd19uYW1lKTsKKwkJYXV0aF9kZWJ1Z19hZGQoIlJob3N0cyBhdXRoZW50aWNhdGlvbiByZWZ1c2VkIGZvciAlLjEwMHM6ICIKKwkJICAgICJiYWQgb3duZXJzaGlwIG9yIG1vZGVzIGZvciBob21lIGRpcmVjdG9yeS4iLCBwdy0+cHdfbmFtZSk7CisJCXJldHVybiAwOworCX0KKwkvKiBUZW1wb3JhcmlseSB1c2UgdGhlIHVzZXIncyB1aWQuICovCisJdGVtcG9yYXJpbHlfdXNlX3VpZChwdyk7CisKKwkvKiBDaGVjayBhbGwgLnJob3N0cyBmaWxlcyAoY3VycmVudGx5IC5zaG9zdHMgYW5kIC5yaG9zdHMpLiAqLworCWZvciAocmhvc3RzX2ZpbGVfaW5kZXggPSAwOyByaG9zdHNfZmlsZXNbcmhvc3RzX2ZpbGVfaW5kZXhdOworCSAgICByaG9zdHNfZmlsZV9pbmRleCsrKSB7CisJCS8qIENoZWNrIHVzZXJzIC5yaG9zdHMgb3IgLnNob3N0cy4gKi8KKwkJc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiJS41MDBzLyUuMTAwcyIsCisJCQkgcHctPnB3X2Rpciwgcmhvc3RzX2ZpbGVzW3Job3N0c19maWxlX2luZGV4XSk7CisJCWlmIChzdGF0KGJ1ZiwgJnN0KSA8IDApCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgZmlsZSBpcyBlaXRoZXIgb3duZWQgYnkgdGhlIHVzZXIgb3IgYnkKKwkJICogcm9vdCwgYW5kIG1ha2Ugc3VyZSBpdCBpcyBub3Qgd3JpdGFibGUgYnkgYW55b25lIGJ1dCB0aGUKKwkJICogb3duZXIuICBUaGlzIGlzIHRvIGhlbHAgYXZvaWQgbm92aWNlcyBhY2NpZGVudGFsbHkKKwkJICogYWxsb3dpbmcgYWNjZXNzIHRvIHRoZWlyIGFjY291bnQgYnkgYW55b25lLgorCQkgKi8KKwkJaWYgKG9wdGlvbnMuc3RyaWN0X21vZGVzICYmCisJCSAgICAoKHN0LnN0X3VpZCAhPSAwICYmIHN0LnN0X3VpZCAhPSBwdy0+cHdfdWlkKSB8fAorCQkgICAgKHN0LnN0X21vZGUgJiAwMjIpICE9IDApKSB7CisJCQlsb2dpdCgiUmhvc3RzIGF1dGhlbnRpY2F0aW9uIHJlZnVzZWQgZm9yICUuMTAwczogYmFkIG1vZGVzIGZvciAlLjIwMHMiLAorCQkJICAgIHB3LT5wd19uYW1lLCBidWYpOworCQkJYXV0aF9kZWJ1Z19hZGQoIkJhZCBmaWxlIG1vZGVzIGZvciAlLjIwMHMiLCBidWYpOworCQkJY29udGludWU7CisJCX0KKwkJLyogQ2hlY2sgaWYgd2UgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgdG8gaWdub3JlIC5yaG9zdHMgYW5kIC5zaG9zdHMgZmlsZXMuICovCisJCWlmIChvcHRpb25zLmlnbm9yZV9yaG9zdHMpIHsKKwkJCWF1dGhfZGVidWdfYWRkKCJTZXJ2ZXIgaGFzIGJlZW4gY29uZmlndXJlZCB0byBpZ25vcmUgJS4xMDBzLiIsCisJCQkgICAgcmhvc3RzX2ZpbGVzW3Job3N0c19maWxlX2luZGV4XSk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBDaGVjayBpZiBhdXRoZW50aWNhdGlvbiBpcyBwZXJtaXR0ZWQgYnkgdGhlIGZpbGUuICovCisJCWlmIChjaGVja19yaG9zdHNfZmlsZShidWYsIGhvc3RuYW1lLCBpcGFkZHIsIGNsaWVudF91c2VyLCBwdy0+cHdfbmFtZSkpIHsKKwkJCWF1dGhfZGVidWdfYWRkKCJBY2NlcHRlZCBieSAlLjEwMHMuIiwKKwkJCSAgICByaG9zdHNfZmlsZXNbcmhvc3RzX2ZpbGVfaW5kZXhdKTsKKwkJCS8qIFJlc3RvcmUgdGhlIHByaXZpbGVnZWQgdWlkLiAqLworCQkJcmVzdG9yZV91aWQoKTsKKwkJCWF1dGhfZGVidWdfYWRkKCJBY2NlcHRlZCBob3N0ICVzIGlwICVzIGNsaWVudF91c2VyICVzIHNlcnZlcl91c2VyICVzIiwKKwkJCQlob3N0bmFtZSwgaXBhZGRyLCBjbGllbnRfdXNlciwgcHctPnB3X25hbWUpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwkvKiBSZXN0b3JlIHRoZSBwcml2aWxlZ2VkIHVpZC4gKi8KKwlyZXN0b3JlX3VpZCgpOworCXJldHVybiAwOworfQorCitpbnQKK2F1dGhfcmhvc3RzMihzdHJ1Y3QgcGFzc3dkICpwdywgY29uc3QgY2hhciAqY2xpZW50X3VzZXIsIGNvbnN0IGNoYXIgKmhvc3RuYW1lLAorICAgIGNvbnN0IGNoYXIgKmlwYWRkcikKK3sKKyAgICAgICByZXR1cm4gYXV0aF9yaG9zdHMyX3JhdyhwdywgY2xpZW50X3VzZXIsIGhvc3RuYW1lLCBpcGFkZHIpOworfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9hdXRoLXJzYS5jIGIvb3BlbnNzaC02LjBwMS9hdXRoLXJzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYjQ2Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2F1dGgtcnNhLmMKQEAgLTAsMCArMSwzMzcgQEAKKy8qICRPcGVuQlNEOiBhdXRoLXJzYS5jLHYgMS44MCAyMDExLzA1LzIzIDAzOjMwOjA3IGRqbSBFeHAgJCAqLworLyoKKyAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAorICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIFJTQS1iYXNlZCBhdXRoZW50aWNhdGlvbi4gIFRoaXMgY29kZSBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gYWRtaXQgYSBsb2dpbgorICogYmFzZWQgb24gUlNBIGF1dGhlbnRpY2F0aW9uLiAgVGhpcyBmaWxlIGFsc28gY29udGFpbnMgZnVuY3Rpb25zIHRvIGNoZWNrCisgKiB2YWxpZGl0eSBvZiB0aGUgaG9zdCBrZXkuCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CisKKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgInJzYS5oIgorI2luY2x1ZGUgInBhY2tldC5oIgorI2luY2x1ZGUgInNzaDEuaCIKKyNpbmNsdWRlICJ1aWRzd2FwLmgiCisjaW5jbHVkZSAibWF0Y2guaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJwYXRobmFtZXMuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJzZXJ2Y29uZi5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgImF1dGgtb3B0aW9ucy5oIgorI2luY2x1ZGUgImhvc3RmaWxlLmgiCisjaW5jbHVkZSAiYXV0aC5oIgorI2lmZGVmIEdTU0FQSQorI2luY2x1ZGUgInNzaC1nc3MuaCIKKyNlbmRpZgorI2luY2x1ZGUgIm1vbml0b3Jfd3JhcC5oIgorI2luY2x1ZGUgInNzaC5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKworLyogaW1wb3J0ICovCitleHRlcm4gU2VydmVyT3B0aW9ucyBvcHRpb25zOworCisvKgorICogU2Vzc2lvbiBpZGVudGlmaWVyIHRoYXQgaXMgdXNlZCB0byBiaW5kIGtleSBleGNoYW5nZSBhbmQgYXV0aGVudGljYXRpb24KKyAqIHJlc3BvbnNlcyB0byBhIHBhcnRpY3VsYXIgc2Vzc2lvbi4KKyAqLworZXh0ZXJuIHVfY2hhciBzZXNzaW9uX2lkWzE2XTsKKworLyoKKyAqIFRoZSAuc3NoL2F1dGhvcml6ZWRfa2V5cyBmaWxlIGNvbnRhaW5zIHB1YmxpYyBrZXlzLCBvbmUgcGVyIGxpbmUsIGluIHRoZQorICogZm9sbG93aW5nIGZvcm1hdDoKKyAqICAgb3B0aW9ucyBiaXRzIGUgbiBjb21tZW50CisgKiB3aGVyZSBiaXRzLCBlIGFuZCBuIGFyZSBkZWNpbWFsIG51bWJlcnMsCisgKiBhbmQgY29tbWVudCBpcyBhbnkgc3RyaW5nIG9mIGNoYXJhY3RlcnMgdXAgdG8gbmV3bGluZS4gIFRoZSBtYXhpbXVtCisgKiBsZW5ndGggb2YgYSBsaW5lIGlzIFNTSF9NQVhfUFVCS0VZX0JZVEVTIGNoYXJhY3RlcnMuICBTZWUgc3NoZCg4KSBmb3IgYQorICogZGVzY3JpcHRpb24gb2YgdGhlIG9wdGlvbnMuCisgKi8KKworQklHTlVNICoKK2F1dGhfcnNhX2dlbmVyYXRlX2NoYWxsZW5nZShLZXkgKmtleSkKK3sKKwlCSUdOVU0gKmNoYWxsZW5nZTsKKwlCTl9DVFggKmN0eDsKKworCWlmICgoY2hhbGxlbmdlID0gQk5fbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCJhdXRoX3JzYV9nZW5lcmF0ZV9jaGFsbGVuZ2U6IEJOX25ldygpIGZhaWxlZCIpOworCS8qIEdlbmVyYXRlIGEgcmFuZG9tIGNoYWxsZW5nZS4gKi8KKwlpZiAoQk5fcmFuZChjaGFsbGVuZ2UsIDI1NiwgMCwgMCkgPT0gMCkKKwkJZmF0YWwoImF1dGhfcnNhX2dlbmVyYXRlX2NoYWxsZW5nZTogQk5fcmFuZCBmYWlsZWQiKTsKKwlpZiAoKGN0eCA9IEJOX0NUWF9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoImF1dGhfcnNhX2dlbmVyYXRlX2NoYWxsZW5nZTogQk5fQ1RYX25ldyBmYWlsZWQiKTsKKwlpZiAoQk5fbW9kKGNoYWxsZW5nZSwgY2hhbGxlbmdlLCBrZXktPnJzYS0+biwgY3R4KSA9PSAwKQorCQlmYXRhbCgiYXV0aF9yc2FfZ2VuZXJhdGVfY2hhbGxlbmdlOiBCTl9tb2QgZmFpbGVkIik7CisJQk5fQ1RYX2ZyZWUoY3R4KTsKKworCXJldHVybiBjaGFsbGVuZ2U7Cit9CisKK2ludAorYXV0aF9yc2FfdmVyaWZ5X3Jlc3BvbnNlKEtleSAqa2V5LCBCSUdOVU0gKmNoYWxsZW5nZSwgdV9jaGFyIHJlc3BvbnNlWzE2XSkKK3sKKwl1X2NoYXIgYnVmWzMyXSwgbWRidWZbMTZdOworCU1ENV9DVFggbWQ7CisJaW50IGxlbjsKKworCS8qIGRvbid0IGFsbG93IHNob3J0IGtleXMgKi8KKwlpZiAoQk5fbnVtX2JpdHMoa2V5LT5yc2EtPm4pIDwgU1NIX1JTQV9NSU5JTVVNX01PRFVMVVNfU0laRSkgeworCQllcnJvcigiYXV0aF9yc2FfdmVyaWZ5X3Jlc3BvbnNlOiBSU0EgbW9kdWx1cyB0b28gc21hbGw6ICVkIDwgbWluaW11bSAlZCBiaXRzIiwKKwkJICAgIEJOX251bV9iaXRzKGtleS0+cnNhLT5uKSwgU1NIX1JTQV9NSU5JTVVNX01PRFVMVVNfU0laRSk7CisJCXJldHVybiAoMCk7CisJfQorCisJLyogVGhlIHJlc3BvbnNlIGlzIE1ENSBvZiBkZWNyeXB0ZWQgY2hhbGxlbmdlIHBsdXMgc2Vzc2lvbiBpZC4gKi8KKwlsZW4gPSBCTl9udW1fYnl0ZXMoY2hhbGxlbmdlKTsKKwlpZiAobGVuIDw9IDAgfHwgbGVuID4gMzIpCisJCWZhdGFsKCJhdXRoX3JzYV92ZXJpZnlfcmVzcG9uc2U6IGJhZCBjaGFsbGVuZ2UgbGVuZ3RoICVkIiwgbGVuKTsKKwltZW1zZXQoYnVmLCAwLCAzMik7CisJQk5fYm4yYmluKGNoYWxsZW5nZSwgYnVmICsgMzIgLSBsZW4pOworCU1ENV9Jbml0KCZtZCk7CisJTUQ1X1VwZGF0ZSgmbWQsIGJ1ZiwgMzIpOworCU1ENV9VcGRhdGUoJm1kLCBzZXNzaW9uX2lkLCAxNik7CisJTUQ1X0ZpbmFsKG1kYnVmLCAmbWQpOworCisJLyogVmVyaWZ5IHRoYXQgdGhlIHJlc3BvbnNlIGlzIHRoZSBvcmlnaW5hbCBjaGFsbGVuZ2UuICovCisJaWYgKHRpbWluZ3NhZmVfYmNtcChyZXNwb25zZSwgbWRidWYsIDE2KSAhPSAwKSB7CisJCS8qIFdyb25nIGFuc3dlci4gKi8KKwkJcmV0dXJuICgwKTsKKwl9CisJLyogQ29ycmVjdCBhbnN3ZXIuICovCisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIFBlcmZvcm1zIHRoZSBSU0EgYXV0aGVudGljYXRpb24gY2hhbGxlbmdlLXJlc3BvbnNlIGRpYWxvZyB3aXRoIHRoZSBjbGllbnQsCisgKiBhbmQgcmV0dXJucyB0cnVlIChub24temVybykgaWYgdGhlIGNsaWVudCBnYXZlIHRoZSBjb3JyZWN0IGFuc3dlciB0bworICogb3VyIGNoYWxsZW5nZTsgcmV0dXJucyB6ZXJvIGlmIHRoZSBjbGllbnQgZ2l2ZXMgYSB3cm9uZyBhbnN3ZXIuCisgKi8KKworaW50CithdXRoX3JzYV9jaGFsbGVuZ2VfZGlhbG9nKEtleSAqa2V5KQoreworCUJJR05VTSAqY2hhbGxlbmdlLCAqZW5jcnlwdGVkX2NoYWxsZW5nZTsKKwl1X2NoYXIgcmVzcG9uc2VbMTZdOworCWludCBpLCBzdWNjZXNzOworCisJaWYgKChlbmNyeXB0ZWRfY2hhbGxlbmdlID0gQk5fbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCJhdXRoX3JzYV9jaGFsbGVuZ2VfZGlhbG9nOiBCTl9uZXcoKSBmYWlsZWQiKTsKKworCWNoYWxsZW5nZSA9IFBSSVZTRVAoYXV0aF9yc2FfZ2VuZXJhdGVfY2hhbGxlbmdlKGtleSkpOworCisJLyogRW5jcnlwdCB0aGUgY2hhbGxlbmdlIHdpdGggdGhlIHB1YmxpYyBrZXkuICovCisJcnNhX3B1YmxpY19lbmNyeXB0KGVuY3J5cHRlZF9jaGFsbGVuZ2UsIGNoYWxsZW5nZSwga2V5LT5yc2EpOworCisJLyogU2VuZCB0aGUgZW5jcnlwdGVkIGNoYWxsZW5nZSB0byB0aGUgY2xpZW50LiAqLworCXBhY2tldF9zdGFydChTU0hfU01TR19BVVRIX1JTQV9DSEFMTEVOR0UpOworCXBhY2tldF9wdXRfYmlnbnVtKGVuY3J5cHRlZF9jaGFsbGVuZ2UpOworCXBhY2tldF9zZW5kKCk7CisJQk5fY2xlYXJfZnJlZShlbmNyeXB0ZWRfY2hhbGxlbmdlKTsKKwlwYWNrZXRfd3JpdGVfd2FpdCgpOworCisJLyogV2FpdCBmb3IgYSByZXNwb25zZS4gKi8KKwlwYWNrZXRfcmVhZF9leHBlY3QoU1NIX0NNU0dfQVVUSF9SU0FfUkVTUE9OU0UpOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlyZXNwb25zZVtpXSA9ICh1X2NoYXIpcGFja2V0X2dldF9jaGFyKCk7CisJcGFja2V0X2NoZWNrX2VvbSgpOworCisJc3VjY2VzcyA9IFBSSVZTRVAoYXV0aF9yc2FfdmVyaWZ5X3Jlc3BvbnNlKGtleSwgY2hhbGxlbmdlLCByZXNwb25zZSkpOworCUJOX2NsZWFyX2ZyZWUoY2hhbGxlbmdlKTsKKwlyZXR1cm4gKHN1Y2Nlc3MpOworfQorCitzdGF0aWMgaW50Cityc2Ffa2V5X2FsbG93ZWRfaW5fZmlsZShzdHJ1Y3QgcGFzc3dkICpwdywgY2hhciAqZmlsZSwKKyAgICBjb25zdCBCSUdOVU0gKmNsaWVudF9uLCBLZXkgKipya2V5KQoreworCWNoYXIgbGluZVtTU0hfTUFYX1BVQktFWV9CWVRFU107CisJaW50IGFsbG93ZWQgPSAwOworCXVfaW50IGJpdHM7CisJRklMRSAqZjsKKwl1X2xvbmcgbGluZW51bSA9IDA7CisJS2V5ICprZXk7CisKKwlkZWJ1ZygidHJ5aW5nIHB1YmxpYyBSU0Ega2V5IGZpbGUgJXMiLCBmaWxlKTsKKwlpZiAoKGYgPSBhdXRoX29wZW5rZXlmaWxlKGZpbGUsIHB3LCBvcHRpb25zLnN0cmljdF9tb2RlcykpID09IE5VTEwpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBHbyB0aG91Z2ggdGhlIGFjY2VwdGVkIGtleXMsIGxvb2tpbmcgZm9yIHRoZSBjdXJyZW50IGtleS4gIElmCisJICogZm91bmQsIHBlcmZvcm0gYSBjaGFsbGVuZ2UtcmVzcG9uc2UgZGlhbG9nIHRvIHZlcmlmeSB0aGF0IHRoZQorCSAqIHVzZXIgcmVhbGx5IGhhcyB0aGUgY29ycmVzcG9uZGluZyBwcml2YXRlIGtleS4KKwkgKi8KKwlrZXkgPSBrZXlfbmV3KEtFWV9SU0ExKTsKKwl3aGlsZSAocmVhZF9rZXlmaWxlX2xpbmUoZiwgZmlsZSwgbGluZSwgc2l6ZW9mKGxpbmUpLCAmbGluZW51bSkgIT0gLTEpIHsKKwkJY2hhciAqY3A7CisJCWNoYXIgKmtleV9vcHRpb25zOworCQlpbnQga2V5Yml0czsKKworCQkvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZSwgZW1wdHkgYW5kIGNvbW1lbnQgbGluZXMuICovCisJCWZvciAoY3AgPSBsaW5lOyAqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnOyBjcCsrKQorCQkJOworCQlpZiAoISpjcCB8fCAqY3AgPT0gJ1xuJyB8fCAqY3AgPT0gJyMnKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogQ2hlY2sgaWYgdGhlcmUgYXJlIG9wdGlvbnMgZm9yIHRoaXMga2V5LCBhbmQgaWYgc28sCisJCSAqIHNhdmUgdGhlaXIgc3RhcnRpbmcgYWRkcmVzcyBhbmQgc2tpcCB0aGUgb3B0aW9uIHBhcnQKKwkJICogZm9yIG5vdy4gIElmIHRoZXJlIGFyZSBubyBvcHRpb25zLCBzZXQgdGhlIHN0YXJ0aW5nCisJCSAqIGFkZHJlc3MgdG8gTlVMTC4KKwkJICovCisJCWlmICgqY3AgPCAnMCcgfHwgKmNwID4gJzknKSB7CisJCQlpbnQgcXVvdGVkID0gMDsKKwkJCWtleV9vcHRpb25zID0gY3A7CisJCQlmb3IgKDsgKmNwICYmIChxdW90ZWQgfHwgKCpjcCAhPSAnICcgJiYgKmNwICE9ICdcdCcpKTsgY3ArKykgeworCQkJCWlmICgqY3AgPT0gJ1xcJyAmJiBjcFsxXSA9PSAnIicpCisJCQkJCWNwKys7CS8qIFNraXAgYm90aCAqLworCQkJCWVsc2UgaWYgKCpjcCA9PSAnIicpCisJCQkJCXF1b3RlZCA9ICFxdW90ZWQ7CisJCQl9CisJCX0gZWxzZQorCQkJa2V5X29wdGlvbnMgPSBOVUxMOworCisJCS8qIFBhcnNlIHRoZSBrZXkgZnJvbSB0aGUgbGluZS4gKi8KKwkJaWYgKGhvc3RmaWxlX3JlYWRfa2V5KCZjcCwgJmJpdHMsIGtleSkgPT0gMCkgeworCQkJZGVidWcoIiUuMTAwcywgbGluZSAlbHU6IG5vbiBzc2gxIGtleSBzeW50YXgiLAorCQkJICAgIGZpbGUsIGxpbmVudW0pOworCQkJY29udGludWU7CisJCX0KKwkJLyogY3Agbm93IHBvaW50cyB0byB0aGUgY29tbWVudCBwYXJ0LiAqLworCisJCS8qCisJCSAqIENoZWNrIGlmIHRoZSB3ZSBoYXZlIGZvdW5kIHRoZSBkZXNpcmVkIGtleSAoaWRlbnRpZmllZAorCQkgKiBieSBpdHMgbW9kdWx1cykuCisJCSAqLworCQlpZiAoQk5fY21wKGtleS0+cnNhLT5uLCBjbGllbnRfbikgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIGNoZWNrIHRoZSByZWFsIGJpdHMgICovCisJCWtleWJpdHMgPSBCTl9udW1fYml0cyhrZXktPnJzYS0+bik7CisJCWlmIChrZXliaXRzIDwgMCB8fCBiaXRzICE9ICh1X2ludClrZXliaXRzKQorCQkJbG9naXQoIldhcm5pbmc6ICVzLCBsaW5lICVsdToga2V5c2l6ZSBtaXNtYXRjaDogIgorCQkJICAgICJhY3R1YWwgJWQgdnMuIGFubm91bmNlZCAlZC4iLAorCQkJICAgIGZpbGUsIGxpbmVudW0sIEJOX251bV9iaXRzKGtleS0+cnNhLT5uKSwgYml0cyk7CisKKwkJLyogTmV2ZXIgYWNjZXB0IGEgcmV2b2tlZCBrZXkgKi8KKwkJaWYgKGF1dGhfa2V5X2lzX3Jldm9rZWQoa2V5KSkKKwkJCWJyZWFrOworCisJCS8qIFdlIGhhdmUgZm91bmQgdGhlIGRlc2lyZWQga2V5LiAqLworCQkvKgorCQkgKiBJZiBvdXIgb3B0aW9ucyBkbyBub3QgYWxsb3cgdGhpcyBrZXkgdG8gYmUgdXNlZCwKKwkJICogZG8gbm90IHNlbmQgY2hhbGxlbmdlLgorCQkgKi8KKwkJaWYgKCFhdXRoX3BhcnNlX29wdGlvbnMocHcsIGtleV9vcHRpb25zLCBmaWxlLCBsaW5lbnVtKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoa2V5X2lzX2NlcnRfYXV0aG9yaXR5KQorCQkJY29udGludWU7CisJCS8qIGJyZWFrIG91dCwgdGhpcyBrZXkgaXMgYWxsb3dlZCAqLworCQlhbGxvd2VkID0gMTsKKwkJYnJlYWs7CisJfQorCisJLyogQ2xvc2UgdGhlIGZpbGUuICovCisJZmNsb3NlKGYpOworCisJLyogcmV0dXJuIGtleSBpZiBhbGxvd2VkICovCisJaWYgKGFsbG93ZWQgJiYgcmtleSAhPSBOVUxMKQorCQkqcmtleSA9IGtleTsKKwllbHNlCisJCWtleV9mcmVlKGtleSk7CisKKwlyZXR1cm4gYWxsb3dlZDsKK30KKworLyoKKyAqIGNoZWNrIGlmIHRoZXJlJ3MgdXNlciBrZXkgbWF0Y2hpbmcgY2xpZW50X24sCisgKiByZXR1cm4ga2V5IGlmIGxvZ2luIGlzIGFsbG93ZWQsIE5VTEwgb3RoZXJ3aXNlCisgKi8KKworaW50CithdXRoX3JzYV9rZXlfYWxsb3dlZChzdHJ1Y3QgcGFzc3dkICpwdywgQklHTlVNICpjbGllbnRfbiwgS2V5ICoqcmtleSkKK3sKKwljaGFyICpmaWxlOworCXVfaW50IGksIGFsbG93ZWQgPSAwOworCisJdGVtcG9yYXJpbHlfdXNlX3VpZChwdyk7CisKKwlmb3IgKGkgPSAwOyAhYWxsb3dlZCAmJiBpIDwgb3B0aW9ucy5udW1fYXV0aGtleXNfZmlsZXM7IGkrKykgeworCQlmaWxlID0gZXhwYW5kX2F1dGhvcml6ZWRfa2V5cygKKwkJICAgIG9wdGlvbnMuYXV0aG9yaXplZF9rZXlzX2ZpbGVzW2ldLCBwdyk7CisJCWFsbG93ZWQgPSByc2Ffa2V5X2FsbG93ZWRfaW5fZmlsZShwdywgZmlsZSwgY2xpZW50X24sIHJrZXkpOworCQl4ZnJlZShmaWxlKTsKKwl9CisKKwlyZXN0b3JlX3VpZCgpOworCisJcmV0dXJuIGFsbG93ZWQ7Cit9CisKKy8qCisgKiBQZXJmb3JtcyB0aGUgUlNBIGF1dGhlbnRpY2F0aW9uIGRpYWxvZyB3aXRoIHRoZSBjbGllbnQuICBUaGlzIHJldHVybnMKKyAqIDAgaWYgdGhlIGNsaWVudCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCwgYW5kIDEgaWYgYXV0aGVudGljYXRpb24gd2FzCisgKiBzdWNjZXNzZnVsLiAgVGhpcyBtYXkgZXhpdCBpZiB0aGVyZSBpcyBhIHNlcmlvdXMgcHJvdG9jb2wgdmlvbGF0aW9uLgorICovCitpbnQKK2F1dGhfcnNhKEF1dGhjdHh0ICphdXRoY3R4dCwgQklHTlVNICpjbGllbnRfbikKK3sKKwlLZXkgKmtleTsKKwljaGFyICpmcDsKKwlzdHJ1Y3QgcGFzc3dkICpwdyA9IGF1dGhjdHh0LT5wdzsKKworCS8qIG5vIHVzZXIgZ2l2ZW4gKi8KKwlpZiAoIWF1dGhjdHh0LT52YWxpZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIVBSSVZTRVAoYXV0aF9yc2Ffa2V5X2FsbG93ZWQocHcsIGNsaWVudF9uLCAma2V5KSkpIHsKKwkJYXV0aF9jbGVhcl9vcHRpb25zKCk7CisJCXJldHVybiAoMCk7CisJfQorCisJLyogUGVyZm9ybSB0aGUgY2hhbGxlbmdlLXJlc3BvbnNlIGRpYWxvZyBmb3IgdGhpcyBrZXkuICovCisJaWYgKCFhdXRoX3JzYV9jaGFsbGVuZ2VfZGlhbG9nKGtleSkpIHsKKwkJLyogV3JvbmcgcmVzcG9uc2UuICovCisJCXZlcmJvc2UoIldyb25nIHJlc3BvbnNlIHRvIFJTQSBhdXRoZW50aWNhdGlvbiBjaGFsbGVuZ2UuIik7CisJCXBhY2tldF9zZW5kX2RlYnVnKCJXcm9uZyByZXNwb25zZSB0byBSU0EgYXV0aGVudGljYXRpb24gY2hhbGxlbmdlLiIpOworCQkvKgorCQkgKiBCcmVhayBvdXQgb2YgdGhlIGxvb3AuIE90aGVyd2lzZSB3ZSBtaWdodCBzZW5kCisJCSAqIGFub3RoZXIgY2hhbGxlbmdlIGFuZCBicmVhayB0aGUgcHJvdG9jb2wuCisJCSAqLworCQlrZXlfZnJlZShrZXkpOworCQlyZXR1cm4gKDApOworCX0KKwkvKgorCSAqIENvcnJlY3QgcmVzcG9uc2UuICBUaGUgY2xpZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseQorCSAqIGF1dGhlbnRpY2F0ZWQuIE5vdGUgdGhhdCB3ZSBoYXZlIG5vdCB5ZXQgcHJvY2Vzc2VkIHRoZQorCSAqIG9wdGlvbnM7IHRoaXMgd2lsbCBiZSByZXNldCBpZiB0aGUgb3B0aW9ucyBjYXVzZSB0aGUKKwkgKiBhdXRoZW50aWNhdGlvbiB0byBiZSByZWplY3RlZC4KKwkgKi8KKwlmcCA9IGtleV9maW5nZXJwcmludChrZXksIFNTSF9GUF9NRDUsIFNTSF9GUF9IRVgpOworCXZlcmJvc2UoIkZvdW5kIG1hdGNoaW5nICVzIGtleTogJXMiLAorCSAgICBrZXlfdHlwZShrZXkpLCBmcCk7CisJeGZyZWUoZnApOworCWtleV9mcmVlKGtleSk7CisKKwlwYWNrZXRfc2VuZF9kZWJ1ZygiUlNBIGF1dGhlbnRpY2F0aW9uIGFjY2VwdGVkLiIpOworCXJldHVybiAoMSk7Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2F1dGgtc2hhZG93LmMgYi9vcGVuc3NoLTYuMHAxL2F1dGgtc2hhZG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE5MDkxNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvYXV0aC1zaGFkb3cuYwpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXJyZW4gVHVja2VyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpZiBkZWZpbmVkKFVTRV9TSEFET1cpICYmIGRlZmluZWQoSEFTX1NIQURPV19FWFBJUkUpCisjaW5jbHVkZSA8c2hhZG93Lmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAia2V5LmgiCisjaW5jbHVkZSAiaG9zdGZpbGUuaCIKKyNpbmNsdWRlICJhdXRoLmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAibG9nLmgiCisKKyNpZmRlZiBEQVkKKyMgdW5kZWYgREFZCisjZW5kaWYKKyNkZWZpbmUgREFZCSgyNEwgKiA2MCAqIDYwKSAvKiAxIGRheSBpbiBzZWNvbmRzICovCisKK2V4dGVybiBCdWZmZXIgbG9naW5tc2c7CisKKy8qCisgKiBGb3IgdGhlIGFjY291bnQgYW5kIHBhc3N3b3JkIGV4cGlyYXRpb24gZnVuY3Rpb25zLCB3ZSBhc3N1bWUgdGhlIGV4cGlyeQorICogb2NjdXJzIHRoZSBkYXkgYWZ0ZXIgdGhlIGRheSBzcGVjaWZpZWQuCisgKi8KKworLyoKKyAqIENoZWNrIGlmIHNwZWNpZmllZCBhY2NvdW50IGlzIGV4cGlyZWQuICBSZXR1cm5zIDEgaWYgYWNjb3VudCBpcyBleHBpcmVkLAorICogMCBvdGhlcndpc2UuCisgKi8KK2ludAorYXV0aF9zaGFkb3dfYWNjdGV4cGlyZWQoc3RydWN0IHNwd2QgKnNwdykKK3sKKwl0aW1lX3QgdG9kYXk7CisJaW50IGRheXNsZWZ0OworCWNoYXIgYnVmWzI1Nl07CisKKwl0b2RheSA9IHRpbWUoTlVMTCkgLyBEQVk7CisJZGF5c2xlZnQgPSBzcHctPnNwX2V4cGlyZSAtIHRvZGF5OworCWRlYnVnMygiJXM6IHRvZGF5ICVkIHNwX2V4cGlyZSAlZCBkYXlzIGxlZnQgJWQiLCBfX2Z1bmNfXywgKGludCl0b2RheSwKKwkgICAgKGludClzcHctPnNwX2V4cGlyZSwgZGF5c2xlZnQpOworCisJaWYgKHNwdy0+c3BfZXhwaXJlID09IC0xKSB7CisJCWRlYnVnMygiYWNjb3VudCBleHBpcmF0aW9uIGRpc2FibGVkIik7CisJfSBlbHNlIGlmIChkYXlzbGVmdCA8IDApIHsKKwkJbG9naXQoIkFjY291bnQgJS4xMDBzIGhhcyBleHBpcmVkIiwgc3B3LT5zcF9uYW1wKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIGlmIChkYXlzbGVmdCA8PSBzcHctPnNwX3dhcm4pIHsKKwkJZGVidWczKCJhY2NvdW50IHdpbGwgZXhwaXJlIGluICVkIGRheXMiLCBkYXlzbGVmdCk7CisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCSAgICAiWW91ciBhY2NvdW50IHdpbGwgZXhwaXJlIGluICVkIGRheSVzLlxuIiwgZGF5c2xlZnQsCisJCSAgICBkYXlzbGVmdCA9PSAxID8gIiIgOiAicyIpOworCQlidWZmZXJfYXBwZW5kKCZsb2dpbm1zZywgYnVmLCBzdHJsZW4oYnVmKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGVja3MgcGFzc3dvcmQgZXhwaXJ5IGZvciBwbGF0Zm9ybXMgdGhhdCB1c2Ugc2hhZG93IHBhc3N3ZCBmaWxlcy4KKyAqIFJldHVybnM6IDEgPSBwYXNzd29yZCBleHBpcmVkLCAwID0gcGFzc3dvcmQgbm90IGV4cGlyZWQKKyAqLworaW50CithdXRoX3NoYWRvd19wd2V4cGlyZWQoQXV0aGN0eHQgKmN0eHQpCit7CisJc3RydWN0IHNwd2QgKnNwdyA9IE5VTEw7CisJY29uc3QgY2hhciAqdXNlciA9IGN0eHQtPnB3LT5wd19uYW1lOworCWNoYXIgYnVmWzI1Nl07CisJdGltZV90IHRvZGF5OworCWludCBkYXlzbGVmdCwgZGlzYWJsZWQgPSAwOworCisJaWYgKChzcHcgPSBnZXRzcG5hbSgoY2hhciAqKXVzZXIpKSA9PSBOVUxMKSB7CisJCWVycm9yKCJDb3VsZCBub3QgZ2V0IHNoYWRvdyBpbmZvcm1hdGlvbiBmb3IgJS4xMDBzIiwgdXNlcik7CisJCXJldHVybiAwOworCX0KKworCXRvZGF5ID0gdGltZShOVUxMKSAvIERBWTsKKwlkZWJ1ZzMoIiVzOiB0b2RheSAlZCBzcF9sc3RjaGcgJWQgc3BfbWF4ICVkIiwgX19mdW5jX18sIChpbnQpdG9kYXksCisJICAgIChpbnQpc3B3LT5zcF9sc3RjaGcsIChpbnQpc3B3LT5zcF9tYXgpOworCisjaWYgZGVmaW5lZChfX2hwdXgpICYmICFkZWZpbmVkKEhBVkVfU0VDVVJFV0FSRSkKKwlpZiAoaXNjb21zZWMoKSkgeworCQlzdHJ1Y3QgcHJfcGFzc3dkICpwcjsKKworCQlwciA9IGdldHBycHduYW0oKGNoYXIgKil1c2VyKTsKKworCQkvKiBUZXN0IGZvciBUcnVzdGVkIE1vZGUgZXhwaXJ5IGRpc2FibGVkICovCisJCWlmIChwciAhPSBOVUxMICYmIHByLT51ZmxkLmZkX21pbiA9PSAwICYmCisJCSAgICBwci0+dWZsZC5mZF9saWZldGltZSA9PSAwICYmIHByLT51ZmxkLmZkX2V4cGlyZSA9PSAwICYmCisJCSAgICBwci0+dWZsZC5mZF9wd19leHBpcmVfd2FybmluZyA9PSAwICYmCisJCSAgICBwci0+dWZsZC5mZF9zY2hhbmdlICE9IDApCisJCQlkaXNhYmxlZCA9IDE7CisJfQorI2VuZGlmCisKKwkvKiBUT0RPOiBjaGVjayBzcF9pbmFjdCAqLworCWRheXNsZWZ0ID0gc3B3LT5zcF9sc3RjaGcgKyBzcHctPnNwX21heCAtIHRvZGF5OworCWlmIChkaXNhYmxlZCkgeworCQlkZWJ1ZzMoInBhc3N3b3JkIGV4cGlyYXRpb24gZGlzYWJsZWQiKTsKKwl9IGVsc2UgaWYgKHNwdy0+c3BfbHN0Y2hnID09IDApIHsKKwkJbG9naXQoIlVzZXIgJS4xMDBzIHBhc3N3b3JkIGhhcyBleHBpcmVkIChyb290IGZvcmNlZCkiLCB1c2VyKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIGlmIChzcHctPnNwX21heCA9PSAtMSkgeworCQlkZWJ1ZzMoInBhc3N3b3JkIGV4cGlyYXRpb24gZGlzYWJsZWQiKTsKKwl9IGVsc2UgaWYgKGRheXNsZWZ0IDwgMCkgeworCQlsb2dpdCgiVXNlciAlLjEwMHMgcGFzc3dvcmQgaGFzIGV4cGlyZWQgKHBhc3N3b3JkIGFnZWQpIiwgdXNlcik7CisJCXJldHVybiAxOworCX0gZWxzZSBpZiAoZGF5c2xlZnQgPD0gc3B3LT5zcF93YXJuKSB7CisJCWRlYnVnMygicGFzc3dvcmQgd2lsbCBleHBpcmUgaW4gJWQgZGF5cyIsIGRheXNsZWZ0KTsKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKwkJICAgICJZb3VyIHBhc3N3b3JkIHdpbGwgZXhwaXJlIGluICVkIGRheSVzLlxuIiwgZGF5c2xlZnQsCisJCSAgICBkYXlzbGVmdCA9PSAxID8gIiIgOiAicyIpOworCQlidWZmZXJfYXBwZW5kKCZsb2dpbm1zZywgYnVmLCBzdHJsZW4oYnVmKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYJLyogVVNFX1NIQURPVyAmJiBIQVNfU0hBRE9XX0VYUElSRSAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9hdXRoLXNpYS5jIGIvb3BlbnNzaC02LjBwMS9hdXRoLXNpYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZTFjMjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2F1dGgtc2lhLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgQ2hyaXMgQWRhbXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2lmZGVmIEhBVkVfT1NGX1NJQQorI2luY2x1ZGUgPHNpYS5oPgorI2luY2x1ZGUgPHNpYWQuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInNzaC5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgImhvc3RmaWxlLmgiCisjaW5jbHVkZSAiYXV0aC5oIgorI2luY2x1ZGUgImF1dGgtc2lhLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAic2VydmNvbmYuaCIKKyNpbmNsdWRlICJjYW5vaG9zdC5oIgorI2luY2x1ZGUgInVpZHN3YXAuaCIKKworZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKK2V4dGVybiBpbnQgc2F2ZWRfYXJnYzsKK2V4dGVybiBjaGFyICoqc2F2ZWRfYXJndjsKKworaW50CitzeXNfYXV0aF9wYXNzd2QoQXV0aGN0eHQgKmF1dGhjdHh0LCBjb25zdCBjaGFyICpwYXNzKQoreworCWludCByZXQ7CisJU0lBRU5USVRZICplbnQgPSBOVUxMOworCWNvbnN0IGNoYXIgKmhvc3Q7CisKKwlob3N0ID0gZ2V0X2Nhbm9uaWNhbF9ob3N0bmFtZShvcHRpb25zLnVzZV9kbnMpOworCisJaWYgKCFhdXRoY3R4dC0+dXNlciB8fCBwYXNzID09IE5VTEwgfHwgcGFzc1swXSA9PSAnXDAnKQorCQlyZXR1cm4gKDApOworCisJaWYgKHNpYV9zZXNfaW5pdCgmZW50LCBzYXZlZF9hcmdjLCBzYXZlZF9hcmd2LCBob3N0LCBhdXRoY3R4dC0+dXNlciwKKwkgICAgTlVMTCwgMCwgTlVMTCkgIT0gU0lBU1VDQ0VTUykKKwkJcmV0dXJuICgwKTsKKworCWlmICgocmV0ID0gc2lhX3Nlc19hdXRoZW50KE5VTEwsIHBhc3MsIGVudCkpICE9IFNJQVNVQ0NFU1MpIHsKKwkJZXJyb3IoIkNvdWxkbid0IGF1dGhlbnRpY2F0ZSAlcyBmcm9tICVzIiwKKwkJICAgIGF1dGhjdHh0LT51c2VyLCBob3N0KTsKKwkJaWYgKHJldCAmIFNJQVNUT1ApCisJCQlzaWFfc2VzX3JlbGVhc2UoJmVudCk7CisKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlzaWFfc2VzX3JlbGVhc2UoJmVudCk7CisKKwlyZXR1cm4gKDEpOworfQorCit2b2lkCitzZXNzaW9uX3NldHVwX3NpYShzdHJ1Y3QgcGFzc3dkICpwdywgY2hhciAqdHR5KQoreworCVNJQUVOVElUWSAqZW50ID0gTlVMTDsKKwljb25zdCBjaGFyICpob3N0OworCisJaG9zdCA9IGdldF9jYW5vbmljYWxfaG9zdG5hbWUob3B0aW9ucy51c2VfZG5zKTsKKworCWlmIChzaWFfc2VzX2luaXQoJmVudCwgc2F2ZWRfYXJnYywgc2F2ZWRfYXJndiwgaG9zdCwgcHctPnB3X25hbWUsCisJICAgIHR0eSwgMCwgTlVMTCkgIT0gU0lBU1VDQ0VTUykKKwkJZmF0YWwoInNpYV9zZXNfaW5pdCBmYWlsZWQiKTsKKworCWlmIChzaWFfbWFrZV9lbnRpdHlfcHdkKHB3LCBlbnQpICE9IFNJQVNVQ0NFU1MpIHsKKwkJc2lhX3Nlc19yZWxlYXNlKCZlbnQpOworCQlmYXRhbCgic2lhX21ha2VfZW50aXR5X3B3ZCBmYWlsZWQiKTsKKwl9CisKKwllbnQtPmF1dGh0eXBlID0gU0lBX0FfTk9ORTsKKwlpZiAoc2lhX3Nlc19lc3RhYihzaWFfY29sbGVjdF90cm0sIGVudCkgIT0gU0lBU1VDQ0VTUykKKwkJZmF0YWwoIkNvdWxkbid0IGVzdGFibGlzaCBzZXNzaW9uIGZvciAlcyBmcm9tICVzIiwKKwkJICAgIHB3LT5wd19uYW1lLCBob3N0KTsKKworCWlmIChzaWFfc2VzX2xhdW5jaChzaWFfY29sbGVjdF90cm0sIGVudCkgIT0gU0lBU1VDQ0VTUykKKwkJZmF0YWwoIkNvdWxkbid0IGxhdW5jaCBzZXNzaW9uIGZvciAlcyBmcm9tICVzIiwKKwkJICAgIHB3LT5wd19uYW1lLCBob3N0KTsKKworCXNpYV9zZXNfcmVsZWFzZSgmZW50KTsKKworCXNldHVpZCgwKTsKKwlwZXJtYW5lbnRseV9zZXRfdWlkKHB3KTsKK30KKworI2VuZGlmIC8qIEhBVkVfT1NGX1NJQSAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9hdXRoLXNpYS5oIGIvb3BlbnNzaC02LjBwMS9hdXRoLXNpYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3Y2JiOTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2F1dGgtc2lhLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBDaHJpcyBBZGFtcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaWZkZWYgSEFWRV9PU0ZfU0lBCisKK3ZvaWQJc2Vzc2lvbl9zZXR1cF9zaWEoc3RydWN0IHBhc3N3ZCAqLCBjaGFyICopOworCisjZW5kaWYgLyogSEFWRV9PU0ZfU0lBICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2F1dGgtc2tleS5jIGIvb3BlbnNzaC02LjBwMS9hdXRoLXNrZXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTM2ZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9hdXRoLXNrZXkuYwpAQCAtMCwwICsxLDEwOCBAQAorLyogJE9wZW5CU0Q6IGF1dGgtc2tleS5jLHYgMS4yNyAyMDA3LzAxLzIxIDAxOjQxOjU0IHN0ZXZlc2sgRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaWZkZWYgU0tFWQorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8c2tleS5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgImhvc3RmaWxlLmgiCisjaW5jbHVkZSAiYXV0aC5oIgorI2luY2x1ZGUgInNzaC1nc3MuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJtb25pdG9yX3dyYXAuaCIKKworc3RhdGljIHZvaWQgKgorc2tleV9pbml0X2N0eChBdXRoY3R4dCAqYXV0aGN0eHQpCit7CisJcmV0dXJuIGF1dGhjdHh0OworfQorCitpbnQKK3NrZXlfcXVlcnkodm9pZCAqY3R4LCBjaGFyICoqbmFtZSwgY2hhciAqKmluZm90eHQsCisgICAgdV9pbnQqIG51bXByb21wdHMsIGNoYXIgKioqcHJvbXB0cywgdV9pbnQgKiplY2hvX29uKQoreworCUF1dGhjdHh0ICphdXRoY3R4dCA9IGN0eDsKKwljaGFyIGNoYWxsZW5nZVsxMDI0XTsKKwlzdHJ1Y3Qgc2tleSBza2V5OworCisJaWYgKF9jb21wYXRfc2tleWNoYWxsZW5nZSgmc2tleSwgYXV0aGN0eHQtPnVzZXIsIGNoYWxsZW5nZSwKKwkgICAgc2l6ZW9mKGNoYWxsZW5nZSkpID09IC0xKQorCQlyZXR1cm4gLTE7CisKKwkqbmFtZSA9IHhzdHJkdXAoIiIpOworCSppbmZvdHh0ID0geHN0cmR1cCgiIik7CisJKm51bXByb21wdHMgPSAxOworCSpwcm9tcHRzID0geGNhbGxvYygqbnVtcHJvbXB0cywgc2l6ZW9mKGNoYXIgKikpOworCSplY2hvX29uID0geGNhbGxvYygqbnVtcHJvbXB0cywgc2l6ZW9mKHVfaW50KSk7CisKKwl4YXNwcmludGYoKnByb21wdHMsICIlcyVzIiwgY2hhbGxlbmdlLCBTS0VZX1BST01QVCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50Citza2V5X3Jlc3BvbmQodm9pZCAqY3R4LCB1X2ludCBudW1yZXNwb25zZXMsIGNoYXIgKipyZXNwb25zZXMpCit7CisJQXV0aGN0eHQgKmF1dGhjdHh0ID0gY3R4OworCisJaWYgKGF1dGhjdHh0LT52YWxpZCAmJgorCSAgICBudW1yZXNwb25zZXMgPT0gMSAmJgorCSAgICBza2V5X2hhc2tleShhdXRoY3R4dC0+cHctPnB3X25hbWUpID09IDAgJiYKKwkgICAgc2tleV9wYXNzY2hlY2soYXV0aGN0eHQtPnB3LT5wd19uYW1lLCByZXNwb25zZXNbMF0pICE9IC0xKQorCSAgICByZXR1cm4gMDsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkCitza2V5X2ZyZWVfY3R4KHZvaWQgKmN0eCkKK3sKKwkvKiB3ZSBkb24ndCBoYXZlIGEgc3BlY2lhbCBjb250ZXh0ICovCit9CisKK0tiZGludERldmljZSBza2V5X2RldmljZSA9IHsKKwkic2tleSIsCisJc2tleV9pbml0X2N0eCwKKwlza2V5X3F1ZXJ5LAorCXNrZXlfcmVzcG9uZCwKKwlza2V5X2ZyZWVfY3R4Cit9OworCitLYmRpbnREZXZpY2UgbW1fc2tleV9kZXZpY2UgPSB7CisJInNrZXkiLAorCXNrZXlfaW5pdF9jdHgsCisJbW1fc2tleV9xdWVyeSwKKwltbV9za2V5X3Jlc3BvbmQsCisJc2tleV9mcmVlX2N0eAorfTsKKyNlbmRpZiAvKiBTS0VZICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2F1dGguYyBiL29wZW5zc2gtNi4wcDEvYXV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOTVkYTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2F1dGguYwpAQCAtMCwwICsxLDY5NSBAQAorLyogJE9wZW5CU0Q6IGF1dGguYyx2IDEuOTQgMjAxMS8wNS8yMyAwMzozMzozOCBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZmRlZiBIQVZFX1BBVEhTX0gKKyMgaW5jbHVkZSA8cGF0aHMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHB3ZC5oPgorI2lmZGVmIEhBVkVfTE9HSU5fSAorI2luY2x1ZGUgPGxvZ2luLmg+CisjZW5kaWYKKyNpZmRlZiBVU0VfU0hBRE9XCisjaW5jbHVkZSA8c2hhZG93Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0xJQkdFTl9ICisjaW5jbHVkZSA8bGliZ2VuLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgIm1hdGNoLmgiCisjaW5jbHVkZSAiZ3JvdXBhY2Nlc3MuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJzZXJ2Y29uZi5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgImhvc3RmaWxlLmgiCisjaW5jbHVkZSAiYXV0aC5oIgorI2luY2x1ZGUgImF1dGgtb3B0aW9ucy5oIgorI2luY2x1ZGUgImNhbm9ob3N0LmgiCisjaW5jbHVkZSAidWlkc3dhcC5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJwYWNrZXQuaCIKKyNpbmNsdWRlICJsb2dpbnJlYy5oIgorI2lmZGVmIEdTU0FQSQorI2luY2x1ZGUgInNzaC1nc3MuaCIKKyNlbmRpZgorI2luY2x1ZGUgImF1dGhmaWxlLmgiCisjaW5jbHVkZSAibW9uaXRvcl93cmFwLmgiCisKKy8qIGltcG9ydCAqLworZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKK2V4dGVybiBpbnQgdXNlX3ByaXZzZXA7CitleHRlcm4gQnVmZmVyIGxvZ2lubXNnOworZXh0ZXJuIHN0cnVjdCBwYXNzd2QgKnByaXZzZXBfcHc7CisKKy8qIERlYnVnZ2luZyBtZXNzYWdlcyAqLworQnVmZmVyIGF1dGhfZGVidWc7CitpbnQgYXV0aF9kZWJ1Z19pbml0OworCisvKgorICogQ2hlY2sgaWYgdGhlIHVzZXIgaXMgYWxsb3dlZCB0byBsb2cgaW4gdmlhIHNzaC4gSWYgdXNlciBpcyBsaXN0ZWQKKyAqIGluIERlbnlVc2VycyBvciBvbmUgb2YgdXNlcidzIGdyb3VwcyBpcyBsaXN0ZWQgaW4gRGVueUdyb3VwcywgZmFsc2UKKyAqIHdpbGwgYmUgcmV0dXJuZWQuIElmIEFsbG93VXNlcnMgaXNuJ3QgZW1wdHkgYW5kIHVzZXIgaXNuJ3QgbGlzdGVkCisgKiB0aGVyZSwgb3IgaWYgQWxsb3dHcm91cHMgaXNuJ3QgZW1wdHkgYW5kIG9uZSBvZiB1c2VyJ3MgZ3JvdXBzIGlzbid0CisgKiBsaXN0ZWQgdGhlcmUsIGZhbHNlIHdpbGwgYmUgcmV0dXJuZWQuCisgKiBJZiB0aGUgdXNlcidzIHNoZWxsIGlzIG5vdCBleGVjdXRhYmxlLCBmYWxzZSB3aWxsIGJlIHJldHVybmVkLgorICogT3RoZXJ3aXNlIHRydWUgaXMgcmV0dXJuZWQuCisgKi8KK2ludAorYWxsb3dlZF91c2VyKHN0cnVjdCBwYXNzd2QgKiBwdykKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwljb25zdCBjaGFyICpob3N0bmFtZSA9IE5VTEwsICppcGFkZHIgPSBOVUxMLCAqcGFzc3dkID0gTlVMTDsKKwl1X2ludCBpOworI2lmZGVmIFVTRV9TSEFET1cKKwlzdHJ1Y3Qgc3B3ZCAqc3B3ID0gTlVMTDsKKyNlbmRpZgorCisJLyogU2hvdWxkbid0IGJlIGNhbGxlZCBpZiBwdyBpcyBOVUxMLCBidXQgYmV0dGVyIHNhZmUgdGhhbiBzb3JyeS4uLiAqLworCWlmICghcHcgfHwgIXB3LT5wd19uYW1lKQorCQlyZXR1cm4gMDsKKworI2lmZGVmIFVTRV9TSEFET1cKKwlpZiAoIW9wdGlvbnMudXNlX3BhbSkKKwkJc3B3ID0gZ2V0c3BuYW0ocHctPnB3X25hbWUpOworI2lmZGVmIEhBU19TSEFET1dfRVhQSVJFCisJaWYgKCFvcHRpb25zLnVzZV9wYW0gJiYgc3B3ICE9IE5VTEwgJiYgYXV0aF9zaGFkb3dfYWNjdGV4cGlyZWQoc3B3KSkKKwkJcmV0dXJuIDA7CisjZW5kaWYgLyogSEFTX1NIQURPV19FWFBJUkUgKi8KKyNlbmRpZiAvKiBVU0VfU0hBRE9XICovCisKKwkvKiBncmFiIHBhc3N3ZCBmaWVsZCBmb3IgbG9ja2VkIGFjY291bnQgY2hlY2sgKi8KKwlwYXNzd2QgPSBwdy0+cHdfcGFzc3dkOworI2lmZGVmIFVTRV9TSEFET1cKKwlpZiAoc3B3ICE9IE5VTEwpCisjaWZkZWYgVVNFX0xJQklBRgorCQlwYXNzd2QgPSBnZXRfaWFmX3Bhc3N3b3JkKHB3KTsKKyNlbHNlCisJCXBhc3N3ZCA9IHNwdy0+c3BfcHdkcDsKKyNlbmRpZiAvKiBVU0VfTElCSUFGICovCisjZW5kaWYKKworCS8qIGNoZWNrIGZvciBsb2NrZWQgYWNjb3VudCAqLworCWlmICghb3B0aW9ucy51c2VfcGFtICYmIHBhc3N3ZCAmJiAqcGFzc3dkKSB7CisJCWludCBsb2NrZWQgPSAwOworCisjaWZkZWYgTE9DS0VEX1BBU1NXRF9TVFJJTkcKKwkJaWYgKHN0cmNtcChwYXNzd2QsIExPQ0tFRF9QQVNTV0RfU1RSSU5HKSA9PSAwKQorCQkJIGxvY2tlZCA9IDE7CisjZW5kaWYKKyNpZmRlZiBMT0NLRURfUEFTU1dEX1BSRUZJWAorCQlpZiAoc3RybmNtcChwYXNzd2QsIExPQ0tFRF9QQVNTV0RfUFJFRklYLAorCQkgICAgc3RybGVuKExPQ0tFRF9QQVNTV0RfUFJFRklYKSkgPT0gMCkKKwkJCSBsb2NrZWQgPSAxOworI2VuZGlmCisjaWZkZWYgTE9DS0VEX1BBU1NXRF9TVUJTVFIKKwkJaWYgKHN0cnN0cihwYXNzd2QsIExPQ0tFRF9QQVNTV0RfU1VCU1RSKSkKKwkJCWxvY2tlZCA9IDE7CisjZW5kaWYKKyNpZmRlZiBVU0VfTElCSUFGCisJCWZyZWUoKHZvaWQgKikgcGFzc3dkKTsKKyNlbmRpZiAvKiBVU0VfTElCSUFGICovCisJCWlmIChsb2NrZWQpIHsKKwkJCWxvZ2l0KCJVc2VyICUuMTAwcyBub3QgYWxsb3dlZCBiZWNhdXNlIGFjY291bnQgaXMgbG9ja2VkIiwKKwkJCSAgICBwdy0+cHdfbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qCisJICogRGVueSBpZiBzaGVsbCBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgZXhlY3V0YWJsZSB1bmxlc3Mgd2UKKwkgKiBhcmUgY2hyb290aW5nLgorCSAqLworCWlmIChvcHRpb25zLmNocm9vdF9kaXJlY3RvcnkgPT0gTlVMTCB8fAorCSAgICBzdHJjYXNlY21wKG9wdGlvbnMuY2hyb290X2RpcmVjdG9yeSwgIm5vbmUiKSA9PSAwKSB7CisJCWNoYXIgKnNoZWxsID0geHN0cmR1cCgocHctPnB3X3NoZWxsWzBdID09ICdcMCcpID8KKwkJICAgIF9QQVRIX0JTSEVMTCA6IHB3LT5wd19zaGVsbCk7IC8qIGVtcHR5ID0gL2Jpbi9zaCAqLworCisJCWlmIChzdGF0KHNoZWxsLCAmc3QpICE9IDApIHsKKwkJCWxvZ2l0KCJVc2VyICUuMTAwcyBub3QgYWxsb3dlZCBiZWNhdXNlIHNoZWxsICUuMTAwcyAiCisJCQkgICAgImRvZXMgbm90IGV4aXN0IiwgcHctPnB3X25hbWUsIHNoZWxsKTsKKwkJCXhmcmVlKHNoZWxsKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChTX0lTUkVHKHN0LnN0X21vZGUpID09IDAgfHwKKwkJICAgIChzdC5zdF9tb2RlICYgKFNfSVhPVEh8U19JWFVTUnxTX0lYR1JQKSkgPT0gMCkgeworCQkJbG9naXQoIlVzZXIgJS4xMDBzIG5vdCBhbGxvd2VkIGJlY2F1c2Ugc2hlbGwgJS4xMDBzICIKKwkJCSAgICAiaXMgbm90IGV4ZWN1dGFibGUiLCBwdy0+cHdfbmFtZSwgc2hlbGwpOworCQkJeGZyZWUoc2hlbGwpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJeGZyZWUoc2hlbGwpOworCX0KKworCWlmIChvcHRpb25zLm51bV9kZW55X3VzZXJzID4gMCB8fCBvcHRpb25zLm51bV9hbGxvd191c2VycyA+IDAgfHwKKwkgICAgb3B0aW9ucy5udW1fZGVueV9ncm91cHMgPiAwIHx8IG9wdGlvbnMubnVtX2FsbG93X2dyb3VwcyA+IDApIHsKKwkJaG9zdG5hbWUgPSBnZXRfY2Fub25pY2FsX2hvc3RuYW1lKG9wdGlvbnMudXNlX2Rucyk7CisJCWlwYWRkciA9IGdldF9yZW1vdGVfaXBhZGRyKCk7CisJfQorCisJLyogUmV0dXJuIGZhbHNlIGlmIHVzZXIgaXMgbGlzdGVkIGluIERlbnlVc2VycyAqLworCWlmIChvcHRpb25zLm51bV9kZW55X3VzZXJzID4gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1fZGVueV91c2VyczsgaSsrKQorCQkJaWYgKG1hdGNoX3VzZXIocHctPnB3X25hbWUsIGhvc3RuYW1lLCBpcGFkZHIsCisJCQkgICAgb3B0aW9ucy5kZW55X3VzZXJzW2ldKSkgeworCQkJCWxvZ2l0KCJVc2VyICUuMTAwcyBmcm9tICUuMTAwcyBub3QgYWxsb3dlZCAiCisJCQkJICAgICJiZWNhdXNlIGxpc3RlZCBpbiBEZW55VXNlcnMiLAorCQkJCSAgICBwdy0+cHdfbmFtZSwgaG9zdG5hbWUpOworCQkJCXJldHVybiAwOworCQkJfQorCX0KKwkvKiBSZXR1cm4gZmFsc2UgaWYgQWxsb3dVc2VycyBpc24ndCBlbXB0eSBhbmQgdXNlciBpc24ndCBsaXN0ZWQgdGhlcmUgKi8KKwlpZiAob3B0aW9ucy5udW1fYWxsb3dfdXNlcnMgPiAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBvcHRpb25zLm51bV9hbGxvd191c2VyczsgaSsrKQorCQkJaWYgKG1hdGNoX3VzZXIocHctPnB3X25hbWUsIGhvc3RuYW1lLCBpcGFkZHIsCisJCQkgICAgb3B0aW9ucy5hbGxvd191c2Vyc1tpXSkpCisJCQkJYnJlYWs7CisJCS8qIGkgPCBvcHRpb25zLm51bV9hbGxvd191c2VycyBpZmYgd2UgYnJlYWsgZm9yIGxvb3AgKi8KKwkJaWYgKGkgPj0gb3B0aW9ucy5udW1fYWxsb3dfdXNlcnMpIHsKKwkJCWxvZ2l0KCJVc2VyICUuMTAwcyBmcm9tICUuMTAwcyBub3QgYWxsb3dlZCBiZWNhdXNlICIKKwkJCSAgICAibm90IGxpc3RlZCBpbiBBbGxvd1VzZXJzIiwgcHctPnB3X25hbWUsIGhvc3RuYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWlmIChvcHRpb25zLm51bV9kZW55X2dyb3VwcyA+IDAgfHwgb3B0aW9ucy5udW1fYWxsb3dfZ3JvdXBzID4gMCkgeworCQkvKiBHZXQgdGhlIHVzZXIncyBncm91cCBhY2Nlc3MgbGlzdCAocHJpbWFyeSBhbmQgc3VwcGxlbWVudGFyeSkgKi8KKwkJaWYgKGdhX2luaXQocHctPnB3X25hbWUsIHB3LT5wd19naWQpID09IDApIHsKKwkJCWxvZ2l0KCJVc2VyICUuMTAwcyBmcm9tICUuMTAwcyBub3QgYWxsb3dlZCBiZWNhdXNlICIKKwkJCSAgICAibm90IGluIGFueSBncm91cCIsIHB3LT5wd19uYW1lLCBob3N0bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIFJldHVybiBmYWxzZSBpZiBvbmUgb2YgdXNlcidzIGdyb3VwcyBpcyBsaXN0ZWQgaW4gRGVueUdyb3VwcyAqLworCQlpZiAob3B0aW9ucy5udW1fZGVueV9ncm91cHMgPiAwKQorCQkJaWYgKGdhX21hdGNoKG9wdGlvbnMuZGVueV9ncm91cHMsCisJCQkgICAgb3B0aW9ucy5udW1fZGVueV9ncm91cHMpKSB7CisJCQkJZ2FfZnJlZSgpOworCQkJCWxvZ2l0KCJVc2VyICUuMTAwcyBmcm9tICUuMTAwcyBub3QgYWxsb3dlZCAiCisJCQkJICAgICJiZWNhdXNlIGEgZ3JvdXAgaXMgbGlzdGVkIGluIERlbnlHcm91cHMiLAorCQkJCSAgICBwdy0+cHdfbmFtZSwgaG9zdG5hbWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQkvKgorCQkgKiBSZXR1cm4gZmFsc2UgaWYgQWxsb3dHcm91cHMgaXNuJ3QgZW1wdHkgYW5kIG9uZSBvZiB1c2VyJ3MgZ3JvdXBzCisJCSAqIGlzbid0IGxpc3RlZCB0aGVyZQorCQkgKi8KKwkJaWYgKG9wdGlvbnMubnVtX2FsbG93X2dyb3VwcyA+IDApCisJCQlpZiAoIWdhX21hdGNoKG9wdGlvbnMuYWxsb3dfZ3JvdXBzLAorCQkJICAgIG9wdGlvbnMubnVtX2FsbG93X2dyb3VwcykpIHsKKwkJCQlnYV9mcmVlKCk7CisJCQkJbG9naXQoIlVzZXIgJS4xMDBzIGZyb20gJS4xMDBzIG5vdCBhbGxvd2VkICIKKwkJCQkgICAgImJlY2F1c2Ugbm9uZSBvZiB1c2VyJ3MgZ3JvdXBzIGFyZSBsaXN0ZWQgIgorCQkJCSAgICAiaW4gQWxsb3dHcm91cHMiLCBwdy0+cHdfbmFtZSwgaG9zdG5hbWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQlnYV9mcmVlKCk7CisJfQorCisjaWZkZWYgQ1VTVE9NX1NZU19BVVRIX0FMTE9XRURfVVNFUgorCWlmICghc3lzX2F1dGhfYWxsb3dlZF91c2VyKHB3LCAmbG9naW5tc2cpKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCisJLyogV2UgZm91bmQgbm8gcmVhc29uIG5vdCB0byBsZXQgdGhpcyB1c2VyIHRyeSB0byBsb2cgb24uLi4gKi8KKwlyZXR1cm4gMTsKK30KKwordm9pZAorYXV0aF9sb2coQXV0aGN0eHQgKmF1dGhjdHh0LCBpbnQgYXV0aGVudGljYXRlZCwgY2hhciAqbWV0aG9kLCBjaGFyICppbmZvKQoreworCXZvaWQgKCphdXRobG9nKSAoY29uc3QgY2hhciAqZm10LC4uLikgPSB2ZXJib3NlOworCWNoYXIgKmF1dGhtc2c7CisKKwlpZiAodXNlX3ByaXZzZXAgJiYgIW1tX2lzX21vbml0b3IoKSAmJiAhYXV0aGN0eHQtPnBvc3Rwb25lZCkKKwkJcmV0dXJuOworCisJLyogUmFpc2UgbG9nZ2luZyBsZXZlbCAqLworCWlmIChhdXRoZW50aWNhdGVkID09IDEgfHwKKwkgICAgIWF1dGhjdHh0LT52YWxpZCB8fAorCSAgICBhdXRoY3R4dC0+ZmFpbHVyZXMgPj0gb3B0aW9ucy5tYXhfYXV0aHRyaWVzIC8gMiB8fAorCSAgICBzdHJjbXAobWV0aG9kLCAicGFzc3dvcmQiKSA9PSAwKQorCQlhdXRobG9nID0gbG9naXQ7CisKKwlpZiAoYXV0aGN0eHQtPnBvc3Rwb25lZCkKKwkJYXV0aG1zZyA9ICJQb3N0cG9uZWQiOworCWVsc2UKKwkJYXV0aG1zZyA9IGF1dGhlbnRpY2F0ZWQgPyAiQWNjZXB0ZWQiIDogIkZhaWxlZCI7CisKKwlhdXRobG9nKCIlcyAlcyBmb3IgJXMlLjEwMHMgZnJvbSAlLjIwMHMgcG9ydCAlZCVzIiwKKwkgICAgYXV0aG1zZywKKwkgICAgbWV0aG9kLAorCSAgICBhdXRoY3R4dC0+dmFsaWQgPyAiIiA6ICJpbnZhbGlkIHVzZXIgIiwKKwkgICAgYXV0aGN0eHQtPnVzZXIsCisJICAgIGdldF9yZW1vdGVfaXBhZGRyKCksCisJICAgIGdldF9yZW1vdGVfcG9ydCgpLAorCSAgICBpbmZvKTsKKworI2lmZGVmIENVU1RPTV9GQUlMRURfTE9HSU4KKwlpZiAoYXV0aGVudGljYXRlZCA9PSAwICYmICFhdXRoY3R4dC0+cG9zdHBvbmVkICYmCisJICAgIChzdHJjbXAobWV0aG9kLCAicGFzc3dvcmQiKSA9PSAwIHx8CisJICAgIHN0cm5jbXAobWV0aG9kLCAia2V5Ym9hcmQtaW50ZXJhY3RpdmUiLCAyMCkgPT0gMCB8fAorCSAgICBzdHJjbXAobWV0aG9kLCAiY2hhbGxlbmdlLXJlc3BvbnNlIikgPT0gMCkpCisJCXJlY29yZF9mYWlsZWRfbG9naW4oYXV0aGN0eHQtPnVzZXIsCisJCSAgICBnZXRfY2Fub25pY2FsX2hvc3RuYW1lKG9wdGlvbnMudXNlX2RucyksICJzc2giKTsKKyMgaWZkZWYgV0lUSF9BSVhBVVRIRU5USUNBVEUKKwlpZiAoYXV0aGVudGljYXRlZCkKKwkJc3lzX2F1dGhfcmVjb3JkX2xvZ2luKGF1dGhjdHh0LT51c2VyLAorCQkgICAgZ2V0X2Nhbm9uaWNhbF9ob3N0bmFtZShvcHRpb25zLnVzZV9kbnMpLCAic3NoIiwgJmxvZ2lubXNnKTsKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIFNTSF9BVURJVF9FVkVOVFMKKwlpZiAoYXV0aGVudGljYXRlZCA9PSAwICYmICFhdXRoY3R4dC0+cG9zdHBvbmVkKQorCQlhdWRpdF9ldmVudChhdWRpdF9jbGFzc2lmeV9hdXRoKG1ldGhvZCkpOworI2VuZGlmCit9CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIHJvb3QgbG9naW5zIGFyZSBkaXNhbGxvd2VkLgorICovCitpbnQKK2F1dGhfcm9vdF9hbGxvd2VkKGNoYXIgKm1ldGhvZCkKK3sKKwlzd2l0Y2ggKG9wdGlvbnMucGVybWl0X3Jvb3RfbG9naW4pIHsKKwljYXNlIFBFUk1JVF9ZRVM6CisJCXJldHVybiAxOworCWNhc2UgUEVSTUlUX05PX1BBU1NXRDoKKwkJaWYgKHN0cmNtcChtZXRob2QsICJwYXNzd29yZCIpICE9IDApCisJCQlyZXR1cm4gMTsKKwkJYnJlYWs7CisJY2FzZSBQRVJNSVRfRk9SQ0VEX09OTFk6CisJCWlmIChmb3JjZWRfY29tbWFuZCkgeworCQkJbG9naXQoIlJvb3QgbG9naW4gYWNjZXB0ZWQgZm9yIGZvcmNlZCBjb21tYW5kLiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJYnJlYWs7CisJfQorCWxvZ2l0KCJST09UIExPR0lOIFJFRlVTRUQgRlJPTSAlLjIwMHMiLCBnZXRfcmVtb3RlX2lwYWRkcigpKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogR2l2ZW4gYSB0ZW1wbGF0ZSBhbmQgYSBwYXNzd2Qgc3RydWN0dXJlLCBidWlsZCBhIGZpbGVuYW1lCisgKiBieSBzdWJzdGl0dXRpbmcgJSB0b2tlbmlzZWQgb3B0aW9ucy4gQ3VycmVudGx5LCAlJSBiZWNvbWVzICclJywKKyAqICVoIGJlY29tZXMgdGhlIGhvbWUgZGlyZWN0b3J5IGFuZCAldSB0aGUgdXNlcm5hbWUuCisgKgorICogVGhpcyByZXR1cm5zIGEgYnVmZmVyIGFsbG9jYXRlZCBieSB4bWFsbG9jLgorICovCitjaGFyICoKK2V4cGFuZF9hdXRob3JpemVkX2tleXMoY29uc3QgY2hhciAqZmlsZW5hbWUsIHN0cnVjdCBwYXNzd2QgKnB3KQoreworCWNoYXIgKmZpbGUsIHJldFtNQVhQQVRITEVOXTsKKwlpbnQgaTsKKworCWZpbGUgPSBwZXJjZW50X2V4cGFuZChmaWxlbmFtZSwgImgiLCBwdy0+cHdfZGlyLAorCSAgICAidSIsIHB3LT5wd19uYW1lLCAoY2hhciAqKU5VTEwpOworCisJLyoKKwkgKiBFbnN1cmUgdGhhdCBmaWxlbmFtZSBzdGFydHMgYW5jaG9yZWQuIElmIG5vdCwgYmUgYmFja3dhcmQKKwkgKiBjb21wYXRpYmxlIGFuZCBwcmVwZW5kIHRoZSAnJWgvJworCSAqLworCWlmICgqZmlsZSA9PSAnLycpCisJCXJldHVybiAoZmlsZSk7CisKKwlpID0gc25wcmludGYocmV0LCBzaXplb2YocmV0KSwgIiVzLyVzIiwgcHctPnB3X2RpciwgZmlsZSk7CisJaWYgKGkgPCAwIHx8IChzaXplX3QpaSA+PSBzaXplb2YocmV0KSkKKwkJZmF0YWwoImV4cGFuZF9hdXRob3JpemVkX2tleXM6IHBhdGggdG9vIGxvbmciKTsKKwl4ZnJlZShmaWxlKTsKKwlyZXR1cm4gKHhzdHJkdXAocmV0KSk7Cit9CisKK2NoYXIgKgorYXV0aG9yaXplZF9wcmluY2lwYWxzX2ZpbGUoc3RydWN0IHBhc3N3ZCAqcHcpCit7CisJaWYgKG9wdGlvbnMuYXV0aG9yaXplZF9wcmluY2lwYWxzX2ZpbGUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGV4cGFuZF9hdXRob3JpemVkX2tleXMob3B0aW9ucy5hdXRob3JpemVkX3ByaW5jaXBhbHNfZmlsZSwgcHcpOworfQorCisvKiByZXR1cm4gb2sgaWYga2V5IGV4aXN0cyBpbiBzeXNmaWxlIG9yIHVzZXJmaWxlICovCitIb3N0U3RhdHVzCitjaGVja19rZXlfaW5faG9zdGZpbGVzKHN0cnVjdCBwYXNzd2QgKnB3LCBLZXkgKmtleSwgY29uc3QgY2hhciAqaG9zdCwKKyAgICBjb25zdCBjaGFyICpzeXNmaWxlLCBjb25zdCBjaGFyICp1c2VyZmlsZSkKK3sKKwljaGFyICp1c2VyX2hvc3RmaWxlOworCXN0cnVjdCBzdGF0IHN0OworCUhvc3RTdGF0dXMgaG9zdF9zdGF0dXM7CisJc3RydWN0IGhvc3RrZXlzICpob3N0a2V5czsKKwljb25zdCBzdHJ1Y3QgaG9zdGtleV9lbnRyeSAqZm91bmQ7CisKKwlob3N0a2V5cyA9IGluaXRfaG9zdGtleXMoKTsKKwlsb2FkX2hvc3RrZXlzKGhvc3RrZXlzLCBob3N0LCBzeXNmaWxlKTsKKwlpZiAodXNlcmZpbGUgIT0gTlVMTCkgeworCQl1c2VyX2hvc3RmaWxlID0gdGlsZGVfZXhwYW5kX2ZpbGVuYW1lKHVzZXJmaWxlLCBwdy0+cHdfdWlkKTsKKwkJaWYgKG9wdGlvbnMuc3RyaWN0X21vZGVzICYmCisJCSAgICAoc3RhdCh1c2VyX2hvc3RmaWxlLCAmc3QpID09IDApICYmCisJCSAgICAoKHN0LnN0X3VpZCAhPSAwICYmIHN0LnN0X3VpZCAhPSBwdy0+cHdfdWlkKSB8fAorCQkgICAgKHN0LnN0X21vZGUgJiAwMjIpICE9IDApKSB7CisJCQlsb2dpdCgiQXV0aGVudGljYXRpb24gcmVmdXNlZCBmb3IgJS4xMDBzOiAiCisJCQkgICAgImJhZCBvd25lciBvciBtb2RlcyBmb3IgJS4yMDBzIiwKKwkJCSAgICBwdy0+cHdfbmFtZSwgdXNlcl9ob3N0ZmlsZSk7CisJCQlhdXRoX2RlYnVnX2FkZCgiSWdub3JlZCAlLjIwMHM6IGJhZCBvd25lcnNoaXAgb3IgbW9kZXMiLAorCQkJICAgIHVzZXJfaG9zdGZpbGUpOworCQl9IGVsc2UgeworCQkJdGVtcG9yYXJpbHlfdXNlX3VpZChwdyk7CisJCQlsb2FkX2hvc3RrZXlzKGhvc3RrZXlzLCBob3N0LCB1c2VyX2hvc3RmaWxlKTsKKwkJCXJlc3RvcmVfdWlkKCk7CisJCX0KKwkJeGZyZWUodXNlcl9ob3N0ZmlsZSk7CisJfQorCWhvc3Rfc3RhdHVzID0gY2hlY2tfa2V5X2luX2hvc3RrZXlzKGhvc3RrZXlzLCBrZXksICZmb3VuZCk7CisJaWYgKGhvc3Rfc3RhdHVzID09IEhPU1RfUkVWT0tFRCkKKwkJZXJyb3IoIldBUk5JTkc6IHJldm9rZWQga2V5IGZvciAlcyBhdHRlbXB0ZWQgYXV0aGVudGljYXRpb24iLAorCQkgICAgZm91bmQtPmhvc3QpOworCWVsc2UgaWYgKGhvc3Rfc3RhdHVzID09IEhPU1RfT0spCisJCWRlYnVnKCIlczoga2V5IGZvciAlcyBmb3VuZCBhdCAlczolbGQiLCBfX2Z1bmNfXywKKwkJICAgIGZvdW5kLT5ob3N0LCBmb3VuZC0+ZmlsZSwgZm91bmQtPmxpbmUpOworCWVsc2UKKwkJZGVidWcoIiVzOiBrZXkgZm9yIGhvc3QgJXMgbm90IGZvdW5kIiwgX19mdW5jX18sIGhvc3QpOworCisJZnJlZV9ob3N0a2V5cyhob3N0a2V5cyk7CisKKwlyZXR1cm4gaG9zdF9zdGF0dXM7Cit9CisKKworLyoKKyAqIENoZWNrIGEgZ2l2ZW4gZmlsZSBmb3Igc2VjdXJpdHkuIFRoaXMgaXMgZGVmaW5lZCBhcyBhbGwgY29tcG9uZW50cworICogb2YgdGhlIHBhdGggdG8gdGhlIGZpbGUgbXVzdCBiZSBvd25lZCBieSBlaXRoZXIgdGhlIG93bmVyIG9mCisgKiBvZiB0aGUgZmlsZSBvciByb290IGFuZCBubyBkaXJlY3RvcmllcyBtdXN0IGJlIGdyb3VwIG9yIHdvcmxkIHdyaXRhYmxlLgorICoKKyAqIFhYWCBTaG91bGQgYW55IHNwZWNpZmljIGNoZWNrIGJlIGRvbmUgZm9yIHN5bSBsaW5rcyA/CisgKgorICogVGFrZXMgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IsIHRoZSBmaWxlIG5hbWUsIGEgdWlkIGFuZCBhbmQKKyAqIGVycm9yIGJ1ZmZlciBwbHVzIG1heCBzaXplIGFzIGFyZ3VtZW50cy4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgLTEgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50CitzZWN1cmVfZmlsZW5hbWUoRklMRSAqZiwgY29uc3QgY2hhciAqZmlsZSwgc3RydWN0IHBhc3N3ZCAqcHcsCisgICAgY2hhciAqZXJyLCBzaXplX3QgZXJybGVuKQoreworCXVpZF90IHVpZCA9IHB3LT5wd191aWQ7CisJY2hhciBidWZbTUFYUEFUSExFTl0sIGhvbWVkaXJbTUFYUEFUSExFTl07CisJY2hhciAqY3A7CisJaW50IGNvbXBhcmVob21lID0gMDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChyZWFscGF0aChmaWxlLCBidWYpID09IE5VTEwpIHsKKwkJc25wcmludGYoZXJyLCBlcnJsZW4sICJyZWFscGF0aCAlcyBmYWlsZWQ6ICVzIiwgZmlsZSwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHJlYWxwYXRoKHB3LT5wd19kaXIsIGhvbWVkaXIpICE9IE5VTEwpCisJCWNvbXBhcmVob21lID0gMTsKKworCS8qIGNoZWNrIHRoZSBvcGVuIGZpbGUgdG8gYXZvaWQgcmFjZXMgKi8KKwlpZiAoZnN0YXQoZmlsZW5vKGYpLCAmc3QpIDwgMCB8fAorCSAgICAoc3Quc3RfdWlkICE9IDAgJiYgc3Quc3RfdWlkICE9IHVpZCkgfHwKKwkgICAgKHN0LnN0X21vZGUgJiAwMjIpICE9IDApIHsKKwkJc25wcmludGYoZXJyLCBlcnJsZW4sICJiYWQgb3duZXJzaGlwIG9yIG1vZGVzIGZvciBmaWxlICVzIiwKKwkJICAgIGJ1Zik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBmb3IgZWFjaCBjb21wb25lbnQgb2YgdGhlIGNhbm9uaWNhbCBwYXRoLCB3YWxraW5nIHVwd2FyZHMgKi8KKwlmb3IgKDs7KSB7CisJCWlmICgoY3AgPSBkaXJuYW1lKGJ1ZikpID09IE5VTEwpIHsKKwkJCXNucHJpbnRmKGVyciwgZXJybGVuLCAiZGlybmFtZSgpIGZhaWxlZCIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXN0cmxjcHkoYnVmLCBjcCwgc2l6ZW9mKGJ1ZikpOworCisJCWlmIChzdGF0KGJ1ZiwgJnN0KSA8IDAgfHwKKwkJICAgIChzdC5zdF91aWQgIT0gMCAmJiBzdC5zdF91aWQgIT0gdWlkKSB8fAorCQkgICAgKHN0LnN0X21vZGUgJiAwMjIpICE9IDApIHsKKwkJCXNucHJpbnRmKGVyciwgZXJybGVuLAorCQkJICAgICJiYWQgb3duZXJzaGlwIG9yIG1vZGVzIGZvciBkaXJlY3RvcnkgJXMiLCBidWYpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyogSWYgYXJlIHBhc3QgdGhlIGhvbWVkaXIgdGhlbiB3ZSBjYW4gc3RvcCAqLworCQlpZiAoY29tcGFyZWhvbWUgJiYgc3RyY21wKGhvbWVkaXIsIGJ1ZikgPT0gMCkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIGRpcm5hbWUgc2hvdWxkIGFsd2F5cyBjb21wbGV0ZSB3aXRoIGEgIi8iIHBhdGgsCisJCSAqIGJ1dCB3ZSBjYW4gYmUgcGFyYW5vaWQgYW5kIGNoZWNrIGZvciAiLiIgdG9vCisJCSAqLworCQlpZiAoKHN0cmNtcCgiLyIsIGJ1ZikgPT0gMCkgfHwgKHN0cmNtcCgiLiIsIGJ1ZikgPT0gMCkpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBGSUxFICoKK2F1dGhfb3BlbmZpbGUoY29uc3QgY2hhciAqZmlsZSwgc3RydWN0IHBhc3N3ZCAqcHcsIGludCBzdHJpY3RfbW9kZXMsCisgICAgaW50IGxvZ19taXNzaW5nLCBjaGFyICpmaWxlX3R5cGUpCit7CisJY2hhciBsaW5lWzEwMjRdOworCXN0cnVjdCBzdGF0IHN0OworCWludCBmZDsKKwlGSUxFICpmOworCisJaWYgKChmZCA9IG9wZW4oZmlsZSwgT19SRE9OTFl8T19OT05CTE9DSykpID09IC0xKSB7CisJCWlmIChsb2dfbWlzc2luZyB8fCBlcnJubyAhPSBFTk9FTlQpCisJCQlkZWJ1ZygiQ291bGQgbm90IG9wZW4gJXMgJyVzJzogJXMiLCBmaWxlX3R5cGUsIGZpbGUsCisJCQkgICBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoZnN0YXQoZmQsICZzdCkgPCAwKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICghU19JU1JFRyhzdC5zdF9tb2RlKSkgeworCQlsb2dpdCgiVXNlciAlcyAlcyAlcyBpcyBub3QgYSByZWd1bGFyIGZpbGUiLAorCQkgICAgcHctPnB3X25hbWUsIGZpbGVfdHlwZSwgZmlsZSk7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXVuc2V0X25vbmJsb2NrKGZkKTsKKwlpZiAoKGYgPSBmZG9wZW4oZmQsICJyIikpID09IE5VTEwpIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHN0cmljdF9tb2RlcyAmJgorCSAgICBzZWN1cmVfZmlsZW5hbWUoZiwgZmlsZSwgcHcsIGxpbmUsIHNpemVvZihsaW5lKSkgIT0gMCkgeworCQlmY2xvc2UoZik7CisJCWxvZ2l0KCJBdXRoZW50aWNhdGlvbiByZWZ1c2VkOiAlcyIsIGxpbmUpOworCQlhdXRoX2RlYnVnX2FkZCgiSWdub3JlZCAlczogJXMiLCBmaWxlX3R5cGUsIGxpbmUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gZjsKK30KKworCitGSUxFICoKK2F1dGhfb3BlbmtleWZpbGUoY29uc3QgY2hhciAqZmlsZSwgc3RydWN0IHBhc3N3ZCAqcHcsIGludCBzdHJpY3RfbW9kZXMpCit7CisJcmV0dXJuIGF1dGhfb3BlbmZpbGUoZmlsZSwgcHcsIHN0cmljdF9tb2RlcywgMSwgImF1dGhvcml6ZWQga2V5cyIpOworfQorCitGSUxFICoKK2F1dGhfb3BlbnByaW5jaXBhbHMoY29uc3QgY2hhciAqZmlsZSwgc3RydWN0IHBhc3N3ZCAqcHcsIGludCBzdHJpY3RfbW9kZXMpCit7CisJcmV0dXJuIGF1dGhfb3BlbmZpbGUoZmlsZSwgcHcsIHN0cmljdF9tb2RlcywgMCwKKwkgICAgImF1dGhvcml6ZWQgcHJpbmNpcGFscyIpOworfQorCitzdHJ1Y3QgcGFzc3dkICoKK2dldHB3bmFtYWxsb3coY29uc3QgY2hhciAqdXNlcikKK3sKKyNpZmRlZiBIQVZFX0xPR0lOX0NBUAorCWV4dGVybiBsb2dpbl9jYXBfdCAqbGM7CisjaWZkZWYgQlNEX0FVVEgKKwlhdXRoX3Nlc3Npb25fdCAqYXM7CisjZW5kaWYKKyNlbmRpZgorCXN0cnVjdCBwYXNzd2QgKnB3OworCisJcGFyc2Vfc2VydmVyX21hdGNoX2NvbmZpZygmb3B0aW9ucywgdXNlciwKKwkgICAgZ2V0X2Nhbm9uaWNhbF9ob3N0bmFtZShvcHRpb25zLnVzZV9kbnMpLCBnZXRfcmVtb3RlX2lwYWRkcigpKTsKKworI2lmIGRlZmluZWQoX0FJWCkgJiYgZGVmaW5lZChIQVZFX1NFVEFVVEhEQikKKwlhaXhfc2V0YXV0aGRiKHVzZXIpOworI2VuZGlmCisKKwlwdyA9IGdldHB3bmFtKHVzZXIpOworCisjaWYgZGVmaW5lZChfQUlYKSAmJiBkZWZpbmVkKEhBVkVfU0VUQVVUSERCKQorCWFpeF9yZXN0b3JlYXV0aGRiKCk7CisjZW5kaWYKKyNpZmRlZiBIQVZFX0NZR1dJTgorCS8qCisJICogV2luZG93cyB1c2VybmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUuICBUbyBhdm9pZCBsYXRlciBwcm9ibGVtcworCSAqIHdoZW4gdHJ5aW5nIHRvIG1hdGNoIHRoZSB1c2VybmFtZSwgdGhlIHVzZXIgaXMgb25seSBhbGxvd2VkIHRvCisJICogbG9naW4gaWYgdGhlIHVzZXJuYW1lIGlzIGdpdmVuIGluIHRoZSBzYW1lIGNhc2UgYXMgc3RvcmVkIGluIHRoZQorCSAqIHVzZXIgZGF0YWJhc2UuCisJICovCisJaWYgKHB3ICE9IE5VTEwgJiYgc3RyY21wKHVzZXIsIHB3LT5wd19uYW1lKSAhPSAwKSB7CisJCWxvZ2l0KCJMb2dpbiBuYW1lICUuMTAwcyBkb2VzIG5vdCBtYXRjaCBzdG9yZWQgdXNlcm5hbWUgJS4xMDBzIiwKKwkJICAgIHVzZXIsIHB3LT5wd19uYW1lKTsKKwkJcHcgPSBOVUxMOworCX0KKyNlbmRpZgorCWlmIChwdyA9PSBOVUxMKSB7CisJCWxvZ2l0KCJJbnZhbGlkIHVzZXIgJS4xMDBzIGZyb20gJS4xMDBzIiwKKwkJICAgIHVzZXIsIGdldF9yZW1vdGVfaXBhZGRyKCkpOworI2lmZGVmIENVU1RPTV9GQUlMRURfTE9HSU4KKwkJcmVjb3JkX2ZhaWxlZF9sb2dpbih1c2VyLAorCQkgICAgZ2V0X2Nhbm9uaWNhbF9ob3N0bmFtZShvcHRpb25zLnVzZV9kbnMpLCAic3NoIik7CisjZW5kaWYKKyNpZmRlZiBTU0hfQVVESVRfRVZFTlRTCisJCWF1ZGl0X2V2ZW50KFNTSF9JTlZBTElEX1VTRVIpOworI2VuZGlmIC8qIFNTSF9BVURJVF9FVkVOVFMgKi8KKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJaWYgKCFhbGxvd2VkX3VzZXIocHcpKQorCQlyZXR1cm4gKE5VTEwpOworI2lmZGVmIEhBVkVfTE9HSU5fQ0FQCisJaWYgKChsYyA9IGxvZ2luX2dldGNsYXNzKHB3LT5wd19jbGFzcykpID09IE5VTEwpIHsKKwkJZGVidWcoInVuYWJsZSB0byBnZXQgbG9naW4gY2xhc3M6ICVzIiwgdXNlcik7CisJCXJldHVybiAoTlVMTCk7CisJfQorI2lmZGVmIEJTRF9BVVRICisJaWYgKChhcyA9IGF1dGhfb3BlbigpKSA9PSBOVUxMIHx8IGF1dGhfc2V0cHdkKGFzLCBwdykgIT0gMCB8fAorCSAgICBhdXRoX2FwcHJvdmFsKGFzLCBsYywgcHctPnB3X25hbWUsICJzc2giKSA8PSAwKSB7CisJCWRlYnVnKCJBcHByb3ZhbCBmYWlsdXJlIGZvciAlcyIsIHVzZXIpOworCQlwdyA9IE5VTEw7CisJfQorCWlmIChhcyAhPSBOVUxMKQorCQlhdXRoX2Nsb3NlKGFzKTsKKyNlbmRpZgorI2VuZGlmCisJaWYgKHB3ICE9IE5VTEwpCisJCXJldHVybiAocHdjb3B5KHB3KSk7CisJcmV0dXJuIChOVUxMKTsKK30KKworLyogUmV0dXJucyAxIGlmIGtleSBpcyByZXZva2VkIGJ5IHJldm9rZWRfa2V5c19maWxlLCAwIG90aGVyd2lzZSAqLworaW50CithdXRoX2tleV9pc19yZXZva2VkKEtleSAqa2V5KQoreworCWNoYXIgKmtleV9mcDsKKworCWlmIChvcHRpb25zLnJldm9rZWRfa2V5c19maWxlID09IE5VTEwpCisJCXJldHVybiAwOworCisJc3dpdGNoIChrZXlfaW5fZmlsZShrZXksIG9wdGlvbnMucmV2b2tlZF9rZXlzX2ZpbGUsIDApKSB7CisJY2FzZSAwOgorCQkvKiBrZXkgbm90IHJldm9rZWQgKi8KKwkJcmV0dXJuIDA7CisJY2FzZSAtMToKKwkJLyogRXJyb3Igb3BlbmluZyByZXZva2VkX2tleXNfZmlsZTogcmVmdXNlIGFsbCBrZXlzICovCisJCWVycm9yKCJSZXZva2VkIGtleXMgZmlsZSBpcyB1bnJlYWRhYmxlOiByZWZ1c2luZyBwdWJsaWMga2V5ICIKKwkJICAgICJhdXRoZW50aWNhdGlvbiIpOworCQlyZXR1cm4gMTsKKwljYXNlIDE6CisJCS8qIEtleSByZXZva2VkICovCisJCWtleV9mcCA9IGtleV9maW5nZXJwcmludChrZXksIFNTSF9GUF9NRDUsIFNTSF9GUF9IRVgpOworCQllcnJvcigiV0FSTklORzogYXV0aGVudGljYXRpb24gYXR0ZW1wdCB3aXRoIGEgcmV2b2tlZCAiCisJCSAgICAiJXMga2V5ICVzICIsIGtleV90eXBlKGtleSksIGtleV9mcCk7CisJCXhmcmVlKGtleV9mcCk7CisJCXJldHVybiAxOworCX0KKwlmYXRhbCgia2V5X2luX2ZpbGUgcmV0dXJuZWQganVuayIpOworfQorCit2b2lkCithdXRoX2RlYnVnX2FkZChjb25zdCBjaGFyICpmbXQsLi4uKQoreworCWNoYXIgYnVmWzEwMjRdOworCXZhX2xpc3QgYXJnczsKKworCWlmICghYXV0aF9kZWJ1Z19pbml0KQorCQlyZXR1cm47CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcoJmF1dGhfZGVidWcsIGJ1Zik7Cit9CisKK3ZvaWQKK2F1dGhfZGVidWdfc2VuZCh2b2lkKQoreworCWNoYXIgKm1zZzsKKworCWlmICghYXV0aF9kZWJ1Z19pbml0KQorCQlyZXR1cm47CisJd2hpbGUgKGJ1ZmZlcl9sZW4oJmF1dGhfZGVidWcpKSB7CisJCW1zZyA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZhdXRoX2RlYnVnLCBOVUxMKTsKKwkJcGFja2V0X3NlbmRfZGVidWcoIiVzIiwgbXNnKTsKKwkJeGZyZWUobXNnKTsKKwl9Cit9CisKK3ZvaWQKK2F1dGhfZGVidWdfcmVzZXQodm9pZCkKK3sKKwlpZiAoYXV0aF9kZWJ1Z19pbml0KQorCQlidWZmZXJfY2xlYXIoJmF1dGhfZGVidWcpOworCWVsc2UgeworCQlidWZmZXJfaW5pdCgmYXV0aF9kZWJ1Zyk7CisJCWF1dGhfZGVidWdfaW5pdCA9IDE7CisJfQorfQorCitzdHJ1Y3QgcGFzc3dkICoKK2Zha2Vwdyh2b2lkKQoreworCXN0YXRpYyBzdHJ1Y3QgcGFzc3dkIGZha2U7CisKKwltZW1zZXQoJmZha2UsIDAsIHNpemVvZihmYWtlKSk7CisJZmFrZS5wd19uYW1lID0gIk5PVVNFUiI7CisJZmFrZS5wd19wYXNzd2QgPQorCSAgICAiJDJhJDA2JHIzLmp1VWFIWkRsSWJRYU8yZFM5RnVZeEwxVzlNODFSMVRjOTJQb1NObXp2cEVxTGtMR3JLIjsKKwlmYWtlLnB3X2dlY29zID0gIk5PVVNFUiI7CisJZmFrZS5wd191aWQgPSBwcml2c2VwX3B3ID09IE5VTEwgPyAodWlkX3QpLTEgOiBwcml2c2VwX3B3LT5wd191aWQ7CisJZmFrZS5wd19naWQgPSBwcml2c2VwX3B3ID09IE5VTEwgPyAoZ2lkX3QpLTEgOiBwcml2c2VwX3B3LT5wd19naWQ7CisjaWZkZWYgSEFWRV9QV19DTEFTU19JTl9QQVNTV0QKKwlmYWtlLnB3X2NsYXNzID0gIiI7CisjZW5kaWYKKwlmYWtlLnB3X2RpciA9ICIvbm9uZXhpc3QiOworCWZha2UucHdfc2hlbGwgPSAiL25vbmV4aXN0IjsKKworCXJldHVybiAoJmZha2UpOworfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9hdXRoLmggYi9vcGVuc3NoLTYuMHAxL2F1dGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDc4NmM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9hdXRoLmgKQEAgLTAsMCArMSwyMDYgQEAKKy8qICRPcGVuQlNEOiBhdXRoLmgsdiAxLjY5IDIwMTEvMDUvMjMgMDM6MzA6MDcgZGptIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEFVVEhfSAorI2RlZmluZSBBVVRIX0gKKworI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKworI2lmZGVmIEhBVkVfTE9HSU5fQ0FQCisjaW5jbHVkZSA8bG9naW5fY2FwLmg+CisjZW5kaWYKKyNpZmRlZiBCU0RfQVVUSAorI2luY2x1ZGUgPGJzZF9hdXRoLmg+CisjZW5kaWYKKyNpZmRlZiBLUkI1CisjaW5jbHVkZSA8a3JiNS5oPgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IEF1dGhjdHh0IEF1dGhjdHh0OwordHlwZWRlZiBzdHJ1Y3QgQXV0aG1ldGhvZCBBdXRobWV0aG9kOwordHlwZWRlZiBzdHJ1Y3QgS2JkaW50RGV2aWNlIEtiZGludERldmljZTsKKworc3RydWN0IEF1dGhjdHh0IHsKKwlzaWdfYXRvbWljX3QJIHN1Y2Nlc3M7CisJaW50CQkgYXV0aGVudGljYXRlZDsJLyogYXV0aGVudGljYXRlZCBhbmQgYWxhcm1zIGNhbmNlbGxlZCAqLworCWludAkJIHBvc3Rwb25lZDsJLyogYXV0aGVudGljYXRpb24gbmVlZHMgYW5vdGhlciBzdGVwICovCisJaW50CQkgdmFsaWQ7CQkvKiB1c2VyIGV4aXN0cyBhbmQgaXMgYWxsb3dlZCB0byBsb2dpbiAqLworCWludAkJIGF0dGVtcHQ7CisJaW50CQkgZmFpbHVyZXM7CisJaW50CQkgc2VydmVyX2NhdXNlZF9mYWlsdXJlOyAKKwlpbnQJCSBmb3JjZV9wd2NoYW5nZTsKKwljaGFyCQkqdXNlcjsJCS8qIHVzZXJuYW1lIHNlbnQgYnkgdGhlIGNsaWVudCAqLworCWNoYXIJCSpzZXJ2aWNlOworCXN0cnVjdCBwYXNzd2QJKnB3OwkJLyogc2V0IGlmICd2YWxpZCcgKi8KKwljaGFyCQkqc3R5bGU7CisJdm9pZAkJKmtiZGludGN0eHQ7CisJdm9pZAkJKmpwYWtlX2N0eDsKKyNpZmRlZiBCU0RfQVVUSAorCWF1dGhfc2Vzc2lvbl90CSphczsKKyNlbmRpZgorI2lmZGVmIEtSQjUKKwlrcmI1X2NvbnRleHQJIGtyYjVfY3R4OworCWtyYjVfY2NhY2hlCSBrcmI1X2Z3ZF9jY2FjaGU7CisJa3JiNV9wcmluY2lwYWwJIGtyYjVfdXNlcjsKKwljaGFyCQkqa3JiNV90aWNrZXRfZmlsZTsKKwljaGFyCQkqa3JiNV9jY25hbWU7CisjZW5kaWYKKwlCdWZmZXIJCSpsb2dpbm1zZzsKKwl2b2lkCQkqbWV0aG9kZGF0YTsKK307CisvKgorICogRXZlcnkgYXV0aGVudGljYXRpb24gbWV0aG9kIGhhcyB0byBoYW5kbGUgYXV0aGVudGljYXRpb24gcmVxdWVzdHMgZm9yCisgKiBub24tZXhpc3RpbmcgdXNlcnMsIG9yIGZvciB1c2VycyB0aGF0IGFyZSBub3QgYWxsb3dlZCB0byBsb2dpbi4gSW4gdGhpcworICogY2FzZSAndmFsaWQnIGlzIHNldCB0byAwLCBidXQgJ3VzZXInIHBvaW50cyB0byB0aGUgdXNlcm5hbWUgcmVxdWVzdGVkIGJ5CisgKiB0aGUgY2xpZW50LgorICovCisKK3N0cnVjdCBBdXRobWV0aG9kIHsKKwljaGFyCSpuYW1lOworCWludAkoKnVzZXJhdXRoKShBdXRoY3R4dCAqYXV0aGN0eHQpOworCWludAkqZW5hYmxlZDsKK307CisKKy8qCisgKiBLZXlib2FyZCBpbnRlcmFjdGl2ZSBkZXZpY2U6CisgKiBpbml0X2N0eAlyZXR1cm5zOiBub24gTlVMTCB1cG9uIHN1Y2Nlc3MKKyAqIHF1ZXJ5CXJldHVybnM6IDAgLSBzdWNjZXNzLCBvdGhlcndpc2UgZmFpbHVyZQorICogcmVzcG9uZAlyZXR1cm5zOiAwIC0gc3VjY2VzcywgMSAtIG5lZWQgZnVydGhlciBpbnRlcmFjdGlvbiwKKyAqCQlvdGhlcndpc2UgLSBmYWlsdXJlCisgKi8KK3N0cnVjdCBLYmRpbnREZXZpY2UKK3sKKwljb25zdCBjaGFyICpuYW1lOworCXZvaWQqCSgqaW5pdF9jdHgpKEF1dGhjdHh0Kik7CisJaW50CSgqcXVlcnkpKHZvaWQgKmN0eCwgY2hhciAqKm5hbWUsIGNoYXIgKippbmZvdHh0LAorCQkgICAgdV9pbnQgKm51bXByb21wdHMsIGNoYXIgKioqcHJvbXB0cywgdV9pbnQgKiplY2hvX29uKTsKKwlpbnQJKCpyZXNwb25kKSh2b2lkICpjdHgsIHVfaW50IG51bXJlc3AsIGNoYXIgKipyZXNwb25zZXMpOworCXZvaWQJKCpmcmVlX2N0eCkodm9pZCAqY3R4KTsKK307CisKK2ludCAgICAgIGF1dGhfcmhvc3RzKHN0cnVjdCBwYXNzd2QgKiwgY29uc3QgY2hhciAqKTsKK2ludAorYXV0aF9yaG9zdHMyKHN0cnVjdCBwYXNzd2QgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisKK2ludAkgYXV0aF9yaG9zdHNfcnNhKEF1dGhjdHh0ICosIGNoYXIgKiwgS2V5ICopOworaW50ICAgICAgYXV0aF9wYXNzd29yZChBdXRoY3R4dCAqLCBjb25zdCBjaGFyICopOworaW50ICAgICAgYXV0aF9yc2EoQXV0aGN0eHQgKiwgQklHTlVNICopOworaW50ICAgICAgYXV0aF9yc2FfY2hhbGxlbmdlX2RpYWxvZyhLZXkgKik7CitCSUdOVU0JKmF1dGhfcnNhX2dlbmVyYXRlX2NoYWxsZW5nZShLZXkgKik7CitpbnQJIGF1dGhfcnNhX3ZlcmlmeV9yZXNwb25zZShLZXkgKiwgQklHTlVNICosIHVfY2hhcltdKTsKK2ludAkgYXV0aF9yc2Ffa2V5X2FsbG93ZWQoc3RydWN0IHBhc3N3ZCAqLCBCSUdOVU0gKiwgS2V5ICoqKTsKKworaW50CSBhdXRoX3Job3N0c19yc2Ffa2V5X2FsbG93ZWQoc3RydWN0IHBhc3N3ZCAqLCBjaGFyICosIGNoYXIgKiwgS2V5ICopOworaW50CSBob3N0YmFzZWRfa2V5X2FsbG93ZWQoc3RydWN0IHBhc3N3ZCAqLCBjb25zdCBjaGFyICosIGNoYXIgKiwgS2V5ICopOworaW50CSB1c2VyX2tleV9hbGxvd2VkKHN0cnVjdCBwYXNzd2QgKiwgS2V5ICopOworCisjaWZkZWYgS1JCNQoraW50CWF1dGhfa3JiNShBdXRoY3R4dCAqYXV0aGN0eHQsIGtyYjVfZGF0YSAqYXV0aCwgY2hhciAqKmNsaWVudCwga3JiNV9kYXRhICopOworaW50CWF1dGhfa3JiNV90Z3QoQXV0aGN0eHQgKmF1dGhjdHh0LCBrcmI1X2RhdGEgKnRndCk7CitpbnQJYXV0aF9rcmI1X3Bhc3N3b3JkKEF1dGhjdHh0ICphdXRoY3R4dCwgY29uc3QgY2hhciAqcGFzc3dvcmQpOwordm9pZAlrcmI1X2NsZWFudXBfcHJvYyhBdXRoY3R4dCAqYXV0aGN0eHQpOworI2VuZGlmIC8qIEtSQjUgKi8KKworI2lmIGRlZmluZWQoVVNFX1NIQURPVykgJiYgZGVmaW5lZChIQVNfU0hBRE9XX0VYUElSRSkKKyNpbmNsdWRlIDxzaGFkb3cuaD4KK2ludCBhdXRoX3NoYWRvd19hY2N0ZXhwaXJlZChzdHJ1Y3Qgc3B3ZCAqKTsKK2ludCBhdXRoX3NoYWRvd19wd2V4cGlyZWQoQXV0aGN0eHQgKik7CisjZW5kaWYKKworI2luY2x1ZGUgImF1dGgtcGFtLmgiCisjaW5jbHVkZSAiYXVkaXQuaCIKK3ZvaWQgcmVtb3ZlX2tiZGludF9kZXZpY2UoY29uc3QgY2hhciAqKTsKKwordm9pZCBkaXNhYmxlX2ZvcndhcmRpbmcodm9pZCk7CisKK3ZvaWQJZG9fYXV0aGVudGljYXRpb24oQXV0aGN0eHQgKik7Cit2b2lkCWRvX2F1dGhlbnRpY2F0aW9uMihBdXRoY3R4dCAqKTsKKwordm9pZAlhdXRoX2xvZyhBdXRoY3R4dCAqLCBpbnQsIGNoYXIgKiwgY2hhciAqKTsKK3ZvaWQJdXNlcmF1dGhfZmluaXNoKEF1dGhjdHh0ICosIGludCwgY2hhciAqKTsKK3ZvaWQJdXNlcmF1dGhfc2VuZF9iYW5uZXIoY29uc3QgY2hhciAqKTsKK2ludAlhdXRoX3Jvb3RfYWxsb3dlZChjaGFyICopOworCitjaGFyCSphdXRoMl9yZWFkX2Jhbm5lcih2b2lkKTsKKwordm9pZAlwcml2c2VwX2NoYWxsZW5nZV9lbmFibGUodm9pZCk7CisKK2ludAlhdXRoMl9jaGFsbGVuZ2UoQXV0aGN0eHQgKiwgY2hhciAqKTsKK3ZvaWQJYXV0aDJfY2hhbGxlbmdlX3N0b3AoQXV0aGN0eHQgKik7CitpbnQJYnNkYXV0aF9xdWVyeSh2b2lkICosIGNoYXIgKiosIGNoYXIgKiosIHVfaW50ICosIGNoYXIgKioqLCB1X2ludCAqKik7CitpbnQJYnNkYXV0aF9yZXNwb25kKHZvaWQgKiwgdV9pbnQsIGNoYXIgKiopOworaW50CXNrZXlfcXVlcnkodm9pZCAqLCBjaGFyICoqLCBjaGFyICoqLCB1X2ludCAqLCBjaGFyICoqKiwgdV9pbnQgKiopOworaW50CXNrZXlfcmVzcG9uZCh2b2lkICosIHVfaW50LCBjaGFyICoqKTsKKwordm9pZAlhdXRoMl9qcGFrZV9nZXRfcHdkYXRhKEF1dGhjdHh0ICosIEJJR05VTSAqKiwgY2hhciAqKiwgY2hhciAqKik7Cit2b2lkCWF1dGgyX2pwYWtlX3N0b3AoQXV0aGN0eHQgKik7CisKK2ludAlhbGxvd2VkX3VzZXIoc3RydWN0IHBhc3N3ZCAqKTsKK3N0cnVjdCBwYXNzd2QgKiBnZXRwd25hbWFsbG93KGNvbnN0IGNoYXIgKnVzZXIpOworCitjaGFyCSpnZXRfY2hhbGxlbmdlKEF1dGhjdHh0ICopOworaW50CXZlcmlmeV9yZXNwb25zZShBdXRoY3R4dCAqLCBjb25zdCBjaGFyICopOwordm9pZAlhYmFuZG9uX2NoYWxsZW5nZV9yZXNwb25zZShBdXRoY3R4dCAqKTsKKworY2hhcgkqZXhwYW5kX2F1dGhvcml6ZWRfa2V5cyhjb25zdCBjaGFyICosIHN0cnVjdCBwYXNzd2QgKnB3KTsKK2NoYXIJKmF1dGhvcml6ZWRfcHJpbmNpcGFsc19maWxlKHN0cnVjdCBwYXNzd2QgKik7CisKK0ZJTEUJKmF1dGhfb3BlbmtleWZpbGUoY29uc3QgY2hhciAqLCBzdHJ1Y3QgcGFzc3dkICosIGludCk7CitGSUxFCSphdXRoX29wZW5wcmluY2lwYWxzKGNvbnN0IGNoYXIgKiwgc3RydWN0IHBhc3N3ZCAqLCBpbnQpOworaW50CSBhdXRoX2tleV9pc19yZXZva2VkKEtleSAqKTsKKworSG9zdFN0YXR1cworY2hlY2tfa2V5X2luX2hvc3RmaWxlcyhzdHJ1Y3QgcGFzc3dkICosIEtleSAqLCBjb25zdCBjaGFyICosCisgICAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCisvKiBob3N0a2V5IGhhbmRsaW5nICovCitLZXkJKmdldF9ob3N0a2V5X2J5X2luZGV4KGludCk7CitLZXkJKmdldF9ob3N0a2V5X3B1YmxpY19ieV90eXBlKGludCk7CitLZXkJKmdldF9ob3N0a2V5X3ByaXZhdGVfYnlfdHlwZShpbnQpOworaW50CSBnZXRfaG9zdGtleV9pbmRleChLZXkgKik7CitpbnQJIHNzaDFfc2Vzc2lvbl9rZXkoQklHTlVNICopOworCisvKiBkZWJ1ZyBtZXNzYWdlcyBkdXJpbmcgYXV0aGVudGljYXRpb24gKi8KK3ZvaWQJIGF1dGhfZGVidWdfYWRkKGNvbnN0IGNoYXIgKmZtdCwuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDEsIDIpKSk7Cit2b2lkCSBhdXRoX2RlYnVnX3NlbmQodm9pZCk7Cit2b2lkCSBhdXRoX2RlYnVnX3Jlc2V0KHZvaWQpOworCitzdHJ1Y3QgcGFzc3dkICpmYWtlcHcodm9pZCk7CisKK2ludAkgc3lzX2F1dGhfcGFzc3dkKEF1dGhjdHh0ICosIGNvbnN0IGNoYXIgKik7CisKKyNkZWZpbmUgQVVUSF9GQUlMX01TRyAiVG9vIG1hbnkgYXV0aGVudGljYXRpb24gZmFpbHVyZXMgZm9yICUuMTAwcyIKKworI2RlZmluZSBTS0VZX1BST01QVCAiXG5TL0tleSBQYXNzd29yZDogIgorCisjaWYgZGVmaW5lZChLUkI1KSAmJiAhZGVmaW5lZChIRUlNREFMKQorI2luY2x1ZGUgPGtyYjUuaD4KK2tyYjVfZXJyb3JfY29kZSBzc2hfa3JiNV9jY19nZW4oa3JiNV9jb250ZXh0LCBrcmI1X2NjYWNoZSAqKTsKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2F1dGgxLmMgYi9vcGVuc3NoLTYuMHAxL2F1dGgxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M4NWFlYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvYXV0aDEuYwpAQCAtMCwwICsxLDQzNyBAQAorLyogJE9wZW5CU0Q6IGF1dGgxLmMsdiAxLjc1IDIwMTAvMDgvMzEgMDk6NTg6MzcgZGptIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKworI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L3N5cy1xdWV1ZS5oIgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJyc2EuaCIKKyNpbmNsdWRlICJzc2gxLmgiCisjaW5jbHVkZSAicGFja2V0LmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAic2VydmNvbmYuaCIKKyNpbmNsdWRlICJjb21wYXQuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJob3N0ZmlsZS5oIgorI2luY2x1ZGUgImF1dGguaCIKKyNpbmNsdWRlICJjaGFubmVscy5oIgorI2luY2x1ZGUgInNlc3Npb24uaCIKKyNpbmNsdWRlICJ1aWRzd2FwLmgiCisjaWZkZWYgR1NTQVBJCisjaW5jbHVkZSAic3NoLWdzcy5oIgorI2VuZGlmCisjaW5jbHVkZSAibW9uaXRvcl93cmFwLmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisKKy8qIGltcG9ydCAqLworZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKK2V4dGVybiBCdWZmZXIgbG9naW5tc2c7CisKK3N0YXRpYyBpbnQgYXV0aDFfcHJvY2Vzc19wYXNzd29yZChBdXRoY3R4dCAqLCBjaGFyICosIHNpemVfdCk7CitzdGF0aWMgaW50IGF1dGgxX3Byb2Nlc3NfcnNhKEF1dGhjdHh0ICosIGNoYXIgKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgYXV0aDFfcHJvY2Vzc19yaG9zdHNfcnNhKEF1dGhjdHh0ICosIGNoYXIgKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgYXV0aDFfcHJvY2Vzc190aXNfY2hhbGxlbmdlKEF1dGhjdHh0ICosIGNoYXIgKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgYXV0aDFfcHJvY2Vzc190aXNfcmVzcG9uc2UoQXV0aGN0eHQgKiwgY2hhciAqLCBzaXplX3QpOworCitzdGF0aWMgY2hhciAqY2xpZW50X3VzZXIgPSBOVUxMOyAgICAvKiBVc2VkIHRvIGZpbGwgaW4gcmVtb3RlIHVzZXIgZm9yIFBBTSAqLworCitzdHJ1Y3QgQXV0aE1ldGhvZDEgeworCWludCB0eXBlOworCWNoYXIgKm5hbWU7CisJaW50ICplbmFibGVkOworCWludCAoKm1ldGhvZCkoQXV0aGN0eHQgKiwgY2hhciAqLCBzaXplX3QpOworfTsKKworY29uc3Qgc3RydWN0IEF1dGhNZXRob2QxIGF1dGgxX21ldGhvZHNbXSA9IHsKKwl7CisJCVNTSF9DTVNHX0FVVEhfUEFTU1dPUkQsICJwYXNzd29yZCIsCisJCSZvcHRpb25zLnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uLCBhdXRoMV9wcm9jZXNzX3Bhc3N3b3JkCisJfSwKKwl7CisJCVNTSF9DTVNHX0FVVEhfUlNBLCAicnNhIiwKKwkJJm9wdGlvbnMucnNhX2F1dGhlbnRpY2F0aW9uLCBhdXRoMV9wcm9jZXNzX3JzYQorCX0sCisJeworCQlTU0hfQ01TR19BVVRIX1JIT1NUU19SU0EsICJyaG9zdHMtcnNhIiwKKwkJJm9wdGlvbnMucmhvc3RzX3JzYV9hdXRoZW50aWNhdGlvbiwgYXV0aDFfcHJvY2Vzc19yaG9zdHNfcnNhCisJfSwKKwl7CisJCVNTSF9DTVNHX0FVVEhfVElTLCAiY2hhbGxlbmdlLXJlc3BvbnNlIiwKKwkJJm9wdGlvbnMuY2hhbGxlbmdlX3Jlc3BvbnNlX2F1dGhlbnRpY2F0aW9uLAorCQlhdXRoMV9wcm9jZXNzX3Rpc19jaGFsbGVuZ2UKKwl9LAorCXsKKwkJU1NIX0NNU0dfQVVUSF9USVNfUkVTUE9OU0UsICJjaGFsbGVuZ2UtcmVzcG9uc2UiLAorCQkmb3B0aW9ucy5jaGFsbGVuZ2VfcmVzcG9uc2VfYXV0aGVudGljYXRpb24sCisJCWF1dGgxX3Byb2Nlc3NfdGlzX3Jlc3BvbnNlCisJfSwKKwl7IC0xLCBOVUxMLCBOVUxMLCBOVUxMfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBBdXRoTWV0aG9kMQorKmxvb2t1cF9hdXRobWV0aG9kMShpbnQgdHlwZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGF1dGgxX21ldGhvZHNbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisJCWlmIChhdXRoMV9tZXRob2RzW2ldLnR5cGUgPT0gdHlwZSkKKwkJCXJldHVybiAoJihhdXRoMV9tZXRob2RzW2ldKSk7CisKKwlyZXR1cm4gKE5VTEwpOworfQorCitzdGF0aWMgY2hhciAqCitnZXRfYXV0aG5hbWUoaW50IHR5cGUpCit7CisJY29uc3Qgc3RydWN0IEF1dGhNZXRob2QxICphOworCXN0YXRpYyBjaGFyIGJ1Zls2NF07CisKKwlpZiAoKGEgPSBsb29rdXBfYXV0aG1ldGhvZDEodHlwZSkpICE9IE5VTEwpCisJCXJldHVybiAoYS0+bmFtZSk7CisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgImJhZC1hdXRoLW1zZy0lZCIsIHR5cGUpOworCXJldHVybiAoYnVmKTsKK30KKworLypBUkdTVVNFRCovCitzdGF0aWMgaW50CithdXRoMV9wcm9jZXNzX3Bhc3N3b3JkKEF1dGhjdHh0ICphdXRoY3R4dCwgY2hhciAqaW5mbywgc2l6ZV90IGluZm9sZW4pCit7CisJaW50IGF1dGhlbnRpY2F0ZWQgPSAwOworCWNoYXIgKnBhc3N3b3JkOworCXVfaW50IGRsZW47CisKKwkvKgorCSAqIFJlYWQgdXNlciBwYXNzd29yZC4gIEl0IGlzIGluIHBsYWluIHRleHQsIGJ1dCB3YXMKKwkgKiB0cmFuc21pdHRlZCBvdmVyIHRoZSBlbmNyeXB0ZWQgY2hhbm5lbCBzbyBpdCBpcworCSAqIG5vdCB2aXNpYmxlIHRvIGFuIG91dHNpZGUgb2JzZXJ2ZXIuCisJICovCisJcGFzc3dvcmQgPSBwYWNrZXRfZ2V0X3N0cmluZygmZGxlbik7CisJcGFja2V0X2NoZWNrX2VvbSgpOworCisJLyogVHJ5IGF1dGhlbnRpY2F0aW9uIHdpdGggdGhlIHBhc3N3b3JkLiAqLworCWF1dGhlbnRpY2F0ZWQgPSBQUklWU0VQKGF1dGhfcGFzc3dvcmQoYXV0aGN0eHQsIHBhc3N3b3JkKSk7CisKKwltZW1zZXQocGFzc3dvcmQsIDAsIGRsZW4pOworCXhmcmVlKHBhc3N3b3JkKTsKKworCXJldHVybiAoYXV0aGVudGljYXRlZCk7Cit9CisKKy8qQVJHU1VTRUQqLworc3RhdGljIGludAorYXV0aDFfcHJvY2Vzc19yc2EoQXV0aGN0eHQgKmF1dGhjdHh0LCBjaGFyICppbmZvLCBzaXplX3QgaW5mb2xlbikKK3sKKwlpbnQgYXV0aGVudGljYXRlZCA9IDA7CisJQklHTlVNICpuOworCisJLyogUlNBIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3RlZC4gKi8KKwlpZiAoKG4gPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoImRvX2F1dGhsb29wOiBCTl9uZXcgZmFpbGVkIik7CisJcGFja2V0X2dldF9iaWdudW0obik7CisJcGFja2V0X2NoZWNrX2VvbSgpOworCWF1dGhlbnRpY2F0ZWQgPSBhdXRoX3JzYShhdXRoY3R4dCwgbik7CisJQk5fY2xlYXJfZnJlZShuKTsKKworCXJldHVybiAoYXV0aGVudGljYXRlZCk7Cit9CisKKy8qQVJHU1VTRUQqLworc3RhdGljIGludAorYXV0aDFfcHJvY2Vzc19yaG9zdHNfcnNhKEF1dGhjdHh0ICphdXRoY3R4dCwgY2hhciAqaW5mbywgc2l6ZV90IGluZm9sZW4pCit7CisJaW50IGtleWJpdHMsIGF1dGhlbnRpY2F0ZWQgPSAwOworCXVfaW50IGJpdHM7CisJS2V5ICpjbGllbnRfaG9zdF9rZXk7CisJdV9pbnQgdWxlbjsKKworCS8qCisJICogR2V0IGNsaWVudCB1c2VyIG5hbWUuICBOb3RlIHRoYXQgd2UganVzdCBoYXZlIHRvCisJICogdHJ1c3QgdGhlIGNsaWVudDsgcm9vdCBvbiB0aGUgY2xpZW50IG1hY2hpbmUgY2FuCisJICogY2xhaW0gdG8gYmUgYW55IHVzZXIuCisJICovCisJY2xpZW50X3VzZXIgPSBwYWNrZXRfZ2V0X2NzdHJpbmcoJnVsZW4pOworCisJLyogR2V0IHRoZSBjbGllbnQgaG9zdCBrZXkuICovCisJY2xpZW50X2hvc3Rfa2V5ID0ga2V5X25ldyhLRVlfUlNBMSk7CisJYml0cyA9IHBhY2tldF9nZXRfaW50KCk7CisJcGFja2V0X2dldF9iaWdudW0oY2xpZW50X2hvc3Rfa2V5LT5yc2EtPmUpOworCXBhY2tldF9nZXRfYmlnbnVtKGNsaWVudF9ob3N0X2tleS0+cnNhLT5uKTsKKworCWtleWJpdHMgPSBCTl9udW1fYml0cyhjbGllbnRfaG9zdF9rZXktPnJzYS0+bik7CisJaWYgKGtleWJpdHMgPCAwIHx8IGJpdHMgIT0gKHVfaW50KWtleWJpdHMpIHsKKwkJdmVyYm9zZSgiV2FybmluZzoga2V5c2l6ZSBtaXNtYXRjaCBmb3IgY2xpZW50X2hvc3Rfa2V5OiAiCisJCSAgICAiYWN0dWFsICVkLCBhbm5vdW5jZWQgJWQiLAorCQkgICAgQk5fbnVtX2JpdHMoY2xpZW50X2hvc3Rfa2V5LT5yc2EtPm4pLCBiaXRzKTsKKwl9CisJcGFja2V0X2NoZWNrX2VvbSgpOworCisJYXV0aGVudGljYXRlZCA9IGF1dGhfcmhvc3RzX3JzYShhdXRoY3R4dCwgY2xpZW50X3VzZXIsCisJICAgIGNsaWVudF9ob3N0X2tleSk7CisJa2V5X2ZyZWUoY2xpZW50X2hvc3Rfa2V5KTsKKworCXNucHJpbnRmKGluZm8sIGluZm9sZW4sICIgcnVzZXIgJS4xMDBzIiwgY2xpZW50X3VzZXIpOworCisJcmV0dXJuIChhdXRoZW50aWNhdGVkKTsKK30KKworLypBUkdTVVNFRCovCitzdGF0aWMgaW50CithdXRoMV9wcm9jZXNzX3Rpc19jaGFsbGVuZ2UoQXV0aGN0eHQgKmF1dGhjdHh0LCBjaGFyICppbmZvLCBzaXplX3QgaW5mb2xlbikKK3sKKwljaGFyICpjaGFsbGVuZ2U7CisKKwlpZiAoKGNoYWxsZW5nZSA9IGdldF9jaGFsbGVuZ2UoYXV0aGN0eHQpKSA9PSBOVUxMKQorCQlyZXR1cm4gKDApOworCisJZGVidWcoInNlbmRpbmcgY2hhbGxlbmdlICclcyciLCBjaGFsbGVuZ2UpOworCXBhY2tldF9zdGFydChTU0hfU01TR19BVVRIX1RJU19DSEFMTEVOR0UpOworCXBhY2tldF9wdXRfY3N0cmluZyhjaGFsbGVuZ2UpOworCXhmcmVlKGNoYWxsZW5nZSk7CisJcGFja2V0X3NlbmQoKTsKKwlwYWNrZXRfd3JpdGVfd2FpdCgpOworCisJcmV0dXJuICgtMSk7Cit9CisKKy8qQVJHU1VTRUQqLworc3RhdGljIGludAorYXV0aDFfcHJvY2Vzc190aXNfcmVzcG9uc2UoQXV0aGN0eHQgKmF1dGhjdHh0LCBjaGFyICppbmZvLCBzaXplX3QgaW5mb2xlbikKK3sKKwlpbnQgYXV0aGVudGljYXRlZCA9IDA7CisJY2hhciAqcmVzcG9uc2U7CisJdV9pbnQgZGxlbjsKKworCXJlc3BvbnNlID0gcGFja2V0X2dldF9zdHJpbmcoJmRsZW4pOworCXBhY2tldF9jaGVja19lb20oKTsKKwlhdXRoZW50aWNhdGVkID0gdmVyaWZ5X3Jlc3BvbnNlKGF1dGhjdHh0LCByZXNwb25zZSk7CisJbWVtc2V0KHJlc3BvbnNlLCAncicsIGRsZW4pOworCXhmcmVlKHJlc3BvbnNlKTsKKworCXJldHVybiAoYXV0aGVudGljYXRlZCk7Cit9CisKKy8qCisgKiByZWFkIHBhY2tldHMsIHRyeSB0byBhdXRoZW50aWNhdGUgdGhlIHVzZXIgYW5kCisgKiByZXR1cm4gb25seSBpZiBhdXRoZW50aWNhdGlvbiBpcyBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyB2b2lkCitkb19hdXRobG9vcChBdXRoY3R4dCAqYXV0aGN0eHQpCit7CisJaW50IGF1dGhlbnRpY2F0ZWQgPSAwOworCWNoYXIgaW5mb1sxMDI0XTsKKwlpbnQgcHJldiA9IDAsIHR5cGUgPSAwOworCWNvbnN0IHN0cnVjdCBBdXRoTWV0aG9kMSAqbWV0aDsKKworCWRlYnVnKCJBdHRlbXB0aW5nIGF1dGhlbnRpY2F0aW9uIGZvciAlcyUuMTAwcy4iLAorCSAgICBhdXRoY3R4dC0+dmFsaWQgPyAiIiA6ICJpbnZhbGlkIHVzZXIgIiwgYXV0aGN0eHQtPnVzZXIpOworCisJLyogSWYgdGhlIHVzZXIgaGFzIG5vIHBhc3N3b3JkLCBhY2NlcHQgYXV0aGVudGljYXRpb24gaW1tZWRpYXRlbHkuICovCisJaWYgKG9wdGlvbnMucGVybWl0X2VtcHR5X3Bhc3N3ZCAmJiBvcHRpb25zLnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uICYmCisjaWZkZWYgS1JCNQorCSAgICAoIW9wdGlvbnMua2VyYmVyb3NfYXV0aGVudGljYXRpb24gfHwgb3B0aW9ucy5rZXJiZXJvc19vcl9sb2NhbF9wYXNzd2QpICYmCisjZW5kaWYKKwkgICAgUFJJVlNFUChhdXRoX3Bhc3N3b3JkKGF1dGhjdHh0LCAiIikpKSB7CisjaWZkZWYgVVNFX1BBTQorCQlpZiAob3B0aW9ucy51c2VfcGFtICYmIChQUklWU0VQKGRvX3BhbV9hY2NvdW50KCkpKSkKKyNlbmRpZgorCQl7CisJCQlhdXRoX2xvZyhhdXRoY3R4dCwgMSwgIndpdGhvdXQgYXV0aGVudGljYXRpb24iLCAiIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBJbmRpY2F0ZSB0aGF0IGF1dGhlbnRpY2F0aW9uIGlzIG5lZWRlZC4gKi8KKwlwYWNrZXRfc3RhcnQoU1NIX1NNU0dfRkFJTFVSRSk7CisJcGFja2V0X3NlbmQoKTsKKwlwYWNrZXRfd3JpdGVfd2FpdCgpOworCisJZm9yICg7OykgeworCQkvKiBkZWZhdWx0IHRvIGZhaWwgKi8KKwkJYXV0aGVudGljYXRlZCA9IDA7CisKKwkJaW5mb1swXSA9ICdcMCc7CisKKwkJLyogR2V0IGEgcGFja2V0IGZyb20gdGhlIGNsaWVudC4gKi8KKwkJcHJldiA9IHR5cGU7CisJCXR5cGUgPSBwYWNrZXRfcmVhZCgpOworCisJCS8qCisJCSAqIElmIHdlIHN0YXJ0ZWQgY2hhbGxlbmdlLXJlc3BvbnNlIGF1dGhlbnRpY2F0aW9uIGJ1dCB0aGUKKwkJICogbmV4dCBwYWNrZXQgaXMgbm90IGEgcmVzcG9uc2UgdG8gb3VyIGNoYWxsZW5nZSwgcmVsZWFzZQorCQkgKiB0aGUgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSBnZXRfY2hhbGxlbmdlKCkgKHdoaWNoIHdvdWxkCisJCSAqIG5vcm1hbGx5IGhhdmUgYmVlbiByZWxlYXNlZCBieSB2ZXJpZnlfcmVzcG9uc2UoKSBoYWQgd2UKKwkJICogcmVjZWl2ZWQgc3VjaCBhIHJlc3BvbnNlKQorCQkgKi8KKwkJaWYgKHByZXYgPT0gU1NIX0NNU0dfQVVUSF9USVMgJiYKKwkJICAgIHR5cGUgIT0gU1NIX0NNU0dfQVVUSF9USVNfUkVTUE9OU0UpCisJCQlhYmFuZG9uX2NoYWxsZW5nZV9yZXNwb25zZShhdXRoY3R4dCk7CisKKwkJaWYgKGF1dGhjdHh0LT5mYWlsdXJlcyA+PSBvcHRpb25zLm1heF9hdXRodHJpZXMpCisJCQlnb3RvIHNraXA7CisJCWlmICgobWV0aCA9IGxvb2t1cF9hdXRobWV0aG9kMSh0eXBlKSkgPT0gTlVMTCkgeworCQkJbG9naXQoIlVua25vd24gbWVzc2FnZSBkdXJpbmcgYXV0aGVudGljYXRpb246ICIKKwkJCSAgICAidHlwZSAlZCIsIHR5cGUpOworCQkJZ290byBza2lwOworCQl9CisKKwkJaWYgKCEqKG1ldGgtPmVuYWJsZWQpKSB7CisJCQl2ZXJib3NlKCIlcyBhdXRoZW50aWNhdGlvbiBkaXNhYmxlZC4iLCBtZXRoLT5uYW1lKTsKKwkJCWdvdG8gc2tpcDsKKwkJfQorCisJCWF1dGhlbnRpY2F0ZWQgPSBtZXRoLT5tZXRob2QoYXV0aGN0eHQsIGluZm8sIHNpemVvZihpbmZvKSk7CisJCWlmIChhdXRoZW50aWNhdGVkID09IC0xKQorCQkJY29udGludWU7IC8qICJwb3N0cG9uZWQiICovCisKKyNpZmRlZiBCU0RfQVVUSAorCQlpZiAoYXV0aGN0eHQtPmFzKSB7CisJCQlhdXRoX2Nsb3NlKGF1dGhjdHh0LT5hcyk7CisJCQlhdXRoY3R4dC0+YXMgPSBOVUxMOworCQl9CisjZW5kaWYKKwkJaWYgKCFhdXRoY3R4dC0+dmFsaWQgJiYgYXV0aGVudGljYXRlZCkKKwkJCWZhdGFsKCJJTlRFUk5BTCBFUlJPUjogYXV0aGVudGljYXRlZCBpbnZhbGlkIHVzZXIgJXMiLAorCQkJICAgIGF1dGhjdHh0LT51c2VyKTsKKworI2lmZGVmIF9VTklDT1MKKwkJaWYgKGF1dGhlbnRpY2F0ZWQgJiYgY3JheV9hY2Nlc3NfZGVuaWVkKGF1dGhjdHh0LT51c2VyKSkgeworCQkJYXV0aGVudGljYXRlZCA9IDA7CisJCQlmYXRhbCgiQWNjZXNzIGRlbmllZCBmb3IgdXNlciAlcy4iLGF1dGhjdHh0LT51c2VyKTsKKwkJfQorI2VuZGlmIC8qIF9VTklDT1MgKi8KKworI2lmbmRlZiBIQVZFX0NZR1dJTgorCQkvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciByb290ICovCisJCWlmIChhdXRoZW50aWNhdGVkICYmIGF1dGhjdHh0LT5wdy0+cHdfdWlkID09IDAgJiYKKwkJICAgICFhdXRoX3Jvb3RfYWxsb3dlZChtZXRoLT5uYW1lKSkgeworIAkJCWF1dGhlbnRpY2F0ZWQgPSAwOworIyBpZmRlZiBTU0hfQVVESVRfRVZFTlRTCisJCQlQUklWU0VQKGF1ZGl0X2V2ZW50KFNTSF9MT0dJTl9ST09UX0RFTklFRCkpOworIyBlbmRpZgorCQl9CisjZW5kaWYKKworI2lmZGVmIFVTRV9QQU0KKwkJaWYgKG9wdGlvbnMudXNlX3BhbSAmJiBhdXRoZW50aWNhdGVkICYmCisJCSAgICAhUFJJVlNFUChkb19wYW1fYWNjb3VudCgpKSkgeworCQkJY2hhciAqbXNnOworCQkJc2l6ZV90IGxlbjsKKworCQkJZXJyb3IoIkFjY2VzcyBkZW5pZWQgZm9yIHVzZXIgJXMgYnkgUEFNIGFjY291bnQgIgorCQkJICAgICJjb25maWd1cmF0aW9uIiwgYXV0aGN0eHQtPnVzZXIpOworCQkJbGVuID0gYnVmZmVyX2xlbigmbG9naW5tc2cpOworCQkJYnVmZmVyX2FwcGVuZCgmbG9naW5tc2csICJcMCIsIDEpOworCQkJbXNnID0gYnVmZmVyX3B0cigmbG9naW5tc2cpOworCQkJLyogc3RyaXAgdHJhaWxpbmcgbmV3bGluZXMgKi8KKwkJCWlmIChsZW4gPiAwKQorCQkJCXdoaWxlIChsZW4gPiAwICYmIG1zZ1stLWxlbl0gPT0gJ1xuJykKKwkJCQkJbXNnW2xlbl0gPSAnXDAnOworCQkJZWxzZQorCQkJCW1zZyA9ICJBY2Nlc3MgZGVuaWVkLiI7CisJCQlwYWNrZXRfZGlzY29ubmVjdCgiJXMiLCBtc2cpOworCQl9CisjZW5kaWYKKworIHNraXA6CisJCS8qIExvZyBiZWZvcmUgc2VuZGluZyB0aGUgcmVwbHkgKi8KKwkJYXV0aF9sb2coYXV0aGN0eHQsIGF1dGhlbnRpY2F0ZWQsIGdldF9hdXRobmFtZSh0eXBlKSwgaW5mbyk7CisKKwkJaWYgKGNsaWVudF91c2VyICE9IE5VTEwpIHsKKwkJCXhmcmVlKGNsaWVudF91c2VyKTsKKwkJCWNsaWVudF91c2VyID0gTlVMTDsKKwkJfQorCisJCWlmIChhdXRoZW50aWNhdGVkKQorCQkJcmV0dXJuOworCisJCWlmICgrK2F1dGhjdHh0LT5mYWlsdXJlcyA+PSBvcHRpb25zLm1heF9hdXRodHJpZXMpIHsKKyNpZmRlZiBTU0hfQVVESVRfRVZFTlRTCisJCQlQUklWU0VQKGF1ZGl0X2V2ZW50KFNTSF9MT0dJTl9FWENFRURfTUFYVFJJRVMpKTsKKyNlbmRpZgorCQkJcGFja2V0X2Rpc2Nvbm5lY3QoQVVUSF9GQUlMX01TRywgYXV0aGN0eHQtPnVzZXIpOworCQl9CisKKwkJcGFja2V0X3N0YXJ0KFNTSF9TTVNHX0ZBSUxVUkUpOworCQlwYWNrZXRfc2VuZCgpOworCQlwYWNrZXRfd3JpdGVfd2FpdCgpOworCX0KK30KKworLyoKKyAqIFBlcmZvcm1zIGF1dGhlbnRpY2F0aW9uIG9mIGFuIGluY29taW5nIGNvbm5lY3Rpb24uICBTZXNzaW9uIGtleSBoYXMgYWxyZWFkeQorICogYmVlbiBleGNoYW5nZWQgYW5kIGVuY3J5cHRpb24gaXMgZW5hYmxlZC4KKyAqLwordm9pZAorZG9fYXV0aGVudGljYXRpb24oQXV0aGN0eHQgKmF1dGhjdHh0KQoreworCXVfaW50IHVsZW47CisJY2hhciAqdXNlciwgKnN0eWxlID0gTlVMTDsKKworCS8qIEdldCB0aGUgbmFtZSBvZiB0aGUgdXNlciB0aGF0IHdlIHdpc2ggdG8gbG9nIGluIGFzLiAqLworCXBhY2tldF9yZWFkX2V4cGVjdChTU0hfQ01TR19VU0VSKTsKKworCS8qIEdldCB0aGUgdXNlciBuYW1lLiAqLworCXVzZXIgPSBwYWNrZXRfZ2V0X2NzdHJpbmcoJnVsZW4pOworCXBhY2tldF9jaGVja19lb20oKTsKKworCWlmICgoc3R5bGUgPSBzdHJjaHIodXNlciwgJzonKSkgIT0gTlVMTCkKKwkJKnN0eWxlKysgPSAnXDAnOworCisJYXV0aGN0eHQtPnVzZXIgPSB1c2VyOworCWF1dGhjdHh0LT5zdHlsZSA9IHN0eWxlOworCisJLyogVmVyaWZ5IHRoYXQgdGhlIHVzZXIgaXMgYSB2YWxpZCB1c2VyLiAqLworCWlmICgoYXV0aGN0eHQtPnB3ID0gUFJJVlNFUChnZXRwd25hbWFsbG93KHVzZXIpKSkgIT0gTlVMTCkKKwkJYXV0aGN0eHQtPnZhbGlkID0gMTsKKwllbHNlIHsKKwkJZGVidWcoImRvX2F1dGhlbnRpY2F0aW9uOiBpbnZhbGlkIHVzZXIgJXMiLCB1c2VyKTsKKwkJYXV0aGN0eHQtPnB3ID0gZmFrZXB3KCk7CisJfQorCisJc2V0cHJvY3RpdGxlKCIlcyVzIiwgYXV0aGN0eHQtPnZhbGlkID8gdXNlciA6ICJ1bmtub3duIiwKKwkgICAgdXNlX3ByaXZzZXAgPyAiIFtuZXRdIiA6ICIiKTsKKworI2lmZGVmIFVTRV9QQU0KKwlpZiAob3B0aW9ucy51c2VfcGFtKQorCQlQUklWU0VQKHN0YXJ0X3BhbShhdXRoY3R4dCkpOworI2VuZGlmCisKKwkvKgorCSAqIElmIHdlIGFyZSBub3QgcnVubmluZyBhcyByb290LCB0aGUgdXNlciBtdXN0IGhhdmUgdGhlIHNhbWUgdWlkIGFzCisJICogdGhlIHNlcnZlci4KKwkgKi8KKyNpZm5kZWYgSEFWRV9DWUdXSU4KKwlpZiAoIXVzZV9wcml2c2VwICYmIGdldHVpZCgpICE9IDAgJiYgYXV0aGN0eHQtPnB3ICYmCisJICAgIGF1dGhjdHh0LT5wdy0+cHdfdWlkICE9IGdldHVpZCgpKQorCQlwYWNrZXRfZGlzY29ubmVjdCgiQ2Fubm90IGNoYW5nZSB1c2VyIHdoZW4gc2VydmVyIG5vdCBydW5uaW5nIGFzIHJvb3QuIik7CisjZW5kaWYKKworCS8qCisJICogTG9vcCB1bnRpbCB0aGUgdXNlciBoYXMgYmVlbiBhdXRoZW50aWNhdGVkIG9yIHRoZSBjb25uZWN0aW9uIGlzCisJICogY2xvc2VkLCBkb19hdXRobG9vcCgpIHJldHVybnMgb25seSBpZiBhdXRoZW50aWNhdGlvbiBpcyBzdWNjZXNzZnVsCisJICovCisJZG9fYXV0aGxvb3AoYXV0aGN0eHQpOworCisJLyogVGhlIHVzZXIgaGFzIGJlZW4gYXV0aGVudGljYXRlZCBhbmQgYWNjZXB0ZWQuICovCisJcGFja2V0X3N0YXJ0KFNTSF9TTVNHX1NVQ0NFU1MpOworCXBhY2tldF9zZW5kKCk7CisJcGFja2V0X3dyaXRlX3dhaXQoKTsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvYXV0aDItY2hhbGwuYyBiL29wZW5zc2gtNi4wcDEvYXV0aDItY2hhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmRiZmZlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9hdXRoMi1jaGFsbC5jCkBAIC0wLDAgKzEsMzc0IEBACisvKiAkT3BlbkJTRDogYXV0aDItY2hhbGwuYyx2IDEuMzQgMjAwOC8xMi8wOSAwNDozMjoyMiBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgUGVyIEFsbGFuc3Nvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgInNzaDIuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJob3N0ZmlsZS5oIgorI2luY2x1ZGUgImF1dGguaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJwYWNrZXQuaCIKKyNpbmNsdWRlICJkaXNwYXRjaC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInNlcnZjb25mLmgiCisKKy8qIGltcG9ydCAqLworZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKKworc3RhdGljIGludCBhdXRoMl9jaGFsbGVuZ2Vfc3RhcnQoQXV0aGN0eHQgKik7CitzdGF0aWMgaW50IHNlbmRfdXNlcmF1dGhfaW5mb19yZXF1ZXN0KEF1dGhjdHh0ICopOworc3RhdGljIHZvaWQgaW5wdXRfdXNlcmF1dGhfaW5mb19yZXNwb25zZShpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKKworI2lmZGVmIEJTRF9BVVRICitleHRlcm4gS2JkaW50RGV2aWNlIGJzZGF1dGhfZGV2aWNlOworI2Vsc2UKKyNpZmRlZiBVU0VfUEFNCitleHRlcm4gS2JkaW50RGV2aWNlIHNzaHBhbV9kZXZpY2U7CisjZW5kaWYKKyNpZmRlZiBTS0VZCitleHRlcm4gS2JkaW50RGV2aWNlIHNrZXlfZGV2aWNlOworI2VuZGlmCisjZW5kaWYKKworS2JkaW50RGV2aWNlICpkZXZpY2VzW10gPSB7CisjaWZkZWYgQlNEX0FVVEgKKwkmYnNkYXV0aF9kZXZpY2UsCisjZWxzZQorI2lmZGVmIFVTRV9QQU0KKwkmc3NocGFtX2RldmljZSwKKyNlbmRpZgorI2lmZGVmIFNLRVkKKwkmc2tleV9kZXZpY2UsCisjZW5kaWYKKyNlbmRpZgorCU5VTEwKK307CisKK3R5cGVkZWYgc3RydWN0IEtiZGludEF1dGhjdHh0IEtiZGludEF1dGhjdHh0Oworc3RydWN0IEtiZGludEF1dGhjdHh0Cit7CisJY2hhciAqZGV2aWNlczsKKwl2b2lkICpjdHh0OworCUtiZGludERldmljZSAqZGV2aWNlOworCXVfaW50IG5yZXE7Cit9OworCisjaWZkZWYgVVNFX1BBTQordm9pZAorcmVtb3ZlX2tiZGludF9kZXZpY2UoY29uc3QgY2hhciAqZGV2bmFtZSkKK3sKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDA7IGRldmljZXNbaV0gIT0gTlVMTDsgaSsrKQorCQlpZiAoc3RyY21wKGRldmljZXNbaV0tPm5hbWUsIGRldm5hbWUpID09IDApIHsKKwkJCWZvciAoaiA9IGk7IGRldmljZXNbal0gIT0gTlVMTDsgaisrKQorCQkJCWRldmljZXNbal0gPSBkZXZpY2VzW2orMV07CisJCQlpLS07CisJCX0KK30KKyNlbmRpZgorCitzdGF0aWMgS2JkaW50QXV0aGN0eHQgKgora2JkaW50X2FsbG9jKGNvbnN0IGNoYXIgKmRldnMpCit7CisJS2JkaW50QXV0aGN0eHQgKmtiZGludGN0eHQ7CisJQnVmZmVyIGI7CisJaW50IGk7CisKKyNpZmRlZiBVU0VfUEFNCisJaWYgKCFvcHRpb25zLnVzZV9wYW0pCisJCXJlbW92ZV9rYmRpbnRfZGV2aWNlKCJwYW0iKTsKKyNlbmRpZgorCisJa2JkaW50Y3R4dCA9IHhtYWxsb2Moc2l6ZW9mKEtiZGludEF1dGhjdHh0KSk7CisJaWYgKHN0cmNtcChkZXZzLCAiIikgPT0gMCkgeworCQlidWZmZXJfaW5pdCgmYik7CisJCWZvciAoaSA9IDA7IGRldmljZXNbaV07IGkrKykgeworCQkJaWYgKGJ1ZmZlcl9sZW4oJmIpID4gMCkKKwkJCQlidWZmZXJfYXBwZW5kKCZiLCAiLCIsIDEpOworCQkJYnVmZmVyX2FwcGVuZCgmYiwgZGV2aWNlc1tpXS0+bmFtZSwKKwkJCSAgICBzdHJsZW4oZGV2aWNlc1tpXS0+bmFtZSkpOworCQl9CisJCWJ1ZmZlcl9hcHBlbmQoJmIsICJcMCIsIDEpOworCQlrYmRpbnRjdHh0LT5kZXZpY2VzID0geHN0cmR1cChidWZmZXJfcHRyKCZiKSk7CisJCWJ1ZmZlcl9mcmVlKCZiKTsKKwl9IGVsc2UgeworCQlrYmRpbnRjdHh0LT5kZXZpY2VzID0geHN0cmR1cChkZXZzKTsKKwl9CisJZGVidWcoImtiZGludF9hbGxvYzogZGV2aWNlcyAnJXMnIiwga2JkaW50Y3R4dC0+ZGV2aWNlcyk7CisJa2JkaW50Y3R4dC0+Y3R4dCA9IE5VTEw7CisJa2JkaW50Y3R4dC0+ZGV2aWNlID0gTlVMTDsKKwlrYmRpbnRjdHh0LT5ucmVxID0gMDsKKworCXJldHVybiBrYmRpbnRjdHh0OworfQorc3RhdGljIHZvaWQKK2tiZGludF9yZXNldF9kZXZpY2UoS2JkaW50QXV0aGN0eHQgKmtiZGludGN0eHQpCit7CisJaWYgKGtiZGludGN0eHQtPmN0eHQpIHsKKwkJa2JkaW50Y3R4dC0+ZGV2aWNlLT5mcmVlX2N0eChrYmRpbnRjdHh0LT5jdHh0KTsKKwkJa2JkaW50Y3R4dC0+Y3R4dCA9IE5VTEw7CisJfQorCWtiZGludGN0eHQtPmRldmljZSA9IE5VTEw7Cit9CitzdGF0aWMgdm9pZAora2JkaW50X2ZyZWUoS2JkaW50QXV0aGN0eHQgKmtiZGludGN0eHQpCit7CisJaWYgKGtiZGludGN0eHQtPmRldmljZSkKKwkJa2JkaW50X3Jlc2V0X2RldmljZShrYmRpbnRjdHh0KTsKKwlpZiAoa2JkaW50Y3R4dC0+ZGV2aWNlcykgeworCQl4ZnJlZShrYmRpbnRjdHh0LT5kZXZpY2VzKTsKKwkJa2JkaW50Y3R4dC0+ZGV2aWNlcyA9IE5VTEw7CisJfQorCXhmcmVlKGtiZGludGN0eHQpOworfQorLyogZ2V0IG5leHQgZGV2aWNlICovCitzdGF0aWMgaW50CitrYmRpbnRfbmV4dF9kZXZpY2UoS2JkaW50QXV0aGN0eHQgKmtiZGludGN0eHQpCit7CisJc2l6ZV90IGxlbjsKKwljaGFyICp0OworCWludCBpOworCisJaWYgKGtiZGludGN0eHQtPmRldmljZSkKKwkJa2JkaW50X3Jlc2V0X2RldmljZShrYmRpbnRjdHh0KTsKKwlkbyB7CisJCWxlbiA9IGtiZGludGN0eHQtPmRldmljZXMgPworCQkgICAgc3RyY3NwbihrYmRpbnRjdHh0LT5kZXZpY2VzLCAiLCIpIDogMDsKKworCQlpZiAobGVuID09IDApCisJCQlicmVhazsKKwkJZm9yIChpID0gMDsgZGV2aWNlc1tpXTsgaSsrKQorCQkJaWYgKHN0cm5jbXAoa2JkaW50Y3R4dC0+ZGV2aWNlcywgZGV2aWNlc1tpXS0+bmFtZSwgbGVuKSA9PSAwKQorCQkJCWtiZGludGN0eHQtPmRldmljZSA9IGRldmljZXNbaV07CisJCXQgPSBrYmRpbnRjdHh0LT5kZXZpY2VzOworCQlrYmRpbnRjdHh0LT5kZXZpY2VzID0gdFtsZW5dID8geHN0cmR1cCh0K2xlbisxKSA6IE5VTEw7CisJCXhmcmVlKHQpOworCQlkZWJ1ZzIoImtiZGludF9uZXh0X2RldmljZTogZGV2aWNlcyAlcyIsIGtiZGludGN0eHQtPmRldmljZXMgPworCQkgICAga2JkaW50Y3R4dC0+ZGV2aWNlcyA6ICI8ZW1wdHk+Iik7CisJfSB3aGlsZSAoa2JkaW50Y3R4dC0+ZGV2aWNlcyAmJiAha2JkaW50Y3R4dC0+ZGV2aWNlKTsKKworCXJldHVybiBrYmRpbnRjdHh0LT5kZXZpY2UgPyAxIDogMDsKK30KKworLyoKKyAqIHRyeSBjaGFsbGVuZ2UtcmVzcG9uc2UsIHNldCBhdXRoY3R4dC0+cG9zdHBvbmVkIGlmIHdlIGhhdmUgdG8KKyAqIHdhaXQgZm9yIHRoZSByZXNwb25zZS4KKyAqLworaW50CithdXRoMl9jaGFsbGVuZ2UoQXV0aGN0eHQgKmF1dGhjdHh0LCBjaGFyICpkZXZzKQoreworCWRlYnVnKCJhdXRoMl9jaGFsbGVuZ2U6IHVzZXI9JXMgZGV2cz0lcyIsCisJICAgIGF1dGhjdHh0LT51c2VyID8gYXV0aGN0eHQtPnVzZXIgOiAiPG5vdXNlcj4iLAorCSAgICBkZXZzID8gZGV2cyA6ICI8bm8gZGV2cz4iKTsKKworCWlmIChhdXRoY3R4dC0+dXNlciA9PSBOVUxMIHx8ICFkZXZzKQorCQlyZXR1cm4gMDsKKwlpZiAoYXV0aGN0eHQtPmtiZGludGN0eHQgPT0gTlVMTCkKKwkJYXV0aGN0eHQtPmtiZGludGN0eHQgPSBrYmRpbnRfYWxsb2MoZGV2cyk7CisJcmV0dXJuIGF1dGgyX2NoYWxsZW5nZV9zdGFydChhdXRoY3R4dCk7Cit9CisKKy8qIHVucmVnaXN0ZXIga2JkLWludCBjYWxsYmFja3MgYW5kIGNvbnRleHQgKi8KK3ZvaWQKK2F1dGgyX2NoYWxsZW5nZV9zdG9wKEF1dGhjdHh0ICphdXRoY3R4dCkKK3sKKwkvKiB1bnJlZ2lzdGVyIGNhbGxiYWNrICovCisJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0lORk9fUkVTUE9OU0UsIE5VTEwpOworCWlmIChhdXRoY3R4dC0+a2JkaW50Y3R4dCAhPSBOVUxMKSB7CisJCWtiZGludF9mcmVlKGF1dGhjdHh0LT5rYmRpbnRjdHh0KTsKKwkJYXV0aGN0eHQtPmtiZGludGN0eHQgPSBOVUxMOworCX0KK30KKworLyogc2lkZSBlZmZlY3Q6IHNldHMgYXV0aGN0eHQtPnBvc3Rwb25lZCBpZiBhIHJlcGx5IHdhcyBzZW50Ki8KK3N0YXRpYyBpbnQKK2F1dGgyX2NoYWxsZW5nZV9zdGFydChBdXRoY3R4dCAqYXV0aGN0eHQpCit7CisJS2JkaW50QXV0aGN0eHQgKmtiZGludGN0eHQgPSBhdXRoY3R4dC0+a2JkaW50Y3R4dDsKKworCWRlYnVnMigiYXV0aDJfY2hhbGxlbmdlX3N0YXJ0OiBkZXZpY2VzICVzIiwKKwkgICAga2JkaW50Y3R4dC0+ZGV2aWNlcyA/ICBrYmRpbnRjdHh0LT5kZXZpY2VzIDogIjxlbXB0eT4iKTsKKworCWlmIChrYmRpbnRfbmV4dF9kZXZpY2Uoa2JkaW50Y3R4dCkgPT0gMCkgeworCQlhdXRoMl9jaGFsbGVuZ2Vfc3RvcChhdXRoY3R4dCk7CisJCXJldHVybiAwOworCX0KKwlkZWJ1ZygiYXV0aDJfY2hhbGxlbmdlX3N0YXJ0OiB0cnlpbmcgYXV0aGVudGljYXRpb24gbWV0aG9kICclcyciLAorCSAgICBrYmRpbnRjdHh0LT5kZXZpY2UtPm5hbWUpOworCisJaWYgKChrYmRpbnRjdHh0LT5jdHh0ID0ga2JkaW50Y3R4dC0+ZGV2aWNlLT5pbml0X2N0eChhdXRoY3R4dCkpID09IE5VTEwpIHsKKwkJYXV0aDJfY2hhbGxlbmdlX3N0b3AoYXV0aGN0eHQpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHNlbmRfdXNlcmF1dGhfaW5mb19yZXF1ZXN0KGF1dGhjdHh0KSA9PSAwKSB7CisJCWF1dGgyX2NoYWxsZW5nZV9zdG9wKGF1dGhjdHh0KTsKKwkJcmV0dXJuIDA7CisJfQorCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9JTkZPX1JFU1BPTlNFLAorCSAgICAmaW5wdXRfdXNlcmF1dGhfaW5mb19yZXNwb25zZSk7CisKKwlhdXRoY3R4dC0+cG9zdHBvbmVkID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2VuZF91c2VyYXV0aF9pbmZvX3JlcXVlc3QoQXV0aGN0eHQgKmF1dGhjdHh0KQoreworCUtiZGludEF1dGhjdHh0ICprYmRpbnRjdHh0OworCWNoYXIgKm5hbWUsICppbnN0ciwgKipwcm9tcHRzOworCXVfaW50IGksICplY2hvX29uOworCisJa2JkaW50Y3R4dCA9IGF1dGhjdHh0LT5rYmRpbnRjdHh0OworCWlmIChrYmRpbnRjdHh0LT5kZXZpY2UtPnF1ZXJ5KGtiZGludGN0eHQtPmN0eHQsCisJICAgICZuYW1lLCAmaW5zdHIsICZrYmRpbnRjdHh0LT5ucmVxLCAmcHJvbXB0cywgJmVjaG9fb24pKQorCQlyZXR1cm4gMDsKKworCXBhY2tldF9zdGFydChTU0gyX01TR19VU0VSQVVUSF9JTkZPX1JFUVVFU1QpOworCXBhY2tldF9wdXRfY3N0cmluZyhuYW1lKTsKKwlwYWNrZXRfcHV0X2NzdHJpbmcoaW5zdHIpOworCXBhY2tldF9wdXRfY3N0cmluZygiIik7CQkvKiBsYW5ndWFnZSBub3QgdXNlZCAqLworCXBhY2tldF9wdXRfaW50KGtiZGludGN0eHQtPm5yZXEpOworCWZvciAoaSA9IDA7IGkgPCBrYmRpbnRjdHh0LT5ucmVxOyBpKyspIHsKKwkJcGFja2V0X3B1dF9jc3RyaW5nKHByb21wdHNbaV0pOworCQlwYWNrZXRfcHV0X2NoYXIoZWNob19vbltpXSk7CisJfQorCXBhY2tldF9zZW5kKCk7CisJcGFja2V0X3dyaXRlX3dhaXQoKTsKKworCWZvciAoaSA9IDA7IGkgPCBrYmRpbnRjdHh0LT5ucmVxOyBpKyspCisJCXhmcmVlKHByb21wdHNbaV0pOworCXhmcmVlKHByb21wdHMpOworCXhmcmVlKGVjaG9fb24pOworCXhmcmVlKG5hbWUpOworCXhmcmVlKGluc3RyKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK2lucHV0X3VzZXJhdXRoX2luZm9fcmVzcG9uc2UoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCit7CisJQXV0aGN0eHQgKmF1dGhjdHh0ID0gY3R4dDsKKwlLYmRpbnRBdXRoY3R4dCAqa2JkaW50Y3R4dDsKKwlpbnQgYXV0aGVudGljYXRlZCA9IDAsIHJlczsKKwl1X2ludCBpLCBucmVzcDsKKwljaGFyICoqcmVzcG9uc2UgPSBOVUxMLCAqbWV0aG9kOworCisJaWYgKGF1dGhjdHh0ID09IE5VTEwpCisJCWZhdGFsKCJpbnB1dF91c2VyYXV0aF9pbmZvX3Jlc3BvbnNlOiBubyBhdXRoY3R4dCIpOworCWtiZGludGN0eHQgPSBhdXRoY3R4dC0+a2JkaW50Y3R4dDsKKwlpZiAoa2JkaW50Y3R4dCA9PSBOVUxMIHx8IGtiZGludGN0eHQtPmN0eHQgPT0gTlVMTCkKKwkJZmF0YWwoImlucHV0X3VzZXJhdXRoX2luZm9fcmVzcG9uc2U6IG5vIGtiZGludGN0eHQiKTsKKwlpZiAoa2JkaW50Y3R4dC0+ZGV2aWNlID09IE5VTEwpCisJCWZhdGFsKCJpbnB1dF91c2VyYXV0aF9pbmZvX3Jlc3BvbnNlOiBubyBkZXZpY2UiKTsKKworCWF1dGhjdHh0LT5wb3N0cG9uZWQgPSAwOwkvKiByZXNldCAqLworCW5yZXNwID0gcGFja2V0X2dldF9pbnQoKTsKKwlpZiAobnJlc3AgIT0ga2JkaW50Y3R4dC0+bnJlcSkKKwkJZmF0YWwoImlucHV0X3VzZXJhdXRoX2luZm9fcmVzcG9uc2U6IHdyb25nIG51bWJlciBvZiByZXBsaWVzIik7CisJaWYgKG5yZXNwID4gMTAwKQorCQlmYXRhbCgiaW5wdXRfdXNlcmF1dGhfaW5mb19yZXNwb25zZTogdG9vIG1hbnkgcmVwbGllcyIpOworCWlmIChucmVzcCA+IDApIHsKKwkJcmVzcG9uc2UgPSB4Y2FsbG9jKG5yZXNwLCBzaXplb2YoY2hhciAqKSk7CisJCWZvciAoaSA9IDA7IGkgPCBucmVzcDsgaSsrKQorCQkJcmVzcG9uc2VbaV0gPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKKwl9CisJcGFja2V0X2NoZWNrX2VvbSgpOworCisJcmVzID0ga2JkaW50Y3R4dC0+ZGV2aWNlLT5yZXNwb25kKGtiZGludGN0eHQtPmN0eHQsIG5yZXNwLCByZXNwb25zZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJlc3A7IGkrKykgeworCQltZW1zZXQocmVzcG9uc2VbaV0sICdyJywgc3RybGVuKHJlc3BvbnNlW2ldKSk7CisJCXhmcmVlKHJlc3BvbnNlW2ldKTsKKwl9CisJaWYgKHJlc3BvbnNlKQorCQl4ZnJlZShyZXNwb25zZSk7CisKKwlzd2l0Y2ggKHJlcykgeworCWNhc2UgMDoKKwkJLyogU3VjY2VzcyEgKi8KKwkJYXV0aGVudGljYXRlZCA9IGF1dGhjdHh0LT52YWxpZCA/IDEgOiAwOworCQlicmVhazsKKwljYXNlIDE6CisJCS8qIEF1dGhlbnRpY2F0aW9uIG5lZWRzIGZ1cnRoZXIgaW50ZXJhY3Rpb24gKi8KKwkJaWYgKHNlbmRfdXNlcmF1dGhfaW5mb19yZXF1ZXN0KGF1dGhjdHh0KSA9PSAxKQorCQkJYXV0aGN0eHQtPnBvc3Rwb25lZCA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIEZhaWx1cmUhICovCisJCWJyZWFrOworCX0KKworCXhhc3ByaW50ZigmbWV0aG9kLCAia2V5Ym9hcmQtaW50ZXJhY3RpdmUvJXMiLCBrYmRpbnRjdHh0LT5kZXZpY2UtPm5hbWUpOworCisJaWYgKCFhdXRoY3R4dC0+cG9zdHBvbmVkKSB7CisJCWlmIChhdXRoZW50aWNhdGVkKSB7CisJCQlhdXRoMl9jaGFsbGVuZ2Vfc3RvcChhdXRoY3R4dCk7CisJCX0gZWxzZSB7CisJCQkvKiBzdGFydCBuZXh0IGRldmljZSAqLworCQkJLyogbWF5IHNldCBhdXRoY3R4dC0+cG9zdHBvbmVkICovCisJCQlhdXRoMl9jaGFsbGVuZ2Vfc3RhcnQoYXV0aGN0eHQpOworCQl9CisJfQorCXVzZXJhdXRoX2ZpbmlzaChhdXRoY3R4dCwgYXV0aGVudGljYXRlZCwgbWV0aG9kKTsKKwl4ZnJlZShtZXRob2QpOworfQorCit2b2lkCitwcml2c2VwX2NoYWxsZW5nZV9lbmFibGUodm9pZCkKK3sKKyNpZiBkZWZpbmVkKEJTRF9BVVRIKSB8fCBkZWZpbmVkKFVTRV9QQU0pIHx8IGRlZmluZWQoU0tFWSkKKwlpbnQgbiA9IDA7CisjZW5kaWYKKyNpZmRlZiBCU0RfQVVUSAorCWV4dGVybiBLYmRpbnREZXZpY2UgbW1fYnNkYXV0aF9kZXZpY2U7CisjZW5kaWYKKyNpZmRlZiBVU0VfUEFNCisJZXh0ZXJuIEtiZGludERldmljZSBtbV9zc2hwYW1fZGV2aWNlOworI2VuZGlmCisjaWZkZWYgU0tFWQorCWV4dGVybiBLYmRpbnREZXZpY2UgbW1fc2tleV9kZXZpY2U7CisjZW5kaWYKKworI2lmZGVmIEJTRF9BVVRICisJZGV2aWNlc1tuKytdID0gJm1tX2JzZGF1dGhfZGV2aWNlOworI2Vsc2UKKyNpZmRlZiBVU0VfUEFNCisJZGV2aWNlc1tuKytdID0gJm1tX3NzaHBhbV9kZXZpY2U7CisjZW5kaWYKKyNpZmRlZiBTS0VZCisJZGV2aWNlc1tuKytdID0gJm1tX3NrZXlfZGV2aWNlOworI2VuZGlmCisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvYXV0aDItZ3NzLmMgYi9vcGVuc3NoLTYuMHAxL2F1dGgyLWdzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNTliMjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2F1dGgyLWdzcy5jCkBAIC0wLDAgKzEsMzAzIEBACisvKiAkT3BlbkJTRDogYXV0aDItZ3NzLmMsdiAxLjE3IDIwMTEvMDMvMTAgMDI6NTI6NTcgZGptIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMyBTaW1vbiBXaWxraW5zb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2lmZGVmIEdTU0FQSQorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJob3N0ZmlsZS5oIgorI2luY2x1ZGUgImF1dGguaCIKKyNpbmNsdWRlICJzc2gyLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAiZGlzcGF0Y2guaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJzZXJ2Y29uZi5oIgorI2luY2x1ZGUgInBhY2tldC5oIgorI2luY2x1ZGUgInNzaC1nc3MuaCIKKyNpbmNsdWRlICJtb25pdG9yX3dyYXAuaCIKKworZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKKworc3RhdGljIHZvaWQgaW5wdXRfZ3NzYXBpX3Rva2VuKGludCB0eXBlLCB1X2ludDMyX3QgcGxlbiwgdm9pZCAqY3R4dCk7CitzdGF0aWMgdm9pZCBpbnB1dF9nc3NhcGlfbWljKGludCB0eXBlLCB1X2ludDMyX3QgcGxlbiwgdm9pZCAqY3R4dCk7CitzdGF0aWMgdm9pZCBpbnB1dF9nc3NhcGlfZXhjaGFuZ2VfY29tcGxldGUoaW50IHR5cGUsIHVfaW50MzJfdCBwbGVuLCB2b2lkICpjdHh0KTsKK3N0YXRpYyB2b2lkIGlucHV0X2dzc2FwaV9lcnJ0b2soaW50LCB1X2ludDMyX3QsIHZvaWQgKik7CisKKy8qCisgKiBXZSBvbmx5IHN1cHBvcnQgdGhvc2UgbWVjaGFuaXNtcyB0aGF0IHdlIGtub3cgYWJvdXQgKGllIG9uZXMgdGhhdCB3ZSBrbm93CisgKiBob3cgdG8gY2hlY2sgbG9jYWwgdXNlciBrdXNlcm9rIGFuZCB0aGUgbGlrZSkKKyAqLworc3RhdGljIGludAordXNlcmF1dGhfZ3NzYXBpKEF1dGhjdHh0ICphdXRoY3R4dCkKK3sKKwlnc3NfT0lEX2Rlc2MgZ29pZCA9IHswLCBOVUxMfTsKKwlHc3NjdHh0ICpjdHh0ID0gTlVMTDsKKwlpbnQgbWVjaHM7CisJZ3NzX09JRF9zZXQgc3VwcG9ydGVkOworCWludCBwcmVzZW50OworCU9NX3VpbnQzMiBtczsKKwl1X2ludCBsZW47CisJdV9jaGFyICpkb2lkID0gTlVMTDsKKworCWlmICghYXV0aGN0eHQtPnZhbGlkIHx8IGF1dGhjdHh0LT51c2VyID09IE5VTEwpCisJCXJldHVybiAoMCk7CisKKwltZWNocyA9IHBhY2tldF9nZXRfaW50KCk7CisJaWYgKG1lY2hzID09IDApIHsKKwkJZGVidWcoIk1lY2hhbmlzbSBuZWdvdGlhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7CisJCXJldHVybiAoMCk7CisJfQorCisJc3NoX2dzc2FwaV9zdXBwb3J0ZWRfb2lkcygmc3VwcG9ydGVkKTsKKwlkbyB7CisJCW1lY2hzLS07CisKKwkJaWYgKGRvaWQpCisJCQl4ZnJlZShkb2lkKTsKKworCQlwcmVzZW50ID0gMDsKKwkJZG9pZCA9IHBhY2tldF9nZXRfc3RyaW5nKCZsZW4pOworCisJCWlmIChsZW4gPiAyICYmIGRvaWRbMF0gPT0gU1NIX0dTU19PSURUWVBFICYmCisJCSAgICBkb2lkWzFdID09IGxlbiAtIDIpIHsKKwkJCWdvaWQuZWxlbWVudHMgPSBkb2lkICsgMjsKKwkJCWdvaWQubGVuZ3RoICAgPSBsZW4gLSAyOworCQkJZ3NzX3Rlc3Rfb2lkX3NldF9tZW1iZXIoJm1zLCAmZ29pZCwgc3VwcG9ydGVkLAorCQkJICAgICZwcmVzZW50KTsKKwkJfSBlbHNlIHsKKwkJCWxvZ2l0KCJCYWRseSBmb3JtZWQgT0lEIHJlY2VpdmVkIik7CisJCX0KKwl9IHdoaWxlIChtZWNocyA+IDAgJiYgIXByZXNlbnQpOworCisJZ3NzX3JlbGVhc2Vfb2lkX3NldCgmbXMsICZzdXBwb3J0ZWQpOworCisJaWYgKCFwcmVzZW50KSB7CisJCXhmcmVlKGRvaWQpOworCQlhdXRoY3R4dC0+c2VydmVyX2NhdXNlZF9mYWlsdXJlID0gMTsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlpZiAoR1NTX0VSUk9SKFBSSVZTRVAoc3NoX2dzc2FwaV9zZXJ2ZXJfY3R4KCZjdHh0LCAmZ29pZCkpKSkgeworCQlpZiAoY3R4dCAhPSBOVUxMKQorCQkJc3NoX2dzc2FwaV9kZWxldGVfY3R4KCZjdHh0KTsKKwkJeGZyZWUoZG9pZCk7CisJCWF1dGhjdHh0LT5zZXJ2ZXJfY2F1c2VkX2ZhaWx1cmUgPSAxOworCQlyZXR1cm4gKDApOworCX0KKworCWF1dGhjdHh0LT5tZXRob2RkYXRhID0gKHZvaWQgKiljdHh0OworCisJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9SRVNQT05TRSk7CisKKwkvKiBSZXR1cm4gdGhlIE9JRCB0aGF0IHdlIHJlY2VpdmVkICovCisJcGFja2V0X3B1dF9zdHJpbmcoZG9pZCwgbGVuKTsKKworCXBhY2tldF9zZW5kKCk7CisJeGZyZWUoZG9pZCk7CisKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfR1NTQVBJX1RPS0VOLCAmaW5wdXRfZ3NzYXBpX3Rva2VuKTsKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfR1NTQVBJX0VSUlRPSywgJmlucHV0X2dzc2FwaV9lcnJ0b2spOworCWF1dGhjdHh0LT5wb3N0cG9uZWQgPSAxOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK2lucHV0X2dzc2FwaV90b2tlbihpbnQgdHlwZSwgdV9pbnQzMl90IHBsZW4sIHZvaWQgKmN0eHQpCit7CisJQXV0aGN0eHQgKmF1dGhjdHh0ID0gY3R4dDsKKwlHc3NjdHh0ICpnc3NjdHh0OworCWdzc19idWZmZXJfZGVzYyBzZW5kX3RvayA9IEdTU19DX0VNUFRZX0JVRkZFUjsKKwlnc3NfYnVmZmVyX2Rlc2MgcmVjdl90b2s7CisJT01fdWludDMyIG1hal9zdGF0dXMsIG1pbl9zdGF0dXMsIGZsYWdzOworCXVfaW50IGxlbjsKKworCWlmIChhdXRoY3R4dCA9PSBOVUxMIHx8IChhdXRoY3R4dC0+bWV0aG9kZGF0YSA9PSBOVUxMICYmICF1c2VfcHJpdnNlcCkpCisJCWZhdGFsKCJObyBhdXRoZW50aWNhdGlvbiBvciBHU1NBUEkgY29udGV4dCIpOworCisJZ3NzY3R4dCA9IGF1dGhjdHh0LT5tZXRob2RkYXRhOworCXJlY3ZfdG9rLnZhbHVlID0gcGFja2V0X2dldF9zdHJpbmcoJmxlbik7CisJcmVjdl90b2subGVuZ3RoID0gbGVuOyAvKiB1X2ludCB2cy4gc2l6ZV90ICovCisKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisKKwltYWpfc3RhdHVzID0gUFJJVlNFUChzc2hfZ3NzYXBpX2FjY2VwdF9jdHgoZ3NzY3R4dCwgJnJlY3ZfdG9rLAorCSAgICAmc2VuZF90b2ssICZmbGFncykpOworCisJeGZyZWUocmVjdl90b2sudmFsdWUpOworCisJaWYgKEdTU19FUlJPUihtYWpfc3RhdHVzKSkgeworCQlpZiAoc2VuZF90b2subGVuZ3RoICE9IDApIHsKKwkJCXBhY2tldF9zdGFydChTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfRVJSVE9LKTsKKwkJCXBhY2tldF9wdXRfc3RyaW5nKHNlbmRfdG9rLnZhbHVlLCBzZW5kX3Rvay5sZW5ndGgpOworCQkJcGFja2V0X3NlbmQoKTsKKwkJfQorCQlhdXRoY3R4dC0+cG9zdHBvbmVkID0gMDsKKwkJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9UT0tFTiwgTlVMTCk7CisJCXVzZXJhdXRoX2ZpbmlzaChhdXRoY3R4dCwgMCwgImdzc2FwaS13aXRoLW1pYyIpOworCX0gZWxzZSB7CisJCWlmIChzZW5kX3Rvay5sZW5ndGggIT0gMCkgeworCQkJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9UT0tFTik7CisJCQlwYWNrZXRfcHV0X3N0cmluZyhzZW5kX3Rvay52YWx1ZSwgc2VuZF90b2subGVuZ3RoKTsKKwkJCXBhY2tldF9zZW5kKCk7CisJCX0KKwkJaWYgKG1hal9zdGF0dXMgPT0gR1NTX1NfQ09NUExFVEUpIHsKKwkJCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfVE9LRU4sIE5VTEwpOworCQkJaWYgKGZsYWdzICYgR1NTX0NfSU5URUdfRkxBRykKKwkJCQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfR1NTQVBJX01JQywKKwkJCQkgICAgJmlucHV0X2dzc2FwaV9taWMpOworCQkJZWxzZQorCQkJCWRpc3BhdGNoX3NldCgKKwkJCQkgICAgU1NIMl9NU0dfVVNFUkFVVEhfR1NTQVBJX0VYQ0hBTkdFX0NPTVBMRVRFLAorCQkJCSAgICAmaW5wdXRfZ3NzYXBpX2V4Y2hhbmdlX2NvbXBsZXRlKTsKKwkJfQorCX0KKworCWdzc19yZWxlYXNlX2J1ZmZlcigmbWluX3N0YXR1cywgJnNlbmRfdG9rKTsKK30KKworc3RhdGljIHZvaWQKK2lucHV0X2dzc2FwaV9lcnJ0b2soaW50IHR5cGUsIHVfaW50MzJfdCBwbGVuLCB2b2lkICpjdHh0KQoreworCUF1dGhjdHh0ICphdXRoY3R4dCA9IGN0eHQ7CisJR3NzY3R4dCAqZ3NzY3R4dDsKKwlnc3NfYnVmZmVyX2Rlc2Mgc2VuZF90b2sgPSBHU1NfQ19FTVBUWV9CVUZGRVI7CisJZ3NzX2J1ZmZlcl9kZXNjIHJlY3ZfdG9rOworCU9NX3VpbnQzMiBtYWpfc3RhdHVzOworCXVfaW50IGxlbjsKKworCWlmIChhdXRoY3R4dCA9PSBOVUxMIHx8IChhdXRoY3R4dC0+bWV0aG9kZGF0YSA9PSBOVUxMICYmICF1c2VfcHJpdnNlcCkpCisJCWZhdGFsKCJObyBhdXRoZW50aWNhdGlvbiBvciBHU1NBUEkgY29udGV4dCIpOworCisJZ3NzY3R4dCA9IGF1dGhjdHh0LT5tZXRob2RkYXRhOworCXJlY3ZfdG9rLnZhbHVlID0gcGFja2V0X2dldF9zdHJpbmcoJmxlbik7CisJcmVjdl90b2subGVuZ3RoID0gbGVuOworCisJcGFja2V0X2NoZWNrX2VvbSgpOworCisJLyogUHVzaCB0aGUgZXJyb3IgdG9rZW4gaW50byBHU1NBUEkgdG8gc2VlIHdoYXQgaXQgc2F5cyAqLworCW1hal9zdGF0dXMgPSBQUklWU0VQKHNzaF9nc3NhcGlfYWNjZXB0X2N0eChnc3NjdHh0LCAmcmVjdl90b2ssCisJICAgICZzZW5kX3RvaywgTlVMTCkpOworCisJeGZyZWUocmVjdl90b2sudmFsdWUpOworCisJLyogV2UgY2FuJ3QgcmV0dXJuIGFueXRoaW5nIHRvIHRoZSBjbGllbnQsIGV2ZW4gaWYgd2Ugd2FudGVkIHRvICovCisJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9UT0tFTiwgTlVMTCk7CisJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9FUlJUT0ssIE5VTEwpOworCisJLyogVGhlIGNsaWVudCB3aWxsIGhhdmUgYWxyZWFkeSBtb3ZlZCBvbiB0byB0aGUgbmV4dCBhdXRoICovCisKKwlnc3NfcmVsZWFzZV9idWZmZXIoJm1hal9zdGF0dXMsICZzZW5kX3Rvayk7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjbGllbnQgdGhpbmtzIHdlJ3ZlIGNvbXBsZXRlZCBhdXRoZW50aWNhdGlvbi4KKyAqIEl0IHNob3VsZCBvbmx5IGJlIGVuYWJsZWQgaW4gdGhlIGRpc3BhdGNoIGhhbmRsZXIgYnkgdGhlIGZ1bmN0aW9uIGFib3ZlLAorICogd2hpY2ggb25seSBlbmFibGVzIGl0IG9uY2UgdGhlIEdTU0FQSSBleGNoYW5nZSBpcyBjb21wbGV0ZS4KKyAqLworCitzdGF0aWMgdm9pZAoraW5wdXRfZ3NzYXBpX2V4Y2hhbmdlX2NvbXBsZXRlKGludCB0eXBlLCB1X2ludDMyX3QgcGxlbiwgdm9pZCAqY3R4dCkKK3sKKwlBdXRoY3R4dCAqYXV0aGN0eHQgPSBjdHh0OworCUdzc2N0eHQgKmdzc2N0eHQ7CisJaW50IGF1dGhlbnRpY2F0ZWQ7CisKKwlpZiAoYXV0aGN0eHQgPT0gTlVMTCB8fCAoYXV0aGN0eHQtPm1ldGhvZGRhdGEgPT0gTlVMTCAmJiAhdXNlX3ByaXZzZXApKQorCQlmYXRhbCgiTm8gYXV0aGVudGljYXRpb24gb3IgR1NTQVBJIGNvbnRleHQiKTsKKworCWdzc2N0eHQgPSBhdXRoY3R4dC0+bWV0aG9kZGF0YTsKKworCS8qCisJICogV2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgc3RhdHVzLCBiZWNhdXNlIHdlJ3JlIG9ubHkgZW5hYmxlZCBpbgorCSAqIHRoZSBkaXNwYXRjaGVyIG9uY2UgdGhlIGV4Y2hhbmdlIGlzIGNvbXBsZXRlCisJICovCisKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisKKwlhdXRoZW50aWNhdGVkID0gUFJJVlNFUChzc2hfZ3NzYXBpX3VzZXJvayhhdXRoY3R4dC0+dXNlcikpOworCisJYXV0aGN0eHQtPnBvc3Rwb25lZCA9IDA7CisJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9UT0tFTiwgTlVMTCk7CisJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9FUlJUT0ssIE5VTEwpOworCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfTUlDLCBOVUxMKTsKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfR1NTQVBJX0VYQ0hBTkdFX0NPTVBMRVRFLCBOVUxMKTsKKwl1c2VyYXV0aF9maW5pc2goYXV0aGN0eHQsIGF1dGhlbnRpY2F0ZWQsICJnc3NhcGktd2l0aC1taWMiKTsKK30KKworc3RhdGljIHZvaWQKK2lucHV0X2dzc2FwaV9taWMoaW50IHR5cGUsIHVfaW50MzJfdCBwbGVuLCB2b2lkICpjdHh0KQoreworCUF1dGhjdHh0ICphdXRoY3R4dCA9IGN0eHQ7CisJR3NzY3R4dCAqZ3NzY3R4dDsKKwlpbnQgYXV0aGVudGljYXRlZCA9IDA7CisJQnVmZmVyIGI7CisJZ3NzX2J1ZmZlcl9kZXNjIG1pYywgZ3NzYnVmOworCXVfaW50IGxlbjsKKworCWlmIChhdXRoY3R4dCA9PSBOVUxMIHx8IChhdXRoY3R4dC0+bWV0aG9kZGF0YSA9PSBOVUxMICYmICF1c2VfcHJpdnNlcCkpCisJCWZhdGFsKCJObyBhdXRoZW50aWNhdGlvbiBvciBHU1NBUEkgY29udGV4dCIpOworCisJZ3NzY3R4dCA9IGF1dGhjdHh0LT5tZXRob2RkYXRhOworCisJbWljLnZhbHVlID0gcGFja2V0X2dldF9zdHJpbmcoJmxlbik7CisJbWljLmxlbmd0aCA9IGxlbjsKKworCXNzaF9nc3NhcGlfYnVpbGRtaWMoJmIsIGF1dGhjdHh0LT51c2VyLCBhdXRoY3R4dC0+c2VydmljZSwKKwkgICAgImdzc2FwaS13aXRoLW1pYyIpOworCisJZ3NzYnVmLnZhbHVlID0gYnVmZmVyX3B0cigmYik7CisJZ3NzYnVmLmxlbmd0aCA9IGJ1ZmZlcl9sZW4oJmIpOworCisJaWYgKCFHU1NfRVJST1IoUFJJVlNFUChzc2hfZ3NzYXBpX2NoZWNrbWljKGdzc2N0eHQsICZnc3NidWYsICZtaWMpKSkpCisJCWF1dGhlbnRpY2F0ZWQgPSBQUklWU0VQKHNzaF9nc3NhcGlfdXNlcm9rKGF1dGhjdHh0LT51c2VyKSk7CisJZWxzZQorCQlsb2dpdCgiR1NTQVBJIE1JQyBjaGVjayBmYWlsZWQiKTsKKworCWJ1ZmZlcl9mcmVlKCZiKTsKKwl4ZnJlZShtaWMudmFsdWUpOworCisJYXV0aGN0eHQtPnBvc3Rwb25lZCA9IDA7CisJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9UT0tFTiwgTlVMTCk7CisJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9FUlJUT0ssIE5VTEwpOworCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfTUlDLCBOVUxMKTsKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfR1NTQVBJX0VYQ0hBTkdFX0NPTVBMRVRFLCBOVUxMKTsKKwl1c2VyYXV0aF9maW5pc2goYXV0aGN0eHQsIGF1dGhlbnRpY2F0ZWQsICJnc3NhcGktd2l0aC1taWMiKTsKK30KKworQXV0aG1ldGhvZCBtZXRob2RfZ3NzYXBpID0geworCSJnc3NhcGktd2l0aC1taWMiLAorCXVzZXJhdXRoX2dzc2FwaSwKKwkmb3B0aW9ucy5nc3NfYXV0aGVudGljYXRpb24KK307CisKKyNlbmRpZiAvKiBHU1NBUEkgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvYXV0aDItaG9zdGJhc2VkLmMgYi9vcGVuc3NoLTYuMHAxL2F1dGgyLWhvc3RiYXNlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZjQ0MmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2F1dGgyLWhvc3RiYXNlZC5jCkBAIC0wLDAgKzEsMjIwIEBACisvKiAkT3BlbkJTRDogYXV0aDItaG9zdGJhc2VkLmMsdiAxLjE0IDIwMTAvMDgvMDQgMDU6NDI6NDcgZGptIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAic3NoMi5oIgorI2luY2x1ZGUgInBhY2tldC5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInNlcnZjb25mLmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisjaW5jbHVkZSAia2V5LmgiCisjaW5jbHVkZSAiaG9zdGZpbGUuaCIKKyNpbmNsdWRlICJhdXRoLmgiCisjaW5jbHVkZSAiY2Fub2hvc3QuaCIKKyNpZmRlZiBHU1NBUEkKKyNpbmNsdWRlICJzc2gtZ3NzLmgiCisjZW5kaWYKKyNpbmNsdWRlICJtb25pdG9yX3dyYXAuaCIKKyNpbmNsdWRlICJwYXRobmFtZXMuaCIKKworLyogaW1wb3J0ICovCitleHRlcm4gU2VydmVyT3B0aW9ucyBvcHRpb25zOworZXh0ZXJuIHVfY2hhciAqc2Vzc2lvbl9pZDI7CitleHRlcm4gdV9pbnQgc2Vzc2lvbl9pZDJfbGVuOworCitzdGF0aWMgaW50Cit1c2VyYXV0aF9ob3N0YmFzZWQoQXV0aGN0eHQgKmF1dGhjdHh0KQoreworCUJ1ZmZlciBiOworCUtleSAqa2V5ID0gTlVMTDsKKwljaGFyICpwa2FsZywgKmN1c2VyLCAqY2hvc3QsICpzZXJ2aWNlOworCXVfY2hhciAqcGtibG9iLCAqc2lnOworCXVfaW50IGFsZW4sIGJsZW4sIHNsZW47CisJaW50IHBrdHlwZTsKKwlpbnQgYXV0aGVudGljYXRlZCA9IDA7CisKKwlpZiAoIWF1dGhjdHh0LT52YWxpZCkgeworCQlkZWJ1ZzIoInVzZXJhdXRoX2hvc3RiYXNlZDogZGlzYWJsZWQgYmVjYXVzZSBvZiBpbnZhbGlkIHVzZXIiKTsKKwkJcmV0dXJuIDA7CisJfQorCXBrYWxnID0gcGFja2V0X2dldF9zdHJpbmcoJmFsZW4pOworCXBrYmxvYiA9IHBhY2tldF9nZXRfc3RyaW5nKCZibGVuKTsKKwljaG9zdCA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOworCWN1c2VyID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7CisJc2lnID0gcGFja2V0X2dldF9zdHJpbmcoJnNsZW4pOworCisJZGVidWcoInVzZXJhdXRoX2hvc3RiYXNlZDogY3VzZXIgJXMgY2hvc3QgJXMgcGthbGcgJXMgc2xlbiAlZCIsCisJICAgIGN1c2VyLCBjaG9zdCwgcGthbGcsIHNsZW4pOworI2lmZGVmIERFQlVHX1BLCisJZGVidWcoInNpZ25hdHVyZToiKTsKKwlidWZmZXJfaW5pdCgmYik7CisJYnVmZmVyX2FwcGVuZCgmYiwgc2lnLCBzbGVuKTsKKwlidWZmZXJfZHVtcCgmYik7CisJYnVmZmVyX2ZyZWUoJmIpOworI2VuZGlmCisJcGt0eXBlID0ga2V5X3R5cGVfZnJvbV9uYW1lKHBrYWxnKTsKKwlpZiAocGt0eXBlID09IEtFWV9VTlNQRUMpIHsKKwkJLyogdGhpcyBpcyBwZXJmZWN0bHkgbGVnYWwgKi8KKwkJbG9naXQoInVzZXJhdXRoX2hvc3RiYXNlZDogdW5zdXBwb3J0ZWQgIgorCQkgICAgInB1YmxpYyBrZXkgYWxnb3JpdGhtOiAlcyIsIHBrYWxnKTsKKwkJZ290byBkb25lOworCX0KKwlrZXkgPSBrZXlfZnJvbV9ibG9iKHBrYmxvYiwgYmxlbik7CisJaWYgKGtleSA9PSBOVUxMKSB7CisJCWVycm9yKCJ1c2VyYXV0aF9ob3N0YmFzZWQ6IGNhbm5vdCBkZWNvZGUga2V5OiAlcyIsIHBrYWxnKTsKKwkJZ290byBkb25lOworCX0KKwlpZiAoa2V5LT50eXBlICE9IHBrdHlwZSkgeworCQllcnJvcigidXNlcmF1dGhfaG9zdGJhc2VkOiB0eXBlIG1pc21hdGNoIGZvciBkZWNvZGVkIGtleSAiCisJCSAgICAiKHJlY2VpdmVkICVkLCBleHBlY3RlZCAlZCkiLCBrZXktPnR5cGUsIHBrdHlwZSk7CisJCWdvdG8gZG9uZTsKKwl9CisJc2VydmljZSA9IGRhdGFmZWxsb3dzICYgU1NIX0JVR19IQlNFUlZJQ0UgPyAic3NoLXVzZXJhdXRoIiA6CisJICAgIGF1dGhjdHh0LT5zZXJ2aWNlOworCWJ1ZmZlcl9pbml0KCZiKTsKKwlidWZmZXJfcHV0X3N0cmluZygmYiwgc2Vzc2lvbl9pZDIsIHNlc3Npb25faWQyX2xlbik7CisJLyogcmVjb25zdHJ1Y3QgcGFja2V0ICovCisJYnVmZmVyX3B1dF9jaGFyKCZiLCBTU0gyX01TR19VU0VSQVVUSF9SRVFVRVNUKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIGF1dGhjdHh0LT51c2VyKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIHNlcnZpY2UpOworCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwgImhvc3RiYXNlZCIpOworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZiLCBwa2FsZywgYWxlbik7CisJYnVmZmVyX3B1dF9zdHJpbmcoJmIsIHBrYmxvYiwgYmxlbik7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBjaG9zdCk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBjdXNlcik7CisjaWZkZWYgREVCVUdfUEsKKwlidWZmZXJfZHVtcCgmYik7CisjZW5kaWYKKwkvKiB0ZXN0IGZvciBhbGxvd2VkIGtleSBhbmQgY29ycmVjdCBzaWduYXR1cmUgKi8KKwlhdXRoZW50aWNhdGVkID0gMDsKKwlpZiAoUFJJVlNFUChob3N0YmFzZWRfa2V5X2FsbG93ZWQoYXV0aGN0eHQtPnB3LCBjdXNlciwgY2hvc3QsIGtleSkpICYmCisJICAgIFBSSVZTRVAoa2V5X3ZlcmlmeShrZXksIHNpZywgc2xlbiwgYnVmZmVyX3B0cigmYiksCisJCQlidWZmZXJfbGVuKCZiKSkpID09IDEpCisJCWF1dGhlbnRpY2F0ZWQgPSAxOworCisJYnVmZmVyX2ZyZWUoJmIpOworZG9uZToKKwlkZWJ1ZzIoInVzZXJhdXRoX2hvc3RiYXNlZDogYXV0aGVudGljYXRlZCAlZCIsIGF1dGhlbnRpY2F0ZWQpOworCWlmIChrZXkgIT0gTlVMTCkKKwkJa2V5X2ZyZWUoa2V5KTsKKwl4ZnJlZShwa2FsZyk7CisJeGZyZWUocGtibG9iKTsKKwl4ZnJlZShjdXNlcik7CisJeGZyZWUoY2hvc3QpOworCXhmcmVlKHNpZyk7CisJcmV0dXJuIGF1dGhlbnRpY2F0ZWQ7Cit9CisKKy8qIHJldHVybiAxIGlmIGdpdmVuIGhvc3RrZXkgaXMgYWxsb3dlZCAqLworaW50Citob3N0YmFzZWRfa2V5X2FsbG93ZWQoc3RydWN0IHBhc3N3ZCAqcHcsIGNvbnN0IGNoYXIgKmN1c2VyLCBjaGFyICpjaG9zdCwKKyAgICBLZXkgKmtleSkKK3sKKwljb25zdCBjaGFyICpyZXNvbHZlZG5hbWUsICppcGFkZHIsICpsb29rdXAsICpyZWFzb247CisJSG9zdFN0YXR1cyBob3N0X3N0YXR1czsKKwlpbnQgbGVuOworCWNoYXIgKmZwOworCisJaWYgKGF1dGhfa2V5X2lzX3Jldm9rZWQoa2V5KSkKKwkJcmV0dXJuIDA7CisKKwlyZXNvbHZlZG5hbWUgPSBnZXRfY2Fub25pY2FsX2hvc3RuYW1lKG9wdGlvbnMudXNlX2Rucyk7CisJaXBhZGRyID0gZ2V0X3JlbW90ZV9pcGFkZHIoKTsKKworCWRlYnVnMigidXNlcmF1dGhfaG9zdGJhc2VkOiBjaG9zdCAlcyByZXNvbHZlZG5hbWUgJXMgaXBhZGRyICVzIiwKKwkgICAgY2hvc3QsIHJlc29sdmVkbmFtZSwgaXBhZGRyKTsKKworCWlmICgoKGxlbiA9IHN0cmxlbihjaG9zdCkpID4gMCkgJiYgY2hvc3RbbGVuIC0gMV0gPT0gJy4nKSB7CisJCWRlYnVnMigic3RyaXBwaW5nIHRyYWlsaW5nIGRvdCBmcm9tIGNob3N0ICVzIiwgY2hvc3QpOworCQljaG9zdFtsZW4gLSAxXSA9ICdcMCc7CisJfQorCisJaWYgKG9wdGlvbnMuaG9zdGJhc2VkX3VzZXNfbmFtZV9mcm9tX3BhY2tldF9vbmx5KSB7CisJCWlmIChhdXRoX3Job3N0czIocHcsIGN1c2VyLCBjaG9zdCwgY2hvc3QpID09IDApCisJCQlyZXR1cm4gMDsKKwkJbG9va3VwID0gY2hvc3Q7CisJfSBlbHNlIHsKKwkJaWYgKHN0cmNhc2VjbXAocmVzb2x2ZWRuYW1lLCBjaG9zdCkgIT0gMCkKKwkJCWxvZ2l0KCJ1c2VyYXV0aF9ob3N0YmFzZWQgbWlzbWF0Y2g6ICIKKwkJCSAgICAiY2xpZW50IHNlbmRzICVzLCBidXQgd2UgcmVzb2x2ZSAlcyB0byAlcyIsCisJCQkgICAgY2hvc3QsIGlwYWRkciwgcmVzb2x2ZWRuYW1lKTsKKwkJaWYgKGF1dGhfcmhvc3RzMihwdywgY3VzZXIsIHJlc29sdmVkbmFtZSwgaXBhZGRyKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJCWxvb2t1cCA9IHJlc29sdmVkbmFtZTsKKwl9CisJZGVidWcyKCJ1c2VyYXV0aF9ob3N0YmFzZWQ6IGFjY2VzcyBhbGxvd2VkIGJ5IGF1dGhfcmhvc3RzMiIpOworCisJaWYgKGtleV9pc19jZXJ0KGtleSkgJiYgCisJICAgIGtleV9jZXJ0X2NoZWNrX2F1dGhvcml0eShrZXksIDEsIDAsIGxvb2t1cCwgJnJlYXNvbikpIHsKKwkJZXJyb3IoIiVzIiwgcmVhc29uKTsKKwkJYXV0aF9kZWJ1Z19hZGQoIiVzIiwgcmVhc29uKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaG9zdF9zdGF0dXMgPSBjaGVja19rZXlfaW5faG9zdGZpbGVzKHB3LCBrZXksIGxvb2t1cCwKKwkgICAgX1BBVEhfU1NIX1NZU1RFTV9IT1NURklMRSwKKwkgICAgb3B0aW9ucy5pZ25vcmVfdXNlcl9rbm93bl9ob3N0cyA/IE5VTEwgOiBfUEFUSF9TU0hfVVNFUl9IT1NURklMRSk7CisKKwkvKiBiYWNrd2FyZCBjb21wYXQgaWYgbm8ga2V5IGhhcyBiZWVuIGZvdW5kLiAqLworCWlmIChob3N0X3N0YXR1cyA9PSBIT1NUX05FVykgeworCQlob3N0X3N0YXR1cyA9IGNoZWNrX2tleV9pbl9ob3N0ZmlsZXMocHcsIGtleSwgbG9va3VwLAorCQkgICAgX1BBVEhfU1NIX1NZU1RFTV9IT1NURklMRTIsCisJCSAgICBvcHRpb25zLmlnbm9yZV91c2VyX2tub3duX2hvc3RzID8gTlVMTCA6CisJCSAgICBfUEFUSF9TU0hfVVNFUl9IT1NURklMRTIpOworCX0KKworCWlmIChob3N0X3N0YXR1cyA9PSBIT1NUX09LKSB7CisJCWlmIChrZXlfaXNfY2VydChrZXkpKSB7CisJCQlmcCA9IGtleV9maW5nZXJwcmludChrZXktPmNlcnQtPnNpZ25hdHVyZV9rZXksCisJCQkgICAgU1NIX0ZQX01ENSwgU1NIX0ZQX0hFWCk7CisJCQl2ZXJib3NlKCJBY2NlcHRlZCBjZXJ0aWZpY2F0ZSBJRCBcIiVzXCIgc2lnbmVkIGJ5ICIKKwkJCSAgICAiJXMgQ0EgJXMgZnJvbSAlc0AlcyIsIGtleS0+Y2VydC0+a2V5X2lkLAorCQkJICAgIGtleV90eXBlKGtleS0+Y2VydC0+c2lnbmF0dXJlX2tleSksIGZwLAorCQkJICAgIGN1c2VyLCBsb29rdXApOworCQl9IGVsc2UgeworCQkJZnAgPSBrZXlfZmluZ2VycHJpbnQoa2V5LCBTU0hfRlBfTUQ1LCBTU0hfRlBfSEVYKTsKKwkJCXZlcmJvc2UoIkFjY2VwdGVkICVzIHB1YmxpYyBrZXkgJXMgZnJvbSAlc0AlcyIsCisJCQkgICAga2V5X3R5cGUoa2V5KSwgZnAsIGN1c2VyLCBsb29rdXApOworCQl9CisJCXhmcmVlKGZwKTsKKwl9CisKKwlyZXR1cm4gKGhvc3Rfc3RhdHVzID09IEhPU1RfT0spOworfQorCitBdXRobWV0aG9kIG1ldGhvZF9ob3N0YmFzZWQgPSB7CisJImhvc3RiYXNlZCIsCisJdXNlcmF1dGhfaG9zdGJhc2VkLAorCSZvcHRpb25zLmhvc3RiYXNlZF9hdXRoZW50aWNhdGlvbgorfTsKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvYXV0aDItanBha2UuYyBiL29wZW5zc2gtNi4wcDEvYXV0aDItanBha2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDYwZTgyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9hdXRoMi1qcGFrZS5jCkBAIC0wLDAgKzEsNTYzIEBACisvKiAkT3BlbkJTRDogYXV0aDItanBha2UuYyx2IDEuNCAyMDEwLzA4LzMxIDExOjU0OjQ1IGRqbSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBEYW1pZW4gTWlsbGVyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogU2VydmVyIHNpZGUgb2YgemVyby1rbm93bGVkZ2UgcGFzc3dvcmQgYXV0aCB1c2luZyBKLVBBS0UgcHJvdG9jb2wKKyAqIGFzIGRlc2NyaWJlZCBpbjoKKyAqCisgKiBGLiBIYW8sIFAuIFJ5YW4sICJQYXNzd29yZCBBdXRoZW50aWNhdGVkIEtleSBFeGNoYW5nZSBieSBKdWdnbGluZyIsCisgKiAxNnRoIFdvcmtzaG9wIG9uIFNlY3VyaXR5IFByb3RvY29scywgQ2FtYnJpZGdlLCBBcHJpbCAyMDA4CisgKgorICogaHR0cDovL2dyb3VwZXIuaWVlZS5vcmcvZ3JvdXBzLzEzNjMvUmVzZWFyY2gvY29udHJpYnV0aW9ucy9oYW8tcnlhbi0yMDA4LnBkZgorICovCisKKyNpZmRlZiBKUEFLRQorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxvZ2luX2NhcC5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAic3NoMi5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgImhvc3RmaWxlLmgiCisjaW5jbHVkZSAiYXV0aC5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgInBhY2tldC5oIgorI2luY2x1ZGUgImRpc3BhdGNoLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAic2VydmNvbmYuaCIKKyNpbmNsdWRlICJhdXRoLW9wdGlvbnMuaCIKKyNpbmNsdWRlICJjYW5vaG9zdC5oIgorI2lmZGVmIEdTU0FQSQorI2luY2x1ZGUgInNzaC1nc3MuaCIKKyNlbmRpZgorI2luY2x1ZGUgIm1vbml0b3Jfd3JhcC5oIgorCisjaW5jbHVkZSAic2Nobm9yci5oIgorI2luY2x1ZGUgImpwYWtlLmgiCisKKy8qCisgKiBYWFggb3B0aW9ucy0+cGVybWl0X2VtcHR5X3Bhc3N3ZCAoYXQgdGhlIG1vbWVudCwgdGhleSB3aWxsIGJlIHJlZnVzZWQKKyAqIGFueXdheSBiZWNhdXNlIHRoZXkgd2lsbCBtaXNtYXRjaCBvbiBmYWtlIHNhbHQuCisgKi8KKworLyogRGlzcGF0Y2ggaGFuZGxlcnMgKi8KK3N0YXRpYyB2b2lkIGlucHV0X3VzZXJhdXRoX2pwYWtlX2NsaWVudF9zdGVwMShpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKK3N0YXRpYyB2b2lkIGlucHV0X3VzZXJhdXRoX2pwYWtlX2NsaWVudF9zdGVwMihpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKK3N0YXRpYyB2b2lkIGlucHV0X3VzZXJhdXRoX2pwYWtlX2NsaWVudF9jb25maXJtKGludCwgdV9pbnQzMl90LCB2b2lkICopOworCitzdGF0aWMgaW50IGF1dGgyX2pwYWtlX3N0YXJ0KEF1dGhjdHh0ICopOworCisvKiBpbXBvcnQgKi8KK2V4dGVybiBTZXJ2ZXJPcHRpb25zIG9wdGlvbnM7CitleHRlcm4gdV9jaGFyICpzZXNzaW9uX2lkMjsKK2V4dGVybiB1X2ludCBzZXNzaW9uX2lkMl9sZW47CisKKy8qCisgKiBBdHRlbXB0IEotUEFLRSBhdXRoZW50aWNhdGlvbi4KKyAqLworc3RhdGljIGludAordXNlcmF1dGhfanBha2UoQXV0aGN0eHQgKmF1dGhjdHh0KQoreworCWludCBhdXRoZW50aWNhdGVkID0gMDsKKworCXBhY2tldF9jaGVja19lb20oKTsKKworCWRlYnVnKCJqcGFrZS0wMUBvcGVuc3NoLmNvbSByZXF1ZXN0ZWQiKTsKKworCWlmIChhdXRoY3R4dC0+dXNlciAhPSBOVUxMKSB7CisJCWlmIChhdXRoY3R4dC0+anBha2VfY3R4ID09IE5VTEwpCisJCQlhdXRoY3R4dC0+anBha2VfY3R4ID0ganBha2VfbmV3KCk7CisJCWlmIChvcHRpb25zLnplcm9fa25vd2xlZGdlX3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uKQorCQkJYXV0aGVudGljYXRlZCA9IGF1dGgyX2pwYWtlX3N0YXJ0KGF1dGhjdHh0KTsKKwl9CisKKwlyZXR1cm4gYXV0aGVudGljYXRlZDsKK30KKworQXV0aG1ldGhvZCBtZXRob2RfanBha2UgPSB7CisJImpwYWtlLTAxQG9wZW5zc2guY29tIiwKKwl1c2VyYXV0aF9qcGFrZSwKKwkmb3B0aW9ucy56ZXJvX2tub3dsZWRnZV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbgorfTsKKworLyogQ2xlYXIgY29udGV4dCBhbmQgY2FsbGJhY2tzICovCit2b2lkCithdXRoMl9qcGFrZV9zdG9wKEF1dGhjdHh0ICphdXRoY3R4dCkKK3sKKwkvKiB1bnJlZ2lzdGVyIGNhbGxiYWNrcyAqLworCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9KUEFLRV9DTElFTlRfU1RFUDEsIE5VTEwpOworCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9KUEFLRV9DTElFTlRfU1RFUDIsIE5VTEwpOworCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9KUEFLRV9DTElFTlRfQ09ORklSTSwgTlVMTCk7CisJaWYgKGF1dGhjdHh0LT5qcGFrZV9jdHggIT0gTlVMTCkgeworCQlqcGFrZV9mcmVlKGF1dGhjdHh0LT5qcGFrZV9jdHgpOworCQlhdXRoY3R4dC0+anBha2VfY3R4ID0gTlVMTDsKKwl9Cit9CisKKy8qIFJldHVybnMgMSBpZiAnYycgaXMgYSB2YWxpZCBjcnlwdCgzKSBzYWx0IGNoYXJhY3RlciwgMCBvdGhlcndpc2UgKi8KK3N0YXRpYyBpbnQKK3ZhbGlkX2NyeXB0X3NhbHQoaW50IGMpCit7CisJaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKQorCQlyZXR1cm4gMTsKKwlpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpCisJCXJldHVybiAxOworCWlmIChjID49ICcuJyAmJiBjIDw9ICc5JykKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZXJpdmUgZmFrZSBzYWx0IGFzIEgodXNlcm5hbWUgfHwgZmlyc3RfcHJpdmF0ZV9ob3N0X2tleSkKKyAqIFRoaXMgcHJvdmlkZXMgcmVsYXRpdmVseSBzdGFibGUgZmFrZSBzYWx0cyBmb3Igbm9uLWV4aXN0ZW50CisgKiB1c2VycyBhbmQgYXZvaWRzIHRoZSBqcGFrZSBtZXRob2QgYmVjb21pbmcgYW4gYWNjb3VudCB2YWxpZGl0eQorICogb3JhY2xlLgorICovCitzdGF0aWMgdm9pZAorZGVyaXZlX3Jhd3NhbHQoY29uc3QgY2hhciAqdXNlcm5hbWUsIHVfY2hhciAqcmF3c2FsdCwgdV9pbnQgbGVuKQoreworCXVfY2hhciAqZGlnZXN0OworCXVfaW50IGRpZ2VzdF9sZW47CisJQnVmZmVyIGI7CisJS2V5ICprOworCisJYnVmZmVyX2luaXQoJmIpOworCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwgdXNlcm5hbWUpOworCWlmICgoayA9IGdldF9ob3N0a2V5X2J5X2luZGV4KDApKSA9PSBOVUxMIHx8CisJICAgIChrLT5mbGFncyAmIEtFWV9GTEFHX0VYVCkpCisJCWZhdGFsKCIlczogbm8gaG9zdGtleXMiLCBfX2Z1bmNfXyk7CisJc3dpdGNoIChrLT50eXBlKSB7CisJY2FzZSBLRVlfUlNBMToKKwljYXNlIEtFWV9SU0E6CisJCWlmIChrLT5yc2EtPnAgPT0gTlVMTCB8fCBrLT5yc2EtPnEgPT0gTlVMTCkKKwkJCWZhdGFsKCIlczogUlNBIGtleSBtaXNzaW5nIHAgYW5kL29yIHEiLCBfX2Z1bmNfXyk7CisJCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYiwgay0+cnNhLT5wKTsKKwkJYnVmZmVyX3B1dF9iaWdudW0yKCZiLCBrLT5yc2EtPnEpOworCQlicmVhazsKKwljYXNlIEtFWV9EU0E6CisJCWlmIChrLT5kc2EtPnByaXZfa2V5ID09IE5VTEwpCisJCQlmYXRhbCgiJXM6IERTQSBrZXkgbWlzc2luZyBwcml2X2tleSIsIF9fZnVuY19fKTsKKwkJYnVmZmVyX3B1dF9iaWdudW0yKCZiLCBrLT5kc2EtPnByaXZfa2V5KTsKKwkJYnJlYWs7CisJY2FzZSBLRVlfRUNEU0E6CisJCWlmIChFQ19LRVlfZ2V0MF9wcml2YXRlX2tleShrLT5lY2RzYSkgPT0gTlVMTCkKKwkJCWZhdGFsKCIlczogRUNEU0Ega2V5IG1pc3NpbmcgcHJpdl9rZXkiLCBfX2Z1bmNfXyk7CisJCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYiwgRUNfS0VZX2dldDBfcHJpdmF0ZV9rZXkoay0+ZWNkc2EpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZmF0YWwoIiVzOiB1bmtub3duIGtleSB0eXBlICVkIiwgX19mdW5jX18sIGstPnR5cGUpOworCX0KKwlpZiAoaGFzaF9idWZmZXIoYnVmZmVyX3B0cigmYiksIGJ1ZmZlcl9sZW4oJmIpLCBFVlBfc2hhMjU2KCksCisJICAgICZkaWdlc3QsICZkaWdlc3RfbGVuKSAhPSAwKQorCQlmYXRhbCgiJXM6IGhhc2hfYnVmZmVyIiwgX19mdW5jX18pOworCWJ1ZmZlcl9mcmVlKCZiKTsKKwlpZiAobGVuID4gZGlnZXN0X2xlbikKKwkJZmF0YWwoIiVzOiBub3QgZW5vdWdoIGJ5dGVzIGZvciByYXdzYWx0ICh3YW50ICV1IGhhdmUgJXUpIiwKKwkJICAgIF9fZnVuY19fLCBsZW4sIGRpZ2VzdF9sZW4pOworCW1lbWNweShyYXdzYWx0LCBkaWdlc3QsIGxlbik7CisJYnplcm8oZGlnZXN0LCBkaWdlc3RfbGVuKTsKKwl4ZnJlZShkaWdlc3QpOworfQorCisvKiBBU0NJSSBhbiBpbnRlZ2VyIFswLCA2NCkgZm9yIGluY2x1c2lvbiBpbiBhIHBhc3N3b3JkL3NhbHQgKi8KK3N0YXRpYyBjaGFyCitwd19lbmNvZGU2NCh1X2ludCBpNjQpCit7CisJY29uc3QgdV9jaGFyIGU2NFtdID0KKwkgICAgIi4vMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworCXJldHVybiBlNjRbaTY0ICUgNjRdOworfQorCisvKiBHZW5lcmF0ZSBBU0NJSSBzYWx0IGJ5dGVzIGZvciB1c2VyICovCitzdGF0aWMgY2hhciAqCittYWtlc2FsdCh1X2ludCB3YW50LCBjb25zdCBjaGFyICp1c2VyKQoreworCXVfY2hhciByYXdzYWx0WzMyXTsKKwlzdGF0aWMgY2hhciByZXRbMzNdOworCXVfaW50IGk7CisKKwlpZiAod2FudCA+IHNpemVvZihyZXQpIC0gMSkKKwkJZmF0YWwoIiVzOiB3YW50ICV1IiwgX19mdW5jX18sIHdhbnQpOworCisJZGVyaXZlX3Jhd3NhbHQodXNlciwgcmF3c2FsdCwgc2l6ZW9mKHJhd3NhbHQpKTsKKwliemVybyhyZXQsIHNpemVvZihyZXQpKTsKKwlmb3IgKGkgPSAwOyBpIDwgd2FudDsgaSsrKQorCQlyZXRbaV0gPSBwd19lbmNvZGU2NChyYXdzYWx0W2ldKTsKKwliemVybyhyYXdzYWx0LCBzaXplb2YocmF3c2FsdCkpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFNlbGVjdCB0aGUgc3lzdGVtJ3MgZGVmYXVsdCBwYXNzd29yZCBoYXNoaW5nIHNjaGVtZSBhbmQgZ2VuZXJhdGUKKyAqIGEgc3RhYmxlIGZha2Ugc2FsdCB1bmRlciBpdCBmb3IgdXNlIGJ5IGEgbm9uLWV4aXN0ZW50IGFjY291bnQuCisgKiBQcmV2ZW50cyBqcGFrZSBtZXRob2QgYmVpbmcgdXNlZCB0byBpbmZlciB0aGUgdmFsaWRpdHkgb2YgYWNjb3VudHMuCisgKi8KK3N0YXRpYyB2b2lkCitmYWtlX3NhbHRfYW5kX3NjaGVtZShBdXRoY3R4dCAqYXV0aGN0eHQsIGNoYXIgKipzYWx0LCBjaGFyICoqc2NoZW1lKQoreworCWNoYXIgKnJvdW5kc19zLCAqc3R5bGU7CisJbG9uZyBsb25nIHJvdW5kczsKKwlsb2dpbl9jYXBfdCAqbGM7CisKKworCWlmICgobGMgPSBsb2dpbl9nZXRjbGFzcyhhdXRoY3R4dC0+cHctPnB3X2NsYXNzKSkgPT0gTlVMTCAmJgorCSAgICAobGMgPSBsb2dpbl9nZXRjbGFzcyhOVUxMKSkgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBsb2dpbl9nZXRjbGFzcyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJc3R5bGUgPSBsb2dpbl9nZXRjYXBzdHIobGMsICJsb2NhbGNpcGhlciIsIE5VTEwsIE5VTEwpOworCWlmIChzdHlsZSA9PSBOVUxMKQorCQlzdHlsZSA9IHhzdHJkdXAoImJsb3dmaXNoLDYiKTsKKwlsb2dpbl9jbG9zZShsYyk7CisJCisJaWYgKChyb3VuZHNfcyA9IHN0cmNocihzdHlsZSwgJywnKSkgIT0gTlVMTCkKKwkJKnJvdW5kc19zKysgPSAnXDAnOworCXJvdW5kcyA9IHN0cnRvbnVtKHJvdW5kc19zLCAxLCAxPDwzMSwgTlVMTCk7CisJCisJaWYgKHN0cmNtcChzdHlsZSwgIm1kNSIpID09IDApIHsKKwkJeGFzcHJpbnRmKHNhbHQsICIkMSQlcyQiLCBtYWtlc2FsdCg4LCBhdXRoY3R4dC0+dXNlcikpOworCQkqc2NoZW1lID0geHN0cmR1cCgibWQ1Iik7CisJfSBlbHNlIGlmIChzdHJjbXAoc3R5bGUsICJvbGQiKSA9PSAwKSB7CisJCSpzYWx0ID0geHN0cmR1cChtYWtlc2FsdCgyLCBhdXRoY3R4dC0+dXNlcikpOworCQkqc2NoZW1lID0geHN0cmR1cCgiY3J5cHQiKTsKKwl9IGVsc2UgaWYgKHN0cmNtcChzdHlsZSwgIm5ld3NhbHQiKSA9PSAwKSB7CisJCXJvdW5kcyA9IE1BWChyb3VuZHMsIDcyNTApOworCQlyb3VuZHMgPSBNSU4ocm91bmRzLCAoMTw8MjQpIC0gMSk7CisJCXhhc3ByaW50ZihzYWx0LCAiXyVjJWMlYyVjJXMiLAorCQkgICAgcHdfZW5jb2RlNjQocm91bmRzKSwgcHdfZW5jb2RlNjQocm91bmRzID4+IDYpLAorCQkgICAgcHdfZW5jb2RlNjQocm91bmRzID4+IDEyKSwgcHdfZW5jb2RlNjQocm91bmRzID4+IDE4KSwKKwkJICAgIG1ha2VzYWx0KDQsIGF1dGhjdHh0LT51c2VyKSk7CisJCSpzY2hlbWUgPSB4c3RyZHVwKCJjcnlwdC1leHRlbmRlZCIpOworCX0gZWxzZSB7CisJCS8qIERlZmF1bHQgdG8gYmxvd2Zpc2ggKi8KKwkJcm91bmRzID0gTUFYKHJvdW5kcywgMyk7CisJCXJvdW5kcyA9IE1JTihyb3VuZHMsIDMxKTsKKwkJeGFzcHJpbnRmKHNhbHQsICIkMmEkJTAybGxkJCVzIiwgcm91bmRzLAorCQkgICAgbWFrZXNhbHQoMjIsIGF1dGhjdHh0LT51c2VyKSk7CisJCSpzY2hlbWUgPSB4c3RyZHVwKCJiY3J5cHQiKTsKKwl9CisJeGZyZWUoc3R5bGUpOworCWRlYnVnMygiJXM6IGZha2UgJXMgc2FsdCBmb3IgdXNlciAlczogJXMiLAorCSAgICBfX2Z1bmNfXywgKnNjaGVtZSwgYXV0aGN0eHQtPnVzZXIsICpzYWx0KTsKK30KKworLyoKKyAqIEZldGNoIHBhc3N3b3JkIGhhc2hpbmcgc2NoZW1lLCBwYXNzd29yZCBzYWx0IGFuZCBkZXJpdmUgc2hhcmVkIHNlY3JldAorICogZm9yIHVzZXIuIElmIHVzZXIgZG9lcyBub3QgZXhpc3QsIGEgZmFrZSBidXQgc3RhYmxlIGFuZCB1c2VyLXVuaXF1ZQorICogc2FsdCB3aWxsIGJlIHJldHVybmVkLgorICovCit2b2lkCithdXRoMl9qcGFrZV9nZXRfcHdkYXRhKEF1dGhjdHh0ICphdXRoY3R4dCwgQklHTlVNICoqcywKKyAgICBjaGFyICoqaGFzaF9zY2hlbWUsIGNoYXIgKipzYWx0KQoreworCWNoYXIgKmNwOworCXVfY2hhciAqc2VjcmV0OworCXVfaW50IHNlY3JldF9sZW4sIHNhbHRfbGVuOworCisjaWZkZWYgSlBBS0VfREVCVUcKKwlkZWJ1ZzMoIiVzOiB2YWxpZCAlZCBwdyAlLjVzLi4uIiwgX19mdW5jX18sCisJICAgIGF1dGhjdHh0LT52YWxpZCwgYXV0aGN0eHQtPnB3LT5wd19wYXNzd2QpOworI2VuZGlmCisKKwkqc2FsdCA9IE5VTEw7CisJKmhhc2hfc2NoZW1lID0gTlVMTDsKKwlpZiAoYXV0aGN0eHQtPnZhbGlkKSB7CisJCWlmIChzdHJuY21wKGF1dGhjdHh0LT5wdy0+cHdfcGFzc3dkLCAiJDIkIiwgMykgPT0gMCAmJgorCQkgICAgc3RybGVuKGF1dGhjdHh0LT5wdy0+cHdfcGFzc3dkKSA+IDI4KSB7CisJCQkvKgorCQkJICogb2xkLXZhcmlhbnQgYmNyeXB0OgorCQkJICogICAgICIkMiQiLCAyIGRpZ2l0IHJvdW5kcywgIiQiLCAyMiBieXRlcyBzYWx0CisJCQkgKi8KKwkJCXNhbHRfbGVuID0gMyArIDIgKyAxICsgMjIgKyAxOworCQkJKnNhbHQgPSB4bWFsbG9jKHNhbHRfbGVuKTsKKwkJCXN0cmxjcHkoKnNhbHQsIGF1dGhjdHh0LT5wdy0+cHdfcGFzc3dkLCBzYWx0X2xlbik7CisJCQkqaGFzaF9zY2hlbWUgPSB4c3RyZHVwKCJiY3J5cHQiKTsKKwkJfSBlbHNlIGlmIChzdHJuY21wKGF1dGhjdHh0LT5wdy0+cHdfcGFzc3dkLCAiJDJhJCIsIDQpID09IDAgJiYKKwkJICAgIHN0cmxlbihhdXRoY3R4dC0+cHctPnB3X3Bhc3N3ZCkgPiAyOSkgeworCQkJLyoKKwkJCSAqIGN1cnJlbnQtdmFyaWFudCBiY3J5cHQ6CisJCQkgKiAgICAgIiQyYSQiLCAyIGRpZ2l0IHJvdW5kcywgIiQiLCAyMiBieXRlcyBzYWx0CisJCQkgKi8KKwkJCXNhbHRfbGVuID0gNCArIDIgKyAxICsgMjIgKyAxOworCQkJKnNhbHQgPSB4bWFsbG9jKHNhbHRfbGVuKTsKKwkJCXN0cmxjcHkoKnNhbHQsIGF1dGhjdHh0LT5wdy0+cHdfcGFzc3dkLCBzYWx0X2xlbik7CisJCQkqaGFzaF9zY2hlbWUgPSB4c3RyZHVwKCJiY3J5cHQiKTsKKwkJfSBlbHNlIGlmIChzdHJuY21wKGF1dGhjdHh0LT5wdy0+cHdfcGFzc3dkLCAiJDEkIiwgMykgPT0gMCAmJgorCQkgICAgc3RybGVuKGF1dGhjdHh0LT5wdy0+cHdfcGFzc3dkKSA+IDUpIHsKKwkJCS8qCisJCQkgKiBtZDVjcnlwdDoKKwkJCSAqICAgICAiJDEkIiwgc2FsdCB1bnRpbCAiJCIKKwkJCSAqLworCQkJY3AgPSBzdHJjaHIoYXV0aGN0eHQtPnB3LT5wd19wYXNzd2QgKyAzLCAnJCcpOworCQkJaWYgKGNwICE9IE5VTEwpIHsKKwkJCQlzYWx0X2xlbiA9IChjcCAtIGF1dGhjdHh0LT5wdy0+cHdfcGFzc3dkKSArIDE7CisJCQkJKnNhbHQgPSB4bWFsbG9jKHNhbHRfbGVuKTsKKwkJCQlzdHJsY3B5KCpzYWx0LCBhdXRoY3R4dC0+cHctPnB3X3Bhc3N3ZCwKKwkJCQkgICAgc2FsdF9sZW4pOworCQkJCSpoYXNoX3NjaGVtZSA9IHhzdHJkdXAoIm1kNWNyeXB0Iik7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RybmNtcChhdXRoY3R4dC0+cHctPnB3X3Bhc3N3ZCwgIl8iLCAxKSA9PSAwICYmCisJCSAgICBzdHJsZW4oYXV0aGN0eHQtPnB3LT5wd19wYXNzd2QpID4gOSkgeworCQkJLyoKKwkJCSAqIEJTREkgZXh0ZW5kZWQgY3J5cHQ6CisJCQkgKiAgICAgIl8iLCA0IGRpZ2l0cyBjb3VudCwgNCBjaGFycyBzYWx0CisJCQkgKi8KKwkJCXNhbHRfbGVuID0gMSArIDQgKyA0ICsgMTsKKwkJCSpzYWx0ID0geG1hbGxvYyhzYWx0X2xlbik7CisJCQlzdHJsY3B5KCpzYWx0LCBhdXRoY3R4dC0+cHctPnB3X3Bhc3N3ZCwgc2FsdF9sZW4pOworCQkJKmhhc2hfc2NoZW1lID0geHN0cmR1cCgiY3J5cHQtZXh0ZW5kZWQiKTsKKwkJfSBlbHNlIGlmIChzdHJsZW4oYXV0aGN0eHQtPnB3LT5wd19wYXNzd2QpID09IDEzICAmJgorCQkgICAgdmFsaWRfY3J5cHRfc2FsdChhdXRoY3R4dC0+cHctPnB3X3Bhc3N3ZFswXSkgJiYKKwkJICAgIHZhbGlkX2NyeXB0X3NhbHQoYXV0aGN0eHQtPnB3LT5wd19wYXNzd2RbMV0pKSB7CisJCQkvKgorCQkJICogdHJhZGl0aW9uYWwgY3J5cHQ6CisJCQkgKiAgICAgMiBjaGFycyBzYWx0CisJCQkgKi8KKwkJCXNhbHRfbGVuID0gMiArIDE7CisJCQkqc2FsdCA9IHhtYWxsb2Moc2FsdF9sZW4pOworCQkJc3RybGNweSgqc2FsdCwgYXV0aGN0eHQtPnB3LT5wd19wYXNzd2QsIHNhbHRfbGVuKTsKKwkJCSpoYXNoX3NjaGVtZSA9IHhzdHJkdXAoImNyeXB0Iik7CisJCX0KKwkJaWYgKCpzYWx0ID09IE5VTEwpIHsKKwkJCWRlYnVnKCIlczogdW5yZWNvZ25pc2VkIGNyeXB0IHNjaGVtZSBmb3IgdXNlciAlcyIsCisJCQkgICAgX19mdW5jX18sIGF1dGhjdHh0LT5wdy0+cHdfbmFtZSk7CisJCX0KKwl9CisJaWYgKCpzYWx0ID09IE5VTEwpCisJCWZha2Vfc2FsdF9hbmRfc2NoZW1lKGF1dGhjdHh0LCBzYWx0LCBoYXNoX3NjaGVtZSk7CisKKwlpZiAoaGFzaF9idWZmZXIoYXV0aGN0eHQtPnB3LT5wd19wYXNzd2QsCisJICAgIHN0cmxlbihhdXRoY3R4dC0+cHctPnB3X3Bhc3N3ZCksIEVWUF9zaGEyNTYoKSwKKwkgICAgJnNlY3JldCwgJnNlY3JldF9sZW4pICE9IDApCisJCWZhdGFsKCIlczogaGFzaF9idWZmZXIiLCBfX2Z1bmNfXyk7CisJaWYgKCgqcyA9IEJOX2JpbjJibihzZWNyZXQsIHNlY3JldF9sZW4sIE5VTEwpKSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IEJOX2JpbjJibiAoc2VjcmV0KSIsIF9fZnVuY19fKTsKKyNpZmRlZiBKUEFLRV9ERUJVRworCWRlYnVnMygiJXM6IHNhbHQgPSAlcyAobGVuICV1KSIsIF9fZnVuY19fLAorCSAgICAqc2FsdCwgKHVfaW50KXN0cmxlbigqc2FsdCkpOworCWRlYnVnMygiJXM6IHNjaGVtZSA9ICVzIiwgX19mdW5jX18sICpoYXNoX3NjaGVtZSk7CisJSlBBS0VfREVCVUdfQk4oKCpzLCAiJXM6IHMgPSAiLCBfX2Z1bmNfXykpOworI2VuZGlmCisJYnplcm8oc2VjcmV0LCBzZWNyZXRfbGVuKTsKKwl4ZnJlZShzZWNyZXQpOworfQorCisvKgorICogQmVnaW4gYXV0aGVudGljYXRpb24gYXR0ZW1wdC4KKyAqIE5vdGUsIHNldHMgYXV0aGN0eHQtPnBvc3Rwb25lZCB3aGlsZSBpbiBzdWJwcm90b2NvbAorICovCitzdGF0aWMgaW50CithdXRoMl9qcGFrZV9zdGFydChBdXRoY3R4dCAqYXV0aGN0eHQpCit7CisJc3RydWN0IGpwYWtlX2N0eCAqcGN0eCA9IGF1dGhjdHh0LT5qcGFrZV9jdHg7CisJdV9jaGFyICp4M19wcm9vZiwgKng0X3Byb29mOworCXVfaW50IHgzX3Byb29mX2xlbiwgeDRfcHJvb2ZfbGVuOworCWNoYXIgKnNhbHQsICpoYXNoX3NjaGVtZTsKKworCWRlYnVnKCIlczogc3RhcnQiLCBfX2Z1bmNfXyk7CisKKwlQUklWU0VQKGpwYWtlX3N0ZXAxKHBjdHgtPmdycCwKKwkgICAgJnBjdHgtPnNlcnZlcl9pZCwgJnBjdHgtPnNlcnZlcl9pZF9sZW4sCisJICAgICZwY3R4LT54MywgJnBjdHgtPng0LCAmcGN0eC0+Z194MywgJnBjdHgtPmdfeDQsCisJICAgICZ4M19wcm9vZiwgJngzX3Byb29mX2xlbiwKKwkgICAgJng0X3Byb29mLCAmeDRfcHJvb2ZfbGVuKSk7CisKKwlQUklWU0VQKGF1dGgyX2pwYWtlX2dldF9wd2RhdGEoYXV0aGN0eHQsICZwY3R4LT5zLAorCSAgICAmaGFzaF9zY2hlbWUsICZzYWx0KSk7CisKKwlpZiAoIXVzZV9wcml2c2VwKQorCQlKUEFLRV9ERUJVR19DVFgoKHBjdHgsICJzdGVwIDEgc2VuZGluZyBpbiAlcyIsIF9fZnVuY19fKSk7CisKKwlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfVVNFUkFVVEhfSlBBS0VfU0VSVkVSX1NURVAxKTsKKwlwYWNrZXRfcHV0X2NzdHJpbmcoaGFzaF9zY2hlbWUpOworCXBhY2tldF9wdXRfY3N0cmluZyhzYWx0KTsKKwlwYWNrZXRfcHV0X3N0cmluZyhwY3R4LT5zZXJ2ZXJfaWQsIHBjdHgtPnNlcnZlcl9pZF9sZW4pOworCXBhY2tldF9wdXRfYmlnbnVtMihwY3R4LT5nX3gzKTsKKwlwYWNrZXRfcHV0X2JpZ251bTIocGN0eC0+Z194NCk7CisJcGFja2V0X3B1dF9zdHJpbmcoeDNfcHJvb2YsIHgzX3Byb29mX2xlbik7CisJcGFja2V0X3B1dF9zdHJpbmcoeDRfcHJvb2YsIHg0X3Byb29mX2xlbik7CisJcGFja2V0X3NlbmQoKTsKKwlwYWNrZXRfd3JpdGVfd2FpdCgpOworCisJYnplcm8oaGFzaF9zY2hlbWUsIHN0cmxlbihoYXNoX3NjaGVtZSkpOworCWJ6ZXJvKHNhbHQsIHN0cmxlbihzYWx0KSk7CisJeGZyZWUoaGFzaF9zY2hlbWUpOworCXhmcmVlKHNhbHQpOworCWJ6ZXJvKHgzX3Byb29mLCB4M19wcm9vZl9sZW4pOworCWJ6ZXJvKHg0X3Byb29mLCB4NF9wcm9vZl9sZW4pOworCXhmcmVlKHgzX3Byb29mKTsKKwl4ZnJlZSh4NF9wcm9vZik7CisKKwkvKiBFeHBlY3Qgc3RlcCAxIHBhY2tldCBmcm9tIHBlZXIgKi8KKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfSlBBS0VfQ0xJRU5UX1NURVAxLAorCSAgICBpbnB1dF91c2VyYXV0aF9qcGFrZV9jbGllbnRfc3RlcDEpOworCisJYXV0aGN0eHQtPnBvc3Rwb25lZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAoraW5wdXRfdXNlcmF1dGhfanBha2VfY2xpZW50X3N0ZXAxKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQoreworCUF1dGhjdHh0ICphdXRoY3R4dCA9IGN0eHQ7CisJc3RydWN0IGpwYWtlX2N0eCAqcGN0eCA9IGF1dGhjdHh0LT5qcGFrZV9jdHg7CisJdV9jaGFyICp4MV9wcm9vZiwgKngyX3Byb29mLCAqeDRfc19wcm9vZjsKKwl1X2ludCB4MV9wcm9vZl9sZW4sIHgyX3Byb29mX2xlbiwgeDRfc19wcm9vZl9sZW47CisKKwkvKiBEaXNhYmxlIHRoaXMgbWVzc2FnZSAqLworCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9KUEFLRV9DTElFTlRfU1RFUDEsIE5VTEwpOworCisJLyogRmV0Y2ggc3RlcCAxIHZhbHVlcyAqLworCWlmICgocGN0eC0+Z194MSA9IEJOX25ldygpKSA9PSBOVUxMIHx8CisJICAgIChwY3R4LT5nX3gyID0gQk5fbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCIlczogQk5fbmV3IiwgX19mdW5jX18pOworCXBjdHgtPmNsaWVudF9pZCA9IHBhY2tldF9nZXRfc3RyaW5nKCZwY3R4LT5jbGllbnRfaWRfbGVuKTsKKwlwYWNrZXRfZ2V0X2JpZ251bTIocGN0eC0+Z194MSk7CisJcGFja2V0X2dldF9iaWdudW0yKHBjdHgtPmdfeDIpOworCXgxX3Byb29mID0gcGFja2V0X2dldF9zdHJpbmcoJngxX3Byb29mX2xlbik7CisJeDJfcHJvb2YgPSBwYWNrZXRfZ2V0X3N0cmluZygmeDJfcHJvb2ZfbGVuKTsKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisKKwlpZiAoIXVzZV9wcml2c2VwKQorCQlKUEFLRV9ERUJVR19DVFgoKHBjdHgsICJzdGVwIDEgcmVjZWl2ZWQgaW4gJXMiLCBfX2Z1bmNfXykpOworCisJUFJJVlNFUChqcGFrZV9zdGVwMihwY3R4LT5ncnAsIHBjdHgtPnMsIHBjdHgtPmdfeDMsCisJICAgIHBjdHgtPmdfeDEsIHBjdHgtPmdfeDIsIHBjdHgtPng0LAorCSAgICBwY3R4LT5jbGllbnRfaWQsIHBjdHgtPmNsaWVudF9pZF9sZW4sCisJICAgIHBjdHgtPnNlcnZlcl9pZCwgcGN0eC0+c2VydmVyX2lkX2xlbiwKKwkgICAgeDFfcHJvb2YsIHgxX3Byb29mX2xlbiwKKwkgICAgeDJfcHJvb2YsIHgyX3Byb29mX2xlbiwKKwkgICAgJnBjdHgtPmIsCisJICAgICZ4NF9zX3Byb29mLCAmeDRfc19wcm9vZl9sZW4pKTsKKworCWJ6ZXJvKHgxX3Byb29mLCB4MV9wcm9vZl9sZW4pOworCWJ6ZXJvKHgyX3Byb29mLCB4Ml9wcm9vZl9sZW4pOworCXhmcmVlKHgxX3Byb29mKTsKKwl4ZnJlZSh4Ml9wcm9vZik7CisKKwlpZiAoIXVzZV9wcml2c2VwKQorCQlKUEFLRV9ERUJVR19DVFgoKHBjdHgsICJzdGVwIDIgc2VuZGluZyBpbiAlcyIsIF9fZnVuY19fKSk7CisKKwkvKiBTZW5kIHZhbHVlcyBmb3Igc3RlcCAyICovCisJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX1VTRVJBVVRIX0pQQUtFX1NFUlZFUl9TVEVQMik7CisJcGFja2V0X3B1dF9iaWdudW0yKHBjdHgtPmIpOworCXBhY2tldF9wdXRfc3RyaW5nKHg0X3NfcHJvb2YsIHg0X3NfcHJvb2ZfbGVuKTsKKwlwYWNrZXRfc2VuZCgpOworCXBhY2tldF93cml0ZV93YWl0KCk7CisKKwliemVybyh4NF9zX3Byb29mLCB4NF9zX3Byb29mX2xlbik7CisJeGZyZWUoeDRfc19wcm9vZik7CisKKwkvKiBFeHBlY3Qgc3RlcCAyIHBhY2tldCBmcm9tIHBlZXIgKi8KKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfSlBBS0VfQ0xJRU5UX1NURVAyLAorCSAgICBpbnB1dF91c2VyYXV0aF9qcGFrZV9jbGllbnRfc3RlcDIpOworfQorCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK2lucHV0X3VzZXJhdXRoX2pwYWtlX2NsaWVudF9zdGVwMihpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKK3sKKwlBdXRoY3R4dCAqYXV0aGN0eHQgPSBjdHh0OworCXN0cnVjdCBqcGFrZV9jdHggKnBjdHggPSBhdXRoY3R4dC0+anBha2VfY3R4OworCXVfY2hhciAqeDJfc19wcm9vZjsKKwl1X2ludCB4Ml9zX3Byb29mX2xlbjsKKworCS8qIERpc2FibGUgdGhpcyBtZXNzYWdlICovCisJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0pQQUtFX0NMSUVOVF9TVEVQMiwgTlVMTCk7CisKKwlpZiAoKHBjdHgtPmEgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBCTl9uZXciLCBfX2Z1bmNfXyk7CisKKwkvKiBGZXRjaCBzdGVwIDIgdmFsdWVzICovCisJcGFja2V0X2dldF9iaWdudW0yKHBjdHgtPmEpOworCXgyX3NfcHJvb2YgPSBwYWNrZXRfZ2V0X3N0cmluZygmeDJfc19wcm9vZl9sZW4pOworCXBhY2tldF9jaGVja19lb20oKTsKKworCWlmICghdXNlX3ByaXZzZXApCisJCUpQQUtFX0RFQlVHX0NUWCgocGN0eCwgInN0ZXAgMiByZWNlaXZlZCBpbiAlcyIsIF9fZnVuY19fKSk7CisKKwkvKiBEZXJpdmUgc2hhcmVkIGtleSBhbmQgY2FsY3VsYXRlIGNvbmZpcm1hdGlvbiBoYXNoICovCisJUFJJVlNFUChqcGFrZV9rZXlfY29uZmlybShwY3R4LT5ncnAsIHBjdHgtPnMsIHBjdHgtPmEsCisJICAgIHBjdHgtPng0LCBwY3R4LT5nX3gzLCBwY3R4LT5nX3g0LCBwY3R4LT5nX3gxLCBwY3R4LT5nX3gyLAorCSAgICBwY3R4LT5zZXJ2ZXJfaWQsIHBjdHgtPnNlcnZlcl9pZF9sZW4sCisJICAgIHBjdHgtPmNsaWVudF9pZCwgcGN0eC0+Y2xpZW50X2lkX2xlbiwKKwkgICAgc2Vzc2lvbl9pZDIsIHNlc3Npb25faWQyX2xlbiwKKwkgICAgeDJfc19wcm9vZiwgeDJfc19wcm9vZl9sZW4sCisJICAgICZwY3R4LT5rLAorCSAgICAmcGN0eC0+aF9rX3NpZF9zZXNzaWQsICZwY3R4LT5oX2tfc2lkX3Nlc3NpZF9sZW4pKTsKKworCWJ6ZXJvKHgyX3NfcHJvb2YsIHgyX3NfcHJvb2ZfbGVuKTsKKwl4ZnJlZSh4Ml9zX3Byb29mKTsKKworCWlmICghdXNlX3ByaXZzZXApCisJCUpQQUtFX0RFQlVHX0NUWCgocGN0eCwgImNvbmZpcm0gc2VuZGluZyBpbiAlcyIsIF9fZnVuY19fKSk7CisKKwkvKiBTZW5kIGtleSBjb25maXJtYXRpb24gcHJvb2YgKi8KKwlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfVVNFUkFVVEhfSlBBS0VfU0VSVkVSX0NPTkZJUk0pOworCXBhY2tldF9wdXRfc3RyaW5nKHBjdHgtPmhfa19zaWRfc2Vzc2lkLCBwY3R4LT5oX2tfc2lkX3Nlc3NpZF9sZW4pOworCXBhY2tldF9zZW5kKCk7CisJcGFja2V0X3dyaXRlX3dhaXQoKTsKKworCS8qIEV4cGVjdCBjb25maXJtYXRpb24gZnJvbSBwZWVyICovCisJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0pQQUtFX0NMSUVOVF9DT05GSVJNLAorCSAgICBpbnB1dF91c2VyYXV0aF9qcGFrZV9jbGllbnRfY29uZmlybSk7Cit9CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAoraW5wdXRfdXNlcmF1dGhfanBha2VfY2xpZW50X2NvbmZpcm0oaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCit7CisJQXV0aGN0eHQgKmF1dGhjdHh0ID0gY3R4dDsKKwlzdHJ1Y3QganBha2VfY3R4ICpwY3R4ID0gYXV0aGN0eHQtPmpwYWtlX2N0eDsKKwlpbnQgYXV0aGVudGljYXRlZCA9IDA7CisKKwkvKiBEaXNhYmxlIHRoaXMgbWVzc2FnZSAqLworCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9KUEFLRV9DTElFTlRfQ09ORklSTSwgTlVMTCk7CisKKwlwY3R4LT5oX2tfY2lkX3Nlc3NpZCA9IHBhY2tldF9nZXRfc3RyaW5nKCZwY3R4LT5oX2tfY2lkX3Nlc3NpZF9sZW4pOworCXBhY2tldF9jaGVja19lb20oKTsKKworCWlmICghdXNlX3ByaXZzZXApCisJCUpQQUtFX0RFQlVHX0NUWCgocGN0eCwgImNvbmZpcm0gcmVjZWl2ZWQgaW4gJXMiLCBfX2Z1bmNfXykpOworCisJLyogVmVyaWZ5IGV4cGVjdGVkIGNvbmZpcm1hdGlvbiBoYXNoICovCisJaWYgKFBSSVZTRVAoanBha2VfY2hlY2tfY29uZmlybShwY3R4LT5rLAorCSAgICBwY3R4LT5jbGllbnRfaWQsIHBjdHgtPmNsaWVudF9pZF9sZW4sCisJICAgIHNlc3Npb25faWQyLCBzZXNzaW9uX2lkMl9sZW4sCisJICAgIHBjdHgtPmhfa19jaWRfc2Vzc2lkLCBwY3R4LT5oX2tfY2lkX3Nlc3NpZF9sZW4pKSA9PSAxKQorCQlhdXRoZW50aWNhdGVkID0gYXV0aGN0eHQtPnZhbGlkID8gMSA6IDA7CisJZWxzZQorCQlkZWJ1ZygiJXM6IGNvbmZpcm1hdGlvbiBtaXNtYXRjaCIsIF9fZnVuY19fKTsKKwkJCisJLyogZG9uZSAqLworCWF1dGhjdHh0LT5wb3N0cG9uZWQgPSAwOworCWpwYWtlX2ZyZWUoYXV0aGN0eHQtPmpwYWtlX2N0eCk7CisJYXV0aGN0eHQtPmpwYWtlX2N0eCA9IE5VTEw7CisJdXNlcmF1dGhfZmluaXNoKGF1dGhjdHh0LCBhdXRoZW50aWNhdGVkLCBtZXRob2RfanBha2UubmFtZSk7Cit9CisKKyNlbmRpZiAvKiBKUEFLRSAqLworCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2F1dGgyLWtiZGludC5jIGIvb3BlbnNzaC02LjBwMS9hdXRoMi1rYmRpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWU2N2RhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9hdXRoMi1rYmRpbnQuYwpAQCAtMCwwICsxLDY4IEBACisvKiAkT3BlbkJTRDogYXV0aDIta2JkaW50LmMsdiAxLjUgMjAwNi8wOC8wMyAwMzozNDo0MSBkZXJhYWR0IEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAicGFja2V0LmgiCisjaW5jbHVkZSAia2V5LmgiCisjaW5jbHVkZSAiaG9zdGZpbGUuaCIKKyNpbmNsdWRlICJhdXRoLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAic2VydmNvbmYuaCIKKworLyogaW1wb3J0ICovCitleHRlcm4gU2VydmVyT3B0aW9ucyBvcHRpb25zOworCitzdGF0aWMgaW50Cit1c2VyYXV0aF9rYmRpbnQoQXV0aGN0eHQgKmF1dGhjdHh0KQoreworCWludCBhdXRoZW50aWNhdGVkID0gMDsKKwljaGFyICpsYW5nLCAqZGV2czsKKworCWxhbmcgPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKKwlkZXZzID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7CisJcGFja2V0X2NoZWNrX2VvbSgpOworCisJZGVidWcoImtleWJvYXJkLWludGVyYWN0aXZlIGRldnMgJXMiLCBkZXZzKTsKKworCWlmIChvcHRpb25zLmNoYWxsZW5nZV9yZXNwb25zZV9hdXRoZW50aWNhdGlvbikKKwkJYXV0aGVudGljYXRlZCA9IGF1dGgyX2NoYWxsZW5nZShhdXRoY3R4dCwgZGV2cyk7CisKKwl4ZnJlZShkZXZzKTsKKwl4ZnJlZShsYW5nKTsKKwlyZXR1cm4gYXV0aGVudGljYXRlZDsKK30KKworQXV0aG1ldGhvZCBtZXRob2Rfa2JkaW50ID0geworCSJrZXlib2FyZC1pbnRlcmFjdGl2ZSIsCisJdXNlcmF1dGhfa2JkaW50LAorCSZvcHRpb25zLmtiZF9pbnRlcmFjdGl2ZV9hdXRoZW50aWNhdGlvbgorfTsKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvYXV0aDItbm9uZS5jIGIvb3BlbnNzaC02LjBwMS9hdXRoMi1ub25lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjNmM3NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvYXV0aDItbm9uZS5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qICRPcGVuQlNEOiBhdXRoMi1ub25lLmMsdiAxLjE2IDIwMTAvMDYvMjUgMDg6NDY6MTcgZGptIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImF0b21pY2lvLmgiCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgImhvc3RmaWxlLmgiCisjaW5jbHVkZSAiYXV0aC5oIgorI2luY2x1ZGUgInBhY2tldC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgInNlcnZjb25mLmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisjaW5jbHVkZSAic3NoMi5oIgorI2lmZGVmIEdTU0FQSQorI2luY2x1ZGUgInNzaC1nc3MuaCIKKyNlbmRpZgorI2luY2x1ZGUgIm1vbml0b3Jfd3JhcC5oIgorCisvKiBpbXBvcnQgKi8KK2V4dGVybiBTZXJ2ZXJPcHRpb25zIG9wdGlvbnM7CisKKy8qICJub25lIiBpcyBhbGxvd2VkIG9ubHkgb25lIHRpbWUgKi8KK3N0YXRpYyBpbnQgbm9uZV9lbmFibGVkID0gMTsKKworc3RhdGljIGludAordXNlcmF1dGhfbm9uZShBdXRoY3R4dCAqYXV0aGN0eHQpCit7CisJbm9uZV9lbmFibGVkID0gMDsKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisJaWYgKG9wdGlvbnMucGVybWl0X2VtcHR5X3Bhc3N3ZCAmJiBvcHRpb25zLnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uKQorCQlyZXR1cm4gKFBSSVZTRVAoYXV0aF9wYXNzd29yZChhdXRoY3R4dCwgIiIpKSk7CisJcmV0dXJuICgwKTsKK30KKworQXV0aG1ldGhvZCBtZXRob2Rfbm9uZSA9IHsKKwkibm9uZSIsCisJdXNlcmF1dGhfbm9uZSwKKwkmbm9uZV9lbmFibGVkCit9OwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9hdXRoMi1wYXNzd2QuYyBiL29wZW5zc2gtNi4wcDEvYXV0aDItcGFzc3dkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYxZjM2MwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvYXV0aDItcGFzc3dkLmMKQEAgLTAsMCArMSw4MCBAQAorLyogJE9wZW5CU0Q6IGF1dGgyLXBhc3N3ZC5jLHYgMS45IDIwMDYvMDgvMDMgMDM6MzQ6NDEgZGVyYWFkdCBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgInBhY2tldC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgImhvc3RmaWxlLmgiCisjaW5jbHVkZSAiYXV0aC5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2lmZGVmIEdTU0FQSQorI2luY2x1ZGUgInNzaC1nc3MuaCIKKyNlbmRpZgorI2luY2x1ZGUgIm1vbml0b3Jfd3JhcC5oIgorI2luY2x1ZGUgInNlcnZjb25mLmgiCisKKy8qIGltcG9ydCAqLworZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKKworc3RhdGljIGludAordXNlcmF1dGhfcGFzc3dkKEF1dGhjdHh0ICphdXRoY3R4dCkKK3sKKwljaGFyICpwYXNzd29yZCwgKm5ld3Bhc3M7CisJaW50IGF1dGhlbnRpY2F0ZWQgPSAwOworCWludCBjaGFuZ2U7CisJdV9pbnQgbGVuLCBuZXdsZW47CisKKwljaGFuZ2UgPSBwYWNrZXRfZ2V0X2NoYXIoKTsKKwlwYXNzd29yZCA9IHBhY2tldF9nZXRfc3RyaW5nKCZsZW4pOworCWlmIChjaGFuZ2UpIHsKKwkJLyogZGlzY2FyZCBuZXcgcGFzc3dvcmQgZnJvbSBwYWNrZXQgKi8KKwkJbmV3cGFzcyA9IHBhY2tldF9nZXRfc3RyaW5nKCZuZXdsZW4pOworCQltZW1zZXQobmV3cGFzcywgMCwgbmV3bGVuKTsKKwkJeGZyZWUobmV3cGFzcyk7CisJfQorCXBhY2tldF9jaGVja19lb20oKTsKKworCWlmIChjaGFuZ2UpCisJCWxvZ2l0KCJwYXNzd29yZCBjaGFuZ2Ugbm90IHN1cHBvcnRlZCIpOworCWVsc2UgaWYgKFBSSVZTRVAoYXV0aF9wYXNzd29yZChhdXRoY3R4dCwgcGFzc3dvcmQpKSA9PSAxKQorCQlhdXRoZW50aWNhdGVkID0gMTsKKwltZW1zZXQocGFzc3dvcmQsIDAsIGxlbik7CisJeGZyZWUocGFzc3dvcmQpOworCXJldHVybiBhdXRoZW50aWNhdGVkOworfQorCitBdXRobWV0aG9kIG1ldGhvZF9wYXNzd2QgPSB7CisJInBhc3N3b3JkIiwKKwl1c2VyYXV0aF9wYXNzd2QsCisJJm9wdGlvbnMucGFzc3dvcmRfYXV0aGVudGljYXRpb24KK307CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2F1dGgyLXB1YmtleS5jIGIvb3BlbnNzaC02LjBwMS9hdXRoMi1wdWJrZXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmNjYjVkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9hdXRoMi1wdWJrZXkuYwpAQCAtMCwwICsxLDQ2NiBAQAorLyogJE9wZW5CU0Q6IGF1dGgyLXB1YmtleS5jLHYgMS4zMCAyMDExLzA5LzI1IDA1OjQ0OjQ3IGRqbSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJzc2guaCIKKyNpbmNsdWRlICJzc2gyLmgiCisjaW5jbHVkZSAicGFja2V0LmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAic2VydmNvbmYuaCIKKyNpbmNsdWRlICJjb21wYXQuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJob3N0ZmlsZS5oIgorI2luY2x1ZGUgImF1dGguaCIKKyNpbmNsdWRlICJwYXRobmFtZXMuaCIKKyNpbmNsdWRlICJ1aWRzd2FwLmgiCisjaW5jbHVkZSAiYXV0aC1vcHRpb25zLmgiCisjaW5jbHVkZSAiY2Fub2hvc3QuaCIKKyNpZmRlZiBHU1NBUEkKKyNpbmNsdWRlICJzc2gtZ3NzLmgiCisjZW5kaWYKKyNpbmNsdWRlICJtb25pdG9yX3dyYXAuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAiYXV0aGZpbGUuaCIKKyNpbmNsdWRlICJtYXRjaC5oIgorCisvKiBpbXBvcnQgKi8KK2V4dGVybiBTZXJ2ZXJPcHRpb25zIG9wdGlvbnM7CitleHRlcm4gdV9jaGFyICpzZXNzaW9uX2lkMjsKK2V4dGVybiB1X2ludCBzZXNzaW9uX2lkMl9sZW47CisKK3N0YXRpYyBpbnQKK3VzZXJhdXRoX3B1YmtleShBdXRoY3R4dCAqYXV0aGN0eHQpCit7CisJQnVmZmVyIGI7CisJS2V5ICprZXkgPSBOVUxMOworCWNoYXIgKnBrYWxnOworCXVfY2hhciAqcGtibG9iLCAqc2lnOworCXVfaW50IGFsZW4sIGJsZW4sIHNsZW47CisJaW50IGhhdmVfc2lnLCBwa3R5cGU7CisJaW50IGF1dGhlbnRpY2F0ZWQgPSAwOworCisJaWYgKCFhdXRoY3R4dC0+dmFsaWQpIHsKKwkJZGVidWcyKCJ1c2VyYXV0aF9wdWJrZXk6IGRpc2FibGVkIGJlY2F1c2Ugb2YgaW52YWxpZCB1c2VyIik7CisJCXJldHVybiAwOworCX0KKwloYXZlX3NpZyA9IHBhY2tldF9nZXRfY2hhcigpOworCWlmIChkYXRhZmVsbG93cyAmIFNTSF9CVUdfUEtBVVRIKSB7CisJCWRlYnVnMigidXNlcmF1dGhfcHVia2V5OiBTU0hfQlVHX1BLQVVUSCIpOworCQkvKiBubyBleHBsaWNpdCBwa2FsZyBnaXZlbiAqLworCQlwa2Jsb2IgPSBwYWNrZXRfZ2V0X3N0cmluZygmYmxlbik7CisJCWJ1ZmZlcl9pbml0KCZiKTsKKwkJYnVmZmVyX2FwcGVuZCgmYiwgcGtibG9iLCBibGVuKTsKKwkJLyogc28gd2UgaGF2ZSB0byBleHRyYWN0IHRoZSBwa2FsZyBmcm9tIHRoZSBwa2Jsb2IgKi8KKwkJcGthbGcgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgJmFsZW4pOworCQlidWZmZXJfZnJlZSgmYik7CisJfSBlbHNlIHsKKwkJcGthbGcgPSBwYWNrZXRfZ2V0X3N0cmluZygmYWxlbik7CisJCXBrYmxvYiA9IHBhY2tldF9nZXRfc3RyaW5nKCZibGVuKTsKKwl9CisJcGt0eXBlID0ga2V5X3R5cGVfZnJvbV9uYW1lKHBrYWxnKTsKKwlpZiAocGt0eXBlID09IEtFWV9VTlNQRUMpIHsKKwkJLyogdGhpcyBpcyBwZXJmZWN0bHkgbGVnYWwgKi8KKwkJbG9naXQoInVzZXJhdXRoX3B1YmtleTogdW5zdXBwb3J0ZWQgcHVibGljIGtleSBhbGdvcml0aG06ICVzIiwKKwkJICAgIHBrYWxnKTsKKwkJZ290byBkb25lOworCX0KKwlrZXkgPSBrZXlfZnJvbV9ibG9iKHBrYmxvYiwgYmxlbik7CisJaWYgKGtleSA9PSBOVUxMKSB7CisJCWVycm9yKCJ1c2VyYXV0aF9wdWJrZXk6IGNhbm5vdCBkZWNvZGUga2V5OiAlcyIsIHBrYWxnKTsKKwkJZ290byBkb25lOworCX0KKwlpZiAoa2V5LT50eXBlICE9IHBrdHlwZSkgeworCQllcnJvcigidXNlcmF1dGhfcHVia2V5OiB0eXBlIG1pc21hdGNoIGZvciBkZWNvZGVkIGtleSAiCisJCSAgICAiKHJlY2VpdmVkICVkLCBleHBlY3RlZCAlZCkiLCBrZXktPnR5cGUsIHBrdHlwZSk7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKGhhdmVfc2lnKSB7CisJCXNpZyA9IHBhY2tldF9nZXRfc3RyaW5nKCZzbGVuKTsKKwkJcGFja2V0X2NoZWNrX2VvbSgpOworCQlidWZmZXJfaW5pdCgmYik7CisJCWlmIChkYXRhZmVsbG93cyAmIFNTSF9PTERfU0VTU0lPTklEKSB7CisJCQlidWZmZXJfYXBwZW5kKCZiLCBzZXNzaW9uX2lkMiwgc2Vzc2lvbl9pZDJfbGVuKTsKKwkJfSBlbHNlIHsKKwkJCWJ1ZmZlcl9wdXRfc3RyaW5nKCZiLCBzZXNzaW9uX2lkMiwgc2Vzc2lvbl9pZDJfbGVuKTsKKwkJfQorCQkvKiByZWNvbnN0cnVjdCBwYWNrZXQgKi8KKwkJYnVmZmVyX3B1dF9jaGFyKCZiLCBTU0gyX01TR19VU0VSQVVUSF9SRVFVRVNUKTsKKwkJYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBhdXRoY3R4dC0+dXNlcik7CisJCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwKKwkJICAgIGRhdGFmZWxsb3dzICYgU1NIX0JVR19QS1NFUlZJQ0UgPworCQkgICAgInNzaC11c2VyYXV0aCIgOgorCQkgICAgYXV0aGN0eHQtPnNlcnZpY2UpOworCQlpZiAoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX1BLQVVUSCkgeworCQkJYnVmZmVyX3B1dF9jaGFyKCZiLCBoYXZlX3NpZyk7CisJCX0gZWxzZSB7CisJCQlidWZmZXJfcHV0X2NzdHJpbmcoJmIsICJwdWJsaWNrZXkiKTsKKwkJCWJ1ZmZlcl9wdXRfY2hhcigmYiwgaGF2ZV9zaWcpOworCQkJYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBwa2FsZyk7CisJCX0KKwkJYnVmZmVyX3B1dF9zdHJpbmcoJmIsIHBrYmxvYiwgYmxlbik7CisjaWZkZWYgREVCVUdfUEsKKwkJYnVmZmVyX2R1bXAoJmIpOworI2VuZGlmCisJCS8qIHRlc3QgZm9yIGNvcnJlY3Qgc2lnbmF0dXJlICovCisJCWF1dGhlbnRpY2F0ZWQgPSAwOworCQlpZiAoUFJJVlNFUCh1c2VyX2tleV9hbGxvd2VkKGF1dGhjdHh0LT5wdywga2V5KSkgJiYKKwkJICAgIFBSSVZTRVAoa2V5X3ZlcmlmeShrZXksIHNpZywgc2xlbiwgYnVmZmVyX3B0cigmYiksCisJCSAgICBidWZmZXJfbGVuKCZiKSkpID09IDEpCisJCQlhdXRoZW50aWNhdGVkID0gMTsKKwkJYnVmZmVyX2ZyZWUoJmIpOworCQl4ZnJlZShzaWcpOworCX0gZWxzZSB7CisJCWRlYnVnKCJ0ZXN0IHdoZXRoZXIgcGthbGcvcGtibG9iIGFyZSBhY2NlcHRhYmxlIik7CisJCXBhY2tldF9jaGVja19lb20oKTsKKworCQkvKiBYWFggZmFrZSByZXBseSBhbmQgYWx3YXlzIHNlbmQgUEtfT0sgPyAqLworCQkvKgorCQkgKiBYWFggdGhpcyBhbGxvd3MgdGVzdGluZyB3aGV0aGVyIGEgdXNlciBpcyBhbGxvd2VkCisJCSAqIHRvIGxvZ2luOiBpZiB5b3UgaGFwcGVuIHRvIGhhdmUgYSB2YWxpZCBwdWJrZXkgdGhpcworCQkgKiBtZXNzYWdlIGlzIHNlbnQuIHRoZSBtZXNzYWdlIGlzIE5FVkVSIHNlbnQgYXQgYWxsCisJCSAqIGlmIGEgdXNlciBpcyBub3QgYWxsb3dlZCB0byBsb2dpbi4gaXMgdGhpcyBhbgorCQkgKiBpc3N1ZT8gLW1hcmt1cworCQkgKi8KKwkJaWYgKFBSSVZTRVAodXNlcl9rZXlfYWxsb3dlZChhdXRoY3R4dC0+cHcsIGtleSkpKSB7CisJCQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfVVNFUkFVVEhfUEtfT0spOworCQkJcGFja2V0X3B1dF9zdHJpbmcocGthbGcsIGFsZW4pOworCQkJcGFja2V0X3B1dF9zdHJpbmcocGtibG9iLCBibGVuKTsKKwkJCXBhY2tldF9zZW5kKCk7CisJCQlwYWNrZXRfd3JpdGVfd2FpdCgpOworCQkJYXV0aGN0eHQtPnBvc3Rwb25lZCA9IDE7CisJCX0KKwl9CisJaWYgKGF1dGhlbnRpY2F0ZWQgIT0gMSkKKwkJYXV0aF9jbGVhcl9vcHRpb25zKCk7Citkb25lOgorCWRlYnVnMigidXNlcmF1dGhfcHVia2V5OiBhdXRoZW50aWNhdGVkICVkIHBrYWxnICVzIiwgYXV0aGVudGljYXRlZCwgcGthbGcpOworCWlmIChrZXkgIT0gTlVMTCkKKwkJa2V5X2ZyZWUoa2V5KTsKKwl4ZnJlZShwa2FsZyk7CisJeGZyZWUocGtibG9iKTsKKwlyZXR1cm4gYXV0aGVudGljYXRlZDsKK30KKworc3RhdGljIGludAorbWF0Y2hfcHJpbmNpcGFsc19vcHRpb24oY29uc3QgY2hhciAqcHJpbmNpcGFsX2xpc3QsIHN0cnVjdCBLZXlDZXJ0ICpjZXJ0KQoreworCWNoYXIgKnJlc3VsdDsKKwl1X2ludCBpOworCisJLyogWFhYIHBlcmNlbnRfZXhwYW5kKCkgc2VxdWVuY2VzIGZvciBhdXRob3JpemVkX3ByaW5jaXBhbHM/ICovCisKKwlmb3IgKGkgPSAwOyBpIDwgY2VydC0+bnByaW5jaXBhbHM7IGkrKykgeworCQlpZiAoKHJlc3VsdCA9IG1hdGNoX2xpc3QoY2VydC0+cHJpbmNpcGFsc1tpXSwKKwkJICAgIHByaW5jaXBhbF9saXN0LCBOVUxMKSkgIT0gTlVMTCkgeworCQkJZGVidWczKCJtYXRjaGVkIHByaW5jaXBhbCBmcm9tIGtleSBvcHRpb25zIFwiJS4xMDBzXCIiLAorCQkJICAgIHJlc3VsdCk7CisJCQl4ZnJlZShyZXN1bHQpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK21hdGNoX3ByaW5jaXBhbHNfZmlsZShjaGFyICpmaWxlLCBzdHJ1Y3QgcGFzc3dkICpwdywgc3RydWN0IEtleUNlcnQgKmNlcnQpCit7CisJRklMRSAqZjsKKwljaGFyIGxpbmVbU1NIX01BWF9QVUJLRVlfQllURVNdLCAqY3AsICplcCwgKmxpbmVfb3B0czsKKwl1X2xvbmcgbGluZW51bSA9IDA7CisJdV9pbnQgaTsKKworCXRlbXBvcmFyaWx5X3VzZV91aWQocHcpOworCWRlYnVnKCJ0cnlpbmcgYXV0aG9yaXplZCBwcmluY2lwYWxzIGZpbGUgJXMiLCBmaWxlKTsKKwlpZiAoKGYgPSBhdXRoX29wZW5wcmluY2lwYWxzKGZpbGUsIHB3LCBvcHRpb25zLnN0cmljdF9tb2RlcykpID09IE5VTEwpIHsKKwkJcmVzdG9yZV91aWQoKTsKKwkJcmV0dXJuIDA7CisJfQorCXdoaWxlIChyZWFkX2tleWZpbGVfbGluZShmLCBmaWxlLCBsaW5lLCBzaXplb2YobGluZSksICZsaW5lbnVtKSAhPSAtMSkgeworCQkvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi8KKwkJZm9yIChjcCA9IGxpbmU7ICpjcCA9PSAnICcgfHwgKmNwID09ICdcdCc7IGNwKyspCisJCQk7CisJCS8qIFNraXAgYmxhbmsgYW5kIGNvbW1lbnQgbGluZXMuICovCisJCWlmICgoZXAgPSBzdHJjaHIoY3AsICcjJykpICE9IE5VTEwpCisJCQkqZXAgPSAnXDAnOworCQlpZiAoISpjcCB8fCAqY3AgPT0gJ1xuJykKKwkJCWNvbnRpbnVlOworCQkvKiBUcmltIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovCisJCWVwID0gY3AgKyBzdHJsZW4oY3ApIC0gMTsKKwkJd2hpbGUgKGVwID4gY3AgJiYgKCplcCA9PSAnXG4nIHx8ICplcCA9PSAnICcgfHwgKmVwID09ICdcdCcpKQorCQkJKmVwLS0gPSAnXDAnOworCQkvKgorCQkgKiBJZiB0aGUgbGluZSBoYXMgaW50ZXJuYWwgd2hpdGVzcGFjZSB0aGVuIGFzc3VtZSBpdCBoYXMKKwkJICoga2V5IG9wdGlvbnMuCisJCSAqLworCQlsaW5lX29wdHMgPSBOVUxMOworCQlpZiAoKGVwID0gc3RycmNocihjcCwgJyAnKSkgIT0gTlVMTCB8fAorCQkgICAgKGVwID0gc3RycmNocihjcCwgJ1x0JykpICE9IE5VTEwpIHsKKwkJCWZvciAoOyAqZXAgPT0gJyAnIHx8ICplcCA9PSAnXHQnOyBlcCsrKQorCQkJCTsKKwkJCWxpbmVfb3B0cyA9IGNwOworCQkJY3AgPSBlcDsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgY2VydC0+bnByaW5jaXBhbHM7IGkrKykgeworCQkJaWYgKHN0cmNtcChjcCwgY2VydC0+cHJpbmNpcGFsc1tpXSkgPT0gMCkgeworCQkJCWRlYnVnMygibWF0Y2hlZCBwcmluY2lwYWwgXCIlLjEwMHNcIiAiCisJCQkJICAgICJmcm9tIGZpbGUgXCIlc1wiIG9uIGxpbmUgJWx1IiwKKwkJCSAgICAJICAgIGNlcnQtPnByaW5jaXBhbHNbaV0sIGZpbGUsIGxpbmVudW0pOworCQkJCWlmIChhdXRoX3BhcnNlX29wdGlvbnMocHcsIGxpbmVfb3B0cywKKwkJCQkgICAgZmlsZSwgbGluZW51bSkgIT0gMSkKKwkJCQkJY29udGludWU7CisJCQkJZmNsb3NlKGYpOworCQkJCXJlc3RvcmVfdWlkKCk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisJZmNsb3NlKGYpOworCXJlc3RvcmVfdWlkKCk7CisJcmV0dXJuIDA7Cit9CQorCisvKiByZXR1cm4gMSBpZiB1c2VyIGFsbG93cyBnaXZlbiBrZXkgKi8KK3N0YXRpYyBpbnQKK3VzZXJfa2V5X2FsbG93ZWQyKHN0cnVjdCBwYXNzd2QgKnB3LCBLZXkgKmtleSwgY2hhciAqZmlsZSkKK3sKKwljaGFyIGxpbmVbU1NIX01BWF9QVUJLRVlfQllURVNdOworCWNvbnN0IGNoYXIgKnJlYXNvbjsKKwlpbnQgZm91bmRfa2V5ID0gMDsKKwlGSUxFICpmOworCXVfbG9uZyBsaW5lbnVtID0gMDsKKwlLZXkgKmZvdW5kOworCWNoYXIgKmZwOworCisJLyogVGVtcG9yYXJpbHkgdXNlIHRoZSB1c2VyJ3MgdWlkLiAqLworCXRlbXBvcmFyaWx5X3VzZV91aWQocHcpOworCisJZGVidWcoInRyeWluZyBwdWJsaWMga2V5IGZpbGUgJXMiLCBmaWxlKTsKKwlmID0gYXV0aF9vcGVua2V5ZmlsZShmaWxlLCBwdywgb3B0aW9ucy5zdHJpY3RfbW9kZXMpOworCisJaWYgKCFmKSB7CisJCXJlc3RvcmVfdWlkKCk7CisJCXJldHVybiAwOworCX0KKworCWZvdW5kX2tleSA9IDA7CisJZm91bmQgPSBrZXlfbmV3KGtleV9pc19jZXJ0KGtleSkgPyBLRVlfVU5TUEVDIDoga2V5LT50eXBlKTsKKworCXdoaWxlIChyZWFkX2tleWZpbGVfbGluZShmLCBmaWxlLCBsaW5lLCBzaXplb2YobGluZSksICZsaW5lbnVtKSAhPSAtMSkgeworCQljaGFyICpjcCwgKmtleV9vcHRpb25zID0gTlVMTDsKKworCQlhdXRoX2NsZWFyX29wdGlvbnMoKTsKKworCQkvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZSwgZW1wdHkgYW5kIGNvbW1lbnQgbGluZXMuICovCisJCWZvciAoY3AgPSBsaW5lOyAqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnOyBjcCsrKQorCQkJOworCQlpZiAoISpjcCB8fCAqY3AgPT0gJ1xuJyB8fCAqY3AgPT0gJyMnKQorCQkJY29udGludWU7CisKKwkJaWYgKGtleV9yZWFkKGZvdW5kLCAmY3ApICE9IDEpIHsKKwkJCS8qIG5vIGtleT8gIGNoZWNrIGlmIHRoZXJlIGFyZSBvcHRpb25zIGZvciB0aGlzIGtleSAqLworCQkJaW50IHF1b3RlZCA9IDA7CisJCQlkZWJ1ZzIoInVzZXJfa2V5X2FsbG93ZWQ6IGNoZWNrIG9wdGlvbnM6ICclcyciLCBjcCk7CisJCQlrZXlfb3B0aW9ucyA9IGNwOworCQkJZm9yICg7ICpjcCAmJiAocXVvdGVkIHx8ICgqY3AgIT0gJyAnICYmICpjcCAhPSAnXHQnKSk7IGNwKyspIHsKKwkJCQlpZiAoKmNwID09ICdcXCcgJiYgY3BbMV0gPT0gJyInKQorCQkJCQljcCsrOwkvKiBTa2lwIGJvdGggKi8KKwkJCQllbHNlIGlmICgqY3AgPT0gJyInKQorCQkJCQlxdW90ZWQgPSAhcXVvdGVkOworCQkJfQorCQkJLyogU2tpcCByZW1haW5pbmcgd2hpdGVzcGFjZS4gKi8KKwkJCWZvciAoOyAqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnOyBjcCsrKQorCQkJCTsKKwkJCWlmIChrZXlfcmVhZChmb3VuZCwgJmNwKSAhPSAxKSB7CisJCQkJZGVidWcyKCJ1c2VyX2tleV9hbGxvd2VkOiBhZHZhbmNlOiAnJXMnIiwgY3ApOworCQkJCS8qIHN0aWxsIG5vIGtleT8gIGFkdmFuY2UgdG8gbmV4dCBsaW5lKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlpZiAoa2V5X2lzX2NlcnQoa2V5KSkgeworCQkJaWYgKCFrZXlfZXF1YWwoZm91bmQsIGtleS0+Y2VydC0+c2lnbmF0dXJlX2tleSkpCisJCQkJY29udGludWU7CisJCQlpZiAoYXV0aF9wYXJzZV9vcHRpb25zKHB3LCBrZXlfb3B0aW9ucywgZmlsZSwKKwkJCSAgICBsaW5lbnVtKSAhPSAxKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFrZXlfaXNfY2VydF9hdXRob3JpdHkpCisJCQkJY29udGludWU7CisJCQlmcCA9IGtleV9maW5nZXJwcmludChmb3VuZCwgU1NIX0ZQX01ENSwKKwkJCSAgICBTU0hfRlBfSEVYKTsKKwkJCWRlYnVnKCJtYXRjaGluZyBDQSBmb3VuZDogZmlsZSAlcywgbGluZSAlbHUsICVzICVzIiwKKwkJCSAgICBmaWxlLCBsaW5lbnVtLCBrZXlfdHlwZShmb3VuZCksIGZwKTsKKwkJCS8qCisJCQkgKiBJZiB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIGEgbGlzdCBvZiBwcmluY2lwYWxzIGFzCisJCQkgKiBhIGtleSBvcHRpb24sIHRoZW4gcHJlZmVyIHRoYXQgbGlzdCB0byBtYXRjaGluZworCQkJICogdGhlaXIgdXNlcm5hbWUgaW4gdGhlIGNlcnRpZmljYXRlIHByaW5jaXBhbHMgbGlzdC4KKwkJCSAqLworCQkJaWYgKGF1dGhvcml6ZWRfcHJpbmNpcGFscyAhPSBOVUxMICYmCisJCQkgICAgIW1hdGNoX3ByaW5jaXBhbHNfb3B0aW9uKGF1dGhvcml6ZWRfcHJpbmNpcGFscywKKwkJCSAgICBrZXktPmNlcnQpKSB7CisJCQkJcmVhc29uID0gIkNlcnRpZmljYXRlIGRvZXMgbm90IGNvbnRhaW4gYW4gIgorCQkJCSAgICAiYXV0aG9yaXplZCBwcmluY2lwYWwiOworIGZhaWxfcmVhc29uOgorCQkJCXhmcmVlKGZwKTsKKwkJCQllcnJvcigiJXMiLCByZWFzb24pOworCQkJCWF1dGhfZGVidWdfYWRkKCIlcyIsIHJlYXNvbik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoa2V5X2NlcnRfY2hlY2tfYXV0aG9yaXR5KGtleSwgMCwgMCwKKwkJCSAgICBhdXRob3JpemVkX3ByaW5jaXBhbHMgPT0gTlVMTCA/IHB3LT5wd19uYW1lIDogTlVMTCwKKwkJCSAgICAmcmVhc29uKSAhPSAwKQorCQkJCWdvdG8gZmFpbF9yZWFzb247CisJCQlpZiAoYXV0aF9jZXJ0X29wdGlvbnMoa2V5LCBwdykgIT0gMCkgeworCQkJCXhmcmVlKGZwKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXZlcmJvc2UoIkFjY2VwdGVkIGNlcnRpZmljYXRlIElEIFwiJXNcIiAiCisJCQkgICAgInNpZ25lZCBieSAlcyBDQSAlcyB2aWEgJXMiLCBrZXktPmNlcnQtPmtleV9pZCwKKwkJCSAgICBrZXlfdHlwZShmb3VuZCksIGZwLCBmaWxlKTsKKwkJCXhmcmVlKGZwKTsKKwkJCWZvdW5kX2tleSA9IDE7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChrZXlfZXF1YWwoZm91bmQsIGtleSkpIHsKKwkJCWlmIChhdXRoX3BhcnNlX29wdGlvbnMocHcsIGtleV9vcHRpb25zLCBmaWxlLAorCQkJICAgIGxpbmVudW0pICE9IDEpCisJCQkJY29udGludWU7CisJCQlpZiAoa2V5X2lzX2NlcnRfYXV0aG9yaXR5KQorCQkJCWNvbnRpbnVlOworCQkJZm91bmRfa2V5ID0gMTsKKwkJCWRlYnVnKCJtYXRjaGluZyBrZXkgZm91bmQ6IGZpbGUgJXMsIGxpbmUgJWx1IiwKKwkJCSAgICBmaWxlLCBsaW5lbnVtKTsKKwkJCWZwID0ga2V5X2ZpbmdlcnByaW50KGZvdW5kLCBTU0hfRlBfTUQ1LCBTU0hfRlBfSEVYKTsKKwkJCXZlcmJvc2UoIkZvdW5kIG1hdGNoaW5nICVzIGtleTogJXMiLAorCQkJICAgIGtleV90eXBlKGZvdW5kKSwgZnApOworCQkJeGZyZWUoZnApOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmVzdG9yZV91aWQoKTsKKwlmY2xvc2UoZik7CisJa2V5X2ZyZWUoZm91bmQpOworCWlmICghZm91bmRfa2V5KQorCQlkZWJ1ZzIoImtleSBub3QgZm91bmQiKTsKKwlyZXR1cm4gZm91bmRfa2V5OworfQorCisvKiBBdXRoZW50aWNhdGUgYSBjZXJ0aWZpY2F0ZSBrZXkgYWdhaW5zdCBUcnVzdGVkVXNlckNBS2V5cyAqLworc3RhdGljIGludAordXNlcl9jZXJ0X3RydXN0ZWRfY2Eoc3RydWN0IHBhc3N3ZCAqcHcsIEtleSAqa2V5KQoreworCWNoYXIgKmNhX2ZwLCAqcHJpbmNpcGFsc19maWxlID0gTlVMTDsKKwljb25zdCBjaGFyICpyZWFzb247CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWtleV9pc19jZXJ0KGtleSkgfHwgb3B0aW9ucy50cnVzdGVkX3VzZXJfY2Ffa2V5cyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWNhX2ZwID0ga2V5X2ZpbmdlcnByaW50KGtleS0+Y2VydC0+c2lnbmF0dXJlX2tleSwKKwkgICAgU1NIX0ZQX01ENSwgU1NIX0ZQX0hFWCk7CisKKwlpZiAoa2V5X2luX2ZpbGUoa2V5LT5jZXJ0LT5zaWduYXR1cmVfa2V5LAorCSAgICBvcHRpb25zLnRydXN0ZWRfdXNlcl9jYV9rZXlzLCAxKSAhPSAxKSB7CisJCWRlYnVnMigiJXM6IENBICVzICVzIGlzIG5vdCBsaXN0ZWQgaW4gJXMiLCBfX2Z1bmNfXywKKwkJICAgIGtleV90eXBlKGtleS0+Y2VydC0+c2lnbmF0dXJlX2tleSksIGNhX2ZwLAorCQkgICAgb3B0aW9ucy50cnVzdGVkX3VzZXJfY2Ffa2V5cyk7CisJCWdvdG8gb3V0OworCX0KKwkvKgorCSAqIElmIEF1dGhvcml6ZWRQcmluY2lwYWxzIGlzIGluIHVzZSwgdGhlbiBjb21wYXJlIHRoZSBjZXJ0aWZpY2F0ZQorCSAqIHByaW5jaXBhbHMgYWdhaW5zdCB0aGUgbmFtZXMgaW4gdGhhdCBmaWxlIHJhdGhlciB0aGFuIG1hdGNoaW5nCisJICogYWdhaW5zdCB0aGUgdXNlcm5hbWUuCisJICovCisJaWYgKChwcmluY2lwYWxzX2ZpbGUgPSBhdXRob3JpemVkX3ByaW5jaXBhbHNfZmlsZShwdykpICE9IE5VTEwpIHsKKwkJaWYgKCFtYXRjaF9wcmluY2lwYWxzX2ZpbGUocHJpbmNpcGFsc19maWxlLCBwdywga2V5LT5jZXJ0KSkgeworCQkJcmVhc29uID0gIkNlcnRpZmljYXRlIGRvZXMgbm90IGNvbnRhaW4gYW4gIgorCQkJICAgICJhdXRob3JpemVkIHByaW5jaXBhbCI7CisgZmFpbF9yZWFzb246CisJCQllcnJvcigiJXMiLCByZWFzb24pOworCQkJYXV0aF9kZWJ1Z19hZGQoIiVzIiwgcmVhc29uKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWlmIChrZXlfY2VydF9jaGVja19hdXRob3JpdHkoa2V5LCAwLCAxLAorCSAgICBwcmluY2lwYWxzX2ZpbGUgPT0gTlVMTCA/IHB3LT5wd19uYW1lIDogTlVMTCwgJnJlYXNvbikgIT0gMCkKKwkJZ290byBmYWlsX3JlYXNvbjsKKwlpZiAoYXV0aF9jZXJ0X29wdGlvbnMoa2V5LCBwdykgIT0gMCkKKwkJZ290byBvdXQ7CisKKwl2ZXJib3NlKCJBY2NlcHRlZCBjZXJ0aWZpY2F0ZSBJRCBcIiVzXCIgc2lnbmVkIGJ5ICVzIENBICVzIHZpYSAlcyIsCisJICAgIGtleS0+Y2VydC0+a2V5X2lkLCBrZXlfdHlwZShrZXktPmNlcnQtPnNpZ25hdHVyZV9rZXkpLCBjYV9mcCwKKwkgICAgb3B0aW9ucy50cnVzdGVkX3VzZXJfY2Ffa2V5cyk7CisJcmV0ID0gMTsKKworIG91dDoKKwlpZiAocHJpbmNpcGFsc19maWxlICE9IE5VTEwpCisJCXhmcmVlKHByaW5jaXBhbHNfZmlsZSk7CisJaWYgKGNhX2ZwICE9IE5VTEwpCisJCXhmcmVlKGNhX2ZwKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBjaGVjayB3aGV0aGVyIGdpdmVuIGtleSBpcyBpbiAuc3NoL2F1dGhvcml6ZWRfa2V5cyogKi8KK2ludAordXNlcl9rZXlfYWxsb3dlZChzdHJ1Y3QgcGFzc3dkICpwdywgS2V5ICprZXkpCit7CisJdV9pbnQgc3VjY2VzcywgaTsKKwljaGFyICpmaWxlOworCisJaWYgKGF1dGhfa2V5X2lzX3Jldm9rZWQoa2V5KSkKKwkJcmV0dXJuIDA7CisJaWYgKGtleV9pc19jZXJ0KGtleSkgJiYgYXV0aF9rZXlfaXNfcmV2b2tlZChrZXktPmNlcnQtPnNpZ25hdHVyZV9rZXkpKQorCQlyZXR1cm4gMDsKKworCXN1Y2Nlc3MgPSB1c2VyX2NlcnRfdHJ1c3RlZF9jYShwdywga2V5KTsKKwlpZiAoc3VjY2VzcykKKwkJcmV0dXJuIHN1Y2Nlc3M7CisKKwlmb3IgKGkgPSAwOyAhc3VjY2VzcyAmJiBpIDwgb3B0aW9ucy5udW1fYXV0aGtleXNfZmlsZXM7IGkrKykgeworCQlmaWxlID0gZXhwYW5kX2F1dGhvcml6ZWRfa2V5cygKKwkJICAgIG9wdGlvbnMuYXV0aG9yaXplZF9rZXlzX2ZpbGVzW2ldLCBwdyk7CisJCXN1Y2Nlc3MgPSB1c2VyX2tleV9hbGxvd2VkMihwdywga2V5LCBmaWxlKTsKKwkJeGZyZWUoZmlsZSk7CisJfQorCisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK0F1dGhtZXRob2QgbWV0aG9kX3B1YmtleSA9IHsKKwkicHVibGlja2V5IiwKKwl1c2VyYXV0aF9wdWJrZXksCisJJm9wdGlvbnMucHVia2V5X2F1dGhlbnRpY2F0aW9uCit9OwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9hdXRoMi5jIGIvb3BlbnNzaC02LjBwMS9hdXRoMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NmJlZjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2F1dGgyLmMKQEAgLTAsMCArMSw0MDkgQEAKKy8qICRPcGVuQlNEOiBhdXRoMi5jLHYgMS4xMjQgMjAxMS8xMi8wNyAwNTo0NDozOCBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiYXRvbWljaW8uaCIKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAic3NoMi5oIgorI2luY2x1ZGUgInBhY2tldC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgInNlcnZjb25mLmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisjaW5jbHVkZSAia2V5LmgiCisjaW5jbHVkZSAiaG9zdGZpbGUuaCIKKyNpbmNsdWRlICJhdXRoLmgiCisjaW5jbHVkZSAiZGlzcGF0Y2guaCIKKyNpbmNsdWRlICJwYXRobmFtZXMuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKworI2lmZGVmIEdTU0FQSQorI2luY2x1ZGUgInNzaC1nc3MuaCIKKyNlbmRpZgorI2luY2x1ZGUgIm1vbml0b3Jfd3JhcC5oIgorCisvKiBpbXBvcnQgKi8KK2V4dGVybiBTZXJ2ZXJPcHRpb25zIG9wdGlvbnM7CitleHRlcm4gdV9jaGFyICpzZXNzaW9uX2lkMjsKK2V4dGVybiB1X2ludCBzZXNzaW9uX2lkMl9sZW47CitleHRlcm4gQnVmZmVyIGxvZ2lubXNnOworCisvKiBtZXRob2RzICovCisKK2V4dGVybiBBdXRobWV0aG9kIG1ldGhvZF9ub25lOworZXh0ZXJuIEF1dGhtZXRob2QgbWV0aG9kX3B1YmtleTsKK2V4dGVybiBBdXRobWV0aG9kIG1ldGhvZF9wYXNzd2Q7CitleHRlcm4gQXV0aG1ldGhvZCBtZXRob2Rfa2JkaW50OworZXh0ZXJuIEF1dGhtZXRob2QgbWV0aG9kX2hvc3RiYXNlZDsKKyNpZmRlZiBHU1NBUEkKK2V4dGVybiBBdXRobWV0aG9kIG1ldGhvZF9nc3NhcGk7CisjZW5kaWYKKyNpZmRlZiBKUEFLRQorZXh0ZXJuIEF1dGhtZXRob2QgbWV0aG9kX2pwYWtlOworI2VuZGlmCisKK0F1dGhtZXRob2QgKmF1dGhtZXRob2RzW10gPSB7CisJJm1ldGhvZF9ub25lLAorCSZtZXRob2RfcHVia2V5LAorI2lmZGVmIEdTU0FQSQorCSZtZXRob2RfZ3NzYXBpLAorI2VuZGlmCisjaWZkZWYgSlBBS0UKKwkmbWV0aG9kX2pwYWtlLAorI2VuZGlmCisJJm1ldGhvZF9wYXNzd2QsCisJJm1ldGhvZF9rYmRpbnQsCisJJm1ldGhvZF9ob3N0YmFzZWQsCisJTlVMTAorfTsKKworLyogcHJvdG9jb2wgKi8KKworc3RhdGljIHZvaWQgaW5wdXRfc2VydmljZV9yZXF1ZXN0KGludCwgdV9pbnQzMl90LCB2b2lkICopOworc3RhdGljIHZvaWQgaW5wdXRfdXNlcmF1dGhfcmVxdWVzdChpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKKworLyogaGVscGVyICovCitzdGF0aWMgQXV0aG1ldGhvZCAqYXV0aG1ldGhvZF9sb29rdXAoY29uc3QgY2hhciAqKTsKK3N0YXRpYyBjaGFyICphdXRobWV0aG9kc19nZXQodm9pZCk7CisKK2NoYXIgKgorYXV0aDJfcmVhZF9iYW5uZXIodm9pZCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwljaGFyICpiYW5uZXIgPSBOVUxMOworCXNpemVfdCBsZW4sIG47CisJaW50IGZkOworCisJaWYgKChmZCA9IG9wZW4ob3B0aW9ucy5iYW5uZXIsIE9fUkRPTkxZKSkgPT0gLTEpCisJCXJldHVybiAoTlVMTCk7CisJaWYgKGZzdGF0KGZkLCAmc3QpID09IC0xKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJaWYgKHN0LnN0X3NpemUgPD0gMCB8fCBzdC5zdF9zaXplID4gMSoxMDI0KjEwMjQpIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCWxlbiA9IChzaXplX3Qpc3Quc3Rfc2l6ZTsJCS8qIHRydW5jYXRlICovCisJYmFubmVyID0geG1hbGxvYyhsZW4gKyAxKTsKKwluID0gYXRvbWljaW8ocmVhZCwgZmQsIGJhbm5lciwgbGVuKTsKKwljbG9zZShmZCk7CisKKwlpZiAobiAhPSBsZW4pIHsKKwkJeGZyZWUoYmFubmVyKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJYmFubmVyW25dID0gJ1wwJzsKKworCXJldHVybiAoYmFubmVyKTsKK30KKwordm9pZAordXNlcmF1dGhfc2VuZF9iYW5uZXIoY29uc3QgY2hhciAqbXNnKQoreworCWlmIChkYXRhZmVsbG93cyAmIFNTSF9CVUdfQkFOTkVSKQorCQlyZXR1cm47CisKKwlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfVVNFUkFVVEhfQkFOTkVSKTsKKwlwYWNrZXRfcHV0X2NzdHJpbmcobXNnKTsKKwlwYWNrZXRfcHV0X2NzdHJpbmcoIiIpOwkJLyogbGFuZ3VhZ2UsIHVudXNlZCAqLworCXBhY2tldF9zZW5kKCk7CisJZGVidWcoIiVzOiBzZW50IiwgX19mdW5jX18pOworfQorCitzdGF0aWMgdm9pZAordXNlcmF1dGhfYmFubmVyKHZvaWQpCit7CisJY2hhciAqYmFubmVyID0gTlVMTDsKKworCWlmIChvcHRpb25zLmJhbm5lciA9PSBOVUxMIHx8CisJICAgIHN0cmNhc2VjbXAob3B0aW9ucy5iYW5uZXIsICJub25lIikgPT0gMCB8fAorCSAgICAoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX0JBTk5FUikgIT0gMCkKKwkJcmV0dXJuOworCisJaWYgKChiYW5uZXIgPSBQUklWU0VQKGF1dGgyX3JlYWRfYmFubmVyKCkpKSA9PSBOVUxMKQorCQlnb3RvIGRvbmU7CisJdXNlcmF1dGhfc2VuZF9iYW5uZXIoYmFubmVyKTsKKworZG9uZToKKwlpZiAoYmFubmVyKQorCQl4ZnJlZShiYW5uZXIpOworfQorCisvKgorICogbG9vcCB1bnRpbCBhdXRoY3R4dC0+c3VjY2VzcyA9PSBUUlVFCisgKi8KK3ZvaWQKK2RvX2F1dGhlbnRpY2F0aW9uMihBdXRoY3R4dCAqYXV0aGN0eHQpCit7CisJZGlzcGF0Y2hfaW5pdCgmZGlzcGF0Y2hfcHJvdG9jb2xfZXJyb3IpOworCWRpc3BhdGNoX3NldChTU0gyX01TR19TRVJWSUNFX1JFUVVFU1QsICZpbnB1dF9zZXJ2aWNlX3JlcXVlc3QpOworCWRpc3BhdGNoX3J1bihESVNQQVRDSF9CTE9DSywgJmF1dGhjdHh0LT5zdWNjZXNzLCBhdXRoY3R4dCk7Cit9CisKKy8qQVJHU1VTRUQqLworc3RhdGljIHZvaWQKK2lucHV0X3NlcnZpY2VfcmVxdWVzdChpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKK3sKKwlBdXRoY3R4dCAqYXV0aGN0eHQgPSBjdHh0OworCXVfaW50IGxlbjsKKwlpbnQgYWNjZXB0aXQgPSAwOworCWNoYXIgKnNlcnZpY2UgPSBwYWNrZXRfZ2V0X2NzdHJpbmcoJmxlbik7CisJcGFja2V0X2NoZWNrX2VvbSgpOworCisJaWYgKGF1dGhjdHh0ID09IE5VTEwpCisJCWZhdGFsKCJpbnB1dF9zZXJ2aWNlX3JlcXVlc3Q6IG5vIGF1dGhjdHh0Iik7CisKKwlpZiAoc3RyY21wKHNlcnZpY2UsICJzc2gtdXNlcmF1dGgiKSA9PSAwKSB7CisJCWlmICghYXV0aGN0eHQtPnN1Y2Nlc3MpIHsKKwkJCWFjY2VwdGl0ID0gMTsKKwkJCS8qIG5vdyB3ZSBjYW4gaGFuZGxlIHVzZXItYXV0aCByZXF1ZXN0cyAqLworCQkJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX1JFUVVFU1QsICZpbnB1dF91c2VyYXV0aF9yZXF1ZXN0KTsKKwkJfQorCX0KKwkvKiBYWFggYWxsIG90aGVyIHNlcnZpY2UgcmVxdWVzdHMgYXJlIGRlbmllZCAqLworCisJaWYgKGFjY2VwdGl0KSB7CisJCXBhY2tldF9zdGFydChTU0gyX01TR19TRVJWSUNFX0FDQ0VQVCk7CisJCXBhY2tldF9wdXRfY3N0cmluZyhzZXJ2aWNlKTsKKwkJcGFja2V0X3NlbmQoKTsKKwkJcGFja2V0X3dyaXRlX3dhaXQoKTsKKwl9IGVsc2UgeworCQlkZWJ1ZygiYmFkIHNlcnZpY2UgcmVxdWVzdCAlcyIsIHNlcnZpY2UpOworCQlwYWNrZXRfZGlzY29ubmVjdCgiYmFkIHNlcnZpY2UgcmVxdWVzdCAlcyIsIHNlcnZpY2UpOworCX0KKwl4ZnJlZShzZXJ2aWNlKTsKK30KKworLypBUkdTVVNFRCovCitzdGF0aWMgdm9pZAoraW5wdXRfdXNlcmF1dGhfcmVxdWVzdChpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKK3sKKwlBdXRoY3R4dCAqYXV0aGN0eHQgPSBjdHh0OworCUF1dGhtZXRob2QgKm0gPSBOVUxMOworCWNoYXIgKnVzZXIsICpzZXJ2aWNlLCAqbWV0aG9kLCAqc3R5bGUgPSBOVUxMOworCWludCBhdXRoZW50aWNhdGVkID0gMDsKKworCWlmIChhdXRoY3R4dCA9PSBOVUxMKQorCQlmYXRhbCgiaW5wdXRfdXNlcmF1dGhfcmVxdWVzdDogbm8gYXV0aGN0eHQiKTsKKworCXVzZXIgPSBwYWNrZXRfZ2V0X2NzdHJpbmcoTlVMTCk7CisJc2VydmljZSA9IHBhY2tldF9nZXRfY3N0cmluZyhOVUxMKTsKKwltZXRob2QgPSBwYWNrZXRfZ2V0X2NzdHJpbmcoTlVMTCk7CisJZGVidWcoInVzZXJhdXRoLXJlcXVlc3QgZm9yIHVzZXIgJXMgc2VydmljZSAlcyBtZXRob2QgJXMiLCB1c2VyLCBzZXJ2aWNlLCBtZXRob2QpOworCWRlYnVnKCJhdHRlbXB0ICVkIGZhaWx1cmVzICVkIiwgYXV0aGN0eHQtPmF0dGVtcHQsIGF1dGhjdHh0LT5mYWlsdXJlcyk7CisKKwlpZiAoKHN0eWxlID0gc3RyY2hyKHVzZXIsICc6JykpICE9IE5VTEwpCisJCSpzdHlsZSsrID0gMDsKKworCWlmIChhdXRoY3R4dC0+YXR0ZW1wdCsrID09IDApIHsKKwkJLyogc2V0dXAgYXV0aCBjb250ZXh0ICovCisJCWF1dGhjdHh0LT5wdyA9IFBSSVZTRVAoZ2V0cHduYW1hbGxvdyh1c2VyKSk7CisJCWF1dGhjdHh0LT51c2VyID0geHN0cmR1cCh1c2VyKTsKKwkJaWYgKGF1dGhjdHh0LT5wdyAmJiBzdHJjbXAoc2VydmljZSwgInNzaC1jb25uZWN0aW9uIik9PTApIHsKKwkJCWF1dGhjdHh0LT52YWxpZCA9IDE7CisJCQlkZWJ1ZzIoImlucHV0X3VzZXJhdXRoX3JlcXVlc3Q6IHNldHRpbmcgdXAgYXV0aGN0eHQgZm9yICVzIiwgdXNlcik7CisJCX0gZWxzZSB7CisJCQlsb2dpdCgiaW5wdXRfdXNlcmF1dGhfcmVxdWVzdDogaW52YWxpZCB1c2VyICVzIiwgdXNlcik7CisJCQlhdXRoY3R4dC0+cHcgPSBmYWtlcHcoKTsKKyNpZmRlZiBTU0hfQVVESVRfRVZFTlRTCisJCQlQUklWU0VQKGF1ZGl0X2V2ZW50KFNTSF9JTlZBTElEX1VTRVIpKTsKKyNlbmRpZgorCQl9CisjaWZkZWYgVVNFX1BBTQorCQlpZiAob3B0aW9ucy51c2VfcGFtKQorCQkJUFJJVlNFUChzdGFydF9wYW0oYXV0aGN0eHQpKTsKKyNlbmRpZgorCQlzZXRwcm9jdGl0bGUoIiVzJXMiLCBhdXRoY3R4dC0+dmFsaWQgPyB1c2VyIDogInVua25vd24iLAorCQkgICAgdXNlX3ByaXZzZXAgPyAiIFtuZXRdIiA6ICIiKTsKKwkJYXV0aGN0eHQtPnNlcnZpY2UgPSB4c3RyZHVwKHNlcnZpY2UpOworCQlhdXRoY3R4dC0+c3R5bGUgPSBzdHlsZSA/IHhzdHJkdXAoc3R5bGUpIDogTlVMTDsKKwkJaWYgKHVzZV9wcml2c2VwKQorCQkJbW1faW5mb3JtX2F1dGhzZXJ2KHNlcnZpY2UsIHN0eWxlKTsKKwkJdXNlcmF1dGhfYmFubmVyKCk7CisJfSBlbHNlIGlmIChzdHJjbXAodXNlciwgYXV0aGN0eHQtPnVzZXIpICE9IDAgfHwKKwkgICAgc3RyY21wKHNlcnZpY2UsIGF1dGhjdHh0LT5zZXJ2aWNlKSAhPSAwKSB7CisJCXBhY2tldF9kaXNjb25uZWN0KCJDaGFuZ2Ugb2YgdXNlcm5hbWUgb3Igc2VydmljZSBub3QgYWxsb3dlZDogIgorCQkgICAgIiglcywlcykgLT4gKCVzLCVzKSIsCisJCSAgICBhdXRoY3R4dC0+dXNlciwgYXV0aGN0eHQtPnNlcnZpY2UsIHVzZXIsIHNlcnZpY2UpOworCX0KKwkvKiByZXNldCBzdGF0ZSAqLworCWF1dGgyX2NoYWxsZW5nZV9zdG9wKGF1dGhjdHh0KTsKKyNpZmRlZiBKUEFLRQorCWF1dGgyX2pwYWtlX3N0b3AoYXV0aGN0eHQpOworI2VuZGlmCisKKyNpZmRlZiBHU1NBUEkKKwkvKiBYWFggbW92ZSB0byBhdXRoMl9nc3NhcGlfc3RvcCgpICovCisJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9UT0tFTiwgTlVMTCk7CisJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9FWENIQU5HRV9DT01QTEVURSwgTlVMTCk7CisjZW5kaWYKKworCWF1dGhjdHh0LT5wb3N0cG9uZWQgPSAwOworCWF1dGhjdHh0LT5zZXJ2ZXJfY2F1c2VkX2ZhaWx1cmUgPSAwOworCisJLyogdHJ5IHRvIGF1dGhlbnRpY2F0ZSB1c2VyICovCisJbSA9IGF1dGhtZXRob2RfbG9va3VwKG1ldGhvZCk7CisJaWYgKG0gIT0gTlVMTCAmJiBhdXRoY3R4dC0+ZmFpbHVyZXMgPCBvcHRpb25zLm1heF9hdXRodHJpZXMpIHsKKwkJZGVidWcyKCJpbnB1dF91c2VyYXV0aF9yZXF1ZXN0OiB0cnkgbWV0aG9kICVzIiwgbWV0aG9kKTsKKwkJYXV0aGVudGljYXRlZCA9CW0tPnVzZXJhdXRoKGF1dGhjdHh0KTsKKwl9CisJdXNlcmF1dGhfZmluaXNoKGF1dGhjdHh0LCBhdXRoZW50aWNhdGVkLCBtZXRob2QpOworCisJeGZyZWUoc2VydmljZSk7CisJeGZyZWUodXNlcik7CisJeGZyZWUobWV0aG9kKTsKK30KKwordm9pZAordXNlcmF1dGhfZmluaXNoKEF1dGhjdHh0ICphdXRoY3R4dCwgaW50IGF1dGhlbnRpY2F0ZWQsIGNoYXIgKm1ldGhvZCkKK3sKKwljaGFyICptZXRob2RzOworCisJaWYgKCFhdXRoY3R4dC0+dmFsaWQgJiYgYXV0aGVudGljYXRlZCkKKwkJZmF0YWwoIklOVEVSTkFMIEVSUk9SOiBhdXRoZW50aWNhdGVkIGludmFsaWQgdXNlciAlcyIsCisJCSAgICBhdXRoY3R4dC0+dXNlcik7CisKKwkvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciByb290ICovCisJaWYgKGF1dGhlbnRpY2F0ZWQgJiYgYXV0aGN0eHQtPnB3LT5wd191aWQgPT0gMCAmJgorCSAgICAhYXV0aF9yb290X2FsbG93ZWQobWV0aG9kKSkgeworCQlhdXRoZW50aWNhdGVkID0gMDsKKyNpZmRlZiBTU0hfQVVESVRfRVZFTlRTCisJCVBSSVZTRVAoYXVkaXRfZXZlbnQoU1NIX0xPR0lOX1JPT1RfREVOSUVEKSk7CisjZW5kaWYKKwl9CisKKyNpZmRlZiBVU0VfUEFNCisJaWYgKG9wdGlvbnMudXNlX3BhbSAmJiBhdXRoZW50aWNhdGVkKSB7CisJCWlmICghUFJJVlNFUChkb19wYW1fYWNjb3VudCgpKSkgeworCQkJLyogaWYgUEFNIHJldHVybmVkIGEgbWVzc2FnZSwgc2VuZCBpdCB0byB0aGUgdXNlciAqLworCQkJaWYgKGJ1ZmZlcl9sZW4oJmxvZ2lubXNnKSA+IDApIHsKKwkJCQlidWZmZXJfYXBwZW5kKCZsb2dpbm1zZywgIlwwIiwgMSk7CisJCQkJdXNlcmF1dGhfc2VuZF9iYW5uZXIoYnVmZmVyX3B0cigmbG9naW5tc2cpKTsKKwkJCQlwYWNrZXRfd3JpdGVfd2FpdCgpOworCQkJfQorCQkJZmF0YWwoIkFjY2VzcyBkZW5pZWQgZm9yIHVzZXIgJXMgYnkgUEFNIGFjY291bnQgIgorCQkJICAgICJjb25maWd1cmF0aW9uIiwgYXV0aGN0eHQtPnVzZXIpOworCQl9CisJfQorI2VuZGlmCisKKyNpZmRlZiBfVU5JQ09TCisJaWYgKGF1dGhlbnRpY2F0ZWQgJiYgY3JheV9hY2Nlc3NfZGVuaWVkKGF1dGhjdHh0LT51c2VyKSkgeworCQlhdXRoZW50aWNhdGVkID0gMDsKKwkJZmF0YWwoIkFjY2VzcyBkZW5pZWQgZm9yIHVzZXIgJXMuIixhdXRoY3R4dC0+dXNlcik7CisJfQorI2VuZGlmIC8qIF9VTklDT1MgKi8KKworCS8qIExvZyBiZWZvcmUgc2VuZGluZyB0aGUgcmVwbHkgKi8KKwlhdXRoX2xvZyhhdXRoY3R4dCwgYXV0aGVudGljYXRlZCwgbWV0aG9kLCAiIHNzaDIiKTsKKworCWlmIChhdXRoY3R4dC0+cG9zdHBvbmVkKQorCQlyZXR1cm47CisKKwkvKiBYWFggdG9kbzogY2hlY2sgaWYgbXVsdGlwbGUgYXV0aCBtZXRob2RzIGFyZSBuZWVkZWQgKi8KKwlpZiAoYXV0aGVudGljYXRlZCA9PSAxKSB7CisJCS8qIHR1cm4gb2ZmIHVzZXJhdXRoICovCisJCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9SRVFVRVNULCAmZGlzcGF0Y2hfcHJvdG9jb2xfaWdub3JlKTsKKwkJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX1VTRVJBVVRIX1NVQ0NFU1MpOworCQlwYWNrZXRfc2VuZCgpOworCQlwYWNrZXRfd3JpdGVfd2FpdCgpOworCQkvKiBub3cgd2UgY2FuIGJyZWFrIG91dCAqLworCQlhdXRoY3R4dC0+c3VjY2VzcyA9IDE7CisJfSBlbHNlIHsKKworCQkvKiBBbGxvdyBpbml0aWFsIHRyeSBvZiAibm9uZSIgYXV0aCB3aXRob3V0IGZhaWx1cmUgcGVuYWx0eSAqLworCQlpZiAoIWF1dGhjdHh0LT5zZXJ2ZXJfY2F1c2VkX2ZhaWx1cmUgJiYKKwkJICAgIChhdXRoY3R4dC0+YXR0ZW1wdCA+IDEgfHwgc3RyY21wKG1ldGhvZCwgIm5vbmUiKSAhPSAwKSkKKwkJCWF1dGhjdHh0LT5mYWlsdXJlcysrOworCQlpZiAoYXV0aGN0eHQtPmZhaWx1cmVzID49IG9wdGlvbnMubWF4X2F1dGh0cmllcykgeworI2lmZGVmIFNTSF9BVURJVF9FVkVOVFMKKwkJCVBSSVZTRVAoYXVkaXRfZXZlbnQoU1NIX0xPR0lOX0VYQ0VFRF9NQVhUUklFUykpOworI2VuZGlmCisJCQlwYWNrZXRfZGlzY29ubmVjdChBVVRIX0ZBSUxfTVNHLCBhdXRoY3R4dC0+dXNlcik7CisJCX0KKwkJbWV0aG9kcyA9IGF1dGhtZXRob2RzX2dldCgpOworCQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfVVNFUkFVVEhfRkFJTFVSRSk7CisJCXBhY2tldF9wdXRfY3N0cmluZyhtZXRob2RzKTsKKwkJcGFja2V0X3B1dF9jaGFyKDApOwkvKiBYWFggcGFydGlhbCBzdWNjZXNzLCB1bnVzZWQgKi8KKwkJcGFja2V0X3NlbmQoKTsKKwkJcGFja2V0X3dyaXRlX3dhaXQoKTsKKwkJeGZyZWUobWV0aG9kcyk7CisJfQorfQorCitzdGF0aWMgY2hhciAqCithdXRobWV0aG9kc19nZXQodm9pZCkKK3sKKwlCdWZmZXIgYjsKKwljaGFyICpsaXN0OworCWludCBpOworCisJYnVmZmVyX2luaXQoJmIpOworCWZvciAoaSA9IDA7IGF1dGhtZXRob2RzW2ldICE9IE5VTEw7IGkrKykgeworCQlpZiAoc3RyY21wKGF1dGhtZXRob2RzW2ldLT5uYW1lLCAibm9uZSIpID09IDApCisJCQljb250aW51ZTsKKwkJaWYgKGF1dGhtZXRob2RzW2ldLT5lbmFibGVkICE9IE5VTEwgJiYKKwkJICAgICooYXV0aG1ldGhvZHNbaV0tPmVuYWJsZWQpICE9IDApIHsKKwkJCWlmIChidWZmZXJfbGVuKCZiKSA+IDApCisJCQkJYnVmZmVyX2FwcGVuZCgmYiwgIiwiLCAxKTsKKwkJCWJ1ZmZlcl9hcHBlbmQoJmIsIGF1dGhtZXRob2RzW2ldLT5uYW1lLAorCQkJICAgIHN0cmxlbihhdXRobWV0aG9kc1tpXS0+bmFtZSkpOworCQl9CisJfQorCWJ1ZmZlcl9hcHBlbmQoJmIsICJcMCIsIDEpOworCWxpc3QgPSB4c3RyZHVwKGJ1ZmZlcl9wdHIoJmIpKTsKKwlidWZmZXJfZnJlZSgmYik7CisJcmV0dXJuIGxpc3Q7Cit9CisKK3N0YXRpYyBBdXRobWV0aG9kICoKK2F1dGhtZXRob2RfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisKKwlpZiAobmFtZSAhPSBOVUxMKQorCQlmb3IgKGkgPSAwOyBhdXRobWV0aG9kc1tpXSAhPSBOVUxMOyBpKyspCisJCQlpZiAoYXV0aG1ldGhvZHNbaV0tPmVuYWJsZWQgIT0gTlVMTCAmJgorCQkJICAgICooYXV0aG1ldGhvZHNbaV0tPmVuYWJsZWQpICE9IDAgJiYKKwkJCSAgICBzdHJjbXAobmFtZSwgYXV0aG1ldGhvZHNbaV0tPm5hbWUpID09IDApCisJCQkJcmV0dXJuIGF1dGhtZXRob2RzW2ldOworCWRlYnVnMigiVW5yZWNvZ25pemVkIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBuYW1lOiAlcyIsCisJICAgIG5hbWUgPyBuYW1lIDogIk5VTEwiKTsKKwlyZXR1cm4gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9hdXRoZmQuYyBiL29wZW5zc2gtNi4wcDEvYXV0aGZkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAzN2U4MwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvYXV0aGZkLmMKQEAgLTAsMCArMSw3MDggQEAKKy8qICRPcGVuQlNEOiBhdXRoZmQuYyx2IDEuODYgMjAxMS8wNy8wNiAxODowOToyMSB0ZWR1IEV4cCAkICovCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICogRnVuY3Rpb25zIGZvciBjb25uZWN0aW5nIHRoZSBsb2NhbCBhdXRoZW50aWNhdGlvbiBhZ2VudC4KKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICoKKyAqIFNTSDIgaW1wbGVtZW50YXRpb24sCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJzc2guaCIKKyNpbmNsdWRlICJyc2EuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJhdXRoZmQuaCIKKyNpbmNsdWRlICJjaXBoZXIuaCIKKyNpbmNsdWRlICJrZXguaCIKKyNpbmNsdWRlICJjb21wYXQuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJhdG9taWNpby5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKworc3RhdGljIGludCBhZ2VudF9wcmVzZW50ID0gMDsKKworLyogaGVscGVyICovCitpbnQJZGVjb2RlX3JlcGx5KGludCB0eXBlKTsKKworLyogbWFjcm8gdG8gY2hlY2sgZm9yICJhZ2VudCBmYWlsdXJlIiBtZXNzYWdlICovCisjZGVmaW5lIGFnZW50X2ZhaWxlZCh4KSBcCisgICAgKCh4ID09IFNTSF9BR0VOVF9GQUlMVVJFKSB8fCAoeCA9PSBTU0hfQ09NX0FHRU5UMl9GQUlMVVJFKSB8fCBcCisgICAgKHggPT0gU1NIMl9BR0VOVF9GQUlMVVJFKSkKKworaW50Citzc2hfYWdlbnRfcHJlc2VudCh2b2lkKQoreworCWludCBhdXRoZmQ7CisKKwlpZiAoYWdlbnRfcHJlc2VudCkKKwkJcmV0dXJuIDE7CisJaWYgKChhdXRoZmQgPSBzc2hfZ2V0X2F1dGhlbnRpY2F0aW9uX3NvY2tldCgpKSA9PSAtMSkKKwkJcmV0dXJuIDA7CisJZWxzZSB7CisJCXNzaF9jbG9zZV9hdXRoZW50aWNhdGlvbl9zb2NrZXQoYXV0aGZkKTsKKwkJcmV0dXJuIDE7CisJfQorfQorCisvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIGZkLCBvciAtMSBpZiB0aGVyZSBpcyBub25lLiAqLworCitpbnQKK3NzaF9nZXRfYXV0aGVudGljYXRpb25fc29ja2V0KHZvaWQpCit7CisJY29uc3QgY2hhciAqYXV0aHNvY2tldDsKKwlpbnQgc29jazsKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gc3VuYWRkcjsKKworCWF1dGhzb2NrZXQgPSBnZXRlbnYoU1NIX0FVVEhTT0NLRVRfRU5WX05BTUUpOworCWlmICghYXV0aHNvY2tldCkKKwkJcmV0dXJuIC0xOworCisJYnplcm8oJnN1bmFkZHIsIHNpemVvZihzdW5hZGRyKSk7CisJc3VuYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKwlzdHJsY3B5KHN1bmFkZHIuc3VuX3BhdGgsIGF1dGhzb2NrZXQsIHNpemVvZihzdW5hZGRyLnN1bl9wYXRoKSk7CisKKwlzb2NrID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKKwlpZiAoc29jayA8IDApCisJCXJldHVybiAtMTsKKworCS8qIGNsb3NlIG9uIGV4ZWMgKi8KKwlpZiAoZmNudGwoc29jaywgRl9TRVRGRCwgRkRfQ0xPRVhFQykgPT0gLTEpIHsKKwkJY2xvc2Uoc29jayk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGNvbm5lY3Qoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzdW5hZGRyLCBzaXplb2Ygc3VuYWRkcikgPCAwKSB7CisJCWNsb3NlKHNvY2spOworCQlyZXR1cm4gLTE7CisJfQorCWFnZW50X3ByZXNlbnQgPSAxOworCXJldHVybiBzb2NrOworfQorCitzdGF0aWMgaW50Citzc2hfcmVxdWVzdF9yZXBseShBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKmF1dGgsIEJ1ZmZlciAqcmVxdWVzdCwgQnVmZmVyICpyZXBseSkKK3sKKwl1X2ludCBsLCBsZW47CisJY2hhciBidWZbMTAyNF07CisKKwkvKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSwgYW5kIGZvcm1hdCBpdCBpbiB0aGUgYnVmZmVyLiAqLworCWxlbiA9IGJ1ZmZlcl9sZW4ocmVxdWVzdCk7CisJcHV0X3UzMihidWYsIGxlbik7CisKKwkvKiBTZW5kIHRoZSBsZW5ndGggYW5kIHRoZW4gdGhlIHBhY2tldCB0byB0aGUgYWdlbnQuICovCisJaWYgKGF0b21pY2lvKHZ3cml0ZSwgYXV0aC0+ZmQsIGJ1ZiwgNCkgIT0gNCB8fAorCSAgICBhdG9taWNpbyh2d3JpdGUsIGF1dGgtPmZkLCBidWZmZXJfcHRyKHJlcXVlc3QpLAorCSAgICBidWZmZXJfbGVuKHJlcXVlc3QpKSAhPSBidWZmZXJfbGVuKHJlcXVlc3QpKSB7CisJCWVycm9yKCJFcnJvciB3cml0aW5nIHRvIGF1dGhlbnRpY2F0aW9uIHNvY2tldC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogV2FpdCBmb3IgcmVzcG9uc2UgZnJvbSB0aGUgYWdlbnQuICBGaXJzdCByZWFkIHRoZSBsZW5ndGggb2YgdGhlCisJICogcmVzcG9uc2UgcGFja2V0LgorCSAqLworCWlmIChhdG9taWNpbyhyZWFkLCBhdXRoLT5mZCwgYnVmLCA0KSAhPSA0KSB7CisJICAgIGVycm9yKCJFcnJvciByZWFkaW5nIHJlc3BvbnNlIGxlbmd0aCBmcm9tIGF1dGhlbnRpY2F0aW9uIHNvY2tldC4iKTsKKwkgICAgcmV0dXJuIDA7CisJfQorCisJLyogRXh0cmFjdCB0aGUgbGVuZ3RoLCBhbmQgY2hlY2sgaXQgZm9yIHNhbml0eS4gKi8KKwlsZW4gPSBnZXRfdTMyKGJ1Zik7CisJaWYgKGxlbiA+IDI1NiAqIDEwMjQpCisJCWZhdGFsKCJBdXRoZW50aWNhdGlvbiByZXNwb25zZSB0b28gbG9uZzogJXUiLCBsZW4pOworCisJLyogUmVhZCB0aGUgcmVzdCBvZiB0aGUgcmVzcG9uc2UgaW4gdG8gdGhlIGJ1ZmZlci4gKi8KKwlidWZmZXJfY2xlYXIocmVwbHkpOworCXdoaWxlIChsZW4gPiAwKSB7CisJCWwgPSBsZW47CisJCWlmIChsID4gc2l6ZW9mKGJ1ZikpCisJCQlsID0gc2l6ZW9mKGJ1Zik7CisJCWlmIChhdG9taWNpbyhyZWFkLCBhdXRoLT5mZCwgYnVmLCBsKSAhPSBsKSB7CisJCQllcnJvcigiRXJyb3IgcmVhZGluZyByZXNwb25zZSBmcm9tIGF1dGhlbnRpY2F0aW9uIHNvY2tldC4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJ1ZmZlcl9hcHBlbmQocmVwbHksIGJ1ZiwgbCk7CisJCWxlbiAtPSBsOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIENsb3NlcyB0aGUgYWdlbnQgc29ja2V0IGlmIGl0IHNob3VsZCBiZSBjbG9zZWQgKGRlcGVuZHMgb24gaG93IGl0IHdhcworICogb2J0YWluZWQpLiAgVGhlIGFyZ3VtZW50IG11c3QgaGF2ZSBiZWVuIHJldHVybmVkIGJ5CisgKiBzc2hfZ2V0X2F1dGhlbnRpY2F0aW9uX3NvY2tldCgpLgorICovCisKK3ZvaWQKK3NzaF9jbG9zZV9hdXRoZW50aWNhdGlvbl9zb2NrZXQoaW50IHNvY2spCit7CisJaWYgKGdldGVudihTU0hfQVVUSFNPQ0tFVF9FTlZfTkFNRSkpCisJCWNsb3NlKHNvY2spOworfQorCisvKgorICogT3BlbnMgYW5kIGNvbm5lY3RzIGEgcHJpdmF0ZSBzb2NrZXQgZm9yIGNvbW11bmljYXRpb24gd2l0aCB0aGUKKyAqIGF1dGhlbnRpY2F0aW9uIGFnZW50LiAgUmV0dXJucyB0aGUgZmlsZSBkZXNjcmlwdG9yICh3aGljaCBtdXN0IGJlCisgKiBzaHV0IGRvd24gYW5kIGNsb3NlZCBieSB0aGUgY2FsbGVyIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZCkuCisgKiBSZXR1cm5zIE5VTEwgaWYgYW4gZXJyb3Igb2NjdXJyZWQgYW5kIHRoZSBjb25uZWN0aW9uIGNvdWxkIG5vdCBiZQorICogb3BlbmVkLgorICovCisKK0F1dGhlbnRpY2F0aW9uQ29ubmVjdGlvbiAqCitzc2hfZ2V0X2F1dGhlbnRpY2F0aW9uX2Nvbm5lY3Rpb24odm9pZCkKK3sKKwlBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKmF1dGg7CisJaW50IHNvY2s7CisKKwlzb2NrID0gc3NoX2dldF9hdXRoZW50aWNhdGlvbl9zb2NrZXQoKTsKKworCS8qCisJICogRmFpbCBpZiB3ZSBjb3VsZG4ndCBvYnRhaW4gYSBjb25uZWN0aW9uLiAgVGhpcyBoYXBwZW5zIGlmIHdlCisJICogZXhpdGVkIGR1ZSB0byBhIHRpbWVvdXQuCisJICovCisJaWYgKHNvY2sgPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCWF1dGggPSB4bWFsbG9jKHNpemVvZigqYXV0aCkpOworCWF1dGgtPmZkID0gc29jazsKKwlidWZmZXJfaW5pdCgmYXV0aC0+aWRlbnRpdGllcyk7CisJYXV0aC0+aG93bWFueSA9IDA7CisKKwlyZXR1cm4gYXV0aDsKK30KKworLyoKKyAqIENsb3NlcyB0aGUgY29ubmVjdGlvbiB0byB0aGUgYXV0aGVudGljYXRpb24gYWdlbnQgYW5kIGZyZWVzIGFueSBhc3NvY2lhdGVkCisgKiBtZW1vcnkuCisgKi8KKwordm9pZAorc3NoX2Nsb3NlX2F1dGhlbnRpY2F0aW9uX2Nvbm5lY3Rpb24oQXV0aGVudGljYXRpb25Db25uZWN0aW9uICphdXRoKQoreworCWJ1ZmZlcl9mcmVlKCZhdXRoLT5pZGVudGl0aWVzKTsKKwljbG9zZShhdXRoLT5mZCk7CisJeGZyZWUoYXV0aCk7Cit9CisKKy8qIExvY2svdW5sb2NrIGFnZW50ICovCitpbnQKK3NzaF9sb2NrX2FnZW50KEF1dGhlbnRpY2F0aW9uQ29ubmVjdGlvbiAqYXV0aCwgaW50IGxvY2ssIGNvbnN0IGNoYXIgKnBhc3N3b3JkKQoreworCWludCB0eXBlOworCUJ1ZmZlciBtc2c7CisKKwlidWZmZXJfaW5pdCgmbXNnKTsKKwlidWZmZXJfcHV0X2NoYXIoJm1zZywgbG9jayA/IFNTSF9BR0VOVENfTE9DSyA6IFNTSF9BR0VOVENfVU5MT0NLKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcoJm1zZywgcGFzc3dvcmQpOworCisJaWYgKHNzaF9yZXF1ZXN0X3JlcGx5KGF1dGgsICZtc2csICZtc2cpID09IDApIHsKKwkJYnVmZmVyX2ZyZWUoJm1zZyk7CisJCXJldHVybiAwOworCX0KKwl0eXBlID0gYnVmZmVyX2dldF9jaGFyKCZtc2cpOworCWJ1ZmZlcl9mcmVlKCZtc2cpOworCXJldHVybiBkZWNvZGVfcmVwbHkodHlwZSk7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBmaXJzdCBhdXRoZW50aWNhdGlvbiBpZGVudGl0eSBoZWxkIGJ5IHRoZSBhZ2VudC4KKyAqLworCitpbnQKK3NzaF9nZXRfbnVtX2lkZW50aXRpZXMoQXV0aGVudGljYXRpb25Db25uZWN0aW9uICphdXRoLCBpbnQgdmVyc2lvbikKK3sKKwlpbnQgdHlwZSwgY29kZTEgPSAwLCBjb2RlMiA9IDA7CisJQnVmZmVyIHJlcXVlc3Q7CisKKwlzd2l0Y2ggKHZlcnNpb24pIHsKKwljYXNlIDE6CisJCWNvZGUxID0gU1NIX0FHRU5UQ19SRVFVRVNUX1JTQV9JREVOVElUSUVTOworCQljb2RlMiA9IFNTSF9BR0VOVF9SU0FfSURFTlRJVElFU19BTlNXRVI7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJY29kZTEgPSBTU0gyX0FHRU5UQ19SRVFVRVNUX0lERU5USVRJRVM7CisJCWNvZGUyID0gU1NIMl9BR0VOVF9JREVOVElUSUVTX0FOU1dFUjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBTZW5kIGEgbWVzc2FnZSB0byB0aGUgYWdlbnQgcmVxdWVzdGluZyBmb3IgYSBsaXN0IG9mIHRoZQorCSAqIGlkZW50aXRpZXMgaXQgY2FuIHJlcHJlc2VudC4KKwkgKi8KKwlidWZmZXJfaW5pdCgmcmVxdWVzdCk7CisJYnVmZmVyX3B1dF9jaGFyKCZyZXF1ZXN0LCBjb2RlMSk7CisKKwlidWZmZXJfY2xlYXIoJmF1dGgtPmlkZW50aXRpZXMpOworCWlmIChzc2hfcmVxdWVzdF9yZXBseShhdXRoLCAmcmVxdWVzdCwgJmF1dGgtPmlkZW50aXRpZXMpID09IDApIHsKKwkJYnVmZmVyX2ZyZWUoJnJlcXVlc3QpOworCQlyZXR1cm4gMDsKKwl9CisJYnVmZmVyX2ZyZWUoJnJlcXVlc3QpOworCisJLyogR2V0IG1lc3NhZ2UgdHlwZSwgYW5kIHZlcmlmeSB0aGF0IHdlIGdvdCBhIHByb3BlciBhbnN3ZXIuICovCisJdHlwZSA9IGJ1ZmZlcl9nZXRfY2hhcigmYXV0aC0+aWRlbnRpdGllcyk7CisJaWYgKGFnZW50X2ZhaWxlZCh0eXBlKSkgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKHR5cGUgIT0gY29kZTIpIHsKKwkJZmF0YWwoIkJhZCBhdXRoZW50aWNhdGlvbiByZXBseSBtZXNzYWdlIHR5cGU6ICVkIiwgdHlwZSk7CisJfQorCisJLyogR2V0IHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcmVzcG9uc2UgYW5kIGNoZWNrIGl0IGZvciBzYW5pdHkuICovCisJYXV0aC0+aG93bWFueSA9IGJ1ZmZlcl9nZXRfaW50KCZhdXRoLT5pZGVudGl0aWVzKTsKKwlpZiAoKHVfaW50KWF1dGgtPmhvd21hbnkgPiAxMDI0KQorCQlmYXRhbCgiVG9vIG1hbnkgaWRlbnRpdGllcyBpbiBhdXRoZW50aWNhdGlvbiByZXBseTogJWQiLAorCQkgICAgYXV0aC0+aG93bWFueSk7CisKKwlyZXR1cm4gYXV0aC0+aG93bWFueTsKK30KKworS2V5ICoKK3NzaF9nZXRfZmlyc3RfaWRlbnRpdHkoQXV0aGVudGljYXRpb25Db25uZWN0aW9uICphdXRoLCBjaGFyICoqY29tbWVudCwgaW50IHZlcnNpb24pCit7CisJLyogZ2V0IG51bWJlciBvZiBpZGVudGl0aWVzIGFuZCByZXR1cm4gdGhlIGZpcnN0IGVudHJ5IChpZiBhbnkpLiAqLworCWlmIChzc2hfZ2V0X251bV9pZGVudGl0aWVzKGF1dGgsIHZlcnNpb24pID4gMCkKKwkJcmV0dXJuIHNzaF9nZXRfbmV4dF9pZGVudGl0eShhdXRoLCBjb21tZW50LCB2ZXJzaW9uKTsKKwlyZXR1cm4gTlVMTDsKK30KKworS2V5ICoKK3NzaF9nZXRfbmV4dF9pZGVudGl0eShBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKmF1dGgsIGNoYXIgKipjb21tZW50LCBpbnQgdmVyc2lvbikKK3sKKwlpbnQga2V5Yml0czsKKwl1X2ludCBiaXRzOworCXVfY2hhciAqYmxvYjsKKwl1X2ludCBibGVuOworCUtleSAqa2V5ID0gTlVMTDsKKworCS8qIFJldHVybiBmYWlsdXJlIGlmIG5vIG1vcmUgZW50cmllcy4gKi8KKwlpZiAoYXV0aC0+aG93bWFueSA8PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogR2V0IHRoZSBuZXh0IGVudHJ5IGZyb20gdGhlIHBhY2tldC4gIFRoZXNlIHdpbGwgYWJvcnQgd2l0aCBhIGZhdGFsCisJICogZXJyb3IgaWYgdGhlIHBhY2tldCBpcyB0b28gc2hvcnQgb3IgY29udGFpbnMgY29ycnVwdCBkYXRhLgorCSAqLworCXN3aXRjaCAodmVyc2lvbikgeworCWNhc2UgMToKKwkJa2V5ID0ga2V5X25ldyhLRVlfUlNBMSk7CisJCWJpdHMgPSBidWZmZXJfZ2V0X2ludCgmYXV0aC0+aWRlbnRpdGllcyk7CisJCWJ1ZmZlcl9nZXRfYmlnbnVtKCZhdXRoLT5pZGVudGl0aWVzLCBrZXktPnJzYS0+ZSk7CisJCWJ1ZmZlcl9nZXRfYmlnbnVtKCZhdXRoLT5pZGVudGl0aWVzLCBrZXktPnJzYS0+bik7CisJCSpjb21tZW50ID0gYnVmZmVyX2dldF9zdHJpbmcoJmF1dGgtPmlkZW50aXRpZXMsIE5VTEwpOworCQlrZXliaXRzID0gQk5fbnVtX2JpdHMoa2V5LT5yc2EtPm4pOworCQlpZiAoa2V5Yml0cyA8IDAgfHwgYml0cyAhPSAodV9pbnQpa2V5Yml0cykKKwkJCWxvZ2l0KCJXYXJuaW5nOiBpZGVudGl0eSBrZXlzaXplIG1pc21hdGNoOiBhY3R1YWwgJWQsIGFubm91bmNlZCAldSIsCisJCQkgICAgQk5fbnVtX2JpdHMoa2V5LT5yc2EtPm4pLCBiaXRzKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlibG9iID0gYnVmZmVyX2dldF9zdHJpbmcoJmF1dGgtPmlkZW50aXRpZXMsICZibGVuKTsKKwkJKmNvbW1lbnQgPSBidWZmZXJfZ2V0X3N0cmluZygmYXV0aC0+aWRlbnRpdGllcywgTlVMTCk7CisJCWtleSA9IGtleV9mcm9tX2Jsb2IoYmxvYiwgYmxlbik7CisJCXhmcmVlKGJsb2IpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9CisJLyogRGVjcmVtZW50IHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGVudHJpZXMuICovCisJYXV0aC0+aG93bWFueS0tOworCXJldHVybiBrZXk7Cit9CisKKy8qCisgKiBHZW5lcmF0ZXMgYSByYW5kb20gY2hhbGxlbmdlLCBzZW5kcyBpdCB0byB0aGUgYWdlbnQsIGFuZCB3YWl0cyBmb3IKKyAqIHJlc3BvbnNlIGZyb20gdGhlIGFnZW50LiAgUmV0dXJucyB0cnVlIChub24temVybykgaWYgdGhlIGFnZW50IGdhdmUgdGhlCisgKiBjb3JyZWN0IGFuc3dlciwgemVybyBvdGhlcndpc2UuICBSZXNwb25zZSB0eXBlIHNlbGVjdHMgdGhlIHN0eWxlIG9mCisgKiByZXNwb25zZSBkZXNpcmVkLCB3aXRoIDAgY29ycmVzcG9uZGluZyB0byBwcm90b2NvbCB2ZXJzaW9uIDEuMCAobm8gbG9uZ2VyCisgKiBzdXBwb3J0ZWQpIGFuZCAxIGNvcnJlc3BvbmRpbmcgdG8gcHJvdG9jb2wgdmVyc2lvbiAxLjEuCisgKi8KKworaW50Citzc2hfZGVjcnlwdF9jaGFsbGVuZ2UoQXV0aGVudGljYXRpb25Db25uZWN0aW9uICphdXRoLAorICAgIEtleSoga2V5LCBCSUdOVU0gKmNoYWxsZW5nZSwKKyAgICB1X2NoYXIgc2Vzc2lvbl9pZFsxNl0sCisgICAgdV9pbnQgcmVzcG9uc2VfdHlwZSwKKyAgICB1X2NoYXIgcmVzcG9uc2VbMTZdKQoreworCUJ1ZmZlciBidWZmZXI7CisJaW50IHN1Y2Nlc3MgPSAwOworCWludCBpOworCWludCB0eXBlOworCisJaWYgKGtleS0+dHlwZSAhPSBLRVlfUlNBMSkKKwkJcmV0dXJuIDA7CisJaWYgKHJlc3BvbnNlX3R5cGUgPT0gMCkgeworCQlsb2dpdCgiQ29tcGF0aWJpbGl0eSB3aXRoIHNzaCBwcm90b2NvbCB2ZXJzaW9uIDEuMCBubyBsb25nZXIgc3VwcG9ydGVkLiIpOworCQlyZXR1cm4gMDsKKwl9CisJYnVmZmVyX2luaXQoJmJ1ZmZlcik7CisJYnVmZmVyX3B1dF9jaGFyKCZidWZmZXIsIFNTSF9BR0VOVENfUlNBX0NIQUxMRU5HRSk7CisJYnVmZmVyX3B1dF9pbnQoJmJ1ZmZlciwgQk5fbnVtX2JpdHMoa2V5LT5yc2EtPm4pKTsKKwlidWZmZXJfcHV0X2JpZ251bSgmYnVmZmVyLCBrZXktPnJzYS0+ZSk7CisJYnVmZmVyX3B1dF9iaWdudW0oJmJ1ZmZlciwga2V5LT5yc2EtPm4pOworCWJ1ZmZlcl9wdXRfYmlnbnVtKCZidWZmZXIsIGNoYWxsZW5nZSk7CisJYnVmZmVyX2FwcGVuZCgmYnVmZmVyLCBzZXNzaW9uX2lkLCAxNik7CisJYnVmZmVyX3B1dF9pbnQoJmJ1ZmZlciwgcmVzcG9uc2VfdHlwZSk7CisKKwlpZiAoc3NoX3JlcXVlc3RfcmVwbHkoYXV0aCwgJmJ1ZmZlciwgJmJ1ZmZlcikgPT0gMCkgeworCQlidWZmZXJfZnJlZSgmYnVmZmVyKTsKKwkJcmV0dXJuIDA7CisJfQorCXR5cGUgPSBidWZmZXJfZ2V0X2NoYXIoJmJ1ZmZlcik7CisKKwlpZiAoYWdlbnRfZmFpbGVkKHR5cGUpKSB7CisJCWxvZ2l0KCJBZ2VudCBhZG1pdHRlZCBmYWlsdXJlIHRvIGF1dGhlbnRpY2F0ZSB1c2luZyB0aGUga2V5LiIpOworCX0gZWxzZSBpZiAodHlwZSAhPSBTU0hfQUdFTlRfUlNBX1JFU1BPTlNFKSB7CisJCWZhdGFsKCJCYWQgYXV0aGVudGljYXRpb24gcmVzcG9uc2U6ICVkIiwgdHlwZSk7CisJfSBlbHNlIHsKKwkJc3VjY2VzcyA9IDE7CisJCS8qCisJCSAqIEdldCB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgcGFja2V0LiAgVGhpcyB3aWxsIGFib3J0IHdpdGggYQorCQkgKiBmYXRhbCBlcnJvciBpZiB0aGUgcGFja2V0IGlzIGNvcnJ1cHQuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJCXJlc3BvbnNlW2ldID0gKHVfY2hhcilidWZmZXJfZ2V0X2NoYXIoJmJ1ZmZlcik7CisJfQorCWJ1ZmZlcl9mcmVlKCZidWZmZXIpOworCXJldHVybiBzdWNjZXNzOworfQorCisvKiBhc2sgYWdlbnQgdG8gc2lnbiBkYXRhLCByZXR1cm5zIC0xIG9uIGVycm9yLCAwIG9uIHN1Y2Nlc3MgKi8KK2ludAorc3NoX2FnZW50X3NpZ24oQXV0aGVudGljYXRpb25Db25uZWN0aW9uICphdXRoLAorICAgIEtleSAqa2V5LAorICAgIHVfY2hhciAqKnNpZ3AsIHVfaW50ICpsZW5wLAorICAgIHVfY2hhciAqZGF0YSwgdV9pbnQgZGF0YWxlbikKK3sKKwlleHRlcm4gaW50IGRhdGFmZWxsb3dzOworCUJ1ZmZlciBtc2c7CisJdV9jaGFyICpibG9iOworCXVfaW50IGJsZW47CisJaW50IHR5cGUsIGZsYWdzID0gMDsKKwlpbnQgcmV0ID0gLTE7CisKKwlpZiAoa2V5X3RvX2Jsb2Ioa2V5LCAmYmxvYiwgJmJsZW4pID09IDApCisJCXJldHVybiAtMTsKKworCWlmIChkYXRhZmVsbG93cyAmIFNTSF9CVUdfU0lHQkxPQikKKwkJZmxhZ3MgPSBTU0hfQUdFTlRfT0xEX1NJR05BVFVSRTsKKworCWJ1ZmZlcl9pbml0KCZtc2cpOworCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0gyX0FHRU5UQ19TSUdOX1JFUVVFU1QpOworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtc2csIGJsb2IsIGJsZW4pOworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtc2csIGRhdGEsIGRhdGFsZW4pOworCWJ1ZmZlcl9wdXRfaW50KCZtc2csIGZsYWdzKTsKKwl4ZnJlZShibG9iKTsKKworCWlmIChzc2hfcmVxdWVzdF9yZXBseShhdXRoLCAmbXNnLCAmbXNnKSA9PSAwKSB7CisJCWJ1ZmZlcl9mcmVlKCZtc2cpOworCQlyZXR1cm4gLTE7CisJfQorCXR5cGUgPSBidWZmZXJfZ2V0X2NoYXIoJm1zZyk7CisJaWYgKGFnZW50X2ZhaWxlZCh0eXBlKSkgeworCQlsb2dpdCgiQWdlbnQgYWRtaXR0ZWQgZmFpbHVyZSB0byBzaWduIHVzaW5nIHRoZSBrZXkuIik7CisJfSBlbHNlIGlmICh0eXBlICE9IFNTSDJfQUdFTlRfU0lHTl9SRVNQT05TRSkgeworCQlmYXRhbCgiQmFkIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlOiAlZCIsIHR5cGUpOworCX0gZWxzZSB7CisJCXJldCA9IDA7CisJCSpzaWdwID0gYnVmZmVyX2dldF9zdHJpbmcoJm1zZywgbGVucCk7CisJfQorCWJ1ZmZlcl9mcmVlKCZtc2cpOworCXJldHVybiByZXQ7Cit9CisKKy8qIEVuY29kZSBrZXkgZm9yIGEgbWVzc2FnZSB0byB0aGUgYWdlbnQuICovCisKK3N0YXRpYyB2b2lkCitzc2hfZW5jb2RlX2lkZW50aXR5X3JzYTEoQnVmZmVyICpiLCBSU0EgKmtleSwgY29uc3QgY2hhciAqY29tbWVudCkKK3sKKwlidWZmZXJfcHV0X2ludChiLCBCTl9udW1fYml0cyhrZXktPm4pKTsKKwlidWZmZXJfcHV0X2JpZ251bShiLCBrZXktPm4pOworCWJ1ZmZlcl9wdXRfYmlnbnVtKGIsIGtleS0+ZSk7CisJYnVmZmVyX3B1dF9iaWdudW0oYiwga2V5LT5kKTsKKwkvKiBUbyBrZWVwIHdpdGhpbiB0aGUgcHJvdG9jb2w6IHAgPCBxIGZvciBzc2guIGluIFNTTCBwID4gcSAqLworCWJ1ZmZlcl9wdXRfYmlnbnVtKGIsIGtleS0+aXFtcCk7CS8qIHNzaCBrZXktPnUgKi8KKwlidWZmZXJfcHV0X2JpZ251bShiLCBrZXktPnEpOwkvKiBzc2gga2V5LT5wLCBTU0wga2V5LT5xICovCisJYnVmZmVyX3B1dF9iaWdudW0oYiwga2V5LT5wKTsJLyogc3NoIGtleS0+cSwgU1NMIGtleS0+cCAqLworCWJ1ZmZlcl9wdXRfY3N0cmluZyhiLCBjb21tZW50KTsKK30KKworc3RhdGljIHZvaWQKK3NzaF9lbmNvZGVfaWRlbnRpdHlfc3NoMihCdWZmZXIgKmIsIEtleSAqa2V5LCBjb25zdCBjaGFyICpjb21tZW50KQoreworCWJ1ZmZlcl9wdXRfY3N0cmluZyhiLCBrZXlfc3NoX25hbWUoa2V5KSk7CisJc3dpdGNoIChrZXktPnR5cGUpIHsKKwljYXNlIEtFWV9SU0E6CisJCWJ1ZmZlcl9wdXRfYmlnbnVtMihiLCBrZXktPnJzYS0+bik7CisJCWJ1ZmZlcl9wdXRfYmlnbnVtMihiLCBrZXktPnJzYS0+ZSk7CisJCWJ1ZmZlcl9wdXRfYmlnbnVtMihiLCBrZXktPnJzYS0+ZCk7CisJCWJ1ZmZlcl9wdXRfYmlnbnVtMihiLCBrZXktPnJzYS0+aXFtcCk7CisJCWJ1ZmZlcl9wdXRfYmlnbnVtMihiLCBrZXktPnJzYS0+cCk7CisJCWJ1ZmZlcl9wdXRfYmlnbnVtMihiLCBrZXktPnJzYS0+cSk7CisJCWJyZWFrOworCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKKwljYXNlIEtFWV9SU0FfQ0VSVDoKKwkJaWYgKGtleS0+Y2VydCA9PSBOVUxMIHx8IGJ1ZmZlcl9sZW4oJmtleS0+Y2VydC0+Y2VydGJsb2IpID09IDApCisJCQlmYXRhbCgiJXM6IG5vIGNlcnQvY2VydGJsb2IiLCBfX2Z1bmNfXyk7CisJCWJ1ZmZlcl9wdXRfc3RyaW5nKGIsIGJ1ZmZlcl9wdHIoJmtleS0+Y2VydC0+Y2VydGJsb2IpLAorCQkgICAgYnVmZmVyX2xlbigma2V5LT5jZXJ0LT5jZXJ0YmxvYikpOworCQlidWZmZXJfcHV0X2JpZ251bTIoYiwga2V5LT5yc2EtPmQpOworCQlidWZmZXJfcHV0X2JpZ251bTIoYiwga2V5LT5yc2EtPmlxbXApOworCQlidWZmZXJfcHV0X2JpZ251bTIoYiwga2V5LT5yc2EtPnApOworCQlidWZmZXJfcHV0X2JpZ251bTIoYiwga2V5LT5yc2EtPnEpOworCQlicmVhazsKKwljYXNlIEtFWV9EU0E6CisJCWJ1ZmZlcl9wdXRfYmlnbnVtMihiLCBrZXktPmRzYS0+cCk7CisJCWJ1ZmZlcl9wdXRfYmlnbnVtMihiLCBrZXktPmRzYS0+cSk7CisJCWJ1ZmZlcl9wdXRfYmlnbnVtMihiLCBrZXktPmRzYS0+Zyk7CisJCWJ1ZmZlcl9wdXRfYmlnbnVtMihiLCBrZXktPmRzYS0+cHViX2tleSk7CisJCWJ1ZmZlcl9wdXRfYmlnbnVtMihiLCBrZXktPmRzYS0+cHJpdl9rZXkpOworCQlicmVhazsKKwljYXNlIEtFWV9EU0FfQ0VSVF9WMDA6CisJY2FzZSBLRVlfRFNBX0NFUlQ6CisJCWlmIChrZXktPmNlcnQgPT0gTlVMTCB8fCBidWZmZXJfbGVuKCZrZXktPmNlcnQtPmNlcnRibG9iKSA9PSAwKQorCQkJZmF0YWwoIiVzOiBubyBjZXJ0L2NlcnRibG9iIiwgX19mdW5jX18pOworCQlidWZmZXJfcHV0X3N0cmluZyhiLCBidWZmZXJfcHRyKCZrZXktPmNlcnQtPmNlcnRibG9iKSwKKwkJICAgIGJ1ZmZlcl9sZW4oJmtleS0+Y2VydC0+Y2VydGJsb2IpKTsKKwkJYnVmZmVyX3B1dF9iaWdudW0yKGIsIGtleS0+ZHNhLT5wcml2X2tleSk7CisJCWJyZWFrOworI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworCWNhc2UgS0VZX0VDRFNBOgorCQlidWZmZXJfcHV0X2NzdHJpbmcoYiwga2V5X2N1cnZlX25pZF90b19uYW1lKGtleS0+ZWNkc2FfbmlkKSk7CisJCWJ1ZmZlcl9wdXRfZWNwb2ludChiLCBFQ19LRVlfZ2V0MF9ncm91cChrZXktPmVjZHNhKSwKKwkJICAgIEVDX0tFWV9nZXQwX3B1YmxpY19rZXkoa2V5LT5lY2RzYSkpOworCQlidWZmZXJfcHV0X2JpZ251bTIoYiwgRUNfS0VZX2dldDBfcHJpdmF0ZV9rZXkoa2V5LT5lY2RzYSkpOworCQlicmVhazsKKwljYXNlIEtFWV9FQ0RTQV9DRVJUOgorCQlpZiAoa2V5LT5jZXJ0ID09IE5VTEwgfHwgYnVmZmVyX2xlbigma2V5LT5jZXJ0LT5jZXJ0YmxvYikgPT0gMCkKKwkJCWZhdGFsKCIlczogbm8gY2VydC9jZXJ0YmxvYiIsIF9fZnVuY19fKTsKKwkJYnVmZmVyX3B1dF9zdHJpbmcoYiwgYnVmZmVyX3B0cigma2V5LT5jZXJ0LT5jZXJ0YmxvYiksCisJCSAgICBidWZmZXJfbGVuKCZrZXktPmNlcnQtPmNlcnRibG9iKSk7CisJCWJ1ZmZlcl9wdXRfYmlnbnVtMihiLCBFQ19LRVlfZ2V0MF9wcml2YXRlX2tleShrZXktPmVjZHNhKSk7CisJCWJyZWFrOworI2VuZGlmCisJfQorCWJ1ZmZlcl9wdXRfY3N0cmluZyhiLCBjb21tZW50KTsKK30KKworLyoKKyAqIEFkZHMgYW4gaWRlbnRpdHkgdG8gdGhlIGF1dGhlbnRpY2F0aW9uIHNlcnZlci4gIFRoaXMgY2FsbCBpcyBub3QgbWVhbnQgdG8KKyAqIGJlIHVzZWQgYnkgbm9ybWFsIGFwcGxpY2F0aW9ucy4KKyAqLworCitpbnQKK3NzaF9hZGRfaWRlbnRpdHlfY29uc3RyYWluZWQoQXV0aGVudGljYXRpb25Db25uZWN0aW9uICphdXRoLCBLZXkgKmtleSwKKyAgICBjb25zdCBjaGFyICpjb21tZW50LCB1X2ludCBsaWZlLCB1X2ludCBjb25maXJtKQoreworCUJ1ZmZlciBtc2c7CisJaW50IHR5cGUsIGNvbnN0cmFpbmVkID0gKGxpZmUgfHwgY29uZmlybSk7CisKKwlidWZmZXJfaW5pdCgmbXNnKTsKKworCXN3aXRjaCAoa2V5LT50eXBlKSB7CisJY2FzZSBLRVlfUlNBMToKKwkJdHlwZSA9IGNvbnN0cmFpbmVkID8KKwkJICAgIFNTSF9BR0VOVENfQUREX1JTQV9JRF9DT05TVFJBSU5FRCA6CisJCSAgICBTU0hfQUdFTlRDX0FERF9SU0FfSURFTlRJVFk7CisJCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCB0eXBlKTsKKwkJc3NoX2VuY29kZV9pZGVudGl0eV9yc2ExKCZtc2csIGtleS0+cnNhLCBjb21tZW50KTsKKwkJYnJlYWs7CisJY2FzZSBLRVlfUlNBOgorCWNhc2UgS0VZX1JTQV9DRVJUOgorCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKKwljYXNlIEtFWV9EU0E6CisJY2FzZSBLRVlfRFNBX0NFUlQ6CisJY2FzZSBLRVlfRFNBX0NFUlRfVjAwOgorCWNhc2UgS0VZX0VDRFNBOgorCWNhc2UgS0VZX0VDRFNBX0NFUlQ6CisJCXR5cGUgPSBjb25zdHJhaW5lZCA/CisJCSAgICBTU0gyX0FHRU5UQ19BRERfSURfQ09OU1RSQUlORUQgOgorCQkgICAgU1NIMl9BR0VOVENfQUREX0lERU5USVRZOworCQlidWZmZXJfcHV0X2NoYXIoJm1zZywgdHlwZSk7CisJCXNzaF9lbmNvZGVfaWRlbnRpdHlfc3NoMigmbXNnLCBrZXksIGNvbW1lbnQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlidWZmZXJfZnJlZSgmbXNnKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChjb25zdHJhaW5lZCkgeworCQlpZiAobGlmZSAhPSAwKSB7CisJCQlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIX0FHRU5UX0NPTlNUUkFJTl9MSUZFVElNRSk7CisJCQlidWZmZXJfcHV0X2ludCgmbXNnLCBsaWZlKTsKKwkJfQorCQlpZiAoY29uZmlybSAhPSAwKQorCQkJYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSF9BR0VOVF9DT05TVFJBSU5fQ09ORklSTSk7CisJfQorCWlmIChzc2hfcmVxdWVzdF9yZXBseShhdXRoLCAmbXNnLCAmbXNnKSA9PSAwKSB7CisJCWJ1ZmZlcl9mcmVlKCZtc2cpOworCQlyZXR1cm4gMDsKKwl9CisJdHlwZSA9IGJ1ZmZlcl9nZXRfY2hhcigmbXNnKTsKKwlidWZmZXJfZnJlZSgmbXNnKTsKKwlyZXR1cm4gZGVjb2RlX3JlcGx5KHR5cGUpOworfQorCisvKgorICogUmVtb3ZlcyBhbiBpZGVudGl0eSBmcm9tIHRoZSBhdXRoZW50aWNhdGlvbiBzZXJ2ZXIuICBUaGlzIGNhbGwgaXMgbm90CisgKiBtZWFudCB0byBiZSB1c2VkIGJ5IG5vcm1hbCBhcHBsaWNhdGlvbnMuCisgKi8KKworaW50Citzc2hfcmVtb3ZlX2lkZW50aXR5KEF1dGhlbnRpY2F0aW9uQ29ubmVjdGlvbiAqYXV0aCwgS2V5ICprZXkpCit7CisJQnVmZmVyIG1zZzsKKwlpbnQgdHlwZTsKKwl1X2NoYXIgKmJsb2I7CisJdV9pbnQgYmxlbjsKKworCWJ1ZmZlcl9pbml0KCZtc2cpOworCisJaWYgKGtleS0+dHlwZSA9PSBLRVlfUlNBMSkgeworCQlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIX0FHRU5UQ19SRU1PVkVfUlNBX0lERU5USVRZKTsKKwkJYnVmZmVyX3B1dF9pbnQoJm1zZywgQk5fbnVtX2JpdHMoa2V5LT5yc2EtPm4pKTsKKwkJYnVmZmVyX3B1dF9iaWdudW0oJm1zZywga2V5LT5yc2EtPmUpOworCQlidWZmZXJfcHV0X2JpZ251bSgmbXNnLCBrZXktPnJzYS0+bik7CisJfSBlbHNlIGlmIChrZXlfdHlwZV9wbGFpbihrZXktPnR5cGUpID09IEtFWV9EU0EgfHwKKwkgICAga2V5X3R5cGVfcGxhaW4oa2V5LT50eXBlKSA9PSBLRVlfUlNBIHx8CisJICAgIGtleV90eXBlX3BsYWluKGtleS0+dHlwZSkgPT0gS0VZX0VDRFNBKSB7CisJCWtleV90b19ibG9iKGtleSwgJmJsb2IsICZibGVuKTsKKwkJYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSDJfQUdFTlRDX1JFTU9WRV9JREVOVElUWSk7CisJCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtc2csIGJsb2IsIGJsZW4pOworCQl4ZnJlZShibG9iKTsKKwl9IGVsc2UgeworCQlidWZmZXJfZnJlZSgmbXNnKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChzc2hfcmVxdWVzdF9yZXBseShhdXRoLCAmbXNnLCAmbXNnKSA9PSAwKSB7CisJCWJ1ZmZlcl9mcmVlKCZtc2cpOworCQlyZXR1cm4gMDsKKwl9CisJdHlwZSA9IGJ1ZmZlcl9nZXRfY2hhcigmbXNnKTsKKwlidWZmZXJfZnJlZSgmbXNnKTsKKwlyZXR1cm4gZGVjb2RlX3JlcGx5KHR5cGUpOworfQorCitpbnQKK3NzaF91cGRhdGVfY2FyZChBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKmF1dGgsIGludCBhZGQsCisgICAgY29uc3QgY2hhciAqcmVhZGVyX2lkLCBjb25zdCBjaGFyICpwaW4sIHVfaW50IGxpZmUsIHVfaW50IGNvbmZpcm0pCit7CisJQnVmZmVyIG1zZzsKKwlpbnQgdHlwZSwgY29uc3RyYWluZWQgPSAobGlmZSB8fCBjb25maXJtKTsKKworCWlmIChhZGQpIHsKKwkJdHlwZSA9IGNvbnN0cmFpbmVkID8KKwkJICAgIFNTSF9BR0VOVENfQUREX1NNQVJUQ0FSRF9LRVlfQ09OU1RSQUlORUQgOgorCQkgICAgU1NIX0FHRU5UQ19BRERfU01BUlRDQVJEX0tFWTsKKwl9IGVsc2UKKwkJdHlwZSA9IFNTSF9BR0VOVENfUkVNT1ZFX1NNQVJUQ0FSRF9LRVk7CisKKwlidWZmZXJfaW5pdCgmbXNnKTsKKwlidWZmZXJfcHV0X2NoYXIoJm1zZywgdHlwZSk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csIHJlYWRlcl9pZCk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csIHBpbik7CisKKwlpZiAoY29uc3RyYWluZWQpIHsKKwkJaWYgKGxpZmUgIT0gMCkgeworCQkJYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSF9BR0VOVF9DT05TVFJBSU5fTElGRVRJTUUpOworCQkJYnVmZmVyX3B1dF9pbnQoJm1zZywgbGlmZSk7CisJCX0KKwkJaWYgKGNvbmZpcm0gIT0gMCkKKwkJCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0hfQUdFTlRfQ09OU1RSQUlOX0NPTkZJUk0pOworCX0KKworCWlmIChzc2hfcmVxdWVzdF9yZXBseShhdXRoLCAmbXNnLCAmbXNnKSA9PSAwKSB7CisJCWJ1ZmZlcl9mcmVlKCZtc2cpOworCQlyZXR1cm4gMDsKKwl9CisJdHlwZSA9IGJ1ZmZlcl9nZXRfY2hhcigmbXNnKTsKKwlidWZmZXJfZnJlZSgmbXNnKTsKKwlyZXR1cm4gZGVjb2RlX3JlcGx5KHR5cGUpOworfQorCisvKgorICogUmVtb3ZlcyBhbGwgaWRlbnRpdGllcyBmcm9tIHRoZSBhZ2VudC4gIFRoaXMgY2FsbCBpcyBub3QgbWVhbnQgdG8gYmUgdXNlZAorICogYnkgbm9ybWFsIGFwcGxpY2F0aW9ucy4KKyAqLworCitpbnQKK3NzaF9yZW1vdmVfYWxsX2lkZW50aXRpZXMoQXV0aGVudGljYXRpb25Db25uZWN0aW9uICphdXRoLCBpbnQgdmVyc2lvbikKK3sKKwlCdWZmZXIgbXNnOworCWludCB0eXBlOworCWludCBjb2RlID0gKHZlcnNpb249PTEpID8KKwkJU1NIX0FHRU5UQ19SRU1PVkVfQUxMX1JTQV9JREVOVElUSUVTIDoKKwkJU1NIMl9BR0VOVENfUkVNT1ZFX0FMTF9JREVOVElUSUVTOworCisJYnVmZmVyX2luaXQoJm1zZyk7CisJYnVmZmVyX3B1dF9jaGFyKCZtc2csIGNvZGUpOworCisJaWYgKHNzaF9yZXF1ZXN0X3JlcGx5KGF1dGgsICZtc2csICZtc2cpID09IDApIHsKKwkJYnVmZmVyX2ZyZWUoJm1zZyk7CisJCXJldHVybiAwOworCX0KKwl0eXBlID0gYnVmZmVyX2dldF9jaGFyKCZtc2cpOworCWJ1ZmZlcl9mcmVlKCZtc2cpOworCXJldHVybiBkZWNvZGVfcmVwbHkodHlwZSk7Cit9CisKK2ludAorZGVjb2RlX3JlcGx5KGludCB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU1NIX0FHRU5UX0ZBSUxVUkU6CisJY2FzZSBTU0hfQ09NX0FHRU5UMl9GQUlMVVJFOgorCWNhc2UgU1NIMl9BR0VOVF9GQUlMVVJFOgorCQlsb2dpdCgiU1NIX0FHRU5UX0ZBSUxVUkUiKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBTU0hfQUdFTlRfU1VDQ0VTUzoKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJZmF0YWwoIkJhZCByZXNwb25zZSBmcm9tIGF1dGhlbnRpY2F0aW9uIGFnZW50OiAlZCIsIHR5cGUpOworCX0KKwkvKiBOT1RSRUFDSEVEICovCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2F1dGhmZC5oIGIvb3BlbnNzaC02LjBwMS9hdXRoZmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTgyYTI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9hdXRoZmQuaApAQCAtMCwwICsxLDk0IEBACisvKiAkT3BlbkJTRDogYXV0aGZkLmgsdiAxLjM3IDIwMDkvMDgvMjcgMTc6NDQ6NTIgZGptIEV4cCAkICovCisKKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiBGdW5jdGlvbnMgdG8gaW50ZXJmYWNlIHdpdGggdGhlIFNTSF9BVVRIRU5USUNBVElPTl9GRCBzb2NrZXQuCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqLworCisjaWZuZGVmIEFVVEhGRF9ICisjZGVmaW5lIEFVVEhGRF9ICisKKy8qIE1lc3NhZ2VzIGZvciB0aGUgYXV0aGVudGljYXRpb24gYWdlbnQgY29ubmVjdGlvbi4gKi8KKyNkZWZpbmUgU1NIX0FHRU5UQ19SRVFVRVNUX1JTQV9JREVOVElUSUVTCTEKKyNkZWZpbmUgU1NIX0FHRU5UX1JTQV9JREVOVElUSUVTX0FOU1dFUgkJMgorI2RlZmluZSBTU0hfQUdFTlRDX1JTQV9DSEFMTEVOR0UJCTMKKyNkZWZpbmUgU1NIX0FHRU5UX1JTQV9SRVNQT05TRQkJCTQKKyNkZWZpbmUgU1NIX0FHRU5UX0ZBSUxVUkUJCQk1CisjZGVmaW5lIFNTSF9BR0VOVF9TVUNDRVNTCQkJNgorI2RlZmluZSBTU0hfQUdFTlRDX0FERF9SU0FfSURFTlRJVFkJCTcKKyNkZWZpbmUgU1NIX0FHRU5UQ19SRU1PVkVfUlNBX0lERU5USVRZCQk4CisjZGVmaW5lIFNTSF9BR0VOVENfUkVNT1ZFX0FMTF9SU0FfSURFTlRJVElFUwk5CisKKy8qIHByaXZhdGUgT3BlblNTSCBleHRlbnNpb25zIGZvciBTU0gyICovCisjZGVmaW5lIFNTSDJfQUdFTlRDX1JFUVVFU1RfSURFTlRJVElFUwkJMTEKKyNkZWZpbmUgU1NIMl9BR0VOVF9JREVOVElUSUVTX0FOU1dFUgkJMTIKKyNkZWZpbmUgU1NIMl9BR0VOVENfU0lHTl9SRVFVRVNUCQkxMworI2RlZmluZSBTU0gyX0FHRU5UX1NJR05fUkVTUE9OU0UJCTE0CisjZGVmaW5lIFNTSDJfQUdFTlRDX0FERF9JREVOVElUWQkJMTcKKyNkZWZpbmUgU1NIMl9BR0VOVENfUkVNT1ZFX0lERU5USVRZCQkxOAorI2RlZmluZSBTU0gyX0FHRU5UQ19SRU1PVkVfQUxMX0lERU5USVRJRVMJMTkKKworLyogc21hcnRjYXJkICovCisjZGVmaW5lIFNTSF9BR0VOVENfQUREX1NNQVJUQ0FSRF9LRVkJCTIwCisjZGVmaW5lIFNTSF9BR0VOVENfUkVNT1ZFX1NNQVJUQ0FSRF9LRVkJCTIxCisKKy8qIGxvY2svdW5sb2NrIHRoZSBhZ2VudCAqLworI2RlZmluZSBTU0hfQUdFTlRDX0xPQ0sJCQkJMjIKKyNkZWZpbmUgU1NIX0FHRU5UQ19VTkxPQ0sJCQkyMworCisvKiBhZGQga2V5IHdpdGggY29uc3RyYWludHMgKi8KKyNkZWZpbmUgU1NIX0FHRU5UQ19BRERfUlNBX0lEX0NPTlNUUkFJTkVECTI0CisjZGVmaW5lIFNTSDJfQUdFTlRDX0FERF9JRF9DT05TVFJBSU5FRAkJMjUKKyNkZWZpbmUgU1NIX0FHRU5UQ19BRERfU01BUlRDQVJEX0tFWV9DT05TVFJBSU5FRCAyNgorCisjZGVmaW5lCVNTSF9BR0VOVF9DT05TVFJBSU5fTElGRVRJTUUJCTEKKyNkZWZpbmUJU1NIX0FHRU5UX0NPTlNUUkFJTl9DT05GSVJNCQkyCisKKy8qIGV4dGVuZGVkIGZhaWx1cmUgbWVzc2FnZXMgKi8KKyNkZWZpbmUgU1NIMl9BR0VOVF9GQUlMVVJFCQkJMzAKKworLyogYWRkaXRpb25hbCBlcnJvciBjb2RlIGZvciBzc2guY29tJ3Mgc3NoLWFnZW50MiAqLworI2RlZmluZSBTU0hfQ09NX0FHRU5UMl9GQUlMVVJFCQkJMTAyCisKKyNkZWZpbmUJU1NIX0FHRU5UX09MRF9TSUdOQVRVUkUJCQkweDAxCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQJZmQ7CisJQnVmZmVyCWlkZW50aXRpZXM7CisJaW50CWhvd21hbnk7Cit9CUF1dGhlbnRpY2F0aW9uQ29ubmVjdGlvbjsKKworaW50CXNzaF9hZ2VudF9wcmVzZW50KHZvaWQpOworaW50CXNzaF9nZXRfYXV0aGVudGljYXRpb25fc29ja2V0KHZvaWQpOwordm9pZAlzc2hfY2xvc2VfYXV0aGVudGljYXRpb25fc29ja2V0KGludCk7CisKK0F1dGhlbnRpY2F0aW9uQ29ubmVjdGlvbiAqc3NoX2dldF9hdXRoZW50aWNhdGlvbl9jb25uZWN0aW9uKHZvaWQpOwordm9pZAlzc2hfY2xvc2VfYXV0aGVudGljYXRpb25fY29ubmVjdGlvbihBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKik7CitpbnQJIHNzaF9nZXRfbnVtX2lkZW50aXRpZXMoQXV0aGVudGljYXRpb25Db25uZWN0aW9uICosIGludCk7CitLZXkJKnNzaF9nZXRfZmlyc3RfaWRlbnRpdHkoQXV0aGVudGljYXRpb25Db25uZWN0aW9uICosIGNoYXIgKiosIGludCk7CitLZXkJKnNzaF9nZXRfbmV4dF9pZGVudGl0eShBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKiwgY2hhciAqKiwgaW50KTsKK2ludAkgc3NoX2FkZF9pZGVudGl0eV9jb25zdHJhaW5lZChBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKiwgS2V5ICosCisgICAgY29uc3QgY2hhciAqLCB1X2ludCwgdV9pbnQpOworaW50CSBzc2hfcmVtb3ZlX2lkZW50aXR5KEF1dGhlbnRpY2F0aW9uQ29ubmVjdGlvbiAqLCBLZXkgKik7CitpbnQJIHNzaF9yZW1vdmVfYWxsX2lkZW50aXRpZXMoQXV0aGVudGljYXRpb25Db25uZWN0aW9uICosIGludCk7CitpbnQJIHNzaF9sb2NrX2FnZW50KEF1dGhlbnRpY2F0aW9uQ29ubmVjdGlvbiAqLCBpbnQsIGNvbnN0IGNoYXIgKik7CitpbnQJIHNzaF91cGRhdGVfY2FyZChBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKiwgaW50LCBjb25zdCBjaGFyICosCisgICAgY29uc3QgY2hhciAqLCB1X2ludCwgdV9pbnQpOworCitpbnQKK3NzaF9kZWNyeXB0X2NoYWxsZW5nZShBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKiwgS2V5ICosIEJJR05VTSAqLCB1X2NoYXJbMTZdLAorICAgIHVfaW50LCB1X2NoYXJbMTZdKTsKKworaW50Citzc2hfYWdlbnRfc2lnbihBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKiwgS2V5ICosIHVfY2hhciAqKiwgdV9pbnQgKiwgdV9jaGFyICosCisgICAgdV9pbnQpOworCisjZW5kaWYJCQkJLyogQVVUSEZEX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvYXV0aGZpbGUuYyBiL29wZW5zc2gtNi4wcDEvYXV0aGZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGQ0NDk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9hdXRoZmlsZS5jCkBAIC0wLDAgKzEsOTQ2IEBACisvKiAkT3BlbkJTRDogYXV0aGZpbGUuYyx2IDEuOTMgMjAxMi8wMS8yNSAxOTozNjozMSBtYXJrdXMgRXhwICQgKi8KKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIGlkZW50aXR5IGZpbGVzLCBhbmQKKyAqIGZvciByZWFkaW5nIHRoZSBwYXNzcGhyYXNlIGZyb20gdGhlIHVzZXIuCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisKKy8qIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgb3IgYnJva2VuIE9wZW5TU0wgdmVyc2lvbnMgKi8KKyNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9vcGVuc3NsLWNvbXBhdC5oIgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAiY2lwaGVyLmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAia2V5LmgiCisjaW5jbHVkZSAic3NoLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAiYXV0aGZpbGUuaCIKKyNpbmNsdWRlICJyc2EuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAiYXRvbWljaW8uaCIKKworI2RlZmluZSBNQVhfS0VZX0ZJTEVfU0laRQkoMTAyNCAqIDEwMjQpCisKKy8qIFZlcnNpb24gaWRlbnRpZmljYXRpb24gc3RyaW5nIGZvciBTU0ggdjEgaWRlbnRpdHkgZmlsZXMuICovCitzdGF0aWMgY29uc3QgY2hhciBhdXRoZmlsZV9pZF9zdHJpbmdbXSA9CisgICAgIlNTSCBQUklWQVRFIEtFWSBGSUxFIEZPUk1BVCAxLjFcbiI7CisKKy8qCisgKiBTZXJpYWxpc2VzIHRoZSBhdXRoZW50aWNhdGlvbiAocHJpdmF0ZSkga2V5IHRvIGEgYmxvYiwgZW5jcnlwdGluZyBpdCB3aXRoCisgKiBwYXNzcGhyYXNlLiAgVGhlIGlkZW50aWZpY2F0aW9uIG9mIHRoZSBibG9iIChsb3dlc3QgNjQgYml0cyBvZiBuKSB3aWxsCisgKiBwcmVjZWRlIHRoZSBrZXkgdG8gcHJvdmlkZSBpZGVudGlmaWNhdGlvbiBvZiB0aGUga2V5IHdpdGhvdXQgbmVlZGluZyBhCisgKiBwYXNzcGhyYXNlLgorICovCitzdGF0aWMgaW50CitrZXlfcHJpdmF0ZV9yc2ExX3RvX2Jsb2IoS2V5ICprZXksIEJ1ZmZlciAqYmxvYiwgY29uc3QgY2hhciAqcGFzc3BocmFzZSwKKyAgICBjb25zdCBjaGFyICpjb21tZW50KQoreworCUJ1ZmZlciBidWZmZXIsIGVuY3J5cHRlZDsKKwl1X2NoYXIgYnVmWzEwMF0sICpjcDsKKwlpbnQgaSwgY2lwaGVyX251bTsKKwlDaXBoZXJDb250ZXh0IGNpcGhlcmNvbnRleHQ7CisJQ2lwaGVyICpjaXBoZXI7CisJdV9pbnQzMl90IHJuZDsKKworCS8qCisJICogSWYgdGhlIHBhc3NwaHJhc2UgaXMgZW1wdHksIHVzZSBTU0hfQ0lQSEVSX05PTkUgdG8gZWFzZSBjb252ZXJ0aW5nCisJICogdG8gYW5vdGhlciBjaXBoZXI7IG90aGVyd2lzZSB1c2UgU1NIX0FVVEhGSUxFX0NJUEhFUi4KKwkgKi8KKwljaXBoZXJfbnVtID0gKHN0cmNtcChwYXNzcGhyYXNlLCAiIikgPT0gMCkgPworCSAgICBTU0hfQ0lQSEVSX05PTkUgOiBTU0hfQVVUSEZJTEVfQ0lQSEVSOworCWlmICgoY2lwaGVyID0gY2lwaGVyX2J5X251bWJlcihjaXBoZXJfbnVtKSkgPT0gTlVMTCkKKwkJZmF0YWwoInNhdmVfcHJpdmF0ZV9rZXlfcnNhOiBiYWQgY2lwaGVyIik7CisKKwkvKiBUaGlzIGJ1ZmZlciBpcyB1c2VkIHRvIGJ1aWx0IHRoZSBzZWNyZXQgcGFydCBvZiB0aGUgcHJpdmF0ZSBrZXkuICovCisJYnVmZmVyX2luaXQoJmJ1ZmZlcik7CisKKwkvKiBQdXQgY2hlY2tieXRlcyBmb3IgY2hlY2tpbmcgcGFzc3BocmFzZSB2YWxpZGl0eS4gKi8KKwlybmQgPSBhcmM0cmFuZG9tKCk7CisJYnVmWzBdID0gcm5kICYgMHhmZjsKKwlidWZbMV0gPSAocm5kID4+IDgpICYgMHhmZjsKKwlidWZbMl0gPSBidWZbMF07CisJYnVmWzNdID0gYnVmWzFdOworCWJ1ZmZlcl9hcHBlbmQoJmJ1ZmZlciwgYnVmLCA0KTsKKworCS8qCisJICogU3RvcmUgdGhlIHByaXZhdGUga2V5IChuIGFuZCBlIHdpbGwgbm90IGJlIHN0b3JlZCBiZWNhdXNlIHRoZXkKKwkgKiB3aWxsIGJlIHN0b3JlZCBpbiBwbGFpbiB0ZXh0LCBhbmQgc3RvcmluZyB0aGVtIGFsc28gaW4gZW5jcnlwdGVkCisJICogZm9ybWF0IHdvdWxkIGp1c3QgZ2l2ZSBrbm93biBwbGFpbnRleHQpLgorCSAqLworCWJ1ZmZlcl9wdXRfYmlnbnVtKCZidWZmZXIsIGtleS0+cnNhLT5kKTsKKwlidWZmZXJfcHV0X2JpZ251bSgmYnVmZmVyLCBrZXktPnJzYS0+aXFtcCk7CisJYnVmZmVyX3B1dF9iaWdudW0oJmJ1ZmZlciwga2V5LT5yc2EtPnEpOwkvKiByZXZlcnNlIGZyb20gU1NMIHAgKi8KKwlidWZmZXJfcHV0X2JpZ251bSgmYnVmZmVyLCBrZXktPnJzYS0+cCk7CS8qIHJldmVyc2UgZnJvbSBTU0wgcSAqLworCisJLyogUGFkIHRoZSBwYXJ0IHRvIGJlIGVuY3J5cHRlZCB1bnRpbCBpdHMgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIDguICovCisJd2hpbGUgKGJ1ZmZlcl9sZW4oJmJ1ZmZlcikgJSA4ICE9IDApCisJCWJ1ZmZlcl9wdXRfY2hhcigmYnVmZmVyLCAwKTsKKworCS8qIFRoaXMgYnVmZmVyIHdpbGwgYmUgdXNlZCB0byBjb250YWluIHRoZSBkYXRhIGluIHRoZSBmaWxlLiAqLworCWJ1ZmZlcl9pbml0KCZlbmNyeXB0ZWQpOworCisJLyogRmlyc3Qgc3RvcmUga2V5ZmlsZSBpZCBzdHJpbmcuICovCisJZm9yIChpID0gMDsgYXV0aGZpbGVfaWRfc3RyaW5nW2ldOyBpKyspCisJCWJ1ZmZlcl9wdXRfY2hhcigmZW5jcnlwdGVkLCBhdXRoZmlsZV9pZF9zdHJpbmdbaV0pOworCWJ1ZmZlcl9wdXRfY2hhcigmZW5jcnlwdGVkLCAwKTsKKworCS8qIFN0b3JlIGNpcGhlciB0eXBlLiAqLworCWJ1ZmZlcl9wdXRfY2hhcigmZW5jcnlwdGVkLCBjaXBoZXJfbnVtKTsKKwlidWZmZXJfcHV0X2ludCgmZW5jcnlwdGVkLCAwKTsJLyogRm9yIGZ1dHVyZSBleHRlbnNpb24gKi8KKworCS8qIFN0b3JlIHB1YmxpYyBrZXkuICBUaGlzIHdpbGwgYmUgaW4gcGxhaW4gdGV4dC4gKi8KKwlidWZmZXJfcHV0X2ludCgmZW5jcnlwdGVkLCBCTl9udW1fYml0cyhrZXktPnJzYS0+bikpOworCWJ1ZmZlcl9wdXRfYmlnbnVtKCZlbmNyeXB0ZWQsIGtleS0+cnNhLT5uKTsKKwlidWZmZXJfcHV0X2JpZ251bSgmZW5jcnlwdGVkLCBrZXktPnJzYS0+ZSk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZlbmNyeXB0ZWQsIGNvbW1lbnQpOworCisJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBwcml2YXRlIHBhcnQgb2YgdGhlIGtleSBpbiB0aGUgYnVmZmVyLiAqLworCWNwID0gYnVmZmVyX2FwcGVuZF9zcGFjZSgmZW5jcnlwdGVkLCBidWZmZXJfbGVuKCZidWZmZXIpKTsKKworCWNpcGhlcl9zZXRfa2V5X3N0cmluZygmY2lwaGVyY29udGV4dCwgY2lwaGVyLCBwYXNzcGhyYXNlLAorCSAgICBDSVBIRVJfRU5DUllQVCk7CisJY2lwaGVyX2NyeXB0KCZjaXBoZXJjb250ZXh0LCBjcCwKKwkgICAgYnVmZmVyX3B0cigmYnVmZmVyKSwgYnVmZmVyX2xlbigmYnVmZmVyKSk7CisJY2lwaGVyX2NsZWFudXAoJmNpcGhlcmNvbnRleHQpOworCW1lbXNldCgmY2lwaGVyY29udGV4dCwgMCwgc2l6ZW9mKGNpcGhlcmNvbnRleHQpKTsKKworCS8qIERlc3Ryb3kgdGVtcG9yYXJ5IGRhdGEuICovCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCWJ1ZmZlcl9mcmVlKCZidWZmZXIpOworCisJYnVmZmVyX2FwcGVuZChibG9iLCBidWZmZXJfcHRyKCZlbmNyeXB0ZWQpLCBidWZmZXJfbGVuKCZlbmNyeXB0ZWQpKTsKKwlidWZmZXJfZnJlZSgmZW5jcnlwdGVkKTsKKworCXJldHVybiAxOworfQorCisvKiBjb252ZXJ0IFNTSCB2MiBrZXkgaW4gT3BlblNTTCBQRU0gZm9ybWF0ICovCitzdGF0aWMgaW50CitrZXlfcHJpdmF0ZV9wZW1fdG9fYmxvYihLZXkgKmtleSwgQnVmZmVyICpibG9iLCBjb25zdCBjaGFyICpfcGFzc3BocmFzZSwKKyAgICBjb25zdCBjaGFyICpjb21tZW50KQoreworCWludCBzdWNjZXNzID0gMDsKKwlpbnQgYmxlbiwgbGVuID0gc3RybGVuKF9wYXNzcGhyYXNlKTsKKwl1X2NoYXIgKnBhc3NwaHJhc2UgPSAobGVuID4gMCkgPyAodV9jaGFyICopX3Bhc3NwaHJhc2UgOiBOVUxMOworI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgwMDkwNzAwMEwpCisJY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyID0gKGxlbiA+IDApID8gRVZQX2Rlc19lZGUzX2NiYygpIDogTlVMTDsKKyNlbHNlCisJY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyID0gKGxlbiA+IDApID8gRVZQX2Flc18xMjhfY2JjKCkgOiBOVUxMOworI2VuZGlmCisJY29uc3QgdV9jaGFyICpicHRyOworCUJJTyAqYmlvOworCisJaWYgKGxlbiA+IDAgJiYgbGVuIDw9IDQpIHsKKwkJZXJyb3IoInBhc3NwaHJhc2UgdG9vIHNob3J0OiBoYXZlICVkIGJ5dGVzLCBuZWVkID4gNCIsIGxlbik7CisJCXJldHVybiAwOworCX0KKwlpZiAoKGJpbyA9IEJJT19uZXcoQklPX3NfbWVtKCkpKSA9PSBOVUxMKSB7CisJCWVycm9yKCIlczogQklPX25ldyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKwlzd2l0Y2ggKGtleS0+dHlwZSkgeworCWNhc2UgS0VZX0RTQToKKwkJc3VjY2VzcyA9IFBFTV93cml0ZV9iaW9fRFNBUHJpdmF0ZUtleShiaW8sIGtleS0+ZHNhLAorCQkgICAgY2lwaGVyLCBwYXNzcGhyYXNlLCBsZW4sIE5VTEwsIE5VTEwpOworCQlicmVhazsKKyNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKKwljYXNlIEtFWV9FQ0RTQToKKwkJc3VjY2VzcyA9IFBFTV93cml0ZV9iaW9fRUNQcml2YXRlS2V5KGJpbywga2V5LT5lY2RzYSwKKwkJICAgIGNpcGhlciwgcGFzc3BocmFzZSwgbGVuLCBOVUxMLCBOVUxMKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIEtFWV9SU0E6CisJCXN1Y2Nlc3MgPSBQRU1fd3JpdGVfYmlvX1JTQVByaXZhdGVLZXkoYmlvLCBrZXktPnJzYSwKKwkJICAgIGNpcGhlciwgcGFzc3BocmFzZSwgbGVuLCBOVUxMLCBOVUxMKTsKKwkJYnJlYWs7CisJfQorCWlmIChzdWNjZXNzKSB7CisJCWlmICgoYmxlbiA9IEJJT19nZXRfbWVtX2RhdGEoYmlvLCAmYnB0cikpIDw9IDApCisJCQlzdWNjZXNzID0gMDsKKwkJZWxzZQorCQkJYnVmZmVyX2FwcGVuZChibG9iLCBicHRyLCBibGVuKTsKKwl9CisJQklPX2ZyZWUoYmlvKTsKKwlyZXR1cm4gc3VjY2VzczsKK30KKworLyogU2F2ZSBhIGtleSBibG9iIHRvIGEgZmlsZSAqLworc3RhdGljIGludAora2V5X3NhdmVfcHJpdmF0ZV9ibG9iKEJ1ZmZlciAqa2V5YnVmLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlpbnQgZmQ7CisKKwlpZiAoKGZkID0gb3BlbihmaWxlbmFtZSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgMDYwMCkpIDwgMCkgeworCQllcnJvcigib3BlbiAlcyBmYWlsZWQ6ICVzLiIsIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGF0b21pY2lvKHZ3cml0ZSwgZmQsIGJ1ZmZlcl9wdHIoa2V5YnVmKSwKKwkgICAgYnVmZmVyX2xlbihrZXlidWYpKSAhPSBidWZmZXJfbGVuKGtleWJ1ZikpIHsKKwkJZXJyb3IoIndyaXRlIHRvIGtleSBmaWxlICVzIGZhaWxlZDogJXMiLCBmaWxlbmFtZSwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKGZkKTsKKwkJdW5saW5rKGZpbGVuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCWNsb3NlKGZkKTsKKwlyZXR1cm4gMTsKK30KKworLyogU2VyaWFsaXNlICJrZXkiIHRvIGJ1ZmZlciAiYmxvYiIgKi8KK3N0YXRpYyBpbnQKK2tleV9wcml2YXRlX3RvX2Jsb2IoS2V5ICprZXksIEJ1ZmZlciAqYmxvYiwgY29uc3QgY2hhciAqcGFzc3BocmFzZSwKKyAgICBjb25zdCBjaGFyICpjb21tZW50KQoreworCXN3aXRjaCAoa2V5LT50eXBlKSB7CisJY2FzZSBLRVlfUlNBMToKKwkJcmV0dXJuIGtleV9wcml2YXRlX3JzYTFfdG9fYmxvYihrZXksIGJsb2IsIHBhc3NwaHJhc2UsIGNvbW1lbnQpOworCWNhc2UgS0VZX0RTQToKKwljYXNlIEtFWV9FQ0RTQToKKwljYXNlIEtFWV9SU0E6CisJCXJldHVybiBrZXlfcHJpdmF0ZV9wZW1fdG9fYmxvYihrZXksIGJsb2IsIHBhc3NwaHJhc2UsIGNvbW1lbnQpOworCWRlZmF1bHQ6CisJCWVycm9yKCIlczogY2Fubm90IHNhdmUga2V5IHR5cGUgJWQiLCBfX2Z1bmNfXywga2V5LT50eXBlKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitpbnQKK2tleV9zYXZlX3ByaXZhdGUoS2V5ICprZXksIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpwYXNzcGhyYXNlLAorICAgIGNvbnN0IGNoYXIgKmNvbW1lbnQpCit7CisJQnVmZmVyIGtleWJsb2I7CisJaW50IHN1Y2Nlc3MgPSAwOworCisJYnVmZmVyX2luaXQoJmtleWJsb2IpOworCWlmICgha2V5X3ByaXZhdGVfdG9fYmxvYihrZXksICZrZXlibG9iLCBwYXNzcGhyYXNlLCBjb21tZW50KSkKKwkJZ290byBvdXQ7CisJaWYgKCFrZXlfc2F2ZV9wcml2YXRlX2Jsb2IoJmtleWJsb2IsIGZpbGVuYW1lKSkKKwkJZ290byBvdXQ7CisJc3VjY2VzcyA9IDE7Cisgb3V0OgorCWJ1ZmZlcl9mcmVlKCZrZXlibG9iKTsKKwlyZXR1cm4gc3VjY2VzczsKK30KKworLyoKKyAqIFBhcnNlIHRoZSBwdWJsaWMsIHVuZW5jcnlwdGVkIHBvcnRpb24gb2YgYSBSU0ExIGtleS4KKyAqLworc3RhdGljIEtleSAqCitrZXlfcGFyc2VfcHVibGljX3JzYTEoQnVmZmVyICpibG9iLCBjaGFyICoqY29tbWVudHApCit7CisJS2V5ICpwdWI7CisJQnVmZmVyIGNvcHk7CisKKwkvKiBDaGVjayB0aGF0IGl0IGlzIGF0IGxlYXN0IGJpZyBlbm91Z2ggdG8gY29udGFpbiB0aGUgSUQgc3RyaW5nLiAqLworCWlmIChidWZmZXJfbGVuKGJsb2IpIDwgc2l6ZW9mKGF1dGhmaWxlX2lkX3N0cmluZykpIHsKKwkJZGVidWczKCJUcnVuY2F0ZWQgUlNBMSBpZGVudGlmaWVyIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogTWFrZSBzdXJlIGl0IGJlZ2lucyB3aXRoIHRoZSBpZCBzdHJpbmcuICBDb25zdW1lIHRoZSBpZCBzdHJpbmcKKwkgKiBmcm9tIHRoZSBidWZmZXIuCisJICovCisJaWYgKG1lbWNtcChidWZmZXJfcHRyKGJsb2IpLCBhdXRoZmlsZV9pZF9zdHJpbmcsCisJICAgIHNpemVvZihhdXRoZmlsZV9pZF9zdHJpbmcpKSAhPSAwKSB7CisJCWRlYnVnMygiSW5jb3JyZWN0IFJTQTEgaWRlbnRpZmllciIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYnVmZmVyX2luaXQoJmNvcHkpOworCWJ1ZmZlcl9hcHBlbmQoJmNvcHksIGJ1ZmZlcl9wdHIoYmxvYiksIGJ1ZmZlcl9sZW4oYmxvYikpOworCWJ1ZmZlcl9jb25zdW1lKCZjb3B5LCBzaXplb2YoYXV0aGZpbGVfaWRfc3RyaW5nKSk7CisKKwkvKiBTa2lwIGNpcGhlciB0eXBlIGFuZCByZXNlcnZlZCBkYXRhLiAqLworCSh2b2lkKSBidWZmZXJfZ2V0X2NoYXIoJmNvcHkpOwkJLyogY2lwaGVyIHR5cGUgKi8KKwkodm9pZCkgYnVmZmVyX2dldF9pbnQoJmNvcHkpOwkJLyogcmVzZXJ2ZWQgKi8KKworCS8qIFJlYWQgdGhlIHB1YmxpYyBrZXkgZnJvbSB0aGUgYnVmZmVyLiAqLworCSh2b2lkKSBidWZmZXJfZ2V0X2ludCgmY29weSk7CisJcHViID0ga2V5X25ldyhLRVlfUlNBMSk7CisJYnVmZmVyX2dldF9iaWdudW0oJmNvcHksIHB1Yi0+cnNhLT5uKTsKKwlidWZmZXJfZ2V0X2JpZ251bSgmY29weSwgcHViLT5yc2EtPmUpOworCWlmIChjb21tZW50cCkKKwkJKmNvbW1lbnRwID0gYnVmZmVyX2dldF9zdHJpbmcoJmNvcHksIE5VTEwpOworCS8qIFRoZSBlbmNyeXB0ZWQgcHJpdmF0ZSBwYXJ0IGlzIG5vdCBwYXJzZWQgYnkgdGhpcyBmdW5jdGlvbi4gKi8KKwlidWZmZXJfZnJlZSgmY29weSk7CisKKwlyZXR1cm4gcHViOworfQorCisvKiBMb2FkIGEga2V5IGZyb20gYSBmZCBpbnRvIGEgYnVmZmVyICovCitpbnQKK2tleV9sb2FkX2ZpbGUoaW50IGZkLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgQnVmZmVyICpibG9iKQoreworCXVfY2hhciBidWZbMTAyNF07CisJc2l6ZV90IGxlbjsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChmc3RhdChmZCwgJnN0KSA8IDApIHsKKwkJZXJyb3IoIiVzOiBmc3RhdCBvZiBrZXkgZmlsZSAlLjIwMHMlc2ZhaWxlZDogJS4xMDBzIiwgX19mdW5jX18sCisJCSAgICBmaWxlbmFtZSA9PSBOVUxMID8gIiIgOiBmaWxlbmFtZSwKKwkJICAgIGZpbGVuYW1lID09IE5VTEwgPyAiIiA6ICIgIiwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoKHN0LnN0X21vZGUgJiAoU19JRlNPQ0t8U19JRkNIUnxTX0lGSUZPKSkgPT0gMCAmJgorCSAgICBzdC5zdF9zaXplID4gTUFYX0tFWV9GSUxFX1NJWkUpIHsKKyB0b29iaWc6CisJCWVycm9yKCIlczoga2V5IGZpbGUgJS4yMDBzJXN0b28gbGFyZ2UiLCBfX2Z1bmNfXywKKwkJICAgIGZpbGVuYW1lID09IE5VTEwgPyAiIiA6IGZpbGVuYW1lLAorCQkgICAgZmlsZW5hbWUgPT0gTlVMTCA/ICIiIDogIiAiKTsKKwkJcmV0dXJuIDA7CisJfQorCWJ1ZmZlcl9jbGVhcihibG9iKTsKKwlmb3IgKDs7KSB7CisJCWlmICgobGVuID0gYXRvbWljaW8ocmVhZCwgZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSA9PSAwKSB7CisJCQlpZiAoZXJybm8gPT0gRVBJUEUpCisJCQkJYnJlYWs7CisJCQlkZWJ1ZygiJXM6IHJlYWQgZnJvbSBrZXkgZmlsZSAlLjIwMHMlc2ZhaWxlZDogJS4xMDBzIiwKKwkJCSAgICBfX2Z1bmNfXywgZmlsZW5hbWUgPT0gTlVMTCA/ICIiIDogZmlsZW5hbWUsCisJCQkgICAgZmlsZW5hbWUgPT0gTlVMTCA/ICIiIDogIiAiLCBzdHJlcnJvcihlcnJubykpOworCQkJYnVmZmVyX2NsZWFyKGJsb2IpOworCQkJYnplcm8oYnVmLCBzaXplb2YoYnVmKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlidWZmZXJfYXBwZW5kKGJsb2IsIGJ1ZiwgbGVuKTsKKwkJaWYgKGJ1ZmZlcl9sZW4oYmxvYikgPiBNQVhfS0VZX0ZJTEVfU0laRSkgeworCQkJYnVmZmVyX2NsZWFyKGJsb2IpOworCQkJYnplcm8oYnVmLCBzaXplb2YoYnVmKSk7CisJCQlnb3RvIHRvb2JpZzsKKwkJfQorCX0KKwliemVybyhidWYsIHNpemVvZihidWYpKTsKKwlpZiAoKHN0LnN0X21vZGUgJiAoU19JRlNPQ0t8U19JRkNIUnxTX0lGSUZPKSkgPT0gMCAmJgorCSAgICBzdC5zdF9zaXplICE9IGJ1ZmZlcl9sZW4oYmxvYikpIHsKKwkJZGVidWcoIiVzOiBrZXkgZmlsZSAlLjIwMHMlc2NoYW5nZWQgc2l6ZSB3aGlsZSByZWFkaW5nIiwKKwkJICAgIF9fZnVuY19fLCBmaWxlbmFtZSA9PSBOVUxMID8gIiIgOiBmaWxlbmFtZSwKKwkJICAgIGZpbGVuYW1lID09IE5VTEwgPyAiIiA6ICIgIik7CisJCWJ1ZmZlcl9jbGVhcihibG9iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBMb2FkcyB0aGUgcHVibGljIHBhcnQgb2YgdGhlIHNzaCB2MSBrZXkgZmlsZS4gIFJldHVybnMgTlVMTCBpZiBhbiBlcnJvciB3YXMKKyAqIGVuY291bnRlcmVkICh0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgcmVhZGFibGUpLCBhbmQgdGhlIGtleQorICogb3RoZXJ3aXNlLgorICovCitzdGF0aWMgS2V5ICoKK2tleV9sb2FkX3B1YmxpY19yc2ExKGludCBmZCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGNoYXIgKipjb21tZW50cCkKK3sKKwlCdWZmZXIgYnVmZmVyOworCUtleSAqcHViOworCisJYnVmZmVyX2luaXQoJmJ1ZmZlcik7CisJaWYgKCFrZXlfbG9hZF9maWxlKGZkLCBmaWxlbmFtZSwgJmJ1ZmZlcikpIHsKKwkJYnVmZmVyX2ZyZWUoJmJ1ZmZlcik7CisJCXJldHVybiBOVUxMOworCX0KKworCXB1YiA9IGtleV9wYXJzZV9wdWJsaWNfcnNhMSgmYnVmZmVyLCBjb21tZW50cCk7CisJaWYgKHB1YiA9PSBOVUxMKQorCQlkZWJ1ZzMoIkNvdWxkIG5vdCBsb2FkIFwiJXNcIiBhcyBhIFJTQTEgcHVibGljIGtleSIsIGZpbGVuYW1lKTsKKwlidWZmZXJfZnJlZSgmYnVmZmVyKTsKKwlyZXR1cm4gcHViOworfQorCisvKiBsb2FkIHB1YmxpYyBrZXkgZnJvbSBwcml2YXRlLWtleSBmaWxlLCB3b3JrcyBvbmx5IGZvciBTU0ggdjEgKi8KK0tleSAqCitrZXlfbG9hZF9wdWJsaWNfdHlwZShpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGNoYXIgKipjb21tZW50cCkKK3sKKwlLZXkgKnB1YjsKKwlpbnQgZmQ7CisKKwlpZiAodHlwZSA9PSBLRVlfUlNBMSkgeworCQlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwkJaWYgKGZkIDwgMCkKKwkJCXJldHVybiBOVUxMOworCQlwdWIgPSBrZXlfbG9hZF9wdWJsaWNfcnNhMShmZCwgZmlsZW5hbWUsIGNvbW1lbnRwKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gcHViOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIEtleSAqCitrZXlfcGFyc2VfcHJpdmF0ZV9yc2ExKEJ1ZmZlciAqYmxvYiwgY29uc3QgY2hhciAqcGFzc3BocmFzZSwgY2hhciAqKmNvbW1lbnRwKQoreworCWludCBjaGVjazEsIGNoZWNrMiwgY2lwaGVyX3R5cGU7CisJQnVmZmVyIGRlY3J5cHRlZDsKKwl1X2NoYXIgKmNwOworCUNpcGhlckNvbnRleHQgY2lwaGVyY29udGV4dDsKKwlDaXBoZXIgKmNpcGhlcjsKKwlLZXkgKnBydiA9IE5VTEw7CisJQnVmZmVyIGNvcHk7CisKKwkvKiBDaGVjayB0aGF0IGl0IGlzIGF0IGxlYXN0IGJpZyBlbm91Z2ggdG8gY29udGFpbiB0aGUgSUQgc3RyaW5nLiAqLworCWlmIChidWZmZXJfbGVuKGJsb2IpIDwgc2l6ZW9mKGF1dGhmaWxlX2lkX3N0cmluZykpIHsKKwkJZGVidWczKCJUcnVuY2F0ZWQgUlNBMSBpZGVudGlmaWVyIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogTWFrZSBzdXJlIGl0IGJlZ2lucyB3aXRoIHRoZSBpZCBzdHJpbmcuICBDb25zdW1lIHRoZSBpZCBzdHJpbmcKKwkgKiBmcm9tIHRoZSBidWZmZXIuCisJICovCisJaWYgKG1lbWNtcChidWZmZXJfcHRyKGJsb2IpLCBhdXRoZmlsZV9pZF9zdHJpbmcsCisJICAgIHNpemVvZihhdXRoZmlsZV9pZF9zdHJpbmcpKSAhPSAwKSB7CisJCWRlYnVnMygiSW5jb3JyZWN0IFJTQTEgaWRlbnRpZmllciIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYnVmZmVyX2luaXQoJmNvcHkpOworCWJ1ZmZlcl9hcHBlbmQoJmNvcHksIGJ1ZmZlcl9wdHIoYmxvYiksIGJ1ZmZlcl9sZW4oYmxvYikpOworCWJ1ZmZlcl9jb25zdW1lKCZjb3B5LCBzaXplb2YoYXV0aGZpbGVfaWRfc3RyaW5nKSk7CisKKwkvKiBSZWFkIGNpcGhlciB0eXBlLiAqLworCWNpcGhlcl90eXBlID0gYnVmZmVyX2dldF9jaGFyKCZjb3B5KTsKKwkodm9pZCkgYnVmZmVyX2dldF9pbnQoJmNvcHkpOwkvKiBSZXNlcnZlZCBkYXRhLiAqLworCisJLyogUmVhZCB0aGUgcHVibGljIGtleSBmcm9tIHRoZSBidWZmZXIuICovCisJKHZvaWQpIGJ1ZmZlcl9nZXRfaW50KCZjb3B5KTsKKwlwcnYgPSBrZXlfbmV3X3ByaXZhdGUoS0VZX1JTQTEpOworCisJYnVmZmVyX2dldF9iaWdudW0oJmNvcHksIHBydi0+cnNhLT5uKTsKKwlidWZmZXJfZ2V0X2JpZ251bSgmY29weSwgcHJ2LT5yc2EtPmUpOworCWlmIChjb21tZW50cCkKKwkJKmNvbW1lbnRwID0gYnVmZmVyX2dldF9zdHJpbmcoJmNvcHksIE5VTEwpOworCWVsc2UKKwkJKHZvaWQpYnVmZmVyX2dldF9zdHJpbmdfcHRyKCZjb3B5LCBOVUxMKTsKKworCS8qIENoZWNrIHRoYXQgaXQgaXMgYSBzdXBwb3J0ZWQgY2lwaGVyLiAqLworCWNpcGhlciA9IGNpcGhlcl9ieV9udW1iZXIoY2lwaGVyX3R5cGUpOworCWlmIChjaXBoZXIgPT0gTlVMTCkgeworCQlkZWJ1ZygiVW5zdXBwb3J0ZWQgUlNBMSBjaXBoZXIgJWQiLCBjaXBoZXJfdHlwZSk7CisJCWJ1ZmZlcl9mcmVlKCZjb3B5KTsKKwkJZ290byBmYWlsOworCX0KKwkvKiBJbml0aWFsaXplIHNwYWNlIGZvciBkZWNyeXB0ZWQgZGF0YS4gKi8KKwlidWZmZXJfaW5pdCgmZGVjcnlwdGVkKTsKKwljcCA9IGJ1ZmZlcl9hcHBlbmRfc3BhY2UoJmRlY3J5cHRlZCwgYnVmZmVyX2xlbigmY29weSkpOworCisJLyogUmVzdCBvZiB0aGUgYnVmZmVyIGlzIGVuY3J5cHRlZC4gIERlY3J5cHQgaXQgdXNpbmcgdGhlIHBhc3NwaHJhc2UuICovCisJY2lwaGVyX3NldF9rZXlfc3RyaW5nKCZjaXBoZXJjb250ZXh0LCBjaXBoZXIsIHBhc3NwaHJhc2UsCisJICAgIENJUEhFUl9ERUNSWVBUKTsKKwljaXBoZXJfY3J5cHQoJmNpcGhlcmNvbnRleHQsIGNwLAorCSAgICBidWZmZXJfcHRyKCZjb3B5KSwgYnVmZmVyX2xlbigmY29weSkpOworCWNpcGhlcl9jbGVhbnVwKCZjaXBoZXJjb250ZXh0KTsKKwltZW1zZXQoJmNpcGhlcmNvbnRleHQsIDAsIHNpemVvZihjaXBoZXJjb250ZXh0KSk7CisJYnVmZmVyX2ZyZWUoJmNvcHkpOworCisJY2hlY2sxID0gYnVmZmVyX2dldF9jaGFyKCZkZWNyeXB0ZWQpOworCWNoZWNrMiA9IGJ1ZmZlcl9nZXRfY2hhcigmZGVjcnlwdGVkKTsKKwlpZiAoY2hlY2sxICE9IGJ1ZmZlcl9nZXRfY2hhcigmZGVjcnlwdGVkKSB8fAorCSAgICBjaGVjazIgIT0gYnVmZmVyX2dldF9jaGFyKCZkZWNyeXB0ZWQpKSB7CisJCWlmIChzdHJjbXAocGFzc3BocmFzZSwgIiIpICE9IDApCisJCQlkZWJ1ZygiQmFkIHBhc3NwaHJhc2Ugc3VwcGxpZWQgZm9yIFJTQTEga2V5Iik7CisJCS8qIEJhZCBwYXNzcGhyYXNlLiAqLworCQlidWZmZXJfZnJlZSgmZGVjcnlwdGVkKTsKKwkJZ290byBmYWlsOworCX0KKwkvKiBSZWFkIHRoZSByZXN0IG9mIHRoZSBwcml2YXRlIGtleS4gKi8KKwlidWZmZXJfZ2V0X2JpZ251bSgmZGVjcnlwdGVkLCBwcnYtPnJzYS0+ZCk7CisJYnVmZmVyX2dldF9iaWdudW0oJmRlY3J5cHRlZCwgcHJ2LT5yc2EtPmlxbXApOwkJLyogdSAqLworCS8qIGluIFNTTCBhbmQgU1NIIHYxIHAgYW5kIHEgYXJlIGV4Y2hhbmdlZCAqLworCWJ1ZmZlcl9nZXRfYmlnbnVtKCZkZWNyeXB0ZWQsIHBydi0+cnNhLT5xKTsJCS8qIHAgKi8KKwlidWZmZXJfZ2V0X2JpZ251bSgmZGVjcnlwdGVkLCBwcnYtPnJzYS0+cCk7CQkvKiBxICovCisKKwkvKiBjYWxjdWxhdGUgcC0xIGFuZCBxLTEgKi8KKwlyc2FfZ2VuZXJhdGVfYWRkaXRpb25hbF9wYXJhbWV0ZXJzKHBydi0+cnNhKTsKKworCWJ1ZmZlcl9mcmVlKCZkZWNyeXB0ZWQpOworCisJLyogZW5hYmxlIGJsaW5kaW5nICovCisJaWYgKFJTQV9ibGluZGluZ19vbihwcnYtPnJzYSwgTlVMTCkgIT0gMSkgeworCQllcnJvcigiJXM6IFJTQV9ibGluZGluZ19vbiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbDsKKwl9CisJcmV0dXJuIHBydjsKKworZmFpbDoKKwlpZiAoY29tbWVudHApCisJCXhmcmVlKCpjb21tZW50cCk7CisJa2V5X2ZyZWUocHJ2KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIEtleSAqCitrZXlfcGFyc2VfcHJpdmF0ZV9wZW0oQnVmZmVyICpibG9iLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqcGFzc3BocmFzZSwKKyAgICBjaGFyICoqY29tbWVudHApCit7CisJRVZQX1BLRVkgKnBrID0gTlVMTDsKKwlLZXkgKnBydiA9IE5VTEw7CisJY2hhciAqbmFtZSA9ICI8bm8ga2V5PiI7CisJQklPICpiaW87CisKKwlpZiAoKGJpbyA9IEJJT19uZXdfbWVtX2J1ZihidWZmZXJfcHRyKGJsb2IpLAorCSAgICBidWZmZXJfbGVuKGJsb2IpKSkgPT0gTlVMTCkgeworCQllcnJvcigiJXM6IEJJT19uZXdfbWVtX2J1ZiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwlwayA9IFBFTV9yZWFkX2Jpb19Qcml2YXRlS2V5KGJpbywgTlVMTCwgTlVMTCwgKGNoYXIgKilwYXNzcGhyYXNlKTsKKwlCSU9fZnJlZShiaW8pOworCWlmIChwayA9PSBOVUxMKSB7CisJCWRlYnVnKCIlczogUEVNX3JlYWRfUHJpdmF0ZUtleSBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCSh2b2lkKUVSUl9nZXRfZXJyb3IoKTsKKwl9IGVsc2UgaWYgKHBrLT50eXBlID09IEVWUF9QS0VZX1JTQSAmJgorCSAgICAodHlwZSA9PSBLRVlfVU5TUEVDfHx0eXBlPT1LRVlfUlNBKSkgeworCQlwcnYgPSBrZXlfbmV3KEtFWV9VTlNQRUMpOworCQlwcnYtPnJzYSA9IEVWUF9QS0VZX2dldDFfUlNBKHBrKTsKKwkJcHJ2LT50eXBlID0gS0VZX1JTQTsKKwkJbmFtZSA9ICJyc2Egdy9vIGNvbW1lbnQiOworI2lmZGVmIERFQlVHX1BLCisJCVJTQV9wcmludF9mcChzdGRlcnIsIHBydi0+cnNhLCA4KTsKKyNlbmRpZgorCQlpZiAoUlNBX2JsaW5kaW5nX29uKHBydi0+cnNhLCBOVUxMKSAhPSAxKSB7CisJCQllcnJvcigiJXM6IFJTQV9ibGluZGluZ19vbiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCQlrZXlfZnJlZShwcnYpOworCQkJcHJ2ID0gTlVMTDsKKwkJfQorCX0gZWxzZSBpZiAocGstPnR5cGUgPT0gRVZQX1BLRVlfRFNBICYmCisJICAgICh0eXBlID09IEtFWV9VTlNQRUN8fHR5cGU9PUtFWV9EU0EpKSB7CisJCXBydiA9IGtleV9uZXcoS0VZX1VOU1BFQyk7CisJCXBydi0+ZHNhID0gRVZQX1BLRVlfZ2V0MV9EU0EocGspOworCQlwcnYtPnR5cGUgPSBLRVlfRFNBOworCQluYW1lID0gImRzYSB3L28gY29tbWVudCI7CisjaWZkZWYgREVCVUdfUEsKKwkJRFNBX3ByaW50X2ZwKHN0ZGVyciwgcHJ2LT5kc2EsIDgpOworI2VuZGlmCisjaWZkZWYgT1BFTlNTTF9IQVNfRUNDCisJfSBlbHNlIGlmIChway0+dHlwZSA9PSBFVlBfUEtFWV9FQyAmJgorCSAgICAodHlwZSA9PSBLRVlfVU5TUEVDfHx0eXBlPT1LRVlfRUNEU0EpKSB7CisJCXBydiA9IGtleV9uZXcoS0VZX1VOU1BFQyk7CisJCXBydi0+ZWNkc2EgPSBFVlBfUEtFWV9nZXQxX0VDX0tFWShwayk7CisJCXBydi0+dHlwZSA9IEtFWV9FQ0RTQTsKKwkJaWYgKChwcnYtPmVjZHNhX25pZCA9IGtleV9lY2RzYV9rZXlfdG9fbmlkKHBydi0+ZWNkc2EpKSA9PSAtMSB8fAorCQkgICAga2V5X2N1cnZlX25pZF90b19uYW1lKHBydi0+ZWNkc2FfbmlkKSA9PSBOVUxMIHx8CisJCSAgICBrZXlfZWNfdmFsaWRhdGVfcHVibGljKEVDX0tFWV9nZXQwX2dyb3VwKHBydi0+ZWNkc2EpLAorCQkgICAgRUNfS0VZX2dldDBfcHVibGljX2tleShwcnYtPmVjZHNhKSkgIT0gMCB8fAorCQkgICAga2V5X2VjX3ZhbGlkYXRlX3ByaXZhdGUocHJ2LT5lY2RzYSkgIT0gMCkgeworCQkJZXJyb3IoIiVzOiBiYWQgRUNEU0Ega2V5IiwgX19mdW5jX18pOworCQkJa2V5X2ZyZWUocHJ2KTsKKwkJCXBydiA9IE5VTEw7CisJCX0KKwkJbmFtZSA9ICJlY2RzYSB3L28gY29tbWVudCI7CisjaWZkZWYgREVCVUdfUEsKKwkJaWYgKHBydiAhPSBOVUxMICYmIHBydi0+ZWNkc2EgIT0gTlVMTCkKKwkJCWtleV9kdW1wX2VjX2tleShwcnYtPmVjZHNhKTsKKyNlbmRpZgorI2VuZGlmIC8qIE9QRU5TU0xfSEFTX0VDQyAqLworCX0gZWxzZSB7CisJCWVycm9yKCIlczogUEVNX3JlYWRfUHJpdmF0ZUtleTogbWlzbWF0Y2ggb3IgIgorCQkgICAgInVua25vd24gRVZQX1BLRVkgc2F2ZV90eXBlICVkIiwgX19mdW5jX18sIHBrLT5zYXZlX3R5cGUpOworCX0KKwlpZiAocGsgIT0gTlVMTCkKKwkJRVZQX1BLRVlfZnJlZShwayk7CisJaWYgKHBydiAhPSBOVUxMICYmIGNvbW1lbnRwKQorCQkqY29tbWVudHAgPSB4c3RyZHVwKG5hbWUpOworCWRlYnVnKCJyZWFkIFBFTSBwcml2YXRlIGtleSBkb25lOiB0eXBlICVzIiwKKwkgICAgcHJ2ID8ga2V5X3R5cGUocHJ2KSA6ICI8dW5rbm93bj4iKTsKKwlyZXR1cm4gcHJ2OworfQorCitLZXkgKgora2V5X2xvYWRfcHJpdmF0ZV9wZW0oaW50IGZkLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqcGFzc3BocmFzZSwKKyAgICBjaGFyICoqY29tbWVudHApCit7CisJQnVmZmVyIGJ1ZmZlcjsKKwlLZXkgKnBydjsKKworCWJ1ZmZlcl9pbml0KCZidWZmZXIpOworCWlmICgha2V5X2xvYWRfZmlsZShmZCwgTlVMTCwgJmJ1ZmZlcikpIHsKKwkJYnVmZmVyX2ZyZWUoJmJ1ZmZlcik7CisJCXJldHVybiBOVUxMOworCX0KKwlwcnYgPSBrZXlfcGFyc2VfcHJpdmF0ZV9wZW0oJmJ1ZmZlciwgdHlwZSwgcGFzc3BocmFzZSwgY29tbWVudHApOworCWJ1ZmZlcl9mcmVlKCZidWZmZXIpOworCXJldHVybiBwcnY7Cit9CisKK2ludAora2V5X3Blcm1fb2soaW50IGZkLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChmc3RhdChmZCwgJnN0KSA8IDApCisJCXJldHVybiAwOworCS8qCisJICogaWYgYSBrZXkgb3duZWQgYnkgdGhlIHVzZXIgaXMgYWNjZXNzZWQsIHRoZW4gd2UgY2hlY2sgdGhlCisJICogcGVybWlzc2lvbnMgb2YgdGhlIGZpbGUuIGlmIHRoZSBrZXkgb3duZWQgYnkgYSBkaWZmZXJlbnQgdXNlciwKKwkgKiB0aGVuIHdlIGRvbid0IGNhcmUuCisJICovCisjaWZkZWYgSEFWRV9DWUdXSU4KKwlpZiAoY2hlY2tfbnRzZWMoZmlsZW5hbWUpKQorI2VuZGlmCisJaWYgKChzdC5zdF91aWQgPT0gZ2V0dWlkKCkpICYmIChzdC5zdF9tb2RlICYgMDc3KSAhPSAwKSB7CisJCWVycm9yKCJAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCIpOworCQllcnJvcigiQCAgICAgICAgIFdBUk5JTkc6IFVOUFJPVEVDVEVEIFBSSVZBVEUgS0VZIEZJTEUhICAgICAgICAgIEAiKTsKKwkJZXJyb3IoIkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIik7CisJCWVycm9yKCJQZXJtaXNzaW9ucyAwJTMuM28gZm9yICclcycgYXJlIHRvbyBvcGVuLiIsCisJCSAgICAodV9pbnQpc3Quc3RfbW9kZSAmIDA3NzcsIGZpbGVuYW1lKTsKKwkJZXJyb3IoIkl0IGlzIHJlcXVpcmVkIHRoYXQgeW91ciBwcml2YXRlIGtleSBmaWxlcyBhcmUgTk9UIGFjY2Vzc2libGUgYnkgb3RoZXJzLiIpOworCQllcnJvcigiVGhpcyBwcml2YXRlIGtleSB3aWxsIGJlIGlnbm9yZWQuIik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIEtleSAqCitrZXlfcGFyc2VfcHJpdmF0ZV90eXBlKEJ1ZmZlciAqYmxvYiwgaW50IHR5cGUsIGNvbnN0IGNoYXIgKnBhc3NwaHJhc2UsCisgICAgY2hhciAqKmNvbW1lbnRwKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgS0VZX1JTQTE6CisJCXJldHVybiBrZXlfcGFyc2VfcHJpdmF0ZV9yc2ExKGJsb2IsIHBhc3NwaHJhc2UsIGNvbW1lbnRwKTsKKwljYXNlIEtFWV9EU0E6CisJY2FzZSBLRVlfRUNEU0E6CisJY2FzZSBLRVlfUlNBOgorCWNhc2UgS0VZX1VOU1BFQzoKKwkJcmV0dXJuIGtleV9wYXJzZV9wcml2YXRlX3BlbShibG9iLCB0eXBlLCBwYXNzcGhyYXNlLCBjb21tZW50cCk7CisJZGVmYXVsdDoKKwkJZXJyb3IoIiVzOiBjYW5ub3QgcGFyc2Uga2V5IHR5cGUgJWQiLCBfX2Z1bmNfXywgdHlwZSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworS2V5ICoKK2tleV9sb2FkX3ByaXZhdGVfdHlwZShpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnBhc3NwaHJhc2UsCisgICAgY2hhciAqKmNvbW1lbnRwLCBpbnQgKnBlcm1fb2spCit7CisJaW50IGZkOworCUtleSAqcmV0OworCUJ1ZmZlciBidWZmZXI7CisKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKSB7CisJCWRlYnVnKCJjb3VsZCBub3Qgb3BlbiBrZXkgZmlsZSAnJXMnOiAlcyIsIGZpbGVuYW1lLAorCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJaWYgKHBlcm1fb2sgIT0gTlVMTCkKKwkJCSpwZXJtX29rID0gMDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICgha2V5X3Blcm1fb2soZmQsIGZpbGVuYW1lKSkgeworCQlpZiAocGVybV9vayAhPSBOVUxMKQorCQkJKnBlcm1fb2sgPSAwOworCQllcnJvcigiYmFkIHBlcm1pc3Npb25zOiBpZ25vcmUga2V5OiAlcyIsIGZpbGVuYW1lKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHBlcm1fb2sgIT0gTlVMTCkKKwkJKnBlcm1fb2sgPSAxOworCisJYnVmZmVyX2luaXQoJmJ1ZmZlcik7CisJaWYgKCFrZXlfbG9hZF9maWxlKGZkLCBmaWxlbmFtZSwgJmJ1ZmZlcikpIHsKKwkJYnVmZmVyX2ZyZWUoJmJ1ZmZlcik7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWNsb3NlKGZkKTsKKwlyZXQgPSBrZXlfcGFyc2VfcHJpdmF0ZV90eXBlKCZidWZmZXIsIHR5cGUsIHBhc3NwaHJhc2UsIGNvbW1lbnRwKTsKKwlidWZmZXJfZnJlZSgmYnVmZmVyKTsKKwlyZXR1cm4gcmV0OworfQorCitLZXkgKgora2V5X3BhcnNlX3ByaXZhdGUoQnVmZmVyICpidWZmZXIsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgIGNvbnN0IGNoYXIgKnBhc3NwaHJhc2UsIGNoYXIgKipjb21tZW50cCkKK3sKKwlLZXkgKnB1YiwgKnBydjsKKworCS8qIGl0J3MgYSBTU0ggdjEga2V5IGlmIHRoZSBwdWJsaWMga2V5IHBhcnQgaXMgcmVhZGFibGUgKi8KKwlwdWIgPSBrZXlfcGFyc2VfcHVibGljX3JzYTEoYnVmZmVyLCBjb21tZW50cCk7CisJaWYgKHB1YiA9PSBOVUxMKSB7CisJCXBydiA9IGtleV9wYXJzZV9wcml2YXRlX3R5cGUoYnVmZmVyLCBLRVlfVU5TUEVDLAorCQkgICAgcGFzc3BocmFzZSwgTlVMTCk7CisJCS8qIHVzZSB0aGUgZmlsZW5hbWUgYXMgYSBjb21tZW50IGZvciBQRU0gKi8KKwkJaWYgKGNvbW1lbnRwICYmIHBydikKKwkJCSpjb21tZW50cCA9IHhzdHJkdXAoZmlsZW5hbWUpOworCX0gZWxzZSB7CisJCWtleV9mcmVlKHB1Yik7CisJCS8qIGtleV9wYXJzZV9wdWJsaWNfcnNhMSgpIGhhcyBhbHJlYWR5IGxvYWRlZCB0aGUgY29tbWVudCAqLworCQlwcnYgPSBrZXlfcGFyc2VfcHJpdmF0ZV90eXBlKGJ1ZmZlciwgS0VZX1JTQTEsIHBhc3NwaHJhc2UsCisJCSAgICBOVUxMKTsKKwl9CisJcmV0dXJuIHBydjsKK30KKworS2V5ICoKK2tleV9sb2FkX3ByaXZhdGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnBhc3NwaHJhc2UsCisgICAgY2hhciAqKmNvbW1lbnRwKQoreworCUtleSAqcHJ2OworCUJ1ZmZlciBidWZmZXI7CisJaW50IGZkOworCisJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkgeworCQlkZWJ1ZygiY291bGQgbm90IG9wZW4ga2V5IGZpbGUgJyVzJzogJXMiLCBmaWxlbmFtZSwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoIWtleV9wZXJtX29rKGZkLCBmaWxlbmFtZSkpIHsKKwkJZXJyb3IoImJhZCBwZXJtaXNzaW9uczogaWdub3JlIGtleTogJXMiLCBmaWxlbmFtZSk7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYnVmZmVyX2luaXQoJmJ1ZmZlcik7CisJaWYgKCFrZXlfbG9hZF9maWxlKGZkLCBmaWxlbmFtZSwgJmJ1ZmZlcikpIHsKKwkJYnVmZmVyX2ZyZWUoJmJ1ZmZlcik7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWNsb3NlKGZkKTsKKworCXBydiA9IGtleV9wYXJzZV9wcml2YXRlKCZidWZmZXIsIGZpbGVuYW1lLCBwYXNzcGhyYXNlLCBjb21tZW50cCk7CisJYnVmZmVyX2ZyZWUoJmJ1ZmZlcik7CisJcmV0dXJuIHBydjsKK30KKworc3RhdGljIGludAora2V5X3RyeV9sb2FkX3B1YmxpYyhLZXkgKmssIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjaGFyICoqY29tbWVudHApCit7CisJRklMRSAqZjsKKwljaGFyIGxpbmVbU1NIX01BWF9QVUJLRVlfQllURVNdOworCWNoYXIgKmNwOworCXVfbG9uZyBsaW5lbnVtID0gMDsKKworCWYgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKKwlpZiAoZiAhPSBOVUxMKSB7CisJCXdoaWxlIChyZWFkX2tleWZpbGVfbGluZShmLCBmaWxlbmFtZSwgbGluZSwgc2l6ZW9mKGxpbmUpLAorCQkJICAgICZsaW5lbnVtKSAhPSAtMSkgeworCQkJY3AgPSBsaW5lOworCQkJc3dpdGNoICgqY3ApIHsKKwkJCWNhc2UgJyMnOgorCQkJY2FzZSAnXG4nOgorCQkJY2FzZSAnXDAnOgorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogQWJvcnQgbG9hZGluZyBpZiB0aGlzIGxvb2tzIGxpa2UgYSBwcml2YXRlIGtleSAqLworCQkJaWYgKHN0cm5jbXAoY3AsICItLS0tLUJFR0lOIiwgMTApID09IDApCisJCQkJYnJlYWs7CisJCQkvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi8KKwkJCWZvciAoOyAqY3AgJiYgKCpjcCA9PSAnICcgfHwgKmNwID09ICdcdCcpOyBjcCsrKQorCQkJCTsKKwkJCWlmICgqY3ApIHsKKwkJCQlpZiAoa2V5X3JlYWQoaywgJmNwKSA9PSAxKSB7CisJCQkJCWNwW3N0cmNzcG4oY3AsICJcclxuIildID0gJ1wwJzsKKwkJCQkJaWYgKGNvbW1lbnRwKSB7CisJCQkJCQkqY29tbWVudHAgPSB4c3RyZHVwKCpjcCA/CisJCQkJCQkgICAgY3AgOiBmaWxlbmFtZSk7CisJCQkJCX0KKwkJCQkJZmNsb3NlKGYpOworCQkJCQlyZXR1cm4gMTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZmNsb3NlKGYpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogbG9hZCBwdWJsaWMga2V5IGZyb20gc3NoIHYxIHByaXZhdGUgb3IgYW55IHB1YmtleSBmaWxlICovCitLZXkgKgora2V5X2xvYWRfcHVibGljKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjaGFyICoqY29tbWVudHApCit7CisJS2V5ICpwdWI7CisJY2hhciBmaWxlW01BWFBBVEhMRU5dOworCisJLyogdHJ5IHJzYTEgcHJpdmF0ZSBrZXkgKi8KKwlwdWIgPSBrZXlfbG9hZF9wdWJsaWNfdHlwZShLRVlfUlNBMSwgZmlsZW5hbWUsIGNvbW1lbnRwKTsKKwlpZiAocHViICE9IE5VTEwpCisJCXJldHVybiBwdWI7CisKKwkvKiB0cnkgcnNhMSBwdWJsaWMga2V5ICovCisJcHViID0ga2V5X25ldyhLRVlfUlNBMSk7CisJaWYgKGtleV90cnlfbG9hZF9wdWJsaWMocHViLCBmaWxlbmFtZSwgY29tbWVudHApID09IDEpCisJCXJldHVybiBwdWI7CisJa2V5X2ZyZWUocHViKTsKKworCS8qIHRyeSBzc2gyIHB1YmxpYyBrZXkgKi8KKwlwdWIgPSBrZXlfbmV3KEtFWV9VTlNQRUMpOworCWlmIChrZXlfdHJ5X2xvYWRfcHVibGljKHB1YiwgZmlsZW5hbWUsIGNvbW1lbnRwKSA9PSAxKQorCQlyZXR1cm4gcHViOworCWlmICgoc3RybGNweShmaWxlLCBmaWxlbmFtZSwgc2l6ZW9mIGZpbGUpIDwgc2l6ZW9mKGZpbGUpKSAmJgorCSAgICAoc3RybGNhdChmaWxlLCAiLnB1YiIsIHNpemVvZiBmaWxlKSA8IHNpemVvZihmaWxlKSkgJiYKKwkgICAgKGtleV90cnlfbG9hZF9wdWJsaWMocHViLCBmaWxlLCBjb21tZW50cCkgPT0gMSkpCisJCXJldHVybiBwdWI7CisJa2V5X2ZyZWUocHViKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogTG9hZCB0aGUgY2VydGlmaWNhdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lZCBwcml2YXRlIGtleSAqLworS2V5ICoKK2tleV9sb2FkX2NlcnQoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJS2V5ICpwdWI7CisJY2hhciAqZmlsZTsKKworCXB1YiA9IGtleV9uZXcoS0VZX1VOU1BFQyk7CisJeGFzcHJpbnRmKCZmaWxlLCAiJXMtY2VydC5wdWIiLCBmaWxlbmFtZSk7CisJaWYgKGtleV90cnlfbG9hZF9wdWJsaWMocHViLCBmaWxlLCBOVUxMKSA9PSAxKSB7CisJCXhmcmVlKGZpbGUpOworCQlyZXR1cm4gcHViOworCX0KKwl4ZnJlZShmaWxlKTsKKwlrZXlfZnJlZShwdWIpOworCXJldHVybiBOVUxMOworfQorCisvKiBMb2FkIHByaXZhdGUga2V5IGFuZCBjZXJ0aWZpY2F0ZSAqLworS2V5ICoKK2tleV9sb2FkX3ByaXZhdGVfY2VydChpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnBhc3NwaHJhc2UsCisgICAgaW50ICpwZXJtX29rKQoreworCUtleSAqa2V5LCAqcHViOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBLRVlfUlNBOgorCWNhc2UgS0VZX0RTQToKKwljYXNlIEtFWV9FQ0RTQToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyb3IoIiVzOiB1bnN1cHBvcnRlZCBrZXkgdHlwZSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKChrZXkgPSBrZXlfbG9hZF9wcml2YXRlX3R5cGUodHlwZSwgZmlsZW5hbWUsIAorCSAgICBwYXNzcGhyYXNlLCBOVUxMLCBwZXJtX29rKSkgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoKHB1YiA9IGtleV9sb2FkX2NlcnQoZmlsZW5hbWUpKSA9PSBOVUxMKSB7CisJCWtleV9mcmVlKGtleSk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGUgcHJpdmF0ZSBrZXkgbWF0Y2hlcyB0aGUgY2VydGlmaWNhdGUgKi8KKwlpZiAoa2V5X2VxdWFsX3B1YmxpYyhrZXksIHB1YikgPT0gMCkgeworCQllcnJvcigiJXM6IGNlcnRpZmljYXRlIGRvZXMgbm90IG1hdGNoIHByaXZhdGUga2V5ICVzIiwKKwkJICAgIF9fZnVuY19fLCBmaWxlbmFtZSk7CisJfSBlbHNlIGlmIChrZXlfdG9fY2VydGlmaWVkKGtleSwga2V5X2NlcnRfaXNfbGVnYWN5KHB1YikpICE9IDApIHsKKwkJZXJyb3IoIiVzOiBrZXlfdG9fY2VydGlmaWVkIGZhaWxlZCIsIF9fZnVuY19fKTsKKwl9IGVsc2UgeworCQlrZXlfY2VydF9jb3B5KHB1Yiwga2V5KTsKKwkJa2V5X2ZyZWUocHViKTsKKwkJcmV0dXJuIGtleTsKKwl9CisKKwlrZXlfZnJlZShrZXkpOworCWtleV9mcmVlKHB1Yik7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBSZXR1cm5zIDEgaWYgdGhlIHNwZWNpZmllZCAia2V5IiBpcyBsaXN0ZWQgaW4gdGhlIGZpbGUgImZpbGVuYW1lIiwKKyAqIDAgaWYgdGhlIGtleSBpcyBub3QgbGlzdGVkIG9yIC0xIG9uIGVycm9yLgorICogSWYgc3RyaWN0X3R5cGUgaXMgc2V0IHRoZW4gdGhlIGtleSB0eXBlIG11c3QgbWF0Y2ggZXhhY3RseSwKKyAqIG90aGVyd2lzZSBhIGNvbXBhcmlzb24gdGhhdCBpZ25vcmVzIGNlcnRmaWNpYXRlIGRhdGEgaXMgcGVyZm9ybWVkLgorICovCitpbnQKK2tleV9pbl9maWxlKEtleSAqa2V5LCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IHN0cmljdF90eXBlKQoreworCUZJTEUgKmY7CisJY2hhciBsaW5lW1NTSF9NQVhfUFVCS0VZX0JZVEVTXTsKKwljaGFyICpjcDsKKwl1X2xvbmcgbGluZW51bSA9IDA7CisJaW50IHJldCA9IDA7CisJS2V5ICpwdWI7CisJaW50ICgqa2V5X2NvbXBhcmUpKGNvbnN0IEtleSAqLCBjb25zdCBLZXkgKikgPSBzdHJpY3RfdHlwZSA/CisJICAgIGtleV9lcXVhbCA6IGtleV9lcXVhbF9wdWJsaWM7CisKKwlpZiAoKGYgPSBmb3BlbihmaWxlbmFtZSwgInIiKSkgPT0gTlVMTCkgeworCQlpZiAoZXJybm8gPT0gRU5PRU5UKSB7CisJCQlkZWJ1ZygiJXM6IGtleWZpbGUgXCIlc1wiIG1pc3NpbmciLCBfX2Z1bmNfXywgZmlsZW5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQllcnJvcigiJXM6IGNvdWxkIG5vdCBvcGVuIGtleWZpbGUgXCIlc1wiOiAlcyIsIF9fZnVuY19fLAorCQkJICAgIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJd2hpbGUgKHJlYWRfa2V5ZmlsZV9saW5lKGYsIGZpbGVuYW1lLCBsaW5lLCBzaXplb2YobGluZSksCisJCSAgICAmbGluZW51bSkgIT0gLTEpIHsKKwkJY3AgPSBsaW5lOworCisJCS8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlLiAqLworCQlmb3IgKDsgKmNwICYmICgqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnKTsgY3ArKykKKwkJCTsKKworCQkvKiBTa2lwIGNvbW1lbnRzIGFuZCBlbXB0eSBsaW5lcyAqLworCQlzd2l0Y2ggKCpjcCkgeworCQljYXNlICcjJzoKKwkJY2FzZSAnXG4nOgorCQljYXNlICdcMCc6CisJCQljb250aW51ZTsKKwkJfQorCisJCXB1YiA9IGtleV9uZXcoS0VZX1VOU1BFQyk7CisJCWlmIChrZXlfcmVhZChwdWIsICZjcCkgIT0gMSkgeworCQkJa2V5X2ZyZWUocHViKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChrZXlfY29tcGFyZShrZXksIHB1YikpIHsKKwkJCXJldCA9IDE7CisJCQlrZXlfZnJlZShwdWIpOworCQkJYnJlYWs7CisJCX0KKwkJa2V5X2ZyZWUocHViKTsKKwl9CisJZmNsb3NlKGYpOworCXJldHVybiByZXQ7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvYXV0aGZpbGUuaCBiL29wZW5zc2gtNi4wcDEvYXV0aGZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODM0OWJlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9hdXRoZmlsZS5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qICRPcGVuQlNEOiBhdXRoZmlsZS5oLHYgMS4xNiAyMDExLzA1LzA0IDIxOjE1OjI5IGRqbSBFeHAgJCAqLworCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKKyAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCisgKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCisgKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCisgKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCisgKi8KKworI2lmbmRlZiBBVVRIRklMRV9ICisjZGVmaW5lIEFVVEhGSUxFX0gKKworaW50CSBrZXlfc2F2ZV9wcml2YXRlKEtleSAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2ludAkga2V5X2xvYWRfZmlsZShpbnQsIGNvbnN0IGNoYXIgKiwgQnVmZmVyICopOworS2V5CSprZXlfbG9hZF9jZXJ0KGNvbnN0IGNoYXIgKik7CitLZXkJKmtleV9sb2FkX3B1YmxpYyhjb25zdCBjaGFyICosIGNoYXIgKiopOworS2V5CSprZXlfbG9hZF9wdWJsaWNfdHlwZShpbnQsIGNvbnN0IGNoYXIgKiwgY2hhciAqKik7CitLZXkJKmtleV9wYXJzZV9wcml2YXRlKEJ1ZmZlciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY2hhciAqKik7CitLZXkJKmtleV9sb2FkX3ByaXZhdGUoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNoYXIgKiopOworS2V5CSprZXlfbG9hZF9wcml2YXRlX2NlcnQoaW50LCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50ICopOworS2V5CSprZXlfbG9hZF9wcml2YXRlX3R5cGUoaW50LCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgaW50ICopOworS2V5CSprZXlfbG9hZF9wcml2YXRlX3BlbShpbnQsIGludCwgY29uc3QgY2hhciAqLCBjaGFyICoqKTsKK2ludAkga2V5X3Blcm1fb2soaW50LCBjb25zdCBjaGFyICopOworaW50CSBrZXlfaW5fZmlsZShLZXkgKiwgY29uc3QgY2hhciAqLCBpbnQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvYnVmYXV4LmMgYi9vcGVuc3NoLTYuMHAxL2J1ZmF1eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMjA4Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2J1ZmF1eC5jCkBAIC0wLDAgKzEsMzE2IEBACisvKiAkT3BlbkJTRDogYnVmYXV4LmMsdiAxLjUwIDIwMTAvMDgvMzEgMDk6NTg6MzcgZGptIEV4cCAkICovCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICogQXV4aWxpYXJ5IGZ1bmN0aW9ucyBmb3Igc3RvcmluZyBhbmQgcmV0cmlldmluZyB2YXJpb3VzIGRhdGEgdHlwZXMgdG8vZnJvbQorICogQnVmZmVycy4KKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICoKKyAqCisgKiBTU0gyIHBhY2tldCBmb3JtYXQgYWRkZWQgYnkgTWFya3VzIEZyaWVkbAorICogQ29weXJpZ2h0IChjKSAyMDAwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAibWlzYy5oIgorCisvKgorICogUmV0dXJucyBpbnRlZ2VycyBmcm9tIHRoZSBidWZmZXIgKG1zYiBmaXJzdCkuCisgKi8KKworaW50CitidWZmZXJfZ2V0X3Nob3J0X3JldCh1X3Nob3J0ICpyZXQsIEJ1ZmZlciAqYnVmZmVyKQoreworCXVfY2hhciBidWZbMl07CisKKwlpZiAoYnVmZmVyX2dldF9yZXQoYnVmZmVyLCAoY2hhciAqKSBidWYsIDIpID09IC0xKQorCQlyZXR1cm4gKC0xKTsKKwkqcmV0ID0gZ2V0X3UxNihidWYpOworCXJldHVybiAoMCk7Cit9CisKK3Vfc2hvcnQKK2J1ZmZlcl9nZXRfc2hvcnQoQnVmZmVyICpidWZmZXIpCit7CisJdV9zaG9ydCByZXQ7CisKKwlpZiAoYnVmZmVyX2dldF9zaG9ydF9yZXQoJnJldCwgYnVmZmVyKSA9PSAtMSkKKwkJZmF0YWwoImJ1ZmZlcl9nZXRfc2hvcnQ6IGJ1ZmZlciBlcnJvciIpOworCisJcmV0dXJuIChyZXQpOworfQorCitpbnQKK2J1ZmZlcl9nZXRfaW50X3JldCh1X2ludCAqcmV0LCBCdWZmZXIgKmJ1ZmZlcikKK3sKKwl1X2NoYXIgYnVmWzRdOworCisJaWYgKGJ1ZmZlcl9nZXRfcmV0KGJ1ZmZlciwgKGNoYXIgKikgYnVmLCA0KSA9PSAtMSkKKwkJcmV0dXJuICgtMSk7CisJaWYgKHJldCAhPSBOVUxMKQorCQkqcmV0ID0gZ2V0X3UzMihidWYpOworCXJldHVybiAoMCk7Cit9CisKK3VfaW50CitidWZmZXJfZ2V0X2ludChCdWZmZXIgKmJ1ZmZlcikKK3sKKwl1X2ludCByZXQ7CisKKwlpZiAoYnVmZmVyX2dldF9pbnRfcmV0KCZyZXQsIGJ1ZmZlcikgPT0gLTEpCisJCWZhdGFsKCJidWZmZXJfZ2V0X2ludDogYnVmZmVyIGVycm9yIik7CisKKwlyZXR1cm4gKHJldCk7Cit9CisKK2ludAorYnVmZmVyX2dldF9pbnQ2NF9yZXQodV9pbnQ2NF90ICpyZXQsIEJ1ZmZlciAqYnVmZmVyKQoreworCXVfY2hhciBidWZbOF07CisKKwlpZiAoYnVmZmVyX2dldF9yZXQoYnVmZmVyLCAoY2hhciAqKSBidWYsIDgpID09IC0xKQorCQlyZXR1cm4gKC0xKTsKKwlpZiAocmV0ICE9IE5VTEwpCisJCSpyZXQgPSBnZXRfdTY0KGJ1Zik7CisJcmV0dXJuICgwKTsKK30KKwordV9pbnQ2NF90CitidWZmZXJfZ2V0X2ludDY0KEJ1ZmZlciAqYnVmZmVyKQoreworCXVfaW50NjRfdCByZXQ7CisKKwlpZiAoYnVmZmVyX2dldF9pbnQ2NF9yZXQoJnJldCwgYnVmZmVyKSA9PSAtMSkKKwkJZmF0YWwoImJ1ZmZlcl9nZXRfaW50OiBidWZmZXIgZXJyb3IiKTsKKworCXJldHVybiAocmV0KTsKK30KKworLyoKKyAqIFN0b3JlcyBpbnRlZ2VycyBpbiB0aGUgYnVmZmVyLCBtc2IgZmlyc3QuCisgKi8KK3ZvaWQKK2J1ZmZlcl9wdXRfc2hvcnQoQnVmZmVyICpidWZmZXIsIHVfc2hvcnQgdmFsdWUpCit7CisJY2hhciBidWZbMl07CisKKwlwdXRfdTE2KGJ1ZiwgdmFsdWUpOworCWJ1ZmZlcl9hcHBlbmQoYnVmZmVyLCBidWYsIDIpOworfQorCit2b2lkCitidWZmZXJfcHV0X2ludChCdWZmZXIgKmJ1ZmZlciwgdV9pbnQgdmFsdWUpCit7CisJY2hhciBidWZbNF07CisKKwlwdXRfdTMyKGJ1ZiwgdmFsdWUpOworCWJ1ZmZlcl9hcHBlbmQoYnVmZmVyLCBidWYsIDQpOworfQorCit2b2lkCitidWZmZXJfcHV0X2ludDY0KEJ1ZmZlciAqYnVmZmVyLCB1X2ludDY0X3QgdmFsdWUpCit7CisJY2hhciBidWZbOF07CisKKwlwdXRfdTY0KGJ1ZiwgdmFsdWUpOworCWJ1ZmZlcl9hcHBlbmQoYnVmZmVyLCBidWYsIDgpOworfQorCisvKgorICogUmV0dXJucyBhbiBhcmJpdHJhcnkgYmluYXJ5IHN0cmluZyBmcm9tIHRoZSBidWZmZXIuICBUaGUgc3RyaW5nIGNhbm5vdAorICogYmUgbG9uZ2VyIHRoYW4gMjU2ay4gIFRoZSByZXR1cm5lZCB2YWx1ZSBwb2ludHMgdG8gbWVtb3J5IGFsbG9jYXRlZAorICogd2l0aCB4bWFsbG9jOyBpdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gdG8gZnJlZQorICogdGhlIGRhdGEuICBJZiBsZW5ndGhfcHRyIGlzIG5vbi1OVUxMLCB0aGUgbGVuZ3RoIG9mIHRoZSByZXR1cm5lZCBkYXRhCisgKiB3aWxsIGJlIHN0b3JlZCB0aGVyZS4gIEEgbnVsbCBjaGFyYWN0ZXIgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkCisgKiB0byB0aGUgcmV0dXJuZWQgc3RyaW5nLCBhbmQgaXMgbm90IGNvdW50ZWQgaW4gbGVuZ3RoLgorICovCit2b2lkICoKK2J1ZmZlcl9nZXRfc3RyaW5nX3JldChCdWZmZXIgKmJ1ZmZlciwgdV9pbnQgKmxlbmd0aF9wdHIpCit7CisJdV9jaGFyICp2YWx1ZTsKKwl1X2ludCBsZW47CisKKwkvKiBHZXQgdGhlIGxlbmd0aC4gKi8KKwlpZiAoYnVmZmVyX2dldF9pbnRfcmV0KCZsZW4sIGJ1ZmZlcikgIT0gMCkgeworCQllcnJvcigiYnVmZmVyX2dldF9zdHJpbmdfcmV0OiBjYW5ub3QgZXh0cmFjdCBsZW5ndGgiKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJaWYgKGxlbiA+IDI1NiAqIDEwMjQpIHsKKwkJZXJyb3IoImJ1ZmZlcl9nZXRfc3RyaW5nX3JldDogYmFkIHN0cmluZyBsZW5ndGggJXUiLCBsZW4pOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHN0cmluZy4gIEFkZCBvbmUgYnl0ZSBmb3IgYSBudWxsIGNoYXJhY3Rlci4gKi8KKwl2YWx1ZSA9IHhtYWxsb2MobGVuICsgMSk7CisJLyogR2V0IHRoZSBzdHJpbmcuICovCisJaWYgKGJ1ZmZlcl9nZXRfcmV0KGJ1ZmZlciwgdmFsdWUsIGxlbikgPT0gLTEpIHsKKwkJZXJyb3IoImJ1ZmZlcl9nZXRfc3RyaW5nX3JldDogYnVmZmVyX2dldCBmYWlsZWQiKTsKKwkJeGZyZWUodmFsdWUpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwkvKiBBcHBlbmQgYSBudWxsIGNoYXJhY3RlciB0byBtYWtlIHByb2Nlc3NpbmcgZWFzaWVyLiAqLworCXZhbHVlW2xlbl0gPSAnXDAnOworCS8qIE9wdGlvbmFsbHkgcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy4gKi8KKwlpZiAobGVuZ3RoX3B0cikKKwkJKmxlbmd0aF9wdHIgPSBsZW47CisJcmV0dXJuICh2YWx1ZSk7Cit9CisKK3ZvaWQgKgorYnVmZmVyX2dldF9zdHJpbmcoQnVmZmVyICpidWZmZXIsIHVfaW50ICpsZW5ndGhfcHRyKQoreworCXZvaWQgKnJldDsKKworCWlmICgocmV0ID0gYnVmZmVyX2dldF9zdHJpbmdfcmV0KGJ1ZmZlciwgbGVuZ3RoX3B0cikpID09IE5VTEwpCisJCWZhdGFsKCJidWZmZXJfZ2V0X3N0cmluZzogYnVmZmVyIGVycm9yIik7CisJcmV0dXJuIChyZXQpOworfQorCitjaGFyICoKK2J1ZmZlcl9nZXRfY3N0cmluZ19yZXQoQnVmZmVyICpidWZmZXIsIHVfaW50ICpsZW5ndGhfcHRyKQoreworCXVfaW50IGxlbmd0aDsKKwljaGFyICpjcCwgKnJldCA9IGJ1ZmZlcl9nZXRfc3RyaW5nX3JldChidWZmZXIsICZsZW5ndGgpOworCisJaWYgKHJldCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKGNwID0gbWVtY2hyKHJldCwgJ1wwJywgbGVuZ3RoKSkgIT0gTlVMTCkgeworCQkvKiBYWFggYWxsb3cgXDAgYXQgZW5kLW9mLXN0cmluZyBmb3IgYSB3aGlsZSwgcmVtb3ZlIGxhdGVyICovCisJCWlmIChjcCA9PSByZXQgKyBsZW5ndGggLSAxKQorCQkJZXJyb3IoImJ1ZmZlcl9nZXRfY3N0cmluZ19yZXQ6IHN0cmluZyBjb250YWlucyBcXDAiKTsKKwkJZWxzZSB7CisJCQliemVybyhyZXQsIGxlbmd0aCk7CisJCQl4ZnJlZShyZXQpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJaWYgKGxlbmd0aF9wdHIgIT0gTlVMTCkKKwkJKmxlbmd0aF9wdHIgPSBsZW5ndGg7CisJcmV0dXJuIHJldDsKK30KKworY2hhciAqCitidWZmZXJfZ2V0X2NzdHJpbmcoQnVmZmVyICpidWZmZXIsIHVfaW50ICpsZW5ndGhfcHRyKQoreworCWNoYXIgKnJldDsKKworCWlmICgocmV0ID0gYnVmZmVyX2dldF9jc3RyaW5nX3JldChidWZmZXIsIGxlbmd0aF9wdHIpKSA9PSBOVUxMKQorCQlmYXRhbCgiYnVmZmVyX2dldF9jc3RyaW5nOiBidWZmZXIgZXJyb3IiKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkICoKK2J1ZmZlcl9nZXRfc3RyaW5nX3B0cl9yZXQoQnVmZmVyICpidWZmZXIsIHVfaW50ICpsZW5ndGhfcHRyKQoreworCXZvaWQgKnB0cjsKKwl1X2ludCBsZW47CisKKwlpZiAoYnVmZmVyX2dldF9pbnRfcmV0KCZsZW4sIGJ1ZmZlcikgIT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGxlbiA+IDI1NiAqIDEwMjQpIHsKKwkJZXJyb3IoImJ1ZmZlcl9nZXRfc3RyaW5nX3B0cjogYmFkIHN0cmluZyBsZW5ndGggJXUiLCBsZW4pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcHRyID0gYnVmZmVyX3B0cihidWZmZXIpOworCWJ1ZmZlcl9jb25zdW1lKGJ1ZmZlciwgbGVuKTsKKwlpZiAobGVuZ3RoX3B0cikKKwkJKmxlbmd0aF9wdHIgPSBsZW47CisJcmV0dXJuIChwdHIpOworfQorCit2b2lkICoKK2J1ZmZlcl9nZXRfc3RyaW5nX3B0cihCdWZmZXIgKmJ1ZmZlciwgdV9pbnQgKmxlbmd0aF9wdHIpCit7CisJdm9pZCAqcmV0OworCisJaWYgKChyZXQgPSBidWZmZXJfZ2V0X3N0cmluZ19wdHJfcmV0KGJ1ZmZlciwgbGVuZ3RoX3B0cikpID09IE5VTEwpCisJCWZhdGFsKCJidWZmZXJfZ2V0X3N0cmluZ19wdHI6IGJ1ZmZlciBlcnJvciIpOworCXJldHVybiAocmV0KTsKK30KKworLyoKKyAqIFN0b3JlcyBhbmQgYXJiaXRyYXJ5IGJpbmFyeSBzdHJpbmcgaW4gdGhlIGJ1ZmZlci4KKyAqLwordm9pZAorYnVmZmVyX3B1dF9zdHJpbmcoQnVmZmVyICpidWZmZXIsIGNvbnN0IHZvaWQgKmJ1ZiwgdV9pbnQgbGVuKQoreworCWJ1ZmZlcl9wdXRfaW50KGJ1ZmZlciwgbGVuKTsKKwlidWZmZXJfYXBwZW5kKGJ1ZmZlciwgYnVmLCBsZW4pOworfQordm9pZAorYnVmZmVyX3B1dF9jc3RyaW5nKEJ1ZmZlciAqYnVmZmVyLCBjb25zdCBjaGFyICpzKQoreworCWlmIChzID09IE5VTEwpCisJCWZhdGFsKCJidWZmZXJfcHV0X2NzdHJpbmc6IHMgPT0gTlVMTCIpOworCWJ1ZmZlcl9wdXRfc3RyaW5nKGJ1ZmZlciwgcywgc3RybGVuKHMpKTsKK30KKworLyoKKyAqIFJldHVybnMgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgYnVmZmVyICgwIC0gMjU1KS4KKyAqLworaW50CitidWZmZXJfZ2V0X2NoYXJfcmV0KGNoYXIgKnJldCwgQnVmZmVyICpidWZmZXIpCit7CisJaWYgKGJ1ZmZlcl9nZXRfcmV0KGJ1ZmZlciwgcmV0LCAxKSA9PSAtMSkgeworCQllcnJvcigiYnVmZmVyX2dldF9jaGFyX3JldDogYnVmZmVyX2dldF9yZXQgZmFpbGVkIik7CisJCXJldHVybiAoLTEpOworCX0KKwlyZXR1cm4gKDApOworfQorCitpbnQKK2J1ZmZlcl9nZXRfY2hhcihCdWZmZXIgKmJ1ZmZlcikKK3sKKwljaGFyIGNoOworCisJaWYgKGJ1ZmZlcl9nZXRfY2hhcl9yZXQoJmNoLCBidWZmZXIpID09IC0xKQorCQlmYXRhbCgiYnVmZmVyX2dldF9jaGFyOiBidWZmZXIgZXJyb3IiKTsKKwlyZXR1cm4gKHVfY2hhcikgY2g7Cit9CisKKy8qCisgKiBTdG9yZXMgYSBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlci4KKyAqLwordm9pZAorYnVmZmVyX3B1dF9jaGFyKEJ1ZmZlciAqYnVmZmVyLCBpbnQgdmFsdWUpCit7CisJY2hhciBjaCA9IHZhbHVlOworCisJYnVmZmVyX2FwcGVuZChidWZmZXIsICZjaCwgMSk7Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2J1ZmJuLmMgYi9vcGVuc3NoLTYuMHAxL2J1ZmJuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUxY2QwOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvYnVmYm4uYwpAQCAtMCwwICsxLDIyMyBAQAorLyogJE9wZW5CU0Q6IGJ1ZmJuLmMsdiAxLjYgMjAwNy8wNi8wMiAwOTowNDo1OCBkam0gRXhwICQqLworLyoKKyAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAorICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIEF1eGlsaWFyeSBmdW5jdGlvbnMgZm9yIHN0b3JpbmcgYW5kIHJldHJpZXZpbmcgdmFyaW91cyBkYXRhIHR5cGVzIHRvL2Zyb20KKyAqIEJ1ZmZlcnMuCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqCisgKgorICogU1NIMiBwYWNrZXQgZm9ybWF0IGFkZGVkIGJ5IE1hcmt1cyBGcmllZGwKKyAqIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKworLyoKKyAqIFN0b3JlcyBhbiBCSUdOVU0gaW4gdGhlIGJ1ZmZlciB3aXRoIGEgMi1ieXRlIG1zYiBmaXJzdCBiaXQgY291bnQsIGZvbGxvd2VkCisgKiBieSAoYml0cys3KS84IGJ5dGVzIG9mIGJpbmFyeSBkYXRhLCBtc2IgZmlyc3QuCisgKi8KK2ludAorYnVmZmVyX3B1dF9iaWdudW1fcmV0KEJ1ZmZlciAqYnVmZmVyLCBjb25zdCBCSUdOVU0gKnZhbHVlKQoreworCWludCBiaXRzID0gQk5fbnVtX2JpdHModmFsdWUpOworCWludCBiaW5fc2l6ZSA9IChiaXRzICsgNykgLyA4OworCXVfY2hhciAqYnVmID0geG1hbGxvYyhiaW5fc2l6ZSk7CisJaW50IG9pOworCWNoYXIgbXNnWzJdOworCisJLyogR2V0IHRoZSB2YWx1ZSBvZiBpbiBiaW5hcnkgKi8KKwlvaSA9IEJOX2JuMmJpbih2YWx1ZSwgYnVmKTsKKwlpZiAob2kgIT0gYmluX3NpemUpIHsKKwkJZXJyb3IoImJ1ZmZlcl9wdXRfYmlnbnVtX3JldDogQk5fYm4yYmluKCkgZmFpbGVkOiBvaSAlZCAhPSBiaW5fc2l6ZSAlZCIsCisJCSAgICBvaSwgYmluX3NpemUpOworCQl4ZnJlZShidWYpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwkvKiBTdG9yZSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGJ1ZmZlciBpbiB0d28gYnl0ZXMsIG1zYiBmaXJzdC4gKi8KKwlwdXRfdTE2KG1zZywgYml0cyk7CisJYnVmZmVyX2FwcGVuZChidWZmZXIsIG1zZywgMik7CisJLyogU3RvcmUgdGhlIGJpbmFyeSBkYXRhLiAqLworCWJ1ZmZlcl9hcHBlbmQoYnVmZmVyLCBidWYsIG9pKTsKKworCW1lbXNldChidWYsIDAsIGJpbl9zaXplKTsKKwl4ZnJlZShidWYpOworCisJcmV0dXJuICgwKTsKK30KKwordm9pZAorYnVmZmVyX3B1dF9iaWdudW0oQnVmZmVyICpidWZmZXIsIGNvbnN0IEJJR05VTSAqdmFsdWUpCit7CisJaWYgKGJ1ZmZlcl9wdXRfYmlnbnVtX3JldChidWZmZXIsIHZhbHVlKSA9PSAtMSkKKwkJZmF0YWwoImJ1ZmZlcl9wdXRfYmlnbnVtOiBidWZmZXIgZXJyb3IiKTsKK30KKworLyoKKyAqIFJldHJpZXZlcyBhIEJJR05VTSBmcm9tIHRoZSBidWZmZXIuCisgKi8KK2ludAorYnVmZmVyX2dldF9iaWdudW1fcmV0KEJ1ZmZlciAqYnVmZmVyLCBCSUdOVU0gKnZhbHVlKQoreworCXVfaW50IGJpdHMsIGJ5dGVzOworCXVfY2hhciBidWZbMl0sICpiaW47CisKKwkvKiBHZXQgdGhlIG51bWJlciBvZiBiaXRzLiAqLworCWlmIChidWZmZXJfZ2V0X3JldChidWZmZXIsIChjaGFyICopIGJ1ZiwgMikgPT0gLTEpIHsKKwkJZXJyb3IoImJ1ZmZlcl9nZXRfYmlnbnVtX3JldDogaW52YWxpZCBsZW5ndGgiKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCWJpdHMgPSBnZXRfdTE2KGJ1Zik7CisJLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJpbmFyeSBieXRlcyB0aGF0IGZvbGxvdy4gKi8KKwlieXRlcyA9IChiaXRzICsgNykgLyA4OworCWlmIChieXRlcyA+IDggKiAxMDI0KSB7CisJCWVycm9yKCJidWZmZXJfZ2V0X2JpZ251bV9yZXQ6IGNhbm5vdCBoYW5kbGUgQk4gb2Ygc2l6ZSAlZCIsIGJ5dGVzKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCWlmIChidWZmZXJfbGVuKGJ1ZmZlcikgPCBieXRlcykgeworCQllcnJvcigiYnVmZmVyX2dldF9iaWdudW1fcmV0OiBpbnB1dCBidWZmZXIgdG9vIHNtYWxsIik7CisJCXJldHVybiAoLTEpOworCX0KKwliaW4gPSBidWZmZXJfcHRyKGJ1ZmZlcik7CisJaWYgKEJOX2JpbjJibihiaW4sIGJ5dGVzLCB2YWx1ZSkgPT0gTlVMTCkgeworCQllcnJvcigiYnVmZmVyX2dldF9iaWdudW1fcmV0OiBCTl9iaW4yYm4gZmFpbGVkIik7CisJCXJldHVybiAoLTEpOworCX0KKwlpZiAoYnVmZmVyX2NvbnN1bWVfcmV0KGJ1ZmZlciwgYnl0ZXMpID09IC0xKSB7CisJCWVycm9yKCJidWZmZXJfZ2V0X2JpZ251bV9yZXQ6IGJ1ZmZlcl9jb25zdW1lIGZhaWxlZCIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJcmV0dXJuICgwKTsKK30KKwordm9pZAorYnVmZmVyX2dldF9iaWdudW0oQnVmZmVyICpidWZmZXIsIEJJR05VTSAqdmFsdWUpCit7CisJaWYgKGJ1ZmZlcl9nZXRfYmlnbnVtX3JldChidWZmZXIsIHZhbHVlKSA9PSAtMSkKKwkJZmF0YWwoImJ1ZmZlcl9nZXRfYmlnbnVtOiBidWZmZXIgZXJyb3IiKTsKK30KKworLyoKKyAqIFN0b3JlcyBhIEJJR05VTSBpbiB0aGUgYnVmZmVyIGluIFNTSDIgZm9ybWF0LgorICovCitpbnQKK2J1ZmZlcl9wdXRfYmlnbnVtMl9yZXQoQnVmZmVyICpidWZmZXIsIGNvbnN0IEJJR05VTSAqdmFsdWUpCit7CisJdV9pbnQgYnl0ZXM7CisJdV9jaGFyICpidWY7CisJaW50IG9pOworCXVfaW50IGhhc25vaGlnaCA9IDA7CisKKwlpZiAoQk5faXNfemVybyh2YWx1ZSkpIHsKKwkJYnVmZmVyX3B1dF9pbnQoYnVmZmVyLCAwKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICh2YWx1ZS0+bmVnKSB7CisJCWVycm9yKCJidWZmZXJfcHV0X2JpZ251bTJfcmV0OiBuZWdhdGl2ZSBudW1iZXJzIG5vdCBzdXBwb3J0ZWQiKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCWJ5dGVzID0gQk5fbnVtX2J5dGVzKHZhbHVlKSArIDE7IC8qIGV4dHJhIHBhZGRpbmcgYnl0ZSAqLworCWlmIChieXRlcyA8IDIpIHsKKwkJZXJyb3IoImJ1ZmZlcl9wdXRfYmlnbnVtMl9yZXQ6IEJOIHRvbyBzbWFsbCIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJYnVmID0geG1hbGxvYyhieXRlcyk7CisJYnVmWzBdID0gMHgwMDsKKwkvKiBHZXQgdGhlIHZhbHVlIG9mIGluIGJpbmFyeSAqLworCW9pID0gQk5fYm4yYmluKHZhbHVlLCBidWYrMSk7CisJaWYgKG9pIDwgMCB8fCAodV9pbnQpb2kgIT0gYnl0ZXMgLSAxKSB7CisJCWVycm9yKCJidWZmZXJfcHV0X2JpZ251bTJfcmV0OiBCTl9ibjJiaW4oKSBmYWlsZWQ6ICIKKwkJICAgICJvaSAlZCAhPSBiaW5fc2l6ZSAlZCIsIG9pLCBieXRlcyk7CisJCXhmcmVlKGJ1Zik7CisJCXJldHVybiAoLTEpOworCX0KKwloYXNub2hpZ2ggPSAoYnVmWzFdICYgMHg4MCkgPyAwIDogMTsKKwlidWZmZXJfcHV0X3N0cmluZyhidWZmZXIsIGJ1ZitoYXNub2hpZ2gsIGJ5dGVzLWhhc25vaGlnaCk7CisJbWVtc2V0KGJ1ZiwgMCwgYnl0ZXMpOworCXhmcmVlKGJ1Zik7CisJcmV0dXJuICgwKTsKK30KKwordm9pZAorYnVmZmVyX3B1dF9iaWdudW0yKEJ1ZmZlciAqYnVmZmVyLCBjb25zdCBCSUdOVU0gKnZhbHVlKQoreworCWlmIChidWZmZXJfcHV0X2JpZ251bTJfcmV0KGJ1ZmZlciwgdmFsdWUpID09IC0xKQorCQlmYXRhbCgiYnVmZmVyX3B1dF9iaWdudW0yOiBidWZmZXIgZXJyb3IiKTsKK30KKworaW50CitidWZmZXJfZ2V0X2JpZ251bTJfcmV0KEJ1ZmZlciAqYnVmZmVyLCBCSUdOVU0gKnZhbHVlKQoreworCXVfaW50IGxlbjsKKwl1X2NoYXIgKmJpbjsKKworCWlmICgoYmluID0gYnVmZmVyX2dldF9zdHJpbmdfcmV0KGJ1ZmZlciwgJmxlbikpID09IE5VTEwpIHsKKwkJZXJyb3IoImJ1ZmZlcl9nZXRfYmlnbnVtMl9yZXQ6IGludmFsaWQgYmlnbnVtIik7CisJCXJldHVybiAoLTEpOworCX0KKworCWlmIChsZW4gPiAwICYmIChiaW5bMF0gJiAweDgwKSkgeworCQllcnJvcigiYnVmZmVyX2dldF9iaWdudW0yX3JldDogbmVnYXRpdmUgbnVtYmVycyBub3Qgc3VwcG9ydGVkIik7CisJCXhmcmVlKGJpbik7CisJCXJldHVybiAoLTEpOworCX0KKwlpZiAobGVuID4gOCAqIDEwMjQpIHsKKwkJZXJyb3IoImJ1ZmZlcl9nZXRfYmlnbnVtMl9yZXQ6IGNhbm5vdCBoYW5kbGUgQk4gb2Ygc2l6ZSAlZCIsCisJCSAgICBsZW4pOworCQl4ZnJlZShiaW4pOworCQlyZXR1cm4gKC0xKTsKKwl9CisJaWYgKEJOX2JpbjJibihiaW4sIGxlbiwgdmFsdWUpID09IE5VTEwpIHsKKwkJZXJyb3IoImJ1ZmZlcl9nZXRfYmlnbnVtMl9yZXQ6IEJOX2JpbjJibiBmYWlsZWQiKTsKKwkJeGZyZWUoYmluKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCXhmcmVlKGJpbik7CisJcmV0dXJuICgwKTsKK30KKwordm9pZAorYnVmZmVyX2dldF9iaWdudW0yKEJ1ZmZlciAqYnVmZmVyLCBCSUdOVU0gKnZhbHVlKQoreworCWlmIChidWZmZXJfZ2V0X2JpZ251bTJfcmV0KGJ1ZmZlciwgdmFsdWUpID09IC0xKQorCQlmYXRhbCgiYnVmZmVyX2dldF9iaWdudW0yOiBidWZmZXIgZXJyb3IiKTsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvYnVmZWMuYyBiL29wZW5zc2gtNi4wcDEvYnVmZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGNiNDk0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9idWZlYy5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKiAkT3BlbkJTRDogYnVmZWMuYyx2IDEuMSAyMDEwLzA4LzMxIDExOjU0OjQ1IGRqbSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZWMuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKworLyoKKyAqIE1heGltdW0gc3VwcG9ydGVkIEVDIEdGcCBmaWVsZCBsZW5ndGggaXMgNTI4IGJpdHMuIFNFQzEgdW5jb21wcmVzc2VkCisgKiBlbmNvZGluZyByZXByZXNlbnRzIHRoaXMgYXMgdHdvIGJpdHN0cmluZyBwb2ludHMgdGhhdCBzaG91bGQgZWFjaAorICogYmUgbm8gbG9uZ2VyIHRoYW4gdGhlIGZpZWxkIGxlbmd0aCwgU0VDMSBzcGVjaWZpZXMgYSAxIGJ5dGUKKyAqIHBvaW50IHR5cGUgaGVhZGVyLgorICogQmVpbmcgcGFyYW5vaWQgaGVyZSBtYXkgaW5zdWxhdGUgdXMgdG8gcGFyc2luZyBwcm9ibGVtcyBpbgorICogRUNfUE9JTlRfb2N0MnBvaW50LgorICovCisjZGVmaW5lIEJVRkZFUl9NQVhfRUNQT0lOVF9MRU4gKCg1MjgqMiAvIDgpICsgMSkKKworLyoKKyAqIEFwcGVuZCBhbiBFQ19QT0lOVCB0byB0aGUgYnVmZmVyIGFzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBTRUMxIGVuY29kZWQKKyAqIHVuY29tcHJlc3NlZCBwb2ludC4gRm9ydHVuYXRlbHkgT3BlblNTTCBoYW5kbGVzIHRoZSBnb3J5IGRldGFpbHMgZm9yIHVzLgorICovCitpbnQKK2J1ZmZlcl9wdXRfZWNwb2ludF9yZXQoQnVmZmVyICpidWZmZXIsIGNvbnN0IEVDX0dST1VQICpjdXJ2ZSwKKyAgICBjb25zdCBFQ19QT0lOVCAqcG9pbnQpCit7CisJdV9jaGFyICpidWYgPSBOVUxMOworCXNpemVfdCBsZW47CisJQk5fQ1RYICpibmN0eDsKKwlpbnQgcmV0ID0gLTE7CisKKwkvKiBEZXRlcm1pbmUgbGVuZ3RoICovCisJaWYgKChibmN0eCA9IEJOX0NUWF9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBCTl9DVFhfbmV3IGZhaWxlZCIsIF9fZnVuY19fKTsKKwlsZW4gPSBFQ19QT0lOVF9wb2ludDJvY3QoY3VydmUsIHBvaW50LCBQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRCwKKwkgICAgTlVMTCwgMCwgYm5jdHgpOworCWlmIChsZW4gPiBCVUZGRVJfTUFYX0VDUE9JTlRfTEVOKSB7CisJCWVycm9yKCIlczogZ2lhbnQgRUMgcG9pbnQ6IGxlbiA9ICVsdSAobWF4ICV1KSIsCisJCSAgICBfX2Z1bmNfXywgKHVfbG9uZylsZW4sIEJVRkZFUl9NQVhfRUNQT0lOVF9MRU4pOworCQlnb3RvIG91dDsKKwl9CisJLyogQ29udmVydCAqLworCWJ1ZiA9IHhtYWxsb2MobGVuKTsKKwlpZiAoRUNfUE9JTlRfcG9pbnQyb2N0KGN1cnZlLCBwb2ludCwgUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQsCisJICAgIGJ1ZiwgbGVuLCBibmN0eCkgIT0gbGVuKSB7CisJCWVycm9yKCIlczogRUNfUE9JTlRfcG9pbnQyb2N0IGxlbmd0aCBtaXNtYXRjaCIsIF9fZnVuY19fKTsKKwkJZ290byBvdXQ7CisJfQorCS8qIEFwcGVuZCAqLworCWJ1ZmZlcl9wdXRfc3RyaW5nKGJ1ZmZlciwgYnVmLCBsZW4pOworCXJldCA9IDA7Cisgb3V0OgorCWlmIChidWYgIT0gTlVMTCkgeworCQliemVybyhidWYsIGxlbik7CisJCXhmcmVlKGJ1Zik7CisJfQorCUJOX0NUWF9mcmVlKGJuY3R4KTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkCitidWZmZXJfcHV0X2VjcG9pbnQoQnVmZmVyICpidWZmZXIsIGNvbnN0IEVDX0dST1VQICpjdXJ2ZSwKKyAgICBjb25zdCBFQ19QT0lOVCAqcG9pbnQpCit7CisJaWYgKGJ1ZmZlcl9wdXRfZWNwb2ludF9yZXQoYnVmZmVyLCBjdXJ2ZSwgcG9pbnQpID09IC0xKQorCQlmYXRhbCgiJXM6IGJ1ZmZlciBlcnJvciIsIF9fZnVuY19fKTsKK30KKworaW50CitidWZmZXJfZ2V0X2VjcG9pbnRfcmV0KEJ1ZmZlciAqYnVmZmVyLCBjb25zdCBFQ19HUk9VUCAqY3VydmUsCisgICAgRUNfUE9JTlQgKnBvaW50KQoreworCXVfY2hhciAqYnVmOworCXVfaW50IGxlbjsKKwlCTl9DVFggKmJuY3R4OworCWludCByZXQgPSAtMTsKKworCWlmICgoYnVmID0gYnVmZmVyX2dldF9zdHJpbmdfcmV0KGJ1ZmZlciwgJmxlbikpID09IE5VTEwpIHsKKwkJZXJyb3IoIiVzOiBpbnZhbGlkIHBvaW50IiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCWlmICgoYm5jdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCIlczogQk5fQ1RYX25ldyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJaWYgKGxlbiA+IEJVRkZFUl9NQVhfRUNQT0lOVF9MRU4pIHsKKwkJZXJyb3IoIiVzOiBFQ19QT0lOVCB0b28gbG9uZzogJXUgPiBtYXggJXUiLCBfX2Z1bmNfXywKKwkJICAgIGxlbiwgQlVGRkVSX01BWF9FQ1BPSU5UX0xFTik7CisJCWdvdG8gb3V0OworCX0KKwlpZiAobGVuID09IDApIHsKKwkJZXJyb3IoIiVzOiBFQ19QT0lOVCBidWZmZXIgaXMgZW1wdHkiLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoYnVmWzBdICE9IFBPSU5UX0NPTlZFUlNJT05fVU5DT01QUkVTU0VEKSB7CisJCWVycm9yKCIlczogRUNfUE9JTlQgaXMgaW4gYW4gaW5jb3JyZWN0IGZvcm06ICIKKwkJICAgICIweCUwMnggKHdhbnQgMHglMDJ4KSIsIF9fZnVuY19fLCBidWZbMF0sCisJCSAgICBQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRCk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoRUNfUE9JTlRfb2N0MnBvaW50KGN1cnZlLCBwb2ludCwgYnVmLCBsZW4sIGJuY3R4KSAhPSAxKSB7CisJCWVycm9yKCJidWZmZXJfZ2V0X2JpZ251bTJfcmV0OiBCTl9iaW4yYm4gZmFpbGVkIik7CisJCWdvdG8gb3V0OworCX0KKwkvKiBFQ19QT0lOVF9vY3QycG9pbnQgdmVyaWZpZXMgdGhhdCB0aGUgcG9pbnQgaXMgb24gdGhlIGN1cnZlIGZvciB1cyAqLworCXJldCA9IDA7Cisgb3V0OgorCUJOX0NUWF9mcmVlKGJuY3R4KTsKKwliemVybyhidWYsIGxlbik7CisJeGZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkCitidWZmZXJfZ2V0X2VjcG9pbnQoQnVmZmVyICpidWZmZXIsIGNvbnN0IEVDX0dST1VQICpjdXJ2ZSwKKyAgICBFQ19QT0lOVCAqcG9pbnQpCit7CisJaWYgKGJ1ZmZlcl9nZXRfZWNwb2ludF9yZXQoYnVmZmVyLCBjdXJ2ZSwgcG9pbnQpID09IC0xKQorCQlmYXRhbCgiJXM6IGJ1ZmZlciBlcnJvciIsIF9fZnVuY19fKTsKK30KKworI2VuZGlmIC8qIE9QRU5TU0xfSEFTX0VDQyAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9idWZmZXIuYyBiL29wZW5zc2gtNi4wcDEvYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5NzAwMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvYnVmZmVyLmMKQEAgLTAsMCArMSwyNTIgQEAKKy8qICRPcGVuQlNEOiBidWZmZXIuYyx2IDEuMzIgMjAxMC8wMi8wOSAwMzo1NjoyOCBkam0gRXhwICQgKi8KKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiBGdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyBmaWZvIGJ1ZmZlcnMgKHRoYXQgY2FuIGdyb3cgaWYgbmVlZGVkKS4KKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImxvZy5oIgorCisjZGVmaW5lCUJVRkZFUl9NQVhfQ0hVTksJMHgxMDAwMDAKKyNkZWZpbmUJQlVGRkVSX01BWF9MRU4JCTB4YTAwMDAwCisjZGVmaW5lCUJVRkZFUl9BTExPQ1NaCQkweDAwODAwMAorCisvKiBJbml0aWFsaXplcyB0aGUgYnVmZmVyIHN0cnVjdHVyZS4gKi8KKwordm9pZAorYnVmZmVyX2luaXQoQnVmZmVyICpidWZmZXIpCit7CisJY29uc3QgdV9pbnQgbGVuID0gNDA5NjsKKworCWJ1ZmZlci0+YWxsb2MgPSAwOworCWJ1ZmZlci0+YnVmID0geG1hbGxvYyhsZW4pOworCWJ1ZmZlci0+YWxsb2MgPSBsZW47CisJYnVmZmVyLT5vZmZzZXQgPSAwOworCWJ1ZmZlci0+ZW5kID0gMDsKK30KKworLyogRnJlZXMgYW55IG1lbW9yeSB1c2VkIGZvciB0aGUgYnVmZmVyLiAqLworCit2b2lkCitidWZmZXJfZnJlZShCdWZmZXIgKmJ1ZmZlcikKK3sKKwlpZiAoYnVmZmVyLT5hbGxvYyA+IDApIHsKKwkJbWVtc2V0KGJ1ZmZlci0+YnVmLCAwLCBidWZmZXItPmFsbG9jKTsKKwkJYnVmZmVyLT5hbGxvYyA9IDA7CisJCXhmcmVlKGJ1ZmZlci0+YnVmKTsKKwl9Cit9CisKKy8qCisgKiBDbGVhcnMgYW55IGRhdGEgZnJvbSB0aGUgYnVmZmVyLCBtYWtpbmcgaXQgZW1wdHkuICBUaGlzIGRvZXMgbm90IGFjdHVhbGx5CisgKiB6ZXJvIHRoZSBtZW1vcnkuCisgKi8KKwordm9pZAorYnVmZmVyX2NsZWFyKEJ1ZmZlciAqYnVmZmVyKQoreworCWJ1ZmZlci0+b2Zmc2V0ID0gMDsKKwlidWZmZXItPmVuZCA9IDA7Cit9CisKKy8qIEFwcGVuZHMgZGF0YSB0byB0aGUgYnVmZmVyLCBleHBhbmRpbmcgaXQgaWYgbmVjZXNzYXJ5LiAqLworCit2b2lkCitidWZmZXJfYXBwZW5kKEJ1ZmZlciAqYnVmZmVyLCBjb25zdCB2b2lkICpkYXRhLCB1X2ludCBsZW4pCit7CisJdm9pZCAqcDsKKwlwID0gYnVmZmVyX2FwcGVuZF9zcGFjZShidWZmZXIsIGxlbik7CisJbWVtY3B5KHAsIGRhdGEsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQKK2J1ZmZlcl9jb21wYWN0KEJ1ZmZlciAqYnVmZmVyKQoreworCS8qCisJICogSWYgdGhlIGJ1ZmZlciBpcyBxdWl0ZSBlbXB0eSwgYnV0IGFsbCBkYXRhIGlzIGF0IHRoZSBlbmQsIG1vdmUgdGhlCisJICogZGF0YSB0byB0aGUgYmVnaW5uaW5nLgorCSAqLworCWlmIChidWZmZXItPm9mZnNldCA+IE1JTihidWZmZXItPmFsbG9jLCBCVUZGRVJfTUFYX0NIVU5LKSkgeworCQltZW1tb3ZlKGJ1ZmZlci0+YnVmLCBidWZmZXItPmJ1ZiArIGJ1ZmZlci0+b2Zmc2V0LAorCQkJYnVmZmVyLT5lbmQgLSBidWZmZXItPm9mZnNldCk7CisJCWJ1ZmZlci0+ZW5kIC09IGJ1ZmZlci0+b2Zmc2V0OworCQlidWZmZXItPm9mZnNldCA9IDA7CisJCXJldHVybiAoMSk7CisJfQorCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBBcHBlbmRzIHNwYWNlIHRvIHRoZSBidWZmZXIsIGV4cGFuZGluZyB0aGUgYnVmZmVyIGlmIG5lY2Vzc2FyeS4gVGhpcyBkb2VzCisgKiBub3QgYWN0dWFsbHkgY29weSB0aGUgZGF0YSBpbnRvIHRoZSBidWZmZXIsIGJ1dCBpbnN0ZWFkIHJldHVybnMgYSBwb2ludGVyCisgKiB0byB0aGUgYWxsb2NhdGVkIHJlZ2lvbi4KKyAqLworCit2b2lkICoKK2J1ZmZlcl9hcHBlbmRfc3BhY2UoQnVmZmVyICpidWZmZXIsIHVfaW50IGxlbikKK3sKKwl1X2ludCBuZXdsZW47CisJdm9pZCAqcDsKKworCWlmIChsZW4gPiBCVUZGRVJfTUFYX0NIVU5LKQorCQlmYXRhbCgiYnVmZmVyX2FwcGVuZF9zcGFjZTogbGVuICV1IG5vdCBzdXBwb3J0ZWQiLCBsZW4pOworCisJLyogSWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSwgc3RhcnQgdXNpbmcgaXQgZnJvbSB0aGUgYmVnaW5uaW5nLiAqLworCWlmIChidWZmZXItPm9mZnNldCA9PSBidWZmZXItPmVuZCkgeworCQlidWZmZXItPm9mZnNldCA9IDA7CisJCWJ1ZmZlci0+ZW5kID0gMDsKKwl9CityZXN0YXJ0OgorCS8qIElmIHRoZXJlIGlzIGVub3VnaCBzcGFjZSB0byBzdG9yZSBhbGwgZGF0YSwgc3RvcmUgaXQgbm93LiAqLworCWlmIChidWZmZXItPmVuZCArIGxlbiA8IGJ1ZmZlci0+YWxsb2MpIHsKKwkJcCA9IGJ1ZmZlci0+YnVmICsgYnVmZmVyLT5lbmQ7CisJCWJ1ZmZlci0+ZW5kICs9IGxlbjsKKwkJcmV0dXJuIHA7CisJfQorCisJLyogQ29tcGFjdCBkYXRhIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisJaWYgKGJ1ZmZlcl9jb21wYWN0KGJ1ZmZlcikpCisJCWdvdG8gcmVzdGFydDsKKworCS8qIEluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgYW5kIHJldHJ5LiAqLworCW5ld2xlbiA9IHJvdW5kdXAoYnVmZmVyLT5hbGxvYyArIGxlbiwgQlVGRkVSX0FMTE9DU1opOworCWlmIChuZXdsZW4gPiBCVUZGRVJfTUFYX0xFTikKKwkJZmF0YWwoImJ1ZmZlcl9hcHBlbmRfc3BhY2U6IGFsbG9jICV1IG5vdCBzdXBwb3J0ZWQiLAorCQkgICAgbmV3bGVuKTsKKwlidWZmZXItPmJ1ZiA9IHhyZWFsbG9jKGJ1ZmZlci0+YnVmLCAxLCBuZXdsZW4pOworCWJ1ZmZlci0+YWxsb2MgPSBuZXdsZW47CisJZ290byByZXN0YXJ0OworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworLyoKKyAqIENoZWNrIHdoZXRoZXIgYW4gYWxsb2NhdGlvbiBvZiAnbGVuJyB3aWxsIGZpdCBpbiB0aGUgYnVmZmVyCisgKiBUaGlzIG11c3QgZm9sbG93IHRoZSBzYW1lIG1hdGggYXMgYnVmZmVyX2FwcGVuZF9zcGFjZQorICovCitpbnQKK2J1ZmZlcl9jaGVja19hbGxvYyhCdWZmZXIgKmJ1ZmZlciwgdV9pbnQgbGVuKQoreworCWlmIChidWZmZXItPm9mZnNldCA9PSBidWZmZXItPmVuZCkgeworCQlidWZmZXItPm9mZnNldCA9IDA7CisJCWJ1ZmZlci0+ZW5kID0gMDsKKwl9CisgcmVzdGFydDoKKwlpZiAoYnVmZmVyLT5lbmQgKyBsZW4gPCBidWZmZXItPmFsbG9jKQorCQlyZXR1cm4gKDEpOworCWlmIChidWZmZXJfY29tcGFjdChidWZmZXIpKQorCQlnb3RvIHJlc3RhcnQ7CisJaWYgKHJvdW5kdXAoYnVmZmVyLT5hbGxvYyArIGxlbiwgQlVGRkVSX0FMTE9DU1opIDw9IEJVRkZFUl9NQVhfTEVOKQorCQlyZXR1cm4gKDEpOworCXJldHVybiAoMCk7Cit9CisKKy8qIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIGluIHRoZSBidWZmZXIuICovCisKK3VfaW50CitidWZmZXJfbGVuKGNvbnN0IEJ1ZmZlciAqYnVmZmVyKQoreworCXJldHVybiBidWZmZXItPmVuZCAtIGJ1ZmZlci0+b2Zmc2V0OworfQorCisvKiBHZXRzIGRhdGEgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIuICovCisKK2ludAorYnVmZmVyX2dldF9yZXQoQnVmZmVyICpidWZmZXIsIHZvaWQgKmJ1ZiwgdV9pbnQgbGVuKQoreworCWlmIChsZW4gPiBidWZmZXItPmVuZCAtIGJ1ZmZlci0+b2Zmc2V0KSB7CisJCWVycm9yKCJidWZmZXJfZ2V0X3JldDogdHJ5aW5nIHRvIGdldCBtb3JlIGJ5dGVzICVkIHRoYW4gaW4gYnVmZmVyICVkIiwKKwkJICAgIGxlbiwgYnVmZmVyLT5lbmQgLSBidWZmZXItPm9mZnNldCk7CisJCXJldHVybiAoLTEpOworCX0KKwltZW1jcHkoYnVmLCBidWZmZXItPmJ1ZiArIGJ1ZmZlci0+b2Zmc2V0LCBsZW4pOworCWJ1ZmZlci0+b2Zmc2V0ICs9IGxlbjsKKwlyZXR1cm4gKDApOworfQorCit2b2lkCitidWZmZXJfZ2V0KEJ1ZmZlciAqYnVmZmVyLCB2b2lkICpidWYsIHVfaW50IGxlbikKK3sKKwlpZiAoYnVmZmVyX2dldF9yZXQoYnVmZmVyLCBidWYsIGxlbikgPT0gLTEpCisJCWZhdGFsKCJidWZmZXJfZ2V0OiBidWZmZXIgZXJyb3IiKTsKK30KKworLyogQ29uc3VtZXMgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4gKi8KKworaW50CitidWZmZXJfY29uc3VtZV9yZXQoQnVmZmVyICpidWZmZXIsIHVfaW50IGJ5dGVzKQoreworCWlmIChieXRlcyA+IGJ1ZmZlci0+ZW5kIC0gYnVmZmVyLT5vZmZzZXQpIHsKKwkJZXJyb3IoImJ1ZmZlcl9jb25zdW1lX3JldDogdHJ5aW5nIHRvIGdldCBtb3JlIGJ5dGVzIHRoYW4gaW4gYnVmZmVyIik7CisJCXJldHVybiAoLTEpOworCX0KKwlidWZmZXItPm9mZnNldCArPSBieXRlczsKKwlyZXR1cm4gKDApOworfQorCit2b2lkCitidWZmZXJfY29uc3VtZShCdWZmZXIgKmJ1ZmZlciwgdV9pbnQgYnl0ZXMpCit7CisJaWYgKGJ1ZmZlcl9jb25zdW1lX3JldChidWZmZXIsIGJ5dGVzKSA9PSAtMSkKKwkJZmF0YWwoImJ1ZmZlcl9jb25zdW1lOiBidWZmZXIgZXJyb3IiKTsKK30KKworLyogQ29uc3VtZXMgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4gKi8KKworaW50CitidWZmZXJfY29uc3VtZV9lbmRfcmV0KEJ1ZmZlciAqYnVmZmVyLCB1X2ludCBieXRlcykKK3sKKwlpZiAoYnl0ZXMgPiBidWZmZXItPmVuZCAtIGJ1ZmZlci0+b2Zmc2V0KQorCQlyZXR1cm4gKC0xKTsKKwlidWZmZXItPmVuZCAtPSBieXRlczsKKwlyZXR1cm4gKDApOworfQorCit2b2lkCitidWZmZXJfY29uc3VtZV9lbmQoQnVmZmVyICpidWZmZXIsIHVfaW50IGJ5dGVzKQoreworCWlmIChidWZmZXJfY29uc3VtZV9lbmRfcmV0KGJ1ZmZlciwgYnl0ZXMpID09IC0xKQorCQlmYXRhbCgiYnVmZmVyX2NvbnN1bWVfZW5kOiB0cnlpbmcgdG8gZ2V0IG1vcmUgYnl0ZXMgdGhhbiBpbiBidWZmZXIiKTsKK30KKworLyogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHVzZWQgYnl0ZSBpbiB0aGUgYnVmZmVyLiAqLworCit2b2lkICoKK2J1ZmZlcl9wdHIoY29uc3QgQnVmZmVyICpidWZmZXIpCit7CisJcmV0dXJuIGJ1ZmZlci0+YnVmICsgYnVmZmVyLT5vZmZzZXQ7Cit9CisKKy8qIER1bXBzIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyIHRvIHN0ZGVyci4gKi8KKwordm9pZAorYnVmZmVyX2R1bXAoY29uc3QgQnVmZmVyICpidWZmZXIpCit7CisJdV9pbnQgaTsKKwl1X2NoYXIgKnVjcCA9IGJ1ZmZlci0+YnVmOworCisJZm9yIChpID0gYnVmZmVyLT5vZmZzZXQ7IGkgPCBidWZmZXItPmVuZDsgaSsrKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJTAyeCIsIHVjcFtpXSk7CisJCWlmICgoaS1idWZmZXItPm9mZnNldCklMTY9PTE1KQorCQkJZnByaW50ZihzdGRlcnIsICJcclxuIik7CisJCWVsc2UgaWYgKChpLWJ1ZmZlci0+b2Zmc2V0KSUyPT0xKQorCQkJZnByaW50ZihzdGRlcnIsICIgIik7CisJfQorCWZwcmludGYoc3RkZXJyLCAiXHJcbiIpOworfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9idWZmZXIuaCBiL29wZW5zc2gtNi4wcDEvYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJhOWRkMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvYnVmZmVyLmgKQEAgLTAsMCArMSw5OCBAQAorLyogJE9wZW5CU0Q6IGJ1ZmZlci5oLHYgMS4yMSAyMDEwLzA4LzMxIDExOjU0OjQ1IGRqbSBFeHAgJCAqLworCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICogQ29kZSBmb3IgbWFuaXB1bGF0aW5nIEZJRk8gYnVmZmVycy4KKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICovCisKKyNpZm5kZWYgQlVGRkVSX0gKKyNkZWZpbmUgQlVGRkVSX0gKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVfY2hhcgkqYnVmOwkJLyogQnVmZmVyIGZvciBkYXRhLiAqLworCXVfaW50CSBhbGxvYzsJCS8qIE51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgZm9yIGRhdGEuICovCisJdV9pbnQJIG9mZnNldDsJLyogT2Zmc2V0IG9mIGZpcnN0IGJ5dGUgY29udGFpbmluZyBkYXRhLiAqLworCXVfaW50CSBlbmQ7CQkvKiBPZmZzZXQgb2YgbGFzdCBieXRlIGNvbnRhaW5pbmcgZGF0YS4gKi8KK30gICAgICAgQnVmZmVyOworCit2b2lkCSBidWZmZXJfaW5pdChCdWZmZXIgKik7Cit2b2lkCSBidWZmZXJfY2xlYXIoQnVmZmVyICopOwordm9pZAkgYnVmZmVyX2ZyZWUoQnVmZmVyICopOworCit1X2ludAkgYnVmZmVyX2xlbihjb25zdCBCdWZmZXIgKik7Cit2b2lkCSpidWZmZXJfcHRyKGNvbnN0IEJ1ZmZlciAqKTsKKwordm9pZAkgYnVmZmVyX2FwcGVuZChCdWZmZXIgKiwgY29uc3Qgdm9pZCAqLCB1X2ludCk7Cit2b2lkCSpidWZmZXJfYXBwZW5kX3NwYWNlKEJ1ZmZlciAqLCB1X2ludCk7CisKK2ludAkgYnVmZmVyX2NoZWNrX2FsbG9jKEJ1ZmZlciAqLCB1X2ludCk7CisKK3ZvaWQJIGJ1ZmZlcl9nZXQoQnVmZmVyICosIHZvaWQgKiwgdV9pbnQpOworCit2b2lkCSBidWZmZXJfY29uc3VtZShCdWZmZXIgKiwgdV9pbnQpOwordm9pZAkgYnVmZmVyX2NvbnN1bWVfZW5kKEJ1ZmZlciAqLCB1X2ludCk7CisKK3ZvaWQgICAgIGJ1ZmZlcl9kdW1wKGNvbnN0IEJ1ZmZlciAqKTsKKworaW50CSBidWZmZXJfZ2V0X3JldChCdWZmZXIgKiwgdm9pZCAqLCB1X2ludCk7CitpbnQJIGJ1ZmZlcl9jb25zdW1lX3JldChCdWZmZXIgKiwgdV9pbnQpOworaW50CSBidWZmZXJfY29uc3VtZV9lbmRfcmV0KEJ1ZmZlciAqLCB1X2ludCk7CisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisKK3ZvaWQgICAgYnVmZmVyX3B1dF9iaWdudW0oQnVmZmVyICosIGNvbnN0IEJJR05VTSAqKTsKK3ZvaWQgICAgYnVmZmVyX3B1dF9iaWdudW0yKEJ1ZmZlciAqLCBjb25zdCBCSUdOVU0gKik7Cit2b2lkCWJ1ZmZlcl9nZXRfYmlnbnVtKEJ1ZmZlciAqLCBCSUdOVU0gKik7Cit2b2lkCWJ1ZmZlcl9nZXRfYmlnbnVtMihCdWZmZXIgKiwgQklHTlVNICopOworCit1X3Nob3J0CWJ1ZmZlcl9nZXRfc2hvcnQoQnVmZmVyICopOwordm9pZAlidWZmZXJfcHV0X3Nob3J0KEJ1ZmZlciAqLCB1X3Nob3J0KTsKKwordV9pbnQJYnVmZmVyX2dldF9pbnQoQnVmZmVyICopOwordm9pZCAgICBidWZmZXJfcHV0X2ludChCdWZmZXIgKiwgdV9pbnQpOworCit1X2ludDY0X3QgYnVmZmVyX2dldF9pbnQ2NChCdWZmZXIgKik7Cit2b2lkCWJ1ZmZlcl9wdXRfaW50NjQoQnVmZmVyICosIHVfaW50NjRfdCk7CisKK2ludCAgICAgYnVmZmVyX2dldF9jaGFyKEJ1ZmZlciAqKTsKK3ZvaWQgICAgYnVmZmVyX3B1dF9jaGFyKEJ1ZmZlciAqLCBpbnQpOworCit2b2lkICAgKmJ1ZmZlcl9nZXRfc3RyaW5nKEJ1ZmZlciAqLCB1X2ludCAqKTsKK3ZvaWQgICAqYnVmZmVyX2dldF9zdHJpbmdfcHRyKEJ1ZmZlciAqLCB1X2ludCAqKTsKK3ZvaWQgICAgYnVmZmVyX3B1dF9zdHJpbmcoQnVmZmVyICosIGNvbnN0IHZvaWQgKiwgdV9pbnQpOworY2hhciAgICpidWZmZXJfZ2V0X2NzdHJpbmcoQnVmZmVyICosIHVfaW50ICopOwordm9pZAlidWZmZXJfcHV0X2NzdHJpbmcoQnVmZmVyICosIGNvbnN0IGNoYXIgKik7CisKKyNkZWZpbmUgYnVmZmVyX3NraXBfc3RyaW5nKGIpIFwKKyAgICBkbyB7IHVfaW50IGwgPSBidWZmZXJfZ2V0X2ludChiKTsgYnVmZmVyX2NvbnN1bWUoYiwgbCk7IH0gd2hpbGUgKDApCisKK2ludAlidWZmZXJfcHV0X2JpZ251bV9yZXQoQnVmZmVyICosIGNvbnN0IEJJR05VTSAqKTsKK2ludAlidWZmZXJfZ2V0X2JpZ251bV9yZXQoQnVmZmVyICosIEJJR05VTSAqKTsKK2ludAlidWZmZXJfcHV0X2JpZ251bTJfcmV0KEJ1ZmZlciAqLCBjb25zdCBCSUdOVU0gKik7CitpbnQJYnVmZmVyX2dldF9iaWdudW0yX3JldChCdWZmZXIgKiwgQklHTlVNICopOworaW50CWJ1ZmZlcl9nZXRfc2hvcnRfcmV0KHVfc2hvcnQgKiwgQnVmZmVyICopOworaW50CWJ1ZmZlcl9nZXRfaW50X3JldCh1X2ludCAqLCBCdWZmZXIgKik7CitpbnQJYnVmZmVyX2dldF9pbnQ2NF9yZXQodV9pbnQ2NF90ICosIEJ1ZmZlciAqKTsKK3ZvaWQJKmJ1ZmZlcl9nZXRfc3RyaW5nX3JldChCdWZmZXIgKiwgdV9pbnQgKik7CitjaGFyCSpidWZmZXJfZ2V0X2NzdHJpbmdfcmV0KEJ1ZmZlciAqLCB1X2ludCAqKTsKK3ZvaWQJKmJ1ZmZlcl9nZXRfc3RyaW5nX3B0cl9yZXQoQnVmZmVyICosIHVfaW50ICopOworaW50CWJ1ZmZlcl9nZXRfY2hhcl9yZXQoY2hhciAqLCBCdWZmZXIgKik7CisKKyNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKKyNpbmNsdWRlIDxvcGVuc3NsL2VjLmg+CisKK2ludAlidWZmZXJfcHV0X2VjcG9pbnRfcmV0KEJ1ZmZlciAqLCBjb25zdCBFQ19HUk9VUCAqLCBjb25zdCBFQ19QT0lOVCAqKTsKK3ZvaWQJYnVmZmVyX3B1dF9lY3BvaW50KEJ1ZmZlciAqLCBjb25zdCBFQ19HUk9VUCAqLCBjb25zdCBFQ19QT0lOVCAqKTsKK2ludAlidWZmZXJfZ2V0X2VjcG9pbnRfcmV0KEJ1ZmZlciAqLCBjb25zdCBFQ19HUk9VUCAqLCBFQ19QT0lOVCAqKTsKK3ZvaWQJYnVmZmVyX2dldF9lY3BvaW50KEJ1ZmZlciAqLCBjb25zdCBFQ19HUk9VUCAqLCBFQ19QT0lOVCAqKTsKKyNlbmRpZgorCisjZW5kaWYJCQkJLyogQlVGRkVSX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvYnVpbGRwa2cuc2guaW4gYi9vcGVuc3NoLTYuMHAxL2J1aWxkcGtnLnNoLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZTlkNDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2J1aWxkcGtnLnNoLmluCkBAIC0wLDAgKzEsNjc3IEBACisjIS9iaW4vc2gKKyMKKyMgRmFrZSBSb290IFNvbGFyaXMvU1ZSNC9TVlI1IEJ1aWxkIFN5c3RlbSAtIFByb3RvdHlwZQorIworIyBUaGUgZm9sbG93aW5nIGNvZGUgaGFzIGJlZW4gcHJvdmlkZSB1bmRlciBQdWJsaWMgRG9tYWluIExpY2Vuc2UuICBJIHJlYWxseQorIyBkb24ndCBjYXJlIHdoYXQgeW91IHVzZSBpdCBmb3IuICBKdXN0IGFzIGxvbmcgYXMgeW91IGRvbid0IGNvbXBsYWluIHRvIG1lCisjIG5vciBteSBlbXBsb3llciBpZiB5b3UgYnJlYWsgaXQuIC0gQmVuIExpbmRzdHJvbSAobW91cmluZ0BldmlsYWRtaW4ub3JnKQorIwordW1hc2sgMDIyCisjCisjIE9wdGlvbnMgZm9yIGJ1aWxkaW5nIHRoZSBwYWNrYWdlCisjIFlvdSBjYW4gY3JlYXRlIGEgb3BlbnNzaC1jb25maWcubG9jYWwgd2l0aCB5b3VyIGN1c3RvbWl6ZWQgb3B0aW9ucworIworUkVNT1ZFX0ZBS0VfUk9PVF9XSEVOX0RPTkU9eWVzCisjCisjIHVuY29tbWVudGluZyBURVNUX0RJUiBhbmQgdXNpbmcKKyMgY29uZmlndXJlIC0tcHJlZml4PS92YXIvdG1wIC0td2l0aC1wcml2c2VwLXBhdGg9L3Zhci90bXAvZW1wdHkKKyMgYW5kCisjIFBLR05BTUU9dE9wZW5TU0ggc2hvdWxkIGFsbG93IHRlc3RpbmcgYSBwYWNrYWdlIHdpdGhvdXQgaW50ZXJmZXJpbmcKKyMgd2l0aCBhIHJlYWwgT3BlblNTSCBwYWNrYWdlIG9uIGEgc3lzdGVtLiBUaGlzIGlzIG5vdCBuZWVkZWQgb24gc3lzdGVtcworIyB0aGF0IHN1cHBvcnQgdGhlIC1SIG9wdGlvbiB0byBwa2dhZGQuCisjVEVTVF9ESVI9L3Zhci90bXAJIyBsZWF2ZSBjb21tZW50ZWQgb3V0IGZvciBwcm9kdWN0aW9uIGJ1aWxkCitQS0dOQU1FPU9wZW5TU0gKKyMgcmV2aXNpb25zIHdpdGhpbiB0aGUgc2FtZSB2ZXJzaW9uIChSRVY9YSkKKyNSRVY9CitTWVNWSU5JVF9OQU1FPW9wZW5zc2hkCitBV0s9JHtBV0s6PSJuYXdrIn0KK01BS0U9JHtNQUtFOj0ibWFrZSJ9CitTU0hEVUlEPTY3CSMgRGVmYXVsdCBwcml2c2VwIHVpZAorU1NIREdJRD02NwkjIERlZmF1bHQgcHJpdnNlcCBnaWQKKyMgdW5jb21tZW50IHRoZXNlIG5leHQgdGhyZWUgYXMgbmVlZGVkCisjUEVSTUlUX1JPT1RfTE9HSU49bm8KKyNYMTFfRk9SV0FSRElORz15ZXMKKyNVU1JfTE9DQUxfSVNfU1lNTElOSz15ZXMKKyMgU3lzdGVtIFYgaW5pdCBydW4gbGV2ZWxzCitTWVNWSU5JVFNUQVJUPVM5OAorU1lTVklOSVRTVE9QVD1LMzAKKyMgV2Ugd2lsbCBzb3VyY2UgdGhlc2UgaWYgdGhleSBleGlzdAorUE9TVF9NQUtFX0lOU1RBTExfRklYRVM9Li9wa2ctcG9zdC1tYWtlLWluc3RhbGwtZml4ZXMuc2gKK1BPU1RfUFJPVE9UWVBFX0VESVRTPS4vcGtnLXBvc3QtcHJvdG90eXBlLWVkaXQuc2gKKyMgV2UnbGwgYmUgb25lIGxldmVsIGRlZXBlciBsb29raW5nIGZvciB0aGVzZQorUEtHX1BSRUlOU1RBTExfTE9DQUw9Li4vcGtnLXByZWluc3RhbGwubG9jYWwKK1BLR19QT1NUSU5TVEFMTF9MT0NBTD0uLi9wa2ctcG9zdGluc3RhbGwubG9jYWwKK1BLR19QUkVSRU1PVkVfTE9DQUw9Li4vcGtnLXByZXJlbW92ZS5sb2NhbAorUEtHX1BPU1RSRU1PVkVfTE9DQUw9Li4vcGtnLXBvc3RyZW1vdmUubG9jYWwKK1BLR19SRVFVRVNUX0xPQ0FMPS4uL3BrZy1yZXF1ZXN0LmxvY2FsCisjIGVuZCBvZiBzb3VyY2VkIGZpbGVzCisjCitPUEVOU1NIRD1vcGVuc3NoZC5pbml0CitPUEVOU1NIX01BTklGRVNUPW9wZW5zc2gueG1sCitPUEVOU1NIX0ZNUkk9c3ZjOi9zaXRlLyR7U1lTVklOSVRfTkFNRX06ZGVmYXVsdAorU01GX01FVEhPRF9ESVI9L2xpYi9zdmMvbWV0aG9kL3NpdGUKK1NNRl9NQU5JRkVTVF9ESVI9L3Zhci9zdmMvbWFuaWZlc3Qvc2l0ZQorCitQQVRIX0dST1VQQUREX1BST0c9QFBBVEhfR1JPVVBBRERfUFJPR0AKK1BBVEhfVVNFUkFERF9QUk9HPUBQQVRIX1VTRVJBRERfUFJPR0AKK1BBVEhfUEFTU1dEX1BST0c9QFBBVEhfUEFTU1dEX1BST0dACisjCisjIGxpc3Qgb2Ygc3lzdGVtIGRpcmVjdG9yaWVzIHdlIGRvIE5PVCB3YW50IHRvIGNoYW5nZSBvd25lci9ncm91cC9wZXJtcworIyB3aGVuIGluc3RhbGxpbmcgb3VyIHBhY2thZ2UKK1NZU1RFTV9ESVI9Ii9ldGMJXAorL2V0Yy9pbml0LmQJCVwKKy9ldGMvcmNTLmQJCVwKKy9ldGMvcmMwLmQJCVwKKy9ldGMvcmMxLmQJCVwKKy9ldGMvcmMyLmQJCVwKKy9ldGMvb3B0CQlcCisvbGliCQkJXAorL2xpYi9zdmMJCVwKKy9saWIvc3ZjL21ldGhvZAkJXAorL2xpYi9zdmMvbWV0aG9kL3NpdGUJXAorL29wdAkJCVwKKy9vcHQvYmluCQlcCisvdXNyCQkJXAorL3Vzci9iaW4JCVwKKy91c3IvbGliCQlcCisvdXNyL3NiaW4JCVwKKy91c3Ivc2hhcmUJCVwKKy91c3Ivc2hhcmUvbWFuCQlcCisvdXNyL3NoYXJlL21hbi9tYW4xCVwKKy91c3Ivc2hhcmUvbWFuL21hbjgJXAorL3Vzci9sb2NhbAkJXAorL3Vzci9sb2NhbC9iaW4JCVwKKy91c3IvbG9jYWwvZXRjCQlcCisvdXNyL2xvY2FsL2xpYmV4ZWMJXAorL3Vzci9sb2NhbC9tYW4JCVwKKy91c3IvbG9jYWwvbWFuL21hbjEJXAorL3Vzci9sb2NhbC9tYW4vbWFuOAlcCisvdXNyL2xvY2FsL3NiaW4JCVwKKy91c3IvbG9jYWwvc2hhcmUJXAorL3ZhcgkJCVwKKy92YXIvb3B0CQlcCisvdmFyL3J1bgkJXAorL3Zhci9zdmMJCVwKKy92YXIvc3ZjL21hbmlmZXN0CVwKKy92YXIvc3ZjL21hbmlmZXN0L3NpdGUgIFwKKy92YXIvdG1wCQlcCisvdG1wIgorCisjIFdlIG1heSBuZWVkIHRvIGJ1aWxkIGFzIHJvb3Qgc28gd2UgbWFrZSBzdXJlIFBBVEggaXMgc2V0IHVwCisjIG9ubHkgc2V0IHRoZSBwYXRoIGlmIGl0J3Mgbm90IHNldCBhbHJlYWR5CitbIC1kIC9vcHQvYmluIF0gICYmICB7CisJZWNobyAkUEFUSCB8IGdyZXAgIjovb3B0L2JpbiIgID4gL2Rldi9udWxsIDI+JjEKKwlbICQ/IC1uZSAwIF0gJiYgUEFUSD0kUEFUSDovb3B0L2JpbgorfQorWyAtZCAvdXNyL2xvY2FsL2JpbiBdICAmJiAgeworCWVjaG8gJFBBVEggfCBncmVwICI6L3Vzci9sb2NhbC9iaW4iICA+IC9kZXYvbnVsbCAyPiYxCisJWyAkPyAtbmUgMCBdICYmIFBBVEg9JFBBVEg6L3Vzci9sb2NhbC9iaW4KK30KK1sgLWQgL3Vzci9jY3MvYmluIF0gICYmICB7CisJZWNobyAkUEFUSCB8IGdyZXAgIjovdXNyL2Njcy9iaW4iICA+IC9kZXYvbnVsbCAyPiYxCisJWyAkPyAtbmUgMCBdICYmIFBBVEg9JFBBVEg6L3Vzci9jY3MvYmluCit9CitleHBvcnQgUEFUSAorIworCitbIC1mIE1ha2VmaWxlIF0gIHx8ICB7CisJZWNobyAiUGxlYXNlIHJ1biB0aGlzIHNjcmlwdCBmcm9tIHlvdXIgYnVpbGQgZGlyZWN0b3J5IgorCWV4aXQgMQorfQorCisjIHdlIHdpbGwgbG9vayBmb3Igb3BlbnNzaC1jb25maWcubG9jYWwgdG8gb3ZlcnJpZGUgdGhlIGFib3ZlIG9wdGlvbnMKK1sgLXMgLi9vcGVuc3NoLWNvbmZpZy5sb2NhbCBdICAmJiAgLiAuL29wZW5zc2gtY29uZmlnLmxvY2FsCisKK1NUQVJUPWBwd2RgCitGQUtFX1JPT1Q9JFNUQVJUL3BrZworCisjIyBGaWxsIGluIHNvbWUgZGV0YWlscywgbGlrZSBwcmVmaXggYW5kIHN5c2NvbmZkaXIKK2ZvciBjb25mdmFyIGluIHByZWZpeCBleGVjX3ByZWZpeCBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFkaXIgbWFuZGlyIHN5c2NvbmZkaXIgcGlkZGlyIHNyY2RpcgorZG8KKwlldmFsICRjb25mdmFyPWBncmVwICJeJGNvbmZ2YXI9IiBNYWtlZmlsZSB8IGN1dCAtZCA9IC1mIDJgCitkb25lCisKKyMjIEFyZSB3ZSB1c2luZyBTb2xhcmlzJyBTTUY/CitET19TTUY9MAoraWYgZWdyZXAgIl4jZGVmaW5lIFVTRV9TT0xBUklTX1BST0NFU1NfQ09OVFJBQ1RTIiBjb25maWcuaCA+IC9kZXYvbnVsbCAyPiYxCit0aGVuCisJRE9fU01GPTEKK2ZpCisKKyMjIENvbGxlY3QgdmFsdWUgb2YgcHJpdnNlcCB1c2VyCitmb3IgY29uZnZhciBpbiBTU0hfUFJJVlNFUF9VU0VSCitkbworCWV2YWwgJGNvbmZ2YXI9YGF3ayAnLyNkZWZpbmVbIFx0XSckY29uZnZhcicve3ByaW50ICQzfScgY29uZmlnLmhgCitkb25lCisKKyMjIFNldCBwcml2c2VwIGRlZmF1bHRzIGlmIG5vdCBkZWZpbmVkCitpZiBbIC16ICIkU1NIX1BSSVZTRVBfVVNFUiIgXQordGhlbgorCVNTSF9QUklWU0VQX1VTRVI9c3NoZAorZmkKKworIyMgRXh0cmFjdCBjb21tb24gaW5mbyByZXF1aXJlcyBmb3IgdGhlICdpbmZvJyBwYXJ0IG9mIHRoZSBwYWNrYWdlLgorVkVSU0lPTj1gLi9zc2ggLVYgMj4mMSB8IHNlZCAtZSAncy8sLiovLydgCisKK0FSQ0g9YHVuYW1lIC1tYAorREVGX01TRz0iXG4iCitPU19WRVI9YHVuYW1lIC12YAorU0NSSVBUX1NIRUxMPS9zYmluL3NoCitVTkFNRV9SPWB1bmFtZSAtcmAKK1VOQU1FX1M9YHVuYW1lIC1zYAorY2FzZSAke1VOQU1FX1N9IGluCisJU3VuT1MpCVVOQU1FX1M9U29sYXJpcworCQlPU19WRVI9JHtVTkFNRV9SfQorCQlBUkNIPWB1bmFtZSAtcGAKKwkJUkNTX0Q9eWVzCisJCURFRl9NU0c9IihkZWZhdWx0OiBuKSIKKwkJOzsKKwlTQ09fU1YpCWNhc2UgJHtVTkFNRV9SfSBpbgorCQkJMy4yKQlVTkFNRV9TPU9wZW5TZXJ2ZXI1CisJCU9TX1ZFUj1gdW5hbWUgLVggfCBncmVwIFJlbGVhc2UgfCBzZWQgLWUgJ3MvXlJlbC4qMy4ydi8vJ2AKKwkJCQk7OworCQkJNSkJVU5BTUVfUz1PcGVuU2VydmVyNgorCQkJCTs7CisJCWVzYWMKKwkJU0NSSVBUX1NIRUxMPS9iaW4vc2gKKwkJUkMxX0Q9bm8KKwkJREVGX01TRz0iKGRlZmF1bHQ6IG4pIgorCQk7OworZXNhYworCitjYXNlIGBiYXNlbmFtZSAkMGAgaW4KKwlidWlsZHBrZy5zaCkKKyMjIFN0YXJ0IGJ5IGZha2luZyByb290IGluc3RhbGwKK2VjaG8gIkZha2luZyByb290IGluc3RhbGwuLi4iCitbIC1kICRGQUtFX1JPT1QgXSAgJiYgIHJtIC1mciAkRkFLRV9ST09UCitta2RpciAkRkFLRV9ST09UCiske01BS0V9IGluc3RhbGwtbm9rZXlzIERFU1RESVI9JEZBS0VfUk9PVAoraWYgWyAkPyAtZ3QgMCBdCit0aGVuCisJZWNobyAiRmFrZSByb290IGluc3RhbGwgZmFpbGVkLCBzdG9wcGluZy4iCisJZXhpdCAxCitmaQorCisjIyBTZXR1cCBvdXIgcnVuIGxldmVsIHN0dWZmIHdoaWxlIHdlIGFyZSBhdCBpdC4KK2lmIFsgJERPX1NNRiAtZXEgMSBdCit0aGVuCisJIyBGb3IgU29sYXJpcycgU01GLCAvbGliL3N2Yy9tZXRob2Qvc2l0ZSBpcyB0aGUgcHJlZmVycmVkIHBsYWNlCisJIyBmb3Igc3RhcnQvc3RvcCBzY3JpcHRzIHRoYXQgYXJlbid0IHN1cHBsaWVkIHdpdGggdGhlIE9TLCBhbmQKKwkjIHNpbWlsYXJseSAvdmFyL3N2Yy9tYW5pZmVzdC9zaXRlIGZvciBtYW5pZmVzdHMuCisJbWtkaXIgLXAgJEZBS0VfUk9PVCR7VEVTVF9ESVJ9JHtTTUZfTUVUSE9EX0RJUn0KKwlta2RpciAtcCAkRkFLRV9ST09UJHtURVNUX0RJUn0ke1NNRl9NQU5JRkVTVF9ESVJ9CisKKwljcCAke09QRU5TU0hEfSAkRkFLRV9ST09UJHtURVNUX0RJUn0ke1NNRl9NRVRIT0RfRElSfS8ke1NZU1ZJTklUX05BTUV9CisJY2htb2QgNzQ0ICRGQUtFX1JPT1Qke1RFU1RfRElSfSR7U01GX01FVEhPRF9ESVJ9LyR7U1lTVklOSVRfTkFNRX0KKworCWNhdCAke09QRU5TU0hfTUFOSUZFU1R9IHwgXAorCSAgICBzZWQgLWUgInN8X19TWVNWSU5JVF9OQU1FX198JHtTWVNWSU5JVF9OQU1FfXwiIFwKKwkgICAgLWUgInN8X19TTUZfTUVUSE9EX0RJUl9ffCR7U01GX01FVEhPRF9ESVJ9fCIgXAorCSAgICA+ICRGQUtFX1JPT1Qke1RFU1RfRElSfSR7U01GX01BTklGRVNUX0RJUn0vJHtTWVNWSU5JVF9OQU1FfS54bWwKKwljaG1vZCA2NDQgJEZBS0VfUk9PVCR7VEVTVF9ESVJ9JHtTTUZfTUFOSUZFU1RfRElSfS8ke1NZU1ZJTklUX05BTUV9LnhtbAorZWxzZQorCW1rZGlyIC1wICRGQUtFX1JPT1Qke1RFU1RfRElSfS9ldGMvaW5pdC5kCisKKwljcCAke09QRU5TU0hEfSAkRkFLRV9ST09UJHtURVNUX0RJUn0vZXRjL2luaXQuZC8ke1NZU1ZJTklUX05BTUV9CisJY2htb2QgNzQ0ICRGQUtFX1JPT1Qke1RFU1RfRElSfS9ldGMvaW5pdC5kLyR7U1lTVklOSVRfTkFNRX0KK2ZpCisKK1sgIiR7UEVSTUlUX1JPT1RfTE9HSU59IiA9IG5vIF0gICYmICBcCisJcGVybCAtcCAtaSAtZSAicy8jUGVybWl0Um9vdExvZ2luIHllcy9QZXJtaXRSb290TG9naW4gbm8vIiBcCisJCSRGQUtFX1JPT1Qke3N5c2NvbmZkaXJ9L3NzaGRfY29uZmlnCitbICIke1gxMV9GT1JXQVJESU5HfSIgPSB5ZXMgXSAgJiYgIFwKKwlwZXJsIC1wIC1pIC1lICJzLyNYMTFGb3J3YXJkaW5nIG5vL1gxMUZvcndhcmRpbmcgeWVzLyIgXAorCQkkRkFLRV9ST09UJHtzeXNjb25mZGlyfS9zc2hkX2NvbmZpZworIyBmaXggUHJpbnRNb3RkCitwZXJsIC1wIC1pIC1lICJzLyNQcmludE1vdGQgeWVzL1ByaW50TW90ZCBuby8iIFwKKwkkRkFLRV9ST09UJHtzeXNjb25mZGlyfS9zc2hkX2NvbmZpZworCisjIFdlIGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIGNvbmZpZyBmaWxlcyBvbiBtdWx0aXBsZSBpbnN0YWxscworbXYgJEZBS0VfUk9PVCR7c3lzY29uZmRpcn0vc3NoX2NvbmZpZyAkRkFLRV9ST09UJHtzeXNjb25mZGlyfS9zc2hfY29uZmlnLmRlZmF1bHQKK212ICRGQUtFX1JPT1Qke3N5c2NvbmZkaXJ9L3NzaGRfY29uZmlnICRGQUtFX1JPT1Qke3N5c2NvbmZkaXJ9L3NzaGRfY29uZmlnLmRlZmF1bHQKKworIyBsb2NhbCB0d2Vla3MgaGVyZQorWyAtcyAiJHtQT1NUX01BS0VfSU5TVEFMTF9GSVhFU30iIF0gICYmICAuICR7UE9TVF9NQUtFX0lOU1RBTExfRklYRVN9CisKK2NkICRGQUtFX1JPT1QKKworIyMgT2ssIHRoaXMgaXMgb3V0cmlnaHQgd3JvbmcsIGJ1dCBpdCB3aWxsIHdvcmsuICBJJ20gdGlyZWQgb2YgcGtnbWsKKyMjIHdoaW5pbmcuCitmb3IgaSBpbiAqOyBkbworICBQUk9UT19BUkdTPSIkUFJPVE9fQVJHUyAkaT0vJGkiOworZG9uZQorCisjIyBCdWlsZCBpbmZvIGZpbGUKK2VjaG8gIkJ1aWxkaW5nIHBrZ2luZm8gZmlsZS4uLiIKK2NhdCA+IHBrZ2luZm8gPDwgX0VPRgorUEtHPSRQS0dOQU1FCitOQU1FPSJPcGVuU1NIIFBvcnRhYmxlIGZvciAke1VOQU1FX1N9IgorREVTQz0iU2VjdXJlIFNoZWxsIHJlbW90ZSBhY2Nlc3MgdXRpbGl0eTsgcmVwbGFjZXMgdGVsbmV0IGFuZCBybG9naW4vcnNoLiIKK1ZFTkRPUj0iT3BlblNTSCBQb3J0YWJsZSBUZWFtIC0gaHR0cDovL3d3dy5vcGVuc3NoLmNvbS9wb3J0YWJsZS5odG1sIgorQVJDSD0kQVJDSAorVkVSU0lPTj0kVkVSU0lPTiRSRVYKK0NBVEVHT1JZPSJTZWN1cml0eSxhcHBsaWNhdGlvbiIKK0JBU0VESVI9LworQ0xBU1NFUz0ibm9uZSIKK1BTVEFNUD0iJHtVTkFNRV9TfSAke09TX1ZFUn0gJHtBUkNIfSBgZGF0ZSAnKyVkJWIlWSAlSDolTSdgIgorX0VPRgorCisjIyBCdWlsZCBlbXB0eSBkZXBlbmQgZmlsZSB0aGF0IG1heSBnZXQgdXBkYXRlZCBieSAkUE9TVF9QUk9UT1RZUEVfRURJVFMKK2VjaG8gIkJ1aWxkaW5nIGRlcGVuZCBmaWxlLi4uIgordG91Y2ggZGVwZW5kCisKKyMjIEJ1aWxkIHNwYWNlIGZpbGUKK2VjaG8gIkJ1aWxkaW5nIHNwYWNlIGZpbGUuLi4iCitpZiBbICRET19TTUYgLWVxIDEgXQordGhlbgorCSMgWFhYIElzIHRoaXMgbmVjZXNzYXJ5PyAgSWYgbm90LCByZW1vdmUgc3BhY2UgbGluZSBmcm9tIG1rLXByb3RvLmF3ay4KKwl0b3VjaCBzcGFjZQorZWxzZQorCWNhdCA+IHNwYWNlIDw8IF9FT0YKKyMgZXh0cmEgc3BhY2UgcmVxdWlyZWQgYnkgc3RhcnQvc3RvcCBsaW5rcyBhZGRlZCBieSBpbnN0YWxsZiAKKyMgaW4gcG9zdGluc3RhbGwKKyRURVNUX0RJUi9ldGMvcmMwLmQvJHtTWVNWSU5JVFNUT1BUfSR7U1lTVklOSVRfTkFNRX0gMCAxCiskVEVTVF9ESVIvZXRjL3JjMi5kLyR7U1lTVklOSVRTVEFSVH0ke1NZU1ZJTklUX05BTUV9IDAgMQorX0VPRgorCVsgIiRSQzFfRCIgPSBubyBdICB8fCAgXAorCWVjaG8gIiRURVNUX0RJUi9ldGMvcmMxLmQvJHtTWVNWSU5JVFNUT1BUfSR7U1lTVklOSVRfTkFNRX0gMCAxIiA+PiBzcGFjZQorCVsgIiRSQ1NfRCIgPSB5ZXMgXSAgJiYgIFwKKwllY2hvICIkVEVTVF9ESVIvZXRjL3JjUy5kLyR7U1lTVklOSVRTVE9QVH0ke1NZU1ZJTklUX05BTUV9IDAgMSIgPj4gc3BhY2UKK2ZpCisKKyMjIEJ1aWxkIHByZWluc3RhbGwgZmlsZQorZWNobyAiQnVpbGRpbmcgcHJlaW5zdGFsbCBmaWxlLi4uIgorY2F0ID4gcHJlaW5zdGFsbCA8PCBfRU9GCisjISAke1NDUklQVF9TSEVMTH0KKyMKK19FT0YKKworIyBsb2NhbCBwcmVpbnN0YWxsIGNoYW5nZXMgaGVyZQorWyAtcyAiJHtQS0dfUFJFSU5TVEFMTF9MT0NBTH0iIF0gICYmICAuICR7UEtHX1BSRUlOU1RBTExfTE9DQUx9CisKK2NhdCA+PiBwcmVpbnN0YWxsIDw8IF9FT0YKKyMKK2lmIFsgIlwke1BSRV9JTlNfU1RPUH0iID0gInllcyIgXQordGhlbgorCWlmIFsgJERPX1NNRiAtZXEgMSBdIAorCXRoZW4KKwkJc3ZjYWRtIGRpc2FibGUgJE9QRU5TU0hfRk1SSQorCWVsc2UKKwkJJHtURVNUX0RJUn0vZXRjL2luaXQuZC8ke1NZU1ZJTklUX05BTUV9IHN0b3AKKwlmaQorZmkKKworZXhpdCAwCitfRU9GCisKKyMjIEJ1aWxkIHBvc3RpbnN0YWxsIGZpbGUKK2VjaG8gIkJ1aWxkaW5nIHBvc3RpbnN0YWxsIGZpbGUuLi4iCitjYXQgPiBwb3N0aW5zdGFsbCA8PCBfRU9GCisjISAke1NDUklQVF9TSEVMTH0KKyMKK1sgLWYgXCR7UEtHX0lOU1RBTExfUk9PVH0ke3N5c2NvbmZkaXJ9L3NzaF9jb25maWcgXSAgfHwgIFxcCisJY3AgLXAgXCR7UEtHX0lOU1RBTExfUk9PVH0ke3N5c2NvbmZkaXJ9L3NzaF9jb25maWcuZGVmYXVsdCBcXAorCQlcJHtQS0dfSU5TVEFMTF9ST09UfSR7c3lzY29uZmRpcn0vc3NoX2NvbmZpZworWyAtZiBcJHtQS0dfSU5TVEFMTF9ST09UfSR7c3lzY29uZmRpcn0vc3NoZF9jb25maWcgXSAgfHwgIFxcCisJY3AgLXAgXCR7UEtHX0lOU1RBTExfUk9PVH0ke3N5c2NvbmZkaXJ9L3NzaGRfY29uZmlnLmRlZmF1bHQgXFwKKwkJXCR7UEtHX0lOU1RBTExfUk9PVH0ke3N5c2NvbmZkaXJ9L3NzaGRfY29uZmlnCisKKyMgbWFrZSByYz8uZCBkaXJzIG9ubHkgaWYgd2UgYXJlIGRvaW5nIGEgdGVzdCBpbnN0YWxsCitbIC1uICIke1RFU1RfRElSfSIgXSAgJiYgIFsgJERPX1NNRiAtbmUgMSBdICYmIHsKKwlbICIkUkNTX0QiID0geWVzIF0gICYmICBta2RpciAtcCAke1RFU1RfRElSfS9ldGMvcmNTLmQKKwlta2RpciAtcCAke1RFU1RfRElSfS9ldGMvcmMwLmQKKwlbICIkUkMxX0QiID0gbm8gXSAgfHwgIG1rZGlyIC1wICR7VEVTVF9ESVJ9L2V0Yy9yYzEuZAorCW1rZGlyIC1wICR7VEVTVF9ESVJ9L2V0Yy9yYzIuZAorfQorCitpZiBbICRET19TTUYgLWVxIDEgXQordGhlbgorCSMgRGVsZXRlIHRoZSBleGlzdGluZyBzZXJ2aWNlLCBpZiBpdCBleGlzdHMsIHRoZW4gaW1wb3J0IHRoZSAKKwkjIG5ldyBvbmUuCisJaWYgc3ZjcyAkT1BFTlNTSF9GTVJJID4gL2Rldi9udWxsIDI+JjEKKwl0aGVuCisJCXN2Y2NmZyBkZWxldGUgLWYgJE9QRU5TU0hfRk1SSQorCWZpCisJIyBOT1RFLCBUaGUgbWFuaWZlc3QgZGlzYWJsZXMgc3NoZCBieSBkZWZhdWx0LgorCXN2Y2NmZyBpbXBvcnQgJHtURVNUX0RJUn0ke1NNRl9NQU5JRkVTVF9ESVJ9LyR7U1lTVklOSVRfTkFNRX0ueG1sCitlbHNlCisJaWYgWyAiXCR7VVNFX1NZTV9MSU5LU30iID0geWVzIF0KKwl0aGVuCisJCVsgIiRSQ1NfRCIgPSB5ZXMgXSAgJiYgIFwKKwlpbnN0YWxsZiAke1BLR05BTUV9IFwke1BLR19JTlNUQUxMX1JPT1R9JFRFU1RfRElSL2V0Yy9yY1MuZC8ke1NZU1ZJTklUU1RPUFR9JHtTWVNWSU5JVF9OQU1FfT0uLi9pbml0LmQvJHtTWVNWSU5JVF9OQU1FfSBzCisJCWluc3RhbGxmICR7UEtHTkFNRX0gXCR7UEtHX0lOU1RBTExfUk9PVH0kVEVTVF9ESVIvZXRjL3JjMC5kLyR7U1lTVklOSVRTVE9QVH0ke1NZU1ZJTklUX05BTUV9PS4uL2luaXQuZC8ke1NZU1ZJTklUX05BTUV9IHMKKwkJWyAiJFJDMV9EIiA9IG5vIF0gIHx8ICBcCisJCWluc3RhbGxmICR7UEtHTkFNRX0gXCR7UEtHX0lOU1RBTExfUk9PVH0kVEVTVF9ESVIvZXRjL3JjMS5kLyR7U1lTVklOSVRTVE9QVH0ke1NZU1ZJTklUX05BTUV9PS4uL2luaXQuZC8ke1NZU1ZJTklUX05BTUV9IHMKKwkJaW5zdGFsbGYgJHtQS0dOQU1FfSBcJHtQS0dfSU5TVEFMTF9ST09UfSRURVNUX0RJUi9ldGMvcmMyLmQvJHtTWVNWSU5JVFNUQVJUfSR7U1lTVklOSVRfTkFNRX09Li4vaW5pdC5kLyR7U1lTVklOSVRfTkFNRX0gcworCWVsc2UKKwkJWyAiJFJDU19EIiA9IHllcyBdICAmJiAgXAorCWluc3RhbGxmICR7UEtHTkFNRX0gXCR7UEtHX0lOU1RBTExfUk9PVH0kVEVTVF9ESVIvZXRjL3JjUy5kLyR7U1lTVklOSVRTVE9QVH0ke1NZU1ZJTklUX05BTUV9PVwke1BLR19JTlNUQUxMX1JPT1R9JFRFU1RfRElSL2V0Yy9pbml0LmQvJHtTWVNWSU5JVF9OQU1FfSBsCisJCWluc3RhbGxmICR7UEtHTkFNRX0gXCR7UEtHX0lOU1RBTExfUk9PVH0kVEVTVF9ESVIvZXRjL3JjMC5kLyR7U1lTVklOSVRTVE9QVH0ke1NZU1ZJTklUX05BTUV9PVwke1BLR19JTlNUQUxMX1JPT1R9JFRFU1RfRElSL2V0Yy9pbml0LmQvJHtTWVNWSU5JVF9OQU1FfSBsCisJCVsgIiRSQzFfRCIgPSBubyBdICB8fCAgXAorCQlpbnN0YWxsZiAke1BLR05BTUV9IFwke1BLR19JTlNUQUxMX1JPT1R9JFRFU1RfRElSL2V0Yy9yYzEuZC8ke1NZU1ZJTklUU1RPUFR9JHtTWVNWSU5JVF9OQU1FfT1cJHtQS0dfSU5TVEFMTF9ST09UfSRURVNUX0RJUi9ldGMvaW5pdC5kLyR7U1lTVklOSVRfTkFNRX0gbAorCQlpbnN0YWxsZiAke1BLR05BTUV9IFwke1BLR19JTlNUQUxMX1JPT1R9JFRFU1RfRElSL2V0Yy9yYzIuZC8ke1NZU1ZJTklUU1RBUlR9JHtTWVNWSU5JVF9OQU1FfT1cJHtQS0dfSU5TVEFMTF9ST09UfSRURVNUX0RJUi9ldGMvaW5pdC5kLyR7U1lTVklOSVRfTkFNRX0gbAorCWZpCitmaQorCisjIElmIHBpZGRpciBkb2Vzbid0IGV4aXN0IHdlIGFkZCBpdC4gKEllLiAtLXdpdGgtcGlkLWRpcj0vdmFyL29wdC9zc2gpCitbIC1kICRwaWRkaXIgXSAgfHwgIGluc3RhbGxmICR7UEtHTkFNRX0gXCR7UEtHX0lOU1RBTExfUk9PVH0kVEVTVF9ESVIkcGlkZGlyIGQgMDc1NSByb290IHN5cworCitfRU9GCisKKyMgbG9jYWwgcG9zdGluc3RhbGwgY2hhbmdlcyBoZXJlCitbIC1zICIke1BLR19QT1NUSU5TVEFMTF9MT0NBTH0iIF0gICYmICAuICR7UEtHX1BPU1RJTlNUQUxMX0xPQ0FMfQorCitjYXQgPj4gcG9zdGluc3RhbGwgPDwgX0VPRgoraW5zdGFsbGYgLWYgJHtQS0dOQU1FfQorCisjIFVzZSBjaHJvb3QgdG8gaGFuZGxlIFBLR19JTlNUQUxMX1JPT1QKK2lmIFsgISAteiAiXCR7UEtHX0lOU1RBTExfUk9PVH0iIF0KK3RoZW4KKwljaHJvb3Q9ImNocm9vdCBcJHtQS0dfSU5TVEFMTF9ST09UfSIKK2ZpCisjIElmIHRoaXMgaXMgYSB0ZXN0IGJ1aWxkLCB3ZSB3aWxsIHNraXAgdGhlIGdyb3VwYWRkL3VzZXJhZGQvcGFzc3dkIGNvbW1hbmRzCitpZiBbICEgLXogIiR7VEVTVF9ESVJ9IiBdCit0aGVuCisJY2hyb290PWVjaG8KK2ZpCisKKwllY2hvICJQcml2aWxlZ2VTZXBhcmF0aW9uIHVzZXIgYWx3YXlzIHJlcXVpcmVkLiIKKwlpZiBjdXQgLWYxIC1kOiBcJHtQS0dfSU5TVEFMTF9ST09UfS9ldGMvcGFzc3dkIHwgZWdyZXAgJ14nJFNTSF9QUklWU0VQX1VTRVInXCQnID4vZGV2L251bGwKKwl0aGVuCisJCWVjaG8gIlByaXZTZXAgdXNlciAkU1NIX1BSSVZTRVBfVVNFUiBhbHJlYWR5IGV4aXN0cy4iCisJCVNTSF9QUklWU0VQX0dST1VQPVxgZ3JlcCAiXiRTU0hfUFJJVlNFUF9VU0VSOiIgXCR7UEtHX0lOU1RBTExfUk9PVH0vZXRjL3Bhc3N3ZCB8IGF3ayAtRjogJ3twcmludCBcJDR9J1xgCisJCVNTSF9QUklWU0VQX0dST1VQPVxgZ3JlcCAiOlwkU1NIX1BSSVZTRVBfR1JPVVA6IiBcJHtQS0dfSU5TVEFMTF9ST09UfS9ldGMvZ3JvdXAgfCBhd2sgLUY6ICd7cHJpbnQgXCQxfSdcYAorCWVsc2UKKwkJRE9fUEFTU1dEPXllcworCWZpCisJWyAteiAiXCRTU0hfUFJJVlNFUF9HUk9VUCIgXSAgJiYgIFNTSF9QUklWU0VQX0dST1VQPSRTU0hfUFJJVlNFUF9VU0VSCisKKwkjIGdyb3VwIHJlcXVpcmVkPworCWlmIGN1dCAtZjEgLWQ6IFwke1BLR19JTlNUQUxMX1JPT1R9L2V0Yy9ncm91cCB8IGVncmVwICdeJ1wkU1NIX1BSSVZTRVBfR1JPVVAnXCQnID4vZGV2L251bGwKKwl0aGVuCisJCWVjaG8gIlByaXZTZXAgZ3JvdXAgXCRTU0hfUFJJVlNFUF9HUk9VUCBhbHJlYWR5IGV4aXN0cy4iCisJZWxzZQorCQlET19HUk9VUD15ZXMKKwlmaQorCisJIyBjcmVhdGUgZ3JvdXAgaWYgcmVxdWlyZWQKKwlbICJcJERPX0dST1VQIiA9IHllcyBdICAmJiAgeworCQkjIFVzZSBnaWQgb2YgNjcgaWYgcG9zc2libGUKKwkJaWYgY3V0IC1mMyAtZDogXCR7UEtHX0lOU1RBTExfUk9PVH0vZXRjL2dyb3VwIHwgZWdyZXAgJ14nJFNTSERHSUQnXCQnID4vZGV2L251bGwKKwkJdGhlbgorCQkJOgorCQllbHNlCisJCQlzc2hkZ2lkPSItZyAkU1NIREdJRCIKKwkJZmkKKwkJZWNobyAiQ3JlYXRpbmcgUHJpdlNlcCBncm91cCBcJFNTSF9QUklWU0VQX0dST1VQLiIKKwkJXCRjaHJvb3QgJHtQQVRIX0dST1VQQUREX1BST0d9IFwkc3NoZGdpZCBcJFNTSF9QUklWU0VQX0dST1VQCisJfQorCisJIyBDcmVhdGUgdXNlciBpZiByZXF1aXJlZAorCVsgIlwkRE9fUEFTU1dEIiA9IHllcyBdICAmJiAgeworCQkjIFVzZSB1aWQgb2YgNjcgaWYgcG9zc2libGUKKwkJaWYgY3V0IC1mMyAtZDogXCR7UEtHX0lOU1RBTExfUk9PVH0vZXRjL3Bhc3N3ZCB8IGVncmVwICdeJyRTU0hEVUlEJ1wkJyA+L2Rldi9udWxsCisJCXRoZW4KKwkJCToKKwkJZWxzZQorCQkJc3NoZHVpZD0iLXUgJFNTSERVSUQiCisJCWZpCisJCWVjaG8gIkNyZWF0aW5nIFByaXZTZXAgdXNlciAkU1NIX1BSSVZTRVBfVVNFUi4iCisJCVwkY2hyb290ICR7UEFUSF9VU0VSQUREX1BST0d9IC1jICdTU0hEIFByaXZTZXAgVXNlcicgLXMgL2Jpbi9mYWxzZSAtZyAkU1NIX1BSSVZTRVBfVVNFUiBcJHNzaGR1aWQgJFNTSF9QUklWU0VQX1VTRVIKKwkJXCRjaHJvb3QgJHtQQVRIX1BBU1NXRF9QUk9HfSAtbCAkU1NIX1BSSVZTRVBfVVNFUgorCX0KKworaWYgWyAiXCR7UE9TVF9JTlNfU1RBUlR9IiA9ICJ5ZXMiIF0KK3RoZW4KKwlpZiBbICRET19TTUYgLWVxIDEgXQorCXRoZW4KKwkJc3ZjYWRtIGVuYWJsZSAkT1BFTlNTSF9GTVJJCisJZWxzZQorCQkke1RFU1RfRElSfS9ldGMvaW5pdC5kLyR7U1lTVklOSVRfTkFNRX0gc3RhcnQKKwlmaQorZmkKK2V4aXQgMAorX0VPRgorCisjIyBCdWlsZCBwcmVyZW1vdmUgZmlsZQorZWNobyAiQnVpbGRpbmcgcHJlcmVtb3ZlIGZpbGUuLi4iCitjYXQgPiBwcmVyZW1vdmUgPDwgX0VPRgorIyEgJHtTQ1JJUFRfU0hFTEx9CisjCitpZiBbICRET19TTUYgLWVxIDEgXSAKK3RoZW4KKwlzdmNhZG0gZGlzYWJsZSAkT1BFTlNTSF9GTVJJCitlbHNlCisJJHtURVNUX0RJUn0vZXRjL2luaXQuZC8ke1NZU1ZJTklUX05BTUV9IHN0b3AKK2ZpCitfRU9GCisKKyMgbG9jYWwgcHJlcmVtb3ZlIGNoYW5nZXMgaGVyZQorWyAtcyAiJHtQS0dfUFJFUkVNT1ZFX0xPQ0FMfSIgXSAgJiYgIC4gJHtQS0dfUFJFUkVNT1ZFX0xPQ0FMfQorCitjYXQgPj4gcHJlcmVtb3ZlIDw8IF9FT0YKK2V4aXQgMAorX0VPRgorCisjIyBCdWlsZCBwb3N0cmVtb3ZlIGZpbGUKK2VjaG8gIkJ1aWxkaW5nIHBvc3RyZW1vdmUgZmlsZS4uLiIKK2NhdCA+IHBvc3RyZW1vdmUgPDwgX0VPRgorIyEgJHtTQ1JJUFRfU0hFTEx9CisjCitpZiBbICRET19TTUYgLWVxIDEgXQordGhlbgorCWlmIHN2Y3MgJE9QRU5TU0hfRk1SSSA+IC9kZXYvbnVsbCAyPiYxCisJdGhlbgorCQlzdmNjZmcgZGVsZXRlIC1mICRPUEVOU1NIX0ZNUkkKKwlmaQorZmkKK19FT0YKKworIyBsb2NhbCBwb3N0cmVtb3ZlIGNoYW5nZXMgaGVyZQorWyAtcyAiJHtQS0dfUE9TVFJFTU9WRV9MT0NBTH0iIF0gICYmICAuICR7UEtHX1BPU1RSRU1PVkVfTE9DQUx9CisKK2NhdCA+PiBwb3N0cmVtb3ZlIDw8IF9FT0YKK2V4aXQgMAorX0VPRgorCisjIyBCdWlsZCByZXF1ZXN0IGZpbGUKK2VjaG8gIkJ1aWxkaW5nIHJlcXVlc3QgZmlsZS4uLiIKK2NhdCA+IHJlcXVlc3QgPDwgX0VPRgordHJhcCAnZXhpdCAzJyAxNQorCitfRU9GCisKK1sgLXggL3Vzci9iaW4vY2t5b3JuIF0gIHx8ICBjYXQgPj4gcmVxdWVzdCA8PCBfRU9GCisKK2NreW9ybigpIHsKKyMgZm9yIHNvbWUgc3RyYW5nZSByZWFzb24gT3BlblNlcnZlcjUgaGFzIG5vIGNreW9ybgorIyBXZSBidWlsZCBhIHN0cmlwZWQgZG93biB2ZXJzaW9uIGhlcmUKKworREVGQVVMVD1uCitQUk9NUFQ9IlllcyBvciBObyBbeWVzLG5vLD8scXVpdF0iCitIRUxQX1BST01QVD0iICAgICAgICBFbnRlciB5IG9yIHllcyBpZiB5b3VyIGFuc3dlciBpcyB5ZXM7IG4gb3Igbm8gaWYgeW91ciBhbnN3ZXIgaXMgbm8uIgorVVNBR0U9InVzYWdlOiBja3lvcm4gW29wdGlvbnNdCit3aGVyZSBvcHRpb25zIG1heSBpbmNsdWRlOgorICAgICAgICAtZCBkZWZhdWx0CisgICAgICAgIC1oIGhlbHAKKyAgICAgICAgLXAgcHJvbXB0CisiCisKK2lmIFsgXCQjICE9IDAgXQordGhlbgorCXdoaWxlIGdldG9wdHMgZDpwOmg6IGMKKwlkbworCQljYXNlIFwkYyBpbgorCQkJaCkJSEVMUF9QUk9NUFQ9IlwkT1BUQVJHIiA7OworCQkJZCkJREVGQVVMVD1cJE9QVEFSRyA7OworCQkJcCkJUFJPTVBUPVwkT1BUQVJHIDs7CisJCQlcXD8pCWVjaG8gIlwkVVNBR0UiIDE+JjIKKwkJCQlleGl0IDEgOzsKKwkJZXNhYworCWRvbmUKKwlzaGlmdCBcYGV4cHIgXCRPUFRJTkQgLSAxXGAKK2ZpCisKK3doaWxlIHRydWUKK2RvCisJZWNobyAiXCR7UFJPTVBUfVxcYyAiIDE+JjIKKwlyZWFkIGtleQorCVsgLXogIlwka2V5IiBdICAmJiAga2V5PVwkREVGQVVMVAorCWNhc2UgXCRrZXkgaW4KKwkJW24sTl18W24sTl1bbyxPXXxbeSxZXXxbeSxZXVtlLEVdW3MsU10pCWVjaG8gIlwke2tleX1cXGMiCisJCQlleGl0IDAgOzsKKwkJXFw/KQllY2hvIFwkSEVMUF9QUk9NUFQgMT4mMiA7OworCQlxfHF1aXQpCWVjaG8gInFcXGMiIDE+JjIKKwkJCWV4aXQgMyA7OworCWVzYWMKK2RvbmUKKworfQorCitfRU9GCisKK2lmIFsgJERPX1NNRiAtZXEgMSBdCit0aGVuCisJIyBUaGlzIGNvdWxkIGdldCBoYWlyeSwgYXMgdGhlIHJ1bm5pbmcgc3NoZCBtYXkgbm90IGJlIHVuZGVyIFNNRi4KKwkjIFdlJ2xsIGFzc3VtZSBhbiBlYXJsaWVyIHZlcnNpb24gb2YgT3BlblNTSCBzdGFydGVkIHZpYSBTTUYuCisJY2F0ID4+IHJlcXVlc3QgPDwgX0VPRgorUFJFX0lOU19TVE9QPW5vCitQT1NUX0lOU19TVEFSVD1ubworIyBkZXRlcm1pbmUgaWYgc2hvdWxkIHJlc3RhcnQgdGhlIGRhZW1vbgoraWYgWyAtcyAke3BpZGRpcn0vc3NoZC5waWQgIF0gJiYgXAorICAgIC91c3IvYmluL3N2Y3MgLUggJE9QRU5TU0hfRk1SSSAyPiYxIHwgZWdyZXAgIl5vbmxpbmUiID4gL2Rldi9udWxsIDI+JjEKK3RoZW4KKwlhbnM9XGBja3lvcm4gLWQgbiBcCistcCAiU2hvdWxkIHRoZSBydW5uaW5nIHNzaGQgZGFlbW9uIGJlIHJlc3RhcnRlZD8gJHtERUZfTVNHfSJcYCB8fCBleGl0IFwkPworCWNhc2UgXCRhbnMgaW4KKwkJW3ksWV0qKQlQUkVfSU5TX1NUT1A9eWVzCisJCQlQT1NUX0lOU19TVEFSVD15ZXMKKwkJCTs7CisJZXNhYworCitlbHNlCisKKyMgZGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBzdGFydCBzc2hkCisJYW5zPVxgY2t5b3JuIC1kIG4gXAorLXAgIlN0YXJ0IHRoZSBzc2hkIGRhZW1vbiBhZnRlciBpbnN0YWxsaW5nIHRoaXMgcGFja2FnZT8gJHtERUZfTVNHfSJcYCB8fCBleGl0IFwkPworCWNhc2UgXCRhbnMgaW4KKwkJW3ksWV0qKQlQT1NUX0lOU19TVEFSVD15ZXMgOzsKKwllc2FjCitmaQorCisjIG1ha2UgcGFyYW1ldGVycyBhdmFpbGFibGUgdG8gaW5zdGFsbGF0aW9uIHNlcnZpY2UsCisjIGFuZCBzbyB0byBhbnkgb3RoZXIgcGFja2FnaW5nIHNjcmlwdHMKK2NhdCA+XCQxIDw8IQorUFJFX0lOU19TVE9QPSdcJFBSRV9JTlNfU1RPUCcKK1BPU1RfSU5TX1NUQVJUPSdcJFBPU1RfSU5TX1NUQVJUJworIQorCitfRU9GCitlbHNlCisJY2F0ID4+IHJlcXVlc3QgPDwgX0VPRgorVVNFX1NZTV9MSU5LUz1ubworUFJFX0lOU19TVE9QPW5vCitQT1NUX0lOU19TVEFSVD1ubworIyBVc2Ugc3ltYm9saWMgbGlua3M/CithbnM9XGBja3lvcm4gLWQgbiBcCistcCAiRG8geW91IHdhbnQgc3ltYm9saWMgbGlua3MgZm9yIHRoZSBzdGFydC9zdG9wIHNjcmlwdHM/ICR7REVGX01TR30iXGAgfHwgZXhpdCBcJD8KK2Nhc2UgXCRhbnMgaW4KKwlbeSxZXSopCVVTRV9TWU1fTElOS1M9eWVzIDs7Citlc2FjCisKKyMgZGV0ZXJtaW5lIGlmIHNob3VsZCByZXN0YXJ0IHRoZSBkYWVtb24KK2lmIFsgLXMgJHtwaWRkaXJ9L3NzaGQucGlkICAtYSAgLWYgJHtURVNUX0RJUn0vZXRjL2luaXQuZC8ke1NZU1ZJTklUX05BTUV9IF0KK3RoZW4KKwlhbnM9XGBja3lvcm4gLWQgbiBcCistcCAiU2hvdWxkIHRoZSBydW5uaW5nIHNzaGQgZGFlbW9uIGJlIHJlc3RhcnRlZD8gJHtERUZfTVNHfSJcYCB8fCBleGl0IFwkPworCWNhc2UgXCRhbnMgaW4KKwkJW3ksWV0qKQlQUkVfSU5TX1NUT1A9eWVzCisJCQlQT1NUX0lOU19TVEFSVD15ZXMKKwkJCTs7CisJZXNhYworCitlbHNlCisKKyMgZGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBzdGFydCBzc2hkCisJYW5zPVxgY2t5b3JuIC1kIG4gXAorLXAgIlN0YXJ0IHRoZSBzc2hkIGRhZW1vbiBhZnRlciBpbnN0YWxsaW5nIHRoaXMgcGFja2FnZT8gJHtERUZfTVNHfSJcYCB8fCBleGl0IFwkPworCWNhc2UgXCRhbnMgaW4KKwkJW3ksWV0qKQlQT1NUX0lOU19TVEFSVD15ZXMgOzsKKwllc2FjCitmaQorCisjIG1ha2UgcGFyYW1ldGVycyBhdmFpbGFibGUgdG8gaW5zdGFsbGF0aW9uIHNlcnZpY2UsCisjIGFuZCBzbyB0byBhbnkgb3RoZXIgcGFja2FnaW5nIHNjcmlwdHMKK2NhdCA+XCQxIDw8IQorVVNFX1NZTV9MSU5LUz0nXCRVU0VfU1lNX0xJTktTJworUFJFX0lOU19TVE9QPSdcJFBSRV9JTlNfU1RPUCcKK1BPU1RfSU5TX1NUQVJUPSdcJFBPU1RfSU5TX1NUQVJUJworIQorCitfRU9GCitmaQorCisjIGxvY2FsIHJlcXVlc3QgY2hhbmdlcyBoZXJlCitbIC1zICIke1BLR19SRVFVRVNUX0xPQ0FMfSIgXSAgJiYgIC4gJHtQS0dfUkVRVUVTVF9MT0NBTH0KKworY2F0ID4+IHJlcXVlc3QgPDwgX0VPRgorZXhpdCAwCisKK19FT0YKKworIyMgTmV4dCBCdWlsZCBvdXIgcHJvdG90eXBlCitlY2hvICJCdWlsZGluZyBwcm90b3R5cGUgZmlsZS4uLiIKK2NhdCA+bWstcHJvdG8uYXdrIDw8IF9FT0YKKwkgICAgQkVHSU4geyBwcmludCAiaSBwa2dpbmZvIjsgcHJpbnQgImkgZGVwZW5kIjsgXFwKKwkJICAgIHByaW50ICJpIHByZWluc3RhbGwiOyBwcmludCAiaSBwb3N0aW5zdGFsbCI7IFxcCisgCQkgICAgcHJpbnQgImkgcHJlcmVtb3ZlIjsgcHJpbnQgImkgcG9zdHJlbW92ZSI7IFxcCisJCSAgICBwcmludCAiaSByZXF1ZXN0IjsgcHJpbnQgImkgc3BhY2UiOyBcXAorCQkgICAgc3BsaXQoIiRTWVNURU1fRElSIixzeXNfZmlsZXMpOyB9CisJICAgIHsKKwkgICAgIGZvciAoZGlyIGluIHN5c19maWxlcykgeyBpZiAoIFwkMyAhPSBzeXNfZmlsZXNbZGlyXSApCisJCSAgICAgeyBpZiAoIFwkMSA9PSAicyIgKQorCQkJeyBcJDU9IiI7IFwkNj0iIjsgfQorCQkgICAgIGVsc2UKKwkJCXsgXCQ1PSJyb290IjsgXCQ2PSJzeXMiOyB9CisJCSAgICAgfQorCQllbHNlCisJCSAgICAgeyBcJDQ9Ij8iOyBcJDU9Ij8iOyBcJDY9Ij8iOyBicmVhazt9CisJICAgIH0gfQorCSAgICB7IHByaW50OyB9CitfRU9GCisKK2ZpbmQgLiB8IGVncmVwIC12ICJwcm90b3R5cGV8cGtnaW5mb3xtay1wcm90by5hd2siIHwgc29ydCB8IFwKKwlwa2dwcm90byAkUFJPVE9fQVJHUyB8ICR7QVdLfSAtZiBtay1wcm90by5hd2sgPiBwcm90b3R5cGUKKworIyAvdXNyL2xvY2FsIGlzIGEgc3ltbGluayBvbiBzb21lIHN5c3RlbXMKK1sgIiR7VVNSX0xPQ0FMX0lTX1NZTUxJTkt9IiA9IHllcyBdICAmJiAgeworCWdyZXAgLXYgIl5kIG5vbmUgL3Vzci9sb2NhbCA/ID8gPyQiIHByb3RvdHlwZSA+IHByb3RvdHlwZS5uZXcKKwltdiBwcm90b3R5cGUubmV3IHByb3RvdHlwZQorfQorCisjIyBTdGVwIGJhY2sgYSBkaXJlY3RvcnkgYW5kIG5vdyBidWlsZCB0aGUgcGFja2FnZS4KK2NkIC4uCisjIGxvY2FsIHByb3RvdHlwZSB0d2Vla3MgaGVyZQorWyAtcyAiJHtQT1NUX1BST1RPVFlQRV9FRElUU30iIF0gICYmICAuICR7UE9TVF9QUk9UT1RZUEVfRURJVFN9CisKK2VjaG8gIkJ1aWxkaW5nIHBhY2thZ2UuLiIKK3BrZ21rIC1kICR7RkFLRV9ST09UfSAtZiAkRkFLRV9ST09UL3Byb3RvdHlwZSAtbworZWNobyB8IHBrZ3RyYW5zIC1vcyAke0ZBS0VfUk9PVH0gJHtTVEFSVH0vJFBLR05BTUUtJFZFUlNJT04kUkVWLSRVTkFNRV9TLSRBUkNILnBrZworCTs7CisKKwlqdXN0cGtnLnNoKQorcm0gLWZyICR7RkFLRV9ST09UfS8ke1BLR05BTUV9CitncmVwIC12ICJeUFNUQU1QPSIgJEZBS0VfUk9PVC9wa2dpbmZvID4gJCR0bXAKK212ICQkdG1wICRGQUtFX1JPT1QvcGtnaW5mbworY2F0ID4+ICRGQUtFX1JPT1QvcGtnaW5mbyA8PCBfRU9GCitQU1RBTVA9IiR7VU5BTUVfU30gJHtPU19WRVJ9ICR7QVJDSH0gYGRhdGUgJyslZCViJVkgJUg6JU0nYCIKK19FT0YKK3BrZ21rIC1kICR7RkFLRV9ST09UfSAtZiAkRkFLRV9ST09UL3Byb3RvdHlwZSAtbworZWNobyB8IHBrZ3RyYW5zIC1vcyAke0ZBS0VfUk9PVH0gJHtTVEFSVH0vJFBLR05BTUUtJFZFUlNJT04kUkVWLSRVTkFNRV9TLSRBUkNILnBrZworCTs7CisKK2VzYWMKKworWyAiJHtSRU1PVkVfRkFLRV9ST09UX1dIRU5fRE9ORX0iID0geWVzIF0gICYmICBybSAtcmYgJEZBS0VfUk9PVAorZXhpdCAwCisKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvY2Fub2hvc3QuYyBiL29wZW5zc2gtNi4wcDEvY2Fub2hvc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWJkOGEzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9jYW5vaG9zdC5jCkBAIC0wLDAgKzEsNDQwIEBACisvKiAkT3BlbkJTRDogY2Fub2hvc3QuYyx2IDEuNjYgMjAxMC8wMS8xMyAwMToyMDoyMCBkdHVja2VyIEV4cCAkICovCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICogRnVuY3Rpb25zIGZvciByZXR1cm5pbmcgdGhlIGNhbm9uaWNhbCBob3N0IG5hbWUgb2YgdGhlIHJlbW90ZSBzaXRlLgorICoKKyAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKKyAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCisgKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCisgKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCisgKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgInBhY2tldC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgImNhbm9ob3N0LmgiCisjaW5jbHVkZSAibWlzYy5oIgorCitzdGF0aWMgdm9pZCBjaGVja19pcF9vcHRpb25zKGludCwgY2hhciAqKTsKK3N0YXRpYyBjaGFyICpjYW5vbmljYWxfaG9zdF9pcCA9IE5VTEw7CitzdGF0aWMgaW50IGNhY2hlZF9wb3J0ID0gLTE7CisKKy8qCisgKiBSZXR1cm4gdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZSBob3N0IGF0IHRoZSBvdGhlciBlbmQgb2YgdGhlIHNvY2tldC4gVGhlCisgKiBjYWxsZXIgc2hvdWxkIGZyZWUgdGhlIHJldHVybmVkIHN0cmluZyB3aXRoIHhmcmVlLgorICovCisKK3N0YXRpYyBjaGFyICoKK2dldF9yZW1vdGVfaG9zdG5hbWUoaW50IHNvY2ssIGludCB1c2VfZG5zKQoreworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGZyb207CisJaW50IGk7CisJc29ja2xlbl90IGZyb21sZW47CisJc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWksICphaXRvcDsKKwljaGFyIG5hbWVbTklfTUFYSE9TVF0sIG50b3BbTklfTUFYSE9TVF0sIG50b3AyW05JX01BWEhPU1RdOworCisJLyogR2V0IElQIGFkZHJlc3Mgb2YgY2xpZW50LiAqLworCWZyb21sZW4gPSBzaXplb2YoZnJvbSk7CisJbWVtc2V0KCZmcm9tLCAwLCBzaXplb2YoZnJvbSkpOworCWlmIChnZXRwZWVybmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmZyb20sICZmcm9tbGVuKSA8IDApIHsKKwkJZGVidWcoImdldHBlZXJuYW1lIGZhaWxlZDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xlYW51cF9leGl0KDI1NSk7CisJfQorCisJaWYgKGZyb20uc3NfZmFtaWx5ID09IEFGX0lORVQpCisJCWNoZWNrX2lwX29wdGlvbnMoc29jaywgbnRvcCk7CisKKwlpcHY2NF9ub3JtYWxpc2VfbWFwcGVkKCZmcm9tLCAmZnJvbWxlbik7CisKKwlpZiAoZnJvbS5zc19mYW1pbHkgPT0gQUZfSU5FVDYpCisJCWZyb21sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisKKwlpZiAoZ2V0bmFtZWluZm8oKHN0cnVjdCBzb2NrYWRkciAqKSZmcm9tLCBmcm9tbGVuLCBudG9wLCBzaXplb2YobnRvcCksCisJICAgIE5VTEwsIDAsIE5JX05VTUVSSUNIT1NUKSAhPSAwKQorCQlmYXRhbCgiZ2V0X3JlbW90ZV9ob3N0bmFtZTogZ2V0bmFtZWluZm8gTklfTlVNRVJJQ0hPU1QgZmFpbGVkIik7CisKKwlpZiAoIXVzZV9kbnMpCisJCXJldHVybiB4c3RyZHVwKG50b3ApOworCisJZGVidWczKCJUcnlpbmcgdG8gcmV2ZXJzZSBtYXAgYWRkcmVzcyAlLjEwMHMuIiwgbnRvcCk7CisJLyogTWFwIHRoZSBJUCBhZGRyZXNzIHRvIGEgaG9zdCBuYW1lLiAqLworCWlmIChnZXRuYW1laW5mbygoc3RydWN0IHNvY2thZGRyICopJmZyb20sIGZyb21sZW4sIG5hbWUsIHNpemVvZihuYW1lKSwKKwkgICAgTlVMTCwgMCwgTklfTkFNRVJFUUQpICE9IDApIHsKKwkJLyogSG9zdCBuYW1lIG5vdCBmb3VuZC4gIFVzZSBpcCBhZGRyZXNzLiAqLworCQlyZXR1cm4geHN0cmR1cChudG9wKTsKKwl9CisKKwkvKgorCSAqIGlmIHJldmVyc2UgbG9va3VwIHJlc3VsdCBsb29rcyBsaWtlIGEgbnVtZXJpYyBob3N0bmFtZSwKKwkgKiBzb21lb25lIGlzIHRyeWluZyB0byB0cmljayB1cyBieSBQVFIgcmVjb3JkIGxpa2UgZm9sbG93aW5nOgorCSAqCTEuMS4xLjEwLmluLWFkZHIuYXJwYS4JSU4gUFRSCTIuMy40LjUKKwkgKi8KKwltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKwloaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CS8qZHVtbXkqLworCWhpbnRzLmFpX2ZsYWdzID0gQUlfTlVNRVJJQ0hPU1Q7CisJaWYgKGdldGFkZHJpbmZvKG5hbWUsIE5VTEwsICZoaW50cywgJmFpKSA9PSAwKSB7CisJCWxvZ2l0KCJOYXN0eSBQVFIgcmVjb3JkIFwiJXNcIiBpcyBzZXQgdXAgZm9yICVzLCBpZ25vcmluZyIsCisJCSAgICBuYW1lLCBudG9wKTsKKwkJZnJlZWFkZHJpbmZvKGFpKTsKKwkJcmV0dXJuIHhzdHJkdXAobnRvcCk7CisJfQorCisJLyoKKwkgKiBDb252ZXJ0IGl0IHRvIGFsbCBsb3dlcmNhc2UgKHdoaWNoIGlzIGV4cGVjdGVkIGJ5IHRoZSByZXN0CisJICogb2YgdGhpcyBzb2Z0d2FyZSkuCisJICovCisJZm9yIChpID0gMDsgbmFtZVtpXTsgaSsrKQorCQlpZiAoaXN1cHBlcihuYW1lW2ldKSkKKwkJCW5hbWVbaV0gPSAoY2hhcil0b2xvd2VyKG5hbWVbaV0pOworCS8qCisJICogTWFwIGl0IGJhY2sgdG8gYW4gSVAgYWRkcmVzcyBhbmQgY2hlY2sgdGhhdCB0aGUgZ2l2ZW4KKwkgKiBhZGRyZXNzIGFjdHVhbGx5IGlzIGFuIGFkZHJlc3Mgb2YgdGhpcyBob3N0LiAgVGhpcyBpcworCSAqIG5lY2Vzc2FyeSBiZWNhdXNlIGFueW9uZSB3aXRoIGFjY2VzcyB0byBhIG5hbWUgc2VydmVyIGNhbgorCSAqIGRlZmluZSBhcmJpdHJhcnkgbmFtZXMgZm9yIGFuIElQIGFkZHJlc3MuIE1hcHBpbmcgZnJvbQorCSAqIG5hbWUgdG8gSVAgYWRkcmVzcyBjYW4gYmUgdHJ1c3RlZCBiZXR0ZXIgKGJ1dCBjYW4gc3RpbGwgYmUKKwkgKiBmb29sZWQgaWYgdGhlIGludHJ1ZGVyIGhhcyBhY2Nlc3MgdG8gdGhlIG5hbWUgc2VydmVyIG9mCisJICogdGhlIGRvbWFpbikuCisJICovCisJbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisJaGludHMuYWlfZmFtaWx5ID0gZnJvbS5zc19mYW1pbHk7CisJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKwlpZiAoZ2V0YWRkcmluZm8obmFtZSwgTlVMTCwgJmhpbnRzLCAmYWl0b3ApICE9IDApIHsKKwkJbG9naXQoInJldmVyc2UgbWFwcGluZyBjaGVja2luZyBnZXRhZGRyaW5mbyBmb3IgJS43MDBzICIKKwkJICAgICJbJXNdIGZhaWxlZCAtIFBPU1NJQkxFIEJSRUFLLUlOIEFUVEVNUFQhIiwgbmFtZSwgbnRvcCk7CisJCXJldHVybiB4c3RyZHVwKG50b3ApOworCX0KKwkvKiBMb29rIGZvciB0aGUgYWRkcmVzcyBmcm9tIHRoZSBsaXN0IG9mIGFkZHJlc3Nlcy4gKi8KKwlmb3IgKGFpID0gYWl0b3A7IGFpOyBhaSA9IGFpLT5haV9uZXh0KSB7CisJCWlmIChnZXRuYW1laW5mbyhhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4sIG50b3AyLAorCQkgICAgc2l6ZW9mKG50b3AyKSwgTlVMTCwgMCwgTklfTlVNRVJJQ0hPU1QpID09IDAgJiYKKwkJICAgIChzdHJjbXAobnRvcCwgbnRvcDIpID09IDApKQorCQkJCWJyZWFrOworCX0KKwlmcmVlYWRkcmluZm8oYWl0b3ApOworCS8qIElmIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbGlzdCwgdGhlIGFkZHJlc3Mgd2FzIG5vdCB0aGVyZS4gKi8KKwlpZiAoIWFpKSB7CisJCS8qIEFkZHJlc3Mgbm90IGZvdW5kIGZvciB0aGUgaG9zdCBuYW1lLiAqLworCQlsb2dpdCgiQWRkcmVzcyAlLjEwMHMgbWFwcyB0byAlLjYwMHMsIGJ1dCB0aGlzIGRvZXMgbm90ICIKKwkJICAgICJtYXAgYmFjayB0byB0aGUgYWRkcmVzcyAtIFBPU1NJQkxFIEJSRUFLLUlOIEFUVEVNUFQhIiwKKwkJICAgIG50b3AsIG5hbWUpOworCQlyZXR1cm4geHN0cmR1cChudG9wKTsKKwl9CisJcmV0dXJuIHhzdHJkdXAobmFtZSk7Cit9CisKKy8qCisgKiBJZiBJUCBvcHRpb25zIGFyZSBzdXBwb3J0ZWQsIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm9uZSAobG9nIGFuZAorICogZGlzY29ubmVjdCB0aGVtIGlmIGFueSBhcmUgZm91bmQpLiAgQmFzaWNhbGx5IHdlIGFyZSB3b3JyaWVkIGFib3V0CisgKiBzb3VyY2Ugcm91dGluZzsgaXQgY2FuIGJlIHVzZWQgdG8gcHJldGVuZCB5b3UgYXJlIHNvbWVib2R5CisgKiAoaXAtYWRkcmVzcykgeW91IGFyZSBub3QuIFRoYXQgaXRzZWxmIG1heSBiZSAiYWxtb3N0IGFjY2VwdGFibGUiCisgKiB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIGJ1dCByaG9zdHMgYXV0ZW50aWNhdGlvbiBpcyB1c2VsZXNzCisgKiBpZiBzb3VyY2Ugcm91dGluZyBpcyBhY2NlcHRlZC4gTm90aWNlIGFsc28gdGhhdCBpZiB3ZSBqdXN0IGRyb3BwZWQKKyAqIHNvdXJjZSByb3V0aW5nIGhlcmUsIHRoZSBvdGhlciBzaWRlIGNvdWxkIHVzZSBJUCBzcG9vZmluZyB0byBkbworICogcmVzdCBvZiB0aGUgaW50ZXJhY3Rpb24gYW5kIGNvdWxkIHN0aWxsIGJ5cGFzcyBzZWN1cml0eS4gIFNvIHdlCisgKiBleGl0IGhlcmUgaWYgd2UgZGV0ZWN0IGFueSBJUCBvcHRpb25zLgorICovCisvKiBJUHY0IG9ubHkgKi8KK3N0YXRpYyB2b2lkCitjaGVja19pcF9vcHRpb25zKGludCBzb2NrLCBjaGFyICppcGFkZHIpCit7CisjaWZkZWYgSVBfT1BUSU9OUworCXVfY2hhciBvcHRpb25zWzIwMF07CisJY2hhciB0ZXh0W3NpemVvZihvcHRpb25zKSAqIDMgKyAxXTsKKwlzb2NrbGVuX3Qgb3B0aW9uX3NpemU7CisJdV9pbnQgaTsKKwlpbnQgaXBwcm90bzsKKwlzdHJ1Y3QgcHJvdG9lbnQgKmlwOworCisJaWYgKChpcCA9IGdldHByb3RvYnluYW1lKCJpcCIpKSAhPSBOVUxMKQorCQlpcHByb3RvID0gaXAtPnBfcHJvdG87CisJZWxzZQorCQlpcHByb3RvID0gSVBQUk9UT19JUDsKKwlvcHRpb25fc2l6ZSA9IHNpemVvZihvcHRpb25zKTsKKwlpZiAoZ2V0c29ja29wdChzb2NrLCBpcHByb3RvLCBJUF9PUFRJT05TLCBvcHRpb25zLAorCSAgICAmb3B0aW9uX3NpemUpID49IDAgJiYgb3B0aW9uX3NpemUgIT0gMCkgeworCQl0ZXh0WzBdID0gJ1wwJzsKKwkJZm9yIChpID0gMDsgaSA8IG9wdGlvbl9zaXplOyBpKyspCisJCQlzbnByaW50Zih0ZXh0ICsgaSozLCBzaXplb2YodGV4dCkgLSBpKjMsCisJCQkgICAgIiAlMi4yeCIsIG9wdGlvbnNbaV0pOworCQlmYXRhbCgiQ29ubmVjdGlvbiBmcm9tICUuMTAwcyB3aXRoIElQIG9wdGlvbnM6JS44MDBzIiwKKwkJICAgIGlwYWRkciwgdGV4dCk7CisJfQorI2VuZGlmIC8qIElQX09QVElPTlMgKi8KK30KKwordm9pZAoraXB2NjRfbm9ybWFsaXNlX21hcHBlZChzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkciwgc29ja2xlbl90ICpsZW4pCit7CisJc3RydWN0IHNvY2thZGRyX2luNiAqYTYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKWFkZHI7CisJc3RydWN0IHNvY2thZGRyX2luICphNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyOworCXN0cnVjdCBpbl9hZGRyIGluYWRkcjsKKwl1X2ludDE2X3QgcG9ydDsKKworCWlmIChhZGRyLT5zc19mYW1pbHkgIT0gQUZfSU5FVDYgfHwKKwkgICAgIUlONl9JU19BRERSX1Y0TUFQUEVEKCZhNi0+c2luNl9hZGRyKSkKKwkJcmV0dXJuOworCisJZGVidWczKCJOb3JtYWxpc2luZyBtYXBwZWQgSVB2NCBpbiBJUHY2IGFkZHJlc3MiKTsKKworCW1lbWNweSgmaW5hZGRyLCAoKGNoYXIgKikmYTYtPnNpbjZfYWRkcikgKyAxMiwgc2l6ZW9mKGluYWRkcikpOworCXBvcnQgPSBhNi0+c2luNl9wb3J0OworCisJYnplcm8oYTQsIHNpemVvZigqYTQpKTsKKworCWE0LT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkqbGVuID0gc2l6ZW9mKCphNCk7CisJbWVtY3B5KCZhNC0+c2luX2FkZHIsICZpbmFkZHIsIHNpemVvZihpbmFkZHIpKTsKKwlhNC0+c2luX3BvcnQgPSBwb3J0OworfQorCisvKgorICogUmV0dXJuIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUgaG9zdCBpbiB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgY3VycmVudAorICogY29ubmVjdGlvbi4gIFRoZSBob3N0IG5hbWUgaXMgY2FjaGVkLCBzbyBpdCBpcyBlZmZpY2llbnQgdG8gY2FsbCB0aGlzCisgKiBzZXZlcmFsIHRpbWVzLgorICovCisKK2NvbnN0IGNoYXIgKgorZ2V0X2Nhbm9uaWNhbF9ob3N0bmFtZShpbnQgdXNlX2RucykKK3sKKwljaGFyICpob3N0OworCXN0YXRpYyBjaGFyICpjYW5vbmljYWxfaG9zdF9uYW1lID0gTlVMTDsKKwlzdGF0aWMgY2hhciAqcmVtb3RlX2lwID0gTlVMTDsKKworCS8qIENoZWNrIGlmIHdlIGhhdmUgcHJldmlvdXNseSByZXRyaWV2ZWQgbmFtZSB3aXRoIHNhbWUgb3B0aW9uLiAqLworCWlmICh1c2VfZG5zICYmIGNhbm9uaWNhbF9ob3N0X25hbWUgIT0gTlVMTCkKKwkJcmV0dXJuIGNhbm9uaWNhbF9ob3N0X25hbWU7CisJaWYgKCF1c2VfZG5zICYmIHJlbW90ZV9pcCAhPSBOVUxMKQorCQlyZXR1cm4gcmVtb3RlX2lwOworCisJLyogR2V0IHRoZSByZWFsIGhvc3RuYW1lIGlmIHNvY2tldDsgb3RoZXJ3aXNlIHJldHVybiBVTktOT1dOLiAqLworCWlmIChwYWNrZXRfY29ubmVjdGlvbl9pc19vbl9zb2NrZXQoKSkKKwkJaG9zdCA9IGdldF9yZW1vdGVfaG9zdG5hbWUocGFja2V0X2dldF9jb25uZWN0aW9uX2luKCksIHVzZV9kbnMpOworCWVsc2UKKwkJaG9zdCA9ICJVTktOT1dOIjsKKworCWlmICh1c2VfZG5zKQorCQljYW5vbmljYWxfaG9zdF9uYW1lID0gaG9zdDsKKwllbHNlCisJCXJlbW90ZV9pcCA9IGhvc3Q7CisJcmV0dXJuIGhvc3Q7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBsb2NhbC9yZW1vdGUgSVAtYWRkcmVzcy9ob3N0bmFtZSBvZiBzb2NrZXQgYXMgYSBzdHJpbmcuCisgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIG11c3QgYmUgZnJlZWQuCisgKi8KK3N0YXRpYyBjaGFyICoKK2dldF9zb2NrZXRfYWRkcmVzcyhpbnQgc29jaywgaW50IHJlbW90ZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7CisJc29ja2xlbl90IGFkZHJsZW47CisJY2hhciBudG9wW05JX01BWEhPU1RdOworCWludCByOworCisJLyogR2V0IElQIGFkZHJlc3Mgb2YgY2xpZW50LiAqLworCWFkZHJsZW4gPSBzaXplb2YoYWRkcik7CisJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCisJaWYgKHJlbW90ZSkgeworCQlpZiAoZ2V0cGVlcm5hbWUoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCAmYWRkcmxlbikKKwkJICAgIDwgMCkKKwkJCXJldHVybiBOVUxMOworCX0gZWxzZSB7CisJCWlmIChnZXRzb2NrbmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsICZhZGRybGVuKQorCQkgICAgPCAwKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogV29yayBhcm91bmQgTGludXggSVB2NiB3ZWlyZG5lc3MgKi8KKwlpZiAoYWRkci5zc19mYW1pbHkgPT0gQUZfSU5FVDYpCisJCWFkZHJsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisKKwlpcHY2NF9ub3JtYWxpc2VfbWFwcGVkKCZhZGRyLCAmYWRkcmxlbik7CisKKwkvKiBHZXQgdGhlIGFkZHJlc3MgaW4gYXNjaWkuICovCisJaWYgKChyID0gZ2V0bmFtZWluZm8oKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBhZGRybGVuLCBudG9wLAorCSAgICBzaXplb2YobnRvcCksIE5VTEwsIDAsIGZsYWdzKSkgIT0gMCkgeworCQllcnJvcigiZ2V0X3NvY2tldF9hZGRyZXNzOiBnZXRuYW1laW5mbyAlZCBmYWlsZWQ6ICVzIiwgZmxhZ3MsCisJCSAgICBzc2hfZ2FpX3N0cmVycm9yKHIpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiB4c3RyZHVwKG50b3ApOworfQorCitjaGFyICoKK2dldF9wZWVyX2lwYWRkcihpbnQgc29jaykKK3sKKwljaGFyICpwOworCisJaWYgKChwID0gZ2V0X3NvY2tldF9hZGRyZXNzKHNvY2ssIDEsIE5JX05VTUVSSUNIT1NUKSkgIT0gTlVMTCkKKwkJcmV0dXJuIHA7CisJcmV0dXJuIHhzdHJkdXAoIlVOS05PV04iKTsKK30KKworY2hhciAqCitnZXRfbG9jYWxfaXBhZGRyKGludCBzb2NrKQoreworCWNoYXIgKnA7CisKKwlpZiAoKHAgPSBnZXRfc29ja2V0X2FkZHJlc3Moc29jaywgMCwgTklfTlVNRVJJQ0hPU1QpKSAhPSBOVUxMKQorCQlyZXR1cm4gcDsKKwlyZXR1cm4geHN0cmR1cCgiVU5LTk9XTiIpOworfQorCitjaGFyICoKK2dldF9sb2NhbF9uYW1lKGludCBmZCkKK3sKKwljaGFyICpob3N0LCBteW5hbWVbTklfTUFYSE9TVF07CisKKwkvKiBBc3N1bWUgd2Ugd2VyZSBwYXNzZWQgYSBzb2NrZXQgKi8KKwlpZiAoKGhvc3QgPSBnZXRfc29ja2V0X2FkZHJlc3MoZmQsIDAsIE5JX05BTUVSRVFEKSkgIT0gTlVMTCkKKwkJcmV0dXJuIGhvc3Q7CisKKwkvKiBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2Ugd2VyZSBwYXNzZWQgYSBwaXBlICovCisJaWYgKGdldGhvc3RuYW1lKG15bmFtZSwgc2l6ZW9mKG15bmFtZSkpID09IC0xKSB7CisJCXZlcmJvc2UoImdldF9sb2NhbF9uYW1lOiBnZXRob3N0bmFtZTogJXMiLCBzdHJlcnJvcihlcnJubykpOworCX0gZWxzZSB7CisJCWhvc3QgPSB4c3RyZHVwKG15bmFtZSk7CisJfQorCisJcmV0dXJuIGhvc3Q7Cit9CisKK3ZvaWQKK2NsZWFyX2NhY2hlZF9hZGRyKHZvaWQpCit7CisJaWYgKGNhbm9uaWNhbF9ob3N0X2lwICE9IE5VTEwpIHsKKwkJeGZyZWUoY2Fub25pY2FsX2hvc3RfaXApOworCQljYW5vbmljYWxfaG9zdF9pcCA9IE5VTEw7CisJfQorCWNhY2hlZF9wb3J0ID0gLTE7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBJUC1hZGRyZXNzIG9mIHRoZSByZW1vdGUgaG9zdCBhcyBhIHN0cmluZy4gIFRoZSByZXR1cm5lZAorICogc3RyaW5nIG11c3Qgbm90IGJlIGZyZWVkLgorICovCisKK2NvbnN0IGNoYXIgKgorZ2V0X3JlbW90ZV9pcGFkZHIodm9pZCkKK3sKKwkvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgY2FjaGVkIHRoZSBpcGFkZHIuICovCisJaWYgKGNhbm9uaWNhbF9ob3N0X2lwID09IE5VTEwpIHsKKwkJaWYgKHBhY2tldF9jb25uZWN0aW9uX2lzX29uX3NvY2tldCgpKSB7CisJCQljYW5vbmljYWxfaG9zdF9pcCA9CisJCQkgICAgZ2V0X3BlZXJfaXBhZGRyKHBhY2tldF9nZXRfY29ubmVjdGlvbl9pbigpKTsKKwkJCWlmIChjYW5vbmljYWxfaG9zdF9pcCA9PSBOVUxMKQorCQkJCWNsZWFudXBfZXhpdCgyNTUpOworCQl9IGVsc2UgeworCQkJLyogSWYgbm90IG9uIHNvY2tldCwgcmV0dXJuIFVOS05PV04uICovCisJCQljYW5vbmljYWxfaG9zdF9pcCA9IHhzdHJkdXAoIlVOS05PV04iKTsKKwkJfQorCX0KKwlyZXR1cm4gY2Fub25pY2FsX2hvc3RfaXA7Cit9CisKK2NvbnN0IGNoYXIgKgorZ2V0X3JlbW90ZV9uYW1lX29yX2lwKHVfaW50IHV0bXBfbGVuLCBpbnQgdXNlX2RucykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqcmVtb3RlID0gIiI7CisJaWYgKHV0bXBfbGVuID4gMCkKKwkJcmVtb3RlID0gZ2V0X2Nhbm9uaWNhbF9ob3N0bmFtZSh1c2VfZG5zKTsKKwlpZiAodXRtcF9sZW4gPT0gMCB8fCBzdHJsZW4ocmVtb3RlKSA+IHV0bXBfbGVuKQorCQlyZW1vdGUgPSBnZXRfcmVtb3RlX2lwYWRkcigpOworCXJldHVybiByZW1vdGU7Cit9CisKKy8qIFJldHVybnMgdGhlIGxvY2FsL3JlbW90ZSBwb3J0IGZvciB0aGUgc29ja2V0LiAqLworCitpbnQKK2dldF9zb2NrX3BvcnQoaW50IHNvY2ssIGludCBsb2NhbCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBmcm9tOworCXNvY2tsZW5fdCBmcm9tbGVuOworCWNoYXIgc3RycG9ydFtOSV9NQVhTRVJWXTsKKwlpbnQgcjsKKworCS8qIEdldCBJUCBhZGRyZXNzIG9mIGNsaWVudC4gKi8KKwlmcm9tbGVuID0gc2l6ZW9mKGZyb20pOworCW1lbXNldCgmZnJvbSwgMCwgc2l6ZW9mKGZyb20pKTsKKwlpZiAobG9jYWwpIHsKKwkJaWYgKGdldHNvY2tuYW1lKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmZnJvbSwgJmZyb21sZW4pIDwgMCkgeworCQkJZXJyb3IoImdldHNvY2tuYW1lIGZhaWxlZDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGdldHBlZXJuYW1lKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmZnJvbSwgJmZyb21sZW4pIDwgMCkgeworCQkJZGVidWcoImdldHBlZXJuYW1lIGZhaWxlZDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCS8qIFdvcmsgYXJvdW5kIExpbnV4IElQdjYgd2VpcmRuZXNzICovCisJaWYgKGZyb20uc3NfZmFtaWx5ID09IEFGX0lORVQ2KQorCQlmcm9tbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworCisJLyogUmV0dXJuIHBvcnQgbnVtYmVyLiAqLworCWlmICgociA9IGdldG5hbWVpbmZvKChzdHJ1Y3Qgc29ja2FkZHIgKikmZnJvbSwgZnJvbWxlbiwgTlVMTCwgMCwKKwkgICAgc3RycG9ydCwgc2l6ZW9mKHN0cnBvcnQpLCBOSV9OVU1FUklDU0VSVikpICE9IDApCisJCWZhdGFsKCJnZXRfc29ja19wb3J0OiBnZXRuYW1laW5mbyBOSV9OVU1FUklDU0VSViBmYWlsZWQ6ICVzIiwKKwkJICAgIHNzaF9nYWlfc3RyZXJyb3IocikpOworCXJldHVybiBhdG9pKHN0cnBvcnQpOworfQorCisvKiBSZXR1cm5zIHJlbW90ZS9sb2NhbCBwb3J0IG51bWJlciBmb3IgdGhlIGN1cnJlbnQgY29ubmVjdGlvbi4gKi8KKworc3RhdGljIGludAorZ2V0X3BvcnQoaW50IGxvY2FsKQoreworCS8qCisJICogSWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGEgc29ja2V0LCByZXR1cm4gNjU1MzUuICBUaGlzIGlzCisJICogaW50ZW50aW9uYWxseSBjaG9zZW4gdG8gYmUgYW4gdW5wcml2aWxlZ2VkIHBvcnQgbnVtYmVyLgorCSAqLworCWlmICghcGFja2V0X2Nvbm5lY3Rpb25faXNfb25fc29ja2V0KCkpCisJCXJldHVybiA2NTUzNTsKKworCS8qIEdldCBzb2NrZXQgYW5kIHJldHVybiB0aGUgcG9ydCBudW1iZXIuICovCisJcmV0dXJuIGdldF9zb2NrX3BvcnQocGFja2V0X2dldF9jb25uZWN0aW9uX2luKCksIGxvY2FsKTsKK30KKworaW50CitnZXRfcGVlcl9wb3J0KGludCBzb2NrKQoreworCXJldHVybiBnZXRfc29ja19wb3J0KHNvY2ssIDApOworfQorCitpbnQKK2dldF9yZW1vdGVfcG9ydCh2b2lkKQoreworCS8qIENhY2hlIHRvIGF2b2lkIGdldHBlZXJuYW1lKCkgb24gYSBkZWFkIGNvbm5lY3Rpb24gKi8KKwlpZiAoY2FjaGVkX3BvcnQgPT0gLTEpCisJCWNhY2hlZF9wb3J0ID0gZ2V0X3BvcnQoMCk7CisKKwlyZXR1cm4gY2FjaGVkX3BvcnQ7Cit9CisKK2ludAorZ2V0X2xvY2FsX3BvcnQodm9pZCkKK3sKKwlyZXR1cm4gZ2V0X3BvcnQoMSk7Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2Nhbm9ob3N0LmggYi9vcGVuc3NoLTYuMHAxL2Nhbm9ob3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM4NjM2ZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY2Fub2hvc3QuaApAQCAtMCwwICsxLDI5IEBACisvKiAkT3BlbkJTRDogY2Fub2hvc3QuaCx2IDEuMTEgMjAwOS8wNS8yNyAwNjozMToyNSBhbmRyZWFzIEV4cCAkICovCisKKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqLworCitjb25zdCBjaGFyCSpnZXRfY2Fub25pY2FsX2hvc3RuYW1lKGludCk7Citjb25zdCBjaGFyCSpnZXRfcmVtb3RlX2lwYWRkcih2b2lkKTsKK2NvbnN0IGNoYXIJKmdldF9yZW1vdGVfbmFtZV9vcl9pcCh1X2ludCwgaW50KTsKKworY2hhcgkJKmdldF9wZWVyX2lwYWRkcihpbnQpOworaW50CQkgZ2V0X3BlZXJfcG9ydChpbnQpOworY2hhcgkJKmdldF9sb2NhbF9pcGFkZHIoaW50KTsKK2NoYXIJCSpnZXRfbG9jYWxfbmFtZShpbnQpOworCitpbnQJCSBnZXRfcmVtb3RlX3BvcnQodm9pZCk7CitpbnQJCSBnZXRfbG9jYWxfcG9ydCh2b2lkKTsKK2ludAkJIGdldF9zb2NrX3BvcnQoaW50LCBpbnQpOwordm9pZAkJIGNsZWFyX2NhY2hlZF9hZGRyKHZvaWQpOworCit2b2lkCQkgaXB2NjRfbm9ybWFsaXNlX21hcHBlZChzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqLCBzb2NrbGVuX3QgKik7CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2NoYW5uZWxzLmMgYi9vcGVuc3NoLTYuMHAxL2NoYW5uZWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlOWI0ZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY2hhbm5lbHMuYwpAQCAtMCwwICsxLDM3NjQgQEAKKy8qICRPcGVuQlNEOiBjaGFubmVscy5jLHYgMS4zMTUgMjAxMS8wOS8yMyAwNzo0NTowNSBtYXJrdXMgRXhwICQgKi8KKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIGZvciBnZW5lcmljIHNvY2tldCBjb25uZWN0aW9uIGZvcndhcmRpbmcuCisgKiBUaGVyZSBpcyBhbHNvIGNvZGUgZm9yIGluaXRpYXRpbmcgY29ubmVjdGlvbiBmb3J3YXJkaW5nIGZvciBYMTEgY29ubmVjdGlvbnMsCisgKiBhcmJpdHJhcnkgdGNwL2lwIGNvbm5lY3Rpb25zLCBhbmQgdGhlIGF1dGhlbnRpY2F0aW9uIGFnZW50IGNvbm5lY3Rpb24uCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqCisgKiBTU0gyIHN1cHBvcnQgYWRkZWQgYnkgTWFya3VzIEZyaWVkbC4KKyAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5OSBEdWcgU29uZy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlbyBkZSBSYWFkdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorIyBpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L3N5cy1xdWV1ZS5oIgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJzc2guaCIKKyNpbmNsdWRlICJzc2gxLmgiCisjaW5jbHVkZSAic3NoMi5oIgorI2luY2x1ZGUgInBhY2tldC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJjaGFubmVscy5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorI2luY2x1ZGUgImNhbm9ob3N0LmgiCisjaW5jbHVkZSAia2V5LmgiCisjaW5jbHVkZSAiYXV0aGZkLmgiCisjaW5jbHVkZSAicGF0aG5hbWVzLmgiCisKKy8qIC0tIGNoYW5uZWwgY29yZSAqLworCisvKgorICogUG9pbnRlciB0byBhbiBhcnJheSBjb250YWluaW5nIGFsbCBhbGxvY2F0ZWQgY2hhbm5lbHMuICBUaGUgYXJyYXkgaXMKKyAqIGR5bmFtaWNhbGx5IGV4dGVuZGVkIGFzIG5lZWRlZC4KKyAqLworc3RhdGljIENoYW5uZWwgKipjaGFubmVscyA9IE5VTEw7CisKKy8qCisgKiBTaXplIG9mIHRoZSBjaGFubmVsIGFycmF5LiAgQWxsIHNsb3RzIG9mIHRoZSBhcnJheSBtdXN0IGFsd2F5cyBiZQorICogaW5pdGlhbGl6ZWQgKGF0IGxlYXN0IHRoZSB0eXBlIGZpZWxkKTsgdW51c2VkIHNsb3RzIHNldCB0byBOVUxMCisgKi8KK3N0YXRpYyB1X2ludCBjaGFubmVsc19hbGxvYyA9IDA7CisKKy8qCisgKiBNYXhpbXVtIGZpbGUgZGVzY3JpcHRvciB2YWx1ZSB1c2VkIGluIGFueSBvZiB0aGUgY2hhbm5lbHMuICBUaGlzIGlzCisgKiB1cGRhdGVkIGluIGNoYW5uZWxfbmV3LgorICovCitzdGF0aWMgaW50IGNoYW5uZWxfbWF4X2ZkID0gMDsKKworCisvKiAtLSB0Y3AgZm9yd2FyZGluZyAqLworCisvKgorICogRGF0YSBzdHJ1Y3R1cmUgZm9yIHN0b3Jpbmcgd2hpY2ggaG9zdHMgYXJlIHBlcm1pdHRlZCBmb3IgZm9yd2FyZCByZXF1ZXN0cy4KKyAqIFRoZSBsb2NhbCBzaWRlcyBvZiBhbnkgcmVtb3RlIGZvcndhcmRzIGFyZSBzdG9yZWQgaW4gdGhpcyBhcnJheSB0byBwcmV2ZW50CisgKiBhIGNvcnJ1cHQgcmVtb3RlIHNlcnZlciBmcm9tIGFjY2Vzc2luZyBhcmJpdHJhcnkgVENQL0lQIHBvcnRzIG9uIG91ciBsb2NhbAorICogbmV0d29yayAod2hpY2ggbWlnaHQgYmUgYmVoaW5kIGEgZmlyZXdhbGwpLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJY2hhciAqaG9zdF90b19jb25uZWN0OwkJLyogQ29ubmVjdCB0byAnaG9zdCcuICovCisJdV9zaG9ydCBwb3J0X3RvX2Nvbm5lY3Q7CS8qIENvbm5lY3QgdG8gJ3BvcnQnLiAqLworCXVfc2hvcnQgbGlzdGVuX3BvcnQ7CQkvKiBSZW1vdGUgc2lkZSBzaG91bGQgbGlzdGVuIHBvcnQgbnVtYmVyLiAqLworfSBGb3J3YXJkUGVybWlzc2lvbjsKKworLyogTGlzdCBvZiBhbGwgcGVybWl0dGVkIGhvc3QvcG9ydCBwYWlycyB0byBjb25uZWN0IGJ5IHRoZSB1c2VyLiAqLworc3RhdGljIEZvcndhcmRQZXJtaXNzaW9uICpwZXJtaXR0ZWRfb3BlbnMgPSBOVUxMOworCisvKiBMaXN0IG9mIGFsbCBwZXJtaXR0ZWQgaG9zdC9wb3J0IHBhaXJzIHRvIGNvbm5lY3QgYnkgdGhlIGFkbWluLiAqLworc3RhdGljIEZvcndhcmRQZXJtaXNzaW9uICpwZXJtaXR0ZWRfYWRtX29wZW5zID0gTlVMTDsKKworLyogTnVtYmVyIG9mIHBlcm1pdHRlZCBob3N0L3BvcnQgcGFpcnMgaW4gdGhlIGFycmF5IHBlcm1pdHRlZCBieSB0aGUgdXNlci4gKi8KK3N0YXRpYyBpbnQgbnVtX3Blcm1pdHRlZF9vcGVucyA9IDA7CisKKy8qIE51bWJlciBvZiBwZXJtaXR0ZWQgaG9zdC9wb3J0IHBhaXIgaW4gdGhlIGFycmF5IHBlcm1pdHRlZCBieSB0aGUgYWRtaW4uICovCitzdGF0aWMgaW50IG51bV9hZG1fcGVybWl0dGVkX29wZW5zID0gMDsKKworLyogc3BlY2lhbC1jYXNlIHBvcnQgbnVtYmVyIG1lYW5pbmcgYWxsb3cgYW55IHBvcnQgKi8KKyNkZWZpbmUgRldEX1BFUk1JVF9BTllfUE9SVAkwCisKKy8qCisgKiBJZiB0aGlzIGlzIHRydWUsIGFsbCBvcGVucyBhcmUgcGVybWl0dGVkLiAgVGhpcyBpcyB0aGUgY2FzZSBvbiB0aGUgc2VydmVyCisgKiBvbiB3aGljaCB3ZSBoYXZlIHRvIHRydXN0IHRoZSBjbGllbnQgYW55d2F5LCBhbmQgdGhlIHVzZXIgY291bGQgZG8KKyAqIGFueXRoaW5nIGFmdGVyIGxvZ2dpbmcgaW4gYW55d2F5LgorICovCitzdGF0aWMgaW50IGFsbF9vcGVuc19wZXJtaXR0ZWQgPSAwOworCisKKy8qIC0tIFgxMSBmb3J3YXJkaW5nICovCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGZha2UgWDExIGRpc3BsYXlzIHRvIHRyeS4gKi8KKyNkZWZpbmUgTUFYX0RJU1BMQVlTICAxMDAwCisKKy8qIFNhdmVkIFgxMSBsb2NhbCAoY2xpZW50KSBkaXNwbGF5LiAqLworc3RhdGljIGNoYXIgKngxMV9zYXZlZF9kaXNwbGF5ID0gTlVMTDsKKworLyogU2F2ZWQgWDExIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sIG5hbWUuICovCitzdGF0aWMgY2hhciAqeDExX3NhdmVkX3Byb3RvID0gTlVMTDsKKworLyogU2F2ZWQgWDExIGF1dGhlbnRpY2F0aW9uIGRhdGEuICBUaGlzIGlzIHRoZSByZWFsIGRhdGEuICovCitzdGF0aWMgY2hhciAqeDExX3NhdmVkX2RhdGEgPSBOVUxMOworc3RhdGljIHVfaW50IHgxMV9zYXZlZF9kYXRhX2xlbiA9IDA7CisKKy8qCisgKiBGYWtlIFgxMSBhdXRoZW50aWNhdGlvbiBkYXRhLiAgVGhpcyBpcyB3aGF0IHRoZSBzZXJ2ZXIgd2lsbCBiZSBzZW5kaW5nIHVzOworICogd2Ugc2hvdWxkIHJlcGxhY2UgYW55IG9jY3VycmVuY2VzIG9mIHRoaXMgYnkgdGhlIHJlYWwgZGF0YS4KKyAqLworc3RhdGljIHVfY2hhciAqeDExX2Zha2VfZGF0YSA9IE5VTEw7CitzdGF0aWMgdV9pbnQgeDExX2Zha2VfZGF0YV9sZW47CisKKworLyogLS0gYWdlbnQgZm9yd2FyZGluZyAqLworCisjZGVmaW5lCU5VTV9TT0NLUwkxMAorCisvKiBBRl9VTlNQRUMgb3IgQUZfSU5FVCBvciBBRl9JTkVUNiAqLworc3RhdGljIGludCBJUHY0b3I2ID0gQUZfVU5TUEVDOworCisvKiBoZWxwZXIgKi8KK3N0YXRpYyB2b2lkIHBvcnRfb3Blbl9oZWxwZXIoQ2hhbm5lbCAqYywgY2hhciAqcnR5cGUpOworCisvKiBub24tYmxvY2tpbmcgY29ubmVjdCBoZWxwZXJzICovCitzdGF0aWMgaW50IGNvbm5lY3RfbmV4dChzdHJ1Y3QgY2hhbm5lbF9jb25uZWN0ICopOworc3RhdGljIHZvaWQgY2hhbm5lbF9jb25uZWN0X2N0eF9mcmVlKHN0cnVjdCBjaGFubmVsX2Nvbm5lY3QgKik7CisKKy8qIC0tIGNoYW5uZWwgY29yZSAqLworCitDaGFubmVsICoKK2NoYW5uZWxfYnlfaWQoaW50IGlkKQoreworCUNoYW5uZWwgKmM7CisKKwlpZiAoaWQgPCAwIHx8ICh1X2ludClpZCA+PSBjaGFubmVsc19hbGxvYykgeworCQlsb2dpdCgiY2hhbm5lbF9ieV9pZDogJWQ6IGJhZCBpZCIsIGlkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWMgPSBjaGFubmVsc1tpZF07CisJaWYgKGMgPT0gTlVMTCkgeworCQlsb2dpdCgiY2hhbm5lbF9ieV9pZDogJWQ6IGJhZCBpZDogY2hhbm5lbCBmcmVlIiwgaWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGM7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBjaGFubmVsIGlmIGl0IGlzIGFsbG93ZWQgdG8gcmVjZWl2ZSBwcm90b2NvbCBtZXNzYWdlcy4KKyAqIFByaXZhdGUgY2hhbm5lbHMsIGxpa2UgbGlzdGVuaW5nIHNvY2tldHMsIG1heSBub3QgcmVjZWl2ZSBtZXNzYWdlcy4KKyAqLworQ2hhbm5lbCAqCitjaGFubmVsX2xvb2t1cChpbnQgaWQpCit7CisJQ2hhbm5lbCAqYzsKKworCWlmICgoYyA9IGNoYW5uZWxfYnlfaWQoaWQpKSA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJc3dpdGNoIChjLT50eXBlKSB7CisJY2FzZSBTU0hfQ0hBTk5FTF9YMTFfT1BFTjoKKwljYXNlIFNTSF9DSEFOTkVMX0xBUlZBTDoKKwljYXNlIFNTSF9DSEFOTkVMX0NPTk5FQ1RJTkc6CisJY2FzZSBTU0hfQ0hBTk5FTF9EWU5BTUlDOgorCWNhc2UgU1NIX0NIQU5ORUxfT1BFTklORzoKKwljYXNlIFNTSF9DSEFOTkVMX09QRU46CisJY2FzZSBTU0hfQ0hBTk5FTF9JTlBVVF9EUkFJTklORzoKKwljYXNlIFNTSF9DSEFOTkVMX09VVFBVVF9EUkFJTklORzoKKwkJcmV0dXJuIChjKTsKKwl9CisJbG9naXQoIk5vbi1wdWJsaWMgY2hhbm5lbCAlZCwgdHlwZSAlZC4iLCBpZCwgYy0+dHlwZSk7CisJcmV0dXJuIChOVUxMKTsKK30KKworLyoKKyAqIFJlZ2lzdGVyIGZpbGVkZXNjcmlwdG9ycyBmb3IgYSBjaGFubmVsLCB1c2VkIHdoZW4gYWxsb2NhdGluZyBhIGNoYW5uZWwgb3IKKyAqIHdoZW4gdGhlIGNoYW5uZWwgY29uc3VtZXIvcHJvZHVjZXIgaXMgcmVhZHksIGUuZy4gc2hlbGwgZXhlYydkCisgKi8KK3N0YXRpYyB2b2lkCitjaGFubmVsX3JlZ2lzdGVyX2ZkcyhDaGFubmVsICpjLCBpbnQgcmZkLCBpbnQgd2ZkLCBpbnQgZWZkLAorICAgIGludCBleHR1c2FnZSwgaW50IG5vbmJsb2NrLCBpbnQgaXNfdHR5KQoreworCS8qIFVwZGF0ZSB0aGUgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3IgdmFsdWUuICovCisJY2hhbm5lbF9tYXhfZmQgPSBNQVgoY2hhbm5lbF9tYXhfZmQsIHJmZCk7CisJY2hhbm5lbF9tYXhfZmQgPSBNQVgoY2hhbm5lbF9tYXhfZmQsIHdmZCk7CisJY2hhbm5lbF9tYXhfZmQgPSBNQVgoY2hhbm5lbF9tYXhfZmQsIGVmZCk7CisKKwlpZiAocmZkICE9IC0xKQorCQlmY250bChyZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpOworCWlmICh3ZmQgIT0gLTEgJiYgd2ZkICE9IHJmZCkKKwkJZmNudGwod2ZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKwlpZiAoZWZkICE9IC0xICYmIGVmZCAhPSByZmQgJiYgZWZkICE9IHdmZCkKKwkJZmNudGwoZWZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKworCWMtPnJmZCA9IHJmZDsKKwljLT53ZmQgPSB3ZmQ7CisJYy0+c29jayA9IChyZmQgPT0gd2ZkKSA/IHJmZCA6IC0xOworCWMtPmVmZCA9IGVmZDsKKwljLT5leHRlbmRlZF91c2FnZSA9IGV4dHVzYWdlOworCisJaWYgKChjLT5pc2F0dHkgPSBpc190dHkpICE9IDApCisJCWRlYnVnMigiY2hhbm5lbCAlZDogcmZkICVkIGlzYXR0eSIsIGMtPnNlbGYsIGMtPnJmZCk7CisJYy0+d2ZkX2lzYXR0eSA9IGlzX3R0eSB8fCBpc2F0dHkoYy0+d2ZkKTsKKworCS8qIGVuYWJsZSBub25ibG9ja2luZyBtb2RlICovCisJaWYgKG5vbmJsb2NrKSB7CisJCWlmIChyZmQgIT0gLTEpCisJCQlzZXRfbm9uYmxvY2socmZkKTsKKwkJaWYgKHdmZCAhPSAtMSkKKwkJCXNldF9ub25ibG9jayh3ZmQpOworCQlpZiAoZWZkICE9IC0xKQorCQkJc2V0X25vbmJsb2NrKGVmZCk7CisJfQorfQorCisvKgorICogQWxsb2NhdGUgYSBuZXcgY2hhbm5lbCBvYmplY3QgYW5kIHNldCBpdHMgdHlwZSBhbmQgc29ja2V0LiBUaGlzIHdpbGwgY2F1c2UKKyAqIHJlbW90ZV9uYW1lIHRvIGJlIGZyZWVkLgorICovCitDaGFubmVsICoKK2NoYW5uZWxfbmV3KGNoYXIgKmN0eXBlLCBpbnQgdHlwZSwgaW50IHJmZCwgaW50IHdmZCwgaW50IGVmZCwKKyAgICB1X2ludCB3aW5kb3csIHVfaW50IG1heHBhY2ssIGludCBleHR1c2FnZSwgY2hhciAqcmVtb3RlX25hbWUsIGludCBub25ibG9jaykKK3sKKwlpbnQgZm91bmQ7CisJdV9pbnQgaTsKKwlDaGFubmVsICpjOworCisJLyogRG8gaW5pdGlhbCBhbGxvY2F0aW9uIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwuICovCisJaWYgKGNoYW5uZWxzX2FsbG9jID09IDApIHsKKwkJY2hhbm5lbHNfYWxsb2MgPSAxMDsKKwkJY2hhbm5lbHMgPSB4Y2FsbG9jKGNoYW5uZWxzX2FsbG9jLCBzaXplb2YoQ2hhbm5lbCAqKSk7CisJCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsc19hbGxvYzsgaSsrKQorCQkJY2hhbm5lbHNbaV0gPSBOVUxMOworCX0KKwkvKiBUcnkgdG8gZmluZCBhIGZyZWUgc2xvdCB3aGVyZSB0byBwdXQgdGhlIG5ldyBjaGFubmVsLiAqLworCWZvciAoZm91bmQgPSAtMSwgaSA9IDA7IGkgPCBjaGFubmVsc19hbGxvYzsgaSsrKQorCQlpZiAoY2hhbm5lbHNbaV0gPT0gTlVMTCkgeworCQkJLyogRm91bmQgYSBmcmVlIHNsb3QuICovCisJCQlmb3VuZCA9IChpbnQpaTsKKwkJCWJyZWFrOworCQl9CisJaWYgKGZvdW5kIDwgMCkgeworCQkvKiBUaGVyZSBhcmUgbm8gZnJlZSBzbG90cy4gIFRha2UgbGFzdCsxIHNsb3QgYW5kIGV4cGFuZCB0aGUgYXJyYXkuICAqLworCQlmb3VuZCA9IGNoYW5uZWxzX2FsbG9jOworCQlpZiAoY2hhbm5lbHNfYWxsb2MgPiAxMDAwMCkKKwkJCWZhdGFsKCJjaGFubmVsX25ldzogaW50ZXJuYWwgZXJyb3I6IGNoYW5uZWxzX2FsbG9jICVkICIKKwkJCSAgICAidG9vIGJpZy4iLCBjaGFubmVsc19hbGxvYyk7CisJCWNoYW5uZWxzID0geHJlYWxsb2MoY2hhbm5lbHMsIGNoYW5uZWxzX2FsbG9jICsgMTAsCisJCSAgICBzaXplb2YoQ2hhbm5lbCAqKSk7CisJCWNoYW5uZWxzX2FsbG9jICs9IDEwOworCQlkZWJ1ZzIoImNoYW5uZWw6IGV4cGFuZGluZyAlZCIsIGNoYW5uZWxzX2FsbG9jKTsKKwkJZm9yIChpID0gZm91bmQ7IGkgPCBjaGFubmVsc19hbGxvYzsgaSsrKQorCQkJY2hhbm5lbHNbaV0gPSBOVUxMOworCX0KKwkvKiBJbml0aWFsaXplIGFuZCByZXR1cm4gbmV3IGNoYW5uZWwuICovCisJYyA9IGNoYW5uZWxzW2ZvdW5kXSA9IHhjYWxsb2MoMSwgc2l6ZW9mKENoYW5uZWwpKTsKKwlidWZmZXJfaW5pdCgmYy0+aW5wdXQpOworCWJ1ZmZlcl9pbml0KCZjLT5vdXRwdXQpOworCWJ1ZmZlcl9pbml0KCZjLT5leHRlbmRlZCk7CisJYy0+cGF0aCA9IE5VTEw7CisJYy0+bGlzdGVuaW5nX2FkZHIgPSBOVUxMOworCWMtPmxpc3RlbmluZ19wb3J0ID0gMDsKKwljLT5vc3RhdGUgPSBDSEFOX09VVFBVVF9PUEVOOworCWMtPmlzdGF0ZSA9IENIQU5fSU5QVVRfT1BFTjsKKwljLT5mbGFncyA9IDA7CisJY2hhbm5lbF9yZWdpc3Rlcl9mZHMoYywgcmZkLCB3ZmQsIGVmZCwgZXh0dXNhZ2UsIG5vbmJsb2NrLCAwKTsKKwljLT5zZWxmID0gZm91bmQ7CisJYy0+dHlwZSA9IHR5cGU7CisJYy0+Y3R5cGUgPSBjdHlwZTsKKwljLT5sb2NhbF93aW5kb3cgPSB3aW5kb3c7CisJYy0+bG9jYWxfd2luZG93X21heCA9IHdpbmRvdzsKKwljLT5sb2NhbF9jb25zdW1lZCA9IDA7CisJYy0+bG9jYWxfbWF4cGFja2V0ID0gbWF4cGFjazsKKwljLT5yZW1vdGVfaWQgPSAtMTsKKwljLT5yZW1vdGVfbmFtZSA9IHhzdHJkdXAocmVtb3RlX25hbWUpOworCWMtPnJlbW90ZV93aW5kb3cgPSAwOworCWMtPnJlbW90ZV9tYXhwYWNrZXQgPSAwOworCWMtPmZvcmNlX2RyYWluID0gMDsKKwljLT5zaW5nbGVfY29ubmVjdGlvbiA9IDA7CisJYy0+ZGV0YWNoX3VzZXIgPSBOVUxMOworCWMtPmRldGFjaF9jbG9zZSA9IDA7CisJYy0+b3Blbl9jb25maXJtID0gTlVMTDsKKwljLT5vcGVuX2NvbmZpcm1fY3R4ID0gTlVMTDsKKwljLT5pbnB1dF9maWx0ZXIgPSBOVUxMOworCWMtPm91dHB1dF9maWx0ZXIgPSBOVUxMOworCWMtPmZpbHRlcl9jdHggPSBOVUxMOworCWMtPmZpbHRlcl9jbGVhbnVwID0gTlVMTDsKKwljLT5jdGxfY2hhbiA9IC0xOworCWMtPm11eF9yY2IgPSBOVUxMOworCWMtPm11eF9jdHggPSBOVUxMOworCWMtPm11eF9wYXVzZSA9IDA7CisJYy0+ZGVsYXllZCA9IDE7CQkvKiBwcmV2ZW50IGNhbGwgdG8gY2hhbm5lbF9wb3N0IGhhbmRsZXIgKi8KKwlUQUlMUV9JTklUKCZjLT5zdGF0dXNfY29uZmlybXMpOworCWRlYnVnKCJjaGFubmVsICVkOiBuZXcgWyVzXSIsIGZvdW5kLCByZW1vdGVfbmFtZSk7CisJcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBpbnQKK2NoYW5uZWxfZmluZF9tYXhmZCh2b2lkKQoreworCXVfaW50IGk7CisJaW50IG1heCA9IDA7CisJQ2hhbm5lbCAqYzsKKworCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsc19hbGxvYzsgaSsrKSB7CisJCWMgPSBjaGFubmVsc1tpXTsKKwkJaWYgKGMgIT0gTlVMTCkgeworCQkJbWF4ID0gTUFYKG1heCwgYy0+cmZkKTsKKwkJCW1heCA9IE1BWChtYXgsIGMtPndmZCk7CisJCQltYXggPSBNQVgobWF4LCBjLT5lZmQpOworCQl9CisJfQorCXJldHVybiBtYXg7Cit9CisKK2ludAorY2hhbm5lbF9jbG9zZV9mZChpbnQgKmZkcCkKK3sKKwlpbnQgcmV0ID0gMCwgZmQgPSAqZmRwOworCisJaWYgKGZkICE9IC0xKSB7CisJCXJldCA9IGNsb3NlKGZkKTsKKwkJKmZkcCA9IC0xOworCQlpZiAoZmQgPT0gY2hhbm5lbF9tYXhfZmQpCisJCQljaGFubmVsX21heF9mZCA9IGNoYW5uZWxfZmluZF9tYXhmZCgpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBDbG9zZSBhbGwgY2hhbm5lbCBmZC9zb2NrZXQuICovCitzdGF0aWMgdm9pZAorY2hhbm5lbF9jbG9zZV9mZHMoQ2hhbm5lbCAqYykKK3sKKwljaGFubmVsX2Nsb3NlX2ZkKCZjLT5zb2NrKTsKKwljaGFubmVsX2Nsb3NlX2ZkKCZjLT5yZmQpOworCWNoYW5uZWxfY2xvc2VfZmQoJmMtPndmZCk7CisJY2hhbm5lbF9jbG9zZV9mZCgmYy0+ZWZkKTsKK30KKworLyogRnJlZSB0aGUgY2hhbm5lbCBhbmQgY2xvc2UgaXRzIGZkL3NvY2tldC4gKi8KK3ZvaWQKK2NoYW5uZWxfZnJlZShDaGFubmVsICpjKQoreworCWNoYXIgKnM7CisJdV9pbnQgaSwgbjsKKwlzdHJ1Y3QgY2hhbm5lbF9jb25maXJtICpjYzsKKworCWZvciAobiA9IDAsIGkgPSAwOyBpIDwgY2hhbm5lbHNfYWxsb2M7IGkrKykKKwkJaWYgKGNoYW5uZWxzW2ldKQorCQkJbisrOworCWRlYnVnKCJjaGFubmVsICVkOiBmcmVlOiAlcywgbmNoYW5uZWxzICV1IiwgYy0+c2VsZiwKKwkgICAgYy0+cmVtb3RlX25hbWUgPyBjLT5yZW1vdGVfbmFtZSA6ICI/Pz8iLCBuKTsKKworCXMgPSBjaGFubmVsX29wZW5fbWVzc2FnZSgpOworCWRlYnVnMygiY2hhbm5lbCAlZDogc3RhdHVzOiAlcyIsIGMtPnNlbGYsIHMpOworCXhmcmVlKHMpOworCisJaWYgKGMtPnNvY2sgIT0gLTEpCisJCXNodXRkb3duKGMtPnNvY2ssIFNIVVRfUkRXUik7CisJY2hhbm5lbF9jbG9zZV9mZHMoYyk7CisJYnVmZmVyX2ZyZWUoJmMtPmlucHV0KTsKKwlidWZmZXJfZnJlZSgmYy0+b3V0cHV0KTsKKwlidWZmZXJfZnJlZSgmYy0+ZXh0ZW5kZWQpOworCWlmIChjLT5yZW1vdGVfbmFtZSkgeworCQl4ZnJlZShjLT5yZW1vdGVfbmFtZSk7CisJCWMtPnJlbW90ZV9uYW1lID0gTlVMTDsKKwl9CisJaWYgKGMtPnBhdGgpIHsKKwkJeGZyZWUoYy0+cGF0aCk7CisJCWMtPnBhdGggPSBOVUxMOworCX0KKwlpZiAoYy0+bGlzdGVuaW5nX2FkZHIpIHsKKwkJeGZyZWUoYy0+bGlzdGVuaW5nX2FkZHIpOworCQljLT5saXN0ZW5pbmdfYWRkciA9IE5VTEw7CisJfQorCXdoaWxlICgoY2MgPSBUQUlMUV9GSVJTVCgmYy0+c3RhdHVzX2NvbmZpcm1zKSkgIT0gTlVMTCkgeworCQlpZiAoY2MtPmFiYW5kb25fY2IgIT0gTlVMTCkKKwkJCWNjLT5hYmFuZG9uX2NiKGMsIGNjLT5jdHgpOworCQlUQUlMUV9SRU1PVkUoJmMtPnN0YXR1c19jb25maXJtcywgY2MsIGVudHJ5KTsKKwkJYnplcm8oY2MsIHNpemVvZigqY2MpKTsKKwkJeGZyZWUoY2MpOworCX0KKwlpZiAoYy0+ZmlsdGVyX2NsZWFudXAgIT0gTlVMTCAmJiBjLT5maWx0ZXJfY3R4ICE9IE5VTEwpCisJCWMtPmZpbHRlcl9jbGVhbnVwKGMtPnNlbGYsIGMtPmZpbHRlcl9jdHgpOworCWNoYW5uZWxzW2MtPnNlbGZdID0gTlVMTDsKKwl4ZnJlZShjKTsKK30KKwordm9pZAorY2hhbm5lbF9mcmVlX2FsbCh2b2lkKQoreworCXVfaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHNfYWxsb2M7IGkrKykKKwkJaWYgKGNoYW5uZWxzW2ldICE9IE5VTEwpCisJCQljaGFubmVsX2ZyZWUoY2hhbm5lbHNbaV0pOworfQorCisvKgorICogQ2xvc2VzIHRoZSBzb2NrZXRzL2ZkcyBvZiBhbGwgY2hhbm5lbHMuICBUaGlzIGlzIHVzZWQgdG8gY2xvc2UgZXh0cmEgZmlsZQorICogZGVzY3JpcHRvcnMgYWZ0ZXIgYSBmb3JrLgorICovCit2b2lkCitjaGFubmVsX2Nsb3NlX2FsbCh2b2lkKQoreworCXVfaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHNfYWxsb2M7IGkrKykKKwkJaWYgKGNoYW5uZWxzW2ldICE9IE5VTEwpCisJCQljaGFubmVsX2Nsb3NlX2ZkcyhjaGFubmVsc1tpXSk7Cit9CisKKy8qCisgKiBTdG9wIGxpc3RlbmluZyB0byBjaGFubmVscy4KKyAqLwordm9pZAorY2hhbm5lbF9zdG9wX2xpc3RlbmluZyh2b2lkKQoreworCXVfaW50IGk7CisJQ2hhbm5lbCAqYzsKKworCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsc19hbGxvYzsgaSsrKSB7CisJCWMgPSBjaGFubmVsc1tpXTsKKwkJaWYgKGMgIT0gTlVMTCkgeworCQkJc3dpdGNoIChjLT50eXBlKSB7CisJCQljYXNlIFNTSF9DSEFOTkVMX0FVVEhfU09DS0VUOgorCQkJY2FzZSBTU0hfQ0hBTk5FTF9QT1JUX0xJU1RFTkVSOgorCQkJY2FzZSBTU0hfQ0hBTk5FTF9SUE9SVF9MSVNURU5FUjoKKwkJCWNhc2UgU1NIX0NIQU5ORUxfWDExX0xJU1RFTkVSOgorCQkJCWNoYW5uZWxfY2xvc2VfZmQoJmMtPnNvY2spOworCQkJCWNoYW5uZWxfZnJlZShjKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKworLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiBubyBjaGFubmVsIGhhcyB0b28gbXVjaCBidWZmZXJlZCBkYXRhLCBhbmQgZmFsc2UgaWYgb25lIG9yCisgKiBtb3JlIGNoYW5uZWwgaXMgb3ZlcmZ1bGwuCisgKi8KK2ludAorY2hhbm5lbF9ub3RfdmVyeV9tdWNoX2J1ZmZlcmVkX2RhdGEodm9pZCkKK3sKKwl1X2ludCBpOworCUNoYW5uZWwgKmM7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHNfYWxsb2M7IGkrKykgeworCQljID0gY2hhbm5lbHNbaV07CisJCWlmIChjICE9IE5VTEwgJiYgYy0+dHlwZSA9PSBTU0hfQ0hBTk5FTF9PUEVOKSB7CisjaWYgMAorCQkJaWYgKCFjb21wYXQyMCAmJgorCQkJICAgIGJ1ZmZlcl9sZW4oJmMtPmlucHV0KSA+IHBhY2tldF9nZXRfbWF4c2l6ZSgpKSB7CisJCQkJZGVidWcyKCJjaGFubmVsICVkOiBiaWcgaW5wdXQgYnVmZmVyICVkIiwKKwkJCQkgICAgYy0+c2VsZiwgYnVmZmVyX2xlbigmYy0+aW5wdXQpKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKGJ1ZmZlcl9sZW4oJmMtPm91dHB1dCkgPiBwYWNrZXRfZ2V0X21heHNpemUoKSkgeworCQkJCWRlYnVnMigiY2hhbm5lbCAlZDogYmlnIG91dHB1dCBidWZmZXIgJXUgPiAldSIsCisJCQkJICAgIGMtPnNlbGYsIGJ1ZmZlcl9sZW4oJmMtPm91dHB1dCksCisJCQkJICAgIHBhY2tldF9nZXRfbWF4c2l6ZSgpKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworLyogUmV0dXJucyB0cnVlIGlmIGFueSBjaGFubmVsIGlzIHN0aWxsIG9wZW4uICovCitpbnQKK2NoYW5uZWxfc3RpbGxfb3Blbih2b2lkKQoreworCXVfaW50IGk7CisJQ2hhbm5lbCAqYzsKKworCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsc19hbGxvYzsgaSsrKSB7CisJCWMgPSBjaGFubmVsc1tpXTsKKwkJaWYgKGMgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlzd2l0Y2ggKGMtPnR5cGUpIHsKKwkJY2FzZSBTU0hfQ0hBTk5FTF9YMTFfTElTVEVORVI6CisJCWNhc2UgU1NIX0NIQU5ORUxfUE9SVF9MSVNURU5FUjoKKwkJY2FzZSBTU0hfQ0hBTk5FTF9SUE9SVF9MSVNURU5FUjoKKwkJY2FzZSBTU0hfQ0hBTk5FTF9NVVhfTElTVEVORVI6CisJCWNhc2UgU1NIX0NIQU5ORUxfQ0xPU0VEOgorCQljYXNlIFNTSF9DSEFOTkVMX0FVVEhfU09DS0VUOgorCQljYXNlIFNTSF9DSEFOTkVMX0RZTkFNSUM6CisJCWNhc2UgU1NIX0NIQU5ORUxfQ09OTkVDVElORzoKKwkJY2FzZSBTU0hfQ0hBTk5FTF9aT01CSUU6CisJCQljb250aW51ZTsKKwkJY2FzZSBTU0hfQ0hBTk5FTF9MQVJWQUw6CisJCQlpZiAoIWNvbXBhdDIwKQorCQkJCWZhdGFsKCJjYW5ub3QgaGFwcGVuOiBTU0hfQ0hBTk5FTF9MQVJWQUwiKTsKKwkJCWNvbnRpbnVlOworCQljYXNlIFNTSF9DSEFOTkVMX09QRU5JTkc6CisJCWNhc2UgU1NIX0NIQU5ORUxfT1BFTjoKKwkJY2FzZSBTU0hfQ0hBTk5FTF9YMTFfT1BFTjoKKwkJY2FzZSBTU0hfQ0hBTk5FTF9NVVhfQ0xJRU5UOgorCQkJcmV0dXJuIDE7CisJCWNhc2UgU1NIX0NIQU5ORUxfSU5QVVRfRFJBSU5JTkc6CisJCWNhc2UgU1NIX0NIQU5ORUxfT1VUUFVUX0RSQUlOSU5HOgorCQkJaWYgKCFjb21wYXQxMykKKwkJCQlmYXRhbCgiY2Fubm90IGhhcHBlbjogT1VUX0RSQUlOIik7CisJCQlyZXR1cm4gMTsKKwkJZGVmYXVsdDoKKwkJCWZhdGFsKCJjaGFubmVsX3N0aWxsX29wZW46IGJhZCBjaGFubmVsIHR5cGUgJWQiLCBjLT50eXBlKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJucyB0aGUgaWQgb2YgYW4gb3BlbiBjaGFubmVsIHN1aXRhYmxlIGZvciBrZWVwYWxpdmluZyAqLworaW50CitjaGFubmVsX2ZpbmRfb3Blbih2b2lkKQoreworCXVfaW50IGk7CisJQ2hhbm5lbCAqYzsKKworCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsc19hbGxvYzsgaSsrKSB7CisJCWMgPSBjaGFubmVsc1tpXTsKKwkJaWYgKGMgPT0gTlVMTCB8fCBjLT5yZW1vdGVfaWQgPCAwKQorCQkJY29udGludWU7CisJCXN3aXRjaCAoYy0+dHlwZSkgeworCQljYXNlIFNTSF9DSEFOTkVMX0NMT1NFRDoKKwkJY2FzZSBTU0hfQ0hBTk5FTF9EWU5BTUlDOgorCQljYXNlIFNTSF9DSEFOTkVMX1gxMV9MSVNURU5FUjoKKwkJY2FzZSBTU0hfQ0hBTk5FTF9QT1JUX0xJU1RFTkVSOgorCQljYXNlIFNTSF9DSEFOTkVMX1JQT1JUX0xJU1RFTkVSOgorCQljYXNlIFNTSF9DSEFOTkVMX01VWF9MSVNURU5FUjoKKwkJY2FzZSBTU0hfQ0hBTk5FTF9NVVhfQ0xJRU5UOgorCQljYXNlIFNTSF9DSEFOTkVMX09QRU5JTkc6CisJCWNhc2UgU1NIX0NIQU5ORUxfQ09OTkVDVElORzoKKwkJY2FzZSBTU0hfQ0hBTk5FTF9aT01CSUU6CisJCQljb250aW51ZTsKKwkJY2FzZSBTU0hfQ0hBTk5FTF9MQVJWQUw6CisJCWNhc2UgU1NIX0NIQU5ORUxfQVVUSF9TT0NLRVQ6CisJCWNhc2UgU1NIX0NIQU5ORUxfT1BFTjoKKwkJY2FzZSBTU0hfQ0hBTk5FTF9YMTFfT1BFTjoKKwkJCXJldHVybiBpOworCQljYXNlIFNTSF9DSEFOTkVMX0lOUFVUX0RSQUlOSU5HOgorCQljYXNlIFNTSF9DSEFOTkVMX09VVFBVVF9EUkFJTklORzoKKwkJCWlmICghY29tcGF0MTMpCisJCQkJZmF0YWwoImNhbm5vdCBoYXBwZW46IE9VVF9EUkFJTiIpOworCQkJcmV0dXJuIGk7CisJCWRlZmF1bHQ6CisJCQlmYXRhbCgiY2hhbm5lbF9maW5kX29wZW46IGJhZCBjaGFubmVsIHR5cGUgJWQiLCBjLT50eXBlKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKKworLyoKKyAqIFJldHVybnMgYSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGN1cnJlbnRseSBvcGVuIGZvcndhcmRlZCBjb25uZWN0aW9ucywKKyAqIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIHRoZSBjbGllbnQuICBUaGUgbWVzc2FnZSBjb250YWlucyBjcmxmIHBhaXJzIGZvcgorICogbmV3bGluZXMuCisgKi8KK2NoYXIgKgorY2hhbm5lbF9vcGVuX21lc3NhZ2Uodm9pZCkKK3sKKwlCdWZmZXIgYnVmZmVyOworCUNoYW5uZWwgKmM7CisJY2hhciBidWZbMTAyNF0sICpjcDsKKwl1X2ludCBpOworCisJYnVmZmVyX2luaXQoJmJ1ZmZlcik7CisJc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiVGhlIGZvbGxvd2luZyBjb25uZWN0aW9ucyBhcmUgb3BlbjpcclxuIik7CisJYnVmZmVyX2FwcGVuZCgmYnVmZmVyLCBidWYsIHN0cmxlbihidWYpKTsKKwlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHNfYWxsb2M7IGkrKykgeworCQljID0gY2hhbm5lbHNbaV07CisJCWlmIChjID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJc3dpdGNoIChjLT50eXBlKSB7CisJCWNhc2UgU1NIX0NIQU5ORUxfWDExX0xJU1RFTkVSOgorCQljYXNlIFNTSF9DSEFOTkVMX1BPUlRfTElTVEVORVI6CisJCWNhc2UgU1NIX0NIQU5ORUxfUlBPUlRfTElTVEVORVI6CisJCWNhc2UgU1NIX0NIQU5ORUxfQ0xPU0VEOgorCQljYXNlIFNTSF9DSEFOTkVMX0FVVEhfU09DS0VUOgorCQljYXNlIFNTSF9DSEFOTkVMX1pPTUJJRToKKwkJY2FzZSBTU0hfQ0hBTk5FTF9NVVhfQ0xJRU5UOgorCQljYXNlIFNTSF9DSEFOTkVMX01VWF9MSVNURU5FUjoKKwkJCWNvbnRpbnVlOworCQljYXNlIFNTSF9DSEFOTkVMX0xBUlZBTDoKKwkJY2FzZSBTU0hfQ0hBTk5FTF9PUEVOSU5HOgorCQljYXNlIFNTSF9DSEFOTkVMX0NPTk5FQ1RJTkc6CisJCWNhc2UgU1NIX0NIQU5ORUxfRFlOQU1JQzoKKwkJY2FzZSBTU0hfQ0hBTk5FTF9PUEVOOgorCQljYXNlIFNTSF9DSEFOTkVMX1gxMV9PUEVOOgorCQljYXNlIFNTSF9DSEFOTkVMX0lOUFVUX0RSQUlOSU5HOgorCQljYXNlIFNTSF9DSEFOTkVMX09VVFBVVF9EUkFJTklORzoKKwkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwKKwkJCSAgICAiICAjJWQgJS4zMDBzICh0JWQgciVkIGklZC8lZCBvJWQvJWQgZmQgJWQvJWQgY2MgJWQpXHJcbiIsCisJCQkgICAgYy0+c2VsZiwgYy0+cmVtb3RlX25hbWUsCisJCQkgICAgYy0+dHlwZSwgYy0+cmVtb3RlX2lkLAorCQkJICAgIGMtPmlzdGF0ZSwgYnVmZmVyX2xlbigmYy0+aW5wdXQpLAorCQkJICAgIGMtPm9zdGF0ZSwgYnVmZmVyX2xlbigmYy0+b3V0cHV0KSwKKwkJCSAgICBjLT5yZmQsIGMtPndmZCwgYy0+Y3RsX2NoYW4pOworCQkJYnVmZmVyX2FwcGVuZCgmYnVmZmVyLCBidWYsIHN0cmxlbihidWYpKTsKKwkJCWNvbnRpbnVlOworCQlkZWZhdWx0OgorCQkJZmF0YWwoImNoYW5uZWxfb3Blbl9tZXNzYWdlOiBiYWQgY2hhbm5lbCB0eXBlICVkIiwgYy0+dHlwZSk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwl9CisJYnVmZmVyX2FwcGVuZCgmYnVmZmVyLCAiXDAiLCAxKTsKKwljcCA9IHhzdHJkdXAoYnVmZmVyX3B0cigmYnVmZmVyKSk7CisJYnVmZmVyX2ZyZWUoJmJ1ZmZlcik7CisJcmV0dXJuIGNwOworfQorCit2b2lkCitjaGFubmVsX3NlbmRfb3BlbihpbnQgaWQpCit7CisJQ2hhbm5lbCAqYyA9IGNoYW5uZWxfbG9va3VwKGlkKTsKKworCWlmIChjID09IE5VTEwpIHsKKwkJbG9naXQoImNoYW5uZWxfc2VuZF9vcGVuOiAlZDogYmFkIGlkIiwgaWQpOworCQlyZXR1cm47CisJfQorCWRlYnVnMigiY2hhbm5lbCAlZDogc2VuZCBvcGVuIiwgaWQpOworCXBhY2tldF9zdGFydChTU0gyX01TR19DSEFOTkVMX09QRU4pOworCXBhY2tldF9wdXRfY3N0cmluZyhjLT5jdHlwZSk7CisJcGFja2V0X3B1dF9pbnQoYy0+c2VsZik7CisJcGFja2V0X3B1dF9pbnQoYy0+bG9jYWxfd2luZG93KTsKKwlwYWNrZXRfcHV0X2ludChjLT5sb2NhbF9tYXhwYWNrZXQpOworCXBhY2tldF9zZW5kKCk7Cit9CisKK3ZvaWQKK2NoYW5uZWxfcmVxdWVzdF9zdGFydChpbnQgaWQsIGNoYXIgKnNlcnZpY2UsIGludCB3YW50Y29uZmlybSkKK3sKKwlDaGFubmVsICpjID0gY2hhbm5lbF9sb29rdXAoaWQpOworCisJaWYgKGMgPT0gTlVMTCkgeworCQlsb2dpdCgiY2hhbm5lbF9yZXF1ZXN0X3N0YXJ0OiAlZDogdW5rbm93biBjaGFubmVsIGlkIiwgaWQpOworCQlyZXR1cm47CisJfQorCWRlYnVnMigiY2hhbm5lbCAlZDogcmVxdWVzdCAlcyBjb25maXJtICVkIiwgaWQsIHNlcnZpY2UsIHdhbnRjb25maXJtKTsKKwlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfQ0hBTk5FTF9SRVFVRVNUKTsKKwlwYWNrZXRfcHV0X2ludChjLT5yZW1vdGVfaWQpOworCXBhY2tldF9wdXRfY3N0cmluZyhzZXJ2aWNlKTsKKwlwYWNrZXRfcHV0X2NoYXIod2FudGNvbmZpcm0pOworfQorCit2b2lkCitjaGFubmVsX3JlZ2lzdGVyX3N0YXR1c19jb25maXJtKGludCBpZCwgY2hhbm5lbF9jb25maXJtX2NiICpjYiwKKyAgICBjaGFubmVsX2NvbmZpcm1fYWJhbmRvbl9jYiAqYWJhbmRvbl9jYiwgdm9pZCAqY3R4KQoreworCXN0cnVjdCBjaGFubmVsX2NvbmZpcm0gKmNjOworCUNoYW5uZWwgKmM7CisKKwlpZiAoKGMgPSBjaGFubmVsX2xvb2t1cChpZCkpID09IE5VTEwpCisJCWZhdGFsKCJjaGFubmVsX3JlZ2lzdGVyX2V4cGVjdDogJWQ6IGJhZCBpZCIsIGlkKTsKKworCWNjID0geG1hbGxvYyhzaXplb2YoKmNjKSk7CisJY2MtPmNiID0gY2I7CisJY2MtPmFiYW5kb25fY2IgPSBhYmFuZG9uX2NiOworCWNjLT5jdHggPSBjdHg7CisJVEFJTFFfSU5TRVJUX1RBSUwoJmMtPnN0YXR1c19jb25maXJtcywgY2MsIGVudHJ5KTsKK30KKwordm9pZAorY2hhbm5lbF9yZWdpc3Rlcl9vcGVuX2NvbmZpcm0oaW50IGlkLCBjaGFubmVsX29wZW5fZm4gKmZuLCB2b2lkICpjdHgpCit7CisJQ2hhbm5lbCAqYyA9IGNoYW5uZWxfbG9va3VwKGlkKTsKKworCWlmIChjID09IE5VTEwpIHsKKwkJbG9naXQoImNoYW5uZWxfcmVnaXN0ZXJfb3Blbl9jb25maXJtOiAlZDogYmFkIGlkIiwgaWQpOworCQlyZXR1cm47CisJfQorCWMtPm9wZW5fY29uZmlybSA9IGZuOworCWMtPm9wZW5fY29uZmlybV9jdHggPSBjdHg7Cit9CisKK3ZvaWQKK2NoYW5uZWxfcmVnaXN0ZXJfY2xlYW51cChpbnQgaWQsIGNoYW5uZWxfY2FsbGJhY2tfZm4gKmZuLCBpbnQgZG9fY2xvc2UpCit7CisJQ2hhbm5lbCAqYyA9IGNoYW5uZWxfYnlfaWQoaWQpOworCisJaWYgKGMgPT0gTlVMTCkgeworCQlsb2dpdCgiY2hhbm5lbF9yZWdpc3Rlcl9jbGVhbnVwOiAlZDogYmFkIGlkIiwgaWQpOworCQlyZXR1cm47CisJfQorCWMtPmRldGFjaF91c2VyID0gZm47CisJYy0+ZGV0YWNoX2Nsb3NlID0gZG9fY2xvc2U7Cit9CisKK3ZvaWQKK2NoYW5uZWxfY2FuY2VsX2NsZWFudXAoaW50IGlkKQoreworCUNoYW5uZWwgKmMgPSBjaGFubmVsX2J5X2lkKGlkKTsKKworCWlmIChjID09IE5VTEwpIHsKKwkJbG9naXQoImNoYW5uZWxfY2FuY2VsX2NsZWFudXA6ICVkOiBiYWQgaWQiLCBpZCk7CisJCXJldHVybjsKKwl9CisJYy0+ZGV0YWNoX3VzZXIgPSBOVUxMOworCWMtPmRldGFjaF9jbG9zZSA9IDA7Cit9CisKK3ZvaWQKK2NoYW5uZWxfcmVnaXN0ZXJfZmlsdGVyKGludCBpZCwgY2hhbm5lbF9pbmZpbHRlcl9mbiAqaWZuLAorICAgIGNoYW5uZWxfb3V0ZmlsdGVyX2ZuICpvZm4sIGNoYW5uZWxfZmlsdGVyX2NsZWFudXBfZm4gKmNmbiwgdm9pZCAqY3R4KQoreworCUNoYW5uZWwgKmMgPSBjaGFubmVsX2xvb2t1cChpZCk7CisKKwlpZiAoYyA9PSBOVUxMKSB7CisJCWxvZ2l0KCJjaGFubmVsX3JlZ2lzdGVyX2ZpbHRlcjogJWQ6IGJhZCBpZCIsIGlkKTsKKwkJcmV0dXJuOworCX0KKwljLT5pbnB1dF9maWx0ZXIgPSBpZm47CisJYy0+b3V0cHV0X2ZpbHRlciA9IG9mbjsKKwljLT5maWx0ZXJfY3R4ID0gY3R4OworCWMtPmZpbHRlcl9jbGVhbnVwID0gY2ZuOworfQorCit2b2lkCitjaGFubmVsX3NldF9mZHMoaW50IGlkLCBpbnQgcmZkLCBpbnQgd2ZkLCBpbnQgZWZkLAorICAgIGludCBleHR1c2FnZSwgaW50IG5vbmJsb2NrLCBpbnQgaXNfdHR5LCB1X2ludCB3aW5kb3dfbWF4KQoreworCUNoYW5uZWwgKmMgPSBjaGFubmVsX2xvb2t1cChpZCk7CisKKwlpZiAoYyA9PSBOVUxMIHx8IGMtPnR5cGUgIT0gU1NIX0NIQU5ORUxfTEFSVkFMKQorCQlmYXRhbCgiY2hhbm5lbF9hY3RpdmF0ZSBmb3Igbm9uLWxhcnZhbCBjaGFubmVsICVkLiIsIGlkKTsKKwljaGFubmVsX3JlZ2lzdGVyX2ZkcyhjLCByZmQsIHdmZCwgZWZkLCBleHR1c2FnZSwgbm9uYmxvY2ssIGlzX3R0eSk7CisJYy0+dHlwZSA9IFNTSF9DSEFOTkVMX09QRU47CisJYy0+bG9jYWxfd2luZG93ID0gYy0+bG9jYWxfd2luZG93X21heCA9IHdpbmRvd19tYXg7CisJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0NIQU5ORUxfV0lORE9XX0FESlVTVCk7CisJcGFja2V0X3B1dF9pbnQoYy0+cmVtb3RlX2lkKTsKKwlwYWNrZXRfcHV0X2ludChjLT5sb2NhbF93aW5kb3cpOworCXBhY2tldF9zZW5kKCk7Cit9CisKKy8qCisgKiAnY2hhbm5lbF9wcmUqJyBhcmUgY2FsbGVkIGp1c3QgYmVmb3JlIHNlbGVjdCgpIHRvIGFkZCBhbnkgYml0cyByZWxldmFudCB0bworICogY2hhbm5lbHMgaW4gdGhlIHNlbGVjdCBiaXRtYXNrcy4KKyAqLworLyoKKyAqICdjaGFubmVsX3Bvc3QqJzogcGVyZm9ybSBhbnkgYXBwcm9wcmlhdGUgb3BlcmF0aW9ucyBmb3IgY2hhbm5lbHMgd2hpY2gKKyAqIGhhdmUgZXZlbnRzIHBlbmRpbmcuCisgKi8KK3R5cGVkZWYgdm9pZCBjaGFuX2ZuKENoYW5uZWwgKmMsIGZkX3NldCAqcmVhZHNldCwgZmRfc2V0ICp3cml0ZXNldCk7CitjaGFuX2ZuICpjaGFubmVsX3ByZVtTU0hfQ0hBTk5FTF9NQVhfVFlQRV07CitjaGFuX2ZuICpjaGFubmVsX3Bvc3RbU1NIX0NIQU5ORUxfTUFYX1RZUEVdOworCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK2NoYW5uZWxfcHJlX2xpc3RlbmVyKENoYW5uZWwgKmMsIGZkX3NldCAqcmVhZHNldCwgZmRfc2V0ICp3cml0ZXNldCkKK3sKKwlGRF9TRVQoYy0+c29jaywgcmVhZHNldCk7Cit9CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorY2hhbm5lbF9wcmVfY29ubmVjdGluZyhDaGFubmVsICpjLCBmZF9zZXQgKnJlYWRzZXQsIGZkX3NldCAqd3JpdGVzZXQpCit7CisJZGVidWczKCJjaGFubmVsICVkOiB3YWl0aW5nIGZvciBjb25uZWN0aW9uIiwgYy0+c2VsZik7CisJRkRfU0VUKGMtPnNvY2ssIHdyaXRlc2V0KTsKK30KKworc3RhdGljIHZvaWQKK2NoYW5uZWxfcHJlX29wZW5fMTMoQ2hhbm5lbCAqYywgZmRfc2V0ICpyZWFkc2V0LCBmZF9zZXQgKndyaXRlc2V0KQoreworCWlmIChidWZmZXJfbGVuKCZjLT5pbnB1dCkgPCBwYWNrZXRfZ2V0X21heHNpemUoKSkKKwkJRkRfU0VUKGMtPnNvY2ssIHJlYWRzZXQpOworCWlmIChidWZmZXJfbGVuKCZjLT5vdXRwdXQpID4gMCkKKwkJRkRfU0VUKGMtPnNvY2ssIHdyaXRlc2V0KTsKK30KKworc3RhdGljIHZvaWQKK2NoYW5uZWxfcHJlX29wZW4oQ2hhbm5lbCAqYywgZmRfc2V0ICpyZWFkc2V0LCBmZF9zZXQgKndyaXRlc2V0KQoreworCXVfaW50IGxpbWl0ID0gY29tcGF0MjAgPyBjLT5yZW1vdGVfd2luZG93IDogcGFja2V0X2dldF9tYXhzaXplKCk7CisKKwlpZiAoYy0+aXN0YXRlID09IENIQU5fSU5QVVRfT1BFTiAmJgorCSAgICBsaW1pdCA+IDAgJiYKKwkgICAgYnVmZmVyX2xlbigmYy0+aW5wdXQpIDwgbGltaXQgJiYKKwkgICAgYnVmZmVyX2NoZWNrX2FsbG9jKCZjLT5pbnB1dCwgQ0hBTl9SQlVGKSkKKwkJRkRfU0VUKGMtPnJmZCwgcmVhZHNldCk7CisJaWYgKGMtPm9zdGF0ZSA9PSBDSEFOX09VVFBVVF9PUEVOIHx8CisJICAgIGMtPm9zdGF0ZSA9PSBDSEFOX09VVFBVVF9XQUlUX0RSQUlOKSB7CisJCWlmIChidWZmZXJfbGVuKCZjLT5vdXRwdXQpID4gMCkgeworCQkJRkRfU0VUKGMtPndmZCwgd3JpdGVzZXQpOworCQl9IGVsc2UgaWYgKGMtPm9zdGF0ZSA9PSBDSEFOX09VVFBVVF9XQUlUX0RSQUlOKSB7CisJCQlpZiAoQ0hBTk5FTF9FRkRfT1VUUFVUX0FDVElWRShjKSkKKwkJCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IG9idWZfZW1wdHkgZGVsYXllZCBlZmQgJWQvKCVkKSIsCisJCQkJICAgIGMtPnNlbGYsIGMtPmVmZCwgYnVmZmVyX2xlbigmYy0+ZXh0ZW5kZWQpKTsKKwkJCWVsc2UKKwkJCQljaGFuX29idWZfZW1wdHkoYyk7CisJCX0KKwl9CisJLyoqIFhYWCBjaGVjayBjbG9zZSBjb25kaXRpb25zLCB0b28gKi8KKwlpZiAoY29tcGF0MjAgJiYgYy0+ZWZkICE9IC0xICYmIAorCSAgICAhKGMtPmlzdGF0ZSA9PSBDSEFOX0lOUFVUX0NMT1NFRCAmJiBjLT5vc3RhdGUgPT0gQ0hBTl9PVVRQVVRfQ0xPU0VEKSkgeworCQlpZiAoYy0+ZXh0ZW5kZWRfdXNhZ2UgPT0gQ0hBTl9FWFRFTkRFRF9XUklURSAmJgorCQkgICAgYnVmZmVyX2xlbigmYy0+ZXh0ZW5kZWQpID4gMCkKKwkJCUZEX1NFVChjLT5lZmQsIHdyaXRlc2V0KTsKKwkJZWxzZSBpZiAoYy0+ZWZkICE9IC0xICYmICEoYy0+ZmxhZ3MgJiBDSEFOX0VPRl9TRU5UKSAmJgorCQkgICAgKGMtPmV4dGVuZGVkX3VzYWdlID09IENIQU5fRVhURU5ERURfUkVBRCB8fAorCQkgICAgYy0+ZXh0ZW5kZWRfdXNhZ2UgPT0gQ0hBTl9FWFRFTkRFRF9JR05PUkUpICYmCisJCSAgICBidWZmZXJfbGVuKCZjLT5leHRlbmRlZCkgPCBjLT5yZW1vdGVfd2luZG93KQorCQkJRkRfU0VUKGMtPmVmZCwgcmVhZHNldCk7CisJfQorCS8qIFhYWDogV2hhdCBhYm91dCBlZmQ/IHJhY2VzPyAqLworfQorCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK2NoYW5uZWxfcHJlX2lucHV0X2RyYWluaW5nKENoYW5uZWwgKmMsIGZkX3NldCAqcmVhZHNldCwgZmRfc2V0ICp3cml0ZXNldCkKK3sKKwlpZiAoYnVmZmVyX2xlbigmYy0+aW5wdXQpID09IDApIHsKKwkJcGFja2V0X3N0YXJ0KFNTSF9NU0dfQ0hBTk5FTF9DTE9TRSk7CisJCXBhY2tldF9wdXRfaW50KGMtPnJlbW90ZV9pZCk7CisJCXBhY2tldF9zZW5kKCk7CisJCWMtPnR5cGUgPSBTU0hfQ0hBTk5FTF9DTE9TRUQ7CisJCWRlYnVnMigiY2hhbm5lbCAlZDogY2xvc2luZyBhZnRlciBpbnB1dCBkcmFpbi4iLCBjLT5zZWxmKTsKKwl9Cit9CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorY2hhbm5lbF9wcmVfb3V0cHV0X2RyYWluaW5nKENoYW5uZWwgKmMsIGZkX3NldCAqcmVhZHNldCwgZmRfc2V0ICp3cml0ZXNldCkKK3sKKwlpZiAoYnVmZmVyX2xlbigmYy0+b3V0cHV0KSA9PSAwKQorCQljaGFuX21hcmtfZGVhZChjKTsKKwllbHNlCisJCUZEX1NFVChjLT5zb2NrLCB3cml0ZXNldCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIGEgc3BlY2lhbCBzdGF0ZSBmb3IgWDExIGF1dGhlbnRpY2F0aW9uIHNwb29maW5nLiAgQW4gb3BlbmVkIFgxMQorICogY29ubmVjdGlvbiAod2hlbiBhdXRoZW50aWNhdGlvbiBzcG9vZmluZyBpcyBiZWluZyBkb25lKSByZW1haW5zIGluIHRoaXMKKyAqIHN0YXRlIHVudGlsIHRoZSBmaXJzdCBwYWNrZXQgaGFzIGJlZW4gY29tcGxldGVseSByZWFkLiAgVGhlIGF1dGhlbnRpY2F0aW9uCisgKiBkYXRhIGluIHRoYXQgcGFja2V0IGlzIHRoZW4gc3Vic3RpdHV0ZWQgYnkgdGhlIHJlYWwgZGF0YSBpZiBpdCBtYXRjaGVzIHRoZQorICogZmFrZSBkYXRhLCBhbmQgdGhlIGNoYW5uZWwgaXMgcHV0IGludG8gbm9ybWFsIG1vZGUuCisgKiBYWFggQWxsIHRoaXMgaGFwcGVucyBhdCB0aGUgY2xpZW50IHNpZGUuCisgKiBSZXR1cm5zOiAwID0gbmVlZCBtb3JlIGRhdGEsIC0xID0gd3JvbmcgY29va2llLCAxID0gb2sKKyAqLworc3RhdGljIGludAoreDExX29wZW5faGVscGVyKEJ1ZmZlciAqYikKK3sKKwl1X2NoYXIgKnVjcDsKKwl1X2ludCBwcm90b19sZW4sIGRhdGFfbGVuOworCisJLyogQ2hlY2sgaWYgdGhlIGZpeGVkIHNpemUgcGFydCBvZiB0aGUgcGFja2V0IGlzIGluIGJ1ZmZlci4gKi8KKwlpZiAoYnVmZmVyX2xlbihiKSA8IDEyKQorCQlyZXR1cm4gMDsKKworCS8qIFBhcnNlIHRoZSBsZW5ndGhzIG9mIHZhcmlhYmxlLWxlbmd0aCBmaWVsZHMuICovCisJdWNwID0gYnVmZmVyX3B0cihiKTsKKwlpZiAodWNwWzBdID09IDB4NDIpIHsJLyogQnl0ZSBvcmRlciBNU0IgZmlyc3QuICovCisJCXByb3RvX2xlbiA9IDI1NiAqIHVjcFs2XSArIHVjcFs3XTsKKwkJZGF0YV9sZW4gPSAyNTYgKiB1Y3BbOF0gKyB1Y3BbOV07CisJfSBlbHNlIGlmICh1Y3BbMF0gPT0gMHg2YykgewkvKiBCeXRlIG9yZGVyIExTQiBmaXJzdC4gKi8KKwkJcHJvdG9fbGVuID0gdWNwWzZdICsgMjU2ICogdWNwWzddOworCQlkYXRhX2xlbiA9IHVjcFs4XSArIDI1NiAqIHVjcFs5XTsKKwl9IGVsc2UgeworCQlkZWJ1ZzIoIkluaXRpYWwgWDExIHBhY2tldCBjb250YWlucyBiYWQgYnl0ZSBvcmRlciBieXRlOiAweCV4IiwKKwkJICAgIHVjcFswXSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBDaGVjayBpZiB0aGUgd2hvbGUgcGFja2V0IGlzIGluIGJ1ZmZlci4gKi8KKwlpZiAoYnVmZmVyX2xlbihiKSA8CisJICAgIDEyICsgKChwcm90b19sZW4gKyAzKSAmIH4zKSArICgoZGF0YV9sZW4gKyAzKSAmIH4zKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBDaGVjayBpZiBhdXRoZW50aWNhdGlvbiBwcm90b2NvbCBtYXRjaGVzLiAqLworCWlmIChwcm90b19sZW4gIT0gc3RybGVuKHgxMV9zYXZlZF9wcm90bykgfHwKKwkgICAgbWVtY21wKHVjcCArIDEyLCB4MTFfc2F2ZWRfcHJvdG8sIHByb3RvX2xlbikgIT0gMCkgeworCQlkZWJ1ZzIoIlgxMSBjb25uZWN0aW9uIHVzZXMgZGlmZmVyZW50IGF1dGhlbnRpY2F0aW9uIHByb3RvY29sLiIpOworCQlyZXR1cm4gLTE7CisJfQorCS8qIENoZWNrIGlmIGF1dGhlbnRpY2F0aW9uIGRhdGEgbWF0Y2hlcyBvdXIgZmFrZSBkYXRhLiAqLworCWlmIChkYXRhX2xlbiAhPSB4MTFfZmFrZV9kYXRhX2xlbiB8fAorCSAgICB0aW1pbmdzYWZlX2JjbXAodWNwICsgMTIgKyAoKHByb3RvX2xlbiArIDMpICYgfjMpLAorCQl4MTFfZmFrZV9kYXRhLCB4MTFfZmFrZV9kYXRhX2xlbikgIT0gMCkgeworCQlkZWJ1ZzIoIlgxMSBhdXRoIGRhdGEgZG9lcyBub3QgbWF0Y2ggZmFrZSBkYXRhLiIpOworCQlyZXR1cm4gLTE7CisJfQorCS8qIENoZWNrIGZha2UgZGF0YSBsZW5ndGggKi8KKwlpZiAoeDExX2Zha2VfZGF0YV9sZW4gIT0geDExX3NhdmVkX2RhdGFfbGVuKSB7CisJCWVycm9yKCJYMTEgZmFrZV9kYXRhX2xlbiAlZCAhPSBzYXZlZF9kYXRhX2xlbiAlZCIsCisJCSAgICB4MTFfZmFrZV9kYXRhX2xlbiwgeDExX3NhdmVkX2RhdGFfbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvKgorCSAqIFJlY2VpdmVkIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sIGFuZCBkYXRhIG1hdGNoCisJICogb3VyIGZha2UgZGF0YS4gU3Vic3RpdHV0ZSB0aGUgZmFrZSBkYXRhIHdpdGggcmVhbAorCSAqIGRhdGEuCisJICovCisJbWVtY3B5KHVjcCArIDEyICsgKChwcm90b19sZW4gKyAzKSAmIH4zKSwKKwkgICAgeDExX3NhdmVkX2RhdGEsIHgxMV9zYXZlZF9kYXRhX2xlbik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCitjaGFubmVsX3ByZV94MTFfb3Blbl8xMyhDaGFubmVsICpjLCBmZF9zZXQgKnJlYWRzZXQsIGZkX3NldCAqd3JpdGVzZXQpCit7CisJaW50IHJldCA9IHgxMV9vcGVuX2hlbHBlcigmYy0+b3V0cHV0KTsKKworCWlmIChyZXQgPT0gMSkgeworCQkvKiBTdGFydCBub3JtYWwgcHJvY2Vzc2luZyBmb3IgdGhlIGNoYW5uZWwuICovCisJCWMtPnR5cGUgPSBTU0hfQ0hBTk5FTF9PUEVOOworCQljaGFubmVsX3ByZV9vcGVuXzEzKGMsIHJlYWRzZXQsIHdyaXRlc2V0KTsKKwl9IGVsc2UgaWYgKHJldCA9PSAtMSkgeworCQkvKgorCQkgKiBXZSBoYXZlIHJlY2VpdmVkIGFuIFgxMSBjb25uZWN0aW9uIHRoYXQgaGFzIGJhZAorCQkgKiBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbi4KKwkJICovCisJCWxvZ2l0KCJYMTEgY29ubmVjdGlvbiByZWplY3RlZCBiZWNhdXNlIG9mIHdyb25nIGF1dGhlbnRpY2F0aW9uLiIpOworCQlidWZmZXJfY2xlYXIoJmMtPmlucHV0KTsKKwkJYnVmZmVyX2NsZWFyKCZjLT5vdXRwdXQpOworCQljaGFubmVsX2Nsb3NlX2ZkKCZjLT5zb2NrKTsKKwkJYy0+c29jayA9IC0xOworCQljLT50eXBlID0gU1NIX0NIQU5ORUxfQ0xPU0VEOworCQlwYWNrZXRfc3RhcnQoU1NIX01TR19DSEFOTkVMX0NMT1NFKTsKKwkJcGFja2V0X3B1dF9pbnQoYy0+cmVtb3RlX2lkKTsKKwkJcGFja2V0X3NlbmQoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjaGFubmVsX3ByZV94MTFfb3BlbihDaGFubmVsICpjLCBmZF9zZXQgKnJlYWRzZXQsIGZkX3NldCAqd3JpdGVzZXQpCit7CisJaW50IHJldCA9IHgxMV9vcGVuX2hlbHBlcigmYy0+b3V0cHV0KTsKKworCS8qIGMtPmZvcmNlX2RyYWluID0gMTsgKi8KKworCWlmIChyZXQgPT0gMSkgeworCQljLT50eXBlID0gU1NIX0NIQU5ORUxfT1BFTjsKKwkJY2hhbm5lbF9wcmVfb3BlbihjLCByZWFkc2V0LCB3cml0ZXNldCk7CisJfSBlbHNlIGlmIChyZXQgPT0gLTEpIHsKKwkJbG9naXQoIlgxMSBjb25uZWN0aW9uIHJlamVjdGVkIGJlY2F1c2Ugb2Ygd3JvbmcgYXV0aGVudGljYXRpb24uIik7CisJCWRlYnVnMigiWDExIHJlamVjdGVkICVkIGklZC9vJWQiLCBjLT5zZWxmLCBjLT5pc3RhdGUsIGMtPm9zdGF0ZSk7CisJCWNoYW5fcmVhZF9mYWlsZWQoYyk7CisJCWJ1ZmZlcl9jbGVhcigmYy0+aW5wdXQpOworCQljaGFuX2lidWZfZW1wdHkoYyk7CisJCWJ1ZmZlcl9jbGVhcigmYy0+b3V0cHV0KTsKKwkJLyogZm9yIHByb3RvIHYxLCB0aGUgcGVlciB3aWxsIHNlbmQgYW4gSUVPRiAqLworCQlpZiAoY29tcGF0MjApCisJCQljaGFuX3dyaXRlX2ZhaWxlZChjKTsKKwkJZWxzZQorCQkJYy0+dHlwZSA9IFNTSF9DSEFOTkVMX09QRU47CisJCWRlYnVnMigiWDExIGNsb3NlZCAlZCBpJWQvbyVkIiwgYy0+c2VsZiwgYy0+aXN0YXRlLCBjLT5vc3RhdGUpOworCX0KK30KKworc3RhdGljIHZvaWQKK2NoYW5uZWxfcHJlX211eF9jbGllbnQoQ2hhbm5lbCAqYywgZmRfc2V0ICpyZWFkc2V0LCBmZF9zZXQgKndyaXRlc2V0KQoreworCWlmIChjLT5pc3RhdGUgPT0gQ0hBTl9JTlBVVF9PUEVOICYmICFjLT5tdXhfcGF1c2UgJiYKKwkgICAgYnVmZmVyX2NoZWNrX2FsbG9jKCZjLT5pbnB1dCwgQ0hBTl9SQlVGKSkKKwkJRkRfU0VUKGMtPnJmZCwgcmVhZHNldCk7CisJaWYgKGMtPmlzdGF0ZSA9PSBDSEFOX0lOUFVUX1dBSVRfRFJBSU4pIHsKKwkJLyogY2xlYXIgYnVmZmVyIGltbWVkaWF0ZWx5IChkaXNjYXJkIGFueSBwYXJ0aWFsIHBhY2tldCkgKi8KKwkJYnVmZmVyX2NsZWFyKCZjLT5pbnB1dCk7CisJCWNoYW5faWJ1Zl9lbXB0eShjKTsKKwkJLyogU3RhcnQgb3V0cHV0IGRyYWluLiBYWFgganVzdCBraWxsIGNoYW4/ICovCisJCWNoYW5fcmN2ZF9vY2xvc2UoYyk7CisJfQorCWlmIChjLT5vc3RhdGUgPT0gQ0hBTl9PVVRQVVRfT1BFTiB8fAorCSAgICBjLT5vc3RhdGUgPT0gQ0hBTl9PVVRQVVRfV0FJVF9EUkFJTikgeworCQlpZiAoYnVmZmVyX2xlbigmYy0+b3V0cHV0KSA+IDApCisJCQlGRF9TRVQoYy0+d2ZkLCB3cml0ZXNldCk7CisJCWVsc2UgaWYgKGMtPm9zdGF0ZSA9PSBDSEFOX09VVFBVVF9XQUlUX0RSQUlOKQorCQkJY2hhbl9vYnVmX2VtcHR5KGMpOworCX0KK30KKworLyogdHJ5IHRvIGRlY29kZSBhIHNvY2tzNCBoZWFkZXIgKi8KKy8qIEFSR1NVU0VEICovCitzdGF0aWMgaW50CitjaGFubmVsX2RlY29kZV9zb2NrczQoQ2hhbm5lbCAqYywgZmRfc2V0ICpyZWFkc2V0LCBmZF9zZXQgKndyaXRlc2V0KQoreworCWNoYXIgKnAsICpob3N0OworCXVfaW50IGxlbiwgaGF2ZSwgaSwgZm91bmQsIG5lZWQ7CisJY2hhciB1c2VybmFtZVsyNTZdOworCXN0cnVjdCB7CisJCXVfaW50OF90IHZlcnNpb247CisJCXVfaW50OF90IGNvbW1hbmQ7CisJCXVfaW50MTZfdCBkZXN0X3BvcnQ7CisJCXN0cnVjdCBpbl9hZGRyIGRlc3RfYWRkcjsKKwl9IHM0X3JlcSwgczRfcnNwOworCisJZGVidWcyKCJjaGFubmVsICVkOiBkZWNvZGUgc29ja3M0IiwgYy0+c2VsZik7CisKKwloYXZlID0gYnVmZmVyX2xlbigmYy0+aW5wdXQpOworCWxlbiA9IHNpemVvZihzNF9yZXEpOworCWlmIChoYXZlIDwgbGVuKQorCQlyZXR1cm4gMDsKKwlwID0gYnVmZmVyX3B0cigmYy0+aW5wdXQpOworCisJbmVlZCA9IDE7CisJLyogU09DS1M0QSB1c2VzIGFuIGludmFsaWQgSVAgYWRkcmVzcyAwLjAuMC54ICovCisJaWYgKHBbNF0gPT0gMCAmJiBwWzVdID09IDAgJiYgcFs2XSA9PSAwICYmIHBbN10gIT0gMCkgeworCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IHNvY2tzNGEgcmVxdWVzdCIsIGMtPnNlbGYpOworCQkvKiAuLi4gYW5kIG5lZWRzIGFuIGV4dHJhIHN0cmluZyAodGhlIGhvc3RuYW1lKSAqLworCQluZWVkID0gMjsKKwl9CisJLyogQ2hlY2sgZm9yIHRlcm1pbmF0aW5nIE5VTCBvbiB0aGUgc3RyaW5nKHMpICovCisJZm9yIChmb3VuZCA9IDAsIGkgPSBsZW47IGkgPCBoYXZlOyBpKyspIHsKKwkJaWYgKHBbaV0gPT0gJ1wwJykgeworCQkJZm91bmQrKzsKKwkJCWlmIChmb3VuZCA9PSBuZWVkKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChpID4gMTAyNCkgeworCQkJLyogdGhlIHBlZXIgaXMgcHJvYmFibHkgc2VuZGluZyBnYXJiYWdlICovCisJCQlkZWJ1ZygiY2hhbm5lbCAlZDogZGVjb2RlIHNvY2tzNDogdG9vIGxvbmciLAorCQkJICAgIGMtPnNlbGYpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCWlmIChmb3VuZCA8IG5lZWQpCisJCXJldHVybiAwOworCWJ1ZmZlcl9nZXQoJmMtPmlucHV0LCAoY2hhciAqKSZzNF9yZXEudmVyc2lvbiwgMSk7CisJYnVmZmVyX2dldCgmYy0+aW5wdXQsIChjaGFyICopJnM0X3JlcS5jb21tYW5kLCAxKTsKKwlidWZmZXJfZ2V0KCZjLT5pbnB1dCwgKGNoYXIgKikmczRfcmVxLmRlc3RfcG9ydCwgMik7CisJYnVmZmVyX2dldCgmYy0+aW5wdXQsIChjaGFyICopJnM0X3JlcS5kZXN0X2FkZHIsIDQpOworCWhhdmUgPSBidWZmZXJfbGVuKCZjLT5pbnB1dCk7CisJcCA9IGJ1ZmZlcl9wdHIoJmMtPmlucHV0KTsKKwlsZW4gPSBzdHJsZW4ocCk7CisJZGVidWcyKCJjaGFubmVsICVkOiBkZWNvZGUgc29ja3M0OiB1c2VyICVzLyVkIiwgYy0+c2VsZiwgcCwgbGVuKTsKKwlsZW4rKzsJCQkJCS8qIHRyYWlsaW5nICdcMCcgKi8KKwlpZiAobGVuID4gaGF2ZSkKKwkJZmF0YWwoImNoYW5uZWwgJWQ6IGRlY29kZSBzb2NrczQ6IGxlbiAlZCA+IGhhdmUgJWQiLAorCQkgICAgYy0+c2VsZiwgbGVuLCBoYXZlKTsKKwlzdHJsY3B5KHVzZXJuYW1lLCBwLCBzaXplb2YodXNlcm5hbWUpKTsKKwlidWZmZXJfY29uc3VtZSgmYy0+aW5wdXQsIGxlbik7CisKKwlpZiAoYy0+cGF0aCAhPSBOVUxMKSB7CisJCXhmcmVlKGMtPnBhdGgpOworCQljLT5wYXRoID0gTlVMTDsKKwl9CisJaWYgKG5lZWQgPT0gMSkgewkJCS8qIFNPQ0tTNDogb25lIHN0cmluZyAqLworCQlob3N0ID0gaW5ldF9udG9hKHM0X3JlcS5kZXN0X2FkZHIpOworCQljLT5wYXRoID0geHN0cmR1cChob3N0KTsKKwl9IGVsc2UgewkJCQkvKiBTT0NLUzRBOiB0d28gc3RyaW5ncyAqLworCQloYXZlID0gYnVmZmVyX2xlbigmYy0+aW5wdXQpOworCQlwID0gYnVmZmVyX3B0cigmYy0+aW5wdXQpOworCQlsZW4gPSBzdHJsZW4ocCk7CisJCWRlYnVnMigiY2hhbm5lbCAlZDogZGVjb2RlIHNvY2tzNGE6IGhvc3QgJXMvJWQiLAorCQkgICAgYy0+c2VsZiwgcCwgbGVuKTsKKwkJbGVuKys7CQkJCS8qIHRyYWlsaW5nICdcMCcgKi8KKwkJaWYgKGxlbiA+IGhhdmUpCisJCQlmYXRhbCgiY2hhbm5lbCAlZDogZGVjb2RlIHNvY2tzNGE6IGxlbiAlZCA+IGhhdmUgJWQiLAorCQkJICAgIGMtPnNlbGYsIGxlbiwgaGF2ZSk7CisJCWlmIChsZW4gPiBOSV9NQVhIT1NUKSB7CisJCQllcnJvcigiY2hhbm5lbCAlZDogaG9zdG5hbWUgXCIlLjEwMHNcIiB0b28gbG9uZyIsCisJCQkgICAgYy0+c2VsZiwgcCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYy0+cGF0aCA9IHhzdHJkdXAocCk7CisJCWJ1ZmZlcl9jb25zdW1lKCZjLT5pbnB1dCwgbGVuKTsKKwl9CisJYy0+aG9zdF9wb3J0ID0gbnRvaHMoczRfcmVxLmRlc3RfcG9ydCk7CisKKwlkZWJ1ZzIoImNoYW5uZWwgJWQ6IGR5bmFtaWMgcmVxdWVzdDogc29ja3M0IGhvc3QgJXMgcG9ydCAldSBjb21tYW5kICV1IiwKKwkgICAgYy0+c2VsZiwgYy0+cGF0aCwgYy0+aG9zdF9wb3J0LCBzNF9yZXEuY29tbWFuZCk7CisKKwlpZiAoczRfcmVxLmNvbW1hbmQgIT0gMSkgeworCQlkZWJ1ZygiY2hhbm5lbCAlZDogY2Fubm90IGhhbmRsZTogJXMgY24gJWQiLAorCQkgICAgYy0+c2VsZiwgbmVlZCA9PSAxID8gIlNPQ0tTNCIgOiAiU09DS1M0QSIsIHM0X3JlcS5jb21tYW5kKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzNF9yc3AudmVyc2lvbiA9IDA7CQkJLyogdm46IDAgZm9yIHJlcGx5ICovCisJczRfcnNwLmNvbW1hbmQgPSA5MDsJCQkvKiBjZDogcmVxIGdyYW50ZWQgKi8KKwlzNF9yc3AuZGVzdF9wb3J0ID0gMDsJCQkvKiBpZ25vcmVkICovCisJczRfcnNwLmRlc3RfYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOwkvKiBpZ25vcmVkICovCisJYnVmZmVyX2FwcGVuZCgmYy0+b3V0cHV0LCAmczRfcnNwLCBzaXplb2YoczRfcnNwKSk7CisJcmV0dXJuIDE7Cit9CisKKy8qIHRyeSB0byBkZWNvZGUgYSBzb2NrczUgaGVhZGVyICovCisjZGVmaW5lIFNTSF9TT0NLUzVfQVVUSERPTkUJMHgxMDAwCisjZGVmaW5lIFNTSF9TT0NLUzVfTk9BVVRICTB4MDAKKyNkZWZpbmUgU1NIX1NPQ0tTNV9JUFY0CQkweDAxCisjZGVmaW5lIFNTSF9TT0NLUzVfRE9NQUlOCTB4MDMKKyNkZWZpbmUgU1NIX1NPQ0tTNV9JUFY2CQkweDA0CisjZGVmaW5lIFNTSF9TT0NLUzVfQ09OTkVDVAkweDAxCisjZGVmaW5lIFNTSF9TT0NLUzVfU1VDQ0VTUwkweDAwCisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgaW50CitjaGFubmVsX2RlY29kZV9zb2NrczUoQ2hhbm5lbCAqYywgZmRfc2V0ICpyZWFkc2V0LCBmZF9zZXQgKndyaXRlc2V0KQoreworCXN0cnVjdCB7CisJCXVfaW50OF90IHZlcnNpb247CisJCXVfaW50OF90IGNvbW1hbmQ7CisJCXVfaW50OF90IHJlc2VydmVkOworCQl1X2ludDhfdCBhdHlwOworCX0gczVfcmVxLCBzNV9yc3A7CisJdV9pbnQxNl90IGRlc3RfcG9ydDsKKwl1X2NoYXIgKnAsIGRlc3RfYWRkclsyNTUrMV0sIG50b3BbSU5FVDZfQUREUlNUUkxFTl07CisJdV9pbnQgaGF2ZSwgbmVlZCwgaSwgZm91bmQsIG5tZXRob2RzLCBhZGRybGVuLCBhZjsKKworCWRlYnVnMigiY2hhbm5lbCAlZDogZGVjb2RlIHNvY2tzNSIsIGMtPnNlbGYpOworCXAgPSBidWZmZXJfcHRyKCZjLT5pbnB1dCk7CisJaWYgKHBbMF0gIT0gMHgwNSkKKwkJcmV0dXJuIC0xOworCWhhdmUgPSBidWZmZXJfbGVuKCZjLT5pbnB1dCk7CisJaWYgKCEoYy0+ZmxhZ3MgJiBTU0hfU09DS1M1X0FVVEhET05FKSkgeworCQkvKiBmb3JtYXQ6IHZlciB8IG5tZXRob2RzIHwgbWV0aG9kcyAqLworCQlpZiAoaGF2ZSA8IDIpCisJCQlyZXR1cm4gMDsKKwkJbm1ldGhvZHMgPSBwWzFdOworCQlpZiAoaGF2ZSA8IG5tZXRob2RzICsgMikKKwkJCXJldHVybiAwOworCQkvKiBsb29rIGZvciBtZXRob2Q6ICJOTyBBVVRIRU5USUNBVElPTiBSRVFVSVJFRCIgKi8KKwkJZm9yIChmb3VuZCA9IDAsIGkgPSAyOyBpIDwgbm1ldGhvZHMgKyAyOyBpKyspIHsKKwkJCWlmIChwW2ldID09IFNTSF9TT0NLUzVfTk9BVVRIKSB7CisJCQkJZm91bmQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghZm91bmQpIHsKKwkJCWRlYnVnKCJjaGFubmVsICVkOiBtZXRob2QgU1NIX1NPQ0tTNV9OT0FVVEggbm90IGZvdW5kIiwKKwkJCSAgICBjLT5zZWxmKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlidWZmZXJfY29uc3VtZSgmYy0+aW5wdXQsIG5tZXRob2RzICsgMik7CisJCWJ1ZmZlcl9wdXRfY2hhcigmYy0+b3V0cHV0LCAweDA1KTsJCS8qIHZlcnNpb24gKi8KKwkJYnVmZmVyX3B1dF9jaGFyKCZjLT5vdXRwdXQsIFNTSF9TT0NLUzVfTk9BVVRIKTsJLyogbWV0aG9kICovCisJCUZEX1NFVChjLT5zb2NrLCB3cml0ZXNldCk7CisJCWMtPmZsYWdzIHw9IFNTSF9TT0NLUzVfQVVUSERPTkU7CisJCWRlYnVnMigiY2hhbm5lbCAlZDogc29ja3M1IGF1dGggZG9uZSIsIGMtPnNlbGYpOworCQlyZXR1cm4gMDsJCQkJLyogbmVlZCBtb3JlICovCisJfQorCWRlYnVnMigiY2hhbm5lbCAlZDogc29ja3M1IHBvc3QgYXV0aCIsIGMtPnNlbGYpOworCWlmIChoYXZlIDwgc2l6ZW9mKHM1X3JlcSkrMSkKKwkJcmV0dXJuIDA7CQkJLyogbmVlZCBtb3JlICovCisJbWVtY3B5KCZzNV9yZXEsIHAsIHNpemVvZihzNV9yZXEpKTsKKwlpZiAoczVfcmVxLnZlcnNpb24gIT0gMHgwNSB8fAorCSAgICBzNV9yZXEuY29tbWFuZCAhPSBTU0hfU09DS1M1X0NPTk5FQ1QgfHwKKwkgICAgczVfcmVxLnJlc2VydmVkICE9IDB4MDApIHsKKwkJZGVidWcyKCJjaGFubmVsICVkOiBvbmx5IHNvY2tzNSBjb25uZWN0IHN1cHBvcnRlZCIsIGMtPnNlbGYpOworCQlyZXR1cm4gLTE7CisJfQorCXN3aXRjaCAoczVfcmVxLmF0eXApeworCWNhc2UgU1NIX1NPQ0tTNV9JUFY0OgorCQlhZGRybGVuID0gNDsKKwkJYWYgPSBBRl9JTkVUOworCQlicmVhazsKKwljYXNlIFNTSF9TT0NLUzVfRE9NQUlOOgorCQlhZGRybGVuID0gcFtzaXplb2YoczVfcmVxKV07CisJCWFmID0gLTE7CisJCWJyZWFrOworCWNhc2UgU1NIX1NPQ0tTNV9JUFY2OgorCQlhZGRybGVuID0gMTY7CisJCWFmID0gQUZfSU5FVDY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRlYnVnMigiY2hhbm5lbCAlZDogYmFkIHNvY2tzNSBhdHlwICVkIiwgYy0+c2VsZiwgczVfcmVxLmF0eXApOworCQlyZXR1cm4gLTE7CisJfQorCW5lZWQgPSBzaXplb2YoczVfcmVxKSArIGFkZHJsZW4gKyAyOworCWlmIChzNV9yZXEuYXR5cCA9PSBTU0hfU09DS1M1X0RPTUFJTikKKwkJbmVlZCsrOworCWlmIChoYXZlIDwgbmVlZCkKKwkJcmV0dXJuIDA7CisJYnVmZmVyX2NvbnN1bWUoJmMtPmlucHV0LCBzaXplb2YoczVfcmVxKSk7CisJaWYgKHM1X3JlcS5hdHlwID09IFNTSF9TT0NLUzVfRE9NQUlOKQorCQlidWZmZXJfY29uc3VtZSgmYy0+aW5wdXQsIDEpOyAgICAvKiBob3N0IHN0cmluZyBsZW5ndGggKi8KKwlidWZmZXJfZ2V0KCZjLT5pbnB1dCwgKGNoYXIgKikmZGVzdF9hZGRyLCBhZGRybGVuKTsKKwlidWZmZXJfZ2V0KCZjLT5pbnB1dCwgKGNoYXIgKikmZGVzdF9wb3J0LCAyKTsKKwlkZXN0X2FkZHJbYWRkcmxlbl0gPSAnXDAnOworCWlmIChjLT5wYXRoICE9IE5VTEwpIHsKKwkJeGZyZWUoYy0+cGF0aCk7CisJCWMtPnBhdGggPSBOVUxMOworCX0KKwlpZiAoczVfcmVxLmF0eXAgPT0gU1NIX1NPQ0tTNV9ET01BSU4pIHsKKwkJaWYgKGFkZHJsZW4gPj0gTklfTUFYSE9TVCkgeworCQkJZXJyb3IoImNoYW5uZWwgJWQ6IGR5bmFtaWMgcmVxdWVzdDogc29ja3M1IGhvc3RuYW1lICIKKwkJCSAgICAiXCIlLjEwMHNcIiB0b28gbG9uZyIsIGMtPnNlbGYsIGRlc3RfYWRkcik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYy0+cGF0aCA9IHhzdHJkdXAoZGVzdF9hZGRyKTsKKwl9IGVsc2UgeworCQlpZiAoaW5ldF9udG9wKGFmLCBkZXN0X2FkZHIsIG50b3AsIHNpemVvZihudG9wKSkgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKwkJYy0+cGF0aCA9IHhzdHJkdXAobnRvcCk7CisJfQorCWMtPmhvc3RfcG9ydCA9IG50b2hzKGRlc3RfcG9ydCk7CisKKwlkZWJ1ZzIoImNoYW5uZWwgJWQ6IGR5bmFtaWMgcmVxdWVzdDogc29ja3M1IGhvc3QgJXMgcG9ydCAldSBjb21tYW5kICV1IiwKKwkgICAgYy0+c2VsZiwgYy0+cGF0aCwgYy0+aG9zdF9wb3J0LCBzNV9yZXEuY29tbWFuZCk7CisKKwlzNV9yc3AudmVyc2lvbiA9IDB4MDU7CisJczVfcnNwLmNvbW1hbmQgPSBTU0hfU09DS1M1X1NVQ0NFU1M7CisJczVfcnNwLnJlc2VydmVkID0gMDsJCQkvKiBpZ25vcmVkICovCisJczVfcnNwLmF0eXAgPSBTU0hfU09DS1M1X0lQVjQ7CisJKChzdHJ1Y3QgaW5fYWRkciAqKSZkZXN0X2FkZHIpLT5zX2FkZHIgPSBJTkFERFJfQU5ZOworCWRlc3RfcG9ydCA9IDA7CQkJCS8qIGlnbm9yZWQgKi8KKworCWJ1ZmZlcl9hcHBlbmQoJmMtPm91dHB1dCwgJnM1X3JzcCwgc2l6ZW9mKHM1X3JzcCkpOworCWJ1ZmZlcl9hcHBlbmQoJmMtPm91dHB1dCwgJmRlc3RfYWRkciwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisJYnVmZmVyX2FwcGVuZCgmYy0+b3V0cHV0LCAmZGVzdF9wb3J0LCBzaXplb2YoZGVzdF9wb3J0KSk7CisJcmV0dXJuIDE7Cit9CisKK0NoYW5uZWwgKgorY2hhbm5lbF9jb25uZWN0X3N0ZGlvX2Z3ZChjb25zdCBjaGFyICpob3N0X3RvX2Nvbm5lY3QsIHVfc2hvcnQgcG9ydF90b19jb25uZWN0LAorICAgIGludCBpbiwgaW50IG91dCkKK3sKKwlDaGFubmVsICpjOworCisJZGVidWcoImNoYW5uZWxfY29ubmVjdF9zdGRpb19md2QgJXM6JWQiLCBob3N0X3RvX2Nvbm5lY3QsCisJICAgIHBvcnRfdG9fY29ubmVjdCk7CisKKwljID0gY2hhbm5lbF9uZXcoInN0ZGlvLWZvcndhcmQiLCBTU0hfQ0hBTk5FTF9PUEVOSU5HLCBpbiwgb3V0LAorCSAgICAtMSwgQ0hBTl9UQ1BfV0lORE9XX0RFRkFVTFQsIENIQU5fVENQX1BBQ0tFVF9ERUZBVUxULAorCSAgICAwLCAic3RkaW8tZm9yd2FyZCIsIC8qbm9uYmxvY2sqLzApOworCisJYy0+cGF0aCA9IHhzdHJkdXAoaG9zdF90b19jb25uZWN0KTsKKwljLT5ob3N0X3BvcnQgPSBwb3J0X3RvX2Nvbm5lY3Q7CisJYy0+bGlzdGVuaW5nX3BvcnQgPSAwOworCWMtPmZvcmNlX2RyYWluID0gMTsKKworCWNoYW5uZWxfcmVnaXN0ZXJfZmRzKGMsIGluLCBvdXQsIC0xLCAwLCAxLCAwKTsKKwlwb3J0X29wZW5faGVscGVyKGMsICJkaXJlY3QtdGNwaXAiKTsKKworCXJldHVybiBjOworfQorCisvKiBkeW5hbWljIHBvcnQgZm9yd2FyZGluZyAqLworc3RhdGljIHZvaWQKK2NoYW5uZWxfcHJlX2R5bmFtaWMoQ2hhbm5lbCAqYywgZmRfc2V0ICpyZWFkc2V0LCBmZF9zZXQgKndyaXRlc2V0KQoreworCXVfY2hhciAqcDsKKwl1X2ludCBoYXZlOworCWludCByZXQ7CisKKwloYXZlID0gYnVmZmVyX2xlbigmYy0+aW5wdXQpOworCWRlYnVnMigiY2hhbm5lbCAlZDogcHJlX2R5bmFtaWM6IGhhdmUgJWQiLCBjLT5zZWxmLCBoYXZlKTsKKwkvKiBidWZmZXJfZHVtcCgmYy0+aW5wdXQpOyAqLworCS8qIGNoZWNrIGlmIHRoZSBmaXhlZCBzaXplIHBhcnQgb2YgdGhlIHBhY2tldCBpcyBpbiBidWZmZXIuICovCisJaWYgKGhhdmUgPCAzKSB7CisJCS8qIG5lZWQgbW9yZSAqLworCQlGRF9TRVQoYy0+c29jaywgcmVhZHNldCk7CisJCXJldHVybjsKKwl9CisJLyogdHJ5IHRvIGd1ZXNzIHRoZSBwcm90b2NvbCAqLworCXAgPSBidWZmZXJfcHRyKCZjLT5pbnB1dCk7CisJc3dpdGNoIChwWzBdKSB7CisJY2FzZSAweDA0OgorCQlyZXQgPSBjaGFubmVsX2RlY29kZV9zb2NrczQoYywgcmVhZHNldCwgd3JpdGVzZXQpOworCQlicmVhazsKKwljYXNlIDB4MDU6CisJCXJldCA9IGNoYW5uZWxfZGVjb2RlX3NvY2tzNShjLCByZWFkc2V0LCB3cml0ZXNldCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisJaWYgKHJldCA8IDApIHsKKwkJY2hhbl9tYXJrX2RlYWQoYyk7CisJfSBlbHNlIGlmIChyZXQgPT0gMCkgeworCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IHByZV9keW5hbWljOiBuZWVkIG1vcmUiLCBjLT5zZWxmKTsKKwkJLyogbmVlZCBtb3JlICovCisJCUZEX1NFVChjLT5zb2NrLCByZWFkc2V0KTsKKwl9IGVsc2UgeworCQkvKiBzd2l0Y2ggdG8gdGhlIG5leHQgc3RhdGUgKi8KKwkJYy0+dHlwZSA9IFNTSF9DSEFOTkVMX09QRU5JTkc7CisJCXBvcnRfb3Blbl9oZWxwZXIoYywgImRpcmVjdC10Y3BpcCIpOworCX0KK30KKworLyogVGhpcyBpcyBvdXIgZmFrZSBYMTEgc2VydmVyIHNvY2tldC4gKi8KKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorY2hhbm5lbF9wb3N0X3gxMV9saXN0ZW5lcihDaGFubmVsICpjLCBmZF9zZXQgKnJlYWRzZXQsIGZkX3NldCAqd3JpdGVzZXQpCit7CisJQ2hhbm5lbCAqbmM7CisJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKKwlpbnQgbmV3c29jazsKKwlzb2NrbGVuX3QgYWRkcmxlbjsKKwljaGFyIGJ1ZlsxNjM4NF0sICpyZW1vdGVfaXBhZGRyOworCWludCByZW1vdGVfcG9ydDsKKworCWlmIChGRF9JU1NFVChjLT5zb2NrLCByZWFkc2V0KSkgeworCQlkZWJ1ZygiWDExIGNvbm5lY3Rpb24gcmVxdWVzdGVkLiIpOworCQlhZGRybGVuID0gc2l6ZW9mKGFkZHIpOworCQluZXdzb2NrID0gYWNjZXB0KGMtPnNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJmFkZHJsZW4pOworCQlpZiAoYy0+c2luZ2xlX2Nvbm5lY3Rpb24pIHsKKwkJCWRlYnVnMigic2luZ2xlX2Nvbm5lY3Rpb246IGNsb3NpbmcgWDExIGxpc3RlbmVyLiIpOworCQkJY2hhbm5lbF9jbG9zZV9mZCgmYy0+c29jayk7CisJCQljaGFuX21hcmtfZGVhZChjKTsKKwkJfQorCQlpZiAobmV3c29jayA8IDApIHsKKwkJCWVycm9yKCJhY2NlcHQ6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm47CisJCX0KKwkJc2V0X25vZGVsYXkobmV3c29jayk7CisJCXJlbW90ZV9pcGFkZHIgPSBnZXRfcGVlcl9pcGFkZHIobmV3c29jayk7CisJCXJlbW90ZV9wb3J0ID0gZ2V0X3BlZXJfcG9ydChuZXdzb2NrKTsKKwkJc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiWDExIGNvbm5lY3Rpb24gZnJvbSAlLjIwMHMgcG9ydCAlZCIsCisJCSAgICByZW1vdGVfaXBhZGRyLCByZW1vdGVfcG9ydCk7CisKKwkJbmMgPSBjaGFubmVsX25ldygiYWNjZXB0ZWQgeDExIHNvY2tldCIsCisJCSAgICBTU0hfQ0hBTk5FTF9PUEVOSU5HLCBuZXdzb2NrLCBuZXdzb2NrLCAtMSwKKwkJICAgIGMtPmxvY2FsX3dpbmRvd19tYXgsIGMtPmxvY2FsX21heHBhY2tldCwgMCwgYnVmLCAxKTsKKwkJaWYgKGNvbXBhdDIwKSB7CisJCQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfQ0hBTk5FTF9PUEVOKTsKKwkJCXBhY2tldF9wdXRfY3N0cmluZygieDExIik7CisJCQlwYWNrZXRfcHV0X2ludChuYy0+c2VsZik7CisJCQlwYWNrZXRfcHV0X2ludChuYy0+bG9jYWxfd2luZG93X21heCk7CisJCQlwYWNrZXRfcHV0X2ludChuYy0+bG9jYWxfbWF4cGFja2V0KTsKKwkJCS8qIG9yaWdpbmF0b3IgaXBhZGRyIGFuZCBwb3J0ICovCisJCQlwYWNrZXRfcHV0X2NzdHJpbmcocmVtb3RlX2lwYWRkcik7CisJCQlpZiAoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX1gxMUZXRCkgeworCQkJCWRlYnVnMigic3NoMiB4MTEgYnVnIGNvbXBhdCBtb2RlIik7CisJCQl9IGVsc2UgeworCQkJCXBhY2tldF9wdXRfaW50KHJlbW90ZV9wb3J0KTsKKwkJCX0KKwkJCXBhY2tldF9zZW5kKCk7CisJCX0gZWxzZSB7CisJCQlwYWNrZXRfc3RhcnQoU1NIX1NNU0dfWDExX09QRU4pOworCQkJcGFja2V0X3B1dF9pbnQobmMtPnNlbGYpOworCQkJaWYgKHBhY2tldF9nZXRfcHJvdG9jb2xfZmxhZ3MoKSAmCisJCQkgICAgU1NIX1BST1RPRkxBR19IT1NUX0lOX0ZXRF9PUEVOKQorCQkJCXBhY2tldF9wdXRfY3N0cmluZyhidWYpOworCQkJcGFja2V0X3NlbmQoKTsKKwkJfQorCQl4ZnJlZShyZW1vdGVfaXBhZGRyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwb3J0X29wZW5faGVscGVyKENoYW5uZWwgKmMsIGNoYXIgKnJ0eXBlKQoreworCWludCBkaXJlY3Q7CisJY2hhciBidWZbMTAyNF07CisJY2hhciAqcmVtb3RlX2lwYWRkciA9IGdldF9wZWVyX2lwYWRkcihjLT5zb2NrKTsKKwlpbnQgcmVtb3RlX3BvcnQgPSBnZXRfcGVlcl9wb3J0KGMtPnNvY2spOworCisJaWYgKHJlbW90ZV9wb3J0ID09IC0xKSB7CisJCS8qIEZha2UgYWRkci9wb3J0IHRvIGFwcGVhc2UgcGVlcnMgdGhhdCB2YWxpZGF0ZSBpdCAoVGVjdGlhKSAqLworCQl4ZnJlZShyZW1vdGVfaXBhZGRyKTsKKwkJcmVtb3RlX2lwYWRkciA9IHhzdHJkdXAoIjEyNy4wLjAuMSIpOworCQlyZW1vdGVfcG9ydCA9IDY1NTM1OworCX0KKworCWRpcmVjdCA9IChzdHJjbXAocnR5cGUsICJkaXJlY3QtdGNwaXAiKSA9PSAwKTsKKworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwKKwkgICAgIiVzOiBsaXN0ZW5pbmcgcG9ydCAlZCBmb3IgJS4xMDBzIHBvcnQgJWQsICIKKwkgICAgImNvbm5lY3QgZnJvbSAlLjIwMHMgcG9ydCAlZCIsCisJICAgIHJ0eXBlLCBjLT5saXN0ZW5pbmdfcG9ydCwgYy0+cGF0aCwgYy0+aG9zdF9wb3J0LAorCSAgICByZW1vdGVfaXBhZGRyLCByZW1vdGVfcG9ydCk7CisKKwl4ZnJlZShjLT5yZW1vdGVfbmFtZSk7CisJYy0+cmVtb3RlX25hbWUgPSB4c3RyZHVwKGJ1Zik7CisKKwlpZiAoY29tcGF0MjApIHsKKwkJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0NIQU5ORUxfT1BFTik7CisJCXBhY2tldF9wdXRfY3N0cmluZyhydHlwZSk7CisJCXBhY2tldF9wdXRfaW50KGMtPnNlbGYpOworCQlwYWNrZXRfcHV0X2ludChjLT5sb2NhbF93aW5kb3dfbWF4KTsKKwkJcGFja2V0X3B1dF9pbnQoYy0+bG9jYWxfbWF4cGFja2V0KTsKKwkJaWYgKGRpcmVjdCkgeworCQkJLyogdGFyZ2V0IGhvc3QsIHBvcnQgKi8KKwkJCXBhY2tldF9wdXRfY3N0cmluZyhjLT5wYXRoKTsKKwkJCXBhY2tldF9wdXRfaW50KGMtPmhvc3RfcG9ydCk7CisJCX0gZWxzZSB7CisJCQkvKiBsaXN0ZW4gYWRkcmVzcywgcG9ydCAqLworCQkJcGFja2V0X3B1dF9jc3RyaW5nKGMtPnBhdGgpOworCQkJcGFja2V0X3B1dF9pbnQoYy0+bGlzdGVuaW5nX3BvcnQpOworCQl9CisJCS8qIG9yaWdpbmF0b3IgaG9zdCBhbmQgcG9ydCAqLworCQlwYWNrZXRfcHV0X2NzdHJpbmcocmVtb3RlX2lwYWRkcik7CisJCXBhY2tldF9wdXRfaW50KCh1X2ludClyZW1vdGVfcG9ydCk7CisJCXBhY2tldF9zZW5kKCk7CisJfSBlbHNlIHsKKwkJcGFja2V0X3N0YXJ0KFNTSF9NU0dfUE9SVF9PUEVOKTsKKwkJcGFja2V0X3B1dF9pbnQoYy0+c2VsZik7CisJCXBhY2tldF9wdXRfY3N0cmluZyhjLT5wYXRoKTsKKwkJcGFja2V0X3B1dF9pbnQoYy0+aG9zdF9wb3J0KTsKKwkJaWYgKHBhY2tldF9nZXRfcHJvdG9jb2xfZmxhZ3MoKSAmCisJCSAgICBTU0hfUFJPVE9GTEFHX0hPU1RfSU5fRldEX09QRU4pCisJCQlwYWNrZXRfcHV0X2NzdHJpbmcoYy0+cmVtb3RlX25hbWUpOworCQlwYWNrZXRfc2VuZCgpOworCX0KKwl4ZnJlZShyZW1vdGVfaXBhZGRyKTsKK30KKworc3RhdGljIHZvaWQKK2NoYW5uZWxfc2V0X3JldXNlYWRkcihpbnQgZmQpCit7CisJaW50IG9uID0gMTsKKworCS8qCisJICogU2V0IHNvY2tldCBvcHRpb25zLgorCSAqIEFsbG93IGxvY2FsIHBvcnQgcmV1c2UgaW4gVElNRV9XQUlULgorCSAqLworCWlmIChzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSkgPT0gLTEpCisJCWVycm9yKCJzZXRzb2Nrb3B0IFNPX1JFVVNFQUREUiBmZCAlZDogJXMiLCBmZCwgc3RyZXJyb3IoZXJybm8pKTsKK30KKworLyoKKyAqIFRoaXMgc29ja2V0IGlzIGxpc3RlbmluZyBmb3IgY29ubmVjdGlvbnMgdG8gYSBmb3J3YXJkZWQgVENQL0lQIHBvcnQuCisgKi8KKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorY2hhbm5lbF9wb3N0X3BvcnRfbGlzdGVuZXIoQ2hhbm5lbCAqYywgZmRfc2V0ICpyZWFkc2V0LCBmZF9zZXQgKndyaXRlc2V0KQoreworCUNoYW5uZWwgKm5jOworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7CisJaW50IG5ld3NvY2ssIG5leHRzdGF0ZTsKKwlzb2NrbGVuX3QgYWRkcmxlbjsKKwljaGFyICpydHlwZTsKKworCWlmIChGRF9JU1NFVChjLT5zb2NrLCByZWFkc2V0KSkgeworCQlkZWJ1ZygiQ29ubmVjdGlvbiB0byBwb3J0ICVkIGZvcndhcmRpbmcgIgorCQkgICAgInRvICUuMTAwcyBwb3J0ICVkIHJlcXVlc3RlZC4iLAorCQkgICAgYy0+bGlzdGVuaW5nX3BvcnQsIGMtPnBhdGgsIGMtPmhvc3RfcG9ydCk7CisKKwkJaWYgKGMtPnR5cGUgPT0gU1NIX0NIQU5ORUxfUlBPUlRfTElTVEVORVIpIHsKKwkJCW5leHRzdGF0ZSA9IFNTSF9DSEFOTkVMX09QRU5JTkc7CisJCQlydHlwZSA9ICJmb3J3YXJkZWQtdGNwaXAiOworCQl9IGVsc2UgeworCQkJaWYgKGMtPmhvc3RfcG9ydCA9PSAwKSB7CisJCQkJbmV4dHN0YXRlID0gU1NIX0NIQU5ORUxfRFlOQU1JQzsKKwkJCQlydHlwZSA9ICJkeW5hbWljLXRjcGlwIjsKKwkJCX0gZWxzZSB7CisJCQkJbmV4dHN0YXRlID0gU1NIX0NIQU5ORUxfT1BFTklORzsKKwkJCQlydHlwZSA9ICJkaXJlY3QtdGNwaXAiOworCQkJfQorCQl9CisKKwkJYWRkcmxlbiA9IHNpemVvZihhZGRyKTsKKwkJbmV3c29jayA9IGFjY2VwdChjLT5zb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsICZhZGRybGVuKTsKKwkJaWYgKG5ld3NvY2sgPCAwKSB7CisJCQllcnJvcigiYWNjZXB0OiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuOworCQl9CisJCXNldF9ub2RlbGF5KG5ld3NvY2spOworCQluYyA9IGNoYW5uZWxfbmV3KHJ0eXBlLCBuZXh0c3RhdGUsIG5ld3NvY2ssIG5ld3NvY2ssIC0xLAorCQkgICAgYy0+bG9jYWxfd2luZG93X21heCwgYy0+bG9jYWxfbWF4cGFja2V0LCAwLCBydHlwZSwgMSk7CisJCW5jLT5saXN0ZW5pbmdfcG9ydCA9IGMtPmxpc3RlbmluZ19wb3J0OworCQluYy0+aG9zdF9wb3J0ID0gYy0+aG9zdF9wb3J0OworCQlpZiAoYy0+cGF0aCAhPSBOVUxMKQorCQkJbmMtPnBhdGggPSB4c3RyZHVwKGMtPnBhdGgpOworCisJCWlmIChuZXh0c3RhdGUgIT0gU1NIX0NIQU5ORUxfRFlOQU1JQykKKwkJCXBvcnRfb3Blbl9oZWxwZXIobmMsIHJ0eXBlKTsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBhdXRoZW50aWNhdGlvbiBhZ2VudCBzb2NrZXQgbGlzdGVuaW5nIGZvciBjb25uZWN0aW9ucyBmcm9tCisgKiBjbGllbnRzLgorICovCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK2NoYW5uZWxfcG9zdF9hdXRoX2xpc3RlbmVyKENoYW5uZWwgKmMsIGZkX3NldCAqcmVhZHNldCwgZmRfc2V0ICp3cml0ZXNldCkKK3sKKwlDaGFubmVsICpuYzsKKwlpbnQgbmV3c29jazsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOworCXNvY2tsZW5fdCBhZGRybGVuOworCisJaWYgKEZEX0lTU0VUKGMtPnNvY2ssIHJlYWRzZXQpKSB7CisJCWFkZHJsZW4gPSBzaXplb2YoYWRkcik7CisJCW5ld3NvY2sgPSBhY2NlcHQoYy0+c29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCAmYWRkcmxlbik7CisJCWlmIChuZXdzb2NrIDwgMCkgeworCQkJZXJyb3IoImFjY2VwdCBmcm9tIGF1dGggc29ja2V0OiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuOworCQl9CisJCW5jID0gY2hhbm5lbF9uZXcoImFjY2VwdGVkIGF1dGggc29ja2V0IiwKKwkJICAgIFNTSF9DSEFOTkVMX09QRU5JTkcsIG5ld3NvY2ssIG5ld3NvY2ssIC0xLAorCQkgICAgYy0+bG9jYWxfd2luZG93X21heCwgYy0+bG9jYWxfbWF4cGFja2V0LAorCQkgICAgMCwgImFjY2VwdGVkIGF1dGggc29ja2V0IiwgMSk7CisJCWlmIChjb21wYXQyMCkgeworCQkJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0NIQU5ORUxfT1BFTik7CisJCQlwYWNrZXRfcHV0X2NzdHJpbmcoImF1dGgtYWdlbnRAb3BlbnNzaC5jb20iKTsKKwkJCXBhY2tldF9wdXRfaW50KG5jLT5zZWxmKTsKKwkJCXBhY2tldF9wdXRfaW50KGMtPmxvY2FsX3dpbmRvd19tYXgpOworCQkJcGFja2V0X3B1dF9pbnQoYy0+bG9jYWxfbWF4cGFja2V0KTsKKwkJfSBlbHNlIHsKKwkJCXBhY2tldF9zdGFydChTU0hfU01TR19BR0VOVF9PUEVOKTsKKwkJCXBhY2tldF9wdXRfaW50KG5jLT5zZWxmKTsKKwkJfQorCQlwYWNrZXRfc2VuZCgpOworCX0KK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitjaGFubmVsX3Bvc3RfY29ubmVjdGluZyhDaGFubmVsICpjLCBmZF9zZXQgKnJlYWRzZXQsIGZkX3NldCAqd3JpdGVzZXQpCit7CisJaW50IGVyciA9IDAsIHNvY2s7CisJc29ja2xlbl90IHN6ID0gc2l6ZW9mKGVycik7CisKKwlpZiAoRkRfSVNTRVQoYy0+c29jaywgd3JpdGVzZXQpKSB7CisJCWlmIChnZXRzb2Nrb3B0KGMtPnNvY2ssIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAmZXJyLCAmc3opIDwgMCkgeworCQkJZXJyID0gZXJybm87CisJCQllcnJvcigiZ2V0c29ja29wdCBTT19FUlJPUiBmYWlsZWQiKTsKKwkJfQorCQlpZiAoZXJyID09IDApIHsKKwkJCWRlYnVnKCJjaGFubmVsICVkOiBjb25uZWN0ZWQgdG8gJXMgcG9ydCAlZCIsCisJCQkgICAgYy0+c2VsZiwgYy0+Y29ubmVjdF9jdHguaG9zdCwgYy0+Y29ubmVjdF9jdHgucG9ydCk7CisJCQljaGFubmVsX2Nvbm5lY3RfY3R4X2ZyZWUoJmMtPmNvbm5lY3RfY3R4KTsKKwkJCWMtPnR5cGUgPSBTU0hfQ0hBTk5FTF9PUEVOOworCQkJaWYgKGNvbXBhdDIwKSB7CisJCQkJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0NIQU5ORUxfT1BFTl9DT05GSVJNQVRJT04pOworCQkJCXBhY2tldF9wdXRfaW50KGMtPnJlbW90ZV9pZCk7CisJCQkJcGFja2V0X3B1dF9pbnQoYy0+c2VsZik7CisJCQkJcGFja2V0X3B1dF9pbnQoYy0+bG9jYWxfd2luZG93KTsKKwkJCQlwYWNrZXRfcHV0X2ludChjLT5sb2NhbF9tYXhwYWNrZXQpOworCQkJfSBlbHNlIHsKKwkJCQlwYWNrZXRfc3RhcnQoU1NIX01TR19DSEFOTkVMX09QRU5fQ09ORklSTUFUSU9OKTsKKwkJCQlwYWNrZXRfcHV0X2ludChjLT5yZW1vdGVfaWQpOworCQkJCXBhY2tldF9wdXRfaW50KGMtPnNlbGYpOworCQkJfQorCQl9IGVsc2UgeworCQkJZGVidWcoImNoYW5uZWwgJWQ6IGNvbm5lY3Rpb24gZmFpbGVkOiAlcyIsCisJCQkgICAgYy0+c2VsZiwgc3RyZXJyb3IoZXJyKSk7CisJCQkvKiBUcnkgbmV4dCBhZGRyZXNzLCBpZiBhbnkgKi8KKwkJCWlmICgoc29jayA9IGNvbm5lY3RfbmV4dCgmYy0+Y29ubmVjdF9jdHgpKSA+IDApIHsKKwkJCQljbG9zZShjLT5zb2NrKTsKKwkJCQljLT5zb2NrID0gYy0+cmZkID0gYy0+d2ZkID0gc29jazsKKwkJCQljaGFubmVsX21heF9mZCA9IGNoYW5uZWxfZmluZF9tYXhmZCgpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCS8qIEV4aGF1c3RlZCBhbGwgYWRkcmVzc2VzICovCisJCQllcnJvcigiY29ubmVjdF90byAlLjEwMHMgcG9ydCAlZDogZmFpbGVkLiIsCisJCQkgICAgYy0+Y29ubmVjdF9jdHguaG9zdCwgYy0+Y29ubmVjdF9jdHgucG9ydCk7CisJCQljaGFubmVsX2Nvbm5lY3RfY3R4X2ZyZWUoJmMtPmNvbm5lY3RfY3R4KTsKKwkJCWlmIChjb21wYXQyMCkgeworCQkJCXBhY2tldF9zdGFydChTU0gyX01TR19DSEFOTkVMX09QRU5fRkFJTFVSRSk7CisJCQkJcGFja2V0X3B1dF9pbnQoYy0+cmVtb3RlX2lkKTsKKwkJCQlwYWNrZXRfcHV0X2ludChTU0gyX09QRU5fQ09OTkVDVF9GQUlMRUQpOworCQkJCWlmICghKGRhdGFmZWxsb3dzICYgU1NIX0JVR19PUEVORkFJTFVSRSkpIHsKKwkJCQkJcGFja2V0X3B1dF9jc3RyaW5nKHN0cmVycm9yKGVycikpOworCQkJCQlwYWNrZXRfcHV0X2NzdHJpbmcoIiIpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcGFja2V0X3N0YXJ0KFNTSF9NU0dfQ0hBTk5FTF9PUEVOX0ZBSUxVUkUpOworCQkJCXBhY2tldF9wdXRfaW50KGMtPnJlbW90ZV9pZCk7CisJCQl9CisJCQljaGFuX21hcmtfZGVhZChjKTsKKwkJfQorCQlwYWNrZXRfc2VuZCgpOworCX0KK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyBpbnQKK2NoYW5uZWxfaGFuZGxlX3JmZChDaGFubmVsICpjLCBmZF9zZXQgKnJlYWRzZXQsIGZkX3NldCAqd3JpdGVzZXQpCit7CisJY2hhciBidWZbQ0hBTl9SQlVGXTsKKwlpbnQgbGVuLCBmb3JjZTsKKworCWZvcmNlID0gYy0+aXNhdHR5ICYmIGMtPmRldGFjaF9jbG9zZSAmJiBjLT5pc3RhdGUgIT0gQ0hBTl9JTlBVVF9DTE9TRUQ7CisJaWYgKGMtPnJmZCAhPSAtMSAmJiAoZm9yY2UgfHwgRkRfSVNTRVQoYy0+cmZkLCByZWFkc2V0KSkpIHsKKwkJZXJybm8gPSAwOworCQlsZW4gPSByZWFkKGMtPnJmZCwgYnVmLCBzaXplb2YoYnVmKSk7CisJCWlmIChsZW4gPCAwICYmIChlcnJubyA9PSBFSU5UUiB8fAorCQkgICAgKChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0spICYmICFmb3JjZSkpKQorCQkJcmV0dXJuIDE7CisjaWZuZGVmIFBUWV9aRVJPUkVBRAorCQlpZiAobGVuIDw9IDApIHsKKyNlbHNlCisJCWlmICgoIWMtPmlzYXR0eSAmJiBsZW4gPD0gMCkgfHwKKwkJICAgIChjLT5pc2F0dHkgJiYgKGxlbiA8IDAgfHwgKGxlbiA9PSAwICYmIGVycm5vICE9IDApKSkpIHsKKyNlbmRpZgorCQkJZGVidWcyKCJjaGFubmVsICVkOiByZWFkPD0wIHJmZCAlZCBsZW4gJWQiLAorCQkJICAgIGMtPnNlbGYsIGMtPnJmZCwgbGVuKTsKKwkJCWlmIChjLT50eXBlICE9IFNTSF9DSEFOTkVMX09QRU4pIHsKKwkJCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IG5vdCBvcGVuIiwgYy0+c2VsZik7CisJCQkJY2hhbl9tYXJrX2RlYWQoYyk7CisJCQkJcmV0dXJuIC0xOworCQkJfSBlbHNlIGlmIChjb21wYXQxMykgeworCQkJCWJ1ZmZlcl9jbGVhcigmYy0+b3V0cHV0KTsKKwkJCQljLT50eXBlID0gU1NIX0NIQU5ORUxfSU5QVVRfRFJBSU5JTkc7CisJCQkJZGVidWcyKCJjaGFubmVsICVkOiBpbnB1dCBkcmFpbmluZy4iLCBjLT5zZWxmKTsKKwkJCX0gZWxzZSB7CisJCQkJY2hhbl9yZWFkX2ZhaWxlZChjKTsKKwkJCX0KKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoYy0+aW5wdXRfZmlsdGVyICE9IE5VTEwpIHsKKwkJCWlmIChjLT5pbnB1dF9maWx0ZXIoYywgYnVmLCBsZW4pID09IC0xKSB7CisJCQkJZGVidWcyKCJjaGFubmVsICVkOiBmaWx0ZXIgc3RvcHMiLCBjLT5zZWxmKTsKKwkJCQljaGFuX3JlYWRfZmFpbGVkKGMpOworCQkJfQorCQl9IGVsc2UgaWYgKGMtPmRhdGFncmFtKSB7CisJCQlidWZmZXJfcHV0X3N0cmluZygmYy0+aW5wdXQsIGJ1ZiwgbGVuKTsKKwkJfSBlbHNlIHsKKwkJCWJ1ZmZlcl9hcHBlbmQoJmMtPmlucHV0LCBidWYsIGxlbik7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgaW50CitjaGFubmVsX2hhbmRsZV93ZmQoQ2hhbm5lbCAqYywgZmRfc2V0ICpyZWFkc2V0LCBmZF9zZXQgKndyaXRlc2V0KQoreworCXN0cnVjdCB0ZXJtaW9zIHRpbzsKKwl1X2NoYXIgKmRhdGEgPSBOVUxMLCAqYnVmOworCXVfaW50IGRsZW4sIG9sZW4gPSAwOworCWludCBsZW47CisKKwkvKiBTZW5kIGJ1ZmZlcmVkIG91dHB1dCBkYXRhIHRvIHRoZSBzb2NrZXQuICovCisJaWYgKGMtPndmZCAhPSAtMSAmJgorCSAgICBGRF9JU1NFVChjLT53ZmQsIHdyaXRlc2V0KSAmJgorCSAgICBidWZmZXJfbGVuKCZjLT5vdXRwdXQpID4gMCkgeworCQlvbGVuID0gYnVmZmVyX2xlbigmYy0+b3V0cHV0KTsKKwkJaWYgKGMtPm91dHB1dF9maWx0ZXIgIT0gTlVMTCkgeworCQkJaWYgKChidWYgPSBjLT5vdXRwdXRfZmlsdGVyKGMsICZkYXRhLCAmZGxlbikpID09IE5VTEwpIHsKKwkJCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IGZpbHRlciBzdG9wcyIsIGMtPnNlbGYpOworCQkJCWlmIChjLT50eXBlICE9IFNTSF9DSEFOTkVMX09QRU4pCisJCQkJCWNoYW5fbWFya19kZWFkKGMpOworCQkJCWVsc2UKKwkJCQkJY2hhbl93cml0ZV9mYWlsZWQoYyk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKGMtPmRhdGFncmFtKSB7CisJCQlidWYgPSBkYXRhID0gYnVmZmVyX2dldF9zdHJpbmcoJmMtPm91dHB1dCwgJmRsZW4pOworCQl9IGVsc2UgeworCQkJYnVmID0gZGF0YSA9IGJ1ZmZlcl9wdHIoJmMtPm91dHB1dCk7CisJCQlkbGVuID0gYnVmZmVyX2xlbigmYy0+b3V0cHV0KTsKKwkJfQorCisJCWlmIChjLT5kYXRhZ3JhbSkgeworCQkJLyogaWdub3JlIHRydW5jYXRlZCB3cml0ZXMsIGRhdGFncmFtcyBtaWdodCBnZXQgbG9zdCAqLworCQkJbGVuID0gd3JpdGUoYy0+d2ZkLCBidWYsIGRsZW4pOworCQkJeGZyZWUoZGF0YSk7CisJCQlpZiAobGVuIDwgMCAmJiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOIHx8CisJCQkgICAgZXJybm8gPT0gRVdPVUxEQkxPQ0spKQorCQkJCXJldHVybiAxOworCQkJaWYgKGxlbiA8PSAwKSB7CisJCQkJaWYgKGMtPnR5cGUgIT0gU1NIX0NIQU5ORUxfT1BFTikKKwkJCQkJY2hhbl9tYXJrX2RlYWQoYyk7CisJCQkJZWxzZQorCQkJCQljaGFuX3dyaXRlX2ZhaWxlZChjKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlnb3RvIG91dDsKKwkJfQorI2lmZGVmIF9BSVgKKwkJLyogWFhYOiBMYXRlciBBSVggdmVyc2lvbnMgY2FuJ3QgcHVzaCBhcyBtdWNoIGRhdGEgdG8gdHR5ICovCisJCWlmIChjb21wYXQyMCAmJiBjLT53ZmRfaXNhdHR5KQorCQkJZGxlbiA9IE1JTihkbGVuLCA4KjEwMjQpOworI2VuZGlmCisKKwkJbGVuID0gd3JpdGUoYy0+d2ZkLCBidWYsIGRsZW4pOworCQlpZiAobGVuIDwgMCAmJgorCQkgICAgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykpCisJCQlyZXR1cm4gMTsKKwkJaWYgKGxlbiA8PSAwKSB7CisJCQlpZiAoYy0+dHlwZSAhPSBTU0hfQ0hBTk5FTF9PUEVOKSB7CisJCQkJZGVidWcyKCJjaGFubmVsICVkOiBub3Qgb3BlbiIsIGMtPnNlbGYpOworCQkJCWNoYW5fbWFya19kZWFkKGMpOworCQkJCXJldHVybiAtMTsKKwkJCX0gZWxzZSBpZiAoY29tcGF0MTMpIHsKKwkJCQlidWZmZXJfY2xlYXIoJmMtPm91dHB1dCk7CisJCQkJZGVidWcyKCJjaGFubmVsICVkOiBpbnB1dCBkcmFpbmluZy4iLCBjLT5zZWxmKTsKKwkJCQljLT50eXBlID0gU1NIX0NIQU5ORUxfSU5QVVRfRFJBSU5JTkc7CisJCQl9IGVsc2UgeworCQkJCWNoYW5fd3JpdGVfZmFpbGVkKGMpOworCQkJfQorCQkJcmV0dXJuIC0xOworCQl9CisjaWZuZGVmIEJST0tFTl9UQ0dFVEFUVFJfSUNBTk9OCisJCWlmIChjb21wYXQyMCAmJiBjLT5pc2F0dHkgJiYgZGxlbiA+PSAxICYmIGJ1ZlswXSAhPSAnXHInKSB7CisJCQlpZiAodGNnZXRhdHRyKGMtPndmZCwgJnRpbykgPT0gMCAmJgorCQkJICAgICEodGlvLmNfbGZsYWcgJiBFQ0hPKSAmJiAodGlvLmNfbGZsYWcgJiBJQ0FOT04pKSB7CisJCQkJLyoKKwkJCQkgKiBTaW11bGF0ZSBlY2hvIHRvIHJlZHVjZSB0aGUgaW1wYWN0IG9mCisJCQkJICogdHJhZmZpYyBhbmFseXNpcy4gV2UgbmVlZCB0byBtYXRjaCB0aGUKKwkJCQkgKiBzaXplIG9mIGEgU1NIMl9NU0dfQ0hBTk5FTF9EQVRBIG1lc3NhZ2UKKwkJCQkgKiAoNCBieXRlIGNoYW5uZWwgaWQgKyBidWYpCisJCQkJICovCisJCQkJcGFja2V0X3NlbmRfaWdub3JlKDQgKyBsZW4pOworCQkJCXBhY2tldF9zZW5kKCk7CisJCQl9CisJCX0KKyNlbmRpZgorCQlidWZmZXJfY29uc3VtZSgmYy0+b3V0cHV0LCBsZW4pOworCX0KKyBvdXQ6CisJaWYgKGNvbXBhdDIwICYmIG9sZW4gPiAwKQorCQljLT5sb2NhbF9jb25zdW1lZCArPSBvbGVuIC0gYnVmZmVyX2xlbigmYy0+b3V0cHV0KTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorY2hhbm5lbF9oYW5kbGVfZWZkKENoYW5uZWwgKmMsIGZkX3NldCAqcmVhZHNldCwgZmRfc2V0ICp3cml0ZXNldCkKK3sKKwljaGFyIGJ1ZltDSEFOX1JCVUZdOworCWludCBsZW47CisKKy8qKiBYWFggaGFuZGxlIGRyYWluIGVmZCwgdG9vICovCisJaWYgKGMtPmVmZCAhPSAtMSkgeworCQlpZiAoYy0+ZXh0ZW5kZWRfdXNhZ2UgPT0gQ0hBTl9FWFRFTkRFRF9XUklURSAmJgorCQkgICAgRkRfSVNTRVQoYy0+ZWZkLCB3cml0ZXNldCkgJiYKKwkJICAgIGJ1ZmZlcl9sZW4oJmMtPmV4dGVuZGVkKSA+IDApIHsKKwkJCWxlbiA9IHdyaXRlKGMtPmVmZCwgYnVmZmVyX3B0cigmYy0+ZXh0ZW5kZWQpLAorCQkJICAgIGJ1ZmZlcl9sZW4oJmMtPmV4dGVuZGVkKSk7CisJCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IHdyaXR0ZW4gJWQgdG8gZWZkICVkIiwKKwkJCSAgICBjLT5zZWxmLCBsZW4sIGMtPmVmZCk7CisJCQlpZiAobGVuIDwgMCAmJiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOIHx8CisJCQkgICAgZXJybm8gPT0gRVdPVUxEQkxPQ0spKQorCQkJCXJldHVybiAxOworCQkJaWYgKGxlbiA8PSAwKSB7CisJCQkJZGVidWcyKCJjaGFubmVsICVkOiBjbG9zaW5nIHdyaXRlLWVmZCAlZCIsCisJCQkJICAgIGMtPnNlbGYsIGMtPmVmZCk7CisJCQkJY2hhbm5lbF9jbG9zZV9mZCgmYy0+ZWZkKTsKKwkJCX0gZWxzZSB7CisJCQkJYnVmZmVyX2NvbnN1bWUoJmMtPmV4dGVuZGVkLCBsZW4pOworCQkJCWMtPmxvY2FsX2NvbnN1bWVkICs9IGxlbjsKKwkJCX0KKwkJfSBlbHNlIGlmIChjLT5lZmQgIT0gLTEgJiYKKwkJICAgIChjLT5leHRlbmRlZF91c2FnZSA9PSBDSEFOX0VYVEVOREVEX1JFQUQgfHwKKwkJICAgIGMtPmV4dGVuZGVkX3VzYWdlID09IENIQU5fRVhURU5ERURfSUdOT1JFKSAmJgorCQkgICAgKGMtPmRldGFjaF9jbG9zZSB8fCBGRF9JU1NFVChjLT5lZmQsIHJlYWRzZXQpKSkgeworCQkJbGVuID0gcmVhZChjLT5lZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQkJZGVidWcyKCJjaGFubmVsICVkOiByZWFkICVkIGZyb20gZWZkICVkIiwKKwkJCSAgICBjLT5zZWxmLCBsZW4sIGMtPmVmZCk7CisJCQlpZiAobGVuIDwgMCAmJiAoZXJybm8gPT0gRUlOVFIgfHwgKChlcnJubyA9PSBFQUdBSU4gfHwKKwkJCSAgICBlcnJubyA9PSBFV09VTERCTE9DSykgJiYgIWMtPmRldGFjaF9jbG9zZSkpKQorCQkJCXJldHVybiAxOworCQkJaWYgKGxlbiA8PSAwKSB7CisJCQkJZGVidWcyKCJjaGFubmVsICVkOiBjbG9zaW5nIHJlYWQtZWZkICVkIiwKKwkJCQkgICAgYy0+c2VsZiwgYy0+ZWZkKTsKKwkJCQljaGFubmVsX2Nsb3NlX2ZkKCZjLT5lZmQpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoYy0+ZXh0ZW5kZWRfdXNhZ2UgPT0gQ0hBTl9FWFRFTkRFRF9JR05PUkUpIHsKKwkJCQkJZGVidWczKCJjaGFubmVsICVkOiBkaXNjYXJkIGVmZCIsCisJCQkJCSAgICBjLT5zZWxmKTsKKwkJCQl9IGVsc2UKKwkJCQkJYnVmZmVyX2FwcGVuZCgmYy0+ZXh0ZW5kZWQsIGJ1ZiwgbGVuKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorY2hhbm5lbF9jaGVja193aW5kb3coQ2hhbm5lbCAqYykKK3sKKwlpZiAoYy0+dHlwZSA9PSBTU0hfQ0hBTk5FTF9PUEVOICYmCisJICAgICEoYy0+ZmxhZ3MgJiAoQ0hBTl9DTE9TRV9TRU5UfENIQU5fQ0xPU0VfUkNWRCkpICYmCisJICAgICgoYy0+bG9jYWxfd2luZG93X21heCAtIGMtPmxvY2FsX3dpbmRvdyA+CisJICAgIGMtPmxvY2FsX21heHBhY2tldCozKSB8fAorCSAgICBjLT5sb2NhbF93aW5kb3cgPCBjLT5sb2NhbF93aW5kb3dfbWF4LzIpICYmCisJICAgIGMtPmxvY2FsX2NvbnN1bWVkID4gMCkgeworCQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfQ0hBTk5FTF9XSU5ET1dfQURKVVNUKTsKKwkJcGFja2V0X3B1dF9pbnQoYy0+cmVtb3RlX2lkKTsKKwkJcGFja2V0X3B1dF9pbnQoYy0+bG9jYWxfY29uc3VtZWQpOworCQlwYWNrZXRfc2VuZCgpOworCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IHdpbmRvdyAlZCBzZW50IGFkanVzdCAlZCIsCisJCSAgICBjLT5zZWxmLCBjLT5sb2NhbF93aW5kb3csCisJCSAgICBjLT5sb2NhbF9jb25zdW1lZCk7CisJCWMtPmxvY2FsX3dpbmRvdyArPSBjLT5sb2NhbF9jb25zdW1lZDsKKwkJYy0+bG9jYWxfY29uc3VtZWQgPSAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK2NoYW5uZWxfcG9zdF9vcGVuKENoYW5uZWwgKmMsIGZkX3NldCAqcmVhZHNldCwgZmRfc2V0ICp3cml0ZXNldCkKK3sKKwljaGFubmVsX2hhbmRsZV9yZmQoYywgcmVhZHNldCwgd3JpdGVzZXQpOworCWNoYW5uZWxfaGFuZGxlX3dmZChjLCByZWFkc2V0LCB3cml0ZXNldCk7CisJaWYgKCFjb21wYXQyMCkKKwkJcmV0dXJuOworCWNoYW5uZWxfaGFuZGxlX2VmZChjLCByZWFkc2V0LCB3cml0ZXNldCk7CisJY2hhbm5lbF9jaGVja193aW5kb3coYyk7Cit9CisKK3N0YXRpYyB1X2ludAorcmVhZF9tdXgoQ2hhbm5lbCAqYywgdV9pbnQgbmVlZCkKK3sKKwljaGFyIGJ1ZltDSEFOX1JCVUZdOworCWludCBsZW47CisJdV9pbnQgcmxlbjsKKworCWlmIChidWZmZXJfbGVuKCZjLT5pbnB1dCkgPCBuZWVkKSB7CisJCXJsZW4gPSBuZWVkIC0gYnVmZmVyX2xlbigmYy0+aW5wdXQpOworCQlsZW4gPSByZWFkKGMtPnJmZCwgYnVmLCBNSU4ocmxlbiwgQ0hBTl9SQlVGKSk7CisJCWlmIChsZW4gPD0gMCkgeworCQkJaWYgKGVycm5vICE9IEVJTlRSICYmIGVycm5vICE9IEVBR0FJTikgeworCQkJCWRlYnVnMigiY2hhbm5lbCAlZDogY3RsIHJlYWQ8PTAgcmZkICVkIGxlbiAlZCIsCisJCQkJICAgIGMtPnNlbGYsIGMtPnJmZCwgbGVuKTsKKwkJCQljaGFuX3JlYWRfZmFpbGVkKGMpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9IGVsc2UKKwkJCWJ1ZmZlcl9hcHBlbmQoJmMtPmlucHV0LCBidWYsIGxlbik7CisJfQorCXJldHVybiBidWZmZXJfbGVuKCZjLT5pbnB1dCk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGFubmVsX3Bvc3RfbXV4X2NsaWVudChDaGFubmVsICpjLCBmZF9zZXQgKnJlYWRzZXQsIGZkX3NldCAqd3JpdGVzZXQpCit7CisJdV9pbnQgbmVlZDsKKwlzc2l6ZV90IGxlbjsKKworCWlmICghY29tcGF0MjApCisJCWZhdGFsKCIlczogZW50ZXJlZCB3aXRoICFjb21wYXQyMCIsIF9fZnVuY19fKTsKKworCWlmIChjLT5yZmQgIT0gLTEgJiYgIWMtPm11eF9wYXVzZSAmJiBGRF9JU1NFVChjLT5yZmQsIHJlYWRzZXQpICYmCisJICAgIChjLT5pc3RhdGUgPT0gQ0hBTl9JTlBVVF9PUEVOIHx8CisJICAgIGMtPmlzdGF0ZSA9PSBDSEFOX0lOUFVUX1dBSVRfRFJBSU4pKSB7CisJCS8qCisJCSAqIERvbid0IG5vdCByZWFkIHBhc3QgdGhlIHByZWNpc2UgZW5kIG9mIHBhY2tldHMgdG8KKwkJICogYXZvaWQgZGlzcnVwdGluZyBmZCBwYXNzaW5nLgorCQkgKi8KKwkJaWYgKHJlYWRfbXV4KGMsIDQpIDwgNCkgLyogcmVhZCBoZWFkZXIgKi8KKwkJCXJldHVybjsKKwkJbmVlZCA9IGdldF91MzIoYnVmZmVyX3B0cigmYy0+aW5wdXQpKTsKKyNkZWZpbmUgQ0hBTk5FTF9NVVhfTUFYX1BBQ0tFVAkoMjU2ICogMTAyNCkKKwkJaWYgKG5lZWQgPiBDSEFOTkVMX01VWF9NQVhfUEFDS0VUKSB7CisJCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IHBhY2tldCB0b28gYmlnICV1ID4gJXUiLAorCQkJICAgIGMtPnNlbGYsIENIQU5ORUxfTVVYX01BWF9QQUNLRVQsIG5lZWQpOworCQkJY2hhbl9yY3ZkX29jbG9zZShjKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAocmVhZF9tdXgoYywgbmVlZCArIDQpIDwgbmVlZCArIDQpIC8qIHJlYWQgYm9keSAqLworCQkJcmV0dXJuOworCQlpZiAoYy0+bXV4X3JjYihjKSAhPSAwKSB7CisJCQlkZWJ1ZygiY2hhbm5lbCAlZDogbXV4X3JjYiBmYWlsZWQiLCBjLT5zZWxmKTsKKwkJCWNoYW5fbWFya19kZWFkKGMpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKGMtPndmZCAhPSAtMSAmJiBGRF9JU1NFVChjLT53ZmQsIHdyaXRlc2V0KSAmJgorCSAgICBidWZmZXJfbGVuKCZjLT5vdXRwdXQpID4gMCkgeworCQlsZW4gPSB3cml0ZShjLT53ZmQsIGJ1ZmZlcl9wdHIoJmMtPm91dHB1dCksCisJCSAgICBidWZmZXJfbGVuKCZjLT5vdXRwdXQpKTsKKwkJaWYgKGxlbiA8IDAgJiYgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTikpCisJCQlyZXR1cm47CisJCWlmIChsZW4gPD0gMCkgeworCQkJY2hhbl9tYXJrX2RlYWQoYyk7CisJCQlyZXR1cm47CisJCX0KKwkJYnVmZmVyX2NvbnN1bWUoJmMtPm91dHB1dCwgbGVuKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjaGFubmVsX3Bvc3RfbXV4X2xpc3RlbmVyKENoYW5uZWwgKmMsIGZkX3NldCAqcmVhZHNldCwgZmRfc2V0ICp3cml0ZXNldCkKK3sKKwlDaGFubmVsICpuYzsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOworCXNvY2tsZW5fdCBhZGRybGVuOworCWludCBuZXdzb2NrOworCXVpZF90IGV1aWQ7CisJZ2lkX3QgZWdpZDsKKworCWlmICghRkRfSVNTRVQoYy0+c29jaywgcmVhZHNldCkpCisJCXJldHVybjsKKworCWRlYnVnKCJtdWx0aXBsZXhpbmcgY29udHJvbCBjb25uZWN0aW9uIik7CisKKwkvKgorCSAqIEFjY2VwdCBjb25uZWN0aW9uIG9uIGNvbnRyb2wgc29ja2V0CisJICovCisJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCWFkZHJsZW4gPSBzaXplb2YoYWRkcik7CisJaWYgKChuZXdzb2NrID0gYWNjZXB0KGMtPnNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyLAorCSAgICAmYWRkcmxlbikpID09IC0xKSB7CisJCWVycm9yKCIlcyBhY2NlcHQ6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZ2V0cGVlcmVpZChuZXdzb2NrLCAmZXVpZCwgJmVnaWQpIDwgMCkgeworCQllcnJvcigiJXMgZ2V0cGVlcmVpZCBmYWlsZWQ6ICVzIiwgX19mdW5jX18sCisJCSAgICBzdHJlcnJvcihlcnJubykpOworCQljbG9zZShuZXdzb2NrKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoKGV1aWQgIT0gMCkgJiYgKGdldHVpZCgpICE9IGV1aWQpKSB7CisJCWVycm9yKCJtdWx0aXBsZXggdWlkIG1pc21hdGNoOiBwZWVyIGV1aWQgJXUgIT0gdWlkICV1IiwKKwkJICAgICh1X2ludClldWlkLCAodV9pbnQpZ2V0dWlkKCkpOworCQljbG9zZShuZXdzb2NrKTsKKwkJcmV0dXJuOworCX0KKwluYyA9IGNoYW5uZWxfbmV3KCJtdWx0aXBsZXggY2xpZW50IiwgU1NIX0NIQU5ORUxfTVVYX0NMSUVOVCwKKwkgICAgbmV3c29jaywgbmV3c29jaywgLTEsIGMtPmxvY2FsX3dpbmRvd19tYXgsCisJICAgIGMtPmxvY2FsX21heHBhY2tldCwgMCwgIm11eC1jb250cm9sIiwgMSk7CisJbmMtPm11eF9yY2IgPSBjLT5tdXhfcmNiOworCWRlYnVnMygiJXM6IG5ldyBtdXggY2hhbm5lbCAlZCBmZCAlZCIsIF9fZnVuY19fLAorCSAgICBuYy0+c2VsZiwgbmMtPnNvY2spOworCS8qIGVzdGFibGlzaCBzdGF0ZSAqLworCW5jLT5tdXhfcmNiKG5jKTsKKwkvKiBtdXggc3RhdGUgdHJhbnNpdGlvbnMgbXVzdCBub3QgZWxpY2l0IHByb3RvY29sIG1lc3NhZ2VzICovCisJbmMtPmZsYWdzIHw9IENIQU5fTE9DQUw7Cit9CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorY2hhbm5lbF9wb3N0X291dHB1dF9kcmFpbl8xMyhDaGFubmVsICpjLCBmZF9zZXQgKnJlYWRzZXQsIGZkX3NldCAqd3JpdGVzZXQpCit7CisJaW50IGxlbjsKKworCS8qIFNlbmQgYnVmZmVyZWQgb3V0cHV0IGRhdGEgdG8gdGhlIHNvY2tldC4gKi8KKwlpZiAoRkRfSVNTRVQoYy0+c29jaywgd3JpdGVzZXQpICYmIGJ1ZmZlcl9sZW4oJmMtPm91dHB1dCkgPiAwKSB7CisJCWxlbiA9IHdyaXRlKGMtPnNvY2ssIGJ1ZmZlcl9wdHIoJmMtPm91dHB1dCksCisJCQkgICAgYnVmZmVyX2xlbigmYy0+b3V0cHV0KSk7CisJCWlmIChsZW4gPD0gMCkKKwkJCWJ1ZmZlcl9jbGVhcigmYy0+b3V0cHV0KTsKKwkJZWxzZQorCQkJYnVmZmVyX2NvbnN1bWUoJmMtPm91dHB1dCwgbGVuKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjaGFubmVsX2hhbmRsZXJfaW5pdF8yMCh2b2lkKQoreworCWNoYW5uZWxfcHJlW1NTSF9DSEFOTkVMX09QRU5dID0JCQkmY2hhbm5lbF9wcmVfb3BlbjsKKwljaGFubmVsX3ByZVtTU0hfQ0hBTk5FTF9YMTFfT1BFTl0gPQkJJmNoYW5uZWxfcHJlX3gxMV9vcGVuOworCWNoYW5uZWxfcHJlW1NTSF9DSEFOTkVMX1BPUlRfTElTVEVORVJdID0JJmNoYW5uZWxfcHJlX2xpc3RlbmVyOworCWNoYW5uZWxfcHJlW1NTSF9DSEFOTkVMX1JQT1JUX0xJU1RFTkVSXSA9CSZjaGFubmVsX3ByZV9saXN0ZW5lcjsKKwljaGFubmVsX3ByZVtTU0hfQ0hBTk5FTF9YMTFfTElTVEVORVJdID0JCSZjaGFubmVsX3ByZV9saXN0ZW5lcjsKKwljaGFubmVsX3ByZVtTU0hfQ0hBTk5FTF9BVVRIX1NPQ0tFVF0gPQkJJmNoYW5uZWxfcHJlX2xpc3RlbmVyOworCWNoYW5uZWxfcHJlW1NTSF9DSEFOTkVMX0NPTk5FQ1RJTkddID0JCSZjaGFubmVsX3ByZV9jb25uZWN0aW5nOworCWNoYW5uZWxfcHJlW1NTSF9DSEFOTkVMX0RZTkFNSUNdID0JCSZjaGFubmVsX3ByZV9keW5hbWljOworCWNoYW5uZWxfcHJlW1NTSF9DSEFOTkVMX01VWF9MSVNURU5FUl0gPQkJJmNoYW5uZWxfcHJlX2xpc3RlbmVyOworCWNoYW5uZWxfcHJlW1NTSF9DSEFOTkVMX01VWF9DTElFTlRdID0JCSZjaGFubmVsX3ByZV9tdXhfY2xpZW50OworCisJY2hhbm5lbF9wb3N0W1NTSF9DSEFOTkVMX09QRU5dID0JCSZjaGFubmVsX3Bvc3Rfb3BlbjsKKwljaGFubmVsX3Bvc3RbU1NIX0NIQU5ORUxfUE9SVF9MSVNURU5FUl0gPQkmY2hhbm5lbF9wb3N0X3BvcnRfbGlzdGVuZXI7CisJY2hhbm5lbF9wb3N0W1NTSF9DSEFOTkVMX1JQT1JUX0xJU1RFTkVSXSA9CSZjaGFubmVsX3Bvc3RfcG9ydF9saXN0ZW5lcjsKKwljaGFubmVsX3Bvc3RbU1NIX0NIQU5ORUxfWDExX0xJU1RFTkVSXSA9CSZjaGFubmVsX3Bvc3RfeDExX2xpc3RlbmVyOworCWNoYW5uZWxfcG9zdFtTU0hfQ0hBTk5FTF9BVVRIX1NPQ0tFVF0gPQkJJmNoYW5uZWxfcG9zdF9hdXRoX2xpc3RlbmVyOworCWNoYW5uZWxfcG9zdFtTU0hfQ0hBTk5FTF9DT05ORUNUSU5HXSA9CQkmY2hhbm5lbF9wb3N0X2Nvbm5lY3Rpbmc7CisJY2hhbm5lbF9wb3N0W1NTSF9DSEFOTkVMX0RZTkFNSUNdID0JCSZjaGFubmVsX3Bvc3Rfb3BlbjsKKwljaGFubmVsX3Bvc3RbU1NIX0NIQU5ORUxfTVVYX0xJU1RFTkVSXSA9CSZjaGFubmVsX3Bvc3RfbXV4X2xpc3RlbmVyOworCWNoYW5uZWxfcG9zdFtTU0hfQ0hBTk5FTF9NVVhfQ0xJRU5UXSA9CQkmY2hhbm5lbF9wb3N0X211eF9jbGllbnQ7Cit9CisKK3N0YXRpYyB2b2lkCitjaGFubmVsX2hhbmRsZXJfaW5pdF8xMyh2b2lkKQoreworCWNoYW5uZWxfcHJlW1NTSF9DSEFOTkVMX09QRU5dID0JCQkmY2hhbm5lbF9wcmVfb3Blbl8xMzsKKwljaGFubmVsX3ByZVtTU0hfQ0hBTk5FTF9YMTFfT1BFTl0gPQkJJmNoYW5uZWxfcHJlX3gxMV9vcGVuXzEzOworCWNoYW5uZWxfcHJlW1NTSF9DSEFOTkVMX1gxMV9MSVNURU5FUl0gPQkJJmNoYW5uZWxfcHJlX2xpc3RlbmVyOworCWNoYW5uZWxfcHJlW1NTSF9DSEFOTkVMX1BPUlRfTElTVEVORVJdID0JJmNoYW5uZWxfcHJlX2xpc3RlbmVyOworCWNoYW5uZWxfcHJlW1NTSF9DSEFOTkVMX0FVVEhfU09DS0VUXSA9CQkmY2hhbm5lbF9wcmVfbGlzdGVuZXI7CisJY2hhbm5lbF9wcmVbU1NIX0NIQU5ORUxfSU5QVVRfRFJBSU5JTkddID0JJmNoYW5uZWxfcHJlX2lucHV0X2RyYWluaW5nOworCWNoYW5uZWxfcHJlW1NTSF9DSEFOTkVMX09VVFBVVF9EUkFJTklOR10gPQkmY2hhbm5lbF9wcmVfb3V0cHV0X2RyYWluaW5nOworCWNoYW5uZWxfcHJlW1NTSF9DSEFOTkVMX0NPTk5FQ1RJTkddID0JCSZjaGFubmVsX3ByZV9jb25uZWN0aW5nOworCWNoYW5uZWxfcHJlW1NTSF9DSEFOTkVMX0RZTkFNSUNdID0JCSZjaGFubmVsX3ByZV9keW5hbWljOworCisJY2hhbm5lbF9wb3N0W1NTSF9DSEFOTkVMX09QRU5dID0JCSZjaGFubmVsX3Bvc3Rfb3BlbjsKKwljaGFubmVsX3Bvc3RbU1NIX0NIQU5ORUxfWDExX0xJU1RFTkVSXSA9CSZjaGFubmVsX3Bvc3RfeDExX2xpc3RlbmVyOworCWNoYW5uZWxfcG9zdFtTU0hfQ0hBTk5FTF9QT1JUX0xJU1RFTkVSXSA9CSZjaGFubmVsX3Bvc3RfcG9ydF9saXN0ZW5lcjsKKwljaGFubmVsX3Bvc3RbU1NIX0NIQU5ORUxfQVVUSF9TT0NLRVRdID0JCSZjaGFubmVsX3Bvc3RfYXV0aF9saXN0ZW5lcjsKKwljaGFubmVsX3Bvc3RbU1NIX0NIQU5ORUxfT1VUUFVUX0RSQUlOSU5HXSA9CSZjaGFubmVsX3Bvc3Rfb3V0cHV0X2RyYWluXzEzOworCWNoYW5uZWxfcG9zdFtTU0hfQ0hBTk5FTF9DT05ORUNUSU5HXSA9CQkmY2hhbm5lbF9wb3N0X2Nvbm5lY3Rpbmc7CisJY2hhbm5lbF9wb3N0W1NTSF9DSEFOTkVMX0RZTkFNSUNdID0JCSZjaGFubmVsX3Bvc3Rfb3BlbjsKK30KKworc3RhdGljIHZvaWQKK2NoYW5uZWxfaGFuZGxlcl9pbml0XzE1KHZvaWQpCit7CisJY2hhbm5lbF9wcmVbU1NIX0NIQU5ORUxfT1BFTl0gPQkJCSZjaGFubmVsX3ByZV9vcGVuOworCWNoYW5uZWxfcHJlW1NTSF9DSEFOTkVMX1gxMV9PUEVOXSA9CQkmY2hhbm5lbF9wcmVfeDExX29wZW47CisJY2hhbm5lbF9wcmVbU1NIX0NIQU5ORUxfWDExX0xJU1RFTkVSXSA9CQkmY2hhbm5lbF9wcmVfbGlzdGVuZXI7CisJY2hhbm5lbF9wcmVbU1NIX0NIQU5ORUxfUE9SVF9MSVNURU5FUl0gPQkmY2hhbm5lbF9wcmVfbGlzdGVuZXI7CisJY2hhbm5lbF9wcmVbU1NIX0NIQU5ORUxfQVVUSF9TT0NLRVRdID0JCSZjaGFubmVsX3ByZV9saXN0ZW5lcjsKKwljaGFubmVsX3ByZVtTU0hfQ0hBTk5FTF9DT05ORUNUSU5HXSA9CQkmY2hhbm5lbF9wcmVfY29ubmVjdGluZzsKKwljaGFubmVsX3ByZVtTU0hfQ0hBTk5FTF9EWU5BTUlDXSA9CQkmY2hhbm5lbF9wcmVfZHluYW1pYzsKKworCWNoYW5uZWxfcG9zdFtTU0hfQ0hBTk5FTF9YMTFfTElTVEVORVJdID0JJmNoYW5uZWxfcG9zdF94MTFfbGlzdGVuZXI7CisJY2hhbm5lbF9wb3N0W1NTSF9DSEFOTkVMX1BPUlRfTElTVEVORVJdID0JJmNoYW5uZWxfcG9zdF9wb3J0X2xpc3RlbmVyOworCWNoYW5uZWxfcG9zdFtTU0hfQ0hBTk5FTF9BVVRIX1NPQ0tFVF0gPQkJJmNoYW5uZWxfcG9zdF9hdXRoX2xpc3RlbmVyOworCWNoYW5uZWxfcG9zdFtTU0hfQ0hBTk5FTF9PUEVOXSA9CQkmY2hhbm5lbF9wb3N0X29wZW47CisJY2hhbm5lbF9wb3N0W1NTSF9DSEFOTkVMX0NPTk5FQ1RJTkddID0JCSZjaGFubmVsX3Bvc3RfY29ubmVjdGluZzsKKwljaGFubmVsX3Bvc3RbU1NIX0NIQU5ORUxfRFlOQU1JQ10gPQkJJmNoYW5uZWxfcG9zdF9vcGVuOworfQorCitzdGF0aWMgdm9pZAorY2hhbm5lbF9oYW5kbGVyX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTU0hfQ0hBTk5FTF9NQVhfVFlQRTsgaSsrKSB7CisJCWNoYW5uZWxfcHJlW2ldID0gTlVMTDsKKwkJY2hhbm5lbF9wb3N0W2ldID0gTlVMTDsKKwl9CisJaWYgKGNvbXBhdDIwKQorCQljaGFubmVsX2hhbmRsZXJfaW5pdF8yMCgpOworCWVsc2UgaWYgKGNvbXBhdDEzKQorCQljaGFubmVsX2hhbmRsZXJfaW5pdF8xMygpOworCWVsc2UKKwkJY2hhbm5lbF9oYW5kbGVyX2luaXRfMTUoKTsKK30KKworLyogZ2MgZGVhZCBjaGFubmVscyAqLworc3RhdGljIHZvaWQKK2NoYW5uZWxfZ2FyYmFnZV9jb2xsZWN0KENoYW5uZWwgKmMpCit7CisJaWYgKGMgPT0gTlVMTCkKKwkJcmV0dXJuOworCWlmIChjLT5kZXRhY2hfdXNlciAhPSBOVUxMKSB7CisJCWlmICghY2hhbl9pc19kZWFkKGMsIGMtPmRldGFjaF9jbG9zZSkpCisJCQlyZXR1cm47CisJCWRlYnVnMigiY2hhbm5lbCAlZDogZ2M6IG5vdGlmeSB1c2VyIiwgYy0+c2VsZik7CisJCWMtPmRldGFjaF91c2VyKGMtPnNlbGYsIE5VTEwpOworCQkvKiBpZiB3ZSBzdGlsbCBoYXZlIGEgY2FsbGJhY2sgKi8KKwkJaWYgKGMtPmRldGFjaF91c2VyICE9IE5VTEwpCisJCQlyZXR1cm47CisJCWRlYnVnMigiY2hhbm5lbCAlZDogZ2M6IHVzZXIgZGV0YWNoZWQiLCBjLT5zZWxmKTsKKwl9CisJaWYgKCFjaGFuX2lzX2RlYWQoYywgMSkpCisJCXJldHVybjsKKwlkZWJ1ZzIoImNoYW5uZWwgJWQ6IGdhcmJhZ2UgY29sbGVjdGluZyIsIGMtPnNlbGYpOworCWNoYW5uZWxfZnJlZShjKTsKK30KKworc3RhdGljIHZvaWQKK2NoYW5uZWxfaGFuZGxlcihjaGFuX2ZuICpmdGFiW10sIGZkX3NldCAqcmVhZHNldCwgZmRfc2V0ICp3cml0ZXNldCkKK3sKKwlzdGF0aWMgaW50IGRpZF9pbml0ID0gMDsKKwl1X2ludCBpLCBvYWxsb2M7CisJQ2hhbm5lbCAqYzsKKworCWlmICghZGlkX2luaXQpIHsKKwkJY2hhbm5lbF9oYW5kbGVyX2luaXQoKTsKKwkJZGlkX2luaXQgPSAxOworCX0KKwlmb3IgKGkgPSAwLCBvYWxsb2MgPSBjaGFubmVsc19hbGxvYzsgaSA8IG9hbGxvYzsgaSsrKSB7CisJCWMgPSBjaGFubmVsc1tpXTsKKwkJaWYgKGMgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlpZiAoYy0+ZGVsYXllZCkgeworCQkJaWYgKGZ0YWIgPT0gY2hhbm5lbF9wcmUpCisJCQkJYy0+ZGVsYXllZCA9IDA7CisJCQllbHNlCisJCQkJY29udGludWU7CisJCX0KKwkJaWYgKGZ0YWJbYy0+dHlwZV0gIT0gTlVMTCkKKwkJCSgqZnRhYltjLT50eXBlXSkoYywgcmVhZHNldCwgd3JpdGVzZXQpOworCQljaGFubmVsX2dhcmJhZ2VfY29sbGVjdChjKTsKKwl9Cit9CisKKy8qCisgKiBBbGxvY2F0ZS91cGRhdGUgc2VsZWN0IGJpdG1hc2tzIGFuZCBhZGQgYW55IGJpdHMgcmVsZXZhbnQgdG8gY2hhbm5lbHMgaW4KKyAqIHNlbGVjdCBiaXRtYXNrcy4KKyAqLwordm9pZAorY2hhbm5lbF9wcmVwYXJlX3NlbGVjdChmZF9zZXQgKipyZWFkc2V0cCwgZmRfc2V0ICoqd3JpdGVzZXRwLCBpbnQgKm1heGZkcCwKKyAgICB1X2ludCAqbmFsbG9jcCwgaW50IHJla2V5aW5nKQoreworCXVfaW50IG4sIHN6LCBuZmRzZXQ7CisKKwluID0gTUFYKCptYXhmZHAsIGNoYW5uZWxfbWF4X2ZkKTsKKworCW5mZHNldCA9IGhvd21hbnkobisxLCBORkRCSVRTKTsKKwkvKiBFeHBsaWNpdGx5IHRlc3QgaGVyZSwgYmVjYXVzZSB4cmVhbGxvYyBpc24ndCBhbHdheXMgY2FsbGVkICovCisJaWYgKG5mZHNldCAmJiBTSVpFX1RfTUFYIC8gbmZkc2V0IDwgc2l6ZW9mKGZkX21hc2spKQorCQlmYXRhbCgiY2hhbm5lbF9wcmVwYXJlX3NlbGVjdDogbWF4X2ZkICglZCkgaXMgdG9vIGxhcmdlIiwgbik7CisJc3ogPSBuZmRzZXQgKiBzaXplb2YoZmRfbWFzayk7CisKKwkvKiBwZXJoYXBzIGNoZWNrIHN6IDwgbmFsbG9jLzIgYW5kIHNocmluaz8gKi8KKwlpZiAoKnJlYWRzZXRwID09IE5VTEwgfHwgc3ogPiAqbmFsbG9jcCkgeworCQkqcmVhZHNldHAgPSB4cmVhbGxvYygqcmVhZHNldHAsIG5mZHNldCwgc2l6ZW9mKGZkX21hc2spKTsKKwkJKndyaXRlc2V0cCA9IHhyZWFsbG9jKCp3cml0ZXNldHAsIG5mZHNldCwgc2l6ZW9mKGZkX21hc2spKTsKKwkJKm5hbGxvY3AgPSBzejsKKwl9CisJKm1heGZkcCA9IG47CisJbWVtc2V0KCpyZWFkc2V0cCwgMCwgc3opOworCW1lbXNldCgqd3JpdGVzZXRwLCAwLCBzeik7CisKKwlpZiAoIXJla2V5aW5nKQorCQljaGFubmVsX2hhbmRsZXIoY2hhbm5lbF9wcmUsICpyZWFkc2V0cCwgKndyaXRlc2V0cCk7Cit9CisKKy8qCisgKiBBZnRlciBzZWxlY3QsIHBlcmZvcm0gYW55IGFwcHJvcHJpYXRlIG9wZXJhdGlvbnMgZm9yIGNoYW5uZWxzIHdoaWNoIGhhdmUKKyAqIGV2ZW50cyBwZW5kaW5nLgorICovCit2b2lkCitjaGFubmVsX2FmdGVyX3NlbGVjdChmZF9zZXQgKnJlYWRzZXQsIGZkX3NldCAqd3JpdGVzZXQpCit7CisJY2hhbm5lbF9oYW5kbGVyKGNoYW5uZWxfcG9zdCwgcmVhZHNldCwgd3JpdGVzZXQpOworfQorCisKKy8qIElmIHRoZXJlIGlzIGRhdGEgdG8gc2VuZCB0byB0aGUgY29ubmVjdGlvbiwgZW5xdWV1ZSBzb21lIG9mIGl0IG5vdy4gKi8KK3ZvaWQKK2NoYW5uZWxfb3V0cHV0X3BvbGwodm9pZCkKK3sKKwlDaGFubmVsICpjOworCXVfaW50IGksIGxlbjsKKworCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsc19hbGxvYzsgaSsrKSB7CisJCWMgPSBjaGFubmVsc1tpXTsKKwkJaWYgKGMgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gY2hhbm5lbHMgdGhhdCBjYW4gaGF2ZSBidWZmZXJlZAorCQkgKiBpbmNvbWluZyBkYXRhLgorCQkgKi8KKwkJaWYgKGNvbXBhdDEzKSB7CisJCQlpZiAoYy0+dHlwZSAhPSBTU0hfQ0hBTk5FTF9PUEVOICYmCisJCQkgICAgYy0+dHlwZSAhPSBTU0hfQ0hBTk5FTF9JTlBVVF9EUkFJTklORykKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCWlmIChjLT50eXBlICE9IFNTSF9DSEFOTkVMX09QRU4pCisJCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvbXBhdDIwICYmCisJCSAgICAoYy0+ZmxhZ3MgJiAoQ0hBTl9DTE9TRV9TRU5UfENIQU5fQ0xPU0VfUkNWRCkpKSB7CisJCQkvKiBYWFggaXMgdGhpcyB0cnVlPyAqLworCQkJZGVidWczKCJjaGFubmVsICVkOiB3aWxsIG5vdCBzZW5kIGRhdGEgYWZ0ZXIgY2xvc2UiLCBjLT5zZWxmKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogR2V0IHRoZSBhbW91bnQgb2YgYnVmZmVyZWQgZGF0YSBmb3IgdGhpcyBjaGFubmVsLiAqLworCQlpZiAoKGMtPmlzdGF0ZSA9PSBDSEFOX0lOUFVUX09QRU4gfHwKKwkJICAgIGMtPmlzdGF0ZSA9PSBDSEFOX0lOUFVUX1dBSVRfRFJBSU4pICYmCisJCSAgICAobGVuID0gYnVmZmVyX2xlbigmYy0+aW5wdXQpKSA+IDApIHsKKwkJCWlmIChjLT5kYXRhZ3JhbSkgeworCQkJCWlmIChsZW4gPiAwKSB7CisJCQkJCXVfY2hhciAqZGF0YTsKKwkJCQkJdV9pbnQgZGxlbjsKKworCQkJCQlkYXRhID0gYnVmZmVyX2dldF9zdHJpbmcoJmMtPmlucHV0LAorCQkJCQkgICAgJmRsZW4pOworCQkJCQlpZiAoZGxlbiA+IGMtPnJlbW90ZV93aW5kb3cgfHwKKwkJCQkJICAgIGRsZW4gPiBjLT5yZW1vdGVfbWF4cGFja2V0KSB7CisJCQkJCQlkZWJ1ZygiY2hhbm5lbCAlZDogZGF0YWdyYW0gIgorCQkJCQkJICAgICJ0b28gYmlnIGZvciBjaGFubmVsIiwKKwkJCQkJCSAgICBjLT5zZWxmKTsKKwkJCQkJCXhmcmVlKGRhdGEpOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0NIQU5ORUxfREFUQSk7CisJCQkJCXBhY2tldF9wdXRfaW50KGMtPnJlbW90ZV9pZCk7CisJCQkJCXBhY2tldF9wdXRfc3RyaW5nKGRhdGEsIGRsZW4pOworCQkJCQlwYWNrZXRfc2VuZCgpOworCQkJCQljLT5yZW1vdGVfd2luZG93IC09IGRsZW4gKyA0OworCQkJCQl4ZnJlZShkYXRhKTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKgorCQkJICogU2VuZCBzb21lIGRhdGEgZm9yIHRoZSBvdGhlciBzaWRlIG92ZXIgdGhlIHNlY3VyZQorCQkJICogY29ubmVjdGlvbi4KKwkJCSAqLworCQkJaWYgKGNvbXBhdDIwKSB7CisJCQkJaWYgKGxlbiA+IGMtPnJlbW90ZV93aW5kb3cpCisJCQkJCWxlbiA9IGMtPnJlbW90ZV93aW5kb3c7CisJCQkJaWYgKGxlbiA+IGMtPnJlbW90ZV9tYXhwYWNrZXQpCisJCQkJCWxlbiA9IGMtPnJlbW90ZV9tYXhwYWNrZXQ7CisJCQl9IGVsc2UgeworCQkJCWlmIChwYWNrZXRfaXNfaW50ZXJhY3RpdmUoKSkgeworCQkJCQlpZiAobGVuID4gMTAyNCkKKwkJCQkJCWxlbiA9IDUxMjsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBLZWVwIHRoZSBwYWNrZXRzIGF0IHJlYXNvbmFibGUgc2l6ZS4gKi8KKwkJCQkJaWYgKGxlbiA+IHBhY2tldF9nZXRfbWF4c2l6ZSgpLzIpCisJCQkJCQlsZW4gPSBwYWNrZXRfZ2V0X21heHNpemUoKS8yOworCQkJCX0KKwkJCX0KKwkJCWlmIChsZW4gPiAwKSB7CisJCQkJcGFja2V0X3N0YXJ0KGNvbXBhdDIwID8KKwkJCQkgICAgU1NIMl9NU0dfQ0hBTk5FTF9EQVRBIDogU1NIX01TR19DSEFOTkVMX0RBVEEpOworCQkJCXBhY2tldF9wdXRfaW50KGMtPnJlbW90ZV9pZCk7CisJCQkJcGFja2V0X3B1dF9zdHJpbmcoYnVmZmVyX3B0cigmYy0+aW5wdXQpLCBsZW4pOworCQkJCXBhY2tldF9zZW5kKCk7CisJCQkJYnVmZmVyX2NvbnN1bWUoJmMtPmlucHV0LCBsZW4pOworCQkJCWMtPnJlbW90ZV93aW5kb3cgLT0gbGVuOworCQkJfQorCQl9IGVsc2UgaWYgKGMtPmlzdGF0ZSA9PSBDSEFOX0lOUFVUX1dBSVRfRFJBSU4pIHsKKwkJCWlmIChjb21wYXQxMykKKwkJCQlmYXRhbCgiY2Fubm90IGhhcHBlbjogaXN0YXRlID09IElOUFVUX1dBSVRfRFJBSU4gZm9yIHByb3RvIDEuMyIpOworCQkJLyoKKwkJCSAqIGlucHV0LWJ1ZmZlciBpcyBlbXB0eSBhbmQgcmVhZC1zb2NrZXQgc2h1dGRvd246CisJCQkgKiB0ZWxsIHBlZXIsIHRoYXQgd2Ugd2lsbCBub3Qgc2VuZCBtb3JlIGRhdGE6IHNlbmQgSUVPRi4KKwkJCSAqIGhhY2sgZm9yIGV4dGVuZGVkIGRhdGE6IGRlbGF5IEVPRiBpZiBFRkQgc3RpbGwgaW4gdXNlLgorCQkJICovCisJCQlpZiAoQ0hBTk5FTF9FRkRfSU5QVVRfQUNUSVZFKGMpKQorCQkJCWRlYnVnMigiY2hhbm5lbCAlZDogaWJ1Zl9lbXB0eSBkZWxheWVkIGVmZCAlZC8oJWQpIiwKKwkJCQkgICAgYy0+c2VsZiwgYy0+ZWZkLCBidWZmZXJfbGVuKCZjLT5leHRlbmRlZCkpOworCQkJZWxzZQorCQkJCWNoYW5faWJ1Zl9lbXB0eShjKTsKKwkJfQorCQkvKiBTZW5kIGV4dGVuZGVkIGRhdGEsIGkuZS4gc3RkZXJyICovCisJCWlmIChjb21wYXQyMCAmJgorCQkgICAgIShjLT5mbGFncyAmIENIQU5fRU9GX1NFTlQpICYmCisJCSAgICBjLT5yZW1vdGVfd2luZG93ID4gMCAmJgorCQkgICAgKGxlbiA9IGJ1ZmZlcl9sZW4oJmMtPmV4dGVuZGVkKSkgPiAwICYmCisJCSAgICBjLT5leHRlbmRlZF91c2FnZSA9PSBDSEFOX0VYVEVOREVEX1JFQUQpIHsKKwkJCWRlYnVnMigiY2hhbm5lbCAlZDogcndpbiAldSBlbGVuICV1IGV1c2UgJWQiLAorCQkJICAgIGMtPnNlbGYsIGMtPnJlbW90ZV93aW5kb3csIGJ1ZmZlcl9sZW4oJmMtPmV4dGVuZGVkKSwKKwkJCSAgICBjLT5leHRlbmRlZF91c2FnZSk7CisJCQlpZiAobGVuID4gYy0+cmVtb3RlX3dpbmRvdykKKwkJCQlsZW4gPSBjLT5yZW1vdGVfd2luZG93OworCQkJaWYgKGxlbiA+IGMtPnJlbW90ZV9tYXhwYWNrZXQpCisJCQkJbGVuID0gYy0+cmVtb3RlX21heHBhY2tldDsKKwkJCXBhY2tldF9zdGFydChTU0gyX01TR19DSEFOTkVMX0VYVEVOREVEX0RBVEEpOworCQkJcGFja2V0X3B1dF9pbnQoYy0+cmVtb3RlX2lkKTsKKwkJCXBhY2tldF9wdXRfaW50KFNTSDJfRVhURU5ERURfREFUQV9TVERFUlIpOworCQkJcGFja2V0X3B1dF9zdHJpbmcoYnVmZmVyX3B0cigmYy0+ZXh0ZW5kZWQpLCBsZW4pOworCQkJcGFja2V0X3NlbmQoKTsKKwkJCWJ1ZmZlcl9jb25zdW1lKCZjLT5leHRlbmRlZCwgbGVuKTsKKwkJCWMtPnJlbW90ZV93aW5kb3cgLT0gbGVuOworCQkJZGVidWcyKCJjaGFubmVsICVkOiBzZW50IGV4dCBkYXRhICVkIiwgYy0+c2VsZiwgbGVuKTsKKwkJfQorCX0KK30KKworCisvKiAtLSBwcm90b2NvbCBpbnB1dCAqLworCisvKiBBUkdTVVNFRCAqLwordm9pZAorY2hhbm5lbF9pbnB1dF9kYXRhKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQoreworCWludCBpZDsKKwljaGFyICpkYXRhOworCXVfaW50IGRhdGFfbGVuLCB3aW5fbGVuOworCUNoYW5uZWwgKmM7CisKKwkvKiBHZXQgdGhlIGNoYW5uZWwgbnVtYmVyIGFuZCB2ZXJpZnkgaXQuICovCisJaWQgPSBwYWNrZXRfZ2V0X2ludCgpOworCWMgPSBjaGFubmVsX2xvb2t1cChpZCk7CisJaWYgKGMgPT0gTlVMTCkKKwkJcGFja2V0X2Rpc2Nvbm5lY3QoIlJlY2VpdmVkIGRhdGEgZm9yIG5vbmV4aXN0ZW50IGNoYW5uZWwgJWQuIiwgaWQpOworCisJLyogSWdub3JlIGFueSBkYXRhIGZvciBub24tb3BlbiBjaGFubmVscyAobWlnaHQgaGFwcGVuIG9uIGNsb3NlKSAqLworCWlmIChjLT50eXBlICE9IFNTSF9DSEFOTkVMX09QRU4gJiYKKwkgICAgYy0+dHlwZSAhPSBTU0hfQ0hBTk5FTF9YMTFfT1BFTikKKwkJcmV0dXJuOworCisJLyogR2V0IHRoZSBkYXRhLiAqLworCWRhdGEgPSBwYWNrZXRfZ2V0X3N0cmluZ19wdHIoJmRhdGFfbGVuKTsKKwl3aW5fbGVuID0gZGF0YV9sZW47CisJaWYgKGMtPmRhdGFncmFtKQorCQl3aW5fbGVuICs9IDQ7ICAvKiBzdHJpbmcgbGVuZ3RoIGhlYWRlciAqLworCisJLyoKKwkgKiBJZ25vcmUgZGF0YSBmb3IgcHJvdG9jb2wgPiAxLjMgaWYgb3V0cHV0IGVuZCBpcyBubyBsb25nZXIgb3Blbi4KKwkgKiBGb3IgcHJvdG9jb2wgMiB0aGUgc2VuZGluZyBzaWRlIGlzIHJlZHVjaW5nIGl0cyB3aW5kb3cgYXMgaXQgc2VuZHMKKwkgKiBkYXRhLCBzbyB3ZSBtdXN0ICdmYWtlJyBjb25zdW1wdGlvbiBvZiB0aGUgZGF0YSBpbiBvcmRlciB0byBlbnN1cmUKKwkgKiB0aGF0IHdpbmRvdyB1cGRhdGVzIGFyZSBzZW50IGJhY2suICBPdGhlcndpc2UgdGhlIGNvbm5lY3Rpb24gbWlnaHQKKwkgKiBkZWFkbG9jay4KKwkgKi8KKwlpZiAoIWNvbXBhdDEzICYmIGMtPm9zdGF0ZSAhPSBDSEFOX09VVFBVVF9PUEVOKSB7CisJCWlmIChjb21wYXQyMCkgeworCQkJYy0+bG9jYWxfd2luZG93IC09IHdpbl9sZW47CisJCQljLT5sb2NhbF9jb25zdW1lZCArPSB3aW5fbGVuOworCQl9CisJCXJldHVybjsKKwl9CisKKwlpZiAoY29tcGF0MjApIHsKKwkJaWYgKHdpbl9sZW4gPiBjLT5sb2NhbF9tYXhwYWNrZXQpIHsKKwkJCWxvZ2l0KCJjaGFubmVsICVkOiByY3ZkIGJpZyBwYWNrZXQgJWQsIG1heHBhY2sgJWQiLAorCQkJICAgIGMtPnNlbGYsIHdpbl9sZW4sIGMtPmxvY2FsX21heHBhY2tldCk7CisJCX0KKwkJaWYgKHdpbl9sZW4gPiBjLT5sb2NhbF93aW5kb3cpIHsKKwkJCWxvZ2l0KCJjaGFubmVsICVkOiByY3ZkIHRvbyBtdWNoIGRhdGEgJWQsIHdpbiAlZCIsCisJCQkgICAgYy0+c2VsZiwgd2luX2xlbiwgYy0+bG9jYWxfd2luZG93KTsKKwkJCXJldHVybjsKKwkJfQorCQljLT5sb2NhbF93aW5kb3cgLT0gd2luX2xlbjsKKwl9CisJaWYgKGMtPmRhdGFncmFtKQorCQlidWZmZXJfcHV0X3N0cmluZygmYy0+b3V0cHV0LCBkYXRhLCBkYXRhX2xlbik7CisJZWxzZQorCQlidWZmZXJfYXBwZW5kKCZjLT5vdXRwdXQsIGRhdGEsIGRhdGFfbGVuKTsKKwlwYWNrZXRfY2hlY2tfZW9tKCk7Cit9CisKKy8qIEFSR1NVU0VEICovCit2b2lkCitjaGFubmVsX2lucHV0X2V4dGVuZGVkX2RhdGEoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCit7CisJaW50IGlkOworCWNoYXIgKmRhdGE7CisJdV9pbnQgZGF0YV9sZW4sIHRjb2RlOworCUNoYW5uZWwgKmM7CisKKwkvKiBHZXQgdGhlIGNoYW5uZWwgbnVtYmVyIGFuZCB2ZXJpZnkgaXQuICovCisJaWQgPSBwYWNrZXRfZ2V0X2ludCgpOworCWMgPSBjaGFubmVsX2xvb2t1cChpZCk7CisKKwlpZiAoYyA9PSBOVUxMKQorCQlwYWNrZXRfZGlzY29ubmVjdCgiUmVjZWl2ZWQgZXh0ZW5kZWRfZGF0YSBmb3IgYmFkIGNoYW5uZWwgJWQuIiwgaWQpOworCWlmIChjLT50eXBlICE9IFNTSF9DSEFOTkVMX09QRU4pIHsKKwkJbG9naXQoImNoYW5uZWwgJWQ6IGV4dCBkYXRhIGZvciBub24gb3BlbiIsIGlkKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoYy0+ZmxhZ3MgJiBDSEFOX0VPRl9SQ1ZEKSB7CisJCWlmIChkYXRhZmVsbG93cyAmIFNTSF9CVUdfRVhURU9GKQorCQkJZGVidWcoImNoYW5uZWwgJWQ6IGFjY2VwdGluZyBleHQgZGF0YSBhZnRlciBlb2YiLCBpZCk7CisJCWVsc2UKKwkJCXBhY2tldF9kaXNjb25uZWN0KCJSZWNlaXZlZCBleHRlbmRlZF9kYXRhIGFmdGVyIEVPRiAiCisJCQkgICAgIm9uIGNoYW5uZWwgJWQuIiwgaWQpOworCX0KKwl0Y29kZSA9IHBhY2tldF9nZXRfaW50KCk7CisJaWYgKGMtPmVmZCA9PSAtMSB8fAorCSAgICBjLT5leHRlbmRlZF91c2FnZSAhPSBDSEFOX0VYVEVOREVEX1dSSVRFIHx8CisJICAgIHRjb2RlICE9IFNTSDJfRVhURU5ERURfREFUQV9TVERFUlIpIHsKKwkJbG9naXQoImNoYW5uZWwgJWQ6IGJhZCBleHQgZGF0YSIsIGMtPnNlbGYpOworCQlyZXR1cm47CisJfQorCWRhdGEgPSBwYWNrZXRfZ2V0X3N0cmluZygmZGF0YV9sZW4pOworCXBhY2tldF9jaGVja19lb20oKTsKKwlpZiAoZGF0YV9sZW4gPiBjLT5sb2NhbF93aW5kb3cpIHsKKwkJbG9naXQoImNoYW5uZWwgJWQ6IHJjdmQgdG9vIG11Y2ggZXh0ZW5kZWRfZGF0YSAlZCwgd2luICVkIiwKKwkJICAgIGMtPnNlbGYsIGRhdGFfbGVuLCBjLT5sb2NhbF93aW5kb3cpOworCQl4ZnJlZShkYXRhKTsKKwkJcmV0dXJuOworCX0KKwlkZWJ1ZzIoImNoYW5uZWwgJWQ6IHJjdmQgZXh0IGRhdGEgJWQiLCBjLT5zZWxmLCBkYXRhX2xlbik7CisJYy0+bG9jYWxfd2luZG93IC09IGRhdGFfbGVuOworCWJ1ZmZlcl9hcHBlbmQoJmMtPmV4dGVuZGVkLCBkYXRhLCBkYXRhX2xlbik7CisJeGZyZWUoZGF0YSk7Cit9CisKKy8qIEFSR1NVU0VEICovCit2b2lkCitjaGFubmVsX2lucHV0X2llb2YoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCit7CisJaW50IGlkOworCUNoYW5uZWwgKmM7CisKKwlpZCA9IHBhY2tldF9nZXRfaW50KCk7CisJcGFja2V0X2NoZWNrX2VvbSgpOworCWMgPSBjaGFubmVsX2xvb2t1cChpZCk7CisJaWYgKGMgPT0gTlVMTCkKKwkJcGFja2V0X2Rpc2Nvbm5lY3QoIlJlY2VpdmVkIGllb2YgZm9yIG5vbmV4aXN0ZW50IGNoYW5uZWwgJWQuIiwgaWQpOworCWNoYW5fcmN2ZF9pZW9mKGMpOworCisJLyogWFhYIGZvcmNlIGlucHV0IGNsb3NlICovCisJaWYgKGMtPmZvcmNlX2RyYWluICYmIGMtPmlzdGF0ZSA9PSBDSEFOX0lOUFVUX09QRU4pIHsKKwkJZGVidWcoImNoYW5uZWwgJWQ6IEZPUkNFIGlucHV0IGRyYWluIiwgYy0+c2VsZik7CisJCWMtPmlzdGF0ZSA9IENIQU5fSU5QVVRfV0FJVF9EUkFJTjsKKwkJaWYgKGJ1ZmZlcl9sZW4oJmMtPmlucHV0KSA9PSAwKQorCQkJY2hhbl9pYnVmX2VtcHR5KGMpOworCX0KKworfQorCisvKiBBUkdTVVNFRCAqLwordm9pZAorY2hhbm5lbF9pbnB1dF9jbG9zZShpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKK3sKKwlpbnQgaWQ7CisJQ2hhbm5lbCAqYzsKKworCWlkID0gcGFja2V0X2dldF9pbnQoKTsKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisJYyA9IGNoYW5uZWxfbG9va3VwKGlkKTsKKwlpZiAoYyA9PSBOVUxMKQorCQlwYWNrZXRfZGlzY29ubmVjdCgiUmVjZWl2ZWQgY2xvc2UgZm9yIG5vbmV4aXN0ZW50IGNoYW5uZWwgJWQuIiwgaWQpOworCisJLyoKKwkgKiBTZW5kIGEgY29uZmlybWF0aW9uIHRoYXQgd2UgaGF2ZSBjbG9zZWQgdGhlIGNoYW5uZWwgYW5kIG5vIG1vcmUKKwkgKiBkYXRhIGlzIGNvbWluZyBmb3IgaXQuCisJICovCisJcGFja2V0X3N0YXJ0KFNTSF9NU0dfQ0hBTk5FTF9DTE9TRV9DT05GSVJNQVRJT04pOworCXBhY2tldF9wdXRfaW50KGMtPnJlbW90ZV9pZCk7CisJcGFja2V0X3NlbmQoKTsKKworCS8qCisJICogSWYgdGhlIGNoYW5uZWwgaXMgaW4gY2xvc2VkIHN0YXRlLCB3ZSBoYXZlIHNlbnQgYSBjbG9zZSByZXF1ZXN0LAorCSAqIGFuZCB0aGUgb3RoZXIgc2lkZSB3aWxsIGV2ZW50dWFsbHkgcmVzcG9uZCB3aXRoIGEgY29uZmlybWF0aW9uLgorCSAqIFRodXMsIHdlIGNhbm5vdCBmcmVlIHRoZSBjaGFubmVsIGhlcmUsIGJlY2F1c2UgdGhlbiB0aGVyZSB3b3VsZCBiZQorCSAqIG5vLW9uZSB0byByZWNlaXZlIHRoZSBjb25maXJtYXRpb24uICBUaGUgY2hhbm5lbCBnZXRzIGZyZWVkIHdoZW4KKwkgKiB0aGUgY29uZmlybWF0aW9uIGFycml2ZXMuCisJICovCisJaWYgKGMtPnR5cGUgIT0gU1NIX0NIQU5ORUxfQ0xPU0VEKSB7CisJCS8qCisJCSAqIE5vdCBhIGNsb3NlZCBjaGFubmVsIC0gbWFyayBpdCBhcyBkcmFpbmluZywgd2hpY2ggd2lsbAorCQkgKiBjYXVzZSBpdCB0byBiZSBmcmVlZCBsYXRlci4KKwkJICovCisJCWJ1ZmZlcl9jbGVhcigmYy0+aW5wdXQpOworCQljLT50eXBlID0gU1NIX0NIQU5ORUxfT1VUUFVUX0RSQUlOSU5HOworCX0KK30KKworLyogcHJvdG8gdmVyc2lvbiAxLjUgb3ZlcmxvYWRzIENMT1NFX0NPTkZJUk1BVElPTiB3aXRoIE9DTE9TRSAqLworLyogQVJHU1VTRUQgKi8KK3ZvaWQKK2NoYW5uZWxfaW5wdXRfb2Nsb3NlKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQoreworCWludCBpZCA9IHBhY2tldF9nZXRfaW50KCk7CisJQ2hhbm5lbCAqYyA9IGNoYW5uZWxfbG9va3VwKGlkKTsKKworCXBhY2tldF9jaGVja19lb20oKTsKKwlpZiAoYyA9PSBOVUxMKQorCQlwYWNrZXRfZGlzY29ubmVjdCgiUmVjZWl2ZWQgb2Nsb3NlIGZvciBub25leGlzdGVudCBjaGFubmVsICVkLiIsIGlkKTsKKwljaGFuX3JjdmRfb2Nsb3NlKGMpOworfQorCisvKiBBUkdTVVNFRCAqLwordm9pZAorY2hhbm5lbF9pbnB1dF9jbG9zZV9jb25maXJtYXRpb24oaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCit7CisJaW50IGlkID0gcGFja2V0X2dldF9pbnQoKTsKKwlDaGFubmVsICpjID0gY2hhbm5lbF9sb29rdXAoaWQpOworCisJcGFja2V0X2NoZWNrX2VvbSgpOworCWlmIChjID09IE5VTEwpCisJCXBhY2tldF9kaXNjb25uZWN0KCJSZWNlaXZlZCBjbG9zZSBjb25maXJtYXRpb24gZm9yICIKKwkJICAgICJvdXQtb2YtcmFuZ2UgY2hhbm5lbCAlZC4iLCBpZCk7CisJaWYgKGMtPnR5cGUgIT0gU1NIX0NIQU5ORUxfQ0xPU0VEKQorCQlwYWNrZXRfZGlzY29ubmVjdCgiUmVjZWl2ZWQgY2xvc2UgY29uZmlybWF0aW9uIGZvciAiCisJCSAgICAibm9uLWNsb3NlZCBjaGFubmVsICVkICh0eXBlICVkKS4iLCBpZCwgYy0+dHlwZSk7CisJY2hhbm5lbF9mcmVlKGMpOworfQorCisvKiBBUkdTVVNFRCAqLwordm9pZAorY2hhbm5lbF9pbnB1dF9vcGVuX2NvbmZpcm1hdGlvbihpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKK3sKKwlpbnQgaWQsIHJlbW90ZV9pZDsKKwlDaGFubmVsICpjOworCisJaWQgPSBwYWNrZXRfZ2V0X2ludCgpOworCWMgPSBjaGFubmVsX2xvb2t1cChpZCk7CisKKwlpZiAoYz09TlVMTCB8fCBjLT50eXBlICE9IFNTSF9DSEFOTkVMX09QRU5JTkcpCisJCXBhY2tldF9kaXNjb25uZWN0KCJSZWNlaXZlZCBvcGVuIGNvbmZpcm1hdGlvbiBmb3IgIgorCQkgICAgIm5vbi1vcGVuaW5nIGNoYW5uZWwgJWQuIiwgaWQpOworCXJlbW90ZV9pZCA9IHBhY2tldF9nZXRfaW50KCk7CisJLyogUmVjb3JkIHRoZSByZW1vdGUgY2hhbm5lbCBudW1iZXIgYW5kIG1hcmsgdGhhdCB0aGUgY2hhbm5lbCBpcyBub3cgb3Blbi4gKi8KKwljLT5yZW1vdGVfaWQgPSByZW1vdGVfaWQ7CisJYy0+dHlwZSA9IFNTSF9DSEFOTkVMX09QRU47CisKKwlpZiAoY29tcGF0MjApIHsKKwkJYy0+cmVtb3RlX3dpbmRvdyA9IHBhY2tldF9nZXRfaW50KCk7CisJCWMtPnJlbW90ZV9tYXhwYWNrZXQgPSBwYWNrZXRfZ2V0X2ludCgpOworCQlpZiAoYy0+b3Blbl9jb25maXJtKSB7CisJCQlkZWJ1ZzIoImNhbGxiYWNrIHN0YXJ0Iik7CisJCQljLT5vcGVuX2NvbmZpcm0oYy0+c2VsZiwgMSwgYy0+b3Blbl9jb25maXJtX2N0eCk7CisJCQlkZWJ1ZzIoImNhbGxiYWNrIGRvbmUiKTsKKwkJfQorCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IG9wZW4gY29uZmlybSByd2luZG93ICV1IHJtYXggJXUiLCBjLT5zZWxmLAorCQkgICAgYy0+cmVtb3RlX3dpbmRvdywgYy0+cmVtb3RlX21heHBhY2tldCk7CisJfQorCXBhY2tldF9jaGVja19lb20oKTsKK30KKworc3RhdGljIGNoYXIgKgorcmVhc29uMnR4dChpbnQgcmVhc29uKQoreworCXN3aXRjaCAocmVhc29uKSB7CisJY2FzZSBTU0gyX09QRU5fQURNSU5JU1RSQVRJVkVMWV9QUk9ISUJJVEVEOgorCQlyZXR1cm4gImFkbWluaXN0cmF0aXZlbHkgcHJvaGliaXRlZCI7CisJY2FzZSBTU0gyX09QRU5fQ09OTkVDVF9GQUlMRUQ6CisJCXJldHVybiAiY29ubmVjdCBmYWlsZWQiOworCWNhc2UgU1NIMl9PUEVOX1VOS05PV05fQ0hBTk5FTF9UWVBFOgorCQlyZXR1cm4gInVua25vd24gY2hhbm5lbCB0eXBlIjsKKwljYXNlIFNTSDJfT1BFTl9SRVNPVVJDRV9TSE9SVEFHRToKKwkJcmV0dXJuICJyZXNvdXJjZSBzaG9ydGFnZSI7CisJfQorCXJldHVybiAidW5rbm93biByZWFzb24iOworfQorCisvKiBBUkdTVVNFRCAqLwordm9pZAorY2hhbm5lbF9pbnB1dF9vcGVuX2ZhaWx1cmUoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCit7CisJaW50IGlkLCByZWFzb247CisJY2hhciAqbXNnID0gTlVMTCwgKmxhbmcgPSBOVUxMOworCUNoYW5uZWwgKmM7CisKKwlpZCA9IHBhY2tldF9nZXRfaW50KCk7CisJYyA9IGNoYW5uZWxfbG9va3VwKGlkKTsKKworCWlmIChjPT1OVUxMIHx8IGMtPnR5cGUgIT0gU1NIX0NIQU5ORUxfT1BFTklORykKKwkJcGFja2V0X2Rpc2Nvbm5lY3QoIlJlY2VpdmVkIG9wZW4gZmFpbHVyZSBmb3IgIgorCQkgICAgIm5vbi1vcGVuaW5nIGNoYW5uZWwgJWQuIiwgaWQpOworCWlmIChjb21wYXQyMCkgeworCQlyZWFzb24gPSBwYWNrZXRfZ2V0X2ludCgpOworCQlpZiAoIShkYXRhZmVsbG93cyAmIFNTSF9CVUdfT1BFTkZBSUxVUkUpKSB7CisJCQltc2cgID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7CisJCQlsYW5nID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7CisJCX0KKwkJbG9naXQoImNoYW5uZWwgJWQ6IG9wZW4gZmFpbGVkOiAlcyVzJXMiLCBpZCwKKwkJICAgIHJlYXNvbjJ0eHQocmVhc29uKSwgbXNnID8gIjogIjogIiIsIG1zZyA/IG1zZyA6ICIiKTsKKwkJaWYgKG1zZyAhPSBOVUxMKQorCQkJeGZyZWUobXNnKTsKKwkJaWYgKGxhbmcgIT0gTlVMTCkKKwkJCXhmcmVlKGxhbmcpOworCQlpZiAoYy0+b3Blbl9jb25maXJtKSB7CisJCQlkZWJ1ZzIoImNhbGxiYWNrIHN0YXJ0Iik7CisJCQljLT5vcGVuX2NvbmZpcm0oYy0+c2VsZiwgMCwgYy0+b3Blbl9jb25maXJtX2N0eCk7CisJCQlkZWJ1ZzIoImNhbGxiYWNrIGRvbmUiKTsKKwkJfQorCX0KKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisJLyogU2NoZWR1bGUgdGhlIGNoYW5uZWwgZm9yIGNsZWFudXAvZGVsZXRpb24uICovCisJY2hhbl9tYXJrX2RlYWQoYyk7Cit9CisKKy8qIEFSR1NVU0VEICovCit2b2lkCitjaGFubmVsX2lucHV0X3dpbmRvd19hZGp1c3QoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCit7CisJQ2hhbm5lbCAqYzsKKwlpbnQgaWQ7CisJdV9pbnQgYWRqdXN0OworCisJaWYgKCFjb21wYXQyMCkKKwkJcmV0dXJuOworCisJLyogR2V0IHRoZSBjaGFubmVsIG51bWJlciBhbmQgdmVyaWZ5IGl0LiAqLworCWlkID0gcGFja2V0X2dldF9pbnQoKTsKKwljID0gY2hhbm5lbF9sb29rdXAoaWQpOworCisJaWYgKGMgPT0gTlVMTCkgeworCQlsb2dpdCgiUmVjZWl2ZWQgd2luZG93IGFkanVzdCBmb3Igbm9uLW9wZW4gY2hhbm5lbCAlZC4iLCBpZCk7CisJCXJldHVybjsKKwl9CisJYWRqdXN0ID0gcGFja2V0X2dldF9pbnQoKTsKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisJZGVidWcyKCJjaGFubmVsICVkOiByY3ZkIGFkanVzdCAldSIsIGlkLCBhZGp1c3QpOworCWMtPnJlbW90ZV93aW5kb3cgKz0gYWRqdXN0OworfQorCisvKiBBUkdTVVNFRCAqLwordm9pZAorY2hhbm5lbF9pbnB1dF9wb3J0X29wZW4oaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCit7CisJQ2hhbm5lbCAqYyA9IE5VTEw7CisJdV9zaG9ydCBob3N0X3BvcnQ7CisJY2hhciAqaG9zdCwgKm9yaWdpbmF0b3Jfc3RyaW5nOworCWludCByZW1vdGVfaWQ7CisKKwlyZW1vdGVfaWQgPSBwYWNrZXRfZ2V0X2ludCgpOworCWhvc3QgPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKKwlob3N0X3BvcnQgPSBwYWNrZXRfZ2V0X2ludCgpOworCisJaWYgKHBhY2tldF9nZXRfcHJvdG9jb2xfZmxhZ3MoKSAmIFNTSF9QUk9UT0ZMQUdfSE9TVF9JTl9GV0RfT1BFTikgeworCQlvcmlnaW5hdG9yX3N0cmluZyA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOworCX0gZWxzZSB7CisJCW9yaWdpbmF0b3Jfc3RyaW5nID0geHN0cmR1cCgidW5rbm93biAocmVtb3RlIGRpZCBub3Qgc3VwcGx5IG5hbWUpIik7CisJfQorCXBhY2tldF9jaGVja19lb20oKTsKKwljID0gY2hhbm5lbF9jb25uZWN0X3RvKGhvc3QsIGhvc3RfcG9ydCwKKwkgICAgImNvbm5lY3RlZCBzb2NrZXQiLCBvcmlnaW5hdG9yX3N0cmluZyk7CisJeGZyZWUob3JpZ2luYXRvcl9zdHJpbmcpOworCXhmcmVlKGhvc3QpOworCWlmIChjID09IE5VTEwpIHsKKwkJcGFja2V0X3N0YXJ0KFNTSF9NU0dfQ0hBTk5FTF9PUEVOX0ZBSUxVUkUpOworCQlwYWNrZXRfcHV0X2ludChyZW1vdGVfaWQpOworCQlwYWNrZXRfc2VuZCgpOworCX0gZWxzZQorCQljLT5yZW1vdGVfaWQgPSByZW1vdGVfaWQ7Cit9CisKKy8qIEFSR1NVU0VEICovCit2b2lkCitjaGFubmVsX2lucHV0X3N0YXR1c19jb25maXJtKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQoreworCUNoYW5uZWwgKmM7CisJc3RydWN0IGNoYW5uZWxfY29uZmlybSAqY2M7CisJaW50IGlkOworCisJLyogUmVzZXQga2VlcGFsaXZlIHRpbWVvdXQgKi8KKwlwYWNrZXRfc2V0X2FsaXZlX3RpbWVvdXRzKDApOworCisJaWQgPSBwYWNrZXRfZ2V0X2ludCgpOworCXBhY2tldF9jaGVja19lb20oKTsKKworCWRlYnVnMigiY2hhbm5lbF9pbnB1dF9zdGF0dXNfY29uZmlybTogdHlwZSAlZCBpZCAlZCIsIHR5cGUsIGlkKTsKKworCWlmICgoYyA9IGNoYW5uZWxfbG9va3VwKGlkKSkgPT0gTlVMTCkgeworCQlsb2dpdCgiY2hhbm5lbF9pbnB1dF9zdGF0dXNfY29uZmlybTogJWQ6IHVua25vd24iLCBpZCk7CisJCXJldHVybjsKKwl9CQorCTsKKwlpZiAoKGNjID0gVEFJTFFfRklSU1QoJmMtPnN0YXR1c19jb25maXJtcykpID09IE5VTEwpCisJCXJldHVybjsKKwljYy0+Y2IodHlwZSwgYywgY2MtPmN0eCk7CisJVEFJTFFfUkVNT1ZFKCZjLT5zdGF0dXNfY29uZmlybXMsIGNjLCBlbnRyeSk7CisJYnplcm8oY2MsIHNpemVvZigqY2MpKTsKKwl4ZnJlZShjYyk7Cit9CisKKy8qIC0tIHRjcCBmb3J3YXJkaW5nICovCisKK3ZvaWQKK2NoYW5uZWxfc2V0X2FmKGludCBhZikKK3sKKwlJUHY0b3I2ID0gYWY7Cit9CisKKworLyoKKyAqIERldGVybWluZSB3aGV0aGVyIG9yIG5vdCBhIHBvcnQgZm9yd2FyZCBsaXN0ZW5zIHRvIGxvb3BiYWNrLCB0aGUKKyAqIHNwZWNpZmllZCBhZGRyZXNzIG9yIHdpbGRjYXJkLiBPbiB0aGUgY2xpZW50LCBhIHNwZWNpZmllZCBiaW5kCisgKiBhZGRyZXNzIHdpbGwgYWx3YXlzIG92ZXJyaWRlIGdhdGV3YXlfcG9ydHMuIE9uIHRoZSBzZXJ2ZXIsIGEKKyAqIGdhdGV3YXlfcG9ydHMgb2YgMSAoYGB5ZXMnJykgd2lsbCBvdmVycmlkZSB0aGUgY2xpZW50J3Mgc3BlY2lmaWNhdGlvbgorICogYW5kIGZvcmNlIGEgd2lsZGNhcmQgYmluZCwgd2hlcmVhcyBhIHZhbHVlIG9mIDIgKGBgY2xpZW50c3BlY2lmaWVkJycpCisgKiB3aWxsIGJpbmQgdG8gd2hhdGV2ZXIgYWRkcmVzcyB0aGUgY2xpZW50IGFza2VkIGZvci4KKyAqCisgKiBTcGVjaWFsLWNhc2UgbGlzdGVuX2FkZHJzIGFyZToKKyAqCisgKiAiMC4wLjAuMCIgICAgICAgICAgICAgICAtPiB3aWxkY2FyZCB2NC92NiBpZiBTU0hfT0xEX0ZPUldBUkRfQUREUgorICogIiIgKGVtcHR5IHN0cmluZyksICIqIiAgLT4gd2lsZGNhcmQgdjQvdjYKKyAqICJsb2NhbGhvc3QiICAgICAgICAgICAgIC0+IGxvb3BiYWNrIHY0L3Y2CisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK2NoYW5uZWxfZndkX2JpbmRfYWRkcihjb25zdCBjaGFyICpsaXN0ZW5fYWRkciwgaW50ICp3aWxkY2FyZHAsCisgICAgaW50IGlzX2NsaWVudCwgaW50IGdhdGV3YXlfcG9ydHMpCit7CisJY29uc3QgY2hhciAqYWRkciA9IE5VTEw7CisJaW50IHdpbGRjYXJkID0gMDsKKworCWlmIChsaXN0ZW5fYWRkciA9PSBOVUxMKSB7CisJCS8qIE5vIGFkZHJlc3Mgc3BlY2lmaWVkOiBkZWZhdWx0IHRvIGdhdGV3YXlfcG9ydHMgc2V0dGluZyAqLworCQlpZiAoZ2F0ZXdheV9wb3J0cykKKwkJCXdpbGRjYXJkID0gMTsKKwl9IGVsc2UgaWYgKGdhdGV3YXlfcG9ydHMgfHwgaXNfY2xpZW50KSB7CisJCWlmICgoKGRhdGFmZWxsb3dzICYgU1NIX09MRF9GT1JXQVJEX0FERFIpICYmCisJCSAgICBzdHJjbXAobGlzdGVuX2FkZHIsICIwLjAuMC4wIikgPT0gMCAmJiBpc19jbGllbnQgPT0gMCkgfHwKKwkJICAgICpsaXN0ZW5fYWRkciA9PSAnXDAnIHx8IHN0cmNtcChsaXN0ZW5fYWRkciwgIioiKSA9PSAwIHx8CisJCSAgICAoIWlzX2NsaWVudCAmJiBnYXRld2F5X3BvcnRzID09IDEpKQorCQkJd2lsZGNhcmQgPSAxOworCQllbHNlIGlmIChzdHJjbXAobGlzdGVuX2FkZHIsICJsb2NhbGhvc3QiKSAhPSAwKQorCQkJYWRkciA9IGxpc3Rlbl9hZGRyOworCX0KKwlpZiAod2lsZGNhcmRwICE9IE5VTEwpCisJCSp3aWxkY2FyZHAgPSB3aWxkY2FyZDsKKwlyZXR1cm4gYWRkcjsKK30KKworc3RhdGljIGludAorY2hhbm5lbF9zZXR1cF9md2RfbGlzdGVuZXIoaW50IHR5cGUsIGNvbnN0IGNoYXIgKmxpc3Rlbl9hZGRyLAorICAgIHVfc2hvcnQgbGlzdGVuX3BvcnQsIGludCAqYWxsb2NhdGVkX2xpc3Rlbl9wb3J0LAorICAgIGNvbnN0IGNoYXIgKmhvc3RfdG9fY29ubmVjdCwgdV9zaG9ydCBwb3J0X3RvX2Nvbm5lY3QsIGludCBnYXRld2F5X3BvcnRzKQoreworCUNoYW5uZWwgKmM7CisJaW50IHNvY2ssIHIsIHN1Y2Nlc3MgPSAwLCB3aWxkY2FyZCA9IDAsIGlzX2NsaWVudDsKKwlzdHJ1Y3QgYWRkcmluZm8gaGludHMsICphaSwgKmFpdG9wOworCWNvbnN0IGNoYXIgKmhvc3QsICphZGRyOworCWNoYXIgbnRvcFtOSV9NQVhIT1NUXSwgc3RycG9ydFtOSV9NQVhTRVJWXTsKKwlpbl9wb3J0X3QgKmxwb3J0X3A7CisKKwlob3N0ID0gKHR5cGUgPT0gU1NIX0NIQU5ORUxfUlBPUlRfTElTVEVORVIpID8KKwkgICAgbGlzdGVuX2FkZHIgOiBob3N0X3RvX2Nvbm5lY3Q7CisJaXNfY2xpZW50ID0gKHR5cGUgPT0gU1NIX0NIQU5ORUxfUE9SVF9MSVNURU5FUik7CisKKwlpZiAoaG9zdCA9PSBOVUxMKSB7CisJCWVycm9yKCJObyBmb3J3YXJkIGhvc3QgbmFtZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChzdHJsZW4oaG9zdCkgPj0gTklfTUFYSE9TVCkgeworCQllcnJvcigiRm9yd2FyZCBob3N0IG5hbWUgdG9vIGxvbmcuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIERldGVybWluZSB0aGUgYmluZCBhZGRyZXNzLCBjZi4gY2hhbm5lbF9md2RfYmluZF9hZGRyKCkgY29tbWVudCAqLworCWFkZHIgPSBjaGFubmVsX2Z3ZF9iaW5kX2FkZHIobGlzdGVuX2FkZHIsICZ3aWxkY2FyZCwKKwkgICAgaXNfY2xpZW50LCBnYXRld2F5X3BvcnRzKTsKKwlkZWJ1ZzMoImNoYW5uZWxfc2V0dXBfZndkX2xpc3RlbmVyOiB0eXBlICVkIHdpbGRjYXJkICVkIGFkZHIgJXMiLAorCSAgICB0eXBlLCB3aWxkY2FyZCwgKGFkZHIgPT0gTlVMTCkgPyAiTlVMTCIgOiBhZGRyKTsKKworCS8qCisJICogZ2V0YWRkcmluZm8gcmV0dXJucyBhIGxvb3BiYWNrIGFkZHJlc3MgaWYgdGhlIGhvc3RuYW1lIGlzCisJICogc2V0IHRvIE5VTEwgYW5kIGhpbnRzLmFpX2ZsYWdzIGlzIG5vdCBBSV9QQVNTSVZFCisJICovCisJbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisJaGludHMuYWlfZmFtaWx5ID0gSVB2NG9yNjsKKwloaW50cy5haV9mbGFncyA9IHdpbGRjYXJkID8gQUlfUEFTU0lWRSA6IDA7CisJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKwlzbnByaW50ZihzdHJwb3J0LCBzaXplb2Ygc3RycG9ydCwgIiVkIiwgbGlzdGVuX3BvcnQpOworCWlmICgociA9IGdldGFkZHJpbmZvKGFkZHIsIHN0cnBvcnQsICZoaW50cywgJmFpdG9wKSkgIT0gMCkgeworCQlpZiAoYWRkciA9PSBOVUxMKSB7CisJCQkvKiBUaGlzIHJlYWxseSBzaG91bGRuJ3QgaGFwcGVuICovCisJCQlwYWNrZXRfZGlzY29ubmVjdCgiZ2V0YWRkcmluZm86IGZhdGFsIGVycm9yOiAlcyIsCisJCQkgICAgc3NoX2dhaV9zdHJlcnJvcihyKSk7CisJCX0gZWxzZSB7CisJCQllcnJvcigiY2hhbm5lbF9zZXR1cF9md2RfbGlzdGVuZXI6ICIKKwkJCSAgICAiZ2V0YWRkcmluZm8oJS42NHMpOiAlcyIsIGFkZHIsCisJCQkgICAgc3NoX2dhaV9zdHJlcnJvcihyKSk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWlmIChhbGxvY2F0ZWRfbGlzdGVuX3BvcnQgIT0gTlVMTCkKKwkJKmFsbG9jYXRlZF9saXN0ZW5fcG9ydCA9IDA7CisJZm9yIChhaSA9IGFpdG9wOyBhaTsgYWkgPSBhaS0+YWlfbmV4dCkgeworCQlzd2l0Y2ggKGFpLT5haV9mYW1pbHkpIHsKKwkJY2FzZSBBRl9JTkVUOgorCQkJbHBvcnRfcCA9ICYoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFpLT5haV9hZGRyKS0+CisJCQkgICAgc2luX3BvcnQ7CisJCQlicmVhazsKKwkJY2FzZSBBRl9JTkVUNjoKKwkJCWxwb3J0X3AgPSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYWktPmFpX2FkZHIpLT4KKwkJCSAgICBzaW42X3BvcnQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIElmIGFsbG9jYXRpbmcgYSBwb3J0IGZvciAtUiBmb3J3YXJkcywgdGhlbiB1c2UgdGhlCisJCSAqIHNhbWUgcG9ydCBmb3IgYWxsIGFkZHJlc3MgZmFtaWxpZXMuCisJCSAqLworCQlpZiAodHlwZSA9PSBTU0hfQ0hBTk5FTF9SUE9SVF9MSVNURU5FUiAmJiBsaXN0ZW5fcG9ydCA9PSAwICYmCisJCSAgICBhbGxvY2F0ZWRfbGlzdGVuX3BvcnQgIT0gTlVMTCAmJiAqYWxsb2NhdGVkX2xpc3Rlbl9wb3J0ID4gMCkKKwkJCSpscG9ydF9wID0gaHRvbnMoKmFsbG9jYXRlZF9saXN0ZW5fcG9ydCk7CisKKwkJaWYgKGdldG5hbWVpbmZvKGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbiwgbnRvcCwgc2l6ZW9mKG50b3ApLAorCQkgICAgc3RycG9ydCwgc2l6ZW9mKHN0cnBvcnQpLCBOSV9OVU1FUklDSE9TVHxOSV9OVU1FUklDU0VSVikgIT0gMCkgeworCQkJZXJyb3IoImNoYW5uZWxfc2V0dXBfZndkX2xpc3RlbmVyOiBnZXRuYW1laW5mbyBmYWlsZWQiKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIENyZWF0ZSBhIHBvcnQgdG8gbGlzdGVuIGZvciB0aGUgaG9zdC4gKi8KKwkJc29jayA9IHNvY2tldChhaS0+YWlfZmFtaWx5LCBhaS0+YWlfc29ja3R5cGUsIGFpLT5haV9wcm90b2NvbCk7CisJCWlmIChzb2NrIDwgMCkgeworCQkJLyogdGhpcyBpcyBubyBlcnJvciBzaW5jZSBrZXJuZWwgbWF5IG5vdCBzdXBwb3J0IGlwdjYgKi8KKwkJCXZlcmJvc2UoInNvY2tldDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJY2hhbm5lbF9zZXRfcmV1c2VhZGRyKHNvY2spOworCQlpZiAoYWktPmFpX2ZhbWlseSA9PSBBRl9JTkVUNikKKwkJCXNvY2tfc2V0X3Y2b25seShzb2NrKTsKKworCQlkZWJ1ZygiTG9jYWwgZm9yd2FyZGluZyBsaXN0ZW5pbmcgb24gJXMgcG9ydCAlcy4iLAorCQkgICAgbnRvcCwgc3RycG9ydCk7CisKKwkJLyogQmluZCB0aGUgc29ja2V0IHRvIHRoZSBhZGRyZXNzLiAqLworCQlpZiAoYmluZChzb2NrLCBhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4pIDwgMCkgeworCQkJLyogYWRkcmVzcyBjYW4gYmUgaW4gdXNlIGlwdjYgYWRkcmVzcyBpcyBhbHJlYWR5IGJvdW5kICovCisJCQlpZiAoIWFpLT5haV9uZXh0KQorCQkJCWVycm9yKCJiaW5kOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCQkJZWxzZQorCQkJCXZlcmJvc2UoImJpbmQ6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7CisKKwkJCWNsb3NlKHNvY2spOworCQkJY29udGludWU7CisJCX0KKwkJLyogU3RhcnQgbGlzdGVuaW5nIGZvciBjb25uZWN0aW9ucyBvbiB0aGUgc29ja2V0LiAqLworCQlpZiAobGlzdGVuKHNvY2ssIFNTSF9MSVNURU5fQkFDS0xPRykgPCAwKSB7CisJCQllcnJvcigibGlzdGVuOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCQkJY2xvc2Uoc29jayk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIGxpc3Rlbl9wb3J0ID09IDAgcmVxdWVzdHMgYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgcG9ydCAtCisJCSAqIHJlY29yZCB3aGF0IHdlIGdvdC4KKwkJICovCisJCWlmICh0eXBlID09IFNTSF9DSEFOTkVMX1JQT1JUX0xJU1RFTkVSICYmIGxpc3Rlbl9wb3J0ID09IDAgJiYKKwkJICAgIGFsbG9jYXRlZF9saXN0ZW5fcG9ydCAhPSBOVUxMICYmCisJCSAgICAqYWxsb2NhdGVkX2xpc3Rlbl9wb3J0ID09IDApIHsKKwkJCSphbGxvY2F0ZWRfbGlzdGVuX3BvcnQgPSBnZXRfc29ja19wb3J0KHNvY2ssIDEpOworCQkJZGVidWcoIkFsbG9jYXRlZCBsaXN0ZW4gcG9ydCAlZCIsCisJCQkgICAgKmFsbG9jYXRlZF9saXN0ZW5fcG9ydCk7CisJCX0KKworCQkvKiBBbGxvY2F0ZSBhIGNoYW5uZWwgbnVtYmVyIGZvciB0aGUgc29ja2V0LiAqLworCQljID0gY2hhbm5lbF9uZXcoInBvcnQgbGlzdGVuZXIiLCB0eXBlLCBzb2NrLCBzb2NrLCAtMSwKKwkJICAgIENIQU5fVENQX1dJTkRPV19ERUZBVUxULCBDSEFOX1RDUF9QQUNLRVRfREVGQVVMVCwKKwkJICAgIDAsICJwb3J0IGxpc3RlbmVyIiwgMSk7CisJCWMtPnBhdGggPSB4c3RyZHVwKGhvc3QpOworCQljLT5ob3N0X3BvcnQgPSBwb3J0X3RvX2Nvbm5lY3Q7CisJCWMtPmxpc3RlbmluZ19hZGRyID0gYWRkciA9PSBOVUxMID8gTlVMTCA6IHhzdHJkdXAoYWRkcik7CisJCWlmIChsaXN0ZW5fcG9ydCA9PSAwICYmIGFsbG9jYXRlZF9saXN0ZW5fcG9ydCAhPSBOVUxMICYmCisJCSAgICAhKGRhdGFmZWxsb3dzICYgU1NIX0JVR19EWU5BTUlDX1JQT1JUKSkKKwkJCWMtPmxpc3RlbmluZ19wb3J0ID0gKmFsbG9jYXRlZF9saXN0ZW5fcG9ydDsKKwkJZWxzZQorCQkJYy0+bGlzdGVuaW5nX3BvcnQgPSBsaXN0ZW5fcG9ydDsKKwkJc3VjY2VzcyA9IDE7CisJfQorCWlmIChzdWNjZXNzID09IDApCisJCWVycm9yKCJjaGFubmVsX3NldHVwX2Z3ZF9saXN0ZW5lcjogY2Fubm90IGxpc3RlbiB0byBwb3J0OiAlZCIsCisJCSAgICBsaXN0ZW5fcG9ydCk7CisJZnJlZWFkZHJpbmZvKGFpdG9wKTsKKwlyZXR1cm4gc3VjY2VzczsKK30KKworaW50CitjaGFubmVsX2NhbmNlbF9ycG9ydF9saXN0ZW5lcihjb25zdCBjaGFyICpob3N0LCB1X3Nob3J0IHBvcnQpCit7CisJdV9pbnQgaTsKKwlpbnQgZm91bmQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzX2FsbG9jOyBpKyspIHsKKwkJQ2hhbm5lbCAqYyA9IGNoYW5uZWxzW2ldOworCQlpZiAoYyA9PSBOVUxMIHx8IGMtPnR5cGUgIT0gU1NIX0NIQU5ORUxfUlBPUlRfTElTVEVORVIpCisJCQljb250aW51ZTsKKwkJaWYgKHN0cmNtcChjLT5wYXRoLCBob3N0KSA9PSAwICYmIGMtPmxpc3RlbmluZ19wb3J0ID09IHBvcnQpIHsKKwkJCWRlYnVnMigiJXM6IGNsb3NlIGNoYW5uZWwgJWQiLCBfX2Z1bmNfXywgaSk7CisJCQljaGFubmVsX2ZyZWUoYyk7CisJCQlmb3VuZCA9IDE7CisJCX0KKwl9CisKKwlyZXR1cm4gKGZvdW5kKTsKK30KKworaW50CitjaGFubmVsX2NhbmNlbF9scG9ydF9saXN0ZW5lcihjb25zdCBjaGFyICpsaG9zdCwgdV9zaG9ydCBscG9ydCwKKyAgICBpbnQgY3BvcnQsIGludCBnYXRld2F5X3BvcnRzKQoreworCXVfaW50IGk7CisJaW50IGZvdW5kID0gMDsKKwljb25zdCBjaGFyICphZGRyID0gY2hhbm5lbF9md2RfYmluZF9hZGRyKGxob3N0LCBOVUxMLCAxLCBnYXRld2F5X3BvcnRzKTsKKworCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsc19hbGxvYzsgaSsrKSB7CisJCUNoYW5uZWwgKmMgPSBjaGFubmVsc1tpXTsKKwkJaWYgKGMgPT0gTlVMTCB8fCBjLT50eXBlICE9IFNTSF9DSEFOTkVMX1BPUlRfTElTVEVORVIpCisJCQljb250aW51ZTsKKwkJaWYgKGMtPmxpc3RlbmluZ19wb3J0ICE9IGxwb3J0KQorCQkJY29udGludWU7CisJCWlmIChjcG9ydCA9PSBDSEFOTkVMX0NBTkNFTF9QT1JUX1NUQVRJQykgeworCQkJLyogc2tpcCBkeW5hbWljIGZvcndhcmRpbmdzICovCisJCQlpZiAoYy0+aG9zdF9wb3J0ID09IDApCisJCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQlpZiAoYy0+aG9zdF9wb3J0ICE9IGNwb3J0KQorCQkJCWNvbnRpbnVlOworCQl9CisJCWlmICgoYy0+bGlzdGVuaW5nX2FkZHIgPT0gTlVMTCAmJiBhZGRyICE9IE5VTEwpIHx8CisJCSAgICAoYy0+bGlzdGVuaW5nX2FkZHIgIT0gTlVMTCAmJiBhZGRyID09IE5VTEwpKQorCQkJY29udGludWU7CisJCWlmIChhZGRyID09IE5VTEwgfHwgc3RyY21wKGMtPmxpc3RlbmluZ19hZGRyLCBhZGRyKSA9PSAwKSB7CisJCQlkZWJ1ZzIoIiVzOiBjbG9zZSBjaGFubmVsICVkIiwgX19mdW5jX18sIGkpOworCQkJY2hhbm5lbF9mcmVlKGMpOworCQkJZm91bmQgPSAxOworCQl9CisJfQorCisJcmV0dXJuIChmb3VuZCk7Cit9CisKKy8qIHByb3RvY29sIGxvY2FsIHBvcnQgZndkLCB1c2VkIGJ5IHNzaCAoYW5kIHNzaGQgaW4gdjEpICovCitpbnQKK2NoYW5uZWxfc2V0dXBfbG9jYWxfZndkX2xpc3RlbmVyKGNvbnN0IGNoYXIgKmxpc3Rlbl9ob3N0LCB1X3Nob3J0IGxpc3Rlbl9wb3J0LAorICAgIGNvbnN0IGNoYXIgKmhvc3RfdG9fY29ubmVjdCwgdV9zaG9ydCBwb3J0X3RvX2Nvbm5lY3QsIGludCBnYXRld2F5X3BvcnRzKQoreworCXJldHVybiBjaGFubmVsX3NldHVwX2Z3ZF9saXN0ZW5lcihTU0hfQ0hBTk5FTF9QT1JUX0xJU1RFTkVSLAorCSAgICBsaXN0ZW5faG9zdCwgbGlzdGVuX3BvcnQsIE5VTEwsIGhvc3RfdG9fY29ubmVjdCwgcG9ydF90b19jb25uZWN0LAorCSAgICBnYXRld2F5X3BvcnRzKTsKK30KKworLyogcHJvdG9jb2wgdjIgcmVtb3RlIHBvcnQgZndkLCB1c2VkIGJ5IHNzaGQgKi8KK2ludAorY2hhbm5lbF9zZXR1cF9yZW1vdGVfZndkX2xpc3RlbmVyKGNvbnN0IGNoYXIgKmxpc3Rlbl9hZGRyZXNzLAorICAgIHVfc2hvcnQgbGlzdGVuX3BvcnQsIGludCAqYWxsb2NhdGVkX2xpc3Rlbl9wb3J0LCBpbnQgZ2F0ZXdheV9wb3J0cykKK3sKKwlyZXR1cm4gY2hhbm5lbF9zZXR1cF9md2RfbGlzdGVuZXIoU1NIX0NIQU5ORUxfUlBPUlRfTElTVEVORVIsCisJICAgIGxpc3Rlbl9hZGRyZXNzLCBsaXN0ZW5fcG9ydCwgYWxsb2NhdGVkX2xpc3Rlbl9wb3J0LAorCSAgICBOVUxMLCAwLCBnYXRld2F5X3BvcnRzKTsKK30KKworLyoKKyAqIFRyYW5zbGF0ZSB0aGUgcmVxdWVzdGVkIHJmd2QgbGlzdGVuIGhvc3QgdG8gc29tZXRoaW5nIHVzYWJsZSBmb3IKKyAqIHRoaXMgc2VydmVyLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCitjaGFubmVsX3Jmd2RfYmluZF9ob3N0KGNvbnN0IGNoYXIgKmxpc3Rlbl9ob3N0KQoreworCWlmIChsaXN0ZW5faG9zdCA9PSBOVUxMKSB7CisJCWlmIChkYXRhZmVsbG93cyAmIFNTSF9CVUdfUkZXRF9BRERSKQorCQkJcmV0dXJuICIxMjcuMC4wLjEiOworCQllbHNlCisJCQlyZXR1cm4gImxvY2FsaG9zdCI7CisJfSBlbHNlIGlmICgqbGlzdGVuX2hvc3QgPT0gJ1wwJyB8fCBzdHJjbXAobGlzdGVuX2hvc3QsICIqIikgPT0gMCkgeworCQlpZiAoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX1JGV0RfQUREUikKKwkJCXJldHVybiAiMC4wLjAuMCI7CisJCWVsc2UKKwkJCXJldHVybiAiIjsKKwl9IGVsc2UKKwkJcmV0dXJuIGxpc3Rlbl9ob3N0OworfQorCisvKgorICogSW5pdGlhdGUgZm9yd2FyZGluZyBvZiBjb25uZWN0aW9ucyB0byBwb3J0ICJwb3J0IiBvbiByZW1vdGUgaG9zdCB0aHJvdWdoCisgKiB0aGUgc2VjdXJlIGNoYW5uZWwgdG8gaG9zdDpwb3J0IGZyb20gbG9jYWwgc2lkZS4KKyAqIFJldHVybnMgaGFuZGxlIChpbmRleCkgZm9yIHVwZGF0aW5nIHRoZSBkeW5hbWljIGxpc3RlbiBwb3J0IHdpdGgKKyAqIGNoYW5uZWxfdXBkYXRlX3Blcm1pdHRlZF9vcGVucygpLgorICovCitpbnQKK2NoYW5uZWxfcmVxdWVzdF9yZW1vdGVfZm9yd2FyZGluZyhjb25zdCBjaGFyICpsaXN0ZW5faG9zdCwgdV9zaG9ydCBsaXN0ZW5fcG9ydCwKKyAgICBjb25zdCBjaGFyICpob3N0X3RvX2Nvbm5lY3QsIHVfc2hvcnQgcG9ydF90b19jb25uZWN0KQoreworCWludCB0eXBlLCBzdWNjZXNzID0gMCwgaWR4ID0gLTE7CisKKwkvKiBTZW5kIHRoZSBmb3J3YXJkIHJlcXVlc3QgdG8gdGhlIHJlbW90ZSBzaWRlLiAqLworCWlmIChjb21wYXQyMCkgeworCQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfR0xPQkFMX1JFUVVFU1QpOworCQlwYWNrZXRfcHV0X2NzdHJpbmcoInRjcGlwLWZvcndhcmQiKTsKKwkJcGFja2V0X3B1dF9jaGFyKDEpOwkJLyogYm9vbGVhbjogd2FudCByZXBseSAqLworCQlwYWNrZXRfcHV0X2NzdHJpbmcoY2hhbm5lbF9yZndkX2JpbmRfaG9zdChsaXN0ZW5faG9zdCkpOworCQlwYWNrZXRfcHV0X2ludChsaXN0ZW5fcG9ydCk7CisJCXBhY2tldF9zZW5kKCk7CisJCXBhY2tldF93cml0ZV93YWl0KCk7CisJCS8qIEFzc3VtZSB0aGF0IHNlcnZlciBhY2NlcHRzIHRoZSByZXF1ZXN0ICovCisJCXN1Y2Nlc3MgPSAxOworCX0gZWxzZSB7CisJCXBhY2tldF9zdGFydChTU0hfQ01TR19QT1JUX0ZPUldBUkRfUkVRVUVTVCk7CisJCXBhY2tldF9wdXRfaW50KGxpc3Rlbl9wb3J0KTsKKwkJcGFja2V0X3B1dF9jc3RyaW5nKGhvc3RfdG9fY29ubmVjdCk7CisJCXBhY2tldF9wdXRfaW50KHBvcnRfdG9fY29ubmVjdCk7CisJCXBhY2tldF9zZW5kKCk7CisJCXBhY2tldF93cml0ZV93YWl0KCk7CisKKwkJLyogV2FpdCBmb3IgcmVzcG9uc2UgZnJvbSB0aGUgcmVtb3RlIHNpZGUuICovCisJCXR5cGUgPSBwYWNrZXRfcmVhZCgpOworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBTU0hfU01TR19TVUNDRVNTOgorCQkJc3VjY2VzcyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBTU0hfU01TR19GQUlMVVJFOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBVbmtub3duIHBhY2tldCAqLworCQkJcGFja2V0X2Rpc2Nvbm5lY3QoIlByb3RvY29sIGVycm9yIGZvciBwb3J0IGZvcndhcmQgcmVxdWVzdDoiCisJCQkgICAgInJlY2VpdmVkIHBhY2tldCB0eXBlICVkLiIsIHR5cGUpOworCQl9CisJfQorCWlmIChzdWNjZXNzKSB7CisJCS8qIFJlY29yZCB0aGF0IGNvbm5lY3Rpb24gdG8gdGhpcyBob3N0L3BvcnQgaXMgcGVybWl0dGVkLiAqLworCQlwZXJtaXR0ZWRfb3BlbnMgPSB4cmVhbGxvYyhwZXJtaXR0ZWRfb3BlbnMsCisJCSAgICBudW1fcGVybWl0dGVkX29wZW5zICsgMSwgc2l6ZW9mKCpwZXJtaXR0ZWRfb3BlbnMpKTsKKwkJaWR4ID0gbnVtX3Blcm1pdHRlZF9vcGVucysrOworCQlwZXJtaXR0ZWRfb3BlbnNbaWR4XS5ob3N0X3RvX2Nvbm5lY3QgPSB4c3RyZHVwKGhvc3RfdG9fY29ubmVjdCk7CisJCXBlcm1pdHRlZF9vcGVuc1tpZHhdLnBvcnRfdG9fY29ubmVjdCA9IHBvcnRfdG9fY29ubmVjdDsKKwkJcGVybWl0dGVkX29wZW5zW2lkeF0ubGlzdGVuX3BvcnQgPSBsaXN0ZW5fcG9ydDsKKwl9CisJcmV0dXJuIChpZHgpOworfQorCisvKgorICogUmVxdWVzdCBjYW5jZWxsYXRpb24gb2YgcmVtb3RlIGZvcndhcmRpbmcgb2YgY29ubmVjdGlvbiBob3N0OnBvcnQgZnJvbQorICogbG9jYWwgc2lkZS4KKyAqLworaW50CitjaGFubmVsX3JlcXVlc3RfcmZvcndhcmRfY2FuY2VsKGNvbnN0IGNoYXIgKmhvc3QsIHVfc2hvcnQgcG9ydCkKK3sKKwlpbnQgaTsKKworCWlmICghY29tcGF0MjApCisJCXJldHVybiAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcGVybWl0dGVkX29wZW5zOyBpKyspIHsKKwkJaWYgKHBlcm1pdHRlZF9vcGVuc1tpXS5ob3N0X3RvX2Nvbm5lY3QgIT0gTlVMTCAmJgorCQkgICAgcGVybWl0dGVkX29wZW5zW2ldLmxpc3Rlbl9wb3J0ID09IHBvcnQpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPj0gbnVtX3Blcm1pdHRlZF9vcGVucykgeworCQlkZWJ1ZygiJXM6IHJlcXVlc3RlZCBmb3J3YXJkIG5vdCBmb3VuZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfR0xPQkFMX1JFUVVFU1QpOworCXBhY2tldF9wdXRfY3N0cmluZygiY2FuY2VsLXRjcGlwLWZvcndhcmQiKTsKKwlwYWNrZXRfcHV0X2NoYXIoMCk7CisJcGFja2V0X3B1dF9jc3RyaW5nKGNoYW5uZWxfcmZ3ZF9iaW5kX2hvc3QoaG9zdCkpOworCXBhY2tldF9wdXRfaW50KHBvcnQpOworCXBhY2tldF9zZW5kKCk7CisKKwlwZXJtaXR0ZWRfb3BlbnNbaV0ubGlzdGVuX3BvcnQgPSAwOworCXBlcm1pdHRlZF9vcGVuc1tpXS5wb3J0X3RvX2Nvbm5lY3QgPSAwOworCXhmcmVlKHBlcm1pdHRlZF9vcGVuc1tpXS5ob3N0X3RvX2Nvbm5lY3QpOworCXBlcm1pdHRlZF9vcGVuc1tpXS5ob3N0X3RvX2Nvbm5lY3QgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBhZnRlciByZWNlaXZpbmcgQ0hBTk5FTF9GT1JXQVJESU5HX1JFUVVFU1QuICBUaGlzIGluaXRhdGVzCisgKiBsaXN0ZW5pbmcgZm9yIHRoZSBwb3J0LCBhbmQgc2VuZHMgYmFjayBhIHN1Y2Nlc3MgcmVwbHkgKG9yIGRpc2Nvbm5lY3QKKyAqIG1lc3NhZ2UgaWYgdGhlcmUgd2FzIGFuIGVycm9yKS4KKyAqLworaW50CitjaGFubmVsX2lucHV0X3BvcnRfZm9yd2FyZF9yZXF1ZXN0KGludCBpc19yb290LCBpbnQgZ2F0ZXdheV9wb3J0cykKK3sKKwl1X3Nob3J0IHBvcnQsIGhvc3RfcG9ydDsKKwlpbnQgc3VjY2VzcyA9IDA7CisJY2hhciAqaG9zdG5hbWU7CisKKwkvKiBHZXQgYXJndW1lbnRzIGZyb20gdGhlIHBhY2tldC4gKi8KKwlwb3J0ID0gcGFja2V0X2dldF9pbnQoKTsKKwlob3N0bmFtZSA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOworCWhvc3RfcG9ydCA9IHBhY2tldF9nZXRfaW50KCk7CisKKyNpZm5kZWYgSEFWRV9DWUdXSU4KKwkvKgorCSAqIENoZWNrIHRoYXQgYW4gdW5wcml2aWxlZ2VkIHVzZXIgaXMgbm90IHRyeWluZyB0byBmb3J3YXJkIGEKKwkgKiBwcml2aWxlZ2VkIHBvcnQuCisJICovCisJaWYgKHBvcnQgPCBJUFBPUlRfUkVTRVJWRUQgJiYgIWlzX3Jvb3QpCisJCXBhY2tldF9kaXNjb25uZWN0KAorCQkgICAgIlJlcXVlc3RlZCBmb3J3YXJkaW5nIG9mIHBvcnQgJWQgYnV0IHVzZXIgaXMgbm90IHJvb3QuIiwKKwkJICAgIHBvcnQpOworCWlmIChob3N0X3BvcnQgPT0gMCkKKwkJcGFja2V0X2Rpc2Nvbm5lY3QoIkR5bmFtaWMgZm9yd2FyZGluZyBkZW5pZWQuIik7CisjZW5kaWYKKworCS8qIEluaXRpYXRlIGZvcndhcmRpbmcgKi8KKwlzdWNjZXNzID0gY2hhbm5lbF9zZXR1cF9sb2NhbF9md2RfbGlzdGVuZXIoTlVMTCwgcG9ydCwgaG9zdG5hbWUsCisJICAgIGhvc3RfcG9ydCwgZ2F0ZXdheV9wb3J0cyk7CisKKwkvKiBGcmVlIHRoZSBhcmd1bWVudCBzdHJpbmcuICovCisJeGZyZWUoaG9zdG5hbWUpOworCisJcmV0dXJuIChzdWNjZXNzID8gMCA6IC0xKTsKK30KKworLyoKKyAqIFBlcm1pdHMgb3BlbmluZyB0byBhbnkgaG9zdC9wb3J0IGlmIHBlcm1pdHRlZF9vcGVuc1tdIGlzIGVtcHR5LiAgVGhpcyBpcworICogdXN1YWxseSBjYWxsZWQgYnkgdGhlIHNlcnZlciwgYmVjYXVzZSB0aGUgdXNlciBjb3VsZCBjb25uZWN0IHRvIGFueSBwb3J0CisgKiBhbnl3YXksIGFuZCB0aGUgc2VydmVyIGhhcyBubyB3YXkgdG8ga25vdyBidXQgdG8gdHJ1c3QgdGhlIGNsaWVudCBhbnl3YXkuCisgKi8KK3ZvaWQKK2NoYW5uZWxfcGVybWl0X2FsbF9vcGVucyh2b2lkKQoreworCWlmIChudW1fcGVybWl0dGVkX29wZW5zID09IDApCisJCWFsbF9vcGVuc19wZXJtaXR0ZWQgPSAxOworfQorCit2b2lkCitjaGFubmVsX2FkZF9wZXJtaXR0ZWRfb3BlbnMoY2hhciAqaG9zdCwgaW50IHBvcnQpCit7CisJZGVidWcoImFsbG93IHBvcnQgZm9yd2FyZGluZyB0byBob3N0ICVzIHBvcnQgJWQiLCBob3N0LCBwb3J0KTsKKworCXBlcm1pdHRlZF9vcGVucyA9IHhyZWFsbG9jKHBlcm1pdHRlZF9vcGVucywKKwkgICAgbnVtX3Blcm1pdHRlZF9vcGVucyArIDEsIHNpemVvZigqcGVybWl0dGVkX29wZW5zKSk7CisJcGVybWl0dGVkX29wZW5zW251bV9wZXJtaXR0ZWRfb3BlbnNdLmhvc3RfdG9fY29ubmVjdCA9IHhzdHJkdXAoaG9zdCk7CisJcGVybWl0dGVkX29wZW5zW251bV9wZXJtaXR0ZWRfb3BlbnNdLnBvcnRfdG9fY29ubmVjdCA9IHBvcnQ7CisJbnVtX3Blcm1pdHRlZF9vcGVucysrOworCisJYWxsX29wZW5zX3Blcm1pdHRlZCA9IDA7Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIGxpc3RlbiBwb3J0IGZvciBhIGR5bmFtaWMgcmVtb3RlIGZvcndhcmQsIGFmdGVyCisgKiB0aGUgYWN0dWFsICduZXdwb3J0JyBoYXMgYmVlbiBhbGxvY2F0ZWQuIElmICduZXdwb3J0JyA8IDAgaXMKKyAqIHBhc3NlZCB0aGVuIHRoZXkgZW50cnkgd2lsbCBiZSBpbnZhbGlkYXRlZC4KKyAqLwordm9pZAorY2hhbm5lbF91cGRhdGVfcGVybWl0dGVkX29wZW5zKGludCBpZHgsIGludCBuZXdwb3J0KQoreworCWlmIChpZHggPCAwIHx8IGlkeCA+PSBudW1fcGVybWl0dGVkX29wZW5zKSB7CisJCWRlYnVnKCJjaGFubmVsX3VwZGF0ZV9wZXJtaXR0ZWRfb3BlbnM6IGluZGV4IG91dCBvZiByYW5nZToiCisJCSAgICAiICVkIG51bV9wZXJtaXR0ZWRfb3BlbnMgJWQiLCBpZHgsIG51bV9wZXJtaXR0ZWRfb3BlbnMpOworCQlyZXR1cm47CisJfQorCWRlYnVnKCIlcyBhbGxvd2VkIHBvcnQgJWQgZm9yIGZvcndhcmRpbmcgdG8gaG9zdCAlcyBwb3J0ICVkIiwKKwkgICAgbmV3cG9ydCA+IDAgPyAiVXBkYXRpbmciIDogIlJlbW92aW5nIiwKKwkgICAgbmV3cG9ydCwKKwkgICAgcGVybWl0dGVkX29wZW5zW2lkeF0uaG9zdF90b19jb25uZWN0LAorCSAgICBwZXJtaXR0ZWRfb3BlbnNbaWR4XS5wb3J0X3RvX2Nvbm5lY3QpOworCWlmIChuZXdwb3J0ID49IDApICB7CisJCXBlcm1pdHRlZF9vcGVuc1tpZHhdLmxpc3Rlbl9wb3J0ID0gCisJCSAgICAoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX0RZTkFNSUNfUlBPUlQpID8gMCA6IG5ld3BvcnQ7CisJfSBlbHNlIHsKKwkJcGVybWl0dGVkX29wZW5zW2lkeF0ubGlzdGVuX3BvcnQgPSAwOworCQlwZXJtaXR0ZWRfb3BlbnNbaWR4XS5wb3J0X3RvX2Nvbm5lY3QgPSAwOworCQl4ZnJlZShwZXJtaXR0ZWRfb3BlbnNbaWR4XS5ob3N0X3RvX2Nvbm5lY3QpOworCQlwZXJtaXR0ZWRfb3BlbnNbaWR4XS5ob3N0X3RvX2Nvbm5lY3QgPSBOVUxMOworCX0KK30KKworaW50CitjaGFubmVsX2FkZF9hZG1fcGVybWl0dGVkX29wZW5zKGNoYXIgKmhvc3QsIGludCBwb3J0KQoreworCWRlYnVnKCJjb25maWcgYWxsb3dzIHBvcnQgZm9yd2FyZGluZyB0byBob3N0ICVzIHBvcnQgJWQiLCBob3N0LCBwb3J0KTsKKworCXBlcm1pdHRlZF9hZG1fb3BlbnMgPSB4cmVhbGxvYyhwZXJtaXR0ZWRfYWRtX29wZW5zLAorCSAgICBudW1fYWRtX3Blcm1pdHRlZF9vcGVucyArIDEsIHNpemVvZigqcGVybWl0dGVkX2FkbV9vcGVucykpOworCXBlcm1pdHRlZF9hZG1fb3BlbnNbbnVtX2FkbV9wZXJtaXR0ZWRfb3BlbnNdLmhvc3RfdG9fY29ubmVjdAorCSAgICAgPSB4c3RyZHVwKGhvc3QpOworCXBlcm1pdHRlZF9hZG1fb3BlbnNbbnVtX2FkbV9wZXJtaXR0ZWRfb3BlbnNdLnBvcnRfdG9fY29ubmVjdCA9IHBvcnQ7CisJcmV0dXJuICsrbnVtX2FkbV9wZXJtaXR0ZWRfb3BlbnM7Cit9CisKK3ZvaWQKK2NoYW5uZWxfY2xlYXJfcGVybWl0dGVkX29wZW5zKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3Blcm1pdHRlZF9vcGVuczsgaSsrKQorCQlpZiAocGVybWl0dGVkX29wZW5zW2ldLmhvc3RfdG9fY29ubmVjdCAhPSBOVUxMKQorCQkJeGZyZWUocGVybWl0dGVkX29wZW5zW2ldLmhvc3RfdG9fY29ubmVjdCk7CisJaWYgKG51bV9wZXJtaXR0ZWRfb3BlbnMgPiAwKSB7CisJCXhmcmVlKHBlcm1pdHRlZF9vcGVucyk7CisJCXBlcm1pdHRlZF9vcGVucyA9IE5VTEw7CisJfQorCW51bV9wZXJtaXR0ZWRfb3BlbnMgPSAwOworfQorCit2b2lkCitjaGFubmVsX2NsZWFyX2FkbV9wZXJtaXR0ZWRfb3BlbnModm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fYWRtX3Blcm1pdHRlZF9vcGVuczsgaSsrKQorCQlpZiAocGVybWl0dGVkX2FkbV9vcGVuc1tpXS5ob3N0X3RvX2Nvbm5lY3QgIT0gTlVMTCkKKwkJCXhmcmVlKHBlcm1pdHRlZF9hZG1fb3BlbnNbaV0uaG9zdF90b19jb25uZWN0KTsKKwlpZiAobnVtX2FkbV9wZXJtaXR0ZWRfb3BlbnMgPiAwKSB7CisJCXhmcmVlKHBlcm1pdHRlZF9hZG1fb3BlbnMpOworCQlwZXJtaXR0ZWRfYWRtX29wZW5zID0gTlVMTDsKKwl9CisJbnVtX2FkbV9wZXJtaXR0ZWRfb3BlbnMgPSAwOworfQorCit2b2lkCitjaGFubmVsX3ByaW50X2FkbV9wZXJtaXR0ZWRfb3BlbnModm9pZCkKK3sKKwlpbnQgaTsKKworCXByaW50ZigicGVybWl0b3BlbiIpOworCWlmIChudW1fYWRtX3Blcm1pdHRlZF9vcGVucyA9PSAwKSB7CisJCXByaW50ZigiIGFueVxuIik7CisJCXJldHVybjsKKwl9CisJZm9yIChpID0gMDsgaSA8IG51bV9hZG1fcGVybWl0dGVkX29wZW5zOyBpKyspCisJCWlmIChwZXJtaXR0ZWRfYWRtX29wZW5zW2ldLmhvc3RfdG9fY29ubmVjdCAhPSBOVUxMKQorCQkJcHJpbnRmKCIgJXM6JWQiLCBwZXJtaXR0ZWRfYWRtX29wZW5zW2ldLmhvc3RfdG9fY29ubmVjdCwKKwkJCSAgICBwZXJtaXR0ZWRfYWRtX29wZW5zW2ldLnBvcnRfdG9fY29ubmVjdCk7CisJcHJpbnRmKCJcbiIpOworfQorCisvKiByZXR1cm5zIHBvcnQgbnVtYmVyLCBGV0RfUEVSTUlUX0FOWV9QT1JUIG9yIC0xIG9uIGVycm9yICovCitpbnQKK3Blcm1pdG9wZW5fcG9ydChjb25zdCBjaGFyICpwKQoreworCWludCBwb3J0OworCisJaWYgKHN0cmNtcChwLCAiKiIpID09IDApCisJCXJldHVybiBGV0RfUEVSTUlUX0FOWV9QT1JUOworCWlmICgocG9ydCA9IGEycG9ydChwKSkgPiAwKQorCQlyZXR1cm4gcG9ydDsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKK3BvcnRfbWF0Y2godV9zaG9ydCBhbGxvd2VkcG9ydCwgdV9zaG9ydCByZXF1ZXN0ZWRwb3J0KQoreworCWlmIChhbGxvd2VkcG9ydCA9PSBGV0RfUEVSTUlUX0FOWV9QT1JUIHx8CisJICAgIGFsbG93ZWRwb3J0ID09IHJlcXVlc3RlZHBvcnQpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKiBUcnkgdG8gc3RhcnQgbm9uLWJsb2NraW5nIGNvbm5lY3QgdG8gbmV4dCBob3N0IGluIGNjdHggbGlzdCAqLworc3RhdGljIGludAorY29ubmVjdF9uZXh0KHN0cnVjdCBjaGFubmVsX2Nvbm5lY3QgKmNjdHgpCit7CisJaW50IHNvY2ssIHNhdmVkX2Vycm5vOworCWNoYXIgbnRvcFtOSV9NQVhIT1NUXSwgc3RycG9ydFtOSV9NQVhTRVJWXTsKKworCWZvciAoOyBjY3R4LT5haTsgY2N0eC0+YWkgPSBjY3R4LT5haS0+YWlfbmV4dCkgeworCQlpZiAoY2N0eC0+YWktPmFpX2ZhbWlseSAhPSBBRl9JTkVUICYmCisJCSAgICBjY3R4LT5haS0+YWlfZmFtaWx5ICE9IEFGX0lORVQ2KQorCQkJY29udGludWU7CisJCWlmIChnZXRuYW1laW5mbyhjY3R4LT5haS0+YWlfYWRkciwgY2N0eC0+YWktPmFpX2FkZHJsZW4sCisJCSAgICBudG9wLCBzaXplb2YobnRvcCksIHN0cnBvcnQsIHNpemVvZihzdHJwb3J0KSwKKwkJICAgIE5JX05VTUVSSUNIT1NUfE5JX05VTUVSSUNTRVJWKSAhPSAwKSB7CisJCQllcnJvcigiY29ubmVjdF9uZXh0OiBnZXRuYW1laW5mbyBmYWlsZWQiKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgoc29jayA9IHNvY2tldChjY3R4LT5haS0+YWlfZmFtaWx5LCBjY3R4LT5haS0+YWlfc29ja3R5cGUsCisJCSAgICBjY3R4LT5haS0+YWlfcHJvdG9jb2wpKSA9PSAtMSkgeworCQkJaWYgKGNjdHgtPmFpLT5haV9uZXh0ID09IE5VTEwpCisJCQkJZXJyb3IoInNvY2tldDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWVsc2UKKwkJCQl2ZXJib3NlKCJzb2NrZXQ6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc2V0X25vbmJsb2NrKHNvY2spID09IC0xKQorCQkJZmF0YWwoIiVzOiBzZXRfbm9uYmxvY2soJWQpIiwgX19mdW5jX18sIHNvY2spOworCQlpZiAoY29ubmVjdChzb2NrLCBjY3R4LT5haS0+YWlfYWRkciwKKwkJICAgIGNjdHgtPmFpLT5haV9hZGRybGVuKSA9PSAtMSAmJiBlcnJubyAhPSBFSU5QUk9HUkVTUykgeworCQkJZGVidWcoImNvbm5lY3RfbmV4dDogaG9zdCAlLjEwMHMgKFslLjEwMHNdOiVzKTogIgorCQkJICAgICIlLjEwMHMiLCBjY3R4LT5ob3N0LCBudG9wLCBzdHJwb3J0LAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCQlzYXZlZF9lcnJubyA9IGVycm5vOworCQkJY2xvc2Uoc29jayk7CisJCQllcnJubyA9IHNhdmVkX2Vycm5vOworCQkJY29udGludWU7CS8qIGZhaWwgLS0gdHJ5IG5leHQgKi8KKwkJfQorCQlkZWJ1ZygiY29ubmVjdF9uZXh0OiBob3N0ICUuMTAwcyAoWyUuMTAwc106JXMpICIKKwkJICAgICJpbiBwcm9ncmVzcywgZmQ9JWQiLCBjY3R4LT5ob3N0LCBudG9wLCBzdHJwb3J0LCBzb2NrKTsKKwkJY2N0eC0+YWkgPSBjY3R4LT5haS0+YWlfbmV4dDsKKwkJc2V0X25vZGVsYXkoc29jayk7CisJCXJldHVybiBzb2NrOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkCitjaGFubmVsX2Nvbm5lY3RfY3R4X2ZyZWUoc3RydWN0IGNoYW5uZWxfY29ubmVjdCAqY2N0eCkKK3sKKwl4ZnJlZShjY3R4LT5ob3N0KTsKKwlpZiAoY2N0eC0+YWl0b3ApCisJCWZyZWVhZGRyaW5mbyhjY3R4LT5haXRvcCk7CisJYnplcm8oY2N0eCwgc2l6ZW9mKCpjY3R4KSk7CisJY2N0eC0+aG9zdCA9IE5VTEw7CisJY2N0eC0+YWkgPSBjY3R4LT5haXRvcCA9IE5VTEw7Cit9CisKKy8qIFJldHVybiBDT05ORUNUSU5HIGNoYW5uZWwgdG8gcmVtb3RlIGhvc3QsIHBvcnQgKi8KK3N0YXRpYyBDaGFubmVsICoKK2Nvbm5lY3RfdG8oY29uc3QgY2hhciAqaG9zdCwgdV9zaG9ydCBwb3J0LCBjaGFyICpjdHlwZSwgY2hhciAqcm5hbWUpCit7CisJc3RydWN0IGFkZHJpbmZvIGhpbnRzOworCWludCBnYWllcnI7CisJaW50IHNvY2sgPSAtMTsKKwljaGFyIHN0cnBvcnRbTklfTUFYU0VSVl07CisJc3RydWN0IGNoYW5uZWxfY29ubmVjdCBjY3R4OworCUNoYW5uZWwgKmM7CisKKwltZW1zZXQoJmNjdHgsIDAsIHNpemVvZihjY3R4KSk7CisJbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisJaGludHMuYWlfZmFtaWx5ID0gSVB2NG9yNjsKKwloaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworCXNucHJpbnRmKHN0cnBvcnQsIHNpemVvZiBzdHJwb3J0LCAiJWQiLCBwb3J0KTsKKwlpZiAoKGdhaWVyciA9IGdldGFkZHJpbmZvKGhvc3QsIHN0cnBvcnQsICZoaW50cywgJmNjdHguYWl0b3ApKSAhPSAwKSB7CisJCWVycm9yKCJjb25uZWN0X3RvICUuMTAwczogdW5rbm93biBob3N0ICglcykiLCBob3N0LAorCQkgICAgc3NoX2dhaV9zdHJlcnJvcihnYWllcnIpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY2N0eC5ob3N0ID0geHN0cmR1cChob3N0KTsKKwljY3R4LnBvcnQgPSBwb3J0OworCWNjdHguYWkgPSBjY3R4LmFpdG9wOworCisJaWYgKChzb2NrID0gY29ubmVjdF9uZXh0KCZjY3R4KSkgPT0gLTEpIHsKKwkJZXJyb3IoImNvbm5lY3QgdG8gJS4xMDBzIHBvcnQgJWQgZmFpbGVkOiAlcyIsCisJCSAgICBob3N0LCBwb3J0LCBzdHJlcnJvcihlcnJubykpOworCQljaGFubmVsX2Nvbm5lY3RfY3R4X2ZyZWUoJmNjdHgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYyA9IGNoYW5uZWxfbmV3KGN0eXBlLCBTU0hfQ0hBTk5FTF9DT05ORUNUSU5HLCBzb2NrLCBzb2NrLCAtMSwKKwkgICAgQ0hBTl9UQ1BfV0lORE9XX0RFRkFVTFQsIENIQU5fVENQX1BBQ0tFVF9ERUZBVUxULCAwLCBybmFtZSwgMSk7CisJYy0+Y29ubmVjdF9jdHggPSBjY3R4OworCXJldHVybiBjOworfQorCitDaGFubmVsICoKK2NoYW5uZWxfY29ubmVjdF9ieV9saXN0ZW5fYWRkcmVzcyh1X3Nob3J0IGxpc3Rlbl9wb3J0LCBjaGFyICpjdHlwZSwgY2hhciAqcm5hbWUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3Blcm1pdHRlZF9vcGVuczsgaSsrKSB7CisJCWlmIChwZXJtaXR0ZWRfb3BlbnNbaV0uaG9zdF90b19jb25uZWN0ICE9IE5VTEwgJiYKKwkJICAgIHBvcnRfbWF0Y2gocGVybWl0dGVkX29wZW5zW2ldLmxpc3Rlbl9wb3J0LCBsaXN0ZW5fcG9ydCkpIHsKKwkJCXJldHVybiBjb25uZWN0X3RvKAorCQkJICAgIHBlcm1pdHRlZF9vcGVuc1tpXS5ob3N0X3RvX2Nvbm5lY3QsCisJCQkgICAgcGVybWl0dGVkX29wZW5zW2ldLnBvcnRfdG9fY29ubmVjdCwgY3R5cGUsIHJuYW1lKTsKKwkJfQorCX0KKwllcnJvcigiV0FSTklORzogU2VydmVyIHJlcXVlc3RzIGZvcndhcmRpbmcgZm9yIHVua25vd24gbGlzdGVuX3BvcnQgJWQiLAorCSAgICBsaXN0ZW5fcG9ydCk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIENoZWNrIGlmIGNvbm5lY3RpbmcgdG8gdGhhdCBwb3J0IGlzIHBlcm1pdHRlZCBhbmQgY29ubmVjdC4gKi8KK0NoYW5uZWwgKgorY2hhbm5lbF9jb25uZWN0X3RvKGNvbnN0IGNoYXIgKmhvc3QsIHVfc2hvcnQgcG9ydCwgY2hhciAqY3R5cGUsIGNoYXIgKnJuYW1lKQoreworCWludCBpLCBwZXJtaXQsIHBlcm1pdF9hZG0gPSAxOworCisJcGVybWl0ID0gYWxsX29wZW5zX3Blcm1pdHRlZDsKKwlpZiAoIXBlcm1pdCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3Blcm1pdHRlZF9vcGVuczsgaSsrKQorCQkJaWYgKHBlcm1pdHRlZF9vcGVuc1tpXS5ob3N0X3RvX2Nvbm5lY3QgIT0gTlVMTCAmJgorCQkJICAgIHBvcnRfbWF0Y2gocGVybWl0dGVkX29wZW5zW2ldLnBvcnRfdG9fY29ubmVjdCwgcG9ydCkgJiYKKwkJCSAgICBzdHJjbXAocGVybWl0dGVkX29wZW5zW2ldLmhvc3RfdG9fY29ubmVjdCwgaG9zdCkgPT0gMCkKKwkJCQlwZXJtaXQgPSAxOworCX0KKworCWlmIChudW1fYWRtX3Blcm1pdHRlZF9vcGVucyA+IDApIHsKKwkJcGVybWl0X2FkbSA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fYWRtX3Blcm1pdHRlZF9vcGVuczsgaSsrKQorCQkJaWYgKHBlcm1pdHRlZF9hZG1fb3BlbnNbaV0uaG9zdF90b19jb25uZWN0ICE9IE5VTEwgJiYKKwkJCSAgICBwb3J0X21hdGNoKHBlcm1pdHRlZF9hZG1fb3BlbnNbaV0ucG9ydF90b19jb25uZWN0LCBwb3J0KSAmJgorCQkJICAgIHN0cmNtcChwZXJtaXR0ZWRfYWRtX29wZW5zW2ldLmhvc3RfdG9fY29ubmVjdCwgaG9zdCkKKwkJCSAgICA9PSAwKQorCQkJCXBlcm1pdF9hZG0gPSAxOworCX0KKworCWlmICghcGVybWl0IHx8ICFwZXJtaXRfYWRtKSB7CisJCWxvZ2l0KCJSZWNlaXZlZCByZXF1ZXN0IHRvIGNvbm5lY3QgdG8gaG9zdCAlLjEwMHMgcG9ydCAlZCwgIgorCQkgICAgImJ1dCB0aGUgcmVxdWVzdCB3YXMgZGVuaWVkLiIsIGhvc3QsIHBvcnQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGNvbm5lY3RfdG8oaG9zdCwgcG9ydCwgY3R5cGUsIHJuYW1lKTsKK30KKwordm9pZAorY2hhbm5lbF9zZW5kX3dpbmRvd19jaGFuZ2VzKHZvaWQpCit7CisJdV9pbnQgaTsKKwlzdHJ1Y3Qgd2luc2l6ZSB3czsKKworCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsc19hbGxvYzsgaSsrKSB7CisJCWlmIChjaGFubmVsc1tpXSA9PSBOVUxMIHx8ICFjaGFubmVsc1tpXS0+Y2xpZW50X3R0eSB8fAorCQkgICAgY2hhbm5lbHNbaV0tPnR5cGUgIT0gU1NIX0NIQU5ORUxfT1BFTikKKwkJCWNvbnRpbnVlOworCQlpZiAoaW9jdGwoY2hhbm5lbHNbaV0tPnJmZCwgVElPQ0dXSU5TWiwgJndzKSA8IDApCisJCQljb250aW51ZTsKKwkJY2hhbm5lbF9yZXF1ZXN0X3N0YXJ0KGksICJ3aW5kb3ctY2hhbmdlIiwgMCk7CisJCXBhY2tldF9wdXRfaW50KCh1X2ludCl3cy53c19jb2wpOworCQlwYWNrZXRfcHV0X2ludCgodV9pbnQpd3Mud3Nfcm93KTsKKwkJcGFja2V0X3B1dF9pbnQoKHVfaW50KXdzLndzX3hwaXhlbCk7CisJCXBhY2tldF9wdXRfaW50KCh1X2ludCl3cy53c195cGl4ZWwpOworCQlwYWNrZXRfc2VuZCgpOworCX0KK30KKworLyogLS0gWDExIGZvcndhcmRpbmcgKi8KKworLyoKKyAqIENyZWF0ZXMgYW4gaW50ZXJuZXQgZG9tYWluIHNvY2tldCBmb3IgbGlzdGVuaW5nIGZvciBYMTEgY29ubmVjdGlvbnMuCisgKiBSZXR1cm5zIDAgYW5kIGEgc3VpdGFibGUgZGlzcGxheSBudW1iZXIgZm9yIHRoZSBESVNQTEFZIHZhcmlhYmxlCisgKiBzdG9yZWQgaW4gZGlzcGxheV9udW1iZXJwICwgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJzLgorICovCitpbnQKK3gxMV9jcmVhdGVfZGlzcGxheV9pbmV0KGludCB4MTFfZGlzcGxheV9vZmZzZXQsIGludCB4MTFfdXNlX2xvY2FsaG9zdCwKKyAgICBpbnQgc2luZ2xlX2Nvbm5lY3Rpb24sIHVfaW50ICpkaXNwbGF5X251bWJlcnAsIGludCAqKmNoYW5pZHMpCit7CisJQ2hhbm5lbCAqbmMgPSBOVUxMOworCWludCBkaXNwbGF5X251bWJlciwgc29jazsKKwl1X3Nob3J0IHBvcnQ7CisJc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWksICphaXRvcDsKKwljaGFyIHN0cnBvcnRbTklfTUFYU0VSVl07CisJaW50IGdhaWVyciwgbiwgbnVtX3NvY2tzID0gMCwgc29ja3NbTlVNX1NPQ0tTXTsKKworCWlmIChjaGFuaWRzID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWZvciAoZGlzcGxheV9udW1iZXIgPSB4MTFfZGlzcGxheV9vZmZzZXQ7CisJICAgIGRpc3BsYXlfbnVtYmVyIDwgTUFYX0RJU1BMQVlTOworCSAgICBkaXNwbGF5X251bWJlcisrKSB7CisJCXBvcnQgPSA2MDAwICsgZGlzcGxheV9udW1iZXI7CisJCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworCQloaW50cy5haV9mYW1pbHkgPSBJUHY0b3I2OworCQloaW50cy5haV9mbGFncyA9IHgxMV91c2VfbG9jYWxob3N0ID8gMDogQUlfUEFTU0lWRTsKKwkJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKwkJc25wcmludGYoc3RycG9ydCwgc2l6ZW9mIHN0cnBvcnQsICIlZCIsIHBvcnQpOworCQlpZiAoKGdhaWVyciA9IGdldGFkZHJpbmZvKE5VTEwsIHN0cnBvcnQsICZoaW50cywgJmFpdG9wKSkgIT0gMCkgeworCQkJZXJyb3IoImdldGFkZHJpbmZvOiAlLjEwMHMiLCBzc2hfZ2FpX3N0cmVycm9yKGdhaWVycikpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWZvciAoYWkgPSBhaXRvcDsgYWk7IGFpID0gYWktPmFpX25leHQpIHsKKwkJCWlmIChhaS0+YWlfZmFtaWx5ICE9IEFGX0lORVQgJiYgYWktPmFpX2ZhbWlseSAhPSBBRl9JTkVUNikKKwkJCQljb250aW51ZTsKKwkJCXNvY2sgPSBzb2NrZXQoYWktPmFpX2ZhbWlseSwgYWktPmFpX3NvY2t0eXBlLAorCQkJICAgIGFpLT5haV9wcm90b2NvbCk7CisJCQlpZiAoc29jayA8IDApIHsKKwkJCQlpZiAoKGVycm5vICE9IEVJTlZBTCkgJiYgKGVycm5vICE9IEVBRk5PU1VQUE9SVCkKKyNpZmRlZiBFUEZOT1NVUFBPUlQKKwkJCQkgICAgJiYgKGVycm5vICE9IEVQRk5PU1VQUE9SVCkKKyNlbmRpZiAKKwkJCQkgICAgKSB7CisJCQkJCWVycm9yKCJzb2NrZXQ6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCWZyZWVhZGRyaW5mbyhhaXRvcCk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9IGVsc2UgeworCQkJCQlkZWJ1ZygieDExX2NyZWF0ZV9kaXNwbGF5X2luZXQ6IFNvY2tldCBmYW1pbHkgJWQgbm90IHN1cHBvcnRlZCIsCisJCQkJCQkgYWktPmFpX2ZhbWlseSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCWlmIChhaS0+YWlfZmFtaWx5ID09IEFGX0lORVQ2KQorCQkJCXNvY2tfc2V0X3Y2b25seShzb2NrKTsKKwkJCWlmICh4MTFfdXNlX2xvY2FsaG9zdCkKKwkJCQljaGFubmVsX3NldF9yZXVzZWFkZHIoc29jayk7CisJCQlpZiAoYmluZChzb2NrLCBhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4pIDwgMCkgeworCQkJCWRlYnVnMigiYmluZCBwb3J0ICVkOiAlLjEwMHMiLCBwb3J0LCBzdHJlcnJvcihlcnJubykpOworCQkJCWNsb3NlKHNvY2spOworCisJCQkJZm9yIChuID0gMDsgbiA8IG51bV9zb2NrczsgbisrKSB7CisJCQkJCWNsb3NlKHNvY2tzW25dKTsKKwkJCQl9CisJCQkJbnVtX3NvY2tzID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNvY2tzW251bV9zb2NrcysrXSA9IHNvY2s7CisJCQlpZiAobnVtX3NvY2tzID09IE5VTV9TT0NLUykKKwkJCQlicmVhazsKKwkJfQorCQlmcmVlYWRkcmluZm8oYWl0b3ApOworCQlpZiAobnVtX3NvY2tzID4gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoZGlzcGxheV9udW1iZXIgPj0gTUFYX0RJU1BMQVlTKSB7CisJCWVycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgaW50ZXJuZXQtZG9tYWluIFgxMSBkaXNwbGF5IHNvY2tldC4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvKiBTdGFydCBsaXN0ZW5pbmcgZm9yIGNvbm5lY3Rpb25zIG9uIHRoZSBzb2NrZXQuICovCisJZm9yIChuID0gMDsgbiA8IG51bV9zb2NrczsgbisrKSB7CisJCXNvY2sgPSBzb2Nrc1tuXTsKKwkJaWYgKGxpc3Rlbihzb2NrLCBTU0hfTElTVEVOX0JBQ0tMT0cpIDwgMCkgeworCQkJZXJyb3IoImxpc3RlbjogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWNsb3NlKHNvY2spOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJLyogQWxsb2NhdGUgYSBjaGFubmVsIGZvciBlYWNoIHNvY2tldC4gKi8KKwkqY2hhbmlkcyA9IHhjYWxsb2MobnVtX3NvY2tzICsgMSwgc2l6ZW9mKCoqY2hhbmlkcykpOworCWZvciAobiA9IDA7IG4gPCBudW1fc29ja3M7IG4rKykgeworCQlzb2NrID0gc29ja3Nbbl07CisJCW5jID0gY2hhbm5lbF9uZXcoIngxMSBsaXN0ZW5lciIsCisJCSAgICBTU0hfQ0hBTk5FTF9YMTFfTElTVEVORVIsIHNvY2ssIHNvY2ssIC0xLAorCQkgICAgQ0hBTl9YMTFfV0lORE9XX0RFRkFVTFQsIENIQU5fWDExX1BBQ0tFVF9ERUZBVUxULAorCQkgICAgMCwgIlgxMSBpbmV0IGxpc3RlbmVyIiwgMSk7CisJCW5jLT5zaW5nbGVfY29ubmVjdGlvbiA9IHNpbmdsZV9jb25uZWN0aW9uOworCQkoKmNoYW5pZHMpW25dID0gbmMtPnNlbGY7CisJfQorCSgqY2hhbmlkcylbbl0gPSAtMTsKKworCS8qIFJldHVybiB0aGUgZGlzcGxheSBudW1iZXIgZm9yIHRoZSBESVNQTEFZIGVudmlyb25tZW50IHZhcmlhYmxlLiAqLworCSpkaXNwbGF5X251bWJlcnAgPSBkaXNwbGF5X251bWJlcjsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50Citjb25uZWN0X2xvY2FsX3hzb2NrZXRfcGF0aChjb25zdCBjaGFyICpwYXRobmFtZSkKK3sKKwlpbnQgc29jazsKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcjsKKworCXNvY2sgPSBzb2NrZXQoQUZfVU5JWCwgU09DS19TVFJFQU0sIDApOworCWlmIChzb2NrIDwgMCkKKwkJZXJyb3IoInNvY2tldDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKwlzdHJsY3B5KGFkZHIuc3VuX3BhdGgsIHBhdGhuYW1lLCBzaXplb2YgYWRkci5zdW5fcGF0aCk7CisJaWYgKGNvbm5lY3Qoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpID09IDApCisJCXJldHVybiBzb2NrOworCWNsb3NlKHNvY2spOworCWVycm9yKCJjb25uZWN0ICUuMTAwczogJS4xMDBzIiwgYWRkci5zdW5fcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKK2Nvbm5lY3RfbG9jYWxfeHNvY2tldCh1X2ludCBkbnIpCit7CisJY2hhciBidWZbMTAyNF07CisJc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCBfUEFUSF9VTklYX1gsIGRucik7CisJcmV0dXJuIGNvbm5lY3RfbG9jYWxfeHNvY2tldF9wYXRoKGJ1Zik7Cit9CisKK2ludAoreDExX2Nvbm5lY3RfZGlzcGxheSh2b2lkKQoreworCXVfaW50IGRpc3BsYXlfbnVtYmVyOworCWNvbnN0IGNoYXIgKmRpc3BsYXk7CisJY2hhciBidWZbMTAyNF0sICpjcDsKKwlzdHJ1Y3QgYWRkcmluZm8gaGludHMsICphaSwgKmFpdG9wOworCWNoYXIgc3RycG9ydFtOSV9NQVhTRVJWXTsKKwlpbnQgZ2FpZXJyLCBzb2NrID0gMDsKKworCS8qIFRyeSB0byBvcGVuIGEgc29ja2V0IGZvciB0aGUgbG9jYWwgWCBzZXJ2ZXIuICovCisJZGlzcGxheSA9IGdldGVudigiRElTUExBWSIpOworCWlmICghZGlzcGxheSkgeworCQllcnJvcigiRElTUExBWSBub3Qgc2V0LiIpOworCQlyZXR1cm4gLTE7CisJfQorCS8qCisJICogTm93IHdlIGRlY29kZSB0aGUgdmFsdWUgb2YgdGhlIERJU1BMQVkgdmFyaWFibGUgYW5kIG1ha2UgYQorCSAqIGNvbm5lY3Rpb24gdG8gdGhlIHJlYWwgWCBzZXJ2ZXIuCisJICovCisKKwkvKiBDaGVjayBpZiB0aGUgZGlzcGxheSBpcyBmcm9tIGxhdW5jaGQuICovCisjaWZkZWYgX19BUFBMRV9fCisJaWYgKHN0cm5jbXAoZGlzcGxheSwgIi90bXAvbGF1bmNoIiwgMTEpID09IDApIHsKKwkJc29jayA9IGNvbm5lY3RfbG9jYWxfeHNvY2tldF9wYXRoKGRpc3BsYXkpOworCQlpZiAoc29jayA8IDApCisJCQlyZXR1cm4gLTE7CisKKwkJLyogT0ssIHdlIG5vdyBoYXZlIGEgY29ubmVjdGlvbiB0byB0aGUgZGlzcGxheS4gKi8KKwkJcmV0dXJuIHNvY2s7CisJfQorI2VuZGlmCisJLyoKKwkgKiBDaGVjayBpZiBpdCBpcyBhIHVuaXggZG9tYWluIHNvY2tldC4gIFVuaXggZG9tYWluIGRpc3BsYXlzIGFyZSBpbgorCSAqIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6IHVuaXg6ZFsuc10sIDpkWy5zXSwgOjpkWy5zXQorCSAqLworCWlmIChzdHJuY21wKGRpc3BsYXksICJ1bml4OiIsIDUpID09IDAgfHwKKwkgICAgZGlzcGxheVswXSA9PSAnOicpIHsKKwkJLyogQ29ubmVjdCB0byB0aGUgdW5peCBkb21haW4gc29ja2V0LiAqLworCQlpZiAoc3NjYW5mKHN0cnJjaHIoZGlzcGxheSwgJzonKSArIDEsICIldSIsICZkaXNwbGF5X251bWJlcikgIT0gMSkgeworCQkJZXJyb3IoIkNvdWxkIG5vdCBwYXJzZSBkaXNwbGF5IG51bWJlciBmcm9tIERJU1BMQVk6ICUuMTAwcyIsCisJCQkgICAgZGlzcGxheSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJLyogQ3JlYXRlIGEgc29ja2V0LiAqLworCQlzb2NrID0gY29ubmVjdF9sb2NhbF94c29ja2V0KGRpc3BsYXlfbnVtYmVyKTsKKwkJaWYgKHNvY2sgPCAwKQorCQkJcmV0dXJuIC0xOworCisJCS8qIE9LLCB3ZSBub3cgaGF2ZSBhIGNvbm5lY3Rpb24gdG8gdGhlIGRpc3BsYXkuICovCisJCXJldHVybiBzb2NrOworCX0KKwkvKgorCSAqIENvbm5lY3QgdG8gYW4gaW5ldCBzb2NrZXQuICBUaGUgRElTUExBWSB2YWx1ZSBpcyBzdXBwb3NlZGx5CisJICogaG9zdG5hbWU6ZFsuc10sIHdoZXJlIGhvc3RuYW1lIG1heSBhbHNvIGJlIG51bWVyaWMgSVAgYWRkcmVzcy4KKwkgKi8KKwlzdHJsY3B5KGJ1ZiwgZGlzcGxheSwgc2l6ZW9mKGJ1ZikpOworCWNwID0gc3RyY2hyKGJ1ZiwgJzonKTsKKwlpZiAoIWNwKSB7CisJCWVycm9yKCJDb3VsZCBub3QgZmluZCAnOicgaW4gRElTUExBWTogJS4xMDBzIiwgZGlzcGxheSk7CisJCXJldHVybiAtMTsKKwl9CisJKmNwID0gMDsKKwkvKiBidWYgbm93IGNvbnRhaW5zIHRoZSBob3N0IG5hbWUuICBCdXQgZmlyc3Qgd2UgcGFyc2UgdGhlIGRpc3BsYXkgbnVtYmVyLiAqLworCWlmIChzc2NhbmYoY3AgKyAxLCAiJXUiLCAmZGlzcGxheV9udW1iZXIpICE9IDEpIHsKKwkJZXJyb3IoIkNvdWxkIG5vdCBwYXJzZSBkaXNwbGF5IG51bWJlciBmcm9tIERJU1BMQVk6ICUuMTAwcyIsCisJCSAgICBkaXNwbGF5KTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIExvb2sgdXAgdGhlIGhvc3QgYWRkcmVzcyAqLworCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworCWhpbnRzLmFpX2ZhbWlseSA9IElQdjRvcjY7CisJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKwlzbnByaW50ZihzdHJwb3J0LCBzaXplb2Ygc3RycG9ydCwgIiV1IiwgNjAwMCArIGRpc3BsYXlfbnVtYmVyKTsKKwlpZiAoKGdhaWVyciA9IGdldGFkZHJpbmZvKGJ1Ziwgc3RycG9ydCwgJmhpbnRzLCAmYWl0b3ApKSAhPSAwKSB7CisJCWVycm9yKCIlLjEwMHM6IHVua25vd24gaG9zdC4gKCVzKSIsIGJ1ZiwKKwkJc3NoX2dhaV9zdHJlcnJvcihnYWllcnIpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlmb3IgKGFpID0gYWl0b3A7IGFpOyBhaSA9IGFpLT5haV9uZXh0KSB7CisJCS8qIENyZWF0ZSBhIHNvY2tldC4gKi8KKwkJc29jayA9IHNvY2tldChhaS0+YWlfZmFtaWx5LCBhaS0+YWlfc29ja3R5cGUsIGFpLT5haV9wcm90b2NvbCk7CisJCWlmIChzb2NrIDwgMCkgeworCQkJZGVidWcyKCJzb2NrZXQ6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBDb25uZWN0IGl0IHRvIHRoZSBkaXNwbGF5LiAqLworCQlpZiAoY29ubmVjdChzb2NrLCBhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4pIDwgMCkgeworCQkJZGVidWcyKCJjb25uZWN0ICUuMTAwcyBwb3J0ICV1OiAlLjEwMHMiLCBidWYsCisJCQkgICAgNjAwMCArIGRpc3BsYXlfbnVtYmVyLCBzdHJlcnJvcihlcnJubykpOworCQkJY2xvc2Uoc29jayk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBTdWNjZXNzICovCisJCWJyZWFrOworCX0KKwlmcmVlYWRkcmluZm8oYWl0b3ApOworCWlmICghYWkpIHsKKwkJZXJyb3IoImNvbm5lY3QgJS4xMDBzIHBvcnQgJXU6ICUuMTAwcyIsIGJ1ZiwgNjAwMCArIGRpc3BsYXlfbnVtYmVyLAorCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzZXRfbm9kZWxheShzb2NrKTsKKwlyZXR1cm4gc29jazsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gU1NIX1NNU0dfWDExX09QRU4gaXMgcmVjZWl2ZWQuICBUaGUgcGFja2V0IGNvbnRhaW5zCisgKiB0aGUgcmVtb3RlIGNoYW5uZWwgbnVtYmVyLiAgV2Ugc2hvdWxkIGRvIHdoYXRldmVyIHdlIHdhbnQsIGFuZCByZXNwb25kCisgKiB3aXRoIGVpdGhlciBTU0hfTVNHX09QRU5fQ09ORklSTUFUSU9OIG9yIFNTSF9NU0dfT1BFTl9GQUlMVVJFLgorICovCisKKy8qIEFSR1NVU0VEICovCit2b2lkCit4MTFfaW5wdXRfb3BlbihpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKK3sKKwlDaGFubmVsICpjID0gTlVMTDsKKwlpbnQgcmVtb3RlX2lkLCBzb2NrID0gMDsKKwljaGFyICpyZW1vdGVfaG9zdDsKKworCWRlYnVnKCJSZWNlaXZlZCBYMTEgb3BlbiByZXF1ZXN0LiIpOworCisJcmVtb3RlX2lkID0gcGFja2V0X2dldF9pbnQoKTsKKworCWlmIChwYWNrZXRfZ2V0X3Byb3RvY29sX2ZsYWdzKCkgJiBTU0hfUFJPVE9GTEFHX0hPU1RfSU5fRldEX09QRU4pIHsKKwkJcmVtb3RlX2hvc3QgPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKKwl9IGVsc2UgeworCQlyZW1vdGVfaG9zdCA9IHhzdHJkdXAoInVua25vd24gKHJlbW90ZSBkaWQgbm90IHN1cHBseSBuYW1lKSIpOworCX0KKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisKKwkvKiBPYnRhaW4gYSBjb25uZWN0aW9uIHRvIHRoZSByZWFsIFggZGlzcGxheS4gKi8KKwlzb2NrID0geDExX2Nvbm5lY3RfZGlzcGxheSgpOworCWlmIChzb2NrICE9IC0xKSB7CisJCS8qIEFsbG9jYXRlIGEgY2hhbm5lbCBmb3IgdGhpcyBjb25uZWN0aW9uLiAqLworCQljID0gY2hhbm5lbF9uZXcoImNvbm5lY3RlZCB4MTEgc29ja2V0IiwKKwkJICAgIFNTSF9DSEFOTkVMX1gxMV9PUEVOLCBzb2NrLCBzb2NrLCAtMSwgMCwgMCwgMCwKKwkJICAgIHJlbW90ZV9ob3N0LCAxKTsKKwkJYy0+cmVtb3RlX2lkID0gcmVtb3RlX2lkOworCQljLT5mb3JjZV9kcmFpbiA9IDE7CisJfQorCXhmcmVlKHJlbW90ZV9ob3N0KTsKKwlpZiAoYyA9PSBOVUxMKSB7CisJCS8qIFNlbmQgcmVmdXNhbCB0byB0aGUgcmVtb3RlIGhvc3QuICovCisJCXBhY2tldF9zdGFydChTU0hfTVNHX0NIQU5ORUxfT1BFTl9GQUlMVVJFKTsKKwkJcGFja2V0X3B1dF9pbnQocmVtb3RlX2lkKTsKKwl9IGVsc2UgeworCQkvKiBTZW5kIGEgY29uZmlybWF0aW9uIHRvIHRoZSByZW1vdGUgaG9zdC4gKi8KKwkJcGFja2V0X3N0YXJ0KFNTSF9NU0dfQ0hBTk5FTF9PUEVOX0NPTkZJUk1BVElPTik7CisJCXBhY2tldF9wdXRfaW50KHJlbW90ZV9pZCk7CisJCXBhY2tldF9wdXRfaW50KGMtPnNlbGYpOworCX0KKwlwYWNrZXRfc2VuZCgpOworfQorCisvKiBkdW1teSBwcm90b2NvbCBoYW5kbGVyIHRoYXQgZGVuaWVzIFNTSC0xIHJlcXVlc3RzIChhZ2VudC94MTEpICovCisvKiBBUkdTVVNFRCAqLwordm9pZAorZGVueV9pbnB1dF9vcGVuKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQoreworCWludCByY2hhbiA9IHBhY2tldF9nZXRfaW50KCk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNTSF9TTVNHX0FHRU5UX09QRU46CisJCWVycm9yKCJXYXJuaW5nOiBzc2ggc2VydmVyIHRyaWVkIGFnZW50IGZvcndhcmRpbmcuIik7CisJCWJyZWFrOworCWNhc2UgU1NIX1NNU0dfWDExX09QRU46CisJCWVycm9yKCJXYXJuaW5nOiBzc2ggc2VydmVyIHRyaWVkIFgxMSBmb3J3YXJkaW5nLiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJvcigiZGVueV9pbnB1dF9vcGVuOiB0eXBlICVkIiwgdHlwZSk7CisJCWJyZWFrOworCX0KKwllcnJvcigiV2FybmluZzogdGhpcyBpcyBwcm9iYWJseSBhIGJyZWFrLWluIGF0dGVtcHQgYnkgYSBtYWxpY2lvdXMgc2VydmVyLiIpOworCXBhY2tldF9zdGFydChTU0hfTVNHX0NIQU5ORUxfT1BFTl9GQUlMVVJFKTsKKwlwYWNrZXRfcHV0X2ludChyY2hhbik7CisJcGFja2V0X3NlbmQoKTsKK30KKworLyoKKyAqIFJlcXVlc3RzIGZvcndhcmRpbmcgb2YgWDExIGNvbm5lY3Rpb25zLCBnZW5lcmF0ZXMgZmFrZSBhdXRoZW50aWNhdGlvbgorICogZGF0YSwgYW5kIGVuYWJsZXMgYXV0aGVudGljYXRpb24gc3Bvb2ZpbmcuCisgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgaW4gdGhlIGNsaWVudCBvbmx5LgorICovCit2b2lkCit4MTFfcmVxdWVzdF9mb3J3YXJkaW5nX3dpdGhfc3Bvb2ZpbmcoaW50IGNsaWVudF9zZXNzaW9uX2lkLCBjb25zdCBjaGFyICpkaXNwLAorICAgIGNvbnN0IGNoYXIgKnByb3RvLCBjb25zdCBjaGFyICpkYXRhLCBpbnQgd2FudF9yZXBseSkKK3sKKwl1X2ludCBkYXRhX2xlbiA9ICh1X2ludCkgc3RybGVuKGRhdGEpIC8gMjsKKwl1X2ludCBpLCB2YWx1ZTsKKwljaGFyICpuZXdfZGF0YTsKKwlpbnQgc2NyZWVuX251bWJlcjsKKwljb25zdCBjaGFyICpjcDsKKwl1X2ludDMyX3Qgcm5kID0gMDsKKworCWlmICh4MTFfc2F2ZWRfZGlzcGxheSA9PSBOVUxMKQorCQl4MTFfc2F2ZWRfZGlzcGxheSA9IHhzdHJkdXAoZGlzcCk7CisJZWxzZSBpZiAoc3RyY21wKGRpc3AsIHgxMV9zYXZlZF9kaXNwbGF5KSAhPSAwKSB7CisJCWVycm9yKCJ4MTFfcmVxdWVzdF9mb3J3YXJkaW5nX3dpdGhfc3Bvb2Zpbmc6IGRpZmZlcmVudCAiCisJCSAgICAiJERJU1BMQVkgYWxyZWFkeSBmb3J3YXJkZWQiKTsKKwkJcmV0dXJuOworCX0KKworCWNwID0gc3RyY2hyKGRpc3AsICc6Jyk7CisJaWYgKGNwKQorCQljcCA9IHN0cmNocihjcCwgJy4nKTsKKwlpZiAoY3ApCisJCXNjcmVlbl9udW1iZXIgPSAodV9pbnQpc3RydG9udW0oY3AgKyAxLCAwLCA0MDAsIE5VTEwpOworCWVsc2UKKwkJc2NyZWVuX251bWJlciA9IDA7CisKKwlpZiAoeDExX3NhdmVkX3Byb3RvID09IE5VTEwpIHsKKwkJLyogU2F2ZSBwcm90b2NvbCBuYW1lLiAqLworCQl4MTFfc2F2ZWRfcHJvdG8gPSB4c3RyZHVwKHByb3RvKTsKKwkJLyoKKwkJICogRXh0cmFjdCByZWFsIGF1dGhlbnRpY2F0aW9uIGRhdGEgYW5kIGdlbmVyYXRlIGZha2UgZGF0YQorCQkgKiBvZiB0aGUgc2FtZSBsZW5ndGguCisJCSAqLworCQl4MTFfc2F2ZWRfZGF0YSA9IHhtYWxsb2MoZGF0YV9sZW4pOworCQl4MTFfZmFrZV9kYXRhID0geG1hbGxvYyhkYXRhX2xlbik7CisJCWZvciAoaSA9IDA7IGkgPCBkYXRhX2xlbjsgaSsrKSB7CisJCQlpZiAoc3NjYW5mKGRhdGEgKyAyICogaSwgIiUyeCIsICZ2YWx1ZSkgIT0gMSkKKwkJCQlmYXRhbCgieDExX3JlcXVlc3RfZm9yd2FyZGluZzogYmFkICIKKwkJCQkgICAgImF1dGhlbnRpY2F0aW9uIGRhdGE6ICUuMTAwcyIsIGRhdGEpOworCQkJaWYgKGkgJSA0ID09IDApCisJCQkJcm5kID0gYXJjNHJhbmRvbSgpOworCQkJeDExX3NhdmVkX2RhdGFbaV0gPSB2YWx1ZTsKKwkJCXgxMV9mYWtlX2RhdGFbaV0gPSBybmQgJiAweGZmOworCQkJcm5kID4+PSA4OworCQl9CisJCXgxMV9zYXZlZF9kYXRhX2xlbiA9IGRhdGFfbGVuOworCQl4MTFfZmFrZV9kYXRhX2xlbiA9IGRhdGFfbGVuOworCX0KKworCS8qIENvbnZlcnQgdGhlIGZha2UgZGF0YSBpbnRvIGhleC4gKi8KKwluZXdfZGF0YSA9IHRvaGV4KHgxMV9mYWtlX2RhdGEsIGRhdGFfbGVuKTsKKworCS8qIFNlbmQgdGhlIHJlcXVlc3QgcGFja2V0LiAqLworCWlmIChjb21wYXQyMCkgeworCQljaGFubmVsX3JlcXVlc3Rfc3RhcnQoY2xpZW50X3Nlc3Npb25faWQsICJ4MTEtcmVxIiwgd2FudF9yZXBseSk7CisJCXBhY2tldF9wdXRfY2hhcigwKTsJLyogWFhYIGJvb2wgc2luZ2xlIGNvbm5lY3Rpb24gKi8KKwl9IGVsc2UgeworCQlwYWNrZXRfc3RhcnQoU1NIX0NNU0dfWDExX1JFUVVFU1RfRk9SV0FSRElORyk7CisJfQorCXBhY2tldF9wdXRfY3N0cmluZyhwcm90byk7CisJcGFja2V0X3B1dF9jc3RyaW5nKG5ld19kYXRhKTsKKwlwYWNrZXRfcHV0X2ludChzY3JlZW5fbnVtYmVyKTsKKwlwYWNrZXRfc2VuZCgpOworCXBhY2tldF93cml0ZV93YWl0KCk7CisJeGZyZWUobmV3X2RhdGEpOworfQorCisKKy8qIC0tIGFnZW50IGZvcndhcmRpbmcgKi8KKworLyogU2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBzZXJ2ZXIgdG8gcmVxdWVzdCBhdXRoZW50aWNhdGlvbiBmZCBmb3J3YXJkaW5nLiAqLworCit2b2lkCithdXRoX3JlcXVlc3RfZm9yd2FyZGluZyh2b2lkKQoreworCXBhY2tldF9zdGFydChTU0hfQ01TR19BR0VOVF9SRVFVRVNUX0ZPUldBUkRJTkcpOworCXBhY2tldF9zZW5kKCk7CisJcGFja2V0X3dyaXRlX3dhaXQoKTsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvY2hhbm5lbHMuaCBiL29wZW5zc2gtNi4wcDEvY2hhbm5lbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWYwMWM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9jaGFubmVscy5oCkBAIC0wLDAgKzEsMzAzIEBACisvKiAkT3BlbkJTRDogY2hhbm5lbHMuaCx2IDEuMTA5IDIwMTEvMDkvMjMgMDc6NDU6MDUgbWFya3VzIEV4cCAkICovCisKKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBDSEFOTkVMX0gKKyNkZWZpbmUgQ0hBTk5FTF9ICisKKy8qIERlZmluaXRpb25zIGZvciBjaGFubmVsIHR5cGVzLiAqLworI2RlZmluZSBTU0hfQ0hBTk5FTF9YMTFfTElTVEVORVIJMQkvKiBMaXN0ZW5pbmcgZm9yIGluZXQgWDExIGNvbm4uICovCisjZGVmaW5lIFNTSF9DSEFOTkVMX1BPUlRfTElTVEVORVIJMgkvKiBMaXN0ZW5pbmcgb24gYSBwb3J0LiAqLworI2RlZmluZSBTU0hfQ0hBTk5FTF9PUEVOSU5HCQkzCS8qIHdhaXRpbmcgZm9yIGNvbmZpcm1hdGlvbiAqLworI2RlZmluZSBTU0hfQ0hBTk5FTF9PUEVOCQk0CS8qIG5vcm1hbCBvcGVuIHR3by13YXkgY2hhbm5lbCAqLworI2RlZmluZSBTU0hfQ0hBTk5FTF9DTE9TRUQJCTUJLyogd2FpdGluZyBmb3IgY2xvc2UgY29uZmlybWF0aW9uICovCisjZGVmaW5lIFNTSF9DSEFOTkVMX0FVVEhfU09DS0VUCQk2CS8qIGF1dGhlbnRpY2F0aW9uIHNvY2tldCAqLworI2RlZmluZSBTU0hfQ0hBTk5FTF9YMTFfT1BFTgkJNwkvKiByZWFkaW5nIGZpcnN0IFgxMSBwYWNrZXQgKi8KKyNkZWZpbmUgU1NIX0NIQU5ORUxfSU5QVVRfRFJBSU5JTkcJOAkvKiBzZW5kaW5nIHJlbWFpbmluZyBkYXRhIHRvIGNvbm4gKi8KKyNkZWZpbmUgU1NIX0NIQU5ORUxfT1VUUFVUX0RSQUlOSU5HCTkJLyogc2VuZGluZyByZW1haW5pbmcgZGF0YSB0byBhcHAgKi8KKyNkZWZpbmUgU1NIX0NIQU5ORUxfTEFSVkFMCQkxMAkvKiBsYXJ2YWwgc2Vzc2lvbiAqLworI2RlZmluZSBTU0hfQ0hBTk5FTF9SUE9SVF9MSVNURU5FUgkxMQkvKiBMaXN0ZW5pbmcgdG8gYSBSLXN0eWxlIHBvcnQgICovCisjZGVmaW5lIFNTSF9DSEFOTkVMX0NPTk5FQ1RJTkcJCTEyCisjZGVmaW5lIFNTSF9DSEFOTkVMX0RZTkFNSUMJCTEzCisjZGVmaW5lIFNTSF9DSEFOTkVMX1pPTUJJRQkJMTQJLyogQWxtb3N0IGRlYWQuICovCisjZGVmaW5lIFNTSF9DSEFOTkVMX01VWF9MSVNURU5FUgkxNQkvKiBMaXN0ZW5lciBmb3IgbXV4IGNvbm4uICovCisjZGVmaW5lIFNTSF9DSEFOTkVMX01VWF9DTElFTlQJCTE2CS8qIENvbm4uIHRvIG11eCBzbGF2ZSAqLworI2RlZmluZSBTU0hfQ0hBTk5FTF9NQVhfVFlQRQkJMTcKKworI2RlZmluZSBDSEFOTkVMX0NBTkNFTF9QT1JUX1NUQVRJQwktMQorCitzdHJ1Y3QgQ2hhbm5lbDsKK3R5cGVkZWYgc3RydWN0IENoYW5uZWwgQ2hhbm5lbDsKKwordHlwZWRlZiB2b2lkIGNoYW5uZWxfb3Blbl9mbihpbnQsIGludCwgdm9pZCAqKTsKK3R5cGVkZWYgdm9pZCBjaGFubmVsX2NhbGxiYWNrX2ZuKGludCwgdm9pZCAqKTsKK3R5cGVkZWYgaW50IGNoYW5uZWxfaW5maWx0ZXJfZm4oc3RydWN0IENoYW5uZWwgKiwgY2hhciAqLCBpbnQpOwordHlwZWRlZiB2b2lkIGNoYW5uZWxfZmlsdGVyX2NsZWFudXBfZm4oaW50LCB2b2lkICopOwordHlwZWRlZiB1X2NoYXIgKmNoYW5uZWxfb3V0ZmlsdGVyX2ZuKHN0cnVjdCBDaGFubmVsICosIHVfY2hhciAqKiwgdV9pbnQgKik7CisKKy8qIENoYW5uZWwgc3VjY2Vzcy9mYWlsdXJlIGNhbGxiYWNrcyAqLwordHlwZWRlZiB2b2lkIGNoYW5uZWxfY29uZmlybV9jYihpbnQsIHN0cnVjdCBDaGFubmVsICosIHZvaWQgKik7Cit0eXBlZGVmIHZvaWQgY2hhbm5lbF9jb25maXJtX2FiYW5kb25fY2Ioc3RydWN0IENoYW5uZWwgKiwgdm9pZCAqKTsKK3N0cnVjdCBjaGFubmVsX2NvbmZpcm0geworCVRBSUxRX0VOVFJZKGNoYW5uZWxfY29uZmlybSkgZW50cnk7CisJY2hhbm5lbF9jb25maXJtX2NiICpjYjsKKwljaGFubmVsX2NvbmZpcm1fYWJhbmRvbl9jYiAqYWJhbmRvbl9jYjsKKwl2b2lkICpjdHg7Cit9OworVEFJTFFfSEVBRChjaGFubmVsX2NvbmZpcm1zLCBjaGFubmVsX2NvbmZpcm0pOworCisvKiBDb250ZXh0IGZvciBub24tYmxvY2tpbmcgY29ubmVjdHMgKi8KK3N0cnVjdCBjaGFubmVsX2Nvbm5lY3QgeworCWNoYXIgKmhvc3Q7CisJaW50IHBvcnQ7CisJc3RydWN0IGFkZHJpbmZvICphaSwgKmFpdG9wOworfTsKKworLyogQ2FsbGJhY2tzIGZvciBtdXggY2hhbm5lbHMgYmFjayBpbnRvIGNsaWVudC1zcGVjaWZpYyBjb2RlICovCit0eXBlZGVmIGludCBtdXhfY2FsbGJhY2tfZm4oc3RydWN0IENoYW5uZWwgKik7CisKK3N0cnVjdCBDaGFubmVsIHsKKwlpbnQgICAgIHR5cGU7CQkvKiBjaGFubmVsIHR5cGUvc3RhdGUgKi8KKwlpbnQgICAgIHNlbGY7CQkvKiBteSBvd24gY2hhbm5lbCBpZGVudGlmaWVyICovCisJaW50ICAgICByZW1vdGVfaWQ7CS8qIGNoYW5uZWwgaWRlbnRpZmllciBmb3IgcmVtb3RlIHBlZXIgKi8KKwl1X2ludCAgIGlzdGF0ZTsJCS8qIGlucHV0IGZyb20gY2hhbm5lbCAoc3RhdGUgb2YgcmVjZWl2ZSBoYWxmKSAqLworCXVfaW50ICAgb3N0YXRlOwkJLyogb3V0cHV0IHRvIGNoYW5uZWwgIChzdGF0ZSBvZiB0cmFuc21pdCBoYWxmKSAqLworCWludCAgICAgZmxhZ3M7CQkvKiBjbG9zZSBzZW50L3JjdmQgKi8KKwlpbnQgICAgIHJmZDsJCS8qIHJlYWQgZmQgKi8KKwlpbnQgICAgIHdmZDsJCS8qIHdyaXRlIGZkICovCisJaW50ICAgICBlZmQ7CQkvKiBleHRlbmRlZCBmZCAqLworCWludCAgICAgc29jazsJCS8qIHNvY2sgZmQgKi8KKwlpbnQgICAgIGN0bF9jaGFuOwkvKiBjb250cm9sIGNoYW5uZWwgKG11bHRpcGxleGVkIGNvbm5lY3Rpb25zKSAqLworCWludCAgICAgaXNhdHR5OwkJLyogcmZkIGlzIGEgdHR5ICovCisJaW50ICAgICB3ZmRfaXNhdHR5OwkvKiB3ZmQgaXMgYSB0dHkgKi8KKwlpbnQJY2xpZW50X3R0eTsJLyogKGNsaWVudCkgVFRZIGhhcyBiZWVuIHJlcXVlc3RlZCAqLworCWludCAgICAgZm9yY2VfZHJhaW47CS8qIGZvcmNlIGNsb3NlIG9uIGlFT0YgKi8KKwlpbnQgICAgIGRlbGF5ZWQ7CS8qIHBvc3Qtc2VsZWN0IGhhbmRsZXJzIGZvciBuZXdseSBjcmVhdGVkCisJCQkJICogY2hhbm5lbHMgYXJlIGRlbGF5ZWQgdW50aWwgdGhlIGZpcnN0IGNhbGwKKwkJCQkgKiB0byBhIG1hdGNoaW5nIHByZS1zZWxlY3QgaGFuZGxlci4gCisJCQkJICogdGhpcyB3YXkgcG9zdC1zZWxlY3QgaGFuZGxlcnMgYXJlIG5vdAorCQkJCSAqIGFjY2lkZW5seSBjYWxsZWQgaWYgYSBGRCBnZXRzIHJldXNlZCAqLworCUJ1ZmZlciAgaW5wdXQ7CQkvKiBkYXRhIHJlYWQgZnJvbSBzb2NrZXQsIHRvIGJlIHNlbnQgb3ZlcgorCQkJCSAqIGVuY3J5cHRlZCBjb25uZWN0aW9uICovCisJQnVmZmVyICBvdXRwdXQ7CQkvKiBkYXRhIHJlY2VpdmVkIG92ZXIgZW5jcnlwdGVkIGNvbm5lY3Rpb24gZm9yCisJCQkJICogc2VuZCBvbiBzb2NrZXQgKi8KKwlCdWZmZXIgIGV4dGVuZGVkOworCWNoYXIgICAgKnBhdGg7CisJCS8qIHBhdGggZm9yIHVuaXggZG9tYWluIHNvY2tldHMsIG9yIGhvc3QgbmFtZSBmb3IgZm9yd2FyZHMgKi8KKwlpbnQgICAgIGxpc3RlbmluZ19wb3J0OwkvKiBwb3J0IGJlaW5nIGxpc3RlbmVkIGZvciBmb3J3YXJkcyAqLworCWNoYXIgICAqbGlzdGVuaW5nX2FkZHI7CS8qIGFkZHIgYmVpbmcgbGlzdGVuZWQgZm9yIGZvcndhcmRzICovCisJaW50ICAgICBob3N0X3BvcnQ7CS8qIHJlbW90ZSBwb3J0IHRvIGNvbm5lY3QgZm9yIGZvcndhcmRzICovCisJY2hhciAgICpyZW1vdGVfbmFtZTsJLyogcmVtb3RlIGhvc3RuYW1lICovCisKKwl1X2ludAlyZW1vdGVfd2luZG93OworCXVfaW50CXJlbW90ZV9tYXhwYWNrZXQ7CisJdV9pbnQJbG9jYWxfd2luZG93OworCXVfaW50CWxvY2FsX3dpbmRvd19tYXg7CisJdV9pbnQJbG9jYWxfY29uc3VtZWQ7CisJdV9pbnQJbG9jYWxfbWF4cGFja2V0OworCWludCAgICAgZXh0ZW5kZWRfdXNhZ2U7CisJaW50CXNpbmdsZV9jb25uZWN0aW9uOworCisJY2hhciAgICpjdHlwZTsJCS8qIHR5cGUgKi8KKworCS8qIGNhbGxiYWNrICovCisJY2hhbm5lbF9vcGVuX2ZuCQkqb3Blbl9jb25maXJtOworCXZvaWQJCQkqb3Blbl9jb25maXJtX2N0eDsKKwljaGFubmVsX2NhbGxiYWNrX2ZuCSpkZXRhY2hfdXNlcjsKKwlpbnQJCQlkZXRhY2hfY2xvc2U7CisJc3RydWN0IGNoYW5uZWxfY29uZmlybXMJc3RhdHVzX2NvbmZpcm1zOworCisJLyogZmlsdGVyICovCisJY2hhbm5lbF9pbmZpbHRlcl9mbgkqaW5wdXRfZmlsdGVyOworCWNoYW5uZWxfb3V0ZmlsdGVyX2ZuCSpvdXRwdXRfZmlsdGVyOworCXZvaWQJCQkqZmlsdGVyX2N0eDsKKwljaGFubmVsX2ZpbHRlcl9jbGVhbnVwX2ZuICpmaWx0ZXJfY2xlYW51cDsKKworCS8qIGtlZXAgYm91bmRhcmllcyAqLworCWludCAgICAgCQlkYXRhZ3JhbTsKKworCS8qIG5vbi1ibG9ja2luZyBjb25uZWN0ICovCisJc3RydWN0IGNoYW5uZWxfY29ubmVjdAljb25uZWN0X2N0eDsKKworCS8qIG11bHRpcGxleGluZyBwcm90b2NvbCBob29rLCBjYWxsZWQgZm9yIGVhY2ggcGFja2V0IHJlY2VpdmVkICovCisJbXV4X2NhbGxiYWNrX2ZuCQkqbXV4X3JjYjsKKwl2b2lkCQkJKm11eF9jdHg7CisJaW50CQkJbXV4X3BhdXNlOworfTsKKworI2RlZmluZSBDSEFOX0VYVEVOREVEX0lHTk9SRQkJMAorI2RlZmluZSBDSEFOX0VYVEVOREVEX1JFQUQJCTEKKyNkZWZpbmUgQ0hBTl9FWFRFTkRFRF9XUklURQkJMgorCisvKiBkZWZhdWx0IHdpbmRvdy9wYWNrZXQgc2l6ZXMgZm9yIHRjcC94MTEtZndkLWNoYW5uZWwgKi8KKyNkZWZpbmUgQ0hBTl9TRVNfUEFDS0VUX0RFRkFVTFQJKDMyKjEwMjQpCisjZGVmaW5lIENIQU5fU0VTX1dJTkRPV19ERUZBVUxUCSg2NCpDSEFOX1NFU19QQUNLRVRfREVGQVVMVCkKKyNkZWZpbmUgQ0hBTl9UQ1BfUEFDS0VUX0RFRkFVTFQJKDMyKjEwMjQpCisjZGVmaW5lIENIQU5fVENQX1dJTkRPV19ERUZBVUxUCSg2NCpDSEFOX1RDUF9QQUNLRVRfREVGQVVMVCkKKyNkZWZpbmUgQ0hBTl9YMTFfUEFDS0VUX0RFRkFVTFQJKDE2KjEwMjQpCisjZGVmaW5lIENIQU5fWDExX1dJTkRPV19ERUZBVUxUCSg0KkNIQU5fWDExX1BBQ0tFVF9ERUZBVUxUKQorCisvKiBwb3NzaWJsZSBpbnB1dCBzdGF0ZXMgKi8KKyNkZWZpbmUgQ0hBTl9JTlBVVF9PUEVOCQkJMAorI2RlZmluZSBDSEFOX0lOUFVUX1dBSVRfRFJBSU4JCTEKKyNkZWZpbmUgQ0hBTl9JTlBVVF9XQUlUX09DTE9TRQkJMgorI2RlZmluZSBDSEFOX0lOUFVUX0NMT1NFRAkJMworCisvKiBwb3NzaWJsZSBvdXRwdXQgc3RhdGVzICovCisjZGVmaW5lIENIQU5fT1VUUFVUX09QRU4JCTAKKyNkZWZpbmUgQ0hBTl9PVVRQVVRfV0FJVF9EUkFJTgkJMQorI2RlZmluZSBDSEFOX09VVFBVVF9XQUlUX0lFT0YJCTIKKyNkZWZpbmUgQ0hBTl9PVVRQVVRfQ0xPU0VECQkzCisKKyNkZWZpbmUgQ0hBTl9DTE9TRV9TRU5UCQkJMHgwMQorI2RlZmluZSBDSEFOX0NMT1NFX1JDVkQJCQkweDAyCisjZGVmaW5lIENIQU5fRU9GX1NFTlQJCQkweDA0CisjZGVmaW5lIENIQU5fRU9GX1JDVkQJCQkweDA4CisjZGVmaW5lIENIQU5fTE9DQUwJCQkweDEwCisKKyNkZWZpbmUgQ0hBTl9SQlVGCTE2KjEwMjQKKworLyogY2hlY2sgd2hldGhlciAnZWZkJyBpcyBzdGlsbCBpbiB1c2UgKi8KKyNkZWZpbmUgQ0hBTk5FTF9FRkRfSU5QVVRfQUNUSVZFKGMpIFwKKwkoY29tcGF0MjAgJiYgYy0+ZXh0ZW5kZWRfdXNhZ2UgPT0gQ0hBTl9FWFRFTkRFRF9SRUFEICYmIFwKKwkoYy0+ZWZkICE9IC0xIHx8IFwKKwlidWZmZXJfbGVuKCZjLT5leHRlbmRlZCkgPiAwKSkKKyNkZWZpbmUgQ0hBTk5FTF9FRkRfT1VUUFVUX0FDVElWRShjKSBcCisJKGNvbXBhdDIwICYmIGMtPmV4dGVuZGVkX3VzYWdlID09IENIQU5fRVhURU5ERURfV1JJVEUgJiYgXAorCWMtPmVmZCAhPSAtMSAmJiAoIShjLT5mbGFncyAmIChDSEFOX0VPRl9SQ1ZEfENIQU5fQ0xPU0VfUkNWRCkpIHx8IFwKKwlidWZmZXJfbGVuKCZjLT5leHRlbmRlZCkgPiAwKSkKKworLyogY2hhbm5lbCBtYW5hZ2VtZW50ICovCisKK0NoYW5uZWwJKmNoYW5uZWxfYnlfaWQoaW50KTsKK0NoYW5uZWwJKmNoYW5uZWxfbG9va3VwKGludCk7CitDaGFubmVsICpjaGFubmVsX25ldyhjaGFyICosIGludCwgaW50LCBpbnQsIGludCwgdV9pbnQsIHVfaW50LCBpbnQsIGNoYXIgKiwgaW50KTsKK3ZvaWQJIGNoYW5uZWxfc2V0X2ZkcyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIHVfaW50KTsKK3ZvaWQJIGNoYW5uZWxfZnJlZShDaGFubmVsICopOwordm9pZAkgY2hhbm5lbF9mcmVlX2FsbCh2b2lkKTsKK3ZvaWQJIGNoYW5uZWxfc3RvcF9saXN0ZW5pbmcodm9pZCk7CisKK3ZvaWQJIGNoYW5uZWxfc2VuZF9vcGVuKGludCk7Cit2b2lkCSBjaGFubmVsX3JlcXVlc3Rfc3RhcnQoaW50LCBjaGFyICosIGludCk7Cit2b2lkCSBjaGFubmVsX3JlZ2lzdGVyX2NsZWFudXAoaW50LCBjaGFubmVsX2NhbGxiYWNrX2ZuICosIGludCk7Cit2b2lkCSBjaGFubmVsX3JlZ2lzdGVyX29wZW5fY29uZmlybShpbnQsIGNoYW5uZWxfb3Blbl9mbiAqLCB2b2lkICopOwordm9pZAkgY2hhbm5lbF9yZWdpc3Rlcl9maWx0ZXIoaW50LCBjaGFubmVsX2luZmlsdGVyX2ZuICosCisgICAgY2hhbm5lbF9vdXRmaWx0ZXJfZm4gKiwgY2hhbm5lbF9maWx0ZXJfY2xlYW51cF9mbiAqLCB2b2lkICopOwordm9pZAkgY2hhbm5lbF9yZWdpc3Rlcl9zdGF0dXNfY29uZmlybShpbnQsIGNoYW5uZWxfY29uZmlybV9jYiAqLAorICAgIGNoYW5uZWxfY29uZmlybV9hYmFuZG9uX2NiICosIHZvaWQgKik7Cit2b2lkCSBjaGFubmVsX2NhbmNlbF9jbGVhbnVwKGludCk7CitpbnQJIGNoYW5uZWxfY2xvc2VfZmQoaW50ICopOwordm9pZAkgY2hhbm5lbF9zZW5kX3dpbmRvd19jaGFuZ2VzKHZvaWQpOworCisvKiBwcm90b2NvbCBoYW5kbGVyICovCisKK3ZvaWQJIGNoYW5uZWxfaW5wdXRfY2xvc2UoaW50LCB1X2ludDMyX3QsIHZvaWQgKik7Cit2b2lkCSBjaGFubmVsX2lucHV0X2Nsb3NlX2NvbmZpcm1hdGlvbihpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKK3ZvaWQJIGNoYW5uZWxfaW5wdXRfZGF0YShpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKK3ZvaWQJIGNoYW5uZWxfaW5wdXRfZXh0ZW5kZWRfZGF0YShpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKK3ZvaWQJIGNoYW5uZWxfaW5wdXRfaWVvZihpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKK3ZvaWQJIGNoYW5uZWxfaW5wdXRfb2Nsb3NlKGludCwgdV9pbnQzMl90LCB2b2lkICopOwordm9pZAkgY2hhbm5lbF9pbnB1dF9vcGVuX2NvbmZpcm1hdGlvbihpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKK3ZvaWQJIGNoYW5uZWxfaW5wdXRfb3Blbl9mYWlsdXJlKGludCwgdV9pbnQzMl90LCB2b2lkICopOwordm9pZAkgY2hhbm5lbF9pbnB1dF9wb3J0X29wZW4oaW50LCB1X2ludDMyX3QsIHZvaWQgKik7Cit2b2lkCSBjaGFubmVsX2lucHV0X3dpbmRvd19hZGp1c3QoaW50LCB1X2ludDMyX3QsIHZvaWQgKik7Cit2b2lkCSBjaGFubmVsX2lucHV0X3N0YXR1c19jb25maXJtKGludCwgdV9pbnQzMl90LCB2b2lkICopOworCisvKiBmaWxlIGRlc2NyaXB0b3IgaGFuZGxpbmcgKHJlYWQvd3JpdGUpICovCisKK3ZvaWQJIGNoYW5uZWxfcHJlcGFyZV9zZWxlY3QoZmRfc2V0ICoqLCBmZF9zZXQgKiosIGludCAqLCB1X2ludCosIGludCk7Cit2b2lkICAgICBjaGFubmVsX2FmdGVyX3NlbGVjdChmZF9zZXQgKiwgZmRfc2V0ICopOwordm9pZCAgICAgY2hhbm5lbF9vdXRwdXRfcG9sbCh2b2lkKTsKKworaW50ICAgICAgY2hhbm5lbF9ub3RfdmVyeV9tdWNoX2J1ZmZlcmVkX2RhdGEodm9pZCk7Cit2b2lkICAgICBjaGFubmVsX2Nsb3NlX2FsbCh2b2lkKTsKK2ludCAgICAgIGNoYW5uZWxfc3RpbGxfb3Blbih2b2lkKTsKK2NoYXIJKmNoYW5uZWxfb3Blbl9tZXNzYWdlKHZvaWQpOworaW50CSBjaGFubmVsX2ZpbmRfb3Blbih2b2lkKTsKKworLyogdGNwIGZvcndhcmRpbmcgKi8KK3ZvaWQJIGNoYW5uZWxfc2V0X2FmKGludCBhZik7Cit2b2lkICAgICBjaGFubmVsX3Blcm1pdF9hbGxfb3BlbnModm9pZCk7Cit2b2lkCSBjaGFubmVsX2FkZF9wZXJtaXR0ZWRfb3BlbnMoY2hhciAqLCBpbnQpOworaW50CSBjaGFubmVsX2FkZF9hZG1fcGVybWl0dGVkX29wZW5zKGNoYXIgKiwgaW50KTsKK3ZvaWQJIGNoYW5uZWxfdXBkYXRlX3Blcm1pdHRlZF9vcGVucyhpbnQsIGludCk7Cit2b2lkCSBjaGFubmVsX2NsZWFyX3Blcm1pdHRlZF9vcGVucyh2b2lkKTsKK3ZvaWQJIGNoYW5uZWxfY2xlYXJfYWRtX3Blcm1pdHRlZF9vcGVucyh2b2lkKTsKK3ZvaWQgCSBjaGFubmVsX3ByaW50X2FkbV9wZXJtaXR0ZWRfb3BlbnModm9pZCk7CitpbnQgICAgICBjaGFubmVsX2lucHV0X3BvcnRfZm9yd2FyZF9yZXF1ZXN0KGludCwgaW50KTsKK0NoYW5uZWwJKmNoYW5uZWxfY29ubmVjdF90byhjb25zdCBjaGFyICosIHVfc2hvcnQsIGNoYXIgKiwgY2hhciAqKTsKK0NoYW5uZWwJKmNoYW5uZWxfY29ubmVjdF9zdGRpb19md2QoY29uc3QgY2hhciosIHVfc2hvcnQsIGludCwgaW50KTsKK0NoYW5uZWwJKmNoYW5uZWxfY29ubmVjdF9ieV9saXN0ZW5fYWRkcmVzcyh1X3Nob3J0LCBjaGFyICosIGNoYXIgKik7CitpbnQJIGNoYW5uZWxfcmVxdWVzdF9yZW1vdGVfZm9yd2FyZGluZyhjb25zdCBjaGFyICosIHVfc2hvcnQsCisJICAgICBjb25zdCBjaGFyICosIHVfc2hvcnQpOworaW50CSBjaGFubmVsX3NldHVwX2xvY2FsX2Z3ZF9saXN0ZW5lcihjb25zdCBjaGFyICosIHVfc2hvcnQsCisJICAgICBjb25zdCBjaGFyICosIHVfc2hvcnQsIGludCk7CitpbnQJIGNoYW5uZWxfcmVxdWVzdF9yZm9yd2FyZF9jYW5jZWwoY29uc3QgY2hhciAqaG9zdCwgdV9zaG9ydCBwb3J0KTsKK2ludAkgY2hhbm5lbF9zZXR1cF9yZW1vdGVfZndkX2xpc3RlbmVyKGNvbnN0IGNoYXIgKiwgdV9zaG9ydCwgaW50ICosIGludCk7CitpbnQJIGNoYW5uZWxfY2FuY2VsX3Jwb3J0X2xpc3RlbmVyKGNvbnN0IGNoYXIgKiwgdV9zaG9ydCk7CitpbnQJIGNoYW5uZWxfY2FuY2VsX2xwb3J0X2xpc3RlbmVyKGNvbnN0IGNoYXIgKiwgdV9zaG9ydCwgaW50LCBpbnQpOworaW50CSBwZXJtaXRvcGVuX3BvcnQoY29uc3QgY2hhciAqKTsKKworLyogeDExIGZvcndhcmRpbmcgKi8KKworaW50CSB4MTFfY29ubmVjdF9kaXNwbGF5KHZvaWQpOworaW50CSB4MTFfY3JlYXRlX2Rpc3BsYXlfaW5ldChpbnQsIGludCwgaW50LCB1X2ludCAqLCBpbnQgKiopOwordm9pZCAgICAgeDExX2lucHV0X29wZW4oaW50LCB1X2ludDMyX3QsIHZvaWQgKik7Cit2b2lkCSB4MTFfcmVxdWVzdF9mb3J3YXJkaW5nX3dpdGhfc3Bvb2ZpbmcoaW50LCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKKwkgICAgIGNvbnN0IGNoYXIgKiwgaW50KTsKK3ZvaWQJIGRlbnlfaW5wdXRfb3BlbihpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKKworLyogYWdlbnQgZm9yd2FyZGluZyAqLworCit2b2lkCSBhdXRoX3JlcXVlc3RfZm9yd2FyZGluZyh2b2lkKTsKKworLyogY2hhbm5lbCBjbG9zZSAqLworCitpbnQJIGNoYW5faXNfZGVhZChDaGFubmVsICosIGludCk7Cit2b2lkCSBjaGFuX21hcmtfZGVhZChDaGFubmVsICopOworCisvKiBjaGFubmVsIGV2ZW50cyAqLworCit2b2lkCSBjaGFuX3JjdmRfb2Nsb3NlKENoYW5uZWwgKik7Cit2b2lkCSBjaGFuX3JjdmRfZW93KENoYW5uZWwgKik7CS8qIFNTSDItb25seSAqLwordm9pZAkgY2hhbl9yZWFkX2ZhaWxlZChDaGFubmVsICopOwordm9pZAkgY2hhbl9pYnVmX2VtcHR5KENoYW5uZWwgKik7CisKK3ZvaWQJIGNoYW5fcmN2ZF9pZW9mKENoYW5uZWwgKik7Cit2b2lkCSBjaGFuX3dyaXRlX2ZhaWxlZChDaGFubmVsICopOwordm9pZAkgY2hhbl9vYnVmX2VtcHR5KENoYW5uZWwgKik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jaXBoZXItM2RlczEuYyBiL29wZW5zc2gtNi4wcDEvY2lwaGVyLTNkZXMxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhYTU4OAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY2lwaGVyLTNkZXMxLmMKQEAgLTAsMCArMSwxODMgQEAKKy8qICRPcGVuQlNEOiBjaXBoZXItM2RlczEuYyx2IDEuNyAyMDEwLzEwLzAxIDIzOjA1OjMyIGRqbSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJsb2cuaCIKKworI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L29wZW5zc2wtY29tcGF0LmgiCisKKy8qCisgKiBUaGlzIGlzIHVzZWQgYnkgU1NIMToKKyAqCisgKiBXaGF0IGtpbmQgb2YgdHJpcGxlIERFUyBhcmUgdGhlc2UgMiByb3V0aW5lcz8KKyAqCisgKiBXaHkgaXMgdGhlcmUgYSByZWR1bmRhbnQgaW5pdGlhbGl6YXRpb24gdmVjdG9yPworICoKKyAqIElmIG9ubHkgaXYzIHdhcyB1c2VkLCB0aGVuLCB0aGlzIHdvdWxkIHRpbGwgZWZmZWN0IGhhdmUgYmVlbgorICogb3V0ZXItY2JjLiBIb3dldmVyLCB0aGVyZSBpcyBhbHNvIGEgcHJpdmF0ZSBpdjEgPT0gaXYyIHdoaWNoCisgKiBwZXJoYXBzIG1ha2VzIGRpZmZlcmVudGlhbCBhbmFseXNpcyBlYXNpZXIuIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUKKyAqIHByaXZhdGUgaXYxIHByb2JhYmx5IG1ha2VzIHRoZSBDUkMtMzIgYXR0YWNrIGluZWZmZWN0aXZlLiBUaGlzIGlzIGEKKyAqIHJlc3VsdCBvZiB0aGF0IHRoZXJlIGlzIG5vIGxvbmdlciBhbnkga25vd24gaXYxIHRvIHVzZSB3aGVuCisgKiBjaG9vc2luZyB0aGUgWCBibG9jay4KKyAqLworc3RydWN0IHNzaDFfM2Rlc19jdHgKK3sKKwlFVlBfQ0lQSEVSX0NUWAlrMSwgazIsIGszOworfTsKKworY29uc3QgRVZQX0NJUEhFUiAqIGV2cF9zc2gxXzNkZXModm9pZCk7Cit2b2lkIHNzaDFfM2Rlc19pdihFVlBfQ0lQSEVSX0NUWCAqLCBpbnQsIHVfY2hhciAqLCBpbnQpOworCitzdGF0aWMgaW50Citzc2gxXzNkZXNfaW5pdChFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCB1X2NoYXIgKmtleSwgY29uc3QgdV9jaGFyICppdiwKKyAgICBpbnQgZW5jKQoreworCXN0cnVjdCBzc2gxXzNkZXNfY3R4ICpjOworCXVfY2hhciAqazEsICprMiwgKmszOworCisJaWYgKChjID0gRVZQX0NJUEhFUl9DVFhfZ2V0X2FwcF9kYXRhKGN0eCkpID09IE5VTEwpIHsKKwkJYyA9IHhtYWxsb2Moc2l6ZW9mKCpjKSk7CisJCUVWUF9DSVBIRVJfQ1RYX3NldF9hcHBfZGF0YShjdHgsIGMpOworCX0KKwlpZiAoa2V5ID09IE5VTEwpCisJCXJldHVybiAoMSk7CisJaWYgKGVuYyA9PSAtMSkKKwkJZW5jID0gY3R4LT5lbmNyeXB0OworCWsxID0gazIgPSBrMyA9ICh1X2NoYXIgKikga2V5OworCWsyICs9IDg7CisJaWYgKEVWUF9DSVBIRVJfQ1RYX2tleV9sZW5ndGgoY3R4KSA+PSAxNis4KSB7CisJCWlmIChlbmMpCisJCQlrMyArPSAxNjsKKwkJZWxzZQorCQkJazEgKz0gMTY7CisJfQorCUVWUF9DSVBIRVJfQ1RYX2luaXQoJmMtPmsxKTsKKwlFVlBfQ0lQSEVSX0NUWF9pbml0KCZjLT5rMik7CisJRVZQX0NJUEhFUl9DVFhfaW5pdCgmYy0+azMpOworI2lmZGVmIFNTSF9PTERfRVZQCisJRVZQX0NpcGhlckluaXQoJmMtPmsxLCBFVlBfZGVzX2NiYygpLCBrMSwgTlVMTCwgZW5jKTsKKwlFVlBfQ2lwaGVySW5pdCgmYy0+azIsIEVWUF9kZXNfY2JjKCksIGsyLCBOVUxMLCAhZW5jKTsKKwlFVlBfQ2lwaGVySW5pdCgmYy0+azMsIEVWUF9kZXNfY2JjKCksIGszLCBOVUxMLCBlbmMpOworI2Vsc2UKKwlpZiAoRVZQX0NpcGhlckluaXQoJmMtPmsxLCBFVlBfZGVzX2NiYygpLCBrMSwgTlVMTCwgZW5jKSA9PSAwIHx8CisJICAgIEVWUF9DaXBoZXJJbml0KCZjLT5rMiwgRVZQX2Rlc19jYmMoKSwgazIsIE5VTEwsICFlbmMpID09IDAgfHwKKwkgICAgRVZQX0NpcGhlckluaXQoJmMtPmszLCBFVlBfZGVzX2NiYygpLCBrMywgTlVMTCwgZW5jKSA9PSAwKSB7CisJCW1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKKwkJeGZyZWUoYyk7CisJCUVWUF9DSVBIRVJfQ1RYX3NldF9hcHBfZGF0YShjdHgsIE5VTEwpOworCQlyZXR1cm4gKDApOworCX0KKyNlbmRpZgorCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQKK3NzaDFfM2Rlc19jYmMoRVZQX0NJUEhFUl9DVFggKmN0eCwgdV9jaGFyICpkZXN0LCBjb25zdCB1X2NoYXIgKnNyYywKKyAgICBMSUJDUllQVE9fRVZQX0lOTF9UWVBFIGxlbikKK3sKKwlzdHJ1Y3Qgc3NoMV8zZGVzX2N0eCAqYzsKKworCWlmICgoYyA9IEVWUF9DSVBIRVJfQ1RYX2dldF9hcHBfZGF0YShjdHgpKSA9PSBOVUxMKSB7CisJCWVycm9yKCJzc2gxXzNkZXNfY2JjOiBubyBjb250ZXh0Iik7CisJCXJldHVybiAoMCk7CisJfQorI2lmZGVmIFNTSF9PTERfRVZQCisJRVZQX0NpcGhlcigmYy0+azEsIGRlc3QsICh1X2NoYXIgKilzcmMsIGxlbik7CisJRVZQX0NpcGhlcigmYy0+azIsIGRlc3QsIGRlc3QsIGxlbik7CisJRVZQX0NpcGhlcigmYy0+azMsIGRlc3QsIGRlc3QsIGxlbik7CisjZWxzZQorCWlmIChFVlBfQ2lwaGVyKCZjLT5rMSwgZGVzdCwgKHVfY2hhciAqKXNyYywgbGVuKSA9PSAwIHx8CisJICAgIEVWUF9DaXBoZXIoJmMtPmsyLCBkZXN0LCBkZXN0LCBsZW4pID09IDAgfHwKKwkgICAgRVZQX0NpcGhlcigmYy0+azMsIGRlc3QsIGRlc3QsIGxlbikgPT0gMCkKKwkJcmV0dXJuICgwKTsKKyNlbmRpZgorCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQKK3NzaDFfM2Rlc19jbGVhbnVwKEVWUF9DSVBIRVJfQ1RYICpjdHgpCit7CisJc3RydWN0IHNzaDFfM2Rlc19jdHggKmM7CisKKwlpZiAoKGMgPSBFVlBfQ0lQSEVSX0NUWF9nZXRfYXBwX2RhdGEoY3R4KSkgIT0gTlVMTCkgeworCQlFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZjLT5rMSk7CisJCUVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmMtPmsyKTsKKwkJRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmYy0+azMpOworCQltZW1zZXQoYywgMCwgc2l6ZW9mKCpjKSk7CisJCXhmcmVlKGMpOworCQlFVlBfQ0lQSEVSX0NUWF9zZXRfYXBwX2RhdGEoY3R4LCBOVUxMKTsKKwl9CisJcmV0dXJuICgxKTsKK30KKwordm9pZAorc3NoMV8zZGVzX2l2KEVWUF9DSVBIRVJfQ1RYICpldnAsIGludCBkb3NldCwgdV9jaGFyICppdiwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc3NoMV8zZGVzX2N0eCAqYzsKKworCWlmIChsZW4gIT0gMjQpCisJCWZhdGFsKCIlczogYmFkIDNkZXMgaXYgbGVuZ3RoOiAlZCIsIF9fZnVuY19fLCBsZW4pOworCWlmICgoYyA9IEVWUF9DSVBIRVJfQ1RYX2dldF9hcHBfZGF0YShldnApKSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IG5vIDNkZXMgY29udGV4dCIsIF9fZnVuY19fKTsKKwlpZiAoZG9zZXQpIHsKKwkJZGVidWczKCIlczogSW5zdGFsbGVkIDNERVMgSVYiLCBfX2Z1bmNfXyk7CisJCW1lbWNweShjLT5rMS5pdiwgaXYsIDgpOworCQltZW1jcHkoYy0+azIuaXYsIGl2ICsgOCwgOCk7CisJCW1lbWNweShjLT5rMy5pdiwgaXYgKyAxNiwgOCk7CisJfSBlbHNlIHsKKwkJZGVidWczKCIlczogQ29weWluZyAzREVTIElWIiwgX19mdW5jX18pOworCQltZW1jcHkoaXYsIGMtPmsxLml2LCA4KTsKKwkJbWVtY3B5KGl2ICsgOCwgYy0+azIuaXYsIDgpOworCQltZW1jcHkoaXYgKyAxNiwgYy0+azMuaXYsIDgpOworCX0KK30KKworY29uc3QgRVZQX0NJUEhFUiAqCitldnBfc3NoMV8zZGVzKHZvaWQpCit7CisJc3RhdGljIEVWUF9DSVBIRVIgc3NoMV8zZGVzOworCisJbWVtc2V0KCZzc2gxXzNkZXMsIDAsIHNpemVvZihFVlBfQ0lQSEVSKSk7CisJc3NoMV8zZGVzLm5pZCA9IE5JRF91bmRlZjsKKwlzc2gxXzNkZXMuYmxvY2tfc2l6ZSA9IDg7CisJc3NoMV8zZGVzLml2X2xlbiA9IDA7CisJc3NoMV8zZGVzLmtleV9sZW4gPSAxNjsKKwlzc2gxXzNkZXMuaW5pdCA9IHNzaDFfM2Rlc19pbml0OworCXNzaDFfM2Rlcy5jbGVhbnVwID0gc3NoMV8zZGVzX2NsZWFudXA7CisJc3NoMV8zZGVzLmRvX2NpcGhlciA9IHNzaDFfM2Rlc19jYmM7CisjaWZuZGVmIFNTSF9PTERfRVZQCisJc3NoMV8zZGVzLmZsYWdzID0gRVZQX0NJUEhfQ0JDX01PREUgfCBFVlBfQ0lQSF9WQVJJQUJMRV9MRU5HVEg7CisjZW5kaWYKKwlyZXR1cm4gKCZzc2gxXzNkZXMpOworfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jaXBoZXItYWNzcy5jIGIvb3BlbnNzaC02LjBwMS9jaXBoZXItYWNzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NTVmOTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NpcGhlci1hY3NzLmMKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBUaGUgT3BlbkJTRCBwcm9qZWN0CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZiAhZGVmaW5lZChFVlBfQ1RSTF9TRVRfQUNTU19NT0RFKSAmJiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDAwOTA3MDAwTCkKKworI2luY2x1ZGUgImFjc3MuaCIKKyNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9vcGVuc3NsLWNvbXBhdC5oIgorCisjZGVmaW5lIGRhdGEoY3R4KSAoKEVWUF9BQ1NTX0tFWSAqKShjdHgpLT5jaXBoZXJfZGF0YSkKKwordHlwZWRlZiBzdHJ1Y3QgeworCUFDU1NfS0VZIGtzOworfSBFVlBfQUNTU19LRVk7CisKKyNkZWZpbmUgRVZQX0NUUkxfU0VUX0FDU1NfTU9ERSAgICAgICAgICAweGZmMDYKKyNkZWZpbmUgRVZQX0NUUkxfU0VUX0FDU1NfU1VCS0VZICAgICAgICAweGZmMDcKKworc3RhdGljIGludAorYWNzc19pbml0X2tleShFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaXYsIGludCBlbmMpCit7CisJYWNzc19zZXRrZXkoJmRhdGEoY3R4KS0+a3Msa2V5LGVuYyxBQ1NTX0RBVEEpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CithY3NzX2NpcGgoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwKKyAgICBMSUJDUllQVE9fRVZQX0lOTF9UWVBFIGlubCkKK3sKKwlhY3NzKCZkYXRhKGN0eCktPmtzLGlubCxpbixvdXQpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CithY3NzX2N0cmwoRVZQX0NJUEhFUl9DVFggKmN0eCwgaW50IHR5cGUsIGludCBhcmcsIHZvaWQgKnB0cikKK3sKKwlzd2l0Y2godHlwZSkgeworCWNhc2UgRVZQX0NUUkxfU0VUX0FDU1NfTU9ERToKKwkJZGF0YShjdHgpLT5rcy5tb2RlID0gYXJnOworCQlyZXR1cm4gMTsKKwljYXNlIEVWUF9DVFJMX1NFVF9BQ1NTX1NVQktFWToKKwkJYWNzc19zZXRzdWJrZXkoJmRhdGEoY3R4KS0+a3MsKHVuc2lnbmVkIGNoYXIgKilwdHIpOworCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorfQorCitjb25zdCBFVlBfQ0lQSEVSICoKK2V2cF9hY3NzKHZvaWQpCit7CisJc3RhdGljIEVWUF9DSVBIRVIgYWNzc19jaXBoZXI7CisKKwltZW1zZXQoJmFjc3NfY2lwaGVyLCAwLCBzaXplb2YoRVZQX0NJUEhFUikpOworCisJYWNzc19jaXBoZXIubmlkID0gTklEX3VuZGVmOworCWFjc3NfY2lwaGVyLmJsb2NrX3NpemUgPSAxOworCWFjc3NfY2lwaGVyLmtleV9sZW4gPSA1OworCWFjc3NfY2lwaGVyLmluaXQgPSBhY3NzX2luaXRfa2V5OworCWFjc3NfY2lwaGVyLmRvX2NpcGhlciA9IGFjc3NfY2lwaDsKKwlhY3NzX2NpcGhlci5jdHhfc2l6ZSA9IHNpemVvZihFVlBfQUNTU19LRVkpOworCWFjc3NfY2lwaGVyLmN0cmwgPSBhY3NzX2N0cmw7CisKKwlyZXR1cm4gKCZhY3NzX2NpcGhlcik7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jaXBoZXItYWVzLmMgYi9vcGVuc3NoLTYuMHAxL2NpcGhlci1hZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmRhNmQyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9jaXBoZXItYWVzLmMKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisvKiBjb21wYXRpYmlsaXR5IHdpdGggb2xkIG9yIGJyb2tlbiBPcGVuU1NMIHZlcnNpb25zICovCisjaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQuaCIKKworI2lmZGVmIFVTRV9CVUlMVElOX1JJSk5EQUVMCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJyaWpuZGFlbC5oIgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJsb2cuaCIKKworI2RlZmluZSBSSUpOREFFTF9CTE9DS1NJWkUgMTYKK3N0cnVjdCBzc2hfcmlqbmRhZWxfY3R4Cit7CisJcmlqbmRhZWxfY3R4CXJfY3R4OworCXVfY2hhcgkJcl9pdltSSUpOREFFTF9CTE9DS1NJWkVdOworfTsKKworY29uc3QgRVZQX0NJUEhFUiAqIGV2cF9yaWpuZGFlbCh2b2lkKTsKK3ZvaWQgc3NoX3Jpam5kYWVsX2l2KEVWUF9DSVBIRVJfQ1RYICosIGludCwgdV9jaGFyICosIHVfaW50KTsKKworc3RhdGljIGludAorc3NoX3Jpam5kYWVsX2luaXQoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgdV9jaGFyICprZXksIGNvbnN0IHVfY2hhciAqaXYsCisgICAgaW50IGVuYykKK3sKKwlzdHJ1Y3Qgc3NoX3Jpam5kYWVsX2N0eCAqYzsKKworCWlmICgoYyA9IEVWUF9DSVBIRVJfQ1RYX2dldF9hcHBfZGF0YShjdHgpKSA9PSBOVUxMKSB7CisJCWMgPSB4bWFsbG9jKHNpemVvZigqYykpOworCQlFVlBfQ0lQSEVSX0NUWF9zZXRfYXBwX2RhdGEoY3R4LCBjKTsKKwl9CisJaWYgKGtleSAhPSBOVUxMKSB7CisJCWlmIChlbmMgPT0gLTEpCisJCQllbmMgPSBjdHgtPmVuY3J5cHQ7CisJCXJpam5kYWVsX3NldF9rZXkoJmMtPnJfY3R4LCAodV9jaGFyICopa2V5LAorCQkgICAgOCpFVlBfQ0lQSEVSX0NUWF9rZXlfbGVuZ3RoKGN0eCksIGVuYyk7CisJfQorCWlmIChpdiAhPSBOVUxMKQorCQltZW1jcHkoYy0+cl9pdiwgaXYsIFJJSk5EQUVMX0JMT0NLU0laRSk7CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIGludAorc3NoX3Jpam5kYWVsX2NiYyhFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1X2NoYXIgKmRlc3QsIGNvbnN0IHVfY2hhciAqc3JjLAorICAgIExJQkNSWVBUT19FVlBfSU5MX1RZUEUgbGVuKQoreworCXN0cnVjdCBzc2hfcmlqbmRhZWxfY3R4ICpjOworCXVfY2hhciBidWZbUklKTkRBRUxfQkxPQ0tTSVpFXTsKKwl1X2NoYXIgKmNwcmV2LCAqY25vdywgKnBsYWluLCAqaXZwOworCWludCBpLCBqLCBibG9ja3MgPSBsZW4gLyBSSUpOREFFTF9CTE9DS1NJWkU7CisKKwlpZiAobGVuID09IDApCisJCXJldHVybiAoMSk7CisJaWYgKGxlbiAlIFJJSk5EQUVMX0JMT0NLU0laRSkKKwkJZmF0YWwoInNzaF9yaWpuZGFlbF9jYmM6IGJhZCBsZW4gJWQiLCBsZW4pOworCWlmICgoYyA9IEVWUF9DSVBIRVJfQ1RYX2dldF9hcHBfZGF0YShjdHgpKSA9PSBOVUxMKSB7CisJCWVycm9yKCJzc2hfcmlqbmRhZWxfY2JjOiBubyBjb250ZXh0Iik7CisJCXJldHVybiAoMCk7CisJfQorCWlmIChjdHgtPmVuY3J5cHQpIHsKKwkJY25vdyAgPSBkZXN0OworCQlwbGFpbiA9ICh1X2NoYXIgKilzcmM7CisJCWNwcmV2ID0gYy0+cl9pdjsKKwkJZm9yIChpID0gMDsgaSA8IGJsb2NrczsgaSsrLCBwbGFpbis9UklKTkRBRUxfQkxPQ0tTSVpFLAorCQkgICAgY25vdys9UklKTkRBRUxfQkxPQ0tTSVpFKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgUklKTkRBRUxfQkxPQ0tTSVpFOyBqKyspCisJCQkJYnVmW2pdID0gcGxhaW5bal0gXiBjcHJldltqXTsKKwkJCXJpam5kYWVsX2VuY3J5cHQoJmMtPnJfY3R4LCBidWYsIGNub3cpOworCQkJY3ByZXYgPSBjbm93OworCQl9CisJCW1lbWNweShjLT5yX2l2LCBjcHJldiwgUklKTkRBRUxfQkxPQ0tTSVpFKTsKKwl9IGVsc2UgeworCQljbm93ICA9ICh1X2NoYXIgKikgKHNyYytsZW4tUklKTkRBRUxfQkxPQ0tTSVpFKTsKKwkJcGxhaW4gPSBkZXN0K2xlbi1SSUpOREFFTF9CTE9DS1NJWkU7CisKKwkJbWVtY3B5KGJ1ZiwgY25vdywgUklKTkRBRUxfQkxPQ0tTSVpFKTsKKwkJZm9yIChpID0gYmxvY2tzOyBpID4gMDsgaS0tLCBjbm93LT1SSUpOREFFTF9CTE9DS1NJWkUsCisJCSAgICBwbGFpbi09UklKTkRBRUxfQkxPQ0tTSVpFKSB7CisJCQlyaWpuZGFlbF9kZWNyeXB0KCZjLT5yX2N0eCwgY25vdywgcGxhaW4pOworCQkJaXZwID0gKGkgPT0gMSkgPyBjLT5yX2l2IDogY25vdy1SSUpOREFFTF9CTE9DS1NJWkU7CisJCQlmb3IgKGogPSAwOyBqIDwgUklKTkRBRUxfQkxPQ0tTSVpFOyBqKyspCisJCQkJcGxhaW5bal0gXj0gaXZwW2pdOworCQl9CisJCW1lbWNweShjLT5yX2l2LCBidWYsIFJJSk5EQUVMX0JMT0NLU0laRSk7CisJfQorCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQKK3NzaF9yaWpuZGFlbF9jbGVhbnVwKEVWUF9DSVBIRVJfQ1RYICpjdHgpCit7CisJc3RydWN0IHNzaF9yaWpuZGFlbF9jdHggKmM7CisKKwlpZiAoKGMgPSBFVlBfQ0lQSEVSX0NUWF9nZXRfYXBwX2RhdGEoY3R4KSkgIT0gTlVMTCkgeworCQltZW1zZXQoYywgMCwgc2l6ZW9mKCpjKSk7CisJCXhmcmVlKGMpOworCQlFVlBfQ0lQSEVSX0NUWF9zZXRfYXBwX2RhdGEoY3R4LCBOVUxMKTsKKwl9CisJcmV0dXJuICgxKTsKK30KKwordm9pZAorc3NoX3Jpam5kYWVsX2l2KEVWUF9DSVBIRVJfQ1RYICpldnAsIGludCBkb3NldCwgdV9jaGFyICogaXYsIHVfaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc3NoX3Jpam5kYWVsX2N0eCAqYzsKKworCWlmICgoYyA9IEVWUF9DSVBIRVJfQ1RYX2dldF9hcHBfZGF0YShldnApKSA9PSBOVUxMKQorCQlmYXRhbCgic3NoX3Jpam5kYWVsX2l2OiBubyBjb250ZXh0Iik7CisJaWYgKGRvc2V0KQorCQltZW1jcHkoYy0+cl9pdiwgaXYsIGxlbik7CisJZWxzZQorCQltZW1jcHkoaXYsIGMtPnJfaXYsIGxlbik7Cit9CisKK2NvbnN0IEVWUF9DSVBIRVIgKgorZXZwX3Jpam5kYWVsKHZvaWQpCit7CisJc3RhdGljIEVWUF9DSVBIRVIgcmlqbmRhbF9jYmM7CisKKwltZW1zZXQoJnJpam5kYWxfY2JjLCAwLCBzaXplb2YoRVZQX0NJUEhFUikpOworCXJpam5kYWxfY2JjLm5pZCA9IE5JRF91bmRlZjsKKwlyaWpuZGFsX2NiYy5ibG9ja19zaXplID0gUklKTkRBRUxfQkxPQ0tTSVpFOworCXJpam5kYWxfY2JjLml2X2xlbiA9IFJJSk5EQUVMX0JMT0NLU0laRTsKKwlyaWpuZGFsX2NiYy5rZXlfbGVuID0gMTY7CisJcmlqbmRhbF9jYmMuaW5pdCA9IHNzaF9yaWpuZGFlbF9pbml0OworCXJpam5kYWxfY2JjLmNsZWFudXAgPSBzc2hfcmlqbmRhZWxfY2xlYW51cDsKKwlyaWpuZGFsX2NiYy5kb19jaXBoZXIgPSBzc2hfcmlqbmRhZWxfY2JjOworI2lmbmRlZiBTU0hfT0xEX0VWUAorCXJpam5kYWxfY2JjLmZsYWdzID0gRVZQX0NJUEhfQ0JDX01PREUgfCBFVlBfQ0lQSF9WQVJJQUJMRV9MRU5HVEggfAorCSAgICBFVlBfQ0lQSF9BTFdBWVNfQ0FMTF9JTklUIHwgRVZQX0NJUEhfQ1VTVE9NX0lWOworI2VuZGlmCisJcmV0dXJuICgmcmlqbmRhbF9jYmMpOworfQorI2VuZGlmIC8qIFVTRV9CVUlMVElOX1JJSk5EQUVMICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2NpcGhlci1iZjEuYyBiL29wZW5zc2gtNi4wcDEvY2lwaGVyLWJmMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOTUwOWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NpcGhlci1iZjEuYwpAQCAtMCwwICsxLDEwOCBAQAorLyogJE9wZW5CU0Q6IGNpcGhlci1iZjEuYyx2IDEuNiAyMDEwLzEwLzAxIDIzOjA1OjMyIGRqbSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJsb2cuaCIKKworI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L29wZW5zc2wtY29tcGF0LmgiCisKKy8qCisgKiBTU0gxIHVzZXMgYSB2YXJpYXRpb24gb24gQmxvd2Zpc2gsIGFsbCBieXRlcyBtdXN0IGJlIHN3YXBwZWQgYmVmb3JlCisgKiBhbmQgYWZ0ZXIgZW5jcnlwdGlvbi9kZWNyeXB0aW9uLiBUaHVzIHRoZSBzd2FwX2J5dGVzIHN0dWZmICh5dWspLgorICovCisKK2NvbnN0IEVWUF9DSVBIRVIgKiBldnBfc3NoMV9iZih2b2lkKTsKKworc3RhdGljIHZvaWQKK3N3YXBfYnl0ZXMoY29uc3QgdV9jaGFyICpzcmMsIHVfY2hhciAqZHN0LCBpbnQgbikKK3sKKwl1X2NoYXIgY1s0XTsKKworCS8qIFByb2Nlc3MgNCBieXRlcyBldmVyeSBsYXAuICovCisJZm9yIChuID0gbiAvIDQ7IG4gPiAwOyBuLS0pIHsKKwkJY1szXSA9ICpzcmMrKzsKKwkJY1syXSA9ICpzcmMrKzsKKwkJY1sxXSA9ICpzcmMrKzsKKwkJY1swXSA9ICpzcmMrKzsKKworCQkqZHN0KysgPSBjWzBdOworCQkqZHN0KysgPSBjWzFdOworCQkqZHN0KysgPSBjWzJdOworCQkqZHN0KysgPSBjWzNdOworCX0KK30KKworI2lmZGVmIFNTSF9PTERfRVZQCitzdGF0aWMgdm9pZCBiZl9zc2gxX2luaXQgKEVWUF9DSVBIRVJfQ1RYICogY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCisJCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKml2LCBpbnQgZW5jKQoreworCWlmIChpdiAhPSBOVUxMKQorCQltZW1jcHkgKCYoY3R4LT5vaXZbMF0pLCBpdiwgOCk7CisJbWVtY3B5ICgmKGN0eC0+aXZbMF0pLCAmKGN0eC0+b2l2WzBdKSwgOCk7CisJaWYgKGtleSAhPSBOVUxMKQorCQlCRl9zZXRfa2V5ICgmKGN0eC0+Yy5iZl9rcyksIEVWUF9DSVBIRVJfQ1RYX2tleV9sZW5ndGggKGN0eCksCisJCQkgICAga2V5KTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50ICgqb3JpZ19iZikoRVZQX0NJUEhFUl9DVFggKiwgdV9jaGFyICosCisgICAgY29uc3QgdV9jaGFyICosIExJQkNSWVBUT19FVlBfSU5MX1RZUEUpID0gTlVMTDsKKworc3RhdGljIGludAorYmZfc3NoMV9jaXBoZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdV9jaGFyICpvdXQsIGNvbnN0IHVfY2hhciAqaW4sCisgICAgTElCQ1JZUFRPX0VWUF9JTkxfVFlQRSBsZW4pCit7CisJaW50IHJldDsKKworCXN3YXBfYnl0ZXMoaW4sIG91dCwgbGVuKTsKKwlyZXQgPSAoKm9yaWdfYmYpKGN0eCwgb3V0LCBvdXQsIGxlbik7CisJc3dhcF9ieXRlcyhvdXQsIG91dCwgbGVuKTsKKwlyZXR1cm4gKHJldCk7Cit9CisKK2NvbnN0IEVWUF9DSVBIRVIgKgorZXZwX3NzaDFfYmYodm9pZCkKK3sKKwlzdGF0aWMgRVZQX0NJUEhFUiBzc2gxX2JmOworCisJbWVtY3B5KCZzc2gxX2JmLCBFVlBfYmZfY2JjKCksIHNpemVvZihFVlBfQ0lQSEVSKSk7CisJb3JpZ19iZiA9IHNzaDFfYmYuZG9fY2lwaGVyOworCXNzaDFfYmYubmlkID0gTklEX3VuZGVmOworI2lmZGVmIFNTSF9PTERfRVZQCisJc3NoMV9iZi5pbml0ID0gYmZfc3NoMV9pbml0OworI2VuZGlmCisJc3NoMV9iZi5kb19jaXBoZXIgPSBiZl9zc2gxX2NpcGhlcjsKKwlzc2gxX2JmLmtleV9sZW4gPSAzMjsKKwlyZXR1cm4gKCZzc2gxX2JmKTsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvY2lwaGVyLWN0ci5jIGIvb3BlbnNzaC02LjBwMS9jaXBoZXItY3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5NzViNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY2lwaGVyLWN0ci5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKiAkT3BlbkJTRDogY2lwaGVyLWN0ci5jLHYgMS4xMSAyMDEwLzEwLzAxIDIzOjA1OjMyIGRqbSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNYXJrdXMgRnJpZWRsIDxtYXJrdXNAb3BlbmJzZC5vcmc+CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAibG9nLmgiCisKKy8qIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgb3IgYnJva2VuIE9wZW5TU0wgdmVyc2lvbnMgKi8KKyNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9vcGVuc3NsLWNvbXBhdC5oIgorCisjaWZuZGVmIFVTRV9CVUlMVElOX1JJSk5EQUVMCisjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KKyNlbmRpZgorCitjb25zdCBFVlBfQ0lQSEVSICpldnBfYWVzXzEyOF9jdHIodm9pZCk7Cit2b2lkIHNzaF9hZXNfY3RyX2l2KEVWUF9DSVBIRVJfQ1RYICosIGludCwgdV9jaGFyICosIHNpemVfdCk7CisKK3N0cnVjdCBzc2hfYWVzX2N0cl9jdHgKK3sKKwlBRVNfS0VZCQlhZXNfY3R4OworCXVfY2hhcgkJYWVzX2NvdW50ZXJbQUVTX0JMT0NLX1NJWkVdOworfTsKKworLyoKKyAqIGluY3JlbWVudCBjb3VudGVyICdjdHInLAorICogdGhlIGNvdW50ZXIgaXMgb2Ygc2l6ZSAnbGVuJyBieXRlcyBhbmQgc3RvcmVkIGluIG5ldHdvcmstYnl0ZS1vcmRlci4KKyAqIChMU0IgYXQgY3RyW2xlbi0xXSwgTVNCIGF0IGN0clswXSkKKyAqLworc3RhdGljIHZvaWQKK3NzaF9jdHJfaW5jKHVfY2hhciAqY3RyLCBzaXplX3QgbGVuKQoreworCWludCBpOworCisJZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pCisJCWlmICgrK2N0cltpXSkJLyogY29udGludWUgb24gb3ZlcmZsb3cgKi8KKwkJCXJldHVybjsKK30KKworc3RhdGljIGludAorc3NoX2Flc19jdHIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdV9jaGFyICpkZXN0LCBjb25zdCB1X2NoYXIgKnNyYywKKyAgICBMSUJDUllQVE9fRVZQX0lOTF9UWVBFIGxlbikKK3sKKwlzdHJ1Y3Qgc3NoX2Flc19jdHJfY3R4ICpjOworCXNpemVfdCBuID0gMDsKKwl1X2NoYXIgYnVmW0FFU19CTE9DS19TSVpFXTsKKworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuICgxKTsKKwlpZiAoKGMgPSBFVlBfQ0lQSEVSX0NUWF9nZXRfYXBwX2RhdGEoY3R4KSkgPT0gTlVMTCkKKwkJcmV0dXJuICgwKTsKKworCXdoaWxlICgobGVuLS0pID4gMCkgeworCQlpZiAobiA9PSAwKSB7CisJCQlBRVNfZW5jcnlwdChjLT5hZXNfY291bnRlciwgYnVmLCAmYy0+YWVzX2N0eCk7CisJCQlzc2hfY3RyX2luYyhjLT5hZXNfY291bnRlciwgQUVTX0JMT0NLX1NJWkUpOworCQl9CisJCSooZGVzdCsrKSA9ICooc3JjKyspIF4gYnVmW25dOworCQluID0gKG4gKyAxKSAlIEFFU19CTE9DS19TSVpFOworCX0KKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW50Citzc2hfYWVzX2N0cl9pbml0KEVWUF9DSVBIRVJfQ1RYICpjdHgsIGNvbnN0IHVfY2hhciAqa2V5LCBjb25zdCB1X2NoYXIgKml2LAorICAgIGludCBlbmMpCit7CisJc3RydWN0IHNzaF9hZXNfY3RyX2N0eCAqYzsKKworCWlmICgoYyA9IEVWUF9DSVBIRVJfQ1RYX2dldF9hcHBfZGF0YShjdHgpKSA9PSBOVUxMKSB7CisJCWMgPSB4bWFsbG9jKHNpemVvZigqYykpOworCQlFVlBfQ0lQSEVSX0NUWF9zZXRfYXBwX2RhdGEoY3R4LCBjKTsKKwl9CisJaWYgKGtleSAhPSBOVUxMKQorCQlBRVNfc2V0X2VuY3J5cHRfa2V5KGtleSwgRVZQX0NJUEhFUl9DVFhfa2V5X2xlbmd0aChjdHgpICogOCwKKwkJICAgICZjLT5hZXNfY3R4KTsKKwlpZiAoaXYgIT0gTlVMTCkKKwkJbWVtY3B5KGMtPmFlc19jb3VudGVyLCBpdiwgQUVTX0JMT0NLX1NJWkUpOworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQKK3NzaF9hZXNfY3RyX2NsZWFudXAoRVZQX0NJUEhFUl9DVFggKmN0eCkKK3sKKwlzdHJ1Y3Qgc3NoX2Flc19jdHJfY3R4ICpjOworCisJaWYgKChjID0gRVZQX0NJUEhFUl9DVFhfZ2V0X2FwcF9kYXRhKGN0eCkpICE9IE5VTEwpIHsKKwkJbWVtc2V0KGMsIDAsIHNpemVvZigqYykpOworCQl4ZnJlZShjKTsKKwkJRVZQX0NJUEhFUl9DVFhfc2V0X2FwcF9kYXRhKGN0eCwgTlVMTCk7CisJfQorCXJldHVybiAoMSk7Cit9CisKK3ZvaWQKK3NzaF9hZXNfY3RyX2l2KEVWUF9DSVBIRVJfQ1RYICpldnAsIGludCBkb3NldCwgdV9jaGFyICogaXYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNzaF9hZXNfY3RyX2N0eCAqYzsKKworCWlmICgoYyA9IEVWUF9DSVBIRVJfQ1RYX2dldF9hcHBfZGF0YShldnApKSA9PSBOVUxMKQorCQlmYXRhbCgic3NoX2Flc19jdHJfaXY6IG5vIGNvbnRleHQiKTsKKwlpZiAoZG9zZXQpCisJCW1lbWNweShjLT5hZXNfY291bnRlciwgaXYsIGxlbik7CisJZWxzZQorCQltZW1jcHkoaXYsIGMtPmFlc19jb3VudGVyLCBsZW4pOworfQorCitjb25zdCBFVlBfQ0lQSEVSICoKK2V2cF9hZXNfMTI4X2N0cih2b2lkKQoreworCXN0YXRpYyBFVlBfQ0lQSEVSIGFlc19jdHI7CisKKwltZW1zZXQoJmFlc19jdHIsIDAsIHNpemVvZihFVlBfQ0lQSEVSKSk7CisJYWVzX2N0ci5uaWQgPSBOSURfdW5kZWY7CisJYWVzX2N0ci5ibG9ja19zaXplID0gQUVTX0JMT0NLX1NJWkU7CisJYWVzX2N0ci5pdl9sZW4gPSBBRVNfQkxPQ0tfU0laRTsKKwlhZXNfY3RyLmtleV9sZW4gPSAxNjsKKwlhZXNfY3RyLmluaXQgPSBzc2hfYWVzX2N0cl9pbml0OworCWFlc19jdHIuY2xlYW51cCA9IHNzaF9hZXNfY3RyX2NsZWFudXA7CisJYWVzX2N0ci5kb19jaXBoZXIgPSBzc2hfYWVzX2N0cjsKKyNpZm5kZWYgU1NIX09MRF9FVlAKKwlhZXNfY3RyLmZsYWdzID0gRVZQX0NJUEhfQ0JDX01PREUgfCBFVlBfQ0lQSF9WQVJJQUJMRV9MRU5HVEggfAorCSAgICBFVlBfQ0lQSF9BTFdBWVNfQ0FMTF9JTklUIHwgRVZQX0NJUEhfQ1VTVE9NX0lWOworI2VuZGlmCisJcmV0dXJuICgmYWVzX2N0cik7Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2NpcGhlci5jIGIvb3BlbnNzaC02LjBwMS9jaXBoZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjVjMGFjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9jaXBoZXIuYwpAQCAtMCwwICsxLDQzMSBAQAorLyogJE9wZW5CU0Q6IGNpcGhlci5jLHYgMS44MiAyMDA5LzAxLzI2IDA5OjU4OjE1IG1hcmt1cyBFeHAgJCAqLworLyoKKyAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAorICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgTmllbHMgUHJvdm9zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJjaXBoZXIuaCIKKworLyogY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBvciBicm9rZW4gT3BlblNTTCB2ZXJzaW9ucyAqLworI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L29wZW5zc2wtY29tcGF0LmgiCisKK2V4dGVybiBjb25zdCBFVlBfQ0lQSEVSICpldnBfc3NoMV9iZih2b2lkKTsKK2V4dGVybiBjb25zdCBFVlBfQ0lQSEVSICpldnBfc3NoMV8zZGVzKHZvaWQpOworZXh0ZXJuIHZvaWQgc3NoMV8zZGVzX2l2KEVWUF9DSVBIRVJfQ1RYICosIGludCwgdV9jaGFyICosIGludCk7CitleHRlcm4gY29uc3QgRVZQX0NJUEhFUiAqZXZwX2Flc18xMjhfY3RyKHZvaWQpOworZXh0ZXJuIHZvaWQgc3NoX2Flc19jdHJfaXYoRVZQX0NJUEhFUl9DVFggKiwgaW50LCB1X2NoYXIgKiwgdV9pbnQpOworCitzdHJ1Y3QgQ2lwaGVyIHsKKwljaGFyCSpuYW1lOworCWludAludW1iZXI7CQkvKiBmb3Igc3NoMSBvbmx5ICovCisJdV9pbnQJYmxvY2tfc2l6ZTsKKwl1X2ludAlrZXlfbGVuOworCXVfaW50CWRpc2NhcmRfbGVuOworCXVfaW50CWNiY19tb2RlOworCWNvbnN0IEVWUF9DSVBIRVIJKigqZXZwdHlwZSkodm9pZCk7Cit9IGNpcGhlcnNbXSA9IHsKKwl7ICJub25lIiwJCVNTSF9DSVBIRVJfTk9ORSwgOCwgMCwgMCwgMCwgRVZQX2VuY19udWxsIH0sCisJeyAiZGVzIiwJCVNTSF9DSVBIRVJfREVTLCA4LCA4LCAwLCAxLCBFVlBfZGVzX2NiYyB9LAorCXsgIjNkZXMiLAkJU1NIX0NJUEhFUl8zREVTLCA4LCAxNiwgMCwgMSwgZXZwX3NzaDFfM2RlcyB9LAorCXsgImJsb3dmaXNoIiwJCVNTSF9DSVBIRVJfQkxPV0ZJU0gsIDgsIDMyLCAwLCAxLCBldnBfc3NoMV9iZiB9LAorCisJeyAiM2Rlcy1jYmMiLAkJU1NIX0NJUEhFUl9TU0gyLCA4LCAyNCwgMCwgMSwgRVZQX2Rlc19lZGUzX2NiYyB9LAorCXsgImJsb3dmaXNoLWNiYyIsCVNTSF9DSVBIRVJfU1NIMiwgOCwgMTYsIDAsIDEsIEVWUF9iZl9jYmMgfSwKKwl7ICJjYXN0MTI4LWNiYyIsCVNTSF9DSVBIRVJfU1NIMiwgOCwgMTYsIDAsIDEsIEVWUF9jYXN0NV9jYmMgfSwKKwl7ICJhcmNmb3VyIiwJCVNTSF9DSVBIRVJfU1NIMiwgOCwgMTYsIDAsIDAsIEVWUF9yYzQgfSwKKwl7ICJhcmNmb3VyMTI4IiwJCVNTSF9DSVBIRVJfU1NIMiwgOCwgMTYsIDE1MzYsIDAsIEVWUF9yYzQgfSwKKwl7ICJhcmNmb3VyMjU2IiwJCVNTSF9DSVBIRVJfU1NIMiwgOCwgMzIsIDE1MzYsIDAsIEVWUF9yYzQgfSwKKwl7ICJhZXMxMjgtY2JjIiwJCVNTSF9DSVBIRVJfU1NIMiwgMTYsIDE2LCAwLCAxLCBFVlBfYWVzXzEyOF9jYmMgfSwKKwl7ICJhZXMxOTItY2JjIiwJCVNTSF9DSVBIRVJfU1NIMiwgMTYsIDI0LCAwLCAxLCBFVlBfYWVzXzE5Ml9jYmMgfSwKKwl7ICJhZXMyNTYtY2JjIiwJCVNTSF9DSVBIRVJfU1NIMiwgMTYsIDMyLCAwLCAxLCBFVlBfYWVzXzI1Nl9jYmMgfSwKKwl7ICJyaWpuZGFlbC1jYmNAbHlzYXRvci5saXUuc2UiLAorCQkJCVNTSF9DSVBIRVJfU1NIMiwgMTYsIDMyLCAwLCAxLCBFVlBfYWVzXzI1Nl9jYmMgfSwKKwl7ICJhZXMxMjgtY3RyIiwJCVNTSF9DSVBIRVJfU1NIMiwgMTYsIDE2LCAwLCAwLCBldnBfYWVzXzEyOF9jdHIgfSwKKwl7ICJhZXMxOTItY3RyIiwJCVNTSF9DSVBIRVJfU1NIMiwgMTYsIDI0LCAwLCAwLCBldnBfYWVzXzEyOF9jdHIgfSwKKwl7ICJhZXMyNTYtY3RyIiwJCVNTSF9DSVBIRVJfU1NIMiwgMTYsIDMyLCAwLCAwLCBldnBfYWVzXzEyOF9jdHIgfSwKKyNpZmRlZiBVU0VfQ0lQSEVSX0FDU1MKKwl7ICJhY3NzQG9wZW5zc2gub3JnIiwJU1NIX0NJUEhFUl9TU0gyLCAxNiwgNSwgMCwgMCwgRVZQX2Fjc3MgfSwKKyNlbmRpZgorCXsgTlVMTCwJCQlTU0hfQ0lQSEVSX0lOVkFMSUQsIDAsIDAsIDAsIDAsIE5VTEwgfQorfTsKKworLyotLSovCisKK3VfaW50CitjaXBoZXJfYmxvY2tzaXplKGNvbnN0IENpcGhlciAqYykKK3sKKwlyZXR1cm4gKGMtPmJsb2NrX3NpemUpOworfQorCit1X2ludAorY2lwaGVyX2tleWxlbihjb25zdCBDaXBoZXIgKmMpCit7CisJcmV0dXJuIChjLT5rZXlfbGVuKTsKK30KKwordV9pbnQKK2NpcGhlcl9nZXRfbnVtYmVyKGNvbnN0IENpcGhlciAqYykKK3sKKwlyZXR1cm4gKGMtPm51bWJlcik7Cit9CisKK3VfaW50CitjaXBoZXJfaXNfY2JjKGNvbnN0IENpcGhlciAqYykKK3sKKwlyZXR1cm4gKGMtPmNiY19tb2RlKTsKK30KKwordV9pbnQKK2NpcGhlcl9tYXNrX3NzaDEoaW50IGNsaWVudCkKK3sKKwl1X2ludCBtYXNrID0gMDsKKwltYXNrIHw9IDEgPDwgU1NIX0NJUEhFUl8zREVTOwkJLyogTWFuZGF0b3J5ICovCisJbWFzayB8PSAxIDw8IFNTSF9DSVBIRVJfQkxPV0ZJU0g7CisJaWYgKGNsaWVudCkgeworCQltYXNrIHw9IDEgPDwgU1NIX0NJUEhFUl9ERVM7CisJfQorCXJldHVybiBtYXNrOworfQorCitDaXBoZXIgKgorY2lwaGVyX2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlDaXBoZXIgKmM7CisJZm9yIChjID0gY2lwaGVyczsgYy0+bmFtZSAhPSBOVUxMOyBjKyspCisJCWlmIChzdHJjbXAoYy0+bmFtZSwgbmFtZSkgPT0gMCkKKwkJCXJldHVybiBjOworCXJldHVybiBOVUxMOworfQorCitDaXBoZXIgKgorY2lwaGVyX2J5X251bWJlcihpbnQgaWQpCit7CisJQ2lwaGVyICpjOworCWZvciAoYyA9IGNpcGhlcnM7IGMtPm5hbWUgIT0gTlVMTDsgYysrKQorCQlpZiAoYy0+bnVtYmVyID09IGlkKQorCQkJcmV0dXJuIGM7CisJcmV0dXJuIE5VTEw7Cit9CisKKyNkZWZpbmUJQ0lQSEVSX1NFUAkiLCIKK2ludAorY2lwaGVyc192YWxpZChjb25zdCBjaGFyICpuYW1lcykKK3sKKwlDaXBoZXIgKmM7CisJY2hhciAqY2lwaGVyX2xpc3QsICpjcDsKKwljaGFyICpwOworCisJaWYgKG5hbWVzID09IE5VTEwgfHwgc3RyY21wKG5hbWVzLCAiIikgPT0gMCkKKwkJcmV0dXJuIDA7CisJY2lwaGVyX2xpc3QgPSBjcCA9IHhzdHJkdXAobmFtZXMpOworCWZvciAoKHAgPSBzdHJzZXAoJmNwLCBDSVBIRVJfU0VQKSk7IHAgJiYgKnAgIT0gJ1wwJzsKKwkgICAgKHAgPSBzdHJzZXAoJmNwLCBDSVBIRVJfU0VQKSkpIHsKKwkJYyA9IGNpcGhlcl9ieV9uYW1lKHApOworCQlpZiAoYyA9PSBOVUxMIHx8IGMtPm51bWJlciAhPSBTU0hfQ0lQSEVSX1NTSDIpIHsKKwkJCWRlYnVnKCJiYWQgY2lwaGVyICVzIFslc10iLCBwLCBuYW1lcyk7CisJCQl4ZnJlZShjaXBoZXJfbGlzdCk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCWRlYnVnMygiY2lwaGVyIG9rOiAlcyBbJXNdIiwgcCwgbmFtZXMpOworCQl9CisJfQorCWRlYnVnMygiY2lwaGVycyBvazogWyVzXSIsIG5hbWVzKTsKKwl4ZnJlZShjaXBoZXJfbGlzdCk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBQYXJzZXMgdGhlIG5hbWUgb2YgdGhlIGNpcGhlci4gIFJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgY29ycmVzcG9uZGluZworICogY2lwaGVyLCBvciAtMSBvbiBlcnJvci4KKyAqLworCitpbnQKK2NpcGhlcl9udW1iZXIoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlDaXBoZXIgKmM7CisJaWYgKG5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCWZvciAoYyA9IGNpcGhlcnM7IGMtPm5hbWUgIT0gTlVMTDsgYysrKQorCQlpZiAoc3RyY2FzZWNtcChjLT5uYW1lLCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuIGMtPm51bWJlcjsKKwlyZXR1cm4gLTE7Cit9CisKK2NoYXIgKgorY2lwaGVyX25hbWUoaW50IGlkKQoreworCUNpcGhlciAqYyA9IGNpcGhlcl9ieV9udW1iZXIoaWQpOworCXJldHVybiAoYz09TlVMTCkgPyAiPHVua25vd24+IiA6IGMtPm5hbWU7Cit9CisKK3ZvaWQKK2NpcGhlcl9pbml0KENpcGhlckNvbnRleHQgKmNjLCBDaXBoZXIgKmNpcGhlciwKKyAgICBjb25zdCB1X2NoYXIgKmtleSwgdV9pbnQga2V5bGVuLCBjb25zdCB1X2NoYXIgKml2LCB1X2ludCBpdmxlbiwKKyAgICBpbnQgZG9fZW5jcnlwdCkKK3sKKwlzdGF0aWMgaW50IGRvd2FybiA9IDE7CisjaWZkZWYgU1NIX09MRF9FVlAKKwlFVlBfQ0lQSEVSICp0eXBlOworI2Vsc2UKKwljb25zdCBFVlBfQ0lQSEVSICp0eXBlOworCWludCBrbGVuOworI2VuZGlmCisJdV9jaGFyICpqdW5rLCAqZGlzY2FyZDsKKworCWlmIChjaXBoZXItPm51bWJlciA9PSBTU0hfQ0lQSEVSX0RFUykgeworCQlpZiAoZG93YXJuKSB7CisJCQllcnJvcigiV2FybmluZzogdXNlIG9mIERFUyBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZCAiCisJCQkgICAgImR1ZSB0byBjcnlwdG9ncmFwaGljIHdlYWtuZXNzZXMiKTsKKwkJCWRvd2FybiA9IDA7CisJCX0KKwkJaWYgKGtleWxlbiA+IDgpCisJCQlrZXlsZW4gPSA4OworCX0KKwljYy0+cGxhaW50ZXh0ID0gKGNpcGhlci0+bnVtYmVyID09IFNTSF9DSVBIRVJfTk9ORSk7CisKKwlpZiAoa2V5bGVuIDwgY2lwaGVyLT5rZXlfbGVuKQorCQlmYXRhbCgiY2lwaGVyX2luaXQ6IGtleSBsZW5ndGggJWQgaXMgaW5zdWZmaWNpZW50IGZvciAlcy4iLAorCQkgICAga2V5bGVuLCBjaXBoZXItPm5hbWUpOworCWlmIChpdiAhPSBOVUxMICYmIGl2bGVuIDwgY2lwaGVyLT5ibG9ja19zaXplKQorCQlmYXRhbCgiY2lwaGVyX2luaXQ6IGl2IGxlbmd0aCAlZCBpcyBpbnN1ZmZpY2llbnQgZm9yICVzLiIsCisJCSAgICBpdmxlbiwgY2lwaGVyLT5uYW1lKTsKKwljYy0+Y2lwaGVyID0gY2lwaGVyOworCisJdHlwZSA9ICgqY2lwaGVyLT5ldnB0eXBlKSgpOworCisJRVZQX0NJUEhFUl9DVFhfaW5pdCgmY2MtPmV2cCk7CisjaWZkZWYgU1NIX09MRF9FVlAKKwlpZiAodHlwZS0+a2V5X2xlbiA+IDAgJiYgdHlwZS0+a2V5X2xlbiAhPSBrZXlsZW4pIHsKKwkJZGVidWcoImNpcGhlcl9pbml0OiBzZXQga2V5bGVuICglZCAtPiAlZCkiLAorCQkgICAgdHlwZS0+a2V5X2xlbiwga2V5bGVuKTsKKwkJdHlwZS0+a2V5X2xlbiA9IGtleWxlbjsKKwl9CisJRVZQX0NpcGhlckluaXQoJmNjLT5ldnAsIHR5cGUsICh1X2NoYXIgKilrZXksICh1X2NoYXIgKilpdiwKKwkgICAgKGRvX2VuY3J5cHQgPT0gQ0lQSEVSX0VOQ1JZUFQpKTsKKyNlbHNlCisJaWYgKEVWUF9DaXBoZXJJbml0KCZjYy0+ZXZwLCB0eXBlLCBOVUxMLCAodV9jaGFyICopaXYsCisJICAgIChkb19lbmNyeXB0ID09IENJUEhFUl9FTkNSWVBUKSkgPT0gMCkKKwkJZmF0YWwoImNpcGhlcl9pbml0OiBFVlBfQ2lwaGVySW5pdCBmYWlsZWQgZm9yICVzIiwKKwkJICAgIGNpcGhlci0+bmFtZSk7CisJa2xlbiA9IEVWUF9DSVBIRVJfQ1RYX2tleV9sZW5ndGgoJmNjLT5ldnApOworCWlmIChrbGVuID4gMCAmJiBrZXlsZW4gIT0gKHVfaW50KWtsZW4pIHsKKwkJZGVidWcyKCJjaXBoZXJfaW5pdDogc2V0IGtleWxlbiAoJWQgLT4gJWQpIiwga2xlbiwga2V5bGVuKTsKKwkJaWYgKEVWUF9DSVBIRVJfQ1RYX3NldF9rZXlfbGVuZ3RoKCZjYy0+ZXZwLCBrZXlsZW4pID09IDApCisJCQlmYXRhbCgiY2lwaGVyX2luaXQ6IHNldCBrZXlsZW4gZmFpbGVkICglZCAtPiAlZCkiLAorCQkJICAgIGtsZW4sIGtleWxlbik7CisJfQorCWlmIChFVlBfQ2lwaGVySW5pdCgmY2MtPmV2cCwgTlVMTCwgKHVfY2hhciAqKWtleSwgTlVMTCwgLTEpID09IDApCisJCWZhdGFsKCJjaXBoZXJfaW5pdDogRVZQX0NpcGhlckluaXQ6IHNldCBrZXkgZmFpbGVkIGZvciAlcyIsCisJCSAgICBjaXBoZXItPm5hbWUpOworI2VuZGlmCisKKwlpZiAoY2lwaGVyLT5kaXNjYXJkX2xlbiA+IDApIHsKKwkJanVuayA9IHhtYWxsb2MoY2lwaGVyLT5kaXNjYXJkX2xlbik7CisJCWRpc2NhcmQgPSB4bWFsbG9jKGNpcGhlci0+ZGlzY2FyZF9sZW4pOworCQlpZiAoRVZQX0NpcGhlcigmY2MtPmV2cCwgZGlzY2FyZCwganVuaywKKwkJICAgIGNpcGhlci0+ZGlzY2FyZF9sZW4pID09IDApCisJCQlmYXRhbCgiZXZwX2NyeXB0OiBFVlBfQ2lwaGVyIGZhaWxlZCBkdXJpbmcgZGlzY2FyZCIpOworCQltZW1zZXQoZGlzY2FyZCwgMCwgY2lwaGVyLT5kaXNjYXJkX2xlbik7CisJCXhmcmVlKGp1bmspOworCQl4ZnJlZShkaXNjYXJkKTsKKwl9Cit9CisKK3ZvaWQKK2NpcGhlcl9jcnlwdChDaXBoZXJDb250ZXh0ICpjYywgdV9jaGFyICpkZXN0LCBjb25zdCB1X2NoYXIgKnNyYywgdV9pbnQgbGVuKQoreworCWlmIChsZW4gJSBjYy0+Y2lwaGVyLT5ibG9ja19zaXplKQorCQlmYXRhbCgiY2lwaGVyX2VuY3J5cHQ6IGJhZCBwbGFpbnRleHQgbGVuZ3RoICVkIiwgbGVuKTsKKwlpZiAoRVZQX0NpcGhlcigmY2MtPmV2cCwgZGVzdCwgKHVfY2hhciAqKXNyYywgbGVuKSA9PSAwKQorCQlmYXRhbCgiZXZwX2NyeXB0OiBFVlBfQ2lwaGVyIGZhaWxlZCIpOworfQorCit2b2lkCitjaXBoZXJfY2xlYW51cChDaXBoZXJDb250ZXh0ICpjYykKK3sKKwlpZiAoRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmY2MtPmV2cCkgPT0gMCkKKwkJZXJyb3IoImNpcGhlcl9jbGVhbnVwOiBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwIGZhaWxlZCIpOworfQorCisvKgorICogU2VsZWN0cyB0aGUgY2lwaGVyLCBhbmQga2V5cyBpZiBieSBjb21wdXRpbmcgdGhlIE1ENSBjaGVja3N1bSBvZiB0aGUKKyAqIHBhc3NwaHJhc2UgYW5kIHVzaW5nIHRoZSByZXN1bHRpbmcgMTYgYnl0ZXMgYXMgdGhlIGtleS4KKyAqLworCit2b2lkCitjaXBoZXJfc2V0X2tleV9zdHJpbmcoQ2lwaGVyQ29udGV4dCAqY2MsIENpcGhlciAqY2lwaGVyLAorICAgIGNvbnN0IGNoYXIgKnBhc3NwaHJhc2UsIGludCBkb19lbmNyeXB0KQoreworCU1ENV9DVFggbWQ7CisJdV9jaGFyIGRpZ2VzdFsxNl07CisKKwlNRDVfSW5pdCgmbWQpOworCU1ENV9VcGRhdGUoJm1kLCAoY29uc3QgdV9jaGFyICopcGFzc3BocmFzZSwgc3RybGVuKHBhc3NwaHJhc2UpKTsKKwlNRDVfRmluYWwoZGlnZXN0LCAmbWQpOworCisJY2lwaGVyX2luaXQoY2MsIGNpcGhlciwgZGlnZXN0LCAxNiwgTlVMTCwgMCwgZG9fZW5jcnlwdCk7CisKKwltZW1zZXQoZGlnZXN0LCAwLCBzaXplb2YoZGlnZXN0KSk7CisJbWVtc2V0KCZtZCwgMCwgc2l6ZW9mKG1kKSk7Cit9CisKKy8qCisgKiBFeHBvcnRzIGFuIElWIGZyb20gdGhlIENpcGhlckNvbnRleHQgcmVxdWlyZWQgdG8gZXhwb3J0IHRoZSBrZXkKKyAqIHN0YXRlIGJhY2sgZnJvbSB0aGUgdW5wcml2aWxlZ2VkIGNoaWxkIHRvIHRoZSBwcml2aWxlZ2VkIHBhcmVudAorICogcHJvY2Vzcy4KKyAqLworCitpbnQKK2NpcGhlcl9nZXRfa2V5aXZfbGVuKGNvbnN0IENpcGhlckNvbnRleHQgKmNjKQoreworCUNpcGhlciAqYyA9IGNjLT5jaXBoZXI7CisJaW50IGl2bGVuOworCisJaWYgKGMtPm51bWJlciA9PSBTU0hfQ0lQSEVSXzNERVMpCisJCWl2bGVuID0gMjQ7CisJZWxzZQorCQlpdmxlbiA9IEVWUF9DSVBIRVJfQ1RYX2l2X2xlbmd0aCgmY2MtPmV2cCk7CisJcmV0dXJuIChpdmxlbik7Cit9CisKK3ZvaWQKK2NpcGhlcl9nZXRfa2V5aXYoQ2lwaGVyQ29udGV4dCAqY2MsIHVfY2hhciAqaXYsIHVfaW50IGxlbikKK3sKKwlDaXBoZXIgKmMgPSBjYy0+Y2lwaGVyOworCWludCBldnBsZW47CisKKwlzd2l0Y2ggKGMtPm51bWJlcikgeworCWNhc2UgU1NIX0NJUEhFUl9TU0gyOgorCWNhc2UgU1NIX0NJUEhFUl9ERVM6CisJY2FzZSBTU0hfQ0lQSEVSX0JMT1dGSVNIOgorCQlldnBsZW4gPSBFVlBfQ0lQSEVSX0NUWF9pdl9sZW5ndGgoJmNjLT5ldnApOworCQlpZiAoZXZwbGVuIDw9IDApCisJCQlyZXR1cm47CisJCWlmICgodV9pbnQpZXZwbGVuICE9IGxlbikKKwkJCWZhdGFsKCIlczogd3JvbmcgaXYgbGVuZ3RoICVkICE9ICVkIiwgX19mdW5jX18sCisJCQkgICAgZXZwbGVuLCBsZW4pOworI2lmZGVmIFVTRV9CVUlMVElOX1JJSk5EQUVMCisJCWlmIChjLT5ldnB0eXBlID09IGV2cF9yaWpuZGFlbCkKKwkJCXNzaF9yaWpuZGFlbF9pdigmY2MtPmV2cCwgMCwgaXYsIGxlbik7CisJCWVsc2UKKyNlbmRpZgorCQlpZiAoYy0+ZXZwdHlwZSA9PSBldnBfYWVzXzEyOF9jdHIpCisJCQlzc2hfYWVzX2N0cl9pdigmY2MtPmV2cCwgMCwgaXYsIGxlbik7CisJCWVsc2UKKwkJCW1lbWNweShpdiwgY2MtPmV2cC5pdiwgbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBTU0hfQ0lQSEVSXzNERVM6CisJCXNzaDFfM2Rlc19pdigmY2MtPmV2cCwgMCwgaXYsIDI0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZmF0YWwoIiVzOiBiYWQgY2lwaGVyICVkIiwgX19mdW5jX18sIGMtPm51bWJlcik7CisJfQorfQorCit2b2lkCitjaXBoZXJfc2V0X2tleWl2KENpcGhlckNvbnRleHQgKmNjLCB1X2NoYXIgKml2KQoreworCUNpcGhlciAqYyA9IGNjLT5jaXBoZXI7CisJaW50IGV2cGxlbiA9IDA7CisKKwlzd2l0Y2ggKGMtPm51bWJlcikgeworCWNhc2UgU1NIX0NJUEhFUl9TU0gyOgorCWNhc2UgU1NIX0NJUEhFUl9ERVM6CisJY2FzZSBTU0hfQ0lQSEVSX0JMT1dGSVNIOgorCQlldnBsZW4gPSBFVlBfQ0lQSEVSX0NUWF9pdl9sZW5ndGgoJmNjLT5ldnApOworCQlpZiAoZXZwbGVuID09IDApCisJCQlyZXR1cm47CisjaWZkZWYgVVNFX0JVSUxUSU5fUklKTkRBRUwKKwkJaWYgKGMtPmV2cHR5cGUgPT0gZXZwX3Jpam5kYWVsKQorCQkJc3NoX3Jpam5kYWVsX2l2KCZjYy0+ZXZwLCAxLCBpdiwgZXZwbGVuKTsKKwkJZWxzZQorI2VuZGlmCisJCWlmIChjLT5ldnB0eXBlID09IGV2cF9hZXNfMTI4X2N0cikKKwkJCXNzaF9hZXNfY3RyX2l2KCZjYy0+ZXZwLCAxLCBpdiwgZXZwbGVuKTsKKwkJZWxzZQorCQkJbWVtY3B5KGNjLT5ldnAuaXYsIGl2LCBldnBsZW4pOworCQlicmVhazsKKwljYXNlIFNTSF9DSVBIRVJfM0RFUzoKKwkJc3NoMV8zZGVzX2l2KCZjYy0+ZXZwLCAxLCBpdiwgMjQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmYXRhbCgiJXM6IGJhZCBjaXBoZXIgJWQiLCBfX2Z1bmNfXywgYy0+bnVtYmVyKTsKKwl9Cit9CisKKyNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgwMDkwNzAwMEwKKyNkZWZpbmUgRVZQX1hfU1RBVEUoZXZwKQkmKGV2cCkuYworI2RlZmluZSBFVlBfWF9TVEFURV9MRU4oZXZwKQlzaXplb2YoKGV2cCkuYykKKyNlbHNlCisjZGVmaW5lIEVWUF9YX1NUQVRFKGV2cCkJKGV2cCkuY2lwaGVyX2RhdGEKKyNkZWZpbmUgRVZQX1hfU1RBVEVfTEVOKGV2cCkJKGV2cCkuY2lwaGVyLT5jdHhfc2l6ZQorI2VuZGlmCisKK2ludAorY2lwaGVyX2dldF9rZXljb250ZXh0KGNvbnN0IENpcGhlckNvbnRleHQgKmNjLCB1X2NoYXIgKmRhdCkKK3sKKwlDaXBoZXIgKmMgPSBjYy0+Y2lwaGVyOworCWludCBwbGVuID0gMDsKKworCWlmIChjLT5ldnB0eXBlID09IEVWUF9yYzQgfHwgYy0+ZXZwdHlwZSA9PSBFVlBfYWNzcykgeworCQlwbGVuID0gRVZQX1hfU1RBVEVfTEVOKGNjLT5ldnApOworCQlpZiAoZGF0ID09IE5VTEwpCisJCQlyZXR1cm4gKHBsZW4pOworCQltZW1jcHkoZGF0LCBFVlBfWF9TVEFURShjYy0+ZXZwKSwgcGxlbik7CisJfQorCXJldHVybiAocGxlbik7Cit9CisKK3ZvaWQKK2NpcGhlcl9zZXRfa2V5Y29udGV4dChDaXBoZXJDb250ZXh0ICpjYywgdV9jaGFyICpkYXQpCit7CisJQ2lwaGVyICpjID0gY2MtPmNpcGhlcjsKKwlpbnQgcGxlbjsKKworCWlmIChjLT5ldnB0eXBlID09IEVWUF9yYzQgfHwgYy0+ZXZwdHlwZSA9PSBFVlBfYWNzcykgeworCQlwbGVuID0gRVZQX1hfU1RBVEVfTEVOKGNjLT5ldnApOworCQltZW1jcHkoRVZQX1hfU1RBVEUoY2MtPmV2cCksIGRhdCwgcGxlbik7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jaXBoZXIuaCBiL29wZW5zc2gtNi4wcDEvY2lwaGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkMjI3MAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY2lwaGVyLmgKQEAgLTAsMCArMSw5MiBAQAorLyogJE9wZW5CU0Q6IGNpcGhlci5oLHYgMS4zNyAyMDA5LzAxLzI2IDA5OjU4OjE1IG1hcmt1cyBFeHAgJCAqLworCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKKyAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCisgKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCisgKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCisgKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIENJUEhFUl9ICisjZGVmaW5lIENJUEhFUl9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorLyoKKyAqIENpcGhlciB0eXBlcyBmb3IgU1NILTEuICBOZXcgdHlwZXMgY2FuIGJlIGFkZGVkLCBidXQgb2xkIHR5cGVzIHNob3VsZCBub3QKKyAqIGJlIHJlbW92ZWQgZm9yIGNvbXBhdGliaWxpdHkuICBUaGUgbWF4aW11bSBhbGxvd2VkIHZhbHVlIGlzIDMxLgorICovCisjZGVmaW5lIFNTSF9DSVBIRVJfU1NIMgkJLTMKKyNkZWZpbmUgU1NIX0NJUEhFUl9JTlZBTElECS0yCS8qIE5vIHZhbGlkIGNpcGhlciBzZWxlY3RlZC4gKi8KKyNkZWZpbmUgU1NIX0NJUEhFUl9OT1RfU0VUCS0xCS8qIE5vbmUgc2VsZWN0ZWQgKGludmFsaWQgbnVtYmVyKS4gKi8KKyNkZWZpbmUgU1NIX0NJUEhFUl9OT05FCQkwCS8qIG5vIGVuY3J5cHRpb24gKi8KKyNkZWZpbmUgU1NIX0NJUEhFUl9JREVBCQkxCS8qIElERUEgQ0ZCICovCisjZGVmaW5lIFNTSF9DSVBIRVJfREVTCQkyCS8qIERFUyBDQkMgKi8KKyNkZWZpbmUgU1NIX0NJUEhFUl8zREVTCQkzCS8qIDNERVMgQ0JDICovCisjZGVmaW5lIFNTSF9DSVBIRVJfQlJPS0VOX1RTUwk0CS8qIFRSSSdzIFNpbXBsZSBTdHJlYW0gZW5jcnlwdGlvbiBDQkMgKi8KKyNkZWZpbmUgU1NIX0NJUEhFUl9CUk9LRU5fUkM0CTUJLyogQWxsZWdlZCBSQzQgKi8KKyNkZWZpbmUgU1NIX0NJUEhFUl9CTE9XRklTSAk2CisjZGVmaW5lIFNTSF9DSVBIRVJfUkVTRVJWRUQJNworI2RlZmluZSBTU0hfQ0lQSEVSX01BWAkJMzEKKworI2RlZmluZSBDSVBIRVJfRU5DUllQVAkJMQorI2RlZmluZSBDSVBIRVJfREVDUllQVAkJMAorCit0eXBlZGVmIHN0cnVjdCBDaXBoZXIgQ2lwaGVyOwordHlwZWRlZiBzdHJ1Y3QgQ2lwaGVyQ29udGV4dCBDaXBoZXJDb250ZXh0OworCitzdHJ1Y3QgQ2lwaGVyOworc3RydWN0IENpcGhlckNvbnRleHQgeworCWludAlwbGFpbnRleHQ7CisJRVZQX0NJUEhFUl9DVFggZXZwOworCUNpcGhlciAqY2lwaGVyOworfTsKKwordV9pbnQJIGNpcGhlcl9tYXNrX3NzaDEoaW50KTsKK0NpcGhlcgkqY2lwaGVyX2J5X25hbWUoY29uc3QgY2hhciAqKTsKK0NpcGhlcgkqY2lwaGVyX2J5X251bWJlcihpbnQpOworaW50CSBjaXBoZXJfbnVtYmVyKGNvbnN0IGNoYXIgKik7CitjaGFyCSpjaXBoZXJfbmFtZShpbnQpOworaW50CSBjaXBoZXJzX3ZhbGlkKGNvbnN0IGNoYXIgKik7Cit2b2lkCSBjaXBoZXJfaW5pdChDaXBoZXJDb250ZXh0ICosIENpcGhlciAqLCBjb25zdCB1X2NoYXIgKiwgdV9pbnQsCisgICAgY29uc3QgdV9jaGFyICosIHVfaW50LCBpbnQpOwordm9pZAkgY2lwaGVyX2NyeXB0KENpcGhlckNvbnRleHQgKiwgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Cit2b2lkCSBjaXBoZXJfY2xlYW51cChDaXBoZXJDb250ZXh0ICopOwordm9pZAkgY2lwaGVyX3NldF9rZXlfc3RyaW5nKENpcGhlckNvbnRleHQgKiwgQ2lwaGVyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKK3VfaW50CSBjaXBoZXJfYmxvY2tzaXplKGNvbnN0IENpcGhlciAqKTsKK3VfaW50CSBjaXBoZXJfa2V5bGVuKGNvbnN0IENpcGhlciAqKTsKK3VfaW50CSBjaXBoZXJfaXNfY2JjKGNvbnN0IENpcGhlciAqKTsKKwordV9pbnQJIGNpcGhlcl9nZXRfbnVtYmVyKGNvbnN0IENpcGhlciAqKTsKK3ZvaWQJIGNpcGhlcl9nZXRfa2V5aXYoQ2lwaGVyQ29udGV4dCAqLCB1X2NoYXIgKiwgdV9pbnQpOwordm9pZAkgY2lwaGVyX3NldF9rZXlpdihDaXBoZXJDb250ZXh0ICosIHVfY2hhciAqKTsKK2ludAkgY2lwaGVyX2dldF9rZXlpdl9sZW4oY29uc3QgQ2lwaGVyQ29udGV4dCAqKTsKK2ludAkgY2lwaGVyX2dldF9rZXljb250ZXh0KGNvbnN0IENpcGhlckNvbnRleHQgKiwgdV9jaGFyICopOwordm9pZAkgY2lwaGVyX3NldF9rZXljb250ZXh0KENpcGhlckNvbnRleHQgKiwgdV9jaGFyICopOworI2VuZGlmCQkJCS8qIENJUEhFUl9IICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2NsZWFudXAuYyBiL29wZW5zc2gtNi4wcDEvY2xlYW51cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOGY5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NsZWFudXAuYwpAQCAtMCwwICsxLDMyIEBACisvKiAkT3BlbkJTRDogY2xlYW51cC5jLHYgMS41IDIwMDYvMDgvMDMgMDM6MzQ6NDIgZGVyYWFkdCBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNYXJrdXMgRnJpZWRsIDxtYXJrdXNAb3BlbmJzZC5vcmc+CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSAibG9nLmgiCisKKy8qIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gKi8KK3ZvaWQKK2NsZWFudXBfZXhpdChpbnQgaSkKK3sKKwlfZXhpdChpKTsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvY2xpZW50bG9vcC5jIGIvb3BlbnNzaC02LjBwMS9jbGllbnRsb29wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY5YTliMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY2xpZW50bG9vcC5jCkBAIC0wLDAgKzEsMjIwNyBAQAorLyogJE9wZW5CU0Q6IGNsaWVudGxvb3AuYyx2IDEuMjM4IDIwMTIvMDEvMTggMjE6NDY6NDMgZHR1Y2tlciBFeHAgJCAqLworLyoKKyAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAorICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIFRoZSBtYWluIGxvb3AgZm9yIHRoZSBpbnRlcmFjdGl2ZSBzZXNzaW9uIChjbGllbnQgc2lkZSkuCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZW8gZGUgUmFhZHQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKgorICogU1NIMiBzdXBwb3J0IGFkZGVkIGJ5IE1hcmt1cyBGcmllZGwuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMDAsIDIwMDEgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19USU1FX0gKKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpZmRlZiBIQVZFX1BBVEhTX0gKKyNpbmNsdWRlIDxwYXRocy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9zeXMtcXVldWUuaCIKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAic3NoLmgiCisjaW5jbHVkZSAic3NoMS5oIgorI2luY2x1ZGUgInNzaDIuaCIKKyNpbmNsdWRlICJwYWNrZXQuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJjb21wYXQuaCIKKyNpbmNsdWRlICJjaGFubmVscy5oIgorI2luY2x1ZGUgImRpc3BhdGNoLmgiCisjaW5jbHVkZSAia2V5LmgiCisjaW5jbHVkZSAiY2lwaGVyLmgiCisjaW5jbHVkZSAia2V4LmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAicmVhZGNvbmYuaCIKKyNpbmNsdWRlICJjbGllbnRsb29wLmgiCisjaW5jbHVkZSAic3NoY29ubmVjdC5oIgorI2luY2x1ZGUgImF1dGhmZC5oIgorI2luY2x1ZGUgImF0b21pY2lvLmgiCisjaW5jbHVkZSAic3NocHR5LmgiCisjaW5jbHVkZSAibWlzYy5oIgorI2luY2x1ZGUgIm1hdGNoLmgiCisjaW5jbHVkZSAibXNnLmgiCisjaW5jbHVkZSAicm9hbWluZy5oIgorCisvKiBpbXBvcnQgb3B0aW9ucyAqLworZXh0ZXJuIE9wdGlvbnMgb3B0aW9uczsKKworLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgc3RkaW4gc2hvdWxkIGJlIHJlZGlyZWN0ZWQgZnJvbSAvZGV2L251bGwuICovCitleHRlcm4gaW50IHN0ZGluX251bGxfZmxhZzsKKworLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgbm8gc2hlbGwgaGFzIGJlZW4gcmVxdWVzdGVkICovCitleHRlcm4gaW50IG5vX3NoZWxsX2ZsYWc7CisKKy8qIENvbnRyb2wgc29ja2V0ICovCitleHRlcm4gaW50IG11eHNlcnZlcl9zb2NrOyAvKiBYWFggdXNlIG11eF9jbGllbnRfY2xlYW51cCgpIGluc3RlYWQgKi8KKworLyoKKyAqIE5hbWUgb2YgdGhlIGhvc3Qgd2UgYXJlIGNvbm5lY3RpbmcgdG8uICBUaGlzIGlzIHRoZSBuYW1lIGdpdmVuIG9uIHRoZQorICogY29tbWFuZCBsaW5lLCBvciB0aGUgSG9zdE5hbWUgc3BlY2lmaWVkIGZvciB0aGUgdXNlci1zdXBwbGllZCBuYW1lIGluIGEKKyAqIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAqLworZXh0ZXJuIGNoYXIgKmhvc3Q7CisKKy8qCisgKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgd2UgaGF2ZSByZWNlaXZlZCBhIHdpbmRvdyBjaGFuZ2Ugc2lnbmFsIHdoaWNoIGhhcworICogbm90IHlldCBiZWVuIHByb2Nlc3NlZC4gIFRoaXMgd2lsbCBjYXVzZSBhIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGUgbmV3CisgKiB3aW5kb3cgc2l6ZSB0byBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIgYSBsaXR0bGUgbGF0ZXIuICBUaGlzIGlzIHZvbGF0aWxlCisgKiBiZWNhdXNlIHRoaXMgaXMgdXBkYXRlZCBpbiBhIHNpZ25hbCBoYW5kbGVyLgorICovCitzdGF0aWMgdm9sYXRpbGUgc2lnX2F0b21pY190IHJlY2VpdmVkX3dpbmRvd19jaGFuZ2Vfc2lnbmFsID0gMDsKK3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3QgcmVjZWl2ZWRfc2lnbmFsID0gMDsKKworLyogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHVzZXIncyB0ZXJtaW5hbCBpcyBpbiBub24tYmxvY2tpbmcgbW9kZS4gKi8KK3N0YXRpYyBpbnQgaW5fbm9uX2Jsb2NraW5nX21vZGUgPSAwOworCisvKiBUaW1lIHdoZW4gYmFja2dyb3VuZGVkIGNvbnRyb2wgbWFzdGVyIHVzaW5nIENvbnRyb2xQZXJzaXN0IHNob3VsZCBleGl0ICovCitzdGF0aWMgdGltZV90IGNvbnRyb2xfcGVyc2lzdF9leGl0X3RpbWUgPSAwOworCisvKiBDb21tb24gZGF0YSBmb3IgdGhlIGNsaWVudCBsb29wIGNvZGUuICovCit2b2xhdGlsZSBzaWdfYXRvbWljX3QgcXVpdF9wZW5kaW5nOyAvKiBTZXQgbm9uLXplcm8gdG8gcXVpdCB0aGUgbG9vcC4gKi8KK3N0YXRpYyBpbnQgZXNjYXBlX2NoYXIxOwkvKiBFc2NhcGUgY2hhcmFjdGVyLiAocHJvdG8xIG9ubHkpICovCitzdGF0aWMgaW50IGVzY2FwZV9wZW5kaW5nMTsJLyogTGFzdCBjaGFyYWN0ZXIgd2FzIGFuIGVzY2FwZSAocHJvdG8xIG9ubHkpICovCitzdGF0aWMgaW50IGxhc3Rfd2FzX2NyOwkJLyogTGFzdCBjaGFyYWN0ZXIgd2FzIGEgbmV3bGluZS4gKi8KK3N0YXRpYyBpbnQgZXhpdF9zdGF0dXM7CQkvKiBVc2VkIHRvIHN0b3JlIHRoZSBjb21tYW5kIGV4aXQgc3RhdHVzLiAqLworc3RhdGljIGludCBzdGRpbl9lb2Y7CQkvKiBFT0YgaGFzIGJlZW4gZW5jb3VudGVyZWQgb24gc3RkZXJyLiAqLworc3RhdGljIEJ1ZmZlciBzdGRpbl9idWZmZXI7CS8qIEJ1ZmZlciBmb3Igc3RkaW4gZGF0YS4gKi8KK3N0YXRpYyBCdWZmZXIgc3Rkb3V0X2J1ZmZlcjsJLyogQnVmZmVyIGZvciBzdGRvdXQgZGF0YS4gKi8KK3N0YXRpYyBCdWZmZXIgc3RkZXJyX2J1ZmZlcjsJLyogQnVmZmVyIGZvciBzdGRlcnIgZGF0YS4gKi8KK3N0YXRpYyB1X2ludCBidWZmZXJfaGlnaDsJLyogU29mdCBtYXggYnVmZmVyIHNpemUuICovCitzdGF0aWMgaW50IGNvbm5lY3Rpb25faW47CS8qIENvbm5lY3Rpb24gdG8gc2VydmVyIChpbnB1dCkuICovCitzdGF0aWMgaW50IGNvbm5lY3Rpb25fb3V0OwkvKiBDb25uZWN0aW9uIHRvIHNlcnZlciAob3V0cHV0KS4gKi8KK3N0YXRpYyBpbnQgbmVlZF9yZWtleWluZzsJLyogU2V0IHRvIG5vbi16ZXJvIGlmIHJla2V5aW5nIGlzIHJlcXVlc3RlZC4gKi8KK3N0YXRpYyBpbnQgc2Vzc2lvbl9jbG9zZWQ7CS8qIEluIFNTSDI6IGxvZ2luIHNlc3Npb24gY2xvc2VkLiAqLworc3RhdGljIGludCB4MTFfcmVmdXNlX3RpbWU7CS8qIElmID4wLCByZWZ1c2UgeDExIG9wZW5zIGFmdGVyIHRoaXMgdGltZS4gKi8KKworc3RhdGljIHZvaWQgY2xpZW50X2luaXRfZGlzcGF0Y2godm9pZCk7CitpbnQJc2Vzc2lvbl9pZGVudCA9IC0xOworCitpbnQJc2Vzc2lvbl9yZXN1bWVkID0gMDsKKworLyogVHJhY2sgZXNjYXBlIHBlciBwcm90bzIgY2hhbm5lbCAqLworc3RydWN0IGVzY2FwZV9maWx0ZXJfY3R4IHsKKwlpbnQgZXNjYXBlX3BlbmRpbmc7CisJaW50IGVzY2FwZV9jaGFyOworfTsKKworLyogQ29udGV4dCBmb3IgY2hhbm5lbCBjb25maXJtYXRpb24gcmVwbGllcyAqLworc3RydWN0IGNoYW5uZWxfcmVwbHlfY3R4IHsKKwljb25zdCBjaGFyICpyZXF1ZXN0X3R5cGU7CisJaW50IGlkOworCWVudW0gY29uZmlybV9hY3Rpb24gYWN0aW9uOworfTsKKworLyogR2xvYmFsIHJlcXVlc3Qgc3VjY2Vzcy9mYWlsdXJlIGNhbGxiYWNrcyAqLworc3RydWN0IGdsb2JhbF9jb25maXJtIHsKKwlUQUlMUV9FTlRSWShnbG9iYWxfY29uZmlybSkgZW50cnk7CisJZ2xvYmFsX2NvbmZpcm1fY2IgKmNiOworCXZvaWQgKmN0eDsKKwlpbnQgcmVmX2NvdW50OworfTsKK1RBSUxRX0hFQUQoZ2xvYmFsX2NvbmZpcm1zLCBnbG9iYWxfY29uZmlybSk7CitzdGF0aWMgc3RydWN0IGdsb2JhbF9jb25maXJtcyBnbG9iYWxfY29uZmlybXMgPQorICAgIFRBSUxRX0hFQURfSU5JVElBTElaRVIoZ2xvYmFsX2NvbmZpcm1zKTsKKworLypYWFgqLworZXh0ZXJuIEtleCAqeHh4X2tleDsKKwordm9pZCBzc2hfcHJvY2Vzc19zZXNzaW9uMl9zZXR1cChpbnQsIGludCwgaW50LCBCdWZmZXIgKik7CisKKy8qIFJlc3RvcmVzIHN0ZGluIHRvIGJsb2NraW5nIG1vZGUuICovCisKK3N0YXRpYyB2b2lkCitsZWF2ZV9ub25fYmxvY2tpbmcodm9pZCkKK3sKKwlpZiAoaW5fbm9uX2Jsb2NraW5nX21vZGUpIHsKKwkJdW5zZXRfbm9uYmxvY2soZmlsZW5vKHN0ZGluKSk7CisJCWluX25vbl9ibG9ja2luZ19tb2RlID0gMDsKKwl9Cit9CisKKy8qIFB1dHMgc3RkaW4gdGVybWluYWwgaW4gbm9uLWJsb2NraW5nIG1vZGUuICovCisKK3N0YXRpYyB2b2lkCitlbnRlcl9ub25fYmxvY2tpbmcodm9pZCkKK3sKKwlpbl9ub25fYmxvY2tpbmdfbW9kZSA9IDE7CisJc2V0X25vbmJsb2NrKGZpbGVubyhzdGRpbikpOworfQorCisvKgorICogU2lnbmFsIGhhbmRsZXIgZm9yIHRoZSB3aW5kb3cgY2hhbmdlIHNpZ25hbCAoU0lHV0lOQ0gpLiAgVGhpcyBqdXN0IHNldHMgYQorICogZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIHdpbmRvdyBoYXMgY2hhbmdlZC4KKyAqLworLypBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK3dpbmRvd19jaGFuZ2VfaGFuZGxlcihpbnQgc2lnKQoreworCXJlY2VpdmVkX3dpbmRvd19jaGFuZ2Vfc2lnbmFsID0gMTsKKwlzaWduYWwoU0lHV0lOQ0gsIHdpbmRvd19jaGFuZ2VfaGFuZGxlcik7Cit9CisKKy8qCisgKiBTaWduYWwgaGFuZGxlciBmb3Igc2lnbmFscyB0aGF0IGNhdXNlIHRoZSBwcm9ncmFtIHRvIHRlcm1pbmF0ZS4gIFRoZXNlCisgKiBzaWduYWxzIG11c3QgYmUgdHJhcHBlZCB0byByZXN0b3JlIHRlcm1pbmFsIG1vZGVzLgorICovCisvKkFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorc2lnbmFsX2hhbmRsZXIoaW50IHNpZykKK3sKKwlyZWNlaXZlZF9zaWduYWwgPSBzaWc7CisJcXVpdF9wZW5kaW5nID0gMTsKK30KKworLyoKKyAqIFJldHVybnMgY3VycmVudCB0aW1lIGluIHNlY29uZHMgZnJvbSBKYW4gMSwgMTk3MCB3aXRoIHRoZSBtYXhpbXVtCisgKiBhdmFpbGFibGUgcmVzb2x1dGlvbi4KKyAqLworCitzdGF0aWMgZG91YmxlCitnZXRfY3VycmVudF90aW1lKHZvaWQpCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJcmV0dXJuIChkb3VibGUpIHR2LnR2X3NlYyArIChkb3VibGUpIHR2LnR2X3VzZWMgLyAxMDAwMDAwLjA7Cit9CisKKy8qCisgKiBTZXRzIGNvbnRyb2xfcGVyc2lzdF9leGl0X3RpbWUgdG8gdGhlIGFic29sdXRlIHRpbWUgd2hlbiB0aGUKKyAqIGJhY2tncm91bmRlZCBjb250cm9sIG1hc3RlciBzaG91bGQgZXhpdCBkdWUgdG8gZXhwaXJ5IG9mIHRoZQorICogQ29udHJvbFBlcnNpc3QgdGltZW91dC4gIFNldHMgaXQgdG8gMCBpZiB3ZSBhcmUgbm90IGEgYmFja2dyb3VuZGVkCisgKiBjb250cm9sIG1hc3RlciBwcm9jZXNzLCBvciBpZiB0aGVyZSBpcyBubyBDb250cm9sUGVyc2lzdCB0aW1lb3V0LgorICovCitzdGF0aWMgdm9pZAorc2V0X2NvbnRyb2xfcGVyc2lzdF9leGl0X3RpbWUodm9pZCkKK3sKKwlpZiAobXV4c2VydmVyX3NvY2sgPT0gLTEgfHwgIW9wdGlvbnMuY29udHJvbF9wZXJzaXN0CisJICAgIHx8IG9wdGlvbnMuY29udHJvbF9wZXJzaXN0X3RpbWVvdXQgPT0gMCkgeworCQkvKiBub3QgdXNpbmcgYSBDb250cm9sUGVyc2lzdCB0aW1lb3V0ICovCisJCWNvbnRyb2xfcGVyc2lzdF9leGl0X3RpbWUgPSAwOworCX0gZWxzZSBpZiAoY2hhbm5lbF9zdGlsbF9vcGVuKCkpIHsKKwkJLyogc29tZSBjbGllbnQgY29ubmVjdGlvbnMgYXJlIHN0aWxsIG9wZW4gKi8KKwkJaWYgKGNvbnRyb2xfcGVyc2lzdF9leGl0X3RpbWUgPiAwKQorCQkJZGVidWcyKCIlczogY2FuY2VsIHNjaGVkdWxlZCBleGl0IiwgX19mdW5jX18pOworCQljb250cm9sX3BlcnNpc3RfZXhpdF90aW1lID0gMDsKKwl9IGVsc2UgaWYgKGNvbnRyb2xfcGVyc2lzdF9leGl0X3RpbWUgPD0gMCkgeworCQkvKiBhIGNsaWVudCBjb25uZWN0aW9uIGhhcyByZWNlbnRseSBjbG9zZWQgKi8KKwkJY29udHJvbF9wZXJzaXN0X2V4aXRfdGltZSA9IHRpbWUoTlVMTCkgKworCQkJKHRpbWVfdClvcHRpb25zLmNvbnRyb2xfcGVyc2lzdF90aW1lb3V0OworCQlkZWJ1ZzIoIiVzOiBzY2hlZHVsZSBleGl0IGluICVkIHNlY29uZHMiLCBfX2Z1bmNfXywKKwkJICAgIG9wdGlvbnMuY29udHJvbF9wZXJzaXN0X3RpbWVvdXQpOworCX0KKwkvKiBlbHNlIHdlIGFyZSBhbHJlYWR5IGNvdW50aW5nIGRvd24gdG8gdGhlIHRpbWVvdXQgKi8KK30KKworI2RlZmluZSBTU0hfWDExX1ZBTElEX0RJU1BMQVlfQ0hBUlMgIjovLi1fIgorc3RhdGljIGludAorY2xpZW50X3gxMV9kaXNwbGF5X3ZhbGlkKGNvbnN0IGNoYXIgKmRpc3BsYXkpCit7CisJc2l6ZV90IGksIGRsZW47CisKKwlkbGVuID0gc3RybGVuKGRpc3BsYXkpOworCWZvciAoaSA9IDA7IGkgPCBkbGVuOyBpKyspIHsKKwkJaWYgKCFpc2FsbnVtKGRpc3BsYXlbaV0pICYmCisJCSAgICBzdHJjaHIoU1NIX1gxMV9WQUxJRF9ESVNQTEFZX0NIQVJTLCBkaXNwbGF5W2ldKSA9PSBOVUxMKSB7CisJCQlkZWJ1ZygiSW52YWxpZCBjaGFyYWN0ZXIgJyVjJyBpbiBESVNQTEFZIiwgZGlzcGxheVtpXSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworI2RlZmluZSBTU0hfWDExX1BST1RPICJNSVQtTUFHSUMtQ09PS0lFLTEiCit2b2lkCitjbGllbnRfeDExX2dldF9wcm90byhjb25zdCBjaGFyICpkaXNwbGF5LCBjb25zdCBjaGFyICp4YXV0aF9wYXRoLAorICAgIHVfaW50IHRydXN0ZWQsIHVfaW50IHRpbWVvdXQsIGNoYXIgKipfcHJvdG8sIGNoYXIgKipfZGF0YSkKK3sKKwljaGFyIGNtZFsxMDI0XTsKKwljaGFyIGxpbmVbNTEyXTsKKwljaGFyIHhkaXNwbGF5WzUxMl07CisJc3RhdGljIGNoYXIgcHJvdG9bNTEyXSwgZGF0YVs1MTJdOworCUZJTEUgKmY7CisJaW50IGdvdF9kYXRhID0gMCwgZ2VuZXJhdGVkID0gMCwgZG9fdW5saW5rID0gMCwgaTsKKwljaGFyICp4YXV0aGRpciwgKnhhdXRoZmlsZTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwl1X2ludCBub3c7CisKKwl4YXV0aGRpciA9IHhhdXRoZmlsZSA9IE5VTEw7CisJKl9wcm90byA9IHByb3RvOworCSpfZGF0YSA9IGRhdGE7CisJcHJvdG9bMF0gPSBkYXRhWzBdID0gJ1wwJzsKKworCWlmICh4YXV0aF9wYXRoID09IE5VTEwgfHwoc3RhdCh4YXV0aF9wYXRoLCAmc3QpID09IC0xKSkgeworCQlkZWJ1ZygiTm8geGF1dGggcHJvZ3JhbS4iKTsKKwl9IGVsc2UgaWYgKCFjbGllbnRfeDExX2Rpc3BsYXlfdmFsaWQoZGlzcGxheSkpIHsKKwkJbG9naXQoIkRJU1BMQVkgJyVzJyBpbnZhbGlkLCBmYWxsaW5nIGJhY2sgdG8gZmFrZSB4YXV0aCBkYXRhIiwKKwkJICAgIGRpc3BsYXkpOworCX0gZWxzZSB7CisJCWlmIChkaXNwbGF5ID09IE5VTEwpIHsKKwkJCWRlYnVnKCJ4MTFfZ2V0X3Byb3RvOiBESVNQTEFZIG5vdCBzZXQiKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKgorCQkgKiBIYW5kbGUgRmFtaWx5TG9jYWwgY2FzZSB3aGVyZSAkRElTUExBWSBkb2VzCisJCSAqIG5vdCBtYXRjaCBhbiBhdXRob3JpemF0aW9uIGVudHJ5LiAgRm9yIHRoaXMgd2UKKwkJICoganVzdCB0cnkgInhhdXRoIGxpc3QgdW5peDpkaXNwbGF5bnVtLnNjcmVlbm51bSIuCisJCSAqIFhYWDogImxvY2FsaG9zdCIgbWF0Y2ggdG8gZGV0ZXJtaW5lIEZhbWlseUxvY2FsCisJCSAqICAgICAgaXMgbm90IHBlcmZlY3QuCisJCSAqLworCQlpZiAoc3RybmNtcChkaXNwbGF5LCAibG9jYWxob3N0OiIsIDEwKSA9PSAwKSB7CisJCQlzbnByaW50Zih4ZGlzcGxheSwgc2l6ZW9mKHhkaXNwbGF5KSwgInVuaXg6JXMiLAorCQkJICAgIGRpc3BsYXkgKyAxMCk7CisJCQlkaXNwbGF5ID0geGRpc3BsYXk7CisJCX0KKwkJaWYgKHRydXN0ZWQgPT0gMCkgeworCQkJeGF1dGhkaXIgPSB4bWFsbG9jKE1BWFBBVEhMRU4pOworCQkJeGF1dGhmaWxlID0geG1hbGxvYyhNQVhQQVRITEVOKTsKKwkJCW1rdGVtcF9wcm90byh4YXV0aGRpciwgTUFYUEFUSExFTik7CisJCQlpZiAobWtkdGVtcCh4YXV0aGRpcikgIT0gTlVMTCkgeworCQkJCWRvX3VubGluayA9IDE7CisJCQkJc25wcmludGYoeGF1dGhmaWxlLCBNQVhQQVRITEVOLCAiJXMveGF1dGhmaWxlIiwKKwkJCQkgICAgeGF1dGhkaXIpOworCQkJCXNucHJpbnRmKGNtZCwgc2l6ZW9mKGNtZCksCisJCQkJICAgICIlcyAtZiAlcyBnZW5lcmF0ZSAlcyAiIFNTSF9YMTFfUFJPVE8KKwkJCQkgICAgIiB1bnRydXN0ZWQgdGltZW91dCAldSAyPiIgX1BBVEhfREVWTlVMTCwKKwkJCQkgICAgeGF1dGhfcGF0aCwgeGF1dGhmaWxlLCBkaXNwbGF5LCB0aW1lb3V0KTsKKwkJCQlkZWJ1ZzIoIngxMV9nZXRfcHJvdG86ICVzIiwgY21kKTsKKwkJCQlpZiAoc3lzdGVtKGNtZCkgPT0gMCkKKwkJCQkJZ2VuZXJhdGVkID0gMTsKKwkJCQlpZiAoeDExX3JlZnVzZV90aW1lID09IDApIHsKKwkJCQkJbm93ID0gdGltZShOVUxMKSArIDE7CisJCQkJCWlmIChVSU5UX01BWCAtIHRpbWVvdXQgPCBub3cpCisJCQkJCQl4MTFfcmVmdXNlX3RpbWUgPSBVSU5UX01BWDsKKwkJCQkJZWxzZQorCQkJCQkJeDExX3JlZnVzZV90aW1lID0gbm93ICsgdGltZW91dDsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBXaGVuIGluIHVudHJ1c3RlZCBtb2RlLCB3ZSByZWFkIHRoZSBjb29raWUgb25seSBpZiBpdCB3YXMKKwkJICogc3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZCBhcyBhbiB1bnRydXN0ZWQgb25lIGluIHRoZSBzdGVwCisJCSAqIGFib3ZlLgorCQkgKi8KKwkJaWYgKHRydXN0ZWQgfHwgZ2VuZXJhdGVkKSB7CisJCQlzbnByaW50ZihjbWQsIHNpemVvZihjbWQpLAorCQkJICAgICIlcyAlcyVzIGxpc3QgJXMgMj4iIF9QQVRIX0RFVk5VTEwsCisJCQkgICAgeGF1dGhfcGF0aCwKKwkJCSAgICBnZW5lcmF0ZWQgPyAiLWYgIiA6ICIiICwKKwkJCSAgICBnZW5lcmF0ZWQgPyB4YXV0aGZpbGUgOiAiIiwKKwkJCSAgICBkaXNwbGF5KTsKKwkJCWRlYnVnMigieDExX2dldF9wcm90bzogJXMiLCBjbWQpOworCQkJZiA9IHBvcGVuKGNtZCwgInIiKTsKKwkJCWlmIChmICYmIGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikgJiYKKwkJCSAgICBzc2NhbmYobGluZSwgIiUqcyAlNTExcyAlNTExcyIsIHByb3RvLCBkYXRhKSA9PSAyKQorCQkJCWdvdF9kYXRhID0gMTsKKwkJCWlmIChmKQorCQkJCXBjbG9zZShmKTsKKwkJfSBlbHNlCisJCQllcnJvcigiV2FybmluZzogdW50cnVzdGVkIFgxMSBmb3J3YXJkaW5nIHNldHVwIGZhaWxlZDogIgorCQkJICAgICJ4YXV0aCBrZXkgZGF0YSBub3QgZ2VuZXJhdGVkIik7CisJfQorCisJaWYgKGRvX3VubGluaykgeworCQl1bmxpbmsoeGF1dGhmaWxlKTsKKwkJcm1kaXIoeGF1dGhkaXIpOworCX0KKwlpZiAoeGF1dGhkaXIpCisJCXhmcmVlKHhhdXRoZGlyKTsKKwlpZiAoeGF1dGhmaWxlKQorCQl4ZnJlZSh4YXV0aGZpbGUpOworCisJLyoKKwkgKiBJZiB3ZSBkaWRuJ3QgZ2V0IGF1dGhlbnRpY2F0aW9uIGRhdGEsIGp1c3QgbWFrZSB1cCBzb21lCisJICogZGF0YS4gIFRoZSBmb3J3YXJkaW5nIGNvZGUgd2lsbCBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlCisJICogcmVzcG9uc2UgYW55d2F5LCBhbmQgc3Vic3RpdHV0ZSB0aGlzIGRhdGEuICBUaGUgWDExCisJICogc2VydmVyLCBob3dldmVyLCB3aWxsIGlnbm9yZSB0aGlzIGZha2UgZGF0YSBhbmQgdXNlCisJICogd2hhdGV2ZXIgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyBpdCB3YXMgdXNpbmcgb3RoZXJ3aXNlCisJICogZm9yIHRoZSBsb2NhbCBjb25uZWN0aW9uLgorCSAqLworCWlmICghZ290X2RhdGEpIHsKKwkJdV9pbnQzMl90IHJuZCA9IDA7CisKKwkJbG9naXQoIldhcm5pbmc6IE5vIHhhdXRoIGRhdGE7ICIKKwkJICAgICJ1c2luZyBmYWtlIGF1dGhlbnRpY2F0aW9uIGRhdGEgZm9yIFgxMSBmb3J3YXJkaW5nLiIpOworCQlzdHJsY3B5KHByb3RvLCBTU0hfWDExX1BST1RPLCBzaXplb2YgcHJvdG8pOworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJaWYgKGkgJSA0ID09IDApCisJCQkJcm5kID0gYXJjNHJhbmRvbSgpOworCQkJc25wcmludGYoZGF0YSArIDIgKiBpLCBzaXplb2YgZGF0YSAtIDIgKiBpLCAiJTAyeCIsCisJCQkgICAgcm5kICYgMHhmZik7CisJCQlybmQgPj49IDg7CisJCX0KKwl9Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBpbnRlcmFjdGl2ZSBpcyBlbnRlcmVkLiAgVGhpcyBjaGVja3MgaWYgdGhlcmUgaXMKKyAqIGFuIEVPRiBjb21pbmcgb24gc3RkaW4uICBXZSBtdXN0IGNoZWNrIHRoaXMgZXhwbGljaXRseSwgYXMgc2VsZWN0KCkgZG9lcworICogbm90IGFwcGVhciB0byB3YWtlIHVwIHdoZW4gcmVkaXJlY3RpbmcgZnJvbSAvZGV2L251bGwuCisgKi8KKworc3RhdGljIHZvaWQKK2NsaWVudF9jaGVja19pbml0aWFsX2VvZl9vbl9zdGRpbih2b2lkKQoreworCWludCBsZW47CisJY2hhciBidWZbMV07CisKKwkvKgorCSAqIElmIHN0YW5kYXJkIGlucHV0IGlzIHRvIGJlICJyZWRpcmVjdGVkIGZyb20gL2Rldi9udWxsIiwgd2Ugc2ltcGx5CisJICogbWFyayB0aGF0IHdlIGhhdmUgc2VlbiBhbiBFT0YgYW5kIHNlbmQgYW4gRU9GIG1lc3NhZ2UgdG8gdGhlCisJICogc2VydmVyLiBPdGhlcndpc2UsIHdlIHRyeSB0byByZWFkIGEgc2luZ2xlIGNoYXJhY3RlcjsgaXQgYXBwZWFycworCSAqIHRoYXQgZm9yIHNvbWUgZmlsZXMsIHN1Y2ggL2Rldi9udWxsLCBzZWxlY3QoKSBuZXZlciB3YWtlcyB1cCBmb3IKKwkgKiByZWFkIGZvciB0aGlzIGRlc2NyaXB0b3IsIHdoaWNoIG1lYW5zIHRoYXQgd2UgbmV2ZXIgZ2V0IEVPRi4gIFRoaXMKKwkgKiB3YXkgd2Ugd2lsbCBnZXQgdGhlIEVPRiBpZiBzdGRpbiBjb21lcyBmcm9tIC9kZXYvbnVsbCBvciBzaW1pbGFyLgorCSAqLworCWlmIChzdGRpbl9udWxsX2ZsYWcpIHsKKwkJLyogRmFrZSBFT0Ygb24gc3RkaW4uICovCisJCWRlYnVnKCJTZW5kaW5nIGVvZi4iKTsKKwkJc3RkaW5fZW9mID0gMTsKKwkJcGFja2V0X3N0YXJ0KFNTSF9DTVNHX0VPRik7CisJCXBhY2tldF9zZW5kKCk7CisJfSBlbHNlIHsKKwkJZW50ZXJfbm9uX2Jsb2NraW5nKCk7CisKKwkJLyogQ2hlY2sgZm9yIGltbWVkaWF0ZSBFT0Ygb24gc3RkaW4uICovCisJCWxlbiA9IHJlYWQoZmlsZW5vKHN0ZGluKSwgYnVmLCAxKTsKKwkJaWYgKGxlbiA9PSAwKSB7CisJCQkvKgorCQkJICogRU9GLiAgUmVjb3JkIHRoYXQgd2UgaGF2ZSBzZWVuIGl0IGFuZCBzZW5kCisJCQkgKiBFT0YgdG8gc2VydmVyLgorCQkJICovCisJCQlkZWJ1ZygiU2VuZGluZyBlb2YuIik7CisJCQlzdGRpbl9lb2YgPSAxOworCQkJcGFja2V0X3N0YXJ0KFNTSF9DTVNHX0VPRik7CisJCQlwYWNrZXRfc2VuZCgpOworCQl9IGVsc2UgaWYgKGxlbiA+IDApIHsKKwkJCS8qCisJCQkgKiBHb3QgZGF0YS4gIFdlIG11c3Qgc3RvcmUgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlciwKKwkJCSAqIGFuZCBhbHNvIHByb2Nlc3MgaXQgYXMgYW4gZXNjYXBlIGNoYXJhY3RlciBpZgorCQkJICogYXBwcm9wcmlhdGUuCisJCQkgKi8KKwkJCWlmICgodV9jaGFyKSBidWZbMF0gPT0gZXNjYXBlX2NoYXIxKQorCQkJCWVzY2FwZV9wZW5kaW5nMSA9IDE7CisJCQllbHNlCisJCQkJYnVmZmVyX2FwcGVuZCgmc3RkaW5fYnVmZmVyLCBidWYsIDEpOworCQl9CisJCWxlYXZlX25vbl9ibG9ja2luZygpOworCX0KK30KKworCisvKgorICogTWFrZSBwYWNrZXRzIGZyb20gYnVmZmVyZWQgc3RkaW4gZGF0YSwgYW5kIGJ1ZmZlciB0aGVtIGZvciBzZW5kaW5nIHRvIHRoZQorICogY29ubmVjdGlvbi4KKyAqLworCitzdGF0aWMgdm9pZAorY2xpZW50X21ha2VfcGFja2V0c19mcm9tX3N0ZGluX2RhdGEodm9pZCkKK3sKKwl1X2ludCBsZW47CisKKwkvKiBTZW5kIGJ1ZmZlcmVkIHN0ZGluIGRhdGEgdG8gdGhlIHNlcnZlci4gKi8KKwl3aGlsZSAoYnVmZmVyX2xlbigmc3RkaW5fYnVmZmVyKSA+IDAgJiYKKwkgICAgcGFja2V0X25vdF92ZXJ5X211Y2hfZGF0YV90b193cml0ZSgpKSB7CisJCWxlbiA9IGJ1ZmZlcl9sZW4oJnN0ZGluX2J1ZmZlcik7CisJCS8qIEtlZXAgdGhlIHBhY2tldHMgYXQgcmVhc29uYWJsZSBzaXplLiAqLworCQlpZiAobGVuID4gcGFja2V0X2dldF9tYXhzaXplKCkpCisJCQlsZW4gPSBwYWNrZXRfZ2V0X21heHNpemUoKTsKKwkJcGFja2V0X3N0YXJ0KFNTSF9DTVNHX1NURElOX0RBVEEpOworCQlwYWNrZXRfcHV0X3N0cmluZyhidWZmZXJfcHRyKCZzdGRpbl9idWZmZXIpLCBsZW4pOworCQlwYWNrZXRfc2VuZCgpOworCQlidWZmZXJfY29uc3VtZSgmc3RkaW5fYnVmZmVyLCBsZW4pOworCQkvKiBJZiB3ZSBoYXZlIGEgcGVuZGluZyBFT0YsIHNlbmQgaXQgbm93LiAqLworCQlpZiAoc3RkaW5fZW9mICYmIGJ1ZmZlcl9sZW4oJnN0ZGluX2J1ZmZlcikgPT0gMCkgeworCQkJcGFja2V0X3N0YXJ0KFNTSF9DTVNHX0VPRik7CisJCQlwYWNrZXRfc2VuZCgpOworCQl9CisJfQorfQorCisvKgorICogQ2hlY2tzIGlmIHRoZSBjbGllbnQgd2luZG93IGhhcyBjaGFuZ2VkLCBhbmQgc2VuZHMgYSBwYWNrZXQgYWJvdXQgaXQgdG8KKyAqIHRoZSBzZXJ2ZXIgaWYgc28uICBUaGUgYWN0dWFsIGNoYW5nZSBpcyBkZXRlY3RlZCBlbHNld2hlcmUgKGJ5IGEgc29mdHdhcmUKKyAqIGludGVycnVwdCBvbiBVbml4KTsgdGhpcyBqdXN0IGNoZWNrcyB0aGUgZmxhZyBhbmQgc2VuZHMgYSBtZXNzYWdlIGlmCisgKiBhcHByb3ByaWF0ZS4KKyAqLworCitzdGF0aWMgdm9pZAorY2xpZW50X2NoZWNrX3dpbmRvd19jaGFuZ2Uodm9pZCkKK3sKKwlzdHJ1Y3Qgd2luc2l6ZSB3czsKKworCWlmICghIHJlY2VpdmVkX3dpbmRvd19jaGFuZ2Vfc2lnbmFsKQorCQlyZXR1cm47CisJLyoqIFhYWCByYWNlICovCisJcmVjZWl2ZWRfd2luZG93X2NoYW5nZV9zaWduYWwgPSAwOworCisJZGVidWcyKCJjbGllbnRfY2hlY2tfd2luZG93X2NoYW5nZTogY2hhbmdlZCIpOworCisJaWYgKGNvbXBhdDIwKSB7CisJCWNoYW5uZWxfc2VuZF93aW5kb3dfY2hhbmdlcygpOworCX0gZWxzZSB7CisJCWlmIChpb2N0bChmaWxlbm8oc3RkaW4pLCBUSU9DR1dJTlNaLCAmd3MpIDwgMCkKKwkJCXJldHVybjsKKwkJcGFja2V0X3N0YXJ0KFNTSF9DTVNHX1dJTkRPV19TSVpFKTsKKwkJcGFja2V0X3B1dF9pbnQoKHVfaW50KXdzLndzX3Jvdyk7CisJCXBhY2tldF9wdXRfaW50KCh1X2ludCl3cy53c19jb2wpOworCQlwYWNrZXRfcHV0X2ludCgodV9pbnQpd3Mud3NfeHBpeGVsKTsKKwkJcGFja2V0X3B1dF9pbnQoKHVfaW50KXdzLndzX3lwaXhlbCk7CisJCXBhY2tldF9zZW5kKCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorY2xpZW50X2dsb2JhbF9yZXF1ZXN0X3JlcGx5KGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQoreworCXN0cnVjdCBnbG9iYWxfY29uZmlybSAqZ2M7CisKKwlpZiAoKGdjID0gVEFJTFFfRklSU1QoJmdsb2JhbF9jb25maXJtcykpID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAoZ2MtPmNiICE9IE5VTEwpCisJCWdjLT5jYih0eXBlLCBzZXEsIGdjLT5jdHgpOworCWlmICgtLWdjLT5yZWZfY291bnQgPD0gMCkgeworCQlUQUlMUV9SRU1PVkUoJmdsb2JhbF9jb25maXJtcywgZ2MsIGVudHJ5KTsKKwkJYnplcm8oZ2MsIHNpemVvZigqZ2MpKTsKKwkJeGZyZWUoZ2MpOworCX0KKworCXBhY2tldF9zZXRfYWxpdmVfdGltZW91dHMoMCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXJ2ZXJfYWxpdmVfY2hlY2sodm9pZCkKK3sKKwlpZiAocGFja2V0X2luY19hbGl2ZV90aW1lb3V0cygpID4gb3B0aW9ucy5zZXJ2ZXJfYWxpdmVfY291bnRfbWF4KSB7CisJCWxvZ2l0KCJUaW1lb3V0LCBzZXJ2ZXIgJXMgbm90IHJlc3BvbmRpbmcuIiwgaG9zdCk7CisJCWNsZWFudXBfZXhpdCgyNTUpOworCX0KKwlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfR0xPQkFMX1JFUVVFU1QpOworCXBhY2tldF9wdXRfY3N0cmluZygia2VlcGFsaXZlQG9wZW5zc2guY29tIik7CisJcGFja2V0X3B1dF9jaGFyKDEpOyAgICAgLyogYm9vbGVhbjogd2FudCByZXBseSAqLworCXBhY2tldF9zZW5kKCk7CisJLyogSW5zZXJ0IGFuIGVtcHR5IHBsYWNlaG9sZGVyIHRvIG1haW50YWluIG9yZGVyaW5nICovCisJY2xpZW50X3JlZ2lzdGVyX2dsb2JhbF9jb25maXJtKE5VTEwsIE5VTEwpOworfQorCisvKgorICogV2FpdHMgdW50aWwgdGhlIGNsaWVudCBjYW4gZG8gc29tZXRoaW5nIChzb21lIGRhdGEgYmVjb21lcyBhdmFpbGFibGUgb24KKyAqIG9uZSBvZiB0aGUgZmlsZSBkZXNjcmlwdG9ycykuCisgKi8KK3N0YXRpYyB2b2lkCitjbGllbnRfd2FpdF91bnRpbF9jYW5fZG9fc29tZXRoaW5nKGZkX3NldCAqKnJlYWRzZXRwLCBmZF9zZXQgKip3cml0ZXNldHAsCisgICAgaW50ICptYXhmZHAsIHVfaW50ICpuYWxsb2NwLCBpbnQgcmVrZXlpbmcpCit7CisJc3RydWN0IHRpbWV2YWwgdHYsICp0dnA7CisJaW50IHRpbWVvdXRfc2VjczsKKwlpbnQgcmV0OworCisJLyogQWRkIGFueSBzZWxlY3Rpb25zIGJ5IHRoZSBjaGFubmVsIG1lY2hhbmlzbS4gKi8KKwljaGFubmVsX3ByZXBhcmVfc2VsZWN0KHJlYWRzZXRwLCB3cml0ZXNldHAsIG1heGZkcCwgbmFsbG9jcCwgcmVrZXlpbmcpOworCisJaWYgKCFjb21wYXQyMCkgeworCQkvKiBSZWFkIGZyb20gdGhlIGNvbm5lY3Rpb24sIHVubGVzcyBvdXIgYnVmZmVycyBhcmUgZnVsbC4gKi8KKwkJaWYgKGJ1ZmZlcl9sZW4oJnN0ZG91dF9idWZmZXIpIDwgYnVmZmVyX2hpZ2ggJiYKKwkJICAgIGJ1ZmZlcl9sZW4oJnN0ZGVycl9idWZmZXIpIDwgYnVmZmVyX2hpZ2ggJiYKKwkJICAgIGNoYW5uZWxfbm90X3ZlcnlfbXVjaF9idWZmZXJlZF9kYXRhKCkpCisJCQlGRF9TRVQoY29ubmVjdGlvbl9pbiwgKnJlYWRzZXRwKTsKKwkJLyoKKwkJICogUmVhZCBmcm9tIHN0ZGluLCB1bmxlc3Mgd2UgaGF2ZSBzZWVuIEVPRiBvciBoYXZlIHZlcnkgbXVjaAorCQkgKiBidWZmZXJlZCBkYXRhIHRvIHNlbmQgdG8gdGhlIHNlcnZlci4KKwkJICovCisJCWlmICghc3RkaW5fZW9mICYmIHBhY2tldF9ub3RfdmVyeV9tdWNoX2RhdGFfdG9fd3JpdGUoKSkKKwkJCUZEX1NFVChmaWxlbm8oc3RkaW4pLCAqcmVhZHNldHApOworCisJCS8qIFNlbGVjdCBzdGRvdXQvc3RkZXJyIGlmIGhhdmUgZGF0YSBpbiBidWZmZXIuICovCisJCWlmIChidWZmZXJfbGVuKCZzdGRvdXRfYnVmZmVyKSA+IDApCisJCQlGRF9TRVQoZmlsZW5vKHN0ZG91dCksICp3cml0ZXNldHApOworCQlpZiAoYnVmZmVyX2xlbigmc3RkZXJyX2J1ZmZlcikgPiAwKQorCQkJRkRfU0VUKGZpbGVubyhzdGRlcnIpLCAqd3JpdGVzZXRwKTsKKwl9IGVsc2UgeworCQkvKiBjaGFubmVsX3ByZXBhcmVfc2VsZWN0IGNvdWxkIGhhdmUgY2xvc2VkIHRoZSBsYXN0IGNoYW5uZWwgKi8KKwkJaWYgKHNlc3Npb25fY2xvc2VkICYmICFjaGFubmVsX3N0aWxsX29wZW4oKSAmJgorCQkgICAgIXBhY2tldF9oYXZlX2RhdGFfdG9fd3JpdGUoKSkgeworCQkJLyogY2xlYXIgbWFzayBzaW5jZSB3ZSBkaWQgbm90IGNhbGwgc2VsZWN0KCkgKi8KKwkJCW1lbXNldCgqcmVhZHNldHAsIDAsICpuYWxsb2NwKTsKKwkJCW1lbXNldCgqd3JpdGVzZXRwLCAwLCAqbmFsbG9jcCk7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQlGRF9TRVQoY29ubmVjdGlvbl9pbiwgKnJlYWRzZXRwKTsKKwkJfQorCX0KKworCS8qIFNlbGVjdCBzZXJ2ZXIgY29ubmVjdGlvbiBpZiBoYXZlIGRhdGEgdG8gd3JpdGUgdG8gdGhlIHNlcnZlci4gKi8KKwlpZiAocGFja2V0X2hhdmVfZGF0YV90b193cml0ZSgpKQorCQlGRF9TRVQoY29ubmVjdGlvbl9vdXQsICp3cml0ZXNldHApOworCisJLyoKKwkgKiBXYWl0IGZvciBzb21ldGhpbmcgdG8gaGFwcGVuLiAgVGhpcyB3aWxsIHN1c3BlbmQgdGhlIHByb2Nlc3MgdW50aWwKKwkgKiBzb21lIHNlbGVjdGVkIGRlc2NyaXB0b3IgY2FuIGJlIHJlYWQsIHdyaXR0ZW4sIG9yIGhhcyBzb21lIG90aGVyCisJICogZXZlbnQgcGVuZGluZywgb3IgYSB0aW1lb3V0IGV4cGlyZXMuCisJICovCisKKwl0aW1lb3V0X3NlY3MgPSBJTlRfTUFYOyAvKiB3ZSB1c2UgSU5UX01BWCB0byBtZWFuIG5vIHRpbWVvdXQgKi8KKwlpZiAob3B0aW9ucy5zZXJ2ZXJfYWxpdmVfaW50ZXJ2YWwgPiAwICYmIGNvbXBhdDIwKQorCQl0aW1lb3V0X3NlY3MgPSBvcHRpb25zLnNlcnZlcl9hbGl2ZV9pbnRlcnZhbDsKKwlzZXRfY29udHJvbF9wZXJzaXN0X2V4aXRfdGltZSgpOworCWlmIChjb250cm9sX3BlcnNpc3RfZXhpdF90aW1lID4gMCkgeworCQl0aW1lb3V0X3NlY3MgPSBNSU4odGltZW91dF9zZWNzLAorCQkJY29udHJvbF9wZXJzaXN0X2V4aXRfdGltZSAtIHRpbWUoTlVMTCkpOworCQlpZiAodGltZW91dF9zZWNzIDwgMCkKKwkJCXRpbWVvdXRfc2VjcyA9IDA7CisJfQorCWlmICh0aW1lb3V0X3NlY3MgPT0gSU5UX01BWCkKKwkJdHZwID0gTlVMTDsKKwllbHNlIHsKKwkJdHYudHZfc2VjID0gdGltZW91dF9zZWNzOworCQl0di50dl91c2VjID0gMDsKKwkJdHZwID0gJnR2OworCX0KKworCXJldCA9IHNlbGVjdCgoKm1heGZkcCkrMSwgKnJlYWRzZXRwLCAqd3JpdGVzZXRwLCBOVUxMLCB0dnApOworCWlmIChyZXQgPCAwKSB7CisJCWNoYXIgYnVmWzEwMF07CisKKwkJLyoKKwkJICogV2UgaGF2ZSB0byBjbGVhciB0aGUgc2VsZWN0IG1hc2tzLCBiZWNhdXNlIHdlIHJldHVybi4KKwkJICogV2UgaGF2ZSB0byByZXR1cm4sIGJlY2F1c2UgdGhlIG1haW5sb29wIGNoZWNrcyBmb3IgdGhlIGZsYWdzCisJCSAqIHNldCBieSB0aGUgc2lnbmFsIGhhbmRsZXJzLgorCQkgKi8KKwkJbWVtc2V0KCpyZWFkc2V0cCwgMCwgKm5hbGxvY3ApOworCQltZW1zZXQoKndyaXRlc2V0cCwgMCwgKm5hbGxvY3ApOworCisJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCXJldHVybjsKKwkJLyogTm90ZTogd2UgbWlnaHQgc3RpbGwgaGF2ZSBkYXRhIGluIHRoZSBidWZmZXJzLiAqLworCQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsICJzZWxlY3Q6ICVzXHJcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCWJ1ZmZlcl9hcHBlbmQoJnN0ZGVycl9idWZmZXIsIGJ1Ziwgc3RybGVuKGJ1ZikpOworCQlxdWl0X3BlbmRpbmcgPSAxOworCX0gZWxzZSBpZiAocmV0ID09IDApCisJCXNlcnZlcl9hbGl2ZV9jaGVjaygpOworfQorCitzdGF0aWMgdm9pZAorY2xpZW50X3N1c3BlbmRfc2VsZihCdWZmZXIgKmJpbiwgQnVmZmVyICpib3V0LCBCdWZmZXIgKmJlcnIpCit7CisJLyogRmx1c2ggc3Rkb3V0IGFuZCBzdGRlcnIgYnVmZmVycy4gKi8KKwlpZiAoYnVmZmVyX2xlbihib3V0KSA+IDApCisJCWF0b21pY2lvKHZ3cml0ZSwgZmlsZW5vKHN0ZG91dCksIGJ1ZmZlcl9wdHIoYm91dCksCisJCSAgICBidWZmZXJfbGVuKGJvdXQpKTsKKwlpZiAoYnVmZmVyX2xlbihiZXJyKSA+IDApCisJCWF0b21pY2lvKHZ3cml0ZSwgZmlsZW5vKHN0ZGVyciksIGJ1ZmZlcl9wdHIoYmVyciksCisJCSAgICBidWZmZXJfbGVuKGJlcnIpKTsKKworCWxlYXZlX3Jhd19tb2RlKG9wdGlvbnMucmVxdWVzdF90dHkgPT0gUkVRVUVTVF9UVFlfRk9SQ0UpOworCisJLyoKKwkgKiBGcmVlIChhbmQgY2xlYXIpIHRoZSBidWZmZXIgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGdldHMKKwkgKiB3cml0dGVuIHRvIHN3YXAuCisJICovCisJYnVmZmVyX2ZyZWUoYmluKTsKKwlidWZmZXJfZnJlZShib3V0KTsKKwlidWZmZXJfZnJlZShiZXJyKTsKKworCS8qIFNlbmQgdGhlIHN1c3BlbmQgc2lnbmFsIHRvIHRoZSBwcm9ncmFtIGl0c2VsZi4gKi8KKwlraWxsKGdldHBpZCgpLCBTSUdUU1RQKTsKKworCS8qIFJlc2V0IHdpbmRvdyBzaXplcyBpbiBjYXNlIHRoZXkgaGF2ZSBjaGFuZ2VkICovCisJcmVjZWl2ZWRfd2luZG93X2NoYW5nZV9zaWduYWwgPSAxOworCisJLyogT0ssIHdlIGhhdmUgYmVlbiBjb250aW51ZWQgYnkgdGhlIHVzZXIuIFJlaW5pdGlhbGl6ZSBidWZmZXJzLiAqLworCWJ1ZmZlcl9pbml0KGJpbik7CisJYnVmZmVyX2luaXQoYm91dCk7CisJYnVmZmVyX2luaXQoYmVycik7CisKKwllbnRlcl9yYXdfbW9kZShvcHRpb25zLnJlcXVlc3RfdHR5ID09IFJFUVVFU1RfVFRZX0ZPUkNFKTsKK30KKworc3RhdGljIHZvaWQKK2NsaWVudF9wcm9jZXNzX25ldF9pbnB1dChmZF9zZXQgKnJlYWRzZXQpCit7CisJaW50IGxlbiwgY29udCA9IDA7CisJY2hhciBidWZbU1NIX0lPQlVGU1pdOworCisJLyoKKwkgKiBSZWFkIGlucHV0IGZyb20gdGhlIHNlcnZlciwgYW5kIGFkZCBhbnkgc3VjaCBkYXRhIHRvIHRoZSBidWZmZXIgb2YKKwkgKiB0aGUgcGFja2V0IHN1YnN5c3RlbS4KKwkgKi8KKwlpZiAoRkRfSVNTRVQoY29ubmVjdGlvbl9pbiwgcmVhZHNldCkpIHsKKwkJLyogUmVhZCBhcyBtdWNoIGFzIHBvc3NpYmxlLiAqLworCQlsZW4gPSByb2FtaW5nX3JlYWQoY29ubmVjdGlvbl9pbiwgYnVmLCBzaXplb2YoYnVmKSwgJmNvbnQpOworCQlpZiAobGVuID09IDAgJiYgY29udCA9PSAwKSB7CisJCQkvKgorCQkJICogUmVjZWl2ZWQgRU9GLiAgVGhlIHJlbW90ZSBob3N0IGhhcyBjbG9zZWQgdGhlCisJCQkgKiBjb25uZWN0aW9uLgorCQkJICovCisJCQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsCisJCQkgICAgIkNvbm5lY3Rpb24gdG8gJS4zMDBzIGNsb3NlZCBieSByZW1vdGUgaG9zdC5cclxuIiwKKwkJCSAgICBob3N0KTsKKwkJCWJ1ZmZlcl9hcHBlbmQoJnN0ZGVycl9idWZmZXIsIGJ1Ziwgc3RybGVuKGJ1ZikpOworCQkJcXVpdF9wZW5kaW5nID0gMTsKKwkJCXJldHVybjsKKwkJfQorCQkvKgorCQkgKiBUaGVyZSBpcyBhIGtlcm5lbCBidWcgb24gU29sYXJpcyB0aGF0IGNhdXNlcyBzZWxlY3QgdG8KKwkJICogc29tZXRpbWVzIHdha2UgdXAgZXZlbiB0aG91Z2ggdGhlcmUgaXMgbm8gZGF0YSBhdmFpbGFibGUuCisJCSAqLworCQlpZiAobGVuIDwgMCAmJgorCQkgICAgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykpCisJCQlsZW4gPSAwOworCisJCWlmIChsZW4gPCAwKSB7CisJCQkvKgorCQkJICogQW4gZXJyb3IgaGFzIGVuY291bnRlcmVkLiAgUGVyaGFwcyB0aGVyZSBpcyBhCisJCQkgKiBuZXR3b3JrIHByb2JsZW0uCisJCQkgKi8KKwkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwKKwkJCSAgICAiUmVhZCBmcm9tIHJlbW90ZSBob3N0ICUuMzAwczogJS4xMDBzXHJcbiIsCisJCQkgICAgaG9zdCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWJ1ZmZlcl9hcHBlbmQoJnN0ZGVycl9idWZmZXIsIGJ1Ziwgc3RybGVuKGJ1ZikpOworCQkJcXVpdF9wZW5kaW5nID0gMTsKKwkJCXJldHVybjsKKwkJfQorCQlwYWNrZXRfcHJvY2Vzc19pbmNvbWluZyhidWYsIGxlbik7CisJfQorfQorCitzdGF0aWMgdm9pZAorY2xpZW50X3N0YXR1c19jb25maXJtKGludCB0eXBlLCBDaGFubmVsICpjLCB2b2lkICpjdHgpCit7CisJc3RydWN0IGNoYW5uZWxfcmVwbHlfY3R4ICpjciA9IChzdHJ1Y3QgY2hhbm5lbF9yZXBseV9jdHggKiljdHg7CisJY2hhciBlcnJtc2dbMjU2XTsKKwlpbnQgdG9jaGFuOworCisJLyoKKwkgKiBJZiBhIFRUWSB3YXMgZXhwbGljaXRseSByZXF1ZXN0ZWQsIHRoZW4gYSBmYWlsdXJlIHRvIGFsbG9jYXRlCisJICogb25lIGlzIGZhdGFsLgorCSAqLworCWlmIChjci0+YWN0aW9uID09IENPTkZJUk1fVFRZICYmCisJICAgIChvcHRpb25zLnJlcXVlc3RfdHR5ID09IFJFUVVFU1RfVFRZX0ZPUkNFIHx8CisJICAgIG9wdGlvbnMucmVxdWVzdF90dHkgPT0gUkVRVUVTVF9UVFlfWUVTKSkKKwkJY3ItPmFjdGlvbiA9IENPTkZJUk1fQ0xPU0U7CisKKwkvKiBYWFggc3VwcmVzcyBvbiBtdXggX2NsaWVudF8gcXVpZXRtb2RlICovCisJdG9jaGFuID0gb3B0aW9ucy5sb2dfbGV2ZWwgPj0gU1lTTE9HX0xFVkVMX0VSUk9SICYmCisJICAgIGMtPmN0bF9jaGFuICE9IC0xICYmIGMtPmV4dGVuZGVkX3VzYWdlID09IENIQU5fRVhURU5ERURfV1JJVEU7CisKKwlpZiAodHlwZSA9PSBTU0gyX01TR19DSEFOTkVMX1NVQ0NFU1MpIHsKKwkJZGVidWcyKCIlcyByZXF1ZXN0IGFjY2VwdGVkIG9uIGNoYW5uZWwgJWQiLAorCQkgICAgY3ItPnJlcXVlc3RfdHlwZSwgYy0+c2VsZik7CisJfSBlbHNlIGlmICh0eXBlID09IFNTSDJfTVNHX0NIQU5ORUxfRkFJTFVSRSkgeworCQlpZiAodG9jaGFuKSB7CisJCQlzbnByaW50ZihlcnJtc2csIHNpemVvZihlcnJtc2cpLAorCQkJICAgICIlcyByZXF1ZXN0IGZhaWxlZFxyXG4iLCBjci0+cmVxdWVzdF90eXBlKTsKKwkJfSBlbHNlIHsKKwkJCXNucHJpbnRmKGVycm1zZywgc2l6ZW9mKGVycm1zZyksCisJCQkgICAgIiVzIHJlcXVlc3QgZmFpbGVkIG9uIGNoYW5uZWwgJWQiLAorCQkJICAgIGNyLT5yZXF1ZXN0X3R5cGUsIGMtPnNlbGYpOworCQl9CisJCS8qIElmIGVycm9yIG9jY3VycmVkIG9uIHByaW1hcnkgc2Vzc2lvbiBjaGFubmVsLCB0aGVuIGV4aXQgKi8KKwkJaWYgKGNyLT5hY3Rpb24gPT0gQ09ORklSTV9DTE9TRSAmJiBjLT5zZWxmID09IHNlc3Npb25faWRlbnQpCisJCQlmYXRhbCgiJXMiLCBlcnJtc2cpOworCQkvKgorCQkgKiBJZiBlcnJvciBvY2N1cnJlZCBvbiBtdXggY2xpZW50LCBhcHBlbmQgdG8KKwkJICogdGhlaXIgc3RkZXJyLgorCQkgKi8KKwkJaWYgKHRvY2hhbikgeworCQkJYnVmZmVyX2FwcGVuZCgmYy0+ZXh0ZW5kZWQsIGVycm1zZywKKwkJCSAgICBzdHJsZW4oZXJybXNnKSk7CisJCX0gZWxzZQorCQkJZXJyb3IoIiVzIiwgZXJybXNnKTsKKwkJaWYgKGNyLT5hY3Rpb24gPT0gQ09ORklSTV9UVFkpIHsKKwkJCS8qCisJCQkgKiBJZiBhIFRUWSBhbGxvY2F0aW9uIGVycm9yIG9jY3VycmVkLCB0aGVuIGFycmFuZ2UKKwkJCSAqIGZvciB0aGUgY29ycmVjdCBUVFkgdG8gbGVhdmUgcmF3IG1vZGUuCisJCQkgKi8KKwkJCWlmIChjLT5zZWxmID09IHNlc3Npb25faWRlbnQpCisJCQkJbGVhdmVfcmF3X21vZGUoMCk7CisJCQllbHNlCisJCQkJbXV4X3R0eV9hbGxvY19mYWlsZWQoYyk7CisJCX0gZWxzZSBpZiAoY3ItPmFjdGlvbiA9PSBDT05GSVJNX0NMT1NFKSB7CisJCQljaGFuX3JlYWRfZmFpbGVkKGMpOworCQkJY2hhbl93cml0ZV9mYWlsZWQoYyk7CisJCX0KKwl9CisJeGZyZWUoY3IpOworfQorCitzdGF0aWMgdm9pZAorY2xpZW50X2FiYW5kb25fc3RhdHVzX2NvbmZpcm0oQ2hhbm5lbCAqYywgdm9pZCAqY3R4KQoreworCXhmcmVlKGN0eCk7Cit9CisKK3ZvaWQKK2NsaWVudF9leHBlY3RfY29uZmlybShpbnQgaWQsIGNvbnN0IGNoYXIgKnJlcXVlc3QsCisgICAgZW51bSBjb25maXJtX2FjdGlvbiBhY3Rpb24pCit7CisJc3RydWN0IGNoYW5uZWxfcmVwbHlfY3R4ICpjciA9IHhtYWxsb2Moc2l6ZW9mKCpjcikpOworCisJY3ItPnJlcXVlc3RfdHlwZSA9IHJlcXVlc3Q7CisJY3ItPmFjdGlvbiA9IGFjdGlvbjsKKworCWNoYW5uZWxfcmVnaXN0ZXJfc3RhdHVzX2NvbmZpcm0oaWQsIGNsaWVudF9zdGF0dXNfY29uZmlybSwKKwkgICAgY2xpZW50X2FiYW5kb25fc3RhdHVzX2NvbmZpcm0sIGNyKTsKK30KKwordm9pZAorY2xpZW50X3JlZ2lzdGVyX2dsb2JhbF9jb25maXJtKGdsb2JhbF9jb25maXJtX2NiICpjYiwgdm9pZCAqY3R4KQoreworCXN0cnVjdCBnbG9iYWxfY29uZmlybSAqZ2MsICpsYXN0X2djOworCisJLyogQ29hbGVzY2UgaWRlbnRpY2FsIGNhbGxiYWNrcyAqLworCWxhc3RfZ2MgPSBUQUlMUV9MQVNUKCZnbG9iYWxfY29uZmlybXMsIGdsb2JhbF9jb25maXJtcyk7CisJaWYgKGxhc3RfZ2MgJiYgbGFzdF9nYy0+Y2IgPT0gY2IgJiYgbGFzdF9nYy0+Y3R4ID09IGN0eCkgeworCQlpZiAoKytsYXN0X2djLT5yZWZfY291bnQgPj0gSU5UX01BWCkKKwkJCWZhdGFsKCIlczogbGFzdF9nYy0+cmVmX2NvdW50ID0gJWQiLAorCQkJICAgIF9fZnVuY19fLCBsYXN0X2djLT5yZWZfY291bnQpOworCQlyZXR1cm47CisJfQorCisJZ2MgPSB4bWFsbG9jKHNpemVvZigqZ2MpKTsKKwlnYy0+Y2IgPSBjYjsKKwlnYy0+Y3R4ID0gY3R4OworCWdjLT5yZWZfY291bnQgPSAxOworCVRBSUxRX0lOU0VSVF9UQUlMKCZnbG9iYWxfY29uZmlybXMsIGdjLCBlbnRyeSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX2NtZGxpbmUodm9pZCkKK3sKKwl2b2lkICgqaGFuZGxlcikoaW50KTsKKwljaGFyICpzLCAqY21kLCAqY2FuY2VsX2hvc3Q7CisJaW50IGRlbGV0ZSA9IDAsIGxvY2FsID0gMCwgcmVtb3RlID0gMCwgZHluYW1pYyA9IDA7CisJaW50IGNhbmNlbF9wb3J0LCBvazsKKwlGb3J3YXJkIGZ3ZDsKKworCWJ6ZXJvKCZmd2QsIHNpemVvZihmd2QpKTsKKwlmd2QubGlzdGVuX2hvc3QgPSBmd2QuY29ubmVjdF9ob3N0ID0gTlVMTDsKKworCWxlYXZlX3Jhd19tb2RlKG9wdGlvbnMucmVxdWVzdF90dHkgPT0gUkVRVUVTVF9UVFlfRk9SQ0UpOworCWhhbmRsZXIgPSBzaWduYWwoU0lHSU5ULCBTSUdfSUdOKTsKKwljbWQgPSBzID0gcmVhZF9wYXNzcGhyYXNlKCJcclxuc3NoPiAiLCBSUF9FQ0hPKTsKKwlpZiAocyA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwl3aGlsZSAoaXNzcGFjZSgqcykpCisJCXMrKzsKKwlpZiAoKnMgPT0gJy0nKQorCQlzKys7CS8qIFNraXAgY21kbGluZSAnLScsIGlmIGFueSAqLworCWlmICgqcyA9PSAnXDAnKQorCQlnb3RvIG91dDsKKworCWlmICgqcyA9PSAnaCcgfHwgKnMgPT0gJ0gnIHx8ICpzID09ICc/JykgeworCQlsb2dpdCgiQ29tbWFuZHM6Iik7CisJCWxvZ2l0KCIgICAgICAtTFtiaW5kX2FkZHJlc3M6XXBvcnQ6aG9zdDpob3N0cG9ydCAgICAiCisJCSAgICAiUmVxdWVzdCBsb2NhbCBmb3J3YXJkIik7CisJCWxvZ2l0KCIgICAgICAtUltiaW5kX2FkZHJlc3M6XXBvcnQ6aG9zdDpob3N0cG9ydCAgICAiCisJCSAgICAiUmVxdWVzdCByZW1vdGUgZm9yd2FyZCIpOworCQlsb2dpdCgiICAgICAgLURbYmluZF9hZGRyZXNzOl1wb3J0ICAgICAgICAgICAgICAgICAgIgorCQkgICAgIlJlcXVlc3QgZHluYW1pYyBmb3J3YXJkIik7CisJCWxvZ2l0KCIgICAgICAtS0xbYmluZF9hZGRyZXNzOl1wb3J0ICAgICAgICAgICAgICAgICAiCisJCSAgICAiQ2FuY2VsIGxvY2FsIGZvcndhcmQiKTsKKwkJbG9naXQoIiAgICAgIC1LUltiaW5kX2FkZHJlc3M6XXBvcnQgICAgICAgICAgICAgICAgICIKKwkJICAgICJDYW5jZWwgcmVtb3RlIGZvcndhcmQiKTsKKwkJbG9naXQoIiAgICAgIC1LRFtiaW5kX2FkZHJlc3M6XXBvcnQgICAgICAgICAgICAgICAgICIKKwkJICAgICJDYW5jZWwgZHluYW1pYyBmb3J3YXJkIik7CisJCWlmICghb3B0aW9ucy5wZXJtaXRfbG9jYWxfY29tbWFuZCkKKwkJCWdvdG8gb3V0OworCQlsb2dpdCgiICAgICAgIWFyZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorCQkgICAgIkV4ZWN1dGUgbG9jYWwgY29tbWFuZCIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKnMgPT0gJyEnICYmIG9wdGlvbnMucGVybWl0X2xvY2FsX2NvbW1hbmQpIHsKKwkJcysrOworCQlzc2hfbG9jYWxfY21kKHMpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKnMgPT0gJ0snKSB7CisJCWRlbGV0ZSA9IDE7CisJCXMrKzsKKwl9CisJaWYgKCpzID09ICdMJykKKwkJbG9jYWwgPSAxOworCWVsc2UgaWYgKCpzID09ICdSJykKKwkJcmVtb3RlID0gMTsKKwllbHNlIGlmICgqcyA9PSAnRCcpCisJCWR5bmFtaWMgPSAxOworCWVsc2UgeworCQlsb2dpdCgiSW52YWxpZCBjb21tYW5kLiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZGVsZXRlICYmICFjb21wYXQyMCkgeworCQlsb2dpdCgiTm90IHN1cHBvcnRlZCBmb3IgU1NIIHByb3RvY29sIHZlcnNpb24gMS4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJd2hpbGUgKGlzc3BhY2UoKisrcykpCisJCTsKKworCS8qIFhYWCB1cGRhdGUgbGlzdCBvZiBmb3J3YXJkcyBpbiBvcHRpb25zICovCisJaWYgKGRlbGV0ZSkgeworCQljYW5jZWxfcG9ydCA9IDA7CisJCWNhbmNlbF9ob3N0ID0gaHBkZWxpbSgmcyk7CS8qIG1heSBiZSBOVUxMICovCisJCWlmIChzICE9IE5VTEwpIHsKKwkJCWNhbmNlbF9wb3J0ID0gYTJwb3J0KHMpOworCQkJY2FuY2VsX2hvc3QgPSBjbGVhbmhvc3RuYW1lKGNhbmNlbF9ob3N0KTsKKwkJfSBlbHNlIHsKKwkJCWNhbmNlbF9wb3J0ID0gYTJwb3J0KGNhbmNlbF9ob3N0KTsKKwkJCWNhbmNlbF9ob3N0ID0gTlVMTDsKKwkJfQorCQlpZiAoY2FuY2VsX3BvcnQgPD0gMCkgeworCQkJbG9naXQoIkJhZCBmb3J3YXJkaW5nIGNsb3NlIHBvcnQiKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChyZW1vdGUpCisJCQlvayA9IGNoYW5uZWxfcmVxdWVzdF9yZm9yd2FyZF9jYW5jZWwoY2FuY2VsX2hvc3QsCisJCQkgICAgY2FuY2VsX3BvcnQpID09IDA7CisJCWVsc2UgaWYgKGR5bmFtaWMpCisgICAgICAgICAgICAgICAgCW9rID0gY2hhbm5lbF9jYW5jZWxfbHBvcnRfbGlzdGVuZXIoY2FuY2VsX2hvc3QsCisJCQkgICAgY2FuY2VsX3BvcnQsIDAsIG9wdGlvbnMuZ2F0ZXdheV9wb3J0cykgPiAwOworCQllbHNlCisgICAgICAgICAgICAgICAgCW9rID0gY2hhbm5lbF9jYW5jZWxfbHBvcnRfbGlzdGVuZXIoY2FuY2VsX2hvc3QsCisJCQkgICAgY2FuY2VsX3BvcnQsIENIQU5ORUxfQ0FOQ0VMX1BPUlRfU1RBVElDLAorCQkJICAgIG9wdGlvbnMuZ2F0ZXdheV9wb3J0cykgPiAwOworCQlpZiAoIW9rKSB7CisJCQlsb2dpdCgiVW5rb3duIHBvcnQgZm9yd2FyZGluZy4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWxvZ2l0KCJDYW5jZWxlZCBmb3J3YXJkaW5nLiIpOworCX0gZWxzZSB7CisJCWlmICghcGFyc2VfZm9yd2FyZCgmZndkLCBzLCBkeW5hbWljLCByZW1vdGUpKSB7CisJCQlsb2dpdCgiQmFkIGZvcndhcmRpbmcgc3BlY2lmaWNhdGlvbi4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChsb2NhbCB8fCBkeW5hbWljKSB7CisJCQlpZiAoY2hhbm5lbF9zZXR1cF9sb2NhbF9md2RfbGlzdGVuZXIoZndkLmxpc3Rlbl9ob3N0LAorCQkJICAgIGZ3ZC5saXN0ZW5fcG9ydCwgZndkLmNvbm5lY3RfaG9zdCwKKwkJCSAgICBmd2QuY29ubmVjdF9wb3J0LCBvcHRpb25zLmdhdGV3YXlfcG9ydHMpIDwgMCkgeworCQkJCWxvZ2l0KCJQb3J0IGZvcndhcmRpbmcgZmFpbGVkLiIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGNoYW5uZWxfcmVxdWVzdF9yZW1vdGVfZm9yd2FyZGluZyhmd2QubGlzdGVuX2hvc3QsCisJCQkgICAgZndkLmxpc3Rlbl9wb3J0LCBmd2QuY29ubmVjdF9ob3N0LAorCQkJICAgIGZ3ZC5jb25uZWN0X3BvcnQpIDwgMCkgeworCQkJCWxvZ2l0KCJQb3J0IGZvcndhcmRpbmcgZmFpbGVkLiIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJCWxvZ2l0KCJGb3J3YXJkaW5nIHBvcnQuIik7CisJfQorCitvdXQ6CisJc2lnbmFsKFNJR0lOVCwgaGFuZGxlcik7CisJZW50ZXJfcmF3X21vZGUob3B0aW9ucy5yZXF1ZXN0X3R0eSA9PSBSRVFVRVNUX1RUWV9GT1JDRSk7CisJaWYgKGNtZCkKKwkJeGZyZWUoY21kKTsKKwlpZiAoZndkLmxpc3Rlbl9ob3N0ICE9IE5VTEwpCisJCXhmcmVlKGZ3ZC5saXN0ZW5faG9zdCk7CisJaWYgKGZ3ZC5jb25uZWN0X2hvc3QgIT0gTlVMTCkKKwkJeGZyZWUoZndkLmNvbm5lY3RfaG9zdCk7Cit9CisKKy8qIAorICogUHJvY2VzcyB0aGUgY2hhcmFjdGVycyBvbmUgYnkgb25lLCBjYWxsIHdpdGggYz09TlVMTCBmb3IgcHJvdG8xIGNhc2UuCisgKi8KK3N0YXRpYyBpbnQKK3Byb2Nlc3NfZXNjYXBlcyhDaGFubmVsICpjLCBCdWZmZXIgKmJpbiwgQnVmZmVyICpib3V0LCBCdWZmZXIgKmJlcnIsCisgICAgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWNoYXIgc3RyaW5nWzEwMjRdOworCXBpZF90IHBpZDsKKwlpbnQgYnl0ZXMgPSAwOworCXVfaW50IGk7CisJdV9jaGFyIGNoOworCWNoYXIgKnM7CisJaW50ICplc2NhcGVfcGVuZGluZ3AsIGVzY2FwZV9jaGFyOworCXN0cnVjdCBlc2NhcGVfZmlsdGVyX2N0eCAqZWZjOworCisJaWYgKGMgPT0gTlVMTCkgeworCQllc2NhcGVfcGVuZGluZ3AgPSAmZXNjYXBlX3BlbmRpbmcxOworCQllc2NhcGVfY2hhciA9IGVzY2FwZV9jaGFyMTsKKwl9IGVsc2UgeworCQlpZiAoYy0+ZmlsdGVyX2N0eCA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCWVmYyA9IChzdHJ1Y3QgZXNjYXBlX2ZpbHRlcl9jdHggKiljLT5maWx0ZXJfY3R4OworCQllc2NhcGVfcGVuZGluZ3AgPSAmZWZjLT5lc2NhcGVfcGVuZGluZzsKKwkJZXNjYXBlX2NoYXIgPSBlZmMtPmVzY2FwZV9jaGFyOworCX0KKwkKKwlpZiAobGVuIDw9IDApCisJCXJldHVybiAoMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHVfaW50KWxlbjsgaSsrKSB7CisJCS8qIEdldCBvbmUgY2hhcmFjdGVyIGF0IGEgdGltZS4gKi8KKwkJY2ggPSBidWZbaV07CisKKwkJaWYgKCplc2NhcGVfcGVuZGluZ3ApIHsKKwkJCS8qIFdlIGhhdmUgcHJldmlvdXNseSBzZWVuIGFuIGVzY2FwZSBjaGFyYWN0ZXIuICovCisJCQkvKiBDbGVhciB0aGUgZmxhZyBub3cuICovCisJCQkqZXNjYXBlX3BlbmRpbmdwID0gMDsKKworCQkJLyogUHJvY2VzcyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuICovCisJCQlzd2l0Y2ggKGNoKSB7CisJCQljYXNlICcuJzoKKwkJCQkvKiBUZXJtaW5hdGUgdGhlIGNvbm5lY3Rpb24uICovCisJCQkJc25wcmludGYoc3RyaW5nLCBzaXplb2Ygc3RyaW5nLCAiJWMuXHJcbiIsCisJCQkJICAgIGVzY2FwZV9jaGFyKTsKKwkJCQlidWZmZXJfYXBwZW5kKGJlcnIsIHN0cmluZywgc3RybGVuKHN0cmluZykpOworCisJCQkJaWYgKGMgJiYgYy0+Y3RsX2NoYW4gIT0gLTEpIHsKKwkJCQkJY2hhbl9yZWFkX2ZhaWxlZChjKTsKKwkJCQkJY2hhbl93cml0ZV9mYWlsZWQoYyk7CisJCQkJCXJldHVybiAwOworCQkJCX0gZWxzZQorCQkJCQlxdWl0X3BlbmRpbmcgPSAxOworCQkJCXJldHVybiAtMTsKKworCQkJY2FzZSAnWicgLSA2NDoKKwkJCQkvKiBYWFggc3VwcG9ydCB0aGlzIGZvciBtdXggY2xpZW50cyAqLworCQkJCWlmIChjICYmIGMtPmN0bF9jaGFuICE9IC0xKSB7Cisgbm9lc2NhcGU6CisJCQkJCXNucHJpbnRmKHN0cmluZywgc2l6ZW9mIHN0cmluZywKKwkJCQkJICAgICIlYyVjIGVzY2FwZSBub3QgYXZhaWxhYmxlIHRvICIKKwkJCQkJICAgICJtdWx0aXBsZXhlZCBzZXNzaW9uc1xyXG4iLAorCQkJCQkgICAgZXNjYXBlX2NoYXIsIGNoKTsKKwkJCQkJYnVmZmVyX2FwcGVuZChiZXJyLCBzdHJpbmcsCisJCQkJCSAgICBzdHJsZW4oc3RyaW5nKSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvKiBTdXNwZW5kIHRoZSBwcm9ncmFtLiBJbmZvcm0gdGhlIHVzZXIgKi8KKwkJCQlzbnByaW50ZihzdHJpbmcsIHNpemVvZiBzdHJpbmcsCisJCQkJICAgICIlY15aIFtzdXNwZW5kIHNzaF1cclxuIiwgZXNjYXBlX2NoYXIpOworCQkJCWJ1ZmZlcl9hcHBlbmQoYmVyciwgc3RyaW5nLCBzdHJsZW4oc3RyaW5nKSk7CisKKwkJCQkvKiBSZXN0b3JlIHRlcm1pbmFsIG1vZGVzIGFuZCBzdXNwZW5kLiAqLworCQkJCWNsaWVudF9zdXNwZW5kX3NlbGYoYmluLCBib3V0LCBiZXJyKTsKKworCQkJCS8qIFdlIGhhdmUgYmVlbiBjb250aW51ZWQuICovCisJCQkJY29udGludWU7CisKKwkJCWNhc2UgJ0InOgorCQkJCWlmIChjb21wYXQyMCkgeworCQkJCQlzbnByaW50ZihzdHJpbmcsIHNpemVvZiBzdHJpbmcsCisJCQkJCSAgICAiJWNCXHJcbiIsIGVzY2FwZV9jaGFyKTsKKwkJCQkJYnVmZmVyX2FwcGVuZChiZXJyLCBzdHJpbmcsCisJCQkJCSAgICBzdHJsZW4oc3RyaW5nKSk7CisJCQkJCWNoYW5uZWxfcmVxdWVzdF9zdGFydChzZXNzaW9uX2lkZW50LAorCQkJCQkgICAgImJyZWFrIiwgMCk7CisJCQkJCXBhY2tldF9wdXRfaW50KDEwMDApOworCQkJCQlwYWNrZXRfc2VuZCgpOworCQkJCX0KKwkJCQljb250aW51ZTsKKworCQkJY2FzZSAnUic6CisJCQkJaWYgKGNvbXBhdDIwKSB7CisJCQkJCWlmIChkYXRhZmVsbG93cyAmIFNTSF9CVUdfTk9SRUtFWSkKKwkJCQkJCWxvZ2l0KCJTZXJ2ZXIgZG9lcyBub3QgIgorCQkJCQkJICAgICJzdXBwb3J0IHJlLWtleWluZyIpOworCQkJCQllbHNlCisJCQkJCQluZWVkX3Jla2V5aW5nID0gMTsKKwkJCQl9CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgJyYnOgorCQkJCWlmIChjICYmIGMtPmN0bF9jaGFuICE9IC0xKQorCQkJCQlnb3RvIG5vZXNjYXBlOworCQkJCS8qCisJCQkJICogRGV0YWNoIHRoZSBwcm9ncmFtIChjb250aW51ZSB0byBzZXJ2ZQorCQkJCSAqIGNvbm5lY3Rpb25zLCBidXQgcHV0IGluIGJhY2tncm91bmQgYW5kIG5vCisJCQkJICogbW9yZSBuZXcgY29ubmVjdGlvbnMpLgorCQkJCSAqLworCQkJCS8qIFJlc3RvcmUgdHR5IG1vZGVzLiAqLworCQkJCWxlYXZlX3Jhd19tb2RlKAorCQkJCSAgICBvcHRpb25zLnJlcXVlc3RfdHR5ID09IFJFUVVFU1RfVFRZX0ZPUkNFKTsKKworCQkJCS8qIFN0b3AgbGlzdGVuaW5nIGZvciBuZXcgY29ubmVjdGlvbnMuICovCisJCQkJY2hhbm5lbF9zdG9wX2xpc3RlbmluZygpOworCisJCQkJc25wcmludGYoc3RyaW5nLCBzaXplb2Ygc3RyaW5nLAorCQkJCSAgICAiJWMmIFtiYWNrZ3JvdW5kZWRdXG4iLCBlc2NhcGVfY2hhcik7CisJCQkJYnVmZmVyX2FwcGVuZChiZXJyLCBzdHJpbmcsIHN0cmxlbihzdHJpbmcpKTsKKworCQkJCS8qIEZvcmsgaW50byBiYWNrZ3JvdW5kLiAqLworCQkJCXBpZCA9IGZvcmsoKTsKKwkJCQlpZiAocGlkIDwgMCkgeworCQkJCQllcnJvcigiZm9yazogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmIChwaWQgIT0gMCkgewkvKiBUaGlzIGlzIHRoZSBwYXJlbnQuICovCisJCQkJCS8qIFRoZSBwYXJlbnQganVzdCBleGl0cy4gKi8KKwkJCQkJZXhpdCgwKTsKKwkJCQl9CisJCQkJLyogVGhlIGNoaWxkIGNvbnRpbnVlcyBzZXJ2aW5nIGNvbm5lY3Rpb25zLiAqLworCQkJCWlmIChjb21wYXQyMCkgeworCQkJCQlidWZmZXJfYXBwZW5kKGJpbiwgIlwwMDQiLCAxKTsKKwkJCQkJLyogZmFrZSBFT0Ygb24gc3RkaW4gKi8KKwkJCQkJcmV0dXJuIC0xOworCQkJCX0gZWxzZSBpZiAoIXN0ZGluX2VvZikgeworCQkJCQkvKgorCQkJCQkgKiBTZW5kaW5nIFNTSF9DTVNHX0VPRiBhbG9uZSBkb2VzIG5vdAorCQkJCQkgKiBhbHdheXMgYXBwZWFyIHRvIGJlIGVub3VnaC4gIFNvIHdlCisJCQkJCSAqIHRyeSB0byBzZW5kIGFuIEVPRiBjaGFyYWN0ZXIgZmlyc3QuCisJCQkJCSAqLworCQkJCQlwYWNrZXRfc3RhcnQoU1NIX0NNU0dfU1RESU5fREFUQSk7CisJCQkJCXBhY2tldF9wdXRfc3RyaW5nKCJcMDA0IiwgMSk7CisJCQkJCXBhY2tldF9zZW5kKCk7CisJCQkJCS8qIENsb3NlIHN0ZGluLiAqLworCQkJCQlzdGRpbl9lb2YgPSAxOworCQkJCQlpZiAoYnVmZmVyX2xlbihiaW4pID09IDApIHsKKwkJCQkJCXBhY2tldF9zdGFydChTU0hfQ01TR19FT0YpOworCQkJCQkJcGFja2V0X3NlbmQoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQljb250aW51ZTsKKworCQkJY2FzZSAnPyc6CisJCQkJaWYgKGMgJiYgYy0+Y3RsX2NoYW4gIT0gLTEpIHsKKwkJCQkJc25wcmludGYoc3RyaW5nLCBzaXplb2Ygc3RyaW5nLAorIiVjP1xyXG5cCitTdXBwb3J0ZWQgZXNjYXBlIHNlcXVlbmNlczpcclxuXAorICAlYy4gIC0gdGVybWluYXRlIHNlc3Npb25cclxuXAorICAlY0IgIC0gc2VuZCBhIEJSRUFLIHRvIHRoZSByZW1vdGUgc3lzdGVtXHJcblwKKyAgJWNSICAtIFJlcXVlc3QgcmVrZXkgKFNTSCBwcm90b2NvbCAyIG9ubHkpXHJcblwKKyAgJWMjICAtIGxpc3QgZm9yd2FyZGVkIGNvbm5lY3Rpb25zXHJcblwKKyAgJWM/ICAtIHRoaXMgbWVzc2FnZVxyXG5cCisgICVjJWMgIC0gc2VuZCB0aGUgZXNjYXBlIGNoYXJhY3RlciBieSB0eXBpbmcgaXQgdHdpY2VcclxuXAorKE5vdGUgdGhhdCBlc2NhcGVzIGFyZSBvbmx5IHJlY29nbml6ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgbmV3bGluZS4pXHJcbiIsCisJCQkJCSAgICBlc2NhcGVfY2hhciwgZXNjYXBlX2NoYXIsCisJCQkJCSAgICBlc2NhcGVfY2hhciwgZXNjYXBlX2NoYXIsCisJCQkJCSAgICBlc2NhcGVfY2hhciwgZXNjYXBlX2NoYXIsCisJCQkJCSAgICBlc2NhcGVfY2hhciwgZXNjYXBlX2NoYXIpOworCQkJCX0gZWxzZSB7CisJCQkJCXNucHJpbnRmKHN0cmluZywgc2l6ZW9mIHN0cmluZywKKyIlYz9cclxuXAorU3VwcG9ydGVkIGVzY2FwZSBzZXF1ZW5jZXM6XHJcblwKKyAgJWMuICAtIHRlcm1pbmF0ZSBjb25uZWN0aW9uIChhbmQgYW55IG11bHRpcGxleGVkIHNlc3Npb25zKVxyXG5cCisgICVjQiAgLSBzZW5kIGEgQlJFQUsgdG8gdGhlIHJlbW90ZSBzeXN0ZW1cclxuXAorICAlY0MgIC0gb3BlbiBhIGNvbW1hbmQgbGluZVxyXG5cCisgICVjUiAgLSBSZXF1ZXN0IHJla2V5IChTU0ggcHJvdG9jb2wgMiBvbmx5KVxyXG5cCisgICVjXlogLSBzdXNwZW5kIHNzaFxyXG5cCisgICVjIyAgLSBsaXN0IGZvcndhcmRlZCBjb25uZWN0aW9uc1xyXG5cCisgICVjJiAgLSBiYWNrZ3JvdW5kIHNzaCAod2hlbiB3YWl0aW5nIGZvciBjb25uZWN0aW9ucyB0byB0ZXJtaW5hdGUpXHJcblwKKyAgJWM/ICAtIHRoaXMgbWVzc2FnZVxyXG5cCisgICVjJWMgIC0gc2VuZCB0aGUgZXNjYXBlIGNoYXJhY3RlciBieSB0eXBpbmcgaXQgdHdpY2VcclxuXAorKE5vdGUgdGhhdCBlc2NhcGVzIGFyZSBvbmx5IHJlY29nbml6ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgbmV3bGluZS4pXHJcbiIsCisJCQkJCSAgICBlc2NhcGVfY2hhciwgZXNjYXBlX2NoYXIsCisJCQkJCSAgICBlc2NhcGVfY2hhciwgZXNjYXBlX2NoYXIsCisJCQkJCSAgICBlc2NhcGVfY2hhciwgZXNjYXBlX2NoYXIsCisJCQkJCSAgICBlc2NhcGVfY2hhciwgZXNjYXBlX2NoYXIsCisJCQkJCSAgICBlc2NhcGVfY2hhciwgZXNjYXBlX2NoYXIsCisJCQkJCSAgICBlc2NhcGVfY2hhcik7CisJCQkJfQorCQkJCWJ1ZmZlcl9hcHBlbmQoYmVyciwgc3RyaW5nLCBzdHJsZW4oc3RyaW5nKSk7CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgJyMnOgorCQkJCXNucHJpbnRmKHN0cmluZywgc2l6ZW9mIHN0cmluZywgIiVjI1xyXG4iLAorCQkJCSAgICBlc2NhcGVfY2hhcik7CisJCQkJYnVmZmVyX2FwcGVuZChiZXJyLCBzdHJpbmcsIHN0cmxlbihzdHJpbmcpKTsKKwkJCQlzID0gY2hhbm5lbF9vcGVuX21lc3NhZ2UoKTsKKwkJCQlidWZmZXJfYXBwZW5kKGJlcnIsIHMsIHN0cmxlbihzKSk7CisJCQkJeGZyZWUocyk7CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgJ0MnOgorCQkJCWlmIChjICYmIGMtPmN0bF9jaGFuICE9IC0xKQorCQkJCQlnb3RvIG5vZXNjYXBlOworCQkJCXByb2Nlc3NfY21kbGluZSgpOworCQkJCWNvbnRpbnVlOworCisJCQlkZWZhdWx0OgorCQkJCWlmIChjaCAhPSBlc2NhcGVfY2hhcikgeworCQkJCQlidWZmZXJfcHV0X2NoYXIoYmluLCBlc2NhcGVfY2hhcik7CisJCQkJCWJ5dGVzKys7CisJCQkJfQorCQkJCS8qIEVzY2FwZWQgY2hhcmFjdGVycyBmYWxsIHRocm91Z2ggaGVyZSAqLworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgd2FzIG5vdCBhbiBlc2NhcGUgY2hhci4KKwkJCSAqIENoZWNrIGlmIHRoaXMgaXMgYW4gZXNjYXBlLgorCQkJICovCisJCQlpZiAobGFzdF93YXNfY3IgJiYgY2ggPT0gZXNjYXBlX2NoYXIpIHsKKwkJCQkvKgorCQkJCSAqIEl0IGlzLiBTZXQgdGhlIGZsYWcgYW5kIGNvbnRpbnVlIHRvCisJCQkJICogbmV4dCBjaGFyYWN0ZXIuCisJCQkJICovCisJCQkJKmVzY2FwZV9wZW5kaW5ncCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBOb3JtYWwgY2hhcmFjdGVyLiAgUmVjb3JkIHdoZXRoZXIgaXQgd2FzIGEgbmV3bGluZSwKKwkJICogYW5kIGFwcGVuZCBpdCB0byB0aGUgYnVmZmVyLgorCQkgKi8KKwkJbGFzdF93YXNfY3IgPSAoY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXG4nKTsKKwkJYnVmZmVyX3B1dF9jaGFyKGJpbiwgY2gpOworCQlieXRlcysrOworCX0KKwlyZXR1cm4gYnl0ZXM7Cit9CisKK3N0YXRpYyB2b2lkCitjbGllbnRfcHJvY2Vzc19pbnB1dChmZF9zZXQgKnJlYWRzZXQpCit7CisJaW50IGxlbjsKKwljaGFyIGJ1ZltTU0hfSU9CVUZTWl07CisKKwkvKiBSZWFkIGlucHV0IGZyb20gc3RkaW4uICovCisJaWYgKEZEX0lTU0VUKGZpbGVubyhzdGRpbiksIHJlYWRzZXQpKSB7CisJCS8qIFJlYWQgYXMgbXVjaCBhcyBwb3NzaWJsZS4gKi8KKwkJbGVuID0gcmVhZChmaWxlbm8oc3RkaW4pLCBidWYsIHNpemVvZihidWYpKTsKKwkJaWYgKGxlbiA8IDAgJiYKKwkJICAgIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0spKQorCQkJcmV0dXJuOwkJLyogd2UnbGwgdHJ5IGFnYWluIGxhdGVyICovCisJCWlmIChsZW4gPD0gMCkgeworCQkJLyoKKwkJCSAqIFJlY2VpdmVkIEVPRiBvciBlcnJvci4gIFRoZXkgYXJlIHRyZWF0ZWQKKwkJCSAqIHNpbWlsYXJseSwgZXhjZXB0IHRoYXQgYW4gZXJyb3IgbWVzc2FnZSBpcyBwcmludGVkCisJCQkgKiBpZiBpdCB3YXMgYW4gZXJyb3IgY29uZGl0aW9uLgorCQkJICovCisJCQlpZiAobGVuIDwgMCkgeworCQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgInJlYWQ6ICUuMTAwc1xyXG4iLAorCQkJCSAgICBzdHJlcnJvcihlcnJubykpOworCQkJCWJ1ZmZlcl9hcHBlbmQoJnN0ZGVycl9idWZmZXIsIGJ1Ziwgc3RybGVuKGJ1ZikpOworCQkJfQorCQkJLyogTWFyayB0aGF0IHdlIGhhdmUgc2VlbiBFT0YuICovCisJCQlzdGRpbl9lb2YgPSAxOworCQkJLyoKKwkJCSAqIFNlbmQgYW4gRU9GIG1lc3NhZ2UgdG8gdGhlIHNlcnZlciB1bmxlc3MgdGhlcmUgaXMKKwkJCSAqIGRhdGEgaW4gdGhlIGJ1ZmZlci4gIElmIHRoZXJlIGlzIGRhdGEgaW4gdGhlCisJCQkgKiBidWZmZXIsIG5vIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IG5vdy4gIENvZGUKKwkJCSAqIGVsc2V3aGVyZSB3aWxsIHNlbmQgdGhlIEVPRiB3aGVuIHRoZSBidWZmZXIKKwkJCSAqIGJlY29tZXMgZW1wdHkgaWYgc3RkaW5fZW9mIGlzIHNldC4KKwkJCSAqLworCQkJaWYgKGJ1ZmZlcl9sZW4oJnN0ZGluX2J1ZmZlcikgPT0gMCkgeworCQkJCXBhY2tldF9zdGFydChTU0hfQ01TR19FT0YpOworCQkJCXBhY2tldF9zZW5kKCk7CisJCQl9CisJCX0gZWxzZSBpZiAoZXNjYXBlX2NoYXIxID09IFNTSF9FU0NBUEVDSEFSX05PTkUpIHsKKwkJCS8qCisJCQkgKiBOb3JtYWwgc3VjY2Vzc2Z1bCByZWFkLCBhbmQgbm8gZXNjYXBlIGNoYXJhY3Rlci4KKwkJCSAqIEp1c3QgYXBwZW5kIHRoZSBkYXRhIHRvIGJ1ZmZlci4KKwkJCSAqLworCQkJYnVmZmVyX2FwcGVuZCgmc3RkaW5fYnVmZmVyLCBidWYsIGxlbik7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogTm9ybWFsLCBzdWNjZXNzZnVsIHJlYWQuICBCdXQgd2UgaGF2ZSBhbiBlc2NhcGUKKwkJCSAqIGNoYXJhY3RlciBhbmQgaGF2ZSB0byBwcm9jZXNzIHRoZSBjaGFyYWN0ZXJzIG9uZQorCQkJICogYnkgb25lLgorCQkJICovCisJCQlpZiAocHJvY2Vzc19lc2NhcGVzKE5VTEwsICZzdGRpbl9idWZmZXIsCisJCQkgICAgJnN0ZG91dF9idWZmZXIsICZzdGRlcnJfYnVmZmVyLCBidWYsIGxlbikgPT0gLTEpCisJCQkJcmV0dXJuOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorY2xpZW50X3Byb2Nlc3Nfb3V0cHV0KGZkX3NldCAqd3JpdGVzZXQpCit7CisJaW50IGxlbjsKKwljaGFyIGJ1ZlsxMDBdOworCisJLyogV3JpdGUgYnVmZmVyZWQgb3V0cHV0IHRvIHN0ZG91dC4gKi8KKwlpZiAoRkRfSVNTRVQoZmlsZW5vKHN0ZG91dCksIHdyaXRlc2V0KSkgeworCQkvKiBXcml0ZSBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUuICovCisJCWxlbiA9IHdyaXRlKGZpbGVubyhzdGRvdXQpLCBidWZmZXJfcHRyKCZzdGRvdXRfYnVmZmVyKSwKKwkJICAgIGJ1ZmZlcl9sZW4oJnN0ZG91dF9idWZmZXIpKTsKKwkJaWYgKGxlbiA8PSAwKSB7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOIHx8CisJCQkgICAgZXJybm8gPT0gRVdPVUxEQkxPQ0spCisJCQkJbGVuID0gMDsKKwkJCWVsc2UgeworCQkJCS8qCisJCQkJICogQW4gZXJyb3Igb3IgRU9GIHdhcyBlbmNvdW50ZXJlZC4gIFB1dCBhbgorCQkJCSAqIGVycm9yIG1lc3NhZ2UgdG8gc3RkZXJyIGJ1ZmZlci4KKwkJCQkgKi8KKwkJCQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsCisJCQkJICAgICJ3cml0ZSBzdGRvdXQ6ICUuNTBzXHJcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJYnVmZmVyX2FwcGVuZCgmc3RkZXJyX2J1ZmZlciwgYnVmLCBzdHJsZW4oYnVmKSk7CisJCQkJcXVpdF9wZW5kaW5nID0gMTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJLyogQ29uc3VtZSBwcmludGVkIGRhdGEgZnJvbSB0aGUgYnVmZmVyLiAqLworCQlidWZmZXJfY29uc3VtZSgmc3Rkb3V0X2J1ZmZlciwgbGVuKTsKKwl9CisJLyogV3JpdGUgYnVmZmVyZWQgb3V0cHV0IHRvIHN0ZGVyci4gKi8KKwlpZiAoRkRfSVNTRVQoZmlsZW5vKHN0ZGVyciksIHdyaXRlc2V0KSkgeworCQkvKiBXcml0ZSBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUuICovCisJCWxlbiA9IHdyaXRlKGZpbGVubyhzdGRlcnIpLCBidWZmZXJfcHRyKCZzdGRlcnJfYnVmZmVyKSwKKwkJICAgIGJ1ZmZlcl9sZW4oJnN0ZGVycl9idWZmZXIpKTsKKwkJaWYgKGxlbiA8PSAwKSB7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOIHx8CisJCQkgICAgZXJybm8gPT0gRVdPVUxEQkxPQ0spCisJCQkJbGVuID0gMDsKKwkJCWVsc2UgeworCQkJCS8qCisJCQkJICogRU9GIG9yIGVycm9yLCBidXQgY2FuJ3QgZXZlbiBwcmludAorCQkJCSAqIGVycm9yIG1lc3NhZ2UuCisJCQkJICovCisJCQkJcXVpdF9wZW5kaW5nID0gMTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJLyogQ29uc3VtZSBwcmludGVkIGNoYXJhY3RlcnMgZnJvbSB0aGUgYnVmZmVyLiAqLworCQlidWZmZXJfY29uc3VtZSgmc3RkZXJyX2J1ZmZlciwgbGVuKTsKKwl9Cit9CisKKy8qCisgKiBHZXQgcGFja2V0cyBmcm9tIHRoZSBjb25uZWN0aW9uIGlucHV0IGJ1ZmZlciwgYW5kIHByb2Nlc3MgdGhlbSBhcyBsb25nIGFzCisgKiB0aGVyZSBhcmUgcGFja2V0cyBhdmFpbGFibGUuCisgKgorICogQW55IHVua25vd24gcGFja2V0cyByZWNlaXZlZCBkdXJpbmcgdGhlIGFjdHVhbAorICogc2Vzc2lvbiBjYXVzZSB0aGUgc2Vzc2lvbiB0byB0ZXJtaW5hdGUuICBUaGlzIGlzCisgKiBpbnRlbmRlZCB0byBtYWtlIGRlYnVnZ2luZyBlYXNpZXIgc2luY2Ugbm8KKyAqIGNvbmZpcm1hdGlvbnMgYXJlIHNlbnQuICBBbnkgY29tcGF0aWJsZSBwcm90b2NvbAorICogZXh0ZW5zaW9ucyBtdXN0IGJlIG5lZ290aWF0ZWQgZHVyaW5nIHRoZQorICogcHJlcGFyYXRvcnkgcGhhc2UuCisgKi8KKworc3RhdGljIHZvaWQKK2NsaWVudF9wcm9jZXNzX2J1ZmZlcmVkX2lucHV0X3BhY2tldHModm9pZCkKK3sKKwlkaXNwYXRjaF9ydW4oRElTUEFUQ0hfTk9OQkxPQ0ssICZxdWl0X3BlbmRpbmcsCisJICAgIGNvbXBhdDIwID8geHh4X2tleCA6IE5VTEwpOworfQorCisvKiBzY2FuIGJ1ZltdIGZvciAnficgYmVmb3JlIHNlbmRpbmcgZGF0YSB0byB0aGUgcGVlciAqLworCisvKiBIZWxwZXI6IGFsbG9jYXRlIGEgbmV3IGVzY2FwZV9maWx0ZXJfY3R4IGFuZCBmaWxsIGluIGl0cyBlc2NhcGUgY2hhciAqLwordm9pZCAqCitjbGllbnRfbmV3X2VzY2FwZV9maWx0ZXJfY3R4KGludCBlc2NhcGVfY2hhcikKK3sKKwlzdHJ1Y3QgZXNjYXBlX2ZpbHRlcl9jdHggKnJldDsKKworCXJldCA9IHhtYWxsb2Moc2l6ZW9mKCpyZXQpKTsKKwlyZXQtPmVzY2FwZV9wZW5kaW5nID0gMDsKKwlyZXQtPmVzY2FwZV9jaGFyID0gZXNjYXBlX2NoYXI7CisJcmV0dXJuICh2b2lkICopcmV0OworfQorCisvKiBGcmVlIHRoZSBlc2NhcGUgZmlsdGVyIGNvbnRleHQgb24gY2hhbm5lbCBmcmVlICovCit2b2lkCitjbGllbnRfZmlsdGVyX2NsZWFudXAoaW50IGNpZCwgdm9pZCAqY3R4KQoreworCXhmcmVlKGN0eCk7Cit9CisKK2ludAorY2xpZW50X3NpbXBsZV9lc2NhcGVfZmlsdGVyKENoYW5uZWwgKmMsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpZiAoYy0+ZXh0ZW5kZWRfdXNhZ2UgIT0gQ0hBTl9FWFRFTkRFRF9XUklURSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gcHJvY2Vzc19lc2NhcGVzKGMsICZjLT5pbnB1dCwgJmMtPm91dHB1dCwgJmMtPmV4dGVuZGVkLAorCSAgICBidWYsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkCitjbGllbnRfY2hhbm5lbF9jbG9zZWQoaW50IGlkLCB2b2lkICphcmcpCit7CisJY2hhbm5lbF9jYW5jZWxfY2xlYW51cChpZCk7CisJc2Vzc2lvbl9jbG9zZWQgPSAxOworCWxlYXZlX3Jhd19tb2RlKG9wdGlvbnMucmVxdWVzdF90dHkgPT0gUkVRVUVTVF9UVFlfRk9SQ0UpOworfQorCisvKgorICogSW1wbGVtZW50cyB0aGUgaW50ZXJhY3RpdmUgc2Vzc2lvbiB3aXRoIHRoZSBzZXJ2ZXIuICBUaGlzIGlzIGNhbGxlZCBhZnRlcgorICogdGhlIHVzZXIgaGFzIGJlZW4gYXV0aGVudGljYXRlZCwgYW5kIGEgY29tbWFuZCBoYXMgYmVlbiBzdGFydGVkIG9uIHRoZQorICogcmVtb3RlIGhvc3QuICBJZiBlc2NhcGVfY2hhciAhPSBTU0hfRVNDQVBFQ0hBUl9OT05FLCBpdCBpcyB0aGUgY2hhcmFjdGVyCisgKiB1c2VkIGFzIGFuIGVzY2FwZSBjaGFyYWN0ZXIgZm9yIHRlcm1pbmF0aW5nIG9yIHN1c3BlbmRpbmcgdGhlIHNlc3Npb24uCisgKi8KKworaW50CitjbGllbnRfbG9vcChpbnQgaGF2ZV9wdHksIGludCBlc2NhcGVfY2hhcl9hcmcsIGludCBzc2gyX2NoYW5faWQpCit7CisJZmRfc2V0ICpyZWFkc2V0ID0gTlVMTCwgKndyaXRlc2V0ID0gTlVMTDsKKwlkb3VibGUgc3RhcnRfdGltZSwgdG90YWxfdGltZTsKKwlpbnQgbWF4X2ZkID0gMCwgbWF4X2ZkMiA9IDAsIGxlbiwgcmVrZXlpbmcgPSAwOworCXVfaW50NjRfdCBpYnl0ZXMsIG9ieXRlczsKKwl1X2ludCBuYWxsb2MgPSAwOworCWNoYXIgYnVmWzEwMF07CisKKwlkZWJ1ZygiRW50ZXJpbmcgaW50ZXJhY3RpdmUgc2Vzc2lvbi4iKTsKKworCXN0YXJ0X3RpbWUgPSBnZXRfY3VycmVudF90aW1lKCk7CisKKwkvKiBJbml0aWFsaXplIHZhcmlhYmxlcy4gKi8KKwllc2NhcGVfcGVuZGluZzEgPSAwOworCWxhc3Rfd2FzX2NyID0gMTsKKwlleGl0X3N0YXR1cyA9IC0xOworCXN0ZGluX2VvZiA9IDA7CisJYnVmZmVyX2hpZ2ggPSA2NCAqIDEwMjQ7CisJY29ubmVjdGlvbl9pbiA9IHBhY2tldF9nZXRfY29ubmVjdGlvbl9pbigpOworCWNvbm5lY3Rpb25fb3V0ID0gcGFja2V0X2dldF9jb25uZWN0aW9uX291dCgpOworCW1heF9mZCA9IE1BWChjb25uZWN0aW9uX2luLCBjb25uZWN0aW9uX291dCk7CisKKwlpZiAoIWNvbXBhdDIwKSB7CisJCS8qIGVuYWJsZSBub25ibG9ja2luZyB1bmxlc3MgdHR5ICovCisJCWlmICghaXNhdHR5KGZpbGVubyhzdGRpbikpKQorCQkJc2V0X25vbmJsb2NrKGZpbGVubyhzdGRpbikpOworCQlpZiAoIWlzYXR0eShmaWxlbm8oc3Rkb3V0KSkpCisJCQlzZXRfbm9uYmxvY2soZmlsZW5vKHN0ZG91dCkpOworCQlpZiAoIWlzYXR0eShmaWxlbm8oc3RkZXJyKSkpCisJCQlzZXRfbm9uYmxvY2soZmlsZW5vKHN0ZGVycikpOworCQltYXhfZmQgPSBNQVgobWF4X2ZkLCBmaWxlbm8oc3RkaW4pKTsKKwkJbWF4X2ZkID0gTUFYKG1heF9mZCwgZmlsZW5vKHN0ZG91dCkpOworCQltYXhfZmQgPSBNQVgobWF4X2ZkLCBmaWxlbm8oc3RkZXJyKSk7CisJfQorCXF1aXRfcGVuZGluZyA9IDA7CisJZXNjYXBlX2NoYXIxID0gZXNjYXBlX2NoYXJfYXJnOworCisJLyogSW5pdGlhbGl6ZSBidWZmZXJzLiAqLworCWJ1ZmZlcl9pbml0KCZzdGRpbl9idWZmZXIpOworCWJ1ZmZlcl9pbml0KCZzdGRvdXRfYnVmZmVyKTsKKwlidWZmZXJfaW5pdCgmc3RkZXJyX2J1ZmZlcik7CisKKwljbGllbnRfaW5pdF9kaXNwYXRjaCgpOworCisJLyoKKwkgKiBTZXQgc2lnbmFsIGhhbmRsZXJzLCAoZS5nLiB0byByZXN0b3JlIG5vbi1ibG9ja2luZyBtb2RlKQorCSAqIGJ1dCBkb24ndCBvdmVyd3JpdGUgU0lHX0lHTiwgbWF0Y2hlcyBiZWhhdmlvdXIgZnJvbSByc2goMSkKKwkgKi8KKwlpZiAoc2lnbmFsKFNJR0hVUCwgU0lHX0lHTikgIT0gU0lHX0lHTikKKwkJc2lnbmFsKFNJR0hVUCwgc2lnbmFsX2hhbmRsZXIpOworCWlmIChzaWduYWwoU0lHSU5ULCBTSUdfSUdOKSAhPSBTSUdfSUdOKQorCQlzaWduYWwoU0lHSU5ULCBzaWduYWxfaGFuZGxlcik7CisJaWYgKHNpZ25hbChTSUdRVUlULCBTSUdfSUdOKSAhPSBTSUdfSUdOKQorCQlzaWduYWwoU0lHUVVJVCwgc2lnbmFsX2hhbmRsZXIpOworCWlmIChzaWduYWwoU0lHVEVSTSwgU0lHX0lHTikgIT0gU0lHX0lHTikKKwkJc2lnbmFsKFNJR1RFUk0sIHNpZ25hbF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHV0lOQ0gsIHdpbmRvd19jaGFuZ2VfaGFuZGxlcik7CisKKwlpZiAoaGF2ZV9wdHkpCisJCWVudGVyX3Jhd19tb2RlKG9wdGlvbnMucmVxdWVzdF90dHkgPT0gUkVRVUVTVF9UVFlfRk9SQ0UpOworCisJaWYgKGNvbXBhdDIwKSB7CisJCXNlc3Npb25faWRlbnQgPSBzc2gyX2NoYW5faWQ7CisJCWlmIChzZXNzaW9uX2lkZW50ICE9IC0xKSB7CisJCQlpZiAoZXNjYXBlX2NoYXJfYXJnICE9IFNTSF9FU0NBUEVDSEFSX05PTkUpIHsKKwkJCQljaGFubmVsX3JlZ2lzdGVyX2ZpbHRlcihzZXNzaW9uX2lkZW50LAorCQkJCSAgICBjbGllbnRfc2ltcGxlX2VzY2FwZV9maWx0ZXIsIE5VTEwsCisJCQkJICAgIGNsaWVudF9maWx0ZXJfY2xlYW51cCwKKwkJCQkgICAgY2xpZW50X25ld19lc2NhcGVfZmlsdGVyX2N0eCgKKwkJCQkgICAgZXNjYXBlX2NoYXJfYXJnKSk7CisJCQl9CisJCQljaGFubmVsX3JlZ2lzdGVyX2NsZWFudXAoc2Vzc2lvbl9pZGVudCwKKwkJCSAgICBjbGllbnRfY2hhbm5lbF9jbG9zZWQsIDApOworCQl9CisJfSBlbHNlIHsKKwkJLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIGltbWVkaWF0ZWx5IHNlbmQgZW9mIG9uIHN0ZGluLiAqLworCQljbGllbnRfY2hlY2tfaW5pdGlhbF9lb2Zfb25fc3RkaW4oKTsKKwl9CisKKwkvKiBNYWluIGxvb3Agb2YgdGhlIGNsaWVudCBmb3IgdGhlIGludGVyYWN0aXZlIHNlc3Npb24gbW9kZS4gKi8KKwl3aGlsZSAoIXF1aXRfcGVuZGluZykgeworCisJCS8qIFByb2Nlc3MgYnVmZmVyZWQgcGFja2V0cyBzZW50IGJ5IHRoZSBzZXJ2ZXIuICovCisJCWNsaWVudF9wcm9jZXNzX2J1ZmZlcmVkX2lucHV0X3BhY2tldHMoKTsKKworCQlpZiAoY29tcGF0MjAgJiYgc2Vzc2lvbl9jbG9zZWQgJiYgIWNoYW5uZWxfc3RpbGxfb3BlbigpKQorCQkJYnJlYWs7CisKKwkJcmVrZXlpbmcgPSAoeHh4X2tleCAhPSBOVUxMICYmICF4eHhfa2V4LT5kb25lKTsKKworCQlpZiAocmVrZXlpbmcpIHsKKwkJCWRlYnVnKCJyZWtleWluZyBpbiBwcm9ncmVzcyIpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIE1ha2UgcGFja2V0cyBvZiBidWZmZXJlZCBzdGRpbiBkYXRhLCBhbmQgYnVmZmVyCisJCQkgKiB0aGVtIGZvciBzZW5kaW5nIHRvIHRoZSBzZXJ2ZXIuCisJCQkgKi8KKwkJCWlmICghY29tcGF0MjApCisJCQkJY2xpZW50X21ha2VfcGFja2V0c19mcm9tX3N0ZGluX2RhdGEoKTsKKworCQkJLyoKKwkJCSAqIE1ha2UgcGFja2V0cyBmcm9tIGJ1ZmZlcmVkIGNoYW5uZWwgZGF0YSwgYW5kCisJCQkgKiBlbnF1ZXVlIHRoZW0gZm9yIHNlbmRpbmcgdG8gdGhlIHNlcnZlci4KKwkJCSAqLworCQkJaWYgKHBhY2tldF9ub3RfdmVyeV9tdWNoX2RhdGFfdG9fd3JpdGUoKSkKKwkJCQljaGFubmVsX291dHB1dF9wb2xsKCk7CisKKwkJCS8qCisJCQkgKiBDaGVjayBpZiB0aGUgd2luZG93IHNpemUgaGFzIGNoYW5nZWQsIGFuZCBidWZmZXIgYQorCQkJICogbWVzc2FnZSBhYm91dCBpdCB0byB0aGUgc2VydmVyIGlmIHNvLgorCQkJICovCisJCQljbGllbnRfY2hlY2tfd2luZG93X2NoYW5nZSgpOworCisJCQlpZiAocXVpdF9wZW5kaW5nKQorCQkJCWJyZWFrOworCQl9CisJCS8qCisJCSAqIFdhaXQgdW50aWwgd2UgaGF2ZSBzb21ldGhpbmcgdG8gZG8gKHNvbWV0aGluZyBiZWNvbWVzCisJCSAqIGF2YWlsYWJsZSBvbiBvbmUgb2YgdGhlIGRlc2NyaXB0b3JzKS4KKwkJICovCisJCW1heF9mZDIgPSBtYXhfZmQ7CisJCWNsaWVudF93YWl0X3VudGlsX2Nhbl9kb19zb21ldGhpbmcoJnJlYWRzZXQsICZ3cml0ZXNldCwKKwkJICAgICZtYXhfZmQyLCAmbmFsbG9jLCByZWtleWluZyk7CisKKwkJaWYgKHF1aXRfcGVuZGluZykKKwkJCWJyZWFrOworCisJCS8qIERvIGNoYW5uZWwgb3BlcmF0aW9ucyB1bmxlc3MgcmVrZXlpbmcgaW4gcHJvZ3Jlc3MuICovCisJCWlmICghcmVrZXlpbmcpIHsKKwkJCWNoYW5uZWxfYWZ0ZXJfc2VsZWN0KHJlYWRzZXQsIHdyaXRlc2V0KTsKKwkJCWlmIChuZWVkX3Jla2V5aW5nIHx8IHBhY2tldF9uZWVkX3Jla2V5aW5nKCkpIHsKKwkJCQlkZWJ1ZygibmVlZCByZWtleWluZyIpOworCQkJCXh4eF9rZXgtPmRvbmUgPSAwOworCQkJCWtleF9zZW5kX2tleGluaXQoeHh4X2tleCk7CisJCQkJbmVlZF9yZWtleWluZyA9IDA7CisJCQl9CisJCX0KKworCQkvKiBCdWZmZXIgaW5wdXQgZnJvbSB0aGUgY29ubmVjdGlvbi4gICovCisJCWNsaWVudF9wcm9jZXNzX25ldF9pbnB1dChyZWFkc2V0KTsKKworCQlpZiAocXVpdF9wZW5kaW5nKQorCQkJYnJlYWs7CisKKwkJaWYgKCFjb21wYXQyMCkgeworCQkJLyogQnVmZmVyIGRhdGEgZnJvbSBzdGRpbiAqLworCQkJY2xpZW50X3Byb2Nlc3NfaW5wdXQocmVhZHNldCk7CisJCQkvKgorCQkJICogUHJvY2VzcyBvdXRwdXQgdG8gc3Rkb3V0IGFuZCBzdGRlcnIuICBPdXRwdXQgdG8KKwkJCSAqIHRoZSBjb25uZWN0aW9uIGlzIHByb2Nlc3NlZCBlbHNld2hlcmUgKGFib3ZlKS4KKwkJCSAqLworCQkJY2xpZW50X3Byb2Nlc3Nfb3V0cHV0KHdyaXRlc2V0KTsKKwkJfQorCisJCWlmIChzZXNzaW9uX3Jlc3VtZWQpIHsKKwkJCWNvbm5lY3Rpb25faW4gPSBwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25faW4oKTsKKwkJCWNvbm5lY3Rpb25fb3V0ID0gcGFja2V0X2dldF9jb25uZWN0aW9uX291dCgpOworCQkJbWF4X2ZkID0gTUFYKG1heF9mZCwgY29ubmVjdGlvbl9vdXQpOworCQkJbWF4X2ZkID0gTUFYKG1heF9mZCwgY29ubmVjdGlvbl9pbik7CisJCQlzZXNzaW9uX3Jlc3VtZWQgPSAwOworCQl9CisKKwkJLyoKKwkJICogU2VuZCBhcyBtdWNoIGJ1ZmZlcmVkIHBhY2tldCBkYXRhIGFzIHBvc3NpYmxlIHRvIHRoZQorCQkgKiBzZW5kZXIuCisJCSAqLworCQlpZiAoRkRfSVNTRVQoY29ubmVjdGlvbl9vdXQsIHdyaXRlc2V0KSkKKwkJCXBhY2tldF93cml0ZV9wb2xsKCk7CisKKwkJLyoKKwkJICogSWYgd2UgYXJlIGEgYmFja2dyb3VuZGVkIGNvbnRyb2wgbWFzdGVyLCBhbmQgdGhlCisJCSAqIHRpbWVvdXQgaGFzIGV4cGlyZWQgd2l0aG91dCBhbnkgYWN0aXZlIGNsaWVudAorCQkgKiBjb25uZWN0aW9ucywgdGhlbiBxdWl0LgorCQkgKi8KKwkJaWYgKGNvbnRyb2xfcGVyc2lzdF9leGl0X3RpbWUgPiAwKSB7CisJCQlpZiAodGltZShOVUxMKSA+PSBjb250cm9sX3BlcnNpc3RfZXhpdF90aW1lKSB7CisJCQkJZGVidWcoIkNvbnRyb2xQZXJzaXN0IHRpbWVvdXQgZXhwaXJlZCIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWlmIChyZWFkc2V0KQorCQl4ZnJlZShyZWFkc2V0KTsKKwlpZiAod3JpdGVzZXQpCisJCXhmcmVlKHdyaXRlc2V0KTsKKworCS8qIFRlcm1pbmF0ZSB0aGUgc2Vzc2lvbi4gKi8KKworCS8qIFN0b3Agd2F0Y2hpbmcgZm9yIHdpbmRvdyBjaGFuZ2UuICovCisJc2lnbmFsKFNJR1dJTkNILCBTSUdfREZMKTsKKworCWlmIChjb21wYXQyMCkgeworCQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfRElTQ09OTkVDVCk7CisJCXBhY2tldF9wdXRfaW50KFNTSDJfRElTQ09OTkVDVF9CWV9BUFBMSUNBVElPTik7CisJCXBhY2tldF9wdXRfY3N0cmluZygiZGlzY29ubmVjdGVkIGJ5IHVzZXIiKTsKKwkJcGFja2V0X3B1dF9jc3RyaW5nKCIiKTsgLyogbGFuZ3VhZ2UgdGFnICovCisJCXBhY2tldF9zZW5kKCk7CisJCXBhY2tldF93cml0ZV93YWl0KCk7CisJfQorCisJY2hhbm5lbF9mcmVlX2FsbCgpOworCisJaWYgKGhhdmVfcHR5KQorCQlsZWF2ZV9yYXdfbW9kZShvcHRpb25zLnJlcXVlc3RfdHR5ID09IFJFUVVFU1RfVFRZX0ZPUkNFKTsKKworCS8qIHJlc3RvcmUgYmxvY2tpbmcgaW8gKi8KKwlpZiAoIWlzYXR0eShmaWxlbm8oc3RkaW4pKSkKKwkJdW5zZXRfbm9uYmxvY2soZmlsZW5vKHN0ZGluKSk7CisJaWYgKCFpc2F0dHkoZmlsZW5vKHN0ZG91dCkpKQorCQl1bnNldF9ub25ibG9jayhmaWxlbm8oc3Rkb3V0KSk7CisJaWYgKCFpc2F0dHkoZmlsZW5vKHN0ZGVycikpKQorCQl1bnNldF9ub25ibG9jayhmaWxlbm8oc3RkZXJyKSk7CisKKwkvKgorCSAqIElmIHRoZXJlIHdhcyBubyBzaGVsbCBvciBjb21tYW5kIHJlcXVlc3RlZCwgdGhlcmUgd2lsbCBiZSBubyByZW1vdGUKKwkgKiBleGl0IHN0YXR1cyB0byBiZSByZXR1cm5lZC4gIEluIHRoYXQgY2FzZSwgY2xlYXIgZXJyb3IgY29kZSBpZiB0aGUKKwkgKiBjb25uZWN0aW9uIHdhcyBkZWxpYmVyYXRlbHkgdGVybWluYXRlZCBhdCB0aGlzIGVuZC4KKwkgKi8KKwlpZiAobm9fc2hlbGxfZmxhZyAmJiByZWNlaXZlZF9zaWduYWwgPT0gU0lHVEVSTSkgeworCQlyZWNlaXZlZF9zaWduYWwgPSAwOworCQlleGl0X3N0YXR1cyA9IDA7CisJfQorCisJaWYgKHJlY2VpdmVkX3NpZ25hbCkKKwkJZmF0YWwoIktpbGxlZCBieSBzaWduYWwgJWQuIiwgKGludCkgcmVjZWl2ZWRfc2lnbmFsKTsKKworCS8qCisJICogSW4gaW50ZXJhY3RpdmUgbW9kZSAod2l0aCBwc2V1ZG8gdHR5KSBkaXNwbGF5IGEgbWVzc2FnZSBpbmRpY2F0aW5nCisJICogdGhhdCB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQuCisJICovCisJaWYgKGhhdmVfcHR5ICYmIG9wdGlvbnMubG9nX2xldmVsICE9IFNZU0xPR19MRVZFTF9RVUlFVCkgeworCQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsCisJCSAgICAiQ29ubmVjdGlvbiB0byAlLjY0cyBjbG9zZWQuXHJcbiIsIGhvc3QpOworCQlidWZmZXJfYXBwZW5kKCZzdGRlcnJfYnVmZmVyLCBidWYsIHN0cmxlbihidWYpKTsKKwl9CisKKwkvKiBPdXRwdXQgYW55IGJ1ZmZlcmVkIGRhdGEgZm9yIHN0ZG91dC4gKi8KKwlpZiAoYnVmZmVyX2xlbigmc3Rkb3V0X2J1ZmZlcikgPiAwKSB7CisJCWxlbiA9IGF0b21pY2lvKHZ3cml0ZSwgZmlsZW5vKHN0ZG91dCksCisJCSAgICBidWZmZXJfcHRyKCZzdGRvdXRfYnVmZmVyKSwgYnVmZmVyX2xlbigmc3Rkb3V0X2J1ZmZlcikpOworCQlpZiAobGVuIDwgMCB8fCAodV9pbnQpbGVuICE9IGJ1ZmZlcl9sZW4oJnN0ZG91dF9idWZmZXIpKQorCQkJZXJyb3IoIldyaXRlIGZhaWxlZCBmbHVzaGluZyBzdGRvdXQgYnVmZmVyLiIpOworCQllbHNlCisJCQlidWZmZXJfY29uc3VtZSgmc3Rkb3V0X2J1ZmZlciwgbGVuKTsKKwl9CisKKwkvKiBPdXRwdXQgYW55IGJ1ZmZlcmVkIGRhdGEgZm9yIHN0ZGVyci4gKi8KKwlpZiAoYnVmZmVyX2xlbigmc3RkZXJyX2J1ZmZlcikgPiAwKSB7CisJCWxlbiA9IGF0b21pY2lvKHZ3cml0ZSwgZmlsZW5vKHN0ZGVyciksCisJCSAgICBidWZmZXJfcHRyKCZzdGRlcnJfYnVmZmVyKSwgYnVmZmVyX2xlbigmc3RkZXJyX2J1ZmZlcikpOworCQlpZiAobGVuIDwgMCB8fCAodV9pbnQpbGVuICE9IGJ1ZmZlcl9sZW4oJnN0ZGVycl9idWZmZXIpKQorCQkJZXJyb3IoIldyaXRlIGZhaWxlZCBmbHVzaGluZyBzdGRlcnIgYnVmZmVyLiIpOworCQllbHNlCisJCQlidWZmZXJfY29uc3VtZSgmc3RkZXJyX2J1ZmZlciwgbGVuKTsKKwl9CisKKwkvKiBDbGVhciBhbmQgZnJlZSBhbnkgYnVmZmVycy4gKi8KKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJYnVmZmVyX2ZyZWUoJnN0ZGluX2J1ZmZlcik7CisJYnVmZmVyX2ZyZWUoJnN0ZG91dF9idWZmZXIpOworCWJ1ZmZlcl9mcmVlKCZzdGRlcnJfYnVmZmVyKTsKKworCS8qIFJlcG9ydCBieXRlcyB0cmFuc2ZlcnJlZCwgYW5kIHRyYW5zZmVyIHJhdGVzLiAqLworCXRvdGFsX3RpbWUgPSBnZXRfY3VycmVudF90aW1lKCkgLSBzdGFydF90aW1lOworCXBhY2tldF9nZXRfc3RhdGUoTU9ERV9JTiwgTlVMTCwgTlVMTCwgTlVMTCwgJmlieXRlcyk7CisJcGFja2V0X2dldF9zdGF0ZShNT0RFX09VVCwgTlVMTCwgTlVMTCwgTlVMTCwgJm9ieXRlcyk7CisJdmVyYm9zZSgiVHJhbnNmZXJyZWQ6IHNlbnQgJWxsdSwgcmVjZWl2ZWQgJWxsdSBieXRlcywgaW4gJS4xZiBzZWNvbmRzIiwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvYnl0ZXMsICh1bnNpZ25lZCBsb25nIGxvbmcpaWJ5dGVzLCB0b3RhbF90aW1lKTsKKwlpZiAodG90YWxfdGltZSA+IDApCisJCXZlcmJvc2UoIkJ5dGVzIHBlciBzZWNvbmQ6IHNlbnQgJS4xZiwgcmVjZWl2ZWQgJS4xZiIsCisJCSAgICBvYnl0ZXMgLyB0b3RhbF90aW1lLCBpYnl0ZXMgLyB0b3RhbF90aW1lKTsKKwkvKiBSZXR1cm4gdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBwcm9ncmFtLiAqLworCWRlYnVnKCJFeGl0IHN0YXR1cyAlZCIsIGV4aXRfc3RhdHVzKTsKKwlyZXR1cm4gZXhpdF9zdGF0dXM7Cit9CisKKy8qKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitjbGllbnRfaW5wdXRfc3Rkb3V0X2RhdGEoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCit7CisJdV9pbnQgZGF0YV9sZW47CisJY2hhciAqZGF0YSA9IHBhY2tldF9nZXRfc3RyaW5nKCZkYXRhX2xlbik7CisJcGFja2V0X2NoZWNrX2VvbSgpOworCWJ1ZmZlcl9hcHBlbmQoJnN0ZG91dF9idWZmZXIsIGRhdGEsIGRhdGFfbGVuKTsKKwltZW1zZXQoZGF0YSwgMCwgZGF0YV9sZW4pOworCXhmcmVlKGRhdGEpOworfQorc3RhdGljIHZvaWQKK2NsaWVudF9pbnB1dF9zdGRlcnJfZGF0YShpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKK3sKKwl1X2ludCBkYXRhX2xlbjsKKwljaGFyICpkYXRhID0gcGFja2V0X2dldF9zdHJpbmcoJmRhdGFfbGVuKTsKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisJYnVmZmVyX2FwcGVuZCgmc3RkZXJyX2J1ZmZlciwgZGF0YSwgZGF0YV9sZW4pOworCW1lbXNldChkYXRhLCAwLCBkYXRhX2xlbik7CisJeGZyZWUoZGF0YSk7Cit9CitzdGF0aWMgdm9pZAorY2xpZW50X2lucHV0X2V4aXRfc3RhdHVzKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQoreworCWV4aXRfc3RhdHVzID0gcGFja2V0X2dldF9pbnQoKTsKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisJLyogQWNrbm93bGVkZ2UgdGhlIGV4aXQuICovCisJcGFja2V0X3N0YXJ0KFNTSF9DTVNHX0VYSVRfQ09ORklSTUFUSU9OKTsKKwlwYWNrZXRfc2VuZCgpOworCS8qCisJICogTXVzdCB3YWl0IGZvciBwYWNrZXQgdG8gYmUgc2VudCBzaW5jZSB3ZSBhcmUKKwkgKiBleGl0aW5nIHRoZSBsb29wLgorCSAqLworCXBhY2tldF93cml0ZV93YWl0KCk7CisJLyogRmxhZyB0aGF0IHdlIHdhbnQgdG8gZXhpdC4gKi8KKwlxdWl0X3BlbmRpbmcgPSAxOworfQorc3RhdGljIHZvaWQKK2NsaWVudF9pbnB1dF9hZ2VudF9vcGVuKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQoreworCUNoYW5uZWwgKmMgPSBOVUxMOworCWludCByZW1vdGVfaWQsIHNvY2s7CisKKwkvKiBSZWFkIHRoZSByZW1vdGUgY2hhbm5lbCBudW1iZXIgZnJvbSB0aGUgbWVzc2FnZS4gKi8KKwlyZW1vdGVfaWQgPSBwYWNrZXRfZ2V0X2ludCgpOworCXBhY2tldF9jaGVja19lb20oKTsKKworCS8qCisJICogR2V0IGEgY29ubmVjdGlvbiB0byB0aGUgbG9jYWwgYXV0aGVudGljYXRpb24gYWdlbnQgKHRoaXMgbWF5IGFnYWluCisJICogZ2V0IGZvcndhcmRlZCkuCisJICovCisJc29jayA9IHNzaF9nZXRfYXV0aGVudGljYXRpb25fc29ja2V0KCk7CisKKwkvKgorCSAqIElmIHdlIGNvdWxkIG5vdCBjb25uZWN0IHRoZSBhZ2VudCwgc2VuZCBhbiBlcnJvciBtZXNzYWdlIGJhY2sgdG8KKwkgKiB0aGUgc2VydmVyLiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gdW5sZXNzIHRoZSBhZ2VudCBkaWVzLAorCSAqIGJlY2F1c2UgYXV0aGVudGljYXRpb24gZm9yd2FyZGluZyBpcyBvbmx5IGVuYWJsZWQgaWYgd2UgaGF2ZSBhbgorCSAqIGFnZW50LgorCSAqLworCWlmIChzb2NrID49IDApIHsKKwkJYyA9IGNoYW5uZWxfbmV3KCIiLCBTU0hfQ0hBTk5FTF9PUEVOLCBzb2NrLCBzb2NrLAorCQkgICAgLTEsIDAsIDAsIDAsICJhdXRoZW50aWNhdGlvbiBhZ2VudCBjb25uZWN0aW9uIiwgMSk7CisJCWMtPnJlbW90ZV9pZCA9IHJlbW90ZV9pZDsKKwkJYy0+Zm9yY2VfZHJhaW4gPSAxOworCX0KKwlpZiAoYyA9PSBOVUxMKSB7CisJCXBhY2tldF9zdGFydChTU0hfTVNHX0NIQU5ORUxfT1BFTl9GQUlMVVJFKTsKKwkJcGFja2V0X3B1dF9pbnQocmVtb3RlX2lkKTsKKwl9IGVsc2UgeworCQkvKiBTZW5kIGEgY29uZmlybWF0aW9uIHRvIHRoZSByZW1vdGUgaG9zdC4gKi8KKwkJZGVidWcoIkZvcndhcmRpbmcgYXV0aGVudGljYXRpb24gY29ubmVjdGlvbi4iKTsKKwkJcGFja2V0X3N0YXJ0KFNTSF9NU0dfQ0hBTk5FTF9PUEVOX0NPTkZJUk1BVElPTik7CisJCXBhY2tldF9wdXRfaW50KHJlbW90ZV9pZCk7CisJCXBhY2tldF9wdXRfaW50KGMtPnNlbGYpOworCX0KKwlwYWNrZXRfc2VuZCgpOworfQorCitzdGF0aWMgQ2hhbm5lbCAqCitjbGllbnRfcmVxdWVzdF9mb3J3YXJkZWRfdGNwaXAoY29uc3QgY2hhciAqcmVxdWVzdF90eXBlLCBpbnQgcmNoYW4pCit7CisJQ2hhbm5lbCAqYyA9IE5VTEw7CisJY2hhciAqbGlzdGVuX2FkZHJlc3MsICpvcmlnaW5hdG9yX2FkZHJlc3M7CisJdV9zaG9ydCBsaXN0ZW5fcG9ydCwgb3JpZ2luYXRvcl9wb3J0OworCisJLyogR2V0IHJlc3Qgb2YgdGhlIHBhY2tldCAqLworCWxpc3Rlbl9hZGRyZXNzID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7CisJbGlzdGVuX3BvcnQgPSBwYWNrZXRfZ2V0X2ludCgpOworCW9yaWdpbmF0b3JfYWRkcmVzcyA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOworCW9yaWdpbmF0b3JfcG9ydCA9IHBhY2tldF9nZXRfaW50KCk7CisJcGFja2V0X2NoZWNrX2VvbSgpOworCisJZGVidWcoImNsaWVudF9yZXF1ZXN0X2ZvcndhcmRlZF90Y3BpcDogbGlzdGVuICVzIHBvcnQgJWQsICIKKwkgICAgIm9yaWdpbmF0b3IgJXMgcG9ydCAlZCIsIGxpc3Rlbl9hZGRyZXNzLCBsaXN0ZW5fcG9ydCwKKwkgICAgb3JpZ2luYXRvcl9hZGRyZXNzLCBvcmlnaW5hdG9yX3BvcnQpOworCisJYyA9IGNoYW5uZWxfY29ubmVjdF9ieV9saXN0ZW5fYWRkcmVzcyhsaXN0ZW5fcG9ydCwKKwkgICAgImZvcndhcmRlZC10Y3BpcCIsIG9yaWdpbmF0b3JfYWRkcmVzcyk7CisKKwl4ZnJlZShvcmlnaW5hdG9yX2FkZHJlc3MpOworCXhmcmVlKGxpc3Rlbl9hZGRyZXNzKTsKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIENoYW5uZWwgKgorY2xpZW50X3JlcXVlc3RfeDExKGNvbnN0IGNoYXIgKnJlcXVlc3RfdHlwZSwgaW50IHJjaGFuKQoreworCUNoYW5uZWwgKmMgPSBOVUxMOworCWNoYXIgKm9yaWdpbmF0b3I7CisJdV9zaG9ydCBvcmlnaW5hdG9yX3BvcnQ7CisJaW50IHNvY2s7CisKKwlpZiAoIW9wdGlvbnMuZm9yd2FyZF94MTEpIHsKKwkJZXJyb3IoIldhcm5pbmc6IHNzaCBzZXJ2ZXIgdHJpZWQgWDExIGZvcndhcmRpbmcuIik7CisJCWVycm9yKCJXYXJuaW5nOiB0aGlzIGlzIHByb2JhYmx5IGEgYnJlYWstaW4gYXR0ZW1wdCBieSBhICIKKwkJICAgICJtYWxpY2lvdXMgc2VydmVyLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHgxMV9yZWZ1c2VfdGltZSAhPSAwICYmIHRpbWUoTlVMTCkgPj0geDExX3JlZnVzZV90aW1lKSB7CisJCXZlcmJvc2UoIlJlamVjdGVkIFgxMSBjb25uZWN0aW9uIGFmdGVyIEZvcndhcmRYMTFUaW1lb3V0ICIKKwkJICAgICJleHBpcmVkIik7CisJCXJldHVybiBOVUxMOworCX0KKwlvcmlnaW5hdG9yID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7CisJaWYgKGRhdGFmZWxsb3dzICYgU1NIX0JVR19YMTFGV0QpIHsKKwkJZGVidWcyKCJidWdneSBzZXJ2ZXI6IHgxMSByZXF1ZXN0IHcvbyBvcmlnaW5hdG9yX3BvcnQiKTsKKwkJb3JpZ2luYXRvcl9wb3J0ID0gMDsKKwl9IGVsc2UgeworCQlvcmlnaW5hdG9yX3BvcnQgPSBwYWNrZXRfZ2V0X2ludCgpOworCX0KKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisJLyogWFhYIGNoZWNrIHBlcm1pc3Npb24gKi8KKwlkZWJ1ZygiY2xpZW50X3JlcXVlc3RfeDExOiByZXF1ZXN0IGZyb20gJXMgJWQiLCBvcmlnaW5hdG9yLAorCSAgICBvcmlnaW5hdG9yX3BvcnQpOworCXhmcmVlKG9yaWdpbmF0b3IpOworCXNvY2sgPSB4MTFfY29ubmVjdF9kaXNwbGF5KCk7CisJaWYgKHNvY2sgPCAwKQorCQlyZXR1cm4gTlVMTDsKKwljID0gY2hhbm5lbF9uZXcoIngxMSIsCisJICAgIFNTSF9DSEFOTkVMX1gxMV9PUEVOLCBzb2NrLCBzb2NrLCAtMSwKKwkgICAgQ0hBTl9UQ1BfV0lORE9XX0RFRkFVTFQsIENIQU5fWDExX1BBQ0tFVF9ERUZBVUxULCAwLCAieDExIiwgMSk7CisJYy0+Zm9yY2VfZHJhaW4gPSAxOworCXJldHVybiBjOworfQorCitzdGF0aWMgQ2hhbm5lbCAqCitjbGllbnRfcmVxdWVzdF9hZ2VudChjb25zdCBjaGFyICpyZXF1ZXN0X3R5cGUsIGludCByY2hhbikKK3sKKwlDaGFubmVsICpjID0gTlVMTDsKKwlpbnQgc29jazsKKworCWlmICghb3B0aW9ucy5mb3J3YXJkX2FnZW50KSB7CisJCWVycm9yKCJXYXJuaW5nOiBzc2ggc2VydmVyIHRyaWVkIGFnZW50IGZvcndhcmRpbmcuIik7CisJCWVycm9yKCJXYXJuaW5nOiB0aGlzIGlzIHByb2JhYmx5IGEgYnJlYWstaW4gYXR0ZW1wdCBieSBhICIKKwkJICAgICJtYWxpY2lvdXMgc2VydmVyLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc29jayA9IHNzaF9nZXRfYXV0aGVudGljYXRpb25fc29ja2V0KCk7CisJaWYgKHNvY2sgPCAwKQorCQlyZXR1cm4gTlVMTDsKKwljID0gY2hhbm5lbF9uZXcoImF1dGhlbnRpY2F0aW9uIGFnZW50IGNvbm5lY3Rpb24iLAorCSAgICBTU0hfQ0hBTk5FTF9PUEVOLCBzb2NrLCBzb2NrLCAtMSwKKwkgICAgQ0hBTl9YMTFfV0lORE9XX0RFRkFVTFQsIENIQU5fVENQX1BBQ0tFVF9ERUZBVUxULCAwLAorCSAgICAiYXV0aGVudGljYXRpb24gYWdlbnQgY29ubmVjdGlvbiIsIDEpOworCWMtPmZvcmNlX2RyYWluID0gMTsKKwlyZXR1cm4gYzsKK30KKworaW50CitjbGllbnRfcmVxdWVzdF90dW5fZndkKGludCB0dW5fbW9kZSwgaW50IGxvY2FsX3R1biwgaW50IHJlbW90ZV90dW4pCit7CisJQ2hhbm5lbCAqYzsKKwlpbnQgZmQ7CisKKwlpZiAodHVuX21vZGUgPT0gU1NIX1RVTk1PREVfTk8pCisJCXJldHVybiAwOworCisJaWYgKCFjb21wYXQyMCkgeworCQllcnJvcigiVHVubmVsIGZvcndhcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBmb3IgcHJvdG9jb2wgMSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZGVidWcoIlJlcXVlc3RpbmcgdHVuIHVuaXQgJWQgaW4gbW9kZSAlZCIsIGxvY2FsX3R1biwgdHVuX21vZGUpOworCisJLyogT3BlbiBsb2NhbCB0dW5uZWwgZGV2aWNlICovCisJaWYgKChmZCA9IHR1bl9vcGVuKGxvY2FsX3R1biwgdHVuX21vZGUpKSA9PSAtMSkgeworCQllcnJvcigiVHVubmVsIGRldmljZSBvcGVuIGZhaWxlZC4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWMgPSBjaGFubmVsX25ldygidHVuIiwgU1NIX0NIQU5ORUxfT1BFTklORywgZmQsIGZkLCAtMSwKKwkgICAgQ0hBTl9UQ1BfV0lORE9XX0RFRkFVTFQsIENIQU5fVENQX1BBQ0tFVF9ERUZBVUxULCAwLCAidHVuIiwgMSk7CisJYy0+ZGF0YWdyYW0gPSAxOworCisjaWYgZGVmaW5lZChTU0hfVFVOX0ZJTFRFUikKKwlpZiAob3B0aW9ucy50dW5fb3BlbiA9PSBTU0hfVFVOTU9ERV9QT0lOVE9QT0lOVCkKKwkJY2hhbm5lbF9yZWdpc3Rlcl9maWx0ZXIoYy0+c2VsZiwgc3lzX3R1bl9pbmZpbHRlciwKKwkJICAgIHN5c190dW5fb3V0ZmlsdGVyLCBOVUxMLCBOVUxMKTsKKyNlbmRpZgorCisJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0NIQU5ORUxfT1BFTik7CisJcGFja2V0X3B1dF9jc3RyaW5nKCJ0dW5Ab3BlbnNzaC5jb20iKTsKKwlwYWNrZXRfcHV0X2ludChjLT5zZWxmKTsKKwlwYWNrZXRfcHV0X2ludChjLT5sb2NhbF93aW5kb3dfbWF4KTsKKwlwYWNrZXRfcHV0X2ludChjLT5sb2NhbF9tYXhwYWNrZXQpOworCXBhY2tldF9wdXRfaW50KHR1bl9tb2RlKTsKKwlwYWNrZXRfcHV0X2ludChyZW1vdGVfdHVuKTsKKwlwYWNrZXRfc2VuZCgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFhYWFggbW92ZSB0byBnZW5lcmljIGlucHV0IGhhbmRsZXIgKi8KK3N0YXRpYyB2b2lkCitjbGllbnRfaW5wdXRfY2hhbm5lbF9vcGVuKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQoreworCUNoYW5uZWwgKmMgPSBOVUxMOworCWNoYXIgKmN0eXBlOworCWludCByY2hhbjsKKwl1X2ludCBybWF4cGFjaywgcndpbmRvdywgbGVuOworCisJY3R5cGUgPSBwYWNrZXRfZ2V0X3N0cmluZygmbGVuKTsKKwlyY2hhbiA9IHBhY2tldF9nZXRfaW50KCk7CisJcndpbmRvdyA9IHBhY2tldF9nZXRfaW50KCk7CisJcm1heHBhY2sgPSBwYWNrZXRfZ2V0X2ludCgpOworCisJZGVidWcoImNsaWVudF9pbnB1dF9jaGFubmVsX29wZW46IGN0eXBlICVzIHJjaGFuICVkIHdpbiAlZCBtYXggJWQiLAorCSAgICBjdHlwZSwgcmNoYW4sIHJ3aW5kb3csIHJtYXhwYWNrKTsKKworCWlmIChzdHJjbXAoY3R5cGUsICJmb3J3YXJkZWQtdGNwaXAiKSA9PSAwKSB7CisJCWMgPSBjbGllbnRfcmVxdWVzdF9mb3J3YXJkZWRfdGNwaXAoY3R5cGUsIHJjaGFuKTsKKwl9IGVsc2UgaWYgKHN0cmNtcChjdHlwZSwgIngxMSIpID09IDApIHsKKwkJYyA9IGNsaWVudF9yZXF1ZXN0X3gxMShjdHlwZSwgcmNoYW4pOworCX0gZWxzZSBpZiAoc3RyY21wKGN0eXBlLCAiYXV0aC1hZ2VudEBvcGVuc3NoLmNvbSIpID09IDApIHsKKwkJYyA9IGNsaWVudF9yZXF1ZXN0X2FnZW50KGN0eXBlLCByY2hhbik7CisJfQorLyogWFhYIGR1cGxpY2F0ZSA6ICovCisJaWYgKGMgIT0gTlVMTCkgeworCQlkZWJ1ZygiY29uZmlybSAlcyIsIGN0eXBlKTsKKwkJYy0+cmVtb3RlX2lkID0gcmNoYW47CisJCWMtPnJlbW90ZV93aW5kb3cgPSByd2luZG93OworCQljLT5yZW1vdGVfbWF4cGFja2V0ID0gcm1heHBhY2s7CisJCWlmIChjLT50eXBlICE9IFNTSF9DSEFOTkVMX0NPTk5FQ1RJTkcpIHsKKwkJCXBhY2tldF9zdGFydChTU0gyX01TR19DSEFOTkVMX09QRU5fQ09ORklSTUFUSU9OKTsKKwkJCXBhY2tldF9wdXRfaW50KGMtPnJlbW90ZV9pZCk7CisJCQlwYWNrZXRfcHV0X2ludChjLT5zZWxmKTsKKwkJCXBhY2tldF9wdXRfaW50KGMtPmxvY2FsX3dpbmRvdyk7CisJCQlwYWNrZXRfcHV0X2ludChjLT5sb2NhbF9tYXhwYWNrZXQpOworCQkJcGFja2V0X3NlbmQoKTsKKwkJfQorCX0gZWxzZSB7CisJCWRlYnVnKCJmYWlsdXJlICVzIiwgY3R5cGUpOworCQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfQ0hBTk5FTF9PUEVOX0ZBSUxVUkUpOworCQlwYWNrZXRfcHV0X2ludChyY2hhbik7CisJCXBhY2tldF9wdXRfaW50KFNTSDJfT1BFTl9BRE1JTklTVFJBVElWRUxZX1BST0hJQklURUQpOworCQlpZiAoIShkYXRhZmVsbG93cyAmIFNTSF9CVUdfT1BFTkZBSUxVUkUpKSB7CisJCQlwYWNrZXRfcHV0X2NzdHJpbmcoIm9wZW4gZmFpbGVkIik7CisJCQlwYWNrZXRfcHV0X2NzdHJpbmcoIiIpOworCQl9CisJCXBhY2tldF9zZW5kKCk7CisJfQorCXhmcmVlKGN0eXBlKTsKK30KK3N0YXRpYyB2b2lkCitjbGllbnRfaW5wdXRfY2hhbm5lbF9yZXEoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCit7CisJQ2hhbm5lbCAqYyA9IE5VTEw7CisJaW50IGV4aXR2YWwsIGlkLCByZXBseSwgc3VjY2VzcyA9IDA7CisJY2hhciAqcnR5cGU7CisKKwlpZCA9IHBhY2tldF9nZXRfaW50KCk7CisJcnR5cGUgPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKKwlyZXBseSA9IHBhY2tldF9nZXRfY2hhcigpOworCisJZGVidWcoImNsaWVudF9pbnB1dF9jaGFubmVsX3JlcTogY2hhbm5lbCAlZCBydHlwZSAlcyByZXBseSAlZCIsCisJICAgIGlkLCBydHlwZSwgcmVwbHkpOworCisJaWYgKGlkID09IC0xKSB7CisJCWVycm9yKCJjbGllbnRfaW5wdXRfY2hhbm5lbF9yZXE6IHJlcXVlc3QgZm9yIGNoYW5uZWwgLTEiKTsKKwl9IGVsc2UgaWYgKChjID0gY2hhbm5lbF9sb29rdXAoaWQpKSA9PSBOVUxMKSB7CisJCWVycm9yKCJjbGllbnRfaW5wdXRfY2hhbm5lbF9yZXE6IGNoYW5uZWwgJWQ6ICIKKwkJICAgICJ1bmtub3duIGNoYW5uZWwiLCBpZCk7CisJfSBlbHNlIGlmIChzdHJjbXAocnR5cGUsICJlb3dAb3BlbnNzaC5jb20iKSA9PSAwKSB7CisJCXBhY2tldF9jaGVja19lb20oKTsKKwkJY2hhbl9yY3ZkX2VvdyhjKTsKKwl9IGVsc2UgaWYgKHN0cmNtcChydHlwZSwgImV4aXQtc3RhdHVzIikgPT0gMCkgeworCQlleGl0dmFsID0gcGFja2V0X2dldF9pbnQoKTsKKwkJaWYgKGMtPmN0bF9jaGFuICE9IC0xKSB7CisJCQltdXhfZXhpdF9tZXNzYWdlKGMsIGV4aXR2YWwpOworCQkJc3VjY2VzcyA9IDE7CisJCX0gZWxzZSBpZiAoaWQgPT0gc2Vzc2lvbl9pZGVudCkgeworCQkJLyogUmVjb3JkIGV4aXQgdmFsdWUgb2YgbG9jYWwgc2Vzc2lvbiAqLworCQkJc3VjY2VzcyA9IDE7CisJCQlleGl0X3N0YXR1cyA9IGV4aXR2YWw7CisJCX0gZWxzZSB7CisJCQkvKiBQcm9iYWJseSBmb3IgYSBtdXggY2hhbm5lbCB0aGF0IGhhcyBhbHJlYWR5IGNsb3NlZCAqLworCQkJZGVidWcoIiVzOiBubyBzaW5rIGZvciBleGl0LXN0YXR1cyBvbiBjaGFubmVsICVkIiwKKwkJCSAgICBfX2Z1bmNfXywgaWQpOworCQl9CisJCXBhY2tldF9jaGVja19lb20oKTsKKwl9CisJaWYgKHJlcGx5ICYmIGMgIT0gTlVMTCkgeworCQlwYWNrZXRfc3RhcnQoc3VjY2VzcyA/CisJCSAgICBTU0gyX01TR19DSEFOTkVMX1NVQ0NFU1MgOiBTU0gyX01TR19DSEFOTkVMX0ZBSUxVUkUpOworCQlwYWNrZXRfcHV0X2ludChjLT5yZW1vdGVfaWQpOworCQlwYWNrZXRfc2VuZCgpOworCX0KKwl4ZnJlZShydHlwZSk7Cit9CitzdGF0aWMgdm9pZAorY2xpZW50X2lucHV0X2dsb2JhbF9yZXF1ZXN0KGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQoreworCWNoYXIgKnJ0eXBlOworCWludCB3YW50X3JlcGx5OworCWludCBzdWNjZXNzID0gMDsKKworCXJ0eXBlID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7CisJd2FudF9yZXBseSA9IHBhY2tldF9nZXRfY2hhcigpOworCWRlYnVnKCJjbGllbnRfaW5wdXRfZ2xvYmFsX3JlcXVlc3Q6IHJ0eXBlICVzIHdhbnRfcmVwbHkgJWQiLAorCSAgICBydHlwZSwgd2FudF9yZXBseSk7CisJaWYgKHdhbnRfcmVwbHkpIHsKKwkJcGFja2V0X3N0YXJ0KHN1Y2Nlc3MgPworCQkgICAgU1NIMl9NU0dfUkVRVUVTVF9TVUNDRVNTIDogU1NIMl9NU0dfUkVRVUVTVF9GQUlMVVJFKTsKKwkJcGFja2V0X3NlbmQoKTsKKwkJcGFja2V0X3dyaXRlX3dhaXQoKTsKKwl9CisJeGZyZWUocnR5cGUpOworfQorCit2b2lkCitjbGllbnRfc2Vzc2lvbjJfc2V0dXAoaW50IGlkLCBpbnQgd2FudF90dHksIGludCB3YW50X3N1YnN5c3RlbSwKKyAgICBjb25zdCBjaGFyICp0ZXJtLCBzdHJ1Y3QgdGVybWlvcyAqdGlvcCwgaW50IGluX2ZkLCBCdWZmZXIgKmNtZCwgY2hhciAqKmVudikKK3sKKwlpbnQgbGVuOworCUNoYW5uZWwgKmMgPSBOVUxMOworCisJZGVidWcyKCIlczogaWQgJWQiLCBfX2Z1bmNfXywgaWQpOworCisJaWYgKChjID0gY2hhbm5lbF9sb29rdXAoaWQpKSA9PSBOVUxMKQorCQlmYXRhbCgiY2xpZW50X3Nlc3Npb24yX3NldHVwOiBjaGFubmVsICVkOiB1bmtub3duIGNoYW5uZWwiLCBpZCk7CisKKwlwYWNrZXRfc2V0X2ludGVyYWN0aXZlKHdhbnRfdHR5LAorCSAgICBvcHRpb25zLmlwX3Fvc19pbnRlcmFjdGl2ZSwgb3B0aW9ucy5pcF9xb3NfYnVsayk7CisKKwlpZiAod2FudF90dHkpIHsKKwkJc3RydWN0IHdpbnNpemUgd3M7CisKKwkJLyogU3RvcmUgd2luZG93IHNpemUgaW4gdGhlIHBhY2tldC4gKi8KKwkJaWYgKGlvY3RsKGluX2ZkLCBUSU9DR1dJTlNaLCAmd3MpIDwgMCkKKwkJCW1lbXNldCgmd3MsIDAsIHNpemVvZih3cykpOworCisJCWNoYW5uZWxfcmVxdWVzdF9zdGFydChpZCwgInB0eS1yZXEiLCAxKTsKKwkJY2xpZW50X2V4cGVjdF9jb25maXJtKGlkLCAiUFRZIGFsbG9jYXRpb24iLCBDT05GSVJNX1RUWSk7CisJCXBhY2tldF9wdXRfY3N0cmluZyh0ZXJtICE9IE5VTEwgPyB0ZXJtIDogIiIpOworCQlwYWNrZXRfcHV0X2ludCgodV9pbnQpd3Mud3NfY29sKTsKKwkJcGFja2V0X3B1dF9pbnQoKHVfaW50KXdzLndzX3Jvdyk7CisJCXBhY2tldF9wdXRfaW50KCh1X2ludCl3cy53c194cGl4ZWwpOworCQlwYWNrZXRfcHV0X2ludCgodV9pbnQpd3Mud3NfeXBpeGVsKTsKKwkJaWYgKHRpb3AgPT0gTlVMTCkKKwkJCXRpb3AgPSBnZXRfc2F2ZWRfdGlvKCk7CisJCXR0eV9tYWtlX21vZGVzKC0xLCB0aW9wKTsKKwkJcGFja2V0X3NlbmQoKTsKKwkJLyogWFhYIHdhaXQgZm9yIHJlcGx5ICovCisJCWMtPmNsaWVudF90dHkgPSAxOworCX0KKworCS8qIFRyYW5zZmVyIGFueSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBjbGllbnQgdG8gc2VydmVyICovCisJaWYgKG9wdGlvbnMubnVtX3NlbmRfZW52ICE9IDAgJiYgZW52ICE9IE5VTEwpIHsKKwkJaW50IGksIGosIG1hdGNoZWQ7CisJCWNoYXIgKm5hbWUsICp2YWw7CisKKwkJZGVidWcoIlNlbmRpbmcgZW52aXJvbm1lbnQuIik7CisJCWZvciAoaSA9IDA7IGVudltpXSAhPSBOVUxMOyBpKyspIHsKKwkJCS8qIFNwbGl0ICovCisJCQluYW1lID0geHN0cmR1cChlbnZbaV0pOworCQkJaWYgKCh2YWwgPSBzdHJjaHIobmFtZSwgJz0nKSkgPT0gTlVMTCkgeworCQkJCXhmcmVlKG5hbWUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJKnZhbCsrID0gJ1wwJzsKKworCQkJbWF0Y2hlZCA9IDA7CisJCQlmb3IgKGogPSAwOyBqIDwgb3B0aW9ucy5udW1fc2VuZF9lbnY7IGorKykgeworCQkJCWlmIChtYXRjaF9wYXR0ZXJuKG5hbWUsIG9wdGlvbnMuc2VuZF9lbnZbal0pKSB7CisJCQkJCW1hdGNoZWQgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoIW1hdGNoZWQpIHsKKwkJCQlkZWJ1ZzMoIklnbm9yZWQgZW52ICVzIiwgbmFtZSk7CisJCQkJeGZyZWUobmFtZSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWRlYnVnKCJTZW5kaW5nIGVudiAlcyA9ICVzIiwgbmFtZSwgdmFsKTsKKwkJCWNoYW5uZWxfcmVxdWVzdF9zdGFydChpZCwgImVudiIsIDApOworCQkJcGFja2V0X3B1dF9jc3RyaW5nKG5hbWUpOworCQkJcGFja2V0X3B1dF9jc3RyaW5nKHZhbCk7CisJCQlwYWNrZXRfc2VuZCgpOworCQkJeGZyZWUobmFtZSk7CisJCX0KKwl9CisKKwlsZW4gPSBidWZmZXJfbGVuKGNtZCk7CisJaWYgKGxlbiA+IDApIHsKKwkJaWYgKGxlbiA+IDkwMCkKKwkJCWxlbiA9IDkwMDsKKwkJaWYgKHdhbnRfc3Vic3lzdGVtKSB7CisJCQlkZWJ1ZygiU2VuZGluZyBzdWJzeXN0ZW06ICUuKnMiLAorCQkJICAgIGxlbiwgKHVfY2hhciopYnVmZmVyX3B0cihjbWQpKTsKKwkJCWNoYW5uZWxfcmVxdWVzdF9zdGFydChpZCwgInN1YnN5c3RlbSIsIDEpOworCQkJY2xpZW50X2V4cGVjdF9jb25maXJtKGlkLCAic3Vic3lzdGVtIiwgQ09ORklSTV9DTE9TRSk7CisJCX0gZWxzZSB7CisJCQlkZWJ1ZygiU2VuZGluZyBjb21tYW5kOiAlLipzIiwKKwkJCSAgICBsZW4sICh1X2NoYXIqKWJ1ZmZlcl9wdHIoY21kKSk7CisJCQljaGFubmVsX3JlcXVlc3Rfc3RhcnQoaWQsICJleGVjIiwgMSk7CisJCQljbGllbnRfZXhwZWN0X2NvbmZpcm0oaWQsICJleGVjIiwgQ09ORklSTV9DTE9TRSk7CisJCX0KKwkJcGFja2V0X3B1dF9zdHJpbmcoYnVmZmVyX3B0cihjbWQpLCBidWZmZXJfbGVuKGNtZCkpOworCQlwYWNrZXRfc2VuZCgpOworCX0gZWxzZSB7CisJCWNoYW5uZWxfcmVxdWVzdF9zdGFydChpZCwgInNoZWxsIiwgMSk7CisJCWNsaWVudF9leHBlY3RfY29uZmlybShpZCwgInNoZWxsIiwgQ09ORklSTV9DTE9TRSk7CisJCXBhY2tldF9zZW5kKCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorY2xpZW50X2luaXRfZGlzcGF0Y2hfMjAodm9pZCkKK3sKKwlkaXNwYXRjaF9pbml0KCZkaXNwYXRjaF9wcm90b2NvbF9lcnJvcik7CisKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfQ0hBTk5FTF9DTE9TRSwgJmNoYW5uZWxfaW5wdXRfb2Nsb3NlKTsKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfQ0hBTk5FTF9EQVRBLCAmY2hhbm5lbF9pbnB1dF9kYXRhKTsKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfQ0hBTk5FTF9FT0YsICZjaGFubmVsX2lucHV0X2llb2YpOworCWRpc3BhdGNoX3NldChTU0gyX01TR19DSEFOTkVMX0VYVEVOREVEX0RBVEEsICZjaGFubmVsX2lucHV0X2V4dGVuZGVkX2RhdGEpOworCWRpc3BhdGNoX3NldChTU0gyX01TR19DSEFOTkVMX09QRU4sICZjbGllbnRfaW5wdXRfY2hhbm5lbF9vcGVuKTsKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfQ0hBTk5FTF9PUEVOX0NPTkZJUk1BVElPTiwgJmNoYW5uZWxfaW5wdXRfb3Blbl9jb25maXJtYXRpb24pOworCWRpc3BhdGNoX3NldChTU0gyX01TR19DSEFOTkVMX09QRU5fRkFJTFVSRSwgJmNoYW5uZWxfaW5wdXRfb3Blbl9mYWlsdXJlKTsKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfQ0hBTk5FTF9SRVFVRVNULCAmY2xpZW50X2lucHV0X2NoYW5uZWxfcmVxKTsKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfQ0hBTk5FTF9XSU5ET1dfQURKVVNULCAmY2hhbm5lbF9pbnB1dF93aW5kb3dfYWRqdXN0KTsKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfQ0hBTk5FTF9TVUNDRVNTLCAmY2hhbm5lbF9pbnB1dF9zdGF0dXNfY29uZmlybSk7CisJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX0NIQU5ORUxfRkFJTFVSRSwgJmNoYW5uZWxfaW5wdXRfc3RhdHVzX2NvbmZpcm0pOworCWRpc3BhdGNoX3NldChTU0gyX01TR19HTE9CQUxfUkVRVUVTVCwgJmNsaWVudF9pbnB1dF9nbG9iYWxfcmVxdWVzdCk7CisKKwkvKiByZWtleWluZyAqLworCWRpc3BhdGNoX3NldChTU0gyX01TR19LRVhJTklULCAma2V4X2lucHV0X2tleGluaXQpOworCisJLyogZ2xvYmFsIHJlcXVlc3QgcmVwbHkgbWVzc2FnZXMgKi8KKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfUkVRVUVTVF9GQUlMVVJFLCAmY2xpZW50X2dsb2JhbF9yZXF1ZXN0X3JlcGx5KTsKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfUkVRVUVTVF9TVUNDRVNTLCAmY2xpZW50X2dsb2JhbF9yZXF1ZXN0X3JlcGx5KTsKK30KKworc3RhdGljIHZvaWQKK2NsaWVudF9pbml0X2Rpc3BhdGNoXzEzKHZvaWQpCit7CisJZGlzcGF0Y2hfaW5pdChOVUxMKTsKKwlkaXNwYXRjaF9zZXQoU1NIX01TR19DSEFOTkVMX0NMT1NFLCAmY2hhbm5lbF9pbnB1dF9jbG9zZSk7CisJZGlzcGF0Y2hfc2V0KFNTSF9NU0dfQ0hBTk5FTF9DTE9TRV9DT05GSVJNQVRJT04sICZjaGFubmVsX2lucHV0X2Nsb3NlX2NvbmZpcm1hdGlvbik7CisJZGlzcGF0Y2hfc2V0KFNTSF9NU0dfQ0hBTk5FTF9EQVRBLCAmY2hhbm5lbF9pbnB1dF9kYXRhKTsKKwlkaXNwYXRjaF9zZXQoU1NIX01TR19DSEFOTkVMX09QRU5fQ09ORklSTUFUSU9OLCAmY2hhbm5lbF9pbnB1dF9vcGVuX2NvbmZpcm1hdGlvbik7CisJZGlzcGF0Y2hfc2V0KFNTSF9NU0dfQ0hBTk5FTF9PUEVOX0ZBSUxVUkUsICZjaGFubmVsX2lucHV0X29wZW5fZmFpbHVyZSk7CisJZGlzcGF0Y2hfc2V0KFNTSF9NU0dfUE9SVF9PUEVOLCAmY2hhbm5lbF9pbnB1dF9wb3J0X29wZW4pOworCWRpc3BhdGNoX3NldChTU0hfU01TR19FWElUU1RBVFVTLCAmY2xpZW50X2lucHV0X2V4aXRfc3RhdHVzKTsKKwlkaXNwYXRjaF9zZXQoU1NIX1NNU0dfU1RERVJSX0RBVEEsICZjbGllbnRfaW5wdXRfc3RkZXJyX2RhdGEpOworCWRpc3BhdGNoX3NldChTU0hfU01TR19TVERPVVRfREFUQSwgJmNsaWVudF9pbnB1dF9zdGRvdXRfZGF0YSk7CisKKwlkaXNwYXRjaF9zZXQoU1NIX1NNU0dfQUdFTlRfT1BFTiwgb3B0aW9ucy5mb3J3YXJkX2FnZW50ID8KKwkgICAgJmNsaWVudF9pbnB1dF9hZ2VudF9vcGVuIDogJmRlbnlfaW5wdXRfb3Blbik7CisJZGlzcGF0Y2hfc2V0KFNTSF9TTVNHX1gxMV9PUEVOLCBvcHRpb25zLmZvcndhcmRfeDExID8KKwkgICAgJngxMV9pbnB1dF9vcGVuIDogJmRlbnlfaW5wdXRfb3Blbik7Cit9CisKK3N0YXRpYyB2b2lkCitjbGllbnRfaW5pdF9kaXNwYXRjaF8xNSh2b2lkKQoreworCWNsaWVudF9pbml0X2Rpc3BhdGNoXzEzKCk7CisJZGlzcGF0Y2hfc2V0KFNTSF9NU0dfQ0hBTk5FTF9DTE9TRSwgJmNoYW5uZWxfaW5wdXRfaWVvZik7CisJZGlzcGF0Y2hfc2V0KFNTSF9NU0dfQ0hBTk5FTF9DTE9TRV9DT05GSVJNQVRJT04sICYgY2hhbm5lbF9pbnB1dF9vY2xvc2UpOworfQorCitzdGF0aWMgdm9pZAorY2xpZW50X2luaXRfZGlzcGF0Y2godm9pZCkKK3sKKwlpZiAoY29tcGF0MjApCisJCWNsaWVudF9pbml0X2Rpc3BhdGNoXzIwKCk7CisJZWxzZSBpZiAoY29tcGF0MTMpCisJCWNsaWVudF9pbml0X2Rpc3BhdGNoXzEzKCk7CisJZWxzZQorCQljbGllbnRfaW5pdF9kaXNwYXRjaF8xNSgpOworfQorCit2b2lkCitjbGllbnRfc3RvcF9tdXgodm9pZCkKK3sKKwlpZiAob3B0aW9ucy5jb250cm9sX3BhdGggIT0gTlVMTCAmJiBtdXhzZXJ2ZXJfc29jayAhPSAtMSkKKwkJdW5saW5rKG9wdGlvbnMuY29udHJvbF9wYXRoKTsKKwkvKgorCSAqIElmIHdlIGFyZSBpbiBwZXJzaXN0IG1vZGUsIHNpZ25hbCB0aGF0IHdlIHNob3VsZCBjbG9zZSB3aGVuIGFsbAorCSAqIGFjdGl2ZSBjaGFubmVscyBhcmUgY2xvc2VkLgorCSAqLworCWlmIChvcHRpb25zLmNvbnRyb2xfcGVyc2lzdCkgeworCQlzZXNzaW9uX2Nsb3NlZCA9IDE7CisJCXNldHByb2N0aXRsZSgiW3N0b3BwZWQgbXV4XSIpOworCX0KK30KKworLyogY2xpZW50IHNwZWNpZmljIGZhdGFsIGNsZWFudXAgKi8KK3ZvaWQKK2NsZWFudXBfZXhpdChpbnQgaSkKK3sKKwlsZWF2ZV9yYXdfbW9kZShvcHRpb25zLnJlcXVlc3RfdHR5ID09IFJFUVVFU1RfVFRZX0ZPUkNFKTsKKwlsZWF2ZV9ub25fYmxvY2tpbmcoKTsKKwlpZiAob3B0aW9ucy5jb250cm9sX3BhdGggIT0gTlVMTCAmJiBtdXhzZXJ2ZXJfc29jayAhPSAtMSkKKwkJdW5saW5rKG9wdGlvbnMuY29udHJvbF9wYXRoKTsKKwlzc2hfa2lsbF9wcm94eV9jb21tYW5kKCk7CisJX2V4aXQoaSk7Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2NsaWVudGxvb3AuaCBiL29wZW5zc2gtNi4wcDEvY2xpZW50bG9vcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYjc5NDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NsaWVudGxvb3AuaApAQCAtMCwwICsxLDc5IEBACisvKiAkT3BlbkJTRDogY2xpZW50bG9vcC5oLHYgMS4yOSAyMDExLzA5LzA5IDIyOjQ2OjQ0IGRqbSBFeHAgJCAqLworCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKKyAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCisgKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCisgKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCisgKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCisgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisKKy8qIENsaWVudCBzaWRlIG1haW4gbG9vcCBmb3IgdGhlIGludGVyYWN0aXZlIHNlc3Npb24uICovCitpbnQJIGNsaWVudF9sb29wKGludCwgaW50LCBpbnQpOwordm9pZAkgY2xpZW50X3gxMV9nZXRfcHJvdG8oY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHVfaW50LCB1X2ludCwKKwkgICAgY2hhciAqKiwgY2hhciAqKik7Cit2b2lkCSBjbGllbnRfZ2xvYmFsX3JlcXVlc3RfcmVwbHlfZndkKGludCwgdV9pbnQzMl90LCB2b2lkICopOwordm9pZAkgY2xpZW50X3Nlc3Npb24yX3NldHVwKGludCwgaW50LCBpbnQsIGNvbnN0IGNoYXIgKiwgc3RydWN0IHRlcm1pb3MgKiwKKwkgICAgaW50LCBCdWZmZXIgKiwgY2hhciAqKik7CitpbnQJIGNsaWVudF9yZXF1ZXN0X3R1bl9md2QoaW50LCBpbnQsIGludCk7Cit2b2lkCSBjbGllbnRfc3RvcF9tdXgodm9pZCk7CisKKy8qIEVzY2FwZSBmaWx0ZXIgZm9yIHByb3RvY29sIDIgc2Vzc2lvbnMgKi8KK3ZvaWQJKmNsaWVudF9uZXdfZXNjYXBlX2ZpbHRlcl9jdHgoaW50KTsKK3ZvaWQJIGNsaWVudF9maWx0ZXJfY2xlYW51cChpbnQsIHZvaWQgKik7CitpbnQJIGNsaWVudF9zaW1wbGVfZXNjYXBlX2ZpbHRlcihDaGFubmVsICosIGNoYXIgKiwgaW50KTsKKworLyogR2xvYmFsIHJlcXVlc3QgY29uZmlybWF0aW9uIGNhbGxiYWNrcyAqLwordHlwZWRlZiB2b2lkIGdsb2JhbF9jb25maXJtX2NiKGludCwgdV9pbnQzMl90IHNlcSwgdm9pZCAqKTsKK3ZvaWQJIGNsaWVudF9yZWdpc3Rlcl9nbG9iYWxfY29uZmlybShnbG9iYWxfY29uZmlybV9jYiAqLCB2b2lkICopOworCisvKiBDaGFubmVsIHJlcXVlc3QgY29uZmlybWF0aW9uIGNhbGxiYWNrcyAqLworZW51bSBjb25maXJtX2FjdGlvbiB7IENPTkZJUk1fV0FSTiA9IDAsIENPTkZJUk1fQ0xPU0UsIENPTkZJUk1fVFRZIH07Cit2b2lkIGNsaWVudF9leHBlY3RfY29uZmlybShpbnQsIGNvbnN0IGNoYXIgKiwgZW51bSBjb25maXJtX2FjdGlvbik7CisKKy8qIE11bHRpcGxleGluZyBwcm90b2NvbCB2ZXJzaW9uICovCisjZGVmaW5lIFNTSE1VWF9WRVIJCQk0CisKKy8qIE11bHRpcGxleGluZyBjb250cm9sIHByb3RvY29sIGZsYWdzICovCisjZGVmaW5lIFNTSE1VWF9DT01NQU5EX09QRU4JCTEJLyogT3BlbiBuZXcgY29ubmVjdGlvbiAqLworI2RlZmluZSBTU0hNVVhfQ09NTUFORF9BTElWRV9DSEVDSwkyCS8qIENoZWNrIG1hc3RlciBpcyBhbGl2ZSAqLworI2RlZmluZSBTU0hNVVhfQ09NTUFORF9URVJNSU5BVEUJMwkvKiBBc2sgbWFzdGVyIHRvIGV4aXQgKi8KKyNkZWZpbmUgU1NITVVYX0NPTU1BTkRfU1RESU9fRldECTQJLyogT3BlbiBzdGRpbyBmd2QgKHNzaCAtVykgKi8KKyNkZWZpbmUgU1NITVVYX0NPTU1BTkRfRk9SV0FSRAkJNQkvKiBGb3J3YXJkIG9ubHksIG5vIGNvbW1hbmQgKi8KKyNkZWZpbmUgU1NITVVYX0NPTU1BTkRfU1RPUAkJNgkvKiBEaXNhYmxlIG11eCBidXQgbm90IGNvbm4gKi8KKyNkZWZpbmUgU1NITVVYX0NPTU1BTkRfQ0FOQ0VMX0ZXRAk3CS8qIENhbmNlbCBmb3J3YXJkaW5nKHMpICovCisKK3ZvaWQJbXV4c2VydmVyX2xpc3Rlbih2b2lkKTsKK3ZvaWQJbXV4Y2xpZW50KGNvbnN0IGNoYXIgKik7Cit2b2lkCW11eF9leGl0X21lc3NhZ2UoQ2hhbm5lbCAqLCBpbnQpOwordm9pZAltdXhfdHR5X2FsbG9jX2ZhaWxlZChDaGFubmVsICopOworCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2NvbXBhdC5jIGIvb3BlbnNzaC02LjBwMS9jb21wYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGMwODlmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9jb21wYXQuYwpAQCAtMCwwICsxLDIzOCBAQAorLyogJE9wZW5CU0Q6IGNvbXBhdC5jLHYgMS43OSAyMDExLzA5LzIzIDA3OjQ1OjA1IG1hcmt1cyBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgInBhY2tldC5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgIm1hdGNoLmgiCisKK2ludCBjb21wYXQxMyA9IDA7CitpbnQgY29tcGF0MjAgPSAwOworaW50IGRhdGFmZWxsb3dzID0gMDsKKwordm9pZAorZW5hYmxlX2NvbXBhdDIwKHZvaWQpCit7CisJZGVidWcoIkVuYWJsaW5nIGNvbXBhdGliaWxpdHkgbW9kZSBmb3IgcHJvdG9jb2wgMi4wIik7CisJY29tcGF0MjAgPSAxOworfQordm9pZAorZW5hYmxlX2NvbXBhdDEzKHZvaWQpCit7CisJZGVidWcoIkVuYWJsaW5nIGNvbXBhdGliaWxpdHkgbW9kZSBmb3IgcHJvdG9jb2wgMS4zIik7CisJY29tcGF0MTMgPSAxOworfQorLyogZGF0YWZlbGxvd3MgYnVnIGNvbXBhdGliaWxpdHkgKi8KK3ZvaWQKK2NvbXBhdF9kYXRhZmVsbG93cyhjb25zdCBjaGFyICp2ZXJzaW9uKQoreworCWludCBpOworCXN0YXRpYyBzdHJ1Y3QgeworCQljaGFyCSpwYXQ7CisJCWludAlidWdzOworCX0gY2hlY2tbXSA9IHsKKwkJeyAiT3BlblNTSC0yLjAqLCIKKwkJICAiT3BlblNTSC0yLjEqLCIKKwkJICAiT3BlblNTSF8yLjEqLCIKKwkJICAiT3BlblNTSF8yLjIqIiwJU1NIX09MRF9TRVNTSU9OSUR8U1NIX0JVR19CQU5ORVJ8CisJCQkJCVNTSF9PTERfREhHRVh8U1NIX0JVR19OT1JFS0VZfAorCQkJCQlTU0hfQlVHX0VYVEVPRnxTU0hfT0xEX0ZPUldBUkRfQUREUn0sCisJCXsgIk9wZW5TU0hfMi4zLjAqIiwJU1NIX0JVR19CQU5ORVJ8U1NIX0JVR19CSUdFTkRJQU5BRVN8CisJCQkJCVNTSF9PTERfREhHRVh8U1NIX0JVR19OT1JFS0VZfAorCQkJCQlTU0hfQlVHX0VYVEVPRnxTU0hfT0xEX0ZPUldBUkRfQUREUn0sCisJCXsgIk9wZW5TU0hfMi4zLioiLAlTU0hfQlVHX0JJR0VORElBTkFFU3xTU0hfT0xEX0RIR0VYfAorCQkJCQlTU0hfQlVHX05PUkVLRVl8U1NIX0JVR19FWFRFT0Z8CisJCQkJCVNTSF9PTERfRk9SV0FSRF9BRERSfSwKKwkJeyAiT3BlblNTSF8yLjUuMHAxKiwiCisJCSAgIk9wZW5TU0hfMi41LjFwMSoiLAorCQkJCQlTU0hfQlVHX0JJR0VORElBTkFFU3xTU0hfT0xEX0RIR0VYfAorCQkJCQlTU0hfQlVHX05PUkVLRVl8U1NIX0JVR19FWFRFT0Z8CisJCQkJCVNTSF9PTERfRk9SV0FSRF9BRERSfSwKKwkJeyAiT3BlblNTSF8yLjUuMCosIgorCQkgICJPcGVuU1NIXzIuNS4xKiwiCisJCSAgIk9wZW5TU0hfMi41LjIqIiwJU1NIX09MRF9ESEdFWHxTU0hfQlVHX05PUkVLRVl8CisJCQkJCVNTSF9CVUdfRVhURU9GfFNTSF9PTERfRk9SV0FSRF9BRERSfSwKKwkJeyAiT3BlblNTSF8yLjUuMyoiLAlTU0hfQlVHX05PUkVLRVl8U1NIX0JVR19FWFRFT0Z8CisJCQkJCVNTSF9PTERfRk9SV0FSRF9BRERSfSwKKwkJeyAiT3BlblNTSF8yLiosIgorCQkgICJPcGVuU1NIXzMuMCosIgorCQkgICJPcGVuU1NIXzMuMSoiLAlTU0hfQlVHX0VYVEVPRnxTU0hfT0xEX0ZPUldBUkRfQUREUn0sCisJCXsgIk9wZW5TU0hfMy4qIiwJU1NIX09MRF9GT1JXQVJEX0FERFIgfSwKKwkJeyAiU3VuX1NTSF8xLjAqIiwJU1NIX0JVR19OT1JFS0VZfFNTSF9CVUdfRVhURU9GfSwKKwkJeyAiT3BlblNTSF80KiIsCQkwIH0sCisJCXsgIk9wZW5TU0hfNSoiLAkJU1NIX05FV19PUEVOU1NIfFNTSF9CVUdfRFlOQU1JQ19SUE9SVH0sCisJCXsgIk9wZW5TU0gqIiwJCVNTSF9ORVdfT1BFTlNTSCB9LAorCQl7ICIqTWluZFRlcm0qIiwJCTAgfSwKKwkJeyAiMi4xLjAqIiwJCVNTSF9CVUdfU0lHQkxPQnxTU0hfQlVHX0hNQUN8CisJCQkJCVNTSF9PTERfU0VTU0lPTklEfFNTSF9CVUdfREVCVUd8CisJCQkJCVNTSF9CVUdfUlNBU0lHTUQ1fFNTSF9CVUdfSEJTRVJWSUNFfAorCQkJCQlTU0hfQlVHX0ZJUlNUS0VYIH0sCisJCXsgIjIuMSAqIiwJCVNTSF9CVUdfU0lHQkxPQnxTU0hfQlVHX0hNQUN8CisJCQkJCVNTSF9PTERfU0VTU0lPTklEfFNTSF9CVUdfREVCVUd8CisJCQkJCVNTSF9CVUdfUlNBU0lHTUQ1fFNTSF9CVUdfSEJTRVJWSUNFfAorCQkJCQlTU0hfQlVHX0ZJUlNUS0VYIH0sCisJCXsgIjIuMC4xMyosIgorCQkgICIyLjAuMTQqLCIKKwkJICAiMi4wLjE1KiwiCisJCSAgIjIuMC4xNiosIgorCQkgICIyLjAuMTcqLCIKKwkJICAiMi4wLjE4KiwiCisJCSAgIjIuMC4xOSoiLAkJU1NIX0JVR19TSUdCTE9CfFNTSF9CVUdfSE1BQ3wKKwkJCQkJU1NIX09MRF9TRVNTSU9OSUR8U1NIX0JVR19ERUJVR3wKKwkJCQkJU1NIX0JVR19QS1NFUlZJQ0V8U1NIX0JVR19YMTFGV0R8CisJCQkJCVNTSF9CVUdfUEtPS3xTU0hfQlVHX1JTQVNJR01ENXwKKwkJCQkJU1NIX0JVR19IQlNFUlZJQ0V8U1NIX0JVR19PUEVORkFJTFVSRXwKKwkJCQkJU1NIX0JVR19EVU1NWUNIQU58U1NIX0JVR19GSVJTVEtFWCB9LAorCQl7ICIyLjAuMTEqLCIKKwkJICAiMi4wLjEyKiIsCQlTU0hfQlVHX1NJR0JMT0J8U1NIX0JVR19ITUFDfAorCQkJCQlTU0hfT0xEX1NFU1NJT05JRHxTU0hfQlVHX0RFQlVHfAorCQkJCQlTU0hfQlVHX1BLU0VSVklDRXxTU0hfQlVHX1gxMUZXRHwKKwkJCQkJU1NIX0JVR19QS0FVVEh8U1NIX0JVR19QS09LfAorCQkJCQlTU0hfQlVHX1JTQVNJR01ENXxTU0hfQlVHX09QRU5GQUlMVVJFfAorCQkJCQlTU0hfQlVHX0RVTU1ZQ0hBTnxTU0hfQlVHX0ZJUlNUS0VYIH0sCisJCXsgIjIuMC4qIiwJCVNTSF9CVUdfU0lHQkxPQnxTU0hfQlVHX0hNQUN8CisJCQkJCVNTSF9PTERfU0VTU0lPTklEfFNTSF9CVUdfREVCVUd8CisJCQkJCVNTSF9CVUdfUEtTRVJWSUNFfFNTSF9CVUdfWDExRldEfAorCQkJCQlTU0hfQlVHX1BLQVVUSHxTU0hfQlVHX1BLT0t8CisJCQkJCVNTSF9CVUdfUlNBU0lHTUQ1fFNTSF9CVUdfT1BFTkZBSUxVUkV8CisJCQkJCVNTSF9CVUdfREVSSVZFS0VZfFNTSF9CVUdfRFVNTVlDSEFOfAorCQkJCQlTU0hfQlVHX0ZJUlNUS0VYIH0sCisJCXsgIjIuMi4wKiwiCisJCSAgIjIuMy4wKiIsCQlTU0hfQlVHX0hNQUN8U1NIX0JVR19ERUJVR3wKKwkJCQkJU1NIX0JVR19SU0FTSUdNRDV8U1NIX0JVR19GSVJTVEtFWCB9LAorCQl7ICIyLjMuKiIsCQlTU0hfQlVHX0RFQlVHfFNTSF9CVUdfUlNBU0lHTUQ1fAorCQkJCQlTU0hfQlVHX0ZJUlNUS0VYIH0sCisJCXsgIjIuNCIsCQlTU0hfT0xEX1NFU1NJT05JRCB9LAkvKiBWYW4gRHlrZSAqLworCQl7ICIyLioiLAkJU1NIX0JVR19ERUJVR3xTU0hfQlVHX0ZJUlNUS0VYfAorCQkJCQlTU0hfQlVHX1JGV0RfQUREUiB9LAorCQl7ICIzLjAuKiIsCQlTU0hfQlVHX0RFQlVHIH0sCisJCXsgIjMuMCBTZWN1cmVDUlQqIiwJU1NIX09MRF9TRVNTSU9OSUQgfSwKKwkJeyAiMS43IFNlY3VyZUZYKiIsCVNTSF9PTERfU0VTU0lPTklEIH0sCisJCXsgIjEuMi4xOCosIgorCQkgICIxLjIuMTkqLCIKKwkJICAiMS4yLjIwKiwiCisJCSAgIjEuMi4yMSosIgorCQkgICIxLjIuMjIqIiwJCVNTSF9CVUdfSUdOT1JFTVNHIH0sCisJCXsgIjEuMy4yKiIsCQkvKiBGLVNlY3VyZSAqLworCQkJCQlTU0hfQlVHX0lHTk9SRU1TRyB9LAorCQl7ICIqU1NIIENvbXBhdGlibGUgU2VydmVyKiIsCQkJLyogTmV0c2NyZWVuICovCisJCQkJCVNTSF9CVUdfUEFTU1dPUkRQQUQgfSwKKwkJeyAiKk9TVV8wKiwiCisJCSAgIk9TVV8xLjAqLCIKKwkJICAiT1NVXzEuMSosIgorCQkgICJPU1VfMS4yKiwiCisJCSAgIk9TVV8xLjMqLCIKKwkJICAiT1NVXzEuNCosIgorCQkgICJPU1VfMS41YWxwaGExKiwiCisJCSAgIk9TVV8xLjVhbHBoYTIqLCIKKwkJICAiT1NVXzEuNWFscGhhMyoiLAlTU0hfQlVHX1BBU1NXT1JEUEFEIH0sCisJCXsgIipTU0hfVmVyc2lvbl9NYXBwZXIqIiwKKwkJCQkJU1NIX0JVR19TQ0FOTkVSIH0sCisJCXsgIlByb2JlLSoiLAorCQkJCQlTU0hfQlVHX1BST0JFIH0sCisJCXsgTlVMTCwJCQkwIH0KKwl9OworCisJLyogcHJvY2VzcyB0YWJsZSwgcmV0dXJuIGZpcnN0IG1hdGNoICovCisJZm9yIChpID0gMDsgY2hlY2tbaV0ucGF0OyBpKyspIHsKKwkJaWYgKG1hdGNoX3BhdHRlcm5fbGlzdCh2ZXJzaW9uLCBjaGVja1tpXS5wYXQsCisJCSAgICBzdHJsZW4oY2hlY2tbaV0ucGF0KSwgMCkgPT0gMSkgeworCQkJZGVidWcoIm1hdGNoOiAlcyBwYXQgJXMiLCB2ZXJzaW9uLCBjaGVja1tpXS5wYXQpOworCQkJZGF0YWZlbGxvd3MgPSBjaGVja1tpXS5idWdzOworCQkJcmV0dXJuOworCQl9CisJfQorCWRlYnVnKCJubyBtYXRjaDogJXMiLCB2ZXJzaW9uKTsKK30KKworI2RlZmluZQlTRVAJIiwiCitpbnQKK3Byb3RvX3NwZWMoY29uc3QgY2hhciAqc3BlYykKK3sKKwljaGFyICpzLCAqcCwgKnE7CisJaW50IHJldCA9IFNTSF9QUk9UT19VTktOT1dOOworCisJaWYgKHNwZWMgPT0gTlVMTCkKKwkJcmV0dXJuIHJldDsKKwlxID0gcyA9IHhzdHJkdXAoc3BlYyk7CisJZm9yICgocCA9IHN0cnNlcCgmcSwgU0VQKSk7IHAgJiYgKnAgIT0gJ1wwJzsgKHAgPSBzdHJzZXAoJnEsIFNFUCkpKSB7CisJCXN3aXRjaCAoYXRvaShwKSkgeworCQljYXNlIDE6CisJCQlpZiAocmV0ID09IFNTSF9QUk9UT19VTktOT1dOKQorCQkJCXJldCB8PSBTU0hfUFJPVE9fMV9QUkVGRVJSRUQ7CisJCQlyZXQgfD0gU1NIX1BST1RPXzE7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcmV0IHw9IFNTSF9QUk9UT18yOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlsb2dpdCgiaWdub3JpbmcgYmFkIHByb3RvIHNwZWM6ICclcycuIiwgcCk7CisJCQlicmVhazsKKwkJfQorCX0KKwl4ZnJlZShzKTsKKwlyZXR1cm4gcmV0OworfQorCitjaGFyICoKK2NvbXBhdF9jaXBoZXJfcHJvcG9zYWwoY2hhciAqY2lwaGVyX3Byb3ApCit7CisJQnVmZmVyIGI7CisJY2hhciAqb3JpZ19wcm9wLCAqZml4X2NpcGhlcnM7CisJY2hhciAqY3AsICp0bXA7CisKKwlpZiAoIShkYXRhZmVsbG93cyAmIFNTSF9CVUdfQklHRU5ESUFOQUVTKSkKKwkJcmV0dXJuKGNpcGhlcl9wcm9wKTsKKworCWJ1ZmZlcl9pbml0KCZiKTsKKwl0bXAgPSBvcmlnX3Byb3AgPSB4c3RyZHVwKGNpcGhlcl9wcm9wKTsKKwl3aGlsZSAoKGNwID0gc3Ryc2VwKCZ0bXAsICIsIikpICE9IE5VTEwpIHsKKwkJaWYgKHN0cm5jbXAoY3AsICJhZXMiLCAzKSAhPSAwKSB7CisJCQlpZiAoYnVmZmVyX2xlbigmYikgPiAwKQorCQkJCWJ1ZmZlcl9hcHBlbmQoJmIsICIsIiwgMSk7CisJCQlidWZmZXJfYXBwZW5kKCZiLCBjcCwgc3RybGVuKGNwKSk7CisJCX0KKwl9CisJYnVmZmVyX2FwcGVuZCgmYiwgIlwwIiwgMSk7CisJZml4X2NpcGhlcnMgPSB4c3RyZHVwKGJ1ZmZlcl9wdHIoJmIpKTsKKwlidWZmZXJfZnJlZSgmYik7CisJeGZyZWUob3JpZ19wcm9wKTsKKwlkZWJ1ZzIoIk9yaWdpbmFsIGNpcGhlciBwcm9wb3NhbDogJXMiLCBjaXBoZXJfcHJvcCk7CisJZGVidWcyKCJDb21wYXQgY2lwaGVyIHByb3Bvc2FsOiAlcyIsIGZpeF9jaXBoZXJzKTsKKwlpZiAoISpmaXhfY2lwaGVycykKKwkJZmF0YWwoIk5vIGF2YWlsYWJsZSBjaXBoZXJzIGZvdW5kLiIpOworCisJcmV0dXJuKGZpeF9jaXBoZXJzKTsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvY29tcGF0LmggYi9vcGVuc3NoLTYuMHAxL2NvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZTVkOWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NvbXBhdC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qICRPcGVuQlNEOiBjb21wYXQuaCx2IDEuNDMgMjAxMS8wOS8yMyAwNzo0NTowNSBtYXJrdXMgRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCwgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBDT01QQVRfSAorI2RlZmluZSBDT01QQVRfSAorCisjZGVmaW5lCVNTSF9QUk9UT19VTktOT1dOCTB4MDAKKyNkZWZpbmUJU1NIX1BST1RPXzEJCTB4MDEKKyNkZWZpbmUJU1NIX1BST1RPXzFfUFJFRkVSUkVECTB4MDIKKyNkZWZpbmUJU1NIX1BST1RPXzIJCTB4MDQKKworI2RlZmluZSBTU0hfQlVHX1NJR0JMT0IJCTB4MDAwMDAwMDEKKyNkZWZpbmUgU1NIX0JVR19QS1NFUlZJQ0UJMHgwMDAwMDAwMgorI2RlZmluZSBTU0hfQlVHX0hNQUMJCTB4MDAwMDAwMDQKKyNkZWZpbmUgU1NIX0JVR19YMTFGV0QJCTB4MDAwMDAwMDgKKyNkZWZpbmUgU1NIX09MRF9TRVNTSU9OSUQJMHgwMDAwMDAxMAorI2RlZmluZSBTU0hfQlVHX1BLQVVUSAkJMHgwMDAwMDAyMAorI2RlZmluZSBTU0hfQlVHX0RFQlVHCQkweDAwMDAwMDQwCisjZGVmaW5lIFNTSF9CVUdfQkFOTkVSCQkweDAwMDAwMDgwCisjZGVmaW5lIFNTSF9CVUdfSUdOT1JFTVNHCTB4MDAwMDAxMDAKKyNkZWZpbmUgU1NIX0JVR19QS09LCQkweDAwMDAwMjAwCisjZGVmaW5lIFNTSF9CVUdfUEFTU1dPUkRQQUQJMHgwMDAwMDQwMAorI2RlZmluZSBTU0hfQlVHX1NDQU5ORVIJCTB4MDAwMDA4MDAKKyNkZWZpbmUgU1NIX0JVR19CSUdFTkRJQU5BRVMJMHgwMDAwMTAwMAorI2RlZmluZSBTU0hfQlVHX1JTQVNJR01ENQkweDAwMDAyMDAwCisjZGVmaW5lIFNTSF9PTERfREhHRVgJCTB4MDAwMDQwMDAKKyNkZWZpbmUgU1NIX0JVR19OT1JFS0VZCQkweDAwMDA4MDAwCisjZGVmaW5lIFNTSF9CVUdfSEJTRVJWSUNFCTB4MDAwMTAwMDAKKyNkZWZpbmUgU1NIX0JVR19PUEVORkFJTFVSRQkweDAwMDIwMDAwCisjZGVmaW5lIFNTSF9CVUdfREVSSVZFS0VZCTB4MDAwNDAwMDAKKyNkZWZpbmUgU1NIX0JVR19EVU1NWUNIQU4JMHgwMDEwMDAwMAorI2RlZmluZSBTU0hfQlVHX0VYVEVPRgkJMHgwMDIwMDAwMAorI2RlZmluZSBTU0hfQlVHX1BST0JFCQkweDAwNDAwMDAwCisjZGVmaW5lIFNTSF9CVUdfRklSU1RLRVgJMHgwMDgwMDAwMAorI2RlZmluZSBTU0hfT0xEX0ZPUldBUkRfQUREUgkweDAxMDAwMDAwCisjZGVmaW5lIFNTSF9CVUdfUkZXRF9BRERSCTB4MDIwMDAwMDAKKyNkZWZpbmUgU1NIX05FV19PUEVOU1NICQkweDA0MDAwMDAwCisjZGVmaW5lIFNTSF9CVUdfRFlOQU1JQ19SUE9SVAkweDA4MDAwMDAwCisKK3ZvaWQgICAgIGVuYWJsZV9jb21wYXQxMyh2b2lkKTsKK3ZvaWQgICAgIGVuYWJsZV9jb21wYXQyMCh2b2lkKTsKK3ZvaWQgICAgIGNvbXBhdF9kYXRhZmVsbG93cyhjb25zdCBjaGFyICopOworaW50CSBwcm90b19zcGVjKGNvbnN0IGNoYXIgKik7CitjaGFyCSpjb21wYXRfY2lwaGVyX3Byb3Bvc2FsKGNoYXIgKik7CisKK2V4dGVybiBpbnQgY29tcGF0MTM7CitleHRlcm4gaW50IGNvbXBhdDIwOworZXh0ZXJuIGludCBkYXRhZmVsbG93czsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jb21wcmVzcy5jIGIvb3BlbnNzaC02LjBwMS9jb21wcmVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0Nzc4ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NvbXByZXNzLmMKQEAgLTAsMCArMSwxNjcgQEAKKy8qICRPcGVuQlNEOiBjb21wcmVzcy5jLHYgMS4yNiAyMDEwLzA5LzA4IDA0OjEzOjMxIGRlcmFhZHQgRXhwICQgKi8KKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiBJbnRlcmZhY2UgdG8gcGFja2V0IGNvbXByZXNzaW9uIGZvciBzc2guCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJjb21wcmVzcy5oIgorCisjaW5jbHVkZSA8emxpYi5oPgorCit6X3N0cmVhbSBpbmNvbWluZ19zdHJlYW07Cit6X3N0cmVhbSBvdXRnb2luZ19zdHJlYW07CitzdGF0aWMgaW50IGNvbXByZXNzX2luaXRfc2VuZF9jYWxsZWQgPSAwOworc3RhdGljIGludCBjb21wcmVzc19pbml0X3JlY3ZfY2FsbGVkID0gMDsKK3N0YXRpYyBpbnQgaW5mbGF0ZV9mYWlsZWQgPSAwOworc3RhdGljIGludCBkZWZsYXRlX2ZhaWxlZCA9IDA7CisKKy8qCisgKiBJbml0aWFsaXplcyBjb21wcmVzc2lvbjsgbGV2ZWwgaXMgY29tcHJlc3Npb24gbGV2ZWwgZnJvbSAxIHRvIDkKKyAqIChhcyBpbiBnemlwKS4KKyAqLworCit2b2lkCitidWZmZXJfY29tcHJlc3NfaW5pdF9zZW5kKGludCBsZXZlbCkKK3sKKwlpZiAoY29tcHJlc3NfaW5pdF9zZW5kX2NhbGxlZCA9PSAxKQorCQlkZWZsYXRlRW5kKCZvdXRnb2luZ19zdHJlYW0pOworCWNvbXByZXNzX2luaXRfc2VuZF9jYWxsZWQgPSAxOworCWRlYnVnKCJFbmFibGluZyBjb21wcmVzc2lvbiBhdCBsZXZlbCAlZC4iLCBsZXZlbCk7CisJaWYgKGxldmVsIDwgMSB8fCBsZXZlbCA+IDkpCisJCWZhdGFsKCJCYWQgY29tcHJlc3Npb24gbGV2ZWwgJWQuIiwgbGV2ZWwpOworCWRlZmxhdGVJbml0KCZvdXRnb2luZ19zdHJlYW0sIGxldmVsKTsKK30KK3ZvaWQKK2J1ZmZlcl9jb21wcmVzc19pbml0X3JlY3Yodm9pZCkKK3sKKwlpZiAoY29tcHJlc3NfaW5pdF9yZWN2X2NhbGxlZCA9PSAxKQorCQlpbmZsYXRlRW5kKCZpbmNvbWluZ19zdHJlYW0pOworCWNvbXByZXNzX2luaXRfcmVjdl9jYWxsZWQgPSAxOworCWluZmxhdGVJbml0KCZpbmNvbWluZ19zdHJlYW0pOworfQorCisvKiBGcmVlcyBhbnkgZGF0YSBzdHJ1Y3R1cmVzIGFsbG9jYXRlZCBmb3IgY29tcHJlc3Npb24uICovCisKK3ZvaWQKK2J1ZmZlcl9jb21wcmVzc191bmluaXQodm9pZCkKK3sKKwlkZWJ1ZygiY29tcHJlc3Mgb3V0Z29pbmc6IHJhdyBkYXRhICVsbHUsIGNvbXByZXNzZWQgJWxsdSwgZmFjdG9yICUuMmYiLAorCSAgICAodW5zaWduZWQgbG9uZyBsb25nKW91dGdvaW5nX3N0cmVhbS50b3RhbF9pbiwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvdXRnb2luZ19zdHJlYW0udG90YWxfb3V0LAorCSAgICBvdXRnb2luZ19zdHJlYW0udG90YWxfaW4gPT0gMCA/IDAuMCA6CisJICAgIChkb3VibGUpIG91dGdvaW5nX3N0cmVhbS50b3RhbF9vdXQgLyBvdXRnb2luZ19zdHJlYW0udG90YWxfaW4pOworCWRlYnVnKCJjb21wcmVzcyBpbmNvbWluZzogcmF3IGRhdGEgJWxsdSwgY29tcHJlc3NlZCAlbGx1LCBmYWN0b3IgJS4yZiIsCisJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaW5jb21pbmdfc3RyZWFtLnRvdGFsX291dCwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylpbmNvbWluZ19zdHJlYW0udG90YWxfaW4sCisJICAgIGluY29taW5nX3N0cmVhbS50b3RhbF9vdXQgPT0gMCA/IDAuMCA6CisJICAgIChkb3VibGUpIGluY29taW5nX3N0cmVhbS50b3RhbF9pbiAvIGluY29taW5nX3N0cmVhbS50b3RhbF9vdXQpOworCWlmIChjb21wcmVzc19pbml0X3JlY3ZfY2FsbGVkID09IDEgJiYgaW5mbGF0ZV9mYWlsZWQgPT0gMCkKKwkJaW5mbGF0ZUVuZCgmaW5jb21pbmdfc3RyZWFtKTsKKwlpZiAoY29tcHJlc3NfaW5pdF9zZW5kX2NhbGxlZCA9PSAxICYmIGRlZmxhdGVfZmFpbGVkID09IDApCisJCWRlZmxhdGVFbmQoJm91dGdvaW5nX3N0cmVhbSk7Cit9CisKKy8qCisgKiBDb21wcmVzc2VzIHRoZSBjb250ZW50cyBvZiBpbnB1dF9idWZmZXIgaW50byBvdXRwdXRfYnVmZmVyLiAgQWxsIHBhY2tldHMKKyAqIGNvbXByZXNzZWQgdXNpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIGZvcm0gYSBzaW5nbGUgY29tcHJlc3NlZCBkYXRhIHN0cmVhbTsKKyAqIGhvd2V2ZXIsIGRhdGEgd2lsbCBiZSBmbHVzaGVkIGF0IHRoZSBlbmQgb2YgZXZlcnkgY2FsbCBzbyB0aGF0IGVhY2gKKyAqIG91dHB1dF9idWZmZXIgY2FuIGJlIGRlY29tcHJlc3NlZCBpbmRlcGVuZGVudGx5IChidXQgaW4gdGhlIGFwcHJvcHJpYXRlCisgKiBvcmRlciBzaW5jZSB0aGV5IHRvZ2V0aGVyIGZvcm0gYSBzaW5nbGUgY29tcHJlc3Npb24gc3RyZWFtKSBieSB0aGUKKyAqIHJlY2VpdmVyLiAgVGhpcyBhcHBlbmRzIHRoZSBjb21wcmVzc2VkIGRhdGEgdG8gdGhlIG91dHB1dCBidWZmZXIuCisgKi8KKwordm9pZAorYnVmZmVyX2NvbXByZXNzKEJ1ZmZlciAqIGlucHV0X2J1ZmZlciwgQnVmZmVyICogb3V0cHV0X2J1ZmZlcikKK3sKKwl1X2NoYXIgYnVmWzQwOTZdOworCWludCBzdGF0dXM7CisKKwkvKiBUaGlzIGNhc2UgaXMgbm90IGhhbmRsZWQgYmVsb3cuICovCisJaWYgKGJ1ZmZlcl9sZW4oaW5wdXRfYnVmZmVyKSA9PSAwKQorCQlyZXR1cm47CisKKwkvKiBJbnB1dCBpcyB0aGUgY29udGVudHMgb2YgdGhlIGlucHV0IGJ1ZmZlci4gKi8KKwlvdXRnb2luZ19zdHJlYW0ubmV4dF9pbiA9IGJ1ZmZlcl9wdHIoaW5wdXRfYnVmZmVyKTsKKwlvdXRnb2luZ19zdHJlYW0uYXZhaWxfaW4gPSBidWZmZXJfbGVuKGlucHV0X2J1ZmZlcik7CisKKwkvKiBMb29wIGNvbXByZXNzaW5nIHVudGlsIGRlZmxhdGUoKSByZXR1cm5zIHdpdGggYXZhaWxfb3V0ICE9IDAuICovCisJZG8geworCQkvKiBTZXQgdXAgZml4ZWQtc2l6ZSBvdXRwdXQgYnVmZmVyLiAqLworCQlvdXRnb2luZ19zdHJlYW0ubmV4dF9vdXQgPSBidWY7CisJCW91dGdvaW5nX3N0cmVhbS5hdmFpbF9vdXQgPSBzaXplb2YoYnVmKTsKKworCQkvKiBDb21wcmVzcyBhcyBtdWNoIGRhdGEgaW50byB0aGUgYnVmZmVyIGFzIHBvc3NpYmxlLiAqLworCQlzdGF0dXMgPSBkZWZsYXRlKCZvdXRnb2luZ19zdHJlYW0sIFpfUEFSVElBTF9GTFVTSCk7CisJCXN3aXRjaCAoc3RhdHVzKSB7CisJCWNhc2UgWl9PSzoKKwkJCS8qIEFwcGVuZCBjb21wcmVzc2VkIGRhdGEgdG8gb3V0cHV0X2J1ZmZlci4gKi8KKwkJCWJ1ZmZlcl9hcHBlbmQob3V0cHV0X2J1ZmZlciwgYnVmLAorCQkJICAgIHNpemVvZihidWYpIC0gb3V0Z29pbmdfc3RyZWFtLmF2YWlsX291dCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRlZmxhdGVfZmFpbGVkID0gMTsKKwkJCWZhdGFsKCJidWZmZXJfY29tcHJlc3M6IGRlZmxhdGUgcmV0dXJuZWQgJWQiLCBzdGF0dXMpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJfSB3aGlsZSAob3V0Z29pbmdfc3RyZWFtLmF2YWlsX291dCA9PSAwKTsKK30KKworLyoKKyAqIFVuY29tcHJlc3NlcyB0aGUgY29udGVudHMgb2YgaW5wdXRfYnVmZmVyIGludG8gb3V0cHV0X2J1ZmZlci4gIEFsbCBwYWNrZXRzCisgKiB1bmNvbXByZXNzZWQgdXNpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIGZvcm0gYSBzaW5nbGUgY29tcHJlc3NlZCBkYXRhCisgKiBzdHJlYW07IGhvd2V2ZXIsIGRhdGEgd2lsbCBiZSBmbHVzaGVkIGF0IHRoZSBlbmQgb2YgZXZlcnkgY2FsbCBzbyB0aGF0CisgKiBlYWNoIG91dHB1dF9idWZmZXIuICBUaGlzIG11c3QgYmUgY2FsbGVkIGZvciB0aGUgc2FtZSBzaXplIHVuaXRzIHRoYXQgdGhlCisgKiBidWZmZXJfY29tcHJlc3Mgd2FzIGNhbGxlZCwgYW5kIGluIHRoZSBzYW1lIG9yZGVyIHRoYXQgYnVmZmVycyBjb21wcmVzc2VkCisgKiB3aXRoIHRoYXQuICBUaGlzIGFwcGVuZHMgdGhlIHVuY29tcHJlc3NlZCBkYXRhIHRvIHRoZSBvdXRwdXQgYnVmZmVyLgorICovCisKK3ZvaWQKK2J1ZmZlcl91bmNvbXByZXNzKEJ1ZmZlciAqIGlucHV0X2J1ZmZlciwgQnVmZmVyICogb3V0cHV0X2J1ZmZlcikKK3sKKwl1X2NoYXIgYnVmWzQwOTZdOworCWludCBzdGF0dXM7CisKKwlpbmNvbWluZ19zdHJlYW0ubmV4dF9pbiA9IGJ1ZmZlcl9wdHIoaW5wdXRfYnVmZmVyKTsKKwlpbmNvbWluZ19zdHJlYW0uYXZhaWxfaW4gPSBidWZmZXJfbGVuKGlucHV0X2J1ZmZlcik7CisKKwlmb3IgKDs7KSB7CisJCS8qIFNldCB1cCBmaXhlZC1zaXplIG91dHB1dCBidWZmZXIuICovCisJCWluY29taW5nX3N0cmVhbS5uZXh0X291dCA9IGJ1ZjsKKwkJaW5jb21pbmdfc3RyZWFtLmF2YWlsX291dCA9IHNpemVvZihidWYpOworCisJCXN0YXR1cyA9IGluZmxhdGUoJmluY29taW5nX3N0cmVhbSwgWl9QQVJUSUFMX0ZMVVNIKTsKKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJY2FzZSBaX09LOgorCQkJYnVmZmVyX2FwcGVuZChvdXRwdXRfYnVmZmVyLCBidWYsCisJCQkgICAgc2l6ZW9mKGJ1ZikgLSBpbmNvbWluZ19zdHJlYW0uYXZhaWxfb3V0KTsKKwkJCWJyZWFrOworCQljYXNlIFpfQlVGX0VSUk9SOgorCQkJLyoKKwkJCSAqIENvbW1lbnRzIGluIHpsaWIuaCBzYXkgdGhhdCB3ZSBzaG91bGQga2VlcCBjYWxsaW5nCisJCQkgKiBpbmZsYXRlKCkgdW50aWwgd2UgZ2V0IGFuIGVycm9yLiAgVGhpcyBhcHBlYXJzIHRvCisJCQkgKiBiZSB0aGUgZXJyb3IgdGhhdCB3ZSBnZXQuCisJCQkgKi8KKwkJCXJldHVybjsKKwkJZGVmYXVsdDoKKwkJCWluZmxhdGVfZmFpbGVkID0gMTsKKwkJCWZhdGFsKCJidWZmZXJfdW5jb21wcmVzczogaW5mbGF0ZSByZXR1cm5lZCAlZCIsIHN0YXR1cyk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2NvbXByZXNzLmggYi9vcGVuc3NoLTYuMHAxL2NvbXByZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE4ZDZmZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY29tcHJlc3MuaApAQCAtMCwwICsxLDI1IEBACisvKiAkT3BlbkJTRDogY29tcHJlc3MuaCx2IDEuMTIgMjAwNi8wMy8yNSAyMjoyMjo0MyBkam0gRXhwICQgKi8KKworLyoKKyAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAorICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIEludGVyZmFjZSB0byBwYWNrZXQgY29tcHJlc3Npb24gZm9yIHNzaC4KKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICovCisKKyNpZm5kZWYgQ09NUFJFU1NfSAorI2RlZmluZSBDT01QUkVTU19ICisKK3ZvaWQJIGJ1ZmZlcl9jb21wcmVzc19pbml0X3NlbmQoaW50KTsKK3ZvaWQJIGJ1ZmZlcl9jb21wcmVzc19pbml0X3JlY3Yodm9pZCk7Cit2b2lkICAgICBidWZmZXJfY29tcHJlc3NfdW5pbml0KHZvaWQpOwordm9pZCAgICAgYnVmZmVyX2NvbXByZXNzKEJ1ZmZlciAqLCBCdWZmZXIgKik7Cit2b2lkICAgICBidWZmZXJfdW5jb21wcmVzcyhCdWZmZXIgKiwgQnVmZmVyICopOworCisjZW5kaWYJCQkJLyogQ09NUFJFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jb25maWcuZ3Vlc3MgYi9vcGVuc3NoLTYuMHAxL2NvbmZpZy5ndWVzcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ODU1M2M0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9jb25maWcuZ3Vlc3MKQEAgLTAsMCArMSwxNTExIEBACisjISAvYmluL3NoCisjIEF0dGVtcHQgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUuCisjICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LAorIyAgIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsCisjICAgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKwordGltZXN0YW1wPScyMDExLTAxLTIzJworCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisjIDAyMTEwLTEzMDEsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisKKyMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLiAgUGxlYXNlIHNlbmQgcGF0Y2hlcyAoY29udGV4dAorIyBkaWZmIGZvcm1hdCkgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGFuZCBpbmNsdWRlIGEgQ2hhbmdlTG9nCisjIGVudHJ5LgorIworIyBUaGlzIHNjcmlwdCBhdHRlbXB0cyB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZSBzaW1pbGFyIHRvCisjIGNvbmZpZy5zdWIuICBJZiBpdCBzdWNjZWVkcywgaXQgcHJpbnRzIHRoZSBzeXN0ZW0gbmFtZSBvbiBzdGRvdXQsIGFuZAorIyBleGl0cyB3aXRoIDAuICBPdGhlcndpc2UsIGl0IGV4aXRzIHdpdGggMS4KKyMKKyMgWW91IGNhbiBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgc2NyaXB0IGZyb206CisjIGh0dHA6Ly9naXQuc2F2YW5uYWguZ251Lm9yZy9naXR3ZWIvP3A9Y29uZmlnLmdpdDthPWJsb2JfcGxhaW47Zj1jb25maWcuZ3Vlc3M7aGI9SEVBRAorCittZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXQorCitPdXRwdXQgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgc3lzdGVtIFxgJG1lJyBpcyBydW4gb24uCisKK09wZXJhdGlvbiBtb2RlczoKKyAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKworUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKKwordmVyc2lvbj0iXAorR05VIGNvbmZpZy5ndWVzcyAoJHRpbWVzdGFtcCkKKworT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLgorQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLAorMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCisKK2hlbHA9IgorVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisjIFBhcnNlIGNvbW1hbmQgbGluZQord2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQorICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCA7OworICAgIC0tdmVyc2lvbiB8IC12ICkKKyAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDs7CisgICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICAgc2hpZnQ7IGJyZWFrIDs7CisgICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgorICAgICAgIGJyZWFrIDs7CisgICAgLSogKQorICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIgPiYyCisgICAgICAgZXhpdCAxIDs7CisgICAgKiApCisgICAgICAgYnJlYWsgOzsKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgIGV4aXQgMQorZmkKKwordHJhcCAnZXhpdCAxJyAxIDIgMTUKKworIyBDQ19GT1JfQlVJTEQgLS0gY29tcGlsZXIgdXNlZCBieSB0aGlzIHNjcmlwdC4gTm90ZSB0aGF0IHRoZSB1c2Ugb2YgYQorIyBjb21waWxlciB0byBhaWQgaW4gc3lzdGVtIGRldGVjdGlvbiBpcyBkaXNjb3VyYWdlZCBhcyBpdCByZXF1aXJlcworIyB0ZW1wb3JhcnkgZmlsZXMgdG8gYmUgY3JlYXRlZCBhbmQsIGFzIHlvdSBjYW4gc2VlIGJlbG93LCBpdCBpcyBhCisjIGhlYWRhY2hlIHRvIGRlYWwgd2l0aCBpbiBhIHBvcnRhYmxlIGZhc2hpb24uCisKKyMgSGlzdG9yaWNhbGx5LCBgQ0NfRk9SX0JVSUxEJyB1c2VkIHRvIGJlIG5hbWVkIGBIT1NUX0NDJy4gV2Ugc3RpbGwKKyMgdXNlIGBIT1NUX0NDJyBpZiBkZWZpbmVkLCBidXQgaXQgaXMgZGVwcmVjYXRlZC4KKworIyBQb3J0YWJsZSB0bXAgZGlyZWN0b3J5IGNyZWF0aW9uIGluc3BpcmVkIGJ5IHRoZSBBdXRvY29uZiB0ZWFtLgorCitzZXRfY2NfZm9yX2J1aWxkPScKK3RyYXAgImV4aXRjb2RlPVwkPzsgKHJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsKSAmJiBleGl0IFwkZXhpdGNvZGUiIDAgOwordHJhcCAicm0gLWYgXCR0bXBmaWxlcyAyPi9kZXYvbnVsbDsgcm1kaXIgXCR0bXAgMj4vZGV2L251bGw7IGV4aXQgMSIgMSAyIDEzIDE1IDsKKzogJHtUTVBESVI9L3RtcH0gOworIHsgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAiJFRNUERJUi9jZ1hYWFhYWCIpIDI+L2Rldi9udWxsYCAmJiB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIiA7IH0gfHwKKyB7IHRlc3QgLW4gIiRSQU5ET00iICYmIHRtcD0kVE1QRElSL2NnJCQtJFJBTkRPTSAmJiAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApIDsgfSB8fAorIHsgdG1wPSRUTVBESVIvY2ctJCQgJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSAmJiBlY2hvICJXYXJuaW5nOiBjcmVhdGluZyBpbnNlY3VyZSB0ZW1wIGRpcmVjdG9yeSIgPiYyIDsgfSB8fAorIHsgZWNobyAiJG1lOiBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAkVE1QRElSIiA+JjIgOyBleGl0IDEgOyB9IDsKK2R1bW15PSR0bXAvZHVtbXkgOwordG1wZmlsZXM9IiRkdW1teS5jICRkdW1teS5vICRkdW1teS5yZWwgJGR1bW15IiA7CitjYXNlICRDQ19GT1JfQlVJTEQsJEhPU1RfQ0MsJENDIGluCisgLCwpICAgIGVjaG8gImludCB4OyIgPiAkZHVtbXkuYyA7CisJZm9yIGMgaW4gY2MgZ2NjIGM4OSBjOTkgOyBkbworCSAgaWYgKCRjIC1jIC1vICRkdW1teS5vICRkdW1teS5jKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJICAgICBDQ19GT1JfQlVJTEQ9IiRjIjsgYnJlYWsgOworCSAgZmkgOworCWRvbmUgOworCWlmIHRlc3QgeCIkQ0NfRk9SX0JVSUxEIiA9IHggOyB0aGVuCisJICBDQ19GT1JfQlVJTEQ9bm9fY29tcGlsZXJfZm91bmQgOworCWZpCisJOzsKKyAsLCopICAgQ0NfRk9SX0JVSUxEPSRDQyA7OworICwqLCopICBDQ19GT1JfQlVJTEQ9JEhPU1RfQ0MgOzsKK2VzYWMgOyBzZXRfY2NfZm9yX2J1aWxkPSA7JworCisjIFRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgdW5hbWUgb24gYSBQeXJhbWlkIE9TeCB3aGVuIHJ1biBpbiB0aGUgQlNEIHVuaXZlcnNlLgorIyAoZ2hhemlAbm9jLnJ1dGdlcnMuZWR1IDE5OTQtMDgtMjQpCitpZiAodGVzdCAtZiAvLmF0dGJpbi91bmFtZSkgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCVBBVEg9JFBBVEg6Ly5hdHRiaW4gOyBleHBvcnQgUEFUSAorZmkKKworVU5BTUVfTUFDSElORT1gKHVuYW1lIC1tKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfTUFDSElORT11bmtub3duCitVTkFNRV9SRUxFQVNFPWAodW5hbWUgLXIpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9SRUxFQVNFPXVua25vd24KK1VOQU1FX1NZU1RFTT1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAgIHx8IFVOQU1FX1NZU1RFTT11bmtub3duCitVTkFNRV9WRVJTSU9OPWAodW5hbWUgLXYpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9WRVJTSU9OPXVua25vd24KKworIyBOb3RlOiBvcmRlciBpcyBzaWduaWZpY2FudCAtIHRoZSBjYXNlIGJyYW5jaGVzIGFyZSBub3QgZXhjbHVzaXZlLgorCitjYXNlICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIGluCisgICAgKjpOZXRCU0Q6KjoqKQorCSMgTmV0QlNEIChuYnNkKSB0YXJnZXRzIHNob3VsZCAod2hlcmUgYXBwbGljYWJsZSkgbWF0Y2ggb25lIG9yCisJIyBtb3JlIG9mIHRoZSB0dXBwbGVzOiAqLSotbmV0YnNkZWxmKiwgKi0qLW5ldGJzZGFvdXQqLAorCSMgKi0qLW5ldGJzZGVjb2ZmKiBhbmQgKi0qLW5ldGJzZCouICBGb3IgdGFyZ2V0cyB0aGF0IHJlY2VudGx5CisJIyBzd2l0Y2hlZCB0byBFTEYsICotKi1uZXRic2QqIHdvdWxkIHNlbGVjdCB0aGUgb2xkCisJIyBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGlzIHByb3ZpZGVzIGJvdGggZm9yd2FyZAorCSMgY29tcGF0aWJpbGl0eSBhbmQgYSBjb25zaXN0ZW50IG1lY2hhbmlzbSBmb3Igc2VsZWN0aW5nIHRoZQorCSMgb2JqZWN0IGZpbGUgZm9ybWF0LgorCSMKKwkjIE5vdGU6IE5ldEJTRCBkb2Vzbid0IHBhcnRpY3VsYXJseSBjYXJlIGFib3V0IHRoZSB2ZW5kb3IKKwkjIHBvcnRpb24gb2YgdGhlIG5hbWUuICBXZSBhbHdheXMgc2V0IGl0IHRvICJ1bmtub3duIi4KKwlzeXNjdGw9InN5c2N0bCAtbiBody5tYWNoaW5lX2FyY2giCisJVU5BTUVfTUFDSElORV9BUkNIPWAoL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBcCisJICAgIC91c3Ivc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bilgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgorCSAgICBhcm1lYikgbWFjaGluZT1hcm1lYi11bmtub3duIDs7CisJICAgIGFybSopIG1hY2hpbmU9YXJtLXVua25vd24gOzsKKwkgICAgc2gzZWwpIG1hY2hpbmU9c2hsLXVua25vd24gOzsKKwkgICAgc2gzZWIpIG1hY2hpbmU9c2gtdW5rbm93biA7OworCSAgICBzaDVlbCkgbWFjaGluZT1zaDVsZS11bmtub3duIDs7CisJICAgICopIG1hY2hpbmU9JHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24gOzsKKwllc2FjCisJIyBUaGUgT3BlcmF0aW5nIFN5c3RlbSBpbmNsdWRpbmcgb2JqZWN0IGZvcm1hdCwgaWYgaXQgaGFzIHN3aXRjaGVkCisJIyB0byBFTEYgcmVjZW50bHksIG9yIHdpbGwgaW4gdGhlIGZ1dHVyZS4KKwljYXNlICIke1VOQU1FX01BQ0hJTkVfQVJDSH0iIGluCisJICAgIGFybSp8aTM4NnxtNjhrfG5zMzJrfHNoMyp8c3BhcmN8dmF4KQorCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCWlmIGVjaG8gX19FTEZfXyB8ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCBcCisJCQl8IGdyZXAgLXEgX19FTEZfXworCQl0aGVuCisJCSAgICAjIE9uY2UgYWxsIHV0aWxpdGllcyBjYW4gYmUgRUNPRkYgKG5ldGJzZGVjb2ZmKSBvciBhLm91dCAobmV0YnNkYW91dCkuCisJCSAgICAjIFJldHVybiBuZXRic2QgZm9yIGVpdGhlci4gIEZJWD8KKwkJICAgIG9zPW5ldGJzZAorCQllbHNlCisJCSAgICBvcz1uZXRic2RlbGYKKwkJZmkKKwkJOzsKKwkgICAgKikKKwkgICAgICAgIG9zPW5ldGJzZAorCQk7OworCWVzYWMKKwkjIFRoZSBPUyByZWxlYXNlCisJIyBEZWJpYW4gR05VL05ldEJTRCBtYWNoaW5lcyBoYXZlIGEgZGlmZmVyZW50IHVzZXJsYW5kLCBhbmQKKwkjIHRodXMsIG5lZWQgYSBkaXN0aW5jdCB0cmlwbGV0LiBIb3dldmVyLCB0aGV5IGRvIG5vdCBuZWVkCisJIyBrZXJuZWwgdmVyc2lvbiBpbmZvcm1hdGlvbiwgc28gaXQgY2FuIGJlIHJlcGxhY2VkIHdpdGggYQorCSMgc3VpdGFibGUgdGFnLCBpbiB0aGUgc3R5bGUgb2YgbGludXgtZ251LgorCWNhc2UgIiR7VU5BTUVfVkVSU0lPTn0iIGluCisJICAgIERlYmlhbiopCisJCXJlbGVhc2U9Jy1nbnUnCisJCTs7CisJICAgICopCisJCXJlbGVhc2U9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCisJCTs7CisJZXNhYworCSMgU2luY2UgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNOgorCSMgY29udGFpbnMgcmVkdW5kYW50IGluZm9ybWF0aW9uLCB0aGUgc2hvcnRlciBmb3JtOgorCSMgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0gaXMgdXNlZC4KKwllY2hvICIke21hY2hpbmV9LSR7b3N9JHtyZWxlYXNlfSIKKwlleGl0IDs7CisgICAgKjpPcGVuQlNEOio6KikKKwlVTkFNRV9NQUNISU5FX0FSQ0g9YGFyY2ggfCBzZWQgJ3MvT3BlbkJTRC4vLydgCisJZWNobyAke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOmVra29CU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWVra29ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6U29saWRCU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXNvbGlkYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtYWNwcGM6TWlyQlNEOio6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1taXJic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6TWlyQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1taXJic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGFscGhhOk9TRjE6KjoqKQorCWNhc2UgJFVOQU1FX1JFTEVBU0UgaW4KKwkqNC4wKQorCQlVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkM30nYAorCQk7OworCSo1LiopCisJICAgICAgICBVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkNH0nYAorCQk7OworCWVzYWMKKwkjIEFjY29yZGluZyB0byBDb21wYXEsIC91c3Ivc2Jpbi9wc3JpbmZvIGhhcyBiZWVuIGF2YWlsYWJsZSBvbgorCSMgT1NGLzEgYW5kIFRydTY0IHN5c3RlbXMgcHJvZHVjZWQgc2luY2UgMTk5NS4gIEkgaG9wZSB0aGF0CisJIyBjb3ZlcnMgbW9zdCBzeXN0ZW1zIHJ1bm5pbmcgdG9kYXkuICBUaGlzIGNvZGUgcGlwZXMgdGhlIENQVQorCSMgdHlwZXMgdGhyb3VnaCBoZWFkIC1uIDEsIHNvIHdlIG9ubHkgZGV0ZWN0IHRoZSB0eXBlIG9mIENQVSAwLgorCUFMUEhBX0NQVV9UWVBFPWAvdXNyL3NiaW4vcHNyaW5mbyAtdiB8IHNlZCAtbiAtZSAncy9eICBUaGUgYWxwaGEgXCguKlwpIHByb2Nlc3Nvci4qJC9cMS9wJyB8IGhlYWQgLW4gMWAKKwljYXNlICIkQUxQSEFfQ1BVX1RZUEUiIGluCisJICAgICJFVjQgKDIxMDY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiRVY0LjUgKDIxMDY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiTENBNCAoMjEwNjYvMjEwNjgpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJFVjUgKDIxMTY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1IiA7OworCSAgICAiRVY1LjYgKDIxMTY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiIDs7CisJICAgICJFVjUuNiAoMjExNjRQQykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU2IiA7OworCSAgICAiRVY1LjcgKDIxMTY0UEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NyIgOzsKKwkgICAgIkVWNiAoMjEyNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjYiIDs7CisJICAgICJFVjYuNyAoMjEyNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2NyIgOzsKKwkgICAgIkVWNi44Q0IgKDIxMjY0QykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOEFMICgyMTI2NEIpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjhDWCAoMjEyNjREKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi45QSAoMjEyNjQvRVY2OUEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY5IiA7OworCSAgICAiRVY3ICgyMTM2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NyIgOzsKKwkgICAgIkVWNy45ICgyMTM2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjc5IiA7OworCWVzYWMKKwkjIEEgUG4ubiB2ZXJzaW9uIGlzIGEgcGF0Y2hlZCB2ZXJzaW9uLgorCSMgQSBWbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCB2ZXJzaW9uLgorCSMgQSBUbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCBmaWVsZCB0ZXN0IHZlcnNpb24uCisJIyBBIFhuLm4gdmVyc2lvbiBpcyBhbiB1bnJlbGVhc2VkIGV4cGVyaW1lbnRhbCBiYXNlbGV2ZWwuCisJIyAxLjIgdXNlcyAiMS4yIiBmb3IgdW5hbWUgLXIuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bUFZUWF0vLycgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisJIyBSZXNldCBFWElUIHRyYXAgYmVmb3JlIGV4aXRpbmcgdG8gYXZvaWQgc3B1cmlvdXMgbm9uLXplcm8gZXhpdCBjb2RlLgorCWV4aXRjb2RlPSQ/CisJdHJhcCAnJyAwCisJZXhpdCAkZXhpdGNvZGUgOzsKKyAgICBBbHBoYVwgKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIFNob3VsZCB3ZSBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQKKwkjIG9mIHRoZSBzcGVjaWZpYyBBbHBoYSBtb2RlbD8KKwllY2hvIGFscGhhLXBjLWludGVyaXgKKwlleGl0IDs7CisgICAgMjEwNjQ6V2luZG93c19OVDo1MDozKQorCWVjaG8gYWxwaGEtZGVjLXdpbm50My41CisJZXhpdCA7OworICAgIEFtaWdhKjpVTklYX1N5c3RlbV9WOjQuMDoqKQorCWVjaG8gbTY4ay11bmtub3duLXN5c3Y0CisJZXhpdCA7OworICAgICo6W0FhXW1pZ2FbT29dW1NzXToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYW1pZ2FvcworCWV4aXQgOzsKKyAgICAqOltNbV1vcnBoW09vXVtTc106KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1vcnBob3MKKwlleGl0IDs7CisgICAgKjpPUy8zOTA6KjoqKQorCWVjaG8gaTM3MC1pYm0tb3BlbmVkaXRpb24KKwlleGl0IDs7CisgICAgKjp6L1ZNOio6KikKKwllY2hvIHMzOTAtaWJtLXp2bW9lCisJZXhpdCA7OworICAgICo6T1M0MDA6KjoqKQorICAgICAgICBlY2hvIHBvd2VycGMtaWJtLW9zNDAwCisJZXhpdCA7OworICAgIGFybTpSSVNDKjoxLlswMTJdKjoqfGFybTpyaXNjaXg6MS5bMDEyXSo6KikKKwllY2hvIGFybS1hY29ybi1yaXNjaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGFybTpyaXNjb3M6KjoqfGFybTpSSVNDT1M6KjoqKQorCWVjaG8gYXJtLXVua25vd24tcmlzY29zCisJZXhpdCA7OworICAgIFNSMj8wMTpISS1VWC9NUFA6KjoqIHwgU1I4MDAwOkhJLVVYL01QUDoqOiopCisJZWNobyBocHBhMS4xLWhpdGFjaGktaGl1eG1wcAorCWV4aXQgOzsKKyAgICBQeXJhbWlkKjpPU3gqOio6KiB8IE1JUyo6T1N4KjoqOiogfCBNSVMqOlNNUF9EQy1PU3gqOio6KikKKwkjIGFrZWVAd3BkaXMwMy53cGFmYi5hZi5taWwgKEVhcmxlIEYuIEFrZSkgY29udHJpYnV0ZWQgTUlTIGFuZCBOSUxFLgorCWlmIHRlc3QgImAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgIiA9IGF0dCA7IHRoZW4KKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtc3lzdjMKKwllbHNlCisJCWVjaG8gcHlyYW1pZC1weXJhbWlkLWJzZAorCWZpCisJZXhpdCA7OworICAgIE5JTEUqOio6KjpkY29zeCkKKwllY2hvIHB5cmFtaWQtcHlyYW1pZC1zdnI0CisJZXhpdCA7OworICAgIERSUz82MDAwOnVuaXg6NC4wOjYqKQorCWVjaG8gc3BhcmMtaWNsLW54NgorCWV4aXQgOzsKKyAgICBEUlM/NjAwMDpVTklYX1NWOjQuMio6NyogfCBEUlM/NjAwMDppc2lzOjQuMio6NyopCisJY2FzZSBgL3Vzci9iaW4vdW5hbWUgLXBgIGluCisJICAgIHNwYXJjKSBlY2hvIHNwYXJjLWljbC1ueDc7IGV4aXQgOzsKKwllc2FjIDs7CisgICAgczM5MHg6U3VuT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgc3VuNEg6U3VuT1M6NS4qOiopCisJZWNobyBzcGFyYy1oYWwtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgc3VuNCo6U3VuT1M6NS4qOiogfCB0YWRwb2xlKjpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLXN1bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBpODZwYzpBdXJvcmFVWDo1Lio6KiB8IGk4NnhlbjpBdXJvcmFVWDo1Lio6KikKKwllY2hvIGkzODYtcGMtYXVyb3JhdXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGk4NnBjOlN1bk9TOjUuKjoqIHwgaTg2eGVuOlN1bk9TOjUuKjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlTVU5fQVJDSD0iaTM4NiIKKwkjIElmIHRoZXJlIGlzIGEgY29tcGlsZXIsIHNlZSBpZiBpdCBpcyBjb25maWd1cmVkIGZvciA2NC1iaXQgb2JqZWN0cy4KKwkjIE5vdGUgdGhhdCB0aGUgU3VuIGNjIGRvZXMgbm90IHR1cm4gX19MUDY0X18gaW50byAxIGxpa2UgZ2NjIGRvZXMuCisJIyBUaGlzIHRlc3Qgd29ya3MgZm9yIGJvdGggY29tcGlsZXJzLgorCWlmIFsgIiRDQ19GT1JfQlVJTEQiICE9ICdub19jb21waWxlcl9mb3VuZCcgXTsgdGhlbgorCSAgICBpZiAoZWNobyAnI2lmZGVmIF9fYW1kNjQnOyBlY2hvIElTXzY0QklUX0FSQ0g7IGVjaG8gJyNlbmRpZicpIHwgXAorCQkoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwgXAorCQlncmVwIElTXzY0QklUX0FSQ0ggPi9kZXYvbnVsbAorCSAgICB0aGVuCisJCVNVTl9BUkNIPSJ4ODZfNjQiCisJICAgIGZpCisJZmkKKwllY2hvICR7U1VOX0FSQ0h9LXBjLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIHN1bjQqOlN1bk9TOjYqOiopCisJIyBBY2NvcmRpbmcgdG8gY29uZmlnLnN1YiwgdGhpcyBpcyB0aGUgcHJvcGVyIHdheSB0byBjYW5vbmljYWxpemUKKwkjIFN1bk9TNi4gIEhhcmQgdG8gZ3Vlc3MgZXhhY3RseSB3aGF0IFN1bk9TNiB3aWxsIGJlIGxpa2UsIGJ1dAorCSMgaXQncyBsaWtlbHkgdG8gYmUgbW9yZSBsaWtlIFNvbGFyaXMgdGhhbiBTdW5PUzQuCisJZWNobyBzcGFyYy1zdW4tc29sYXJpczNgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgc3VuNCo6U3VuT1M6KjoqKQorCWNhc2UgImAvdXNyL2Jpbi9hcmNoIC1rYCIgaW4KKwkgICAgU2VyaWVzKnxTNCopCisJCVVOQU1FX1JFTEVBU0U9YHVuYW1lIC12YAorCQk7OworCWVzYWMKKwkjIEphcGFuZXNlIExhbmd1YWdlIHZlcnNpb25zIGhhdmUgYSB2ZXJzaW9uIG51bWJlciBsaWtlIGA0LjEuMy1KTCcuCisJZWNobyBzcGFyYy1zdW4tc3Vub3NgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vJ2AKKwlleGl0IDs7CisgICAgc3VuMyo6U3VuT1M6KjoqKQorCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHN1bio6Kjo0LjJCU0Q6KikKKwlVTkFNRV9SRUxFQVNFPWAoc2VkIDFxIC9ldGMvbW90ZCB8IGF3ayAne3ByaW50IHN1YnN0cigkNSwxLDMpfScpIDI+L2Rldi9udWxsYAorCXRlc3QgIngke1VOQU1FX1JFTEVBU0V9IiA9ICJ4IiAmJiBVTkFNRV9SRUxFQVNFPTMKKwljYXNlICJgL2Jpbi9hcmNoYCIgaW4KKwkgICAgc3VuMykKKwkJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwkJOzsKKwkgICAgc3VuNCkKKwkJZWNobyBzcGFyYy1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJCTs7CisJZXNhYworCWV4aXQgOzsKKyAgICBhdXNocDpTdW5PUzoqOiopCisJZWNobyBzcGFyYy1hdXNwZXgtc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICMgVGhlIHNpdHVhdGlvbiBmb3IgTWlOVCBpcyBhIGxpdHRsZSBjb25mdXNpbmcuICBUaGUgbWFjaGluZSBuYW1lCisgICAgIyBjYW4gYmUgdmlydHVhbGx5IGV2ZXJ5dGhpbmcgKGV2ZXJ5dGhpbmcgd2hpY2ggaXMgbm90CisgICAgIyAiYXRhcmlzdCIgb3IgImF0YXJpc3RlIiBhdCBsZWFzdCBzaG91bGQgaGF2ZSBhIHByb2Nlc3NvcgorICAgICMgPiBtNjgwMDApLiAgVGhlIHN5c3RlbSBuYW1lIHJhbmdlcyBmcm9tICJNaU5UIiBvdmVyICJGcmVlTWlOVCIKKyAgICAjIHRvIHRoZSBsb3dlcmNhc2UgdmVyc2lvbiAibWludCIgKG9yICJmcmVlbWludCIpLiAgRmluYWxseQorICAgICMgdGhlIHN5c3RlbSBuYW1lICJUT1MiIGRlbm90ZXMgYSBzeXN0ZW0gd2hpY2ggaXMgYWN0dWFsbHkgbm90CisgICAgIyBNaU5ULiAgQnV0IE1pTlQgaXMgZG93bndhcmQgY29tcGF0aWJsZSB0byBUT1MsIHNvIHRoaXMgc2hvdWxkCisgICAgIyBiZSBubyBwcm9ibGVtLgorICAgIGF0YXJpc3RbZV06Kk1pTlQ6KjoqIHwgYXRhcmlzdFtlXToqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgYXRhcmkqOipNaU5UOio6KiB8IGF0YXJpKjoqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQorCWVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBleGl0IDs7CisgICAgKmZhbGNvbio6Kk1pTlQ6KjoqIHwgKmZhbGNvbio6Km1pbnQ6KjoqIHwgKmZhbGNvbio6KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtaWxhbio6Kk1pTlQ6KjoqIHwgbWlsYW4qOiptaW50Oio6KiB8ICptaWxhbio6KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1taWxhbi1taW50JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBleGl0IDs7CisgICAgaGFkZXMqOipNaU5UOio6KiB8IGhhZGVzKjoqbWludDoqOiogfCAqaGFkZXMqOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstaGFkZXMtbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCA7OworICAgICo6Kk1pTlQ6KjoqIHwgKjoqbWludDoqOiogfCAqOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstdW5rbm93bi1taW50JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBleGl0IDs7CisgICAgbTY4azptYWNodGVuOio6KikKKwllY2hvIG02OGstYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgcG93ZXJwYzptYWNodGVuOio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUklTQyo6TWFjaDoqOiopCisJZWNobyBtaXBzLWRlYy1tYWNoX2JzZDQuMworCWV4aXQgOzsKKyAgICBSSVNDKjpVTFRSSVg6KjoqKQorCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBWQVgqOlVMVFJJWCo6KjoqKQorCWVjaG8gdmF4LWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIDIwMjA6Q0xJWDoqOiogfCAyNDMwOkNMSVg6KjoqKQorCWVjaG8gY2xpcHBlci1pbnRlcmdyYXBoLWNsaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworI2lmZGVmIF9fY3BsdXNwbHVzCisjaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KKwlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworI2Vsc2UKKwlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgeworI2VuZGlmCisJI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQorCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNlbmRpZgorCSAgZXhpdCAoLTEpOworCX0KK0VPRgorCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmCisJICBkdW1teWFyZz1gZWNobyAiJHtVTkFNRV9SRUxFQVNFfSIgfCBzZWQgLW4gJ3MvXChbMC05XSpcKS4qL1wxL3AnYCAmJgorCSAgU1lTVEVNX05BTUU9YCRkdW1teSAkZHVtbXlhcmdgICYmCisJICAgIHsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQorCWVjaG8gbWlwcy1taXBzLXJpc2NvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgTW90b3JvbGE6UG93ZXJNQVhfT1M6KjoqKQorCWVjaG8gcG93ZXJwYy1tb3Rvcm9sYS1wb3dlcm1heAorCWV4aXQgOzsKKyAgICBNb3Rvcm9sYToqOjQuMzpQTDgtKikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VybWF4CisJZXhpdCA7OworICAgIE5pZ2h0X0hhd2s6KjoqOlBvd2VyTUFYX09TIHwgU3luZXJneTpQb3dlck1BWF9PUzoqOiopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcm1heAorCWV4aXQgOzsKKyAgICBOaWdodF9IYXdrOlBvd2VyX1VOSVg6KjoqKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4CisJZXhpdCA7OworICAgIG04OGs6Q1gvVVg6Nyo6KikKKwllY2hvIG04OGstaGFycmlzLWN4dXg3CisJZXhpdCA7OworICAgIG04OGs6Kjo0KjpSNCopCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3Y0CisJZXhpdCA7OworICAgIG04OGs6KjozKjpSMyopCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCisJZXhpdCA7OworICAgIEFWaWlPTjpkZ3V4Oio6KikKKyAgICAgICAgIyBERy9VWCByZXR1cm5zIEFWaWlPTiBmb3IgYWxsIGFyY2hpdGVjdHVyZXMKKyAgICAgICAgVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKKwlpZiBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTAwIF0gfHwgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODExMCBdCisJdGhlbgorCSAgICBpZiBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IG04OGtkZ3V4ZWxmeCBdIHx8IFwKKwkgICAgICAgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSB4IF0KKwkgICAgdGhlbgorCQllY2hvIG04OGstZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KKwkgICAgZWxzZQorCQllY2hvIG04OGstZGctZGd1eGJjcyR7VU5BTUVfUkVMRUFTRX0KKwkgICAgZmkKKwllbHNlCisJICAgIGVjaG8gaTU4Ni1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQorCWZpCisgCWV4aXQgOzsKKyAgICBNODgqOkRvbHBoaW5PUzoqOiopCSMgRG9scGhpbk9TIChTVlIzKQorCWVjaG8gbTg4ay1kb2xwaGluLXN5c3YzCisJZXhpdCA7OworICAgIE04OCo6KjpSMyo6KikKKwkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCisJZXhpdCA7OworICAgIFhEODgqOio6KjoqKSAjIFRla3Ryb25peCBYRDg4IHN5c3RlbSBydW5uaW5nIFVUZWtWIChTVlIzKQorCWVjaG8gbTg4ay10ZWt0cm9uaXgtc3lzdjMKKwlleGl0IDs7CisgICAgVGVrNDNbMC05XVswLTldOlVUZWs6KjoqKSAjIFRla3Ryb25peCA0MzAwIHN5c3RlbSBydW5uaW5nIFVUZWsgKEJTRCkKKwllY2hvIG02OGstdGVrdHJvbml4LWJzZAorCWV4aXQgOzsKKyAgICAqOklSSVgqOio6KikKKwllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCisJZXhpdCA7OworICAgID8/Pz8/Pz8/OkFJWD86WzEyXS4xOjIpICAgIyBBSVggMi4yLjEgb3IgQUlYIDIuMS4xIGlzIFJUL1BDIEFJWC4KKwllY2hvIHJvbXAtaWJtLWFpeCAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAorCWV4aXQgOzsgICAgICAgICAgICAgICAjIE5vdGUgdGhhdDogZWNobyAiJ2B1bmFtZSAtc2AnIiBnaXZlcyAnQUlYICcKKyAgICBpKjg2OkFJWDoqOiopCisJZWNobyBpMzg2LWlibS1haXgKKwlleGl0IDs7CisgICAgaWE2NDpBSVg6KjoqKQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tYWl4JHtJQk1fUkVWfQorCWV4aXQgOzsKKyAgICAqOkFJWDoyOjMpCisJaWYgZ3JlcCBib3MzMjUgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJc2VkICdzL14JCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJCSNpbmNsdWRlIDxzeXMvc3lzdGVtY2ZnLmg+CisKKwkJbWFpbigpCisJCQl7CisJCQlpZiAoIV9fcG93ZXJfcGMoKSkKKwkJCQlleGl0KDEpOworCQkJcHV0cygicG93ZXJwYy1pYm0tYWl4My4yLjUiKTsKKwkJCWV4aXQoMCk7CisJCQl9CitFT0YKKwkJaWYgJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAKKwkJdGhlbgorCQkJZWNobyAiJFNZU1RFTV9OQU1FIgorCQllbHNlCisJCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjUKKwkJZmkKKwllbGlmIGdyZXAgYm9zMzI0IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjQKKwllbHNlCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIKKwlmaQorCWV4aXQgOzsKKyAgICAqOkFJWDoqOls0NTY3XSkKKwlJQk1fQ1BVX0lEPWAvdXNyL3NiaW4vbHNkZXYgLUMgLWMgcHJvY2Vzc29yIC1TIGF2YWlsYWJsZSB8IHNlZCAxcSB8IGF3ayAneyBwcmludCAkMSB9J2AKKwlpZiAvdXNyL3NiaW4vbHNhdHRyIC1FbCAke0lCTV9DUFVfSUR9IHwgZ3JlcCAnIFBPV0VSJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJSUJNX0FSQ0g9cnM2MDAwCisJZWxzZQorCQlJQk1fQVJDSD1wb3dlcnBjCisJZmkKKwlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KKwkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKKwllbHNlCisJCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9CisJZmkKKwllY2hvICR7SUJNX0FSQ0h9LWlibS1haXgke0lCTV9SRVZ9CisJZXhpdCA7OworICAgICo6QUlYOio6KikKKwllY2hvIHJzNjAwMC1pYm0tYWl4CisJZXhpdCA7OworICAgIGlibXJ0OjQuNEJTRDoqfHJvbXAtaWJtOkJTRDoqKQorCWVjaG8gcm9tcC1pYm0tYnNkNC40CisJZXhpdCA7OworICAgIGlibXJ0OipCU0Q6Knxyb21wLWlibTpCU0Q6KikgICAgICAgICAgICAjIGNvdmVycyBSVC9QQyBCU0QgYW5kCisJZWNobyByb21wLWlibS1ic2Qke1VOQU1FX1JFTEVBU0V9ICAgIyA0LjMgd2l0aCB1bmFtZSBhZGRlZCB0bworCWV4aXQgOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwb3J0OiByb21wLWlibSBCU0QgNC4zCisgICAgKjpCT1NYOio6KikKKwllY2hvIHJzNjAwMC1idWxsLWJvc3gKKwlleGl0IDs7CisgICAgRFBYLzI/MDA6Qi5PLlMuOio6KikKKwllY2hvIG02OGstYnVsbC1zeXN2MworCWV4aXQgOzsKKyAgICA5MDAwL1szNF0/Pzo0LjNic2Q6MS4qOiopCisJZWNobyBtNjhrLWhwLWJzZAorCWV4aXQgOzsKKyAgICBocDMwMDo0LjRCU0Q6KjoqIHwgOTAwMC9bMzRdPz86NC4zYnNkOjIuKjoqKQorCWVjaG8gbTY4ay1ocC1ic2Q0LjQKKwlleGl0IDs7CisgICAgOTAwMC9bMzQ2NzhdPz86SFAtVVg6KjoqKQorCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCisJICAgIDkwMDAvMzE/ICkgICAgICAgICAgICBIUF9BUkNIPW02ODAwMCA7OworCSAgICA5MDAwL1szNF0/PyApICAgICAgICAgSFBfQVJDSD1tNjhrIDs7CisJICAgIDkwMDAvWzY3OF1bMC05XVswLTldKQorCQlpZiBbIC14IC91c3IvYmluL2dldGNvbmYgXTsgdGhlbgorCQkgICAgc2NfY3B1X3ZlcnNpb249YC91c3IvYmluL2dldGNvbmYgU0NfQ1BVX1ZFUlNJT04gMj4vZGV2L251bGxgCisgICAgICAgICAgICAgICAgICAgIHNjX2tlcm5lbF9iaXRzPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0tFUk5FTF9CSVRTIDI+L2Rldi9udWxsYAorICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NjX2NwdV92ZXJzaW9ufSIgaW4KKyAgICAgICAgICAgICAgICAgICAgICA1MjMpIEhQX0FSQ0g9ImhwcGExLjAiIDs7ICMgQ1BVX1BBX1JJU0MxXzAKKyAgICAgICAgICAgICAgICAgICAgICA1MjgpIEhQX0FSQ0g9ImhwcGExLjEiIDs7ICMgQ1BVX1BBX1JJU0MxXzEKKyAgICAgICAgICAgICAgICAgICAgICA1MzIpICAgICAgICAgICAgICAgICAgICAgICMgQ1BVX1BBX1JJU0MyXzAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c2Nfa2VybmVsX2JpdHN9IiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAzMikgSFBfQVJDSD0iaHBwYTIuMG4iIDs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIDY0KSBIUF9BUkNIPSJocHBhMi4wdyIgOzsKKwkJCSAgJycpIEhQX0FSQ0g9ImhwcGEyLjAiIDs7ICAgIyBIUC1VWCAxMC4yMAorICAgICAgICAgICAgICAgICAgICAgICAgZXNhYyA7OworICAgICAgICAgICAgICAgICAgICBlc2FjCisJCWZpCisJCWlmIFsgIiR7SFBfQVJDSH0iID0gIiIgXTsgdGhlbgorCQkgICAgZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQkgICAgc2VkICdzL14gICAgICAgICAgICAgIC8vJyA8PCBFT0YgPiRkdW1teS5jCisKKyAgICAgICAgICAgICAgI2RlZmluZSBfSFBVWF9TT1VSQ0UKKyAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGxpYi5oPgorICAgICAgICAgICAgICAjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyAgICAgICAgICAgICAgaW50IG1haW4gKCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisgICAgICAgICAgICAgICAgICBsb25nIGJpdHMgPSBzeXNjb25mKF9TQ19LRVJORUxfQklUUyk7CisgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgbG9uZyBjcHUgID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKKworICAgICAgICAgICAgICAgICAgc3dpdGNoIChjcHUpCisgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xIik7IGJyZWFrOworICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzJfMDoKKyAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQorICAgICAgICAgICAgICAJICAgIHN3aXRjaCAoYml0cykKKyAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgIAkJY2FzZSA2NDogcHV0cyAoImhwcGEyLjB3Iik7IGJyZWFrOworICAgICAgICAgICAgICAJCWNhc2UgMzI6IHB1dHMgKCJocHBhMi4wbiIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQlkZWZhdWx0OiBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQl9IGJyZWFrOworICAgICAgICAgICAgICAjZWxzZSAgLyogIWRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKSAqLworICAgICAgICAgICAgICAJICAgIHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgCWRlZmF1bHQ6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgZXhpdCAoMCk7CisgICAgICAgICAgICAgIH0KK0VPRgorCQkgICAgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwpICYmIEhQX0FSQ0g9YCRkdW1teWAKKwkJICAgIHRlc3QgLXogIiRIUF9BUkNIIiAmJiBIUF9BUkNIPWhwcGEKKwkJZmkgOzsKKwllc2FjCisJaWYgWyAke0hQX0FSQ0h9ID0gImhwcGEyLjB3IiBdCisJdGhlbgorCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisKKwkgICAgIyBocHBhMi4wdy1ocC1ocHV4KiBoYXMgYSA2NC1iaXQga2VybmVsIGFuZCBhIGNvbXBpbGVyIGdlbmVyYXRpbmcKKwkgICAgIyAzMi1iaXQgY29kZS4gIGhwcGE2NC1ocC1ocHV4KiBoYXMgdGhlIHNhbWUga2VybmVsIGFuZCBhIGNvbXBpbGVyCisJICAgICMgZ2VuZXJhdGluZyA2NC1iaXQgY29kZS4gIEdOVSBhbmQgSFAgdXNlIGRpZmZlcmVudCBub21lbmNsYXR1cmU6CisJICAgICMKKwkgICAgIyAkIENDX0ZPUl9CVUlMRD1jYyAuL2NvbmZpZy5ndWVzcworCSAgICAjID0+IGhwcGEyLjB3LWhwLWhwdXgxMS4yMworCSAgICAjICQgQ0NfRk9SX0JVSUxEPSJjYyArREEyLjB3IiAuL2NvbmZpZy5ndWVzcworCSAgICAjID0+IGhwcGE2NC1ocC1ocHV4MTEuMjMKKworCSAgICBpZiBlY2hvIF9fTFA2NF9fIHwgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsKSB8CisJCWdyZXAgLXEgX19MUDY0X18KKwkgICAgdGhlbgorCQlIUF9BUkNIPSJocHBhMi4wdyIKKwkgICAgZWxzZQorCQlIUF9BUkNIPSJocHBhNjQiCisJICAgIGZpCisJZmkKKwllY2hvICR7SFBfQVJDSH0taHAtaHB1eCR7SFBVWF9SRVZ9CisJZXhpdCA7OworICAgIGlhNjQ6SFAtVVg6KjoqKQorCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAorCWVjaG8gaWE2NC1ocC1ocHV4JHtIUFVYX1JFVn0KKwlleGl0IDs7CisgICAgMzA1MCo6SEktVVg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSNpbmNsdWRlIDx1bmlzdGQuaD4KKwlpbnQKKwltYWluICgpCisJeworCSAgbG9uZyBjcHUgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOworCSAgLyogVGhlIG9yZGVyIG1hdHRlcnMsIGJlY2F1c2UgQ1BVX0lTX0hQX01DNjhLIGVycm9uZW91c2x5IHJldHVybnMKKwkgICAgIHRydWUgZm9yIENQVV9QQV9SSVNDMV8wLiAgQ1BVX0lTX1BBX1JJU0MgcmV0dXJucyBjb3JyZWN0CisJICAgICByZXN1bHRzLCBob3dldmVyLiAgKi8KKwkgIGlmIChDUFVfSVNfUEFfUklTQyAoY3B1KSkKKwkgICAgeworCSAgICAgIHN3aXRjaCAoY3B1KQorCQl7CisJCSAgY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBjYXNlIENQVV9QQV9SSVNDMl8wOiBwdXRzICgiaHBwYTIuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgZGVmYXVsdDogcHV0cyAoImhwcGEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKENQVV9JU19IUF9NQzY4SyAoY3B1KSkKKwkgICAgcHV0cyAoIm02OGstaGl0YWNoaS1oaXV4d2UyIik7CisJICBlbHNlIHB1dHMgKCJ1bmtub3duLWhpdGFjaGktaGl1eHdlMiIpOworCSAgZXhpdCAoMCk7CisJfQorRU9GCisJJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAgJiYKKwkJeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9CisJZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgorCWV4aXQgOzsKKyAgICA5MDAwLzc/Pzo0LjNic2Q6KjoqIHwgOTAwMC84P1s3OV06NC4zYnNkOio6KiApCisJZWNobyBocHBhMS4xLWhwLWJzZAorCWV4aXQgOzsKKyAgICA5MDAwLzg/Pzo0LjNic2Q6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1ic2QKKwlleGl0IDs7CisgICAgKjk/Pyo6TVBFL2lYOio6KiB8ICozMDAwKjpNUEUvaVg6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAorCWV4aXQgOzsKKyAgICBocDc/PzpPU0YxOio6KiB8IGhwOD9bNzldOk9TRjE6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtb3NmCisJZXhpdCA7OworICAgIGhwOD8/Ok9TRjE6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1vc2YKKwlleGl0IDs7CisgICAgaSo4NjpPU0YxOio6KikKKwlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtaworCWVsc2UKKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQorCWZpCisJZXhpdCA7OworICAgIHBhcmlzYyo6TGl0ZXMqOio6KikKKwllY2hvIGhwcGExLjEtaHAtbGl0ZXMKKwlleGl0IDs7CisgICAgQzEqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMSo6KikKKwllY2hvIGMxLWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCA7OworICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorICAgICAgICBleGl0IDs7CisgICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCA7OworICAgIEMzOCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzOCo6KikKKwllY2hvIGMzOC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgOzsKKyAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQorCWVjaG8gYzQtY29udmV4LWJzZAorICAgICAgICBleGl0IDs7CisgICAgQ1JBWSpZLU1QOio6KjoqKQorCWVjaG8geW1wLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqW0EtWl05MDoqOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IFwKKwl8IHNlZCAtZSAncy9DUkFZLipcKFtBLVpdOTBcKS9cMS8nIFwKKwkgICAgICAtZSB5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LyBcCisJICAgICAgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlRTOio6KjoqKQorCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqVDNFOio6KjoqKQorCWVjaG8gYWxwaGFldjUtY3JheS11bmljb3NtayR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlNWMToqOio6KikKKwllY2hvIHN2MS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICAqOlVOSUNPUy9tcDoqOiopCisJZWNobyBjcmF5bnYtY3JheS11bmljb3NtcCR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBGMzBbMDFdOlVOSVhfU3lzdGVtX1Y6KjoqIHwgRjcwMDpVTklYX1N5c3RlbV9WOio6KikKKwlGVUpJVFNVX1BST0M9YHVuYW1lIC1tIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCisgICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvIC9fLydgCisgICAgICAgIGVjaG8gIiR7RlVKSVRTVV9QUk9DfS1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisgICAgICAgIGV4aXQgOzsKKyAgICA1MDAwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCisgICAgICAgIEZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKKyAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy8gL18vJ2AKKyAgICAgICAgZWNobyAic3BhcmMtZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgorCWV4aXQgOzsKKyAgICBpKjg2OkJTRC8zODY6KjoqIHwgaSo4NjpCU0QvT1M6KjoqIHwgKjpBc2NlbmRcIEVtYmVkZGVkL09TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgc3BhcmMqOkJTRC9PUzoqOiopCisJZWNobyBzcGFyYy11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6QlNEL09TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOkZyZWVCU0Q6KjoqKQorCWNhc2UgJHtVTkFNRV9NQUNISU5FfSBpbgorCSAgICBwYzk4KQorCQllY2hvIGkzODYtdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OworCSAgICBhbWQ2NCkKKwkJZWNobyB4ODZfNjQtdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OworCSAgICAqKQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OworCWVzYWMKKwlleGl0IDs7CisgICAgaSo6Q1lHV0lOKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1jeWd3aW4KKwlleGl0IDs7CisgICAgKjpNSU5HVyo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluZ3czMgorCWV4aXQgOzsKKyAgICBpKjp3aW5kb3dzMzIqOiopCisgICAgCSMgdW5hbWUgLW0gaW5jbHVkZXMgIi1wYyIgb24gdGhpcyBzeXN0ZW0uCisgICAgCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1taW5ndzMyCisJZXhpdCA7OworICAgIGkqOlBXKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1wdzMyCisJZXhpdCA7OworICAgICo6SW50ZXJpeCo6KikKKyAgICAJY2FzZSAke1VOQU1FX01BQ0hJTkV9IGluCisJICAgIHg4NikKKwkJZWNobyBpNTg2LXBjLWludGVyaXgke1VOQU1FX1JFTEVBU0V9CisJCWV4aXQgOzsKKwkgICAgYXV0aGVudGljYW1kIHwgZ2VudWluZWludGVsIHwgRU02NFQpCisJCWVjaG8geDg2XzY0LXVua25vd24taW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KKwkJZXhpdCA7OworCSAgICBJQTY0KQorCQllY2hvIGlhNjQtdW5rbm93bi1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQorCQlleGl0IDs7CisJZXNhYyA7OworICAgIFszNDVdODY6V2luZG93c185NToqIHwgWzM0NV04NjpXaW5kb3dzXzk4OiogfCBbMzQ1XTg2OldpbmRvd3NfTlQ6KikKKwllY2hvIGkke1VOQU1FX01BQ0hJTkV9LXBjLW1rcworCWV4aXQgOzsKKyAgICA4NjY0OldpbmRvd3NfTlQ6KikKKwllY2hvIHg4Nl82NC1wYy1ta3MKKwlleGl0IDs7CisgICAgaSo6V2luZG93c19OVCo6KiB8IFBlbnRpdW0qOldpbmRvd3NfTlQqOiopCisJIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPworCSMgSXQgYWxzbyBjb25mbGljdHMgd2l0aCBwcmUtMi4wIHZlcnNpb25zIG9mIEFUJlQgVVdJTi4gU2hvdWxkIHdlCisJIyBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZCBvZiBpMzg2PworCWVjaG8gaTU4Ni1wYy1pbnRlcml4CisJZXhpdCA7OworICAgIGkqOlVXSU4qOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXV3aW4KKwlleGl0IDs7CisgICAgYW1kNjQ6Q1lHV0lOKjoqOiogfCB4ODZfNjQ6Q1lHV0lOKjoqOiopCisJZWNobyB4ODZfNjQtdW5rbm93bi1jeWd3aW4KKwlleGl0IDs7CisgICAgcCo6Q1lHV0lOKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tY3lnd2luCisJZXhpdCA7OworICAgIHByZXAqOlN1bk9TOjUuKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgKjpHTlU6KjoqKQorCSMgdGhlIEdOVSBzeXN0ZW0KKwllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tZ251YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MsLy4qJCwsJ2AKKwlleGl0IDs7CisgICAgKjpHTlUvKjoqOiopCisJIyBvdGhlciBzeXN0ZW1zIHdpdGggR05VIGxpYmMgYW5kIHVzZXJsYW5kCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYGVjaG8gJHtVTkFNRV9TWVNURU19IHwgc2VkICdzLF5bXi9dKi8sLCcgfCB0ciAnW0EtWl0nICdbYS16XSdgYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYC1nbnUKKwlleGl0IDs7CisgICAgaSo4NjpNaW5peDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbml4CisJZXhpdCA7OworICAgIGFscGhhOkxpbnV4Oio6KikKKwljYXNlIGBzZWQgLW4gJy9eY3B1IG1vZGVsL3MvXi4qOiBcKC4qXCkvXDEvcCcgPCAvcHJvYy9jcHVpbmZvYCBpbgorCSAgRVY1KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjUgOzsKKwkgIEVWNTYpICBVTkFNRV9NQUNISU5FPWFscGhhZXY1NiA7OworCSAgUENBNTYpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgUENBNTcpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgRVY2KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjYgOzsKKwkgIEVWNjcpICBVTkFNRV9NQUNISU5FPWFscGhhZXY2NyA7OworCSAgRVY2OCopIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY4IDs7CisgICAgICAgIGVzYWMKKwlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIC9iaW4vc2ggfCBncmVwIC1xIGxkLnNvLjEKKwlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbiBMSUJDPSJsaWJjMSIgOyBlbHNlIExJQkM9IiIgOyBmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30KKwlleGl0IDs7CisgICAgYXJtKjpMaW51eDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCWlmIGVjaG8gX19BUk1fRUFCSV9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKKwkgICAgfCBncmVwIC1xIF9fQVJNX0VBQklfXworCXRoZW4KKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZWxzZQorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVlYWJpCisJZmkKKwlleGl0IDs7CisgICAgYXZyMzIqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgY3JpczpMaW51eDoqOiopCisJZWNobyBjcmlzLWF4aXMtbGludXgtZ251CisJZXhpdCA7OworICAgIGNyaXN2MzI6TGludXg6KjoqKQorCWVjaG8gY3Jpc3YzMi1heGlzLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBmcnY6TGludXg6KjoqKQorICAgIAllY2hvIGZydi11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBpKjg2OkxpbnV4Oio6KikKKwlMSUJDPWdudQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSNpZmRlZiBfX2RpZXRsaWJjX18KKwlMSUJDPWRpZXRsaWJjCisJI2VuZGlmCitFT0YKKwlldmFsIGAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgZ3JlcCAnXkxJQkMnYAorCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtJHtMSUJDfSIKKwlleGl0IDs7CisgICAgaWE2NDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIG0zMnIqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgbTY4KjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIG1pcHM6TGludXg6KjoqIHwgbWlwczY0OkxpbnV4Oio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjdW5kZWYgQ1BVCisJI3VuZGVmICR7VU5BTUVfTUFDSElORX0KKwkjdW5kZWYgJHtVTkFNRV9NQUNISU5FfWVsCisJI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkKKwlDUFU9JHtVTkFNRV9NQUNISU5FfWVsCisJI2Vsc2UKKwkjaWYgZGVmaW5lZChfX01JUFNFQl9fKSB8fCBkZWZpbmVkKF9fTUlQU0VCKSB8fCBkZWZpbmVkKF9NSVBTRUIpIHx8IGRlZmluZWQoTUlQU0VCKQorCUNQVT0ke1VOQU1FX01BQ0hJTkV9CisJI2Vsc2UKKwlDUFU9CisJI2VuZGlmCisJI2VuZGlmCitFT0YKKwlldmFsIGAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgZ3JlcCAnXkNQVSdgCisJdGVzdCB4IiR7Q1BVfSIgIT0geCAmJiB7IGVjaG8gIiR7Q1BVfS11bmtub3duLWxpbnV4LWdudSI7IGV4aXQ7IH0KKwk7OworICAgIG9yMzI6TGludXg6KjoqKQorCWVjaG8gb3IzMi11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBwYWRyZTpMaW51eDoqOiopCisJZWNobyBzcGFyYy11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBwYXJpc2M2NDpMaW51eDoqOiogfCBocHBhNjQ6TGludXg6KjoqKQorCWVjaG8gaHBwYTY0LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHBhcmlzYzpMaW51eDoqOiogfCBocHBhOkxpbnV4Oio6KikKKwkjIExvb2sgZm9yIENQVSBsZXZlbAorCWNhc2UgYGdyZXAgJ15jcHVbXmEtel0qOicgL3Byb2MvY3B1aW5mbyAyPi9kZXYvbnVsbCB8IGN1dCAtZCcgJyAtZjJgIGluCisJICBQQTcqKSBlY2hvIGhwcGExLjEtdW5rbm93bi1saW51eC1nbnUgOzsKKwkgIFBBOCopIGVjaG8gaHBwYTIuMC11bmtub3duLWxpbnV4LWdudSA7OworCSAgKikgICAgZWNobyBocHBhLXVua25vd24tbGludXgtZ251IDs7CisJZXNhYworCWV4aXQgOzsKKyAgICBwcGM2NDpMaW51eDoqOiopCisJZWNobyBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgcHBjOkxpbnV4Oio6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgczM5MDpMaW51eDoqOiogfCBzMzkweDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1saW51eAorCWV4aXQgOzsKKyAgICBzaDY0KjpMaW51eDoqOiopCisgICAgCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBzaCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBzcGFyYzpMaW51eDoqOiogfCBzcGFyYzY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgdGlsZSo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS10aWxlcmEtbGludXgtZ251CisJZXhpdCA7OworICAgIHZheDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1saW51eC1nbnUKKwlleGl0IDs7CisgICAgeDg2XzY0OkxpbnV4Oio6KikKKwllY2hvIHg4Nl82NC11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICB4dGVuc2EqOkxpbnV4Oio6KikKKyAgICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIGkqODY6RFlOSVgvcHR4OjQqOiopCisJIyBwdHggNC4wIGRvZXMgdW5hbWUgLXMgY29ycmVjdGx5LCB3aXRoIERZTklYL3B0eCBpbiB0aGVyZS4KKwkjIGVhcmxpZXIgdmVyc2lvbnMgYXJlIG1lc3NlZCB1cCBhbmQgcHV0IHRoZSBub2RlbmFtZSBpbiBib3RoCisJIyBzeXNuYW1lIGFuZCBub2RlbmFtZS4KKwllY2hvIGkzODYtc2VxdWVudC1zeXN2NAorCWV4aXQgOzsKKyAgICBpKjg2OlVOSVhfU1Y6NC4yTVA6Mi4qKQorICAgICAgICAjIFVuaXh3YXJlIGlzIGFuIG9mZnNob290IG9mIFNWUjQsIGJ1dCBpdCBoYXMgaXRzIG93biB2ZXJzaW9uCisgICAgICAgICMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KKyAgICAgICAgIyBJIGFtIG5vdCBwb3NpdGl2ZSB0aGF0IG90aGVyIFNWUjQgc3lzdGVtcyB3b24ndCBtYXRjaCB0aGlzLAorCSMgSSBqdXN0IGhhdmUgdG8gaG9wZS4gIC0tIHJtcy4KKyAgICAgICAgIyBVc2Ugc3lzdjQuMnV3Li4uIHNvIHRoYXQgc3lzdjQqIG1hdGNoZXMgaXQuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Y0LjJ1dyR7VU5BTUVfVkVSU0lPTn0KKwlleGl0IDs7CisgICAgaSo4NjpPUy8yOio6KikKKwkjIElmIHdlIHdlcmUgYWJsZSB0byBmaW5kIGB1bmFtZScsIHRoZW4gRU1YIFVuaXggY29tcGF0aWJpbGl0eQorCSMgaXMgcHJvYmFibHkgaW5zdGFsbGVkLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1vczItZW14CisJZXhpdCA7OworICAgIGkqODY6WFRTLTMwMDoqOlNUT1ApCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3RvcAorCWV4aXQgOzsKKyAgICBpKjg2OmF0aGVvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYXRoZW9zCisJZXhpdCA7OworICAgIGkqODY6c3lsbGFibGU6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeWxsYWJsZQorCWV4aXQgOzsKKyAgICBpKjg2Okx5bnhPUzoyLio6KiB8IGkqODY6THlueE9TOjMuWzAxXSo6KiB8IGkqODY6THlueE9TOjQuWzAyXSo6KikKKwllY2hvIGkzODYtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGkqODY6KkRPUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1zZG9zZGpncHAKKwlleGl0IDs7CisgICAgaSo4NjoqOjQuKjoqIHwgaSo4NjpTWVNURU1fVjo0Lio6KikKKwlVTkFNRV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAncy9cL01QJC8vJ2AKKwlpZiBncmVwIE5vdmVsbCAvdXNyL2luY2x1ZGUvbGluay5oID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVuaXZlbC1zeXN2JHtVTkFNRV9SRUx9CisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdiR7VU5BTUVfUkVMfQorCWZpCisJZXhpdCA7OworICAgIGkqODY6Kjo1Ols2NzhdKikKKyAgICAJIyBVbml4V2FyZSA3LngsIE9wZW5VTklYIGFuZCBPcGVuU2VydmVyIDYuCisJY2FzZSBgL2Jpbi91bmFtZSAtWCB8IGdyZXAgIl5NYWNoaW5lImAgaW4KKwkgICAgKjQ4NiopCSAgICAgVU5BTUVfTUFDSElORT1pNDg2IDs7CisJICAgICpQZW50aXVtKQkgICAgIFVOQU1FX01BQ0hJTkU9aTU4NiA7OworCSAgICAqUGVudCp8KkNlbGVyb24pIFVOQU1FX01BQ0hJTkU9aTY4NiA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSR7VU5BTUVfU1lTVEVNfSR7VU5BTUVfVkVSU0lPTn0KKwlleGl0IDs7CisgICAgaSo4NjoqOjMuMjoqKQorCWlmIHRlc3QgLWYgL3Vzci9vcHRpb25zL2NiLm5hbWU7IHRoZW4KKwkJVU5BTUVfUkVMPWBzZWQgLW4gJ3MvLipWZXJzaW9uIC8vcCcgPC91c3Ivb3B0aW9ucy9jYi5uYW1lYAorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtaXNjJFVOQU1FX1JFTAorCWVsaWYgL2Jpbi91bmFtZSAtWCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgorCQlVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGdyZXAgUmVsZWFzZXxzZWQgLWUgJ3MvLio9IC8vJylgCisJCSgvYmluL3VuYW1lIC1YfGdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgorCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNTg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50ICpJSScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCisJZmkKKwlleGl0IDs7CisgICAgcGM6KjoqOiopCisJIyBMZWZ0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHk6CisgICAgICAgICMgdW5hbWUgLW0gcHJpbnRzIGZvciBESkdQUCBhbHdheXMgJ3BjJywgYnV0IGl0IHByaW50cyBub3RoaW5nIGFib3V0CisgICAgICAgICMgdGhlIHByb2Nlc3Nvciwgc28gd2UgcGxheSBzYWZlIGJ5IGFzc3VtaW5nIGk1ODYuCisJIyBOb3RlOiB3aGF0ZXZlciB0aGlzIGlzLCBpdCBNVVNUIGJlIHRoZSBzYW1lIGFzIHdoYXQgY29uZmlnLnN1YgorCSMgcHJpbnRzIGZvciB0aGUgImRqZ3BwIiBob3N0LCBvciBlbHNlIEdEQiBjb25maWd1cnkgd2lsbCBkZWNpZGUgdGhhdAorCSMgdGhpcyBpcyBhIGNyb3NzLWJ1aWxkLgorCWVjaG8gaTU4Ni1wYy1tc2Rvc2RqZ3BwCisgICAgICAgIGV4aXQgOzsKKyAgICBJbnRlbDpNYWNoOjMqOiopCisJZWNobyBpMzg2LXBjLW1hY2gzCisJZXhpdCA7OworICAgIHBhcmFnb246KjoqOiopCisJZWNobyBpODYwLWludGVsLW9zZjEKKwlleGl0IDs7CisgICAgaTg2MDoqOjQuKjoqKSAjIGk4NjAtU1ZSNAorCWlmIGdyZXAgU3RhcmRlbnQgL3Vzci9pbmNsdWRlL3N5cy91YWRtaW4uaCA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJICBlY2hvIGk4NjAtc3RhcmRlbnQtc3lzdiR7VU5BTUVfUkVMRUFTRX0gIyBTdGFyZGVudCBWaXN0cmEgaTg2MC1TVlI0CisJZWxzZSAjIEFkZCBvdGhlciBpODYwLVNWUjQgdmVuZG9ycyBiZWxvdyBhcyB0aGV5IGFyZSBkaXNjb3ZlcmVkLgorCSAgZWNobyBpODYwLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0gICMgVW5rbm93biBpODYwLVNWUjQKKwlmaQorCWV4aXQgOzsKKyAgICBtaW5pKjpDVElYOlNZUyo1OiopCisJIyAibWluaWZyYW1lIgorCWVjaG8gbTY4MDEwLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgOzsKKyAgICBtYzY4azpVTklYOlNZU1RFTTU6My41MW0pCisJZWNobyBtNjhrLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgOzsKKyAgICBNNjgwPzA6RC1OSVg6NS4zOiopCisJZWNobyBtNjhrLWRpYWItZG5peAorCWV4aXQgOzsKKyAgICBNNjgqOio6UjNWWzU2NzhdKjoqKQorCXRlc3QgLXIgL3N5c1Y2OCAmJiB7IGVjaG8gJ202OGstbW90b3JvbGEtc3lzdic7IGV4aXQ7IH0gOzsKKyAgICAzWzM0NV0/PzoqOjQuMDozLjAgfCAzWzM0XT8/QToqOjQuMDozLjAgfCAzWzM0XT8/LCo6Kjo0LjA6My4wIHwgM1szNF0/Py8qOio6NC4wOjMuMCB8IDQ0MDA6Kjo0LjA6My4wIHwgNDg1MDoqOjQuMDozLjAgfCBTS0E0MDoqOjQuMDozLjAgfCBTRFMyOio6NC4wOjMuMCB8IFNIRzI6Kjo0LjA6My4wIHwgUzc1MDEqOio6NC4wOjMuMCkKKwlPU19SRUw9JycKKwl0ZXN0IC1yIC9ldGMvLnJlbGlkIFwKKwkmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorCSAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0KKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKKwkgICYmIHsgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9IDs7CisgICAgM1szNF0/PzoqOjQuMDoqIHwgM1szNF0/PywqOio6NC4wOiopCisgICAgICAgIC9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorICAgICAgICAgICYmIHsgZWNobyBpNDg2LW5jci1zeXN2NDsgZXhpdDsgfSA7OworICAgIE5DUio6Kjo0LjI6KiB8IE1QUkFTKjoqOjQuMjoqKQorCU9TX1JFTD0nLjMnCisJdGVzdCAtciAvZXRjLy5yZWxpZCBcCisJICAgICYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisJICAgICYmIHsgZWNobyBpNDg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9CisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCisJICAgICYmIHsgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9CisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBwdGVyb24gPi9kZXYvbnVsbCBcCisJICAgICYmIHsgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9IDs7CisgICAgbTY4KjpMeW54T1M6Mi4qOiogfCBtNjgqOkx5bnhPUzozLjAqOiopCisJZWNobyBtNjhrLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtYzY4MDMwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCisJZWNobyBtNjhrLWF0YXJpLXN5c3Y0CisJZXhpdCA7OworICAgIFRTVU5BTUk6THlueE9TOjIuKjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHJzNjAwMDpMeW54T1M6Mi4qOiopCisJZWNobyByczYwMDAtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFBvd2VyUEM6THlueE9TOjIuKjoqIHwgUG93ZXJQQzpMeW54T1M6My5bMDFdKjoqIHwgUG93ZXJQQzpMeW54T1M6NC5bMDJdKjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU01bQkVdUzpVTklYX1NWOio6KikKKwllY2hvIG1pcHMtZGRlLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFJNKjpSZWxpYW50VU5JWC0qOio6KikKKwllY2hvIG1pcHMtc25pLXN5c3Y0CisJZXhpdCA7OworICAgIFJNKjpTSU5JWC0qOio6KikKKwllY2hvIG1pcHMtc25pLXN5c3Y0CisJZXhpdCA7OworICAgICo6U0lOSVgtKjoqOiopCisJaWYgdW5hbWUgLXAgMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KKwkJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXNuaS1zeXN2NAorCWVsc2UKKwkJZWNobyBuczMyay1zbmktc3lzdgorCWZpCisJZXhpdCA7OworICAgIFBFTlRJVU06Kjo0LjAqOiopICMgVW5pc3lzIGBDbGVhclBhdGggSE1QIElYIDQwMDAnIFNWUjQvTVAgZWZmb3J0CisgICAgICAgICAgICAgICAgICAgICAgIyBzYXlzIDxSaWNoYXJkLk0uQmFydGVsQGNjTWFpbC5DZW5zdXMuR09WPgorICAgICAgICBlY2hvIGk1ODYtdW5pc3lzLXN5c3Y0CisgICAgICAgIGV4aXQgOzsKKyAgICAqOlVOSVhfU3lzdGVtX1Y6NCo6RlRYKikKKwkjIEZyb20gR2VyYWxkIEhld2VzIDxoZXdlc0BvcGVubWFya2V0LmNvbT4uCisJIyBIb3cgYWJvdXQgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gc3RyYXR1cyBhcmNoaXRlY3R1cmVzPyAtZGptCisJZWNobyBocHBhMS4xLXN0cmF0dXMtc3lzdjQKKwlleGl0IDs7CisgICAgKjoqOio6RlRYKikKKwkjIEZyb20gc2VhbmZAc3dkYy5zdHJhdHVzLmNvbS4KKwllY2hvIGk4NjAtc3RyYXR1cy1zeXN2NAorCWV4aXQgOzsKKyAgICBpKjg2OlZPUzoqOiopCisJIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXN0cmF0dXMtdm9zCisJZXhpdCA7OworICAgICo6Vk9TOio6KikKKwkjIEZyb20gUGF1bC5HcmVlbkBzdHJhdHVzLmNvbS4KKwllY2hvIGhwcGExLjEtc3RyYXR1cy12b3MKKwlleGl0IDs7CisgICAgbWM2OCo6QS9VWDoqOiopCisJZWNobyBtNjhrLWFwcGxlLWF1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbmV3cyo6TkVXUy1PUzo2KjoqKQorCWVjaG8gbWlwcy1zb255LW5ld3NvczYKKwlleGl0IDs7CisgICAgUlszNF0wMDA6KlN5c3RlbV9WKjoqOiogfCBSNDAwMDpVTklYX1NZU1Y6KjoqIHwgUiowMDA6VU5JWF9TVjoqOiopCisJaWYgWyAtZCAvdXNyL25lYyBdOyB0aGVuCisJICAgICAgICBlY2hvIG1pcHMtbmVjLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZWxzZQorCSAgICAgICAgZWNobyBtaXBzLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorICAgICAgICBleGl0IDs7CisgICAgQmVCb3g6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIGhhcmR3YXJlIG1hZGUgYnkgQmUsIFBQQyBvbmx5LgorCWVjaG8gcG93ZXJwYy1iZS1iZW9zCisJZXhpdCA7OworICAgIEJlTWFjOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBNYWMgb3IgTWFjIGNsb25lLCBQUEMgb25seS4KKwllY2hvIHBvd2VycGMtYXBwbGUtYmVvcworCWV4aXQgOzsKKyAgICBCZVBDOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBJbnRlbCBQQyBjb21wYXRpYmxlLgorCWVjaG8gaTU4Ni1wYy1iZW9zCisJZXhpdCA7OworICAgIEJlUEM6SGFpa3U6KjoqKQkjIEhhaWt1IHJ1bm5pbmcgb24gSW50ZWwgUEMgY29tcGF0aWJsZS4KKwllY2hvIGk1ODYtcGMtaGFpa3UKKwlleGl0IDs7CisgICAgU1gtNDpTVVBFUi1VWDoqOiopCisJZWNobyBzeDQtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLTU6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g1LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC02OlNVUEVSLVVYOio6KikKKwllY2hvIHN4Ni1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtNzpTVVBFUi1VWDoqOiopCisJZWNobyBzeDctbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLTg6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g4LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC04UjpTVVBFUi1VWDoqOiopCisJZWNobyBzeDhyLW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBQb3dlcio6UmhhcHNvZHk6KjoqKQorCWVjaG8gcG93ZXJwYy1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpSaGFwc29keToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWFwcGxlLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOkRhcndpbjoqOiopCisJVU5BTUVfUFJPQ0VTU09SPWB1bmFtZSAtcGAgfHwgVU5BTUVfUFJPQ0VTU09SPXVua25vd24KKwljYXNlICRVTkFNRV9QUk9DRVNTT1IgaW4KKwkgICAgaTM4NikKKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlpZiBbICIkQ0NfRk9SX0JVSUxEIiAhPSAnbm9fY29tcGlsZXJfZm91bmQnIF07IHRoZW4KKwkJICBpZiAoZWNobyAnI2lmZGVmIF9fTFA2NF9fJzsgZWNobyBJU182NEJJVF9BUkNIOyBlY2hvICcjZW5kaWYnKSB8IFwKKwkJICAgICAgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsKSB8IFwKKwkJICAgICAgZ3JlcCBJU182NEJJVF9BUkNIID4vZGV2L251bGwKKwkJICB0aGVuCisJCSAgICAgIFVOQU1FX1BST0NFU1NPUj0ieDg2XzY0IgorCQkgIGZpCisJCWZpIDs7CisJICAgIHVua25vd24pIFVOQU1FX1BST0NFU1NPUj1wb3dlcnBjIDs7CisJZXNhYworCWVjaG8gJHtVTkFNRV9QUk9DRVNTT1J9LWFwcGxlLWRhcndpbiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpwcm9jbnRvKjoqOiogfCAqOlFOWDpbMDEyMzQ1Njc4OV0qOiopCisJVU5BTUVfUFJPQ0VTU09SPWB1bmFtZSAtcGAKKwlpZiB0ZXN0ICIkVU5BTUVfUFJPQ0VTU09SIiA9ICJ4ODYiOyB0aGVuCisJCVVOQU1FX1BST0NFU1NPUj1pMzg2CisJCVVOQU1FX01BQ0hJTkU9cGMKKwlmaQorCWVjaG8gJHtVTkFNRV9QUk9DRVNTT1J9LSR7VU5BTUVfTUFDSElORX0tbnRvLXFueCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpRTlg6Kjo0KikKKwllY2hvIGkzODYtcGMtcW54CisJZXhpdCA7OworICAgIE5FTy0/Ok5PTlNUT1BfS0VSTkVMOio6KikKKwllY2hvIG5lby10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBOU0UtPzpOT05TVE9QX0tFUk5FTDoqOiopCisJZWNobyBuc2UtdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgTlNSLT86Tk9OU1RPUF9LRVJORUw6KjoqKQorCWVjaG8gbnNyLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6Tm9uU3RvcC1VWDoqOiopCisJZWNobyBtaXBzLWNvbXBhcS1ub25zdG9wdXgKKwlleGl0IDs7CisgICAgQlMyMDAwOlBPU0lYKjoqOiopCisJZWNobyBiczIwMDAtc2llbWVucy1zeXN2CisJZXhpdCA7OworICAgIERTLyo6VU5JWF9TeXN0ZW1fVjoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LSR7VU5BTUVfU1lTVEVNfS0ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UGxhbjk6KjoqKQorCSMgInVuYW1lIC1tIiBpcyBub3QgY29uc2lzdGVudCwgc28gdXNlICRjcHV0eXBlIGluc3RlYWQuIDM4NgorCSMgaXMgY29udmVydGVkIHRvIGkzODYgZm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgeDg2CisJIyBvcGVyYXRpbmcgc3lzdGVtcy4KKwlpZiB0ZXN0ICIkY3B1dHlwZSIgPSAiMzg2IjsgdGhlbgorCSAgICBVTkFNRV9NQUNISU5FPWkzODYKKwllbHNlCisJICAgIFVOQU1FX01BQ0hJTkU9IiRjcHV0eXBlIgorCWZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tcGxhbjkKKwlleGl0IDs7CisgICAgKjpUT1BTLTEwOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdG9wczEwCisJZXhpdCA7OworICAgICo6VEVORVg6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10ZW5leAorCWV4aXQgOzsKKyAgICBLUzEwOlRPUFMtMjA6KjoqIHwgS0wxMDpUT1BTLTIwOio6KiB8IFRZUEU0OlRPUFMtMjA6KjoqKQorCWVjaG8gcGRwMTAtZGVjLXRvcHMyMAorCWV4aXQgOzsKKyAgICBYS0wtMTpUT1BTLTIwOio6KiB8IFRZUEU1OlRPUFMtMjA6KjoqKQorCWVjaG8gcGRwMTAteGtsLXRvcHMyMAorCWV4aXQgOzsKKyAgICAqOlRPUFMtMjA6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMjAKKwlleGl0IDs7CisgICAgKjpJVFM6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi1pdHMKKwlleGl0IDs7CisgICAgU0VJOio6KjpTRUlVWCkKKyAgICAgICAgZWNobyBtaXBzLXNlaS1zZWl1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpEcmFnb25GbHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWRyYWdvbmZseWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKKwlleGl0IDs7CisgICAgKjoqVk1TOio6KikKKyAgICAJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKwljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgorCSAgICBBKikgZWNobyBhbHBoYS1kZWMtdm1zIDsgZXhpdCA7OworCSAgICBJKikgZWNobyBpYTY0LWRlYy12bXMgOyBleGl0IDs7CisJICAgIFYqKSBlY2hvIHZheC1kZWMtdm1zIDsgZXhpdCA7OworCWVzYWMgOzsKKyAgICAqOlhFTklYOio6U3lzVikKKwllY2hvIGkzODYtcGMteGVuaXgKKwlleGl0IDs7CisgICAgaSo4Njpza3lvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNreW9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfWAgfCBzZWQgLWUgJ3MvIC4qJC8vJworCWV4aXQgOzsKKyAgICBpKjg2OnJkb3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1yZG9zCisJZXhpdCA7OworICAgIGkqODY6QVJPUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWFyb3MKKwlleGl0IDs7Citlc2FjCisKKyNlY2hvICcoTm8gdW5hbWUgY29tbWFuZCBvciB1bmFtZSBvdXRwdXQgbm90IHJlY29nbml6ZWQuKScgMT4mMgorI2VjaG8gIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgMT4mMgorCitldmFsICRzZXRfY2NfZm9yX2J1aWxkCitjYXQgPiRkdW1teS5jIDw8RU9GCisjaWZkZWYgX1NFUVVFTlRfCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2VuZGlmCittYWluICgpCit7CisjaWYgZGVmaW5lZCAoc29ueSkKKyNpZiBkZWZpbmVkIChNSVBTRUIpCisgIC8qIEJGRCB3YW50cyAiYnNkIiBpbnN0ZWFkIG9mICJuZXdzb3MiLiAgUGVyaGFwcyBCRkQgc2hvdWxkIGJlIGNoYW5nZWQsCisgICAgIEkgZG9uJ3Qga25vdy4uLi4gICovCisgIHByaW50ZiAoIm1pcHMtc29ueS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisgIHByaW50ZiAoIm02OGstc29ueS1uZXdzb3Mlc1xuIiwKKyNpZmRlZiBORVdTT1M0CisgICAgICAgICAgIjQiCisjZWxzZQorCSAgIiIKKyNlbmRpZgorICAgICAgICAgKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19hcm0pICYmIGRlZmluZWQgKF9fYWNvcm4pICYmIGRlZmluZWQgKF9fdW5peCkKKyAgcHJpbnRmICgiYXJtLWFjb3JuLXJpc2NpeFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChocDMwMCkgJiYgIWRlZmluZWQgKGhwdXgpCisgIHByaW50ZiAoIm02OGstaHAtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE5lWFQpCisjaWYgIWRlZmluZWQgKF9fQVJDSElURUNUVVJFX18pCisjZGVmaW5lIF9fQVJDSElURUNUVVJFX18gIm02OGsiCisjZW5kaWYKKyAgaW50IHZlcnNpb247CisgIHZlcnNpb249YChob3N0aW5mbyB8IHNlZCAtbiAncy8uKk5lWFQgTWFjaCBcKFswLTldKlwpLiovXDEvcCcpIDI+L2Rldi9udWxsYDsKKyAgaWYgKHZlcnNpb24gPCA0KQorICAgIHByaW50ZiAoIiVzLW5leHQtbmV4dHN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7CisgIGVsc2UKKyAgICBwcmludGYgKCIlcy1uZXh0LW9wZW5zdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoTVVMVElNQVgpIHx8IGRlZmluZWQgKG4xNikKKyNpZiBkZWZpbmVkIChVTUFYVikKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLXN5c3ZcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisjaWYgZGVmaW5lZCAoQ01VKQorICBwcmludGYgKCJuczMyay1lbmNvcmUtbWFjaFxuIik7IGV4aXQgKDApOworI2Vsc2UKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX18zODZCU0RfXykKKyAgcHJpbnRmICgiaTM4Ni1wYy1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoc2VxdWVudCkKKyNpZiBkZWZpbmVkIChpMzg2KQorICBwcmludGYgKCJpMzg2LXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKG5zMzIwMDApCisgIHByaW50ZiAoIm5zMzJrLXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU0VRVUVOVF8pCisgICAgc3RydWN0IHV0c25hbWUgdW47CisKKyAgICB1bmFtZSgmdW4pOworCisgICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYyIiwgMikgPT0gMCkgeworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgyXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMSIsIDIpID09IDApIHsgLyogWFhYIGlzIFYxIGNvcnJlY3Q/ICovCisJcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDFcbiIpOyBleGl0ICgwKTsKKyAgICB9CisgICAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eFxuIik7IGV4aXQgKDApOworCisjZW5kaWYKKworI2lmIGRlZmluZWQgKHZheCkKKyMgaWYgIWRlZmluZWQgKHVsdHJpeCkKKyMgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyAgaWYgZGVmaW5lZCAoQlNEKQorIyAgIGlmIEJTRCA9PSA0MworICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2Q0LjNcbiIpOyBleGl0ICgwKTsKKyMgICBlbHNlCisjICAgIGlmIEJTRCA9PSAxOTkwMDYKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zcmVub1xuIik7IGV4aXQgKDApOworIyAgICBlbHNlCisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbHNlCisgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKKyMgIGVuZGlmCisjIGVsc2UKKyAgICBwcmludGYgKCJ2YXgtZGVjLXVsdHJpeFxuIik7IGV4aXQgKDApOworIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChhbGxpYW50KSAmJiBkZWZpbmVkIChpODYwKQorICBwcmludGYgKCJpODYwLWFsbGlhbnQtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworICBleGl0ICgxKTsKK30KK0VPRgorCiskQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCAmJiBTWVNURU1fTkFNRT1gJGR1bW15YCAmJgorCXsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQorCisjIEFwb2xsb3MgcHV0IHRoZSBzeXN0ZW0gdHlwZSBpbiB0aGUgZW52aXJvbm1lbnQuCisKK3Rlc3QgLWQgL3Vzci9hcG9sbG8gJiYgeyBlY2hvICR7SVNQfS1hcG9sbG8tJHtTWVNUWVBFfTsgZXhpdDsgfQorCisjIENvbnZleCB2ZXJzaW9ucyB0aGF0IHByZWRhdGUgdW5hbWUgY2FuIHVzZSBnZXRzeXNpbmZvKDEpCisKK2lmIFsgLXggL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyBdCit0aGVuCisgICAgY2FzZSBgZ2V0c3lzaW5mbyAtZiBjcHVfdHlwZWAgaW4KKyAgICBjMSopCisJZWNobyBjMS1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIGMyKikKKwlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKKwl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKKwllbHNlIGVjaG8gYzItY29udmV4LWJzZAorCWZpCisJZXhpdCA7OworICAgIGMzNCopCisJZWNobyBjMzQtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBjMzgqKQorCWVjaG8gYzM4LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgYzQqKQorCWVjaG8gYzQtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBlc2FjCitmaQorCitjYXQgPiYyIDw8RU9GCiskMDogdW5hYmxlIHRvIGd1ZXNzIHN5c3RlbSB0eXBlCisKK1RoaXMgc2NyaXB0LCBsYXN0IG1vZGlmaWVkICR0aW1lc3RhbXAsIGhhcyBmYWlsZWQgdG8gcmVjb2duaXplCit0aGUgb3BlcmF0aW5nIHN5c3RlbSB5b3UgYXJlIHVzaW5nLiBJdCBpcyBhZHZpc2VkIHRoYXQgeW91Citkb3dubG9hZCB0aGUgbW9zdCB1cCB0byBkYXRlIHZlcnNpb24gb2YgdGhlIGNvbmZpZyBzY3JpcHRzIGZyb20KKworICBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLmd1ZXNzO2hiPUhFQUQKK2FuZAorICBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLnN1YjtoYj1IRUFECisKK0lmIHRoZSB2ZXJzaW9uIHlvdSBydW4gKCQwKSBpcyBhbHJlYWR5IHVwIHRvIGRhdGUsIHBsZWFzZQorc2VuZCB0aGUgZm9sbG93aW5nIGRhdGEgYW5kIGFueSBpbmZvcm1hdGlvbiB5b3UgdGhpbmsgbWlnaHQgYmUKK3BlcnRpbmVudCB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4gaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgbmVlZGVkCitpbmZvcm1hdGlvbiB0byBoYW5kbGUgeW91ciBzeXN0ZW0uCisKK2NvbmZpZy5ndWVzcyB0aW1lc3RhbXAgPSAkdGltZXN0YW1wCisKK3VuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorCisvdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsYAorL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsYAorCitob3N0aW5mbyAgICAgICAgICAgICAgID0gYChob3N0aW5mbykgMj4vZGV2L251bGxgCisvYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAKKy91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsYAorL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbGAKKy91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsYAorL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGxgCisKK1VOQU1FX01BQ0hJTkUgPSAke1VOQU1FX01BQ0hJTkV9CitVTkFNRV9SRUxFQVNFID0gJHtVTkFNRV9SRUxFQVNFfQorVU5BTUVfU1lTVEVNICA9ICR7VU5BTUVfU1lTVEVNfQorVU5BTUVfVkVSU0lPTiA9ICR7VU5BTUVfVkVSU0lPTn0KK0VPRgorCitleGl0IDEKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCisjIHRpbWUtc3RhbXAtZW5kOiAiJyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jb25maWcuaC5pbiBiL29wZW5zc2gtNi4wcDEvY29uZmlnLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBkMGM2NQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY29uZmlnLmguaW4KQEAgLTAsMCArMSwxNTUxIEBACisvKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIGlmIGJ1aWxkaW5nIHVuaXZlcnNhbCAoaW50ZXJuYWwgaGVscGVyIG1hY3JvKSAqLworI3VuZGVmIEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYSBnZXRhZGRyaW5mbyB0aGF0IGZhaWxzIGZvciB0aGUgYWxsLXplcm9zIElQdjYgYWRkcmVzcworICAgKi8KKyN1bmRlZiBBSVhfR0VUTkFNRUlORk9fSEFDSworCisvKiBEZWZpbmUgaWYgeW91ciBBSVggbG9naW5mYWlsZWQoKSBmdW5jdGlvbiB0YWtlcyA0IGFyZ3VtZW50cyAoQUlYID49IDUuMikgKi8KKyN1bmRlZiBBSVhfTE9HSU5GQUlMRURfNEFSRworCisvKiBTeXN0ZW0gb25seSBzdXBwb3J0cyBJUHY0IGF1ZGl0IHJlY29yZHMgKi8KKyN1bmRlZiBBVV9JUHY0CisKKy8qIERlZmluZSBpZiB5b3VyIHJlc29sdmVyIGxpYnMgbmVlZCB0aGlzIGZvciBnZXRycnNldGJ5bmFtZSAqLworI3VuZGVmIEJJTkRfOF9DT01QQVQKKworLyogVGhlIHN5c3RlbSBoYXMgaW5jb21wbGV0ZSBCU00gQVBJICovCisjdW5kZWYgQlJPS0VOX0JTTV9BUEkKKworLyogRGVmaW5lIGlmIGNtc2dfdHlwZSBpcyBub3QgcGFzc2VkIGNvcnJlY3RseSAqLworI3VuZGVmIEJST0tFTl9DTVNHX1RZUEUKKworLyogZ2V0YWRkcmluZm8gaXMgYnJva2VuIChpZiBwcmVzZW50KSAqLworI3VuZGVmIEJST0tFTl9HRVRBRERSSU5GTworCisvKiBnZXRncm91cHMoMCxOVUxMKSB3aWxsIHJldHVybiAtMSAqLworI3VuZGVmIEJST0tFTl9HRVRHUk9VUFMKKworLyogRnJlZUJTRCBnbG9iIGRvZXMgbm90IGRvIHdoYXQgd2UgbmVlZCAqLworI3VuZGVmIEJST0tFTl9HTE9CCisKKy8qIERlZmluZSBpZiB5b3Ugc3lzdGVtJ3MgaW5ldF9udG9hIGlzIGJ1c3RlZCAoZS5nLiBJcml4IGdjYyBpc3N1ZSkgKi8KKyN1bmRlZiBCUk9LRU5fSU5FVF9OVE9BCisKKy8qIGlhX3VpbmZvIHJvdXRpbmVzIG5vdCBzdXBwb3J0ZWQgYnkgT1MgeWV0ICovCisjdW5kZWYgQlJPS0VOX0xJQklBRgorCisvKiBVbHRyaXggbW1hcCBjYW4ndCBtYXAgZmlsZXMgKi8KKyN1bmRlZiBCUk9LRU5fTU1BUAorCisvKiBEZWZpbmUgaWYgeW91ciBzdHJ1Y3QgZGlyZW50IGV4cGVjdHMgeW91IHRvIGFsbG9jYXRlIGV4dHJhIHNwYWNlIGZvciBkX25hbWUKKyAgICovCisjdW5kZWYgQlJPS0VOX09ORV9CWVRFX0RJUkVOVF9EX05BTUUKKworLyogQ2FuJ3QgZG8gY29tcGFyaXNvbnMgb24gcmVhZHYgKi8KKyN1bmRlZiBCUk9LRU5fUkVBRFZfQ09NUEFSSVNPTgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYSBicm9rZW4gcmVhbHBhdGguICovCisjdW5kZWYgQlJPS0VOX1JFQUxQQVRICisKKy8qIE5lZWRlZCBmb3IgTmVYVCAqLworI3VuZGVmIEJST0tFTl9TQVZFRF9VSURTCisKKy8qIERlZmluZSBpZiB5b3VyIHNldHJlZ2lkKCkgaXMgYnJva2VuICovCisjdW5kZWYgQlJPS0VOX1NFVFJFR0lECisKKy8qIERlZmluZSBpZiB5b3VyIHNldHJlc2dpZCgpIGlzIGJyb2tlbiAqLworI3VuZGVmIEJST0tFTl9TRVRSRVNHSUQKKworLyogRGVmaW5lIGlmIHlvdXIgc2V0cmVzdWlkKCkgaXMgYnJva2VuICovCisjdW5kZWYgQlJPS0VOX1NFVFJFU1VJRAorCisvKiBEZWZpbmUgaWYgeW91ciBzZXRyZXVpZCgpIGlzIGJyb2tlbiAqLworI3VuZGVmIEJST0tFTl9TRVRSRVVJRAorCisvKiBMeW54T1MgaGFzIGJyb2tlbiBzZXR2YnVmKCkgaW1wbGVtZW50YXRpb24gKi8KKyN1bmRlZiBCUk9LRU5fU0VUVkJVRgorCisvKiBRTlggc2hhZG93IHN1cHBvcnQgaXMgYnJva2VuICovCisjdW5kZWYgQlJPS0VOX1NIQURPV19FWFBJUkUKKworLyogRGVmaW5lIGlmIHlvdXIgc25wcmludGYgaXMgYnVzdGVkICovCisjdW5kZWYgQlJPS0VOX1NOUFJJTlRGCisKKy8qIHRjZ2V0YXR0ciB3aXRoIElDQU5PTiBtYXkgaGFuZyAqLworI3VuZGVmIEJST0tFTl9UQ0dFVEFUVFJfSUNBTk9OCisKKy8qIHVwZHd0bXB4IGlzIGJyb2tlbiAoaWYgcHJlc2VudCkgKi8KKyN1bmRlZiBCUk9LRU5fVVBEV1RNUFgKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIEJTRCBhdXRoIHN1cHBvcnQgKi8KKyN1bmRlZiBCU0RfQVVUSAorCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gc3BlY2lmeSB0aGUgcGF0aCB0byB5b3VyIGxhc3Rsb2cgZmlsZSAqLworI3VuZGVmIENPTkZfTEFTVExPR19GSUxFCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCB0byBzcGVjaWZ5IHRoZSBwYXRoIHRvIHlvdXIgdXRtcCBmaWxlICovCisjdW5kZWYgQ09ORl9VVE1QX0ZJTEUKKworLyogRGVmaW5lIGlmIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhlIHBhdGggdG8geW91ciB3dG1weCBmaWxlICovCisjdW5kZWYgQ09ORl9XVE1QWF9GSUxFCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCB0byBzcGVjaWZ5IHRoZSBwYXRoIHRvIHlvdXIgd3RtcCBmaWxlICovCisjdW5kZWYgQ09ORl9XVE1QX0ZJTEUKKworLyogRGVmaW5lIGlmIHlvdXIgcGxhdGZvcm0gbmVlZHMgdG8gc2tpcCBwb3N0IGF1dGggZmlsZSBkZXNjcmlwdG9yIHBhc3NpbmcgKi8KKyN1bmRlZiBESVNBQkxFX0ZEX1BBU1NJTkcKKworLyogRGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSBsYXN0bG9nICovCisjdW5kZWYgRElTQUJMRV9MQVNUTE9HCisKKy8qIERlZmluZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgeW91ciBzeXN0ZW0ncyBsb2dpbigpIGNhbGwgKi8KKyN1bmRlZiBESVNBQkxFX0xPR0lOCisKKy8qIERlZmluZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgcHV0dXRsaW5lKCkgZXRjLiB0byB3cml0ZSBbdXdddG1wICovCisjdW5kZWYgRElTQUJMRV9QVVRVVExJTkUKKworLyogRGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSBwdXR1dHhsaW5lKCkgZXRjLiB0byB3cml0ZSBbdXdddG1weCAqLworI3VuZGVmIERJU0FCTEVfUFVUVVRYTElORQorCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gZGlzYWJsZSBzaGFkb3cgcGFzc3dvcmRzICovCisjdW5kZWYgRElTQUJMRV9TSEFET1cKKworLyogRGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSB1dG1wICovCisjdW5kZWYgRElTQUJMRV9VVE1QCisKKy8qIERlZmluZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgdXRtcHggKi8KKyN1bmRlZiBESVNBQkxFX1VUTVBYCisKKy8qIERlZmluZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2Ugd3RtcCAqLworI3VuZGVmIERJU0FCTEVfV1RNUAorCisvKiBEZWZpbmUgaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIHd0bXB4ICovCisjdW5kZWYgRElTQUJMRV9XVE1QWAorCisvKiBFbmFibGUgZm9yIFBLQ1MjMTEgc3VwcG9ydCAqLworI3VuZGVmIEVOQUJMRV9QS0NTMTEKKworLyogRmlsZSBuYW1lcyBtYXkgbm90IGNvbnRhaW4gYmFja3NsYXNoIGNoYXJhY3RlcnMgKi8KKyN1bmRlZiBGSUxFU1lTVEVNX05PX0JBQ0tTTEFTSAorCisvKiBmc2lkX3QgaGFzIG1lbWJlciB2YWwgKi8KKyN1bmRlZiBGU0lEX0hBU19WQUwKKworLyogZnNpZF90IGhhcyBtZW1iZXIgX192YWwgKi8KKyN1bmRlZiBGU0lEX0hBU19fX1ZBTAorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgYGdldHBncnAnIGZ1bmN0aW9uIHJlcXVpcmVzIHplcm8gYXJndW1lbnRzLiAqLworI3VuZGVmIEdFVFBHUlBfVk9JRAorCisvKiBDb25mbGljdGluZyBkZWZzIGZvciBnZXRzcG5hbSAqLworI3VuZGVmIEdFVFNQTkFNX0NPTkZMSUNUSU5HX0RFRlMKKworLyogRGVmaW5lIGlmIHlvdXIgc3lzdGVtIGdsb2IoKSBmdW5jdGlvbiBoYXMgdGhlIEdMT0JfQUxURElSRlVOQyBleHRlbnNpb24gKi8KKyN1bmRlZiBHTE9CX0hBU19BTFRESVJGVU5DCisKKy8qIERlZmluZSBpZiB5b3VyIHN5c3RlbSBnbG9iKCkgZnVuY3Rpb24gaGFzIGdsX21hdGNoYyBvcHRpb25zIGluIGdsb2JfdCAqLworI3VuZGVmIEdMT0JfSEFTX0dMX01BVENIQworCisvKiBEZWZpbmUgaWYgeW91ciBzeXN0ZW0gZ2xvYigpIGZ1bmN0aW9uIGhhcyBnbF9zdGF0diBvcHRpb25zIGluIGdsb2JfdCAqLworI3VuZGVmIEdMT0JfSEFTX0dMX1NUQVRWCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IEdTU0FQSSBzdXBwb3J0IGluIHRoZSB2ZXJzaW9uIDIgcHJvdG9jb2wgKi8KKyN1bmRlZiBHU1NBUEkKKworLyogRGVmaW5lIGlmIHlvdSB3YW50IHRvIHVzZSBzaGFkb3cgcGFzc3dvcmQgZXhwaXJlIGZpZWxkICovCisjdW5kZWYgSEFTX1NIQURPV19FWFBJUkUKKworLyogRGVmaW5lIGlmIHlvdXIgc3lzdGVtIHVzZXMgYWNjZXNzIHJpZ2h0cyBzdHlsZSBmaWxlIGRlc2NyaXB0b3IgcGFzc2luZyAqLworI3VuZGVmIEhBVkVfQUNDUklHSFRTX0lOX01TR0hEUgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdXRfYWRkciBpbiB1dG1wLmggKi8KKyN1bmRlZiBIQVZFX0FERFJfSU5fVVRNUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdXRfYWRkciBpbiB1dG1weC5oICovCisjdW5kZWYgSEFWRV9BRERSX0lOX1VUTVBYCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF9hZGRyX3Y2IGluIHV0bXAuaCAqLworI3VuZGVmIEhBVkVfQUREUl9WNl9JTl9VVE1QCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF9hZGRyX3Y2IGluIHV0bXB4LmggKi8KKyN1bmRlZiBIQVZFX0FERFJfVjZfSU5fVVRNUFgKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhcmM0cmFuZG9tJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0FSQzRSQU5ET00KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhcmM0cmFuZG9tX2J1ZicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9BUkM0UkFORE9NX0JVRgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFyYzRyYW5kb21fdW5pZm9ybScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9BUkM0UkFORE9NX1VOSUZPUk0KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhc3ByaW50ZicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9BU1BSSU5URgorCisvKiBPcGVuQlNEJ3MgZ2NjIGhhcyBib3VuZGVkICovCisjdW5kZWYgSEFWRV9BVFRSSUJVVEVfX0JPVU5ERURfXworCisvKiBIYXZlIGF0dHJpYnV0ZSBub25udWxsICovCisjdW5kZWYgSEFWRV9BVFRSSUJVVEVfX05PTk5VTExfXworCisvKiBPcGVuQlNEJ3MgZ2NjIGhhcyBzZW50aW5lbCAqLworI3VuZGVmIEhBVkVfQVRUUklCVVRFX19TRU5USU5FTF9fCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYXVnX2dldF9tYWNoaW5lJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0FVR19HRVRfTUFDSElORQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGI2NF9udG9wJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0I2NF9OVE9QCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYjY0X3B0b24nIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfQjY0X1BUT04KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBiYXNlbmFtZSBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0JBU0VOQU1FCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYmNvcHknIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfQkNPUFkKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBiaW5kcmVzdnBvcnRfc2EnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfQklORFJFU1ZQT1JUX1NBCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgQk5faXNfcHJpbWVfZXgnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfQk5fSVNfUFJJTUVfRVgKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxic20vYXVkaXQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9CU01fQVVESVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGJzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9CU1RSSU5HX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjbG9jaycgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9DTE9DSworCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgY2xvY2tfdCBkYXRhIHR5cGUgKi8KKyN1bmRlZiBIQVZFX0NMT0NLX1QKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjbG9zZWZyb20nIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfQ0xPU0VGUk9NCisKKy8qIERlZmluZSBpZiBnYWlfc3RyZXJyb3IoKSByZXR1cm5zIGNvbnN0IGNoYXIgKiAqLworI3VuZGVmIEhBVkVfQ09OU1RfR0FJX1NUUkVSUk9SX1BST1RPCisKKy8qIERlZmluZSBpZiB5b3VyIHN5c3RlbSB1c2VzIGFuY2lsbGFyeSBkYXRhIHN0eWxlIGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nICovCisjdW5kZWYgSEFWRV9DT05UUk9MX0lOX01TR0hEUgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGNyeXB0by9zaGEyLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfQ1JZUFRPX1NIQTJfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGNyeXB0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfQ1JZUFRfSAorCisvKiBEZWZpbmUgaWYgeW91IGFyZSBvbiBDeWd3aW4gKi8KKyN1bmRlZiBIQVZFX0NZR1dJTgorCisvKiBEZWZpbmUgaWYgeW91ciBsaWJyYXJpZXMgZGVmaW5lIGRhZW1vbigpICovCisjdW5kZWYgSEFWRV9EQUVNT04KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBhdXRoZW50aWNhdGUnLCBhbmQgdG8gMCBpZiB5b3UKKyAgIGRvbid0LiAqLworI3VuZGVmIEhBVkVfREVDTF9BVVRIRU5USUNBVEUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBHTE9CX05PTUFUQ0gnLCBhbmQgdG8gMCBpZiB5b3UKKyAgIGRvbid0LiAqLworI3VuZGVmIEhBVkVfREVDTF9HTE9CX05PTUFUQ0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBoX2Vycm5vJywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfSF9FUlJOTworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYGxvZ2luZmFpbGVkJywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfTE9HSU5GQUlMRUQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBsb2dpbnJlc3RyaWN0aW9ucycsIGFuZCB0byAwIGlmCisgICB5b3UgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX0xPR0lOUkVTVFJJQ1RJT05TCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgbG9naW5zdWNjZXNzJywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfTE9HSU5TVUNDRVNTCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgTUFYU1lNTElOS1MnLCBhbmQgdG8gMCBpZiB5b3UKKyAgIGRvbid0LiAqLworI3VuZGVmIEhBVkVfREVDTF9NQVhTWU1MSU5LUworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYG9mZnNldG9mJywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfT0ZGU0VUT0YKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBPX05PTkJMT0NLJywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfT19OT05CTE9DSworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYHBhc3N3ZGV4cGlyZWQnLCBhbmQgdG8gMCBpZiB5b3UKKyAgIGRvbid0LiAqLworI3VuZGVmIEhBVkVfREVDTF9QQVNTV0RFWFBJUkVECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgc2V0YXV0aGRiJywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfU0VUQVVUSERCCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgU0hVVF9SRCcsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX1NIVVRfUkQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGB3cml0ZXYnLCBhbmQgdG8gMCBpZiB5b3UgZG9uJ3QuCisgICAqLworI3VuZGVmIEhBVkVfREVDTF9XUklURVYKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBfZ2V0bG9uZycsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX19HRVRMT05HCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgX2dldHNob3J0JywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfX0dFVFNIT1JUCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSAvZGV2L3B0bXggKi8KKyN1bmRlZiBIQVZFX0RFVl9QVE1YCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSAvZGV2L3B0YyAqLworI3VuZGVmIEhBVkVfREVWX1BUU19BTkRfUFRDCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZW50Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfRElSRU5UX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBkaXJmZCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9ESVJGRAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGRpcm5hbWUnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfRElSTkFNRQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzX2V4JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0RTQV9HRU5FUkFURV9QQVJBTUVURVJTX0VYCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZW5kaWFuLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfRU5ESUFOX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBlbmR1dGVudCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9FTkRVVEVOVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGVuZHV0eGVudCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9FTkRVVFhFTlQKKworLyogRGVmaW5lIGlmIHlvdXIgc3lzdGVtIGhhcyAvZXRjL2RlZmF1bHQvbG9naW4gKi8KKyN1bmRlZiBIQVZFX0VUQ19ERUZBVUxUX0xPR0lOCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgRVZQX3NoYTI1NicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9FVlBfU0hBMjU2CisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF9leGl0IGluIHV0bXAuaCAqLworI3VuZGVmIEhBVkVfRVhJVF9JTl9VVE1QCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZmNobW9kJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0ZDSE1PRAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZjaG93bicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9GQ0hPV04KKworLyogVXNlIEZfQ0xPU0VNIGZjbnRsIGZvciBjbG9zZWZyb20gKi8KKyN1bmRlZiBIQVZFX0ZDTlRMX0NMT1NFTQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfRkNOVExfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZlYXR1cmVzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfRkVBVFVSRVNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZsb2F0aW5ncG9pbnQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9GTE9BVElOR1BPSU5UX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmbXRfc2NhbGVkJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0ZNVF9TQ0FMRUQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmcmVlYWRkcmluZm8nIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfRlJFRUFERFJJTkZPCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBmc2Jsa2NudF90Jy4gKi8KKyN1bmRlZiBIQVZFX0ZTQkxLQ05UX1QKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYGZzZmlsY250X3QnLiAqLworI3VuZGVmIEhBVkVfRlNGSUxDTlRfVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZzdGF0dmZzJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0ZTVEFUVkZTCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZnV0aW1lcycgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9GVVRJTUVTCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2FpX3N0cmVycm9yJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dBSV9TVFJFUlJPUgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGFkZHJpbmZvJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVEFERFJJTkZPCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0YXVkaXQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUQVVESVQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRhdWRpdF9hZGRyJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVEFVRElUX0FERFIKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRjd2QnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUQ1dECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0Z3JvdXBsaXN0JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVEdST1VQTElTVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGdyc2V0JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVEdSU0VUCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0bGFzdGxvZ3hieW5hbWUnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUTEFTVExPR1hCWU5BTUUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRsdWlkJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVExVSUQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRuYW1laW5mbycgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HRVROQU1FSU5GTworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldG9wdCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HRVRPUFQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxnZXRvcHQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9HRVRPUFRfSAorCisvKiBEZWZpbmUgaWYgeW91ciBnZXRvcHQoMykgZGVmaW5lcyBhbmQgdXNlcyBvcHRyZXNldCAqLworI3VuZGVmIEhBVkVfR0VUT1BUX09QVFJFU0VUCisKKy8qIERlZmluZSBpZiB5b3VyIGxpYnJhcmllcyBkZWZpbmUgZ2V0cGFnZXNpemUoKSAqLworI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRwZWVyZWlkJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVFBFRVJFSUQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRwZWVydWNyZWQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUUEVFUlVDUkVECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cHdhbmFtJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVFBXQU5BTQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHJsaW1pdCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HRVRSTElNSVQKKworLyogRGVmaW5lIGlmIGdldHJyc2V0YnluYW1lKCkgZXhpc3RzICovCisjdW5kZWYgSEFWRV9HRVRSUlNFVEJZTkFNRQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHJ1c2FnZScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HRVRSVVNBR0UKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRzZXVzZXJieW5hbWUnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUU0VVU0VSQllOQU1FCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0dGltZW9mZGF5JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVFRJTUVPRkRBWQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHR0eWVudCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HRVRUVFlFTlQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXR1dGVudCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HRVRVVEVOVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHV0aWQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUVVRJRAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHV0bGluZScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HRVRVVExJTkUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXR1dHhlbnQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUVVRYRU5UCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0dXR4aWQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUVVRYSUQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXR1dHhsaW5lJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVFVUWExJTkUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXR1dHh1c2VyJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVFVUWFVTRVIKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRfZGVmYXVsdF9jb250ZXh0X3dpdGhfbGV2ZWwnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUX0RFRkFVTFRfQ09OVEVYVF9XSVRIX0xFVkVMCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2xvYicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HTE9CCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Z2xvYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0dMT0JfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdyb3VwX2Zyb21fZ2lkJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dST1VQX0ZST01fR0lECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Z3NzYXBpX2dlbmVyaWMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9HU1NBUElfR0VORVJJQ19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Z3NzYXBpL2dzc2FwaV9nZW5lcmljLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfR1NTQVBJX0dTU0FQSV9HRU5FUklDX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxnc3NhcGkvZ3NzYXBpLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfR1NTQVBJX0dTU0FQSV9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Z3NzYXBpL2dzc2FwaV9rcmI1Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfR1NTQVBJX0dTU0FQSV9LUkI1X0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxnc3NhcGkuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9HU1NBUElfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGdzc2FwaV9rcmI1Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfR1NTQVBJX0tSQjVfSAorCisvKiBEZWZpbmUgaWYgSEVBREVSLmFkIGV4aXN0cyBpbiBhcnBhL25hbWVzZXIuaCAqLworI3VuZGVmIEhBVkVfSEVBREVSX0FECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgSE1BQ19DVFhfaW5pdCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9ITUFDX0NUWF9JTklUCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF9ob3N0IGluIHV0bXAuaCAqLworI3VuZGVmIEhBVkVfSE9TVF9JTl9VVE1QCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF9ob3N0IGluIHV0bXB4LmggKi8KKyN1bmRlZiBIQVZFX0hPU1RfSU5fVVRNUFgKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpYWYuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9JQUZfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGlhLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfSUFfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdXRfaWQgaW4gdXRtcC5oICovCisjdW5kZWYgSEFWRV9JRF9JTl9VVE1QCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF9pZCBpbiB1dG1weC5oICovCisjdW5kZWYgSEFWRV9JRF9JTl9VVE1QWAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGluZXRfYXRvbicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9JTkVUX0FUT04KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpbmV0X250b2EnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfSU5FVF9OVE9BCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaW5ldF9udG9wJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0lORVRfTlRPUAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGlubmV0Z3InIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfSU5ORVRHUgorCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgaW50NjRfdCBkYXRhIHR5cGUgKi8KKyN1bmRlZiBIQVZFX0lOVDY0X1QKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0lOVFRZUEVTX0gKKworLyogZGVmaW5lIGlmIHlvdSBoYXZlIGludHh4X3QgZGF0YSB0eXBlICovCisjdW5kZWYgSEFWRV9JTlRYWF9UCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBpbl9hZGRyX3QnLiAqLworI3VuZGVmIEhBVkVfSU5fQUREUl9UCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBpbl9wb3J0X3QnLiAqLworI3VuZGVmIEhBVkVfSU5fUE9SVF9UCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBpc2JsYW5rKDNDKS4gKi8KKyN1bmRlZiBIQVZFX0lTQkxBTksKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsYXN0bG9nLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTEFTVExPR19ICisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCBsZG5zIHN1cHBvcnQgKi8KKyN1bmRlZiBIQVZFX0xETlMKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaWJhdWRpdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0xJQkFVRElUX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBic20nIGxpYnJhcnkgKC1sYnNtKS4gKi8KKyN1bmRlZiBIQVZFX0xJQkJTTQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNyeXB0JyBsaWJyYXJ5ICgtbGNyeXB0KS4gKi8KKyN1bmRlZiBIQVZFX0xJQkNSWVBUCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZGwnIGxpYnJhcnkgKC1sZGwpLiAqLworI3VuZGVmIEhBVkVfTElCREwKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaWJnZW4uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9MSUJHRU5fSAorCisvKiBEZWZpbmUgaWYgc3lzdGVtIGhhcyBsaWJpYWYgdGhhdCBzdXBwb3J0cyBzZXRfaWQgKi8KKyN1bmRlZiBIQVZFX0xJQklBRgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG5ldHdvcmsnIGxpYnJhcnkgKC1sbmV0d29yaykuICovCisjdW5kZWYgSEFWRV9MSUJORVRXT1JLCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbnNsJyBsaWJyYXJ5ICgtbG5zbCkuICovCisjdW5kZWYgSEFWRV9MSUJOU0wKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwYW0nIGxpYnJhcnkgKC1scGFtKS4gKi8KKyN1bmRlZiBIQVZFX0xJQlBBTQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNvY2tldCcgbGlicmFyeSAoLWxzb2NrZXQpLiAqLworI3VuZGVmIEhBVkVfTElCU09DS0VUCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGlidXRpbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0xJQlVUSUxfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHhuZXQnIGxpYnJhcnkgKC1seG5ldCkuICovCisjdW5kZWYgSEFWRV9MSUJYTkVUCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgeicgbGlicmFyeSAoLWx6KS4gKi8KKyN1bmRlZiBIQVZFX0xJQloKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9MSU1JVFNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbnV4L2F1ZGl0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTElOVVhfQVVESVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbnV4L2ZpbHRlci5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0xJTlVYX0ZJTFRFUl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGludXgvaWZfdHVuLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTElOVVhfSUZfVFVOX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW51eC9zZWNjb21wLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTElOVVhfU0VDQ09NUF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbG9naW4nIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfTE9HSU4KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsb2dpbl9jYXAuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9MT0dJTl9DQVBfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxvZ2luX2dldGNhcGJvb2wnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfTE9HSU5fR0VUQ0FQQk9PTAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxvZ2luLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTE9HSU5fSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxvZ291dCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9MT0dPVVQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBsb2d3dG1wJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0xPR1dUTVAKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYGxvbmcgZG91YmxlJy4gKi8KKyN1bmRlZiBIQVZFX0xPTkdfRE9VQkxFCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBsb25nIGxvbmcnLiAqLworI3VuZGVmIEhBVkVfTE9OR19MT05HCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWFpbGxvY2suaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9NQUlMTE9DS19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWQ1X2NyeXB0JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX01ENV9DUllQVAorCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gYWxsb3cgTUQ1IHBhc3N3b3JkcyAqLworI3VuZGVmIEhBVkVfTUQ1X1BBU1NXT1JEUworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1lbW1vdmUnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfTUVNTU9WRQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX01FTU9SWV9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWtkdGVtcCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9NS0RURU1QCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbW1hcCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9NTUFQCisKKy8qIGRlZmluZSBpZiB5b3UgaGF2ZSBtb2RlX3QgZGF0YSB0eXBlICovCisjdW5kZWYgSEFWRV9NT0RFX1QKKworLyogU29tZSBzeXN0ZW1zIHB1dCBuYW5vc2xlZXAgb3V0c2lkZSBvZiBsaWJjICovCisjdW5kZWYgSEFWRV9OQU5PU0xFRVAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZGlyLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTkRJUl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0ZGIuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ORVREQl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0Z3JvdXAuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ORVRHUk9VUF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0L2lmX3R1bi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX05FVF9JRl9UVU5fSAorCisvKiBEZWZpbmUgaWYgeW91IGFyZSBvbiBOZVhUICovCisjdW5kZWYgSEFWRV9ORVhUCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbmdldGFkZHJpbmZvJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX05HRVRBRERSSU5GTworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG5zbGVlcCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9OU0xFRVAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBvZ2V0YWRkcmluZm8nIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfT0dFVEFERFJJTkZPCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbiBvbGQgdmVyc2lvbiBvZiBQQU0gd2hpY2ggdGFrZXMgb25seSBvbmUgYXJndW1lbnQgdG8KKyAgIHBhbV9zdHJlcnJvciAqLworI3VuZGVmIEhBVkVfT0xEX1BBTQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG9wZW5sb2dfcicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9PUEVOTE9HX1IKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBvcGVucHR5JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX09QRU5QVFkKKworLyogRGVmaW5lIGlmIHlvdXIgc3NsIGhlYWRlcnMgYXJlIGluY2x1ZGVkIHdpdGggI2luY2x1ZGUgPG9wZW5zc2wvaGVhZGVyLmg+ICovCisjdW5kZWYgSEFWRV9PUEVOU1NMCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBEaWdpdGFsIFVuaXggU2VjdXJpdHkgSW50ZWdyYXRpb24gQXJjaGl0ZWN0dXJlICovCisjdW5kZWYgSEFWRV9PU0ZfU0lBCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcGFtX2dldGVudmxpc3QnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfUEFNX0dFVEVOVkxJU1QKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwYW0vcGFtX2FwcGwuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9QQU1fUEFNX0FQUExfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBhbV9wdXRlbnYnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfUEFNX1BVVEVOVgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHBhdGhzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfUEFUSFNfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdXRfcGlkIGluIHV0bXAuaCAqLworI3VuZGVmIEhBVkVfUElEX0lOX1VUTVAKKworLyogZGVmaW5lIGlmIHlvdSBoYXZlIHBpZF90IGRhdGEgdHlwZSAqLworI3VuZGVmIEhBVkVfUElEX1QKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwb2xsJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1BPTEwKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwb2xsLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfUE9MTF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcHJjdGwnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfUFJDVEwKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIC9wcm9jLyRwaWQvZmQgKi8KKyN1bmRlZiBIQVZFX1BST0NfUElECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcHN0YXQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfUFNUQVQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwdHkuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9QVFlfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHB1dHV0bGluZScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9QVVRVVExJTkUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwdXR1dHhsaW5lJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1BVVFVUWExJTkUKKworLyogRGVmaW5lIGlmIHlvdXIgcGFzc3dvcmQgaGFzIGEgcHdfY2hhbmdlIGZpZWxkICovCisjdW5kZWYgSEFWRV9QV19DSEFOR0VfSU5fUEFTU1dECisKKy8qIERlZmluZSBpZiB5b3VyIHBhc3N3b3JkIGhhcyBhIHB3X2NsYXNzIGZpZWxkICovCisjdW5kZWYgSEFWRV9QV19DTEFTU19JTl9QQVNTV0QKKworLyogRGVmaW5lIGlmIHlvdXIgcGFzc3dvcmQgaGFzIGEgcHdfZXhwaXJlIGZpZWxkICovCisjdW5kZWYgSEFWRV9QV19FWFBJUkVfSU5fUEFTU1dECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcmVhZHBhc3NwaHJhc2UnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfUkVBRFBBU1NQSFJBU0UKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxyZWFkcGFzc3BocmFzZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1JFQURQQVNTUEhSQVNFX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGByZWFscGF0aCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9SRUFMUEFUSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHJlY3Ztc2cnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfUkVDVk1TRworCisvKiBzeXMvcmVzb3VyY2UuaCBoYXMgUkxJTUlUX05QUk9DICovCisjdW5kZWYgSEFWRV9STElNSVRfTlBST0MKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxycGMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9SUENfVFlQRVNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHJyZXN2cG9ydF9hZicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9SUkVTVlBPUlRfQUYKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBSU0FfZ2VuZXJhdGVfa2V5X2V4JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1JTQV9HRU5FUkFURV9LRVlfRVgKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBSU0FfZ2V0X2RlZmF1bHRfbWV0aG9kJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1JTQV9HRVRfREVGQVVMVF9NRVRIT0QKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzYW5kYm94Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU0FOREJPWF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2FuZGJveF9pbml0JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NBTkRCT1hfSU5JVAorCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgc2FfZmFtaWx5X3QgZGF0YSB0eXBlICovCisjdW5kZWYgSEFWRV9TQV9GQU1JTFlfVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgU2VjdXJlV2FyZS1iYXNlZCBwcm90ZWN0ZWQgcGFzc3dvcmQgZGF0YWJhc2UgKi8KKyN1bmRlZiBIQVZFX1NFQ1VSRVdBUkUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzZWN1cml0eS9wYW1fYXBwbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NFQ1VSSVRZX1BBTV9BUFBMX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZW5kbXNnJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NFTkRNU0cKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRhdXRoZGInIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU0VUQVVUSERCCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0ZHRhYmxlc2l6ZScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TRVREVEFCTEVTSVpFCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0ZWdpZCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TRVRFR0lECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0ZW52JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NFVEVOVgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldGV1aWQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU0VURVVJRAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldGdyb3VwZW50JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NFVEdST1VQRU5UCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0Z3JvdXBzJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NFVEdST1VQUworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldGxvZ2luJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NFVExPR0lOCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0bHVpZCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TRVRMVUlECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0cGFzc2VudCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TRVRQQVNTRU5UCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0cGNyZWQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU0VUUENSRUQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRwcm9jdGl0bGUnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU0VUUFJPQ1RJVExFCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0cmVnaWQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU0VUUkVHSUQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRyZXNnaWQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU0VUUkVTR0lECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0cmVzdWlkJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NFVFJFU1VJRAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHJldWlkJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NFVFJFVUlECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0cmxpbWl0JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NFVFJMSU1JVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHNpZCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TRVRTSUQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXR1dGVudCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TRVRVVEVOVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHV0eGRiJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NFVFVUWERCCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0dXR4ZW50JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NFVFVUWEVOVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHZidWYnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU0VUVkJVRgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldF9pZCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TRVRfSUQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBTSEEyNTZfVXBkYXRlJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NIQTI1Nl9VUERBVEUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzaGEyLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU0hBMl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c2hhZG93Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU0hBRE9XX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzaWdhY3Rpb24nIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU0lHQUNUSU9OCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2lndmVjJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NJR1ZFQworCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgc2lnX2F0b21pY190Jy4gKi8KKyN1bmRlZiBIQVZFX1NJR19BVE9NSUNfVAorCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgc2l6ZV90IGRhdGEgdHlwZSAqLworI3VuZGVmIEhBVkVfU0laRV9UCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc25wcmludGYnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU05QUklOVEYKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzb2NrZXRwYWlyJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NPQ0tFVFBBSVIKKworLyogSGF2ZSBQRUVSQ1JFRCBzb2NrZXQgb3B0aW9uICovCisjdW5kZWYgSEFWRV9TT19QRUVSQ1JFRAorCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgc3NpemVfdCBkYXRhIHR5cGUgKi8KKyN1bmRlZiBIQVZFX1NTSVpFX1QKKworLyogRmllbGRzIGluIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICovCisjdW5kZWYgSEFWRV9TU19GQU1JTFlfSU5fU1MKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdGF0ZnMnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RBVEZTCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RhdHZmcycgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVEFUVkZTCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkZGVmLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1REREVGX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVERJTlRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZHVwJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUkRVUAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmVycm9yJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUkVSUk9SCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZnRpbWUnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSRlRJTUUKKworLyogU2lsbHkgbWtzdGVtcCgpICovCisjdW5kZWYgSEFWRV9TVFJJQ1RfTUtTVEVNUAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVFJJTkdfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmxjYXQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSTENBVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmxjcHknIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSTENQWQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cm1vZGUnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSTU9ERQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cm5sZW4nIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSTkxFTgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cm52aXMnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSTlZJUworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnB0aW1lJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUlBUSU1FCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3Ryc2VwJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUlNFUAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnRvbGwnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSVE9MTAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnRvbnVtJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUlRPTlVNCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RydG91bCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFJUT1VMCisKKy8qIGRlZmluZSBpZiB5b3UgaGF2ZSBzdHJ1Y3QgYWRkcmluZm8gZGF0YSB0eXBlICovCisjdW5kZWYgSEFWRV9TVFJVQ1RfQUREUklORk8KKworLyogZGVmaW5lIGlmIHlvdSBoYXZlIHN0cnVjdCBpbjZfYWRkciBkYXRhIHR5cGUgKi8KKyN1bmRlZiBIQVZFX1NUUlVDVF9JTjZfQUREUgorCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgc3RydWN0IHNvY2thZGRyX2luNiBkYXRhIHR5cGUgKi8KKyN1bmRlZiBIQVZFX1NUUlVDVF9TT0NLQUREUl9JTjYKKworLyogRGVmaW5lIHRvIDEgaWYgYHNpbjZfc2NvcGVfaWQnIGlzIGEgbWVtYmVyIG9mIGBzdHJ1Y3Qgc29ja2FkZHJfaW42Jy4gKi8KKyN1bmRlZiBIQVZFX1NUUlVDVF9TT0NLQUREUl9JTjZfU0lONl9TQ09QRV9JRAorCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgZGF0YSB0eXBlICovCisjdW5kZWYgSEFWRV9TVFJVQ1RfU09DS0FERFJfU1RPUkFHRQorCisvKiBEZWZpbmUgdG8gMSBpZiBgc3RfYmxrc2l6ZScgaXMgYSBtZW1iZXIgb2YgYHN0cnVjdCBzdGF0Jy4gKi8KKyN1bmRlZiBIQVZFX1NUUlVDVF9TVEFUX1NUX0JMS1NJWkUKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYHN0cnVjdCB0aW1lc3BlYycuICovCisjdW5kZWYgSEFWRV9TVFJVQ1RfVElNRVNQRUMKKworLyogZGVmaW5lIGlmIHlvdSBoYXZlIHN0cnVjdCB0aW1ldmFsICovCisjdW5kZWYgSEFWRV9TVFJVQ1RfVElNRVZBTAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN3YXAzMicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TV0FQMzIKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzeXNjb25mJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NZU0NPTkYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHN5c2xlbiBpbiB1dG1weC5oICovCisjdW5kZWYgSEFWRV9TWVNMRU5fSU5fVVRNUFgKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvYXVkaXQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfQVVESVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9iaXR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9ic2R0dHkuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfQlNEVFRZX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvY2RlZnMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfQ0RFRlNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9kaXIuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfRElSX0gKKworLyogRGVmaW5lIGlmIHlvdXIgc3lzdGVtIGRlZmluZXMgc3lzX2Vycmxpc3RbXSAqLworI3VuZGVmIEhBVkVfU1lTX0VSUkxJU1QKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvbW1hbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19NTUFOX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvbW91bnQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfTU9VTlRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9uZGlyLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX05ESVJfSAorCisvKiBEZWZpbmUgaWYgeW91ciBzeXN0ZW0gZGVmaW5lcyBzeXNfbmVyciAqLworI3VuZGVmIEhBVkVfU1lTX05FUlIKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcG9sbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19QT0xMX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcHJjdGwuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfUFJDVExfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19QU1RBVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3B0bXMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfUFRNU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NlbGVjdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19TRUxFQ1RfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0dmZzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NUQVRWRlNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NUQVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdHJlYW0uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfU1RSRUFNX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3Ryb3B0cy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19TVFJPUFRTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RydGlvLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NUUlRJT19ICisKKy8qIEZvcmNlIHVzZSBvZiBzeXMvc3lzbG9nLmggb24gVWx0cml4ICovCisjdW5kZWYgSEFWRV9TWVNfU1lTTE9HX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3lzbWFjcm9zLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NZU01BQ1JPU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWVycy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19USU1FUlNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1RJTUVfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19UWVBFU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3VuLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1VOX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0Y2dldHBncnAnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfVENHRVRQR1JQCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdGNzZW5kYnJlYWsnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfVENTRU5EQlJFQUsKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0aW1lJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1RJTUUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF90aW1lIGluIHV0bXAuaCAqLworI3VuZGVmIEhBVkVfVElNRV9JTl9VVE1QCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF90aW1lIGluIHV0bXB4LmggKi8KKyN1bmRlZiBIQVZFX1RJTUVfSU5fVVRNUFgKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0aW1pbmdzYWZlX2JjbXAnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfVElNSU5HU0FGRV9CQ01QCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dG1wZGlyLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfVE1QRElSX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0cnVuY2F0ZScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9UUlVOQ0FURQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHR0eWVudC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1RUWUVOVF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF90diBpbiB1dG1wLmggKi8KKyN1bmRlZiBIQVZFX1RWX0lOX1VUTVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHV0X3R2IGluIHV0bXB4LmggKi8KKyN1bmRlZiBIQVZFX1RWX0lOX1VUTVBYCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF90eXBlIGluIHV0bXAuaCAqLworI3VuZGVmIEhBVkVfVFlQRV9JTl9VVE1QCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF90eXBlIGluIHV0bXB4LmggKi8KKyN1bmRlZiBIQVZFX1RZUEVfSU5fVVRNUFgKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1Y3JlZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1VDUkVEX0gKKworLyogZGVmaW5lIGlmIHlvdSBoYXZlIHVpbnR4eF90IGRhdGEgdHlwZSAqLworI3VuZGVmIEhBVkVfVUlOVFhYX1QKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9VTklTVERfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHVuc2V0ZW52JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1VOU0VURU5WCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGB1bnNpZ25lZCBsb25nIGxvbmcnLiAqLworI3VuZGVmIEhBVkVfVU5TSUdORURfTE9OR19MT05HCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdXBkd3RtcCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9VUERXVE1QCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdXBkd3RtcHgnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfVVBEV1RNUFgKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1c2Vyc2VjLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfVVNFUlNFQ19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdXNlcl9mcm9tX3VpZCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9VU0VSX0ZST01fVUlECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dXRpbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1VUSUxfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHV0aW1lcycgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9VVElNRVMKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1dGltZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1VUSU1FX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB1dG1wbmFtZScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9VVE1QTkFNRQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHV0bXB4bmFtZScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9VVE1QWE5BTUUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1dG1weC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1VUTVBYX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1dG1wLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfVVRNUF9ICisKKy8qIGRlZmluZSBpZiB5b3UgaGF2ZSB1X2NoYXIgZGF0YSB0eXBlICovCisjdW5kZWYgSEFWRV9VX0NIQVIKKworLyogZGVmaW5lIGlmIHlvdSBoYXZlIHVfaW50IGRhdGEgdHlwZSAqLworI3VuZGVmIEhBVkVfVV9JTlQKKworLyogZGVmaW5lIGlmIHlvdSBoYXZlIHVfaW50NjRfdCBkYXRhIHR5cGUgKi8KKyN1bmRlZiBIQVZFX1VfSU5UNjRfVAorCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgdV9pbnR4eF90IGRhdGEgdHlwZSAqLworI3VuZGVmIEhBVkVfVV9JTlRYWF9UCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdmFzcHJpbnRmJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1ZBU1BSSU5URgorCisvKiBEZWZpbmUgaWYgdmFfY29weSBleGlzdHMgKi8KKyN1bmRlZiBIQVZFX1ZBX0NPUFkKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB2aGFuZ3VwJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1ZIQU5HVVAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx2aXMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9WSVNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZzbnByaW50ZicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9WU05QUklOVEYKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB3YWl0cGlkJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1dBSVRQSUQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZ2V0bG9uZycgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9fR0VUTE9ORworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9nZXRwdHknIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfX0dFVFBUWQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9nZXRzaG9ydCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9fR0VUU0hPUlQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHN0cnVjdCBfX3Jlc19zdGF0ZSBfcmVzIGFzIGFuIGV4dGVybiAqLworI3VuZGVmIEhBVkVfX1JFU19FWFRFUk4KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfX2I2NF9udG9wJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX19fQjY0X05UT1AKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfX2I2NF9wdG9uJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX19fQjY0X1BUT04KKworLyogRGVmaW5lIGlmIGNvbXBpbGVyIGltcGxlbWVudHMgX19GVU5DVElPTl9fICovCisjdW5kZWYgSEFWRV9fX0ZVTkNUSU9OX18KKworLyogRGVmaW5lIGlmIGxpYmMgZGVmaW5lcyBfX3Byb2duYW1lICovCisjdW5kZWYgSEFWRV9fX1BST0dOQU1FCisKKy8qIEZpZWxkcyBpbiBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqLworI3VuZGVmIEhBVkVfX19TU19GQU1JTFlfSU5fU1MKKworLyogRGVmaW5lIGlmIF9fdmFfY29weSBleGlzdHMgKi8KKyN1bmRlZiBIQVZFX19fVkFfQ09QWQorCisvKiBEZWZpbmUgaWYgY29tcGlsZXIgaW1wbGVtZW50cyBfX2Z1bmNfXyAqLworI3VuZGVmIEhBVkVfX19mdW5jX18KKworLyogRGVmaW5lIHRoaXMgaWYgeW91IGFyZSB1c2luZyB0aGUgSGVpbWRhbCB2ZXJzaW9uIG9mIEtlcmJlcm9zIFY1ICovCisjdW5kZWYgSEVJTURBTAorCisvKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gdXNlIElQIGFkZHJlc3MgaW5zdGVhZCBvZiBob3N0bmFtZSBpbiAkRElTUExBWSAqLworI3VuZGVmIElQQUREUl9JTl9ESVNQTEFZCisKKy8qIERldGVjdCBJUHY0IGluIElQdjYgbWFwcGVkIGFkZHJlc3NlcyBhbmQgdHJlYXQgYXMgSVB2NCAqLworI3VuZGVmIElQVjRfSU5fSVBWNgorCisvKiBEZWZpbmUgaWYgeW91ciBzeXN0ZW0gY2hva2VkIG9uIElQIFRPUyBzZXR0aW5nICovCisjdW5kZWYgSVBfVE9TX0lTX0JST0tFTgorCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgS2VyYmVyb3MgNSBzdXBwb3J0ICovCisjdW5kZWYgS1JCNQorCisvKiBEZWZpbmUgaWYgcHV0dXR4bGluZSB1cGRhdGVzIGxhc3Rsb2cgdG9vICovCisjdW5kZWYgTEFTVExPR19XUklURV9QVVRVVFhMSU5FCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCBUQ1AgV3JhcHBlcnMgc3VwcG9ydCAqLworI3VuZGVmIExJQldSQVAKKworLyogRGVmaW5lIHRvIHdoYXRldmVyIGxpbmsoKSByZXR1cm5zIGZvciAibm90IHN1cHBvcnRlZCIgaWYgaXQgZG9lc24ndCByZXR1cm4KKyAgIEVPUE5PVFNVUFAuICovCisjdW5kZWYgTElOS19PUE5PVFNVUFBfRVJSTk8KKworLyogQWRqdXN0IExpbnV4IG91dC1vZi1tZW1vcnkga2lsbGVyICovCisjdW5kZWYgTElOVVhfT09NX0FESlVTVAorCisvKiBtYXggdmFsdWUgb2YgbG9uZyBsb25nIGNhbGN1bGF0ZWQgYnkgY29uZmlndXJlICovCisjdW5kZWYgTExPTkdfTUFYCisKKy8qIG1pbiB2YWx1ZSBvZiBsb25nIGxvbmcgY2FsY3VsYXRlZCBieSBjb25maWd1cmUgKi8KKyN1bmRlZiBMTE9OR19NSU4KKworLyogQWNjb3VudCBsb2NrZWQgd2l0aCBwdygxKSAqLworI3VuZGVmIExPQ0tFRF9QQVNTV0RfUFJFRklYCisKKy8qIFN0cmluZyB1c2VkIGluIC9ldGMvcGFzc3dkIHRvIGRlbm90ZSBsb2NrZWQgYWNjb3VudCAqLworI3VuZGVmIExPQ0tFRF9QQVNTV0RfU1RSSU5HCisKKy8qIFN0cmluZyB1c2VkIGluIC9ldGMvcGFzc3dkIHRvIGRlbm90ZSBsb2NrZWQgYWNjb3VudCAqLworI3VuZGVmIExPQ0tFRF9QQVNTV0RfU1VCU1RSCisKKy8qIFNvbWUgdmVyc2lvbnMgb2YgL2Jpbi9sb2dpbiBuZWVkIHRoZSBURVJNIHN1cHBsaWVkIG9uIHRoZSBjb21tYW5kbGluZSAqLworI3VuZGVmIExPR0lOX05FRURTX1RFUk0KKworLyogU29tZSBzeXN0ZW1zIG5lZWQgYSB1dG1weCBlbnRyeSBmb3IgL2Jpbi9sb2dpbiB0byB3b3JrICovCisjdW5kZWYgTE9HSU5fTkVFRFNfVVRNUFgKKworLyogRGVmaW5lIGlmIHlvdXIgbG9naW4gcHJvZ3JhbSBjYW5ub3QgaGFuZGxlIGVuZCBvZiBvcHRpb25zICgiLS0iKSAqLworI3VuZGVmIExPR0lOX05PX0VORE9QVAorCisvKiBJZiB5b3VyIGhlYWRlciBmaWxlcyBkb24ndCBkZWZpbmUgTE9HSU5fUFJPR1JBTSwgdGhlbiB1c2UgdGhpcyAoZGV0ZWN0ZWQpCisgICBmcm9tIGVudmlyb25tZW50IGFuZCBQQVRIICovCisjdW5kZWYgTE9HSU5fUFJPR1JBTV9GQUxMQkFDSworCisvKiBTZXQgdGhpcyB0byB5b3VyIG1haWwgZGlyZWN0b3J5IGlmIHlvdSBkbyBub3QgaGF2ZSBfUEFUSF9NQUlMRElSICovCisjdW5kZWYgTUFJTF9ESVJFQ1RPUlkKKworLyogRGVmaW5lIG9uICpudG8tcW54IHN5c3RlbXMgKi8KKyN1bmRlZiBNSVNTSU5HX0ZEX01BU0sKKworLyogRGVmaW5lIG9uICpudG8tcW54IHN5c3RlbXMgKi8KKyN1bmRlZiBNSVNTSU5HX0hPV01BTlkKKworLyogRGVmaW5lIG9uICpudG8tcW54IHN5c3RlbXMgKi8KKyN1bmRlZiBNSVNTSU5HX05GREJJVFMKKworLyogTmVlZCBzZXRwZ3JwIHRvIGFjcXVpcmUgY29udHJvbGxpbmcgdHR5ICovCisjdW5kZWYgTkVFRF9TRVRQR1JQCisKKy8qIERlZmluZSBpZiB0aGUgY29uY2VwdCBvZiBwb3J0cyBvbmx5IGFjY2Vzc2libGUgdG8gc3VwZXJ1c2VycyBpc24ndCBrbm93biAqLworI3VuZGVmIE5PX0lQUE9SVF9SRVNFUlZFRF9DT05DRVBUCisKKy8qIERlZmluZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgbGFzdGxvZyBpbiBzZXNzaW9uLmMgKi8KKyN1bmRlZiBOT19TU0hfTEFTVExPRworCisvKiBEZWZpbmUgaWYgWDExIGRvZXNuJ3Qgc3VwcG9ydCBBRl9VTklYIHNvY2tldHMgb24gdGhhdCBzeXN0ZW0gKi8KKyN1bmRlZiBOT19YMTFfVU5JWF9TT0NLRVRTCisKKy8qIERlZmluZSBpZiBFVlBfRGlnZXN0VXBkYXRlIHJldHVybnMgdm9pZCAqLworI3VuZGVmIE9QRU5TU0xfRVZQX0RJR0VTVFVQREFURV9WT0lECisKKy8qIGxpYmNyeXB0byBpbmNsdWRlcyBjb21wbGV0ZSBFQ0Mgc3VwcG9ydCAqLworI3VuZGVmIE9QRU5TU0xfSEFTX0VDQworCisvKiBsaWJjcnlwdG8gaXMgbWlzc2luZyBBRVMgMTkyIGFuZCAyNTYgYml0IGZ1bmN0aW9ucyAqLworI3VuZGVmIE9QRU5TU0xfTE9CT1RPTUlTRURfQUVTCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCBPcGVuU1NMJ3MgaW50ZXJuYWxseSBzZWVkZWQgUFJORyBvbmx5ICovCisjdW5kZWYgT1BFTlNTTF9QUk5HX09OTFkKKworLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCisjdW5kZWYgUEFDS0FHRV9CVUdSRVBPUlQKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfTkFNRQorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9TVFJJTkcKKworLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVEFSTkFNRQorCisvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVVJMCisKKy8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9WRVJTSU9OCisKKy8qIERlZmluZSBpZiB5b3UgYXJlIHVzaW5nIFNvbGFyaXMtZGVyaXZlZCBQQU0gd2hpY2ggcGFzc2VzIHBhbV9tZXNzYWdlcyB0bworICAgdGhlIGNvbnZlcnNhdGlvbiBmdW5jdGlvbiB3aXRoIGFuIGV4dHJhIGxldmVsIG9mIGluZGlyZWN0aW9uICovCisjdW5kZWYgUEFNX1NVTl9DT0RFQkFTRQorCisvKiBXb3JrIGFyb3VuZCBwcm9ibGVtYXRpYyBMaW51eCBQQU0gbW9kdWxlcyBoYW5kbGluZyBvZiBQQU1fVFRZICovCisjdW5kZWYgUEFNX1RUWV9LTFVER0UKKworLyogbXVzdCBzdXBwbHkgdXNlcm5hbWUgdG8gcGFzc3dkICovCisjdW5kZWYgUEFTU1dEX05FRURTX1VTRVJOQU1FCisKKy8qIFBvcnQgbnVtYmVyIG9mIFBSTkdEL0VHRCByYW5kb20gbnVtYmVyIHNvY2tldCAqLworI3VuZGVmIFBSTkdEX1BPUlQKKworLyogTG9jYXRpb24gb2YgUFJOR0QvRUdEIHJhbmRvbSBudW1iZXIgc29ja2V0ICovCisjdW5kZWYgUFJOR0RfU09DS0VUCisKKy8qIHJlYWQoMSkgY2FuIHJldHVybiAwIGZvciBhIG5vbi1jbG9zZWQgZmQgKi8KKyN1bmRlZiBQVFlfWkVST1JFQUQKKworLyogU2FuZGJveCB1c2luZyBEYXJ3aW4gc2FuZGJveF9pbml0KDMpICovCisjdW5kZWYgU0FOREJPWF9EQVJXSU4KKworLyogbm8gcHJpdnNlcCBzYW5kYm94aW5nICovCisjdW5kZWYgU0FOREJPWF9OVUxMCisKKy8qIFNhbmRib3ggdXNpbmcgc2V0cmxpbWl0KDIpICovCisjdW5kZWYgU0FOREJPWF9STElNSVQKKworLyogU2FuZGJveCB1c2luZyBzZWNjb21wIGZpbHRlciAqLworI3VuZGVmIFNBTkRCT1hfU0VDQ09NUF9GSUxURVIKKworLyogU2FuZGJveCB1c2luZyBzeXN0cmFjZSg0KSAqLworI3VuZGVmIFNBTkRCT1hfU1lTVFJBQ0UKKworLyogU3BlY2lmeSB0aGUgc3lzdGVtIGNhbGwgY29udmVudGlvbiBpbiB1c2UgKi8KKyN1bmRlZiBTRUNDT01QX0FVRElUX0FSQ0gKKworLyogRGVmaW5lIGlmIHlvdXIgcGxhdGZvcm0gYnJlYWtzIGRvaW5nIGEgc2V0ZXVpZCBiZWZvcmUgYSBzZXR1aWQgKi8KKyN1bmRlZiBTRVRFVUlEX0JSRUFLU19TRVRVSUQKKworLyogVGhlIHNpemUgb2YgYGludCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfSU5UCisKKy8qIFRoZSBzaXplIG9mIGBsb25nIGludCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfTE9OR19JTlQKKworLyogVGhlIHNpemUgb2YgYGxvbmcgbG9uZyBpbnQnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjdW5kZWYgU0laRU9GX0xPTkdfTE9OR19JTlQKKworLyogVGhlIHNpemUgb2YgYHNob3J0IGludCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfU0hPUlRfSU5UCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCBTL0tleSBzdXBwb3J0ICovCisjdW5kZWYgU0tFWQorCisvKiBEZWZpbmUgaWYgeW91ciBza2V5Y2hhbGxlbmdlKCkgZnVuY3Rpb24gdGFrZXMgNCBhcmd1bWVudHMgKE5ldEJTRCkgKi8KKyN1bmRlZiBTS0VZQ0hBTExFTkdFXzRBUkcKKworLyogRGVmaW5lIGFzIGNvbnN0IGlmIHNucHJpbnRmKCkgY2FuIGRlY2xhcmUgY29uc3QgY2hhciAqZm10ICovCisjdW5kZWYgU05QUklOVEZfQ09OU1QKKworLyogRGVmaW5lIHRvIGEgU2V0IFByb2Nlc3MgVGl0bGUgdHlwZSBpZiB5b3VyIHN5c3RlbSBpcyBzdXBwb3J0ZWQgYnkKKyAgIGJzZC1zZXRwcm9jdGl0bGUuYyAqLworI3VuZGVmIFNQVF9UWVBFCisKKy8qIERlZmluZSBpZiBzc2hkIHNvbWVob3cgcmVhY3F1aXJlcyBhIGNvbnRyb2xsaW5nIFRUWSBhZnRlciBzZXRzaWQoKSAqLworI3VuZGVmIFNTSERfQUNRVUlSRVNfQ1RUWQorCisvKiBEZWZpbmUgaWYgcGFtX2NoYXV0aHRvayB3YW50cyByZWFsIHVpZCBzZXQgdG8gdGhlIHVucHJpdidlZCB1c2VyICovCisjdW5kZWYgU1NIUEFNX0NIQVVUSFRPS19ORUVEU19SVUlECisKKy8qIFVzZSBhdWRpdCBkZWJ1Z2dpbmcgbW9kdWxlICovCisjdW5kZWYgU1NIX0FVRElUX0VWRU5UUworCisvKiBXaW5kb3dzIGlzIHNlbnNpdGl2ZSB0byByZWFkIGJ1ZmZlciBzaXplICovCisjdW5kZWYgU1NIX0lPQlVGU1oKKworLyogbm9uLXByaXZpbGVnZWQgdXNlciBmb3IgcHJpdmlsZWdlIHNlcGFyYXRpb24gKi8KKyN1bmRlZiBTU0hfUFJJVlNFUF9VU0VSCisKKy8qIFVzZSB0dW5uZWwgZGV2aWNlIGNvbXBhdGliaWxpdHkgdG8gT3BlbkJTRCAqLworI3VuZGVmIFNTSF9UVU5fQ09NUEFUX0FGCisKKy8qIE9wZW4gdHVubmVsIGRldmljZXMgdGhlIEZyZWVCU0Qgd2F5ICovCisjdW5kZWYgU1NIX1RVTl9GUkVFQlNECisKKy8qIE9wZW4gdHVubmVsIGRldmljZXMgdGhlIExpbnV4IHR1bi90YXAgd2F5ICovCisjdW5kZWYgU1NIX1RVTl9MSU5VWAorCisvKiBObyBsYXllciAyIHR1bm5lbCBzdXBwb3J0ICovCisjdW5kZWYgU1NIX1RVTl9OT19MMgorCisvKiBPcGVuIHR1bm5lbCBkZXZpY2VzIHRoZSBPcGVuQlNEIHdheSAqLworI3VuZGVmIFNTSF9UVU5fT1BFTkJTRAorCisvKiBQcmVwZW5kIHRoZSBhZGRyZXNzIGZhbWlseSB0byBJUCB0dW5uZWwgdHJhZmZpYyAqLworI3VuZGVmIFNTSF9UVU5fUFJFUEVORF9BRgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KKyN1bmRlZiBTVERDX0hFQURFUlMKKworLyogRGVmaW5lIGlmIHlvdSB3YW50IGEgZGlmZmVyZW50ICRQQVRIIGZvciB0aGUgc3VwZXJ1c2VyICovCisjdW5kZWYgU1VQRVJVU0VSX1BBVEgKKworLyogc3lzbG9nX3IgZnVuY3Rpb24gaXMgc2FmZSB0byB1c2UgaW4gaW4gYSBzaWduYWwgaGFuZGxlciAqLworI3VuZGVmIFNZU0xPR19SX1NBRkVfSU5fU0lHSEFORAorCisvKiBTdXBwb3J0IHBhc3N3b3JkcyA+IDggY2hhcnMgKi8KKyN1bmRlZiBVTklYV0FSRV9MT05HX1BBU1NXT1JEUworCisvKiBTcGVjaWZ5IGRlZmF1bHQgJFBBVEggKi8KKyN1bmRlZiBVU0VSX1BBVEgKKworLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgdG8gdXNlIGxpYmthZnMnIEFGUyBzdXBwb3J0ICovCisjdW5kZWYgVVNFX0FGUworCisvKiBVc2UgQlNNIGF1ZGl0IG1vZHVsZSAqLworI3VuZGVmIFVTRV9CU01fQVVESVQKKworLyogVXNlIGJ0bXAgdG8gbG9nIGJhZCBsb2dpbnMgKi8KKyN1bmRlZiBVU0VfQlRNUAorCisvKiBVc2UgbGliZWRpdCBmb3Igc2Z0cCAqLworI3VuZGVmIFVTRV9MSUJFRElUCisKKy8qIFVzZSBMaW51eCBhdWRpdCBtb2R1bGUgKi8KKyN1bmRlZiBVU0VfTElOVVhfQVVESVQKKworLyogRW5hYmxlIE9wZW5TU0wgZW5naW5lIHN1cHBvcnQgKi8KKyN1bmRlZiBVU0VfT1BFTlNTTF9FTkdJTkUKKworLyogRGVmaW5lIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBQQU0gc3VwcG9ydCAqLworI3VuZGVmIFVTRV9QQU0KKworLyogVXNlIFBJUEVTIGluc3RlYWQgb2YgYSBzb2NrZXRwYWlyKCkgKi8KKyN1bmRlZiBVU0VfUElQRVMKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIFNvbGFyaXMgcHJvY2VzcyBjb250cmFjdHMgKi8KKyN1bmRlZiBVU0VfU09MQVJJU19QUk9DRVNTX0NPTlRSQUNUUworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgU29sYXJpcyBwcm9qZWN0cyAqLworI3VuZGVmIFVTRV9TT0xBUklTX1BST0pFQ1RTCisKKy8qIERlZmluZSBpZiB5b3Ugc2hvdWxkbid0IHN0cmlwICd0dHknIGZyb20geW91ciB0dHluYW1lIGluIFt1d110bXAgKi8KKyN1bmRlZiBXSVRIX0FCQlJFVl9OT19UVFkKKworLyogRGVmaW5lIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBBSVg0J3MgYXV0aGVudGljYXRlIGZ1bmN0aW9uICovCisjdW5kZWYgV0lUSF9BSVhBVVRIRU5USUNBVEUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlL3dhbnQgYXJyYXlzIChjbHVzdGVyLXdpZGUgc2Vzc2lvbiBtYW5hZ21lbnQsIG5vdCBDCisgICBhcnJheXMpICovCisjdW5kZWYgV0lUSF9JUklYX0FSUkFZCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCBJUklYIGF1ZGl0IHRyYWlscyAqLworI3VuZGVmIFdJVEhfSVJJWF9BVURJVAorCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgSVJJWCBrZXJuZWwgam9icyAqLworI3VuZGVmIFdJVEhfSVJJWF9KT0JTCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCBJUklYIHByb2plY3QgbWFuYWdlbWVudCAqLworI3VuZGVmIFdJVEhfSVJJWF9QUk9KRUNUCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCBTRUxpbnV4IHN1cHBvcnQuICovCisjdW5kZWYgV0lUSF9TRUxJTlVYCisKKy8qIERlZmluZSBXT1JEU19CSUdFTkRJQU4gdG8gMSBpZiB5b3VyIHByb2Nlc3NvciBzdG9yZXMgd29yZHMgd2l0aCB0aGUgbW9zdAorICAgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdCAobGlrZSBNb3Rvcm9sYSBhbmQgU1BBUkMsIHVubGlrZSBJbnRlbCkuICovCisjaWYgZGVmaW5lZCBBQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQKKyMgaWYgZGVmaW5lZCBfX0JJR19FTkRJQU5fXworIyAgZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCisjIGVuZGlmCisjZWxzZQorIyBpZm5kZWYgV09SRFNfQklHRU5ESUFOCisjICB1bmRlZiBXT1JEU19CSUdFTkRJQU4KKyMgZW5kaWYKKyNlbmRpZgorCisvKiBEZWZpbmUgaWYgeGF1dGggaXMgZm91bmQgaW4geW91ciBwYXRoICovCisjdW5kZWYgWEFVVEhfUEFUSAorCisvKiBOdW1iZXIgb2YgYml0cyBpbiBhIGZpbGUgb2Zmc2V0LCBvbiBob3N0cyB3aGVyZSB0aGlzIGlzIHNldHRhYmxlLiAqLworI3VuZGVmIF9GSUxFX09GRlNFVF9CSVRTCisKKy8qIERlZmluZSBmb3IgbGFyZ2UgZmlsZXMsIG9uIEFJWC1zdHlsZSBob3N0cy4gKi8KKyN1bmRlZiBfTEFSR0VfRklMRVMKKworLyogbG9nIGZvciBiYWQgbG9naW4gYXR0ZW1wdHMgKi8KKyN1bmRlZiBfUEFUSF9CVE1QCisKKy8qIEZ1bGwgcGF0aCBvZiB5b3VyICJwYXNzd2QiIHByb2dyYW0gKi8KKyN1bmRlZiBfUEFUSF9QQVNTV0RfUFJPRworCisvKiBTcGVjaWZ5IGxvY2F0aW9uIG9mIHNzaC5waWQgKi8KKyN1bmRlZiBfUEFUSF9TU0hfUElERElSCisKKy8qIERlZmluZSBpZiB3ZSBkb24ndCBoYXZlIHN0cnVjdCBfX3Jlc19zdGF0ZSBpbiByZXNvbHYuaCAqLworI3VuZGVmIF9fcmVzX3N0YXRlCisKKy8qIERlZmluZSB0byBgX19pbmxpbmVfXycgb3IgYF9faW5saW5lJyBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlcgorICAgY2FsbHMgaXQsIG9yIHRvIG5vdGhpbmcgaWYgJ2lubGluZScgaXMgbm90IHN1cHBvcnRlZCB1bmRlciBhbnkgbmFtZS4gICovCisjaWZuZGVmIF9fY3BsdXNwbHVzCisjdW5kZWYgaW5saW5lCisjZW5kaWYKKworLyogdHlwZSB0byB1c2UgaW4gcGxhY2Ugb2Ygc29ja2xlbl90IGlmIG5vdCBkZWZpbmVkICovCisjdW5kZWYgc29ja2xlbl90CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2NvbmZpZy5zdWIgYi9vcGVuc3NoLTYuMHAxL2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmQ4MTY5NgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY29uZmlnLnN1YgpAQCAtMCwwICsxLDE3MzkgQEAKKyMhIC9iaW4vc2gKKyMgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIHN1YnJvdXRpbmUgc2NyaXB0LgorIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKKyMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLAorIyAgIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK3RpbWVzdGFtcD0nMjAxMS0wMS0wMScKKworIyBUaGlzIGZpbGUgaXMgKGluIHByaW5jaXBsZSkgY29tbW9uIHRvIEFMTCBHTlUgc29mdHdhcmUuCisjIFRoZSBwcmVzZW5jZSBvZiBhIG1hY2hpbmUgaW4gdGhpcyBmaWxlIHN1Z2dlc3RzIHRoYXQgU09NRSBHTlUgc29mdHdhcmUKKyMgY2FuIGhhbmRsZSB0aGF0IG1hY2hpbmUuICBJdCBkb2VzIG5vdCBpbXBseSBBTEwgR05VIHNvZnR3YXJlIGNhbi4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyMgMDIxMTAtMTMwMSwgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKworIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKKyMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgR05VIENoYW5nZUxvZyBlbnRyeS4KKyMKKyMgQ29uZmlndXJhdGlvbiBzdWJyb3V0aW5lIHRvIHZhbGlkYXRlIGFuZCBjYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIHR5cGUuCisjIFN1cHBseSB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gdHlwZSBhcyBhbiBhcmd1bWVudC4KKyMgSWYgaXQgaXMgaW52YWxpZCwgd2UgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBvbiBzdGRlcnIgYW5kIGV4aXQgd2l0aCBjb2RlIDEuCisjIE90aGVyd2lzZSwgd2UgcHJpbnQgdGhlIGNhbm9uaWNhbCBjb25maWcgdHlwZSBvbiBzdGRvdXQgYW5kIHN1Y2NlZWQuCisKKyMgWW91IGNhbiBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgc2NyaXB0IGZyb206CisjIGh0dHA6Ly9naXQuc2F2YW5uYWguZ251Lm9yZy9naXR3ZWIvP3A9Y29uZmlnLmdpdDthPWJsb2JfcGxhaW47Zj1jb25maWcuc3ViO2hiPUhFQUQKKworIyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBHTlUgcGFja2FnZXMKKyMgYW5kIHJlY29nbml6ZSBhbGwgdGhlIENQVSB0eXBlcywgc3lzdGVtIHR5cGVzIGFuZCBhbGlhc2VzCisjIHRoYXQgYXJlIG1lYW5pbmdmdWwgd2l0aCAqYW55KiBHTlUgc29mdHdhcmUuCisjIEVhY2ggcGFja2FnZSBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nIHdoaWNoIHZhbGlkIGNvbmZpZ3VyYXRpb25zCisjIGl0IGRvZXMgbm90IHN1cHBvcnQuICBUaGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaAorIyBhIGZhaWx1cmUgdG8gc3VwcG9ydCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG1lYW5pbmdsZXNzCisjIGNvbmZpZ3VyYXRpb24uCisKKyMgVGhlIGdvYWwgb2YgdGhpcyBmaWxlIGlzIHRvIG1hcCBhbGwgdGhlIHZhcmlvdXMgdmFyaWF0aW9ucyBvZiBhIGdpdmVuCisjIG1hY2hpbmUgc3BlY2lmaWNhdGlvbiBpbnRvIGEgc2luZ2xlIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm06CisjCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCisjIG9yIGluIHNvbWUgY2FzZXMsIHRoZSBuZXdlciBmb3VyLXBhcnQgZm9ybToKKyMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCisjIEl0IGlzIHdyb25nIHRvIGVjaG8gYW55IG90aGVyIHR5cGUgb2Ygc3BlY2lmaWNhdGlvbi4KKworbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCisKK3VzYWdlPSJcCitVc2FnZTogJDAgW09QVElPTl0gQ1BVLU1GUi1PUFNZUworICAgICAgICQwIFtPUFRJT05dIEFMSUFTCisKK0Nhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gbmFtZS4KKworT3BlcmF0aW9uIG1vZGVzOgorICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAorICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorCitSZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgorCit2ZXJzaW9uPSJcCitHTlUgY29uZmlnLnN1YiAoJHRpbWVzdGFtcCkKKworQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLAorMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCisKK2hlbHA9IgorVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisjIFBhcnNlIGNvbW1hbmQgbGluZQord2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQorICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCA7OworICAgIC0tdmVyc2lvbiB8IC12ICkKKyAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDs7CisgICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICAgc2hpZnQ7IGJyZWFrIDs7CisgICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgorICAgICAgIGJyZWFrIDs7CisgICAgLSogKQorICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIKKyAgICAgICBleGl0IDEgOzsKKworICAgICpsb2NhbCopCisgICAgICAgIyBGaXJzdCBwYXNzIHRocm91Z2ggYW55IGxvY2FsIG1hY2hpbmUgdHlwZXMuCisgICAgICAgZWNobyAkMQorICAgICAgIGV4aXQgOzsKKworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworY2FzZSAkIyBpbgorIDApIGVjaG8gIiRtZTogbWlzc2luZyBhcmd1bWVudCRoZWxwIiA+JjIKKyAgICBleGl0IDE7OworIDEpIDs7CisgKikgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgICAgZXhpdCAxOzsKK2VzYWMKKworIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgorIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KK21heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAorY2FzZSAkbWF5YmVfb3MgaW4KKyAgbnRvLXFueCogfCBsaW51eC1nbnUqIHwgbGludXgtYW5kcm9pZCogfCBsaW51eC1kaWV0bGliYyB8IGxpbnV4LW5ld2xpYiogfCBcCisgIGxpbnV4LXVjbGliYyogfCB1Y2xpbnV4LXVjbGliYyogfCB1Y2xpbnV4LWdudSogfCBrZnJlZWJzZCotZ251KiB8IFwKKyAga25ldGJzZCotZ251KiB8IG5ldGJzZCotZ251KiB8IFwKKyAga29wZW5zb2xhcmlzKi1nbnUqIHwgXAorICBzdG9ybS1jaGFvcyogfCBvczItZW14KiB8IHJ0bWstbm92YSopCisgICAgb3M9LSRtYXliZV9vcworICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgCisgICAgOzsKKyAgKikKKyAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzLy1bXi1dKiQvLydgCisgICAgaWYgWyAkYmFzaWNfbWFjaGluZSAhPSAkMSBdCisgICAgdGhlbiBvcz1gZWNobyAkMSB8IHNlZCAncy8uKi0vLS8nYAorICAgIGVsc2Ugb3M9OyBmaQorICAgIDs7Citlc2FjCisKKyMjIyBMZXQncyByZWNvZ25pemUgY29tbW9uIG1hY2hpbmVzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcyBzbworIyMjIHRoYXQgdGhpbmdzIGxpa2UgY29uZmlnLnN1YiBkZWNzdGF0aW9uLTMxMDAgd29yay4gIFdlIGFsc28KKyMjIyByZWNvZ25pemUgc29tZSBtYW51ZmFjdHVyZXJzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcywgc28gd2UKKyMjIyBjYW4gcHJvdmlkZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIGJlbG93LgorY2FzZSAkb3MgaW4KKwktc3VuKm9zKikKKwkJIyBQcmV2ZW50IGZvbGxvd2luZyBjbGF1c2UgZnJvbSBoYW5kbGluZyB0aGlzIGludmFsaWQgaW5wdXQuCisJCTs7CisJLWRlYyogfCAtbWlwcyogfCAtc2VxdWVudCogfCAtZW5jb3JlKiB8IC1wYzUzMiogfCAtc2dpKiB8IC1zb255KiB8IFwKKwktYXR0KiB8IC03MzAwKiB8IC0zMzAwKiB8IC1kZWx0YSogfCAtbW90b3JvbGEqIHwgLXN1blsyMzRdKiB8IFwKKwktdW5pY29tKiB8IC1pYm0qIHwgLW5leHQgfCAtaHAgfCAtaXNpKiB8IC1hcG9sbG8gfCAtYWx0b3MqIHwgXAorCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCisJLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKKwktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKKwktYXBwbGUgfCAtYXhpcyB8IC1rbnV0aCB8IC1jcmF5IHwgLW1pY3JvYmxhemUpCisJCW9zPQorCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisgICAgICAgIC1ibHVlZ2VuZSopCisJICAgICAgICBvcz0tY25rCisJCTs7CisJLXNpbSB8IC1jaXNjbyB8IC1va2kgfCAtd2VjIHwgLXdpbmJvbmQpCisJCW9zPQorCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLXNjb3V0KQorCQk7OworCS13cnMpCisJCW9zPS12eHdvcmtzCisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktY2hvcnVzb3MqKQorCQlvcz0tY2hvcnVzb3MKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworIAktY2hvcnVzcmRiKQorIAkJb3M9LWNob3J1c3JkYgorCQliYXNpY19tYWNoaW5lPSQxCisgCQk7OworCS1oaXV4KikKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwktc2NvNikKKwkJb3M9LXNjbzV2NgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzUpCisJCW9zPS1zY28zLjJ2NQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzQpCisJCW9zPS1zY28zLjJ2NAorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzMuMi5bNC05XSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy9zY28zLjIuL3NjbzMuMnYvJ2AKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28zLjJ2WzQtOV0qKQorCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzV2NiopCisJCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvKikKKwkJb3M9LXNjbzMuMnYyCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktdWRrKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1pc2MpCisJCW9zPS1pc2MyLjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1jbGl4KikKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWludGVyZ3JhcGgKKwkJOzsKKwktaXNjKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1seW54KikKKwkJb3M9LWx5bnhvcworCQk7OworCS1wdHgqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXNlcXVlbnQvJ2AKKwkJOzsKKwktd2luZG93c250KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3dpbmRvd3NudC93aW5udC8nYAorCQk7OworCS1wc29zKikKKwkJb3M9LXBzb3MKKwkJOzsKKwktbWludCB8IC1taW50WzAtOV0qKQorCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKKwkJb3M9LW1pbnQKKwkJOzsKK2VzYWMKKworIyBEZWNvZGUgYWxpYXNlcyBmb3IgY2VydGFpbiBDUFUtQ09NUEFOWSBjb21iaW5hdGlvbnMuCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRob3V0IGNvbXBhbnkgbmFtZS4KKwkjIFNvbWUgYXJlIG9taXR0ZWQgaGVyZSBiZWNhdXNlIHRoZXkgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGJlbG93LgorCTE3NTBhIHwgNTgwIFwKKwl8IGEyOWsgXAorCXwgYWxwaGEgfCBhbHBoYWV2WzQtOF0gfCBhbHBoYWV2NTYgfCBhbHBoYWV2Nls3OF0gfCBhbHBoYXBjYTVbNjddIFwKKwl8IGFscGhhNjQgfCBhbHBoYTY0ZXZbNC04XSB8IGFscGhhNjRldjU2IHwgYWxwaGE2NGV2Nls3OF0gfCBhbHBoYTY0cGNhNVs2N10gXAorCXwgYW0zM18yLjAgXAorCXwgYXJjIHwgYXJtIHwgYXJtW2JsXWUgfCBhcm1lW2xiXSB8IGFybXZbMjM0NV0gfCBhcm12WzM0NV1bbGJdIHwgYXZyIHwgYXZyMzIgXAorCXwgYmZpbiBcCisJfCBjNHggfCBjbGlwcGVyIFwKKwl8IGQxMHYgfCBkMzB2IHwgZGx4IHwgZHNwMTZ4eCBcCisJfCBmaWRvIHwgZnIzMCB8IGZydiBcCisJfCBoODMwMCB8IGg4NTAwIHwgaHBwYSB8IGhwcGExLlswMV0gfCBocHBhMi4wIHwgaHBwYTIuMFtud10gfCBocHBhNjQgXAorCXwgaTM3MCB8IGk4NjAgfCBpOTYwIHwgaWE2NCBcCisJfCBpcDJrIHwgaXEyMDAwIFwKKwl8IGxtMzIgXAorCXwgbTMyYyB8IG0zMnIgfCBtMzJybGUgfCBtNjgwMDAgfCBtNjhrIHwgbTg4ayBcCisJfCBtYXhxIHwgbWIgfCBtaWNyb2JsYXplIHwgbWNvcmUgfCBtZXAgfCBtZXRhZyBcCisJfCBtaXBzIHwgbWlwc2JlIHwgbWlwc2ViIHwgbWlwc2VsIHwgbWlwc2xlIFwKKwl8IG1pcHMxNiBcCisJfCBtaXBzNjQgfCBtaXBzNjRlbCBcCisJfCBtaXBzNjRvY3Rlb24gfCBtaXBzNjRvY3Rlb25lbCBcCisJfCBtaXBzNjRvcmlvbiB8IG1pcHM2NG9yaW9uZWwgXAorCXwgbWlwczY0cjU5MDAgfCBtaXBzNjRyNTkwMGVsIFwKKwl8IG1pcHM2NHZyIHwgbWlwczY0dnJlbCBcCisJfCBtaXBzNjR2cjQxMDAgfCBtaXBzNjR2cjQxMDBlbCBcCisJfCBtaXBzNjR2cjQzMDAgfCBtaXBzNjR2cjQzMDBlbCBcCisJfCBtaXBzNjR2cjUwMDAgfCBtaXBzNjR2cjUwMDBlbCBcCisJfCBtaXBzNjR2cjU5MDAgfCBtaXBzNjR2cjU5MDBlbCBcCisJfCBtaXBzaXNhMzIgfCBtaXBzaXNhMzJlbCBcCisJfCBtaXBzaXNhMzJyMiB8IG1pcHNpc2EzMnIyZWwgXAorCXwgbWlwc2lzYTY0IHwgbWlwc2lzYTY0ZWwgXAorCXwgbWlwc2lzYTY0cjIgfCBtaXBzaXNhNjRyMmVsIFwKKwl8IG1pcHNpc2E2NHNiMSB8IG1pcHNpc2E2NHNiMWVsIFwKKwl8IG1pcHNpc2E2NHNyNzFrIHwgbWlwc2lzYTY0c3I3MWtlbCBcCisJfCBtaXBzdHgzOSB8IG1pcHN0eDM5ZWwgXAorCXwgbW4xMDIwMCB8IG1uMTAzMDAgXAorCXwgbW94aWUgXAorCXwgbXQgXAorCXwgbXNwNDMwIFwKKwl8IG5kczMyIHwgbmRzMzJsZSB8IG5kczMyYmUgXAorCXwgbmlvcyB8IG5pb3MyIFwKKwl8IG5zMTZrIHwgbnMzMmsgXAorCXwgb3IzMiBcCisJfCBwZHAxMCB8IHBkcDExIHwgcGogfCBwamwgXAorCXwgcG93ZXJwYyB8IHBvd2VycGM2NCB8IHBvd2VycGM2NGxlIHwgcG93ZXJwY2xlIHwgcHBjYmUgXAorCXwgcHlyYW1pZCBcCisJfCByeCBcCisJfCBzY29yZSBcCisJfCBzaCB8IHNoWzEyMzRdIHwgc2hbMjRdYSB8IHNoWzI0XWFlYiB8IHNoWzIzXWUgfCBzaFszNF1lYiB8IHNoZWIgfCBzaGJlIHwgc2hsZSB8IHNoWzEyMzRdbGUgfCBzaDNlbGUgXAorCXwgc2g2NCB8IHNoNjRsZSBcCisJfCBzcGFyYyB8IHNwYXJjNjQgfCBzcGFyYzY0YiB8IHNwYXJjNjR2IHwgc3BhcmM4NnggfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSBcCisJfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliIHwgc3BhcmN2OXYgXAorCXwgc3B1IHwgc3Ryb25nYXJtIFwKKwl8IHRhaG9lIHwgdGh1bWIgfCB0aWM0eCB8IHRpYzU0eCB8IHRpYzU1eCB8IHRpYzZ4IHwgdGljODAgfCB0cm9uIFwKKwl8IHViaWNvbTMyIFwKKwl8IHY4NTAgfCB2ODUwZSBcCisJfCB3ZTMyayBcCisJfCB4ODYgfCB4YzE2eCB8IHhzY2FsZSB8IHhzY2FsZWVbYmxdIHwgeHN0b3JteTE2IHwgeHRlbnNhIFwKKwl8IHo4ayB8IHo4MCkKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCTs7CisJYzU0eCkKKwkJYmFzaWNfbWFjaGluZT10aWM1NHgtdW5rbm93bgorCQk7OworCWM1NXgpCisJCWJhc2ljX21hY2hpbmU9dGljNTV4LXVua25vd24KKwkJOzsKKwljNngpCisJCWJhc2ljX21hY2hpbmU9dGljNngtdW5rbm93bgorCQk7OworCW02ODExIHwgbTY4aGMxMSB8IG02ODEyIHwgbTY4aGMxMiB8IHBpY29jaGlwKQorCQkjIE1vdG9yb2xhIDY4SEMxMS8xMi4KKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCW9zPS1ub25lCisJCTs7CisJbTg4MTEwIHwgbTY4MFsxMjM0Nl0wIHwgbTY4Mz8yIHwgbTY4MzYwIHwgbTUyMDAgfCB2NzAgfCB3NjUgfCB6OGspCisJCTs7CisJbXMxKQorCQliYXNpY19tYWNoaW5lPW10LXVua25vd24KKwkJOzsKKworCSMgV2UgdXNlIGBwYycgcmF0aGVyIHRoYW4gYHVua25vd24nCisJIyBiZWNhdXNlICgxKSB0aGF0J3Mgd2hhdCB0aGV5IG5vcm1hbGx5IGFyZSwgYW5kCisJIyAoMikgdGhlIHdvcmQgInVua25vd24iIHRlbmRzIHRvIGNvbmZ1c2UgYmVnaW5uaW5nIHVzZXJzLgorCWkqODYgfCB4ODZfNjQpCisJICBiYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXBjCisJICA7OworCSMgT2JqZWN0IGlmIG1vcmUgdGhhbiBvbmUgY29tcGFueSBuYW1lIHdvcmQuCisJKi0qLSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGggY29tcGFueSBuYW1lLgorCTU4MC0qIFwKKwl8IGEyOWstKiBcCisJfCBhbHBoYS0qIHwgYWxwaGFldls0LThdLSogfCBhbHBoYWV2NTYtKiB8IGFscGhhZXY2Wzc4XS0qIFwKKwl8IGFscGhhNjQtKiB8IGFscGhhNjRldls0LThdLSogfCBhbHBoYTY0ZXY1Ni0qIHwgYWxwaGE2NGV2Nls3OF0tKiBcCisJfCBhbHBoYXBjYTVbNjddLSogfCBhbHBoYTY0cGNhNVs2N10tKiB8IGFyYy0qIFwKKwl8IGFybS0qICB8IGFybWJlLSogfCBhcm1sZS0qIHwgYXJtZWItKiB8IGFybXYqLSogXAorCXwgYXZyLSogfCBhdnIzMi0qIFwKKwl8IGJmaW4tKiB8IGJzMjAwMC0qIFwKKwl8IGNbMTIzXSogfCBjMzAtKiB8IFtjanRdOTAtKiB8IGM0eC0qIFwKKwl8IGNsaXBwZXItKiB8IGNyYXludi0qIHwgY3lkcmEtKiBcCisJfCBkMTB2LSogfCBkMzB2LSogfCBkbHgtKiBcCisJfCBlbHhzaS0qIFwKKwl8IGYzMFswMV0tKiB8IGY3MDAtKiB8IGZpZG8tKiB8IGZyMzAtKiB8IGZydi0qIHwgZng4MC0qIFwKKwl8IGg4MzAwLSogfCBoODUwMC0qIFwKKwl8IGhwcGEtKiB8IGhwcGExLlswMV0tKiB8IGhwcGEyLjAtKiB8IGhwcGEyLjBbbnddLSogfCBocHBhNjQtKiBcCisJfCBpKjg2LSogfCBpODYwLSogfCBpOTYwLSogfCBpYTY0LSogXAorCXwgaXAyay0qIHwgaXEyMDAwLSogXAorCXwgbG0zMi0qIFwKKwl8IG0zMmMtKiB8IG0zMnItKiB8IG0zMnJsZS0qIFwKKwl8IG02ODAwMC0qIHwgbTY4MFswMTIzNDZdMC0qIHwgbTY4MzYwLSogfCBtNjgzPzItKiB8IG02OGstKiBcCisJfCBtODgxMTAtKiB8IG04OGstKiB8IG1heHEtKiB8IG1jb3JlLSogfCBtZXRhZy0qIHwgbWljcm9ibGF6ZS0qIFwKKwl8IG1pcHMtKiB8IG1pcHNiZS0qIHwgbWlwc2ViLSogfCBtaXBzZWwtKiB8IG1pcHNsZS0qIFwKKwl8IG1pcHMxNi0qIFwKKwl8IG1pcHM2NC0qIHwgbWlwczY0ZWwtKiBcCisJfCBtaXBzNjRvY3Rlb24tKiB8IG1pcHM2NG9jdGVvbmVsLSogXAorCXwgbWlwczY0b3Jpb24tKiB8IG1pcHM2NG9yaW9uZWwtKiBcCisJfCBtaXBzNjRyNTkwMC0qIHwgbWlwczY0cjU5MDBlbC0qIFwKKwl8IG1pcHM2NHZyLSogfCBtaXBzNjR2cmVsLSogXAorCXwgbWlwczY0dnI0MTAwLSogfCBtaXBzNjR2cjQxMDBlbC0qIFwKKwl8IG1pcHM2NHZyNDMwMC0qIHwgbWlwczY0dnI0MzAwZWwtKiBcCisJfCBtaXBzNjR2cjUwMDAtKiB8IG1pcHM2NHZyNTAwMGVsLSogXAorCXwgbWlwczY0dnI1OTAwLSogfCBtaXBzNjR2cjU5MDBlbC0qIFwKKwl8IG1pcHNpc2EzMi0qIHwgbWlwc2lzYTMyZWwtKiBcCisJfCBtaXBzaXNhMzJyMi0qIHwgbWlwc2lzYTMycjJlbC0qIFwKKwl8IG1pcHNpc2E2NC0qIHwgbWlwc2lzYTY0ZWwtKiBcCisJfCBtaXBzaXNhNjRyMi0qIHwgbWlwc2lzYTY0cjJlbC0qIFwKKwl8IG1pcHNpc2E2NHNiMS0qIHwgbWlwc2lzYTY0c2IxZWwtKiBcCisJfCBtaXBzaXNhNjRzcjcxay0qIHwgbWlwc2lzYTY0c3I3MWtlbC0qIFwKKwl8IG1pcHN0eDM5LSogfCBtaXBzdHgzOWVsLSogXAorCXwgbW1peC0qIFwKKwl8IG10LSogXAorCXwgbXNwNDMwLSogXAorCXwgbmRzMzItKiB8IG5kczMybGUtKiB8IG5kczMyYmUtKiBcCisJfCBuaW9zLSogfCBuaW9zMi0qIFwKKwl8IG5vbmUtKiB8IG5wMS0qIHwgbnMxNmstKiB8IG5zMzJrLSogXAorCXwgb3Jpb24tKiBcCisJfCBwZHAxMC0qIHwgcGRwMTEtKiB8IHBqLSogfCBwamwtKiB8IHBuLSogfCBwb3dlci0qIFwKKwl8IHBvd2VycGMtKiB8IHBvd2VycGM2NC0qIHwgcG93ZXJwYzY0bGUtKiB8IHBvd2VycGNsZS0qIHwgcHBjYmUtKiBcCisJfCBweXJhbWlkLSogXAorCXwgcm9tcC0qIHwgcnM2MDAwLSogfCByeC0qIFwKKwl8IHNoLSogfCBzaFsxMjM0XS0qIHwgc2hbMjRdYS0qIHwgc2hbMjRdYWViLSogfCBzaFsyM11lLSogfCBzaFszNF1lYi0qIHwgc2hlYi0qIHwgc2hiZS0qIFwKKwl8IHNobGUtKiB8IHNoWzEyMzRdbGUtKiB8IHNoM2VsZS0qIHwgc2g2NC0qIHwgc2g2NGxlLSogXAorCXwgc3BhcmMtKiB8IHNwYXJjNjQtKiB8IHNwYXJjNjRiLSogfCBzcGFyYzY0di0qIHwgc3BhcmM4NngtKiB8IHNwYXJjbGV0LSogXAorCXwgc3BhcmNsaXRlLSogXAorCXwgc3BhcmN2OC0qIHwgc3BhcmN2OS0qIHwgc3BhcmN2OWItKiB8IHNwYXJjdjl2LSogfCBzdHJvbmdhcm0tKiB8IHN2MS0qIHwgc3g/LSogXAorCXwgdGFob2UtKiB8IHRodW1iLSogXAorCXwgdGljMzAtKiB8IHRpYzR4LSogfCB0aWM1NHgtKiB8IHRpYzU1eC0qIHwgdGljNngtKiB8IHRpYzgwLSogXAorCXwgdGlsZS0qIHwgdGlsZWd4LSogXAorCXwgdHJvbi0qIFwKKwl8IHViaWNvbTMyLSogXAorCXwgdjg1MC0qIHwgdjg1MGUtKiB8IHZheC0qIFwKKwl8IHdlMzJrLSogXAorCXwgeDg2LSogfCB4ODZfNjQtKiB8IHhjMTZ4LSogfCB4cHMxMDAtKiB8IHhzY2FsZS0qIHwgeHNjYWxlZVtibF0tKiBcCisJfCB4c3Rvcm15MTYtKiB8IHh0ZW5zYSotKiBcCisJfCB5bXAtKiBcCisJfCB6OGstKiB8IHo4MC0qKQorCQk7OworCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUsIHdpdGggZ2xvYiBtYXRjaC4KKwl4dGVuc2EqKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCisJIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KKwkzODZic2QpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS1ic2QKKwkJOzsKKwkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0CisJCTs7CisJM2IqKQorCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAorCQk7OworCWEyOWtoaWYpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworICAgIAlhYmFjdXMpCisJCWJhc2ljX21hY2hpbmU9YWJhY3VzLXVua25vd24KKwkJOzsKKwlhZG9iZTY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMTAtYWRvYmUKKwkJb3M9LXNjb3V0CisJCTs7CisJYWxsaWFudCB8IGZ4ODApCisJCWJhc2ljX21hY2hpbmU9Zng4MC1hbGxpYW50CisJCTs7CisJYWx0b3MgfCBhbHRvczMwNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hbHRvcworCQk7OworCWFtMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstbm9uZQorCQlvcz0tYnNkCisJCTs7CisJYW1kNjQpCisJCWJhc2ljX21hY2hpbmU9eDg2XzY0LXBjCisJCTs7CisJYW1kNjQtKikKKwkJYmFzaWNfbWFjaGluZT14ODZfNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlhbWRhaGwpCisJCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAorCQlvcz0tc3lzdgorCQk7OworCWFtaWdhIHwgYW1pZ2EtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJOzsKKwlhbWlnYW9zIHwgYW1pZ2Fkb3MpCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCW9zPS1hbWlnYW9zCisJCTs7CisJYW1pZ2F1bml4IHwgYW1peCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LXN5c3Y0CisJCTs7CisJYXBvbGxvNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KKwkJb3M9LXN5c3YKKwkJOzsKKwlhcG9sbG82OGJzZCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbworCQlvcz0tYnNkCisJCTs7CisJYXJvcykKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1hcm9zCisJCTs7CisJYXV4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJb3M9LWF1eAorCQk7OworCWJhbGFuY2UpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwlibGFja2ZpbikKKwkJYmFzaWNfbWFjaGluZT1iZmluLXVua25vd24KKwkJb3M9LWxpbnV4CisJCTs7CisJYmxhY2tmaW4tKikKKwkJYmFzaWNfbWFjaGluZT1iZmluLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCW9zPS1saW51eAorCQk7OworCWJsdWVnZW5lKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWlibQorCQlvcz0tY25rCisJCTs7CisJYzU0eC0qKQorCQliYXNpY19tYWNoaW5lPXRpYzU0eC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCWM1NXgtKikKKwkJYmFzaWNfbWFjaGluZT10aWM1NXgtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwljNngtKikKKwkJYmFzaWNfbWFjaGluZT10aWM2eC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCWM5MCkKKwkJYmFzaWNfbWFjaGluZT1jOTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisgICAgICAgIGNlZ2NjKQorCQliYXNpY19tYWNoaW5lPWFybS11bmtub3duCisJCW9zPS1jZWdjYworCQk7OworCWNvbnZleC1jMSkKKwkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMikKKwkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzIpCisJCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzNCkKKwkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzM4KQorCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNyYXkgfCBqOTApCisJCWJhc2ljX21hY2hpbmU9ajkwLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCWNyYXludikKKwkJYmFzaWNfbWFjaGluZT1jcmF5bnYtY3JheQorCQlvcz0tdW5pY29zbXAKKwkJOzsKKwljcjE2IHwgY3IxNi0qKQorCQliYXNpY19tYWNoaW5lPWNyMTYtdW5rbm93bgorCQlvcz0tZWxmCisJCTs7CisJY3JkcyB8IHVub3MpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1jcmRzCisJCTs7CisJY3Jpc3YzMiB8IGNyaXN2MzItKiB8IGV0cmF4ZnMqKQorCQliYXNpY19tYWNoaW5lPWNyaXN2MzItYXhpcworCQk7OworCWNyaXMgfCBjcmlzLSogfCBldHJheCopCisJCWJhc2ljX21hY2hpbmU9Y3Jpcy1heGlzCisJCTs7CisJY3J4KQorCQliYXNpY19tYWNoaW5lPWNyeC11bmtub3duCisJCW9zPS1lbGYKKwkJOzsKKwlkYTMwIHwgZGEzMC0qKQorCQliYXNpY19tYWNoaW5lPW02OGstZGEzMAorCQk7OworCWRlY3N0YXRpb24gfCBkZWNzdGF0aW9uLTMxMDAgfCBwbWF4IHwgcG1heC0qIHwgcG1pbiB8IGRlYzMxMDAgfCBkZWNzdGF0bikKKwkJYmFzaWNfbWFjaGluZT1taXBzLWRlYworCQk7OworCWRlY3N5c3RlbTEwKiB8IGRlYzEwKikKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKKwkJb3M9LXRvcHMxMAorCQk7OworCWRlY3N5c3RlbTIwKiB8IGRlYzIwKikKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKKwkJb3M9LXRvcHMyMAorCQk7OworCWRlbHRhIHwgMzMwMCB8IG1vdG9yb2xhLTMzMDAgfCBtb3Rvcm9sYS1kZWx0YSBcCisJICAgICAgfCAzMzAwLW1vdG9yb2xhIHwgZGVsdGEtbW90b3JvbGEpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1tb3Rvcm9sYQorCQk7OworCWRlbHRhODgpCisJCWJhc2ljX21hY2hpbmU9bTg4ay1tb3Rvcm9sYQorCQlvcz0tc3lzdjMKKwkJOzsKKwlkaWNvcykKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCW9zPS1kaWNvcworCQk7OworCWRqZ3BwKQorCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKKwkJb3M9LW1zZG9zZGpncHAKKwkJOzsKKwlkcHgyMCB8IGRweDIwLSopCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWJ1bGwKKwkJb3M9LWJvc3gKKwkJOzsKKwlkcHgyKiB8IGRweDIqLWJ1bGwpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCisJCW9zPS1zeXN2MworCQk7OworCWVibW9uMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS1lYm1vbgorCQk7OworCWVseHNpKQorCQliYXNpY19tYWNoaW5lPWVseHNpLWVseHNpCisJCW9zPS1ic2QKKwkJOzsKKwllbmNvcmUgfCB1bWF4IHwgbW1heCkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1lbmNvcmUKKwkJOzsKKwllczE4MDAgfCBPU0U2OGsgfCBvc2U2OGsgfCBvc2UgfCBPU0UpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1lcmljc3NvbgorCQlvcz0tb3NlCisJCTs7CisJZngyODAwKQorCQliYXNpY19tYWNoaW5lPWk4NjAtYWxsaWFudAorCQk7OworCWdlbml4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLW5zCisJCTs7CisJZ21pY3JvKQorCQliYXNpY19tYWNoaW5lPXRyb24tZ21pY3JvCisJCW9zPS1zeXN2CisJCTs7CisJZ28zMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1nbzMyCisJCTs7CisJaDMwNTByKiB8IGhpdXgqKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQorCQlvcz0taGl1eHdlMgorCQk7OworCWg4MzAwaG1zKQorCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCWg4MzAweHJheSkKKwkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCisJCW9zPS14cmF5CisJCTs7CisJaDg1MDBobXMpCisJCWJhc2ljX21hY2hpbmU9aDg1MDAtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJaGFycmlzKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1zeXN2MworCQk7OworCWhwMzAwLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQk7OworCWhwMzAwYnNkKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJb3M9LWJzZAorCQk7OworCWhwMzAwaHB1eCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCW9zPS1ocHV4CisJCTs7CisJaHAzazlbMC05XVswLTldIHwgaHA5WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHA5azJbMC05XVswLTldIHwgaHA5azMxWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWhwCisJCTs7CisJaHA5azNbMi05XVswLTldKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJOzsKKwlocDlrNlswLTldWzAtOV0gfCBocDZbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocDlrN1swLTc5XVswLTldIHwgaHA3WzAtNzldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs3OFswLTldIHwgaHA3OFswLTldKQorCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFs2N10xIHwgaHA4WzY3XTEgfCBocDlrODBbMjRdIHwgaHA4MFsyNF0gfCBocDlrOFs3OF05IHwgaHA4Wzc4XTkgfCBocDlrODkzIHwgaHA4OTMpCisJCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzAtOV1bMTM2NzldIHwgaHA4WzAtOV1bMTM2NzldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFswLTldWzAtOV0gfCBocDhbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocHBhLW5leHQpCisJCW9zPS1uZXh0c3RlcDMKKwkJOzsKKwlocHBhb3NmKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJb3M9LW9zZgorCQk7OworCWhwcHJvKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJb3M9LXByb2VsZgorCQk7OworCWkzNzAtaWJtKiB8IGlibSopCisJCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KKwkJOzsKKyMgSSdtIG5vdCBzdXJlIHdoYXQgIlN5c3YzMiIgbWVhbnMuICBTaG91bGQgdGhpcyBiZSBzeXN2My4yPworCWkqODZ2MzIpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdjMyCisJCTs7CisJaSo4NnY0KikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2NAorCQk7OworCWkqODZ2KQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3YKKwkJOzsKKwlpKjg2c29sMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zb2xhcmlzMgorCQk7OworCWkzODZtYWNoKQorCQliYXNpY19tYWNoaW5lPWkzODYtbWFjaAorCQlvcz0tbWFjaAorCQk7OworCWkzODYtdnN0YSB8IHZzdGEpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS12c3RhCisJCTs7CisJaXJpcyB8IGlyaXM0ZCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNnaQorCQljYXNlICRvcyBpbgorCQkgICAgLWlyaXgqKQorCQkJOzsKKwkJICAgICopCisJCQlvcz0taXJpeDQKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwlpc2k2OCB8IGlzaSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWlzaQorCQlvcz0tc3lzdgorCQk7OworCW02OGtub21tdSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LWxpbnV4CisJCTs7CisJbTY4a25vbW11LSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQlvcz0tbGludXgKKwkJOzsKKwltODhrLW9tcm9uKikKKwkJYmFzaWNfbWFjaGluZT1tODhrLW9tcm9uCisJCTs7CisJbWFnbnVtIHwgbTMyMzApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCisJCW9zPS1zeXN2CisJCTs7CisJbWVybGluKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXV0ZWsKKwkJb3M9LXN5c3YKKwkJOzsKKyAgICAgICAgbWljcm9ibGF6ZSkKKwkJYmFzaWNfbWFjaGluZT1taWNyb2JsYXplLXhpbGlueAorCQk7OworCW1pbmd3MzIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tbWluZ3czMgorCQk7OworCW1pbmd3MzJjZSkKKwkJYmFzaWNfbWFjaGluZT1hcm0tdW5rbm93bgorCQlvcz0tbWluZ3czMmNlCisJCTs7CisJbWluaWZyYW1lKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1jb252ZXJnZW50CisJCTs7CisJKm1pbnQgfCAtbWludFswLTldKiB8ICpNaU5UIHwgKk1pTlRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworCW1pcHMzKi0qKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYAorCQk7OworCW1pcHMzKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AtdW5rbm93bgorCQk7OworCW1vbml0b3IpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKKwkJb3M9LWNvZmYKKwkJOzsKKwltb3JwaG9zKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgorCQlvcz0tbW9ycGhvcworCQk7OworCW1zZG9zKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LW1zZG9zCisJCTs7CisJbXMxLSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbXMxLS9tdC0vJ2AKKwkJOzsKKwltdnMpCisJCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KKwkJb3M9LW12cworCQk7OworCW5jcjMwMDApCisJCWJhc2ljX21hY2hpbmU9aTQ4Ni1uY3IKKwkJb3M9LXN5c3Y0CisJCTs7CisJbmV0YnNkMzg2KQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tbmV0YnNkCisJCTs7CisJbmV0d2luZGVyKQorCQliYXNpY19tYWNoaW5lPWFybXY0bC1yZWJlbAorCQlvcz0tbGludXgKKwkJOzsKKwluZXdzIHwgbmV3czcwMCB8IG5ld3M4MDAgfCBuZXdzOTAwKQorCQliYXNpY19tYWNoaW5lPW02OGstc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV3czEwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDMwLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MtMzYwMCB8IHJpc2MtbmV3cykKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5lY3Y3MCkKKwkJYmFzaWNfbWFjaGluZT12NzAtbmVjCisJCW9zPS1zeXN2CisJCTs7CisJbmV4dCB8IG0qLW5leHQgKQorCQliYXNpY19tYWNoaW5lPW02OGstbmV4dAorCQljYXNlICRvcyBpbgorCQkgICAgLW5leHRzdGVwKiApCisJCQk7OworCQkgICAgLW5zMiopCisJCSAgICAgIG9zPS1uZXh0c3RlcDIKKwkJCTs7CisJCSAgICAqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAzCisJCQk7OworCQllc2FjCisJCTs7CisJbmgzMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmhbNDVdMDAwKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmluZHk5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbmluZHkKKwkJOzsKKwltb245NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbW9uOTYwCisJCTs7CisJbm9uc3RvcHV4KQorCQliYXNpY19tYWNoaW5lPW1pcHMtY29tcGFxCisJCW9zPS1ub25zdG9wdXgKKwkJOzsKKwlucDEpCisJCWJhc2ljX21hY2hpbmU9bnAxLWdvdWxkCisJCTs7CisgICAgICAgIG5lby10YW5kZW0pCisJCWJhc2ljX21hY2hpbmU9bmVvLXRhbmRlbQorCQk7OworICAgICAgICBuc2UtdGFuZGVtKQorCQliYXNpY19tYWNoaW5lPW5zZS10YW5kZW0KKwkJOzsKKwluc3ItdGFuZGVtKQorCQliYXNpY19tYWNoaW5lPW5zci10YW5kZW0KKwkJOzsKKwlvcDUwbi0qIHwgb3A2MGMtKikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQlvcz0tcHJvZWxmCisJCTs7CisJb3BlbnJpc2MgfCBvcGVucmlzYy0qKQorCQliYXNpY19tYWNoaW5lPW9yMzItdW5rbm93bgorCQk7OworCW9zNDAwKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtaWJtCisJCW9zPS1vczQwMAorCQk7OworCU9TRTY4MDAwIHwgb3NlNjgwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWVyaWNzc29uCisJCW9zPS1vc2UKKwkJOzsKKwlvczY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5vbmUKKwkJb3M9LW9zNjhrCisJCTs7CisJcGEtaGl0YWNoaSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwlwYXJhZ29uKQorCQliYXNpY19tYWNoaW5lPWk4NjAtaW50ZWwKKwkJb3M9LW9zZgorCQk7OworCXBhcmlzYykKKwkJYmFzaWNfbWFjaGluZT1ocHBhLXVua25vd24KKwkJb3M9LWxpbnV4CisJCTs7CisJcGFyaXNjLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQlvcz0tbGludXgKKwkJOzsKKwlwYmQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtdHRpCisJCTs7CisJcGJiKQorCQliYXNpY19tYWNoaW5lPW02OGstdHRpCisJCTs7CisJcGM1MzIgfCBwYzUzMi0qKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXBjNTMyCisJCTs7CisJcGM5OCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCTs7CisJcGM5OC0qKQorCQliYXNpY19tYWNoaW5lPWkzODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtIHwgcDUgfCBrNSB8IGs2IHwgbmV4Z2VuIHwgdmlhYzMpCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1wYworCQk7OworCXBlbnRpdW1wcm8gfCBwNiB8IDZ4ODYgfCBhdGhsb24gfCBhdGhsb25fKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCTs7CisJcGVudGl1bWlpIHwgcGVudGl1bTIgfCBwZW50aXVtaWlpIHwgcGVudGl1bTMpCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQk7OworCXBlbnRpdW00KQorCQliYXNpY19tYWNoaW5lPWk3ODYtcGMKKwkJOzsKKwlwZW50aXVtLSogfCBwNS0qIHwgazUtKiB8IGs2LSogfCBuZXhnZW4tKiB8IHZpYWMzLSopCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW1wcm8tKiB8IHA2LSogfCA2eDg2LSogfCBhdGhsb24tKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bWlpLSogfCBwZW50aXVtMi0qIHwgcGVudGl1bWlpaS0qIHwgcGVudGl1bTMtKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bTQtKikKKwkJYmFzaWNfbWFjaGluZT1pNzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcG4pCisJCWJhc2ljX21hY2hpbmU9cG4tZ291bGQKKwkJOzsKKwlwb3dlcikJYmFzaWNfbWFjaGluZT1wb3dlci1pYm0KKwkJOzsKKwlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJCTs7CisJcHBjLSopCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwY2xlIHwgcG93ZXJwY2xpdHRsZSB8IHBwYy1sZSB8IHBvd2VycGMtbGl0dGxlKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS11bmtub3duCisJCTs7CisJcHBjbGUtKiB8IHBvd2VycGNsaXR0bGUtKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGM2NCkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtdW5rbm93bgorCQk7OworCXBwYzY0LSopIGJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjNjRsZSB8IHBvd2VycGM2NGxpdHRsZSB8IHBwYzY0LWxlIHwgcG93ZXJwYzY0LWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS11bmtub3duCisJCTs7CisJcHBjNjRsZS0qIHwgcG93ZXJwYzY0bGl0dGxlLSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwczIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1pYm0KKwkJOzsKKwlwdzMyKQorCQliYXNpY19tYWNoaW5lPWk1ODYtdW5rbm93bgorCQlvcz0tcHczMgorCQk7OworCXJkb3MpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tcmRvcworCQk7OworCXJvbTY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4aworCQlvcz0tY29mZgorCQk7OworCXJtWzQ2XTAwKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2llbWVucworCQk7OworCXJ0cGMgfCBydHBjLSopCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwlzMzkwIHwgczM5MC0qKQorCQliYXNpY19tYWNoaW5lPXMzOTAtaWJtCisJCTs7CisJczM5MHggfCBzMzkweC0qKQorCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQorCQk7OworCXNhMjkyMDApCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCXNiMSkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjEtdW5rbm93bgorCQk7OworCXNiMWVsKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMWVsLXVua25vd24KKwkJOzsKKwlzZGUpCisJCWJhc2ljX21hY2hpbmU9bWlwc2lzYTMyLXNkZQorCQlvcz0tZWxmCisJCTs7CisJc2VpKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2VpCisJCW9zPS1zZWl1eAorCQk7OworCXNlcXVlbnQpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50CisJCTs7CisJc2gpCisJCWJhc2ljX21hY2hpbmU9c2gtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJc2g1ZWwpCisJCWJhc2ljX21hY2hpbmU9c2g1bGUtdW5rbm93bgorCQk7OworCXNoNjQpCisJCWJhc2ljX21hY2hpbmU9c2g2NC11bmtub3duCisJCTs7CisJc3BhcmNsaXRlLXdycyB8IHNpbXNvLXdycykKKwkJYmFzaWNfbWFjaGluZT1zcGFyY2xpdGUtd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJc3BzNykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKKwkJb3M9LXN5c3YyCisJCTs7CisJc3B1cikKKwkJYmFzaWNfbWFjaGluZT1zcHVyLXVua25vd24KKwkJOzsKKwlzdDIwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4ay10YW5kZW0KKwkJOzsKKwlzdHJhdHVzKQorCQliYXNpY19tYWNoaW5lPWk4NjAtc3RyYXR1cworCQlvcz0tc3lzdjQKKwkJOzsKKwlzdW4yKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJOzsKKwlzdW4yb3MzKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjJvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuM29zMykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuM29zNCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNG9zMykKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjRvczQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW40c29sMikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJc3VuMyB8IHN1bjMtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQk7OworCXN1bjQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCTs7CisJc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KKwkJOzsKKwlzdjEpCisJCWJhc2ljX21hY2hpbmU9c3YxLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXN5bW1ldHJ5KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwl0M2UpCisJCWJhc2ljX21hY2hpbmU9YWxwaGFldjUtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJdDkwKQorCQliYXNpY19tYWNoaW5lPXQ5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKyAgICAgICAgIyBUaGlzIG11c3QgYmUgbWF0Y2hlZCBiZWZvcmUgdGlsZSouCisgICAgICAgIHRpbGVneCopCisJCWJhc2ljX21hY2hpbmU9dGlsZWd4LXVua25vd24KKwkJb3M9LWxpbnV4LWdudQorCQk7OworCXRpbGUqKQorCQliYXNpY19tYWNoaW5lPXRpbGUtdW5rbm93bgorCQlvcz0tbGludXgtZ251CisJCTs7CisJdHgzOSkKKwkJYmFzaWNfbWFjaGluZT1taXBzdHgzOS11bmtub3duCisJCTs7CisJdHgzOWVsKQorCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5ZWwtdW5rbm93bgorCQk7OworCXRvYWQxKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLXhrbAorCQlvcz0tdG9wczIwCisJCTs7CisJdG93ZXIgfCB0b3dlci0zMikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5jcgorCQk7OworCXRwZikKKwkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KKwkJb3M9LXRwZgorCQk7OworCXVkaTI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tdWRpCisJCTs7CisJdWx0cmEzKQorCQliYXNpY19tYWNoaW5lPWEyOWstbnl1CisJCW9zPS1zeW0xCisJCTs7CisJdjgxMCB8IG5lY3Y4MTApCisJCWJhc2ljX21hY2hpbmU9djgxMC1uZWMKKwkJb3M9LW5vbmUKKwkJOzsKKwl2YXh2KQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJb3M9LXN5c3YKKwkJOzsKKwl2bXMpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQlvcz0tdm1zCisJCTs7CisJdnBwKnx2eHx2eC0qKQorCQliYXNpY19tYWNoaW5lPWYzMDEtZnVqaXRzdQorCQk7OworCXZ4d29ya3M5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl2eHdvcmtzNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl2eHdvcmtzMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdzY1KikKKwkJYmFzaWNfbWFjaGluZT13NjUtd2RjCisJCW9zPS1ub25lCisJCTs7CisJdzg5ay0qKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAorCQlvcz0tcHJvZWxmCisJCTs7CisJeGJveCkKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCW9zPS1taW5ndzMyCisJCTs7CisJeHBzIHwgeHBzMTAwKQorCQliYXNpY19tYWNoaW5lPXhwczEwMC1ob25leXdlbGwKKwkJOzsKKwl5bXApCisJCWJhc2ljX21hY2hpbmU9eW1wLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXo4ay0qLWNvZmYpCisJCWJhc2ljX21hY2hpbmU9ejhrLXVua25vd24KKwkJb3M9LXNpbQorCQk7OworCXo4MC0qLWNvZmYpCisJCWJhc2ljX21hY2hpbmU9ejgwLXVua25vd24KKwkJb3M9LXNpbQorCQk7OworCW5vbmUpCisJCWJhc2ljX21hY2hpbmU9bm9uZS1ub25lCisJCW9zPS1ub25lCisJCTs7CisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgbWFudWZhY3R1cmVyIG9mIGNlcnRhaW4gQ1BVIHR5cGVzLiAgSXQgaXMgaW4KKyMgc29tZSBjYXNlcyB0aGUgb25seSBtYW51ZmFjdHVyZXIsIGluIG90aGVycywgaXQgaXMgdGhlIG1vc3QgcG9wdWxhci4KKwl3ODlrKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAorCQk7OworCW9wNTBuKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCTs7CisJb3A2MGMpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJOzsKKwlyb21wKQorCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCisJCTs7CisJbW1peCkKKwkJYmFzaWNfbWFjaGluZT1tbWl4LWtudXRoCisJCTs7CisJcnM2MDAwKQorCQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KKwkJOzsKKwl2YXgpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQk7OworCXBkcDEwKQorCQkjIHRoZXJlIGFyZSBtYW55IGNsb25lcywgc28gREVDIGlzIG5vdCBhIHNhZmUgYmV0CisJCWJhc2ljX21hY2hpbmU9cGRwMTAtdW5rbm93bgorCQk7OworCXBkcDExKQorCQliYXNpY19tYWNoaW5lPXBkcDExLWRlYworCQk7OworCXdlMzJrKQorCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAorCQk7OworCXNoWzEyMzRdIHwgc2hbMjRdYSB8IHNoWzI0XWFlYiB8IHNoWzM0XWViIHwgc2hbMTIzNF1sZSB8IHNoWzIzXWVsZSkKKwkJYmFzaWNfbWFjaGluZT1zaC11bmtub3duCisJCTs7CisJc3BhcmMgfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliIHwgc3BhcmN2OXYpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCTs7CisJY3lkcmEpCisJCWJhc2ljX21hY2hpbmU9Y3lkcmEtY3lkcm9tZQorCQk7OworCW9yaW9uKQorCQliYXNpY19tYWNoaW5lPW9yaW9uLWhpZ2hsZXZlbAorCQk7OworCW9yaW9uMTA1KQorCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaGlnaGxldmVsCisJCTs7CisJbWFjIHwgbXB3IHwgbWFjLW1wdykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCisJCTs7CisJcG1hYyB8IHBtYWMtbXB3KQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtYXBwbGUKKwkJOzsKKwkqLXVua25vd24pCisJCSMgTWFrZSBzdXJlIHRvIG1hdGNoIGFuIGFscmVhZHktY2Fub25pY2FsaXplZCBtYWNoaW5lIG5hbWUuCisJCTs7CisJKikKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworZXNhYworCisjIEhlcmUgd2UgY2Fub25pY2FsaXplIGNlcnRhaW4gYWxpYXNlcyBmb3IgbWFudWZhY3R1cmVycy4KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkqLWRpZ2l0YWwqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2RpZ2l0YWwuKi9kZWMvJ2AKKwkJOzsKKwkqLWNvbW1vZG9yZSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvY29tbW9kb3JlLiovY2JtLydgCisJCTs7CisJKikKKwkJOzsKK2VzYWMKKworIyBEZWNvZGUgbWFudWZhY3R1cmVyLXNwZWNpZmljIGFsaWFzZXMgZm9yIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMuCisKK2lmIFsgeCIkb3MiICE9IHgiIiBdCit0aGVuCitjYXNlICRvcyBpbgorICAgICAgICAjIEZpcnN0IG1hdGNoIHNvbWUgc3lzdGVtIHR5cGUgYWxpYXNlcworICAgICAgICAjIHRoYXQgbWlnaHQgZ2V0IGNvbmZ1c2VkIHdpdGggdmFsaWQgc3lzdGVtIHR5cGVzLgorCSMgLXNvbGFyaXMqIGlzIGEgYmFzaWMgc3lzdGVtIHR5cGUsIHdpdGggdGhpcyBvbmUgZXhjZXB0aW9uLgorICAgICAgICAtYXVyb3JhdXgpCisJICAgICAgICBvcz0tYXVyb3JhdXgKKwkJOzsKKwktc29sYXJpczEgfCAtc29sYXJpczEuKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAorCQk7OworCS1zb2xhcmlzKQorCQlvcz0tc29sYXJpczIKKwkJOzsKKwktc3ZyNCopCisJCW9zPS1zeXN2NAorCQk7OworCS11bml4d2FyZSopCisJCW9zPS1zeXN2NC4ydXcKKwkJOzsKKwktZ251L2xpbnV4KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGdudS9saW51eHxsaW51eC1nbnV8J2AKKwkJOzsKKwkjIEZpcnN0IGFjY2VwdCB0aGUgYmFzaWMgc3lzdGVtIHR5cGVzLgorCSMgVGhlIHBvcnRhYmxlIHN5c3RlbXMgY29tZXMgZmlyc3QuCisJIyBFYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOIEEgKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KKwkjIC1zeXN2KiBpcyBub3QgaGVyZSBiZWNhdXNlIGl0IGNvbWVzIGxhdGVyLCBhZnRlciBzeXN2cjQuCisJLWdudSogfCAtYnNkKiB8IC1tYWNoKiB8IC1taW5peCogfCAtZ2VuaXgqIHwgLXVsdHJpeCogfCAtaXJpeCogXAorCSAgICAgIHwgLSp2bXMqIHwgLXNjbyogfCAtZXNpeCogfCAtaXNjKiB8IC1haXgqIHwgLWNuayogfCAtc3Vub3MgfCAtc3Vub3NbMzRdKlwKKwkgICAgICB8IC1ocHV4KiB8IC11bm9zKiB8IC1vc2YqIHwgLWx1bmEqIHwgLWRndXgqIHwgLWF1cm9yYXV4KiB8IC1zb2xhcmlzKiBcCisJICAgICAgfCAtc3ltKiB8IC1rb3BlbnNvbGFyaXMqIFwKKwkgICAgICB8IC1hbWlnYW9zKiB8IC1hbWlnYWRvcyogfCAtbXNkb3MqIHwgLW5ld3NvcyogfCAtdW5pY29zKiB8IC1hb2YqIFwKKwkgICAgICB8IC1hb3MqIHwgLWFyb3MqIFwKKwkgICAgICB8IC1uaW5keSogfCAtdnhzaW0qIHwgLXZ4d29ya3MqIHwgLWVibW9uKiB8IC1obXMqIHwgLW12cyogXAorCSAgICAgIHwgLWNsaXgqIHwgLXJpc2NvcyogfCAtdW5pcGx1cyogfCAtaXJpcyogfCAtcnR1KiB8IC14ZW5peCogXAorCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAta25ldGJzZCogfCAtbWlyYnNkKiB8IC1uZXRic2QqIFwKKwkgICAgICB8IC1vcGVuYnNkKiB8IC1zb2xpZGJzZCogXAorCSAgICAgIHwgLWVra29ic2QqIHwgLWtmcmVlYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIHwgLWx5bnhvcyogXAorCSAgICAgIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIHwgLW9hYmkqIFwKKwkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCisJICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCisJICAgICAgfCAtY2hvcnVzb3MqIHwgLWNob3J1c3JkYiogfCAtY2VnY2MqIFwKKwkgICAgICB8IC1jeWd3aW4qIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCisJICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC1saW51eC1hbmRyb2lkKiBcCisJICAgICAgfCAtbGludXgtbmV3bGliKiB8IC1saW51eC11Y2xpYmMqIFwKKwkgICAgICB8IC11eHB2KiB8IC1iZW9zKiB8IC1tcGVpeCogfCAtdWRrKiBcCisJICAgICAgfCAtaW50ZXJpeCogfCAtdXdpbiogfCAtbWtzKiB8IC1yaGFwc29keSogfCAtZGFyd2luKiB8IC1vcGVuZWQqIFwKKwkgICAgICB8IC1vcGVuc3RlcCogfCAtb3NraXQqIHwgLWNvbml4KiB8IC1wdzMyKiB8IC1ub25zdG9wdXgqIFwKKwkgICAgICB8IC1zdG9ybS1jaGFvcyogfCAtdG9wczEwKiB8IC10ZW5leCogfCAtdG9wczIwKiB8IC1pdHMqIFwKKwkgICAgICB8IC1vczIqIHwgLXZvcyogfCAtcGFsbW9zKiB8IC11Y2xpbnV4KiB8IC1udWNsZXVzKiBcCisJICAgICAgfCAtbW9ycGhvcyogfCAtc3VwZXJ1eCogfCAtcnRtayogfCAtcnRtay1ub3ZhKiB8IC13aW5kaXNzKiBcCisJICAgICAgfCAtcG93ZXJtYXgqIHwgLWRuaXgqIHwgLW54NiB8IC1ueDcgfCAtc2VpKiB8IC1kcmFnb25mbHkqIFwKKwkgICAgICB8IC1za3lvcyogfCAtaGFpa3UqIHwgLXJkb3MqIHwgLXRvcHBlcnMqIHwgLWRyb3BzKiB8IC1lcyopCisJIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgorCQk7OworCS1xbngqKQorCQljYXNlICRiYXNpY19tYWNoaW5lIGluCisJCSAgICB4ODYtKiB8IGkqODYtKikKKwkJCTs7CisJCSAgICAqKQorCQkJb3M9LW50byRvcworCQkJOzsKKwkJZXNhYworCQk7OworCS1udG8tcW54KikKKwkJOzsKKwktbnRvKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG50b3xudG8tcW54fCdgCisJCTs7CisJLXNpbSB8IC1lczE4MDAqIHwgLWhtcyogfCAteHJheSB8IC1vczY4ayogfCAtbm9uZSogfCAtdjg4ciogXAorCSAgICAgIHwgLXdpbmRvd3MqIHwgLW9zeCB8IC1hYnVnIHwgLW5ldHdhcmUqIHwgLW9zOSogfCAtYmVvcyogfCAtaGFpa3UqIFwKKwkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW1peHdhcmUqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQorCQk7OworCS1tYWMqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCisJCTs7CisJLWxpbnV4LWRpZXRsaWJjKQorCQlvcz0tbGludXgtZGlldGxpYmMKKwkJOzsKKwktbGludXgqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bGludXh8bGludXgtZ251fCdgCisJCTs7CisJLXN1bm9zNSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczV8c29sYXJpczJ8J2AKKwkJOzsKKwktc3Vub3M2KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNnxzb2xhcmlzM3wnYAorCQk7OworCS1vcGVuZWQqKQorCQlvcz0tb3BlbmVkaXRpb24KKwkJOzsKKyAgICAgICAgLW9zNDAwKikKKwkJb3M9LW9zNDAwCisJCTs7CisJLXdpbmNlKikKKwkJb3M9LXdpbmNlCisJCTs7CisJLW9zZnJvc2UqKQorCQlvcz0tb3Nmcm9zZQorCQk7OworCS1vc2YqKQorCQlvcz0tb3NmCisJCTs7CisJLXV0ZWsqKQorCQlvcz0tYnNkCisJCTs7CisJLWR5bml4KikKKwkJb3M9LWJzZAorCQk7OworCS1hY2lzKikKKwkJb3M9LWFvcworCQk7OworCS1hdGhlb3MqKQorCQlvcz0tYXRoZW9zCisJCTs7CisJLXN5bGxhYmxlKikKKwkJb3M9LXN5bGxhYmxlCisJCTs7CisJLTM4NmJzZCkKKwkJb3M9LWJzZAorCQk7OworCS1jdGl4KiB8IC11dHMqKQorCQlvcz0tc3lzdgorCQk7OworCS1ub3ZhKikKKwkJb3M9LXJ0bWstbm92YQorCQk7OworCS1uczIgKQorCQlvcz0tbmV4dHN0ZXAyCisJCTs7CisJLW5zayopCisJCW9zPS1uc2sKKwkJOzsKKwkjIFByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBzaW5peDUuCisJLXNpbml4NS4qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c2luaXh8c3lzdnwnYAorCQk7OworCS1zaW5peCopCisJCW9zPS1zeXN2NAorCQk7OworICAgICAgICAtdHBmKikKKwkJb3M9LXRwZgorCQk7OworCS10cml0b24qKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktb3NzKikKKwkJb3M9LXN5c3YzCisJCTs7CisJLXN2cjQpCisJCW9zPS1zeXN2NAorCQk7OworCS1zdnIzKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktc3lzdnI0KQorCQlvcz0tc3lzdjQKKwkJOzsKKwkjIFRoaXMgbXVzdCBjb21lIGFmdGVyIC1zeXN2cjQuCisJLXN5c3YqKQorCQk7OworCS1vc2UqKQorCQlvcz0tb3NlCisJCTs7CisJLWVzMTgwMCopCisJCW9zPS1vc2UKKwkJOzsKKwkteGVuaXgpCisJCW9zPS14ZW5peAorCQk7OworCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCisJCW9zPS1taW50CisJCTs7CisJLWFyb3MqKQorCQlvcz0tYXJvcworCQk7OworCS1rYW9zKikKKwkJb3M9LWthb3MKKwkJOzsKKwktenZtb2UpCisJCW9zPS16dm1vZQorCQk7OworCS1kaWNvcyopCisJCW9zPS1kaWNvcworCQk7OworICAgICAgICAtbmFjbCopCisJICAgICAgICA7OworCS1ub25lKQorCQk7OworCSopCisJCSMgR2V0IHJpZCBvZiB0aGUgYC0nIGF0IHRoZSBiZWdpbm5pbmcgb2YgJG9zLgorCQlvcz1gZWNobyAkb3MgfCBzZWQgJ3MvW14tXSotLy8nYAorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IHN5c3RlbSBcYCRvc1wnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCitlbHNlCisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBtYWNoaW5lcy4KKyMgVGhlIHZhbHVlIHNob3VsZCBiZSB3aGF0IHRoZSB2ZW5kb3IgY3VycmVudGx5IHNoaXBzIG91dCB0aGUgZG9vciB3aXRoIHRoZWlyCisjIG1hY2hpbmUgb3IgcHV0IGFub3RoZXIgd2F5LCB0aGUgbW9zdCBwb3B1bGFyIG9zIHByb3ZpZGVkIHdpdGggdGhlIG1hY2hpbmUuCisKKyMgTm90ZSB0aGF0IGlmIHlvdSdyZSBnb2luZyB0byB0cnkgdG8gbWF0Y2ggIi1NQU5VRkFDVFVSRVIiIGhlcmUgKHNheSwKKyMgIi1zdW4iKSwgdGhlbiB5b3UgaGF2ZSB0byB0ZWxsIHRoZSBjYXNlIHN0YXRlbWVudCB1cCB0b3dhcmRzIHRoZSB0b3AKKyMgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nIHN5c3RlbS4gIE90aGVyd2lzZSwgY29kZSBhYm92ZQorIyB3aWxsIHNpZ25hbCBhbiBlcnJvciBzYXlpbmcgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nCisjIHN5c3RlbSwgYW5kIHdlJ2xsIG5ldmVyIGdldCB0byB0aGlzIHBvaW50LgorCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisgICAgICAgIHNjb3JlLSopCisJCW9zPS1lbGYKKwkJOzsKKyAgICAgICAgc3B1LSopCisJCW9zPS1lbGYKKwkJOzsKKwkqLWFjb3JuKQorCQlvcz0tcmlzY2l4MS4yCisJCTs7CisJYXJtKi1yZWJlbCkKKwkJb3M9LWxpbnV4CisJCTs7CisJYXJtKi1zZW1pKQorCQlvcz0tYW91dAorCQk7OworICAgICAgICBjNHgtKiB8IHRpYzR4LSopCisgICAgICAgIAlvcz0tY29mZgorCQk7OworCXRpYzU0eC0qKQorCQlvcz0tY29mZgorCQk7OworCXRpYzU1eC0qKQorCQlvcz0tY29mZgorCQk7OworCXRpYzZ4LSopCisJCW9zPS1jb2ZmCisJCTs7CisJIyBUaGlzIG11c3QgY29tZSBiZWZvcmUgdGhlICotZGVjIGVudHJ5LgorCXBkcDEwLSopCisJCW9zPS10b3BzMjAKKwkJOzsKKwlwZHAxMS0qKQorCQlvcz0tbm9uZQorCQk7OworCSotZGVjIHwgdmF4LSopCisJCW9zPS11bHRyaXg0LjIKKwkJOzsKKwltNjgqLWFwb2xsbykKKwkJb3M9LWRvbWFpbgorCQk7OworCWkzODYtc3VuKQorCQlvcz0tc3Vub3M0LjAuMgorCQk7OworCW02ODAwMC1zdW4pCisJCW9zPS1zdW5vczMKKwkJIyBUaGlzIGFsc28gZXhpc3RzIGluIHRoZSBjb25maWd1cmUgcHJvZ3JhbSwgYnV0IHdhcyBub3QgdGhlCisJCSMgZGVmYXVsdC4KKwkJIyBvcz0tc3Vub3M0CisJCTs7CisJbTY4Ki1jaXNjbykKKwkJb3M9LWFvdXQKKwkJOzsKKyAgICAgICAgbWVwLSopCisJCW9zPS1lbGYKKwkJOzsKKwltaXBzKi1jaXNjbykKKwkJb3M9LWVsZgorCQk7OworCW1pcHMqLSopCisJCW9zPS1lbGYKKwkJOzsKKwlvcjMyLSopCisJCW9zPS1jb2ZmCisJCTs7CisJKi10dGkpCSMgbXVzdCBiZSBiZWZvcmUgc3BhcmMgZW50cnkgb3Igd2UgZ2V0IHRoZSB3cm9uZyBvcy4KKwkJb3M9LXN5c3YzCisJCTs7CisJc3BhcmMtKiB8ICotc3VuKQorCQlvcz0tc3Vub3M0LjEuMQorCQk7OworCSotYmUpCisJCW9zPS1iZW9zCisJCTs7CisJKi1oYWlrdSkKKwkJb3M9LWhhaWt1CisJCTs7CisJKi1pYm0pCisJCW9zPS1haXgKKwkJOzsKKyAgICAJKi1rbnV0aCkKKwkJb3M9LW1taXh3YXJlCisJCTs7CisJKi13ZWMpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLXdpbmJvbmQpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLW9raSkKKwkJb3M9LXByb2VsZgorCQk7OworCSotaHApCisJCW9zPS1ocHV4CisJCTs7CisJKi1oaXRhY2hpKQorCQlvcz0taGl1eAorCQk7OworCWk4NjAtKiB8ICotYXR0IHwgKi1uY3IgfCAqLWFsdG9zIHwgKi1tb3Rvcm9sYSB8ICotY29udmVyZ2VudCkKKwkJb3M9LXN5c3YKKwkJOzsKKwkqLWNibSkKKwkJb3M9LWFtaWdhb3MKKwkJOzsKKwkqLWRnKQorCQlvcz0tZGd1eAorCQk7OworCSotZG9scGhpbikKKwkJb3M9LXN5c3YzCisJCTs7CisJbTY4ay1jY3VyKQorCQlvcz0tcnR1CisJCTs7CisJbTg4ay1vbXJvbiopCisJCW9zPS1sdW5hCisJCTs7CisJKi1uZXh0ICkKKwkJb3M9LW5leHRzdGVwCisJCTs7CisJKi1zZXF1ZW50KQorCQlvcz0tcHR4CisJCTs7CisJKi1jcmRzKQorCQlvcz0tdW5vcworCQk7OworCSotbnMpCisJCW9zPS1nZW5peAorCQk7OworCWkzNzAtKikKKwkJb3M9LW12cworCQk7OworCSotbmV4dCkKKwkJb3M9LW5leHRzdGVwMworCQk7OworCSotZ291bGQpCisJCW9zPS1zeXN2CisJCTs7CisJKi1oaWdobGV2ZWwpCisJCW9zPS1ic2QKKwkJOzsKKwkqLWVuY29yZSkKKwkJb3M9LWJzZAorCQk7OworCSotc2dpKQorCQlvcz0taXJpeAorCQk7OworCSotc2llbWVucykKKwkJb3M9LXN5c3Y0CisJCTs7CisJKi1tYXNzY29tcCkKKwkJb3M9LXJ0dQorCQk7OworCWYzMFswMV0tZnVqaXRzdSB8IGY3MDAtZnVqaXRzdSkKKwkJb3M9LXV4cHYKKwkJOzsKKwkqLXJvbTY4aykKKwkJb3M9LWNvZmYKKwkJOzsKKwkqLSpidWcpCisJCW9zPS1jb2ZmCisJCTs7CisJKi1hcHBsZSkKKwkJb3M9LW1hY29zCisJCTs7CisJKi1hdGFyaSopCisJCW9zPS1taW50CisJCTs7CisJKikKKwkJb3M9LW5vbmUKKwkJOzsKK2VzYWMKK2ZpCisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2Uga25vdyB0aGUgb3MsIGFuZCB0aGUgQ1BVIHR5cGUsIGJ1dCBub3QgdGhlCisjIG1hbnVmYWN0dXJlci4gIFdlIHBpY2sgdGhlIGxvZ2ljYWwgbWFudWZhY3R1cmVyLgordmVuZG9yPXVua25vd24KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkqLXVua25vd24pCisJCWNhc2UgJG9zIGluCisJCQktcmlzY2l4KikKKwkJCQl2ZW5kb3I9YWNvcm4KKwkJCQk7OworCQkJLXN1bm9zKikKKwkJCQl2ZW5kb3I9c3VuCisJCQkJOzsKKwkJCS1jbmsqfC1haXgqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLWJlb3MqKQorCQkJCXZlbmRvcj1iZQorCQkJCTs7CisJCQktaHB1eCopCisJCQkJdmVuZG9yPWhwCisJCQkJOzsKKwkJCS1tcGVpeCopCisJCQkJdmVuZG9yPWhwCisJCQkJOzsKKwkJCS1oaXV4KikKKwkJCQl2ZW5kb3I9aGl0YWNoaQorCQkJCTs7CisJCQktdW5vcyopCisJCQkJdmVuZG9yPWNyZHMKKwkJCQk7OworCQkJLWRndXgqKQorCQkJCXZlbmRvcj1kZworCQkJCTs7CisJCQktbHVuYSopCisJCQkJdmVuZG9yPW9tcm9uCisJCQkJOzsKKwkJCS1nZW5peCopCisJCQkJdmVuZG9yPW5zCisJCQkJOzsKKwkJCS1tdnMqIHwgLW9wZW5lZCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktb3M0MDAqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLXB0eCopCisJCQkJdmVuZG9yPXNlcXVlbnQKKwkJCQk7OworCQkJLXRwZiopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktdnhzaW0qIHwgLXZ4d29ya3MqIHwgLXdpbmRpc3MqKQorCQkJCXZlbmRvcj13cnMKKwkJCQk7OworCQkJLWF1eCopCisJCQkJdmVuZG9yPWFwcGxlCisJCQkJOzsKKwkJCS1obXMqKQorCQkJCXZlbmRvcj1oaXRhY2hpCisJCQkJOzsKKwkJCS1tcHcqIHwgLW1hY29zKikKKwkJCQl2ZW5kb3I9YXBwbGUKKwkJCQk7OworCQkJLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKKwkJCQl2ZW5kb3I9YXRhcmkKKwkJCQk7OworCQkJLXZvcyopCisJCQkJdmVuZG9yPXN0cmF0dXMKKwkJCQk7OworCQllc2FjCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgInMvdW5rbm93bi8kdmVuZG9yLyJgCisJCTs7Citlc2FjCisKK2VjaG8gJGJhc2ljX21hY2hpbmUkb3MKK2V4aXQKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCisjIHRpbWUtc3RhbXAtZW5kOiAiJyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jb25maWd1cmUgYi9vcGVuc3NoLTYuMHAxL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMzViNmYwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9jb25maWd1cmUKQEAgLTAsMCArMSwxNzk4MiBAQAorIyEgL2Jpbi9zaAorIyBGcm9tIGNvbmZpZ3VyZS5hYyBSZXZpc2lvbjogMS40ODkgLgorIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjggZm9yIE9wZW5TU0ggUG9ydGFibGUuCisjCisjIFJlcG9ydCBidWdzIHRvIDxvcGVuc3NoLXVuaXgtZGV2QG1pbmRyb3Qub3JnPi4KKyMKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLAorIyAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLgorIworIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKyMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQorRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4gIygKKyAgKnBvc2l4KikgOgorICAgIHNldCAtbyBwb3NpeCA7OyAjKAorICAqKSA6CisgICAgIDs7Citlc2FjCitmaQorCisKK2FzX25sPScKKycKK2V4cG9ydCBhc19ubAorIyBQcmludGluZyBhIGxvbmcgc3RyaW5nIGNyYXNoZXMgU29sYXJpcyA3IC91c3IvYmluL3ByaW50Zi4KK2FzX2VjaG89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCithc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KK2FzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCisjIFByZWZlciBhIGtzaCBzaGVsbCBidWlsdGluIG92ZXIgYW4gZXh0ZXJuYWwgcHJpbnRmIHByb2dyYW0gb24gU29sYXJpcywKKyMgYnV0IHdpdGhvdXQgd2FzdGluZyBmb3JrcyBmb3IgYmFzaCBvciB6c2guCitpZiB0ZXN0IC16ICIkQkFTSF9WRVJTSU9OJFpTSF9WRVJTSU9OIiBcCisgICAgJiYgKHRlc3QgIlhgcHJpbnQgLXIgLS0gJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19lY2hvPSdwcmludCAtciAtLScKKyAgYXNfZWNob19uPSdwcmludCAtcm4gLS0nCitlbGlmICh0ZXN0ICJYYHByaW50ZiAlcyAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2VjaG89J3ByaW50ZiAlc1xuJworICBhc19lY2hvX249J3ByaW50ZiAlcycKK2Vsc2UKKyAgaWYgdGVzdCAiWGAoL3Vzci91Y2IvZWNobyAtbiAtbiAkYXNfZWNobykgMj4vZGV2L251bGxgIiA9ICJYLW4gJGFzX2VjaG8iOyB0aGVuCisgICAgYXNfZWNob19ib2R5PSdldmFsIC91c3IvdWNiL2VjaG8gLW4gIiQxJGFzX25sIicKKyAgICBhc19lY2hvX249Jy91c3IvdWNiL2VjaG8gLW4nCisgIGVsc2UKKyAgICBhc19lY2hvX2JvZHk9J2V2YWwgZXhwciAiWCQxIiA6ICJYXFwoLipcXCkiJworICAgIGFzX2VjaG9fbl9ib2R5PSdldmFsCisgICAgICBhcmc9JDE7CisgICAgICBjYXNlICRhcmcgaW4gIygKKyAgICAgICoiJGFzX25sIiopCisJZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSRhc19ubCI7CisJYXJnPWBleHByICJYJGFyZyIgOiAiLiokYXNfbmxcXCguKlxcKSJgOzsKKyAgICAgIGVzYWM7CisgICAgICBleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpIiB8IHRyIC1kICIkYXNfbmwiCisgICAgJworICAgIGV4cG9ydCBhc19lY2hvX25fYm9keQorICAgIGFzX2VjaG9fbj0nc2ggLWMgJGFzX2VjaG9fbl9ib2R5IGFzX2VjaG8nCisgIGZpCisgIGV4cG9ydCBhc19lY2hvX2JvZHkKKyAgYXNfZWNobz0nc2ggLWMgJGFzX2VjaG9fYm9keSBhc19lY2hvJworZmkKKworIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCitpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgorICBQQVRIX1NFUEFSQVRPUj06CisgIChQQVRIPScvYmluOy9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxICYmIHsKKyAgICAoUEFUSD0nL2JpbjovYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSB8fAorICAgICAgUEFUSF9TRVBBUkFUT1I9JzsnCisgIH0KK2ZpCisKKworIyBJRlMKKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCisjIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KKyMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAorIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQorSUZTPSIgIiIJJGFzX25sIgorCisjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorYXNfbXlzZWxmPQorY2FzZSAkMCBpbiAjKCgKKyAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OworICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgICAgIDs7Citlc2FjCisjIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCisjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KK2lmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KKyAgYXNfbXlzZWxmPSQwCitmaQoraWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgorICAkYXNfZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgorICBleGl0IDEKK2ZpCisKKyMgVW5zZXQgdmFyaWFibGVzIHRoYXQgd2UgZG8gbm90IG5lZWQgYW5kIHdoaWNoIGNhdXNlIGJ1Z3MgKGUuZy4gaW4KKyMgcHJlLTMuMCBVV0lOIGtzaCkuICBCdXQgZG8gbm90IGNhdXNlIGJ1Z3MgaW4gYmFzaCAyLjAxOyB0aGUgInx8IGV4aXQgMSIKKyMgc3VwcHJlc3NlcyBhbnkgIlNlZ21lbnRhdGlvbiBmYXVsdCIgbWVzc2FnZSB0aGVyZS4gICcoKCcgY291bGQKKyMgdHJpZ2dlciBhIGJ1ZyBpbiBwZGtzaCA1LjIuMTQuCitmb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOViBNQUlMIE1BSUxQQVRICitkbyBldmFsIHRlc3QgeFwkeyRhc192YXIrc2V0fSA9IHhzZXQgXAorICAmJiAoICh1bnNldCAkYXNfdmFyKSB8fCBleGl0IDEpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCAkYXNfdmFyIHx8IDoKK2RvbmUKK1BTMT0nJCAnCitQUzI9Jz4gJworUFM0PScrICcKKworIyBOTFMgbnVpc2FuY2VzLgorTENfQUxMPUMKK2V4cG9ydCBMQ19BTEwKK0xBTkdVQUdFPUMKK2V4cG9ydCBMQU5HVUFHRQorCisjIENEUEFUSC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworaWYgdGVzdCAieCRDT05GSUdfU0hFTEwiID0geDsgdGhlbgorICBhc19ib3VybmVfY29tcGF0aWJsZT0iaWYgdGVzdCAtbiBcIlwke1pTSF9WRVJTSU9OK3NldH1cIiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiBcJHsxK1wiXCRAXCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnXCR7MStcIlwkQFwifSc9J1wiXCRAXCInCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitlbHNlCisgIGNhc2UgXGAoc2V0IC1vKSAyPi9kZXYvbnVsbFxgIGluICMoCisgICpwb3NpeCopIDoKKyAgICBzZXQgLW8gcG9zaXggOzsgIygKKyAgKikgOgorICAgICA7OworZXNhYworZmkKKyIKKyAgYXNfcmVxdWlyZWQ9ImFzX2ZuX3JldHVybiAoKSB7IChleGl0IFwkMSk7IH0KK2FzX2ZuX3N1Y2Nlc3MgKCkgeyBhc19mbl9yZXR1cm4gMDsgfQorYXNfZm5fZmFpbHVyZSAoKSB7IGFzX2ZuX3JldHVybiAxOyB9Cithc19mbl9yZXRfc3VjY2VzcyAoKSB7IHJldHVybiAwOyB9Cithc19mbl9yZXRfZmFpbHVyZSAoKSB7IHJldHVybiAxOyB9CisKK2V4aXRjb2RlPTAKK2FzX2ZuX3N1Y2Nlc3MgfHwgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3N1Y2Nlc3MgZmFpbGVkLjsgfQorYXNfZm5fZmFpbHVyZSAmJiB7IGV4aXRjb2RlPTE7IGVjaG8gYXNfZm5fZmFpbHVyZSBzdWNjZWVkZWQuOyB9Cithc19mbl9yZXRfc3VjY2VzcyB8fCB7IGV4aXRjb2RlPTE7IGVjaG8gYXNfZm5fcmV0X3N1Y2Nlc3MgZmFpbGVkLjsgfQorYXNfZm5fcmV0X2ZhaWx1cmUgJiYgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC47IH0KK2lmICggc2V0IHg7IGFzX2ZuX3JldF9zdWNjZXNzIHkgJiYgdGVzdCB4ID0gXCJcJDFcIiApOyB0aGVuIDoKKworZWxzZQorICBleGl0Y29kZT0xOyBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KK2ZpCit0ZXN0IHhcJGV4aXRjb2RlID0geDAgfHwgZXhpdCAxIgorICBhc19zdWdnZXN0ZWQ9IiAgYXNfbGluZW5vXzE9Ijthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCRMSU5FTk87YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQiIGFzX2xpbmVub18xYT1cJExJTkVOTworICBhc19saW5lbm9fMj0iO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkJExJTkVOTzthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCIgYXNfbGluZW5vXzJhPVwkTElORU5PCisgIGV2YWwgJ3Rlc3QgXCJ4XCRhc19saW5lbm9fMSdcJGFzX3J1bidcIiAhPSBcInhcJGFzX2xpbmVub18yJ1wkYXNfcnVuJ1wiICYmCisgIHRlc3QgXCJ4XGBleHByIFwkYXNfbGluZW5vXzEnXCRhc19ydW4nICsgMVxgXCIgPSBcInhcJGFzX2xpbmVub18yJ1wkYXNfcnVuJ1wiJyB8fCBleGl0IDEKK3Rlc3QgXCQoKCAxICsgMSApKSA9IDIgfHwgZXhpdCAxIgorICBpZiAoZXZhbCAiJGFzX3JlcXVpcmVkIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBhc19oYXZlX3JlcXVpcmVkPXllcworZWxzZQorICBhc19oYXZlX3JlcXVpcmVkPW5vCitmaQorICBpZiB0ZXN0IHgkYXNfaGF2ZV9yZXF1aXJlZCA9IHh5ZXMgJiYgKGV2YWwgIiRhc19zdWdnZXN0ZWQiKSAyPi9kZXYvbnVsbDsgdGhlbiA6CisKK2Vsc2UKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorYXNfZm91bmQ9ZmFsc2UKK2ZvciBhc19kaXIgaW4gL2JpbiRQQVRIX1NFUEFSQVRPUi91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgYXNfZm91bmQ9OgorICBjYXNlICRhc19kaXIgaW4gIygKKwkgLyopCisJICAgZm9yIGFzX2Jhc2UgaW4gc2ggYmFzaCBrc2ggc2g1OyBkbworCSAgICAgIyBUcnkgb25seSBzaGVsbHMgdGhhdCBleGlzdCwgdG8gc2F2ZSBzZXZlcmFsIGZvcmtzLgorCSAgICAgYXNfc2hlbGw9JGFzX2Rpci8kYXNfYmFzZQorCSAgICAgaWYgeyB0ZXN0IC1mICIkYXNfc2hlbGwiIHx8IHRlc3QgLWYgIiRhc19zaGVsbC5leGUiOyB9ICYmCisJCSAgICB7ICRhc19lY2hvICIkYXNfYm91cm5lX2NvbXBhdGlibGUiIiRhc19yZXF1aXJlZCIgfCBhc19ydW49YSAiJGFzX3NoZWxsIjsgfSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIENPTkZJR19TSEVMTD0kYXNfc2hlbGwgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKKwkJICAgaWYgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfc3VnZ2VzdGVkIiB8IGFzX3J1bj1hICIkYXNfc2hlbGwiOyB9IDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgYnJlYWsgMgorZmkKK2ZpCisJICAgZG9uZTs7CisgICAgICAgZXNhYworICBhc19mb3VuZD1mYWxzZQorZG9uZQorJGFzX2ZvdW5kIHx8IHsgaWYgeyB0ZXN0IC1mICIkU0hFTEwiIHx8IHRlc3QgLWYgIiRTSEVMTC5leGUiOyB9ICYmCisJICAgICAgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfcmVxdWlyZWQiIHwgYXNfcnVuPWEgIiRTSEVMTCI7IH0gMj4vZGV2L251bGw7IHRoZW4gOgorICBDT05GSUdfU0hFTEw9JFNIRUxMIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCitmaTsgfQorSUZTPSRhc19zYXZlX0lGUworCisKKyAgICAgIGlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4OyB0aGVuIDoKKyAgIyBXZSBjYW5ub3QgeWV0IGFzc3VtZSBhIGRlY2VudCBzaGVsbCwgc28gd2UgaGF2ZSB0byBwcm92aWRlIGEKKwkjIG5ldXRyYWxpemF0aW9uIHZhbHVlIGZvciBzaGVsbHMgd2l0aG91dCB1bnNldDsgYW5kIHRoaXMgYWxzbworCSMgd29ya3MgYXJvdW5kIHNoZWxscyB0aGF0IGNhbm5vdCB1bnNldCBub25leGlzdGVudCB2YXJpYWJsZXMuCisJIyBQcmVzZXJ2ZSAtdiBhbmQgLXggdG8gdGhlIHJlcGxhY2VtZW50IHNoZWxsLgorCUJBU0hfRU5WPS9kZXYvbnVsbAorCUVOVj0vZGV2L251bGwKKwkodW5zZXQgQkFTSF9FTlYpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBCQVNIX0VOViBFTlYKKwlleHBvcnQgQ09ORklHX1NIRUxMCisJY2FzZSAkLSBpbiAjICgoKCgKKwkgICp2KngqIHwgKngqdiogKSBhc19vcHRzPS12eCA7OworCSAgKnYqICkgYXNfb3B0cz0tdiA7OworCSAgKngqICkgYXNfb3B0cz0teCA7OworCSAgKiApIGFzX29wdHM9IDs7CisJZXNhYworCWV4ZWMgIiRDT05GSUdfU0hFTEwiICRhc19vcHRzICIkYXNfbXlzZWxmIiAkezErIiRAIn0KK2ZpCisKKyAgICBpZiB0ZXN0IHgkYXNfaGF2ZV9yZXF1aXJlZCA9IHhubzsgdGhlbiA6CisgICRhc19lY2hvICIkMDogVGhpcyBzY3JpcHQgcmVxdWlyZXMgYSBzaGVsbCBtb3JlIG1vZGVybiB0aGFuIGFsbCIKKyAgJGFzX2VjaG8gIiQwOiB0aGUgc2hlbGxzIHRoYXQgSSBmb3VuZCBvbiB5b3VyIHN5c3RlbS4iCisgIGlmIHRlc3QgeCR7WlNIX1ZFUlNJT04rc2V0fSA9IHhzZXQgOyB0aGVuCisgICAgJGFzX2VjaG8gIiQwOiBJbiBwYXJ0aWN1bGFyLCB6c2ggJFpTSF9WRVJTSU9OIGhhcyBidWdzIGFuZCBzaG91bGQiCisgICAgJGFzX2VjaG8gIiQwOiBiZSB1cGdyYWRlZCB0byB6c2ggNC4zLjQgb3IgbGF0ZXIuIgorICBlbHNlCisgICAgJGFzX2VjaG8gIiQwOiBQbGVhc2UgdGVsbCBidWctYXV0b2NvbmZAZ251Lm9yZyBhbmQKKyQwOiBvcGVuc3NoLXVuaXgtZGV2QG1pbmRyb3Qub3JnIGFib3V0IHlvdXIgc3lzdGVtLAorJDA6IGluY2x1ZGluZyBhbnkgZXJyb3IgcG9zc2libHkgb3V0cHV0IGJlZm9yZSB0aGlzCiskMDogbWVzc2FnZS4gVGhlbiBpbnN0YWxsIGEgbW9kZXJuIHNoZWxsLCBvciBtYW51YWxseSBydW4KKyQwOiB0aGUgc2NyaXB0IHVuZGVyIHN1Y2ggYSBzaGVsbCBpZiB5b3UgZG8gaGF2ZSBvbmUuIgorICBmaQorICBleGl0IDEKK2ZpCitmaQorZmkKK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CitleHBvcnQgU0hFTEwKKyMgVW5zZXQgbW9yZSB2YXJpYWJsZXMga25vd24gdG8gaW50ZXJmZXJlIHdpdGggYmVoYXZpb3Igb2YgY29tbW9uIHRvb2xzLgorQ0xJQ09MT1JfRk9SQ0U9IEdSRVBfT1BUSU9OUz0KK3Vuc2V0IENMSUNPTE9SX0ZPUkNFIEdSRVBfT1BUSU9OUworCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggU2hlbGwgRnVuY3Rpb25zLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIGFzX2ZuX3Vuc2V0IFZBUgorIyAtLS0tLS0tLS0tLS0tLS0KKyMgUG9ydGFibHkgdW5zZXQgVkFSLgorYXNfZm5fdW5zZXQgKCkKK3sKKyAgeyBldmFsICQxPTsgdW5zZXQgJDE7fQorfQorYXNfdW5zZXQ9YXNfZm5fdW5zZXQKKworIyBhc19mbl9zZXRfc3RhdHVzIFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgJD8gdG8gU1RBVFVTLCB3aXRob3V0IGZvcmtpbmcuCithc19mbl9zZXRfc3RhdHVzICgpCit7CisgIHJldHVybiAkMQorfSAjIGFzX2ZuX3NldF9zdGF0dXMKKworIyBhc19mbl9leGl0IFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBFeGl0IHRoZSBzaGVsbCB3aXRoIFNUQVRVUywgZXZlbiBpbiBhICJ0cmFwIDAiIG9yICJzZXQgLWUiIGNvbnRleHQuCithc19mbl9leGl0ICgpCit7CisgIHNldCArZQorICBhc19mbl9zZXRfc3RhdHVzICQxCisgIGV4aXQgJDEKK30gIyBhc19mbl9leGl0CisKKyMgYXNfZm5fbWtkaXJfcAorIyAtLS0tLS0tLS0tLS0tCisjIENyZWF0ZSAiJGFzX2RpciIgYXMgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBwYXJlbnRzIGlmIG5lY2Vzc2FyeS4KK2FzX2ZuX21rZGlyX3AgKCkKK3sKKworICBjYXNlICRhc19kaXIgaW4gIygKKyAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OworICBlc2FjCisgIHRlc3QgLWQgIiRhc19kaXIiIHx8IGV2YWwgJGFzX21rZGlyX3AgfHwgeworICAgIGFzX2RpcnM9CisgICAgd2hpbGUgOjsgZG8KKyAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAorICAgICAgKlwnKikgYXNfcWRpcj1gJGFzX2VjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIycoCisgICAgICAqKSBhc19xZGlyPSRhc19kaXI7OworICAgICAgZXNhYworICAgICAgYXNfZGlycz0iJyRhc19xZGlyJyAkYXNfZGlycyIKKyAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8CiskYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYXNfZGlyIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgICAgIHRlc3QgLWQgIiRhc19kaXIiICYmIGJyZWFrCisgICAgZG9uZQorICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKKyAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCBhc19mbl9lcnJvciAkPyAiY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIKKworCit9ICMgYXNfZm5fbWtkaXJfcAorIyBhc19mbl9hcHBlbmQgVkFSIFZBTFVFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXBwZW5kIHRoZSB0ZXh0IGluIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24gY29udGFpbmVkIGluIFZBUi4gVGFrZQorIyBhZHZhbnRhZ2Ugb2YgYW55IHNoZWxsIG9wdGltaXphdGlvbnMgdGhhdCBhbGxvdyBhbW9ydGl6ZWQgbGluZWFyIGdyb3d0aCBvdmVyCisjIHJlcGVhdGVkIGFwcGVuZHMsIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgcXVhZHJhdGljIGdyb3d0aCBwcmVzZW50IGluIG5haXZlCisjIGltcGxlbWVudGF0aW9ucy4KK2lmIChldmFsICJhc192YXI9MTsgYXNfdmFyKz0yOyB0ZXN0IHhcJGFzX3ZhciA9IHgxMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxKz1cJDIKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxPVwkJDFcJDIKKyAgfQorZmkgIyBhc19mbl9hcHBlbmQKKworIyBhc19mbl9hcml0aCBBUkcuLi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBlcmZvcm0gYXJpdGhtZXRpYyBldmFsdWF0aW9uIG9uIHRoZSBBUkdzLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiB0aGUKKyMgZ2xvYmFsICRhc192YWwuIFRha2UgYWR2YW50YWdlIG9mIHNoZWxscyB0aGF0IGNhbiBhdm9pZCBmb3Jrcy4gVGhlIGFyZ3VtZW50cworIyBtdXN0IGJlIHBvcnRhYmxlIGFjcm9zcyAkKCgpKSBhbmQgZXhwci4KK2lmIChldmFsICJ0ZXN0IFwkKCggMSArIDEgKSkgPSAyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPSQoKCAkKiApKQorICB9JworZWxzZQorICBhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPWBleHByICIkQCIgfHwgdGVzdCAkPyAtZXEgMWAKKyAgfQorZmkgIyBhc19mbl9hcml0aAorCisKKyMgYXNfZm5fZXJyb3IgU1RBVFVTIEVSUk9SIFtMSU5FTk8gTE9HX0ZEXQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE91dHB1dCAiYGJhc2VuYW1lICQwYDogZXJyb3I6IEVSUk9SIiB0byBzdGRlcnIuIElmIExJTkVOTyBhbmQgTE9HX0ZEIGFyZQorIyBwcm92aWRlZCwgYWxzbyBvdXRwdXQgdGhlIGVycm9yIHRvIExPR19GRCwgcmVmZXJlbmNpbmcgTElORU5PLiBUaGVuIGV4aXQgdGhlCisjIHNjcmlwdCB3aXRoIFNUQVRVUywgdXNpbmcgMSBpZiB0aGF0IHdhcyAwLgorYXNfZm5fZXJyb3IgKCkKK3sKKyAgYXNfc3RhdHVzPSQxOyB0ZXN0ICRhc19zdGF0dXMgLWVxIDAgJiYgYXNfc3RhdHVzPTEKKyAgaWYgdGVzdCAiJDQiOyB0aGVuCisgICAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMyJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiAkMiIgPiYkNAorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogJDIiID4mMgorICBhc19mbl9leGl0ICRhc19zdGF0dXMKK30gIyBhc19mbl9lcnJvcgorCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgorICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK2lmIChiYXNlbmFtZSAtLSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAtLSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KKyAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKK2Vsc2UKKyAgYXNfYmFzZW5hbWU9ZmFsc2UKK2ZpCisKK2lmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19kaXJuYW1lPWRpcm5hbWUKK2Vsc2UKKyAgYXNfZGlybmFtZT1mYWxzZQorZmkKKworYXNfbWU9YCRhc19iYXNlbmFtZSAtLSAiJDAiIHx8CiskYXNfZXhwciBYLyIkMCIgOiAnLiovXChbXi9dW14vXSpcKS8qJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgvIiQwIiB8CisgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorCisjIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCithc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKK2FzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworYXNfY3JfTGV0dGVycz0kYXNfY3JfbGV0dGVycyRhc19jcl9MRVRURVJTCithc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCithc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKKworCisgIGFzX2xpbmVub18xPSRMSU5FTk8gYXNfbGluZW5vXzFhPSRMSU5FTk8KKyAgYXNfbGluZW5vXzI9JExJTkVOTyBhc19saW5lbm9fMmE9JExJTkVOTworICBldmFsICd0ZXN0ICJ4JGFzX2xpbmVub18xJyRhc19ydW4nIiAhPSAieCRhc19saW5lbm9fMickYXNfcnVuJyIgJiYKKyAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSckYXNfcnVuJyArIDFgIiA9ICJ4JGFzX2xpbmVub18yJyRhc19ydW4nIicgfHwgeworICAjIEJsYW1lIExlZSBFLiBNY01haG9uICgxOTMxLTE5ODkpIGZvciBzZWQncyBzeW50YXguICA6LSkKKyAgc2VkIC1uICcKKyAgICBwCisgICAgL1skXUxJTkVOTy89CisgICcgPCRhc19teXNlbGYgfAorICAgIHNlZCAnCisgICAgICBzL1skXUxJTkVOTy4qLyYtLworICAgICAgdCBsaW5lbm8KKyAgICAgIGIKKyAgICAgIDpsaW5lbm8KKyAgICAgIE4KKyAgICAgIDpsb29wCisgICAgICBzL1skXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dLipcblwpXCguKlwpL1wyXDFcMi8KKyAgICAgIHQgbG9vcAorICAgICAgcy8tXG4uKi8vCisgICAgJyA+JGFzX21lLmxpbmVubyAmJgorICBjaG1vZCAreCAiJGFzX21lLmxpbmVubyIgfHwKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyOyBhc19mbl9leGl0IDE7IH0KKworICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcworICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKKyAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KKyAgLiAiLi8kYXNfbWUubGluZW5vIgorICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KKyAgZXhpdAorfQorCitFQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQorY2FzZSBgZWNobyAtbiB4YCBpbiAjKCgoKCgKKy1uKikKKyAgY2FzZSBgZWNobyAneHlcYydgIGluCisgICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgorICB4eSkgIEVDSE9fQz0nXGMnOzsKKyAgKikgICBlY2hvIGBlY2hvIGtzaDg4IGJ1ZyBvbiBBSVggNi4xYCA+IC9kZXYvbnVsbAorICAgICAgIEVDSE9fVD0nCSc7OworICBlc2FjOzsKKyopCisgIEVDSE9fTj0nLW4nOzsKK2VzYWMKKworcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKK2lmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgorICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCitlbHNlCisgIHJtIC1mIGNvbmYkJC5kaXIKKyAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorZmkKK2lmIChlY2hvID5jb25mJCQuZmlsZSkgMj4vZGV2L251bGw7IHRoZW4KKyAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz0nbG4gLXMnCisgICAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKKyAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgorICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgorICAgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCisgICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAorICAgICAgYXNfbG5fcz0nY3AgLXAnCisgIGVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz1sbgorICBlbHNlCisgICAgYXNfbG5fcz0nY3AgLXAnCisgIGZpCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKK3JtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKKworaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19ta2Rpcl9wPSdta2RpciAtcCAiJGFzX2RpciInCitlbHNlCisgIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCisgIGFzX21rZGlyX3A9ZmFsc2UKK2ZpCisKK2lmIHRlc3QgLXggLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfdGVzdF94PSd0ZXN0IC14JworZWxzZQorICBpZiBscyAtZEwgLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBhc19sc19MX29wdGlvbj1MCisgIGVsc2UKKyAgICBhc19sc19MX29wdGlvbj0KKyAgZmkKKyAgYXNfdGVzdF94PScKKyAgICBldmFsIHNoIC1jICdcJycKKyAgICAgIGlmIHRlc3QgLWQgIiQxIjsgdGhlbgorCXRlc3QgLWQgIiQxLy4iOworICAgICAgZWxzZQorCWNhc2UgJDEgaW4gIygKKwktKilzZXQgIi4vJDEiOzsKKwllc2FjOworCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluICMoKAorCT8/P1tzeF0qKTo7OyopZmFsc2U7O2VzYWM7ZmkKKyAgICAnXCcnIHNoCisgICcKK2ZpCithc19leGVjdXRhYmxlX3A9JGFzX3Rlc3RfeAorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCithc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KK2FzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKwordGVzdCAtbiAiJERKRElSIiB8fCBleGVjIDc8JjAgPC9kZXYvbnVsbAorZXhlYyA2PiYxCisKKyMgTmFtZSBvZiB0aGUgaG9zdC4KKyMgaG9zdG5hbWUgb24gc29tZSBzeXN0ZW1zIChTVlIzLjIsIG9sZCBHTlUvTGludXgpIHJldHVybnMgYSBib2d1cyBleGl0IHN0YXR1cywKKyMgc28gdW5hbWUgZ2V0cyBydW4gdG9vLgorYWNfaG9zdG5hbWU9YChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCisKKyMKKyMgSW5pdGlhbGl6YXRpb25zLgorIworYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorYWNfY2xlYW5fZmlsZXM9CithY19jb25maWdfbGlib2JqX2Rpcj0uCitMSUJPQkpTPQorY3Jvc3NfY29tcGlsaW5nPW5vCitzdWJkaXJzPQorTUZMQUdTPQorTUFLRUZMQUdTPQorCisjIElkZW50aXR5IG9mIHRoaXMgcGFja2FnZS4KK1BBQ0tBR0VfTkFNRT0nT3BlblNTSCcKK1BBQ0tBR0VfVEFSTkFNRT0nb3BlbnNzaCcKK1BBQ0tBR0VfVkVSU0lPTj0nUG9ydGFibGUnCitQQUNLQUdFX1NUUklORz0nT3BlblNTSCBQb3J0YWJsZScKK1BBQ0tBR0VfQlVHUkVQT1JUPSdvcGVuc3NoLXVuaXgtZGV2QG1pbmRyb3Qub3JnJworUEFDS0FHRV9VUkw9JycKKworYWNfdW5pcXVlX2ZpbGU9InNzaC5jIgorIyBGYWN0b3JpbmcgZGVmYXVsdCBoZWFkZXJzIGZvciBtb3N0IHRlc3RzLgorYWNfaW5jbHVkZXNfZGVmYXVsdD0iXAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWZkZWYgU1REQ19IRUFERVJTCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbHNlCisjIGlmZGVmIEhBVkVfU1RETElCX0gKKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorIyBpZiAhZGVmaW5lZCBTVERDX0hFQURFUlMgJiYgZGVmaW5lZCBIQVZFX01FTU9SWV9ICisjICBpbmNsdWRlIDxtZW1vcnkuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorIyBpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RESU5UX0gKKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmIgorCithY19zdWJzdF92YXJzPSdMVExJQk9CSlMKK0xJQk9CSlMKK1RFU1RfU1NIX0lQVjYKK3BpZGRpcgordXNlcl9wYXRoCittYW5zdWJkaXIKK01BTlRZUEUKK1hBVVRIX1BBVEgKK1NUUklQX09QVAoreGF1dGhfcGF0aAorUFJJVlNFUF9QQVRICitLUkI1Q09ORgorU1NIRExJQlMKK1NTSExJQlMKK1NTSF9QUklWU0VQX1VTRVIKK0NPTU1FTlRfT1VUX0VDQworVEVTVF9TU0hfRUNDCitURVNUX1NTSF9TSEEyNTYKK0xJQkVESVQKK1BLR0NPTkZJRworTEQKK1BBVEhfUEFTU1dEX1BST0cKK0xPR0lOX1BST0dSQU1fRkFMTEJBQ0sKK1NUQVJUVVBfU0NSSVBUX1NIRUxMCitNQUtFX1BBQ0tBR0VfU1VQUE9SVEVECitQQVRIX1VTRVJBRERfUFJPRworUEFUSF9HUk9VUEFERF9QUk9HCitNQU5GTVQKK1RFU1RfU0hFTEwKK01BTkRPQworTlJPRkYKK0dST0ZGCitTSAorVEVTVF9NSU5VU19TX1NICitFTlQKK1NFRAorUEVSTAorS0lMTAorQ0FUCitBUgorSU5TVEFMTF9EQVRBCitJTlNUQUxMX1NDUklQVAorSU5TVEFMTF9QUk9HUkFNCitSQU5MSUIKK0FXSworRUdSRVAKK0dSRVAKK0NQUAoraG9zdF9vcworaG9zdF92ZW5kb3IKK2hvc3RfY3B1Citob3N0CitidWlsZF9vcworYnVpbGRfdmVuZG9yCitidWlsZF9jcHUKK2J1aWxkCitPQkpFWFQKK0VYRUVYVAorYWNfY3RfQ0MKK0NQUEZMQUdTCitMREZMQUdTCitDRkxBR1MKK0NDCit0YXJnZXRfYWxpYXMKK2hvc3RfYWxpYXMKK2J1aWxkX2FsaWFzCitMSUJTCitFQ0hPX1QKK0VDSE9fTgorRUNIT19DCitERUZTCittYW5kaXIKK2xvY2FsZWRpcgorbGliZGlyCitwc2RpcgorcGRmZGlyCitkdmlkaXIKK2h0bWxkaXIKK2luZm9kaXIKK2RvY2Rpcgorb2xkaW5jbHVkZWRpcgoraW5jbHVkZWRpcgorbG9jYWxzdGF0ZWRpcgorc2hhcmVkc3RhdGVkaXIKK3N5c2NvbmZkaXIKK2RhdGFkaXIKK2RhdGFyb290ZGlyCitsaWJleGVjZGlyCitzYmluZGlyCitiaW5kaXIKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUKK3ByZWZpeAorZXhlY19wcmVmaXgKK1BBQ0tBR0VfVVJMCitQQUNLQUdFX0JVR1JFUE9SVAorUEFDS0FHRV9TVFJJTkcKK1BBQ0tBR0VfVkVSU0lPTgorUEFDS0FHRV9UQVJOQU1FCitQQUNLQUdFX05BTUUKK1BBVEhfU0VQQVJBVE9SCitTSEVMTCcKK2FjX3N1YnN0X2ZpbGVzPScnCithY191c2VyX29wdHM9JworZW5hYmxlX29wdGlvbl9jaGVja2luZworZW5hYmxlX2xhcmdlZmlsZQord2l0aF9zdGFja3Byb3RlY3QKK3dpdGhfcnBhdGgKK3dpdGhfY2ZsYWdzCit3aXRoX2NwcGZsYWdzCit3aXRoX2xkZmxhZ3MKK3dpdGhfbGlicword2l0aF9XZXJyb3IKK3dpdGhfc29sYXJpc19jb250cmFjdHMKK3dpdGhfc29sYXJpc19wcm9qZWN0cword2l0aF9vc2ZzaWEKK3dpdGhfemxpYgord2l0aF96bGliX3ZlcnNpb25fY2hlY2sKK3dpdGhfc2tleQord2l0aF90Y3Bfd3JhcHBlcnMKK3dpdGhfbGRucword2l0aF9saWJlZGl0Cit3aXRoX2F1ZGl0Cit3aXRoX3NzbF9kaXIKK3dpdGhfb3BlbnNzbF9oZWFkZXJfY2hlY2sKK3dpdGhfc3NsX2VuZ2luZQord2l0aF9wcm5nZF9wb3J0Cit3aXRoX3BybmdkX3NvY2tldAord2l0aF9wYW0KK3dpdGhfcHJpdnNlcF91c2VyCit3aXRoX3NhbmRib3gKK3dpdGhfc2VsaW51eAord2l0aF9rZXJiZXJvczUKK3dpdGhfcHJpdnNlcF9wYXRoCit3aXRoX3hhdXRoCitlbmFibGVfc3RyaXAKK3dpdGhfbWFpbGRpcgord2l0aF9tYW50eXBlCit3aXRoX21kNV9wYXNzd29yZHMKK3dpdGhfc2hhZG93Cit3aXRoX2lwYWRkcl9kaXNwbGF5CitlbmFibGVfZXRjX2RlZmF1bHRfbG9naW4KK3dpdGhfZGVmYXVsdF9wYXRoCit3aXRoX3N1cGVydXNlcl9wYXRoCit3aXRoXzRpbjYKK3dpdGhfYnNkX2F1dGgKK3dpdGhfcGlkX2RpcgorZW5hYmxlX2xhc3Rsb2cKK2VuYWJsZV91dG1wCitlbmFibGVfdXRtcHgKK2VuYWJsZV93dG1wCitlbmFibGVfd3RtcHgKK2VuYWJsZV9saWJ1dGlsCitlbmFibGVfcHV0dXRsaW5lCitlbmFibGVfcHV0dXR4bGluZQord2l0aF9sYXN0bG9nCisnCisgICAgICBhY19wcmVjaW91c192YXJzPSdidWlsZF9hbGlhcworaG9zdF9hbGlhcwordGFyZ2V0X2FsaWFzCitDQworQ0ZMQUdTCitMREZMQUdTCitMSUJTCitDUFBGTEFHUworQ1BQJworCisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KK2FjX2luaXRfaGVscD0KK2FjX2luaXRfdmVyc2lvbj1mYWxzZQorYWNfdW5yZWNvZ25pemVkX29wdHM9CithY191bnJlY29nbml6ZWRfc2VwPQorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2NhY2hlX2ZpbGU9L2Rldi9udWxsCitleGVjX3ByZWZpeD1OT05FCitub19jcmVhdGU9Citub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCisKKyMgSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvcHRpb25zLgorIyBUaGVzZSBhcmUgbGVmdCB1bmV4cGFuZGVkIHNvIHVzZXJzIGNhbiAibWFrZSBpbnN0YWxsIGV4ZWNfcHJlZml4PS9mb28iCisjIGFuZCBhbGwgdGhlIHZhcmlhYmxlcyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBiYXNlZCBvbiBleGVjX3ByZWZpeAorIyBieSBkZWZhdWx0IHdpbGwgYWN0dWFsbHkgY2hhbmdlLgorIyBVc2UgYnJhY2VzIGluc3RlYWQgb2YgcGFyZW5zIGJlY2F1c2Ugc2gsIHBlcmwsIGV0Yy4gYWxzbyBhY2NlcHQgdGhlbS4KKyMgKFRoZSBsaXN0IGZvbGxvd3MgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIEdOVSBDb2RpbmcgU3RhbmRhcmRzLikKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhcm9vdGRpcj0nJHtwcmVmaXh9L3NoYXJlJworZGF0YWRpcj0nJHtkYXRhcm9vdGRpcn0nCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitkb2NkaXI9JyR7ZGF0YXJvb3RkaXJ9L2RvYy8ke1BBQ0tBR0VfVEFSTkFNRX0nCitpbmZvZGlyPScke2RhdGFyb290ZGlyfS9pbmZvJworaHRtbGRpcj0nJHtkb2NkaXJ9JworZHZpZGlyPScke2RvY2Rpcn0nCitwZGZkaXI9JyR7ZG9jZGlyfScKK3BzZGlyPScke2RvY2Rpcn0nCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2xvY2FsZWRpcj0nJHtkYXRhcm9vdGRpcn0vbG9jYWxlJworbWFuZGlyPScke2RhdGFyb290ZGlyfS9tYW4nCisKK2FjX3ByZXY9CithY19kYXNoZGFzaD0KK2ZvciBhY19vcHRpb24KK2RvCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICRhY19wcmV2PVwkYWNfb3B0aW9uCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgJGFjX29wdGlvbiBpbgorICAqPT8qKSBhY19vcHRhcmc9YGV4cHIgIlgkYWNfb3B0aW9uIiA6ICdbXj1dKj1cKC4qXCknYCA7OworICAqPSkgICBhY19vcHRhcmc9IDs7CisgICopICAgIGFjX29wdGFyZz15ZXMgOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAkYWNfZGFzaGRhc2gkYWNfb3B0aW9uIGluCisgIC0tKQorICAgIGFjX2Rhc2hkYXNoPXllcyA7OworCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9JGFjX29wdGFyZyA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZF9hbGlhcyA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZF9hbGlhcz0kYWNfb3B0YXJnIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0kYWNfb3B0YXJnIDs7CisKKyAgLS1jb25maWctY2FjaGUgfCAtQykKKyAgICBjYWNoZV9maWxlPWNvbmZpZy5jYWNoZSA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qKQorICAgIGRhdGFkaXI9JGFjX29wdGFyZyA7OworCisgIC1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaXIgfCAtLWRhdGFyb290ZGkgfCAtLWRhdGFyb290ZCB8IC0tZGF0YXJvb3QgXAorICB8IC0tZGF0YXJvbyB8IC0tZGF0YXJvIHwgLS1kYXRhcikKKyAgICBhY19wcmV2PWRhdGFyb290ZGlyIDs7CisgIC1kYXRhcm9vdGRpcj0qIHwgLS1kYXRhcm9vdGRpcj0qIHwgLS1kYXRhcm9vdGRpPSogfCAtLWRhdGFyb290ZD0qIFwKKyAgfCAtLWRhdGFyb290PSogfCAtLWRhdGFyb289KiB8IC0tZGF0YXJvPSogfCAtLWRhdGFyPSopCisgICAgZGF0YXJvb3RkaXI9JGFjX29wdGFyZyA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZGlzYWJsZS1cKC4qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorImVuYWJsZV8kYWNfdXNlcm9wdCIKKyIqKSA7OworICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS1kaXNhYmxlLSRhY191c2Vyb3B0X29yaWciCisJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CisgICAgZXNhYworICAgIGV2YWwgZW5hYmxlXyRhY191c2Vyb3B0PW5vIDs7CisKKyAgLWRvY2RpciB8IC0tZG9jZGlyIHwgLS1kb2NkaSB8IC0tZG9jIHwgLS1kbykKKyAgICBhY19wcmV2PWRvY2RpciA7OworICAtZG9jZGlyPSogfCAtLWRvY2Rpcj0qIHwgLS1kb2NkaT0qIHwgLS1kb2M9KiB8IC0tZG89KikKKyAgICBkb2NkaXI9JGFjX29wdGFyZyA7OworCisgIC1kdmlkaXIgfCAtLWR2aWRpciB8IC0tZHZpZGkgfCAtLWR2aWQgfCAtLWR2aSB8IC0tZHYpCisgICAgYWNfcHJldj1kdmlkaXIgOzsKKyAgLWR2aWRpcj0qIHwgLS1kdmlkaXI9KiB8IC0tZHZpZGk9KiB8IC0tZHZpZD0qIHwgLS1kdmk9KiB8IC0tZHY9KikKKyAgICBkdmlkaXI9JGFjX29wdGFyZyA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKmVuYWJsZS1cKFtePV0qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorImVuYWJsZV8kYWNfdXNlcm9wdCIKKyIqKSA7OworICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS1lbmFibGUtJGFjX3VzZXJvcHRfb3JpZyIKKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKyAgICBlc2FjCisgICAgZXZhbCBlbmFibGVfJGFjX3VzZXJvcHQ9XCRhY19vcHRhcmcgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtaCkKKyAgICBhY19pbml0X2hlbHA9bG9uZyA7OworICAtaGVscD1yKiB8IC0taGVscD1yKiB8IC0taGVsPXIqIHwgLS1oZT1yKiB8IC1ociopCisgICAgYWNfaW5pdF9oZWxwPXJlY3Vyc2l2ZSA7OworICAtaGVscD1zKiB8IC0taGVscD1zKiB8IC0taGVsPXMqIHwgLS1oZT1zKiB8IC1ocyopCisgICAgYWNfaW5pdF9oZWxwPXNob3J0IDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0X2FsaWFzIDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdF9hbGlhcz0kYWNfb3B0YXJnIDs7CisKKyAgLWh0bWxkaXIgfCAtLWh0bWxkaXIgfCAtLWh0bWxkaSB8IC0taHRtbGQgfCAtLWh0bWwgfCAtLWh0bSB8IC0taHQpCisgICAgYWNfcHJldj1odG1sZGlyIDs7CisgIC1odG1sZGlyPSogfCAtLWh0bWxkaXI9KiB8IC0taHRtbGRpPSogfCAtLWh0bWxkPSogfCAtLWh0bWw9KiB8IC0taHRtPSogXAorICB8IC0taHQ9KikKKyAgICBodG1sZGlyPSRhY19vcHRhcmcgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9JGFjX29wdGFyZyA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxvY2FsZWRpciB8IC0tbG9jYWxlZGlyIHwgLS1sb2NhbGVkaSB8IC0tbG9jYWxlZCB8IC0tbG9jYWxlKQorICAgIGFjX3ByZXY9bG9jYWxlZGlyIDs7CisgIC1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGlyPSogfCAtLWxvY2FsZWRpPSogfCAtLWxvY2FsZWQ9KiB8IC0tbG9jYWxlPSopCisgICAgbG9jYWxlZGlyPSRhY19vcHRhcmcgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IHwgLS1sb2NhbHMpCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIHwgLS1sb2NhbHM9KikKKyAgICBsb2NhbHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9JGFjX29wdGFyZyA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jIHwgLW4pCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSRhY19vcHRhcmcgOzsKKworICAtcGRmZGlyIHwgLS1wZGZkaXIgfCAtLXBkZmRpIHwgLS1wZGZkIHwgLS1wZGYgfCAtLXBkKQorICAgIGFjX3ByZXY9cGRmZGlyIDs7CisgIC1wZGZkaXI9KiB8IC0tcGRmZGlyPSogfCAtLXBkZmRpPSogfCAtLXBkZmQ9KiB8IC0tcGRmPSogfCAtLXBkPSopCisgICAgcGRmZGlyPSRhY19vcHRhcmcgOzsKKworICAtcHNkaXIgfCAtLXBzZGlyIHwgLS1wc2RpIHwgLS1wc2QgfCAtLXBzKQorICAgIGFjX3ByZXY9cHNkaXIgOzsKKyAgLXBzZGlyPSogfCAtLXBzZGlyPSogfCAtLXBzZGk9KiB8IC0tcHNkPSogfCAtLXBzPSopCisgICAgcHNkaXI9JGFjX29wdGFyZyA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9JGFjX29wdGFyZyA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSRhY19vcHRhcmcgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSRhY19vcHRhcmcgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldF9hbGlhcyA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0X2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtVikKKyAgICBhY19pbml0X3ZlcnNpb249OiA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aC1cKFtePV0qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorIndpdGhfJGFjX3VzZXJvcHQiCisiKikgOzsKKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aC0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9XCRhY19vcHRhcmcgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGhvdXQtXCguKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3VzZXJvcHQiCisgICAgYWNfdXNlcm9wdF9vcmlnPSRhY191c2Vyb3B0CisgICAgYWNfdXNlcm9wdD1gJGFzX2VjaG8gIiRhY191c2Vyb3B0IiB8IHNlZCAncy9bLSsuXS9fL2cnYAorICAgIGNhc2UgJGFjX3VzZXJfb3B0cyBpbgorICAgICAgKiIKKyJ3aXRoXyRhY191c2Vyb3B0IgorIiopIDs7CisgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLXdpdGhvdXQtJGFjX3VzZXJvcHRfb3JpZyIKKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKyAgICBlc2FjCisgICAgZXZhbCB3aXRoXyRhY191c2Vyb3B0PW5vIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0kYWNfb3B0YXJnIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSRhY19vcHRhcmcgOzsKKworICAtKikgYXNfZm5fZXJyb3IgJD8gInVucmVjb2duaXplZCBvcHRpb246IFxgJGFjX29wdGlvbicKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24iCisgICAgOzsKKworICAqPSopCisgICAgYWNfZW52dmFyPWBleHByICJ4JGFjX29wdGlvbiIgOiAneFwoW149XSpcKT0nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBjYXNlICRhY19lbnZ2YXIgaW4gIygKKyAgICAgICcnIHwgWzAtOV0qIHwgKlshXyRhc19jcl9hbG51bV0qICkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhcmlhYmxlIG5hbWU6IFxgJGFjX2VudnZhciciIDs7CisgICAgZXNhYworICAgIGV2YWwgJGFjX2VudnZhcj1cJGFjX29wdGFyZworICAgIGV4cG9ydCAkYWNfZW52dmFyIDs7CisKKyAgKikKKyAgICAjIEZJWE1FOiBzaG91bGQgYmUgcmVtb3ZlZCBpbiBhdXRvY29uZiAzLjAuCisgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogeW91IHNob3VsZCB1c2UgLS1idWlsZCwgLS1ob3N0LCAtLXRhcmdldCIgPiYyCisgICAgZXhwciAieCRhY19vcHRpb24iIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpbnZhbGlkIGhvc3QgdHlwZTogJGFjX29wdGlvbiIgPiYyCisgICAgOiAiJHtidWlsZF9hbGlhcz0kYWNfb3B0aW9ufSAke2hvc3RfYWxpYXM9JGFjX29wdGlvbn0gJHt0YXJnZXRfYWxpYXM9JGFjX29wdGlvbn0iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICBhY19vcHRpb249LS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgCisgIGFzX2ZuX2Vycm9yICQ/ICJtaXNzaW5nIGFyZ3VtZW50IHRvICRhY19vcHRpb24iCitmaQorCitpZiB0ZXN0IC1uICIkYWNfdW5yZWNvZ25pemVkX29wdHMiOyB0aGVuCisgIGNhc2UgJGVuYWJsZV9vcHRpb25fY2hlY2tpbmcgaW4KKyAgICBubykgOzsKKyAgICBmYXRhbCkgYXNfZm5fZXJyb3IgJD8gInVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiIDs7CisgICAgKikgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mMiA7OworICBlc2FjCitmaQorCisjIENoZWNrIGFsbCBkaXJlY3RvcnkgYXJndW1lbnRzIGZvciBjb25zaXN0ZW5jeS4KK2ZvciBhY192YXIgaW4JZXhlY19wcmVmaXggcHJlZml4IGJpbmRpciBzYmluZGlyIGxpYmV4ZWNkaXIgZGF0YXJvb3RkaXIgXAorCQlkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgbG9jYWxzdGF0ZWRpciBpbmNsdWRlZGlyIFwKKwkJb2xkaW5jbHVkZWRpciBkb2NkaXIgaW5mb2RpciBodG1sZGlyIGR2aWRpciBwZGZkaXIgcHNkaXIgXAorCQlsaWJkaXIgbG9jYWxlZGlyIG1hbmRpcgorZG8KKyAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICMgUmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMuCisgIGNhc2UgJGFjX3ZhbCBpbgorICAgICovICkKKyAgICAgIGFjX3ZhbD1gZXhwciAiWCRhY192YWwiIDogJ1hcKC4qW14vXVwpJyBcfCAiWCRhY192YWwiIDogJ1hcKC4qXCknYAorICAgICAgZXZhbCAkYWNfdmFyPVwkYWNfdmFsOzsKKyAgZXNhYworICAjIEJlIHN1cmUgdG8gaGF2ZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZXMuCisgIGNhc2UgJGFjX3ZhbCBpbgorICAgIFtcXC8kXSogfCA/OltcXC9dKiApICBjb250aW51ZTs7CisgICAgTk9ORSB8ICcnICkgY2FzZSAkYWNfdmFyIGluICpwcmVmaXggKSBjb250aW51ZTs7IGVzYWM7OworICBlc2FjCisgIGFzX2ZuX2Vycm9yICQ/ICJleHBlY3RlZCBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBmb3IgLS0kYWNfdmFyOiAkYWNfdmFsIgorZG9uZQorCisjIFRoZXJlIG1pZ2h0IGJlIHBlb3BsZSB3aG8gZGVwZW5kIG9uIHRoZSBvbGQgYnJva2VuIGJlaGF2aW9yOiBgJGhvc3QnCisjIHVzZWQgdG8gaG9sZCB0aGUgYXJndW1lbnQgb2YgLS1ob3N0IGV0Yy4KKyMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KK2J1aWxkPSRidWlsZF9hbGlhcworaG9zdD0kaG9zdF9hbGlhcwordGFyZ2V0PSR0YXJnZXRfYWxpYXMKKworIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgoraWYgdGVzdCAieCRob3N0X2FsaWFzIiAhPSB4OyB0aGVuCisgIGlmIHRlc3QgIngkYnVpbGRfYWxpYXMiID0geDsgdGhlbgorICAgIGNyb3NzX2NvbXBpbGluZz1tYXliZQorICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGlmIHlvdSB3YW50ZWQgdG8gc2V0IHRoZSAtLWJ1aWxkIHR5cGUsIGRvbid0IHVzZSAtLWhvc3QuCisgICAgSWYgYSBjcm9zcyBjb21waWxlciBpcyBkZXRlY3RlZCB0aGVuIGNyb3NzIGNvbXBpbGUgbW9kZSB3aWxsIGJlIHVzZWQiID4mMgorICBlbGlmIHRlc3QgIngkYnVpbGRfYWxpYXMiICE9ICJ4JGhvc3RfYWxpYXMiOyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPXllcworICBmaQorZmkKKworYWNfdG9vbF9wcmVmaXg9Cit0ZXN0IC1uICIkaG9zdF9hbGlhcyIgJiYgYWNfdG9vbF9wcmVmaXg9JGhvc3RfYWxpYXMtCisKK3Rlc3QgIiRzaWxlbnQiID0geWVzICYmIGV4ZWMgNj4vZGV2L251bGwKKworCithY19wd2Q9YHB3ZGAgJiYgdGVzdCAtbiAiJGFjX3B3ZCIgJiYKK2FjX2xzX2RpPWBscyAtZGkgLmAgJiYKK2FjX3B3ZF9sc19kaT1gY2QgIiRhY19wd2QiICYmIGxzIC1kaSAuYCB8fAorICBhc19mbl9lcnJvciAkPyAid29ya2luZyBkaXJlY3RvcnkgY2Fubm90IGJlIGRldGVybWluZWQiCit0ZXN0ICJYJGFjX2xzX2RpIiA9ICJYJGFjX3B3ZF9sc19kaSIgfHwKKyAgYXNfZm5fZXJyb3IgJD8gInB3ZCBkb2VzIG5vdCByZXBvcnQgbmFtZSBvZiB3b3JraW5nIGRpcmVjdG9yeSIKKworCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gdGhlIHBhcmVudCBkaXJlY3RvcnkuCisgIGFjX2NvbmZkaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfbXlzZWxmIiB8fAorJGFzX2V4cHIgWCIkYXNfbXlzZWxmIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19teXNlbGYiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGFzX215c2VsZiIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgIHNyY2Rpcj0kYWNfY29uZmRpcgorICBpZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICIkc3JjZGlyLyRhY191bmlxdWVfZmlsZSI7IHRoZW4KKyAgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzICYmIHNyY2Rpcj0iJGFjX2NvbmZkaXIgb3IgLi4iCisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZmluZCBzb3VyY2VzICgkYWNfdW5pcXVlX2ZpbGUpIGluICRzcmNkaXIiCitmaQorYWNfbXNnPSJzb3VyY2VzIGFyZSBpbiAkc3JjZGlyLCBidXQgXGBjZCAkc3JjZGlyJyBkb2VzIG5vdCB3b3JrIgorYWNfYWJzX2NvbmZkaXI9YCgKKwljZCAiJHNyY2RpciIgJiYgdGVzdCAtciAiLi8kYWNfdW5pcXVlX2ZpbGUiIHx8IGFzX2ZuX2Vycm9yICQ/ICIkYWNfbXNnIgorCXB3ZClgCisjIFdoZW4gYnVpbGRpbmcgaW4gcGxhY2UsIHNldCBzcmNkaXI9LgoraWYgdGVzdCAiJGFjX2Fic19jb25mZGlyIiA9ICIkYWNfcHdkIjsgdGhlbgorICBzcmNkaXI9LgorZmkKKyMgUmVtb3ZlIHVubmVjZXNzYXJ5IHRyYWlsaW5nIHNsYXNoZXMgZnJvbSBzcmNkaXIuCisjIERvdWJsZSBzbGFzaGVzIGluIGZpbGUgbmFtZXMgaW4gb2JqZWN0IGZpbGUgZGVidWdnaW5nIGluZm8KKyMgbWVzcyB1cCBNLXggZ2RiIGluIEVtYWNzLgorY2FzZSAkc3JjZGlyIGluCisqLykgc3JjZGlyPWBleHByICJYJHNyY2RpciIgOiAnWFwoLipbXi9dXCknIFx8ICJYJHNyY2RpciIgOiAnWFwoLipcKSdgOzsKK2VzYWMKK2ZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCisgIGV2YWwgYWNfZW52XyR7YWNfdmFyfV9zZXQ9XCR7JHthY192YXJ9K3NldH0KKyAgZXZhbCBhY19lbnZfJHthY192YXJ9X3ZhbHVlPVwkJHthY192YXJ9CisgIGV2YWwgYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQ9XCR7JHthY192YXJ9K3NldH0KKyAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlPVwkJHthY192YXJ9Citkb25lCisKKyMKKyMgUmVwb3J0IHRoZSAtLWhlbHAgbWVzc2FnZS4KKyMKK2lmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gImxvbmciOyB0aGVuCisgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgIGNhdCA8PF9BQ0VPRgorXGBjb25maWd1cmUnIGNvbmZpZ3VyZXMgT3BlblNTSCBQb3J0YWJsZSB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCisKK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgorCitUbyBhc3NpZ24gZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuLCBDQywgQ0ZMQUdTLi4uKSwgc3BlY2lmeSB0aGVtIGFzCitWQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgorCitEZWZhdWx0cyBmb3IgdGhlIG9wdGlvbnMgYXJlIHNwZWNpZmllZCBpbiBicmFja2V0cy4KKworQ29uZmlndXJhdGlvbjoKKyAgLWgsIC0taGVscCAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKKyAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQorICAgICAgLS1oZWxwPXJlY3Vyc2l2ZSAgICBkaXNwbGF5IHRoZSBzaG9ydCBoZWxwIG9mIGFsbCB0aGUgaW5jbHVkZWQgcGFja2FnZXMKKyAgLVYsIC0tdmVyc2lvbiAgICAgICAgICAgZGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisgIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nIC4uLicgbWVzc2FnZXMKKyAgICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUgW2Rpc2FibGVkXQorICAtQywgLS1jb25maWctY2FjaGUgICAgICBhbGlhcyBmb3IgXGAtLWNhY2hlLWZpbGU9Y29uZmlnLmNhY2hlJworICAtbiwgLS1uby1jcmVhdGUgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAgICAgLS1zcmNkaXI9RElSICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciBcYC4uJ10KKworSW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWF0KKworQnkgZGVmYXVsdCwgXGBtYWtlIGluc3RhbGwnIHdpbGwgaW5zdGFsbCBhbGwgdGhlIGZpbGVzIGluCitcYCRhY19kZWZhdWx0X3ByZWZpeC9iaW4nLCBcYCRhY19kZWZhdWx0X3ByZWZpeC9saWInIGV0Yy4gIFlvdSBjYW4gc3BlY2lmeQorYW4gaW5zdGFsbGF0aW9uIHByZWZpeCBvdGhlciB0aGFuIFxgJGFjX2RlZmF1bHRfcHJlZml4JyB1c2luZyBcYC0tcHJlZml4JywKK2ZvciBpbnN0YW5jZSBcYC0tcHJlZml4PVwkSE9NRScuCisKK0ZvciBiZXR0ZXIgY29udHJvbCwgdXNlIHRoZSBvcHRpb25zIGJlbG93LgorCitGaW5lIHR1bmluZyBvZiB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBbL3Vzci9pbmNsdWRlXQorICAtLWRhdGFyb290ZGlyPURJUiAgICAgICByZWFkLW9ubHkgYXJjaC4taW5kZXBlbmRlbnQgZGF0YSByb290IFtQUkVGSVgvc2hhcmVdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVJdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvaW5mb10KKyAgLS1sb2NhbGVkaXI9RElSICAgICAgICAgbG9jYWxlLWRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUi9sb2NhbGVdCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9tYW5dCisgIC0tZG9jZGlyPURJUiAgICAgICAgICAgIGRvY3VtZW50YXRpb24gcm9vdCBbREFUQVJPT1RESVIvZG9jL29wZW5zc2hdCisgIC0taHRtbGRpcj1ESVIgICAgICAgICAgIGh0bWwgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorICAtLWR2aWRpcj1ESVIgICAgICAgICAgICBkdmkgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorICAtLXBkZmRpcj1ESVIgICAgICAgICAgICBwZGYgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorICAtLXBzZGlyPURJUiAgICAgICAgICAgICBwcyBkb2N1bWVudGF0aW9uIFtET0NESVJdCitfQUNFT0YKKworICBjYXQgPDxcX0FDRU9GCisKK1N5c3RlbSB0eXBlczoKKyAgLS1idWlsZD1CVUlMRCAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbZ3Vlc3NlZF0KKyAgLS1ob3N0PUhPU1QgICAgICAgY3Jvc3MtY29tcGlsZSB0byBidWlsZCBwcm9ncmFtcyB0byBydW4gb24gSE9TVCBbQlVJTERdCitfQUNFT0YKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY19pbml0X2hlbHAiOyB0aGVuCisgIGNhc2UgJGFjX2luaXRfaGVscCBpbgorICAgICBzaG9ydCB8IHJlY3Vyc2l2ZSApIGVjaG8gIkNvbmZpZ3VyYXRpb24gb2YgT3BlblNTSCBQb3J0YWJsZToiOzsKKyAgIGVzYWMKKyAgY2F0IDw8XF9BQ0VPRgorCitPcHRpb25hbCBGZWF0dXJlczoKKyAgLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZyAgaWdub3JlIHVucmVjb2duaXplZCAtLWVuYWJsZS8tLXdpdGggb3B0aW9ucworICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS1kaXNhYmxlLWxhcmdlZmlsZSAgICAgb21pdCBzdXBwb3J0IGZvciBsYXJnZSBmaWxlcworICAtLWRpc2FibGUtc3RyaXAgICAgICAgICBEaXNhYmxlIGNhbGxpbmcgc3RyaXAoMSkgb24gaW5zdGFsbAorICAtLWRpc2FibGUtZXRjLWRlZmF1bHQtbG9naW4gRGlzYWJsZSB1c2luZyBQQVRIIGZyb20gL2V0Yy9kZWZhdWx0L2xvZ2luIG5vCisgIC0tZGlzYWJsZS1sYXN0bG9nICAgICAgIGRpc2FibGUgdXNlIG9mIGxhc3Rsb2cgZXZlbiBpZiBkZXRlY3RlZCBubworICAtLWRpc2FibGUtdXRtcCAgICAgICAgICBkaXNhYmxlIHVzZSBvZiB1dG1wIGV2ZW4gaWYgZGV0ZWN0ZWQgbm8KKyAgLS1kaXNhYmxlLXV0bXB4ICAgICAgICAgZGlzYWJsZSB1c2Ugb2YgdXRtcHggZXZlbiBpZiBkZXRlY3RlZCBubworICAtLWRpc2FibGUtd3RtcCAgICAgICAgICBkaXNhYmxlIHVzZSBvZiB3dG1wIGV2ZW4gaWYgZGV0ZWN0ZWQgbm8KKyAgLS1kaXNhYmxlLXd0bXB4ICAgICAgICAgZGlzYWJsZSB1c2Ugb2Ygd3RtcHggZXZlbiBpZiBkZXRlY3RlZCBubworICAtLWRpc2FibGUtbGlidXRpbCAgICAgICBkaXNhYmxlIHVzZSBvZiBsaWJ1dGlsIChsb2dpbigpIGV0Yy4pIG5vCisgIC0tZGlzYWJsZS1wdXR1dGxpbmUgICAgIGRpc2FibGUgdXNlIG9mIHB1dHV0bGluZSgpIGV0Yy4gKHV3dG1wKSBubworICAtLWRpc2FibGUtcHV0dXR4bGluZSAgICBkaXNhYmxlIHVzZSBvZiBwdXR1dHhsaW5lKCkgZXRjLiAodXd0bXB4KSBubworCitPcHRpb25hbCBQYWNrYWdlczoKKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS13aXRob3V0LXN0YWNrcHJvdGVjdCAgRG9uJ3QgdXNlIGNvbXBpbGVyJ3Mgc3RhY2sgcHJvdGVjdGlvbgorICAtLXdpdGhvdXQtcnBhdGggICAgICAgICBEaXNhYmxlIGF1dG8tYWRkZWQgLVIgbGlua2VyIHBhdGhzCisgIC0td2l0aC1jZmxhZ3MgICAgICAgICAgIFNwZWNpZnkgYWRkaXRpb25hbCBmbGFncyB0byBwYXNzIHRvIGNvbXBpbGVyCisgIC0td2l0aC1jcHBmbGFncyAgICAgICAgIFNwZWNpZnkgYWRkaXRpb25hbCBmbGFncyB0byBwYXNzIHRvIHByZXByb2Nlc3NvcgorICAtLXdpdGgtbGRmbGFncyAgICAgICAgICBTcGVjaWZ5IGFkZGl0aW9uYWwgZmxhZ3MgdG8gcGFzcyB0byBsaW5rZXIKKyAgLS13aXRoLWxpYnMgICAgICAgICAgICAgU3BlY2lmeSBhZGRpdGlvbmFsIGxpYnJhcmllcyB0byBsaW5rIHdpdGgKKyAgLS13aXRoLVdlcnJvciAgICAgICAgICAgQnVpbGQgbWFpbiBjb2RlIHdpdGggLVdlcnJvcgorICAtLXdpdGgtc29sYXJpcy1jb250cmFjdHMgRW5hYmxlIFNvbGFyaXMgcHJvY2VzcyBjb250cmFjdHMgKGV4cGVyaW1lbnRhbCkKKyAgLS13aXRoLXNvbGFyaXMtcHJvamVjdHMgRW5hYmxlIFNvbGFyaXMgcHJvamVjdHMgKGV4cGVyaW1lbnRhbCkKKyAgLS13aXRoLW9zZnNpYSAgICAgICAgICAgRW5hYmxlIERpZ2l0YWwgVW5peCBTSUEKKyAgLS13aXRoLXpsaWI9UEFUSCAgICAgICAgVXNlIHpsaWIgaW4gUEFUSAorICAtLXdpdGhvdXQtemxpYi12ZXJzaW9uLWNoZWNrIERpc2FibGUgemxpYiB2ZXJzaW9uIGNoZWNrCisgIC0td2l0aC1za2V5Wz1QQVRIXSAgICAgIEVuYWJsZSBTL0tleSBzdXBwb3J0IChvcHRpb25hbGx5IGluIFBBVEgpCisgIC0td2l0aC10Y3Atd3JhcHBlcnNbPVBBVEhdIEVuYWJsZSB0Y3B3cmFwcGVycyBzdXBwb3J0IChvcHRpb25hbGx5IGluIFBBVEgpCisgIC0td2l0aC1sZG5zWz1QQVRIXSAgICAgIFVzZSBsZG5zIGZvciBETlNTRUMgc3VwcG9ydCAob3B0aW9uYWxseSBpbiBQQVRIKQorICAtLXdpdGgtbGliZWRpdFs9UEFUSF0gICBFbmFibGUgbGliZWRpdCBzdXBwb3J0IGZvciBzZnRwCisgIC0td2l0aC1hdWRpdD1tb2R1bGUgICAgIEVuYWJsZSBhdWRpdCBzdXBwb3J0IChtb2R1bGVzPWRlYnVnLGJzbSxsaW51eCkKKyAgLS13aXRoLXNzbC1kaXI9UEFUSCAgICAgU3BlY2lmeSBwYXRoIHRvIE9wZW5TU0wgaW5zdGFsbGF0aW9uCisgIC0td2l0aG91dC1vcGVuc3NsLWhlYWRlci1jaGVjayBEaXNhYmxlIE9wZW5TU0wgdmVyc2lvbiBjb25zaXN0ZW5jeSBjaGVjaworICAtLXdpdGgtc3NsLWVuZ2luZSAgICAgICBFbmFibGUgT3BlblNTTCAoaGFyZHdhcmUpIEVOR0lORSBzdXBwb3J0CisgIC0td2l0aC1wcm5nZC1wb3J0PVBPUlQgIHJlYWQgZW50cm9weSBmcm9tIFBSTkdEL0VHRCBUQ1AgbG9jYWxob3N0OlBPUlQKKyAgLS13aXRoLXBybmdkLXNvY2tldD1GSUxFIHJlYWQgZW50cm9weSBmcm9tIFBSTkdEL0VHRCBzb2NrZXQgRklMRSAoZGVmYXVsdD0vdmFyL3J1bi9lZ2QtcG9vbCkKKyAgLS13aXRoLXBhbSAgICAgICAgICAgICAgRW5hYmxlIFBBTSBzdXBwb3J0CisgIC0td2l0aC1wcml2c2VwLXVzZXI9dXNlciBTcGVjaWZ5IG5vbi1wcml2aWxlZ2VkIHVzZXIgZm9yIHByaXZpbGVnZSBzZXBhcmF0aW9uCisgIC0td2l0aC1zYW5kYm94PXN0eWxlICAgIFNwZWNpZnkgcHJpdmlsZWdlIHNlcGFyYXRpb24gc2FuZGJveCAobm8sIGRhcndpbiwgcmxpbWl0LCBzeXN0cmFjZSwgc2VjY29tcF9maWx0ZXIpCisgIC0td2l0aC1zZWxpbnV4ICAgICAgICAgIEVuYWJsZSBTRUxpbnV4IHN1cHBvcnQKKyAgLS13aXRoLWtlcmJlcm9zNT1QQVRIICAgRW5hYmxlIEtlcmJlcm9zIDUgc3VwcG9ydAorICAtLXdpdGgtcHJpdnNlcC1wYXRoPXh4eCBQYXRoIGZvciBwcml2aWxlZ2Ugc2VwYXJhdGlvbiBjaHJvb3QgKGRlZmF1bHQ9L3Zhci9lbXB0eSkKKyAgLS13aXRoLXhhdXRoPVBBVEggICAgICAgU3BlY2lmeSBwYXRoIHRvIHhhdXRoIHByb2dyYW0KKyAgLS13aXRoLW1haWxkaXI9L3BhdGgvdG8vbWFpbCAgICBTcGVjaWZ5IHlvdXIgc3lzdGVtIG1haWwgZGlyZWN0b3J5CisgIC0td2l0aC1tYW50eXBlPW1hbnxjYXR8ZG9jICBTZXQgbWFuIHBhZ2UgdHlwZQorICAtLXdpdGgtbWQ1LXBhc3N3b3JkcyAgICBFbmFibGUgdXNlIG9mIE1ENSBwYXNzd29yZHMKKyAgLS13aXRob3V0LXNoYWRvdyAgICAgICAgRGlzYWJsZSBzaGFkb3cgcGFzc3dvcmQgc3VwcG9ydAorICAtLXdpdGgtaXBhZGRyLWRpc3BsYXkgICBVc2UgaXAgYWRkcmVzcyBpbnN0ZWFkIG9mIGhvc3RuYW1lIGluIFwkRElTUExBWQorICAtLXdpdGgtZGVmYXVsdC1wYXRoPSAgICBTcGVjaWZ5IGRlZmF1bHQgXCRQQVRIIGVudmlyb25tZW50IGZvciBzZXJ2ZXIKKyAgLS13aXRoLXN1cGVydXNlci1wYXRoPSAgU3BlY2lmeSBkaWZmZXJlbnQgcGF0aCBmb3Igc3VwZXItdXNlcgorICAtLXdpdGgtNGluNiAgICAgICAgICAgICBDaGVjayBmb3IgYW5kIGNvbnZlcnQgSVB2NCBpbiBJUHY2IG1hcHBlZCBhZGRyZXNzZXMKKyAgLS13aXRoLWJzZC1hdXRoICAgICAgICAgRW5hYmxlIEJTRCBhdXRoIHN1cHBvcnQKKyAgLS13aXRoLXBpZC1kaXI9UEFUSCAgICAgU3BlY2lmeSBsb2NhdGlvbiBvZiBzc2gucGlkIGZpbGUKKyAgLS13aXRoLWxhc3Rsb2c9RklMRXxESVIgc3BlY2lmeSBsYXN0bG9nIGxvY2F0aW9uIGNvbW1vbiBsb2NhdGlvbnMKKworU29tZSBpbmZsdWVudGlhbCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6CisgIENDICAgICAgICAgIEMgY29tcGlsZXIgY29tbWFuZAorICBDRkxBR1MgICAgICBDIGNvbXBpbGVyIGZsYWdzCisgIExERkxBR1MgICAgIGxpbmtlciBmbGFncywgZS5nLiAtTDxsaWIgZGlyPiBpZiB5b3UgaGF2ZSBsaWJyYXJpZXMgaW4gYQorICAgICAgICAgICAgICBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGxpYiBkaXI+CisgIExJQlMgICAgICAgIGxpYnJhcmllcyB0byBwYXNzIHRvIHRoZSBsaW5rZXIsIGUuZy4gLWw8bGlicmFyeT4KKyAgQ1BQRkxBR1MgICAgKE9iamVjdGl2ZSkgQy9DKysgcHJlcHJvY2Vzc29yIGZsYWdzLCBlLmcuIC1JPGluY2x1ZGUgZGlyPiBpZgorICAgICAgICAgICAgICB5b3UgaGF2ZSBoZWFkZXJzIGluIGEgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxpbmNsdWRlIGRpcj4KKyAgQ1BQICAgICAgICAgQyBwcmVwcm9jZXNzb3IKKworVXNlIHRoZXNlIHZhcmlhYmxlcyB0byBvdmVycmlkZSB0aGUgY2hvaWNlcyBtYWRlIGJ5IGBjb25maWd1cmUnIG9yIHRvIGhlbHAKK2l0IHRvIGZpbmQgbGlicmFyaWVzIGFuZCBwcm9ncmFtcyB3aXRoIG5vbnN0YW5kYXJkIG5hbWVzL2xvY2F0aW9ucy4KKworUmVwb3J0IGJ1Z3MgdG8gPG9wZW5zc2gtdW5peC1kZXZAbWluZHJvdC5vcmc+LgorX0FDRU9GCithY19zdGF0dXM9JD8KK2ZpCisKK2lmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KKyAgIyBJZiB0aGVyZSBhcmUgc3ViZGlycywgcmVwb3J0IHRoZWlyIHNwZWNpZmljIC0taGVscC4KKyAgZm9yIGFjX2RpciBpbiA6ICRhY19zdWJkaXJzX2FsbDsgZG8gdGVzdCAieCRhY19kaXIiID0geDogJiYgY29udGludWUKKyAgICB0ZXN0IC1kICIkYWNfZGlyIiB8fAorICAgICAgeyBjZCAiJHNyY2RpciIgJiYgYWNfcHdkPWBwd2RgICYmIHNyY2Rpcj0uICYmIHRlc3QgLWQgIiRhY19kaXIiOyB9IHx8CisgICAgICBjb250aW51ZQorICAgIGFjX2J1aWxkZGlyPS4KKworY2FzZSAiJGFjX2RpciIgaW4KKy4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworKikKKyAgYWNfZGlyX3N1ZmZpeD0vYCRhc19lY2hvICIkYWNfZGlyIiB8IHNlZCAnc3xeXC5bXFwvXXx8J2AKKyAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICBhY190b3BfYnVpbGRkaXJfc3ViPWAkYXNfZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzfC9bXlxcL10qfC8uLnxnO3N8L3x8J2AKKyAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgorICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisgICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OworICBlc2FjIDs7Citlc2FjCithY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKK2FjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKKyMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CithY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKKworY2FzZSAkc3JjZGlyIGluCisgIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgICBhY19zcmNkaXI9LgorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKyAgKikgIyBSZWxhdGl2ZSBuYW1lLgorICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Citlc2FjCithY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4CisKKyAgICBjZCAiJGFjX2RpciIgfHwgeyBhY19zdGF0dXM9JD87IGNvbnRpbnVlOyB9CisgICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUuCisgICAgaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IjsgdGhlbgorICAgICAgZWNobyAmJgorICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiIC0taGVscD1yZWN1cnNpdmUKKyAgICBlbGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlIjsgdGhlbgorICAgICAgZWNobyAmJgorICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSIgLS1oZWxwPXJlY3Vyc2l2ZQorICAgIGVsc2UKKyAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCisgICAgZmkgfHwgYWNfc3RhdHVzPSQ/CisgICAgY2QgIiRhY19wd2QiIHx8IHsgYWNfc3RhdHVzPSQ/OyBicmVhazsgfQorICBkb25lCitmaQorCit0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIiAmJiBleGl0ICRhY19zdGF0dXMKK2lmICRhY19pbml0X3ZlcnNpb247IHRoZW4KKyAgY2F0IDw8XF9BQ0VPRgorT3BlblNTSCBjb25maWd1cmUgUG9ydGFibGUKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OAorCitDb3B5cmlnaHQgKEMpIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorX0FDRU9GCisgIGV4aXQKK2ZpCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgQXV0b2NvbmYgaW5pdGlhbGl6YXRpb24uICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworIyBhY19mbl9jX3RyeV9jb21waWxlIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gY29tcGlsZSBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jX3RyeV9jb21waWxlICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorICBpZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX3JldHZhbD0xCitmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX3RyeV9jb21waWxlCisKKyMgYWNfZm5fY190cnlfcnVuIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBsaW5rIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4gQXNzdW1lcworIyB0aGF0IGV4ZWN1dGFibGVzICpjYW4qIGJlIHJ1bi4KK2FjX2ZuX2NfdHJ5X3J1biAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIGlmIHsgeyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CisgICAgICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgICAgICBhY19yZXR2YWw9JGFjX3N0YXR1cworZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbworICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX3RyeV9ydW4KKworIyBhY19mbl9jX3RyeV9jcHAgTElORU5PCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJ5IHRvIHByZXByb2Nlc3MgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgorYWNfZm5fY190cnlfY3BwICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSA+IGNvbmZ0ZXN0LmkgJiYgeworCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfTsgdGhlbiA6CisgIGFjX3JldHZhbD0wCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgICAgYWNfcmV0dmFsPTEKK2ZpCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2NfdHJ5X2NwcAorCisjIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgTElORU5PIEhFQURFUiBWQVIgSU5DTFVERVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIEhFQURFUiBleGlzdHMgYW5kIGNhbiBiZSBjb21waWxlZCB1c2luZyB0aGUgaW5jbHVkZSBmaWxlcyBpbgorIyBJTkNMVURFUywgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5LgorYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CisjaW5jbHVkZSA8JDI+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDM9eWVzIgorZWxzZQorICBldmFsICIkMz1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlCisKKyMgYWNfZm5fY19jaGVja19kZWNsIExJTkVOTyBTWU1CT0wgVkFSIElOQ0xVREVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIFNZTUJPTCBpcyBkZWNsYXJlZCBpbiBJTkNMVURFUywgc2V0dGluZyBjYWNoZSB2YXJpYWJsZSBWQVIKKyMgYWNjb3JkaW5nbHkuCithY19mbl9jX2NoZWNrX2RlY2wgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBhc19kZWNsX25hbWU9YGVjaG8gJDJ8c2VkICdzLyAqKC4qLy8nYAorICBhc19kZWNsX3VzZT1gZWNobyAkMnxzZWQgLWUgJ3MvKC8oKC8nIC1lICdzLykvKSAwJi8nIC1lICdzLywvKSAwJiAoL2cnYAorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJGFzX2RlY2xfbmFtZSBpcyBkZWNsYXJlZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRhc19kZWNsX25hbWUgaXMgZGVjbGFyZWQuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CisjaWZuZGVmICRhc19kZWNsX25hbWUKKyNpZmRlZiBfX2NwbHVzcGx1cworICAodm9pZCkgJGFzX2RlY2xfdXNlOworI2Vsc2UKKyAgKHZvaWQpICRhc19kZWNsX25hbWU7CisjZW5kaWYKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDM9eWVzIgorZWxzZQorICBldmFsICIkMz1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gIyBhY19mbl9jX2NoZWNrX2RlY2wKKworIyBhY19mbl9jX3RyeV9saW5rIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gbGluayBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jX3RyeV9saW5rICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICAgICAgIH07IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX3JldHZhbD0xCitmaQorICAjIERlbGV0ZSB0aGUgSVBBL0lQTyAoSW50ZXIgUHJvY2VkdXJhbCBBbmFseXNpcy9PcHRpbWl6YXRpb24pIGluZm9ybWF0aW9uCisgICMgY3JlYXRlZCBieSB0aGUgUEdJIGNvbXBpbGVyIChjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vKSwgYXMgaXQgd291bGQKKyAgIyBpbnRlcmZlcmUgd2l0aCB0aGUgbmV4dCBsaW5rIGNvbW1hbmQ7IGFsc28gZGVsZXRlIGEgZGlyZWN0b3J5IHRoYXQgaXMKKyAgIyBsZWZ0IGJlaGluZCBieSBBcHBsZSdzIGNvbXBpbGVyLiAgV2UgZG8gdGhpcyBiZWZvcmUgZXhlY3V0aW5nIHRoZSBhY3Rpb25zLgorICBybSAtcmYgY29uZnRlc3QuZFNZTSBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2NfdHJ5X2xpbmsKKworIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsIExJTkVOTyBIRUFERVIgVkFSIElOQ0xVREVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdHMgd2hldGhlciBIRUFERVIgZXhpc3RzLCBnaXZpbmcgYSB3YXJuaW5nIGlmIGl0IGNhbm5vdCBiZSBjb21waWxlZCB1c2luZworIyB0aGUgaW5jbHVkZSBmaWxlcyBpbiBJTkNMVURFUyBhbmQgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSCisjIGFjY29yZGluZ2x5LgorYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIGlmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorZWxzZQorICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgJDIgdXNhYmlsaXR5IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nICQyIHVzYWJpbGl0eS4uLiAiID4mNjsgfQorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKKyNpbmNsdWRlIDwkMj4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCitlbHNlCisgIGFjX2hlYWRlcl9jb21waWxlcj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorJGFzX2VjaG8gIiRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQorCisjIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgJDIgcHJlc2VuY2UiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgJDIgcHJlc2VuY2UuLi4gIiA+JjY7IH0KK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDwkMj4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworZWxzZQorICBhY19oZWFkZXJfcHJlcHJvYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQorJGFzX2VjaG8gIiRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9CisKKyMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPworY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAjKCgKKyAgeWVzOm5vOiApCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQorICAgIDs7CisgIG5vOnllczoqICkKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKyggJGFzX2VjaG8gIiMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIFJlcG9ydCB0aGlzIHRvIG9wZW5zc2gtdW5peC1kZXZAbWluZHJvdC5vcmcgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMiCisgICAgICkgfCBzZWQgInMvXi8kYXNfbWU6IFdBUk5JTkc6ICAgICAvIiA+JjIKKyAgICA7OworZXNhYworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBldmFsICIkMz1cJGFjX2hlYWRlcl9jb21waWxlciIKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KK2ZpCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworCit9ICMgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbAorCisjIGFjX2ZuX2NfY2hlY2tfZnVuYyBMSU5FTk8gRlVOQyBWQVIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIEZVTkMgZXhpc3RzLCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkKK2FjX2ZuX2NfY2hlY2tfZnVuYyAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKy8qIERlZmluZSAkMiB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICQyLgorICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisjZGVmaW5lICQyIGlubm9jdW91c18kMgorCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkMiAoKTsgYmVsb3cuCisgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisKKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyN1bmRlZiAkMgorCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyICQyICgpOworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCBfX3N0dWJfJDIgfHwgZGVmaW5lZCBfX3N0dWJfX18kMgorY2hva2UgbWUKKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKK3JldHVybiAkMiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBldmFsICIkMz15ZXMiCitlbHNlCisgIGV2YWwgIiQzPW5vIgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworCit9ICMgYWNfZm5fY19jaGVja19mdW5jCisKKyMgYWNfZm5fY19jaGVja190eXBlIExJTkVOTyBUWVBFIFZBUiBJTkNMVURFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3RzIHdoZXRoZXIgVFlQRSBleGlzdHMgYWZ0ZXIgaGF2aW5nIGluY2x1ZGVkIElOQ0xVREVTLCBzZXR0aW5nIGNhY2hlCisjIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseS4KK2FjX2ZuX2NfY2hlY2tfdHlwZSAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGV2YWwgIiQzPW5vIgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitpZiAoc2l6ZW9mICgkMikpCisJIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CitpbnQKK21haW4gKCkKK3sKK2lmIChzaXplb2YgKCgkMikpKQorCSAgICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGV2YWwgIiQzPXllcyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gIyBhY19mbl9jX2NoZWNrX3R5cGUKKworIyBhY19mbl9jX2NvbXB1dGVfaW50IExJTkVOTyBFWFBSIFZBUiBJTkNMVURFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcmllcyB0byBmaW5kIHRoZSBjb21waWxlLXRpbWUgdmFsdWUgb2YgRVhQUiBpbiBhIHByb2dyYW0gdGhhdCBpbmNsdWRlcworIyBJTkNMVURFUywgc2V0dGluZyBWQVIgYWNjb3JkaW5nbHkuIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgY291bGQgYmUKKyMgY29tcHV0ZWQKK2FjX2ZuX2NfY29tcHV0ZV9pbnQgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAgICMgRGVwZW5kaW5nIHVwb24gdGhlIHNpemUsIGNvbXB1dGUgdGhlIGxvIGFuZCBoaSBib3VuZHMuCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJDIpID49IDApXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfbG89MCBhY19taWQ9MAorICB3aGlsZSA6OyBkbworICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgkMikgPD0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19oaT0kYWNfbWlkOyBicmVhaworZWxzZQorICBhc19mbl9hcml0aCAkYWNfbWlkICsgMSAmJiBhY19sbz0kYXNfdmFsCisJCQlpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYXNfZm5fYXJpdGggMiAnKicgJGFjX21pZCArIDEgJiYgYWNfbWlkPSRhc192YWwKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgZG9uZQorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJDIpIDwgMCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19oaT0tMSBhY19taWQ9LTEKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJDIpID49ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfbG89JGFjX21pZDsgYnJlYWsKK2Vsc2UKKyAgYXNfZm5fYXJpdGggJygnICRhY19taWQgJyknIC0gMSAmJiBhY19oaT0kYXNfdmFsCisJCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYXNfZm5fYXJpdGggMiAnKicgJGFjX21pZCAmJiBhY19taWQ9JGFzX3ZhbAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBkb25lCitlbHNlCisgIGFjX2xvPSBhY19oaT0KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCit3aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCisgIGFzX2ZuX2FyaXRoICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sbyAmJiBhY19taWQ9JGFzX3ZhbAorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJDIpIDw9ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfaGk9JGFjX21pZAorZWxzZQorICBhc19mbl9hcml0aCAnKCcgJGFjX21pZCAnKScgKyAxICYmIGFjX2xvPSRhc192YWwKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2RvbmUKK2Nhc2UgJGFjX2xvIGluICMoKAorPyopIGV2YWwgIiQzPVwkYWNfbG8iOyBhY19yZXR2YWw9MCA7OworJycpIGFjX3JldHZhbD0xIDs7Citlc2FjCisgIGVsc2UKKyAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAorc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gJDI7IH0KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAkMjsgfQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CitpbnQKK21haW4gKCkKK3sKKworICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOworICBpZiAoISBmKQorICAgIHJldHVybiAxOworICBpZiAoKCQyKSA8IDApCisgICAgeworICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoJDIpKQorCXJldHVybiAxOworICAgICAgZnByaW50ZiAoZiwgIiVsZCIsIGkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGkgPSB1bG9uZ3ZhbCAoKTsKKyAgICAgIGlmIChpICE9ICgkMikpCisJcmV0dXJuIDE7CisgICAgICBmcHJpbnRmIChmLCAiJWx1IiwgaSk7CisgICAgfQorICAvKiBEbyBub3Qgb3V0cHV0IGEgdHJhaWxpbmcgbmV3bGluZSwgYXMgdGhpcyBjYXVzZXMgXHJcbiBjb25mdXNpb24KKyAgICAgb24gc29tZSBwbGF0Zm9ybXMuICAqLworICByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIGVjaG8gPj5jb25mdGVzdC52YWw7IHJlYWQgJDMgPGNvbmZ0ZXN0LnZhbDsgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgYWNfcmV0dmFsPTEKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb25mdGVzdC52YWwKKworICBmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX2NvbXB1dGVfaW50CisKKyMgYWNfZm5fY19jaGVja19tZW1iZXIgTElORU5PIEFHR1IgTUVNQkVSIFZBUiBJTkNMVURFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyaWVzIHRvIGZpbmQgaWYgdGhlIGZpZWxkIE1FTUJFUiBleGlzdHMgaW4gdHlwZSBBR0dSLCBhZnRlciBpbmNsdWRpbmcKKyMgSU5DTFVERVMsIHNldHRpbmcgY2FjaGUgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5LgorYWNfZm5fY19jaGVja19tZW1iZXIgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMi4kMyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuJDMuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNQoraW50CittYWluICgpCit7CitzdGF0aWMgJDIgYWNfYWdncjsKK2lmIChhY19hZ2dyLiQzKQorcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDQ9eWVzIgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNQoraW50CittYWluICgpCit7CitzdGF0aWMgJDIgYWNfYWdncjsKK2lmIChzaXplb2YgYWNfYWdnci4kMykKK3JldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiQ0PXllcyIKK2Vsc2UKKyAgZXZhbCAiJDQ9bm8iCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZXZhbCBhY19yZXM9XCQkNAorCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworCit9ICMgYWNfZm5fY19jaGVja19tZW1iZXIKK2NhdCA+Y29uZmlnLmxvZyA8PF9BQ0VPRgorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisKK0l0IHdhcyBjcmVhdGVkIGJ5IE9wZW5TU0ggJGFzX21lIFBvcnRhYmxlLCB3aGljaCB3YXMKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OC4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcworCisgICQgJDAgJEAKKworX0FDRU9GCitleGVjIDU+PmNvbmZpZy5sb2cKK3sKK2NhdCA8PF9BU1VOQU1FCisjIyAtLS0tLS0tLS0gIyMKKyMjIFBsYXRmb3JtLiAjIworIyMgLS0tLS0tLS0tICMjCisKK2hvc3RuYW1lID0gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisvYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGwgICAgIHx8IGVjaG8gdW5rbm93bmAKKworL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbCAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vaG9zdGluZm8gICAgICA9IGAoL3Vzci9iaW4vaG9zdGluZm8pIDI+L2Rldi9udWxsICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi9tYWNoaW5lICAgICAgICAgICA9IGAoL2Jpbi9tYWNoaW5lKSAyPi9kZXYvbnVsbCAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGwgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorCitfQVNVTkFNRQorCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgJGFzX2VjaG8gIlBBVEg6ICRhc19kaXIiCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworfSA+JjUKKworY2F0ID4mNSA8PF9BQ0VPRgorCisKKyMjIC0tLS0tLS0tLS0tICMjCisjIyBDb3JlIHRlc3RzLiAjIworIyMgLS0tLS0tLS0tLS0gIyMKKworX0FDRU9GCisKKworIyBLZWVwIGEgdHJhY2Ugb2YgdGhlIGNvbW1hbmQgbGluZS4KKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBTdHJpcCBvdXQgLS1zaWxlbnQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29yZCBpdCBmb3IgZnV0dXJlIHJ1bnMuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhLWNoYXJhY3RlcnMuCisjIE1ha2UgdHdvIHBhc3NlcyB0byBhbGxvdyBmb3IgcHJvcGVyIGR1cGxpY2F0ZS1hcmd1bWVudCBzdXBwcmVzc2lvbi4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorYWNfY29uZmlndXJlX2FyZ3MwPQorYWNfY29uZmlndXJlX2FyZ3MxPQorYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UKK2ZvciBhY19wYXNzIGluIDEgMgorZG8KKyAgZm9yIGFjX2FyZworICBkbworICAgIGNhc2UgJGFjX2FyZyBpbgorICAgIC1uby1jcmVhdGUgfCAtLW5vLWMqIHwgLW4gfCAtbm8tcmVjdXJzaW9uIHwgLS1uby1yKikgY29udGludWUgOzsKKyAgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgICAgY29udGludWUgOzsKKyAgICAqXCcqKQorICAgICAgYWNfYXJnPWAkYXNfZWNobyAiJGFjX2FyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICBlc2FjCisgICAgY2FzZSAkYWNfcGFzcyBpbgorICAgIDEpIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJnczAgIiAnJGFjX2FyZyciIDs7CisgICAgMikKKyAgICAgIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJnczEgIiAnJGFjX2FyZyciCisgICAgICBpZiB0ZXN0ICRhY19tdXN0X2tlZXBfbmV4dCA9IHRydWU7IHRoZW4KKwlhY19tdXN0X2tlZXBfbmV4dD1mYWxzZSAjIEdvdCB2YWx1ZSwgYmFjayB0byBub3JtYWwuCisgICAgICBlbHNlCisJY2FzZSAkYWNfYXJnIGluCisJICAqPSogfCAtLWNvbmZpZy1jYWNoZSB8IC1DIHwgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qIFwKKwkgIHwgLWVuYWJsZS0qIHwgLS1lbmFibGUtKiB8IC1nYXMgfCAtLWcqIHwgLW5mcCB8IC0tbmYqIFwKKwkgIHwgLXEgfCAtcXVpZXQgfCAtLXEqIHwgLXNpbGVudCB8IC0tc2lsKiB8IC12IHwgLXZlcmIqIFwKKwkgIHwgLXdpdGgtKiB8IC0td2l0aC0qIHwgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qIHwgLS14KQorCSAgICBjYXNlICIkYWNfY29uZmlndXJlX2FyZ3MwICIgaW4KKwkgICAgICAiJGFjX2NvbmZpZ3VyZV9hcmdzMSIqIiAnJGFjX2FyZycgIiogKSBjb250aW51ZSA7OworCSAgICBlc2FjCisJICAgIDs7CisJICAtKiApIGFjX211c3Rfa2VlcF9uZXh0PXRydWUgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ3VyZV9hcmdzICIgJyRhY19hcmcnIgorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKK2RvbmUKK3sgYWNfY29uZmlndXJlX2FyZ3MwPTsgdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MwO30KK3sgYWNfY29uZmlndXJlX2FyZ3MxPTsgdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MxO30KKworIyBXaGVuIGludGVycnVwdGVkIG9yIGV4aXQnZCwgY2xlYW51cCB0ZW1wb3JhcnkgZmlsZXMsIGFuZCBjb21wbGV0ZQorIyBjb25maWcubG9nLiAgV2UgcmVtb3ZlIGNvbW1lbnRzIGJlY2F1c2UgYW55d2F5IHRoZSBxdW90ZXMgaW4gdGhlcmUKKyMgd291bGQgY2F1c2UgcHJvYmxlbXMgb3IgbG9vayB1Z2x5LgorIyBXQVJOSU5HOiBVc2UgJ1wnJyB0byByZXByZXNlbnQgYW4gYXBvc3Ryb3BoZSB3aXRoaW4gdGhlIHRyYXAuCisjIFdBUk5JTkc6IERvIG5vdCBzdGFydCB0aGUgdHJhcCBjb2RlIHdpdGggYSBuZXdsaW5lLCBkdWUgdG8gYSBGcmVlQlNEIDQuMCBidWcuCit0cmFwICdleGl0X3N0YXR1cz0kPworICAjIFNhdmUgaW50byBjb25maWcubG9nIHNvbWUgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBoZWxwIGluIGRlYnVnZ2luZy4KKyAgeworICAgIGVjaG8KKworICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tICMjCisjIyBDYWNoZSB2YXJpYWJsZXMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tICMjIgorICAgIGVjaG8KKyAgICAjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorKAorICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdcJydzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ1wnJ2A7IGRvCisgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICAgY2FzZSAkYWNfdmFsIGluICMoCisgICAgKiR7YXNfbmx9KikKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgKl9jdl8qKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjI7fSA7OworICAgICAgZXNhYworICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisgICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCisgICAgICBCQVNIX0FSR1YgfCBCQVNIX1NPVVJDRSkgZXZhbCAkYWNfdmFyPSA7OyAjKAorICAgICAgKikgeyBldmFsICRhY192YXI9OyB1bnNldCAkYWNfdmFyO30gOzsKKyAgICAgIGVzYWMgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgKHNldCkgMj4mMSB8CisgICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPSdcJycgJ1wnJzsgc2V0KSAyPiYxYCBpbiAjKAorICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKKyAgICAgIHNlZCAtbiBcCisJInMvJ1wnJy8nXCcnXFxcXCdcJycnXCcnL2c7CisJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcJydcXDInXCcnL3AiCisgICAgICA7OyAjKAorICAgICopCisgICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgorICAgICAgOzsKKyAgICBlc2FjIHwKKyAgICBzb3J0CispCisgICAgZWNobworCisgICAgJGFzX2VjaG8gIiMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBPdXRwdXQgdmFyaWFibGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMiCisgICAgZWNobworICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X3ZhcnMKKyAgICBkbworICAgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICAgICBjYXNlICRhY192YWwgaW4KKyAgICAgICpcJ1wnJyopIGFjX3ZhbD1gJGFzX2VjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKKyAgICAgIGVzYWMKKyAgICAgICRhc19lY2hvICIkYWNfdmFyPSdcJyckYWNfdmFsJ1wnJyIKKyAgICBkb25lIHwgc29ydAorICAgIGVjaG8KKworICAgIGlmIHRlc3QgLW4gIiRhY19zdWJzdF9maWxlcyI7IHRoZW4KKyAgICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjIgorICAgICAgZWNobworICAgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfZmlsZXMKKyAgICAgIGRvCisJZXZhbCBhY192YWw9XCQkYWNfdmFyCisJY2FzZSAkYWNfdmFsIGluCisJKlwnXCcnKikgYWNfdmFsPWAkYXNfZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OworCWVzYWMKKwkkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCisgICAgICBkb25lIHwgc29ydAorICAgICAgZWNobworICAgIGZpCisKKyAgICBpZiB0ZXN0IC1zIGNvbmZkZWZzLmg7IHRoZW4KKyAgICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLSAjIworIyMgY29uZmRlZnMuaC4gIyMKKyMjIC0tLS0tLS0tLS0tICMjIgorICAgICAgZWNobworICAgICAgY2F0IGNvbmZkZWZzLmgKKyAgICAgIGVjaG8KKyAgICBmaQorICAgIHRlc3QgIiRhY19zaWduYWwiICE9IDAgJiYKKyAgICAgICRhc19lY2hvICIkYXNfbWU6IGNhdWdodCBzaWduYWwgJGFjX3NpZ25hbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiBleGl0ICRleGl0X3N0YXR1cyIKKyAgfSA+JjUKKyAgcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qICYmCisgICAgcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgorICAgIGV4aXQgJGV4aXRfc3RhdHVzCisnIDAKK2ZvciBhY19zaWduYWwgaW4gMSAyIDEzIDE1OyBkbworICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyBhc19mbl9leGl0IDEnICRhY19zaWduYWwKK2RvbmUKK2FjX3NpZ25hbD0wCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMuaAorCiskYXNfZWNobyAiLyogY29uZmRlZnMuaCAqLyIgPiBjb25mZGVmcy5oCisKKyMgUHJlZGVmaW5lZCBwcmVwcm9jZXNzb3IgdmFyaWFibGVzLgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiJFBBQ0tBR0VfTkFNRSIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJFBBQ0tBR0VfVEFSTkFNRSIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiJFBBQ0tBR0VfVkVSU0lPTiIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIkUEFDS0FHRV9TVFJJTkciCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJFBBQ0tBR0VfQlVHUkVQT1JUIgorX0FDRU9GCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9VUkwgIiRQQUNLQUdFX1VSTCIKK19BQ0VPRgorCisKKyMgTGV0IHRoZSBzaXRlIGZpbGUgc2VsZWN0IGFuIGFsdGVybmF0ZSBjYWNoZSBmaWxlIGlmIGl0IHdhbnRzIHRvLgorIyBQcmVmZXIgYW4gZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2FjX3NpdGVfZmlsZTE9Tk9ORQorYWNfc2l0ZV9maWxlMj1OT05FCitpZiB0ZXN0IC1uICIkQ09ORklHX1NJVEUiOyB0aGVuCisgICMgV2UgZG8gbm90IHdhbnQgYSBQQVRIIHNlYXJjaCBmb3IgY29uZmlnLnNpdGUuCisgIGNhc2UgJENPTkZJR19TSVRFIGluICMoKAorICAgIC0qKSAgYWNfc2l0ZV9maWxlMT0uLyRDT05GSUdfU0lURTs7CisgICAgKi8qKSBhY19zaXRlX2ZpbGUxPSRDT05GSUdfU0lURTs7CisgICAgKikgICBhY19zaXRlX2ZpbGUxPS4vJENPTkZJR19TSVRFOzsKKyAgZXNhYworZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgYWNfc2l0ZV9maWxlMT0kcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlCisgIGFjX3NpdGVfZmlsZTI9JHByZWZpeC9ldGMvY29uZmlnLnNpdGUKK2Vsc2UKKyAgYWNfc2l0ZV9maWxlMT0kYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUKKyAgYWNfc2l0ZV9maWxlMj0kYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAiJGFjX3NpdGVfZmlsZTEiICIkYWNfc2l0ZV9maWxlMiIKK2RvCisgIHRlc3QgIngkYWNfc2l0ZV9maWxlIiA9IHhOT05FICYmIGNvbnRpbnVlCisgIGlmIHRlc3QgL2Rldi9udWxsICE9ICIkYWNfc2l0ZV9maWxlIiAmJiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KKyAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKKyAgICAuICIkYWNfc2l0ZV9maWxlIiBcCisgICAgICB8fCB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJmYWlsZWQgdG8gbG9hZCBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwgZmlsZXMKKyAgIyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuICBESkdQUCBlbXVsYXRlcyBpdCBhcyBhIHJlZ3VsYXIgZmlsZS4KKyAgaWYgdGVzdCAvZGV2L251bGwgIT0gIiRjYWNoZV9maWxlIiAmJiB0ZXN0IC1mICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgICBjYXNlICRjYWNoZV9maWxlIGluCisgICAgICBbXFwvXSogfCA/OltcXC9dKiApIC4gIiRjYWNoZV9maWxlIjs7CisgICAgICAqKSAgICAgICAgICAgICAgICAgICAgICAuICIuLyRjYWNoZV9maWxlIjs7CisgICAgZXNhYworICBmaQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICA+JGNhY2hlX2ZpbGUKK2ZpCisKKyMgQ2hlY2sgdGhhdCB0aGUgcHJlY2lvdXMgdmFyaWFibGVzIHNhdmVkIGluIHRoZSBjYWNoZSBoYXZlIGtlcHQgdGhlIHNhbWUKKyMgdmFsdWUuCithY19jYWNoZV9jb3JydXB0ZWQ9ZmFsc2UKK2ZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCisgIGV2YWwgYWNfb2xkX3NldD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0CisgIGV2YWwgYWNfbmV3X3NldD1cJGFjX2Vudl8ke2FjX3Zhcn1fc2V0CisgIGV2YWwgYWNfb2xkX3ZhbD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWUKKyAgZXZhbCBhY19uZXdfdmFsPVwkYWNfZW52XyR7YWNfdmFyfV92YWx1ZQorICBjYXNlICRhY19vbGRfc2V0LCRhY19uZXdfc2V0IGluCisgICAgc2V0LCkKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKyAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7CisgICAgLHNldCkKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgbm90IHNldCBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQorICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKKyAgICAsKTs7CisgICAgKikKKyAgICAgIGlmIHRlc3QgIngkYWNfb2xkX3ZhbCIgIT0gIngkYWNfbmV3X3ZhbCI7IHRoZW4KKwkjIGRpZmZlcmVuY2VzIGluIHdoaXRlc3BhY2UgZG8gbm90IGxlYWQgdG8gZmFpbHVyZS4KKwlhY19vbGRfdmFsX3c9YGVjaG8geCAkYWNfb2xkX3ZhbGAKKwlhY19uZXdfdmFsX3c9YGVjaG8geCAkYWNfbmV3X3ZhbGAKKwlpZiB0ZXN0ICIkYWNfb2xkX3ZhbF93IiAhPSAiJGFjX25ld192YWxfdyI7IHRoZW4KKwkgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9CisJICBhY19jYWNoZV9jb3JydXB0ZWQ9OgorCWVsc2UKKwkgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogd2FybmluZzogaWdub3Jpbmcgd2hpdGVzcGFjZSBjaGFuZ2VzIGluIFxgJGFjX3Zhcicgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogd2FybmluZzogaWdub3Jpbmcgd2hpdGVzcGFjZSBjaGFuZ2VzIGluIFxgJGFjX3Zhcicgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9CisJICBldmFsICRhY192YXI9XCRhY19vbGRfdmFsCisJZmkKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICAgZm9ybWVyIHZhbHVlOiAgXGAkYWNfb2xkX3ZhbCciID4mNQorJGFzX2VjaG8gIiRhc19tZTogICBmb3JtZXIgdmFsdWU6ICBcYCRhY19vbGRfdmFsJyIgPiYyO30KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICAgY3VycmVudCB2YWx1ZTogXGAkYWNfbmV3X3ZhbCciID4mNQorJGFzX2VjaG8gIiRhc19tZTogICBjdXJyZW50IHZhbHVlOiBcYCRhY19uZXdfdmFsJyIgPiYyO30KKyAgICAgIGZpOzsKKyAgZXNhYworICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuCisgIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgorICAgIGNhc2UgJGFjX25ld192YWwgaW4KKyAgICAqXCcqKSBhY19hcmc9JGFjX3Zhcj1gJGFzX2VjaG8gIiRhY19uZXdfdmFsIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworICAgICopIGFjX2FyZz0kYWNfdmFyPSRhY19uZXdfdmFsIDs7CisgICAgZXNhYworICAgIGNhc2UgIiAkYWNfY29uZmlndXJlX2FyZ3MgIiBpbgorICAgICAgKiIgJyRhY19hcmcnICIqKSA7OyAjIEF2b2lkIGR1cHMuICBVc2Ugb2YgcXVvdGVzIGVuc3VyZXMgYWNjdXJhY3kuCisgICAgICAqKSBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MgIiAnJGFjX2FyZyciIDs7CisgICAgZXNhYworICBmaQorZG9uZQoraWYgJGFjX2NhY2hlX2NvcnJ1cHRlZDsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjI7fQorICBhc19mbl9lcnJvciAkPyAicnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgIiRMSU5FTk8iIDUKK2ZpCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTWFpbiBib2R5IG9mIHNjcmlwdC4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCisKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKK2FjX2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMgY29uZmlnLmgiCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nY2M7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1nY2MiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1CiskYXNfZWNobyAiJENDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorJGFzX2VjaG8gIiRhY19jdF9DQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KKyAgICBDQz0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIENDPSRhY19jdF9DQworICBmaQorZWxzZQorICBDQz0iJGFjX2N2X3Byb2dfQ0MiCitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICAgICAgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1jYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1jYzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWNjIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIGZpCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGlmIHRlc3QgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCisgICAgICAgY29udGludWUKKyAgICAgZmkKKyAgICBhY19jdl9wcm9nX0NDPSJjYyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkYXNfZGlyLyRhY193b3JkJHsxKycgJ30kQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgIGZvciBhY19wcm9nIGluIGNsLmV4ZQorICBkbworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgICAgdGVzdCAtbiAiJENDIiAmJiBicmVhaworICBkb25lCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBhY19jdF9DQz0kQ0MKKyAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCitkb25lCisKKyAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCisgICAgQ0M9IiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBDQz0kYWNfY3RfQ0MKKyAgZmkKK2ZpCisKK2ZpCisKKwordGVzdCAteiAiJENDIiAmJiB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorCisjIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCiskYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQyBjb21waWxlciB2ZXJzaW9uIiA+JjUKK3NldCBYICRhY19jb21waWxlCithY19jb21waWxlcj0kMgorZm9yIGFjX29wdGlvbiBpbiAtLXZlcnNpb24gLXYgLVYgLXF2ZXJzaW9uOyBkbworICB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIHNlZCAnMTBhXAorLi4uIHJlc3Qgb2Ygc3RkZXJyIG91dHB1dCBkZWxldGVkIC4uLgorICAgICAgICAgMTBxJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgIGZpCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KK2RvbmUKKworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCithY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcworYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBhLm91dCBhLm91dC5kU1lNIGEuZXhlIGIub3V0IgorIyBUcnkgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgd2l0aG91dCAtbyBmaXJzdCwgZGlzcmVnYXJkIGEub3V0LgorIyBJdCB3aWxsIGhlbHAgdXMgZGlhZ25vc2UgYnJva2VuIGNvbXBpbGVycywgYW5kIGZpbmRpbmcgb3V0IGFuIGludHVpdGlvbgorIyBvZiBleGVleHQuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAiID4mNjsgfQorYWNfbGlua19kZWZhdWx0PWAkYXNfZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ2AKKworIyBUaGUgcG9zc2libGUgb3V0cHV0IGZpbGVzOgorYWNfZmlsZXM9ImEub3V0IGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBhLmV4ZSBhX291dC5leGUgYi5vdXQgY29uZnRlc3QuKiIKKworYWNfcm1maWxlcz0KK2ZvciBhY19maWxlIGluICRhY19maWxlcworZG8KKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkgOzsKKyAgICAqICkgYWNfcm1maWxlcz0iJGFjX3JtZmlsZXMgJGFjX2ZpbGUiOzsKKyAgZXNhYworZG9uZQorcm0gLWYgJGFjX3JtZmlsZXMKKworaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmtfZGVmYXVsdCIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmtfZGVmYXVsdCIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKKyAgIyBBdXRvY29uZi0yLjEzIGNvdWxkIHNldCB0aGUgYWNfY3ZfZXhlZXh0IHZhcmlhYmxlIHRvIGBubycuCisjIFNvIGlnbm9yZSBhIHZhbHVlIG9mIGBubycsIG90aGVyd2lzZSB0aGlzIHdvdWxkIGxlYWQgdG8gYEVYRUVYVCA9IG5vJworIyBpbiBhIE1ha2VmaWxlLiAgV2Ugc2hvdWxkIG5vdCBvdmVycmlkZSBhY19jdl9leGVleHQgaWYgaXQgd2FzIGNhY2hlZCwKKyMgc28gdGhhdCB0aGUgdXNlciBjYW4gc2hvcnQtY2lyY3VpdCB0aGlzIHRlc3QgZm9yIGNvbXBpbGVycyB1bmtub3duIHRvCisjIEF1dG9jb25mLgorZm9yIGFjX2ZpbGUgaW4gJGFjX2ZpbGVzICcnCitkbworICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkKKwk7OworICAgIFthYl0ub3V0ICkKKwkjIFdlIGZvdW5kIHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUsIGJ1dCBleGVleHQ9JycgaXMgbW9zdAorCSMgY2VydGFpbmx5IHJpZ2h0LgorCWJyZWFrOzsKKyAgICAqLiogKQorCWlmIHRlc3QgIiR7YWNfY3ZfZXhlZXh0K3NldH0iID0gc2V0ICYmIHRlc3QgIiRhY19jdl9leGVleHQiICE9IG5vOworCXRoZW4gOjsgZWxzZQorCSAgIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAorCWZpCisJIyBXZSBzZXQgYWNfY3ZfZXhlZXh0IGhlcmUgYmVjYXVzZSB0aGUgbGF0ZXIgdGVzdCBmb3IgaXQgaXMgbm90CisJIyBzYWZlOiBjcm9zcyBjb21waWxlcnMgbWF5IG5vdCBhZGQgdGhlIHN1ZmZpeCBpZiBnaXZlbiBhbiBgLW8nCisJIyBhcmd1bWVudCwgc28gd2UgbWF5IG5lZWQgdG8ga25vdyBpdCBhdCB0aGF0IHBvaW50IGFscmVhZHkuCisJIyBFdmVuIGlmIHRoaXMgc2VjdGlvbiBsb29rcyBjcnVmdHk6IGl0IGhhcyB0aGUgYWR2YW50YWdlIG9mCisJIyBhY3R1YWxseSB3b3JraW5nLgorCWJyZWFrOzsKKyAgICAqICkKKwlicmVhazs7CisgIGVzYWMKK2RvbmUKK3Rlc3QgIiRhY19jdl9leGVleHQiID0gbm8gJiYgYWNfY3ZfZXhlZXh0PQorCitlbHNlCisgIGFjX2ZpbGU9JycKK2ZpCitpZiB0ZXN0IC16ICIkYWNfZmlsZSI7IHRoZW4gOgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCit7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yIDc3ICJDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lLi4uICIgPiY2OyB9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhY19maWxlIiA+JjY7IH0KK2FjX2V4ZWV4dD0kYWNfY3ZfZXhlZXh0CisKK3JtIC1mIC1yIGEub3V0IGEub3V0LmRTWU0gYS5leGUgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGIub3V0CithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gIiA+JjY7IH0KK2lmIHsgeyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKKyAgIyBJZiBib3RoIGBjb25mdGVzdC5leGUnIGFuZCBgY29uZnRlc3QnIGFyZSBgcHJlc2VudCcgKHdlbGwsIG9ic2VydmFibGUpCisjIGNhdGNoIGBjb25mdGVzdC5leGUnLiAgRm9yIGluc3RhbmNlIHdpdGggQ3lnd2luLCBgbHMgY29uZnRlc3QnIHdpbGwKKyMgd29yayBwcm9wZXJseSAoaS5lLiwgcmVmZXIgdG8gYGNvbmZ0ZXN0LmV4ZScpLCB3aGlsZSBpdCB3b24ndCB3aXRoCisjIGBybScuCitmb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5leGUgY29uZnRlc3QgY29uZnRlc3QuKjsgZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApIDs7CisgICAgKi4qICkgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCisJICBicmVhazs7CisgICAgKiApIGJyZWFrOzsKKyAgZXNhYworZG9uZQorZWxzZQorICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZmkKK3JtIC1mIGNvbmZ0ZXN0IGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9leGVleHQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9leGVleHQiID4mNjsgfQorCitybSAtZiBjb25mdGVzdC4kYWNfZXh0CitFWEVFWFQ9JGFjX2N2X2V4ZWV4dAorYWNfZXhlZXh0PSRFWEVFWFQKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgoraW50CittYWluICgpCit7CitGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC5vdXQiLCAidyIpOworIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCithY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzIGNvbmZ0ZXN0Lm91dCIKKyMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCisjIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmcuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsgdGhlbgorICB7IHsgYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorICBpZiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19jdl9leGVleHQnCisgIHsgeyBjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgfTsgdGhlbgorICAgIGNyb3NzX2NvbXBpbGluZz1ubworICBlbHNlCisgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSBtYXliZTsgdGhlbgorCWNyb3NzX2NvbXBpbGluZz15ZXMKKyAgICBlbHNlCisJeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiY2Fubm90IHJ1biBDIGNvbXBpbGVkIHByb2dyYW1zLgorSWYgeW91IG1lYW50IHRvIGNyb3NzIGNvbXBpbGUsIHVzZSBcYC0taG9zdCcuCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorICAgIGZpCisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRjcm9zc19jb21waWxpbmciID4mNQorJGFzX2VjaG8gIiRjcm9zc19jb21waWxpbmciID4mNjsgfQorCitybSAtZiBjb25mdGVzdC4kYWNfZXh0IGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBjb25mdGVzdC5vdXQKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X29iamV4dCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QubyBjb25mdGVzdC5vYmoKK2lmIHsgeyBhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKKyAgZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QubyBjb25mdGVzdC5vYmogY29uZnRlc3QuKjsgZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlOworICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNICkgOzsKKyAgICAqKSBhY19jdl9vYmpleHQ9YGV4cHIgIiRhY19maWxlIiA6ICcuKlwuXCguKlwpJ2AKKyAgICAgICBicmVhazs7CisgIGVzYWMKK2RvbmUKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK3sgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfb2JqZXh0IiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfb2JqZXh0IiA+JjY7IH0KK09CSkVYVD0kYWNfY3Zfb2JqZXh0CithY19vYmpleHQ9JE9CSkVYVAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2NfY29tcGlsZXJfZ251Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKyNpZm5kZWYgX19HTlVDX18KKyAgICAgICBjaG9rZSBtZQorI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jb21waWxlcl9nbnU9eWVzCitlbHNlCisgIGFjX2NvbXBpbGVyX2dudT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorYWNfY3ZfY19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCithY190ZXN0X0NGTEFHUz0ke0NGTEFHUytzZXR9CithY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2NjX2crOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19zYXZlX2Nfd2Vycm9yX2ZsYWc9JGFjX2Nfd2Vycm9yX2ZsYWcKKyAgIGFjX2Nfd2Vycm9yX2ZsYWc9eWVzCisgICBhY19jdl9wcm9nX2NjX2c9bm8KKyAgIENGTEFHUz0iLWciCisgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBDRkxBR1M9IiIKKyAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZworCSBDRkxBR1M9Ii1nIgorCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQorJGFzX2VjaG8gIiRhY19jdl9wcm9nX2NjX2ciID4mNjsgfQoraWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfY2NfYzg5Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19jODk9bm8KK2FjX3NhdmVfQ0M9JENDCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLworc3RydWN0IGJ1ZiB7IGludCB4OyB9OworRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKK3N0YXRpYyBjaGFyICplIChwLCBpKQorICAgICBjaGFyICoqcDsKKyAgICAgaW50IGk7Cit7CisgIHJldHVybiBwW2ldOworfQorc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQoreworICBjaGFyICpzOworICB2YV9saXN0IHY7CisgIHZhX3N0YXJ0ICh2LHApOworICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOworICB2YV9lbmQgKHYpOworICByZXR1cm4gczsKK30KKworLyogT1NGIDQuMCBDb21wYXEgY2MgaXMgc29tZSBzb3J0IG9mIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQuICBJdCBoYXMKKyAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KKyAgIFRoZXNlIGRvbid0IHByb3Zva2UgYW4gZXJyb3IgdW5mb3J0dW5hdGVseSwgaW5zdGVhZCBhcmUgc2lsZW50bHkgdHJlYXRlZAorICAgYXMgJ3gnLiAgVGhlIGZvbGxvd2luZyBpbmR1Y2VzIGFuIGVycm9yLCB1bnRpbCAtc3RkIGlzIGFkZGVkIHRvIGdldAorICAgcHJvcGVyIEFOU0kgbW9kZS4gIEN1cmlvdXNseSAnXHgwMCchPSd4JyBhbHdheXMgY29tZXMgb3V0IHRydWUsIGZvciBhbgorICAgYXJyYXkgc2l6ZSBhdCBsZWFzdC4gIEl0J3MgbmVjZXNzYXJ5IHRvIHdyaXRlICdceDAwJz09MCB0byBnZXQgc29tZXRoaW5nCisgICB0aGF0J3MgdHJ1ZSBvbmx5IHdpdGggLXN0ZC4gICovCitpbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOworCisvKiBJQk0gQyA2IGZvciBBSVggaXMgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdCwgYnV0IGl0IHJlcGxhY2VzIG1hY3JvIHBhcmFtZXRlcnMKKyAgIGluc2lkZSBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgKi8KKyNkZWZpbmUgRk9PKHgpICd4JworaW50IHhsYzZfY2NfYXJyYXlbRk9PKGEpID09ICd4JyA/IDEgOiAtMV07CisKK2ludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOworc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307CitzdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKK2ludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOworaW50IGFyZ2M7CitjaGFyICoqYXJndjsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGYgKGUsIGFyZ3YsIDApICE9IGFyZ3ZbMF0gIHx8ICBmIChlLCBhcmd2LCAxKSAhPSBhcmd2WzFdOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitmb3IgYWNfYXJnIGluICcnIC1xbGFuZ2x2bD1leHRjODkgLXFsYW5nbHZsPWFuc2kgLXN0ZCBcCisJLUFlICItQWEgLURfSFBVWF9TT1VSQ0UiICItWGMgLURfX0VYVEVOU0lPTlNfXyIKK2RvCisgIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgorICBpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY2NfYzg5PSRhY19hcmcKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0CisgIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9ICJ4bm8iICYmIGJyZWFrCitkb25lCitybSAtZiBjb25mdGVzdC4kYWNfZXh0CitDQz0kYWNfc2F2ZV9DQworCitmaQorIyBBQ19DQUNIRV9WQUwKK2Nhc2UgIngkYWNfY3ZfcHJvZ19jY19jODkiIGluCisgIHgpCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vbmUgbmVlZGVkIiA+JjUKKyRhc19lY2hvICJub25lIG5lZWRlZCIgPiY2OyB9IDs7CisgIHhubykKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogdW5zdXBwb3J0ZWQiID4mNQorJGFzX2VjaG8gInVuc3VwcG9ydGVkIiA+JjY7IH0gOzsKKyAgKikKKyAgICBDQz0iJENDICRhY19jdl9wcm9nX2NjX2M4OSIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19jODkiID4mNjsgfSA7OworZXNhYworaWYgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0geG5vOyB0aGVuIDoKKworZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiAiJHNyY2RpciIgIiRzcmNkaXIvLi4iICIkc3JjZGlyLy4uLy4uIjsgZG8KKyAgaWYgdGVzdCAtZiAiJGFjX2Rpci9pbnN0YWxsLXNoIjsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwuc2giOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvc2h0b29sIjsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL3NodG9vbCBpbnN0YWxsIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIGluc3RhbGwtc2gsIGluc3RhbGwuc2gsIG9yIHNodG9vbCBpbiBcIiRzcmNkaXJcIiBcIiRzcmNkaXIvLi5cIiBcIiRzcmNkaXIvLi4vLi5cIiIgIiRMSU5FTk8iIDUKK2ZpCisKKyMgVGhlc2UgdGhyZWUgdmFyaWFibGVzIGFyZSB1bmRvY3VtZW50ZWQgYW5kIHVuc3VwcG9ydGVkLAorIyBhbmQgYXJlIGludGVuZGVkIHRvIGJlIHdpdGhkcmF3biBpbiBhIGZ1dHVyZSBBdXRvY29uZiByZWxlYXNlLgorIyBUaGV5IGNhbiBjYXVzZSBzZXJpb3VzIHByb2JsZW1zIGlmIGEgYnVpbGRlcidzIHNvdXJjZSB0cmVlIGlzIGluIGEgZGlyZWN0b3J5CisjIHdob3NlIGZ1bGwgbmFtZSBjb250YWlucyB1bnVzdWFsIGNoYXJhY3RlcnMuCithY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCithY19jb25maWdfc3ViPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KK2FjX2NvbmZpZ3VyZT0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZ3VyZSIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCiskU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiIHN1bjQgPi9kZXYvbnVsbCAyPiYxIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAiJExJTkVOTyIgNQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2J1aWxkKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCit0ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKKyAgYWNfYnVpbGRfYWxpYXM9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzImAKK3Rlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgorICBhc19mbl9lcnJvciAkPyAiY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAiJExJTkVOTyIgNQorYWNfY3ZfYnVpbGQ9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGFjX2J1aWxkX2FsaWFzYCB8fAorICBhc19mbl9lcnJvciAkPyAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGFjX2J1aWxkX2FsaWFzIGZhaWxlZCIgIiRMSU5FTk8iIDUKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfYnVpbGQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9idWlsZCIgPiY2OyB9CitjYXNlICRhY19jdl9idWlsZCBpbgorKi0qLSopIDs7CisqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgYnVpbGQiICIkTElORU5PIiA1OzsKK2VzYWMKK2J1aWxkPSRhY19jdl9idWlsZAorYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJworc2V0IHggJGFjX2N2X2J1aWxkCitzaGlmdAorYnVpbGRfY3B1PSQxCitidWlsZF92ZW5kb3I9JDIKK3NoaWZ0OyBzaGlmdAorIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCisjIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6CitidWlsZF9vcz0kKgorSUZTPSRhY19zYXZlX0lGUworY2FzZSAkYnVpbGRfb3MgaW4gKlwgKikgYnVpbGRfb3M9YGVjaG8gIiRidWlsZF9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9ob3N0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAieCRob3N0X2FsaWFzIiA9IHg7IHRoZW4KKyAgYWNfY3ZfaG9zdD0kYWNfY3ZfYnVpbGQKK2Vsc2UKKyAgYWNfY3ZfaG9zdD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkaG9zdF9hbGlhc2AgfHwKKyAgICBhc19mbl9lcnJvciAkPyAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGhvc3RfYWxpYXMgZmFpbGVkIiAiJExJTkVOTyIgNQorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaG9zdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hvc3QiID4mNjsgfQorY2FzZSAkYWNfY3ZfaG9zdCBpbgorKi0qLSopIDs7CisqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgaG9zdCIgIiRMSU5FTk8iIDU7OworZXNhYworaG9zdD0kYWNfY3ZfaG9zdAorYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJworc2V0IHggJGFjX2N2X2hvc3QKK3NoaWZ0Citob3N0X2NwdT0kMQoraG9zdF92ZW5kb3I9JDIKK3NoaWZ0OyBzaGlmdAorIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCisjIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6Citob3N0X29zPSQqCitJRlM9JGFjX3NhdmVfSUZTCitjYXNlICRob3N0X29zIGluICpcICopIGhvc3Rfb3M9YGVjaG8gIiRob3N0X29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYworCisKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3Nvci4uLiAiID4mNjsgfQorIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KK2lmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCisgIENQUD0KK2ZpCitpZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgorICBpZiAke2FjX2N2X3Byb2dfQ1BQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAorICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCisgICAgZG8KKyAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKwkJICAgICBTeW50YXggZXJyb3IKK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgorICBicmVhaworZmkKKworICAgIGRvbmUKKyAgICBhY19jdl9wcm9nX0NQUD0kQ1BQCisKK2ZpCisgIENQUD0kYWNfY3ZfcHJvZ19DUFAKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9JENQUAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1BQIiA+JjUKKyRhc19lY2hvICIkQ1BQIiA+JjY7IH0KK2FjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKwkJICAgICBTeW50YXggZXJyb3IKK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgorCitlbHNlCisgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gIkMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9HUkVQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJEdSRVAiOyB0aGVuCisgIGFjX3BhdGhfR1JFUF9mb3VuZD1mYWxzZQorICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19wcm9nIGluIGdyZXAgZ2dyZXA7IGRvCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgICBhY19wYXRoX0dSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCisgICAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0dSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0dSRVAiOyB9IHx8IGNvbnRpbnVlCisjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9HUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCisgICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9HUkVQCitjYXNlIGAiJGFjX3BhdGhfR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9HUkVQPSIkYWNfcGF0aF9HUkVQIiBhY19wYXRoX0dSRVBfZm91bmQ9Ojs7CisqKQorICBhY19jb3VudD0wCisgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJ0dSRVAnID4+ICJjb25mdGVzdC5ubCIKKyAgICAiJGFjX3BhdGhfR1JFUCIgLWUgJ0dSRVAkJyAtZSAnLShjYW5ub3QgbWF0Y2gpLScgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhaworICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKKyAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKKyAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0dSRVBfbWF4LTB9OyB0aGVuCisgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKyAgICAgIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIKKyAgICAgIGFjX3BhdGhfR1JFUF9tYXg9JGFjX2NvdW50CisgICAgZmkKKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgIGRvbmUKKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Citlc2FjCisKKyAgICAgICRhY19wYXRoX0dSRVBfZm91bmQgJiYgYnJlYWsgMworICAgIGRvbmUKKyAgZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisgIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0dSRVAiOyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1CisgIGZpCitlbHNlCisgIGFjX2N2X3BhdGhfR1JFUD0kR1JFUAorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9HUkVQIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcGF0aF9HUkVQIiA+JjY7IH0KKyBHUkVQPSIkYWNfY3ZfcGF0aF9HUkVQIgorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGVncmVwIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBlZ3JlcC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX0VHUkVQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgZWNobyBhIHwgJEdSRVAgLUUgJyhhfGIpJyA+L2Rldi9udWxsIDI+JjEKKyAgIHRoZW4gYWNfY3ZfcGF0aF9FR1JFUD0iJEdSRVAgLUUiCisgICBlbHNlCisgICAgIGlmIHRlc3QgLXogIiRFR1JFUCI7IHRoZW4KKyAgYWNfcGF0aF9FR1JFUF9mb3VuZD1mYWxzZQorICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19wcm9nIGluIGVncmVwOyBkbworICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgYWNfcGF0aF9FR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfRUdSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0VHUkVQIjsgfSB8fCBjb250aW51ZQorIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfRUdSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0VHUkVQCitjYXNlIGAiJGFjX3BhdGhfRUdSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgorKkdOVSopCisgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIiBhY19wYXRoX0VHUkVQX2ZvdW5kPTo7OworKikKKyAgYWNfY291bnQ9MAorICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKKyAgd2hpbGUgOgorICBkbworICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCisgICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgorICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgorICAgICRhc19lY2hvICdFR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorICAgICIkYWNfcGF0aF9FR1JFUCIgJ0VHUkVQJCcgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhaworICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKKyAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKKyAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0VHUkVQX21heC0wfTsgdGhlbgorICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCisgICAgICBhY19jdl9wYXRoX0VHUkVQPSIkYWNfcGF0aF9FR1JFUCIKKyAgICAgIGFjX3BhdGhfRUdSRVBfbWF4PSRhY19jb3VudAorICAgIGZpCisgICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICBkb25lCisgIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OworZXNhYworCisgICAgICAkYWNfcGF0aF9FR1JFUF9mb3VuZCAmJiBicmVhayAzCisgICAgZG9uZQorICBkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKyAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfRUdSRVAiOyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZWdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiAiJExJTkVOTyIgNQorICBmaQorZWxzZQorICBhY19jdl9wYXRoX0VHUkVQPSRFR1JFUAorZmkKKworICAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfRUdSRVAiID4mNQorJGFzX2VjaG8gIiRhY19jdl9wYXRoX0VHUkVQIiA+JjY7IH0KKyBFR1JFUD0iJGFjX2N2X3BhdGhfRUdSRVAiCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oZWFkZXJfc3RkYys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICA6CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmICgoJyAnICYgMHgwRkYpID09IDB4MDIwKQorIyBkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQorI2Vsc2UKKyMgZGVmaW5lIElTTE9XRVIoYykgXAorCQkgICAoKCdhJyA8PSAoYykgJiYgKGMpIDw9ICdpJykgXAorCQkgICAgIHx8ICgnaicgPD0gKGMpICYmIChjKSA8PSAncicpIFwKKwkJICAgICB8fCAoJ3MnIDw9IChjKSAmJiAoYykgPD0gJ3onKSkKKyMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAoKGMpIHwgMHg0MCkgOiAoYykpCisjZW5kaWYKKworI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKK2ludAorbWFpbiAoKQoreworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgIGlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkKKwl8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkKKyAgICAgIHJldHVybiAyOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCitmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNQorJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3RkYyIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBTVERDX0hFQURFUlMgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKyMgT24gSVJJWCA1LjMsIHN5cy90eXBlcyBhbmQgaW50dHlwZXMuaCBhcmUgY29uZmxpY3RpbmcuCitmb3IgYWNfaGVhZGVyIGluIHN5cy90eXBlcy5oIHN5cy9zdGF0Lmggc3RkbGliLmggc3RyaW5nLmggbWVtb3J5Lmggc3RyaW5ncy5oIFwKKwkJICBpbnR0eXBlcy5oIHN0ZGludC5oIHVuaXN0ZC5oCitkbyA6CisgIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0CisiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCisgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4uLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfY19iaWdlbmRpYW4rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCisgICAgIyBTZWUgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEgdW5pdmVyc2FsIGNvbXBpbGVyLgorICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZm5kZWYgX19BUFBMRV9DQ19fCisJICAgICAgIG5vdCBhIHVuaXZlcnNhbCBjYXBhYmxlIGNvbXBpbGVyCisJICAgICAjZW5kaWYKKwkgICAgIHR5cGVkZWYgaW50IGR1bW15OworCitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworCSMgQ2hlY2sgZm9yIHBvdGVudGlhbCAtYXJjaCBmbGFncy4gIEl0IGlzIG5vdCB1bml2ZXJzYWwgdW5sZXNzCisJIyB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIC1hcmNoIGZsYWdzIHdpdGggZGlmZmVyZW50IHZhbHVlcy4KKwlhY19hcmNoPQorCWFjX3ByZXY9CisJZm9yIGFjX3dvcmQgaW4gJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTOyBkbworCSBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKwkgICBjYXNlICRhY193b3JkIGluCisJICAgICBpPzg2IHwgeDg2XzY0IHwgcHBjIHwgcHBjNjQpCisJICAgICAgIGlmIHRlc3QgLXogIiRhY19hcmNoIiB8fCB0ZXN0ICIkYWNfYXJjaCIgPSAiJGFjX3dvcmQiOyB0aGVuCisJCSBhY19hcmNoPSRhY193b3JkCisJICAgICAgIGVsc2UKKwkJIGFjX2N2X2NfYmlnZW5kaWFuPXVuaXZlcnNhbAorCQkgYnJlYWsKKwkgICAgICAgZmkKKwkgICAgICAgOzsKKwkgICBlc2FjCisJICAgYWNfcHJldj0KKwkgZWxpZiB0ZXN0ICJ4JGFjX3dvcmQiID0gIngtYXJjaCI7IHRoZW4KKwkgICBhY19wcmV2PWFyY2gKKwkgZmkKKyAgICAgICBkb25lCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCisgICAgICAjIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgorICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSAgICAgI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorCitpbnQKK21haW4gKCkKK3sKKyNpZiAhIChkZWZpbmVkIEJZVEVfT1JERVIgJiYgZGVmaW5lZCBCSUdfRU5ESUFOIFwKKwkJICAgICAmJiBkZWZpbmVkIExJVFRMRV9FTkRJQU4gJiYgQllURV9PUkRFUiAmJiBCSUdfRU5ESUFOIFwKKwkJICAgICAmJiBMSVRUTEVfRU5ESUFOKQorCSAgICAgIGJvZ3VzIGVuZGlhbiBtYWNyb3MKKwkgICAgICNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBCSUdfRU5ESUFOIG9yIG5vdC4KKwkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCQkjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKK2ludAorbWFpbiAoKQoreworI2lmIEJZVEVfT1JERVIgIT0gQklHX0VORElBTgorCQkgbm90IGJpZyBlbmRpYW4KKwkJI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKK2Vsc2UKKyAgYWNfY3ZfY19iaWdlbmRpYW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICBmaQorICAgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgorICAgICAgIyBTZWUgaWYgPGxpbWl0cy5oPiBkZWZpbmVzIF9MSVRUTEVfRU5ESUFOIG9yIF9CSUdfRU5ESUFOIChlLmcuLCBTb2xhcmlzKS4KKyAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworaW50CittYWluICgpCit7CisjaWYgISAoZGVmaW5lZCBfTElUVExFX0VORElBTiB8fCBkZWZpbmVkIF9CSUdfRU5ESUFOKQorCSAgICAgIGJvZ3VzIGVuZGlhbiBtYWNyb3MKKwkgICAgICNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBfQklHX0VORElBTiBvciBub3QuCisJIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworaW50CittYWluICgpCit7CisjaWZuZGVmIF9CSUdfRU5ESUFOCisJCSBub3QgYmlnIGVuZGlhbgorCQkjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworZWxzZQorICBhY19jdl9jX2JpZ2VuZGlhbj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgIGZpCisgICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCisgICAgICAjIENvbXBpbGUgYSB0ZXN0IHByb2dyYW0uCisgICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgICMgVHJ5IHRvIGd1ZXNzIGJ5IGdyZXBwaW5nIHZhbHVlcyBmcm9tIGFuIG9iamVjdCBmaWxlLgorCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCitzaG9ydCBpbnQgYXNjaWlfbW1bXSA9CisJCSAgeyAweDQyNDksIDB4NDc2NSwgMHg2RTQ0LCAweDY5NjEsIDB4NkU1MywgMHg3OTUzLCAwIH07CisJCXNob3J0IGludCBhc2NpaV9paVtdID0KKwkJICB7IDB4Njk0QywgMHg1NDU0LCAweDY1NkMsIDB4NkU0NSwgMHg2OTQ0LCAweDZFNjEsIDAgfTsKKwkJaW50IHVzZV9hc2NpaSAoaW50IGkpIHsKKwkJICByZXR1cm4gYXNjaWlfbW1baV0gKyBhc2NpaV9paVtpXTsKKwkJfQorCQlzaG9ydCBpbnQgZWJjZGljX2lpW10gPQorCQkgIHsgMHg4OUQzLCAweEUzRTMsIDB4ODU5MywgMHg5NUM1LCAweDg5QzQsIDB4OTU4MSwgMCB9OworCQlzaG9ydCBpbnQgZWJjZGljX21tW10gPQorCQkgIHsgMHhDMkM5LCAweEM3ODUsIDB4OTVDNCwgMHg4OTgxLCAweDk1RTIsIDB4QThFMiwgMCB9OworCQlpbnQgdXNlX2ViY2RpYyAoaW50IGkpIHsKKwkJICByZXR1cm4gZWJjZGljX21tW2ldICsgZWJjZGljX2lpW2ldOworCQl9CisJCWV4dGVybiBpbnQgZm9vOworCitpbnQKK21haW4gKCkKK3sKK3JldHVybiB1c2VfYXNjaWkgKGZvbykgPT0gdXNlX2ViY2RpYyAoZm9vKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBpZiBncmVwIEJJR2VuRGlhblN5UyBjb25mdGVzdC4kYWNfb2JqZXh0ID4vZGV2L251bGw7IHRoZW4KKwkgICAgICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKKwkgICAgZmkKKwkgICAgaWYgZ3JlcCBMaVRUbGVFbkRpYW4gY29uZnRlc3QuJGFjX29iamV4dCA+L2Rldi9udWxsIDsgdGhlbgorCSAgICAgIGlmIHRlc3QgIiRhY19jdl9jX2JpZ2VuZGlhbiIgPSB1bmtub3duOyB0aGVuCisJCWFjX2N2X2NfYmlnZW5kaWFuPW5vCisJICAgICAgZWxzZQorCQkjIGZpbmRpbmcgYm90aCBzdHJpbmdzIGlzIHVubGlrZWx5IHRvIGhhcHBlbiwgYnV0IHdobyBrbm93cz8KKwkJYWNfY3ZfY19iaWdlbmRpYW49dW5rbm93bgorCSAgICAgIGZpCisJICAgIGZpCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CitpbnQKK21haW4gKCkKK3sKKworCSAgICAgLyogQXJlIHdlIGxpdHRsZSBvciBiaWcgZW5kaWFuPyAgRnJvbSBIYXJiaXNvbiZTdGVlbGUuICAqLworCSAgICAgdW5pb24KKwkgICAgIHsKKwkgICAgICAgbG9uZyBpbnQgbDsKKwkgICAgICAgY2hhciBjW3NpemVvZiAobG9uZyBpbnQpXTsKKwkgICAgIH0gdTsKKwkgICAgIHUubCA9IDE7CisJICAgICByZXR1cm4gdS5jW3NpemVvZiAobG9uZyBpbnQpIC0gMV0gPT0gMTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfY19iaWdlbmRpYW49bm8KK2Vsc2UKKyAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworICAgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX2JpZ2VuZGlhbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2NfYmlnZW5kaWFuIiA+JjY7IH0KKyBjYXNlICRhY19jdl9jX2JpZ2VuZGlhbiBpbiAjKAorICAgeWVzKQorICAgICAkYXNfZWNobyAiI2RlZmluZSBXT1JEU19CSUdFTkRJQU4gMSIgPj5jb25mZGVmcy5oCis7OyAjKAorICAgbm8pCisgICAgICA7OyAjKAorICAgdW5pdmVyc2FsKQorCiskYXNfZWNobyAiI2RlZmluZSBBQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQgMSIgPj5jb25mZGVmcy5oCisKKyAgICAgOzsgIygKKyAgICopCisgICAgIGFzX2ZuX2Vycm9yICQ/ICJ1bmtub3duIGVuZGlhbm5lc3MKKyBwcmVzZXR0aW5nIGFjX2N2X2NfYmlnZW5kaWFuPW5vIChvciB5ZXMpIHdpbGwgaGVscCIgIiRMSU5FTk8iIDUgOzsKKyBlc2FjCisKKworIyBDaGVja3MgZm9yIHByb2dyYW1zLgorZm9yIGFjX3Byb2cgaW4gZ2F3ayBtYXdrIG5hd2sgYXdrCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQVdLKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEFXSyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19BV0s9IiRBV0siICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19BV0s9IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0FXSz0kYWNfY3ZfcHJvZ19BV0sKK2lmIHRlc3QgLW4gIiRBV0siOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVdLIiA+JjUKKyRhc19lY2hvICIkQVdLIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJEFXSyIgJiYgYnJlYWsKK2RvbmUKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3Nvci4uLiAiID4mNjsgfQorIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KK2lmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCisgIENQUD0KK2ZpCitpZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgorICBpZiAke2FjX2N2X3Byb2dfQ1BQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAorICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCisgICAgZG8KKyAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKwkJICAgICBTeW50YXggZXJyb3IKK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgorICBicmVhaworZmkKKworICAgIGRvbmUKKyAgICBhY19jdl9wcm9nX0NQUD0kQ1BQCisKK2ZpCisgIENQUD0kYWNfY3ZfcHJvZ19DUFAKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9JENQUAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1BQIiA+JjUKKyRhc19lY2hvICIkQ1BQIiA+JjY7IH0KK2FjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKwkJICAgICBTeW50YXggZXJyb3IKK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgorCitlbHNlCisgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gIkMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfUkFOTElCKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK1JBTkxJQj0kYWNfY3ZfcHJvZ19SQU5MSUIKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUkFOTElCIiA+JjUKKyRhc19lY2hvICIkUkFOTElCIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiOyB0aGVuCisgIGFjX2N0X1JBTkxJQj0kUkFOTElCCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X1JBTkxJQis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSIkYWNfY3RfUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSJyYW5saWIiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfUkFOTElCPSRhY19jdl9wcm9nX2FjX2N0X1JBTkxJQgoraWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9SQU5MSUIiID4mNQorJGFzX2VjaG8gIiRhY19jdF9SQU5MSUIiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9SQU5MSUIiID0geDsgdGhlbgorICAgIFJBTkxJQj0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBSQU5MSUI9JGFjX2N0X1JBTkxJQgorICBmaQorZWxzZQorICBSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKK2ZpCisKKyMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAorIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCisjIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKKyMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCisjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKKyMgSVJJWCAvc2Jpbi9pbnN0YWxsCisjIEFJWCAvYmluL2luc3RhbGwKKyMgQW1pZ2FPUyAvQy9pbnN0YWxsLCB3aGljaCBpbnN0YWxscyBib290YmxvY2tzIG9uIGZsb3BweSBkaXNjcworIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyBPUy8yJ3Mgc3lzdGVtIGluc3RhbGwsIHdoaWNoIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KKyMgUmVqZWN0IGluc3RhbGwgcHJvZ3JhbXMgdGhhdCBjYW5ub3QgaW5zdGFsbCBtdWx0aXBsZSBmaWxlcy4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsLi4uICIgPiY2OyB9CitpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KK2lmICR7YWNfY3ZfcGF0aF9pbnN0YWxsKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorY2FzZSAkYXNfZGlyLyBpbiAjKCgKKyAgLi8gfCAuLy8gfCAvW2NDXS8qIHwgXAorICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9hZnN3cy9iaW4vKiB8IFwKKyAgPzpbXFwvXW9zMltcXC9daW5zdGFsbFtcXC9dKiB8ID86W1xcL11PUzJbXFwvXUlOU1RBTExbXFwvXSogfCBcCisgIC91c3IvdWNiLyogKSA7OworICAqKQorICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgIyBieSBkZWZhdWx0LgorICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworCWlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IH07IHRoZW4KKwkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisJICAgIGdyZXAgZHNwbXNnICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICA6CisJICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisJICAgIGdyZXAgcHdwbHVzICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkgSFAgcHdwbHVzLS1kb24ndCB1c2UuCisJICAgIDoKKwkgIGVsc2UKKwkgICAgcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCisJICAgIGVjaG8gb25lID4gY29uZnRlc3Qub25lCisJICAgIGVjaG8gdHdvID4gY29uZnRlc3QudHdvCisJICAgIG1rZGlyIGNvbmZ0ZXN0LmRpcgorCSAgICBpZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgLWMgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byAiYHB3ZGAvY29uZnRlc3QuZGlyIiAmJgorCSAgICAgIHRlc3QgLXMgY29uZnRlc3Qub25lICYmIHRlc3QgLXMgY29uZnRlc3QudHdvICYmCisJICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3Qub25lICYmCisJICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3QudHdvCisJICAgIHRoZW4KKwkgICAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCisJICAgICAgYnJlYWsgMworCSAgICBmaQorCSAgZmkKKwlmaQorICAgICAgZG9uZQorICAgIGRvbmUKKyAgICA7OworZXNhYworCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCisKK2ZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgICAgSU5TVEFMTD0kYWNfY3ZfcGF0aF9pbnN0YWxsCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCisgICAgIyB2YWx1ZSBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgorICAgIElOU1RBTEw9JGFjX2luc3RhbGxfc2gKKyAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJElOU1RBTEwiID4mNQorJGFzX2VjaG8gIiRJTlNUQUxMIiA+JjY7IH0KKworIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgorIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KK3Rlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZWdyZXAiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGVncmVwLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfRUdSRVArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiBlY2hvIGEgfCAkR1JFUCAtRSAnKGF8YiknID4vZGV2L251bGwgMj4mMQorICAgdGhlbiBhY19jdl9wYXRoX0VHUkVQPSIkR1JFUCAtRSIKKyAgIGVsc2UKKyAgICAgaWYgdGVzdCAteiAiJEVHUkVQIjsgdGhlbgorICBhY19wYXRoX0VHUkVQX2ZvdW5kPWZhbHNlCisgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX3Byb2cgaW4gZWdyZXA7IGRvCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgICBhY19wYXRoX0VHUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9FR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfRUdSRVAiOyB9IHx8IGNvbnRpbnVlCisjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9FR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfRUdSRVAKK2Nhc2UgYCIkYWNfcGF0aF9FR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiIGFjX3BhdGhfRUdSRVBfZm91bmQ9Ojs7CisqKQorICBhY19jb3VudD0wCisgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJ0VHUkVQJyA+PiAiY29uZnRlc3QubmwiCisgICAgIiRhY19wYXRoX0VHUkVQIiAnRUdSRVAkJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAorICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfRUdSRVBfbWF4LTB9OyB0aGVuCisgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKyAgICAgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIgorICAgICAgYWNfcGF0aF9FR1JFUF9tYXg9JGFjX2NvdW50CisgICAgZmkKKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgIGRvbmUKKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Citlc2FjCisKKyAgICAgICRhY19wYXRoX0VHUkVQX2ZvdW5kICYmIGJyZWFrIDMKKyAgICBkb25lCisgIGRvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9FR1JFUCI7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBlZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1CisgIGZpCitlbHNlCisgIGFjX2N2X3BhdGhfRUdSRVA9JEVHUkVQCitmaQorCisgICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9FR1JFUCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3BhdGhfRUdSRVAiID4mNjsgfQorIEVHUkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIKKworCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBhcjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfQVIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRBUiBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9BUj0iJEFSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9BUj0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK0FSPSRhY19jdl9wYXRoX0FSCitpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVIiID4mNQorJGFzX2VjaG8gIiRBUiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNhdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2F0OyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9DQVQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRDQVQgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfQ0FUPSIkQ0FUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9DQVQ9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitDQVQ9JGFjX2N2X3BhdGhfQ0FUCitpZiB0ZXN0IC1uICIkQ0FUIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENBVCIgPiY1CiskYXNfZWNobyAiJENBVCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImtpbGwiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGtpbGw7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX0tJTEwrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRLSUxMIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0tJTEw9IiRLSUxMIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9LSUxMPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorS0lMTD0kYWNfY3ZfcGF0aF9LSUxMCitpZiB0ZXN0IC1uICIkS0lMTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRLSUxMIiA+JjUKKyRhc19lY2hvICIkS0lMTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmb3IgYWNfcHJvZyBpbiBwZXJsNSBwZXJsCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfUEVSTCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJFBFUkwgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfUEVSTD0iJFBFUkwiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wYXRoX1BFUkw9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitQRVJMPSRhY19jdl9wYXRoX1BFUkwKK2lmIHRlc3QgLW4gIiRQRVJMIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBFUkwiID4mNQorJGFzX2VjaG8gIiRQRVJMIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJFBFUkwiICYmIGJyZWFrCitkb25lCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAic2VkIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBzZWQ7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX1NFRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJFNFRCBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9TRUQ9IiRTRUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wYXRoX1NFRD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK1NFRD0kYWNfY3ZfcGF0aF9TRUQKK2lmIHRlc3QgLW4gIiRTRUQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkU0VEIiA+JjUKKyRhc19lY2hvICIkU0VEIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJlbnQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGVudDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfRU5UKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkRU5UIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0VOVD0iJEVOVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhfRU5UPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorRU5UPSRhY19jdl9wYXRoX0VOVAoraWYgdGVzdCAtbiAiJEVOVCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRFTlQiID4mNQorJGFzX2VjaG8gIiRFTlQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImJhc2giLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGJhc2g7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX1RFU1RfTUlOVVNfU19TSCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJFRFU1RfTUlOVVNfU19TSCBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9URVNUX01JTlVTX1NfU0g9IiRURVNUX01JTlVTX1NfU0giICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wYXRoX1RFU1RfTUlOVVNfU19TSD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK1RFU1RfTUlOVVNfU19TSD0kYWNfY3ZfcGF0aF9URVNUX01JTlVTX1NfU0gKK2lmIHRlc3QgLW4gIiRURVNUX01JTlVTX1NfU0giOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkVEVTVF9NSU5VU19TX1NIIiA+JjUKKyRhc19lY2hvICIkVEVTVF9NSU5VU19TX1NIIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAia3NoIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBrc2g7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX1RFU1RfTUlOVVNfU19TSCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJFRFU1RfTUlOVVNfU19TSCBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9URVNUX01JTlVTX1NfU0g9IiRURVNUX01JTlVTX1NfU0giICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wYXRoX1RFU1RfTUlOVVNfU19TSD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK1RFU1RfTUlOVVNfU19TSD0kYWNfY3ZfcGF0aF9URVNUX01JTlVTX1NfU0gKK2lmIHRlc3QgLW4gIiRURVNUX01JTlVTX1NfU0giOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkVEVTVF9NSU5VU19TX1NIIiA+JjUKKyRhc19lY2hvICIkVEVTVF9NSU5VU19TX1NIIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAic2giLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHNoOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9URVNUX01JTlVTX1NfU0grOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRURVNUX01JTlVTX1NfU0ggaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfVEVTVF9NSU5VU19TX1NIPSIkVEVTVF9NSU5VU19TX1NIIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9URVNUX01JTlVTX1NfU0g9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitURVNUX01JTlVTX1NfU0g9JGFjX2N2X3BhdGhfVEVTVF9NSU5VU19TX1NICitpZiB0ZXN0IC1uICIkVEVTVF9NSU5VU19TX1NIIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFRFU1RfTUlOVVNfU19TSCIgPiY1CiskYXNfZWNobyAiJFRFU1RfTUlOVVNfU19TSCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInNoIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBzaDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfU0grOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRTSCBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9TSD0iJFNIIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9TSD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK1NIPSRhY19jdl9wYXRoX1NICitpZiB0ZXN0IC1uICIkU0giOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkU0giID4mNQorJGFzX2VjaG8gIiRTSCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdyb2ZmIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBncm9mZjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfR1JPRkYrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRHUk9GRiBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9HUk9GRj0iJEdST0ZGIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9HUk9GRj0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK0dST0ZGPSRhY19jdl9wYXRoX0dST0ZGCitpZiB0ZXN0IC1uICIkR1JPRkYiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkR1JPRkYiID4mNQorJGFzX2VjaG8gIiRHUk9GRiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm5yb2ZmIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBucm9mZjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfTlJPRkYrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICROUk9GRiBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9OUk9GRj0iJE5ST0ZGIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9OUk9GRj0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK05ST0ZGPSRhY19jdl9wYXRoX05ST0ZGCitpZiB0ZXN0IC1uICIkTlJPRkYiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTlJPRkYiID4mNQorJGFzX2VjaG8gIiROUk9GRiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1hbmRvYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbWFuZG9jOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9NQU5ET0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRNQU5ET0MgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfTUFORE9DPSIkTUFORE9DIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9NQU5ET0M9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitNQU5ET0M9JGFjX2N2X3BhdGhfTUFORE9DCitpZiB0ZXN0IC1uICIkTUFORE9DIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1BTkRPQyIgPiY1CiskYXNfZWNobyAiJE1BTkRPQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitURVNUX1NIRUxMPXNoCisKKworaWYgdGVzdCAieCRNQU5ET0MiICE9ICJ4IiA7IHRoZW4KKwlNQU5GTVQ9IiRNQU5ET0MiCitlbGlmIHRlc3QgIngkTlJPRkYiICE9ICJ4IiA7IHRoZW4KKwlNQU5GTVQ9IiROUk9GRiAtbWFuZG9jIgorZWxpZiB0ZXN0ICJ4JEdST0ZGIiAhPSAieCIgOyB0aGVuCisJTUFORk1UPSIkR1JPRkYgLW1hbmRvYyAtVGFzY2lpIgorZWxzZQorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogbm8gbWFucGFnZSBmb3JtYXR0ZWQgZm91bmQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogbm8gbWFucGFnZSBmb3JtYXR0ZWQgZm91bmQiID4mMjt9CisJTUFORk1UPSJmYWxzZSIKK2ZpCisKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJncm91cGFkZCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ3JvdXBhZGQ7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX1BBVEhfR1JPVVBBRERfUFJPRys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJFBBVEhfR1JPVVBBRERfUFJPRyBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9QQVRIX0dST1VQQUREX1BST0c9IiRQQVRIX0dST1VQQUREX1BST0ciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluIC91c3Ivc2JpbiR7UEFUSF9TRVBBUkFUT1J9L2V0YworZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9QQVRIX0dST1VQQUREX1BST0c9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfUEFUSF9HUk9VUEFERF9QUk9HIiAmJiBhY19jdl9wYXRoX1BBVEhfR1JPVVBBRERfUFJPRz0iZ3JvdXBhZGQiCisgIDs7Citlc2FjCitmaQorUEFUSF9HUk9VUEFERF9QUk9HPSRhY19jdl9wYXRoX1BBVEhfR1JPVVBBRERfUFJPRworaWYgdGVzdCAtbiAiJFBBVEhfR1JPVVBBRERfUFJPRyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQQVRIX0dST1VQQUREX1BST0ciID4mNQorJGFzX2VjaG8gIiRQQVRIX0dST1VQQUREX1BST0ciID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ1c2VyYWRkIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB1c2VyYWRkOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9QQVRIX1VTRVJBRERfUFJPRys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJFBBVEhfVVNFUkFERF9QUk9HIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX1BBVEhfVVNFUkFERF9QUk9HPSIkUEFUSF9VU0VSQUREX1BST0ciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluIC91c3Ivc2JpbiR7UEFUSF9TRVBBUkFUT1J9L2V0YworZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9QQVRIX1VTRVJBRERfUFJPRz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9QQVRIX1VTRVJBRERfUFJPRyIgJiYgYWNfY3ZfcGF0aF9QQVRIX1VTRVJBRERfUFJPRz0idXNlcmFkZCIKKyAgOzsKK2VzYWMKK2ZpCitQQVRIX1VTRVJBRERfUFJPRz0kYWNfY3ZfcGF0aF9QQVRIX1VTRVJBRERfUFJPRworaWYgdGVzdCAtbiAiJFBBVEhfVVNFUkFERF9QUk9HIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBBVEhfVVNFUkFERF9QUk9HIiA+JjUKKyRhc19lY2hvICIkUEFUSF9VU0VSQUREX1BST0ciID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJwa2dtayIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcGtnbWs7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX01BS0VfUEFDS0FHRV9TVVBQT1JURUQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkTUFLRV9QQUNLQUdFX1NVUFBPUlRFRCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19NQUtFX1BBQ0tBR0VfU1VQUE9SVEVEPSIkTUFLRV9QQUNLQUdFX1NVUFBPUlRFRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX01BS0VfUEFDS0FHRV9TVVBQT1JURUQ9InllcyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19NQUtFX1BBQ0tBR0VfU1VQUE9SVEVEIiAmJiBhY19jdl9wcm9nX01BS0VfUEFDS0FHRV9TVVBQT1JURUQ9Im5vIgorZmkKK2ZpCitNQUtFX1BBQ0tBR0VfU1VQUE9SVEVEPSRhY19jdl9wcm9nX01BS0VfUEFDS0FHRV9TVVBQT1JURUQKK2lmIHRlc3QgLW4gIiRNQUtFX1BBQ0tBR0VfU1VQUE9SVEVEIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1BS0VfUEFDS0FHRV9TVVBQT1JURUQiID4mNQorJGFzX2VjaG8gIiRNQUtFX1BBQ0tBR0VfU1VQUE9SVEVEIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2lmIHRlc3QgLXggL3NiaW4vc2g7IHRoZW4KKwlTVEFSVFVQX1NDUklQVF9TSEVMTD0vc2Jpbi9zaAorCitlbHNlCisJU1RBUlRVUF9TQ1JJUFRfU0hFTEw9L2Jpbi9zaAorCitmaQorCisjIFN5c3RlbSBmZWF0dXJlcworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxhcmdlZmlsZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9sYXJnZWZpbGUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9sYXJnZWZpbGU7CitmaQorCitpZiB0ZXN0ICIkZW5hYmxlX2xhcmdlZmlsZSIgIT0gbm87IHRoZW4KKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzcGVjaWFsIEMgY29tcGlsZXIgb3B0aW9ucyBuZWVkZWQgZm9yIGxhcmdlIGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzcGVjaWFsIEMgY29tcGlsZXIgb3B0aW9ucyBuZWVkZWQgZm9yIGxhcmdlIGZpbGVzLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3N5c19sYXJnZWZpbGVfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jdl9zeXNfbGFyZ2VmaWxlX0NDPW5vCisgICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgIGFjX3NhdmVfQ0M9JENDCisgICAgICAgd2hpbGUgOjsgZG8KKwkgIyBJUklYIDYuMiBhbmQgbGF0ZXIgZG8gbm90IHN1cHBvcnQgbGFyZ2UgZmlsZXMgYnkgZGVmYXVsdCwKKwkgIyBzbyB1c2UgdGhlIEMgY29tcGlsZXIncyAtbjMyIG9wdGlvbiBpZiB0aGF0IGhlbHBzLgorCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgLyogQ2hlY2sgdGhhdCBvZmZfdCBjYW4gcmVwcmVzZW50IDIqKjYzIC0gMSBjb3JyZWN0bHkuCisgICAgV2UgY2FuJ3Qgc2ltcGx5IGRlZmluZSBMQVJHRV9PRkZfVCB0byBiZSA5MjIzMzcyMDM2ODU0Nzc1ODA3LAorICAgIHNpbmNlIHNvbWUgQysrIGNvbXBpbGVycyBtYXNxdWVyYWRpbmcgYXMgQyBjb21waWxlcnMKKyAgICBpbmNvcnJlY3RseSByZWplY3QgOTIyMzM3MjAzNjg1NDc3NTgwNy4gICovCisjZGVmaW5lIExBUkdFX09GRl9UICgoKG9mZl90KSAxIDw8IDYyKSAtIDEgKyAoKG9mZl90KSAxIDw8IDYyKSkKKyAgaW50IG9mZl90X2lzX2xhcmdlWyhMQVJHRV9PRkZfVCAlIDIxNDc0ODM2MjkgPT0gNzIxCisJCSAgICAgICAmJiBMQVJHRV9PRkZfVCAlIDIxNDc0ODM2NDcgPT0gMSkKKwkJICAgICAgPyAxIDogLTFdOworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorCSBpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGJyZWFrCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dAorCSBDQz0iJENDIC1uMzIiCisJIGlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc3lzX2xhcmdlZmlsZV9DQz0nIC1uMzInOyBicmVhaworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKKwkgYnJlYWsKKyAgICAgICBkb25lCisgICAgICAgQ0M9JGFjX3NhdmVfQ0MKKyAgICAgICBybSAtZiBjb25mdGVzdC4kYWNfZXh0CisgICAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3N5c19sYXJnZWZpbGVfQ0MiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zeXNfbGFyZ2VmaWxlX0NDIiA+JjY7IH0KKyAgaWYgdGVzdCAiJGFjX2N2X3N5c19sYXJnZWZpbGVfQ0MiICE9IG5vOyB0aGVuCisgICAgQ0M9JENDJGFjX2N2X3N5c19sYXJnZWZpbGVfQ0MKKyAgZmkKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBfRklMRV9PRkZTRVRfQklUUyB2YWx1ZSBuZWVkZWQgZm9yIGxhcmdlIGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBfRklMRV9PRkZTRVRfQklUUyB2YWx1ZSBuZWVkZWQgZm9yIGxhcmdlIGZpbGVzLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3N5c19maWxlX29mZnNldF9iaXRzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgd2hpbGUgOjsgZG8KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorIC8qIENoZWNrIHRoYXQgb2ZmX3QgY2FuIHJlcHJlc2VudCAyKio2MyAtIDEgY29ycmVjdGx5LgorICAgIFdlIGNhbid0IHNpbXBseSBkZWZpbmUgTEFSR0VfT0ZGX1QgdG8gYmUgOTIyMzM3MjAzNjg1NDc3NTgwNywKKyAgICBzaW5jZSBzb21lIEMrKyBjb21waWxlcnMgbWFzcXVlcmFkaW5nIGFzIEMgY29tcGlsZXJzCisgICAgaW5jb3JyZWN0bHkgcmVqZWN0IDkyMjMzNzIwMzY4NTQ3NzU4MDcuICAqLworI2RlZmluZSBMQVJHRV9PRkZfVCAoKChvZmZfdCkgMSA8PCA2MikgLSAxICsgKChvZmZfdCkgMSA8PCA2MikpCisgIGludCBvZmZfdF9pc19sYXJnZVsoTEFSR0VfT0ZGX1QgJSAyMTQ3NDgzNjI5ID09IDcyMQorCQkgICAgICAgJiYgTEFSR0VfT0ZGX1QgJSAyMTQ3NDgzNjQ3ID09IDEpCisJCSAgICAgID8gMSA6IC0xXTsKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc3lzX2ZpbGVfb2Zmc2V0X2JpdHM9bm87IGJyZWFrCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVFMgNjQKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAvKiBDaGVjayB0aGF0IG9mZl90IGNhbiByZXByZXNlbnQgMioqNjMgLSAxIGNvcnJlY3RseS4KKyAgICBXZSBjYW4ndCBzaW1wbHkgZGVmaW5lIExBUkdFX09GRl9UIHRvIGJlIDkyMjMzNzIwMzY4NTQ3NzU4MDcsCisgICAgc2luY2Ugc29tZSBDKysgY29tcGlsZXJzIG1hc3F1ZXJhZGluZyBhcyBDIGNvbXBpbGVycworICAgIGluY29ycmVjdGx5IHJlamVjdCA5MjIzMzcyMDM2ODU0Nzc1ODA3LiAgKi8KKyNkZWZpbmUgTEFSR0VfT0ZGX1QgKCgob2ZmX3QpIDEgPDwgNjIpIC0gMSArICgob2ZmX3QpIDEgPDwgNjIpKQorICBpbnQgb2ZmX3RfaXNfbGFyZ2VbKExBUkdFX09GRl9UICUgMjE0NzQ4MzYyOSA9PSA3MjEKKwkJICAgICAgICYmIExBUkdFX09GRl9UICUgMjE0NzQ4MzY0NyA9PSAxKQorCQkgICAgICA/IDEgOiAtMV07CitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3N5c19maWxlX29mZnNldF9iaXRzPTY0OyBicmVhaworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBhY19jdl9zeXNfZmlsZV9vZmZzZXRfYml0cz11bmtub3duCisgIGJyZWFrCitkb25lCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zeXNfZmlsZV9vZmZzZXRfYml0cyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3N5c19maWxlX29mZnNldF9iaXRzIiA+JjY7IH0KK2Nhc2UgJGFjX2N2X3N5c19maWxlX29mZnNldF9iaXRzIGluICMoCisgIG5vIHwgdW5rbm93bikgOzsKKyAgKikKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVFMgJGFjX2N2X3N5c19maWxlX29mZnNldF9iaXRzCitfQUNFT0YKKzs7Citlc2FjCitybSAtcmYgY29uZnRlc3QqCisgIGlmIHRlc3QgJGFjX2N2X3N5c19maWxlX29mZnNldF9iaXRzID0gdW5rbm93bjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIF9MQVJHRV9GSUxFUyB2YWx1ZSBuZWVkZWQgZm9yIGxhcmdlIGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBfTEFSR0VfRklMRVMgdmFsdWUgbmVlZGVkIGZvciBsYXJnZSBmaWxlcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zeXNfbGFyZ2VfZmlsZXMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICB3aGlsZSA6OyBkbworICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgLyogQ2hlY2sgdGhhdCBvZmZfdCBjYW4gcmVwcmVzZW50IDIqKjYzIC0gMSBjb3JyZWN0bHkuCisgICAgV2UgY2FuJ3Qgc2ltcGx5IGRlZmluZSBMQVJHRV9PRkZfVCB0byBiZSA5MjIzMzcyMDM2ODU0Nzc1ODA3LAorICAgIHNpbmNlIHNvbWUgQysrIGNvbXBpbGVycyBtYXNxdWVyYWRpbmcgYXMgQyBjb21waWxlcnMKKyAgICBpbmNvcnJlY3RseSByZWplY3QgOTIyMzM3MjAzNjg1NDc3NTgwNy4gICovCisjZGVmaW5lIExBUkdFX09GRl9UICgoKG9mZl90KSAxIDw8IDYyKSAtIDEgKyAoKG9mZl90KSAxIDw8IDYyKSkKKyAgaW50IG9mZl90X2lzX2xhcmdlWyhMQVJHRV9PRkZfVCAlIDIxNDc0ODM2MjkgPT0gNzIxCisJCSAgICAgICAmJiBMQVJHRV9PRkZfVCAlIDIxNDc0ODM2NDcgPT0gMSkKKwkJICAgICAgPyAxIDogLTFdOworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9zeXNfbGFyZ2VfZmlsZXM9bm87IGJyZWFrCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNkZWZpbmUgX0xBUkdFX0ZJTEVTIDEKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAvKiBDaGVjayB0aGF0IG9mZl90IGNhbiByZXByZXNlbnQgMioqNjMgLSAxIGNvcnJlY3RseS4KKyAgICBXZSBjYW4ndCBzaW1wbHkgZGVmaW5lIExBUkdFX09GRl9UIHRvIGJlIDkyMjMzNzIwMzY4NTQ3NzU4MDcsCisgICAgc2luY2Ugc29tZSBDKysgY29tcGlsZXJzIG1hc3F1ZXJhZGluZyBhcyBDIGNvbXBpbGVycworICAgIGluY29ycmVjdGx5IHJlamVjdCA5MjIzMzcyMDM2ODU0Nzc1ODA3LiAgKi8KKyNkZWZpbmUgTEFSR0VfT0ZGX1QgKCgob2ZmX3QpIDEgPDwgNjIpIC0gMSArICgob2ZmX3QpIDEgPDwgNjIpKQorICBpbnQgb2ZmX3RfaXNfbGFyZ2VbKExBUkdFX09GRl9UICUgMjE0NzQ4MzYyOSA9PSA3MjEKKwkJICAgICAgICYmIExBUkdFX09GRl9UICUgMjE0NzQ4MzY0NyA9PSAxKQorCQkgICAgICA/IDEgOiAtMV07CitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3N5c19sYXJnZV9maWxlcz0xOyBicmVhaworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBhY19jdl9zeXNfbGFyZ2VfZmlsZXM9dW5rbm93bgorICBicmVhaworZG9uZQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc3lzX2xhcmdlX2ZpbGVzIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc3lzX2xhcmdlX2ZpbGVzIiA+JjY7IH0KK2Nhc2UgJGFjX2N2X3N5c19sYXJnZV9maWxlcyBpbiAjKAorICBubyB8IHVua25vd24pIDs7CisgICopCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIF9MQVJHRV9GSUxFUyAkYWNfY3Zfc3lzX2xhcmdlX2ZpbGVzCitfQUNFT0YKKzs7Citlc2FjCitybSAtcmYgY29uZnRlc3QqCisgIGZpCitmaQorCisKK2lmIHRlc3QgLXogIiRBUiIgOyB0aGVuCisJYXNfZm5fZXJyb3IgJD8gIioqKiAnYXInIG1pc3NpbmcsIHBsZWFzZSBpbnN0YWxsIG9yIGZpeCB5b3VyIFwkUEFUSCAqKioiICIkTElORU5PIiA1CitmaQorCisjIFVzZSBMT0dJTl9QUk9HUkFNIGZyb20gZW52aXJvbm1lbnQgaWYgcG9zc2libGUKK2lmIHRlc3QgISAteiAiJExPR0lOX1BST0dSQU0iIDsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIExPR0lOX1BST0dSQU1fRkFMTEJBQ0sgIiRMT0dJTl9QUk9HUkFNIgorX0FDRU9GCisKK2Vsc2UKKwkjIFNlYXJjaCBmb3IgbG9naW4KKwkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImxvZ2luIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBsb2dpbjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfTE9HSU5fUFJPR1JBTV9GQUxMQkFDSys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJExPR0lOX1BST0dSQU1fRkFMTEJBQ0sgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfTE9HSU5fUFJPR1JBTV9GQUxMQkFDSz0iJExPR0lOX1BST0dSQU1fRkFMTEJBQ0siICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wYXRoX0xPR0lOX1BST0dSQU1fRkFMTEJBQ0s9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitMT0dJTl9QUk9HUkFNX0ZBTExCQUNLPSRhY19jdl9wYXRoX0xPR0lOX1BST0dSQU1fRkFMTEJBQ0sKK2lmIHRlc3QgLW4gIiRMT0dJTl9QUk9HUkFNX0ZBTExCQUNLIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJExPR0lOX1BST0dSQU1fRkFMTEJBQ0siID4mNQorJGFzX2VjaG8gIiRMT0dJTl9QUk9HUkFNX0ZBTExCQUNLIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKwlpZiB0ZXN0ICEgLXogIiRMT0dJTl9QUk9HUkFNX0ZBTExCQUNLIiA7IHRoZW4KKwkJY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBMT0dJTl9QUk9HUkFNX0ZBTExCQUNLICIkTE9HSU5fUFJPR1JBTV9GQUxMQkFDSyIKK19BQ0VPRgorCisJZmkKK2ZpCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicGFzc3dkIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBwYXNzd2Q7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX1BBVEhfUEFTU1dEX1BST0crOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRQQVRIX1BBU1NXRF9QUk9HIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX1BBVEhfUEFTU1dEX1BST0c9IiRQQVRIX1BBU1NXRF9QUk9HIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9QQVRIX1BBU1NXRF9QUk9HPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorUEFUSF9QQVNTV0RfUFJPRz0kYWNfY3ZfcGF0aF9QQVRIX1BBU1NXRF9QUk9HCitpZiB0ZXN0IC1uICIkUEFUSF9QQVNTV0RfUFJPRyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQQVRIX1BBU1NXRF9QUk9HIiA+JjUKKyRhc19lY2hvICIkUEFUSF9QQVNTV0RfUFJPRyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitpZiB0ZXN0ICEgLXogIiRQQVRIX1BBU1NXRF9QUk9HIiA7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBfUEFUSF9QQVNTV0RfUFJPRyAiJFBBVEhfUEFTU1dEX1BST0ciCitfQUNFT0YKKworZmkKKworaWYgdGVzdCAteiAiJExEIiA7IHRoZW4KKwlMRD0kQ0MKK2ZpCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBpbmxpbmUuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfY19pbmxpbmUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jdl9jX2lubGluZT1ubworZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbworICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZuZGVmIF9fY3BsdXNwbHVzCit0eXBlZGVmIGludCBmb29fdDsKK3N0YXRpYyAkYWNfa3cgZm9vX3Qgc3RhdGljX2ZvbyAoKSB7cmV0dXJuIDA7IH0KKyRhY19rdyBmb29fdCBmb28gKCkge3JldHVybiAwOyB9CisjZW5kaWYKKworX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2NfaW5saW5lPSRhY19rdworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICB0ZXN0ICIkYWNfY3ZfY19pbmxpbmUiICE9IG5vICYmIGJyZWFrCitkb25lCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NfaW5saW5lIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfY19pbmxpbmUiID4mNjsgfQorCitjYXNlICRhY19jdl9jX2lubGluZSBpbgorICBpbmxpbmUgfCB5ZXMpIDs7CisgICopCisgICAgY2FzZSAkYWNfY3ZfY19pbmxpbmUgaW4KKyAgICAgIG5vKSBhY192YWw9OzsKKyAgICAgICopIGFjX3ZhbD0kYWNfY3ZfY19pbmxpbmU7OworICAgIGVzYWMKKyAgICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjaWZuZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIGlubGluZSAkYWNfdmFsCisjZW5kaWYKK19BQ0VPRgorICAgIDs7Citlc2FjCisKKworYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiTExPTkdfTUFYIiAiYWNfY3ZfaGF2ZV9kZWNsX0xMT05HX01BWCIgIiNpbmNsdWRlIDxsaW1pdHMuaD4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX0xMT05HX01BWCIgPSB4eWVzOyB0aGVuIDoKKyAgaGF2ZV9sbG9uZ19tYXg9MQorZmkKKworYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiU1lTVFJfUE9MSUNZX0tJTEwiICJhY19jdl9oYXZlX2RlY2xfU1lTVFJfUE9MSUNZX0tJTEwiICIKKwkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorCSNpbmNsdWRlIDxkZXYvc3lzdHJhY2UuaD4KKworIgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfU1lTVFJfUE9MSUNZX0tJTEwiID0geHllczsgdGhlbiA6CisgIGhhdmVfc3lzdHJfcG9saWN5X2tpbGw9MQorZmkKKworYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiUkxJTUlUX05QUk9DIiAiYWNfY3ZfaGF2ZV9kZWNsX1JMSU1JVF9OUFJPQyIgIgorCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisKKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX1JMSU1JVF9OUFJPQyIgPSB4eWVzOyB0aGVuIDoKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9STElNSVRfTlBST0MgLyoqLyIgPj5jb25mZGVmcy5oCisKK2ZpCisKK2FjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIlBSX1NFVF9OT19ORVdfUFJJVlMiICJhY19jdl9oYXZlX2RlY2xfUFJfU0VUX05PX05FV19QUklWUyIgIgorCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkjaW5jbHVkZSA8bGludXgvcHJjdGwuaD4KKworIgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfUFJfU0VUX05PX05FV19QUklWUyIgPSB4eWVzOyB0aGVuIDoKKyAgaGF2ZV9saW51eF9ub19uZXdfcHJpdnM9MQorZmkKKworaWYgdGVzdCAieCRoYXZlX2xpbnV4X25vX25ld19wcml2cyIgPSAieDEiIDsgdGhlbgorYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiU0VDQ09NUF9NT0RFX0ZJTFRFUiIgImFjX2N2X2hhdmVfZGVjbF9TRUNDT01QX01PREVfRklMVEVSIiAiCisJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSNpbmNsdWRlIDxsaW51eC9zZWNjb21wLmg+CisKKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX1NFQ0NPTVBfTU9ERV9GSUxURVIiID0geHllczsgdGhlbiA6CisgIGhhdmVfc2VjY29tcF9maWx0ZXI9MQorZmkKKworZmkKK2lmIHRlc3QgIngkaGF2ZV9zZWNjb21wX2ZpbHRlciIgPSAieDEiIDsgdGhlbgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBrZXJuZWwgZm9yIHNlY2NvbXBfZmlsdGVyIHN1cHBvcnQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcga2VybmVsIGZvciBzZWNjb21wX2ZpbHRlciBzdXBwb3J0Li4uICIgPiY2OyB9CitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogY3Jvc3MtY29tcGlsaW5nLCBhc3N1bWluZyB5ZXMiID4mNQorJGFzX2VjaG8gImNyb3NzLWNvbXBpbGluZywgYXNzdW1pbmcgeWVzIiA+JjY7IH0KKworZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKwkJI2luY2x1ZGUgPGVycm5vLmg+CisJCSNpbmNsdWRlIDxsaW51eC9zZWNjb21wLmg+CisJCSNpbmNsdWRlIDxzdGRsaWIuaD4KKwkJI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorCitpbnQKK21haW4gKCkKK3sKKyBlcnJubyA9IDA7CisJICAgcHJjdGwoUFJfU0VUX1NFQ0NPTVAsIFNFQ0NPTVBfTU9ERV9GSUxURVIsIE5VTEwsIDAsIDApOworCSAgIGV4aXQoZXJybm8gPT0gRUZBVUxUID8gMCA6IDEpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CitlbHNlCisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCSMgRGlzYWJsZSBzZWNjb21wIGZpbHRlciBhcyBhIHRhcmdldAorCQloYXZlX3NlY2NvbXBfZmlsdGVyPTAKKworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCisKK3VzZV9zdGFja19wcm90ZWN0b3I9MQorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXN0YWNrcHJvdGVjdCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfc3RhY2twcm90ZWN0K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9zdGFja3Byb3RlY3Q7CisgICAgaWYgdGVzdCAieCR3aXRodmFsIiA9ICJ4bm8iOyB0aGVuCisJdXNlX3N0YWNrX3Byb3RlY3Rvcj0wCisgICAgZmkKK2ZpCisKKworCitpZiB0ZXN0ICIkR0NDIiA9ICJ5ZXMiIHx8IHRlc3QgIiRHQ0MiID0gImVnY3MiOyB0aGVuCisJeworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJENDIHN1cHBvcnRzIC1XYWxsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRDQyBzdXBwb3J0cyAtV2FsbC4uLiAiID4mNjsgfQorCXNhdmVkX0NGTEFHUz0iJENGTEFHUyIKKwlDRkxBR1M9IiRDRkxBR1MgLVdhbGwiCisJX2RlZmluZV9mbGFnPSIiCisJdGVzdCAieCRfZGVmaW5lX2ZsYWciID0gIngiICYmIF9kZWZpbmVfZmxhZz0iLVdhbGwiCisJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworaW50IG1haW4odm9pZCkgeyByZXR1cm4gMDsgfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCQkgIENGTEFHUz0iJHNhdmVkX0NGTEFHUyAkX2RlZmluZV9mbGFnIgorZWxzZQorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCSAgQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTIgorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cit9CisJeworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJENDIHN1cHBvcnRzIC1XcG9pbnRlci1hcml0aCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkQ0Mgc3VwcG9ydHMgLVdwb2ludGVyLWFyaXRoLi4uICIgPiY2OyB9CisJc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgorCUNGTEFHUz0iJENGTEFHUyAtV3BvaW50ZXItYXJpdGgiCisJX2RlZmluZV9mbGFnPSIiCisJdGVzdCAieCRfZGVmaW5lX2ZsYWciID0gIngiICYmIF9kZWZpbmVfZmxhZz0iLVdwb2ludGVyLWFyaXRoIgorCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KK2ludCBtYWluKHZvaWQpIHsgcmV0dXJuIDA7IH0KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwkJICBDRkxBR1M9IiRzYXZlZF9DRkxBR1MgJF9kZWZpbmVfZmxhZyIKK2Vsc2UKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCQkgIENGTEFHUz0iJHNhdmVkX0NGTEFHUyIKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorfQorCXsKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRDQyBzdXBwb3J0cyAtV3VuaW5pdGlhbGl6ZWQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJENDIHN1cHBvcnRzIC1XdW5pbml0aWFsaXplZC4uLiAiID4mNjsgfQorCXNhdmVkX0NGTEFHUz0iJENGTEFHUyIKKwlDRkxBR1M9IiRDRkxBR1MgLVd1bmluaXRpYWxpemVkIgorCV9kZWZpbmVfZmxhZz0iIgorCXRlc3QgIngkX2RlZmluZV9mbGFnIiA9ICJ4IiAmJiBfZGVmaW5lX2ZsYWc9Ii1XdW5pbml0aWFsaXplZCIKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCitpbnQgbWFpbih2b2lkKSB7IHJldHVybiAwOyB9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJCSAgQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTICRfZGVmaW5lX2ZsYWciCitlbHNlCisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwkJICBDRkxBR1M9IiRzYXZlZF9DRkxBR1MiCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK30KKwl7CisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkQ0Mgc3VwcG9ydHMgLVdzaWduLWNvbXBhcmUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJENDIHN1cHBvcnRzIC1Xc2lnbi1jb21wYXJlLi4uICIgPiY2OyB9CisJc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgorCUNGTEFHUz0iJENGTEFHUyAtV3NpZ24tY29tcGFyZSIKKwlfZGVmaW5lX2ZsYWc9IiIKKwl0ZXN0ICJ4JF9kZWZpbmVfZmxhZyIgPSAieCIgJiYgX2RlZmluZV9mbGFnPSItV3NpZ24tY29tcGFyZSIKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCitpbnQgbWFpbih2b2lkKSB7IHJldHVybiAwOyB9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJCSAgQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTICRfZGVmaW5lX2ZsYWciCitlbHNlCisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwkJICBDRkxBR1M9IiRzYXZlZF9DRkxBR1MiCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK30KKwl7CisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkQ0Mgc3VwcG9ydHMgLVdmb3JtYXQtc2VjdXJpdHkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJENDIHN1cHBvcnRzIC1XZm9ybWF0LXNlY3VyaXR5Li4uICIgPiY2OyB9CisJc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgorCUNGTEFHUz0iJENGTEFHUyAtV2Zvcm1hdC1zZWN1cml0eSIKKwlfZGVmaW5lX2ZsYWc9IiIKKwl0ZXN0ICJ4JF9kZWZpbmVfZmxhZyIgPSAieCIgJiYgX2RlZmluZV9mbGFnPSItV2Zvcm1hdC1zZWN1cml0eSIKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCitpbnQgbWFpbih2b2lkKSB7IHJldHVybiAwOyB9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJCSAgQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTICRfZGVmaW5lX2ZsYWciCitlbHNlCisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwkJICBDRkxBR1M9IiRzYXZlZF9DRkxBR1MiCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK30KKwl7CisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkQ0Mgc3VwcG9ydHMgLVdwb2ludGVyLXNpZ24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJENDIHN1cHBvcnRzIC1XcG9pbnRlci1zaWduLi4uICIgPiY2OyB9CisJc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgorCUNGTEFHUz0iJENGTEFHUyAtV3BvaW50ZXItc2lnbiIKKwlfZGVmaW5lX2ZsYWc9Ii1Xbm8tcG9pbnRlci1zaWduIgorCXRlc3QgIngkX2RlZmluZV9mbGFnIiA9ICJ4IiAmJiBfZGVmaW5lX2ZsYWc9Ii1XcG9pbnRlci1zaWduIgorCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KK2ludCBtYWluKHZvaWQpIHsgcmV0dXJuIDA7IH0KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwkJICBDRkxBR1M9IiRzYXZlZF9DRkxBR1MgJF9kZWZpbmVfZmxhZyIKK2Vsc2UKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCQkgIENGTEFHUz0iJHNhdmVkX0NGTEFHUyIKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorfQorCXsKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRDQyBzdXBwb3J0cyAtV3VudXNlZC1yZXN1bHQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJENDIHN1cHBvcnRzIC1XdW51c2VkLXJlc3VsdC4uLiAiID4mNjsgfQorCXNhdmVkX0NGTEFHUz0iJENGTEFHUyIKKwlDRkxBR1M9IiRDRkxBR1MgLVd1bnVzZWQtcmVzdWx0IgorCV9kZWZpbmVfZmxhZz0iLVduby11bnVzZWQtcmVzdWx0IgorCXRlc3QgIngkX2RlZmluZV9mbGFnIiA9ICJ4IiAmJiBfZGVmaW5lX2ZsYWc9Ii1XdW51c2VkLXJlc3VsdCIKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCitpbnQgbWFpbih2b2lkKSB7IHJldHVybiAwOyB9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJCSAgQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTICRfZGVmaW5lX2ZsYWciCitlbHNlCisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwkJICBDRkxBR1M9IiRzYXZlZF9DRkxBR1MiCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK30KKwl7CisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkQ0Mgc3VwcG9ydHMgLWZuby1zdHJpY3QtYWxpYXNpbmciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJENDIHN1cHBvcnRzIC1mbm8tc3RyaWN0LWFsaWFzaW5nLi4uICIgPiY2OyB9CisJc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgorCUNGTEFHUz0iJENGTEFHUyAtZm5vLXN0cmljdC1hbGlhc2luZyIKKwlfZGVmaW5lX2ZsYWc9IiIKKwl0ZXN0ICJ4JF9kZWZpbmVfZmxhZyIgPSAieCIgJiYgX2RlZmluZV9mbGFnPSItZm5vLXN0cmljdC1hbGlhc2luZyIKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCitpbnQgbWFpbih2b2lkKSB7IHJldHVybiAwOyB9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJCSAgQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTICRfZGVmaW5lX2ZsYWciCitlbHNlCisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwkJICBDRkxBR1M9IiRzYXZlZF9DRkxBR1MiCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK30KKwl7CisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkQ0Mgc3VwcG9ydHMgLURfRk9SVElGWV9TT1VSQ0U9MiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkQ0Mgc3VwcG9ydHMgLURfRk9SVElGWV9TT1VSQ0U9Mi4uLiAiID4mNjsgfQorCXNhdmVkX0NGTEFHUz0iJENGTEFHUyIKKwlDRkxBR1M9IiRDRkxBR1MgLURfRk9SVElGWV9TT1VSQ0U9MiIKKwlfZGVmaW5lX2ZsYWc9IiIKKwl0ZXN0ICJ4JF9kZWZpbmVfZmxhZyIgPSAieCIgJiYgX2RlZmluZV9mbGFnPSItRF9GT1JUSUZZX1NPVVJDRT0yIgorCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KK2ludCBtYWluKHZvaWQpIHsgcmV0dXJuIDA7IH0KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwkJICBDRkxBR1M9IiRzYXZlZF9DRkxBR1MgJF9kZWZpbmVfZmxhZyIKK2Vsc2UKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCQkgIENGTEFHUz0iJHNhdmVkX0NGTEFHUyIKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorfQorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZ2NjIHZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZ2NjIHZlcnNpb24uLi4gIiA+JjY7IH0KKwlHQ0NfVkVSPWAkQ0MgLXYgMj4mMSB8ICRBV0sgJy9nY2MgdmVyc2lvbiAve3ByaW50ICQzfSdgCisJY2FzZSAkR0NDX1ZFUiBpbgorCQkxLiopIG5vX2F0dHJpYl9ub25udWxsPTEgOzsKKwkJMi44KiB8IDIuOSopCisJCSAgICAgbm9fYXR0cmliX25vbm51bGw9MQorCQkgICAgIDs7CisJCTIuKikgbm9fYXR0cmliX25vbm51bGw9MSA7OworCQkqKSA7OworCWVzYWMKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEdDQ19WRVIiID4mNQorJGFzX2VjaG8gIiRHQ0NfVkVSIiA+JjY7IH0KKworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJENDIGFjY2VwdHMgLWZuby1idWlsdGluLW1lbXNldCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkQ0MgYWNjZXB0cyAtZm5vLWJ1aWx0aW4tbWVtc2V0Li4uICIgPiY2OyB9CisJc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgorCUNGTEFHUz0iJENGTEFHUyAtZm5vLWJ1aWx0aW4tbWVtc2V0IgorCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyAjaW5jbHVkZSA8c3RyaW5nLmg+CitpbnQKK21haW4gKCkKK3sKKyBjaGFyIGJbMTBdOyBtZW1zZXQoYiwgMCwgc2l6ZW9mKGIpKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK2Vsc2UKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCQkgIENGTEFHUz0iJHNhdmVkX0NGTEFHUyIKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisKKwkjIC1mc3RhY2stcHJvdGVjdG9yLWFsbCBkb2Vzbid0IGFsd2F5cyB3b3JrIGZvciBzb21lIEdDQyB2ZXJzaW9ucworCSMgYW5kL29yIHBsYXRmb3Jtcywgc28gd2UgdGVzdCBpZiB3ZSBjYW4uICBJZiBpdCdzIG5vdCBzdXBwb3J0ZWQKKwkjIG9uIGEgZ2l2ZW4gcGxhdGZvcm0gZ2NjIHdpbGwgZW1pdCBhIHdhcm5pbmcgc28gd2UgdXNlIC1XZXJyb3IuCisJaWYgdGVzdCAieCR1c2Vfc3RhY2tfcHJvdGVjdG9yIiA9ICJ4MSI7IHRoZW4KKwkgICAgZm9yIHQgaW4gLWZzdGFjay1wcm90ZWN0b3ItYWxsIC1mc3RhY2stcHJvdGVjdG9yOyBkbworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRDQyBzdXBwb3J0cyAkdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkQ0Mgc3VwcG9ydHMgJHQuLi4gIiA+JjY7IH0KKwkJc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgorCQlzYXZlZF9MREZMQUdTPSIkTERGTEFHUyIKKwkJQ0ZMQUdTPSIkQ0ZMQUdTICR0IC1XZXJyb3IiCisJCUxERkxBR1M9IiRMREZMQUdTICR0IC1XZXJyb3IiCisJCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyAjaW5jbHVkZSA8c3RkaW8uaD4KK2ludAorbWFpbiAoKQoreworCisJY2hhciB4WzI1Nl07CisJc25wcmludGYoeCwgc2l6ZW9mKHgpLCAiWFhYIik7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwkJICAgICAgQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTICR0IgorCQkgICAgICBMREZMQUdTPSIkc2F2ZWRfTERGTEFHUyAkdCIKKwkJICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkdCB3b3JrcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkdCB3b3Jrcy4uLiAiID4mNjsgfQorCQkgICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogY2Fubm90IHRlc3QiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY3Jvc3MgY29tcGlsaW5nOiBjYW5ub3QgdGVzdCIgPiYyO30KKwkJCSAgYnJlYWsKKworZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisgI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQKK21haW4gKCkKK3sKKworCWNoYXIgeFsyNTZdOworCXNucHJpbnRmKHgsIHNpemVvZih4KSwgIlhYWCIpOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwkJCSAgYnJlYWsKK2Vsc2UKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKworZWxzZQorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCQlDRkxBR1M9IiRzYXZlZF9DRkxBR1MiCisJCUxERkxBR1M9IiRzYXZlZF9MREZMQUdTIgorCSAgICBkb25lCisJZmkKKworCWlmIHRlc3QgLXogIiRoYXZlX2xsb25nX21heCI7IHRoZW4KKwkJIyByZXRyeSBMTE9OR19NQVggd2l0aCAtc3RkPWdudTk5LCBuZWVkZWQgb24gc29tZSBMaW51eGVzCisJCXVuc2V0IGFjX2N2X2hhdmVfZGVjbF9MTE9OR19NQVgKKwkJc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgorCQlDRkxBR1M9IiRDRkxBR1MgLXN0ZD1nbnU5OSIKKwkJYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiTExPTkdfTUFYIiAiYWNfY3ZfaGF2ZV9kZWNsX0xMT05HX01BWCIgIiNpbmNsdWRlIDxsaW1pdHMuaD4KKworIgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfTExPTkdfTUFYIiA9IHh5ZXM7IHRoZW4gOgorICBoYXZlX2xsb25nX21heD0xCitlbHNlCisgIENGTEFHUz0iJHNhdmVkX0NGTEFHUyIKK2ZpCisKKwlmaQorZmkKKworaWYgdGVzdCAieCRub19hdHRyaWJfbm9ubnVsbCIgIT0gIngxIiA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9BVFRSSUJVVEVfX05PTk5VTExfXyAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXJwYXRoIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9ycGF0aCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfcnBhdGg7CisJCWlmIHRlc3QgIngkd2l0aHZhbCIgPSAieG5vIiA7IHRoZW4KKwkJCW5lZWRfZGFzaF9yPSIiCisJCWZpCisJCWlmIHRlc3QgIngkd2l0aHZhbCIgPSAieHllcyIgOyB0aGVuCisJCQluZWVkX2Rhc2hfcj0xCisJCWZpCisKKworZmkKKworCisjIEFsbG93IHVzZXIgdG8gc3BlY2lmeSBmbGFncworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWNmbGFncyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfY2ZsYWdzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9jZmxhZ3M7CisJCWlmIHRlc3QgLW4gIiR3aXRodmFsIiAgJiYgIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgICYmICBcCisJCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCisJCQlDRkxBR1M9IiRDRkxBR1MgJHdpdGh2YWwiCisJCWZpCisKKworZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWNwcGZsYWdzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9jcHBmbGFncytzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfY3BwZmxhZ3M7CisJCWlmIHRlc3QgLW4gIiR3aXRodmFsIiAgJiYgIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgICYmICBcCisJCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCisJCQlDUFBGTEFHUz0iJENQUEZMQUdTICR3aXRodmFsIgorCQlmaQorCisKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1sZGZsYWdzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9sZGZsYWdzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9sZGZsYWdzOworCQlpZiB0ZXN0IC1uICIkd2l0aHZhbCIgICYmICB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iICAmJiAgXAorCQkgICAgdGVzdCAieCR7d2l0aHZhbH0iICE9ICJ4eWVzIjsgdGhlbgorCQkJTERGTEFHUz0iJExERkxBR1MgJHdpdGh2YWwiCisJCWZpCisKKworZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWxpYnMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2xpYnMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2xpYnM7CisJCWlmIHRlc3QgLW4gIiR3aXRodmFsIiAgJiYgIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgICYmICBcCisJCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCisJCQlMSUJTPSIkTElCUyAkd2l0aHZhbCIKKwkJZmkKKworCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtV2Vycm9yIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9XZXJyb3Irc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX1dlcnJvcjsKKwkJaWYgdGVzdCAtbiAiJHdpdGh2YWwiICAmJiAgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIjsgdGhlbgorCQkJd2Vycm9yX2ZsYWdzPSItV2Vycm9yIgorCQkJaWYgdGVzdCAieCR7d2l0aHZhbH0iICE9ICJ4eWVzIjsgdGhlbgorCQkJCXdlcnJvcl9mbGFncz0iJHdpdGh2YWwiCisJCQlmaQorCQlmaQorCisKK2ZpCisKKworZm9yIGFjX2hlYWRlciBpbiAgXAorCWJzdHJpbmcuaCBcCisJY3J5cHQuaCBcCisJY3J5cHRvL3NoYTIuaCBcCisJZGlyZW50LmggXAorCWVuZGlhbi5oIFwKKwlmZWF0dXJlcy5oIFwKKwlmY250bC5oIFwKKwlmbG9hdGluZ3BvaW50LmggXAorCWdldG9wdC5oIFwKKwlnbG9iLmggXAorCWlhLmggXAorCWlhZi5oIFwKKwlsaW1pdHMuaCBcCisJbG9naW4uaCBcCisJbWFpbGxvY2suaCBcCisJbmRpci5oIFwKKwluZXQvaWZfdHVuLmggXAorCW5ldGRiLmggXAorCW5ldGdyb3VwLmggXAorCXBhbS9wYW1fYXBwbC5oIFwKKwlwYXRocy5oIFwKKwlwb2xsLmggXAorCXB0eS5oIFwKKwlyZWFkcGFzc3BocmFzZS5oIFwKKwlycGMvdHlwZXMuaCBcCisJc2VjdXJpdHkvcGFtX2FwcGwuaCBcCisJc2hhMi5oIFwKKwlzaGFkb3cuaCBcCisJc3RkZGVmLmggXAorCXN0ZGludC5oIFwKKwlzdHJpbmcuaCBcCisJc3RyaW5ncy5oIFwKKwlzeXMvYXVkaXQuaCBcCisJc3lzL2JpdHlwZXMuaCBcCisJc3lzL2JzZHR0eS5oIFwKKwlzeXMvY2RlZnMuaCBcCisJc3lzL2Rpci5oIFwKKwlzeXMvbW1hbi5oIFwKKwlzeXMvbmRpci5oIFwKKwlzeXMvcG9sbC5oIFwKKwlzeXMvcHJjdGwuaCBcCisJc3lzL3BzdGF0LmggXAorCXN5cy9zZWxlY3QuaCBcCisJc3lzL3N0YXQuaCBcCisJc3lzL3N0cmVhbS5oIFwKKwlzeXMvc3Ryb3B0cy5oIFwKKwlzeXMvc3RydGlvLmggXAorCXN5cy9zdGF0dmZzLmggXAorCXN5cy9zeXNtYWNyb3MuaCBcCisJc3lzL3RpbWUuaCBcCisJc3lzL3RpbWVycy5oIFwKKwlzeXMvdW4uaCBcCisJdGltZS5oIFwKKwl0bXBkaXIuaCBcCisJdHR5ZW50LmggXAorCXVjcmVkLmggXAorCXVuaXN0ZC5oIFwKKwl1c2Vyc2VjLmggXAorCXV0aWwuaCBcCisJdXRpbWUuaCBcCisJdXRtcC5oIFwKKwl1dG1weC5oIFwKKwl2aXMuaCBcCisKK2RvIDoKKyAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCisjIGxhc3Rsb2cuaCByZXF1aXJlcyBzeXMvdGltZS5oIHRvIGJlIGluY2x1ZGVkIGZpcnN0IG9uIFNvbGFyaXMKK2ZvciBhY19oZWFkZXIgaW4gbGFzdGxvZy5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICJsYXN0bG9nLmgiICJhY19jdl9oZWFkZXJfbGFzdGxvZ19oIiAiCisjaWZkZWYgSEFWRV9TWVNfVElNRV9ICisjIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworIgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbGFzdGxvZ19oIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTEFTVExPR19IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworIyBzeXMvcHRtcy5oIHJlcXVpcmVzIHN5cy9zdHJlYW0uaCB0byBiZSBpbmNsdWRlZCBmaXJzdCBvbiBTb2xhcmlzCitmb3IgYWNfaGVhZGVyIGluIHN5cy9wdG1zLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgInN5cy9wdG1zLmgiICJhY19jdl9oZWFkZXJfc3lzX3B0bXNfaCIgIgorI2lmZGVmIEhBVkVfU1lTX1NUUkVBTV9ICisjIGluY2x1ZGUgPHN5cy9zdHJlYW0uaD4KKyNlbmRpZgorCisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9zeXNfcHRtc19oIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfU1lTX1BUTVNfSCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisKKyMgbG9naW5fY2FwLmggcmVxdWlyZXMgc3lzL3R5cGVzLmggb24gTmV0QlNECitmb3IgYWNfaGVhZGVyIGluIGxvZ2luX2NhcC5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICJsb2dpbl9jYXAuaCIgImFjX2N2X2hlYWRlcl9sb2dpbl9jYXBfaCIgIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9sb2dpbl9jYXBfaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0xPR0lOX0NBUF9IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworIyBvbGRlciBCU0RzIG5lZWQgc3lzL3BhcmFtLmggYmVmb3JlIHN5cy9tb3VudC5oCitmb3IgYWNfaGVhZGVyIGluIHN5cy9tb3VudC5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICJzeXMvbW91bnQuaCIgImFjX2N2X2hlYWRlcl9zeXNfbW91bnRfaCIgIgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorCisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9zeXNfbW91bnRfaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1NZU19NT1VOVF9IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworIyBNZXNzYWdlcyBmb3IgZmVhdHVyZXMgdGVzdGVkIGZvciBpbiB0YXJnZXQtc3BlY2lmaWMgc2VjdGlvbgorU0lBX01TRz0ibm8iCitTUENfTVNHPSJubyIKK1NQX01TRz0ibm8iCisKKyMgQ2hlY2sgZm9yIHNvbWUgdGFyZ2V0LXNwZWNpZmljIHN0dWZmCitjYXNlICIkaG9zdCIgaW4KKyotKi1haXgqKQorCSMgU29tZSB2ZXJzaW9ucyBvZiBWQUMgd29uJ3QgYWxsb3cgbWFjcm8gcmVkZWZpbml0aW9ucyBhdAorCSMgLXFsYW5nbGV2ZWw9YW5zaSwgYW5kIGF1dG9jb25mIDIuNjAgc29tZXRpbWVzIGluc2lzdHMgb24gdXNpbmcgdGhhdAorCSMgcGFydGljdWxhcmx5IHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgdmFjIG9yIHhsYy4KKwkjIEl0IGFsc28gdGhyb3dzIGVycm9ycyBhYm91dCBudWxsIG1hY3JvIGFyZ21lbnRzLCBidXQgdGhlc2UgYXJlCisJIyBub3QgZmF0YWwuCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBjb21waWxlciBhbGxvd3MgbWFjcm8gcmVkZWZpbml0aW9ucyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiBjb21waWxlciBhbGxvd3MgbWFjcm8gcmVkZWZpbml0aW9ucy4uLiAiID4mNjsgfQorCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2RlZmluZSB0ZXN0bWFjcm8gZm9vCisjZGVmaW5lIHRlc3RtYWNybyBiYXIKK2ludAorbWFpbiAoKQoreworIGV4aXQoMCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CitlbHNlCisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwkgICAgICBDQz0iYGVjaG8gJENDIHwgc2VkICdzLy1xbGFuZ2x2bFw9YW5zaS8vZydgIgorCSAgICAgIExEPSJgZWNobyAkTEQgfCBzZWQgJ3MvLXFsYW5nbHZsXD1hbnNpLy9nJ2AiCisJICAgICAgQ0ZMQUdTPSJgZWNobyAkQ0ZMQUdTIHwgc2VkICdzLy1xbGFuZ2x2bFw9YW5zaS8vZydgIgorCSAgICAgIENQUEZMQUdTPSJgZWNobyAkQ1BQRkxBR1MgfCBzZWQgJ3MvLXFsYW5nbHZsXD1hbnNpLy9nJ2AiCisKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gc3BlY2lmeSBibGlicGF0aCBmb3IgbGlua2VyICgkTEQpIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBzcGVjaWZ5IGJsaWJwYXRoIGZvciBsaW5rZXIgKCRMRCkuLi4gIiA+JjY7IH0KKwlpZiAodGVzdCAteiAiJGJsaWJwYXRoIik7IHRoZW4KKwkJYmxpYnBhdGg9Ii91c3IvbGliOi9saWIiCisJZmkKKwlzYXZlZF9MREZMQUdTPSIkTERGTEFHUyIKKwlpZiB0ZXN0ICIkR0NDIiA9ICJ5ZXMiOyB0aGVuCisJCWZsYWdzPSItV2wsLWJsaWJwYXRoOiAtV2wsLXJwYXRoLCAtYmxpYnBhdGg6IgorCWVsc2UKKwkJZmxhZ3M9Ii1ibGlicGF0aDogLVdsLC1ibGlicGF0aDogLVdsLC1ycGF0aCwiCisJZmkKKwlmb3IgdHJ5ZmxhZ3MgaW4gJGZsYWdzIDtkbworCQlpZiAodGVzdCAteiAiJGJsaWJmbGFncyIpOyB0aGVuCisJCQlMREZMQUdTPSIkc2F2ZWRfTERGTEFHUyAkdHJ5ZmxhZ3MkYmxpYnBhdGgiCisJCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYmxpYmZsYWdzPSR0cnlmbGFncworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisJCWZpCisJZG9uZQorCWlmICh0ZXN0IC16ICIkYmxpYmZsYWdzIik7IHRoZW4KKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vdCBmb3VuZCIgPiY1CiskYXNfZWNobyAibm90IGZvdW5kIiA+JjY7IH0KKwkJYXNfZm5fZXJyb3IgJD8gIioqKiBtdXN0IGJlIGFibGUgdG8gc3BlY2lmeSBibGlicGF0aCBvbiBBSVggLSBjaGVjayBjb25maWcubG9nIiAiJExJTkVOTyIgNQorCWVsc2UKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRibGliZmxhZ3MiID4mNQorJGFzX2VjaG8gIiRibGliZmxhZ3MiID4mNjsgfQorCWZpCisJTERGTEFHUz0iJHNhdmVkX0xERkxBR1MiCisJCWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImF1dGhlbnRpY2F0ZSIgImFjX2N2X2Z1bmNfYXV0aGVudGljYXRlIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX2F1dGhlbnRpY2F0ZSIgPSB4eWVzOyB0aGVuIDoKKworJGFzX2VjaG8gIiNkZWZpbmUgV0lUSF9BSVhBVVRIRU5USUNBVEUgMSIgPj5jb25mZGVmcy5oCisKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYXV0aGVudGljYXRlIGluIC1scyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgYXV0aGVudGljYXRlIGluIC1scy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfc19hdXRoZW50aWNhdGUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHMgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGF1dGhlbnRpY2F0ZSAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGF1dGhlbnRpY2F0ZSAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfc19hdXRoZW50aWNhdGU9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9zX2F1dGhlbnRpY2F0ZT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfc19hdXRoZW50aWNhdGUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfc19hdXRoZW50aWNhdGUiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfc19hdXRoZW50aWNhdGUiID0geHllczsgdGhlbiA6CisgICAkYXNfZWNobyAiI2RlZmluZSBXSVRIX0FJWEFVVEhFTlRJQ0FURSAxIiA+PmNvbmZkZWZzLmgKKworCQkJCUxJQlM9IiRMSUJTIC1scyIKKworZmkKKworCitmaQorCisJCWFjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgImF1dGhlbnRpY2F0ZSIgImFjX2N2X2hhdmVfZGVjbF9hdXRoZW50aWNhdGUiICIjaW5jbHVkZSA8dXNlcnNlYy5oPgorIgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfYXV0aGVudGljYXRlIiA9IHh5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfQVVUSEVOVElDQVRFICRhY19oYXZlX2RlY2wKK19BQ0VPRgorYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAibG9naW5yZXN0cmljdGlvbnMiICJhY19jdl9oYXZlX2RlY2xfbG9naW5yZXN0cmljdGlvbnMiICIjaW5jbHVkZSA8dXNlcnNlYy5oPgorIgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfbG9naW5yZXN0cmljdGlvbnMiID0geHllczsgdGhlbiA6CisgIGFjX2hhdmVfZGVjbD0xCitlbHNlCisgIGFjX2hhdmVfZGVjbD0wCitmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfREVDTF9MT0dJTlJFU1RSSUNUSU9OUyAkYWNfaGF2ZV9kZWNsCitfQUNFT0YKK2FjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgImxvZ2luc3VjY2VzcyIgImFjX2N2X2hhdmVfZGVjbF9sb2dpbnN1Y2Nlc3MiICIjaW5jbHVkZSA8dXNlcnNlYy5oPgorIgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfbG9naW5zdWNjZXNzIiA9IHh5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfTE9HSU5TVUNDRVNTICRhY19oYXZlX2RlY2wKK19BQ0VPRgorYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAicGFzc3dkZXhwaXJlZCIgImFjX2N2X2hhdmVfZGVjbF9wYXNzd2RleHBpcmVkIiAiI2luY2x1ZGUgPHVzZXJzZWMuaD4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX3Bhc3N3ZGV4cGlyZWQiID0geHllczsgdGhlbiA6CisgIGFjX2hhdmVfZGVjbD0xCitlbHNlCisgIGFjX2hhdmVfZGVjbD0wCitmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfREVDTF9QQVNTV0RFWFBJUkVEICRhY19oYXZlX2RlY2wKK19BQ0VPRgorYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAic2V0YXV0aGRiIiAiYWNfY3ZfaGF2ZV9kZWNsX3NldGF1dGhkYiIgIiNpbmNsdWRlIDx1c2Vyc2VjLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9zZXRhdXRoZGIiID0geHllczsgdGhlbiA6CisgIGFjX2hhdmVfZGVjbD0xCitlbHNlCisgIGFjX2hhdmVfZGVjbD0wCitmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfREVDTF9TRVRBVVRIREIgJGFjX2hhdmVfZGVjbAorX0FDRU9GCisKKwkJYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAibG9naW5mYWlsZWQiICJhY19jdl9oYXZlX2RlY2xfbG9naW5mYWlsZWQiICIjaW5jbHVkZSA8dXNlcnNlYy5oPgorCisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9sb2dpbmZhaWxlZCIgPSB4eWVzOyB0aGVuIDoKKyAgYWNfaGF2ZV9kZWNsPTEKK2Vsc2UKKyAgYWNfaGF2ZV9kZWNsPTAKK2ZpCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ERUNMX0xPR0lORkFJTEVEICRhY19oYXZlX2RlY2wKK19BQ0VPRgoraWYgdGVzdCAkYWNfaGF2ZV9kZWNsID0gMTsgdGhlbiA6CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgbG9naW5mYWlsZWQgdGFrZXMgNCBhcmd1bWVudHMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgbG9naW5mYWlsZWQgdGFrZXMgNCBhcmd1bWVudHMuLi4gIiA+JjY7IH0KKwkgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworICNpbmNsdWRlIDx1c2Vyc2VjLmg+CitpbnQKK21haW4gKCkKK3sKKyAodm9pZClsb2dpbmZhaWxlZCgidXNlciIsImhvc3QiLCJ0dHkiLDApOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisKKyRhc19lY2hvICIjZGVmaW5lIEFJWF9MT0dJTkZBSUxFRF80QVJHIDEiID4+Y29uZmRlZnMuaAorCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCisJZm9yIGFjX2Z1bmMgaW4gZ2V0Z3JzZXQgc2V0YXV0aGRiCitkbyA6CisgIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKK2RvbmUKKworCWFjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIkZfQ0xPU0VNIiAiYWNfY3ZfaGF2ZV9kZWNsX0ZfQ0xPU0VNIiAiICNpbmNsdWRlIDxsaW1pdHMuaD4KKwkgICAgICAjaW5jbHVkZSA8ZmNudGwuaD4KKworIgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfRl9DTE9TRU0iID0geHllczsgdGhlbiA6CisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfRkNOVExfQ0xPU0VNIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisJY2hlY2tfZm9yX2FpeF9icm9rZW5fZ2V0YWRkcmluZm89MQorCiskYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fUkVBTFBBVEggMSIgPj5jb25mZGVmcy5oCisKKworJGFzX2VjaG8gIiNkZWZpbmUgU0VURVVJRF9CUkVBS1NfU0VUVUlEIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9TRVRSRVVJRCAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVHSUQgMSIgPj5jb25mZGVmcy5oCisKKworJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9MQVNUTE9HIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIExPR0lOX05FRURTX1VUTVBYIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIFNQVF9UWVBFIFNQVF9SRVVTRUFSR1YiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIFNTSFBBTV9DSEFVVEhUT0tfTkVFRFNfUlVJRCAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBQVFlfWkVST1JFQUQgMSIgPj5jb25mZGVmcy5oCisKKwk7OworKi0qLWN5Z3dpbiopCisJY2hlY2tfZm9yX2xpYmNyeXB0X2xhdGVyPTEKKwlMSUJTPSIkTElCUyAvdXNyL2xpYi90ZXh0cmVhZG1vZGUubyIKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9DWUdXSU4gMSIgPj5jb25mZGVmcy5oCisKKworJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1BJUEVTIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIERJU0FCTEVfU0hBRE9XIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIE5PX1gxMV9VTklYX1NPQ0tFVFMgMSIgPj5jb25mZGVmcy5oCisKKworJGFzX2VjaG8gIiNkZWZpbmUgTk9fSVBQT1JUX1JFU0VSVkVEX0NPTkNFUFQgMSIgPj5jb25mZGVmcy5oCisKKworJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9GRF9QQVNTSU5HIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIFNTSF9JT0JVRlNaIDY1NTM1IiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBGSUxFU1lTVEVNX05PX0JBQ0tTTEFTSCAxIiA+PmNvbmZkZWZzLmgKKworCTs7CisqLSotZGd1eCopCisKKyRhc19lY2hvICIjZGVmaW5lIElQX1RPU19JU19CUk9LRU4gMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBTRVRFVUlEX0JSRUFLU19TRVRVSUQgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVVSUQgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVHSUQgMSIgPj5jb25mZGVmcy5oCisKKwk7OworKi0qLWRhcndpbiopCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB3ZSBoYXZlIHdvcmtpbmcgZ2V0YWRkcmluZm8iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgd2UgaGF2ZSB3b3JraW5nIGdldGFkZHJpbmZvLi4uICIgPiY2OyB9CisJaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogYXNzdW1lIGl0IGlzIHdvcmtpbmciID4mNQorJGFzX2VjaG8gImFzc3VtZSBpdCBpcyB3b3JraW5nIiA+JjY7IH0KK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworICNpbmNsdWRlIDxtYWNoLW8vZHlsZC5oPgorbWFpbigpIHsgaWYgKE5TVmVyc2lvbk9mUnVuVGltZUxpYnJhcnkoIlN5c3RlbSIpID49ICg2MCA8PCAxNikpCisJCWV4aXQoMCk7CisJZWxzZQorCQlleGl0KDEpOworfQorCitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogd29ya2luZyIgPiY1CiskYXNfZWNobyAid29ya2luZyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBidWdneSIgPiY1CiskYXNfZWNobyAiYnVnZ3kiID4mNjsgfQorCiskYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fR0VUQUREUklORk8gMSIgPj5jb25mZGVmcy5oCisKKworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKwkkYXNfZWNobyAiI2RlZmluZSBTRVRFVUlEX0JSRUFLU19TRVRVSUQgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVVSUQgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVHSUQgMSIgPj5jb25mZGVmcy5oCisKKworJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX0dMT0IgMSIgPj5jb25mZGVmcy5oCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBCSU5EXzhfQ09NUEFUIDEKK19BQ0VPRgorCisKKyRhc19lY2hvICIjZGVmaW5lIFNTSF9UVU5fRlJFRUJTRCAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBTU0hfVFVOX0NPTVBBVF9BRiAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBTU0hfVFVOX1BSRVBFTkRfQUYgMSIgPj5jb25mZGVmcy5oCisKKworCWFjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIkFVX0lQdjQiICJhY19jdl9oYXZlX2RlY2xfQVVfSVB2NCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfQVVfSVB2NCIgPSB4eWVzOyB0aGVuIDoKKworZWxzZQorCiskYXNfZWNobyAiI2RlZmluZSBBVV9JUHY0IDAiID4+Y29uZmRlZnMuaAorCisJICAgICNpbmNsdWRlIDxic20vYXVkaXQuaD4KKworJGFzX2VjaG8gIiNkZWZpbmUgTEFTVExPR19XUklURV9QVVRVVFhMSU5FIDEiID4+Y29uZmRlZnMuaAorCisKK2ZpCisKKworJGFzX2VjaG8gIiNkZWZpbmUgU1BUX1RZUEUgU1BUX1JFVVNFQVJHViIgPj5jb25mZGVmcy5oCisKKwlmb3IgYWNfZnVuYyBpbiBzYW5kYm94X2luaXQKK2RvIDoKKyAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAic2FuZGJveF9pbml0IiAiYWNfY3ZfZnVuY19zYW5kYm94X2luaXQiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc2FuZGJveF9pbml0IiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfU0FOREJPWF9JTklUIDEKK19BQ0VPRgorCitmaQorZG9uZQorCisJZm9yIGFjX2hlYWRlciBpbiBzYW5kYm94LmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInNhbmRib3guaCIgImFjX2N2X2hlYWRlcl9zYW5kYm94X2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3NhbmRib3hfaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1NBTkRCT1hfSCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisJOzsKKyotKi1kcmFnb25mbHkqKQorCVNTSERMSUJTPSIkU1NIRExJQlMgLWxjcnlwdCIKKwk7OworKi0qLWhhaWt1KikKKyAgICBMSUJTPSIkTElCUyAtbGJzZCAiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc29ja2V0IGluIC1sbmV0d29yayIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc29ja2V0IGluIC1sbmV0d29yay4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfbmV0d29ya19zb2NrZXQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbG5ldHdvcmsgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHNvY2tldCAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHNvY2tldCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfbmV0d29ya19zb2NrZXQ9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9uZXR3b3JrX3NvY2tldD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfbmV0d29ya19zb2NrZXQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfbmV0d29ya19zb2NrZXQiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfbmV0d29ya19zb2NrZXQiID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9MSUJORVRXT1JLIDEKK19BQ0VPRgorCisgIExJQlM9Ii1sbmV0d29yayAkTElCUyIKKworZmkKKworICAgICRhc19lY2hvICIjZGVmaW5lIEhBVkVfVV9JTlQ2NF9UIDEiID4+Y29uZmRlZnMuaAorCisgICAgTUFOVFlQRT1tYW4KKyAgICA7OworKi0qLWhwdXgqKQorCSMgZmlyc3Qgd2UgZGVmaW5lIGFsbCBvZiB0aGUgb3B0aW9ucyBjb21tb24gdG8gYWxsIEhQLVVYIHJlbGVhc2VzCisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9IUFVYX1NPVVJDRSAtRF9YT1BFTl9TT1VSQ0UgLURfWE9QRU5fU09VUkNFX0VYVEVOREVEPTEiCisJSVBBRERSX0lOX0RJU1BMQVk9eWVzCisJJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1BJUEVTIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIExPR0lOX05PX0VORE9QVCAxIiA+PmNvbmZkZWZzLmgKKworCSRhc19lY2hvICIjZGVmaW5lIExPR0lOX05FRURTX1VUTVBYIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIExPQ0tFRF9QQVNTV0RfU1RSSU5HIFwiKlwiIiA+PmNvbmZkZWZzLmgKKworCSRhc19lY2hvICIjZGVmaW5lIFNQVF9UWVBFIFNQVF9QU1RBVCIgPj5jb25mZGVmcy5oCisKKwltYWlsZGlyPSIvdmFyL21haWwiCisJTElCUz0iJExJQlMgLWxzZWMiCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdF9lcnJvciBpbiAtbHhuZXQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHRfZXJyb3IgaW4gLWx4bmV0Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl94bmV0X3RfZXJyb3IrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHhuZXQgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHRfZXJyb3IgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiB0X2Vycm9yICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl94bmV0X3RfZXJyb3I9eWVzCitlbHNlCisgIGFjX2N2X2xpYl94bmV0X3RfZXJyb3I9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3huZXRfdF9lcnJvciIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl94bmV0X3RfZXJyb3IiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfeG5ldF90X2Vycm9yIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTElCWE5FVCAxCitfQUNFT0YKKworICBMSUJTPSItbHhuZXQgJExJQlMiCisKK2Vsc2UKKyAgYXNfZm5fZXJyb3IgJD8gIioqKiAtbHhuZXQgbmVlZGVkIG9uIEhQLVVYIC0gY2hlY2sgY29uZmlnLmxvZyAqKioiICIkTElORU5PIiA1CitmaQorCisKKwkjIG5leHQsIHdlIGRlZmluZSBhbGwgb2YgdGhlIG9wdGlvbnMgc3BlY2lmaWMgdG8gbWFqb3IgcmVsZWFzZXMKKwljYXNlICIkaG9zdCIgaW4KKwkqLSotaHB1eDEwKikKKwkJaWYgdGVzdCAteiAiJEdDQyI7IHRoZW4KKwkJCUNGTEFHUz0iJENGTEFHUyAtQWUiCisJCWZpCisJCTs7CisJKi0qLWhwdXgxMSopCisKKyRhc19lY2hvICIjZGVmaW5lIFBBTV9TVU5fQ09ERUJBU0UgMSIgPj5jb25mZGVmcy5oCisKKworJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9VVE1QIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIFVTRV9CVE1QIDEiID4+Y29uZmRlZnMuaAorCisJCWNoZWNrX2Zvcl9ocHV4X2Jyb2tlbl9nZXRhZGRyaW5mbz0xCisJCWNoZWNrX2Zvcl9jb25mbGljdGluZ19nZXRzcG5hbT0xCisJCTs7CisJZXNhYworCisJIyBsYXN0bHksIHdlIGRlZmluZSBvcHRpb25zIHNwZWNpZmljIHRvIG1pbm9yIHJlbGVhc2VzCisJY2FzZSAiJGhvc3QiIGluCisJKi0qLWhwdXgxMC4yNikKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TRUNVUkVXQVJFIDEiID4+Y29uZmRlZnMuaAorCisJCWRpc2FibGVfcHRteF9jaGVjaz15ZXMKKwkJTElCUz0iJExJQlMgLWxzZWNwdyIKKwkJOzsKKwllc2FjCisJOzsKKyotKi1pcml4NSopCisJUEFUSD0iJFBBVEg6L3Vzci9ldGMiCisKKyRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9JTkVUX05UT0EgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBTRVRFVUlEX0JSRUFLU19TRVRVSUQgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVVSUQgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVHSUQgMSIgPj5jb25mZGVmcy5oCisKKworJGFzX2VjaG8gIiNkZWZpbmUgV0lUSF9BQkJSRVZfTk9fVFRZIDEiID4+Y29uZmRlZnMuaAorCisJJGFzX2VjaG8gIiNkZWZpbmUgTE9DS0VEX1BBU1NXRF9TVFJJTkcgXCIqTEsqXCIiID4+Y29uZmRlZnMuaAorCisJOzsKKyotKi1pcml4NiopCisJUEFUSD0iJFBBVEg6L3Vzci9ldGMiCisKKyRhc19lY2hvICIjZGVmaW5lIFdJVEhfSVJJWF9BUlJBWSAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBXSVRIX0lSSVhfUFJPSkVDVCAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBXSVRIX0lSSVhfQVVESVQgMSIgPj5jb25mZGVmcy5oCisKKwlhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJqbGltaXRfc3RhcnRqb2IiICJhY19jdl9mdW5jX2psaW1pdF9zdGFydGpvYiIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19qbGltaXRfc3RhcnRqb2IiID0geHllczsgdGhlbiA6CisKKyRhc19lY2hvICIjZGVmaW5lIFdJVEhfSVJJWF9KT0JTIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisJJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX0lORVRfTlRPQSAxIiA+PmNvbmZkZWZzLmgKKworCSRhc19lY2hvICIjZGVmaW5lIFNFVEVVSURfQlJFQUtTX1NFVFVJRCAxIiA+PmNvbmZkZWZzLmgKKworCSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9TRVRSRVVJRCAxIiA+PmNvbmZkZWZzLmgKKworCSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9TRVRSRUdJRCAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fVVBEV1RNUFggMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBXSVRIX0FCQlJFVl9OT19UVFkgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBMT0NLRURfUEFTU1dEX1NUUklORyBcIipMSypcIiIgPj5jb25mZGVmcy5oCisKKwk7OworKi0qLWsqYnNkKi1nbnUgfCAqLSota29wZW5zb2xhcmlzKi1nbnUpCisJY2hlY2tfZm9yX2xpYmNyeXB0X2xhdGVyPTEKKwkkYXNfZWNobyAiI2RlZmluZSBQQU1fVFRZX0tMVURHRSAxIiA+PmNvbmZkZWZzLmgKKworCSRhc19lY2hvICIjZGVmaW5lIExPQ0tFRF9QQVNTV0RfUFJFRklYIFwiIVwiIiA+PmNvbmZkZWZzLmgKKworCSRhc19lY2hvICIjZGVmaW5lIFNQVF9UWVBFIFNQVF9SRVVTRUFSR1YiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIF9QQVRIX0JUTVAgXCIvdmFyL2xvZy9idG1wXCIiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIFVTRV9CVE1QIDEiID4+Y29uZmRlZnMuaAorCisJOzsKKyotKi1saW51eCopCisJbm9fZGV2X3B0bXg9MQorCWNoZWNrX2Zvcl9saWJjcnlwdF9sYXRlcj0xCisJY2hlY2tfZm9yX29wZW5wdHlfY3R0eV9idWc9MQorCiskYXNfZWNobyAiI2RlZmluZSBQQU1fVFRZX0tMVURHRSAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBMT0NLRURfUEFTU1dEX1BSRUZJWCBcIiFcIiIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBTUFRfVFlQRSBTUFRfUkVVU0VBUkdWIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBMSU5LX09QTk9UU1VQUF9FUlJOTyBFUEVSTSIgPj5jb25mZGVmcy5oCisKKworJGFzX2VjaG8gIiNkZWZpbmUgX1BBVEhfQlRNUCBcIi92YXIvbG9nL2J0bXBcIiIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBVU0VfQlRNUCAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBMSU5VWF9PT01fQURKVVNUIDEiID4+Y29uZmRlZnMuaAorCisJaW5ldDZfZGVmYXVsdF80aW42PXllcworCWNhc2UgYHVuYW1lIC1yYCBpbgorCTEuKnwyLjAuKikKKworJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX0NNU0dfVFlQRSAxIiA+PmNvbmZkZWZzLmgKKworCQk7OworCWVzYWMKKwkjIHR1big0KSBmb3J3YXJkaW5nIGNvbXBhdCBjb2RlCisJZm9yIGFjX2hlYWRlciBpbiBsaW51eC9pZl90dW4uaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAibGludXgvaWZfdHVuLmgiICJhY19jdl9oZWFkZXJfbGludXhfaWZfdHVuX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpbnV4X2lmX3R1bl9oIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTElOVVhfSUZfVFVOX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpbnV4X2lmX3R1bl9oIiA9ICJ4eWVzIiA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgU1NIX1RVTl9MSU5VWCAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBTU0hfVFVOX0NPTVBBVF9BRiAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBTU0hfVFVOX1BSRVBFTkRfQUYgMSIgPj5jb25mZGVmcy5oCisKKwlmaQorCWZvciBhY19oZWFkZXIgaW4gbGludXgvc2VjY29tcC5oIGxpbnV4L2ZpbHRlci5oIGxpbnV4L2F1ZGl0LmgKK2RvIDoKKyAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCWZvciBhY19mdW5jIGluIHByY3RsCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInByY3RsIiAiYWNfY3ZfZnVuY19wcmN0bCIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19wcmN0bCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1BSQ1RMIDEKK19BQ0VPRgorCitmaQorZG9uZQorCisJaGF2ZV9zZWNjb21wX2F1ZGl0X2FyY2g9MQorCWNhc2UgIiRob3N0IiBpbgorCXg4Nl82NC0qKQorCiskYXNfZWNobyAiI2RlZmluZSBTRUNDT01QX0FVRElUX0FSQ0ggQVVESVRfQVJDSF9YODZfNjQiID4+Y29uZmRlZnMuaAorCisJCTs7CisJaSo4Ni0qKQorCiskYXNfZWNobyAiI2RlZmluZSBTRUNDT01QX0FVRElUX0FSQ0ggQVVESVRfQVJDSF9JMzg2IiA+PmNvbmZkZWZzLmgKKworCQk7OworCSopCisJCWhhdmVfc2VjY29tcF9hdWRpdF9hcmNoPTAKKwkJOzsKKwllc2FjCisJOzsKK21pcHMtc29ueS1ic2R8bWlwcy1zb255LW5ld3NvczQpCisKKyRhc19lY2hvICIjZGVmaW5lIE5FRURfU0VUUEdSUCAxIiA+PmNvbmZkZWZzLmgKKworCVNPTlk9MQorCTs7CisqLSotbmV0YnNkKikKKwljaGVja19mb3JfbGliY3J5cHRfYmVmb3JlPTEKKwlpZiB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iIDsgdGhlbgorCQluZWVkX2Rhc2hfcj0xCisJZmkKKworJGFzX2VjaG8gIiNkZWZpbmUgU1NIX1RVTl9GUkVFQlNEIDEiID4+Y29uZmRlZnMuaAorCisJYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIm5ldC9pZl90YXAuaCIgImFjX2N2X2hlYWRlcl9uZXRfaWZfdGFwX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX25ldF9pZl90YXBfaCIgPSB4eWVzOyB0aGVuIDoKKworZWxzZQorCiskYXNfZWNobyAiI2RlZmluZSBTU0hfVFVOX05PX0wyIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisKKworJGFzX2VjaG8gIiNkZWZpbmUgU1NIX1RVTl9QUkVQRU5EX0FGIDEiID4+Y29uZmRlZnMuaAorCisJOzsKKyotKi1mcmVlYnNkKikKKwljaGVja19mb3JfbGliY3J5cHRfbGF0ZXI9MQorCiskYXNfZWNobyAiI2RlZmluZSBMT0NLRURfUEFTU1dEX1BSRUZJWCBcIipMT0NLRUQqXCIiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIFNTSF9UVU5fRlJFRUJTRCAxIiA+PmNvbmZkZWZzLmgKKworCWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJuZXQvaWZfdGFwLmgiICJhY19jdl9oZWFkZXJfbmV0X2lmX3RhcF9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9uZXRfaWZfdGFwX2giID0geHllczsgdGhlbiA6CisKK2Vsc2UKKworJGFzX2VjaG8gIiNkZWZpbmUgU1NIX1RVTl9OT19MMiAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworCisKKyRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9HTE9CIDEiID4+Y29uZmRlZnMuaAorCisJOzsKKyotKi1ic2RpKikKKwkkYXNfZWNobyAiI2RlZmluZSBTRVRFVUlEX0JSRUFLU19TRVRVSUQgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVVSUQgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVHSUQgMSIgPj5jb25mZGVmcy5oCisKKwk7OworKi1uZXh0LSopCisJY29uZl9sYXN0bG9nX2xvY2F0aW9uPSIvdXNyL2FkbS9sYXN0bG9nIgorCWNvbmZfdXRtcF9sb2NhdGlvbj0vZXRjL3V0bXAKKwljb25mX3d0bXBfbG9jYXRpb249L3Vzci9hZG0vd3RtcAorCW1haWxkaXI9L3Vzci9zcG9vbC9tYWlsCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfTkVYVCAxIiA+PmNvbmZkZWZzLmgKKworCSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9SRUFMUEFUSCAxIiA+PmNvbmZkZWZzLmgKKworCSRhc19lY2hvICIjZGVmaW5lIFVTRV9QSVBFUyAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0FWRURfVUlEUyAxIiA+PmNvbmZkZWZzLmgKKworCTs7CisqLSotb3BlbmJzZCopCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfQVRUUklCVVRFX19TRU5USU5FTF9fIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfQVRUUklCVVRFX19CT1VOREVEX18gMSIgPj5jb25mZGVmcy5oCisKKworJGFzX2VjaG8gIiNkZWZpbmUgU1NIX1RVTl9PUEVOQlNEIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIFNZU0xPR19SX1NBRkVfSU5fU0lHSEFORCAxIiA+PmNvbmZkZWZzLmgKKworCTs7CisqLSotc29sYXJpcyopCisJaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KKwkJbmVlZF9kYXNoX3I9MQorCWZpCisJJGFzX2VjaG8gIiNkZWZpbmUgUEFNX1NVTl9DT0RFQkFTRSAxIiA+PmNvbmZkZWZzLmgKKworCSRhc19lY2hvICIjZGVmaW5lIExPR0lOX05FRURTX1VUTVBYIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIExPR0lOX05FRURTX1RFUk0gMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBQQU1fVFRZX0tMVURHRSAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBTU0hQQU1fQ0hBVVRIVE9LX05FRURTX1JVSUQgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBMT0NLRURfUEFTU1dEX1NUUklORyBcIipMSypcIiIgPj5jb25mZGVmcy5oCisKKwkjIFB1c2hpbmcgU1RSRUFNUyBtb2R1bGVzIHdpbGwgY2F1c2Ugc3NoZCB0byBhY3F1aXJlIGEgY29udHJvbGxpbmcgdHR5LgorCiskYXNfZWNobyAiI2RlZmluZSBTU0hEX0FDUVVJUkVTX0NUVFkgMSIgPj5jb25mZGVmcy5oCisKKworJGFzX2VjaG8gIiNkZWZpbmUgUEFTU1dEX05FRURTX1VTRVJOQU1FIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9UQ0dFVEFUVFJfSUNBTk9OIDEiID4+Y29uZmRlZnMuaAorCisJZXh0ZXJuYWxfcGF0aF9maWxlPS9ldGMvZGVmYXVsdC9sb2dpbgorCSMgaGFyZHdpcmUgbGFzdGxvZyBsb2NhdGlvbiAoY2FuJ3QgZGV0ZWN0IGl0IG9uIHNvbWUgdmVyc2lvbnMpCisJY29uZl9sYXN0bG9nX2xvY2F0aW9uPSIvdmFyL2FkbS9sYXN0bG9nIgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG9ic29sZXRlIHV0bXAgYW5kIHd0bXAgaW4gc29sYXJpczIueCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igb2Jzb2xldGUgdXRtcCBhbmQgd3RtcCBpbiBzb2xhcmlzMi54Li4uICIgPiY2OyB9CisJc29sMnZlcj1gZWNobyAiJGhvc3QifCBzZWQgLWUgJ3MvLipbMC05XVwuLy8nYAorCWlmIHRlc3QgIiRzb2wydmVyIiAtZ2UgODsgdGhlbgorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCQkkYXNfZWNobyAiI2RlZmluZSBESVNBQkxFX1VUTVAgMSIgPj5jb25mZGVmcy5oCisKKworJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9XVE1QIDEiID4+Y29uZmRlZnMuaAorCisJZWxzZQorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwlmaQorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXNvbGFyaXMtY29udHJhY3RzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9zb2xhcmlzX2NvbnRyYWN0cytzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfc29sYXJpc19jb250cmFjdHM7CisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGN0X3RtcGxfYWN0aXZhdGUgaW4gLWxjb250cmFjdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgY3RfdG1wbF9hY3RpdmF0ZSBpbiAtbGNvbnRyYWN0Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9jb250cmFjdF9jdF90bXBsX2FjdGl2YXRlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxjb250cmFjdCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgY3RfdG1wbF9hY3RpdmF0ZSAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGN0X3RtcGxfYWN0aXZhdGUgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2NvbnRyYWN0X2N0X3RtcGxfYWN0aXZhdGU9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9jb250cmFjdF9jdF90bXBsX2FjdGl2YXRlPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9jb250cmFjdF9jdF90bXBsX2FjdGl2YXRlIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2NvbnRyYWN0X2N0X3RtcGxfYWN0aXZhdGUiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfY29udHJhY3RfY3RfdG1wbF9hY3RpdmF0ZSIgPSB4eWVzOyB0aGVuIDoKKworJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1NPTEFSSVNfUFJPQ0VTU19DT05UUkFDVFMgMSIgPj5jb25mZGVmcy5oCisKKwkJCSAgU1NIRExJQlM9IiRTU0hETElCUyAtbGNvbnRyYWN0IgorCQkJICBTUENfTVNHPSJ5ZXMiCitmaQorCisKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1zb2xhcmlzLXByb2plY3RzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9zb2xhcmlzX3Byb2plY3RzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9zb2xhcmlzX3Byb2plY3RzOworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzZXRwcm9qZWN0IGluIC1scHJvamVjdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc2V0cHJvamVjdCBpbiAtbHByb2plY3QuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX3Byb2plY3Rfc2V0cHJvamVjdCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1scHJvamVjdCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgc2V0cHJvamVjdCAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHNldHByb2plY3QgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX3Byb2plY3Rfc2V0cHJvamVjdD15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX3Byb2plY3Rfc2V0cHJvamVjdD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfcHJvamVjdF9zZXRwcm9qZWN0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX3Byb2plY3Rfc2V0cHJvamVjdCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9wcm9qZWN0X3NldHByb2plY3QiID0geHllczsgdGhlbiA6CisKKyRhc19lY2hvICIjZGVmaW5lIFVTRV9TT0xBUklTX1BST0pFQ1RTIDEiID4+Y29uZmRlZnMuaAorCisJCQlTU0hETElCUz0iJFNTSERMSUJTIC1scHJvamVjdCIKKwkJCVNQX01TRz0ieWVzIgorZmkKKworCitmaQorCisJOzsKKyotKi1zdW5vczQqKQorCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURTVU5PUzQiCisJZm9yIGFjX2Z1bmMgaW4gZ2V0cHdhbmFtCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImdldHB3YW5hbSIgImFjX2N2X2Z1bmNfZ2V0cHdhbmFtIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX2dldHB3YW5hbSIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0dFVFBXQU5BTSAxCitfQUNFT0YKKworZmkKK2RvbmUKKworCSRhc19lY2hvICIjZGVmaW5lIFBBTV9TVU5fQ09ERUJBU0UgMSIgPj5jb25mZGVmcy5oCisKKwljb25mX3V0bXBfbG9jYXRpb249L2V0Yy91dG1wCisJY29uZl93dG1wX2xvY2F0aW9uPS92YXIvYWRtL3d0bXAKKwljb25mX2xhc3Rsb2dfbG9jYXRpb249L3Zhci9hZG0vbGFzdGxvZworCSRhc19lY2hvICIjZGVmaW5lIFVTRV9QSVBFUyAxIiA+PmNvbmZkZWZzLmgKKworCTs7CisqLW5jci1zeXN2KikKKwlMSUJTPSIkTElCUyAtbGM4OSIKKwkkYXNfZWNobyAiI2RlZmluZSBVU0VfUElQRVMgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBTU0hEX0FDUVVJUkVTX0NUVFkgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBTRVRFVUlEX0JSRUFLU19TRVRVSUQgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVVSUQgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVHSUQgMSIgPj5jb25mZGVmcy5oCisKKwk7OworKi1zbmktc3lzdiopCisJIyAvdXNyL3VjYmxpYiBNVVNUIE5PVCBiZSBzZWFyY2hlZCBvbiBSZWxpYW50VU5JWAorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsc3ltIGluIC1sZGwiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsc3ltIGluIC1sZGwuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX2RsX2Rsc3ltKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxkbCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxzeW0gKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBkbHN5bSAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfZGxfZGxzeW09eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kbF9kbHN5bT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZGxfZGxzeW0iID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfZGxfZGxzeW0iID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGxfZGxzeW0iID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9MSUJETCAxCitfQUNFT0YKKworICBMSUJTPSItbGRsICRMSUJTIgorCitmaQorCisJIyAtbHJlc29sdiBuZWVkcyB0byBiZSBhdCB0aGUgZW5kIG9mIExJQlMgb3IgRE5TIGxvb2t1cHMgYnJlYWsKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciByZXNfcXVlcnkgaW4gLWxyZXNvbHYiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHJlc19xdWVyeSBpbiAtbHJlc29sdi4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfcmVzb2x2X3Jlc19xdWVyeSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1scmVzb2x2ICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciByZXNfcXVlcnkgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiByZXNfcXVlcnkgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX3Jlc29sdl9yZXNfcXVlcnk9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9yZXNvbHZfcmVzX3F1ZXJ5PW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9yZXNvbHZfcmVzX3F1ZXJ5IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX3Jlc29sdl9yZXNfcXVlcnkiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfcmVzb2x2X3Jlc19xdWVyeSIgPSB4eWVzOyB0aGVuIDoKKyAgIExJQlM9IiRMSUJTIC1scmVzb2x2IgorZmkKKworCUlQQUREUl9JTl9ESVNQTEFZPXllcworCSRhc19lY2hvICIjZGVmaW5lIFVTRV9QSVBFUyAxIiA+PmNvbmZkZWZzLmgKKworCSRhc19lY2hvICIjZGVmaW5lIElQX1RPU19JU19CUk9LRU4gMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBTRVRFVUlEX0JSRUFLU19TRVRVSUQgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVVSUQgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVHSUQgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBTU0hEX0FDUVVJUkVTX0NUVFkgMSIgPj5jb25mZGVmcy5oCisKKwlleHRlcm5hbF9wYXRoX2ZpbGU9L2V0Yy9kZWZhdWx0L2xvZ2luCisJIyAvdXNyL3VjYmxpYi9saWJ1Y2IuYSBubyBsb25nZXIgbmVlZGVkIG9uIFJlbGlhbnRVTklYCisJIyBBdHRlbnRpb246IGFsd2F5cyB0YWtlIGNhcmUgdG8gYmluZCBsaWJzb2NrZXQgYW5kIGxpYm5zbCBiZWZvcmUgbGliYywKKwkjIG90aGVyd2lzZSB5b3Ugd2lsbCBmaW5kIGxvdHMgb2YgIlNJT0NHUEdSUCBlcnJubyAyMiIgb24gc3lzbG9nCisJOzsKKyMgVW5peFdhcmUgMS54LCBVbml4V2FyZSAyLngsIGFuZCBvdGhlcnMgYmFzZWQgb24gY29kZSBmcm9tIFVuaXZlbC4KKyotKi1zeXN2NC4yKikKKwkkYXNfZWNobyAiI2RlZmluZSBVU0VfUElQRVMgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBTRVRFVUlEX0JSRUFLU19TRVRVSUQgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVVSUQgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVHSUQgMSIgPj5jb25mZGVmcy5oCisKKworJGFzX2VjaG8gIiNkZWZpbmUgUEFTU1dEX05FRURTX1VTRVJOQU1FIDEiID4+Y29uZmRlZnMuaAorCisJJGFzX2VjaG8gIiNkZWZpbmUgTE9DS0VEX1BBU1NXRF9TVFJJTkcgXCIqTEsqXCIiID4+Y29uZmRlZnMuaAorCisJOzsKKyMgVW5peFdhcmUgNy54LCBPcGVuVU5JWCA4CisqLSotc3lzdjUqKQorCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLUR2c25wcmludGY9X3h2c25wcmludGYgLURzbnByaW50Zj1feHNucHJpbnRmIgorCiskYXNfZWNobyAiI2RlZmluZSBVTklYV0FSRV9MT05HX1BBU1NXT1JEUyAxIiA+PmNvbmZkZWZzLmgKKworCSRhc19lY2hvICIjZGVmaW5lIFVTRV9QSVBFUyAxIiA+PmNvbmZkZWZzLmgKKworCSRhc19lY2hvICIjZGVmaW5lIFNFVEVVSURfQlJFQUtTX1NFVFVJRCAxIiA+PmNvbmZkZWZzLmgKKworCSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9HRVRBRERSSU5GTyAxIiA+PmNvbmZkZWZzLmgKKworCSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9TRVRSRVVJRCAxIiA+PmNvbmZkZWZzLmgKKworCSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9TRVRSRUdJRCAxIiA+PmNvbmZkZWZzLmgKKworCSRhc19lY2hvICIjZGVmaW5lIFBBU1NXRF9ORUVEU19VU0VSTkFNRSAxIiA+PmNvbmZkZWZzLmgKKworCWNhc2UgIiRob3N0IiBpbgorCSotKi1zeXN2NVNDT19TViopCSMgU0NPIE9wZW5TZXJ2ZXIgNi54CisJCW1haWxkaXI9L3Zhci9zcG9vbC9tYWlsCisJCVRFU1RfU0hFTEw9L3U5NS9iaW4vc2gKKworJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX0xJQklBRiAxIiA+PmNvbmZkZWZzLmgKKworCQkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fVVBEV1RNUFggMSIgPj5jb25mZGVmcy5oCisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ2V0bHVpZCBpbiAtbHByb3QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdldGx1aWQgaW4gLWxwcm90Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9wcm90X2dldGx1aWQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHByb3QgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGdldGx1aWQgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBnZXRsdWlkICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9wcm90X2dldGx1aWQ9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9wcm90X2dldGx1aWQ9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3Byb3RfZ2V0bHVpZCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9wcm90X2dldGx1aWQiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfcHJvdF9nZXRsdWlkIiA9IHh5ZXM7IHRoZW4gOgorICAgTElCUz0iJExJQlMgLWxwcm90IgorCQkJZm9yIGFjX2Z1bmMgaW4gZ2V0bHVpZCBzZXRsdWlkCitkbyA6CisgIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKK2RvbmUKKworCQkJJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TRUNVUkVXQVJFIDEiID4+Y29uZmRlZnMuaAorCisJCQkkYXNfZWNobyAiI2RlZmluZSBESVNBQkxFX1NIQURPVyAxIiA+PmNvbmZkZWZzLmgKKworCitmaQorCisJCTs7CisJKikJJGFzX2VjaG8gIiNkZWZpbmUgTE9DS0VEX1BBU1NXRF9TVFJJTkcgXCIqTEsqXCIiID4+Y29uZmRlZnMuaAorCisJCWNoZWNrX2Zvcl9saWJjcnlwdF9sYXRlcj0xCisJCTs7CisJZXNhYworCTs7CisqLSotc3lzdiopCisJOzsKKyMgU0NPIFVOSVggYW5kIE9FTSB2ZXJzaW9ucyBvZiBTQ08gVU5JWAorKi0qLXNjbzMuMnY0KikKKwlhc19mbl9lcnJvciAkPyAiXCJUaGlzIFBsYXRmb3JtIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuXCIiICIkTElORU5PIiA1CisJOzsKKyMgU0NPIE9wZW5TZXJ2ZXIgNS54CisqLSotc2NvMy4ydjUqKQorCWlmIHRlc3QgLXogIiRHQ0MiOyB0aGVuCisJCUNGTEFHUz0iJENGTEFHUyAtYmVsZiIKKwlmaQorCUxJQlM9IiRMSUJTIC1scHJvdCAtbHggLWx0aW5mbyAtbG0iCisJbm9fZGV2X3B0bXg9MQorCSRhc19lY2hvICIjZGVmaW5lIFVTRV9QSVBFUyAxIiA+PmNvbmZkZWZzLmgKKworCSRhc19lY2hvICIjZGVmaW5lIEhBVkVfU0VDVVJFV0FSRSAxIiA+PmNvbmZkZWZzLmgKKworCSRhc19lY2hvICIjZGVmaW5lIERJU0FCTEVfU0hBRE9XIDEiID4+Y29uZmRlZnMuaAorCisJJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9GRF9QQVNTSU5HIDEiID4+Y29uZmRlZnMuaAorCisJJGFzX2VjaG8gIiNkZWZpbmUgU0VURVVJRF9CUkVBS1NfU0VUVUlEIDEiID4+Y29uZmRlZnMuaAorCisJJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX0dFVEFERFJJTkZPIDEiID4+Y29uZmRlZnMuaAorCisJJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1NFVFJFVUlEIDEiID4+Y29uZmRlZnMuaAorCisJJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1NFVFJFR0lEIDEiID4+Y29uZmRlZnMuaAorCisJJGFzX2VjaG8gIiNkZWZpbmUgV0lUSF9BQkJSRVZfTk9fVFRZIDEiID4+Y29uZmRlZnMuaAorCisJJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1VQRFdUTVBYIDEiID4+Y29uZmRlZnMuaAorCisJJGFzX2VjaG8gIiNkZWZpbmUgUEFTU1dEX05FRURTX1VTRVJOQU1FIDEiID4+Y29uZmRlZnMuaAorCisJZm9yIGFjX2Z1bmMgaW4gZ2V0bHVpZCBzZXRsdWlkCitkbyA6CisgIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKK2RvbmUKKworCU1BTlRZUEU9bWFuCisJVEVTVF9TSEVMTD1rc2gKKwk7OworKi0qLXVuaWNvc21rKikKKworJGFzX2VjaG8gIiNkZWZpbmUgTk9fU1NIX0xBU1RMT0cgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBTRVRFVUlEX0JSRUFLU19TRVRVSUQgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVVSUQgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVHSUQgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBVU0VfUElQRVMgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBESVNBQkxFX0ZEX1BBU1NJTkcgMSIgPj5jb25mZGVmcy5oCisKKwlMREZMQUdTPSIkTERGTEFHUyIKKwlMSUJTPSIkTElCUyAtbGdlbiAtbHJzYyAtbHNoYXJlIC1sdWV4IC1sYWNtIgorCU1BTlRZUEU9Y2F0CisJOzsKKyotKi11bmljb3NtcCopCisJJGFzX2VjaG8gIiNkZWZpbmUgU0VURVVJRF9CUkVBS1NfU0VUVUlEIDEiID4+Y29uZmRlZnMuaAorCisJJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1NFVFJFVUlEIDEiID4+Y29uZmRlZnMuaAorCisJJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1NFVFJFR0lEIDEiID4+Y29uZmRlZnMuaAorCisJJGFzX2VjaG8gIiNkZWZpbmUgV0lUSF9BQkJSRVZfTk9fVFRZIDEiID4+Y29uZmRlZnMuaAorCisJJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1BJUEVTIDEiID4+Y29uZmRlZnMuaAorCisJJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9GRF9QQVNTSU5HIDEiID4+Y29uZmRlZnMuaAorCisJTERGTEFHUz0iJExERkxBR1MiCisJTElCUz0iJExJQlMgLWxnZW4gLWxhY2lkIC1sZGIiCisJTUFOVFlQRT1jYXQKKwk7OworKi0qLXVuaWNvcyopCisJJGFzX2VjaG8gIiNkZWZpbmUgU0VURVVJRF9CUkVBS1NfU0VUVUlEIDEiID4+Y29uZmRlZnMuaAorCisJJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1NFVFJFVUlEIDEiID4+Y29uZmRlZnMuaAorCisJJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1NFVFJFR0lEIDEiID4+Y29uZmRlZnMuaAorCisJJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1BJUEVTIDEiID4+Y29uZmRlZnMuaAorCisJJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9GRF9QQVNTSU5HIDEiID4+Y29uZmRlZnMuaAorCisJJGFzX2VjaG8gIiNkZWZpbmUgTk9fU1NIX0xBU1RMT0cgMSIgPj5jb25mZGVmcy5oCisKKwlMREZMQUdTPSIkTERGTEFHUyAtV2wsLURtc2dsZXZlbD0zMzQ6ZmF0YWwiCisJTElCUz0iJExJQlMgLWxnZW4gLWxyc2MgLWxzaGFyZSAtbHVleCAtbGFjbSIKKwlNQU5UWVBFPWNhdAorCTs7CisqLWRlYy1vc2YqKQorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIERpZ2l0YWwgVW5peCBTSUEiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIERpZ2l0YWwgVW5peCBTSUEuLi4gIiA+JjY7IH0KKwlub19vc2ZzaWE9IiIKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1vc2ZzaWEgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX29zZnNpYStzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfb3Nmc2lhOworCQkJaWYgdGVzdCAieCR3aXRodmFsIiA9ICJ4bm8iIDsgdGhlbgorCQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBkaXNhYmxlZCIgPiY1CiskYXNfZWNobyAiZGlzYWJsZWQiID4mNjsgfQorCQkJCW5vX29zZnNpYT0xCisJCQlmaQorCitmaQorCisJaWYgdGVzdCAteiAiJG5vX29zZnNpYSIgOyB0aGVuCisJCWlmIHRlc3QgLWYgL2V0Yy9zaWEvbWF0cml4LmNvbmY7IHRoZW4KKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfT1NGX1NJQSAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBESVNBQkxFX0xPR0lOIDEiID4+Y29uZmRlZnMuaAorCisJCQkkYXNfZWNobyAiI2RlZmluZSBESVNBQkxFX0ZEX1BBU1NJTkcgMSIgPj5jb25mZGVmcy5oCisKKwkJCUxJQlM9IiRMSUJTIC1sc2VjdXJpdHkgLWxkYiAtbG0gLWxhdWQiCisJCQlTSUFfTVNHPSJ5ZXMiCisJCWVsc2UKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCiskYXNfZWNobyAiI2RlZmluZSBMT0NLRURfUEFTU1dEX1NVQlNUUiBcIk5vbG9naW5cIiIgPj5jb25mZGVmcy5oCisKKwkJZmkKKwlmaQorCSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9HRVRBRERSSU5GTyAxIiA+PmNvbmZkZWZzLmgKKworCSRhc19lY2hvICIjZGVmaW5lIFNFVEVVSURfQlJFQUtTX1NFVFVJRCAxIiA+PmNvbmZkZWZzLmgKKworCSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9TRVRSRVVJRCAxIiA+PmNvbmZkZWZzLmgKKworCSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9TRVRSRUdJRCAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fUkVBRFZfQ09NUEFSSVNPTiAxIiA+PmNvbmZkZWZzLmgKKworCTs7CisKKyotKi1udG8tcW54KikKKwkkYXNfZWNobyAiI2RlZmluZSBVU0VfUElQRVMgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBOT19YMTFfVU5JWF9TT0NLRVRTIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIE1JU1NJTkdfTkZEQklUUyAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBNSVNTSU5HX0hPV01BTlkgMSIgPj5jb25mZGVmcy5oCisKKworJGFzX2VjaG8gIiNkZWZpbmUgTUlTU0lOR19GRF9NQVNLIDEiID4+Y29uZmRlZnMuaAorCisJJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9MQVNUTE9HIDEiID4+Y29uZmRlZnMuaAorCisJJGFzX2VjaG8gIiNkZWZpbmUgU1NIRF9BQ1FVSVJFU19DVFRZIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9TSEFET1dfRVhQSVJFIDEiID4+Y29uZmRlZnMuaAorCisJZW5hYmxlX2V0Y19kZWZhdWx0X2xvZ2luPW5vCSMgaGFzIGluY29tcGF0aWJsZSAvZXRjL2RlZmF1bHQvbG9naW4KKwljYXNlICIkaG9zdCIgaW4KKwkqLSotbnRvLXFueDYqKQorCQkkYXNfZWNobyAiI2RlZmluZSBESVNBQkxFX0ZEX1BBU1NJTkcgMSIgPj5jb25mZGVmcy5oCisKKwkJOzsKKwllc2FjCisJOzsKKworKi0qLXVsdHJpeCopCisKKyRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9HRVRHUk9VUFMgMSIgPj5jb25mZGVmcy5oCisKKworJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX01NQVAgMSIgPj5jb25mZGVmcy5oCisKKwkkYXNfZWNobyAiI2RlZmluZSBORUVEX1NFVFBHUlAgMSIgPj5jb25mZGVmcy5oCisKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TWVNfU1lTTE9HX0ggMSIgPj5jb25mZGVmcy5oCisKKwk7OworCisqLSotbHlueG9zKQorICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLURfX05PX0lOQ0xVREVfV0FSTl9fIgorCSRhc19lY2hvICIjZGVmaW5lIE1JU1NJTkdfSE9XTUFOWSAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUVkJVRiAxIiA+PmNvbmZkZWZzLmgKKworICAgICAgICA7OworZXNhYworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGNvbXBpbGVyIGFuZCBmbGFncyBmb3Igc2FuaXR5IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGNvbXBpbGVyIGFuZCBmbGFncyBmb3Igc2FuaXR5Li4uICIgPiY2OyB9CitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIAl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogbm90IGNoZWNraW5nIGNvbXBpbGVyIHNhbml0eSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IG5vdCBjaGVja2luZyBjb21waWxlciBzYW5pdHkiID4mMjt9CisKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworICNpbmNsdWRlIDxzdGRpby5oPgoraW50CittYWluICgpCit7CisgZXhpdCgwKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIAl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZWxzZQorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCQlhc19mbl9lcnJvciAkPyAiKioqIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgd29ya2luZyBleGVjdXRhYmxlcywgY2hlY2sgY29uZmlnLmxvZyAqKioiICIkTElORU5PIiA1CisKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCisKKyMgQ2hlY2tzIGZvciBsaWJyYXJpZXMuCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJ5cF9tYXRjaCIgImFjX2N2X2Z1bmNfeXBfbWF0Y2giCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfeXBfbWF0Y2giID0geHllczsgdGhlbiA6CisKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgeXBfbWF0Y2ggaW4gLWxuc2wiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHlwX21hdGNoIGluIC1sbnNsLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9uc2xfeXBfbWF0Y2grOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbG5zbCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgeXBfbWF0Y2ggKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiB5cF9tYXRjaCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfbnNsX3lwX21hdGNoPXllcworZWxzZQorICBhY19jdl9saWJfbnNsX3lwX21hdGNoPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9uc2xfeXBfbWF0Y2giID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfbnNsX3lwX21hdGNoIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX25zbF95cF9tYXRjaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0xJQk5TTCAxCitfQUNFT0YKKworICBMSUJTPSItbG5zbCAkTElCUyIKKworZmkKKworZmkKKworYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAic2V0c29ja29wdCIgImFjX2N2X2Z1bmNfc2V0c29ja29wdCIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19zZXRzb2Nrb3B0IiA9IHh5ZXM7IHRoZW4gOgorCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNldHNvY2tvcHQgaW4gLWxzb2NrZXQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHNldHNvY2tvcHQgaW4gLWxzb2NrZXQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX3NvY2tldF9zZXRzb2Nrb3B0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxzb2NrZXQgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHNldHNvY2tvcHQgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBzZXRzb2Nrb3B0ICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9zb2NrZXRfc2V0c29ja29wdD15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX3NvY2tldF9zZXRzb2Nrb3B0PW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9zb2NrZXRfc2V0c29ja29wdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9zb2NrZXRfc2V0c29ja29wdCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9zb2NrZXRfc2V0c29ja29wdCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0xJQlNPQ0tFVCAxCitfQUNFT0YKKworICBMSUJTPSItbHNvY2tldCAkTElCUyIKKworZmkKKworZmkKKworCitmb3IgYWNfZnVuYyBpbiBkaXJuYW1lCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImRpcm5hbWUiICJhY19jdl9mdW5jX2Rpcm5hbWUiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZGlybmFtZSIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RJUk5BTUUgMQorX0FDRU9GCisgZm9yIGFjX2hlYWRlciBpbiBsaWJnZW4uaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAibGliZ2VuLmgiICJhY19jdl9oZWFkZXJfbGliZ2VuX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpYmdlbl9oIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTElCR0VOX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworZWxzZQorCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGlybmFtZSBpbiAtbGdlbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGlybmFtZSBpbiAtbGdlbi4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfZ2VuX2Rpcm5hbWUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGdlbiAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGlybmFtZSAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRpcm5hbWUgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2dlbl9kaXJuYW1lPXllcworZWxzZQorICBhY19jdl9saWJfZ2VuX2Rpcm5hbWU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2dlbl9kaXJuYW1lIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2dlbl9kaXJuYW1lIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX2dlbl9kaXJuYW1lIiA9IHh5ZXM7IHRoZW4gOgorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGJyb2tlbiBkaXJuYW1lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBicm9rZW4gZGlybmFtZS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oYXZlX2Jyb2tlbl9kaXJuYW1lKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworCQkJc2F2ZV9MSUJTPSIkTElCUyIKKwkJCUxJQlM9IiRMSUJTIC1sZ2VuIgorCQkJaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICAgYWNfY3ZfaGF2ZV9icm9rZW5fZGlybmFtZT0ibm8iCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPGxpYmdlbi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBjaGFyICpzLCBidWZbMzJdOworCisgICAgc3RybmNweShidWYsIi9ldGMiLCAzMik7CisgICAgcyA9IGRpcm5hbWUoYnVmKTsKKyAgICBpZiAoIXMgfHwgc3RybmNtcChzLCAiLyIsIDMyKSAhPSAwKSB7CisJZXhpdCgxKTsKKyAgICB9IGVsc2UgeworCWV4aXQoMCk7CisgICAgfQorfQorCitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorICAgYWNfY3ZfaGF2ZV9icm9rZW5fZGlybmFtZT0ibm8iCitlbHNlCisgICBhY19jdl9oYXZlX2Jyb2tlbl9kaXJuYW1lPSJ5ZXMiCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworCQkJTElCUz0iJHNhdmVfTElCUyIKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9icm9rZW5fZGlybmFtZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hhdmVfYnJva2VuX2Rpcm5hbWUiID4mNjsgfQorCQlpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfYnJva2VuX2Rpcm5hbWUiID0gInhubyIgOyB0aGVuCisJCQlMSUJTPSIkTElCUyAtbGdlbiIKKwkJCSRhc19lY2hvICIjZGVmaW5lIEhBVkVfRElSTkFNRSAxIiA+PmNvbmZkZWZzLmgKKworCQkJZm9yIGFjX2hlYWRlciBpbiBsaWJnZW4uaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAibGliZ2VuLmgiICJhY19jdl9oZWFkZXJfbGliZ2VuX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpYmdlbl9oIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTElCR0VOX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCQlmaQorCitmaQorCisKK2ZpCitkb25lCisKKworYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZ2V0c3BuYW0iICJhY19jdl9mdW5jX2dldHNwbmFtIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX2dldHNwbmFtIiA9IHh5ZXM7IHRoZW4gOgorCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdldHNwbmFtIGluIC1sZ2VuIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBnZXRzcG5hbSBpbiAtbGdlbi4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfZ2VuX2dldHNwbmFtKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxnZW4gICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGdldHNwbmFtICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZ2V0c3BuYW0gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2dlbl9nZXRzcG5hbT15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX2dlbl9nZXRzcG5hbT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZ2VuX2dldHNwbmFtIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2dlbl9nZXRzcG5hbSIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9nZW5fZ2V0c3BuYW0iID0geHllczsgdGhlbiA6CisgIExJQlM9IiRMSUJTIC1sZ2VuIgorZmkKKworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIGJhc2VuYW1lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgYmFzZW5hbWUuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2VhcmNoX2Jhc2VuYW1lKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgYmFzZW5hbWUgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBiYXNlbmFtZSAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2xpYiBpbiAnJyBnZW47IGRvCisgIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCisgICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgorICBlbHNlCisgICAgYWNfcmVzPS1sJGFjX2xpYgorICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKKyAgZmkKKyAgaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9zZWFyY2hfYmFzZW5hbWU9JGFjX3JlcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiAke2FjX2N2X3NlYXJjaF9iYXNlbmFtZSs6fSBmYWxzZTsgdGhlbiA6CisgIGJyZWFrCitmaQorZG9uZQoraWYgJHthY19jdl9zZWFyY2hfYmFzZW5hbWUrOn0gZmFsc2U7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X3NlYXJjaF9iYXNlbmFtZT1ubworZmkKK3JtIGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX2Jhc2VuYW1lIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2VhcmNoX2Jhc2VuYW1lIiA+JjY7IH0KK2FjX3Jlcz0kYWNfY3Zfc2VhcmNoX2Jhc2VuYW1lCitpZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbiA6CisgIHRlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfQkFTRU5BTUUgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXpsaWIgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3psaWIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX3psaWI7ICBpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInhubyIgOyB0aGVuCisJCWFzX2ZuX2Vycm9yICQ/ICIqKiogemxpYiBpcyByZXF1aXJlZCAqKioiICIkTElORU5PIiA1CisJICBlbGlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInh5ZXMiOyB0aGVuCisJCWlmIHRlc3QgLWQgIiR3aXRodmFsL2xpYiI7IHRoZW4KKwkJCWlmIHRlc3QgLW4gIiR7bmVlZF9kYXNoX3J9IjsgdGhlbgorCQkJCUxERkxBR1M9Ii1MJHt3aXRodmFsfS9saWIgLVIke3dpdGh2YWx9L2xpYiAke0xERkxBR1N9IgorCQkJZWxzZQorCQkJCUxERkxBR1M9Ii1MJHt3aXRodmFsfS9saWIgJHtMREZMQUdTfSIKKwkJCWZpCisJCWVsc2UKKwkJCWlmIHRlc3QgLW4gIiR7bmVlZF9kYXNoX3J9IjsgdGhlbgorCQkJCUxERkxBR1M9Ii1MJHt3aXRodmFsfSAtUiR7d2l0aHZhbH0gJHtMREZMQUdTfSIKKwkJCWVsc2UKKwkJCQlMREZMQUdTPSItTCR7d2l0aHZhbH0gJHtMREZMQUdTfSIKKwkJCWZpCisJCWZpCisJCWlmIHRlc3QgLWQgIiR3aXRodmFsL2luY2x1ZGUiOyB0aGVuCisJCQlDUFBGTEFHUz0iLUkke3dpdGh2YWx9L2luY2x1ZGUgJHtDUFBGTEFHU30iCisJCWVsc2UKKwkJCUNQUEZMQUdTPSItSSR7d2l0aHZhbH0gJHtDUFBGTEFHU30iCisJCWZpCisJZmkKKworZmkKKworCithY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiemxpYi5oIiAiYWNfY3ZfaGVhZGVyX3psaWJfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfemxpYl9oIiA9IHh5ZXM7IHRoZW4gOgorCitlbHNlCisgIGFzX2ZuX2Vycm9yICQ/ICIqKiogemxpYi5oIG1pc3NpbmcgLSBwbGVhc2UgaW5zdGFsbCBmaXJzdCBvciBjaGVjayBjb25maWcubG9nICoqKiIgIiRMSU5FTk8iIDUKK2ZpCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGVmbGF0ZSBpbiAtbHoiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRlZmxhdGUgaW4gLWx6Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl96X2RlZmxhdGUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHogICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGRlZmxhdGUgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBkZWZsYXRlICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl96X2RlZmxhdGU9eWVzCitlbHNlCisgIGFjX2N2X2xpYl96X2RlZmxhdGU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3pfZGVmbGF0ZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl96X2RlZmxhdGUiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfel9kZWZsYXRlIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTElCWiAxCitfQUNFT0YKKworICBMSUJTPSItbHogJExJQlMiCisKK2Vsc2UKKworCQlzYXZlZF9DUFBGTEFHUz0iJENQUEZMQUdTIgorCQlzYXZlZF9MREZMQUdTPSIkTERGTEFHUyIKKwkJc2F2ZV9MSUJTPSIkTElCUyIKKwkJCQlpZiB0ZXN0IC1uICIke25lZWRfZGFzaF9yfSI7IHRoZW4KKwkJCUxERkxBR1M9Ii1ML3Vzci9sb2NhbC9saWIgLVIvdXNyL2xvY2FsL2xpYiAke3NhdmVkX0xERkxBR1N9IgorCQllbHNlCisJCQlMREZMQUdTPSItTC91c3IvbG9jYWwvbGliICR7c2F2ZWRfTERGTEFHU30iCisJCWZpCisJCUNQUEZMQUdTPSItSS91c3IvbG9jYWwvaW5jbHVkZSAke3NhdmVkX0NQUEZMQUdTfSIKKwkJTElCUz0iJExJQlMgLWx6IgorCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGVmbGF0ZSAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRlZmxhdGUgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9MSUJaIDEiID4+Y29uZmRlZnMuaAorCitlbHNlCisKKwkJCQlhc19mbl9lcnJvciAkPyAiKioqIHpsaWIgbWlzc2luZyAtIHBsZWFzZSBpbnN0YWxsIGZpcnN0IG9yIGNoZWNrIGNvbmZpZy5sb2cgKioqIiAiJExJTkVOTyIgNQorCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCisKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXpsaWItdmVyc2lvbi1jaGVjayB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfemxpYl92ZXJzaW9uX2NoZWNrK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF96bGliX3ZlcnNpb25fY2hlY2s7ICAgaWYgdGVzdCAieCR3aXRodmFsIiA9ICJ4bm8iIDsgdGhlbgorCQl6bGliX2NoZWNrX25vbmZhdGFsPTEKKwkgICBmaQorCisKK2ZpCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgcG9zc2libHkgYnVnZ3kgemxpYiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgcG9zc2libHkgYnVnZ3kgemxpYi4uLiAiID4mNjsgfQoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IG5vdCBjaGVja2luZyB6bGliIHZlcnNpb24iID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY3Jvc3MgY29tcGlsaW5nOiBub3QgY2hlY2tpbmcgemxpYiB2ZXJzaW9uIiA+JjI7fQorCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8emxpYi5oPgorCitpbnQKK21haW4gKCkKK3sKKworCWludCBhPTAsIGI9MCwgYz0wLCBkPTAsIG4sIHY7CisJbiA9IHNzY2FuZihaTElCX1ZFUlNJT04sICIlZC4lZC4lZC4lZCIsICZhLCAmYiwgJmMsICZkKTsKKwlpZiAobiAhPSAzICYmIG4gIT0gNCkKKwkJZXhpdCgxKTsKKwl2ID0gYSoxMDAwMDAwICsgYioxMDAwMCArIGMqMTAwICsgZDsKKwlmcHJpbnRmKHN0ZGVyciwgImZvdW5kIHpsaWIgdmVyc2lvbiAlcyAoJWQpXG4iLCBaTElCX1ZFUlNJT04sIHYpOworCisJLyogMS4xLjQgaXMgT0sgKi8KKwlpZiAoYSA9PSAxICYmIGIgPT0gMSAmJiBjID49IDQpCisJCWV4aXQoMCk7CisKKwkvKiAxLjIuMyBhbmQgdXAgYXJlIE9LICovCisJaWYgKHYgPj0gMTAyMDMwMCkKKwkJZXhpdCgwKTsKKworCWV4aXQoMik7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZWxzZQorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwkgIGlmIHRlc3QgLXogIiR6bGliX2NoZWNrX25vbmZhdGFsIiA7IHRoZW4KKwkJYXNfZm5fZXJyb3IgJD8gIioqKiB6bGliIHRvbyBvbGQgLSBjaGVjayBjb25maWcubG9nICoqKgorWW91ciByZXBvcnRlZCB6bGliIHZlcnNpb24gaGFzIGtub3duIHNlY3VyaXR5IHByb2JsZW1zLiAgSXQncyBwb3NzaWJsZSB5b3VyCit2ZW5kb3IgaGFzIGZpeGVkIHRoZXNlIHByb2JsZW1zIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHZlcnNpb24gbnVtYmVyLiAgSWYgeW91CithcmUgc3VyZSB0aGlzIGlzIHRoZSBjYXNlLCB5b3UgY2FuIGRpc2FibGUgdGhlIGNoZWNrIGJ5IHJ1bm5pbmcKK1wiLi9jb25maWd1cmUgLS13aXRob3V0LXpsaWItdmVyc2lvbi1jaGVja1wiLgorSWYgeW91IGFyZSBpbiBkb3VidCwgdXBncmFkZSB6bGliIHRvIHZlcnNpb24gMS4yLjMgb3IgZ3JlYXRlci4KK1NlZSBodHRwOi8vd3d3Lmd6aXAub3JnL3psaWIvIGZvciBkZXRhaWxzLiIgIiRMSU5FTk8iIDUKKwkgIGVsc2UKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB6bGliIHZlcnNpb24gbWF5IGhhdmUgc2VjdXJpdHkgcHJvYmxlbXMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogemxpYiB2ZXJzaW9uIG1heSBoYXZlIHNlY3VyaXR5IHByb2JsZW1zIiA+JjI7fQorCSAgZmkKKworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKworYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAic3RyY2FzZWNtcCIgImFjX2N2X2Z1bmNfc3RyY2FzZWNtcCIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19zdHJjYXNlY21wIiA9IHh5ZXM7IHRoZW4gOgorCitlbHNlCisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdHJjYXNlY21wIGluIC1scmVzb2x2IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdHJjYXNlY21wIGluIC1scmVzb2x2Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9yZXNvbHZfc3RyY2FzZWNtcCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1scmVzb2x2ICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBzdHJjYXNlY21wICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc3RyY2FzZWNtcCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfcmVzb2x2X3N0cmNhc2VjbXA9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9yZXNvbHZfc3RyY2FzZWNtcD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfcmVzb2x2X3N0cmNhc2VjbXAiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfcmVzb2x2X3N0cmNhc2VjbXAiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfcmVzb2x2X3N0cmNhc2VjbXAiID0geHllczsgdGhlbiA6CisgIExJQlM9IiRMSUJTIC1scmVzb2x2IgorZmkKKworCitmaQorCitmb3IgYWNfZnVuYyBpbiB1dGltZXMKK2RvIDoKKyAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAidXRpbWVzIiAiYWNfY3ZfZnVuY191dGltZXMiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfdXRpbWVzIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfVVRJTUVTIDEKK19BQ0VPRgorCitlbHNlCisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1dGltZXMgaW4gLWxjODkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHV0aW1lcyBpbiAtbGM4OS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfYzg5X3V0aW1lcys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sYzg5ICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciB1dGltZXMgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiB1dGltZXMgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2M4OV91dGltZXM9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9jODlfdXRpbWVzPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9jODlfdXRpbWVzIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2M4OV91dGltZXMiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfYzg5X3V0aW1lcyIgPSB4eWVzOyB0aGVuIDoKKyAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9VVElNRVMgMSIgPj5jb25mZGVmcy5oCisKKwkJCQkJTElCUz0iJExJQlMgLWxjODkiCitmaQorCisKK2ZpCitkb25lCisKKworZm9yIGFjX2hlYWRlciBpbiBsaWJ1dGlsLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImxpYnV0aWwuaCIgImFjX2N2X2hlYWRlcl9saWJ1dGlsX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpYnV0aWxfaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0xJQlVUSUxfSCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZm10X3NjYWxlZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIGZtdF9zY2FsZWQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2VhcmNoX2ZtdF9zY2FsZWQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBmbXRfc2NhbGVkICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZm10X3NjYWxlZCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2xpYiBpbiAnJyB1dGlsIGJzZDsgZG8KKyAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KKyAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCisgIGVsc2UKKyAgICBhY19yZXM9LWwkYWNfbGliCisgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorICBmaQorICBpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3NlYXJjaF9mbXRfc2NhbGVkPSRhY19yZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgJHthY19jdl9zZWFyY2hfZm10X3NjYWxlZCs6fSBmYWxzZTsgdGhlbiA6CisgIGJyZWFrCitmaQorZG9uZQoraWYgJHthY19jdl9zZWFyY2hfZm10X3NjYWxlZCs6fSBmYWxzZTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3Zfc2VhcmNoX2ZtdF9zY2FsZWQ9bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9mbXRfc2NhbGVkIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2VhcmNoX2ZtdF9zY2FsZWQiID4mNjsgfQorYWNfcmVzPSRhY19jdl9zZWFyY2hfZm10X3NjYWxlZAoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgorICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgbG9naW4iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBsb2dpbi4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zZWFyY2hfbG9naW4rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBsb2dpbiAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGxvZ2luICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitmb3IgYWNfbGliIGluICcnIHV0aWwgYnNkOyBkbworICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgorICAgIGFjX3Jlcz0ibm9uZSByZXF1aXJlZCIKKyAgZWxzZQorICAgIGFjX3Jlcz0tbCRhY19saWIKKyAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCisgIGZpCisgIGlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc2VhcmNoX2xvZ2luPSRhY19yZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgJHthY19jdl9zZWFyY2hfbG9naW4rOn0gZmFsc2U7IHRoZW4gOgorICBicmVhaworZmkKK2RvbmUKK2lmICR7YWNfY3Zfc2VhcmNoX2xvZ2luKzp9IGZhbHNlOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9zZWFyY2hfbG9naW49bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9sb2dpbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NlYXJjaF9sb2dpbiIgPiY2OyB9CithY19yZXM9JGFjX2N2X3NlYXJjaF9sb2dpbgoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgorICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgbG9nb3V0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgbG9nb3V0Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NlYXJjaF9sb2dvdXQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBsb2dvdXQgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBsb2dvdXQgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2ZvciBhY19saWIgaW4gJycgdXRpbCBic2Q7IGRvCisgIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCisgICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgorICBlbHNlCisgICAgYWNfcmVzPS1sJGFjX2xpYgorICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKKyAgZmkKKyAgaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9zZWFyY2hfbG9nb3V0PSRhY19yZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgJHthY19jdl9zZWFyY2hfbG9nb3V0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgYnJlYWsKK2ZpCitkb25lCitpZiAke2FjX2N2X3NlYXJjaF9sb2dvdXQrOn0gZmFsc2U7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X3NlYXJjaF9sb2dvdXQ9bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9sb2dvdXQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfbG9nb3V0IiA+JjY7IH0KK2FjX3Jlcz0kYWNfY3Zfc2VhcmNoX2xvZ291dAoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgorICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgbG9nd3RtcCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIGxvZ3d0bXAuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2VhcmNoX2xvZ3d0bXArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBsb2d3dG1wICgpOworaW50CittYWluICgpCit7CityZXR1cm4gbG9nd3RtcCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2xpYiBpbiAnJyB1dGlsIGJzZDsgZG8KKyAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KKyAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCisgIGVsc2UKKyAgICBhY19yZXM9LWwkYWNfbGliCisgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorICBmaQorICBpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3NlYXJjaF9sb2d3dG1wPSRhY19yZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgJHthY19jdl9zZWFyY2hfbG9nd3RtcCs6fSBmYWxzZTsgdGhlbiA6CisgIGJyZWFrCitmaQorZG9uZQoraWYgJHthY19jdl9zZWFyY2hfbG9nd3RtcCs6fSBmYWxzZTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3Zfc2VhcmNoX2xvZ3d0bXA9bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9sb2d3dG1wIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2VhcmNoX2xvZ3d0bXAiID4mNjsgfQorYWNfcmVzPSRhY19jdl9zZWFyY2hfbG9nd3RtcAoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgorICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgb3BlbnB0eSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIG9wZW5wdHkuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2VhcmNoX29wZW5wdHkrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBvcGVucHR5ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gb3BlbnB0eSAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2xpYiBpbiAnJyB1dGlsIGJzZDsgZG8KKyAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KKyAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCisgIGVsc2UKKyAgICBhY19yZXM9LWwkYWNfbGliCisgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorICBmaQorICBpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3NlYXJjaF9vcGVucHR5PSRhY19yZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgJHthY19jdl9zZWFyY2hfb3BlbnB0eSs6fSBmYWxzZTsgdGhlbiA6CisgIGJyZWFrCitmaQorZG9uZQoraWYgJHthY19jdl9zZWFyY2hfb3BlbnB0eSs6fSBmYWxzZTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3Zfc2VhcmNoX29wZW5wdHk9bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9vcGVucHR5IiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2VhcmNoX29wZW5wdHkiID4mNjsgfQorYWNfcmVzPSRhY19jdl9zZWFyY2hfb3BlbnB0eQoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgorICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgdXBkd3RtcCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHVwZHd0bXAuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2VhcmNoX3VwZHd0bXArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciB1cGR3dG1wICgpOworaW50CittYWluICgpCit7CityZXR1cm4gdXBkd3RtcCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2xpYiBpbiAnJyB1dGlsIGJzZDsgZG8KKyAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KKyAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCisgIGVsc2UKKyAgICBhY19yZXM9LWwkYWNfbGliCisgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorICBmaQorICBpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3NlYXJjaF91cGR3dG1wPSRhY19yZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgJHthY19jdl9zZWFyY2hfdXBkd3RtcCs6fSBmYWxzZTsgdGhlbiA6CisgIGJyZWFrCitmaQorZG9uZQoraWYgJHthY19jdl9zZWFyY2hfdXBkd3RtcCs6fSBmYWxzZTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3Zfc2VhcmNoX3VwZHd0bXA9bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF91cGR3dG1wIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2VhcmNoX3VwZHd0bXAiID4mNjsgfQorYWNfcmVzPSRhY19jdl9zZWFyY2hfdXBkd3RtcAoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgorICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgorCitmaQorCitmb3IgYWNfZnVuYyBpbiBmbXRfc2NhbGVkIGxvZ2luIGxvZ291dCBvcGVucHR5IHVwZHd0bXAgbG9nd3RtcAorZG8gOgorICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCitkb25lCisKKworZm9yIGFjX2Z1bmMgaW4gc3RyZnRpbWUKK2RvIDoKKyAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAic3RyZnRpbWUiICJhY19jdl9mdW5jX3N0cmZ0aW1lIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX3N0cmZ0aW1lIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfU1RSRlRJTUUgMQorX0FDRU9GCisKK2Vsc2UKKyAgIyBzdHJmdGltZSBpcyBpbiAtbGludGwgb24gU0NPIFVOSVguCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdHJmdGltZSBpbiAtbGludGwiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0cmZ0aW1lIGluIC1saW50bC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfaW50bF9zdHJmdGltZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1saW50bCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgc3RyZnRpbWUgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBzdHJmdGltZSAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfaW50bF9zdHJmdGltZT15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX2ludGxfc3RyZnRpbWU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2ludGxfc3RyZnRpbWUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfaW50bF9zdHJmdGltZSIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9pbnRsX3N0cmZ0aW1lIiA9IHh5ZXM7IHRoZW4gOgorICAkYXNfZWNobyAiI2RlZmluZSBIQVZFX1NUUkZUSU1FIDEiID4+Y29uZmRlZnMuaAorCitMSUJTPSItbGludGwgJExJQlMiCitmaQorCitmaQorZG9uZQorCisKKyMgQ2hlY2sgZm9yIEFMVERJUkZVTkMgZ2xvYigpIGV4dGVuc2lvbgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgR0xPQl9BTFRESVJGVU5DIHN1cHBvcnQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEdMT0JfQUxURElSRlVOQyBzdXBwb3J0Li4uICIgPiY2OyB9CitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKwkJI2luY2x1ZGUgPGdsb2IuaD4KKwkJI2lmZGVmIEdMT0JfQUxURElSRlVOQworCQlGT1VORElUCisJCSNlbmRpZgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJGT1VORElUIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorCisKKyRhc19lY2hvICIjZGVmaW5lIEdMT0JfSEFTX0FMVERJUkZVTkMgMSIgPj5jb25mZGVmcy5oCisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKworZWxzZQorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCisKK2ZpCitybSAtZiBjb25mdGVzdCoKKworCisjIENoZWNrIGZvciBnLmdsX21hdGNoYyBnbG9iKCkgZXh0ZW5zaW9uCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBnbF9tYXRjaGMgZmllbGQgaW4gZ2xvYl90IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBnbF9tYXRjaGMgZmllbGQgaW4gZ2xvYl90Li4uICIgPiY2OyB9CitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisgI2luY2x1ZGUgPGdsb2IuaD4KK2ludAorbWFpbiAoKQoreworIGdsb2JfdCBnOyBnLmdsX21hdGNoYyA9IDE7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworCiskYXNfZWNobyAiI2RlZmluZSBHTE9CX0hBU19HTF9NQVRDSEMgMSIgPj5jb25mZGVmcy5oCisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKworZWxzZQorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKKyMgQ2hlY2sgZm9yIGcuZ2xfc3RhdHYgZ2xvYigpIGV4dGVuc2lvbgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ2xfc3RhdHYgYW5kIEdMT0JfS0VFUFNUQVQgZXh0ZW5zaW9ucyBmb3IgZ2xvYiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZ2xfc3RhdHYgYW5kIEdMT0JfS0VFUFNUQVQgZXh0ZW5zaW9ucyBmb3IgZ2xvYi4uLiAiID4mNjsgfQorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworICNpbmNsdWRlIDxnbG9iLmg+CitpbnQKK21haW4gKCkKK3sKKworI2lmbmRlZiBHTE9CX0tFRVBTVEFUCisjZXJyb3IgImdsb2IgZG9lcyBub3Qgc3VwcG9ydCBHTE9CX0tFRVBTVEFUIGV4dGVuc2lvbiIKKyNlbmRpZgorZ2xvYl90IGc7CitnLmdsX3N0YXR2ID0gTlVMTDsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisKKworJGFzX2VjaG8gIiNkZWZpbmUgR0xPQl9IQVNfR0xfU1RBVFYgMSIgPj5jb25mZGVmcy5oCisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKworZWxzZQorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiR0xPQl9OT01BVENIIiAiYWNfY3ZfaGF2ZV9kZWNsX0dMT0JfTk9NQVRDSCIgIiNpbmNsdWRlIDxnbG9iLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9HTE9CX05PTUFUQ0giID0geHllczsgdGhlbiA6CisgIGFjX2hhdmVfZGVjbD0xCitlbHNlCisgIGFjX2hhdmVfZGVjbD0wCitmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfREVDTF9HTE9CX05PTUFUQ0ggJGFjX2hhdmVfZGVjbAorX0FDRU9GCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHN0cnVjdCBkaXJlbnQgYWxsb2NhdGVzIHNwYWNlIGZvciBkX25hbWUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBzdHJ1Y3QgZGlyZW50IGFsbG9jYXRlcyBzcGFjZSBmb3IgZF9uYW1lLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IGFzc3VtaW5nIEJST0tFTl9PTkVfQllURV9ESVJFTlRfRF9OQU1FIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogYXNzdW1pbmcgQlJPS0VOX09ORV9CWVRFX0RJUkVOVF9EX05BTUUiID4mMjt9CisJCSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9PTkVfQllURV9ESVJFTlRfRF9OQU1FIDEiID4+Y29uZmRlZnMuaAorCisKKworZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KK2ludAorbWFpbiAoKQoreworCisJc3RydWN0IGRpcmVudCBkOworCWV4aXQoc2l6ZW9mKGQuZF9uYW1lKTw9c2l6ZW9mKGNoYXIpKTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK2Vsc2UKKworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKworJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX09ORV9CWVRFX0RJUkVOVF9EX05BTUUgMSIgPj5jb25mZGVmcy5oCisKKworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgL3Byb2MvcGlkL2ZkIGRpcmVjdG9yeSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgL3Byb2MvcGlkL2ZkIGRpcmVjdG9yeS4uLiAiID4mNjsgfQoraWYgdGVzdCAtZCAiL3Byb2MvJCQvZmQiIDsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1BST0NfUElEIDEiID4+Y29uZmRlZnMuaAorCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK2Vsc2UKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyMgQ2hlY2sgd2hldGhlciB1c2VyIHdhbnRzIFMvS2V5IHN1cHBvcnQKK1NLRVlfTVNHPSJubyIKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1za2V5IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9za2V5K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9za2V5OworCQlpZiB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iIDsgdGhlbgorCisJCQlpZiB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4eWVzIiA7IHRoZW4KKwkJCQlDUFBGTEFHUz0iJENQUEZMQUdTIC1JJHt3aXRodmFsfS9pbmNsdWRlIgorCQkJCUxERkxBR1M9IiRMREZMQUdTIC1MJHt3aXRodmFsfS9saWIiCisJCQlmaQorCisKKyRhc19lY2hvICIjZGVmaW5lIFNLRVkgMSIgPj5jb25mZGVmcy5oCisKKwkJCUxJQlM9Ii1sc2tleSAkTElCUyIKKwkJCVNLRVlfTVNHPSJ5ZXMiCisKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHMva2V5IHN1cHBvcnQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHMva2V5IHN1cHBvcnQuLi4gIiA+JjY7IH0KKwkJCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c2tleS5oPgorCitpbnQKK21haW4gKCkKK3sKKworCWNoYXIgKmZmID0gc2tleV9rZXlpbmZvKCIiKTsgZmY9IiI7CisJZXhpdCgwKTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CitlbHNlCisKKwkJCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCQkJCWFzX2ZuX2Vycm9yICQ/ICIqKiBJbmNvbXBsZXRlIG9yIG1pc3Npbmcgcy9rZXkgbGlicmFyaWVzLiIgIiRMSU5FTk8iIDUKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgICAgICAgICAgICAgIAl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHNrZXljaGFsbGVuZ2UgdGFrZXMgNCBhcmd1bWVudHMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgc2tleWNoYWxsZW5nZSB0YWtlcyA0IGFyZ3VtZW50cy4uLiAiID4mNjsgfQorCQkJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxza2V5Lmg+CisKK2ludAorbWFpbiAoKQoreworCisJKHZvaWQpc2tleWNoYWxsZW5nZShOVUxMLCJuYW1lIiwiIiwwKTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisKKwkJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCiskYXNfZWNobyAiI2RlZmluZSBTS0VZQ0hBTExFTkdFXzRBUkcgMSIgPj5jb25mZGVmcy5oCisKK2Vsc2UKKworCQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisJCWZpCisKKworZmkKKworCisjIENoZWNrIHdoZXRoZXIgdXNlciB3YW50cyBUQ1Agd3JhcHBlcnMgc3VwcG9ydAorVENQV19NU0c9Im5vIgorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXRjcC13cmFwcGVycyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfdGNwX3dyYXBwZXJzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF90Y3Bfd3JhcHBlcnM7CisJCWlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgOyB0aGVuCisJCQlzYXZlZF9MSUJTPSIkTElCUyIKKwkJCXNhdmVkX0xERkxBR1M9IiRMREZMQUdTIgorCQkJc2F2ZWRfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKKwkJCWlmIHRlc3QgLW4gIiR7d2l0aHZhbH0iICYmIFwKKwkJCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCisJCQkJaWYgdGVzdCAtZCAiJHt3aXRodmFsfS9saWIiOyB0aGVuCisJCQkJCWlmIHRlc3QgLW4gIiR7bmVlZF9kYXNoX3J9IjsgdGhlbgorCQkJCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9L2xpYiAtUiR7d2l0aHZhbH0vbGliICR7TERGTEFHU30iCisJCQkJCWVsc2UKKwkJCQkJCUxERkxBR1M9Ii1MJHt3aXRodmFsfS9saWIgJHtMREZMQUdTfSIKKwkJCQkJZmkKKwkJCQllbHNlCisJCQkJCWlmIHRlc3QgLW4gIiR7bmVlZF9kYXNoX3J9IjsgdGhlbgorCQkJCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9IC1SJHt3aXRodmFsfSAke0xERkxBR1N9IgorCQkJCQllbHNlCisJCQkJCQlMREZMQUdTPSItTCR7d2l0aHZhbH0gJHtMREZMQUdTfSIKKwkJCQkJZmkKKwkJCQlmaQorCQkJCWlmIHRlc3QgLWQgIiR7d2l0aHZhbH0vaW5jbHVkZSI7IHRoZW4KKwkJCQkJQ1BQRkxBR1M9Ii1JJHt3aXRodmFsfS9pbmNsdWRlICR7Q1BQRkxBR1N9IgorCQkJCWVsc2UKKwkJCQkJQ1BQRkxBR1M9Ii1JJHt3aXRodmFsfSAke0NQUEZMQUdTfSIKKwkJCQlmaQorCQkJZmkKKwkJCUxJQlM9Ii1sd3JhcCAkTElCUyIKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxpYndyYXAiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYndyYXAuLi4gIiA+JjY7IH0KKwkJCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8dGNwZC5oPgoraW50IGRlbnlfc2V2ZXJpdHkgPSAwLCBhbGxvd19zZXZlcml0eSA9IDA7CisKK2ludAorbWFpbiAoKQoreworCisJaG9zdHNfYWNjZXNzKDApOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKworCQkJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCiskYXNfZWNobyAiI2RlZmluZSBMSUJXUkFQIDEiID4+Y29uZmRlZnMuaAorCisJCQkJCVNTSERMSUJTPSIkU1NIRExJQlMgLWx3cmFwIgorCQkJCQlUQ1BXX01TRz0ieWVzIgorCitlbHNlCisKKwkJCQkJYXNfZm5fZXJyb3IgJD8gIioqKiBsaWJ3cmFwIG1pc3NpbmciICIkTElORU5PIiA1CisKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisJCQlMSUJTPSIkc2F2ZWRfTElCUyIKKwkJZmkKKworCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciB1c2VyIHdhbnRzIHRvIHVzZSBsZG5zCitMRE5TX01TRz0ibm8iCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbGRucyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfbGRucytzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfbGRuczsKKyAgICAgICAgaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KKworCQkJaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieHllcyIgOyB0aGVuCisJCQkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSR7d2l0aHZhbH0vaW5jbHVkZSIKKwkJCQlMREZMQUdTPSIkTERGTEFHUyAtTCR7d2l0aHZhbH0vbGliIgorCQkJZmkKKworCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0xETlMgMSIgPj5jb25mZGVmcy5oCisKKyAgICAgICAgICAgIExJQlM9Ii1sbGRucyAkTElCUyIKKyAgICAgICAgICAgIExETlNfTVNHPSJ5ZXMiCisKKyAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxkbnMgc3VwcG9ydCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGRucyBzdXBwb3J0Li4uICIgPiY2OyB9CisgICAgICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGxkbnMvbGRucy5oPgoraW50IG1haW4oKSB7IGxkbnNfc3RhdHVzIHN0YXR1cyA9IGxkbnNfdmVyaWZ5X3RydXN0ZWQoTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7IHN0YXR1cz1MRE5TX1NUQVRVU19PSzsgZXhpdCgwKTsgfQorCisKK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZWxzZQorCisJCQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCQkJCQlhc19mbl9lcnJvciAkPyAiKiogSW5jb21wbGV0ZSBvciBtaXNzaW5nIGxkbnMgbGlicmFyaWVzLiIgIiRMSU5FTk8iIDUKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgICAgIGZpCisKKworZmkKKworCisjIENoZWNrIHdoZXRoZXIgdXNlciB3YW50cyBsaWJlZGl0IHN1cHBvcnQKK0xJQkVESVRfTVNHPSJubyIKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1saWJlZGl0IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9saWJlZGl0K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9saWJlZGl0OyAgaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KKwkJaWYgdGVzdCAieCR3aXRodmFsIiA9ICJ4eWVzIiA7IHRoZW4KKwkJCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicGtnLWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcGtnLWNvbmZpZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfUEtHQ09ORklHKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkUEtHQ09ORklHIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX1BLR0NPTkZJRz0iJFBLR0NPTkZJRyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhfUEtHQ09ORklHPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1BLR0NPTkZJRyIgJiYgYWNfY3ZfcGF0aF9QS0dDT05GSUc9Im5vIgorICA7OworZXNhYworZmkKK1BLR0NPTkZJRz0kYWNfY3ZfcGF0aF9QS0dDT05GSUcKK2lmIHRlc3QgLW4gIiRQS0dDT05GSUciOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUEtHQ09ORklHIiA+JjUKKyRhc19lY2hvICIkUEtHQ09ORklHIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKwkJCWlmIHRlc3QgIngkUEtHQ09ORklHIiAhPSAieG5vIjsgdGhlbgorCQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJFBLR0NPTkZJRyBrbm93cyBhYm91dCBsaWJlZGl0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRQS0dDT05GSUcga25vd3MgYWJvdXQgbGliZWRpdC4uLiAiID4mNjsgfQorCQkJIAlpZiAiJFBLR0NPTkZJRyIgbGliZWRpdDsgdGhlbgorCQkJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCQkJCQl1c2VfcGtnY29uZmlnX2Zvcl9saWJlZGl0PXllcworCQkJCWVsc2UKKwkJCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCQkJZmkKKwkJCWZpCisJCWVsc2UKKwkJCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLUkke3dpdGh2YWx9L2luY2x1ZGUiCisJCQlpZiB0ZXN0IC1uICIke25lZWRfZGFzaF9yfSI7IHRoZW4KKwkJCQlMREZMQUdTPSItTCR7d2l0aHZhbH0vbGliIC1SJHt3aXRodmFsfS9saWIgJHtMREZMQUdTfSIKKwkJCWVsc2UKKwkJCQlMREZMQUdTPSItTCR7d2l0aHZhbH0vbGliICR7TERGTEFHU30iCisJCQlmaQorCQlmaQorCQlpZiB0ZXN0ICJ4JHVzZV9wa2djb25maWdfZm9yX2xpYmVkaXQiID0gInh5ZXMiOyB0aGVuCisJCQlMSUJFRElUPWAkUEtHQ09ORklHIC0tbGlicy1vbmx5LWwgbGliZWRpdGAKKwkJCUNQUEZMQUdTPSIkQ1BQRkxBR1MgYCRQS0dDT05GSUcgLS1jZmxhZ3MgbGliZWRpdGAiCisJCWVsc2UKKwkJCUxJQkVESVQ9Ii1sZWRpdCAtbGN1cnNlcyIKKwkJZmkKKwkJT1RIRVJMSUJTPWBlY2hvICRMSUJFRElUIHwgc2VkICdzLy1sZWRpdC8vJ2AKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZWxfaW5pdCBpbiAtbGVkaXQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGVsX2luaXQgaW4gLWxlZGl0Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9lZGl0X2VsX2luaXQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGVkaXQgICRPVEhFUkxJQlMKKwkJICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGVsX2luaXQgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBlbF9pbml0ICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9lZGl0X2VsX2luaXQ9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9lZGl0X2VsX2luaXQ9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2VkaXRfZWxfaW5pdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9lZGl0X2VsX2luaXQiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZWRpdF9lbF9pbml0IiA9IHh5ZXM7IHRoZW4gOgorCiskYXNfZWNobyAiI2RlZmluZSBVU0VfTElCRURJVCAxIiA+PmNvbmZkZWZzLmgKKworCQkJICBMSUJFRElUX01TRz0ieWVzIgorCisKK2Vsc2UKKyAgIGFzX2ZuX2Vycm9yICQ/ICJsaWJlZGl0IG5vdCBmb3VuZCIgIiRMSU5FTk8iIDUKK2ZpCisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBsaWJlZGl0IHZlcnNpb24gaXMgY29tcGF0aWJsZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiBsaWJlZGl0IHZlcnNpb24gaXMgY29tcGF0aWJsZS4uLiAiID4mNjsgfQorCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisgI2luY2x1ZGUgPGhpc3RlZGl0Lmg+CitpbnQKK21haW4gKCkKK3sKKworCWludCBpID0gSF9TRVRTSVpFOworCWVsX2luaXQoIiIsIE5VTEwsIE5VTEwsIE5VTEwpOworCWV4aXQoMCk7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK2Vsc2UKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCQkgICAgICBhc19mbl9lcnJvciAkPyAibGliZWRpdCB2ZXJzaW9uIGlzIG5vdCBjb21wYXRpYmxlIiAiJExJTkVOTyIgNQorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisJZmkKKworZmkKKworCitBVURJVF9NT0RVTEU9bm9uZQorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWF1ZGl0IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9hdWRpdCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfYXVkaXQ7CisJICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdXBwb3J0ZWQgYXVkaXQgbW9kdWxlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdXBwb3J0ZWQgYXVkaXQgbW9kdWxlLi4uICIgPiY2OyB9CisJICBjYXNlICIkd2l0aHZhbCIgaW4KKwkgIGJzbSkKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IGJzbSIgPiY1CiskYXNfZWNobyAiYnNtIiA+JjY7IH0KKwkJQVVESVRfTU9EVUxFPWJzbQorCQkJCWZvciBhY19oZWFkZXIgaW4gYnNtL2F1ZGl0LmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgImJzbS9hdWRpdC5oIiAiYWNfY3ZfaGVhZGVyX2JzbV9hdWRpdF9oIiAiCisjaWZkZWYgSEFWRV9USU1FX0gKKyMgaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisKKworIgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfYnNtX2F1ZGl0X2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9CU01fQVVESVRfSCAxCitfQUNFT0YKKworZWxzZQorICBhc19mbl9lcnJvciAkPyAiQlNNIGVuYWJsZWQgYW5kIGJzbS9hdWRpdC5oIG5vdCBmb3VuZCIgIiRMSU5FTk8iIDUKK2ZpCisKK2RvbmUKKworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBnZXRhdWRpdCBpbiAtbGJzbSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZ2V0YXVkaXQgaW4gLWxic20uLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX2JzbV9nZXRhdWRpdCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sYnNtICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBnZXRhdWRpdCAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGdldGF1ZGl0ICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9ic21fZ2V0YXVkaXQ9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9ic21fZ2V0YXVkaXQ9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2JzbV9nZXRhdWRpdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9ic21fZ2V0YXVkaXQiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfYnNtX2dldGF1ZGl0IiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTElCQlNNIDEKK19BQ0VPRgorCisgIExJQlM9Ii1sYnNtICRMSUJTIgorCitlbHNlCisgIGFzX2ZuX2Vycm9yICQ/ICJCU00gZW5hYmxlZCBhbmQgcmVxdWlyZWQgbGlicmFyeSBub3QgZm91bmQiICIkTElORU5PIiA1CitmaQorCisJCWZvciBhY19mdW5jIGluIGdldGF1ZGl0CitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImdldGF1ZGl0IiAiYWNfY3ZfZnVuY19nZXRhdWRpdCIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRhdWRpdCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0dFVEFVRElUIDEKK19BQ0VPRgorCitlbHNlCisgIGFzX2ZuX2Vycm9yICQ/ICJCU00gZW5hYmxlZCBhbmQgcmVxdWlyZWQgZnVuY3Rpb24gbm90IGZvdW5kIiAiJExJTkVOTyIgNQorZmkKK2RvbmUKKworCQkjIFRoZXNlIGFyZSBvcHRpb25hbAorCQlmb3IgYWNfZnVuYyBpbiBnZXRhdWRpdF9hZGRyIGF1Z19nZXRfbWFjaGluZQorZG8gOgorICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCitkb25lCisKKworJGFzX2VjaG8gIiNkZWZpbmUgVVNFX0JTTV9BVURJVCAxIiA+PmNvbmZkZWZzLmgKKworCQlpZiB0ZXN0ICIkc29sMnZlciIgLWVxIDExOyB0aGVuCisJCSAgIAlTU0hETElCUz0iJFNTSERMSUJTIC1sc2NmIgorCiskYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fQlNNX0FQSSAxIiA+PmNvbmZkZWZzLmgKKworCQlmaQorCQk7OworCSAgbGludXgpCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBsaW51eCIgPiY1CiskYXNfZWNobyAibGludXgiID4mNjsgfQorCQlBVURJVF9NT0RVTEU9bGludXgKKwkJCQlmb3IgYWNfaGVhZGVyIGluIGxpYmF1ZGl0LmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImxpYmF1ZGl0LmgiICJhY19jdl9oZWFkZXJfbGliYXVkaXRfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbGliYXVkaXRfaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0xJQkFVRElUX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCQlTU0hETElCUz0iJFNTSERMSUJTIC1sYXVkaXQiCisKKyRhc19lY2hvICIjZGVmaW5lIFVTRV9MSU5VWF9BVURJVCAxIiA+PmNvbmZkZWZzLmgKKworCQk7OworCSAgZGVidWcpCisJCUFVRElUX01PRFVMRT1kZWJ1ZworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogZGVidWciID4mNQorJGFzX2VjaG8gImRlYnVnIiA+JjY7IH0KKworJGFzX2VjaG8gIiNkZWZpbmUgU1NIX0FVRElUX0VWRU5UUyAxIiA+PmNvbmZkZWZzLmgKKworCQk7OworCSAgbm8pCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCQk7OworCSAgKikKKwkJYXNfZm5fZXJyb3IgJD8gIlVua25vd24gYXVkaXQgbW9kdWxlICR3aXRodmFsIiAiJExJTkVOTyIgNQorCQk7OworCWVzYWMKKworZmkKKworCitmb3IgYWNfZnVuYyBpbiAgXAorCWFyYzRyYW5kb20gXAorCWFyYzRyYW5kb21fYnVmIFwKKwlhcmM0cmFuZG9tX3VuaWZvcm0gXAorCWFzcHJpbnRmIFwKKwliNjRfbnRvcCBcCisJX19iNjRfbnRvcCBcCisJYjY0X3B0b24gXAorCV9fYjY0X3B0b24gXAorCWJjb3B5IFwKKwliaW5kcmVzdnBvcnRfc2EgXAorCWNsb2NrIFwKKwljbG9zZWZyb20gXAorCWRpcmZkIFwKKwlmY2htb2QgXAorCWZjaG93biBcCisJZnJlZWFkZHJpbmZvIFwKKwlmc3RhdHZmcyBcCisJZnV0aW1lcyBcCisJZ2V0YWRkcmluZm8gXAorCWdldGN3ZCBcCisJZ2V0Z3JvdXBsaXN0IFwKKwlnZXRuYW1laW5mbyBcCisJZ2V0b3B0IFwKKwlnZXRwZWVyZWlkIFwKKwlnZXRwZWVydWNyZWQgXAorCV9nZXRwdHkgXAorCWdldHJsaW1pdCBcCisJZ2V0dHR5ZW50IFwKKwlnbG9iIFwKKwlncm91cF9mcm9tX2dpZCBcCisJaW5ldF9hdG9uIFwKKwlpbmV0X250b2EgXAorCWluZXRfbnRvcCBcCisJaW5uZXRnciBcCisJbG9naW5fZ2V0Y2FwYm9vbCBcCisJbWQ1X2NyeXB0IFwKKwltZW1tb3ZlIFwKKwlta2R0ZW1wIFwKKwltbWFwIFwKKwluZ2V0YWRkcmluZm8gXAorCW5zbGVlcCBcCisJb2dldGFkZHJpbmZvIFwKKwlvcGVubG9nX3IgXAorCXBvbGwgXAorCXByY3RsIFwKKwlwc3RhdCBcCisJcmVhZHBhc3NwaHJhc2UgXAorCXJlYWxwYXRoIFwKKwlyZWN2bXNnIFwKKwlycmVzdnBvcnRfYWYgXAorCXNlbmRtc2cgXAorCXNldGR0YWJsZXNpemUgXAorCXNldGVnaWQgXAorCXNldGVudiBcCisJc2V0ZXVpZCBcCisJc2V0Z3JvdXBlbnQgXAorCXNldGdyb3VwcyBcCisJc2V0bG9naW4gXAorCXNldHBhc3NlbnRcCisJc2V0cGNyZWQgXAorCXNldHByb2N0aXRsZSBcCisJc2V0cmVnaWQgXAorCXNldHJldWlkIFwKKwlzZXRybGltaXQgXAorCXNldHNpZCBcCisJc2V0dmJ1ZiBcCisJc2lnYWN0aW9uIFwKKwlzaWd2ZWMgXAorCXNucHJpbnRmIFwKKwlzb2NrZXRwYWlyIFwKKwlzdGF0ZnMgXAorCXN0YXR2ZnMgXAorCXN0cmR1cCBcCisJc3RyZXJyb3IgXAorCXN0cmxjYXQgXAorCXN0cmxjcHkgXAorCXN0cm1vZGUgXAorCXN0cm5sZW4gXAorCXN0cm52aXMgXAorCXN0cnB0aW1lIFwKKwlzdHJ0b251bSBcCisJc3RydG9sbCBcCisJc3RydG91bCBcCisJc3dhcDMyIFwKKwlzeXNjb25mIFwKKwl0Y2dldHBncnAgXAorCXRpbWluZ3NhZmVfYmNtcCBcCisJdHJ1bmNhdGUgXAorCXVuc2V0ZW52IFwKKwl1cGR3dG1weCBcCisJdXNlcl9mcm9tX3VpZCBcCisJdmFzcHJpbnRmIFwKKwl2aGFuZ3VwIFwKKwl2c25wcmludGYgXAorCXdhaXRwaWQgXAorCitkbyA6CisgIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKK2RvbmUKKworCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisgI2luY2x1ZGUgPGN0eXBlLmg+CitpbnQKK21haW4gKCkKK3sKKyByZXR1cm4gKGlzYmxhbmsoJ2EnKSk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9JU0JMQU5LIDEiID4+Y29uZmRlZnMuaAorCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCisjIFBLQ1MjMTEgc3VwcG9ydCByZXF1aXJlcyBkbG9wZW4oKSBhbmQgY28KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBkbG9wZW4iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBkbG9wZW4uLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2VhcmNoX2Rsb3Blbis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGRsb3BlbiAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRsb3BlbiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2xpYiBpbiAnJyBkbDsgZG8KKyAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KKyAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCisgIGVsc2UKKyAgICBhY19yZXM9LWwkYWNfbGliCisgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorICBmaQorICBpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3NlYXJjaF9kbG9wZW49JGFjX3JlcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiAke2FjX2N2X3NlYXJjaF9kbG9wZW4rOn0gZmFsc2U7IHRoZW4gOgorICBicmVhaworZmkKK2RvbmUKK2lmICR7YWNfY3Zfc2VhcmNoX2Rsb3Blbis6fSBmYWxzZTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3Zfc2VhcmNoX2Rsb3Blbj1ubworZmkKK3JtIGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX2Rsb3BlbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NlYXJjaF9kbG9wZW4iID4mNjsgfQorYWNfcmVzPSRhY19jdl9zZWFyY2hfZGxvcGVuCitpZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbiA6CisgIHRlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCisKKyRhc19lY2hvICIjZGVmaW5lIEVOQUJMRV9QS0NTMTEgLyoqLyIgPj5jb25mZGVmcy5oCisKKworZmkKKworCisjIElSSVggaGFzIGEgY29uc3QgY2hhciByZXR1cm4gdmFsdWUgZm9yIGdhaV9zdHJlcnJvcigpCitmb3IgYWNfZnVuYyBpbiBnYWlfc3RyZXJyb3IKK2RvIDoKKyAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZ2FpX3N0cmVycm9yIiAiYWNfY3ZfZnVuY19nYWlfc3RyZXJyb3IiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2FpX3N0cmVycm9yIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfR0FJX1NUUkVSUk9SIDEKK19BQ0VPRgorCisJJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9HQUlfU1RSRVJST1IgMSIgPj5jb25mZGVmcy5oCisKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKworY29uc3QgY2hhciAqZ2FpX3N0cmVycm9yKGludCk7CisKK2ludAorbWFpbiAoKQoreworCisJY2hhciAqc3RyOworCXN0ciA9IGdhaV9zdHJlcnJvcigwKTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9DT05TVF9HQUlfU1RSRVJST1JfUFJPVE8gMSIgPj5jb25mZGVmcy5oCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitkb25lCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIG5hbm9zbGVlcCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIG5hbm9zbGVlcC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zZWFyY2hfbmFub3NsZWVwKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgbmFub3NsZWVwICgpOworaW50CittYWluICgpCit7CityZXR1cm4gbmFub3NsZWVwICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitmb3IgYWNfbGliIGluICcnIHJ0IHBvc2l4NDsgZG8KKyAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KKyAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCisgIGVsc2UKKyAgICBhY19yZXM9LWwkYWNfbGliCisgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorICBmaQorICBpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3NlYXJjaF9uYW5vc2xlZXA9JGFjX3JlcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiAke2FjX2N2X3NlYXJjaF9uYW5vc2xlZXArOn0gZmFsc2U7IHRoZW4gOgorICBicmVhaworZmkKK2RvbmUKK2lmICR7YWNfY3Zfc2VhcmNoX25hbm9zbGVlcCs6fSBmYWxzZTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3Zfc2VhcmNoX25hbm9zbGVlcD1ubworZmkKK3JtIGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX25hbm9zbGVlcCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NlYXJjaF9uYW5vc2xlZXAiID4mNjsgfQorYWNfcmVzPSRhY19jdl9zZWFyY2hfbmFub3NsZWVwCitpZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbiA6CisgIHRlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfTkFOT1NMRUVQIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisKK2FjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgImdldHJ1c2FnZSIgImFjX2N2X2hhdmVfZGVjbF9nZXRydXNhZ2UiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX2dldHJ1c2FnZSIgPSB4eWVzOyB0aGVuIDoKKyAgZm9yIGFjX2Z1bmMgaW4gZ2V0cnVzYWdlCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImdldHJ1c2FnZSIgImFjX2N2X2Z1bmNfZ2V0cnVzYWdlIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX2dldHJ1c2FnZSIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0dFVFJVU0FHRSAxCitfQUNFT0YKKworZmkKK2RvbmUKKworZmkKKworYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAic3Ryc2VwIiAiYWNfY3ZfaGF2ZV9kZWNsX3N0cnNlcCIgIgorI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworIgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfc3Ryc2VwIiA9IHh5ZXM7IHRoZW4gOgorICBmb3IgYWNfZnVuYyBpbiBzdHJzZXAKK2RvIDoKKyAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAic3Ryc2VwIiAiYWNfY3ZfZnVuY19zdHJzZXAiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc3Ryc2VwIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfU1RSU0VQIDEKK19BQ0VPRgorCitmaQorZG9uZQorCitmaQorCisKK2FjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgInRjc2VuZGJyZWFrIiAiYWNfY3ZfaGF2ZV9kZWNsX3Rjc2VuZGJyZWFrIiAiI2luY2x1ZGUgPHRlcm1pb3MuaD4KKworIgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfdGNzZW5kYnJlYWsiID0geHllczsgdGhlbiA6CisgICRhc19lY2hvICIjZGVmaW5lIEhBVkVfVENTRU5EQlJFQUsgMSIgPj5jb25mZGVmcy5oCisKK2Vsc2UKKyAgZm9yIGFjX2Z1bmMgaW4gdGNzZW5kYnJlYWsKK2RvIDoKKyAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAidGNzZW5kYnJlYWsiICJhY19jdl9mdW5jX3Rjc2VuZGJyZWFrIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX3Rjc2VuZGJyZWFrIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfVENTRU5EQlJFQUsgMQorX0FDRU9GCisKK2ZpCitkb25lCisKK2ZpCisKKworYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiaF9lcnJubyIgImFjX2N2X2hhdmVfZGVjbF9oX2Vycm5vIiAiI2luY2x1ZGUgPG5ldGRiLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9oX2Vycm5vIiA9IHh5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfSF9FUlJOTyAkYWNfaGF2ZV9kZWNsCitfQUNFT0YKKworCithY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJTSFVUX1JEIiAiYWNfY3ZfaGF2ZV9kZWNsX1NIVVRfUkQiICIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX1NIVVRfUkQiID0geHllczsgdGhlbiA6CisgIGFjX2hhdmVfZGVjbD0xCitlbHNlCisgIGFjX2hhdmVfZGVjbD0wCitmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfREVDTF9TSFVUX1JEICRhY19oYXZlX2RlY2wKK19BQ0VPRgorCisKK2FjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIk9fTk9OQkxPQ0siICJhY19jdl9oYXZlX2RlY2xfT19OT05CTE9DSyIgIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9GQ05UTF9ICisjIGluY2x1ZGUgPGZjbnRsLmg+CisjZW5kaWYKKworIgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfT19OT05CTE9DSyIgPSB4eWVzOyB0aGVuIDoKKyAgYWNfaGF2ZV9kZWNsPTEKK2Vsc2UKKyAgYWNfaGF2ZV9kZWNsPTAKK2ZpCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ERUNMX09fTk9OQkxPQ0sgJGFjX2hhdmVfZGVjbAorX0FDRU9GCisKKworYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAid3JpdGV2IiAiYWNfY3ZfaGF2ZV9kZWNsX3dyaXRldiIgIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworIgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfd3JpdGV2IiA9IHh5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfV1JJVEVWICRhY19oYXZlX2RlY2wKK19BQ0VPRgorCisKK2FjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIk1BWFNZTUxJTktTIiAiYWNfY3ZfaGF2ZV9kZWNsX01BWFNZTUxJTktTIiAiCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX01BWFNZTUxJTktTIiA9IHh5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfTUFYU1lNTElOS1MgJGFjX2hhdmVfZGVjbAorX0FDRU9GCisKKworYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAib2Zmc2V0b2YiICJhY19jdl9oYXZlX2RlY2xfb2Zmc2V0b2YiICIKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworIgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfb2Zmc2V0b2YiID0geHllczsgdGhlbiA6CisgIGFjX2hhdmVfZGVjbD0xCitlbHNlCisgIGFjX2hhdmVfZGVjbD0wCitmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfREVDTF9PRkZTRVRPRiAkYWNfaGF2ZV9kZWNsCitfQUNFT0YKKworCitmb3IgYWNfZnVuYyBpbiBzZXRyZXN1aWQKK2RvIDoKKyAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAic2V0cmVzdWlkIiAiYWNfY3ZfZnVuY19zZXRyZXN1aWQiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc2V0cmVzdWlkIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfU0VUUkVTVUlEIDEKK19BQ0VPRgorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgc2V0cmVzdWlkIHNlZW1zIHRvIHdvcmsiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgc2V0cmVzdWlkIHNlZW1zIHRvIHdvcmsuLi4gIiA+JjY7IH0KKwlpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY3Jvc3MgY29tcGlsaW5nOiBub3QgY2hlY2tpbmcgc2V0cmVzdWlkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogbm90IGNoZWNraW5nIHNldHJlc3VpZCIgPiYyO30KKworZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCitpbnQKK21haW4gKCkKK3sKKworCWVycm5vPTA7CisJc2V0cmVzdWlkKDAsMCwwKTsKKwlpZiAoZXJybm89PUVOT1NZUykKKwkJZXhpdCgxKTsKKwllbHNlCisJCWV4aXQoMCk7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CitlbHNlCisKKyRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9TRVRSRVNVSUQgMSIgPj5jb25mZGVmcy5oCisKKwkJIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub3QgaW1wbGVtZW50ZWQiID4mNQorJGFzX2VjaG8gIm5vdCBpbXBsZW1lbnRlZCIgPiY2OyB9CitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworCitmaQorZG9uZQorCisKK2ZvciBhY19mdW5jIGluIHNldHJlc2dpZAorZG8gOgorICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJzZXRyZXNnaWQiICJhY19jdl9mdW5jX3NldHJlc2dpZCIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19zZXRyZXNnaWQiID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TRVRSRVNHSUQgMQorX0FDRU9GCisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBzZXRyZXNnaWQgc2VlbXMgdG8gd29yayIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiBzZXRyZXNnaWQgc2VlbXMgdG8gd29yay4uLiAiID4mNjsgfQorCWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IG5vdCBjaGVja2luZyBzZXRyZXN1aWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY3Jvc3MgY29tcGlsaW5nOiBub3QgY2hlY2tpbmcgc2V0cmVzdWlkIiA+JjI7fQorCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKK2ludAorbWFpbiAoKQoreworCisJZXJybm89MDsKKwlzZXRyZXNnaWQoMCwwLDApOworCWlmIChlcnJubz09RU5PU1lTKQorCQlleGl0KDEpOworCWVsc2UKKwkJZXhpdCgwKTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK2Vsc2UKKworJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1NFVFJFU0dJRCAxIiA+PmNvbmZkZWZzLmgKKworCQkgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vdCBpbXBsZW1lbnRlZCIgPiY1CiskYXNfZWNobyAibm90IGltcGxlbWVudGVkIiA+JjY7IH0KK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCisKK2ZpCitkb25lCisKKworZm9yIGFjX2Z1bmMgaW4gZ2V0dGltZW9mZGF5IHRpbWUKK2RvIDoKKyAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorZG9uZQorCitmb3IgYWNfZnVuYyBpbiBlbmR1dGVudCBnZXR1dGVudCBnZXR1dGlkIGdldHV0bGluZSBwdXR1dGxpbmUgc2V0dXRlbnQKK2RvIDoKKyAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorZG9uZQorCitmb3IgYWNfZnVuYyBpbiB1dG1wbmFtZQorZG8gOgorICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJ1dG1wbmFtZSIgImFjX2N2X2Z1bmNfdXRtcG5hbWUiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfdXRtcG5hbWUiID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9VVE1QTkFNRSAxCitfQUNFT0YKKworZmkKK2RvbmUKKworZm9yIGFjX2Z1bmMgaW4gZW5kdXR4ZW50IGdldHV0eGVudCBnZXR1dHhpZCBnZXR1dHhsaW5lIGdldHV0eHVzZXIgcHV0dXR4bGluZQorZG8gOgorICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCitkb25lCisKK2ZvciBhY19mdW5jIGluIHNldHV0eGRiIHNldHV0eGVudCB1dG1weG5hbWUKK2RvIDoKKyAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorZG9uZQorCitmb3IgYWNfZnVuYyBpbiBnZXRsYXN0bG9neGJ5bmFtZQorZG8gOgorICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJnZXRsYXN0bG9neGJ5bmFtZSIgImFjX2N2X2Z1bmNfZ2V0bGFzdGxvZ3hieW5hbWUiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0bGFzdGxvZ3hieW5hbWUiID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9HRVRMQVNUTE9HWEJZTkFNRSAxCitfQUNFT0YKKworZmkKK2RvbmUKKworCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJkYWVtb24iICJhY19jdl9mdW5jX2RhZW1vbiIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19kYWVtb24iID0geHllczsgdGhlbiA6CisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfREFFTU9OIDEiID4+Y29uZmRlZnMuaAorCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRhZW1vbiBpbiAtbGJzZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGFlbW9uIGluIC1sYnNkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9ic2RfZGFlbW9uKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxic2QgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGRhZW1vbiAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRhZW1vbiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfYnNkX2RhZW1vbj15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX2JzZF9kYWVtb249bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2JzZF9kYWVtb24iID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfYnNkX2RhZW1vbiIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9ic2RfZGFlbW9uIiA9IHh5ZXM7IHRoZW4gOgorICBMSUJTPSIkTElCUyAtbGJzZCI7ICRhc19lY2hvICIjZGVmaW5lIEhBVkVfREFFTU9OIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisKK2ZpCisKKworYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZ2V0cGFnZXNpemUiICJhY19jdl9mdW5jX2dldHBhZ2VzaXplIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX2dldHBhZ2VzaXplIiA9IHh5ZXM7IHRoZW4gOgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0dFVFBBR0VTSVpFIDEiID4+Y29uZmRlZnMuaAorCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdldHBhZ2VzaXplIGluIC1sdWNiIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBnZXRwYWdlc2l6ZSBpbiAtbHVjYi4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfdWNiX2dldHBhZ2VzaXplKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWx1Y2IgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGdldHBhZ2VzaXplICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZ2V0cGFnZXNpemUgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX3VjYl9nZXRwYWdlc2l6ZT15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX3VjYl9nZXRwYWdlc2l6ZT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfdWNiX2dldHBhZ2VzaXplIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX3VjYl9nZXRwYWdlc2l6ZSIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl91Y2JfZ2V0cGFnZXNpemUiID0geHllczsgdGhlbiA6CisgIExJQlM9IiRMSUJTIC1sdWNiIjsgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9HRVRQQUdFU0laRSAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworCitmaQorCisKKyMgQ2hlY2sgZm9yIGJyb2tlbiBzbnByaW50ZgoraWYgdGVzdCAieCRhY19jdl9mdW5jX3NucHJpbnRmIiA9ICJ4eWVzIiA7IHRoZW4KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgc25wcmludGYgY29ycmVjdGx5IHRlcm1pbmF0ZXMgbG9uZyBzdHJpbmdzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgc25wcmludGYgY29ycmVjdGx5IHRlcm1pbmF0ZXMgbG9uZyBzdHJpbmdzLi4uICIgPiY2OyB9CisJaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IEFzc3VtaW5nIHdvcmtpbmcgc25wcmludGYoKSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IEFzc3VtaW5nIHdvcmtpbmcgc25wcmludGYoKSIgPiYyO30KKworZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisgI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQKK21haW4gKCkKK3sKKworCWNoYXIgYls1XTsKKwlzbnByaW50ZihiLDUsIjEyMzQ1Njc4OSIpOworCWV4aXQoYls0XSE9J1wwJyk7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CitlbHNlCisKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCiskYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU05QUklOVEYgMSIgPj5jb25mZGVmcy5oCisKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogKioqKioqIFlvdXIgc25wcmludGYoKSBmdW5jdGlvbiBpcyBicm9rZW4sIGNvbXBsYWluIHRvIHlvdXIgdmVuZG9yIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICoqKioqKiBZb3VyIHNucHJpbnRmKCkgZnVuY3Rpb24gaXMgYnJva2VuLCBjb21wbGFpbiB0byB5b3VyIHZlbmRvciIgPiYyO30KKworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCisKKyMgSWYgd2UgZG9uJ3QgaGF2ZSBhIHdvcmtpbmcgYXNwcmludGYsIHRoZW4gd2Ugc3Ryb25nbHkgZGVwZW5kIG9uIHZzbnByaW50ZgorIyByZXR1cm5pbmcgdGhlIHJpZ2h0IHRoaW5nIG9uIG92ZXJmbG93OiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaXQgdHJpZWQgdG8KKyMgY3JlYXRlIChhcyBwZXIgU1VTdjMpCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfYXNwcmludGYiICE9ICJ4eWVzIiAmJiBcCisgICB0ZXN0ICJ4JGFjX2N2X2Z1bmNfdnNucHJpbnRmIiA9ICJ4eWVzIiA7IHRoZW4KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdnNucHJpbnRmIHJldHVybnMgY29ycmVjdCB2YWx1ZXMgb24gb3ZlcmZsb3ciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB2c25wcmludGYgcmV0dXJucyBjb3JyZWN0IHZhbHVlcyBvbiBvdmVyZmxvdy4uLiAiID4mNjsgfQorCWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY3Jvc3MgY29tcGlsaW5nOiBBc3N1bWluZyB3b3JraW5nIHZzbnByaW50ZigpIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogQXNzdW1pbmcgd29ya2luZyB2c25wcmludGYoKSIgPiYyO30KKworZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitpbnQgeF9zbnByaW50ZihjaGFyICpzdHIsc2l6ZV90IGNvdW50LGNvbnN0IGNoYXIgKmZtdCwuLi4pCit7CisJc2l6ZV90IHJldDsgdmFfbGlzdCBhcDsKKwl2YV9zdGFydChhcCwgZm10KTsgcmV0ID0gdnNucHJpbnRmKHN0ciwgY291bnQsIGZtdCwgYXApOyB2YV9lbmQoYXApOworCXJldHVybiByZXQ7Cit9CisKK2ludAorbWFpbiAoKQoreworCisJY2hhciB4WzFdOworCWV4aXQoeF9zbnByaW50Zih4LCAxLCAiJXMgJWQiLCAiaGVsbG8iLCAxMjM0NSkgPT0gMTEgPyAwIDogMSk7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CitlbHNlCisKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCiskYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU05QUklOVEYgMSIgPj5jb25mZGVmcy5oCisKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogKioqKioqIFlvdXIgdnNucHJpbnRmKCkgZnVuY3Rpb24gaXMgYnJva2VuLCBjb21wbGFpbiB0byB5b3VyIHZlbmRvciIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAqKioqKiogWW91ciB2c25wcmludGYoKSBmdW5jdGlvbiBpcyBicm9rZW4sIGNvbXBsYWluIHRvIHlvdXIgdmVuZG9yIiA+JjI7fQorCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKKworIyBPbiBzeXN0ZW1zIHdoZXJlIFt2XXNucHJpbnRmIGlzIGJyb2tlbiwgYnV0IGlzIGRlY2xhcmVkIGluIHN0ZGlvLAorIyBjaGVjayB0aGF0IHRoZSBmbXQgYXJndW1lbnQgaXMgY29uc3QgY2hhciAqIG9yIGp1c3QgY2hhciAqLgorIyBUaGlzIGlzIG9ubHkgdXNlZnVsIGZvciB3aGVuIEJST0tFTl9TTlBSSU5URgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHNucHJpbnRmIGNhbiBkZWNsYXJlIGNvbnN0IGNoYXIgKmZtdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHNucHJpbnRmIGNhbiBkZWNsYXJlIGNvbnN0IGNoYXIgKmZtdC4uLiAiID4mNjsgfQorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludCBzbnByaW50ZihjaGFyICphLCBzaXplX3QgYiwgY29uc3QgY2hhciAqYywgLi4uKSB7IHJldHVybiAwOyB9CisKK2ludAorbWFpbiAoKQoreworCisJc25wcmludGYoMCwgMCwgMCk7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCiskYXNfZWNobyAiI2RlZmluZSBTTlBSSU5URl9DT05TVCBjb25zdCIgPj5jb25mZGVmcy5oCisKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgICAgJGFzX2VjaG8gIiNkZWZpbmUgU05QUklOVEZfQ09OU1QgLyogbm90IGNvbnN0ICovIiA+PmNvbmZkZWZzLmgKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCisjIENoZWNrIGZvciBtaXNzaW5nIGdldHBlZXJlaWQgKG9yIGVxdWl2KSBzdXBwb3J0CitOT19QRUVSQ0hFQ0s9IiIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRwZWVyZWlkIiAhPSAieHllcyIgLWEgIngkYWNfY3ZfZnVuY19nZXRwZWVydWNyZWQiICE9ICJ4eWVzIjsgdGhlbgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBzeXN0ZW0gc3VwcG9ydHMgU09fUEVFUkNSRUQgZ2V0c29ja29wdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHN5c3RlbSBzdXBwb3J0cyBTT19QRUVSQ1JFRCBnZXRzb2Nrb3B0Li4uICIgPiY2OyB9CisJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgoraW50CittYWluICgpCit7CitpbnQgaSA9IFNPX1BFRVJDUkVEOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1NPX1BFRVJDUkVEIDEiID4+Y29uZmRlZnMuaAorCisKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCU5PX1BFRVJDSEVDSz0xCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19ta2R0ZW1wIiA9ICJ4eWVzIiA7IHRoZW4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIChvdmVybHkpIHN0cmljdCBta3N0ZW1wIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAob3Zlcmx5KSBzdHJpY3QgbWtzdGVtcC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJCSRhc19lY2hvICIjZGVmaW5lIEhBVkVfU1RSSUNUX01LU1RFTVAgMSIgPj5jb25mZGVmcy5oCisKKworCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitpbnQKK21haW4gKCkKK3sKKworCWNoYXIgdGVtcGxhdGVbXT0iY29uZnRlc3QubWtzdGVtcC10ZXN0IjsKKwlpZiAobWtzdGVtcCh0ZW1wbGF0ZSkgPT0gLTEpCisJCWV4aXQoMSk7CisJdW5saW5rKHRlbXBsYXRlKTsKKwlleGl0KDApOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCitlbHNlCisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TVFJJQ1RfTUtTVEVNUCAxIiA+PmNvbmZkZWZzLmgKKworCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKKworaWYgdGVzdCAhIC16ICIkY2hlY2tfZm9yX29wZW5wdHlfY3R0eV9idWciOyB0aGVuCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBvcGVucHR5IGNvcnJlY3RseSBoYW5kbGVzIGNvbnRyb2xsaW5nIHR0eSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiBvcGVucHR5IGNvcnJlY3RseSBoYW5kbGVzIGNvbnRyb2xsaW5nIHR0eS4uLiAiID4mNjsgfQorCWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKworCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IGNyb3NzLWNvbXBpbGluZywgYXNzdW1pbmcgeWVzIiA+JjUKKyRhc19lY2hvICJjcm9zcy1jb21waWxpbmcsIGFzc3VtaW5nIHllcyIgPiY2OyB9CisKKworZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKK2ludAorbWFpbiAoKQoreworCisJcGlkX3QgcGlkOworCWludCBmZCwgcHR5ZmQsIHR0eWZkLCBzdGF0dXM7CisKKwlwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA8IDApIHsJCS8qIGZhaWxlZCAqLworCQlleGl0KDEpOworCX0gZWxzZSBpZiAocGlkID4gMCkgewkvKiBwYXJlbnQgKi8KKwkJd2FpdHBpZChwaWQsICZzdGF0dXMsIDApOworCQlpZiAoV0lGRVhJVEVEKHN0YXR1cykpCisJCQlleGl0KFdFWElUU1RBVFVTKHN0YXR1cykpOworCQllbHNlCisJCQlleGl0KDIpOworCX0gZWxzZSB7CQkvKiBjaGlsZCAqLworCQljbG9zZSgwKTsgY2xvc2UoMSk7IGNsb3NlKDIpOworCQlzZXRzaWQoKTsKKwkJb3BlbnB0eSgmcHR5ZmQsICZ0dHlmZCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCWZkID0gb3BlbigiL2Rldi90dHkiLCBPX1JEV1IgfCBPX05PQ1RUWSk7CisJCWlmIChmZCA+PSAwKQorCQkJZXhpdCgzKTsJLyogQWNxdWlyZWQgY3R0eTogYnJva2VuICovCisJCWVsc2UKKwkJCWV4aXQoMCk7CS8qIERpZCBub3QgYWNxdWlyZSBjdHR5OiBPSyAqLworCX0KKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKworCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKworZWxzZQorCisJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwkJCSRhc19lY2hvICIjZGVmaW5lIFNTSERfQUNRVUlSRVNfQ1RUWSAxIiA+PmNvbmZkZWZzLmgKKworCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKKworaWYgdGVzdCAieCRhY19jdl9mdW5jX2dldGFkZHJpbmZvIiA9ICJ4eWVzIiAmJiBcCisgICAgdGVzdCAieCRjaGVja19mb3JfaHB1eF9icm9rZW5fZ2V0YWRkcmluZm8iID0gIngxIjsgdGhlbgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgZ2V0YWRkcmluZm8gc2VlbXMgdG8gd29yayIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiBnZXRhZGRyaW5mbyBzZWVtcyB0byB3b3JrLi4uICIgPiY2OyB9CisJaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorCisJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogY3Jvc3MtY29tcGlsaW5nLCBhc3N1bWluZyB5ZXMiID4mNQorJGFzX2VjaG8gImNyb3NzLWNvbXBpbGluZywgYXNzdW1pbmcgeWVzIiA+JjY7IH0KKworCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNkZWZpbmUgVEVTVF9QT1JUICIyMjIyIgorCitpbnQKK21haW4gKCkKK3sKKworCWludCBlcnIsIHNvY2s7CisJc3RydWN0IGFkZHJpbmZvICpnYWlfYWksICphaSwgaGludHM7CisJY2hhciBudG9wW05JX01BWEhPU1RdLCBzdHJwb3J0W05JX01BWFNFUlZdLCAqbmFtZSA9IE5VTEw7CisKKwltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKwloaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKwloaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkU7CisKKwllcnIgPSBnZXRhZGRyaW5mbyhuYW1lLCBURVNUX1BPUlQsICZoaW50cywgJmdhaV9haSk7CisJaWYgKGVyciAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZ2V0YWRkcmluZm8gZmFpbGVkICglcykiLCBnYWlfc3RyZXJyb3IoZXJyKSk7CisJCWV4aXQoMSk7CisJfQorCisJZm9yIChhaSA9IGdhaV9haTsgYWkgIT0gTlVMTDsgYWkgPSBhaS0+YWlfbmV4dCkgeworCQlpZiAoYWktPmFpX2ZhbWlseSAhPSBBRl9JTkVUNikKKwkJCWNvbnRpbnVlOworCisJCWVyciA9IGdldG5hbWVpbmZvKGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbiwgbnRvcCwKKwkJICAgIHNpemVvZihudG9wKSwgc3RycG9ydCwgc2l6ZW9mKHN0cnBvcnQpLAorCQkgICAgTklfTlVNRVJJQ0hPU1R8TklfTlVNRVJJQ1NFUlYpOworCisJCWlmIChlcnIgIT0gMCkgeworCQkJaWYgKGVyciA9PSBFQUlfU1lTVEVNKQorCQkJCXBlcnJvcigiZ2V0bmFtZWluZm8gRUFJX1NZU1RFTSIpOworCQkJZWxzZQorCQkJCWZwcmludGYoc3RkZXJyLCAiZ2V0bmFtZWluZm8gZmFpbGVkOiAlc1xuIiwKKwkJCQkgICAgZ2FpX3N0cmVycm9yKGVycikpOworCQkJZXhpdCgyKTsKKwkJfQorCisJCXNvY2sgPSBzb2NrZXQoYWktPmFpX2ZhbWlseSwgYWktPmFpX3NvY2t0eXBlLCBhaS0+YWlfcHJvdG9jb2wpOworCQlpZiAoc29jayA8IDApCisJCQlwZXJyb3IoInNvY2tldCIpOworCQlpZiAoYmluZChzb2NrLCBhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4pIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVCQURGKQorCQkJCWV4aXQoMyk7CisJCX0KKwl9CisJZXhpdCgwKTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKworCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKworZWxzZQorCisJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwkJCSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9HRVRBRERSSU5GTyAxIiA+PmNvbmZkZWZzLmgKKworCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKKworaWYgdGVzdCAieCRhY19jdl9mdW5jX2dldGFkZHJpbmZvIiA9ICJ4eWVzIiAmJiBcCisgICAgdGVzdCAieCRjaGVja19mb3JfYWl4X2Jyb2tlbl9nZXRhZGRyaW5mbyIgPSAieDEiOyB0aGVuCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBnZXRhZGRyaW5mbyBzZWVtcyB0byB3b3JrIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIGdldGFkZHJpbmZvIHNlZW1zIHRvIHdvcmsuLi4gIiA+JjY7IH0KKwlpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBjcm9zcy1jb21waWxpbmcsIGFzc3VtaW5nIG5vIiA+JjUKKyRhc19lY2hvICJjcm9zcy1jb21waWxpbmcsIGFzc3VtaW5nIG5vIiA+JjY7IH0KKworCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNkZWZpbmUgVEVTVF9QT1JUICIyMjIyIgorCitpbnQKK21haW4gKCkKK3sKKworCWludCBlcnIsIHNvY2s7CisJc3RydWN0IGFkZHJpbmZvICpnYWlfYWksICphaSwgaGludHM7CisJY2hhciBudG9wW05JX01BWEhPU1RdLCBzdHJwb3J0W05JX01BWFNFUlZdLCAqbmFtZSA9IE5VTEw7CisKKwltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKwloaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKwloaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkU7CisKKwllcnIgPSBnZXRhZGRyaW5mbyhuYW1lLCBURVNUX1BPUlQsICZoaW50cywgJmdhaV9haSk7CisJaWYgKGVyciAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZ2V0YWRkcmluZm8gZmFpbGVkICglcykiLCBnYWlfc3RyZXJyb3IoZXJyKSk7CisJCWV4aXQoMSk7CisJfQorCisJZm9yIChhaSA9IGdhaV9haTsgYWkgIT0gTlVMTDsgYWkgPSBhaS0+YWlfbmV4dCkgeworCQlpZiAoYWktPmFpX2ZhbWlseSAhPSBBRl9JTkVUICYmIGFpLT5haV9mYW1pbHkgIT0gQUZfSU5FVDYpCisJCQljb250aW51ZTsKKworCQllcnIgPSBnZXRuYW1laW5mbyhhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4sIG50b3AsCisJCSAgICBzaXplb2YobnRvcCksIHN0cnBvcnQsIHNpemVvZihzdHJwb3J0KSwKKwkJICAgIE5JX05VTUVSSUNIT1NUfE5JX05VTUVSSUNTRVJWKTsKKworCQlpZiAoYWktPmFpX2ZhbWlseSA9PSBBRl9JTkVUICYmIGVyciAhPSAwKSB7CisJCQlwZXJyb3IoImdldG5hbWVpbmZvIik7CisJCQlleGl0KDIpOworCQl9CisJfQorCWV4aXQoMCk7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisKKyRhc19lY2hvICIjZGVmaW5lIEFJWF9HRVROQU1FSU5GT19IQUNLIDEiID4+Y29uZmRlZnMuaAorCisKK2Vsc2UKKworCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCQkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fR0VUQUREUklORk8gMSIgPj5jb25mZGVmcy5oCisKKworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCisKK2lmIHRlc3QgIngkY2hlY2tfZm9yX2NvbmZsaWN0aW5nX2dldHNwbmFtIiA9ICJ4MSI7IHRoZW4KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBjb25mbGljdGluZyBnZXRzcG5hbSBpbiBzaGFkb3cuaCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgY29uZmxpY3RpbmcgZ2V0c3BuYW0gaW4gc2hhZG93LmguLi4gIiA+JjY7IH0KKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisgI2luY2x1ZGUgPHNoYWRvdy5oPgoraW50CittYWluICgpCit7CisgZXhpdCgwKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCisJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKworZWxzZQorCisJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCiskYXNfZWNobyAiI2RlZmluZSBHRVRTUE5BTV9DT05GTElDVElOR19ERUZTIDEiID4+Y29uZmRlZnMuaAorCisKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGdldHBncnAgcmVxdWlyZXMgemVybyBhcmd1bWVudHMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBnZXRwZ3JwIHJlcXVpcmVzIHplcm8gYXJndW1lbnRzLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2Z1bmNfZ2V0cGdycF92b2lkKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgIyBVc2UgaXQgd2l0aCBhIHNpbmdsZSBhcmcuCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAoraW50CittYWluICgpCit7CitnZXRwZ3JwICgwKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9mdW5jX2dldHBncnBfdm9pZD1ubworZWxzZQorICBhY19jdl9mdW5jX2dldHBncnBfdm9pZD15ZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY19nZXRwZ3JwX3ZvaWQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9mdW5jX2dldHBncnBfdm9pZCIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9mdW5jX2dldHBncnBfdm9pZCA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBHRVRQR1JQX1ZPSUQgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKworIyBTZWFyY2ggZm9yIE9wZW5TU0wKK3NhdmVkX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCitzYXZlZF9MREZMQUdTPSIkTERGTEFHUyIKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1zc2wtZGlyIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9zc2xfZGlyK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9zc2xfZGlyOworCQlpZiB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iIDsgdGhlbgorCQkJY2FzZSAiJHdpdGh2YWwiIGluCisJCQkJIyBSZWxhdGl2ZSBwYXRocworCQkJCS4vKnwuLi8qKQl3aXRodmFsPSJgcHdkYC8kd2l0aHZhbCIKKwkJCWVzYWMKKwkJCWlmIHRlc3QgLWQgIiR3aXRodmFsL2xpYiI7IHRoZW4KKwkJCQlpZiB0ZXN0IC1uICIke25lZWRfZGFzaF9yfSI7IHRoZW4KKwkJCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9L2xpYiAtUiR7d2l0aHZhbH0vbGliICR7TERGTEFHU30iCisJCQkJZWxzZQorCQkJCQlMREZMQUdTPSItTCR7d2l0aHZhbH0vbGliICR7TERGTEFHU30iCisJCQkJZmkKKwkJCWVsaWYgdGVzdCAtZCAiJHdpdGh2YWwvbGliNjQiOyB0aGVuCisJCQkJaWYgdGVzdCAtbiAiJHtuZWVkX2Rhc2hfcn0iOyB0aGVuCisJCQkJCUxERkxBR1M9Ii1MJHt3aXRodmFsfS9saWI2NCAtUiR7d2l0aHZhbH0vbGliNjQgJHtMREZMQUdTfSIKKwkJCQllbHNlCisJCQkJCUxERkxBR1M9Ii1MJHt3aXRodmFsfS9saWI2NCAke0xERkxBR1N9IgorCQkJCWZpCisJCQllbHNlCisJCQkJaWYgdGVzdCAtbiAiJHtuZWVkX2Rhc2hfcn0iOyB0aGVuCisJCQkJCUxERkxBR1M9Ii1MJHt3aXRodmFsfSAtUiR7d2l0aHZhbH0gJHtMREZMQUdTfSIKKwkJCQllbHNlCisJCQkJCUxERkxBR1M9Ii1MJHt3aXRodmFsfSAke0xERkxBR1N9IgorCQkJCWZpCisJCQlmaQorCQkJaWYgdGVzdCAtZCAiJHdpdGh2YWwvaW5jbHVkZSI7IHRoZW4KKwkJCQlDUFBGTEFHUz0iLUkke3dpdGh2YWx9L2luY2x1ZGUgJHtDUFBGTEFHU30iCisJCQllbHNlCisJCQkJQ1BQRkxBR1M9Ii1JJHt3aXRodmFsfSAke0NQUEZMQUdTfSIKKwkJCWZpCisJCWZpCisKKworZmkKKworTElCUz0iLWxjcnlwdG8gJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgUkFORF9hZGQgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBSQU5EX2FkZCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX09QRU5TU0wgMSIgPj5jb25mZGVmcy5oCisKK2Vsc2UKKworCQkJCWlmIHRlc3QgLW4gIiR7bmVlZF9kYXNoX3J9IjsgdGhlbgorCQkJTERGTEFHUz0iLUwvdXNyL2xvY2FsL3NzbC9saWIgLVIvdXNyL2xvY2FsL3NzbC9saWIgJHtzYXZlZF9MREZMQUdTfSIKKwkJZWxzZQorCQkJTERGTEFHUz0iLUwvdXNyL2xvY2FsL3NzbC9saWIgJHtzYXZlZF9MREZMQUdTfSIKKwkJZmkKKwkJQ1BQRkxBR1M9Ii1JL3Vzci9sb2NhbC9zc2wvaW5jbHVkZSAke3NhdmVkX0NQUEZMQUdTfSIKKwkJYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIm9wZW5zc2wvb3BlbnNzbHYuaCIgImFjX2N2X2hlYWRlcl9vcGVuc3NsX29wZW5zc2x2X2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX29wZW5zc2xfb3BlbnNzbHZfaCIgPSB4eWVzOyB0aGVuIDoKKworZWxzZQorICBhc19mbl9lcnJvciAkPyAiKioqIE9wZW5TU0wgaGVhZGVycyBtaXNzaW5nIC0gcGxlYXNlIGluc3RhbGwgZmlyc3Qgb3IgY2hlY2sgY29uZmlnLmxvZyAqKioiICIkTElORU5PIiA1CitmaQorCisKKwkJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIFJBTkRfYWRkICgpOworaW50CittYWluICgpCit7CityZXR1cm4gUkFORF9hZGQgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9PUEVOU1NMIDEiID4+Y29uZmRlZnMuaAorCitlbHNlCisKKwkJCQlhc19mbl9lcnJvciAkPyAiKioqIENhbid0IGZpbmQgcmVjZW50IE9wZW5TU0wgbGliY3J5cHRvIChzZWUgY29uZmlnLmxvZyBmb3IgZGV0YWlscykgKioqIiAiJExJTkVOTyIgNQorCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCisjIERldGVybWluZSBPcGVuU1NMIGhlYWRlciB2ZXJzaW9uCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIE9wZW5TU0wgaGVhZGVyIHZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgT3BlblNTTCBoZWFkZXIgdmVyc2lvbi4uLiAiID4mNjsgfQoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY3Jvc3MgY29tcGlsaW5nOiBub3QgY2hlY2tpbmciID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY3Jvc3MgY29tcGlsaW5nOiBub3QgY2hlY2tpbmciID4mMjt9CisKKworZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbHYuaD4KKyNkZWZpbmUgREFUQSAiY29uZnRlc3Quc3NsaW5jdmVyIgorCitpbnQKK21haW4gKCkKK3sKKworCUZJTEUgKmZkOworCWludCByYzsKKworCWZkID0gZm9wZW4oREFUQSwidyIpOworCWlmKGZkID09IE5VTEwpCisJCWV4aXQoMSk7CisKKwlpZiAoKHJjID0gZnByaW50ZihmZCAsIiV4ICglcylcbiIsIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIsIE9QRU5TU0xfVkVSU0lPTl9URVhUKSkgPDApCisJCWV4aXQoMSk7CisKKwlleGl0KDApOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorCisJCXNzbF9oZWFkZXJfdmVyPWBjYXQgY29uZnRlc3Quc3NsaW5jdmVyYAorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHNzbF9oZWFkZXJfdmVyIiA+JjUKKyRhc19lY2hvICIkc3NsX2hlYWRlcl92ZXIiID4mNjsgfQorCitlbHNlCisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vdCBmb3VuZCIgPiY1CiskYXNfZWNobyAibm90IGZvdW5kIiA+JjY7IH0KKwkJYXNfZm5fZXJyb3IgJD8gIk9wZW5TU0wgdmVyc2lvbiBoZWFkZXIgbm90IGZvdW5kLiIgIiRMSU5FTk8iIDUKKworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKworIyBEZXRlcm1pbmUgT3BlblNTTCBsaWJyYXJ5IHZlcnNpb24KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgT3BlblNTTCBsaWJyYXJ5IHZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgT3BlblNTTCBsaWJyYXJ5IHZlcnNpb24uLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogbm90IGNoZWNraW5nIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogbm90IGNoZWNraW5nIiA+JjI7fQorCisKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2x2Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNkZWZpbmUgREFUQSAiY29uZnRlc3Quc3NsbGlidmVyIgorCitpbnQKK21haW4gKCkKK3sKKworCUZJTEUgKmZkOworCWludCByYzsKKworCWZkID0gZm9wZW4oREFUQSwidyIpOworCWlmKGZkID09IE5VTEwpCisJCWV4aXQoMSk7CisKKwlpZiAoKHJjID0gZnByaW50ZihmZCAsIiV4ICglcylcbiIsIFNTTGVheSgpLCBTU0xlYXlfdmVyc2lvbihTU0xFQVlfVkVSU0lPTikpKSA8MCkKKwkJZXhpdCgxKTsKKworCWV4aXQoMCk7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisKKwkJc3NsX2xpYnJhcnlfdmVyPWBjYXQgY29uZnRlc3Quc3NsbGlidmVyYAorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHNzbF9saWJyYXJ5X3ZlciIgPiY1CiskYXNfZWNobyAiJHNzbF9saWJyYXJ5X3ZlciIgPiY2OyB9CisKK2Vsc2UKKworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm90IGZvdW5kIiA+JjUKKyRhc19lY2hvICJub3QgZm91bmQiID4mNjsgfQorCQlhc19mbl9lcnJvciAkPyAiT3BlblNTTCBsaWJyYXJ5IG5vdCBmb3VuZC4iICIkTElORU5PIiA1CisKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1vcGVuc3NsLWhlYWRlci1jaGVjayB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfb3BlbnNzbF9oZWFkZXJfY2hlY2src2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX29wZW5zc2xfaGVhZGVyX2NoZWNrOyAgIGlmIHRlc3QgIngkd2l0aHZhbCIgPSAieG5vIiA7IHRoZW4KKwkJb3BlbnNzbF9jaGVja19ub25mYXRhbD0xCisJICAgZmkKKworCitmaQorCisKKyMgU2FuaXR5IGNoZWNrIE9wZW5TU0wgaGVhZGVycworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIE9wZW5TU0wncyBoZWFkZXJzIG1hdGNoIHRoZSBsaWJyYXJ5IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgT3BlblNTTCdzIGhlYWRlcnMgbWF0Y2ggdGhlIGxpYnJhcnkuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogbm90IGNoZWNraW5nIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogbm90IGNoZWNraW5nIiA+JjI7fQorCisKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3Nsdi5oPgorCitpbnQKK21haW4gKCkKK3sKKworCWV4aXQoU1NMZWF5KCkgPT0gT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA/IDAgOiAxKTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCitlbHNlCisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCWlmIHRlc3QgIngkb3BlbnNzbF9jaGVja19ub25mYXRhbCIgPSAieCI7IHRoZW4KKwkJCWFzX2ZuX2Vycm9yICQ/ICJZb3VyIE9wZW5TU0wgaGVhZGVycyBkbyBub3QgbWF0Y2ggeW91cgorbGlicmFyeS4gQ2hlY2sgY29uZmlnLmxvZyBmb3IgZGV0YWlscy4KK0lmIHlvdSBhcmUgc3VyZSB5b3VyIGluc3RhbGxhdGlvbiBpcyBjb25zaXN0ZW50LCB5b3UgY2FuIGRpc2FibGUgdGhlIGNoZWNrCitieSBydW5uaW5nIFwiLi9jb25maWd1cmUgLS13aXRob3V0LW9wZW5zc2wtaGVhZGVyLWNoZWNrXCIuCitBbHNvIHNlZSBjb250cmliL2ZpbmRzc2wuc2ggZm9yIGhlbHAgaWRlbnRpZnlpbmcgaGVhZGVyL2xpYnJhcnkgbWlzbWF0Y2hlcy4KKyIgIiRMSU5FTk8iIDUKKwkJZWxzZQorCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBZb3VyIE9wZW5TU0wgaGVhZGVycyBkbyBub3QgbWF0Y2ggeW91cgorbGlicmFyeS4gQ2hlY2sgY29uZmlnLmxvZyBmb3IgZGV0YWlscy4KK0Fsc28gc2VlIGNvbnRyaWIvZmluZHNzbC5zaCBmb3IgaGVscCBpZGVudGlmeWluZyBoZWFkZXIvbGlicmFyeSBtaXNtYXRjaGVzLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBZb3VyIE9wZW5TU0wgaGVhZGVycyBkbyBub3QgbWF0Y2ggeW91cgorbGlicmFyeS4gQ2hlY2sgY29uZmlnLmxvZyBmb3IgZGV0YWlscy4KK0Fsc28gc2VlIGNvbnRyaWIvZmluZHNzbC5zaCBmb3IgaGVscCBpZGVudGlmeWluZyBoZWFkZXIvbGlicmFyeSBtaXNtYXRjaGVzLiIgPiYyO30KKwkJZmkKKworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBwcm9ncmFtcyB1c2luZyBPcGVuU1NMIGZ1bmN0aW9ucyB3aWxsIGxpbmsiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgcHJvZ3JhbXMgdXNpbmcgT3BlblNTTCBmdW5jdGlvbnMgd2lsbCBsaW5rLi4uICIgPiY2OyB9CitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisgI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CitpbnQKK21haW4gKCkKK3sKKyBTU0xlYXlfYWRkX2FsbF9hbGdvcml0aG1zKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCitlbHNlCisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCXNhdmVkX0xJQlM9IiRMSUJTIgorCQlMSUJTPSIkTElCUyAtbGRsIgorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHByb2dyYW1zIHVzaW5nIE9wZW5TU0wgbmVlZCAtbGRsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIHByb2dyYW1zIHVzaW5nIE9wZW5TU0wgbmVlZCAtbGRsLi4uICIgPiY2OyB9CisJCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyAjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KK2ludAorbWFpbiAoKQoreworIFNTTGVheV9hZGRfYWxsX2FsZ29yaXRobXMoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorCisJCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKworZWxzZQorCisJCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCQkJTElCUz0iJHNhdmVkX0xJQlMiCisKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZvciBhY19mdW5jIGluIFJTQV9nZW5lcmF0ZV9rZXlfZXggRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnNfZXggQk5faXNfcHJpbWVfZXggUlNBX2dldF9kZWZhdWx0X21ldGhvZCBITUFDX0NUWF9pbml0CitkbyA6CisgIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKK2RvbmUKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtc3NsLWVuZ2luZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfc3NsX2VuZ2luZStzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfc3NsX2VuZ2luZTsgIGlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgOyB0aGVuCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIE9wZW5TU0wgRU5HSU5FIHN1cHBvcnQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIE9wZW5TU0wgRU5HSU5FIHN1cHBvcnQuLi4gIiA+JjY7IH0KKwkJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKworaW50CittYWluICgpCit7CisKKwlFTkdJTkVfbG9hZF9idWlsdGluX2VuZ2luZXMoKTsKKwlFTkdJTkVfcmVnaXN0ZXJfYWxsX2NvbXBsZXRlKCk7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKworJGFzX2VjaG8gIiNkZWZpbmUgVVNFX09QRU5TU0xfRU5HSU5FIDEiID4+Y29uZmRlZnMuaAorCisKK2Vsc2UKKyAgIGFzX2ZuX2Vycm9yICQ/ICJPcGVuU1NMIEVOR0lORSBzdXBwb3J0IG5vdCBmb3VuZCIgIiRMSU5FTk8iIDUKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCSAgZmkKKworZmkKKworCisjIENoZWNrIGZvciBPcGVuU1NMIHdpdGhvdXQgRVZQX2Flc197MTkyLDI1Nn1fY2JjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgT3BlblNTTCBoYXMgY3JpcHBsZWQgQUVTIHN1cHBvcnQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBPcGVuU1NMIGhhcyBjcmlwcGxlZCBBRVMgc3VwcG9ydC4uLiAiID4mNjsgfQorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKworaW50CittYWluICgpCit7CisKKwlleGl0KEVWUF9hZXNfMTkyX2NiYygpID09IE5VTEwgfHwgRVZQX2Flc18yNTZfY2JjKCkgPT0gTlVMTCk7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCitlbHNlCisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKworJGFzX2VjaG8gIiNkZWZpbmUgT1BFTlNTTF9MT0JPVE9NSVNFRF9BRVMgMSIgPj5jb25mZGVmcy5oCisKKworCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBFVlBfRGlnZXN0VXBkYXRlIHJldHVybnMgYW4gaW50IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIEVWUF9EaWdlc3RVcGRhdGUgcmV0dXJucyBhbiBpbnQuLi4gIiA+JjY7IH0KK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisKK2ludAorbWFpbiAoKQoreworCisJaWYoRVZQX0RpZ2VzdFVwZGF0ZShOVUxMLCBOVUxMLDApKQorCQlleGl0KDApOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCitlbHNlCisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisKKyRhc19lY2hvICIjZGVmaW5lIE9QRU5TU0xfRVZQX0RJR0VTVFVQREFURV9WT0lEIDEiID4+Y29uZmRlZnMuaAorCisKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisKKyMgU29tZSBzeXN0ZW1zIHdhbnQgY3J5cHQoKSBmcm9tIGxpYmNyeXB0LCAqbm90KiB0aGUgdmVyc2lvbiBpbiBPcGVuU1NMLAorIyBiZWNhdXNlIHRoZSBzeXN0ZW0gY3J5cHQoKSBpcyBtb3JlIGZlYXR1cmVmdWwuCitpZiB0ZXN0ICJ4JGNoZWNrX2Zvcl9saWJjcnlwdF9iZWZvcmUiID0gIngxIjsgdGhlbgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGNyeXB0IGluIC1sY3J5cHQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGNyeXB0IGluIC1sY3J5cHQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX2NyeXB0X2NyeXB0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxjcnlwdCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgY3J5cHQgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBjcnlwdCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfY3J5cHRfY3J5cHQ9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9jcnlwdF9jcnlwdD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfY3J5cHRfY3J5cHQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfY3J5cHRfY3J5cHQiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfY3J5cHRfY3J5cHQiID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9MSUJDUllQVCAxCitfQUNFT0YKKworICBMSUJTPSItbGNyeXB0ICRMSUJTIgorCitmaQorCitmaQorCisjIFNvbWUgTGludXggc3lzdGVtcyAoU2xhY2t3YXJlKSBuZWVkIGNyeXB0KCkgZnJvbSBsaWJjcnlwdCwgKm5vdCogdGhlCisjIHZlcnNpb24gaW4gT3BlblNTTC4KK2lmIHRlc3QgIngkY2hlY2tfZm9yX2xpYmNyeXB0X2xhdGVyIiA9ICJ4MSI7IHRoZW4KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBjcnlwdCBpbiAtbGNyeXB0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBjcnlwdCBpbiAtbGNyeXB0Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9jcnlwdF9jcnlwdCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sY3J5cHQgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGNyeXB0ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gY3J5cHQgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2NyeXB0X2NyeXB0PXllcworZWxzZQorICBhY19jdl9saWJfY3J5cHRfY3J5cHQ9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2NyeXB0X2NyeXB0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2NyeXB0X2NyeXB0IiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX2NyeXB0X2NyeXB0IiA9IHh5ZXM7IHRoZW4gOgorICBMSUJTPSIkTElCUyAtbGNyeXB0IgorZmkKKworZmkKKworIyBTZWFyY2ggZm9yIFNIQTI1NiBzdXBwb3J0IGluIGxpYmMgYW5kL29yIE9wZW5TU0wKK2ZvciBhY19mdW5jIGluIFNIQTI1Nl9VcGRhdGUgRVZQX3NoYTI1NgorZG8gOgorICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisgVEVTVF9TU0hfU0hBMjU2PXllcworZWxzZQorICBURVNUX1NTSF9TSEEyNTY9bm8KK2ZpCitkb25lCisKKworCisjIENoZWNrIGNvbXBsZXRlIEVDQyBzdXBwb3J0IGluIE9wZW5TU0wKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBPcGVuU1NMIGhhcyBjb21wbGV0ZSBFQ0Mgc3VwcG9ydCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIE9wZW5TU0wgaGFzIGNvbXBsZXRlIEVDQyBzdXBwb3J0Li4uICIgPiY2OyB9CitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2VjLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lY2RoLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lY2RzYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3Nsdi5oPgorI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCAweDAwOTA4MDdmIC8qIDAuOS44ZyAqLworIyBlcnJvciAiT3BlblNTTCA8IDAuOS44ZyBoYXMgdW5yZWxpYWJsZSBFQ0MgY29kZSIKKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKKworCUVDX0tFWSAqZSA9IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZShOSURfc2VjcDUyMXIxKTsKKwljb25zdCBFVlBfTUQgKm0gPSBFVlBfc2hhNTEyKCk7IC8qIFdlIG5lZWQgdGhpcyB0b28gKi8KKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKworJGFzX2VjaG8gIiNkZWZpbmUgT1BFTlNTTF9IQVNfRUNDIDEiID4+Y29uZmRlZnMuaAorCisJCVRFU1RfU1NIX0VDQz15ZXMKKwkJQ09NTUVOVF9PVVRfRUNDPSIiCisKK2Vsc2UKKworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwkJVEVTVF9TU0hfRUNDPW5vCisJCUNPTU1FTlRfT1VUX0VDQz0iI25vIGVjYyMiCisKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisKKworCitzYXZlZF9MSUJTPSIkTElCUyIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGlhX29wZW5pbmZvIGluIC1saWFmIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBpYV9vcGVuaW5mbyBpbiAtbGlhZi4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfaWFmX2lhX29wZW5pbmZvKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxpYWYgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGlhX29wZW5pbmZvICgpOworaW50CittYWluICgpCit7CityZXR1cm4gaWFfb3BlbmluZm8gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2lhZl9pYV9vcGVuaW5mbz15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX2lhZl9pYV9vcGVuaW5mbz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfaWFmX2lhX29wZW5pbmZvIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2lhZl9pYV9vcGVuaW5mbyIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9pYWZfaWFfb3BlbmluZm8iID0geHllczsgdGhlbiA6CisKKwlMSUJTPSIkTElCUyAtbGlhZiIKKwlmb3IgYWNfZnVuYyBpbiBzZXRfaWQKK2RvIDoKKyAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAic2V0X2lkIiAiYWNfY3ZfZnVuY19zZXRfaWQiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc2V0X2lkIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfU0VUX0lEIDEKK19BQ0VPRgorIFNTSERMSUJTPSIkU1NIRExJQlMgLWxpYWYiCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfTElCSUFGIDEiID4+Y29uZmRlZnMuaAorCisKK2ZpCitkb25lCisKKworZmkKKworTElCUz0iJHNhdmVkX0xJQlMiCisKKyMjIyBDb25maWd1cmUgY3J5cHRvZ3JhcGhpYyByYW5kb20gbnVtYmVyIHN1cHBvcnQKKworIyBDaGVjayB3aGV0ZXIgT3BlblNTTCBzZWVkcyBpdHNlbGYKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBPcGVuU1NMJ3MgUFJORyBpcyBpbnRlcm5hbGx5IHNlZWRlZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIE9wZW5TU0wncyBQUk5HIGlzIGludGVybmFsbHkgc2VlZGVkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IGFzc3VtaW5nIHllcyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IGFzc3VtaW5nIHllcyIgPiYyO30KKwkJIyBUaGlzIGlzIHNhZmUsIHNpbmNlIHdlIHdpbGwgZmF0YWwoKSBhdCBydW50aW1lIGlmCisJCSMgT3BlblNTTCBpcyBub3Qgc2VlZGVkIGNvcnJlY3RseS4KKwkJT1BFTlNTTF9TRUVEU19JVFNFTEY9eWVzCisKKworZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKworaW50CittYWluICgpCit7CisKKwlleGl0KFJBTkRfc3RhdHVzKCkgPT0gMSA/IDAgOiAxKTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKworCQlPUEVOU1NMX1NFRURTX0lUU0VMRj15ZXMKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKworZWxzZQorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworCisjIFBSTkdEIFRDUCBzb2NrZXQKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1wcm5nZC1wb3J0IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9wcm5nZF9wb3J0K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9wcm5nZF9wb3J0OworCQljYXNlICIkd2l0aHZhbCIgaW4KKwkJbm8pCisJCQl3aXRodmFsPSIiCisJCQk7OworCQlbMC05XSopCisJCQk7OworCQkqKQorCQkJYXNfZm5fZXJyb3IgJD8gIllvdSBtdXN0IHNwZWNpZnkgYSBudW1lcmljIHBvcnQgbnVtYmVyIGZvciAtLXdpdGgtcHJuZ2QtcG9ydCIgIiRMSU5FTk8iIDUKKwkJCTs7CisJCWVzYWMKKwkJaWYgdGVzdCAhIC16ICIkd2l0aHZhbCIgOyB0aGVuCisJCQlQUk5HRF9QT1JUPSIkd2l0aHZhbCIKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQUk5HRF9QT1JUICRQUk5HRF9QT1JUCitfQUNFT0YKKworCQlmaQorCisKK2ZpCisKKworIyBQUk5HRCBVbml4IGRvbWFpbiBzb2NrZXQKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1wcm5nZC1zb2NrZXQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3BybmdkX3NvY2tldCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfcHJuZ2Rfc29ja2V0OworCQljYXNlICIkd2l0aHZhbCIgaW4KKwkJeWVzKQorCQkJd2l0aHZhbD0iL3Zhci9ydW4vZWdkLXBvb2wiCisJCQk7OworCQlubykKKwkJCXdpdGh2YWw9IiIKKwkJCTs7CisJCS8qKQorCQkJOzsKKwkJKikKKwkJCWFzX2ZuX2Vycm9yICQ/ICJZb3UgbXVzdCBzcGVjaWZ5IGFuIGFic29sdXRlIHBhdGggdG8gdGhlIGVudHJvcHkgc29ja2V0IiAiJExJTkVOTyIgNQorCQkJOzsKKwkJZXNhYworCisJCWlmIHRlc3QgISAteiAiJHdpdGh2YWwiIDsgdGhlbgorCQkJaWYgdGVzdCAhIC16ICIkUFJOR0RfUE9SVCIgOyB0aGVuCisJCQkJYXNfZm5fZXJyb3IgJD8gIllvdSBtYXkgbm90IHNwZWNpZnkgYm90aCBhIFBSTkdEL0VHRCBwb3J0IGFuZCBzb2NrZXQiICIkTElORU5PIiA1CisJCQlmaQorCQkJaWYgdGVzdCAhIC1yICIkd2l0aHZhbCIgOyB0aGVuCisJCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBFbnRyb3B5IHNvY2tldCBpcyBub3QgcmVhZGFibGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogRW50cm9weSBzb2NrZXQgaXMgbm90IHJlYWRhYmxlIiA+JjI7fQorCQkJZmkKKwkJCVBSTkdEX1NPQ0tFVD0iJHdpdGh2YWwiCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUFJOR0RfU09DS0VUICIkUFJOR0RfU09DS0VUIgorX0FDRU9GCisKKwkJZmkKKworZWxzZQorCisJCSMgQ2hlY2sgZm9yIGV4aXN0aW5nIHNvY2tldCBvbmx5IGlmIHdlIGRvbid0IGhhdmUgYSByYW5kb20gZGV2aWNlIGFscmVhZHkKKwkJaWYgdGVzdCAieCRPUEVOU1NMX1NFRURTX0lUU0VMRiIgIT0gInh5ZXMiIDsgdGhlbgorCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgUFJOR0QvRUdEIHNvY2tldCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgUFJOR0QvRUdEIHNvY2tldC4uLiAiID4mNjsgfQorCQkJIyBJbnNlcnQgb3RoZXIgbG9jYXRpb25zIGhlcmUKKwkJCWZvciBzb2NrIGluIC92YXIvcnVuL2VnZC1wb29sIC9kZXYvZWdkLXBvb2wgL2V0Yy9lbnRyb3B5OyBkbworCQkJCWlmIHRlc3QgLXIgJHNvY2sgJiYgJFRFU1RfTUlOVVNfU19TSCAtYyAidGVzdCAtUyAkc29jayAtbyAtcCAkc29jayIgOyB0aGVuCisJCQkJCVBSTkdEX1NPQ0tFVD0iJHNvY2siCisJCQkJCWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUFJOR0RfU09DS0VUICIkUFJOR0RfU09DS0VUIgorX0FDRU9GCisKKwkJCQkJYnJlYWs7CisJCQkJZmkKKwkJCWRvbmUKKwkJCWlmIHRlc3QgISAteiAiJFBSTkdEX1NPQ0tFVCIgOyB0aGVuCisJCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQUk5HRF9TT0NLRVQiID4mNQorJGFzX2VjaG8gIiRQUk5HRF9TT0NLRVQiID4mNjsgfQorCQkJZWxzZQorCQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub3QgZm91bmQiID4mNQorJGFzX2VjaG8gIm5vdCBmb3VuZCIgPiY2OyB9CisJCQlmaQorCQlmaQorCisKK2ZpCisKKworIyBXaGljaCByYW5kb21uZXNzIHNvdXJjZSBkbyB3ZSB1c2U/CitpZiB0ZXN0ICEgLXogIiRQUk5HRF9QT1JUIiA7IHRoZW4KKwlSQU5EX01TRz0iUFJOR2QgcG9ydCAkUFJOR0RfUE9SVCIKK2VsaWYgdGVzdCAhIC16ICIkUFJOR0RfU09DS0VUIiA7IHRoZW4KKwlSQU5EX01TRz0iUFJOR2Qgc29ja2V0ICRQUk5HRF9TT0NLRVQiCitlbGlmIHRlc3QgISAteiAiJE9QRU5TU0xfU0VFRFNfSVRTRUxGIiA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgT1BFTlNTTF9QUk5HX09OTFkgMSIgPj5jb25mZGVmcy5oCisKKwlSQU5EX01TRz0iT3BlblNTTCBpbnRlcm5hbCBPTkxZIgorZWxzZQorCWFzX2ZuX2Vycm9yICQ/ICJPcGVuU1NIIGhhcyBubyBzb3VyY2Ugb2YgcmFuZG9tIG51bWJlcnMuIFBsZWFzZSBjb25maWd1cmUgT3BlblNTTCB3aXRoIGFuIGVudHJvcHkgc291cmNlIG9yIHJlLXJ1biBjb25maWd1cmUgdXNpbmcgb25lIG9mIHRoZSAtLXdpdGgtcHJuZ2QtcG9ydCBvciAtLXdpdGgtcHJuZ2Qtc29ja2V0IG9wdGlvbnMiICIkTElORU5PIiA1CitmaQorCisjIENoZWNrIGZvciBQQU0gbGlicworUEFNX01TRz0ibm8iCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtcGFtIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9wYW0rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX3BhbTsKKwkJaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KKwkJCWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3NlY3VyaXR5X3BhbV9hcHBsX2giICE9ICJ4eWVzIiAmJiBcCisJCQkgICB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9wYW1fcGFtX2FwcGxfaCIgIT0gInh5ZXMiIDsgdGhlbgorCQkJCWFzX2ZuX2Vycm9yICQ/ICJQQU0gaGVhZGVycyBub3QgZm91bmQiICIkTElORU5PIiA1CisJCQlmaQorCisJCQlzYXZlZF9MSUJTPSIkTElCUyIKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfZGxfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxkbCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxvcGVuICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZGxvcGVuICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbF9kbG9wZW49eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kbF9kbG9wZW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGxfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTElCREwgMQorX0FDRU9GCisKKyAgTElCUz0iLWxkbCAkTElCUyIKKworZmkKKworCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgcGFtX3NldF9pdGVtIGluIC1scGFtIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBwYW1fc2V0X2l0ZW0gaW4gLWxwYW0uLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX3BhbV9wYW1fc2V0X2l0ZW0rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHBhbSAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgcGFtX3NldF9pdGVtICgpOworaW50CittYWluICgpCit7CityZXR1cm4gcGFtX3NldF9pdGVtICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9wYW1fcGFtX3NldF9pdGVtPXllcworZWxzZQorICBhY19jdl9saWJfcGFtX3BhbV9zZXRfaXRlbT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfcGFtX3BhbV9zZXRfaXRlbSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9wYW1fcGFtX3NldF9pdGVtIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX3BhbV9wYW1fc2V0X2l0ZW0iID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9MSUJQQU0gMQorX0FDRU9GCisKKyAgTElCUz0iLWxwYW0gJExJQlMiCisKK2Vsc2UKKyAgYXNfZm5fZXJyb3IgJD8gIioqKiBsaWJwYW0gbWlzc2luZyIgIiRMSU5FTk8iIDUKK2ZpCisKKwkJCWZvciBhY19mdW5jIGluIHBhbV9nZXRlbnZsaXN0CitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInBhbV9nZXRlbnZsaXN0IiAiYWNfY3ZfZnVuY19wYW1fZ2V0ZW52bGlzdCIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19wYW1fZ2V0ZW52bGlzdCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1BBTV9HRVRFTlZMSVNUIDEKK19BQ0VPRgorCitmaQorZG9uZQorCisJCQlmb3IgYWNfZnVuYyBpbiBwYW1fcHV0ZW52CitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInBhbV9wdXRlbnYiICJhY19jdl9mdW5jX3BhbV9wdXRlbnYiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfcGFtX3B1dGVudiIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1BBTV9QVVRFTlYgMQorX0FDRU9GCisKK2ZpCitkb25lCisKKwkJCUxJQlM9IiRzYXZlZF9MSUJTIgorCisJCQlQQU1fTVNHPSJ5ZXMiCisKKwkJCVNTSERMSUJTPSIkU1NIRExJQlMgLWxwYW0iCisKKyRhc19lY2hvICIjZGVmaW5lIFVTRV9QQU0gMSIgPj5jb25mZGVmcy5oCisKKworCQkJaWYgdGVzdCAkYWNfY3ZfbGliX2RsX2Rsb3BlbiA9IHllczsgdGhlbgorCQkJCWNhc2UgIiRMSUJTIiBpbgorCQkJCSotbGRsKikKKwkJCQkJIyBsaWJkbCBhbHJlYWR5IGluIExJQlMKKwkJCQkJOzsKKwkJCQkqKQorCQkJCQlTU0hETElCUz0iJFNTSERMSUJTIC1sZGwiCisJCQkJCTs7CisJCQkJZXNhYworCQkJZmkKKwkJZmkKKworCitmaQorCisKKyMgQ2hlY2sgZm9yIG9sZGVyIFBBTQoraWYgdGVzdCAieCRQQU1fTVNHIiA9ICJ4eWVzIiA7IHRoZW4KKwkjIENoZWNrIFBBTSBzdHJlcnJvciBhcmd1bWVudHMgKG9sZCBQQU0pCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHBhbV9zdHJlcnJvciB0YWtlcyBvbmx5IG9uZSBhcmd1bWVudCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHBhbV9zdHJlcnJvciB0YWtlcyBvbmx5IG9uZSBhcmd1bWVudC4uLiAiID4mNjsgfQorCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmIGRlZmluZWQoSEFWRV9TRUNVUklUWV9QQU1fQVBQTF9IKQorI2luY2x1ZGUgPHNlY3VyaXR5L3BhbV9hcHBsLmg+CisjZWxpZiBkZWZpbmVkIChIQVZFX1BBTV9QQU1fQVBQTF9IKQorI2luY2x1ZGUgPHBhbS9wYW1fYXBwbC5oPgorI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworCisodm9pZClwYW1fc3RyZXJyb3IoKHBhbV9oYW5kbGVfdCAqKU5VTEwsIC0xKTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZWxzZQorCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfT0xEX1BBTSAxIiA+PmNvbmZkZWZzLmgKKworCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwkJCVBBTV9NU0c9InllcyAob2xkIGxpYnJhcnkpIgorCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK1NTSF9QUklWU0VQX1VTRVI9c3NoZAorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXByaXZzZXAtdXNlciB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfcHJpdnNlcF91c2VyK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9wcml2c2VwX3VzZXI7CisJCWlmIHRlc3QgLW4gIiR3aXRodmFsIiAgJiYgIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgICYmICBcCisJCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCisJCQlTU0hfUFJJVlNFUF9VU0VSPSR3aXRodmFsCisJCWZpCisKKworZmkKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNTSF9QUklWU0VQX1VTRVIgIiRTU0hfUFJJVlNFUF9VU0VSIgorX0FDRU9GCisKKworCisjIERlY2lkZSB3aGljaCBzYW5kYm94IHN0eWxlIHRvIHVzZQorc2FuZGJveF9hcmc9IiIKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1zYW5kYm94IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9zYW5kYm94K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9zYW5kYm94OworCQlpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInh5ZXMiIDsgdGhlbgorCQkJc2FuZGJveF9hcmc9IiIKKwkJZWxzZQorCQkJc2FuZGJveF9hcmc9IiR3aXRodmFsIgorCQlmaQorCisKK2ZpCisKK2lmIHRlc3QgIngkc2FuZGJveF9hcmciID0gInhzeXN0cmFjZSIgfHwgXAorICAgKCB0ZXN0IC16ICIkc2FuZGJveF9hcmciICYmIHRlc3QgIngkaGF2ZV9zeXN0cl9wb2xpY3lfa2lsbCIgPSAieDEiICkgOyB0aGVuCisJdGVzdCAieCRoYXZlX3N5c3RyX3BvbGljeV9raWxsIiAhPSAieDEiICYmIFwKKwkJYXNfZm5fZXJyb3IgJD8gInN5c3RyYWNlIHNhbmRib3ggcmVxdWlyZXMgc3lzdHJhY2UgaGVhZGVycyBhbmQgU1lTVFJfUE9MSUNZX0tJTEwgc3VwcG9ydCIgIiRMSU5FTk8iIDUKKwlTQU5EQk9YX1NUWUxFPSJzeXN0cmFjZSIKKworJGFzX2VjaG8gIiNkZWZpbmUgU0FOREJPWF9TWVNUUkFDRSAxIiA+PmNvbmZkZWZzLmgKKworZWxpZiB0ZXN0ICJ4JHNhbmRib3hfYXJnIiA9ICJ4ZGFyd2luIiB8fCBcCisgICAgICggdGVzdCAteiAiJHNhbmRib3hfYXJnIiAmJiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc2FuZGJveF9pbml0IiA9ICJ4eWVzIiAmJiBcCisgICAgICAgdGVzdCAieCRhY19jdl9oZWFkZXJfc2FuZGJveF9oIiA9ICJ4eWVzIikgOyB0aGVuCisJdGVzdCAieCRhY19jdl9mdW5jX3NhbmRib3hfaW5pdCIgIT0gInh5ZXMiIC1vIFwKKwkgICAgICJ4JGFjX2N2X2hlYWRlcl9zYW5kYm94X2giICE9ICJ4eWVzIiAmJiBcCisJCWFzX2ZuX2Vycm9yICQ/ICJEYXJ3aW4gc2VhdGJlbHQgc2FuZGJveCByZXF1aXJlcyBzYW5kYm94LmggYW5kIHNhbmRib3hfaW5pdCBmdW5jdGlvbiIgIiRMSU5FTk8iIDUKKwlTQU5EQk9YX1NUWUxFPSJkYXJ3aW4iCisKKyRhc19lY2hvICIjZGVmaW5lIFNBTkRCT1hfREFSV0lOIDEiID4+Y29uZmRlZnMuaAorCitlbGlmIHRlc3QgIngkc2FuZGJveF9hcmciID0gInhzZWNjb21wX2ZpbHRlciIgfHwgXAorICAgICAoIHRlc3QgLXogIiRzYW5kYm94X2FyZyIgJiYgXAorICAgICAgIHRlc3QgIngkaGF2ZV9zZWNjb21wX2ZpbHRlciIgPT0gIngxIiAmJiBcCisgICAgICAgdGVzdCAieCRhY19jdl9oZWFkZXJfbGludXhfYXVkaXRfaCIgPSAieHllcyIgJiYgXAorICAgICAgIHRlc3QgIngkaGF2ZV9zZWNjb21wX2F1ZGl0X2FyY2giID0gIngxIiAmJiBcCisgICAgICAgdGVzdCAieCRoYXZlX2xpbnV4X25vX25ld19wcml2cyIgPSAieDEiICYmIFwKKyAgICAgICB0ZXN0ICJ4JGFjX2N2X2Z1bmNfcHJjdGwiID0gInh5ZXMiICkgOyB0aGVuCisJdGVzdCAieCRoYXZlX3NlY2NvbXBfYXVkaXRfYXJjaCIgIT0gIngxIiAmJiBcCisJCWFzX2ZuX2Vycm9yICQ/ICJzZWNjb21wX2ZpbHRlciBzYW5kYm94IG5vdCBzdXBwb3J0ZWQgb24gJGhvc3QiICIkTElORU5PIiA1CisJdGVzdCAieCRoYXZlX2xpbnV4X25vX25ld19wcml2cyIgIT0gIngxIiAmJiBcCisJCWFzX2ZuX2Vycm9yICQ/ICJzZWNjb21wX2ZpbHRlciBzYW5kYm94IHJlcXVpcmVzIFBSX1NFVF9OT19ORVdfUFJJVlMiICIkTElORU5PIiA1CisJdGVzdCAieCRoYXZlX3NlY2NvbXBfZmlsdGVyIiAhPSAieDEiICYmIFwKKwkJYXNfZm5fZXJyb3IgJD8gInNlY2NvbXBfZmlsdGVyIHNhbmRib3ggcmVxdWlyZXMgc2VjY29tcCBoZWFkZXJzIiAiJExJTkVOTyIgNQorCXRlc3QgIngkYWNfY3ZfZnVuY19wcmN0bCIgIT0gInh5ZXMiICYmIFwKKwkJYXNfZm5fZXJyb3IgJD8gInNlY2NvbXBfZmlsdGVyIHNhbmRib3ggcmVxdWlyZXMgcHJjdGwgZnVuY3Rpb24iICIkTElORU5PIiA1CisJU0FOREJPWF9TVFlMRT0ic2VjY29tcF9maWx0ZXIiCisKKyRhc19lY2hvICIjZGVmaW5lIFNBTkRCT1hfU0VDQ09NUF9GSUxURVIgMSIgPj5jb25mZGVmcy5oCisKK2VsaWYgdGVzdCAieCRzYW5kYm94X2FyZyIgPSAieHJsaW1pdCIgfHwgXAorICAgICAoIHRlc3QgLXogIiRzYW5kYm94X2FyZyIgJiYgdGVzdCAieCRhY19jdl9mdW5jX3NldHJsaW1pdCIgPSAieHllcyIgKSA7IHRoZW4KKwl0ZXN0ICJ4JGFjX2N2X2Z1bmNfc2V0cmxpbWl0IiAhPSAieHllcyIgJiYgXAorCQlhc19mbl9lcnJvciAkPyAicmxpbWl0IHNhbmRib3ggcmVxdWlyZXMgc2V0cmxpbWl0IGZ1bmN0aW9uIiAiJExJTkVOTyIgNQorCVNBTkRCT1hfU1RZTEU9InJsaW1pdCIKKworJGFzX2VjaG8gIiNkZWZpbmUgU0FOREJPWF9STElNSVQgMSIgPj5jb25mZGVmcy5oCisKK2VsaWYgdGVzdCAteiAiJHNhbmRib3hfYXJnIiB8fCB0ZXN0ICJ4JHNhbmRib3hfYXJnIiA9ICJ4bm8iIHx8IFwKKyAgICAgdGVzdCAieCRzYW5kYm94X2FyZyIgPSAieG5vbmUiIHx8IHRlc3QgIngkc2FuZGJveF9hcmciID0gInhudWxsIiA7IHRoZW4KKwlTQU5EQk9YX1NUWUxFPSJub25lIgorCiskYXNfZWNobyAiI2RlZmluZSBTQU5EQk9YX05VTEwgMSIgPj5jb25mZGVmcy5oCisKK2Vsc2UKKwlhc19mbl9lcnJvciAkPyAidW5zdXBwb3J0ZWQgLS13aXRoLXNhbmRib3giICIkTElORU5PIiA1CitmaQorCisjIENoZWFwIGhhY2sgdG8gZW5zdXJlIE5FV1MtT1MgbGlicmFyaWVzIGFyZSBhcnJhbmdlZCByaWdodC4KK2lmIHRlc3QgISAteiAiJFNPTlkiIDsgdGhlbgorICBMSUJTPSIkTElCUyAtbGliZXJ0eSI7CitmaQorCisjIENoZWNrIGZvciAgbG9uZyBsb25nIGRhdGF0eXBlcworYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAibG9uZyBsb25nIiAiYWNfY3ZfdHlwZV9sb25nX2xvbmciICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV9sb25nX2xvbmciID0geHllczsgdGhlbiA6CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9MT05HX0xPTkcgMQorX0FDRU9GCisKKworZmkKK2FjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVuc2lnbmVkIGxvbmcgbG9uZyIgImFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nIiA9IHh5ZXM7IHRoZW4gOgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfVU5TSUdORURfTE9OR19MT05HIDEKK19BQ0VPRgorCisKK2ZpCithY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJsb25nIGRvdWJsZSIgImFjX2N2X3R5cGVfbG9uZ19kb3VibGUiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV9sb25nX2RvdWJsZSIgPSB4eWVzOyB0aGVuIDoKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0xPTkdfRE9VQkxFIDEKK19BQ0VPRgorCisKK2ZpCisKKworIyBDaGVjayBkYXRhdHlwZSBzaXplcworIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKKyMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKKyMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgorIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBzaG9ydCBpbnQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgc2l6ZSBvZiBzaG9ydCBpbnQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2l6ZW9mX3Nob3J0X2ludCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIobG9uZyBpbnQpIChzaXplb2YgKHNob3J0IGludCkpIiAiYWNfY3Zfc2l6ZW9mX3Nob3J0X2ludCIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgorCitlbHNlCisgIGlmIHRlc3QgIiRhY19jdl90eXBlX3Nob3J0X2ludCIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciA3NyAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChzaG9ydCBpbnQpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2Zfc2hvcnRfaW50PTAKKyAgIGZpCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2Zfc2hvcnRfaW50IiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX3Nob3J0X2ludCIgPiY2OyB9CisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNJWkVPRl9TSE9SVF9JTlQgJGFjX2N2X3NpemVvZl9zaG9ydF9pbnQKK19BQ0VPRgorCisKKyMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCisjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCisjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KKyMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2YgaW50IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgaW50Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NpemVvZl9pbnQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAiKGxvbmcgaW50KSAoc2l6ZW9mIChpbnQpKSIgImFjX2N2X3NpemVvZl9pbnQiICAgICAgICAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiOyB0aGVuIDoKKworZWxzZQorICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9pbnQiID0geWVzOyB0aGVuCisgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgNzcgImNhbm5vdCBjb21wdXRlIHNpemVvZiAoaW50KQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKyAgIGVsc2UKKyAgICAgYWNfY3Zfc2l6ZW9mX2ludD0wCisgICBmaQorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2ludCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NpemVvZl9pbnQiID4mNjsgfQorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBTSVpFT0ZfSU5UICRhY19jdl9zaXplb2ZfaW50CitfQUNFT0YKKworCisjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cworIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCisjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIGxvbmcgaW50IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgbG9uZyBpbnQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2l6ZW9mX2xvbmdfaW50Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIihsb25nIGludCkgKHNpemVvZiAobG9uZyBpbnQpKSIgImFjX2N2X3NpemVvZl9sb25nX2ludCIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgorCitlbHNlCisgIGlmIHRlc3QgIiRhY19jdl90eXBlX2xvbmdfaW50IiA9IHllczsgdGhlbgorICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yIDc3ICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcgaW50KQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKyAgIGVsc2UKKyAgICAgYWNfY3Zfc2l6ZW9mX2xvbmdfaW50PTAKKyAgIGZpCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfbG9uZ19pbnQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zaXplb2ZfbG9uZ19pbnQiID4mNjsgfQorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBTSVpFT0ZfTE9OR19JTlQgJGFjX2N2X3NpemVvZl9sb25nX2ludAorX0FDRU9GCisKKworIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKKyMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKKyMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgorIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBsb25nIGxvbmcgaW50IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgbG9uZyBsb25nIGludC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zaXplb2ZfbG9uZ19sb25nX2ludCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIobG9uZyBpbnQpIChzaXplb2YgKGxvbmcgbG9uZyBpbnQpKSIgImFjX2N2X3NpemVvZl9sb25nX2xvbmdfaW50IiAgICAgICAgIiRhY19pbmNsdWRlc19kZWZhdWx0IjsgdGhlbiA6CisKK2Vsc2UKKyAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfbG9uZ19sb25nX2ludCIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciA3NyAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nIGxvbmcgaW50KQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKyAgIGVsc2UKKyAgICAgYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZ19pbnQ9MAorICAgZmkKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NpemVvZl9sb25nX2xvbmdfaW50IiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZ19pbnQiID4mNjsgfQorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBTSVpFT0ZfTE9OR19MT05HX0lOVCAkYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZ19pbnQKK19BQ0VPRgorCisKKworIyBTYW5pdHkgY2hlY2sgbG9uZyBsb25nIGZvciBzb21lIHBsYXRmb3JtcyAoQUlYKQoraWYgdGVzdCAieCRhY19jdl9zaXplb2ZfbG9uZ19sb25nX2ludCIgPSAieDQiIDsgdGhlbgorCWFjX2N2X3NpemVvZl9sb25nX2xvbmdfaW50PTAKK2ZpCisKKyMgY29tcHV0ZSBMTE9OR19NSU4gYW5kIExMT05HX01BWCBpZiB3ZSBkb24ndCBrbm93IHRoZW0uCitpZiB0ZXN0IC16ICIkaGF2ZV9sbG9uZ19tYXgiOyB0aGVuCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbWF4IHZhbHVlIG9mIGxvbmcgbG9uZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbWF4IHZhbHVlIG9mIGxvbmcgbG9uZy4uLiAiID4mNjsgfQorCWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKworCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IG5vdCBjaGVja2luZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IG5vdCBjaGVja2luZyIgPiYyO30KKworCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisvKiBXaHkgaXMgdGhpcyBzbyBkYW1uIGhhcmQ/ICovCisjaWZkZWYgX19HTlVDX18KKyMgdW5kZWYgX19HTlVDX18KKyNlbmRpZgorI2RlZmluZSBfX1VTRV9JU09DOTkKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNkZWZpbmUgREFUQSAiY29uZnRlc3QubGxtaW5tYXgiCisjZGVmaW5lIG15X2FicyhhKSAoKGEpIDwgMCA/ICgoYSkgKiAtMSkgOiAoYSkpCisKKy8qCisgKiBwcmludGYgaW4gbGliYyBvbiBzb21lIHBsYXRmb3JtcyAoZWcgb2xkIFRydTY0KSBkb2VzIG5vdCB1bmRlcnN0YW5kICVsbGQgc28KKyAqIHdlIGRvIHRoaXMgdGhlIGhhcmQgd2F5LgorICovCitzdGF0aWMgaW50CitmcHJpbnRfbGwoRklMRSAqZiwgbG9uZyBsb25nIG4pCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGxbc2l6ZW9mKGxvbmcgbG9uZykgKiA4XTsKKworCWlmIChuIDwgMCkKKwkJaWYgKGZwcmludGYoZiwgIi0iKSA8IDApCisJCQlyZXR1cm4gLTE7CisJZm9yIChpID0gMDsgbiAhPSAwOyBpKyspIHsKKwkJbFtpXSA9IG15X2FicyhuICUgMTApOworCQluIC89IDEwOworCX0KKwlkbyB7CisJCWlmIChmcHJpbnRmKGYsICIlZCIsIGxbLS1pXSkgPCAwKQorCQkJcmV0dXJuIC0xOworCX0gd2hpbGUgKGkgIT0gMCk7CisJaWYgKGZwcmludGYoZiwgIiAiKSA8IDApCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworaW50CittYWluICgpCit7CisKKwlGSUxFICpmOworCWxvbmcgbG9uZyBpLCBsbG1pbiwgbGxtYXggPSAwOworCisJaWYoKGYgPSBmb3BlbihEQVRBLCJ3IikpID09IE5VTEwpCisJCWV4aXQoMSk7CisKKyNpZiBkZWZpbmVkKExMT05HX01JTikgJiYgZGVmaW5lZChMTE9OR19NQVgpCisJZnByaW50ZihzdGRlcnIsICJVc2luZyBzeXN0ZW0gaGVhZGVyIGZvciBMTE9OR19NSU4gYW5kIExMT05HX01BWFxuIik7CisJbGxtaW4gPSBMTE9OR19NSU47CisJbGxtYXggPSBMTE9OR19NQVg7CisjZWxzZQorCWZwcmludGYoc3RkZXJyLCAiQ2FsY3VsYXRpbmcgIExMT05HX01JTiBhbmQgTExPTkdfTUFYXG4iKTsKKwkvKiBUaGlzIHdpbGwgd29yayBvbiBvbmUncyBjb21wbGVtZW50IGFuZCB0d28ncyBjb21wbGVtZW50ICovCisJZm9yIChpID0gMTsgaSA+IGxsbWF4OyBpIDw8PSAxLCBpKyspCisJCWxsbWF4ID0gaTsKKwlsbG1pbiA9IGxsbWF4ICsgMUxMOwkvKiB3cmFwICovCisjZW5kaWYKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmIChsbG1pbiArIDEgPCBsbG1pbiB8fCBsbG1pbiAtIDEgPCBsbG1pbiB8fCBsbG1heCArIDEgPiBsbG1heAorCSAgICB8fCBsbG1heCAtIDEgPiBsbG1heCB8fCBsbG1pbiA9PSBsbG1heCB8fCBsbG1pbiA9PSAwCisJICAgIHx8IGxsbWF4ID09IDAgfHwgbGxtYXggPCBMT05HX01BWCB8fCBsbG1pbiA+IExPTkdfTUlOKSB7CisJCWZwcmludGYoZiwgInVua25vd24gdW5rbm93blxuIik7CisJCWV4aXQoMik7CisJfQorCisJaWYgKGZwcmludF9sbChmLCBsbG1pbikgPCAwKQorCQlleGl0KDMpOworCWlmIChmcHJpbnRfbGwoZiwgbGxtYXgpIDwgMCkKKwkJZXhpdCg0KTsKKwlpZiAoZmNsb3NlKGYpIDwgMCkKKwkJZXhpdCg1KTsKKwlleGl0KDApOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorCisJCQlsbG9uZ19taW49YCRBV0sgJ3twcmludCAkMX0nIGNvbmZ0ZXN0LmxsbWlubWF4YAorCQkJbGxvbmdfbWF4PWAkQVdLICd7cHJpbnQgJDJ9JyBjb25mdGVzdC5sbG1pbm1heGAKKworCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsbG9uZ19tYXgiID4mNQorJGFzX2VjaG8gIiRsbG9uZ19tYXgiID4mNjsgfQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIExMT05HX01BWCAke2xsb25nX21heH1MTAorX0FDRU9GCisKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG1pbiB2YWx1ZSBvZiBsb25nIGxvbmciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIG1pbiB2YWx1ZSBvZiBsb25nIGxvbmcuLi4gIiA+JjY7IH0KKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbGxvbmdfbWluIiA+JjUKKyRhc19lY2hvICIkbGxvbmdfbWluIiA+JjY7IH0KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBMTE9OR19NSU4gJHtsbG9uZ19taW59TEwKK19BQ0VPRgorCisKK2Vsc2UKKworCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vdCBmb3VuZCIgPiY1CiskYXNfZWNobyAibm90IGZvdW5kIiA+JjY7IH0KKworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCisKKworIyBNb3JlIGNoZWNrcyBmb3IgZGF0YSB0eXBlcworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdV9pbnQgdHlwZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgdV9pbnQgdHlwZS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oYXZlX3VfaW50Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CitpbnQKK21haW4gKCkKK3sKKyB1X2ludCBhOyBhID0gMTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAgYWNfY3ZfaGF2ZV91X2ludD0ieWVzIgorZWxzZQorICAgYWNfY3ZfaGF2ZV91X2ludD0ibm8iCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV91X2ludCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hhdmVfdV9pbnQiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9oYXZlX3VfaW50IiA9ICJ4eWVzIiA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9VX0lOVCAxIiA+PmNvbmZkZWZzLmgKKworCWhhdmVfdV9pbnQ9MQorZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgaW50WFhfdCB0eXBlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgaW50WFhfdCB0eXBlcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oYXZlX2ludHh4X3QrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KK2ludAorbWFpbiAoKQoreworIGludDhfdCBhOyBpbnQxNl90IGI7IGludDMyX3QgYzsgYSA9IGIgPSBjID0gMTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAgYWNfY3ZfaGF2ZV9pbnR4eF90PSJ5ZXMiCitlbHNlCisgICBhY19jdl9oYXZlX2ludHh4X3Q9Im5vIgorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfaW50eHhfdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hhdmVfaW50eHhfdCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfaW50eHhfdCIgPSAieHllcyIgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfSU5UWFhfVCAxIiA+PmNvbmZkZWZzLmgKKworCWhhdmVfaW50eHhfdD0xCitmaQorCitpZiAodGVzdCAteiAiJGhhdmVfaW50eHhfdCIgJiYgXAorCSAgIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3N0ZGludF9oIiA9ICJ4eWVzIikKK3RoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBpbnRYWF90IHR5cGVzIGluIHN0ZGludC5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBpbnRYWF90IHR5cGVzIGluIHN0ZGludC5oLi4uICIgPiY2OyB9CisJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworICNpbmNsdWRlIDxzdGRpbnQuaD4KK2ludAorbWFpbiAoKQoreworIGludDhfdCBhOyBpbnQxNl90IGI7IGludDMyX3QgYzsgYSA9IGIgPSBjID0gMTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCisJCQkkYXNfZWNobyAiI2RlZmluZSBIQVZFX0lOVFhYX1QgMSIgPj5jb25mZGVmcy5oCisKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisKK2Vsc2UKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBpbnQ2NF90IHR5cGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGludDY0X3QgdHlwZS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oYXZlX2ludDY0X3QrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9TVERJTlRfSAorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyMgaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKKworaW50NjRfdCBhOyBhID0gMTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgICBhY19jdl9oYXZlX2ludDY0X3Q9InllcyIKK2Vsc2UKKyAgIGFjX2N2X2hhdmVfaW50NjRfdD0ibm8iCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9pbnQ2NF90IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGF2ZV9pbnQ2NF90IiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9pbnQ2NF90IiA9ICJ4eWVzIiA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9JTlQ2NF9UIDEiID4+Y29uZmRlZnMuaAorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1X2ludFhYX3QgdHlwZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHVfaW50WFhfdCB0eXBlcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oYXZlX3VfaW50eHhfdCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoraW50CittYWluICgpCit7CisgdV9pbnQ4X3QgYTsgdV9pbnQxNl90IGI7IHVfaW50MzJfdCBjOyBhID0gYiA9IGMgPSAxOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgICBhY19jdl9oYXZlX3VfaW50eHhfdD0ieWVzIgorZWxzZQorICAgYWNfY3ZfaGF2ZV91X2ludHh4X3Q9Im5vIgorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfdV9pbnR4eF90IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGF2ZV91X2ludHh4X3QiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9oYXZlX3VfaW50eHhfdCIgPSAieHllcyIgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfVV9JTlRYWF9UIDEiID4+Y29uZmRlZnMuaAorCisJaGF2ZV91X2ludHh4X3Q9MQorZmkKKworaWYgdGVzdCAteiAiJGhhdmVfdV9pbnR4eF90IiA7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1X2ludFhYX3QgdHlwZXMgaW4gc3lzL3NvY2tldC5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1X2ludFhYX3QgdHlwZXMgaW4gc3lzL3NvY2tldC5oLi4uICIgPiY2OyB9CisJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CitpbnQKK21haW4gKCkKK3sKKyB1X2ludDhfdCBhOyB1X2ludDE2X3QgYjsgdV9pbnQzMl90IGM7IGEgPSBiID0gYyA9IDE7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworCQkJJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9VX0lOVFhYX1QgMSIgPj5jb25mZGVmcy5oCisKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisKK2Vsc2UKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1X2ludDY0X3QgdHlwZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHVfaW50NjRfdCB0eXBlcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oYXZlX3VfaW50NjRfdCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoraW50CittYWluICgpCit7CisgdV9pbnQ2NF90IGE7IGEgPSAxOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgICBhY19jdl9oYXZlX3VfaW50NjRfdD0ieWVzIgorZWxzZQorICAgYWNfY3ZfaGF2ZV91X2ludDY0X3Q9Im5vIgorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfdV9pbnQ2NF90IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGF2ZV91X2ludDY0X3QiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9oYXZlX3VfaW50NjRfdCIgPSAieHllcyIgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfVV9JTlQ2NF9UIDEiID4+Y29uZmRlZnMuaAorCisJaGF2ZV91X2ludDY0X3Q9MQorZmkKKworaWYgdGVzdCAteiAiJGhhdmVfdV9pbnQ2NF90IiA7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1X2ludDY0X3QgdHlwZSBpbiBzeXMvYml0eXBlcy5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1X2ludDY0X3QgdHlwZSBpbiBzeXMvYml0eXBlcy5oLi4uICIgPiY2OyB9CisJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworICNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgoraW50CittYWluICgpCit7CisgdV9pbnQ2NF90IGE7IGEgPSAxCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworCQkJJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9VX0lOVDY0X1QgMSIgPj5jb25mZGVmcy5oCisKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisKK2Vsc2UKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCitpZiB0ZXN0IC16ICIkaGF2ZV91X2ludHh4X3QiIDsgdGhlbgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHVpbnRYWF90IHR5cGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1aW50WFhfdCB0eXBlcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oYXZlX3VpbnR4eF90Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworaW50CittYWluICgpCit7CisKKwl1aW50OF90IGE7CisJdWludDE2X3QgYjsKKwl1aW50MzJfdCBjOworCWEgPSBiID0gYyA9IDE7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAgYWNfY3ZfaGF2ZV91aW50eHhfdD0ieWVzIgorZWxzZQorICAgYWNfY3ZfaGF2ZV91aW50eHhfdD0ibm8iCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV91aW50eHhfdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hhdmVfdWludHh4X3QiID4mNjsgfQorCWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV91aW50eHhfdCIgPSAieHllcyIgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfVUlOVFhYX1QgMSIgPj5jb25mZGVmcy5oCisKKwlmaQorZmkKKworaWYgdGVzdCAteiAiJGhhdmVfdWludHh4X3QiIDsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHVpbnRYWF90IHR5cGVzIGluIHN0ZGludC5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1aW50WFhfdCB0eXBlcyBpbiBzdGRpbnQuaC4uLiAiID4mNjsgfQorCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyAjaW5jbHVkZSA8c3RkaW50Lmg+CitpbnQKK21haW4gKCkKK3sKKyB1aW50OF90IGE7IHVpbnQxNl90IGI7IHVpbnQzMl90IGM7IGEgPSBiID0gYyA9IDE7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworCQkJJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9VSU5UWFhfVCAxIiA+PmNvbmZkZWZzLmgKKworCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKworZWxzZQorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2lmICh0ZXN0IC16ICIkaGF2ZV91X2ludHh4X3QiIHx8IHRlc3QgLXogIiRoYXZlX2ludHh4X3QiICYmIFwKKwkgICB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9zeXNfYml0eXBlc19oIiA9ICJ4eWVzIikKK3RoZW4KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBpbnRYWF90IGFuZCB1X2ludFhYX3QgdHlwZXMgaW4gc3lzL2JpdHlwZXMuaCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgaW50WFhfdCBhbmQgdV9pbnRYWF90IHR5cGVzIGluIHN5cy9iaXR5cGVzLmguLi4gIiA+JjY7IH0KKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorCitpbnQKK21haW4gKCkKK3sKKworCQkJaW50OF90IGE7IGludDE2X3QgYjsgaW50MzJfdCBjOworCQkJdV9pbnQ4X3QgZTsgdV9pbnQxNl90IGY7IHVfaW50MzJfdCBnOworCQkJYSA9IGIgPSBjID0gZSA9IGYgPSBnID0gMTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisKKwkJCSRhc19lY2hvICIjZGVmaW5lIEhBVkVfVV9JTlRYWF9UIDEiID4+Y29uZmRlZnMuaAorCisJCQkkYXNfZWNobyAiI2RlZmluZSBIQVZFX0lOVFhYX1QgMSIgPj5jb25mZGVmcy5oCisKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdV9jaGFyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1X2NoYXIuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaGF2ZV91X2NoYXIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KK2ludAorbWFpbiAoKQoreworIHVfY2hhciBmb287IGZvbyA9IDEyNTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAgYWNfY3ZfaGF2ZV91X2NoYXI9InllcyIKK2Vsc2UKKyAgIGFjX2N2X2hhdmVfdV9jaGFyPSJubyIKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX3VfY2hhciIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hhdmVfdV9jaGFyIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV91X2NoYXIiID0gInh5ZXMiIDsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1VfQ0hBUiAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworCisgICBhY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJzb2NrbGVuX3QiICJhY19jdl90eXBlX3NvY2tsZW5fdCIgIiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc29ja2xlbl90IiA9IHh5ZXM7IHRoZW4gOgorCitlbHNlCisKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNvY2tsZW5fdCBlcXVpdmFsZW50IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzb2NrbGVuX3QgZXF1aXZhbGVudC4uLiAiID4mNjsgfQorICAgICAgaWYgJHtjdXJsX2N2X3NvY2tsZW5fdF9lcXVpdis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKwkgIyBTeXN0ZW1zIGhhdmUgZWl0aGVyICJzdHJ1Y3Qgc29ja2FkZHIgKiIgb3IKKwkgIyAidm9pZCAqIiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGdldHBlZXJuYW1lCisJIGN1cmxfY3Zfc29ja2xlbl90X2VxdWl2PQorCSBmb3IgYXJnMiBpbiAic3RydWN0IHNvY2thZGRyIiB2b2lkOyBkbworCSAgICBmb3IgdCBpbiBpbnQgc2l6ZV90IHVuc2lnbmVkIGxvbmcgInVuc2lnbmVkIGxvbmciOyBkbworCSAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKwkJICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJCSAgI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworCQkgIGludCBnZXRwZWVybmFtZSAoaW50LCAkYXJnMiAqLCAkdCAqKTsKKworaW50CittYWluICgpCit7CisKKwkJICAkdCBsZW47CisJCSAgZ2V0cGVlcm5hbWUoMCwwLCZsZW4pOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworCQkgIGN1cmxfY3Zfc29ja2xlbl90X2VxdWl2PSIkdCIKKwkJICBicmVhaworCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisJICAgIGRvbmUKKwkgZG9uZQorCisJIGlmIHRlc3QgIngkY3VybF9jdl9zb2NrbGVuX3RfZXF1aXYiID0geDsgdGhlbgorCSAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGZpbmQgYSB0eXBlIHRvIHVzZSBpbiBwbGFjZSBvZiBzb2NrbGVuX3QiICIkTElORU5PIiA1CisJIGZpCisKK2ZpCisKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkY3VybF9jdl9zb2NrbGVuX3RfZXF1aXYiID4mNQorJGFzX2VjaG8gIiRjdXJsX2N2X3NvY2tsZW5fdF9lcXVpdiIgPiY2OyB9CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgc29ja2xlbl90ICRjdXJsX2N2X3NvY2tsZW5fdF9lcXVpdgorX0FDRU9GCisKK2ZpCisKKworCithY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJzaWdfYXRvbWljX3QiICJhY19jdl90eXBlX3NpZ19hdG9taWNfdCIgIiNpbmNsdWRlIDxzaWduYWwuaD4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV9zaWdfYXRvbWljX3QiID0geHllczsgdGhlbiA6CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TSUdfQVRPTUlDX1QgMQorX0FDRU9GCisKKworZmkKKworYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAiZnNibGtjbnRfdCIgImFjX2N2X3R5cGVfZnNibGtjbnRfdCIgIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19TVEFURlNfSAorI2luY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1NUQVRWRlNfSAorI2luY2x1ZGUgPHN5cy9zdGF0dmZzLmg+CisjZW5kaWYKKworIgoraWYgdGVzdCAieCRhY19jdl90eXBlX2ZzYmxrY250X3QiID0geHllczsgdGhlbiA6CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9GU0JMS0NOVF9UIDEKK19BQ0VPRgorCisKK2ZpCithY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJmc2ZpbGNudF90IiAiYWNfY3ZfdHlwZV9mc2ZpbGNudF90IiAiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1NUQVRGU19ICisjaW5jbHVkZSA8c3lzL3N0YXRmcy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfU1RBVFZGU19ICisjaW5jbHVkZSA8c3lzL3N0YXR2ZnMuaD4KKyNlbmRpZgorCisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfZnNmaWxjbnRfdCIgPSB4eWVzOyB0aGVuIDoKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0ZTRklMQ05UX1QgMQorX0FDRU9GCisKKworZmkKKworCithY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJpbl9hZGRyX3QiICJhY19jdl90eXBlX2luX2FkZHJfdCIgIiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfaW5fYWRkcl90IiA9IHh5ZXM7IHRoZW4gOgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfSU5fQUREUl9UIDEKK19BQ0VPRgorCisKK2ZpCithY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJpbl9wb3J0X3QiICJhY19jdl90eXBlX2luX3BvcnRfdCIgIiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfaW5fcG9ydF90IiA9IHh5ZXM7IHRoZW4gOgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfSU5fUE9SVF9UIDEKK19BQ0VPRgorCisKK2ZpCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzaXplX3QuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaGF2ZV9zaXplX3QrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KK2ludAorbWFpbiAoKQoreworIHNpemVfdCBmb287IGZvbyA9IDEyMzU7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIGFjX2N2X2hhdmVfc2l6ZV90PSJ5ZXMiCitlbHNlCisgICBhY19jdl9oYXZlX3NpemVfdD0ibm8iCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9zaXplX3QiID4mNQorJGFzX2VjaG8gIiRhY19jdl9oYXZlX3NpemVfdCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfc2l6ZV90IiA9ICJ4eWVzIiA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TSVpFX1QgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNzaXplX3QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHNzaXplX3QuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaGF2ZV9zc2l6ZV90Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CitpbnQKK21haW4gKCkKK3sKKyBzc2l6ZV90IGZvbzsgZm9vID0gMTIzNTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAgYWNfY3ZfaGF2ZV9zc2l6ZV90PSJ5ZXMiCitlbHNlCisgICBhY19jdl9oYXZlX3NzaXplX3Q9Im5vIgorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfc3NpemVfdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hhdmVfc3NpemVfdCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfc3NpemVfdCIgPSAieHllcyIgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfU1NJWkVfVCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgY2xvY2tfdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgY2xvY2tfdC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oYXZlX2Nsb2NrX3QrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworICNpbmNsdWRlIDx0aW1lLmg+CitpbnQKK21haW4gKCkKK3sKKyBjbG9ja190IGZvbzsgZm9vID0gMTIzNTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAgYWNfY3ZfaGF2ZV9jbG9ja190PSJ5ZXMiCitlbHNlCisgICBhY19jdl9oYXZlX2Nsb2NrX3Q9Im5vIgorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfY2xvY2tfdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hhdmVfY2xvY2tfdCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfY2xvY2tfdCIgPSAieHllcyIgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfQ0xPQ0tfVCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc2FfZmFtaWx5X3QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHNhX2ZhbWlseV90Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X2hhdmVfc2FfZmFtaWx5X3QrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCitpbnQKK21haW4gKCkKK3sKKyBzYV9mYW1pbHlfdCBmb287IGZvbyA9IDEyMzU7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIGFjX2N2X2hhdmVfc2FfZmFtaWx5X3Q9InllcyIKK2Vsc2UKKyAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKK2ludAorbWFpbiAoKQoreworIHNhX2ZhbWlseV90IGZvbzsgZm9vID0gMTIzNTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAgYWNfY3ZfaGF2ZV9zYV9mYW1pbHlfdD0ieWVzIgorZWxzZQorICAgYWNfY3ZfaGF2ZV9zYV9mYW1pbHlfdD0ibm8iCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX3NhX2ZhbWlseV90IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGF2ZV9zYV9mYW1pbHlfdCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfc2FfZmFtaWx5X3QiID0gInh5ZXMiIDsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1NBX0ZBTUlMWV9UIDEiID4+Y29uZmRlZnMuaAorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBwaWRfdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgcGlkX3QuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaGF2ZV9waWRfdCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoraW50CittYWluICgpCit7CisgcGlkX3QgZm9vOyBmb28gPSAxMjM1OworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgICBhY19jdl9oYXZlX3BpZF90PSJ5ZXMiCitlbHNlCisgICBhY19jdl9oYXZlX3BpZF90PSJubyIKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX3BpZF90IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGF2ZV9waWRfdCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfcGlkX3QiID0gInh5ZXMiIDsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1BJRF9UIDEiID4+Y29uZmRlZnMuaAorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBtb2RlX3QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIG1vZGVfdC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oYXZlX21vZGVfdCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoraW50CittYWluICgpCit7CisgbW9kZV90IGZvbzsgZm9vID0gMTIzNTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAgYWNfY3ZfaGF2ZV9tb2RlX3Q9InllcyIKK2Vsc2UKKyAgIGFjX2N2X2hhdmVfbW9kZV90PSJubyIKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX21vZGVfdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hhdmVfbW9kZV90IiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9tb2RlX3QiID0gInh5ZXMiIDsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX01PREVfVCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaGF2ZV9zdHJ1Y3Rfc29ja2FkZHJfc3RvcmFnZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKK2ludAorbWFpbiAoKQoreworIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHM7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIGFjX2N2X2hhdmVfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2U9InllcyIKK2Vsc2UKKyAgIGFjX2N2X2hhdmVfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2U9Im5vIgorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2UiID4mNQorJGFzX2VjaG8gIiRhY19jdl9oYXZlX3N0cnVjdF9zb2NrYWRkcl9zdG9yYWdlIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9zdHJ1Y3Rfc29ja2FkZHJfc3RvcmFnZSIgPSAieHllcyIgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfU1RSVUNUX1NPQ0tBRERSX1NUT1JBR0UgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0cnVjdCBzb2NrYWRkcl9pbjYiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0cnVjdCBzb2NrYWRkcl9pbjYuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaGF2ZV9zdHJ1Y3Rfc29ja2FkZHJfaW42Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworaW50CittYWluICgpCit7Cisgc3RydWN0IHNvY2thZGRyX2luNiBzOyBzLnNpbjZfZmFtaWx5ID0gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAgYWNfY3ZfaGF2ZV9zdHJ1Y3Rfc29ja2FkZHJfaW42PSJ5ZXMiCitlbHNlCisgICBhY19jdl9oYXZlX3N0cnVjdF9zb2NrYWRkcl9pbjY9Im5vIgorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfc3RydWN0X3NvY2thZGRyX2luNiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hhdmVfc3RydWN0X3NvY2thZGRyX2luNiIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfc3RydWN0X3NvY2thZGRyX2luNiIgPSAieHllcyIgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfU1RSVUNUX1NPQ0tBRERSX0lONiAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3RydWN0IGluNl9hZGRyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdHJ1Y3QgaW42X2FkZHIuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaGF2ZV9zdHJ1Y3RfaW42X2FkZHIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCitpbnQKK21haW4gKCkKK3sKKyBzdHJ1Y3QgaW42X2FkZHIgczsgcy5zNl9hZGRyWzBdID0gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAgYWNfY3ZfaGF2ZV9zdHJ1Y3RfaW42X2FkZHI9InllcyIKK2Vsc2UKKyAgIGFjX2N2X2hhdmVfc3RydWN0X2luNl9hZGRyPSJubyIKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX3N0cnVjdF9pbjZfYWRkciIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hhdmVfc3RydWN0X2luNl9hZGRyIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9zdHJ1Y3RfaW42X2FkZHIiID0gInh5ZXMiIDsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1NUUlVDVF9JTjZfQUREUiAxIiA+PmNvbmZkZWZzLmgKKworCisJYWNfZm5fY19jaGVja19tZW1iZXIgIiRMSU5FTk8iICJzdHJ1Y3Qgc29ja2FkZHJfaW42IiAic2luNl9zY29wZV9pZCIgImFjX2N2X21lbWJlcl9zdHJ1Y3Rfc29ja2FkZHJfaW42X3NpbjZfc2NvcGVfaWQiICIKKyNpZmRlZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyIKK2lmIHRlc3QgIngkYWNfY3ZfbWVtYmVyX3N0cnVjdF9zb2NrYWRkcl9pbjZfc2luNl9zY29wZV9pZCIgPSB4eWVzOyB0aGVuIDoKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1NUUlVDVF9TT0NLQUREUl9JTjZfU0lONl9TQ09QRV9JRCAxCitfQUNFT0YKKworCitmaQorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdHJ1Y3QgYWRkcmluZm8iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0cnVjdCBhZGRyaW5mby4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oYXZlX3N0cnVjdF9hZGRyaW5mbys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKworaW50CittYWluICgpCit7Cisgc3RydWN0IGFkZHJpbmZvIHM7IHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgICBhY19jdl9oYXZlX3N0cnVjdF9hZGRyaW5mbz0ieWVzIgorZWxzZQorICAgYWNfY3ZfaGF2ZV9zdHJ1Y3RfYWRkcmluZm89Im5vIgorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfc3RydWN0X2FkZHJpbmZvIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGF2ZV9zdHJ1Y3RfYWRkcmluZm8iID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9oYXZlX3N0cnVjdF9hZGRyaW5mbyIgPSAieHllcyIgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfU1RSVUNUX0FERFJJTkZPIDEiID4+Y29uZmRlZnMuaAorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdHJ1Y3QgdGltZXZhbCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3RydWN0IHRpbWV2YWwuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaGF2ZV9zdHJ1Y3RfdGltZXZhbCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisgI2luY2x1ZGUgPHN5cy90aW1lLmg+CitpbnQKK21haW4gKCkKK3sKKyBzdHJ1Y3QgdGltZXZhbCB0djsgdHYudHZfc2VjID0gMTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAgYWNfY3ZfaGF2ZV9zdHJ1Y3RfdGltZXZhbD0ieWVzIgorZWxzZQorICAgYWNfY3ZfaGF2ZV9zdHJ1Y3RfdGltZXZhbD0ibm8iCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9zdHJ1Y3RfdGltZXZhbCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hhdmVfc3RydWN0X3RpbWV2YWwiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9oYXZlX3N0cnVjdF90aW1ldmFsIiA9ICJ4eWVzIiA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TVFJVQ1RfVElNRVZBTCAxIiA+PmNvbmZkZWZzLmgKKworCWhhdmVfc3RydWN0X3RpbWV2YWw9MQorZmkKKworYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAic3RydWN0IHRpbWVzcGVjIiAiYWNfY3ZfdHlwZV9zdHJ1Y3RfdGltZXNwZWMiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV9zdHJ1Y3RfdGltZXNwZWMiID0geHllczsgdGhlbiA6CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TVFJVQ1RfVElNRVNQRUMgMQorX0FDRU9GCisKKworZmkKKworCisjIFdlIG5lZWQgaW50NjRfdCBvciBlbHNlIGNlcnRpYW4gcGFydHMgb2YgdGhlIGNvbXBpbGUgd2lsbCBmYWlsLgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2ludDY0X3QiID0gInhubyIgJiYgXAorCXRlc3QgIngkYWNfY3Zfc2l6ZW9mX2xvbmdfaW50IiAhPSAieDgiICYmIFwKKwl0ZXN0ICJ4JGFjX2N2X3NpemVvZl9sb25nX2xvbmdfaW50IiA9ICJ4MCIgOyB0aGVuCisJZWNobyAiT3BlblNTSCByZXF1aXJlcyBpbnQ2NF90IHN1cHBvcnQuICBDb250YWN0IHlvdXIgdmVuZG9yIG9yIGluc3RhbGwiCisJZWNobyAiYW4gYWx0ZXJuYXRpdmUgY29tcGlsZXIgKEkuRS4sIEdDQykgYmVmb3JlIGNvbnRpbnVpbmcuIgorCWVjaG8gIiIKKwlleGl0IDE7CitlbHNlCisJaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogQXNzdW1pbmcgd29ya2luZyBzbnByaW50ZigpIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogQXNzdW1pbmcgd29ya2luZyBzbnByaW50ZigpIiA+JjI7fQorCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZkZWYgSEFWRV9TTlBSSU5URgorbWFpbigpCit7CisJY2hhciBidWZbNTBdOworCWNoYXIgZXhwZWN0ZWRfb3V0WzUwXTsKKwlpbnQgbWF6c2l6ZSA9IDUwIDsKKyNpZiAoU0laRU9GX0xPTkdfSU5UID09IDgpCisJbG9uZyBpbnQgbnVtID0gMHg3ZmZmZmZmZmZmZmZmZmZmOworI2Vsc2UKKwlsb25nIGxvbmcgbnVtID0gMHg3ZmZmZmZmZmZmZmZmZmZmbGw7CisjZW5kaWYKKwlzdHJjcHkoZXhwZWN0ZWRfb3V0LCAiOTIyMzM3MjAzNjg1NDc3NTgwNyIpOworCXNucHJpbnRmKGJ1ZiwgbWF6c2l6ZSwgIiVsbGQiLCBudW0pOworCWlmKHN0cmNtcChidWYsIGV4cGVjdGVkX291dCkgIT0gMCkKKwkJZXhpdCgxKTsKKwlleGl0KDApOworfQorI2Vsc2UKK21haW4oKSB7IGV4aXQoMCk7IH0KKyNlbmRpZgorCitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorICAgdHJ1ZQorZWxzZQorICAgJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1NOUFJJTlRGIDEiID4+Y29uZmRlZnMuaAorCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKKworCisjIGxvb2sgZm9yIGZpZWxkICd1dF9ob3N0JyBpbiBoZWFkZXIgJ3V0bXAuaCcKKwkJb3NzaF9zYWZlPWBlY2hvICJ1dG1wLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorCQlvc3NoX3Zhcm5hbWU9Im9zc2hfY3ZfJG9zc2hfc2FmZSIiX2hhc18idXRfaG9zdAorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHV0X2hvc3QgZmllbGQgaW4gdXRtcC5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1dF9ob3N0IGZpZWxkIGluIHV0bXAuaC4uLiAiID4mNjsgfQorCWlmIGV2YWwgXCR7JG9zc2hfdmFybmFtZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKwkJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHV0bXAuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAidXRfaG9zdCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9eWVzIgorZWxzZQorICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworCW9zc2hfcmVzdWx0PWBldmFsICdlY2hvICQnIiRvc3NoX3Zhcm5hbWUiYAorCWlmIHRlc3QgLW4gImBlY2hvICRvc3NoX3Zhcm5hbWVgIjsgdGhlbgorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJG9zc2hfcmVzdWx0IiA+JjUKKyRhc19lY2hvICIkb3NzaF9yZXN1bHQiID4mNjsgfQorCQlpZiB0ZXN0ICJ4JG9zc2hfcmVzdWx0IiA9ICJ4eWVzIjsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0hPU1RfSU5fVVRNUCAxIiA+PmNvbmZkZWZzLmgKKworCQlmaQorCWVsc2UKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJZmkKKworCisjIGxvb2sgZm9yIGZpZWxkICd1dF9ob3N0JyBpbiBoZWFkZXIgJ3V0bXB4LmgnCisJCW9zc2hfc2FmZT1gZWNobyAidXRtcHguaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCisJCW9zc2hfdmFybmFtZT0ib3NzaF9jdl8kb3NzaF9zYWZlIiJfaGFzXyJ1dF9ob3N0CisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdXRfaG9zdCBmaWVsZCBpbiB1dG1weC5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1dF9ob3N0IGZpZWxkIGluIHV0bXB4LmguLi4gIiA+JjY7IH0KKwlpZiBldmFsIFwkeyRvc3NoX3Zhcm5hbWUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisJCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDx1dG1weC5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJ1dF9ob3N0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT15ZXMiCitlbHNlCisgICAJCQlldmFsICIkb3NzaF92YXJuYW1lPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCisJb3NzaF9yZXN1bHQ9YGV2YWwgJ2VjaG8gJCciJG9zc2hfdmFybmFtZSJgCisJaWYgdGVzdCAtbiAiYGVjaG8gJG9zc2hfdmFybmFtZWAiOyB0aGVuCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkb3NzaF9yZXN1bHQiID4mNQorJGFzX2VjaG8gIiRvc3NoX3Jlc3VsdCIgPiY2OyB9CisJCWlmIHRlc3QgIngkb3NzaF9yZXN1bHQiID0gInh5ZXMiOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfSE9TVF9JTl9VVE1QWCAxIiA+PmNvbmZkZWZzLmgKKworCQlmaQorCWVsc2UKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJZmkKKworCisjIGxvb2sgZm9yIGZpZWxkICdzeXNsZW4nIGluIGhlYWRlciAndXRtcHguaCcKKwkJb3NzaF9zYWZlPWBlY2hvICJ1dG1weC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKKwkJb3NzaF92YXJuYW1lPSJvc3NoX2N2XyRvc3NoX3NhZmUiIl9oYXNfInN5c2xlbgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN5c2xlbiBmaWVsZCBpbiB1dG1weC5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzeXNsZW4gZmllbGQgaW4gdXRtcHguaC4uLiAiID4mNjsgfQorCWlmIGV2YWwgXCR7JG9zc2hfdmFybmFtZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKwkJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHV0bXB4Lmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgInN5c2xlbiIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9eWVzIgorZWxzZQorICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworCW9zc2hfcmVzdWx0PWBldmFsICdlY2hvICQnIiRvc3NoX3Zhcm5hbWUiYAorCWlmIHRlc3QgLW4gImBlY2hvICRvc3NoX3Zhcm5hbWVgIjsgdGhlbgorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJG9zc2hfcmVzdWx0IiA+JjUKKyRhc19lY2hvICIkb3NzaF9yZXN1bHQiID4mNjsgfQorCQlpZiB0ZXN0ICJ4JG9zc2hfcmVzdWx0IiA9ICJ4eWVzIjsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1NZU0xFTl9JTl9VVE1QWCAxIiA+PmNvbmZkZWZzLmgKKworCQlmaQorCWVsc2UKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJZmkKKworCisjIGxvb2sgZm9yIGZpZWxkICd1dF9waWQnIGluIGhlYWRlciAndXRtcC5oJworCQlvc3NoX3NhZmU9YGVjaG8gInV0bXAuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCisJCW9zc2hfdmFybmFtZT0ib3NzaF9jdl8kb3NzaF9zYWZlIiJfaGFzXyJ1dF9waWQKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1dF9waWQgZmllbGQgaW4gdXRtcC5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1dF9waWQgZmllbGQgaW4gdXRtcC5oLi4uICIgPiY2OyB9CisJaWYgZXZhbCBcJHskb3NzaF92YXJuYW1lKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8dXRtcC5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJ1dF9waWQiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgICAJCQlldmFsICIkb3NzaF92YXJuYW1lPXllcyIKK2Vsc2UKKyAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKKwlvc3NoX3Jlc3VsdD1gZXZhbCAnZWNobyAkJyIkb3NzaF92YXJuYW1lImAKKwlpZiB0ZXN0IC1uICJgZWNobyAkb3NzaF92YXJuYW1lYCI7IHRoZW4KKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRvc3NoX3Jlc3VsdCIgPiY1CiskYXNfZWNobyAiJG9zc2hfcmVzdWx0IiA+JjY7IH0KKwkJaWYgdGVzdCAieCRvc3NoX3Jlc3VsdCIgPSAieHllcyI7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9QSURfSU5fVVRNUCAxIiA+PmNvbmZkZWZzLmgKKworCQlmaQorCWVsc2UKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJZmkKKworCisjIGxvb2sgZm9yIGZpZWxkICd1dF90eXBlJyBpbiBoZWFkZXIgJ3V0bXAuaCcKKwkJb3NzaF9zYWZlPWBlY2hvICJ1dG1wLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorCQlvc3NoX3Zhcm5hbWU9Im9zc2hfY3ZfJG9zc2hfc2FmZSIiX2hhc18idXRfdHlwZQorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHV0X3R5cGUgZmllbGQgaW4gdXRtcC5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1dF90eXBlIGZpZWxkIGluIHV0bXAuaC4uLiAiID4mNjsgfQorCWlmIGV2YWwgXCR7JG9zc2hfdmFybmFtZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKwkJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHV0bXAuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAidXRfdHlwZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9eWVzIgorZWxzZQorICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworCW9zc2hfcmVzdWx0PWBldmFsICdlY2hvICQnIiRvc3NoX3Zhcm5hbWUiYAorCWlmIHRlc3QgLW4gImBlY2hvICRvc3NoX3Zhcm5hbWVgIjsgdGhlbgorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJG9zc2hfcmVzdWx0IiA+JjUKKyRhc19lY2hvICIkb3NzaF9yZXN1bHQiID4mNjsgfQorCQlpZiB0ZXN0ICJ4JG9zc2hfcmVzdWx0IiA9ICJ4eWVzIjsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1RZUEVfSU5fVVRNUCAxIiA+PmNvbmZkZWZzLmgKKworCQlmaQorCWVsc2UKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJZmkKKworCisjIGxvb2sgZm9yIGZpZWxkICd1dF90eXBlJyBpbiBoZWFkZXIgJ3V0bXB4LmgnCisJCW9zc2hfc2FmZT1gZWNobyAidXRtcHguaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCisJCW9zc2hfdmFybmFtZT0ib3NzaF9jdl8kb3NzaF9zYWZlIiJfaGFzXyJ1dF90eXBlCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdXRfdHlwZSBmaWVsZCBpbiB1dG1weC5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1dF90eXBlIGZpZWxkIGluIHV0bXB4LmguLi4gIiA+JjY7IH0KKwlpZiBldmFsIFwkeyRvc3NoX3Zhcm5hbWUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisJCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDx1dG1weC5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJ1dF90eXBlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT15ZXMiCitlbHNlCisgICAJCQlldmFsICIkb3NzaF92YXJuYW1lPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCisJb3NzaF9yZXN1bHQ9YGV2YWwgJ2VjaG8gJCciJG9zc2hfdmFybmFtZSJgCisJaWYgdGVzdCAtbiAiYGVjaG8gJG9zc2hfdmFybmFtZWAiOyB0aGVuCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkb3NzaF9yZXN1bHQiID4mNQorJGFzX2VjaG8gIiRvc3NoX3Jlc3VsdCIgPiY2OyB9CisJCWlmIHRlc3QgIngkb3NzaF9yZXN1bHQiID0gInh5ZXMiOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfVFlQRV9JTl9VVE1QWCAxIiA+PmNvbmZkZWZzLmgKKworCQlmaQorCWVsc2UKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJZmkKKworCisjIGxvb2sgZm9yIGZpZWxkICd1dF90dicgaW4gaGVhZGVyICd1dG1wLmgnCisJCW9zc2hfc2FmZT1gZWNobyAidXRtcC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKKwkJb3NzaF92YXJuYW1lPSJvc3NoX2N2XyRvc3NoX3NhZmUiIl9oYXNfInV0X3R2CisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdXRfdHYgZmllbGQgaW4gdXRtcC5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1dF90diBmaWVsZCBpbiB1dG1wLmguLi4gIiA+JjY7IH0KKwlpZiBldmFsIFwkeyRvc3NoX3Zhcm5hbWUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisJCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDx1dG1wLmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgInV0X3R2IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT15ZXMiCitlbHNlCisgICAJCQlldmFsICIkb3NzaF92YXJuYW1lPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCisJb3NzaF9yZXN1bHQ9YGV2YWwgJ2VjaG8gJCciJG9zc2hfdmFybmFtZSJgCisJaWYgdGVzdCAtbiAiYGVjaG8gJG9zc2hfdmFybmFtZWAiOyB0aGVuCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkb3NzaF9yZXN1bHQiID4mNQorJGFzX2VjaG8gIiRvc3NoX3Jlc3VsdCIgPiY2OyB9CisJCWlmIHRlc3QgIngkb3NzaF9yZXN1bHQiID0gInh5ZXMiOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfVFZfSU5fVVRNUCAxIiA+PmNvbmZkZWZzLmgKKworCQlmaQorCWVsc2UKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJZmkKKworCisjIGxvb2sgZm9yIGZpZWxkICd1dF9pZCcgaW4gaGVhZGVyICd1dG1wLmgnCisJCW9zc2hfc2FmZT1gZWNobyAidXRtcC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKKwkJb3NzaF92YXJuYW1lPSJvc3NoX2N2XyRvc3NoX3NhZmUiIl9oYXNfInV0X2lkCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdXRfaWQgZmllbGQgaW4gdXRtcC5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1dF9pZCBmaWVsZCBpbiB1dG1wLmguLi4gIiA+JjY7IH0KKwlpZiBldmFsIFwkeyRvc3NoX3Zhcm5hbWUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisJCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDx1dG1wLmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgInV0X2lkIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT15ZXMiCitlbHNlCisgICAJCQlldmFsICIkb3NzaF92YXJuYW1lPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCisJb3NzaF9yZXN1bHQ9YGV2YWwgJ2VjaG8gJCciJG9zc2hfdmFybmFtZSJgCisJaWYgdGVzdCAtbiAiYGVjaG8gJG9zc2hfdmFybmFtZWAiOyB0aGVuCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkb3NzaF9yZXN1bHQiID4mNQorJGFzX2VjaG8gIiRvc3NoX3Jlc3VsdCIgPiY2OyB9CisJCWlmIHRlc3QgIngkb3NzaF9yZXN1bHQiID0gInh5ZXMiOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfSURfSU5fVVRNUCAxIiA+PmNvbmZkZWZzLmgKKworCQlmaQorCWVsc2UKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJZmkKKworCisjIGxvb2sgZm9yIGZpZWxkICd1dF9pZCcgaW4gaGVhZGVyICd1dG1weC5oJworCQlvc3NoX3NhZmU9YGVjaG8gInV0bXB4LmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorCQlvc3NoX3Zhcm5hbWU9Im9zc2hfY3ZfJG9zc2hfc2FmZSIiX2hhc18idXRfaWQKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1dF9pZCBmaWVsZCBpbiB1dG1weC5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1dF9pZCBmaWVsZCBpbiB1dG1weC5oLi4uICIgPiY2OyB9CisJaWYgZXZhbCBcJHskb3NzaF92YXJuYW1lKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8dXRtcHguaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAidXRfaWQiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgICAJCQlldmFsICIkb3NzaF92YXJuYW1lPXllcyIKK2Vsc2UKKyAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKKwlvc3NoX3Jlc3VsdD1gZXZhbCAnZWNobyAkJyIkb3NzaF92YXJuYW1lImAKKwlpZiB0ZXN0IC1uICJgZWNobyAkb3NzaF92YXJuYW1lYCI7IHRoZW4KKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRvc3NoX3Jlc3VsdCIgPiY1CiskYXNfZWNobyAiJG9zc2hfcmVzdWx0IiA+JjY7IH0KKwkJaWYgdGVzdCAieCRvc3NoX3Jlc3VsdCIgPSAieHllcyI7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9JRF9JTl9VVE1QWCAxIiA+PmNvbmZkZWZzLmgKKworCQlmaQorCWVsc2UKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJZmkKKworCisjIGxvb2sgZm9yIGZpZWxkICd1dF9hZGRyJyBpbiBoZWFkZXIgJ3V0bXAuaCcKKwkJb3NzaF9zYWZlPWBlY2hvICJ1dG1wLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorCQlvc3NoX3Zhcm5hbWU9Im9zc2hfY3ZfJG9zc2hfc2FmZSIiX2hhc18idXRfYWRkcgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHV0X2FkZHIgZmllbGQgaW4gdXRtcC5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1dF9hZGRyIGZpZWxkIGluIHV0bXAuaC4uLiAiID4mNjsgfQorCWlmIGV2YWwgXCR7JG9zc2hfdmFybmFtZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKwkJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHV0bXAuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAidXRfYWRkciIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9eWVzIgorZWxzZQorICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworCW9zc2hfcmVzdWx0PWBldmFsICdlY2hvICQnIiRvc3NoX3Zhcm5hbWUiYAorCWlmIHRlc3QgLW4gImBlY2hvICRvc3NoX3Zhcm5hbWVgIjsgdGhlbgorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJG9zc2hfcmVzdWx0IiA+JjUKKyRhc19lY2hvICIkb3NzaF9yZXN1bHQiID4mNjsgfQorCQlpZiB0ZXN0ICJ4JG9zc2hfcmVzdWx0IiA9ICJ4eWVzIjsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0FERFJfSU5fVVRNUCAxIiA+PmNvbmZkZWZzLmgKKworCQlmaQorCWVsc2UKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJZmkKKworCisjIGxvb2sgZm9yIGZpZWxkICd1dF9hZGRyJyBpbiBoZWFkZXIgJ3V0bXB4LmgnCisJCW9zc2hfc2FmZT1gZWNobyAidXRtcHguaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCisJCW9zc2hfdmFybmFtZT0ib3NzaF9jdl8kb3NzaF9zYWZlIiJfaGFzXyJ1dF9hZGRyCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdXRfYWRkciBmaWVsZCBpbiB1dG1weC5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1dF9hZGRyIGZpZWxkIGluIHV0bXB4LmguLi4gIiA+JjY7IH0KKwlpZiBldmFsIFwkeyRvc3NoX3Zhcm5hbWUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisJCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDx1dG1weC5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJ1dF9hZGRyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT15ZXMiCitlbHNlCisgICAJCQlldmFsICIkb3NzaF92YXJuYW1lPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCisJb3NzaF9yZXN1bHQ9YGV2YWwgJ2VjaG8gJCciJG9zc2hfdmFybmFtZSJgCisJaWYgdGVzdCAtbiAiYGVjaG8gJG9zc2hfdmFybmFtZWAiOyB0aGVuCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkb3NzaF9yZXN1bHQiID4mNQorJGFzX2VjaG8gIiRvc3NoX3Jlc3VsdCIgPiY2OyB9CisJCWlmIHRlc3QgIngkb3NzaF9yZXN1bHQiID0gInh5ZXMiOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfQUREUl9JTl9VVE1QWCAxIiA+PmNvbmZkZWZzLmgKKworCQlmaQorCWVsc2UKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJZmkKKworCisjIGxvb2sgZm9yIGZpZWxkICd1dF9hZGRyX3Y2JyBpbiBoZWFkZXIgJ3V0bXAuaCcKKwkJb3NzaF9zYWZlPWBlY2hvICJ1dG1wLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorCQlvc3NoX3Zhcm5hbWU9Im9zc2hfY3ZfJG9zc2hfc2FmZSIiX2hhc18idXRfYWRkcl92NgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHV0X2FkZHJfdjYgZmllbGQgaW4gdXRtcC5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1dF9hZGRyX3Y2IGZpZWxkIGluIHV0bXAuaC4uLiAiID4mNjsgfQorCWlmIGV2YWwgXCR7JG9zc2hfdmFybmFtZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKwkJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHV0bXAuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAidXRfYWRkcl92NiIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9eWVzIgorZWxzZQorICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworCW9zc2hfcmVzdWx0PWBldmFsICdlY2hvICQnIiRvc3NoX3Zhcm5hbWUiYAorCWlmIHRlc3QgLW4gImBlY2hvICRvc3NoX3Zhcm5hbWVgIjsgdGhlbgorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJG9zc2hfcmVzdWx0IiA+JjUKKyRhc19lY2hvICIkb3NzaF9yZXN1bHQiID4mNjsgfQorCQlpZiB0ZXN0ICJ4JG9zc2hfcmVzdWx0IiA9ICJ4eWVzIjsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0FERFJfVjZfSU5fVVRNUCAxIiA+PmNvbmZkZWZzLmgKKworCQlmaQorCWVsc2UKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJZmkKKworCisjIGxvb2sgZm9yIGZpZWxkICd1dF9hZGRyX3Y2JyBpbiBoZWFkZXIgJ3V0bXB4LmgnCisJCW9zc2hfc2FmZT1gZWNobyAidXRtcHguaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCisJCW9zc2hfdmFybmFtZT0ib3NzaF9jdl8kb3NzaF9zYWZlIiJfaGFzXyJ1dF9hZGRyX3Y2CisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdXRfYWRkcl92NiBmaWVsZCBpbiB1dG1weC5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1dF9hZGRyX3Y2IGZpZWxkIGluIHV0bXB4LmguLi4gIiA+JjY7IH0KKwlpZiBldmFsIFwkeyRvc3NoX3Zhcm5hbWUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisJCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDx1dG1weC5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJ1dF9hZGRyX3Y2IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT15ZXMiCitlbHNlCisgICAJCQlldmFsICIkb3NzaF92YXJuYW1lPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCisJb3NzaF9yZXN1bHQ9YGV2YWwgJ2VjaG8gJCciJG9zc2hfdmFybmFtZSJgCisJaWYgdGVzdCAtbiAiYGVjaG8gJG9zc2hfdmFybmFtZWAiOyB0aGVuCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkb3NzaF9yZXN1bHQiID4mNQorJGFzX2VjaG8gIiRvc3NoX3Jlc3VsdCIgPiY2OyB9CisJCWlmIHRlc3QgIngkb3NzaF9yZXN1bHQiID0gInh5ZXMiOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfQUREUl9WNl9JTl9VVE1QWCAxIiA+PmNvbmZkZWZzLmgKKworCQlmaQorCWVsc2UKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJZmkKKworCisjIGxvb2sgZm9yIGZpZWxkICd1dF9leGl0JyBpbiBoZWFkZXIgJ3V0bXAuaCcKKwkJb3NzaF9zYWZlPWBlY2hvICJ1dG1wLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorCQlvc3NoX3Zhcm5hbWU9Im9zc2hfY3ZfJG9zc2hfc2FmZSIiX2hhc18idXRfZXhpdAorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHV0X2V4aXQgZmllbGQgaW4gdXRtcC5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1dF9leGl0IGZpZWxkIGluIHV0bXAuaC4uLiAiID4mNjsgfQorCWlmIGV2YWwgXCR7JG9zc2hfdmFybmFtZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKwkJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHV0bXAuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAidXRfZXhpdCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9eWVzIgorZWxzZQorICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworCW9zc2hfcmVzdWx0PWBldmFsICdlY2hvICQnIiRvc3NoX3Zhcm5hbWUiYAorCWlmIHRlc3QgLW4gImBlY2hvICRvc3NoX3Zhcm5hbWVgIjsgdGhlbgorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJG9zc2hfcmVzdWx0IiA+JjUKKyRhc19lY2hvICIkb3NzaF9yZXN1bHQiID4mNjsgfQorCQlpZiB0ZXN0ICJ4JG9zc2hfcmVzdWx0IiA9ICJ4eWVzIjsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0VYSVRfSU5fVVRNUCAxIiA+PmNvbmZkZWZzLmgKKworCQlmaQorCWVsc2UKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJZmkKKworCisjIGxvb2sgZm9yIGZpZWxkICd1dF90aW1lJyBpbiBoZWFkZXIgJ3V0bXAuaCcKKwkJb3NzaF9zYWZlPWBlY2hvICJ1dG1wLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorCQlvc3NoX3Zhcm5hbWU9Im9zc2hfY3ZfJG9zc2hfc2FmZSIiX2hhc18idXRfdGltZQorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHV0X3RpbWUgZmllbGQgaW4gdXRtcC5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1dF90aW1lIGZpZWxkIGluIHV0bXAuaC4uLiAiID4mNjsgfQorCWlmIGV2YWwgXCR7JG9zc2hfdmFybmFtZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKwkJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHV0bXAuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAidXRfdGltZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9eWVzIgorZWxzZQorICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworCW9zc2hfcmVzdWx0PWBldmFsICdlY2hvICQnIiRvc3NoX3Zhcm5hbWUiYAorCWlmIHRlc3QgLW4gImBlY2hvICRvc3NoX3Zhcm5hbWVgIjsgdGhlbgorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJG9zc2hfcmVzdWx0IiA+JjUKKyRhc19lY2hvICIkb3NzaF9yZXN1bHQiID4mNjsgfQorCQlpZiB0ZXN0ICJ4JG9zc2hfcmVzdWx0IiA9ICJ4eWVzIjsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1RJTUVfSU5fVVRNUCAxIiA+PmNvbmZkZWZzLmgKKworCQlmaQorCWVsc2UKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJZmkKKworCisjIGxvb2sgZm9yIGZpZWxkICd1dF90aW1lJyBpbiBoZWFkZXIgJ3V0bXB4LmgnCisJCW9zc2hfc2FmZT1gZWNobyAidXRtcHguaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCisJCW9zc2hfdmFybmFtZT0ib3NzaF9jdl8kb3NzaF9zYWZlIiJfaGFzXyJ1dF90aW1lCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdXRfdGltZSBmaWVsZCBpbiB1dG1weC5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1dF90aW1lIGZpZWxkIGluIHV0bXB4LmguLi4gIiA+JjY7IH0KKwlpZiBldmFsIFwkeyRvc3NoX3Zhcm5hbWUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisJCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDx1dG1weC5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJ1dF90aW1lIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT15ZXMiCitlbHNlCisgICAJCQlldmFsICIkb3NzaF92YXJuYW1lPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCisJb3NzaF9yZXN1bHQ9YGV2YWwgJ2VjaG8gJCciJG9zc2hfdmFybmFtZSJgCisJaWYgdGVzdCAtbiAiYGVjaG8gJG9zc2hfdmFybmFtZWAiOyB0aGVuCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkb3NzaF9yZXN1bHQiID4mNQorJGFzX2VjaG8gIiRvc3NoX3Jlc3VsdCIgPiY2OyB9CisJCWlmIHRlc3QgIngkb3NzaF9yZXN1bHQiID0gInh5ZXMiOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfVElNRV9JTl9VVE1QWCAxIiA+PmNvbmZkZWZzLmgKKworCQlmaQorCWVsc2UKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJZmkKKworCisjIGxvb2sgZm9yIGZpZWxkICd1dF90dicgaW4gaGVhZGVyICd1dG1weC5oJworCQlvc3NoX3NhZmU9YGVjaG8gInV0bXB4LmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorCQlvc3NoX3Zhcm5hbWU9Im9zc2hfY3ZfJG9zc2hfc2FmZSIiX2hhc18idXRfdHYKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1dF90diBmaWVsZCBpbiB1dG1weC5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1dF90diBmaWVsZCBpbiB1dG1weC5oLi4uICIgPiY2OyB9CisJaWYgZXZhbCBcJHskb3NzaF92YXJuYW1lKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8dXRtcHguaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAidXRfdHYiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgICAJCQlldmFsICIkb3NzaF92YXJuYW1lPXllcyIKK2Vsc2UKKyAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKKwlvc3NoX3Jlc3VsdD1gZXZhbCAnZWNobyAkJyIkb3NzaF92YXJuYW1lImAKKwlpZiB0ZXN0IC1uICJgZWNobyAkb3NzaF92YXJuYW1lYCI7IHRoZW4KKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRvc3NoX3Jlc3VsdCIgPiY1CiskYXNfZWNobyAiJG9zc2hfcmVzdWx0IiA+JjY7IH0KKwkJaWYgdGVzdCAieCRvc3NoX3Jlc3VsdCIgPSAieHllcyI7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9UVl9JTl9VVE1QWCAxIiA+PmNvbmZkZWZzLmgKKworCQlmaQorCWVsc2UKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJZmkKKworCithY19mbl9jX2NoZWNrX21lbWJlciAiJExJTkVOTyIgInN0cnVjdCBzdGF0IiAic3RfYmxrc2l6ZSIgImFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9ibGtzaXplIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9ibGtzaXplIiA9IHh5ZXM7IHRoZW4gOgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfU1RSVUNUX1NUQVRfU1RfQkxLU0laRSAxCitfQUNFT0YKKworCitmaQorCithY19mbl9jX2NoZWNrX21lbWJlciAiJExJTkVOTyIgInN0cnVjdCBfX3Jlc19zdGF0ZSIgInJldHJhbnMiICJhY19jdl9tZW1iZXJfc3RydWN0X19fcmVzX3N0YXRlX3JldHJhbnMiICIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+CisjaW5jbHVkZSA8cmVzb2x2Lmg+CisKKyIKK2lmIHRlc3QgIngkYWNfY3ZfbWVtYmVyX3N0cnVjdF9fX3Jlc19zdGF0ZV9yZXRyYW5zIiA9IHh5ZXM7IHRoZW4gOgorCitlbHNlCisKKyRhc19lY2hvICIjZGVmaW5lIF9fcmVzX3N0YXRlIHN0YXRlIiA+PmNvbmZkZWZzLmgKKworZmkKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzc19mYW1pbHkgZmllbGQgaW4gc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHNzX2ZhbWlseSBmaWVsZCBpbiBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oYXZlX3NzX2ZhbWlseV9pbl9zdHJ1Y3Rfc3MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCitpbnQKK21haW4gKCkKK3sKKyBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzOyBzLnNzX2ZhbWlseSA9IDE7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIGFjX2N2X2hhdmVfc3NfZmFtaWx5X2luX3N0cnVjdF9zcz0ieWVzIgorZWxzZQorICAgYWNfY3ZfaGF2ZV9zc19mYW1pbHlfaW5fc3RydWN0X3NzPSJubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9zc19mYW1pbHlfaW5fc3RydWN0X3NzIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGF2ZV9zc19mYW1pbHlfaW5fc3RydWN0X3NzIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9zc19mYW1pbHlfaW5fc3RydWN0X3NzIiA9ICJ4eWVzIiA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TU19GQU1JTFlfSU5fU1MgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIF9fc3NfZmFtaWx5IGZpZWxkIGluIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBfX3NzX2ZhbWlseSBmaWVsZCBpbiBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oYXZlX19fc3NfZmFtaWx5X2luX3N0cnVjdF9zcys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKK2ludAorbWFpbiAoKQoreworIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHM7IHMuX19zc19mYW1pbHkgPSAxOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgICBhY19jdl9oYXZlX19fc3NfZmFtaWx5X2luX3N0cnVjdF9zcz0ieWVzIgorZWxzZQorICAgYWNfY3ZfaGF2ZV9fX3NzX2ZhbWlseV9pbl9zdHJ1Y3Rfc3M9Im5vIgorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfX19zc19mYW1pbHlfaW5fc3RydWN0X3NzIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGF2ZV9fX3NzX2ZhbWlseV9pbl9zdHJ1Y3Rfc3MiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9oYXZlX19fc3NfZmFtaWx5X2luX3N0cnVjdF9zcyIgPSAieHllcyIgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfX19TU19GQU1JTFlfSU5fU1MgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHB3X2NsYXNzIGZpZWxkIGluIHN0cnVjdCBwYXNzd2QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHB3X2NsYXNzIGZpZWxkIGluIHN0cnVjdCBwYXNzd2QuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaGF2ZV9wd19jbGFzc19pbl9zdHJ1Y3RfcGFzc3dkKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyAjaW5jbHVkZSA8cHdkLmg+CitpbnQKK21haW4gKCkKK3sKKyBzdHJ1Y3QgcGFzc3dkIHA7IHAucHdfY2xhc3MgPSAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgICBhY19jdl9oYXZlX3B3X2NsYXNzX2luX3N0cnVjdF9wYXNzd2Q9InllcyIKK2Vsc2UKKyAgIGFjX2N2X2hhdmVfcHdfY2xhc3NfaW5fc3RydWN0X3Bhc3N3ZD0ibm8iCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9wd19jbGFzc19pbl9zdHJ1Y3RfcGFzc3dkIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGF2ZV9wd19jbGFzc19pbl9zdHJ1Y3RfcGFzc3dkIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9wd19jbGFzc19pbl9zdHJ1Y3RfcGFzc3dkIiA9ICJ4eWVzIiA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9QV19DTEFTU19JTl9QQVNTV0QgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHB3X2V4cGlyZSBmaWVsZCBpbiBzdHJ1Y3QgcGFzc3dkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBwd19leHBpcmUgZmllbGQgaW4gc3RydWN0IHBhc3N3ZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oYXZlX3B3X2V4cGlyZV9pbl9zdHJ1Y3RfcGFzc3dkKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyAjaW5jbHVkZSA8cHdkLmg+CitpbnQKK21haW4gKCkKK3sKKyBzdHJ1Y3QgcGFzc3dkIHA7IHAucHdfZXhwaXJlID0gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAgYWNfY3ZfaGF2ZV9wd19leHBpcmVfaW5fc3RydWN0X3Bhc3N3ZD0ieWVzIgorZWxzZQorICAgYWNfY3ZfaGF2ZV9wd19leHBpcmVfaW5fc3RydWN0X3Bhc3N3ZD0ibm8iCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9wd19leHBpcmVfaW5fc3RydWN0X3Bhc3N3ZCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hhdmVfcHdfZXhwaXJlX2luX3N0cnVjdF9wYXNzd2QiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9oYXZlX3B3X2V4cGlyZV9pbl9zdHJ1Y3RfcGFzc3dkIiA9ICJ4eWVzIiA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9QV19FWFBJUkVfSU5fUEFTU1dEIDEiID4+Y29uZmRlZnMuaAorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBwd19jaGFuZ2UgZmllbGQgaW4gc3RydWN0IHBhc3N3ZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgcHdfY2hhbmdlIGZpZWxkIGluIHN0cnVjdCBwYXNzd2QuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaGF2ZV9wd19jaGFuZ2VfaW5fc3RydWN0X3Bhc3N3ZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisgI2luY2x1ZGUgPHB3ZC5oPgoraW50CittYWluICgpCit7Cisgc3RydWN0IHBhc3N3ZCBwOyBwLnB3X2NoYW5nZSA9IDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIGFjX2N2X2hhdmVfcHdfY2hhbmdlX2luX3N0cnVjdF9wYXNzd2Q9InllcyIKK2Vsc2UKKyAgIGFjX2N2X2hhdmVfcHdfY2hhbmdlX2luX3N0cnVjdF9wYXNzd2Q9Im5vIgorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfcHdfY2hhbmdlX2luX3N0cnVjdF9wYXNzd2QiID4mNQorJGFzX2VjaG8gIiRhY19jdl9oYXZlX3B3X2NoYW5nZV9pbl9zdHJ1Y3RfcGFzc3dkIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9wd19jaGFuZ2VfaW5fc3RydWN0X3Bhc3N3ZCIgPSAieHllcyIgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfUFdfQ0hBTkdFX0lOX1BBU1NXRCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbXNnX2FjY3JpZ2h0cyBmaWVsZCBpbiBzdHJ1Y3QgbXNnaGRyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBtc2dfYWNjcmlnaHRzIGZpZWxkIGluIHN0cnVjdCBtc2doZHIuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaGF2ZV9hY2NyaWdodHNfaW5fbXNnaGRyKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisKK2ludAorbWFpbiAoKQoreworCisjaWZkZWYgbXNnX2FjY3JpZ2h0cworI2Vycm9yICJtc2dfYWNjcmlnaHRzIGlzIGEgbWFjcm8iCitleGl0KDEpOworI2VuZGlmCitzdHJ1Y3QgbXNnaGRyIG07CittLm1zZ19hY2NyaWdodHMgPSAwOworZXhpdCgwKTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgICBhY19jdl9oYXZlX2FjY3JpZ2h0c19pbl9tc2doZHI9InllcyIKK2Vsc2UKKyAgIGFjX2N2X2hhdmVfYWNjcmlnaHRzX2luX21zZ2hkcj0ibm8iCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9hY2NyaWdodHNfaW5fbXNnaGRyIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGF2ZV9hY2NyaWdodHNfaW5fbXNnaGRyIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9hY2NyaWdodHNfaW5fbXNnaGRyIiA9ICJ4eWVzIiA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9BQ0NSSUdIVFNfSU5fTVNHSERSIDEiID4+Y29uZmRlZnMuaAorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHN0cnVjdCBzdGF0dmZzLmZfZnNpZCBpcyBpbnRlZ3JhbCB0eXBlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIHN0cnVjdCBzdGF0dmZzLmZfZnNpZCBpcyBpbnRlZ3JhbCB0eXBlLi4uICIgPiY2OyB9CitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorIyBpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfTU9VTlRfSAorI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfU1RBVFZGU19ICisjaW5jbHVkZSA8c3lzL3N0YXR2ZnMuaD4KKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKKyBzdHJ1Y3Qgc3RhdHZmcyBzOyBzLmZfZnNpZCA9IDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CitlbHNlCisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgZnNpZF90IGhhcyBtZW1iZXIgdmFsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIGZzaWRfdCBoYXMgbWVtYmVyIHZhbC4uLiAiID4mNjsgfQorCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0dmZzLmg+CisKK2ludAorbWFpbiAoKQoreworIGZzaWRfdCB0OyB0LnZhbFswXSA9IDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisKKyRhc19lY2hvICIjZGVmaW5lIEZTSURfSEFTX1ZBTCAxIiA+PmNvbmZkZWZzLmgKKworZWxzZQorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIGZfZnNpZCBoYXMgbWVtYmVyIF9fdmFsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIGZfZnNpZCBoYXMgbWVtYmVyIF9fdmFsLi4uICIgPiY2OyB9CisJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXR2ZnMuaD4KKworaW50CittYWluICgpCit7CisgZnNpZF90IHQ7IHQuX192YWxbMF0gPSAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCiskYXNfZWNobyAiI2RlZmluZSBGU0lEX0hBU19fX1ZBTCAxIiA+PmNvbmZkZWZzLmgKKworZWxzZQorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbXNnX2NvbnRyb2wgZmllbGQgaW4gc3RydWN0IG1zZ2hkciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbXNnX2NvbnRyb2wgZmllbGQgaW4gc3RydWN0IG1zZ2hkci4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oYXZlX2NvbnRyb2xfaW5fbXNnaGRyKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisKK2ludAorbWFpbiAoKQoreworCisjaWZkZWYgbXNnX2NvbnRyb2wKKyNlcnJvciAibXNnX2NvbnRyb2wgaXMgYSBtYWNybyIKK2V4aXQoMSk7CisjZW5kaWYKK3N0cnVjdCBtc2doZHIgbTsKK20ubXNnX2NvbnRyb2wgPSAwOworZXhpdCgwKTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgICBhY19jdl9oYXZlX2NvbnRyb2xfaW5fbXNnaGRyPSJ5ZXMiCitlbHNlCisgICBhY19jdl9oYXZlX2NvbnRyb2xfaW5fbXNnaGRyPSJubyIKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX2NvbnRyb2xfaW5fbXNnaGRyIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGF2ZV9jb250cm9sX2luX21zZ2hkciIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfY29udHJvbF9pbl9tc2doZHIiID0gInh5ZXMiIDsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0NPTlRST0xfSU5fTVNHSERSIDEiID4+Y29uZmRlZnMuaAorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIGxpYmMgZGVmaW5lcyBfX3Byb2duYW1lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIGxpYmMgZGVmaW5lcyBfX3Byb2duYW1lLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYmNfZGVmaW5lc19fX3Byb2duYW1lKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisgZXh0ZXJuIGNoYXIgKl9fcHJvZ25hbWU7IHByaW50ZigiJXMiLCBfX3Byb2duYW1lKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICAgYWNfY3ZfbGliY19kZWZpbmVzX19fcHJvZ25hbWU9InllcyIKK2Vsc2UKKyAgIGFjX2N2X2xpYmNfZGVmaW5lc19fX3Byb2duYW1lPSJubyIKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYmNfZGVmaW5lc19fX3Byb2duYW1lIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliY19kZWZpbmVzX19fcHJvZ25hbWUiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJjX2RlZmluZXNfX19wcm9nbmFtZSIgPSAieHllcyIgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfX19QUk9HTkFNRSAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBpbXBsZW1lbnRzIF9fRlVOQ1RJT05fXyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRDQyBpbXBsZW1lbnRzIF9fRlVOQ1RJT05fXy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9jY19pbXBsZW1lbnRzX19fRlVOQ1RJT05fXys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisgI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQKK21haW4gKCkKK3sKKyBwcmludGYoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICAgYWNfY3ZfY2NfaW1wbGVtZW50c19fX0ZVTkNUSU9OX189InllcyIKK2Vsc2UKKyAgIGFjX2N2X2NjX2ltcGxlbWVudHNfX19GVU5DVElPTl9fPSJubyIKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NjX2ltcGxlbWVudHNfX19GVU5DVElPTl9fIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfY2NfaW1wbGVtZW50c19fX0ZVTkNUSU9OX18iID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9jY19pbXBsZW1lbnRzX19fRlVOQ1RJT05fXyIgPSAieHllcyIgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfX19GVU5DVElPTl9fIDEiID4+Y29uZmRlZnMuaAorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJENDIGltcGxlbWVudHMgX19mdW5jX18iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgaW1wbGVtZW50cyBfX2Z1bmNfXy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9jY19pbXBsZW1lbnRzX19fZnVuY19fKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyAjaW5jbHVkZSA8c3RkaW8uaD4KK2ludAorbWFpbiAoKQoreworIHByaW50ZigiJXMiLCBfX2Z1bmNfXyk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIGFjX2N2X2NjX2ltcGxlbWVudHNfX19mdW5jX189InllcyIKK2Vsc2UKKyAgIGFjX2N2X2NjX2ltcGxlbWVudHNfX19mdW5jX189Im5vIgorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY2NfaW1wbGVtZW50c19fX2Z1bmNfXyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2NjX2ltcGxlbWVudHNfX19mdW5jX18iID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9jY19pbXBsZW1lbnRzX19fZnVuY19fIiA9ICJ4eWVzIiA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9fX2Z1bmNfXyAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHZhX2NvcHkgZXhpc3RzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdmFfY29weSBleGlzdHMuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaGF2ZV92YV9jb3B5Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgordmFfbGlzdCB4LHk7CisKK2ludAorbWFpbiAoKQoreworIHZhX2NvcHkoeCx5KTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICAgYWNfY3ZfaGF2ZV92YV9jb3B5PSJ5ZXMiCitlbHNlCisgICBhY19jdl9oYXZlX3ZhX2NvcHk9Im5vIgorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV92YV9jb3B5IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGF2ZV92YV9jb3B5IiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV92YV9jb3B5IiA9ICJ4eWVzIiA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9WQV9DT1BZIDEiID4+Y29uZmRlZnMuaAorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgX192YV9jb3B5IGV4aXN0cyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIF9fdmFfY29weSBleGlzdHMuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaGF2ZV9fX3ZhX2NvcHkrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+Cit2YV9saXN0IHgseTsKKworaW50CittYWluICgpCit7CisgX192YV9jb3B5KHgseSk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIGFjX2N2X2hhdmVfX192YV9jb3B5PSJ5ZXMiCitlbHNlCisgICBhY19jdl9oYXZlX19fdmFfY29weT0ibm8iCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX19fdmFfY29weSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hhdmVfX192YV9jb3B5IiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9fX3ZhX2NvcHkiID0gInh5ZXMiIDsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX19fVkFfQ09QWSAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGdldG9wdCBoYXMgb3B0cmVzZXQgc3VwcG9ydCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGdldG9wdCBoYXMgb3B0cmVzZXQgc3VwcG9ydC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oYXZlX2dldG9wdF9vcHRyZXNldCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisgI2luY2x1ZGUgPGdldG9wdC5oPgoraW50CittYWluICgpCit7CisgZXh0ZXJuIGludCBvcHRyZXNldDsgb3B0cmVzZXQgPSAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgICBhY19jdl9oYXZlX2dldG9wdF9vcHRyZXNldD0ieWVzIgorZWxzZQorICAgYWNfY3ZfaGF2ZV9nZXRvcHRfb3B0cmVzZXQ9Im5vIgorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9nZXRvcHRfb3B0cmVzZXQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9oYXZlX2dldG9wdF9vcHRyZXNldCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZ2V0b3B0X29wdHJlc2V0IiA9ICJ4eWVzIiA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9HRVRPUFRfT1BUUkVTRVQgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgbGliYyBkZWZpbmVzIHN5c19lcnJsaXN0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIGxpYmMgZGVmaW5lcyBzeXNfZXJybGlzdC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJjX2RlZmluZXNfc3lzX2Vycmxpc3QrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKyBleHRlcm4gY29uc3QgY2hhciAqY29uc3Qgc3lzX2Vycmxpc3RbXTsgcHJpbnRmKCIlcyIsIHN5c19lcnJsaXN0WzBdKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICAgYWNfY3ZfbGliY19kZWZpbmVzX3N5c19lcnJsaXN0PSJ5ZXMiCitlbHNlCisgICBhY19jdl9saWJjX2RlZmluZXNfc3lzX2Vycmxpc3Q9Im5vIgorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliY19kZWZpbmVzX3N5c19lcnJsaXN0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliY19kZWZpbmVzX3N5c19lcnJsaXN0IiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliY19kZWZpbmVzX3N5c19lcnJsaXN0IiA9ICJ4eWVzIiA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TWVNfRVJSTElTVCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIGxpYmMgZGVmaW5lcyBzeXNfbmVyciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiBsaWJjIGRlZmluZXMgc3lzX25lcnIuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliY19kZWZpbmVzX3N5c19uZXJyKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisgZXh0ZXJuIGludCBzeXNfbmVycjsgcHJpbnRmKCIlaSIsIHN5c19uZXJyKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICAgYWNfY3ZfbGliY19kZWZpbmVzX3N5c19uZXJyPSJ5ZXMiCitlbHNlCisgICBhY19jdl9saWJjX2RlZmluZXNfc3lzX25lcnI9Im5vIgorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliY19kZWZpbmVzX3N5c19uZXJyIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliY19kZWZpbmVzX3N5c19uZXJyIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliY19kZWZpbmVzX3N5c19uZXJyIiA9ICJ4eWVzIiA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TWVNfTkVSUiAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworIyBDaGVjayBsaWJyYXJpZXMgbmVlZGVkIGJ5IEROUyBmaW5nZXJwcmludCBzdXBwb3J0Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZ2V0cnJzZXRieW5hbWUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBnZXRycnNldGJ5bmFtZS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zZWFyY2hfZ2V0cnJzZXRieW5hbWUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBnZXRycnNldGJ5bmFtZSAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGdldHJyc2V0YnluYW1lICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitmb3IgYWNfbGliIGluICcnIHJlc29sdjsgZG8KKyAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KKyAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCisgIGVsc2UKKyAgICBhY19yZXM9LWwkYWNfbGliCisgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorICBmaQorICBpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3NlYXJjaF9nZXRycnNldGJ5bmFtZT0kYWNfcmVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmICR7YWNfY3Zfc2VhcmNoX2dldHJyc2V0YnluYW1lKzp9IGZhbHNlOyB0aGVuIDoKKyAgYnJlYWsKK2ZpCitkb25lCitpZiAke2FjX2N2X3NlYXJjaF9nZXRycnNldGJ5bmFtZSs6fSBmYWxzZTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3Zfc2VhcmNoX2dldHJyc2V0YnluYW1lPW5vCitmaQorcm0gY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfZ2V0cnJzZXRieW5hbWUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfZ2V0cnJzZXRieW5hbWUiID4mNjsgfQorYWNfcmVzPSRhY19jdl9zZWFyY2hfZ2V0cnJzZXRieW5hbWUKK2lmIHRlc3QgIiRhY19yZXMiICE9IG5vOyB0aGVuIDoKKyAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9HRVRSUlNFVEJZTkFNRSAxIiA+PmNvbmZkZWZzLmgKKworZWxzZQorCisJCSMgTmVlZGVkIGJ5IG91ciBnZXRycnNldGJ5bmFtZSgpCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyByZXNfcXVlcnkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyByZXNfcXVlcnkuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2VhcmNoX3Jlc19xdWVyeSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHJlc19xdWVyeSAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHJlc19xdWVyeSAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2xpYiBpbiAnJyByZXNvbHY7IGRvCisgIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCisgICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgorICBlbHNlCisgICAgYWNfcmVzPS1sJGFjX2xpYgorICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKKyAgZmkKKyAgaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9zZWFyY2hfcmVzX3F1ZXJ5PSRhY19yZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgJHthY19jdl9zZWFyY2hfcmVzX3F1ZXJ5Kzp9IGZhbHNlOyB0aGVuIDoKKyAgYnJlYWsKK2ZpCitkb25lCitpZiAke2FjX2N2X3NlYXJjaF9yZXNfcXVlcnkrOn0gZmFsc2U7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X3NlYXJjaF9yZXNfcXVlcnk9bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9yZXNfcXVlcnkiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfcmVzX3F1ZXJ5IiA+JjY7IH0KK2FjX3Jlcz0kYWNfY3Zfc2VhcmNoX3Jlc19xdWVyeQoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgorICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgorCitmaQorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBkbl9leHBhbmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBkbl9leHBhbmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2VhcmNoX2RuX2V4cGFuZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGRuX2V4cGFuZCAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRuX2V4cGFuZCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2xpYiBpbiAnJyByZXNvbHY7IGRvCisgIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCisgICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgorICBlbHNlCisgICAgYWNfcmVzPS1sJGFjX2xpYgorICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKKyAgZmkKKyAgaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9zZWFyY2hfZG5fZXhwYW5kPSRhY19yZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgJHthY19jdl9zZWFyY2hfZG5fZXhwYW5kKzp9IGZhbHNlOyB0aGVuIDoKKyAgYnJlYWsKK2ZpCitkb25lCitpZiAke2FjX2N2X3NlYXJjaF9kbl9leHBhbmQrOn0gZmFsc2U7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X3NlYXJjaF9kbl9leHBhbmQ9bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9kbl9leHBhbmQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfZG5fZXhwYW5kIiA+JjY7IH0KK2FjX3Jlcz0kYWNfY3Zfc2VhcmNoX2RuX2V4cGFuZAoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgorICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgorCitmaQorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgcmVzX3F1ZXJ5IHdpbGwgbGluayIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiByZXNfcXVlcnkgd2lsbCBsaW5rLi4uICIgPiY2OyB9CisJCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL25hbWVzZXIuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHJlc29sdi5oPgorCitpbnQKK21haW4gKCkKK3sKKworCXJlc19xdWVyeSAoMCwgMCwgMCwgMCwgMCk7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwkJICAgIHNhdmVkX0xJQlM9IiRMSUJTIgorCQkgICAgTElCUz0iJExJQlMgLWxyZXNvbHYiCisJCSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciByZXNfcXVlcnkgaW4gLWxyZXNvbHYiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHJlc19xdWVyeSBpbiAtbHJlc29sdi4uLiAiID4mNjsgfQorCQkgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvbmFtZXNlci5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8cmVzb2x2Lmg+CisKK2ludAorbWFpbiAoKQoreworCisJcmVzX3F1ZXJ5ICgwLCAwLCAwLCAwLCAwKTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CitlbHNlCisgIExJQlM9IiRzYXZlZF9MSUJTIgorCQkJIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCQlmb3IgYWNfZnVuYyBpbiBfZ2V0c2hvcnQgX2dldGxvbmcKK2RvIDoKKyAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorZG9uZQorCisJCWFjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIl9nZXRzaG9ydCIgImFjX2N2X2hhdmVfZGVjbF9fZ2V0c2hvcnQiICIjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJCSAgICAjaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9fZ2V0c2hvcnQiID0geHllczsgdGhlbiA6CisgIGFjX2hhdmVfZGVjbD0xCitlbHNlCisgIGFjX2hhdmVfZGVjbD0wCitmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfREVDTF9fR0VUU0hPUlQgJGFjX2hhdmVfZGVjbAorX0FDRU9GCithY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJfZ2V0bG9uZyIgImFjX2N2X2hhdmVfZGVjbF9fZ2V0bG9uZyIgIiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkJICAgICNpbmNsdWRlIDxhcnBhL25hbWVzZXIuaD4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX19nZXRsb25nIiA9IHh5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfX0dFVExPTkcgJGFjX2hhdmVfZGVjbAorX0FDRU9GCisKKwkJYWNfZm5fY19jaGVja19tZW1iZXIgIiRMSU5FTk8iICJIRUFERVIiICJhZCIgImFjX2N2X21lbWJlcl9IRUFERVJfYWQiICIjaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X21lbWJlcl9IRUFERVJfYWQiID0geHllczsgdGhlbiA6CisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfSEVBREVSX0FEIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisKK2ZpCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBzdHJ1Y3QgX19yZXNfc3RhdGUgX3JlcyBpcyBhbiBleHRlcm4iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgc3RydWN0IF9fcmVzX3N0YXRlIF9yZXMgaXMgYW4gZXh0ZXJuLi4uICIgPiY2OyB9CitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+CisjaW5jbHVkZSA8cmVzb2x2Lmg+CitleHRlcm4gc3RydWN0IF9fcmVzX3N0YXRlIF9yZXM7CisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9fUkVTX0VYVEVSTiAxIiA+PmNvbmZkZWZzLmgKKworCitlbHNlCisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisKKyMgQ2hlY2sgd2hldGhlciB1c2VyIHdhbnRzIFNFTGludXggc3VwcG9ydAorU0VMSU5VWF9NU0c9Im5vIgorTElCU0VMSU5VWD0iIgorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXNlbGludXggd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3NlbGludXgrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX3NlbGludXg7ICBpZiB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iIDsgdGhlbgorCQlzYXZlX0xJQlM9IiRMSUJTIgorCiskYXNfZWNobyAiI2RlZmluZSBXSVRIX1NFTElOVVggMSIgPj5jb25mZGVmcy5oCisKKwkJU0VMSU5VWF9NU0c9InllcyIKKwkJYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInNlbGludXgvc2VsaW51eC5oIiAiYWNfY3ZfaGVhZGVyX3NlbGludXhfc2VsaW51eF9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9zZWxpbnV4X3NlbGludXhfaCIgPSB4eWVzOyB0aGVuIDoKKworZWxzZQorICBhc19mbl9lcnJvciAkPyAiU0VMaW51eCBzdXBwb3J0IHJlcXVpcmVzIHNlbGludXguaCBoZWFkZXIiICIkTElORU5PIiA1CitmaQorCisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc2V0ZXhlY2NvbiBpbiAtbHNlbGludXgiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHNldGV4ZWNjb24gaW4gLWxzZWxpbnV4Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9zZWxpbnV4X3NldGV4ZWNjb24rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHNlbGludXggICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHNldGV4ZWNjb24gKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBzZXRleGVjY29uICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9zZWxpbnV4X3NldGV4ZWNjb249eWVzCitlbHNlCisgIGFjX2N2X2xpYl9zZWxpbnV4X3NldGV4ZWNjb249bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3NlbGludXhfc2V0ZXhlY2NvbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9zZWxpbnV4X3NldGV4ZWNjb24iID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfc2VsaW51eF9zZXRleGVjY29uIiA9IHh5ZXM7IHRoZW4gOgorICAgTElCU0VMSU5VWD0iLWxzZWxpbnV4IgorCQkJICBMSUJTPSIkTElCUyAtbHNlbGludXgiCisKK2Vsc2UKKyAgYXNfZm5fZXJyb3IgJD8gIlNFTGludXggc3VwcG9ydCByZXF1aXJlcyBsaWJzZWxpbnV4IGxpYnJhcnkiICIkTElORU5PIiA1CitmaQorCisJCVNTSExJQlM9IiRTU0hMSUJTICRMSUJTRUxJTlVYIgorCQlTU0hETElCUz0iJFNTSERMSUJTICRMSUJTRUxJTlVYIgorCQlmb3IgYWNfZnVuYyBpbiBnZXRzZXVzZXJieW5hbWUgZ2V0X2RlZmF1bHRfY29udGV4dF93aXRoX2xldmVsCitkbyA6CisgIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKK2RvbmUKKworCQlMSUJTPSIkc2F2ZV9MSUJTIgorCWZpCisKK2ZpCisKKworCisKKyMgQ2hlY2sgd2hldGhlciB1c2VyIHdhbnRzIEtlcmJlcm9zIDUgc3VwcG9ydAorS1JCNV9NU0c9Im5vIgorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWtlcmJlcm9zNSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfa2VyYmVyb3M1K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9rZXJiZXJvczU7ICBpZiB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iIDsgdGhlbgorCQlpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInh5ZXMiIDsgdGhlbgorCQkJS1JCNVJPT1Q9Ii91c3IvbG9jYWwiCisJCWVsc2UKKwkJCUtSQjVST09UPSR7d2l0aHZhbH0KKwkJZmkKKworCiskYXNfZWNobyAiI2RlZmluZSBLUkI1IDEiID4+Y29uZmRlZnMuaAorCisJCUtSQjVfTVNHPSJ5ZXMiCisKKwkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJrcmI1LWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkga3JiNS1jb25maWc7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX0tSQjVDT05GKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkS1JCNUNPTkYgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfS1JCNUNPTkY9IiRLUkI1Q09ORiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2FzX2R1bW15PSIkS1JCNVJPT1QvYmluOiRQQVRIIgorZm9yIGFzX2RpciBpbiAkYXNfZHVtbXkKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhfS1JCNUNPTkY9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfS1JCNUNPTkYiICYmIGFjX2N2X3BhdGhfS1JCNUNPTkY9IiRLUkI1Uk9PVC9iaW4va3JiNS1jb25maWciCisgIDs7Citlc2FjCitmaQorS1JCNUNPTkY9JGFjX2N2X3BhdGhfS1JCNUNPTkYKK2lmIHRlc3QgLW4gIiRLUkI1Q09ORiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRLUkI1Q09ORiIgPiY1CiskYXNfZWNobyAiJEtSQjVDT05GIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKwkJaWYgdGVzdCAteCAkS1JCNUNPTkYgOyB0aGVuCisKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdzc2FwaSBzdXBwb3J0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBnc3NhcGkgc3VwcG9ydC4uLiAiID4mNjsgfQorCQkJaWYgJEtSQjVDT05GIHwgZ3JlcCBnc3NhcGkgPi9kZXYvbnVsbCA7IHRoZW4KKwkJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCiskYXNfZWNobyAiI2RlZmluZSBHU1NBUEkgMSIgPj5jb25mZGVmcy5oCisKKwkJCQlrNWNvbmZvcHRzPWdzc2FwaQorCQkJZWxzZQorCQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCQkJCWs1Y29uZm9wdHM9IiIKKwkJCWZpCisJCQlLNUNGTEFHUz0iYCRLUkI1Q09ORiAtLWNmbGFncyAkazVjb25mb3B0c2AiCisJCQlLNUxJQlM9ImAkS1JCNUNPTkYgLS1saWJzICRrNWNvbmZvcHRzYCIKKwkJCUNQUEZMQUdTPSIkQ1BQRkxBR1MgJEs1Q0ZMQUdTIgorCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBIZWltZGFsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEhlaW1kYWwuLi4gIiA+JjY7IH0KKwkJCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyAjaW5jbHVkZSA8a3JiNS5oPgorCitpbnQKK21haW4gKCkKK3sKKyBjaGFyICp0bXAgPSBoZWltZGFsX3ZlcnNpb247CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisKKyRhc19lY2hvICIjZGVmaW5lIEhFSU1EQUwgMSIgPj5jb25mZGVmcy5oCisKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKwkJZWxzZQorCQkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSR7S1JCNVJPT1R9L2luY2x1ZGUiCisJCQlMREZMQUdTPSIkTERGTEFHUyAtTCR7S1JCNVJPT1R9L2xpYiIKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgSGVpbWRhbCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBIZWltZGFsLi4uICIgPiY2OyB9CisJCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisgI2luY2x1ZGUgPGtyYjUuaD4KKworaW50CittYWluICgpCit7CisgY2hhciAqdG1wID0gaGVpbWRhbF92ZXJzaW9uOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCQkJCQkgJGFzX2VjaG8gIiNkZWZpbmUgSEVJTURBTCAxIiA+PmNvbmZkZWZzLmgKKworCQkJCQkgSzVMSUJTPSItbGtyYjUiCisJCQkJCSBLNUxJQlM9IiRLNUxJQlMgLWxjb21fZXJyIC1sYXNuMSIKKwkJCQkJIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG5ldF93cml0ZSBpbiAtbHJva2VuIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBuZXRfd3JpdGUgaW4gLWxyb2tlbi4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfcm9rZW5fbmV0X3dyaXRlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxyb2tlbiAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgbmV0X3dyaXRlICgpOworaW50CittYWluICgpCit7CityZXR1cm4gbmV0X3dyaXRlICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9yb2tlbl9uZXRfd3JpdGU9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9yb2tlbl9uZXRfd3JpdGU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3Jva2VuX25ldF93cml0ZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9yb2tlbl9uZXRfd3JpdGUiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfcm9rZW5fbmV0X3dyaXRlIiA9IHh5ZXM7IHRoZW4gOgorICBLNUxJQlM9IiRLNUxJQlMgLWxyb2tlbiIKK2ZpCisKKwkJCQkJIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRlc19jYmNfZW5jcnlwdCBpbiAtbGRlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGVzX2NiY19lbmNyeXB0IGluIC1sZGVzLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9kZXNfZGVzX2NiY19lbmNyeXB0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxkZXMgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGRlc19jYmNfZW5jcnlwdCAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRlc19jYmNfZW5jcnlwdCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfZGVzX2Rlc19jYmNfZW5jcnlwdD15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX2Rlc19kZXNfY2JjX2VuY3J5cHQ9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2Rlc19kZXNfY2JjX2VuY3J5cHQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfZGVzX2Rlc19jYmNfZW5jcnlwdCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kZXNfZGVzX2NiY19lbmNyeXB0IiA9IHh5ZXM7IHRoZW4gOgorICBLNUxJQlM9IiRLNUxJQlMgLWxkZXMiCitmaQorCisKK2Vsc2UKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCQkJCQkgSzVMSUJTPSItbGtyYjUgLWxrNWNyeXB0byAtbGNvbV9lcnIiCisKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIGRuX2V4cGFuZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIGRuX2V4cGFuZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zZWFyY2hfZG5fZXhwYW5kKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZG5fZXhwYW5kICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZG5fZXhwYW5kICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitmb3IgYWNfbGliIGluICcnIHJlc29sdjsgZG8KKyAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KKyAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCisgIGVsc2UKKyAgICBhY19yZXM9LWwkYWNfbGliCisgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorICBmaQorICBpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3NlYXJjaF9kbl9leHBhbmQ9JGFjX3JlcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiAke2FjX2N2X3NlYXJjaF9kbl9leHBhbmQrOn0gZmFsc2U7IHRoZW4gOgorICBicmVhaworZmkKK2RvbmUKK2lmICR7YWNfY3Zfc2VhcmNoX2RuX2V4cGFuZCs6fSBmYWxzZTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3Zfc2VhcmNoX2RuX2V4cGFuZD1ubworZmkKK3JtIGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX2RuX2V4cGFuZCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NlYXJjaF9kbl9leHBhbmQiID4mNjsgfQorYWNfcmVzPSRhY19jdl9zZWFyY2hfZG5fZXhwYW5kCitpZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbiA6CisgIHRlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCisKK2ZpCisKKworCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ3NzX2luaXRfc2VjX2NvbnRleHQgaW4gLWxnc3NhcGlfa3JiNSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZ3NzX2luaXRfc2VjX2NvbnRleHQgaW4gLWxnc3NhcGlfa3JiNS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfZ3NzYXBpX2tyYjVfZ3NzX2luaXRfc2VjX2NvbnRleHQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGdzc2FwaV9rcmI1ICRLNUxJQlMgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZ3NzX2luaXRfc2VjX2NvbnRleHQgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBnc3NfaW5pdF9zZWNfY29udGV4dCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfZ3NzYXBpX2tyYjVfZ3NzX2luaXRfc2VjX2NvbnRleHQ9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9nc3NhcGlfa3JiNV9nc3NfaW5pdF9zZWNfY29udGV4dD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZ3NzYXBpX2tyYjVfZ3NzX2luaXRfc2VjX2NvbnRleHQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfZ3NzYXBpX2tyYjVfZ3NzX2luaXRfc2VjX2NvbnRleHQiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZ3NzYXBpX2tyYjVfZ3NzX2luaXRfc2VjX2NvbnRleHQiID0geHllczsgdGhlbiA6CisgICAkYXNfZWNobyAiI2RlZmluZSBHU1NBUEkgMSIgPj5jb25mZGVmcy5oCisKKwkJCQkgIEs1TElCUz0iLWxnc3NhcGlfa3JiNSAkSzVMSUJTIgorZWxzZQorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ3NzX2luaXRfc2VjX2NvbnRleHQgaW4gLWxnc3NhcGkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdzc19pbml0X3NlY19jb250ZXh0IGluIC1sZ3NzYXBpLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9nc3NhcGlfZ3NzX2luaXRfc2VjX2NvbnRleHQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGdzc2FwaSAkSzVMSUJTICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGdzc19pbml0X3NlY19jb250ZXh0ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZ3NzX2luaXRfc2VjX2NvbnRleHQgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2dzc2FwaV9nc3NfaW5pdF9zZWNfY29udGV4dD15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX2dzc2FwaV9nc3NfaW5pdF9zZWNfY29udGV4dD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZ3NzYXBpX2dzc19pbml0X3NlY19jb250ZXh0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2dzc2FwaV9nc3NfaW5pdF9zZWNfY29udGV4dCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9nc3NhcGlfZ3NzX2luaXRfc2VjX2NvbnRleHQiID0geHllczsgdGhlbiA6CisgICAkYXNfZWNobyAiI2RlZmluZSBHU1NBUEkgMSIgPj5jb25mZGVmcy5oCisKKwkJCQkJICBLNUxJQlM9Ii1sZ3NzYXBpICRLNUxJQlMiCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogQ2Fubm90IGZpbmQgYW55IHN1aXRhYmxlIGdzcy1hcGkgbGlicmFyeSAtIGJ1aWxkIG1heSBmYWlsIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IENhbm5vdCBmaW5kIGFueSBzdWl0YWJsZSBnc3MtYXBpIGxpYnJhcnkgLSBidWlsZCBtYXkgZmFpbCIgPiYyO30KK2ZpCisKKworZmkKKworCisJCQlhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiZ3NzYXBpLmgiICJhY19jdl9oZWFkZXJfZ3NzYXBpX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2dzc2FwaV9oIiA9IHh5ZXM7IHRoZW4gOgorCitlbHNlCisgICB1bnNldCBhY19jdl9oZWFkZXJfZ3NzYXBpX2gKKwkJCQkgIENQUEZMQUdTPSIkQ1BQRkxBR1MgLUkke0tSQjVST09UfS9pbmNsdWRlL2dzc2FwaSIKKwkJCQkgIGZvciBhY19oZWFkZXIgaW4gZ3NzYXBpLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImdzc2FwaS5oIiAiYWNfY3ZfaGVhZGVyX2dzc2FwaV9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9nc3NhcGlfaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0dTU0FQSV9IIDEKK19BQ0VPRgorCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogQ2Fubm90IGZpbmQgYW55IHN1aXRhYmxlIGdzcy1hcGkgaGVhZGVyIC0gYnVpbGQgbWF5IGZhaWwiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogQ2Fubm90IGZpbmQgYW55IHN1aXRhYmxlIGdzcy1hcGkgaGVhZGVyIC0gYnVpbGQgbWF5IGZhaWwiID4mMjt9CisKK2ZpCisKK2RvbmUKKworCisKK2ZpCisKKworCisJCQlvbGRDUFA9IiRDUFBGTEFHUyIKKwkJCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLUkke0tSQjVST09UfS9pbmNsdWRlL2dzc2FwaSIKKwkJCWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJnc3NhcGlfa3JiNS5oIiAiYWNfY3ZfaGVhZGVyX2dzc2FwaV9rcmI1X2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2dzc2FwaV9rcmI1X2giID0geHllczsgdGhlbiA6CisKK2Vsc2UKKyAgIENQUEZMQUdTPSIkb2xkQ1BQIgorZmkKKworCisKKwkJZmkKKwkJaWYgdGVzdCAhIC16ICIkbmVlZF9kYXNoX3IiIDsgdGhlbgorCQkJTERGTEFHUz0iJExERkxBR1MgLVIke0tSQjVST09UfS9saWIiCisJCWZpCisJCWlmIHRlc3QgISAteiAiJGJsaWJwYXRoIiA7IHRoZW4KKwkJCWJsaWJwYXRoPSIkYmxpYnBhdGg6JHtLUkI1Uk9PVH0vbGliIgorCQlmaQorCisJCWZvciBhY19oZWFkZXIgaW4gZ3NzYXBpLmggZ3NzYXBpL2dzc2FwaS5oCitkbyA6CisgIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY19IZWFkZXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKwkJZm9yIGFjX2hlYWRlciBpbiBnc3NhcGlfa3JiNS5oIGdzc2FwaS9nc3NhcGlfa3JiNS5oCitkbyA6CisgIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY19IZWFkZXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKwkJZm9yIGFjX2hlYWRlciBpbiBnc3NhcGlfZ2VuZXJpYy5oIGdzc2FwaS9nc3NhcGlfZ2VuZXJpYy5oCitkbyA6CisgIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY19IZWFkZXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworCQlMSUJTPSIkTElCUyAkSzVMSUJTIgorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcga19oYXNhZnMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBrX2hhc2Fmcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zZWFyY2hfa19oYXNhZnMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBrX2hhc2FmcyAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGtfaGFzYWZzICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitmb3IgYWNfbGliIGluICcnIGthZnM7IGRvCisgIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCisgICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgorICBlbHNlCisgICAgYWNfcmVzPS1sJGFjX2xpYgorICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKKyAgZmkKKyAgaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9zZWFyY2hfa19oYXNhZnM9JGFjX3JlcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiAke2FjX2N2X3NlYXJjaF9rX2hhc2Fmcys6fSBmYWxzZTsgdGhlbiA6CisgIGJyZWFrCitmaQorZG9uZQoraWYgJHthY19jdl9zZWFyY2hfa19oYXNhZnMrOn0gZmFsc2U7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X3NlYXJjaF9rX2hhc2Fmcz1ubworZmkKK3JtIGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX2tfaGFzYWZzIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2VhcmNoX2tfaGFzYWZzIiA+JjY7IH0KK2FjX3Jlcz0kYWNfY3Zfc2VhcmNoX2tfaGFzYWZzCitpZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbiA6CisgIHRlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCisKKyRhc19lY2hvICIjZGVmaW5lIFVTRV9BRlMgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKwlmaQorCisKK2ZpCisKKworIyBMb29raW5nIGZvciBwcm9ncmFtcywgcGF0aHMgYW5kIGZpbGVzCisKK1BSSVZTRVBfUEFUSD0vdmFyL2VtcHR5CisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtcHJpdnNlcC1wYXRoIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9wcml2c2VwX3BhdGgrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX3ByaXZzZXBfcGF0aDsKKwkJaWYgdGVzdCAtbiAiJHdpdGh2YWwiICAmJiAgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiAgJiYgIFwKKwkJICAgIHRlc3QgIngke3dpdGh2YWx9IiAhPSAieHllcyI7IHRoZW4KKwkJCVBSSVZTRVBfUEFUSD0kd2l0aHZhbAorCQlmaQorCisKK2ZpCisKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgteGF1dGggd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3hhdXRoK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF94YXV0aDsKKwkJaWYgdGVzdCAtbiAiJHdpdGh2YWwiICAmJiAgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiAgJiYgIFwKKwkJICAgIHRlc3QgIngke3dpdGh2YWx9IiAhPSAieHllcyI7IHRoZW4KKwkJCXhhdXRoX3BhdGg9JHdpdGh2YWwKKwkJZmkKKworZWxzZQorCisJCVRlc3RQYXRoPSIkUEFUSCIKKwkJVGVzdFBhdGg9IiR7VGVzdFBhdGh9JHtQQVRIX1NFUEFSQVRPUn0vdXNyL1gvYmluIgorCQlUZXN0UGF0aD0iJHtUZXN0UGF0aH0ke1BBVEhfU0VQQVJBVE9SfS91c3IvYmluL1gxMSIKKwkJVGVzdFBhdGg9IiR7VGVzdFBhdGh9JHtQQVRIX1NFUEFSQVRPUn0vdXNyL1gxMVI2L2JpbiIKKwkJVGVzdFBhdGg9IiR7VGVzdFBhdGh9JHtQQVRIX1NFUEFSQVRPUn0vdXNyL29wZW53aW4vYmluIgorCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhhdXRoIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB4YXV0aDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfeGF1dGhfcGF0aCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJHhhdXRoX3BhdGggaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfeGF1dGhfcGF0aD0iJHhhdXRoX3BhdGgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRUZXN0UGF0aAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF94YXV0aF9wYXRoPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQoreGF1dGhfcGF0aD0kYWNfY3ZfcGF0aF94YXV0aF9wYXRoCitpZiB0ZXN0IC1uICIkeGF1dGhfcGF0aCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICR4YXV0aF9wYXRoIiA+JjUKKyRhc19lY2hvICIkeGF1dGhfcGF0aCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisJCWlmICh0ZXN0ICEgLXogIiR4YXV0aF9wYXRoIiAmJiB0ZXN0IC14ICIvdXNyL29wZW53aW4vYmluL3hhdXRoIikgOyB0aGVuCisJCQl4YXV0aF9wYXRoPSIvdXNyL29wZW53aW4vYmluL3hhdXRoIgorCQlmaQorCisKK2ZpCisKKworU1RSSVBfT1BUPS1zCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc3RyaXAgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc3RyaXArc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9zdHJpcDsKKwkJaWYgdGVzdCAieCRlbmFibGV2YWwiID0gInhubyIgOyB0aGVuCisJCQlTVFJJUF9PUFQ9CisJCWZpCisKKworZmkKKworCisKK2lmIHRlc3QgLXogIiR4YXV0aF9wYXRoIiA7IHRoZW4KKwlYQVVUSF9QQVRIPSJ1bmRlZmluZWQiCisKK2Vsc2UKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBYQVVUSF9QQVRIICIkeGF1dGhfcGF0aCIKK19BQ0VPRgorCisJWEFVVEhfUEFUSD0keGF1dGhfcGF0aAorCitmaQorCisjIENoZWNrIGZvciBtYWlsIGRpcmVjdG9yeQorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLW1haWxkaXIgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX21haWxkaXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX21haWxkaXI7CisJaWYgdGVzdCAiWCR3aXRodmFsIiAhPSBYICAmJiAgdGVzdCAieCR3aXRodmFsIiAhPSB4bm8gICYmICBcCisJICAgIHRlc3QgIngke3dpdGh2YWx9IiAhPSB4eWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgTUFJTF9ESVJFQ1RPUlkgIiR3aXRodmFsIgorX0FDRU9GCisKKwkgICAgZmkKKworZWxzZQorCisJaWYgdGVzdCAiWCRtYWlsZGlyIiAhPSAiWCI7IHRoZW4KKwkgICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBNQUlMX0RJUkVDVE9SWSAiJG1haWxkaXIiCitfQUNFT0YKKworCWVsc2UKKwkgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBEaXNjb3ZlcmluZyBzeXN0ZW0gbWFpbCBkaXJlY3RvcnkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgRGlzY292ZXJpbmcgc3lzdGVtIG1haWwgZGlyZWN0b3J5Li4uICIgPiY2OyB9CisJICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKworCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IHVzZSAtLXdpdGgtbWFpbGRpcj0vcGF0aC90by9tYWlsIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogdXNlIC0td2l0aC1tYWlsZGlyPS9wYXRoL3RvL21haWwiID4mMjt9CisKKworZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIEhBVkVfUEFUSFNfSAorI2luY2x1ZGUgPHBhdGhzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX01BSUxMT0NLX0gKKyNpbmNsdWRlIDxtYWlsbG9jay5oPgorI2VuZGlmCisjZGVmaW5lIERBVEEgImNvbmZ0ZXN0Lm1haWxkaXIiCisKK2ludAorbWFpbiAoKQoreworCisJRklMRSAqZmQ7CisJaW50IHJjOworCisJZmQgPSBmb3BlbihEQVRBLCJ3Iik7CisJaWYoZmQgPT0gTlVMTCkKKwkJZXhpdCgxKTsKKworI2lmIGRlZmluZWQgKF9QQVRIX01BSUxESVIpCisJaWYgKChyYyA9IGZwcmludGYoZmQgLCJfUEFUSF9NQUlMRElSOiVzXG4iLCBfUEFUSF9NQUlMRElSKSkgPDApCisJCWV4aXQoMSk7CisjZWxpZiBkZWZpbmVkIChNQUlMRElSKQorCWlmICgocmMgPSBmcHJpbnRmKGZkICwiTUFJTERJUjolc1xuIiwgTUFJTERJUikpIDwwKQorCQlleGl0KDEpOworI2VsaWYgZGVmaW5lZCAoX1BBVEhfTUFJTCkKKwlpZiAoKHJjID0gZnByaW50ZihmZCAsIl9QQVRIX01BSUw6JXNcbiIsIF9QQVRIX01BSUwpKSA8MCkKKwkJZXhpdCgxKTsKKyNlbHNlCisJZXhpdCAoMik7CisjZW5kaWYKKworCWV4aXQoMCk7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisKKwkgCSAgICBtYWlsZGlyX3doYXQ9YGF3ayAtRjogJ3twcmludCAkMX0nIGNvbmZ0ZXN0Lm1haWxkaXJgCisJCSAgICBtYWlsZGlyPWBhd2sgLUY6ICd7cHJpbnQgJDJ9JyBjb25mdGVzdC5tYWlsZGlyIFwKKwkJCXwgc2VkICdzfC8kfHwnYAorCQkgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IFVzaW5nOiAkbWFpbGRpciBmcm9tICRtYWlsZGlyX3doYXQiID4mNQorJGFzX2VjaG8gIlVzaW5nOiAkbWFpbGRpciBmcm9tICRtYWlsZGlyX3doYXQiID4mNjsgfQorCQkgICAgaWYgdGVzdCAieCRtYWlsZGlyX3doYXQiICE9ICJ4X1BBVEhfTUFJTERJUiI7IHRoZW4KKwkJCWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgTUFJTF9ESVJFQ1RPUlkgIiRtYWlsZGlyIgorX0FDRU9GCisKKwkJICAgIGZpCisKK2Vsc2UKKworCQkgICAgaWYgdGVzdCAiWCRhY19zdGF0dXMiID0gIlgyIjt0aGVuCisjIG91ciB0ZXN0IHByb2dyYW0gZGlkbid0IGZpbmQgaXQuIERlZmF1bHQgdG8gL3Zhci9zcG9vbC9tYWlsCisJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogVXNpbmc6IGRlZmF1bHQgdmFsdWUgb2YgL3Zhci9zcG9vbC9tYWlsIiA+JjUKKyRhc19lY2hvICJVc2luZzogZGVmYXVsdCB2YWx1ZSBvZiAvdmFyL3Nwb29sL21haWwiID4mNjsgfQorCQkJY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBNQUlMX0RJUkVDVE9SWSAiL3Zhci9zcG9vbC9tYWlsIgorX0FDRU9GCisKKwkJICAgICBlbHNlCisJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogKioqIG5vdCBmb3VuZCAqKioiID4mNQorJGFzX2VjaG8gIioqKiBub3QgZm91bmQgKioqIiA+JjY7IH0KKwkJICAgICBmaQorCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworCWZpCisKKworZmkKKyAjIG1haWxkaXIKKworaWYgdGVzdCAhIC16ICIkY3Jvc3NfY29tcGlsaW5nIiAmJiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieHllcyI7IHRoZW4KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogRGlzYWJsaW5nIC9kZXYvcHRteCB0ZXN0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogRGlzYWJsaW5nIC9kZXYvcHRteCB0ZXN0IiA+JjI7fQorCWRpc2FibGVfcHRteF9jaGVjaz15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkbm9fZGV2X3B0bXgiIDsgdGhlbgorCWlmIHRlc3QgIngkZGlzYWJsZV9wdG14X2NoZWNrIiAhPSAieHllcyIgOyB0aGVuCisJCWFzX2FjX0ZpbGU9YCRhc19lY2hvICJhY19jdl9maWxlXyIvZGV2L3B0bXgiIiB8ICRhc190cl9zaGAKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFwiL2Rldi9wdG14XCIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFwiL2Rldi9wdG14XCIuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JGFzX2FjX0ZpbGUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyAmJgorICBhc19mbl9lcnJvciAkPyAiY2Fubm90IGNoZWNrIGZvciBmaWxlIGV4aXN0ZW5jZSB3aGVuIGNyb3NzIGNvbXBpbGluZyIgIiRMSU5FTk8iIDUKK2lmIHRlc3QgLXIgIiIvZGV2L3B0bXgiIjsgdGhlbgorICBldmFsICIkYXNfYWNfRmlsZT15ZXMiCitlbHNlCisgIGV2YWwgIiRhc19hY19GaWxlPW5vIgorZmkKK2ZpCitldmFsIGFjX3Jlcz1cJCRhc19hY19GaWxlCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfRmlsZSJcIiA9IHgieWVzIjsgdGhlbiA6CisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFVl9QVE1YIDEKK19BQ0VPRgorCisJCQkJaGF2ZV9kZXZfcHRteD0xCisKKworZmkKKworCWZpCitmaQorCitpZiB0ZXN0ICEgLXogIiRjcm9zc19jb21waWxpbmciICYmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiAhPSAieHllcyI7IHRoZW4KKwlhc19hY19GaWxlPWAkYXNfZWNobyAiYWNfY3ZfZmlsZV8iL2Rldi9wdGMiIiB8ICRhc190cl9zaGAKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFwiL2Rldi9wdGNcIiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgXCIvZGV2L3B0Y1wiLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyRhc19hY19GaWxlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgJiYKKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjaGVjayBmb3IgZmlsZSBleGlzdGVuY2Ugd2hlbiBjcm9zcyBjb21waWxpbmciICIkTElORU5PIiA1CitpZiB0ZXN0IC1yICIiL2Rldi9wdGMiIjsgdGhlbgorICBldmFsICIkYXNfYWNfRmlsZT15ZXMiCitlbHNlCisgIGV2YWwgIiRhc19hY19GaWxlPW5vIgorZmkKK2ZpCitldmFsIGFjX3Jlcz1cJCRhc19hY19GaWxlCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfRmlsZSJcIiA9IHgieWVzIjsgdGhlbiA6CisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFVl9QVFNfQU5EX1BUQyAxCitfQUNFT0YKKworCQkJaGF2ZV9kZXZfcHRjPTEKKworCitmaQorCitlbHNlCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IERpc2FibGluZyAvZGV2L3B0YyB0ZXN0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogRGlzYWJsaW5nIC9kZXYvcHRjIHRlc3QiID4mMjt9CitmaQorCisjIE9wdGlvbnMgZnJvbSBoZXJlIG9uLiBTb21lIG9mIHRoZXNlIGFyZSBwcmVzZXQgYnkgcGxhdGZvcm0gYWJvdmUKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1tYW50eXBlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9tYW50eXBlK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9tYW50eXBlOworCQljYXNlICIkd2l0aHZhbCIgaW4KKwkJbWFufGNhdHxkb2MpCisJCQlNQU5UWVBFPSR3aXRodmFsCisJCQk7OworCQkqKQorCQkJYXNfZm5fZXJyb3IgJD8gImludmFsaWQgbWFuIHR5cGU6ICR3aXRodmFsIiAiJExJTkVOTyIgNQorCQkJOzsKKwkJZXNhYworCisKK2ZpCisKK2lmIHRlc3QgLXogIiRNQU5UWVBFIjsgdGhlbgorCVRlc3RQYXRoPSIvdXNyL2JpbiR7UEFUSF9TRVBBUkFUT1J9L3Vzci91Y2IiCisJZm9yIGFjX3Byb2cgaW4gbnJvZmYgYXdmCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfTlJPRkYrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICROUk9GRiBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9OUk9GRj0iJE5ST0ZGIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkVGVzdFBhdGgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhfTlJPRkY9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitOUk9GRj0kYWNfY3ZfcGF0aF9OUk9GRgoraWYgdGVzdCAtbiAiJE5ST0ZGIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE5ST0ZGIiA+JjUKKyRhc19lY2hvICIkTlJPRkYiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkTlJPRkYiICYmIGJyZWFrCitkb25lCit0ZXN0IC1uICIkTlJPRkYiIHx8IE5ST0ZGPSIvYmluL2ZhbHNlIgorCisJaWYgJHtOUk9GRn0gLW1kb2MgJHtzcmNkaXJ9L3NzaC4xID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlNQU5UWVBFPWRvYworCWVsaWYgJHtOUk9GRn0gLW1hbiAke3NyY2Rpcn0vc3NoLjEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCU1BTlRZUEU9bWFuCisJZWxzZQorCQlNQU5UWVBFPWNhdAorCWZpCitmaQorCitpZiB0ZXN0ICIkTUFOVFlQRSIgPSAiZG9jIjsgdGhlbgorCW1hbnN1YmRpcj1tYW47CitlbHNlCisJbWFuc3ViZGlyPSRNQU5UWVBFOworZmkKKworCisjIENoZWNrIHdoZXRoZXIgdG8gZW5hYmxlIE1ENSBwYXNzd29yZHMKK01ENV9NU0c9Im5vIgorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLW1kNS1wYXNzd29yZHMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX21kNV9wYXNzd29yZHMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX21kNV9wYXNzd29yZHM7CisJCWlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfTUQ1X1BBU1NXT1JEUyAxIiA+PmNvbmZkZWZzLmgKKworCQkJTUQ1X01TRz0ieWVzIgorCQlmaQorCisKK2ZpCisKKworIyBXaGV0aGVyIHRvIGRpc2FibGUgc2hhZG93IHBhc3N3b3JkIHN1cHBvcnQKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1zaGFkb3cgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3NoYWRvdytzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfc2hhZG93OworCQlpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInhubyIgOyB0aGVuCisJCQkkYXNfZWNobyAiI2RlZmluZSBESVNBQkxFX1NIQURPVyAxIiA+PmNvbmZkZWZzLmgKKworCQkJZGlzYWJsZV9zaGFkb3c9eWVzCisJCWZpCisKKworZmkKKworCitpZiB0ZXN0IC16ICIkZGlzYWJsZV9zaGFkb3ciIDsgdGhlbgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgdGhlIHN5c3RlbXMgaGFzIGV4cGlyZSBzaGFkb3cgaW5mb3JtYXRpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgdGhlIHN5c3RlbXMgaGFzIGV4cGlyZSBzaGFkb3cgaW5mb3JtYXRpb24uLi4gIiA+JjY7IH0KKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzaGFkb3cuaD4KK3N0cnVjdCBzcHdkIHNwOworCitpbnQKK21haW4gKCkKK3sKKyBzcC5zcF9leHBpcmUgPSBzcC5zcF9sc3RjaGcgPSBzcC5zcF9pbmFjdCA9IDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIHNwX2V4cGlyZV9hdmFpbGFibGU9eWVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKKwlpZiB0ZXN0ICJ4JHNwX2V4cGlyZV9hdmFpbGFibGUiID0gInh5ZXMiIDsgdGhlbgorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCiskYXNfZWNobyAiI2RlZmluZSBIQVNfU0hBRE9XX0VYUElSRSAxIiA+PmNvbmZkZWZzLmgKKworCWVsc2UKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJZmkKK2ZpCisKKyMgVXNlIGlwIGFkZHJlc3MgaW5zdGVhZCBvZiBob3N0bmFtZSBpbiAkRElTUExBWQoraWYgdGVzdCAhIC16ICIkSVBBRERSX0lOX0RJU1BMQVkiIDsgdGhlbgorCURJU1BMQVlfSEFDS19NU0c9InllcyIKKworJGFzX2VjaG8gIiNkZWZpbmUgSVBBRERSX0lOX0RJU1BMQVkgMSIgPj5jb25mZGVmcy5oCisKK2Vsc2UKKwlESVNQTEFZX0hBQ0tfTVNHPSJubyIKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pcGFkZHItZGlzcGxheSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfaXBhZGRyX2Rpc3BsYXkrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2lwYWRkcl9kaXNwbGF5OworCQkJaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KKwkJCQkkYXNfZWNobyAiI2RlZmluZSBJUEFERFJfSU5fRElTUExBWSAxIiA+PmNvbmZkZWZzLmgKKworCQkJCURJU1BMQVlfSEFDS19NU0c9InllcyIKKwkJCWZpCisKKworZmkKKworZmkKKworIyBjaGVjayBmb3IgL2V0Yy9kZWZhdWx0L2xvZ2luIGFuZCB1c2UgaXQgaWYgcHJlc2VudC4KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ldGMtZGVmYXVsdC1sb2dpbiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9ldGNfZGVmYXVsdF9sb2dpbitzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2V0Y19kZWZhdWx0X2xvZ2luOyAgaWYgdGVzdCAieCRlbmFibGV2YWwiID0gInhubyI7IHRoZW4KKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAvZXRjL2RlZmF1bHQvbG9naW4gaGFuZGxpbmcgZGlzYWJsZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogL2V0Yy9kZWZhdWx0L2xvZ2luIGhhbmRsaW5nIGRpc2FibGVkIiA+JjY7fQorCQlldGNfZGVmYXVsdF9sb2dpbj1ubworCSAgZWxzZQorCQlldGNfZGVmYXVsdF9sb2dpbj15ZXMKKwkgIGZpCitlbHNlCisgICBpZiB0ZXN0ICEgLXogIiRjcm9zc19jb21waWxpbmciICYmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4eWVzIjsKKwkgIHRoZW4KKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IG5vdCBjaGVja2luZyAvZXRjL2RlZmF1bHQvbG9naW4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY3Jvc3MgY29tcGlsaW5nOiBub3QgY2hlY2tpbmcgL2V0Yy9kZWZhdWx0L2xvZ2luIiA+JjI7fQorCQlldGNfZGVmYXVsdF9sb2dpbj1ubworCSAgZWxzZQorCQlldGNfZGVmYXVsdF9sb2dpbj15ZXMKKwkgIGZpCisKK2ZpCisKKworaWYgdGVzdCAieCRldGNfZGVmYXVsdF9sb2dpbiIgIT0gInhubyI7IHRoZW4KKwlhc19hY19GaWxlPWAkYXNfZWNobyAiYWNfY3ZfZmlsZV8iL2V0Yy9kZWZhdWx0L2xvZ2luIiIgfCAkYXNfdHJfc2hgCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBcIi9ldGMvZGVmYXVsdC9sb2dpblwiIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBcIi9ldGMvZGVmYXVsdC9sb2dpblwiLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyRhc19hY19GaWxlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgJiYKKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjaGVjayBmb3IgZmlsZSBleGlzdGVuY2Ugd2hlbiBjcm9zcyBjb21waWxpbmciICIkTElORU5PIiA1CitpZiB0ZXN0IC1yICIiL2V0Yy9kZWZhdWx0L2xvZ2luIiI7IHRoZW4KKyAgZXZhbCAiJGFzX2FjX0ZpbGU9eWVzIgorZWxzZQorICBldmFsICIkYXNfYWNfRmlsZT1ubyIKK2ZpCitmaQorZXZhbCBhY19yZXM9XCQkYXNfYWNfRmlsZQorCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0ZpbGUiXCIgPSB4InllcyI7IHRoZW4gOgorICAgZXh0ZXJuYWxfcGF0aF9maWxlPS9ldGMvZGVmYXVsdC9sb2dpbgorZmkKKworCWlmIHRlc3QgIngkZXh0ZXJuYWxfcGF0aF9maWxlIiA9ICJ4L2V0Yy9kZWZhdWx0L2xvZ2luIjsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0VUQ19ERUZBVUxUX0xPR0lOIDEiID4+Y29uZmRlZnMuaAorCisJZmkKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfbG9naW5fZ2V0Y2FwYm9vbCA9ICJ5ZXMiICYmIFwKKwl0ZXN0ICRhY19jdl9oZWFkZXJfbG9naW5fY2FwX2ggPSAieWVzIiA7IHRoZW4KKwlleHRlcm5hbF9wYXRoX2ZpbGU9L2V0Yy9sb2dpbi5jb25mCitmaQorCisjIFdoZXRoZXIgdG8gbWVzcyB3aXRoIHRoZSBkZWZhdWx0IHBhdGgKK1NFUlZFUl9QQVRIX01TRz0iKGRlZmF1bHQpIgorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWRlZmF1bHQtcGF0aCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZGVmYXVsdF9wYXRoK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9kZWZhdWx0X3BhdGg7CisJCWlmIHRlc3QgIngkZXh0ZXJuYWxfcGF0aF9maWxlIiA9ICJ4L2V0Yy9sb2dpbi5jb25mIiA7IHRoZW4KKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzoKKy0td2l0aC1kZWZhdWx0LXBhdGg9UEFUSCBoYXMgbm8gZWZmZWN0IG9uIHRoaXMgc3lzdGVtLgorRWRpdCAvZXRjL2xvZ2luLmNvbmYgaW5zdGVhZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzoKKy0td2l0aC1kZWZhdWx0LXBhdGg9UEFUSCBoYXMgbm8gZWZmZWN0IG9uIHRoaXMgc3lzdGVtLgorRWRpdCAvZXRjL2xvZ2luLmNvbmYgaW5zdGVhZC4iID4mMjt9CisJCWVsaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KKwkJCWlmIHRlc3QgISAteiAiJGV4dGVybmFsX3BhdGhfZmlsZSIgOyB0aGVuCisJCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOgorLS13aXRoLWRlZmF1bHQtcGF0aD1QQVRIIHdpbGwgb25seSBiZSB1c2VkIGlmIFBBVEggaXMgbm90IGRlZmluZWQgaW4KKyRleHRlcm5hbF9wYXRoX2ZpbGUgLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOgorLS13aXRoLWRlZmF1bHQtcGF0aD1QQVRIIHdpbGwgb25seSBiZSB1c2VkIGlmIFBBVEggaXMgbm90IGRlZmluZWQgaW4KKyRleHRlcm5hbF9wYXRoX2ZpbGUgLiIgPiYyO30KKwkJCWZpCisJCQl1c2VyX3BhdGg9IiR3aXRodmFsIgorCQkJU0VSVkVSX1BBVEhfTVNHPSIkd2l0aHZhbCIKKwkJZmkKKworZWxzZQorICAgaWYgdGVzdCAieCRleHRlcm5hbF9wYXRoX2ZpbGUiID0gIngvZXRjL2xvZ2luLmNvbmYiIDsgdGhlbgorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IE1ha2Ugc3VyZSB0aGUgcGF0aCB0byBzY3AgaXMgaW4gL2V0Yy9sb2dpbi5jb25mIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IE1ha2Ugc3VyZSB0aGUgcGF0aCB0byBzY3AgaXMgaW4gL2V0Yy9sb2dpbi5jb25mIiA+JjI7fQorCWVsc2UKKwkJaWYgdGVzdCAhIC16ICIkZXh0ZXJuYWxfcGF0aF9maWxlIiA7IHRoZW4KKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzoKK0lmIFBBVEggaXMgZGVmaW5lZCBpbiAkZXh0ZXJuYWxfcGF0aF9maWxlLCBlbnN1cmUgdGhlIHBhdGggdG8gc2NwIGlzIGluY2x1ZGVkLAorb3RoZXJ3aXNlIHNjcCB3aWxsIG5vdCB3b3JrLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOgorSWYgUEFUSCBpcyBkZWZpbmVkIGluICRleHRlcm5hbF9wYXRoX2ZpbGUsIGVuc3VyZSB0aGUgcGF0aCB0byBzY3AgaXMgaW5jbHVkZWQsCitvdGhlcndpc2Ugc2NwIHdpbGwgbm90IHdvcmsuIiA+JjI7fQorCQlmaQorCQlpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgICB1c2VyX3BhdGg9Ii91c3IvYmluOi9iaW46L3Vzci9zYmluOi9zYmluIgorCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogZmluZCBvdXQgd2hhdCBTVERQQVRIIGlzICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZmRlZiBIQVZFX1BBVEhTX0gKKyMgaW5jbHVkZSA8cGF0aHMuaD4KKyNlbmRpZgorI2lmbmRlZiBfUEFUSF9TVERQQVRICisjIGlmZGVmIF9QQVRIX1VTRVJQQVRICS8qIElyaXggKi8KKyMgIGRlZmluZSBfUEFUSF9TVERQQVRIIF9QQVRIX1VTRVJQQVRICisjIGVsc2UKKyMgIGRlZmluZSBfUEFUSF9TVERQQVRIICIvdXNyL2JpbjovYmluOi91c3Ivc2Jpbjovc2JpbiIKKyMgZW5kaWYKKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNkZWZpbmUgREFUQSAiY29uZnRlc3Quc3RkcGF0aCIKKworaW50CittYWluICgpCit7CisKKwlGSUxFICpmZDsKKwlpbnQgcmM7CisKKwlmZCA9IGZvcGVuKERBVEEsInciKTsKKwlpZihmZCA9PSBOVUxMKQorCQlleGl0KDEpOworCisJaWYgKChyYyA9IGZwcmludGYoZmQsIiVzIiwgX1BBVEhfU1REUEFUSCkpIDwgMCkKKwkJZXhpdCgxKTsKKworCWV4aXQoMCk7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgICB1c2VyX3BhdGg9YGNhdCBjb25mdGVzdC5zdGRwYXRoYAorZWxzZQorICAgdXNlcl9wYXRoPSIvdXNyL2JpbjovYmluOi91c3Ivc2Jpbjovc2JpbiIKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCisjIG1ha2Ugc3VyZSAkYmluZGlyIGlzIGluIFVTRVJfUEFUSCBzbyBzY3Agd2lsbCB3b3JrCisJCXRfYmluZGlyPWBldmFsIGVjaG8gJHtiaW5kaXJ9YAorCQljYXNlICR0X2JpbmRpciBpbgorCQkJTk9ORS8qKSB0X2JpbmRpcj1gZWNobyAkdF9iaW5kaXIgfCBzZWQgInN+Tk9ORX4kcHJlZml4fiJgIDs7CisJCWVzYWMKKwkJY2FzZSAkdF9iaW5kaXIgaW4KKwkJCU5PTkUvKikgdF9iaW5kaXI9YGVjaG8gJHRfYmluZGlyIHwgc2VkICJzfk5PTkV+JGFjX2RlZmF1bHRfcHJlZml4fiJgIDs7CisJCWVzYWMKKwkJZWNobyAkdXNlcl9wYXRoIHwgZ3JlcCAiOiR0X2JpbmRpciIgID4gL2Rldi9udWxsIDI+JjEKKwkJaWYgdGVzdCAkPyAtbmUgMCAgOyB0aGVuCisJCQllY2hvICR1c2VyX3BhdGggfCBncmVwICJeJHRfYmluZGlyIiAgPiAvZGV2L251bGwgMj4mMQorCQkJaWYgdGVzdCAkPyAtbmUgMCAgOyB0aGVuCisJCQkJdXNlcl9wYXRoPSR1c2VyX3BhdGg6JHRfYmluZGlyCisJCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IEFkZGluZyAkdF9iaW5kaXIgdG8gVVNFUl9QQVRIIHNvIHNjcCB3aWxsIHdvcmsiID4mNQorJGFzX2VjaG8gIkFkZGluZyAkdF9iaW5kaXIgdG8gVVNFUl9QQVRIIHNvIHNjcCB3aWxsIHdvcmsiID4mNjsgfQorCQkJZmkKKwkJZmkKKwlmaQorCitmaQorCitpZiB0ZXN0ICJ4JGV4dGVybmFsX3BhdGhfZmlsZSIgIT0gIngvZXRjL2xvZ2luLmNvbmYiIDsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFVTRVJfUEFUSCAiJHVzZXJfcGF0aCIKK19BQ0VPRgorCisKK2ZpCisKKyMgU2V0IHN1cGVydXNlciBwYXRoIHNlcGFyYXRlbHkgdG8gdXNlciBwYXRoCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtc3VwZXJ1c2VyLXBhdGggd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3N1cGVydXNlcl9wYXRoK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9zdXBlcnVzZXJfcGF0aDsKKwkJaWYgdGVzdCAtbiAiJHdpdGh2YWwiICAmJiAgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiAgJiYgIFwKKwkJICAgIHRlc3QgIngke3dpdGh2YWx9IiAhPSAieHllcyI7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBTVVBFUlVTRVJfUEFUSCAiJHdpdGh2YWwiCitfQUNFT0YKKworCQkJc3VwZXJ1c2VyX3BhdGg9JHdpdGh2YWwKKwkJZmkKKworCitmaQorCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgSVB2NCBpbiBJUHY2LW1hcHBlZCBhZGRyZXNzZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgd2UgbmVlZCB0byBjb252ZXJ0IElQdjQgaW4gSVB2Ni1tYXBwZWQgYWRkcmVzc2VzLi4uICIgPiY2OyB9CitJUFY0X0lONl9IQUNLX01TRz0ibm8iCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtNGluNiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfNGluNitzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfNGluNjsKKwkJaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisKKyRhc19lY2hvICIjZGVmaW5lIElQVjRfSU5fSVBWNiAxIiA+PmNvbmZkZWZzLmgKKworCQkJSVBWNF9JTjZfSEFDS19NU0c9InllcyIKKwkJZWxzZQorCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCWZpCisKK2Vsc2UKKworCQlpZiB0ZXN0ICJ4JGluZXQ2X2RlZmF1bHRfNGluNiIgPSAieHllcyI7IHRoZW4KKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMgKGRlZmF1bHQpIiA+JjUKKyRhc19lY2hvICJ5ZXMgKGRlZmF1bHQpIiA+JjY7IH0KKwkJCSRhc19lY2hvICIjZGVmaW5lIElQVjRfSU5fSVBWNiAxIiA+PmNvbmZkZWZzLmgKKworCQkJSVBWNF9JTjZfSEFDS19NU0c9InllcyIKKwkJZWxzZQorCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIChkZWZhdWx0KSIgPiY1CiskYXNfZWNobyAibm8gKGRlZmF1bHQpIiA+JjY7IH0KKwkJZmkKKworCitmaQorCisKKyMgV2hldGhlciB0byBlbmFibGUgQlNEIGF1dGggc3VwcG9ydAorQlNEX0FVVEhfTVNHPW5vCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtYnNkLWF1dGggd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2JzZF9hdXRoK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9ic2RfYXV0aDsKKwkJaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgQlNEX0FVVEggMSIgPj5jb25mZGVmcy5oCisKKwkJCUJTRF9BVVRIX01TRz15ZXMKKwkJZmkKKworCitmaQorCisKKyMgV2hlcmUgdG8gcGxhY2Ugc3NoZC5waWQKK3BpZGRpcj0vdmFyL3J1bgorIyBtYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMKK2lmIHRlc3QgISAtZCAkcGlkZGlyIDsgdGhlbgorCXBpZGRpcj1gZXZhbCBlY2hvICR7c3lzY29uZmRpcn1gCisJY2FzZSAkcGlkZGlyIGluCisJCU5PTkUvKikgcGlkZGlyPWBlY2hvICRwaWRkaXIgfCBzZWQgInN+Tk9ORX4kYWNfZGVmYXVsdF9wcmVmaXh+ImAgOzsKKwllc2FjCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtcGlkLWRpciB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfcGlkX2RpcitzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfcGlkX2RpcjsKKwkJaWYgdGVzdCAtbiAiJHdpdGh2YWwiICAmJiAgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiAgJiYgIFwKKwkJICAgIHRlc3QgIngke3dpdGh2YWx9IiAhPSAieHllcyI7IHRoZW4KKwkJCXBpZGRpcj0kd2l0aHZhbAorCQkJaWYgdGVzdCAhIC1kICRwaWRkaXIgOyB0aGVuCisJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICoqIG5vICRwaWRkaXIgZGlyZWN0b3J5IG9uIHRoaXMgc3lzdGVtICoqIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICoqIG5vICRwaWRkaXIgZGlyZWN0b3J5IG9uIHRoaXMgc3lzdGVtICoqIiA+JjI7fQorCQkJZmkKKwkJZmkKKworCitmaQorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBfUEFUSF9TU0hfUElERElSICIkcGlkZGlyIgorX0FDRU9GCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGFzdGxvZyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9sYXN0bG9nK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfbGFzdGxvZzsKKwkJaWYgdGVzdCAieCRlbmFibGV2YWwiID0gInhubyIgOyB0aGVuCisJCQkkYXNfZWNobyAiI2RlZmluZSBESVNBQkxFX0xBU1RMT0cgMSIgPj5jb25mZGVmcy5oCisKKwkJZmkKKworCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdXRtcCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV91dG1wK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfdXRtcDsKKwkJaWYgdGVzdCAieCRlbmFibGV2YWwiID0gInhubyIgOyB0aGVuCisJCQkkYXNfZWNobyAiI2RlZmluZSBESVNBQkxFX1VUTVAgMSIgPj5jb25mZGVmcy5oCisKKwkJZmkKKworCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdXRtcHggd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfdXRtcHgrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV91dG1weDsKKwkJaWYgdGVzdCAieCRlbmFibGV2YWwiID0gInhubyIgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIERJU0FCTEVfVVRNUFggMSIgPj5jb25mZGVmcy5oCisKKwkJZmkKKworCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtd3RtcCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV93dG1wK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfd3RtcDsKKwkJaWYgdGVzdCAieCRlbmFibGV2YWwiID0gInhubyIgOyB0aGVuCisJCQkkYXNfZWNobyAiI2RlZmluZSBESVNBQkxFX1dUTVAgMSIgPj5jb25mZGVmcy5oCisKKwkJZmkKKworCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtd3RtcHggd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfd3RtcHgrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV93dG1weDsKKwkJaWYgdGVzdCAieCRlbmFibGV2YWwiID0gInhubyIgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIERJU0FCTEVfV1RNUFggMSIgPj5jb25mZGVmcy5oCisKKwkJZmkKKworCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlidXRpbCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9saWJ1dGlsK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfbGlidXRpbDsKKwkJaWYgdGVzdCAieCRlbmFibGV2YWwiID0gInhubyIgOyB0aGVuCisJCQkkYXNfZWNobyAiI2RlZmluZSBESVNBQkxFX0xPR0lOIDEiID4+Y29uZmRlZnMuaAorCisJCWZpCisKKworZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXB1dHV0bGluZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9wdXR1dGxpbmUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9wdXR1dGxpbmU7CisJCWlmIHRlc3QgIngkZW5hYmxldmFsIiA9ICJ4bm8iIDsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBESVNBQkxFX1BVVFVUTElORSAxIiA+PmNvbmZkZWZzLmgKKworCQlmaQorCisKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1wdXR1dHhsaW5lIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3B1dHV0eGxpbmUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9wdXR1dHhsaW5lOworCQlpZiB0ZXN0ICJ4JGVuYWJsZXZhbCIgPSAieG5vIiA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9QVVRVVFhMSU5FIDEiID4+Y29uZmRlZnMuaAorCisJCWZpCisKKworZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWxhc3Rsb2cgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2xhc3Rsb2crc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2xhc3Rsb2c7CisJCWlmIHRlc3QgIngkd2l0aHZhbCIgPSAieG5vIiA7IHRoZW4KKwkJCSRhc19lY2hvICIjZGVmaW5lIERJU0FCTEVfTEFTVExPRyAxIiA+PmNvbmZkZWZzLmgKKworCQllbGlmIHRlc3QgLW4gIiR3aXRodmFsIiAgJiYgIHRlc3QgIngke3dpdGh2YWx9IiAhPSAieHllcyI7IHRoZW4KKwkJCWNvbmZfbGFzdGxvZ19sb2NhdGlvbj0kd2l0aHZhbAorCQlmaQorCisKK2ZpCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHlvdXIgc3lzdGVtIGRlZmluZXMgTEFTVExPR19GSUxFIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIHlvdXIgc3lzdGVtIGRlZmluZXMgTEFTVExPR19GSUxFLi4uICIgPiY2OyB9CitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1dG1wLmg+CisjaWZkZWYgSEFWRV9MQVNUTE9HX0gKKyMgIGluY2x1ZGUgPGxhc3Rsb2cuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfUEFUSFNfSAorIyAgaW5jbHVkZSA8cGF0aHMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfTE9HSU5fSAorIyBpbmNsdWRlIDxsb2dpbi5oPgorI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworIGNoYXIgKmxhc3Rsb2cgPSBMQVNUTE9HX0ZJTEU7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CitlbHNlCisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgeW91ciBzeXN0ZW0gZGVmaW5lcyBfUEFUSF9MQVNUTE9HIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIHlvdXIgc3lzdGVtIGRlZmluZXMgX1BBVEhfTEFTVExPRy4uLiAiID4mNjsgfQorCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1dG1wLmg+CisjaWZkZWYgSEFWRV9MQVNUTE9HX0gKKyMgIGluY2x1ZGUgPGxhc3Rsb2cuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfUEFUSFNfSAorIyAgaW5jbHVkZSA8cGF0aHMuaD4KKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKKyBjaGFyICpsYXN0bG9nID0gX1BBVEhfTEFTVExPRzsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK2Vsc2UKKworCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCQlzeXN0ZW1fbGFzdGxvZ19wYXRoPW5vCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCitpZiB0ZXN0IC16ICIkY29uZl9sYXN0bG9nX2xvY2F0aW9uIjsgdGhlbgorCWlmIHRlc3QgeCIkc3lzdGVtX2xhc3Rsb2dfcGF0aCIgPSB4Im5vIiA7IHRoZW4KKwkJZm9yIGYgaW4gL3Zhci9sb2cvbGFzdGxvZyAvdXNyL2FkbS9sYXN0bG9nIC92YXIvYWRtL2xhc3Rsb2cgL2V0Yy9zZWN1cml0eS9sYXN0bG9nIDsgZG8KKwkJCQlpZiAodGVzdCAtZCAiJGYiIHx8IHRlc3QgLWYgIiRmIikgOyB0aGVuCisJCQkJCWNvbmZfbGFzdGxvZ19sb2NhdGlvbj0kZgorCQkJCWZpCisJCWRvbmUKKwkJaWYgdGVzdCAteiAiJGNvbmZfbGFzdGxvZ19sb2NhdGlvbiI7IHRoZW4KKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogKiogQ2Fubm90IGZpbmQgbGFzdGxvZyAqKiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAqKiBDYW5ub3QgZmluZCBsYXN0bG9nICoqIiA+JjI7fQorCQkJCQlmaQorCWZpCitmaQorCitpZiB0ZXN0IC1uICIkY29uZl9sYXN0bG9nX2xvY2F0aW9uIjsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIENPTkZfTEFTVExPR19GSUxFICIkY29uZl9sYXN0bG9nX2xvY2F0aW9uIgorX0FDRU9GCisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgeW91ciBzeXN0ZW0gZGVmaW5lcyBVVE1QX0ZJTEUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgeW91ciBzeXN0ZW0gZGVmaW5lcyBVVE1QX0ZJTEUuLi4gIiA+JjY7IH0KK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHV0bXAuaD4KKyNpZmRlZiBIQVZFX1BBVEhTX0gKKyMgIGluY2x1ZGUgPHBhdGhzLmg+CisjZW5kaWYKKworaW50CittYWluICgpCit7CisgY2hhciAqdXRtcCA9IFVUTVBfRklMRTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK2Vsc2UKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCSAgc3lzdGVtX3V0bXBfcGF0aD1ubworCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitpZiB0ZXN0IC16ICIkY29uZl91dG1wX2xvY2F0aW9uIjsgdGhlbgorCWlmIHRlc3QgeCIkc3lzdGVtX3V0bXBfcGF0aCIgPSB4Im5vIiA7IHRoZW4KKwkJZm9yIGYgaW4gL2V0Yy91dG1wIC91c3IvYWRtL3V0bXAgL3Zhci9ydW4vdXRtcDsgZG8KKwkJCWlmIHRlc3QgLWYgJGYgOyB0aGVuCisJCQkJY29uZl91dG1wX2xvY2F0aW9uPSRmCisJCQlmaQorCQlkb25lCisJCWlmIHRlc3QgLXogIiRjb25mX3V0bXBfbG9jYXRpb24iOyB0aGVuCisJCQkkYXNfZWNobyAiI2RlZmluZSBESVNBQkxFX1VUTVAgMSIgPj5jb25mZGVmcy5oCisKKwkJZmkKKwlmaQorZmkKK2lmIHRlc3QgLW4gIiRjb25mX3V0bXBfbG9jYXRpb24iOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgQ09ORl9VVE1QX0ZJTEUgIiRjb25mX3V0bXBfbG9jYXRpb24iCitfQUNFT0YKKworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB5b3VyIHN5c3RlbSBkZWZpbmVzIFdUTVBfRklMRSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiB5b3VyIHN5c3RlbSBkZWZpbmVzIFdUTVBfRklMRS4uLiAiID4mNjsgfQorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dXRtcC5oPgorI2lmZGVmIEhBVkVfUEFUSFNfSAorIyAgaW5jbHVkZSA8cGF0aHMuaD4KKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKKyBjaGFyICp3dG1wID0gV1RNUF9GSUxFOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZWxzZQorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJICBzeXN0ZW1fd3RtcF9wYXRoPW5vCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2lmIHRlc3QgLXogIiRjb25mX3d0bXBfbG9jYXRpb24iOyB0aGVuCisJaWYgdGVzdCB4IiRzeXN0ZW1fd3RtcF9wYXRoIiA9IHgibm8iIDsgdGhlbgorCQlmb3IgZiBpbiAvdXNyL2FkbS93dG1wIC92YXIvbG9nL3d0bXA7IGRvCisJCQlpZiB0ZXN0IC1mICRmIDsgdGhlbgorCQkJCWNvbmZfd3RtcF9sb2NhdGlvbj0kZgorCQkJZmkKKwkJZG9uZQorCQlpZiB0ZXN0IC16ICIkY29uZl93dG1wX2xvY2F0aW9uIjsgdGhlbgorCQkJJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9XVE1QIDEiID4+Y29uZmRlZnMuaAorCisJCWZpCisJZmkKK2ZpCitpZiB0ZXN0IC1uICIkY29uZl93dG1wX2xvY2F0aW9uIjsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIENPTkZfV1RNUF9GSUxFICIkY29uZl93dG1wX2xvY2F0aW9uIgorX0FDRU9GCisKK2ZpCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB5b3VyIHN5c3RlbSBkZWZpbmVzIFdUTVBYX0ZJTEUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgeW91ciBzeXN0ZW0gZGVmaW5lcyBXVE1QWF9GSUxFLi4uICIgPiY2OyB9CitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1dG1wLmg+CisjaWZkZWYgSEFWRV9VVE1QWF9ICisjaW5jbHVkZSA8dXRtcHguaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfUEFUSFNfSAorIyAgaW5jbHVkZSA8cGF0aHMuaD4KKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKKyBjaGFyICp3dG1weCA9IFdUTVBYX0ZJTEU7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CitlbHNlCisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwkgIHN5c3RlbV93dG1weF9wYXRoPW5vCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2lmIHRlc3QgLXogIiRjb25mX3d0bXB4X2xvY2F0aW9uIjsgdGhlbgorCWlmIHRlc3QgeCIkc3lzdGVtX3d0bXB4X3BhdGgiID0geCJubyIgOyB0aGVuCisJCSRhc19lY2hvICIjZGVmaW5lIERJU0FCTEVfV1RNUFggMSIgPj5jb25mZGVmcy5oCisKKwlmaQorZWxzZQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIENPTkZfV1RNUFhfRklMRSAiJGNvbmZfd3RtcHhfbG9jYXRpb24iCitfQUNFT0YKKworZmkKKworCitpZiB0ZXN0ICEgLXogIiRibGlicGF0aCIgOyB0aGVuCisJTERGTEFHUz0iJExERkxBR1MgJGJsaWJmbGFncyRibGlicGF0aCIKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IFBsZWFzZSBjaGVjayBhbmQgZWRpdCBibGlicGF0aCBpbiBMREZMQUdTIGluIE1ha2VmaWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFBsZWFzZSBjaGVjayBhbmQgZWRpdCBibGlicGF0aCBpbiBMREZMQUdTIGluIE1ha2VmaWxlIiA+JjI7fQorZmkKKworQ0ZMQUdTPSIkQ0ZMQUdTICR3ZXJyb3JfZmxhZ3MiCisKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRhZGRyaW5mbyIgIT0gInh5ZXMiIDsgdGhlbgorCVRFU1RfU1NIX0lQVjY9bm8KK2Vsc2UKKwlURVNUX1NTSF9JUFY2PXllcworZmkKK2FjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIkJST0tFTl9HRVRBRERSSU5GTyIgImFjX2N2X2hhdmVfZGVjbF9CUk9LRU5fR0VUQUREUklORk8iICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX0JST0tFTl9HRVRBRERSSU5GTyIgPSB4eWVzOyB0aGVuIDoKKyAgVEVTVF9TU0hfSVBWNj1ubworZmkKKworVEVTVF9TU0hfSVBWNj0kVEVTVF9TU0hfSVBWNgorCisKKworYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIE1ha2VmaWxlIGJ1aWxkcGtnLnNoIG9wZW5zc2hkLmluaXQgb3BlbnNzaC54bWwgb3BlbmJzZC1jb21wYXQvTWFrZWZpbGUgb3BlbmJzZC1jb21wYXQvcmVncmVzcy9NYWtlZmlsZSBzdXJ2ZXkuc2giCisKK2NhdCA+Y29uZmNhY2hlIDw8XF9BQ0VPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMsIHNlZSBjb25maWd1cmUncyBvcHRpb24gLS1jb25maWctY2FjaGUuCisjIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4gIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0CisjIHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0CisjIHRoZSAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKKyMgYGFjX2N2X2Vudl9mb28nIHZhcmlhYmxlcyAoc2V0IG9yIHVuc2V0KSB3aWxsIGJlIG92ZXJyaWRkZW4gd2hlbgorIyBsb2FkaW5nIHRoaXMgZmlsZSwgb3RoZXIgKnVuc2V0KiBgYWNfY3ZfZm9vJyB3aWxsIGJlIGFzc2lnbmVkIHRoZQorIyBmb2xsb3dpbmcgdmFsdWVzLgorCitfQUNFT0YKKworIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCB3ZSBraWxsIHZhcmlhYmxlcyBjb250YWluaW5nIG5ld2xpbmVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKAorICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ2A7IGRvCisgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICAgY2FzZSAkYWNfdmFsIGluICMoCisgICAgKiR7YXNfbmx9KikKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgKl9jdl8qKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjI7fSA7OworICAgICAgZXNhYworICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisgICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCisgICAgICBCQVNIX0FSR1YgfCBCQVNIX1NPVVJDRSkgZXZhbCAkYWNfdmFyPSA7OyAjKAorICAgICAgKikgeyBldmFsICRhY192YXI9OyB1bnNldCAkYWNfdmFyO30gOzsKKyAgICAgIGVzYWMgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICAoc2V0KSAyPiYxIHwKKyAgICBjYXNlICRhc19ubGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjFgIGluICMoCisgICAgKiR7YXNfbmx9YWNfc3BhY2U9XCAqKQorICAgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXM6IGRvdWJsZS1xdW90ZQorICAgICAgIyBzdWJzdGl0dXRpb24gdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXC4KKyAgICAgIHNlZCAtbiBcCisJInMvJy8nXFxcXCcnL2c7CisJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcXDInL3AiCisgICAgICA7OyAjKAorICAgICopCisgICAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKKyAgICAgIDs7CisgICAgZXNhYyB8CisgICAgc29ydAorKSB8CisgIHNlZCAnCisgICAgIC9eYWNfY3ZfZW52Xy9iIGVuZAorICAgICB0IGNsZWFyCisgICAgIDpjbGVhcgorICAgICBzL15cKFtePV0qXCk9XCguKlt7fV0uKlwpJC90ZXN0ICIke1wxK3NldH0iID0gc2V0IHx8ICYvCisgICAgIHQgZW5kCisgICAgIHMvXlwoW149XSpcKT1cKC4qXCkkL1wxPSR7XDE9XDJ9LworICAgICA6ZW5kJyA+PmNvbmZjYWNoZQoraWYgZGlmZiAiJGNhY2hlX2ZpbGUiIGNvbmZjYWNoZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorICBpZiB0ZXN0IC13ICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgICBpZiB0ZXN0ICJ4JGNhY2hlX2ZpbGUiICE9ICJ4L2Rldi9udWxsIjsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgICAgIGlmIHRlc3QgISAtZiAiJGNhY2hlX2ZpbGUiIHx8IHRlc3QgLWggIiRjYWNoZV9maWxlIjsgdGhlbgorCWNhdCBjb25mY2FjaGUgPiIkY2FjaGVfZmlsZSIKKyAgICAgIGVsc2UKKyAgICAgICAgY2FzZSAkY2FjaGVfZmlsZSBpbiAjKAorICAgICAgICAqLyogfCA/OiopCisJICBtdiAtZiBjb25mY2FjaGUgIiRjYWNoZV9maWxlIiQkICYmCisJICBtdiAtZiAiJGNhY2hlX2ZpbGUiJCQgIiRjYWNoZV9maWxlIiA7OyAjKAorICAgICAgICAqKQorCSAgbXYgLWYgY29uZmNhY2hlICIkY2FjaGVfZmlsZSIgOzsKKwllc2FjCisgICAgICBmaQorICAgIGZpCisgIGVsc2UKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworYWNfbGlib2Jqcz0KK2FjX2x0bGlib2Jqcz0KK1U9Citmb3IgYWNfaSBpbiA6ICRMSUJPQkpTOyBkbyB0ZXN0ICJ4JGFjX2kiID0geDogJiYgY29udGludWUKKyAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgorICBhY19zY3JpcHQ9J3MvXCRVXC4vLi87cy9cLm8kLy87cy9cLm9iaiQvLycKKyAgYWNfaT1gJGFzX2VjaG8gIiRhY19pIiB8IHNlZCAiJGFjX3NjcmlwdCJgCisgICMgMi4gUHJlcGVuZCBMSUJPQkpESVIuICBXaGVuIHVzZWQgd2l0aCBhdXRvbWFrZT49MS4xMCBMSUJPQkpESVIKKyAgIyAgICB3aWxsIGJlIHNldCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIExJQk9CSlMgb2JqZWN0cyBhcmUgYnVpbHQuCisgIGFzX2ZuX2FwcGVuZCBhY19saWJvYmpzICIgXCR7TElCT0JKRElSfSRhY19pXCRVLiRhY19vYmpleHQiCisgIGFzX2ZuX2FwcGVuZCBhY19sdGxpYm9ianMgIiBcJHtMSUJPQkpESVJ9JGFjX2kiJyRVLmxvJworZG9uZQorTElCT0JKUz0kYWNfbGlib2JqcworCitMVExJQk9CSlM9JGFjX2x0bGlib2JqcworCisKKworCis6ICIke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfSIKK2FjX3dyaXRlX2ZhaWw9MAorYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgJENPTkZJR19TVEFUVVMiCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjY7fQorYXNfd3JpdGVfZmFpbD0wCitjYXQgPiRDT05GSUdfU1RBVFVTIDw8X0FTRU9GIHx8IGFzX3dyaXRlX2ZhaWw9MQorIyEgJFNIRUxMCisjIEdlbmVyYXRlZCBieSAkYXNfbWUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyMgY29uZmlndXJlLCBpcyBpbiBjb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworZGVidWc9ZmFsc2UKK2FjX2NzX3JlY2hlY2s9ZmFsc2UKK2FjX2NzX3NpbGVudD1mYWxzZQorCitTSEVMTD1cJHtDT05GSUdfU0hFTEwtJFNIRUxMfQorZXhwb3J0IFNIRUxMCitfQVNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BU0VPRiB8fCBhc193cml0ZV9mYWlsPTEKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNNHNoIEluaXRpYWxpemF0aW9uLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworIyBCZSBtb3JlIEJvdXJuZSBjb21wYXRpYmxlCitEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFByZS00LjIgdmVyc2lvbnMgb2YgWnNoIGRvIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitlbHNlCisgIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbiAjKAorICAqcG9zaXgqKSA6CisgICAgc2V0IC1vIHBvc2l4IDs7ICMoCisgICopIDoKKyAgICAgOzsKK2VzYWMKK2ZpCisKKworYXNfbmw9JworJworZXhwb3J0IGFzX25sCisjIFByaW50aW5nIGEgbG9uZyBzdHJpbmcgY3Jhc2hlcyBTb2xhcmlzIDcgL3Vzci9iaW4vcHJpbnRmLgorYXNfZWNobz0nXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKK2FzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobworYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KKyMgUHJlZmVyIGEga3NoIHNoZWxsIGJ1aWx0aW4gb3ZlciBhbiBleHRlcm5hbCBwcmludGYgcHJvZ3JhbSBvbiBTb2xhcmlzLAorIyBidXQgd2l0aG91dCB3YXN0aW5nIGZvcmtzIGZvciBiYXNoIG9yIHpzaC4KK2lmIHRlc3QgLXogIiRCQVNIX1ZFUlNJT04kWlNIX1ZFUlNJT04iIFwKKyAgICAmJiAodGVzdCAiWGBwcmludCAtciAtLSAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2VjaG89J3ByaW50IC1yIC0tJworICBhc19lY2hvX249J3ByaW50IC1ybiAtLScKK2VsaWYgKHRlc3QgIlhgcHJpbnRmICVzICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfZWNobz0ncHJpbnRmICVzXG4nCisgIGFzX2VjaG9fbj0ncHJpbnRmICVzJworZWxzZQorICBpZiB0ZXN0ICJYYCgvdXNyL3VjYi9lY2hvIC1uIC1uICRhc19lY2hvKSAyPi9kZXYvbnVsbGAiID0gIlgtbiAkYXNfZWNobyI7IHRoZW4KKyAgICBhc19lY2hvX2JvZHk9J2V2YWwgL3Vzci91Y2IvZWNobyAtbiAiJDEkYXNfbmwiJworICAgIGFzX2VjaG9fbj0nL3Vzci91Y2IvZWNobyAtbicKKyAgZWxzZQorICAgIGFzX2VjaG9fYm9keT0nZXZhbCBleHByICJYJDEiIDogIlhcXCguKlxcKSInCisgICAgYXNfZWNob19uX2JvZHk9J2V2YWwKKyAgICAgIGFyZz0kMTsKKyAgICAgIGNhc2UgJGFyZyBpbiAjKAorICAgICAgKiIkYXNfbmwiKikKKwlleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpJGFzX25sIjsKKwlhcmc9YGV4cHIgIlgkYXJnIiA6ICIuKiRhc19ubFxcKC4qXFwpImA7OworICAgICAgZXNhYzsKKyAgICAgIGV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkiIHwgdHIgLWQgIiRhc19ubCIKKyAgICAnCisgICAgZXhwb3J0IGFzX2VjaG9fbl9ib2R5CisgICAgYXNfZWNob19uPSdzaCAtYyAkYXNfZWNob19uX2JvZHkgYXNfZWNobycKKyAgZmkKKyAgZXhwb3J0IGFzX2VjaG9fYm9keQorICBhc19lY2hvPSdzaCAtYyAkYXNfZWNob19ib2R5IGFzX2VjaG8nCitmaQorCisjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisgIFBBVEhfU0VQQVJBVE9SPToKKyAgKFBBVEg9Jy9iaW47L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgJiYgeworICAgIChQQVRIPScvYmluOi9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxIHx8CisgICAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgfQorZmkKKworCisjIElGUworIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKKyMgdGhlcmUgdG8gcHJldmVudCBlZGl0b3JzIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgc3BhY2UtdGFiLgorIyAoSWYgX0FTX1BBVEhfV0FMSyB3ZXJlIGNhbGxlZCB3aXRoIElGUyB1bnNldCwgaXQgd291bGQgZGlzYWJsZSB3b3JkCisjIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCitJRlM9IiAiIgkkYXNfbmwiCisKKyMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCithc19teXNlbGY9CitjYXNlICQwIGluICMoKAorICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7CisgICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhaworICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgICAgOzsKK2VzYWMKKyMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKKyMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgoraWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgorICBhc19teXNlbGY9JDAKK2ZpCitpZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCisgICRhc19lY2hvICIkYXNfbXlzZWxmOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIGZpbGUgbmFtZSIgPiYyCisgIGV4aXQgMQorZmkKKworIyBVbnNldCB2YXJpYWJsZXMgdGhhdCB3ZSBkbyBub3QgbmVlZCBhbmQgd2hpY2ggY2F1c2UgYnVncyAoZS5nLiBpbgorIyBwcmUtMy4wIFVXSU4ga3NoKS4gIEJ1dCBkbyBub3QgY2F1c2UgYnVncyBpbiBiYXNoIDIuMDE7IHRoZSAifHwgZXhpdCAxIgorIyBzdXBwcmVzc2VzIGFueSAiU2VnbWVudGF0aW9uIGZhdWx0IiBtZXNzYWdlIHRoZXJlLiAgJygoJyBjb3VsZAorIyB0cmlnZ2VyIGEgYnVnIGluIHBka3NoIDUuMi4xNC4KK2ZvciBhc192YXIgaW4gQkFTSF9FTlYgRU5WIE1BSUwgTUFJTFBBVEgKK2RvIGV2YWwgdGVzdCB4XCR7JGFzX3ZhcitzZXR9ID0geHNldCBcCisgICYmICggKHVuc2V0ICRhc192YXIpIHx8IGV4aXQgMSkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0ICRhc192YXIgfHwgOgorZG9uZQorUFMxPSckICcKK1BTMj0nPiAnCitQUzQ9JysgJworCisjIE5MUyBudWlzYW5jZXMuCitMQ19BTEw9QworZXhwb3J0IExDX0FMTAorTEFOR1VBR0U9QworZXhwb3J0IExBTkdVQUdFCisKKyMgQ0RQQVRILgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCisKKyMgYXNfZm5fZXJyb3IgU1RBVFVTIEVSUk9SIFtMSU5FTk8gTE9HX0ZEXQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE91dHB1dCAiYGJhc2VuYW1lICQwYDogZXJyb3I6IEVSUk9SIiB0byBzdGRlcnIuIElmIExJTkVOTyBhbmQgTE9HX0ZEIGFyZQorIyBwcm92aWRlZCwgYWxzbyBvdXRwdXQgdGhlIGVycm9yIHRvIExPR19GRCwgcmVmZXJlbmNpbmcgTElORU5PLiBUaGVuIGV4aXQgdGhlCisjIHNjcmlwdCB3aXRoIFNUQVRVUywgdXNpbmcgMSBpZiB0aGF0IHdhcyAwLgorYXNfZm5fZXJyb3IgKCkKK3sKKyAgYXNfc3RhdHVzPSQxOyB0ZXN0ICRhc19zdGF0dXMgLWVxIDAgJiYgYXNfc3RhdHVzPTEKKyAgaWYgdGVzdCAiJDQiOyB0aGVuCisgICAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMyJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiAkMiIgPiYkNAorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogJDIiID4mMgorICBhc19mbl9leGl0ICRhc19zdGF0dXMKK30gIyBhc19mbl9lcnJvcgorCisKKyMgYXNfZm5fc2V0X3N0YXR1cyBTVEFUVVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2V0ICQ/IHRvIFNUQVRVUywgd2l0aG91dCBmb3JraW5nLgorYXNfZm5fc2V0X3N0YXR1cyAoKQoreworICByZXR1cm4gJDEKK30gIyBhc19mbl9zZXRfc3RhdHVzCisKKyMgYXNfZm5fZXhpdCBTVEFUVVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgRXhpdCB0aGUgc2hlbGwgd2l0aCBTVEFUVVMsIGV2ZW4gaW4gYSAidHJhcCAwIiBvciAic2V0IC1lIiBjb250ZXh0LgorYXNfZm5fZXhpdCAoKQoreworICBzZXQgK2UKKyAgYXNfZm5fc2V0X3N0YXR1cyAkMQorICBleGl0ICQxCit9ICMgYXNfZm5fZXhpdAorCisjIGFzX2ZuX3Vuc2V0IFZBUgorIyAtLS0tLS0tLS0tLS0tLS0KKyMgUG9ydGFibHkgdW5zZXQgVkFSLgorYXNfZm5fdW5zZXQgKCkKK3sKKyAgeyBldmFsICQxPTsgdW5zZXQgJDE7fQorfQorYXNfdW5zZXQ9YXNfZm5fdW5zZXQKKyMgYXNfZm5fYXBwZW5kIFZBUiBWQUxVRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFwcGVuZCB0aGUgdGV4dCBpbiBWQUxVRSB0byB0aGUgZW5kIG9mIHRoZSBkZWZpbml0aW9uIGNvbnRhaW5lZCBpbiBWQVIuIFRha2UKKyMgYWR2YW50YWdlIG9mIGFueSBzaGVsbCBvcHRpbWl6YXRpb25zIHRoYXQgYWxsb3cgYW1vcnRpemVkIGxpbmVhciBncm93dGggb3ZlcgorIyByZXBlYXRlZCBhcHBlbmRzLCBpbnN0ZWFkIG9mIHRoZSB0eXBpY2FsIHF1YWRyYXRpYyBncm93dGggcHJlc2VudCBpbiBuYWl2ZQorIyBpbXBsZW1lbnRhdGlvbnMuCitpZiAoZXZhbCAiYXNfdmFyPTE7IGFzX3Zhcis9MjsgdGVzdCB4XCRhc192YXIgPSB4MTIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGV2YWwgJ2FzX2ZuX2FwcGVuZCAoKQorICB7CisgICAgZXZhbCAkMSs9XCQyCisgIH0nCitlbHNlCisgIGFzX2ZuX2FwcGVuZCAoKQorICB7CisgICAgZXZhbCAkMT1cJCQxXCQyCisgIH0KK2ZpICMgYXNfZm5fYXBwZW5kCisKKyMgYXNfZm5fYXJpdGggQVJHLi4uCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBQZXJmb3JtIGFyaXRobWV0aWMgZXZhbHVhdGlvbiBvbiB0aGUgQVJHcywgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gdGhlCisjIGdsb2JhbCAkYXNfdmFsLiBUYWtlIGFkdmFudGFnZSBvZiBzaGVsbHMgdGhhdCBjYW4gYXZvaWQgZm9ya3MuIFRoZSBhcmd1bWVudHMKKyMgbXVzdCBiZSBwb3J0YWJsZSBhY3Jvc3MgJCgoKSkgYW5kIGV4cHIuCitpZiAoZXZhbCAidGVzdCBcJCgoIDEgKyAxICkpID0gMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXJpdGggKCkKKyAgeworICAgIGFzX3ZhbD0kKCggJCogKSkKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXJpdGggKCkKKyAgeworICAgIGFzX3ZhbD1gZXhwciAiJEAiIHx8IHRlc3QgJD8gLWVxIDFgCisgIH0KK2ZpICMgYXNfZm5fYXJpdGgKKworCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgorICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK2lmIChiYXNlbmFtZSAtLSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAtLSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KKyAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKK2Vsc2UKKyAgYXNfYmFzZW5hbWU9ZmFsc2UKK2ZpCisKK2lmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19kaXJuYW1lPWRpcm5hbWUKK2Vsc2UKKyAgYXNfZGlybmFtZT1mYWxzZQorZmkKKworYXNfbWU9YCRhc19iYXNlbmFtZSAtLSAiJDAiIHx8CiskYXNfZXhwciBYLyIkMCIgOiAnLiovXChbXi9dW14vXSpcKS8qJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgvIiQwIiB8CisgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorCisjIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCithc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKK2FzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworYXNfY3JfTGV0dGVycz0kYXNfY3JfbGV0dGVycyRhc19jcl9MRVRURVJTCithc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCithc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKKworRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KK2Nhc2UgYGVjaG8gLW4geGAgaW4gIygoKCgoCistbiopCisgIGNhc2UgYGVjaG8gJ3h5XGMnYCBpbgorICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KKyAgeHkpICBFQ0hPX0M9J1xjJzs7CisgICopICAgZWNobyBgZWNobyBrc2g4OCBidWcgb24gQUlYIDYuMWAgPiAvZGV2L251bGwKKyAgICAgICBFQ0hPX1Q9JwknOzsKKyAgZXNhYzs7CisqKQorICBFQ0hPX049Jy1uJzs7Citlc2FjCisKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCitpZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KKyAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQorZWxzZQorICBybSAtZiBjb25mJCQuZGlyCisgIG1rZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKK2ZpCitpZiAoZWNobyA+Y29uZiQkLmZpbGUpIDI+L2Rldi9udWxsOyB0aGVuCisgIGlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFzX2xuX3M9J2xuIC1zJworICAgICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6CisgICAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KKyAgICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KKyAgICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXAnLgorICAgIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKKyAgICAgIGFzX2xuX3M9J2NwIC1wJworICBlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFzX2xuX3M9bG4KKyAgZWxzZQorICAgIGFzX2xuX3M9J2NwIC1wJworICBmaQorZWxzZQorICBhc19sbl9zPSdjcCAtcCcKK2ZpCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCitybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCisKKworIyBhc19mbl9ta2Rpcl9wCisjIC0tLS0tLS0tLS0tLS0KKyMgQ3JlYXRlICIkYXNfZGlyIiBhcyBhIGRpcmVjdG9yeSwgaW5jbHVkaW5nIHBhcmVudHMgaWYgbmVjZXNzYXJ5LgorYXNfZm5fbWtkaXJfcCAoKQoreworCisgIGNhc2UgJGFzX2RpciBpbiAjKAorICAtKikgYXNfZGlyPS4vJGFzX2Rpcjs7CisgIGVzYWMKKyAgdGVzdCAtZCAiJGFzX2RpciIgfHwgZXZhbCAkYXNfbWtkaXJfcCB8fCB7CisgICAgYXNfZGlycz0KKyAgICB3aGlsZSA6OyBkbworICAgICAgY2FzZSAkYXNfZGlyIGluICMoCisgICAgICAqXCcqKSBhc19xZGlyPWAkYXNfZWNobyAiJGFzX2RpciIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyAjJygKKyAgICAgICopIGFzX3FkaXI9JGFzX2Rpcjs7CisgICAgICBlc2FjCisgICAgICBhc19kaXJzPSInJGFzX3FkaXInICRhc19kaXJzIgorICAgICAgYXNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFzX2RpciIgfHwKKyRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRhc19kaXIiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICAgICAgdGVzdCAtZCAiJGFzX2RpciIgJiYgYnJlYWsKKyAgICBkb25lCisgICAgdGVzdCAteiAiJGFzX2RpcnMiIHx8IGV2YWwgIm1rZGlyICRhc19kaXJzIgorICB9IHx8IHRlc3QgLWQgIiRhc19kaXIiIHx8IGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIgorCisKK30gIyBhc19mbl9ta2Rpcl9wCitpZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX21rZGlyX3A9J21rZGlyIC1wICIkYXNfZGlyIicKK2Vsc2UKKyAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKKyAgYXNfbWtkaXJfcD1mYWxzZQorZmkKKworaWYgdGVzdCAteCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc190ZXN0X3g9J3Rlc3QgLXgnCitlbHNlCisgIGlmIGxzIC1kTCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgIGFzX2xzX0xfb3B0aW9uPUwKKyAgZWxzZQorICAgIGFzX2xzX0xfb3B0aW9uPQorICBmaQorICBhc190ZXN0X3g9JworICAgIGV2YWwgc2ggLWMgJ1wnJworICAgICAgaWYgdGVzdCAtZCAiJDEiOyB0aGVuCisJdGVzdCAtZCAiJDEvLiI7CisgICAgICBlbHNlCisJY2FzZSAkMSBpbiAjKAorCS0qKXNldCAiLi8kMSI7OworCWVzYWM7CisJY2FzZSBgbHMgLWxkJyRhc19sc19MX29wdGlvbicgIiQxIiAyPi9kZXYvbnVsbGAgaW4gIygoCisJPz8/W3N4XSopOjs7KilmYWxzZTs7ZXNhYztmaQorICAgICdcJycgc2gKKyAgJworZmkKK2FzX2V4ZWN1dGFibGVfcD0kYXNfdGVzdF94CisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KK2FzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgorYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworCitleGVjIDY+JjEKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNYWluIGJvZHkgb2YgJENPTkZJR19TVEFUVVMgc2NyaXB0LiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKK19BU0VPRgordGVzdCAkYXNfd3JpdGVfZmFpbCA9IDAgJiYgY2htb2QgK3ggJENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyMgU2F2ZSB0aGUgbG9nIG1lc3NhZ2UsIHRvIGtlZXAgJDAgYW5kIHNvIG9uIG1lYW5pbmdmdWwsIGFuZCB0bworIyByZXBvcnQgYWN0dWFsIGlucHV0IHZhbHVlcyBvZiBDT05GSUdfRklMRVMgZXRjLiBpbnN0ZWFkIG9mIHRoZWlyCisjIHZhbHVlcyBhZnRlciBvcHRpb25zIGhhbmRsaW5nLgorYWNfbG9nPSIKK1RoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgT3BlblNTSCAkYXNfbWUgUG9ydGFibGUsIHdoaWNoIHdhcworZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY4LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCisKKyAgQ09ORklHX0ZJTEVTICAgID0gJENPTkZJR19GSUxFUworICBDT05GSUdfSEVBREVSUyAgPSAkQ09ORklHX0hFQURFUlMKKyAgQ09ORklHX0xJTktTICAgID0gJENPTkZJR19MSU5LUworICBDT05GSUdfQ09NTUFORFMgPSAkQ09ORklHX0NPTU1BTkRTCisgICQgJDAgJEAKKworb24gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCisiCisKK19BQ0VPRgorCitjYXNlICRhY19jb25maWdfZmlsZXMgaW4gKiIKKyIqKSBzZXQgeCAkYWNfY29uZmlnX2ZpbGVzOyBzaGlmdDsgYWNfY29uZmlnX2ZpbGVzPSQqOzsKK2VzYWMKKworY2FzZSAkYWNfY29uZmlnX2hlYWRlcnMgaW4gKiIKKyIqKSBzZXQgeCAkYWNfY29uZmlnX2hlYWRlcnM7IHNoaWZ0OyBhY19jb25maWdfaGVhZGVycz0kKjs7Citlc2FjCisKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisjIEZpbGVzIHRoYXQgY29uZmlnLnN0YXR1cyB3YXMgbWFkZSBmb3IuCitjb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMiCitjb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIgorCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorYWNfY3NfdXNhZ2U9IlwKK1xgJGFzX21lJyBpbnN0YW50aWF0ZXMgZmlsZXMgYW5kIG90aGVyIGNvbmZpZ3VyYXRpb24gYWN0aW9ucworZnJvbSB0ZW1wbGF0ZXMgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uICBVbmxlc3MgdGhlIGZpbGVzCithbmQgYWN0aW9ucyBhcmUgc3BlY2lmaWVkIGFzIFRBR3MsIGFsbCBhcmUgaW5zdGFudGlhdGVkIGJ5IGRlZmF1bHQuCisKK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVEFHXS4uLgorCisgIC1oLCAtLWhlbHAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLVYsIC0tdmVyc2lvbiAgICBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgY29uZmlndXJhdGlvbiBzZXR0aW5ncywgdGhlbiBleGl0CisgICAgICAtLWNvbmZpZyAgICAgcHJpbnQgY29uZmlndXJhdGlvbiwgdGhlbiBleGl0CisgIC1xLCAtLXF1aWV0LCAtLXNpbGVudAorICAgICAgICAgICAgICAgICAgIGRvIG5vdCBwcmludCBwcm9ncmVzcyBtZXNzYWdlcworICAtZCwgLS1kZWJ1ZyAgICAgIGRvbid0IHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMKKyAgICAgIC0tcmVjaGVjayAgICB1cGRhdGUgJGFzX21lIGJ5IHJlY29uZmlndXJpbmcgaW4gdGhlIHNhbWUgY29uZGl0aW9ucworICAgICAgLS1maWxlPUZJTEVbOlRFTVBMQVRFXQorICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgRklMRQorICAgICAgLS1oZWFkZXI9RklMRVs6VEVNUExBVEVdCisgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gaGVhZGVyIEZJTEUKKworQ29uZmlndXJhdGlvbiBmaWxlczoKKyRjb25maWdfZmlsZXMKKworQ29uZmlndXJhdGlvbiBoZWFkZXJzOgorJGNvbmZpZ19oZWFkZXJzCisKK1JlcG9ydCBidWdzIHRvIDxvcGVuc3NoLXVuaXgtZGV2QG1pbmRyb3Qub3JnPi4iCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCithY19jc19jb25maWc9ImAkYXNfZWNobyAiJGFjX2NvbmZpZ3VyZV9hcmdzIiB8IHNlZCAncy9eIC8vOyBzL1tcXCIiXGBcJF0vXFxcXCYvZydgIgorYWNfY3NfdmVyc2lvbj0iXFwKK09wZW5TU0ggY29uZmlnLnN0YXR1cyBQb3J0YWJsZQorY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY4LAorICB3aXRoIG9wdGlvbnMgXFwiXCRhY19jc19jb25maWdcXCIKKworQ29weXJpZ2h0IChDKSAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWcuc3RhdHVzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgorCithY19wd2Q9JyRhY19wd2QnCitzcmNkaXI9JyRzcmNkaXInCitJTlNUQUxMPSckSU5TVEFMTCcKK0FXSz0nJEFXSycKK3Rlc3QgLW4gIlwkQVdLIiB8fCBBV0s9YXdrCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBUaGUgZGVmYXVsdCBsaXN0cyBhcHBseSBpZiB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IGFueSBmaWxlLgorYWNfbmVlZF9kZWZhdWx0cz06Cit3aGlsZSB0ZXN0ICQjICE9IDAKK2RvCisgIGNhc2UgJDEgaW4KKyAgLS0qPT8qKQorICAgIGFjX29wdGlvbj1gZXhwciAiWCQxIiA6ICdYXChbXj1dKlwpPSdgCisgICAgYWNfb3B0YXJnPWBleHByICJYJDEiIDogJ1hbXj1dKj1cKC4qXCknYAorICAgIGFjX3NoaWZ0PToKKyAgICA7OworICAtLSo9KQorICAgIGFjX29wdGlvbj1gZXhwciAiWCQxIiA6ICdYXChbXj1dKlwpPSdgCisgICAgYWNfb3B0YXJnPQorICAgIGFjX3NoaWZ0PToKKyAgICA7OworICAqKQorICAgIGFjX29wdGlvbj0kMQorICAgIGFjX29wdGFyZz0kMgorICAgIGFjX3NoaWZ0PXNoaWZ0CisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGFjX29wdGlvbiBpbgorICAjIEhhbmRsaW5nIG9mIHRoZSBvcHRpb25zLgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBhY19jc19yZWNoZWNrPTogOzsKKyAgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12IHwgLVYgKQorICAgICRhc19lY2hvICIkYWNfY3NfdmVyc2lvbiI7IGV4aXQgOzsKKyAgLS1jb25maWcgfCAtLWNvbmZpIHwgLS1jb25mIHwgLS1jb24gfCAtLWNvIHwgLS1jICkKKyAgICAkYXNfZWNobyAiJGFjX2NzX2NvbmZpZyI7IGV4aXQgOzsKKyAgLS1kZWJ1ZyB8IC0tZGVidSB8IC0tZGViIHwgLS1kZSB8IC0tZCB8IC1kICkKKyAgICBkZWJ1Zz06IDs7CisgIC0tZmlsZSB8IC0tZmlsIHwgLS1maSB8IC0tZiApCisgICAgJGFjX3NoaWZ0CisgICAgY2FzZSAkYWNfb3B0YXJnIGluCisgICAgKlwnKikgYWNfb3B0YXJnPWAkYXNfZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICAnJykgYXNfZm5fZXJyb3IgJD8gIm1pc3NpbmcgZmlsZSBhcmd1bWVudCIgOzsKKyAgICBlc2FjCisgICAgYXNfZm5fYXBwZW5kIENPTkZJR19GSUxFUyAiICckYWNfb3B0YXJnJyIKKyAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKKyAgLS1oZWFkZXIgfCAtLWhlYWRlIHwgLS1oZWFkIHwgLS1oZWEgKQorICAgICRhY19zaGlmdAorICAgIGNhc2UgJGFjX29wdGFyZyBpbgorICAgICpcJyopIGFjX29wdGFyZz1gJGFzX2VjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgZXNhYworICAgIGFzX2ZuX2FwcGVuZCBDT05GSUdfSEVBREVSUyAiICckYWNfb3B0YXJnJyIKKyAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKKyAgLS1oZSB8IC0taCkKKyAgICAjIENvbmZsaWN0IGJldHdlZW4gLS1oZWxwIGFuZCAtLWhlYWRlcgorICAgIGFzX2ZuX2Vycm9yICQ/ICJhbWJpZ3VvdXMgb3B0aW9uOiBcYCQxJworVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iOzsKKyAgLS1oZWxwIHwgLS1oZWwgfCAtaCApCisgICAgJGFzX2VjaG8gIiRhY19jc191c2FnZSI7IGV4aXQgOzsKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwgfCAtLXNpIHwgLS1zKQorICAgIGFjX2NzX3NpbGVudD06IDs7CisKKyAgIyBUaGlzIGlzIGFuIGVycm9yLgorICAtKikgYXNfZm5fZXJyb3IgJD8gInVucmVjb2duaXplZCBvcHRpb246IFxgJDEnCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgOzsKKworICAqKSBhc19mbl9hcHBlbmQgYWNfY29uZmlnX3RhcmdldHMgIiAkMSIKKyAgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZSA7OworCisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9CisKK2lmICRhY19jc19zaWxlbnQ7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorICBhY19jb25maWd1cmVfZXh0cmFfYXJncz0iJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tc2lsZW50IgorZmkKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2lmIFwkYWNfY3NfcmVjaGVjazsgdGhlbgorICBzZXQgWCAnJFNIRUxMJyAnJDAnICRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCisgIHNoaWZ0CisgIFwkYXNfZWNobyAicnVubmluZyBDT05GSUdfU0hFTEw9JFNIRUxMIFwkKiIgPiY2CisgIENPTkZJR19TSEVMTD0nJFNIRUxMJworICBleHBvcnQgQ09ORklHX1NIRUxMCisgIGV4ZWMgIlwkQCIKK2ZpCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorZXhlYyA1Pj5jb25maWcubG9nCit7CisgIGVjaG8KKyAgc2VkICdoO3MvLi8tL2c7cy9eLi4uLyMjIC87cy8uLi4kLyAjIy87cDt4O3A7eCcgPDxfQVNCT1gKKyMjIFJ1bm5pbmcgJGFzX21lLiAjIworX0FTQk9YCisgICRhc19lY2hvICIkYWNfbG9nIgorfSA+JjUKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisKKyMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgorZm9yIGFjX2NvbmZpZ190YXJnZXQgaW4gJGFjX2NvbmZpZ190YXJnZXRzCitkbworICBjYXNlICRhY19jb25maWdfdGFyZ2V0IGluCisgICAgImNvbmZpZy5oIikgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyBjb25maWcuaCIgOzsKKyAgICAiTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgTWFrZWZpbGUiIDs7CisgICAgImJ1aWxkcGtnLnNoIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGJ1aWxkcGtnLnNoIiA7OworICAgICJvcGVuc3NoZC5pbml0IikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIG9wZW5zc2hkLmluaXQiIDs7CisgICAgIm9wZW5zc2gueG1sIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIG9wZW5zc2gueG1sIiA7OworICAgICJvcGVuYnNkLWNvbXBhdC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBvcGVuYnNkLWNvbXBhdC9NYWtlZmlsZSIgOzsKKyAgICAib3BlbmJzZC1jb21wYXQvcmVncmVzcy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBvcGVuYnNkLWNvbXBhdC9yZWdyZXNzL01ha2VmaWxlIiA7OworICAgICJzdXJ2ZXkuc2giKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgc3VydmV5LnNoIiA7OworCisgICopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIGFyZ3VtZW50OiBcYCRhY19jb25maWdfdGFyZ2V0JyIgIiRMSU5FTk8iIDU7OworICBlc2FjCitkb25lCisKKworIyBJZiB0aGUgdXNlciBkaWQgbm90IHVzZSB0aGUgYXJndW1lbnRzIHRvIHNwZWNpZnkgdGhlIGl0ZW1zIHRvIGluc3RhbnRpYXRlLAorIyB0aGVuIHRoZSBlbnZ2YXIgaW50ZXJmYWNlIGlzIHVzZWQuICBTZXQgb25seSB0aG9zZSB0aGF0IGFyZSBub3QuCisjIFdlIHVzZSB0aGUgbG9uZyBmb3JtIGZvciB0aGUgZGVmYXVsdCBhc3NpZ25tZW50IGJlY2F1c2Ugb2YgYW4gZXh0cmVtZWx5CisjIGJpemFycmUgYnVnIG9uIFN1bk9TIDQuMS4zLgoraWYgJGFjX25lZWRfZGVmYXVsdHM7IHRoZW4KKyAgdGVzdCAiJHtDT05GSUdfRklMRVMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0ZJTEVTPSRjb25maWdfZmlsZXMKKyAgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiA9IHNldCB8fCBDT05GSUdfSEVBREVSUz0kY29uZmlnX2hlYWRlcnMKK2ZpCisKKyMgSGF2ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIGNvbnZlbmllbmNlLiAgTWFrZSBpdCBpbiB0aGUgYnVpbGQgdHJlZQorIyBzaW1wbHkgYmVjYXVzZSB0aGVyZSBpcyBubyByZWFzb24gYWdhaW5zdCBoYXZpbmcgaXQgaGVyZSwgYW5kIGluIGFkZGl0aW9uLAorIyBjcmVhdGluZyBhbmQgbW92aW5nIGZpbGVzIGZyb20gL3RtcCBjYW4gc29tZXRpbWVzIGNhdXNlIHByb2JsZW1zLgorIyBIb29rIGZvciBpdHMgcmVtb3ZhbCB1bmxlc3MgZGVidWdnaW5nLgorIyBOb3RlIHRoYXQgdGhlcmUgaXMgYSBzbWFsbCB3aW5kb3cgaW4gd2hpY2ggdGhlIGRpcmVjdG9yeSB3aWxsIG5vdCBiZSBjbGVhbmVkOgorIyBhZnRlciBpdHMgY3JlYXRpb24gYnV0IGJlZm9yZSBpdHMgbmFtZSBoYXMgYmVlbiBhc3NpZ25lZCB0byBgJHRtcCcuCiskZGVidWcgfHwKK3sKKyAgdG1wPSBhY190bXA9CisgIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/CisgIDogIiR7YWNfdG1wOj0kdG1wfSIKKyAgeyB0ZXN0ICEgLWQgIiRhY190bXAiIHx8IHJtIC1mciAiJGFjX3RtcCI7IH0gJiYgZXhpdCAkZXhpdF9zdGF0dXMKKycgMAorICB0cmFwICdhc19mbl9leGl0IDEnIDEgMiAxMyAxNQorfQorIyBDcmVhdGUgYSAoc2VjdXJlKSB0bXAgZGlyZWN0b3J5IGZvciB0bXAgZmlsZXMuCisKK3sKKyAgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAiLi9jb25mWFhYWFhYIikgMj4vZGV2L251bGxgICYmCisgIHRlc3QgLWQgIiR0bXAiCit9ICB8fAoreworICB0bXA9Li9jb25mJCQtJFJBTkRPTQorICAodW1hc2sgMDc3ICYmIG1rZGlyICIkdG1wIikKK30gfHwgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIC4iICIkTElORU5PIiA1CithY190bXA9JHRtcAorCisjIFNldCB1cCB0aGUgc2NyaXB0cyBmb3IgQ09ORklHX0ZJTEVTIHNlY3Rpb24uCisjIE5vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlbSBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0ZJTEVTLgorIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBjb25maWcuaCcuCitpZiB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIjsgdGhlbgorCisKK2FjX2NyPWBlY2hvIFggfCB0ciBYICdcMDE1J2AKKyMgT24gY3lnd2luLCBiYXNoIGNhbiBlYXQgXHIgaW5zaWRlIGBgIGlmIHRoZSB1c2VyIHJlcXVlc3RlZCBpZ25jci4KKyMgQnV0IHdlIGtub3cgb2Ygbm8gb3RoZXIgc2hlbGwgd2hlcmUgYWNfY3Igd291bGQgYmUgZW1wdHkgYXQgdGhpcworIyBwb2ludCwgc28gd2UgY2FuIHVzZSBhIGJhc2hpc20gYXMgYSBmYWxsYmFjay4KK2lmIHRlc3QgIngkYWNfY3IiID0geDsgdGhlbgorICBldmFsIGFjX2NyPVwkXCdcXHJcJworZmkKK2FjX2NzX2F3a19jcj1gJEFXSyAnQkVHSU4geyBwcmludCAiYVxyYiIgfScgPC9kZXYvbnVsbCAyPi9kZXYvbnVsbGAKK2lmIHRlc3QgIiRhY19jc19hd2tfY3IiID0gImEke2FjX2NyfWIiOyB0aGVuCisgIGFjX2NzX2F3a19jcj0nXFxyJworZWxzZQorICBhY19jc19hd2tfY3I9JGFjX2NyCitmaQorCitlY2hvICdCRUdJTiB7JyA+IiRhY190bXAvc3ViczEuYXdrIiAmJgorX0FDRU9GCisKKworeworICBlY2hvICJjYXQgPmNvbmYkJHN1YnMuYXdrIDw8X0FDRU9GIiAmJgorICBlY2hvICIkYWNfc3Vic3RfdmFycyIgfCBzZWQgJ3MvLiovJiEkJiRhY19kZWxpbS8nICYmCisgIGVjaG8gIl9BQ0VPRiIKK30gPmNvbmYkJHN1YnMuc2ggfHwKKyAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorYWNfZGVsaW1fbnVtPWBlY2hvICIkYWNfc3Vic3RfdmFycyIgfCBncmVwIC1jICdeJ2AKK2FjX2RlbGltPSclIV8hIyAnCitmb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgOjsgZG8KKyAgLiAuL2NvbmYkJHN1YnMuc2ggfHwKKyAgICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1CisKKyAgYWNfZGVsaW1fbj1gc2VkIC1uICJzLy4qJGFjX2RlbGltXCQvWC9wIiBjb25mJCRzdWJzLmF3ayB8IGdyZXAgLWMgWGAKKyAgaWYgdGVzdCAkYWNfZGVsaW1fbiA9ICRhY19kZWxpbV9udW07IHRoZW4KKyAgICBicmVhaworICBlbGlmICRhY19sYXN0X3RyeTsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKKyAgZWxzZQorICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCisgIGZpCitkb25lCitybSAtZiBjb25mJCRzdWJzLnNoCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorY2F0ID4+IlwkYWNfdG1wL3N1YnMxLmF3ayIgPDxcXF9BQ0FXSyAmJgorX0FDRU9GCitzZWQgLW4gJworaAorcy9eL1NbIi87IHMvIS4qLyJdPS8KK3AKK2cKK3MvXlteIV0qIS8vCis6cmVwbAordCByZXBsCitzLyciJGFjX2RlbGltIickLy8KK3QgZGVsaW0KKzpubAoraAorcy9cKC5cezE0OFx9XCkuLiovXDEvCit0IG1vcmUxCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC9cXG4iXFwvCitwCituCitiIHJlcGwKKzptb3JlMQorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIlxcLworcAorZworcy8uXHsxNDhcfS8vCit0IG5sCis6ZGVsaW0KK2gKK3MvXCguXHsxNDhcfVwpLi4qL1wxLwordCBtb3JlMgorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi8KK3AKK2IKKzptb3JlMgorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIlxcLworcAorZworcy8uXHsxNDhcfS8vCit0IGRlbGltCisnIDxjb25mJCRzdWJzLmF3ayB8IHNlZCAnCisvXlteIiJdL3sKKyAgTgorICBzL1xuLy8KK30KKycgPj4kQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKK3JtIC1mIGNvbmYkJHN1YnMuYXdrCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK19BQ0FXSworY2F0ID4+IlwkYWNfdG1wL3N1YnMxLmF3ayIgPDxfQUNBV0sgJiYKKyAgZm9yIChrZXkgaW4gUykgU19pc19zZXRba2V5XSA9IDEKKyAgRlMgPSAiByIKKworfQoreworICBsaW5lID0gJCAwCisgIG5maWVsZHMgPSBzcGxpdChsaW5lLCBmaWVsZCwgIkAiKQorICBzdWJzdGVkID0gMAorICBsZW4gPSBsZW5ndGgoZmllbGRbMV0pCisgIGZvciAoaSA9IDI7IGkgPCBuZmllbGRzOyBpKyspIHsKKyAgICBrZXkgPSBmaWVsZFtpXQorICAgIGtleWxlbiA9IGxlbmd0aChrZXkpCisgICAgaWYgKFNfaXNfc2V0W2tleV0pIHsKKyAgICAgIHZhbHVlID0gU1trZXldCisgICAgICBsaW5lID0gc3Vic3RyKGxpbmUsIDEsIGxlbikgIiIgdmFsdWUgIiIgc3Vic3RyKGxpbmUsIGxlbiArIGtleWxlbiArIDMpCisgICAgICBsZW4gKz0gbGVuZ3RoKHZhbHVlKSArIGxlbmd0aChmaWVsZFsrK2ldKQorICAgICAgc3Vic3RlZCA9IDEKKyAgICB9IGVsc2UKKyAgICAgIGxlbiArPSAxICsga2V5bGVuCisgIH0KKworICBwcmludCBsaW5lCit9CisKK19BQ0FXSworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitpZiBzZWQgInMvJGFjX2NyLy8iIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgc2VkICJzLyRhY19jclwkLy87IHMvJGFjX2NyLyRhY19jc19hd2tfY3IvZyIKK2Vsc2UKKyAgY2F0CitmaSA8ICIkYWNfdG1wL3N1YnMxLmF3ayIgPiAiJGFjX3RtcC9zdWJzLmF3ayIgXAorICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IHNldHVwIGNvbmZpZyBmaWxlcyBtYWNoaW5lcnkiICIkTElORU5PIiA1CitfQUNFT0YKKworIyBWUEFUSCBtYXkgY2F1c2UgdHJvdWJsZSB3aXRoIHNvbWUgbWFrZXMsIHNvIHdlIHJlbW92ZSBzb2xlICQoc3JjZGlyKSwKKyMgJHtzcmNkaXJ9IGFuZCBAc3JjZGlyQCBlbnRyaWVzIGZyb20gVlBBVEggaWYgc3JjZGlyIGlzICIuIiwgc3RyaXAgbGVhZGluZyBhbmQKKyMgdHJhaWxpbmcgY29sb25zIGFuZCB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgbGluZSBpZiBWUEFUSCBiZWNvbWVzIGVtcHR5CisjIChhY3R1YWxseSB3ZSBsZWF2ZSBhbiBlbXB0eSBsaW5lIHRvIHByZXNlcnZlIGxpbmUgbnVtYmVycykuCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBhY192cHN1Yj0nL15bCSBdKlZQQVRIWwkgXSo9WwkgXSoveworaAorcy8vLworcy9eLzovCitzL1sJIF0qJC86Lworcy86XCQoc3JjZGlyKTovOi9nCitzLzpcJHtzcmNkaXJ9Oi86L2cKK3MvOkBzcmNkaXJAOi86L2cKK3MvXjoqLy8KK3MvOiokLy8KK3gKK3MvXCg9WwkgXSpcKS4qL1wxLworRworcy9cbi8vCitzL15bXj1dKj1bCSBdKiQvLworfScKK2ZpCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2ZpICMgdGVzdCAtbiAiJENPTkZJR19GSUxFUyIKKworIyBTZXQgdXAgdGhlIHNjcmlwdHMgZm9yIENPTkZJR19IRUFERVJTIHNlY3Rpb24uCisjIE5vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlbSBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0hFQURFUlMuCisjIFRoaXMgaGFwcGVucyBmb3IgaW5zdGFuY2Ugd2l0aCBgLi9jb25maWcuc3RhdHVzIE1ha2VmaWxlJy4KK2lmIHRlc3QgLW4gIiRDT05GSUdfSEVBREVSUyI7IHRoZW4KK2NhdCA+IiRhY190bXAvZGVmaW5lcy5hd2siIDw8XF9BQ0FXSyB8fAorQkVHSU4geworX0FDRU9GCisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhbiBhd2sgc2NyaXB0IGBkZWZpbmVzLmF3aycsIGVtYmVkZGVkIGFzCisjIGhlcmUtZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cywgdGhhdCBzdWJzdGl0dXRlcyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvCisjIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguCisKKyMgQ3JlYXRlIGEgZGVsaW1pdGVyIHN0cmluZyB0aGF0IGRvZXMgbm90IGV4aXN0IGluIGNvbmZkZWZzLmgsIHRvIGVhc2UKKyMgaGFuZGxpbmcgb2YgbG9uZyBsaW5lcy4KK2FjX2RlbGltPSclIV8hIyAnCitmb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgOjsgZG8KKyAgYWNfdHQ9YHNlZCAtbiAiLyRhY19kZWxpbS9wIiBjb25mZGVmcy5oYAorICBpZiB0ZXN0IC16ICIkYWNfdHQiOyB0aGVuCisgICAgYnJlYWsKKyAgZWxpZiAkYWNfbGFzdF90cnk7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19IRUFERVJTIiAiJExJTkVOTyIgNQorICBlbHNlCisgICAgYWNfZGVsaW09IiRhY19kZWxpbSEkYWNfZGVsaW0gXyRhY19kZWxpbSEhICIKKyAgZmkKK2RvbmUKKworIyBGb3IgdGhlIGF3ayBzY3JpcHQsIEQgaXMgYW4gYXJyYXkgb2YgbWFjcm8gdmFsdWVzIGtleWVkIGJ5IG5hbWUsCisjIGxpa2V3aXNlIFAgY29udGFpbnMgbWFjcm8gcGFyYW1ldGVycyBpZiBhbnkuICBQcmVzZXJ2ZSBiYWNrc2xhc2gKKyMgbmV3bGluZSBzZXF1ZW5jZXMuCisKK2FjX3dvcmRfcmU9W18kYXNfY3JfTGV0dGVyc11bXyRhc19jcl9hbG51bV0qCitzZWQgLW4gJworcy8uXHsxNDhcfS8mJyIkYWNfZGVsaW0iJy9nCit0IHJzZXQKKzpyc2V0CitzL15bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKi8gLwordCBkZWYKK2QKKzpkZWYKK3MvXFwkLy8KK3QgYnNubAorcy9bIlxcXS9cXCYvZworcy9eIFwoJyIkYWNfd29yZF9yZSInXClcKChbXigpXSopXClbCSBdKlwoLipcKS9QWyJcMSJdPSJcMiJcCitEWyJcMSJdPSIgXDMiL3AKK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyIi9wCitkCis6YnNubAorcy9bIlxcXS9cXCYvZworcy9eIFwoJyIkYWNfd29yZF9yZSInXClcKChbXigpXSopXClbCSBdKlwoLipcKS9QWyJcMSJdPSJcMiJcCitEWyJcMSJdPSIgXDNcXFxcXFxuIlxcL3AKK3QgY29udAorcy9eIFwoJyIkYWNfd29yZF9yZSInXClbCSBdKlwoLipcKS9EWyJcMSJdPSIgXDJcXFxcXFxuIlxcL3AKK3QgY29udAorZAorOmNvbnQKK24KK3MvLlx7MTQ4XH0vJiciJGFjX2RlbGltIicvZwordCBjbGVhcgorOmNsZWFyCitzL1xcJC8vCit0IGJzbmxjCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iL3AKK2QKKzpic25sYworcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvXFxcXFxcbiJcXC9wCitiIGNvbnQKKycgPGNvbmZkZWZzLmggfCBzZWQgJworcy8nIiRhY19kZWxpbSInLyJcXFwKKyIvZycgPj4kQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisgIGZvciAoa2V5IGluIEQpIERfaXNfc2V0W2tleV0gPSAxCisgIEZTID0gIgciCit9CisvXltcdCBdKiNbXHQgXSooZGVmaW5lfHVuZGVmKVtcdCBdKyRhY193b3JkX3JlKFtcdCAoXXxcJCkvIHsKKyAgbGluZSA9IFwkIDAKKyAgc3BsaXQobGluZSwgYXJnLCAiICIpCisgIGlmIChhcmdbMV0gPT0gIiMiKSB7CisgICAgZGVmdW5kZWYgPSBhcmdbMl0KKyAgICBtYWMxID0gYXJnWzNdCisgIH0gZWxzZSB7CisgICAgZGVmdW5kZWYgPSBzdWJzdHIoYXJnWzFdLCAyKQorICAgIG1hYzEgPSBhcmdbMl0KKyAgfQorICBzcGxpdChtYWMxLCBtYWMyLCAiKCIpICMpCisgIG1hY3JvID0gbWFjMlsxXQorICBwcmVmaXggPSBzdWJzdHIobGluZSwgMSwgaW5kZXgobGluZSwgZGVmdW5kZWYpIC0gMSkKKyAgaWYgKERfaXNfc2V0W21hY3JvXSkgeworICAgICMgUHJlc2VydmUgdGhlIHdoaXRlIHNwYWNlIHN1cnJvdW5kaW5nIHRoZSAiIyIuCisgICAgcHJpbnQgcHJlZml4ICJkZWZpbmUiLCBtYWNybyBQW21hY3JvXSBEW21hY3JvXQorICAgIG5leHQKKyAgfSBlbHNlIHsKKyAgICAjIFJlcGxhY2UgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yIGV4YW1wbGUsCisgICAgIyBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorICAgICMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgorICAgIGlmIChkZWZ1bmRlZiA9PSAidW5kZWYiKSB7CisgICAgICBwcmludCAiLyoiLCBwcmVmaXggZGVmdW5kZWYsIG1hY3JvLCAiKi8iCisgICAgICBuZXh0CisgICAgfQorICB9Cit9Cit7IHByaW50IH0KK19BQ0FXSworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3Qgc2V0dXAgY29uZmlnIGhlYWRlcnMgbWFjaGluZXJ5IiAiJExJTkVOTyIgNQorZmkgIyB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiCisKKworZXZhbCBzZXQgWCAiICA6RiAkQ09ORklHX0ZJTEVTICA6SCAkQ09ORklHX0hFQURFUlMgICAgIgorc2hpZnQKK2ZvciBhY190YWcKK2RvCisgIGNhc2UgJGFjX3RhZyBpbgorICA6W0ZITENdKSBhY19tb2RlPSRhY190YWc7IGNvbnRpbnVlOzsKKyAgZXNhYworICBjYXNlICRhY19tb2RlJGFjX3RhZyBpbgorICA6W0ZITF0qOiopOzsKKyAgOkwqIHwgOkMqOiopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHRhZyBcYCRhY190YWcnIiAiJExJTkVOTyIgNTs7CisgIDpbRkhdLSkgYWNfdGFnPS06LTs7CisgIDpbRkhdKikgYWNfdGFnPSRhY190YWc6JGFjX3RhZy5pbjs7CisgIGVzYWMKKyAgYWNfc2F2ZV9JRlM9JElGUworICBJRlM9OgorICBzZXQgeCAkYWNfdGFnCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgc2hpZnQKKyAgYWNfZmlsZT0kMQorICBzaGlmdAorCisgIGNhc2UgJGFjX21vZGUgaW4KKyAgOkwpIGFjX3NvdXJjZT0kMTs7CisgIDpbRkhdKQorICAgIGFjX2ZpbGVfaW5wdXRzPQorICAgIGZvciBhY19mCisgICAgZG8KKyAgICAgIGNhc2UgJGFjX2YgaW4KKyAgICAgIC0pIGFjX2Y9IiRhY190bXAvc3RkaW4iOzsKKyAgICAgICopICMgTG9vayBmb3IgdGhlIGZpbGUgZmlyc3QgaW4gdGhlIGJ1aWxkIHRyZWUsIHRoZW4gaW4gdGhlIHNvdXJjZSB0cmVlCisJICMgKGlmIHRoZSBwYXRoIGlzIG5vdCBhYnNvbHV0ZSkuICBUaGUgYWJzb2x1dGUgcGF0aCBjYW5ub3QgYmUgRE9TLXN0eWxlLAorCSAjIGJlY2F1c2UgJGFjX2YgY2Fubm90IGNvbnRhaW4gYDonLgorCSB0ZXN0IC1mICIkYWNfZiIgfHwKKwkgICBjYXNlICRhY19mIGluCisJICAgW1xcLyRdKikgZmFsc2U7OworCSAgICopIHRlc3QgLWYgIiRzcmNkaXIvJGFjX2YiICYmIGFjX2Y9IiRzcmNkaXIvJGFjX2YiOzsKKwkgICBlc2FjIHx8CisJICAgYXNfZm5fZXJyb3IgMSAiY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogXGAkYWNfZiciICIkTElORU5PIiA1OzsKKyAgICAgIGVzYWMKKyAgICAgIGNhc2UgJGFjX2YgaW4gKlwnKikgYWNfZj1gJGFzX2VjaG8gIiRhY19mIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7IGVzYWMKKyAgICAgIGFzX2ZuX2FwcGVuZCBhY19maWxlX2lucHV0cyAiICckYWNfZiciCisgICAgZG9uZQorCisgICAgIyBMZXQncyBzdGlsbCBwcmV0ZW5kIGl0IGlzIGBjb25maWd1cmUnIHdoaWNoIGluc3RhbnRpYXRlcyAoaS5lLiwgZG9uJ3QKKyAgICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6CisgICAgIyAgICAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBjb25maWcuc3RhdHVzLiAgKi8KKyAgICBjb25maWd1cmVfaW5wdXQ9J0dlbmVyYXRlZCBmcm9tICdgCisJICAkYXNfZWNobyAiJCoiIHwgc2VkICdzfF5bXjpdKi98fDtzfDpbXjpdKi98LCB8ZycKKwlgJyBieSBjb25maWd1cmUuJworICAgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICAgIGNvbmZpZ3VyZV9pbnB1dD0iJGFjX2ZpbGUuICAkY29uZmlndXJlX2lucHV0IgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZmlsZSIgPiY2O30KKyAgICBmaQorICAgICMgTmV1dHJhbGl6ZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW50ZXJwcmV0ZWQgYnkgc2VkIGluIHJlcGxhY2VtZW50IHN0cmluZ3MuCisgICAgY2FzZSAkY29uZmlndXJlX2lucHV0IGluICMoCisgICAgKlwmKiB8ICpcfCogfCAqXFwqICkKKyAgICAgICBhY19zZWRfY29uZl9pbnB1dD1gJGFzX2VjaG8gIiRjb25maWd1cmVfaW5wdXQiIHwKKyAgICAgICBzZWQgJ3MvW1xcXFwmfF0vXFxcXCYvZydgOzsgIygKKyAgICAqKSBhY19zZWRfY29uZl9pbnB1dD0kY29uZmlndXJlX2lucHV0OzsKKyAgICBlc2FjCisKKyAgICBjYXNlICRhY190YWcgaW4KKyAgICAqOi06KiB8ICo6LSkgY2F0ID4iJGFjX3RtcC9zdGRpbiIgXAorICAgICAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1IDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKworICBhY19kaXI9YCRhc19kaXJuYW1lIC0tICIkYWNfZmlsZSIgfHwKKyRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYWNfZmlsZSIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgIGFzX2Rpcj0iJGFjX2RpciI7IGFzX2ZuX21rZGlyX3AKKyAgYWNfYnVpbGRkaXI9LgorCitjYXNlICIkYWNfZGlyIiBpbgorLikgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisqKQorICBhY19kaXJfc3VmZml4PS9gJGFzX2VjaG8gIiRhY19kaXIiIHwgc2VkICdzfF5cLltcXC9dfHwnYAorICAjIEEgIi4uIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgIGFjX3RvcF9idWlsZGRpcl9zdWI9YCRhc19lY2hvICIkYWNfZGlyX3N1ZmZpeCIgfCBzZWQgJ3N8L1teXFwvXSp8Ly4ufGc7c3wvfHwnYAorICBjYXNlICRhY190b3BfYnVpbGRkaXJfc3ViIGluCisgICIiKSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKyAgKikgIGFjX3RvcF9idWlsZF9wcmVmaXg9JGFjX3RvcF9idWlsZGRpcl9zdWIvIDs7CisgIGVzYWMgOzsKK2VzYWMKK2FjX2Fic190b3BfYnVpbGRkaXI9JGFjX3B3ZAorYWNfYWJzX2J1aWxkZGlyPSRhY19wd2QkYWNfZGlyX3N1ZmZpeAorIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKK2FjX3RvcF9idWlsZGRpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeAorCitjYXNlICRzcmNkaXIgaW4KKyAgLikgICMgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgorICAgIGFjX3NyY2Rpcj0uCisgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyX3N1YgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QgOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSAgIyBBYnNvbHV0ZSBuYW1lLgorICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7CisgICAgYWNfdG9wX3NyY2Rpcj0kc3JjZGlyCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JHNyY2RpciA7OworICAqKSAjIFJlbGF0aXZlIG5hbWUuCisgICAgYWNfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpciRhY19kaXJfc3VmZml4CisgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkLyRzcmNkaXIgOzsKK2VzYWMKK2FjX2Fic19zcmNkaXI9JGFjX2Fic190b3Bfc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKworCisgIGNhc2UgJGFjX21vZGUgaW4KKyAgOkYpCisgICMKKyAgIyBDT05GSUdfRklMRQorICAjCisKKyAgY2FzZSAkSU5TVEFMTCBpbgorICBbXFwvJF0qIHwgPzpbXFwvXSogKSBhY19JTlNUQUxMPSRJTlNUQUxMIDs7CisgICopIGFjX0lOU1RBTEw9JGFjX3RvcF9idWlsZF9wcmVmaXgkSU5TVEFMTCA7OworICBlc2FjCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBJZiB0aGUgdGVtcGxhdGUgZG9lcyBub3Qga25vdyBhYm91dCBkYXRhcm9vdGRpciwgZXhwYW5kIGl0LgorIyBGSVhNRTogVGhpcyBoYWNrIHNob3VsZCBiZSByZW1vdmVkIGEgZmV3IHllYXJzIGFmdGVyIDIuNjAuCithY19kYXRhcm9vdGRpcl9oYWNrPTsgYWNfZGF0YXJvb3RkaXJfc2Vlbj0KK2FjX3NlZF9kYXRhcm9vdD0nCisvZGF0YXJvb3RkaXIvIHsKKyAgcAorICBxCit9CisvQGRhdGFkaXJAL3AKKy9AZG9jZGlyQC9wCisvQGluZm9kaXJAL3AKKy9AbG9jYWxlZGlyQC9wCisvQG1hbmRpckAvcCcKK2Nhc2UgYGV2YWwgInNlZCAtbiBcIlwkYWNfc2VkX2RhdGFyb290XCIgJGFjX2ZpbGVfaW5wdXRzImAgaW4KKypkYXRhcm9vdGRpciopIGFjX2RhdGFyb290ZGlyX3NlZW49eWVzOzsKKypAZGF0YWRpckAqfCpAZG9jZGlyQCp8KkBpbmZvZGlyQCp8KkBsb2NhbGVkaXJAKnwqQG1hbmRpckAqKQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfZmlsZV9pbnB1dHMgc2VlbXMgdG8gaWdub3JlIHRoZSAtLWRhdGFyb290ZGlyIHNldHRpbmciID4mMjt9CitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorICBhY19kYXRhcm9vdGRpcl9oYWNrPScKKyAgcyZAZGF0YWRpckAmJGRhdGFkaXImZworICBzJkBkb2NkaXJAJiRkb2NkaXImZworICBzJkBpbmZvZGlyQCYkaW5mb2RpciZnCisgIHMmQGxvY2FsZWRpckAmJGxvY2FsZWRpciZnCisgIHMmQG1hbmRpckAmJG1hbmRpciZnCisgIHMmXFxcJHtkYXRhcm9vdGRpcn0mJGRhdGFyb290ZGlyJmcnIDs7Citlc2FjCitfQUNFT0YKKworIyBOZXV0cmFsaXplIFZQQVRIIHdoZW4gYCRzcmNkaXInID0gYC4nLgorIyBTaGVsbCBjb2RlIGluIGNvbmZpZ3VyZS5hYyBtaWdodCBzZXQgZXh0cmFzdWIuCisjIEZJWE1FOiBkbyB3ZSByZWFsbHkgd2FudCB0byBtYWludGFpbiB0aGlzIGZlYXR1cmU/CitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2FjX3NlZF9leHRyYT0iJGFjX3Zwc3ViCiskZXh0cmFzdWIKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorOnQKKy9AW2EtekEtWl9dW2EtekEtWl8wLTldKkAvIWIKK3N8QGNvbmZpZ3VyZV9pbnB1dEB8JGFjX3NlZF9jb25mX2lucHV0fDt0IHQKK3MmQHRvcF9idWlsZGRpckAmJGFjX3RvcF9idWlsZGRpcl9zdWImO3QgdAorcyZAdG9wX2J1aWxkX3ByZWZpeEAmJGFjX3RvcF9idWlsZF9wcmVmaXgmO3QgdAorcyZAc3JjZGlyQCYkYWNfc3JjZGlyJjt0IHQKK3MmQGFic19zcmNkaXJAJiRhY19hYnNfc3JjZGlyJjt0IHQKK3MmQHRvcF9zcmNkaXJAJiRhY190b3Bfc3JjZGlyJjt0IHQKK3MmQGFic190b3Bfc3JjZGlyQCYkYWNfYWJzX3RvcF9zcmNkaXImO3QgdAorcyZAYnVpbGRkaXJAJiRhY19idWlsZGRpciY7dCB0CitzJkBhYnNfYnVpbGRkaXJAJiRhY19hYnNfYnVpbGRkaXImO3QgdAorcyZAYWJzX3RvcF9idWlsZGRpckAmJGFjX2Fic190b3BfYnVpbGRkaXImO3QgdAorcyZASU5TVEFMTEAmJGFjX0lOU1RBTEwmO3QgdAorJGFjX2RhdGFyb290ZGlyX2hhY2sKKyIKK2V2YWwgc2VkIFwiXCRhY19zZWRfZXh0cmFcIiAiJGFjX2ZpbGVfaW5wdXRzIiB8ICRBV0sgLWYgIiRhY190bXAvc3Vicy5hd2siIFwKKyAgPiRhY190bXAvb3V0IHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQorCit0ZXN0IC16ICIkYWNfZGF0YXJvb3RkaXJfaGFjayRhY19kYXRhcm9vdGRpcl9zZWVuIiAmJgorICB7IGFjX291dD1gc2VkIC1uICcvXCR7ZGF0YXJvb3RkaXJ9L3AnICIkYWNfdG1wL291dCJgOyB0ZXN0IC1uICIkYWNfb3V0IjsgfSAmJgorICB7IGFjX291dD1gc2VkIC1uICcvXlsJIF0qZGF0YXJvb3RkaXJbCSBdKjoqPS9wJyBcCisgICAgICAiJGFjX3RtcC9vdXQiYDsgdGVzdCAteiAiJGFjX291dCI7IH0gJiYKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkYWNfZmlsZSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgXGBkYXRhcm9vdGRpcicKK3doaWNoIHNlZW1zIHRvIGJlIHVuZGVmaW5lZC4gIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgZGVmaW5lZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfZmlsZSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgXGBkYXRhcm9vdGRpcicKK3doaWNoIHNlZW1zIHRvIGJlIHVuZGVmaW5lZC4gIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgZGVmaW5lZCIgPiYyO30KKworICBybSAtZiAiJGFjX3RtcC9zdGRpbiIKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAtKSBjYXQgIiRhY190bXAvb3V0IiAmJiBybSAtZiAiJGFjX3RtcC9vdXQiOzsKKyAgKikgcm0gLWYgIiRhY19maWxlIiAmJiBtdiAiJGFjX3RtcC9vdXQiICIkYWNfZmlsZSI7OworICBlc2FjIFwKKyAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CisgOzsKKyAgOkgpCisgICMKKyAgIyBDT05GSUdfSEVBREVSCisgICMKKyAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgorICAgIHsKKyAgICAgICRhc19lY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgXAorICAgICAgJiYgZXZhbCAnJEFXSyAtZiAiJGFjX3RtcC9kZWZpbmVzLmF3ayInICIkYWNfZmlsZV9pbnB1dHMiCisgICAgfSA+IiRhY190bXAvY29uZmlnLmgiIFwKKyAgICAgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQorICAgIGlmIGRpZmYgIiRhY19maWxlIiAiJGFjX3RtcC9jb25maWcuaCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNjt9CisgICAgZWxzZQorICAgICAgcm0gLWYgIiRhY19maWxlIgorICAgICAgbXYgIiRhY190bXAvY29uZmlnLmgiICIkYWNfZmlsZSIgXAorCXx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGVsc2UKKyAgICAkYXNfZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iIFwKKyAgICAgICYmIGV2YWwgJyRBV0sgLWYgIiRhY190bXAvZGVmaW5lcy5hd2siJyAiJGFjX2ZpbGVfaW5wdXRzIiBcCisgICAgICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAtIiAiJExJTkVOTyIgNQorICBmaQorIDs7CisKKworICBlc2FjCisKK2RvbmUgIyBmb3IgYWNfdGFnCisKKworYXNfZm5fZXhpdCAwCitfQUNFT0YKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCisKK3Rlc3QgJGFjX3dyaXRlX2ZhaWwgPSAwIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJ3cml0ZSBmYWlsdXJlIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorCisKKyMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYW5kIHRoZW4gY2FsbHMgY29uZmlnLnN0YXR1cy4KKyMgY29uZmlnLnN0YXR1cyBkb2VzIGl0cyBvd24gcmVkaXJlY3Rpb24sIGFwcGVuZGluZyB0byBjb25maWcubG9nLgorIyBVbmZvcnR1bmF0ZWx5LCBvbiBET1MgdGhpcyBmYWlscywgYXMgY29uZmlnLmxvZyBpcyBzdGlsbCBrZXB0IG9wZW4KKyMgYnkgY29uZmlndXJlLCBzbyBjb25maWcuc3RhdHVzIHdvbid0IGJlIGFibGUgdG8gd3JpdGUgdG8gaXQ7IGl0cworIyBvdXRwdXQgaXMgc2ltcGx5IGRpc2NhcmRlZC4gIFNvIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwKKyMgZWZmZWN0aXZlbHkgY2xvc2luZyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQKKyMgYXBwZW5kZWQgdG8gYnkgY29uZmlnLnN0YXR1cy4gIFdoZW4gY29taW5nIGJhY2sgdG8gY29uZmlndXJlLCB3ZQorIyBuZWVkIHRvIG1ha2UgdGhlIEZEIGF2YWlsYWJsZSBhZ2Fpbi4KK2lmIHRlc3QgIiRub19jcmVhdGUiICE9IHllczsgdGhlbgorICBhY19jc19zdWNjZXNzPToKKyAgYWNfY29uZmlnX3N0YXR1c19hcmdzPQorICB0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgorICAgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0iJGFjX2NvbmZpZ19zdGF0dXNfYXJncyAtLXF1aWV0IgorICBleGVjIDU+L2Rldi9udWxsCisgICRTSEVMTCAkQ09ORklHX1NUQVRVUyAkYWNfY29uZmlnX3N0YXR1c19hcmdzIHx8IGFjX2NzX3N1Y2Nlc3M9ZmFsc2UKKyAgZXhlYyA1Pj5jb25maWcubG9nCisgICMgVXNlIHx8LCBub3QgJiYsIHRvIGF2b2lkIGV4aXRpbmcgZnJvbSB0aGUgaWYgd2l0aCAkPyA9IDEsIHdoaWNoCisgICMgd291bGQgbWFrZSBjb25maWd1cmUgZmFpbCBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc3RydWN0aW9uLgorICAkYWNfY3Nfc3VjY2VzcyB8fCBhc19mbl9leGl0IDEKK2ZpCitpZiB0ZXN0IC1uICIkYWNfdW5yZWNvZ25pemVkX29wdHMiICYmIHRlc3QgIiRlbmFibGVfb3B0aW9uX2NoZWNraW5nIiAhPSBubzsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyO30KK2ZpCisKKworIyBQcmludCBzdW1tYXJ5IG9mIG9wdGlvbnMKKworIyBTb21lb25lIHBsZWFzZSBzaG93IG1lIGEgYmV0dGVyIHdheSA6KQorQT1gZXZhbCBlY2hvICR7cHJlZml4fWAgOyBBPWBldmFsIGVjaG8gJHtBfWAKK0I9YGV2YWwgZWNobyAke2JpbmRpcn1gIDsgQj1gZXZhbCBlY2hvICR7Qn1gCitDPWBldmFsIGVjaG8gJHtzYmluZGlyfWAgOyBDPWBldmFsIGVjaG8gJHtDfWAKK0Q9YGV2YWwgZWNobyAke3N5c2NvbmZkaXJ9YCA7IEQ9YGV2YWwgZWNobyAke0R9YAorRT1gZXZhbCBlY2hvICR7bGliZXhlY2Rpcn0vc3NoLWFza3Bhc3NgIDsgRT1gZXZhbCBlY2hvICR7RX1gCitGPWBldmFsIGVjaG8gJHttYW5kaXJ9LyR7bWFuc3ViZGlyfVhgIDsgRj1gZXZhbCBlY2hvICR7Rn1gCitHPWBldmFsIGVjaG8gJHtwaWRkaXJ9YCA7IEc9YGV2YWwgZWNobyAke0d9YAorSD1gZXZhbCBlY2hvICR7UFJJVlNFUF9QQVRIfWAgOyBIPWBldmFsIGVjaG8gJHtIfWAKK0k9YGV2YWwgZWNobyAke3VzZXJfcGF0aH1gIDsgST1gZXZhbCBlY2hvICR7SX1gCitKPWBldmFsIGVjaG8gJHtzdXBlcnVzZXJfcGF0aH1gIDsgSj1gZXZhbCBlY2hvICR7Sn1gCisKK2VjaG8gIiIKK2VjaG8gIk9wZW5TU0ggaGFzIGJlZW4gY29uZmlndXJlZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoiCitlY2hvICIgICAgICAgICAgICAgICAgICAgICBVc2VyIGJpbmFyaWVzOiAkQiIKK2VjaG8gIiAgICAgICAgICAgICAgICAgICBTeXN0ZW0gYmluYXJpZXM6ICRDIgorZWNobyAiICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBmaWxlczogJEQiCitlY2hvICIgICAgICAgICAgICAgICAgICAgQXNrcGFzcyBwcm9ncmFtOiAkRSIKK2VjaG8gIiAgICAgICAgICAgICAgICAgICAgICBNYW51YWwgcGFnZXM6ICRGIgorZWNobyAiICAgICAgICAgICAgICAgICAgICAgICAgICBQSUQgZmlsZTogJEciCitlY2hvICIgIFByaXZpbGVnZSBzZXBhcmF0aW9uIGNocm9vdCBwYXRoOiAkSCIKK2lmIHRlc3QgIngkZXh0ZXJuYWxfcGF0aF9maWxlIiA9ICJ4L2V0Yy9sb2dpbi5jb25mIiA7IHRoZW4KK2VjaG8gIiAgIEF0IHJ1bnRpbWUsIHNzaGQgd2lsbCB1c2UgdGhlIHBhdGggZGVmaW5lZCBpbiAkZXh0ZXJuYWxfcGF0aF9maWxlIgorZWNobyAiICAgTWFrZSBzdXJlIHRoZSBwYXRoIHRvIHNjcCBpcyBwcmVzZW50LCBvdGhlcndpc2Ugc2NwIHdpbGwgbm90IHdvcmsiCitlbHNlCitlY2hvICIgICAgICAgICAgICBzc2hkIGRlZmF1bHQgdXNlciBQQVRIOiAkSSIKKwlpZiB0ZXN0ICEgLXogIiRleHRlcm5hbF9wYXRoX2ZpbGUiOyB0aGVuCitlY2hvICIgICAoSWYgUEFUSCBpcyBzZXQgaW4gJGV4dGVybmFsX3BhdGhfZmlsZSBpdCB3aWxsIGJlIHVzZWQgaW5zdGVhZC4gSWYiCitlY2hvICIgICB1c2VkLCBlbnN1cmUgdGhlIHBhdGggdG8gc2NwIGlzIHByZXNlbnQsIG90aGVyd2lzZSBzY3Agd2lsbCBub3Qgd29yay4pIgorCWZpCitmaQoraWYgdGVzdCAhIC16ICIkc3VwZXJ1c2VyX3BhdGgiIDsgdGhlbgorZWNobyAiICAgICAgICAgIHNzaGQgc3VwZXJ1c2VyIHVzZXIgUEFUSDogJEoiCitmaQorZWNobyAiICAgICAgICAgICAgICAgICAgICBNYW5wYWdlIGZvcm1hdDogJE1BTlRZUEUiCitlY2hvICIgICAgICAgICAgICAgICAgICAgICAgIFBBTSBzdXBwb3J0OiAkUEFNX01TRyIKK2VjaG8gIiAgICAgICAgICAgICAgICAgICBPU0YgU0lBIHN1cHBvcnQ6ICRTSUFfTVNHIgorZWNobyAiICAgICAgICAgICAgICAgICBLZXJiZXJvc1Ygc3VwcG9ydDogJEtSQjVfTVNHIgorZWNobyAiICAgICAgICAgICAgICAgICAgIFNFTGludXggc3VwcG9ydDogJFNFTElOVVhfTVNHIgorZWNobyAiICAgICAgICAgICAgICAgICBTbWFydGNhcmQgc3VwcG9ydDogJFNDQVJEX01TRyIKK2VjaG8gIiAgICAgICAgICAgICAgICAgICAgIFMvS0VZIHN1cHBvcnQ6ICRTS0VZX01TRyIKK2VjaG8gIiAgICAgICAgICAgICAgVENQIFdyYXBwZXJzIHN1cHBvcnQ6ICRUQ1BXX01TRyIKK2VjaG8gIiAgICAgICAgICAgICAgTUQ1IHBhc3N3b3JkIHN1cHBvcnQ6ICRNRDVfTVNHIgorZWNobyAiICAgICAgICAgICAgICAgICAgIGxpYmVkaXQgc3VwcG9ydDogJExJQkVESVRfTVNHIgorZWNobyAiICBTb2xhcmlzIHByb2Nlc3MgY29udHJhY3Qgc3VwcG9ydDogJFNQQ19NU0ciCitlY2hvICIgICAgICAgICAgIFNvbGFyaXMgcHJvamVjdCBzdXBwb3J0OiAkU1BfTVNHIgorZWNobyAiICAgICAgIElQIGFkZHJlc3MgaW4gXCRESVNQTEFZIGhhY2s6ICRESVNQTEFZX0hBQ0tfTVNHIgorZWNobyAiICAgICAgICAgICBUcmFuc2xhdGUgdjQgaW4gdjYgaGFjazogJElQVjRfSU42X0hBQ0tfTVNHIgorZWNobyAiICAgICAgICAgICAgICAgICAgQlNEIEF1dGggc3VwcG9ydDogJEJTRF9BVVRIX01TRyIKK2VjaG8gIiAgICAgICAgICAgICAgUmFuZG9tIG51bWJlciBzb3VyY2U6ICRSQU5EX01TRyIKK2VjaG8gIiAgICAgICAgICAgICBQcml2c2VwIHNhbmRib3ggc3R5bGU6ICRTQU5EQk9YX1NUWUxFIgorCitlY2hvICIiCisKK2VjaG8gIiAgICAgICAgICAgICAgSG9zdDogJHtob3N0fSIKK2VjaG8gIiAgICAgICAgICBDb21waWxlcjogJHtDQ30iCitlY2hvICIgICAgQ29tcGlsZXIgZmxhZ3M6ICR7Q0ZMQUdTfSIKK2VjaG8gIlByZXByb2Nlc3NvciBmbGFnczogJHtDUFBGTEFHU30iCitlY2hvICIgICAgICBMaW5rZXIgZmxhZ3M6ICR7TERGTEFHU30iCitlY2hvICIgICAgICAgICBMaWJyYXJpZXM6ICR7TElCU30iCitpZiB0ZXN0ICEgLXogIiR7U1NIRExJQlN9IjsgdGhlbgorZWNobyAiICAgICAgICAgK2ZvciBzc2hkOiAke1NTSERMSUJTfSIKK2ZpCitpZiB0ZXN0ICEgLXogIiR7U1NITElCU30iOyB0aGVuCitlY2hvICIgICAgICAgICAgK2ZvciBzc2g6ICR7U1NITElCU30iCitmaQorCitlY2hvICIiCisKK2lmIHRlc3QgIngkTUFLRV9QQUNLQUdFX1NVUFBPUlRFRCIgPSAieHllcyIgOyB0aGVuCisJZWNobyAiU1ZSNCBzdHlsZSBwYWNrYWdlcyBhcmUgc3VwcG9ydGVkIHdpdGggXCJtYWtlIHBhY2thZ2VcIiIKKwllY2hvICIiCitmaQorCitpZiB0ZXN0ICJ4JFBBTV9NU0ciID0gInh5ZXMiIDsgdGhlbgorCWVjaG8gIlBBTSBpcyBlbmFibGVkLiBZb3UgbWF5IG5lZWQgdG8gaW5zdGFsbCBhIFBBTSBjb250cm9sIGZpbGUgIgorCWVjaG8gImZvciBzc2hkLCBvdGhlcndpc2UgcGFzc3dvcmQgYXV0aGVudGljYXRpb24gbWF5IGZhaWwuICIKKwllY2hvICJFeGFtcGxlIFBBTSBjb250cm9sIGZpbGVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgY29udHJpYi8gIgorCWVjaG8gInN1YmRpcmVjdG9yeSIKKwllY2hvICIiCitmaQorCitpZiB0ZXN0ICEgLXogIiROT19QRUVSQ0hFQ0siIDsgdGhlbgorCWVjaG8gIldBUk5JTkc6IHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRoYXQgeW91IGFyZSB1c2luZyBkb2VzIG5vdCIKKwllY2hvICJhcHBlYXIgdG8gc3VwcG9ydCBnZXRwZWVyZWlkKCksIGdldHBlZXJ1Y3JlZCgpIG9yIHRoZSIKKwllY2hvICJTT19QRUVSQ1JFRCBnZXRzb2Nrb3B0KCkgb3B0aW9uLiBUaGVzZSBmYWNpbGl0aWVzIGFyZSB1c2VkIHRvIgorCWVjaG8gImVuZm9yY2Ugc2VjdXJpdHkgY2hlY2tzIHRvIHByZXZlbnQgdW5hdXRob3Jpc2VkIGNvbm5lY3Rpb25zIHRvIgorCWVjaG8gInNzaC1hZ2VudC4gVGhlaXIgYWJzZW5jZSBpbmNyZWFzZXMgdGhlIHJpc2sgdGhhdCBhIG1hbGljaW91cyIKKwllY2hvICJ1c2VyIGNhbiBjb25uZWN0IHRvIHlvdXIgYWdlbnQuIgorCWVjaG8gIiIKK2ZpCisKK2lmIHRlc3QgIiRBVURJVF9NT0RVTEUiID0gImJzbSIgOyB0aGVuCisJZWNobyAiV0FSTklORzogQlNNIGF1ZGl0IHN1cHBvcnQgaXMgY3VycmVudGx5IGNvbnNpZGVyZWQgRVhQRVJJTUVOVEFMLiIKKwllY2hvICJTZWUgdGhlIFNvbGFyaXMgc2VjdGlvbiBpbiBSRUFETUUucGxhdGZvcm0gZm9yIGRldGFpbHMuIgorZmkKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvY29uZmlndXJlLmFjIGIvb3BlbnNzaC02LjBwMS9jb25maWd1cmUuYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1N2I4YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY29uZmlndXJlLmFjCkBAIC0wLDAgKzEsNDM5NyBAQAorIyAkSWQ6IGNvbmZpZ3VyZS5hYyx2IDEuNDg5IDIwMTIvMDQvMTkgMTE6NDY6MzggZGptIEV4cCAkCisjCisjIENvcHlyaWdodCAoYykgMTk5OS0yMDA0IERhbWllbiBNaWxsZXIKKyMKKyMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisjIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisjIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyMgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworIyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyMgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyMgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworQUNfSU5JVChbT3BlblNTSF0sIFtQb3J0YWJsZV0sIFtvcGVuc3NoLXVuaXgtZGV2QG1pbmRyb3Qub3JnXSkKK0FDX1JFVklTSU9OKCRSZXZpc2lvbjogMS40ODkgJCkKK0FDX0NPTkZJR19TUkNESVIoW3NzaC5jXSkKK0FDX0xBTkcoW0NdKQorCitBQ19DT05GSUdfSEVBREVSKFtjb25maWcuaF0pCitBQ19QUk9HX0NDCitBQ19DQU5PTklDQUxfSE9TVAorQUNfQ19CSUdFTkRJQU4KKworIyBDaGVja3MgZm9yIHByb2dyYW1zLgorQUNfUFJPR19BV0sKK0FDX1BST0dfQ1BQCitBQ19QUk9HX1JBTkxJQgorQUNfUFJPR19JTlNUQUxMCitBQ19QUk9HX0VHUkVQCitBQ19QQVRIX1BST0coW0FSXSwgW2FyXSkKK0FDX1BBVEhfUFJPRyhbQ0FUXSwgW2NhdF0pCitBQ19QQVRIX1BST0coW0tJTExdLCBba2lsbF0pCitBQ19QQVRIX1BST0dTKFtQRVJMXSwgW3Blcmw1IHBlcmxdKQorQUNfUEFUSF9QUk9HKFtTRURdLCBbc2VkXSkKK0FDX1NVQlNUKFtQRVJMXSkKK0FDX1BBVEhfUFJPRyhbRU5UXSwgW2VudF0pCitBQ19TVUJTVChbRU5UXSkKK0FDX1BBVEhfUFJPRyhbVEVTVF9NSU5VU19TX1NIXSwgW2Jhc2hdKQorQUNfUEFUSF9QUk9HKFtURVNUX01JTlVTX1NfU0hdLCBba3NoXSkKK0FDX1BBVEhfUFJPRyhbVEVTVF9NSU5VU19TX1NIXSwgW3NoXSkKK0FDX1BBVEhfUFJPRyhbU0hdLCBbc2hdKQorQUNfUEFUSF9QUk9HKFtHUk9GRl0sIFtncm9mZl0pCitBQ19QQVRIX1BST0coW05ST0ZGXSwgW25yb2ZmXSkKK0FDX1BBVEhfUFJPRyhbTUFORE9DXSwgW21hbmRvY10pCitBQ19TVUJTVChbVEVTVF9TSEVMTF0sIFtzaF0pCisKK2RubCBzZWxlY3QgbWFucGFnZSBmb3JtYXR0ZXIKK2lmIHRlc3QgIngkTUFORE9DIiAhPSAieCIgOyB0aGVuCisJTUFORk1UPSIkTUFORE9DIgorZWxpZiB0ZXN0ICJ4JE5ST0ZGIiAhPSAieCIgOyB0aGVuCisJTUFORk1UPSIkTlJPRkYgLW1hbmRvYyIKK2VsaWYgdGVzdCAieCRHUk9GRiIgIT0gIngiIDsgdGhlbgorCU1BTkZNVD0iJEdST0ZGIC1tYW5kb2MgLVRhc2NpaSIKK2Vsc2UKKwlBQ19NU0dfV0FSTihbbm8gbWFucGFnZSBmb3JtYXR0ZWQgZm91bmRdKQorCU1BTkZNVD0iZmFsc2UiCitmaQorQUNfU1VCU1QoW01BTkZNVF0pCisKK2RubCBmb3IgYnVpbGRwa2cuc2gKK0FDX1BBVEhfUFJPRyhbUEFUSF9HUk9VUEFERF9QUk9HXSwgW2dyb3VwYWRkXSwgW2dyb3VwYWRkXSwKKwlbL3Vzci9zYmluJHtQQVRIX1NFUEFSQVRPUn0vZXRjXSkKK0FDX1BBVEhfUFJPRyhbUEFUSF9VU0VSQUREX1BST0ddLCBbdXNlcmFkZF0sIFt1c2VyYWRkXSwKKwlbL3Vzci9zYmluJHtQQVRIX1NFUEFSQVRPUn0vZXRjXSkKK0FDX0NIRUNLX1BST0coW01BS0VfUEFDS0FHRV9TVVBQT1JURURdLCBbcGtnbWtdLCBbeWVzXSwgW25vXSkKK2lmIHRlc3QgLXggL3NiaW4vc2g7IHRoZW4KKwlBQ19TVUJTVChbU1RBUlRVUF9TQ1JJUFRfU0hFTExdLCBbL3NiaW4vc2hdKQorZWxzZQorCUFDX1NVQlNUKFtTVEFSVFVQX1NDUklQVF9TSEVMTF0sIFsvYmluL3NoXSkKK2ZpCisKKyMgU3lzdGVtIGZlYXR1cmVzCitBQ19TWVNfTEFSR0VGSUxFCisKK2lmIHRlc3QgLXogIiRBUiIgOyB0aGVuCisJQUNfTVNHX0VSUk9SKFsqKiogJ2FyJyBtaXNzaW5nLCBwbGVhc2UgaW5zdGFsbCBvciBmaXggeW91ciBcJFBBVEggKioqXSkKK2ZpCisKKyMgVXNlIExPR0lOX1BST0dSQU0gZnJvbSBlbnZpcm9ubWVudCBpZiBwb3NzaWJsZQoraWYgdGVzdCAhIC16ICIkTE9HSU5fUFJPR1JBTSIgOyB0aGVuCisJQUNfREVGSU5FX1VOUVVPVEVEKFtMT0dJTl9QUk9HUkFNX0ZBTExCQUNLXSwgWyIkTE9HSU5fUFJPR1JBTSJdLAorCQlbSWYgeW91ciBoZWFkZXIgZmlsZXMgZG9uJ3QgZGVmaW5lIExPR0lOX1BST0dSQU0sCisJCXRoZW4gdXNlIHRoaXMgKGRldGVjdGVkKSBmcm9tIGVudmlyb25tZW50IGFuZCBQQVRIXSkKK2Vsc2UKKwkjIFNlYXJjaCBmb3IgbG9naW4KKwlBQ19QQVRIX1BST0coW0xPR0lOX1BST0dSQU1fRkFMTEJBQ0tdLCBbbG9naW5dKQorCWlmIHRlc3QgISAteiAiJExPR0lOX1BST0dSQU1fRkFMTEJBQ0siIDsgdGhlbgorCQlBQ19ERUZJTkVfVU5RVU9URUQoW0xPR0lOX1BST0dSQU1fRkFMTEJBQ0tdLCBbIiRMT0dJTl9QUk9HUkFNX0ZBTExCQUNLIl0pCisJZmkKK2ZpCisKK0FDX1BBVEhfUFJPRyhbUEFUSF9QQVNTV0RfUFJPR10sIFtwYXNzd2RdKQoraWYgdGVzdCAhIC16ICIkUEFUSF9QQVNTV0RfUFJPRyIgOyB0aGVuCisJQUNfREVGSU5FX1VOUVVPVEVEKFtfUEFUSF9QQVNTV0RfUFJPR10sIFsiJFBBVEhfUEFTU1dEX1BST0ciXSwKKwkJW0Z1bGwgcGF0aCBvZiB5b3VyICJwYXNzd2QiIHByb2dyYW1dKQorZmkKKworaWYgdGVzdCAteiAiJExEIiA7IHRoZW4KKwlMRD0kQ0MKK2ZpCitBQ19TVUJTVChbTERdKQorCitBQ19DX0lOTElORQorCitBQ19DSEVDS19ERUNMKFtMTE9OR19NQVhdLCBbaGF2ZV9sbG9uZ19tYXg9MV0sICwgWyNpbmNsdWRlIDxsaW1pdHMuaD5dKQorQUNfQ0hFQ0tfREVDTChbU1lTVFJfUE9MSUNZX0tJTExdLCBbaGF2ZV9zeXN0cl9wb2xpY3lfa2lsbD0xXSwgLCBbCisJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKwkjaW5jbHVkZSA8ZGV2L3N5c3RyYWNlLmg+CitdKQorQUNfQ0hFQ0tfREVDTChbUkxJTUlUX05QUk9DXSwKKyAgICBbQUNfREVGSU5FKFtIQVZFX1JMSU1JVF9OUFJPQ10sIFtdLCBbc3lzL3Jlc291cmNlLmggaGFzIFJMSU1JVF9OUFJPQ10pXSwgLCBbCisJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KK10pCitBQ19DSEVDS19ERUNMKFtQUl9TRVRfTk9fTkVXX1BSSVZTXSwgW2hhdmVfbGludXhfbm9fbmV3X3ByaXZzPTFdLCAsIFsKKwkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJI2luY2x1ZGUgPGxpbnV4L3ByY3RsLmg+CitdKQoraWYgdGVzdCAieCRoYXZlX2xpbnV4X25vX25ld19wcml2cyIgPSAieDEiIDsgdGhlbgorQUNfQ0hFQ0tfREVDTChbU0VDQ09NUF9NT0RFX0ZJTFRFUl0sIFtoYXZlX3NlY2NvbXBfZmlsdGVyPTFdLCAsIFsKKwkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJI2luY2x1ZGUgPGxpbnV4L3NlY2NvbXAuaD4KK10pCitmaQoraWYgdGVzdCAieCRoYXZlX3NlY2NvbXBfZmlsdGVyIiA9ICJ4MSIgOyB0aGVuCitBQ19NU0dfQ0hFQ0tJTkcoW2tlcm5lbCBmb3Igc2VjY29tcF9maWx0ZXIgc3VwcG9ydF0pCitBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKwkJI2luY2x1ZGUgPGVycm5vLmg+CisJCSNpbmNsdWRlIDxsaW51eC9zZWNjb21wLmg+CisJCSNpbmNsdWRlIDxzdGRsaWIuaD4KKwkJI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorCV1dLAorCVtbIGVycm5vID0gMDsKKwkgICBwcmN0bChQUl9TRVRfU0VDQ09NUCwgU0VDQ09NUF9NT0RFX0ZJTFRFUiwgTlVMTCwgMCwgMCk7CisJICAgZXhpdChlcnJubyA9PSBFRkFVTFQgPyAwIDogMSk7IF1dKV0sCisJWyBBQ19NU0dfUkVTVUxUKFt5ZXNdKSBdLCBbCisJCUFDX01TR19SRVNVTFQoW25vXSkKKwkJIyBEaXNhYmxlIHNlY2NvbXAgZmlsdGVyIGFzIGEgdGFyZ2V0CisJCWhhdmVfc2VjY29tcF9maWx0ZXI9MAorCV0sCisJWyBBQ19NU0dfUkVTVUxUKFtjcm9zcy1jb21waWxpbmcsIGFzc3VtaW5nIHllc10pIF0KKykKK2ZpCisKK3VzZV9zdGFja19wcm90ZWN0b3I9MQorQUNfQVJHX1dJVEgoW3N0YWNrcHJvdGVjdF0sCisgICAgWyAgLS13aXRob3V0LXN0YWNrcHJvdGVjdCAgRG9uJ3QgdXNlIGNvbXBpbGVyJ3Mgc3RhY2sgcHJvdGVjdGlvbl0sIFsKKyAgICBpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInhubyI7IHRoZW4KKwl1c2Vfc3RhY2tfcHJvdGVjdG9yPTAKKyAgICBmaSBdKQorCisKK2lmIHRlc3QgIiRHQ0MiID0gInllcyIgfHwgdGVzdCAiJEdDQyIgPSAiZWdjcyI7IHRoZW4KKwlPU1NIX0NIRUNLX0NGTEFHX0NPTVBJTEUoWy1XYWxsXSkKKwlPU1NIX0NIRUNLX0NGTEFHX0NPTVBJTEUoWy1XcG9pbnRlci1hcml0aF0pCisJT1NTSF9DSEVDS19DRkxBR19DT01QSUxFKFstV3VuaW5pdGlhbGl6ZWRdKQorCU9TU0hfQ0hFQ0tfQ0ZMQUdfQ09NUElMRShbLVdzaWduLWNvbXBhcmVdKQorCU9TU0hfQ0hFQ0tfQ0ZMQUdfQ09NUElMRShbLVdmb3JtYXQtc2VjdXJpdHldKQorCU9TU0hfQ0hFQ0tfQ0ZMQUdfQ09NUElMRShbLVdwb2ludGVyLXNpZ25dLCBbLVduby1wb2ludGVyLXNpZ25dKQorCU9TU0hfQ0hFQ0tfQ0ZMQUdfQ09NUElMRShbLVd1bnVzZWQtcmVzdWx0XSwgWy1Xbm8tdW51c2VkLXJlc3VsdF0pCisJT1NTSF9DSEVDS19DRkxBR19DT01QSUxFKFstZm5vLXN0cmljdC1hbGlhc2luZ10pCisJT1NTSF9DSEVDS19DRkxBR19DT01QSUxFKFstRF9GT1JUSUZZX1NPVVJDRT0yXSkKKwlBQ19NU0dfQ0hFQ0tJTkcoW2djYyB2ZXJzaW9uXSkKKwlHQ0NfVkVSPWAkQ0MgLXYgMj4mMSB8ICRBV0sgJy9nY2MgdmVyc2lvbiAve3ByaW50ICQzfSdgCisJY2FzZSAkR0NDX1ZFUiBpbgorCQkxLiopIG5vX2F0dHJpYl9ub25udWxsPTEgOzsKKwkJMi44KiB8IDIuOSopCisJCSAgICAgbm9fYXR0cmliX25vbm51bGw9MQorCQkgICAgIDs7CisJCTIuKikgbm9fYXR0cmliX25vbm51bGw9MSA7OworCQkqKSA7OworCWVzYWMKKwlBQ19NU0dfUkVTVUxUKFskR0NDX1ZFUl0pCisKKwlBQ19NU0dfQ0hFQ0tJTkcoW2lmICRDQyBhY2NlcHRzIC1mbm8tYnVpbHRpbi1tZW1zZXRdKQorCXNhdmVkX0NGTEFHUz0iJENGTEFHUyIKKwlDRkxBR1M9IiRDRkxBR1MgLWZuby1idWlsdGluLW1lbXNldCIKKwlBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbICNpbmNsdWRlIDxzdHJpbmcuaD4gXV0sCisJCQlbWyBjaGFyIGJbMTBdOyBtZW1zZXQoYiwgMCwgc2l6ZW9mKGIpKTsgXV0pXSwKKwkJWyBBQ19NU0dfUkVTVUxUKFt5ZXNdKSBdLAorCQlbIEFDX01TR19SRVNVTFQoW25vXSkKKwkJICBDRkxBR1M9IiRzYXZlZF9DRkxBR1MiIF0KKwkpCisKKwkjIC1mc3RhY2stcHJvdGVjdG9yLWFsbCBkb2Vzbid0IGFsd2F5cyB3b3JrIGZvciBzb21lIEdDQyB2ZXJzaW9ucworCSMgYW5kL29yIHBsYXRmb3Jtcywgc28gd2UgdGVzdCBpZiB3ZSBjYW4uICBJZiBpdCdzIG5vdCBzdXBwb3J0ZWQKKwkjIG9uIGEgZ2l2ZW4gcGxhdGZvcm0gZ2NjIHdpbGwgZW1pdCBhIHdhcm5pbmcgc28gd2UgdXNlIC1XZXJyb3IuCisJaWYgdGVzdCAieCR1c2Vfc3RhY2tfcHJvdGVjdG9yIiA9ICJ4MSI7IHRoZW4KKwkgICAgZm9yIHQgaW4gLWZzdGFjay1wcm90ZWN0b3ItYWxsIC1mc3RhY2stcHJvdGVjdG9yOyBkbworCQlBQ19NU0dfQ0hFQ0tJTkcoW2lmICRDQyBzdXBwb3J0cyAkdF0pCisJCXNhdmVkX0NGTEFHUz0iJENGTEFHUyIKKwkJc2F2ZWRfTERGTEFHUz0iJExERkxBR1MiCisJCUNGTEFHUz0iJENGTEFHUyAkdCAtV2Vycm9yIgorCQlMREZMQUdTPSIkTERGTEFHUyAkdCAtV2Vycm9yIgorCQlBQ19MSU5LX0lGRUxTRSgKKwkJCVtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPHN0ZGlvLmg+IF1dLAorCQkJW1sKKwljaGFyIHhbMjU2XTsKKwlzbnByaW50Zih4LCBzaXplb2YoeCksICJYWFgiKTsKKwkJCSBdXSldLAorCQkgICAgWyBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCQkgICAgICBDRkxBR1M9IiRzYXZlZF9DRkxBR1MgJHQiCisJCSAgICAgIExERkxBR1M9IiRzYXZlZF9MREZMQUdTICR0IgorCQkgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmICR0IHdvcmtzXSkKKwkJICAgICAgQUNfUlVOX0lGRUxTRSgKKwkJCVtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPHN0ZGlvLmg+IF1dLAorCQkJW1sKKwljaGFyIHhbMjU2XTsKKwlzbnByaW50Zih4LCBzaXplb2YoeCksICJYWFgiKTsKKwkJCV1dKV0sCisJCQlbIEFDX01TR19SRVNVTFQoW3llc10pCisJCQkgIGJyZWFrIF0sCisJCQlbIEFDX01TR19SRVNVTFQoW25vXSkgXSwKKwkJCVsgQUNfTVNHX1dBUk4oW2Nyb3NzIGNvbXBpbGluZzogY2Fubm90IHRlc3RdKQorCQkJICBicmVhayBdCisJCSAgICAgICkKKwkJICAgIF0sCisJCSAgICBbIEFDX01TR19SRVNVTFQoW25vXSkgXQorCQkpCisJCUNGTEFHUz0iJHNhdmVkX0NGTEFHUyIKKwkJTERGTEFHUz0iJHNhdmVkX0xERkxBR1MiCisJICAgIGRvbmUKKwlmaQorCisJaWYgdGVzdCAteiAiJGhhdmVfbGxvbmdfbWF4IjsgdGhlbgorCQkjIHJldHJ5IExMT05HX01BWCB3aXRoIC1zdGQ9Z251OTksIG5lZWRlZCBvbiBzb21lIExpbnV4ZXMKKwkJdW5zZXQgYWNfY3ZfaGF2ZV9kZWNsX0xMT05HX01BWAorCQlzYXZlZF9DRkxBR1M9IiRDRkxBR1MiCisJCUNGTEFHUz0iJENGTEFHUyAtc3RkPWdudTk5IgorCQlBQ19DSEVDS19ERUNMKFtMTE9OR19NQVhdLAorCQkgICAgW2hhdmVfbGxvbmdfbWF4PTFdLAorCQkgICAgW0NGTEFHUz0iJHNhdmVkX0NGTEFHUyJdLAorCQkgICAgWyNpbmNsdWRlIDxsaW1pdHMuaD5dCisJCSkKKwlmaQorZmkKKworaWYgdGVzdCAieCRub19hdHRyaWJfbm9ubnVsbCIgIT0gIngxIiA7IHRoZW4KKwlBQ19ERUZJTkUoW0hBVkVfQVRUUklCVVRFX19OT05OVUxMX19dLCBbMV0sIFtIYXZlIGF0dHJpYnV0ZSBub25udWxsXSkKK2ZpCisKK0FDX0FSR19XSVRIKFtycGF0aF0sCisJWyAgLS13aXRob3V0LXJwYXRoICAgICAgICAgRGlzYWJsZSBhdXRvLWFkZGVkIC1SIGxpbmtlciBwYXRoc10sCisJWworCQlpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInhubyIgOyB0aGVuCisJCQluZWVkX2Rhc2hfcj0iIgorCQlmaQorCQlpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInh5ZXMiIDsgdGhlbgorCQkJbmVlZF9kYXNoX3I9MQorCQlmaQorCV0KKykKKworIyBBbGxvdyB1c2VyIHRvIHNwZWNpZnkgZmxhZ3MKK0FDX0FSR19XSVRIKFtjZmxhZ3NdLAorCVsgIC0td2l0aC1jZmxhZ3MgICAgICAgICAgIFNwZWNpZnkgYWRkaXRpb25hbCBmbGFncyB0byBwYXNzIHRvIGNvbXBpbGVyXSwKKwlbCisJCWlmIHRlc3QgLW4gIiR3aXRodmFsIiAgJiYgIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgICYmICBcCisJCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCisJCQlDRkxBR1M9IiRDRkxBR1MgJHdpdGh2YWwiCisJCWZpCisJXQorKQorQUNfQVJHX1dJVEgoW2NwcGZsYWdzXSwKKwlbICAtLXdpdGgtY3BwZmxhZ3MgICAgICAgICBTcGVjaWZ5IGFkZGl0aW9uYWwgZmxhZ3MgdG8gcGFzcyB0byBwcmVwcm9jZXNzb3JdICwKKwlbCisJCWlmIHRlc3QgLW4gIiR3aXRodmFsIiAgJiYgIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgICYmICBcCisJCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCisJCQlDUFBGTEFHUz0iJENQUEZMQUdTICR3aXRodmFsIgorCQlmaQorCV0KKykKK0FDX0FSR19XSVRIKFtsZGZsYWdzXSwKKwlbICAtLXdpdGgtbGRmbGFncyAgICAgICAgICBTcGVjaWZ5IGFkZGl0aW9uYWwgZmxhZ3MgdG8gcGFzcyB0byBsaW5rZXJdLAorCVsKKwkJaWYgdGVzdCAtbiAiJHdpdGh2YWwiICAmJiAgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiAgJiYgIFwKKwkJICAgIHRlc3QgIngke3dpdGh2YWx9IiAhPSAieHllcyI7IHRoZW4KKwkJCUxERkxBR1M9IiRMREZMQUdTICR3aXRodmFsIgorCQlmaQorCV0KKykKK0FDX0FSR19XSVRIKFtsaWJzXSwKKwlbICAtLXdpdGgtbGlicyAgICAgICAgICAgICBTcGVjaWZ5IGFkZGl0aW9uYWwgbGlicmFyaWVzIHRvIGxpbmsgd2l0aF0sCisJWworCQlpZiB0ZXN0IC1uICIkd2l0aHZhbCIgICYmICB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iICAmJiAgXAorCQkgICAgdGVzdCAieCR7d2l0aHZhbH0iICE9ICJ4eWVzIjsgdGhlbgorCQkJTElCUz0iJExJQlMgJHdpdGh2YWwiCisJCWZpCisJXQorKQorQUNfQVJHX1dJVEgoW1dlcnJvcl0sCisJWyAgLS13aXRoLVdlcnJvciAgICAgICAgICAgQnVpbGQgbWFpbiBjb2RlIHdpdGggLVdlcnJvcl0sCisJWworCQlpZiB0ZXN0IC1uICIkd2l0aHZhbCIgICYmICB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iOyB0aGVuCisJCQl3ZXJyb3JfZmxhZ3M9Ii1XZXJyb3IiCisJCQlpZiB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCisJCQkJd2Vycm9yX2ZsYWdzPSIkd2l0aHZhbCIKKwkJCWZpCisJCWZpCisJXQorKQorCitBQ19DSEVDS19IRUFERVJTKFsgXAorCWJzdHJpbmcuaCBcCisJY3J5cHQuaCBcCisJY3J5cHRvL3NoYTIuaCBcCisJZGlyZW50LmggXAorCWVuZGlhbi5oIFwKKwlmZWF0dXJlcy5oIFwKKwlmY250bC5oIFwKKwlmbG9hdGluZ3BvaW50LmggXAorCWdldG9wdC5oIFwKKwlnbG9iLmggXAorCWlhLmggXAorCWlhZi5oIFwKKwlsaW1pdHMuaCBcCisJbG9naW4uaCBcCisJbWFpbGxvY2suaCBcCisJbmRpci5oIFwKKwluZXQvaWZfdHVuLmggXAorCW5ldGRiLmggXAorCW5ldGdyb3VwLmggXAorCXBhbS9wYW1fYXBwbC5oIFwKKwlwYXRocy5oIFwKKwlwb2xsLmggXAorCXB0eS5oIFwKKwlyZWFkcGFzc3BocmFzZS5oIFwKKwlycGMvdHlwZXMuaCBcCisJc2VjdXJpdHkvcGFtX2FwcGwuaCBcCisJc2hhMi5oIFwKKwlzaGFkb3cuaCBcCisJc3RkZGVmLmggXAorCXN0ZGludC5oIFwKKwlzdHJpbmcuaCBcCisJc3RyaW5ncy5oIFwKKwlzeXMvYXVkaXQuaCBcCisJc3lzL2JpdHlwZXMuaCBcCisJc3lzL2JzZHR0eS5oIFwKKwlzeXMvY2RlZnMuaCBcCisJc3lzL2Rpci5oIFwKKwlzeXMvbW1hbi5oIFwKKwlzeXMvbmRpci5oIFwKKwlzeXMvcG9sbC5oIFwKKwlzeXMvcHJjdGwuaCBcCisJc3lzL3BzdGF0LmggXAorCXN5cy9zZWxlY3QuaCBcCisJc3lzL3N0YXQuaCBcCisJc3lzL3N0cmVhbS5oIFwKKwlzeXMvc3Ryb3B0cy5oIFwKKwlzeXMvc3RydGlvLmggXAorCXN5cy9zdGF0dmZzLmggXAorCXN5cy9zeXNtYWNyb3MuaCBcCisJc3lzL3RpbWUuaCBcCisJc3lzL3RpbWVycy5oIFwKKwlzeXMvdW4uaCBcCisJdGltZS5oIFwKKwl0bXBkaXIuaCBcCisJdHR5ZW50LmggXAorCXVjcmVkLmggXAorCXVuaXN0ZC5oIFwKKwl1c2Vyc2VjLmggXAorCXV0aWwuaCBcCisJdXRpbWUuaCBcCisJdXRtcC5oIFwKKwl1dG1weC5oIFwKKwl2aXMuaCBcCitdKQorCisjIGxhc3Rsb2cuaCByZXF1aXJlcyBzeXMvdGltZS5oIHRvIGJlIGluY2x1ZGVkIGZpcnN0IG9uIFNvbGFyaXMKK0FDX0NIRUNLX0hFQURFUlMoW2xhc3Rsb2cuaF0sIFtdLCBbXSwgWworI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorIyBpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCitdKQorCisjIHN5cy9wdG1zLmggcmVxdWlyZXMgc3lzL3N0cmVhbS5oIHRvIGJlIGluY2x1ZGVkIGZpcnN0IG9uIFNvbGFyaXMKK0FDX0NIRUNLX0hFQURFUlMoW3N5cy9wdG1zLmhdLCBbXSwgW10sIFsKKyNpZmRlZiBIQVZFX1NZU19TVFJFQU1fSAorIyBpbmNsdWRlIDxzeXMvc3RyZWFtLmg+CisjZW5kaWYKK10pCisKKyMgbG9naW5fY2FwLmggcmVxdWlyZXMgc3lzL3R5cGVzLmggb24gTmV0QlNECitBQ19DSEVDS19IRUFERVJTKFtsb2dpbl9jYXAuaF0sIFtdLCBbXSwgWworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorXSkKKworIyBvbGRlciBCU0RzIG5lZWQgc3lzL3BhcmFtLmggYmVmb3JlIHN5cy9tb3VudC5oCitBQ19DSEVDS19IRUFERVJTKFtzeXMvbW91bnQuaF0sIFtdLCBbXSwgWworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorXSkKKworIyBNZXNzYWdlcyBmb3IgZmVhdHVyZXMgdGVzdGVkIGZvciBpbiB0YXJnZXQtc3BlY2lmaWMgc2VjdGlvbgorU0lBX01TRz0ibm8iCitTUENfTVNHPSJubyIKK1NQX01TRz0ibm8iCisKKyMgQ2hlY2sgZm9yIHNvbWUgdGFyZ2V0LXNwZWNpZmljIHN0dWZmCitjYXNlICIkaG9zdCIgaW4KKyotKi1haXgqKQorCSMgU29tZSB2ZXJzaW9ucyBvZiBWQUMgd29uJ3QgYWxsb3cgbWFjcm8gcmVkZWZpbml0aW9ucyBhdAorCSMgLXFsYW5nbGV2ZWw9YW5zaSwgYW5kIGF1dG9jb25mIDIuNjAgc29tZXRpbWVzIGluc2lzdHMgb24gdXNpbmcgdGhhdAorCSMgcGFydGljdWxhcmx5IHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgdmFjIG9yIHhsYy4KKwkjIEl0IGFsc28gdGhyb3dzIGVycm9ycyBhYm91dCBudWxsIG1hY3JvIGFyZ21lbnRzLCBidXQgdGhlc2UgYXJlCisJIyBub3QgZmF0YWwuCisJQUNfTVNHX0NIRUNLSU5HKFtpZiBjb21waWxlciBhbGxvd3MgbWFjcm8gcmVkZWZpbml0aW9uc10pCisJQUNfQ09NUElMRV9JRkVMU0UoCisJICAgIFtBQ19MQU5HX1BST0dSQU0oW1sKKyNkZWZpbmUgdGVzdG1hY3JvIGZvbworI2RlZmluZSB0ZXN0bWFjcm8gYmFyXV0sCisJICAgIFtbIGV4aXQoMCk7IF1dKV0sCisJICAgIFsgQUNfTVNHX1JFU1VMVChbeWVzXSkgXSwKKwkgICAgWyBBQ19NU0dfUkVTVUxUKFtub10pCisJICAgICAgQ0M9ImBlY2hvICRDQyB8IHNlZCAncy8tcWxhbmdsdmxcPWFuc2kvL2cnYCIKKwkgICAgICBMRD0iYGVjaG8gJExEIHwgc2VkICdzLy1xbGFuZ2x2bFw9YW5zaS8vZydgIgorCSAgICAgIENGTEFHUz0iYGVjaG8gJENGTEFHUyB8IHNlZCAncy8tcWxhbmdsdmxcPWFuc2kvL2cnYCIKKwkgICAgICBDUFBGTEFHUz0iYGVjaG8gJENQUEZMQUdTIHwgc2VkICdzLy1xbGFuZ2x2bFw9YW5zaS8vZydgIgorCSAgICBdCisJKQorCisJQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gc3BlY2lmeSBibGlicGF0aCBmb3IgbGlua2VyICgkTEQpXSkKKwlpZiAodGVzdCAteiAiJGJsaWJwYXRoIik7IHRoZW4KKwkJYmxpYnBhdGg9Ii91c3IvbGliOi9saWIiCisJZmkKKwlzYXZlZF9MREZMQUdTPSIkTERGTEFHUyIKKwlpZiB0ZXN0ICIkR0NDIiA9ICJ5ZXMiOyB0aGVuCisJCWZsYWdzPSItV2wsLWJsaWJwYXRoOiAtV2wsLXJwYXRoLCAtYmxpYnBhdGg6IgorCWVsc2UKKwkJZmxhZ3M9Ii1ibGlicGF0aDogLVdsLC1ibGlicGF0aDogLVdsLC1ycGF0aCwiCisJZmkKKwlmb3IgdHJ5ZmxhZ3MgaW4gJGZsYWdzIDtkbworCQlpZiAodGVzdCAteiAiJGJsaWJmbGFncyIpOyB0aGVuCisJCQlMREZMQUdTPSIkc2F2ZWRfTERGTEFHUyAkdHJ5ZmxhZ3MkYmxpYnBhdGgiCisJCQlBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbXV0sIFtbXV0pXSwKKwkJCVtibGliZmxhZ3M9JHRyeWZsYWdzXSwgW10pCisJCWZpCisJZG9uZQorCWlmICh0ZXN0IC16ICIkYmxpYmZsYWdzIik7IHRoZW4KKwkJQUNfTVNHX1JFU1VMVChbbm90IGZvdW5kXSkKKwkJQUNfTVNHX0VSUk9SKFsqKiogbXVzdCBiZSBhYmxlIHRvIHNwZWNpZnkgYmxpYnBhdGggb24gQUlYIC0gY2hlY2sgY29uZmlnLmxvZ10pCisJZWxzZQorCQlBQ19NU0dfUkVTVUxUKFskYmxpYmZsYWdzXSkKKwlmaQorCUxERkxBR1M9IiRzYXZlZF9MREZMQUdTIgorCWRubCBDaGVjayBmb3IgYXV0aGVudGljYXRlLiAgTWlnaHQgYmUgaW4gbGlicy5hIG9uIG9sZGVyIEFJWGVzCisJQUNfQ0hFQ0tfRlVOQyhbYXV0aGVudGljYXRlXSwgW0FDX0RFRklORShbV0lUSF9BSVhBVVRIRU5USUNBVEVdLCBbMV0sCisJCVtEZWZpbmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIEFJWDQncyBhdXRoZW50aWNhdGUgZnVuY3Rpb25dKV0sCisJCVtBQ19DSEVDS19MSUIoW3NdLCBbYXV0aGVudGljYXRlXSwKKwkJCVsgQUNfREVGSU5FKFtXSVRIX0FJWEFVVEhFTlRJQ0FURV0pCisJCQkJTElCUz0iJExJQlMgLWxzIgorCQkJXSkKKwkJXSkKKwlkbmwgQ2hlY2sgZm9yIHZhcmlvdXMgYXV0aCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgaW4gaGVhZGVycy4KKwlBQ19DSEVDS19ERUNMUyhbYXV0aGVudGljYXRlLCBsb2dpbnJlc3RyaWN0aW9ucywgbG9naW5zdWNjZXNzLAorCSAgICBwYXNzd2RleHBpcmVkLCBzZXRhdXRoZGJdLCAsICwgWyNpbmNsdWRlIDx1c2Vyc2VjLmg+XSkKKwlkbmwgQ2hlY2sgaWYgbG9naW5mYWlsZWQgaXMgZGVjbGFyZWQgYW5kIHRha2VzIDQgYXJndW1lbnRzIChBSVggPj0gNS4yKQorCUFDX0NIRUNLX0RFQ0xTKFtsb2dpbmZhaWxlZF0sCisJICAgIFtBQ19NU0dfQ0hFQ0tJTkcoW2lmIGxvZ2luZmFpbGVkIHRha2VzIDQgYXJndW1lbnRzXSkKKwkgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8dXNlcnNlYy5oPiBdXSwKKwkJW1sgKHZvaWQpbG9naW5mYWlsZWQoInVzZXIiLCJob3N0IiwidHR5IiwwKTsgXV0pXSwKKwkJW0FDX01TR19SRVNVTFQoW3llc10pCisJCUFDX0RFRklORShbQUlYX0xPR0lORkFJTEVEXzRBUkddLCBbMV0sCisJCQlbRGVmaW5lIGlmIHlvdXIgQUlYIGxvZ2luZmFpbGVkKCkgZnVuY3Rpb24KKwkJCXRha2VzIDQgYXJndW1lbnRzIChBSVggPj0gNS4yKV0pXSwgW0FDX01TR19SRVNVTFQoW25vXSkKKwkgICAgXSldLAorCSAgICBbXSwKKwkgICAgWyNpbmNsdWRlIDx1c2Vyc2VjLmg+XQorCSkKKwlBQ19DSEVDS19GVU5DUyhbZ2V0Z3JzZXQgc2V0YXV0aGRiXSkKKwlBQ19DSEVDS19ERUNMKFtGX0NMT1NFTV0sCisJICAgIEFDX0RFRklORShbSEFWRV9GQ05UTF9DTE9TRU1dLCBbMV0sIFtVc2UgRl9DTE9TRU0gZmNudGwgZm9yIGNsb3NlZnJvbV0pLAorCSAgICBbXSwKKwkgICAgWyAjaW5jbHVkZSA8bGltaXRzLmg+CisJICAgICAgI2luY2x1ZGUgPGZjbnRsLmg+IF0KKwkpCisJY2hlY2tfZm9yX2FpeF9icm9rZW5fZ2V0YWRkcmluZm89MQorCUFDX0RFRklORShbQlJPS0VOX1JFQUxQQVRIXSwgWzFdLCBbRGVmaW5lIGlmIHlvdSBoYXZlIGEgYnJva2VuIHJlYWxwYXRoLl0pCisJQUNfREVGSU5FKFtTRVRFVUlEX0JSRUFLU19TRVRVSURdLCBbMV0sCisJICAgIFtEZWZpbmUgaWYgeW91ciBwbGF0Zm9ybSBicmVha3MgZG9pbmcgYSBzZXRldWlkIGJlZm9yZSBhIHNldHVpZF0pCisJQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVVSURdLCBbMV0sIFtEZWZpbmUgaWYgeW91ciBzZXRyZXVpZCgpIGlzIGJyb2tlbl0pCisJQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVHSURdLCBbMV0sIFtEZWZpbmUgaWYgeW91ciBzZXRyZWdpZCgpIGlzIGJyb2tlbl0pCisJZG5sIEFJWCBoYW5kbGVzIGxhc3Rsb2cgYXMgcGFydCBvZiBpdHMgbG9naW4gbWVzc2FnZQorCUFDX0RFRklORShbRElTQUJMRV9MQVNUTE9HXSwgWzFdLCBbRGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSBsYXN0bG9nXSkKKwlBQ19ERUZJTkUoW0xPR0lOX05FRURTX1VUTVBYXSwgWzFdLAorCQlbU29tZSBzeXN0ZW1zIG5lZWQgYSB1dG1weCBlbnRyeSBmb3IgL2Jpbi9sb2dpbiB0byB3b3JrXSkKKwlBQ19ERUZJTkUoW1NQVF9UWVBFXSwgW1NQVF9SRVVTRUFSR1ZdLAorCQlbRGVmaW5lIHRvIGEgU2V0IFByb2Nlc3MgVGl0bGUgdHlwZSBpZiB5b3VyIHN5c3RlbSBpcworCQlzdXBwb3J0ZWQgYnkgYnNkLXNldHByb2N0aXRsZS5jXSkKKwlBQ19ERUZJTkUoW1NTSFBBTV9DSEFVVEhUT0tfTkVFRFNfUlVJRF0sIFsxXSwKKwkgICAgW0FJWCA1LjIgYW5kIDUuMyAoYW5kIHByZXN1bWFibHkgbmV3ZXIpIHJlcXVpcmUgdGhpc10pCisJQUNfREVGSU5FKFtQVFlfWkVST1JFQURdLCBbMV0sIFtyZWFkKDEpIGNhbiByZXR1cm4gMCBmb3IgYSBub24tY2xvc2VkIGZkXSkKKwk7OworKi0qLWN5Z3dpbiopCisJY2hlY2tfZm9yX2xpYmNyeXB0X2xhdGVyPTEKKwlMSUJTPSIkTElCUyAvdXNyL2xpYi90ZXh0cmVhZG1vZGUubyIKKwlBQ19ERUZJTkUoW0hBVkVfQ1lHV0lOXSwgWzFdLCBbRGVmaW5lIGlmIHlvdSBhcmUgb24gQ3lnd2luXSkKKwlBQ19ERUZJTkUoW1VTRV9QSVBFU10sIFsxXSwgW1VzZSBQSVBFUyBpbnN0ZWFkIG9mIGEgc29ja2V0cGFpcigpXSkKKwlBQ19ERUZJTkUoW0RJU0FCTEVfU0hBRE9XXSwgWzFdLAorCQlbRGVmaW5lIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgc2hhZG93IHBhc3N3b3Jkc10pCisJQUNfREVGSU5FKFtOT19YMTFfVU5JWF9TT0NLRVRTXSwgWzFdLAorCQlbRGVmaW5lIGlmIFgxMSBkb2Vzbid0IHN1cHBvcnQgQUZfVU5JWCBzb2NrZXRzIG9uIHRoYXQgc3lzdGVtXSkKKwlBQ19ERUZJTkUoW05PX0lQUE9SVF9SRVNFUlZFRF9DT05DRVBUXSwgWzFdLAorCQlbRGVmaW5lIGlmIHRoZSBjb25jZXB0IG9mIHBvcnRzIG9ubHkgYWNjZXNzaWJsZSB0bworCQlzdXBlcnVzZXJzIGlzbid0IGtub3duXSkKKwlBQ19ERUZJTkUoW0RJU0FCTEVfRkRfUEFTU0lOR10sIFsxXSwKKwkJW0RlZmluZSBpZiB5b3VyIHBsYXRmb3JtIG5lZWRzIHRvIHNraXAgcG9zdCBhdXRoCisJCWZpbGUgZGVzY3JpcHRvciBwYXNzaW5nXSkKKwlBQ19ERUZJTkUoW1NTSF9JT0JVRlNaXSwgWzY1NTM1XSwgW1dpbmRvd3MgaXMgc2Vuc2l0aXZlIHRvIHJlYWQgYnVmZmVyIHNpemVdKQorCUFDX0RFRklORShbRklMRVNZU1RFTV9OT19CQUNLU0xBU0hdLCBbMV0sIFtGaWxlIG5hbWVzIG1heSBub3QgY29udGFpbiBiYWNrc2xhc2ggY2hhcmFjdGVyc10pIAorCTs7CisqLSotZGd1eCopCisJQUNfREVGSU5FKFtJUF9UT1NfSVNfQlJPS0VOXSwgWzFdLAorCQlbRGVmaW5lIGlmIHlvdXIgc3lzdGVtIGNob2tlZCBvbiBJUCBUT1Mgc2V0dGluZ10pCisJQUNfREVGSU5FKFtTRVRFVUlEX0JSRUFLU19TRVRVSURdKQorCUFDX0RFRklORShbQlJPS0VOX1NFVFJFVUlEXSkKKwlBQ19ERUZJTkUoW0JST0tFTl9TRVRSRUdJRF0pCisJOzsKKyotKi1kYXJ3aW4qKQorCUFDX01TR19DSEVDS0lORyhbaWYgd2UgaGF2ZSB3b3JraW5nIGdldGFkZHJpbmZvXSkKKwlBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbWyAjaW5jbHVkZSA8bWFjaC1vL2R5bGQuaD4KK21haW4oKSB7IGlmIChOU1ZlcnNpb25PZlJ1blRpbWVMaWJyYXJ5KCJTeXN0ZW0iKSA+PSAoNjAgPDwgMTYpKQorCQlleGl0KDApOworCWVsc2UKKwkJZXhpdCgxKTsKK30KKwkJCV1dKV0sCisJW0FDX01TR19SRVNVTFQoW3dvcmtpbmddKV0sCisJW0FDX01TR19SRVNVTFQoW2J1Z2d5XSkKKwlBQ19ERUZJTkUoW0JST0tFTl9HRVRBRERSSU5GT10sIFsxXSwKKwkJW2dldGFkZHJpbmZvIGlzIGJyb2tlbiAoaWYgcHJlc2VudCldKQorCV0sCisJW0FDX01TR19SRVNVTFQoW2Fzc3VtZSBpdCBpcyB3b3JraW5nXSldKQorCUFDX0RFRklORShbU0VURVVJRF9CUkVBS1NfU0VUVUlEXSkKKwlBQ19ERUZJTkUoW0JST0tFTl9TRVRSRVVJRF0pCisJQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVHSURdKQorCUFDX0RFRklORShbQlJPS0VOX0dMT0JdLCBbMV0sIFtPUyBYIGdsb2IgZG9lcyBub3QgZG8gd2hhdCB3ZSBleHBlY3RdKQorCUFDX0RFRklORV9VTlFVT1RFRChbQklORF84X0NPTVBBVF0sIFsxXSwKKwkJW0RlZmluZSBpZiB5b3VyIHJlc29sdmVyIGxpYnMgbmVlZCB0aGlzIGZvciBnZXRycnNldGJ5bmFtZV0pCisJQUNfREVGSU5FKFtTU0hfVFVOX0ZSRUVCU0RdLCBbMV0sIFtPcGVuIHR1bm5lbCBkZXZpY2VzIHRoZSBGcmVlQlNEIHdheV0pCisJQUNfREVGSU5FKFtTU0hfVFVOX0NPTVBBVF9BRl0sIFsxXSwKKwkgICAgW1VzZSB0dW5uZWwgZGV2aWNlIGNvbXBhdGliaWxpdHkgdG8gT3BlbkJTRF0pCisJQUNfREVGSU5FKFtTU0hfVFVOX1BSRVBFTkRfQUZdLCBbMV0sCisJICAgIFtQcmVwZW5kIHRoZSBhZGRyZXNzIGZhbWlseSB0byBJUCB0dW5uZWwgdHJhZmZpY10pCisJbTRfcGF0dGVybl9hbGxvdyhbQVVfSVB2XSkKKwlBQ19DSEVDS19ERUNMKFtBVV9JUHY0XSwgW10sIAorCSAgICBBQ19ERUZJTkUoW0FVX0lQdjRdLCBbMF0sIFtTeXN0ZW0gb25seSBzdXBwb3J0cyBJUHY0IGF1ZGl0IHJlY29yZHNdKQorCSAgICBbI2luY2x1ZGUgPGJzbS9hdWRpdC5oPl0KKwlBQ19ERUZJTkUoW0xBU1RMT0dfV1JJVEVfUFVUVVRYTElORV0sIFsxXSwKKwkgICAgW0RlZmluZSBpZiBwdXR1dHhsaW5lIHVwZGF0ZXMgbGFzdGxvZyB0b29dKQorCSkKKwlBQ19ERUZJTkUoW1NQVF9UWVBFXSwgW1NQVF9SRVVTRUFSR1ZdLAorCQlbRGVmaW5lIHRvIGEgU2V0IFByb2Nlc3MgVGl0bGUgdHlwZSBpZiB5b3VyIHN5c3RlbSBpcworCQlzdXBwb3J0ZWQgYnkgYnNkLXNldHByb2N0aXRsZS5jXSkKKwlBQ19DSEVDS19GVU5DUyhbc2FuZGJveF9pbml0XSkKKwlBQ19DSEVDS19IRUFERVJTKFtzYW5kYm94LmhdKQorCTs7CisqLSotZHJhZ29uZmx5KikKKwlTU0hETElCUz0iJFNTSERMSUJTIC1sY3J5cHQiCisJOzsKKyotKi1oYWlrdSopIAorICAgIExJQlM9IiRMSUJTIC1sYnNkICIKKyAgICBBQ19DSEVDS19MSUIoW25ldHdvcmtdLCBbc29ja2V0XSkKKyAgICBBQ19ERUZJTkUoW0hBVkVfVV9JTlQ2NF9UXSkKKyAgICBNQU5UWVBFPW1hbiAKKyAgICA7OyAKKyotKi1ocHV4KikKKwkjIGZpcnN0IHdlIGRlZmluZSBhbGwgb2YgdGhlIG9wdGlvbnMgY29tbW9uIHRvIGFsbCBIUC1VWCByZWxlYXNlcworCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfSFBVWF9TT1VSQ0UgLURfWE9QRU5fU09VUkNFIC1EX1hPUEVOX1NPVVJDRV9FWFRFTkRFRD0xIgorCUlQQUREUl9JTl9ESVNQTEFZPXllcworCUFDX0RFRklORShbVVNFX1BJUEVTXSkKKwlBQ19ERUZJTkUoW0xPR0lOX05PX0VORE9QVF0sIFsxXSwKKwkgICAgW0RlZmluZSBpZiB5b3VyIGxvZ2luIHByb2dyYW0gY2Fubm90IGhhbmRsZSBlbmQgb2Ygb3B0aW9ucyAoIi0tIildKQorCUFDX0RFRklORShbTE9HSU5fTkVFRFNfVVRNUFhdKQorCUFDX0RFRklORShbTE9DS0VEX1BBU1NXRF9TVFJJTkddLCBbIioiXSwKKwkJW1N0cmluZyB1c2VkIGluIC9ldGMvcGFzc3dkIHRvIGRlbm90ZSBsb2NrZWQgYWNjb3VudF0pCisJQUNfREVGSU5FKFtTUFRfVFlQRV0sIFtTUFRfUFNUQVRdKQorCW1haWxkaXI9Ii92YXIvbWFpbCIKKwlMSUJTPSIkTElCUyAtbHNlYyIKKwlBQ19DSEVDS19MSUIoW3huZXRdLCBbdF9lcnJvcl0sICwKKwkgICAgW0FDX01TR19FUlJPUihbKioqIC1seG5ldCBuZWVkZWQgb24gSFAtVVggLSBjaGVjayBjb25maWcubG9nICoqKl0pXSkKKworCSMgbmV4dCwgd2UgZGVmaW5lIGFsbCBvZiB0aGUgb3B0aW9ucyBzcGVjaWZpYyB0byBtYWpvciByZWxlYXNlcworCWNhc2UgIiRob3N0IiBpbgorCSotKi1ocHV4MTAqKQorCQlpZiB0ZXN0IC16ICIkR0NDIjsgdGhlbgorCQkJQ0ZMQUdTPSIkQ0ZMQUdTIC1BZSIKKwkJZmkKKwkJOzsKKwkqLSotaHB1eDExKikKKwkJQUNfREVGSU5FKFtQQU1fU1VOX0NPREVCQVNFXSwgWzFdLAorCQkJW0RlZmluZSBpZiB5b3UgYXJlIHVzaW5nIFNvbGFyaXMtZGVyaXZlZCBQQU0gd2hpY2gKKwkJCXBhc3NlcyBwYW1fbWVzc2FnZXMgdG8gdGhlIGNvbnZlcnNhdGlvbiBmdW5jdGlvbgorCQkJd2l0aCBhbiBleHRyYSBsZXZlbCBvZiBpbmRpcmVjdGlvbl0pCisJCUFDX0RFRklORShbRElTQUJMRV9VVE1QXSwgWzFdLAorCQkJW0RlZmluZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgdXRtcF0pCisJCUFDX0RFRklORShbVVNFX0JUTVBdLCBbMV0sIFtVc2UgYnRtcCB0byBsb2cgYmFkIGxvZ2luc10pCisJCWNoZWNrX2Zvcl9ocHV4X2Jyb2tlbl9nZXRhZGRyaW5mbz0xCisJCWNoZWNrX2Zvcl9jb25mbGljdGluZ19nZXRzcG5hbT0xCisJCTs7CisJZXNhYworCisJIyBsYXN0bHksIHdlIGRlZmluZSBvcHRpb25zIHNwZWNpZmljIHRvIG1pbm9yIHJlbGVhc2VzCisJY2FzZSAiJGhvc3QiIGluCisJKi0qLWhwdXgxMC4yNikKKwkJQUNfREVGSU5FKFtIQVZFX1NFQ1VSRVdBUkVdLCBbMV0sCisJCQlbRGVmaW5lIGlmIHlvdSBoYXZlIFNlY3VyZVdhcmUtYmFzZWQKKwkJCXByb3RlY3RlZCBwYXNzd29yZCBkYXRhYmFzZV0pCisJCWRpc2FibGVfcHRteF9jaGVjaz15ZXMKKwkJTElCUz0iJExJQlMgLWxzZWNwdyIKKwkJOzsKKwllc2FjCisJOzsKKyotKi1pcml4NSopCisJUEFUSD0iJFBBVEg6L3Vzci9ldGMiCisJQUNfREVGSU5FKFtCUk9LRU5fSU5FVF9OVE9BXSwgWzFdLAorCQlbRGVmaW5lIGlmIHlvdSBzeXN0ZW0ncyBpbmV0X250b2EgaXMgYnVzdGVkCisJCShlLmcuIElyaXggZ2NjIGlzc3VlKV0pCisJQUNfREVGSU5FKFtTRVRFVUlEX0JSRUFLU19TRVRVSURdKQorCUFDX0RFRklORShbQlJPS0VOX1NFVFJFVUlEXSkKKwlBQ19ERUZJTkUoW0JST0tFTl9TRVRSRUdJRF0pCisJQUNfREVGSU5FKFtXSVRIX0FCQlJFVl9OT19UVFldLCBbMV0sCisJCVtEZWZpbmUgaWYgeW91IHNob3VsZG4ndCBzdHJpcCAndHR5JyBmcm9tIHlvdXIKKwkJdHR5bmFtZSBpbiBbdXdddG1wXSkKKwlBQ19ERUZJTkUoW0xPQ0tFRF9QQVNTV0RfU1RSSU5HXSwgWyIqTEsqIl0pCisJOzsKKyotKi1pcml4NiopCisJUEFUSD0iJFBBVEg6L3Vzci9ldGMiCisJQUNfREVGSU5FKFtXSVRIX0lSSVhfQVJSQVldLCBbMV0sCisJCVtEZWZpbmUgaWYgeW91IGhhdmUvd2FudCBhcnJheXMKKwkJKGNsdXN0ZXItd2lkZSBzZXNzaW9uIG1hbmFnbWVudCwgbm90IEMgYXJyYXlzKV0pCisJQUNfREVGSU5FKFtXSVRIX0lSSVhfUFJPSkVDVF0sIFsxXSwKKwkJW0RlZmluZSBpZiB5b3Ugd2FudCBJUklYIHByb2plY3QgbWFuYWdlbWVudF0pCisJQUNfREVGSU5FKFtXSVRIX0lSSVhfQVVESVRdLCBbMV0sCisJCVtEZWZpbmUgaWYgeW91IHdhbnQgSVJJWCBhdWRpdCB0cmFpbHNdKQorCUFDX0NIRUNLX0ZVTkMoW2psaW1pdF9zdGFydGpvYl0sIFtBQ19ERUZJTkUoW1dJVEhfSVJJWF9KT0JTXSwgWzFdLAorCQlbRGVmaW5lIGlmIHlvdSB3YW50IElSSVgga2VybmVsIGpvYnNdKV0pCisJQUNfREVGSU5FKFtCUk9LRU5fSU5FVF9OVE9BXSkKKwlBQ19ERUZJTkUoW1NFVEVVSURfQlJFQUtTX1NFVFVJRF0pCisJQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVVSURdKQorCUFDX0RFRklORShbQlJPS0VOX1NFVFJFR0lEXSkKKwlBQ19ERUZJTkUoW0JST0tFTl9VUERXVE1QWF0sIFsxXSwgW3VwZHd0bXB4IGlzIGJyb2tlbiAoaWYgcHJlc2VudCldKQorCUFDX0RFRklORShbV0lUSF9BQkJSRVZfTk9fVFRZXSkKKwlBQ19ERUZJTkUoW0xPQ0tFRF9QQVNTV0RfU1RSSU5HXSwgWyIqTEsqIl0pCisJOzsKKyotKi1rKmJzZCotZ251IHwgKi0qLWtvcGVuc29sYXJpcyotZ251KQorCWNoZWNrX2Zvcl9saWJjcnlwdF9sYXRlcj0xCisJQUNfREVGSU5FKFtQQU1fVFRZX0tMVURHRV0pCisJQUNfREVGSU5FKFtMT0NLRURfUEFTU1dEX1BSRUZJWF0sIFsiISJdKQorCUFDX0RFRklORShbU1BUX1RZUEVdLCBbU1BUX1JFVVNFQVJHVl0pCisJQUNfREVGSU5FKFtfUEFUSF9CVE1QXSwgWyIvdmFyL2xvZy9idG1wIl0sIFtsb2cgZm9yIGJhZCBsb2dpbiBhdHRlbXB0c10pCisJQUNfREVGSU5FKFtVU0VfQlRNUF0sIFsxXSwgW1VzZSBidG1wIHRvIGxvZyBiYWQgbG9naW5zXSkKKwk7OworKi0qLWxpbnV4KikKKwlub19kZXZfcHRteD0xCisJY2hlY2tfZm9yX2xpYmNyeXB0X2xhdGVyPTEKKwljaGVja19mb3Jfb3BlbnB0eV9jdHR5X2J1Zz0xCisJQUNfREVGSU5FKFtQQU1fVFRZX0tMVURHRV0sIFsxXSwKKwkJW1dvcmsgYXJvdW5kIHByb2JsZW1hdGljIExpbnV4IFBBTSBtb2R1bGVzIGhhbmRsaW5nIG9mIFBBTV9UVFldKQorCUFDX0RFRklORShbTE9DS0VEX1BBU1NXRF9QUkVGSVhdLCBbIiEiXSwKKwkJW1N0cmluZyB1c2VkIGluIC9ldGMvcGFzc3dkIHRvIGRlbm90ZSBsb2NrZWQgYWNjb3VudF0pCisJQUNfREVGSU5FKFtTUFRfVFlQRV0sIFtTUFRfUkVVU0VBUkdWXSkKKwlBQ19ERUZJTkUoW0xJTktfT1BOT1RTVVBQX0VSUk5PXSwgW0VQRVJNXSwKKwkJW0RlZmluZSB0byB3aGF0ZXZlciBsaW5rKCkgcmV0dXJucyBmb3IgIm5vdCBzdXBwb3J0ZWQiCisJCWlmIGl0IGRvZXNuJ3QgcmV0dXJuIEVPUE5PVFNVUFAuXSkKKwlBQ19ERUZJTkUoW19QQVRIX0JUTVBdLCBbIi92YXIvbG9nL2J0bXAiXSwgW2xvZyBmb3IgYmFkIGxvZ2luIGF0dGVtcHRzXSkKKwlBQ19ERUZJTkUoW1VTRV9CVE1QXSkKKwlBQ19ERUZJTkUoW0xJTlVYX09PTV9BREpVU1RdLCBbMV0sIFtBZGp1c3QgTGludXggb3V0LW9mLW1lbW9yeSBraWxsZXJdKQorCWluZXQ2X2RlZmF1bHRfNGluNj15ZXMKKwljYXNlIGB1bmFtZSAtcmAgaW4KKwkxLip8Mi4wLiopCisJCUFDX0RFRklORShbQlJPS0VOX0NNU0dfVFlQRV0sIFsxXSwKKwkJCVtEZWZpbmUgaWYgY21zZ190eXBlIGlzIG5vdCBwYXNzZWQgY29ycmVjdGx5XSkKKwkJOzsKKwllc2FjCisJIyB0dW4oNCkgZm9yd2FyZGluZyBjb21wYXQgY29kZQorCUFDX0NIRUNLX0hFQURFUlMoW2xpbnV4L2lmX3R1bi5oXSkKKwlpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saW51eF9pZl90dW5faCIgPSAieHllcyIgOyB0aGVuCisJCUFDX0RFRklORShbU1NIX1RVTl9MSU5VWF0sIFsxXSwKKwkJICAgIFtPcGVuIHR1bm5lbCBkZXZpY2VzIHRoZSBMaW51eCB0dW4vdGFwIHdheV0pCisJCUFDX0RFRklORShbU1NIX1RVTl9DT01QQVRfQUZdLCBbMV0sCisJCSAgICBbVXNlIHR1bm5lbCBkZXZpY2UgY29tcGF0aWJpbGl0eSB0byBPcGVuQlNEXSkKKwkJQUNfREVGSU5FKFtTU0hfVFVOX1BSRVBFTkRfQUZdLCBbMV0sCisJCSAgICBbUHJlcGVuZCB0aGUgYWRkcmVzcyBmYW1pbHkgdG8gSVAgdHVubmVsIHRyYWZmaWNdKQorCWZpCisJQUNfQ0hFQ0tfSEVBREVSUyhbbGludXgvc2VjY29tcC5oIGxpbnV4L2ZpbHRlci5oIGxpbnV4L2F1ZGl0LmhdKQorCUFDX0NIRUNLX0ZVTkNTKFtwcmN0bF0pCisJaGF2ZV9zZWNjb21wX2F1ZGl0X2FyY2g9MQorCWNhc2UgIiRob3N0IiBpbgorCXg4Nl82NC0qKQorCQlBQ19ERUZJTkUoW1NFQ0NPTVBfQVVESVRfQVJDSF0sIFtBVURJVF9BUkNIX1g4Nl82NF0sCisJCSAgICBbU3BlY2lmeSB0aGUgc3lzdGVtIGNhbGwgY29udmVudGlvbiBpbiB1c2VdKQorCQk7OworCWkqODYtKikKKwkJQUNfREVGSU5FKFtTRUNDT01QX0FVRElUX0FSQ0hdLCBbQVVESVRfQVJDSF9JMzg2XSwKKwkJICAgIFtTcGVjaWZ5IHRoZSBzeXN0ZW0gY2FsbCBjb252ZW50aW9uIGluIHVzZV0pCisJCTs7CisJKikKKwkJaGF2ZV9zZWNjb21wX2F1ZGl0X2FyY2g9MAorCQk7OworCWVzYWMKKwk7OworbWlwcy1zb255LWJzZHxtaXBzLXNvbnktbmV3c29zNCkKKwlBQ19ERUZJTkUoW05FRURfU0VUUEdSUF0sIFsxXSwgW05lZWQgc2V0cGdycCB0byBhY3F1aXJlIGNvbnRyb2xsaW5nIHR0eV0pCisJU09OWT0xCisJOzsKKyotKi1uZXRic2QqKQorCWNoZWNrX2Zvcl9saWJjcnlwdF9iZWZvcmU9MQorCWlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgOyB0aGVuCisJCW5lZWRfZGFzaF9yPTEKKwlmaQorCUFDX0RFRklORShbU1NIX1RVTl9GUkVFQlNEXSwgWzFdLCBbT3BlbiB0dW5uZWwgZGV2aWNlcyB0aGUgRnJlZUJTRCB3YXldKQorCUFDX0NIRUNLX0hFQURFUihbbmV0L2lmX3RhcC5oXSwgLAorCSAgICBBQ19ERUZJTkUoW1NTSF9UVU5fTk9fTDJdLCBbMV0sIFtObyBsYXllciAyIHR1bm5lbCBzdXBwb3J0XSkpCisJQUNfREVGSU5FKFtTU0hfVFVOX1BSRVBFTkRfQUZdLCBbMV0sCisJICAgIFtQcmVwZW5kIHRoZSBhZGRyZXNzIGZhbWlseSB0byBJUCB0dW5uZWwgdHJhZmZpY10pCisJOzsKKyotKi1mcmVlYnNkKikKKwljaGVja19mb3JfbGliY3J5cHRfbGF0ZXI9MQorCUFDX0RFRklORShbTE9DS0VEX1BBU1NXRF9QUkVGSVhdLCBbIipMT0NLRUQqIl0sIFtBY2NvdW50IGxvY2tlZCB3aXRoIHB3KDEpXSkKKwlBQ19ERUZJTkUoW1NTSF9UVU5fRlJFRUJTRF0sIFsxXSwgW09wZW4gdHVubmVsIGRldmljZXMgdGhlIEZyZWVCU0Qgd2F5XSkKKwlBQ19DSEVDS19IRUFERVIoW25ldC9pZl90YXAuaF0sICwKKwkgICAgQUNfREVGSU5FKFtTU0hfVFVOX05PX0wyXSwgWzFdLCBbTm8gbGF5ZXIgMiB0dW5uZWwgc3VwcG9ydF0pKQorCUFDX0RFRklORShbQlJPS0VOX0dMT0JdLCBbMV0sIFtGcmVlQlNEIGdsb2IgZG9lcyBub3QgZG8gd2hhdCB3ZSBuZWVkXSkKKwk7OworKi0qLWJzZGkqKQorCUFDX0RFRklORShbU0VURVVJRF9CUkVBS1NfU0VUVUlEXSkKKwlBQ19ERUZJTkUoW0JST0tFTl9TRVRSRVVJRF0pCisJQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVHSURdKQorCTs7CisqLW5leHQtKikKKwljb25mX2xhc3Rsb2dfbG9jYXRpb249Ii91c3IvYWRtL2xhc3Rsb2ciCisJY29uZl91dG1wX2xvY2F0aW9uPS9ldGMvdXRtcAorCWNvbmZfd3RtcF9sb2NhdGlvbj0vdXNyL2FkbS93dG1wCisJbWFpbGRpcj0vdXNyL3Nwb29sL21haWwKKwlBQ19ERUZJTkUoW0hBVkVfTkVYVF0sIFsxXSwgW0RlZmluZSBpZiB5b3UgYXJlIG9uIE5lWFRdKQorCUFDX0RFRklORShbQlJPS0VOX1JFQUxQQVRIXSkKKwlBQ19ERUZJTkUoW1VTRV9QSVBFU10pCisJQUNfREVGSU5FKFtCUk9LRU5fU0FWRURfVUlEU10sIFsxXSwgW05lZWRlZCBmb3IgTmVYVF0pCisJOzsKKyotKi1vcGVuYnNkKikKKwlBQ19ERUZJTkUoW0hBVkVfQVRUUklCVVRFX19TRU5USU5FTF9fXSwgWzFdLCBbT3BlbkJTRCdzIGdjYyBoYXMgc2VudGluZWxdKQorCUFDX0RFRklORShbSEFWRV9BVFRSSUJVVEVfX0JPVU5ERURfX10sIFsxXSwgW09wZW5CU0QncyBnY2MgaGFzIGJvdW5kZWRdKQorCUFDX0RFRklORShbU1NIX1RVTl9PUEVOQlNEXSwgWzFdLCBbT3BlbiB0dW5uZWwgZGV2aWNlcyB0aGUgT3BlbkJTRCB3YXldKQorCUFDX0RFRklORShbU1lTTE9HX1JfU0FGRV9JTl9TSUdIQU5EXSwgWzFdLAorCSAgICBbc3lzbG9nX3IgZnVuY3Rpb24gaXMgc2FmZSB0byB1c2UgaW4gaW4gYSBzaWduYWwgaGFuZGxlcl0pCisJOzsKKyotKi1zb2xhcmlzKikKKwlpZiB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iIDsgdGhlbgorCQluZWVkX2Rhc2hfcj0xCisJZmkKKwlBQ19ERUZJTkUoW1BBTV9TVU5fQ09ERUJBU0VdKQorCUFDX0RFRklORShbTE9HSU5fTkVFRFNfVVRNUFhdKQorCUFDX0RFRklORShbTE9HSU5fTkVFRFNfVEVSTV0sIFsxXSwKKwkJW1NvbWUgdmVyc2lvbnMgb2YgL2Jpbi9sb2dpbiBuZWVkIHRoZSBURVJNIHN1cHBsaWVkCisJCW9uIHRoZSBjb21tYW5kbGluZV0pCisJQUNfREVGSU5FKFtQQU1fVFRZX0tMVURHRV0pCisJQUNfREVGSU5FKFtTU0hQQU1fQ0hBVVRIVE9LX05FRURTX1JVSURdLCBbMV0sCisJCVtEZWZpbmUgaWYgcGFtX2NoYXV0aHRvayB3YW50cyByZWFsIHVpZCBzZXQKKwkJdG8gdGhlIHVucHJpdidlZCB1c2VyXSkKKwlBQ19ERUZJTkUoW0xPQ0tFRF9QQVNTV0RfU1RSSU5HXSwgWyIqTEsqIl0pCisJIyBQdXNoaW5nIFNUUkVBTVMgbW9kdWxlcyB3aWxsIGNhdXNlIHNzaGQgdG8gYWNxdWlyZSBhIGNvbnRyb2xsaW5nIHR0eS4KKwlBQ19ERUZJTkUoW1NTSERfQUNRVUlSRVNfQ1RUWV0sIFsxXSwKKwkJW0RlZmluZSBpZiBzc2hkIHNvbWVob3cgcmVhY3F1aXJlcyBhIGNvbnRyb2xsaW5nIFRUWQorCQlhZnRlciBzZXRzaWQoKV0pCisJQUNfREVGSU5FKFtQQVNTV0RfTkVFRFNfVVNFUk5BTUVdLCBbMV0sIFttdXN0IHN1cHBseSB1c2VybmFtZSB0byBwYXNzd2QKKwkJaW4gY2FzZSB0aGUgbmFtZSBpcyBsb25nZXIgdGhhbiA4IGNoYXJzXSkKKwlBQ19ERUZJTkUoW0JST0tFTl9UQ0dFVEFUVFJfSUNBTk9OXSwgWzFdLCBbdGNnZXRhdHRyIHdpdGggSUNBTk9OIG1heSBoYW5nXSkKKwlleHRlcm5hbF9wYXRoX2ZpbGU9L2V0Yy9kZWZhdWx0L2xvZ2luCisJIyBoYXJkd2lyZSBsYXN0bG9nIGxvY2F0aW9uIChjYW4ndCBkZXRlY3QgaXQgb24gc29tZSB2ZXJzaW9ucykKKwljb25mX2xhc3Rsb2dfbG9jYXRpb249Ii92YXIvYWRtL2xhc3Rsb2ciCisJQUNfTVNHX0NIRUNLSU5HKFtmb3Igb2Jzb2xldGUgdXRtcCBhbmQgd3RtcCBpbiBzb2xhcmlzMi54XSkKKwlzb2wydmVyPWBlY2hvICIkaG9zdCJ8IHNlZCAtZSAncy8uKltbMC05XV1cLi8vJ2AKKwlpZiB0ZXN0ICIkc29sMnZlciIgLWdlIDg7IHRoZW4KKwkJQUNfTVNHX1JFU1VMVChbeWVzXSkKKwkJQUNfREVGSU5FKFtESVNBQkxFX1VUTVBdKQorCQlBQ19ERUZJTkUoW0RJU0FCTEVfV1RNUF0sIFsxXSwKKwkJCVtEZWZpbmUgaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIHd0bXBdKQorCWVsc2UKKwkJQUNfTVNHX1JFU1VMVChbbm9dKQorCWZpCisJQUNfQVJHX1dJVEgoW3NvbGFyaXMtY29udHJhY3RzXSwKKwkJWyAgLS13aXRoLXNvbGFyaXMtY29udHJhY3RzIEVuYWJsZSBTb2xhcmlzIHByb2Nlc3MgY29udHJhY3RzIChleHBlcmltZW50YWwpXSwKKwkJWworCQlBQ19DSEVDS19MSUIoW2NvbnRyYWN0XSwgW2N0X3RtcGxfYWN0aXZhdGVdLAorCQkJWyBBQ19ERUZJTkUoW1VTRV9TT0xBUklTX1BST0NFU1NfQ09OVFJBQ1RTXSwgWzFdLAorCQkJCVtEZWZpbmUgaWYgeW91IGhhdmUgU29sYXJpcyBwcm9jZXNzIGNvbnRyYWN0c10pCisJCQkgIFNTSERMSUJTPSIkU1NIRExJQlMgLWxjb250cmFjdCIKKwkJCSAgU1BDX01TRz0ieWVzIiBdLCApCisJCV0sCisJKQorCUFDX0FSR19XSVRIKFtzb2xhcmlzLXByb2plY3RzXSwKKwkJWyAgLS13aXRoLXNvbGFyaXMtcHJvamVjdHMgRW5hYmxlIFNvbGFyaXMgcHJvamVjdHMgKGV4cGVyaW1lbnRhbCldLAorCQlbCisJCUFDX0NIRUNLX0xJQihbcHJvamVjdF0sIFtzZXRwcm9qZWN0XSwKKwkJCVsgQUNfREVGSU5FKFtVU0VfU09MQVJJU19QUk9KRUNUU10sIFsxXSwKKwkJCQlbRGVmaW5lIGlmIHlvdSBoYXZlIFNvbGFyaXMgcHJvamVjdHNdKQorCQkJU1NIRExJQlM9IiRTU0hETElCUyAtbHByb2plY3QiCisJCQlTUF9NU0c9InllcyIgXSwgKQorCQldLAorCSkKKwk7OworKi0qLXN1bm9zNCopCisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRFNVTk9TNCIKKwlBQ19DSEVDS19GVU5DUyhbZ2V0cHdhbmFtXSkKKwlBQ19ERUZJTkUoW1BBTV9TVU5fQ09ERUJBU0VdKQorCWNvbmZfdXRtcF9sb2NhdGlvbj0vZXRjL3V0bXAKKwljb25mX3d0bXBfbG9jYXRpb249L3Zhci9hZG0vd3RtcAorCWNvbmZfbGFzdGxvZ19sb2NhdGlvbj0vdmFyL2FkbS9sYXN0bG9nCisJQUNfREVGSU5FKFtVU0VfUElQRVNdKQorCTs7CisqLW5jci1zeXN2KikKKwlMSUJTPSIkTElCUyAtbGM4OSIKKwlBQ19ERUZJTkUoW1VTRV9QSVBFU10pCisJQUNfREVGSU5FKFtTU0hEX0FDUVVJUkVTX0NUVFldKQorCUFDX0RFRklORShbU0VURVVJRF9CUkVBS1NfU0VUVUlEXSkKKwlBQ19ERUZJTkUoW0JST0tFTl9TRVRSRVVJRF0pCisJQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVHSURdKQorCTs7CisqLXNuaS1zeXN2KikKKwkjIC91c3IvdWNibGliIE1VU1QgTk9UIGJlIHNlYXJjaGVkIG9uIFJlbGlhbnRVTklYCisJQUNfQ0hFQ0tfTElCKFtkbF0sIFtkbHN5bV0sICwpCisJIyAtbHJlc29sdiBuZWVkcyB0byBiZSBhdCB0aGUgZW5kIG9mIExJQlMgb3IgRE5TIGxvb2t1cHMgYnJlYWsKKwlBQ19DSEVDS19MSUIoW3Jlc29sdl0sIFtyZXNfcXVlcnldLCBbIExJQlM9IiRMSUJTIC1scmVzb2x2IiBdKQorCUlQQUREUl9JTl9ESVNQTEFZPXllcworCUFDX0RFRklORShbVVNFX1BJUEVTXSkKKwlBQ19ERUZJTkUoW0lQX1RPU19JU19CUk9LRU5dKQorCUFDX0RFRklORShbU0VURVVJRF9CUkVBS1NfU0VUVUlEXSkKKwlBQ19ERUZJTkUoW0JST0tFTl9TRVRSRVVJRF0pCisJQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVHSURdKQorCUFDX0RFRklORShbU1NIRF9BQ1FVSVJFU19DVFRZXSkKKwlleHRlcm5hbF9wYXRoX2ZpbGU9L2V0Yy9kZWZhdWx0L2xvZ2luCisJIyAvdXNyL3VjYmxpYi9saWJ1Y2IuYSBubyBsb25nZXIgbmVlZGVkIG9uIFJlbGlhbnRVTklYCisJIyBBdHRlbnRpb246IGFsd2F5cyB0YWtlIGNhcmUgdG8gYmluZCBsaWJzb2NrZXQgYW5kIGxpYm5zbCBiZWZvcmUgbGliYywKKwkjIG90aGVyd2lzZSB5b3Ugd2lsbCBmaW5kIGxvdHMgb2YgIlNJT0NHUEdSUCBlcnJubyAyMiIgb24gc3lzbG9nCisJOzsKKyMgVW5peFdhcmUgMS54LCBVbml4V2FyZSAyLngsIGFuZCBvdGhlcnMgYmFzZWQgb24gY29kZSBmcm9tIFVuaXZlbC4KKyotKi1zeXN2NC4yKikKKwlBQ19ERUZJTkUoW1VTRV9QSVBFU10pCisJQUNfREVGSU5FKFtTRVRFVUlEX0JSRUFLU19TRVRVSURdKQorCUFDX0RFRklORShbQlJPS0VOX1NFVFJFVUlEXSkKKwlBQ19ERUZJTkUoW0JST0tFTl9TRVRSRUdJRF0pCisJQUNfREVGSU5FKFtQQVNTV0RfTkVFRFNfVVNFUk5BTUVdLCBbMV0sIFttdXN0IHN1cHBseSB1c2VybmFtZSB0byBwYXNzd2RdKQorCUFDX0RFRklORShbTE9DS0VEX1BBU1NXRF9TVFJJTkddLCBbIipMSyoiXSkKKwk7OworIyBVbml4V2FyZSA3LngsIE9wZW5VTklYIDgKKyotKi1zeXN2NSopCisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRHZzbnByaW50Zj1feHZzbnByaW50ZiAtRHNucHJpbnRmPV94c25wcmludGYiCisJQUNfREVGSU5FKFtVTklYV0FSRV9MT05HX1BBU1NXT1JEU10sIFsxXSwgW1N1cHBvcnQgcGFzc3dvcmRzID4gOCBjaGFyc10pCisJQUNfREVGSU5FKFtVU0VfUElQRVNdKQorCUFDX0RFRklORShbU0VURVVJRF9CUkVBS1NfU0VUVUlEXSkKKwlBQ19ERUZJTkUoW0JST0tFTl9HRVRBRERSSU5GT10pCisJQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVVSURdKQorCUFDX0RFRklORShbQlJPS0VOX1NFVFJFR0lEXSkKKwlBQ19ERUZJTkUoW1BBU1NXRF9ORUVEU19VU0VSTkFNRV0pCisJY2FzZSAiJGhvc3QiIGluCisJKi0qLXN5c3Y1U0NPX1NWKikJIyBTQ08gT3BlblNlcnZlciA2LngKKwkJbWFpbGRpcj0vdmFyL3Nwb29sL21haWwKKwkJVEVTVF9TSEVMTD0vdTk1L2Jpbi9zaAorCQlBQ19ERUZJTkUoW0JST0tFTl9MSUJJQUZdLCBbMV0sCisJCQlbaWFfdWluZm8gcm91dGluZXMgbm90IHN1cHBvcnRlZCBieSBPUyB5ZXRdKQorCQlBQ19ERUZJTkUoW0JST0tFTl9VUERXVE1QWF0pCisJCUFDX0NIRUNLX0xJQihbcHJvdF0sIFtnZXRsdWlkXSwgWyBMSUJTPSIkTElCUyAtbHByb3QiCisJCQlBQ19DSEVDS19GVU5DUyhbZ2V0bHVpZCBzZXRsdWlkXSwgLCAsIFstbHByb3RdKQorCQkJQUNfREVGSU5FKFtIQVZFX1NFQ1VSRVdBUkVdKQorCQkJQUNfREVGSU5FKFtESVNBQkxFX1NIQURPV10pCisJCQldLCAsICkKKwkJOzsKKwkqKQlBQ19ERUZJTkUoW0xPQ0tFRF9QQVNTV0RfU1RSSU5HXSwgWyIqTEsqIl0pCisJCWNoZWNrX2Zvcl9saWJjcnlwdF9sYXRlcj0xCisJCTs7CisJZXNhYworCTs7CisqLSotc3lzdiopCisJOzsKKyMgU0NPIFVOSVggYW5kIE9FTSB2ZXJzaW9ucyBvZiBTQ08gVU5JWAorKi0qLXNjbzMuMnY0KikKKwlBQ19NU0dfRVJST1IoIlRoaXMgUGxhdGZvcm0gaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4iKQorCTs7CisjIFNDTyBPcGVuU2VydmVyIDUueAorKi0qLXNjbzMuMnY1KikKKwlpZiB0ZXN0IC16ICIkR0NDIjsgdGhlbgorCQlDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCisJZmkKKwlMSUJTPSIkTElCUyAtbHByb3QgLWx4IC1sdGluZm8gLWxtIgorCW5vX2Rldl9wdG14PTEKKwlBQ19ERUZJTkUoW1VTRV9QSVBFU10pCisJQUNfREVGSU5FKFtIQVZFX1NFQ1VSRVdBUkVdKQorCUFDX0RFRklORShbRElTQUJMRV9TSEFET1ddKQorCUFDX0RFRklORShbRElTQUJMRV9GRF9QQVNTSU5HXSkKKwlBQ19ERUZJTkUoW1NFVEVVSURfQlJFQUtTX1NFVFVJRF0pCisJQUNfREVGSU5FKFtCUk9LRU5fR0VUQUREUklORk9dKQorCUFDX0RFRklORShbQlJPS0VOX1NFVFJFVUlEXSkKKwlBQ19ERUZJTkUoW0JST0tFTl9TRVRSRUdJRF0pCisJQUNfREVGSU5FKFtXSVRIX0FCQlJFVl9OT19UVFldKQorCUFDX0RFRklORShbQlJPS0VOX1VQRFdUTVBYXSkKKwlBQ19ERUZJTkUoW1BBU1NXRF9ORUVEU19VU0VSTkFNRV0pCisJQUNfQ0hFQ0tfRlVOQ1MoW2dldGx1aWQgc2V0bHVpZF0pCisJTUFOVFlQRT1tYW4KKwlURVNUX1NIRUxMPWtzaAorCTs7CisqLSotdW5pY29zbWsqKQorCUFDX0RFRklORShbTk9fU1NIX0xBU1RMT0ddLCBbMV0sCisJCVtEZWZpbmUgaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIGxhc3Rsb2cgaW4gc2Vzc2lvbi5jXSkKKwlBQ19ERUZJTkUoW1NFVEVVSURfQlJFQUtTX1NFVFVJRF0pCisJQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVVSURdKQorCUFDX0RFRklORShbQlJPS0VOX1NFVFJFR0lEXSkKKwlBQ19ERUZJTkUoW1VTRV9QSVBFU10pCisJQUNfREVGSU5FKFtESVNBQkxFX0ZEX1BBU1NJTkddKQorCUxERkxBR1M9IiRMREZMQUdTIgorCUxJQlM9IiRMSUJTIC1sZ2VuIC1scnNjIC1sc2hhcmUgLWx1ZXggLWxhY20iCisJTUFOVFlQRT1jYXQKKwk7OworKi0qLXVuaWNvc21wKikKKwlBQ19ERUZJTkUoW1NFVEVVSURfQlJFQUtTX1NFVFVJRF0pCisJQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVVSURdKQorCUFDX0RFRklORShbQlJPS0VOX1NFVFJFR0lEXSkKKwlBQ19ERUZJTkUoW1dJVEhfQUJCUkVWX05PX1RUWV0pCisJQUNfREVGSU5FKFtVU0VfUElQRVNdKQorCUFDX0RFRklORShbRElTQUJMRV9GRF9QQVNTSU5HXSkKKwlMREZMQUdTPSIkTERGTEFHUyIKKwlMSUJTPSIkTElCUyAtbGdlbiAtbGFjaWQgLWxkYiIKKwlNQU5UWVBFPWNhdAorCTs7CisqLSotdW5pY29zKikKKwlBQ19ERUZJTkUoW1NFVEVVSURfQlJFQUtTX1NFVFVJRF0pCisJQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVVSURdKQorCUFDX0RFRklORShbQlJPS0VOX1NFVFJFR0lEXSkKKwlBQ19ERUZJTkUoW1VTRV9QSVBFU10pCisJQUNfREVGSU5FKFtESVNBQkxFX0ZEX1BBU1NJTkddKQorCUFDX0RFRklORShbTk9fU1NIX0xBU1RMT0ddKQorCUxERkxBR1M9IiRMREZMQUdTIC1XbCwtRG1zZ2xldmVsPTMzNDpmYXRhbCIKKwlMSUJTPSIkTElCUyAtbGdlbiAtbHJzYyAtbHNoYXJlIC1sdWV4IC1sYWNtIgorCU1BTlRZUEU9Y2F0CisJOzsKKyotZGVjLW9zZiopCisJQUNfTVNHX0NIRUNLSU5HKFtmb3IgRGlnaXRhbCBVbml4IFNJQV0pCisJbm9fb3Nmc2lhPSIiCisJQUNfQVJHX1dJVEgoW29zZnNpYV0sCisJCVsgIC0td2l0aC1vc2ZzaWEgICAgICAgICAgIEVuYWJsZSBEaWdpdGFsIFVuaXggU0lBXSwKKwkJWworCQkJaWYgdGVzdCAieCR3aXRodmFsIiA9ICJ4bm8iIDsgdGhlbgorCQkJCUFDX01TR19SRVNVTFQoW2Rpc2FibGVkXSkKKwkJCQlub19vc2ZzaWE9MQorCQkJZmkKKwkJXSwKKwkpCisJaWYgdGVzdCAteiAiJG5vX29zZnNpYSIgOyB0aGVuCisJCWlmIHRlc3QgLWYgL2V0Yy9zaWEvbWF0cml4LmNvbmY7IHRoZW4KKwkJCUFDX01TR19SRVNVTFQoW3llc10pCisJCQlBQ19ERUZJTkUoW0hBVkVfT1NGX1NJQV0sIFsxXSwKKwkJCQlbRGVmaW5lIGlmIHlvdSBoYXZlIERpZ2l0YWwgVW5peCBTZWN1cml0eQorCQkJCUludGVncmF0aW9uIEFyY2hpdGVjdHVyZV0pCisJCQlBQ19ERUZJTkUoW0RJU0FCTEVfTE9HSU5dLCBbMV0sCisJCQkJW0RlZmluZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgeW91cgorCQkJCXN5c3RlbSdzIGxvZ2luKCkgY2FsbF0pCisJCQlBQ19ERUZJTkUoW0RJU0FCTEVfRkRfUEFTU0lOR10pCisJCQlMSUJTPSIkTElCUyAtbHNlY3VyaXR5IC1sZGIgLWxtIC1sYXVkIgorCQkJU0lBX01TRz0ieWVzIgorCQllbHNlCisJCQlBQ19NU0dfUkVTVUxUKFtub10pCisJCQlBQ19ERUZJTkUoW0xPQ0tFRF9QQVNTV0RfU1VCU1RSXSwgWyJOb2xvZ2luIl0sCisJCQkgIFtTdHJpbmcgdXNlZCBpbiAvZXRjL3Bhc3N3ZCB0byBkZW5vdGUgbG9ja2VkIGFjY291bnRdKQorCQlmaQorCWZpCisJQUNfREVGSU5FKFtCUk9LRU5fR0VUQUREUklORk9dKQorCUFDX0RFRklORShbU0VURVVJRF9CUkVBS1NfU0VUVUlEXSkKKwlBQ19ERUZJTkUoW0JST0tFTl9TRVRSRVVJRF0pCisJQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVHSURdKQorCUFDX0RFRklORShbQlJPS0VOX1JFQURWX0NPTVBBUklTT05dLCBbMV0sIFtDYW4ndCBkbyBjb21wYXJpc29ucyBvbiByZWFkdl0pCisJOzsKKworKi0qLW50by1xbngqKQorCUFDX0RFRklORShbVVNFX1BJUEVTXSkKKwlBQ19ERUZJTkUoW05PX1gxMV9VTklYX1NPQ0tFVFNdKQorCUFDX0RFRklORShbTUlTU0lOR19ORkRCSVRTXSwgWzFdLCBbRGVmaW5lIG9uICpudG8tcW54IHN5c3RlbXNdKQorCUFDX0RFRklORShbTUlTU0lOR19IT1dNQU5ZXSwgWzFdLCBbRGVmaW5lIG9uICpudG8tcW54IHN5c3RlbXNdKQorCUFDX0RFRklORShbTUlTU0lOR19GRF9NQVNLXSwgWzFdLCBbRGVmaW5lIG9uICpudG8tcW54IHN5c3RlbXNdKQorCUFDX0RFRklORShbRElTQUJMRV9MQVNUTE9HXSkKKwlBQ19ERUZJTkUoW1NTSERfQUNRVUlSRVNfQ1RUWV0pCisJQUNfREVGSU5FKFtCUk9LRU5fU0hBRE9XX0VYUElSRV0sIFsxXSwgW1FOWCBzaGFkb3cgc3VwcG9ydCBpcyBicm9rZW5dKQorCWVuYWJsZV9ldGNfZGVmYXVsdF9sb2dpbj1ubwkjIGhhcyBpbmNvbXBhdGlibGUgL2V0Yy9kZWZhdWx0L2xvZ2luCisJY2FzZSAiJGhvc3QiIGluCisJKi0qLW50by1xbng2KikKKwkJQUNfREVGSU5FKFtESVNBQkxFX0ZEX1BBU1NJTkddKQorCQk7OworCWVzYWMKKwk7OworCisqLSotdWx0cml4KikKKwlBQ19ERUZJTkUoW0JST0tFTl9HRVRHUk9VUFNdLCBbMV0sIFtnZXRncm91cHMoMCxOVUxMKSB3aWxsIHJldHVybiAtMV0pCisJQUNfREVGSU5FKFtCUk9LRU5fTU1BUF0sIFsxXSwgW1VsdHJpeCBtbWFwIGNhbid0IG1hcCBmaWxlc10pCisJQUNfREVGSU5FKFtORUVEX1NFVFBHUlBdKQorCUFDX0RFRklORShbSEFWRV9TWVNfU1lTTE9HX0hdLCBbMV0sIFtGb3JjZSB1c2Ugb2Ygc3lzL3N5c2xvZy5oIG9uIFVsdHJpeF0pCisJOzsKKworKi0qLWx5bnhvcykKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1EX19OT19JTkNMVURFX1dBUk5fXyIKKwlBQ19ERUZJTkUoW01JU1NJTkdfSE9XTUFOWV0pCisgICAgICAgIEFDX0RFRklORShbQlJPS0VOX1NFVFZCVUZdLCBbMV0sIFtMeW54T1MgaGFzIGJyb2tlbiBzZXR2YnVmKCkgaW1wbGVtZW50YXRpb25dKQorICAgICAgICA7OworZXNhYworCitBQ19NU0dfQ0hFQ0tJTkcoW2NvbXBpbGVyIGFuZCBmbGFncyBmb3Igc2FuaXR5XSkKK0FDX1JVTl9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8c3RkaW8uaD4gXV0sIFtbIGV4aXQoMCk7IF1dKV0sCisJWwlBQ19NU0dfUkVTVUxUKFt5ZXNdKSBdLAorCVsKKwkJQUNfTVNHX1JFU1VMVChbbm9dKQorCQlBQ19NU0dfRVJST1IoWyoqKiBjb21waWxlciBjYW5ub3QgY3JlYXRlIHdvcmtpbmcgZXhlY3V0YWJsZXMsIGNoZWNrIGNvbmZpZy5sb2cgKioqXSkKKwldLAorCVsJQUNfTVNHX1dBUk4oW2Nyb3NzIGNvbXBpbGluZzogbm90IGNoZWNraW5nIGNvbXBpbGVyIHNhbml0eV0pIF0KKykKKworZG5sIENoZWNrcyBmb3IgaGVhZGVyIGZpbGVzLgorIyBDaGVja3MgZm9yIGxpYnJhcmllcy4KK0FDX0NIRUNLX0ZVTkMoW3lwX21hdGNoXSwgLCBbQUNfQ0hFQ0tfTElCKFtuc2xdLCBbeXBfbWF0Y2hdKV0pCitBQ19DSEVDS19GVU5DKFtzZXRzb2Nrb3B0XSwgLCBbQUNfQ0hFQ0tfTElCKFtzb2NrZXRdLCBbc2V0c29ja29wdF0pXSkKKworZG5sIElSSVggYW5kIFNvbGFyaXMgMi41LjEgaGF2ZSBkaXJuYW1lKCkgaW4gbGliZ2VuCitBQ19DSEVDS19GVU5DUyhbZGlybmFtZV0sIFtBQ19DSEVDS19IRUFERVJTKFtsaWJnZW4uaF0pXSAsIFsKKwlBQ19DSEVDS19MSUIoW2dlbl0sIFtkaXJuYW1lXSwgWworCQlBQ19DQUNIRV9DSEVDSyhbZm9yIGJyb2tlbiBkaXJuYW1lXSwKKwkJCWFjX2N2X2hhdmVfYnJva2VuX2Rpcm5hbWUsIFsKKwkJCXNhdmVfTElCUz0iJExJQlMiCisJCQlMSUJTPSIkTElCUyAtbGdlbiIKKwkJCUFDX1JVTl9JRkVMU0UoCisJCQkJW0FDX0xBTkdfU09VUkNFKFtbCisjaW5jbHVkZSA8bGliZ2VuLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGNoYXIgKnMsIGJ1ZlszMl07CisKKyAgICBzdHJuY3B5KGJ1ZiwiL2V0YyIsIDMyKTsKKyAgICBzID0gZGlybmFtZShidWYpOworICAgIGlmICghcyB8fCBzdHJuY21wKHMsICIvIiwgMzIpICE9IDApIHsKKwlleGl0KDEpOworICAgIH0gZWxzZSB7CisJZXhpdCgwKTsKKyAgICB9Cit9CisJCQkJXV0pXSwKKwkJCQlbIGFjX2N2X2hhdmVfYnJva2VuX2Rpcm5hbWU9Im5vIiBdLAorCQkJCVsgYWNfY3ZfaGF2ZV9icm9rZW5fZGlybmFtZT0ieWVzIiBdLAorCQkJCVsgYWNfY3ZfaGF2ZV9icm9rZW5fZGlybmFtZT0ibm8iIF0sCisJCQkpCisJCQlMSUJTPSIkc2F2ZV9MSUJTIgorCQldKQorCQlpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfYnJva2VuX2Rpcm5hbWUiID0gInhubyIgOyB0aGVuCisJCQlMSUJTPSIkTElCUyAtbGdlbiIKKwkJCUFDX0RFRklORShbSEFWRV9ESVJOQU1FXSkKKwkJCUFDX0NIRUNLX0hFQURFUlMoW2xpYmdlbi5oXSkKKwkJZmkKKwldKQorXSkKKworQUNfQ0hFQ0tfRlVOQyhbZ2V0c3BuYW1dLCAsCisJW0FDX0NIRUNLX0xJQihbZ2VuXSwgW2dldHNwbmFtXSwgW0xJQlM9IiRMSUJTIC1sZ2VuIl0pXSkKK0FDX1NFQVJDSF9MSUJTKFtiYXNlbmFtZV0sIFtnZW5dLCBbQUNfREVGSU5FKFtIQVZFX0JBU0VOQU1FXSwgWzFdLAorCVtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGJhc2VuYW1lIGZ1bmN0aW9uLl0pXSkKKworZG5sIHpsaWIgaXMgcmVxdWlyZWQKK0FDX0FSR19XSVRIKFt6bGliXSwKKwlbICAtLXdpdGgtemxpYj1QQVRIICAgICAgICBVc2UgemxpYiBpbiBQQVRIXSwKKwlbIGlmIHRlc3QgIngkd2l0aHZhbCIgPSAieG5vIiA7IHRoZW4KKwkJQUNfTVNHX0VSUk9SKFsqKiogemxpYiBpcyByZXF1aXJlZCAqKipdKQorCSAgZWxpZiB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4eWVzIjsgdGhlbgorCQlpZiB0ZXN0IC1kICIkd2l0aHZhbC9saWIiOyB0aGVuCisJCQlpZiB0ZXN0IC1uICIke25lZWRfZGFzaF9yfSI7IHRoZW4KKwkJCQlMREZMQUdTPSItTCR7d2l0aHZhbH0vbGliIC1SJHt3aXRodmFsfS9saWIgJHtMREZMQUdTfSIKKwkJCWVsc2UKKwkJCQlMREZMQUdTPSItTCR7d2l0aHZhbH0vbGliICR7TERGTEFHU30iCisJCQlmaQorCQllbHNlCisJCQlpZiB0ZXN0IC1uICIke25lZWRfZGFzaF9yfSI7IHRoZW4KKwkJCQlMREZMQUdTPSItTCR7d2l0aHZhbH0gLVIke3dpdGh2YWx9ICR7TERGTEFHU30iCisJCQllbHNlCisJCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9ICR7TERGTEFHU30iCisJCQlmaQorCQlmaQorCQlpZiB0ZXN0IC1kICIkd2l0aHZhbC9pbmNsdWRlIjsgdGhlbgorCQkJQ1BQRkxBR1M9Ii1JJHt3aXRodmFsfS9pbmNsdWRlICR7Q1BQRkxBR1N9IgorCQllbHNlCisJCQlDUFBGTEFHUz0iLUkke3dpdGh2YWx9ICR7Q1BQRkxBR1N9IgorCQlmaQorCWZpIF0KKykKKworQUNfQ0hFQ0tfSEVBREVSKFt6bGliLmhdLCAsW0FDX01TR19FUlJPUihbKioqIHpsaWIuaCBtaXNzaW5nIC0gcGxlYXNlIGluc3RhbGwgZmlyc3Qgb3IgY2hlY2sgY29uZmlnLmxvZyAqKipdKV0pCitBQ19DSEVDS19MSUIoW3pdLCBbZGVmbGF0ZV0sICwKKwlbCisJCXNhdmVkX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCisJCXNhdmVkX0xERkxBR1M9IiRMREZMQUdTIgorCQlzYXZlX0xJQlM9IiRMSUJTIgorCQlkbmwgQ2hlY2sgZGVmYXVsdCB6bGliIGluc3RhbGwgZGlyCisJCWlmIHRlc3QgLW4gIiR7bmVlZF9kYXNoX3J9IjsgdGhlbgorCQkJTERGTEFHUz0iLUwvdXNyL2xvY2FsL2xpYiAtUi91c3IvbG9jYWwvbGliICR7c2F2ZWRfTERGTEFHU30iCisJCWVsc2UKKwkJCUxERkxBR1M9Ii1ML3Vzci9sb2NhbC9saWIgJHtzYXZlZF9MREZMQUdTfSIKKwkJZmkKKwkJQ1BQRkxBR1M9Ii1JL3Vzci9sb2NhbC9pbmNsdWRlICR7c2F2ZWRfQ1BQRkxBR1N9IgorCQlMSUJTPSIkTElCUyAtbHoiCisJCUFDX1RSWV9MSU5LX0ZVTkMoW2RlZmxhdGVdLCBbQUNfREVGSU5FKFtIQVZFX0xJQlpdKV0sCisJCQlbCisJCQkJQUNfTVNHX0VSUk9SKFsqKiogemxpYiBtaXNzaW5nIC0gcGxlYXNlIGluc3RhbGwgZmlyc3Qgb3IgY2hlY2sgY29uZmlnLmxvZyAqKipdKQorCQkJXQorCQkpCisJXQorKQorCitBQ19BUkdfV0lUSChbemxpYi12ZXJzaW9uLWNoZWNrXSwKKwlbICAtLXdpdGhvdXQtemxpYi12ZXJzaW9uLWNoZWNrIERpc2FibGUgemxpYiB2ZXJzaW9uIGNoZWNrXSwKKwlbICBpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInhubyIgOyB0aGVuCisJCXpsaWJfY2hlY2tfbm9uZmF0YWw9MQorCSAgIGZpCisJXQorKQorCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBwb3NzaWJseSBidWdneSB6bGliXSkKK0FDX1JVTl9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8emxpYi5oPgorCV1dLAorCVtbCisJaW50IGE9MCwgYj0wLCBjPTAsIGQ9MCwgbiwgdjsKKwluID0gc3NjYW5mKFpMSUJfVkVSU0lPTiwgIiVkLiVkLiVkLiVkIiwgJmEsICZiLCAmYywgJmQpOworCWlmIChuICE9IDMgJiYgbiAhPSA0KQorCQlleGl0KDEpOworCXYgPSBhKjEwMDAwMDAgKyBiKjEwMDAwICsgYyoxMDAgKyBkOworCWZwcmludGYoc3RkZXJyLCAiZm91bmQgemxpYiB2ZXJzaW9uICVzICglZClcbiIsIFpMSUJfVkVSU0lPTiwgdik7CisKKwkvKiAxLjEuNCBpcyBPSyAqLworCWlmIChhID09IDEgJiYgYiA9PSAxICYmIGMgPj0gNCkKKwkJZXhpdCgwKTsKKworCS8qIDEuMi4zIGFuZCB1cCBhcmUgT0sgKi8KKwlpZiAodiA+PSAxMDIwMzAwKQorCQlleGl0KDApOworCisJZXhpdCgyKTsKKwldXSldLAorCUFDX01TR19SRVNVTFQoW25vXSksCisJWyBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCSAgaWYgdGVzdCAteiAiJHpsaWJfY2hlY2tfbm9uZmF0YWwiIDsgdGhlbgorCQlBQ19NU0dfRVJST1IoWyoqKiB6bGliIHRvbyBvbGQgLSBjaGVjayBjb25maWcubG9nICoqKgorWW91ciByZXBvcnRlZCB6bGliIHZlcnNpb24gaGFzIGtub3duIHNlY3VyaXR5IHByb2JsZW1zLiAgSXQncyBwb3NzaWJsZSB5b3VyCit2ZW5kb3IgaGFzIGZpeGVkIHRoZXNlIHByb2JsZW1zIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHZlcnNpb24gbnVtYmVyLiAgSWYgeW91CithcmUgc3VyZSB0aGlzIGlzIHRoZSBjYXNlLCB5b3UgY2FuIGRpc2FibGUgdGhlIGNoZWNrIGJ5IHJ1bm5pbmcKKyIuL2NvbmZpZ3VyZSAtLXdpdGhvdXQtemxpYi12ZXJzaW9uLWNoZWNrIi4KK0lmIHlvdSBhcmUgaW4gZG91YnQsIHVwZ3JhZGUgemxpYiB0byB2ZXJzaW9uIDEuMi4zIG9yIGdyZWF0ZXIuCitTZWUgaHR0cDovL3d3dy5nemlwLm9yZy96bGliLyBmb3IgZGV0YWlscy5dKQorCSAgZWxzZQorCQlBQ19NU0dfV0FSTihbemxpYiB2ZXJzaW9uIG1heSBoYXZlIHNlY3VyaXR5IHByb2JsZW1zXSkKKwkgIGZpCisJXSwKKwlbCUFDX01TR19XQVJOKFtjcm9zcyBjb21waWxpbmc6IG5vdCBjaGVja2luZyB6bGliIHZlcnNpb25dKSBdCispCisKK2RubCBVbml4V2FyZSAyLngKK0FDX0NIRUNLX0ZVTkMoW3N0cmNhc2VjbXBdLAorCVtdLCBbIEFDX0NIRUNLX0xJQihbcmVzb2x2XSwgW3N0cmNhc2VjbXBdLCBbTElCUz0iJExJQlMgLWxyZXNvbHYiXSkgXQorKQorQUNfQ0hFQ0tfRlVOQ1MoW3V0aW1lc10sCisJW10sIFsgQUNfQ0hFQ0tfTElCKFtjODldLCBbdXRpbWVzXSwgW0FDX0RFRklORShbSEFWRV9VVElNRVNdKQorCQkJCQlMSUJTPSIkTElCUyAtbGM4OSJdKSBdCispCisKK2RubCAgICBDaGVja3MgZm9yIGxpYnV0aWwgZnVuY3Rpb25zCitBQ19DSEVDS19IRUFERVJTKFtsaWJ1dGlsLmhdKQorQUNfU0VBUkNIX0xJQlMoW2ZtdF9zY2FsZWRdLCBbdXRpbCBic2RdKQorQUNfU0VBUkNIX0xJQlMoW2xvZ2luXSwgW3V0aWwgYnNkXSkKK0FDX1NFQVJDSF9MSUJTKFtsb2dvdXRdLCBbdXRpbCBic2RdKQorQUNfU0VBUkNIX0xJQlMoW2xvZ3d0bXBdLCBbdXRpbCBic2RdKQorQUNfU0VBUkNIX0xJQlMoW29wZW5wdHldLCBbdXRpbCBic2RdKQorQUNfU0VBUkNIX0xJQlMoW3VwZHd0bXBdLCBbdXRpbCBic2RdKQorQUNfQ0hFQ0tfRlVOQ1MoW2ZtdF9zY2FsZWQgbG9naW4gbG9nb3V0IG9wZW5wdHkgdXBkd3RtcCBsb2d3dG1wXSkKKworQUNfRlVOQ19TVFJGVElNRQorCisjIENoZWNrIGZvciBBTFRESVJGVU5DIGdsb2IoKSBleHRlbnNpb24KK0FDX01TR19DSEVDS0lORyhbZm9yIEdMT0JfQUxURElSRlVOQyBzdXBwb3J0XSkKK0FDX0VHUkVQX0NQUChbRk9VTkRJVF0sCisJWworCQkjaW5jbHVkZSA8Z2xvYi5oPgorCQkjaWZkZWYgR0xPQl9BTFRESVJGVU5DCisJCUZPVU5ESVQKKwkJI2VuZGlmCisJXSwKKwlbCisJCUFDX0RFRklORShbR0xPQl9IQVNfQUxURElSRlVOQ10sIFsxXSwKKwkJCVtEZWZpbmUgaWYgeW91ciBzeXN0ZW0gZ2xvYigpIGZ1bmN0aW9uIGhhcworCQkJdGhlIEdMT0JfQUxURElSRlVOQyBleHRlbnNpb25dKQorCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCV0sCisJWworCQlBQ19NU0dfUkVTVUxUKFtub10pCisJXQorKQorCisjIENoZWNrIGZvciBnLmdsX21hdGNoYyBnbG9iKCkgZXh0ZW5zaW9uCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBnbF9tYXRjaGMgZmllbGQgaW4gZ2xvYl90XSkKK0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPGdsb2IuaD4gXV0sCisJW1sgZ2xvYl90IGc7IGcuZ2xfbWF0Y2hjID0gMTsgXV0pXSwKKwlbCisJCUFDX0RFRklORShbR0xPQl9IQVNfR0xfTUFUQ0hDXSwgWzFdLAorCQkJW0RlZmluZSBpZiB5b3VyIHN5c3RlbSBnbG9iKCkgZnVuY3Rpb24gaGFzCisJCQlnbF9tYXRjaGMgb3B0aW9ucyBpbiBnbG9iX3RdKQorCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCV0sIFsKKwkJQUNfTVNHX1JFU1VMVChbbm9dKQorXSkKKworIyBDaGVjayBmb3IgZy5nbF9zdGF0diBnbG9iKCkgZXh0ZW5zaW9uCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBnbF9zdGF0diBhbmQgR0xPQl9LRUVQU1RBVCBleHRlbnNpb25zIGZvciBnbG9iXSkKK0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPGdsb2IuaD4gXV0sIFtbCisjaWZuZGVmIEdMT0JfS0VFUFNUQVQKKyNlcnJvciAiZ2xvYiBkb2VzIG5vdCBzdXBwb3J0IEdMT0JfS0VFUFNUQVQgZXh0ZW5zaW9uIgorI2VuZGlmCitnbG9iX3QgZzsKK2cuZ2xfc3RhdHYgPSBOVUxMOworXV0pXSwKKwlbCisJCUFDX0RFRklORShbR0xPQl9IQVNfR0xfU1RBVFZdLCBbMV0sCisJCQlbRGVmaW5lIGlmIHlvdXIgc3lzdGVtIGdsb2IoKSBmdW5jdGlvbiBoYXMKKwkJCWdsX3N0YXR2IG9wdGlvbnMgaW4gZ2xvYl90XSkKKwkJQUNfTVNHX1JFU1VMVChbeWVzXSkKKwldLCBbCisJCUFDX01TR19SRVNVTFQoW25vXSkKKwkKK10pCisKK0FDX0NIRUNLX0RFQ0xTKFtHTE9CX05PTUFUQ0hdLCAsICwgWyNpbmNsdWRlIDxnbG9iLmg+XSkKKworQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHN0cnVjdCBkaXJlbnQgYWxsb2NhdGVzIHNwYWNlIGZvciBkX25hbWVdKQorQUNfUlVOX0lGRUxTRSgKKwlbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+XV0sCisJW1sKKwlzdHJ1Y3QgZGlyZW50IGQ7CisJZXhpdChzaXplb2YoZC5kX25hbWUpPD1zaXplb2YoY2hhcikpOworCV1dKV0sCisJW0FDX01TR19SRVNVTFQoW3llc10pXSwKKwlbCisJCUFDX01TR19SRVNVTFQoW25vXSkKKwkJQUNfREVGSU5FKFtCUk9LRU5fT05FX0JZVEVfRElSRU5UX0RfTkFNRV0sIFsxXSwKKwkJCVtEZWZpbmUgaWYgeW91ciBzdHJ1Y3QgZGlyZW50IGV4cGVjdHMgeW91IHRvCisJCQlhbGxvY2F0ZSBleHRyYSBzcGFjZSBmb3IgZF9uYW1lXSkKKwldLAorCVsKKwkJQUNfTVNHX1dBUk4oW2Nyb3NzIGNvbXBpbGluZzogYXNzdW1pbmcgQlJPS0VOX09ORV9CWVRFX0RJUkVOVF9EX05BTUVdKQorCQlBQ19ERUZJTkUoW0JST0tFTl9PTkVfQllURV9ESVJFTlRfRF9OQU1FXSkKKwldCispCisKK0FDX01TR19DSEVDS0lORyhbZm9yIC9wcm9jL3BpZC9mZCBkaXJlY3RvcnldKQoraWYgdGVzdCAtZCAiL3Byb2MvJCQvZmQiIDsgdGhlbgorCUFDX0RFRklORShbSEFWRV9QUk9DX1BJRF0sIFsxXSwgW0RlZmluZSBpZiB5b3UgaGF2ZSAvcHJvYy8kcGlkL2ZkXSkKKwlBQ19NU0dfUkVTVUxUKFt5ZXNdKQorZWxzZQorCUFDX01TR19SRVNVTFQoW25vXSkKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciB1c2VyIHdhbnRzIFMvS2V5IHN1cHBvcnQKK1NLRVlfTVNHPSJubyIKK0FDX0FSR19XSVRIKFtza2V5XSwKKwlbICAtLXdpdGgtc2tleVtbPVBBVEhdXSAgICAgIEVuYWJsZSBTL0tleSBzdXBwb3J0IChvcHRpb25hbGx5IGluIFBBVEgpXSwKKwlbCisJCWlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgOyB0aGVuCisKKwkJCWlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInh5ZXMiIDsgdGhlbgorCQkJCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLUkke3dpdGh2YWx9L2luY2x1ZGUiCisJCQkJTERGTEFHUz0iJExERkxBR1MgLUwke3dpdGh2YWx9L2xpYiIKKwkJCWZpCisKKwkJCUFDX0RFRklORShbU0tFWV0sIFsxXSwgW0RlZmluZSBpZiB5b3Ugd2FudCBTL0tleSBzdXBwb3J0XSkKKwkJCUxJQlM9Ii1sc2tleSAkTElCUyIKKwkJCVNLRVlfTVNHPSJ5ZXMiCisKKwkJCUFDX01TR19DSEVDS0lORyhbZm9yIHMva2V5IHN1cHBvcnRdKQorCQkJQUNfTElOS19JRkVMU0UoCisJCQkJW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c2tleS5oPgorCQkJCV1dLCBbWworCWNoYXIgKmZmID0gc2tleV9rZXlpbmZvKCIiKTsgZmY9IiI7CisJZXhpdCgwKTsKKwkJCQldXSldLAorCQkJCVtBQ19NU0dfUkVTVUxUKFt5ZXNdKV0sCisJCQkJWworCQkJCQlBQ19NU0dfUkVTVUxUKFtub10pCisJCQkJCUFDX01TR19FUlJPUihbKiogSW5jb21wbGV0ZSBvciBtaXNzaW5nIHMva2V5IGxpYnJhcmllcy5dKQorCQkJCV0pCisgICAgICAgICAgICAgICAgIAlBQ19NU0dfQ0hFQ0tJTkcoW2lmIHNrZXljaGFsbGVuZ2UgdGFrZXMgNCBhcmd1bWVudHNdKQorCQkJQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c2tleS5oPgorCQkJCV1dLCBbWworCSh2b2lkKXNrZXljaGFsbGVuZ2UoTlVMTCwibmFtZSIsIiIsMCk7CisJCQkJXV0pXSwKKwkJCVsKKwkJCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCQkJCUFDX0RFRklORShbU0tFWUNIQUxMRU5HRV80QVJHXSwgWzFdLAorCQkJCQlbRGVmaW5lIGlmIHlvdXIgc2tleWNoYWxsZW5nZSgpCisJCQkJCWZ1bmN0aW9uIHRha2VzIDQgYXJndW1lbnRzIChOZXRCU0QpXSldLAorCQkJWworCQkJCUFDX01TR19SRVNVTFQoW25vXSkKKwkJCV0pCisJCWZpCisJXQorKQorCisjIENoZWNrIHdoZXRoZXIgdXNlciB3YW50cyBUQ1Agd3JhcHBlcnMgc3VwcG9ydAorVENQV19NU0c9Im5vIgorQUNfQVJHX1dJVEgoW3RjcC13cmFwcGVyc10sCisJWyAgLS13aXRoLXRjcC13cmFwcGVyc1tbPVBBVEhdXSBFbmFibGUgdGNwd3JhcHBlcnMgc3VwcG9ydCAob3B0aW9uYWxseSBpbiBQQVRIKV0sCisJWworCQlpZiB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iIDsgdGhlbgorCQkJc2F2ZWRfTElCUz0iJExJQlMiCisJCQlzYXZlZF9MREZMQUdTPSIkTERGTEFHUyIKKwkJCXNhdmVkX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCisJCQlpZiB0ZXN0IC1uICIke3dpdGh2YWx9IiAmJiBcCisJCQkgICAgdGVzdCAieCR7d2l0aHZhbH0iICE9ICJ4eWVzIjsgdGhlbgorCQkJCWlmIHRlc3QgLWQgIiR7d2l0aHZhbH0vbGliIjsgdGhlbgorCQkJCQlpZiB0ZXN0IC1uICIke25lZWRfZGFzaF9yfSI7IHRoZW4KKwkJCQkJCUxERkxBR1M9Ii1MJHt3aXRodmFsfS9saWIgLVIke3dpdGh2YWx9L2xpYiAke0xERkxBR1N9IgorCQkJCQllbHNlCisJCQkJCQlMREZMQUdTPSItTCR7d2l0aHZhbH0vbGliICR7TERGTEFHU30iCisJCQkJCWZpCisJCQkJZWxzZQorCQkJCQlpZiB0ZXN0IC1uICIke25lZWRfZGFzaF9yfSI7IHRoZW4KKwkJCQkJCUxERkxBR1M9Ii1MJHt3aXRodmFsfSAtUiR7d2l0aHZhbH0gJHtMREZMQUdTfSIKKwkJCQkJZWxzZQorCQkJCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9ICR7TERGTEFHU30iCisJCQkJCWZpCisJCQkJZmkKKwkJCQlpZiB0ZXN0IC1kICIke3dpdGh2YWx9L2luY2x1ZGUiOyB0aGVuCisJCQkJCUNQUEZMQUdTPSItSSR7d2l0aHZhbH0vaW5jbHVkZSAke0NQUEZMQUdTfSIKKwkJCQllbHNlCisJCQkJCUNQUEZMQUdTPSItSSR7d2l0aHZhbH0gJHtDUFBGTEFHU30iCisJCQkJZmkKKwkJCWZpCisJCQlMSUJTPSItbHdyYXAgJExJQlMiCisJCQlBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsaWJ3cmFwXSkKKwkJCUFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHRjcGQuaD4KK2ludCBkZW55X3NldmVyaXR5ID0gMCwgYWxsb3dfc2V2ZXJpdHkgPSAwOworCQkJCV1dLCBbWworCWhvc3RzX2FjY2VzcygwKTsKKwkJCQldXSldLCBbCisJCQkJCUFDX01TR19SRVNVTFQoW3llc10pCisJCQkJCUFDX0RFRklORShbTElCV1JBUF0sIFsxXSwKKwkJCQkJCVtEZWZpbmUgaWYgeW91IHdhbnQKKwkJCQkJCVRDUCBXcmFwcGVycyBzdXBwb3J0XSkKKwkJCQkJU1NIRExJQlM9IiRTU0hETElCUyAtbHdyYXAiCisJCQkJCVRDUFdfTVNHPSJ5ZXMiCisJCQkJXSwgWworCQkJCQlBQ19NU0dfRVJST1IoWyoqKiBsaWJ3cmFwIG1pc3NpbmddKQorCQkJCQorCQkJXSkKKwkJCUxJQlM9IiRzYXZlZF9MSUJTIgorCQlmaQorCV0KKykKKworIyBDaGVjayB3aGV0aGVyIHVzZXIgd2FudHMgdG8gdXNlIGxkbnMKK0xETlNfTVNHPSJubyIKK0FDX0FSR19XSVRIKGxkbnMsCisJWyAgLS13aXRoLWxkbnNbWz1QQVRIXV0gICAgICBVc2UgbGRucyBmb3IgRE5TU0VDIHN1cHBvcnQgKG9wdGlvbmFsbHkgaW4gUEFUSCldLAorICAgIFsKKyAgICAgICAgaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KKworCQkJaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieHllcyIgOyB0aGVuCisJCQkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSR7d2l0aHZhbH0vaW5jbHVkZSIKKwkJCQlMREZMQUdTPSIkTERGTEFHUyAtTCR7d2l0aHZhbH0vbGliIgorCQkJZmkKKworICAgICAgICAgICAgQUNfREVGSU5FKEhBVkVfTEROUywgMSwgW0RlZmluZSBpZiB5b3Ugd2FudCBsZG5zIHN1cHBvcnRdKQorICAgICAgICAgICAgTElCUz0iLWxsZG5zICRMSUJTIgorICAgICAgICAgICAgTEROU19NU0c9InllcyIKKworICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGRucyBzdXBwb3J0XSkKKyAgICAgICAgICAgIEFDX0xJTktfSUZFTFNFKAorICAgICAgICAgICAgICAgIFtBQ19MQU5HX1NPVVJDRShbWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8bGRucy9sZG5zLmg+CitpbnQgbWFpbigpIHsgbGRuc19zdGF0dXMgc3RhdHVzID0gbGRuc192ZXJpZnlfdHJ1c3RlZChOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsgc3RhdHVzPUxETlNfU1RBVFVTX09LOyBleGl0KDApOyB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1dKQorICAgICAgICAgICAgICAgIF0sCisJCQkJW0FDX01TR19SRVNVTFQoeWVzKV0sCisJCQkJWworCQkJCQlBQ19NU0dfUkVTVUxUKG5vKQorCQkJCQlBQ19NU0dfRVJST1IoWyoqIEluY29tcGxldGUgb3IgbWlzc2luZyBsZG5zIGxpYnJhcmllcy5dKQorCQkJCV0pCisgICAgICAgIGZpCisgICAgXQorKQorCisjIENoZWNrIHdoZXRoZXIgdXNlciB3YW50cyBsaWJlZGl0IHN1cHBvcnQKK0xJQkVESVRfTVNHPSJubyIKK0FDX0FSR19XSVRIKFtsaWJlZGl0XSwKKwlbICAtLXdpdGgtbGliZWRpdFtbPVBBVEhdXSAgIEVuYWJsZSBsaWJlZGl0IHN1cHBvcnQgZm9yIHNmdHBdLAorCVsgaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KKwkJaWYgdGVzdCAieCR3aXRodmFsIiA9ICJ4eWVzIiA7IHRoZW4KKwkJCUFDX1BBVEhfUFJPRyhbUEtHQ09ORklHXSwgW3BrZy1jb25maWddLCBbbm9dKQorCQkJaWYgdGVzdCAieCRQS0dDT05GSUciICE9ICJ4bm8iOyB0aGVuCisJCQkJQUNfTVNHX0NIRUNLSU5HKFtpZiAkUEtHQ09ORklHIGtub3dzIGFib3V0IGxpYmVkaXRdKQorCQkJIAlpZiAiJFBLR0NPTkZJRyIgbGliZWRpdDsgdGhlbgorCQkJCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCQkJCQl1c2VfcGtnY29uZmlnX2Zvcl9saWJlZGl0PXllcworCQkJCWVsc2UKKwkJCQkJQUNfTVNHX1JFU1VMVChbbm9dKQorCQkJCWZpCisJCQlmaQorCQllbHNlCisJCQlDUFBGTEFHUz0iJENQUEZMQUdTIC1JJHt3aXRodmFsfS9pbmNsdWRlIgorCQkJaWYgdGVzdCAtbiAiJHtuZWVkX2Rhc2hfcn0iOyB0aGVuCisJCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9L2xpYiAtUiR7d2l0aHZhbH0vbGliICR7TERGTEFHU30iCisJCQllbHNlCisJCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9L2xpYiAke0xERkxBR1N9IgorCQkJZmkKKwkJZmkKKwkJaWYgdGVzdCAieCR1c2VfcGtnY29uZmlnX2Zvcl9saWJlZGl0IiA9ICJ4eWVzIjsgdGhlbgorCQkJTElCRURJVD1gJFBLR0NPTkZJRyAtLWxpYnMtb25seS1sIGxpYmVkaXRgCisJCQlDUFBGTEFHUz0iJENQUEZMQUdTIGAkUEtHQ09ORklHIC0tY2ZsYWdzIGxpYmVkaXRgIgorCQllbHNlCisJCQlMSUJFRElUPSItbGVkaXQgLWxjdXJzZXMiCisJCWZpCisJCU9USEVSTElCUz1gZWNobyAkTElCRURJVCB8IHNlZCAncy8tbGVkaXQvLydgCisJCUFDX0NIRUNLX0xJQihbZWRpdF0sIFtlbF9pbml0XSwKKwkJCVsgQUNfREVGSU5FKFtVU0VfTElCRURJVF0sIFsxXSwgW1VzZSBsaWJlZGl0IGZvciBzZnRwXSkKKwkJCSAgTElCRURJVF9NU0c9InllcyIKKwkJCSAgQUNfU1VCU1QoW0xJQkVESVRdKQorCQkJXSwKKwkJCVsgQUNfTVNHX0VSUk9SKFtsaWJlZGl0IG5vdCBmb3VuZF0pIF0sCisJCQlbICRPVEhFUkxJQlMgXQorCQkpCisJCUFDX01TR19DSEVDS0lORyhbaWYgbGliZWRpdCB2ZXJzaW9uIGlzIGNvbXBhdGlibGVdKQorCQlBQ19DT01QSUxFX0lGRUxTRSgKKwkJICAgIFtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPGhpc3RlZGl0Lmg+IF1dLAorCQkgICAgW1sKKwlpbnQgaSA9IEhfU0VUU0laRTsKKwllbF9pbml0KCIiLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlleGl0KDApOworCQkgICAgXV0pXSwKKwkJICAgIFsgQUNfTVNHX1JFU1VMVChbeWVzXSkgXSwKKwkJICAgIFsgQUNfTVNHX1JFU1VMVChbbm9dKQorCQkgICAgICBBQ19NU0dfRVJST1IoW2xpYmVkaXQgdmVyc2lvbiBpcyBub3QgY29tcGF0aWJsZV0pIF0KKwkJKQorCWZpIF0KKykKKworQVVESVRfTU9EVUxFPW5vbmUKK0FDX0FSR19XSVRIKFthdWRpdF0sCisJWyAgLS13aXRoLWF1ZGl0PW1vZHVsZSAgICAgRW5hYmxlIGF1ZGl0IHN1cHBvcnQgKG1vZHVsZXM9ZGVidWcsYnNtLGxpbnV4KV0sCisJWworCSAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3VwcG9ydGVkIGF1ZGl0IG1vZHVsZV0pCisJICBjYXNlICIkd2l0aHZhbCIgaW4KKwkgIGJzbSkKKwkJQUNfTVNHX1JFU1VMVChbYnNtXSkKKwkJQVVESVRfTU9EVUxFPWJzbQorCQlkbmwgICAgQ2hlY2tzIGZvciBoZWFkZXJzLCBsaWJzIGFuZCBmdW5jdGlvbnMKKwkJQUNfQ0hFQ0tfSEVBREVSUyhbYnNtL2F1ZGl0LmhdLCBbXSwKKwkJICAgIFtBQ19NU0dfRVJST1IoW0JTTSBlbmFibGVkIGFuZCBic20vYXVkaXQuaCBub3QgZm91bmRdKV0sCisJCSAgICBbCisjaWZkZWYgSEFWRV9USU1FX0gKKyMgaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisJCSAgICBdCispCisJCUFDX0NIRUNLX0xJQihbYnNtXSwgW2dldGF1ZGl0XSwgW10sCisJCSAgICBbQUNfTVNHX0VSUk9SKFtCU00gZW5hYmxlZCBhbmQgcmVxdWlyZWQgbGlicmFyeSBub3QgZm91bmRdKV0pCisJCUFDX0NIRUNLX0ZVTkNTKFtnZXRhdWRpdF0sIFtdLAorCQkgICAgW0FDX01TR19FUlJPUihbQlNNIGVuYWJsZWQgYW5kIHJlcXVpcmVkIGZ1bmN0aW9uIG5vdCBmb3VuZF0pXSkKKwkJIyBUaGVzZSBhcmUgb3B0aW9uYWwKKwkJQUNfQ0hFQ0tfRlVOQ1MoW2dldGF1ZGl0X2FkZHIgYXVnX2dldF9tYWNoaW5lXSkKKwkJQUNfREVGSU5FKFtVU0VfQlNNX0FVRElUXSwgWzFdLCBbVXNlIEJTTSBhdWRpdCBtb2R1bGVdKQorCQlpZiB0ZXN0ICIkc29sMnZlciIgLWVxIDExOyB0aGVuCisJCSAgIAlTU0hETElCUz0iJFNTSERMSUJTIC1sc2NmIgorICAgICAgICAgICAgICAgICAgIAlBQ19ERUZJTkUoW0JST0tFTl9CU01fQVBJXSwgWzFdLCAKKwkJICAgICAgICAJICBbVGhlIHN5c3RlbSBoYXMgaW5jb21wbGV0ZSBCU00gQVBJXSkKKwkJZmkKKwkJOzsKKwkgIGxpbnV4KQorCQlBQ19NU0dfUkVTVUxUKFtsaW51eF0pCisJCUFVRElUX01PRFVMRT1saW51eAorCQlkbmwgICAgQ2hlY2tzIGZvciBoZWFkZXJzLCBsaWJzIGFuZCBmdW5jdGlvbnMKKwkJQUNfQ0hFQ0tfSEVBREVSUyhbbGliYXVkaXQuaF0pCisJCVNTSERMSUJTPSIkU1NIRExJQlMgLWxhdWRpdCIKKwkJQUNfREVGSU5FKFtVU0VfTElOVVhfQVVESVRdLCBbMV0sIFtVc2UgTGludXggYXVkaXQgbW9kdWxlXSkKKwkJOzsKKwkgIGRlYnVnKQorCQlBVURJVF9NT0RVTEU9ZGVidWcKKwkJQUNfTVNHX1JFU1VMVChbZGVidWddKQorCQlBQ19ERUZJTkUoW1NTSF9BVURJVF9FVkVOVFNdLCBbMV0sIFtVc2UgYXVkaXQgZGVidWdnaW5nIG1vZHVsZV0pCisJCTs7CisJICBubykKKwkJQUNfTVNHX1JFU1VMVChbbm9dKQorCQk7OworCSAgKikKKwkJQUNfTVNHX0VSUk9SKFtVbmtub3duIGF1ZGl0IG1vZHVsZSAkd2l0aHZhbF0pCisJCTs7CisJZXNhYyBdCispCisKK2RubCAgICBDaGVja3MgZm9yIGxpYnJhcnkgZnVuY3Rpb25zLiBQbGVhc2Uga2VlcCBpbiBhbHBoYWJldGljYWwgb3JkZXIKK0FDX0NIRUNLX0ZVTkNTKFsgXAorCWFyYzRyYW5kb20gXAorCWFyYzRyYW5kb21fYnVmIFwKKwlhcmM0cmFuZG9tX3VuaWZvcm0gXAorCWFzcHJpbnRmIFwKKwliNjRfbnRvcCBcCisJX19iNjRfbnRvcCBcCisJYjY0X3B0b24gXAorCV9fYjY0X3B0b24gXAorCWJjb3B5IFwKKwliaW5kcmVzdnBvcnRfc2EgXAorCWNsb2NrIFwKKwljbG9zZWZyb20gXAorCWRpcmZkIFwKKwlmY2htb2QgXAorCWZjaG93biBcCisJZnJlZWFkZHJpbmZvIFwKKwlmc3RhdHZmcyBcCisJZnV0aW1lcyBcCisJZ2V0YWRkcmluZm8gXAorCWdldGN3ZCBcCisJZ2V0Z3JvdXBsaXN0IFwKKwlnZXRuYW1laW5mbyBcCisJZ2V0b3B0IFwKKwlnZXRwZWVyZWlkIFwKKwlnZXRwZWVydWNyZWQgXAorCV9nZXRwdHkgXAorCWdldHJsaW1pdCBcCisJZ2V0dHR5ZW50IFwKKwlnbG9iIFwKKwlncm91cF9mcm9tX2dpZCBcCisJaW5ldF9hdG9uIFwKKwlpbmV0X250b2EgXAorCWluZXRfbnRvcCBcCisJaW5uZXRnciBcCisJbG9naW5fZ2V0Y2FwYm9vbCBcCisJbWQ1X2NyeXB0IFwKKwltZW1tb3ZlIFwKKwlta2R0ZW1wIFwKKwltbWFwIFwKKwluZ2V0YWRkcmluZm8gXAorCW5zbGVlcCBcCisJb2dldGFkZHJpbmZvIFwKKwlvcGVubG9nX3IgXAorCXBvbGwgXAorCXByY3RsIFwKKwlwc3RhdCBcCisJcmVhZHBhc3NwaHJhc2UgXAorCXJlYWxwYXRoIFwKKwlyZWN2bXNnIFwKKwlycmVzdnBvcnRfYWYgXAorCXNlbmRtc2cgXAorCXNldGR0YWJsZXNpemUgXAorCXNldGVnaWQgXAorCXNldGVudiBcCisJc2V0ZXVpZCBcCisJc2V0Z3JvdXBlbnQgXAorCXNldGdyb3VwcyBcCisJc2V0bG9naW4gXAorCXNldHBhc3NlbnRcCisJc2V0cGNyZWQgXAorCXNldHByb2N0aXRsZSBcCisJc2V0cmVnaWQgXAorCXNldHJldWlkIFwKKwlzZXRybGltaXQgXAorCXNldHNpZCBcCisJc2V0dmJ1ZiBcCisJc2lnYWN0aW9uIFwKKwlzaWd2ZWMgXAorCXNucHJpbnRmIFwKKwlzb2NrZXRwYWlyIFwKKwlzdGF0ZnMgXAorCXN0YXR2ZnMgXAorCXN0cmR1cCBcCisJc3RyZXJyb3IgXAorCXN0cmxjYXQgXAorCXN0cmxjcHkgXAorCXN0cm1vZGUgXAorCXN0cm5sZW4gXAorCXN0cm52aXMgXAorCXN0cnB0aW1lIFwKKwlzdHJ0b251bSBcCisJc3RydG9sbCBcCisJc3RydG91bCBcCisJc3dhcDMyIFwKKwlzeXNjb25mIFwKKwl0Y2dldHBncnAgXAorCXRpbWluZ3NhZmVfYmNtcCBcCisJdHJ1bmNhdGUgXAorCXVuc2V0ZW52IFwKKwl1cGR3dG1weCBcCisJdXNlcl9mcm9tX3VpZCBcCisJdmFzcHJpbnRmIFwKKwl2aGFuZ3VwIFwKKwl2c25wcmludGYgXAorCXdhaXRwaWQgXAorXSkKKworQUNfTElOS19JRkVMU0UoCisgICAgICAgIFtBQ19MQU5HX1BST0dSQU0oCisgICAgICAgICAgIFtbICNpbmNsdWRlIDxjdHlwZS5oPiBdXSwKKyAgICAgICAgICAgW1sgcmV0dXJuIChpc2JsYW5rKCdhJykpOyBdXSldLAorCVtBQ19ERUZJTkUoW0hBVkVfSVNCTEFOS10sIFsxXSwgW0RlZmluZSBpZiB5b3UgaGF2ZSBpc2JsYW5rKDNDKS5dKQorXSkKKworIyBQS0NTIzExIHN1cHBvcnQgcmVxdWlyZXMgZGxvcGVuKCkgYW5kIGNvCitBQ19TRUFSQ0hfTElCUyhbZGxvcGVuXSwgW2RsXSwKKyAgICBbQUNfREVGSU5FKFtFTkFCTEVfUEtDUzExXSwgW10sIFtFbmFibGUgZm9yIFBLQ1MjMTEgc3VwcG9ydF0pXQorKQorCisjIElSSVggaGFzIGEgY29uc3QgY2hhciByZXR1cm4gdmFsdWUgZm9yIGdhaV9zdHJlcnJvcigpCitBQ19DSEVDS19GVU5DUyhbZ2FpX3N0cmVycm9yXSwgWworCUFDX0RFRklORShbSEFWRV9HQUlfU1RSRVJST1JdKQorCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKworY29uc3QgY2hhciAqZ2FpX3N0cmVycm9yKGludCk7CisJCQldXSwgW1sKKwljaGFyICpzdHI7CisJc3RyID0gZ2FpX3N0cmVycm9yKDApOworCQkJXV0pXSwgWworCQlBQ19ERUZJTkUoW0hBVkVfQ09OU1RfR0FJX1NUUkVSUk9SX1BST1RPXSwgWzFdLAorCQlbRGVmaW5lIGlmIGdhaV9zdHJlcnJvcigpIHJldHVybnMgY29uc3QgY2hhciAqXSldLCBbXSldKQorCitBQ19TRUFSQ0hfTElCUyhbbmFub3NsZWVwXSwgW3J0IHBvc2l4NF0sIFtBQ19ERUZJTkUoW0hBVkVfTkFOT1NMRUVQXSwgWzFdLAorCVtTb21lIHN5c3RlbXMgcHV0IG5hbm9zbGVlcCBvdXRzaWRlIG9mIGxpYmNdKV0pCisKK2RubCBNYWtlIHN1cmUgcHJvdG90eXBlcyBhcmUgZGVmaW5lZCBmb3IgdGhlc2UgYmVmb3JlIHVzaW5nIHRoZW0uCitBQ19DSEVDS19ERUNMKFtnZXRydXNhZ2VdLCBbQUNfQ0hFQ0tfRlVOQ1MoW2dldHJ1c2FnZV0pXSkKK0FDX0NIRUNLX0RFQ0woW3N0cnNlcF0sCisJW0FDX0NIRUNLX0ZVTkNTKFtzdHJzZXBdKV0sCisJW10sCisJWworI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKwldKQorCitkbmwgdGNzZW5kYnJlYWsgbWlnaHQgYmUgYSBtYWNybworQUNfQ0hFQ0tfREVDTChbdGNzZW5kYnJlYWtdLAorCVtBQ19ERUZJTkUoW0hBVkVfVENTRU5EQlJFQUtdKV0sCisJW0FDX0NIRUNLX0ZVTkNTKFt0Y3NlbmRicmVha10pXSwKKwlbI2luY2x1ZGUgPHRlcm1pb3MuaD5dCispCisKK0FDX0NIRUNLX0RFQ0xTKFtoX2Vycm5vXSwgLCAsWyNpbmNsdWRlIDxuZXRkYi5oPl0pCisKK0FDX0NIRUNLX0RFQ0xTKFtTSFVUX1JEXSwgLCAsCisJWworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKwldKQorCitBQ19DSEVDS19ERUNMUyhbT19OT05CTE9DS10sICwgLAorCVsKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfRkNOVExfSAorIyBpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisJXSkKKworQUNfQ0hFQ0tfREVDTFMoW3dyaXRldl0sICwgLCBbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCV0pCisKK0FDX0NIRUNLX0RFQ0xTKFtNQVhTWU1MSU5LU10sICwgLCBbCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisJXSkKKworQUNfQ0hFQ0tfREVDTFMoW29mZnNldG9mXSwgLCAsIFsKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKwldKQorCitBQ19DSEVDS19GVU5DUyhbc2V0cmVzdWlkXSwgWworCWRubCBTb21lIHBsYXRvcm1zIGhhdmUgc2V0cmVzdWlkIHRoYXQgaXNuJ3QgaW1wbGVtZW50ZWQsIHRlc3QgZm9yIHRoaXMKKwlBQ19NU0dfQ0hFQ0tJTkcoW2lmIHNldHJlc3VpZCBzZWVtcyB0byB3b3JrXSkKKwlBQ19SVU5fSUZFTFNFKAorCQlbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKwkJXV0sIFtbCisJZXJybm89MDsKKwlzZXRyZXN1aWQoMCwwLDApOworCWlmIChlcnJubz09RU5PU1lTKQorCQlleGl0KDEpOworCWVsc2UKKwkJZXhpdCgwKTsKKwkJXV0pXSwKKwkJW0FDX01TR19SRVNVTFQoW3llc10pXSwKKwkJW0FDX0RFRklORShbQlJPS0VOX1NFVFJFU1VJRF0sIFsxXSwKKwkJCVtEZWZpbmUgaWYgeW91ciBzZXRyZXN1aWQoKSBpcyBicm9rZW5dKQorCQkgQUNfTVNHX1JFU1VMVChbbm90IGltcGxlbWVudGVkXSldLAorCQlbQUNfTVNHX1dBUk4oW2Nyb3NzIGNvbXBpbGluZzogbm90IGNoZWNraW5nIHNldHJlc3VpZF0pXQorCSkKK10pCisKK0FDX0NIRUNLX0ZVTkNTKFtzZXRyZXNnaWRdLCBbCisJZG5sIFNvbWUgcGxhdG9ybXMgaGF2ZSBzZXRyZXNnaWQgdGhhdCBpc24ndCBpbXBsZW1lbnRlZCwgdGVzdCBmb3IgdGhpcworCUFDX01TR19DSEVDS0lORyhbaWYgc2V0cmVzZ2lkIHNlZW1zIHRvIHdvcmtdKQorCUFDX1JVTl9JRkVMU0UoCisJCVtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCQldXSwgW1sKKwllcnJubz0wOworCXNldHJlc2dpZCgwLDAsMCk7CisJaWYgKGVycm5vPT1FTk9TWVMpCisJCWV4aXQoMSk7CisJZWxzZQorCQlleGl0KDApOworCQldXSldLAorCQlbQUNfTVNHX1JFU1VMVChbeWVzXSldLAorCQlbQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVTR0lEXSwgWzFdLAorCQkJW0RlZmluZSBpZiB5b3VyIHNldHJlc2dpZCgpIGlzIGJyb2tlbl0pCisJCSBBQ19NU0dfUkVTVUxUKFtub3QgaW1wbGVtZW50ZWRdKV0sCisJCVtBQ19NU0dfV0FSTihbY3Jvc3MgY29tcGlsaW5nOiBub3QgY2hlY2tpbmcgc2V0cmVzdWlkXSldCisJKQorXSkKKworZG5sICAgIENoZWNrcyBmb3IgdGltZSBmdW5jdGlvbnMKK0FDX0NIRUNLX0ZVTkNTKFtnZXR0aW1lb2ZkYXkgdGltZV0pCitkbmwgICAgQ2hlY2tzIGZvciB1dG1wIGZ1bmN0aW9ucworQUNfQ0hFQ0tfRlVOQ1MoW2VuZHV0ZW50IGdldHV0ZW50IGdldHV0aWQgZ2V0dXRsaW5lIHB1dHV0bGluZSBzZXR1dGVudF0pCitBQ19DSEVDS19GVU5DUyhbdXRtcG5hbWVdKQorZG5sICAgIENoZWNrcyBmb3IgdXRtcHggZnVuY3Rpb25zCitBQ19DSEVDS19GVU5DUyhbZW5kdXR4ZW50IGdldHV0eGVudCBnZXR1dHhpZCBnZXR1dHhsaW5lIGdldHV0eHVzZXIgcHV0dXR4bGluZV0pCitBQ19DSEVDS19GVU5DUyhbc2V0dXR4ZGIgc2V0dXR4ZW50IHV0bXB4bmFtZV0pCitkbmwgICAgQ2hlY2tzIGZvciBsYXN0bG9nIGZ1bmN0aW9ucworQUNfQ0hFQ0tfRlVOQ1MoW2dldGxhc3Rsb2d4YnluYW1lXSkKKworQUNfQ0hFQ0tfRlVOQyhbZGFlbW9uXSwKKwlbQUNfREVGSU5FKFtIQVZFX0RBRU1PTl0sIFsxXSwgW0RlZmluZSBpZiB5b3VyIGxpYnJhcmllcyBkZWZpbmUgZGFlbW9uKCldKV0sCisJW0FDX0NIRUNLX0xJQihbYnNkXSwgW2RhZW1vbl0sCisJCVtMSUJTPSIkTElCUyAtbGJzZCI7IEFDX0RFRklORShbSEFWRV9EQUVNT05dKV0pXQorKQorCitBQ19DSEVDS19GVU5DKFtnZXRwYWdlc2l6ZV0sCisJW0FDX0RFRklORShbSEFWRV9HRVRQQUdFU0laRV0sIFsxXSwKKwkJW0RlZmluZSBpZiB5b3VyIGxpYnJhcmllcyBkZWZpbmUgZ2V0cGFnZXNpemUoKV0pXSwKKwlbQUNfQ0hFQ0tfTElCKFt1Y2JdLCBbZ2V0cGFnZXNpemVdLAorCQlbTElCUz0iJExJQlMgLWx1Y2IiOyBBQ19ERUZJTkUoW0hBVkVfR0VUUEFHRVNJWkVdKV0pXQorKQorCisjIENoZWNrIGZvciBicm9rZW4gc25wcmludGYKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19zbnByaW50ZiIgPSAieHllcyIgOyB0aGVuCisJQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHNucHJpbnRmIGNvcnJlY3RseSB0ZXJtaW5hdGVzIGxvbmcgc3RyaW5nc10pCisJQUNfUlVOX0lGRUxTRSgKKwkJW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8c3RkaW8uaD4gXV0sCisJCVtbCisJY2hhciBiWzVdOworCXNucHJpbnRmKGIsNSwiMTIzNDU2Nzg5Iik7CisJZXhpdChiWzRdIT0nXDAnKTsgCisJCV1dKV0sCisJCVtBQ19NU0dfUkVTVUxUKFt5ZXNdKV0sCisJCVsKKwkJCUFDX01TR19SRVNVTFQoW25vXSkKKwkJCUFDX0RFRklORShbQlJPS0VOX1NOUFJJTlRGXSwgWzFdLAorCQkJCVtEZWZpbmUgaWYgeW91ciBzbnByaW50ZiBpcyBidXN0ZWRdKQorCQkJQUNfTVNHX1dBUk4oWyoqKioqKiBZb3VyIHNucHJpbnRmKCkgZnVuY3Rpb24gaXMgYnJva2VuLCBjb21wbGFpbiB0byB5b3VyIHZlbmRvcl0pCisJCV0sCisJCVsgQUNfTVNHX1dBUk4oW2Nyb3NzIGNvbXBpbGluZzogQXNzdW1pbmcgd29ya2luZyBzbnByaW50ZigpXSkgXQorCSkKK2ZpCisKKyMgSWYgd2UgZG9uJ3QgaGF2ZSBhIHdvcmtpbmcgYXNwcmludGYsIHRoZW4gd2Ugc3Ryb25nbHkgZGVwZW5kIG9uIHZzbnByaW50ZgorIyByZXR1cm5pbmcgdGhlIHJpZ2h0IHRoaW5nIG9uIG92ZXJmbG93OiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaXQgdHJpZWQgdG8KKyMgY3JlYXRlIChhcyBwZXIgU1VTdjMpCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfYXNwcmludGYiICE9ICJ4eWVzIiAmJiBcCisgICB0ZXN0ICJ4JGFjX2N2X2Z1bmNfdnNucHJpbnRmIiA9ICJ4eWVzIiA7IHRoZW4KKwlBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdnNucHJpbnRmIHJldHVybnMgY29ycmVjdCB2YWx1ZXMgb24gb3ZlcmZsb3ddKQorCUFDX1JVTl9JRkVMU0UoCisJCVtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitpbnQgeF9zbnByaW50ZihjaGFyICpzdHIsc2l6ZV90IGNvdW50LGNvbnN0IGNoYXIgKmZtdCwuLi4pCit7CisJc2l6ZV90IHJldDsgdmFfbGlzdCBhcDsKKwl2YV9zdGFydChhcCwgZm10KTsgcmV0ID0gdnNucHJpbnRmKHN0ciwgY291bnQsIGZtdCwgYXApOyB2YV9lbmQoYXApOworCXJldHVybiByZXQ7Cit9CisJCV1dLCBbWworCWNoYXIgeFsxXTsKKwlleGl0KHhfc25wcmludGYoeCwgMSwgIiVzICVkIiwgImhlbGxvIiwgMTIzNDUpID09IDExID8gMCA6IDEpOworCQldXSldLAorCQlbQUNfTVNHX1JFU1VMVChbeWVzXSldLAorCQlbCisJCQlBQ19NU0dfUkVTVUxUKFtub10pCisJCQlBQ19ERUZJTkUoW0JST0tFTl9TTlBSSU5URl0sIFsxXSwKKwkJCQlbRGVmaW5lIGlmIHlvdXIgc25wcmludGYgaXMgYnVzdGVkXSkKKwkJCUFDX01TR19XQVJOKFsqKioqKiogWW91ciB2c25wcmludGYoKSBmdW5jdGlvbiBpcyBicm9rZW4sIGNvbXBsYWluIHRvIHlvdXIgdmVuZG9yXSkKKwkJXSwKKwkJWyBBQ19NU0dfV0FSTihbY3Jvc3MgY29tcGlsaW5nOiBBc3N1bWluZyB3b3JraW5nIHZzbnByaW50ZigpXSkgXQorCSkKK2ZpCisKKyMgT24gc3lzdGVtcyB3aGVyZSBbdl1zbnByaW50ZiBpcyBicm9rZW4sIGJ1dCBpcyBkZWNsYXJlZCBpbiBzdGRpbywKKyMgY2hlY2sgdGhhdCB0aGUgZm10IGFyZ3VtZW50IGlzIGNvbnN0IGNoYXIgKiBvciBqdXN0IGNoYXIgKi4KKyMgVGhpcyBpcyBvbmx5IHVzZWZ1bCBmb3Igd2hlbiBCUk9LRU5fU05QUklOVEYKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciBzbnByaW50ZiBjYW4gZGVjbGFyZSBjb25zdCBjaGFyICpmbXRdKQorQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQgc25wcmludGYoY2hhciAqYSwgc2l6ZV90IGIsIGNvbnN0IGNoYXIgKmMsIC4uLikgeyByZXR1cm4gMDsgfQorCQldXSwgW1sKKwlzbnByaW50ZigwLCAwLCAwKTsKKwkJXV0pXSwKKyAgIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgIEFDX0RFRklORShbU05QUklOVEZfQ09OU1RdLCBbY29uc3RdLAorICAgICAgICAgICAgICBbRGVmaW5lIGFzIGNvbnN0IGlmIHNucHJpbnRmKCkgY2FuIGRlY2xhcmUgY29uc3QgY2hhciAqZm10XSldLAorICAgW0FDX01TR19SRVNVTFQoW25vXSkKKyAgICBBQ19ERUZJTkUoW1NOUFJJTlRGX0NPTlNUXSwgWy8qIG5vdCBjb25zdCAqL10pXSkKKworIyBDaGVjayBmb3IgbWlzc2luZyBnZXRwZWVyZWlkIChvciBlcXVpdikgc3VwcG9ydAorTk9fUEVFUkNIRUNLPSIiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0cGVlcmVpZCIgIT0gInh5ZXMiIC1hICJ4JGFjX2N2X2Z1bmNfZ2V0cGVlcnVjcmVkIiAhPSAieHllcyI7IHRoZW4KKwlBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgc3lzdGVtIHN1cHBvcnRzIFNPX1BFRVJDUkVEIGdldHNvY2tvcHRdKQorCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+XV0sIFtbaW50IGkgPSBTT19QRUVSQ1JFRDtdXSldLAorCQlbIEFDX01TR19SRVNVTFQoW3llc10pCisJCSAgQUNfREVGSU5FKFtIQVZFX1NPX1BFRVJDUkVEXSwgWzFdLCBbSGF2ZSBQRUVSQ1JFRCBzb2NrZXQgb3B0aW9uXSkKKwkJXSwgW0FDX01TR19SRVNVTFQoW25vXSkKKwkJTk9fUEVFUkNIRUNLPTEKKyAgICAgICAgXSkKK2ZpCisKK2RubCBzZWUgd2hldGhlciBta3N0ZW1wKCkgcmVxdWlyZXMgWFhYWFhYCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfbWtkdGVtcCIgPSAieHllcyIgOyB0aGVuCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAob3Zlcmx5KSBzdHJpY3QgbWtzdGVtcF0pCitBQ19SVU5fSUZFTFNFKAorCVtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKwldXSwgW1sKKwljaGFyIHRlbXBsYXRlW109ImNvbmZ0ZXN0Lm1rc3RlbXAtdGVzdCI7CisJaWYgKG1rc3RlbXAodGVtcGxhdGUpID09IC0xKQorCQlleGl0KDEpOworCXVubGluayh0ZW1wbGF0ZSk7CisJZXhpdCgwKTsKKwldXSldLAorCVsKKwkJQUNfTVNHX1JFU1VMVChbbm9dKQorCV0sCisJWworCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCQlBQ19ERUZJTkUoW0hBVkVfU1RSSUNUX01LU1RFTVBdLCBbMV0sIFtTaWxseSBta3N0ZW1wKCldKQorCV0sCisJWworCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCQlBQ19ERUZJTkUoW0hBVkVfU1RSSUNUX01LU1RFTVBdKQorCV0KKykKK2ZpCisKK2RubCBtYWtlIHN1cmUgdGhhdCBvcGVucHR5IGRvZXMgbm90IHJlYWNxdWlyZSBjb250cm9sbGluZyB0ZXJtaW5hbAoraWYgdGVzdCAhIC16ICIkY2hlY2tfZm9yX29wZW5wdHlfY3R0eV9idWciOyB0aGVuCisJQUNfTVNHX0NIRUNLSU5HKFtpZiBvcGVucHR5IGNvcnJlY3RseSBoYW5kbGVzIGNvbnRyb2xsaW5nIHR0eV0pCisJQUNfUlVOX0lGRUxTRSgKKwkJW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKwkJXV0sIFtbCisJcGlkX3QgcGlkOworCWludCBmZCwgcHR5ZmQsIHR0eWZkLCBzdGF0dXM7CisKKwlwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA8IDApIHsJCS8qIGZhaWxlZCAqLworCQlleGl0KDEpOworCX0gZWxzZSBpZiAocGlkID4gMCkgewkvKiBwYXJlbnQgKi8KKwkJd2FpdHBpZChwaWQsICZzdGF0dXMsIDApOworCQlpZiAoV0lGRVhJVEVEKHN0YXR1cykpCisJCQlleGl0KFdFWElUU1RBVFVTKHN0YXR1cykpOworCQllbHNlCisJCQlleGl0KDIpOworCX0gZWxzZSB7CQkvKiBjaGlsZCAqLworCQljbG9zZSgwKTsgY2xvc2UoMSk7IGNsb3NlKDIpOworCQlzZXRzaWQoKTsKKwkJb3BlbnB0eSgmcHR5ZmQsICZ0dHlmZCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCWZkID0gb3BlbigiL2Rldi90dHkiLCBPX1JEV1IgfCBPX05PQ1RUWSk7CisJCWlmIChmZCA+PSAwKQorCQkJZXhpdCgzKTsJLyogQWNxdWlyZWQgY3R0eTogYnJva2VuICovCisJCWVsc2UKKwkJCWV4aXQoMCk7CS8qIERpZCBub3QgYWNxdWlyZSBjdHR5OiBPSyAqLworCX0KKwkJXV0pXSwKKwkJWworCQkJQUNfTVNHX1JFU1VMVChbeWVzXSkKKwkJXSwKKwkJWworCQkJQUNfTVNHX1JFU1VMVChbbm9dKQorCQkJQUNfREVGSU5FKFtTU0hEX0FDUVVJUkVTX0NUVFldKQorCQldLAorCQlbCisJCQlBQ19NU0dfUkVTVUxUKFtjcm9zcy1jb21waWxpbmcsIGFzc3VtaW5nIHllc10pCisJCV0KKwkpCitmaQorCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0YWRkcmluZm8iID0gInh5ZXMiICYmIFwKKyAgICB0ZXN0ICJ4JGNoZWNrX2Zvcl9ocHV4X2Jyb2tlbl9nZXRhZGRyaW5mbyIgPSAieDEiOyB0aGVuCisJQUNfTVNHX0NIRUNLSU5HKFtpZiBnZXRhZGRyaW5mbyBzZWVtcyB0byB3b3JrXSkKKwlBQ19SVU5fSUZFTFNFKAorCQlbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2RlZmluZSBURVNUX1BPUlQgIjIyMjIiCisJCV1dLCBbWworCWludCBlcnIsIHNvY2s7CisJc3RydWN0IGFkZHJpbmZvICpnYWlfYWksICphaSwgaGludHM7CisJY2hhciBudG9wW05JX01BWEhPU1RdLCBzdHJwb3J0W05JX01BWFNFUlZdLCAqbmFtZSA9IE5VTEw7CisKKwltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKwloaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKwloaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkU7CisKKwllcnIgPSBnZXRhZGRyaW5mbyhuYW1lLCBURVNUX1BPUlQsICZoaW50cywgJmdhaV9haSk7CisJaWYgKGVyciAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZ2V0YWRkcmluZm8gZmFpbGVkICglcykiLCBnYWlfc3RyZXJyb3IoZXJyKSk7CisJCWV4aXQoMSk7CisJfQorCisJZm9yIChhaSA9IGdhaV9haTsgYWkgIT0gTlVMTDsgYWkgPSBhaS0+YWlfbmV4dCkgeworCQlpZiAoYWktPmFpX2ZhbWlseSAhPSBBRl9JTkVUNikKKwkJCWNvbnRpbnVlOworCisJCWVyciA9IGdldG5hbWVpbmZvKGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbiwgbnRvcCwKKwkJICAgIHNpemVvZihudG9wKSwgc3RycG9ydCwgc2l6ZW9mKHN0cnBvcnQpLAorCQkgICAgTklfTlVNRVJJQ0hPU1R8TklfTlVNRVJJQ1NFUlYpOworCisJCWlmIChlcnIgIT0gMCkgeworCQkJaWYgKGVyciA9PSBFQUlfU1lTVEVNKQorCQkJCXBlcnJvcigiZ2V0bmFtZWluZm8gRUFJX1NZU1RFTSIpOworCQkJZWxzZQorCQkJCWZwcmludGYoc3RkZXJyLCAiZ2V0bmFtZWluZm8gZmFpbGVkOiAlc1xuIiwKKwkJCQkgICAgZ2FpX3N0cmVycm9yKGVycikpOworCQkJZXhpdCgyKTsKKwkJfQorCisJCXNvY2sgPSBzb2NrZXQoYWktPmFpX2ZhbWlseSwgYWktPmFpX3NvY2t0eXBlLCBhaS0+YWlfcHJvdG9jb2wpOworCQlpZiAoc29jayA8IDApCisJCQlwZXJyb3IoInNvY2tldCIpOworCQlpZiAoYmluZChzb2NrLCBhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4pIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVCQURGKQorCQkJCWV4aXQoMyk7CisJCX0KKwl9CisJZXhpdCgwKTsKKwkJXV0pXSwKKwkJWworCQkJQUNfTVNHX1JFU1VMVChbeWVzXSkKKwkJXSwKKwkJWworCQkJQUNfTVNHX1JFU1VMVChbbm9dKQorCQkJQUNfREVGSU5FKFtCUk9LRU5fR0VUQUREUklORk9dKQorCQldLAorCQlbCisJCQlBQ19NU0dfUkVTVUxUKFtjcm9zcy1jb21waWxpbmcsIGFzc3VtaW5nIHllc10pCisJCV0KKwkpCitmaQorCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0YWRkcmluZm8iID0gInh5ZXMiICYmIFwKKyAgICB0ZXN0ICJ4JGNoZWNrX2Zvcl9haXhfYnJva2VuX2dldGFkZHJpbmZvIiA9ICJ4MSI7IHRoZW4KKwlBQ19NU0dfQ0hFQ0tJTkcoW2lmIGdldGFkZHJpbmZvIHNlZW1zIHRvIHdvcmtdKQorCUFDX1JVTl9JRkVMU0UoCisJCVtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjZGVmaW5lIFRFU1RfUE9SVCAiMjIyMiIKKwkJXV0sIFtbCisJaW50IGVyciwgc29jazsKKwlzdHJ1Y3QgYWRkcmluZm8gKmdhaV9haSwgKmFpLCBoaW50czsKKwljaGFyIG50b3BbTklfTUFYSE9TVF0sIHN0cnBvcnRbTklfTUFYU0VSVl0sICpuYW1lID0gTlVMTDsKKworCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworCWhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKKwloaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworCWhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRTsKKworCWVyciA9IGdldGFkZHJpbmZvKG5hbWUsIFRFU1RfUE9SVCwgJmhpbnRzLCAmZ2FpX2FpKTsKKwlpZiAoZXJyICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJnZXRhZGRyaW5mbyBmYWlsZWQgKCVzKSIsIGdhaV9zdHJlcnJvcihlcnIpKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlmb3IgKGFpID0gZ2FpX2FpOyBhaSAhPSBOVUxMOyBhaSA9IGFpLT5haV9uZXh0KSB7CisJCWlmIChhaS0+YWlfZmFtaWx5ICE9IEFGX0lORVQgJiYgYWktPmFpX2ZhbWlseSAhPSBBRl9JTkVUNikKKwkJCWNvbnRpbnVlOworCisJCWVyciA9IGdldG5hbWVpbmZvKGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbiwgbnRvcCwKKwkJICAgIHNpemVvZihudG9wKSwgc3RycG9ydCwgc2l6ZW9mKHN0cnBvcnQpLAorCQkgICAgTklfTlVNRVJJQ0hPU1R8TklfTlVNRVJJQ1NFUlYpOworCisJCWlmIChhaS0+YWlfZmFtaWx5ID09IEFGX0lORVQgJiYgZXJyICE9IDApIHsKKwkJCXBlcnJvcigiZ2V0bmFtZWluZm8iKTsKKwkJCWV4aXQoMik7CisJCX0KKwl9CisJZXhpdCgwKTsKKwkJXV0pXSwKKwkJWworCQkJQUNfTVNHX1JFU1VMVChbeWVzXSkKKwkJCUFDX0RFRklORShbQUlYX0dFVE5BTUVJTkZPX0hBQ0tdLCBbMV0sCisJCQkJW0RlZmluZSBpZiB5b3UgaGF2ZSBhIGdldGFkZHJpbmZvIHRoYXQgZmFpbHMKKwkJCQlmb3IgdGhlIGFsbC16ZXJvcyBJUHY2IGFkZHJlc3NdKQorCQldLAorCQlbCisJCQlBQ19NU0dfUkVTVUxUKFtub10pCisJCQlBQ19ERUZJTkUoW0JST0tFTl9HRVRBRERSSU5GT10pCisJCV0sCisJCVsKKwkJCUFDX01TR19SRVNVTFQoW2Nyb3NzLWNvbXBpbGluZywgYXNzdW1pbmcgbm9dKQorCQldCisJKQorZmkKKworaWYgdGVzdCAieCRjaGVja19mb3JfY29uZmxpY3RpbmdfZ2V0c3BuYW0iID0gIngxIjsgdGhlbgorCUFDX01TR19DSEVDS0lORyhbZm9yIGNvbmZsaWN0aW5nIGdldHNwbmFtIGluIHNoYWRvdy5oXSkKKwlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbICNpbmNsdWRlIDxzaGFkb3cuaD4gXV0sCisJCVtbIGV4aXQoMCk7IF1dKV0sCisJCVsKKwkJCUFDX01TR19SRVNVTFQoW25vXSkKKwkJXSwKKwkJWworCQkJQUNfTVNHX1JFU1VMVChbeWVzXSkKKwkJCUFDX0RFRklORShbR0VUU1BOQU1fQ09ORkxJQ1RJTkdfREVGU10sIFsxXSwKKwkJCSAgICBbQ29uZmxpY3RpbmcgZGVmcyBmb3IgZ2V0c3BuYW1dKQorCQldCisJKQorZmkKKworQUNfRlVOQ19HRVRQR1JQCisKKyMgU2VhcmNoIGZvciBPcGVuU1NMCitzYXZlZF9DUFBGTEFHUz0iJENQUEZMQUdTIgorc2F2ZWRfTERGTEFHUz0iJExERkxBR1MiCitBQ19BUkdfV0lUSChbc3NsLWRpcl0sCisJWyAgLS13aXRoLXNzbC1kaXI9UEFUSCAgICAgU3BlY2lmeSBwYXRoIHRvIE9wZW5TU0wgaW5zdGFsbGF0aW9uIF0sCisJWworCQlpZiB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iIDsgdGhlbgorCQkJY2FzZSAiJHdpdGh2YWwiIGluCisJCQkJIyBSZWxhdGl2ZSBwYXRocworCQkJCS4vKnwuLi8qKQl3aXRodmFsPSJgcHdkYC8kd2l0aHZhbCIKKwkJCWVzYWMKKwkJCWlmIHRlc3QgLWQgIiR3aXRodmFsL2xpYiI7IHRoZW4KKwkJCQlpZiB0ZXN0IC1uICIke25lZWRfZGFzaF9yfSI7IHRoZW4KKwkJCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9L2xpYiAtUiR7d2l0aHZhbH0vbGliICR7TERGTEFHU30iCisJCQkJZWxzZQorCQkJCQlMREZMQUdTPSItTCR7d2l0aHZhbH0vbGliICR7TERGTEFHU30iCisJCQkJZmkKKwkJCWVsaWYgdGVzdCAtZCAiJHdpdGh2YWwvbGliNjQiOyB0aGVuCisJCQkJaWYgdGVzdCAtbiAiJHtuZWVkX2Rhc2hfcn0iOyB0aGVuCisJCQkJCUxERkxBR1M9Ii1MJHt3aXRodmFsfS9saWI2NCAtUiR7d2l0aHZhbH0vbGliNjQgJHtMREZMQUdTfSIKKwkJCQllbHNlCisJCQkJCUxERkxBR1M9Ii1MJHt3aXRodmFsfS9saWI2NCAke0xERkxBR1N9IgorCQkJCWZpCisJCQllbHNlCisJCQkJaWYgdGVzdCAtbiAiJHtuZWVkX2Rhc2hfcn0iOyB0aGVuCisJCQkJCUxERkxBR1M9Ii1MJHt3aXRodmFsfSAtUiR7d2l0aHZhbH0gJHtMREZMQUdTfSIKKwkJCQllbHNlCisJCQkJCUxERkxBR1M9Ii1MJHt3aXRodmFsfSAke0xERkxBR1N9IgorCQkJCWZpCisJCQlmaQorCQkJaWYgdGVzdCAtZCAiJHdpdGh2YWwvaW5jbHVkZSI7IHRoZW4KKwkJCQlDUFBGTEFHUz0iLUkke3dpdGh2YWx9L2luY2x1ZGUgJHtDUFBGTEFHU30iCisJCQllbHNlCisJCQkJQ1BQRkxBR1M9Ii1JJHt3aXRodmFsfSAke0NQUEZMQUdTfSIKKwkJCWZpCisJCWZpCisJXQorKQorTElCUz0iLWxjcnlwdG8gJExJQlMiCitBQ19UUllfTElOS19GVU5DKFtSQU5EX2FkZF0sIFtBQ19ERUZJTkUoW0hBVkVfT1BFTlNTTF0sIFsxXSwKKwlbRGVmaW5lIGlmIHlvdXIgc3NsIGhlYWRlcnMgYXJlIGluY2x1ZGVkCisJd2l0aCAjaW5jbHVkZSA8b3BlbnNzbC9oZWFkZXIuaD5dKV0sCisJWworCQlkbmwgQ2hlY2sgZGVmYXVsdCBvcGVuc3NsIGluc3RhbGwgZGlyCisJCWlmIHRlc3QgLW4gIiR7bmVlZF9kYXNoX3J9IjsgdGhlbgorCQkJTERGTEFHUz0iLUwvdXNyL2xvY2FsL3NzbC9saWIgLVIvdXNyL2xvY2FsL3NzbC9saWIgJHtzYXZlZF9MREZMQUdTfSIKKwkJZWxzZQorCQkJTERGTEFHUz0iLUwvdXNyL2xvY2FsL3NzbC9saWIgJHtzYXZlZF9MREZMQUdTfSIKKwkJZmkKKwkJQ1BQRkxBR1M9Ii1JL3Vzci9sb2NhbC9zc2wvaW5jbHVkZSAke3NhdmVkX0NQUEZMQUdTfSIKKwkJQUNfQ0hFQ0tfSEVBREVSKFtvcGVuc3NsL29wZW5zc2x2LmhdLCAsCisJCSAgICBbQUNfTVNHX0VSUk9SKFsqKiogT3BlblNTTCBoZWFkZXJzIG1pc3NpbmcgLSBwbGVhc2UgaW5zdGFsbCBmaXJzdCBvciBjaGVjayBjb25maWcubG9nICoqKl0pXSkKKwkJQUNfVFJZX0xJTktfRlVOQyhbUkFORF9hZGRdLCBbQUNfREVGSU5FKFtIQVZFX09QRU5TU0xdKV0sCisJCQlbCisJCQkJQUNfTVNHX0VSUk9SKFsqKiogQ2FuJ3QgZmluZCByZWNlbnQgT3BlblNTTCBsaWJjcnlwdG8gKHNlZSBjb25maWcubG9nIGZvciBkZXRhaWxzKSAqKipdKQorCQkJXQorCQkpCisJXQorKQorCisjIERldGVybWluZSBPcGVuU1NMIGhlYWRlciB2ZXJzaW9uCitBQ19NU0dfQ0hFQ0tJTkcoW09wZW5TU0wgaGVhZGVyIHZlcnNpb25dKQorQUNfUlVOX0lGRUxTRSgKKwlbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2x2Lmg+CisjZGVmaW5lIERBVEEgImNvbmZ0ZXN0LnNzbGluY3ZlciIKKwldXSwgW1sKKwlGSUxFICpmZDsKKwlpbnQgcmM7CisKKwlmZCA9IGZvcGVuKERBVEEsInciKTsKKwlpZihmZCA9PSBOVUxMKQorCQlleGl0KDEpOworCisJaWYgKChyYyA9IGZwcmludGYoZmQgLCIleCAoJXMpXG4iLCBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSLCBPUEVOU1NMX1ZFUlNJT05fVEVYVCkpIDwwKQorCQlleGl0KDEpOworCisJZXhpdCgwKTsKKwldXSldLAorCVsKKwkJc3NsX2hlYWRlcl92ZXI9YGNhdCBjb25mdGVzdC5zc2xpbmN2ZXJgCisJCUFDX01TR19SRVNVTFQoWyRzc2xfaGVhZGVyX3Zlcl0pCisJXSwKKwlbCisJCUFDX01TR19SRVNVTFQoW25vdCBmb3VuZF0pCisJCUFDX01TR19FUlJPUihbT3BlblNTTCB2ZXJzaW9uIGhlYWRlciBub3QgZm91bmQuXSkKKwldLAorCVsKKwkJQUNfTVNHX1dBUk4oW2Nyb3NzIGNvbXBpbGluZzogbm90IGNoZWNraW5nXSkKKwldCispCisKKyMgRGV0ZXJtaW5lIE9wZW5TU0wgbGlicmFyeSB2ZXJzaW9uCitBQ19NU0dfQ0hFQ0tJTkcoW09wZW5TU0wgbGlicmFyeSB2ZXJzaW9uXSkKK0FDX1JVTl9JRkVMU0UoCisJW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3Nsdi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisjZGVmaW5lIERBVEEgImNvbmZ0ZXN0LnNzbGxpYnZlciIKKwldXSwgW1sKKwlGSUxFICpmZDsKKwlpbnQgcmM7CisKKwlmZCA9IGZvcGVuKERBVEEsInciKTsKKwlpZihmZCA9PSBOVUxMKQorCQlleGl0KDEpOworCisJaWYgKChyYyA9IGZwcmludGYoZmQgLCIleCAoJXMpXG4iLCBTU0xlYXkoKSwgU1NMZWF5X3ZlcnNpb24oU1NMRUFZX1ZFUlNJT04pKSkgPDApCisJCWV4aXQoMSk7CisKKwlleGl0KDApOworCV1dKV0sCisJWworCQlzc2xfbGlicmFyeV92ZXI9YGNhdCBjb25mdGVzdC5zc2xsaWJ2ZXJgCisJCUFDX01TR19SRVNVTFQoWyRzc2xfbGlicmFyeV92ZXJdKQorCV0sCisJWworCQlBQ19NU0dfUkVTVUxUKFtub3QgZm91bmRdKQorCQlBQ19NU0dfRVJST1IoW09wZW5TU0wgbGlicmFyeSBub3QgZm91bmQuXSkKKwldLAorCVsKKwkJQUNfTVNHX1dBUk4oW2Nyb3NzIGNvbXBpbGluZzogbm90IGNoZWNraW5nXSkKKwldCispCisKK0FDX0FSR19XSVRIKFtvcGVuc3NsLWhlYWRlci1jaGVja10sCisJWyAgLS13aXRob3V0LW9wZW5zc2wtaGVhZGVyLWNoZWNrIERpc2FibGUgT3BlblNTTCB2ZXJzaW9uIGNvbnNpc3RlbmN5IGNoZWNrXSwKKwlbICBpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInhubyIgOyB0aGVuCisJCW9wZW5zc2xfY2hlY2tfbm9uZmF0YWw9MQorCSAgIGZpCisJXQorKQorCisjIFNhbml0eSBjaGVjayBPcGVuU1NMIGhlYWRlcnMKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciBPcGVuU1NMJ3MgaGVhZGVycyBtYXRjaCB0aGUgbGlicmFyeV0pCitBQ19SVU5fSUZFTFNFKAorCVtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2x2Lmg+CisJXV0sIFtbCisJZXhpdChTU0xlYXkoKSA9PSBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID8gMCA6IDEpOworCV1dKV0sCisJWworCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCV0sCisJWworCQlBQ19NU0dfUkVTVUxUKFtub10pCisJCWlmIHRlc3QgIngkb3BlbnNzbF9jaGVja19ub25mYXRhbCIgPSAieCI7IHRoZW4KKwkJCUFDX01TR19FUlJPUihbWW91ciBPcGVuU1NMIGhlYWRlcnMgZG8gbm90IG1hdGNoIHlvdXIKK2xpYnJhcnkuIENoZWNrIGNvbmZpZy5sb2cgZm9yIGRldGFpbHMuCitJZiB5b3UgYXJlIHN1cmUgeW91ciBpbnN0YWxsYXRpb24gaXMgY29uc2lzdGVudCwgeW91IGNhbiBkaXNhYmxlIHRoZSBjaGVjaworYnkgcnVubmluZyAiLi9jb25maWd1cmUgLS13aXRob3V0LW9wZW5zc2wtaGVhZGVyLWNoZWNrIi4KK0Fsc28gc2VlIGNvbnRyaWIvZmluZHNzbC5zaCBmb3IgaGVscCBpZGVudGlmeWluZyBoZWFkZXIvbGlicmFyeSBtaXNtYXRjaGVzLgorXSkKKwkJZWxzZQorCQkJQUNfTVNHX1dBUk4oW1lvdXIgT3BlblNTTCBoZWFkZXJzIGRvIG5vdCBtYXRjaCB5b3VyCitsaWJyYXJ5LiBDaGVjayBjb25maWcubG9nIGZvciBkZXRhaWxzLgorQWxzbyBzZWUgY29udHJpYi9maW5kc3NsLnNoIGZvciBoZWxwIGlkZW50aWZ5aW5nIGhlYWRlci9saWJyYXJ5IG1pc21hdGNoZXMuXSkKKwkJZmkKKwldLAorCVsKKwkJQUNfTVNHX1dBUk4oW2Nyb3NzIGNvbXBpbGluZzogbm90IGNoZWNraW5nXSkKKwldCispCisKK0FDX01TR19DSEVDS0lORyhbaWYgcHJvZ3JhbXMgdXNpbmcgT3BlblNTTCBmdW5jdGlvbnMgd2lsbCBsaW5rXSkKK0FDX0xJTktfSUZFTFNFKAorCVtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+IF1dLAorCVtbIFNTTGVheV9hZGRfYWxsX2FsZ29yaXRobXMoKTsgXV0pXSwKKwlbCisJCUFDX01TR19SRVNVTFQoW3llc10pCisJXSwKKwlbCisJCUFDX01TR19SRVNVTFQoW25vXSkKKwkJc2F2ZWRfTElCUz0iJExJQlMiCisJCUxJQlM9IiRMSUJTIC1sZGwiCisJCUFDX01TR19DSEVDS0lORyhbaWYgcHJvZ3JhbXMgdXNpbmcgT3BlblNTTCBuZWVkIC1sZGxdKQorCQlBQ19MSU5LX0lGRUxTRSgKKwkJCVtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+IF1dLAorCQkJW1sgU1NMZWF5X2FkZF9hbGxfYWxnb3JpdGhtcygpOyBdXSldLAorCQkJWworCQkJCUFDX01TR19SRVNVTFQoW3llc10pCisJCQldLAorCQkJWworCQkJCUFDX01TR19SRVNVTFQoW25vXSkKKwkJCQlMSUJTPSIkc2F2ZWRfTElCUyIKKwkJCV0KKwkJKQorCV0KKykKKworQUNfQ0hFQ0tfRlVOQ1MoW1JTQV9nZW5lcmF0ZV9rZXlfZXggRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnNfZXggQk5faXNfcHJpbWVfZXggUlNBX2dldF9kZWZhdWx0X21ldGhvZCBITUFDX0NUWF9pbml0XSkKKworQUNfQVJHX1dJVEgoW3NzbC1lbmdpbmVdLAorCVsgIC0td2l0aC1zc2wtZW5naW5lICAgICAgIEVuYWJsZSBPcGVuU1NMIChoYXJkd2FyZSkgRU5HSU5FIHN1cHBvcnQgXSwKKwlbIGlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgOyB0aGVuCisJCUFDX01TR19DSEVDS0lORyhbZm9yIE9wZW5TU0wgRU5HSU5FIHN1cHBvcnRdKQorCQlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKwkJCV1dLCBbWworCUVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpOworCUVOR0lORV9yZWdpc3Rlcl9hbGxfY29tcGxldGUoKTsKKwkJCV1dKV0sCisJCQlbIEFDX01TR19SRVNVTFQoW3llc10pCisJCQkgIEFDX0RFRklORShbVVNFX09QRU5TU0xfRU5HSU5FXSwgWzFdLAorCQkJICAgICBbRW5hYmxlIE9wZW5TU0wgZW5naW5lIHN1cHBvcnRdKQorCQkJXSwgWyBBQ19NU0dfRVJST1IoW09wZW5TU0wgRU5HSU5FIHN1cHBvcnQgbm90IGZvdW5kXSkKKwkJXSkKKwkgIGZpIF0KKykKKworIyBDaGVjayBmb3IgT3BlblNTTCB3aXRob3V0IEVWUF9hZXNfezE5MiwyNTZ9X2NiYworQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE9wZW5TU0wgaGFzIGNyaXBwbGVkIEFFUyBzdXBwb3J0XSkKK0FDX0xJTktfSUZFTFNFKAorCVtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCV1dLCBbWworCWV4aXQoRVZQX2Flc18xOTJfY2JjKCkgPT0gTlVMTCB8fCBFVlBfYWVzXzI1Nl9jYmMoKSA9PSBOVUxMKTsKKwldXSldLAorCVsKKwkJQUNfTVNHX1JFU1VMVChbbm9dKQorCV0sCisJWworCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCQlBQ19ERUZJTkUoW09QRU5TU0xfTE9CT1RPTUlTRURfQUVTXSwgWzFdLAorCQkgICAgW2xpYmNyeXB0byBpcyBtaXNzaW5nIEFFUyAxOTIgYW5kIDI1NiBiaXQgZnVuY3Rpb25zXSkKKwldCispCisKK0FDX01TR19DSEVDS0lORyhbaWYgRVZQX0RpZ2VzdFVwZGF0ZSByZXR1cm5zIGFuIGludF0pCitBQ19MSU5LX0lGRUxTRSgKKwlbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKwldXSwgW1sKKwlpZihFVlBfRGlnZXN0VXBkYXRlKE5VTEwsIE5VTEwsMCkpCisJCWV4aXQoMCk7CisJXV0pXSwKKwlbCisJCUFDX01TR19SRVNVTFQoW3llc10pCisJXSwKKwlbCisJCUFDX01TR19SRVNVTFQoW25vXSkKKwkJQUNfREVGSU5FKFtPUEVOU1NMX0VWUF9ESUdFU1RVUERBVEVfVk9JRF0sIFsxXSwKKwkJICAgIFtEZWZpbmUgaWYgRVZQX0RpZ2VzdFVwZGF0ZSByZXR1cm5zIHZvaWRdKQorCV0KKykKKworIyBTb21lIHN5c3RlbXMgd2FudCBjcnlwdCgpIGZyb20gbGliY3J5cHQsICpub3QqIHRoZSB2ZXJzaW9uIGluIE9wZW5TU0wsCisjIGJlY2F1c2UgdGhlIHN5c3RlbSBjcnlwdCgpIGlzIG1vcmUgZmVhdHVyZWZ1bC4KK2lmIHRlc3QgIngkY2hlY2tfZm9yX2xpYmNyeXB0X2JlZm9yZSIgPSAieDEiOyB0aGVuCisJQUNfQ0hFQ0tfTElCKFtjcnlwdF0sIFtjcnlwdF0pCitmaQorCisjIFNvbWUgTGludXggc3lzdGVtcyAoU2xhY2t3YXJlKSBuZWVkIGNyeXB0KCkgZnJvbSBsaWJjcnlwdCwgKm5vdCogdGhlCisjIHZlcnNpb24gaW4gT3BlblNTTC4KK2lmIHRlc3QgIngkY2hlY2tfZm9yX2xpYmNyeXB0X2xhdGVyIiA9ICJ4MSI7IHRoZW4KKwlBQ19DSEVDS19MSUIoW2NyeXB0XSwgW2NyeXB0XSwgW0xJQlM9IiRMSUJTIC1sY3J5cHQiXSkKK2ZpCisKKyMgU2VhcmNoIGZvciBTSEEyNTYgc3VwcG9ydCBpbiBsaWJjIGFuZC9vciBPcGVuU1NMCitBQ19DSEVDS19GVU5DUyhbU0hBMjU2X1VwZGF0ZSBFVlBfc2hhMjU2XSwgW1RFU1RfU1NIX1NIQTI1Nj15ZXNdLAorICAgIFtURVNUX1NTSF9TSEEyNTY9bm9dKQorQUNfU1VCU1QoW1RFU1RfU1NIX1NIQTI1Nl0pCisKKyMgQ2hlY2sgY29tcGxldGUgRUNDIHN1cHBvcnQgaW4gT3BlblNTTAorQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE9wZW5TU0wgaGFzIGNvbXBsZXRlIEVDQyBzdXBwb3J0XSkKK0FDX0xJTktfSUZFTFNFKAorCVtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxvcGVuc3NsL2VjLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lY2RoLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lY2RzYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3Nsdi5oPgorI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCAweDAwOTA4MDdmIC8qIDAuOS44ZyAqLworIyBlcnJvciAiT3BlblNTTCA8IDAuOS44ZyBoYXMgdW5yZWxpYWJsZSBFQ0MgY29kZSIKKyNlbmRpZgorCV1dLCBbWworCUVDX0tFWSAqZSA9IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZShOSURfc2VjcDUyMXIxKTsKKwljb25zdCBFVlBfTUQgKm0gPSBFVlBfc2hhNTEyKCk7IC8qIFdlIG5lZWQgdGhpcyB0b28gKi8KKwldXSldLAorCVsKKwkJQUNfTVNHX1JFU1VMVChbeWVzXSkKKwkJQUNfREVGSU5FKFtPUEVOU1NMX0hBU19FQ0NdLCBbMV0sCisJCSAgICBbbGliY3J5cHRvIGluY2x1ZGVzIGNvbXBsZXRlIEVDQyBzdXBwb3J0XSkKKwkJVEVTVF9TU0hfRUNDPXllcworCQlDT01NRU5UX09VVF9FQ0M9IiIKKwldLAorCVsKKwkJQUNfTVNHX1JFU1VMVChbbm9dKQorCQlURVNUX1NTSF9FQ0M9bm8KKwkJQ09NTUVOVF9PVVRfRUNDPSIjbm8gZWNjIyIKKwldCispCitBQ19TVUJTVChbVEVTVF9TU0hfRUNDXSkKK0FDX1NVQlNUKFtDT01NRU5UX09VVF9FQ0NdKQorCitzYXZlZF9MSUJTPSIkTElCUyIKK0FDX0NIRUNLX0xJQihbaWFmXSwgW2lhX29wZW5pbmZvXSwgWworCUxJQlM9IiRMSUJTIC1saWFmIgorCUFDX0NIRUNLX0ZVTkNTKFtzZXRfaWRdLCBbU1NIRExJQlM9IiRTU0hETElCUyAtbGlhZiIKKwkJCQlBQ19ERUZJTkUoW0hBVkVfTElCSUFGXSwgWzFdLAorICAgICAgICAJCVtEZWZpbmUgaWYgc3lzdGVtIGhhcyBsaWJpYWYgdGhhdCBzdXBwb3J0cyBzZXRfaWRdKQorCQkJCV0pCitdKQorTElCUz0iJHNhdmVkX0xJQlMiCisKKyMjIyBDb25maWd1cmUgY3J5cHRvZ3JhcGhpYyByYW5kb20gbnVtYmVyIHN1cHBvcnQKKworIyBDaGVjayB3aGV0ZXIgT3BlblNTTCBzZWVkcyBpdHNlbGYKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciBPcGVuU1NMJ3MgUFJORyBpcyBpbnRlcm5hbGx5IHNlZWRlZF0pCitBQ19SVU5fSUZFTFNFKAorCVtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKwldXSwgW1sKKwlleGl0KFJBTkRfc3RhdHVzKCkgPT0gMSA/IDAgOiAxKTsKKwldXSldLAorCVsKKwkJT1BFTlNTTF9TRUVEU19JVFNFTEY9eWVzCisJCUFDX01TR19SRVNVTFQoW3llc10pCisJXSwKKwlbCisJCUFDX01TR19SRVNVTFQoW25vXSkKKwldLAorCVsKKwkJQUNfTVNHX1dBUk4oW2Nyb3NzIGNvbXBpbGluZzogYXNzdW1pbmcgeWVzXSkKKwkJIyBUaGlzIGlzIHNhZmUsIHNpbmNlIHdlIHdpbGwgZmF0YWwoKSBhdCBydW50aW1lIGlmCisJCSMgT3BlblNTTCBpcyBub3Qgc2VlZGVkIGNvcnJlY3RseS4KKwkJT1BFTlNTTF9TRUVEU19JVFNFTEY9eWVzCisJXQorKQorCisjIFBSTkdEIFRDUCBzb2NrZXQKK0FDX0FSR19XSVRIKFtwcm5nZC1wb3J0XSwKKwlbICAtLXdpdGgtcHJuZ2QtcG9ydD1QT1JUICByZWFkIGVudHJvcHkgZnJvbSBQUk5HRC9FR0QgVENQIGxvY2FsaG9zdDpQT1JUXSwKKwlbCisJCWNhc2UgIiR3aXRodmFsIiBpbgorCQlubykKKwkJCXdpdGh2YWw9IiIKKwkJCTs7CisJCVtbMC05XV0qKQorCQkJOzsKKwkJKikKKwkJCUFDX01TR19FUlJPUihbWW91IG11c3Qgc3BlY2lmeSBhIG51bWVyaWMgcG9ydCBudW1iZXIgZm9yIC0td2l0aC1wcm5nZC1wb3J0XSkKKwkJCTs7CisJCWVzYWMKKwkJaWYgdGVzdCAhIC16ICIkd2l0aHZhbCIgOyB0aGVuCisJCQlQUk5HRF9QT1JUPSIkd2l0aHZhbCIKKwkJCUFDX0RFRklORV9VTlFVT1RFRChbUFJOR0RfUE9SVF0sIFskUFJOR0RfUE9SVF0sCisJCQkJW1BvcnQgbnVtYmVyIG9mIFBSTkdEL0VHRCByYW5kb20gbnVtYmVyIHNvY2tldF0pCisJCWZpCisJXQorKQorCisjIFBSTkdEIFVuaXggZG9tYWluIHNvY2tldAorQUNfQVJHX1dJVEgoW3BybmdkLXNvY2tldF0sCisJWyAgLS13aXRoLXBybmdkLXNvY2tldD1GSUxFIHJlYWQgZW50cm9weSBmcm9tIFBSTkdEL0VHRCBzb2NrZXQgRklMRSAoZGVmYXVsdD0vdmFyL3J1bi9lZ2QtcG9vbCldLAorCVsKKwkJY2FzZSAiJHdpdGh2YWwiIGluCisJCXllcykKKwkJCXdpdGh2YWw9Ii92YXIvcnVuL2VnZC1wb29sIgorCQkJOzsKKwkJbm8pCisJCQl3aXRodmFsPSIiCisJCQk7OworCQkvKikKKwkJCTs7CisJCSopCisJCQlBQ19NU0dfRVJST1IoW1lvdSBtdXN0IHNwZWNpZnkgYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgZW50cm9weSBzb2NrZXRdKQorCQkJOzsKKwkJZXNhYworCisJCWlmIHRlc3QgISAteiAiJHdpdGh2YWwiIDsgdGhlbgorCQkJaWYgdGVzdCAhIC16ICIkUFJOR0RfUE9SVCIgOyB0aGVuCisJCQkJQUNfTVNHX0VSUk9SKFtZb3UgbWF5IG5vdCBzcGVjaWZ5IGJvdGggYSBQUk5HRC9FR0QgcG9ydCBhbmQgc29ja2V0XSkKKwkJCWZpCisJCQlpZiB0ZXN0ICEgLXIgIiR3aXRodmFsIiA7IHRoZW4KKwkJCQlBQ19NU0dfV0FSTihbRW50cm9weSBzb2NrZXQgaXMgbm90IHJlYWRhYmxlXSkKKwkJCWZpCisJCQlQUk5HRF9TT0NLRVQ9IiR3aXRodmFsIgorCQkJQUNfREVGSU5FX1VOUVVPVEVEKFtQUk5HRF9TT0NLRVRdLCBbIiRQUk5HRF9TT0NLRVQiXSwKKwkJCQlbTG9jYXRpb24gb2YgUFJOR0QvRUdEIHJhbmRvbSBudW1iZXIgc29ja2V0XSkKKwkJZmkKKwldLAorCVsKKwkJIyBDaGVjayBmb3IgZXhpc3Rpbmcgc29ja2V0IG9ubHkgaWYgd2UgZG9uJ3QgaGF2ZSBhIHJhbmRvbSBkZXZpY2UgYWxyZWFkeQorCQlpZiB0ZXN0ICJ4JE9QRU5TU0xfU0VFRFNfSVRTRUxGIiAhPSAieHllcyIgOyB0aGVuCisJCQlBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBQUk5HRC9FR0Qgc29ja2V0XSkKKwkJCSMgSW5zZXJ0IG90aGVyIGxvY2F0aW9ucyBoZXJlCisJCQlmb3Igc29jayBpbiAvdmFyL3J1bi9lZ2QtcG9vbCAvZGV2L2VnZC1wb29sIC9ldGMvZW50cm9weTsgZG8KKwkJCQlpZiB0ZXN0IC1yICRzb2NrICYmICRURVNUX01JTlVTX1NfU0ggLWMgInRlc3QgLVMgJHNvY2sgLW8gLXAgJHNvY2siIDsgdGhlbgorCQkJCQlQUk5HRF9TT0NLRVQ9IiRzb2NrIgorCQkJCQlBQ19ERUZJTkVfVU5RVU9URUQoW1BSTkdEX1NPQ0tFVF0sIFsiJFBSTkdEX1NPQ0tFVCJdKQorCQkJCQlicmVhazsKKwkJCQlmaQorCQkJZG9uZQorCQkJaWYgdGVzdCAhIC16ICIkUFJOR0RfU09DS0VUIiA7IHRoZW4KKwkJCQlBQ19NU0dfUkVTVUxUKFskUFJOR0RfU09DS0VUXSkKKwkJCWVsc2UKKwkJCQlBQ19NU0dfUkVTVUxUKFtub3QgZm91bmRdKQorCQkJZmkKKwkJZmkKKwldCispCisKKyMgV2hpY2ggcmFuZG9tbmVzcyBzb3VyY2UgZG8gd2UgdXNlPworaWYgdGVzdCAhIC16ICIkUFJOR0RfUE9SVCIgOyB0aGVuCisJUkFORF9NU0c9IlBSTkdkIHBvcnQgJFBSTkdEX1BPUlQiCitlbGlmIHRlc3QgISAteiAiJFBSTkdEX1NPQ0tFVCIgOyB0aGVuCisJUkFORF9NU0c9IlBSTkdkIHNvY2tldCAkUFJOR0RfU09DS0VUIgorZWxpZiB0ZXN0ICEgLXogIiRPUEVOU1NMX1NFRURTX0lUU0VMRiIgOyB0aGVuCisJQUNfREVGSU5FKFtPUEVOU1NMX1BSTkdfT05MWV0sIFsxXSwKKwkJW0RlZmluZSBpZiB5b3Ugd2FudCBPcGVuU1NMJ3MgaW50ZXJuYWxseSBzZWVkZWQgUFJORyBvbmx5XSkKKwlSQU5EX01TRz0iT3BlblNTTCBpbnRlcm5hbCBPTkxZIgorZWxzZQorCUFDX01TR19FUlJPUihbT3BlblNTSCBoYXMgbm8gc291cmNlIG9mIHJhbmRvbSBudW1iZXJzLiBQbGVhc2UgY29uZmlndXJlIE9wZW5TU0wgd2l0aCBhbiBlbnRyb3B5IHNvdXJjZSBvciByZS1ydW4gY29uZmlndXJlIHVzaW5nIG9uZSBvZiB0aGUgLS13aXRoLXBybmdkLXBvcnQgb3IgLS13aXRoLXBybmdkLXNvY2tldCBvcHRpb25zXSkKK2ZpCisKKyMgQ2hlY2sgZm9yIFBBTSBsaWJzCitQQU1fTVNHPSJubyIKK0FDX0FSR19XSVRIKFtwYW1dLAorCVsgIC0td2l0aC1wYW0gICAgICAgICAgICAgIEVuYWJsZSBQQU0gc3VwcG9ydCBdLAorCVsKKwkJaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KKwkJCWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3NlY3VyaXR5X3BhbV9hcHBsX2giICE9ICJ4eWVzIiAmJiBcCisJCQkgICB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9wYW1fcGFtX2FwcGxfaCIgIT0gInh5ZXMiIDsgdGhlbgorCQkJCUFDX01TR19FUlJPUihbUEFNIGhlYWRlcnMgbm90IGZvdW5kXSkKKwkJCWZpCisKKwkJCXNhdmVkX0xJQlM9IiRMSUJTIgorCQkJQUNfQ0hFQ0tfTElCKFtkbF0sIFtkbG9wZW5dLCAsICkKKwkJCUFDX0NIRUNLX0xJQihbcGFtXSwgW3BhbV9zZXRfaXRlbV0sICwgW0FDX01TR19FUlJPUihbKioqIGxpYnBhbSBtaXNzaW5nXSldKQorCQkJQUNfQ0hFQ0tfRlVOQ1MoW3BhbV9nZXRlbnZsaXN0XSkKKwkJCUFDX0NIRUNLX0ZVTkNTKFtwYW1fcHV0ZW52XSkKKwkJCUxJQlM9IiRzYXZlZF9MSUJTIgorCisJCQlQQU1fTVNHPSJ5ZXMiCisKKwkJCVNTSERMSUJTPSIkU1NIRExJQlMgLWxwYW0iCisJCQlBQ19ERUZJTkUoW1VTRV9QQU1dLCBbMV0sCisJCQkJW0RlZmluZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgUEFNIHN1cHBvcnRdKQorCisJCQlpZiB0ZXN0ICRhY19jdl9saWJfZGxfZGxvcGVuID0geWVzOyB0aGVuCisJCQkJY2FzZSAiJExJQlMiIGluCisJCQkJKi1sZGwqKQorCQkJCQkjIGxpYmRsIGFscmVhZHkgaW4gTElCUworCQkJCQk7OworCQkJCSopCisJCQkJCVNTSERMSUJTPSIkU1NIRExJQlMgLWxkbCIKKwkJCQkJOzsKKwkJCQllc2FjCisJCQlmaQorCQlmaQorCV0KKykKKworIyBDaGVjayBmb3Igb2xkZXIgUEFNCitpZiB0ZXN0ICJ4JFBBTV9NU0ciID0gInh5ZXMiIDsgdGhlbgorCSMgQ2hlY2sgUEFNIHN0cmVycm9yIGFyZ3VtZW50cyAob2xkIFBBTSkKKwlBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgcGFtX3N0cmVycm9yIHRha2VzIG9ubHkgb25lIGFyZ3VtZW50XSkKKwlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWYgZGVmaW5lZChIQVZFX1NFQ1VSSVRZX1BBTV9BUFBMX0gpCisjaW5jbHVkZSA8c2VjdXJpdHkvcGFtX2FwcGwuaD4KKyNlbGlmIGRlZmluZWQgKEhBVkVfUEFNX1BBTV9BUFBMX0gpCisjaW5jbHVkZSA8cGFtL3BhbV9hcHBsLmg+CisjZW5kaWYKKwkJXV0sIFtbCisodm9pZClwYW1fc3RyZXJyb3IoKHBhbV9oYW5kbGVfdCAqKU5VTEwsIC0xKTsKKwkJXV0pXSwgW0FDX01TR19SRVNVTFQoW25vXSldLCBbCisJCQlBQ19ERUZJTkUoW0hBVkVfT0xEX1BBTV0sIFsxXSwKKwkJCQlbRGVmaW5lIGlmIHlvdSBoYXZlIGFuIG9sZCB2ZXJzaW9uIG9mIFBBTQorCQkJCXdoaWNoIHRha2VzIG9ubHkgb25lIGFyZ3VtZW50IHRvIHBhbV9zdHJlcnJvcl0pCisJCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCQkJUEFNX01TRz0ieWVzIChvbGQgbGlicmFyeSkiCisJCQorCV0pCitmaQorCitTU0hfUFJJVlNFUF9VU0VSPXNzaGQKK0FDX0FSR19XSVRIKFtwcml2c2VwLXVzZXJdLAorCVsgIC0td2l0aC1wcml2c2VwLXVzZXI9dXNlciBTcGVjaWZ5IG5vbi1wcml2aWxlZ2VkIHVzZXIgZm9yIHByaXZpbGVnZSBzZXBhcmF0aW9uXSwKKwlbCisJCWlmIHRlc3QgLW4gIiR3aXRodmFsIiAgJiYgIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgICYmICBcCisJCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCisJCQlTU0hfUFJJVlNFUF9VU0VSPSR3aXRodmFsCisJCWZpCisJXQorKQorQUNfREVGSU5FX1VOUVVPVEVEKFtTU0hfUFJJVlNFUF9VU0VSXSwgWyIkU1NIX1BSSVZTRVBfVVNFUiJdLAorCVtub24tcHJpdmlsZWdlZCB1c2VyIGZvciBwcml2aWxlZ2Ugc2VwYXJhdGlvbl0pCitBQ19TVUJTVChbU1NIX1BSSVZTRVBfVVNFUl0pCisKKyMgRGVjaWRlIHdoaWNoIHNhbmRib3ggc3R5bGUgdG8gdXNlCitzYW5kYm94X2FyZz0iIgorQUNfQVJHX1dJVEgoW3NhbmRib3hdLAorCVsgIC0td2l0aC1zYW5kYm94PXN0eWxlICAgIFNwZWNpZnkgcHJpdmlsZWdlIHNlcGFyYXRpb24gc2FuZGJveCAobm8sIGRhcndpbiwgcmxpbWl0LCBzeXN0cmFjZSwgc2VjY29tcF9maWx0ZXIpXSwKKwlbCisJCWlmIHRlc3QgIngkd2l0aHZhbCIgPSAieHllcyIgOyB0aGVuCisJCQlzYW5kYm94X2FyZz0iIgorCQllbHNlCisJCQlzYW5kYm94X2FyZz0iJHdpdGh2YWwiCisJCWZpCisJXQorKQoraWYgdGVzdCAieCRzYW5kYm94X2FyZyIgPSAieHN5c3RyYWNlIiB8fCBcCisgICAoIHRlc3QgLXogIiRzYW5kYm94X2FyZyIgJiYgdGVzdCAieCRoYXZlX3N5c3RyX3BvbGljeV9raWxsIiA9ICJ4MSIgKSA7IHRoZW4KKwl0ZXN0ICJ4JGhhdmVfc3lzdHJfcG9saWN5X2tpbGwiICE9ICJ4MSIgJiYgXAorCQlBQ19NU0dfRVJST1IoW3N5c3RyYWNlIHNhbmRib3ggcmVxdWlyZXMgc3lzdHJhY2UgaGVhZGVycyBhbmQgU1lTVFJfUE9MSUNZX0tJTEwgc3VwcG9ydF0pCisJU0FOREJPWF9TVFlMRT0ic3lzdHJhY2UiCisJQUNfREVGSU5FKFtTQU5EQk9YX1NZU1RSQUNFXSwgWzFdLCBbU2FuZGJveCB1c2luZyBzeXN0cmFjZSg0KV0pCitlbGlmIHRlc3QgIngkc2FuZGJveF9hcmciID0gInhkYXJ3aW4iIHx8IFwKKyAgICAgKCB0ZXN0IC16ICIkc2FuZGJveF9hcmciICYmIHRlc3QgIngkYWNfY3ZfZnVuY19zYW5kYm94X2luaXQiID0gInh5ZXMiICYmIFwKKyAgICAgICB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9zYW5kYm94X2giID0gInh5ZXMiKSA7IHRoZW4KKwl0ZXN0ICJ4JGFjX2N2X2Z1bmNfc2FuZGJveF9pbml0IiAhPSAieHllcyIgLW8gXAorCSAgICAgIngkYWNfY3ZfaGVhZGVyX3NhbmRib3hfaCIgIT0gInh5ZXMiICYmIFwKKwkJQUNfTVNHX0VSUk9SKFtEYXJ3aW4gc2VhdGJlbHQgc2FuZGJveCByZXF1aXJlcyBzYW5kYm94LmggYW5kIHNhbmRib3hfaW5pdCBmdW5jdGlvbl0pCisJU0FOREJPWF9TVFlMRT0iZGFyd2luIgorCUFDX0RFRklORShbU0FOREJPWF9EQVJXSU5dLCBbMV0sIFtTYW5kYm94IHVzaW5nIERhcndpbiBzYW5kYm94X2luaXQoMyldKQorZWxpZiB0ZXN0ICJ4JHNhbmRib3hfYXJnIiA9ICJ4c2VjY29tcF9maWx0ZXIiIHx8IFwKKyAgICAgKCB0ZXN0IC16ICIkc2FuZGJveF9hcmciICYmIFwKKyAgICAgICB0ZXN0ICJ4JGhhdmVfc2VjY29tcF9maWx0ZXIiID09ICJ4MSIgJiYgXAorICAgICAgIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpbnV4X2F1ZGl0X2giID0gInh5ZXMiICYmIFwKKyAgICAgICB0ZXN0ICJ4JGhhdmVfc2VjY29tcF9hdWRpdF9hcmNoIiA9ICJ4MSIgJiYgXAorICAgICAgIHRlc3QgIngkaGF2ZV9saW51eF9ub19uZXdfcHJpdnMiID0gIngxIiAmJiBcCisgICAgICAgdGVzdCAieCRhY19jdl9mdW5jX3ByY3RsIiA9ICJ4eWVzIiApIDsgdGhlbgorCXRlc3QgIngkaGF2ZV9zZWNjb21wX2F1ZGl0X2FyY2giICE9ICJ4MSIgJiYgXAorCQlBQ19NU0dfRVJST1IoW3NlY2NvbXBfZmlsdGVyIHNhbmRib3ggbm90IHN1cHBvcnRlZCBvbiAkaG9zdF0pCisJdGVzdCAieCRoYXZlX2xpbnV4X25vX25ld19wcml2cyIgIT0gIngxIiAmJiBcCisJCUFDX01TR19FUlJPUihbc2VjY29tcF9maWx0ZXIgc2FuZGJveCByZXF1aXJlcyBQUl9TRVRfTk9fTkVXX1BSSVZTXSkKKwl0ZXN0ICJ4JGhhdmVfc2VjY29tcF9maWx0ZXIiICE9ICJ4MSIgJiYgXAorCQlBQ19NU0dfRVJST1IoW3NlY2NvbXBfZmlsdGVyIHNhbmRib3ggcmVxdWlyZXMgc2VjY29tcCBoZWFkZXJzXSkKKwl0ZXN0ICJ4JGFjX2N2X2Z1bmNfcHJjdGwiICE9ICJ4eWVzIiAmJiBcCisJCUFDX01TR19FUlJPUihbc2VjY29tcF9maWx0ZXIgc2FuZGJveCByZXF1aXJlcyBwcmN0bCBmdW5jdGlvbl0pCisJU0FOREJPWF9TVFlMRT0ic2VjY29tcF9maWx0ZXIiCisJQUNfREVGSU5FKFtTQU5EQk9YX1NFQ0NPTVBfRklMVEVSXSwgWzFdLCBbU2FuZGJveCB1c2luZyBzZWNjb21wIGZpbHRlcl0pCitlbGlmIHRlc3QgIngkc2FuZGJveF9hcmciID0gInhybGltaXQiIHx8IFwKKyAgICAgKCB0ZXN0IC16ICIkc2FuZGJveF9hcmciICYmIHRlc3QgIngkYWNfY3ZfZnVuY19zZXRybGltaXQiID0gInh5ZXMiICkgOyB0aGVuCisJdGVzdCAieCRhY19jdl9mdW5jX3NldHJsaW1pdCIgIT0gInh5ZXMiICYmIFwKKwkJQUNfTVNHX0VSUk9SKFtybGltaXQgc2FuZGJveCByZXF1aXJlcyBzZXRybGltaXQgZnVuY3Rpb25dKQorCVNBTkRCT1hfU1RZTEU9InJsaW1pdCIKKwlBQ19ERUZJTkUoW1NBTkRCT1hfUkxJTUlUXSwgWzFdLCBbU2FuZGJveCB1c2luZyBzZXRybGltaXQoMildKQorZWxpZiB0ZXN0IC16ICIkc2FuZGJveF9hcmciIHx8IHRlc3QgIngkc2FuZGJveF9hcmciID0gInhubyIgfHwgXAorICAgICB0ZXN0ICJ4JHNhbmRib3hfYXJnIiA9ICJ4bm9uZSIgfHwgdGVzdCAieCRzYW5kYm94X2FyZyIgPSAieG51bGwiIDsgdGhlbgorCVNBTkRCT1hfU1RZTEU9Im5vbmUiCisJQUNfREVGSU5FKFtTQU5EQk9YX05VTExdLCBbMV0sIFtubyBwcml2c2VwIHNhbmRib3hpbmddKQorZWxzZQorCUFDX01TR19FUlJPUihbdW5zdXBwb3J0ZWQgLS13aXRoLXNhbmRib3hdKQorZmkKKworIyBDaGVhcCBoYWNrIHRvIGVuc3VyZSBORVdTLU9TIGxpYnJhcmllcyBhcmUgYXJyYW5nZWQgcmlnaHQuCitpZiB0ZXN0ICEgLXogIiRTT05ZIiA7IHRoZW4KKyAgTElCUz0iJExJQlMgLWxpYmVydHkiOworZmkKKworIyBDaGVjayBmb3IgIGxvbmcgbG9uZyBkYXRhdHlwZXMKK0FDX0NIRUNLX1RZUEVTKFtsb25nIGxvbmcsIHVuc2lnbmVkIGxvbmcgbG9uZywgbG9uZyBkb3VibGVdKQorCisjIENoZWNrIGRhdGF0eXBlIHNpemVzCitBQ19DSEVDS19TSVpFT0YoW3Nob3J0IGludF0sIFsyXSkKK0FDX0NIRUNLX1NJWkVPRihbaW50XSwgWzRdKQorQUNfQ0hFQ0tfU0laRU9GKFtsb25nIGludF0sIFs0XSkKK0FDX0NIRUNLX1NJWkVPRihbbG9uZyBsb25nIGludF0sIFs4XSkKKworIyBTYW5pdHkgY2hlY2sgbG9uZyBsb25nIGZvciBzb21lIHBsYXRmb3JtcyAoQUlYKQoraWYgdGVzdCAieCRhY19jdl9zaXplb2ZfbG9uZ19sb25nX2ludCIgPSAieDQiIDsgdGhlbgorCWFjX2N2X3NpemVvZl9sb25nX2xvbmdfaW50PTAKK2ZpCisKKyMgY29tcHV0ZSBMTE9OR19NSU4gYW5kIExMT05HX01BWCBpZiB3ZSBkb24ndCBrbm93IHRoZW0uCitpZiB0ZXN0IC16ICIkaGF2ZV9sbG9uZ19tYXgiOyB0aGVuCisJQUNfTVNHX0NIRUNLSU5HKFtmb3IgbWF4IHZhbHVlIG9mIGxvbmcgbG9uZ10pCisJQUNfUlVOX0lGRUxTRSgKKwkJW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN0ZGlvLmg+CisvKiBXaHkgaXMgdGhpcyBzbyBkYW1uIGhhcmQ/ICovCisjaWZkZWYgX19HTlVDX18KKyMgdW5kZWYgX19HTlVDX18KKyNlbmRpZgorI2RlZmluZSBfX1VTRV9JU09DOTkKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNkZWZpbmUgREFUQSAiY29uZnRlc3QubGxtaW5tYXgiCisjZGVmaW5lIG15X2FicyhhKSAoKGEpIDwgMCA/ICgoYSkgKiAtMSkgOiAoYSkpCisKKy8qCisgKiBwcmludGYgaW4gbGliYyBvbiBzb21lIHBsYXRmb3JtcyAoZWcgb2xkIFRydTY0KSBkb2VzIG5vdCB1bmRlcnN0YW5kICVsbGQgc28KKyAqIHdlIGRvIHRoaXMgdGhlIGhhcmQgd2F5LgorICovCitzdGF0aWMgaW50CitmcHJpbnRfbGwoRklMRSAqZiwgbG9uZyBsb25nIG4pCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGxbc2l6ZW9mKGxvbmcgbG9uZykgKiA4XTsKKworCWlmIChuIDwgMCkKKwkJaWYgKGZwcmludGYoZiwgIi0iKSA8IDApCisJCQlyZXR1cm4gLTE7CisJZm9yIChpID0gMDsgbiAhPSAwOyBpKyspIHsKKwkJbFtpXSA9IG15X2FicyhuICUgMTApOworCQluIC89IDEwOworCX0KKwlkbyB7CisJCWlmIChmcHJpbnRmKGYsICIlZCIsIGxbLS1pXSkgPCAwKQorCQkJcmV0dXJuIC0xOworCX0gd2hpbGUgKGkgIT0gMCk7CisJaWYgKGZwcmludGYoZiwgIiAiKSA8IDApCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKwkJXV0sIFtbCisJRklMRSAqZjsKKwlsb25nIGxvbmcgaSwgbGxtaW4sIGxsbWF4ID0gMDsKKworCWlmKChmID0gZm9wZW4oREFUQSwidyIpKSA9PSBOVUxMKQorCQlleGl0KDEpOworCisjaWYgZGVmaW5lZChMTE9OR19NSU4pICYmIGRlZmluZWQoTExPTkdfTUFYKQorCWZwcmludGYoc3RkZXJyLCAiVXNpbmcgc3lzdGVtIGhlYWRlciBmb3IgTExPTkdfTUlOIGFuZCBMTE9OR19NQVhcbiIpOworCWxsbWluID0gTExPTkdfTUlOOworCWxsbWF4ID0gTExPTkdfTUFYOworI2Vsc2UKKwlmcHJpbnRmKHN0ZGVyciwgIkNhbGN1bGF0aW5nICBMTE9OR19NSU4gYW5kIExMT05HX01BWFxuIik7CisJLyogVGhpcyB3aWxsIHdvcmsgb24gb25lJ3MgY29tcGxlbWVudCBhbmQgdHdvJ3MgY29tcGxlbWVudCAqLworCWZvciAoaSA9IDE7IGkgPiBsbG1heDsgaSA8PD0gMSwgaSsrKQorCQlsbG1heCA9IGk7CisJbGxtaW4gPSBsbG1heCArIDFMTDsJLyogd3JhcCAqLworI2VuZGlmCisKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAobGxtaW4gKyAxIDwgbGxtaW4gfHwgbGxtaW4gLSAxIDwgbGxtaW4gfHwgbGxtYXggKyAxID4gbGxtYXgKKwkgICAgfHwgbGxtYXggLSAxID4gbGxtYXggfHwgbGxtaW4gPT0gbGxtYXggfHwgbGxtaW4gPT0gMAorCSAgICB8fCBsbG1heCA9PSAwIHx8IGxsbWF4IDwgTE9OR19NQVggfHwgbGxtaW4gPiBMT05HX01JTikgeworCQlmcHJpbnRmKGYsICJ1bmtub3duIHVua25vd25cbiIpOworCQlleGl0KDIpOworCX0KKworCWlmIChmcHJpbnRfbGwoZiwgbGxtaW4pIDwgMCkKKwkJZXhpdCgzKTsKKwlpZiAoZnByaW50X2xsKGYsIGxsbWF4KSA8IDApCisJCWV4aXQoNCk7CisJaWYgKGZjbG9zZShmKSA8IDApCisJCWV4aXQoNSk7CisJZXhpdCgwKTsKKwkJXV0pXSwKKwkJWworCQkJbGxvbmdfbWluPWAkQVdLICd7cHJpbnQgJDF9JyBjb25mdGVzdC5sbG1pbm1heGAKKwkJCWxsb25nX21heD1gJEFXSyAne3ByaW50ICQyfScgY29uZnRlc3QubGxtaW5tYXhgCisKKwkJCUFDX01TR19SRVNVTFQoWyRsbG9uZ19tYXhdKQorCQkJQUNfREVGSU5FX1VOUVVPVEVEKFtMTE9OR19NQVhdLCBbJHtsbG9uZ19tYXh9TExdLAorCQkJICAgIFttYXggdmFsdWUgb2YgbG9uZyBsb25nIGNhbGN1bGF0ZWQgYnkgY29uZmlndXJlXSkKKwkJCUFDX01TR19DSEVDS0lORyhbZm9yIG1pbiB2YWx1ZSBvZiBsb25nIGxvbmddKQorCQkJQUNfTVNHX1JFU1VMVChbJGxsb25nX21pbl0pCisJCQlBQ19ERUZJTkVfVU5RVU9URUQoW0xMT05HX01JTl0sIFske2xsb25nX21pbn1MTF0sCisJCQkgICAgW21pbiB2YWx1ZSBvZiBsb25nIGxvbmcgY2FsY3VsYXRlZCBieSBjb25maWd1cmVdKQorCQldLAorCQlbCisJCQlBQ19NU0dfUkVTVUxUKFtub3QgZm91bmRdKQorCQldLAorCQlbCisJCQlBQ19NU0dfV0FSTihbY3Jvc3MgY29tcGlsaW5nOiBub3QgY2hlY2tpbmddKQorCQldCisJKQorZmkKKworCisjIE1vcmUgY2hlY2tzIGZvciBkYXRhIHR5cGVzCitBQ19DQUNIRV9DSEVDSyhbZm9yIHVfaW50IHR5cGVdLCBhY19jdl9oYXZlX3VfaW50LCBbCisJQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+IF1dLAorCVtbIHVfaW50IGE7IGEgPSAxO11dKV0sCisJWyBhY19jdl9oYXZlX3VfaW50PSJ5ZXMiIF0sIFsgYWNfY3ZfaGF2ZV91X2ludD0ibm8iIAorCV0pCitdKQoraWYgdGVzdCAieCRhY19jdl9oYXZlX3VfaW50IiA9ICJ4eWVzIiA7IHRoZW4KKwlBQ19ERUZJTkUoW0hBVkVfVV9JTlRdLCBbMV0sIFtkZWZpbmUgaWYgeW91IGhhdmUgdV9pbnQgZGF0YSB0eXBlXSkKKwloYXZlX3VfaW50PTEKK2ZpCisKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgaW50WFhfdCB0eXBlc10sIGFjX2N2X2hhdmVfaW50eHhfdCwgWworCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPHN5cy90eXBlcy5oPiBdXSwKKwlbWyBpbnQ4X3QgYTsgaW50MTZfdCBiOyBpbnQzMl90IGM7IGEgPSBiID0gYyA9IDE7XV0pXSwKKwlbIGFjX2N2X2hhdmVfaW50eHhfdD0ieWVzIiBdLCBbIGFjX2N2X2hhdmVfaW50eHhfdD0ibm8iIAorCV0pCitdKQoraWYgdGVzdCAieCRhY19jdl9oYXZlX2ludHh4X3QiID0gInh5ZXMiIDsgdGhlbgorCUFDX0RFRklORShbSEFWRV9JTlRYWF9UXSwgWzFdLCBbZGVmaW5lIGlmIHlvdSBoYXZlIGludHh4X3QgZGF0YSB0eXBlXSkKKwloYXZlX2ludHh4X3Q9MQorZmkKKworaWYgKHRlc3QgLXogIiRoYXZlX2ludHh4X3QiICYmIFwKKwkgICB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9zdGRpbnRfaCIgPSAieHllcyIpCit0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgaW50WFhfdCB0eXBlcyBpbiBzdGRpbnQuaF0pCisJQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8c3RkaW50Lmg+IF1dLAorCVtbIGludDhfdCBhOyBpbnQxNl90IGI7IGludDMyX3QgYzsgYSA9IGIgPSBjID0gMTtdXSldLAorCQlbCisJCQlBQ19ERUZJTkUoW0hBVkVfSU5UWFhfVF0pCisJCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCQldLCBbIEFDX01TR19SRVNVTFQoW25vXSkgCisJXSkKK2ZpCisKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgaW50NjRfdCB0eXBlXSwgYWNfY3ZfaGF2ZV9pbnQ2NF90LCBbCisJQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1RESU5UX0gKKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjIGluY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjZW5kaWYKKwkJXV0sIFtbCitpbnQ2NF90IGE7IGEgPSAxOworCQldXSldLAorCVsgYWNfY3ZfaGF2ZV9pbnQ2NF90PSJ5ZXMiIF0sIFsgYWNfY3ZfaGF2ZV9pbnQ2NF90PSJubyIgCisJXSkKK10pCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfaW50NjRfdCIgPSAieHllcyIgOyB0aGVuCisJQUNfREVGSU5FKFtIQVZFX0lOVDY0X1RdLCBbMV0sIFtkZWZpbmUgaWYgeW91IGhhdmUgaW50NjRfdCBkYXRhIHR5cGVdKQorZmkKKworQUNfQ0FDSEVfQ0hFQ0soW2ZvciB1X2ludFhYX3QgdHlwZXNdLCBhY19jdl9oYXZlX3VfaW50eHhfdCwgWworCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPHN5cy90eXBlcy5oPiBdXSwKKwlbWyB1X2ludDhfdCBhOyB1X2ludDE2X3QgYjsgdV9pbnQzMl90IGM7IGEgPSBiID0gYyA9IDE7XV0pXSwKKwlbIGFjX2N2X2hhdmVfdV9pbnR4eF90PSJ5ZXMiIF0sIFsgYWNfY3ZfaGF2ZV91X2ludHh4X3Q9Im5vIiAKKwldKQorXSkKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV91X2ludHh4X3QiID0gInh5ZXMiIDsgdGhlbgorCUFDX0RFRklORShbSEFWRV9VX0lOVFhYX1RdLCBbMV0sIFtkZWZpbmUgaWYgeW91IGhhdmUgdV9pbnR4eF90IGRhdGEgdHlwZV0pCisJaGF2ZV91X2ludHh4X3Q9MQorZmkKKworaWYgdGVzdCAteiAiJGhhdmVfdV9pbnR4eF90IiA7IHRoZW4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB1X2ludFhYX3QgdHlwZXMgaW4gc3lzL3NvY2tldC5oXSkKKwlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+IF1dLAorCVtbIHVfaW50OF90IGE7IHVfaW50MTZfdCBiOyB1X2ludDMyX3QgYzsgYSA9IGIgPSBjID0gMTtdXSldLAorCQlbCisJCQlBQ19ERUZJTkUoW0hBVkVfVV9JTlRYWF9UXSkKKwkJCUFDX01TR19SRVNVTFQoW3llc10pCisJCV0sIFsgQUNfTVNHX1JFU1VMVChbbm9dKSAKKwldKQorZmkKKworQUNfQ0FDSEVfQ0hFQ0soW2ZvciB1X2ludDY0X3QgdHlwZXNdLCBhY19jdl9oYXZlX3VfaW50NjRfdCwgWworCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPHN5cy90eXBlcy5oPiBdXSwKKwlbWyB1X2ludDY0X3QgYTsgYSA9IDE7XV0pXSwKKwlbIGFjX2N2X2hhdmVfdV9pbnQ2NF90PSJ5ZXMiIF0sIFsgYWNfY3ZfaGF2ZV91X2ludDY0X3Q9Im5vIiAKKwldKQorXSkKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV91X2ludDY0X3QiID0gInh5ZXMiIDsgdGhlbgorCUFDX0RFRklORShbSEFWRV9VX0lOVDY0X1RdLCBbMV0sIFtkZWZpbmUgaWYgeW91IGhhdmUgdV9pbnQ2NF90IGRhdGEgdHlwZV0pCisJaGF2ZV91X2ludDY0X3Q9MQorZmkKKworaWYgdGVzdCAteiAiJGhhdmVfdV9pbnQ2NF90IiA7IHRoZW4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB1X2ludDY0X3QgdHlwZSBpbiBzeXMvYml0eXBlcy5oXSkKKwlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbICNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPiBdXSwKKwlbWyB1X2ludDY0X3QgYTsgYSA9IDFdXSldLAorCQlbCisJCQlBQ19ERUZJTkUoW0hBVkVfVV9JTlQ2NF9UXSkKKwkJCUFDX01TR19SRVNVTFQoW3llc10pCisJCV0sIFsgQUNfTVNHX1JFU1VMVChbbm9dKSAKKwldKQorZmkKKworaWYgdGVzdCAteiAiJGhhdmVfdV9pbnR4eF90IiA7IHRoZW4KKwlBQ19DQUNIRV9DSEVDSyhbZm9yIHVpbnRYWF90IHR5cGVzXSwgYWNfY3ZfaGF2ZV91aW50eHhfdCwgWworCQlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJCQldXSwgW1sKKwl1aW50OF90IGE7CisJdWludDE2X3QgYjsKKwl1aW50MzJfdCBjOworCWEgPSBiID0gYyA9IDE7CisJCQldXSldLAorCQlbIGFjX2N2X2hhdmVfdWludHh4X3Q9InllcyIgXSwgWyBhY19jdl9oYXZlX3VpbnR4eF90PSJubyIgCisJCV0pCisJXSkKKwlpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfdWludHh4X3QiID0gInh5ZXMiIDsgdGhlbgorCQlBQ19ERUZJTkUoW0hBVkVfVUlOVFhYX1RdLCBbMV0sCisJCQlbZGVmaW5lIGlmIHlvdSBoYXZlIHVpbnR4eF90IGRhdGEgdHlwZV0pCisJZmkKK2ZpCisKK2lmIHRlc3QgLXogIiRoYXZlX3VpbnR4eF90IiA7IHRoZW4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB1aW50WFhfdCB0eXBlcyBpbiBzdGRpbnQuaF0pCisJQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8c3RkaW50Lmg+IF1dLAorCVtbIHVpbnQ4X3QgYTsgdWludDE2X3QgYjsgdWludDMyX3QgYzsgYSA9IGIgPSBjID0gMTtdXSldLAorCQlbCisJCQlBQ19ERUZJTkUoW0hBVkVfVUlOVFhYX1RdKQorCQkJQUNfTVNHX1JFU1VMVChbeWVzXSkKKwkJXSwgWyBBQ19NU0dfUkVTVUxUKFtub10pIAorCV0pCitmaQorCitpZiAodGVzdCAteiAiJGhhdmVfdV9pbnR4eF90IiB8fCB0ZXN0IC16ICIkaGF2ZV9pbnR4eF90IiAmJiBcCisJICAgdGVzdCAieCRhY19jdl9oZWFkZXJfc3lzX2JpdHlwZXNfaCIgPSAieHllcyIpCit0aGVuCisJQUNfTVNHX0NIRUNLSU5HKFtmb3IgaW50WFhfdCBhbmQgdV9pbnRYWF90IHR5cGVzIGluIHN5cy9iaXR5cGVzLmhdKQorCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorCQldXSwgW1sKKwkJCWludDhfdCBhOyBpbnQxNl90IGI7IGludDMyX3QgYzsKKwkJCXVfaW50OF90IGU7IHVfaW50MTZfdCBmOyB1X2ludDMyX3QgZzsKKwkJCWEgPSBiID0gYyA9IGUgPSBmID0gZyA9IDE7CisJCV1dKV0sCisJCVsKKwkJCUFDX0RFRklORShbSEFWRV9VX0lOVFhYX1RdKQorCQkJQUNfREVGSU5FKFtIQVZFX0lOVFhYX1RdKQorCQkJQUNfTVNHX1JFU1VMVChbeWVzXSkKKwkJXSwgW0FDX01TR19SRVNVTFQoW25vXSkKKwldKQorZmkKKworCitBQ19DQUNIRV9DSEVDSyhbZm9yIHVfY2hhcl0sIGFjX2N2X2hhdmVfdV9jaGFyLCBbCisJQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+IF1dLAorCVtbIHVfY2hhciBmb287IGZvbyA9IDEyNTsgXV0pXSwKKwlbIGFjX2N2X2hhdmVfdV9jaGFyPSJ5ZXMiIF0sIFsgYWNfY3ZfaGF2ZV91X2NoYXI9Im5vIiAKKwldKQorXSkKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV91X2NoYXIiID0gInh5ZXMiIDsgdGhlbgorCUFDX0RFRklORShbSEFWRV9VX0NIQVJdLCBbMV0sIFtkZWZpbmUgaWYgeW91IGhhdmUgdV9jaGFyIGRhdGEgdHlwZV0pCitmaQorCitUWVBFX1NPQ0tMRU5fVAorCitBQ19DSEVDS19UWVBFUyhbc2lnX2F0b21pY190XSwgLCAsIFsjaW5jbHVkZSA8c2lnbmFsLmg+XSkKK0FDX0NIRUNLX1RZUEVTKFtmc2Jsa2NudF90LCBmc2ZpbGNudF90XSwgLCAsIFsKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfU1RBVEZTX0gKKyNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19TVEFUVkZTX0gKKyNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgorI2VuZGlmCitdKQorCitBQ19DSEVDS19UWVBFUyhbaW5fYWRkcl90LCBpbl9wb3J0X3RdLCAsICwKK1sjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPl0pCisKK0FDX0NBQ0hFX0NIRUNLKFtmb3Igc2l6ZV90XSwgYWNfY3ZfaGF2ZV9zaXplX3QsIFsKKwlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gXV0sCisJW1sgc2l6ZV90IGZvbzsgZm9vID0gMTIzNTsgXV0pXSwKKwlbIGFjX2N2X2hhdmVfc2l6ZV90PSJ5ZXMiIF0sIFsgYWNfY3ZfaGF2ZV9zaXplX3Q9Im5vIiAKKwldKQorXSkKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9zaXplX3QiID0gInh5ZXMiIDsgdGhlbgorCUFDX0RFRklORShbSEFWRV9TSVpFX1RdLCBbMV0sIFtkZWZpbmUgaWYgeW91IGhhdmUgc2l6ZV90IGRhdGEgdHlwZV0pCitmaQorCitBQ19DQUNIRV9DSEVDSyhbZm9yIHNzaXplX3RdLCBhY19jdl9oYXZlX3NzaXplX3QsIFsKKwlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gXV0sCisJW1sgc3NpemVfdCBmb287IGZvbyA9IDEyMzU7IF1dKV0sCisJWyBhY19jdl9oYXZlX3NzaXplX3Q9InllcyIgXSwgWyBhY19jdl9oYXZlX3NzaXplX3Q9Im5vIiAKKwldKQorXSkKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9zc2l6ZV90IiA9ICJ4eWVzIiA7IHRoZW4KKwlBQ19ERUZJTkUoW0hBVkVfU1NJWkVfVF0sIFsxXSwgW2RlZmluZSBpZiB5b3UgaGF2ZSBzc2l6ZV90IGRhdGEgdHlwZV0pCitmaQorCitBQ19DQUNIRV9DSEVDSyhbZm9yIGNsb2NrX3RdLCBhY19jdl9oYXZlX2Nsb2NrX3QsIFsKKwlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbICNpbmNsdWRlIDx0aW1lLmg+IF1dLAorCVtbIGNsb2NrX3QgZm9vOyBmb28gPSAxMjM1OyBdXSldLAorCVsgYWNfY3ZfaGF2ZV9jbG9ja190PSJ5ZXMiIF0sIFsgYWNfY3ZfaGF2ZV9jbG9ja190PSJubyIgCisJXSkKK10pCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfY2xvY2tfdCIgPSAieHllcyIgOyB0aGVuCisJQUNfREVGSU5FKFtIQVZFX0NMT0NLX1RdLCBbMV0sIFtkZWZpbmUgaWYgeW91IGhhdmUgY2xvY2tfdCBkYXRhIHR5cGVdKQorZmkKKworQUNfQ0FDSEVfQ0hFQ0soW2ZvciBzYV9mYW1pbHlfdF0sIGFjX2N2X2hhdmVfc2FfZmFtaWx5X3QsIFsKKwlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCQldXSwgW1sgc2FfZmFtaWx5X3QgZm9vOyBmb28gPSAxMjM1OyBdXSldLAorCVsgYWNfY3ZfaGF2ZV9zYV9mYW1pbHlfdD0ieWVzIiBdLAorCVsgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisJCV1dLCBbWyBzYV9mYW1pbHlfdCBmb287IGZvbyA9IDEyMzU7IF1dKV0sCisJCVsgYWNfY3ZfaGF2ZV9zYV9mYW1pbHlfdD0ieWVzIiBdLAorCQlbIGFjX2N2X2hhdmVfc2FfZmFtaWx5X3Q9Im5vIiBdCisJKQorCV0pCitdKQoraWYgdGVzdCAieCRhY19jdl9oYXZlX3NhX2ZhbWlseV90IiA9ICJ4eWVzIiA7IHRoZW4KKwlBQ19ERUZJTkUoW0hBVkVfU0FfRkFNSUxZX1RdLCBbMV0sCisJCVtkZWZpbmUgaWYgeW91IGhhdmUgc2FfZmFtaWx5X3QgZGF0YSB0eXBlXSkKK2ZpCisKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgcGlkX3RdLCBhY19jdl9oYXZlX3BpZF90LCBbCisJQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+IF1dLAorCVtbIHBpZF90IGZvbzsgZm9vID0gMTIzNTsgXV0pXSwKKwlbIGFjX2N2X2hhdmVfcGlkX3Q9InllcyIgXSwgWyBhY19jdl9oYXZlX3BpZF90PSJubyIgCisJXSkKK10pCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfcGlkX3QiID0gInh5ZXMiIDsgdGhlbgorCUFDX0RFRklORShbSEFWRV9QSURfVF0sIFsxXSwgW2RlZmluZSBpZiB5b3UgaGF2ZSBwaWRfdCBkYXRhIHR5cGVdKQorZmkKKworQUNfQ0FDSEVfQ0hFQ0soW2ZvciBtb2RlX3RdLCBhY19jdl9oYXZlX21vZGVfdCwgWworCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPHN5cy90eXBlcy5oPiBdXSwKKwlbWyBtb2RlX3QgZm9vOyBmb28gPSAxMjM1OyBdXSldLAorCVsgYWNfY3ZfaGF2ZV9tb2RlX3Q9InllcyIgXSwgWyBhY19jdl9oYXZlX21vZGVfdD0ibm8iIAorCV0pCitdKQoraWYgdGVzdCAieCRhY19jdl9oYXZlX21vZGVfdCIgPSAieHllcyIgOyB0aGVuCisJQUNfREVGSU5FKFtIQVZFX01PREVfVF0sIFsxXSwgW2RlZmluZSBpZiB5b3UgaGF2ZSBtb2RlX3QgZGF0YSB0eXBlXSkKK2ZpCisKKworQUNfQ0FDSEVfQ0hFQ0soW2ZvciBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZV0sIGFjX2N2X2hhdmVfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2UsIFsKKwlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCQldXSwgW1sgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgczsgXV0pXSwKKwlbIGFjX2N2X2hhdmVfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2U9InllcyIgXSwKKwlbIGFjX2N2X2hhdmVfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2U9Im5vIiAKKwldKQorXSkKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9zdHJ1Y3Rfc29ja2FkZHJfc3RvcmFnZSIgPSAieHllcyIgOyB0aGVuCisJQUNfREVGSU5FKFtIQVZFX1NUUlVDVF9TT0NLQUREUl9TVE9SQUdFXSwgWzFdLAorCQlbZGVmaW5lIGlmIHlvdSBoYXZlIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGRhdGEgdHlwZV0pCitmaQorCitBQ19DQUNIRV9DSEVDSyhbZm9yIHN0cnVjdCBzb2NrYWRkcl9pbjZdLCBhY19jdl9oYXZlX3N0cnVjdF9zb2NrYWRkcl9pbjYsIFsKKwlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCQldXSwgW1sgc3RydWN0IHNvY2thZGRyX2luNiBzOyBzLnNpbjZfZmFtaWx5ID0gMDsgXV0pXSwKKwlbIGFjX2N2X2hhdmVfc3RydWN0X3NvY2thZGRyX2luNj0ieWVzIiBdLAorCVsgYWNfY3ZfaGF2ZV9zdHJ1Y3Rfc29ja2FkZHJfaW42PSJubyIgCisJXSkKK10pCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfc3RydWN0X3NvY2thZGRyX2luNiIgPSAieHllcyIgOyB0aGVuCisJQUNfREVGSU5FKFtIQVZFX1NUUlVDVF9TT0NLQUREUl9JTjZdLCBbMV0sCisJCVtkZWZpbmUgaWYgeW91IGhhdmUgc3RydWN0IHNvY2thZGRyX2luNiBkYXRhIHR5cGVdKQorZmkKKworQUNfQ0FDSEVfQ0hFQ0soW2ZvciBzdHJ1Y3QgaW42X2FkZHJdLCBhY19jdl9oYXZlX3N0cnVjdF9pbjZfYWRkciwgWworCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisJCV1dLCBbWyBzdHJ1Y3QgaW42X2FkZHIgczsgcy5zNl9hZGRyWzBdID0gMDsgXV0pXSwKKwlbIGFjX2N2X2hhdmVfc3RydWN0X2luNl9hZGRyPSJ5ZXMiIF0sCisJWyBhY19jdl9oYXZlX3N0cnVjdF9pbjZfYWRkcj0ibm8iIAorCV0pCitdKQoraWYgdGVzdCAieCRhY19jdl9oYXZlX3N0cnVjdF9pbjZfYWRkciIgPSAieHllcyIgOyB0aGVuCisJQUNfREVGSU5FKFtIQVZFX1NUUlVDVF9JTjZfQUREUl0sIFsxXSwKKwkJW2RlZmluZSBpZiB5b3UgaGF2ZSBzdHJ1Y3QgaW42X2FkZHIgZGF0YSB0eXBlXSkKKworZG5sIE5vdyBjaGVjayBmb3Igc2luNl9zY29wZV9pZAorCUFDX0NIRUNLX01FTUJFUlMoW3N0cnVjdCBzb2NrYWRkcl9pbjYuc2luNl9zY29wZV9pZF0sICwgLAorCQlbCisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCQldKQorZmkKKworQUNfQ0FDSEVfQ0hFQ0soW2ZvciBzdHJ1Y3QgYWRkcmluZm9dLCBhY19jdl9oYXZlX3N0cnVjdF9hZGRyaW5mbywgWworCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKwkJXV0sIFtbIHN0cnVjdCBhZGRyaW5mbyBzOyBzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRTsgXV0pXSwKKwlbIGFjX2N2X2hhdmVfc3RydWN0X2FkZHJpbmZvPSJ5ZXMiIF0sCisJWyBhY19jdl9oYXZlX3N0cnVjdF9hZGRyaW5mbz0ibm8iIAorCV0pCitdKQoraWYgdGVzdCAieCRhY19jdl9oYXZlX3N0cnVjdF9hZGRyaW5mbyIgPSAieHllcyIgOyB0aGVuCisJQUNfREVGSU5FKFtIQVZFX1NUUlVDVF9BRERSSU5GT10sIFsxXSwKKwkJW2RlZmluZSBpZiB5b3UgaGF2ZSBzdHJ1Y3QgYWRkcmluZm8gZGF0YSB0eXBlXSkKK2ZpCisKK0FDX0NBQ0hFX0NIRUNLKFtmb3Igc3RydWN0IHRpbWV2YWxdLCBhY19jdl9oYXZlX3N0cnVjdF90aW1ldmFsLCBbCisJQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8c3lzL3RpbWUuaD4gXV0sCisJW1sgc3RydWN0IHRpbWV2YWwgdHY7IHR2LnR2X3NlYyA9IDE7XV0pXSwKKwlbIGFjX2N2X2hhdmVfc3RydWN0X3RpbWV2YWw9InllcyIgXSwKKwlbIGFjX2N2X2hhdmVfc3RydWN0X3RpbWV2YWw9Im5vIiAKKwldKQorXSkKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9zdHJ1Y3RfdGltZXZhbCIgPSAieHllcyIgOyB0aGVuCisJQUNfREVGSU5FKFtIQVZFX1NUUlVDVF9USU1FVkFMXSwgWzFdLCBbZGVmaW5lIGlmIHlvdSBoYXZlIHN0cnVjdCB0aW1ldmFsXSkKKwloYXZlX3N0cnVjdF90aW1ldmFsPTEKK2ZpCisKK0FDX0NIRUNLX1RZUEVTKFtzdHJ1Y3QgdGltZXNwZWNdKQorCisjIFdlIG5lZWQgaW50NjRfdCBvciBlbHNlIGNlcnRpYW4gcGFydHMgb2YgdGhlIGNvbXBpbGUgd2lsbCBmYWlsLgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2ludDY0X3QiID0gInhubyIgJiYgXAorCXRlc3QgIngkYWNfY3Zfc2l6ZW9mX2xvbmdfaW50IiAhPSAieDgiICYmIFwKKwl0ZXN0ICJ4JGFjX2N2X3NpemVvZl9sb25nX2xvbmdfaW50IiA9ICJ4MCIgOyB0aGVuCisJZWNobyAiT3BlblNTSCByZXF1aXJlcyBpbnQ2NF90IHN1cHBvcnQuICBDb250YWN0IHlvdXIgdmVuZG9yIG9yIGluc3RhbGwiCisJZWNobyAiYW4gYWx0ZXJuYXRpdmUgY29tcGlsZXIgKEkuRS4sIEdDQykgYmVmb3JlIGNvbnRpbnVpbmcuIgorCWVjaG8gIiIKKwlleGl0IDE7CitlbHNlCitkbmwgdGVzdCBzbnByaW50ZiAoYnJva2VuIG9uIFNDTyB3L2djYykKKwlBQ19SVU5fSUZFTFNFKAorCQlbQUNfTEFOR19TT1VSQ0UoW1sKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIEhBVkVfU05QUklOVEYKK21haW4oKQoreworCWNoYXIgYnVmWzUwXTsKKwljaGFyIGV4cGVjdGVkX291dFs1MF07CisJaW50IG1henNpemUgPSA1MCA7CisjaWYgKFNJWkVPRl9MT05HX0lOVCA9PSA4KQorCWxvbmcgaW50IG51bSA9IDB4N2ZmZmZmZmZmZmZmZmZmZjsKKyNlbHNlCisJbG9uZyBsb25nIG51bSA9IDB4N2ZmZmZmZmZmZmZmZmZmZmxsOworI2VuZGlmCisJc3RyY3B5KGV4cGVjdGVkX291dCwgIjkyMjMzNzIwMzY4NTQ3NzU4MDciKTsKKwlzbnByaW50ZihidWYsIG1henNpemUsICIlbGxkIiwgbnVtKTsKKwlpZihzdHJjbXAoYnVmLCBleHBlY3RlZF9vdXQpICE9IDApCisJCWV4aXQoMSk7CisJZXhpdCgwKTsKK30KKyNlbHNlCittYWluKCkgeyBleGl0KDApOyB9CisjZW5kaWYKKwkJXV0pXSwgWyB0cnVlIF0sIFsgQUNfREVGSU5FKFtCUk9LRU5fU05QUklOVEZdKSBdLAorCQlBQ19NU0dfV0FSTihbY3Jvc3MgY29tcGlsaW5nOiBBc3N1bWluZyB3b3JraW5nIHNucHJpbnRmKCldKQorCSkKK2ZpCisKK2RubCBDaGVja3MgZm9yIHN0cnVjdHVyZSBtZW1iZXJzCitPU1NIX0NIRUNLX0hFQURFUl9GT1JfRklFTEQoW3V0X2hvc3RdLCBbdXRtcC5oXSwgW0hBVkVfSE9TVF9JTl9VVE1QXSkKK09TU0hfQ0hFQ0tfSEVBREVSX0ZPUl9GSUVMRChbdXRfaG9zdF0sIFt1dG1weC5oXSwgW0hBVkVfSE9TVF9JTl9VVE1QWF0pCitPU1NIX0NIRUNLX0hFQURFUl9GT1JfRklFTEQoW3N5c2xlbl0sIFt1dG1weC5oXSwgW0hBVkVfU1lTTEVOX0lOX1VUTVBYXSkKK09TU0hfQ0hFQ0tfSEVBREVSX0ZPUl9GSUVMRChbdXRfcGlkXSwgW3V0bXAuaF0sIFtIQVZFX1BJRF9JTl9VVE1QXSkKK09TU0hfQ0hFQ0tfSEVBREVSX0ZPUl9GSUVMRChbdXRfdHlwZV0sIFt1dG1wLmhdLCBbSEFWRV9UWVBFX0lOX1VUTVBdKQorT1NTSF9DSEVDS19IRUFERVJfRk9SX0ZJRUxEKFt1dF90eXBlXSwgW3V0bXB4LmhdLCBbSEFWRV9UWVBFX0lOX1VUTVBYXSkKK09TU0hfQ0hFQ0tfSEVBREVSX0ZPUl9GSUVMRChbdXRfdHZdLCBbdXRtcC5oXSwgW0hBVkVfVFZfSU5fVVRNUF0pCitPU1NIX0NIRUNLX0hFQURFUl9GT1JfRklFTEQoW3V0X2lkXSwgW3V0bXAuaF0sIFtIQVZFX0lEX0lOX1VUTVBdKQorT1NTSF9DSEVDS19IRUFERVJfRk9SX0ZJRUxEKFt1dF9pZF0sIFt1dG1weC5oXSwgW0hBVkVfSURfSU5fVVRNUFhdKQorT1NTSF9DSEVDS19IRUFERVJfRk9SX0ZJRUxEKFt1dF9hZGRyXSwgW3V0bXAuaF0sIFtIQVZFX0FERFJfSU5fVVRNUF0pCitPU1NIX0NIRUNLX0hFQURFUl9GT1JfRklFTEQoW3V0X2FkZHJdLCBbdXRtcHguaF0sIFtIQVZFX0FERFJfSU5fVVRNUFhdKQorT1NTSF9DSEVDS19IRUFERVJfRk9SX0ZJRUxEKFt1dF9hZGRyX3Y2XSwgW3V0bXAuaF0sIFtIQVZFX0FERFJfVjZfSU5fVVRNUF0pCitPU1NIX0NIRUNLX0hFQURFUl9GT1JfRklFTEQoW3V0X2FkZHJfdjZdLCBbdXRtcHguaF0sIFtIQVZFX0FERFJfVjZfSU5fVVRNUFhdKQorT1NTSF9DSEVDS19IRUFERVJfRk9SX0ZJRUxEKFt1dF9leGl0XSwgW3V0bXAuaF0sIFtIQVZFX0VYSVRfSU5fVVRNUF0pCitPU1NIX0NIRUNLX0hFQURFUl9GT1JfRklFTEQoW3V0X3RpbWVdLCBbdXRtcC5oXSwgW0hBVkVfVElNRV9JTl9VVE1QXSkKK09TU0hfQ0hFQ0tfSEVBREVSX0ZPUl9GSUVMRChbdXRfdGltZV0sIFt1dG1weC5oXSwgW0hBVkVfVElNRV9JTl9VVE1QWF0pCitPU1NIX0NIRUNLX0hFQURFUl9GT1JfRklFTEQoW3V0X3R2XSwgW3V0bXB4LmhdLCBbSEFWRV9UVl9JTl9VVE1QWF0pCisKK0FDX0NIRUNLX01FTUJFUlMoW3N0cnVjdCBzdGF0LnN0X2Jsa3NpemVdKQorQUNfQ0hFQ0tfTUVNQkVSKFtzdHJ1Y3QgX19yZXNfc3RhdGUucmV0cmFuc10sIFtdLCBbQUNfREVGSU5FKFtfX3Jlc19zdGF0ZV0sIFtzdGF0ZV0sCisJW0RlZmluZSBpZiB3ZSBkb24ndCBoYXZlIHN0cnVjdCBfX3Jlc19zdGF0ZSBpbiByZXNvbHYuaF0pXSwKK1sKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+CisjaW5jbHVkZSA8cmVzb2x2Lmg+CitdKQorCitBQ19DQUNIRV9DSEVDSyhbZm9yIHNzX2ZhbWlseSBmaWVsZCBpbiBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZV0sCisJCWFjX2N2X2hhdmVfc3NfZmFtaWx5X2luX3N0cnVjdF9zcywgWworCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisJCV1dLCBbWyBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzOyBzLnNzX2ZhbWlseSA9IDE7IF1dKV0sCisJWyBhY19jdl9oYXZlX3NzX2ZhbWlseV9pbl9zdHJ1Y3Rfc3M9InllcyIgXSwKKwlbIGFjX2N2X2hhdmVfc3NfZmFtaWx5X2luX3N0cnVjdF9zcz0ibm8iIF0pCitdKQoraWYgdGVzdCAieCRhY19jdl9oYXZlX3NzX2ZhbWlseV9pbl9zdHJ1Y3Rfc3MiID0gInh5ZXMiIDsgdGhlbgorCUFDX0RFRklORShbSEFWRV9TU19GQU1JTFlfSU5fU1NdLCBbMV0sIFtGaWVsZHMgaW4gc3RydWN0IHNvY2thZGRyX3N0b3JhZ2VdKQorZmkKKworQUNfQ0FDSEVfQ0hFQ0soW2ZvciBfX3NzX2ZhbWlseSBmaWVsZCBpbiBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZV0sCisJCWFjX2N2X2hhdmVfX19zc19mYW1pbHlfaW5fc3RydWN0X3NzLCBbCisJQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKwkJXV0sIFtbIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHM7IHMuX19zc19mYW1pbHkgPSAxOyBdXSldLAorCVsgYWNfY3ZfaGF2ZV9fX3NzX2ZhbWlseV9pbl9zdHJ1Y3Rfc3M9InllcyIgXSwKKwlbIGFjX2N2X2hhdmVfX19zc19mYW1pbHlfaW5fc3RydWN0X3NzPSJubyIgCisJXSkKK10pCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfX19zc19mYW1pbHlfaW5fc3RydWN0X3NzIiA9ICJ4eWVzIiA7IHRoZW4KKwlBQ19ERUZJTkUoW0hBVkVfX19TU19GQU1JTFlfSU5fU1NdLCBbMV0sCisJCVtGaWVsZHMgaW4gc3RydWN0IHNvY2thZGRyX3N0b3JhZ2VdKQorZmkKKworQUNfQ0FDSEVfQ0hFQ0soW2ZvciBwd19jbGFzcyBmaWVsZCBpbiBzdHJ1Y3QgcGFzc3dkXSwKKwkJYWNfY3ZfaGF2ZV9wd19jbGFzc19pbl9zdHJ1Y3RfcGFzc3dkLCBbCisJQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8cHdkLmg+IF1dLAorCVtbIHN0cnVjdCBwYXNzd2QgcDsgcC5wd19jbGFzcyA9IDA7IF1dKV0sCisJWyBhY19jdl9oYXZlX3B3X2NsYXNzX2luX3N0cnVjdF9wYXNzd2Q9InllcyIgXSwKKwlbIGFjX2N2X2hhdmVfcHdfY2xhc3NfaW5fc3RydWN0X3Bhc3N3ZD0ibm8iIAorCV0pCitdKQoraWYgdGVzdCAieCRhY19jdl9oYXZlX3B3X2NsYXNzX2luX3N0cnVjdF9wYXNzd2QiID0gInh5ZXMiIDsgdGhlbgorCUFDX0RFRklORShbSEFWRV9QV19DTEFTU19JTl9QQVNTV0RdLCBbMV0sCisJCVtEZWZpbmUgaWYgeW91ciBwYXNzd29yZCBoYXMgYSBwd19jbGFzcyBmaWVsZF0pCitmaQorCitBQ19DQUNIRV9DSEVDSyhbZm9yIHB3X2V4cGlyZSBmaWVsZCBpbiBzdHJ1Y3QgcGFzc3dkXSwKKwkJYWNfY3ZfaGF2ZV9wd19leHBpcmVfaW5fc3RydWN0X3Bhc3N3ZCwgWworCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPHB3ZC5oPiBdXSwKKwlbWyBzdHJ1Y3QgcGFzc3dkIHA7IHAucHdfZXhwaXJlID0gMDsgXV0pXSwKKwlbIGFjX2N2X2hhdmVfcHdfZXhwaXJlX2luX3N0cnVjdF9wYXNzd2Q9InllcyIgXSwKKwlbIGFjX2N2X2hhdmVfcHdfZXhwaXJlX2luX3N0cnVjdF9wYXNzd2Q9Im5vIiAKKwldKQorXSkKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9wd19leHBpcmVfaW5fc3RydWN0X3Bhc3N3ZCIgPSAieHllcyIgOyB0aGVuCisJQUNfREVGSU5FKFtIQVZFX1BXX0VYUElSRV9JTl9QQVNTV0RdLCBbMV0sCisJCVtEZWZpbmUgaWYgeW91ciBwYXNzd29yZCBoYXMgYSBwd19leHBpcmUgZmllbGRdKQorZmkKKworQUNfQ0FDSEVfQ0hFQ0soW2ZvciBwd19jaGFuZ2UgZmllbGQgaW4gc3RydWN0IHBhc3N3ZF0sCisJCWFjX2N2X2hhdmVfcHdfY2hhbmdlX2luX3N0cnVjdF9wYXNzd2QsIFsKKwlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbICNpbmNsdWRlIDxwd2QuaD4gXV0sCisJW1sgc3RydWN0IHBhc3N3ZCBwOyBwLnB3X2NoYW5nZSA9IDA7IF1dKV0sCisJWyBhY19jdl9oYXZlX3B3X2NoYW5nZV9pbl9zdHJ1Y3RfcGFzc3dkPSJ5ZXMiIF0sCisJWyBhY19jdl9oYXZlX3B3X2NoYW5nZV9pbl9zdHJ1Y3RfcGFzc3dkPSJubyIgCisJXSkKK10pCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfcHdfY2hhbmdlX2luX3N0cnVjdF9wYXNzd2QiID0gInh5ZXMiIDsgdGhlbgorCUFDX0RFRklORShbSEFWRV9QV19DSEFOR0VfSU5fUEFTU1dEXSwgWzFdLAorCQlbRGVmaW5lIGlmIHlvdXIgcGFzc3dvcmQgaGFzIGEgcHdfY2hhbmdlIGZpZWxkXSkKK2ZpCisKK2RubCBtYWtlIHN1cmUgd2UncmUgdXNpbmcgdGhlIHJlYWwgc3RydWN0dXJlIG1lbWJlcnMgYW5kIG5vdCBkZWZpbmVzCitBQ19DQUNIRV9DSEVDSyhbZm9yIG1zZ19hY2NyaWdodHMgZmllbGQgaW4gc3RydWN0IG1zZ2hkcl0sCisJCWFjX2N2X2hhdmVfYWNjcmlnaHRzX2luX21zZ2hkciwgWworCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorCQldXSwgW1sKKyNpZmRlZiBtc2dfYWNjcmlnaHRzCisjZXJyb3IgIm1zZ19hY2NyaWdodHMgaXMgYSBtYWNybyIKK2V4aXQoMSk7CisjZW5kaWYKK3N0cnVjdCBtc2doZHIgbTsKK20ubXNnX2FjY3JpZ2h0cyA9IDA7CitleGl0KDApOworCQldXSldLAorCQlbIGFjX2N2X2hhdmVfYWNjcmlnaHRzX2luX21zZ2hkcj0ieWVzIiBdLAorCQlbIGFjX2N2X2hhdmVfYWNjcmlnaHRzX2luX21zZ2hkcj0ibm8iIF0KKwkpCitdKQoraWYgdGVzdCAieCRhY19jdl9oYXZlX2FjY3JpZ2h0c19pbl9tc2doZHIiID0gInh5ZXMiIDsgdGhlbgorCUFDX0RFRklORShbSEFWRV9BQ0NSSUdIVFNfSU5fTVNHSERSXSwgWzFdLAorCQlbRGVmaW5lIGlmIHlvdXIgc3lzdGVtIHVzZXMgYWNjZXNzIHJpZ2h0cyBzdHlsZQorCQlmaWxlIGRlc2NyaXB0b3IgcGFzc2luZ10pCitmaQorCitBQ19NU0dfQ0hFQ0tJTkcoW2lmIHN0cnVjdCBzdGF0dmZzLmZfZnNpZCBpcyBpbnRlZ3JhbCB0eXBlXSkKK0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorIyBpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfTU9VTlRfSAorI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfU1RBVFZGU19ICisjaW5jbHVkZSA8c3lzL3N0YXR2ZnMuaD4KKyNlbmRpZgorCV1dLCBbWyBzdHJ1Y3Qgc3RhdHZmcyBzOyBzLmZfZnNpZCA9IDA7IF1dKV0sCisJWyBBQ19NU0dfUkVTVUxUKFt5ZXNdKSBdLAorCVsgQUNfTVNHX1JFU1VMVChbbm9dKQorCisJQUNfTVNHX0NIRUNLSU5HKFtpZiBmc2lkX3QgaGFzIG1lbWJlciB2YWxdKQorCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgorCV1dLCBbWyBmc2lkX3QgdDsgdC52YWxbMF0gPSAwOyBdXSldLAorCVsgQUNfTVNHX1JFU1VMVChbeWVzXSkKKwkgIEFDX0RFRklORShbRlNJRF9IQVNfVkFMXSwgWzFdLCBbZnNpZF90IGhhcyBtZW1iZXIgdmFsXSkgXSwKKwlbIEFDX01TR19SRVNVTFQoW25vXSkgXSkKKworCUFDX01TR19DSEVDS0lORyhbaWYgZl9mc2lkIGhhcyBtZW1iZXIgX192YWxdKQorCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgorCV1dLCBbWyBmc2lkX3QgdDsgdC5fX3ZhbFswXSA9IDA7IF1dKV0sCisJWyBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCSAgQUNfREVGSU5FKFtGU0lEX0hBU19fX1ZBTF0sIFsxXSwgW2ZzaWRfdCBoYXMgbWVtYmVyIF9fdmFsXSkgXSwKKwlbIEFDX01TR19SRVNVTFQoW25vXSkgXSkKK10pCisKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgbXNnX2NvbnRyb2wgZmllbGQgaW4gc3RydWN0IG1zZ2hkcl0sCisJCWFjX2N2X2hhdmVfY29udHJvbF9pbl9tc2doZHIsIFsKKwlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKwkJXV0sIFtbCisjaWZkZWYgbXNnX2NvbnRyb2wKKyNlcnJvciAibXNnX2NvbnRyb2wgaXMgYSBtYWNybyIKK2V4aXQoMSk7CisjZW5kaWYKK3N0cnVjdCBtc2doZHIgbTsKK20ubXNnX2NvbnRyb2wgPSAwOworZXhpdCgwKTsKKwkJXV0pXSwKKwkJWyBhY19jdl9oYXZlX2NvbnRyb2xfaW5fbXNnaGRyPSJ5ZXMiIF0sCisJCVsgYWNfY3ZfaGF2ZV9jb250cm9sX2luX21zZ2hkcj0ibm8iIF0KKwkpCitdKQoraWYgdGVzdCAieCRhY19jdl9oYXZlX2NvbnRyb2xfaW5fbXNnaGRyIiA9ICJ4eWVzIiA7IHRoZW4KKwlBQ19ERUZJTkUoW0hBVkVfQ09OVFJPTF9JTl9NU0dIRFJdLCBbMV0sCisJCVtEZWZpbmUgaWYgeW91ciBzeXN0ZW0gdXNlcyBhbmNpbGxhcnkgZGF0YSBzdHlsZQorCQlmaWxlIGRlc2NyaXB0b3IgcGFzc2luZ10pCitmaQorCitBQ19DQUNIRV9DSEVDSyhbaWYgbGliYyBkZWZpbmVzIF9fcHJvZ25hbWVdLCBhY19jdl9saWJjX2RlZmluZXNfX19wcm9nbmFtZSwgWworCUFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1tdXSwKKwkJW1sgZXh0ZXJuIGNoYXIgKl9fcHJvZ25hbWU7IHByaW50ZigiJXMiLCBfX3Byb2duYW1lKTsgXV0pXSwKKwlbIGFjX2N2X2xpYmNfZGVmaW5lc19fX3Byb2duYW1lPSJ5ZXMiIF0sCisJWyBhY19jdl9saWJjX2RlZmluZXNfX19wcm9nbmFtZT0ibm8iIAorCV0pCitdKQoraWYgdGVzdCAieCRhY19jdl9saWJjX2RlZmluZXNfX19wcm9nbmFtZSIgPSAieHllcyIgOyB0aGVuCisJQUNfREVGSU5FKFtIQVZFX19fUFJPR05BTUVdLCBbMV0sIFtEZWZpbmUgaWYgbGliYyBkZWZpbmVzIF9fcHJvZ25hbWVdKQorZmkKKworQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgJENDIGltcGxlbWVudHMgX19GVU5DVElPTl9fXSwgYWNfY3ZfY2NfaW1wbGVtZW50c19fX0ZVTkNUSU9OX18sIFsKKwlBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbICNpbmNsdWRlIDxzdGRpby5oPiBdXSwKKwkJW1sgcHJpbnRmKCIlcyIsIF9fRlVOQ1RJT05fXyk7IF1dKV0sCisJWyBhY19jdl9jY19pbXBsZW1lbnRzX19fRlVOQ1RJT05fXz0ieWVzIiBdLAorCVsgYWNfY3ZfY2NfaW1wbGVtZW50c19fX0ZVTkNUSU9OX189Im5vIiAKKwldKQorXSkKK2lmIHRlc3QgIngkYWNfY3ZfY2NfaW1wbGVtZW50c19fX0ZVTkNUSU9OX18iID0gInh5ZXMiIDsgdGhlbgorCUFDX0RFRklORShbSEFWRV9fX0ZVTkNUSU9OX19dLCBbMV0sCisJCVtEZWZpbmUgaWYgY29tcGlsZXIgaW1wbGVtZW50cyBfX0ZVTkNUSU9OX19dKQorZmkKKworQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgJENDIGltcGxlbWVudHMgX19mdW5jX19dLCBhY19jdl9jY19pbXBsZW1lbnRzX19fZnVuY19fLCBbCisJQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8c3RkaW8uaD4gXV0sCisJCVtbIHByaW50ZigiJXMiLCBfX2Z1bmNfXyk7IF1dKV0sCisJWyBhY19jdl9jY19pbXBsZW1lbnRzX19fZnVuY19fPSJ5ZXMiIF0sCisJWyBhY19jdl9jY19pbXBsZW1lbnRzX19fZnVuY19fPSJubyIgCisJXSkKK10pCitpZiB0ZXN0ICJ4JGFjX2N2X2NjX2ltcGxlbWVudHNfX19mdW5jX18iID0gInh5ZXMiIDsgdGhlbgorCUFDX0RFRklORShbSEFWRV9fX2Z1bmNfX10sIFsxXSwgW0RlZmluZSBpZiBjb21waWxlciBpbXBsZW1lbnRzIF9fZnVuY19fXSkKK2ZpCisKK0FDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHZhX2NvcHkgZXhpc3RzXSwgYWNfY3ZfaGF2ZV92YV9jb3B5LCBbCisJQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN0ZGFyZy5oPgordmFfbGlzdCB4LHk7CisJCV1dLCBbWyB2YV9jb3B5KHgseSk7IF1dKV0sCisJWyBhY19jdl9oYXZlX3ZhX2NvcHk9InllcyIgXSwKKwlbIGFjX2N2X2hhdmVfdmFfY29weT0ibm8iIAorCV0pCitdKQoraWYgdGVzdCAieCRhY19jdl9oYXZlX3ZhX2NvcHkiID0gInh5ZXMiIDsgdGhlbgorCUFDX0RFRklORShbSEFWRV9WQV9DT1BZXSwgWzFdLCBbRGVmaW5lIGlmIHZhX2NvcHkgZXhpc3RzXSkKK2ZpCisKK0FDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIF9fdmFfY29weSBleGlzdHNdLCBhY19jdl9oYXZlX19fdmFfY29weSwgWworCUFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzdGRhcmcuaD4KK3ZhX2xpc3QgeCx5OworCQldXSwgW1sgX192YV9jb3B5KHgseSk7IF1dKV0sCisJWyBhY19jdl9oYXZlX19fdmFfY29weT0ieWVzIiBdLCBbIGFjX2N2X2hhdmVfX192YV9jb3B5PSJubyIgCisJXSkKK10pCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfX192YV9jb3B5IiA9ICJ4eWVzIiA7IHRoZW4KKwlBQ19ERUZJTkUoW0hBVkVfX19WQV9DT1BZXSwgWzFdLCBbRGVmaW5lIGlmIF9fdmFfY29weSBleGlzdHNdKQorZmkKKworQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgZ2V0b3B0IGhhcyBvcHRyZXNldCBzdXBwb3J0XSwKKwkJYWNfY3ZfaGF2ZV9nZXRvcHRfb3B0cmVzZXQsIFsKKwlBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbICNpbmNsdWRlIDxnZXRvcHQuaD4gXV0sCisJCVtbIGV4dGVybiBpbnQgb3B0cmVzZXQ7IG9wdHJlc2V0ID0gMDsgXV0pXSwKKwlbIGFjX2N2X2hhdmVfZ2V0b3B0X29wdHJlc2V0PSJ5ZXMiIF0sCisJWyBhY19jdl9oYXZlX2dldG9wdF9vcHRyZXNldD0ibm8iIAorCV0pCitdKQoraWYgdGVzdCAieCRhY19jdl9oYXZlX2dldG9wdF9vcHRyZXNldCIgPSAieHllcyIgOyB0aGVuCisJQUNfREVGSU5FKFtIQVZFX0dFVE9QVF9PUFRSRVNFVF0sIFsxXSwKKwkJW0RlZmluZSBpZiB5b3VyIGdldG9wdCgzKSBkZWZpbmVzIGFuZCB1c2VzIG9wdHJlc2V0XSkKK2ZpCisKK0FDX0NBQ0hFX0NIRUNLKFtpZiBsaWJjIGRlZmluZXMgc3lzX2Vycmxpc3RdLCBhY19jdl9saWJjX2RlZmluZXNfc3lzX2Vycmxpc3QsIFsKKwlBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbXV0sCitbWyBleHRlcm4gY29uc3QgY2hhciAqY29uc3Qgc3lzX2Vycmxpc3RbXTsgcHJpbnRmKCIlcyIsIHN5c19lcnJsaXN0WzBdKTtdXSldLAorCVsgYWNfY3ZfbGliY19kZWZpbmVzX3N5c19lcnJsaXN0PSJ5ZXMiIF0sCisJWyBhY19jdl9saWJjX2RlZmluZXNfc3lzX2Vycmxpc3Q9Im5vIiAKKwldKQorXSkKK2lmIHRlc3QgIngkYWNfY3ZfbGliY19kZWZpbmVzX3N5c19lcnJsaXN0IiA9ICJ4eWVzIiA7IHRoZW4KKwlBQ19ERUZJTkUoW0hBVkVfU1lTX0VSUkxJU1RdLCBbMV0sCisJCVtEZWZpbmUgaWYgeW91ciBzeXN0ZW0gZGVmaW5lcyBzeXNfZXJybGlzdFtdXSkKK2ZpCisKKworQUNfQ0FDSEVfQ0hFQ0soW2lmIGxpYmMgZGVmaW5lcyBzeXNfbmVycl0sIGFjX2N2X2xpYmNfZGVmaW5lc19zeXNfbmVyciwgWworCUFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1tdXSwKK1tbIGV4dGVybiBpbnQgc3lzX25lcnI7IHByaW50ZigiJWkiLCBzeXNfbmVycik7XV0pXSwKKwlbIGFjX2N2X2xpYmNfZGVmaW5lc19zeXNfbmVycj0ieWVzIiBdLAorCVsgYWNfY3ZfbGliY19kZWZpbmVzX3N5c19uZXJyPSJubyIgCisJXSkKK10pCitpZiB0ZXN0ICJ4JGFjX2N2X2xpYmNfZGVmaW5lc19zeXNfbmVyciIgPSAieHllcyIgOyB0aGVuCisJQUNfREVGSU5FKFtIQVZFX1NZU19ORVJSXSwgWzFdLCBbRGVmaW5lIGlmIHlvdXIgc3lzdGVtIGRlZmluZXMgc3lzX25lcnJdKQorZmkKKworIyBDaGVjayBsaWJyYXJpZXMgbmVlZGVkIGJ5IEROUyBmaW5nZXJwcmludCBzdXBwb3J0CitBQ19TRUFSQ0hfTElCUyhbZ2V0cnJzZXRieW5hbWVdLCBbcmVzb2x2XSwKKwlbQUNfREVGSU5FKFtIQVZFX0dFVFJSU0VUQllOQU1FXSwgWzFdLAorCQlbRGVmaW5lIGlmIGdldHJyc2V0YnluYW1lKCkgZXhpc3RzXSldLAorCVsKKwkJIyBOZWVkZWQgYnkgb3VyIGdldHJyc2V0YnluYW1lKCkKKwkJQUNfU0VBUkNIX0xJQlMoW3Jlc19xdWVyeV0sIFtyZXNvbHZdKQorCQlBQ19TRUFSQ0hfTElCUyhbZG5fZXhwYW5kXSwgW3Jlc29sdl0pCisJCUFDX01TR19DSEVDS0lORyhbaWYgcmVzX3F1ZXJ5IHdpbGwgbGlua10pCisJCUFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxyZXNvbHYuaD4KKwkJCQldXSwgW1sKKwlyZXNfcXVlcnkgKDAsIDAsIDAsIDAsIDApOworCQkJCV1dKV0sCisJCSAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKSwKKwkJICAgW0FDX01TR19SRVNVTFQoW25vXSkKKwkJICAgIHNhdmVkX0xJQlM9IiRMSUJTIgorCQkgICAgTElCUz0iJExJQlMgLWxyZXNvbHYiCisJCSAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciByZXNfcXVlcnkgaW4gLWxyZXNvbHZdKQorCQkgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL25hbWVzZXIuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHJlc29sdi5oPgorCQkJCV1dLCBbWworCXJlc19xdWVyeSAoMCwgMCwgMCwgMCwgMCk7CisJCQkJXV0pXSwKKwkJCVtBQ19NU0dfUkVTVUxUKFt5ZXNdKV0sCisJCQlbTElCUz0iJHNhdmVkX0xJQlMiCisJCQkgQUNfTVNHX1JFU1VMVChbbm9dKV0pCisJCSAgICBdKQorCQlBQ19DSEVDS19GVU5DUyhbX2dldHNob3J0IF9nZXRsb25nXSkKKwkJQUNfQ0hFQ0tfREVDTFMoW19nZXRzaG9ydCwgX2dldGxvbmddLCAsICwKKwkJICAgIFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJCSAgICAjaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+XSkKKwkJQUNfQ0hFQ0tfTUVNQkVSKFtIRUFERVIuYWRdLAorCQkJW0FDX0RFRklORShbSEFWRV9IRUFERVJfQURdLCBbMV0sCisJCQkgICAgW0RlZmluZSBpZiBIRUFERVIuYWQgZXhpc3RzIGluIGFycGEvbmFtZXNlci5oXSldLCAsCisJCQlbI2luY2x1ZGUgPGFycGEvbmFtZXNlci5oPl0pCisJXSkKKworQUNfTVNHX0NIRUNLSU5HKFtpZiBzdHJ1Y3QgX19yZXNfc3RhdGUgX3JlcyBpcyBhbiBleHRlcm5dKQorQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWYgSEFWRV9TWVNfVFlQRVNfSAorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL25hbWVzZXIuaD4KKyNpbmNsdWRlIDxyZXNvbHYuaD4KK2V4dGVybiBzdHJ1Y3QgX19yZXNfc3RhdGUgX3JlczsKKwkJXV0sIFtbIF1dKV0sCisJCVtBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCQkgQUNfREVGSU5FKFtIQVZFX19SRVNfRVhURVJOXSwgWzFdLAorCQkgICAgW0RlZmluZSBpZiB5b3UgaGF2ZSBzdHJ1Y3QgX19yZXNfc3RhdGUgX3JlcyBhcyBhbiBleHRlcm5dKQorCQldLAorCQlbIEFDX01TR19SRVNVTFQoW25vXSkgXQorKQorCisjIENoZWNrIHdoZXRoZXIgdXNlciB3YW50cyBTRUxpbnV4IHN1cHBvcnQKK1NFTElOVVhfTVNHPSJubyIKK0xJQlNFTElOVVg9IiIKK0FDX0FSR19XSVRIKFtzZWxpbnV4XSwKKwlbICAtLXdpdGgtc2VsaW51eCAgICAgICAgICBFbmFibGUgU0VMaW51eCBzdXBwb3J0XSwKKwlbIGlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgOyB0aGVuCisJCXNhdmVfTElCUz0iJExJQlMiCisJCUFDX0RFRklORShbV0lUSF9TRUxJTlVYXSwgWzFdLAorCQkJW0RlZmluZSBpZiB5b3Ugd2FudCBTRUxpbnV4IHN1cHBvcnQuXSkKKwkJU0VMSU5VWF9NU0c9InllcyIKKwkJQUNfQ0hFQ0tfSEVBREVSKFtzZWxpbnV4L3NlbGludXguaF0sICwKKwkJCUFDX01TR19FUlJPUihbU0VMaW51eCBzdXBwb3J0IHJlcXVpcmVzIHNlbGludXguaCBoZWFkZXJdKSkKKwkJQUNfQ0hFQ0tfTElCKFtzZWxpbnV4XSwgW3NldGV4ZWNjb25dLAorCQkJWyBMSUJTRUxJTlVYPSItbHNlbGludXgiCisJCQkgIExJQlM9IiRMSUJTIC1sc2VsaW51eCIKKwkJCV0sCisJCQlBQ19NU0dfRVJST1IoW1NFTGludXggc3VwcG9ydCByZXF1aXJlcyBsaWJzZWxpbnV4IGxpYnJhcnldKSkKKwkJU1NITElCUz0iJFNTSExJQlMgJExJQlNFTElOVVgiCisJCVNTSERMSUJTPSIkU1NIRExJQlMgJExJQlNFTElOVVgiCisJCUFDX0NIRUNLX0ZVTkNTKFtnZXRzZXVzZXJieW5hbWUgZ2V0X2RlZmF1bHRfY29udGV4dF93aXRoX2xldmVsXSkKKwkJTElCUz0iJHNhdmVfTElCUyIKKwlmaSBdCispCitBQ19TVUJTVChbU1NITElCU10pCitBQ19TVUJTVChbU1NIRExJQlNdKQorCisjIENoZWNrIHdoZXRoZXIgdXNlciB3YW50cyBLZXJiZXJvcyA1IHN1cHBvcnQKK0tSQjVfTVNHPSJubyIKK0FDX0FSR19XSVRIKFtrZXJiZXJvczVdLAorCVsgIC0td2l0aC1rZXJiZXJvczU9UEFUSCAgIEVuYWJsZSBLZXJiZXJvcyA1IHN1cHBvcnRdLAorCVsgaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KKwkJaWYgdGVzdCAieCR3aXRodmFsIiA9ICJ4eWVzIiA7IHRoZW4KKwkJCUtSQjVST09UPSIvdXNyL2xvY2FsIgorCQllbHNlCisJCQlLUkI1Uk9PVD0ke3dpdGh2YWx9CisJCWZpCisKKwkJQUNfREVGSU5FKFtLUkI1XSwgWzFdLCBbRGVmaW5lIGlmIHlvdSB3YW50IEtlcmJlcm9zIDUgc3VwcG9ydF0pCisJCUtSQjVfTVNHPSJ5ZXMiCisKKwkJQUNfUEFUSF9QUk9HKFtLUkI1Q09ORl0sIFtrcmI1LWNvbmZpZ10sCisJCQkgICAgIFskS1JCNVJPT1QvYmluL2tyYjUtY29uZmlnXSwKKwkJCSAgICAgWyRLUkI1Uk9PVC9iaW46JFBBVEhdKQorCQlpZiB0ZXN0IC14ICRLUkI1Q09ORiA7IHRoZW4KKworCQkJQUNfTVNHX0NIRUNLSU5HKFtmb3IgZ3NzYXBpIHN1cHBvcnRdKQorCQkJaWYgJEtSQjVDT05GIHwgZ3JlcCBnc3NhcGkgPi9kZXYvbnVsbCA7IHRoZW4KKwkJCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCQkJCUFDX0RFRklORShbR1NTQVBJXSwgWzFdLAorCQkJCQlbRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgR1NTQVBJCisJCQkJCXN1cHBvcnQgaW4gdGhlIHZlcnNpb24gMiBwcm90b2NvbF0pCisJCQkJazVjb25mb3B0cz1nc3NhcGkKKwkJCWVsc2UKKwkJCQlBQ19NU0dfUkVTVUxUKFtub10pCisJCQkJazVjb25mb3B0cz0iIgorCQkJZmkKKwkJCUs1Q0ZMQUdTPSJgJEtSQjVDT05GIC0tY2ZsYWdzICRrNWNvbmZvcHRzYCIKKwkJCUs1TElCUz0iYCRLUkI1Q09ORiAtLWxpYnMgJGs1Y29uZm9wdHNgIgorCQkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAkSzVDRkxBR1MiCisJCQlBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgd2UgYXJlIHVzaW5nIEhlaW1kYWxdKQorCQkJQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8a3JiNS5oPgorCQkJCV1dLCBbWyBjaGFyICp0bXAgPSBoZWltZGFsX3ZlcnNpb247IF1dKV0sCisJCQkJWyBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCQkJCUFDX0RFRklORShbSEVJTURBTF0sIFsxXSwKKwkJCQlbRGVmaW5lIHRoaXMgaWYgeW91IGFyZSB1c2luZyB0aGUgSGVpbWRhbAorCQkJCXZlcnNpb24gb2YgS2VyYmVyb3MgVjVdKSBdLAorCQkJCVtBQ19NU0dfUkVTVUxUKFtub10pCisJCQldKQorCQllbHNlCisJCQlDUFBGTEFHUz0iJENQUEZMQUdTIC1JJHtLUkI1Uk9PVH0vaW5jbHVkZSIKKwkJCUxERkxBR1M9IiRMREZMQUdTIC1MJHtLUkI1Uk9PVH0vbGliIgorCQkJQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHdlIGFyZSB1c2luZyBIZWltZGFsXSkKKwkJCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPGtyYjUuaD4KKwkJCQldXSwgW1sgY2hhciAqdG1wID0gaGVpbWRhbF92ZXJzaW9uOyBdXSldLAorCQkJCQlbIEFDX01TR19SRVNVTFQoW3llc10pCisJCQkJCSBBQ19ERUZJTkUoW0hFSU1EQUxdKQorCQkJCQkgSzVMSUJTPSItbGtyYjUiCisJCQkJCSBLNUxJQlM9IiRLNUxJQlMgLWxjb21fZXJyIC1sYXNuMSIKKwkJCQkJIEFDX0NIRUNLX0xJQihbcm9rZW5dLCBbbmV0X3dyaXRlXSwKKwkJCQkJICAgW0s1TElCUz0iJEs1TElCUyAtbHJva2VuIl0pCisJCQkJCSBBQ19DSEVDS19MSUIoW2Rlc10sIFtkZXNfY2JjX2VuY3J5cHRdLAorCQkJCQkgICBbSzVMSUJTPSIkSzVMSUJTIC1sZGVzIl0pCisJCQkJICAgICAgIF0sIFsgQUNfTVNHX1JFU1VMVChbbm9dKQorCQkJCQkgSzVMSUJTPSItbGtyYjUgLWxrNWNyeXB0byAtbGNvbV9lcnIiCisJCQkJICAgICAgIAorCQkJXSkKKwkJCUFDX1NFQVJDSF9MSUJTKFtkbl9leHBhbmRdLCBbcmVzb2x2XSkKKworCQkJQUNfQ0hFQ0tfTElCKFtnc3NhcGlfa3JiNV0sIFtnc3NfaW5pdF9zZWNfY29udGV4dF0sCisJCQkJWyBBQ19ERUZJTkUoW0dTU0FQSV0pCisJCQkJICBLNUxJQlM9Ii1sZ3NzYXBpX2tyYjUgJEs1TElCUyIgXSwKKwkJCQlbIEFDX0NIRUNLX0xJQihbZ3NzYXBpXSwgW2dzc19pbml0X3NlY19jb250ZXh0XSwKKwkJCQkJWyBBQ19ERUZJTkUoW0dTU0FQSV0pCisJCQkJCSAgSzVMSUJTPSItbGdzc2FwaSAkSzVMSUJTIiBdLAorCQkJCQlBQ19NU0dfV0FSTihbQ2Fubm90IGZpbmQgYW55IHN1aXRhYmxlIGdzcy1hcGkgbGlicmFyeSAtIGJ1aWxkIG1heSBmYWlsXSksCisJCQkJCSRLNUxJQlMpCisJCQkJXSwKKwkJCQkkSzVMSUJTKQorCisJCQlBQ19DSEVDS19IRUFERVIoW2dzc2FwaS5oXSwgLAorCQkJCVsgdW5zZXQgYWNfY3ZfaGVhZGVyX2dzc2FwaV9oCisJCQkJICBDUFBGTEFHUz0iJENQUEZMQUdTIC1JJHtLUkI1Uk9PVH0vaW5jbHVkZS9nc3NhcGkiCisJCQkJICBBQ19DSEVDS19IRUFERVJTKFtnc3NhcGkuaF0sICwKKwkJCQkJQUNfTVNHX1dBUk4oW0Nhbm5vdCBmaW5kIGFueSBzdWl0YWJsZSBnc3MtYXBpIGhlYWRlciAtIGJ1aWxkIG1heSBmYWlsXSkKKwkJCQkgICkKKwkJCQldCisJCQkpCisKKwkJCW9sZENQUD0iJENQUEZMQUdTIgorCQkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSR7S1JCNVJPT1R9L2luY2x1ZGUvZ3NzYXBpIgorCQkJQUNfQ0hFQ0tfSEVBREVSKFtnc3NhcGlfa3JiNS5oXSwgLAorCQkJCQlbIENQUEZMQUdTPSIkb2xkQ1BQIiBdKQorCisJCWZpCisJCWlmIHRlc3QgISAteiAiJG5lZWRfZGFzaF9yIiA7IHRoZW4KKwkJCUxERkxBR1M9IiRMREZMQUdTIC1SJHtLUkI1Uk9PVH0vbGliIgorCQlmaQorCQlpZiB0ZXN0ICEgLXogIiRibGlicGF0aCIgOyB0aGVuCisJCQlibGlicGF0aD0iJGJsaWJwYXRoOiR7S1JCNVJPT1R9L2xpYiIKKwkJZmkKKworCQlBQ19DSEVDS19IRUFERVJTKFtnc3NhcGkuaCBnc3NhcGkvZ3NzYXBpLmhdKQorCQlBQ19DSEVDS19IRUFERVJTKFtnc3NhcGlfa3JiNS5oIGdzc2FwaS9nc3NhcGlfa3JiNS5oXSkKKwkJQUNfQ0hFQ0tfSEVBREVSUyhbZ3NzYXBpX2dlbmVyaWMuaCBnc3NhcGkvZ3NzYXBpX2dlbmVyaWMuaF0pCisKKwkJTElCUz0iJExJQlMgJEs1TElCUyIKKwkJQUNfU0VBUkNIX0xJQlMoW2tfaGFzYWZzXSwgW2thZnNdLCBbQUNfREVGSU5FKFtVU0VfQUZTXSwgWzFdLAorCQkJW0RlZmluZSB0aGlzIGlmIHlvdSB3YW50IHRvIHVzZSBsaWJrYWZzJyBBRlMgc3VwcG9ydF0pXSkKKwlmaQorCV0KKykKKworIyBMb29raW5nIGZvciBwcm9ncmFtcywgcGF0aHMgYW5kIGZpbGVzCisKK1BSSVZTRVBfUEFUSD0vdmFyL2VtcHR5CitBQ19BUkdfV0lUSChbcHJpdnNlcC1wYXRoXSwKKwlbICAtLXdpdGgtcHJpdnNlcC1wYXRoPXh4eCBQYXRoIGZvciBwcml2aWxlZ2Ugc2VwYXJhdGlvbiBjaHJvb3QgKGRlZmF1bHQ9L3Zhci9lbXB0eSldLAorCVsKKwkJaWYgdGVzdCAtbiAiJHdpdGh2YWwiICAmJiAgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiAgJiYgIFwKKwkJICAgIHRlc3QgIngke3dpdGh2YWx9IiAhPSAieHllcyI7IHRoZW4KKwkJCVBSSVZTRVBfUEFUSD0kd2l0aHZhbAorCQlmaQorCV0KKykKK0FDX1NVQlNUKFtQUklWU0VQX1BBVEhdKQorCitBQ19BUkdfV0lUSChbeGF1dGhdLAorCVsgIC0td2l0aC14YXV0aD1QQVRIICAgICAgIFNwZWNpZnkgcGF0aCB0byB4YXV0aCBwcm9ncmFtIF0sCisJWworCQlpZiB0ZXN0IC1uICIkd2l0aHZhbCIgICYmICB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iICAmJiAgXAorCQkgICAgdGVzdCAieCR7d2l0aHZhbH0iICE9ICJ4eWVzIjsgdGhlbgorCQkJeGF1dGhfcGF0aD0kd2l0aHZhbAorCQlmaQorCV0sCisJWworCQlUZXN0UGF0aD0iJFBBVEgiCisJCVRlc3RQYXRoPSIke1Rlc3RQYXRofSR7UEFUSF9TRVBBUkFUT1J9L3Vzci9YL2JpbiIKKwkJVGVzdFBhdGg9IiR7VGVzdFBhdGh9JHtQQVRIX1NFUEFSQVRPUn0vdXNyL2Jpbi9YMTEiCisJCVRlc3RQYXRoPSIke1Rlc3RQYXRofSR7UEFUSF9TRVBBUkFUT1J9L3Vzci9YMTFSNi9iaW4iCisJCVRlc3RQYXRoPSIke1Rlc3RQYXRofSR7UEFUSF9TRVBBUkFUT1J9L3Vzci9vcGVud2luL2JpbiIKKwkJQUNfUEFUSF9QUk9HKFt4YXV0aF9wYXRoXSwgW3hhdXRoXSwgLCBbJFRlc3RQYXRoXSkKKwkJaWYgKHRlc3QgISAteiAiJHhhdXRoX3BhdGgiICYmIHRlc3QgLXggIi91c3Ivb3Blbndpbi9iaW4veGF1dGgiKSA7IHRoZW4KKwkJCXhhdXRoX3BhdGg9Ii91c3Ivb3Blbndpbi9iaW4veGF1dGgiCisJCWZpCisJXQorKQorCitTVFJJUF9PUFQ9LXMKK0FDX0FSR19FTkFCTEUoW3N0cmlwXSwKKwlbICAtLWRpc2FibGUtc3RyaXAgICAgICAgICBEaXNhYmxlIGNhbGxpbmcgc3RyaXAoMSkgb24gaW5zdGFsbF0sCisJWworCQlpZiB0ZXN0ICJ4JGVuYWJsZXZhbCIgPSAieG5vIiA7IHRoZW4KKwkJCVNUUklQX09QVD0KKwkJZmkKKwldCispCitBQ19TVUJTVChbU1RSSVBfT1BUXSkKKworaWYgdGVzdCAteiAiJHhhdXRoX3BhdGgiIDsgdGhlbgorCVhBVVRIX1BBVEg9InVuZGVmaW5lZCIKKwlBQ19TVUJTVChbWEFVVEhfUEFUSF0pCitlbHNlCisJQUNfREVGSU5FX1VOUVVPVEVEKFtYQVVUSF9QQVRIXSwgWyIkeGF1dGhfcGF0aCJdLAorCQlbRGVmaW5lIGlmIHhhdXRoIGlzIGZvdW5kIGluIHlvdXIgcGF0aF0pCisJWEFVVEhfUEFUSD0keGF1dGhfcGF0aAorCUFDX1NVQlNUKFtYQVVUSF9QQVRIXSkKK2ZpCisKK2RubCAjIC0td2l0aC1tYWlsZGlyPS9wYXRoL3RvL21haWwgZ2V0cyB0b3AgcHJpb3JpdHkuCitkbmwgIyBpZiBtYWlsZGlyIGlzIHNldCBpbiB0aGUgcGxhdGZvcm0gY2FzZSBzdGF0ZW1lbnQgYWJvdmUgd2UgdXNlIHRoYXQuCitkbmwgIyBPdGhlcndpc2Ugd2UgcnVuIGEgcHJvZ3JhbSB0byBnZXQgdGhlIGRpciBmcm9tIHN5c3RlbSBoZWFkZXJzLgorZG5sICMgV2UgZmlyc3QgbG9vayBmb3IgX1BBVEhfTUFJTERJUiB0aGVuIE1BSUxESVIgdGhlbiBfUEFUSF9NQUlMCitkbmwgIyBJZiB3ZSBmaW5kIF9QQVRIX01BSUxESVIgd2UgZG8gbm90aGluZyBiZWNhdXNlIHRoYXQgaXMgd2hhdAorZG5sICMgc2Vzc2lvbi5jIGV4cGVjdHMgYW55d2F5LiBPdGhlcndpc2Ugd2Ugc2V0IHRvIHRoZSB2YWx1ZSBmb3VuZAorZG5sICMgc3RyaXBwaW5nIGFueSB0cmFpbGluZyBzbGFzaC4gSWYgZm9yIHNvbWUgc3RyYWdlIHJlYXNvbiBvdXIgcHJvZ3JhbQorZG5sICMgZG9lcyBub3QgZmluZCB3aGF0IGl0IG5lZWRzLCB3ZSBkZWZhdWx0IHRvIC92YXIvc3Bvb2wvbWFpbC4KKyMgQ2hlY2sgZm9yIG1haWwgZGlyZWN0b3J5CitBQ19BUkdfV0lUSChbbWFpbGRpcl0sCisgICAgWyAgLS13aXRoLW1haWxkaXI9L3BhdGgvdG8vbWFpbCAgICBTcGVjaWZ5IHlvdXIgc3lzdGVtIG1haWwgZGlyZWN0b3J5XSwKKyAgICBbCisJaWYgdGVzdCAiWCR3aXRodmFsIiAhPSBYICAmJiAgdGVzdCAieCR3aXRodmFsIiAhPSB4bm8gICYmICBcCisJICAgIHRlc3QgIngke3dpdGh2YWx9IiAhPSB4eWVzOyB0aGVuCisJCUFDX0RFRklORV9VTlFVT1RFRChbTUFJTF9ESVJFQ1RPUlldLCBbIiR3aXRodmFsIl0sCisgICAgICAgICAgICBbU2V0IHRoaXMgdG8geW91ciBtYWlsIGRpcmVjdG9yeSBpZiB5b3UgZG8gbm90IGhhdmUgX1BBVEhfTUFJTERJUl0pCisJICAgIGZpCisgICAgIF0sWworCWlmIHRlc3QgIlgkbWFpbGRpciIgIT0gIlgiOyB0aGVuCisJICAgIEFDX0RFRklORV9VTlFVT1RFRChbTUFJTF9ESVJFQ1RPUlldLCBbIiRtYWlsZGlyIl0pCisJZWxzZQorCSAgICBBQ19NU0dfQ0hFQ0tJTkcoW0Rpc2NvdmVyaW5nIHN5c3RlbSBtYWlsIGRpcmVjdG9yeV0pCisJICAgIEFDX1JVTl9JRkVMU0UoCisJCVtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIEhBVkVfUEFUSFNfSAorI2luY2x1ZGUgPHBhdGhzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX01BSUxMT0NLX0gKKyNpbmNsdWRlIDxtYWlsbG9jay5oPgorI2VuZGlmCisjZGVmaW5lIERBVEEgImNvbmZ0ZXN0Lm1haWxkaXIiCisJXV0sIFtbCisJRklMRSAqZmQ7CisJaW50IHJjOworCisJZmQgPSBmb3BlbihEQVRBLCJ3Iik7CisJaWYoZmQgPT0gTlVMTCkKKwkJZXhpdCgxKTsKKworI2lmIGRlZmluZWQgKF9QQVRIX01BSUxESVIpCisJaWYgKChyYyA9IGZwcmludGYoZmQgLCJfUEFUSF9NQUlMRElSOiVzXG4iLCBfUEFUSF9NQUlMRElSKSkgPDApCisJCWV4aXQoMSk7CisjZWxpZiBkZWZpbmVkIChNQUlMRElSKQorCWlmICgocmMgPSBmcHJpbnRmKGZkICwiTUFJTERJUjolc1xuIiwgTUFJTERJUikpIDwwKQorCQlleGl0KDEpOworI2VsaWYgZGVmaW5lZCAoX1BBVEhfTUFJTCkKKwlpZiAoKHJjID0gZnByaW50ZihmZCAsIl9QQVRIX01BSUw6JXNcbiIsIF9QQVRIX01BSUwpKSA8MCkKKwkJZXhpdCgxKTsKKyNlbHNlCisJZXhpdCAoMik7CisjZW5kaWYKKworCWV4aXQoMCk7CisJCV1dKV0sCisJCVsKKwkgCSAgICBtYWlsZGlyX3doYXQ9YGF3ayAtRjogJ3twcmludCAkMX0nIGNvbmZ0ZXN0Lm1haWxkaXJgCisJCSAgICBtYWlsZGlyPWBhd2sgLUY6ICd7cHJpbnQgJDJ9JyBjb25mdGVzdC5tYWlsZGlyIFwKKwkJCXwgc2VkICdzfC8kfHwnYAorCQkgICAgQUNfTVNHX1JFU1VMVChbVXNpbmc6ICRtYWlsZGlyIGZyb20gJG1haWxkaXJfd2hhdF0pCisJCSAgICBpZiB0ZXN0ICJ4JG1haWxkaXJfd2hhdCIgIT0gInhfUEFUSF9NQUlMRElSIjsgdGhlbgorCQkJQUNfREVGSU5FX1VOUVVPVEVEKFtNQUlMX0RJUkVDVE9SWV0sIFsiJG1haWxkaXIiXSkKKwkJICAgIGZpCisJCV0sCisJCVsKKwkJICAgIGlmIHRlc3QgIlgkYWNfc3RhdHVzIiA9ICJYMiI7dGhlbgorIyBvdXIgdGVzdCBwcm9ncmFtIGRpZG4ndCBmaW5kIGl0LiBEZWZhdWx0IHRvIC92YXIvc3Bvb2wvbWFpbAorCQkJQUNfTVNHX1JFU1VMVChbVXNpbmc6IGRlZmF1bHQgdmFsdWUgb2YgL3Zhci9zcG9vbC9tYWlsXSkKKwkJCUFDX0RFRklORV9VTlFVT1RFRChbTUFJTF9ESVJFQ1RPUlldLCBbIi92YXIvc3Bvb2wvbWFpbCJdKQorCQkgICAgIGVsc2UKKwkJCUFDX01TR19SRVNVTFQoWyoqKiBub3QgZm91bmQgKioqXSkKKwkJICAgICBmaQorCQldLAorCQlbCisJCQlBQ19NU0dfV0FSTihbY3Jvc3MgY29tcGlsaW5nOiB1c2UgLS13aXRoLW1haWxkaXI9L3BhdGgvdG8vbWFpbF0pCisJCV0KKwkgICAgKQorCWZpCisgICAgXQorKSAjIG1haWxkaXIKKworaWYgdGVzdCAhIC16ICIkY3Jvc3NfY29tcGlsaW5nIiAmJiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieHllcyI7IHRoZW4KKwlBQ19NU0dfV0FSTihbY3Jvc3MgY29tcGlsaW5nOiBEaXNhYmxpbmcgL2Rldi9wdG14IHRlc3RdKQorCWRpc2FibGVfcHRteF9jaGVjaz15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkbm9fZGV2X3B0bXgiIDsgdGhlbgorCWlmIHRlc3QgIngkZGlzYWJsZV9wdG14X2NoZWNrIiAhPSAieHllcyIgOyB0aGVuCisJCUFDX0NIRUNLX0ZJTEUoWyIvZGV2L3B0bXgiXSwKKwkJCVsKKwkJCQlBQ19ERUZJTkVfVU5RVU9URUQoW0hBVkVfREVWX1BUTVhdLCBbMV0sCisJCQkJCVtEZWZpbmUgaWYgeW91IGhhdmUgL2Rldi9wdG14XSkKKwkJCQloYXZlX2Rldl9wdG14PTEKKwkJCV0KKwkJKQorCWZpCitmaQorCitpZiB0ZXN0ICEgLXogIiRjcm9zc19jb21waWxpbmciICYmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiAhPSAieHllcyI7IHRoZW4KKwlBQ19DSEVDS19GSUxFKFsiL2Rldi9wdGMiXSwKKwkJWworCQkJQUNfREVGSU5FX1VOUVVPVEVEKFtIQVZFX0RFVl9QVFNfQU5EX1BUQ10sIFsxXSwKKwkJCQlbRGVmaW5lIGlmIHlvdSBoYXZlIC9kZXYvcHRjXSkKKwkJCWhhdmVfZGV2X3B0Yz0xCisJCV0KKwkpCitlbHNlCisJQUNfTVNHX1dBUk4oW2Nyb3NzIGNvbXBpbGluZzogRGlzYWJsaW5nIC9kZXYvcHRjIHRlc3RdKQorZmkKKworIyBPcHRpb25zIGZyb20gaGVyZSBvbi4gU29tZSBvZiB0aGVzZSBhcmUgcHJlc2V0IGJ5IHBsYXRmb3JtIGFib3ZlCitBQ19BUkdfV0lUSChbbWFudHlwZV0sCisJWyAgLS13aXRoLW1hbnR5cGU9bWFufGNhdHxkb2MgIFNldCBtYW4gcGFnZSB0eXBlXSwKKwlbCisJCWNhc2UgIiR3aXRodmFsIiBpbgorCQltYW58Y2F0fGRvYykKKwkJCU1BTlRZUEU9JHdpdGh2YWwKKwkJCTs7CisJCSopCisJCQlBQ19NU0dfRVJST1IoW2ludmFsaWQgbWFuIHR5cGU6ICR3aXRodmFsXSkKKwkJCTs7CisJCWVzYWMKKwldCispCitpZiB0ZXN0IC16ICIkTUFOVFlQRSI7IHRoZW4KKwlUZXN0UGF0aD0iL3Vzci9iaW4ke1BBVEhfU0VQQVJBVE9SfS91c3IvdWNiIgorCUFDX1BBVEhfUFJPR1MoW05ST0ZGXSwgW25yb2ZmIGF3Zl0sIFsvYmluL2ZhbHNlXSwgWyRUZXN0UGF0aF0pCisJaWYgJHtOUk9GRn0gLW1kb2MgJHtzcmNkaXJ9L3NzaC4xID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlNQU5UWVBFPWRvYworCWVsaWYgJHtOUk9GRn0gLW1hbiAke3NyY2Rpcn0vc3NoLjEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCU1BTlRZUEU9bWFuCisJZWxzZQorCQlNQU5UWVBFPWNhdAorCWZpCitmaQorQUNfU1VCU1QoW01BTlRZUEVdKQoraWYgdGVzdCAiJE1BTlRZUEUiID0gImRvYyI7IHRoZW4KKwltYW5zdWJkaXI9bWFuOworZWxzZQorCW1hbnN1YmRpcj0kTUFOVFlQRTsKK2ZpCitBQ19TVUJTVChbbWFuc3ViZGlyXSkKKworIyBDaGVjayB3aGV0aGVyIHRvIGVuYWJsZSBNRDUgcGFzc3dvcmRzCitNRDVfTVNHPSJubyIKK0FDX0FSR19XSVRIKFttZDUtcGFzc3dvcmRzXSwKKwlbICAtLXdpdGgtbWQ1LXBhc3N3b3JkcyAgICBFbmFibGUgdXNlIG9mIE1ENSBwYXNzd29yZHNdLAorCVsKKwkJaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KKwkJCUFDX0RFRklORShbSEFWRV9NRDVfUEFTU1dPUkRTXSwgWzFdLAorCQkJCVtEZWZpbmUgaWYgeW91IHdhbnQgdG8gYWxsb3cgTUQ1IHBhc3N3b3Jkc10pCisJCQlNRDVfTVNHPSJ5ZXMiCisJCWZpCisJXQorKQorCisjIFdoZXRoZXIgdG8gZGlzYWJsZSBzaGFkb3cgcGFzc3dvcmQgc3VwcG9ydAorQUNfQVJHX1dJVEgoW3NoYWRvd10sCisJWyAgLS13aXRob3V0LXNoYWRvdyAgICAgICAgRGlzYWJsZSBzaGFkb3cgcGFzc3dvcmQgc3VwcG9ydF0sCisJWworCQlpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInhubyIgOyB0aGVuCisJCQlBQ19ERUZJTkUoW0RJU0FCTEVfU0hBRE9XXSkKKwkJCWRpc2FibGVfc2hhZG93PXllcworCQlmaQorCV0KKykKKworaWYgdGVzdCAteiAiJGRpc2FibGVfc2hhZG93IiA7IHRoZW4KKwlBQ19NU0dfQ0hFQ0tJTkcoW2lmIHRoZSBzeXN0ZW1zIGhhcyBleHBpcmUgc2hhZG93IGluZm9ybWF0aW9uXSkKKwlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c2hhZG93Lmg+CitzdHJ1Y3Qgc3B3ZCBzcDsKKwkJXV0sIFtbIHNwLnNwX2V4cGlyZSA9IHNwLnNwX2xzdGNoZyA9IHNwLnNwX2luYWN0ID0gMDsgXV0pXSwKKwkJWyBzcF9leHBpcmVfYXZhaWxhYmxlPXllcyBdLCBbCisJXSkKKworCWlmIHRlc3QgIngkc3BfZXhwaXJlX2F2YWlsYWJsZSIgPSAieHllcyIgOyB0aGVuCisJCUFDX01TR19SRVNVTFQoW3llc10pCisJCUFDX0RFRklORShbSEFTX1NIQURPV19FWFBJUkVdLCBbMV0sCisJCSAgICBbRGVmaW5lIGlmIHlvdSB3YW50IHRvIHVzZSBzaGFkb3cgcGFzc3dvcmQgZXhwaXJlIGZpZWxkXSkKKwllbHNlCisJCUFDX01TR19SRVNVTFQoW25vXSkKKwlmaQorZmkKKworIyBVc2UgaXAgYWRkcmVzcyBpbnN0ZWFkIG9mIGhvc3RuYW1lIGluICRESVNQTEFZCitpZiB0ZXN0ICEgLXogIiRJUEFERFJfSU5fRElTUExBWSIgOyB0aGVuCisJRElTUExBWV9IQUNLX01TRz0ieWVzIgorCUFDX0RFRklORShbSVBBRERSX0lOX0RJU1BMQVldLCBbMV0sCisJCVtEZWZpbmUgaWYgeW91IG5lZWQgdG8gdXNlIElQIGFkZHJlc3MKKwkJaW5zdGVhZCBvZiBob3N0bmFtZSBpbiAkRElTUExBWV0pCitlbHNlCisJRElTUExBWV9IQUNLX01TRz0ibm8iCisJQUNfQVJHX1dJVEgoW2lwYWRkci1kaXNwbGF5XSwKKwkJWyAgLS13aXRoLWlwYWRkci1kaXNwbGF5ICAgVXNlIGlwIGFkZHJlc3MgaW5zdGVhZCBvZiBob3N0bmFtZSBpbiBcJERJU1BMQVldLAorCQlbCisJCQlpZiB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iIDsgdGhlbgorCQkJCUFDX0RFRklORShbSVBBRERSX0lOX0RJU1BMQVldKQorCQkJCURJU1BMQVlfSEFDS19NU0c9InllcyIKKwkJCWZpCisJCV0KKwkpCitmaQorCisjIGNoZWNrIGZvciAvZXRjL2RlZmF1bHQvbG9naW4gYW5kIHVzZSBpdCBpZiBwcmVzZW50LgorQUNfQVJHX0VOQUJMRShbZXRjLWRlZmF1bHQtbG9naW5dLAorCVsgIC0tZGlzYWJsZS1ldGMtZGVmYXVsdC1sb2dpbiBEaXNhYmxlIHVzaW5nIFBBVEggZnJvbSAvZXRjL2RlZmF1bHQvbG9naW4gW25vXV0sCisJWyBpZiB0ZXN0ICJ4JGVuYWJsZXZhbCIgPSAieG5vIjsgdGhlbgorCQlBQ19NU0dfTk9USUNFKFsvZXRjL2RlZmF1bHQvbG9naW4gaGFuZGxpbmcgZGlzYWJsZWRdKQorCQlldGNfZGVmYXVsdF9sb2dpbj1ubworCSAgZWxzZQorCQlldGNfZGVmYXVsdF9sb2dpbj15ZXMKKwkgIGZpIF0sCisJWyBpZiB0ZXN0ICEgLXogIiRjcm9zc19jb21waWxpbmciICYmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4eWVzIjsKKwkgIHRoZW4KKwkJQUNfTVNHX1dBUk4oW2Nyb3NzIGNvbXBpbGluZzogbm90IGNoZWNraW5nIC9ldGMvZGVmYXVsdC9sb2dpbl0pCisJCWV0Y19kZWZhdWx0X2xvZ2luPW5vCisJICBlbHNlCisJCWV0Y19kZWZhdWx0X2xvZ2luPXllcworCSAgZmkgXQorKQorCitpZiB0ZXN0ICJ4JGV0Y19kZWZhdWx0X2xvZ2luIiAhPSAieG5vIjsgdGhlbgorCUFDX0NIRUNLX0ZJTEUoWyIvZXRjL2RlZmF1bHQvbG9naW4iXSwKKwkgICAgWyBleHRlcm5hbF9wYXRoX2ZpbGU9L2V0Yy9kZWZhdWx0L2xvZ2luIF0pCisJaWYgdGVzdCAieCRleHRlcm5hbF9wYXRoX2ZpbGUiID0gIngvZXRjL2RlZmF1bHQvbG9naW4iOyB0aGVuCisJCUFDX0RFRklORShbSEFWRV9FVENfREVGQVVMVF9MT0dJTl0sIFsxXSwKKwkJCVtEZWZpbmUgaWYgeW91ciBzeXN0ZW0gaGFzIC9ldGMvZGVmYXVsdC9sb2dpbl0pCisJZmkKK2ZpCisKK2RubCBCU0Qgc3lzdGVtcyB1c2UgL2V0Yy9sb2dpbi5jb25mIHNvIC0td2l0aC1kZWZhdWx0LXBhdGg9IGhhcyBubyBlZmZlY3QKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfbG9naW5fZ2V0Y2FwYm9vbCA9ICJ5ZXMiICYmIFwKKwl0ZXN0ICRhY19jdl9oZWFkZXJfbG9naW5fY2FwX2ggPSAieWVzIiA7IHRoZW4KKwlleHRlcm5hbF9wYXRoX2ZpbGU9L2V0Yy9sb2dpbi5jb25mCitmaQorCisjIFdoZXRoZXIgdG8gbWVzcyB3aXRoIHRoZSBkZWZhdWx0IHBhdGgKK1NFUlZFUl9QQVRIX01TRz0iKGRlZmF1bHQpIgorQUNfQVJHX1dJVEgoW2RlZmF1bHQtcGF0aF0sCisJWyAgLS13aXRoLWRlZmF1bHQtcGF0aD0gICAgU3BlY2lmeSBkZWZhdWx0IFwkUEFUSCBlbnZpcm9ubWVudCBmb3Igc2VydmVyXSwKKwlbCisJCWlmIHRlc3QgIngkZXh0ZXJuYWxfcGF0aF9maWxlIiA9ICJ4L2V0Yy9sb2dpbi5jb25mIiA7IHRoZW4KKwkJCUFDX01TR19XQVJOKFsKKy0td2l0aC1kZWZhdWx0LXBhdGg9UEFUSCBoYXMgbm8gZWZmZWN0IG9uIHRoaXMgc3lzdGVtLgorRWRpdCAvZXRjL2xvZ2luLmNvbmYgaW5zdGVhZC5dKQorCQllbGlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgOyB0aGVuCisJCQlpZiB0ZXN0ICEgLXogIiRleHRlcm5hbF9wYXRoX2ZpbGUiIDsgdGhlbgorCQkJCUFDX01TR19XQVJOKFsKKy0td2l0aC1kZWZhdWx0LXBhdGg9UEFUSCB3aWxsIG9ubHkgYmUgdXNlZCBpZiBQQVRIIGlzIG5vdCBkZWZpbmVkIGluCiskZXh0ZXJuYWxfcGF0aF9maWxlIC5dKQorCQkJZmkKKwkJCXVzZXJfcGF0aD0iJHdpdGh2YWwiCisJCQlTRVJWRVJfUEFUSF9NU0c9IiR3aXRodmFsIgorCQlmaQorCV0sCisJWyBpZiB0ZXN0ICJ4JGV4dGVybmFsX3BhdGhfZmlsZSIgPSAieC9ldGMvbG9naW4uY29uZiIgOyB0aGVuCisJCUFDX01TR19XQVJOKFtNYWtlIHN1cmUgdGhlIHBhdGggdG8gc2NwIGlzIGluIC9ldGMvbG9naW4uY29uZl0pCisJZWxzZQorCQlpZiB0ZXN0ICEgLXogIiRleHRlcm5hbF9wYXRoX2ZpbGUiIDsgdGhlbgorCQkJQUNfTVNHX1dBUk4oWworSWYgUEFUSCBpcyBkZWZpbmVkIGluICRleHRlcm5hbF9wYXRoX2ZpbGUsIGVuc3VyZSB0aGUgcGF0aCB0byBzY3AgaXMgaW5jbHVkZWQsCitvdGhlcndpc2Ugc2NwIHdpbGwgbm90IHdvcmsuXSkKKwkJZmkKKwkJQUNfUlVOX0lGRUxTRSgKKwkJCVtBQ19MQU5HX1BST0dSQU0oW1sKKy8qIGZpbmQgb3V0IHdoYXQgU1REUEFUSCBpcyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgSEFWRV9QQVRIU19ICisjIGluY2x1ZGUgPHBhdGhzLmg+CisjZW5kaWYKKyNpZm5kZWYgX1BBVEhfU1REUEFUSAorIyBpZmRlZiBfUEFUSF9VU0VSUEFUSAkvKiBJcml4ICovCisjICBkZWZpbmUgX1BBVEhfU1REUEFUSCBfUEFUSF9VU0VSUEFUSAorIyBlbHNlCisjICBkZWZpbmUgX1BBVEhfU1REUEFUSCAiL3Vzci9iaW46L2JpbjovdXNyL3NiaW46L3NiaW4iCisjIGVuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjZGVmaW5lIERBVEEgImNvbmZ0ZXN0LnN0ZHBhdGgiCisJCQldXSwgW1sKKwlGSUxFICpmZDsKKwlpbnQgcmM7CisKKwlmZCA9IGZvcGVuKERBVEEsInciKTsKKwlpZihmZCA9PSBOVUxMKQorCQlleGl0KDEpOworCisJaWYgKChyYyA9IGZwcmludGYoZmQsIiVzIiwgX1BBVEhfU1REUEFUSCkpIDwgMCkKKwkJZXhpdCgxKTsKKworCWV4aXQoMCk7CisJCV1dKV0sCisJCVsgdXNlcl9wYXRoPWBjYXQgY29uZnRlc3Quc3RkcGF0aGAgXSwKKwkJWyB1c2VyX3BhdGg9Ii91c3IvYmluOi9iaW46L3Vzci9zYmluOi9zYmluIiBdLAorCQlbIHVzZXJfcGF0aD0iL3Vzci9iaW46L2JpbjovdXNyL3NiaW46L3NiaW4iIF0KKwkpCisjIG1ha2Ugc3VyZSAkYmluZGlyIGlzIGluIFVTRVJfUEFUSCBzbyBzY3Agd2lsbCB3b3JrCisJCXRfYmluZGlyPWBldmFsIGVjaG8gJHtiaW5kaXJ9YAorCQljYXNlICR0X2JpbmRpciBpbgorCQkJTk9ORS8qKSB0X2JpbmRpcj1gZWNobyAkdF9iaW5kaXIgfCBzZWQgInN+Tk9ORX4kcHJlZml4fiJgIDs7CisJCWVzYWMKKwkJY2FzZSAkdF9iaW5kaXIgaW4KKwkJCU5PTkUvKikgdF9iaW5kaXI9YGVjaG8gJHRfYmluZGlyIHwgc2VkICJzfk5PTkV+JGFjX2RlZmF1bHRfcHJlZml4fiJgIDs7CisJCWVzYWMKKwkJZWNobyAkdXNlcl9wYXRoIHwgZ3JlcCAiOiR0X2JpbmRpciIgID4gL2Rldi9udWxsIDI+JjEKKwkJaWYgdGVzdCAkPyAtbmUgMCAgOyB0aGVuCisJCQllY2hvICR1c2VyX3BhdGggfCBncmVwICJeJHRfYmluZGlyIiAgPiAvZGV2L251bGwgMj4mMQorCQkJaWYgdGVzdCAkPyAtbmUgMCAgOyB0aGVuCisJCQkJdXNlcl9wYXRoPSR1c2VyX3BhdGg6JHRfYmluZGlyCisJCQkJQUNfTVNHX1JFU1VMVChbQWRkaW5nICR0X2JpbmRpciB0byBVU0VSX1BBVEggc28gc2NwIHdpbGwgd29ya10pCisJCQlmaQorCQlmaQorCWZpIF0KKykKK2lmIHRlc3QgIngkZXh0ZXJuYWxfcGF0aF9maWxlIiAhPSAieC9ldGMvbG9naW4uY29uZiIgOyB0aGVuCisJQUNfREVGSU5FX1VOUVVPVEVEKFtVU0VSX1BBVEhdLCBbIiR1c2VyX3BhdGgiXSwgW1NwZWNpZnkgZGVmYXVsdCAkUEFUSF0pCisJQUNfU1VCU1QoW3VzZXJfcGF0aF0pCitmaQorCisjIFNldCBzdXBlcnVzZXIgcGF0aCBzZXBhcmF0ZWx5IHRvIHVzZXIgcGF0aAorQUNfQVJHX1dJVEgoW3N1cGVydXNlci1wYXRoXSwKKwlbICAtLXdpdGgtc3VwZXJ1c2VyLXBhdGg9ICBTcGVjaWZ5IGRpZmZlcmVudCBwYXRoIGZvciBzdXBlci11c2VyXSwKKwlbCisJCWlmIHRlc3QgLW4gIiR3aXRodmFsIiAgJiYgIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgICYmICBcCisJCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCisJCQlBQ19ERUZJTkVfVU5RVU9URUQoW1NVUEVSVVNFUl9QQVRIXSwgWyIkd2l0aHZhbCJdLAorCQkJCVtEZWZpbmUgaWYgeW91IHdhbnQgYSBkaWZmZXJlbnQgJFBBVEgKKwkJCQlmb3IgdGhlIHN1cGVydXNlcl0pCisJCQlzdXBlcnVzZXJfcGF0aD0kd2l0aHZhbAorCQlmaQorCV0KKykKKworCitBQ19NU0dfQ0hFQ0tJTkcoW2lmIHdlIG5lZWQgdG8gY29udmVydCBJUHY0IGluIElQdjYtbWFwcGVkIGFkZHJlc3Nlc10pCitJUFY0X0lONl9IQUNLX01TRz0ibm8iCitBQ19BUkdfV0lUSCg0aW42LAorCVsgIC0td2l0aC00aW42ICAgICAgICAgICAgIENoZWNrIGZvciBhbmQgY29udmVydCBJUHY0IGluIElQdjYgbWFwcGVkIGFkZHJlc3Nlc10sCisJWworCQlpZiB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iIDsgdGhlbgorCQkJQUNfTVNHX1JFU1VMVChbeWVzXSkKKwkJCUFDX0RFRklORShbSVBWNF9JTl9JUFY2XSwgWzFdLAorCQkJCVtEZXRlY3QgSVB2NCBpbiBJUHY2IG1hcHBlZCBhZGRyZXNzZXMKKwkJCQlhbmQgdHJlYXQgYXMgSVB2NF0pCisJCQlJUFY0X0lONl9IQUNLX01TRz0ieWVzIgorCQllbHNlCisJCQlBQ19NU0dfUkVTVUxUKFtub10pCisJCWZpCisJXSwgWworCQlpZiB0ZXN0ICJ4JGluZXQ2X2RlZmF1bHRfNGluNiIgPSAieHllcyI7IHRoZW4KKwkJCUFDX01TR19SRVNVTFQoW3llcyAoZGVmYXVsdCldKQorCQkJQUNfREVGSU5FKFtJUFY0X0lOX0lQVjZdKQorCQkJSVBWNF9JTjZfSEFDS19NU0c9InllcyIKKwkJZWxzZQorCQkJQUNfTVNHX1JFU1VMVChbbm8gKGRlZmF1bHQpXSkKKwkJZmkKKwldCispCisKKyMgV2hldGhlciB0byBlbmFibGUgQlNEIGF1dGggc3VwcG9ydAorQlNEX0FVVEhfTVNHPW5vCitBQ19BUkdfV0lUSChbYnNkLWF1dGhdLAorCVsgIC0td2l0aC1ic2QtYXV0aCAgICAgICAgIEVuYWJsZSBCU0QgYXV0aCBzdXBwb3J0XSwKKwlbCisJCWlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgOyB0aGVuCisJCQlBQ19ERUZJTkUoW0JTRF9BVVRIXSwgWzFdLAorCQkJCVtEZWZpbmUgaWYgeW91IGhhdmUgQlNEIGF1dGggc3VwcG9ydF0pCisJCQlCU0RfQVVUSF9NU0c9eWVzCisJCWZpCisJXQorKQorCisjIFdoZXJlIHRvIHBsYWNlIHNzaGQucGlkCitwaWRkaXI9L3Zhci9ydW4KKyMgbWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzCitpZiB0ZXN0ICEgLWQgJHBpZGRpciA7IHRoZW4KKwlwaWRkaXI9YGV2YWwgZWNobyAke3N5c2NvbmZkaXJ9YAorCWNhc2UgJHBpZGRpciBpbgorCQlOT05FLyopIHBpZGRpcj1gZWNobyAkcGlkZGlyIHwgc2VkICJzfk5PTkV+JGFjX2RlZmF1bHRfcHJlZml4fiJgIDs7CisJZXNhYworZmkKKworQUNfQVJHX1dJVEgoW3BpZC1kaXJdLAorCVsgIC0td2l0aC1waWQtZGlyPVBBVEggICAgIFNwZWNpZnkgbG9jYXRpb24gb2Ygc3NoLnBpZCBmaWxlXSwKKwlbCisJCWlmIHRlc3QgLW4gIiR3aXRodmFsIiAgJiYgIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgICYmICBcCisJCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCisJCQlwaWRkaXI9JHdpdGh2YWwKKwkJCWlmIHRlc3QgISAtZCAkcGlkZGlyIDsgdGhlbgorCQkJQUNfTVNHX1dBUk4oWyoqIG5vICRwaWRkaXIgZGlyZWN0b3J5IG9uIHRoaXMgc3lzdGVtICoqXSkKKwkJCWZpCisJCWZpCisJXQorKQorCitBQ19ERUZJTkVfVU5RVU9URUQoW19QQVRIX1NTSF9QSURESVJdLCBbIiRwaWRkaXIiXSwgCisJW1NwZWNpZnkgbG9jYXRpb24gb2Ygc3NoLnBpZF0pCitBQ19TVUJTVChbcGlkZGlyXSkKKworZG5sIGFsbG93IHVzZXIgdG8gZGlzYWJsZSBzb21lIGxvZ2luIHJlY29yZGluZyBmZWF0dXJlcworQUNfQVJHX0VOQUJMRShbbGFzdGxvZ10sCisJWyAgLS1kaXNhYmxlLWxhc3Rsb2cgICAgICAgZGlzYWJsZSB1c2Ugb2YgbGFzdGxvZyBldmVuIGlmIGRldGVjdGVkIFtub11dLAorCVsKKwkJaWYgdGVzdCAieCRlbmFibGV2YWwiID0gInhubyIgOyB0aGVuCisJCQlBQ19ERUZJTkUoW0RJU0FCTEVfTEFTVExPR10pCisJCWZpCisJXQorKQorQUNfQVJHX0VOQUJMRShbdXRtcF0sCisJWyAgLS1kaXNhYmxlLXV0bXAgICAgICAgICAgZGlzYWJsZSB1c2Ugb2YgdXRtcCBldmVuIGlmIGRldGVjdGVkIFtub11dLAorCVsKKwkJaWYgdGVzdCAieCRlbmFibGV2YWwiID0gInhubyIgOyB0aGVuCisJCQlBQ19ERUZJTkUoW0RJU0FCTEVfVVRNUF0pCisJCWZpCisJXQorKQorQUNfQVJHX0VOQUJMRShbdXRtcHhdLAorCVsgIC0tZGlzYWJsZS11dG1weCAgICAgICAgIGRpc2FibGUgdXNlIG9mIHV0bXB4IGV2ZW4gaWYgZGV0ZWN0ZWQgW25vXV0sCisJWworCQlpZiB0ZXN0ICJ4JGVuYWJsZXZhbCIgPSAieG5vIiA7IHRoZW4KKwkJCUFDX0RFRklORShbRElTQUJMRV9VVE1QWF0sIFsxXSwKKwkJCQlbRGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSB1dG1weF0pCisJCWZpCisJXQorKQorQUNfQVJHX0VOQUJMRShbd3RtcF0sCisJWyAgLS1kaXNhYmxlLXd0bXAgICAgICAgICAgZGlzYWJsZSB1c2Ugb2Ygd3RtcCBldmVuIGlmIGRldGVjdGVkIFtub11dLAorCVsKKwkJaWYgdGVzdCAieCRlbmFibGV2YWwiID0gInhubyIgOyB0aGVuCisJCQlBQ19ERUZJTkUoW0RJU0FCTEVfV1RNUF0pCisJCWZpCisJXQorKQorQUNfQVJHX0VOQUJMRShbd3RtcHhdLAorCVsgIC0tZGlzYWJsZS13dG1weCAgICAgICAgIGRpc2FibGUgdXNlIG9mIHd0bXB4IGV2ZW4gaWYgZGV0ZWN0ZWQgW25vXV0sCisJWworCQlpZiB0ZXN0ICJ4JGVuYWJsZXZhbCIgPSAieG5vIiA7IHRoZW4KKwkJCUFDX0RFRklORShbRElTQUJMRV9XVE1QWF0sIFsxXSwKKwkJCQlbRGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSB3dG1weF0pCisJCWZpCisJXQorKQorQUNfQVJHX0VOQUJMRShbbGlidXRpbF0sCisJWyAgLS1kaXNhYmxlLWxpYnV0aWwgICAgICAgZGlzYWJsZSB1c2Ugb2YgbGlidXRpbCAobG9naW4oKSBldGMuKSBbbm9dXSwKKwlbCisJCWlmIHRlc3QgIngkZW5hYmxldmFsIiA9ICJ4bm8iIDsgdGhlbgorCQkJQUNfREVGSU5FKFtESVNBQkxFX0xPR0lOXSkKKwkJZmkKKwldCispCitBQ19BUkdfRU5BQkxFKFtwdXR1dGxpbmVdLAorCVsgIC0tZGlzYWJsZS1wdXR1dGxpbmUgICAgIGRpc2FibGUgdXNlIG9mIHB1dHV0bGluZSgpIGV0Yy4gKFt1d110bXApIFtub11dLAorCVsKKwkJaWYgdGVzdCAieCRlbmFibGV2YWwiID0gInhubyIgOyB0aGVuCisJCQlBQ19ERUZJTkUoW0RJU0FCTEVfUFVUVVRMSU5FXSwgWzFdLAorCQkJCVtEZWZpbmUgaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIHB1dHV0bGluZSgpCisJCQkJZXRjLiB0byB3cml0ZSBbdXdddG1wXSkKKwkJZmkKKwldCispCitBQ19BUkdfRU5BQkxFKFtwdXR1dHhsaW5lXSwKKwlbICAtLWRpc2FibGUtcHV0dXR4bGluZSAgICBkaXNhYmxlIHVzZSBvZiBwdXR1dHhsaW5lKCkgZXRjLiAoW3V3XXRtcHgpIFtub11dLAorCVsKKwkJaWYgdGVzdCAieCRlbmFibGV2YWwiID0gInhubyIgOyB0aGVuCisJCQlBQ19ERUZJTkUoW0RJU0FCTEVfUFVUVVRYTElORV0sIFsxXSwKKwkJCQlbRGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSBwdXR1dHhsaW5lKCkKKwkJCQlldGMuIHRvIHdyaXRlIFt1d110bXB4XSkKKwkJZmkKKwldCispCitBQ19BUkdfV0lUSChbbGFzdGxvZ10sCisgIFsgIC0td2l0aC1sYXN0bG9nPUZJTEV8RElSIHNwZWNpZnkgbGFzdGxvZyBsb2NhdGlvbiBbY29tbW9uIGxvY2F0aW9uc11dLAorCVsKKwkJaWYgdGVzdCAieCR3aXRodmFsIiA9ICJ4bm8iIDsgdGhlbgorCQkJQUNfREVGSU5FKFtESVNBQkxFX0xBU1RMT0ddKQorCQllbGlmIHRlc3QgLW4gIiR3aXRodmFsIiAgJiYgIHRlc3QgIngke3dpdGh2YWx9IiAhPSAieHllcyI7IHRoZW4KKwkJCWNvbmZfbGFzdGxvZ19sb2NhdGlvbj0kd2l0aHZhbAorCQlmaQorCV0KKykKKworZG5sIGxhc3Rsb2csIFt1d110bXB4PyBkZXRlY3Rpb24KK2RubCAgTk9URTogc2V0IHRoZSBwYXRocyBpbiB0aGUgcGxhdGZvcm0gc2VjdGlvbiB0byBhdm9pZCB0aGUKK2RubCAgIG5lZWQgZm9yIGNvbW1hbmQtbGluZSBwYXJhbWV0ZXJzCitkbmwgbGFzdGxvZyBhbmQgW3V3XXRtcCBhcmUgc3ViamVjdCB0byBhIGZpbGUgc2VhcmNoIGlmIGFsbCBlbHNlIGZhaWxzCisKK2RubCBsYXN0bG9nIGRldGVjdGlvbgorZG5sICBOT1RFOiB0aGUgY29kZSBpdHNlbGYgd2lsbCBkZXRlY3QgaWYgbGFzdGxvZyBpcyBhIGRpcmVjdG9yeQorQUNfTVNHX0NIRUNLSU5HKFtpZiB5b3VyIHN5c3RlbSBkZWZpbmVzIExBU1RMT0dfRklMRV0pCitBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dXRtcC5oPgorI2lmZGVmIEhBVkVfTEFTVExPR19ICisjICBpbmNsdWRlIDxsYXN0bG9nLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1BBVEhTX0gKKyMgIGluY2x1ZGUgPHBhdGhzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0xPR0lOX0gKKyMgaW5jbHVkZSA8bG9naW4uaD4KKyNlbmRpZgorCV1dLCBbWyBjaGFyICpsYXN0bG9nID0gTEFTVExPR19GSUxFOyBdXSldLAorCQlbIEFDX01TR19SRVNVTFQoW3llc10pIF0sCisJCVsKKwkJQUNfTVNHX1JFU1VMVChbbm9dKQorCQlBQ19NU0dfQ0hFQ0tJTkcoW2lmIHlvdXIgc3lzdGVtIGRlZmluZXMgX1BBVEhfTEFTVExPR10pCisJCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1dG1wLmg+CisjaWZkZWYgSEFWRV9MQVNUTE9HX0gKKyMgIGluY2x1ZGUgPGxhc3Rsb2cuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfUEFUSFNfSAorIyAgaW5jbHVkZSA8cGF0aHMuaD4KKyNlbmRpZgorCQldXSwgW1sgY2hhciAqbGFzdGxvZyA9IF9QQVRIX0xBU1RMT0c7IF1dKV0sCisJCVsgQUNfTVNHX1JFU1VMVChbeWVzXSkgXSwKKwkJWworCQkJQUNfTVNHX1JFU1VMVChbbm9dKQorCQkJc3lzdGVtX2xhc3Rsb2dfcGF0aD1ubworCQldKQorXSkKKworaWYgdGVzdCAteiAiJGNvbmZfbGFzdGxvZ19sb2NhdGlvbiI7IHRoZW4KKwlpZiB0ZXN0IHgiJHN5c3RlbV9sYXN0bG9nX3BhdGgiID0geCJubyIgOyB0aGVuCisJCWZvciBmIGluIC92YXIvbG9nL2xhc3Rsb2cgL3Vzci9hZG0vbGFzdGxvZyAvdmFyL2FkbS9sYXN0bG9nIC9ldGMvc2VjdXJpdHkvbGFzdGxvZyA7IGRvCisJCQkJaWYgKHRlc3QgLWQgIiRmIiB8fCB0ZXN0IC1mICIkZiIpIDsgdGhlbgorCQkJCQljb25mX2xhc3Rsb2dfbG9jYXRpb249JGYKKwkJCQlmaQorCQlkb25lCisJCWlmIHRlc3QgLXogIiRjb25mX2xhc3Rsb2dfbG9jYXRpb24iOyB0aGVuCisJCQlBQ19NU0dfV0FSTihbKiogQ2Fubm90IGZpbmQgbGFzdGxvZyAqKl0pCisJCQlkbmwgRG9uJ3QgZGVmaW5lIERJU0FCTEVfTEFTVExPRyAtIHRoYXQgbWVhbnMgd2UgZG9uJ3QgdHJ5IHd0bXAvd3RtcHgKKwkJZmkKKwlmaQorZmkKKworaWYgdGVzdCAtbiAiJGNvbmZfbGFzdGxvZ19sb2NhdGlvbiI7IHRoZW4KKwlBQ19ERUZJTkVfVU5RVU9URUQoW0NPTkZfTEFTVExPR19GSUxFXSwgWyIkY29uZl9sYXN0bG9nX2xvY2F0aW9uIl0sCisJCVtEZWZpbmUgaWYgeW91IHdhbnQgdG8gc3BlY2lmeSB0aGUgcGF0aCB0byB5b3VyIGxhc3Rsb2cgZmlsZV0pCitmaQorCitkbmwgdXRtcCBkZXRlY3Rpb24KK0FDX01TR19DSEVDS0lORyhbaWYgeW91ciBzeXN0ZW0gZGVmaW5lcyBVVE1QX0ZJTEVdKQorQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHV0bXAuaD4KKyNpZmRlZiBIQVZFX1BBVEhTX0gKKyMgIGluY2x1ZGUgPHBhdGhzLmg+CisjZW5kaWYKKwldXSwgW1sgY2hhciAqdXRtcCA9IFVUTVBfRklMRTsgXV0pXSwKKwlbIEFDX01TR19SRVNVTFQoW3llc10pIF0sCisJWyBBQ19NU0dfUkVTVUxUKFtub10pCisJICBzeXN0ZW1fdXRtcF9wYXRoPW5vIAorXSkKK2lmIHRlc3QgLXogIiRjb25mX3V0bXBfbG9jYXRpb24iOyB0aGVuCisJaWYgdGVzdCB4IiRzeXN0ZW1fdXRtcF9wYXRoIiA9IHgibm8iIDsgdGhlbgorCQlmb3IgZiBpbiAvZXRjL3V0bXAgL3Vzci9hZG0vdXRtcCAvdmFyL3J1bi91dG1wOyBkbworCQkJaWYgdGVzdCAtZiAkZiA7IHRoZW4KKwkJCQljb25mX3V0bXBfbG9jYXRpb249JGYKKwkJCWZpCisJCWRvbmUKKwkJaWYgdGVzdCAteiAiJGNvbmZfdXRtcF9sb2NhdGlvbiI7IHRoZW4KKwkJCUFDX0RFRklORShbRElTQUJMRV9VVE1QXSkKKwkJZmkKKwlmaQorZmkKK2lmIHRlc3QgLW4gIiRjb25mX3V0bXBfbG9jYXRpb24iOyB0aGVuCisJQUNfREVGSU5FX1VOUVVPVEVEKFtDT05GX1VUTVBfRklMRV0sIFsiJGNvbmZfdXRtcF9sb2NhdGlvbiJdLAorCQlbRGVmaW5lIGlmIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhlIHBhdGggdG8geW91ciB1dG1wIGZpbGVdKQorZmkKKworZG5sIHd0bXAgZGV0ZWN0aW9uCitBQ19NU0dfQ0hFQ0tJTkcoW2lmIHlvdXIgc3lzdGVtIGRlZmluZXMgV1RNUF9GSUxFXSkKK0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1dG1wLmg+CisjaWZkZWYgSEFWRV9QQVRIU19ICisjICBpbmNsdWRlIDxwYXRocy5oPgorI2VuZGlmCisJXV0sIFtbIGNoYXIgKnd0bXAgPSBXVE1QX0ZJTEU7IF1dKV0sCisJWyBBQ19NU0dfUkVTVUxUKFt5ZXNdKSBdLAorCVsgQUNfTVNHX1JFU1VMVChbbm9dKQorCSAgc3lzdGVtX3d0bXBfcGF0aD1ubyAKK10pCitpZiB0ZXN0IC16ICIkY29uZl93dG1wX2xvY2F0aW9uIjsgdGhlbgorCWlmIHRlc3QgeCIkc3lzdGVtX3d0bXBfcGF0aCIgPSB4Im5vIiA7IHRoZW4KKwkJZm9yIGYgaW4gL3Vzci9hZG0vd3RtcCAvdmFyL2xvZy93dG1wOyBkbworCQkJaWYgdGVzdCAtZiAkZiA7IHRoZW4KKwkJCQljb25mX3d0bXBfbG9jYXRpb249JGYKKwkJCWZpCisJCWRvbmUKKwkJaWYgdGVzdCAteiAiJGNvbmZfd3RtcF9sb2NhdGlvbiI7IHRoZW4KKwkJCUFDX0RFRklORShbRElTQUJMRV9XVE1QXSkKKwkJZmkKKwlmaQorZmkKK2lmIHRlc3QgLW4gIiRjb25mX3d0bXBfbG9jYXRpb24iOyB0aGVuCisJQUNfREVGSU5FX1VOUVVPVEVEKFtDT05GX1dUTVBfRklMRV0sIFsiJGNvbmZfd3RtcF9sb2NhdGlvbiJdLAorCQlbRGVmaW5lIGlmIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhlIHBhdGggdG8geW91ciB3dG1wIGZpbGVdKQorZmkKKworCitkbmwgd3RtcHggZGV0ZWN0aW9uCitBQ19NU0dfQ0hFQ0tJTkcoW2lmIHlvdXIgc3lzdGVtIGRlZmluZXMgV1RNUFhfRklMRV0pCitBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dXRtcC5oPgorI2lmZGVmIEhBVkVfVVRNUFhfSAorI2luY2x1ZGUgPHV0bXB4Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1BBVEhTX0gKKyMgIGluY2x1ZGUgPHBhdGhzLmg+CisjZW5kaWYKKwldXSwgW1sgY2hhciAqd3RtcHggPSBXVE1QWF9GSUxFOyBdXSldLAorCVsgQUNfTVNHX1JFU1VMVChbeWVzXSkgXSwKKwlbIEFDX01TR19SRVNVTFQoW25vXSkKKwkgIHN5c3RlbV93dG1weF9wYXRoPW5vIAorXSkKK2lmIHRlc3QgLXogIiRjb25mX3d0bXB4X2xvY2F0aW9uIjsgdGhlbgorCWlmIHRlc3QgeCIkc3lzdGVtX3d0bXB4X3BhdGgiID0geCJubyIgOyB0aGVuCisJCUFDX0RFRklORShbRElTQUJMRV9XVE1QWF0pCisJZmkKK2Vsc2UKKwlBQ19ERUZJTkVfVU5RVU9URUQoW0NPTkZfV1RNUFhfRklMRV0sIFsiJGNvbmZfd3RtcHhfbG9jYXRpb24iXSwKKwkJW0RlZmluZSBpZiB5b3Ugd2FudCB0byBzcGVjaWZ5IHRoZSBwYXRoIHRvIHlvdXIgd3RtcHggZmlsZV0pCitmaQorCisKK2lmIHRlc3QgISAteiAiJGJsaWJwYXRoIiA7IHRoZW4KKwlMREZMQUdTPSIkTERGTEFHUyAkYmxpYmZsYWdzJGJsaWJwYXRoIgorCUFDX01TR19XQVJOKFtQbGVhc2UgY2hlY2sgYW5kIGVkaXQgYmxpYnBhdGggaW4gTERGTEFHUyBpbiBNYWtlZmlsZV0pCitmaQorCitkbmwgQWRkaW5nIC1XZXJyb3IgdG8gQ0ZMQUdTIGVhcmx5IHByZXZlbnRzIGNvbmZpZ3VyZSB0ZXN0cyBmcm9tIHJ1bm5pbmcuCitkbmwgQWRkIG5vdy4KK0NGTEFHUz0iJENGTEFHUyAkd2Vycm9yX2ZsYWdzIgorCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0YWRkcmluZm8iICE9ICJ4eWVzIiA7IHRoZW4KKwlURVNUX1NTSF9JUFY2PW5vCitlbHNlCisJVEVTVF9TU0hfSVBWNj15ZXMKK2ZpCitBQ19DSEVDS19ERUNMKFtCUk9LRU5fR0VUQUREUklORk9dLCAgW1RFU1RfU1NIX0lQVjY9bm9dKQorQUNfU1VCU1QoW1RFU1RfU1NIX0lQVjZdLCBbJFRFU1RfU1NIX0lQVjZdKQorCitBQ19FWEVFWFQKK0FDX0NPTkZJR19GSUxFUyhbTWFrZWZpbGUgYnVpbGRwa2cuc2ggb3BlbnNzaGQuaW5pdCBvcGVuc3NoLnhtbCBcCisJb3BlbmJzZC1jb21wYXQvTWFrZWZpbGUgb3BlbmJzZC1jb21wYXQvcmVncmVzcy9NYWtlZmlsZSBcCisJc3VydmV5LnNoXSkKK0FDX09VVFBVVAorCisjIFByaW50IHN1bW1hcnkgb2Ygb3B0aW9ucworCisjIFNvbWVvbmUgcGxlYXNlIHNob3cgbWUgYSBiZXR0ZXIgd2F5IDopCitBPWBldmFsIGVjaG8gJHtwcmVmaXh9YCA7IEE9YGV2YWwgZWNobyAke0F9YAorQj1gZXZhbCBlY2hvICR7YmluZGlyfWAgOyBCPWBldmFsIGVjaG8gJHtCfWAKK0M9YGV2YWwgZWNobyAke3NiaW5kaXJ9YCA7IEM9YGV2YWwgZWNobyAke0N9YAorRD1gZXZhbCBlY2hvICR7c3lzY29uZmRpcn1gIDsgRD1gZXZhbCBlY2hvICR7RH1gCitFPWBldmFsIGVjaG8gJHtsaWJleGVjZGlyfS9zc2gtYXNrcGFzc2AgOyBFPWBldmFsIGVjaG8gJHtFfWAKK0Y9YGV2YWwgZWNobyAke21hbmRpcn0vJHttYW5zdWJkaXJ9WGAgOyBGPWBldmFsIGVjaG8gJHtGfWAKK0c9YGV2YWwgZWNobyAke3BpZGRpcn1gIDsgRz1gZXZhbCBlY2hvICR7R31gCitIPWBldmFsIGVjaG8gJHtQUklWU0VQX1BBVEh9YCA7IEg9YGV2YWwgZWNobyAke0h9YAorST1gZXZhbCBlY2hvICR7dXNlcl9wYXRofWAgOyBJPWBldmFsIGVjaG8gJHtJfWAKK0o9YGV2YWwgZWNobyAke3N1cGVydXNlcl9wYXRofWAgOyBKPWBldmFsIGVjaG8gJHtKfWAKKworZWNobyAiIgorZWNobyAiT3BlblNTSCBoYXMgYmVlbiBjb25maWd1cmVkIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOiIKK2VjaG8gIiAgICAgICAgICAgICAgICAgICAgIFVzZXIgYmluYXJpZXM6ICRCIgorZWNobyAiICAgICAgICAgICAgICAgICAgIFN5c3RlbSBiaW5hcmllczogJEMiCitlY2hvICIgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uIGZpbGVzOiAkRCIKK2VjaG8gIiAgICAgICAgICAgICAgICAgICBBc2twYXNzIHByb2dyYW06ICRFIgorZWNobyAiICAgICAgICAgICAgICAgICAgICAgIE1hbnVhbCBwYWdlczogJEYiCitlY2hvICIgICAgICAgICAgICAgICAgICAgICAgICAgIFBJRCBmaWxlOiAkRyIKK2VjaG8gIiAgUHJpdmlsZWdlIHNlcGFyYXRpb24gY2hyb290IHBhdGg6ICRIIgoraWYgdGVzdCAieCRleHRlcm5hbF9wYXRoX2ZpbGUiID0gIngvZXRjL2xvZ2luLmNvbmYiIDsgdGhlbgorZWNobyAiICAgQXQgcnVudGltZSwgc3NoZCB3aWxsIHVzZSB0aGUgcGF0aCBkZWZpbmVkIGluICRleHRlcm5hbF9wYXRoX2ZpbGUiCitlY2hvICIgICBNYWtlIHN1cmUgdGhlIHBhdGggdG8gc2NwIGlzIHByZXNlbnQsIG90aGVyd2lzZSBzY3Agd2lsbCBub3Qgd29yayIKK2Vsc2UKK2VjaG8gIiAgICAgICAgICAgIHNzaGQgZGVmYXVsdCB1c2VyIFBBVEg6ICRJIgorCWlmIHRlc3QgISAteiAiJGV4dGVybmFsX3BhdGhfZmlsZSI7IHRoZW4KK2VjaG8gIiAgIChJZiBQQVRIIGlzIHNldCBpbiAkZXh0ZXJuYWxfcGF0aF9maWxlIGl0IHdpbGwgYmUgdXNlZCBpbnN0ZWFkLiBJZiIKK2VjaG8gIiAgIHVzZWQsIGVuc3VyZSB0aGUgcGF0aCB0byBzY3AgaXMgcHJlc2VudCwgb3RoZXJ3aXNlIHNjcCB3aWxsIG5vdCB3b3JrLikiCisJZmkKK2ZpCitpZiB0ZXN0ICEgLXogIiRzdXBlcnVzZXJfcGF0aCIgOyB0aGVuCitlY2hvICIgICAgICAgICAgc3NoZCBzdXBlcnVzZXIgdXNlciBQQVRIOiAkSiIKK2ZpCitlY2hvICIgICAgICAgICAgICAgICAgICAgIE1hbnBhZ2UgZm9ybWF0OiAkTUFOVFlQRSIKK2VjaG8gIiAgICAgICAgICAgICAgICAgICAgICAgUEFNIHN1cHBvcnQ6ICRQQU1fTVNHIgorZWNobyAiICAgICAgICAgICAgICAgICAgIE9TRiBTSUEgc3VwcG9ydDogJFNJQV9NU0ciCitlY2hvICIgICAgICAgICAgICAgICAgIEtlcmJlcm9zViBzdXBwb3J0OiAkS1JCNV9NU0ciCitlY2hvICIgICAgICAgICAgICAgICAgICAgU0VMaW51eCBzdXBwb3J0OiAkU0VMSU5VWF9NU0ciCitlY2hvICIgICAgICAgICAgICAgICAgIFNtYXJ0Y2FyZCBzdXBwb3J0OiAkU0NBUkRfTVNHIgorZWNobyAiICAgICAgICAgICAgICAgICAgICAgUy9LRVkgc3VwcG9ydDogJFNLRVlfTVNHIgorZWNobyAiICAgICAgICAgICAgICBUQ1AgV3JhcHBlcnMgc3VwcG9ydDogJFRDUFdfTVNHIgorZWNobyAiICAgICAgICAgICAgICBNRDUgcGFzc3dvcmQgc3VwcG9ydDogJE1ENV9NU0ciCitlY2hvICIgICAgICAgICAgICAgICAgICAgbGliZWRpdCBzdXBwb3J0OiAkTElCRURJVF9NU0ciCitlY2hvICIgIFNvbGFyaXMgcHJvY2VzcyBjb250cmFjdCBzdXBwb3J0OiAkU1BDX01TRyIKK2VjaG8gIiAgICAgICAgICAgU29sYXJpcyBwcm9qZWN0IHN1cHBvcnQ6ICRTUF9NU0ciCitlY2hvICIgICAgICAgSVAgYWRkcmVzcyBpbiBcJERJU1BMQVkgaGFjazogJERJU1BMQVlfSEFDS19NU0ciCitlY2hvICIgICAgICAgICAgIFRyYW5zbGF0ZSB2NCBpbiB2NiBoYWNrOiAkSVBWNF9JTjZfSEFDS19NU0ciCitlY2hvICIgICAgICAgICAgICAgICAgICBCU0QgQXV0aCBzdXBwb3J0OiAkQlNEX0FVVEhfTVNHIgorZWNobyAiICAgICAgICAgICAgICBSYW5kb20gbnVtYmVyIHNvdXJjZTogJFJBTkRfTVNHIgorZWNobyAiICAgICAgICAgICAgIFByaXZzZXAgc2FuZGJveCBzdHlsZTogJFNBTkRCT1hfU1RZTEUiCisKK2VjaG8gIiIKKworZWNobyAiICAgICAgICAgICAgICBIb3N0OiAke2hvc3R9IgorZWNobyAiICAgICAgICAgIENvbXBpbGVyOiAke0NDfSIKK2VjaG8gIiAgICBDb21waWxlciBmbGFnczogJHtDRkxBR1N9IgorZWNobyAiUHJlcHJvY2Vzc29yIGZsYWdzOiAke0NQUEZMQUdTfSIKK2VjaG8gIiAgICAgIExpbmtlciBmbGFnczogJHtMREZMQUdTfSIKK2VjaG8gIiAgICAgICAgIExpYnJhcmllczogJHtMSUJTfSIKK2lmIHRlc3QgISAteiAiJHtTU0hETElCU30iOyB0aGVuCitlY2hvICIgICAgICAgICArZm9yIHNzaGQ6ICR7U1NIRExJQlN9IgorZmkKK2lmIHRlc3QgISAteiAiJHtTU0hMSUJTfSI7IHRoZW4KK2VjaG8gIiAgICAgICAgICArZm9yIHNzaDogJHtTU0hMSUJTfSIKK2ZpCisKK2VjaG8gIiIKKworaWYgdGVzdCAieCRNQUtFX1BBQ0tBR0VfU1VQUE9SVEVEIiA9ICJ4eWVzIiA7IHRoZW4KKwllY2hvICJTVlI0IHN0eWxlIHBhY2thZ2VzIGFyZSBzdXBwb3J0ZWQgd2l0aCBcIm1ha2UgcGFja2FnZVwiIgorCWVjaG8gIiIKK2ZpCisKK2lmIHRlc3QgIngkUEFNX01TRyIgPSAieHllcyIgOyB0aGVuCisJZWNobyAiUEFNIGlzIGVuYWJsZWQuIFlvdSBtYXkgbmVlZCB0byBpbnN0YWxsIGEgUEFNIGNvbnRyb2wgZmlsZSAiCisJZWNobyAiZm9yIHNzaGQsIG90aGVyd2lzZSBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiBtYXkgZmFpbC4gIgorCWVjaG8gIkV4YW1wbGUgUEFNIGNvbnRyb2wgZmlsZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBjb250cmliLyAiCisJZWNobyAic3ViZGlyZWN0b3J5IgorCWVjaG8gIiIKK2ZpCisKK2lmIHRlc3QgISAteiAiJE5PX1BFRVJDSEVDSyIgOyB0aGVuCisJZWNobyAiV0FSTklORzogdGhlIG9wZXJhdGluZyBzeXN0ZW0gdGhhdCB5b3UgYXJlIHVzaW5nIGRvZXMgbm90IgorCWVjaG8gImFwcGVhciB0byBzdXBwb3J0IGdldHBlZXJlaWQoKSwgZ2V0cGVlcnVjcmVkKCkgb3IgdGhlIgorCWVjaG8gIlNPX1BFRVJDUkVEIGdldHNvY2tvcHQoKSBvcHRpb24uIFRoZXNlIGZhY2lsaXRpZXMgYXJlIHVzZWQgdG8iCisJZWNobyAiZW5mb3JjZSBzZWN1cml0eSBjaGVja3MgdG8gcHJldmVudCB1bmF1dGhvcmlzZWQgY29ubmVjdGlvbnMgdG8iCisJZWNobyAic3NoLWFnZW50LiBUaGVpciBhYnNlbmNlIGluY3JlYXNlcyB0aGUgcmlzayB0aGF0IGEgbWFsaWNpb3VzIgorCWVjaG8gInVzZXIgY2FuIGNvbm5lY3QgdG8geW91ciBhZ2VudC4iCisJZWNobyAiIgorZmkKKworaWYgdGVzdCAiJEFVRElUX01PRFVMRSIgPSAiYnNtIiA7IHRoZW4KKwllY2hvICJXQVJOSU5HOiBCU00gYXVkaXQgc3VwcG9ydCBpcyBjdXJyZW50bHkgY29uc2lkZXJlZCBFWFBFUklNRU5UQUwuIgorCWVjaG8gIlNlZSB0aGUgU29sYXJpcyBzZWN0aW9uIGluIFJFQURNRS5wbGF0Zm9ybSBmb3IgZGV0YWlscy4iCitmaQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jb250cmliL01ha2VmaWxlIGIvb3BlbnNzaC02LjBwMS9jb250cmliL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMzRlYjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorYWxsOgorCUBlY2hvICJWYWxpZCB0YXJnZXRzOiBnbm9tZS1zc2gtYXNrcGFzczEgZ25vbWUtc3NoLWFza3Bhc3MyIgorCitnbm9tZS1zc2gtYXNrcGFzczE6IGdub21lLXNzaC1hc2twYXNzMS5jCisJJChDQykgYGdub21lLWNvbmZpZyAtLWNmbGFncyBnbm9tZSBnbm9tZXVpYCBcCisJCWdub21lLXNzaC1hc2twYXNzMS5jIC1vIGdub21lLXNzaC1hc2twYXNzMSBcCisJCWBnbm9tZS1jb25maWcgLS1saWJzIGdub21lIGdub21ldWlgCisKK2dub21lLXNzaC1hc2twYXNzMjogZ25vbWUtc3NoLWFza3Bhc3MyLmMKKwkkKENDKSBgcGtnLWNvbmZpZyAtLWNmbGFncyBndGsrLTIuMGAgXAorCQlnbm9tZS1zc2gtYXNrcGFzczIuYyAtbyBnbm9tZS1zc2gtYXNrcGFzczIgXAorCQlgcGtnLWNvbmZpZyAtLWxpYnMgZ3RrKy0yLjAgeDExYAorCitjbGVhbjoKKwlybSAtZiAqLm8gZ25vbWUtc3NoLWFza3Bhc3MxIGdub21lLXNzaC1hc2twYXNzMiBnbm9tZS1zc2gtYXNrcGFzcwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jb250cmliL1JFQURNRSBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwMjIzOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9SRUFETUUKQEAgLTAsMCArMSw3MCBAQAorT3RoZXIgcGF0Y2hlcyBhbmQgYWRkb25zIGZvciBPcGVuU1NILiBQbGVhc2Ugc2VuZCBzdWJtaXNzaW9ucyB0bworZGptQG1pbmRyb3Qub3JnCisKK0V4dGVybmFsbHkgbWFpbnRhaW5lZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NTSCBQcm94eSBDb21tYW5kIC0tIGNvbm5lY3QuYworCitTaHVuLWljaGkgR09UTyA8Z290b2hAaW1hc3kub3IuanA+IGhhcyB3cml0dGVuIGEgdmVyeSB1c2VmdWwgUHJveHlDb21tYW5kCit3aGljaCBhbGxvd3MgdGhlIHVzZSBvZiBvdXRib3VuZCBTU0ggZnJvbSBiZWhpbmQgYSBTT0NLUzQsIFNPQ0tTNSBvcgoraHR0cHMgQ09OTkVDVCBzdHlsZSBwcm94eSBzZXJ2ZXIuIEhpcyBwYWdlIGZvciBjb25uZWN0LmMgaGFzIGV4dGVuc2l2ZQorZG9jdW1lbnRhdGlvbiBvbiBpdHMgdXNlIGFzIHdlbGwgYXMgY29tcGlsZWQgdmVyc2lvbnMgZm9yIFdpbjMyLgorCitodHRwOi8vd3d3LnRhaXlvLmNvLmpwL35nb3RvaC9zc2gvY29ubmVjdC5odG1sCisKKworWDExIFNTSCBBc2twYXNzOgorCitKaW0gS25vYmxlIDxqbWtub2JsZUBwb2JveC5jb20+IGhhcyB3cml0dGVuIGFuIGV4Y2VsbGVudCBYMTEKK3Bhc3NwaHJhc2UgcmVxdWVzdGVyLiBUaGlzIGlzIGhpZ2hseSByZWNvbW1lbmRlZDoKKworaHR0cDovL3d3dy5qbWtub2JsZS5uZXQvc29mdHdhcmUveDExLXNzaC1hc2twYXNzLworCisKK0luIHRoaXMgZGlyZWN0b3J5CistLS0tLS0tLS0tLS0tLS0tLQorCitzc2gtY29weS1pZDoKKworUGhpbCBIYW5kcycgPHBoaWxAaGFuZHMuY29tPiBzaGVsbCBzY3JpcHQgdG8gYXV0b21hdGUgdGhlIHByb2Nlc3Mgb2YgYWRkaW5nCit5b3VyIHB1YmxpYyBrZXkgdG8gYSByZW1vdGUgbWFjaGluZSdzIH4vLnNzaC9hdXRob3JpemVkX2tleXMgZmlsZS4KKworZ25vbWUtc3NoLWFza3Bhc3NbMTJdOgorCitBIEdOT01FIGFuZCBHdGsyIHBhc3NwaHJhc2UgcmVxdWVzdGVycy4gVXNlICJtYWtlIGdub21lLXNzaC1hc2twYXNzMSIgb3IKKyJtYWtlIGdub21lLXNzaC1hc2twYXNzMiIgdG8gYnVpbGQuCisKK3NzaGQucGFtLmdlbmVyaWM6CisKK0EgZ2VuZXJpYyBQQU0gY29uZmlnIGZpbGUgd2hpY2ggbWF5IGJlIHVzZWZ1bCBvbiB5b3VyIHN5c3RlbS4gWU1NVgorCitzc2hkLnBhbS5mcmVlYnNkOgorCitBIFBBTSBjb25maWcgZmlsZSB3aGljaCB3b3JrcyB3aXRoIEZyZWVCU0QncyBQQU0gcG9ydC4gQ29udHJpYnV0ZWQgYnkKK0RvbWluaWsgQnJldHRuYWNoZXIgPGRvbWlAc2FhcmdhdGUuZGU+CisKK2ZpbmRzc2wuc2g6CisKK1NlYXJjaCBmb3IgYWxsIGluc3RhbmNlcyBvZiBPcGVuU1NMIGhlYWRlcnMgYW5kIGxpYnJhcmllcyBhbmQgcHJpbnQgdGhlaXIgCit2ZXJzaW9ucy4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gaGVscCBkaWFnbm9zZSBPcGVuU1NIJ3MgIk9wZW5TU0wgaGVhZGVycyBkbyBub3QKK21hdGNoIHlvdXIgbGlicmFyeSIgZXJyb3JzLiAKKworYWl4OgorICAgIEZpbGVzIHRvIGJ1aWxkIGFuIEFJWCBuYXRpdmUgKGluc3RhbGxwIG9yIFNNSVQgaW5zdGFsbGFibGUpIHBhY2thZ2UuCisKK2NhbGRlcmE6CisgICAgUlBNIHNwZWMgZmlsZSBhbmQgc2NyaXB0cyBmb3IgYnVpbGRpbmcgQ2FsZGVyYSBPcGVuTGludWl4IHBhY2thZ2VzCisKK2N5Z3dpbjoKKyAgICBTdXBwb3J0IGZpbGVzIGZvciBDeWd3aW4KKworaHB1eDoKKyAgICBTdXBwb3J0IGZpbGVzIGZvciBIUC1VWAorCityZWRoYXQ6CisgICAgUlBNIHNwZWMgZmlsZSBhbmQgc2NyaXB0cyBmb3IgYnVpbGRpbmcgUmVkaGF0IHBhY2thZ2VzCisKK3N1c2U6CisgICAgUlBNIHNwZWMgZmlsZSBhbmQgc2NyaXB0cyBmb3IgYnVpbGRpbmcgU3VTRSBwYWNrYWdlcworCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvYWl4L1JFQURNRSBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9haXgvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMjk5MzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvYWl4L1JFQURNRQpAQCAtMCwwICsxLDUwIEBACitPdmVydmlldzoKKworVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgZmlsZXMgdG8gYnVpbGQgYW4gQUlYIG5hdGl2ZSAoaW5zdGFsbHAgb3IgU01JVAoraW5zdGFsbGFibGUpIG9wZW5zc2ggcGFja2FnZS4KKworCitEaXJlY3Rpb25zOgorCisob3B0aW9uYWwpIGNyZWF0ZSBjb25maWcubG9jYWwgaW4geW91ciBidWlsZCBkaXIKKy4vY29uZmlndXJlIFtvcHRpb25zXQorY29udHJpYi9haXgvYnVpbGRiZmYuc2gKKworVGhlIGZpbGUgY29uZmlnLmxvY2FsIG9yIHRoZSBlbnZpcm9ubWVudCBpcyByZWFkIHRvIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbnMKKyhkZWZhdWx0IGZpcnN0KToKK1BFUk1JVF9ST09UX0xPR0lOPVtub3x5ZXNdCitYMTFfRk9SV0FSRElORz1bbm98eWVzXQorQUlYX1NSQz1bbm98eWVzXQorCitBY2tub3dsZWRnZW1lbnRzOgorCitUaGUgY29udGVudHMgb2YgdGhpcyBkaXJlY3RvcnkgYXJlIGJhc2VkIG9uIEJlbiBMaW5kc3Ryb20ncyBTb2xhcmlzCitidWlsZHBrZy5zaC4gQmVuIGFsc28gc3VwcGxpZWQgaW52ZW50b3J5LnNoLgorCitKaW0gQWJiZXkncyAoR1BMJ2VkKSBscHBidWlsZC0yLjEgd2FzIHVzZWQgdG8gbGVhcm4gaG93IHRvIGJ1aWxkIC5iZmYncworYW5kIGZvciBjb21wYXJpc29uIHdpdGggdGhlIG91dHB1dCBmcm9tIHRoaXMgc2NyaXB0LCBob3dldmVyIG5vIGNvZGUKK2Zyb20gbHBwYnVpbGQgaXMgaW5jbHVkZWQgYW5kIGl0IGlzIG5vdCByZXF1aXJlZCBmb3Igb3BlcmF0aW9uLgorCitTUkMgc3VwcG9ydCBiYXNlZCBvbiBleGFtcGxlcyBwcm92aWRlZCBieSBTYW5kb3IgU2tsYXIgYW5kIE1hYXJ0ZW4gS3JldWdlci4KK1ByaXZTZXAgYWNjb3VudCBoYW5kbGluZyBmaXhlcyBjb250cmlidXRlZCBieSBXLiBFYXJsIEFsbGVuLgorCisKK090aGVyIG5vdGVzOgorCitUaGUgc2NyaXB0IHRyZWF0cyBhbGwgcGFja2FnZXMgYXMgVVNSIHBhY2thZ2VzIChub3QgUk9PVCtVU1Igd2hlbgorYXBwcm9wcmlhdGUpLiAgSXQgc2VlbXMgdG8gd29yaywgdGhvdWdoLi4uLi4uCisKK0lmIHRoZXJlIGFyZSBhbnkgcGF0Y2hlcyB0byB0aGlzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gaW50ZWdyYXRlZCB0aGV5CittYXkgYmUgZm91bmQgYXQgaHR0cDovL3d3dy56aXAuY29tLmF1L35kdHVja2VyL29wZW5zc2gvLgorCisKK0Rpc2NsYWltZXI6CisKK0l0IGlzIGhvcGVkIHRoYXQgaXQgaXMgdXNlZnVsIGJ1dCB0aGVyZSBpcyBubyB3YXJyYW50eS4gSWYgaXQgYnJlYWtzCit5b3UgZ2V0IHRvIGtlZXAgYm90aCBwaWVjZXMuCisKKworCS0gRGFycmVuIFR1Y2tlciAoZHR1Y2tlciBhdCB6aXAgZG90IGNvbSBkb3QgYXUpCisJICAyMDAyLzAzLzAxCisKKyRJZDogUkVBRE1FLHYgMS40IDIwMDMvMDgvMjUgMDU6MDE6MDQgZHR1Y2tlciBFeHAgJApkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jb250cmliL2FpeC9idWlsZGJmZi5zaCBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9haXgvYnVpbGRiZmYuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODFkOGNjMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9haXgvYnVpbGRiZmYuc2gKQEAgLTAsMCArMSwzODEgQEAKKyMhL2Jpbi9zaAorIworIyBidWlsZGJmZi5zaDogQ3JlYXRlIEFJWCBTTUlULWluc3RhbGxhYmxlIE9wZW5TU0ggcGFja2FnZXMKKyMgJElkOiBidWlsZGJmZi5zaCx2IDEuMTMgMjAxMS8wNS8wNSAwMzo0ODo0MSBkam0gRXhwICQKKyMKKyMgQXV0aG9yOiBEYXJyZW4gVHVja2VyIChkdHVja2VyIGF0IHppcCBkb3QgY29tIGRvdCBhdSkKKyMgVGhpcyBmaWxlIGlzIHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbiBhbmQgY29tZXMgd2l0aCBhYnNvbHV0ZWx5CisjIG5vIHdhcnJhbnR5LgorIworIyBCYXNlZCBvcmlnaW5hbGx5IG9uIEJlbiBMaW5kc3Ryb20ncyBidWlsZHBrZy5zaCBmb3IgU29sYXJpcworIworCisjCisjIFR1bmFibGUgY29uZmlndXJhdGlvbiBzZXR0aW5ncworIyAJY3JlYXRlIGEgImNvbmZpZy5sb2NhbCIgaW4geW91ciBidWlsZCBkaXJlY3Rvcnkgb3Igc2V0CisjCWVudmlyb25tZW50IHZhcmlhYmxlcyB0byBvdmVycmlkZSB0aGVzZS4KKyMKK1sgLXogIiRQRVJNSVRfUk9PVF9MT0dJTiIgXSAmJiBQRVJNSVRfUk9PVF9MT0dJTj1ubworWyAteiAiJFgxMV9GT1JXQVJESU5HIiBdICYmIFgxMV9GT1JXQVJESU5HPW5vCitbIC16ICIkQUlYX1NSQyIgXSAmJiBBSVhfU1JDPW5vCisKK3VtYXNrIDAyMgorCitzdGFydGRpcj1gcHdkYAorCitwZXJsIC12ID4vZGV2L251bGwgfHwgKGVjaG8gcGVybCByZXF1aXJlZDsgZXhpdCAxKQorCisjIFBhdGggdG8gaW52ZW50b3J5LnNoOiBzYW1lIHBsYWNlIGFzIGJ1aWxkYmZmLnNoCitpZiAgZWNobyAkMCB8IGVncmVwICdeLycKK3RoZW4KKwlpbnZlbnRvcnk9YGRpcm5hbWUgJDBgL2ludmVudG9yeS5zaAkJIyBhYnNvbHV0ZSBwYXRoCitlbHNlCisJaW52ZW50b3J5PWBwd2RgL2BkaXJuYW1lICQwYC9pbnZlbnRvcnkuc2gJIyByZWxhdGl2ZSBwYXRoCitmaQorCisjCisjIFdlIHN0aWxsIHN1cHBvcnQgcnVubmluZyBmcm9tIGNvbnRyaWIvYWl4LCBidXQgdGhpcyBpcyBkZXByZWNhdGVkCisjCitpZiBwd2QgfCBlZ3JlcCAnY29udHJpYi9haXgkJwordGhlbgorCWVjaG8gIkNoYW5naW5nIGRpcmVjdG9yeSB0byBgcHdkYC8uLi8uLiIKKwllY2hvICJQbGVhc2UgcnVuIGJ1aWxkYmZmLnNoIGZyb20geW91ciBidWlsZCBkaXJlY3RvcnkgaW4gZnV0dXJlLiIKKwljZCAuLi8uLgorCWNvbnRyaWJhaXg9MQorZmkKKworaWYgWyAhIC1mIE1ha2VmaWxlIF0KK3RoZW4KKwllY2hvICJNYWtlZmlsZSBub3QgZm91bmQgKGRpZCB5b3UgcnVuIGNvbmZpZ3VyZT8pIgorCWV4aXQgMQorZmkKKworIworIyBEaXJlY3RvcmllcyB1c2VkIGR1cmluZyBidWlsZDoKKyMgY3VycmVudCBkaXIgPSAkb2JqZGlyCQlkaXJlY3RvcnkgeW91IHJhbiAuL2NvbmZpZ3VyZSBpbi4KKyMgJG9iamRpci8kUEtHRElSLyAJCWRpcmVjdG9yeSBwYWNrYWdlIGZpbGVzIGFyZSBjb25zdHJ1Y3RlZCBpbgorIyAkb2JqZGlyLyRQS0dESVIvcm9vdC8JCXBhY2thZ2Ugcm9vdCAoJEZBS0VfUk9PVCkKKyMKK29iamRpcj1gcHdkYAorUEtHTkFNRT1vcGVuc3NoCitQS0dESVI9cGFja2FnZQorCisjCisjIENvbGxlY3QgbG9jYWwgY29uZmlndXJhdGlvbiBzZXR0aW5ncyB0byBvdmVycmlkZSBkZWZhdWx0cworIworaWYgWyAtcyAuL2NvbmZpZy5sb2NhbCBdCit0aGVuCisJZWNobyBSZWFkaW5nIGxvY2FsIHNldHRpbmdzIGZyb20gY29uZmlnLmxvY2FsCisJLiAuL2NvbmZpZy5sb2NhbAorZmkKKworIworIyBGaWxsIGluIHNvbWUgZGV0YWlscyBmcm9tIE1ha2VmaWxlLCBsaWtlIHByZWZpeCBhbmQgc3lzY29uZmRpcgorIwl0aGUgZXZhbCBhbHNvIGV4cGFuZHMgdmFyaWFibGVzIGxpa2Ugc3lzY29uZmRpcj0ke3ByZWZpeH0vZXRjCisjCXByb3ZpZGVkIHRoZXkgYXJlIGV2YWwnZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIKKyMKK2ZvciBjb25mdmFyIGluIHByZWZpeCBleGVjX3ByZWZpeCBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFkaXIgbWFuZGlyIG1hbnN1YmRpciBzeXNjb25mZGlyIHBpZGRpciBzcmNkaXIKK2RvCisJZXZhbCAkY29uZnZhcj1gZ3JlcCAiXiRjb25mdmFyPSIgJG9iamRpci9NYWtlZmlsZSB8IGN1dCAtZCA9IC1mIDJgCitkb25lCisKKyMKKyMgQ29sbGVjdCB2YWx1ZXMgb2YgcHJpdnNlcCB1c2VyIGFuZCBwcml2c2VwIHBhdGgKKyMJY3VycmVudGx5IG9ubHkgZm91bmQgaW4gY29uZmlnLmgKKyMKK2ZvciBjb25mdmFyIGluIFNTSF9QUklWU0VQX1VTRVIgUFJJVlNFUF9QQVRICitkbworCWV2YWwgJGNvbmZ2YXI9YGF3ayAnLyNkZWZpbmVbIFx0XSckY29uZnZhcicve3ByaW50ICQzfScgJG9iamRpci9jb25maWcuaGAKK2RvbmUKKworIyBTZXQgcHJpdnNlcCBkZWZhdWx0cyBpZiBub3QgZGVmaW5lZAoraWYgWyAteiAiJFNTSF9QUklWU0VQX1VTRVIiIF0KK3RoZW4KKwlTU0hfUFJJVlNFUF9VU0VSPXNzaGQKK2ZpCitpZiBbIC16ICIkUFJJVlNFUF9QQVRIIiBdCit0aGVuCisJUFJJVlNFUF9QQVRIPS92YXIvZW1wdHkKK2ZpCisKKyMgQ2xlYW4gcGFja2FnZSBidWlsZCBkaXJlY3RvcnkKK3JtIC1yZiAkb2JqZGlyLyRQS0dESVIKK0ZBS0VfUk9PVD0kb2JqZGlyLyRQS0dESVIvcm9vdAorbWtkaXIgLXAgJEZBS0VfUk9PVAorCisjIFN0YXJ0IGJ5IGZha2luZyByb290IGluc3RhbGwKK2VjaG8gIkZha2luZyByb290IGluc3RhbGwuLi4iCitjZCAkb2JqZGlyCittYWtlIGluc3RhbGwtbm9rZXlzIERFU1RESVI9JEZBS0VfUk9PVAorCitpZiBbICQ/IC1ndCAwIF0KK3RoZW4KKwllY2hvICJGYWtlIHJvb3QgaW5zdGFsbCBmYWlsZWQsIHN0b3BwaW5nLiIKKwlleGl0IDEKK2ZpCisKKyMKKyMgQ29weSBpbmZvcm1hdGlvbmFsIGZpbGVzIHRvIGluY2x1ZGUgaW4gcGFja2FnZQorIworY3AgJHNyY2Rpci9MSUNFTkNFICRvYmpkaXIvJFBLR0RJUi8KK2NwICRzcmNkaXIvUkVBRE1FKiAkb2JqZGlyLyRQS0dESVIvCisKKyMKKyMgRXh0cmFjdCBjb21tb24gaW5mbyByZXF1aXJlcyBmb3IgdGhlICdpbmZvJyBwYXJ0IG9mIHRoZSBwYWNrYWdlLgorIwlBSVggcmVxdWlyZXMgNC1wYXJ0IHZlcnNpb24gbnVtYmVycworIworVkVSU0lPTj1gLi9zc2ggLVYgMj4mMSB8IGN1dCAtZiAxIC1kICwgfCBjdXQgLWYgMiAtZCBfYAorTUFKT1I9YGVjaG8gJFZFUlNJT04gfCBjdXQgLWYgMSAtZCBwIHwgY3V0IC1mIDEgLWQgLmAKK01JTk9SPWBlY2hvICRWRVJTSU9OIHwgY3V0IC1mIDEgLWQgcCB8IGN1dCAtZiAyIC1kIC5gCitQQVRDSD1gZWNobyAkVkVSU0lPTiB8IGN1dCAtZiAxIC1kIHAgfCBjdXQgLWYgMyAtZCAuYAorUE9SVEFCTEU9YGVjaG8gJFZFUlNJT04gfCBhd2sgJ0JFR0lOe0ZTPSJwIn17cHJpbnQgJDJ9J2AKK1sgIiRQQVRDSCIgPSAiIiBdICYmIFBBVENIPTAKK1sgIiRQT1JUQUJMRSIgPSAiIiBdICYmIFBPUlRBQkxFPTAKK0JGRlZFUlNJT049YHByaW50ZiAiJWQuJWQuJWQuJWQiICRNQUpPUiAkTUlOT1IgJFBBVENIICRQT1JUQUJMRWAKKworZWNobyAiQnVpbGRpbmcgQkZGIGZvciAkUEtHTkFNRSAkVkVSU0lPTiAocGFja2FnZSB2ZXJzaW9uICRCRkZWRVJTSU9OKSIKKworIworIyBTZXQgc3NoIGFuZCBzc2hkIHBhcmFtZXRlcnMgYXMgcGVyIGNvbmZpZy5sb2NhbAorIworaWYgWyAiJHtQRVJNSVRfUk9PVF9MT0dJTn0iID0gbm8gXQordGhlbgorCXBlcmwgLXAgLWkgLWUgInMvI1Blcm1pdFJvb3RMb2dpbiB5ZXMvUGVybWl0Um9vdExvZ2luIG5vLyIgXAorCQkkRkFLRV9ST09ULyR7c3lzY29uZmRpcn0vc3NoZF9jb25maWcKK2ZpCitpZiBbICIke1gxMV9GT1JXQVJESU5HfSIgPSB5ZXMgXQordGhlbgorCXBlcmwgLXAgLWkgLWUgInMvI1gxMUZvcndhcmRpbmcgbm8vWDExRm9yd2FyZGluZyB5ZXMvIiBcCisJCSRGQUtFX1JPT1QvJHtzeXNjb25mZGlyfS9zc2hkX2NvbmZpZworZmkKKworCisjIFJlbmFtZSBjb25maWcgZmlsZXM7IHBvc3RpbnN0YWxsIHNjcmlwdCB3aWxsIGNvcHkgdGhlbSBpZiBuZWNlc3NhcnkKK2ZvciBjZmdmaWxlIGluIHNzaF9jb25maWcgc3NoZF9jb25maWcKK2RvCisJbXYgJEZBS0VfUk9PVC8kc3lzY29uZmRpci8kY2ZnZmlsZSAkRkFLRV9ST09ULyRzeXNjb25mZGlyLyRjZmdmaWxlLmRlZmF1bHQKK2RvbmUKKworIworIyBHZW5lcmF0ZSBscHAgY29udHJvbCBmaWxlcy4KKyMJd29ya2luZyBkaXIgaXMgJEZBS0VfUk9PVCBidXQgZmlsZXMgYXJlIGdlbmVyYXRlZCBpbiBkaXIgYWJvdmUKKyMJYW5kIG1vdmVkIGludG8gcGxhY2UganVzdCBiZWZvcmUgY3JlYXRpb24gb2YgLmJmZgorIworY2QgJEZBS0VfUk9PVAorZWNobyBHZW5lcmF0aW5nIExQUCBjb250cm9sIGZpbGVzCitmaW5kIC4gISAtbmFtZSAuIC1wcmludCA+Li4vb3BlbnNzaC5hbAorJGludmVudG9yeSA+Li4vb3BlbnNzaC5pbnZlbnRvcnkKKworY2F0IDw8RU9EID4uLi9vcGVuc3NoLmNvcHlyaWdodAorVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciBhIEJTRC1zdHlsZSBsaWNlbnNlLgorRm9yIHRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UsIHNlZSAvdXNyL2xwcC9vcGVuc3NoL0xJQ0VOQ0UKK0VPRAorCisjCisjIG9wZW5zc2guc2l6ZSBmaWxlIGFsbG93cyBmaWxlc3lzdGVtIGV4cGFuc2lvbiBhcyByZXF1aXJlZAorIyBnZW5lcmF0ZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgZmlsZXMKKyMgdGhlbiBjYWxjdWxhdGUgZGlzayB1c2FnZSBmb3IgZWFjaCBkaXJlY3RvcnkgYW5kIHN0b3JlIGluIG9wZW5zc2guc2l6ZQorIworZmlsZXM9YGZpbmQgLiAtdHlwZSBmIC1wcmludGAKK2RpcnM9YGZvciBmaWxlIGluICRmaWxlczsgZG8gZGlybmFtZSAkZmlsZTsgZG9uZSB8IHNvcnQgLXVgCitmb3IgZGlyIGluICRkaXJzCitkbworCWR1ICRkaXIKK2RvbmUgPiAuLi9vcGVuc3NoLnNpemUKKworIworIyBDcmVhdGUgcG9zdGluc3RhbGwgc2NyaXB0CisjCitjYXQgPDxFT0YgPj4uLi9vcGVuc3NoLnBvc3RfaQorIyEvYmluL3NoCisKK2VjaG8gQ3JlYXRpbmcgY29uZmlncyBmcm9tIGRlZmF1bHRzIGlmIG5lY2Vzc2FyeS4KK2ZvciBjZmdmaWxlIGluIHNzaF9jb25maWcgc3NoZF9jb25maWcKK2RvCisJaWYgWyAhIC1mICRzeXNjb25mZGlyL1wkY2ZnZmlsZSBdCisJdGhlbgorCQllY2hvICJDcmVhdGluZyBcJGNmZ2ZpbGUgZnJvbSBkZWZhdWx0IgorCQljcCAkc3lzY29uZmRpci9cJGNmZ2ZpbGUuZGVmYXVsdCAkc3lzY29uZmRpci9cJGNmZ2ZpbGUKKwllbHNlCisJCWVjaG8gIlwkY2ZnZmlsZSBhbHJlYWR5IGV4aXN0cy4iCisJZmkKK2RvbmUKK2VjaG8KKworIyBDcmVhdGUgUHJpdmlsZWdlU2VwYXJhdGlvbiB1c2VyIGFuZCBncm91cCBpZiBub3QgcHJlc2VudAorZWNobyBDaGVja2luZyBmb3IgUHJpdmlsZWdlU2VwYXJhdGlvbiB1c2VyIGFuZCBncm91cC4KK2lmIGN1dCAtZjEgLWQ6IC9ldGMvZ3JvdXAgfCBlZ3JlcCAnXickU1NIX1BSSVZTRVBfVVNFUidcJCcgPi9kZXYvbnVsbAordGhlbgorCWVjaG8gIlByaXZTZXAgZ3JvdXAgJFNTSF9QUklWU0VQX1VTRVIgYWxyZWFkeSBleGlzdHMuIgorZWxzZQorCWVjaG8gIkNyZWF0aW5nIFByaXZTZXAgZ3JvdXAgJFNTSF9QUklWU0VQX1VTRVIuIgorCW1rZ3JvdXAgLUEgJFNTSF9QUklWU0VQX1VTRVIKK2ZpCisKKyMgQ3JlYXRlIHVzZXIgaWYgcmVxdWlyZWQKK2lmIGxzdXNlciAiJFNTSF9QUklWU0VQX1VTRVIiID4vZGV2L251bGwKK3RoZW4KKwllY2hvICJQcml2U2VwIHVzZXIgJFNTSF9QUklWU0VQX1VTRVIgYWxyZWFkeSBleGlzdHMuIgorZWxzZQorCWVjaG8gIkNyZWF0aW5nIFByaXZTZXAgdXNlciAkU1NIX1BSSVZTRVBfVVNFUi4iCisJbWt1c2VyIGdlY29zPSdTU0hEIFByaXZTZXAgVXNlcicgbG9naW49ZmFsc2UgcmxvZ2luPWZhbHNlIGFjY291bnRfbG9ja2VkPXRydWUgcGdycD0kU1NIX1BSSVZTRVBfVVNFUiAkU1NIX1BSSVZTRVBfVVNFUgorZmkKKworaWYgZWdyZXAgJ15bIFx0XSpVc2VQcml2aWxlZ2VTZXBhcmF0aW9uWyBcdF0rbm8nICRzeXNjb25mZGlyL3NzaGRfY29uZmlnID4vZGV2L251bGwKK3RoZW4KKwllY2hvIFVzZVByaXZpbGVnZVNlcGFyYXRpb24gbm90IGVuYWJsZWQsIHByaXZzZXAgZGlyZWN0b3J5IG5vdCByZXF1aXJlZC4KK2Vsc2UKKwkjIGNyZWF0ZSBjaHJvb3QgZGlyZWN0b3J5IGlmIHJlcXVpcmVkCisJaWYgWyAtZCAkUFJJVlNFUF9QQVRIIF0KKwl0aGVuCisJCWVjaG8gIlByaXZTZXAgY2hyb290IGRpcmVjdG9yeSAkUFJJVlNFUF9QQVRIIGFscmVhZHkgZXhpc3RzLiIKKwllbHNlCisJCWVjaG8gIkNyZWF0aW5nIFByaXZTZXAgY2hyb290IGRpcmVjdG9yeSAkUFJJVlNFUF9QQVRILiIKKwkJbWtkaXIgJFBSSVZTRVBfUEFUSAorCQljaG93biAwICRQUklWU0VQX1BBVEgKKwkJY2hncnAgMCAkUFJJVlNFUF9QQVRICisJCWNobW9kIDc1NSAkUFJJVlNFUF9QQVRICisJZmkKK2ZpCitlY2hvCisKKyMgR2VuZXJhdGUga2V5cyB1bmxlc3MgdGhleSBhbHJlYWR5IGV4aXN0CitlY2hvIENyZWF0aW5nIGhvc3Qga2V5cyBpZiByZXF1aXJlZC4KK2lmIFsgLWYgIiRzeXNjb25mZGlyL3NzaF9ob3N0X2tleSIgXSA7IHRoZW4KKwllY2hvICIkc3lzY29uZmRpci9zc2hfaG9zdF9rZXkgYWxyZWFkeSBleGlzdHMsIHNraXBwaW5nLiIKK2Vsc2UKKwkkYmluZGlyL3NzaC1rZXlnZW4gLXQgcnNhMSAtZiAkc3lzY29uZmRpci9zc2hfaG9zdF9rZXkgLU4gIiIKK2ZpCitpZiBbIC1mICRzeXNjb25mZGlyL3NzaF9ob3N0X2RzYV9rZXkgXSA7IHRoZW4KKwllY2hvICIkc3lzY29uZmRpci9zc2hfaG9zdF9kc2Ffa2V5IGFscmVhZHkgZXhpc3RzLCBza2lwcGluZy4iCitlbHNlCisJJGJpbmRpci9zc2gta2V5Z2VuIC10IGRzYSAtZiAkc3lzY29uZmRpci9zc2hfaG9zdF9kc2Ffa2V5IC1OICIiCitmaQoraWYgWyAtZiAkc3lzY29uZmRpci9zc2hfaG9zdF9yc2Ffa2V5IF0gOyB0aGVuCisJZWNobyAiJHN5c2NvbmZkaXIvc3NoX2hvc3RfcnNhX2tleSBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcuIgorZWxzZQorCSRiaW5kaXIvc3NoLWtleWdlbiAtdCByc2EgLWYgJHN5c2NvbmZkaXIvc3NoX2hvc3RfcnNhX2tleSAtTiAiIgorZmkKK2VjaG8KKworIyBTZXQgc3RhcnR1cCBjb21tYW5kIGRlcGVuZGluZyBvbiBTUkMgc3VwcG9ydAoraWYgWyAiJEFJWF9TUkMiID0gInllcyIgXQordGhlbgorCWVjaG8gQ3JlYXRpbmcgU1JDIHNzaGQgc3Vic3lzdGVtLgorCXJtc3N5cyAtcyBzc2hkIDI+JjEgPi9kZXYvbnVsbAorCW1rc3N5cyAtcyBzc2hkIC1wICIkc2JpbmRpci9zc2hkIiAtYSAnLUQnIC11IDAgLVMgLW4gMTUgLWYgOSAtUiAtRyB0Y3BpcAorCXN0YXJ0dXBjbWQ9InN0YXJ0ICRzYmluZGlyL3NzaGQgXFxcIlxcXCRzcmNfcnVubmluZ1xcXCIiCisJb2xkc3RhcnRjbWQ9IiRzYmluZGlyL3NzaGQiCitlbHNlCisJc3RhcnR1cGNtZD0iJHNiaW5kaXIvc3NoZCIKKwlvbGRzdGFydGNtZD0ic3RhcnQgJHNiaW5kaXIvc3NoZCBcXFwiJHNyY19ydW5uaW5nXFxcIiIKK2ZpCisKKyMgSWYgbWlncmF0aW5nIHRvIG9yIGZyb20gU1JDLCBjaGFuZ2UgcHJldmlvdXMgc3RhcnR1cCBjb21tYW5kCisjIG90aGVyd2lzZSBhZGQgdG8gcmMudGNwaXAKK2lmIGVncmVwICJeXCRvbGRzdGFydGNtZCIgL2V0Yy9yYy50Y3BpcCA+L2Rldi9udWxsCit0aGVuCisJaWYgc2VkICJzfF5cJG9sZHN0YXJ0Y21kfFwkc3RhcnR1cGNtZHxnIiAvZXRjL3JjLnRjcGlwID4vZXRjL3JjLnRjcGlwLm5ldworCXRoZW4KKwkJY2htb2QgMDc1NSAvZXRjL3JjLnRjcGlwLm5ldworCQltdiAvZXRjL3JjLnRjcGlwIC9ldGMvcmMudGNwaXAub2xkICYmIFwKKwkJbXYgL2V0Yy9yYy50Y3BpcC5uZXcgL2V0Yy9yYy50Y3BpcAorCWVsc2UKKwkJZWNobyAiVXBkYXRpbmcgL2V0Yy9yYy50Y3BpcCBmYWlsZWQsIHBsZWFzZSBjaGVjay4iCisJZmkKK2Vsc2UKKwkjIEFkZCB0byBzeXN0ZW0gc3RhcnR1cCBpZiByZXF1aXJlZAorCWlmIGdyZXAgIl5cJHN0YXJ0dXBjbWQiIC9ldGMvcmMudGNwaXAgPi9kZXYvbnVsbAorCXRoZW4KKwkJZWNobyAic3NoZCBmb3VuZCBpbiByYy50Y3BpcCwgbm90IGFkZGluZy4iCisJZWxzZQorCQllY2hvICJBZGRpbmcgc3NoZCB0byByYy50Y3BpcCIKKwkJZWNobyA+Pi9ldGMvcmMudGNwaXAKKwkJZWNobyAiIyBTdGFydCBzc2hkIiA+Pi9ldGMvcmMudGNwaXAKKwkJZWNobyAiXCRzdGFydHVwY21kIiA+Pi9ldGMvcmMudGNwaXAKKwlmaQorZmkKK0VPRgorCisjCisjIENyZWF0ZSBsaWJscHAuYSBhbmQgbW92ZSBjb250cm9sIGZpbGVzIGludG8gaXQKKyMKK2VjaG8gQ3JlYXRpbmcgbGlibHBwLmEKKygKKwljZCAuLgorCWZvciBpIGluIG9wZW5zc2guYWwgb3BlbnNzaC5jb3B5cmlnaHQgb3BlbnNzaC5pbnZlbnRvcnkgb3BlbnNzaC5wb3N0X2kgb3BlbnNzaC5zaXplIExJQ0VOQ0UgUkVBRE1FKgorCWRvCisJCWFyIC1yIGxpYmxwcC5hICRpCisJCXJtICRpCisJZG9uZQorKQorCisjCisjIENyZWF0ZSBscHBfbmFtZQorIworIyBUaGlzIHdpbGwgZW5kIHVwIGxvb2tpbmcgc29tZXRoaW5nIGxpa2U6CisjIDQgUiBJIE9wZW5TU0ggeworIyBPcGVuU1NIIDMuMC4yLjEgMSBOIFUgZW5fVVMgT3BlblNTSCAzLjAuMnAxIFBvcnRhYmxlIGZvciBBSVgKKyMgWworIyAlCisjIC91c3IvbG9jYWwvYmluIDgwNzMKKyMgL3Vzci9sb2NhbC9ldGMgMTg5CisjIC91c3IvbG9jYWwvbGliZXhlYyAxODUKKyMgL3Vzci9sb2NhbC9tYW4vbWFuMSAxNDUKKyMgL3Vzci9sb2NhbC9tYW4vbWFuOCA4MworIyAvdXNyL2xvY2FsL3NiaW4gMjEwNQorIyAvdXNyL2xvY2FsL3NoYXJlIDMKKyMgJQorIyBdCisjIH0KKworZWNobyBDcmVhdGluZyBscHBfbmFtZQorY2F0IDw8RU9GID4uLi9scHBfbmFtZQorNCBSIEkgJFBLR05BTUUgeworJFBLR05BTUUgJEJGRlZFUlNJT04gMSBOIFUgZW5fVVMgT3BlblNTSCAkVkVSU0lPTiBQb3J0YWJsZSBmb3IgQUlYCitbCislCitFT0YKKworZm9yIGkgaW4gJGJpbmRpciAkc3lzY29uZmRpciAkbGliZXhlY2RpciAkbWFuZGlyLyR7bWFuc3ViZGlyfTEgJG1hbmRpci8ke21hbnN1YmRpcn04ICRzYmluZGlyICRkYXRhZGlyIC91c3IvbHBwL29wZW5zc2gKK2RvCisJIyBnZXQgc2l6ZSBpbiA1MTIgYnl0ZSBibG9ja3MKKwlpZiBbIC1kICRGQUtFX1JPT1QvJGkgXQorCXRoZW4KKwkJc2l6ZT1gZHUgJEZBS0VfUk9PVC8kaSB8IGF3ayAne3ByaW50ICQxfSdgCisJCWVjaG8gIiRpICRzaXplIiA+Pi4uL2xwcF9uYW1lCisJZmkKK2RvbmUKKworZWNobyAnJScgPj4uLi9scHBfbmFtZQorZWNobyAnXScgPj4uLi9scHBfbmFtZQorZWNobyAnfScgPj4uLi9scHBfbmFtZQorCisjCisjIE1vdmUgcGllY2VzIGludG8gcGxhY2UKKyMKK21rZGlyIC1wIHVzci9scHAvb3BlbnNzaAorbXYgLi4vbGlibHBwLmEgdXNyL2xwcC9vcGVuc3NoCittdiAuLi9scHBfbmFtZSAuCisKKyMKKyMgTm93IGludm9rZSBiYWNrdXAgdG8gY3JlYXRlIC5iZmYgZmlsZQorIwlub3RlOiBscHBfbmFtZSBuZWVkcyB0byBiZSB0aGUgZmlyc3QgZmlsZSBzbyB3ZSBnZW5lcmF0ZSB0aGUKKyMJZmlsZSBsaXN0IG9uIHRoZSBmbHkgYW5kIGZlZWQgaXQgdG8gYmFja3VwIHVzaW5nIC1pCisjCitlY2hvIENyZWF0aW5nICRQS0dOQU1FLSRWRVJTSU9OLmJmZiB3aXRoIGJhY2t1cC4uLgorcm0gLWYgJFBLR05BTUUtJFZFUlNJT04uYmZmCisoCisJZWNobyAiLi9scHBfbmFtZSIKKwlmaW5kIC4gISAtbmFtZSBscHBfbmFtZSAtYSAhIC1uYW1lIC4gLXByaW50CispIHwgYmFja3VwICAtaSAtcSAtZiAuLi8kUEtHTkFNRS0kVkVSU0lPTi5iZmYgJGZpbGVsaXN0CisKKyMKKyMgTW92ZSBwYWNrYWdlIGludG8gZmluYWwgbG9jYXRpb24gYW5kIGNsZWFuIHVwCisjCittdiAuLi8kUEtHTkFNRS0kVkVSU0lPTi5iZmYgJHN0YXJ0ZGlyCitjZCAkc3RhcnRkaXIKK3JtIC1yZiAkb2JqZGlyLyRQS0dESVIKKworZWNobyAkMDogZG9uZS4KKwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jb250cmliL2FpeC9pbnZlbnRvcnkuc2ggYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvYWl4L2ludmVudG9yeS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMjY0MWU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9jb250cmliL2FpeC9pbnZlbnRvcnkuc2gKQEAgLTAsMCArMSw2MyBAQAorIyEvYmluL3NoCisjCisjIGludmVudG9yeS5zaAorIyAkSWQ6IGludmVudG9yeS5zaCx2IDEuNiAyMDAzLzExLzIxIDEyOjQ4OjU2IGRqbSBFeHAgJAorIworIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQmVuIExpbmRzdHJvbSwgbW9kaWZpZWQgYnkgRGFycmVuIFR1Y2tlciB0byB1c2UgcGVybAorIyBUaGlzIGZpbGUgaXMgcGxhY2VkIGludG8gdGhlIHB1YmxpYyBkb21haW4uCisjCisjIFRoaXMgd2lsbCBwcm9kdWNlIGFuIEFJWCBwYWNrYWdlIGludmVudG9yeSBmaWxlLCB3aGljaCBsb29rcyBsaWtlOgorIworIyAvdXNyL2xvY2FsL2JpbjoKKyMgICAgICAgICAgY2xhc3M9YXBwbHksaW52ZW50b3J5LG9wZW5zc2gKKyMgICAgICAgICAgb3duZXI9cm9vdAorIyAgICAgICAgICBncm91cD1zeXN0ZW0KKyMgICAgICAgICAgbW9kZT03NTUKKyMgICAgICAgICAgdHlwZT1ESVJFQ1RPUlkKKyMgL3Vzci9sb2NhbC9iaW4vc2xvZ2luOgorIyAgICAgICAgICBjbGFzcz1hcHBseSxpbnZlbnRvcnksb3BlbnNzaAorIyAgICAgICAgICBvd25lcj1yb290CisjICAgICAgICAgIGdyb3VwPXN5c3RlbQorIyAgICAgICAgICBtb2RlPTc3NworIyAgICAgICAgICB0eXBlPVNZTUxJTksKKyMgICAgICAgICAgdGFyZ2V0PXNzaAorIyAvdXNyL2xvY2FsL3NoYXJlL1NzaC5iaW46CisjICAgICAgICAgIGNsYXNzPWFwcGx5LGludmVudG9yeSxvcGVuc3NoCisjICAgICAgICAgIG93bmVyPXJvb3QKKyMgICAgICAgICAgZ3JvdXA9c3lzdGVtCisjICAgICAgICAgIG1vZGU9NjQ0CisjICAgICAgICAgIHR5cGU9RklMRQorIyAgICAgICAgICBzaXplPVZPTEFUSUxFCisjICAgICAgICAgIGNoZWNrc3VtPVZPTEFUSUxFCisKK2ZpbmQgLiAhIC1uYW1lIC4gLXByaW50IHwgcGVybCAtbmUgJ3sKKwljaG9tcDsKKwlpZiAoIC1sICRfICkgeworCQkoJGRldiwkaW5vLCRtb2QsJG5sLCR1aWQsJGdpZCwkcmRldiwkc3osJGF0LCRtdCwkY3QsJGJzeiwkYmxrKT1sc3RhdDsKKwl9IGVsc2UgeworCQkoJGRldiwkaW5vLCRtb2QsJG5sLCR1aWQsJGdpZCwkcmRldiwkc3osJGF0LCRtdCwkY3QsJGJzeiwkYmxrKT1zdGF0OworCX0KKworCSMgU3RhcnQgdG8gZGlzcGxheSBpbnZlbnRvcnkgaW5mb3JtYXRpb24KKwkkbmFtZSA9ICRfOworCSRuYW1lID1+IHN8Xi58fDsJIyBTdHJpcCBsZWFkaW5nIGRvdCBmcm9tIHBhdGgKKwlwcmludCAiJG5hbWU6XG4iOworCXByaW50ICJcdGNsYXNzPWFwcGx5LGludmVudG9yeSxvcGVuc3NoXG4iOworCXByaW50ICJcdG93bmVyPXJvb3RcbiI7CisJcHJpbnQgIlx0Z3JvdXA9c3lzdGVtXG4iOworCXByaW50ZiAiXHRtb2RlPSVsb1xuIiwgJG1vZCAmIDA3Nzc3OwkjIE1hc2sgcGVybSBiaXRzCisJCisJaWYgKCAtbCAkXyApIHsKKwkJIyBFbnRyeSBpcyBTeW1MaW5rCisJCXByaW50ICJcdHR5cGU9U1lNTElOS1xuIjsKKwkJcHJpbnRmICJcdHRhcmdldD0lc1xuIiwgcmVhZGxpbmsoJF8pOworCX0gZWxzaWYgKCAtZiAkXyApIHsKKwkJIyBFbnRyeSBpcyBGaWxlCisJCXByaW50ICJcdHR5cGU9RklMRVxuIjsKKwkJcHJpbnQgIlx0c2l6ZT0kc3pcbiI7CisJCXByaW50ICJcdGNoZWNrc3VtPVZPTEFUSUxFXG4iOworCX0gZWxzaWYgKCAtZCAkXyApIHsKKwkJIyBFbnRyeSBpcyBEaXJlY3RvcnkKKwkJcHJpbnQgIlx0dHlwZT1ESVJFQ1RPUllcbiI7CisJfQorfScKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvY29udHJpYi9haXgvcGFtLmNvbmYgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvYWl4L3BhbS5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNTI4YjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvYWl4L3BhbS5jb25mCkBAIC0wLDAgKzEsMjAgQEAKKyMKKyMgUEFNIGNvbmZpZ3VyYXRpb24gZmlsZSAvZXRjL3BhbS5jb25mCisjIEV4YW1wbGUgZm9yIE9wZW5TU0ggb24gQUlYIDUuMgorIworCisjIEF1dGhlbnRpY2F0aW9uIE1hbmFnZW1lbnQKK3NzaGQgICAgYXV0aCAgICAgICAgICAgIHJlcXVpcmVkICAgICAgICAvdXNyL2xpYi9zZWN1cml0eS9wYW1fYWl4CitPVEhFUiAgIGF1dGggICAgICAgICAgICByZXF1aXJlZCAgICAgICAgL3Vzci9saWIvc2VjdXJpdHkvcGFtX2FpeAorCisjIEFjY291bnQgTWFuYWdlbWVudAorc3NoZCAgICBhY2NvdW50ICAgICAgICAgcmVxdWlyZWQgICAgICAgIC91c3IvbGliL3NlY3VyaXR5L3BhbV9haXgKK09USEVSICAgYWNjb3VudCAgICAgICAgIHJlcXVpcmVkICAgICAgICAvdXNyL2xpYi9zZWN1cml0eS9wYW1fYWl4CisKKyMgUGFzc3dvcmQgTWFuYWdlbWVudAorc3NoZCAgICBwYXNzd29yZCAgICAgICAgcmVxdWlyZWQgICAgICAgIC91c3IvbGliL3NlY3VyaXR5L3BhbV9haXgKK09USEVSICAgcGFzc3dvcmQgICAgICAgIHJlcXVpcmVkICAgICAgICAvdXNyL2xpYi9zZWN1cml0eS9wYW1fYWl4CisKKyMgU2Vzc2lvbiBNYW5hZ2VtZW50Citzc2hkICAgIHNlc3Npb24gICAgICAgICByZXF1aXJlZCAgICAgICAgL3Vzci9saWIvc2VjdXJpdHkvcGFtX2FpeAorT1RIRVIgICBzZXNzaW9uICAgICAgICAgcmVxdWlyZWQgICAgICAgIC91c3IvbGliL3NlY3VyaXR5L3BhbV9haXgKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvY29udHJpYi9jYWxkZXJhL29wZW5zc2guc3BlYyBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9jYWxkZXJhL29wZW5zc2guc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGJlNTdkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9jb250cmliL2NhbGRlcmEvb3BlbnNzaC5zcGVjCkBAIC0wLDAgKzEsMzY2IEBACisKKyMgU29tZSBvZiB0aGlzIHdpbGwgbmVlZCByZS1ldmFsdWF0aW9uIHBvc3QtTFNCLiAgVGhlIFNWSWRpciBpcyB0aGVyZQorIyBiZWNhdXNlIHRoZSBsaW5rIGFwcGVhcmVkIGJyb2tlbi4gIFRoZSByZXN0IGlzIGZvciBlYXN5IGNvbXBpbGF0aW9uLAorIyB0aGUgdHJhZGVvZmYgb3BlbiB0byBkaXNjdXNzaW9uLiAgKExDOTU3KQorCislZGVmaW5lCVNWSWRpcgkJL2V0Yy9yYy5kL2luaXQuZAorJXshP19kZWZhdWx0ZG9jZGlyOiVkZWZpbmUJX2RlZmF1bHRkb2NkaXIJJXtfcHJlZml4fS9zaGFyZS9kb2MvcGFja2FnZXN9CisleyE/U1ZJY2RpcjolZGVmaW5lCQlTVkljZGlyCQkvZXRjL3N5c2NvbmZpZy9kYWVtb25zfQorCislZGVmaW5lIF9tYW5kaXIJCSV7X3ByZWZpeH0vc2hhcmUvbWFuL2VuCislZGVmaW5lIF9zeXNjb25mZGlyCS9ldGMvc3NoCislZGVmaW5lCV9saWJleGVjZGlyCSV7X2xpYmRpcn0vc3NoCisKKyMgRG8gd2Ugd2FudCB0byBkaXNhYmxlIHJvb3RfbG9naW4/ICgxPXllcyAwPW5vKQorJWRlZmluZSBub19yb290X2xvZ2luIDAKKworI29sZCBjdnMgc3R1ZmYuICBwbGVhc2UgdXBkYXRlIGJlZm9yZSB1c2UuICBtYXkgYmUgZGVwcmVjYXRlZC4KKyVkZWZpbmUgdXNlX3N0YWJsZQkxCislZGVmaW5lIHZlcnNpb24gCTYuMHAxCislaWYgJXt1c2Vfc3RhYmxlfQorICAlZGVmaW5lIGN2cwkJJXtuaWx9CisgICVkZWZpbmUgcmVsZWFzZSAJMQorJWVsc2UKKyAgJWRlZmluZSBjdnMJCWN2czIwMDUwMzE1CisgICVkZWZpbmUgcmVsZWFzZSAJMHIxCislZW5kaWYKKyVkZWZpbmUgeHNhCQl4MTEtc3NoLWFza3Bhc3MJCQorJWRlZmluZSBhc2twYXNzCQkle3hzYX0tMS4yLjQuMQorCisjIE9wZW5TU0ggcHJpdmlsZWdlIHNlcGFyYXRpb24gcmVxdWlyZXMgYSB1c2VyICYgZ3JvdXAgSUQKKyVkZWZpbmUgc3NoZF91aWQgICAgNjcKKyVkZWZpbmUgc3NoZF9naWQgICAgNjcKKworTmFtZSAgICAgICAgCTogb3BlbnNzaAorVmVyc2lvbiAgICAgCTogJXt2ZXJzaW9ufSV7Y3ZzfQorUmVsZWFzZSAgICAgCTogJXtyZWxlYXNlfQorR3JvdXAgICAgICAgCTogU3lzdGVtL05ldHdvcmsKKworU3VtbWFyeSAgICAgCTogT3BlblNTSCBmcmVlIFNlY3VyZSBTaGVsbCAoU1NIKSBpbXBsZW1lbnRhdGlvbi4KK1N1bW1hcnkoZGUpIAk6IE9wZW5TU0ggLSBmcmVpZSBJbXBsZW1lbnRhdGlvbiBkZXIgU2VjdXJlIFNoZWxsIChTU0gpLgorU3VtbWFyeShlcykgCTogT3BlblNTSCBpbXBsZW1lbnRhY2nzbiBsaWJyZSBkZSBTZWN1cmUgU2hlbGwgKFNTSCkuCitTdW1tYXJ5KGZyKSAJOiBJbXBs6W1lbnRhdGlvbiBsaWJyZSBkdSBzaGVsbCBz6WN1cmlz6SBPcGVuU1NIIChTU0gpLgorU3VtbWFyeShpdCkgCTogSW1wbGVtZW50YXppb25lIGdyYXR1aXRhIE9wZW5TU0ggZGVsbGEgU2VjdXJlIFNoZWxsLgorU3VtbWFyeShwdCkgCTogSW1wbGVtZW50YefjbyBsaXZyZSBPcGVuU1NIIGRvIHByb3RvY29sbyAnU2VjdXJlIFNoZWxsJyAoU1NIKS4KK1N1bW1hcnkocHRfQlIpIAk6IEltcGxlbWVudGHn428gbGl2cmUgT3BlblNTSCBkbyBwcm90b2NvbG8gU2VjdXJlIFNoZWxsIChTU0gpLgorCitDb3B5cmlnaHQgICAJOiBCU0QKK1BhY2thZ2VyICAgIAk6IFJheW11bmQgV2lsbCA8cmF5QGNhbGRlcmEuZGU+CitVUkwgICAgICAgICAJOiBodHRwOi8vd3d3Lm9wZW5zc2guY29tLworCitPYnNvbGV0ZXMgICAJOiBzc2gsIHNzaC1jbGllbnRzLCBvcGVuc3NoLWNsaWVudHMKKworQnVpbGRSb290ICAgCTogL3RtcC8le25hbWV9LSV7dmVyc2lvbn0KK0J1aWxkUmVxdWlyZXMJOiBYRnJlZTg2LWltYWtlCisKKyMgJXt1c2Vfc3RhYmxlfT09MToJZnRwOi8vZnRwLm9wZW5ic2Qub3JnL3B1Yi9PcGVuQlNEL09wZW5TU0gvcG9ydGFibGUKKyMgJXt1c2Vfc3RhYmxlfT09MDoJOnBzZXJ2ZXI6Y3ZzQGJhc3MuZGlyZWN0aGl0LmNvbTovY3ZzL29wZW5zc2hfY3ZzCitTb3VyY2UwOiBzZWUtYWJvdmU6Ly4uLi9vcGVuc3NoLSV7dmVyc2lvbn0udGFyLmd6CislaWYgJXt1c2Vfc3RhYmxlfQorU291cmNlMTogc2VlLWFib3ZlOi8uLi4vb3BlbnNzaC0le3ZlcnNpb259LnRhci5nei5hc2MKKyVlbmRpZgorU291cmNlMjogaHR0cDovL3d3dy5qbWtub2JsZS5uZXQvc29mdHdhcmUvJXt4c2F9LyV7YXNrcGFzc30udGFyLmd6CitTb3VyY2UzOiBodHRwOi8vd3d3Lm9wZW5zc2guY29tL2ZhcS5odG1sCisKKyVQYWNrYWdlIHNlcnZlcgorR3JvdXAgICAgICAgCTogU3lzdGVtL05ldHdvcmsKK1JlcXVpcmVzICAgIAk6IG9wZW5zc2ggPSAle3ZlcnNpb259CitPYnNvbGV0ZXMgICAJOiBzc2gtc2VydmVyCisKK1N1bW1hcnkgICAgIAk6IE9wZW5TU0ggU2VjdXJlIFNoZWxsIHByb3RvY29sIHNlcnZlciAoc3NoZCkuCitTdW1tYXJ5KGRlKSAJOiBPcGVuU1NIIFNlY3VyZSBTaGVsbCBQcm90b2NvbC1TZXJ2ZXIgKHNzaGQpLgorU3VtbWFyeShlcykgCTogU2Vydmlkb3IgZGVsIHByb3RvY29sbyBPcGVuU1NIIFNlY3VyZSBTaGVsbCAoc3NoZCkuCitTdW1tYXJ5KGZyKSAJOiBTZXJ2ZXVyIGRlIHByb3RvY29sZSBkdSBzaGVsbCBz6WN1cmlz6SBPcGVuU1NIIChzc2hkKS4KK1N1bW1hcnkoaXQpIAk6IFNlcnZlciBPcGVuU1NIIHBlciBpbCBwcm90b2NvbGxvIFNlY3VyZSBTaGVsbCAoc3NoZCkuCitTdW1tYXJ5KHB0KSAJOiBTZXJ2aWRvciBkbyBwcm90b2NvbG8gJ1NlY3VyZSBTaGVsbCcgT3BlblNTSCAoc3NoZCkuCitTdW1tYXJ5KHB0X0JSKSAJOiBTZXJ2aWRvciBkbyBwcm90b2NvbG8gU2VjdXJlIFNoZWxsIE9wZW5TU0ggKHNzaGQpLgorCisKKyVQYWNrYWdlIGFza3Bhc3MKK0dyb3VwICAgICAgIAk6IFN5c3RlbS9OZXR3b3JrCitSZXF1aXJlcyAgICAJOiBvcGVuc3NoID0gJXt2ZXJzaW9ufQorVVJMICAgICAgIAk6IGh0dHA6Ly93d3cuam1rbm9ibGUubmV0L3NvZnR3YXJlL3gxMS1zc2gtYXNrcGFzcy8KK09ic29sZXRlcyAgIAk6IHNzaC1leHRyYXMKKworU3VtbWFyeSAgICAgCTogT3BlblNTSCBYMTEgcGFzcy1waHJhc2UgZGlhbG9nLgorU3VtbWFyeShkZSkgCTogT3BlblNTSCBYMTEgUGFzc3dvcnQtRGlhbG9nLgorU3VtbWFyeShlcykgCTogQXBsaWNhY2nzbiBkZSBwZXRpY2nzbiBkZSBmcmFzZSBjbGF2ZSBPcGVuU1NIIFgxMS4KK1N1bW1hcnkoZnIpIAk6IERpYWxvZ3VlIHBhc3MtcGhyYXNlIFgxMSBkJ09wZW5TU0guCitTdW1tYXJ5KGl0KSAJOiBGaW5lc3RyYSBkaSBkaWFsb2dvIFgxMSBwZXIgbGEgZnJhc2Ugc2VncmV0YSBkaSBPcGVuU1NILgorU3VtbWFyeShwdCkgCTogRGnhbG9nbyBkZSBwZWRpZG8gZGUgc2VuaGEgcGFyYSBYMTEgZG8gT3BlblNTSC4KK1N1bW1hcnkocHRfQlIpIAk6IERp4WxvZ28gZGUgcGVkaWRvIGRlIHNlbmhhIHBhcmEgWDExIGRvIE9wZW5TU0guCisKKworJURlc2NyaXB0aW9uCitPcGVuU1NIIChTZWN1cmUgU2hlbGwpIHByb3ZpZGVzIGFjY2VzcyB0byBhIHJlbW90ZSBzeXN0ZW0uIEl0IHJlcGxhY2VzCit0ZWxuZXQsIHJsb2dpbiwgIHJleGVjLCBhbmQgcnNoLCBhbmQgcHJvdmlkZXMgc2VjdXJlIGVuY3J5cHRlZCAKK2NvbW11bmljYXRpb25zIGJldHdlZW4gdHdvIHVudHJ1c3RlZCBob3N0cyBvdmVyIGFuIGluc2VjdXJlIG5ldHdvcmsuICAKK1gxMSBjb25uZWN0aW9ucyBhbmQgYXJiaXRyYXJ5IFRDUC9JUCBwb3J0cyBjYW4gYWxzbyBiZSBmb3J3YXJkZWQgb3ZlciAKK3RoZSBzZWN1cmUgY2hhbm5lbC4KKworJURlc2NyaXB0aW9uIC1sIGRlCitPcGVuU1NIIChTZWN1cmUgU2hlbGwpIHN0ZWxsdCBkZW4gWnVnYW5nIHp1IGFuZGVyZW4gUmVjaG5lcm4gaGVyLiBFcyBlcnNldHp0Cit0ZWxuZXQsIHJsb2dpbiwgcmV4ZWMgdW5kIHJzaCB1bmQgc3RlbGx0IGVpbmUgc2ljaGVyZSwgdmVyc2NobPxzc2VsdGUKK1ZlcmJpbmR1bmcgendpc2NoZW4gendlaSBuaWNodCB2ZXJ0cmF1ZW5zd/xyZGlnZW4gSG9zdHMg/GJlciBlaW5lIHVuc2ljaGVyZXMKK05ldHp3ZXJrIGhlci4gWDExIFZlcmJpbmR1bmdlbiB1bmQgYmVsaWViaWdlIGFuZGVyZSBUQ1AvSVAgUG9ydHMga/ZubmVuIGViZW5zbwor/GJlciBkZW4gc2ljaGVyZW4gQ2hhbm5lbCB3ZWl0ZXJnZWxlaXRldCB3ZXJkZW4uCisKKyVEZXNjcmlwdGlvbiAtbCBlcworT3BlblNTSCAoU2VjdXJlIFNoZWxsKSBwcm9wb3JjaW9uYSBhY2Nlc28gYSBzaXN0ZW1hcyByZW1vdG9zLiBSZWVtcGxhemEgYQordGVsbmV0LCBybG9naW4sIHJleGVjLCB5IHJzaCwgeSBwcm9wb3JjaW9uYSBjb211bmljYWNpb25lcyBzZWd1cmFzIGVuY3JpcHRhZGFzCitlbnRyZSBkb3MgZXF1aXBvcyBlbnRyZSBsb3MgcXVlIG5vIHNlIGhhIGVzdGFibGVjaWRvIGNvbmZpYW56YSBhIHRyYXbpcyBkZSB1bmEKK3JlZCBpbnNlZ3VyYS4gTGFzIGNvbmV4aW9uZXMgWDExIHkgcHVlcnRvcyBUQ1AvSVAgYXJiaXRyYXJpb3MgdGFtYmnpbiBwdWVkZW4KK3NlciBjYW5hbGl6YWRhcyBzb2JyZSBlbCBjYW5hbCBzZWd1cm8uCisKKyVEZXNjcmlwdGlvbiAtbCBmcgorT3BlblNTSCAoU2VjdXJlIFNoZWxsKSBmb3Vybml0IHVuIGFjY+hzIOAgdW4gc3lzdOhtZSBkaXN0YW50LiBJbCByZW1wbGFjZQordGVsbmV0LCBybG9naW4sIHJleGVjIGV0IHJzaCwgdG91dCBlbiBhc3N1cmFudCBkZXMgY29tbXVuaWNhdGlvbnMgY3J5cHTpZXMKK3NlY3VyaXPpZXMgZW50cmUgZGV1eCBo9HRlcyBub24gZmlhYmlsaXPpcyBzdXIgdW4gculzZWF1IG5vbiBz6WN1cmlz6S4gRGVzCitjb25uZXhpb25zIFgxMSBldCBkZXMgcG9ydHMgVENQL0lQIGFyYml0cmFpcmVzIHBldXZlbnQg6WdhbGVtZW50IOp0cmUKK3RyYW5zbWlzIHN1ciBsZSBjYW5hbCBz6WN1cmlz6S4KKworJURlc2NyaXB0aW9uIC1sIGl0CitPcGVuU1NIIChTZWN1cmUgU2hlbGwpIGZvcm5pc2NlIGwnYWNjZXNzbyBhZCB1biBzaXN0ZW1hIHJlbW90by4KK1Nvc3RpdHVpc2NlIHRlbG5ldCwgcmxvZ2luLCByZXhlYywgZSByc2gsIGUgZm9ybmlzY2UgY29tdW5pY2F6aW9uaSBzaWN1cmUKK2UgY3JpdHRhdGUgdHJhIGR1ZSBob3N0IG5vbiBmaWRhdGkgc3UgdW5hIHJldGUgbm9uIHNpY3VyYS4gTGUgY29ubmVzc2lvbmkKK1gxMSBhZCB1bmEgcG9ydGEgVENQL0lQIGFyYml0cmFyaWEgcG9zc29ubyBlc3NlcmUgaW5vbHRyYXRlIGF0dHJhdmVyc28KK3VuIGNhbmFsZSBzaWN1cm8uCisKKyVEZXNjcmlwdGlvbiAtbCBwdAorT3BlblNTSCAoU2VjdXJlIFNoZWxsKSBmb3JuZWNlIGFjZXNzbyBhIHVtIHNpc3RlbWEgcmVtb3RvLiBTdWJzdGl0dWkgbwordGVsbmV0LCBybG9naW4sIHJleGVjLCBlIG8gcnNoIGUgZm9ybmVjZSBjb211bmljYef1ZXMgc2VndXJhcyBlIGNpZnJhZGFzCitlbnRyZSBkdWFzIG3hcXVpbmFzIHNlbSBjb25maWFu52Egbfp0dWEgc29icmUgdW1hIHJlZGUgaW5zZWd1cmEuCitMaWdh5/VlcyBYMTEgZSBwb3J0b3MgVENQL0lQIGFyYml0cuFyaW9zIHRhbWLpbSBwb2RlciBzZXIgcmVlbnZpYWRvcworcGVsbyBjYW5hbCBzZWd1cm8uCisKKyVEZXNjcmlwdGlvbiAtbCBwdF9CUgorTyBPcGVuU1NIIChTZWN1cmUgU2hlbGwpIGZvcm5lY2UgYWNlc3NvIGEgdW0gc2lzdGVtYSByZW1vdG8uIFN1YnN0aXR1aSBvCit0ZWxuZXQsIHJsb2dpbiwgcmV4ZWMsIGUgbyByc2ggZSBmb3JuZWNlIGNvbXVuaWNh5/VlcyBzZWd1cmFzIGUgY3JpcHRvZ3JhZmFkYXMKK2VudHJlIGR1YXMgbeFxdWluYXMgc2VtIGNvbmZpYW7nYSBt+nR1YSBzb2JyZSB1bWEgcmVkZSBpbnNlZ3VyYS4KK0xpZ2Hn9WVzIFgxMSBlIHBvcnRhcyBUQ1AvSVAgYXJiaXRy4XJpYXMgdGFtYultIHBvZGVtIHNlciByZWVudmlhZGFzCitwZWxvIGNhbmFsIHNlZ3Vyby4KKworJURlc2NyaXB0aW9uIHNlcnZlcgorVGhpcyBwYWNrYWdlIGluc3RhbGxzIHRoZSBzc2hkLCB0aGUgc2VydmVyIHBvcnRpb24gb2YgT3BlblNTSC4gCisKKyVEZXNjcmlwdGlvbiAtbCBkZSBzZXJ2ZXIKK0RpZXNlcyBQYWtldCBpbnN0YWxsaWVydCBkZW4gc3NoZCwgZGVuIFNlcnZlci1UZWlsIGRlciBPcGVuU1NILgorCislRGVzY3JpcHRpb24gLWwgZXMgc2VydmVyCitFc3RlIHBhcXVldGUgaW5zdGFsYSBzc2hkLCBsYSBwYXJ0ZSBzZXJ2aWRvciBkZSBPcGVuU1NILgorCislRGVzY3JpcHRpb24gLWwgZnIgc2VydmVyCitDZSBwYXF1ZXRhZ2UgaW5zdGFsbGUgbGUgJ3NzaGQnLCBwYXJ0aWUgc2VydmV1ciBkZSBPcGVuU1NILgorCislRGVzY3JpcHRpb24gLWwgaXQgc2VydmVyCitRdWVzdG8gcGFjY2hldHRvIGluc3RhbGxhIHNzaGQsIGlsIHNlcnZlciBkaSBPcGVuU1NILgorCislRGVzY3JpcHRpb24gLWwgcHQgc2VydmVyCitFc3RlIHBhY290ZSBpbnRhbGEgbyBzc2hkLCBvIHNlcnZpZG9yIGRvIE9wZW5TU0guCisKKyVEZXNjcmlwdGlvbiAtbCBwdF9CUiBzZXJ2ZXIKK0VzdGUgcGFjb3RlIGludGFsYSBvIHNzaGQsIG8gc2Vydmlkb3IgZG8gT3BlblNTSC4KKworJURlc2NyaXB0aW9uIGFza3Bhc3MKK1RoaXMgcGFja2FnZSBjb250YWlucyBhbiBYMTEtYmFzZWQgcGFzcy1waHJhc2UgZGlhbG9nIHVzZWQgcGVyCitkZWZhdWx0IGJ5IHNzaC1hZGQoMSkuIEl0IGlzIGJhc2VkIG9uICV7YXNrcGFzc30KK2J5IEppbSBLbm9ibGUgPGpta25vYmxlQHBvYm94LmNvbT4uCisKKworJVByZXAKKyVzZXR1cCAlKFsgLXogIiV7Y3ZzfSIgXSB8fCBlY2hvICItbiAle25hbWV9X2N2cyIpIC1hMgorJWlmICEgJXt1c2Vfc3RhYmxlfQorICBhdXRvcmVjb25mCislZW5kaWYKKworCislQnVpbGQKK0NGTEFHUz0iJFJQTV9PUFRfRkxBR1MiIFwKKyVjb25maWd1cmUgXAorICAgICAgICAgICAgLS13aXRoLXBhbSBcCisgICAgICAgICAgICAtLXdpdGgtdGNwLXdyYXBwZXJzIFwKKwkgICAgLS13aXRoLXByaXZzZXAtcGF0aD0le192YXJ9L2VtcHR5L3NzaGQgXAorCSAgICAjbGVhdmUgdGhpcyBsaW5lIGZvciBlYXN5IGVkaXRzLgorCislX19tYWtlCisKK2NkICV7YXNrcGFzc30KKyVjb25maWd1cmUgXAorCSAgICAjbGVhdmUgdGhpcyBsaW5lIGZvciBlYXN5IGVkaXRzLgorCit4bWttZgorJV9fbWFrZSBpbmNsdWRlcworJV9fbWFrZQorCisKKyVJbnN0YWxsCitbICV7YnVpbGRyb290fSAhPSAiLyIgXSAmJiBybSAtcmYgJXtidWlsZHJvb3R9CisKK21ha2UgaW5zdGFsbCBERVNURElSPSV7YnVpbGRyb290fQorJW1ha2VpbnN0YWxsIC1DICV7YXNrcGFzc30gXAorICAgIEJJTkRJUj0le19saWJleGVjZGlyfSBcCisgICAgTUFOUEFUSD0le19tYW5kaXJ9IFwKKyAgICBERVNURElSPSV7YnVpbGRyb290fQorCisjIE9wZW5MaW51eCBzcGVjaWZpYyBjb25maWd1cmF0aW9uCitta2RpciAtcCAle2J1aWxkcm9vdH17L2V0Yy9wYW0uZCwle1NWSWNkaXJ9LCV7U1ZJZGlyfX0KK21rZGlyIC1wICV7YnVpbGRyb290fSV7X3Zhcn0vZW1wdHkvc3NoZAorCisjIGVuYWJsaW5nIFgxMSBmb3J3YXJkaW5nIG9uIHRoZSBzZXJ2ZXIgaXMgY29udmVuaWVudCBhbmQgb2theSwKKyMgb24gdGhlIGNsaWVudCBzaWRlIGl0J3MgYSBwb3RlbnRpYWwgc2VjdXJpdHkgcmlzayEKKyVfX3BlcmwgLXBpIC1lICdzOiNYMTFGb3J3YXJkaW5nIG5vOlgxMUZvcndhcmRpbmcgeWVzOmcnIFwKKyAgICAle2J1aWxkcm9vdH0le19zeXNjb25mZGlyfS9zc2hkX2NvbmZpZworCislaWYgJXtub19yb290X2xvZ2lufQorJV9fcGVybCAtcGkgLWUgJ3M6I1Blcm1pdFJvb3RMb2dpbiB5ZXM6UGVybWl0Um9vdExvZ2luIG5vOmcnIFwKKyAgICAle2J1aWxkcm9vdH0le19zeXNjb25mZGlyfS9zc2hkX2NvbmZpZworJWVuZGlmCisKK2luc3RhbGwgLW02NDQgY29udHJpYi9jYWxkZXJhL3NzaGQucGFtICV7YnVpbGRyb290fS9ldGMvcGFtLmQvc3NoZAorIyBGSVhNRTogZGlzYWJsZWQsIGZpbmQgb3V0IHdoeSB0aGlzIGRvZXNuJ3Qgd29yayB3aXRoIG5pcworJV9fcGVybCAtcGkgLWUgJ3M6KC4qcGFtX2xpbWl0cy4qKTojJDE6JyBcCisgICAgJXtidWlsZHJvb3R9L2V0Yy9wYW0uZC9zc2hkCisKK2luc3RhbGwgLW0gMDc1NSBjb250cmliL2NhbGRlcmEvc3NoZC5pbml0ICV7YnVpbGRyb290fSV7U1ZJZGlyfS9zc2hkCisKKyMgdGhlIGxhc3Qgb25lIGlzIG5lZWRsZXNzLCBidXQgbW9yZSBmdXR1cmUtcHJvb2YKK2ZpbmQgJXtidWlsZHJvb3R9JXtTVklkaXJ9IC10eXBlIGYgLWV4ZWMgXAorICAgICVfX3BlcmwgLXBpIC1lICdzOlxAU1ZJZGlyXEA6JXtTVklkaXJ9Omc7XAorCQkgICAgczpcQHN5c2NvbmZkaXJcQDole19zeXNjb25mZGlyfTpnOyBcCisJCSAgICBzOi91c3Ivc2Jpbjole19zYmluZGlyfTpnJ1wKKyAgICBce1x9IFw7CisKK2NhdCA8PC1Fb0QgPiAle2J1aWxkcm9vdH0le1NWSWNkaXJ9L3NzaGQKKwlJREVOVD1zc2hkCisJREVTQ1JJUFRJVkU9Ik9wZW5TU0ggc2VjdXJlIHNoZWxsIGRhZW1vbiIKKwkjIFRoaXMgc2VydmljZSB3aWxsIGJlIG1hcmtlZCBhcyAnc2tpcHBlZCcgb24gYm9vdCBpZiB0aGVyZQorCSMgaXMgbm8gaG9zdCBrZXkuIFVzZSBzc2gtaG9zdC1rZXlnZW4gdG8gZ2VuZXJhdGUgb25lCisJT05CT09UPSJ5ZXMiCisJT1BUSU9OUz0iIgorRW9ECisKK1NLRz0le2J1aWxkcm9vdH0le19zYmluZGlyfS9zc2gtaG9zdC1rZXlnZW4KK2luc3RhbGwgLW0gMDc1NSBjb250cmliL2NhbGRlcmEvc3NoLWhvc3Qta2V5Z2VuICRTS0cKKyMgRml4IHVwIHNvbWUgcGF0aCBuYW1lcyBpbiB0aGUga2V5Z2VuIHRveV5Ib2wKKyAgICAlX19wZXJsIC1waSAtZSAnczpcQHN5c2NvbmZkaXJcQDole19zeXNjb25mZGlyfTpnOyBcCisJCSAgICBzOlxAc3Noa2V5Z2VuXEA6JXtfYmluZGlyfS9zc2gta2V5Z2VuOmcnIFwKKwkle2J1aWxkcm9vdH0le19zYmluZGlyfS9zc2gtaG9zdC1rZXlnZW4KKworIyBUaGlzIGxvb2tzIHRlcnJpYmxlLiAgRXhwZWN0IGl0IHRvIGNoYW5nZS4KKyMgaW5zdGFsbCByZW1haW5pbmcgZG9jcworRG9jRD0iJXtidWlsZHJvb3R9JXtfZGVmYXVsdGRvY2Rpcn0vJXtuYW1lfS0le3ZlcnNpb259IgorbWtkaXIgLXAgJERvY0QvJXthc2twYXNzfQorY3AgLWEgQ1JFRElUUyBDaGFuZ2VMb2cgTElDRU5DRSBPVkVSVklFVyBSRUFETUUqIFRPRE8gUFJPVE9DT0wqICREb2NECitpbnN0YWxsIC1wIC1tIDA0NDQgJXtTT1VSQ0UzfSAgJERvY0QvZmFxLmh0bWwKK2NwIC1hICV7YXNrcGFzc30ve1JFQURNRSxDaGFuZ2VMb2csVE9ETyxTc2hBc2twYXNzKi5hZH0gICREb2NELyV7YXNrcGFzc30KKyVpZiAle3VzZV9zdGFibGV9CisgIGNwIC1wICV7YXNrcGFzc30vJXt4c2F9Lm1hbiAkRG9jRC8le2Fza3Bhc3N9LyV7eHNhfS4xCislZWxzZQorICBjcCAtcCAle2Fza3Bhc3N9LyV7eHNhfS5tYW4gJXtidWlsZHJvb3R9JXtfbWFuZGlyfW1hbjEvJXt4c2F9LjEKKyAgbG4gLXMgICV7eHNhfS4xICV7YnVpbGRyb290fSV7X21hbmRpcn1tYW4xL3NzaC1hc2twYXNzLjEKKyVlbmRpZgorCitmaW5kICV7YnVpbGRyb290fSV7X21hbmRpcn0gLXR5cGUgZiAtbm90IC1uYW1lCScqLmd6JyAtcHJpbnQwIHwgeGFyZ3MgLTByICVfX2d6aXAgLTluZgorcm0gJXtidWlsZHJvb3R9JXtfbWFuZGlyfS9tYW4xL3Nsb2dpbi4xICYmIFwKKyAgICBsbiAtcyAle19tYW5kaXJ9L21hbjEvc3NoLjEuZ3ogXAorICAgICV7YnVpbGRyb290fSV7X21hbmRpcn0vbWFuMS9zbG9naW4uMS5negorCisKKyVDbGVhbgorIyV7cm1ERVNURElSfQorWyAle2J1aWxkcm9vdH0gIT0gIi8iIF0gJiYgcm0gLXJmICV7YnVpbGRyb290fQorCislUG9zdAorIyBHZW5lcmF0ZSBob3N0IGtleSB3aGVuIG5vbmUgaXMgcHJlc2VudCB0byBnZXQgdXAgYW5kIHJ1bm5pbmcsCisjIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgcmVxdWlyZSB0aGlzIGZvciBob3N0LWJhc2VkIGF1dGghCisjIHNzaC1ob3N0LWtleWdlbiBjaGVja3MgZm9yIGV4aXN0aW5nIGtleXMuCisvdXNyL3NiaW4vc3NoLWhvc3Qta2V5Z2VuCis6ICMgdG8gcHJvdGVjdCB0aGUgcnBtIGRhdGFiYXNlCisKKyVwcmUgc2VydmVyCisle19zYmluZGlyfS9ncm91cGFkZCAtZyAle3NzaGRfZ2lkfSBzc2hkIDI+L2Rldi9udWxsIHx8IDoKKyV7X3NiaW5kaXJ9L3VzZXJhZGQgLWQgL3Zhci9lbXB0eS9zc2hkIC1zIC9iaW4vZmFsc2UgLXUgJXtzc2hkX3VpZH0gXAorCS1jICJTU0ggRGFlbW9uIHZpcnR1YWwgdXNlciIgLWcgc3NoZCBzc2hkIDI+L2Rldi9udWxsIHx8IDoKKzogIyB0byBwcm90ZWN0IHRoZSBycG0gZGF0YWJhc2UKKworJVBvc3Qgc2VydmVyCitpZiBbIC14ICV7TFNCaW5pdH0taW5zdGFsbCBdOyB0aGVuCisgICV7TFNCaW5pdH0taW5zdGFsbCBzc2hkCitlbHNlCisgIGxpc2EgLS1TeXNWLWluaXQgaW5zdGFsbCBzc2hkIFM1NSAyOjM6NDo1IEs0NSAwOjE6NgorZmkKKworISAle1NWSWRpcn0vc3NoZCBzdGF0dXMgfHwgJXtTVklkaXJ9L3NzaGQgcmVzdGFydAorOiAjIHRvIHByb3RlY3QgdGhlIHJwbSBkYXRhYmFzZQorCisKKyVQcmVVbiBzZXJ2ZXIKK1sgIiQxIiA9IDAgXSB8fCBleGl0IDAKKyEgJXtTVklkaXJ9L3NzaGQgc3RhdHVzIHx8ICV7U1ZJZGlyfS9zc2hkIHN0b3AKK2lmIFsgLXggJXtMU0Jpbml0fS1yZW1vdmUgXTsgdGhlbgorICAle0xTQmluaXR9LXJlbW92ZSBzc2hkCitlbHNlCisgIGxpc2EgLS1TeXNWLWluaXQgcmVtb3ZlIHNzaGQgJDEKK2ZpCis6ICMgdG8gcHJvdGVjdCB0aGUgcnBtIGRhdGFiYXNlCisKKyVGaWxlcyAKKyVkZWZhdHRyKC0scm9vdCxyb290KQorJWRpciAle19zeXNjb25mZGlyfQorJWNvbmZpZyAle19zeXNjb25mZGlyfS9zc2hfY29uZmlnCisle19iaW5kaXJ9L3NjcAorJXtfYmluZGlyfS9zZnRwCisle19iaW5kaXJ9L3NzaAorJXtfYmluZGlyfS9zbG9naW4KKyV7X2JpbmRpcn0vc3NoLWFkZAorJWF0dHIoMjc1NSxyb290LG5vYm9keSkgJXtfYmluZGlyfS9zc2gtYWdlbnQKKyV7X2JpbmRpcn0vc3NoLWtleWdlbgorJXtfYmluZGlyfS9zc2gta2V5c2NhbgorJWRpciAle19saWJleGVjZGlyfQorJWF0dHIoNDcxMSxyb290LHJvb3QpICV7X2xpYmV4ZWNkaXJ9L3NzaC1rZXlzaWduCisle19saWJleGVjZGlyfS9zc2gtcGtjczExLWhlbHBlcgorJXtfc2JpbmRpcn0vc3NoLWhvc3Qta2V5Z2VuCislZGlyICV7X2RlZmF1bHRkb2NkaXJ9LyV7bmFtZX0tJXt2ZXJzaW9ufQorJXtfZGVmYXVsdGRvY2Rpcn0vJXtuYW1lfS0le3ZlcnNpb259L0NSRURJVFMKKyV7X2RlZmF1bHRkb2NkaXJ9LyV7bmFtZX0tJXt2ZXJzaW9ufS9DaGFuZ2VMb2cKKyV7X2RlZmF1bHRkb2NkaXJ9LyV7bmFtZX0tJXt2ZXJzaW9ufS9MSUNFTkNFCisle19kZWZhdWx0ZG9jZGlyfS8le25hbWV9LSV7dmVyc2lvbn0vT1ZFUlZJRVcKKyV7X2RlZmF1bHRkb2NkaXJ9LyV7bmFtZX0tJXt2ZXJzaW9ufS9SRUFETUUqCisle19kZWZhdWx0ZG9jZGlyfS8le25hbWV9LSV7dmVyc2lvbn0vVE9ETworJXtfZGVmYXVsdGRvY2Rpcn0vJXtuYW1lfS0le3ZlcnNpb259L2ZhcS5odG1sCisle19tYW5kaXJ9L21hbjEvKgorJXtfbWFuZGlyfS9tYW44L3NzaC1rZXlzaWduLjguZ3oKKyV7X21hbmRpcn0vbWFuOC9zc2gtcGtjczExLWhlbHBlci44Lmd6Cisle19tYW5kaXJ9L21hbjUvc3NoX2NvbmZpZy41Lmd6CisgCislRmlsZXMgc2VydmVyCislZGVmYXR0cigtLHJvb3Qscm9vdCkKKyVkaXIgJXtfdmFyfS9lbXB0eS9zc2hkCislY29uZmlnICV7U1ZJZGlyfS9zc2hkCislY29uZmlnIC9ldGMvcGFtLmQvc3NoZAorJWNvbmZpZyAle19zeXNjb25mZGlyfS9tb2R1bGkKKyVjb25maWcgJXtfc3lzY29uZmRpcn0vc3NoZF9jb25maWcKKyVjb25maWcgJXtTVkljZGlyfS9zc2hkCisle19saWJleGVjZGlyfS9zZnRwLXNlcnZlcgorJXtfc2JpbmRpcn0vc3NoZAorJXtfbWFuZGlyfS9tYW41L21vZHVsaS41Lmd6Cisle19tYW5kaXJ9L21hbjUvc3NoZF9jb25maWcuNS5negorJXtfbWFuZGlyfS9tYW44L3NmdHAtc2VydmVyLjguZ3oKKyV7X21hbmRpcn0vbWFuOC9zc2hkLjguZ3oKKyAKKyVGaWxlcyBhc2twYXNzCislZGVmYXR0cigtLHJvb3Qscm9vdCkKKyV7X2xpYmV4ZWNkaXJ9L3NzaC1hc2twYXNzCisle19saWJleGVjZGlyfS94MTEtc3NoLWFza3Bhc3MKKyV7X2RlZmF1bHRkb2NkaXJ9LyV7bmFtZX0tJXt2ZXJzaW9ufS8le2Fza3Bhc3N9CisgCisKKyVDaGFuZ2VMb2cKKyogVHVlIEphbiAxOCAyMDExIFRpbSBSaWNlIDx0aW1AbXVsdGl0YWxlbnRzLm5ldD4KKy0gVXNlIENGTEFHUyBmcm9tIE1ha2VmaWxlIGluc3RlYWQgb2YgUlBNIHNvIGJ1aWxkIGNvbXBsZXRlcy4KKy0gU2lnbmF0dXJlcyB3ZXJlIGNoYW5nZWQgdG8gLmFzYyBzaW5jZSA0LjFwMS4KKworKiBNb24gSmFuIDAxIDE5OTggLi4uCitUZW1wbGF0ZSBWZXJzaW9uOiAxLjMxCisKKyRJZDogb3BlbnNzaC5zcGVjLHYgMS43NyAyMDEyLzA0LzIwIDAwOjU4OjQzIGRqbSBFeHAgJApkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jb250cmliL2NhbGRlcmEvc3NoLWhvc3Qta2V5Z2VuIGIvb3BlbnNzaC02LjBwMS9jb250cmliL2NhbGRlcmEvc3NoLWhvc3Qta2V5Z2VuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg2MzgyZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvY2FsZGVyYS9zc2gtaG9zdC1rZXlnZW4KQEAgLTAsMCArMSwzNiBAQAorIyEgL2Jpbi9zaAorIworIyAkSWQ6IHNzaC1ob3N0LWtleWdlbix2IDEuMyAyMDA4LzExLzAzIDA5OjE2OjAxIGRqbSBFeHAgJAorIworIyBUaGlzIHNjcmlwdCBpcyBub3JtYWxseSBydW4gb25seSAqb25jZSogZm9yIGEgZ2l2ZW4gaG9zdAorIyAoaW4gYSBnaXZlbiBwZXJpb2Qgb2YgdGltZSkgLS0gb24gdXBkYXRlcy91cGdyYWRlcy9yZWNvdmVyeQorIyB0aGUgc3NoX2hvc3Rfa2V5KiBmaWxlcyBfc2hvdWxkXyBiZSByZXRhaW5lZCEgT3RoZXJ3aXNlIGZhbHNlCisjICJtYW4taW4tdGhlLW1pZGRsZS1hdHRhY2siIGFsZXJ0cyB3aWxsIGZyaWdodGVuIHVuc3VzcGVjdGluZworIyBjbGllbnRzLi4uCisKK2tleWRpcj1Ac3lzY29uZmRpckAKK2tleWdlbj1Ac3Noa2V5Z2VuQAorCitpZiBbIC1mICRrZXlkaXIvc3NoX2hvc3Rfa2V5IC1vIFwKKwkgICAgIC1mICRrZXlkaXIvc3NoX2hvc3Rfa2V5LnB1YiBdOyB0aGVuCisgIGVjaG8gIllvdSBhbHJlYWR5IGhhdmUgYW4gU1NIMSBSU0EgaG9zdCBrZXkgaW4gJGtleWRpci9zc2hfaG9zdF9rZXkuIgorZWxzZQorICBlY2hvICJHZW5lcmF0aW5nIFNTSDEgUlNBIGhvc3Qga2V5LiIKKyAgJGtleWdlbiAtdCByc2ExIC1mICRrZXlkaXIvc3NoX2hvc3Rfa2V5IC1DICcnIC1OICcnCitmaQorCitpZiBbIC1mICRrZXlkaXIvc3NoX2hvc3RfcnNhX2tleSAtbyBcCisJICAgICAtZiAka2V5ZGlyL3NzaF9ob3N0X3JzYV9rZXkucHViIF07IHRoZW4KKyAgZWNobyAiWW91IGFscmVhZHkgaGF2ZSBhbiBTU0gyIFJTQSBob3N0IGtleSBpbiAka2V5ZGlyL3NzaF9ob3N0X3JzYV9rZXkuIgorZWxzZQorICBlY2hvICJHZW5lcmF0aW5nIFNTSDIgUlNBIGhvc3Qga2V5LiIKKyAgJGtleWdlbiAtdCByc2EgLWYgJGtleWRpci9zc2hfaG9zdF9yc2Ffa2V5IC1DICcnIC1OICcnCitmaQorCitpZiBbIC1mICRrZXlkaXIvc3NoX2hvc3RfZHNhX2tleSAtbyBcCisJICAgICAtZiAka2V5ZGlyL3NzaF9ob3N0X2RzYV9rZXkucHViIF07IHRoZW4KKyAgZWNobyAiWW91IGFscmVhZHkgaGF2ZSBhbiBTU0gyIERTQSBob3N0IGtleSBpbiAka2V5ZGlyL3NzaF9ob3N0X2RzYV9rZXkuIgorZWxzZQorICBlY2hvICJHZW5lcmF0aW5nIFNTSDIgRFNBIGhvc3Qga2V5LiIKKyAgJGtleWdlbiAtdCBkc2EgLWYgJGtleWRpci9zc2hfaG9zdF9kc2Ffa2V5IC1DICcnIC1OICcnCitmaQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jb250cmliL2NhbGRlcmEvc3NoZC5pbml0IGIvb3BlbnNzaC02LjBwMS9jb250cmliL2NhbGRlcmEvc3NoZC5pbml0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk4MzE0NmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvY2FsZGVyYS9zc2hkLmluaXQKQEAgLTAsMCArMSwxMjUgQEAKKyMhIC9iaW4vYmFzaAorIworIyAkSWQ6IHNzaGQuaW5pdCx2IDEuNCAyMDAzLzExLzIxIDEyOjQ4OjU3IGRqbSBFeHAgJAorIworIyMjIEJFR0lOIElOSVQgSU5GTworIyBQcm92aWRlczoKKyMgUmVxdWlyZWQtU3RhcnQ6ICRuZXR3b3JrCisjIFJlcXVpcmVkLVN0b3A6CisjIERlZmF1bHQtU3RhcnQ6ICAzIDQgNQorIyBEZWZhdWx0LVN0b3A6ICAgMCAxIDIgNgorIyBEZXNjcmlwdGlvbjogc3NoZAorIyAgICAgICAgICAgICAgICBCcmluZyB1cC9kb3duIHRoZSBPcGVuU1NIIHNlY3VyZSBzaGVsbCBkYWVtb24uCisjIyMgRU5EIElOSVQgSU5GTworIworIyBXcml0dGVuIGJ5IE1pcXVlbCB2YW4gU21vb3JlbmJ1cmcgPG1pcXVlbHNAZHJpbmtlbC5vdy5vcmc+LgorIyBNb2RpZmllZCBmb3IgRGViaWFuIEdOVS9MaW51eCBieSBJYW4gTXVyZG9jayA8aW11cmRvY2tAZ251LmFpLm1pdC5lZHU+LgorIyBNb2RpZmllZCBmb3IgT3BlbkxpbnV4IGJ5IFJheW11bmQgV2lsbCA8cmF5QGNhbGRlcmEuZGU+CisKK05BTUU9c3NoZAorREFFTU9OPS91c3Ivc2Jpbi8kTkFNRQorIyBIYWNrLUFsZXJ0KFRNKSEgIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGdldCBhcm91bmQgdGhlICdyZWxvYWQnLXByb2JsZW0KKyMgY3JlYXRlZCBieSByZWNlbnQgT3BlblNTSCBkYWVtb24vc3NkIGNvbWJpbmF0aW9ucy4gU2VlIENhbGRlcmEgaW50ZXJuYWwKKyMgUFIgW2xpbnV4LzgyNzhdIGZvciBkZXRhaWxzLi4uCitQSURGPS92YXIvcnVuLyROQU1FLnBpZAorTkFNRT0kREFFTU9OCisKK19zdGF0dXMoKSB7CisgIFsgLXogIiQxIiBdIHx8IGxvY2FsIHBpZGY9IiQxIgorICBsb2NhbCByZXQ9LTEKKyAgbG9jYWwgcGlkCisgIGlmIFsgLW4gIiRwaWRmIiBdICYmIFsgIC1yICIkcGlkZiIgXTsgdGhlbgorICAgIHBpZD0kKGhlYWQgLTEgJHBpZGYpCisgIGVsc2UKKyAgICBwaWQ9JChwaWRvZiAkTkFNRSkKKyAgZmkKKworICBpZiBbICEgLWUgJFNWSWxvY2sgXTsgdGhlbgorICAgICMgbm8gbG9jay1maWxlID0+IG5vdCBzdGFydGVkID09IHN0b3BwZWQ/CisgICAgcmV0PTMKKyAgZWxpZiBbIC1uICIkcGlkZiIgLWEgISAtZiAiJHBpZGYiIF0gfHwgWyAteiAiJHBpZCIgXTsgdGhlbgorICAgICMgcGlkLWZpbGUgZ2l2ZW4gYnV0IG5vdCBwcmVzZW50IG9yIG5vIHBpZCA9PiBkaWVkLCBidXQgd2FzIG5vdCBzdG9wcGVkCisgICAgcmV0PTIKKyAgZWxpZiBbIC1yIC9wcm9jLyRwaWQvY21kbGluZSBdICYmCisgICAgICAgZWNobyAtbmUgJE5BTUUnXDAwMCcgfCBjbXAgLXMgLSAvcHJvYy8kcGlkL2NtZGxpbmU7IHRoZW4KKyAgICAjIHBpZC1maWxlIGdpdmVuIGFuZCBwcmVzZW50IG9yIHBpZCBmb3VuZCA9PiBjaGVjayBwcm9jZXNzLi4uCisgICAgIyBidXQgZG9uJ3QgY29tcGFyZSBleGUsIGFzIHRoaXMgd2lsbCBmYWlsIGFmdGVyIGFuIHVwZGF0ZSEKKyAgICAjIGNvbXBhcmVzIE9LID0+IGFsbCdzIHdlbGwsIHRoYXQgZW5kcyB3ZWxsLi4uCisgICAgcmV0PTAKKyAgZWxzZQorICAgICMgbm8gc3VjaCBwcm9jZXNzIG9yIGV4ZSBkb2VzIG5vdCBtYXRjaCA9PiBzdGFsZSBwaWQtZmlsZSBvciBwcm9jZXNzIGRpZWQKKyAgICAjICAganVzdCByZWNlbnRseS4uLgorICAgIHJldD0xCisgIGZpCisgIHJldHVybiAkcmV0Cit9CisKKyMgU291cmNlIGZ1bmN0aW9uIGxpYnJhcnkgKGFuZCBzZXQgdml0YWwgdmFyaWFibGVzKS4KKy4gQFNWSWRpckAvZnVuY3Rpb25zCisKK2Nhc2UgIiQxIiBpbgorIHN0YXJ0KQorICBbICEgLWUgJFNWSWxvY2sgXSB8fCBleGl0IDAKKyAgWyAteCAkREFFTU9OIF0gfHwgZXhpdCA1CisgIFNWSWVtcHR5Q29uZmlnIEBzeXNjb25mZGlyQC9zc2hkX2NvbmZpZyAmJiBleGl0IDYKKworICBpZiBbICEgXCggLWYgQHN5c2NvbmZkaXJAL3NzaF9ob3N0X2tleSAtYSAgICAgICAgICAgIFwKKwkgICAgLWYgQHN5c2NvbmZkaXJAL3NzaF9ob3N0X2tleS5wdWIgXCkgLWEgICAgIFwKKyAgICAgICAhIFwoIC1mIEBzeXNjb25mZGlyQC9zc2hfaG9zdF9yc2Ffa2V5IC1hICAgICAgICBcCisJICAgIC1mIEBzeXNjb25mZGlyQC9zc2hfaG9zdF9yc2Ffa2V5LnB1YiBcKSAtYSBcCisgICAgICAgISBcKCAtZiBAc3lzY29uZmRpckAvc3NoX2hvc3RfZHNhX2tleSAtYSAgICAgICAgXAorCSAgICAtZiBAc3lzY29uZmRpckAvc3NoX2hvc3RfZHNhX2tleS5wdWIgXCkgXTsgdGhlbgorCisgICAgZWNobyAiJFNWSXN1YnN5czogaG9zdCBrZXkgbm90IGluaXRpYWxpemVkOiBza2lwcGVkISIKKyAgICBlY2hvICIkU1ZJc3Vic3lzOiB1c2Ugc3NoLWhvc3Qta2V5Z2VuIHRvIGdlbmVyYXRlIG9uZSEiCisgICAgZXhpdCA2CisgIGZpCisKKyAgZWNobyAtbiAiU3RhcnRpbmcgJFNWSXN1YnN5cyBzZXJ2aWNlczogIgorICBzc2QgLVMgLXggJERBRU1PTiAtbiAkTkFNRSAtLSAkT1BUSU9OUworICByZXQ9JD8KKworICBlY2hvICAiLiIKKyAgdG91Y2ggJFNWSWxvY2sKKyAgOzsKKworIHN0b3ApCisgIFsgLWUgJFNWSWxvY2sgXSB8fCBleGl0IDAKKworICBlY2hvIC1uICJTdG9wcGluZyAkU1ZJc3Vic3lzIHNlcnZpY2VzOiAiCisgIHNzZCAtSyAtcCAkUElERiAtbiAkTkFNRQorICByZXQ9JD8KKworICBlY2hvICIuIgorICBybSAtZiAkU1ZJbG9jaworICA7OworCisgZm9yY2UtcmVsb2FkfHJlbG9hZCkKKyAgWyAtZSAkU1ZJbG9jayBdIHx8IGV4aXQgMAorCisgIGVjaG8gIlJlbG9hZGluZyAkU1ZJc3Vic3lzIGNvbmZpZ3VyYXRpb24gZmlsZXM6ICIKKyAgc3NkIC1LIC0tc2lnbmFsIDEgLXEgLXAgJFBJREYgLW4gJE5BTUUKKyAgcmV0PSQ/CisgIGVjaG8gImRvbmUuIgorICA7OworCisgcmVzdGFydCkKKyAgJDAgc3RvcAorICAkMCBzdGFydAorICByZXQ9JD8KKyAgOzsKKworIHN0YXR1cykKKyAgX3N0YXR1cyAkUElERgorICByZXQ9JD8KKyAgOzsKKworICopCisgIGVjaG8gIlVzYWdlOiAkU1ZJc2NyaXB0IHtbcmVdc3RhcnR8c3RvcHxbZm9yY2UtXXJlbG9hZHxzdGF0dXN9IgorICByZXQ9MgorICA7OworCitlc2FjCisKK2V4aXQgJHJldAorCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvY2FsZGVyYS9zc2hkLnBhbSBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9jYWxkZXJhL3NzaGQucGFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNTBhOWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvY2FsZGVyYS9zc2hkLnBhbQpAQCAtMCwwICsxLDggQEAKKyMlUEFNLTEuMAorYXV0aCAgICAgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fcHdkYi5zbyBzaGFkb3cgbm9kZWxheQorYWNjb3VudCAgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fbm9sb2dpbi5zbworYWNjb3VudCAgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fcHdkYi5zbworcGFzc3dvcmQgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fY3JhY2tsaWIuc28KK3Bhc3N3b3JkICAgcmVxdWlyZWQgICAgIC9saWIvc2VjdXJpdHkvcGFtX3B3ZGIuc28gc2hhZG93IG51bGxvayB1c2VfYXV0aHRvaworc2Vzc2lvbiAgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fcHdkYi5zbworc2Vzc2lvbiAgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fbGltaXRzLnNvCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvY3lnd2luL01ha2VmaWxlIGIvb3BlbnNzaC02LjBwMS9jb250cmliL2N5Z3dpbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDI2MWY0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9jb250cmliL2N5Z3dpbi9NYWtlZmlsZQpAQCAtMCwwICsxLDc3IEBACitzcmNkaXI9Li4vLi4KK2NvcHlpZHNyY2Rpcj0uLgorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSQocHJlZml4KQorYmluZGlyPSQocHJlZml4KS9iaW4KK2RhdGFkaXI9JChwcmVmaXgpL3NoYXJlCittYW5kaXI9JChkYXRhZGlyKS9tYW4KK2RvY2Rpcj0kKGRhdGFkaXIpL2RvYworc3NoZG9jZGlyPSQoZG9jZGlyKS9vcGVuc3NoCitjeWdkb2NkaXI9JChkb2NkaXIpL0N5Z3dpbgorc3lzY29uZmRpcj0vZXRjCitkZWZhdWx0c2Rpcj0kKHN5c2NvbmZkaXIpL2RlZmF1bHRzL2V0YworaW5ldGRlZmRpcj0kKGRlZmF1bHRzZGlyKS9pbmV0ZC5kCitQUklWU0VQX1BBVEg9L3Zhci9lbXB0eQorSU5TVEFMTD0vdXNyL2Jpbi9pbnN0YWxsIC1jCisKK0RFU1RESVI9CisKK2FsbDoKKwlAZWNobworCUBlY2hvICJVc2UgXGBtYWtlIGN5Z3dpbi1wb3N0aW5zdGFsbCBERVNURElSPVtwYWNrYWdlIGRpcmVjdG9yeV0nIgorCUBlY2hvICJCZSBzdXJlIGhhdmluZyBERVNURElSIHNldCBjb3JyZWN0bHkhIgorCUBlY2hvCisKK21vdmUtY29uZmlnLWZpbGVzOiAkKERFU1RESVIpJChzeXNjb25mZGlyKS9zc2hfY29uZmlnICQoREVTVERJUikkKHN5c2NvbmZkaXIpL3NzaGRfY29uZmlnCisJJChzcmNkaXIpL21raW5zdGFsbGRpcnMgJChERVNURElSKSQoZGVmYXVsdHNkaXIpCisJbXYgJChERVNURElSKSQoc3lzY29uZmRpcikvc3NoX2NvbmZpZyAkKERFU1RESVIpJChkZWZhdWx0c2RpcikKKwltdiAkKERFU1RESVIpJChzeXNjb25mZGlyKS9zc2hkX2NvbmZpZyAkKERFU1RESVIpJChkZWZhdWx0c2RpcikKKworcmVtb3ZlLWVtcHR5LWRpcjoKKwlybSAtcmYgJChERVNURElSKSQoUFJJVlNFUF9QQVRIKQorCitpbnN0YWxsLWluZXRkLWNvbmZpZzoKKwkkKHNyY2RpcikvbWtpbnN0YWxsZGlycyAkKERFU1RESVIpJChpbmV0ZGVmZGlyKQorCSQoSU5TVEFMTCkgLW0gNjQ0IHNzaGQtaW5ldGQgICQoREVTVERJUikkKGluZXRkZWZkaXIpL3NzaGQtaW5ldGQKKworaW5zdGFsbC1zc2hkb2M6CisJJChzcmNkaXIpL21raW5zdGFsbGRpcnMgJChERVNURElSKSQoc3NoZG9jZGlyKQorCS0kKElOU1RBTEwpIC1tIDY0NCAkKHNyY2RpcikvQ1JFRElUUyAkKERFU1RESVIpJChzc2hkb2NkaXIpL0NSRURJVFMKKwktJChJTlNUQUxMKSAtbSA2NDQgJChzcmNkaXIpL0NoYW5nZUxvZyAkKERFU1RESVIpJChzc2hkb2NkaXIpL0NoYW5nZUxvZworCS0kKElOU1RBTEwpIC1tIDY0NCAkKHNyY2RpcikvTElDRU5DRSAkKERFU1RESVIpJChzc2hkb2NkaXIpL0xJQ0VOQ0UKKwktJChJTlNUQUxMKSAtbSA2NDQgJChzcmNkaXIpL09WRVJWSUVXICQoREVTVERJUikkKHNzaGRvY2RpcikvT1ZFUlZJRVcKKwktJChJTlNUQUxMKSAtbSA2NDQgJChzcmNkaXIpL1BST1RPQ09MICQoREVTVERJUikkKHNzaGRvY2RpcikvUFJPVE9DT0wKKwktJChJTlNUQUxMKSAtbSA2NDQgJChzcmNkaXIpL1BST1RPQ09MLmFnZW50ICQoREVTVERJUikkKHNzaGRvY2RpcikvUFJPVE9DT0wuYWdlbnQKKwktJChJTlNUQUxMKSAtbSA2NDQgJChzcmNkaXIpL1BST1RPQ09MLmNlcnRrZXlzICQoREVTVERJUikkKHNzaGRvY2RpcikvUFJPVE9DT0wuY2VydGtleXMKKwktJChJTlNUQUxMKSAtbSA2NDQgJChzcmNkaXIpL1BST1RPQ09MLm11eCAkKERFU1RESVIpJChzc2hkb2NkaXIpL1BST1RPQ09MLm11eAorCS0kKElOU1RBTEwpIC1tIDY0NCAkKHNyY2RpcikvUkVBRE1FICQoREVTVERJUikkKHNzaGRvY2RpcikvUkVBRE1FCisJLSQoSU5TVEFMTCkgLW0gNjQ0ICQoc3JjZGlyKS9SRUFETUUuZG5zICQoREVTVERJUikkKHNzaGRvY2RpcikvUkVBRE1FLmRucworCS0kKElOU1RBTEwpIC1tIDY0NCAkKHNyY2RpcikvUkVBRE1FLnBsYXRmb3JtICQoREVTVERJUikkKHNzaGRvY2RpcikvUkVBRE1FLnBsYXRmb3JtCisJLSQoSU5TVEFMTCkgLW0gNjQ0ICQoc3JjZGlyKS9SRUFETUUucHJpdnNlcCAkKERFU1RESVIpJChzc2hkb2NkaXIpL1JFQURNRS5wcml2c2VwCisJLSQoSU5TVEFMTCkgLW0gNjQ0ICQoc3JjZGlyKS9SRUFETUUudHVuICQoREVTVERJUikkKHNzaGRvY2RpcikvUkVBRE1FLnR1bgorCS0kKElOU1RBTEwpIC1tIDY0NCAkKHNyY2RpcikvVE9ETyAkKERFU1RESVIpJChzc2hkb2NkaXIpL1RPRE8KKworaW5zdGFsbC1jeWd3aW5kb2M6IFJFQURNRQorCSQoc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoREVTVERJUikkKGN5Z2RvY2RpcikKKwkkKElOU1RBTEwpIC1tIDY0NCBSRUFETUUgJChERVNURElSKSQoY3lnZG9jZGlyKS9vcGVuc3NoLlJFQURNRQorCitpbnN0YWxsLWRvYzogaW5zdGFsbC1zc2hkb2MgaW5zdGFsbC1jeWd3aW5kb2MKKworaW5zdGFsbC1zY3JpcHRzOiBzc2gtaG9zdC1jb25maWcgc3NoLXVzZXItY29uZmlnCisJJChzcmNkaXIpL21raW5zdGFsbGRpcnMgJChERVNURElSKSQoYmluZGlyKQorCSQoSU5TVEFMTCkgLW0gNzU1IHNzaC1ob3N0LWNvbmZpZyAkKERFU1RESVIpJChiaW5kaXIpL3NzaC1ob3N0LWNvbmZpZworCSQoSU5TVEFMTCkgLW0gNzU1IHNzaC11c2VyLWNvbmZpZyAkKERFU1RESVIpJChiaW5kaXIpL3NzaC11c2VyLWNvbmZpZworCitpbnN0YWxsLWNvcHktaWQ6ICQoY29weWlkc3JjZGlyKS9zc2gtY29weS1pZCAkKGNvcHlpZHNyY2Rpcikvc3NoLWNvcHktaWQuMQorCSQoSU5TVEFMTCkgLW0gNzU1ICQoY29weWlkc3JjZGlyKS9zc2gtY29weS1pZCAkKERFU1RESVIpJChiaW5kaXIpL3NzaC1jb3B5LWlkCisJJChJTlNUQUxMKSAtbSA2NDQgJChjb3B5aWRzcmNkaXIpL3NzaC1jb3B5LWlkLjEgJChERVNURElSKSQobWFuZGlyKS9tYW4xL3NzaC1jb3B5LWlkLjEKKworZ3ppcC1tYW4tcGFnZXM6CisJcm0gJChERVNURElSKSQobWFuZGlyKS9tYW4xL3Nsb2dpbi4xCisJZ3ppcCAkKERFU1RESVIpJChtYW5kaXIpL21hbjEvKi4xCisJZ3ppcCAkKERFU1RESVIpJChtYW5kaXIpL21hbjUvKi41CisJZ3ppcCAkKERFU1RESVIpJChtYW5kaXIpL21hbjgvKi44CisJY2QgJChERVNURElSKSQobWFuZGlyKS9tYW4xICYmIGxuIC1zIHNzaC4xLmd6IHNsb2dpbi4xLmd6CisKK2N5Z3dpbi1wb3N0aW5zdGFsbDogbW92ZS1jb25maWctZmlsZXMgcmVtb3ZlLWVtcHR5LWRpciBpbnN0YWxsLWluZXRkLWNvbmZpZyBpbnN0YWxsLWRvYyBpbnN0YWxsLXNjcmlwdHMgaW5zdGFsbC1jb3B5LWlkIGd6aXAtbWFuLXBhZ2VzCisJQGVjaG8gIkN5Z3dpbiBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGZpbmlzaGVkLiIKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvY29udHJpYi9jeWd3aW4vUkVBRE1FIGIvb3BlbnNzaC02LjBwMS9jb250cmliL2N5Z3dpbi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY5MTFlOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9jeWd3aW4vUkVBRE1FCkBAIC0wLDAgKzEsMjM3IEBACitUaGlzIHBhY2thZ2UgZGVzY3JpYmVzIGltcG9ydGFudCBDeWd3aW4gc3BlY2lmaWMgc3R1ZmYgY29uY2VybmluZyBPcGVuU1NILgorCitUaGUgYmluYXJ5IHBhY2thZ2UgaXMgdXN1YWxseSBidWlsdCBmb3IgcmVjZW50IEN5Z3dpbiB2ZXJzaW9ucyBhbmQgbWlnaHQKK25vdCBydW4gb24gb2xkZXIgdmVyc2lvbnMuICBQbGVhc2UgY2hlY2sgaHR0cDovL2N5Z3dpbi5jb20vIGZvciBpbmZvcm1hdGlvbgorYWJvdXQgY3VycmVudCBDeWd3aW4gcmVsZWFzZXMuCisKK0J1aWxkIGluc3RydWN0aW9ucyBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJbXBvcnRhbnQgY2hhbmdlIHNpbmNlIDMuNy4xcDItMjoKKworVGhlIHNzaC1ob3N0LWNvbmZpZyBmaWxlIGRvZXNuJ3QgY3JlYXRlIHRoZSAvZXRjL3NzaF9jb25maWcgYW5kCisvZXRjL3NzaGRfY29uZmlnIGZpbGVzIGZyb20gYnVpbHRpbiBoZXJlLXNjcmlwdHMgYW55bW9yZSwgYnV0IGl0IHVzZXMKK3NrZWxldG9uIGZpbGVzIGluc3RhbGxlZCBpbiAvZXRjL2RlZmF1bHRzL2V0Yy4KKworQWxzbyBpdCBub3cgdHJpZXMgaGFyZCB0byBjcmVhdGUgYXBwcm9wcmlhdGUgcGVybWlzc2lvbnMgb24gZmlsZXMuCitTYW1lIGFwcGxpZXMgZm9yIHNzaC11c2VyLWNvbmZpZy4KKworQWZ0ZXIgY3JlYXRpbmcgdGhlIHNzaGQgc2VydmljZSB3aXRoIHNzaC1ob3N0LWNvbmZpZywgaXQncyBhZHZpc2FibGUgdG8KK2NhbGwgc3NoLXVzZXItY29uZmlnIGZvciBhbGwgYWZmZWN0ZWQgdXNlcnMsIGFsc28gYWxyZWFkeSBleGlzaW5nIHVzZXIKK2NvbmZpZ3VyYXRpb25zLiAgSW4gdGhlIGxhdHRlciBjYXNlLCBmaWxlIGFuZCBkaXJlY3RvcnkgcGVybWlzc2lvbnMgYXJlCitjaGVja2VkIGFuZCBjaGFuZ2VkLCBpZiByZXF1aXJlZWQgdG8gbWF0Y2ggdGhlIGhvc3QgY29uZmlndXJhdGlvbi4KKworSW1wb3J0YW50IG5vdGUgZm9yIFdpbmRvd3MgMjAwMyBTZXJ2ZXIgdXNlcnM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMjAwMyBTZXJ2ZXIgaGFzIGEgZnVubnkgbmV3IGZlYXR1cmUuICBXaGVuIHN0YXJ0aW5nIHNlcnZpY2VzIHVuZGVyIFNZU1RFTQorYWNjb3VudCwgdGhlc2Ugc2VydmljZXMgaGF2ZSBuZWFybHkgYWxsIHVzZXIgcmlnaHRzIHdoaWNoIFNZU1RFTSBob2xkcy4uLgorZXhjZXB0IGZvciB0aGUgIkNyZWF0ZSBhIHRva2VuIG9iamVjdCIgcmlnaHQsIHdoaWNoIGlzIG5lZWRlZCB0byBhbGxvdworcHVibGljIGtleSBhdXRoZW50aWNhdGlvbiA6LSgKKworVGhlcmUncyBubyB3YXkgYXJvdW5kIHRoaXMsIGV4Y2VwdCBmb3IgY3JlYXRpbmcgYSBzdWJzdGl0dXRlIGFjY291bnQgd2hpY2gKK2hhcyB0aGUgYXBwcm9wcmlhdGUgcHJpdmlsZWdlcy4gIEJhc2ljYWxseSwgdGhpcyBhY2NvdW50IHNob3VsZCBiZSBtZW1iZXIKK29mIHRoZSBhZG1pbmlzdHJhdG9ycyBncm91cCwgcGx1cyBpdCBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHVzZXIgcmlnaHRzOgorCisJQ3JlYXRlIGEgdG9rZW4gb2JqZWN0CisJTG9nb24gYXMgYSBzZXJ2aWNlCisJUmVwbGFjZSBhIHByb2Nlc3MgbGV2ZWwgdG9rZW4KKwlJbmNyZWFzZSBRdW90YQorCitUaGUgc3NoLWhvc3QtY29uZmlnIHNjcmlwdCBhc2tzIHlvdSwgaWYgaXQgc2hvdWxkIGNyZWF0ZSBzdWNoIGFuIGFjY291bnQsCitjYWxsZWQgInNzaGRfc2VydmVyIi4gIElmIHlvdSBzYXkgIm5vIiBoZXJlLCB5b3UncmUgb24geW91ciBvd24uICBQbGVhc2UKK2ZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb24gaW4gc3NoLWhvc3QtY29uZmlnIGV4YWN0bHkgaWYgcG9zc2libGUuICBOb3RlIHRoYXQKK3NzaC11c2VyLWNvbmZpZyBzZXRzIHRoZSBwZXJtaXNzaW9ucyBvbiAyMDAzIFNlcnZlciBtYWNoaW5lcyBkZXBlbmRlbnQgb2YKK3doZXRoZXIgYSBzc2hkX3NlcnZlciBhY2NvdW50IGV4aXN0cyBvciBub3QuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJbXBvcnRhbnQgY2hhbmdlIHNpbmNlIDMuNHAxLTI6CisKK1RoaXMgdmVyc2lvbiBhZGRzIHByaXZpbGVnZSBzZXBhcmF0aW9uIGFzIGRlZmF1bHQgc2V0dGluZywgc2VlCisvdXNyL2RvYy9vcGVuc3NoL1JFQURNRS5wcml2c2VwLiAgQWNjb3JkaW5nIHRvIHRoYXQgZG9jdW1lbnQgdGhlCitwcml2c2VwIGZlYXR1cmUgcmVxdWlyZXMgYSBub24tcHJpdmlsZWdlZCBhY2NvdW50IGNhbGxlZCAnc3NoZCcuCisKK1RoZSBuZXcgc3NoLWhvc3QtY29uZmlnIGZpbGUgd2hpY2ggaXMgcGFydCBvZiB0aGlzIHZlcnNpb24gYXNrcwordG8gY3JlYXRlICdzc2hkJyBhcyBsb2NhbCB1c2VyIGlmIHlvdSB3YW50IHRvIHVzZSBwcml2aWxlZ2UKK3NlcGFyYXRpb24uICBJZiB5b3UgY29uZmlybSwgaXQgY3JlYXRlcyB0aGF0IE5UIHVzZXIgYW5kIGFkZHMKK3RoZSBuZWNlc3NhcnkgZW50cnkgdG8gL2V0Yy9wYXNzd2QuCisKK09uIDl4L01lIHN5c3RlbXMgdGhlIHNjcmlwdCBqdXN0IHNldHMgVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiB0byAibm8iCitzaW5jZSB0aGF0IGZlYXR1cmUgZG9lc24ndCBtYWtlIGFueSBzZW5zZSBvbiBhIHN5c3RlbSB3aGljaCBkb2Vzbid0CitkaWZmZXIgYmV0d2VlbiBwcml2aWxlZ2VkIGFuZCB1bnByaXZpbGVnZWQgdXNlcnMuCisKK1RoZSBuZXcgc3NoLWhvc3QtY29uZmlnIHNjcmlwdCBhbHNvIGFkZHMgdGhlIC92YXIvZW1wdHkgZGlyZWN0b3J5CituZWVkZWQgYnkgcHJpdmlsZWdlIHNlcGFyYXRpb24uICBXaGVuIGNyZWF0aW5nIHRoZSAvdmFyL2VtcHR5IGRpcmVjdG9yeQorYnkgeW91cnNlbGYsIHBsZWFzZSBub3RlIHRoYXQgaW4gY29udHJhc3QgdG8gdGhlIFJFQURNRS5wcml2c2VwIGRvY3VtZW50Cit0aGUgb3duZXIgc3Nob3VsZCBub3QgYmUgInJvb3QiIGJ1dCB0aGUgdXNlciB3aGljaCBpcyBydW5uaW5nIHNzaGQuICBTbywKK2luIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIHRoaXMgaXMgU1lTVEVNLiAgVGhlIHNzaC1ob3N0LWNvbmZpZyBzY3JpcHQKK2Nob3ducyAvdmFyL2VtcHR5IGFjY29yZGluZ2x5LgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSW1wb3J0YW50IGNoYW5nZSBzaW5jZSAzLjAuMXAxLTI6CisKK1RoaXMgdmVyc2lvbiBpbnRyb2R1Y2VzIHRoZSBhYmlsaXR5IHRvIHJlZ2lzdGVyIHNzaGQgYXMgc2VydmljZSBvbgorV2luZG93cyA5eC9NZSBzeXN0ZW1zLiAgVGhpcyBpcyBkb25lIG9ubHkgd2hlbiB0aGUgb3B0aW9ucyAtRCBhbmQvb3IKKy1kIGFyZSBub3QgZ2l2ZW4uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJbXBvcnRhbnQgY2hhbmdlIHNpbmNlIDIuOXAyOgorCitTaW5jZSBDeWd3aW4gaXMgYWJsZSB0byBzd2l0Y2ggdXNlciBjb250ZXh0IHdpdGhvdXQgcGFzc3dvcmQgYmVnaW5uaW5nCit3aXRoIHZlcnNpb24gMS4zLjIsIE9wZW5TU0ggbm93IGFsbG93cyB0byBkbyBzbyB3aGVuIGl0J3MgcnVubmluZyB1bmRlcgorYSB2ZXJzaW9uID49IDEuMy4yLiBLZWVwIGluIG1pbmQgdGhhdCBgbnRzZWMnIGhhcyB0byBiZSBhY3RpdmF0ZWQgdG8KK2FsbG93IHRoYXQgZmVhdHVyZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0ltcG9ydGFudCBjaGFuZ2Ugc2luY2UgMi4zLjBwMToKKworV2hlbiB1c2luZyBgbnRlYScgb3IgYG50c2VjJyB5b3Ugbm93IGhhdmUgdG8gY2FyZSBmb3IgdGhlIG93bmVyc2hpcAorYW5kIHBlcm1pc3Npb24gYml0cyBvZiB5b3VyIGhvc3Qga2V5IGZpbGVzIGFuZCB5b3VyIHByaXZhdGUga2V5IGZpbGVzLgorVGhlIGhvc3Qga2V5IGZpbGVzIGhhdmUgdG8gYmUgb3duZWQgYnkgdGhlIE5UIGFjY291bnQgd2hpY2ggc3RhcnRzCitzc2hkLiBUaGUgdXNlciBrZXkgZmlsZXMgaGF2ZSB0byBiZSBvd25lZCBieSB0aGUgdXNlci4gVGhlIHBlcm1pc3Npb24KK2JpdHMgb2YgdGhlIHByaXZhdGUga2V5IGZpbGVzIChob3N0IGFuZCB1c2VyKSBoYXZlIHRvIGJlIGF0IGxlYXN0Citydy0tLS0tLS0gKDA2MDApIQorCitOb3RlIHRoYXQgdGhpcyBpcyBmb3JjZWQgdW5kZXIgYG50c2VjJyBvbmx5IGlmIHRoZSBmaWxlcyBhcmUgb24gYSBOVEZTCitmaWxlc3lzdGVtICh3aGljaCBpcyByZWNvbW1lbmRlZCkgZHVlIHRvIHRoZSBsYWNrIG9mIGFueSBiYXNpYyBzZWN1cml0eQorZmVhdHVyZXMgb2YgdGhlIEZBVC9GQVQzMiBmaWxlc3lzdGVtcy4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJZiB5b3UgYXJlIGluc3RhbGxpbmcgT3BlblNTSCB0aGUgZmlyc3QgdGltZSwgeW91IGNhbiBnZW5lcmF0ZSBnbG9iYWwgY29uZmlnCitmaWxlcyBhbmQgc2VydmVyIGtleXMgYnkgcnVubmluZworCisgICAvdXNyL2Jpbi9zc2gtaG9zdC1jb25maWcKKworTm90ZSB0aGF0IHRoaXMgYmluYXJ5IGFyY2hpdmUgZG9lc24ndCBjb250YWluIGRlZmF1bHQgY29uZmlnIGZpbGVzIGluIC9ldGMuCitUaGF0IGZpbGVzIGFyZSBvbmx5IGNyZWF0ZWQgaWYgc3NoLWhvc3QtY29uZmlnIGlzIHN0YXJ0ZWQuCisKK0lmIHlvdSBhcmUgdXBkYXRpbmcgeW91ciBpbnN0YWxsYXRpb24geW91IG1heSBydW4gdGhlIGFib3ZlIHNzaC1ob3N0LWNvbmZpZworYXMgd2VsbCB0byBtb3ZlIHlvdXIgY29uZmlndXJhdGlvbiBmaWxlcyB0byB0aGUgbmV3IGxvY2F0aW9uIGFuZCB0bworZXJhc2UgdGhlIGZpbGVzIGF0IHRoZSBvbGQgbG9jYXRpb24uCisKK1RvIHN1cHBvcnQgdGVzdGluZyBhbmQgdW5hdHRlbmRlZCBpbnN0YWxsYXRpb24gc3NoLWhvc3QtY29uZmlnIGdvdAorc29tZSBvcHRpb25zOgorCit1c2FnZTogc3NoLWhvc3QtY29uZmlnIFtPUFRJT05dLi4uCitPcHRpb25zOgorICAgIC0tZGVidWcgIC1kICAgICAgICAgICAgRW5hYmxlIHNoZWxsJ3MgZGVidWcgb3V0cHV0LgorICAgIC0teWVzICAgIC15ICAgICAgICAgICAgQW5zd2VyIGFsbCBxdWVzdGlvbnMgd2l0aCAieWVzIiBhdXRvbWF0aWNhbGx5LgorICAgIC0tbm8gICAgIC1uICAgICAgICAgICAgQW5zd2VyIGFsbCBxdWVzdGlvbnMgd2l0aCAibm8iIGF1dG9tYXRpY2FsbHkuCisgICAgLS1jeWd3aW4gLWMgPG9wdGlvbnM+ICBVc2UgIm9wdGlvbnMiIGFzIHZhbHVlIGZvciBDWUdXSU4gZW52aXJvbm1lbnQgdmFyLgorICAgIC0tcG9ydCAgIC1wIDxuPiAgICAgICAgc3NoZCBsaXN0ZW5zIG9uIHBvcnQgbi4KKyAgICAtLXB3ZCAgICAtdyA8cGFzc3dkPiAgIFVzZSAicHdkIiBhcyBwYXNzd29yZCBmb3IgdXNlciAnc3NoZF9zZXJ2ZXInLgorCitBZGRpdGlvbmFsbHkgc3NoLWhvc3QtY29uZmlnIG5vdyBhc2tzIGlmIGl0IHNob3VsZCBpbnN0YWxsIHNzaGQgYXMgYQorc2VydmljZSB3aGVuIHJ1bm5pbmcgdW5kZXIgTlQvVzJLLiBUaGlzIHJlcXVpcmVzIGN5Z3J1bnNydiBpbnN0YWxsZWQuCisKK1lvdSBjYW4gY3JlYXRlIHRoZSBwcml2YXRlIGFuZCBwdWJsaWMga2V5cyBmb3IgYSB1c2VyIG5vdyBieSBydW5uaW5nCisKKyAgL3Vzci9iaW4vc3NoLXVzZXItY29uZmlnCisKK3VuZGVyIHRoZSB1c2VycyBhY2NvdW50LgorCitUbyBzdXBwb3J0IHRlc3RpbmcgYW5kIHVuYXR0ZW5kZWQgaW5zdGFsbGF0aW9uIHNzaC11c2VyLWNvbmZpZyBnb3QKK3NvbWUgb3B0aW9ucyBhcyB3ZWxsOgorCit1c2FnZTogc3NoLXVzZXItY29uZmlnIFtPUFRJT05dLi4uCitPcHRpb25zOgorICAgIC0tZGVidWcgICAgICAtZCAgICAgICAgRW5hYmxlIHNoZWxsJ3MgZGVidWcgb3V0cHV0LgorICAgIC0teWVzICAgICAgICAteSAgICAgICAgQW5zd2VyIGFsbCBxdWVzdGlvbnMgd2l0aCAieWVzIiBhdXRvbWF0aWNhbGx5LgorICAgIC0tbm8gICAgICAgICAtbiAgICAgICAgQW5zd2VyIGFsbCBxdWVzdGlvbnMgd2l0aCAibm8iIGF1dG9tYXRpY2FsbHkuCisgICAgLS1wYXNzcGhyYXNlIC1wIHdvcmQgICBVc2UgIndvcmQiIGFzIHBhc3NwaHJhc2UgYXV0b21hdGljYWxseS4KKworSW5zdGFsbCBzc2hkIGFzIGRhZW1vbiB2aWEgY3lncnVuc3J2LmV4ZSAocmVjb21tZW5kZWQgb24gTlQvVzJLKSwgdmlhIGluZXRkCisocmVzdWx0cyBpbiB2ZXJ5IHNsb3cgZGVhbW9uIHN0YXJ0dXAhKSBvciBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKHJlY29tbWVuZGVkCitvbiA5WC9NRSkuCisKK0lmIHlvdSBzdGFydCBzc2hkIGFzIGRlYW1vbiB2aWEgY3lncnVuc3J2LmV4ZSB5b3UgTVVTVCBnaXZlIHRoZQorIi1EIiBvcHRpb24gdG8gc3NoZC4gT3RoZXJ3aXNlIHRoZSBzZXJ2aWNlIGNhbid0IGdldCBzdGFydGVkIGF0IGFsbC4KKworSWYgc3RhcnRpbmcgdmlhIGluZXRkLCBjb3B5IHNzaGQgdG8gZWcuIC91c3Ivc2Jpbi9pbi5zc2hkIGFuZCBhZGQgdGhlCitmb2xsb3dpbmcgbGluZSB0byB5b3VyIGluZXRkLmNvbmYgZmlsZToKKworc3NoIHN0cmVhbSB0Y3Agbm93YWl0IHJvb3QgL3Vzci9zYmluL2luLnNzaGQgc3NoZCAtaQorCitNb3Jlb3ZlciB5b3UnbGwgaGF2ZSB0byBhZGQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHlvdXIKKyR7U1lTVEVNUk9PVH0vc3lzdGVtMzIvZHJpdmVycy9ldGMvc2VydmljZXMgZmlsZToKKworICAgc3NoICAgICAgICAgMjIvdGNwICAgICAgICAgICNTU0ggZGFlbW9uCisKK1BsZWFzZSBub3RlIHRoYXQgT3BlblNTSCBkb2VzIG5ldmVyIHVzZSB0aGUgdmFsdWUgb2YgJEhPTUUgdG8KK3NlYXJjaCBmb3IgdGhlIHVzZXJzIGNvbmZpZ3VyYXRpb24gZmlsZXMhIEl0IGFsd2F5cyB1c2VzIHRoZQordmFsdWUgb2YgdGhlIHB3X2RpciBmaWVsZCBpbiAvZXRjL3Bhc3N3ZCBhcyB0aGUgaG9tZSBkaXJlY3RvcnkuCitJZiBubyBob21lIGRpcmV0b3J5IGlzIHNldCBpbiAvZXRjL3Bhc3N3ZCwgdGhlIHJvb3QgZGlyZWN0b3J5CitpcyB1c2VkIGluc3RlYWQhCisKK1lvdSBtYXkgdXNlIGFsbCBmZWF0dXJlcyBvZiB0aGUgQ1lHV0lOPW50c2VjIHNldHRpbmcgdGhlIHNhbWUKK3dheSBhcyB0aGV5IGFyZSB1c2VkIGJ5IEN5Z3dpbidzIGxvZ2luKDEpIHBvcnQ6CisKKyAgVGhlIHB3X2dlY29zIGZpZWxkIG1heSBjb250YWluIGFuIGFkZGl0aW9uYWwgZmllbGQsIHRoYXQgYmVnaW5zCisgIHdpdGggKHVwcGVyIGNhc2UhKSAiVS0iLCBmb2xsb3dlZCBieSB0aGUgZG9tYWluIGFuZCB0aGUgdXNlcm5hbWUKKyAgc2VwYXJhdGVkIGJ5IGEgYmFja3NsYXNoLgorICBDQVVUSU9OOiBUaGUgU0lEIF9tdXN0XyByZW1haW4gdGhlIF9sYXN0XyBmaWVsZCBpbiBwd19nZWNvcyEKKyAgQlRXOiBUaGUgZmllbGQgc2VwYXJhdG9yIGluIHB3X2dlY29zIGlzIHRoZSBjb21tYS4KKyAgVGhlIHVzZXJuYW1lIGluIHB3X25hbWUgaXRzZWxmIG1heSBiZSBhbnkgbmljZSBuYW1lOgorCisgICAgZG9tdXNlcjo6MTEwNDo1MTM6Sm9obiBEb2UsVS1kb21haW5cdXNlcixTLTEtNS0yMS0uLi4KKworICBOb3cgeW91IG1heSB1c2UgYGRvbXVzZXInIGFzIHlvdXIgbG9naW4gbmFtZSB3aXRoIHRlbG5ldCEKKyAgVGhpcyBpcyBwb3NzaWJsZSBhZGRpdGlvbmFsbHkgZm9yIGxvY2FsIHVzZXJzLCBpZiB5b3UgZG9uJ3QgbGlrZQorICB5b3VyIE5UIGxvZ2luIG5hbWUgOy0pIFlvdSBvbmx5IGhhdmUgdG8gbGVhdmUgb3V0IHRoZSBkb21haW46CisKKyAgICBsb2N1c2VyOjoxMTA0OjUxMzpKb2huIERvZSxVLXVzZXIsUy0xLTUtMjEtLi4uCisKK05vdGUgdGhhdCB0aGUgQ1lHV0lOPW50c2VjIHNldHRpbmcgaXMgcmVxdWlyZWQgZm9yIHB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24uCisKK1NTSDIgc2VydmVyIGFuZCB1c2VyIGtleXMgYXJlIGdlbmVyYXRlZCBieSB0aGUgYHNzaC0qLWNvbmZpZycgc2NyaXB0cworYXMgd2VsbC4KKworSWYgeW91IHdhbnQgdG8gYnVpbGQgZnJvbSBzb3VyY2UsIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB0bworY29uZmlndXJlIGFyZSB1c2VkIGZvciB0aGUgQ3lnd2luIGJpbmFyeSBkaXN0cmlidXRpb246CisKKwktLXByZWZpeD0vdXNyIFwKKwktLXN5c2NvbmZkaXI9L2V0YyBcCisJLS1saWJleGVjZGlyPScke3NiaW5kaXJ9JyBcCisJLS1sb2NhbHN0YXRlZGlyPS92YXIgXAorCS0tZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJyBcCisJLS1tYW5kaXI9JyR7ZGF0YWRpcn0vbWFuJyBcCisJLS1pbmZvZGlyPScke2RhdGFkaXJ9L2luZm8nCisJLS13aXRoLXRjcC13cmFwcGVycworCS0td2l0aC1saWJlZGl0CisKK0lmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIEN5Z3dpbiBwYWNrYWdlLCBlcXVpdmFsZW50IHRvIHRoZSBvbmUKK2luIHRoZSBDeWd3aW4gYmluYXJ5IGRpc3RyaWJ1dGlvbiwgaW5zdGFsbCBsaWtlIHRoaXM6CisKKwlta2RpciAvdG1wL2N5Z3dpbi1zc2gKKwljZCAke2J1aWxkZGlyfQorCW1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvY3lnd2luLXNzaAorCWNkICR7c3JjZGlyfS9jb250cmliL2N5Z3dpbgorCW1ha2UgY3lnd2luLXBvc3RpbnN0YWxsIERFU1RESVI9L3RtcC9jeWd3aW4tc3NoCisJY2QgL3RtcC9jeWd3aW4tc3NoCisJZmluZCAqIFwhIC10eXBlIGQgfCB0YXIgY3ZqZlQgbXktb3BlbnNzaC50YXIuYnoyIC0KKworWW91IG11c3QgaGF2ZSBpbnN0YWxsZWQgdGhlIGZvbGxvd2luZyBwYWNrYWdlcyB0byBiZSBhYmxlIHRvIGJ1aWxkIE9wZW5TU0g6CisKKy0gemxpYgorLSBvcGVuc3NsLWRldmVsCisKK0lmIHlvdSB3YW50IHRvIGJ1aWxkIHdpdGggLS13aXRoLXRjcC13cmFwcGVycywgeW91IGFsc28gbmVlZCB0aGUgcGFja2FnZQorCistIHRjcF93cmFwcGVycworCitJZiB5b3Ugd2FudCB0byBidWlsZCB3aXRoIC0td2l0aC1saWJlZGl0LCB5b3UgYWxzbyBuZWVkIHRoZSBwYWNrYWdlCisKKy0gbGliZWRpdC1kZXZlbAorCitQbGVhc2Ugc2VuZCByZXF1ZXN0cywgZXJyb3IgcmVwb3J0cyBldGMuIHRvIGN5Z3dpbkBjeWd3aW4uY29tLgorCisKK0hhdmUgZnVuLAorCitDb3Jpbm5hIFZpbnNjaGVuCitDeWd3aW4gRGV2ZWxvcGVyCitSZWQgSGF0IEluYy4KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvY29udHJpYi9jeWd3aW4vc3NoLWhvc3QtY29uZmlnIGIvb3BlbnNzaC02LjBwMS9jb250cmliL2N5Z3dpbi9zc2gtaG9zdC1jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjMzlhNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9jeWd3aW4vc3NoLWhvc3QtY29uZmlnCkBAIC0wLDAgKzEsNzU3IEBACisjIS9iaW4vYmFzaAorIworIyBzc2gtaG9zdC1jb25maWcsIENvcHlyaWdodCAyMDAwLTIwMTEgUmVkIEhhdCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDeWd3aW4gcG9ydCBvZiBPcGVuU1NILgorIworIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyMgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyAgCisjIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAKKyMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgIAorIyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sICAgCisjIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAKKyMgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgIAorIyBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBJbml0aWFsaXphdGlvbgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NTSUhfU0NSSVBUPS91c3Ivc2hhcmUvY3NpaC9jeWd3aW4tc2VydmljZS1pbnN0YWxsYXRpb24taGVscGVyLnNoCisKKyMgTGlzdCBvZiBhcHBzIHVzZWQuICBUaGlzIGlzIGNoZWNrYWQgZm9yIGV4aXN0YW5jZSBpbiBjc2loX3Nhbml0eV9jaGVjaworIyBEb24ndCB1c2UgKmFueSogdHJhbnNpZW50IGNvbW1hbmRzIGJlZm9yZSBzb3VyY2luZyB0aGUgY3NpaCBoZWxwZXIgc2NyaXB0LAorIyBvdGhlcndpc2UgdGhlIHNhbml0eSBjaGVja3MgYXJlIHNob3J0LWNpcmN1aXRlZC4KK2RlY2xhcmUgLWEgY3NpaF9yZXF1aXJlZF9jb21tYW5kcz0oCisgIC91c3IvYmluL2Jhc2VuYW1lIGNvcmV1dGlscworICAvdXNyL2Jpbi9jYXQgY29yZXV0aWxzCisgIC91c3IvYmluL2NobW9kIGNvcmV1dGlscworICAvdXNyL2Jpbi9kaXJuYW1lIGNvcmV1dGlscworICAvdXNyL2Jpbi9pZCBjb3JldXRpbHMKKyAgL3Vzci9iaW4vbXYgY29yZXV0aWxzCisgIC91c3IvYmluL3JtIGNvcmV1dGlscworICAvdXNyL2Jpbi9jeWdwYXRoIGN5Z3dpbgorICAvdXNyL2Jpbi9tb3VudCBjeWd3aW4KKyAgL3Vzci9iaW4vcHMgY3lnd2luCisgIC91c3IvYmluL3NldGZhY2wgY3lnd2luCisgIC91c3IvYmluL3Vtb3VudCBjeWd3aW4KKyAgL3Vzci9iaW4vY21wIGRpZmZ1dGlscworICAvdXNyL2Jpbi9ncmVwIGdyZXAKKyAgL3Vzci9iaW4vYXdrIGdhd2sKKyAgL3Vzci9iaW4vc3NoLWtleWdlbiBvcGVuc3NoCisgIC91c3Ivc2Jpbi9zc2hkIG9wZW5zc2gKKyAgL3Vzci9iaW4vc2VkIHNlZAorKQorY3NpaF9zYW5pdHlfY2hlY2tfc2VydmVyPXllcworc291cmNlICR7Q1NJSF9TQ1JJUFR9CisKK1BST0dOQU1FPSQoL3Vzci9iaW4vYmFzZW5hbWUgJDApCitfdGRpcj0kKC91c3IvYmluL2Rpcm5hbWUgJDApCitQUk9HRElSPSQoY2QgJF90ZGlyICYmIHB3ZCkKKworIyBTdWJkaXJlY3Rvcnkgd2hlcmUgdGhlIG5ldyBwYWNrYWdlIGlzIGJlaW5nIGluc3RhbGxlZAorUFJFRklYPS91c3IKKworIyBEaXJlY3Rvcnkgd2hlcmUgdGhlIGNvbmZpZyBmaWxlcyBhcmUgc3RvcmVkCitTWVNDT05GRElSPS9ldGMKK0xPQ0FMU1RBVEVESVI9L3ZhcgorCitwb3J0X251bWJlcj0yMgorcHJpdnNlcF9jb25maWd1cmVkPW5vCitwcml2c2VwX3VzZWQ9eWVzCitjeWd3aW5fdmFsdWU9IiIKK3VzZXJfYWNjb3VudD0KK3Bhc3N3b3JkX3ZhbHVlPQorb3B0X2ZvcmNlPW5vCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBSb3V0aW5lOiBjcmVhdGVfaG9zdF9rZXlzCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2NyZWF0ZV9ob3N0X2tleXMoKSB7CisgIGxvY2FsIHJldD0wCisKKyAgaWYgWyAhIC1mICIke1NZU0NPTkZESVJ9L3NzaF9ob3N0X2tleSIgXQorICB0aGVuCisgICAgY3NpaF9pbmZvcm0gIkdlbmVyYXRpbmcgJHtTWVNDT05GRElSfS9zc2hfaG9zdF9rZXkiCisgICAgaWYgISAvdXNyL2Jpbi9zc2gta2V5Z2VuIC10IHJzYTEgLWYgJHtTWVNDT05GRElSfS9zc2hfaG9zdF9rZXkgLU4gJycgPiAvZGV2L251bGwKKyAgICB0aGVuCisgICAgCWNzaWhfd2FybmluZyAiR2VuZXJhdGluZyAke1NZU0NPTkZESVJ9L3NzaF9ob3N0X2tleSBmYWlsZWQhIgorCWxldCArK3JldAorICAgIGZpCisgIGZpCisKKyAgaWYgWyAhIC1mICIke1NZU0NPTkZESVJ9L3NzaF9ob3N0X3JzYV9rZXkiIF0KKyAgdGhlbgorICAgIGNzaWhfaW5mb3JtICJHZW5lcmF0aW5nICR7U1lTQ09ORkRJUn0vc3NoX2hvc3RfcnNhX2tleSIKKyAgICBpZiAhIC91c3IvYmluL3NzaC1rZXlnZW4gLXQgcnNhIC1mICR7U1lTQ09ORkRJUn0vc3NoX2hvc3RfcnNhX2tleSAtTiAnJyA+IC9kZXYvbnVsbAorICAgIHRoZW4KKyAgICAJY3NpaF93YXJuaW5nICJHZW5lcmF0aW5nICR7U1lTQ09ORkRJUn0vc3NoX2hvc3Rfa2V5IGZhaWxlZCEiCisJbGV0ICsrcmV0CisgICAgZmkKKyAgZmkKKworICBpZiBbICEgLWYgIiR7U1lTQ09ORkRJUn0vc3NoX2hvc3RfZHNhX2tleSIgXQorICB0aGVuCisgICAgY3NpaF9pbmZvcm0gIkdlbmVyYXRpbmcgJHtTWVNDT05GRElSfS9zc2hfaG9zdF9kc2Ffa2V5IgorICAgIGlmICEgL3Vzci9iaW4vc3NoLWtleWdlbiAtdCBkc2EgLWYgJHtTWVNDT05GRElSfS9zc2hfaG9zdF9kc2Ffa2V5IC1OICcnID4gL2Rldi9udWxsCisgICAgdGhlbgorICAgIAljc2loX3dhcm5pbmcgIkdlbmVyYXRpbmcgJHtTWVNDT05GRElSfS9zc2hfaG9zdF9rZXkgZmFpbGVkISIKKwlsZXQgKytyZXQKKyAgICBmaQorICBmaQorCisgIGlmIFsgISAtZiAiJHtTWVNDT05GRElSfS9zc2hfaG9zdF9lY2RzYV9rZXkiIF0KKyAgdGhlbgorICAgIGNzaWhfaW5mb3JtICJHZW5lcmF0aW5nICR7U1lTQ09ORkRJUn0vc3NoX2hvc3RfZWNkc2Ffa2V5IgorICAgIGlmICEgL3Vzci9iaW4vc3NoLWtleWdlbiAtdCBlY2RzYSAtZiAke1NZU0NPTkZESVJ9L3NzaF9ob3N0X2VjZHNhX2tleSAtTiAnJyA+IC9kZXYvbnVsbAorICAgIHRoZW4KKyAgICAJY3NpaF93YXJuaW5nICJHZW5lcmF0aW5nICR7U1lTQ09ORkRJUn0vc3NoX2hvc3Rfa2V5IGZhaWxlZCEiCisJbGV0ICsrcmV0CisgICAgZmkKKyAgZmkKKyAgcmV0dXJuICRyZXQKK30gIyAtLS0gRW5kIG9mIGNyZWF0ZV9ob3N0X2tleXMgLS0tICMKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFJvdXRpbmU6IHVwZGF0ZV9zZXJ2aWNlc19maWxlCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3VwZGF0ZV9zZXJ2aWNlc19maWxlKCkgeworICBsb2NhbCBfbXlfZXRjZGlyPSIvc3NoLWhvc3QtY29uZmlnLiQkIgorICBsb2NhbCBfd2luX2V0Y2RpcgorICBsb2NhbCBfc2VydmljZXMKKyAgbG9jYWwgX3NwYWNlcworICBsb2NhbCBfc2Vydl90bXAKKyAgbG9jYWwgX3dzZXJ2aWNlcworICBsb2NhbCByZXQ9MAorCisgIF93aW5fZXRjZGlyPSIke1NZU1RFTVJPT1R9XFxzeXN0ZW0zMlxcZHJpdmVyc1xcZXRjIgorICBfc2VydmljZXM9IiR7X215X2V0Y2Rpcn0vc2VydmljZXMiCisgIF9zcGFjZXM9IiAgICAgICAgICAgICAgICAgICAgICAgICAgICMiCisgIF9zZXJ2X3RtcD0iJHtfbXlfZXRjZGlyfS9zcnYub3V0LiQkIgorCisgIC91c3IvYmluL21vdW50IC1vIHRleHQscG9zaXg9MCxub2FjbCAtZiAiJHtfd2luX2V0Y2Rpcn0iICIke19teV9ldGNkaXJ9IgorCisgICMgRGVwZW5kcyBvbiB0aGUgYWJvdmUgbW91bnQKKyAgX3dzZXJ2aWNlcz1gY3lncGF0aCAtdyAiJHtfc2VydmljZXN9ImAKKworICAjIFJlbW92ZSBzc2hkIDIyL3BvcnQgZnJvbSBzZXJ2aWNlcworICBpZiBbIGAvdXNyL2Jpbi9ncmVwIC1xICdzc2hkWyBcdF1bIFx0XSoyMicgIiR7X3NlcnZpY2VzfSI7IGVjaG8gJD9gIC1lcSAwIF0KKyAgdGhlbgorICAgIC91c3IvYmluL2dyZXAgLXYgJ3NzaGRbIFx0XVsgXHRdKjIyJyAiJHtfc2VydmljZXN9IiA+ICIke19zZXJ2X3RtcH0iCisgICAgaWYgWyAtZiAiJHtfc2Vydl90bXB9IiBdCisgICAgdGhlbgorICAgICAgaWYgL3Vzci9iaW4vbXYgIiR7X3NlcnZfdG1wfSIgIiR7X3NlcnZpY2VzfSIKKyAgICAgIHRoZW4KKwljc2loX2luZm9ybSAiUmVtb3Zpbmcgc3NoZCBmcm9tICR7X3dzZXJ2aWNlc30iCisgICAgICBlbHNlCisJY3NpaF93YXJuaW5nICJSZW1vdmluZyBzc2hkIGZyb20gJHtfd3NlcnZpY2VzfSBmYWlsZWQhIgorCWxldCArK3JldAorICAgICAgZmkKKyAgICAgIC91c3IvYmluL3JtIC1mICIke19zZXJ2X3RtcH0iCisgICAgZWxzZQorICAgICAgY3NpaF93YXJuaW5nICJSZW1vdmluZyBzc2hkIGZyb20gJHtfd3NlcnZpY2VzfSBmYWlsZWQhIgorICAgICAgbGV0ICsrcmV0CisgICAgZmkKKyAgZmkKKworICAjIEFkZCBzc2ggMjIvdGNwICBhbmQgc3NoIDIyL3VkcCB0byBzZXJ2aWNlcworICBpZiBbIGAvdXNyL2Jpbi9ncmVwIC1xICdzc2hbIFx0XVsgXHRdKjIyJyAiJHtfc2VydmljZXN9IjsgZWNobyAkP2AgLW5lIDAgXQorICB0aGVuCisgICAgaWYgL3Vzci9iaW4vYXdrICd7IGlmICggJDIgfiAvXjIzXC90Y3AvICkgcHJpbnQgInNzaCAgICAgICAgICAgICAgICAyMi90Y3AnIiR7X3NwYWNlc30iJ1NTSCBSZW1vdGUgTG9naW4gUHJvdG9jb2xcbnNzaCAgICAgICAgICAgICAgICAyMi91ZHAnIiR7X3NwYWNlc30iJ1NTSCBSZW1vdGUgTG9naW4gUHJvdG9jb2wiOyBwcmludCAkMDsgfScgPCAiJHtfc2VydmljZXN9IiA+ICIke19zZXJ2X3RtcH0iCisgICAgdGhlbgorICAgICAgaWYgL3Vzci9iaW4vbXYgIiR7X3NlcnZfdG1wfSIgIiR7X3NlcnZpY2VzfSIKKyAgICAgIHRoZW4KKwljc2loX2luZm9ybSAiQWRkZWQgc3NoIHRvICR7X3dzZXJ2aWNlc30iCisgICAgICBlbHNlCisJY3NpaF93YXJuaW5nICJBZGRpbmcgc3NoIHRvICR7X3dzZXJ2aWNlc30gZmFpbGVkISIKKwlsZXQgKytyZXQKKyAgICAgIGZpCisgICAgICAvdXNyL2Jpbi9ybSAtZiAiJHtfc2Vydl90bXB9IgorICAgIGVsc2UKKyAgICAgIGNzaWhfd2FybmluZyAiQWRkaW5nIHNzaCB0byAke193c2VydmljZXN9IGZhaWxlZCEiCisgICAgICBsZXQgKytyZXQKKyAgICBmaQorICBmaQorICAvdXNyL2Jpbi91bW91bnQgIiR7X215X2V0Y2Rpcn0iCisgIHJldHVybiAkcmV0Cit9ICMgLS0tIEVuZCBvZiB1cGRhdGVfc2VydmljZXNfZmlsZSAtLS0gIworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgUm91dGluZTogc3NoZF9wcml2c2VwCisjICBNT0RJRklFUzogcHJpdnNlcF9jb25maWd1cmVkICBwcml2c2VwX3VzZWQKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorc3NoZF9wcml2c2VwKCkgeworICBsb2NhbCBzc2hkY29uZmlnX3RtcAorICBsb2NhbCByZXQ9MAorCisgIGlmIFsgIiR7cHJpdnNlcF9jb25maWd1cmVkfSIgIT0gInllcyIgXQorICB0aGVuCisgICAgY3NpaF9pbmZvcm0gIlByaXZpbGVnZSBzZXBhcmF0aW9uIGlzIHNldCB0byB5ZXMgYnkgZGVmYXVsdCBzaW5jZSBPcGVuU1NIIDMuMy4iCisgICAgY3NpaF9pbmZvcm0gIkhvd2V2ZXIsIHRoaXMgcmVxdWlyZXMgYSBub24tcHJpdmlsZWdlZCBhY2NvdW50IGNhbGxlZCAnc3NoZCcuIgorICAgIGNzaWhfaW5mb3JtICJGb3IgbW9yZSBpbmZvIG9uIHByaXZpbGVnZSBzZXBhcmF0aW9uIHJlYWQgL3Vzci9zaGFyZS9kb2Mvb3BlbnNzaC9SRUFETUUucHJpdnNlcC4iCisgICAgaWYgY3NpaF9yZXF1ZXN0ICJTaG91bGQgcHJpdmlsZWdlIHNlcGFyYXRpb24gYmUgdXNlZD8iCisgICAgdGhlbgorICAgICAgcHJpdnNlcF91c2VkPXllcworICAgICAgaWYgISBjc2loX2NyZWF0ZV91bnByaXZpbGVnZWRfdXNlciBzc2hkCisgICAgICB0aGVuCisJY3NpaF9lcnJvcl9yZWNvdmVyYWJsZSAiQ291bGRuJ3QgY3JlYXRlIHVzZXIgJ3NzaGQnISIKKwljc2loX2Vycm9yX3JlY292ZXJhYmxlICJQcml2aWxlZ2Ugc2VwYXJhdGlvbiBzZXQgdG8gJ25vJyBhZ2FpbiEiCisJY3NpaF9lcnJvcl9yZWNvdmVyYWJsZSAiQ2hlY2sgeW91ciAke1NZU0NPTkZESVJ9L3NzaGRfY29uZmlnIGZpbGUhIgorCWxldCArK3JldAorCXByaXZzZXBfdXNlZD1ubworICAgICAgZmkKKyAgICBlbHNlCisgICAgICBwcml2c2VwX3VzZWQ9bm8KKyAgICBmaQorICBmaQorCisgICMgQ3JlYXRlIGRlZmF1bHQgc3NoZF9jb25maWcgZnJvbSBza2VsZXRvbiBmaWxlcyBpbiAvZXRjL2RlZmF1bHRzL2V0YyBvcgorICAjIG1vZGlmeSB0byBhZGQgdGhlIG1pc3NpbmcgcHJpdnNlcCBjb25maWd1cmF0aW9uIG9wdGlvbgorICBpZiAvdXNyL2Jpbi9jbXAgIiR7U1lTQ09ORkRJUn0vc3NoZF9jb25maWciICIke1NZU0NPTkZESVJ9L2RlZmF1bHRzLyR7U1lTQ09ORkRJUn0vc3NoZF9jb25maWciID4vZGV2L251bGwgMj4mMQorICB0aGVuCisgICAgY3NpaF9pbmZvcm0gIlVwZGF0aW5nICR7U1lTQ09ORkRJUn0vc3NoZF9jb25maWcgZmlsZSIKKyAgICBzc2hkY29uZmlnX3RtcD0ke1NZU0NPTkZESVJ9L3NzaGRfY29uZmlnLiQkCisgICAgL3Vzci9iaW4vc2VkIC1lICJzL14jVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiB5ZXMvVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiAke3ByaXZzZXBfdXNlZH0vCisgIAkgIHMvXiNQb3J0IDIyL1BvcnQgJHtwb3J0X251bWJlcn0vCisgIAkgIHMvXiNTdHJpY3RNb2RlcyB5ZXMvU3RyaWN0TW9kZXMgbm8vIiBcCisJPCAke1NZU0NPTkZESVJ9L3NzaGRfY29uZmlnIFwKKwk+ICIke3NzaGRjb25maWdfdG1wfSIKKyAgICBpZiAhIC91c3IvYmluL212ICIke3NzaGRjb25maWdfdG1wfSIgJHtTWVNDT05GRElSfS9zc2hkX2NvbmZpZworICAgIHRoZW4KKwljc2loX3dhcm5pbmcgIlNldHRpbmcgcHJpdmlsZWdlIHNlcGFyYXRpb24gdG8gJ3llcycgZmFpbGVkISIKKwljc2loX3dhcm5pbmcgIkNoZWNrIHlvdXIgJHtTWVNDT05GRElSfS9zc2hkX2NvbmZpZyBmaWxlISIKKwlsZXQgKytyZXQKKyAgICBmaQorICBlbGlmIFsgIiR7cHJpdnNlcF9jb25maWd1cmVkfSIgIT0gInllcyIgXQorICB0aGVuCisgICAgZWNobyA+PiAke1NZU0NPTkZESVJ9L3NzaGRfY29uZmlnCisgICAgaWYgISBlY2hvICJVc2VQcml2aWxlZ2VTZXBhcmF0aW9uICR7cHJpdnNlcF91c2VkfSIgPj4gJHtTWVNDT05GRElSfS9zc2hkX2NvbmZpZworICAgIHRoZW4KKwljc2loX3dhcm5pbmcgIlNldHRpbmcgcHJpdmlsZWdlIHNlcGFyYXRpb24gdG8gJ3llcycgZmFpbGVkISIKKwljc2loX3dhcm5pbmcgIkNoZWNrIHlvdXIgJHtTWVNDT05GRElSfS9zc2hkX2NvbmZpZyBmaWxlISIKKwlsZXQgKytyZXQKKyAgICBmaQorICBmaQorICByZXR1cm4gJHJldAorfSAjIC0tLSBFbmQgb2Ygc3NoZF9wcml2c2VwIC0tLSAjCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBSb3V0aW5lOiB1cGRhdGVfaW5ldGRfY29uZgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit1cGRhdGVfaW5ldGRfY29uZigpIHsKKyAgbG9jYWwgX2luZXRjbmY9IiR7U1lTQ09ORkRJUn0vaW5ldGQuY29uZiIKKyAgbG9jYWwgX2luZXRjbmZfdG1wPSIke1NZU0NPTkZESVJ9L2luZXRkLmNvbmYuJCQiCisgIGxvY2FsIF9pbmV0Y25mX2Rpcj0iJHtTWVNDT05GRElSfS9pbmV0ZC5kIgorICBsb2NhbCBfc3NoZF9pbmV0ZF9jb25mPSIke19pbmV0Y25mX2Rpcn0vc3NoZC1pbmV0ZCIKKyAgbG9jYWwgX3NzaGRfaW5ldGRfY29uZl90bXA9IiR7X2luZXRjbmZfZGlyfS9zc2hkLWluZXRkLiQkIgorICBsb2NhbCBfd2l0aF9jb21tZW50PTEKKyAgbG9jYWwgcmV0PTAKKworICBpZiBbIC1kICIke19pbmV0Y25mX2Rpcn0iIF0KKyAgdGhlbgorICAgICMgd2UgaGF2ZSBpbmV0dXRpbHMtMS41IGluZXRkLmQgc3VwcG9ydAorICAgIGlmIFsgLWYgIiR7X2luZXRjbmZ9IiBdCisgICAgdGhlbgorICAgICAgL3Vzci9iaW4vZ3JlcCAtcSAnXlsgXHRdKnNzaCcgIiR7X2luZXRjbmZ9IiAmJiBfd2l0aF9jb21tZW50PTAKKworICAgICAgIyBjaGVjayBmb3Igc3NoZCBPUiBzc2ggaW4gdG9wLWxldmVsIGluZXRkLmNvbmYgZmlsZSwgYW5kIHJlbW92ZQorICAgICAgIyB3aWxsIGJlIHJlcGxhY2VkIGJ5IGEgZmlsZSBpbiBpbmV0ZC5kLworICAgICAgaWYgWyBgL3Vzci9iaW4vZ3JlcCAtcSAnXlsjIFx0XSpzc2gnICIke19pbmV0Y25mfSI7IGVjaG8gJD9gIC1lcSAwIF0KKyAgICAgIHRoZW4KKwkvdXNyL2Jpbi9ncmVwIC12ICdeWyMgXHRdKnNzaCcgIiR7X2luZXRjbmZ9IiA+PiAiJHtfaW5ldGNuZl90bXB9IgorCWlmIFsgLWYgIiR7X2luZXRjbmZfdG1wfSIgXQorCXRoZW4KKwkgIGlmIC91c3IvYmluL212ICIke19pbmV0Y25mX3RtcH0iICIke19pbmV0Y25mfSIKKwkgIHRoZW4KKyAgCSAgICBjc2loX2luZm9ybSAiUmVtb3ZlZCBzc2hbZF0gZnJvbSAke19pbmV0Y25mfSIKKwkgIGVsc2UKKyAgCSAgICBjc2loX3dhcm5pbmcgIlJlbW92aW5nIHNzaFtkXSBmcm9tICR7X2luZXRjbmZ9IGZhaWxlZCEiCisJICAgIGxldCArK3JldAorCSAgZmkKKwkgIC91c3IvYmluL3JtIC1mICIke19pbmV0Y25mX3RtcH0iCisJZWxzZQorCSAgY3NpaF93YXJuaW5nICJSZW1vdmluZyBzc2hbZF0gZnJvbSAke19pbmV0Y25mfSBmYWlsZWQhIgorCSAgbGV0ICsrcmV0CisJZmkKKyAgICAgIGZpCisgICAgZmkKKworICAgIGNzaWhfaW5zdGFsbF9jb25maWcgIiR7X3NzaGRfaW5ldGRfY29uZn0iICAgIiR7U1lTQ09ORkRJUn0vZGVmYXVsdHMiCisgICAgaWYgL3Vzci9iaW4vY21wICIke1NZU0NPTkZESVJ9L2RlZmF1bHRzJHtfc3NoZF9pbmV0ZF9jb25mfSIgIiR7X3NzaGRfaW5ldGRfY29uZn0iID4vZGV2L251bGwgMj4mMQorICAgIHRoZW4KKyAgICAgIGlmIFsgIiR7X3dpdGhfY29tbWVudH0iIC1lcSAwIF0KKyAgICAgIHRoZW4KKwkvdXNyL2Jpbi9zZWQgLWUgJ3MvQENPTU1FTlRAWyBcdF0qLy8nIDwgIiR7X3NzaGRfaW5ldGRfY29uZn0iID4gIiR7X3NzaGRfaW5ldGRfY29uZl90bXB9IgorICAgICAgZWxzZQorCS91c3IvYmluL3NlZCAtZSAncy9AQ09NTUVOVEBbIFx0XSovIyAvJyA8ICIke19zc2hkX2luZXRkX2NvbmZ9IiA+ICIke19zc2hkX2luZXRkX2NvbmZfdG1wfSIKKyAgICAgIGZpCisgICAgICBpZiAvdXNyL2Jpbi9tdiAiJHtfc3NoZF9pbmV0ZF9jb25mX3RtcH0iICIke19zc2hkX2luZXRkX2NvbmZ9IgorICAgICAgdGhlbgorCWNzaWhfaW5mb3JtICJVcGRhdGVkICR7X3NzaGRfaW5ldGRfY29uZn0iCisgICAgICBlbHNlCisJY3NpaF93YXJuaW5nICJVcGRhdGluZyAke19zc2hkX2luZXRkX2NvbmZ9IGZhaWxlZCEiCisJbGV0ICsrcmV0CisgICAgICBmaQorICAgIGZpCisKKyAgZWxpZiBbIC1mICIke19pbmV0Y25mfSIgXQorICB0aGVuCisgICAgL3Vzci9iaW4vZ3JlcCAtcSAnXlsgXHRdKnNzaGQnICIke19pbmV0Y25mfSIgJiYgX3dpdGhfY29tbWVudD0wCisKKyAgICAjIGNoZWNrIGZvciBzc2hkIGluIHRvcC1sZXZlbCBpbmV0ZC5jb25mIGZpbGUsIGFuZCByZW1vdmUKKyAgICAjIHdpbGwgYmUgcmVwbGFjZWQgYnkgYSBmaWxlIGluIGluZXRkLmQvCisgICAgaWYgWyBgL3Vzci9iaW4vZ3JlcCAtcSAnXlsjIFx0XSpzc2hkJyAiJHtfaW5ldGNuZn0iOyBlY2hvICQ/YCAtZXEgMCBdCisgICAgdGhlbgorICAgICAgL3Vzci9iaW4vZ3JlcCAtdiAnXlsjIFx0XSpzc2hkJyAiJHtfaW5ldGNuZn0iID4+ICIke19pbmV0Y25mX3RtcH0iCisgICAgICBpZiBbIC1mICIke19pbmV0Y25mX3RtcH0iIF0KKyAgICAgIHRoZW4KKwlpZiAvdXNyL2Jpbi9tdiAiJHtfaW5ldGNuZl90bXB9IiAiJHtfaW5ldGNuZn0iCisJdGhlbgorCSAgICBjc2loX2luZm9ybSAiUmVtb3ZlZCBzc2hkIGZyb20gJHtfaW5ldGNuZn0iCisJZWxzZQorCSAgICBjc2loX3dhcm5pbmcgIlJlbW92aW5nIHNzaGQgZnJvbSAke19pbmV0Y25mfSBmYWlsZWQhIgorCSAgICBsZXQgKytyZXQKKwlmaQorCS91c3IvYmluL3JtIC1mICIke19pbmV0Y25mX3RtcH0iCisgICAgICBlbHNlCisJY3NpaF93YXJuaW5nICJSZW1vdmluZyBzc2hkIGZyb20gJHtfaW5ldGNuZn0gZmFpbGVkISIKKwlsZXQgKytyZXQKKyAgICAgIGZpCisgICAgZmkKKworICAgICMgQWRkIHNzaCBsaW5lIHRvIGluZXRkLmNvbmYKKyAgICBpZiBbIGAvdXNyL2Jpbi9ncmVwIC1xICdeWyMgXHRdKnNzaCcgIiR7X2luZXRjbmZ9IjsgZWNobyAkP2AgLW5lIDAgXQorICAgIHRoZW4KKyAgICAgIGlmIFsgIiR7X3dpdGhfY29tbWVudH0iIC1lcSAwIF0KKyAgICAgIHRoZW4KKwllY2hvICdzc2ggIHN0cmVhbSAgdGNwICAgICBub3dhaXQgIHJvb3QgICAgL3Vzci9zYmluL3NzaGQgc3NoZCAtaScgPj4gIiR7X2luZXRjbmZ9IgorICAgICAgZWxzZQorCWVjaG8gJyMgc3NoICBzdHJlYW0gIHRjcCAgICAgbm93YWl0ICByb290ICAgIC91c3Ivc2Jpbi9zc2hkIHNzaGQgLWknID4+ICIke19pbmV0Y25mfSIKKyAgICAgIGZpCisgICAgICBpZiBbICQ/IC1lcSAwIF0KKyAgICAgIHRoZW4KKwljc2loX2luZm9ybSAiQWRkZWQgc3NoIHRvICR7X2luZXRjbmZ9IgorICAgICAgZWxzZQorCWNzaWhfd2FybmluZyAiQWRkaW5nIHNzaCB0byAke19pbmV0Y25mfSBmYWlsZWQhIgorCWxldCArK3JldAorICAgICAgZmkKKyAgICBmaQorICBmaQorICByZXR1cm4gJHJldAorfSAjIC0tLSBFbmQgb2YgdXBkYXRlX2luZXRkX2NvbmYgLS0tICMKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFJvdXRpbmU6IGNoZWNrX3NlcnZpY2VfZmlsZXNfb3duZXJzaGlwCisjICAgQ2hlY2tzIHRoYXQgdGhlIGZpbGVzIGluIC9ldGMgYW5kIC92YXIgYmVsb25nIHRvIHRoZSByaWdodCBvd25lcgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitjaGVja19zZXJ2aWNlX2ZpbGVzX293bmVyc2hpcCgpIHsKKyAgbG9jYWwgcnVuX3NlcnZpY2VfYXM9JDEKKyAgbG9jYWwgcmV0PTAKKworICBpZiBbIC16ICIke3J1bl9zZXJ2aWNlX2FzfSIgXQorICB0aGVuCisgICAgYWNjbnRfbmFtZT0kKC91c3IvYmluL2N5Z3J1bnNydiAtVlEgc3NoZCB8IC91c3IvYmluL3NlZCAtbmUgJ3MvXkFjY291bnQgKjogKi8vZ3AnKQorICAgIGlmIFsgIiR7YWNjbnRfbmFtZX0iID0gIkxvY2FsU3lzdGVtIiBdCisgICAgdGhlbgorICAgICAgIyBDb252ZXJ0ICJMb2NhbFN5c3RlbSIgdG8gIlNZU1RFTSIgYXMgaXMgdGhlIGNvcnJlY3QgYWNjb3VudCBuYW1lCisgICAgICBhY2NudF9uYW1lPSJTWVNURU06IgorICAgIGVsaWYgW1sgIiR7YWNjbnRfbmFtZX0iID1+IF5cLlxcIF1dCisgICAgdGhlbgorICAgICAgIyBDb252ZXJ0ICIuIiBkb21haW4gdG8gbG9jYWwgbWFjaGluZSBuYW1lCisgICAgICBhY2NudF9uYW1lPSJVLSR7Q09NUFVURVJOQU1FfSR7YWNjbnRfbmFtZSMufSwiCisgICAgZmkKKyAgICBydW5fc2VydmljZV9hcz0kKC91c3IvYmluL2dyZXAgLUZpICIke2FjY250X25hbWV9IiAvZXRjL3Bhc3N3ZCB8IC91c3IvYmluL2F3ayAtRjogJ3twcmludCAkMTt9JykKKyAgICBpZiBbIC16ICIke3J1bl9zZXJ2aWNlX2FzfSIgXQorICAgIHRoZW4KKyAgICAgIGNzaWhfd2FybmluZyAiQ291bGRuJ3QgZGV0ZXJtaW5lIG5hbWUgb2YgdXNlciBydW5uaW5nIHNzaGQgc2VydmljZSBmcm9tIC9ldGMvcGFzc3dkISIKKyAgICAgIGNzaWhfd2FybmluZyAiQXMgYSByZXN1bHQsIHRoaXMgc2NyaXB0IGNhbm5vdCBtYWtlIHN1cmUgdGhhdCB0aGUgZmlsZXMgdXNlZCIKKyAgICAgIGNzaWhfd2FybmluZyAiYnkgdGhlIHNzaGQgc2VydmljZSBiZWxvbmcgdG8gdGhlIHVzZXIgcnVubmluZyB0aGUgc2VydmljZS4iCisgICAgICBjc2loX3dhcm5pbmcgIlBsZWFzZSByZS1ydW4gdGhlIG1rcGFzc3dkIHRvb2wgdG8gbWFrZSBzdXJlIHRoZSAvZXRjL3Bhc3N3ZCIKKyAgICAgIGNzaWhfd2FybmluZyAiZmlsZSBpcyBpbiBhIGdvb2Qgc2hhcGUuIgorICAgICAgcmV0dXJuIDEKKyAgICBmaQorICBmaQorICBmb3IgaSBpbiAiJHtTWVNDT05GRElSfSIvc3NoX2NvbmZpZyAiJHtTWVNDT05GRElSfSIvc3NoZF9jb25maWcgIiR7U1lTQ09ORkRJUn0iL3NzaF9ob3N0XyprZXkgIiR7U1lTQ09ORkRJUn0iL3NzaF9ob3N0XyprZXkucHViCisgIGRvCisgICAgaWYgWyAtZiAiJGkiIF0KKyAgICB0aGVuCisgICAgICBpZiAhIGNob3duICIke3J1bl9zZXJ2aWNlX2FzfSIuNTQ0ICIkaSIgPi9kZXYvbnVsbCAyPiYxCisgICAgICB0aGVuCisJY3NpaF93YXJuaW5nICJDb3VsZG4ndCBjaGFuZ2Ugb3duZXIgb2YgJGkhIgorCWxldCArK3JldAorICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIGlmICEgY2hvd24gIiR7cnVuX3NlcnZpY2VfYXN9Ii41NDQgJHtMT0NBTFNUQVRFRElSfS9lbXB0eSA+L2Rldi9udWxsIDI+JjEKKyAgdGhlbgorICAgIGNzaWhfd2FybmluZyAiQ291bGRuJ3QgY2hhbmdlIG93bmVyIG9mICR7TE9DQUxTVEFURURJUn0vZW1wdHkhIgorICAgIGxldCArK3JldAorICBmaQorICBpZiAhIGNob3duICIke3J1bl9zZXJ2aWNlX2FzfSIuNTQ0ICR7TE9DQUxTVEFURURJUn0vbG9nL2xhc3Rsb2cgPi9kZXYvbnVsbCAyPiYxCisgIHRoZW4KKyAgICBjc2loX3dhcm5pbmcgIkNvdWxkbid0IGNoYW5nZSBvd25lciBvZiAke0xPQ0FMU1RBVEVESVJ9L2xvZy9sYXN0bG9nISIKKyAgICBsZXQgKytyZXQKKyAgZmkKKyAgaWYgWyAtZiAke0xPQ0FMU1RBVEVESVJ9L2xvZy9zc2hkLmxvZyBdCisgIHRoZW4KKyAgICBpZiAhIGNob3duICIke3J1bl9zZXJ2aWNlX2FzfSIuNTQ0ICR7TE9DQUxTVEFURURJUn0vbG9nL3NzaGQubG9nID4vZGV2L251bGwgMj4mMQorICAgIHRoZW4KKyAgICAgIGNzaWhfd2FybmluZyAiQ291bGRuJ3QgY2hhbmdlIG93bmVyIG9mICR7TE9DQUxTVEFURURJUn0vbG9nL3NzaGQubG9nISIKKyAgICAgIGxldCArK3JldAorICAgIGZpCisgIGZpCisgIGlmIFsgJHJldCAtbmUgMCBdCisgIHRoZW4KKyAgICBjc2loX3dhcm5pbmcgIkNvdWxkbid0IGNoYW5nZSBvd25lciBvZiBpbXBvcnRhbnQgZmlsZXMgdG8gJHtydW5fc2VydmljZV9hc30hIgorICAgIGNzaWhfd2FybmluZyAiVGhpcyBtYXkgY2F1c2UgdGhlIHNzaGQgc2VydmljZSB0byBmYWlsISAgUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IgorICAgIGNzaWhfd2FybmluZyAieW91IGhhdmUgc3V1ZmZpY2llbnQgcGVybWlzc2lvbnMgdG8gY2hhbmdlIHRoZSBvd25lcnNoaXAgb2YgZmlsZXMiCisgICAgY3NpaF93YXJuaW5nICJhbmQgdHJ5IHRvIHJ1biB0aGUgc3NoLWhvc3QtY29uZmlnIHNjcmlwdCBhZ2Fpbi4iCisgIGZpCisgIHJldHVybiAkcmV0Cit9ICMgLS0tIEVuZCBvZiBjaGVja19zZXJ2aWNlX2ZpbGVzX293bmVyc2hpcCAtLS0gIworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgUm91dGluZTogaW5zdGFsbF9zZXJ2aWNlCisjICAgSW5zdGFsbCBzc2hkIGFzIGEgc2VydmljZQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitpbnN0YWxsX3NlcnZpY2UoKSB7CisgIGxvY2FsIHJ1bl9zZXJ2aWNlX2FzCisgIGxvY2FsIHBhc3N3b3JkCisgIGxvY2FsIHJldD0wCisKKyAgZWNobworICBpZiAvdXNyL2Jpbi9jeWdydW5zcnYgLVEgc3NoZCA+L2Rldi9udWxsIDI+JjEKKyAgdGhlbgorICAgIGNzaWhfaW5mb3JtICJTc2hkIHNlcnZpY2UgaXMgYWxyZWFkeSBpbnN0YWxsZWQuIgorICAgIGNoZWNrX3NlcnZpY2VfZmlsZXNfb3duZXJzaGlwICIiIHx8IGxldCByZXQrPSQ/CisgIGVsc2UKKyAgICBlY2hvIC1lICIke19jc2loX1FVRVJZX1NUUn0gRG8geW91IHdhbnQgdG8gaW5zdGFsbCBzc2hkIGFzIGEgc2VydmljZT8iCisgICAgaWYgY3NpaF9yZXF1ZXN0ICIoU2F5IFwibm9cIiBpZiBpdCBpcyBhbHJlYWR5IGluc3RhbGxlZCBhcyBhIHNlcnZpY2UpIgorICAgIHRoZW4KKyAgICAgIGNzaWhfZ2V0X2N5Z2VudiAiJHtjeWd3aW5fdmFsdWV9IgorCisgICAgICBpZiAoIGNzaWhfaXNfbnQyMDAzIHx8IFsgIiRjc2loX0ZPUkNFX1BSSVZJTEVHRURfVVNFUiIgPSAieWVzIiBdICkKKyAgICAgIHRoZW4KKwljc2loX2luZm9ybSAiT24gV2luZG93cyBTZXJ2ZXIgMjAwMywgV2luZG93cyBWaXN0YSwgYW5kIGFib3ZlLCB0aGUiCisJY3NpaF9pbmZvcm0gIlNZU1RFTSBhY2NvdW50IGNhbm5vdCBzZXR1aWQgdG8gb3RoZXIgdXNlcnMgLS0gYSBjYXBhYmlsaXR5IgorCWNzaWhfaW5mb3JtICJzc2hkIHJlcXVpcmVzLiAgWW91IG5lZWQgdG8gaGF2ZSBvciB0byBjcmVhdGUgYSBwcml2aWxlZ2VkIgorCWNzaWhfaW5mb3JtICJhY2NvdW50LiAgVGhpcyBzY3JpcHQgd2lsbCBoZWxwIHlvdSBkbyBzby4iCisJZWNobworCisJWyAiJHtvcHRfZm9yY2V9IiA9ICJ5ZXMiIF0gJiYgb3B0X2Y9LWYKKwlbIC1uICIke3VzZXJfYWNjb3VudH0iIF0gJiYgb3B0X3U9Ii11ICIiJHt1c2VyX2FjY291bnR9IiIiCisJY3NpaF9zZWxlY3RfcHJpdmlsZWdlZF91c2VybmFtZSAke29wdF9mfSAke29wdF91fSBzc2hkCisKKwlpZiAhIGNzaWhfY3JlYXRlX3ByaXZpbGVnZWRfdXNlciAiJHtwYXNzd29yZF92YWx1ZX0iCisJdGhlbgorCSAgY3NpaF9lcnJvcl9yZWNvdmVyYWJsZSAiVGhlcmUgd2FzIGEgc2VyaW91cyBwcm9ibGVtIGNyZWF0aW5nIGEgcHJpdmlsZWdlZCB1c2VyLiIKKwkgIGNzaWhfcmVxdWVzdCAiRG8geW91IHdhbnQgdG8gcHJvY2VlZCBhbnl3YXk/IiB8fCBleGl0IDEKKwkgIGxldCArK3JldAorCWZpCisgICAgICBmaQorCisgICAgICAjIE5ldmVyIHJldHVybnMgZW1wdHkgaWYgTlQgb3IgYWJvdmUKKyAgICAgIHJ1bl9zZXJ2aWNlX2FzPSQoY3NpaF9zZXJ2aWNlX3Nob3VsZF9ydW5fYXMpCisKKyAgICAgIGlmIFsgIiR7cnVuX3NlcnZpY2VfYXN9IiA9ICIke2NzaWhfUFJJVklMRUdFRF9VU0VSTkFNRX0iIF0KKyAgICAgIHRoZW4KKwlwYXNzd29yZD0iJHtjc2loX1BSSVZJTEVHRURfUEFTU1dPUkR9IgorCWlmIFsgLXogIiR7cGFzc3dvcmR9IiBdCisJdGhlbgorCSAgY3NpaF9nZXRfdmFsdWUgIlBsZWFzZSBlbnRlciB0aGUgcGFzc3dvcmQgZm9yIHVzZXIgJyR7cnVuX3NlcnZpY2VfYXN9JzoiICItcyIKKwkgIHBhc3N3b3JkPSIke2NzaWhfdmFsdWV9IgorCWZpCisgICAgICBmaQorCisgICAgICAjIEF0IHRoaXMgcG9pbnQsIHdlIGVpdGhlciBoYXZlICRydW5fc2VydmljZV9hcyA9ICJzeXN0ZW0iIGFuZAorICAgICAgIyAkcGFzc3dvcmQgaXMgZW1wdHksIG9yICRydW5fc2VydmljZV9hcyBpcyBzb21lIHByaXZpbGVnZWQgdXNlciBhbmQKKyAgICAgICMgKGhvcGVmdWxseSkgJHBhc3N3b3JkIGNvbnRhaW5zIHRoZSBjb3JyZWN0IHBhc3N3b3JkLiAgU28sIGZyb20gaGVyZQorICAgICAgIyBvdXQsIHdlIHVzZSAnLXogIiR7cGFzc3dvcmR9IicgdG8gZGlzY3JpbWluYXRlIHRoZSB0d28gY2FzZXMuCisKKyAgICAgIGNzaWhfY2hlY2tfdXNlciAiJHtydW5fc2VydmljZV9hc30iCisKKyAgICAgIGlmIFsgLW4gIiR7Y3NpaF9jeWdlbnZ9IiBdCisgICAgICB0aGVuCisJY3lnd2luX2Vudj0oIC1lICJDWUdXSU49JHtjc2loX2N5Z2Vudn0iICkKKyAgICAgIGZpCisgICAgICBpZiBbIC16ICIke3Bhc3N3b3JkfSIgXQorICAgICAgdGhlbgorCWlmIC91c3IvYmluL2N5Z3J1bnNydiAtSSBzc2hkIC1kICJDWUdXSU4gc3NoZCIgLXAgL3Vzci9zYmluL3NzaGQgXAorCQkJICAgICAgLWEgIi1EIiAteSB0Y3BpcCAiJHtjeWd3aW5fZW52W0BdfSIKKwl0aGVuCisJICBlY2hvCisJICBjc2loX2luZm9ybSAiVGhlIHNzaGQgc2VydmljZSBoYXMgYmVlbiBpbnN0YWxsZWQgdW5kZXIgdGhlIExvY2FsU3lzdGVtIgorCSAgY3NpaF9pbmZvcm0gImFjY291bnQgKGFsc28ga25vd24gYXMgU1lTVEVNKS4gVG8gc3RhcnQgdGhlIHNlcnZpY2Ugbm93LCBjYWxsIgorCSAgY3NpaF9pbmZvcm0gIlxgbmV0IHN0YXJ0IHNzaGQnIG9yIFxgY3lncnVuc3J2IC1TIHNzaGQnLiAgT3RoZXJ3aXNlLCBpdCIKKwkgIGNzaWhfaW5mb3JtICJ3aWxsIHN0YXJ0IGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIG5leHQgcmVib290LiIKKwlmaQorICAgICAgZWxzZQorCWlmIC91c3IvYmluL2N5Z3J1bnNydiAtSSBzc2hkIC1kICJDWUdXSU4gc3NoZCIgLXAgL3Vzci9zYmluL3NzaGQgXAorCQkJICAgICAgLWEgIi1EIiAteSB0Y3BpcCAiJHtjeWd3aW5fZW52W0BdfSIgXAorCQkJICAgICAgLXUgIiR7cnVuX3NlcnZpY2VfYXN9IiAtdyAiJHtwYXNzd29yZH0iCisJdGhlbgorCSAgZWNobworCSAgY3NpaF9pbmZvcm0gIlRoZSBzc2hkIHNlcnZpY2UgaGFzIGJlZW4gaW5zdGFsbGVkIHVuZGVyIHRoZSAnJHtydW5fc2VydmljZV9hc30nIgorCSAgY3NpaF9pbmZvcm0gImFjY291bnQuICBUbyBzdGFydCB0aGUgc2VydmljZSBub3csIGNhbGwgXGBuZXQgc3RhcnQgc3NoZCcgb3IiCisJICBjc2loX2luZm9ybSAiXGBjeWdydW5zcnYgLVMgc3NoZCcuICBPdGhlcndpc2UsIGl0IHdpbGwgc3RhcnQgYXV0b21hdGljYWxseSIKKwkgIGNzaWhfaW5mb3JtICJhZnRlciB0aGUgbmV4dCByZWJvb3QuIgorCWZpCisgICAgICBmaQorCisgICAgICBpZiAvdXNyL2Jpbi9jeWdydW5zcnYgLVEgc3NoZCA+L2Rldi9udWxsIDI+JjEKKyAgICAgIHRoZW4KKwljaGVja19zZXJ2aWNlX2ZpbGVzX293bmVyc2hpcCAiJHtydW5fc2VydmljZV9hc30iIHx8IGxldCByZXQrPSQ/CisgICAgICBlbHNlCisJY3NpaF9lcnJvcl9yZWNvdmVyYWJsZSAiSW5zdGFsbGluZyBzc2hkIGFzIGEgc2VydmljZSBmYWlsZWQhIgorCWxldCArK3JldAorICAgICAgZmkKKyAgICBmaSAjIHVzZXIgYWxsb3dlZCB1cyB0byBpbnN0YWxsIGFzIHNlcnZpY2UKKyAgZmkgIyBzZXJ2aWNlIG5vdCB5ZXQgaW5zdGFsbGVkCisgIHJldHVybiAkcmV0Cit9ICMgLS0tIEVuZCBvZiBpbnN0YWxsX3NlcnZpY2UgLS0tICMKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIE1haW4gRW50cnkgUG9pbnQKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIENoZWNrIGhvdyB0aGUgc2NyaXB0IGhhcyBiZWVuIHN0YXJ0ZWQuICBJZgorIyAgICgxKSBpdCBoYXMgYmVlbiBzdGFydGVkIGJ5IGdpdmluZyB0aGUgZnVsbCBwYXRoIGFuZAorIyAgICAgICB0aGF0IHBhdGggaXMgL2V0Yy9wb3N0aW5zdGFsbCwgT1IKKyMgICAoMikgT3RoZXJ3aXNlLCBpZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKyMgICAgICAgU1NIX0hPU1RfQ09ORklHX0FVVE9fQU5TV0VSX05PIGlzIHNldAorIyB0aGVuIHNldCBhdXRvX2Fuc3dlciB0byAibm8iLiAgVGhpcyBhbGxvd3MgYXV0b21hdGljCisjIGNyZWF0aW9uIG9mIHRoZSBjb25maWcgZmlsZXMgaW4gL2V0YyB3L28gb3ZlcndyaXRpbmcKKyMgdGhlbSBpZiB0aGV5IGFscmVhZHkgZXhpc3QuICBJbiBib3RoIGNhc2VzLCBjb2xvcgorIyBlc2NhcGUgc2VxdWVuY2VzIGFyZSBzdXBwcmVzc2VkLCBzbyBhcyB0byBwcmV2ZW50CisjIGNsdXR0ZXJpbmcgc2V0dXAncyBsb2dmaWxlcy4KK2lmIFsgIiRQUk9HRElSIiA9ICIvZXRjL3Bvc3RpbnN0YWxsIiBdCit0aGVuCisgIGNzaWhfYXV0b19hbnN3ZXI9Im5vIgorICBjc2loX2Rpc2FibGVfY29sb3IKKyAgb3B0X2ZvcmNlPXllcworZmkKK2lmIFsgLW4gIiR7U1NIX0hPU1RfQ09ORklHX0FVVE9fQU5TV0VSX05PfSIgXQordGhlbgorICBjc2loX2F1dG9fYW5zd2VyPSJubyIKKyAgY3NpaF9kaXNhYmxlX2NvbG9yCisgIG9wdF9mb3JjZT15ZXMKK2ZpCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBQYXJzZSBvcHRpb25zCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3doaWxlIDoKK2RvCisgIGNhc2UgJCMgaW4KKyAgMCkKKyAgICBicmVhaworICAgIDs7CisgIGVzYWMKKworICBvcHRpb249JDEKKyAgc2hpZnQKKworICBjYXNlICIke29wdGlvbn0iIGluCisgIC1kIHwgLS1kZWJ1ZyApCisgICAgc2V0IC14CisgICAgY3NpaF90cmFjZV9vbgorICAgIDs7CisKKyAgLXkgfCAtLXllcyApCisgICAgY3NpaF9hdXRvX2Fuc3dlcj15ZXMKKyAgICBvcHRfZm9yY2U9eWVzCisgICAgOzsKKworICAtbiB8IC0tbm8gKQorICAgIGNzaWhfYXV0b19hbnN3ZXI9bm8KKyAgICBvcHRfZm9yY2U9eWVzCisgICAgOzsKKworICAtYyB8IC0tY3lnd2luICkKKyAgICBjeWd3aW5fdmFsdWU9IiQxIgorICAgIHNoaWZ0CisgICAgOzsKKworICAtcCB8IC0tcG9ydCApCisgICAgcG9ydF9udW1iZXI9JDEKKyAgICBzaGlmdAorICAgIDs7CisKKyAgLXUgfCAtLXVzZXIgKQorICAgIHVzZXJfYWNjb3VudD0iJDEiCisgICAgc2hpZnQKKyAgICA7OworICAgIAorICAtdyB8IC0tcHdkICkKKyAgICBwYXNzd29yZF92YWx1ZT0iJDEiCisgICAgc2hpZnQKKyAgICA7OworCisgIC0tcHJpdmlsZWdlZCApCisgICAgY3NpaF9GT1JDRV9QUklWSUxFR0VEX1VTRVI9eWVzCisgICAgOzsKKworICAqKQorICAgIGVjaG8gInVzYWdlOiAke3Byb2duYW1lfSBbT1BUSU9OXS4uLiIKKyAgICBlY2hvCisgICAgZWNobyAiVGhpcyBzY3JpcHQgY3JlYXRlcyBhbiBPcGVuU1NIIGhvc3QgY29uZmlndXJhdGlvbi4iCisgICAgZWNobworICAgIGVjaG8gIk9wdGlvbnM6IgorICAgIGVjaG8gIiAgLS1kZWJ1ZyAgLWQgICAgICAgICAgICBFbmFibGUgc2hlbGwncyBkZWJ1ZyBvdXRwdXQuIgorICAgIGVjaG8gIiAgLS15ZXMgICAgLXkgICAgICAgICAgICBBbnN3ZXIgYWxsIHF1ZXN0aW9ucyB3aXRoIFwieWVzXCIgYXV0b21hdGljYWxseS4iCisgICAgZWNobyAiICAtLW5vICAgICAtbiAgICAgICAgICAgIEFuc3dlciBhbGwgcXVlc3Rpb25zIHdpdGggXCJub1wiIGF1dG9tYXRpY2FsbHkuIgorICAgIGVjaG8gIiAgLS1jeWd3aW4gLWMgPG9wdGlvbnM+ICBVc2UgXCJvcHRpb25zXCIgYXMgdmFsdWUgZm9yIENZR1dJTiBlbnZpcm9ubWVudCB2YXIuIgorICAgIGVjaG8gIiAgLS1wb3J0ICAgLXAgPG4+ICAgICAgICBzc2hkIGxpc3RlbnMgb24gcG9ydCBuLiIKKyAgICBlY2hvICIgIC0tdXNlciAgIC11IDxhY2NvdW50PiAgcHJpdmlsZWdlZCB1c2VyIGZvciBzZXJ2aWNlLiIKKyAgICBlY2hvICIgIC0tcHdkICAgIC13IDxwYXNzd2Q+ICAgVXNlIFwicHdkXCIgYXMgcGFzc3dvcmQgZm9yIHByaXZpbGVnZWQgdXNlci4iCisgICAgZWNobyAiICAtLXByaXZpbGVnZWQgICAgICAgICAgIE9uIFdpbmRvd3MgTlQvMmsvWFAsIHJlcXVpcmUgcHJpdmlsZWdlZCB1c2VyIgorICAgIGVjaG8gIiAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIExvY2FsU3lzdGVtIGZvciBzc2hkIHNlcnZpY2UuIgorICAgIGVjaG8KKyAgICBleGl0IDEKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEFjdGlvbiEKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIENoZWNrIGZvciBydW5uaW5nIHNzaC9zc2hkIHByb2Nlc3NlcyBmaXJzdC4gUmVmdXNlIHRvIGRvIGFueXRoaW5nIHdoaWxlCisjIHNvbWUgc3NoIHByb2Nlc3NlcyBhcmUgc3RpbGwgcnVubmluZworaWYgL3Vzci9iaW4vcHMgLWVmIHwgL3Vzci9iaW4vZ3JlcCAtcSAnL3NzaGRcPyQnCit0aGVuCisgIGVjaG8KKyAgY3NpaF9lcnJvciAiVGhlcmUgYXJlIHN0aWxsIHNzaCBwcm9jZXNzZXMgcnVubmluZy4gUGxlYXNlIHNodXQgdGhlbSBkb3duIGZpcnN0LiIKK2ZpCisKKyMgTWFrZSBzdXJlIHRoZSB1c2VyIGlzIHJ1bm5pbmcgaW4gYW4gYWRtaW5pc3RyYXRpdmUgY29udGV4dAorYWRtaW49JCgvdXNyL2Jpbi9pZCAtRyB8IC91c3IvYmluL2dyZXAgLUVxICdcPDU0NFw+JyAmJiBlY2hvIHllcyB8fCBlY2hvIG5vKQoraWYgWyAiJHthZG1pbn0iICE9ICJ5ZXMiIF0KK3RoZW4KKyAgZWNobworICBjc2loX3dhcm5pbmcgIlJ1bm5pbmcgdGhpcyBzY3JpcHQgdHlwaWNhbGx5IHJlcXVpcmVzIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcyEiCisgIGNzaWhfd2FybmluZyAiSG93ZXZlciwgaXQgc2VlbXMgeW91ciBhY2NvdW50IGRvZXMgbm90IGhhdmUgdGhlc2UgcHJpdmlsZWdlcy4iCisgIGNzaWhfd2FybmluZyAiSGVyZSdzIHRoZSBsaXN0IG9mIGdyb3VwcyBpbiB5b3VyIHVzZXIgdG9rZW46IgorICBlY2hvCisgIGZvciBpIGluICQoL3Vzci9iaW4vaWQgLUcpCisgIGRvCisgICAgL3Vzci9iaW4vYXdrIC1GOiAiL1teOl0qOlteOl0qOiRpOi97IHByaW50IFwiICAgIFwiIFwkMTsgfSIgL2V0Yy9ncm91cAorICBkb25lCisgIGVjaG8KKyAgY3NpaF93YXJuaW5nICJUaGlzIHVzdWFsbHkgbWVhbnMgeW91J3JlIHJ1bm5pbmcgdGhpcyBzY3JpcHQgZnJvbSBhIG5vbi1hZG1pbiIKKyAgY3NpaF93YXJuaW5nICJkZXNrdG9wIHNlc3Npb24sIG9yIGluIGEgbm9uLWVsZXZhdGVkIHNoZWxsIHVuZGVyIFVBQyBjb250cm9sLiIKKyAgZWNobworICBjc2loX3dhcm5pbmcgIk1ha2Ugc3VyZSB5b3UgaGF2ZSB0aGUgYXBwcm9wcmlhdGUgcHJpdmlsZWdlcyByaWdodCBub3csIgorICBjc2loX3dhcm5pbmcgIm90aGVyd2lzZSBwYXJ0cyBvZiB0aGlzIHNjcmlwdCB3aWxsIHByb2JhYmx5IGZhaWwhIgorICBlY2hvCisgIGVjaG8gLWUgIiR7X2NzaWhfUVVFUllfU1RSfSBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/ICAoU2F5IFwibm9cIiBpZiB5b3UncmUgbm90IHN1cmUiCisgIGlmICEgY3NpaF9yZXF1ZXN0ICJ5b3UgaGF2ZSB0aGUgcmVxdWlyZWQgcHJpdmlsZWdlcykiCisgIHRoZW4KKyAgICBlY2hvCisgICAgY3NpaF9pbmZvcm0gIk9rLiAgRXhpdGluZy4gIE1ha2Ugc3VyZSB0byBzd2l0Y2ggdG8gYW4gYWRtaW5pc3RyYXRpdmUgYWNjb3VudCIKKyAgICBjc2loX2luZm9ybSAib3IgdG8gc3RhcnQgdGhpcyBzY3JpcHQgZnJvbSBhbiBlbGV2YXRlZCBzaGVsbC4iCisgICAgZXhpdCAxCisgIGZpCitmaQorCitlY2hvCisKK3dhcm5pbmdfY250PTAKKworIyBDaGVjayBmb3IgJHtTWVNDT05GRElSfSBkaXJlY3RvcnkKK2NzaWhfbWFrZV9kaXIgIiR7U1lTQ09ORkRJUn0iICJDYW5ub3QgY3JlYXRlIGdsb2JhbCBjb25maWd1cmF0aW9uIGZpbGVzLiIKK2lmICEgL3Vzci9iaW4vY2htb2QgNzc1ICIke1NZU0NPTkZESVJ9IiA+L2Rldi9udWxsIDI+JjEKK3RoZW4KKyAgY3NpaF93YXJuaW5nICJDYW4ndCBzZXQgcGVybWlzc2lvbnMgb24gJHtTWVNDT05GRElSfSEiCisgIGxldCArK3dhcm5pbmdfY250CitmaQoraWYgISAvdXNyL2Jpbi9zZXRmYWNsIC1tIHU6c3lzdGVtOnJ3eCAiJHtTWVNDT05GRElSfSIgPi9kZXYvbnVsbCAyPiYxCit0aGVuCisgIGNzaWhfd2FybmluZyAiQ2FuJ3Qgc2V0IGV4dGVuZGVkIHBlcm1pc3Npb25zIG9uICR7U1lTQ09ORkRJUn0hIgorICBsZXQgKyt3YXJuaW5nX2NudAorZmkKKworIyBDaGVjayBmb3IgL3Zhci9sb2cgZGlyZWN0b3J5Citjc2loX21ha2VfZGlyICIke0xPQ0FMU1RBVEVESVJ9L2xvZyIgIkNhbm5vdCBjcmVhdGUgbG9nIGRpcmVjdG9yeS4iCitpZiAhIC91c3IvYmluL2NobW9kIDc3NSAiJHtMT0NBTFNUQVRFRElSfS9sb2ciID4vZGV2L251bGwgMj4mMQordGhlbgorICBjc2loX3dhcm5pbmcgIkNhbid0IHNldCBwZXJtaXNzaW9ucyBvbiAke0xPQ0FMU1RBVEVESVJ9L2xvZyEiCisgIGxldCArK3dhcm5pbmdfY250CitmaQoraWYgISAvdXNyL2Jpbi9zZXRmYWNsIC1tIHU6c3lzdGVtOnJ3eCAiJHtMT0NBTFNUQVRFRElSfS9sb2ciID4vZGV2L251bGwgMj4mMQordGhlbgorICBjc2loX3dhcm5pbmcgIkNhbid0IHNldCBleHRlbmRlZCBwZXJtaXNzaW9ucyBvbiAke0xPQ0FMU1RBVEVESVJ9L2xvZyEiCisgIGxldCArK3dhcm5pbmdfY250CitmaQorCisjIENyZWF0ZSAvdmFyL2xvZy9sYXN0bG9nIGlmIG5vdCBhbHJlYWR5IGV4aXN0cworaWYgWyAtZSAke0xPQ0FMU1RBVEVESVJ9L2xvZy9sYXN0bG9nIC1hICEgLWYgJHtMT0NBTFNUQVRFRElSfS9sb2cvbGFzdGxvZyBdCit0aGVuCisgIGVjaG8KKyAgY3NpaF9lcnJvcl9tdWx0aSAiJHtMT0NBTFNUQVRFRElSfS9sb2cvbGFzdGxvZyBleGlzdHMsIGJ1dCBpcyBub3QgYSBmaWxlLiIgXAorCQkgICAiQ2Fubm90IGNyZWF0ZSBzc2ggaG9zdCBjb25maWd1cmF0aW9uLiIKK2ZpCitpZiBbICEgLWUgJHtMT0NBTFNUQVRFRElSfS9sb2cvbGFzdGxvZyBdCit0aGVuCisgIC91c3IvYmluL2NhdCAvZGV2L251bGwgPiAke0xPQ0FMU1RBVEVESVJ9L2xvZy9sYXN0bG9nCisgIGlmICEgL3Vzci9iaW4vY2htb2QgNjQ0ICR7TE9DQUxTVEFURURJUn0vbG9nL2xhc3Rsb2cgPi9kZXYvbnVsbCAyPiYxCisgIHRoZW4KKyAgICBjc2loX3dhcm5pbmcgIkNhbid0IHNldCBwZXJtaXNzaW9ucyBvbiAke0xPQ0FMU1RBVEVESVJ9L2xvZy9sYXN0bG9nISIKKyAgICBsZXQgKyt3YXJuaW5nX2NudAorICBmaQorZmkKKworIyBDcmVhdGUgL3Zhci9lbXB0eSBmaWxlIHVzZWQgYXMgY2hyb290IGphaWwgZm9yIHByaXZpbGVnZSBzZXBhcmF0aW9uCitjc2loX21ha2VfZGlyICIke0xPQ0FMU1RBVEVESVJ9L2VtcHR5IiAiQ2Fubm90IGNyZWF0ZSAke0xPQ0FMU1RBVEVESVJ9L2VtcHR5IGRpcmVjdG9yeS4iCitpZiAhIC91c3IvYmluL2NobW9kIDc1NSAiJHtMT0NBTFNUQVRFRElSfS9lbXB0eSIgPi9kZXYvbnVsbCAyPiYxCit0aGVuCisgIGNzaWhfd2FybmluZyAiQ2FuJ3Qgc2V0IHBlcm1pc3Npb25zIG9uICR7TE9DQUxTVEFURURJUn0vZW1wdHkhIgorICBsZXQgKyt3YXJuaW5nX2NudAorZmkKK2lmICEgL3Vzci9iaW4vc2V0ZmFjbCAtbSB1OnN5c3RlbTpyd3ggIiR7TE9DQUxTVEFURURJUn0vZW1wdHkiID4vZGV2L251bGwgMj4mMQordGhlbgorICBjc2loX3dhcm5pbmcgIkNhbid0IHNldCBleHRlbmRlZCBwZXJtaXNzaW9ucyBvbiAke0xPQ0FMU1RBVEVESVJ9L2VtcHR5ISIKKyAgbGV0ICsrd2FybmluZ19jbnQKK2ZpCisKKyMgaG9zdCBrZXlzCitjcmVhdGVfaG9zdF9rZXlzIHx8IGxldCB3YXJuaW5nX2NudCs9JD8KKworIyBoYW5kbGUgc3NoX2NvbmZpZworY3NpaF9pbnN0YWxsX2NvbmZpZyAiJHtTWVNDT05GRElSfS9zc2hfY29uZmlnIiAiJHtTWVNDT05GRElSfS9kZWZhdWx0cyIgfHwgbGV0ICsrd2FybmluZ19jbnQKK2lmIC91c3IvYmluL2NtcCAiJHtTWVNDT05GRElSfS9zc2hfY29uZmlnIiAiJHtTWVNDT05GRElSfS9kZWZhdWx0cy8ke1NZU0NPTkZESVJ9L3NzaF9jb25maWciID4vZGV2L251bGwgMj4mMQordGhlbgorICBpZiBbICIke3BvcnRfbnVtYmVyfSIgIT0gIjIyIiBdCisgIHRoZW4KKyAgICBjc2loX2luZm9ybSAiVXBkYXRpbmcgJHtTWVNDT05GRElSfS9zc2hfY29uZmlnIGZpbGUgd2l0aCByZXF1ZXN0ZWQgcG9ydCIKKyAgICBlY2hvICJIb3N0IGxvY2FsaG9zdCIgPj4gJHtTWVNDT05GRElSfS9zc2hfY29uZmlnCisgICAgZWNobyAiICAgIFBvcnQgJHtwb3J0X251bWJlcn0iID4+ICR7U1lTQ09ORkRJUn0vc3NoX2NvbmZpZworICBmaQorZmkKKworIyBoYW5kbGUgc3NoZF9jb25maWcgKGFuZCBwcml2c2VwKQorY3NpaF9pbnN0YWxsX2NvbmZpZyAiJHtTWVNDT05GRElSfS9zc2hkX2NvbmZpZyIgIiR7U1lTQ09ORkRJUn0vZGVmYXVsdHMiIHx8IGxldCArK3dhcm5pbmdfY250CitpZiAhIC91c3IvYmluL2NtcCAiJHtTWVNDT05GRElSfS9zc2hkX2NvbmZpZyIgIiR7U1lTQ09ORkRJUn0vZGVmYXVsdHMvJHtTWVNDT05GRElSfS9zc2hkX2NvbmZpZyIgPi9kZXYvbnVsbCAyPiYxCit0aGVuCisgIC91c3IvYmluL2dyZXAgLXEgVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiAke1NZU0NPTkZESVJ9L3NzaGRfY29uZmlnICYmIHByaXZzZXBfY29uZmlndXJlZD15ZXMKK2ZpCitzc2hkX3ByaXZzZXAgfHwgbGV0IHdhcm5pbmdfY250Kz0kPworCit1cGRhdGVfc2VydmljZXNfZmlsZSB8fCBsZXQgd2FybmluZ19jbnQrPSQ/Cit1cGRhdGVfaW5ldGRfY29uZiB8fCBsZXQgd2FybmluZ19jbnQrPSQ/CitpbnN0YWxsX3NlcnZpY2UgfHwgbGV0IHdhcm5pbmdfY250Kz0kPworCitlY2hvCitpZiBbICR3YXJuaW5nX2NudCAtZXEgMCBdCit0aGVuCisgIGNzaWhfaW5mb3JtICJIb3N0IGNvbmZpZ3VyYXRpb24gZmluaXNoZWQuIEhhdmUgZnVuISIKK2Vsc2UKKyAgY3NpaF93YXJuaW5nICJIb3N0IGNvbmZpZ3VyYXRpb24gZXhpdGVkIHdpdGggJHt3YXJuaW5nX2NudH0gZXJyb3JzIG9yIHdhcm5pbmdzISIKKyAgY3NpaF93YXJuaW5nICJNYWtlIHN1cmUgdGhhdCBhbGwgcHJvYmxlbXMgcmVwb3J0ZWQgYXJlIGZpeGVkLCIKKyAgY3NpaF93YXJuaW5nICJ0aGVuIHJlLXJ1biBzc2gtaG9zdC1jb25maWcuIgorZmkKK2V4aXQgJHdhcm5pbmdfY250CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvY3lnd2luL3NzaC11c2VyLWNvbmZpZyBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9jeWd3aW4vc3NoLXVzZXItY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyN2FlNjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvY3lnd2luL3NzaC11c2VyLWNvbmZpZwpAQCAtMCwwICsxLDI3MiBAQAorIyEvYmluL2Jhc2gKKyMKKyMgc3NoLXVzZXItY29uZmlnLCBDb3B5cmlnaHQgMjAwMC0yMDA4IFJlZCBIYXQgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ3lnd2luIHBvcnQgb2YgT3BlblNTSC4KKyMKKyMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisjIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgIAorIyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgCisjIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gICAKKyMgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgIAorIyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgCisjIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiAgICAKKyMgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgSW5pdGlhbGl6YXRpb24KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUFJPR05BTUU9JChiYXNlbmFtZSAtLSAkMCkKK190ZGlyPSQoZGlybmFtZSAtLSAkMCkKK1BST0dESVI9JChjZCAkX3RkaXIgJiYgcHdkKQorCitDU0lIX1NDUklQVD0vdXNyL3NoYXJlL2NzaWgvY3lnd2luLXNlcnZpY2UtaW5zdGFsbGF0aW9uLWhlbHBlci5zaAorCisjIFN1YmRpcmVjdG9yeSB3aGVyZSB0aGUgbmV3IHBhY2thZ2UgaXMgYmVpbmcgaW5zdGFsbGVkCitQUkVGSVg9L3VzcgorCisjIERpcmVjdG9yeSB3aGVyZSB0aGUgY29uZmlnIGZpbGVzIGFyZSBzdG9yZWQKK1NZU0NPTkZESVI9L2V0YworCitzb3VyY2UgJHtDU0lIX1NDUklQVH0KKworYXV0b19wYXNzcGhyYXNlPSJubyIKK3Bhc3NwaHJhc2U9IiIKK3B3ZGhvbWU9Cit3aXRoX3Bhc3NwaHJhc2U9CisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBSb3V0aW5lOiBjcmVhdGVfaWRlbnRpdHkKKyMgICBvcHRpb25hbGx5IGNyZWF0ZSBpZGVudGl0eSBvZiB0eXBlIGFyZ3VtZW50IGluIH4vLnNzaAorIyAgIG9wdGlvbmFsbHkgYWRkIHJlc3VsdCB0byB+Ly5zc2gvYXV0aG9yaXplZF9rZXlzCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2NyZWF0ZV9pZGVudGl0eSgpIHsKKyAgbG9jYWwgZmlsZT0iJDEiCisgIGxvY2FsIHR5cGU9IiQyIgorICBsb2NhbCBuYW1lPSIkMyIKKyAgaWYgWyAhIC1mICIke3B3ZGhvbWV9Ly5zc2gvJHtmaWxlfSIgXQorICB0aGVuCisgICAgaWYgY3NpaF9yZXF1ZXN0ICJTaGFsbCBJIGNyZWF0ZSBhICR7bmFtZX0gaWRlbnRpdHkgZmlsZSBmb3IgeW91PyIKKyAgICB0aGVuCisgICAgICBjc2loX2luZm9ybSAiR2VuZXJhdGluZyAke3B3ZGhvbWV9Ly5zc2gvJHtmaWxlfSIKKyAgICAgIGlmIFsgIiR7d2l0aF9wYXNzcGhyYXNlfSIgPSAieWVzIiBdCisgICAgICB0aGVuCisgICAgICAgIHNzaC1rZXlnZW4gLXQgIiR7dHlwZX0iIC1OICIke3Bhc3NwaHJhc2V9IiAtZiAiJHtwd2Rob21lfS8uc3NoLyR7ZmlsZX0iID4gL2Rldi9udWxsCisgICAgICBlbHNlCisgICAgICAgIHNzaC1rZXlnZW4gLXQgIiR7dHlwZX0iIC1mICIke3B3ZGhvbWV9Ly5zc2gvJHtmaWxlfSIgPiAvZGV2L251bGwKKyAgICAgIGZpCisgICAgICBpZiBjc2loX3JlcXVlc3QgIkRvIHlvdSB3YW50IHRvIHVzZSB0aGlzIGlkZW50aXR5IHRvIGxvZ2luIHRvIHRoaXMgbWFjaGluZT8iCisgICAgICB0aGVuCisgICAgICAgIGNzaWhfaW5mb3JtICJBZGRpbmcgdG8gJHtwd2Rob21lfS8uc3NoL2F1dGhvcml6ZWRfa2V5cyIKKyAgICAgICAgY2F0ICIke3B3ZGhvbWV9Ly5zc2gvJHtmaWxlfS5wdWIiID4+ICIke3B3ZGhvbWV9Ly5zc2gvYXV0aG9yaXplZF9rZXlzIgorICAgICAgZmkKKyAgICBmaQorICBmaQorfSAjID09PSBFbmQgb2YgY3JlYXRlX3NzaDFfaWRlbnRpdHkoKSA9PT0gIworcmVhZG9ubHkgLWYgY3JlYXRlX2lkZW50aXR5CisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBSb3V0aW5lOiBjaGVja191c2VyX2hvbWVkaXIKKyMgICBQZXJmb3JtIHZhcmlvdXMgY2hlY2tzIG9uIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkKKyMgU0VUUyBHTE9CQUwgVkFSSUFCTEU6CisjICAgcHdkaG9tZQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitjaGVja191c2VyX2hvbWVkaXIoKSB7CisgIGxvY2FsIHVpZD0kKGlkIC11KQorICBwd2Rob21lPSQoYXdrIC1GOiAneyBpZiAoICQzID09ICcke3VpZH0nICkgcHJpbnQgJDY7IH0nIDwgJHtTWVNDT05GRElSfS9wYXNzd2QpCisgIGlmIFsgIlgke3B3ZGhvbWV9IiA9ICJYIiBdCisgIHRoZW4KKyAgICBjc2loX2Vycm9yX211bHRpIFwKKyAgICAgICJUaGVyZSBpcyBubyBob21lIGRpcmVjdG9yeSBzZXQgZm9yIHlvdSBpbiAke1NZU0NPTkZESVJ9L3Bhc3N3ZC4iIFwKKyAgICAgICdTZXR0aW5nICRIT01FIGlzIG5vdCBzdWZmaWNpZW50IScKKyAgZmkKKyAgCisgIGlmIFsgISAtZCAiJHtwd2Rob21lfSIgXQorICB0aGVuCisgICAgY3NpaF9lcnJvcl9tdWx0aSBcCisgICAgICAiJHtwd2Rob21lfSBpcyBzZXQgaW4gJHtTWVNDT05GRElSfS9wYXNzd2QgYXMgeW91ciBob21lIGRpcmVjdG9yeSIgXAorICAgICAgJ2J1dCBpdCBpcyBub3QgYSB2YWxpZCBkaXJlY3RvcnkuIENhbm5vdCBjcmVhdGUgdXNlciBpZGVudGl0eSBmaWxlcy4nCisgIGZpCisgIAorICAjIElmIGhvbWUgaXMgdGhlIHJvb3QgZGlyLCBzZXQgaG9tZSB0byBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgZXJyb3IgbWVzc2FnZXMKKyAgIyBpbiBzdWJzZXF1ZW50IHBhcnRzIG9mIHRoYXQgc2NyaXB0LgorICBpZiBbICJYJHtwd2Rob21lfSIgPSAiWC8iIF0KKyAgdGhlbgorICAgICMgQnV0IGZpcnN0IHJhaXNlIGEgd2FybmluZyEKKyAgICBjc2loX3dhcm5pbmcgIllvdXIgaG9tZSBkaXJlY3RvcnkgaW4gJHtTWVNDT05GRElSfS9wYXNzd2QgaXMgc2V0IHRvIHJvb3QgKC8pLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZCEiCisgICAgaWYgY3NpaF9yZXF1ZXN0ICJXb3VsZCB5b3UgbGlrZSB0byBwcm9jZWVkIGFueXdheT8iCisgICAgdGhlbgorICAgICAgcHdkaG9tZT0nJworICAgIGVsc2UKKyAgICAgIGNzaWhfd2FybmluZyAiRXhpdGluZy4gQ29uZmlndXJhdGlvbiBpcyBub3QgY29tcGxldGUiCisgICAgICBleGl0IDEKKyAgICBmaQorICBmaQorICAKKyAgaWYgWyAtZCAiJHtwd2Rob21lfSIgLWEgY3NpaF9pc19udCAtYSAtbiAiYGNobW9kIC1jIGctdyxvLXcgIiR7cHdkaG9tZX0iYCIgXQorICB0aGVuCisgICAgZWNobworICAgIGNzaWhfd2FybmluZyAnZ3JvdXAgYW5kIG90aGVyIGhhdmUgYmVlbiByZXZva2VkIHdyaXRlIHBlcm1pc3Npb24gdG8geW91ciBob21lJworICAgIGNzaWhfd2FybmluZyAiZGlyZWN0b3J5ICR7cHdkaG9tZX0uIgorICAgIGNzaWhfd2FybmluZyAnVGhpcyBpcyByZXF1aXJlZCBieSBPcGVuU1NIIHRvIGFsbG93IHB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24gdXNpbmcnCisgICAgY3NpaF93YXJuaW5nICd0aGUga2V5IGZpbGVzIHN0b3JlZCBpbiB5b3VyIC5zc2ggc3ViZGlyZWN0b3J5LicKKyAgICBjc2loX3dhcm5pbmcgJ1JldmVydCB0aGlzIGNoYW5nZSBPTkxZIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEnCisgICAgZWNobworICBmaQorfSAjID09PSBFbmQgb2YgY2hlY2tfdXNlcl9ob21lZGlyKCkgPT09ICMKK3JlYWRvbmx5IC1mIGNoZWNrX3VzZXJfaG9tZWRpcgorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgUm91dGluZTogY2hlY2tfdXNlcl9kb3Rfc3NoX2RpcgorIyAgIFBlcmZvcm0gdmFyaW91cyBjaGVja3Mgb24gdGhlIH4vLnNzaCBkaXJlY3RvcnkKKyMgUFJFUkVRVUlTSVRFOgorIyAgIHB3ZGhvbWUgLS0gY2hlY2tfdXNlcl9ob21lZGlyKCkKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorY2hlY2tfdXNlcl9kb3Rfc3NoX2RpcigpIHsKKyAgaWYgWyAtZSAiJHtwd2Rob21lfS8uc3NoIiAtYSAhIC1kICIke3B3ZGhvbWV9Ly5zc2giIF0KKyAgdGhlbgorICAgIGNzaWhfZXJyb3IgIiR7cHdkaG9tZX0vLnNzaCBpcyBleGlzdGFudCBidXQgbm90IGEgZGlyZWN0b3J5LiBDYW5ub3QgY3JlYXRlIHVzZXIgaWRlbnRpdHkgZmlsZXMuIgorICBmaQorICAKKyAgaWYgWyAhIC1lICIke3B3ZGhvbWV9Ly5zc2giIF0KKyAgdGhlbgorICAgIG1rZGlyICIke3B3ZGhvbWV9Ly5zc2giCisgICAgaWYgWyAhIC1lICIke3B3ZGhvbWV9Ly5zc2giIF0KKyAgICB0aGVuCisgICAgICBjc2loX2Vycm9yICJDcmVhdGluZyB1c2VycyAke3B3ZGhvbWV9Ly5zc2ggZGlyZWN0b3J5IGZhaWxlZCIKKyAgICBmaQorICBmaQorfSAjID09PSBFbmQgb2YgY2hlY2tfdXNlcl9kb3Rfc3NoX2RpcigpID09PSAjCityZWFkb25seSAtZiBjaGVja191c2VyX2RvdF9zc2hfZGlyCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBSb3V0aW5lOiBmaXhfYXV0aG9yaXplZF9rZXlzX3Blcm1zCisjICAgQ29ycmVjdHMgdGhlIHBlcm1pc3Npb25zIG9mIH4vLnNzaC9hdXRob3JpemVkX2tleXMKKyMgUFJFUkVRVUlTSVRFOgorIyAgIHB3ZGhvbWUgICAtLSBjaGVja191c2VyX2hvbWVkaXIoKQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitmaXhfYXV0aG9yaXplZF9rZXlzX3Blcm1zKCkgeworICBpZiBbIGNzaWhfaXNfbnQgLWEgLWUgIiR7cHdkaG9tZX0vLnNzaC9hdXRob3JpemVkX2tleXMiIF0KKyAgdGhlbgorICAgIGlmICEgc2V0ZmFjbCAtbSAidTo6cnctLGc6Oi0tLSxvOjotLS0iICIke3B3ZGhvbWV9Ly5zc2gvYXV0aG9yaXplZF9rZXlzIgorICAgIHRoZW4KKyAgICAgIGNzaWhfd2FybmluZyAiU2V0dGluZyBjb3JyZWN0IHBlcm1pc3Npb25zIHRvICR7cHdkaG9tZX0vLnNzaC9hdXRob3JpemVkX2tleXMiCisgICAgICBjc2loX3dhcm5pbmcgImZhaWxlZC4gIFBsZWFzZSBjYXJlIGZvciB0aGUgY29ycmVjdCBwZXJtaXNzaW9ucy4gIFRoZSBtaW5pbXVtIHJlcXVpcmVtZW50IgorICAgICAgY3NpaF93YXJuaW5nICJpcywgdGhlIG93bmVyIG5lZWRzIHJlYWQgcGVybWlzc2lvbnMuIgorICAgICAgZWNobworICAgIGZpCisgIGZpCit9ICMgPT09IEVuZCBvZiBmaXhfYXV0aG9yaXplZF9rZXlzX3Blcm1zKCkgPT09ICMKK3JlYWRvbmx5IC1mIGZpeF9hdXRob3JpemVkX2tleXNfcGVybXMKKworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgTWFpbiBFbnRyeSBQb2ludAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgQ2hlY2sgaG93IHRoZSBzY3JpcHQgaGFzIGJlZW4gc3RhcnRlZC4gIElmCisjICAgKDEpIGl0IGhhcyBiZWVuIHN0YXJ0ZWQgYnkgZ2l2aW5nIHRoZSBmdWxsIHBhdGggYW5kCisjICAgICAgIHRoYXQgcGF0aCBpcyAvZXRjL3Bvc3RpbnN0YWxsLCBPUgorIyAgICgyKSBPdGhlcndpc2UsIGlmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorIyAgICAgICBTU0hfVVNFUl9DT05GSUdfQVVUT19BTlNXRVJfTk8gaXMgc2V0CisjIHRoZW4gc2V0IGF1dG9fYW5zd2VyIHRvICJubyIuICBUaGlzIGFsbG93cyBhdXRvbWF0aWMKKyMgY3JlYXRpb24gb2YgdGhlIGNvbmZpZyBmaWxlcyBpbiAvZXRjIHcvbyBvdmVyd3JpdGluZworIyB0aGVtIGlmIHRoZXkgYWxyZWFkeSBleGlzdC4gIEluIGJvdGggY2FzZXMsIGNvbG9yCisjIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIHN1cHByZXNzZWQsIHNvIGFzIHRvIHByZXZlbnQKKyMgY2x1dHRlcmluZyBzZXR1cCdzIGxvZ2ZpbGVzLgoraWYgWyAiJFBST0dESVIiID0gIi9ldGMvcG9zdGluc3RhbGwiIF0KK3RoZW4KKyAgY3NpaF9hdXRvX2Fuc3dlcj0ibm8iCisgIGNzaWhfZGlzYWJsZV9jb2xvcgorZmkKK2lmIFsgLW4gIiR7U1NIX1VTRVJfQ09ORklHX0FVVE9fQU5TV0VSX05PfSIgXQordGhlbgorICBjc2loX2F1dG9fYW5zd2VyPSJubyIKKyAgY3NpaF9kaXNhYmxlX2NvbG9yCitmaQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgUGFyc2Ugb3B0aW9ucworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit3aGlsZSA6CitkbworICBjYXNlICQjIGluCisgIDApCisgICAgYnJlYWsKKyAgICA7OworICBlc2FjCisKKyAgb3B0aW9uPSQxCisgIHNoaWZ0CisKKyAgY2FzZSAiJG9wdGlvbiIgaW4KKyAgLWQgfCAtLWRlYnVnICkKKyAgICBzZXQgLXgKKyAgICBjc2loX3RyYWNlX29uCisgICAgOzsKKworICAteSB8IC0teWVzICkKKyAgICBjc2loX2F1dG9fYW5zd2VyPXllcworICAgIDs7CisKKyAgLW4gfCAtLW5vICkKKyAgICBjc2loX2F1dG9fYW5zd2VyPW5vCisgICAgOzsKKworICAtcCB8IC0tcGFzc3BocmFzZSApCisgICAgd2l0aF9wYXNzcGhyYXNlPSJ5ZXMiCisgICAgcGFzc3BocmFzZT0kMQorICAgIHNoaWZ0CisgICAgOzsKKworICAtLXByaXZpbGVnZWQgKQorICAgIGNzaWhfRk9SQ0VfUFJJVklMRUdFRF9VU0VSPXllcworICAgIDs7CisKKyAgKikKKyAgICBlY2hvICJ1c2FnZTogJHtQUk9HTkFNRX0gW09QVElPTl0uLi4iCisgICAgZWNobworICAgIGVjaG8gIlRoaXMgc2NyaXB0IGNyZWF0ZXMgYW4gT3BlblNTSCB1c2VyIGNvbmZpZ3VyYXRpb24uIgorICAgIGVjaG8KKyAgICBlY2hvICJPcHRpb25zOiIKKyAgICBlY2hvICIgICAgLS1kZWJ1ZyAgICAgIC1kICAgICAgICBFbmFibGUgc2hlbGwncyBkZWJ1ZyBvdXRwdXQuIgorICAgIGVjaG8gIiAgICAtLXllcyAgICAgICAgLXkgICAgICAgIEFuc3dlciBhbGwgcXVlc3Rpb25zIHdpdGggXCJ5ZXNcIiBhdXRvbWF0aWNhbGx5LiIKKyAgICBlY2hvICIgICAgLS1ubyAgICAgICAgIC1uICAgICAgICBBbnN3ZXIgYWxsIHF1ZXN0aW9ucyB3aXRoIFwibm9cIiBhdXRvbWF0aWNhbGx5LiIKKyAgICBlY2hvICIgICAgLS1wYXNzcGhyYXNlIC1wIHdvcmQgICBVc2UgXCJ3b3JkXCIgYXMgcGFzc3BocmFzZSBhdXRvbWF0aWNhbGx5LiIKKyAgICBlY2hvICIgICAgLS1wcml2aWxlZ2VkICAgICAgICAgICBPbiBXaW5kb3dzIE5ULzJrL1hQLCBhc3N1bWUgcHJpdmlsZWdlZCB1c2VyIgorICAgIGVjaG8gIiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgTG9jYWxTeXN0ZW0gZm9yIHNzaGQgc2VydmljZS4iCisgICAgZWNobworICAgIGV4aXQgMQorICAgIDs7CisKKyAgZXNhYworZG9uZQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQWN0aW9uIQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgQ2hlY2sgcGFzc3dkIGZpbGUKK2lmIFsgISAtZiAke1NZU0NPTkZESVJ9L3Bhc3N3ZCBdCit0aGVuCisgIGNzaWhfZXJyb3JfbXVsdGkgXAorICAgICIke1NZU0NPTkZESVJ9L3Bhc3N3ZCBpcyBub25leGlzdGFudC4gUGxlYXNlIGdlbmVyYXRlIGFuICR7U1lTQ09ORkRJUn0vcGFzc3dkIGZpbGUiIFwKKyAgICAnZmlyc3QgdXNpbmcgbWtwYXNzd2QuIENoZWNrIGlmIGl0IGNvbnRhaW5zIGFuIGVudHJ5IGZvciB5b3UgYW5kJyBcCisgICAgJ3BsZWFzZSBjYXJlIGZvciB0aGUgaG9tZSBkaXJlY3RvcnkgaW4geW91ciBlbnRyeSBhcyB3ZWxsLicKK2ZpCisKK2NoZWNrX3VzZXJfaG9tZWRpcgorY2hlY2tfdXNlcl9kb3Rfc3NoX2RpcgorY3JlYXRlX2lkZW50aXR5IGlkX3JzYSByc2EgIlNTSDIgUlNBIgorY3JlYXRlX2lkZW50aXR5IGlkX2RzYSBkc2EgIlNTSDIgRFNBIgorY3JlYXRlX2lkZW50aXR5IGlkX2VjZHNhIGVjZHNhICJTU0gyIEVDRFNBIgorY3JlYXRlX2lkZW50aXR5IGlkZW50aXR5IHJzYTEgIihkZXByZWNhdGVkKSBTU0gxIFJTQSIKK2ZpeF9hdXRob3JpemVkX2tleXNfcGVybXMKKworZWNobworY3NpaF9pbmZvcm0gIkNvbmZpZ3VyYXRpb24gZmluaXNoZWQuIEhhdmUgZnVuISIKKworCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvY3lnd2luL3NzaGQtaW5ldGQgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvY3lnd2luL3NzaGQtaW5ldGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE2YmYwNwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9jeWd3aW4vc3NoZC1pbmV0ZApAQCAtMCwwICsxLDQgQEAKKyMgVGhpcyBmaWxlIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBzc2hkIGFzIGEgc2xhdmUgb2YgdGhlIGluZXRkIHNlcnZpY2UKKyMgVG8gZG8gc28sIHRoZSBsaW5lIGJlbG93IHNob3VsZCBiZSB1bmNvbW1lbnRlZC4KK0BDT01NRU5UQCBzc2ggIHN0cmVhbSAgdGNwICAgICBub3dhaXQgIHJvb3QgICAgL3Vzci9zYmluL3NzaGQgc3NoZCAtaQorCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvZmluZHNzbC5zaCBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9maW5kc3NsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2M2ZkMjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvZmluZHNzbC5zaApAQCAtMCwwICsxLDE4NiBAQAorIyEvYmluL3NoCisjCisjICRJZDogZmluZHNzbC5zaCx2IDEuNCAyMDA3LzAyLzE5IDExOjQ0OjI1IGR0dWNrZXIgRXhwICQKKyMKKyMgZmluZHNzbC5zaAorIwlTZWFyY2ggZm9yIGFsbCBpbnN0YW5jZXMgb2YgT3BlblNTTCBoZWFkZXJzIGFuZCBsaWJyYXJpZXMKKyMJYW5kIHByaW50IHRoZWlyIHZlcnNpb25zLgorIwlJbnRlbmRlZCB0byBoZWxwIGRpYWdub3NlIE9wZW5TU0gncyAiT3BlblNTTCBoZWFkZXJzIGRvIG5vdAorIwltYXRjaCB5b3VyIGxpYnJhcnkiIGVycm9ycy4KKyMKKyMJV3JpdHRlbiBieSBEYXJyZW4gVHVja2VyIChkdHVja2VyIGF0IHppcCBkb3QgY29tIGRvdCBhdSkKKyMJVGhpcyBmaWxlIGlzIHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMKKyMJUmVsZWFzZSBoaXN0b3J5OgorIwkyMDAyLTA3LTI3OiBJbml0aWFsIHJlbGVhc2UuCisjCTIwMDItMDgtMDQ6IEFkZGVkIHB1YmxpYyBkb21haW4gbm90aWNlLgorIwkyMDAzLTA2LTI0OiBJbmNvcnBvcmF0ZWQgcmVhZG1lLCBzZXQgbGlicmFyeSBwYXRocy4gRmlyc3QgY3ZzIHZlcnNpb24uCisjCTIwMDQtMTItMTM6IEFkZCB0cmFwcyB0byBjbGVhbnVwIHRlbXAgZmlsZXMsIGZyb20gQW1hcmVuZHJhIEdvZGJvbGUuCisjCisjICJPcGVuU1NMIGhlYWRlcnMgZG8gbm90IG1hdGNoIHlvdXIgbGlicmFyeSIgYXJlIHVzdWFsbHkgY2F1c2VkIGJ5CisjIE9wZW5TU0gncyBjb25maWd1cmUgcGlja2luZyB1cCBhbiBvbGRlciB2ZXJzaW9uIG9mIE9wZW5TU0wgaGVhZGVycworIyBvciBsaWJyYXJpZXMuICBZb3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nICMgcHJvY2VkdXJlIHRvIGhlbHAgaWRlbnRpZnkKKyMgdGhlIGNhdXNlLgorIworIyBUaGUgIG91dHB1dCAgb2YgIGNvbmZpZ3VyZSAgd2lsbCAgdGVsbCB5b3UgdGhlIHZlcnNpb25zIG9mIHRoZSBPcGVuU1NMCisjIGhlYWRlcnMgYW5kIGxpYnJhcmllcyB0aGF0IHdlcmUgcGlja2VkIHVwLCBmb3IgZXhhbXBsZToKKyMKKyMgY2hlY2tpbmcgT3BlblNTTCBoZWFkZXIgdmVyc2lvbi4uLiA5MDYwNGYgKE9wZW5TU0wgMC45LjZkIDkgTWF5IDIwMDIpCisjIGNoZWNraW5nIE9wZW5TU0wgbGlicmFyeSB2ZXJzaW9uLi4uIDkwNjAyZiAoT3BlblNTTCAwLjkuNmIgW2VuZ2luZV0gOSBKdWwgMjAwMSkKKyMgY2hlY2tpbmcgd2hldGhlciBPcGVuU1NMJ3MgaGVhZGVycyBtYXRjaCB0aGUgbGlicmFyeS4uLiBubworIyBjb25maWd1cmU6IGVycm9yOiBZb3VyIE9wZW5TU0wgaGVhZGVycyBkbyBub3QgbWF0Y2ggeW91ciBsaWJyYXJ5CisjCisjIE5vdyBydW4gZmluZHNzbC5zaC4gVGhpcyBzaG91bGQgaWRlbnRpZnkgdGhlIGhlYWRlcnMgYW5kIGxpYnJhcmllcworIyBwcmVzZW50ICBhbmQgIHRoZWlyICB2ZXJzaW9ucy4gIFlvdSAgc2hvdWxkICBiZSAgYWJsZSAgdG8gaWRlbnRpZnkgdGhlCisjIGxpYnJhcmllcyAgYW5kIGhlYWRlcnMgdXNlZCBhbmQgYWRqdXN0IHlvdXIgQ0ZMQUdTIG9yIHJlbW92ZSBpbmNvcnJlY3QKKyMgdmVyc2lvbnMuICBUaGUgIG91dHB1dCB3aWxsIHNob3cgT3BlblNTTCdzIGludGVybmFsIHZlcnNpb24gaWRlbnRpZmllcgorIyBhbmQgc2hvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2U6CisKKyMgJCAuL2ZpbmRzc2wuc2gKKyMgU2VhcmNoaW5nIGZvciBPcGVuU1NMIGhlYWRlciBmaWxlcy4KKyMgMHgwMDkwNjA0ZkwgL3Vzci9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbHYuaAorIyAweDAwOTA2MDRmTCAvdXNyL2xvY2FsL3NzbC9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbHYuaAorIworIyBTZWFyY2hpbmcgZm9yIE9wZW5TU0wgc2hhcmVkIGxpYnJhcnkgZmlsZXMuCisjIDB4MDA5MDYwMmZMIC9saWIvbGliY3J5cHRvLnNvLjAuOS42YgorIyAweDAwOTA2MDJmTCAvbGliL2xpYmNyeXB0by5zby4yCisjIDB4MDA5MDU4MWZMIC91c3IvbGliL2xpYmNyeXB0by5zby4wCisjIDB4MDA5MDYwMmZMIC91c3IvbGliL2xpYmNyeXB0by5zbworIyAweDAwOTA1ODFmTCAvdXNyL2xpYi9saWJjcnlwdG8uc28uMC45LjVhCisjIDB4MDA5MDYwMGZMIC91c3IvbGliL2xpYmNyeXB0by5zby4wLjkuNgorIyAweDAwOTA2MDBmTCAvdXNyL2xpYi9saWJjcnlwdG8uc28uMQorIworIyBTZWFyY2hpbmcgZm9yIE9wZW5TU0wgc3RhdGljIGxpYnJhcnkgZmlsZXMuCisjIDB4MDA5MDYwMmZMIC91c3IvbGliL2xpYmNyeXB0by5hCisjIDB4MDA5MDYwNGZMIC91c3IvbG9jYWwvc3NsL2xpYi9saWJjcnlwdG8uYQorIworIyBJbiAgdGhpcyAgZXhhbXBsZSwgSSBnYXZlIGNvbmZpZ3VyZSBubyBleHRyYSBmbGFncywgc28gaXQncyBwaWNraW5nIHVwCisjIHRoZSAgT3BlblNTTCBoZWFkZXIgZnJvbSAvdXNyL2luY2x1ZGUvb3BlbnNzbCAoOTA2MDRmKSBhbmQgdGhlIGxpYnJhcnkKKyMgZnJvbSAvdXNyL2xpYi8gKDkwNjAyZikuCisKKyMKKyMgQWRqdXN0IHRoZXNlIHRvIHN1aXQgeW91ciBjb21waWxlci4KKyMgWW91IG1heSBhbHNvIG5lZWQgdG8gc2V0IHRoZSAqTElCKlBBVEggZW52aXJvbm1lbnQgdmFyaWFibGVzIGlmCisjIERFRkFVTFRfTElCUEFUSCBpcyBub3QgY29ycmVjdCBmb3IgeW91ciBzeXN0ZW0uCisjCitDQz1nY2MKK1NUQVRJQz0tc3RhdGljCisKKyMKKyMgQ2xlYW51cCBvbiBpbnRlcnJ1cHQKKyMKK3RyYXAgJ3JtIC1mIGNvbmZ0ZXN0LmMnIElOVCBIVVAgVEVSTQorCisjCisjIFNldCB1cCBjb25mdGVzdCBDIHNvdXJjZQorIworcm0gLWYgZmluZHNzbC5sb2cKK2NhdCA+Y29uZnRlc3QuYyA8PEVPRAorI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQgbWFpbigpe3ByaW50ZigiMHglMDh4TFxuIiwgU1NMZWF5KCkpO30KK0VPRAorCisjCisjIFNldCBkZWZhdWx0IGxpYnJhcnkgcGF0aHMgaWYgbm90IGFscmVhZHkgc2V0CisjCitERUZBVUxUX0xJQlBBVEg9L3Vzci9saWI6L3Vzci9sb2NhbC9saWIKK0xJQlBBVEg9JHtMSUJQQVRIOj0kREVGQVVMVF9MSUJQQVRIfQorTERfTElCUkFSWV9QQVRIPSR7TERfTElCUkFSWV9QQVRIOj0kREVGQVVMVF9MSUJQQVRIfQorTElCUkFSWV9QQVRIPSR7TElCUkFSWV9QQVRIOj0kREVGQVVMVF9MSUJQQVRIfQorZXhwb3J0IExJQlBBVEggTERfTElCUkFSWV9QQVRIIExJQlJBUllfUEFUSAorCisjIG5vdCBhbGwgcGxhdGZvcm1zIGhhdmUgYSAnd2hpY2gnIGNvbW1hbmQKK2lmIHdoaWNoIGxzID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KKyAgICA6IHdoaWNoIGlzIGRlZmluZWQKK2Vsc2UKKyAgICB3aGljaCAoKSB7CisJc2F2ZUlGUz0iJElGUyIKKwlJRlM9OgorCWZvciBwIGluICRQQVRIOyBkbworCSAgICBpZiB0ZXN0IC14ICIkcC8kMSIgLWEgLWYgIiRwLyQxIjsgdGhlbgorCQlJRlM9IiRzYXZlSUZTIgorCQllY2hvICIkcC8kMSIKKwkJcmV0dXJuIDAKKwkgICAgZmkKKwlkb25lCisJSUZTPSIkc2F2ZUlGUyIKKwlyZXR1cm4gMQorICAgIH0KK2ZpCisKKyMKKyMgU2VhcmNoIGZvciBPcGVuU1NMIGhlYWRlcnMgYW5kIHByaW50IHZlcnNpb25zCisjCitlY2hvIFNlYXJjaGluZyBmb3IgT3BlblNTTCBoZWFkZXIgZmlsZXMuCitpZiBbIC14ICJgd2hpY2ggbG9jYXRlYCIgXQordGhlbgorCWhlYWRlcnM9YGxvY2F0ZSBvcGVuc3Nsdi5oYAorZWxzZQorCWhlYWRlcnM9YGZpbmQgLyAtbmFtZSBvcGVuc3Nsdi5oIC1wcmludCAyPi9kZXYvbnVsbGAKK2ZpCisKK2ZvciBoZWFkZXIgaW4gJGhlYWRlcnMKK2RvCisJdmVyPWBhd2sgJy9PUEVOU1NMX1ZFUlNJT05fTlVNQkVSL3twcmludGYgXCQzfScgJGhlYWRlcmAKKwllY2hvICIkdmVyICRoZWFkZXIiCitkb25lCitlY2hvCisKKyMKKyMgU2VhcmNoIGZvciBzaGFyZWQgbGlicmFyaWVzLgorIyBSZWxpZXMgb24gc2hhcmVkIGxpYnJhcmllcyBsb29raW5nIGxpa2UgImxpYmNyeXB0by5zKiIKKyMKK2VjaG8gU2VhcmNoaW5nIGZvciBPcGVuU1NMIHNoYXJlZCBsaWJyYXJ5IGZpbGVzLgoraWYgWyAteCAiYHdoaWNoIGxvY2F0ZWAiIF0KK3RoZW4KKwlsaWJyYXJpZXM9YGxvY2F0ZSBsaWJjcnlwdG8uc2AKK2Vsc2UKKwlsaWJyYXJpZXM9YGZpbmQgLyAtbmFtZSAnbGliY3J5cHRvLnMqJyAtcHJpbnQgMj4vZGV2L251bGxgCitmaQorCitmb3IgbGliIGluICRsaWJyYXJpZXMKK2RvCisJKGVjaG8gIlRyeWluZyBsaWJjcnlwdG8gJGxpYiIgPj5maW5kc3NsLmxvZworCWRpcj1gZGlybmFtZSAkbGliYAorCUxJQlBBVEg9IiRkaXI6JExJQlBBVEgiCisJTERfTElCUkFSWV9QQVRIPSIkZGlyOiRMSUJQQVRIIgorCUxJQlJBUllfUEFUSD0iJGRpcjokTElCUEFUSCIKKwlleHBvcnQgTElCUEFUSCBMRF9MSUJSQVJZX1BBVEggTElCUkFSWV9QQVRICisJJHtDQ30gLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkbGliIDI+PmZpbmRzc2wubG9nCisJaWYgWyAteCAuL2NvbmZ0ZXN0IF0KKwl0aGVuCisJCXZlcj1gLi9jb25mdGVzdCAyPi9kZXYvbnVsbGAKKwkJcm0gLWYgLi9jb25mdGVzdAorCQllY2hvICIkdmVyICRsaWIiCisJZmkpCitkb25lCitlY2hvCisKKyMKKyMgU2VhcmNoIGZvciBzdGF0aWMgT3BlblNTTCBsaWJyYXJpZXMgYW5kIHByaW50IHZlcnNpb25zCisjCitlY2hvIFNlYXJjaGluZyBmb3IgT3BlblNTTCBzdGF0aWMgbGlicmFyeSBmaWxlcy4KK2lmIFsgLXggImB3aGljaCBsb2NhdGVgIiBdCit0aGVuCisJbGlicmFyaWVzPWBsb2NhdGUgbGliY3J5cHRvLmFgCitlbHNlCisJbGlicmFyaWVzPWBmaW5kIC8gLW5hbWUgbGliY3J5cHRvLmEgLXByaW50IDI+L2Rldi9udWxsYAorZmkKKworZm9yIGxpYiBpbiAkbGlicmFyaWVzCitkbworCWxpYmRpcj1gZGlybmFtZSAkbGliYAorCWVjaG8gIlRyeWluZyBsaWJjcnlwdG8gJGxpYiIgPj5maW5kc3NsLmxvZworCSR7Q0N9ICR7U1RBVElDfSAtbyBjb25mdGVzdCBjb25mdGVzdC5jIC1MJHtsaWJkaXJ9IC1sY3J5cHRvIDI+PmZpbmRzc2wubG9nCisJaWYgWyAteCAuL2NvbmZ0ZXN0IF0KKwl0aGVuCisJCXZlcj1gLi9jb25mdGVzdCAyPi9kZXYvbnVsbGAKKwkJcm0gLWYgLi9jb25mdGVzdAorCQllY2hvICIkdmVyICRsaWIiCisJZmkKK2RvbmUKKworIworIyBDbGVhbiB1cAorIworcm0gLWYgY29uZnRlc3QuYwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jb250cmliL2dub21lLXNzaC1hc2twYXNzMS5jIGIvb3BlbnNzaC02LjBwMS9jb250cmliL2dub21lLXNzaC1hc2twYXNzMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNTEwMzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvZ25vbWUtc3NoLWFza3Bhc3MxLmMKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBEYW1pZW4gTWlsbGVyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFRoaXMgaXMgYSBzaW1wbGUgR05PTUUgU1NIIHBhc3NwaHJhc2UgZ3JhYmJlci4gVG8gdXNlIGl0LCBzZXQgdGhlCisgKiBlbnZpcm9ubWVudCB2YXJpYWJsZSBTU0hfQVNLUEFTUyB0byBwb2ludCB0byB0aGUgbG9jYXRpb24gb2YKKyAqIGdub21lLXNzaC1hc2twYXNzIGJlZm9yZSBjYWxsaW5nICJzc2gtYWRkIDwgL2Rldi9udWxsIi4KKyAqCisgKiBUaGVyZSBpcyBvbmx5IHR3byBydW4tdGltZSBvcHRpb25zOiBpZiB5b3Ugc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorICogIkdOT01FX1NTSF9BU0tQQVNTX0dSQUJfU0VSVkVSPXRydWUiIHRoZW4gZ25vbWUtc3NoLWFza3Bhc3Mgd2lsbCBncmFiCisgKiB0aGUgWCBzZXJ2ZXIuIElmIHlvdSBzZXQgIkdOT01FX1NTSF9BU0tQQVNTX0dSQUJfUE9JTlRFUj10cnVlIiwgdGhlbiB0aGUKKyAqIHBvaW50ZXIgd2lsbCBiZSBncmFiYmVkIHRvby4gVGhlc2UgbWF5IGhhdmUgc29tZSBiZW5lZml0IHRvIHNlY3VyaXR5IGlmCisgKiB5b3UgZG9uJ3QgdHJ1c3QgeW91ciBYIHNlcnZlci4gV2UgZ3JhYiB0aGUga2V5Ym9hcmQgYWx3YXlzLgorICovCisKKy8qCisgKiBDb21waWxlIHdpdGg6CisgKgorICogY2MgYGdub21lLWNvbmZpZyAtLWNmbGFncyBnbm9tZSBnbm9tZXVpYCBcCisgKiAgICBnbm9tZS1zc2gtYXNrcGFzczEuYyAtbyBnbm9tZS1zc2gtYXNrcGFzcyBcCisgKiAgICBgZ25vbWUtY29uZmlnIC0tbGlicyBnbm9tZSBnbm9tZXVpYAorICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnbm9tZS5oPgorI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8Z2RrL2dka3guaD4KKwordm9pZAorcmVwb3J0X2ZhaWxlZF9ncmFiICh2b2lkKQoreworCUd0a1dpZGdldCAqZXJyOworCisJZXJyID0gZ25vbWVfbWVzc2FnZV9ib3hfbmV3KCJDb3VsZCBub3QgZ3JhYiBrZXlib2FyZCBvciBtb3VzZS5cbiIKKwkJIkEgbWFsaWNpb3VzIGNsaWVudCBtYXkgYmUgZWF2ZXNkcm9wcGluZyBvbiB5b3VyIHNlc3Npb24uIiwKKwkJCQkgICAgR05PTUVfTUVTU0FHRV9CT1hfRVJST1IsICJFWElUIiwgTlVMTCk7CisJZ3RrX3dpbmRvd19zZXRfcG9zaXRpb24oR1RLX1dJTkRPVyhlcnIpLCBHVEtfV0lOX1BPU19DRU5URVIpOworCWd0a19vYmplY3Rfc2V0KEdUS19PQkpFQ1QoZXJyKSwgInR5cGUiLCBHVEtfV0lORE9XX1BPUFVQLCBOVUxMKTsKKworCWdub21lX2RpYWxvZ19ydW5fYW5kX2Nsb3NlKEdOT01FX0RJQUxPRyhlcnIpKTsKK30KKworaW50CitwYXNzcGhyYXNlX2RpYWxvZyhjaGFyICptZXNzYWdlKQoreworCWNoYXIgKnBhc3NwaHJhc2U7CisJY2hhciAqKm1lc3NhZ2VzOworCWludCByZXN1bHQsIGksIGdyYWJfc2VydmVyLCBncmFiX3BvaW50ZXI7CisJR3RrV2lkZ2V0ICpkaWFsb2csICplbnRyeSwgKmxhYmVsOworCisJZ3JhYl9zZXJ2ZXIgPSAoZ2V0ZW52KCJHTk9NRV9TU0hfQVNLUEFTU19HUkFCX1NFUlZFUiIpICE9IE5VTEwpOworCWdyYWJfcG9pbnRlciA9IChnZXRlbnYoIkdOT01FX1NTSF9BU0tQQVNTX0dSQUJfUE9JTlRFUiIpICE9IE5VTEwpOworCisJZGlhbG9nID0gZ25vbWVfZGlhbG9nX25ldygiT3BlblNTSCIsIEdOT01FX1NUT0NLX0JVVFRPTl9PSywKKwkgICAgR05PTUVfU1RPQ0tfQlVUVE9OX0NBTkNFTCwgTlVMTCk7CisKKwltZXNzYWdlcyA9IGdfc3Ryc3BsaXQobWVzc2FnZSwgIlxcbiIsIDApOworCWlmIChtZXNzYWdlcykKKwkJZm9yKGkgPSAwOyBtZXNzYWdlc1tpXTsgaSsrKSB7CisJCQlsYWJlbCA9IGd0a19sYWJlbF9uZXcobWVzc2FnZXNbaV0pOworCQkJZ3RrX2JveF9wYWNrX3N0YXJ0KEdUS19CT1goR05PTUVfRElBTE9HKGRpYWxvZyktPnZib3gpLAorCQkJICAgIGxhYmVsLCBGQUxTRSwgRkFMU0UsIDApOworCQl9CisKKwllbnRyeSA9IGd0a19lbnRyeV9uZXcoKTsKKwlndGtfYm94X3BhY2tfc3RhcnQoR1RLX0JPWChHTk9NRV9ESUFMT0coZGlhbG9nKS0+dmJveCksIGVudHJ5LCBGQUxTRSwKKwkgICAgRkFMU0UsIDApOworCWd0a19lbnRyeV9zZXRfdmlzaWJpbGl0eShHVEtfRU5UUlkoZW50cnkpLCBGQUxTRSk7CisJZ3RrX3dpZGdldF9ncmFiX2ZvY3VzKGVudHJ5KTsKKworCS8qIENlbnRlciB3aW5kb3cgYW5kIHByZXBhcmUgZm9yIGdyYWIgKi8KKwlndGtfb2JqZWN0X3NldChHVEtfT0JKRUNUKGRpYWxvZyksICJ0eXBlIiwgR1RLX1dJTkRPV19QT1BVUCwgTlVMTCk7CisJZ25vbWVfZGlhbG9nX3NldF9kZWZhdWx0KEdOT01FX0RJQUxPRyhkaWFsb2cpLCAwKTsKKwlndGtfd2luZG93X3NldF9wb3NpdGlvbiAoR1RLX1dJTkRPVyhkaWFsb2cpLCBHVEtfV0lOX1BPU19DRU5URVIpOworCWd0a193aW5kb3dfc2V0X3BvbGljeShHVEtfV0lORE9XKGRpYWxvZyksIEZBTFNFLCBGQUxTRSwgVFJVRSk7CisJZ25vbWVfZGlhbG9nX2Nsb3NlX2hpZGVzKEdOT01FX0RJQUxPRyhkaWFsb2cpLCBUUlVFKTsKKwlndGtfY29udGFpbmVyX3NldF9ib3JkZXJfd2lkdGgoR1RLX0NPTlRBSU5FUihHTk9NRV9ESUFMT0coZGlhbG9nKS0+dmJveCksCisJICAgIEdOT01FX1BBRCk7CisJZ3RrX3dpZGdldF9zaG93X2FsbChkaWFsb2cpOworCisJLyogR3JhYiBmb2N1cyAqLworCWlmIChncmFiX3NlcnZlcikKKwkJWEdyYWJTZXJ2ZXIoR0RLX0RJU1BMQVkoKSk7CisJaWYgKGdyYWJfcG9pbnRlciAmJiBnZGtfcG9pbnRlcl9ncmFiKGRpYWxvZy0+d2luZG93LCBUUlVFLCAwLAorCSAgICBOVUxMLCBOVUxMLCBHREtfQ1VSUkVOVF9USU1FKSkKKwkJZ290byBub2dyYWI7CisJaWYgKGdka19rZXlib2FyZF9ncmFiKGRpYWxvZy0+d2luZG93LCBGQUxTRSwgR0RLX0NVUlJFTlRfVElNRSkpCisJCWdvdG8gbm9ncmFia2I7CisKKwkvKiBNYWtlIDxlbnRlcj4gY2xvc2UgZGlhbG9nICovCisJZ25vbWVfZGlhbG9nX2VkaXRhYmxlX2VudGVycyhHTk9NRV9ESUFMT0coZGlhbG9nKSwgR1RLX0VESVRBQkxFKGVudHJ5KSk7CisKKwkvKiBSdW4gZGlhbG9nICovCisJcmVzdWx0ID0gZ25vbWVfZGlhbG9nX3J1bihHTk9NRV9ESUFMT0coZGlhbG9nKSk7CisKKwkvKiBVbmdyYWIgKi8KKwlpZiAoZ3JhYl9zZXJ2ZXIpCisJCVhVbmdyYWJTZXJ2ZXIoR0RLX0RJU1BMQVkoKSk7CisJaWYgKGdyYWJfcG9pbnRlcikKKwkJZ2RrX3BvaW50ZXJfdW5ncmFiKEdES19DVVJSRU5UX1RJTUUpOworCWdka19rZXlib2FyZF91bmdyYWIoR0RLX0NVUlJFTlRfVElNRSk7CisJZ2RrX2ZsdXNoKCk7CisKKwkvKiBSZXBvcnQgcGFzc3BocmFzZSBpZiB1c2VyIHNlbGVjdGVkIE9LICovCisJcGFzc3BocmFzZSA9IGd0a19lbnRyeV9nZXRfdGV4dChHVEtfRU5UUlkoZW50cnkpKTsKKwlpZiAocmVzdWx0ID09IDApCisJCXB1dHMocGFzc3BocmFzZSk7CisJCQorCS8qIFplcm8gcGFzc3BocmFzZSBpbiBtZW1vcnkgKi8KKwltZW1zZXQocGFzc3BocmFzZSwgJ1wwJywgc3RybGVuKHBhc3NwaHJhc2UpKTsKKwlndGtfZW50cnlfc2V0X3RleHQoR1RLX0VOVFJZKGVudHJ5KSwgcGFzc3BocmFzZSk7CisJCQkKKwlnbm9tZV9kaWFsb2dfY2xvc2UoR05PTUVfRElBTE9HKGRpYWxvZykpOworCXJldHVybiAocmVzdWx0ID09IDAgPyAwIDogLTEpOworCisJLyogQXQgbGVhc3Qgb25lIGdyYWIgZmFpbGVkIC0gdW5ncmFiIHdoYXQgd2UgZ290LCBhbmQgcmVwb3J0CisJICAgdGhlIGZhaWx1cmUgdG8gdGhlIHVzZXIuICBOb3RlIHRoYXQgWEdyYWJTZXJ2ZXIoKSBjYW5ub3QKKwkgICBmYWlsLiAgKi8KKyBub2dyYWJrYjoKKwlnZGtfcG9pbnRlcl91bmdyYWIoR0RLX0NVUlJFTlRfVElNRSk7Cisgbm9ncmFiOgorCWlmIChncmFiX3NlcnZlcikKKwkJWFVuZ3JhYlNlcnZlcihHREtfRElTUExBWSgpKTsKKwlnbm9tZV9kaWFsb2dfY2xvc2UoR05PTUVfRElBTE9HKGRpYWxvZykpOworCQorCXJlcG9ydF9mYWlsZWRfZ3JhYigpOworCXJldHVybiAoLTEpOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKm1lc3NhZ2U7CisJaW50IHJlc3VsdDsKKworCWdub21lX2luaXQoIkdOT01FIHNzaC1hc2twYXNzIiwgIjAuMSIsIGFyZ2MsIGFyZ3YpOworCisJaWYgKGFyZ2MgPT0gMikKKwkJbWVzc2FnZSA9IGFyZ3ZbMV07CisJZWxzZQorCQltZXNzYWdlID0gIkVudGVyIHlvdXIgT3BlblNTSCBwYXNzcGhyYXNlOiI7CisKKwlzZXR2YnVmKHN0ZG91dCwgMCwgX0lPTkJGLCAwKTsKKwlyZXN1bHQgPSBwYXNzcGhyYXNlX2RpYWxvZyhtZXNzYWdlKTsKKworCXJldHVybiAocmVzdWx0KTsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvY29udHJpYi9nbm9tZS1zc2gtYXNrcGFzczIuYyBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9nbm9tZS1zc2gtYXNrcGFzczIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDk3YzMwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9jb250cmliL2dub21lLXNzaC1hc2twYXNzMi5jCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgRGFtaWVuIE1pbGxlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qIEdUSzIgc3VwcG9ydCBieSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+ICovCisKKy8qCisgKiBUaGlzIGlzIGEgc2ltcGxlIEdOT01FIFNTSCBwYXNzcGhyYXNlIGdyYWJiZXIuIFRvIHVzZSBpdCwgc2V0IHRoZQorICogZW52aXJvbm1lbnQgdmFyaWFibGUgU1NIX0FTS1BBU1MgdG8gcG9pbnQgdG8gdGhlIGxvY2F0aW9uIG9mCisgKiBnbm9tZS1zc2gtYXNrcGFzcyBiZWZvcmUgY2FsbGluZyAic3NoLWFkZCA8IC9kZXYvbnVsbCIuCisgKgorICogVGhlcmUgaXMgb25seSB0d28gcnVuLXRpbWUgb3B0aW9uczogaWYgeW91IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAqICJHTk9NRV9TU0hfQVNLUEFTU19HUkFCX1NFUlZFUj10cnVlIiB0aGVuIGdub21lLXNzaC1hc2twYXNzIHdpbGwgZ3JhYgorICogdGhlIFggc2VydmVyLiBJZiB5b3Ugc2V0ICJHTk9NRV9TU0hfQVNLUEFTU19HUkFCX1BPSU5URVI9dHJ1ZSIsIHRoZW4gdGhlCisgKiBwb2ludGVyIHdpbGwgYmUgZ3JhYmJlZCB0b28uIFRoZXNlIG1heSBoYXZlIHNvbWUgYmVuZWZpdCB0byBzZWN1cml0eSBpZgorICogeW91IGRvbid0IHRydXN0IHlvdXIgWCBzZXJ2ZXIuIFdlIGdyYWIgdGhlIGtleWJvYXJkIGFsd2F5cy4KKyAqLworCisjZGVmaW5lIEdSQUJfVFJJRVMJMTYKKyNkZWZpbmUgR1JBQl9XQUlUCTI1MCAvKiBtaWxsaXNlY29uZHMgKi8KKworLyoKKyAqIENvbXBpbGUgd2l0aDoKKyAqCisgKiBjYyAtV2FsbCBgcGtnLWNvbmZpZyAtLWNmbGFncyBndGsrLTIuMGAgXAorICogICAgZ25vbWUtc3NoLWFza3Bhc3MyLmMgLW8gZ25vbWUtc3NoLWFza3Bhc3MgXAorICogICAgYHBrZy1jb25maWcgLS1saWJzIGd0aystMi4wYAorICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDxnZGsvZ2RreC5oPgorCitzdGF0aWMgdm9pZAorcmVwb3J0X2ZhaWxlZF9ncmFiIChjb25zdCBjaGFyICp3aGF0KQoreworCUd0a1dpZGdldCAqZXJyOworCisJZXJyID0gZ3RrX21lc3NhZ2VfZGlhbG9nX25ldyhOVUxMLCAwLAorCQkJCSAgICAgR1RLX01FU1NBR0VfRVJST1IsCisJCQkJICAgICBHVEtfQlVUVE9OU19DTE9TRSwKKwkJCQkgICAgICJDb3VsZCBub3QgZ3JhYiAlcy4gIgorCQkJCSAgICAgIkEgbWFsaWNpb3VzIGNsaWVudCBtYXkgYmUgZWF2ZXNkcm9wcGluZyAiCisJCQkJICAgICAib24geW91ciBzZXNzaW9uLiIsIHdoYXQpOworCWd0a193aW5kb3dfc2V0X3Bvc2l0aW9uKEdUS19XSU5ET1coZXJyKSwgR1RLX1dJTl9QT1NfQ0VOVEVSKTsKKwlndGtfbGFiZWxfc2V0X2xpbmVfd3JhcChHVEtfTEFCRUwoKEdUS19NRVNTQUdFX0RJQUxPRyhlcnIpKS0+bGFiZWwpLAorCQkJCVRSVUUpOworCisJZ3RrX2RpYWxvZ19ydW4oR1RLX0RJQUxPRyhlcnIpKTsKKworCWd0a193aWRnZXRfZGVzdHJveShlcnIpOworfQorCitzdGF0aWMgdm9pZAorb2tfZGlhbG9nKEd0a1dpZGdldCAqZW50cnksIGdwb2ludGVyIGRpYWxvZykKK3sKKwlnX3JldHVybl9pZl9mYWlsKEdUS19JU19ESUFMT0coZGlhbG9nKSk7CisJZ3RrX2RpYWxvZ19yZXNwb25zZShHVEtfRElBTE9HKGRpYWxvZyksIEdUS19SRVNQT05TRV9PSyk7Cit9CisKK3N0YXRpYyBpbnQKK3Bhc3NwaHJhc2VfZGlhbG9nKGNoYXIgKm1lc3NhZ2UpCit7CisJY29uc3QgY2hhciAqZmFpbGVkOworCWNoYXIgKnBhc3NwaHJhc2UsICpsb2NhbDsKKwlpbnQgcmVzdWx0LCBncmFiX3RyaWVzLCBncmFiX3NlcnZlciwgZ3JhYl9wb2ludGVyOworCUd0a1dpZGdldCAqZGlhbG9nLCAqZW50cnk7CisJR2RrR3JhYlN0YXR1cyBzdGF0dXM7CisKKwlncmFiX3NlcnZlciA9IChnZXRlbnYoIkdOT01FX1NTSF9BU0tQQVNTX0dSQUJfU0VSVkVSIikgIT0gTlVMTCk7CisJZ3JhYl9wb2ludGVyID0gKGdldGVudigiR05PTUVfU1NIX0FTS1BBU1NfR1JBQl9QT0lOVEVSIikgIT0gTlVMTCk7CisJZ3JhYl90cmllcyA9IDA7CisKKwlkaWFsb2cgPSBndGtfbWVzc2FnZV9kaWFsb2dfbmV3KE5VTEwsIDAsCisJCQkJCUdUS19NRVNTQUdFX1FVRVNUSU9OLAorCQkJCQlHVEtfQlVUVE9OU19PS19DQU5DRUwsCisJCQkJCSIlcyIsCisJCQkJCW1lc3NhZ2UpOworCisJZW50cnkgPSBndGtfZW50cnlfbmV3KCk7CisJZ3RrX2JveF9wYWNrX3N0YXJ0KEdUS19CT1goR1RLX0RJQUxPRyhkaWFsb2cpLT52Ym94KSwgZW50cnksIEZBTFNFLAorCSAgICBGQUxTRSwgMCk7CisJZ3RrX2VudHJ5X3NldF92aXNpYmlsaXR5KEdUS19FTlRSWShlbnRyeSksIEZBTFNFKTsKKwlndGtfd2lkZ2V0X2dyYWJfZm9jdXMoZW50cnkpOworCWd0a193aWRnZXRfc2hvdyhlbnRyeSk7CisKKwlndGtfd2luZG93X3NldF90aXRsZShHVEtfV0lORE9XKGRpYWxvZyksICJPcGVuU1NIIik7CisJZ3RrX3dpbmRvd19zZXRfcG9zaXRpb24gKEdUS19XSU5ET1coZGlhbG9nKSwgR1RLX1dJTl9QT1NfQ0VOVEVSKTsKKwlndGtfd2luZG93X3NldF9rZWVwX2Fib3ZlKEdUS19XSU5ET1coZGlhbG9nKSwgVFJVRSk7CisJZ3RrX2xhYmVsX3NldF9saW5lX3dyYXAoR1RLX0xBQkVMKChHVEtfTUVTU0FHRV9ESUFMT0coZGlhbG9nKSktPmxhYmVsKSwKKwkJCQlUUlVFKTsKKworCS8qIE1ha2UgPGVudGVyPiBjbG9zZSBkaWFsb2cgKi8KKwlndGtfZGlhbG9nX3NldF9kZWZhdWx0X3Jlc3BvbnNlKEdUS19ESUFMT0coZGlhbG9nKSwgR1RLX1JFU1BPTlNFX09LKTsKKwlnX3NpZ25hbF9jb25uZWN0KEdfT0JKRUNUKGVudHJ5KSwgImFjdGl2YXRlIiwKKwkJCSBHX0NBTExCQUNLKG9rX2RpYWxvZyksIGRpYWxvZyk7CisKKwlndGtfd2luZG93X3NldF9rZWVwX2Fib3ZlKEdUS19XSU5ET1coZGlhbG9nKSwgVFJVRSk7CisKKwkvKiBHcmFiIGZvY3VzICovCisJZ3RrX3dpZGdldF9zaG93X25vdyhkaWFsb2cpOworCWlmIChncmFiX3BvaW50ZXIpIHsKKwkJZm9yKDs7KSB7CisJCQlzdGF0dXMgPSBnZGtfcG9pbnRlcl9ncmFiKAorCQkJICAgKEdUS19XSURHRVQoZGlhbG9nKSktPndpbmRvdywgVFJVRSwgMCwgTlVMTCwKKwkJCSAgIE5VTEwsIEdES19DVVJSRU5UX1RJTUUpOworCQkJaWYgKHN0YXR1cyA9PSBHREtfR1JBQl9TVUNDRVNTKQorCQkJCWJyZWFrOworCQkJdXNsZWVwKEdSQUJfV0FJVCAqIDEwMDApOworCQkJaWYgKCsrZ3JhYl90cmllcyA+IEdSQUJfVFJJRVMpIHsKKwkJCQlmYWlsZWQgPSAibW91c2UiOworCQkJCWdvdG8gbm9ncmFiOworCQkJfQorCQl9CisJfQorCWZvcig7OykgeworCQlzdGF0dXMgPSBnZGtfa2V5Ym9hcmRfZ3JhYigoR1RLX1dJREdFVChkaWFsb2cpKS0+d2luZG93LAorCQkgICBGQUxTRSwgR0RLX0NVUlJFTlRfVElNRSk7CisJCWlmIChzdGF0dXMgPT0gR0RLX0dSQUJfU1VDQ0VTUykKKwkJCWJyZWFrOworCQl1c2xlZXAoR1JBQl9XQUlUICogMTAwMCk7CisJCWlmICgrK2dyYWJfdHJpZXMgPiBHUkFCX1RSSUVTKSB7CisJCQlmYWlsZWQgPSAia2V5Ym9hcmQiOworCQkJZ290byBub2dyYWJrYjsKKwkJfQorCX0KKwlpZiAoZ3JhYl9zZXJ2ZXIpIHsKKwkJZ2RrX3gxMV9ncmFiX3NlcnZlcigpOworCX0KKworCXJlc3VsdCA9IGd0a19kaWFsb2dfcnVuKEdUS19ESUFMT0coZGlhbG9nKSk7CisKKwkvKiBVbmdyYWIgKi8KKwlpZiAoZ3JhYl9zZXJ2ZXIpCisJCVhVbmdyYWJTZXJ2ZXIoR0RLX0RJU1BMQVkoKSk7CisJaWYgKGdyYWJfcG9pbnRlcikKKwkJZ2RrX3BvaW50ZXJfdW5ncmFiKEdES19DVVJSRU5UX1RJTUUpOworCWdka19rZXlib2FyZF91bmdyYWIoR0RLX0NVUlJFTlRfVElNRSk7CisJZ2RrX2ZsdXNoKCk7CisKKwkvKiBSZXBvcnQgcGFzc3BocmFzZSBpZiB1c2VyIHNlbGVjdGVkIE9LICovCisJcGFzc3BocmFzZSA9IGdfc3RyZHVwKGd0a19lbnRyeV9nZXRfdGV4dChHVEtfRU5UUlkoZW50cnkpKSk7CisJaWYgKHJlc3VsdCA9PSBHVEtfUkVTUE9OU0VfT0spIHsKKwkJbG9jYWwgPSBnX2xvY2FsZV9mcm9tX3V0ZjgocGFzc3BocmFzZSwgc3RybGVuKHBhc3NwaHJhc2UpLAorCQkJCQkgICBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJaWYgKGxvY2FsICE9IE5VTEwpIHsKKwkJCXB1dHMobG9jYWwpOworCQkJbWVtc2V0KGxvY2FsLCAnXDAnLCBzdHJsZW4obG9jYWwpKTsKKwkJCWdfZnJlZShsb2NhbCk7CisJCX0gZWxzZSB7CisJCQlwdXRzKHBhc3NwaHJhc2UpOworCQl9CisJfQorCQkKKwkvKiBaZXJvIHBhc3NwaHJhc2UgaW4gbWVtb3J5ICovCisJbWVtc2V0KHBhc3NwaHJhc2UsICdcYicsIHN0cmxlbihwYXNzcGhyYXNlKSk7CisJZ3RrX2VudHJ5X3NldF90ZXh0KEdUS19FTlRSWShlbnRyeSksIHBhc3NwaHJhc2UpOworCW1lbXNldChwYXNzcGhyYXNlLCAnXDAnLCBzdHJsZW4ocGFzc3BocmFzZSkpOworCWdfZnJlZShwYXNzcGhyYXNlKTsKKwkJCQorCWd0a193aWRnZXRfZGVzdHJveShkaWFsb2cpOworCXJldHVybiAocmVzdWx0ID09IEdUS19SRVNQT05TRV9PSyA/IDAgOiAtMSk7CisKKwkvKiBBdCBsZWFzdCBvbmUgZ3JhYiBmYWlsZWQgLSB1bmdyYWIgd2hhdCB3ZSBnb3QsIGFuZCByZXBvcnQKKwkgICB0aGUgZmFpbHVyZSB0byB0aGUgdXNlci4gIE5vdGUgdGhhdCBYR3JhYlNlcnZlcigpIGNhbm5vdAorCSAgIGZhaWwuICAqLworIG5vZ3JhYmtiOgorCWdka19wb2ludGVyX3VuZ3JhYihHREtfQ1VSUkVOVF9USU1FKTsKKyBub2dyYWI6CisJaWYgKGdyYWJfc2VydmVyKQorCQlYVW5ncmFiU2VydmVyKEdES19ESVNQTEFZKCkpOworCWd0a193aWRnZXRfZGVzdHJveShkaWFsb2cpOworCQorCXJlcG9ydF9mYWlsZWRfZ3JhYihmYWlsZWQpOworCisJcmV0dXJuICgtMSk7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqbWVzc2FnZTsKKwlpbnQgcmVzdWx0OworCisJZ3RrX2luaXQoJmFyZ2MsICZhcmd2KTsKKworCWlmIChhcmdjID4gMSkgeworCQltZXNzYWdlID0gZ19zdHJqb2ludigiICIsIGFyZ3YgKyAxKTsKKwl9IGVsc2UgeworCQltZXNzYWdlID0gZ19zdHJkdXAoIkVudGVyIHlvdXIgT3BlblNTSCBwYXNzcGhyYXNlOiIpOworCX0KKworCXNldHZidWYoc3Rkb3V0LCAwLCBfSU9OQkYsIDApOworCXJlc3VsdCA9IHBhc3NwaHJhc2VfZGlhbG9nKG1lc3NhZ2UpOworCWdfZnJlZShtZXNzYWdlKTsKKworCXJldHVybiAocmVzdWx0KTsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvY29udHJpYi9ocHV4L1JFQURNRSBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9ocHV4L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGJmYTg0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9jb250cmliL2hwdXgvUkVBRE1FCkBAIC0wLDAgKzEsNDUgQEAKK1JFQURNRSBmb3IgT3BlblNTSCBIUC1VWCBjb250cmliIGZpbGVzCitLZXZpbiBTdGV2ZXMgPHN0ZXZlc2tAcG9ib3guY29tPgorCitzc2hkOgkJY29uZmlndXJhdGlvbiBmaWxlIGZvciBzc2hkLnJjCitzc2hkLnJjOglTU0ggc3RhcnR1cCBzY3JpcHQKK2VnZDoJCWNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgZWdkLnJjCitlZ2QucmM6CQlFR0QgKGVudHJvcHkgZ2F0aGVyaW5nIGRhZW1vbikgc3RhcnR1cCBzY3JpcHQKKworVG8gaW5zdGFsbDoKKworc3NoZC5yYzoKKworbyBWZXJpZnkgcGF0aHMgaW4gc3NoZC5yYyBtYXRjaCB5b3VyIGxvY2FsIGluc3RhbGxhdGlvbgorICAoV0hBVF9QQVRIIGFuZCBXSEFUX1BJRCkKK28gQ3VzdG9taXplIHNzaGQgaWYgbmVlZGVkIChTU0hEX0FSR1MpCitvIEluc3RhbGw6CisKKyAgIyBjcCBzc2hkIC9ldGMvcmMuY29uZmlnLmQKKyAgIyBjaG1vZCA0NDQgL2V0Yy9yYy5jb25maWcuZC9zc2hkCisgICMgY3Agc3NoZC5yYyAvc2Jpbi9pbml0LmQKKyAgIyBjaG1vZCA1NTUgL3NiaW4vaW5pdC5kL3NzaGQucmMKKyAgIyBsbiAtcyAvc2Jpbi9pbml0LmQvc3NoZC5yYyAvc2Jpbi9yYzEuZC9LMTAwc3NoZAorICAjIGxuIC1zIC9zYmluL2luaXQuZC9zc2hkLnJjIC9zYmluL3JjMi5kL1M5MDBzc2hkCisKK2VnZC5yYzoKKworbyBWZXJpZnkgZWdkLnBsIHBhdGggaW4gZWdkLnJjIG1hdGNoZXMgeW91ciBsb2NhbCBpbnN0YWxsYXRpb24KKyAgKFdIQVRfUEFUSCkKK28gQ3VzdG9taXplIGVnZCBpZiBuZWVkZWQgKEVHRF9BUkdTIGFuZCBFR0RfTE9HKQorbyBBZGQgcHNldWRvIGFjY291bnQ6CisKKyAgIyBncm91cGFkZCBlZ2QKKyAgIyB1c2VyYWRkIC1nIGVnZCBlZ2QKKyAgIyBta2RpciAtcCAvZXRjL29wdC9lZ2QKKyAgIyBjaG93biBlZ2Q6ZWdkIC9ldGMvb3B0L2VnZAorICAjIGNobW9kIDcxMSAvZXRjL29wdC9lZ2QKKworbyBJbnN0YWxsOgorCisgICMgY3AgZWdkIC9ldGMvcmMuY29uZmlnLmQKKyAgIyBjaG1vZCA0NDQgL2V0Yy9yYy5jb25maWcuZC9lZ2QKKyAgIyBjcCBlZ2QucmMgL3NiaW4vaW5pdC5kCisgICMgY2htb2QgNTU1IC9zYmluL2luaXQuZC9lZ2QucmMKKyAgIyBsbiAtcyAvc2Jpbi9pbml0LmQvZWdkLnJjIC9zYmluL3JjMS5kL0s2MDBlZ2QKKyAgIyBsbiAtcyAvc2Jpbi9pbml0LmQvZWdkLnJjIC9zYmluL3JjMi5kL1M0MDBlZ2QKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvY29udHJpYi9ocHV4L2VnZCBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9ocHV4L2VnZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWFmMGJkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9jb250cmliL2hwdXgvZWdkCkBAIC0wLDAgKzEsMTUgQEAKKyMgRUdEX1NUQVJUOgkJU2V0IHRvIDEgdG8gc3RhcnQgZW50cm9weSBnYXRoZXJpbmcgZGFlbW9uCisjIEVHRF9BUkdTOgkJQ29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBwYXNzIHRvIGVnZAorIyBFR0RfTE9HOgkJRUdEIHN0ZG91dCBhbmQgc3RkZXJyIGxvZyBmaWxlIChkZWZhdWx0IC9ldGMvb3B0L2VnZC9lZ2QubG9nKQorIworIyBUbyBjb25maWd1cmUgdGhlIGVnZCBlbnZpcm9ubWVudDoKKworIyBncm91cGFkZCBlZ2QKKyMgdXNlcmFkZCAtZyBlZ2QgZWdkCisjIG1rZGlyIC1wIC9ldGMvb3B0L2VnZAorIyBjaG93biBlZ2Q6ZWdkIC9ldGMvb3B0L2VnZAorIyBjaG1vZCA3MTEgL2V0Yy9vcHQvZWdkCisKK0VHRF9TVEFSVD0xCitFR0RfQVJHUz0nL2V0Yy9vcHQvZWdkL2VudHJvcHknCitFR0RfTE9HPQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jb250cmliL2hwdXgvZWdkLnJjIGIvb3BlbnNzaC02LjBwMS9jb250cmliL2hwdXgvZWdkLnJjCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkxOWRlYTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvaHB1eC9lZ2QucmMKQEAgLTAsMCArMSw5OCBAQAorIyEvc2Jpbi9zaAorCisjCisjIGVnZC5yYzogRUdEIHN0YXJ0LXVwIGFuZCBzaHV0ZG93biBzY3JpcHQKKyMKKworIyBBbGxvd2VkIGV4aXQgdmFsdWVzOgorIyAgICAgICAwID0gc3VjY2VzczsgY2F1c2VzICJPSyIgdG8gc2hvdyB1cCBpbiBjaGVja2xpc3QuCisjICAgICAgIDEgPSBmYWlsdXJlOyBjYXVzZXMgIkZBSUwiIHRvIHNob3cgdXAgaW4gY2hlY2tsaXN0LgorIyAgICAgICAyID0gc2tpcDsgY2F1c2VzICJOL0EiIHRvIHNob3cgdXAgaW4gdGhlIGNoZWNrbGlzdC4KKyMgICAgICAgICAgIFVzZSB0aGlzIHZhbHVlIGlmIGV4ZWN1dGlvbiBvZiB0aGlzIHNjcmlwdCBpcyBvdmVycmlkZGVuCisjICAgICAgICAgICBieSB0aGUgdXNlIG9mIGEgY29udHJvbCB2YXJpYWJsZSwgb3IgaWYgdGhpcyBzY3JpcHQgaXMgbm90CisjICAgICAgICAgICBhcHByb3ByaWF0ZSB0byBleGVjdXRlIGZvciBzb21lIG90aGVyIHJlYXNvbi4KKyMgICAgICAgMyA9IHJlYm9vdDsgY2F1c2VzIHRoZSBzeXN0ZW0gdG8gYmUgcmVib290ZWQgYWZ0ZXIgZXhlY3V0aW9uLgorCisjIElucHV0IGFuZCBvdXRwdXQ6CisjICAgICAgIHN0ZGluIGlzIHJlZGlyZWN0ZWQgZnJvbSAvZGV2L251bGwKKyMKKyMgICAgICAgc3Rkb3V0IGFuZCBzdGRlcnIgYXJlIHJlZGlyZWN0ZWQgdG8gdGhlIC9ldGMvcmMubG9nIGZpbGUKKyMgICAgICAgZHVyaW5nIGNoZWNrbGlzdCBtb2RlLCBvciB0byB0aGUgY29uc29sZSBpbiByYXcgbW9kZS4KKwordW1hc2sgMDIyCisKK1BBVEg9L3Vzci9zYmluOi91c3IvYmluOi9zYmluCitleHBvcnQgUEFUSAorCitXSEFUPSdFR0QgKGVudHJvcHkgZ2F0aGVyaW5nIGRhZW1vbiknCitXSEFUX1BBVEg9L29wdC9wZXJsL2Jpbi9lZ2QucGwKK1dIQVRfQ09ORklHPS9ldGMvcmMuY29uZmlnLmQvZWdkCitXSEFUX0xPRz0vZXRjL29wdC9lZ2QvZWdkLmxvZworCisjIE5PVEU6IElmIHlvdXIgc2NyaXB0IGV4ZWN1dGVzIGluIHJ1biBzdGF0ZSAwIG9yIHN0YXRlIDEsIHRoZW4gL3VzciBtaWdodAorIyAgICAgICBub3QgYmUgYXZhaWxhYmxlLiAgRG8gbm90IGF0dGVtcHQgdG8gYWNjZXNzIGNvbW1hbmRzIG9yIGZpbGVzIGluCisjICAgICAgIC91c3IgdW5sZXNzIHlvdXIgc2NyaXB0IGV4ZWN1dGVzIGluIHJ1biBzdGF0ZSAyIG9yIGdyZWF0ZXIuICBPdGhlcgorIyAgICAgICBmaWxlIHN5c3RlbXMgdHlwaWNhbGx5IG5vdCBtb3VudGVkIHVudGlsIHJ1biBzdGF0ZSAyIGluY2x1ZGUgL3ZhcgorIyAgICAgICBhbmQgL29wdC4KKworcnZhbD0wCisKKyMgQ2hlY2sgdGhlIGV4aXQgdmFsdWUgb2YgYSBjb21tYW5kIHJ1biBieSB0aGlzIHNjcmlwdC4gIElmIG5vbi16ZXJvLCB0aGUKKyMgZXhpdCBjb2RlIGlzIGVjaG9lZCB0byB0aGUgbG9nIGZpbGUgYW5kIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBzY3JpcHQKKyMgaXMgc2V0IHRvIGluZGljYXRlIGZhaWx1cmUuCisKK3NldF9yZXR1cm4oKSB7CisJeD0kPworCWlmIFsgJHggLW5lIDAgXTsgdGhlbgorCQllY2hvICJFWElUIENPREU6ICR4IgorCQlydmFsPTEJIyBzY3JpcHQgRkFJTGVkCisJZmkKK30KKworY2FzZSAkMSBpbgorJ3N0YXJ0X21zZycpCisJZWNobyAiU3RhcnRpbmcgJFdIQVQiCisJOzsKKworJ3N0b3BfbXNnJykKKwllY2hvICJTdG9wcGluZyAkV0hBVCIKKwk7OworCisnc3RhcnQnKQorCWlmIFsgLWYgJFdIQVRfQ09ORklHIF0gOyB0aGVuCisJCS4gJFdIQVRfQ09ORklHCisJZWxzZQorCQllY2hvICJFUlJPUjogJFdIQVRfQ09ORklHIGRlZmF1bHRzIGZpbGUgTUlTU0lORyIKKwlmaQorCQorCisJaWYgWyAiJEVHRF9TVEFSVCIgLWVxIDEgLWEgLXggJFdIQVRfUEFUSCBdOyB0aGVuCisJCUVHRF9MT0c9JHtFR0RfTE9HOi0kV0hBVF9MT0d9CisJCXN1IGVnZCAtYyAibm9odXAgJFdIQVRfUEFUSCAkRUdEX0FSR1MgPiRFR0RfTE9HIDI+JjEiICYmCisJCQllY2hvICRXSEFUIHN0YXJ0ZWQKKwkJc2V0X3JldHVybgorCWVsc2UKKwkJcnZhbD0yCisJZmkKKwk7OworCisnc3RvcCcpCisJcGlkPWBwcyAtZnVlZ2QgfCBhd2sgJyQxID09ICJlZ2QiIHsgcHJpbnQgJDIgfSdgCisJaWYgWyAiWCRwaWQiICE9ICJYIiBdOyB0aGVuCisJCWlmIGtpbGwgIiRwaWQiOyB0aGVuCisJCQllY2hvICIkV0hBVCBzdG9wcGVkIgorCQllbHNlCisJCQlydmFsPTEKKwkJCWVjaG8gIlVuYWJsZSB0byBzdG9wICRXSEFUIgorCQlmaQorCWZpCisJc2V0X3JldHVybgorCTs7CisKKyopCisJZWNobyAidXNhZ2U6ICQwIHtzdGFydHxzdG9wfHN0YXJ0X21zZ3xzdG9wX21zZ30iCisJcnZhbD0xCisJOzsKK2VzYWMKKworZXhpdCAkcnZhbApkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jb250cmliL2hwdXgvc3NoZCBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9ocHV4L3NzaGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViNWU5MgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9ocHV4L3NzaGQKQEAgLTAsMCArMSw1IEBACisjIFNTSERfU1RBUlQ6CQlTZXQgdG8gMSB0byBzdGFydCBTU0ggZGFlbW9uCisjIFNTSERfQVJHUzoJCUNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gcGFzcyB0byBzc2hkCisjCitTU0hEX1NUQVJUPTEKK1NTSERfQVJHUz0KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvY29udHJpYi9ocHV4L3NzaGQucmMgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvaHB1eC9zc2hkLnJjCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY5YTEwOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvaHB1eC9zc2hkLnJjCkBAIC0wLDAgKzEsOTAgQEAKKyMhL3NiaW4vc2gKKworIworIyBzc2hkLnJjOiBTU0ggZGFlbW9uIHN0YXJ0LXVwIGFuZCBzaHV0ZG93biBzY3JpcHQKKyMKKworIyBBbGxvd2VkIGV4aXQgdmFsdWVzOgorIwkwID0gc3VjY2VzczsgY2F1c2VzICJPSyIgdG8gc2hvdyB1cCBpbiBjaGVja2xpc3QuCisjCTEgPSBmYWlsdXJlOyBjYXVzZXMgIkZBSUwiIHRvIHNob3cgdXAgaW4gY2hlY2tsaXN0LgorIwkyID0gc2tpcDsgY2F1c2VzICJOL0EiIHRvIHNob3cgdXAgaW4gdGhlIGNoZWNrbGlzdC4KKyMgICAgICAgICAgIFVzZSB0aGlzIHZhbHVlIGlmIGV4ZWN1dGlvbiBvZiB0aGlzIHNjcmlwdCBpcyBvdmVycmlkZGVuCisjCSAgICBieSB0aGUgdXNlIG9mIGEgY29udHJvbCB2YXJpYWJsZSwgb3IgaWYgdGhpcyBzY3JpcHQgaXMgbm90CisjCSAgICBhcHByb3ByaWF0ZSB0byBleGVjdXRlIGZvciBzb21lIG90aGVyIHJlYXNvbi4KKyMgICAgICAgMyA9IHJlYm9vdDsgY2F1c2VzIHRoZSBzeXN0ZW0gdG8gYmUgcmVib290ZWQgYWZ0ZXIgZXhlY3V0aW9uLgorCisjIElucHV0IGFuZCBvdXRwdXQ6CisjCXN0ZGluIGlzIHJlZGlyZWN0ZWQgZnJvbSAvZGV2L251bGwKKyMKKyMJc3Rkb3V0IGFuZCBzdGRlcnIgYXJlIHJlZGlyZWN0ZWQgdG8gdGhlIC9ldGMvcmMubG9nIGZpbGUKKyMJZHVyaW5nIGNoZWNrbGlzdCBtb2RlLCBvciB0byB0aGUgY29uc29sZSBpbiByYXcgbW9kZS4KKworUEFUSD0vdXNyL3NiaW46L3Vzci9iaW46L3NiaW4KK2V4cG9ydCBQQVRICisKK1dIQVQ9J09wZW5TU0gnCitXSEFUX1BBVEg9L29wdC9vcGVuc3NoL3NiaW4vc3NoZAorV0hBVF9QSUQ9L3Zhci9ydW4vc3NoZC5waWQKK1dIQVRfQ09ORklHPS9ldGMvcmMuY29uZmlnLmQvc3NoZAorCisjIE5PVEU6IElmIHlvdXIgc2NyaXB0IGV4ZWN1dGVzIGluIHJ1biBzdGF0ZSAwIG9yIHN0YXRlIDEsIHRoZW4gL3VzciBtaWdodAorIwlub3QgYmUgYXZhaWxhYmxlLiAgRG8gbm90IGF0dGVtcHQgdG8gYWNjZXNzIGNvbW1hbmRzIG9yIGZpbGVzIGluCisjCS91c3IgdW5sZXNzIHlvdXIgc2NyaXB0IGV4ZWN1dGVzIGluIHJ1biBzdGF0ZSAyIG9yIGdyZWF0ZXIuICBPdGhlcgorIwlmaWxlIHN5c3RlbXMgdHlwaWNhbGx5IG5vdCBtb3VudGVkIHVudGlsIHJ1biBzdGF0ZSAyIGluY2x1ZGUgL3ZhcgorIwlhbmQgL29wdC4KKworcnZhbD0wCisKKyMgQ2hlY2sgdGhlIGV4aXQgdmFsdWUgb2YgYSBjb21tYW5kIHJ1biBieSB0aGlzIHNjcmlwdC4gIElmIG5vbi16ZXJvLCB0aGUKKyMgZXhpdCBjb2RlIGlzIGVjaG9lZCB0byB0aGUgbG9nIGZpbGUgYW5kIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBzY3JpcHQKKyMgaXMgc2V0IHRvIGluZGljYXRlIGZhaWx1cmUuCisKK3NldF9yZXR1cm4oKSB7CisJeD0kPworCWlmIFsgJHggLW5lIDAgXTsgdGhlbgorCQllY2hvICJFWElUIENPREU6ICR4IgorCQlydmFsPTEJIyBzY3JpcHQgRkFJTGVkCisJZmkKK30KKworY2FzZSAkMSBpbgorJ3N0YXJ0X21zZycpCisJZWNobyAiU3RhcnRpbmcgJFdIQVQiCisJOzsKKworJ3N0b3BfbXNnJykKKwllY2hvICJTdG9wcGluZyAkV0hBVCIKKwk7OworCisnc3RhcnQnKQorCWlmIFsgLWYgJFdIQVRfQ09ORklHIF0gOyB0aGVuCisJCS4gJFdIQVRfQ09ORklHCisJZWxzZQorCQllY2hvICJFUlJPUjogJFdIQVRfQ09ORklHIGRlZmF1bHRzIGZpbGUgTUlTU0lORyIKKwlmaQorCQorCWlmIFsgIiRTU0hEX1NUQVJUIiAtZXEgMSAtYSAteCAiJFdIQVRfUEFUSCIgXTsgdGhlbgorCQkkV0hBVF9QQVRIICRTU0hEX0FSR1MgJiYgZWNobyAiJFdIQVQgc3RhcnRlZCIKKwkJc2V0X3JldHVybgorCWVsc2UKKwkJcnZhbD0yCisJZmkKKwk7OworCisnc3RvcCcpCisJaWYga2lsbCBgY2F0ICRXSEFUX1BJRGA7IHRoZW4KKwkJZWNobyAiJFdIQVQgc3RvcHBlZCIKKwllbHNlCisJCXJ2YWw9MQorCQllY2hvICJVbmFibGUgdG8gc3RvcCAkV0hBVCIKKwlmaQorCXNldF9yZXR1cm4KKwk7OworCisqKQorCWVjaG8gInVzYWdlOiAkMCB7c3RhcnR8c3RvcHxzdGFydF9tc2d8c3RvcF9tc2d9IgorCXJ2YWw9MQorCTs7Citlc2FjCisKK2V4aXQgJHJ2YWwKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvY29udHJpYi9yZWRoYXQvZ25vbWUtc3NoLWFza3Bhc3MuY3NoIGIvb3BlbnNzaC02LjBwMS9jb250cmliL3JlZGhhdC9nbm9tZS1zc2gtYXNrcGFzcy5jc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ3NzcxMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9yZWRoYXQvZ25vbWUtc3NoLWFza3Bhc3MuY3NoCkBAIC0wLDAgKzEgQEAKK3NldGVudiBTU0hfQVNLUEFTUyAvdXNyL2xpYmV4ZWMvb3BlbnNzaC9nbm9tZS1zc2gtYXNrcGFzcwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jb250cmliL3JlZGhhdC9nbm9tZS1zc2gtYXNrcGFzcy5zaCBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9yZWRoYXQvZ25vbWUtc3NoLWFza3Bhc3Muc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU1MTg5ZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9yZWRoYXQvZ25vbWUtc3NoLWFza3Bhc3Muc2gKQEAgLTAsMCArMSwyIEBACitTU0hfQVNLUEFTUz0vdXNyL2xpYmV4ZWMvb3BlbnNzaC9nbm9tZS1zc2gtYXNrcGFzcworZXhwb3J0IFNTSF9BU0tQQVNTCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvcmVkaGF0L29wZW5zc2guc3BlYyBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9yZWRoYXQvb3BlbnNzaC5zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZTQ0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvcmVkaGF0L29wZW5zc2guc3BlYwpAQCAtMCwwICsxLDgxMiBAQAorJWRlZmluZSB2ZXIgNi4wcDEKKyVkZWZpbmUgcmVsIDEKKworIyBPcGVuU1NIIHByaXZpbGVnZSBzZXBhcmF0aW9uIHJlcXVpcmVzIGEgdXNlciAmIGdyb3VwIElECislZGVmaW5lIHNzaGRfdWlkICAgIDc0CislZGVmaW5lIHNzaGRfZ2lkICAgIDc0CisKKyMgVmVyc2lvbiBvZiBzc2gtYXNrcGFzcworJWRlZmluZSBhdmVyc2lvbiAxLjIuNC4xCisKKyMgRG8gd2Ugd2FudCB0byBkaXNhYmxlIGJ1aWxkaW5nIG9mIHgxMS1hc2twYXNzPyAoMT15ZXMgMD1ubykKKyVkZWZpbmUgbm9feDExX2Fza3Bhc3MgMAorCisjIERvIHdlIHdhbnQgdG8gZGlzYWJsZSBidWlsZGluZyBvZiBnbm9tZS1hc2twYXNzPyAoMT15ZXMgMD1ubykKKyVkZWZpbmUgbm9fZ25vbWVfYXNrcGFzcyAwCisKKyMgRG8gd2Ugd2FudCB0byBsaW5rIGFnYWluc3QgYSBzdGF0aWMgbGliY3J5cHRvPyAoMT15ZXMgMD1ubykKKyVkZWZpbmUgc3RhdGljX2xpYmNyeXB0byAwCisKKyMgRG8gd2Ugd2FudCBzbWFydGNhcmQgc3VwcG9ydCAoMT15ZXMgMD1ubykKKyVkZWZpbmUgc2NhcmQgMAorCisjIFVzZSBHVEsyIGluc3RlYWQgb2YgR05PTUUgaW4gZ25vbWUtc3NoLWFza3Bhc3MKKyVkZWZpbmUgZ3RrMiAxCisKKyMgSXMgdGhpcyBidWlsZCBmb3IgUkhMIDYueD8KKyVkZWZpbmUgYnVpbGQ2eCAwCisKKyMgRG8gd2Ugd2FudCBrZXJiZXJvczUgc3VwcG9ydCAoMT15ZXMgMD1ubykKKyVkZWZpbmUga2VyYmVyb3M1IDEKKworIyBSZXNlcnZlIG9wdGlvbnMgdG8gb3ZlcnJpZGUgYXNrcGFzcyBzZXR0aW5ncyB3aXRoOgorIyBycG0gLWJhfC0tcmVidWlsZCAtLWRlZmluZSAnc2tpcF94eHggMScKKyV7P3NraXBfeDExX2Fza3Bhc3M6JWRlZmluZSBub194MTFfYXNrcGFzcyAxfQorJXs/c2tpcF9nbm9tZV9hc2twYXNzOiVkZWZpbmUgbm9fZ25vbWVfYXNrcGFzcyAxfQorCisjIEFkZCBvcHRpb24gdG8gYnVpbGQgd2l0aG91dCBHVEsyIGZvciBvbGRlciBwbGF0Zm9ybXMgd2l0aCBvbmx5IEdUSysuCisjIFJlZEhhdCA8PSA3LjIgYW5kIFJlZCBIYXQgQWR2YW5jZWQgU2VydmVyIDIuMSBhcmUgZXhhbXBsZXMuCisjIHJwbSAtYmF8LS1yZWJ1aWxkIC0tZGVmaW5lICdub19ndGsyIDEnCislez9ub19ndGsyOiVkZWZpbmUgZ3RrMiAwfQorCisjIElzIHRoaXMgYSBidWlsZCBmb3IgUkhMIDYueCBvciBlYXJsaWVyPworJXs/YnVpbGRfNng6JWRlZmluZSBidWlsZDZ4IDF9CisKKyMgSWYgdGhpcyBpcyBSSEwgNi54LCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGhhcyBzeXNjb25mZGlyIGluIC91c3IvZXRjLgorJWlmICV7YnVpbGQ2eH0KKyVkZWZpbmUgX3N5c2NvbmZkaXIgL2V0YworJWVuZGlmCisKKyMgT3B0aW9ucyBmb3Igc3RhdGljIE9wZW5TU0wgbGluazoKKyMgcnBtIC1iYXwtLXJlYnVpbGQgLS1kZWZpbmUgInN0YXRpY19vcGVuc3NsIDEiCislez9zdGF0aWNfb3BlbnNzbDolZGVmaW5lIHN0YXRpY19saWJjcnlwdG8gMX0KKworIyBPcHRpb25zIGZvciBTbWFydGNhcmQgc3VwcG9ydDogKG5lZWRzIGxpYnNlY3RvayBhbmQgb3BlbnNzbC1lbmdpbmUpCisjIHJwbSAtYmF8LS1yZWJ1aWxkIC0tZGVmaW5lICJzbWFydGNhcmQgMSIKKyV7P3NtYXJ0Y2FyZDolZGVmaW5lIHNjYXJkIDF9CisKKyMgSXMgdGhpcyBhIGJ1aWxkIGZvciB0aGUgcmVzY3VlIENEICh3aXRob3V0IFBBTSwgd2l0aCBNRDUpPyAoMT15ZXMgMD1ubykKKyVkZWZpbmUgcmVzY3VlIDAKKyV7P2J1aWxkX3Jlc2N1ZTolZGVmaW5lIHJlc2N1ZSAxfQorCisjIFR1cm4gb2ZmIHNvbWUgc3R1ZmYgZm9yIHJlc3VjZSBidWlsZHMKKyVpZiAle3Jlc2N1ZX0KKyVkZWZpbmUga2VyYmVyb3M1IDAKKyVlbmRpZgorCitTdW1tYXJ5OiBUaGUgT3BlblNTSCBpbXBsZW1lbnRhdGlvbiBvZiBTU0ggcHJvdG9jb2wgdmVyc2lvbnMgMSBhbmQgMi4KK05hbWU6IG9wZW5zc2gKK1ZlcnNpb246ICV7dmVyfQorJWlmICV7cmVzY3VlfQorUmVsZWFzZTogJXtyZWx9cmVzY3VlCislZWxzZQorUmVsZWFzZTogJXtyZWx9CislZW5kaWYKK1VSTDogaHR0cDovL3d3dy5vcGVuc3NoLmNvbS9wb3J0YWJsZS5odG1sCitTb3VyY2UwOiBmdHA6Ly9mdHAub3BlbmJzZC5vcmcvcHViL09wZW5CU0QvT3BlblNTSC9wb3J0YWJsZS9vcGVuc3NoLSV7dmVyc2lvbn0udGFyLmd6CislaWYgISAle25vX3gxMV9hc2twYXNzfQorU291cmNlMTogaHR0cDovL3d3dy5qbWtub2JsZS5uZXQvc29mdHdhcmUveDExLXNzaC1hc2twYXNzL3gxMS1zc2gtYXNrcGFzcy0le2F2ZXJzaW9ufS50YXIuZ3oKKyVlbmRpZgorTGljZW5zZTogQlNECitHcm91cDogQXBwbGljYXRpb25zL0ludGVybmV0CitCdWlsZFJvb3Q6ICV7X3RtcHBhdGh9LyV7bmFtZX0tJXt2ZXJzaW9ufS1idWlsZHJvb3QKK09ic29sZXRlczogc3NoCislaWYgJXtidWlsZDZ4fQorUHJlUmVxOiBpbml0c2NyaXB0cyA+PSA1LjAwCislZWxzZQorUmVxdWlyZXM6IGluaXRzY3JpcHRzID49IDUuMjAKKyVlbmRpZgorQnVpbGRSZXF1aXJlczogcGVybCwgb3BlbnNzbC1kZXZlbCwgdGNwX3dyYXBwZXJzCitCdWlsZFJlcXVpcmVzOiAvYmluL2xvZ2luCislaWYgISAle2J1aWxkNnh9CitCdWlsZFByZVJlcTogZ2xpYmMtZGV2ZWwsIHBhbQorJWVsc2UKK0J1aWxkUmVxdWlyZXM6IC91c3IvaW5jbHVkZS9zZWN1cml0eS9wYW1fYXBwbC5oCislZW5kaWYKKyVpZiAhICV7bm9feDExX2Fza3Bhc3N9CitCdWlsZFJlcXVpcmVzOiAvdXNyL2luY2x1ZGUvWDExL1hsaWIuaAorJWVuZGlmCislaWYgISAle25vX2dub21lX2Fza3Bhc3N9CitCdWlsZFJlcXVpcmVzOiBwa2djb25maWcKKyVlbmRpZgorJWlmICV7a2VyYmVyb3M1fQorQnVpbGRSZXF1aXJlczoga3JiNS1kZXZlbAorQnVpbGRSZXF1aXJlczoga3JiNS1saWJzCislZW5kaWYKKworJXBhY2thZ2UgY2xpZW50cworU3VtbWFyeTogT3BlblNTSCBjbGllbnRzLgorUmVxdWlyZXM6IG9wZW5zc2ggPSAle3ZlcnNpb259LSV7cmVsZWFzZX0KK0dyb3VwOiBBcHBsaWNhdGlvbnMvSW50ZXJuZXQKK09ic29sZXRlczogc3NoLWNsaWVudHMKKworJXBhY2thZ2Ugc2VydmVyCitTdW1tYXJ5OiBUaGUgT3BlblNTSCBzZXJ2ZXIgZGFlbW9uLgorR3JvdXA6IFN5c3RlbSBFbnZpcm9ubWVudC9EYWVtb25zCitPYnNvbGV0ZXM6IHNzaC1zZXJ2ZXIKK1JlcXVpcmVzOiBvcGVuc3NoID0gJXt2ZXJzaW9ufS0le3JlbGVhc2V9LCBjaGtjb25maWcgPj0gMC45CislaWYgISAle2J1aWxkNnh9CitSZXF1aXJlczogL2V0Yy9wYW0uZC9zeXN0ZW0tYXV0aAorJWVuZGlmCisKKyVwYWNrYWdlIGFza3Bhc3MKK1N1bW1hcnk6IEEgcGFzc3BocmFzZSBkaWFsb2cgZm9yIE9wZW5TU0ggYW5kIFguCitHcm91cDogQXBwbGljYXRpb25zL0ludGVybmV0CitSZXF1aXJlczogb3BlbnNzaCA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfQorT2Jzb2xldGVzOiBzc2gtZXh0cmFzCisKKyVwYWNrYWdlIGFza3Bhc3MtZ25vbWUKK1N1bW1hcnk6IEEgcGFzc3BocmFzZSBkaWFsb2cgZm9yIE9wZW5TU0gsIFgsIGFuZCBHTk9NRS4KK0dyb3VwOiBBcHBsaWNhdGlvbnMvSW50ZXJuZXQKK1JlcXVpcmVzOiBvcGVuc3NoID0gJXt2ZXJzaW9ufS0le3JlbGVhc2V9CitPYnNvbGV0ZXM6IHNzaC1leHRyYXMKKworJWRlc2NyaXB0aW9uCitTU0ggKFNlY3VyZSBTSGVsbCkgaXMgYSBwcm9ncmFtIGZvciBsb2dnaW5nIGludG8gYW5kIGV4ZWN1dGluZworY29tbWFuZHMgb24gYSByZW1vdGUgbWFjaGluZS4gU1NIIGlzIGludGVuZGVkIHRvIHJlcGxhY2UgcmxvZ2luIGFuZAorcnNoLCBhbmQgdG8gcHJvdmlkZSBzZWN1cmUgZW5jcnlwdGVkIGNvbW11bmljYXRpb25zIGJldHdlZW4gdHdvCit1bnRydXN0ZWQgaG9zdHMgb3ZlciBhbiBpbnNlY3VyZSBuZXR3b3JrLiBYMTEgY29ubmVjdGlvbnMgYW5kCithcmJpdHJhcnkgVENQL0lQIHBvcnRzIGNhbiBhbHNvIGJlIGZvcndhcmRlZCBvdmVyIHRoZSBzZWN1cmUgY2hhbm5lbC4KKworT3BlblNTSCBpcyBPcGVuQlNEJ3MgdmVyc2lvbiBvZiB0aGUgbGFzdCBmcmVlIHZlcnNpb24gb2YgU1NILCBicmluZ2luZworaXQgdXAgdG8gZGF0ZSBpbiB0ZXJtcyBvZiBzZWN1cml0eSBhbmQgZmVhdHVyZXMsIGFzIHdlbGwgYXMgcmVtb3ZpbmcKK2FsbCBwYXRlbnRlZCBhbGdvcml0aG1zIHRvIHNlcGFyYXRlIGxpYnJhcmllcy4KKworVGhpcyBwYWNrYWdlIGluY2x1ZGVzIHRoZSBjb3JlIGZpbGVzIG5lY2Vzc2FyeSBmb3IgYm90aCB0aGUgT3BlblNTSAorY2xpZW50IGFuZCBzZXJ2ZXIuIFRvIG1ha2UgdGhpcyBwYWNrYWdlIHVzZWZ1bCwgeW91IHNob3VsZCBhbHNvCitpbnN0YWxsIG9wZW5zc2gtY2xpZW50cywgb3BlbnNzaC1zZXJ2ZXIsIG9yIGJvdGguCisKKyVkZXNjcmlwdGlvbiBjbGllbnRzCitPcGVuU1NIIGlzIGEgZnJlZSB2ZXJzaW9uIG9mIFNTSCAoU2VjdXJlIFNIZWxsKSwgYSBwcm9ncmFtIGZvciBsb2dnaW5nCitpbnRvIGFuZCBleGVjdXRpbmcgY29tbWFuZHMgb24gYSByZW1vdGUgbWFjaGluZS4gVGhpcyBwYWNrYWdlIGluY2x1ZGVzCit0aGUgY2xpZW50cyBuZWNlc3NhcnkgdG8gbWFrZSBlbmNyeXB0ZWQgY29ubmVjdGlvbnMgdG8gU1NIIHNlcnZlcnMuCitZb3UnbGwgYWxzbyBuZWVkIHRvIGluc3RhbGwgdGhlIG9wZW5zc2ggcGFja2FnZSBvbiBPcGVuU1NIIGNsaWVudHMuCisKKyVkZXNjcmlwdGlvbiBzZXJ2ZXIKK09wZW5TU0ggaXMgYSBmcmVlIHZlcnNpb24gb2YgU1NIIChTZWN1cmUgU0hlbGwpLCBhIHByb2dyYW0gZm9yIGxvZ2dpbmcKK2ludG8gYW5kIGV4ZWN1dGluZyBjb21tYW5kcyBvbiBhIHJlbW90ZSBtYWNoaW5lLiBUaGlzIHBhY2thZ2UgY29udGFpbnMKK3RoZSBzZWN1cmUgc2hlbGwgZGFlbW9uIChzc2hkKS4gVGhlIHNzaGQgZGFlbW9uIGFsbG93cyBTU0ggY2xpZW50cyB0bworc2VjdXJlbHkgY29ubmVjdCB0byB5b3VyIFNTSCBzZXJ2ZXIuIFlvdSBhbHNvIG5lZWQgdG8gaGF2ZSB0aGUgb3BlbnNzaAorcGFja2FnZSBpbnN0YWxsZWQuCisKKyVkZXNjcmlwdGlvbiBhc2twYXNzCitPcGVuU1NIIGlzIGEgZnJlZSB2ZXJzaW9uIG9mIFNTSCAoU2VjdXJlIFNIZWxsKSwgYSBwcm9ncmFtIGZvciBsb2dnaW5nCitpbnRvIGFuZCBleGVjdXRpbmcgY29tbWFuZHMgb24gYSByZW1vdGUgbWFjaGluZS4gVGhpcyBwYWNrYWdlIGNvbnRhaW5zCithbiBYMTEgcGFzc3BocmFzZSBkaWFsb2cgZm9yIE9wZW5TU0guCisKKyVkZXNjcmlwdGlvbiBhc2twYXNzLWdub21lCitPcGVuU1NIIGlzIGEgZnJlZSB2ZXJzaW9uIG9mIFNTSCAoU2VjdXJlIFNIZWxsKSwgYSBwcm9ncmFtIGZvciBsb2dnaW5nCitpbnRvIGFuZCBleGVjdXRpbmcgY29tbWFuZHMgb24gYSByZW1vdGUgbWFjaGluZS4gVGhpcyBwYWNrYWdlIGNvbnRhaW5zCithbiBYMTEgcGFzc3BocmFzZSBkaWFsb2cgZm9yIE9wZW5TU0ggYW5kIHRoZSBHTk9NRSBHVUkgZGVza3RvcAorZW52aXJvbm1lbnQuCisKKyVwcmVwCisKKyVpZiAhICV7bm9feDExX2Fza3Bhc3N9Cislc2V0dXAgLXEgLWEgMQorJWVsc2UKKyVzZXR1cCAtcQorJWVuZGlmCisKKyVidWlsZAorJWlmICV7cmVzY3VlfQorQ0ZMQUdTPSIkUlBNX09QVF9GTEFHUyAtT3MiOyBleHBvcnQgQ0ZMQUdTCislZW5kaWYKKworJWlmICV7a2VyYmVyb3M1fQorSzVESVI9YHJwbSAtcWwga3JiNS1kZXZlbCB8IGdyZXAgaW5jbHVkZS9rcmI1LmggfCBzZWQgJ3MsXC9pbmNsdWRlXC9rcmI1LmgsLCdgCitlY2hvIEs1RElSPSRLNURJUgorJWVuZGlmCisKKyVjb25maWd1cmUgXAorCS0tc3lzY29uZmRpcj0le19zeXNjb25mZGlyfS9zc2ggXAorCS0tbGliZXhlY2Rpcj0le19saWJleGVjZGlyfS9vcGVuc3NoIFwKKwktLWRhdGFkaXI9JXtfZGF0YWRpcn0vb3BlbnNzaCBcCisJLS13aXRoLXRjcC13cmFwcGVycyBcCisJLS13aXRoLXJzaD0le19iaW5kaXJ9L3JzaCBcCisJLS13aXRoLWRlZmF1bHQtcGF0aD0vdXNyL2xvY2FsL2JpbjovYmluOi91c3IvYmluIFwKKwktLXdpdGgtc3VwZXJ1c2VyLXBhdGg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi9zYmluOi9iaW46L3Vzci9zYmluOi91c3IvYmluIFwKKwktLXdpdGgtcHJpdnNlcC1wYXRoPSV7X3Zhcn0vZW1wdHkvc3NoZCBcCisJLS13aXRoLW1kNS1wYXNzd29yZHMgXAorJWlmICV7c2NhcmR9CisJLS13aXRoLXNtYXJ0Y2FyZCBcCislZW5kaWYKKyVpZiAle3Jlc2N1ZX0KKwktLXdpdGhvdXQtcGFtIFwKKyVlbHNlCisJLS13aXRoLXBhbSBcCislZW5kaWYKKyVpZiAle2tlcmJlcm9zNX0KKwkgLS13aXRoLWtlcmJlcm9zNT0kSzVESVIgXAorJWVuZGlmCisKKworJWlmICV7c3RhdGljX2xpYmNyeXB0b30KK3BlcmwgLXBpIC1lICJzfC1sY3J5cHRvfCV7X2xpYmRpcn0vbGliY3J5cHRvLmF8ZyIgTWFrZWZpbGUKKyVlbmRpZgorCittYWtlCisKKyVpZiAhICV7bm9feDExX2Fza3Bhc3N9CitwdXNoZCB4MTEtc3NoLWFza3Bhc3MtJXthdmVyc2lvbn0KKyVjb25maWd1cmUgLS1saWJleGVjZGlyPSV7X2xpYmV4ZWNkaXJ9L29wZW5zc2gKK3hta21mIC1hCittYWtlCitwb3BkCislZW5kaWYKKworIyBEZWZpbmUgYSB2YXJpYWJsZSB0byB0b2dnbGUgZ25vbWUxL2d0azIgYnVpbGRpbmcuICBUaGlzIGlzIG5lY2Vzc2FyeQorIyBiZWNhdXNlIFJQTSBkb2Vzbid0IGhhbmRsZSBuZXN0ZWQgJWlmIHN0YXRlbWVudHMuCislaWYgJXtndGsyfQorCWd0azI9eWVzCislZWxzZQorCWd0azI9bm8KKyVlbmRpZgorCislaWYgISAle25vX2dub21lX2Fza3Bhc3N9CitwdXNoZCBjb250cmliCitpZiBbICRndGsyID0geWVzIF0gOyB0aGVuCisJbWFrZSBnbm9tZS1zc2gtYXNrcGFzczIKKwltdiBnbm9tZS1zc2gtYXNrcGFzczIgZ25vbWUtc3NoLWFza3Bhc3MKK2Vsc2UKKwltYWtlIGdub21lLXNzaC1hc2twYXNzMQorCW12IGdub21lLXNzaC1hc2twYXNzMSBnbm9tZS1zc2gtYXNrcGFzcworZmkKK3BvcGQKKyVlbmRpZgorCislaW5zdGFsbAorcm0gLXJmICRSUE1fQlVJTERfUk9PVAorbWtkaXIgLXAgLW03NTUgJFJQTV9CVUlMRF9ST09UJXtfc3lzY29uZmRpcn0vc3NoCitta2RpciAtcCAtbTc1NSAkUlBNX0JVSUxEX1JPT1Qle19saWJleGVjZGlyfS9vcGVuc3NoCitta2RpciAtcCAtbTc1NSAkUlBNX0JVSUxEX1JPT1Qle192YXJ9L2VtcHR5L3NzaGQKKworbWFrZSBpbnN0YWxsIERFU1RESVI9JFJQTV9CVUlMRF9ST09UCisKK2luc3RhbGwgLWQgJFJQTV9CVUlMRF9ST09UL2V0Yy9wYW0uZC8KK2luc3RhbGwgLWQgJFJQTV9CVUlMRF9ST09UL2V0Yy9yYy5kL2luaXQuZAoraW5zdGFsbCAtZCAkUlBNX0JVSUxEX1JPT1Qle19saWJleGVjZGlyfS9vcGVuc3NoCislaWYgJXtidWlsZDZ4fQoraW5zdGFsbCAtbTY0NCBjb250cmliL3JlZGhhdC9zc2hkLnBhbS5vbGQgJFJQTV9CVUlMRF9ST09UL2V0Yy9wYW0uZC9zc2hkCislZWxzZQoraW5zdGFsbCAtbTY0NCBjb250cmliL3JlZGhhdC9zc2hkLnBhbSAgICAgJFJQTV9CVUlMRF9ST09UL2V0Yy9wYW0uZC9zc2hkCislZW5kaWYKK2luc3RhbGwgLW03NTUgY29udHJpYi9yZWRoYXQvc3NoZC5pbml0ICRSUE1fQlVJTERfUk9PVC9ldGMvcmMuZC9pbml0LmQvc3NoZAorCislaWYgISAle25vX3gxMV9hc2twYXNzfQoraW5zdGFsbCAtcyB4MTEtc3NoLWFza3Bhc3MtJXthdmVyc2lvbn0veDExLXNzaC1hc2twYXNzICRSUE1fQlVJTERfUk9PVCV7X2xpYmV4ZWNkaXJ9L29wZW5zc2gveDExLXNzaC1hc2twYXNzCitsbiAtcyB4MTEtc3NoLWFza3Bhc3MgJFJQTV9CVUlMRF9ST09UJXtfbGliZXhlY2Rpcn0vb3BlbnNzaC9zc2gtYXNrcGFzcworJWVuZGlmCisKKyVpZiAhICV7bm9fZ25vbWVfYXNrcGFzc30KK2luc3RhbGwgLXMgY29udHJpYi9nbm9tZS1zc2gtYXNrcGFzcyAkUlBNX0JVSUxEX1JPT1Qle19saWJleGVjZGlyfS9vcGVuc3NoL2dub21lLXNzaC1hc2twYXNzCislZW5kaWYKKworJWlmICEgJXtzY2FyZH0KKwkgcm0gLWYgJFJQTV9CVUlMRF9ST09UL3Vzci9zaGFyZS9vcGVuc3NoL1NzaC5iaW4KKyVlbmRpZgorCislaWYgISAle25vX2dub21lX2Fza3Bhc3N9CitpbnN0YWxsIC1tIDc1NSAtZCAkUlBNX0JVSUxEX1JPT1Qle19zeXNjb25mZGlyfS9wcm9maWxlLmQvCitpbnN0YWxsIC1tIDc1NSBjb250cmliL3JlZGhhdC9nbm9tZS1zc2gtYXNrcGFzcy5jc2ggJFJQTV9CVUlMRF9ST09UJXtfc3lzY29uZmRpcn0vcHJvZmlsZS5kLworaW5zdGFsbCAtbSA3NTUgY29udHJpYi9yZWRoYXQvZ25vbWUtc3NoLWFza3Bhc3Muc2ggJFJQTV9CVUlMRF9ST09UJXtfc3lzY29uZmRpcn0vcHJvZmlsZS5kLworJWVuZGlmCisKK3BlcmwgLXBpIC1lICJzfCRSUE1fQlVJTERfUk9PVHx8ZyIgJFJQTV9CVUlMRF9ST09UJXtfbWFuZGlyfS9tYW4qLyoKKworJWNsZWFuCitybSAtcmYgJFJQTV9CVUlMRF9ST09UCisKKyV0cmlnZ2VydW4gc2VydmVyIC0tIHNzaC1zZXJ2ZXIKK2lmIFsgIiQxIiAhPSAwIC1hIC1yIC92YXIvcnVuL3NzaGQucGlkIF0gOyB0aGVuCisJdG91Y2ggL3Zhci9ydW4vc3NoZC5yZXN0YXJ0CitmaQorCisldHJpZ2dlcnVuIHNlcnZlciAtLSBvcGVuc3NoLXNlcnZlciA8IDIuNS4wcDEKKyMgQ291bnQgdGhlIG51bWJlciBvZiBIb3N0S2V5IGFuZCBIb3N0RHNhS2V5IHN0YXRlbWVudHMgd2UgaGF2ZS4KK2dhd2sJJ0JFR0lOIHtJR05PUkVDQVNFPTF9CisJIC9eaG9zdGtleS8gfHwgL15ob3N0ZHNha2V5LyB7c2F3aG9zdGtleSA9IHNhd2hvc3RrZXkgKyAxfQorCSBFTkQge2V4aXQgc2F3aG9zdGtleX0nIC9ldGMvc3NoL3NzaGRfY29uZmlnCisjIEFuZCBpZiB3ZSBvbmx5IGZvdW5kIG9uZSwgd2Uga25vdyB0aGUgY2xpZW50IHdhcyByZWx5aW5nIG9uIHRoZSBvbGQgZGVmYXVsdAorIyBiZWhhdmlvciwgd2hpY2ggbG9hZGVkIHRoZSB0aGUgU1NIMiBEU0EgaG9zdCBrZXkgd2hlbiBIb3N0RHNhS2V5IHdhc24ndAorIyBzcGVjaWZpZWQuICBOb3cgdGhhdCBIb3N0S2V5IGlzIHVzZWQgZm9yIGJvdGggU1NIMSBhbmQgU1NIMiBrZXlzLCBzcGVjaWZ5aW5nCisjIG9uZSBudWxsaWZpZXMgdGhlIGRlZmF1bHQsIHdoaWNoIHdvdWxkIGhhdmUgbG9hZGVkIGJvdGguCitpZiBbICQ/IC1lcSAxIF0gOyB0aGVuCisJZWNobyBIb3N0S2V5IC9ldGMvc3NoL3NzaF9ob3N0X3JzYV9rZXkgPj4gL2V0Yy9zc2gvc3NoZF9jb25maWcKKwllY2hvIEhvc3RLZXkgL2V0Yy9zc2gvc3NoX2hvc3RfZHNhX2tleSA+PiAvZXRjL3NzaC9zc2hkX2NvbmZpZworZmkKKworJXRyaWdnZXJwb3N0dW4gc2VydmVyIC0tIHNzaC1zZXJ2ZXIKK2lmIFsgIiQxIiAhPSAwIF0gOyB0aGVuCisJL3NiaW4vY2hrY29uZmlnIC0tYWRkIHNzaGQKKwlpZiB0ZXN0IC1mIC92YXIvcnVuL3NzaGQucmVzdGFydCA7IHRoZW4KKwkJcm0gLWYgL3Zhci9ydW4vc3NoZC5yZXN0YXJ0CisJCS9zYmluL3NlcnZpY2Ugc3NoZCBzdGFydCA+IC9kZXYvbnVsbCAyPiYxIHx8IDoKKwlmaQorZmkKKworJXByZSBzZXJ2ZXIKKyV7X3NiaW5kaXJ9L2dyb3VwYWRkIC1yIC1nICV7c3NoZF9naWR9IHNzaGQgMj4vZGV2L251bGwgfHwgOgorJXtfc2JpbmRpcn0vdXNlcmFkZCAtZCAvdmFyL2VtcHR5L3NzaGQgLXMgL2Jpbi9mYWxzZSAtdSAle3NzaGRfdWlkfSBcCisJLWcgc3NoZCAtTSAtciBzc2hkIDI+L2Rldi9udWxsIHx8IDoKKworJXBvc3Qgc2VydmVyCisvc2Jpbi9jaGtjb25maWcgLS1hZGQgc3NoZAorCislcG9zdHVuIHNlcnZlcgorL3NiaW4vc2VydmljZSBzc2hkIGNvbmRyZXN0YXJ0ID4gL2Rldi9udWxsIDI+JjEgfHwgOgorCislcHJldW4gc2VydmVyCitpZiBbICIkMSIgPSAwIF0KK3RoZW4KKwkvc2Jpbi9zZXJ2aWNlIHNzaGQgc3RvcCA+IC9kZXYvbnVsbCAyPiYxIHx8IDoKKwkvc2Jpbi9jaGtjb25maWcgLS1kZWwgc3NoZAorZmkKKworJWZpbGVzCislZGVmYXR0cigtLHJvb3Qscm9vdCkKKyVkb2MgQ1JFRElUUyBDaGFuZ2VMb2cgSU5TVEFMTCBMSUNFTkNFIE9WRVJWSUVXIFJFQURNRSogUFJPVE9DT0wqIFRPRE8KKyVhdHRyKDA3NTUscm9vdCxyb290KSAle19iaW5kaXJ9L3NjcAorJWF0dHIoMDY0NCxyb290LHJvb3QpICV7X21hbmRpcn0vbWFuMS9zY3AuMSoKKyVhdHRyKDA3NTUscm9vdCxyb290KSAlZGlyICV7X3N5c2NvbmZkaXJ9L3NzaAorJWF0dHIoMDYwMCxyb290LHJvb3QpICVjb25maWcobm9yZXBsYWNlKSAle19zeXNjb25mZGlyfS9zc2gvbW9kdWxpCislaWYgISAle3Jlc2N1ZX0KKyVhdHRyKDA3NTUscm9vdCxyb290KSAle19iaW5kaXJ9L3NzaC1rZXlnZW4KKyVhdHRyKDA2NDQscm9vdCxyb290KSAle19tYW5kaXJ9L21hbjEvc3NoLWtleWdlbi4xKgorJWF0dHIoMDc1NSxyb290LHJvb3QpICVkaXIgJXtfbGliZXhlY2Rpcn0vb3BlbnNzaAorJWF0dHIoNDcxMSxyb290LHJvb3QpICV7X2xpYmV4ZWNkaXJ9L29wZW5zc2gvc3NoLWtleXNpZ24KKyVhdHRyKDA3NTUscm9vdCxyb290KSAle19saWJleGVjZGlyfS9vcGVuc3NoL3NzaC1wa2NzMTEtaGVscGVyCislYXR0cigwNjQ0LHJvb3Qscm9vdCkgJXtfbWFuZGlyfS9tYW44L3NzaC1rZXlzaWduLjgqCislYXR0cigwNjQ0LHJvb3Qscm9vdCkgJXtfbWFuZGlyfS9tYW44L3NzaC1wa2NzMTEtaGVscGVyLjgqCislZW5kaWYKKyVpZiAle3NjYXJkfQorJWF0dHIoMDc1NSxyb290LHJvb3QpICVkaXIgJXtfZGF0YWRpcn0vb3BlbnNzaAorJWF0dHIoMDY0NCxyb290LHJvb3QpICV7X2RhdGFkaXJ9L29wZW5zc2gvU3NoLmJpbgorJWVuZGlmCisKKyVmaWxlcyBjbGllbnRzCislZGVmYXR0cigtLHJvb3Qscm9vdCkKKyVhdHRyKDA3NTUscm9vdCxyb290KSAle19iaW5kaXJ9L3NzaAorJWF0dHIoMDY0NCxyb290LHJvb3QpICV7X21hbmRpcn0vbWFuMS9zc2guMSoKKyVhdHRyKDA2NDQscm9vdCxyb290KSAle19tYW5kaXJ9L21hbjUvc3NoX2NvbmZpZy41KgorJWF0dHIoMDY0NCxyb290LHJvb3QpICVjb25maWcobm9yZXBsYWNlKSAle19zeXNjb25mZGlyfS9zc2gvc3NoX2NvbmZpZworJWF0dHIoLSxyb290LHJvb3QpICV7X2JpbmRpcn0vc2xvZ2luCislYXR0cigtLHJvb3Qscm9vdCkgJXtfbWFuZGlyfS9tYW4xL3Nsb2dpbi4xKgorJWlmICEgJXtyZXNjdWV9CislYXR0cigyNzU1LHJvb3Qsbm9ib2R5KSAle19iaW5kaXJ9L3NzaC1hZ2VudAorJWF0dHIoMDc1NSxyb290LHJvb3QpICV7X2JpbmRpcn0vc3NoLWFkZAorJWF0dHIoMDc1NSxyb290LHJvb3QpICV7X2JpbmRpcn0vc3NoLWtleXNjYW4KKyVhdHRyKDA3NTUscm9vdCxyb290KSAle19iaW5kaXJ9L3NmdHAKKyVhdHRyKDA2NDQscm9vdCxyb290KSAle19tYW5kaXJ9L21hbjEvc3NoLWFnZW50LjEqCislYXR0cigwNjQ0LHJvb3Qscm9vdCkgJXtfbWFuZGlyfS9tYW4xL3NzaC1hZGQuMSoKKyVhdHRyKDA2NDQscm9vdCxyb290KSAle19tYW5kaXJ9L21hbjEvc3NoLWtleXNjYW4uMSoKKyVhdHRyKDA2NDQscm9vdCxyb290KSAle19tYW5kaXJ9L21hbjEvc2Z0cC4xKgorJWVuZGlmCisKKyVpZiAhICV7cmVzY3VlfQorJWZpbGVzIHNlcnZlcgorJWRlZmF0dHIoLSxyb290LHJvb3QpCislZGlyICVhdHRyKDAxMTEscm9vdCxyb290KSAle192YXJ9L2VtcHR5L3NzaGQKKyVhdHRyKDA3NTUscm9vdCxyb290KSAle19zYmluZGlyfS9zc2hkCislYXR0cigwNzU1LHJvb3Qscm9vdCkgJXtfbGliZXhlY2Rpcn0vb3BlbnNzaC9zZnRwLXNlcnZlcgorJWF0dHIoMDY0NCxyb290LHJvb3QpICV7X21hbmRpcn0vbWFuOC9zc2hkLjgqCislYXR0cigwNjQ0LHJvb3Qscm9vdCkgJXtfbWFuZGlyfS9tYW41L21vZHVsaS41KgorJWF0dHIoMDY0NCxyb290LHJvb3QpICV7X21hbmRpcn0vbWFuNS9zc2hkX2NvbmZpZy41KgorJWF0dHIoMDY0NCxyb290LHJvb3QpICV7X21hbmRpcn0vbWFuOC9zZnRwLXNlcnZlci44KgorJWF0dHIoMDc1NSxyb290LHJvb3QpICVkaXIgJXtfc3lzY29uZmRpcn0vc3NoCislYXR0cigwNjAwLHJvb3Qscm9vdCkgJWNvbmZpZyhub3JlcGxhY2UpICV7X3N5c2NvbmZkaXJ9L3NzaC9zc2hkX2NvbmZpZworJWF0dHIoMDYwMCxyb290LHJvb3QpICVjb25maWcobm9yZXBsYWNlKSAvZXRjL3BhbS5kL3NzaGQKKyVhdHRyKDA3NTUscm9vdCxyb290KSAlY29uZmlnIC9ldGMvcmMuZC9pbml0LmQvc3NoZAorJWVuZGlmCisKKyVpZiAhICV7bm9feDExX2Fza3Bhc3N9CislZmlsZXMgYXNrcGFzcworJWRlZmF0dHIoLSxyb290LHJvb3QpCislZG9jIHgxMS1zc2gtYXNrcGFzcy0le2F2ZXJzaW9ufS9SRUFETUUKKyVkb2MgeDExLXNzaC1hc2twYXNzLSV7YXZlcnNpb259L0NoYW5nZUxvZworJWRvYyB4MTEtc3NoLWFza3Bhc3MtJXthdmVyc2lvbn0vU3NoQXNrcGFzcyouYWQKKyVhdHRyKDA3NTUscm9vdCxyb290KSAle19saWJleGVjZGlyfS9vcGVuc3NoL3NzaC1hc2twYXNzCislYXR0cigwNzU1LHJvb3Qscm9vdCkgJXtfbGliZXhlY2Rpcn0vb3BlbnNzaC94MTEtc3NoLWFza3Bhc3MKKyVlbmRpZgorCislaWYgISAle25vX2dub21lX2Fza3Bhc3N9CislZmlsZXMgYXNrcGFzcy1nbm9tZQorJWRlZmF0dHIoLSxyb290LHJvb3QpCislYXR0cigwNzU1LHJvb3Qscm9vdCkgJWNvbmZpZyAle19zeXNjb25mZGlyfS9wcm9maWxlLmQvZ25vbWUtc3NoLWFza3Bhc3MuKgorJWF0dHIoMDc1NSxyb290LHJvb3QpICV7X2xpYmV4ZWNkaXJ9L29wZW5zc2gvZ25vbWUtc3NoLWFza3Bhc3MKKyVlbmRpZgorCislY2hhbmdlbG9nCisqIFdlZCBKdWwgMTQgMjAxMCBUaW0gUmljZSA8dGltQG11bHRpdGFsZW50cy5uZXQ+CistIHRlc3QgZm9yIHNraXBfeDExX2Fza3Bhc3MgKGxpbmUgNzcpIHNob3VsZCBoYXZlIGJlZW4gZm9yIG5vX3gxMV9hc2twYXNzCisKKyogTW9uIEp1biAyIDIwMDMgRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPgorLSBSZW1vdmUgbm9pcDYgb3B0aW9uLiBUaGlzIG1heSBiZSBjb250cm9sbGVkIGF0IHJ1bi10aW1lIGluIGNsaWVudCBjb25maWcKKyAgZmlsZSB1c2luZyBuZXcgQWRkcmVzc0ZhbWlseSBkaXJlY3RpdmUKKworKiBNb24gTWF5IDEyIDIwMDMgRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPgorLSBEb24ndCBpbnN0YWxsIHByb2ZpbGUuZCBzY3JpcHRzIHdoZW4gbm90IGJ1aWxkaW5nIHdpdGggR05PTUUvR1RLIGFza3Bhc3MKKyAgKHBhdGNoIGZyb20gYmV0QHJhaHVsLm5ldCkKKworKiBXZWQgT2N0IDAxIDIwMDIgRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPgorLSBJbnN0YWxsIHNzaC1hZ2VudCBzZXRnaWQgbm9ib2R5IHRvIHByZXZlbnQgcHRyYWNlKCkga2V5IHRoZWZ0IGF0dGFja3MKKworKiBNb24gU2VwIDMwIDIwMDIgRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPgorLSBVc2UgY29udHJpYi8gTWFrZWZpbGUgZm9yIGJ1aWxkaW5nIGFza3Bhc3MgcHJvZ3JhbXMKKworKiBGcmkgSnVuIDIxIDIwMDIgRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPgorLSBNZXJnZSBpbiBzcGVjIGNoYW5nZXMgZnJvbSBzZWJhQGlxLnBsIChTZWJhc3RpYW4gUGFjaHV0YSkKKy0gQWRkIG5ldyB7c3NoLHNzaGR9X2NvbmZpZy41IG1hbnBhZ2VzCistIEFkZCBuZXcgc3NoLWtleXNpZ24gcHJvZ3JhbSBhbmQgcmVtb3ZlIHNldHVpZCBmcm9tIHNzaCBjbGllbnQKKworKiBGcmkgTWF5IDEwIDIwMDIgRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPgorLSBNZXJnZSBpbiBzcGVjIGNoYW5nZXMgZnJvbSBSZWRIYXQsIHJlb3JnYW5zaWUgYSBsaXR0bGUKKy0gQWRkIFByaXZzZXAgdXNlciwgZ3JvdXAgYW5kIGRpcmVjdG9yeQorCisqIFRodSBNYXIgIDcgMjAwMiBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+IDMuMXAxLTIKKy0gYnVtcCBhbmQgZ3JpbmQgKHRocm91Z2ggdGhlIGJ1aWxkIHN5c3RlbSkKKworKiBUaHUgTWFyICA3IDIwMDIgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPiAzLjFwMS0xCistIHJlcXVpcmUgc2hhcnV0aWxzIGZvciBidWlsZGluZyAobWluZHJvdCAjMTM3KQorLSByZXF1aXJlIGRiMS1kZXZlbCBvbmx5IHdoZW4gYnVpbGRpbmcgZm9yIDYueCAoIzU1MTA1KSwgd2hpY2ggcHJvYmFibHkgd29uJ3QKKyAgd29yayBhbnl3YXkgKDMuMSByZXF1aXJlcyBPcGVuU1NMIDAuOS42IHRvIGJ1aWxkKSwgYnV0IHdoYXQgdGhlIGhlY2sKKy0gcmVxdWlyZSBwYW0tZGV2ZWwgYnkgZmlsZSAobm90IGJ5IHBhY2thZ2UgbmFtZSkgYWdhaW4KKy0gYWRkIE1hcmt1cydzIHBhdGNoIHRvIGNvbXBpbGUgd2l0aCBPcGVuU1NMIDAuOS41YSAoZnJvbQorICBodHRwOi8vYnVnemlsbGEubWluZHJvdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0MSkgYW5kIGFwcGx5IGl0IGlmIHdlJ3JlCisgIGJ1aWxkaW5nIGZvciA2LngKKworKiBUaHUgTWFyICA3IDIwMDIgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPiAzLjFwMS0wCistIHVwZGF0ZSB0byAzLjFwMQorCisqIFR1ZSBNYXIgIDUgMjAwMiBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+IFNOQVAtMjAwMjAzMDUKKy0gdXBkYXRlIHRvIFNOQVAtMjAwMjAzMDUKKy0gZHJvcCBkZWJ1ZyBwYXRjaCwgZml4ZWQgdXBzdHJlYW0KKworKiBXZWQgRmViIDIwIDIwMDIgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPiBTTkFQLTIwMDIwMjIwCistIHVwZGF0ZSB0byBTTkFQLTIwMDIwMjIwIGZvciB0ZXN0aW5nIHB1cnBvc2VzICh5b3UndmUgYmVlbiB3YXJuZWQsIGlmIHRoZXJlJ3MKKyAgYW55dGhpbmcgdG8gYmUgd2FybmVkIGFib3V0LCBnc3MgcGF0Y2hlcyB3b24ndCBhcHBseSwgSSBkb24ndCBtaW5kKQorCisqIFdlZCBGZWIgMTMgMjAwMiBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+IDMuMC4ycDEtMworLSBhZGQgcGF0Y2hlcyBmcm9tIFNpbW9uIFdpbGtpbnNvbiBhbmQgTmljb2xhcyBXaWxsaWFtcyBmb3IgR1NTQVBJIGtleQorICBleGNoYW5nZSwgYXV0aGVudGljYXRpb24sIGFuZCBuYW1lZCBrZXkgc3VwcG9ydAorCisqIFdlZCBKYW4gMjMgMjAwMiBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+IDMuMC4ycDEtMgorLSByZW1vdmUgZGVwZW5kZW5jeSBvbiBkYjEtZGV2ZWwsIHdoaWNoIGhhcyBqdXN0IGJlZW4gc3dhbGxvd2VkIHVwIHdob2xlCisgIGJ5IGdub21lLWxpYnMtZGV2ZWwKKworKiBTdW4gRGVjIDI5IDIwMDEgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgorLSBhZGp1c3QgYnVpbGQgZGVwZW5kZW5jaWVzIHNvIHRoYXQgYnVpbGQ2eCBhY3R1YWxseSB3b3JrcyByaWdodCAoZml4CisgIGZyb20gSHVnbyB2YW4gZGVyIEtvb2lqKQorCisqIFR1ZSBEZWMgIDQgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+IDMuMC4ycDEtMQorLSB1cGRhdGUgdG8gMy4wLjJwMQorCisqIEZyaSBOb3YgMTYgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+IDMuMC4xcDEtMQorLSB1cGRhdGUgdG8gMy4wLjFwMQorCisqIFR1ZSBOb3YgMTMgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+CistIHVwZGF0ZSB0byBjdXJyZW50IENWUyAobm90IGZvciB1c2UgaW4gZGlzdHJpYnV0aW9uKQorCisqIFRodSBOb3YgIDggMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+IDMuMHAxLTEKKy0gbWVyZ2Ugc29tZSBvZiBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+IGNoYW5nZXMgZnJvbSB0aGUgdXBzdHJlYW0KKyAgMy4wcDEgc3BlYyBmaWxlIGFuZCBpbml0IHNjcmlwdAorCisqIFdlZCBOb3YgIDcgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+CistIHVwZGF0ZSB0byAzLjBwMQorLSB1cGRhdGUgdG8geDExLXNzaC1hc2twYXNzIDEuMi40LjEKKy0gY2hhbmdlIGJ1aWxkIGRlcGVuZGVuY3kgb24gYSBmaWxlIGZyb20gcGFtLWRldmVsIHRvIHRoZSBwYW0tZGV2ZWwgcGFja2FnZQorLSByZXBsYWNlIHByaW1lcyB3aXRoIG1vZHVsaQorCisqIFRodSBTZXAgMjcgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+IDIuOXAyLTkKKy0gaW5jb3Jwb3JhdGUgZml4IGZyb20gTWFya3VzIEZyaWVkbCdzIGFkdmlzb3J5IGZvciBJUC1iYXNlZCBhdXRob3JpemF0aW9uIGJ1Z3MKKworKiBUaHUgU2VwIDEzIDIwMDEgQmVybmhhcmQgUm9zZW5rcmFlbnplciA8YmVyb0ByZWRoYXQuY29tPiAyLjlwMi04CistIE1lcmdlIGNoYW5nZXMgdG8gcmVzY3VlIGJ1aWxkIGZyb20gY3VycmVudCBzeXNhZG1pbiBzdXJ2aXZhbCBjZAorCisqIFRodSBTZXAgIDYgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+IDIuOXAyLTcKKy0gZml4IHNjcCdzIHNlcnZlcidzIHJlcG9ydGluZyBvZiBmaWxlIHNpemVzLCBhbmQgYnVpbGQgd2l0aCB0aGUgcHJvcGVyCisgIHByZXByb2Nlc3NvciBkZWZpbmUgdG8gZ2V0IGxhcmdlLWZpbGUgY2FwYWJsZSBvcGVuKCksIHN0YXQoKSwgZXRjLgorICAoc2Z0cCBoYXMgYmVlbiBkb2luZyB0aGlzIGNvcnJlY3RseSBhbGwgYWxvbmcpICgjNTE4MjcpCistIGNvbmZpZ3VyZSB3aXRob3V0IC0td2l0aC1pcHY0LWRlZmF1bHQgb24gUkhMIDcueCBhbmQgbmV3ZXIgKCM0NTk4NywjNTIyNDcpCistIHB1bGwgY3ZzIHBhdGNoIHRvIGZpeCBzdXBwb3J0IGZvciAvZXRjL25vbG9naW4gZm9yIG5vbi1QQU0gbG9naW5zICgjNDcyOTgpCistIG1hcmsgcHJvZmlsZS5kIHNjcmlwdGxldHMgYXMgY29uZmlnIGZpbGVzICgjNDIzMzcpCistIHJlZmVyIHRvIEphc29uIFN0b25lJ3MgbWFpbCBmb3IgenNoIHdvcmthcm91bmQgZm9yIGV4aXQtaGFuZ2luZyBxdWFzaS1idWcKKy0gY2hhbmdlIGEgY291cGxlIG9mIGxvZygpIHN0YXRlbWVudHMgdG8gZGVidWcoKSBzdGF0ZW1lbnRzICgjNTA3NTEpCistIHB1bGwgY3ZzIHBhdGNoIHRvIGFkZCAtdCBmbGFnIHRvIHNzaGQgKCMyODYxMSkKKy0gY2xlYXIgZmRfc2V0cyBjb3JyZWN0bHkgKG9uZSBiaXQgcGVyIEZELCBub3Qgb25lIGJ5dGUgcGVyIEZEKSAoIzQzMjIxKQorCisqIE1vbiBBdWcgMjAgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+IDIuOXAyLTYKKy0gYWRkIGRiMS1kZXZlbCBhcyBhIEJ1aWxkUHJlcmVxdWlzaXRlIChub3RlZCBieSBIYW5zIEVja2UpCisKKyogVGh1IEF1ZyAxNiAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KKy0gcHVsbCBjdnMgcGF0Y2ggdG8gZml4IHJlbW90ZSBwb3J0IGZvcndhcmRpbmcgd2l0aCBwcm90b2NvbCAyCisKKyogVGh1IEF1ZyAgOSAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KKy0gcHVsbCBjdnMgcGF0Y2ggdG8gYWRkIHNlc3Npb24gaW5pdGlhbGl6YXRpb24gdG8gbm8tcHR5IHNlc3Npb25zCistIHB1bGwgY3ZzIHBhdGNoIHRvIG5vdCBjdXQgb2ZmIGNoYWxsZW5nZXJlc3BvbnNlIGF1dGggbmVlZGxlc3NseQorLSByZWZ1c2UgdG8gZG8gWDExIGZvcndhcmRpbmcgaWYgeGF1dGggaXNuJ3QgdGhlcmUsIGhhbmR5IGlmIHlvdSBlbmFibGUKKyAgaXQgYnkgZGVmYXVsdCBvbiBhIHN5c3RlbSB0aGF0IGRvZXNuJ3QgaGF2ZSBYIGluc3RhbGxlZCAoIzQ5MjYzKQorCisqIFdlZCBBdWcgIDggMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+CistIGRvbid0IGFwcGx5IHBhdGNoZXMgdG8gY29kZSB3ZSBkb24ndCBpbnRlbmQgdG8gYnVpbGQgKHNwb3R0ZWQgYnkgTWF0dCBHYWxnb2NpKQorCisqIE1vbiBBdWcgIDYgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+CistIHBhc3MgT1BUSU9OUyBjb3JyZWN0bHkgdG8gaW5pdGxvZyAoIzUwMTUxKQorCisqIFdlZCBKdWwgMjUgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+CistIHN3aXRjaCB0byB4MTEtc3NoLWFza3Bhc3MgMS4yLjIKKworKiBXZWQgSnVsIDExIDIwMDEgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgorLSByZWJ1aWxkIGluIG5ldyBlbnZpcm9ubWVudAorCisqIE1vbiBKdW4gMjUgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+CistIGRpc2FibGUgdGhlIGdzc2FwaSBwYXRjaAorCisqIE1vbiBKdW4gMTggMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+CistIHVwZGF0ZSB0byAyLjlwMgorLSByZWZyZXNoIHRvIGEgbmV3IHZlcnNpb24gb2YgdGhlIGdzc2FwaSBwYXRjaAorCisqIFRodSBKdW4gIDcgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+CistIGNoYW5nZSBDb3B5cmlnaHQ6IEJTRCB0byBMaWNlbnNlOiBCU0QKKy0gYWRkIE1hcmt1cyBGcmllZGwncyB1bnZlcmlmaWVkIHBhdGNoIGZvciB0aGUgY29va2llIGZpbGUgZGVsZXRpb24gcHJvYmxlbQorICBzbyB0aGF0IHdlIGNhbiB2ZXJpZnkgaXQKKy0gZHJvcCBwYXRjaCB0byBjaGVjayBpZiB4YXV0aCBpcyBwcmVzZW50ICh3YXMgZm9sZGVkIGludG8gY29va2llIHBhdGNoKQorLSBkb24ndCBhcHBseSBnc3NhcGkgcGF0Y2hlcyBmb3IgdGhlIGVycmF0YSBjYW5kaWRhdGUKKy0gY2xlYXIgc3VwcGxlbWVudGFsIGdyb3VwcyBsaXN0IGF0IHN0YXJ0dXAKKworKiBGcmkgTWF5IDI1IDIwMDEgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgorLSBmaXggYW4gZXJyb3IgcGFyc2luZyB0aGUgbmV3IGRlZmF1bHQgc3NoZF9jb25maWcKKy0gYWRkIGEgZml4IGZyb20gTWFya3VzIEZyaWVkbCAodmlhIG9wZW5zc2gtdW5peC1kZXYpIGZvciBzc2gta2V5Z2VuIG5vdAorICBkZWFsaW5nIHdpdGggY29tbWVudHMgcmlnaHQKKworKiBUaHUgTWF5IDI0IDIwMDEgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgorLSBhZGQgaW4gU2ltb24gV2lsa2luc29uJ3MgR1NTQVBJIHBhdGNoIHRvIGdpdmUgaXQgc29tZSB0ZXN0aW5nIGluLWhvdXNlLAorICB0byBiZSByZW1vdmVkIGJlZm9yZSB0aGUgbmV4dCBiZXRhIGN5Y2xlIGJlY2F1c2UgaXQncyBhIGJpZyBkZXBhcnR1cmUKKyAgZnJvbSB0aGUgdXBzdHJlYW0gdmVyc2lvbgorCisqIFRodSBNYXkgIDMgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+CistIGZpbmlzaCBtYXJraW5nIHN0cmluZ3MgaW4gdGhlIGluaXQgc2NyaXB0IGZvciB0cmFuc2xhdGlvbgorLSBtb2RpZnkgaW5pdCBzY3JpcHQgdG8gc291cmNlIC9ldGMvc3lzY29uZmlnL3NzaGQgYW5kIHBhc3MgJE9QVElPTlMgdG8gc3NoZAorICBhdCBzdGFydHVwIChjaGFuZ2UgbWVyZ2VkIGZyb20gb3BlbnNzaC5jb20gaW5pdCBzY3JpcHQsIG9yaWdpbmFsbHkgYnkKKyAgUGVra2EgU2F2b2xhKQorLSByZWZ1c2UgdG8gZG8gWDExIGZvcndhcmRpbmcgaWYgeGF1dGggaXNuJ3QgdGhlcmUsIGhhbmR5IGlmIHlvdSBlbmFibGUKKyAgaXQgYnkgZGVmYXVsdCBvbiBhIHN5c3RlbSB0aGF0IGRvZXNuJ3QgaGF2ZSBYIGluc3RhbGxlZAorCisqIFdlZCBNYXkgIDIgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+CistIHVwZGF0ZSB0byAyLjkKKy0gZHJvcCB2YXJpb3VzIHBhdGNoZXMgdGhhdCBjYW1lIGZyb20gb3Igd2VudCB1cHN0cmVhbSBvciB0byBvciBmcm9tIENWUworCisqIFdlZCBBcHIgMTggMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+CistIG9ubHkgcmVxdWlyZSBpbml0c2NyaXB0cyA1LjAwIG9uIDYuMiAocmVwb3J0ZWQgYnkgUGV0ZXIgQmllcmluZ2VyKQorCisqIFN1biBBcHIgIDggMjAwMSBQcmVzdG9uIEJyb3duIDxwYnJvd25AcmVkaGF0LmNvbT4KKy0gcmVtb3ZlIGV4cGxpY2l0IG9wZW5zc2wgcmVxdWlyZW1lbnQsIGZpeGVzIGJ1aWxkZGlzdHJvIGlzc3VlCistIG1ha2UgaW5pdHNjcmlwdCBzdG9wKCkgZnVuY3Rpb24gd2FpdCB1bnRpbCBzc2hkIHJlYWxseSBkZWFkIHRvIGF2b2lkCisgIHJhY2VzIGluIGNvbmRyZXN0YXJ0CisKKyogTW9uIEFwciAgMiAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KKy0gbWVudGlvbiB0aGF0IGNoYWxsZW5nZXJlcG9uc2Ugc3VwcG9ydHMgUEFNLCBzbyBkaXNhYmxpbmcgcGFzc3dvcmQgZG9lc24ndAorICBsaW1pdCB1c2VycyB0byBwdWJrZXkgYW5kIHJzYSBhdXRoICgjMzQzNzgpCistIGJ5cGFzcyB0aGUgZGFlbW9uKCkgZnVuY3Rpb24gaW4gdGhlIGluaXQgc2NyaXB0IGFuZCBjYWxsIGluaXRsb2cgZGlyZWN0bHksCisgIGJlY2F1c2UgZGFlbW9uKCkgd29uJ3Qgc3RhcnQgYSBkYWVtb24gaXQgZGV0ZWN0cyBpcyBhbHJlYWR5IHJ1bm5pbmcgKGxpa2UKKyAgb3BlbiBjb25uZWN0aW9ucykKKy0gcmVxdWlyZSB0aGUgdmVyc2lvbiBvZiBvcGVuc3NsIHdlIGhhZCB3aGVuIHdlIHdlcmUgYnVpbHQKKworKiBGcmkgTWFyIDIzIDIwMDEgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgorLSBtYWtlIGRvX3BhbV9zZXRjcmVkKCkgc21hcnQgZW5vdWdoIHRvIGtub3cgd2hlbiB0byBlc3RhYmxpc2ggY3JlZHMgYW5kCisgIHdoZW4gdG8gcmVpbml0aWFsaXplIHRoZW0KKy0gYWRkIGluIGEgY291cGxlIG9mIG90aGVyIGZpeGVzIGZyb20gRGFtaWVuIGZvciBpbmNsdXNpb24gaW4gdGhlIGVycmF0YQorCisqIFRodSBNYXIgMjIgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+CistIHVwZGF0ZSB0byAyLjUuMnAyCistIGNhbGwgc2V0Y3JlZCgpIGFnYWluIGFmdGVyIGluaXRncm91cHMsIGJlY2F1c2UgdGhlICJjcmVkcyIgY291bGQgYWN0dWFsbHkKKyAgYmUgZ3JvdXAgbWVtYmVyc2hpcHMKKworKiBUdWUgTWFyIDIwIDIwMDEgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgorLSB1cGRhdGUgdG8gMi41LjJwMSAoaW5jbHVkZXMgZW5kaWFubmVzcyBmaXhlcyBpbiB0aGUgcmlqbmRhZWwgaW1wbGVtZW50YXRpb24pCistIGRvbid0IGVuYWJsZSBjaGFsbGVuZ2UtcmVzcG9uc2UgYnkgZGVmYXVsdCB1bnRpbCB3ZSBmaW5kIGEgd2F5IHRvIG5vdAorICBoYXZlIHRvbyBtYW55IHVzZXJhdXRoIHJlcXVlc3RzICh3ZSBtYXkgbWFrZSB1cCB0byBzaXggcHVia2V5IGFuZCB1cCB0bworICB0aHJlZSBwYXNzd29yZCBhdHRlbXB0cyBhcyBpdCBpcykKKy0gcmVtb3ZlIGJ1aWxkIGRlcGVuZGVuY3kgb24gcnNoIHRvIG1hdGNoIG9wZW5zc2guY29tJ3MgcGFja2FnZXMgbW9yZSBjbG9zZWx5CisKKyogU2F0IE1hciAgMyAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KKy0gcmVtb3ZlIGRlcGVuZGVuY3kgb24gb3BlbnNzbCAtLSB3b3VsZCBuZWVkIHRvIGJlIHRvbyBwcmVjaXNlCisKKyogRnJpIE1hciAgMiAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KKy0gcmVidWlsZCBpbiBuZXcgZW52aXJvbm1lbnQKKworKiBNb24gRmViIDI2IDIwMDEgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgorLSBSZXZlcnQgdGhlIHBhdGNoIHRvIG1vdmUgcGFtX29wZW5fc2Vzc2lvbi4KKy0gSW5pdCBzY3JpcHQgYW5kIHNwZWMgZmlsZSBjaGFuZ2VzIGZyb20gUGVra2EgU2F2b2xhLiAoIzI4NzUwKQorLSBQYXRjaCBzZnRwIHRvIHJlY29nbml6ZSAnLW8gcHJvdG9jb2wnIGFyZ3VtZW50cy4gKCMyOTU0MCkKKworKiBUaHUgRmViIDIyIDIwMDEgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgorLSBDaHVjayB0aGUgY2xvc2luZyBwYXRjaC4KKy0gQWRkIGEgdHJpZ2dlciB0byBhZGQgaG9zdCBrZXlzIGZvciBwcm90b2NvbCAyIHRvIHRoZSBjb25maWcgZmlsZSwgbm93IHRoYXQKKyAgY29uZmlndXJhdGlvbiBmaWxlIHN5bnRheCByZXF1aXJlcyB1cyB0byBzcGVjaWZ5IGl0IHdpdGggSG9zdEtleSBpZiB3ZQorICBzcGVjaWZ5IGFueSBvdGhlciBIb3N0S2V5IHZhbHVlcywgd2hpY2ggd2UgZG8uCisKKyogVHVlIEZlYiAyMCAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KKy0gUmVkbyBwYXRjaCB0byBtb3ZlIHBhbV9vcGVuX3Nlc3Npb24gYWZ0ZXIgdGhlIHNlcnZlciBzZXR1aWQoKXMgdG8gdGhlIHVzZXIuCistIFJld29yayB0aGUgbm9wYW0gcGF0Y2ggdG8gdXNlIGJlIHBpY2tlZCB1cCBieSBhdXRvY29uZi4KKworKiBNb24gRmViIDE5IDIwMDEgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgorLSBVcGRhdGUgZm9yIDIuNS4xcDEuCistIEFkZCBpbml0IHNjcmlwdCBtb2RzIGZyb20gUGVra2EgU2F2b2xhLgorLSBUd2VhayB0aGUgaW5pdCBzY3JpcHQgdG8gbWF0Y2ggdGhlIENWUyBjb250cmliIHNjcmlwdCBtb3JlIGNsb3NlbHkuCistIFJlZG8gcGF0Y2ggdG8gc3NoLWFkZCB0byB0cnkgdG8gYWRkaW5nIGJvdGggaWRlbnRpdHkgYW5kIGlkX2RzYSB0byBhbHNvIHRyeQorICBhZGRpbmcgaWRfcnNhLgorCisqIEZyaSBGZWIgMTYgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+CistIFVwZGF0ZSBmb3IgMi41LjBwMS4KKy0gVXNlICRSUE1fT1BUX0ZMQUdTIGluc3RlYWQgb2YgLU8gd2hlbiBidWlsZGluZyBnbm9tZS1zc2gtYXNrcGFzcworLSBSZXN5bmMgd2l0aCBwYXJ0cyBvZiBEYW1pZW4gTWlsbGVyJ3Mgb3BlbnNzaC5zcGVjIGZyb20gQ1ZTLCBpbmNsdWRpbmcKKyAgdXBkYXRlIG9mIHgxMSBhc2twYXNzIHRvIDEuMi4wLgorLSBPbmx5IHJlcXVpcmUgb3BlbnNzbCAoZG9uJ3QgcHJlcmVxKSBiZWNhdXNlIHdlIGdlbmVyYXRlIGtleXMgaW4gdGhlIGluaXQKKyAgc2NyaXB0IG5vdy4KKworKiBUdWUgRmViIDEzIDIwMDEgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgorLSBEb24ndCBvcGVuIGEgUEFNIHNlc3Npb24gdW50aWwgd2UndmUgZm9ya2VkIGFuZCBiZWNvbWUgdGhlIHVzZXIgKCMyNTY5MCkuCistIEFwcGx5IEFuZHJldyBCYXJ0bGV0dCdzIHBhdGNoIGZvciBsZXR0aW5nIHBhbV9hdXRoZW50aWNhdGUoKSBrbm93IHdoaWNoCisgIGhvc3QgdGhlIHVzZXIgaXMgYXR0ZW1wdGluZyBhIGxvZ2luIGZyb20uCistIFJlc3luYyB3aXRoIHBhcnRzIG9mIERhbWllbiBNaWxsZXIncyBvcGVuc3NoLnNwZWMgZnJvbSBDVlMuCistIERvbid0IGV4cG9zZSBLYmRJbnQgcmVzcG9uc2VzIGluIGRlYnVnIG1lc3NhZ2VzIChmcm9tIENWUykuCistIERldGVjdCBhbmQgaGFuZGxlIGVycm9ycyBpbiByc2Ffe3B1YmxpYyxwcml2YXRlfV9kZWNyeXB0IChmcm9tIENWUykuCisKKyogV2VkIEZlYiAgNyAyMDAxIFRyb25kIEVpdmluZCBHbG9tc3J4ZCA8dGVnQHJlZGhhdC5jb20+CistIGkxOG4tdHdlYWsgdG8gaW5pdHNjcmlwdC4KKworKiBUdWUgSmFuIDIzIDIwMDEgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgorLSBNb3JlIGdldHRleHRpemluZy4KKy0gQ2xvc2UgYWxsIGZpbGVzIGFmdGVyIGdvaW5nIGludG8gZGFlbW9uIG1vZGUgKG5lZWRzIG1vcmUgdGVzdGluZykuCistIEV4dHJhY3QgcGF0Y2ggZnJvbSBDVlMgdG8gaGFuZGxlIGF1dGggYmFubmVycyAoaW4gdGhlIGNsaWVudCkuCistIEV4dHJhY3QgcGF0Y2ggZnJvbSBDVlMgdG8gaGFuZGxlIGNvbXBhdCB3ZWlyZG5lc3MuCisKKyogRnJpIEphbiAxOSAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KKy0gRmluaXNoIHdpdGggdGhlIGdldHRleHRpemluZy4KKworKiBUaHUgSmFuIDE4IDIwMDEgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgorLSBGaXggYSBidWcgaW4gYXV0aDItcGFtLmMgKCMyMzg3NykKKy0gR2V0dGV4dGl6ZSB0aGUgaW5pdCBzY3JpcHQuCisKKyogV2VkIERlYyAyMCAyMDAwIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KKy0gSW5jb3Jwb3JhdGUgYSBzd2l0Y2ggZm9yIHVzaW5nIFBBTSBjb25maWdzIGZvciA2LngsIGp1c3QgaW4gY2FzZS4KKworKiBUdWUgRGVjICA1IDIwMDAgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgorLSBJbmNvcnBvcmF0ZSBCZXJvJ3MgY2hhbmdlcyBmb3IgYSBidWlsZCBzcGVjaWZpY2FsbHkgZm9yIHJlc2N1ZSBDRHMuCisKKyogV2VkIE5vdiAyOSAyMDAwIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KKy0gRG9uJ3QgdHJlYXQgcGFtX3NldGNyZWQoKSBmYWlsdXJlIGFzIGZhdGFsIHVubGVzcyBwYW1fYXV0aGVudGljYXRlKCkgaGFzCisgIHN1Y2NlZWRlZCwgdG8gYWxsb3cgcHVibGljLWtleSBhdXRoZW50aWNhdGlvbiBhZnRlciBhIGZhaWx1cmUgd2l0aCAibm9uZSIKKyAgYXV0aGVudGljYXRpb24uICAoIzIxMjY4KQorCisqIFR1ZSBOb3YgMjggMjAwMCBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+CistIFVwZGF0ZSB0byB4MTEtYXNrcGFzcyAxLjEuMS4gKCMyMTMwMSkKKy0gRG9uJ3Qgc2Vjb25kLWd1ZXNzIGZpeHBhdGhzLCB3aGljaCBjYXVzZXMgcGF0aHMgdG8gZ2V0IGZpeGVkIHR3aWNlLiAoIzIxMjkwKQorCisqIE1vbiBOb3YgMjcgMjAwMCBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+CistIE1lcmdlIG11bHRpcGxlIFBBTSB0ZXh0IG1lc3NhZ2VzIGludG8gc3Vic2VxdWVudCBwcm9tcHRzIHdoZW4gcG9zc2libGUgd2hlbgorICBkb2luZyBrZXlib2FyZC1pbnRlcmFjdGl2ZSBhdXRoZW50aWNhdGlvbi4KKworKiBTdW4gTm92IDI2IDIwMDAgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgorLSBEaXNhYmxlIHRoZSBidWlsdC1pbiBNRDUgcGFzc3dvcmQgc3VwcG9ydC4gIFdlJ3JlIHVzaW5nIFBBTS4KKy0gVGFrZSBhIGNyYWNrIGF0IGRvaW5nIGtleWJvYXJkLWludGVyYWN0aXZlIGF1dGhlbnRpY2F0aW9uIHdpdGggUEFNLCBhbmQKKyAgZW5hYmxlIHVzZSBvZiBpdCBpbiB0aGUgZGVmYXVsdCBjbGllbnQgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBjbGllbnQKKyAgd2lsbCB0cnkgaXQgd2hlbiB0aGUgc2VydmVyIGRpc2FsbG93cyBwYXNzd29yZCBhdXRoZW50aWNhdGlvbi4KKy0gQnVpbGQgd2l0aCBkZWJ1Z2dpbmcgZmxhZ3MuICBCdWlsZCByb290IHBvbGljaWVzIHN0cmlwIGFsbCBiaW5hcmllcyBhbnl3YXkuCisKKyogVHVlIE5vdiAyMSAyMDAwIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KKy0gVXNlIERFU1RESVIgaW5zdGVhZCBvZiAlJW1ha2VpbnN0YWxsLgorLSBSZW1vdmUgL3Vzci9YMTFSNi9iaW4gZnJvbSB0aGUgcGF0aC1maXhpbmcgcGF0Y2guCisKKyogTW9uIE5vdiAyMCAyMDAwIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KKy0gQWRkIHRoZSBwcmltZXMgZmlsZSBmcm9tIHRoZSBsYXRlc3Qgc25hcHNob3QgdG8gdGhlIG1haW4gcGFja2FnZSAoIzIwODg0KS4KKy0gQWRkIHRoZSBkZXYgcGFja2FnZSB0byB0aGUgcHJlcmVxIGxpc3QgKCMxOTk4NCkuCistIFJlbW92ZSB0aGUgZGVmYXVsdCBwYXRoIGFuZCBtaW1pYyBsb2dpbidzIGJlaGF2aW9yIGluIHRoZSBzZXJ2ZXIgaXRzZWxmLgorCisqIEZyaSBOb3YgMTcgMjAwMCBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+CistIFJlc3luYyB3aXRoIGNvbmRpdGlvbmFsIG9wdGlvbnMgaW4gRGFtaWVuIE1pbGxlcidzIC5zcGVjIGZpbGUgZm9yIGFuIGVycmF0YS4KKy0gQ2hhbmdlIGxpYmV4ZWNkaXIgZnJvbSAlJXtfbGliZXhlY2Rpcn0vc3NoIHRvICUle19saWJleGVjZGlyfS9vcGVuc3NoLgorCisqIFR1ZSBOb3YgIDcgMjAwMCBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+CistIFVwZGF0ZSB0byBPcGVuU1NIIDIuMy4wcDEuCistIFVwZGF0ZSB0byB4MTEtYXNrcGFzcyAxLjEuMC4KKy0gRW5hYmxlIGtleWJvYXJkLWludGVyYWN0aXZlIGF1dGhlbnRpY2F0aW9uLgorCisqIE1vbiBPY3QgMzAgMjAwMCBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+CistIFVwZGF0ZSB0byBzc2gtYXNrcGFzcy14MTEgMS4wLjMuCistIENoYW5nZSBhdXRoZW50aWNhdGlvbiByZWxhdGVkIG1lc3NhZ2VzIHRvIGJlIHByaXZhdGUgKCMxOTk2NikuCisKKyogVHVlIE9jdCAxMCAyMDAwIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KKy0gUGF0Y2ggc3NoLWtleWdlbiB0byBiZSBhYmxlIHRvIGxpc3Qgc2lnbmF0dXJlcyBmb3IgRFNBIHB1YmxpYyBrZXkgZmlsZXMKKyAgaXQgZ2VuZXJhdGVzLgorCisqIFRodSBPY3QgIDUgMjAwMCBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+CistIEFkZCBCdWlsZFJlcXVpcmVzIG9uIC91c3IvaW5jbHVkZS9zZWN1cml0eS9wYW1fYXBwbC5oIHRvIGJlIHN1cmUgd2UgYWx3YXlzCisgIGJ1aWxkIFBBTSBhdXRoZW50aWNhdGlvbiBpbi4KKy0gVHJ5IHNldHRpbmcgU1NIX0FTS1BBU1MgaWYgZ25vbWUtc3NoLWFza3Bhc3MgaXMgaW5zdGFsbGVkLgorLSBDbGVhbiBvdXQgbm8tbG9uZ2VyLXVzZWQgcGF0Y2hlcy4KKy0gUGF0Y2ggc3NoLWFkZCB0byB0cnkgdG8gYWRkIGJvdGggaWRlbnRpdHkgYW5kIGlkX2RzYSwgYW5kIHRvIGVycm9yIG9ubHkKKyAgd2hlbiBuZWl0aGVyIGV4aXN0cy4KKworKiBNb24gT2N0ICAyIDIwMDAgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgorLSBVcGRhdGUgeDExLWFza3Bhc3MgdG8gMS4wLjIuICgjMTc4MzUpCistIEFkZCBCdWlsZFJlcXVpcmVzcyBmb3IgL2Jpbi9sb2dpbiBhbmQgL3Vzci9iaW4vcnNoIHNvIHRoYXQgY29uZmlndXJlIHdpbGwKKyAgYWx3YXlzIGZpbmQgdGhlbSBpbiB0aGUgcmlnaHQgcGxhY2UuICgjMTc5MDkpCistIFNldCB0aGUgZGVmYXVsdCBwYXRoIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBvbmUgc3VwcGxpZWQgYnkgL2Jpbi9sb2dpbiwgYnV0CisgIGFkZCAvdXNyL1gxMVI2L2Jpbi4gKCMxNzkwOSkKKy0gVHJ5IHRvIGhhbmRsZSBvYnNvbGV0aW9uIG9mIHNzaC1zZXJ2ZXIgbW9yZSBjbGVhbmx5LiAgUGFja2FnZSBuYW1lcworICBhcmUgZGlmZmVyZW50LCBidXQgaW5pdCBzY3JpcHQgbmFtZSBpc24ndC4gKCMxNzg2NSkKKworKiBXZWQgU2VwICA2IDIwMDAgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgorLSBVcGRhdGUgdG8gMi4yLjBwMS4gKCMxNzgzNSkKKy0gVHdlYWsgdGhlIGluaXQgc2NyaXB0IHRvIGFsbG93IHByb3BlciByZXN0YXJ0aW5nLiAoIzE4MDIzKQorCisqIFdlZCBBdWcgMjMgMjAwMCBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+CistIFVwZGF0ZSB0byAyMDAwMDgyMyBzbmFwc2hvdC4KKy0gQ2hhbmdlIHN1YnBhY2thZ2UgcmVxdWlyZW1lbnRzIGZyb20gJSV7dmVyc2lvbn0gdG8gJSV7dmVyc2lvbn0tJSV7cmVsZWFzZX0KKy0gQmFjayBvdXQgdGhlIHBpcGUgcGF0Y2guCisKKyogTW9uIEp1bCAxNyAyMDAwIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KKy0gVXBkYXRlIHRvIDIuMS4xcDQsIHdoaWNoIGluY2x1ZGVzIGZpeGVzIGZvciBjb25maWcgZmlsZSBwYXJzaW5nIHByb2JsZW1zLgorLSBNb3ZlIHRoZSBpbml0IHNjcmlwdCBiYWNrLgorLSBBZGQgRGFtaWVuJ3MgcXVpY2sgZml4IGZvciB3YWNraW5lc3MuCisKKyogV2VkIEp1bCAxMiAyMDAwIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KKy0gVXBkYXRlIHRvIDIuMS4xcDMsIHdoaWNoIGluY2x1ZGVzIGZpeGVzIGZvciBYMTEgZm9yd2FyZGluZyBhbmQgc3RydG9rKCkuCisKKyogVGh1IEp1bCAgNiAyMDAwIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KKy0gTW92ZSBjb25kcmVzdGFydCB0byBzZXJ2ZXIgcG9zdHVuLgorLSBNb3ZlIGtleSBnZW5lcmF0aW9uIHRvIGluaXQgc2NyaXB0LgorLSBBY3R1YWxseSB1c2UgdGhlIHJpZ2h0IHBhdGNoIGZvciBtb3ZpbmcgdGhlIGtleSBnZW5lcmF0aW9uIHRvIHRoZSBpbml0IHNjcmlwdC4KKy0gQ2xlYW4gdXAgdGhlIGluaXQgc2NyaXB0IGEgYml0LgorCisqIFdlZCBKdWwgIDUgMjAwMCBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+CistIEZpeCBYMTEgZm9yd2FyZGluZywgZnJvbSBtYWlsIHBvc3QgYnkgQ2hhbiBTaGloLVBpbmcgUmljaGFyZC4KKworKiBTdW4gSnVsICAyIDIwMDAgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgorLSBVcGRhdGUgdG8gMi4xLjFwMi4KKy0gVXNlIG9mIHN0cnRvaygpIGNvbnNpZGVyZWQgaGFybWZ1bC4KKworKiBTYXQgSnVsICAxIDIwMDAgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgorLSBHZXQgdGhlIGJ1aWxkIHJvb3Qgb3V0IG9mIHRoZSBtYW4gcGFnZXMuCisKKyogVGh1IEp1biAyOSAyMDAwIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KKy0gQWRkIGFuZCB1c2UgY29uZHJlc3RhcnQgc3VwcG9ydCBpbiB0aGUgaW5pdCBzY3JpcHQuCistIEFkZCBuZXdlciBpbml0c2NyaXB0cyBhcyBhIHByZXJlcS4KKworKiBUdWUgSnVuIDI3IDIwMDAgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgorLSBCdWlsZCBpbiBuZXcgZW52aXJvbm1lbnQgKHJlbGVhc2UgMikKKy0gTW92ZSAtY2xpZW50cyBzdWJwYWNrYWdlIHRvIEFwcGxpY2F0aW9ucy9JbnRlcm5ldCBncm91cAorCisqIEZyaSBKdW4gIDkgMjAwMCBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+CistIFVwZGF0ZSB0byAyLjIuMXAxCisKKyogU2F0IEp1biAgMyAyMDAwIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KKy0gUGF0Y2ggdG8gYnVpbGQgd2l0aCBuZWl0aGVyIFJTQSBub3IgUlNBcmVmLgorLSBNaXNjZWxsYW5lb3VzIEZIUy1jb21wbGlhbmNlIHR3ZWFrcy4KKy0gRml4IGZvciBwb3NzaWJseS1jb21wcmVzc2VkIG1hbiBwYWdlcy4KKworKiBXZWQgTWFyIDE1IDIwMDAgRGFtaWVuIE1pbGxlciA8ZGptQGlicy5jb20uYXU+CistIFVwZGF0ZWQgZm9yIG5ldyBsb2NhdGlvbgorLSBVcGRhdGVkIGZvciBuZXcgZ25vbWUtc3NoLWFza3Bhc3MgYnVpbGQKKworKiBTdW4gRGVjIDI2IDE5OTkgRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPgorLSBBZGRlZCBKaW0gS25vYmxlJ3MgPGpta25vYmxlQHBvYm94LmNvbT4gYXNrcGFzcworCisqIE1vbiBOb3YgMTUgMTk5OSBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+CistIFNwbGl0IHN1YnBhY2thZ2VzIGZ1cnRoZXIgYmFzZWQgb24gcGF0Y2ggZnJvbSBqaW0ga25vYmxlIDxqbWtub2JsZUBwb2JveC5jb20+CisKKyogU2F0IE5vdiAxMyAxOTk5IERhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz4KKy0gQWRkZWQgJ09ic29sZXRlcycgZGlyZWN0aXZlcworCisqIFR1ZSBOb3YgMDkgMTk5OSBEYW1pZW4gTWlsbGVyIDxkam1AaWJzLmNvbS5hdT4KKy0gVXNlIG1ha2UgaW5zdGFsbAorLSBTdWJwYWNrYWdlcworCisqIE1vbiBOb3YgMDggMTk5OSBEYW1pZW4gTWlsbGVyIDxkam1AaWJzLmNvbS5hdT4KKy0gQWRkZWQgbGlua3MgZm9yIHNsb2dpbgorLSBGaXhlZCBwZXJtcyBvbiBtYW5wYWdlcworCisqIFNhdCBPY3QgMzAgMTk5OSBEYW1pZW4gTWlsbGVyIDxkam1AaWJzLmNvbS5hdT4KKy0gUmVuYW1lZCBpbml0IHNjcmlwdAorCisqIEZyaSBPY3QgMjkgMTk5OSBEYW1pZW4gTWlsbGVyIDxkam1AaWJzLmNvbS5hdT4KKy0gQmFjayB0byBvbGQgYmluYXJ5IG5hbWVzCisKKyogVGh1IE9jdCAyOCAxOTk5IERhbWllbiBNaWxsZXIgPGRqbUBpYnMuY29tLmF1PgorLSBVc2UgYXV0b2NvbmYKKy0gTmV3IGJpbmFyeSBuYW1lcworCisqIFdlZCBPY3QgMjcgMTk5OSBEYW1pZW4gTWlsbGVyIDxkam1AaWJzLmNvbS5hdT4KKy0gSW5pdGlhbCBSUE1pZmljYXRpb24sIGJhc2VkIG9uIEphbiAiWWVueWEiIEthc3ByemFrJ3MgPGthc0BmaS5tdW5pLmN6PiBzcGVjLgpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jb250cmliL3JlZGhhdC9zc2hkLmluaXQgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvcmVkaGF0L3NzaGQuaW5pdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lOWE3NTE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9jb250cmliL3JlZGhhdC9zc2hkLmluaXQKQEAgLTAsMCArMSwxMDYgQEAKKyMhL2Jpbi9iYXNoCisjCisjIEluaXQgZmlsZSBmb3IgT3BlblNTSCBzZXJ2ZXIgZGFlbW9uCisjCisjIGNoa2NvbmZpZzogMjM0NSA1NSAyNQorIyBkZXNjcmlwdGlvbjogT3BlblNTSCBzZXJ2ZXIgZGFlbW9uCisjCisjIHByb2Nlc3NuYW1lOiBzc2hkCisjIGNvbmZpZzogL2V0Yy9zc2gvc3NoX2hvc3Rfa2V5CisjIGNvbmZpZzogL2V0Yy9zc2gvc3NoX2hvc3Rfa2V5LnB1YgorIyBjb25maWc6IC9ldGMvc3NoL3NzaF9yYW5kb21fc2VlZAorIyBjb25maWc6IC9ldGMvc3NoL3NzaGRfY29uZmlnCisjIHBpZGZpbGU6IC92YXIvcnVuL3NzaGQucGlkCisKKyMgc291cmNlIGZ1bmN0aW9uIGxpYnJhcnkKKy4gL2V0Yy9yYy5kL2luaXQuZC9mdW5jdGlvbnMKKworIyBwdWxsIGluIHN5c2NvbmZpZyBzZXR0aW5ncworWyAtZiAvZXRjL3N5c2NvbmZpZy9zc2hkIF0gJiYgLiAvZXRjL3N5c2NvbmZpZy9zc2hkCisKK1JFVFZBTD0wCitwcm9nPSJzc2hkIgorCisjIFNvbWUgZnVuY3Rpb25zIHRvIG1ha2UgdGhlIGJlbG93IG1vcmUgcmVhZGFibGUKK1NTSEQ9L3Vzci9zYmluL3NzaGQKK1BJRF9GSUxFPS92YXIvcnVuL3NzaGQucGlkCisKK2RvX3Jlc3RhcnRfc2FuaXR5X2NoZWNrKCkKK3sKKwkkU1NIRCAtdAorCVJFVFZBTD0kPworCWlmIFsgISAiJFJFVFZBTCIgPSAwIF07IHRoZW4KKwkJZmFpbHVyZSAkIkNvbmZpZ3VyYXRpb24gZmlsZSBvciBrZXlzIGFyZSBpbnZhbGlkIgorCQllY2hvCisJZmkKK30KKworc3RhcnQoKQoreworCSMgQ3JlYXRlIGtleXMgaWYgbmVjZXNzYXJ5CisJL3Vzci9iaW4vc3NoLWtleWdlbiAtQQorCWlmIFsgLXggL3NiaW4vcmVzdG9yZWNvbiBdOyB0aGVuCisJCS9zYmluL3Jlc3RvcmVjb24gL2V0Yy9zc2gvc3NoX2hvc3Rfa2V5LnB1YgorCQkvc2Jpbi9yZXN0b3JlY29uIC9ldGMvc3NoL3NzaF9ob3N0X3JzYV9rZXkucHViCisJCS9zYmluL3Jlc3RvcmVjb24gL2V0Yy9zc2gvc3NoX2hvc3RfZHNhX2tleS5wdWIKKwkJL3NiaW4vcmVzdG9yZWNvbiAvZXRjL3NzaC9zc2hfaG9zdF9lY2RzYV9rZXkucHViCisJZmkKKworCWVjaG8gLW4gJCJTdGFydGluZyAkcHJvZzoiCisJJFNTSEQgJE9QVElPTlMgJiYgc3VjY2VzcyB8fCBmYWlsdXJlCisJUkVUVkFMPSQ/CisJWyAiJFJFVFZBTCIgPSAwIF0gJiYgdG91Y2ggL3Zhci9sb2NrL3N1YnN5cy9zc2hkCisJZWNobworfQorCitzdG9wKCkKK3sKKwllY2hvIC1uICQiU3RvcHBpbmcgJHByb2c6IgorCWtpbGxwcm9jICRTU0hEIC1URVJNCisJUkVUVkFMPSQ/CisJWyAiJFJFVFZBTCIgPSAwIF0gJiYgcm0gLWYgL3Zhci9sb2NrL3N1YnN5cy9zc2hkCisJZWNobworfQorCityZWxvYWQoKQoreworCWVjaG8gLW4gJCJSZWxvYWRpbmcgJHByb2c6IgorCWtpbGxwcm9jICRTU0hEIC1IVVAKKwlSRVRWQUw9JD8KKwllY2hvCit9CisKK2Nhc2UgIiQxIiBpbgorCXN0YXJ0KQorCQlzdGFydAorCQk7OworCXN0b3ApCisJCXN0b3AKKwkJOzsKKwlyZXN0YXJ0KQorCQlzdG9wCisJCXN0YXJ0CisJCTs7CisJcmVsb2FkKQorCQlyZWxvYWQKKwkJOzsKKwljb25kcmVzdGFydCkKKwkJaWYgWyAtZiAvdmFyL2xvY2svc3Vic3lzL3NzaGQgXSA7IHRoZW4KKwkJCWRvX3Jlc3RhcnRfc2FuaXR5X2NoZWNrCisJCQlpZiBbICIkUkVUVkFMIiA9IDAgXSA7IHRoZW4KKwkJCQlzdG9wCisJCQkJIyBhdm9pZCByYWNlCisJCQkJc2xlZXAgMworCQkJCXN0YXJ0CisJCQlmaQorCQlmaQorCQk7OworCXN0YXR1cykKKwkJc3RhdHVzICRTU0hECisJCVJFVFZBTD0kPworCQk7OworCSopCisJCWVjaG8gJCJVc2FnZTogJDAge3N0YXJ0fHN0b3B8cmVzdGFydHxyZWxvYWR8Y29uZHJlc3RhcnR8c3RhdHVzfSIKKwkJUkVUVkFMPTEKK2VzYWMKK2V4aXQgJFJFVFZBTApkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jb250cmliL3JlZGhhdC9zc2hkLmluaXQub2xkIGIvb3BlbnNzaC02LjBwMS9jb250cmliL3JlZGhhdC9zc2hkLmluaXQub2xkCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBkZWI2MDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvcmVkaGF0L3NzaGQuaW5pdC5vbGQKQEAgLTAsMCArMSwxNzIgQEAKKyMhL2Jpbi9iYXNoCisjCisjIEluaXQgZmlsZSBmb3IgT3BlblNTSCBzZXJ2ZXIgZGFlbW9uCisjCisjIGNoa2NvbmZpZzogMjM0NSA1NSAyNQorIyBkZXNjcmlwdGlvbjogT3BlblNTSCBzZXJ2ZXIgZGFlbW9uCisjCisjIHByb2Nlc3NuYW1lOiBzc2hkCisjIGNvbmZpZzogL2V0Yy9zc2gvc3NoX2hvc3Rfa2V5CisjIGNvbmZpZzogL2V0Yy9zc2gvc3NoX2hvc3Rfa2V5LnB1YgorIyBjb25maWc6IC9ldGMvc3NoL3NzaF9yYW5kb21fc2VlZAorIyBjb25maWc6IC9ldGMvc3NoL3NzaGRfY29uZmlnCisjIHBpZGZpbGU6IC92YXIvcnVuL3NzaGQucGlkCisKKyMgc291cmNlIGZ1bmN0aW9uIGxpYnJhcnkKKy4gL2V0Yy9yYy5kL2luaXQuZC9mdW5jdGlvbnMKKworIyBwdWxsIGluIHN5c2NvbmZpZyBzZXR0aW5ncworWyAtZiAvZXRjL3N5c2NvbmZpZy9zc2hkIF0gJiYgLiAvZXRjL3N5c2NvbmZpZy9zc2hkCisKK1JFVFZBTD0wCitwcm9nPSJzc2hkIgorCisjIFNvbWUgZnVuY3Rpb25zIHRvIG1ha2UgdGhlIGJlbG93IG1vcmUgcmVhZGFibGUKK0tFWUdFTj0vdXNyL2Jpbi9zc2gta2V5Z2VuCitTU0hEPS91c3Ivc2Jpbi9zc2hkCitSU0ExX0tFWT0vZXRjL3NzaC9zc2hfaG9zdF9rZXkKK1JTQV9LRVk9L2V0Yy9zc2gvc3NoX2hvc3RfcnNhX2tleQorRFNBX0tFWT0vZXRjL3NzaC9zc2hfaG9zdF9kc2Ffa2V5CitQSURfRklMRT0vdmFyL3J1bi9zc2hkLnBpZAorCitteV9zdWNjZXNzKCkgeworICBsb2NhbCBtc2cKKyAgaWYgWyAkIyAtZ3QgMSBdOyB0aGVuCisgICAgbXNnPSIkMiIKKyAgZWxzZQorICAgIG1zZz0iZG9uZSIKKyAgZmkKKyAgY2FzZSAiYHR5cGUgLXR5cGUgc3VjY2Vzc2AiIGluCisgICAgZnVuY3Rpb24pCisgICAgICBzdWNjZXNzICIkMSIKKyAgICA7OworICAgICopCisgICAgICBlY2hvIC1uICIke21zZ30iCisgICAgOzsKKyAgZXNhYworfQorbXlfZmFpbHVyZSgpIHsKKyAgbG9jYWwgbXNnCisgIGlmIFsgJCMgLWd0IDEgXTsgdGhlbgorICAgIG1zZz0iJDIiCisgIGVsc2UKKyAgICBtc2c9IkZBSUxFRCIKKyAgZmkKKyAgY2FzZSAiYHR5cGUgLXR5cGUgZmFpbHVyZWAiIGluCisgICAgZnVuY3Rpb24pCisgICAgICBmYWlsdXJlICIkMSIKKyAgICA7OworICAgICopCisgICAgICBlY2hvIC1uICIke21zZ30iCisgICAgOzsKKyAgZXNhYworfQorZG9fcnNhMV9rZXlnZW4oKSB7CisJaWYgWyAhIC1zICRSU0ExX0tFWSBdOyB0aGVuCisJCWVjaG8gLW4gIkdlbmVyYXRpbmcgU1NIMSBSU0EgaG9zdCBrZXk6ICIKKwkJaWYgJEtFWUdFTiAtcSAtdCByc2ExIC1mICRSU0ExX0tFWSAtQyAnJyAtTiAnJyA+Ji9kZXYvbnVsbDsgdGhlbgorCQkJY2htb2QgNjAwICRSU0ExX0tFWQorCQkJY2htb2QgNjQ0ICRSU0ExX0tFWS5wdWIKKwkJCW15X3N1Y2Nlc3MgIlJTQTEga2V5IGdlbmVyYXRpb24iCisJCQllY2hvCisJCWVsc2UKKwkJCW15X2ZhaWx1cmUgIlJTQTEga2V5IGdlbmVyYXRpb24iCisJCQllY2hvCisJCQlleGl0IDEKKwkJZmkKKwlmaQorfQorZG9fcnNhX2tleWdlbigpIHsKKwlpZiBbICEgLXMgJFJTQV9LRVkgXTsgdGhlbgorCQllY2hvIC1uICJHZW5lcmF0aW5nIFNTSDIgUlNBIGhvc3Qga2V5OiAiCisJCWlmICRLRVlHRU4gLXEgLXQgcnNhIC1mICRSU0FfS0VZIC1DICcnIC1OICcnID4mL2Rldi9udWxsOyB0aGVuCisJCQljaG1vZCA2MDAgJFJTQV9LRVkKKwkJCWNobW9kIDY0NCAkUlNBX0tFWS5wdWIKKwkJCW15X3N1Y2Nlc3MgIlJTQSBrZXkgZ2VuZXJhdGlvbiIKKwkJCWVjaG8KKwkJZWxzZQorCQkJbXlfZmFpbHVyZSAiUlNBIGtleSBnZW5lcmF0aW9uIgorCQkJZWNobworCQkJZXhpdCAxCisJCWZpCisJZmkKK30KK2RvX2RzYV9rZXlnZW4oKSB7CisJaWYgWyAhIC1zICREU0FfS0VZIF07IHRoZW4KKwkJZWNobyAtbiAiR2VuZXJhdGluZyBTU0gyIERTQSBob3N0IGtleTogIgorCQlpZiAkS0VZR0VOIC1xIC10IGRzYSAtZiAkRFNBX0tFWSAtQyAnJyAtTiAnJyA+Ji9kZXYvbnVsbDsgdGhlbgorCQkJY2htb2QgNjAwICREU0FfS0VZCisJCQljaG1vZCA2NDQgJERTQV9LRVkucHViCisJCQlteV9zdWNjZXNzICJEU0Ega2V5IGdlbmVyYXRpb24iCisJCQllY2hvCisJCWVsc2UKKwkJCW15X2ZhaWx1cmUgIkRTQSBrZXkgZ2VuZXJhdGlvbiIKKwkJCWVjaG8KKwkJCWV4aXQgMQorCQlmaQorCWZpCit9Citkb19yZXN0YXJ0X3Nhbml0eV9jaGVjaygpIHsKKwkkU1NIRCAtdAorCVJFVFZBTD0kPworCWlmIFsgISAiJFJFVFZBTCIgPSAwIF07IHRoZW4KKwkJbXlfZmFpbHVyZSAiQ29uZmlndXJhdGlvbiBmaWxlIG9yIGtleXMiCisJCWVjaG8KKwlmaQorfQorCisKK2Nhc2UgIiQxIiBpbgorCXN0YXJ0KQorCQkjIENyZWF0ZSBrZXlzIGlmIG5lY2Vzc2FyeQorCQlkb19yc2ExX2tleWdlbjsKKwkJZG9fcnNhX2tleWdlbjsKKwkJZG9fZHNhX2tleWdlbjsKKwkJCisJCWVjaG8gLW4gIlN0YXJ0aW5nIHNzaGQ6ICIKKwkJaWYgWyAhIC1mICRQSURfRklMRSBdIDsgdGhlbgorCQkJc3NoZCAkT1BUSU9OUworCQkJUkVUVkFMPSQ/CisJCQlpZiBbICIkUkVUVkFMIiA9ICIwIiBdIDsgdGhlbgorCQkJCW15X3N1Y2Nlc3MgInNzaGQgc3RhcnR1cCIgInNzaGQiCisJCQkJdG91Y2ggL3Zhci9sb2NrL3N1YnN5cy9zc2hkCisJCQllbHNlCisJCQkJbXlfZmFpbHVyZSAic3NoZCBzdGFydHVwIiAiIgorCQkJZmkKKwkJZmkKKwkJZWNobworCQk7OworCXN0b3ApCisJCWVjaG8gLW4gIlNodXR0aW5nIGRvd24gc3NoZDogIgorCQlpZiBbIC1mICRQSURfRklMRSBdIDsgdGhlbgorCQkJa2lsbHByb2Mgc3NoZAorCQkJUkVUVkFMPSQ/CisJCQlbICRSRVRWQUwgLWVxIDAgXSAmJiBybSAtZiAvdmFyL2xvY2svc3Vic3lzL3NzaGQKKwkJZmkKKwkJZWNobworCQk7OworCXJlc3RhcnQpCisJCWRvX3Jlc3RhcnRfc2FuaXR5X2NoZWNrCisJCSQwIHN0b3AKKwkJJDAgc3RhcnQKKwkJUkVUVkFMPSQ/CisJCTs7CisJY29uZHJlc3RhcnQpCisJCWlmIFsgLWYgL3Zhci9sb2NrL3N1YnN5cy9zc2hkIF0gOyB0aGVuCisJCQlkb19yZXN0YXJ0X3Nhbml0eV9jaGVjaworCQkJJDAgc3RvcAorCQkJJDAgc3RhcnQKKwkJCVJFVFZBTD0kPworCQlmaQorCQk7OworCXN0YXR1cykKKwkJc3RhdHVzIHNzaGQKKwkJUkVUVkFMPSQ/CisJCTs7CisJKikKKwkJZWNobyAiVXNhZ2U6IHNzaGQge3N0YXJ0fHN0b3B8cmVzdGFydHxzdGF0dXN8Y29uZHJlc3RhcnR9IgorCQlleGl0IDEKKwkJOzsKK2VzYWMKKworZXhpdCAkUkVUVkFMCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvcmVkaGF0L3NzaGQucGFtIGIvb3BlbnNzaC02LjBwMS9jb250cmliL3JlZGhhdC9zc2hkLnBhbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmE1YWRiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9jb250cmliL3JlZGhhdC9zc2hkLnBhbQpAQCAtMCwwICsxLDYgQEAKKyMlUEFNLTEuMAorYXV0aCAgICAgICByZXF1aXJlZCAgICAgcGFtX3N0YWNrLnNvIHNlcnZpY2U9c3lzdGVtLWF1dGgKK2FjY291bnQgICAgcmVxdWlyZWQgICAgIHBhbV9ub2xvZ2luLnNvCithY2NvdW50ICAgIHJlcXVpcmVkICAgICBwYW1fc3RhY2suc28gc2VydmljZT1zeXN0ZW0tYXV0aAorcGFzc3dvcmQgICByZXF1aXJlZCAgICAgcGFtX3N0YWNrLnNvIHNlcnZpY2U9c3lzdGVtLWF1dGgKK3Nlc3Npb24gICAgcmVxdWlyZWQgICAgIHBhbV9zdGFjay5zbyBzZXJ2aWNlPXN5c3RlbS1hdXRoCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvcmVkaGF0L3NzaGQucGFtLm9sZCBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9yZWRoYXQvc3NoZC5wYW0ub2xkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZGNiMzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvcmVkaGF0L3NzaGQucGFtLm9sZApAQCAtMCwwICsxLDggQEAKKyMlUEFNLTEuMAorYXV0aCAgICAgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fcHdkYi5zbyBzaGFkb3cgbm9kZWxheQorYXV0aCAgICAgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fbm9sb2dpbi5zbworYWNjb3VudCAgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fcHdkYi5zbworcGFzc3dvcmQgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fY3JhY2tsaWIuc28KK3Bhc3N3b3JkICAgcmVxdWlyZWQgICAgIC9saWIvc2VjdXJpdHkvcGFtX3B3ZGIuc28gc2hhZG93IG51bGxvayB1c2VfYXV0aHRvaworc2Vzc2lvbiAgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fcHdkYi5zbworc2Vzc2lvbiAgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fbGltaXRzLnNvCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvc29sYXJpcy9SRUFETUUgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvc29sYXJpcy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVmZGQ0YgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9zb2xhcmlzL1JFQURNRQpAQCAtMCwwICsxLDMwIEBACitUaGUgZm9sbG93aW5nIGlzIGEgbmV3IHBhY2thZ2UgYnVpbGQgc2NyaXB0IGZvciBTb2xhcmlzLiAgIFRoaXMgaXMgYmVpbmcKK2ludHJvZHVjZWQgaW50byBPcGVuU1NIIDMuMCBhbmQgYWJvdmUgaW4gaG9wZXMgb2Ygc2ltcGxpZnlpbmcgdGhlIGJ1aWxkCitwcm9jZXNzLiAgQXMgb2YgMy4xcDIgdGhlIHNjcmlwdCBzaG91bGQgd29yayBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgaGF2ZQorU1ZSNCBzdHlsZSBwYWNrYWdlIHRvb2xzLgorCitUaGUgYnVpbGQgcHJvY2VzcyBpcyBjYWxsZWQgYSAnZHVtbXkgaW5zdGFsbCcuLiBXaGljaCBtZWFucyB0aGUgc29mdHdhcmUgZG9lcworYSAgIm1ha2UgaW5zdGFsbC1ub2tleXMgREVTVERJUj1bZmFrZXJvb3RdIi4gIFRoaXMgd2F5IGFsbCBtYW5wYWdlcyBzaG91bGQKK2JlIGhhbmRsZWQgY29ycmVjdGx5IGFuZCBrZXkgYXJlIGRlZmVyZWQgdW50aWwgdGhlIGZpcnN0IHRpbWUgdGhlIHNzaGQKK2lzIHN0YXJ0ZWQuCisKK0RpcmVjdGlvbnM6CisKKzEuIG1ha2UgLUYgTWFrZWZpbGUuaW4gZGlzdHByZXAgIChPbmx5IGlmIHlvdSBhcmUgZ2V0dGluZyBmcm9tIHRoZSBDVlMgdHJlZSkKKzIuIC4vY29uZmlndXJlIC0td2l0aC1wYW0gWy4uYW55IG90aGVyIG9wdGlvbnMgeW91IHdhbnQuLl0KKzMuIGxvb2sgYXQgdGhlIHRvcCBvZiBidWlsZHBrZy5zaCBmb3IgdGhlIGNvbmZpZ3VyYWJsZSBvcHRpb25zIGFuZCBwdXQKKyAgIGFueSBjaGFuZ2VzIHlvdSB3YW50IGluIG9wZW5zc2gtY29uZmlnLmxvY2FsLiBBZGRpdGlvbmFsIGN1c3RvbWl6YXRpb25zCisgICBjYW4gYmUgZG9uZSB0byB0aGUgYnVpbGQgcHJvY2VzcyBieSBjcmVhdGluZyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nCisgICBzY3JpcHRzIHRoYXQgd2lsbCBiZSBzb3VyY2VkIGJ5IGJ1aWxkcGtnLnNoLgorCXBrZ19wb3N0X21ha2VfaW5zdGFsbF9maXhlcy5zaCBwa2ctcG9zdC1wcm90b3R5cGUtZWRpdC5zaAorCXBrZy1wcmVpbnN0YWxsLmxvY2FsIHBrZy1wb3N0aW5zdGFsbC5sb2NhbCBwa2ctcHJlcmVtb3ZlLmxvY2FsCisJcGtnLXBvc3RyZW1vdmUubG9jYWwgcGtnLXJlcXVlc3QubG9jYWwKKzQuIFJ1biAibWFrZSBwYWNrYWdlIgorCitJZiBhbGwgZ29lcyB3ZWxsIHlvdSBzaG91bGQgaGF2ZSBhIHNvbGFyaXMgcGFja2FnZSByZWFkeSB0byBiZSBpbnN0YWxsZWQuCisKK0lmIHlvdSBoYXZlIGFueSBwcm9ibGVtcyB3aXRoIHRoaXMgc2NyaXB0IHBsZWFzZSBwb3N0IHRoZW0gdG8KK29wZW5zc2gtdW5peC1kZXZAbWluZHJvdC5vcmcgYW5kIEkgd2lsbCB0cnkgdG8gYXNzaXN0IHlvdSBhcyBiZXN0IGFzIEkgY2FuLgorCistIEJlbiBMaW5kc3Ryb20KKwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jb250cmliL3NzaC1jb3B5LWlkIGIvb3BlbnNzaC02LjBwMS9jb250cmliL3NzaC1jb3B5LWlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NTFhY2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvc3NoLWNvcHktaWQKQEAgLTAsMCArMSw1NCBAQAorIyEvYmluL3NoCisKKyMgU2hlbGwgc2NyaXB0IHRvIGluc3RhbGwgeW91ciBwdWJsaWMga2V5IG9uIGEgcmVtb3RlIG1hY2hpbmUKKyMgVGFrZXMgdGhlIHJlbW90ZSBtYWNoaW5lIG5hbWUgYXMgYW4gYXJndW1lbnQuCisjIE9idmlvdXNseSwgdGhlIHJlbW90ZSBtYWNoaW5lIG11c3QgYWNjZXB0IHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uLAorIyBvciBvbmUgb2YgdGhlIG90aGVyIGtleXMgaW4geW91ciBzc2gtYWdlbnQsIGZvciB0aGlzIHRvIHdvcmsuCisKK0lEX0ZJTEU9IiR7SE9NRX0vLnNzaC9pZF9yc2EucHViIgorCitpZiBbICItaSIgPSAiJDEiIF07IHRoZW4KKyAgc2hpZnQKKyAgIyBjaGVjayBpZiB3ZSBoYXZlIDIgcGFyYW1ldGVycyBsZWZ0LCBpZiBzbyB0aGUgZmlyc3QgaXMgdGhlIG5ldyBJRCBmaWxlCisgIGlmIFsgLW4gIiQyIiBdOyB0aGVuCisgICAgaWYgZXhwciAiJDEiIDogIi4qXC5wdWIiID4gL2Rldi9udWxsIDsgdGhlbgorICAgICAgSURfRklMRT0iJDEiCisgICAgZWxzZQorICAgICAgSURfRklMRT0iJDEucHViIgorICAgIGZpCisgICAgc2hpZnQgICAgICAgICAjIGFuZCB0aGlzIHNob3VsZCBsZWF2ZSAkMSBhcyB0aGUgdGFyZ2V0IG5hbWUKKyAgZmkKK2Vsc2UKKyAgaWYgWyB4JFNTSF9BVVRIX1NPQ0sgIT0geCBdICYmIHNzaC1hZGQgLUwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgR0VUX0lEPSIkR0VUX0lEIHNzaC1hZGQgLUwiCisgIGZpCitmaQorCitpZiBbIC16ICJgZXZhbCAkR0VUX0lEYCIgXSAmJiBbIC1yICIke0lEX0ZJTEV9IiBdIDsgdGhlbgorICBHRVRfSUQ9ImNhdCBcIiR7SURfRklMRX1cIiIKK2ZpCisKK2lmIFsgLXogImBldmFsICRHRVRfSURgIiBdOyB0aGVuCisgIGVjaG8gIiQwOiBFUlJPUjogTm8gaWRlbnRpdGllcyBmb3VuZCIgPiYyCisgIGV4aXQgMQorZmkKKworaWYgWyAiJCMiIC1sdCAxIF0gfHwgWyAiJDEiID0gIi1oIiBdIHx8IFsgIiQxIiA9ICItLWhlbHAiIF07IHRoZW4KKyAgZWNobyAiVXNhZ2U6ICQwIFstaSBbaWRlbnRpdHlfZmlsZV1dIFt1c2VyQF1tYWNoaW5lIiA+JjIKKyAgZXhpdCAxCitmaQorCisjIHN0cmlwIGFueSB0cmFpbGluZyBjb2xvbgoraG9zdD1gZWNobyAkMSB8IHNlZCAncy86JC8vJ2AKKworeyBldmFsICIkR0VUX0lEIiA7IH0gfCBzc2ggJGhvc3QgInVtYXNrIDA3NzsgdGVzdCAtZCB+Ly5zc2ggfHwgbWtkaXIgfi8uc3NoIDsgY2F0ID4+IH4vLnNzaC9hdXRob3JpemVkX2tleXMiIHx8IGV4aXQgMQorCitjYXQgPDxFT0YKK05vdyB0cnkgbG9nZ2luZyBpbnRvIHRoZSBtYWNoaW5lLCB3aXRoICJzc2ggJyRob3N0JyIsIGFuZCBjaGVjayBpbjoKKworICB+Ly5zc2gvYXV0aG9yaXplZF9rZXlzCisKK3RvIG1ha2Ugc3VyZSB3ZSBoYXZlbid0IGFkZGVkIGV4dHJhIGtleXMgdGhhdCB5b3Ugd2VyZW4ndCBleHBlY3RpbmcuCisKK0VPRgorCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvc3NoLWNvcHktaWQuMSBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9zc2gtY29weS1pZC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMTVhYjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvc3NoLWNvcHktaWQuMQpAQCAtMCwwICsxLDc1IEBACisuaWcgXCIgIC0qLSBucm9mZiAtKi0KK0NvcHlyaWdodCAoYykgMTk5OSBQaGlsaXAgSGFuZHMgQ29tcHV0aW5nIDxodHRwOi8vd3d3LmhhbmRzLmNvbS8+CisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgordGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKK2FyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcworbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQorZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKK3Blcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKK21hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAordmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCit0cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCit0aGUgb3JpZ2luYWwgRW5nbGlzaC4KKy4uCisuVEggU1NILUNPUFktSUQgMSAiMTQgTm92ZW1iZXIgMTk5OSIgIk9wZW5TU0giCisuU0ggTkFNRQorc3NoLWNvcHktaWQgXC0gaW5zdGFsbCB5b3VyIHB1YmxpYyBrZXkgaW4gYSByZW1vdGUgbWFjaGluZSdzIGF1dGhvcml6ZWRfa2V5cworLlNIIFNZTk9QU0lTCisuQiBzc2gtY29weS1pZCBbLWkgW2lkZW50aXR5X2ZpbGVdXQorLkkgIlt1c2VyQF1tYWNoaW5lIgorLmJyCisuU0ggREVTQ1JJUFRJT04KKy5CUiBzc2gtY29weS1pZAoraXMgYSBzY3JpcHQgdGhhdCB1c2VzIHNzaCB0byBsb2cgaW50byBhIHJlbW90ZSBtYWNoaW5lIGFuZAorYXBwZW5kIHRoZSBpbmRpY2F0ZWQgaWRlbnRpdHkgZmlsZSB0byB0aGF0IG1hY2hpbmUncworLkIgfi8uc3NoL2F1dGhvcml6ZWRfa2V5cworZmlsZS4KKy5QUAorSWYgdGhlCisuQiAtaQorb3B0aW9uIGlzIGdpdmVuIHRoZW4gdGhlIGlkZW50aXR5IGZpbGUgKGRlZmF1bHRzIHRvCisuQlIgfi8uc3NoL2lkX3JzYS5wdWIgKQoraXMgdXNlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkga2V5cyBpbiB5b3VyCisuQlIgc3NoLWFnZW50IC4KK090aGVyd2lzZSwgaWYgdGhpczoKKy5QUAorLkIgIiAgICAgIHNzaC1hZGQgLUwiCisuUFAKK3Byb3ZpZGVzIGFueSBvdXRwdXQsIGl0IHVzZXMgdGhhdCBpbiBwcmVmZXJlbmNlIHRvIHRoZSBpZGVudGl0eSBmaWxlLgorLlBQCitJZiB0aGUKKy5CIC1pCitvcHRpb24gaXMgdXNlZCwgb3IgdGhlCisuQiBzc2gtYWRkCitwcm9kdWNlZCBubyBvdXRwdXQsIHRoZW4gaXQgdXNlcyB0aGUgY29udGVudHMgb2YgdGhlIGlkZW50aXR5CitmaWxlLiAgT25jZSBpdCBoYXMgb25lIG9yIG1vcmUgZmluZ2VycHJpbnRzIChieSB3aGF0ZXZlciBtZWFucykgaXQKK3VzZXMgc3NoIHRvIGFwcGVuZCB0aGVtIHRvCisuQiB+Ly5zc2gvYXV0aG9yaXplZF9rZXlzCitvbiB0aGUgcmVtb3RlIG1hY2hpbmUgKGNyZWF0aW5nIHRoZSBmaWxlLCBhbmQgZGlyZWN0b3J5LCBpZiBuZWNlc3NhcnkuKQorCisuU0ggTk9URVMKK1RoaXMgcHJvZ3JhbSBkb2VzIG5vdCBtb2RpZnkgdGhlIHBlcm1pc3Npb25zIG9mIGFueQorcHJlLWV4aXN0aW5nIGZpbGVzIG9yIGRpcmVjdG9yaWVzLiBUaGVyZWZvcmUsIGlmIHRoZSByZW1vdGUKKy5CIHNzaGQKK2hhcworLkIgU3RyaWN0TW9kZXMKK3NldCBpbiBpdHMKK2NvbmZpZ3VyYXRpb24sIHRoZW4gdGhlIHVzZXIncyBob21lLAorLkIgfi8uc3NoCitmb2xkZXIsIGFuZAorLkIgfi8uc3NoL2F1dGhvcml6ZWRfa2V5cworZmlsZSBtYXkgbmVlZCB0byBoYXZlIGdyb3VwIHdyaXRhYmlsaXR5IGRpc2FibGVkIG1hbnVhbGx5LCBlLmcuIHZpYQorCisuQiAiICAgICAgY2htb2QgZ28tdyB+IH4vLnNzaCB+Ly5zc2gvYXV0aG9yaXplZF9rZXlzIgorCitvbiB0aGUgcmVtb3RlIG1hY2hpbmUuCisKKy5TSCAiU0VFIEFMU08iCisuQlIgc3NoICgxKSwKKy5CUiBzc2gtYWdlbnQgKDEpLAorLkJSIHNzaGQgKDgpCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvc3NoZC5wYW0uZnJlZWJzZCBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9zc2hkLnBhbS5mcmVlYnNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYmMzNjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvc3NoZC5wYW0uZnJlZWJzZApAQCAtMCwwICsxLDUgQEAKK3NzaGQgICAgYXV0aCAgICAgIHJlcXVpcmVkICBwYW1fdW5peC5zbyAgICB0cnlfZmlyc3RfcGFzcworc3NoZCAgICBhY2NvdW50ICAgcmVxdWlyZWQgIHBhbV91bml4LnNvCitzc2hkICAgIHBhc3N3b3JkICByZXF1aXJlZCAgcGFtX3Blcm1pdC5zbworc3NoZCAgICBzZXNzaW9uICAgcmVxdWlyZWQgIHBhbV9wZXJtaXQuc28KKwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jb250cmliL3NzaGQucGFtLmdlbmVyaWMgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvc3NoZC5wYW0uZ2VuZXJpYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTVmMGZlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9jb250cmliL3NzaGQucGFtLmdlbmVyaWMKQEAgLTAsMCArMSw4IEBACisjJVBBTS0xLjAKK2F1dGggICAgICAgcmVxdWlyZWQgICAgIC9saWIvc2VjdXJpdHkvcGFtX3VuaXguc28gc2hhZG93IG5vZGVsYXkKK2FjY291bnQgICAgcmVxdWlyZWQgICAgIC9saWIvc2VjdXJpdHkvcGFtX25vbG9naW4uc28KK2FjY291bnQgICAgcmVxdWlyZWQgICAgIC9saWIvc2VjdXJpdHkvcGFtX3VuaXguc28KK3Bhc3N3b3JkICAgcmVxdWlyZWQgICAgIC9saWIvc2VjdXJpdHkvcGFtX2NyYWNrbGliLnNvCitwYXNzd29yZCAgIHJlcXVpcmVkICAgICAvbGliL3NlY3VyaXR5L3BhbV91bml4LnNvIHNoYWRvdyBudWxsb2sgdXNlX2F1dGh0b2sKK3Nlc3Npb24gICAgcmVxdWlyZWQgICAgIC9saWIvc2VjdXJpdHkvcGFtX3VuaXguc28KK3Nlc3Npb24gICAgcmVxdWlyZWQgICAgIC9saWIvc2VjdXJpdHkvcGFtX2xpbWl0cy5zbwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jb250cmliL3N1c2Uvb3BlbnNzaC5zcGVjIGIvb3BlbnNzaC02LjBwMS9jb250cmliL3N1c2Uvb3BlbnNzaC5zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkOTlmYjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2NvbnRyaWIvc3VzZS9vcGVuc3NoLnNwZWMKQEAgLTAsMCArMSwyNDYgQEAKKyMgRGVmYXVsdCB2YWx1ZXMgZm9yIGFkZGl0aW9uYWwgY29tcG9uZW50cworJWRlZmluZSBidWlsZF94MTFfYXNrcGFzcwkxCisKKyMgRGVmaW5lIHRoZSBVSUQvR0lEIHRvIHVzZSBmb3IgcHJpdmlsZWdlIHNlcGFyYXRpb24KKyVkZWZpbmUgc3NoZF9naWQJNjUKKyVkZWZpbmUgc3NoZF91aWQJNzEKKworIyBUaGUgdmVyc2lvbiBvZiB4MTEtc3NoLWFza3Bhc3MgdG8gdXNlCislZGVmaW5lIHh2ZXJzaW9uCTEuMi40LjEKKworIyBBbGxvdyB0aGUgYWJpbGl0eSB0byBvdmVycmlkZSBkZWZhdWx0cyB3aXRoIC1EIHNraXBfeHh4PTEKKyV7P3NraXBfeDExX2Fza3Bhc3M6JWRlZmluZSBidWlsZF94MTFfYXNrcGFzcyAwfQorCitTdW1tYXJ5OglPcGVuU1NILCBhIGZyZWUgU2VjdXJlIFNoZWxsIChTU0gpIHByb3RvY29sIGltcGxlbWVudGF0aW9uCitOYW1lOgkJb3BlbnNzaAorVmVyc2lvbjoJNi4wcDEKK1VSTDoJCWh0dHA6Ly93d3cub3BlbnNzaC5jb20vCitSZWxlYXNlOgkxCitTb3VyY2UwOglvcGVuc3NoLSV7dmVyc2lvbn0udGFyLmd6CitTb3VyY2UxOgl4MTEtc3NoLWFza3Bhc3MtJXt4dmVyc2lvbn0udGFyLmd6CitMaWNlbnNlOglCU0QKK0dyb3VwOgkJUHJvZHVjdGl2aXR5L05ldHdvcmtpbmcvU1NICitCdWlsZFJvb3Q6CSV7X3RtcHBhdGh9L29wZW5zc2gtJXt2ZXJzaW9ufS1idWlsZHJvb3QKK1ByZVJlcToJCW9wZW5zc2wKK09ic29sZXRlczoJc3NoCitQcm92aWRlczoJc3NoCisjCisjIChCdWlsZFtpbmddIFByZXJlcVt1aXNpdGVzXSBvbmx5IHdvcmsgZm9yIFJQTSAyLjk1IGFuZCBuZXdlci4pCisjIGJ1aWxkaW5nIHByZXJlcXVpc2l0ZXMgLS0gc3R1ZmYgZm9yCisjICAgT3BlblNTTCAob3BlbnNzbC1kZXZlbCksCisjICAgVENQIFdyYXBwZXJzICh0Y3BkLWRldmVsKSwKKyMgICBhbmQgR25vbWUgKGdsaWJkZXYsIGd0a2RldiwgYW5kIGdubGlic2QpCisjCitCdWlsZFByZXJlcToJb3BlbnNzbAorQnVpbGRQcmVyZXE6CXRjcGQtZGV2ZWwKK0J1aWxkUHJlcmVxOgl6bGliLWRldmVsCisjQnVpbGRQcmVyZXE6CWdsaWJkZXYKKyNCdWlsZFByZXJlcToJZ3RrZGV2CisjQnVpbGRQcmVyZXE6CWdubGlic2QKKworJXBhY2thZ2UJYXNrcGFzcworU3VtbWFyeToJQSBwYXNzcGhyYXNlIGRpYWxvZyBmb3IgT3BlblNTSCBhbmQgdGhlIFggd2luZG93IFN5c3RlbS4KK0dyb3VwOgkJUHJvZHVjdGl2aXR5L05ldHdvcmtpbmcvU1NICitSZXF1aXJlczoJb3BlbnNzaCA9ICV7dmVyc2lvbn0KK09ic29sZXRlczoJc3NoLWV4dHJhcworUHJvdmlkZXM6CW9wZW5zc2g6JHtfbGliZGlyfS9zc2gvc3NoLWFza3Bhc3MKKworJWlmICV7YnVpbGRfeDExX2Fza3Bhc3N9CitCdWlsZFByZXJlcToJWEZyZWU4Ni1kZXZlbAorJWVuZGlmCisKKyVkZXNjcmlwdGlvbgorU3NoIChTZWN1cmUgU2hlbGwpIGlzIGEgcHJvZ3JhbSBmb3IgbG9nZ2luZyBpbnRvIGEgcmVtb3RlIG1hY2hpbmUgYW5kIGZvcgorZXhlY3V0aW5nIGNvbW1hbmRzIGluIGEgcmVtb3RlIG1hY2hpbmUuICBJdCBpcyBpbnRlbmRlZCB0byByZXBsYWNlCitybG9naW4gYW5kIHJzaCwgYW5kIHByb3ZpZGUgc2VjdXJlIGVuY3J5cHRlZCBjb21tdW5pY2F0aW9ucyBiZXR3ZWVuCit0d28gdW50cnVzdGVkIGhvc3RzIG92ZXIgYW4gaW5zZWN1cmUgbmV0d29yay4gIFgxMSBjb25uZWN0aW9ucyBhbmQKK2FyYml0cmFyeSBUQ1AvSVAgcG9ydHMgY2FuIGFsc28gYmUgZm9yd2FyZGVkIG92ZXIgdGhlIHNlY3VyZSBjaGFubmVsLgorCitPcGVuU1NIIGlzIE9wZW5CU0QncyByZXdvcmsgb2YgdGhlIGxhc3QgZnJlZSB2ZXJzaW9uIG9mIFNTSCwgYnJpbmdpbmcgaXQKK3VwIHRvIGRhdGUgaW4gdGVybXMgb2Ygc2VjdXJpdHkgYW5kIGZlYXR1cmVzLCBhcyB3ZWxsIGFzIHJlbW92aW5nIGFsbAorcGF0ZW50ZWQgYWxnb3JpdGhtcyB0byBzZXBlcmF0ZSBsaWJyYXJpZXMgKE9wZW5TU0wpLgorCitUaGlzIHBhY2thZ2UgaW5jbHVkZXMgYWxsIGZpbGVzIG5lY2Vzc2FyeSBmb3IgYm90aCB0aGUgT3BlblNTSAorY2xpZW50IGFuZCBzZXJ2ZXIuCisKKyVkZXNjcmlwdGlvbiBhc2twYXNzCitTc2ggKFNlY3VyZSBTaGVsbCkgaXMgYSBwcm9ncmFtIGZvciBsb2dnaW5nIGludG8gYSByZW1vdGUgbWFjaGluZSBhbmQgZm9yCitleGVjdXRpbmcgY29tbWFuZHMgaW4gYSByZW1vdGUgbWFjaGluZS4gIEl0IGlzIGludGVuZGVkIHRvIHJlcGxhY2UKK3Jsb2dpbiBhbmQgcnNoLCBhbmQgcHJvdmlkZSBzZWN1cmUgZW5jcnlwdGVkIGNvbW11bmljYXRpb25zIGJldHdlZW4KK3R3byB1bnRydXN0ZWQgaG9zdHMgb3ZlciBhbiBpbnNlY3VyZSBuZXR3b3JrLiAgWDExIGNvbm5lY3Rpb25zIGFuZAorYXJiaXRyYXJ5IFRDUC9JUCBwb3J0cyBjYW4gYWxzbyBiZSBmb3J3YXJkZWQgb3ZlciB0aGUgc2VjdXJlIGNoYW5uZWwuCisKK09wZW5TU0ggaXMgT3BlbkJTRCdzIHJld29yayBvZiB0aGUgbGFzdCBmcmVlIHZlcnNpb24gb2YgU1NILCBicmluZ2luZyBpdAordXAgdG8gZGF0ZSBpbiB0ZXJtcyBvZiBzZWN1cml0eSBhbmQgZmVhdHVyZXMsIGFzIHdlbGwgYXMgcmVtb3ZpbmcgYWxsCitwYXRlbnRlZCBhbGdvcml0aG1zIHRvIHNlcGVyYXRlIGxpYnJhcmllcyAoT3BlblNTTCkuCisKK1RoaXMgcGFja2FnZSBjb250YWlucyBhbiBYIFdpbmRvdyBTeXN0ZW0gcGFzc3BocmFzZSBkaWFsb2cgZm9yIE9wZW5TU0guCisKKyVjaGFuZ2Vsb2cKKyogV2VkIE9jdCAyNiAyMDA1IElhaW4gTW9yZ2FuIDxpbW9yZ2FuQG5hcy5uYXNhLmdvdj4KKy0gUmVtb3ZlZCBhY2NpZGVudGFsIGluY2x1c2lvbiBvZiAtLXdpdGhvdXQtemxpYi12ZXJzaW9uLWNoZWNrCisqIFR1ZSBPY3QgMjUgMjAwNSBJYWluIE1vcmdhbiA8aW1vcmdhbkBuYXMubmFzYS5nb3Y+CistIE92ZXJoYXVsIHRvIGRlYWwgd2l0aCBuZXdlciB2ZXJzaW9ucyBvZiBTdVNFIGFuZCBPcGVuU1NICisqIE1vbiBKdW4gMTIgMjAwMCBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+CistIEdsb2IgbWFucGFnZXMgdG8gY2F0Y2ggY29tcHJlc3NlZCBmaWxlcworKiBXZWQgTWFyIDE1IDIwMDAgRGFtaWVuIE1pbGxlciA8ZGptQGlicy5jb20uYXU+CistIFVwZGF0ZWQgZm9yIG5ldyBsb2NhdGlvbgorLSBVcGRhdGVkIGZvciBuZXcgZ25vbWUtc3NoLWFza3Bhc3MgYnVpbGQKKyogU3VuIERlYyAyNiAxOTk5IENocmlzIFNhaWEgPGNzYWlhQHd0b3dlci5jb20+CistIE1hZGUgc3ltbGluayB0byBnbm9tZS1zc2gtYXNrcGFzcyBjYWxsZWQgc3NoLWFza3Bhc3MKKyogV2VkIE5vdiAyNCAxOTk5IENocmlzIFNhaWEgPGNzYWlhQHd0b3dlci5jb20+CistIFJlbW92ZWQgcGF0Y2hlcyB0aGF0IGluY2x1ZGVkIC9ldGMvcGFtLmQvc3NoZCwgL3NiaW4vaW5pdC5kL3JjLnNzaGQsIGFuZAorICAvdmFyL2FkbS9maWxsdXAtdGVtcGxhdGVzL3JjLmNvbmZpZy5zc2hkLCBzaW5jZSBEYW1pZW4gbWVyZ2VkIHRoZXNlIGludG8KKyAgaGlzIHJlbGVhc2VkIHRhcmZpbGUKKy0gQ2hhbmdlZCBwZXJtaXNzaW9ucyBvbiBzc2hfY29uZmlnIGluIHRoZSBpbnN0YWxsIHByb2NlZHVyZSB0byA2NDQgZnJvbSA2MDAKKyAgZXZlbiB0aG91Z2ggaXQgd2FzIGNvcnJlY3QgaW4gdGhlICVmaWxlcyBzZWN0aW9uIGFuZCB0aHVzIHJpZ2h0IGluIHRoZSBSUE1zCistIFBvc3RpbnN0YWxsIHNjcmlwdCBmb3IgdGhlIHNlcnZlciBub3cgb25seSBwcmludHMgIkdlbmVyYXRpbmcgU1NIIGhvc3QKKyAga2V5Li4uIiBpZiB3ZSBuZWVkIHRvIGFjdHVhbGx5IGRvIHRoaXMsIGluIG9yZGVyIHRvIGVsaW1pbmF0ZSBhIGNvbmZ1c2luZworICBtZXNzYWdlIGlmIGFuIFNTSCBob3N0IGtleSBpcyBhbHJlYWR5IGluIHBsYWNlCistIE1hcmtlZCBhbGwgbWFudWFsIHBhZ2VzIGFzICVkb2ModW1lbnRhdGlvbikKKyogTW9uIE5vdiAyMiAxOTk5IENocmlzIFNhaWEgPGNzYWlhQHd0b3dlci5jb20+CistIEFkZGVkIGZsYWcgdG8gY29uZmlndXJlIGRhZW1vbiB3aXRoIFRDUCBXcmFwcGVycyBzdXBwb3J0CistIEFkZGVkIGJ1aWxkaW5nIHByZXJlcXVpc2l0ZXMgKHdvcmtzIGluIFJQTSAzLjAgYW5kIG5ld2VyKQorKiBUaHUgTm92IDE4IDE5OTkgQ2hyaXMgU2FpYSA8Y3NhaWFAd3Rvd2VyLmNvbT4KKy0gTWFkZSB0aGlzIHBhY2thZ2UgY29ycmVjdCBmb3IgU3VTRS4KKy0gQ2hhbmdlZCBpbnN0YW5jZXMgb2YgcGFtX3B3ZGIuc28gdG8gcGFtX3VuaXguc28sIHNpbmNlIGl0IHdvcmtzIG1vcmUgcHJvcGVybHkKKyAgd2l0aCBTdVNFLCBhbmQgbGliX3B3ZGIuc28gaXNuJ3QgaW5zdGFsbGVkIGJ5IGRlZmF1bHQuCisqIE1vbiBOb3YgMTUgMTk5OSBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+CistIFNwbGl0IHN1YnBhY2thZ2VzIGZ1cnRoZXIgYmFzZWQgb24gcGF0Y2ggZnJvbSBqaW0ga25vYmxlIDxqbWtub2JsZUBwb2JveC5jb20+CisqIFNhdCBOb3YgMTMgMTk5OSBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+CistIEFkZGVkICdPYnNvbGV0ZXMnIGRpcmVjdGl2ZXMKKyogVHVlIE5vdiAwOSAxOTk5IERhbWllbiBNaWxsZXIgPGRqbUBpYnMuY29tLmF1PgorLSBVc2UgbWFrZSBpbnN0YWxsCistIFN1YnBhY2thZ2VzCisqIE1vbiBOb3YgMDggMTk5OSBEYW1pZW4gTWlsbGVyIDxkam1AaWJzLmNvbS5hdT4KKy0gQWRkZWQgbGlua3MgZm9yIHNsb2dpbgorLSBGaXhlZCBwZXJtcyBvbiBtYW5wYWdlcworKiBTYXQgT2N0IDMwIDE5OTkgRGFtaWVuIE1pbGxlciA8ZGptQGlicy5jb20uYXU+CistIFJlbmFtZWQgaW5pdCBzY3JpcHQKKyogRnJpIE9jdCAyOSAxOTk5IERhbWllbiBNaWxsZXIgPGRqbUBpYnMuY29tLmF1PgorLSBCYWNrIHRvIG9sZCBiaW5hcnkgbmFtZXMKKyogVGh1IE9jdCAyOCAxOTk5IERhbWllbiBNaWxsZXIgPGRqbUBpYnMuY29tLmF1PgorLSBVc2UgYXV0b2NvbmYKKy0gTmV3IGJpbmFyeSBuYW1lcworKiBXZWQgT2N0IDI3IDE5OTkgRGFtaWVuIE1pbGxlciA8ZGptQGlicy5jb20uYXU+CistIEluaXRpYWwgUlBNaWZpY2F0aW9uLCBiYXNlZCBvbiBKYW4gIlllbnlhIiBLYXNwcnphaydzIDxrYXNAZmkubXVuaS5jej4gc3BlYy4KKworJXByZXAKKworJWlmICV7YnVpbGRfeDExX2Fza3Bhc3N9Cislc2V0dXAgLXEgLWEgMQorJWVsc2UKKyVzZXR1cCAtcQorJWVuZGlmCisKKyVidWlsZAorQ0ZMQUdTPSIkUlBNX09QVF9GTEFHUyIgXAorJWNvbmZpZ3VyZQktLXByZWZpeD0vdXNyIFwKKwkJLS1zeXNjb25mZGlyPSV7X3N5c2NvbmZkaXJ9L3NzaCBcCisJCS0tbWFuZGlyPSV7X21hbmRpcn0gXAorCQktLXdpdGgtcHJpdnNlcC1wYXRoPS92YXIvbGliL2VtcHR5IFwKKwkJLS13aXRoLXBhbSBcCisJCS0td2l0aC10Y3Atd3JhcHBlcnMgXAorCQktLWxpYmV4ZWNkaXI9JXtfbGliZGlyfS9zc2gKK21ha2UKKworJWlmICV7YnVpbGRfeDExX2Fza3Bhc3N9CitjZCB4MTEtc3NoLWFza3Bhc3MtJXt4dmVyc2lvbn0KKyVjb25maWd1cmUJLS1tYW5kaXI9L3Vzci9YMTFSNi9tYW4gXAorCQktLWxpYmV4ZWNkaXI9JXtfbGliZGlyfS9zc2gKK3hta21mIC1hCittYWtlCitjZCAuLgorJWVuZGlmCisKKyVpbnN0YWxsCitybSAtcmYgJFJQTV9CVUlMRF9ST09UCittYWtlIGluc3RhbGwgREVTVERJUj0kUlBNX0JVSUxEX1JPT1QvCitpbnN0YWxsIC1kICRSUE1fQlVJTERfUk9PVC9ldGMvcGFtLmQvCitpbnN0YWxsIC1kICRSUE1fQlVJTERfUk9PVC9ldGMvaW5pdC5kLworaW5zdGFsbCAtZCAkUlBNX0JVSUxEX1JPT1QvdmFyL2FkbS9maWxsdXAtdGVtcGxhdGVzCitpbnN0YWxsIC1tNjQ0IGNvbnRyaWIvc3NoZC5wYW0uZ2VuZXJpYyAkUlBNX0JVSUxEX1JPT1QvZXRjL3BhbS5kL3NzaGQKK2luc3RhbGwgLW03NDQgY29udHJpYi9zdXNlL3JjLnNzaGQgJFJQTV9CVUlMRF9ST09UL2V0Yy9pbml0LmQvc3NoZAoraW5zdGFsbCAtbTc0NCBjb250cmliL3N1c2Uvc3lzY29uZmlnLnNzaCBcCisgICAkUlBNX0JVSUxEX1JPT1QvdmFyL2FkbS9maWxsdXAtdGVtcGxhdGVzCisKKyVpZiAle2J1aWxkX3gxMV9hc2twYXNzfQorY2QgeDExLXNzaC1hc2twYXNzLSV7eHZlcnNpb259CittYWtlIGluc3RhbGwgaW5zdGFsbC5tYW4gQklORElSPSV7X2xpYmRpcn0vc3NoIERFU1RESVI9JFJQTV9CVUlMRF9ST09ULworcm0gLWYgJFJQTV9CVUlMRF9ST09UL3Vzci9zaGFyZS9Tc2guYmluCislZW5kaWYKKworJWNsZWFuCitybSAtcmYgJFJQTV9CVUlMRF9ST09UCisKKyVwcmUKKy91c3Ivc2Jpbi9ncm91cGFkZCAtZyAle3NzaGRfZ2lkfSAtbyAtciBzc2hkIDI+IC9kZXYvbnVsbCB8fCA6CisvdXNyL3NiaW4vdXNlcmFkZCAtciAtbyAtZyBzc2hkIC11ICV7c3NoZF91aWR9IC1zIC9iaW4vZmFsc2UgLWMgIlNTSCBQcml2aWxlZ2UgU2VwYXJhdGlvbiBVc2VyIiAtZCAvdmFyL2xpYi9zc2hkIHNzaGQgMj4gL2Rldi9udWxsIHx8IDoKKworJXBvc3QKKy91c3IvYmluL3NzaC1rZXlnZW4gLUEKKyV7ZmlsbHVwX2FuZF9pbnNzZXJ2IC1uIC15IHNzaCBzc2hkfQorJXJ1bl9wZXJtaXNzaW9ucworCisldmVyaWZ5c2NyaXB0CisldmVyaWZ5X3Blcm1pc3Npb25zIC1lIC9ldGMvc3NoL3NzaGRfY29uZmlnIC1lIC9ldGMvc3NoL3NzaF9jb25maWcgLWUgL3Vzci9iaW4vc3NoCisKKyVwcmV1bgorJXN0b3Bfb25fcmVtb3ZhbCBzc2hkCisKKyVwb3N0dW4KKyVyZXN0YXJ0X29uX3VwZGF0ZSBzc2hkCisle2luc3NlcnZfY2xlYW51cH0KKworJWZpbGVzCislZGVmYXR0cigtLHJvb3Qscm9vdCkKKyVkb2MgQ2hhbmdlTG9nIE9WRVJWSUVXIFJFQURNRSogUFJPVE9DT0wqCislZG9jIFRPRE8gQ1JFRElUUyBMSUNFTkNFCislYXR0cigwNzU1LHJvb3Qscm9vdCkgJWRpciAle19zeXNjb25mZGlyfS9zc2gKKyVhdHRyKDA2NDQscm9vdCxyb290KSAlY29uZmlnKG5vcmVwbGFjZSkgJXtfc3lzY29uZmRpcn0vc3NoL3NzaF9jb25maWcKKyVhdHRyKDA2MDAscm9vdCxyb290KSAlY29uZmlnKG5vcmVwbGFjZSkgJXtfc3lzY29uZmRpcn0vc3NoL3NzaGRfY29uZmlnCislYXR0cigwNjAwLHJvb3Qscm9vdCkgJWNvbmZpZyhub3JlcGxhY2UpICV7X3N5c2NvbmZkaXJ9L3NzaC9tb2R1bGkKKyVhdHRyKDA2NDQscm9vdCxyb290KSAlY29uZmlnKG5vcmVwbGFjZSkgL2V0Yy9wYW0uZC9zc2hkCislYXR0cigwNzU1LHJvb3Qscm9vdCkgJWNvbmZpZyAvZXRjL2luaXQuZC9zc2hkCislYXR0cigwNzU1LHJvb3Qscm9vdCkgJXtfYmluZGlyfS9zc2gta2V5Z2VuCislYXR0cigwNzU1LHJvb3Qscm9vdCkgJXtfYmluZGlyfS9zY3AKKyVhdHRyKDA3NTUscm9vdCxyb290KSAle19iaW5kaXJ9L3NzaAorJWF0dHIoLSxyb290LHJvb3QpICV7X2JpbmRpcn0vc2xvZ2luCislYXR0cigwNzU1LHJvb3Qscm9vdCkgJXtfYmluZGlyfS9zc2gtYWdlbnQKKyVhdHRyKDA3NTUscm9vdCxyb290KSAle19iaW5kaXJ9L3NzaC1hZGQKKyVhdHRyKDA3NTUscm9vdCxyb290KSAle19iaW5kaXJ9L3NzaC1rZXlzY2FuCislYXR0cigwNzU1LHJvb3Qscm9vdCkgJXtfYmluZGlyfS9zZnRwCislYXR0cigwNzU1LHJvb3Qscm9vdCkgJXtfc2JpbmRpcn0vc3NoZAorJWF0dHIoMDc1NSxyb290LHJvb3QpICVkaXIgJXtfbGliZGlyfS9zc2gKKyVhdHRyKDA3NTUscm9vdCxyb290KSAle19saWJkaXJ9L3NzaC9zZnRwLXNlcnZlcgorJWF0dHIoNDcxMSxyb290LHJvb3QpICV7X2xpYmRpcn0vc3NoL3NzaC1rZXlzaWduCislYXR0cigwNzU1LHJvb3Qscm9vdCkgJXtfbGliZGlyfS9zc2gvc3NoLXBrY3MxMS1oZWxwZXIKKyVhdHRyKDA2NDQscm9vdCxyb290KSAlZG9jICV7X21hbmRpcn0vbWFuMS9zY3AuMSoKKyVhdHRyKDA2NDQscm9vdCxyb290KSAlZG9jICV7X21hbmRpcn0vbWFuMS9zZnRwLjEqCislYXR0cigtLHJvb3Qscm9vdCkgJWRvYyAle19tYW5kaXJ9L21hbjEvc2xvZ2luLjEqCislYXR0cigwNjQ0LHJvb3Qscm9vdCkgJWRvYyAle19tYW5kaXJ9L21hbjEvc3NoLjEqCislYXR0cigwNjQ0LHJvb3Qscm9vdCkgJWRvYyAle19tYW5kaXJ9L21hbjEvc3NoLWFkZC4xKgorJWF0dHIoMDY0NCxyb290LHJvb3QpICVkb2MgJXtfbWFuZGlyfS9tYW4xL3NzaC1hZ2VudC4xKgorJWF0dHIoMDY0NCxyb290LHJvb3QpICVkb2MgJXtfbWFuZGlyfS9tYW4xL3NzaC1rZXlnZW4uMSoKKyVhdHRyKDA2NDQscm9vdCxyb290KSAlZG9jICV7X21hbmRpcn0vbWFuMS9zc2gta2V5c2Nhbi4xKgorJWF0dHIoMDY0NCxyb290LHJvb3QpICVkb2MgJXtfbWFuZGlyfS9tYW41L21vZHVsaS41KgorJWF0dHIoMDY0NCxyb290LHJvb3QpICVkb2MgJXtfbWFuZGlyfS9tYW41L3NzaF9jb25maWcuNSoKKyVhdHRyKDA2NDQscm9vdCxyb290KSAlZG9jICV7X21hbmRpcn0vbWFuNS9zc2hkX2NvbmZpZy41KgorJWF0dHIoMDY0NCxyb290LHJvb3QpICVkb2MgJXtfbWFuZGlyfS9tYW44L3NmdHAtc2VydmVyLjgqCislYXR0cigwNjQ0LHJvb3Qscm9vdCkgJWRvYyAle19tYW5kaXJ9L21hbjgvc3NoLWtleXNpZ24uOCoKKyVhdHRyKDA2NDQscm9vdCxyb290KSAlZG9jICV7X21hbmRpcn0vbWFuOC9zc2gtcGtjczExLWhlbHBlci44KgorJWF0dHIoMDY0NCxyb290LHJvb3QpICVkb2MgJXtfbWFuZGlyfS9tYW44L3NzaGQuOCoKKyVhdHRyKDA2NDQscm9vdCxyb290KSAvdmFyL2FkbS9maWxsdXAtdGVtcGxhdGVzL3N5c2NvbmZpZy5zc2gKKworJWlmICV7YnVpbGRfeDExX2Fza3Bhc3N9CislZmlsZXMgYXNrcGFzcworJWRlZmF0dHIoLSxyb290LHJvb3QpCislZG9jIHgxMS1zc2gtYXNrcGFzcy0le3h2ZXJzaW9ufS9SRUFETUUKKyVkb2MgeDExLXNzaC1hc2twYXNzLSV7eHZlcnNpb259L0NoYW5nZUxvZworJWRvYyB4MTEtc3NoLWFza3Bhc3MtJXt4dmVyc2lvbn0vU3NoQXNrcGFzcyouYWQKKyVhdHRyKDA3NTUscm9vdCxyb290KSAle19saWJkaXJ9L3NzaC9zc2gtYXNrcGFzcworJWF0dHIoMDc1NSxyb290LHJvb3QpICV7X2xpYmRpcn0vc3NoL3gxMS1zc2gtYXNrcGFzcworJWF0dHIoMDY0NCxyb290LHJvb3QpICVkb2MgL3Vzci9YMTFSNi9tYW4vbWFuMS9zc2gtYXNrcGFzcy4xeCoKKyVhdHRyKDA2NDQscm9vdCxyb290KSAlZG9jIC91c3IvWDExUjYvbWFuL21hbjEveDExLXNzaC1hc2twYXNzLjF4KgorJWF0dHIoMDY0NCxyb290LHJvb3QpICVjb25maWcgL3Vzci9YMTFSNi9saWIvWDExL2FwcC1kZWZhdWx0cy9Tc2hBc2twYXNzCislZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvY29udHJpYi9zdXNlL3JjLmNvbmZpZy5zc2hkIGIvb3BlbnNzaC02LjBwMS9jb250cmliL3N1c2UvcmMuY29uZmlnLnNzaGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFhYTdhNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9zdXNlL3JjLmNvbmZpZy5zc2hkCkBAIC0wLDAgKzEsNSBAQAorIworIyBTdGFydCB0aGUgU2VjdXJlIFNoZWxsIChTU0gpIERhZW1vbj8KKyMKK1NUQVJUX1NTSEQ9InllcyIKKwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jb250cmliL3N1c2UvcmMuc3NoZCBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9zdXNlL3JjLnNzaGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEzYmM0MQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9zdXNlL3JjLnNzaGQKQEAgLTAsMCArMSwxMjEgQEAKKyMhIC9iaW4vc2gKKyMgQ29weXJpZ2h0IChjKSAxOTk1LTIwMDAgU3VTRSBHbWJIIE51ZXJuYmVyZywgR2VybWFueS4KKyMKKyMgQXV0aG9yOiBKaXJpIFNtaWQgPGZlZWRiYWNrQHN1c2UuZGU+CisjCisjIC9ldGMvaW5pdC5kL3NzaGQKKyMKKyMgICBhbmQgc3ltYm9saWMgaXRzIGxpbmsKKyMKKyMgL3Vzci9zYmluL3Jjc3NoZAorIworIyMjIEJFR0lOIElOSVQgSU5GTworIyBQcm92aWRlczogc3NoZAorIyBSZXF1aXJlZC1TdGFydDogJG5ldHdvcmsgJHJlbW90ZV9mcworIyBSZXF1aXJlZC1TdG9wOiAkbmV0d29yayAkcmVtb3RlX2ZzCisjIERlZmF1bHQtU3RhcnQ6IDMgNQorIyBEZWZhdWx0LVN0b3A6IDAgMSAyIDYKKyMgRGVzY3JpcHRpb246IFN0YXJ0IHRoZSBzc2hkIGRhZW1vbgorIyMjIEVORCBJTklUIElORk8KKworU1NIRF9CSU49L3Vzci9zYmluL3NzaGQKK3Rlc3QgLXggJFNTSERfQklOIHx8IGV4aXQgNQorCitTU0hEX1NZU0NPTkZJRz0vZXRjL3N5c2NvbmZpZy9zc2gKK3Rlc3QgLXIgJFNTSERfU1lTQ09ORklHIHx8IGV4aXQgNgorLiAkU1NIRF9TWVNDT05GSUcKKworU1NIRF9QSURGSUxFPS92YXIvcnVuL3NzaGQuaW5pdC5waWQKKworLiAvZXRjL3JjLnN0YXR1cworCisjIFNoZWxsIGZ1bmN0aW9ucyBzb3VyY2VkIGZyb20gL2V0Yy9yYy5zdGF0dXM6CisjICAgICAgcmNfY2hlY2sgICAgICAgICBjaGVjayBhbmQgc2V0IGxvY2FsIGFuZCBvdmVyYWxsIHJjIHN0YXR1cworIyAgICAgIHJjX3N0YXR1cyAgICAgICAgY2hlY2sgYW5kIHNldCBsb2NhbCBhbmQgb3ZlcmFsbCByYyBzdGF0dXMKKyMgICAgICByY19zdGF0dXMgLXYgICAgIGRpdHRvIGJ1dCBiZSB2ZXJib3NlIGluIGxvY2FsIHJjIHN0YXR1cworIyAgICAgIHJjX3N0YXR1cyAtdiAtciAgZGl0dG8gYW5kIGNsZWFyIHRoZSBsb2NhbCByYyBzdGF0dXMKKyMgICAgICByY19mYWlsZWQgICAgICAgIHNldCBsb2NhbCBhbmQgb3ZlcmFsbCByYyBzdGF0dXMgdG8gZmFpbGVkCisjICAgICAgcmNfcmVzZXQgICAgICAgICBjbGVhciBsb2NhbCByYyBzdGF0dXMgKG92ZXJhbGwgcmVtYWlucykKKyMgICAgICByY19leGl0ICAgICAgICAgIGV4aXQgYXBwcm9wcmlhdGUgdG8gb3ZlcmFsbCByYyBzdGF0dXMKKworIyBGaXJzdCByZXNldCBzdGF0dXMgb2YgdGhpcyBzZXJ2aWNlCityY19yZXNldAorCitjYXNlICIkMSIgaW4KKyAgICBzdGFydCkKKwkjIEdlbmVyYXRlIGFueSBtaXNzaW5nIGhvc3Qga2V5cworCXNzaC1rZXlnZW4gLUEKKwllY2hvIC1uICJTdGFydGluZyBTU0ggZGFlbW9uIgorCSMjIFN0YXJ0IGRhZW1vbiB3aXRoIHN0YXJ0cHJvYyg4KS4gSWYgdGhpcyBmYWlscworCSMjIHRoZSBlY2hvIHJldHVybiB2YWx1ZSBpcyBzZXQgYXBwcm9wcmlhdGUuCisKKwlzdGFydHByb2MgLWYgLXAgJFNTSERfUElERklMRSAvdXNyL3NiaW4vc3NoZCAkU1NIRF9PUFRTIC1vICJQaWRGaWxlPSRTU0hEX1BJREZJTEUiIAorCisJIyBSZW1lbWJlciBzdGF0dXMgYW5kIGJlIHZlcmJvc2UKKwlyY19zdGF0dXMgLXYKKwk7OworICAgIHN0b3ApCisJZWNobyAtbiAiU2h1dHRpbmcgZG93biBTU0ggZGFlbW9uIgorCSMjIFN0b3AgZGFlbW9uIHdpdGgga2lsbHByb2MoOCkgYW5kIGlmIHRoaXMgZmFpbHMKKwkjIyBzZXQgZWNobyB0aGUgZWNobyByZXR1cm4gdmFsdWUuCisKKwlraWxscHJvYyAtcCAkU1NIRF9QSURGSUxFIC1URVJNIC91c3Ivc2Jpbi9zc2hkCisKKwkjIFJlbWVtYmVyIHN0YXR1cyBhbmQgYmUgdmVyYm9zZQorCXJjX3N0YXR1cyAtdgorCTs7CisgICAgdHJ5LXJlc3RhcnQpCisgICAgICAgICMjIFN0b3AgdGhlIHNlcnZpY2UgYW5kIGlmIHRoaXMgc3VjY2VlZHMgKGkuZS4gdGhlIAorICAgICAgICAjIyBzZXJ2aWNlIHdhcyBydW5uaW5nIGJlZm9yZSksIHN0YXJ0IGl0IGFnYWluLgorICAgICAgICAkMCBzdGF0dXMgPi9kZXYvbnVsbCAmJiAgJDAgcmVzdGFydAorCisgICAgICAgICMgUmVtZW1iZXIgc3RhdHVzIGFuZCBiZSBxdWlldAorICAgICAgICByY19zdGF0dXMKKyAgICAgICAgOzsKKyAgICByZXN0YXJ0KQorICAgICAgICAjIyBTdG9wIHRoZSBzZXJ2aWNlIGFuZCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgd2FzCisgICAgICAgICMjIHJ1bm5pbmcgb3Igbm90LCBzdGFydCBpdCBhZ2Fpbi4KKyAgICAgICAgJDAgc3RvcAorICAgICAgICAkMCBzdGFydAorCisgICAgICAgICMgUmVtZW1iZXIgc3RhdHVzIGFuZCBiZSBxdWlldAorICAgICAgICByY19zdGF0dXMKKyAgICAgICAgOzsKKyAgICBmb3JjZS1yZWxvYWR8cmVsb2FkKQorCSMjIFNpZ25hbCB0aGUgZGFlbW9uIHRvIHJlbG9hZCBpdHMgY29uZmlnLiBNb3N0IGRhZW1vbnMKKwkjIyBkbyB0aGlzIG9uIHNpZ25hbCAxIChTSUdIVVApLgorCisJZWNobyAtbiAiUmVsb2FkIHNlcnZpY2Ugc3NoZCIKKworCWtpbGxwcm9jIC1wICRTU0hEX1BJREZJTEUgLUhVUCAvdXNyL3NiaW4vc3NoZAorCisgICAgICAgIHJjX3N0YXR1cyAtdgorCisgICAgICAgIDs7CisgICAgc3RhdHVzKQorCWVjaG8gLW4gIkNoZWNraW5nIGZvciBzZXJ2aWNlIHNzaGQgIgorICAgICAgICAjIyBDaGVjayBzdGF0dXMgd2l0aCBjaGVja3Byb2MoOCksIGlmIHByb2Nlc3MgaXMgcnVubmluZworICAgICAgICAjIyBjaGVja3Byb2Mgd2lsbCByZXR1cm4gd2l0aCBleGl0IHN0YXR1cyAwLgorCisgICAgICAgICMgU3RhdHVzIGhhcyBhIHNsaWdodGx5IGRpZmZlcmVudCBmb3IgdGhlIHN0YXR1cyBjb21tYW5kOgorICAgICAgICAjIDAgLSBzZXJ2aWNlIHJ1bm5pbmcKKyAgICAgICAgIyAxIC0gc2VydmljZSBkZWFkLCBidXQgL3Zhci9ydW4vICBwaWQgIGZpbGUgZXhpc3RzCisgICAgICAgICMgMiAtIHNlcnZpY2UgZGVhZCwgYnV0IC92YXIvbG9jay8gbG9jayBmaWxlIGV4aXN0cworICAgICAgICAjIDMgLSBzZXJ2aWNlIG5vdCBydW5uaW5nCisKKwljaGVja3Byb2MgLXAgJFNTSERfUElERklMRSAvdXNyL3NiaW4vc3NoZAorCisJcmNfc3RhdHVzIC12CisJOzsKKyAgICBwcm9iZSkKKwkjIyBPcHRpb25hbDogUHJvYmUgZm9yIHRoZSBuZWNlc3NpdHkgb2YgYSByZWxvYWQsCisJIyMgZ2l2ZSBvdXQgdGhlIGFyZ3VtZW50IHdoaWNoIGlzIHJlcXVpcmVkIGZvciBhIHJlbG9hZC4KKworICAgICAgICB0ZXN0IC9ldGMvc3NoL3NzaGRfY29uZmlnIC1udCAkU1NIRF9QSURGSUxFICYmIGVjaG8gcmVsb2FkCisJOzsKKyAgICAqKQorCWVjaG8gIlVzYWdlOiAkMCB7c3RhcnR8c3RvcHxzdGF0dXN8dHJ5LXJlc3RhcnR8cmVzdGFydHxmb3JjZS1yZWxvYWR8cmVsb2FkfHByb2JlfSIKKwlleGl0IDEKKwk7OworZXNhYworcmNfZXhpdApkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9jb250cmliL3N1c2Uvc3lzY29uZmlnLnNzaCBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9zdXNlL3N5c2NvbmZpZy5zc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhMzdlNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY29udHJpYi9zdXNlL3N5c2NvbmZpZy5zc2gKQEAgLTAsMCArMSw5IEBACisjIyBQYXRoOglOZXR3b3JrL1JlbW90ZSBhY2Nlc3MvU1NICisjIyBEZXNjcmlwdGlvbjoJU1NIIHNlcnZlciBzZXR0aW5ncworIyMgVHlwZToJc3RyaW5nCisjIyBEZWZhdWx0OgkiIgorIyMgU2VydmljZVJlc3RhcnQ6IHNzaGQKKyMKKyMgT3B0aW9ucyBmb3Igc3NoZAorIworU1NIRF9PUFRTPSIiCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2NyYzMyLmMgYi9vcGVuc3NoLTYuMHAxL2NyYzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE5MmViNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvY3JjMzIuYwpAQCAtMCwwICsxLDEwNSBAQAorLyogJE9wZW5CU0Q6IGNyYzMyLmMsdiAxLjExIDIwMDYvMDQvMjIgMTg6Mjk6MzMgc3RldmVzayBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAzIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisjaW5jbHVkZSAiY3JjMzIuaCIKKworc3RhdGljIGNvbnN0IHVfaW50MzJfdCBjcmMzMnRhYltdID0geworCTB4MDAwMDAwMDBMLCAweDc3MDczMDk2TCwgMHhlZTBlNjEyY0wsIDB4OTkwOTUxYmFMLAorCTB4MDc2ZGM0MTlMLCAweDcwNmFmNDhmTCwgMHhlOTYzYTUzNUwsIDB4OWU2NDk1YTNMLAorCTB4MGVkYjg4MzJMLCAweDc5ZGNiOGE0TCwgMHhlMGQ1ZTkxZUwsIDB4OTdkMmQ5ODhMLAorCTB4MDliNjRjMmJMLCAweDdlYjE3Y2JkTCwgMHhlN2I4MmQwN0wsIDB4OTBiZjFkOTFMLAorCTB4MWRiNzEwNjRMLCAweDZhYjAyMGYyTCwgMHhmM2I5NzE0OEwsIDB4ODRiZTQxZGVMLAorCTB4MWFkYWQ0N2RMLCAweDZkZGRlNGViTCwgMHhmNGQ0YjU1MUwsIDB4ODNkMzg1YzdMLAorCTB4MTM2Yzk4NTZMLCAweDY0NmJhOGMwTCwgMHhmZDYyZjk3YUwsIDB4OGE2NWM5ZWNMLAorCTB4MTQwMTVjNGZMLCAweDYzMDY2Y2Q5TCwgMHhmYTBmM2Q2M0wsIDB4OGQwODBkZjVMLAorCTB4M2I2ZTIwYzhMLCAweDRjNjkxMDVlTCwgMHhkNTYwNDFlNEwsIDB4YTI2NzcxNzJMLAorCTB4M2MwM2U0ZDFMLCAweDRiMDRkNDQ3TCwgMHhkMjBkODVmZEwsIDB4YTUwYWI1NmJMLAorCTB4MzViNWE4ZmFMLCAweDQyYjI5ODZjTCwgMHhkYmJiYzlkNkwsIDB4YWNiY2Y5NDBMLAorCTB4MzJkODZjZTNMLCAweDQ1ZGY1Yzc1TCwgMHhkY2Q2MGRjZkwsIDB4YWJkMTNkNTlMLAorCTB4MjZkOTMwYWNMLCAweDUxZGUwMDNhTCwgMHhjOGQ3NTE4MEwsIDB4YmZkMDYxMTZMLAorCTB4MjFiNGY0YjVMLCAweDU2YjNjNDIzTCwgMHhjZmJhOTU5OUwsIDB4YjhiZGE1MGZMLAorCTB4MjgwMmI4OWVMLCAweDVmMDU4ODA4TCwgMHhjNjBjZDliMkwsIDB4YjEwYmU5MjRMLAorCTB4MmY2ZjdjODdMLCAweDU4Njg0YzExTCwgMHhjMTYxMWRhYkwsIDB4YjY2NjJkM2RMLAorCTB4NzZkYzQxOTBMLCAweDAxZGI3MTA2TCwgMHg5OGQyMjBiY0wsIDB4ZWZkNTEwMmFMLAorCTB4NzFiMTg1ODlMLCAweDA2YjZiNTFmTCwgMHg5ZmJmZTRhNUwsIDB4ZThiOGQ0MzNMLAorCTB4NzgwN2M5YTJMLCAweDBmMDBmOTM0TCwgMHg5NjA5YTg4ZUwsIDB4ZTEwZTk4MThMLAorCTB4N2Y2YTBkYmJMLCAweDA4NmQzZDJkTCwgMHg5MTY0NmM5N0wsIDB4ZTY2MzVjMDFMLAorCTB4NmI2YjUxZjRMLCAweDFjNmM2MTYyTCwgMHg4NTY1MzBkOEwsIDB4ZjI2MjAwNGVMLAorCTB4NmMwNjk1ZWRMLCAweDFiMDFhNTdiTCwgMHg4MjA4ZjRjMUwsIDB4ZjUwZmM0NTdMLAorCTB4NjViMGQ5YzZMLCAweDEyYjdlOTUwTCwgMHg4YmJlYjhlYUwsIDB4ZmNiOTg4N2NMLAorCTB4NjJkZDFkZGZMLCAweDE1ZGEyZDQ5TCwgMHg4Y2QzN2NmM0wsIDB4ZmJkNDRjNjVMLAorCTB4NGRiMjYxNThMLCAweDNhYjU1MWNlTCwgMHhhM2JjMDA3NEwsIDB4ZDRiYjMwZTJMLAorCTB4NGFkZmE1NDFMLCAweDNkZDg5NWQ3TCwgMHhhNGQxYzQ2ZEwsIDB4ZDNkNmY0ZmJMLAorCTB4NDM2OWU5NmFMLCAweDM0NmVkOWZjTCwgMHhhZDY3ODg0NkwsIDB4ZGE2MGI4ZDBMLAorCTB4NDQwNDJkNzNMLCAweDMzMDMxZGU1TCwgMHhhYTBhNGM1ZkwsIDB4ZGQwZDdjYzlMLAorCTB4NTAwNTcxM2NMLCAweDI3MDI0MWFhTCwgMHhiZTBiMTAxMEwsIDB4YzkwYzIwODZMLAorCTB4NTc2OGI1MjVMLCAweDIwNmY4NWIzTCwgMHhiOTY2ZDQwOUwsIDB4Y2U2MWU0OWZMLAorCTB4NWVkZWY5MGVMLCAweDI5ZDljOTk4TCwgMHhiMGQwOTgyMkwsIDB4YzdkN2E4YjRMLAorCTB4NTliMzNkMTdMLCAweDJlYjQwZDgxTCwgMHhiN2JkNWMzYkwsIDB4YzBiYTZjYWRMLAorCTB4ZWRiODgzMjBMLCAweDlhYmZiM2I2TCwgMHgwM2I2ZTIwY0wsIDB4NzRiMWQyOWFMLAorCTB4ZWFkNTQ3MzlMLCAweDlkZDI3N2FmTCwgMHgwNGRiMjYxNUwsIDB4NzNkYzE2ODNMLAorCTB4ZTM2MzBiMTJMLCAweDk0NjQzYjg0TCwgMHgwZDZkNmEzZUwsIDB4N2E2YTVhYThMLAorCTB4ZTQwZWNmMGJMLCAweDkzMDlmZjlkTCwgMHgwYTAwYWUyN0wsIDB4N2QwNzllYjFMLAorCTB4ZjAwZjkzNDRMLCAweDg3MDhhM2QyTCwgMHgxZTAxZjI2OEwsIDB4NjkwNmMyZmVMLAorCTB4Zjc2MjU3NWRMLCAweDgwNjU2N2NiTCwgMHgxOTZjMzY3MUwsIDB4NmU2YjA2ZTdMLAorCTB4ZmVkNDFiNzZMLCAweDg5ZDMyYmUwTCwgMHgxMGRhN2E1YUwsIDB4NjdkZDRhY2NMLAorCTB4ZjliOWRmNmZMLCAweDhlYmVlZmY5TCwgMHgxN2I3YmU0M0wsIDB4NjBiMDhlZDVMLAorCTB4ZDZkNmEzZThMLCAweGExZDE5MzdlTCwgMHgzOGQ4YzJjNEwsIDB4NGZkZmYyNTJMLAorCTB4ZDFiYjY3ZjFMLCAweGE2YmM1NzY3TCwgMHgzZmI1MDZkZEwsIDB4NDhiMjM2NGJMLAorCTB4ZDgwZDJiZGFMLCAweGFmMGExYjRjTCwgMHgzNjAzNGFmNkwsIDB4NDEwNDdhNjBMLAorCTB4ZGY2MGVmYzNMLCAweGE4NjdkZjU1TCwgMHgzMTZlOGVlZkwsIDB4NDY2OWJlNzlMLAorCTB4Y2I2MWIzOGNMLCAweGJjNjY4MzFhTCwgMHgyNTZmZDJhMEwsIDB4NTI2OGUyMzZMLAorCTB4Y2MwYzc3OTVMLCAweGJiMGI0NzAzTCwgMHgyMjAyMTZiOUwsIDB4NTUwNTI2MmZMLAorCTB4YzViYTNiYmVMLCAweGIyYmQwYjI4TCwgMHgyYmI0NWE5MkwsIDB4NWNiMzZhMDRMLAorCTB4YzJkN2ZmYTdMLCAweGI1ZDBjZjMxTCwgMHgyY2Q5OWU4YkwsIDB4NWJkZWFlMWRMLAorCTB4OWI2NGMyYjBMLCAweGVjNjNmMjI2TCwgMHg3NTZhYTM5Y0wsIDB4MDI2ZDkzMGFMLAorCTB4OWMwOTA2YTlMLCAweGViMGUzNjNmTCwgMHg3MjA3Njc4NUwsIDB4MDUwMDU3MTNMLAorCTB4OTViZjRhODJMLCAweGUyYjg3YTE0TCwgMHg3YmIxMmJhZUwsIDB4MGNiNjFiMzhMLAorCTB4OTJkMjhlOWJMLCAweGU1ZDViZTBkTCwgMHg3Y2RjZWZiN0wsIDB4MGJkYmRmMjFMLAorCTB4ODZkM2QyZDRMLCAweGYxZDRlMjQyTCwgMHg2OGRkYjNmOEwsIDB4MWZkYTgzNmVMLAorCTB4ODFiZTE2Y2RMLCAweGY2YjkyNjViTCwgMHg2ZmIwNzdlMUwsIDB4MThiNzQ3NzdMLAorCTB4ODgwODVhZTZMLCAweGZmMGY2YTcwTCwgMHg2NjA2M2JjYUwsIDB4MTEwMTBiNWNMLAorCTB4OGY2NTllZmZMLCAweGY4NjJhZTY5TCwgMHg2MTZiZmZkM0wsIDB4MTY2Y2NmNDVMLAorCTB4YTAwYWUyNzhMLCAweGQ3MGRkMmVlTCwgMHg0ZTA0ODM1NEwsIDB4MzkwM2IzYzJMLAorCTB4YTc2NzI2NjFMLCAweGQwNjAxNmY3TCwgMHg0OTY5NDc0ZEwsIDB4M2U2ZTc3ZGJMLAorCTB4YWVkMTZhNGFMLCAweGQ5ZDY1YWRjTCwgMHg0MGRmMGI2NkwsIDB4MzdkODNiZjBMLAorCTB4YTliY2FlNTNMLCAweGRlYmI5ZWM1TCwgMHg0N2IyY2Y3ZkwsIDB4MzBiNWZmZTlMLAorCTB4YmRiZGYyMWNMLCAweGNhYmFjMjhhTCwgMHg1M2IzOTMzMEwsIDB4MjRiNGEzYTZMLAorCTB4YmFkMDM2MDVMLCAweGNkZDcwNjkzTCwgMHg1NGRlNTcyOUwsIDB4MjNkOTY3YmZMLAorCTB4YjM2NjdhMmVMLCAweGM0NjE0YWI4TCwgMHg1ZDY4MWIwMkwsIDB4MmE2ZjJiOTRMLAorCTB4YjQwYmJlMzdMLCAweGMzMGM4ZWExTCwgMHg1YTA1ZGYxYkwsIDB4MmQwMmVmOGRMCit9OworCit1X2ludDMyX3QKK3NzaF9jcmMzMihjb25zdCB1X2NoYXIgKmJ1ZiwgdV9pbnQzMl90IHNpemUpCit7CisJdV9pbnQzMl90IGksIGNyYzsKKworCWNyYyA9IDA7CisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJY3JjID0gY3JjMzJ0YWJbKGNyYyBeIGJ1ZltpXSkgJiAweGZmXSBeIChjcmMgPj4gOCk7CisJcmV0dXJuIGNyYzsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvY3JjMzIuaCBiL29wZW5zc2gtNi4wcDEvY3JjMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDcxMzFhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9jcmMzMi5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qICRPcGVuQlNEOiBjcmMzMi5oLHYgMS4xNSAyMDA2LzAzLzI1IDIyOjIyOjQzIGRqbSBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAzIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFNTSF9DUkMzMl9ICisjZGVmaW5lIFNTSF9DUkMzMl9ICit1X2ludDMyX3QJIHNzaF9jcmMzMihjb25zdCB1X2NoYXIgKiwgdV9pbnQzMl90KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9kZWF0dGFjay5jIGIvb3BlbnNzaC02LjBwMS9kZWF0dGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMzdlNGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2RlYXR0YWNrLmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qICRPcGVuQlNEOiBkZWF0dGFjay5jLHYgMS4zMCAyMDA2LzA5LzE2IDE5OjUzOjM3IGRqbSBFeHAgJCAqLworLyoKKyAqIENyeXB0b2dyYXBoaWMgYXR0YWNrIGRldGVjdG9yIGZvciBzc2ggLSBzb3VyY2UgY29kZQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OCBDT1JFIFNESSBTLkEuLCBCdWVub3MgQWlyZXMsIEFyZ2VudGluYS4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5CisgKiBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0CisgKiB0aGlzIGNvcHlyaWdodCBub3RpY2UgaXMgcmV0YWluZWQuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIENPUkUgU0RJIFMuQS4gQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIFJFU1VMVElORyBGUk9NIFRIRSBVU0UgT1IgTUlTVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLgorICoKKyAqIEFyaWVsIEZ1dG9yYW5za3kgPGZ1dG9AY29yZS1zZGkuY29tPgorICogPGh0dHA6Ly93d3cuY29yZS1zZGkuY29tPgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImRlYXR0YWNrLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAiY3JjMzIuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisKKy8qCisgKiBDUkMgYXR0YWNrIGRldGVjdGlvbiBoYXMgYSB3b3JzdC1jYXNlIGJlaGF2aW91ciB0aGF0IGlzIE8oTl4zKSBvdmVyCisgKiB0aGUgbnVtYmVyIG9mIGlkZW50aWNhbCBibG9ja3MgaW4gYSBwYWNrZXQuIFRoaXMgYmVoYXZpb3VyIGNhbiBiZSAKKyAqIGV4cGxvaXRlZCB0byBjcmVhdGUgYSBsaW1pdGVkIGRlbmlhbCBvZiBzZXJ2aWNlIGF0dGFjay4gCisgKiAKKyAqIEhvd2V2ZXIsIGJlY2F1c2Ugd2UgYXJlIGRlYWxpbmcgd2l0aCBlbmNyeXB0ZWQgZGF0YSwgaWRlbnRpY2FsCisgKiBibG9ja3Mgc2hvdWxkIG9ubHkgb2NjdXIgZXZlcnkgMl4zNSBtYXhpbWFsbHktc2l6ZWQgcGFja2V0cyBvciBzby4gCisgKiBDb25zZXF1ZW50bHksIHdlIGNhbiBkZXRlY3QgdGhpcyBEb1MgYnkgbG9va2luZyBmb3IgaWRlbnRpY2FsIGJsb2NrcworICogaW4gYSBwYWNrZXQuCisgKgorICogVGhlIHBhcmFtZXRlciBiZWxvdyBkZXRlcm1pbmVzIGhvdyBtYW55IGlkZW50aWNhbCBibG9ja3Mgd2Ugd2lsbAorICogYWNjZXB0IGluIGEgc2luZ2xlIHBhY2tldCwgdHJhZGluZyBvZmYgYmV0d2VlbiBhdHRhY2sgZGV0ZWN0aW9uIGFuZAorICogbGlrZWxpaG9vZCBvZiB0ZXJtaW5hdGluZyBhIGxlZ2l0aW1hdGUgY29ubmVjdGlvbi4gQSB2YWx1ZSBvZiAzMiAKKyAqIGNvcnJlc3BvbmRzIHRvIGFuIGF2ZXJhZ2Ugb2YgMl40MCBtZXNzYWdlcyBiZWZvcmUgYW4gYXR0YWNrIGlzCisgKiBtaXNkZXRlY3RlZAorICovCisjZGVmaW5lIE1BWF9JREVOVElDQUwJMzIKKworLyogU1NIIENvbnN0YW50cyAqLworI2RlZmluZSBTU0hfTUFYQkxPQ0tTCSgzMiAqIDEwMjQpCisjZGVmaW5lIFNTSF9CTE9DS1NJWkUJKDgpCisKKy8qIEhhc2hpbmcgY29uc3RhbnRzICovCisjZGVmaW5lIEhBU0hfTUlOU0laRQkoOCAqIDEwMjQpCisjZGVmaW5lIEhBU0hfRU5UUllTSVpFCSgyKQorI2RlZmluZSBIQVNIX0ZBQ1RPUih4KQkoKHgpKjMvMikKKyNkZWZpbmUgSEFTSF9VTlVTRURDSEFSCSgweGZmKQorI2RlZmluZSBIQVNIX1VOVVNFRAkoMHhmZmZmKQorI2RlZmluZSBIQVNIX0lWCQkoMHhmZmZlKQorCisjZGVmaW5lIEhBU0hfTUlOQkxPQ0tTCSg3KlNTSF9CTE9DS1NJWkUpCisKKworLyogSGFzaCBmdW5jdGlvbiAoSW5wdXQga2V5cyBhcmUgY2lwaGVyIHJlc3VsdHMpICovCisjZGVmaW5lIEhBU0goeCkJCWdldF91MzIoeCkKKworI2RlZmluZSBDTVAoYSwgYikJKG1lbWNtcChhLCBiLCBTU0hfQkxPQ0tTSVpFKSkKKworc3RhdGljIHZvaWQKK2NyY191cGRhdGUodV9pbnQzMl90ICphLCB1X2ludDMyX3QgYikKK3sKKwliIF49ICphOworCSphID0gc3NoX2NyYzMyKCh1X2NoYXIgKikmYiwgc2l6ZW9mKGIpKTsKK30KKworLyogZGV0ZWN0IGlmIGEgYmxvY2sgaXMgdXNlZCBpbiBhIHBhcnRpY3VsYXIgcGF0dGVybiAqLworc3RhdGljIGludAorY2hlY2tfY3JjKHVfY2hhciAqUywgdV9jaGFyICpidWYsIHVfaW50MzJfdCBsZW4pCit7CisJdV9pbnQzMl90IGNyYzsKKwl1X2NoYXIgKmM7CisKKwljcmMgPSAwOworCWZvciAoYyA9IGJ1ZjsgYyA8IGJ1ZiArIGxlbjsgYyArPSBTU0hfQkxPQ0tTSVpFKSB7CisJCWlmICghQ01QKFMsIGMpKSB7CisJCQljcmNfdXBkYXRlKCZjcmMsIDEpOworCQkJY3JjX3VwZGF0ZSgmY3JjLCAwKTsKKwkJfSBlbHNlIHsKKwkJCWNyY191cGRhdGUoJmNyYywgMCk7CisJCQljcmNfdXBkYXRlKCZjcmMsIDApOworCQl9CisJfQorCXJldHVybiAoY3JjID09IDApOworfQorCisKKy8qIERldGVjdCBhIGNyYzMyIGNvbXBlbnNhdGlvbiBhdHRhY2sgb24gYSBwYWNrZXQgKi8KK2ludAorZGV0ZWN0X2F0dGFjayh1X2NoYXIgKmJ1ZiwgdV9pbnQzMl90IGxlbikKK3sKKwlzdGF0aWMgdV9pbnQxNl90ICpoID0gKHVfaW50MTZfdCAqKSBOVUxMOworCXN0YXRpYyB1X2ludDMyX3QgbiA9IEhBU0hfTUlOU0laRSAvIEhBU0hfRU5UUllTSVpFOworCXVfaW50MzJfdCBpLCBqOworCXVfaW50MzJfdCBsLCBzYW1lOworCXVfY2hhciAqYzsKKwl1X2NoYXIgKmQ7CisKKwlpZiAobGVuID4gKFNTSF9NQVhCTE9DS1MgKiBTU0hfQkxPQ0tTSVpFKSB8fAorCSAgICBsZW4gJSBTU0hfQkxPQ0tTSVpFICE9IDApIHsKKwkJZmF0YWwoImRldGVjdF9hdHRhY2s6IGJhZCBsZW5ndGggJWQiLCBsZW4pOworCX0KKwlmb3IgKGwgPSBuOyBsIDwgSEFTSF9GQUNUT1IobGVuIC8gU1NIX0JMT0NLU0laRSk7IGwgPSBsIDw8IDIpCisJCTsKKworCWlmIChoID09IE5VTEwpIHsKKwkJZGVidWcoIkluc3RhbGxpbmcgY3JjIGNvbXBlbnNhdGlvbiBhdHRhY2sgZGV0ZWN0b3IuIik7CisJCWggPSAodV9pbnQxNl90ICopIHhjYWxsb2MobCwgSEFTSF9FTlRSWVNJWkUpOworCQluID0gbDsKKwl9IGVsc2UgeworCQlpZiAobCA+IG4pIHsKKwkJCWggPSAodV9pbnQxNl90ICopeHJlYWxsb2MoaCwgbCwgSEFTSF9FTlRSWVNJWkUpOworCQkJbiA9IGw7CisJCX0KKwl9CisKKwlpZiAobGVuIDw9IEhBU0hfTUlOQkxPQ0tTKSB7CisJCWZvciAoYyA9IGJ1ZjsgYyA8IGJ1ZiArIGxlbjsgYyArPSBTU0hfQkxPQ0tTSVpFKSB7CisJCQlmb3IgKGQgPSBidWY7IGQgPCBjOyBkICs9IFNTSF9CTE9DS1NJWkUpIHsKKwkJCQlpZiAoIUNNUChjLCBkKSkgeworCQkJCQlpZiAoKGNoZWNrX2NyYyhjLCBidWYsIGxlbikpKQorCQkJCQkJcmV0dXJuIChERUFUVEFDS19ERVRFQ1RFRCk7CisJCQkJCWVsc2UKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gKERFQVRUQUNLX09LKTsKKwl9CisJbWVtc2V0KGgsIEhBU0hfVU5VU0VEQ0hBUiwgbiAqIEhBU0hfRU5UUllTSVpFKTsKKworCWZvciAoYyA9IGJ1Ziwgc2FtZSA9IGogPSAwOyBjIDwgKGJ1ZiArIGxlbik7IGMgKz0gU1NIX0JMT0NLU0laRSwgaisrKSB7CisJCWZvciAoaSA9IEhBU0goYykgJiAobiAtIDEpOyBoW2ldICE9IEhBU0hfVU5VU0VEOworCQkgICAgaSA9IChpICsgMSkgJiAobiAtIDEpKSB7CisJCQlpZiAoIUNNUChjLCBidWYgKyBoW2ldICogU1NIX0JMT0NLU0laRSkpIHsKKwkJCQlpZiAoKytzYW1lID4gTUFYX0lERU5USUNBTCkKKwkJCQkJcmV0dXJuIChERUFUVEFDS19ET1NfREVURUNURUQpOworCQkJCWlmIChjaGVja19jcmMoYywgYnVmLCBsZW4pKQorCQkJCQlyZXR1cm4gKERFQVRUQUNLX0RFVEVDVEVEKTsKKwkJCQllbHNlCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWhbaV0gPSBqOworCX0KKwlyZXR1cm4gKERFQVRUQUNLX09LKTsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvZGVhdHRhY2suaCBiL29wZW5zc2gtNi4wcDEvZGVhdHRhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzE2ZmIyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9kZWF0dGFjay5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qICRPcGVuQlNEOiBkZWF0dGFjay5oLHYgMS4xMCAyMDA2LzA5LzE2IDE5OjUzOjM3IGRqbSBFeHAgJCAqLworCisvKgorICogQ3J5cHRvZ3JhcGhpYyBhdHRhY2sgZGV0ZWN0b3IgZm9yIHNzaCAtIEhlYWRlciBmaWxlCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4IENPUkUgU0RJIFMuQS4sIEJ1ZW5vcyBBaXJlcywgQXJnZW50aW5hLgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkKKyAqIGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQKKyAqIHRoaXMgY29weXJpZ2h0IG5vdGljZSBpcyByZXRhaW5lZC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQ09SRSBTREkgUy5BLiBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgUkVTVUxUSU5HIEZST00gVEhFIFVTRSBPUiBNSVNVU0UgT0YgVEhJUworICogU09GVFdBUkUuCisgKgorICogQXJpZWwgRnV0b3JhbnNreSA8ZnV0b0Bjb3JlLXNkaS5jb20+CisgKiA8aHR0cDovL3d3dy5jb3JlLXNkaS5jb20+CisgKi8KKworI2lmbmRlZiBfREVBVFRBQ0tfSAorI2RlZmluZSBfREVBVFRBQ0tfSAorCisvKiBSZXR1cm4gY29kZXMgKi8KKyNkZWZpbmUgREVBVFRBQ0tfT0sJCTAKKyNkZWZpbmUgREVBVFRBQ0tfREVURUNURUQJMQorI2RlZmluZSBERUFUVEFDS19ET1NfREVURUNURUQJMgorCitpbnQJIGRldGVjdF9hdHRhY2sodV9jaGFyICosIHVfaW50MzJfdCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvZGVmaW5lcy5oIGIvb3BlbnNzaC02LjBwMS9kZWZpbmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmODNhMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvZGVmaW5lcy5oCkBAIC0wLDAgKzEsODA3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDMgRGFtaWVuIE1pbGxlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX0RFRklORVNfSAorI2RlZmluZSBfREVGSU5FU19ICisKKy8qICRJZDogZGVmaW5lcy5oLHYgMS4xNjkgMjAxMi8wMi8xNSAwNDoxMzowNiB0aW0gRXhwICQgKi8KKworCisvKiBDb25zdGFudHMgKi8KKworI2lmIGRlZmluZWQoSEFWRV9ERUNMX1NIVVRfUkQpICYmIEhBVkVfREVDTF9TSFVUX1JEID09IDAKK2VudW0KK3sKKyAgU0hVVF9SRCA9IDAsCQkvKiBObyBtb3JlIHJlY2VwdGlvbnMuICAqLworICBTSFVUX1dSLAkJCS8qIE5vIG1vcmUgdHJhbnNtaXNzaW9ucy4gICovCisgIFNIVVRfUkRXUgkJCS8qIE5vIG1vcmUgcmVjZXB0aW9ucyBvciB0cmFuc21pc3Npb25zLiAgKi8KK307CisjIGRlZmluZSBTSFVUX1JEICAgU0hVVF9SRAorIyBkZWZpbmUgU0hVVF9XUiAgIFNIVVRfV1IKKyMgZGVmaW5lIFNIVVRfUkRXUiBTSFVUX1JEV1IKKyNlbmRpZgorCisvKgorICogRGVmaW5pdGlvbnMgZm9yIElQIHR5cGUgb2Ygc2VydmljZSAoaXBfdG9zKQorICovCisjaW5jbHVkZSA8bmV0aW5ldC9pbl9zeXN0bS5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KKyNpZm5kZWYgSVBUT1NfTE9XREVMQVkKKyMgZGVmaW5lIElQVE9TX0xPV0RFTEFZICAgICAgICAgIDB4MTAKKyMgZGVmaW5lIElQVE9TX1RIUk9VR0hQVVQgICAgICAgIDB4MDgKKyMgZGVmaW5lIElQVE9TX1JFTElBQklMSVRZICAgICAgIDB4MDQKKyMgZGVmaW5lIElQVE9TX0xPV0NPU1QgICAgICAgICAgIDB4MDIKKyMgZGVmaW5lIElQVE9TX01JTkNPU1QgICAgICAgICAgIElQVE9TX0xPV0NPU1QKKyNlbmRpZiAvKiBJUFRPU19MT1dERUxBWSAqLworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIERpZmZTZXJ2IENvZGVwb2ludHMgYXMgcGVyIFJGQzI0NzQKKyAqLworI2lmbmRlZiBJUFRPU19EU0NQX0FGMTEKKyMgZGVmaW5lCUlQVE9TX0RTQ1BfQUYxMQkJMHgyOAorIyBkZWZpbmUJSVBUT1NfRFNDUF9BRjEyCQkweDMwCisjIGRlZmluZQlJUFRPU19EU0NQX0FGMTMJCTB4MzgKKyMgZGVmaW5lCUlQVE9TX0RTQ1BfQUYyMQkJMHg0OAorIyBkZWZpbmUJSVBUT1NfRFNDUF9BRjIyCQkweDUwCisjIGRlZmluZQlJUFRPU19EU0NQX0FGMjMJCTB4NTgKKyMgZGVmaW5lCUlQVE9TX0RTQ1BfQUYzMQkJMHg2OAorIyBkZWZpbmUJSVBUT1NfRFNDUF9BRjMyCQkweDcwCisjIGRlZmluZQlJUFRPU19EU0NQX0FGMzMJCTB4NzgKKyMgZGVmaW5lCUlQVE9TX0RTQ1BfQUY0MQkJMHg4OAorIyBkZWZpbmUJSVBUT1NfRFNDUF9BRjQyCQkweDkwCisjIGRlZmluZQlJUFRPU19EU0NQX0FGNDMJCTB4OTgKKyMgZGVmaW5lCUlQVE9TX0RTQ1BfRUYJCTB4YjgKKyNlbmRpZiAvKiBJUFRPU19EU0NQX0FGMTEgKi8KKyNpZm5kZWYgSVBUT1NfRFNDUF9DUzAKKyMgZGVmaW5lCUlQVE9TX0RTQ1BfQ1MwCQkweDAwCisjIGRlZmluZQlJUFRPU19EU0NQX0NTMQkJMHgyMAorIyBkZWZpbmUJSVBUT1NfRFNDUF9DUzIJCTB4NDAKKyMgZGVmaW5lCUlQVE9TX0RTQ1BfQ1MzCQkweDYwCisjIGRlZmluZQlJUFRPU19EU0NQX0NTNAkJMHg4MAorIyBkZWZpbmUJSVBUT1NfRFNDUF9DUzUJCTB4YTAKKyMgZGVmaW5lCUlQVE9TX0RTQ1BfQ1M2CQkweGMwCisjIGRlZmluZQlJUFRPU19EU0NQX0NTNwkJMHhlMAorI2VuZGlmIC8qIElQVE9TX0RTQ1BfQ1MwICovCisjaWZuZGVmIElQVE9TX0RTQ1BfRUYKKyMgZGVmaW5lCUlQVE9TX0RTQ1BfRUYJCTB4YjgKKyNlbmRpZiAvKiBJUFRPU19EU0NQX0VGICovCisKKyNpZm5kZWYgUEFUSF9NQVgKKyMgaWZkZWYgX1BPU0lYX1BBVEhfTUFYCisjIGRlZmluZSBQQVRIX01BWCBfUE9TSVhfUEFUSF9NQVgKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIE1BWFBBVEhMRU4KKyMgaWZkZWYgUEFUSF9NQVgKKyMgIGRlZmluZSBNQVhQQVRITEVOIFBBVEhfTUFYCisjIGVsc2UgLyogUEFUSF9NQVggKi8KKyMgIGRlZmluZSBNQVhQQVRITEVOIDY0CisvKiByZWFscGF0aCB1c2VzIGEgZml4ZWQgYnVmZmVyIG9mIHNpemUgTUFYUEFUSExFTiwgc28gZm9yY2UgdXNlIG9mIG91cnMgKi8KKyMgIGlmbmRlZiBCUk9LRU5fUkVBTFBBVEgKKyMgICBkZWZpbmUgQlJPS0VOX1JFQUxQQVRIIDEKKyMgIGVuZGlmIC8qIEJST0tFTl9SRUFMUEFUSCAqLworIyBlbmRpZiAvKiBQQVRIX01BWCAqLworI2VuZGlmIC8qIE1BWFBBVEhMRU4gKi8KKworI2lmIGRlZmluZWQoSEFWRV9ERUNMX01BWFNZTUxJTktTKSAmJiBIQVZFX0RFQ0xfTUFYU1lNTElOS1MgPT0gMAorIyBkZWZpbmUgTUFYU1lNTElOS1MgNQorI2VuZGlmCisKKyNpZm5kZWYgU1RESU5fRklMRU5PCisjIGRlZmluZSBTVERJTl9GSUxFTk8gICAgMAorI2VuZGlmCisjaWZuZGVmIFNURE9VVF9GSUxFTk8KKyMgZGVmaW5lIFNURE9VVF9GSUxFTk8gICAxCisjZW5kaWYKKyNpZm5kZWYgU1RERVJSX0ZJTEVOTworIyBkZWZpbmUgU1RERVJSX0ZJTEVOTyAgIDIKKyNlbmRpZgorCisjaWZuZGVmIE5HUk9VUFNfTUFYCS8qIERpc2FibGUgZ3JvdXBhY2Nlc3MgaWYgTkdST1VQX01BWCBpcyBub3Qgc2V0ICovCisjaWZkZWYgTkdST1VQUworI2RlZmluZSBOR1JPVVBTX01BWCBOR1JPVVBTCisjZWxzZQorI2RlZmluZSBOR1JPVVBTX01BWCAwCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX0RFQ0xfT19OT05CTE9DSykgJiYgSEFWRV9ERUNMX09fTk9OQkxPQ0sgPT0gMAorIyBkZWZpbmUgT19OT05CTE9DSyAgICAgIDAwMDA0CS8qIE5vbiBCbG9ja2luZyBPcGVuICovCisjZW5kaWYKKworI2lmbmRlZiBTX0lGU09DSworIyBkZWZpbmUgU19JRlNPQ0sgMAorI2VuZGlmIC8qIFNfSUZTT0NLICovCisKKyNpZm5kZWYgU19JU0RJUgorIyBkZWZpbmUgU19JU0RJUihtb2RlKQkoKChtb2RlKSAmIChfU19JRk1UKSkgPT0gKF9TX0lGRElSKSkKKyNlbmRpZiAvKiBTX0lTRElSICovCisKKyNpZm5kZWYgU19JU1JFRworIyBkZWZpbmUgU19JU1JFRyhtb2RlKQkoKChtb2RlKSAmIChfU19JRk1UKSkgPT0gKF9TX0lGUkVHKSkKKyNlbmRpZiAvKiBTX0lTUkVHICovCisKKyNpZm5kZWYgU19JU0xOSworIyBkZWZpbmUgU19JU0xOSyhtb2RlKQkoKChtb2RlKSAmIFNfSUZNVCkgPT0gU19JRkxOSykKKyNlbmRpZiAvKiBTX0lTTE5LICovCisKKyNpZm5kZWYgU19JWFVTUgorIyBkZWZpbmUgU19JWFVTUgkJCTAwMDAxMDAJLyogZXhlY3V0ZS9zZWFyY2ggcGVybWlzc2lvbiwgKi8KKyMgZGVmaW5lIFNfSVhHUlAJCQkwMDAwMDEwCS8qIGV4ZWN1dGUvc2VhcmNoIHBlcm1pc3Npb24sICovCisjIGRlZmluZSBTX0lYT1RICQkJMDAwMDAwMQkvKiBleGVjdXRlL3NlYXJjaCBwZXJtaXNzaW9uLCAqLworIyBkZWZpbmUgX1NfSVdVU1IJCQkwMDAwMjAwCS8qIHdyaXRlIHBlcm1pc3Npb24sICovCisjIGRlZmluZSBTX0lXVVNSCQkJX1NfSVdVU1IJLyogd3JpdGUgcGVybWlzc2lvbiwgb3duZXIgKi8KKyMgZGVmaW5lIFNfSVdHUlAJCQkwMDAwMDIwCS8qIHdyaXRlIHBlcm1pc3Npb24sIGdyb3VwICovCisjIGRlZmluZSBTX0lXT1RICQkJMDAwMDAwMgkvKiB3cml0ZSBwZXJtaXNzaW9uLCBvdGhlciAqLworIyBkZWZpbmUgU19JUlVTUgkJCTAwMDA0MDAJLyogcmVhZCBwZXJtaXNzaW9uLCBvd25lciAqLworIyBkZWZpbmUgU19JUkdSUAkJCTAwMDAwNDAJLyogcmVhZCBwZXJtaXNzaW9uLCBncm91cCAqLworIyBkZWZpbmUgU19JUk9USAkJCTAwMDAwMDQJLyogcmVhZCBwZXJtaXNzaW9uLCBvdGhlciAqLworIyBkZWZpbmUgU19JUldYVQkJCTAwMDA3MDAJLyogcmVhZCwgd3JpdGUsIGV4ZWN1dGUgKi8KKyMgZGVmaW5lIFNfSVJXWEcJCQkwMDAwMDcwCS8qIHJlYWQsIHdyaXRlLCBleGVjdXRlICovCisjIGRlZmluZSBTX0lSV1hPCQkJMDAwMDAwNwkvKiByZWFkLCB3cml0ZSwgZXhlY3V0ZSAqLworI2VuZGlmIC8qIFNfSVhVU1IgKi8KKworI2lmICFkZWZpbmVkKE1BUF9BTk9OKSAmJiBkZWZpbmVkKE1BUF9BTk9OWU1PVVMpCisjZGVmaW5lIE1BUF9BTk9OIE1BUF9BTk9OWU1PVVMKKyNlbmRpZgorCisjaWZuZGVmIE1BUF9GQUlMRUQKKyMgZGVmaW5lIE1BUF9GQUlMRUQgKCh2b2lkICopLTEpCisjZW5kaWYKKworLyogKi0qLW50by1xbnggZG9lc24ndCBkZWZpbmUgdGhpcyBjb25zdGFudCBpbiB0aGUgc3lzdGVtIGhlYWRlcnMgKi8KKyNpZmRlZiBNSVNTSU5HX05GREJJVFMKKyMgZGVmaW5lCU5GREJJVFMgKDggKiBzaXplb2YodW5zaWduZWQgbG9uZykpCisjZW5kaWYKKworLyoKK1NDTyBPcGVuIFNlcnZlciAzIGhhcyBJTkFERFJfTE9PUEJBQ0sgZGVmaW5lZCBpbiBycGMvcnBjLmggYnV0CitpbmNsdWRpbmcgcnBjL3JwYy5oIGJyZWFrcyBTb2xhcmlzIDYKKyovCisjaWZuZGVmIElOQUREUl9MT09QQkFDSworI2RlZmluZSBJTkFERFJfTE9PUEJBQ0sgKCh1X2xvbmcpMHg3ZjAwMDAwMSkKKyNlbmRpZgorCisvKiBUeXBlcyAqLworCisvKiBJZiBzeXMvdHlwZXMuaCBkb2VzIG5vdCBzdXBwbHkgaW50WFhfdCwgc3VwcGx5IHRoZW0gb3Vyc2VsdmVzICovCisvKiAob3IgZGllIHRyeWluZykgKi8KKworI2lmbmRlZiBIQVZFX1VfSU5UCit0eXBlZGVmIHVuc2lnbmVkIGludCB1X2ludDsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfSU5UWFhfVAordHlwZWRlZiBzaWduZWQgY2hhciBpbnQ4X3Q7CisjIGlmIChTSVpFT0ZfU0hPUlRfSU5UID09IDIpCit0eXBlZGVmIHNob3J0IGludCBpbnQxNl90OworIyBlbHNlCisjICBpZmRlZiBfVU5JQ09TCisjICAgaWYgKFNJWkVPRl9TSE9SVF9JTlQgPT0gNCkKK3R5cGVkZWYgc2hvcnQgaW50MTZfdDsKKyMgICBlbHNlCit0eXBlZGVmIGxvbmcgIGludDE2X3Q7CisjICAgZW5kaWYKKyMgIGVsc2UKKyMgICBlcnJvciAiMTYgYml0IGludCB0eXBlIG5vdCBmb3VuZC4iCisjICBlbmRpZiAvKiBfVU5JQ09TICovCisjIGVuZGlmCisjIGlmIChTSVpFT0ZfSU5UID09IDQpCit0eXBlZGVmIGludCBpbnQzMl90OworIyBlbHNlCisjICBpZmRlZiBfVU5JQ09TCit0eXBlZGVmIGxvbmcgIGludDMyX3Q7CisjICBlbHNlCisjICAgZXJyb3IgIjMyIGJpdCBpbnQgdHlwZSBub3QgZm91bmQuIgorIyAgZW5kaWYgLyogX1VOSUNPUyAqLworIyBlbmRpZgorI2VuZGlmCisKKy8qIElmIHN5cy90eXBlcy5oIGRvZXMgbm90IHN1cHBseSB1X2ludFhYX3QsIHN1cHBseSB0aGVtIG91cnNlbHZlcyAqLworI2lmbmRlZiBIQVZFX1VfSU5UWFhfVAorIyBpZmRlZiBIQVZFX1VJTlRYWF9UCit0eXBlZGVmIHVpbnQ4X3QgdV9pbnQ4X3Q7Cit0eXBlZGVmIHVpbnQxNl90IHVfaW50MTZfdDsKK3R5cGVkZWYgdWludDMyX3QgdV9pbnQzMl90OworIyBkZWZpbmUgSEFWRV9VX0lOVFhYX1QgMQorIyBlbHNlCisjICBpZiAoU0laRU9GX0NIQVIgPT0gMSkKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1X2ludDhfdDsKKyMgIGVsc2UKKyMgICBlcnJvciAiOCBiaXQgaW50IHR5cGUgbm90IGZvdW5kLiIKKyMgIGVuZGlmCisjICBpZiAoU0laRU9GX1NIT1JUX0lOVCA9PSAyKQordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgdV9pbnQxNl90OworIyAgZWxzZQorIyAgIGlmZGVmIF9VTklDT1MKKyMgICAgaWYgKFNJWkVPRl9TSE9SVF9JTlQgPT0gNCkKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdV9pbnQxNl90OworIyAgICBlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIHVfaW50MTZfdDsKKyMgICAgZW5kaWYKKyMgICBlbHNlCisjICAgIGVycm9yICIxNiBiaXQgaW50IHR5cGUgbm90IGZvdW5kLiIKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmIChTSVpFT0ZfSU5UID09IDQpCit0eXBlZGVmIHVuc2lnbmVkIGludCB1X2ludDMyX3Q7CisjICBlbHNlCisjICAgaWZkZWYgX1VOSUNPUwordHlwZWRlZiB1bnNpZ25lZCBsb25nICB1X2ludDMyX3Q7CisjICAgZWxzZQorIyAgICBlcnJvciAiMzIgYml0IGludCB0eXBlIG5vdCBmb3VuZC4iCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZGVmaW5lIF9fQklUX1RZUEVTX0RFRklORURfXworI2VuZGlmCisKKy8qIDY0LWJpdCB0eXBlcyAqLworI2lmbmRlZiBIQVZFX0lOVDY0X1QKKyMgaWYgKFNJWkVPRl9MT05HX0lOVCA9PSA4KQordHlwZWRlZiBsb25nIGludCBpbnQ2NF90OworIyBlbHNlCisjICBpZiAoU0laRU9GX0xPTkdfTE9OR19JTlQgPT0gOCkKK3R5cGVkZWYgbG9uZyBsb25nIGludCBpbnQ2NF90OworIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBIQVZFX1VfSU5UNjRfVAorIyBpZiAoU0laRU9GX0xPTkdfSU5UID09IDgpCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IHVfaW50NjRfdDsKKyMgZWxzZQorIyAgaWYgKFNJWkVPRl9MT05HX0xPTkdfSU5UID09IDgpCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgdV9pbnQ2NF90OworIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfVV9DSEFSCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdV9jaGFyOworIyBkZWZpbmUgSEFWRV9VX0NIQVIKKyNlbmRpZiAvKiBIQVZFX1VfQ0hBUiAqLworCisjaWZuZGVmIFNJWkVfVF9NQVgKKyNkZWZpbmUgU0laRV9UX01BWCBVTE9OR19NQVgKKyNlbmRpZiAvKiBTSVpFX1RfTUFYICovCisKKyNpZm5kZWYgSEFWRV9TSVpFX1QKK3R5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsKKyMgZGVmaW5lIEhBVkVfU0laRV9UCisjIGRlZmluZSBTSVpFX1RfTUFYIFVJTlRfTUFYCisjZW5kaWYgLyogSEFWRV9TSVpFX1QgKi8KKworI2lmbmRlZiBTSVpFX01BWAorI2RlZmluZSBTSVpFX01BWCBTSVpFX1RfTUFYCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NTSVpFX1QKK3R5cGVkZWYgaW50IHNzaXplX3Q7CisjIGRlZmluZSBIQVZFX1NTSVpFX1QKKyNlbmRpZiAvKiBIQVZFX1NTSVpFX1QgKi8KKworI2lmbmRlZiBIQVZFX0NMT0NLX1QKK3R5cGVkZWYgbG9uZyBjbG9ja190OworIyBkZWZpbmUgSEFWRV9DTE9DS19UCisjZW5kaWYgLyogSEFWRV9DTE9DS19UICovCisKKyNpZm5kZWYgSEFWRV9TQV9GQU1JTFlfVAordHlwZWRlZiBpbnQgc2FfZmFtaWx5X3Q7CisjIGRlZmluZSBIQVZFX1NBX0ZBTUlMWV9UCisjZW5kaWYgLyogSEFWRV9TQV9GQU1JTFlfVCAqLworCisjaWZuZGVmIEhBVkVfUElEX1QKK3R5cGVkZWYgaW50IHBpZF90OworIyBkZWZpbmUgSEFWRV9QSURfVAorI2VuZGlmIC8qIEhBVkVfUElEX1QgKi8KKworI2lmbmRlZiBIQVZFX1NJR19BVE9NSUNfVAordHlwZWRlZiBpbnQgc2lnX2F0b21pY190OworIyBkZWZpbmUgSEFWRV9TSUdfQVRPTUlDX1QKKyNlbmRpZiAvKiBIQVZFX1NJR19BVE9NSUNfVCAqLworCisjaWZuZGVmIEhBVkVfTU9ERV9UCit0eXBlZGVmIGludCBtb2RlX3Q7CisjIGRlZmluZSBIQVZFX01PREVfVAorI2VuZGlmIC8qIEhBVkVfTU9ERV9UICovCisKKyNpZiAhZGVmaW5lZChIQVZFX1NTX0ZBTUlMWV9JTl9TUykgJiYgZGVmaW5lZChIQVZFX19fU1NfRkFNSUxZX0lOX1NTKQorIyBkZWZpbmUgc3NfZmFtaWx5IF9fc3NfZmFtaWx5CisjZW5kaWYgLyogIWRlZmluZWQoSEFWRV9TU19GQU1JTFlfSU5fU1MpICYmIGRlZmluZWQoSEFWRV9TQV9GQU1JTFlfSU5fU1MpICovCisKKyNpZm5kZWYgSEFWRV9TWVNfVU5fSAorc3RydWN0CXNvY2thZGRyX3VuIHsKKwlzaG9ydAlzdW5fZmFtaWx5OwkJLyogQUZfVU5JWCAqLworCWNoYXIJc3VuX3BhdGhbMTA4XTsJCS8qIHBhdGggbmFtZSAoZ2FnKSAqLworfTsKKyNlbmRpZiAvKiBIQVZFX1NZU19VTl9IICovCisKKyNpZm5kZWYgSEFWRV9JTl9BRERSX1QKK3R5cGVkZWYgdV9pbnQzMl90CWluX2FkZHJfdDsKKyNlbmRpZgorI2lmbmRlZiBIQVZFX0lOX1BPUlRfVAordHlwZWRlZiB1X2ludDE2X3QJaW5fcG9ydF90OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJST0tFTl9TWVNfVEVSTUlPX0gpICYmICFkZWZpbmVkKF9TVFJVQ1RfV0lOU0laRSkKKyNkZWZpbmUgX1NUUlVDVF9XSU5TSVpFCitzdHJ1Y3Qgd2luc2l6ZSB7CisgICAgICB1bnNpZ25lZCBzaG9ydCB3c19yb3c7ICAgICAgICAgIC8qIHJvd3MsIGluIGNoYXJhY3RlcnMgKi8KKyAgICAgIHVuc2lnbmVkIHNob3J0IHdzX2NvbDsgICAgICAgICAgLyogY29sdW1ucywgaW4gY2hhcmFjdGVyICovCisgICAgICB1bnNpZ25lZCBzaG9ydCB3c194cGl4ZWw7ICAgICAgIC8qIGhvcml6b250YWwgc2l6ZSwgcGl4ZWxzICovCisgICAgICB1bnNpZ25lZCBzaG9ydCB3c195cGl4ZWw7ICAgICAgIC8qIHZlcnRpY2FsIHNpemUsIHBpeGVscyAqLworfTsKKyNlbmRpZgorCisvKiAqLSotbnRvLXFueCBkb2VzIG5vdCBkZWZpbmUgdGhpcyB0eXBlIGluIHRoZSBzeXN0ZW0gaGVhZGVycyAqLworI2lmZGVmIE1JU1NJTkdfRkRfTUFTSworIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQJZmRfbWFzazsKKyNlbmRpZgorCisvKiBQYXRocyAqLworCisjaWZuZGVmIF9QQVRIX0JTSEVMTAorIyBkZWZpbmUgX1BBVEhfQlNIRUxMICIvYmluL3NoIgorI2VuZGlmCisKKyNpZmRlZiBVU0VSX1BBVEgKKyMgaWZkZWYgX1BBVEhfU1REUEFUSAorIyAgdW5kZWYgX1BBVEhfU1REUEFUSAorIyBlbmRpZgorIyBkZWZpbmUgX1BBVEhfU1REUEFUSCBVU0VSX1BBVEgKKyNlbmRpZgorCisjaWZuZGVmIF9QQVRIX1NURFBBVEgKKyMgZGVmaW5lIF9QQVRIX1NURFBBVEggIi91c3IvYmluOi9iaW46L3Vzci9zYmluOi9zYmluIgorI2VuZGlmCisKKyNpZm5kZWYgU1VQRVJVU0VSX1BBVEgKKyMgZGVmaW5lIFNVUEVSVVNFUl9QQVRICV9QQVRIX1NURFBBVEgKKyNlbmRpZgorCisjaWZuZGVmIF9QQVRIX0RFVk5VTEwKKyMgZGVmaW5lIF9QQVRIX0RFVk5VTEwgIi9kZXYvbnVsbCIKKyNlbmRpZgorCisvKiB1c2VyIG1heSBoYXZlIHNldCBhIGRpZmZlcmVudCBwYXRoICovCisjaWYgZGVmaW5lZChfUEFUSF9NQUlMRElSKSAmJiBkZWZpbmVkKE1BSUxfRElSRUNUT1JZKQorIyB1bmRlZiBfUEFUSF9NQUlMRElSIE1BSUxESVIKKyNlbmRpZiAvKiBkZWZpbmVkKF9QQVRIX01BSUxESVIpICYmIGRlZmluZWQoTUFJTF9ESVJFQ1RPUlkpICovCisKKyNpZmRlZiBNQUlMX0RJUkVDVE9SWQorIyBkZWZpbmUgX1BBVEhfTUFJTERJUiBNQUlMX0RJUkVDVE9SWQorI2VuZGlmCisKKyNpZm5kZWYgX1BBVEhfTk9MT0dJTgorIyBkZWZpbmUgX1BBVEhfTk9MT0dJTiAiL2V0Yy9ub2xvZ2luIgorI2VuZGlmCisKKy8qIERlZmluZSB0aGlzIHRvIGJlIHRoZSBwYXRoIG9mIHRoZSB4YXV0aCBwcm9ncmFtLiAqLworI2lmZGVmIFhBVVRIX1BBVEgKKyNkZWZpbmUgX1BBVEhfWEFVVEggWEFVVEhfUEFUSAorI2VuZGlmIC8qIFhBVVRIX1BBVEggKi8KKworLyogZGVyaXZlZCBmcm9tIFhGNC94Yy9saWIvZHBzL1hsaWJuZXQuaCAqLworI2lmbmRlZiBYX1VOSVhfUEFUSAorIyAgaWZkZWYgX19ocHV4CisjICAgIGRlZmluZSBYX1VOSVhfUEFUSCAiL3Zhci9zcG9vbC9zb2NrZXRzL1gxMS8ldSIKKyMgIGVsc2UKKyMgICAgZGVmaW5lIFhfVU5JWF9QQVRIICIvdG1wLy5YMTEtdW5peC9YJXUiCisjICBlbmRpZgorI2VuZGlmIC8qIFhfVU5JWF9QQVRIICovCisjZGVmaW5lIF9QQVRIX1VOSVhfWCBYX1VOSVhfUEFUSAorCisjaWZuZGVmIF9QQVRIX1RUWQorIyBkZWZpbmUgX1BBVEhfVFRZICIvZGV2L3R0eSIKKyNlbmRpZgorCisvKiBNYWNyb3MgKi8KKworI2lmIGRlZmluZWQoSEFWRV9MT0dJTl9HRVRDQVBCT09MKSAmJiBkZWZpbmVkKEhBVkVfTE9HSU5fQ0FQX0gpCisjIGRlZmluZSBIQVZFX0xPR0lOX0NBUAorI2VuZGlmCisKKyNpZm5kZWYgTUFYCisjIGRlZmluZSBNQVgoYSxiKSAoKChhKT4oYikpPyhhKTooYikpCisjIGRlZmluZSBNSU4oYSxiKSAoKChhKTwoYikpPyhhKTooYikpCisjZW5kaWYKKworI2lmbmRlZiByb3VuZHVwCisjIGRlZmluZSByb3VuZHVwKHgsIHkpICAgKCgoKHgpKygoeSktMSkpLyh5KSkqKHkpKQorI2VuZGlmCisKKyNpZm5kZWYgdGltZXJzdWIKKyNkZWZpbmUgdGltZXJzdWIoYSwgYiwgcmVzdWx0KQkJCQkJXAorICAgZG8gewkJCQkJCQkJXAorICAgICAgKHJlc3VsdCktPnR2X3NlYyA9IChhKS0+dHZfc2VjIC0gKGIpLT50dl9zZWM7CQlcCisgICAgICAocmVzdWx0KS0+dHZfdXNlYyA9IChhKS0+dHZfdXNlYyAtIChiKS0+dHZfdXNlYzsJCVwKKyAgICAgIGlmICgocmVzdWx0KS0+dHZfdXNlYyA8IDApIHsJCQkJXAorCSAtLShyZXN1bHQpLT50dl9zZWM7CQkJCQlcCisJIChyZXN1bHQpLT50dl91c2VjICs9IDEwMDAwMDA7CQkJCVwKKyAgICAgIH0JCQkJCQkJCVwKKyAgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmbmRlZiBUSU1FVkFMX1RPX1RJTUVTUEVDCisjZGVmaW5lCVRJTUVWQUxfVE9fVElNRVNQRUModHYsIHRzKSB7CQkJCQlcCisJKHRzKS0+dHZfc2VjID0gKHR2KS0+dHZfc2VjOwkJCQkJXAorCSh0cyktPnR2X25zZWMgPSAodHYpLT50dl91c2VjICogMTAwMDsJCQkJXAorfQorI2VuZGlmCisKKyNpZm5kZWYgVElNRVNQRUNfVE9fVElNRVZBTAorI2RlZmluZQlUSU1FU1BFQ19UT19USU1FVkFMKHR2LCB0cykgewkJCQkJXAorCSh0diktPnR2X3NlYyA9ICh0cyktPnR2X3NlYzsJCQkJCVwKKwkodHYpLT50dl91c2VjID0gKHRzKS0+dHZfbnNlYyAvIDEwMDA7CQkJCVwKK30KKyNlbmRpZgorCisjaWZuZGVmIF9fUAorIyBkZWZpbmUgX19QKHgpIHgKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSU42X0lTX0FERFJfVjRNQVBQRUQpCisjIGRlZmluZSBJTjZfSVNfQUREUl9WNE1BUFBFRChhKSBcCisJKCgoKHVfaW50MzJfdCAqKSAoYSkpWzBdID09IDApICYmICgoKHVfaW50MzJfdCAqKSAoYSkpWzFdID09IDApICYmIFwKKwkgKCgodV9pbnQzMl90ICopIChhKSlbMl0gPT0gaHRvbmwgKDB4ZmZmZikpKQorI2VuZGlmIC8qICFkZWZpbmVkKElONl9JU19BRERSX1Y0TUFQUEVEKSAqLworCisjaWYgIWRlZmluZWQoX19HTlVDX18pIHx8IChfX0dOVUNfXyA8IDIpCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9fKHgpCisjZW5kaWYgLyogIWRlZmluZWQoX19HTlVDX18pIHx8IChfX0dOVUNfXyA8IDIpICovCisKKyNpZiAhZGVmaW5lZChIQVZFX0FUVFJJQlVURV9fU0VOVElORUxfXykgJiYgIWRlZmluZWQoX19zZW50aW5lbF9fKQorIyBkZWZpbmUgX19zZW50aW5lbF9fCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEhBVkVfQVRUUklCVVRFX19CT1VOREVEX18pICYmICFkZWZpbmVkKF9fYm91bmRlZF9fKQorIyBkZWZpbmUgX19ib3VuZGVkX18oeCwgeSwgeikKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSEFWRV9BVFRSSUJVVEVfX05PTk5VTExfXykgJiYgIWRlZmluZWQoX19ub25udWxsX18pCisjIGRlZmluZSBfX25vbm51bGxfXyh4KQorI2VuZGlmCisKKy8qICotKi1udG8tcW54IGRvZXNuJ3QgZGVmaW5lIHRoaXMgbWFjcm8gaW4gdGhlIHN5c3RlbSBoZWFkZXJzICovCisjaWZkZWYgTUlTU0lOR19IT1dNQU5ZCisjIGRlZmluZSBob3dtYW55KHgseSkJKCgoeCkrKCh5KS0xKSkvKHkpKQorI2VuZGlmCisKKyNpZm5kZWYgT1NTSF9BTElHTkJZVEVTCisjZGVmaW5lIE9TU0hfQUxJR05CWVRFUwkoc2l6ZW9mKGludCkgLSAxKQorI2VuZGlmCisjaWZuZGVmIF9fQ01TR19BTElHTgorI2RlZmluZQlfX0NNU0dfQUxJR04ocCkgKCgodV9pbnQpKHApICsgT1NTSF9BTElHTkJZVEVTKSAmfiBPU1NIX0FMSUdOQllURVMpCisjZW5kaWYKKworLyogTGVuZ3RoIG9mIHRoZSBjb250ZW50cyBvZiBhIGNvbnRyb2wgbWVzc2FnZSBvZiBsZW5ndGggbGVuICovCisjaWZuZGVmIENNU0dfTEVOCisjZGVmaW5lCUNNU0dfTEVOKGxlbikJKF9fQ01TR19BTElHTihzaXplb2Yoc3RydWN0IGNtc2doZHIpKSArIChsZW4pKQorI2VuZGlmCisKKy8qIExlbmd0aCBvZiB0aGUgc3BhY2UgdGFrZW4gdXAgYnkgYSBwYWRkZWQgY29udHJvbCBtZXNzYWdlIG9mIGxlbmd0aCBsZW4gKi8KKyNpZm5kZWYgQ01TR19TUEFDRQorI2RlZmluZQlDTVNHX1NQQUNFKGxlbikJKF9fQ01TR19BTElHTihzaXplb2Yoc3RydWN0IGNtc2doZHIpKSArIF9fQ01TR19BTElHTihsZW4pKQorI2VuZGlmCisKKy8qIGdpdmVuIHBvaW50ZXIgdG8gc3RydWN0IGNtc2doZHIsIHJldHVybiBwb2ludGVyIHRvIGRhdGEgKi8KKyNpZm5kZWYgQ01TR19EQVRBCisjZGVmaW5lIENNU0dfREFUQShjbXNnKSAoKHVfY2hhciAqKShjbXNnKSArIF9fQ01TR19BTElHTihzaXplb2Yoc3RydWN0IGNtc2doZHIpKSkKKyNlbmRpZiAvKiBDTVNHX0RBVEEgKi8KKworLyoKKyAqIFJGQyAyMjkyIHJlcXVpcmVzIHRvIGNoZWNrIG1zZ19jb250cm9sbGVuLCBpbiBjYXNlIHRoYXQgdGhlIGtlcm5lbCByZXR1cm5zCisgKiBhbiBlbXB0eSBsaXN0IGZvciBzb21lIHJlYXNvbnMuCisgKi8KKyNpZm5kZWYgQ01TR19GSVJTVEhEUgorI2RlZmluZSBDTVNHX0ZJUlNUSERSKG1oZHIpIFwKKwkoKG1oZHIpLT5tc2dfY29udHJvbGxlbiA+PSBzaXplb2Yoc3RydWN0IGNtc2doZHIpID8gXAorCSAoc3RydWN0IGNtc2doZHIgKikobWhkciktPm1zZ19jb250cm9sIDogXAorCSAoc3RydWN0IGNtc2doZHIgKilOVUxMKQorI2VuZGlmIC8qIENNU0dfRklSU1RIRFIgKi8KKworI2lmIGRlZmluZWQoSEFWRV9ERUNMX09GRlNFVE9GKSAmJiBIQVZFX0RFQ0xfT0ZGU0VUT0YgPT0gMAorIyBkZWZpbmUgb2Zmc2V0b2YodHlwZSwgbWVtYmVyKSAoKHNpemVfdCkgJigodHlwZSAqKTApLT5tZW1iZXIpCisjZW5kaWYKKworLyogU2V0IHVwIEJTRC1zdHlsZSBCWVRFX09SREVSIGRlZmluaXRpb24gaWYgaXQgaXNuJ3QgdGhlcmUgYWxyZWFkeSAqLworLyogWFhYOiBkb2Vzbid0IHRyeSB0byBjb3BlIHdpdGggc3RyYW5nZSBieXRlIG9yZGVycyAoUERQX0VORElBTikgKi8KKyNpZm5kZWYgQllURV9PUkRFUgorIyBpZm5kZWYgTElUVExFX0VORElBTgorIyAgZGVmaW5lIExJVFRMRV9FTkRJQU4gIDEyMzQKKyMgZW5kaWYgLyogTElUVExFX0VORElBTiAqLworIyBpZm5kZWYgQklHX0VORElBTgorIyAgZGVmaW5lIEJJR19FTkRJQU4gICAgIDQzMjEKKyMgZW5kaWYgLyogQklHX0VORElBTiAqLworIyBpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyMgIGRlZmluZSBCWVRFX09SREVSIEJJR19FTkRJQU4KKyMgZWxzZSAvKiBXT1JEU19CSUdFTkRJQU4gKi8KKyMgIGRlZmluZSBCWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKyMgZW5kaWYgLyogV09SRFNfQklHRU5ESUFOICovCisjZW5kaWYgLyogQllURV9PUkRFUiAqLworCisvKiBGdW5jdGlvbiByZXBsYWNlbWVudCAvIGNvbXBhdGliaWxpdHkgaGFja3MgKi8KKworI2lmICFkZWZpbmVkKEhBVkVfR0VUQUREUklORk8pICYmIChkZWZpbmVkKEhBVkVfT0dFVEFERFJJTkZPKSB8fCBkZWZpbmVkKEhBVkVfTkdFVEFERFJJTkZPKSkKKyMgZGVmaW5lIEhBVkVfR0VUQUREUklORk8KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfR0VUT1BUX09QVFJFU0VUCisjIHVuZGVmIGdldG9wdAorIyB1bmRlZiBvcHRlcnIKKyMgdW5kZWYgb3B0aW5kCisjIHVuZGVmIG9wdG9wdAorIyB1bmRlZiBvcHRyZXNldAorIyB1bmRlZiBvcHRhcmcKKyMgZGVmaW5lIGdldG9wdChhYywgYXYsIG8pICBCU0RnZXRvcHQoYWMsIGF2LCBvKQorIyBkZWZpbmUgb3B0ZXJyICAgICAgICAgICAgIEJTRG9wdGVycgorIyBkZWZpbmUgb3B0aW5kICAgICAgICAgICAgIEJTRG9wdGluZAorIyBkZWZpbmUgb3B0b3B0ICAgICAgICAgICAgIEJTRG9wdG9wdAorIyBkZWZpbmUgb3B0cmVzZXQgICAgICAgICAgIEJTRG9wdHJlc2V0CisjIGRlZmluZSBvcHRhcmcgICAgICAgICAgICAgQlNEb3B0YXJnCisjZW5kaWYKKworI2lmIGRlZmluZWQoQlJPS0VOX0dFVEFERFJJTkZPKSAmJiBkZWZpbmVkKEhBVkVfR0VUQUREUklORk8pCisjIHVuZGVmIEhBVkVfR0VUQUREUklORk8KKyNlbmRpZgorI2lmIGRlZmluZWQoQlJPS0VOX0dFVEFERFJJTkZPKSAmJiBkZWZpbmVkKEhBVkVfRlJFRUFERFJJTkZPKQorIyB1bmRlZiBIQVZFX0ZSRUVBRERSSU5GTworI2VuZGlmCisjaWYgZGVmaW5lZChCUk9LRU5fR0VUQUREUklORk8pICYmIGRlZmluZWQoSEFWRV9HQUlfU1RSRVJST1IpCisjIHVuZGVmIEhBVkVfR0FJX1NUUkVSUk9SCisjZW5kaWYKKworI2lmIGRlZmluZWQoQlJPS0VOX1VQRFdUTVBYKSAmJiBkZWZpbmVkKEhBVkVfVVBEV1RNUFgpCisjIHVuZGVmIEhBVkVfVVBEV1RNUFgKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCUk9LRU5fU0hBRE9XX0VYUElSRSkgJiYgZGVmaW5lZChIQVNfU0hBRE9XX0VYUElSRSkKKyMgdW5kZWYgSEFTX1NIQURPV19FWFBJUkUKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX09QRU5MT0dfUikgJiYgZGVmaW5lZChTWVNMT0dfREFUQV9JTklUKSAmJiBcCisgICAgZGVmaW5lZChTWVNMT0dfUl9TQUZFX0lOX1NJR0hBTkQpCisjIGRlZmluZSBET19MT0dfU0FGRV9JTl9TSUdIQU5ECisjZW5kaWYKKworI2lmICFkZWZpbmVkKEhBVkVfTUVNTU9WRSkgJiYgZGVmaW5lZChIQVZFX0JDT1BZKQorIyBkZWZpbmUgbWVtbW92ZShzMSwgczIsIG4pIGJjb3B5KChzMiksIChzMSksIChuKSkKKyNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX01FTU1PVkUpICYmIGRlZmluZWQoSEFWRV9CQ09QWSkgKi8KKworI2lmIGRlZmluZWQoSEFWRV9WSEFOR1VQKSAmJiAhZGVmaW5lZChIQVZFX0RFVl9QVE1YKQorIyAgZGVmaW5lIFVTRV9WSEFOR1VQCisjZW5kaWYgLyogZGVmaW5lZChIQVZFX1ZIQU5HVVApICYmICFkZWZpbmVkKEhBVkVfREVWX1BUTVgpICovCisKKyNpZm5kZWYgR0VUUEdSUF9WT0lECisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBkZWZpbmUgZ2V0cGdycCgpIGdldHBncnAoMCkKKyNlbmRpZgorCisjaWZkZWYgVVNFX0JTTV9BVURJVAorIyBkZWZpbmUgU1NIX0FVRElUX0VWRU5UUworIyBkZWZpbmUgQ1VTVE9NX1NTSF9BVURJVF9FVkVOVFMKKyNlbmRpZgorCisjaWZkZWYgVVNFX0xJTlVYX0FVRElUCisjIGRlZmluZSBTU0hfQVVESVRfRVZFTlRTCisjIGRlZmluZSBDVVNUT01fU1NIX0FVRElUX0VWRU5UUworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChIQVZFX19fZnVuY19fKSAmJiBkZWZpbmVkKEhBVkVfX19GVU5DVElPTl9fKQorIyAgZGVmaW5lIF9fZnVuY19fIF9fRlVOQ1RJT05fXworI2VsaWYgIWRlZmluZWQoSEFWRV9fX2Z1bmNfXykKKyMgIGRlZmluZSBfX2Z1bmNfXyAiIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEtSQjUpICYmICFkZWZpbmVkKEhFSU1EQUwpCisjICBkZWZpbmUga3JiNV9nZXRfZXJyX3RleHQoY29udGV4dCxjb2RlKSBlcnJvcl9tZXNzYWdlKGNvZGUpCisjZW5kaWYKKworI2lmIGRlZmluZWQoU0tFWUNIQUxMRU5HRV80QVJHKQorIyBkZWZpbmUgX2NvbXBhdF9za2V5Y2hhbGxlbmdlKGEsYixjLGQpIHNrZXljaGFsbGVuZ2UoYSxiLGMsZCkKKyNlbHNlCisjIGRlZmluZSBfY29tcGF0X3NrZXljaGFsbGVuZ2UoYSxiLGMsZCkgc2tleWNoYWxsZW5nZShhLGIsYykKKyNlbmRpZgorCisvKiBNYXhpbXVtIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZSAqLworI2lmZGVmIEhBVkVfU1lTQ09ORgorIyBkZWZpbmUgU1NIX1NZU0ZETUFYIHN5c2NvbmYoX1NDX09QRU5fTUFYKQorI2Vsc2UKKyMgZGVmaW5lIFNTSF9TWVNGRE1BWCAxMDAwMAorI2VuZGlmCisKKyNpZmRlZiBGU0lEX0hBU19WQUwKKy8qIGVuY29kZSBmX2ZzaWQgaW50byBhIDY0IGJpdCB2YWx1ZSAgKi8KKyNkZWZpbmUgRlNJRF9UT19VTE9ORyhmKSBcCisJKCgoKHVfaW50NjRfdCkoZikudmFsWzBdICYgMHhmZmZmZmZmZlVMKSA8PCAzMikgfCBcCisJICAgICgoZikudmFsWzFdICYgMHhmZmZmZmZmZlVMKSkKKyNlbGlmIGRlZmluZWQoRlNJRF9IQVNfX19WQUwpCisjZGVmaW5lIEZTSURfVE9fVUxPTkcoZikgXAorCSgoKCh1X2ludDY0X3QpKGYpLl9fdmFsWzBdICYgMHhmZmZmZmZmZlVMKSA8PCAzMikgfCBcCisJICAgICgoZikuX192YWxbMV0gJiAweGZmZmZmZmZmVUwpKQorI2Vsc2UKKyMgZGVmaW5lIEZTSURfVE9fVUxPTkcoZikgKChmKSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0x5bnhfXykKKyAvKgorICAqIEx5bnhPUyBkZWZpbmVzIHRoZXNlIGluIHBhcmFtLmggd2hpY2ggd2UgZG8gbm90IHdhbnQgdG8gaW5jbHVkZSBzaW5jZQorICAqIGl0IHdpbGwgYWxzbyBwdWxsIGluIGEgYnVuY2ggb2Yga2VybmVsIGRlZmluaXRpb25zLgorICAqLworIyBkZWZpbmUgQUxJR05CWVRFUyAoc2l6ZW9mKGludCkgLSAxKQorIyBkZWZpbmUgQUxJR04ocCkgKCgodW5zaWduZWQpcCArIEFMSUdOQllURVMpICYgfkFMSUdOQllURVMpCisgIC8qIE1pc3NpbmcgcHJvdG90eXBlcyBvbiBMeW54T1MgKi8KKyAgaW50IHNucHJpbnRmIChjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCAuLi4pOworICBpbnQgbWtzdGVtcCAoY2hhciAqKTsKKyAgY2hhciAqY3J5cHQgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKyAgaW50IHNldGV1aWQgKHVpZF90KTsKKyAgaW50IHNldGVnaWQgKGdpZF90KTsKKyAgY2hhciAqbWtkdGVtcCAoY2hhciAqKTsKKyAgaW50IHJyZXN2cG9ydF9hZiAoaW50ICosIHNhX2ZhbWlseV90KTsKKyAgaW50IGlubmV0Z3IgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisjZW5kaWYKKworLyoKKyAqIERlZmluZSB0aGlzIHRvIHVzZSBwaXBlcyBpbnN0ZWFkIG9mIHNvY2tldHBhaXJzIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlCisgKiBjbGllbnQgcHJvZ3JhbS4gIFNvY2tldHBhaXJzIGRvIG5vdCBzZWVtIHRvIHdvcmsgb24gYWxsIHN5c3RlbXMuCisgKgorICogY29uZmlndXJlLmFjIHNldHMgdGhpcyBmb3IgYSBmZXcgT1MncyB3aGljaCBhcmUga25vd24gdG8gaGF2ZSBwcm9ibGVtcworICogYnV0IHlvdSBtYXkgbmVlZCB0byBzZXQgaXQgeW91cnNlbGYKKyAqLworLyogI2RlZmluZSBVU0VfUElQRVMgMSAqLworCisvKioKKyAqKiBsb2dpbiByZWNvcmRlciBkZWZpbml0aW9ucworICoqLworCisvKiBGSVhNRTogcHV0IGRlZmF1bHQgcGF0aHMgYmFjayBpbiAqLworI2lmbmRlZiBVVE1QX0ZJTEUKKyMgIGlmZGVmIF9QQVRIX1VUTVAKKyMgICAgZGVmaW5lIFVUTVBfRklMRSBfUEFUSF9VVE1QCisjICBlbHNlCisjICAgIGlmZGVmIENPTkZfVVRNUF9GSUxFCisjICAgICAgZGVmaW5lIFVUTVBfRklMRSBDT05GX1VUTVBfRklMRQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBXVE1QX0ZJTEUKKyMgIGlmZGVmIF9QQVRIX1dUTVAKKyMgICAgZGVmaW5lIFdUTVBfRklMRSBfUEFUSF9XVE1QCisjICBlbHNlCisjICAgIGlmZGVmIENPTkZfV1RNUF9GSUxFCisjICAgICAgZGVmaW5lIFdUTVBfRklMRSBDT05GX1dUTVBfRklMRQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorLyogcGljayB1cCB0aGUgdXNlcidzIGxvY2F0aW9uIGZvciBsYXN0bG9nIGlmIGdpdmVuICovCisjaWZuZGVmIExBU1RMT0dfRklMRQorIyAgaWZkZWYgX1BBVEhfTEFTVExPRworIyAgICBkZWZpbmUgTEFTVExPR19GSUxFIF9QQVRIX0xBU1RMT0cKKyMgIGVsc2UKKyMgICAgaWZkZWYgQ09ORl9MQVNUTE9HX0ZJTEUKKyMgICAgICBkZWZpbmUgTEFTVExPR19GSUxFIENPTkZfTEFTVExPR19GSUxFCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhBVkVfU0hBRE9XX0gpICYmICFkZWZpbmVkKERJU0FCTEVfU0hBRE9XKQorIyBkZWZpbmUgVVNFX1NIQURPVworI2VuZGlmCisKKy8qIFRoZSBsb2dpbigpIGxpYnJhcnkgZnVuY3Rpb24gaW4gbGlidXRpbCBpcyBmaXJzdCBjaG9pY2UgKi8KKyNpZiBkZWZpbmVkKEhBVkVfTE9HSU4pICYmICFkZWZpbmVkKERJU0FCTEVfTE9HSU4pCisjICBkZWZpbmUgVVNFX0xPR0lOCisKKyNlbHNlCisvKiBTaW1wbHkgc2VsZWN0IHlvdXIgZmF2b3VyaXRlIGxvZ2luIHR5cGVzLiAqLworLyogQ2FuJ3QgZG8gaWYtZWxzZSBiZWNhdXNlIHNvbWUgc3lzdGVtcyB1c2Ugc2V2ZXJhbC4uLiA8c2lnaD4gKi8KKyMgIGlmICFkZWZpbmVkKERJU0FCTEVfVVRNUFgpCisjICAgIGRlZmluZSBVU0VfVVRNUFgKKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkKFVUTVBfRklMRSkgJiYgIWRlZmluZWQoRElTQUJMRV9VVE1QKQorIyAgICBkZWZpbmUgVVNFX1VUTVAKKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkKFdUTVBYX0ZJTEUpICYmICFkZWZpbmVkKERJU0FCTEVfV1RNUFgpCisjICAgIGRlZmluZSBVU0VfV1RNUFgKKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkKFdUTVBfRklMRSkgJiYgIWRlZmluZWQoRElTQUJMRV9XVE1QKQorIyAgICBkZWZpbmUgVVNFX1dUTVAKKyMgIGVuZGlmCisKKyNlbmRpZgorCisjaWZuZGVmIFVUX0xJTkVTSVpFCisjIGRlZmluZSBVVF9MSU5FU0laRSA4CisjZW5kaWYKKworLyogSSBob3BlIHRoYXQgdGhlIHByZXNlbmNlIG9mIExBU1RMT0dfRklMRSBpcyBlbm91Z2ggdG8gZGV0ZWN0IHRoaXMgKi8KKyNpZiBkZWZpbmVkKExBU1RMT0dfRklMRSkgJiYgIWRlZmluZWQoRElTQUJMRV9MQVNUTE9HKQorIyAgZGVmaW5lIFVTRV9MQVNUTE9HCisjZW5kaWYKKworI2lmZGVmIEhBVkVfT1NGX1NJQQorIyBpZmRlZiBVU0VfU0hBRE9XCisjICB1bmRlZiBVU0VfU0hBRE9XCisjIGVuZGlmCisjIGRlZmluZSBDVVNUT01fU1lTX0FVVEhfUEFTU1dEIDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX0xJQklBRikgJiYgZGVmaW5lZChIQVZFX1NFVF9JRCkgJiYgIWRlZmluZWQoSEFWRV9TRUNVUkVXQVJFKQorIyBkZWZpbmUgQ1VTVE9NX1NZU19BVVRIX1BBU1NXRCAxCisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBVkVfTElCSUFGKSAmJiBkZWZpbmVkKEhBVkVfU0VUX0lEKSAmJiAhZGVmaW5lZChCUk9LRU5fTElCSUFGKQorIyBkZWZpbmUgVVNFX0xJQklBRgorI2VuZGlmCisKKy8qIEhQLVVYIDExLjExICovCisjaWZkZWYgQlRNUF9GSUxFCisjIGRlZmluZSBfUEFUSF9CVE1QIEJUTVBfRklMRQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFVTRV9CVE1QKSAmJiBkZWZpbmVkKF9QQVRIX0JUTVApCisjIGRlZmluZSBDVVNUT01fRkFJTEVEX0xPR0lOCisjZW5kaWYKKworLyoqIGVuZCBvZiBsb2dpbiByZWNvcmRlciBkZWZpbml0aW9ucyAqLworCisjaWZkZWYgQlJPS0VOX0dFVEdST1VQUworIyBkZWZpbmUgZ2V0Z3JvdXBzKGEsYikgKChhKT09MCAmJiAoYik9PU5VTEwgPyBOR1JPVVBTX01BWCA6IGdldGdyb3VwcygoYSksKGIpKSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX01NQVApICYmIGRlZmluZWQoQlJPS0VOX01NQVApCisjIHVuZGVmIEhBVkVfTU1BUAorI2VuZGlmCisKKyNpZm5kZWYgSU9WX01BWAorIyBpZiBkZWZpbmVkKF9YT1BFTl9JT1ZfTUFYKQorIyAgZGVmaW5lCUlPVl9NQVgJCV9YT1BFTl9JT1ZfTUFYCisjIGVsaWYgZGVmaW5lZChERUZfSU9WX01BWCkKKyMgIGRlZmluZQlJT1ZfTUFYCQlERUZfSU9WX01BWAorIyBlbHNlCisjICBkZWZpbmUJSU9WX01BWAkJMTYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEVXT1VMREJMT0NLCisjIGRlZmluZSBFV09VTERCTE9DSyBFQUdBSU4KKyNlbmRpZgorCisjaWZuZGVmIElORVQ2X0FERFJTVFJMRU4JLyogZm9yIG5vbiBJUHY2IG1hY2hpbmVzICovCisjZGVmaW5lIElORVQ2X0FERFJTVFJMRU4gNDYKKyNlbmRpZgorCisjaWZuZGVmIFNTSF9JT0JVRlNaCisjIGRlZmluZSBTU0hfSU9CVUZTWiA4MTkyCisjZW5kaWYKKworI2lmbmRlZiBfTlNJRworIyBpZmRlZiBOU0lHCisjICBkZWZpbmUgX05TSUcgTlNJRworIyBlbHNlCisjICBkZWZpbmUgX05TSUcgMTI4CisjIGVuZGlmCisjZW5kaWYKKworI2VuZGlmIC8qIF9ERUZJTkVTX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvZGguYyBiL29wZW5zc2gtNi4wcDEvZGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTQzY2ExCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9kaC5jCkBAIC0wLDAgKzEsMzQ4IEBACisvKiAkT3BlbkJTRDogZGguYyx2IDEuNDkgMjAxMS8xMi8wNyAwNTo0NDozOCBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgTmllbHMgUHJvdm9zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+CisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZGguaCIKKyNpbmNsdWRlICJwYXRobmFtZXMuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisKK3N0YXRpYyBpbnQKK3BhcnNlX3ByaW1lKGludCBsaW5lbnVtLCBjaGFyICpsaW5lLCBzdHJ1Y3QgZGhncm91cCAqZGhnKQoreworCWNoYXIgKmNwLCAqYXJnOworCWNoYXIgKnN0cnNpemUsICpnZW4sICpwcmltZTsKKwljb25zdCBjaGFyICplcnJzdHIgPSBOVUxMOworCWxvbmcgbG9uZyBuOworCisJY3AgPSBsaW5lOworCWlmICgoYXJnID0gc3RyZGVsaW0oJmNwKSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJLyogSWdub3JlIGxlYWRpbmcgd2hpdGVzcGFjZSAqLworCWlmICgqYXJnID09ICdcMCcpCisJCWFyZyA9IHN0cmRlbGltKCZjcCk7CisJaWYgKCFhcmcgfHwgISphcmcgfHwgKmFyZyA9PSAnIycpCisJCXJldHVybiAwOworCisJLyogdGltZSAqLworCWlmIChjcCA9PSBOVUxMIHx8ICphcmcgPT0gJ1wwJykKKwkJZ290byBmYWlsOworCWFyZyA9IHN0cnNlcCgmY3AsICIgIik7IC8qIHR5cGUgKi8KKwlpZiAoY3AgPT0gTlVMTCB8fCAqYXJnID09ICdcMCcpCisJCWdvdG8gZmFpbDsKKwkvKiBFbnN1cmUgdGhpcyBpcyBhIHNhZmUgcHJpbWUgKi8KKwluID0gc3RydG9udW0oYXJnLCAwLCA1LCAmZXJyc3RyKTsKKwlpZiAoZXJyc3RyICE9IE5VTEwgfHwgbiAhPSBNT0RVTElfVFlQRV9TQUZFKQorCQlnb3RvIGZhaWw7CisJYXJnID0gc3Ryc2VwKCZjcCwgIiAiKTsgLyogdGVzdHMgKi8KKwlpZiAoY3AgPT0gTlVMTCB8fCAqYXJnID09ICdcMCcpCisJCWdvdG8gZmFpbDsKKwkvKiBFbnN1cmUgcHJpbWUgaGFzIGJlZW4gdGVzdGVkIGFuZCBpcyBub3QgY29tcG9zaXRlICovCisJbiA9IHN0cnRvbnVtKGFyZywgMCwgMHgxZiwgJmVycnN0cik7CisJaWYgKGVycnN0ciAhPSBOVUxMIHx8CisJICAgIChuICYgTU9EVUxJX1RFU1RTX0NPTVBPU0lURSkgfHwgIShuICYgfk1PRFVMSV9URVNUU19DT01QT1NJVEUpKQorCQlnb3RvIGZhaWw7CisJYXJnID0gc3Ryc2VwKCZjcCwgIiAiKTsgLyogdHJpZXMgKi8KKwlpZiAoY3AgPT0gTlVMTCB8fCAqYXJnID09ICdcMCcpCisJCWdvdG8gZmFpbDsKKwluID0gc3RydG9udW0oYXJnLCAwLCAxPDwzMCwgJmVycnN0cik7CisJaWYgKGVycnN0ciAhPSBOVUxMIHx8IG4gPT0gMCkKKwkJZ290byBmYWlsOworCXN0cnNpemUgPSBzdHJzZXAoJmNwLCAiICIpOyAvKiBzaXplICovCisJaWYgKGNwID09IE5VTEwgfHwgKnN0cnNpemUgPT0gJ1wwJyB8fAorCSAgICAoZGhnLT5zaXplID0gKGludClzdHJ0b251bShzdHJzaXplLCAwLCA2NCoxMDI0LCAmZXJyc3RyKSkgPT0gMCB8fAorCSAgICBlcnJzdHIpCisJCWdvdG8gZmFpbDsKKwkvKiBUaGUgd2hvbGUgZ3JvdXAgaXMgb25lIGJpdCBsYXJnZXIgKi8KKwlkaGctPnNpemUrKzsKKwlnZW4gPSBzdHJzZXAoJmNwLCAiICIpOyAvKiBnZW4gKi8KKwlpZiAoY3AgPT0gTlVMTCB8fCAqZ2VuID09ICdcMCcpCisJCWdvdG8gZmFpbDsKKwlwcmltZSA9IHN0cnNlcCgmY3AsICIgIik7IC8qIHByaW1lICovCisJaWYgKGNwICE9IE5VTEwgfHwgKnByaW1lID09ICdcMCcpCisJCWdvdG8gZmFpbDsKKworCWlmICgoZGhnLT5nID0gQk5fbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCJwYXJzZV9wcmltZTogQk5fbmV3IGZhaWxlZCIpOworCWlmICgoZGhnLT5wID0gQk5fbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCJwYXJzZV9wcmltZTogQk5fbmV3IGZhaWxlZCIpOworCWlmIChCTl9oZXgyYm4oJmRoZy0+ZywgZ2VuKSA9PSAwKQorCQlnb3RvIGZhaWxjbGVhbjsKKworCWlmIChCTl9oZXgyYm4oJmRoZy0+cCwgcHJpbWUpID09IDApCisJCWdvdG8gZmFpbGNsZWFuOworCisJaWYgKEJOX251bV9iaXRzKGRoZy0+cCkgIT0gZGhnLT5zaXplKQorCQlnb3RvIGZhaWxjbGVhbjsKKworCWlmIChCTl9pc196ZXJvKGRoZy0+ZykgfHwgQk5faXNfb25lKGRoZy0+ZykpCisJCWdvdG8gZmFpbGNsZWFuOworCisJcmV0dXJuICgxKTsKKworIGZhaWxjbGVhbjoKKwlCTl9jbGVhcl9mcmVlKGRoZy0+Zyk7CisJQk5fY2xlYXJfZnJlZShkaGctPnApOworIGZhaWw6CisJZXJyb3IoIkJhZCBwcmltZSBkZXNjcmlwdGlvbiBpbiBsaW5lICVkIiwgbGluZW51bSk7CisJcmV0dXJuICgwKTsKK30KKworREggKgorY2hvb3NlX2RoKGludCBtaW4sIGludCB3YW50Yml0cywgaW50IG1heCkKK3sKKwlGSUxFICpmOworCWNoYXIgbGluZVs0MDk2XTsKKwlpbnQgYmVzdCwgYmVzdGNvdW50LCB3aGljaDsKKwlpbnQgbGluZW51bTsKKwlzdHJ1Y3QgZGhncm91cCBkaGc7CisKKwlpZiAoKGYgPSBmb3BlbihfUEFUSF9ESF9NT0RVTEksICJyIikpID09IE5VTEwgJiYKKwkgICAgKGYgPSBmb3BlbihfUEFUSF9ESF9QUklNRVMsICJyIikpID09IE5VTEwpIHsKKwkJbG9naXQoIldBUk5JTkc6ICVzIGRvZXMgbm90IGV4aXN0LCB1c2luZyBmaXhlZCBtb2R1bHVzIiwKKwkJICAgIF9QQVRIX0RIX01PRFVMSSk7CisJCXJldHVybiAoZGhfbmV3X2dyb3VwMTQoKSk7CisJfQorCisJbGluZW51bSA9IDA7CisJYmVzdCA9IGJlc3Rjb3VudCA9IDA7CisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHsKKwkJbGluZW51bSsrOworCQlpZiAoIXBhcnNlX3ByaW1lKGxpbmVudW0sIGxpbmUsICZkaGcpKQorCQkJY29udGludWU7CisJCUJOX2NsZWFyX2ZyZWUoZGhnLmcpOworCQlCTl9jbGVhcl9mcmVlKGRoZy5wKTsKKworCQlpZiAoZGhnLnNpemUgPiBtYXggfHwgZGhnLnNpemUgPCBtaW4pCisJCQljb250aW51ZTsKKworCQlpZiAoKGRoZy5zaXplID4gd2FudGJpdHMgJiYgZGhnLnNpemUgPCBiZXN0KSB8fAorCQkgICAgKGRoZy5zaXplID4gYmVzdCAmJiBiZXN0IDwgd2FudGJpdHMpKSB7CisJCQliZXN0ID0gZGhnLnNpemU7CisJCQliZXN0Y291bnQgPSAwOworCQl9CisJCWlmIChkaGcuc2l6ZSA9PSBiZXN0KQorCQkJYmVzdGNvdW50Kys7CisJfQorCXJld2luZChmKTsKKworCWlmIChiZXN0Y291bnQgPT0gMCkgeworCQlmY2xvc2UoZik7CisJCWxvZ2l0KCJXQVJOSU5HOiBubyBzdWl0YWJsZSBwcmltZXMgaW4gJXMiLCBfUEFUSF9ESF9QUklNRVMpOworCQlyZXR1cm4gKGRoX25ld19ncm91cDE0KCkpOworCX0KKworCWxpbmVudW0gPSAwOworCXdoaWNoID0gYXJjNHJhbmRvbV91bmlmb3JtKGJlc3Rjb3VudCk7CisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHsKKwkJaWYgKCFwYXJzZV9wcmltZShsaW5lbnVtLCBsaW5lLCAmZGhnKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKGRoZy5zaXplID4gbWF4IHx8IGRoZy5zaXplIDwgbWluKSB8fAorCQkgICAgZGhnLnNpemUgIT0gYmVzdCB8fAorCQkgICAgbGluZW51bSsrICE9IHdoaWNoKSB7CisJCQlCTl9jbGVhcl9mcmVlKGRoZy5nKTsKKwkJCUJOX2NsZWFyX2ZyZWUoZGhnLnApOworCQkJY29udGludWU7CisJCX0KKwkJYnJlYWs7CisJfQorCWZjbG9zZShmKTsKKwlpZiAobGluZW51bSAhPSB3aGljaCsxKQorCQlmYXRhbCgiV0FSTklORzogbGluZSAlZCBkaXNhcHBlYXJlZCBpbiAlcywgZ2l2aW5nIHVwIiwKKwkJICAgIHdoaWNoLCBfUEFUSF9ESF9QUklNRVMpOworCisJcmV0dXJuIChkaF9uZXdfZ3JvdXAoZGhnLmcsIGRoZy5wKSk7Cit9CisKKy8qIGRpZmZpZS1oZWxsbWFuLWdyb3VwTi1zaGExICovCisKK2ludAorZGhfcHViX2lzX3ZhbGlkKERIICpkaCwgQklHTlVNICpkaF9wdWIpCit7CisJaW50IGk7CisJaW50IG4gPSBCTl9udW1fYml0cyhkaF9wdWIpOworCWludCBiaXRzX3NldCA9IDA7CisJQklHTlVNICp0bXA7CisKKwlpZiAoZGhfcHViLT5uZWcpIHsKKwkJbG9naXQoImludmFsaWQgcHVibGljIERIIHZhbHVlOiBuZWdhdGl2ZSIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKEJOX2NtcChkaF9wdWIsIEJOX3ZhbHVlX29uZSgpKSAhPSAxKSB7CS8qIHB1Yl9leHAgPD0gMSAqLworCQlsb2dpdCgiaW52YWxpZCBwdWJsaWMgREggdmFsdWU6IDw9IDEiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCh0bXAgPSBCTl9uZXcoKSkgPT0gTlVMTCkgeworCQllcnJvcigiJXM6IEJOX25ldyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIUJOX3N1Yih0bXAsIGRoLT5wLCBCTl92YWx1ZV9vbmUoKSkgfHwKKwkgICAgQk5fY21wKGRoX3B1YiwgdG1wKSAhPSAtMSkgewkJLyogcHViX2V4cCA+IHAtMiAqLworCQlCTl9jbGVhcl9mcmVlKHRtcCk7CisJCWxvZ2l0KCJpbnZhbGlkIHB1YmxpYyBESCB2YWx1ZTogPj0gcC0xIik7CisJCXJldHVybiAwOworCX0KKwlCTl9jbGVhcl9mcmVlKHRtcCk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IG47IGkrKykKKwkJaWYgKEJOX2lzX2JpdF9zZXQoZGhfcHViLCBpKSkKKwkJCWJpdHNfc2V0Kys7CisJZGVidWcyKCJiaXRzIHNldDogJWQvJWQiLCBiaXRzX3NldCwgQk5fbnVtX2JpdHMoZGgtPnApKTsKKworCS8qIGlmIGc9PTIgYW5kIGJpdHNfc2V0PT0xIHRoZW4gY29tcHV0aW5nIGxvZ19nKGRoX3B1YikgaXMgdHJpdmlhbCAqLworCWlmIChiaXRzX3NldCA+IDEpCisJCXJldHVybiAxOworCisJbG9naXQoImludmFsaWQgcHVibGljIERIIHZhbHVlICglZC8lZCkiLCBiaXRzX3NldCwgQk5fbnVtX2JpdHMoZGgtPnApKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZAorZGhfZ2VuX2tleShESCAqZGgsIGludCBuZWVkKQoreworCWludCBpLCBiaXRzX3NldCwgdHJpZXMgPSAwOworCisJaWYgKG5lZWQgPCAwKQorCQlmYXRhbCgiZGhfZ2VuX2tleTogbmVlZCA8IDAiKTsKKwlpZiAoZGgtPnAgPT0gTlVMTCkKKwkJZmF0YWwoImRoX2dlbl9rZXk6IGRoLT5wID09IE5VTEwiKTsKKwlpZiAobmVlZCA+IElOVF9NQVggLyAyIHx8IDIgKiBuZWVkID49IEJOX251bV9iaXRzKGRoLT5wKSkKKwkJZmF0YWwoImRoX2dlbl9rZXk6IGdyb3VwIHRvbyBzbWFsbDogJWQgKDIqbmVlZCAlZCkiLAorCQkgICAgQk5fbnVtX2JpdHMoZGgtPnApLCAyKm5lZWQpOworCWRvIHsKKwkJaWYgKGRoLT5wcml2X2tleSAhPSBOVUxMKQorCQkJQk5fY2xlYXJfZnJlZShkaC0+cHJpdl9rZXkpOworCQlpZiAoKGRoLT5wcml2X2tleSA9IEJOX25ldygpKSA9PSBOVUxMKQorCQkJZmF0YWwoImRoX2dlbl9rZXk6IEJOX25ldyBmYWlsZWQiKTsKKwkJLyogZ2VuZXJhdGUgYSAyKm5lZWQgYml0cyByYW5kb20gcHJpdmF0ZSBleHBvbmVudCAqLworCQlpZiAoIUJOX3JhbmQoZGgtPnByaXZfa2V5LCAyKm5lZWQsIDAsIDApKQorCQkJZmF0YWwoImRoX2dlbl9rZXk6IEJOX3JhbmQgZmFpbGVkIik7CisJCWlmIChESF9nZW5lcmF0ZV9rZXkoZGgpID09IDApCisJCQlmYXRhbCgiREhfZ2VuZXJhdGVfa2V5Iik7CisJCWZvciAoaSA9IDAsIGJpdHNfc2V0ID0gMDsgaSA8PSBCTl9udW1fYml0cyhkaC0+cHJpdl9rZXkpOyBpKyspCisJCQlpZiAoQk5faXNfYml0X3NldChkaC0+cHJpdl9rZXksIGkpKQorCQkJCWJpdHNfc2V0Kys7CisJCWRlYnVnMigiZGhfZ2VuX2tleTogcHJpdiBrZXkgYml0cyBzZXQ6ICVkLyVkIiwKKwkJICAgIGJpdHNfc2V0LCBCTl9udW1fYml0cyhkaC0+cHJpdl9rZXkpKTsKKwkJaWYgKHRyaWVzKysgPiAxMCkKKwkJCWZhdGFsKCJkaF9nZW5fa2V5OiB0b28gbWFueSBiYWQga2V5czogZ2l2aW5nIHVwIik7CisJfSB3aGlsZSAoIWRoX3B1Yl9pc192YWxpZChkaCwgZGgtPnB1Yl9rZXkpKTsKK30KKworREggKgorZGhfbmV3X2dyb3VwX2FzYyhjb25zdCBjaGFyICpnZW4sIGNvbnN0IGNoYXIgKm1vZHVsdXMpCit7CisJREggKmRoOworCisJaWYgKChkaCA9IERIX25ldygpKSA9PSBOVUxMKQorCQlmYXRhbCgiZGhfbmV3X2dyb3VwX2FzYzogREhfbmV3Iik7CisKKwlpZiAoQk5faGV4MmJuKCZkaC0+cCwgbW9kdWx1cykgPT0gMCkKKwkJZmF0YWwoIkJOX2hleDJibiBwIik7CisJaWYgKEJOX2hleDJibigmZGgtPmcsIGdlbikgPT0gMCkKKwkJZmF0YWwoIkJOX2hleDJibiBnIik7CisKKwlyZXR1cm4gKGRoKTsKK30KKworLyoKKyAqIFRoaXMganVzdCByZXR1cm5zIHRoZSBncm91cCwgd2Ugc3RpbGwgbmVlZCB0byBnZW5lcmF0ZSB0aGUgZXhjaGFuZ2UKKyAqIHZhbHVlLgorICovCisKK0RIICoKK2RoX25ld19ncm91cChCSUdOVU0gKmdlbiwgQklHTlVNICptb2R1bHVzKQoreworCURIICpkaDsKKworCWlmICgoZGggPSBESF9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoImRoX25ld19ncm91cDogREhfbmV3Iik7CisJZGgtPnAgPSBtb2R1bHVzOworCWRoLT5nID0gZ2VuOworCisJcmV0dXJuIChkaCk7Cit9CisKK0RIICoKK2RoX25ld19ncm91cDEodm9pZCkKK3sKKwlzdGF0aWMgY2hhciAqZ2VuID0gIjIiLCAqZ3JvdXAxID0KKwkgICAgIkZGRkZGRkZGIiAiRkZGRkZGRkYiICJDOTBGREFBMiIgIjIxNjhDMjM0IiAiQzRDNjYyOEIiICI4MERDMUNEMSIKKwkgICAgIjI5MDI0RTA4IiAiOEE2N0NDNzQiICIwMjBCQkVBNiIgIjNCMTM5QjIyIiAiNTE0QTA4NzkiICI4RTM0MDRERCIKKwkgICAgIkVGOTUxOUIzIiAiQ0QzQTQzMUIiICIzMDJCMEE2RCIgIkYyNUYxNDM3IiAiNEZFMTM1NkQiICI2RDUxQzI0NSIKKwkgICAgIkU0ODVCNTc2IiAiNjI1RTdFQzYiICJGNDRDNDJFOSIgIkE2MzdFRDZCIiAiMEJGRjVDQjYiICJGNDA2QjdFRCIKKwkgICAgIkVFMzg2QkZCIiAiNUE4OTlGQTUiICJBRTlGMjQxMSIgIjdDNEIxRkU2IiAiNDkyODY2NTEiICJFQ0U2NTM4MSIKKwkgICAgIkZGRkZGRkZGIiAiRkZGRkZGRkYiOworCisJcmV0dXJuIChkaF9uZXdfZ3JvdXBfYXNjKGdlbiwgZ3JvdXAxKSk7Cit9CisKK0RIICoKK2RoX25ld19ncm91cDE0KHZvaWQpCit7CisJc3RhdGljIGNoYXIgKmdlbiA9ICIyIiwgKmdyb3VwMTQgPQorCSAgICAiRkZGRkZGRkYiICJGRkZGRkZGRiIgIkM5MEZEQUEyIiAiMjE2OEMyMzQiICJDNEM2NjI4QiIgIjgwREMxQ0QxIgorCSAgICAiMjkwMjRFMDgiICI4QTY3Q0M3NCIgIjAyMEJCRUE2IiAiM0IxMzlCMjIiICI1MTRBMDg3OSIgIjhFMzQwNEREIgorCSAgICAiRUY5NTE5QjMiICJDRDNBNDMxQiIgIjMwMkIwQTZEIiAiRjI1RjE0MzciICI0RkUxMzU2RCIgIjZENTFDMjQ1IgorCSAgICAiRTQ4NUI1NzYiICI2MjVFN0VDNiIgIkY0NEM0MkU5IiAiQTYzN0VENkIiICIwQkZGNUNCNiIgIkY0MDZCN0VEIgorCSAgICAiRUUzODZCRkIiICI1QTg5OUZBNSIgIkFFOUYyNDExIiAiN0M0QjFGRTYiICI0OTI4NjY1MSIgIkVDRTQ1QjNEIgorCSAgICAiQzIwMDdDQjgiICJBMTYzQkYwNSIgIjk4REE0ODM2IiAiMUM1NUQzOUEiICI2OTE2M0ZBOCIgIkZEMjRDRjVGIgorCSAgICAiODM2NTVEMjMiICJEQ0EzQUQ5NiIgIjFDNjJGMzU2IiAiMjA4NTUyQkIiICI5RUQ1MjkwNyIgIjcwOTY5NjZEIgorCSAgICAiNjcwQzM1NEUiICI0QUJDOTgwNCIgIkYxNzQ2QzA4IiAiQ0ExODIxN0MiICIzMjkwNUU0NiIgIjJFMzZDRTNCIgorCSAgICAiRTM5RTc3MkMiICIxODBFODYwMyIgIjlCMjc4M0EyIiAiRUMwN0EyOEYiICJCNUM1NURGMCIgIjZGNEM1MkM5IgorCSAgICAiREUyQkNCRjYiICI5NTU4MTcxOCIgIjM5OTU0OTdDIiAiRUE5NTZBRTUiICIxNUQyMjYxOCIgIjk4RkEwNTEwIgorCSAgICAiMTU3MjhFNUEiICI4QUFDQUE2OCIgIkZGRkZGRkZGIiAiRkZGRkZGRkYiOworCisJcmV0dXJuIChkaF9uZXdfZ3JvdXBfYXNjKGdlbiwgZ3JvdXAxNCkpOworfQorCisvKgorICogRXN0aW1hdGVzIHRoZSBncm91cCBvcmRlciBmb3IgYSBEaWZmaWUtSGVsbG1hbiBncm91cCB0aGF0IGhhcyBhbgorICogYXR0YWNrIGNvbXBsZXhpdHkgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBhcyBPKDIqKmJpdHMpLiAgRXN0aW1hdGUKKyAqIHdpdGg6ICBPKGV4cCgxLjkyMjMgKiAobG4gcSleKDEvMykgKGxuIGxuIHEpXigyLzMpKSkKKyAqLworCitpbnQKK2RoX2VzdGltYXRlKGludCBiaXRzKQoreworCisJaWYgKGJpdHMgPD0gMTI4KQorCQlyZXR1cm4gKDEwMjQpOwkvKiBPKDIqKjg2KSAqLworCWlmIChiaXRzIDw9IDE5MikKKwkJcmV0dXJuICgyMDQ4KTsJLyogTygyKioxMTYpICovCisJcmV0dXJuICg0MDk2KTsJCS8qIE8oMioqMTU2KSAqLworfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9kaC5oIGIvb3BlbnNzaC02LjBwMS9kaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYzE0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2RoLmgKQEAgLTAsMCArMSw3MyBAQAorLyogJE9wZW5CU0Q6IGRoLmgsdiAxLjEwIDIwMDgvMDYvMjYgMDk6MTk6NDAgZGptIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgTmllbHMgUHJvdm9zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgREhfSAorI2RlZmluZSBESF9ICisKK3N0cnVjdCBkaGdyb3VwIHsKKwlpbnQgc2l6ZTsKKwlCSUdOVU0gKmc7CisJQklHTlVNICpwOworfTsKKworREgJKmNob29zZV9kaChpbnQsIGludCwgaW50KTsKK0RICSpkaF9uZXdfZ3JvdXBfYXNjKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK0RICSpkaF9uZXdfZ3JvdXAoQklHTlVNICosIEJJR05VTSAqKTsKK0RICSpkaF9uZXdfZ3JvdXAxKHZvaWQpOworREgJKmRoX25ld19ncm91cDE0KHZvaWQpOworCit2b2lkCSBkaF9nZW5fa2V5KERIICosIGludCk7CitpbnQJIGRoX3B1Yl9pc192YWxpZChESCAqLCBCSUdOVU0gKik7CisKK2ludAkgZGhfZXN0aW1hdGUoaW50KTsKKworI2RlZmluZSBESF9HUlBfTUlOCTEwMjQKKyNkZWZpbmUgREhfR1JQX01BWAk4MTkyCisKKy8qCisgKiBWYWx1ZXMgZm9yICJ0eXBlIiBmaWVsZCBvZiBtb2R1bGkoNSkKKyAqIFNwZWNpZmllcyB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIG9mIHRoZSBwcmltZSBtb2R1bHVzLgorICovCisjZGVmaW5lIE1PRFVMSV9UWVBFX1VOS05PV04JCSgwKQorI2RlZmluZSBNT0RVTElfVFlQRV9VTlNUUlVDVFVSRUQJKDEpCisjZGVmaW5lIE1PRFVMSV9UWVBFX1NBRkUJCSgyKQorI2RlZmluZSBNT0RVTElfVFlQRV9TQ0hOT1JSCQkoMykKKyNkZWZpbmUgTU9EVUxJX1RZUEVfU09QSElFX0dFUk1BSU4JKDQpCisjZGVmaW5lIE1PRFVMSV9UWVBFX1NUUk9ORwkJKDUpCisKKy8qCisgKiBWYWx1ZXMgZm9yICJ0ZXN0cyIgZmllbGQgb2YgbW9kdWxpKDUpCisgKiBTcGVjaWZpZXMgdGhlIG1ldGhvZHMgdXNlZCBpbiBjaGVja2luZyBmb3IgcHJpbWFsaXR5LgorICogVXN1YWxseSwgbW9yZSB0aGFuIG9uZSB0ZXN0IGlzIHVzZWQuCisgKi8KKyNkZWZpbmUgTU9EVUxJX1RFU1RTX1VOVEVTVEVECQkoMHgwMCkKKyNkZWZpbmUgTU9EVUxJX1RFU1RTX0NPTVBPU0lURQkJKDB4MDEpCisjZGVmaW5lIE1PRFVMSV9URVNUU19TSUVWRQkJKDB4MDIpCisjZGVmaW5lIE1PRFVMSV9URVNUU19NSUxMRVJfUkFCSU4JKDB4MDQpCisjZGVmaW5lIE1PRFVMSV9URVNUU19KQUNPQkkJCSgweDA4KQorI2RlZmluZSBNT0RVTElfVEVTVFNfRUxMSVBUSUMJCSgweDEwKQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9kaXNwYXRjaC5jIGIvb3BlbnNzaC02LjBwMS9kaXNwYXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YmI4MDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2Rpc3BhdGNoLmMKQEAgLTAsMCArMSwxMDQgQEAKKy8qICRPcGVuQlNEOiBkaXNwYXRjaC5jLHYgMS4yMiAyMDA4LzEwLzMxIDE1OjA1OjM0IHN0ZXZlc2sgRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgInNzaDEuaCIKKyNpbmNsdWRlICJzc2gyLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAiZGlzcGF0Y2guaCIKKyNpbmNsdWRlICJwYWNrZXQuaCIKKyNpbmNsdWRlICJjb21wYXQuaCIKKworI2RlZmluZSBESVNQQVRDSF9NQVgJMjU1CisKK2Rpc3BhdGNoX2ZuICpkaXNwYXRjaFtESVNQQVRDSF9NQVhdOworCit2b2lkCitkaXNwYXRjaF9wcm90b2NvbF9lcnJvcihpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKK3sKKwlsb2dpdCgiZGlzcGF0Y2hfcHJvdG9jb2xfZXJyb3I6IHR5cGUgJWQgc2VxICV1IiwgdHlwZSwgc2VxKTsKKwlpZiAoIWNvbXBhdDIwKQorCQlmYXRhbCgicHJvdG9jb2wgZXJyb3IiKTsKKwlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfVU5JTVBMRU1FTlRFRCk7CisJcGFja2V0X3B1dF9pbnQoc2VxKTsKKwlwYWNrZXRfc2VuZCgpOworCXBhY2tldF93cml0ZV93YWl0KCk7Cit9Cit2b2lkCitkaXNwYXRjaF9wcm90b2NvbF9pZ25vcmUoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCit7CisJbG9naXQoImRpc3BhdGNoX3Byb3RvY29sX2lnbm9yZTogdHlwZSAlZCBzZXEgJXUiLCB0eXBlLCBzZXEpOworfQordm9pZAorZGlzcGF0Y2hfaW5pdChkaXNwYXRjaF9mbiAqZGZsdCkKK3sKKwl1X2ludCBpOworCWZvciAoaSA9IDA7IGkgPCBESVNQQVRDSF9NQVg7IGkrKykKKwkJZGlzcGF0Y2hbaV0gPSBkZmx0OworfQordm9pZAorZGlzcGF0Y2hfcmFuZ2UodV9pbnQgZnJvbSwgdV9pbnQgdG8sIGRpc3BhdGNoX2ZuICpmbikKK3sKKwl1X2ludCBpOworCisJZm9yIChpID0gZnJvbTsgaSA8PSB0bzsgaSsrKSB7CisJCWlmIChpID49IERJU1BBVENIX01BWCkKKwkJCWJyZWFrOworCQlkaXNwYXRjaFtpXSA9IGZuOworCX0KK30KK3ZvaWQKK2Rpc3BhdGNoX3NldChpbnQgdHlwZSwgZGlzcGF0Y2hfZm4gKmZuKQoreworCWRpc3BhdGNoW3R5cGVdID0gZm47Cit9Cit2b2lkCitkaXNwYXRjaF9ydW4oaW50IG1vZGUsIHZvbGF0aWxlIHNpZ19hdG9taWNfdCAqZG9uZSwgdm9pZCAqY3R4dCkKK3sKKwlmb3IgKDs7KSB7CisJCWludCB0eXBlOworCQl1X2ludDMyX3Qgc2VxbnI7CisKKwkJaWYgKG1vZGUgPT0gRElTUEFUQ0hfQkxPQ0spIHsKKwkJCXR5cGUgPSBwYWNrZXRfcmVhZF9zZXFucigmc2VxbnIpOworCQl9IGVsc2UgeworCQkJdHlwZSA9IHBhY2tldF9yZWFkX3BvbGxfc2VxbnIoJnNlcW5yKTsKKwkJCWlmICh0eXBlID09IFNTSF9NU0dfTk9ORSkKKwkJCQlyZXR1cm47CisJCX0KKwkJaWYgKHR5cGUgPiAwICYmIHR5cGUgPCBESVNQQVRDSF9NQVggJiYgZGlzcGF0Y2hbdHlwZV0gIT0gTlVMTCkKKwkJCSgqZGlzcGF0Y2hbdHlwZV0pKHR5cGUsIHNlcW5yLCBjdHh0KTsKKwkJZWxzZQorCQkJcGFja2V0X2Rpc2Nvbm5lY3QoInByb3RvY29sIGVycm9yOiByY3ZkIHR5cGUgJWQiLCB0eXBlKTsKKwkJaWYgKGRvbmUgIT0gTlVMTCAmJiAqZG9uZSkKKwkJCXJldHVybjsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2Rpc3BhdGNoLmggYi9vcGVuc3NoLTYuMHAxL2Rpc3BhdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzZDFhMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvZGlzcGF0Y2guaApAQCAtMCwwICsxLDQxIEBACisvKiAkT3BlbkJTRDogZGlzcGF0Y2guaCx2IDEuMTEgMjAwNi8wNC8yMCAwOToyNzowOSBkam0gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorCitlbnVtIHsKKwlESVNQQVRDSF9CTE9DSywKKwlESVNQQVRDSF9OT05CTE9DSworfTsKKwordHlwZWRlZiB2b2lkIGRpc3BhdGNoX2ZuKGludCwgdV9pbnQzMl90LCB2b2lkICopOworCit2b2lkCSBkaXNwYXRjaF9pbml0KGRpc3BhdGNoX2ZuICopOwordm9pZAkgZGlzcGF0Y2hfc2V0KGludCwgZGlzcGF0Y2hfZm4gKik7Cit2b2lkCSBkaXNwYXRjaF9yYW5nZSh1X2ludCwgdV9pbnQsIGRpc3BhdGNoX2ZuICopOwordm9pZAkgZGlzcGF0Y2hfcnVuKGludCwgdm9sYXRpbGUgc2lnX2F0b21pY190ICosIHZvaWQgKik7Cit2b2lkCSBkaXNwYXRjaF9wcm90b2NvbF9lcnJvcihpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKK3ZvaWQJIGRpc3BhdGNoX3Byb3RvY29sX2lnbm9yZShpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvZG5zLmMgYi9vcGVuc3NoLTYuMHAxL2Rucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMWNiM2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2Rucy5jCkBAIC0wLDAgKzEsMzA2IEBACisvKiAkT3BlbkJTRDogZG5zLmMsdiAxLjI3IDIwMTAvMDgvMzEgMTE6NTQ6NDUgZGptIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgV2VzbGV5IEdyaWZmaW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgSmFrb2IgU2NobHl0ZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgImRucy5oIgorI2luY2x1ZGUgImxvZy5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqZXJyc2V0X3RleHRbXSA9IHsKKwkic3VjY2VzcyIsCQkvKiAwIEVSUlNFVF9TVUNDRVNTICovCisJIm91dCBvZiBtZW1vcnkiLAkvKiAxIEVSUlNFVF9OT01FTU9SWSAqLworCSJnZW5lcmFsIGZhaWx1cmUiLAkvKiAyIEVSUlNFVF9GQUlMICovCisJImludmFsaWQgcGFyYW1ldGVyIiwJLyogMyBFUlJTRVRfSU5WQUwgKi8KKwkibmFtZSBkb2VzIG5vdCBleGlzdCIsCS8qIDQgRVJSU0VUX05PTkFNRSAqLworCSJkYXRhIGRvZXMgbm90IGV4aXN0IiwJLyogNSBFUlJTRVRfTk9EQVRBICovCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqCitkbnNfcmVzdWx0X3RvdGV4dCh1bnNpZ25lZCBpbnQgcmVzKQoreworCXN3aXRjaCAocmVzKSB7CisJY2FzZSBFUlJTRVRfU1VDQ0VTUzoKKwkJcmV0dXJuIGVycnNldF90ZXh0W0VSUlNFVF9TVUNDRVNTXTsKKwljYXNlIEVSUlNFVF9OT01FTU9SWToKKwkJcmV0dXJuIGVycnNldF90ZXh0W0VSUlNFVF9OT01FTU9SWV07CisJY2FzZSBFUlJTRVRfRkFJTDoKKwkJcmV0dXJuIGVycnNldF90ZXh0W0VSUlNFVF9GQUlMXTsKKwljYXNlIEVSUlNFVF9JTlZBTDoKKwkJcmV0dXJuIGVycnNldF90ZXh0W0VSUlNFVF9JTlZBTF07CisJY2FzZSBFUlJTRVRfTk9OQU1FOgorCQlyZXR1cm4gZXJyc2V0X3RleHRbRVJSU0VUX05PTkFNRV07CisJY2FzZSBFUlJTRVRfTk9EQVRBOgorCQlyZXR1cm4gZXJyc2V0X3RleHRbRVJSU0VUX05PREFUQV07CisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIGVycm9yIjsKKwl9Cit9CisKKy8qCisgKiBSZWFkIFNTSEZQIHBhcmFtZXRlcnMgZnJvbSBrZXkgYnVmZmVyLgorICovCitzdGF0aWMgaW50CitkbnNfcmVhZF9rZXkodV9pbnQ4X3QgKmFsZ29yaXRobSwgdV9pbnQ4X3QgKmRpZ2VzdF90eXBlLAorICAgIHVfY2hhciAqKmRpZ2VzdCwgdV9pbnQgKmRpZ2VzdF9sZW4sIEtleSAqa2V5KQoreworCWludCBzdWNjZXNzID0gMDsKKworCXN3aXRjaCAoa2V5LT50eXBlKSB7CisJY2FzZSBLRVlfUlNBOgorCQkqYWxnb3JpdGhtID0gU1NIRlBfS0VZX1JTQTsKKwkJYnJlYWs7CisJY2FzZSBLRVlfRFNBOgorCQkqYWxnb3JpdGhtID0gU1NIRlBfS0VZX0RTQTsKKwkJYnJlYWs7CisJLyogWFhYIEtFWV9FQ0RTQSAqLworCWRlZmF1bHQ6CisJCSphbGdvcml0aG0gPSBTU0hGUF9LRVlfUkVTRVJWRUQ7IC8qIDAgKi8KKwl9CisKKwlpZiAoKmFsZ29yaXRobSkgeworCQkqZGlnZXN0X3R5cGUgPSBTU0hGUF9IQVNIX1NIQTE7CisJCSpkaWdlc3QgPSBrZXlfZmluZ2VycHJpbnRfcmF3KGtleSwgU1NIX0ZQX1NIQTEsIGRpZ2VzdF9sZW4pOworCQlpZiAoKmRpZ2VzdCA9PSBOVUxMKQorCQkJZmF0YWwoImRuc19yZWFkX2tleTogbnVsbCBmcm9tIGtleV9maW5nZXJwcmludF9yYXcoKSIpOworCQlzdWNjZXNzID0gMTsKKwl9IGVsc2UgeworCQkqZGlnZXN0X3R5cGUgPSBTU0hGUF9IQVNIX1JFU0VSVkVEOworCQkqZGlnZXN0ID0gTlVMTDsKKwkJKmRpZ2VzdF9sZW4gPSAwOworCQlzdWNjZXNzID0gMDsKKwl9CisKKwlyZXR1cm4gc3VjY2VzczsKK30KKworLyoKKyAqIFJlYWQgU1NIRlAgcGFyYW1ldGVycyBmcm9tIHJkYXRhIGJ1ZmZlci4KKyAqLworc3RhdGljIGludAorZG5zX3JlYWRfcmRhdGEodV9pbnQ4X3QgKmFsZ29yaXRobSwgdV9pbnQ4X3QgKmRpZ2VzdF90eXBlLAorICAgIHVfY2hhciAqKmRpZ2VzdCwgdV9pbnQgKmRpZ2VzdF9sZW4sIHVfY2hhciAqcmRhdGEsIGludCByZGF0YV9sZW4pCit7CisJaW50IHN1Y2Nlc3MgPSAwOworCisJKmFsZ29yaXRobSA9IFNTSEZQX0tFWV9SRVNFUlZFRDsKKwkqZGlnZXN0X3R5cGUgPSBTU0hGUF9IQVNIX1JFU0VSVkVEOworCisJaWYgKHJkYXRhX2xlbiA+PSAyKSB7CisJCSphbGdvcml0aG0gPSByZGF0YVswXTsKKwkJKmRpZ2VzdF90eXBlID0gcmRhdGFbMV07CisJCSpkaWdlc3RfbGVuID0gcmRhdGFfbGVuIC0gMjsKKworCQlpZiAoKmRpZ2VzdF9sZW4gPiAwKSB7CisJCQkqZGlnZXN0ID0gKHVfY2hhciAqKSB4bWFsbG9jKCpkaWdlc3RfbGVuKTsKKwkJCW1lbWNweSgqZGlnZXN0LCByZGF0YSArIDIsICpkaWdlc3RfbGVuKTsKKwkJfSBlbHNlIHsKKwkJCSpkaWdlc3QgPSAodV9jaGFyICopeHN0cmR1cCgiIik7CisJCX0KKworCQlzdWNjZXNzID0gMTsKKwl9CisKKwlyZXR1cm4gc3VjY2VzczsKK30KKworLyoKKyAqIENoZWNrIGlmIGhvc3RuYW1lIGlzIG51bWVyaWNhbC4KKyAqIFJldHVybnMgLTEgaWYgaG9zdG5hbWUgaXMgbnVtZXJpYywgMCBvdGhlcndpc2UKKyAqLworc3RhdGljIGludAoraXNfbnVtZXJpY19ob3N0bmFtZShjb25zdCBjaGFyICpob3N0bmFtZSkKK3sKKwlzdHJ1Y3QgYWRkcmluZm8gaGludHMsICphaTsKKworCS8qCisJICogV2Ugc2hvdWxkbid0IGV2ZXIgZ2V0IGEgbnVsbCBob3N0IGJ1dCBpZiB3ZSBkbyB0aGVuIGxvZyBhbiBlcnJvcgorCSAqIGFuZCByZXR1cm4gLTEgd2hpY2ggc3RvcHMgRE5TIGtleSBmaW5nZXJwcmludCBwcm9jZXNzaW5nLgorCSAqLworCWlmIChob3N0bmFtZSA9PSBOVUxMKSB7CisJCWVycm9yKCJpc19udW1lcmljX2hvc3RuYW1lIGNhbGxlZCB3aXRoIE5VTEwgaG9zdG5hbWUiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKKwloaW50cy5haV9mbGFncyA9IEFJX05VTUVSSUNIT1NUOworCisJaWYgKGdldGFkZHJpbmZvKGhvc3RuYW1lLCBOVUxMLCAmaGludHMsICZhaSkgPT0gMCkgeworCQlmcmVlYWRkcmluZm8oYWkpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBWZXJpZnkgdGhlIGdpdmVuIGhvc3RuYW1lLCBhZGRyZXNzIGFuZCBob3N0IGtleSB1c2luZyBETlMuCisgKiBSZXR1cm5zIDAgaWYgbG9va3VwIHN1Y2NlZWRzLCAtMSBvdGhlcndpc2UKKyAqLworaW50Cit2ZXJpZnlfaG9zdF9rZXlfZG5zKGNvbnN0IGNoYXIgKmhvc3RuYW1lLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJlc3MsCisgICAgS2V5ICpob3N0a2V5LCBpbnQgKmZsYWdzKQoreworCXVfaW50IGNvdW50ZXI7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcnJzZXRpbmZvICpmaW5nZXJwcmludHMgPSBOVUxMOworCisJdV9pbnQ4X3QgaG9zdGtleV9hbGdvcml0aG07CisJdV9pbnQ4X3QgaG9zdGtleV9kaWdlc3RfdHlwZTsKKwl1X2NoYXIgKmhvc3RrZXlfZGlnZXN0OworCXVfaW50IGhvc3RrZXlfZGlnZXN0X2xlbjsKKworCXVfaW50OF90IGRuc2tleV9hbGdvcml0aG07CisJdV9pbnQ4X3QgZG5za2V5X2RpZ2VzdF90eXBlOworCXVfY2hhciAqZG5za2V5X2RpZ2VzdDsKKwl1X2ludCBkbnNrZXlfZGlnZXN0X2xlbjsKKworCSpmbGFncyA9IDA7CisKKwlkZWJ1ZzMoInZlcmlmeV9ob3N0X2tleV9kbnMiKTsKKwlpZiAoaG9zdGtleSA9PSBOVUxMKQorCQlmYXRhbCgiTm8ga2V5IHRvIGxvb2sgdXAhIik7CisKKwlpZiAoaXNfbnVtZXJpY19ob3N0bmFtZShob3N0bmFtZSkpIHsKKwkJZGVidWcoInNraXBwZWQgRE5TIGxvb2t1cCBmb3IgbnVtZXJpY2FsIGhvc3RuYW1lIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXN1bHQgPSBnZXRycnNldGJ5bmFtZShob3N0bmFtZSwgRE5TX1JEQVRBQ0xBU1NfSU4sCisJICAgIEROU19SREFUQVRZUEVfU1NIRlAsIDAsICZmaW5nZXJwcmludHMpOworCWlmIChyZXN1bHQpIHsKKwkJdmVyYm9zZSgiRE5TIGxvb2t1cCBlcnJvcjogJXMiLCBkbnNfcmVzdWx0X3RvdGV4dChyZXN1bHQpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChmaW5nZXJwcmludHMtPnJyaV9mbGFncyAmIFJSU0VUX1ZBTElEQVRFRCkgeworCQkqZmxhZ3MgfD0gRE5TX1ZFUklGWV9TRUNVUkU7CisJCWRlYnVnKCJmb3VuZCAlZCBzZWN1cmUgZmluZ2VycHJpbnRzIGluIEROUyIsCisJCSAgICBmaW5nZXJwcmludHMtPnJyaV9ucmRhdGFzKTsKKwl9IGVsc2UgeworCQlkZWJ1ZygiZm91bmQgJWQgaW5zZWN1cmUgZmluZ2VycHJpbnRzIGluIEROUyIsCisJCSAgICBmaW5nZXJwcmludHMtPnJyaV9ucmRhdGFzKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIGhvc3Qga2V5IHBhcmFtZXRlcnMgKi8KKwlpZiAoIWRuc19yZWFkX2tleSgmaG9zdGtleV9hbGdvcml0aG0sICZob3N0a2V5X2RpZ2VzdF90eXBlLAorCSAgICAmaG9zdGtleV9kaWdlc3QsICZob3N0a2V5X2RpZ2VzdF9sZW4sIGhvc3RrZXkpKSB7CisJCWVycm9yKCJFcnJvciBjYWxjdWxhdGluZyBob3N0IGtleSBmaW5nZXJwcmludC4iKTsKKwkJZnJlZXJyc2V0KGZpbmdlcnByaW50cyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZmluZ2VycHJpbnRzLT5ycmlfbnJkYXRhcykKKwkJKmZsYWdzIHw9IEROU19WRVJJRllfRk9VTkQ7CisKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgZmluZ2VycHJpbnRzLT5ycmlfbnJkYXRhczsgY291bnRlcisrKSB7CisJCS8qCisJCSAqIEV4dHJhY3QgdGhlIGtleSBmcm9tIHRoZSBhbnN3ZXIuIElnbm9yZSBhbnkgYmFkbHkKKwkJICogZm9ybWF0dGVkIGZpbmdlcnByaW50cy4KKwkJICovCisJCWlmICghZG5zX3JlYWRfcmRhdGEoJmRuc2tleV9hbGdvcml0aG0sICZkbnNrZXlfZGlnZXN0X3R5cGUsCisJCSAgICAmZG5za2V5X2RpZ2VzdCwgJmRuc2tleV9kaWdlc3RfbGVuLAorCQkgICAgZmluZ2VycHJpbnRzLT5ycmlfcmRhdGFzW2NvdW50ZXJdLnJkaV9kYXRhLAorCQkgICAgZmluZ2VycHJpbnRzLT5ycmlfcmRhdGFzW2NvdW50ZXJdLnJkaV9sZW5ndGgpKSB7CisJCQl2ZXJib3NlKCJFcnJvciBwYXJzaW5nIGZpbmdlcnByaW50IGZyb20gRE5TLiIpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBDaGVjayBpZiB0aGUgY3VycmVudCBrZXkgaXMgdGhlIHNhbWUgYXMgdGhlIGdpdmVuIGtleSAqLworCQlpZiAoaG9zdGtleV9hbGdvcml0aG0gPT0gZG5za2V5X2FsZ29yaXRobSAmJgorCQkgICAgaG9zdGtleV9kaWdlc3RfdHlwZSA9PSBkbnNrZXlfZGlnZXN0X3R5cGUpIHsKKworCQkJaWYgKGhvc3RrZXlfZGlnZXN0X2xlbiA9PSBkbnNrZXlfZGlnZXN0X2xlbiAmJgorCQkJICAgIG1lbWNtcChob3N0a2V5X2RpZ2VzdCwgZG5za2V5X2RpZ2VzdCwKKwkJCSAgICBob3N0a2V5X2RpZ2VzdF9sZW4pID09IDApIHsKKworCQkJCSpmbGFncyB8PSBETlNfVkVSSUZZX01BVENIOworCQkJfQorCQl9CisJCXhmcmVlKGRuc2tleV9kaWdlc3QpOworCX0KKworCXhmcmVlKGhvc3RrZXlfZGlnZXN0KTsgLyogZnJvbSBrZXlfZmluZ2VycHJpbnRfcmF3KCkgKi8KKwlmcmVlcnJzZXQoZmluZ2VycHJpbnRzKTsKKworCWlmICgqZmxhZ3MgJiBETlNfVkVSSUZZX0ZPVU5EKQorCQlpZiAoKmZsYWdzICYgRE5TX1ZFUklGWV9NQVRDSCkKKwkJCWRlYnVnKCJtYXRjaGluZyBob3N0IGtleSBmaW5nZXJwcmludCBmb3VuZCBpbiBETlMiKTsKKwkJZWxzZQorCQkJZGVidWcoIm1pc21hdGNoaW5nIGhvc3Qga2V5IGZpbmdlcnByaW50IGZvdW5kIGluIEROUyIpOworCWVsc2UKKwkJZGVidWcoIm5vIGhvc3Qga2V5IGZpbmdlcnByaW50IGZvdW5kIGluIEROUyIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFeHBvcnQgdGhlIGZpbmdlcnByaW50IG9mIGEga2V5IGFzIGEgRE5TIHJlc291cmNlIHJlY29yZAorICovCitpbnQKK2V4cG9ydF9kbnNfcnIoY29uc3QgY2hhciAqaG9zdG5hbWUsIEtleSAqa2V5LCBGSUxFICpmLCBpbnQgZ2VuZXJpYykKK3sKKwl1X2ludDhfdCByZGF0YV9wdWJrZXlfYWxnb3JpdGhtID0gMDsKKwl1X2ludDhfdCByZGF0YV9kaWdlc3RfdHlwZSA9IFNTSEZQX0hBU0hfU0hBMTsKKwl1X2NoYXIgKnJkYXRhX2RpZ2VzdDsKKwl1X2ludCByZGF0YV9kaWdlc3RfbGVuOworCisJdV9pbnQgaTsKKwlpbnQgc3VjY2VzcyA9IDA7CisKKwlpZiAoZG5zX3JlYWRfa2V5KCZyZGF0YV9wdWJrZXlfYWxnb3JpdGhtLCAmcmRhdGFfZGlnZXN0X3R5cGUsCisJICAgICZyZGF0YV9kaWdlc3QsICZyZGF0YV9kaWdlc3RfbGVuLCBrZXkpKSB7CisKKwkJaWYgKGdlbmVyaWMpCisJCQlmcHJpbnRmKGYsICIlcyBJTiBUWVBFJWQgXFwjICVkICUwMnggJTAyeCAiLCBob3N0bmFtZSwKKwkJCSAgICBETlNfUkRBVEFUWVBFX1NTSEZQLCAyICsgcmRhdGFfZGlnZXN0X2xlbiwKKwkJCSAgICByZGF0YV9wdWJrZXlfYWxnb3JpdGhtLCByZGF0YV9kaWdlc3RfdHlwZSk7CisJCWVsc2UKKwkJCWZwcmludGYoZiwgIiVzIElOIFNTSEZQICVkICVkICIsIGhvc3RuYW1lLAorCQkJICAgIHJkYXRhX3B1YmtleV9hbGdvcml0aG0sIHJkYXRhX2RpZ2VzdF90eXBlKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgcmRhdGFfZGlnZXN0X2xlbjsgaSsrKQorCQkJZnByaW50ZihmLCAiJTAyeCIsIHJkYXRhX2RpZ2VzdFtpXSk7CisJCWZwcmludGYoZiwgIlxuIik7CisJCXhmcmVlKHJkYXRhX2RpZ2VzdCk7IC8qIGZyb20ga2V5X2ZpbmdlcnByaW50X3JhdygpICovCisJCXN1Y2Nlc3MgPSAxOworCX0gZWxzZSB7CisJCWVycm9yKCJleHBvcnRfZG5zX3JyOiB1bnN1cHBvcnRlZCBhbGdvcml0aG0iKTsKKwl9CisKKwlyZXR1cm4gc3VjY2VzczsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvZG5zLmggYi9vcGVuc3NoLTYuMHAxL2Rucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwY2ZkN2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2Rucy5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qICRPcGVuQlNEOiBkbnMuaCx2IDEuMTEgMjAxMC8wMi8yNiAyMDoyOTo1NCBkam0gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBXZXNsZXkgR3JpZmZpbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMyBKYWtvYiBTY2hseXRlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBETlNfSAorI2RlZmluZSBETlNfSAorCitlbnVtIHNzaGZwX3R5cGVzIHsKKwlTU0hGUF9LRVlfUkVTRVJWRUQsCisJU1NIRlBfS0VZX1JTQSwKKwlTU0hGUF9LRVlfRFNBCit9OworCitlbnVtIHNzaGZwX2hhc2hlcyB7CisJU1NIRlBfSEFTSF9SRVNFUlZFRCwKKwlTU0hGUF9IQVNIX1NIQTEKK307CisKKyNkZWZpbmUgRE5TX1JEQVRBQ0xBU1NfSU4JMQorI2RlZmluZSBETlNfUkRBVEFUWVBFX1NTSEZQCTQ0CisKKyNkZWZpbmUgRE5TX1ZFUklGWV9GT1VORAkweDAwMDAwMDAxCisjZGVmaW5lIEROU19WRVJJRllfTUFUQ0gJMHgwMDAwMDAwMgorI2RlZmluZSBETlNfVkVSSUZZX1NFQ1VSRQkweDAwMDAwMDA0CisKK2ludAl2ZXJpZnlfaG9zdF9rZXlfZG5zKGNvbnN0IGNoYXIgKiwgc3RydWN0IHNvY2thZGRyICosIEtleSAqLCBpbnQgKik7CitpbnQJZXhwb3J0X2Ruc19ycihjb25zdCBjaGFyICosIEtleSAqLCBGSUxFICosIGludCk7CisKKyNlbmRpZiAvKiBETlNfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9lbnRyb3B5LmMgYi9vcGVuc3NoLTYuMHAxL2VudHJvcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDQ4M2IzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9lbnRyb3B5LmMKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgRGFtaWVuIE1pbGxlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2lmZGVmIEhBVkVfU1lTX1VOX0gKKyMgaW5jbHVkZSA8c3lzL3VuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+IC8qIGZvciBvZmZzZXRvZiAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCisjaW5jbHVkZSAic3NoLmgiCisjaW5jbHVkZSAibWlzYy5oIgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJhdG9taWNpby5oIgorI2luY2x1ZGUgInBhdGhuYW1lcy5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorCisvKgorICogUG9ydGFibGUgT3BlblNTSCBQUk5HIHNlZWRpbmc6CisgKiBJZiBPcGVuU1NMIGhhcyBub3QgImludGVybmFsbHkgc2VlZGVkIiBpdHNlbGYgKGUuZy4gcHVsbGVkIGRhdGEgZnJvbQorICogL2Rldi9yYW5kb20pLCB0aGVuIGNvbGxlY3QgUkFORE9NX1NFRURfU0laRSBieXRlcyBvZiByYW5kb21uZXNzIGZyb20KKyAqIFBSTkdkLgorICovCisjaWZuZGVmIE9QRU5TU0xfUFJOR19PTkxZCisKKyNkZWZpbmUgUkFORE9NX1NFRURfU0laRSA0OAorCisvKgorICogQ29sbGVjdCAnbGVuJyBieXRlcyBvZiBlbnRyb3B5IGludG8gJ2J1ZicgZnJvbSBQUk5HRC9FR0QgZGFlbW9uCisgKiBsaXN0ZW5pbmcgZWl0aGVyIG9uICd0Y3BfcG9ydCcsIG9yIHZpYSBVbml4IGRvbWFpbiBzb2NrZXQgYXQgKgorICogJ3NvY2tldF9wYXRoJy4KKyAqIEVpdGhlciBhIG5vbi16ZXJvIHRjcF9wb3J0IG9yIGEgbm9uLW51bGwgc29ja2V0X3BhdGggbXVzdCBiZQorICogc3VwcGxpZWQuCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKKyAqLworaW50CitnZXRfcmFuZG9tX2J5dGVzX3BybmdkKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbiwKKyAgICB1bnNpZ25lZCBzaG9ydCB0Y3BfcG9ydCwgY2hhciAqc29ja2V0X3BhdGgpCit7CisJaW50IGZkLCBhZGRyX2xlbiwgcnZhbCwgZXJyb3JzOworCXVfY2hhciBtc2dbMl07CisJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHJfaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJmFkZHI7CisJc3RydWN0IHNvY2thZGRyX3VuICphZGRyX3VuID0gKHN0cnVjdCBzb2NrYWRkcl91biAqKSZhZGRyOworCW15c2lnX3Qgb2xkX3NpZ3BpcGU7CisKKwkvKiBTYW5pdHkgY2hlY2tzICovCisJaWYgKHNvY2tldF9wYXRoID09IE5VTEwgJiYgdGNwX3BvcnQgPT0gMCkKKwkJZmF0YWwoIllvdSBtdXN0IHNwZWNpZnkgYSBwb3J0IG9yIGEgc29ja2V0Iik7CisJaWYgKHNvY2tldF9wYXRoICE9IE5VTEwgJiYKKwkgICAgc3RybGVuKHNvY2tldF9wYXRoKSA+PSBzaXplb2YoYWRkcl91bi0+c3VuX3BhdGgpKQorCQlmYXRhbCgiUmFuZG9tIHBvb2wgcGF0aCBpcyB0b28gbG9uZyIpOworCWlmIChsZW4gPD0gMCB8fCBsZW4gPiAyNTUpCisJCWZhdGFsKCJUb28gbWFueSBieXRlcyAoJWQpIHRvIHJlYWQgZnJvbSBQUk5HRCIsIGxlbik7CisKKwltZW1zZXQoJmFkZHIsICdcMCcsIHNpemVvZihhZGRyKSk7CisKKwlpZiAodGNwX3BvcnQgIT0gMCkgeworCQlhZGRyX2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJYWRkcl9pbi0+c2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKTsKKwkJYWRkcl9pbi0+c2luX3BvcnQgPSBodG9ucyh0Y3BfcG9ydCk7CisJCWFkZHJfbGVuID0gc2l6ZW9mKCphZGRyX2luKTsKKwl9IGVsc2UgeworCQlhZGRyX3VuLT5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKwkJc3RybGNweShhZGRyX3VuLT5zdW5fcGF0aCwgc29ja2V0X3BhdGgsCisJCSAgICBzaXplb2YoYWRkcl91bi0+c3VuX3BhdGgpKTsKKwkJYWRkcl9sZW4gPSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKSArCisJCSAgICBzdHJsZW4oc29ja2V0X3BhdGgpICsgMTsKKwl9CisKKwlvbGRfc2lncGlwZSA9IG15c2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCisJZXJyb3JzID0gMDsKKwlydmFsID0gLTE7CityZW9wZW46CisJZmQgPSBzb2NrZXQoYWRkci5zc19mYW1pbHksIFNPQ0tfU1RSRUFNLCAwKTsKKwlpZiAoZmQgPT0gLTEpIHsKKwkJZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBzb2NrZXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChjb25uZWN0KGZkLCAoc3RydWN0IHNvY2thZGRyKikmYWRkciwgYWRkcl9sZW4pID09IC0xKSB7CisJCWlmICh0Y3BfcG9ydCAhPSAwKSB7CisJCQllcnJvcigiQ291bGRuJ3QgY29ubmVjdCB0byBQUk5HRCBwb3J0ICVkOiAlcyIsCisJCQkgICAgdGNwX3BvcnQsIHN0cmVycm9yKGVycm5vKSk7CisJCX0gZWxzZSB7CisJCQllcnJvcigiQ291bGRuJ3QgY29ubmVjdCB0byBQUk5HRCBzb2NrZXQgXCIlc1wiOiAlcyIsCisJCQkgICAgYWRkcl91bi0+c3VuX3BhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJCX0KKwkJZ290byBkb25lOworCX0KKworCS8qIFNlbmQgYmxvY2tpbmcgcmVhZCByZXF1ZXN0IHRvIFBSTkdEICovCisJbXNnWzBdID0gMHgwMjsKKwltc2dbMV0gPSBsZW47CisKKwlpZiAoYXRvbWljaW8odndyaXRlLCBmZCwgbXNnLCBzaXplb2YobXNnKSkgIT0gc2l6ZW9mKG1zZykpIHsKKwkJaWYgKGVycm5vID09IEVQSVBFICYmIGVycm9ycyA8IDEwKSB7CisJCQljbG9zZShmZCk7CisJCQllcnJvcnMrKzsKKwkJCWdvdG8gcmVvcGVuOworCQl9CisJCWVycm9yKCJDb3VsZG4ndCB3cml0ZSB0byBQUk5HRCBzb2NrZXQ6ICVzIiwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoYXRvbWljaW8ocmVhZCwgZmQsIGJ1ZiwgbGVuKSAhPSAoc2l6ZV90KWxlbikgeworCQlpZiAoZXJybm8gPT0gRVBJUEUgJiYgZXJyb3JzIDwgMTApIHsKKwkJCWNsb3NlKGZkKTsKKwkJCWVycm9ycysrOworCQkJZ290byByZW9wZW47CisJCX0KKwkJZXJyb3IoIkNvdWxkbid0IHJlYWQgZnJvbSBQUk5HRCBzb2NrZXQ6ICVzIiwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlydmFsID0gMDsKK2RvbmU6CisJbXlzaWduYWwoU0lHUElQRSwgb2xkX3NpZ3BpcGUpOworCWlmIChmZCAhPSAtMSkKKwkJY2xvc2UoZmQpOworCXJldHVybiBydmFsOworfQorCitzdGF0aWMgaW50CitzZWVkX2Zyb21fcHJuZ2QodW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgYnl0ZXMpCit7CisjaWZkZWYgUFJOR0RfUE9SVAorCWRlYnVnKCJ0cnlpbmcgZWdkL3BybmdkIHBvcnQgJWQiLCBQUk5HRF9QT1JUKTsKKwlpZiAoZ2V0X3JhbmRvbV9ieXRlc19wcm5nZChidWYsIGJ5dGVzLCBQUk5HRF9QT1JULCBOVUxMKSA9PSAwKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorI2lmZGVmIFBSTkdEX1NPQ0tFVAorCWRlYnVnKCJ0cnlpbmcgZWdkL3BybmdkIHNvY2tldCAlcyIsIFBSTkdEX1NPQ0tFVCk7CisJaWYgKGdldF9yYW5kb21fYnl0ZXNfcHJuZ2QoYnVmLCBieXRlcywgMCwgUFJOR0RfU09DS0VUKSA9PSAwKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCXJldHVybiAtMTsKK30KKwordm9pZAorcmV4ZWNfc2VuZF9ybmdfc2VlZChCdWZmZXIgKm0pCit7CisJdV9jaGFyIGJ1ZltSQU5ET01fU0VFRF9TSVpFXTsKKworCWlmIChSQU5EX2J5dGVzKGJ1Ziwgc2l6ZW9mKGJ1ZikpIDw9IDApIHsKKwkJZXJyb3IoIkNvdWxkbid0IG9idGFpbiByYW5kb20gYnl0ZXMgKGVycm9yICVsZCkiLAorCQkgICAgRVJSX2dldF9lcnJvcigpKTsKKwkJYnVmZmVyX3B1dF9zdHJpbmcobSwgIiIsIDApOworCX0gZWxzZSAKKwkJYnVmZmVyX3B1dF9zdHJpbmcobSwgYnVmLCBzaXplb2YoYnVmKSk7Cit9CisKK3ZvaWQKK3JleGVjX3JlY3Zfcm5nX3NlZWQoQnVmZmVyICptKQoreworCXVfY2hhciAqYnVmOworCXVfaW50IGxlbjsKKworCWJ1ZiA9IGJ1ZmZlcl9nZXRfc3RyaW5nX3JldChtLCAmbGVuKTsKKwlpZiAoYnVmICE9IE5VTEwpIHsKKwkJZGVidWczKCJyZXhlY19yZWN2X3JuZ19zZWVkOiBzZWVkaW5nIHJuZyB3aXRoICV1IGJ5dGVzIiwgbGVuKTsKKwkJUkFORF9hZGQoYnVmLCBsZW4sIGxlbik7CisJfQorfQorI2VuZGlmIC8qIE9QRU5TU0xfUFJOR19PTkxZICovCisKK3ZvaWQKK3NlZWRfcm5nKHZvaWQpCit7CisjaWZuZGVmIE9QRU5TU0xfUFJOR19PTkxZCisJdW5zaWduZWQgY2hhciBidWZbUkFORE9NX1NFRURfU0laRV07CisjZW5kaWYKKwkvKgorCSAqIE9wZW5TU0wgdmVyc2lvbiBudW1iZXJzOiBNTk5GRlBQUzogbWFqb3IgbWlub3IgZml4IHBhdGNoIHN0YXR1cworCSAqIFdlIG1hdGNoIG1ham9yLCBtaW5vciwgZml4IGFuZCBzdGF0dXMgKG5vdCBwYXRjaCkgZm9yIDwxLjAuMC4KKwkgKiBBZnRlciB0aGF0LCB3ZSBhY2NlcHRhYmxlIGNvbXBhdGlibGUgZml4IHZlcnNpb25zIChzbyB3ZQorCSAqIGFsbG93IDEuMC4xIHRvIHdvcmsgd2l0aCAxLjAuMCkuIEdvaW5nIGJhY2t3YXJkcyBpcyBvbmx5IGFsbG93ZWQKKwkgKiB3aXRoaW4gYSBwYXRjaCBzZXJpZXMuCisJICovCisJdV9sb25nIHZlcnNpb25fbWFzayA9IFNTTGVheSgpID49IDB4MTAwMDAwMGYgPyAgfjB4ZmZmZjBMIDogfjB4ZmYwTDsKKwlpZiAoKChTU0xlYXkoKSBeIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIpICYgdmVyc2lvbl9tYXNrKSB8fAorCSAgICAoU1NMZWF5KCkgPj4gMTIpIDwgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj4gMTIpKQorCQlmYXRhbCgiT3BlblNTTCB2ZXJzaW9uIG1pc21hdGNoLiBCdWlsdCBhZ2FpbnN0ICVseCwgeW91ICIKKwkJICAgICJoYXZlICVseCIsICh1X2xvbmcpT1BFTlNTTF9WRVJTSU9OX05VTUJFUiwgU1NMZWF5KCkpOworCisjaWZuZGVmIE9QRU5TU0xfUFJOR19PTkxZCisJaWYgKFJBTkRfc3RhdHVzKCkgPT0gMSkgeworCQlkZWJ1ZzMoIlJORyBpcyByZWFkeSwgc2tpcHBpbmcgc2VlZGluZyIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHNlZWRfZnJvbV9wcm5nZChidWYsIHNpemVvZihidWYpKSA9PSAtMSkKKwkJZmF0YWwoIkNvdWxkIG5vdCBvYnRhaW4gc2VlZCBmcm9tIFBSTkdkIik7CisJUkFORF9hZGQoYnVmLCBzaXplb2YoYnVmKSwgc2l6ZW9mKGJ1ZikpOworCW1lbXNldChidWYsICdcMCcsIHNpemVvZihidWYpKTsKKworI2VuZGlmIC8qIE9QRU5TU0xfUFJOR19PTkxZICovCisJaWYgKFJBTkRfc3RhdHVzKCkgIT0gMSkKKwkJZmF0YWwoIlBSTkcgaXMgbm90IHNlZWRlZCIpOworfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9lbnRyb3B5LmggYi9vcGVuc3NoLTYuMHAxL2VudHJvcHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2Q3OGRiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9lbnRyb3B5LmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAwIERhbWllbiBNaWxsZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKiAkSWQ6IGVudHJvcHkuaCx2IDEuNiAyMDExLzA5LzA5IDAxOjI5OjQxIGR0dWNrZXIgRXhwICQgKi8KKworI2lmbmRlZiBfUkFORE9NU19ICisjZGVmaW5lIF9SQU5ET01TX0gKKworI2luY2x1ZGUgImJ1ZmZlci5oIgorCit2b2lkIHNlZWRfcm5nKHZvaWQpOworCit2b2lkIHJleGVjX3NlbmRfcm5nX3NlZWQoQnVmZmVyICopOwordm9pZCByZXhlY19yZWN2X3JuZ19zZWVkKEJ1ZmZlciAqKTsKKworI2VuZGlmIC8qIF9SQU5ET01TX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvZmF0YWwuYyBiL29wZW5zc2gtNi4wcDEvZmF0YWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTVhYTNmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9mYXRhbC5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qICRPcGVuQlNEOiBmYXRhbC5jLHYgMS43IDIwMDYvMDgvMDMgMDM6MzQ6NDIgZGVyYWFkdCBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSAibG9nLmgiCisKKy8qIEZhdGFsIG1lc3NhZ2VzLiAgVGhpcyBmdW5jdGlvbiBuZXZlciByZXR1cm5zLiAqLworCit2b2lkCitmYXRhbChjb25zdCBjaGFyICpmbXQsLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJZG9fbG9nKFNZU0xPR19MRVZFTF9GQVRBTCwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJY2xlYW51cF9leGl0KDI1NSk7Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2ZpeHBhdGhzIGIvb3BlbnNzaC02LjBwMS9maXhwYXRocwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MGE2Nzk5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9maXhwYXRocwpAQCAtMCwwICsxLDIyIEBACisjIS9iaW4vc2gKKyMKKyMgZml4cGF0aHMgIC0gc3Vic3RpdHV0ZSBtYWtlZmlsZSB2YXJpYWJsZXMgaW50byB0ZXh0IGZpbGVzCisjIFVzYWdlOiBmaXhwYXRocyAtRHNvbWV0aGluZz1zb21ldGhpbmdlbHNlIC4uLgorCitkaWUoKSB7CisJZWNobyAkKgorCWV4aXQgLTEKK30KKwordGVzdCAtbiAiYGVjaG8gJDF8Z3JlcCAtLSAtRGAiIHx8IFwKKwlkaWUgJDA6IG5vdGhpbmcgdG8gZG8gLSBubyBzdWJzdGl0dXRpb25zIGxpc3RlZCEKKwordGVzdCAtbiAiYGVjaG8gJDF8Z3JlcCAtLSAnLURbXj1dXCs9W14gXVwrJ2AiIHx8IFwKKwlkaWUgJDA6IGVycm9yIGluIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisKK3Rlc3QgLW4gImBlY2hvICQqfGdyZXAgLS0gJyBbXi1dJ2AiIHx8IFwKKwlkaWUgVXNhZ2U6ICQwICdbLURzdHJpbmc9cmVwbGFjZW1lbnRdIFtbaW5maWxlXSAuLi5dJworCitzZWQgYGVjaG8gJCp8c2VkIC1lICdzLy1EXChbXj1dXCtcKT1cKFteIF0qXCkvLWUgcz1cMT1cMj1nL2cnYAorCitleGl0IDAKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvZml4cHJvZ3MgYi9vcGVuc3NoLTYuMHAxL2ZpeHByb2dzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFmNzZlZTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2ZpeHByb2dzCkBAIC0wLDAgKzEsNzIgQEAKKyMhL3Vzci9iaW4vcGVybAorIworIyBmaXhwcm9ncyAgLSBydW4gdGhyb3VnaCB0aGUgbGlzdCBvZiBlbnRyb3B5IGNvbW1hbmRzIGFuZAorIyAgICAgICAgICAgICBzY29yZSBvdXQgdGhlIGxvc2VycworIworCiskZW50c2NhbGUgPSA1MDsgIyBkaXZpc29yIGZvciBvcHRpb25hbCBlbnRyb3B5IG1lYXN1cmVtZW50CisKK3N1YiB1c2FnZSB7CisgIHJldHVybigiVXNhZ2U6ICQwIDxjb21tYW5kIGZpbGU+XG4iKTsKK30KKworaWYgKCgkI0FSR1YgPT0gLTEpIHx8ICgkI0FSR1Y+MSkpIHsKKyAgZGllKCZ1c2FnZSk7Cit9CisKKyMgJ3VuZG9jdW1lbnRlZCcgb3B0aW9uIC0gcnVuIGVudCAoaW4gc2Vjb25kIHBhcmFtKSBvbiB0aGUgb3V0cHV0CitpZiAoJCNBUkdWPT0xKSB7CisgICRlbnRjbWQ9JEFSR1ZbMV0KK30gZWxzZSB7CisgICRlbnRjbWQgPSAiIgorfTsKKworJGluZmlsZW5hbWUgPSAkQVJHVlswXTsKKworaWYgKCFvcGVuKElOLCAiPCIuJGluZmlsZW5hbWUpKSB7CisgIGRpZSgiQ291bGRuJ3Qgb3BlbiBpbnB1dCBmaWxlIik7Cit9Ciskb3V0ZmlsZW5hbWU9JGluZmlsZW5hbWUuIi5vdXQiOworaWYgKCFvcGVuKE9VVCwgIj4kb3V0ZmlsZW5hbWUiKSkgeworICBkaWUoIkNvdWxkbid0IG9wZW4gb3V0cHV0IGZpbGUgJG91dGZpbGVuYW1lIik7Cit9CitAaW5maWxlPTxJTj47CisKK3NlbGVjdChPVVQpOyAkfD0xOyBzZWxlY3QoU1RET1VUKTsKKworZm9yZWFjaCAoQGluZmlsZSkgeworICBpZiAoL15ccypcIy8gfHwgL15ccyokLykgeworICAgIHByaW50IE9VVDsKKyAgICBuZXh0OworICB9CisgICgkY21kLCAkcGF0aCwgJGVzdCkgPSAvXlwiKFteXCJdKylcIlxzKyhbXHdcL18tXSspXHMrKFtcZFwuXC1dKykvbzsKKyAgQGFyZ3MgPSBzcGxpdCgvIC8sICRjbWQpOworICAgaWYgKCEgKCRwaWQgPSBmb3JrKCkpKSB7CisgICAgICMgY2hpbGQKKyAgICAgY2xvc2UgU1RESU47IGNsb3NlIFNURE9VVDsgY2xvc2UgU1RERVJSOworICAgICBvcGVuIChTVERJTiwgICI8L2Rldi9udWxsIik7CisgICAgIG9wZW4gKFNURE9VVCwgIj4vZGV2L251bGwiKTsKKyAgICAgb3BlbiAoU1RERVJSLCAiPi9kZXYvbnVsbCIpOworICAgICBleGVjICRwYXRoIEBhcmdzOworICAgICBleGl0IDE7ICMgc2hvdWxkbid0IGJlIGhlcmUKKyAgIH0KKyAgICMgcGFyZW50CisgICB3YWl0cGlkICgkcGlkLCAwKTsgJHJldD0kPyA+PiA4OworCisgIGlmICgkcmV0ICE9IDApIHsKKyAgICAkcGF0aCA9ICJ1bmRlZiI7CisgIH0gZWxzZSB7CisgICAgaWYgKCRlbnRjbWQgbmUgIiIpIHsKKyAgICAgICMgbm93IHRyeSB0byBydW4gZW50IG9uIHRoZSBjb21tYW5kCisgICAgICAkbW9zdGFyZ3M9am9pbigiICIsIHNwbGljZShAYXJncywxKSk7CisgICAgICBwcmludCAiRXZhbHVhdGluZyAnJHBhdGggJG1vc3RhcmdzJ1xuIjsKKyAgICAgIEBlbnQgPSBxeHskcGF0aCAkbW9zdGFyZ3MgfCAkZW50Y21kIC1iIC10fTsKKyAgICAgIEBlbnQgPSBncmVwKC9eMSwvLCBAZW50KTsKKyAgICAgICgkbnVsbCwgJG51bGwsICRyYXRlKSA9IHNwbGl0KC8sLywgJGVudFswXSk7CisgICAgICAkZXN0ID0gJHJhdGUgLyAkZW50c2NhbGU7CQkjIHNjYWxlIHRoZSBlc3RpbWF0ZSBiYWNrCisgICAgfQorICB9CisgIHByaW50IE9VVCAiXCIkY21kXCIgJHBhdGggJGVzdFxuIjsKK30KKworY2xvc2UoSU4pOwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9ncm91cGFjY2Vzcy5jIGIvb3BlbnNzaC02LjBwMS9ncm91cGFjY2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzODFhZWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2dyb3VwYWNjZXNzLmMKQEAgLTAsMCArMSwxMjkgQEAKKy8qICRPcGVuQlNEOiBncm91cGFjY2Vzcy5jLHYgMS4xMyAyMDA4LzA3LzA0IDAzOjQ0OjU5IGRqbSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBLZXZpbiBTdGV2ZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorCisjaW5jbHVkZSA8Z3JwLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAiZ3JvdXBhY2Nlc3MuaCIKKyNpbmNsdWRlICJtYXRjaC5oIgorI2luY2x1ZGUgImxvZy5oIgorCitzdGF0aWMgaW50IG5ncm91cHM7CitzdGF0aWMgY2hhciAqKmdyb3Vwc19ieW5hbWU7CisKKy8qCisgKiBJbml0aWFsaXplIGdyb3VwIGFjY2VzcyBsaXN0IGZvciB1c2VyIHdpdGggcHJpbWFyeSAoYmFzZSkgYW5kCisgKiBzdXBwbGVtZW50YXJ5IGdyb3Vwcy4gIFJldHVybiB0aGUgbnVtYmVyIG9mIGdyb3VwcyBpbiB0aGUgbGlzdC4KKyAqLworaW50CitnYV9pbml0KGNvbnN0IGNoYXIgKnVzZXIsIGdpZF90IGJhc2UpCit7CisJZ2lkX3QgKmdyb3Vwc19ieWdpZDsKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgZ3JvdXAgKmdyOworCisJaWYgKG5ncm91cHMgPiAwKQorCQlnYV9mcmVlKCk7CisKKwluZ3JvdXBzID0gTkdST1VQU19NQVg7CisjaWYgZGVmaW5lZChIQVZFX1NZU0NPTkYpICYmIGRlZmluZWQoX1NDX05HUk9VUFNfTUFYKQorCW5ncm91cHMgPSBNQVgoTkdST1VQU19NQVgsIHN5c2NvbmYoX1NDX05HUk9VUFNfTUFYKSk7CisjZW5kaWYKKworCWdyb3Vwc19ieWdpZCA9IHhjYWxsb2Mobmdyb3Vwcywgc2l6ZW9mKCpncm91cHNfYnlnaWQpKTsKKwlncm91cHNfYnluYW1lID0geGNhbGxvYyhuZ3JvdXBzLCBzaXplb2YoKmdyb3Vwc19ieW5hbWUpKTsKKworCWlmIChnZXRncm91cGxpc3QodXNlciwgYmFzZSwgZ3JvdXBzX2J5Z2lkLCAmbmdyb3VwcykgPT0gLTEpCisJCWxvZ2l0KCJnZXRncm91cGxpc3Q6IGdyb3VwcyBsaXN0IHRvbyBzbWFsbCIpOworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgbmdyb3VwczsgaSsrKQorCQlpZiAoKGdyID0gZ2V0Z3JnaWQoZ3JvdXBzX2J5Z2lkW2ldKSkgIT0gTlVMTCkKKwkJCWdyb3Vwc19ieW5hbWVbaisrXSA9IHhzdHJkdXAoZ3ItPmdyX25hbWUpOworCXhmcmVlKGdyb3Vwc19ieWdpZCk7CisJcmV0dXJuIChuZ3JvdXBzID0gaik7Cit9CisKKy8qCisgKiBSZXR1cm4gMSBpZiBvbmUgb2YgdXNlcidzIGdyb3VwcyBpcyBjb250YWluZWQgaW4gZ3JvdXBzLgorICogUmV0dXJuIDAgb3RoZXJ3aXNlLiAgVXNlIG1hdGNoX3BhdHRlcm4oKSBmb3Igc3RyaW5nIGNvbXBhcmlzb24uCisgKi8KK2ludAorZ2FfbWF0Y2goY2hhciAqIGNvbnN0ICpncm91cHMsIGludCBuKQoreworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IG5ncm91cHM7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IG47IGorKykKKwkJCWlmIChtYXRjaF9wYXR0ZXJuKGdyb3Vwc19ieW5hbWVbaV0sIGdyb3Vwc1tqXSkpCisJCQkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm4gMSBpZiBvbmUgb2YgdXNlcidzIGdyb3VwcyBtYXRjaGVzIGdyb3VwX3BhdHRlcm4gbGlzdC4KKyAqIFJldHVybiAwIG9uIG5lZ2F0ZWQgb3Igbm8gbWF0Y2guCisgKi8KK2ludAorZ2FfbWF0Y2hfcGF0dGVybl9saXN0KGNvbnN0IGNoYXIgKmdyb3VwX3BhdHRlcm4pCit7CisJaW50IGksIGZvdW5kID0gMDsKKwlzaXplX3QgbGVuID0gc3RybGVuKGdyb3VwX3BhdHRlcm4pOworCisJZm9yIChpID0gMDsgaSA8IG5ncm91cHM7IGkrKykgeworCQlzd2l0Y2ggKG1hdGNoX3BhdHRlcm5fbGlzdChncm91cHNfYnluYW1lW2ldLAorCQkgICAgZ3JvdXBfcGF0dGVybiwgbGVuLCAwKSkgeworCQljYXNlIC0xOgorCQkJcmV0dXJuIDA7CS8qIE5lZ2F0ZWQgbWF0Y2ggd2lucyAqLworCQljYXNlIDA6CisJCQljb250aW51ZTsKKwkJY2FzZSAxOgorCQkJZm91bmQgPSAxOworCQl9CisJfQorCXJldHVybiBmb3VuZDsKK30KKworLyoKKyAqIEZyZWUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgZ3JvdXAgYWNjZXNzIGxpc3QuCisgKi8KK3ZvaWQKK2dhX2ZyZWUodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmIChuZ3JvdXBzID4gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgaSsrKQorCQkJeGZyZWUoZ3JvdXBzX2J5bmFtZVtpXSk7CisJCW5ncm91cHMgPSAwOworCQl4ZnJlZShncm91cHNfYnluYW1lKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2dyb3VwYWNjZXNzLmggYi9vcGVuc3NoLTYuMHAxL2dyb3VwYWNjZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAwNTc4ZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvZ3JvdXBhY2Nlc3MuaApAQCAtMCwwICsxLDM1IEBACisvKiAkT3BlbkJTRDogZ3JvdXBhY2Nlc3MuaCx2IDEuOCAyMDA4LzA3LzA0IDAzOjQ0OjU5IGRqbSBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEtldmluIFN0ZXZlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgR1JPVVBBQ0NFU1NfSAorI2RlZmluZSBHUk9VUEFDQ0VTU19ICisKK2ludAkgZ2FfaW5pdChjb25zdCBjaGFyICosIGdpZF90KTsKK2ludAkgZ2FfbWF0Y2goY2hhciAqIGNvbnN0ICosIGludCk7CitpbnQJIGdhX21hdGNoX3BhdHRlcm5fbGlzdChjb25zdCBjaGFyICopOwordm9pZAkgZ2FfZnJlZSh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2dzcy1nZW5yLmMgYi9vcGVuc3NoLTYuMHAxL2dzcy1nZW5yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQyZjM4NQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvZ3NzLWdlbnIuYwpAQCAtMCwwICsxLDI4MSBAQAorLyogJE9wZW5CU0Q6IGdzcy1nZW5yLmMsdiAxLjIwIDIwMDkvMDYvMjIgMDU6Mzk6MjggZHR1Y2tlciBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDcgU2ltb24gV2lsa2luc29uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaWZkZWYgR1NTQVBJCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInNzaDIuaCIKKworI2luY2x1ZGUgInNzaC1nc3MuaCIKKworZXh0ZXJuIHVfY2hhciAqc2Vzc2lvbl9pZDI7CitleHRlcm4gdV9pbnQgc2Vzc2lvbl9pZDJfbGVuOworCisvKiBDaGVjayB0aGF0IHRoZSBPSUQgaW4gYSBkYXRhIHN0cmVhbSBtYXRjaGVzIHRoYXQgaW4gdGhlIGNvbnRleHQgKi8KK2ludAorc3NoX2dzc2FwaV9jaGVja19vaWQoR3NzY3R4dCAqY3R4LCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQoreworCXJldHVybiAoY3R4ICE9IE5VTEwgJiYgY3R4LT5vaWQgIT0gR1NTX0NfTk9fT0lEICYmCisJICAgIGN0eC0+b2lkLT5sZW5ndGggPT0gbGVuICYmCisJICAgIG1lbWNtcChjdHgtPm9pZC0+ZWxlbWVudHMsIGRhdGEsIGxlbikgPT0gMCk7Cit9CisKKy8qIFNldCB0aGUgY29udGV4dHMgT0lEIGZyb20gYSBkYXRhIHN0cmVhbSAqLwordm9pZAorc3NoX2dzc2FwaV9zZXRfb2lkX2RhdGEoR3NzY3R4dCAqY3R4LCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQoreworCWlmIChjdHgtPm9pZCAhPSBHU1NfQ19OT19PSUQpIHsKKwkJeGZyZWUoY3R4LT5vaWQtPmVsZW1lbnRzKTsKKwkJeGZyZWUoY3R4LT5vaWQpOworCX0KKwljdHgtPm9pZCA9IHhtYWxsb2Moc2l6ZW9mKGdzc19PSURfZGVzYykpOworCWN0eC0+b2lkLT5sZW5ndGggPSBsZW47CisJY3R4LT5vaWQtPmVsZW1lbnRzID0geG1hbGxvYyhsZW4pOworCW1lbWNweShjdHgtPm9pZC0+ZWxlbWVudHMsIGRhdGEsIGxlbik7Cit9CisKKy8qIFNldCB0aGUgY29udGV4dHMgT0lEICovCit2b2lkCitzc2hfZ3NzYXBpX3NldF9vaWQoR3NzY3R4dCAqY3R4LCBnc3NfT0lEIG9pZCkKK3sKKwlzc2hfZ3NzYXBpX3NldF9vaWRfZGF0YShjdHgsIG9pZC0+ZWxlbWVudHMsIG9pZC0+bGVuZ3RoKTsKK30KKworLyogQWxsIHRoaXMgZWZmb3J0IHRvIHJlcG9ydCBhbiBlcnJvciAuLi4gKi8KK3ZvaWQKK3NzaF9nc3NhcGlfZXJyb3IoR3NzY3R4dCAqY3R4dCkKK3sKKwljaGFyICpzOworCisJcyA9IHNzaF9nc3NhcGlfbGFzdF9lcnJvcihjdHh0LCBOVUxMLCBOVUxMKTsKKwlkZWJ1ZygiJXMiLCBzKTsKKwl4ZnJlZShzKTsKK30KKworY2hhciAqCitzc2hfZ3NzYXBpX2xhc3RfZXJyb3IoR3NzY3R4dCAqY3R4dCwgT01fdWludDMyICptYWpvcl9zdGF0dXMsCisgICAgT01fdWludDMyICptaW5vcl9zdGF0dXMpCit7CisJT01fdWludDMyIGxtaW47CisJZ3NzX2J1ZmZlcl9kZXNjIG1zZyA9IEdTU19DX0VNUFRZX0JVRkZFUjsKKwlPTV91aW50MzIgY3R4OworCUJ1ZmZlciBiOworCWNoYXIgKnJldDsKKworCWJ1ZmZlcl9pbml0KCZiKTsKKworCWlmIChtYWpvcl9zdGF0dXMgIT0gTlVMTCkKKwkJKm1ham9yX3N0YXR1cyA9IGN0eHQtPm1ham9yOworCWlmIChtaW5vcl9zdGF0dXMgIT0gTlVMTCkKKwkJKm1pbm9yX3N0YXR1cyA9IGN0eHQtPm1pbm9yOworCisJY3R4ID0gMDsKKwkvKiBUaGUgR1NTQVBJIGVycm9yICovCisJZG8geworCQlnc3NfZGlzcGxheV9zdGF0dXMoJmxtaW4sIGN0eHQtPm1ham9yLAorCQkgICAgR1NTX0NfR1NTX0NPREUsIGN0eHQtPm9pZCwgJmN0eCwgJm1zZyk7CisKKwkJYnVmZmVyX2FwcGVuZCgmYiwgbXNnLnZhbHVlLCBtc2cubGVuZ3RoKTsKKwkJYnVmZmVyX3B1dF9jaGFyKCZiLCAnXG4nKTsKKworCQlnc3NfcmVsZWFzZV9idWZmZXIoJmxtaW4sICZtc2cpOworCX0gd2hpbGUgKGN0eCAhPSAwKTsKKworCS8qIFRoZSBtZWNoYW5pc20gc3BlY2lmaWMgZXJyb3IgKi8KKwlkbyB7CisJCWdzc19kaXNwbGF5X3N0YXR1cygmbG1pbiwgY3R4dC0+bWlub3IsCisJCSAgICBHU1NfQ19NRUNIX0NPREUsIGN0eHQtPm9pZCwgJmN0eCwgJm1zZyk7CisKKwkJYnVmZmVyX2FwcGVuZCgmYiwgbXNnLnZhbHVlLCBtc2cubGVuZ3RoKTsKKwkJYnVmZmVyX3B1dF9jaGFyKCZiLCAnXG4nKTsKKworCQlnc3NfcmVsZWFzZV9idWZmZXIoJmxtaW4sICZtc2cpOworCX0gd2hpbGUgKGN0eCAhPSAwKTsKKworCWJ1ZmZlcl9wdXRfY2hhcigmYiwgJ1wwJyk7CisJcmV0ID0geG1hbGxvYyhidWZmZXJfbGVuKCZiKSk7CisJYnVmZmVyX2dldCgmYiwgcmV0LCBidWZmZXJfbGVuKCZiKSk7CisJYnVmZmVyX2ZyZWUoJmIpOworCXJldHVybiAocmV0KTsKK30KKworLyoKKyAqIEluaXRpYWxpc2Ugb3VyIEdTU0FQSSBjb250ZXh0LiBXZSB1c2UgdGhpcyBvcGFxdWUgc3RydWN0dXJlIHRvIGNvbnRhaW4gYWxsCisgKiBvZiB0aGUgZGF0YSB3aGljaCBib3RoIHRoZSBjbGllbnQgYW5kIHNlcnZlciBuZWVkIHRvIHBlcnNpc3QgYWNyb3NzCisgKiB7YWNjZXB0LGluaXR9X3NlY19jb250ZXh0IGNhbGxzLCBzbyB0aGF0IHdoZW4gd2UgZG8gaXQgZnJvbSB0aGUgdXNlcmF1dGgKKyAqIHN0dWZmIGxpZmUgaXMgYSBsaXR0bGUgZWFzaWVyCisgKi8KK3ZvaWQKK3NzaF9nc3NhcGlfYnVpbGRfY3R4KEdzc2N0eHQgKipjdHgpCit7CisJKmN0eCA9IHhjYWxsb2MoMSwgc2l6ZW9mIChHc3NjdHh0KSk7CisJKCpjdHgpLT5jb250ZXh0ID0gR1NTX0NfTk9fQ09OVEVYVDsKKwkoKmN0eCktPm5hbWUgPSBHU1NfQ19OT19OQU1FOworCSgqY3R4KS0+b2lkID0gR1NTX0NfTk9fT0lEOworCSgqY3R4KS0+Y3JlZHMgPSBHU1NfQ19OT19DUkVERU5USUFMOworCSgqY3R4KS0+Y2xpZW50ID0gR1NTX0NfTk9fTkFNRTsKKwkoKmN0eCktPmNsaWVudF9jcmVkcyA9IEdTU19DX05PX0NSRURFTlRJQUw7Cit9CisKKy8qIERlbGV0ZSBvdXIgY29udGV4dCwgcHJvdmlkaW5nIGl0IGhhcyBiZWVuIGJ1aWx0IGNvcnJlY3RseSAqLwordm9pZAorc3NoX2dzc2FwaV9kZWxldGVfY3R4KEdzc2N0eHQgKipjdHgpCit7CisJT01fdWludDMyIG1zOworCisJaWYgKCgqY3R4KSA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKCgqY3R4KS0+Y29udGV4dCAhPSBHU1NfQ19OT19DT05URVhUKQorCQlnc3NfZGVsZXRlX3NlY19jb250ZXh0KCZtcywgJigqY3R4KS0+Y29udGV4dCwgR1NTX0NfTk9fQlVGRkVSKTsKKwlpZiAoKCpjdHgpLT5uYW1lICE9IEdTU19DX05PX05BTUUpCisJCWdzc19yZWxlYXNlX25hbWUoJm1zLCAmKCpjdHgpLT5uYW1lKTsKKwlpZiAoKCpjdHgpLT5vaWQgIT0gR1NTX0NfTk9fT0lEKSB7CisJCXhmcmVlKCgqY3R4KS0+b2lkLT5lbGVtZW50cyk7CisJCXhmcmVlKCgqY3R4KS0+b2lkKTsKKwkJKCpjdHgpLT5vaWQgPSBHU1NfQ19OT19PSUQ7CisJfQorCWlmICgoKmN0eCktPmNyZWRzICE9IEdTU19DX05PX0NSRURFTlRJQUwpCisJCWdzc19yZWxlYXNlX2NyZWQoJm1zLCAmKCpjdHgpLT5jcmVkcyk7CisJaWYgKCgqY3R4KS0+Y2xpZW50ICE9IEdTU19DX05PX05BTUUpCisJCWdzc19yZWxlYXNlX25hbWUoJm1zLCAmKCpjdHgpLT5jbGllbnQpOworCWlmICgoKmN0eCktPmNsaWVudF9jcmVkcyAhPSBHU1NfQ19OT19DUkVERU5USUFMKQorCQlnc3NfcmVsZWFzZV9jcmVkKCZtcywgJigqY3R4KS0+Y2xpZW50X2NyZWRzKTsKKworCXhmcmVlKCpjdHgpOworCSpjdHggPSBOVUxMOworfQorCisvKgorICogV3JhcHBlciB0byBpbml0X3NlY19jb250ZXh0CisgKiBSZXF1aXJlcyB0aGF0IHRoZSBjb250ZXh0IGNvbnRhaW5zOgorICoJb2lkCisgKglzZXJ2ZXIgbmFtZSAoZnJvbSBzc2hfZ3NzYXBpX2ltcG9ydF9uYW1lKQorICovCitPTV91aW50MzIKK3NzaF9nc3NhcGlfaW5pdF9jdHgoR3NzY3R4dCAqY3R4LCBpbnQgZGVsZWdfY3JlZHMsIGdzc19idWZmZXJfZGVzYyAqcmVjdl90b2ssCisgICAgZ3NzX2J1ZmZlcl9kZXNjKiBzZW5kX3RvaywgT01fdWludDMyICpmbGFncykKK3sKKwlpbnQgZGVsZWdfZmxhZyA9IDA7CisKKwlpZiAoZGVsZWdfY3JlZHMpIHsKKwkJZGVsZWdfZmxhZyA9IEdTU19DX0RFTEVHX0ZMQUc7CisJCWRlYnVnKCJEZWxlZ2F0aW5nIGNyZWRlbnRpYWxzIik7CisJfQorCisJY3R4LT5tYWpvciA9IGdzc19pbml0X3NlY19jb250ZXh0KCZjdHgtPm1pbm9yLAorCSAgICBHU1NfQ19OT19DUkVERU5USUFMLCAmY3R4LT5jb250ZXh0LCBjdHgtPm5hbWUsIGN0eC0+b2lkLAorCSAgICBHU1NfQ19NVVRVQUxfRkxBRyB8IEdTU19DX0lOVEVHX0ZMQUcgfCBkZWxlZ19mbGFnLAorCSAgICAwLCBOVUxMLCByZWN2X3RvaywgTlVMTCwgc2VuZF90b2ssIGZsYWdzLCBOVUxMKTsKKworCWlmIChHU1NfRVJST1IoY3R4LT5tYWpvcikpCisJCXNzaF9nc3NhcGlfZXJyb3IoY3R4KTsKKworCXJldHVybiAoY3R4LT5tYWpvcik7Cit9CisKKy8qIENyZWF0ZSBhIHNlcnZpY2UgbmFtZSBmb3IgdGhlIGdpdmVuIGhvc3QgKi8KK09NX3VpbnQzMgorc3NoX2dzc2FwaV9pbXBvcnRfbmFtZShHc3NjdHh0ICpjdHgsIGNvbnN0IGNoYXIgKmhvc3QpCit7CisJZ3NzX2J1ZmZlcl9kZXNjIGdzc2J1ZjsKKwljaGFyICp2YWw7CisKKwl4YXNwcmludGYoJnZhbCwgImhvc3RAJXMiLCBob3N0KTsKKwlnc3NidWYudmFsdWUgPSB2YWw7CisJZ3NzYnVmLmxlbmd0aCA9IHN0cmxlbihnc3NidWYudmFsdWUpOworCisJaWYgKChjdHgtPm1ham9yID0gZ3NzX2ltcG9ydF9uYW1lKCZjdHgtPm1pbm9yLAorCSAgICAmZ3NzYnVmLCBHU1NfQ19OVF9IT1NUQkFTRURfU0VSVklDRSwgJmN0eC0+bmFtZSkpKQorCQlzc2hfZ3NzYXBpX2Vycm9yKGN0eCk7CisKKwl4ZnJlZShnc3NidWYudmFsdWUpOworCXJldHVybiAoY3R4LT5tYWpvcik7Cit9CisKK09NX3VpbnQzMgorc3NoX2dzc2FwaV9zaWduKEdzc2N0eHQgKmN0eCwgZ3NzX2J1ZmZlcl90IGJ1ZmZlciwgZ3NzX2J1ZmZlcl90IGhhc2gpCit7CisJaWYgKChjdHgtPm1ham9yID0gZ3NzX2dldF9taWMoJmN0eC0+bWlub3IsIGN0eC0+Y29udGV4dCwKKwkgICAgR1NTX0NfUU9QX0RFRkFVTFQsIGJ1ZmZlciwgaGFzaCkpKQorCQlzc2hfZ3NzYXBpX2Vycm9yKGN0eCk7CisKKwlyZXR1cm4gKGN0eC0+bWFqb3IpOworfQorCit2b2lkCitzc2hfZ3NzYXBpX2J1aWxkbWljKEJ1ZmZlciAqYiwgY29uc3QgY2hhciAqdXNlciwgY29uc3QgY2hhciAqc2VydmljZSwKKyAgICBjb25zdCBjaGFyICpjb250ZXh0KQoreworCWJ1ZmZlcl9pbml0KGIpOworCWJ1ZmZlcl9wdXRfc3RyaW5nKGIsIHNlc3Npb25faWQyLCBzZXNzaW9uX2lkMl9sZW4pOworCWJ1ZmZlcl9wdXRfY2hhcihiLCBTU0gyX01TR19VU0VSQVVUSF9SRVFVRVNUKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcoYiwgdXNlcik7CisJYnVmZmVyX3B1dF9jc3RyaW5nKGIsIHNlcnZpY2UpOworCWJ1ZmZlcl9wdXRfY3N0cmluZyhiLCBjb250ZXh0KTsKK30KKworaW50Citzc2hfZ3NzYXBpX2NoZWNrX21lY2hhbmlzbShHc3NjdHh0ICoqY3R4LCBnc3NfT0lEIG9pZCwgY29uc3QgY2hhciAqaG9zdCkKK3sKKwlnc3NfYnVmZmVyX2Rlc2MgdG9rZW4gPSBHU1NfQ19FTVBUWV9CVUZGRVI7CisJT01fdWludDMyIG1ham9yLCBtaW5vcjsKKwlnc3NfT0lEX2Rlc2Mgc3BuZWdvX29pZCA9IHs2LCAodm9pZCAqKSJceDJCXHgwNlx4MDFceDA1XHgwNVx4MDIifTsKKworCS8qIFJGQyA0NDYyIHNheXMgd2UgTVVTVCBOT1QgZG8gU1BORUdPICovCisJaWYgKG9pZC0+bGVuZ3RoID09IHNwbmVnb19vaWQubGVuZ3RoICYmIAorCSAgICAobWVtY21wKG9pZC0+ZWxlbWVudHMsIHNwbmVnb19vaWQuZWxlbWVudHMsIG9pZC0+bGVuZ3RoKSA9PSAwKSkKKwkJcmV0dXJuIDA7IC8qIGZhbHNlICovCisKKwlzc2hfZ3NzYXBpX2J1aWxkX2N0eChjdHgpOworCXNzaF9nc3NhcGlfc2V0X29pZCgqY3R4LCBvaWQpOworCW1ham9yID0gc3NoX2dzc2FwaV9pbXBvcnRfbmFtZSgqY3R4LCBob3N0KTsKKwlpZiAoIUdTU19FUlJPUihtYWpvcikpIHsKKwkJbWFqb3IgPSBzc2hfZ3NzYXBpX2luaXRfY3R4KCpjdHgsIDAsIEdTU19DX05PX0JVRkZFUiwgJnRva2VuLCAKKwkJICAgIE5VTEwpOworCQlnc3NfcmVsZWFzZV9idWZmZXIoJm1pbm9yLCAmdG9rZW4pOworCQlpZiAoKCpjdHgpLT5jb250ZXh0ICE9IEdTU19DX05PX0NPTlRFWFQpCisJCQlnc3NfZGVsZXRlX3NlY19jb250ZXh0KCZtaW5vciwgJigqY3R4KS0+Y29udGV4dCwKKwkJCSAgICBHU1NfQ19OT19CVUZGRVIpOworCX0KKworCWlmIChHU1NfRVJST1IobWFqb3IpKSAKKwkJc3NoX2dzc2FwaV9kZWxldGVfY3R4KGN0eCk7CisKKwlyZXR1cm4gKCFHU1NfRVJST1IobWFqb3IpKTsKK30KKworI2VuZGlmIC8qIEdTU0FQSSAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9nc3Mtc2Vydi1rcmI1LmMgYi9vcGVuc3NoLTYuMHAxL2dzcy1zZXJ2LWtyYjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTYyNWFjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9nc3Mtc2Vydi1rcmI1LmMKQEAgLTAsMCArMSwxOTkgQEAKKy8qICRPcGVuQlNEOiBnc3Mtc2Vydi1rcmI1LmMsdiAxLjcgMjAwNi8wOC8wMyAwMzozNDo0MiBkZXJhYWR0IEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMyBTaW1vbiBXaWxraW5zb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpZmRlZiBHU1NBUEkKKyNpZmRlZiBLUkI1CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgImhvc3RmaWxlLmgiCisjaW5jbHVkZSAiYXV0aC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInNlcnZjb25mLmgiCisKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJzc2gtZ3NzLmgiCisKK2V4dGVybiBTZXJ2ZXJPcHRpb25zIG9wdGlvbnM7CisKKyNpZmRlZiBIRUlNREFMCisjIGluY2x1ZGUgPGtyYjUuaD4KKyNlbHNlCisjIGlmZGVmIEhBVkVfR1NTQVBJX0tSQjVfSAorIyAgaW5jbHVkZSA8Z3NzYXBpX2tyYjUuaD4KKyMgZWxpZiBIQVZFX0dTU0FQSV9HU1NBUElfS1JCNV9ICisjICBpbmNsdWRlIDxnc3NhcGkvZ3NzYXBpX2tyYjUuaD4KKyMgZW5kaWYKKyNlbmRpZgorCitzdGF0aWMga3JiNV9jb250ZXh0IGtyYl9jb250ZXh0ID0gTlVMTDsKKworLyogSW5pdGlhbGlzZSB0aGUga3JiNSBsaWJyYXJ5LCBmb3IgdGhlIHN0dWZmIHRoYXQgR1NTQVBJIHdvbid0IGRvICovCisKK3N0YXRpYyBpbnQKK3NzaF9nc3NhcGlfa3JiNV9pbml0KHZvaWQpCit7CisJa3JiNV9lcnJvcl9jb2RlIHByb2JsZW07CisKKwlpZiAoa3JiX2NvbnRleHQgIT0gTlVMTCkKKwkJcmV0dXJuIDE7CisKKwlwcm9ibGVtID0ga3JiNV9pbml0X2NvbnRleHQoJmtyYl9jb250ZXh0KTsKKwlpZiAocHJvYmxlbSkgeworCQlsb2dpdCgiQ2Fubm90IGluaXRpYWxpemUga3JiNSBjb250ZXh0Iik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKiBDaGVjayBpZiB0aGlzIHVzZXIgaXMgT0sgdG8gbG9naW4uIFRoaXMgb25seSB3b3JrcyB3aXRoIGtyYjUgLSBvdGhlcgorICogR1NTQVBJIG1lY2hhbmlzbXMgd2lsbCBuZWVkIHRoZWlyIG93bi4KKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdXNlciBpcyBPSyB0byBsb2cgaW4sIG90aGVyd2lzZSByZXR1cm5zIDAKKyAqLworCitzdGF0aWMgaW50Citzc2hfZ3NzYXBpX2tyYjVfdXNlcm9rKHNzaF9nc3NhcGlfY2xpZW50ICpjbGllbnQsIGNoYXIgKm5hbWUpCit7CisJa3JiNV9wcmluY2lwYWwgcHJpbmM7CisJaW50IHJldHZhbDsKKworCWlmIChzc2hfZ3NzYXBpX2tyYjVfaW5pdCgpID09IDApCisJCXJldHVybiAwOworCisJaWYgKChyZXR2YWwgPSBrcmI1X3BhcnNlX25hbWUoa3JiX2NvbnRleHQsIGNsaWVudC0+ZXhwb3J0ZWRuYW1lLnZhbHVlLAorCSAgICAmcHJpbmMpKSkgeworCQlsb2dpdCgia3JiNV9wYXJzZV9uYW1lKCk6ICUuMTAwcyIsCisJCSAgICBrcmI1X2dldF9lcnJfdGV4dChrcmJfY29udGV4dCwgcmV0dmFsKSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoa3JiNV9rdXNlcm9rKGtyYl9jb250ZXh0LCBwcmluYywgbmFtZSkpIHsKKwkJcmV0dmFsID0gMTsKKwkJbG9naXQoIkF1dGhvcml6ZWQgdG8gJXMsIGtyYjUgcHJpbmNpcGFsICVzIChrcmI1X2t1c2Vyb2spIiwKKwkJICAgIG5hbWUsIChjaGFyICopY2xpZW50LT5kaXNwbGF5bmFtZS52YWx1ZSk7CisJfSBlbHNlCisJCXJldHZhbCA9IDA7CisKKwlrcmI1X2ZyZWVfcHJpbmNpcGFsKGtyYl9jb250ZXh0LCBwcmluYyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworCisvKiBUaGlzIHdyaXRlcyBvdXQgYW55IGZvcndhcmRlZCBjcmVkZW50aWFscyBmcm9tIHRoZSBzdHJ1Y3R1cmUgcG9wdWxhdGVkCisgKiBkdXJpbmcgdXNlcmF1dGguIENhbGxlZCBhZnRlciB3ZSBoYXZlIHNldHVpZCB0byB0aGUgdXNlciAqLworCitzdGF0aWMgdm9pZAorc3NoX2dzc2FwaV9rcmI1X3N0b3JlY3JlZHMoc3NoX2dzc2FwaV9jbGllbnQgKmNsaWVudCkKK3sKKwlrcmI1X2NjYWNoZSBjY2FjaGU7CisJa3JiNV9lcnJvcl9jb2RlIHByb2JsZW07CisJa3JiNV9wcmluY2lwYWwgcHJpbmM7CisJT01fdWludDMyIG1hal9zdGF0dXMsIG1pbl9zdGF0dXM7CisJaW50IGxlbjsKKworCWlmIChjbGllbnQtPmNyZWRzID09IE5VTEwpIHsKKwkJZGVidWcoIk5vIGNyZWRlbnRpYWxzIHN0b3JlZCIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHNzaF9nc3NhcGlfa3JiNV9pbml0KCkgPT0gMCkKKwkJcmV0dXJuOworCisjaWZkZWYgSEVJTURBTAorCWlmICgocHJvYmxlbSA9IGtyYjVfY2NfZ2VuX25ldyhrcmJfY29udGV4dCwgJmtyYjVfZmNjX29wcywgJmNjYWNoZSkpKSB7CisJCWxvZ2l0KCJrcmI1X2NjX2dlbl9uZXcoKTogJS4xMDBzIiwKKwkJICAgIGtyYjVfZ2V0X2Vycl90ZXh0KGtyYl9jb250ZXh0LCBwcm9ibGVtKSk7CisJCXJldHVybjsKKwl9CisjZWxzZQorCWlmICgocHJvYmxlbSA9IHNzaF9rcmI1X2NjX2dlbihrcmJfY29udGV4dCwgJmNjYWNoZSkpKSB7CisJCWxvZ2l0KCJzc2hfa3JiNV9jY19nZW4oKTogJS4xMDBzIiwKKwkJICAgIGtyYjVfZ2V0X2Vycl90ZXh0KGtyYl9jb250ZXh0LCBwcm9ibGVtKSk7CisJCXJldHVybjsKKwl9CisjZW5kaWYJLyogI2lmZGVmIEhFSU1EQUwgKi8KKworCWlmICgocHJvYmxlbSA9IGtyYjVfcGFyc2VfbmFtZShrcmJfY29udGV4dCwKKwkgICAgY2xpZW50LT5leHBvcnRlZG5hbWUudmFsdWUsICZwcmluYykpKSB7CisJCWxvZ2l0KCJrcmI1X3BhcnNlX25hbWUoKTogJS4xMDBzIiwKKwkJICAgIGtyYjVfZ2V0X2Vycl90ZXh0KGtyYl9jb250ZXh0LCBwcm9ibGVtKSk7CisJCWtyYjVfY2NfZGVzdHJveShrcmJfY29udGV4dCwgY2NhY2hlKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgocHJvYmxlbSA9IGtyYjVfY2NfaW5pdGlhbGl6ZShrcmJfY29udGV4dCwgY2NhY2hlLCBwcmluYykpKSB7CisJCWxvZ2l0KCJrcmI1X2NjX2luaXRpYWxpemUoKTogJS4xMDBzIiwKKwkJICAgIGtyYjVfZ2V0X2Vycl90ZXh0KGtyYl9jb250ZXh0LCBwcm9ibGVtKSk7CisJCWtyYjVfZnJlZV9wcmluY2lwYWwoa3JiX2NvbnRleHQsIHByaW5jKTsKKwkJa3JiNV9jY19kZXN0cm95KGtyYl9jb250ZXh0LCBjY2FjaGUpOworCQlyZXR1cm47CisJfQorCisJa3JiNV9mcmVlX3ByaW5jaXBhbChrcmJfY29udGV4dCwgcHJpbmMpOworCisJaWYgKChtYWpfc3RhdHVzID0gZ3NzX2tyYjVfY29weV9jY2FjaGUoJm1pbl9zdGF0dXMsCisJICAgIGNsaWVudC0+Y3JlZHMsIGNjYWNoZSkpKSB7CisJCWxvZ2l0KCJnc3Nfa3JiNV9jb3B5X2NjYWNoZSgpIGZhaWxlZCIpOworCQlrcmI1X2NjX2Rlc3Ryb3koa3JiX2NvbnRleHQsIGNjYWNoZSk7CisJCXJldHVybjsKKwl9CisKKwljbGllbnQtPnN0b3JlLmZpbGVuYW1lID0geHN0cmR1cChrcmI1X2NjX2dldF9uYW1lKGtyYl9jb250ZXh0LCBjY2FjaGUpKTsKKwljbGllbnQtPnN0b3JlLmVudnZhciA9ICJLUkI1Q0NOQU1FIjsKKwlsZW4gPSBzdHJsZW4oY2xpZW50LT5zdG9yZS5maWxlbmFtZSkgKyA2OworCWNsaWVudC0+c3RvcmUuZW52dmFsID0geG1hbGxvYyhsZW4pOworCXNucHJpbnRmKGNsaWVudC0+c3RvcmUuZW52dmFsLCBsZW4sICJGSUxFOiVzIiwgY2xpZW50LT5zdG9yZS5maWxlbmFtZSk7CisKKyNpZmRlZiBVU0VfUEFNCisJaWYgKG9wdGlvbnMudXNlX3BhbSkKKwkJZG9fcGFtX3B1dGVudihjbGllbnQtPnN0b3JlLmVudnZhciwgY2xpZW50LT5zdG9yZS5lbnZ2YWwpOworI2VuZGlmCisKKwlrcmI1X2NjX2Nsb3NlKGtyYl9jb250ZXh0LCBjY2FjaGUpOworCisJcmV0dXJuOworfQorCitzc2hfZ3NzYXBpX21lY2ggZ3NzYXBpX2tlcmJlcm9zX21lY2ggPSB7CisJInRvV001U2x3NUV3OE1xa2F5K2FsMmc9PSIsCisJIktlcmJlcm9zIiwKKwl7OSwgIlx4MkFceDg2XHg0OFx4ODZceEY3XHgxMlx4MDFceDAyXHgwMiJ9LAorCU5VTEwsCisJJnNzaF9nc3NhcGlfa3JiNV91c2Vyb2ssCisJTlVMTCwKKwkmc3NoX2dzc2FwaV9rcmI1X3N0b3JlY3JlZHMKK307CisKKyNlbmRpZiAvKiBLUkI1ICovCisKKyNlbmRpZiAvKiBHU1NBUEkgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvZ3NzLXNlcnYuYyBiL29wZW5zc2gtNi4wcDEvZ3NzLXNlcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzE5YzEzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9nc3Mtc2Vydi5jCkBAIC0wLDAgKzEsMzY3IEBACisvKiAkT3BlbkJTRDogZ3NzLXNlcnYuYyx2IDEuMjMgMjAxMS8wOC8wMSAxOToxODoxNSBtYXJrdXMgRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzIFNpbW9uIFdpbGtpbnNvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2lmZGVmIEdTU0FQSQorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L3N5cy1xdWV1ZS5oIgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJob3N0ZmlsZS5oIgorI2luY2x1ZGUgImF1dGguaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJjaGFubmVscy5oIgorI2luY2x1ZGUgInNlc3Npb24uaCIKKyNpbmNsdWRlICJtaXNjLmgiCisKKyNpbmNsdWRlICJzc2gtZ3NzLmgiCisKK3N0YXRpYyBzc2hfZ3NzYXBpX2NsaWVudCBnc3NhcGlfY2xpZW50ID0KKyAgICB7IEdTU19DX0VNUFRZX0JVRkZFUiwgR1NTX0NfRU1QVFlfQlVGRkVSLAorICAgIEdTU19DX05PX0NSRURFTlRJQUwsIE5VTEwsIHtOVUxMLCBOVUxMLCBOVUxMfX07CisKK3NzaF9nc3NhcGlfbWVjaCBnc3NhcGlfbnVsbF9tZWNoID0KKyAgICB7IE5VTEwsIE5VTEwsIHswLCBOVUxMfSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTH07CisKKyNpZmRlZiBLUkI1CitleHRlcm4gc3NoX2dzc2FwaV9tZWNoIGdzc2FwaV9rZXJiZXJvc19tZWNoOworI2VuZGlmCisKK3NzaF9nc3NhcGlfbWVjaCogc3VwcG9ydGVkX21lY2hzW109IHsKKyNpZmRlZiBLUkI1CisJJmdzc2FwaV9rZXJiZXJvc19tZWNoLAorI2VuZGlmCisJJmdzc2FwaV9udWxsX21lY2gsCit9OworCisKKy8qCisgKiBBY3F1aXJlIGNyZWRlbnRpYWxzIGZvciBhIHNlcnZlciBydW5uaW5nIG9uIHRoZSBjdXJyZW50IGhvc3QuCisgKiBSZXF1aXJlcyB0aGF0IHRoZSBjb250ZXh0IHN0cnVjdHVyZSBjb250YWlucyBhIHZhbGlkIE9JRAorICovCisKKy8qIFJldHVybnMgYSBHU1NBUEkgZXJyb3IgY29kZSAqLworLyogUHJpdmlsZWdlZCAoY2FsbGVkIGZyb20gc3NoX2dzc2FwaV9zZXJ2ZXJfY3R4KSAqLworc3RhdGljIE9NX3VpbnQzMgorc3NoX2dzc2FwaV9hY3F1aXJlX2NyZWQoR3NzY3R4dCAqY3R4KQoreworCU9NX3VpbnQzMiBzdGF0dXM7CisJY2hhciBsbmFtZVtNQVhIT1NUTkFNRUxFTl07CisJZ3NzX09JRF9zZXQgb2lkc2V0OworCisJZ3NzX2NyZWF0ZV9lbXB0eV9vaWRfc2V0KCZzdGF0dXMsICZvaWRzZXQpOworCWdzc19hZGRfb2lkX3NldF9tZW1iZXIoJnN0YXR1cywgY3R4LT5vaWQsICZvaWRzZXQpOworCisJaWYgKGdldGhvc3RuYW1lKGxuYW1lLCBNQVhIT1NUTkFNRUxFTikpIHsKKwkJZ3NzX3JlbGVhc2Vfb2lkX3NldCgmc3RhdHVzLCAmb2lkc2V0KTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJaWYgKEdTU19FUlJPUihzc2hfZ3NzYXBpX2ltcG9ydF9uYW1lKGN0eCwgbG5hbWUpKSkgeworCQlnc3NfcmVsZWFzZV9vaWRfc2V0KCZzdGF0dXMsICZvaWRzZXQpOworCQlyZXR1cm4gKGN0eC0+bWFqb3IpOworCX0KKworCWlmICgoY3R4LT5tYWpvciA9IGdzc19hY3F1aXJlX2NyZWQoJmN0eC0+bWlub3IsCisJICAgIGN0eC0+bmFtZSwgMCwgb2lkc2V0LCBHU1NfQ19BQ0NFUFQsICZjdHgtPmNyZWRzLCBOVUxMLCBOVUxMKSkpCisJCXNzaF9nc3NhcGlfZXJyb3IoY3R4KTsKKworCWdzc19yZWxlYXNlX29pZF9zZXQoJnN0YXR1cywgJm9pZHNldCk7CisJcmV0dXJuIChjdHgtPm1ham9yKTsKK30KKworLyogUHJpdmlsZWdlZCAqLworT01fdWludDMyCitzc2hfZ3NzYXBpX3NlcnZlcl9jdHgoR3NzY3R4dCAqKmN0eCwgZ3NzX09JRCBvaWQpCit7CisJaWYgKCpjdHgpCisJCXNzaF9nc3NhcGlfZGVsZXRlX2N0eChjdHgpOworCXNzaF9nc3NhcGlfYnVpbGRfY3R4KGN0eCk7CisJc3NoX2dzc2FwaV9zZXRfb2lkKCpjdHgsIG9pZCk7CisJcmV0dXJuIChzc2hfZ3NzYXBpX2FjcXVpcmVfY3JlZCgqY3R4KSk7Cit9CisKKy8qIFVucHJpdmlsZWdlZCAqLwordm9pZAorc3NoX2dzc2FwaV9zdXBwb3J0ZWRfb2lkcyhnc3NfT0lEX3NldCAqb2lkc2V0KQoreworCWludCBpID0gMDsKKwlPTV91aW50MzIgbWluX3N0YXR1czsKKwlpbnQgcHJlc2VudDsKKwlnc3NfT0lEX3NldCBzdXBwb3J0ZWQ7CisKKwlnc3NfY3JlYXRlX2VtcHR5X29pZF9zZXQoJm1pbl9zdGF0dXMsIG9pZHNldCk7CisJZ3NzX2luZGljYXRlX21lY2hzKCZtaW5fc3RhdHVzLCAmc3VwcG9ydGVkKTsKKworCXdoaWxlIChzdXBwb3J0ZWRfbWVjaHNbaV0tPm5hbWUgIT0gTlVMTCkgeworCQlpZiAoR1NTX0VSUk9SKGdzc190ZXN0X29pZF9zZXRfbWVtYmVyKCZtaW5fc3RhdHVzLAorCQkgICAgJnN1cHBvcnRlZF9tZWNoc1tpXS0+b2lkLCBzdXBwb3J0ZWQsICZwcmVzZW50KSkpCisJCQlwcmVzZW50ID0gMDsKKwkJaWYgKHByZXNlbnQpCisJCQlnc3NfYWRkX29pZF9zZXRfbWVtYmVyKCZtaW5fc3RhdHVzLAorCQkJICAgICZzdXBwb3J0ZWRfbWVjaHNbaV0tPm9pZCwgb2lkc2V0KTsKKwkJaSsrOworCX0KKworCWdzc19yZWxlYXNlX29pZF9zZXQoJm1pbl9zdGF0dXMsICZzdXBwb3J0ZWQpOworfQorCisKKy8qIFdyYXBwZXIgYXJvdW5kIGFjY2VwdF9zZWNfY29udGV4dAorICogUmVxdWlyZXMgdGhhdCB0aGUgY29udGV4dCBjb250YWluczoKKyAqICAgIG9pZAorICogICAgY3JlZGVudGlhbHMJKGZyb20gc3NoX2dzc2FwaV9hY3F1aXJlX2NyZWQpCisgKi8KKy8qIFByaXZpbGVnZWQgKi8KK09NX3VpbnQzMgorc3NoX2dzc2FwaV9hY2NlcHRfY3R4KEdzc2N0eHQgKmN0eCwgZ3NzX2J1ZmZlcl9kZXNjICpyZWN2X3RvaywKKyAgICBnc3NfYnVmZmVyX2Rlc2MgKnNlbmRfdG9rLCBPTV91aW50MzIgKmZsYWdzKQoreworCU9NX3VpbnQzMiBzdGF0dXM7CisJZ3NzX09JRCBtZWNoOworCisJY3R4LT5tYWpvciA9IGdzc19hY2NlcHRfc2VjX2NvbnRleHQoJmN0eC0+bWlub3IsCisJICAgICZjdHgtPmNvbnRleHQsIGN0eC0+Y3JlZHMsIHJlY3ZfdG9rLAorCSAgICBHU1NfQ19OT19DSEFOTkVMX0JJTkRJTkdTLCAmY3R4LT5jbGllbnQsICZtZWNoLAorCSAgICBzZW5kX3RvaywgZmxhZ3MsIE5VTEwsICZjdHgtPmNsaWVudF9jcmVkcyk7CisKKwlpZiAoR1NTX0VSUk9SKGN0eC0+bWFqb3IpKQorCQlzc2hfZ3NzYXBpX2Vycm9yKGN0eCk7CisKKwlpZiAoY3R4LT5jbGllbnRfY3JlZHMpCisJCWRlYnVnKCJSZWNlaXZlZCBzb21lIGNsaWVudCBjcmVkZW50aWFscyIpOworCWVsc2UKKwkJZGVidWcoIkdvdCBubyBjbGllbnQgY3JlZGVudGlhbHMiKTsKKworCXN0YXR1cyA9IGN0eC0+bWFqb3I7CisKKwkvKiBOb3csIGlmIHdlJ3JlIGNvbXBsZXRlIGFuZCB3ZSBoYXZlIHRoZSByaWdodCBmbGFncywgdGhlbgorCSAqIHdlIGZsYWcgdGhlIHVzZXIgYXMgYWxzbyBoYXZpbmcgYmVlbiBhdXRoZW50aWNhdGVkCisJICovCisKKwlpZiAoKChmbGFncyA9PSBOVUxMKSB8fCAoKCpmbGFncyAmIEdTU19DX01VVFVBTF9GTEFHKSAmJgorCSAgICAoKmZsYWdzICYgR1NTX0NfSU5URUdfRkxBRykpKSAmJiAoY3R4LT5tYWpvciA9PSBHU1NfU19DT01QTEVURSkpIHsKKwkJaWYgKHNzaF9nc3NhcGlfZ2V0Y2xpZW50KGN0eCwgJmdzc2FwaV9jbGllbnQpKQorCQkJZmF0YWwoIkNvdWxkbid0IGNvbnZlcnQgY2xpZW50IG5hbWUiKTsKKwl9CisKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qCisgKiBUaGlzIHBhcnNlcyBhbiBleHBvcnRlZCBuYW1lLCBleHRyYWN0aW5nIHRoZSBtZWNoYW5pc20gc3BlY2lmaWMgcG9ydGlvbgorICogdG8gdXNlIGZvciBBQ0wgY2hlY2tpbmcuIEl0IHZlcmlmaWVzIHRoYXQgdGhlIG5hbWUgYmVsb25ncyB0aGUgbWVjaGFuaXNtCisgKiBvcmlnaW5hbGx5IHNlbGVjdGVkLgorICovCitzdGF0aWMgT01fdWludDMyCitzc2hfZ3NzYXBpX3BhcnNlX2VuYW1lKEdzc2N0eHQgKmN0eCwgZ3NzX2J1ZmZlcl90IGVuYW1lLCBnc3NfYnVmZmVyX3QgbmFtZSkKK3sKKwl1X2NoYXIgKnRvazsKKwlPTV91aW50MzIgb2Zmc2V0OworCU9NX3VpbnQzMiBvaWRsOworCisJdG9rID0gZW5hbWUtPnZhbHVlOworCisJLyoKKwkgKiBDaGVjayB0aGF0IGVuYW1lIGlzIGxvbmcgZW5vdWdoIGZvciBhbGwgb2YgdGhlIGZpeGVkIGxlbmd0aAorCSAqIGhlYWRlciwgYW5kIHRoYXQgdGhlIGluaXRpYWwgSUQgYnl0ZXMgYXJlIGNvcnJlY3QKKwkgKi8KKworCWlmIChlbmFtZS0+bGVuZ3RoIDwgNiB8fCBtZW1jbXAodG9rLCAiXHgwNFx4MDEiLCAyKSAhPSAwKQorCQlyZXR1cm4gR1NTX1NfRkFJTFVSRTsKKworCS8qCisJICogRXh0cmFjdCB0aGUgT0lELCBhbmQgY2hlY2sgaXQuIEhlcmUgR1NTQVBJIGJyZWFrcyB3aXRoIHRyYWRpdGlvbgorCSAqIGFuZCBkb2VzIHVzZSB0aGUgT0lEIHR5cGUgYW5kIGxlbmd0aCBieXRlcy4gVG8gY29uZnVzZSB0aGluZ3MKKwkgKiB0aGVyZSBhcmUgdHdvIGxlbmd0aHMgLSB0aGUgZmlyc3QgaW5jbHVkaW5nIHRoZXNlLCBhbmQgdGhlCisJICogc2Vjb25kIHdpdGhvdXQuCisJICovCisKKwlvaWRsID0gZ2V0X3UxNih0b2srMik7IC8qIGxlbmd0aCBpbmNsdWRpbmcgbmV4dCB0d28gYnl0ZXMgKi8KKwlvaWRsID0gb2lkbC0yOyAvKiB0dXJuIGl0IGludG8gdGhlIF9yZWFsXyBsZW5ndGggb2YgdGhlIHZhcmlhYmxlIE9JRCAqLworCisJLyoKKwkgKiBDaGVjayB0aGUgQkVSIGVuY29kaW5nIGZvciBjb3JyZWN0IHR5cGUgYW5kIGxlbmd0aCwgdGhhdCB0aGUKKwkgKiBzdHJpbmcgaXMgbG9uZyBlbm91Z2ggYW5kIHRoYXQgdGhlIE9JRCBtYXRjaGVzIHRoYXQgaW4gb3VyIGNvbnRleHQKKwkgKi8KKwlpZiAodG9rWzRdICE9IDB4MDYgfHwgdG9rWzVdICE9IG9pZGwgfHwKKwkgICAgZW5hbWUtPmxlbmd0aCA8IG9pZGwrNiB8fAorCSAgICAhc3NoX2dzc2FwaV9jaGVja19vaWQoY3R4LCB0b2srNiwgb2lkbCkpCisJCXJldHVybiBHU1NfU19GQUlMVVJFOworCisJb2Zmc2V0ID0gb2lkbCs2OworCisJaWYgKGVuYW1lLT5sZW5ndGggPCBvZmZzZXQrNCkKKwkJcmV0dXJuIEdTU19TX0ZBSUxVUkU7CisKKwluYW1lLT5sZW5ndGggPSBnZXRfdTMyKHRvaytvZmZzZXQpOworCW9mZnNldCArPSA0OworCisJaWYgKFVJTlRfTUFYIC0gb2Zmc2V0IDwgbmFtZS0+bGVuZ3RoKQorCQlyZXR1cm4gR1NTX1NfRkFJTFVSRTsKKwlpZiAoZW5hbWUtPmxlbmd0aCA8IG9mZnNldCtuYW1lLT5sZW5ndGgpCisJCXJldHVybiBHU1NfU19GQUlMVVJFOworCisJbmFtZS0+dmFsdWUgPSB4bWFsbG9jKG5hbWUtPmxlbmd0aCsxKTsKKwltZW1jcHkobmFtZS0+dmFsdWUsIHRvaytvZmZzZXQsIG5hbWUtPmxlbmd0aCk7CisJKChjaGFyICopbmFtZS0+dmFsdWUpW25hbWUtPmxlbmd0aF0gPSAwOworCisJcmV0dXJuIEdTU19TX0NPTVBMRVRFOworfQorCisvKiBFeHRyYWN0IHRoZSBjbGllbnQgZGV0YWlscyBmcm9tIGEgZ2l2ZW4gY29udGV4dC4gVGhpcyBjYW4gb25seSByZWxpYWJseQorICogYmUgY2FsbGVkIG9uY2UgZm9yIGEgY29udGV4dCAqLworCisvKiBQcml2aWxlZ2VkIChjYWxsZWQgZnJvbSBhY2NlcHRfc2VjdXJlX2N0eCkgKi8KK09NX3VpbnQzMgorc3NoX2dzc2FwaV9nZXRjbGllbnQoR3NzY3R4dCAqY3R4LCBzc2hfZ3NzYXBpX2NsaWVudCAqY2xpZW50KQoreworCWludCBpID0gMDsKKworCWdzc19idWZmZXJfZGVzYyBlbmFtZTsKKworCWNsaWVudC0+bWVjaCA9IE5VTEw7CisKKwl3aGlsZSAoc3VwcG9ydGVkX21lY2hzW2ldLT5uYW1lICE9IE5VTEwpIHsKKwkJaWYgKHN1cHBvcnRlZF9tZWNoc1tpXS0+b2lkLmxlbmd0aCA9PSBjdHgtPm9pZC0+bGVuZ3RoICYmCisJCSAgICAobWVtY21wKHN1cHBvcnRlZF9tZWNoc1tpXS0+b2lkLmVsZW1lbnRzLAorCQkgICAgY3R4LT5vaWQtPmVsZW1lbnRzLCBjdHgtPm9pZC0+bGVuZ3RoKSA9PSAwKSkKKwkJCWNsaWVudC0+bWVjaCA9IHN1cHBvcnRlZF9tZWNoc1tpXTsKKwkJaSsrOworCX0KKworCWlmIChjbGllbnQtPm1lY2ggPT0gTlVMTCkKKwkJcmV0dXJuIEdTU19TX0ZBSUxVUkU7CisKKwlpZiAoKGN0eC0+bWFqb3IgPSBnc3NfZGlzcGxheV9uYW1lKCZjdHgtPm1pbm9yLCBjdHgtPmNsaWVudCwKKwkgICAgJmNsaWVudC0+ZGlzcGxheW5hbWUsIE5VTEwpKSkgeworCQlzc2hfZ3NzYXBpX2Vycm9yKGN0eCk7CisJCXJldHVybiAoY3R4LT5tYWpvcik7CisJfQorCisJaWYgKChjdHgtPm1ham9yID0gZ3NzX2V4cG9ydF9uYW1lKCZjdHgtPm1pbm9yLCBjdHgtPmNsaWVudCwKKwkgICAgJmVuYW1lKSkpIHsKKwkJc3NoX2dzc2FwaV9lcnJvcihjdHgpOworCQlyZXR1cm4gKGN0eC0+bWFqb3IpOworCX0KKworCWlmICgoY3R4LT5tYWpvciA9IHNzaF9nc3NhcGlfcGFyc2VfZW5hbWUoY3R4LCZlbmFtZSwKKwkgICAgJmNsaWVudC0+ZXhwb3J0ZWRuYW1lKSkpIHsKKwkJcmV0dXJuIChjdHgtPm1ham9yKTsKKwl9CisKKwkvKiBXZSBjYW4ndCBjb3B5IHRoaXMgc3RydWN0dXJlLCBzbyB3ZSBqdXN0IG1vdmUgdGhlIHBvaW50ZXIgdG8gaXQgKi8KKwljbGllbnQtPmNyZWRzID0gY3R4LT5jbGllbnRfY3JlZHM7CisJY3R4LT5jbGllbnRfY3JlZHMgPSBHU1NfQ19OT19DUkVERU5USUFMOworCXJldHVybiAoY3R4LT5tYWpvcik7Cit9CisKKy8qIEFzIHVzZXIgLSBjYWxsZWQgb24gZmF0YWwvZXhpdCAqLwordm9pZAorc3NoX2dzc2FwaV9jbGVhbnVwX2NyZWRzKHZvaWQpCit7CisJaWYgKGdzc2FwaV9jbGllbnQuc3RvcmUuZmlsZW5hbWUgIT0gTlVMTCkgeworCQkvKiBVbmxpbmsgcHJvYmFibHkgaXNuJ3Qgc3VmZmljaWVudCAqLworCQlkZWJ1ZygicmVtb3ZpbmcgZ3NzYXBpIGNyZWQgZmlsZVwiJXNcIiIsCisJCSAgICBnc3NhcGlfY2xpZW50LnN0b3JlLmZpbGVuYW1lKTsKKwkJdW5saW5rKGdzc2FwaV9jbGllbnQuc3RvcmUuZmlsZW5hbWUpOworCX0KK30KKworLyogQXMgdXNlciAqLwordm9pZAorc3NoX2dzc2FwaV9zdG9yZWNyZWRzKHZvaWQpCit7CisJaWYgKGdzc2FwaV9jbGllbnQubWVjaCAmJiBnc3NhcGlfY2xpZW50Lm1lY2gtPnN0b3JlY3JlZHMpIHsKKwkJKCpnc3NhcGlfY2xpZW50Lm1lY2gtPnN0b3JlY3JlZHMpKCZnc3NhcGlfY2xpZW50KTsKKwl9IGVsc2UKKwkJZGVidWcoInNzaF9nc3NhcGlfc3RvcmVjcmVkczogTm90IGEgR1NTQVBJIG1lY2hhbmlzbSIpOworfQorCisvKiBUaGlzIGFsbG93cyBHU1NBUEkgbWV0aG9kcyB0byBkbyB0aGluZ3MgdG8gdGhlIGNoaWxkcyBlbnZpcm9ubWVudCBiYXNlZAorICogb24gdGhlIHBhc3NlZCBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIGFuZCBjcmVkZW50aWFscy4KKyAqLworLyogQXMgdXNlciAqLwordm9pZAorc3NoX2dzc2FwaV9kb19jaGlsZChjaGFyICoqKmVudnAsIHVfaW50ICplbnZzaXplcCkKK3sKKworCWlmIChnc3NhcGlfY2xpZW50LnN0b3JlLmVudnZhciAhPSBOVUxMICYmCisJICAgIGdzc2FwaV9jbGllbnQuc3RvcmUuZW52dmFsICE9IE5VTEwpIHsKKwkJZGVidWcoIlNldHRpbmcgJXMgdG8gJXMiLCBnc3NhcGlfY2xpZW50LnN0b3JlLmVudnZhciwKKwkJICAgIGdzc2FwaV9jbGllbnQuc3RvcmUuZW52dmFsKTsKKwkJY2hpbGRfc2V0X2VudihlbnZwLCBlbnZzaXplcCwgZ3NzYXBpX2NsaWVudC5zdG9yZS5lbnZ2YXIsCisJCSAgICBnc3NhcGlfY2xpZW50LnN0b3JlLmVudnZhbCk7CisJfQorfQorCisvKiBQcml2aWxlZ2VkICovCitpbnQKK3NzaF9nc3NhcGlfdXNlcm9rKGNoYXIgKnVzZXIpCit7CisJT01fdWludDMyIGxtaW47CisKKwlpZiAoZ3NzYXBpX2NsaWVudC5leHBvcnRlZG5hbWUubGVuZ3RoID09IDAgfHwKKwkgICAgZ3NzYXBpX2NsaWVudC5leHBvcnRlZG5hbWUudmFsdWUgPT0gTlVMTCkgeworCQlkZWJ1ZygiTm8gc3VpdGFibGUgY2xpZW50IGRhdGEiKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChnc3NhcGlfY2xpZW50Lm1lY2ggJiYgZ3NzYXBpX2NsaWVudC5tZWNoLT51c2Vyb2spCisJCWlmICgoKmdzc2FwaV9jbGllbnQubWVjaC0+dXNlcm9rKSgmZ3NzYXBpX2NsaWVudCwgdXNlcikpCisJCQlyZXR1cm4gMTsKKwkJZWxzZSB7CisJCQkvKiBEZXN0cm95IGRlbGVnYXRlZCBjcmVkZW50aWFscyBpZiB1c2Vyb2sgZmFpbHMgKi8KKwkJCWdzc19yZWxlYXNlX2J1ZmZlcigmbG1pbiwgJmdzc2FwaV9jbGllbnQuZGlzcGxheW5hbWUpOworCQkJZ3NzX3JlbGVhc2VfYnVmZmVyKCZsbWluLCAmZ3NzYXBpX2NsaWVudC5leHBvcnRlZG5hbWUpOworCQkJZ3NzX3JlbGVhc2VfY3JlZCgmbG1pbiwgJmdzc2FwaV9jbGllbnQuY3JlZHMpOworCQkJbWVtc2V0KCZnc3NhcGlfY2xpZW50LCAwLCBzaXplb2Yoc3NoX2dzc2FwaV9jbGllbnQpKTsKKwkJCXJldHVybiAwOworCQl9CisJZWxzZQorCQlkZWJ1Zygic3NoX2dzc2FwaV91c2Vyb2s6IFVua25vd24gR1NTQVBJIG1lY2hhbmlzbSIpOworCXJldHVybiAoMCk7Cit9CisKKy8qIFByaXZpbGVnZWQgKi8KK09NX3VpbnQzMgorc3NoX2dzc2FwaV9jaGVja21pYyhHc3NjdHh0ICpjdHgsIGdzc19idWZmZXJfdCBnc3NidWYsIGdzc19idWZmZXJfdCBnc3NtaWMpCit7CisJY3R4LT5tYWpvciA9IGdzc192ZXJpZnlfbWljKCZjdHgtPm1pbm9yLCBjdHgtPmNvbnRleHQsCisJICAgIGdzc2J1ZiwgZ3NzbWljLCBOVUxMKTsKKworCXJldHVybiAoY3R4LT5tYWpvcik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9ob3N0ZmlsZS5jIGIvb3BlbnNzaC02LjBwMS9ob3N0ZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZjkyNGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2hvc3RmaWxlLmMKQEAgLTAsMCArMSw0ODggQEAKKy8qICRPcGVuQlNEOiBob3N0ZmlsZS5jLHYgMS41MCAyMDEwLzEyLzA0IDEzOjMxOjM3IGRqbSBFeHAgJCAqLworLyoKKyAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAorICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIEZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBrbm93biBob3N0cyBmaWxlcy4KKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgTmllbHMgUHJvdm9zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvaG1hYy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisKKyNpbmNsdWRlIDxyZXNvbHYuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgIm1hdGNoLmgiCisjaW5jbHVkZSAia2V5LmgiCisjaW5jbHVkZSAiaG9zdGZpbGUuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisKK3N0cnVjdCBob3N0a2V5cyB7CisJc3RydWN0IGhvc3RrZXlfZW50cnkgKmVudHJpZXM7CisJdV9pbnQgbnVtX2VudHJpZXM7Cit9OworCitzdGF0aWMgaW50CitleHRyYWN0X3NhbHQoY29uc3QgY2hhciAqcywgdV9pbnQgbCwgY2hhciAqc2FsdCwgc2l6ZV90IHNhbHRfbGVuKQoreworCWNoYXIgKnAsICpiNjRzYWx0OworCXVfaW50IGI2NGxlbjsKKwlpbnQgcmV0OworCisJaWYgKGwgPCBzaXplb2YoSEFTSF9NQUdJQykgLSAxKSB7CisJCWRlYnVnMigiZXh0cmFjdF9zYWx0OiBzdHJpbmcgdG9vIHNob3J0Iik7CisJCXJldHVybiAoLTEpOworCX0KKwlpZiAoc3RybmNtcChzLCBIQVNIX01BR0lDLCBzaXplb2YoSEFTSF9NQUdJQykgLSAxKSAhPSAwKSB7CisJCWRlYnVnMigiZXh0cmFjdF9zYWx0OiBpbnZhbGlkIG1hZ2ljIGlkZW50aWZpZXIiKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCXMgKz0gc2l6ZW9mKEhBU0hfTUFHSUMpIC0gMTsKKwlsIC09IHNpemVvZihIQVNIX01BR0lDKSAtIDE7CisJaWYgKChwID0gbWVtY2hyKHMsIEhBU0hfREVMSU0sIGwpKSA9PSBOVUxMKSB7CisJCWRlYnVnMigiZXh0cmFjdF9zYWx0OiBtaXNzaW5nIHNhbHQgdGVybWluYXRpb24gY2hhcmFjdGVyIik7CisJCXJldHVybiAoLTEpOworCX0KKworCWI2NGxlbiA9IHAgLSBzOworCS8qIFNhbml0eSBjaGVjayAqLworCWlmIChiNjRsZW4gPT0gMCB8fCBiNjRsZW4gPiAxMDI0KSB7CisJCWRlYnVnMigiZXh0cmFjdF9zYWx0OiBiYWQgZW5jb2RlZCBzYWx0IGxlbmd0aCAldSIsIGI2NGxlbik7CisJCXJldHVybiAoLTEpOworCX0KKwliNjRzYWx0ID0geG1hbGxvYygxICsgYjY0bGVuKTsKKwltZW1jcHkoYjY0c2FsdCwgcywgYjY0bGVuKTsKKwliNjRzYWx0W2I2NGxlbl0gPSAnXDAnOworCisJcmV0ID0gX19iNjRfcHRvbihiNjRzYWx0LCBzYWx0LCBzYWx0X2xlbik7CisJeGZyZWUoYjY0c2FsdCk7CisJaWYgKHJldCA9PSAtMSkgeworCQlkZWJ1ZzIoImV4dHJhY3Rfc2FsdDogc2FsdCBkZWNvZGUgZXJyb3IiKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCWlmIChyZXQgIT0gU0hBX0RJR0VTVF9MRU5HVEgpIHsKKwkJZGVidWcyKCJleHRyYWN0X3NhbHQ6IGV4cGVjdGVkIHNhbHQgbGVuICVkLCBnb3QgJWQiLAorCQkgICAgU0hBX0RJR0VTVF9MRU5HVEgsIHJldCk7CisJCXJldHVybiAoLTEpOworCX0KKworCXJldHVybiAoMCk7Cit9CisKK2NoYXIgKgoraG9zdF9oYXNoKGNvbnN0IGNoYXIgKmhvc3QsIGNvbnN0IGNoYXIgKm5hbWVfZnJvbV9ob3N0ZmlsZSwgdV9pbnQgc3JjX2xlbikKK3sKKwljb25zdCBFVlBfTUQgKm1kID0gRVZQX3NoYTEoKTsKKwlITUFDX0NUWCBtYWNfY3R4OworCWNoYXIgc2FsdFsyNTZdLCByZXN1bHRbMjU2XSwgdXVfc2FsdFs1MTJdLCB1dV9yZXN1bHRbNTEyXTsKKwlzdGF0aWMgY2hhciBlbmNvZGVkWzEwMjRdOworCXVfaW50IGksIGxlbjsKKworCWxlbiA9IEVWUF9NRF9zaXplKG1kKTsKKworCWlmIChuYW1lX2Zyb21faG9zdGZpbGUgPT0gTlVMTCkgeworCQkvKiBDcmVhdGUgbmV3IHNhbHQgKi8KKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQkJc2FsdFtpXSA9IGFyYzRyYW5kb20oKTsKKwl9IGVsc2UgeworCQkvKiBFeHRyYWN0IHNhbHQgZnJvbSBrbm93biBob3N0IGVudHJ5ICovCisJCWlmIChleHRyYWN0X3NhbHQobmFtZV9mcm9tX2hvc3RmaWxlLCBzcmNfbGVuLCBzYWx0LAorCQkgICAgc2l6ZW9mKHNhbHQpKSA9PSAtMSkKKwkJCXJldHVybiAoTlVMTCk7CisJfQorCisJSE1BQ19Jbml0KCZtYWNfY3R4LCBzYWx0LCBsZW4sIG1kKTsKKwlITUFDX1VwZGF0ZSgmbWFjX2N0eCwgaG9zdCwgc3RybGVuKGhvc3QpKTsKKwlITUFDX0ZpbmFsKCZtYWNfY3R4LCByZXN1bHQsIE5VTEwpOworCUhNQUNfY2xlYW51cCgmbWFjX2N0eCk7CisKKwlpZiAoX19iNjRfbnRvcChzYWx0LCBsZW4sIHV1X3NhbHQsIHNpemVvZih1dV9zYWx0KSkgPT0gLTEgfHwKKwkgICAgX19iNjRfbnRvcChyZXN1bHQsIGxlbiwgdXVfcmVzdWx0LCBzaXplb2YodXVfcmVzdWx0KSkgPT0gLTEpCisJCWZhdGFsKCJob3N0X2hhc2g6IF9fYjY0X250b3AgZmFpbGVkIik7CisKKwlzbnByaW50ZihlbmNvZGVkLCBzaXplb2YoZW5jb2RlZCksICIlcyVzJWMlcyIsIEhBU0hfTUFHSUMsIHV1X3NhbHQsCisJICAgIEhBU0hfREVMSU0sIHV1X3Jlc3VsdCk7CisKKwlyZXR1cm4gKGVuY29kZWQpOworfQorCisvKgorICogUGFyc2VzIGFuIFJTQSAobnVtYmVyIG9mIGJpdHMsIGUsIG4pIG9yIERTQSBrZXkgZnJvbSBhIHN0cmluZy4gIE1vdmVzIHRoZQorICogcG9pbnRlciBvdmVyIHRoZSBrZXkuICBTa2lwcyBhbnkgd2hpdGVzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCBhdCBlbmQuCisgKi8KKworaW50Citob3N0ZmlsZV9yZWFkX2tleShjaGFyICoqY3BwLCB1X2ludCAqYml0c3AsIEtleSAqcmV0KQoreworCWNoYXIgKmNwOworCisJLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UuICovCisJZm9yIChjcCA9ICpjcHA7ICpjcCA9PSAnICcgfHwgKmNwID09ICdcdCc7IGNwKyspCisJCTsKKworCWlmIChrZXlfcmVhZChyZXQsICZjcCkgIT0gMSkKKwkJcmV0dXJuIDA7CisKKwkvKiBTa2lwIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovCisJZm9yICg7ICpjcCA9PSAnICcgfHwgKmNwID09ICdcdCc7IGNwKyspCisJCTsKKworCS8qIFJldHVybiByZXN1bHRzLiAqLworCSpjcHAgPSBjcDsKKwlpZiAoYml0c3AgIT0gTlVMTCkKKwkJKmJpdHNwID0ga2V5X3NpemUocmV0KTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAoraG9zdGZpbGVfY2hlY2tfa2V5KGludCBiaXRzLCBjb25zdCBLZXkgKmtleSwgY29uc3QgY2hhciAqaG9zdCwKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgdV9sb25nIGxpbmVudW0pCit7CisJaWYgKGtleSA9PSBOVUxMIHx8IGtleS0+dHlwZSAhPSBLRVlfUlNBMSB8fCBrZXktPnJzYSA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKwlpZiAoYml0cyAhPSBCTl9udW1fYml0cyhrZXktPnJzYS0+bikpIHsKKwkJbG9naXQoIldhcm5pbmc6ICVzLCBsaW5lICVsdToga2V5c2l6ZSBtaXNtYXRjaCBmb3IgaG9zdCAlczogIgorCQkgICAgImFjdHVhbCAlZCB2cy4gYW5ub3VuY2VkICVkLiIsCisJCSAgICBmaWxlbmFtZSwgbGluZW51bSwgaG9zdCwgQk5fbnVtX2JpdHMoa2V5LT5yc2EtPm4pLCBiaXRzKTsKKwkJbG9naXQoIldhcm5pbmc6IHJlcGxhY2UgJWQgd2l0aCAlZCBpbiAlcywgbGluZSAlbHUuIiwKKwkJICAgIGJpdHMsIEJOX251bV9iaXRzKGtleS0+cnNhLT5uKSwgZmlsZW5hbWUsIGxpbmVudW0pOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIEhvc3RrZXlNYXJrZXIKK2NoZWNrX21hcmtlcnMoY2hhciAqKmNwcCkKK3sKKwljaGFyIG1hcmtlclszMl0sICpzcCwgKmNwID0gKmNwcDsKKwlpbnQgcmV0ID0gTVJLX05PTkU7CisKKwl3aGlsZSAoKmNwID09ICdAJykgeworCQkvKiBPbmx5IG9uZSBtYXJrZXIgaXMgYWxsb3dlZCAqLworCQlpZiAocmV0ICE9IE1SS19OT05FKQorCQkJcmV0dXJuIE1SS19FUlJPUjsKKwkJLyogTWFya2VycyBhcmUgdGVybWluYXRlZCBieSB3aGl0ZXNwYWNlICovCisJCWlmICgoc3AgPSBzdHJjaHIoY3AsICcgJykpID09IE5VTEwgJiYKKwkJICAgIChzcCA9IHN0cmNocihjcCwgJ1x0JykpID09IE5VTEwpCisJCQlyZXR1cm4gTVJLX0VSUk9SOworCQkvKiBFeHRyYWN0IG1hcmtlciBmb3IgY29tcGFyaXNvbiAqLworCQlpZiAoc3AgPD0gY3AgKyAxIHx8IHNwID49IGNwICsgc2l6ZW9mKG1hcmtlcikpCisJCQlyZXR1cm4gTVJLX0VSUk9SOworCQltZW1jcHkobWFya2VyLCBjcCwgc3AgLSBjcCk7CisJCW1hcmtlcltzcCAtIGNwXSA9ICdcMCc7CisJCWlmIChzdHJjbXAobWFya2VyLCBDQV9NQVJLRVIpID09IDApCisJCQlyZXQgPSBNUktfQ0E7CisJCWVsc2UgaWYgKHN0cmNtcChtYXJrZXIsIFJFVk9LRV9NQVJLRVIpID09IDApCisJCQlyZXQgPSBNUktfUkVWT0tFOworCQllbHNlCisJCQlyZXR1cm4gTVJLX0VSUk9SOworCisJCS8qIFNraXAgcGFzdCBtYXJrZXIgYW5kIGFueSB3aGl0ZXNwYWNlIHRoYXQgZm9sbG93cyBpdCAqLworCQljcCA9IHNwOworCQlmb3IgKDsgKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JzsgY3ArKykKKwkJCTsKKwl9CisJKmNwcCA9IGNwOworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBob3N0a2V5cyAqCitpbml0X2hvc3RrZXlzKHZvaWQpCit7CisJc3RydWN0IGhvc3RrZXlzICpyZXQgPSB4Y2FsbG9jKDEsIHNpemVvZigqcmV0KSk7CisKKwlyZXQtPmVudHJpZXMgPSBOVUxMOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK2xvYWRfaG9zdGtleXMoc3RydWN0IGhvc3RrZXlzICpob3N0a2V5cywgY29uc3QgY2hhciAqaG9zdCwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlGSUxFICpmOworCWNoYXIgbGluZVs4MTkyXTsKKwl1X2xvbmcgbGluZW51bSA9IDAsIG51bV9sb2FkZWQgPSAwOworCWNoYXIgKmNwLCAqY3AyLCAqaGFzaGVkX2hvc3Q7CisJSG9zdGtleU1hcmtlciBtYXJrZXI7CisJS2V5ICprZXk7CisJaW50IGtiaXRzOworCisJaWYgKChmID0gZm9wZW4ocGF0aCwgInIiKSkgPT0gTlVMTCkKKwkJcmV0dXJuOworCWRlYnVnMygiJXM6IGxvYWRpbmcgZW50cmllcyBmb3IgaG9zdCBcIiUuMTAwc1wiIGZyb20gZmlsZSBcIiVzXCIiLAorCSAgICBfX2Z1bmNfXywgaG9zdCwgcGF0aCk7CisJd2hpbGUgKHJlYWRfa2V5ZmlsZV9saW5lKGYsIHBhdGgsIGxpbmUsIHNpemVvZihsaW5lKSwgJmxpbmVudW0pID09IDApIHsKKwkJY3AgPSBsaW5lOworCisJCS8qIFNraXAgYW55IGxlYWRpbmcgd2hpdGVzcGFjZSwgY29tbWVudHMgYW5kIGVtcHR5IGxpbmVzLiAqLworCQlmb3IgKDsgKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JzsgY3ArKykKKwkJCTsKKwkJaWYgKCEqY3AgfHwgKmNwID09ICcjJyB8fCAqY3AgPT0gJ1xuJykKKwkJCWNvbnRpbnVlOworCisJCWlmICgobWFya2VyID0gY2hlY2tfbWFya2VycygmY3ApKSA9PSBNUktfRVJST1IpIHsKKwkJCXZlcmJvc2UoIiVzOiBpbnZhbGlkIG1hcmtlciBhdCAlczolbHUiLAorCQkJICAgIF9fZnVuY19fLCBwYXRoLCBsaW5lbnVtKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogRmluZCB0aGUgZW5kIG9mIHRoZSBob3N0IG5hbWUgcG9ydGlvbi4gKi8KKwkJZm9yIChjcDIgPSBjcDsgKmNwMiAmJiAqY3AyICE9ICcgJyAmJiAqY3AyICE9ICdcdCc7IGNwMisrKQorCQkJOworCisJCS8qIENoZWNrIGlmIHRoZSBob3N0IG5hbWUgbWF0Y2hlcy4gKi8KKwkJaWYgKG1hdGNoX2hvc3RuYW1lKGhvc3QsIGNwLCAodV9pbnQpIChjcDIgLSBjcCkpICE9IDEpIHsKKwkJCWlmICgqY3AgIT0gSEFTSF9ERUxJTSkKKwkJCQljb250aW51ZTsKKwkJCWhhc2hlZF9ob3N0ID0gaG9zdF9oYXNoKGhvc3QsIGNwLCAodV9pbnQpIChjcDIgLSBjcCkpOworCQkJaWYgKGhhc2hlZF9ob3N0ID09IE5VTEwpIHsKKwkJCQlkZWJ1ZygiSW52YWxpZCBoYXNoZWQgaG9zdCBsaW5lICVsdSBvZiAlcyIsCisJCQkJICAgIGxpbmVudW0sIHBhdGgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHN0cm5jbXAoaGFzaGVkX2hvc3QsIGNwLCAodV9pbnQpIChjcDIgLSBjcCkpICE9IDApCisJCQkJY29udGludWU7CisJCX0KKworCQkvKiBHb3QgYSBtYXRjaC4gIFNraXAgaG9zdCBuYW1lLiAqLworCQljcCA9IGNwMjsKKworCQkvKgorCQkgKiBFeHRyYWN0IHRoZSBrZXkgZnJvbSB0aGUgbGluZS4gIFRoaXMgd2lsbCBza2lwIGFueSBsZWFkaW5nCisJCSAqIHdoaXRlc3BhY2UuICBJZ25vcmUgYmFkbHkgZm9ybWF0dGVkIGxpbmVzLgorCQkgKi8KKwkJa2V5ID0ga2V5X25ldyhLRVlfVU5TUEVDKTsKKwkJaWYgKCFob3N0ZmlsZV9yZWFkX2tleSgmY3AsICZrYml0cywga2V5KSkgeworCQkJa2V5X2ZyZWUoa2V5KTsKKwkJCWtleSA9IGtleV9uZXcoS0VZX1JTQTEpOworCQkJaWYgKCFob3N0ZmlsZV9yZWFkX2tleSgmY3AsICZrYml0cywga2V5KSkgeworCQkJCWtleV9mcmVlKGtleSk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJaWYgKCFob3N0ZmlsZV9jaGVja19rZXkoa2JpdHMsIGtleSwgaG9zdCwgcGF0aCwgbGluZW51bSkpCisJCQljb250aW51ZTsKKworCQlkZWJ1ZzMoIiVzOiBmb3VuZCAlc2tleSB0eXBlICVzIGluIGZpbGUgJXM6JWx1IiwgX19mdW5jX18sCisJCSAgICBtYXJrZXIgPT0gTVJLX05PTkUgPyAiIiA6CisJCSAgICAobWFya2VyID09IE1SS19DQSA/ICJjYSAiIDogInJldm9rZWQgIiksCisJCSAgICBrZXlfdHlwZShrZXkpLCBwYXRoLCBsaW5lbnVtKTsKKwkJaG9zdGtleXMtPmVudHJpZXMgPSB4cmVhbGxvYyhob3N0a2V5cy0+ZW50cmllcywKKwkJICAgIGhvc3RrZXlzLT5udW1fZW50cmllcyArIDEsIHNpemVvZigqaG9zdGtleXMtPmVudHJpZXMpKTsKKwkJaG9zdGtleXMtPmVudHJpZXNbaG9zdGtleXMtPm51bV9lbnRyaWVzXS5ob3N0ID0geHN0cmR1cChob3N0KTsKKwkJaG9zdGtleXMtPmVudHJpZXNbaG9zdGtleXMtPm51bV9lbnRyaWVzXS5maWxlID0geHN0cmR1cChwYXRoKTsKKwkJaG9zdGtleXMtPmVudHJpZXNbaG9zdGtleXMtPm51bV9lbnRyaWVzXS5saW5lID0gbGluZW51bTsKKwkJaG9zdGtleXMtPmVudHJpZXNbaG9zdGtleXMtPm51bV9lbnRyaWVzXS5rZXkgPSBrZXk7CisJCWhvc3RrZXlzLT5lbnRyaWVzW2hvc3RrZXlzLT5udW1fZW50cmllc10ubWFya2VyID0gbWFya2VyOworCQlob3N0a2V5cy0+bnVtX2VudHJpZXMrKzsKKwkJbnVtX2xvYWRlZCsrOworCX0KKwlkZWJ1ZzMoIiVzOiBsb2FkZWQgJWx1IGtleXMiLCBfX2Z1bmNfXywgbnVtX2xvYWRlZCk7CisJZmNsb3NlKGYpOworCXJldHVybjsKK30JCisKK3ZvaWQKK2ZyZWVfaG9zdGtleXMoc3RydWN0IGhvc3RrZXlzICpob3N0a2V5cykKK3sKKwl1X2ludCBpOworCisJZm9yIChpID0gMDsgaSA8IGhvc3RrZXlzLT5udW1fZW50cmllczsgaSsrKSB7CisJCXhmcmVlKGhvc3RrZXlzLT5lbnRyaWVzW2ldLmhvc3QpOworCQl4ZnJlZShob3N0a2V5cy0+ZW50cmllc1tpXS5maWxlKTsKKwkJa2V5X2ZyZWUoaG9zdGtleXMtPmVudHJpZXNbaV0ua2V5KTsKKwkJYnplcm8oaG9zdGtleXMtPmVudHJpZXMgKyBpLCBzaXplb2YoKmhvc3RrZXlzLT5lbnRyaWVzKSk7CisJfQorCWlmIChob3N0a2V5cy0+ZW50cmllcyAhPSBOVUxMKQorCQl4ZnJlZShob3N0a2V5cy0+ZW50cmllcyk7CisJaG9zdGtleXMtPmVudHJpZXMgPSBOVUxMOworCWhvc3RrZXlzLT5udW1fZW50cmllcyA9IDA7CisJeGZyZWUoaG9zdGtleXMpOworfQorCitzdGF0aWMgaW50CitjaGVja19rZXlfbm90X3Jldm9rZWQoc3RydWN0IGhvc3RrZXlzICpob3N0a2V5cywgS2V5ICprKQoreworCWludCBpc19jZXJ0ID0ga2V5X2lzX2NlcnQoayk7CisJdV9pbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBob3N0a2V5cy0+bnVtX2VudHJpZXM7IGkrKykgeworCQlpZiAoaG9zdGtleXMtPmVudHJpZXNbaV0ubWFya2VyICE9IE1SS19SRVZPS0UpCisJCQljb250aW51ZTsKKwkJaWYgKGtleV9lcXVhbF9wdWJsaWMoaywgaG9zdGtleXMtPmVudHJpZXNbaV0ua2V5KSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKGlzX2NlcnQgJiYKKwkJICAgIGtleV9lcXVhbF9wdWJsaWMoay0+Y2VydC0+c2lnbmF0dXJlX2tleSwKKwkJICAgIGhvc3RrZXlzLT5lbnRyaWVzW2ldLmtleSkpCisJCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogTWF0Y2gga2V5cyBhZ2FpbnN0IGEgc3BlY2lmaWVkIGtleSwgb3IgbG9vayBvbmUgdXAgYnkga2V5IHR5cGUuCisgKgorICogSWYgbG9va2luZyBmb3IgYSBrZXl0eXBlIChrZXkgPT0gTlVMTCkgYW5kIG9uZSBpcyBmb3VuZCB0aGVuIHJldHVybgorICogSE9TVF9GT1VORCwgb3RoZXJ3aXNlIEhPU1RfTkVXLgorICoKKyAqIElmIGxvb2tpbmcgZm9yIGEga2V5IChrZXkgIT0gTlVMTCk6CisgKiAgMS4gSWYgdGhlIGtleSBpcyBhIGNlcnQgYW5kIGEgbWF0Y2hpbmcgQ0EgaXMgZm91bmQsIHJldHVybiBIT1NUX09LCisgKiAgMi4gSWYgdGhlIGtleSBpcyBub3QgYSBjZXJ0IGFuZCBhIG1hdGNoaW5nIGtleSBpcyBmb3VuZCwgcmV0dXJuIEhPU1RfT0sKKyAqICAzLiBJZiBubyBrZXkgbWF0Y2hlcyBidXQgYSBrZXkgd2l0aCBhIGRpZmZlcmVudCB0eXBlIGlzIGZvdW5kLCB0aGVuCisgKiAgICAgcmV0dXJuIEhPU1RfQ0hBTkdFRAorICogIDQuIElmIG5vIG1hdGNoaW5nIGtleXMgYXJlIGZvdW5kLCB0aGVuIHJldHVybiBIT1NUX05FVy4KKyAqCisgKiBGaW5hbGx5LCBjaGVjayBhbnkgZm91bmQga2V5IGlzIG5vdCByZXZva2VkLgorICovCitzdGF0aWMgSG9zdFN0YXR1cworY2hlY2tfaG9zdGtleXNfYnlfa2V5X29yX3R5cGUoc3RydWN0IGhvc3RrZXlzICpob3N0a2V5cywKKyAgICBLZXkgKmssIGludCBrZXl0eXBlLCBjb25zdCBzdHJ1Y3QgaG9zdGtleV9lbnRyeSAqKmZvdW5kKQoreworCXVfaW50IGk7CisJSG9zdFN0YXR1cyBlbmRfcmV0dXJuID0gSE9TVF9ORVc7CisJaW50IHdhbnRfY2VydCA9IGtleV9pc19jZXJ0KGspOworCUhvc3RrZXlNYXJrZXIgd2FudF9tYXJrZXIgPSB3YW50X2NlcnQgPyBNUktfQ0EgOiBNUktfTk9ORTsKKwlpbnQgcHJvdG8gPSAoayA/IGstPnR5cGUgOiBrZXl0eXBlKSA9PSBLRVlfUlNBMSA/IDEgOiAyOworCisJaWYgKGZvdW5kICE9IE5VTEwpCisJCSpmb3VuZCA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgaG9zdGtleXMtPm51bV9lbnRyaWVzOyBpKyspIHsKKwkJaWYgKHByb3RvID09IDEgJiYgaG9zdGtleXMtPmVudHJpZXNbaV0ua2V5LT50eXBlICE9IEtFWV9SU0ExKQorCQkJY29udGludWU7CisJCWlmIChwcm90byA9PSAyICYmIGhvc3RrZXlzLT5lbnRyaWVzW2ldLmtleS0+dHlwZSA9PSBLRVlfUlNBMSkKKwkJCWNvbnRpbnVlOworCQlpZiAoaG9zdGtleXMtPmVudHJpZXNbaV0ubWFya2VyICE9IHdhbnRfbWFya2VyKQorCQkJY29udGludWU7CisJCWlmIChrID09IE5VTEwpIHsKKwkJCWlmIChob3N0a2V5cy0+ZW50cmllc1tpXS5rZXktPnR5cGUgIT0ga2V5dHlwZSkKKwkJCQljb250aW51ZTsKKwkJCWVuZF9yZXR1cm4gPSBIT1NUX0ZPVU5EOworCQkJaWYgKGZvdW5kICE9IE5VTEwpCisJCQkJKmZvdW5kID0gaG9zdGtleXMtPmVudHJpZXMgKyBpOworCQkJayA9IGhvc3RrZXlzLT5lbnRyaWVzW2ldLmtleTsKKwkJCWJyZWFrOworCQl9CisJCWlmICh3YW50X2NlcnQpIHsKKwkJCWlmIChrZXlfZXF1YWxfcHVibGljKGstPmNlcnQtPnNpZ25hdHVyZV9rZXksCisJCQkgICAgaG9zdGtleXMtPmVudHJpZXNbaV0ua2V5KSkgeworCQkJCS8qIEEgbWF0Y2hpbmcgQ0EgZXhpc3RzICovCisJCQkJZW5kX3JldHVybiA9IEhPU1RfT0s7CisJCQkJaWYgKGZvdW5kICE9IE5VTEwpCisJCQkJCSpmb3VuZCA9IGhvc3RrZXlzLT5lbnRyaWVzICsgaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChrZXlfZXF1YWwoaywgaG9zdGtleXMtPmVudHJpZXNbaV0ua2V5KSkgeworCQkJCWVuZF9yZXR1cm4gPSBIT1NUX09LOworCQkJCWlmIChmb3VuZCAhPSBOVUxMKQorCQkJCQkqZm91bmQgPSBob3N0a2V5cy0+ZW50cmllcyArIGk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBBIG5vbi1tYWNoaW5nIGtleSBleGlzdHMgKi8KKwkJCWVuZF9yZXR1cm4gPSBIT1NUX0NIQU5HRUQ7CisJCQlpZiAoZm91bmQgIT0gTlVMTCkKKwkJCQkqZm91bmQgPSBob3N0a2V5cy0+ZW50cmllcyArIGk7CisJCX0KKwl9CisJaWYgKGNoZWNrX2tleV9ub3RfcmV2b2tlZChob3N0a2V5cywgaykgIT0gMCkgeworCQllbmRfcmV0dXJuID0gSE9TVF9SRVZPS0VEOworCQlpZiAoZm91bmQgIT0gTlVMTCkKKwkJCSpmb3VuZCA9IE5VTEw7CisJfQorCXJldHVybiBlbmRfcmV0dXJuOworfQorCQorSG9zdFN0YXR1cworY2hlY2tfa2V5X2luX2hvc3RrZXlzKHN0cnVjdCBob3N0a2V5cyAqaG9zdGtleXMsIEtleSAqa2V5LAorICAgIGNvbnN0IHN0cnVjdCBob3N0a2V5X2VudHJ5ICoqZm91bmQpCit7CisJaWYgKGtleSA9PSBOVUxMKQorCQlmYXRhbCgibm8ga2V5IHRvIGxvb2sgdXAiKTsKKwlyZXR1cm4gY2hlY2tfaG9zdGtleXNfYnlfa2V5X29yX3R5cGUoaG9zdGtleXMsIGtleSwgMCwgZm91bmQpOworfQorCitpbnQKK2xvb2t1cF9rZXlfaW5faG9zdGtleXNfYnlfdHlwZShzdHJ1Y3QgaG9zdGtleXMgKmhvc3RrZXlzLCBpbnQga2V5dHlwZSwKKyAgICBjb25zdCBzdHJ1Y3QgaG9zdGtleV9lbnRyeSAqKmZvdW5kKQoreworCXJldHVybiAoY2hlY2tfaG9zdGtleXNfYnlfa2V5X29yX3R5cGUoaG9zdGtleXMsIE5VTEwsIGtleXR5cGUsCisJICAgIGZvdW5kKSA9PSBIT1NUX0ZPVU5EKTsKK30KKworLyoKKyAqIEFwcGVuZHMgYW4gZW50cnkgdG8gdGhlIGhvc3QgZmlsZS4gIFJldHVybnMgZmFsc2UgaWYgdGhlIGVudHJ5IGNvdWxkIG5vdAorICogYmUgYXBwZW5kZWQuCisgKi8KKworaW50CithZGRfaG9zdF90b19ob3N0ZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqaG9zdCwgY29uc3QgS2V5ICprZXksCisgICAgaW50IHN0b3JlX2hhc2gpCit7CisJRklMRSAqZjsKKwlpbnQgc3VjY2VzcyA9IDA7CisJY2hhciAqaGFzaGVkX2hvc3QgPSBOVUxMOworCisJaWYgKGtleSA9PSBOVUxMKQorCQlyZXR1cm4gMTsJLyogWFhYID8gKi8KKwlmID0gZm9wZW4oZmlsZW5hbWUsICJhIik7CisJaWYgKCFmKQorCQlyZXR1cm4gMDsKKworCWlmIChzdG9yZV9oYXNoKSB7CisJCWlmICgoaGFzaGVkX2hvc3QgPSBob3N0X2hhc2goaG9zdCwgTlVMTCwgMCkpID09IE5VTEwpIHsKKwkJCWVycm9yKCJhZGRfaG9zdF90b19ob3N0ZmlsZTogaG9zdF9oYXNoIGZhaWxlZCIpOworCQkJZmNsb3NlKGYpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJZnByaW50ZihmLCAiJXMgIiwgc3RvcmVfaGFzaCA/IGhhc2hlZF9ob3N0IDogaG9zdCk7CisKKwlpZiAoa2V5X3dyaXRlKGtleSwgZikpIHsKKwkJc3VjY2VzcyA9IDE7CisJfSBlbHNlIHsKKwkJZXJyb3IoImFkZF9ob3N0X3RvX2hvc3RmaWxlOiBzYXZpbmcga2V5IGluICVzIGZhaWxlZCIsIGZpbGVuYW1lKTsKKwl9CisJZnByaW50ZihmLCAiXG4iKTsKKwlmY2xvc2UoZik7CisJcmV0dXJuIHN1Y2Nlc3M7Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2hvc3RmaWxlLmggYi9vcGVuc3NoLTYuMHAxL2hvc3RmaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg0ZDQyMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvaG9zdGZpbGUuaApAQCAtMCwwICsxLDU0IEBACisvKiAkT3BlbkJTRDogaG9zdGZpbGUuaCx2IDEuMTkgMjAxMC8xMS8yOSAyMzo0NTo1MSBkam0gRXhwICQgKi8KKworLyoKKyAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAorICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICovCisjaWZuZGVmIEhPU1RGSUxFX0gKKyNkZWZpbmUgSE9TVEZJTEVfSAorCit0eXBlZGVmIGVudW0geworCUhPU1RfT0ssIEhPU1RfTkVXLCBIT1NUX0NIQU5HRUQsIEhPU1RfUkVWT0tFRCwgSE9TVF9GT1VORAorfSAgICAgICBIb3N0U3RhdHVzOworCit0eXBlZGVmIGVudW0geworCU1SS19FUlJPUiwgTVJLX05PTkUsIE1SS19SRVZPS0UsIE1SS19DQQorfQlIb3N0a2V5TWFya2VyOworCitzdHJ1Y3QgaG9zdGtleV9lbnRyeSB7CisJY2hhciAqaG9zdDsKKwljaGFyICpmaWxlOworCXVfbG9uZyBsaW5lOworCUtleSAqa2V5OworCUhvc3RrZXlNYXJrZXIgbWFya2VyOworfTsKK3N0cnVjdCBob3N0a2V5czsKKworc3RydWN0IGhvc3RrZXlzICppbml0X2hvc3RrZXlzKHZvaWQpOwordm9pZAkgbG9hZF9ob3N0a2V5cyhzdHJ1Y3QgaG9zdGtleXMgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwordm9pZAkgZnJlZV9ob3N0a2V5cyhzdHJ1Y3QgaG9zdGtleXMgKik7CisKK0hvc3RTdGF0dXMgY2hlY2tfa2V5X2luX2hvc3RrZXlzKHN0cnVjdCBob3N0a2V5cyAqLCBLZXkgKiwKKyAgICBjb25zdCBzdHJ1Y3QgaG9zdGtleV9lbnRyeSAqKik7CitpbnQJIGxvb2t1cF9rZXlfaW5faG9zdGtleXNfYnlfdHlwZShzdHJ1Y3QgaG9zdGtleXMgKiwgaW50LAorICAgIGNvbnN0IHN0cnVjdCBob3N0a2V5X2VudHJ5ICoqKTsKKworaW50CSBob3N0ZmlsZV9yZWFkX2tleShjaGFyICoqLCB1X2ludCAqLCBLZXkgKik7CitpbnQJIGFkZF9ob3N0X3RvX2hvc3RmaWxlKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBLZXkgKiwgaW50KTsKKworI2RlZmluZSBIQVNIX01BR0lDCSJ8MXwiCisjZGVmaW5lIEhBU0hfREVMSU0JJ3wnCisKKyNkZWZpbmUgQ0FfTUFSS0VSCSJAY2VydC1hdXRob3JpdHkiCisjZGVmaW5lIFJFVk9LRV9NQVJLRVIJIkByZXZva2VkIgorCitjaGFyCSpob3N0X2hhc2goY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHVfaW50KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2luY2x1ZGVzLmggYi9vcGVuc3NoLTYuMHAxL2luY2x1ZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRjNTNkOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvaW5jbHVkZXMuaApAQCAtMCwwICsxLDE3NSBAQAorLyogJE9wZW5CU0Q6IGluY2x1ZGVzLmgsdiAxLjU0IDIwMDYvMDcvMjIgMjA6NDg6MjMgc3RldmVzayBFeHAgJCAqLworCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICogVGhpcyBmaWxlIGluY2x1ZGVzIG1vc3Qgb2YgdGhlIG5lZWRlZCBzeXN0ZW0gaGVhZGVycy4KKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICovCisKKyNpZm5kZWYgSU5DTFVERVNfSAorI2RlZmluZSBJTkNMVURFU19ICisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2RlZmluZSBfR05VX1NPVVJDRSAvKiBhY3RpdmF0ZSBleHRyYSBwcm90b3R5cGVzIGZvciBnbGliYyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPiAvKiBGb3IgQ01TR18qICovCisKKyNpZmRlZiBIQVZFX0xJTUlUU19ICisjIGluY2x1ZGUgPGxpbWl0cy5oPiAvKiBGb3IgUEFUSF9NQVggKi8KKyNlbmRpZgorI2lmZGVmIEhBVkVfQlNUUklOR19ICisjIGluY2x1ZGUgPGJzdHJpbmcuaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9HTE9CX0gpICYmIGRlZmluZWQoR0xPQl9IQVNfQUxURElSRlVOQykgJiYgXAorICAgIGRlZmluZWQoR0xPQl9IQVNfR0xfTUFUQ0hDKSAmJiBkZWZpbmVkKEdMT0JfSEFTX0dMX1NUQVRWKSAmJiBcCisgICAgZGVmaW5lZChIQVZFX0RFQ0xfR0xPQl9OT01BVENIKSAmJiAgSEFWRV9ERUNMX0dMT0JfTk9NQVRDSCAhPSAwICYmIFwKKyAgICAhZGVmaW5lZChCUk9LRU5fR0xPQikKKyMgaW5jbHVkZSA8Z2xvYi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9FTkRJQU5fSAorIyBpbmNsdWRlIDxlbmRpYW4uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfVFRZRU5UX0gKKyMgaW5jbHVkZSA8dHR5ZW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VUSU1FX0gKKyMgaW5jbHVkZSA8dXRpbWUuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfTUFJTExPQ0tfSAorIyBpbmNsdWRlIDxtYWlsbG9jay5oPiAvKiBGb3IgX1BBVEhfTUFJTERJUiAqLworI2VuZGlmCisjaWZkZWYgSEFWRV9ORVhUCisjIGluY2x1ZGUgPGxpYmMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfUEFUSFNfSAorIyBpbmNsdWRlIDxwYXRocy5oPgorI2VuZGlmCisKKy8qCisgKi0qLW50by1xbnggbmVlZHMgdGhlc2UgaGVhZGVycyBmb3Igc3RyY2FzZWNtcCBhbmQgTEFTVExPR19GSUxFIHJlc3BlY3RpdmVseQorICovCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyMgaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9MT0dJTl9ICisjIGluY2x1ZGUgPGxvZ2luLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVVRNUF9ICisjICBpbmNsdWRlIDx1dG1wLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VUTVBYX0gKKyMgIGluY2x1ZGUgPHV0bXB4Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0xBU1RMT0dfSAorIyAgaW5jbHVkZSA8bGFzdGxvZy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NZU19TRUxFQ1RfSAorIyBpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19CU0RUVFlfSAorIyBpbmNsdWRlIDxzeXMvYnNkdHR5Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjIGluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorIyBpbmNsdWRlIDxzeXMvYml0eXBlcy5oPiAvKiBGb3IgdV9pbnRYWF90ICovCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19DREVGU19ICisjIGluY2x1ZGUgPHN5cy9jZGVmcy5oPiAvKiBGb3IgX19QKCkgKi8KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPiAvKiBGb3IgU18qIGNvbnN0YW50cyBhbmQgbWFjcm9zICovCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19TWVNNQUNST1NfSAorIyBpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+IC8qIEZvciBNSU4sIE1BWCwgZXRjICovCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19NTUFOX0gKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPiAvKiBmb3IgTUFQX0FOT05ZTU9VUyAqLworI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfU1RSVElPX0gKKyNpbmNsdWRlIDxzeXMvc3RydGlvLmg+CS8qIGZvciBUSU9DQ0JSSyBvbiBIUC1VWCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX1NZU19QVE1TX0gpICYmIGRlZmluZWQoSEFWRV9ERVZfUFRNWCkKKyMgaWYgZGVmaW5lZChIQVZFX1NZU19TVFJFQU1fSCkKKyMgIGluY2x1ZGUgPHN5cy9zdHJlYW0uaD4JLyogcmVxZCBmb3IgcXVldWVfdCBvbiBTb2xhcmlzIDIuNS4xICovCisjIGVuZGlmCisjaW5jbHVkZSA8c3lzL3B0bXMuaD4JLyogZm9yIGdyYW50cHQoKSBhbmQgZnJpZW5kcyAqLworI2VuZGlmCisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbl9zeXN0bS5oPiAvKiBGb3IgdHlwZWRlZnMgKi8KKyNpZmRlZiBIQVZFX1JQQ19UWVBFU19ICisjIGluY2x1ZGUgPHJwYy90eXBlcy5oPiAvKiBGb3IgSU5BRERSX0xPT1BCQUNLICovCisjZW5kaWYKKyNpZmRlZiBVU0VfUEFNCisjaWYgZGVmaW5lZChIQVZFX1NFQ1VSSVRZX1BBTV9BUFBMX0gpCisjIGluY2x1ZGUgPHNlY3VyaXR5L3BhbV9hcHBsLmg+CisjZWxpZiBkZWZpbmVkIChIQVZFX1BBTV9QQU1fQVBQTF9IKQorIyBpbmNsdWRlIDxwYW0vcGFtX2FwcGwuaD4KKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgSEFWRV9SRUFEUEFTU1BIUkFTRV9ICisjIGluY2x1ZGUgPHJlYWRwYXNzcGhyYXNlLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfSUFfSAorIyBpbmNsdWRlIDxpYS5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0lBRl9ICisjIGluY2x1ZGUgPGlhZi5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1RNUERJUl9ICisjIGluY2x1ZGUgPHRtcGRpci5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0xJQlVUSUxfSAorIyBpbmNsdWRlIDxsaWJ1dGlsLmg+IC8qIE9wZW5wdHkgb24gRnJlZUJTRCBhdCBsZWFzdCAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEtSQjUpICYmIGRlZmluZWQoVVNFX0FGUykKKyMgaW5jbHVkZSA8a3JiNS5oPgorIyBpbmNsdWRlIDxrYWZzLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoSEFWRV9TWVNfU1lTTE9HX0gpCisjIGluY2x1ZGUgPHN5cy9zeXNsb2cuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKworLyoKKyAqIE9uIEhQLVVYIDExLjExLCBzaGFkb3cuaCBhbmQgcHJvdC5oIHByb3ZpZGUgY29uZmxpY3RpbmcgZGVjbGFyYXRpb25zCisgKiBvZiBnZXRzcG5hbSB3aGVuIF9JTkNMVURFX19TVERDX18gaXMgZGVmaW5lZCwgc28gd2UgdW5zZXQgaXQgaGVyZS4KKyAqLworI2lmZGVmIEdFVFNQTkFNX0NPTkZMSUNUSU5HX0RFRlMKKyMgaWZkZWYgX0lOQ0xVREVfX1NURENfXworIyAgdW5kZWYgX0lOQ0xVREVfX1NURENfXworIyBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2x2Lmg+IC8qIEZvciBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSICovCisKKyNpbmNsdWRlICJkZWZpbmVzLmgiCisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L29wZW5ic2QtY29tcGF0LmgiCisjaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvYnNkLW5leHRzdGVwLmgiCisKKyNpbmNsdWRlICJlbnRyb3B5LmgiCisKKyNlbmRpZiAvKiBJTkNMVURFU19IICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2luc3RhbGwtc2ggYi9vcGVuc3NoLTYuMHAxL2luc3RhbGwtc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjIwYWJiZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvaW5zdGFsbC1zaApAQCAtMCwwICsxLDI1MSBAQAorIyEvYmluL3NoCisjCisjIGluc3RhbGwgLSBpbnN0YWxsIGEgcHJvZ3JhbSwgc2NyaXB0LCBvciBkYXRhZmlsZQorIyBUaGlzIGNvbWVzIGZyb20gWDExUjUgKG1pdC91dGlsL3NjcmlwdHMvaW5zdGFsbC5zaCkuCisjCisjIENvcHlyaWdodCAxOTkxIGJ5IHRoZSBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisjCisjIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworIyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorIyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworIyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBNLkkuVC4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKKyMgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAorIyB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQorIyBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKKyMgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisjCisjIENhbGxpbmcgdGhpcyBzY3JpcHQgaW5zdGFsbC1zaCBpcyBwcmVmZXJyZWQgb3ZlciBpbnN0YWxsLnNoLCB0byBwcmV2ZW50CisjIGBtYWtlJyBpbXBsaWNpdCBydWxlcyBmcm9tIGNyZWF0aW5nIGEgZmlsZSBjYWxsZWQgaW5zdGFsbCBmcm9tIGl0CisjIHdoZW4gdGhlcmUgaXMgbm8gTWFrZWZpbGUuCisjCisjIFRoaXMgc2NyaXB0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgQlNEIGluc3RhbGwgc2NyaXB0LCBidXQgd2FzIHdyaXR0ZW4KKyMgZnJvbSBzY3JhdGNoLiAgSXQgY2FuIG9ubHkgaW5zdGFsbCBvbmUgZmlsZSBhdCBhIHRpbWUsIGEgcmVzdHJpY3Rpb24KKyMgc2hhcmVkIHdpdGggbWFueSBPUydzIGluc3RhbGwgcHJvZ3JhbXMuCisKKworIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0CisKKyMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KK2RvaXQ9IiR7RE9JVFBST0ctfSIKKworCisjIHB1dCBpbiBhYnNvbHV0ZSBwYXRocyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsgb3IgdXNlIGVudi4gdmFycy4KKworbXZwcm9nPSIke01WUFJPRy1tdn0iCitjcHByb2c9IiR7Q1BQUk9HLWNwfSIKK2NobW9kcHJvZz0iJHtDSE1PRFBST0ctY2htb2R9IgorY2hvd25wcm9nPSIke0NIT1dOUFJPRy1jaG93bn0iCitjaGdycHByb2c9IiR7Q0hHUlBQUk9HLWNoZ3JwfSIKK3N0cmlwcHJvZz0iJHtTVFJJUFBST0ctc3RyaXB9Igorcm1wcm9nPSIke1JNUFJPRy1ybX0iCitta2RpcnByb2c9IiR7TUtESVJQUk9HLW1rZGlyfSIKKwordHJhbnNmb3JtYmFzZW5hbWU9IiIKK3RyYW5zZm9ybV9hcmc9IiIKK2luc3RjbWQ9IiRtdnByb2ciCitjaG1vZGNtZD0iJGNobW9kcHJvZyAwNzU1IgorY2hvd25jbWQ9IiIKK2NoZ3JwY21kPSIiCitzdHJpcGNtZD0iIgorcm1jbWQ9IiRybXByb2cgLWYiCittdmNtZD0iJG12cHJvZyIKK3NyYz0iIgorZHN0PSIiCitkaXJfYXJnPSIiCisKK3doaWxlIFsgeCIkMSIgIT0geCBdOyBkbworICAgIGNhc2UgJDEgaW4KKwktYykgaW5zdGNtZD0iJGNwcHJvZyIKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLWQpIGRpcl9hcmc9dHJ1ZQorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktbSkgY2htb2RjbWQ9IiRjaG1vZHByb2cgJDIiCisJICAgIHNoaWZ0CisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1vKSBjaG93bmNtZD0iJGNob3ducHJvZyAkMiIKKwkgICAgc2hpZnQKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLWcpIGNoZ3JwY21kPSIkY2hncnBwcm9nICQyIgorCSAgICBzaGlmdAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktcykgc3RyaXBjbWQ9IiRzdHJpcHByb2ciCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS10PSopIHRyYW5zZm9ybWFyZz1gZWNobyAkMSB8IHNlZCAncy8tdD0vLydgCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1iPSopIHRyYW5zZm9ybWJhc2VuYW1lPWBlY2hvICQxIHwgc2VkICdzLy1iPS8vJ2AKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJKikgIGlmIFsgeCIkc3JjIiA9IHggXQorCSAgICB0aGVuCisJCXNyYz0kMQorCSAgICBlbHNlCisJCSMgdGhpcyBjb2xvbiBpcyB0byB3b3JrIGFyb3VuZCBhIDM4NkJTRCAvYmluL3NoIGJ1ZworCQk6CisJCWRzdD0kMQorCSAgICBmaQorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisgICAgZXNhYworZG9uZQorCitpZiBbIHgiJHNyYyIgPSB4IF0KK3RoZW4KKwllY2hvICJpbnN0YWxsOglubyBpbnB1dCBmaWxlIHNwZWNpZmllZCIKKwlleGl0IDEKK2Vsc2UKKwl0cnVlCitmaQorCitpZiBbIHgiJGRpcl9hcmciICE9IHggXTsgdGhlbgorCWRzdD0kc3JjCisJc3JjPSIiCisJCisJaWYgWyAtZCAkZHN0IF07IHRoZW4KKwkJaW5zdGNtZD06CisJCWNobW9kY21kPSIiCisJZWxzZQorCQlpbnN0Y21kPW1rZGlyCisJZmkKK2Vsc2UKKworIyBXYWl0aW5nIGZvciB0aGlzIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSAiJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kCisjIG1pZ2h0IGNhdXNlIGRpcmVjdG9yaWVzIHRvIGJlIGNyZWF0ZWQsIHdoaWNoIHdvdWxkIGJlIGVzcGVjaWFsbHkgYmFkCisjIGlmICRzcmMgKGFuZCB0aHVzICRkc3R0bXApIGNvbnRhaW5zICcqJy4KKworCWlmIFsgLWYgJHNyYyAtbyAtZCAkc3JjIF0KKwl0aGVuCisJCXRydWUKKwllbHNlCisJCWVjaG8gImluc3RhbGw6ICAkc3JjIGRvZXMgbm90IGV4aXN0IgorCQlleGl0IDEKKwlmaQorCQorCWlmIFsgeCIkZHN0IiA9IHggXQorCXRoZW4KKwkJZWNobyAiaW5zdGFsbDoJbm8gZGVzdGluYXRpb24gc3BlY2lmaWVkIgorCQlleGl0IDEKKwllbHNlCisJCXRydWUKKwlmaQorCisjIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyBpZiB5b3VyIHN5c3RlbQorIyBkb2VzIG5vdCBsaWtlIGRvdWJsZSBzbGFzaGVzIGluIGZpbGVuYW1lcywgeW91IG1heSBuZWVkIHRvIGFkZCBzb21lIGxvZ2ljCisKKwlpZiBbIC1kICRkc3QgXQorCXRoZW4KKwkJZHN0PSIkZHN0Ii9gYmFzZW5hbWUgJHNyY2AKKwllbHNlCisJCXRydWUKKwlmaQorZmkKKworIyMgdGhpcyBzZWQgY29tbWFuZCBlbXVsYXRlcyB0aGUgZGlybmFtZSBjb21tYW5kCitkc3RkaXI9YGVjaG8gJGRzdCB8IHNlZCAtZSAncyxbXi9dKiQsLDtzLC8kLCw7cyxeJCwuLCdgCisKKyMgTWFrZSBzdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHMuCisjICB0aGlzIHBhcnQgaXMgdGFrZW4gZnJvbSBOb2FoIEZyaWVkbWFuJ3MgbWtpbnN0YWxsZGlycyBzY3JpcHQKKworIyBTa2lwIGxvdHMgb2Ygc3RhdCBjYWxscyBpbiB0aGUgdXN1YWwgY2FzZS4KK2lmIFsgISAtZCAiJGRzdGRpciIgXTsgdGhlbgorZGVmYXVsdElGUz0nCQorJworSUZTPSIke0lGUy0ke2RlZmF1bHRJRlN9fSIKKworb0lGUz0iJHtJRlN9IgorIyBTb21lIHNoJ3MgY2FuJ3QgaGFuZGxlIElGUz0vIGZvciBzb21lIHJlYXNvbi4KK0lGUz0nJScKK3NldCAtIGBlY2hvICR7ZHN0ZGlyfSB8IHNlZCAtZSAnc0AvQCVAZycgLWUgJ3NAXiVAL0AnYAorSUZTPSIke29JRlN9IgorCitwYXRoY29tcD0nJworCit3aGlsZSBbICQjIC1uZSAwIF0gOyBkbworCXBhdGhjb21wPSIke3BhdGhjb21wfSR7MX0iCisJc2hpZnQKKworCWlmIFsgISAtZCAiJHtwYXRoY29tcH0iIF0gOworCXRoZW4KKwkJJG1rZGlycHJvZyAiJHtwYXRoY29tcH0iCisJZWxzZQorCQl0cnVlCisJZmkKKworCXBhdGhjb21wPSIke3BhdGhjb21wfS8iCitkb25lCitmaQorCitpZiBbIHgiJGRpcl9hcmciICE9IHggXQordGhlbgorCSRkb2l0ICRpbnN0Y21kICRkc3QgJiYKKworCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKKwlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCisJaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgorCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkKK2Vsc2UKKworIyBJZiB3ZSdyZSBnb2luZyB0byByZW5hbWUgdGhlIGZpbmFsIGV4ZWN1dGFibGUsIGRldGVybWluZSB0aGUgbmFtZSBub3cuCisKKwlpZiBbIHgiJHRyYW5zZm9ybWFyZyIgPSB4IF0KKwl0aGVuCisJCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCisJZWxzZQorCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0ICR0cmFuc2Zvcm1iYXNlbmFtZSB8CisJCQlzZWQgJHRyYW5zZm9ybWFyZ2AkdHJhbnNmb3JtYmFzZW5hbWUKKwlmaQorCisjIGRvbid0IGFsbG93IHRoZSBzZWQgY29tbWFuZCB0byBjb21wbGV0ZWx5IGVsaW1pbmF0ZSB0aGUgZmlsZW5hbWUKKworCWlmIFsgeCIkZHN0ZmlsZSIgPSB4IF0KKwl0aGVuCisJCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCisJZWxzZQorCQl0cnVlCisJZmkKKworIyBNYWtlIGEgdGVtcCBmaWxlIG5hbWUgaW4gdGhlIHByb3BlciBkaXJlY3RvcnkuCisKKwlkc3R0bXA9JGRzdGRpci8jaW5zdC4kJCMKKworIyBNb3ZlIG9yIGNvcHkgdGhlIGZpbGUgbmFtZSB0byB0aGUgdGVtcCBuYW1lCisKKwkkZG9pdCAkaW5zdGNtZCAkc3JjICRkc3R0bXAgJiYKKworCXRyYXAgInJtIC1mICR7ZHN0dG1wfSIgMCAmJgorCisjIGFuZCBzZXQgYW55IG9wdGlvbnM7IGRvIGNobW9kIGxhc3QgdG8gcHJlc2VydmUgc2V0dWlkIGJpdHMKKworIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bworIyBpZ25vcmUgZXJyb3JzIGZyb20gYW55IG9mIHRoZXNlLCBqdXN0IG1ha2Ugc3VyZSBub3QgdG8gaWdub3JlCisjIGVycm9ycyBmcm9tIHRoZSBhYm92ZSAiJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kLgorCisJaWYgWyB4IiRjaG93bmNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG93bmNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKKwlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgorCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisJaWYgWyB4IiRjaG1vZGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG1vZGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKKworIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgorCisJJGRvaXQgJHJtY21kIC1mICRkc3RkaXIvJGRzdGZpbGUgJiYKKwkkZG9pdCAkbXZjbWQgJGRzdHRtcCAkZHN0ZGlyLyRkc3RmaWxlCisKK2ZpICYmCisKKworZXhpdCAwCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2pwYWtlLmMgYi9vcGVuc3NoLTYuMHAxL2pwYWtlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM5YTRiYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvanBha2UuYwpAQCAtMCwwICsxLDQ1NiBAQAorLyogJE9wZW5CU0Q6IGpwYWtlLmMsdiAxLjYgMjAxMC8wOS8yMCAwNDo1NDowNyBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggRGFtaWVuIE1pbGxlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFNoYXJlZCBjb21wb25lbnRzIG9mIHplcm8ta25vd2xlZGdlIHBhc3N3b3JkIGF1dGggdXNpbmcgSi1QQUtFIHByb3RvY29sCisgKiBhcyBkZXNjcmliZWQgaW46CisgKgorICogRi4gSGFvLCBQLiBSeWFuLCAiUGFzc3dvcmQgQXV0aGVudGljYXRlZCBLZXkgRXhjaGFuZ2UgYnkgSnVnZ2xpbmciLAorICogMTZ0aCBXb3Jrc2hvcCBvbiBTZWN1cml0eSBQcm90b2NvbHMsIENhbWJyaWRnZSwgQXByaWwgMjAwOAorICoKKyAqIGh0dHA6Ly9ncm91cGVyLmllZWUub3JnL2dyb3Vwcy8xMzYzL1Jlc2VhcmNoL2NvbnRyaWJ1dGlvbnMvaGFvLXJ5YW4tMjAwOC5wZGYKKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgInNzaDIuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJob3N0ZmlsZS5oIgorI2luY2x1ZGUgImF1dGguaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJwYWNrZXQuaCIKKyNpbmNsdWRlICJkaXNwYXRjaC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKworI2luY2x1ZGUgImpwYWtlLmgiCisjaW5jbHVkZSAic2Nobm9yci5oIgorCisjaWZkZWYgSlBBS0UKKworLyogUkZDMzUyNiBncm91cCA1LCAxNTM2IGJpdHMgKi8KKyNkZWZpbmUgSlBBS0VfR1JPVVBfRyAiMiIKKyNkZWZpbmUgSlBBS0VfR1JPVVBfUCBcCisJIkZGRkZGRkZGRkZGRkZGRkZDOTBGREFBMjIxNjhDMjM0QzRDNjYyOEI4MERDMUNEMTI5MDI0RTA4OEE2N0NDNzQiIFwKKwkiMDIwQkJFQTYzQjEzOUIyMjUxNEEwODc5OEUzNDA0RERFRjk1MTlCM0NEM0E0MzFCMzAyQjBBNkRGMjVGMTQzNyIgXAorCSI0RkUxMzU2RDZENTFDMjQ1RTQ4NUI1NzY2MjVFN0VDNkY0NEM0MkU5QTYzN0VENkIwQkZGNUNCNkY0MDZCN0VEIiBcCisJIkVFMzg2QkZCNUE4OTlGQTVBRTlGMjQxMTdDNEIxRkU2NDkyODY2NTFFQ0U0NUIzREMyMDA3Q0I4QTE2M0JGMDUiIFwKKwkiOThEQTQ4MzYxQzU1RDM5QTY5MTYzRkE4RkQyNENGNUY4MzY1NUQyM0RDQTNBRDk2MUM2MkYzNTYyMDg1NTJCQiIgXAorCSI5RUQ1MjkwNzcwOTY5NjZENjcwQzM1NEU0QUJDOTgwNEYxNzQ2QzA4Q0EyMzczMjdGRkZGRkZGRkZGRkZGRkZGIgorCitzdHJ1Y3QgbW9kcF9ncm91cCAqCitqcGFrZV9kZWZhdWx0X2dyb3VwKHZvaWQpCit7CisJcmV0dXJuIG1vZHBfZ3JvdXBfZnJvbV9nX2FuZF9zYWZlX3AoSlBBS0VfR1JPVVBfRywgSlBBS0VfR1JPVVBfUCk7Cit9CisKK3N0cnVjdCBqcGFrZV9jdHggKgoranBha2VfbmV3KHZvaWQpCit7CisJc3RydWN0IGpwYWtlX2N0eCAqcmV0OworCisJcmV0ID0geGNhbGxvYygxLCBzaXplb2YoKnJldCkpOworCisJcmV0LT5ncnAgPSBqcGFrZV9kZWZhdWx0X2dyb3VwKCk7CisKKwlyZXQtPnMgPSByZXQtPmsgPSBOVUxMOworCXJldC0+eDEgPSByZXQtPngyID0gcmV0LT54MyA9IHJldC0+eDQgPSBOVUxMOworCXJldC0+Z194MSA9IHJldC0+Z194MiA9IHJldC0+Z194MyA9IHJldC0+Z194NCA9IE5VTEw7CisJcmV0LT5hID0gcmV0LT5iID0gTlVMTDsKKworCXJldC0+Y2xpZW50X2lkID0gcmV0LT5zZXJ2ZXJfaWQgPSBOVUxMOworCXJldC0+aF9rX2NpZF9zZXNzaWQgPSByZXQtPmhfa19zaWRfc2Vzc2lkID0gTlVMTDsKKworCWRlYnVnMygiJXM6IGFsbG9jICVwIiwgX19mdW5jX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkCitqcGFrZV9mcmVlKHN0cnVjdCBqcGFrZV9jdHggKnBjdHgpCit7CisJZGVidWczKCIlczogZnJlZSAlcCIsIF9fZnVuY19fLCBwY3R4KTsKKworI2RlZmluZSBKUEFLRV9CTl9DTEVBUl9GUkVFKHYpCQkJXAorCWRvIHsJCQkJCVwKKwkJaWYgKCh2KSAhPSBOVUxMKSB7CQlcCisJCQlCTl9jbGVhcl9mcmVlKHYpOwlcCisJCQkodikgPSBOVUxMOwkJXAorCQl9CQkJCVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBKUEFLRV9CVUZfQ0xFQVJfRlJFRSh2LCBsKQkJXAorCWRvIHsJCQkJCVwKKwkJaWYgKCh2KSAhPSBOVUxMKSB7CQlcCisJCQliemVybygodiksIChsKSk7CVwKKwkJCXhmcmVlKHYpOwkJXAorCQkJKHYpID0gTlVMTDsJCVwKKwkJCShsKSA9IDA7CQlcCisJCX0JCQkJXAorCX0gd2hpbGUgKDApCisKKwlKUEFLRV9CTl9DTEVBUl9GUkVFKHBjdHgtPnMpOworCUpQQUtFX0JOX0NMRUFSX0ZSRUUocGN0eC0+ayk7CisJSlBBS0VfQk5fQ0xFQVJfRlJFRShwY3R4LT54MSk7CisJSlBBS0VfQk5fQ0xFQVJfRlJFRShwY3R4LT54Mik7CisJSlBBS0VfQk5fQ0xFQVJfRlJFRShwY3R4LT54Myk7CisJSlBBS0VfQk5fQ0xFQVJfRlJFRShwY3R4LT54NCk7CisJSlBBS0VfQk5fQ0xFQVJfRlJFRShwY3R4LT5nX3gxKTsKKwlKUEFLRV9CTl9DTEVBUl9GUkVFKHBjdHgtPmdfeDIpOworCUpQQUtFX0JOX0NMRUFSX0ZSRUUocGN0eC0+Z194Myk7CisJSlBBS0VfQk5fQ0xFQVJfRlJFRShwY3R4LT5nX3g0KTsKKwlKUEFLRV9CTl9DTEVBUl9GUkVFKHBjdHgtPmEpOworCUpQQUtFX0JOX0NMRUFSX0ZSRUUocGN0eC0+Yik7CisKKwlKUEFLRV9CVUZfQ0xFQVJfRlJFRShwY3R4LT5jbGllbnRfaWQsIHBjdHgtPmNsaWVudF9pZF9sZW4pOworCUpQQUtFX0JVRl9DTEVBUl9GUkVFKHBjdHgtPnNlcnZlcl9pZCwgcGN0eC0+c2VydmVyX2lkX2xlbik7CisJSlBBS0VfQlVGX0NMRUFSX0ZSRUUocGN0eC0+aF9rX2NpZF9zZXNzaWQsIHBjdHgtPmhfa19jaWRfc2Vzc2lkX2xlbik7CisJSlBBS0VfQlVGX0NMRUFSX0ZSRUUocGN0eC0+aF9rX3NpZF9zZXNzaWQsIHBjdHgtPmhfa19zaWRfc2Vzc2lkX2xlbik7CisKKyN1bmRlZiBKUEFLRV9CTl9DTEVBUl9GUkVFCisjdW5kZWYgSlBBS0VfQlVGX0NMRUFSX0ZSRUUKKworCWJ6ZXJvKHBjdHgsIHNpemVvZihwY3R4KSk7CisJeGZyZWUocGN0eCk7Cit9CisKKy8qIGR1bXAgZW50aXJlIGpwYWtlX2N0eC4gTkIuIGluY2x1ZGVzIHByaXZhdGUgdmFsdWVzISAqLwordm9pZAoranBha2VfZHVtcChzdHJ1Y3QganBha2VfY3R4ICpwY3R4LCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwljaGFyICpvdXQ7CisJdmFfbGlzdCBhcmdzOworCisJb3V0ID0gTlVMTDsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXZhc3ByaW50Zigmb3V0LCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlpZiAob3V0ID09IE5VTEwpCisJCWZhdGFsKCIlczogdmFzcHJpbnRmIGZhaWxlZCIsIF9fZnVuY19fKTsKKworCWRlYnVnMygiJXM6ICVzIChjdHggYXQgJXApIiwgX19mdW5jX18sIG91dCwgcGN0eCk7CisJaWYgKHBjdHggPT0gTlVMTCkgeworCQlmcmVlKG91dCk7CisJCXJldHVybjsKKwl9CisKKyNkZWZpbmUgSlBBS0VfRFVNUF9CTihhKQlkbyB7IFwKKwkJaWYgKChhKSAhPSBOVUxMKSBcCisJCQlKUEFLRV9ERUJVR19CTigoKGEpLCAiJXMgPSAiLCAjYSkpOyBcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSlBBS0VfRFVNUF9CVUYoYSwgYikJZG8geyBcCisJCWlmICgoYSkgIT0gTlVMTCkgXAorCQkJSlBBS0VfREVCVUdfQlVGKChhLCBiLCAiJXMiLCAjYSkpOyBcCisJfSB3aGlsZSAoMCkKKworCUpQQUtFX0RVTVBfQk4ocGN0eC0+cyk7CisJSlBBS0VfRFVNUF9CTihwY3R4LT5rKTsKKwlKUEFLRV9EVU1QX0JOKHBjdHgtPngxKTsKKwlKUEFLRV9EVU1QX0JOKHBjdHgtPngyKTsKKwlKUEFLRV9EVU1QX0JOKHBjdHgtPngzKTsKKwlKUEFLRV9EVU1QX0JOKHBjdHgtPng0KTsKKwlKUEFLRV9EVU1QX0JOKHBjdHgtPmdfeDEpOworCUpQQUtFX0RVTVBfQk4ocGN0eC0+Z194Mik7CisJSlBBS0VfRFVNUF9CTihwY3R4LT5nX3gzKTsKKwlKUEFLRV9EVU1QX0JOKHBjdHgtPmdfeDQpOworCUpQQUtFX0RVTVBfQk4ocGN0eC0+YSk7CisJSlBBS0VfRFVNUF9CTihwY3R4LT5iKTsKKworCUpQQUtFX0RVTVBfQlVGKHBjdHgtPmNsaWVudF9pZCwgcGN0eC0+Y2xpZW50X2lkX2xlbik7CisJSlBBS0VfRFVNUF9CVUYocGN0eC0+c2VydmVyX2lkLCBwY3R4LT5zZXJ2ZXJfaWRfbGVuKTsKKwlKUEFLRV9EVU1QX0JVRihwY3R4LT5oX2tfY2lkX3Nlc3NpZCwgcGN0eC0+aF9rX2NpZF9zZXNzaWRfbGVuKTsKKwlKUEFLRV9EVU1QX0JVRihwY3R4LT5oX2tfc2lkX3Nlc3NpZCwgcGN0eC0+aF9rX3NpZF9zZXNzaWRfbGVuKTsKKworCWRlYnVnMygiJXM6ICVzIGRvbmUiLCBfX2Z1bmNfXywgb3V0KTsKKwlmcmVlKG91dCk7Cit9CisKKy8qIFNoYXJlZCBwYXJ0cyBvZiBzdGVwIDEgZXhjaGFuZ2UgY2FsY3VsYXRpb24gKi8KK3ZvaWQKK2pwYWtlX3N0ZXAxKHN0cnVjdCBtb2RwX2dyb3VwICpncnAsCisgICAgdV9jaGFyICoqaWQsIHVfaW50ICppZF9sZW4sCisgICAgQklHTlVNICoqcHJpdjEsIEJJR05VTSAqKnByaXYyLCBCSUdOVU0gKipnX3ByaXYxLCBCSUdOVU0gKipnX3ByaXYyLAorICAgIHVfY2hhciAqKnByaXYxX3Byb29mLCB1X2ludCAqcHJpdjFfcHJvb2ZfbGVuLAorICAgIHVfY2hhciAqKnByaXYyX3Byb29mLCB1X2ludCAqcHJpdjJfcHJvb2ZfbGVuKQoreworCUJOX0NUWCAqYm5fY3R4OworCisJaWYgKChibl9jdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCIlczogQk5fQ1RYX25ldyIsIF9fZnVuY19fKTsKKworCS8qIFJhbmRvbSBub25jZSB0byBwcmV2ZW50IHJlcGxheSAqLworCSppZCA9IHhtYWxsb2MoS1pQX0lEX0xFTik7CisJKmlkX2xlbiA9IEtaUF9JRF9MRU47CisJYXJjNHJhbmRvbV9idWYoKmlkLCAqaWRfbGVuKTsKKworCS8qCisJICogeDEveDMgaXMgYSByYW5kb20gZWxlbWVudCBvZiBacQorCSAqIHgyL3g0IGlzIGEgcmFuZG9tIGVsZW1lbnQgb2YgWipxCisJICogV2UgYWxzbyBleGNsdWRlIFsxXSBmcm9tIHgxL3gzIGNhbmRpZGF0ZXMgYW5kIFswLCAxXSBmcm9tCisJICogeDIveDQgY2FuZGlhdGVzIHRvIGF2b2lkIHBvc3NpYmxlIGRlZ2VuZXJhY3kgKGkuZS4gZ14wLCBnXjEpLgorCSAqLworCWlmICgoKnByaXYxID0gYm5fcmFuZF9yYW5nZV9ndF9vbmUoZ3JwLT5xKSkgPT0gTlVMTCB8fAorCSAgICAoKnByaXYyID0gYm5fcmFuZF9yYW5nZV9ndF9vbmUoZ3JwLT5xKSkgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBibl9yYW5kX3JhbmdlX2d0X29uZSIsIF9fZnVuY19fKTsKKworCS8qCisJICogY2xpZW50OiBnX3gxID0gZ154MSBtb2QgcCAvIHNlcnZlcjogZ194MyA9IGdeeDMgbW9kIHAKKwkgKiBjbGllbnQ6IGdfeDIgPSBnXngyIG1vZCBwIC8gc2VydmVyOiBnX3g0ID0gZ154NCBtb2QgcAorCSAqLworCWlmICgoKmdfcHJpdjEgPSBCTl9uZXcoKSkgPT0gTlVMTCB8fAorCSAgICAoKmdfcHJpdjIgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBCTl9uZXciLCBfX2Z1bmNfXyk7CisJaWYgKEJOX21vZF9leHAoKmdfcHJpdjEsIGdycC0+ZywgKnByaXYxLCBncnAtPnAsIGJuX2N0eCkgPT0gLTEpCisJCWZhdGFsKCIlczogQk5fbW9kX2V4cCIsIF9fZnVuY19fKTsKKwlpZiAoQk5fbW9kX2V4cCgqZ19wcml2MiwgZ3JwLT5nLCAqcHJpdjIsIGdycC0+cCwgYm5fY3R4KSA9PSAtMSkKKwkJZmF0YWwoIiVzOiBCTl9tb2RfZXhwIiwgX19mdW5jX18pOworCisJLyogR2VuZXJhdGUgcHJvb2ZzIGZvciBob2xkaW5nIHgxL3gzIGFuZCB4Mi94NCAqLworCWlmIChzY2hub3JyX3NpZ25fYnVmKGdycC0+cCwgZ3JwLT5xLCBncnAtPmcsCisJICAgICpwcml2MSwgKmdfcHJpdjEsICppZCwgKmlkX2xlbiwKKwkgICAgcHJpdjFfcHJvb2YsIHByaXYxX3Byb29mX2xlbikgIT0gMCkKKwkJZmF0YWwoIiVzOiBzY2hub3JyX3NpZ24iLCBfX2Z1bmNfXyk7CisJaWYgKHNjaG5vcnJfc2lnbl9idWYoZ3JwLT5wLCBncnAtPnEsIGdycC0+ZywKKwkgICAgKnByaXYyLCAqZ19wcml2MiwgKmlkLCAqaWRfbGVuLAorCSAgICBwcml2Ml9wcm9vZiwgcHJpdjJfcHJvb2ZfbGVuKSAhPSAwKQorCQlmYXRhbCgiJXM6IHNjaG5vcnJfc2lnbiIsIF9fZnVuY19fKTsKKworCUJOX0NUWF9mcmVlKGJuX2N0eCk7Cit9CisKKy8qIFNoYXJlZCBwYXJ0cyBvZiBzdGVwIDIgZXhjaGFuZ2UgY2FsY3VsYXRpb24gKi8KK3ZvaWQKK2pwYWtlX3N0ZXAyKHN0cnVjdCBtb2RwX2dyb3VwICpncnAsIEJJR05VTSAqcywKKyAgICBCSUdOVU0gKm15cHViMSwgQklHTlVNICp0aGVpcnB1YjEsIEJJR05VTSAqdGhlaXJwdWIyLCBCSUdOVU0gKm15cHJpdjIsCisgICAgY29uc3QgdV9jaGFyICp0aGVpcmlkLCB1X2ludCB0aGVpcmlkX2xlbiwKKyAgICBjb25zdCB1X2NoYXIgKm15aWQsIHVfaW50IG15aWRfbGVuLAorICAgIGNvbnN0IHVfY2hhciAqdGhlaXJwdWIxX3Byb29mLCB1X2ludCB0aGVpcnB1YjFfcHJvb2ZfbGVuLAorICAgIGNvbnN0IHVfY2hhciAqdGhlaXJwdWIyX3Byb29mLCB1X2ludCB0aGVpcnB1YjJfcHJvb2ZfbGVuLAorICAgIEJJR05VTSAqKm5ld3B1YiwKKyAgICB1X2NoYXIgKipuZXdwdWJfZXhwb25lbnRfcHJvb2YsIHVfaW50ICpuZXdwdWJfZXhwb25lbnRfcHJvb2ZfbGVuKQoreworCUJOX0NUWCAqYm5fY3R4OworCUJJR05VTSAqdG1wLCAqZXhwb25lbnQ7CisKKwkvKiBWYWxpZGF0ZSBwZWVyJ3Mgc3RlcCAxIHZhbHVlcyAqLworCWlmIChCTl9jbXAodGhlaXJwdWIxLCBCTl92YWx1ZV9vbmUoKSkgPD0gMCkKKwkJZmF0YWwoIiVzOiB0aGVpcnB1YjEgPD0gMSIsIF9fZnVuY19fKTsKKwlpZiAoQk5fY21wKHRoZWlycHViMSwgZ3JwLT5wKSA+PSAwKQorCQlmYXRhbCgiJXM6IHRoZWlycHViMSA+PSBwIiwgX19mdW5jX18pOworCWlmIChCTl9jbXAodGhlaXJwdWIyLCBCTl92YWx1ZV9vbmUoKSkgPD0gMCkKKwkJZmF0YWwoIiVzOiB0aGVpcnB1YjIgPD0gMSIsIF9fZnVuY19fKTsKKwlpZiAoQk5fY21wKHRoZWlycHViMiwgZ3JwLT5wKSA+PSAwKQorCQlmYXRhbCgiJXM6IHRoZWlycHViMiA+PSBwIiwgX19mdW5jX18pOworCisJaWYgKHNjaG5vcnJfdmVyaWZ5X2J1ZihncnAtPnAsIGdycC0+cSwgZ3JwLT5nLCB0aGVpcnB1YjEsCisJICAgIHRoZWlyaWQsIHRoZWlyaWRfbGVuLCB0aGVpcnB1YjFfcHJvb2YsIHRoZWlycHViMV9wcm9vZl9sZW4pICE9IDEpCisJCWZhdGFsKCIlczogc2Nobm9ycl92ZXJpZnkgdGhlaXJwdWIxIGZhaWxlZCIsIF9fZnVuY19fKTsKKwlpZiAoc2Nobm9ycl92ZXJpZnlfYnVmKGdycC0+cCwgZ3JwLT5xLCBncnAtPmcsIHRoZWlycHViMiwKKwkgICAgdGhlaXJpZCwgdGhlaXJpZF9sZW4sIHRoZWlycHViMl9wcm9vZiwgdGhlaXJwdWIyX3Byb29mX2xlbikgIT0gMSkKKwkJZmF0YWwoIiVzOiBzY2hub3JyX3ZlcmlmeSB0aGVpcnB1YjIgZmFpbGVkIiwgX19mdW5jX18pOworCisJaWYgKChibl9jdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCIlczogQk5fQ1RYX25ldyIsIF9fZnVuY19fKTsKKworCWlmICgoKm5ld3B1YiA9IEJOX25ldygpKSA9PSBOVUxMIHx8CisJICAgICh0bXAgPSBCTl9uZXcoKSkgPT0gTlVMTCB8fAorCSAgICAoZXhwb25lbnQgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBCTl9uZXciLCBfX2Z1bmNfXyk7CisKKwkvKgorCSAqIGNsaWVudDogZXhwb25lbnQgPSB4MiAqIHMgbW9kIHAKKwkgKiBzZXJ2ZXI6IGV4cG9uZW50ID0geDQgKiBzIG1vZCBwCisJICovCisJaWYgKEJOX21vZF9tdWwoZXhwb25lbnQsIG15cHJpdjIsIHMsIGdycC0+cSwgYm5fY3R4KSAhPSAxKQorCQlmYXRhbCgiJXM6IEJOX21vZF9tdWwgKGV4cG9uZW50ID0gbXlwcml2MiAqIHMgbW9kIHApIiwKKwkJICAgIF9fZnVuY19fKTsKKworCS8qCisJICogY2xpZW50OiB0bXAgPSBnXih4MSArIHgzICsgeDQpIG1vZCBwCisJICogc2VydmVyOiB0bXAgPSBnXih4MSArIHgyICsgeDMpIG1vZCBwCisJICovCisJaWYgKEJOX21vZF9tdWwodG1wLCBteXB1YjEsIHRoZWlycHViMSwgZ3JwLT5wLCBibl9jdHgpICE9IDEpCisJCWZhdGFsKCIlczogQk5fbW9kX211bCAodG1wID0gbXlwdWIxICogdGhlaXJwdWIxIG1vZCBwKSIsCisJCSAgICBfX2Z1bmNfXyk7CisJaWYgKEJOX21vZF9tdWwodG1wLCB0bXAsIHRoZWlycHViMiwgZ3JwLT5wLCBibl9jdHgpICE9IDEpCisJCWZhdGFsKCIlczogQk5fbW9kX211bCAodG1wID0gdG1wICogdGhlaXJwdWIyIG1vZCBwKSIsIF9fZnVuY19fKTsKKworCS8qCisJICogY2xpZW50OiBhID0gdG1wXmV4cG9uZW50ID0gZ14oKHgxK3gzK3g0KSAqIHgyICogcykgbW9kIHAKKwkgKiBzZXJ2ZXI6IGIgPSB0bXBeZXhwb25lbnQgPSBnXigoeDEreDIreDMpICogeDQgKiBzKSBtb2QgcAorCSAqLworCWlmIChCTl9tb2RfZXhwKCpuZXdwdWIsIHRtcCwgZXhwb25lbnQsIGdycC0+cCwgYm5fY3R4KSAhPSAxKQorCQlmYXRhbCgiJXM6IEJOX21vZF9tdWwgKG5ld3B1YiA9IHRtcF5leHBvbmVudCBtb2QgcCkiLCBfX2Z1bmNfXyk7CisKKwlKUEFLRV9ERUJVR19CTigodG1wLCAiJXM6IHRtcCA9ICIsIF9fZnVuY19fKSk7CisJSlBBS0VfREVCVUdfQk4oKGV4cG9uZW50LCAiJXM6IGV4cG9uZW50ID0gIiwgX19mdW5jX18pKTsKKworCS8qIE5vdGUgdGhlIGdlbmVyYXRvciBoZXJlIGlzICd0bXAnLCBub3QgZyAqLworCWlmIChzY2hub3JyX3NpZ25fYnVmKGdycC0+cCwgZ3JwLT5xLCB0bXAsIGV4cG9uZW50LCAqbmV3cHViLAorCSAgICBteWlkLCBteWlkX2xlbiwKKwkgICAgbmV3cHViX2V4cG9uZW50X3Byb29mLCBuZXdwdWJfZXhwb25lbnRfcHJvb2ZfbGVuKSAhPSAwKQorCQlmYXRhbCgiJXM6IHNjaG5vcnJfc2lnbiBuZXdwdWIiLCBfX2Z1bmNfXyk7CisKKwlCTl9jbGVhcl9mcmVlKHRtcCk7IC8qIFhYWCBzdGFzaCBmb3IgbGF0ZXIgdXNlPyAqLworCUJOX2NsZWFyX2ZyZWUoZXhwb25lbnQpOyAvKiBYWFggc3Rhc2ggZm9yIGxhdGVyIHVzZT8gKHllcywgaW4gY29uZikgKi8KKworCUJOX0NUWF9mcmVlKGJuX2N0eCk7Cit9CisKKy8qIENvbmZpcm1hdGlvbiBoYXNoIGNhbGN1bGF0aW9uICovCit2b2lkCitqcGFrZV9jb25maXJtX2hhc2goY29uc3QgQklHTlVNICprLAorICAgIGNvbnN0IHVfY2hhciAqZW5kcG9pbnRfaWQsIHVfaW50IGVuZHBvaW50X2lkX2xlbiwKKyAgICBjb25zdCB1X2NoYXIgKnNlc3NfaWQsIHVfaW50IHNlc3NfaWRfbGVuLAorICAgIHVfY2hhciAqKmNvbmZpcm1faGFzaCwgdV9pbnQgKmNvbmZpcm1faGFzaF9sZW4pCit7CisJQnVmZmVyIGI7CisKKwkvKgorCSAqIENhbGN1bGF0ZSBjb25maXJtYXRpb24gcHJvb2Y6CisJICogICAgIGNsaWVudDogSChrIHx8IGNsaWVudF9pZCB8fCBzZXNzaW9uX2lkKQorCSAqICAgICBzZXJ2ZXI6IEgoayB8fCBzZXJ2ZXJfaWQgfHwgc2Vzc2lvbl9pZCkKKwkgKi8KKwlidWZmZXJfaW5pdCgmYik7CisJYnVmZmVyX3B1dF9iaWdudW0yKCZiLCBrKTsKKwlidWZmZXJfcHV0X3N0cmluZygmYiwgZW5kcG9pbnRfaWQsIGVuZHBvaW50X2lkX2xlbik7CisJYnVmZmVyX3B1dF9zdHJpbmcoJmIsIHNlc3NfaWQsIHNlc3NfaWRfbGVuKTsKKwlpZiAoaGFzaF9idWZmZXIoYnVmZmVyX3B0cigmYiksIGJ1ZmZlcl9sZW4oJmIpLCBFVlBfc2hhMjU2KCksCisJICAgIGNvbmZpcm1faGFzaCwgY29uZmlybV9oYXNoX2xlbikgIT0gMCkKKwkJZmF0YWwoIiVzOiBoYXNoX2J1ZmZlciIsIF9fZnVuY19fKTsKKwlidWZmZXJfZnJlZSgmYik7Cit9CisKKy8qIFNoYXJlZCBwYXJ0cyBvZiBrZXkgZGVyaXZhdGlvbiBhbmQgY29uZmlybWF0aW9uIGNhbGN1bGF0aW9uICovCit2b2lkCitqcGFrZV9rZXlfY29uZmlybShzdHJ1Y3QgbW9kcF9ncm91cCAqZ3JwLCBCSUdOVU0gKnMsIEJJR05VTSAqc3RlcDJfdmFsLAorICAgIEJJR05VTSAqbXlwcml2MiwgQklHTlVNICpteXB1YjEsIEJJR05VTSAqbXlwdWIyLAorICAgIEJJR05VTSAqdGhlaXJwdWIxLCBCSUdOVU0gKnRoZWlycHViMiwKKyAgICBjb25zdCB1X2NoYXIgKm15X2lkLCB1X2ludCBteV9pZF9sZW4sCisgICAgY29uc3QgdV9jaGFyICp0aGVpcl9pZCwgdV9pbnQgdGhlaXJfaWRfbGVuLAorICAgIGNvbnN0IHVfY2hhciAqc2Vzc19pZCwgdV9pbnQgc2Vzc19pZF9sZW4sCisgICAgY29uc3QgdV9jaGFyICp0aGVpcnByaXYyX3NfcHJvb2YsIHVfaW50IHRoZWlycHJpdjJfc19wcm9vZl9sZW4sCisgICAgQklHTlVNICoqaywKKyAgICB1X2NoYXIgKipjb25maXJtX2hhc2gsIHVfaW50ICpjb25maXJtX2hhc2hfbGVuKQoreworCUJOX0NUWCAqYm5fY3R4OworCUJJR05VTSAqdG1wOworCisJaWYgKChibl9jdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCIlczogQk5fQ1RYX25ldyIsIF9fZnVuY19fKTsKKwlpZiAoKHRtcCA9IEJOX25ldygpKSA9PSBOVUxMIHx8CisJICAgICgqayA9IEJOX25ldygpKSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IEJOX25ldyIsIF9fZnVuY19fKTsKKworCS8qIFZhbGlkYXRlIHN0ZXAgMiB2YWx1ZXMgKi8KKwlpZiAoQk5fY21wKHN0ZXAyX3ZhbCwgQk5fdmFsdWVfb25lKCkpIDw9IDApCisJCWZhdGFsKCIlczogc3RlcDJfdmFsIDw9IDEiLCBfX2Z1bmNfXyk7CisJaWYgKEJOX2NtcChzdGVwMl92YWwsIGdycC0+cCkgPj0gMCkKKwkJZmF0YWwoIiVzOiBzdGVwMl92YWwgPj0gcCIsIF9fZnVuY19fKTsKKworCS8qCisJICogdGhlaXJwcml2Ml9zX3Byb29mIGlzIGNhbGN1bGF0ZWQgd2l0aCBhIGRpZmZlcmVudCBnZW5lcmF0b3I6CisJICogdG1wID0gZ14obXlwcml2MStteXByaXYyK3RoZWlycHViMSkgPSBnXm15cHViMSpnXm15cHViMipnXnRoZWlycHViMQorCSAqIENhbGN1bGF0ZSBpdCBoZXJlIHNvIHdlIGNhbiBjaGVjayB0aGUgc2lnbmF0dXJlLgorCSAqLworCWlmIChCTl9tb2RfbXVsKHRtcCwgbXlwdWIxLCBteXB1YjIsIGdycC0+cCwgYm5fY3R4KSAhPSAxKQorCQlmYXRhbCgiJXM6IEJOX21vZF9tdWwgKHRtcCA9IG15cHViMSAqIG15cHViMiBtb2QgcCkiLCBfX2Z1bmNfXyk7CisJaWYgKEJOX21vZF9tdWwodG1wLCB0bXAsIHRoZWlycHViMSwgZ3JwLT5wLCBibl9jdHgpICE9IDEpCisJCWZhdGFsKCIlczogQk5fbW9kX211bCAodG1wID0gdG1wICogdGhlaXJwdWIxIG1vZCBwKSIsIF9fZnVuY19fKTsKKworCUpQQUtFX0RFQlVHX0JOKCh0bXAsICIlczogdG1wID0gIiwgX19mdW5jX18pKTsKKworCWlmIChzY2hub3JyX3ZlcmlmeV9idWYoZ3JwLT5wLCBncnAtPnEsIHRtcCwgc3RlcDJfdmFsLCAKKwkgICAgdGhlaXJfaWQsIHRoZWlyX2lkX2xlbiwKKwkgICAgdGhlaXJwcml2Ml9zX3Byb29mLCB0aGVpcnByaXYyX3NfcHJvb2ZfbGVuKSAhPSAxKQorCQlmYXRhbCgiJXM6IHNjaG5vcnJfdmVyaWZ5IHRoZWlycHJpdjJfc19wcm9vZiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisKKwkvKgorCSAqIERlcml2ZSBzaGFyZWQga2V5OgorCSAqICAgICBjbGllbnQ6IGsgPSAoYiAvIGdeKHgyKng0KnMpKV54MiA9IGdeKCh4MSt4MykqeDIqeDQqcykKKwkgKiAgICAgc2VydmVyOiBrID0gKGEgLyBnXih4Mip4NCpzKSleeDQgPSBnXigoeDEreDMpKngyKng0KnMpCisJICoKKwkgKiBDb21wdXRlZCBhczoKKwkgKiAgICAgY2xpZW50OiBrID0gKGdfeDReKHEgLSAoeDIgKiBzKSkgKiBiKV54MiBtb2QgcAorCSAqICAgICBzZXJ2ZXI6IGsgPSAoZ194Ml4ocSAtICh4NCAqIHMpKSAqIGIpXng0IG1vZCBwCisJICovCisJaWYgKEJOX211bCh0bXAsIG15cHJpdjIsIHMsIGJuX2N0eCkgIT0gMSkKKwkJZmF0YWwoIiVzOiBCTl9tdWwgKHRtcCA9IG15cHJpdjIgKiBzKSIsIF9fZnVuY19fKTsKKwlpZiAoQk5fbW9kX3N1Yih0bXAsIGdycC0+cSwgdG1wLCBncnAtPnEsIGJuX2N0eCkgIT0gMSkKKwkJZmF0YWwoIiVzOiBCTl9tb2Rfc3ViICh0bXAgPSBxIC0gdG1wIG1vZCBxKSIsIF9fZnVuY19fKTsKKwlpZiAoQk5fbW9kX2V4cCh0bXAsIHRoZWlycHViMiwgdG1wLCBncnAtPnAsIGJuX2N0eCkgIT0gMSkKKwkJZmF0YWwoIiVzOiBCTl9tb2RfZXhwICh0bXAgPSB0aGVpcnB1YjJedG1wKSBtb2QgcCIsIF9fZnVuY19fKTsKKwlpZiAoQk5fbW9kX211bCh0bXAsIHRtcCwgc3RlcDJfdmFsLCBncnAtPnAsIGJuX2N0eCkgIT0gMSkKKwkJZmF0YWwoIiVzOiBCTl9tb2RfbXVsICh0bXAgPSB0bXAgKiBzdGVwMl92YWwpIG1vZCBwIiwgX19mdW5jX18pOworCWlmIChCTl9tb2RfZXhwKCprLCB0bXAsIG15cHJpdjIsIGdycC0+cCwgYm5fY3R4KSAhPSAxKQorCQlmYXRhbCgiJXM6IEJOX21vZF9leHAgKGsgPSB0bXBebXlwcml2MikgbW9kIHAiLCBfX2Z1bmNfXyk7CisJCisJQk5fQ1RYX2ZyZWUoYm5fY3R4KTsKKwlCTl9jbGVhcl9mcmVlKHRtcCk7CisKKwlqcGFrZV9jb25maXJtX2hhc2goKmssIG15X2lkLCBteV9pZF9sZW4sIHNlc3NfaWQsIHNlc3NfaWRfbGVuLAorCSAgICBjb25maXJtX2hhc2gsIGNvbmZpcm1faGFzaF9sZW4pOworfQorCisvKgorICogQ2FsY3VsYXRlIGFuZCBjaGVjayBjb25maXJtYXRpb24gaGFzaCBmcm9tIHBlZXIuIFJldHVybnMgMSBvbiBzdWNjZXNzCisgKiAwIG9uIGZhaWx1cmUvbWlzbWF0Y2guCisgKi8KK2ludAoranBha2VfY2hlY2tfY29uZmlybShjb25zdCBCSUdOVU0gKmssCisgICAgY29uc3QgdV9jaGFyICpwZWVyX2lkLCB1X2ludCBwZWVyX2lkX2xlbiwKKyAgICBjb25zdCB1X2NoYXIgKnNlc3NfaWQsIHVfaW50IHNlc3NfaWRfbGVuLAorICAgIGNvbnN0IHVfY2hhciAqcGVlcl9jb25maXJtX2hhc2gsIHVfaW50IHBlZXJfY29uZmlybV9oYXNoX2xlbikKK3sKKwl1X2NoYXIgKmV4cGVjdGVkX2NvbmZpcm1faGFzaDsKKwl1X2ludCBleHBlY3RlZF9jb25maXJtX2hhc2hfbGVuOworCWludCBzdWNjZXNzID0gMDsKKworCS8qIENhbGN1bGF0ZSBhbmQgdmVyaWZ5IGV4cGVjdGVkIGNvbmZpcm1hdGlvbiBoYXNoICovCisJanBha2VfY29uZmlybV9oYXNoKGssIHBlZXJfaWQsIHBlZXJfaWRfbGVuLCBzZXNzX2lkLCBzZXNzX2lkX2xlbiwKKwkgICAgJmV4cGVjdGVkX2NvbmZpcm1faGFzaCwgJmV4cGVjdGVkX2NvbmZpcm1faGFzaF9sZW4pOworCisJSlBBS0VfREVCVUdfQlVGKChleHBlY3RlZF9jb25maXJtX2hhc2gsIGV4cGVjdGVkX2NvbmZpcm1faGFzaF9sZW4sCisJICAgICIlczogZXhwZWN0ZWQgY29uZmlybSBoYXNoIiwgX19mdW5jX18pKTsKKwlKUEFLRV9ERUJVR19CVUYoKHBlZXJfY29uZmlybV9oYXNoLCBwZWVyX2NvbmZpcm1faGFzaF9sZW4sCisJICAgICIlczogcmVjZWl2ZWQgY29uZmlybSBoYXNoIiwgX19mdW5jX18pKTsKKworCWlmIChwZWVyX2NvbmZpcm1faGFzaF9sZW4gIT0gZXhwZWN0ZWRfY29uZmlybV9oYXNoX2xlbikKKwkJZXJyb3IoIiVzOiBjb25maXJtYXRpb24gbGVuZ3RoIG1pc21hdGNoIChteSAldSB0aGVtICV1KSIsCisJCSAgICBfX2Z1bmNfXywgZXhwZWN0ZWRfY29uZmlybV9oYXNoX2xlbiwgcGVlcl9jb25maXJtX2hhc2hfbGVuKTsKKwllbHNlIGlmICh0aW1pbmdzYWZlX2JjbXAocGVlcl9jb25maXJtX2hhc2gsIGV4cGVjdGVkX2NvbmZpcm1faGFzaCwKKwkgICAgZXhwZWN0ZWRfY29uZmlybV9oYXNoX2xlbikgPT0gMCkKKwkJc3VjY2VzcyA9IDE7CisJYnplcm8oZXhwZWN0ZWRfY29uZmlybV9oYXNoLCBleHBlY3RlZF9jb25maXJtX2hhc2hfbGVuKTsKKwl4ZnJlZShleHBlY3RlZF9jb25maXJtX2hhc2gpOworCWRlYnVnMygiJXM6IHN1Y2Nlc3MgPSAlZCIsIF9fZnVuY19fLCBzdWNjZXNzKTsKKwlyZXR1cm4gc3VjY2VzczsKK30KKworLyogWFhYIG1haW4oKSBmdW5jdGlvbiB3aXRoIHRlc3RzICovCisKKyNlbmRpZiAvKiBKUEFLRSAqLworCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2pwYWtlLmggYi9vcGVuc3NoLTYuMHAxL2pwYWtlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmMmNmMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvanBha2UuaApAQCAtMCwwICsxLDExNCBAQAorLyogJE9wZW5CU0Q6IGpwYWtlLmgsdiAxLjIgMjAwOS8wMy8wNSAwNzoxODoxOSBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggRGFtaWVuIE1pbGxlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBKUEFLRV9ICisjZGVmaW5lIEpQQUtFX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorCisvKiBTZXQgSlBBS0VfREVCVUcgaW4gQ0ZMQUdTIGZvciBwcml2YWN5LXZpb2xhdGluZyBkZWJ1Z2dpbmcgKi8KKyNpZm5kZWYgSlBBS0VfREVCVUcKKyMgZGVmaW5lIEpQQUtFX0RFQlVHX0JOKGEpCisjIGRlZmluZSBKUEFLRV9ERUJVR19CVUYoYSkKKyMgZGVmaW5lIEpQQUtFX0RFQlVHX0NUWChhKQorI2Vsc2UKKyMgZGVmaW5lIEpQQUtFX0RFQlVHX0JOKGEpCWRlYnVnM19ibiBhCisjIGRlZmluZSBKUEFLRV9ERUJVR19CVUYoYSkJZGVidWczX2J1ZiBhCisjIGRlZmluZSBKUEFLRV9ERUJVR19DVFgoYSkJanBha2VfZHVtcCBhCisjZW5kaWYgLyogSlBBS0VfREVCVUcgKi8KKworI2RlZmluZSBLWlBfSURfTEVOCTE2CS8qIExlbmd0aCBvZiBjbGllbnQgYW5kIHNlcnZlciBJRHMgKi8KKworc3RydWN0IGpwYWtlX2N0eCB7CisJLyogUGFyYW1ldGVycyAqLworCXN0cnVjdCBtb2RwX2dyb3VwICpncnA7CisKKwkvKiBQcml2YXRlIHZhbHVlcyBzaGFyZWQgYnkgY2xpZW50IGFuZCBzZXJ2ZXIgKi8KKwlCSUdOVU0gKnM7CQkJLyogU2VjcmV0IChzYWx0ZWQsIGNyeXB0ZWQgcGFzc3dvcmQpICovCisJQklHTlVNICprOwkJCS8qIERlcml2ZWQga2V5ICovCisKKwkvKiBDbGllbnQgcHJpdmF0ZSB2YWx1ZXMgKE5VTEwgZm9yIHNlcnZlcikgKi8KKwlCSUdOVU0gKngxOwkJCS8qIHJhbmRvbSBpbiBacSAqLworCUJJR05VTSAqeDI7CQkJLyogcmFuZG9tIGluIFoqcSAqLworCisJLyogU2VydmVyIHByaXZhdGUgdmFsdWVzIChOVUxMIGZvciBzZXJ2ZXIpICovCisJQklHTlVNICp4MzsJCQkvKiByYW5kb20gaW4gWnEgKi8KKwlCSUdOVU0gKng0OwkJCS8qIHJhbmRvbSBpbiBaKnEgKi8KKworCS8qIFN0ZXAgMTogQy0+UyAqLworCXVfY2hhciAqY2xpZW50X2lkOwkJLyogQW50aS1yZXBsYXkgbm9uY2UgKi8KKwl1X2ludCBjbGllbnRfaWRfbGVuOworCUJJR05VTSAqZ194MTsJCQkvKiBnXngxICovCisJQklHTlVNICpnX3gyOwkJCS8qIGdeeDIgKi8KKworCS8qIFN0ZXAgMTogUy0+QyAqLworCXVfY2hhciAqc2VydmVyX2lkOwkJLyogQW50aS1yZXBsYXkgbm9uY2UgKi8KKwl1X2ludCBzZXJ2ZXJfaWRfbGVuOworCUJJR05VTSAqZ194MzsJCQkvKiBnXngzICovCisJQklHTlVNICpnX3g0OwkJCS8qIGdeeDQgKi8KKworCS8qIFN0ZXAgMjogQy0+UyAqLworCUJJR05VTSAqYTsJCQkvKiBnXigoeDEreDMreDQpKngyKnMpICovCisKKwkvKiBTdGVwIDI6IFMtPkMgKi8KKwlCSUdOVU0gKmI7CQkJLyogZ14oKHgxK3gyK3gzKSp4NCpzKSAqLworCisJLyogQ29uZmlybWF0aW9uOiBDLT5TICovCisJdV9jaGFyICpoX2tfY2lkX3Nlc3NpZDsJCS8qIEgoayB8fCBjbGllbnRfaWQgfHwgc2Vzc2lvbl9pZCkgKi8KKwl1X2ludCBoX2tfY2lkX3Nlc3NpZF9sZW47CisKKwkvKiBDb25maXJtYXRpb246IFMtPkMgKi8KKwl1X2NoYXIgKmhfa19zaWRfc2Vzc2lkOwkJLyogSChrIHx8IHNlcnZlcl9pZCB8fCBzZXNzaW9uX2lkKSAqLworCXVfaW50IGhfa19zaWRfc2Vzc2lkX2xlbjsKK307CisKKy8qIGpwYWtlLmMgKi8KK3N0cnVjdCBtb2RwX2dyb3VwICpqcGFrZV9kZWZhdWx0X2dyb3VwKHZvaWQpOwordm9pZCBqcGFrZV9kdW1wKHN0cnVjdCBqcGFrZV9jdHggKiwgY29uc3QgY2hhciAqLCAuLi4pCisgICAgX19hdHRyaWJ1dGVfXygoX19ub25udWxsX18gKDIpKSkKKyAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpOworc3RydWN0IGpwYWtlX2N0eCAqanBha2VfbmV3KHZvaWQpOwordm9pZCBqcGFrZV9mcmVlKHN0cnVjdCBqcGFrZV9jdHggKik7CisKK3ZvaWQganBha2Vfc3RlcDEoc3RydWN0IG1vZHBfZ3JvdXAgKiwgdV9jaGFyICoqLCB1X2ludCAqLAorICAgIEJJR05VTSAqKiwgQklHTlVNICoqLCBCSUdOVU0gKiosIEJJR05VTSAqKiwKKyAgICB1X2NoYXIgKiosIHVfaW50ICosIHVfY2hhciAqKiwgdV9pbnQgKik7CisKK3ZvaWQganBha2Vfc3RlcDIoc3RydWN0IG1vZHBfZ3JvdXAgKiwgQklHTlVNICosCisgICAgQklHTlVNICosIEJJR05VTSAqLCBCSUdOVU0gKiwgQklHTlVNICosCisgICAgY29uc3QgdV9jaGFyICosIHVfaW50LCBjb25zdCB1X2NoYXIgKiwgdV9pbnQsCisgICAgY29uc3QgdV9jaGFyICosIHVfaW50LCBjb25zdCB1X2NoYXIgKiwgdV9pbnQsCisgICAgQklHTlVNICoqLCB1X2NoYXIgKiosIHVfaW50ICopOworCit2b2lkIGpwYWtlX2NvbmZpcm1faGFzaChjb25zdCBCSUdOVU0gKiwKKyAgICBjb25zdCB1X2NoYXIgKiwgdV9pbnQsCisgICAgY29uc3QgdV9jaGFyICosIHVfaW50LAorICAgIHVfY2hhciAqKiwgdV9pbnQgKik7CisKK3ZvaWQganBha2Vfa2V5X2NvbmZpcm0oc3RydWN0IG1vZHBfZ3JvdXAgKiwgQklHTlVNICosIEJJR05VTSAqLAorICAgIEJJR05VTSAqLCBCSUdOVU0gKiwgQklHTlVNICosIEJJR05VTSAqLCBCSUdOVU0gKiwKKyAgICBjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGNvbnN0IHVfY2hhciAqLCB1X2ludCwKKyAgICBjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGNvbnN0IHVfY2hhciAqLCB1X2ludCwKKyAgICBCSUdOVU0gKiosIHVfY2hhciAqKiwgdV9pbnQgKik7CisKK2ludCBqcGFrZV9jaGVja19jb25maXJtKGNvbnN0IEJJR05VTSAqLCBjb25zdCB1X2NoYXIgKiwgdV9pbnQsCisgICAgY29uc3QgdV9jaGFyICosIHVfaW50LCBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworCisjZW5kaWYgLyogSlBBS0VfSCAqLworCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2tleC5jIGIvb3BlbnNzaC02LjBwMS9rZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjVlMjhmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9rZXguYwpAQCAtMCwwICsxLDYxMCBAQAorLyogJE9wZW5CU0Q6IGtleC5jLHYgMS44NiAyMDEwLzA5LzIyIDA1OjAxOjI5IGRqbSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgInNzaDIuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJwYWNrZXQuaCIKKyNpbmNsdWRlICJjb21wYXQuaCIKKyNpbmNsdWRlICJjaXBoZXIuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJrZXguaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJtYWMuaCIKKyNpbmNsdWRlICJtYXRjaC5oIgorI2luY2x1ZGUgImRpc3BhdGNoLmgiCisjaW5jbHVkZSAibW9uaXRvci5oIgorI2luY2x1ZGUgInJvYW1pbmcuaCIKKworI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwNzAwMEwKKyMgaWYgZGVmaW5lZChIQVZFX0VWUF9TSEEyNTYpCisjIGRlZmluZSBldnBfc3NoX3NoYTI1NiBFVlBfc2hhMjU2CisjIGVsc2UKK2V4dGVybiBjb25zdCBFVlBfTUQgKmV2cF9zc2hfc2hhMjU2KHZvaWQpOworIyBlbmRpZgorI2VuZGlmCisKKy8qIHByb3RvdHlwZSAqLworc3RhdGljIHZvaWQga2V4X2tleGluaXRfZmluaXNoKEtleCAqKTsKK3N0YXRpYyB2b2lkIGtleF9jaG9vc2VfY29uZihLZXggKik7CisKKy8qIFZhbGlkYXRlIEtFWCBtZXRob2QgbmFtZSBsaXN0ICovCitpbnQKK2tleF9uYW1lc192YWxpZChjb25zdCBjaGFyICpuYW1lcykKK3sKKwljaGFyICpzLCAqY3AsICpwOworCisJaWYgKG5hbWVzID09IE5VTEwgfHwgc3RyY21wKG5hbWVzLCAiIikgPT0gMCkKKwkJcmV0dXJuIDA7CisJcyA9IGNwID0geHN0cmR1cChuYW1lcyk7CisJZm9yICgocCA9IHN0cnNlcCgmY3AsICIsIikpOyBwICYmICpwICE9ICdcMCc7CisJICAgIChwID0gc3Ryc2VwKCZjcCwgIiwiKSkpIHsKKwkgICAgCWlmIChzdHJjbXAocCwgS0VYX0RIR0VYX1NIQTI1NikgIT0gMCAmJgorCQkgICAgc3RyY21wKHAsIEtFWF9ESEdFWF9TSEExKSAhPSAwICYmCisJCSAgICBzdHJjbXAocCwgS0VYX0RIMTQpICE9IDAgJiYKKwkJICAgIHN0cmNtcChwLCBLRVhfREgxKSAhPSAwICYmCisJCSAgICAoc3RybmNtcChwLCBLRVhfRUNESF9TSEEyX1NURU0sCisJCSAgICBzaXplb2YoS0VYX0VDREhfU0hBMl9TVEVNKSAtIDEpICE9IDAgfHwKKwkJICAgIGtleF9lY2RoX25hbWVfdG9fbmlkKHApID09IC0xKSkgeworCQkJZXJyb3IoIlVuc3VwcG9ydGVkIEtFWCBhbGdvcml0aG0gXCIlLjEwMHNcIiIsIHApOworCQkJeGZyZWUocyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlkZWJ1ZzMoImtleCBuYW1lcyBvazogWyVzXSIsIG5hbWVzKTsKKwl4ZnJlZShzKTsKKwlyZXR1cm4gMTsKK30KKworLyogcHV0IGFsZ29yaXRobSBwcm9wb3NhbCBpbnRvIGJ1ZmZlciAqLworc3RhdGljIHZvaWQKK2tleF9wcm9wMmJ1ZihCdWZmZXIgKmIsIGNoYXIgKnByb3Bvc2FsW1BST1BPU0FMX01BWF0pCit7CisJdV9pbnQgaTsKKworCWJ1ZmZlcl9jbGVhcihiKTsKKwkvKgorCSAqIGFkZCBhIGR1bW15IGNvb2tpZSwgdGhlIGNvb2tpZSB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5CisJICoga2V4X3NlbmRfa2V4aW5pdCgpLCBlYWNoIHRpbWUgYSBrZXhpbml0IGlzIHNldAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBLRVhfQ09PS0lFX0xFTjsgaSsrKQorCQlidWZmZXJfcHV0X2NoYXIoYiwgMCk7CisJZm9yIChpID0gMDsgaSA8IFBST1BPU0FMX01BWDsgaSsrKQorCQlidWZmZXJfcHV0X2NzdHJpbmcoYiwgcHJvcG9zYWxbaV0pOworCWJ1ZmZlcl9wdXRfY2hhcihiLCAwKTsJCQkvKiBmaXJzdF9rZXhfcGFja2V0X2ZvbGxvd3MgKi8KKwlidWZmZXJfcHV0X2ludChiLCAwKTsJCQkvKiB1aW50MzIgcmVzZXJ2ZWQgKi8KK30KKworLyogcGFyc2UgYnVmZmVyIGFuZCByZXR1cm4gYWxnb3JpdGhtIHByb3Bvc2FsICovCitzdGF0aWMgY2hhciAqKgora2V4X2J1ZjJwcm9wKEJ1ZmZlciAqcmF3LCBpbnQgKmZpcnN0X2tleF9mb2xsb3dzKQoreworCUJ1ZmZlciBiOworCXVfaW50IGk7CisJY2hhciAqKnByb3Bvc2FsOworCisJcHJvcG9zYWwgPSB4Y2FsbG9jKFBST1BPU0FMX01BWCwgc2l6ZW9mKGNoYXIgKikpOworCisJYnVmZmVyX2luaXQoJmIpOworCWJ1ZmZlcl9hcHBlbmQoJmIsIGJ1ZmZlcl9wdHIocmF3KSwgYnVmZmVyX2xlbihyYXcpKTsKKwkvKiBza2lwIGNvb2tpZSAqLworCWZvciAoaSA9IDA7IGkgPCBLRVhfQ09PS0lFX0xFTjsgaSsrKQorCQlidWZmZXJfZ2V0X2NoYXIoJmIpOworCS8qIGV4dHJhY3Qga2V4IGluaXQgcHJvcG9zYWwgc3RyaW5ncyAqLworCWZvciAoaSA9IDA7IGkgPCBQUk9QT1NBTF9NQVg7IGkrKykgeworCQlwcm9wb3NhbFtpXSA9IGJ1ZmZlcl9nZXRfY3N0cmluZygmYixOVUxMKTsKKwkJZGVidWcyKCJrZXhfcGFyc2Vfa2V4aW5pdDogJXMiLCBwcm9wb3NhbFtpXSk7CisJfQorCS8qIGZpcnN0IGtleCBmb2xsb3dzIC8gcmVzZXJ2ZWQgKi8KKwlpID0gYnVmZmVyX2dldF9jaGFyKCZiKTsKKwlpZiAoZmlyc3Rfa2V4X2ZvbGxvd3MgIT0gTlVMTCkKKwkJKmZpcnN0X2tleF9mb2xsb3dzID0gaTsKKwlkZWJ1ZzIoImtleF9wYXJzZV9rZXhpbml0OiBmaXJzdF9rZXhfZm9sbG93cyAlZCAiLCBpKTsKKwlpID0gYnVmZmVyX2dldF9pbnQoJmIpOworCWRlYnVnMigia2V4X3BhcnNlX2tleGluaXQ6IHJlc2VydmVkICV1ICIsIGkpOworCWJ1ZmZlcl9mcmVlKCZiKTsKKwlyZXR1cm4gcHJvcG9zYWw7Cit9CisKK3N0YXRpYyB2b2lkCitrZXhfcHJvcF9mcmVlKGNoYXIgKipwcm9wb3NhbCkKK3sKKwl1X2ludCBpOworCisJZm9yIChpID0gMDsgaSA8IFBST1BPU0FMX01BWDsgaSsrKQorCQl4ZnJlZShwcm9wb3NhbFtpXSk7CisJeGZyZWUocHJvcG9zYWwpOworfQorCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK2tleF9wcm90b2NvbF9lcnJvcihpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKK3sKKwllcnJvcigiSG0sIGtleCBwcm90b2NvbCBlcnJvcjogdHlwZSAlZCBzZXEgJXUiLCB0eXBlLCBzZXEpOworfQorCitzdGF0aWMgdm9pZAora2V4X3Jlc2V0X2Rpc3BhdGNoKHZvaWQpCit7CisJZGlzcGF0Y2hfcmFuZ2UoU1NIMl9NU0dfVFJBTlNQT1JUX01JTiwKKwkgICAgU1NIMl9NU0dfVFJBTlNQT1JUX01BWCwgJmtleF9wcm90b2NvbF9lcnJvcik7CisJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX0tFWElOSVQsICZrZXhfaW5wdXRfa2V4aW5pdCk7Cit9CisKK3ZvaWQKK2tleF9maW5pc2goS2V4ICprZXgpCit7CisJa2V4X3Jlc2V0X2Rpc3BhdGNoKCk7CisKKwlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfTkVXS0VZUyk7CisJcGFja2V0X3NlbmQoKTsKKwkvKiBwYWNrZXRfd3JpdGVfd2FpdCgpOyAqLworCWRlYnVnKCJTU0gyX01TR19ORVdLRVlTIHNlbnQiKTsKKworCWRlYnVnKCJleHBlY3RpbmcgU1NIMl9NU0dfTkVXS0VZUyIpOworCXBhY2tldF9yZWFkX2V4cGVjdChTU0gyX01TR19ORVdLRVlTKTsKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisJZGVidWcoIlNTSDJfTVNHX05FV0tFWVMgcmVjZWl2ZWQiKTsKKworCWtleC0+ZG9uZSA9IDE7CisJYnVmZmVyX2NsZWFyKCZrZXgtPnBlZXIpOworCS8qIGJ1ZmZlcl9jbGVhcigma2V4LT5teSk7ICovCisJa2V4LT5mbGFncyAmPSB+S0VYX0lOSVRfU0VOVDsKKwl4ZnJlZShrZXgtPm5hbWUpOworCWtleC0+bmFtZSA9IE5VTEw7Cit9CisKK3ZvaWQKK2tleF9zZW5kX2tleGluaXQoS2V4ICprZXgpCit7CisJdV9pbnQzMl90IHJuZCA9IDA7CisJdV9jaGFyICpjb29raWU7CisJdV9pbnQgaTsKKworCWlmIChrZXggPT0gTlVMTCkgeworCQllcnJvcigia2V4X3NlbmRfa2V4aW5pdDogbm8ga2V4LCBjYW5ub3QgcmVrZXkiKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoa2V4LT5mbGFncyAmIEtFWF9JTklUX1NFTlQpIHsKKwkJZGVidWcoIktFWF9JTklUX1NFTlQiKTsKKwkJcmV0dXJuOworCX0KKwlrZXgtPmRvbmUgPSAwOworCisJLyogZ2VuZXJhdGUgYSByYW5kb20gY29va2llICovCisJaWYgKGJ1ZmZlcl9sZW4oJmtleC0+bXkpIDwgS0VYX0NPT0tJRV9MRU4pCisJCWZhdGFsKCJrZXhfc2VuZF9rZXhpbml0OiBrZXggcHJvcG9zYWwgdG9vIHNob3J0Iik7CisJY29va2llID0gYnVmZmVyX3B0cigma2V4LT5teSk7CisJZm9yIChpID0gMDsgaSA8IEtFWF9DT09LSUVfTEVOOyBpKyspIHsKKwkJaWYgKGkgJSA0ID09IDApCisJCQlybmQgPSBhcmM0cmFuZG9tKCk7CisJCWNvb2tpZVtpXSA9IHJuZDsKKwkJcm5kID4+PSA4OworCX0KKwlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfS0VYSU5JVCk7CisJcGFja2V0X3B1dF9yYXcoYnVmZmVyX3B0cigma2V4LT5teSksIGJ1ZmZlcl9sZW4oJmtleC0+bXkpKTsKKwlwYWNrZXRfc2VuZCgpOworCWRlYnVnKCJTU0gyX01TR19LRVhJTklUIHNlbnQiKTsKKwlrZXgtPmZsYWdzIHw9IEtFWF9JTklUX1NFTlQ7Cit9CisKKy8qIEFSR1NVU0VEICovCit2b2lkCitrZXhfaW5wdXRfa2V4aW5pdChpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKK3sKKwljaGFyICpwdHI7CisJdV9pbnQgaSwgZGxlbjsKKwlLZXggKmtleCA9IChLZXggKiljdHh0OworCisJZGVidWcoIlNTSDJfTVNHX0tFWElOSVQgcmVjZWl2ZWQiKTsKKwlpZiAoa2V4ID09IE5VTEwpCisJCWZhdGFsKCJrZXhfaW5wdXRfa2V4aW5pdDogbm8ga2V4LCBjYW5ub3QgcmVrZXkiKTsKKworCXB0ciA9IHBhY2tldF9nZXRfcmF3KCZkbGVuKTsKKwlidWZmZXJfYXBwZW5kKCZrZXgtPnBlZXIsIHB0ciwgZGxlbik7CisKKwkvKiBkaXNjYXJkIHBhY2tldCAqLworCWZvciAoaSA9IDA7IGkgPCBLRVhfQ09PS0lFX0xFTjsgaSsrKQorCQlwYWNrZXRfZ2V0X2NoYXIoKTsKKwlmb3IgKGkgPSAwOyBpIDwgUFJPUE9TQUxfTUFYOyBpKyspCisJCXhmcmVlKHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpKTsKKwkodm9pZCkgcGFja2V0X2dldF9jaGFyKCk7CisJKHZvaWQpIHBhY2tldF9nZXRfaW50KCk7CisJcGFja2V0X2NoZWNrX2VvbSgpOworCisJa2V4X2tleGluaXRfZmluaXNoKGtleCk7Cit9CisKK0tleCAqCitrZXhfc2V0dXAoY2hhciAqcHJvcG9zYWxbUFJPUE9TQUxfTUFYXSkKK3sKKwlLZXggKmtleDsKKworCWtleCA9IHhjYWxsb2MoMSwgc2l6ZW9mKCprZXgpKTsKKwlidWZmZXJfaW5pdCgma2V4LT5wZWVyKTsKKwlidWZmZXJfaW5pdCgma2V4LT5teSk7CisJa2V4X3Byb3AyYnVmKCZrZXgtPm15LCBwcm9wb3NhbCk7CisJa2V4LT5kb25lID0gMDsKKworCWtleF9zZW5kX2tleGluaXQoa2V4KTsJCQkJCS8qIHdlIHN0YXJ0ICovCisJa2V4X3Jlc2V0X2Rpc3BhdGNoKCk7CisKKwlyZXR1cm4ga2V4OworfQorCitzdGF0aWMgdm9pZAora2V4X2tleGluaXRfZmluaXNoKEtleCAqa2V4KQoreworCWlmICghKGtleC0+ZmxhZ3MgJiBLRVhfSU5JVF9TRU5UKSkKKwkJa2V4X3NlbmRfa2V4aW5pdChrZXgpOworCisJa2V4X2Nob29zZV9jb25mKGtleCk7CisKKwlpZiAoa2V4LT5rZXhfdHlwZSA+PSAwICYmIGtleC0+a2V4X3R5cGUgPCBLRVhfTUFYICYmCisJICAgIGtleC0+a2V4W2tleC0+a2V4X3R5cGVdICE9IE5VTEwpIHsKKwkJKGtleC0+a2V4W2tleC0+a2V4X3R5cGVdKShrZXgpOworCX0gZWxzZSB7CisJCWZhdGFsKCJVbnN1cHBvcnRlZCBrZXkgZXhjaGFuZ2UgJWQiLCBrZXgtPmtleF90eXBlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjaG9vc2VfZW5jKEVuYyAqZW5jLCBjaGFyICpjbGllbnQsIGNoYXIgKnNlcnZlcikKK3sKKwljaGFyICpuYW1lID0gbWF0Y2hfbGlzdChjbGllbnQsIHNlcnZlciwgTlVMTCk7CisJaWYgKG5hbWUgPT0gTlVMTCkKKwkJZmF0YWwoIm5vIG1hdGNoaW5nIGNpcGhlciBmb3VuZDogY2xpZW50ICVzIHNlcnZlciAlcyIsCisJCSAgICBjbGllbnQsIHNlcnZlcik7CisJaWYgKChlbmMtPmNpcGhlciA9IGNpcGhlcl9ieV9uYW1lKG5hbWUpKSA9PSBOVUxMKQorCQlmYXRhbCgibWF0Y2hpbmcgY2lwaGVyIGlzIG5vdCBzdXBwb3J0ZWQ6ICVzIiwgbmFtZSk7CisJZW5jLT5uYW1lID0gbmFtZTsKKwllbmMtPmVuYWJsZWQgPSAwOworCWVuYy0+aXYgPSBOVUxMOworCWVuYy0+a2V5ID0gTlVMTDsKKwllbmMtPmtleV9sZW4gPSBjaXBoZXJfa2V5bGVuKGVuYy0+Y2lwaGVyKTsKKwllbmMtPmJsb2NrX3NpemUgPSBjaXBoZXJfYmxvY2tzaXplKGVuYy0+Y2lwaGVyKTsKK30KKworc3RhdGljIHZvaWQKK2Nob29zZV9tYWMoTWFjICptYWMsIGNoYXIgKmNsaWVudCwgY2hhciAqc2VydmVyKQoreworCWNoYXIgKm5hbWUgPSBtYXRjaF9saXN0KGNsaWVudCwgc2VydmVyLCBOVUxMKTsKKwlpZiAobmFtZSA9PSBOVUxMKQorCQlmYXRhbCgibm8gbWF0Y2hpbmcgbWFjIGZvdW5kOiBjbGllbnQgJXMgc2VydmVyICVzIiwKKwkJICAgIGNsaWVudCwgc2VydmVyKTsKKwlpZiAobWFjX3NldHVwKG1hYywgbmFtZSkgPCAwKQorCQlmYXRhbCgidW5zdXBwb3J0ZWQgbWFjICVzIiwgbmFtZSk7CisJLyogdHJ1bmNhdGUgdGhlIGtleSAqLworCWlmIChkYXRhZmVsbG93cyAmIFNTSF9CVUdfSE1BQykKKwkJbWFjLT5rZXlfbGVuID0gMTY7CisJbWFjLT5uYW1lID0gbmFtZTsKKwltYWMtPmtleSA9IE5VTEw7CisJbWFjLT5lbmFibGVkID0gMDsKK30KKworc3RhdGljIHZvaWQKK2Nob29zZV9jb21wKENvbXAgKmNvbXAsIGNoYXIgKmNsaWVudCwgY2hhciAqc2VydmVyKQoreworCWNoYXIgKm5hbWUgPSBtYXRjaF9saXN0KGNsaWVudCwgc2VydmVyLCBOVUxMKTsKKwlpZiAobmFtZSA9PSBOVUxMKQorCQlmYXRhbCgibm8gbWF0Y2hpbmcgY29tcCBmb3VuZDogY2xpZW50ICVzIHNlcnZlciAlcyIsIGNsaWVudCwgc2VydmVyKTsKKwlpZiAoc3RyY21wKG5hbWUsICJ6bGliQG9wZW5zc2guY29tIikgPT0gMCkgeworCQljb21wLT50eXBlID0gQ09NUF9ERUxBWUVEOworCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJ6bGliIikgPT0gMCkgeworCQljb21wLT50eXBlID0gQ09NUF9aTElCOworCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJub25lIikgPT0gMCkgeworCQljb21wLT50eXBlID0gQ09NUF9OT05FOworCX0gZWxzZSB7CisJCWZhdGFsKCJ1bnN1cHBvcnRlZCBjb21wICVzIiwgbmFtZSk7CisJfQorCWNvbXAtPm5hbWUgPSBuYW1lOworfQorCitzdGF0aWMgdm9pZAorY2hvb3NlX2tleChLZXggKmssIGNoYXIgKmNsaWVudCwgY2hhciAqc2VydmVyKQoreworCWstPm5hbWUgPSBtYXRjaF9saXN0KGNsaWVudCwgc2VydmVyLCBOVUxMKTsKKwlpZiAoay0+bmFtZSA9PSBOVUxMKQorCQlmYXRhbCgiVW5hYmxlIHRvIG5lZ290aWF0ZSBhIGtleSBleGNoYW5nZSBtZXRob2QiKTsKKwlpZiAoc3RyY21wKGstPm5hbWUsIEtFWF9ESDEpID09IDApIHsKKwkJay0+a2V4X3R5cGUgPSBLRVhfREhfR1JQMV9TSEExOworCQlrLT5ldnBfbWQgPSBFVlBfc2hhMSgpOworCX0gZWxzZSBpZiAoc3RyY21wKGstPm5hbWUsIEtFWF9ESDE0KSA9PSAwKSB7CisJCWstPmtleF90eXBlID0gS0VYX0RIX0dSUDE0X1NIQTE7CisJCWstPmV2cF9tZCA9IEVWUF9zaGExKCk7CisJfSBlbHNlIGlmIChzdHJjbXAoay0+bmFtZSwgS0VYX0RIR0VYX1NIQTEpID09IDApIHsKKwkJay0+a2V4X3R5cGUgPSBLRVhfREhfR0VYX1NIQTE7CisJCWstPmV2cF9tZCA9IEVWUF9zaGExKCk7CisjaWYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDAwOTA3MDAwTAorCX0gZWxzZSBpZiAoc3RyY21wKGstPm5hbWUsIEtFWF9ESEdFWF9TSEEyNTYpID09IDApIHsKKwkJay0+a2V4X3R5cGUgPSBLRVhfREhfR0VYX1NIQTI1NjsKKwkJay0+ZXZwX21kID0gZXZwX3NzaF9zaGEyNTYoKTsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoay0+bmFtZSwgS0VYX0VDREhfU0hBMl9TVEVNLAorCSAgICBzaXplb2YoS0VYX0VDREhfU0hBMl9TVEVNKSAtIDEpID09IDApIHsKKyAJCWstPmtleF90eXBlID0gS0VYX0VDREhfU0hBMjsKKwkJay0+ZXZwX21kID0ga2V4X2VjZGhfbmFtZV90b19ldnBtZChrLT5uYW1lKTsKKyNlbmRpZgorCX0gZWxzZQorCQlmYXRhbCgiYmFkIGtleCBhbGcgJXMiLCBrLT5uYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2Nob29zZV9ob3N0a2V5YWxnKEtleCAqaywgY2hhciAqY2xpZW50LCBjaGFyICpzZXJ2ZXIpCit7CisJY2hhciAqaG9zdGtleWFsZyA9IG1hdGNoX2xpc3QoY2xpZW50LCBzZXJ2ZXIsIE5VTEwpOworCWlmIChob3N0a2V5YWxnID09IE5VTEwpCisJCWZhdGFsKCJubyBob3N0a2V5IGFsZyIpOworCWstPmhvc3RrZXlfdHlwZSA9IGtleV90eXBlX2Zyb21fbmFtZShob3N0a2V5YWxnKTsKKwlpZiAoay0+aG9zdGtleV90eXBlID09IEtFWV9VTlNQRUMpCisJCWZhdGFsKCJiYWQgaG9zdGtleSBhbGcgJyVzJyIsIGhvc3RrZXlhbGcpOworCXhmcmVlKGhvc3RrZXlhbGcpOworfQorCitzdGF0aWMgaW50Citwcm9wb3NhbHNfbWF0Y2goY2hhciAqbXlbUFJPUE9TQUxfTUFYXSwgY2hhciAqcGVlcltQUk9QT1NBTF9NQVhdKQoreworCXN0YXRpYyBpbnQgY2hlY2tbXSA9IHsKKwkJUFJPUE9TQUxfS0VYX0FMR1MsIFBST1BPU0FMX1NFUlZFUl9IT1NUX0tFWV9BTEdTLCAtMQorCX07CisJaW50ICppZHg7CisJY2hhciAqcDsKKworCWZvciAoaWR4ID0gJmNoZWNrWzBdOyAqaWR4ICE9IC0xOyBpZHgrKykgeworCQlpZiAoKHAgPSBzdHJjaHIobXlbKmlkeF0sICcsJykpICE9IE5VTEwpCisJCQkqcCA9ICdcMCc7CisJCWlmICgocCA9IHN0cmNocihwZWVyWyppZHhdLCAnLCcpKSAhPSBOVUxMKQorCQkJKnAgPSAnXDAnOworCQlpZiAoc3RyY21wKG15WyppZHhdLCBwZWVyWyppZHhdKSAhPSAwKSB7CisJCQlkZWJ1ZzIoInByb3Bvc2FsIG1pc21hdGNoOiBteSAlcyBwZWVyICVzIiwKKwkJCSAgICBteVsqaWR4XSwgcGVlclsqaWR4XSk7CisJCQlyZXR1cm4gKDApOworCQl9CisJfQorCWRlYnVnMigicHJvcG9zYWxzIG1hdGNoIik7CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIHZvaWQKK2tleF9jaG9vc2VfY29uZihLZXggKmtleCkKK3sKKwlOZXdrZXlzICpuZXdrZXlzOworCWNoYXIgKipteSwgKipwZWVyOworCWNoYXIgKipjcHJvcCwgKipzcHJvcDsKKwlpbnQgbmVuYywgbm1hYywgbmNvbXA7CisJdV9pbnQgbW9kZSwgY3RvcywgbmVlZDsKKwlpbnQgZmlyc3Rfa2V4X2ZvbGxvd3MsIHR5cGU7CisKKwlteSAgID0ga2V4X2J1ZjJwcm9wKCZrZXgtPm15LCBOVUxMKTsKKwlwZWVyID0ga2V4X2J1ZjJwcm9wKCZrZXgtPnBlZXIsICZmaXJzdF9rZXhfZm9sbG93cyk7CisKKwlpZiAoa2V4LT5zZXJ2ZXIpIHsKKwkJY3Byb3A9cGVlcjsKKwkJc3Byb3A9bXk7CisJfSBlbHNlIHsKKwkJY3Byb3A9bXk7CisJCXNwcm9wPXBlZXI7CisJfQorCisJLyogQ2hlY2sgd2hldGhlciBzZXJ2ZXIgb2ZmZXJzIHJvYW1pbmcgKi8KKwlpZiAoIWtleC0+c2VydmVyKSB7CisJCWNoYXIgKnJvYW1pbmc7CisJCXJvYW1pbmcgPSBtYXRjaF9saXN0KEtFWF9SRVNVTUUsIHBlZXJbUFJPUE9TQUxfS0VYX0FMR1NdLCBOVUxMKTsKKwkJaWYgKHJvYW1pbmcpIHsKKwkJCWtleC0+cm9hbWluZyA9IDE7CisJCQl4ZnJlZShyb2FtaW5nKTsKKwkJfQorCX0KKworCS8qIEFsZ29yaXRobSBOZWdvdGlhdGlvbiAqLworCWZvciAobW9kZSA9IDA7IG1vZGUgPCBNT0RFX01BWDsgbW9kZSsrKSB7CisJCW5ld2tleXMgPSB4Y2FsbG9jKDEsIHNpemVvZigqbmV3a2V5cykpOworCQlrZXgtPm5ld2tleXNbbW9kZV0gPSBuZXdrZXlzOworCQljdG9zID0gKCFrZXgtPnNlcnZlciAmJiBtb2RlID09IE1PREVfT1VUKSB8fAorCQkgICAgKGtleC0+c2VydmVyICYmIG1vZGUgPT0gTU9ERV9JTik7CisJCW5lbmMgID0gY3RvcyA/IFBST1BPU0FMX0VOQ19BTEdTX0NUT1MgIDogUFJPUE9TQUxfRU5DX0FMR1NfU1RPQzsKKwkJbm1hYyAgPSBjdG9zID8gUFJPUE9TQUxfTUFDX0FMR1NfQ1RPUyAgOiBQUk9QT1NBTF9NQUNfQUxHU19TVE9DOworCQluY29tcCA9IGN0b3MgPyBQUk9QT1NBTF9DT01QX0FMR1NfQ1RPUyA6IFBST1BPU0FMX0NPTVBfQUxHU19TVE9DOworCQljaG9vc2VfZW5jICgmbmV3a2V5cy0+ZW5jLCAgY3Byb3BbbmVuY10sICBzcHJvcFtuZW5jXSk7CisJCWNob29zZV9tYWMgKCZuZXdrZXlzLT5tYWMsICBjcHJvcFtubWFjXSwgIHNwcm9wW25tYWNdKTsKKwkJY2hvb3NlX2NvbXAoJm5ld2tleXMtPmNvbXAsIGNwcm9wW25jb21wXSwgc3Byb3BbbmNvbXBdKTsKKwkJZGVidWcoImtleDogJXMgJXMgJXMgJXMiLAorCQkgICAgY3RvcyA/ICJjbGllbnQtPnNlcnZlciIgOiAic2VydmVyLT5jbGllbnQiLAorCQkgICAgbmV3a2V5cy0+ZW5jLm5hbWUsCisJCSAgICBuZXdrZXlzLT5tYWMubmFtZSwKKwkJICAgIG5ld2tleXMtPmNvbXAubmFtZSk7CisJfQorCWNob29zZV9rZXgoa2V4LCBjcHJvcFtQUk9QT1NBTF9LRVhfQUxHU10sIHNwcm9wW1BST1BPU0FMX0tFWF9BTEdTXSk7CisJY2hvb3NlX2hvc3RrZXlhbGcoa2V4LCBjcHJvcFtQUk9QT1NBTF9TRVJWRVJfSE9TVF9LRVlfQUxHU10sCisJICAgIHNwcm9wW1BST1BPU0FMX1NFUlZFUl9IT1NUX0tFWV9BTEdTXSk7CisJbmVlZCA9IDA7CisJZm9yIChtb2RlID0gMDsgbW9kZSA8IE1PREVfTUFYOyBtb2RlKyspIHsKKwkJbmV3a2V5cyA9IGtleC0+bmV3a2V5c1ttb2RlXTsKKwkJaWYgKG5lZWQgPCBuZXdrZXlzLT5lbmMua2V5X2xlbikKKwkJCW5lZWQgPSBuZXdrZXlzLT5lbmMua2V5X2xlbjsKKwkJaWYgKG5lZWQgPCBuZXdrZXlzLT5lbmMuYmxvY2tfc2l6ZSkKKwkJCW5lZWQgPSBuZXdrZXlzLT5lbmMuYmxvY2tfc2l6ZTsKKwkJaWYgKG5lZWQgPCBuZXdrZXlzLT5tYWMua2V5X2xlbikKKwkJCW5lZWQgPSBuZXdrZXlzLT5tYWMua2V5X2xlbjsKKwl9CisJLyogWFhYIG5lZWQgcnVuZGVuPyAqLworCWtleC0+d2VfbmVlZCA9IG5lZWQ7CisKKwkvKiBpZ25vcmUgdGhlIG5leHQgbWVzc2FnZSBpZiB0aGUgcHJvcG9zYWxzIGRvIG5vdCBtYXRjaCAqLworCWlmIChmaXJzdF9rZXhfZm9sbG93cyAmJiAhcHJvcG9zYWxzX21hdGNoKG15LCBwZWVyKSAmJgorCSAgICAhKGRhdGFmZWxsb3dzICYgU1NIX0JVR19GSVJTVEtFWCkpIHsKKwkJdHlwZSA9IHBhY2tldF9yZWFkKCk7CisJCWRlYnVnMigic2tpcHBpbmcgbmV4dCBwYWNrZXQgKHR5cGUgJXUpIiwgdHlwZSk7CisJfQorCisJa2V4X3Byb3BfZnJlZShteSk7CisJa2V4X3Byb3BfZnJlZShwZWVyKTsKK30KKworc3RhdGljIHVfY2hhciAqCitkZXJpdmVfa2V5KEtleCAqa2V4LCBpbnQgaWQsIHVfaW50IG5lZWQsIHVfY2hhciAqaGFzaCwgdV9pbnQgaGFzaGxlbiwKKyAgICBCSUdOVU0gKnNoYXJlZF9zZWNyZXQpCit7CisJQnVmZmVyIGI7CisJRVZQX01EX0NUWCBtZDsKKwljaGFyIGMgPSBpZDsKKwl1X2ludCBoYXZlOworCWludCBtZHN6OworCXVfY2hhciAqZGlnZXN0OworCisJaWYgKChtZHN6ID0gRVZQX01EX3NpemUoa2V4LT5ldnBfbWQpKSA8PSAwKQorCQlmYXRhbCgiYmFkIGtleCBtZCBzaXplICVkIiwgbWRzeik7CisJZGlnZXN0ID0geG1hbGxvYyhyb3VuZHVwKG5lZWQsIG1kc3opKTsKKworCWJ1ZmZlcl9pbml0KCZiKTsKKwlidWZmZXJfcHV0X2JpZ251bTIoJmIsIHNoYXJlZF9zZWNyZXQpOworCisJLyogSzEgPSBIQVNIKEsgfHwgSCB8fCAiQSIgfHwgc2Vzc2lvbl9pZCkgKi8KKwlFVlBfRGlnZXN0SW5pdCgmbWQsIGtleC0+ZXZwX21kKTsKKwlpZiAoIShkYXRhZmVsbG93cyAmIFNTSF9CVUdfREVSSVZFS0VZKSkKKwkJRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIGJ1ZmZlcl9wdHIoJmIpLCBidWZmZXJfbGVuKCZiKSk7CisJRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIGhhc2gsIGhhc2hsZW4pOworCUVWUF9EaWdlc3RVcGRhdGUoJm1kLCAmYywgMSk7CisJRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIGtleC0+c2Vzc2lvbl9pZCwga2V4LT5zZXNzaW9uX2lkX2xlbik7CisJRVZQX0RpZ2VzdEZpbmFsKCZtZCwgZGlnZXN0LCBOVUxMKTsKKworCS8qCisJICogZXhwYW5kIGtleToKKwkgKiBLbiA9IEhBU0goSyB8fCBIIHx8IEsxIHx8IEsyIHx8IC4uLiB8fCBLbi0xKQorCSAqIEtleSA9IEsxIHx8IEsyIHx8IC4uLiB8fCBLbgorCSAqLworCWZvciAoaGF2ZSA9IG1kc3o7IG5lZWQgPiBoYXZlOyBoYXZlICs9IG1kc3opIHsKKwkJRVZQX0RpZ2VzdEluaXQoJm1kLCBrZXgtPmV2cF9tZCk7CisJCWlmICghKGRhdGFmZWxsb3dzICYgU1NIX0JVR19ERVJJVkVLRVkpKQorCQkJRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIGJ1ZmZlcl9wdHIoJmIpLCBidWZmZXJfbGVuKCZiKSk7CisJCUVWUF9EaWdlc3RVcGRhdGUoJm1kLCBoYXNoLCBoYXNobGVuKTsKKwkJRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIGRpZ2VzdCwgaGF2ZSk7CisJCUVWUF9EaWdlc3RGaW5hbCgmbWQsIGRpZ2VzdCArIGhhdmUsIE5VTEwpOworCX0KKwlidWZmZXJfZnJlZSgmYik7CisjaWZkZWYgREVCVUdfS0VYCisJZnByaW50ZihzdGRlcnIsICJrZXkgJyVjJz09ICIsIGMpOworCWR1bXBfZGlnZXN0KCJrZXkiLCBkaWdlc3QsIG5lZWQpOworI2VuZGlmCisJcmV0dXJuIGRpZ2VzdDsKK30KKworTmV3a2V5cyAqY3VycmVudF9rZXlzW01PREVfTUFYXTsKKworI2RlZmluZSBOS0VZUwk2Cit2b2lkCitrZXhfZGVyaXZlX2tleXMoS2V4ICprZXgsIHVfY2hhciAqaGFzaCwgdV9pbnQgaGFzaGxlbiwgQklHTlVNICpzaGFyZWRfc2VjcmV0KQoreworCXVfY2hhciAqa2V5c1tOS0VZU107CisJdV9pbnQgaSwgbW9kZSwgY3RvczsKKworCWZvciAoaSA9IDA7IGkgPCBOS0VZUzsgaSsrKSB7CisJCWtleXNbaV0gPSBkZXJpdmVfa2V5KGtleCwgJ0EnK2ksIGtleC0+d2VfbmVlZCwgaGFzaCwgaGFzaGxlbiwKKwkJICAgIHNoYXJlZF9zZWNyZXQpOworCX0KKworCWRlYnVnMigia2V4X2Rlcml2ZV9rZXlzIik7CisJZm9yIChtb2RlID0gMDsgbW9kZSA8IE1PREVfTUFYOyBtb2RlKyspIHsKKwkJY3VycmVudF9rZXlzW21vZGVdID0ga2V4LT5uZXdrZXlzW21vZGVdOworCQlrZXgtPm5ld2tleXNbbW9kZV0gPSBOVUxMOworCQljdG9zID0gKCFrZXgtPnNlcnZlciAmJiBtb2RlID09IE1PREVfT1VUKSB8fAorCQkgICAgKGtleC0+c2VydmVyICYmIG1vZGUgPT0gTU9ERV9JTik7CisJCWN1cnJlbnRfa2V5c1ttb2RlXS0+ZW5jLml2ICA9IGtleXNbY3RvcyA/IDAgOiAxXTsKKwkJY3VycmVudF9rZXlzW21vZGVdLT5lbmMua2V5ID0ga2V5c1tjdG9zID8gMiA6IDNdOworCQljdXJyZW50X2tleXNbbW9kZV0tPm1hYy5rZXkgPSBrZXlzW2N0b3MgPyA0IDogNV07CisJfQorfQorCitOZXdrZXlzICoKK2tleF9nZXRfbmV3a2V5cyhpbnQgbW9kZSkKK3sKKwlOZXdrZXlzICpyZXQ7CisKKwlyZXQgPSBjdXJyZW50X2tleXNbbW9kZV07CisJY3VycmVudF9rZXlzW21vZGVdID0gTlVMTDsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkCitkZXJpdmVfc3NoMV9zZXNzaW9uX2lkKEJJR05VTSAqaG9zdF9tb2R1bHVzLCBCSUdOVU0gKnNlcnZlcl9tb2R1bHVzLAorICAgIHVfaW50OF90IGNvb2tpZVs4XSwgdV9pbnQ4X3QgaWRbMTZdKQoreworCWNvbnN0IEVWUF9NRCAqZXZwX21kID0gRVZQX21kNSgpOworCUVWUF9NRF9DVFggbWQ7CisJdV9pbnQ4X3QgbmJ1ZlsyMDQ4XSwgb2J1ZltFVlBfTUFYX01EX1NJWkVdOworCWludCBsZW47CisKKwlFVlBfRGlnZXN0SW5pdCgmbWQsIGV2cF9tZCk7CisKKwlsZW4gPSBCTl9udW1fYnl0ZXMoaG9zdF9tb2R1bHVzKTsKKwlpZiAobGVuIDwgKDUxMiAvIDgpIHx8ICh1X2ludClsZW4gPiBzaXplb2YobmJ1ZikpCisJCWZhdGFsKCIlczogYmFkIGhvc3QgbW9kdWx1cyAobGVuICVkKSIsIF9fZnVuY19fLCBsZW4pOworCUJOX2JuMmJpbihob3N0X21vZHVsdXMsIG5idWYpOworCUVWUF9EaWdlc3RVcGRhdGUoJm1kLCBuYnVmLCBsZW4pOworCisJbGVuID0gQk5fbnVtX2J5dGVzKHNlcnZlcl9tb2R1bHVzKTsKKwlpZiAobGVuIDwgKDUxMiAvIDgpIHx8ICh1X2ludClsZW4gPiBzaXplb2YobmJ1ZikpCisJCWZhdGFsKCIlczogYmFkIHNlcnZlciBtb2R1bHVzIChsZW4gJWQpIiwgX19mdW5jX18sIGxlbik7CisJQk5fYm4yYmluKHNlcnZlcl9tb2R1bHVzLCBuYnVmKTsKKwlFVlBfRGlnZXN0VXBkYXRlKCZtZCwgbmJ1ZiwgbGVuKTsKKworCUVWUF9EaWdlc3RVcGRhdGUoJm1kLCBjb29raWUsIDgpOworCisJRVZQX0RpZ2VzdEZpbmFsKCZtZCwgb2J1ZiwgTlVMTCk7CisJbWVtY3B5KGlkLCBvYnVmLCAxNik7CisKKwltZW1zZXQobmJ1ZiwgMCwgc2l6ZW9mKG5idWYpKTsKKwltZW1zZXQob2J1ZiwgMCwgc2l6ZW9mKG9idWYpKTsKKwltZW1zZXQoJm1kLCAwLCBzaXplb2YobWQpKTsKK30KKworI2lmIGRlZmluZWQoREVCVUdfS0VYKSB8fCBkZWZpbmVkKERFQlVHX0tFWERIKSB8fCBkZWZpbmVkKERFQlVHX0tFWEVDREgpCit2b2lkCitkdW1wX2RpZ2VzdChjaGFyICptc2csIHVfY2hhciAqZGlnZXN0LCBpbnQgbGVuKQoreworCWludCBpOworCisJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgbXNnKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJZnByaW50ZihzdGRlcnIsICIlMDJ4IiwgZGlnZXN0W2ldKTsKKwkJaWYgKGklMzIgPT0gMzEpCisJCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJCWVsc2UgaWYgKGklOCA9PSA3KQorCQkJZnByaW50ZihzdGRlcnIsICIgIik7CisJfQorCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9rZXguaCBiL29wZW5zc2gtNi4wcDEva2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM3M2QzYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEva2V4LmgKQEAgLTAsMCArMSwxODUgQEAKKy8qICRPcGVuQlNEOiBrZXguaCx2IDEuNTIgMjAxMC8wOS8yMiAwNTowMToyOSBkam0gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgS0VYX0gKKyNkZWZpbmUgS0VYX0gKKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9obWFjLmg+CisjaWZkZWYgT1BFTlNTTF9IQVNfRUNDCisjaW5jbHVkZSA8b3BlbnNzbC9lYy5oPgorI2VuZGlmCisKKyNkZWZpbmUgS0VYX0NPT0tJRV9MRU4JMTYKKworI2RlZmluZQlLRVhfREgxCQkJImRpZmZpZS1oZWxsbWFuLWdyb3VwMS1zaGExIgorI2RlZmluZQlLRVhfREgxNAkJImRpZmZpZS1oZWxsbWFuLWdyb3VwMTQtc2hhMSIKKyNkZWZpbmUJS0VYX0RIR0VYX1NIQTEJCSJkaWZmaWUtaGVsbG1hbi1ncm91cC1leGNoYW5nZS1zaGExIgorI2RlZmluZQlLRVhfREhHRVhfU0hBMjU2CSJkaWZmaWUtaGVsbG1hbi1ncm91cC1leGNoYW5nZS1zaGEyNTYiCisjZGVmaW5lCUtFWF9SRVNVTUUJCSJyZXN1bWVAYXBwZ2F0ZS5jb20iCisvKiBUaGUgZm9sbG93aW5nIHJlcHJlc2VudHMgdGhlIGZhbWlseSBvZiBFQ0RIIG1ldGhvZHMgKi8KKyNkZWZpbmUJS0VYX0VDREhfU0hBMl9TVEVNCSJlY2RoLXNoYTItIgorCisjZGVmaW5lIENPTVBfTk9ORQkwCisjZGVmaW5lIENPTVBfWkxJQgkxCisjZGVmaW5lIENPTVBfREVMQVlFRAkyCisKK2VudW0ga2V4X2luaXRfcHJvcG9zYWxzIHsKKwlQUk9QT1NBTF9LRVhfQUxHUywKKwlQUk9QT1NBTF9TRVJWRVJfSE9TVF9LRVlfQUxHUywKKwlQUk9QT1NBTF9FTkNfQUxHU19DVE9TLAorCVBST1BPU0FMX0VOQ19BTEdTX1NUT0MsCisJUFJPUE9TQUxfTUFDX0FMR1NfQ1RPUywKKwlQUk9QT1NBTF9NQUNfQUxHU19TVE9DLAorCVBST1BPU0FMX0NPTVBfQUxHU19DVE9TLAorCVBST1BPU0FMX0NPTVBfQUxHU19TVE9DLAorCVBST1BPU0FMX0xBTkdfQ1RPUywKKwlQUk9QT1NBTF9MQU5HX1NUT0MsCisJUFJPUE9TQUxfTUFYCit9OworCitlbnVtIGtleF9tb2RlcyB7CisJTU9ERV9JTiwKKwlNT0RFX09VVCwKKwlNT0RFX01BWAorfTsKKworZW51bSBrZXhfZXhjaGFuZ2UgeworCUtFWF9ESF9HUlAxX1NIQTEsCisJS0VYX0RIX0dSUDE0X1NIQTEsCisJS0VYX0RIX0dFWF9TSEExLAorCUtFWF9ESF9HRVhfU0hBMjU2LAorCUtFWF9FQ0RIX1NIQTIsCisJS0VYX01BWAorfTsKKworI2RlZmluZSBLRVhfSU5JVF9TRU5UCTB4MDAwMQorCit0eXBlZGVmIHN0cnVjdCBLZXggS2V4OwordHlwZWRlZiBzdHJ1Y3QgTWFjIE1hYzsKK3R5cGVkZWYgc3RydWN0IENvbXAgQ29tcDsKK3R5cGVkZWYgc3RydWN0IEVuYyBFbmM7Cit0eXBlZGVmIHN0cnVjdCBOZXdrZXlzIE5ld2tleXM7CisKK3N0cnVjdCBFbmMgeworCWNoYXIJKm5hbWU7CisJQ2lwaGVyCSpjaXBoZXI7CisJaW50CWVuYWJsZWQ7CisJdV9pbnQJa2V5X2xlbjsKKwl1X2ludAlibG9ja19zaXplOworCXVfY2hhcgkqa2V5OworCXVfY2hhcgkqaXY7Cit9Oworc3RydWN0IE1hYyB7CisJY2hhcgkqbmFtZTsKKwlpbnQJZW5hYmxlZDsKKwl1X2ludAltYWNfbGVuOworCXVfY2hhcgkqa2V5OworCXVfaW50CWtleV9sZW47CisJaW50CXR5cGU7CisJY29uc3QgRVZQX01ECSpldnBfbWQ7CisJSE1BQ19DVFgJZXZwX2N0eDsKKwlzdHJ1Y3QgdW1hY19jdHggKnVtYWNfY3R4OworfTsKK3N0cnVjdCBDb21wIHsKKwlpbnQJdHlwZTsKKwlpbnQJZW5hYmxlZDsKKwljaGFyCSpuYW1lOworfTsKK3N0cnVjdCBOZXdrZXlzIHsKKwlFbmMJZW5jOworCU1hYwltYWM7CisJQ29tcAljb21wOworfTsKK3N0cnVjdCBLZXggeworCXVfY2hhcgkqc2Vzc2lvbl9pZDsKKwl1X2ludAlzZXNzaW9uX2lkX2xlbjsKKwlOZXdrZXlzCSpuZXdrZXlzW01PREVfTUFYXTsKKwl1X2ludAl3ZV9uZWVkOworCWludAlzZXJ2ZXI7CisJY2hhcgkqbmFtZTsKKwlpbnQJaG9zdGtleV90eXBlOworCWludAlrZXhfdHlwZTsKKwlpbnQJcm9hbWluZzsKKwlCdWZmZXIJbXk7CisJQnVmZmVyCXBlZXI7CisJc2lnX2F0b21pY190IGRvbmU7CisJaW50CWZsYWdzOworCWNvbnN0IEVWUF9NRCAqZXZwX21kOworCWNoYXIJKmNsaWVudF92ZXJzaW9uX3N0cmluZzsKKwljaGFyCSpzZXJ2ZXJfdmVyc2lvbl9zdHJpbmc7CisJaW50CSgqdmVyaWZ5X2hvc3Rfa2V5KShLZXkgKik7CisJS2V5CSooKmxvYWRfaG9zdF9wdWJsaWNfa2V5KShpbnQpOworCUtleQkqKCpsb2FkX2hvc3RfcHJpdmF0ZV9rZXkpKGludCk7CisJaW50CSgqaG9zdF9rZXlfaW5kZXgpKEtleSAqKTsKKwl2b2lkCSgqa2V4W0tFWF9NQVhdKShLZXggKik7Cit9OworCitpbnQJIGtleF9uYW1lc192YWxpZChjb25zdCBjaGFyICopOworCitLZXgJKmtleF9zZXR1cChjaGFyICpbUFJPUE9TQUxfTUFYXSk7Cit2b2lkCSBrZXhfZmluaXNoKEtleCAqKTsKKwordm9pZAkga2V4X3NlbmRfa2V4aW5pdChLZXggKik7Cit2b2lkCSBrZXhfaW5wdXRfa2V4aW5pdChpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKK3ZvaWQJIGtleF9kZXJpdmVfa2V5cyhLZXggKiwgdV9jaGFyICosIHVfaW50LCBCSUdOVU0gKik7CisKK05ld2tleXMgKmtleF9nZXRfbmV3a2V5cyhpbnQpOworCit2b2lkCSBrZXhkaF9jbGllbnQoS2V4ICopOwordm9pZAkga2V4ZGhfc2VydmVyKEtleCAqKTsKK3ZvaWQJIGtleGdleF9jbGllbnQoS2V4ICopOwordm9pZAkga2V4Z2V4X3NlcnZlcihLZXggKik7Cit2b2lkCSBrZXhlY2RoX2NsaWVudChLZXggKik7Cit2b2lkCSBrZXhlY2RoX3NlcnZlcihLZXggKik7CisKK3ZvaWQKK2tleF9kaF9oYXNoKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCwgY2hhciAqLCBpbnQsIHVfY2hhciAqLCBpbnQsCisgICAgQklHTlVNICosIEJJR05VTSAqLCBCSUdOVU0gKiwgdV9jaGFyICoqLCB1X2ludCAqKTsKK3ZvaWQKK2tleGdleF9oYXNoKGNvbnN0IEVWUF9NRCAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQsIGNoYXIgKiwKKyAgICBpbnQsIHVfY2hhciAqLCBpbnQsIGludCwgaW50LCBpbnQsIEJJR05VTSAqLCBCSUdOVU0gKiwgQklHTlVNICosCisgICAgQklHTlVNICosIEJJR05VTSAqLCB1X2NoYXIgKiosIHVfaW50ICopOworI2lmZGVmIE9QRU5TU0xfSEFTX0VDQwordm9pZAora2V4X2VjZGhfaGFzaChjb25zdCBFVlBfTUQgKiwgY29uc3QgRUNfR1JPVVAgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50LAorICAgIGNoYXIgKiwgaW50LCB1X2NoYXIgKiwgaW50LCBjb25zdCBFQ19QT0lOVCAqLCBjb25zdCBFQ19QT0lOVCAqLAorICAgIGNvbnN0IEJJR05VTSAqLCB1X2NoYXIgKiosIHVfaW50ICopOworaW50CWtleF9lY2RoX25hbWVfdG9fbmlkKGNvbnN0IGNoYXIgKik7Citjb25zdCBFVlBfTUQgKmtleF9lY2RoX25hbWVfdG9fZXZwbWQoY29uc3QgY2hhciAqKTsKKyNlbHNlCisjIGRlZmluZSBrZXhfZWNkaF9uYW1lX3RvX25pZCh4KSAoLTEpCisjIGRlZmluZSBrZXhfZWNkaF9uYW1lX3RvX2V2cG1kKHgpIChOVUxMKQorI2VuZGlmCisKK3ZvaWQKK2Rlcml2ZV9zc2gxX3Nlc3Npb25faWQoQklHTlVNICosIEJJR05VTSAqLCB1X2ludDhfdFs4XSwgdV9pbnQ4X3RbMTZdKTsKKworI2lmIGRlZmluZWQoREVCVUdfS0VYKSB8fCBkZWZpbmVkKERFQlVHX0tFWERIKSB8fCBkZWZpbmVkKERFQlVHX0tFWEVDREgpCit2b2lkCWR1bXBfZGlnZXN0KGNoYXIgKiwgdV9jaGFyICosIGludCk7CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2tleGRoLmMgYi9vcGVuc3NoLTYuMHAxL2tleGRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZlMjJmNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEva2V4ZGguYwpAQCAtMCwwICsxLDg4IEBACisvKiAkT3BlbkJTRDoga2V4ZGguYyx2IDEuMjMgMjAwNi8wOC8wMyAwMzozNDo0MiBkZXJhYWR0IEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAic3NoMi5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgImNpcGhlci5oIgorI2luY2x1ZGUgImtleC5oIgorCit2b2lkCitrZXhfZGhfaGFzaCgKKyAgICBjaGFyICpjbGllbnRfdmVyc2lvbl9zdHJpbmcsCisgICAgY2hhciAqc2VydmVyX3ZlcnNpb25fc3RyaW5nLAorICAgIGNoYXIgKmNrZXhpbml0LCBpbnQgY2tleGluaXRsZW4sCisgICAgY2hhciAqc2tleGluaXQsIGludCBza2V4aW5pdGxlbiwKKyAgICB1X2NoYXIgKnNlcnZlcmhvc3RrZXlibG9iLCBpbnQgc2Jsb2JsZW4sCisgICAgQklHTlVNICpjbGllbnRfZGhfcHViLAorICAgIEJJR05VTSAqc2VydmVyX2RoX3B1YiwKKyAgICBCSUdOVU0gKnNoYXJlZF9zZWNyZXQsCisgICAgdV9jaGFyICoqaGFzaCwgdV9pbnQgKmhhc2hsZW4pCit7CisJQnVmZmVyIGI7CisJc3RhdGljIHVfY2hhciBkaWdlc3RbRVZQX01BWF9NRF9TSVpFXTsKKwljb25zdCBFVlBfTUQgKmV2cF9tZCA9IEVWUF9zaGExKCk7CisJRVZQX01EX0NUWCBtZDsKKworCWJ1ZmZlcl9pbml0KCZiKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIGNsaWVudF92ZXJzaW9uX3N0cmluZyk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBzZXJ2ZXJfdmVyc2lvbl9zdHJpbmcpOworCisJLyoga2V4aW5pdCBtZXNzYWdlczogZmFrZSBoZWFkZXI6IGxlbitTU0gyX01TR19LRVhJTklUICovCisJYnVmZmVyX3B1dF9pbnQoJmIsIGNrZXhpbml0bGVuKzEpOworCWJ1ZmZlcl9wdXRfY2hhcigmYiwgU1NIMl9NU0dfS0VYSU5JVCk7CisJYnVmZmVyX2FwcGVuZCgmYiwgY2tleGluaXQsIGNrZXhpbml0bGVuKTsKKwlidWZmZXJfcHV0X2ludCgmYiwgc2tleGluaXRsZW4rMSk7CisJYnVmZmVyX3B1dF9jaGFyKCZiLCBTU0gyX01TR19LRVhJTklUKTsKKwlidWZmZXJfYXBwZW5kKCZiLCBza2V4aW5pdCwgc2tleGluaXRsZW4pOworCisJYnVmZmVyX3B1dF9zdHJpbmcoJmIsIHNlcnZlcmhvc3RrZXlibG9iLCBzYmxvYmxlbik7CisJYnVmZmVyX3B1dF9iaWdudW0yKCZiLCBjbGllbnRfZGhfcHViKTsKKwlidWZmZXJfcHV0X2JpZ251bTIoJmIsIHNlcnZlcl9kaF9wdWIpOworCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYiwgc2hhcmVkX3NlY3JldCk7CisKKyNpZmRlZiBERUJVR19LRVgKKwlidWZmZXJfZHVtcCgmYik7CisjZW5kaWYKKwlFVlBfRGlnZXN0SW5pdCgmbWQsIGV2cF9tZCk7CisJRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIGJ1ZmZlcl9wdHIoJmIpLCBidWZmZXJfbGVuKCZiKSk7CisJRVZQX0RpZ2VzdEZpbmFsKCZtZCwgZGlnZXN0LCBOVUxMKTsKKworCWJ1ZmZlcl9mcmVlKCZiKTsKKworI2lmZGVmIERFQlVHX0tFWAorCWR1bXBfZGlnZXN0KCJoYXNoIiwgZGlnZXN0LCBFVlBfTURfc2l6ZShldnBfbWQpKTsKKyNlbmRpZgorCSpoYXNoID0gZGlnZXN0OworCSpoYXNobGVuID0gRVZQX01EX3NpemUoZXZwX21kKTsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEva2V4ZGhjLmMgYi9vcGVuc3NoLTYuMHAxL2tleGRoYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2Y2ViNWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2tleGRoYy5jCkBAIC0wLDAgKzEsMTYxIEBACisvKiAkT3BlbkJTRDoga2V4ZGhjLmMsdiAxLjEyIDIwMTAvMTEvMTAgMDE6MzM6MDcgZGptIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJjaXBoZXIuaCIKKyNpbmNsdWRlICJrZXguaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJwYWNrZXQuaCIKKyNpbmNsdWRlICJkaC5oIgorI2luY2x1ZGUgInNzaDIuaCIKKwordm9pZAora2V4ZGhfY2xpZW50KEtleCAqa2V4KQoreworCUJJR05VTSAqZGhfc2VydmVyX3B1YiA9IE5VTEwsICpzaGFyZWRfc2VjcmV0ID0gTlVMTDsKKwlESCAqZGg7CisJS2V5ICpzZXJ2ZXJfaG9zdF9rZXk7CisJdV9jaGFyICpzZXJ2ZXJfaG9zdF9rZXlfYmxvYiA9IE5VTEwsICpzaWduYXR1cmUgPSBOVUxMOworCXVfY2hhciAqa2J1ZiwgKmhhc2g7CisJdV9pbnQga2xlbiwgc2xlbiwgc2Jsb2JsZW4sIGhhc2hsZW47CisJaW50IGtvdXQ7CisKKwkvKiBnZW5lcmF0ZSBhbmQgc2VuZCAnZScsIGNsaWVudCBESCBwdWJsaWMga2V5ICovCisJc3dpdGNoIChrZXgtPmtleF90eXBlKSB7CisJY2FzZSBLRVhfREhfR1JQMV9TSEExOgorCQlkaCA9IGRoX25ld19ncm91cDEoKTsKKwkJYnJlYWs7CisJY2FzZSBLRVhfREhfR1JQMTRfU0hBMToKKwkJZGggPSBkaF9uZXdfZ3JvdXAxNCgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmYXRhbCgiJXM6IFVuZXhwZWN0ZWQgS0VYIHR5cGUgJWQiLCBfX2Z1bmNfXywga2V4LT5rZXhfdHlwZSk7CisJfQorCWRoX2dlbl9rZXkoZGgsIGtleC0+d2VfbmVlZCAqIDgpOworCXBhY2tldF9zdGFydChTU0gyX01TR19LRVhESF9JTklUKTsKKwlwYWNrZXRfcHV0X2JpZ251bTIoZGgtPnB1Yl9rZXkpOworCXBhY2tldF9zZW5kKCk7CisKKwlkZWJ1Zygic2VuZGluZyBTU0gyX01TR19LRVhESF9JTklUIik7CisjaWZkZWYgREVCVUdfS0VYREgKKwlESHBhcmFtc19wcmludF9mcChzdGRlcnIsIGRoKTsKKwlmcHJpbnRmKHN0ZGVyciwgInB1Yj0gIik7CisJQk5fcHJpbnRfZnAoc3RkZXJyLCBkaC0+cHViX2tleSk7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworI2VuZGlmCisKKwlkZWJ1ZygiZXhwZWN0aW5nIFNTSDJfTVNHX0tFWERIX1JFUExZIik7CisJcGFja2V0X3JlYWRfZXhwZWN0KFNTSDJfTVNHX0tFWERIX1JFUExZKTsKKworCS8qIGtleSwgY2VydCAqLworCXNlcnZlcl9ob3N0X2tleV9ibG9iID0gcGFja2V0X2dldF9zdHJpbmcoJnNibG9ibGVuKTsKKwlzZXJ2ZXJfaG9zdF9rZXkgPSBrZXlfZnJvbV9ibG9iKHNlcnZlcl9ob3N0X2tleV9ibG9iLCBzYmxvYmxlbik7CisJaWYgKHNlcnZlcl9ob3N0X2tleSA9PSBOVUxMKQorCQlmYXRhbCgiY2Fubm90IGRlY29kZSBzZXJ2ZXJfaG9zdF9rZXlfYmxvYiIpOworCWlmIChzZXJ2ZXJfaG9zdF9rZXktPnR5cGUgIT0ga2V4LT5ob3N0a2V5X3R5cGUpCisJCWZhdGFsKCJ0eXBlIG1pc21hdGNoIGZvciBkZWNvZGVkIHNlcnZlcl9ob3N0X2tleV9ibG9iIik7CisJaWYgKGtleC0+dmVyaWZ5X2hvc3Rfa2V5ID09IE5VTEwpCisJCWZhdGFsKCJjYW5ub3QgdmVyaWZ5IHNlcnZlcl9ob3N0X2tleSIpOworCWlmIChrZXgtPnZlcmlmeV9ob3N0X2tleShzZXJ2ZXJfaG9zdF9rZXkpID09IC0xKQorCQlmYXRhbCgic2VydmVyX2hvc3Rfa2V5IHZlcmlmaWNhdGlvbiBmYWlsZWQiKTsKKworCS8qIERIIHBhcmFtZXRlciBmLCBzZXJ2ZXIgcHVibGljIERIIGtleSAqLworCWlmICgoZGhfc2VydmVyX3B1YiA9IEJOX25ldygpKSA9PSBOVUxMKQorCQlmYXRhbCgiZGhfc2VydmVyX3B1YiA9PSBOVUxMIik7CisJcGFja2V0X2dldF9iaWdudW0yKGRoX3NlcnZlcl9wdWIpOworCisjaWZkZWYgREVCVUdfS0VYREgKKwlmcHJpbnRmKHN0ZGVyciwgImRoX3NlcnZlcl9wdWI9ICIpOworCUJOX3ByaW50X2ZwKHN0ZGVyciwgZGhfc2VydmVyX3B1Yik7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCWRlYnVnKCJiaXRzICVkIiwgQk5fbnVtX2JpdHMoZGhfc2VydmVyX3B1YikpOworI2VuZGlmCisKKwkvKiBzaWduZWQgSCAqLworCXNpZ25hdHVyZSA9IHBhY2tldF9nZXRfc3RyaW5nKCZzbGVuKTsKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisKKwlpZiAoIWRoX3B1Yl9pc192YWxpZChkaCwgZGhfc2VydmVyX3B1YikpCisJCXBhY2tldF9kaXNjb25uZWN0KCJiYWQgc2VydmVyIHB1YmxpYyBESCB2YWx1ZSIpOworCisJa2xlbiA9IERIX3NpemUoZGgpOworCWtidWYgPSB4bWFsbG9jKGtsZW4pOworCWlmICgoa291dCA9IERIX2NvbXB1dGVfa2V5KGtidWYsIGRoX3NlcnZlcl9wdWIsIGRoKSkgPCAwKQorCQlmYXRhbCgiREhfY29tcHV0ZV9rZXk6IGZhaWxlZCIpOworI2lmZGVmIERFQlVHX0tFWERICisJZHVtcF9kaWdlc3QoInNoYXJlZCBzZWNyZXQiLCBrYnVmLCBrb3V0KTsKKyNlbmRpZgorCWlmICgoc2hhcmVkX3NlY3JldCA9IEJOX25ldygpKSA9PSBOVUxMKQorCQlmYXRhbCgia2V4ZGhfY2xpZW50OiBCTl9uZXcgZmFpbGVkIik7CisJaWYgKEJOX2JpbjJibihrYnVmLCBrb3V0LCBzaGFyZWRfc2VjcmV0KSA9PSBOVUxMKQorCQlmYXRhbCgia2V4ZGhfY2xpZW50OiBCTl9iaW4yYm4gZmFpbGVkIik7CisJbWVtc2V0KGtidWYsIDAsIGtsZW4pOworCXhmcmVlKGtidWYpOworCisJLyogY2FsYyBhbmQgdmVyaWZ5IEggKi8KKwlrZXhfZGhfaGFzaCgKKwkgICAga2V4LT5jbGllbnRfdmVyc2lvbl9zdHJpbmcsCisJICAgIGtleC0+c2VydmVyX3ZlcnNpb25fc3RyaW5nLAorCSAgICBidWZmZXJfcHRyKCZrZXgtPm15KSwgYnVmZmVyX2xlbigma2V4LT5teSksCisJICAgIGJ1ZmZlcl9wdHIoJmtleC0+cGVlciksIGJ1ZmZlcl9sZW4oJmtleC0+cGVlciksCisJICAgIHNlcnZlcl9ob3N0X2tleV9ibG9iLCBzYmxvYmxlbiwKKwkgICAgZGgtPnB1Yl9rZXksCisJICAgIGRoX3NlcnZlcl9wdWIsCisJICAgIHNoYXJlZF9zZWNyZXQsCisJICAgICZoYXNoLCAmaGFzaGxlbgorCSk7CisJeGZyZWUoc2VydmVyX2hvc3Rfa2V5X2Jsb2IpOworCUJOX2NsZWFyX2ZyZWUoZGhfc2VydmVyX3B1Yik7CisJREhfZnJlZShkaCk7CisKKwlpZiAoa2V5X3ZlcmlmeShzZXJ2ZXJfaG9zdF9rZXksIHNpZ25hdHVyZSwgc2xlbiwgaGFzaCwgaGFzaGxlbikgIT0gMSkKKwkJZmF0YWwoImtleV92ZXJpZnkgZmFpbGVkIGZvciBzZXJ2ZXJfaG9zdF9rZXkiKTsKKwlrZXlfZnJlZShzZXJ2ZXJfaG9zdF9rZXkpOworCXhmcmVlKHNpZ25hdHVyZSk7CisKKwkvKiBzYXZlIHNlc3Npb24gaWQgKi8KKwlpZiAoa2V4LT5zZXNzaW9uX2lkID09IE5VTEwpIHsKKwkJa2V4LT5zZXNzaW9uX2lkX2xlbiA9IGhhc2hsZW47CisJCWtleC0+c2Vzc2lvbl9pZCA9IHhtYWxsb2Moa2V4LT5zZXNzaW9uX2lkX2xlbik7CisJCW1lbWNweShrZXgtPnNlc3Npb25faWQsIGhhc2gsIGtleC0+c2Vzc2lvbl9pZF9sZW4pOworCX0KKworCWtleF9kZXJpdmVfa2V5cyhrZXgsIGhhc2gsIGhhc2hsZW4sIHNoYXJlZF9zZWNyZXQpOworCUJOX2NsZWFyX2ZyZWUoc2hhcmVkX3NlY3JldCk7CisJa2V4X2ZpbmlzaChrZXgpOworfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9rZXhkaHMuYyBiL29wZW5zc2gtNi4wcDEva2V4ZGhzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU2ZTg4NwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEva2V4ZGhzLmMKQEAgLTAsMCArMSwxNjggQEAKKy8qICRPcGVuQlNEOiBrZXhkaHMuYyx2IDEuMTIgMjAxMC8xMS8xMCAwMTozMzowNyBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KKworI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJjaXBoZXIuaCIKKyNpbmNsdWRlICJrZXguaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJwYWNrZXQuaCIKKyNpbmNsdWRlICJkaC5oIgorI2luY2x1ZGUgInNzaDIuaCIKKyNpZmRlZiBHU1NBUEkKKyNpbmNsdWRlICJzc2gtZ3NzLmgiCisjZW5kaWYKKyNpbmNsdWRlICJtb25pdG9yX3dyYXAuaCIKKwordm9pZAora2V4ZGhfc2VydmVyKEtleCAqa2V4KQoreworCUJJR05VTSAqc2hhcmVkX3NlY3JldCA9IE5VTEwsICpkaF9jbGllbnRfcHViID0gTlVMTDsKKwlESCAqZGg7CisJS2V5ICpzZXJ2ZXJfaG9zdF9wdWJsaWMsICpzZXJ2ZXJfaG9zdF9wcml2YXRlOworCXVfY2hhciAqa2J1ZiwgKmhhc2gsICpzaWduYXR1cmUgPSBOVUxMLCAqc2VydmVyX2hvc3Rfa2V5X2Jsb2IgPSBOVUxMOworCXVfaW50IHNibG9ibGVuLCBrbGVuLCBoYXNobGVuLCBzbGVuOworCWludCBrb3V0OworCisJLyogZ2VuZXJhdGUgc2VydmVyIERIIHB1YmxpYyBrZXkgKi8KKwlzd2l0Y2ggKGtleC0+a2V4X3R5cGUpIHsKKwljYXNlIEtFWF9ESF9HUlAxX1NIQTE6CisJCWRoID0gZGhfbmV3X2dyb3VwMSgpOworCQlicmVhazsKKwljYXNlIEtFWF9ESF9HUlAxNF9TSEExOgorCQlkaCA9IGRoX25ld19ncm91cDE0KCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZhdGFsKCIlczogVW5leHBlY3RlZCBLRVggdHlwZSAlZCIsIF9fZnVuY19fLCBrZXgtPmtleF90eXBlKTsKKwl9CisJZGhfZ2VuX2tleShkaCwga2V4LT53ZV9uZWVkICogOCk7CisKKwlkZWJ1ZygiZXhwZWN0aW5nIFNTSDJfTVNHX0tFWERIX0lOSVQiKTsKKwlwYWNrZXRfcmVhZF9leHBlY3QoU1NIMl9NU0dfS0VYREhfSU5JVCk7CisKKwlpZiAoa2V4LT5sb2FkX2hvc3RfcHVibGljX2tleSA9PSBOVUxMIHx8CisJICAgIGtleC0+bG9hZF9ob3N0X3ByaXZhdGVfa2V5ID09IE5VTEwpCisJCWZhdGFsKCJDYW5ub3QgbG9hZCBob3N0a2V5Iik7CisJc2VydmVyX2hvc3RfcHVibGljID0ga2V4LT5sb2FkX2hvc3RfcHVibGljX2tleShrZXgtPmhvc3RrZXlfdHlwZSk7CisJaWYgKHNlcnZlcl9ob3N0X3B1YmxpYyA9PSBOVUxMKQorCQlmYXRhbCgiVW5zdXBwb3J0ZWQgaG9zdGtleSB0eXBlICVkIiwga2V4LT5ob3N0a2V5X3R5cGUpOworCXNlcnZlcl9ob3N0X3ByaXZhdGUgPSBrZXgtPmxvYWRfaG9zdF9wcml2YXRlX2tleShrZXgtPmhvc3RrZXlfdHlwZSk7CisJaWYgKHNlcnZlcl9ob3N0X3ByaXZhdGUgPT0gTlVMTCkKKwkJZmF0YWwoIk1pc3NpbmcgcHJpdmF0ZSBrZXkgZm9yIGhvc3RrZXkgdHlwZSAlZCIsCisJCSAgICBrZXgtPmhvc3RrZXlfdHlwZSk7CisKKwkvKiBrZXksIGNlcnQgKi8KKwlpZiAoKGRoX2NsaWVudF9wdWIgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoImRoX2NsaWVudF9wdWIgPT0gTlVMTCIpOworCXBhY2tldF9nZXRfYmlnbnVtMihkaF9jbGllbnRfcHViKTsKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisKKyNpZmRlZiBERUJVR19LRVhESAorCWZwcmludGYoc3RkZXJyLCAiZGhfY2xpZW50X3B1Yj0gIik7CisJQk5fcHJpbnRfZnAoc3RkZXJyLCBkaF9jbGllbnRfcHViKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZGVidWcoImJpdHMgJWQiLCBCTl9udW1fYml0cyhkaF9jbGllbnRfcHViKSk7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0tFWERICisJREhwYXJhbXNfcHJpbnRfZnAoc3RkZXJyLCBkaCk7CisJZnByaW50ZihzdGRlcnIsICJwdWI9ICIpOworCUJOX3ByaW50X2ZwKHN0ZGVyciwgZGgtPnB1Yl9rZXkpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyNlbmRpZgorCWlmICghZGhfcHViX2lzX3ZhbGlkKGRoLCBkaF9jbGllbnRfcHViKSkKKwkJcGFja2V0X2Rpc2Nvbm5lY3QoImJhZCBjbGllbnQgcHVibGljIERIIHZhbHVlIik7CisKKwlrbGVuID0gREhfc2l6ZShkaCk7CisJa2J1ZiA9IHhtYWxsb2Moa2xlbik7CisJaWYgKChrb3V0ID0gREhfY29tcHV0ZV9rZXkoa2J1ZiwgZGhfY2xpZW50X3B1YiwgZGgpKSA8IDApCisJCWZhdGFsKCJESF9jb21wdXRlX2tleTogZmFpbGVkIik7CisjaWZkZWYgREVCVUdfS0VYREgKKwlkdW1wX2RpZ2VzdCgic2hhcmVkIHNlY3JldCIsIGtidWYsIGtvdXQpOworI2VuZGlmCisJaWYgKChzaGFyZWRfc2VjcmV0ID0gQk5fbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCJrZXhkaF9zZXJ2ZXI6IEJOX25ldyBmYWlsZWQiKTsKKwlpZiAoQk5fYmluMmJuKGtidWYsIGtvdXQsIHNoYXJlZF9zZWNyZXQpID09IE5VTEwpCisJCWZhdGFsKCJrZXhkaF9zZXJ2ZXI6IEJOX2JpbjJibiBmYWlsZWQiKTsKKwltZW1zZXQoa2J1ZiwgMCwga2xlbik7CisJeGZyZWUoa2J1Zik7CisKKwlrZXlfdG9fYmxvYihzZXJ2ZXJfaG9zdF9wdWJsaWMsICZzZXJ2ZXJfaG9zdF9rZXlfYmxvYiwgJnNibG9ibGVuKTsKKworCS8qIGNhbGMgSCAqLworCWtleF9kaF9oYXNoKAorCSAgICBrZXgtPmNsaWVudF92ZXJzaW9uX3N0cmluZywKKwkgICAga2V4LT5zZXJ2ZXJfdmVyc2lvbl9zdHJpbmcsCisJICAgIGJ1ZmZlcl9wdHIoJmtleC0+cGVlciksIGJ1ZmZlcl9sZW4oJmtleC0+cGVlciksCisJICAgIGJ1ZmZlcl9wdHIoJmtleC0+bXkpLCBidWZmZXJfbGVuKCZrZXgtPm15KSwKKwkgICAgc2VydmVyX2hvc3Rfa2V5X2Jsb2IsIHNibG9ibGVuLAorCSAgICBkaF9jbGllbnRfcHViLAorCSAgICBkaC0+cHViX2tleSwKKwkgICAgc2hhcmVkX3NlY3JldCwKKwkgICAgJmhhc2gsICZoYXNobGVuCisJKTsKKwlCTl9jbGVhcl9mcmVlKGRoX2NsaWVudF9wdWIpOworCisJLyogc2F2ZSBzZXNzaW9uIGlkIDo9IEggKi8KKwlpZiAoa2V4LT5zZXNzaW9uX2lkID09IE5VTEwpIHsKKwkJa2V4LT5zZXNzaW9uX2lkX2xlbiA9IGhhc2hsZW47CisJCWtleC0+c2Vzc2lvbl9pZCA9IHhtYWxsb2Moa2V4LT5zZXNzaW9uX2lkX2xlbik7CisJCW1lbWNweShrZXgtPnNlc3Npb25faWQsIGhhc2gsIGtleC0+c2Vzc2lvbl9pZF9sZW4pOworCX0KKworCS8qIHNpZ24gSCAqLworCWlmIChQUklWU0VQKGtleV9zaWduKHNlcnZlcl9ob3N0X3ByaXZhdGUsICZzaWduYXR1cmUsICZzbGVuLCBoYXNoLAorCSAgICBoYXNobGVuKSkgPCAwKQorCQlmYXRhbCgia2V4ZGhfc2VydmVyOiBrZXlfc2lnbiBmYWlsZWQiKTsKKworCS8qIGRlc3Ryb3lfc2Vuc2l0aXZlX2RhdGEoKTsgKi8KKworCS8qIHNlbmQgc2VydmVyIGhvc3RrZXksIERIIHB1YmtleSAnZicgYW5kIHNpbmdlZCBIICovCisJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0tFWERIX1JFUExZKTsKKwlwYWNrZXRfcHV0X3N0cmluZyhzZXJ2ZXJfaG9zdF9rZXlfYmxvYiwgc2Jsb2JsZW4pOworCXBhY2tldF9wdXRfYmlnbnVtMihkaC0+cHViX2tleSk7CS8qIGYgKi8KKwlwYWNrZXRfcHV0X3N0cmluZyhzaWduYXR1cmUsIHNsZW4pOworCXBhY2tldF9zZW5kKCk7CisKKwl4ZnJlZShzaWduYXR1cmUpOworCXhmcmVlKHNlcnZlcl9ob3N0X2tleV9ibG9iKTsKKwkvKiBoYXZlIGtleXMsIGZyZWUgREggKi8KKwlESF9mcmVlKGRoKTsKKworCWtleF9kZXJpdmVfa2V5cyhrZXgsIGhhc2gsIGhhc2hsZW4sIHNoYXJlZF9zZWNyZXQpOworCUJOX2NsZWFyX2ZyZWUoc2hhcmVkX3NlY3JldCk7CisJa2V4X2ZpbmlzaChrZXgpOworfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9rZXhlY2RoLmMgYi9vcGVuc3NoLTYuMHAxL2tleGVjZGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTNmNjlkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9rZXhlY2RoLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qICRPcGVuQlNEOiBrZXhlY2RoLmMsdiAxLjMgMjAxMC8wOS8yMiAwNTowMToyOSBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgRGFtaWVuIE1pbGxlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaWZkZWYgT1BFTlNTTF9IQVNfRUNDCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lYy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZWNkaC5oPgorCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAic3NoMi5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgImNpcGhlci5oIgorI2luY2x1ZGUgImtleC5oIgorI2luY2x1ZGUgImxvZy5oIgorCitpbnQKK2tleF9lY2RoX25hbWVfdG9fbmlkKGNvbnN0IGNoYXIgKmtleG5hbWUpCit7CisJaWYgKHN0cmxlbihrZXhuYW1lKSA8IHNpemVvZihLRVhfRUNESF9TSEEyX1NURU0pIC0gMSkKKwkJZmF0YWwoIiVzOiBrZXhuYW1lIHRvbyBzaG9ydCBcIiVzXCIiLCBfX2Z1bmNfXywga2V4bmFtZSk7CisJcmV0dXJuIGtleV9jdXJ2ZV9uYW1lX3RvX25pZChrZXhuYW1lICsgc2l6ZW9mKEtFWF9FQ0RIX1NIQTJfU1RFTSkgLSAxKTsKK30KKworY29uc3QgRVZQX01EICoKK2tleF9lY2RoX25hbWVfdG9fZXZwbWQoY29uc3QgY2hhciAqa2V4bmFtZSkKK3sKKwlpbnQgbmlkID0ga2V4X2VjZGhfbmFtZV90b19uaWQoa2V4bmFtZSk7CisKKwlpZiAobmlkID09IC0xKQorCQlmYXRhbCgiJXM6IHVuc3VwcG9ydGVkIEVDREggY3VydmUgXCIlc1wiIiwgX19mdW5jX18sIGtleG5hbWUpOworCXJldHVybiBrZXlfZWNfbmlkX3RvX2V2cG1kKG5pZCk7Cit9CisKK3ZvaWQKK2tleF9lY2RoX2hhc2goCisgICAgY29uc3QgRVZQX01EICpldnBfbWQsCisgICAgY29uc3QgRUNfR1JPVVAgKmVjX2dyb3VwLAorICAgIGNoYXIgKmNsaWVudF92ZXJzaW9uX3N0cmluZywKKyAgICBjaGFyICpzZXJ2ZXJfdmVyc2lvbl9zdHJpbmcsCisgICAgY2hhciAqY2tleGluaXQsIGludCBja2V4aW5pdGxlbiwKKyAgICBjaGFyICpza2V4aW5pdCwgaW50IHNrZXhpbml0bGVuLAorICAgIHVfY2hhciAqc2VydmVyaG9zdGtleWJsb2IsIGludCBzYmxvYmxlbiwKKyAgICBjb25zdCBFQ19QT0lOVCAqY2xpZW50X2RoX3B1YiwKKyAgICBjb25zdCBFQ19QT0lOVCAqc2VydmVyX2RoX3B1YiwKKyAgICBjb25zdCBCSUdOVU0gKnNoYXJlZF9zZWNyZXQsCisgICAgdV9jaGFyICoqaGFzaCwgdV9pbnQgKmhhc2hsZW4pCit7CisJQnVmZmVyIGI7CisJRVZQX01EX0NUWCBtZDsKKwlzdGF0aWMgdV9jaGFyIGRpZ2VzdFtFVlBfTUFYX01EX1NJWkVdOworCisJYnVmZmVyX2luaXQoJmIpOworCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwgY2xpZW50X3ZlcnNpb25fc3RyaW5nKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIHNlcnZlcl92ZXJzaW9uX3N0cmluZyk7CisKKwkvKiBrZXhpbml0IG1lc3NhZ2VzOiBmYWtlIGhlYWRlcjogbGVuK1NTSDJfTVNHX0tFWElOSVQgKi8KKwlidWZmZXJfcHV0X2ludCgmYiwgY2tleGluaXRsZW4rMSk7CisJYnVmZmVyX3B1dF9jaGFyKCZiLCBTU0gyX01TR19LRVhJTklUKTsKKwlidWZmZXJfYXBwZW5kKCZiLCBja2V4aW5pdCwgY2tleGluaXRsZW4pOworCWJ1ZmZlcl9wdXRfaW50KCZiLCBza2V4aW5pdGxlbisxKTsKKwlidWZmZXJfcHV0X2NoYXIoJmIsIFNTSDJfTVNHX0tFWElOSVQpOworCWJ1ZmZlcl9hcHBlbmQoJmIsIHNrZXhpbml0LCBza2V4aW5pdGxlbik7CisKKwlidWZmZXJfcHV0X3N0cmluZygmYiwgc2VydmVyaG9zdGtleWJsb2IsIHNibG9ibGVuKTsKKwlidWZmZXJfcHV0X2VjcG9pbnQoJmIsIGVjX2dyb3VwLCBjbGllbnRfZGhfcHViKTsKKwlidWZmZXJfcHV0X2VjcG9pbnQoJmIsIGVjX2dyb3VwLCBzZXJ2ZXJfZGhfcHViKTsKKwlidWZmZXJfcHV0X2JpZ251bTIoJmIsIHNoYXJlZF9zZWNyZXQpOworCisjaWZkZWYgREVCVUdfS0VYCisJYnVmZmVyX2R1bXAoJmIpOworI2VuZGlmCisJRVZQX0RpZ2VzdEluaXQoJm1kLCBldnBfbWQpOworCUVWUF9EaWdlc3RVcGRhdGUoJm1kLCBidWZmZXJfcHRyKCZiKSwgYnVmZmVyX2xlbigmYikpOworCUVWUF9EaWdlc3RGaW5hbCgmbWQsIGRpZ2VzdCwgTlVMTCk7CisKKwlidWZmZXJfZnJlZSgmYik7CisKKyNpZmRlZiBERUJVR19LRVgKKwlkdW1wX2RpZ2VzdCgiaGFzaCIsIGRpZ2VzdCwgRVZQX01EX3NpemUoZXZwX21kKSk7CisjZW5kaWYKKwkqaGFzaCA9IGRpZ2VzdDsKKwkqaGFzaGxlbiA9IEVWUF9NRF9zaXplKGV2cF9tZCk7Cit9CisKKyNlbmRpZiAvKiBPUEVOU1NMX0hBU19FQ0MgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEva2V4ZWNkaGMuYyBiL29wZW5zc2gtNi4wcDEva2V4ZWNkaGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTVkNGJmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9rZXhlY2RoYy5jCkBAIC0wLDAgKzEsMTY4IEBACisvKiAkT3BlbkJTRDoga2V4ZWNkaGMuYyx2IDEuMiAyMDEwLzA5LzIyIDA1OjAxOjI5IGRqbSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMCBEYW1pZW4gTWlsbGVyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAia2V5LmgiCisjaW5jbHVkZSAiY2lwaGVyLmgiCisjaW5jbHVkZSAia2V4LmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAicGFja2V0LmgiCisjaW5jbHVkZSAiZGguaCIKKyNpbmNsdWRlICJzc2gyLmgiCisKKyNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKKworI2luY2x1ZGUgPG9wZW5zc2wvZWNkaC5oPgorCit2b2lkCitrZXhlY2RoX2NsaWVudChLZXggKmtleCkKK3sKKwlFQ19LRVkgKmNsaWVudF9rZXk7CisJRUNfUE9JTlQgKnNlcnZlcl9wdWJsaWM7CisJY29uc3QgRUNfR1JPVVAgKmdyb3VwOworCUJJR05VTSAqc2hhcmVkX3NlY3JldDsKKwlLZXkgKnNlcnZlcl9ob3N0X2tleTsKKwl1X2NoYXIgKnNlcnZlcl9ob3N0X2tleV9ibG9iID0gTlVMTCwgKnNpZ25hdHVyZSA9IE5VTEw7CisJdV9jaGFyICprYnVmLCAqaGFzaDsKKwl1X2ludCBrbGVuLCBzbGVuLCBzYmxvYmxlbiwgaGFzaGxlbjsKKwlpbnQgY3VydmVfbmlkOworCisJaWYgKChjdXJ2ZV9uaWQgPSBrZXhfZWNkaF9uYW1lX3RvX25pZChrZXgtPm5hbWUpKSA9PSAtMSkKKwkJZmF0YWwoIiVzOiB1bnN1cHBvcnRlZCBFQ0RIIGN1cnZlIFwiJXNcIiIsIF9fZnVuY19fLCBrZXgtPm5hbWUpOworCWlmICgoY2xpZW50X2tleSA9IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZShjdXJ2ZV9uaWQpKSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZSBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJaWYgKEVDX0tFWV9nZW5lcmF0ZV9rZXkoY2xpZW50X2tleSkgIT0gMSkKKwkJZmF0YWwoIiVzOiBFQ19LRVlfZ2VuZXJhdGVfa2V5IGZhaWxlZCIsIF9fZnVuY19fKTsKKwlncm91cCA9IEVDX0tFWV9nZXQwX2dyb3VwKGNsaWVudF9rZXkpOworCisJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0tFWF9FQ0RIX0lOSVQpOworCXBhY2tldF9wdXRfZWNwb2ludChncm91cCwgRUNfS0VZX2dldDBfcHVibGljX2tleShjbGllbnRfa2V5KSk7CisJcGFja2V0X3NlbmQoKTsKKwlkZWJ1Zygic2VuZGluZyBTU0gyX01TR19LRVhfRUNESF9JTklUIik7CisKKyNpZmRlZiBERUJVR19LRVhFQ0RICisJZnB1dHMoImNsaWVudCBwcml2YXRlIGtleTpcbiIsIHN0ZGVycik7CisJa2V5X2R1bXBfZWNfa2V5KGNsaWVudF9rZXkpOworI2VuZGlmCisKKwlkZWJ1ZygiZXhwZWN0aW5nIFNTSDJfTVNHX0tFWF9FQ0RIX1JFUExZIik7CisJcGFja2V0X3JlYWRfZXhwZWN0KFNTSDJfTVNHX0tFWF9FQ0RIX1JFUExZKTsKKworCS8qIGhvc3RrZXkgKi8KKwlzZXJ2ZXJfaG9zdF9rZXlfYmxvYiA9IHBhY2tldF9nZXRfc3RyaW5nKCZzYmxvYmxlbik7CisJc2VydmVyX2hvc3Rfa2V5ID0ga2V5X2Zyb21fYmxvYihzZXJ2ZXJfaG9zdF9rZXlfYmxvYiwgc2Jsb2JsZW4pOworCWlmIChzZXJ2ZXJfaG9zdF9rZXkgPT0gTlVMTCkKKwkJZmF0YWwoImNhbm5vdCBkZWNvZGUgc2VydmVyX2hvc3Rfa2V5X2Jsb2IiKTsKKwlpZiAoc2VydmVyX2hvc3Rfa2V5LT50eXBlICE9IGtleC0+aG9zdGtleV90eXBlKQorCQlmYXRhbCgidHlwZSBtaXNtYXRjaCBmb3IgZGVjb2RlZCBzZXJ2ZXJfaG9zdF9rZXlfYmxvYiIpOworCWlmIChrZXgtPnZlcmlmeV9ob3N0X2tleSA9PSBOVUxMKQorCQlmYXRhbCgiY2Fubm90IHZlcmlmeSBzZXJ2ZXJfaG9zdF9rZXkiKTsKKwlpZiAoa2V4LT52ZXJpZnlfaG9zdF9rZXkoc2VydmVyX2hvc3Rfa2V5KSA9PSAtMSkKKwkJZmF0YWwoInNlcnZlcl9ob3N0X2tleSB2ZXJpZmljYXRpb24gZmFpbGVkIik7CisKKwkvKiBRX1MsIHNlcnZlciBwdWJsaWMga2V5ICovCisJaWYgKChzZXJ2ZXJfcHVibGljID0gRUNfUE9JTlRfbmV3KGdyb3VwKSkgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBFQ19QT0lOVF9uZXcgZmFpbGVkIiwgX19mdW5jX18pOworCXBhY2tldF9nZXRfZWNwb2ludChncm91cCwgc2VydmVyX3B1YmxpYyk7CisKKwlpZiAoa2V5X2VjX3ZhbGlkYXRlX3B1YmxpYyhncm91cCwgc2VydmVyX3B1YmxpYykgIT0gMCkKKwkJZmF0YWwoIiVzOiBpbnZhbGlkIHNlcnZlciBwdWJsaWMga2V5IiwgX19mdW5jX18pOworCisjaWZkZWYgREVCVUdfS0VYRUNESAorCWZwdXRzKCJzZXJ2ZXIgcHVibGljIGtleTpcbiIsIHN0ZGVycik7CisJa2V5X2R1bXBfZWNfcG9pbnQoZ3JvdXAsIHNlcnZlcl9wdWJsaWMpOworI2VuZGlmCisKKwkvKiBzaWduZWQgSCAqLworCXNpZ25hdHVyZSA9IHBhY2tldF9nZXRfc3RyaW5nKCZzbGVuKTsKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisKKwlrbGVuID0gKEVDX0dST1VQX2dldF9kZWdyZWUoZ3JvdXApICsgNykgLyA4OworCWtidWYgPSB4bWFsbG9jKGtsZW4pOworCWlmIChFQ0RIX2NvbXB1dGVfa2V5KGtidWYsIGtsZW4sIHNlcnZlcl9wdWJsaWMsCisJICAgIGNsaWVudF9rZXksIE5VTEwpICE9IChpbnQpa2xlbikKKwkJZmF0YWwoIiVzOiBFQ0RIX2NvbXB1dGVfa2V5IGZhaWxlZCIsIF9fZnVuY19fKTsKKworI2lmZGVmIERFQlVHX0tFWEVDREgKKwlkdW1wX2RpZ2VzdCgic2hhcmVkIHNlY3JldCIsIGtidWYsIGtsZW4pOworI2VuZGlmCisJaWYgKChzaGFyZWRfc2VjcmV0ID0gQk5fbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCIlczogQk5fbmV3IGZhaWxlZCIsIF9fZnVuY19fKTsKKwlpZiAoQk5fYmluMmJuKGtidWYsIGtsZW4sIHNoYXJlZF9zZWNyZXQpID09IE5VTEwpCisJCWZhdGFsKCIlczogQk5fYmluMmJuIGZhaWxlZCIsIF9fZnVuY19fKTsKKwltZW1zZXQoa2J1ZiwgMCwga2xlbik7CisJeGZyZWUoa2J1Zik7CisKKwkvKiBjYWxjIGFuZCB2ZXJpZnkgSCAqLworCWtleF9lY2RoX2hhc2goCisJICAgIGtleC0+ZXZwX21kLAorCSAgICBncm91cCwKKwkgICAga2V4LT5jbGllbnRfdmVyc2lvbl9zdHJpbmcsCisJICAgIGtleC0+c2VydmVyX3ZlcnNpb25fc3RyaW5nLAorCSAgICBidWZmZXJfcHRyKCZrZXgtPm15KSwgYnVmZmVyX2xlbigma2V4LT5teSksCisJICAgIGJ1ZmZlcl9wdHIoJmtleC0+cGVlciksIGJ1ZmZlcl9sZW4oJmtleC0+cGVlciksCisJICAgIHNlcnZlcl9ob3N0X2tleV9ibG9iLCBzYmxvYmxlbiwKKwkgICAgRUNfS0VZX2dldDBfcHVibGljX2tleShjbGllbnRfa2V5KSwKKwkgICAgc2VydmVyX3B1YmxpYywKKwkgICAgc2hhcmVkX3NlY3JldCwKKwkgICAgJmhhc2gsICZoYXNobGVuCisJKTsKKwl4ZnJlZShzZXJ2ZXJfaG9zdF9rZXlfYmxvYik7CisJRUNfUE9JTlRfY2xlYXJfZnJlZShzZXJ2ZXJfcHVibGljKTsKKwlFQ19LRVlfZnJlZShjbGllbnRfa2V5KTsKKworCWlmIChrZXlfdmVyaWZ5KHNlcnZlcl9ob3N0X2tleSwgc2lnbmF0dXJlLCBzbGVuLCBoYXNoLCBoYXNobGVuKSAhPSAxKQorCQlmYXRhbCgia2V5X3ZlcmlmeSBmYWlsZWQgZm9yIHNlcnZlcl9ob3N0X2tleSIpOworCWtleV9mcmVlKHNlcnZlcl9ob3N0X2tleSk7CisJeGZyZWUoc2lnbmF0dXJlKTsKKworCS8qIHNhdmUgc2Vzc2lvbiBpZCAqLworCWlmIChrZXgtPnNlc3Npb25faWQgPT0gTlVMTCkgeworCQlrZXgtPnNlc3Npb25faWRfbGVuID0gaGFzaGxlbjsKKwkJa2V4LT5zZXNzaW9uX2lkID0geG1hbGxvYyhrZXgtPnNlc3Npb25faWRfbGVuKTsKKwkJbWVtY3B5KGtleC0+c2Vzc2lvbl9pZCwgaGFzaCwga2V4LT5zZXNzaW9uX2lkX2xlbik7CisJfQorCisJa2V4X2Rlcml2ZV9rZXlzKGtleCwgaGFzaCwgaGFzaGxlbiwgc2hhcmVkX3NlY3JldCk7CisJQk5fY2xlYXJfZnJlZShzaGFyZWRfc2VjcmV0KTsKKwlrZXhfZmluaXNoKGtleCk7Cit9CisjZWxzZSAvKiBPUEVOU1NMX0hBU19FQ0MgKi8KK3ZvaWQKK2tleGVjZGhfY2xpZW50KEtleCAqa2V4KQoreworCWZhdGFsKCJFQ0Mgc3VwcG9ydCBpcyBub3QgZW5hYmxlZCIpOworfQorI2VuZGlmIC8qIE9QRU5TU0xfSEFTX0VDQyAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9rZXhlY2Rocy5jIGIvb3BlbnNzaC02LjBwMS9rZXhlY2Rocy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNTE1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2tleGVjZGhzLmMKQEAgLTAsMCArMSwxNzMgQEAKKy8qICRPcGVuQlNEOiBrZXhlY2Rocy5jLHYgMS4yIDIwMTAvMDkvMjIgMDU6MDE6MjkgZGptIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEwIERhbWllbiBNaWxsZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgImNpcGhlci5oIgorI2luY2x1ZGUgImtleC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInBhY2tldC5oIgorI2luY2x1ZGUgImRoLmgiCisjaW5jbHVkZSAic3NoMi5oIgorI2lmZGVmIEdTU0FQSQorI2luY2x1ZGUgInNzaC1nc3MuaCIKKyNlbmRpZgorI2luY2x1ZGUgIm1vbml0b3Jfd3JhcC5oIgorCisjaWZkZWYgT1BFTlNTTF9IQVNfRUNDCisKKyNpbmNsdWRlIDxvcGVuc3NsL2VjZGguaD4KKwordm9pZAora2V4ZWNkaF9zZXJ2ZXIoS2V4ICprZXgpCit7CisJRUNfUE9JTlQgKmNsaWVudF9wdWJsaWM7CisJRUNfS0VZICpzZXJ2ZXJfa2V5OworCWNvbnN0IEVDX0dST1VQICpncm91cDsKKwlCSUdOVU0gKnNoYXJlZF9zZWNyZXQ7CisJS2V5ICpzZXJ2ZXJfaG9zdF9wcml2YXRlLCAqc2VydmVyX2hvc3RfcHVibGljOworCXVfY2hhciAqc2VydmVyX2hvc3Rfa2V5X2Jsb2IgPSBOVUxMLCAqc2lnbmF0dXJlID0gTlVMTDsKKwl1X2NoYXIgKmtidWYsICpoYXNoOworCXVfaW50IGtsZW4sIHNsZW4sIHNibG9ibGVuLCBoYXNobGVuOworCWludCBjdXJ2ZV9uaWQ7CisKKwlpZiAoKGN1cnZlX25pZCA9IGtleF9lY2RoX25hbWVfdG9fbmlkKGtleC0+bmFtZSkpID09IC0xKQorCQlmYXRhbCgiJXM6IHVuc3VwcG9ydGVkIEVDREggY3VydmUgXCIlc1wiIiwgX19mdW5jX18sIGtleC0+bmFtZSk7CisJaWYgKChzZXJ2ZXJfa2V5ID0gRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lKGN1cnZlX25pZCkpID09IE5VTEwpCisJCWZhdGFsKCIlczogRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lIGZhaWxlZCIsIF9fZnVuY19fKTsKKwlpZiAoRUNfS0VZX2dlbmVyYXRlX2tleShzZXJ2ZXJfa2V5KSAhPSAxKQorCQlmYXRhbCgiJXM6IEVDX0tFWV9nZW5lcmF0ZV9rZXkgZmFpbGVkIiwgX19mdW5jX18pOworCWdyb3VwID0gRUNfS0VZX2dldDBfZ3JvdXAoc2VydmVyX2tleSk7CisKKyNpZmRlZiBERUJVR19LRVhFQ0RICisJZnB1dHMoInNlcnZlciBwcml2YXRlIGtleTpcbiIsIHN0ZGVycik7CisJa2V5X2R1bXBfZWNfa2V5KHNlcnZlcl9rZXkpOworI2VuZGlmCisKKwlpZiAoa2V4LT5sb2FkX2hvc3RfcHVibGljX2tleSA9PSBOVUxMIHx8CisJICAgIGtleC0+bG9hZF9ob3N0X3ByaXZhdGVfa2V5ID09IE5VTEwpCisJCWZhdGFsKCJDYW5ub3QgbG9hZCBob3N0a2V5Iik7CisJc2VydmVyX2hvc3RfcHVibGljID0ga2V4LT5sb2FkX2hvc3RfcHVibGljX2tleShrZXgtPmhvc3RrZXlfdHlwZSk7CisJaWYgKHNlcnZlcl9ob3N0X3B1YmxpYyA9PSBOVUxMKQorCQlmYXRhbCgiVW5zdXBwb3J0ZWQgaG9zdGtleSB0eXBlICVkIiwga2V4LT5ob3N0a2V5X3R5cGUpOworCXNlcnZlcl9ob3N0X3ByaXZhdGUgPSBrZXgtPmxvYWRfaG9zdF9wcml2YXRlX2tleShrZXgtPmhvc3RrZXlfdHlwZSk7CisJaWYgKHNlcnZlcl9ob3N0X3ByaXZhdGUgPT0gTlVMTCkKKwkJZmF0YWwoIk1pc3NpbmcgcHJpdmF0ZSBrZXkgZm9yIGhvc3RrZXkgdHlwZSAlZCIsCisJCSAgICBrZXgtPmhvc3RrZXlfdHlwZSk7CisKKwlkZWJ1ZygiZXhwZWN0aW5nIFNTSDJfTVNHX0tFWF9FQ0RIX0lOSVQiKTsKKwlwYWNrZXRfcmVhZF9leHBlY3QoU1NIMl9NU0dfS0VYX0VDREhfSU5JVCk7CisJaWYgKChjbGllbnRfcHVibGljID0gRUNfUE9JTlRfbmV3KGdyb3VwKSkgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBFQ19QT0lOVF9uZXcgZmFpbGVkIiwgX19mdW5jX18pOworCXBhY2tldF9nZXRfZWNwb2ludChncm91cCwgY2xpZW50X3B1YmxpYyk7CisJcGFja2V0X2NoZWNrX2VvbSgpOworCisJaWYgKGtleV9lY192YWxpZGF0ZV9wdWJsaWMoZ3JvdXAsIGNsaWVudF9wdWJsaWMpICE9IDApCisJCWZhdGFsKCIlczogaW52YWxpZCBjbGllbnQgcHVibGljIGtleSIsIF9fZnVuY19fKTsKKworI2lmZGVmIERFQlVHX0tFWEVDREgKKwlmcHV0cygiY2xpZW50IHB1YmxpYyBrZXk6XG4iLCBzdGRlcnIpOworCWtleV9kdW1wX2VjX3BvaW50KGdyb3VwLCBjbGllbnRfcHVibGljKTsKKyNlbmRpZgorCisJLyogQ2FsY3VsYXRlIHNoYXJlZF9zZWNyZXQgKi8KKwlrbGVuID0gKEVDX0dST1VQX2dldF9kZWdyZWUoZ3JvdXApICsgNykgLyA4OworCWtidWYgPSB4bWFsbG9jKGtsZW4pOworCWlmIChFQ0RIX2NvbXB1dGVfa2V5KGtidWYsIGtsZW4sIGNsaWVudF9wdWJsaWMsCisJICAgIHNlcnZlcl9rZXksIE5VTEwpICE9IChpbnQpa2xlbikKKwkJZmF0YWwoIiVzOiBFQ0RIX2NvbXB1dGVfa2V5IGZhaWxlZCIsIF9fZnVuY19fKTsKKworI2lmZGVmIERFQlVHX0tFWERICisJZHVtcF9kaWdlc3QoInNoYXJlZCBzZWNyZXQiLCBrYnVmLCBrbGVuKTsKKyNlbmRpZgorCWlmICgoc2hhcmVkX3NlY3JldCA9IEJOX25ldygpKSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IEJOX25ldyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJaWYgKEJOX2JpbjJibihrYnVmLCBrbGVuLCBzaGFyZWRfc2VjcmV0KSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IEJOX2JpbjJibiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJbWVtc2V0KGtidWYsIDAsIGtsZW4pOworCXhmcmVlKGtidWYpOworCisJLyogY2FsYyBIICovCisJa2V5X3RvX2Jsb2Ioc2VydmVyX2hvc3RfcHVibGljLCAmc2VydmVyX2hvc3Rfa2V5X2Jsb2IsICZzYmxvYmxlbik7CisJa2V4X2VjZGhfaGFzaCgKKwkgICAga2V4LT5ldnBfbWQsCisJICAgIGdyb3VwLAorCSAgICBrZXgtPmNsaWVudF92ZXJzaW9uX3N0cmluZywKKwkgICAga2V4LT5zZXJ2ZXJfdmVyc2lvbl9zdHJpbmcsCisJICAgIGJ1ZmZlcl9wdHIoJmtleC0+cGVlciksIGJ1ZmZlcl9sZW4oJmtleC0+cGVlciksCisJICAgIGJ1ZmZlcl9wdHIoJmtleC0+bXkpLCBidWZmZXJfbGVuKCZrZXgtPm15KSwKKwkgICAgc2VydmVyX2hvc3Rfa2V5X2Jsb2IsIHNibG9ibGVuLAorCSAgICBjbGllbnRfcHVibGljLAorCSAgICBFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KHNlcnZlcl9rZXkpLAorCSAgICBzaGFyZWRfc2VjcmV0LAorCSAgICAmaGFzaCwgJmhhc2hsZW4KKwkpOworCUVDX1BPSU5UX2NsZWFyX2ZyZWUoY2xpZW50X3B1YmxpYyk7CisKKwkvKiBzYXZlIHNlc3Npb24gaWQgOj0gSCAqLworCWlmIChrZXgtPnNlc3Npb25faWQgPT0gTlVMTCkgeworCQlrZXgtPnNlc3Npb25faWRfbGVuID0gaGFzaGxlbjsKKwkJa2V4LT5zZXNzaW9uX2lkID0geG1hbGxvYyhrZXgtPnNlc3Npb25faWRfbGVuKTsKKwkJbWVtY3B5KGtleC0+c2Vzc2lvbl9pZCwgaGFzaCwga2V4LT5zZXNzaW9uX2lkX2xlbik7CisJfQorCisJLyogc2lnbiBIICovCisJaWYgKFBSSVZTRVAoa2V5X3NpZ24oc2VydmVyX2hvc3RfcHJpdmF0ZSwgJnNpZ25hdHVyZSwgJnNsZW4sCisJICAgIGhhc2gsIGhhc2hsZW4pKSA8IDApCisJCWZhdGFsKCJrZXhkaF9zZXJ2ZXI6IGtleV9zaWduIGZhaWxlZCIpOworCisJLyogZGVzdHJveV9zZW5zaXRpdmVfZGF0YSgpOyAqLworCisJLyogc2VuZCBzZXJ2ZXIgaG9zdGtleSwgRUNESCBwdWJrZXkgJ1FfUycgYW5kIHNpZ25lZCBIICovCisJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0tFWF9FQ0RIX1JFUExZKTsKKwlwYWNrZXRfcHV0X3N0cmluZyhzZXJ2ZXJfaG9zdF9rZXlfYmxvYiwgc2Jsb2JsZW4pOworCXBhY2tldF9wdXRfZWNwb2ludChncm91cCwgRUNfS0VZX2dldDBfcHVibGljX2tleShzZXJ2ZXJfa2V5KSk7CisJcGFja2V0X3B1dF9zdHJpbmcoc2lnbmF0dXJlLCBzbGVuKTsKKwlwYWNrZXRfc2VuZCgpOworCisJeGZyZWUoc2lnbmF0dXJlKTsKKwl4ZnJlZShzZXJ2ZXJfaG9zdF9rZXlfYmxvYik7CisJLyogaGF2ZSBrZXlzLCBmcmVlIHNlcnZlciBrZXkgKi8KKwlFQ19LRVlfZnJlZShzZXJ2ZXJfa2V5KTsKKworCWtleF9kZXJpdmVfa2V5cyhrZXgsIGhhc2gsIGhhc2hsZW4sIHNoYXJlZF9zZWNyZXQpOworCUJOX2NsZWFyX2ZyZWUoc2hhcmVkX3NlY3JldCk7CisJa2V4X2ZpbmlzaChrZXgpOworfQorI2Vsc2UgLyogT1BFTlNTTF9IQVNfRUNDICovCit2b2lkCitrZXhlY2RoX3NlcnZlcihLZXggKmtleCkKK3sKKwlmYXRhbCgiRUNDIHN1cHBvcnQgaXMgbm90IGVuYWJsZWQiKTsKK30KKyNlbmRpZiAvKiBPUEVOU1NMX0hBU19FQ0MgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEva2V4Z2V4LmMgYi9vcGVuc3NoLTYuMHAxL2tleGdleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MGFiNWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2tleGdleC5jCkBAIC0wLDAgKzEsOTggQEAKKy8qICRPcGVuQlNEOiBrZXhnZXguYyx2IDEuMjcgMjAwNi8wOC8wMyAwMzozNDo0MiBkZXJhYWR0IEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwIE5pZWxzIFByb3Zvcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAia2V5LmgiCisjaW5jbHVkZSAiY2lwaGVyLmgiCisjaW5jbHVkZSAia2V4LmgiCisjaW5jbHVkZSAic3NoMi5oIgorCit2b2lkCitrZXhnZXhfaGFzaCgKKyAgICBjb25zdCBFVlBfTUQgKmV2cF9tZCwKKyAgICBjaGFyICpjbGllbnRfdmVyc2lvbl9zdHJpbmcsCisgICAgY2hhciAqc2VydmVyX3ZlcnNpb25fc3RyaW5nLAorICAgIGNoYXIgKmNrZXhpbml0LCBpbnQgY2tleGluaXRsZW4sCisgICAgY2hhciAqc2tleGluaXQsIGludCBza2V4aW5pdGxlbiwKKyAgICB1X2NoYXIgKnNlcnZlcmhvc3RrZXlibG9iLCBpbnQgc2Jsb2JsZW4sCisgICAgaW50IG1pbiwgaW50IHdhbnRiaXRzLCBpbnQgbWF4LCBCSUdOVU0gKnByaW1lLCBCSUdOVU0gKmdlbiwKKyAgICBCSUdOVU0gKmNsaWVudF9kaF9wdWIsCisgICAgQklHTlVNICpzZXJ2ZXJfZGhfcHViLAorICAgIEJJR05VTSAqc2hhcmVkX3NlY3JldCwKKyAgICB1X2NoYXIgKipoYXNoLCB1X2ludCAqaGFzaGxlbikKK3sKKwlCdWZmZXIgYjsKKwlzdGF0aWMgdV9jaGFyIGRpZ2VzdFtFVlBfTUFYX01EX1NJWkVdOworCUVWUF9NRF9DVFggbWQ7CisKKwlidWZmZXJfaW5pdCgmYik7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBjbGllbnRfdmVyc2lvbl9zdHJpbmcpOworCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwgc2VydmVyX3ZlcnNpb25fc3RyaW5nKTsKKworCS8qIGtleGluaXQgbWVzc2FnZXM6IGZha2UgaGVhZGVyOiBsZW4rU1NIMl9NU0dfS0VYSU5JVCAqLworCWJ1ZmZlcl9wdXRfaW50KCZiLCBja2V4aW5pdGxlbisxKTsKKwlidWZmZXJfcHV0X2NoYXIoJmIsIFNTSDJfTVNHX0tFWElOSVQpOworCWJ1ZmZlcl9hcHBlbmQoJmIsIGNrZXhpbml0LCBja2V4aW5pdGxlbik7CisJYnVmZmVyX3B1dF9pbnQoJmIsIHNrZXhpbml0bGVuKzEpOworCWJ1ZmZlcl9wdXRfY2hhcigmYiwgU1NIMl9NU0dfS0VYSU5JVCk7CisJYnVmZmVyX2FwcGVuZCgmYiwgc2tleGluaXQsIHNrZXhpbml0bGVuKTsKKworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZiLCBzZXJ2ZXJob3N0a2V5YmxvYiwgc2Jsb2JsZW4pOworCWlmIChtaW4gPT0gLTEgfHwgbWF4ID09IC0xKQorCQlidWZmZXJfcHV0X2ludCgmYiwgd2FudGJpdHMpOworCWVsc2UgeworCQlidWZmZXJfcHV0X2ludCgmYiwgbWluKTsKKwkJYnVmZmVyX3B1dF9pbnQoJmIsIHdhbnRiaXRzKTsKKwkJYnVmZmVyX3B1dF9pbnQoJmIsIG1heCk7CisJfQorCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYiwgcHJpbWUpOworCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYiwgZ2VuKTsKKwlidWZmZXJfcHV0X2JpZ251bTIoJmIsIGNsaWVudF9kaF9wdWIpOworCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYiwgc2VydmVyX2RoX3B1Yik7CisJYnVmZmVyX3B1dF9iaWdudW0yKCZiLCBzaGFyZWRfc2VjcmV0KTsKKworI2lmZGVmIERFQlVHX0tFWERICisJYnVmZmVyX2R1bXAoJmIpOworI2VuZGlmCisKKwlFVlBfRGlnZXN0SW5pdCgmbWQsIGV2cF9tZCk7CisJRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIGJ1ZmZlcl9wdHIoJmIpLCBidWZmZXJfbGVuKCZiKSk7CisJRVZQX0RpZ2VzdEZpbmFsKCZtZCwgZGlnZXN0LCBOVUxMKTsKKworCWJ1ZmZlcl9mcmVlKCZiKTsKKwkqaGFzaCA9IGRpZ2VzdDsKKwkqaGFzaGxlbiA9IEVWUF9NRF9zaXplKGV2cF9tZCk7CisjaWZkZWYgREVCVUdfS0VYREgKKwlkdW1wX2RpZ2VzdCgiaGFzaCIsIGRpZ2VzdCwgKmhhc2hsZW4pOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2tleGdleGMuYyBiL29wZW5zc2gtNi4wcDEva2V4Z2V4Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NTUyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2tleGdleGMuYwpAQCAtMCwwICsxLDIwNyBAQAorLyogJE9wZW5CU0Q6IGtleGdleGMuYyx2IDEuMTIgMjAxMC8xMS8xMCAwMTozMzowNyBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgTmllbHMgUHJvdm9zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAia2V5LmgiCisjaW5jbHVkZSAiY2lwaGVyLmgiCisjaW5jbHVkZSAia2V4LmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAicGFja2V0LmgiCisjaW5jbHVkZSAiZGguaCIKKyNpbmNsdWRlICJzc2gyLmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisKK3ZvaWQKK2tleGdleF9jbGllbnQoS2V4ICprZXgpCit7CisJQklHTlVNICpkaF9zZXJ2ZXJfcHViID0gTlVMTCwgKnNoYXJlZF9zZWNyZXQgPSBOVUxMOworCUJJR05VTSAqcCA9IE5VTEwsICpnID0gTlVMTDsKKwlLZXkgKnNlcnZlcl9ob3N0X2tleTsKKwl1X2NoYXIgKmtidWYsICpoYXNoLCAqc2lnbmF0dXJlID0gTlVMTCwgKnNlcnZlcl9ob3N0X2tleV9ibG9iID0gTlVMTDsKKwl1X2ludCBrbGVuLCBzbGVuLCBzYmxvYmxlbiwgaGFzaGxlbjsKKwlpbnQga291dDsKKwlpbnQgbWluLCBtYXgsIG5iaXRzOworCURIICpkaDsKKworCW5iaXRzID0gZGhfZXN0aW1hdGUoa2V4LT53ZV9uZWVkICogOCk7CisKKwlpZiAoZGF0YWZlbGxvd3MgJiBTU0hfT0xEX0RIR0VYKSB7CisJCS8qIE9sZCBHRVggcmVxdWVzdCAqLworCQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfS0VYX0RIX0dFWF9SRVFVRVNUX09MRCk7CisJCXBhY2tldF9wdXRfaW50KG5iaXRzKTsKKwkJbWluID0gREhfR1JQX01JTjsKKwkJbWF4ID0gREhfR1JQX01BWDsKKworCQlkZWJ1ZygiU1NIMl9NU0dfS0VYX0RIX0dFWF9SRVFVRVNUX09MRCgldSkgc2VudCIsIG5iaXRzKTsKKwl9IGVsc2UgeworCQkvKiBOZXcgR0VYIHJlcXVlc3QgKi8KKwkJbWluID0gREhfR1JQX01JTjsKKwkJbWF4ID0gREhfR1JQX01BWDsKKwkJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0tFWF9ESF9HRVhfUkVRVUVTVCk7CisJCXBhY2tldF9wdXRfaW50KG1pbik7CisJCXBhY2tldF9wdXRfaW50KG5iaXRzKTsKKwkJcGFja2V0X3B1dF9pbnQobWF4KTsKKworCQlkZWJ1ZygiU1NIMl9NU0dfS0VYX0RIX0dFWF9SRVFVRVNUKCV1PCV1PCV1KSBzZW50IiwKKwkJICAgIG1pbiwgbmJpdHMsIG1heCk7CisJfQorI2lmZGVmIERFQlVHX0tFWERICisJZnByaW50ZihzdGRlcnIsICJcbm1pbiA9ICVkLCBuYml0cyA9ICVkLCBtYXggPSAlZFxuIiwKKwkgICAgbWluLCBuYml0cywgbWF4KTsKKyNlbmRpZgorCXBhY2tldF9zZW5kKCk7CisKKwlkZWJ1ZygiZXhwZWN0aW5nIFNTSDJfTVNHX0tFWF9ESF9HRVhfR1JPVVAiKTsKKwlwYWNrZXRfcmVhZF9leHBlY3QoU1NIMl9NU0dfS0VYX0RIX0dFWF9HUk9VUCk7CisKKwlpZiAoKHAgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoIkJOX25ldyIpOworCXBhY2tldF9nZXRfYmlnbnVtMihwKTsKKwlpZiAoKGcgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoIkJOX25ldyIpOworCXBhY2tldF9nZXRfYmlnbnVtMihnKTsKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisKKwlpZiAoQk5fbnVtX2JpdHMocCkgPCBtaW4gfHwgQk5fbnVtX2JpdHMocCkgPiBtYXgpCisJCWZhdGFsKCJESF9HRVggZ3JvdXAgb3V0IG9mIHJhbmdlOiAlZCAhPCAlZCAhPCAlZCIsCisJCSAgICBtaW4sIEJOX251bV9iaXRzKHApLCBtYXgpOworCisJZGggPSBkaF9uZXdfZ3JvdXAoZywgcCk7CisJZGhfZ2VuX2tleShkaCwga2V4LT53ZV9uZWVkICogOCk7CisKKyNpZmRlZiBERUJVR19LRVhESAorCURIcGFyYW1zX3ByaW50X2ZwKHN0ZGVyciwgZGgpOworCWZwcmludGYoc3RkZXJyLCAicHViPSAiKTsKKwlCTl9wcmludF9mcChzdGRlcnIsIGRoLT5wdWJfa2V5KTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisjZW5kaWYKKworCWRlYnVnKCJTU0gyX01TR19LRVhfREhfR0VYX0lOSVQgc2VudCIpOworCS8qIGdlbmVyYXRlIGFuZCBzZW5kICdlJywgY2xpZW50IERIIHB1YmxpYyBrZXkgKi8KKwlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfS0VYX0RIX0dFWF9JTklUKTsKKwlwYWNrZXRfcHV0X2JpZ251bTIoZGgtPnB1Yl9rZXkpOworCXBhY2tldF9zZW5kKCk7CisKKwlkZWJ1ZygiZXhwZWN0aW5nIFNTSDJfTVNHX0tFWF9ESF9HRVhfUkVQTFkiKTsKKwlwYWNrZXRfcmVhZF9leHBlY3QoU1NIMl9NU0dfS0VYX0RIX0dFWF9SRVBMWSk7CisKKwkvKiBrZXksIGNlcnQgKi8KKwlzZXJ2ZXJfaG9zdF9rZXlfYmxvYiA9IHBhY2tldF9nZXRfc3RyaW5nKCZzYmxvYmxlbik7CisJc2VydmVyX2hvc3Rfa2V5ID0ga2V5X2Zyb21fYmxvYihzZXJ2ZXJfaG9zdF9rZXlfYmxvYiwgc2Jsb2JsZW4pOworCWlmIChzZXJ2ZXJfaG9zdF9rZXkgPT0gTlVMTCkKKwkJZmF0YWwoImNhbm5vdCBkZWNvZGUgc2VydmVyX2hvc3Rfa2V5X2Jsb2IiKTsKKwlpZiAoc2VydmVyX2hvc3Rfa2V5LT50eXBlICE9IGtleC0+aG9zdGtleV90eXBlKQorCQlmYXRhbCgidHlwZSBtaXNtYXRjaCBmb3IgZGVjb2RlZCBzZXJ2ZXJfaG9zdF9rZXlfYmxvYiIpOworCWlmIChrZXgtPnZlcmlmeV9ob3N0X2tleSA9PSBOVUxMKQorCQlmYXRhbCgiY2Fubm90IHZlcmlmeSBzZXJ2ZXJfaG9zdF9rZXkiKTsKKwlpZiAoa2V4LT52ZXJpZnlfaG9zdF9rZXkoc2VydmVyX2hvc3Rfa2V5KSA9PSAtMSkKKwkJZmF0YWwoInNlcnZlcl9ob3N0X2tleSB2ZXJpZmljYXRpb24gZmFpbGVkIik7CisKKwkvKiBESCBwYXJhbWV0ZXIgZiwgc2VydmVyIHB1YmxpYyBESCBrZXkgKi8KKwlpZiAoKGRoX3NlcnZlcl9wdWIgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoImRoX3NlcnZlcl9wdWIgPT0gTlVMTCIpOworCXBhY2tldF9nZXRfYmlnbnVtMihkaF9zZXJ2ZXJfcHViKTsKKworI2lmZGVmIERFQlVHX0tFWERICisJZnByaW50ZihzdGRlcnIsICJkaF9zZXJ2ZXJfcHViPSAiKTsKKwlCTl9wcmludF9mcChzdGRlcnIsIGRoX3NlcnZlcl9wdWIpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwlkZWJ1ZygiYml0cyAlZCIsIEJOX251bV9iaXRzKGRoX3NlcnZlcl9wdWIpKTsKKyNlbmRpZgorCisJLyogc2lnbmVkIEggKi8KKwlzaWduYXR1cmUgPSBwYWNrZXRfZ2V0X3N0cmluZygmc2xlbik7CisJcGFja2V0X2NoZWNrX2VvbSgpOworCisJaWYgKCFkaF9wdWJfaXNfdmFsaWQoZGgsIGRoX3NlcnZlcl9wdWIpKQorCQlwYWNrZXRfZGlzY29ubmVjdCgiYmFkIHNlcnZlciBwdWJsaWMgREggdmFsdWUiKTsKKworCWtsZW4gPSBESF9zaXplKGRoKTsKKwlrYnVmID0geG1hbGxvYyhrbGVuKTsKKwlpZiAoKGtvdXQgPSBESF9jb21wdXRlX2tleShrYnVmLCBkaF9zZXJ2ZXJfcHViLCBkaCkpIDwgMCkKKwkJZmF0YWwoIkRIX2NvbXB1dGVfa2V5OiBmYWlsZWQiKTsKKyNpZmRlZiBERUJVR19LRVhESAorCWR1bXBfZGlnZXN0KCJzaGFyZWQgc2VjcmV0Iiwga2J1Ziwga291dCk7CisjZW5kaWYKKwlpZiAoKHNoYXJlZF9zZWNyZXQgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoImtleGdleF9jbGllbnQ6IEJOX25ldyBmYWlsZWQiKTsKKwlpZiAoQk5fYmluMmJuKGtidWYsIGtvdXQsIHNoYXJlZF9zZWNyZXQpID09IE5VTEwpCisJCWZhdGFsKCJrZXhnZXhfY2xpZW50OiBCTl9iaW4yYm4gZmFpbGVkIik7CisJbWVtc2V0KGtidWYsIDAsIGtsZW4pOworCXhmcmVlKGtidWYpOworCisJaWYgKGRhdGFmZWxsb3dzICYgU1NIX09MRF9ESEdFWCkKKwkJbWluID0gbWF4ID0gLTE7CisKKwkvKiBjYWxjIGFuZCB2ZXJpZnkgSCAqLworCWtleGdleF9oYXNoKAorCSAgICBrZXgtPmV2cF9tZCwKKwkgICAga2V4LT5jbGllbnRfdmVyc2lvbl9zdHJpbmcsCisJICAgIGtleC0+c2VydmVyX3ZlcnNpb25fc3RyaW5nLAorCSAgICBidWZmZXJfcHRyKCZrZXgtPm15KSwgYnVmZmVyX2xlbigma2V4LT5teSksCisJICAgIGJ1ZmZlcl9wdHIoJmtleC0+cGVlciksIGJ1ZmZlcl9sZW4oJmtleC0+cGVlciksCisJICAgIHNlcnZlcl9ob3N0X2tleV9ibG9iLCBzYmxvYmxlbiwKKwkgICAgbWluLCBuYml0cywgbWF4LAorCSAgICBkaC0+cCwgZGgtPmcsCisJICAgIGRoLT5wdWJfa2V5LAorCSAgICBkaF9zZXJ2ZXJfcHViLAorCSAgICBzaGFyZWRfc2VjcmV0LAorCSAgICAmaGFzaCwgJmhhc2hsZW4KKwkpOworCisJLyogaGF2ZSBrZXlzLCBmcmVlIERIICovCisJREhfZnJlZShkaCk7CisJeGZyZWUoc2VydmVyX2hvc3Rfa2V5X2Jsb2IpOworCUJOX2NsZWFyX2ZyZWUoZGhfc2VydmVyX3B1Yik7CisKKwlpZiAoa2V5X3ZlcmlmeShzZXJ2ZXJfaG9zdF9rZXksIHNpZ25hdHVyZSwgc2xlbiwgaGFzaCwgaGFzaGxlbikgIT0gMSkKKwkJZmF0YWwoImtleV92ZXJpZnkgZmFpbGVkIGZvciBzZXJ2ZXJfaG9zdF9rZXkiKTsKKwlrZXlfZnJlZShzZXJ2ZXJfaG9zdF9rZXkpOworCXhmcmVlKHNpZ25hdHVyZSk7CisKKwkvKiBzYXZlIHNlc3Npb24gaWQgKi8KKwlpZiAoa2V4LT5zZXNzaW9uX2lkID09IE5VTEwpIHsKKwkJa2V4LT5zZXNzaW9uX2lkX2xlbiA9IGhhc2hsZW47CisJCWtleC0+c2Vzc2lvbl9pZCA9IHhtYWxsb2Moa2V4LT5zZXNzaW9uX2lkX2xlbik7CisJCW1lbWNweShrZXgtPnNlc3Npb25faWQsIGhhc2gsIGtleC0+c2Vzc2lvbl9pZF9sZW4pOworCX0KKwlrZXhfZGVyaXZlX2tleXMoa2V4LCBoYXNoLCBoYXNobGVuLCBzaGFyZWRfc2VjcmV0KTsKKwlCTl9jbGVhcl9mcmVlKHNoYXJlZF9zZWNyZXQpOworCisJa2V4X2ZpbmlzaChrZXgpOworfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9rZXhnZXhzLmMgYi9vcGVuc3NoLTYuMHAxL2tleGdleHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWUzZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9rZXhnZXhzLmMKQEAgLTAsMCArMSwyMTMgQEAKKy8qICRPcGVuQlNEOiBrZXhnZXhzLmMsdiAxLjE0IDIwMTAvMTEvMTAgMDE6MzM6MDcgZGptIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwIE5pZWxzIFByb3Zvcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgImNpcGhlci5oIgorI2luY2x1ZGUgImtleC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInBhY2tldC5oIgorI2luY2x1ZGUgImRoLmgiCisjaW5jbHVkZSAic3NoMi5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorI2lmZGVmIEdTU0FQSQorI2luY2x1ZGUgInNzaC1nc3MuaCIKKyNlbmRpZgorI2luY2x1ZGUgIm1vbml0b3Jfd3JhcC5oIgorCit2b2lkCitrZXhnZXhfc2VydmVyKEtleCAqa2V4KQoreworCUJJR05VTSAqc2hhcmVkX3NlY3JldCA9IE5VTEwsICpkaF9jbGllbnRfcHViID0gTlVMTDsKKwlLZXkgKnNlcnZlcl9ob3N0X3B1YmxpYywgKnNlcnZlcl9ob3N0X3ByaXZhdGU7CisJREggKmRoOworCXVfY2hhciAqa2J1ZiwgKmhhc2gsICpzaWduYXR1cmUgPSBOVUxMLCAqc2VydmVyX2hvc3Rfa2V5X2Jsb2IgPSBOVUxMOworCXVfaW50IHNibG9ibGVuLCBrbGVuLCBzbGVuLCBoYXNobGVuOworCWludCBvbWluID0gLTEsIG1pbiA9IC0xLCBvbWF4ID0gLTEsIG1heCA9IC0xLCBvbmJpdHMgPSAtMSwgbmJpdHMgPSAtMTsKKwlpbnQgdHlwZSwga291dDsKKworCWlmIChrZXgtPmxvYWRfaG9zdF9wdWJsaWNfa2V5ID09IE5VTEwgfHwKKwkgICAga2V4LT5sb2FkX2hvc3RfcHJpdmF0ZV9rZXkgPT0gTlVMTCkKKwkJZmF0YWwoIkNhbm5vdCBsb2FkIGhvc3RrZXkiKTsKKwlzZXJ2ZXJfaG9zdF9wdWJsaWMgPSBrZXgtPmxvYWRfaG9zdF9wdWJsaWNfa2V5KGtleC0+aG9zdGtleV90eXBlKTsKKwlpZiAoc2VydmVyX2hvc3RfcHVibGljID09IE5VTEwpCisJCWZhdGFsKCJVbnN1cHBvcnRlZCBob3N0a2V5IHR5cGUgJWQiLCBrZXgtPmhvc3RrZXlfdHlwZSk7CisJc2VydmVyX2hvc3RfcHJpdmF0ZSA9IGtleC0+bG9hZF9ob3N0X3ByaXZhdGVfa2V5KGtleC0+aG9zdGtleV90eXBlKTsKKwlpZiAoc2VydmVyX2hvc3RfcHJpdmF0ZSA9PSBOVUxMKQorCQlmYXRhbCgiTWlzc2luZyBwcml2YXRlIGtleSBmb3IgaG9zdGtleSB0eXBlICVkIiwKKwkJICAgIGtleC0+aG9zdGtleV90eXBlKTsKKworCisJdHlwZSA9IHBhY2tldF9yZWFkKCk7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTU0gyX01TR19LRVhfREhfR0VYX1JFUVVFU1Q6CisJCWRlYnVnKCJTU0gyX01TR19LRVhfREhfR0VYX1JFUVVFU1QgcmVjZWl2ZWQiKTsKKwkJb21pbiA9IG1pbiA9IHBhY2tldF9nZXRfaW50KCk7CisJCW9uYml0cyA9IG5iaXRzID0gcGFja2V0X2dldF9pbnQoKTsKKwkJb21heCA9IG1heCA9IHBhY2tldF9nZXRfaW50KCk7CisJCW1pbiA9IE1BWChESF9HUlBfTUlOLCBtaW4pOworCQltYXggPSBNSU4oREhfR1JQX01BWCwgbWF4KTsKKwkJbmJpdHMgPSBNQVgoREhfR1JQX01JTiwgbmJpdHMpOworCQluYml0cyA9IE1JTihESF9HUlBfTUFYLCBuYml0cyk7CisJCWJyZWFrOworCWNhc2UgU1NIMl9NU0dfS0VYX0RIX0dFWF9SRVFVRVNUX09MRDoKKwkJZGVidWcoIlNTSDJfTVNHX0tFWF9ESF9HRVhfUkVRVUVTVF9PTEQgcmVjZWl2ZWQiKTsKKwkJb25iaXRzID0gbmJpdHMgPSBwYWNrZXRfZ2V0X2ludCgpOworCQkvKiB1bnVzZWQgZm9yIG9sZCBHRVggKi8KKwkJb21pbiA9IG1pbiA9IERIX0dSUF9NSU47CisJCW9tYXggPSBtYXggPSBESF9HUlBfTUFYOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmYXRhbCgicHJvdG9jb2wgZXJyb3IgZHVyaW5nIGtleCwgbm8gREhfR0VYX1JFUVVFU1Q6ICVkIiwgdHlwZSk7CisJfQorCXBhY2tldF9jaGVja19lb20oKTsKKworCWlmIChvbWF4IDwgb21pbiB8fCBvbmJpdHMgPCBvbWluIHx8IG9tYXggPCBvbmJpdHMpCisJCWZhdGFsKCJESF9HRVhfUkVRVUVTVCwgYmFkIHBhcmFtZXRlcnM6ICVkICE8ICVkICE8ICVkIiwKKwkJICAgIG9taW4sIG9uYml0cywgb21heCk7CisKKwkvKiBDb250YWN0IHByaXZpbGVnZWQgcGFyZW50ICovCisJZGggPSBQUklWU0VQKGNob29zZV9kaChtaW4sIG5iaXRzLCBtYXgpKTsKKwlpZiAoZGggPT0gTlVMTCkKKwkJcGFja2V0X2Rpc2Nvbm5lY3QoIlByb3RvY29sIGVycm9yOiBubyBtYXRjaGluZyBESCBncnAgZm91bmQiKTsKKworCWRlYnVnKCJTU0gyX01TR19LRVhfREhfR0VYX0dST1VQIHNlbnQiKTsKKwlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfS0VYX0RIX0dFWF9HUk9VUCk7CisJcGFja2V0X3B1dF9iaWdudW0yKGRoLT5wKTsKKwlwYWNrZXRfcHV0X2JpZ251bTIoZGgtPmcpOworCXBhY2tldF9zZW5kKCk7CisKKwkvKiBmbHVzaCAqLworCXBhY2tldF93cml0ZV93YWl0KCk7CisKKwkvKiBDb21wdXRlIG91ciBleGNoYW5nZSB2YWx1ZSBpbiBwYXJhbGxlbCB3aXRoIHRoZSBjbGllbnQgKi8KKwlkaF9nZW5fa2V5KGRoLCBrZXgtPndlX25lZWQgKiA4KTsKKworCWRlYnVnKCJleHBlY3RpbmcgU1NIMl9NU0dfS0VYX0RIX0dFWF9JTklUIik7CisJcGFja2V0X3JlYWRfZXhwZWN0KFNTSDJfTVNHX0tFWF9ESF9HRVhfSU5JVCk7CisKKwkvKiBrZXksIGNlcnQgKi8KKwlpZiAoKGRoX2NsaWVudF9wdWIgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoImRoX2NsaWVudF9wdWIgPT0gTlVMTCIpOworCXBhY2tldF9nZXRfYmlnbnVtMihkaF9jbGllbnRfcHViKTsKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisKKyNpZmRlZiBERUJVR19LRVhESAorCWZwcmludGYoc3RkZXJyLCAiZGhfY2xpZW50X3B1Yj0gIik7CisJQk5fcHJpbnRfZnAoc3RkZXJyLCBkaF9jbGllbnRfcHViKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZGVidWcoImJpdHMgJWQiLCBCTl9udW1fYml0cyhkaF9jbGllbnRfcHViKSk7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0tFWERICisJREhwYXJhbXNfcHJpbnRfZnAoc3RkZXJyLCBkaCk7CisJZnByaW50ZihzdGRlcnIsICJwdWI9ICIpOworCUJOX3ByaW50X2ZwKHN0ZGVyciwgZGgtPnB1Yl9rZXkpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyNlbmRpZgorCWlmICghZGhfcHViX2lzX3ZhbGlkKGRoLCBkaF9jbGllbnRfcHViKSkKKwkJcGFja2V0X2Rpc2Nvbm5lY3QoImJhZCBjbGllbnQgcHVibGljIERIIHZhbHVlIik7CisKKwlrbGVuID0gREhfc2l6ZShkaCk7CisJa2J1ZiA9IHhtYWxsb2Moa2xlbik7CisJaWYgKChrb3V0ID0gREhfY29tcHV0ZV9rZXkoa2J1ZiwgZGhfY2xpZW50X3B1YiwgZGgpKSA8IDApCisJCWZhdGFsKCJESF9jb21wdXRlX2tleTogZmFpbGVkIik7CisjaWZkZWYgREVCVUdfS0VYREgKKwlkdW1wX2RpZ2VzdCgic2hhcmVkIHNlY3JldCIsIGtidWYsIGtvdXQpOworI2VuZGlmCisJaWYgKChzaGFyZWRfc2VjcmV0ID0gQk5fbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCJrZXhnZXhfc2VydmVyOiBCTl9uZXcgZmFpbGVkIik7CisJaWYgKEJOX2JpbjJibihrYnVmLCBrb3V0LCBzaGFyZWRfc2VjcmV0KSA9PSBOVUxMKQorCQlmYXRhbCgia2V4Z2V4X3NlcnZlcjogQk5fYmluMmJuIGZhaWxlZCIpOworCW1lbXNldChrYnVmLCAwLCBrbGVuKTsKKwl4ZnJlZShrYnVmKTsKKworCWtleV90b19ibG9iKHNlcnZlcl9ob3N0X3B1YmxpYywgJnNlcnZlcl9ob3N0X2tleV9ibG9iLCAmc2Jsb2JsZW4pOworCisJaWYgKHR5cGUgPT0gU1NIMl9NU0dfS0VYX0RIX0dFWF9SRVFVRVNUX09MRCkKKwkJb21pbiA9IG1pbiA9IG9tYXggPSBtYXggPSAtMTsKKworCS8qIGNhbGMgSCAqLworCWtleGdleF9oYXNoKAorCSAgICBrZXgtPmV2cF9tZCwKKwkgICAga2V4LT5jbGllbnRfdmVyc2lvbl9zdHJpbmcsCisJICAgIGtleC0+c2VydmVyX3ZlcnNpb25fc3RyaW5nLAorCSAgICBidWZmZXJfcHRyKCZrZXgtPnBlZXIpLCBidWZmZXJfbGVuKCZrZXgtPnBlZXIpLAorCSAgICBidWZmZXJfcHRyKCZrZXgtPm15KSwgYnVmZmVyX2xlbigma2V4LT5teSksCisJICAgIHNlcnZlcl9ob3N0X2tleV9ibG9iLCBzYmxvYmxlbiwKKwkgICAgb21pbiwgb25iaXRzLCBvbWF4LAorCSAgICBkaC0+cCwgZGgtPmcsCisJICAgIGRoX2NsaWVudF9wdWIsCisJICAgIGRoLT5wdWJfa2V5LAorCSAgICBzaGFyZWRfc2VjcmV0LAorCSAgICAmaGFzaCwgJmhhc2hsZW4KKwkpOworCUJOX2NsZWFyX2ZyZWUoZGhfY2xpZW50X3B1Yik7CisKKwkvKiBzYXZlIHNlc3Npb24gaWQgOj0gSCAqLworCWlmIChrZXgtPnNlc3Npb25faWQgPT0gTlVMTCkgeworCQlrZXgtPnNlc3Npb25faWRfbGVuID0gaGFzaGxlbjsKKwkJa2V4LT5zZXNzaW9uX2lkID0geG1hbGxvYyhrZXgtPnNlc3Npb25faWRfbGVuKTsKKwkJbWVtY3B5KGtleC0+c2Vzc2lvbl9pZCwgaGFzaCwga2V4LT5zZXNzaW9uX2lkX2xlbik7CisJfQorCisJLyogc2lnbiBIICovCisJaWYgKFBSSVZTRVAoa2V5X3NpZ24oc2VydmVyX2hvc3RfcHJpdmF0ZSwgJnNpZ25hdHVyZSwgJnNsZW4sIGhhc2gsCisJICAgIGhhc2hsZW4pKSA8IDApCisJCWZhdGFsKCJrZXhnZXhfc2VydmVyOiBrZXlfc2lnbiBmYWlsZWQiKTsKKworCS8qIGRlc3Ryb3lfc2Vuc2l0aXZlX2RhdGEoKTsgKi8KKworCS8qIHNlbmQgc2VydmVyIGhvc3RrZXksIERIIHB1YmtleSAnZicgYW5kIHNpbmdlZCBIICovCisJZGVidWcoIlNTSDJfTVNHX0tFWF9ESF9HRVhfUkVQTFkgc2VudCIpOworCXBhY2tldF9zdGFydChTU0gyX01TR19LRVhfREhfR0VYX1JFUExZKTsKKwlwYWNrZXRfcHV0X3N0cmluZyhzZXJ2ZXJfaG9zdF9rZXlfYmxvYiwgc2Jsb2JsZW4pOworCXBhY2tldF9wdXRfYmlnbnVtMihkaC0+cHViX2tleSk7CS8qIGYgKi8KKwlwYWNrZXRfcHV0X3N0cmluZyhzaWduYXR1cmUsIHNsZW4pOworCXBhY2tldF9zZW5kKCk7CisKKwl4ZnJlZShzaWduYXR1cmUpOworCXhmcmVlKHNlcnZlcl9ob3N0X2tleV9ibG9iKTsKKwkvKiBoYXZlIGtleXMsIGZyZWUgREggKi8KKwlESF9mcmVlKGRoKTsKKworCWtleF9kZXJpdmVfa2V5cyhrZXgsIGhhc2gsIGhhc2hsZW4sIHNoYXJlZF9zZWNyZXQpOworCUJOX2NsZWFyX2ZyZWUoc2hhcmVkX3NlY3JldCk7CisKKwlrZXhfZmluaXNoKGtleCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2tleS5jIGIvb3BlbnNzaC02LjBwMS9rZXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2M0MTMyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9rZXkuYwpAQCAtMCwwICsxLDIyNjggQEAKKy8qICRPcGVuQlNEOiBrZXkuYyx2IDEuOTggMjAxMS8xMC8xOCAwNDo1ODoyNiBkam0gRXhwICQgKi8KKy8qCisgKiByZWFkX2JpZ251bSgpOgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggQWxleGFuZGVyIHZvbiBHZXJubGVyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQuaD4KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAia2V5LmgiCisjaW5jbHVkZSAicnNhLmgiCisjaW5jbHVkZSAidXVlbmNvZGUuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAic3NoMi5oIgorCitzdGF0aWMgc3RydWN0IEtleUNlcnQgKgorY2VydF9uZXcodm9pZCkKK3sKKwlzdHJ1Y3QgS2V5Q2VydCAqY2VydDsKKworCWNlcnQgPSB4Y2FsbG9jKDEsIHNpemVvZigqY2VydCkpOworCWJ1ZmZlcl9pbml0KCZjZXJ0LT5jZXJ0YmxvYik7CisJYnVmZmVyX2luaXQoJmNlcnQtPmNyaXRpY2FsKTsKKwlidWZmZXJfaW5pdCgmY2VydC0+ZXh0ZW5zaW9ucyk7CisJY2VydC0+a2V5X2lkID0gTlVMTDsKKwljZXJ0LT5wcmluY2lwYWxzID0gTlVMTDsKKwljZXJ0LT5zaWduYXR1cmVfa2V5ID0gTlVMTDsKKwlyZXR1cm4gY2VydDsKK30KKworS2V5ICoKK2tleV9uZXcoaW50IHR5cGUpCit7CisJS2V5ICprOworCVJTQSAqcnNhOworCURTQSAqZHNhOworCWsgPSB4Y2FsbG9jKDEsIHNpemVvZigqaykpOworCWstPnR5cGUgPSB0eXBlOworCWstPmVjZHNhID0gTlVMTDsKKwlrLT5lY2RzYV9uaWQgPSAtMTsKKwlrLT5kc2EgPSBOVUxMOworCWstPnJzYSA9IE5VTEw7CisJay0+Y2VydCA9IE5VTEw7CisJc3dpdGNoIChrLT50eXBlKSB7CisJY2FzZSBLRVlfUlNBMToKKwljYXNlIEtFWV9SU0E6CisJY2FzZSBLRVlfUlNBX0NFUlRfVjAwOgorCWNhc2UgS0VZX1JTQV9DRVJUOgorCQlpZiAoKHJzYSA9IFJTQV9uZXcoKSkgPT0gTlVMTCkKKwkJCWZhdGFsKCJrZXlfbmV3OiBSU0FfbmV3IGZhaWxlZCIpOworCQlpZiAoKHJzYS0+biA9IEJOX25ldygpKSA9PSBOVUxMKQorCQkJZmF0YWwoImtleV9uZXc6IEJOX25ldyBmYWlsZWQiKTsKKwkJaWYgKChyc2EtPmUgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJCWZhdGFsKCJrZXlfbmV3OiBCTl9uZXcgZmFpbGVkIik7CisJCWstPnJzYSA9IHJzYTsKKwkJYnJlYWs7CisJY2FzZSBLRVlfRFNBOgorCWNhc2UgS0VZX0RTQV9DRVJUX1YwMDoKKwljYXNlIEtFWV9EU0FfQ0VSVDoKKwkJaWYgKChkc2EgPSBEU0FfbmV3KCkpID09IE5VTEwpCisJCQlmYXRhbCgia2V5X25ldzogRFNBX25ldyBmYWlsZWQiKTsKKwkJaWYgKChkc2EtPnAgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJCWZhdGFsKCJrZXlfbmV3OiBCTl9uZXcgZmFpbGVkIik7CisJCWlmICgoZHNhLT5xID0gQk5fbmV3KCkpID09IE5VTEwpCisJCQlmYXRhbCgia2V5X25ldzogQk5fbmV3IGZhaWxlZCIpOworCQlpZiAoKGRzYS0+ZyA9IEJOX25ldygpKSA9PSBOVUxMKQorCQkJZmF0YWwoImtleV9uZXc6IEJOX25ldyBmYWlsZWQiKTsKKwkJaWYgKChkc2EtPnB1Yl9rZXkgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJCWZhdGFsKCJrZXlfbmV3OiBCTl9uZXcgZmFpbGVkIik7CisJCWstPmRzYSA9IGRzYTsKKwkJYnJlYWs7CisjaWZkZWYgT1BFTlNTTF9IQVNfRUNDCisJY2FzZSBLRVlfRUNEU0E6CisJY2FzZSBLRVlfRUNEU0FfQ0VSVDoKKwkJLyogQ2Fubm90IGRvIGFueXRoaW5nIHVudGlsIHdlIGtub3cgdGhlIGdyb3VwICovCisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBLRVlfVU5TUEVDOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlmYXRhbCgia2V5X25ldzogYmFkIGtleSB0eXBlICVkIiwgay0+dHlwZSk7CisJCWJyZWFrOworCX0KKworCWlmIChrZXlfaXNfY2VydChrKSkKKwkJay0+Y2VydCA9IGNlcnRfbmV3KCk7CisKKwlyZXR1cm4gazsKK30KKwordm9pZAora2V5X2FkZF9wcml2YXRlKEtleSAqaykKK3sKKwlzd2l0Y2ggKGstPnR5cGUpIHsKKwljYXNlIEtFWV9SU0ExOgorCWNhc2UgS0VZX1JTQToKKwljYXNlIEtFWV9SU0FfQ0VSVF9WMDA6CisJY2FzZSBLRVlfUlNBX0NFUlQ6CisJCWlmICgoay0+cnNhLT5kID0gQk5fbmV3KCkpID09IE5VTEwpCisJCQlmYXRhbCgia2V5X25ld19wcml2YXRlOiBCTl9uZXcgZmFpbGVkIik7CisJCWlmICgoay0+cnNhLT5pcW1wID0gQk5fbmV3KCkpID09IE5VTEwpCisJCQlmYXRhbCgia2V5X25ld19wcml2YXRlOiBCTl9uZXcgZmFpbGVkIik7CisJCWlmICgoay0+cnNhLT5xID0gQk5fbmV3KCkpID09IE5VTEwpCisJCQlmYXRhbCgia2V5X25ld19wcml2YXRlOiBCTl9uZXcgZmFpbGVkIik7CisJCWlmICgoay0+cnNhLT5wID0gQk5fbmV3KCkpID09IE5VTEwpCisJCQlmYXRhbCgia2V5X25ld19wcml2YXRlOiBCTl9uZXcgZmFpbGVkIik7CisJCWlmICgoay0+cnNhLT5kbXExID0gQk5fbmV3KCkpID09IE5VTEwpCisJCQlmYXRhbCgia2V5X25ld19wcml2YXRlOiBCTl9uZXcgZmFpbGVkIik7CisJCWlmICgoay0+cnNhLT5kbXAxID0gQk5fbmV3KCkpID09IE5VTEwpCisJCQlmYXRhbCgia2V5X25ld19wcml2YXRlOiBCTl9uZXcgZmFpbGVkIik7CisJCWJyZWFrOworCWNhc2UgS0VZX0RTQToKKwljYXNlIEtFWV9EU0FfQ0VSVF9WMDA6CisJY2FzZSBLRVlfRFNBX0NFUlQ6CisJCWlmICgoay0+ZHNhLT5wcml2X2tleSA9IEJOX25ldygpKSA9PSBOVUxMKQorCQkJZmF0YWwoImtleV9uZXdfcHJpdmF0ZTogQk5fbmV3IGZhaWxlZCIpOworCQlicmVhazsKKwljYXNlIEtFWV9FQ0RTQToKKwljYXNlIEtFWV9FQ0RTQV9DRVJUOgorCQkvKiBDYW5ub3QgZG8gYW55dGhpbmcgdW50aWwgd2Uga25vdyB0aGUgZ3JvdXAgKi8KKwkJYnJlYWs7CisJY2FzZSBLRVlfVU5TUEVDOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK0tleSAqCitrZXlfbmV3X3ByaXZhdGUoaW50IHR5cGUpCit7CisJS2V5ICprID0ga2V5X25ldyh0eXBlKTsKKworCWtleV9hZGRfcHJpdmF0ZShrKTsKKwlyZXR1cm4gazsKK30KKworc3RhdGljIHZvaWQKK2NlcnRfZnJlZShzdHJ1Y3QgS2V5Q2VydCAqY2VydCkKK3sKKwl1X2ludCBpOworCisJYnVmZmVyX2ZyZWUoJmNlcnQtPmNlcnRibG9iKTsKKwlidWZmZXJfZnJlZSgmY2VydC0+Y3JpdGljYWwpOworCWJ1ZmZlcl9mcmVlKCZjZXJ0LT5leHRlbnNpb25zKTsKKwlpZiAoY2VydC0+a2V5X2lkICE9IE5VTEwpCisJCXhmcmVlKGNlcnQtPmtleV9pZCk7CisJZm9yIChpID0gMDsgaSA8IGNlcnQtPm5wcmluY2lwYWxzOyBpKyspCisJCXhmcmVlKGNlcnQtPnByaW5jaXBhbHNbaV0pOworCWlmIChjZXJ0LT5wcmluY2lwYWxzICE9IE5VTEwpCisJCXhmcmVlKGNlcnQtPnByaW5jaXBhbHMpOworCWlmIChjZXJ0LT5zaWduYXR1cmVfa2V5ICE9IE5VTEwpCisJCWtleV9mcmVlKGNlcnQtPnNpZ25hdHVyZV9rZXkpOworfQorCit2b2lkCitrZXlfZnJlZShLZXkgKmspCit7CisJaWYgKGsgPT0gTlVMTCkKKwkJZmF0YWwoImtleV9mcmVlOiBrZXkgaXMgTlVMTCIpOworCXN3aXRjaCAoay0+dHlwZSkgeworCWNhc2UgS0VZX1JTQTE6CisJY2FzZSBLRVlfUlNBOgorCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKKwljYXNlIEtFWV9SU0FfQ0VSVDoKKwkJaWYgKGstPnJzYSAhPSBOVUxMKQorCQkJUlNBX2ZyZWUoay0+cnNhKTsKKwkJay0+cnNhID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSBLRVlfRFNBOgorCWNhc2UgS0VZX0RTQV9DRVJUX1YwMDoKKwljYXNlIEtFWV9EU0FfQ0VSVDoKKwkJaWYgKGstPmRzYSAhPSBOVUxMKQorCQkJRFNBX2ZyZWUoay0+ZHNhKTsKKwkJay0+ZHNhID0gTlVMTDsKKwkJYnJlYWs7CisjaWZkZWYgT1BFTlNTTF9IQVNfRUNDCisJY2FzZSBLRVlfRUNEU0E6CisJY2FzZSBLRVlfRUNEU0FfQ0VSVDoKKwkJaWYgKGstPmVjZHNhICE9IE5VTEwpCisJCQlFQ19LRVlfZnJlZShrLT5lY2RzYSk7CisJCWstPmVjZHNhID0gTlVMTDsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIEtFWV9VTlNQRUM6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZhdGFsKCJrZXlfZnJlZTogYmFkIGtleSB0eXBlICVkIiwgay0+dHlwZSk7CisJCWJyZWFrOworCX0KKwlpZiAoa2V5X2lzX2NlcnQoaykpIHsKKwkJaWYgKGstPmNlcnQgIT0gTlVMTCkKKwkJCWNlcnRfZnJlZShrLT5jZXJ0KTsKKwkJay0+Y2VydCA9IE5VTEw7CisJfQorCisJeGZyZWUoayk7Cit9CisKK3N0YXRpYyBpbnQKK2NlcnRfY29tcGFyZShzdHJ1Y3QgS2V5Q2VydCAqYSwgc3RydWN0IEtleUNlcnQgKmIpCit7CisJaWYgKGEgPT0gTlVMTCAmJiBiID09IE5VTEwpCisJCXJldHVybiAxOworCWlmIChhID09IE5VTEwgfHwgYiA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlpZiAoYnVmZmVyX2xlbigmYS0+Y2VydGJsb2IpICE9IGJ1ZmZlcl9sZW4oJmItPmNlcnRibG9iKSkKKwkJcmV0dXJuIDA7CisJaWYgKHRpbWluZ3NhZmVfYmNtcChidWZmZXJfcHRyKCZhLT5jZXJ0YmxvYiksIGJ1ZmZlcl9wdHIoJmItPmNlcnRibG9iKSwKKwkgICAgYnVmZmVyX2xlbigmYS0+Y2VydGJsb2IpKSAhPSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIENvbXBhcmUgcHVibGljIHBvcnRpb25zIG9mIGtleSBvbmx5LCBhbGxvd2luZyBjb21wYXJpc29ucyBiZXR3ZWVuCisgKiBjZXJ0aWZpY2F0ZXMgYW5kIHBsYWluIGtleXMgdG9vLgorICovCitpbnQKK2tleV9lcXVhbF9wdWJsaWMoY29uc3QgS2V5ICphLCBjb25zdCBLZXkgKmIpCit7CisjaWZkZWYgT1BFTlNTTF9IQVNfRUNDCisJQk5fQ1RYICpibmN0eDsKKyNlbmRpZgorCisJaWYgKGEgPT0gTlVMTCB8fCBiID09IE5VTEwgfHwKKwkgICAga2V5X3R5cGVfcGxhaW4oYS0+dHlwZSkgIT0ga2V5X3R5cGVfcGxhaW4oYi0+dHlwZSkpCisJCXJldHVybiAwOworCisJc3dpdGNoIChhLT50eXBlKSB7CisJY2FzZSBLRVlfUlNBMToKKwljYXNlIEtFWV9SU0FfQ0VSVF9WMDA6CisJY2FzZSBLRVlfUlNBX0NFUlQ6CisJY2FzZSBLRVlfUlNBOgorCQlyZXR1cm4gYS0+cnNhICE9IE5VTEwgJiYgYi0+cnNhICE9IE5VTEwgJiYKKwkJICAgIEJOX2NtcChhLT5yc2EtPmUsIGItPnJzYS0+ZSkgPT0gMCAmJgorCQkgICAgQk5fY21wKGEtPnJzYS0+biwgYi0+cnNhLT5uKSA9PSAwOworCWNhc2UgS0VZX0RTQV9DRVJUX1YwMDoKKwljYXNlIEtFWV9EU0FfQ0VSVDoKKwljYXNlIEtFWV9EU0E6CisJCXJldHVybiBhLT5kc2EgIT0gTlVMTCAmJiBiLT5kc2EgIT0gTlVMTCAmJgorCQkgICAgQk5fY21wKGEtPmRzYS0+cCwgYi0+ZHNhLT5wKSA9PSAwICYmCisJCSAgICBCTl9jbXAoYS0+ZHNhLT5xLCBiLT5kc2EtPnEpID09IDAgJiYKKwkJICAgIEJOX2NtcChhLT5kc2EtPmcsIGItPmRzYS0+ZykgPT0gMCAmJgorCQkgICAgQk5fY21wKGEtPmRzYS0+cHViX2tleSwgYi0+ZHNhLT5wdWJfa2V5KSA9PSAwOworI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworCWNhc2UgS0VZX0VDRFNBX0NFUlQ6CisJY2FzZSBLRVlfRUNEU0E6CisJCWlmIChhLT5lY2RzYSA9PSBOVUxMIHx8IGItPmVjZHNhID09IE5VTEwgfHwKKwkJICAgIEVDX0tFWV9nZXQwX3B1YmxpY19rZXkoYS0+ZWNkc2EpID09IE5VTEwgfHwKKwkJICAgIEVDX0tFWV9nZXQwX3B1YmxpY19rZXkoYi0+ZWNkc2EpID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwkJaWYgKChibmN0eCA9IEJOX0NUWF9uZXcoKSkgPT0gTlVMTCkKKwkJCWZhdGFsKCIlczogQk5fQ1RYX25ldyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCWlmIChFQ19HUk9VUF9jbXAoRUNfS0VZX2dldDBfZ3JvdXAoYS0+ZWNkc2EpLAorCQkgICAgRUNfS0VZX2dldDBfZ3JvdXAoYi0+ZWNkc2EpLCBibmN0eCkgIT0gMCB8fAorCQkgICAgRUNfUE9JTlRfY21wKEVDX0tFWV9nZXQwX2dyb3VwKGEtPmVjZHNhKSwKKwkJICAgIEVDX0tFWV9nZXQwX3B1YmxpY19rZXkoYS0+ZWNkc2EpLAorCQkgICAgRUNfS0VZX2dldDBfcHVibGljX2tleShiLT5lY2RzYSksIGJuY3R4KSAhPSAwKSB7CisJCQlCTl9DVFhfZnJlZShibmN0eCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlCTl9DVFhfZnJlZShibmN0eCk7CisJCXJldHVybiAxOworI2VuZGlmIC8qIE9QRU5TU0xfSEFTX0VDQyAqLworCWRlZmF1bHQ6CisJCWZhdGFsKCJrZXlfZXF1YWw6IGJhZCBrZXkgdHlwZSAlZCIsIGEtPnR5cGUpOworCX0KKwkvKiBOT1RSRUFDSEVEICovCit9CisKK2ludAora2V5X2VxdWFsKGNvbnN0IEtleSAqYSwgY29uc3QgS2V5ICpiKQoreworCWlmIChhID09IE5VTEwgfHwgYiA9PSBOVUxMIHx8IGEtPnR5cGUgIT0gYi0+dHlwZSkKKwkJcmV0dXJuIDA7CisJaWYgKGtleV9pc19jZXJ0KGEpKSB7CisJCWlmICghY2VydF9jb21wYXJlKGEtPmNlcnQsIGItPmNlcnQpKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiBrZXlfZXF1YWxfcHVibGljKGEsIGIpOworfQorCit1X2NoYXIqCitrZXlfZmluZ2VycHJpbnRfcmF3KEtleSAqaywgZW51bSBmcF90eXBlIGRnc3RfdHlwZSwgdV9pbnQgKmRnc3RfcmF3X2xlbmd0aCkKK3sKKwljb25zdCBFVlBfTUQgKm1kID0gTlVMTDsKKwlFVlBfTURfQ1RYIGN0eDsKKwl1X2NoYXIgKmJsb2IgPSBOVUxMOworCXVfY2hhciAqcmV0dmFsID0gTlVMTDsKKwl1X2ludCBsZW4gPSAwOworCWludCBubGVuLCBlbGVuLCBvdHlwZTsKKworCSpkZ3N0X3Jhd19sZW5ndGggPSAwOworCisJc3dpdGNoIChkZ3N0X3R5cGUpIHsKKwljYXNlIFNTSF9GUF9NRDU6CisJCW1kID0gRVZQX21kNSgpOworCQlicmVhazsKKwljYXNlIFNTSF9GUF9TSEExOgorCQltZCA9IEVWUF9zaGExKCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZhdGFsKCJrZXlfZmluZ2VycHJpbnRfcmF3OiBiYWQgZGlnZXN0IHR5cGUgJWQiLAorCQkgICAgZGdzdF90eXBlKTsKKwl9CisJc3dpdGNoIChrLT50eXBlKSB7CisJY2FzZSBLRVlfUlNBMToKKwkJbmxlbiA9IEJOX251bV9ieXRlcyhrLT5yc2EtPm4pOworCQllbGVuID0gQk5fbnVtX2J5dGVzKGstPnJzYS0+ZSk7CisJCWxlbiA9IG5sZW4gKyBlbGVuOworCQlibG9iID0geG1hbGxvYyhsZW4pOworCQlCTl9ibjJiaW4oay0+cnNhLT5uLCBibG9iKTsKKwkJQk5fYm4yYmluKGstPnJzYS0+ZSwgYmxvYiArIG5sZW4pOworCQlicmVhazsKKwljYXNlIEtFWV9EU0E6CisJY2FzZSBLRVlfRUNEU0E6CisJY2FzZSBLRVlfUlNBOgorCQlrZXlfdG9fYmxvYihrLCAmYmxvYiwgJmxlbik7CisJCWJyZWFrOworCWNhc2UgS0VZX0RTQV9DRVJUX1YwMDoKKwljYXNlIEtFWV9SU0FfQ0VSVF9WMDA6CisJY2FzZSBLRVlfRFNBX0NFUlQ6CisJY2FzZSBLRVlfRUNEU0FfQ0VSVDoKKwljYXNlIEtFWV9SU0FfQ0VSVDoKKwkJLyogV2Ugd2FudCBhIGZpbmdlcnByaW50IG9mIHRoZSBfa2V5XyBub3Qgb2YgdGhlIGNlcnQgKi8KKwkJb3R5cGUgPSBrLT50eXBlOworCQlrLT50eXBlID0ga2V5X3R5cGVfcGxhaW4oay0+dHlwZSk7CisJCWtleV90b19ibG9iKGssICZibG9iLCAmbGVuKTsKKwkJay0+dHlwZSA9IG90eXBlOworCQlicmVhazsKKwljYXNlIEtFWV9VTlNQRUM6CisJCXJldHVybiByZXR2YWw7CisJZGVmYXVsdDoKKwkJZmF0YWwoImtleV9maW5nZXJwcmludF9yYXc6IGJhZCBrZXkgdHlwZSAlZCIsIGstPnR5cGUpOworCQlicmVhazsKKwl9CisJaWYgKGJsb2IgIT0gTlVMTCkgeworCQlyZXR2YWwgPSB4bWFsbG9jKEVWUF9NQVhfTURfU0laRSk7CisJCUVWUF9EaWdlc3RJbml0KCZjdHgsIG1kKTsKKwkJRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LCBibG9iLCBsZW4pOworCQlFVlBfRGlnZXN0RmluYWwoJmN0eCwgcmV0dmFsLCBkZ3N0X3Jhd19sZW5ndGgpOworCQltZW1zZXQoYmxvYiwgMCwgbGVuKTsKKwkJeGZyZWUoYmxvYik7CisJfSBlbHNlIHsKKwkJZmF0YWwoImtleV9maW5nZXJwcmludF9yYXc6IGJsb2IgaXMgbnVsbCIpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgY2hhciAqCitrZXlfZmluZ2VycHJpbnRfaGV4KHVfY2hhciAqZGdzdF9yYXcsIHVfaW50IGRnc3RfcmF3X2xlbikKK3sKKwljaGFyICpyZXR2YWw7CisJdV9pbnQgaTsKKworCXJldHZhbCA9IHhjYWxsb2MoMSwgZGdzdF9yYXdfbGVuICogMyArIDEpOworCWZvciAoaSA9IDA7IGkgPCBkZ3N0X3Jhd19sZW47IGkrKykgeworCQljaGFyIGhleFs0XTsKKwkJc25wcmludGYoaGV4LCBzaXplb2YoaGV4KSwgIiUwMng6IiwgZGdzdF9yYXdbaV0pOworCQlzdHJsY2F0KHJldHZhbCwgaGV4LCBkZ3N0X3Jhd19sZW4gKiAzICsgMSk7CisJfQorCisJLyogUmVtb3ZlIHRoZSB0cmFpbGluZyAnOicgY2hhcmFjdGVyICovCisJcmV0dmFsWyhkZ3N0X3Jhd19sZW4gKiAzKSAtIDFdID0gJ1wwJzsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgY2hhciAqCitrZXlfZmluZ2VycHJpbnRfYnViYmxlYmFiYmxlKHVfY2hhciAqZGdzdF9yYXcsIHVfaW50IGRnc3RfcmF3X2xlbikKK3sKKwljaGFyIHZvd2Vsc1tdID0geyAnYScsICdlJywgJ2knLCAnbycsICd1JywgJ3knIH07CisJY2hhciBjb25zb25hbnRzW10gPSB7ICdiJywgJ2MnLCAnZCcsICdmJywgJ2cnLCAnaCcsICdrJywgJ2wnLCAnbScsCisJICAgICduJywgJ3AnLCAncicsICdzJywgJ3QnLCAndicsICd6JywgJ3gnIH07CisJdV9pbnQgaSwgaiA9IDAsIHJvdW5kcywgc2VlZCA9IDE7CisJY2hhciAqcmV0dmFsOworCisJcm91bmRzID0gKGRnc3RfcmF3X2xlbiAvIDIpICsgMTsKKwlyZXR2YWwgPSB4Y2FsbG9jKChyb3VuZHMgKiA2KSwgc2l6ZW9mKGNoYXIpKTsKKwlyZXR2YWxbaisrXSA9ICd4JzsKKwlmb3IgKGkgPSAwOyBpIDwgcm91bmRzOyBpKyspIHsKKwkJdV9pbnQgaWR4MCwgaWR4MSwgaWR4MiwgaWR4MywgaWR4NDsKKwkJaWYgKChpICsgMSA8IHJvdW5kcykgfHwgKGRnc3RfcmF3X2xlbiAlIDIgIT0gMCkpIHsKKwkJCWlkeDAgPSAoKCgoKHVfaW50KShkZ3N0X3Jhd1syICogaV0pKSA+PiA2KSAmIDMpICsKKwkJCSAgICBzZWVkKSAlIDY7CisJCQlpZHgxID0gKCgodV9pbnQpKGRnc3RfcmF3WzIgKiBpXSkpID4+IDIpICYgMTU7CisJCQlpZHgyID0gKCgoKHVfaW50KShkZ3N0X3Jhd1syICogaV0pKSAmIDMpICsKKwkJCSAgICAoc2VlZCAvIDYpKSAlIDY7CisJCQlyZXR2YWxbaisrXSA9IHZvd2Vsc1tpZHgwXTsKKwkJCXJldHZhbFtqKytdID0gY29uc29uYW50c1tpZHgxXTsKKwkJCXJldHZhbFtqKytdID0gdm93ZWxzW2lkeDJdOworCQkJaWYgKChpICsgMSkgPCByb3VuZHMpIHsKKwkJCQlpZHgzID0gKCgodV9pbnQpKGRnc3RfcmF3WygyICogaSkgKyAxXSkpID4+IDQpICYgMTU7CisJCQkJaWR4NCA9ICgoKHVfaW50KShkZ3N0X3Jhd1soMiAqIGkpICsgMV0pKSkgJiAxNTsKKwkJCQlyZXR2YWxbaisrXSA9IGNvbnNvbmFudHNbaWR4M107CisJCQkJcmV0dmFsW2orK10gPSAnLSc7CisJCQkJcmV0dmFsW2orK10gPSBjb25zb25hbnRzW2lkeDRdOworCQkJCXNlZWQgPSAoKHNlZWQgKiA1KSArCisJCQkJICAgICgoKCh1X2ludCkoZGdzdF9yYXdbMiAqIGldKSkgKiA3KSArCisJCQkJICAgICgodV9pbnQpKGRnc3RfcmF3WygyICogaSkgKyAxXSkpKSkgJSAzNjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlkeDAgPSBzZWVkICUgNjsKKwkJCWlkeDEgPSAxNjsKKwkJCWlkeDIgPSBzZWVkIC8gNjsKKwkJCXJldHZhbFtqKytdID0gdm93ZWxzW2lkeDBdOworCQkJcmV0dmFsW2orK10gPSBjb25zb25hbnRzW2lkeDFdOworCQkJcmV0dmFsW2orK10gPSB2b3dlbHNbaWR4Ml07CisJCX0KKwl9CisJcmV0dmFsW2orK10gPSAneCc7CisJcmV0dmFsW2orK10gPSAnXDAnOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBEcmF3IGFuIEFTQ0lJLUFydCByZXByZXNlbnRpbmcgdGhlIGZpbmdlcnByaW50IHNvIGh1bWFuIGJyYWluIGNhbgorICogcHJvZml0IGZyb20gaXRzIGJ1aWx0LWluIHBhdHRlcm4gcmVjb2duaXRpb24gYWJpbGl0eS4KKyAqIFRoaXMgdGVjaG5pcXVlIGlzIGNhbGxlZCAicmFuZG9tIGFydCIgYW5kIGNhbiBiZSBmb3VuZCBpbiBzb21lCisgKiBzY2llbnRpZmljIHB1YmxpY2F0aW9ucyBsaWtlIHRoaXMgb3JpZ2luYWwgcGFwZXI6CisgKgorICogIkhhc2ggVmlzdWFsaXphdGlvbjogYSBOZXcgVGVjaG5pcXVlIHRvIGltcHJvdmUgUmVhbC1Xb3JsZCBTZWN1cml0eSIsCisgKiBQZXJyaWcgQS4gYW5kIFNvbmcgRC4sIDE5OTksIEludGVybmF0aW9uYWwgV29ya3Nob3Agb24gQ3J5cHRvZ3JhcGhpYworICogVGVjaG5pcXVlcyBhbmQgRS1Db21tZXJjZSAoQ3J5cFRFQyAnOTkpCisgKiBzcGFycm93LmVjZS5jbXUuZWR1L35hZHJpYW4vcHJvamVjdHMvdmFsaWRhdGlvbi92YWxpZGF0aW9uLnBkZgorICoKKyAqIFRoZSBzdWJqZWN0IGNhbWUgdXAgaW4gYSB0YWxrIGJ5IERhbiBLYW1pbnNreSwgdG9vLgorICoKKyAqIElmIHlvdSBzZWUgdGhlIHBpY3R1cmUgaXMgZGlmZmVyZW50LCB0aGUga2V5IGlzIGRpZmZlcmVudC4KKyAqIElmIHRoZSBwaWN0dXJlIGxvb2tzIHRoZSBzYW1lLCB5b3Ugc3RpbGwga25vdyBub3RoaW5nLgorICoKKyAqIFRoZSBhbGdvcml0aG0gdXNlZCBoZXJlIGlzIGEgd29ybSBjcmF3bGluZyBvdmVyIGEgZGlzY3JldGUgcGxhbmUsCisgKiBsZWF2aW5nIGEgdHJhY2UgKGF1Z21lbnRpbmcgdGhlIGZpZWxkKSBldmVyeXdoZXJlIGl0IGdvZXMuCisgKiBNb3ZlbWVudCBpcyB0YWtlbiBmcm9tIGRnc3RfcmF3IDJiaXQtd2lzZS4gIEJ1bXBpbmcgaW50byB3YWxscworICogbWFrZXMgdGhlIHJlc3BlY3RpdmUgbW92ZW1lbnQgdmVjdG9yIGJlIGlnbm9yZWQgZm9yIHRoaXMgdHVybi4KKyAqIEdyYXBocyBhcmUgbm90IHVuYW1iaWd1b3VzLCBiZWNhdXNlIGNpcmNsZXMgaW4gZ3JhcGhzIGNhbiBiZQorICogd2Fsa2VkIGluIGVpdGhlciBkaXJlY3Rpb24uCisgKi8KKworLyoKKyAqIEZpZWxkIHNpemVzIGZvciB0aGUgcmFuZG9tIGFydC4gIEhhdmUgdG8gYmUgb2RkLCBzbyB0aGUgc3RhcnRpbmcgcG9pbnQKKyAqIGNhbiBiZSBpbiB0aGUgZXhhY3QgbWlkZGxlIG9mIHRoZSBwaWN0dXJlLCBhbmQgRkxEQkFTRSBzaG91bGQgYmUgPj04IC4KKyAqIEVsc2UgcGljdHVyZXMgd291bGQgYmUgdG9vIGRlbnNlLCBhbmQgZHJhd2luZyB0aGUgZnJhbWUgd291bGQKKyAqIGZhaWwsIHRvbywgYmVjYXVzZSB0aGUga2V5IHR5cGUgd291bGQgbm90IGZpdCBpbiBhbnltb3JlLgorICovCisjZGVmaW5lCUZMREJBU0UJCTgKKyNkZWZpbmUJRkxEU0laRV9ZCShGTERCQVNFICsgMSkKKyNkZWZpbmUJRkxEU0laRV9YCShGTERCQVNFICogMiArIDEpCitzdGF0aWMgY2hhciAqCitrZXlfZmluZ2VycHJpbnRfcmFuZG9tYXJ0KHVfY2hhciAqZGdzdF9yYXcsIHVfaW50IGRnc3RfcmF3X2xlbiwgY29uc3QgS2V5ICprKQoreworCS8qCisJICogQ2hhcnMgdG8gYmUgdXNlZCBhZnRlciBlYWNoIG90aGVyIGV2ZXJ5IHRpbWUgdGhlIHdvcm0KKwkgKiBpbnRlcnNlY3RzIHdpdGggaXRzZWxmLiAgTWF0dGVyIG9mIHRhc3RlLgorCSAqLworCWNoYXIJKmF1Z21lbnRhdGlvbl9zdHJpbmcgPSAiIC5vKz0qQk9YQCUmIy9eU0UiOworCWNoYXIJKnJldHZhbCwgKnA7CisJdV9jaGFyCSBmaWVsZFtGTERTSVpFX1hdW0ZMRFNJWkVfWV07CisJdV9pbnQJIGksIGI7CisJaW50CSB4LCB5OworCXNpemVfdAkgbGVuID0gc3RybGVuKGF1Z21lbnRhdGlvbl9zdHJpbmcpIC0gMTsKKworCXJldHZhbCA9IHhjYWxsb2MoMSwgKEZMRFNJWkVfWCArIDMpICogKEZMRFNJWkVfWSArIDIpKTsKKworCS8qIGluaXRpYWxpemUgZmllbGQgKi8KKwltZW1zZXQoZmllbGQsIDAsIEZMRFNJWkVfWCAqIEZMRFNJWkVfWSAqIHNpemVvZihjaGFyKSk7CisJeCA9IEZMRFNJWkVfWCAvIDI7CisJeSA9IEZMRFNJWkVfWSAvIDI7CisKKwkvKiBwcm9jZXNzIHJhdyBrZXkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGdzdF9yYXdfbGVuOyBpKyspIHsKKwkJaW50IGlucHV0OworCQkvKiBlYWNoIGJ5dGUgY29udmV5cyBmb3VyIDItYml0IG1vdmUgY29tbWFuZHMgKi8KKwkJaW5wdXQgPSBkZ3N0X3Jhd1tpXTsKKwkJZm9yIChiID0gMDsgYiA8IDQ7IGIrKykgeworCQkJLyogZXZhbHVhdGUgMiBiaXQsIHJlc3QgaXMgc2hpZnRlZCBsYXRlciAqLworCQkJeCArPSAoaW5wdXQgJiAweDEpID8gMSA6IC0xOworCQkJeSArPSAoaW5wdXQgJiAweDIpID8gMSA6IC0xOworCisJCQkvKiBhc3N1cmUgd2UgYXJlIHN0aWxsIGluIGJvdW5kcyAqLworCQkJeCA9IE1BWCh4LCAwKTsKKwkJCXkgPSBNQVgoeSwgMCk7CisJCQl4ID0gTUlOKHgsIEZMRFNJWkVfWCAtIDEpOworCQkJeSA9IE1JTih5LCBGTERTSVpFX1kgLSAxKTsKKworCQkJLyogYXVnbWVudCB0aGUgZmllbGQgKi8KKwkJCWlmIChmaWVsZFt4XVt5XSA8IGxlbiAtIDIpCisJCQkJZmllbGRbeF1beV0rKzsKKwkJCWlucHV0ID0gaW5wdXQgPj4gMjsKKwkJfQorCX0KKworCS8qIG1hcmsgc3RhcnRpbmcgcG9pbnQgYW5kIGVuZCBwb2ludCovCisJZmllbGRbRkxEU0laRV9YIC8gMl1bRkxEU0laRV9ZIC8gMl0gPSBsZW4gLSAxOworCWZpZWxkW3hdW3ldID0gbGVuOworCisJLyogZmlsbCBpbiByZXR2YWwgKi8KKwlzbnByaW50ZihyZXR2YWwsIEZMRFNJWkVfWCwgIistLVslNHMgJTR1XSIsIGtleV90eXBlKGspLCBrZXlfc2l6ZShrKSk7CisJcCA9IHN0cmNocihyZXR2YWwsICdcMCcpOworCisJLyogb3V0cHV0IHVwcGVyIGJvcmRlciAqLworCWZvciAoaSA9IHAgLSByZXR2YWwgLSAxOyBpIDwgRkxEU0laRV9YOyBpKyspCisJCSpwKysgPSAnLSc7CisJKnArKyA9ICcrJzsKKwkqcCsrID0gJ1xuJzsKKworCS8qIG91dHB1dCBjb250ZW50ICovCisJZm9yICh5ID0gMDsgeSA8IEZMRFNJWkVfWTsgeSsrKSB7CisJCSpwKysgPSAnfCc7CisJCWZvciAoeCA9IDA7IHggPCBGTERTSVpFX1g7IHgrKykKKwkJCSpwKysgPSBhdWdtZW50YXRpb25fc3RyaW5nW01JTihmaWVsZFt4XVt5XSwgbGVuKV07CisJCSpwKysgPSAnfCc7CisJCSpwKysgPSAnXG4nOworCX0KKworCS8qIG91dHB1dCBsb3dlciBib3JkZXIgKi8KKwkqcCsrID0gJysnOworCWZvciAoaSA9IDA7IGkgPCBGTERTSVpFX1g7IGkrKykKKwkJKnArKyA9ICctJzsKKwkqcCsrID0gJysnOworCisJcmV0dXJuIHJldHZhbDsKK30KKworY2hhciAqCitrZXlfZmluZ2VycHJpbnQoS2V5ICprLCBlbnVtIGZwX3R5cGUgZGdzdF90eXBlLCBlbnVtIGZwX3JlcCBkZ3N0X3JlcCkKK3sKKwljaGFyICpyZXR2YWwgPSBOVUxMOworCXVfY2hhciAqZGdzdF9yYXc7CisJdV9pbnQgZGdzdF9yYXdfbGVuOworCisJZGdzdF9yYXcgPSBrZXlfZmluZ2VycHJpbnRfcmF3KGssIGRnc3RfdHlwZSwgJmRnc3RfcmF3X2xlbik7CisJaWYgKCFkZ3N0X3JhdykKKwkJZmF0YWwoImtleV9maW5nZXJwcmludDogbnVsbCBmcm9tIGtleV9maW5nZXJwcmludF9yYXcoKSIpOworCXN3aXRjaCAoZGdzdF9yZXApIHsKKwljYXNlIFNTSF9GUF9IRVg6CisJCXJldHZhbCA9IGtleV9maW5nZXJwcmludF9oZXgoZGdzdF9yYXcsIGRnc3RfcmF3X2xlbik7CisJCWJyZWFrOworCWNhc2UgU1NIX0ZQX0JVQkJMRUJBQkJMRToKKwkJcmV0dmFsID0ga2V5X2ZpbmdlcnByaW50X2J1YmJsZWJhYmJsZShkZ3N0X3JhdywgZGdzdF9yYXdfbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBTU0hfRlBfUkFORE9NQVJUOgorCQlyZXR2YWwgPSBrZXlfZmluZ2VycHJpbnRfcmFuZG9tYXJ0KGRnc3RfcmF3LCBkZ3N0X3Jhd19sZW4sIGspOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmYXRhbCgia2V5X2ZpbmdlcnByaW50OiBiYWQgZGlnZXN0IHJlcHJlc2VudGF0aW9uICVkIiwKKwkJICAgIGRnc3RfcmVwKTsKKwkJYnJlYWs7CisJfQorCW1lbXNldChkZ3N0X3JhdywgMCwgZGdzdF9yYXdfbGVuKTsKKwl4ZnJlZShkZ3N0X3Jhdyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFJlYWRzIGEgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgaW4gZGVjaW1hbCBmcm9tIHRoZSBidWZmZXIsIGFuZCBhZHZhbmNlcworICogdGhlIHBvaW50ZXIuICBUaGUgaW50ZWdlciBtdXN0IGFscmVhZHkgYmUgaW5pdGlhbGl6ZWQuICBUaGlzIGZ1bmN0aW9uIGlzCisgKiBwZXJtaXR0ZWQgdG8gbW9kaWZ5IHRoZSBidWZmZXIuICBUaGlzIGxlYXZlcyAqY3BwIHRvIHBvaW50IGp1c3QgYmV5b25kIHRoZQorICogbGFzdCBwcm9jZXNzZWQgKGFuZCBtYXliZSBtb2RpZmllZCkgY2hhcmFjdGVyLiAgTm90ZSB0aGF0IHRoaXMgbWF5IG1vZGlmeQorICogdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBudW1iZXIuCisgKi8KK3N0YXRpYyBpbnQKK3JlYWRfYmlnbnVtKGNoYXIgKipjcHAsIEJJR05VTSAqIHZhbHVlKQoreworCWNoYXIgKmNwID0gKmNwcDsKKwlpbnQgb2xkOworCisJLyogU2tpcCBhbnkgbGVhZGluZyB3aGl0ZXNwYWNlLiAqLworCWZvciAoOyAqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnOyBjcCsrKQorCQk7CisKKwkvKiBDaGVjayB0aGF0IGl0IGJlZ2lucyB3aXRoIGEgZGVjaW1hbCBkaWdpdC4gKi8KKwlpZiAoKmNwIDwgJzAnIHx8ICpjcCA+ICc5JykKKwkJcmV0dXJuIDA7CisKKwkvKiBTYXZlIHN0YXJ0aW5nIHBvc2l0aW9uLiAqLworCSpjcHAgPSBjcDsKKworCS8qIE1vdmUgZm9yd2FyZCB1bnRpbCBhbGwgZGVjaW1hbCBkaWdpdHMgc2tpcHBlZC4gKi8KKwlmb3IgKDsgKmNwID49ICcwJyAmJiAqY3AgPD0gJzknOyBjcCsrKQorCQk7CisKKwkvKiBTYXZlIHRoZSBvbGQgdGVybWluYXRpbmcgY2hhcmFjdGVyLCBhbmQgcmVwbGFjZSBpdCBieSBcMC4gKi8KKwlvbGQgPSAqY3A7CisJKmNwID0gMDsKKworCS8qIFBhcnNlIHRoZSBudW1iZXIuICovCisJaWYgKEJOX2RlYzJibigmdmFsdWUsICpjcHApID09IDApCisJCXJldHVybiAwOworCisJLyogUmVzdG9yZSBvbGQgdGVybWluYXRpbmcgY2hhcmFjdGVyLiAqLworCSpjcCA9IG9sZDsKKworCS8qIE1vdmUgYmV5b25kIHRoZSBudW1iZXIgYW5kIHJldHVybiBzdWNjZXNzLiAqLworCSpjcHAgPSBjcDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAord3JpdGVfYmlnbnVtKEZJTEUgKmYsIEJJR05VTSAqbnVtKQoreworCWNoYXIgKmJ1ZiA9IEJOX2JuMmRlYyhudW0pOworCWlmIChidWYgPT0gTlVMTCkgeworCQllcnJvcigid3JpdGVfYmlnbnVtOiBCTl9ibjJkZWMoKSBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCWZwcmludGYoZiwgIiAlcyIsIGJ1Zik7CisJT1BFTlNTTF9mcmVlKGJ1Zik7CisJcmV0dXJuIDE7Cit9CisKKy8qIHJldHVybnMgMSBvaywgLTEgZXJyb3IgKi8KK2ludAora2V5X3JlYWQoS2V5ICpyZXQsIGNoYXIgKipjcHApCit7CisJS2V5ICprOworCWludCBzdWNjZXNzID0gLTE7CisJY2hhciAqY3AsICpzcGFjZTsKKwlpbnQgbGVuLCBuLCB0eXBlOworCXVfaW50IGJpdHM7CisJdV9jaGFyICpibG9iOworI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworCWludCBjdXJ2ZV9uaWQgPSAtMTsKKyNlbmRpZgorCisJY3AgPSAqY3BwOworCisJc3dpdGNoIChyZXQtPnR5cGUpIHsKKwljYXNlIEtFWV9SU0ExOgorCQkvKiBHZXQgbnVtYmVyIG9mIGJpdHMuICovCisJCWlmICgqY3AgPCAnMCcgfHwgKmNwID4gJzknKQorCQkJcmV0dXJuIC0xOwkvKiBCYWQgYml0IGNvdW50Li4uICovCisJCWZvciAoYml0cyA9IDA7ICpjcCA+PSAnMCcgJiYgKmNwIDw9ICc5JzsgY3ArKykKKwkJCWJpdHMgPSAxMCAqIGJpdHMgKyAqY3AgLSAnMCc7CisJCWlmIChiaXRzID09IDApCisJCQlyZXR1cm4gLTE7CisJCSpjcHAgPSBjcDsKKwkJLyogR2V0IHB1YmxpYyBleHBvbmVudCwgcHVibGljIG1vZHVsdXMuICovCisJCWlmICghcmVhZF9iaWdudW0oY3BwLCByZXQtPnJzYS0+ZSkpCisJCQlyZXR1cm4gLTE7CisJCWlmICghcmVhZF9iaWdudW0oY3BwLCByZXQtPnJzYS0+bikpCisJCQlyZXR1cm4gLTE7CisJCS8qIHZhbGlkYXRlIHRoZSBjbGFpbWVkIG51bWJlciBvZiBiaXRzICovCisJCWlmICgodV9pbnQpQk5fbnVtX2JpdHMocmV0LT5yc2EtPm4pICE9IGJpdHMpIHsKKwkJCXZlcmJvc2UoImtleV9yZWFkOiBjbGFpbWVkIGtleSBzaXplICVkIGRvZXMgbm90IG1hdGNoICIKKwkJCSAgICJhY3R1YWwgJWQiLCBiaXRzLCBCTl9udW1fYml0cyhyZXQtPnJzYS0+bikpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXN1Y2Nlc3MgPSAxOworCQlicmVhazsKKwljYXNlIEtFWV9VTlNQRUM6CisJY2FzZSBLRVlfUlNBOgorCWNhc2UgS0VZX0RTQToKKwljYXNlIEtFWV9FQ0RTQToKKwljYXNlIEtFWV9EU0FfQ0VSVF9WMDA6CisJY2FzZSBLRVlfUlNBX0NFUlRfVjAwOgorCWNhc2UgS0VZX0RTQV9DRVJUOgorCWNhc2UgS0VZX0VDRFNBX0NFUlQ6CisJY2FzZSBLRVlfUlNBX0NFUlQ6CisJCXNwYWNlID0gc3RyY2hyKGNwLCAnICcpOworCQlpZiAoc3BhY2UgPT0gTlVMTCkgeworCQkJZGVidWczKCJrZXlfcmVhZDogbWlzc2luZyB3aGl0ZXNwYWNlIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJKnNwYWNlID0gJ1wwJzsKKwkJdHlwZSA9IGtleV90eXBlX2Zyb21fbmFtZShjcCk7CisjaWZkZWYgT1BFTlNTTF9IQVNfRUNDCisJCWlmIChrZXlfdHlwZV9wbGFpbih0eXBlKSA9PSBLRVlfRUNEU0EgJiYKKwkJICAgIChjdXJ2ZV9uaWQgPSBrZXlfZWNkc2FfbmlkX2Zyb21fbmFtZShjcCkpID09IC0xKSB7CisJCQlkZWJ1Zygia2V5X3JlYWQ6IGludmFsaWQgY3VydmUiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorI2VuZGlmCisJCSpzcGFjZSA9ICcgJzsKKwkJaWYgKHR5cGUgPT0gS0VZX1VOU1BFQykgeworCQkJZGVidWczKCJrZXlfcmVhZDogbWlzc2luZyBrZXl0eXBlIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJY3AgPSBzcGFjZSsxOworCQlpZiAoKmNwID09ICdcMCcpIHsKKwkJCWRlYnVnMygia2V5X3JlYWQ6IHNob3J0IHN0cmluZyIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChyZXQtPnR5cGUgPT0gS0VZX1VOU1BFQykgeworCQkJcmV0LT50eXBlID0gdHlwZTsKKwkJfSBlbHNlIGlmIChyZXQtPnR5cGUgIT0gdHlwZSkgeworCQkJLyogaXMgYSBrZXksIGJ1dCBkaWZmZXJlbnQgdHlwZSAqLworCQkJZGVidWczKCJrZXlfcmVhZDogdHlwZSBtaXNtYXRjaCIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWxlbiA9IDIqc3RybGVuKGNwKTsKKwkJYmxvYiA9IHhtYWxsb2MobGVuKTsKKwkJbiA9IHV1ZGVjb2RlKGNwLCBibG9iLCBsZW4pOworCQlpZiAobiA8IDApIHsKKwkJCWVycm9yKCJrZXlfcmVhZDogdXVkZWNvZGUgJXMgZmFpbGVkIiwgY3ApOworCQkJeGZyZWUoYmxvYik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJayA9IGtleV9mcm9tX2Jsb2IoYmxvYiwgKHVfaW50KW4pOworCQl4ZnJlZShibG9iKTsKKwkJaWYgKGsgPT0gTlVMTCkgeworCQkJZXJyb3IoImtleV9yZWFkOiBrZXlfZnJvbV9ibG9iICVzIGZhaWxlZCIsIGNwKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoay0+dHlwZSAhPSB0eXBlKSB7CisJCQllcnJvcigia2V5X3JlYWQ6IHR5cGUgbWlzbWF0Y2g6IGVuY29kaW5nIGVycm9yIik7CisJCQlrZXlfZnJlZShrKTsKKwkJCXJldHVybiAtMTsKKwkJfQorI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworCQlpZiAoa2V5X3R5cGVfcGxhaW4odHlwZSkgPT0gS0VZX0VDRFNBICYmCisJCSAgICBjdXJ2ZV9uaWQgIT0gay0+ZWNkc2FfbmlkKSB7CisJCQllcnJvcigia2V5X3JlYWQ6IHR5cGUgbWlzbWF0Y2g6IEVDIGN1cnZlIG1pc21hdGNoIik7CisJCQlrZXlfZnJlZShrKTsKKwkJCXJldHVybiAtMTsKKwkJfQorI2VuZGlmCisvKlhYWFgqLworCQlpZiAoa2V5X2lzX2NlcnQocmV0KSkgeworCQkJaWYgKCFrZXlfaXNfY2VydChrKSkgeworCQkJCWVycm9yKCJrZXlfcmVhZDogbG9hZGVkIGtleSBpcyBub3QgYSBjZXJ0Iik7CisJCQkJa2V5X2ZyZWUoayk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKHJldC0+Y2VydCAhPSBOVUxMKQorCQkJCWNlcnRfZnJlZShyZXQtPmNlcnQpOworCQkJcmV0LT5jZXJ0ID0gay0+Y2VydDsKKwkJCWstPmNlcnQgPSBOVUxMOworCQl9CisJCWlmIChrZXlfdHlwZV9wbGFpbihyZXQtPnR5cGUpID09IEtFWV9SU0EpIHsKKwkJCWlmIChyZXQtPnJzYSAhPSBOVUxMKQorCQkJCVJTQV9mcmVlKHJldC0+cnNhKTsKKwkJCXJldC0+cnNhID0gay0+cnNhOworCQkJay0+cnNhID0gTlVMTDsKKyNpZmRlZiBERUJVR19QSworCQkJUlNBX3ByaW50X2ZwKHN0ZGVyciwgcmV0LT5yc2EsIDgpOworI2VuZGlmCisJCX0KKwkJaWYgKGtleV90eXBlX3BsYWluKHJldC0+dHlwZSkgPT0gS0VZX0RTQSkgeworCQkJaWYgKHJldC0+ZHNhICE9IE5VTEwpCisJCQkJRFNBX2ZyZWUocmV0LT5kc2EpOworCQkJcmV0LT5kc2EgPSBrLT5kc2E7CisJCQlrLT5kc2EgPSBOVUxMOworI2lmZGVmIERFQlVHX1BLCisJCQlEU0FfcHJpbnRfZnAoc3RkZXJyLCByZXQtPmRzYSwgOCk7CisjZW5kaWYKKwkJfQorI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworCQlpZiAoa2V5X3R5cGVfcGxhaW4ocmV0LT50eXBlKSA9PSBLRVlfRUNEU0EpIHsKKwkJCWlmIChyZXQtPmVjZHNhICE9IE5VTEwpCisJCQkJRUNfS0VZX2ZyZWUocmV0LT5lY2RzYSk7CisJCQlyZXQtPmVjZHNhID0gay0+ZWNkc2E7CisJCQlyZXQtPmVjZHNhX25pZCA9IGstPmVjZHNhX25pZDsKKwkJCWstPmVjZHNhID0gTlVMTDsKKwkJCWstPmVjZHNhX25pZCA9IC0xOworI2lmZGVmIERFQlVHX1BLCisJCQlrZXlfZHVtcF9lY19rZXkocmV0LT5lY2RzYSk7CisjZW5kaWYKKwkJfQorI2VuZGlmCisJCXN1Y2Nlc3MgPSAxOworLypYWFhYKi8KKwkJa2V5X2ZyZWUoayk7CisJCWlmIChzdWNjZXNzICE9IDEpCisJCQlicmVhazsKKwkJLyogYWR2YW5jZSBjcDogc2tpcCB3aGl0ZXNwYWNlIGFuZCBkYXRhICovCisJCXdoaWxlICgqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnKQorCQkJY3ArKzsKKwkJd2hpbGUgKCpjcCAhPSAnXDAnICYmICpjcCAhPSAnICcgJiYgKmNwICE9ICdcdCcpCisJCQljcCsrOworCQkqY3BwID0gY3A7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZhdGFsKCJrZXlfcmVhZDogYmFkIGtleSB0eXBlOiAlZCIsIHJldC0+dHlwZSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3VjY2VzczsKK30KKworaW50CitrZXlfd3JpdGUoY29uc3QgS2V5ICprZXksIEZJTEUgKmYpCit7CisJaW50IG4sIHN1Y2Nlc3MgPSAwOworCXVfaW50IGxlbiwgYml0cyA9IDA7CisJdV9jaGFyICpibG9iOworCWNoYXIgKnV1OworCisJaWYgKGtleV9pc19jZXJ0KGtleSkpIHsKKwkJaWYgKGtleS0+Y2VydCA9PSBOVUxMKSB7CisJCQllcnJvcigiJXM6IG5vIGNlcnQgZGF0YSIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChidWZmZXJfbGVuKCZrZXktPmNlcnQtPmNlcnRibG9iKSA9PSAwKSB7CisJCQllcnJvcigiJXM6IG5vIHNpZ25lZCBjZXJ0aWZpY2F0ZSBibG9iIiwgX19mdW5jX18pOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlzd2l0Y2ggKGtleS0+dHlwZSkgeworCWNhc2UgS0VZX1JTQTE6CisJCWlmIChrZXktPnJzYSA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCS8qIHNpemUgb2YgbW9kdWx1cyAnbicgKi8KKwkJYml0cyA9IEJOX251bV9iaXRzKGtleS0+cnNhLT5uKTsKKwkJZnByaW50ZihmLCAiJXUiLCBiaXRzKTsKKwkJaWYgKHdyaXRlX2JpZ251bShmLCBrZXktPnJzYS0+ZSkgJiYKKwkJICAgIHdyaXRlX2JpZ251bShmLCBrZXktPnJzYS0+bikpCisJCQlyZXR1cm4gMTsKKwkJZXJyb3IoImtleV93cml0ZTogZmFpbGVkIGZvciBSU0Ega2V5Iik7CisJCXJldHVybiAwOworCWNhc2UgS0VZX0RTQToKKwljYXNlIEtFWV9EU0FfQ0VSVF9WMDA6CisJY2FzZSBLRVlfRFNBX0NFUlQ6CisJCWlmIChrZXktPmRzYSA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworCWNhc2UgS0VZX0VDRFNBOgorCWNhc2UgS0VZX0VDRFNBX0NFUlQ6CisJCWlmIChrZXktPmVjZHNhID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIEtFWV9SU0E6CisJY2FzZSBLRVlfUlNBX0NFUlRfVjAwOgorCWNhc2UgS0VZX1JTQV9DRVJUOgorCQlpZiAoa2V5LT5yc2EgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlrZXlfdG9fYmxvYihrZXksICZibG9iLCAmbGVuKTsKKwl1dSA9IHhtYWxsb2MoMipsZW4pOworCW4gPSB1dWVuY29kZShibG9iLCBsZW4sIHV1LCAyKmxlbik7CisJaWYgKG4gPiAwKSB7CisJCWZwcmludGYoZiwgIiVzICVzIiwga2V5X3NzaF9uYW1lKGtleSksIHV1KTsKKwkJc3VjY2VzcyA9IDE7CisJfQorCXhmcmVlKGJsb2IpOworCXhmcmVlKHV1KTsKKworCXJldHVybiBzdWNjZXNzOworfQorCitjb25zdCBjaGFyICoKK2tleV90eXBlKGNvbnN0IEtleSAqaykKK3sKKwlzd2l0Y2ggKGstPnR5cGUpIHsKKwljYXNlIEtFWV9SU0ExOgorCQlyZXR1cm4gIlJTQTEiOworCWNhc2UgS0VZX1JTQToKKwkJcmV0dXJuICJSU0EiOworCWNhc2UgS0VZX0RTQToKKwkJcmV0dXJuICJEU0EiOworI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworCWNhc2UgS0VZX0VDRFNBOgorCQlyZXR1cm4gIkVDRFNBIjsKKyNlbmRpZgorCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKKwkJcmV0dXJuICJSU0EtQ0VSVC1WMDAiOworCWNhc2UgS0VZX0RTQV9DRVJUX1YwMDoKKwkJcmV0dXJuICJEU0EtQ0VSVC1WMDAiOworCWNhc2UgS0VZX1JTQV9DRVJUOgorCQlyZXR1cm4gIlJTQS1DRVJUIjsKKwljYXNlIEtFWV9EU0FfQ0VSVDoKKwkJcmV0dXJuICJEU0EtQ0VSVCI7CisjaWZkZWYgT1BFTlNTTF9IQVNfRUNDCisJY2FzZSBLRVlfRUNEU0FfQ0VSVDoKKwkJcmV0dXJuICJFQ0RTQS1DRVJUIjsKKyNlbmRpZgorCX0KKwlyZXR1cm4gInVua25vd24iOworfQorCitjb25zdCBjaGFyICoKK2tleV9jZXJ0X3R5cGUoY29uc3QgS2V5ICprKQoreworCXN3aXRjaCAoay0+Y2VydC0+dHlwZSkgeworCWNhc2UgU1NIMl9DRVJUX1RZUEVfVVNFUjoKKwkJcmV0dXJuICJ1c2VyIjsKKwljYXNlIFNTSDJfQ0VSVF9UWVBFX0hPU1Q6CisJCXJldHVybiAiaG9zdCI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2tleV9zc2hfbmFtZV9mcm9tX3R5cGVfbmlkKGludCB0eXBlLCBpbnQgbmlkKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgS0VZX1JTQToKKwkJcmV0dXJuICJzc2gtcnNhIjsKKwljYXNlIEtFWV9EU0E6CisJCXJldHVybiAic3NoLWRzcyI7CisJY2FzZSBLRVlfUlNBX0NFUlRfVjAwOgorCQlyZXR1cm4gInNzaC1yc2EtY2VydC12MDBAb3BlbnNzaC5jb20iOworCWNhc2UgS0VZX0RTQV9DRVJUX1YwMDoKKwkJcmV0dXJuICJzc2gtZHNzLWNlcnQtdjAwQG9wZW5zc2guY29tIjsKKwljYXNlIEtFWV9SU0FfQ0VSVDoKKwkJcmV0dXJuICJzc2gtcnNhLWNlcnQtdjAxQG9wZW5zc2guY29tIjsKKwljYXNlIEtFWV9EU0FfQ0VSVDoKKwkJcmV0dXJuICJzc2gtZHNzLWNlcnQtdjAxQG9wZW5zc2guY29tIjsKKyNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKKwljYXNlIEtFWV9FQ0RTQToKKwkJc3dpdGNoIChuaWQpIHsKKwkJY2FzZSBOSURfWDlfNjJfcHJpbWUyNTZ2MToKKwkJCXJldHVybiAiZWNkc2Etc2hhMi1uaXN0cDI1NiI7CisJCWNhc2UgTklEX3NlY3AzODRyMToKKwkJCXJldHVybiAiZWNkc2Etc2hhMi1uaXN0cDM4NCI7CisJCWNhc2UgTklEX3NlY3A1MjFyMToKKwkJCXJldHVybiAiZWNkc2Etc2hhMi1uaXN0cDUyMSI7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIEtFWV9FQ0RTQV9DRVJUOgorCQlzd2l0Y2ggKG5pZCkgeworCQljYXNlIE5JRF9YOV82Ml9wcmltZTI1NnYxOgorCQkJcmV0dXJuICJlY2RzYS1zaGEyLW5pc3RwMjU2LWNlcnQtdjAxQG9wZW5zc2guY29tIjsKKwkJY2FzZSBOSURfc2VjcDM4NHIxOgorCQkJcmV0dXJuICJlY2RzYS1zaGEyLW5pc3RwMzg0LWNlcnQtdjAxQG9wZW5zc2guY29tIjsKKwkJY2FzZSBOSURfc2VjcDUyMXIxOgorCQkJcmV0dXJuICJlY2RzYS1zaGEyLW5pc3RwNTIxLWNlcnQtdjAxQG9wZW5zc2guY29tIjsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworI2VuZGlmIC8qIE9QRU5TU0xfSEFTX0VDQyAqLworCX0KKwlyZXR1cm4gInNzaC11bmtub3duIjsKK30KKworY29uc3QgY2hhciAqCitrZXlfc3NoX25hbWUoY29uc3QgS2V5ICprKQoreworCXJldHVybiBrZXlfc3NoX25hbWVfZnJvbV90eXBlX25pZChrLT50eXBlLCBrLT5lY2RzYV9uaWQpOworfQorCitjb25zdCBjaGFyICoKK2tleV9zc2hfbmFtZV9wbGFpbihjb25zdCBLZXkgKmspCit7CisJcmV0dXJuIGtleV9zc2hfbmFtZV9mcm9tX3R5cGVfbmlkKGtleV90eXBlX3BsYWluKGstPnR5cGUpLAorCSAgICBrLT5lY2RzYV9uaWQpOworfQorCit1X2ludAora2V5X3NpemUoY29uc3QgS2V5ICprKQoreworCXN3aXRjaCAoay0+dHlwZSkgeworCWNhc2UgS0VZX1JTQTE6CisJY2FzZSBLRVlfUlNBOgorCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKKwljYXNlIEtFWV9SU0FfQ0VSVDoKKwkJcmV0dXJuIEJOX251bV9iaXRzKGstPnJzYS0+bik7CisJY2FzZSBLRVlfRFNBOgorCWNhc2UgS0VZX0RTQV9DRVJUX1YwMDoKKwljYXNlIEtFWV9EU0FfQ0VSVDoKKwkJcmV0dXJuIEJOX251bV9iaXRzKGstPmRzYS0+cCk7CisjaWZkZWYgT1BFTlNTTF9IQVNfRUNDCisJY2FzZSBLRVlfRUNEU0E6CisJY2FzZSBLRVlfRUNEU0FfQ0VSVDoKKwkJcmV0dXJuIGtleV9jdXJ2ZV9uaWRfdG9fYml0cyhrLT5lY2RzYV9uaWQpOworI2VuZGlmCisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgUlNBICoKK3JzYV9nZW5lcmF0ZV9wcml2YXRlX2tleSh1X2ludCBiaXRzKQoreworCVJTQSAqcHJpdmF0ZSA9IFJTQV9uZXcoKTsKKwlCSUdOVU0gKmY0ID0gQk5fbmV3KCk7CisKKwlpZiAocHJpdmF0ZSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IFJTQV9uZXcgZmFpbGVkIiwgX19mdW5jX18pOworCWlmIChmNCA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IEJOX25ldyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJaWYgKCFCTl9zZXRfd29yZChmNCwgUlNBX0Y0KSkKKwkJZmF0YWwoIiVzOiBCTl9uZXcgZmFpbGVkIiwgX19mdW5jX18pOworCWlmICghUlNBX2dlbmVyYXRlX2tleV9leChwcml2YXRlLCBiaXRzLCBmNCwgTlVMTCkpCisJCWZhdGFsKCIlczoga2V5IGdlbmVyYXRpb24gZmFpbGVkLiIsIF9fZnVuY19fKTsKKwlCTl9mcmVlKGY0KTsKKwlyZXR1cm4gcHJpdmF0ZTsKK30KKworc3RhdGljIERTQSoKK2RzYV9nZW5lcmF0ZV9wcml2YXRlX2tleSh1X2ludCBiaXRzKQoreworCURTQSAqcHJpdmF0ZSA9IERTQV9uZXcoKTsKKworCWlmIChwcml2YXRlID09IE5VTEwpCisJCWZhdGFsKCIlczogRFNBX25ldyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJaWYgKCFEU0FfZ2VuZXJhdGVfcGFyYW1ldGVyc19leChwcml2YXRlLCBiaXRzLCBOVUxMLCAwLCBOVUxMLAorCSAgICBOVUxMLCBOVUxMKSkKKwkJZmF0YWwoIiVzOiBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVycyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJaWYgKCFEU0FfZ2VuZXJhdGVfa2V5KHByaXZhdGUpKQorCQlmYXRhbCgiJXM6IERTQV9nZW5lcmF0ZV9rZXkgZmFpbGVkLiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gcHJpdmF0ZTsKK30KKworaW50CitrZXlfZWNkc2FfYml0c190b19uaWQoaW50IGJpdHMpCit7CisJc3dpdGNoIChiaXRzKSB7CisjaWZkZWYgT1BFTlNTTF9IQVNfRUNDCisJY2FzZSAyNTY6CisJCXJldHVybiBOSURfWDlfNjJfcHJpbWUyNTZ2MTsKKwljYXNlIDM4NDoKKwkJcmV0dXJuIE5JRF9zZWNwMzg0cjE7CisJY2FzZSA1MjE6CisJCXJldHVybiBOSURfc2VjcDUyMXIxOworI2VuZGlmCisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KK30KKworI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworaW50CitrZXlfZWNkc2Ffa2V5X3RvX25pZChFQ19LRVkgKmspCit7CisJRUNfR1JPVVAgKmVnOworCWludCBuaWRzW10gPSB7CisJCU5JRF9YOV82Ml9wcmltZTI1NnYxLAorCQlOSURfc2VjcDM4NHIxLAorCQlOSURfc2VjcDUyMXIxLAorCQktMQorCX07CisJaW50IG5pZDsKKwl1X2ludCBpOworCUJOX0NUWCAqYm5jdHg7CisJY29uc3QgRUNfR1JPVVAgKmcgPSBFQ19LRVlfZ2V0MF9ncm91cChrKTsKKworCS8qCisJICogVGhlIGdyb3VwIG1heSBiZSBzdG9yZWQgaW4gYSBBU04uMSBlbmNvZGVkIHByaXZhdGUga2V5IGluIG9uZSBvZiB0d28KKwkgKiB3YXlzOiBhcyBhICJuYW1lZCBncm91cCIsIHdoaWNoIGlzIHJlY29uc3RpdHV0ZWQgYnkgQVNOLjEgb2JqZWN0IElECisJICogb3IgZXhwbGljaXQgZ3JvdXAgcGFyYW1ldGVycyBlbmNvZGVkIGludG8gdGhlIGtleSBibG9iLiBPbmx5IHRoZQorCSAqICJuYW1lZCBncm91cCIgY2FzZSBzZXRzIHRoZSBncm91cCBOSUQgZm9yIHVzLCBidXQgd2UgY2FuIGZpZ3VyZQorCSAqIGl0IG91dCBmb3IgdGhlIG90aGVyIGNhc2UgYnkgY29tcGFyaW5nIGFnYWluc3QgYWxsIHRoZSBncm91cHMgdGhhdAorCSAqIGFyZSBzdXBwb3J0ZWQuCisJICovCisJaWYgKChuaWQgPSBFQ19HUk9VUF9nZXRfY3VydmVfbmFtZShnKSkgPiAwKQorCQlyZXR1cm4gbmlkOworCWlmICgoYm5jdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCIlczogQk5fQ1RYX25ldygpIGZhaWxlZCIsIF9fZnVuY19fKTsKKwlmb3IgKGkgPSAwOyBuaWRzW2ldICE9IC0xOyBpKyspIHsKKwkJaWYgKChlZyA9IEVDX0dST1VQX25ld19ieV9jdXJ2ZV9uYW1lKG5pZHNbaV0pKSA9PSBOVUxMKQorCQkJZmF0YWwoIiVzOiBFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZSBmYWlsZWQiLAorCQkJICAgIF9fZnVuY19fKTsKKwkJaWYgKEVDX0dST1VQX2NtcChnLCBlZywgYm5jdHgpID09IDApCisJCQlicmVhazsKKwkJRUNfR1JPVVBfZnJlZShlZyk7CisJfQorCUJOX0NUWF9mcmVlKGJuY3R4KTsKKwlkZWJ1ZzMoIiVzOiBuaWQgPSAlZCIsIF9fZnVuY19fLCBuaWRzW2ldKTsKKwlpZiAobmlkc1tpXSAhPSAtMSkgeworCQkvKiBVc2UgdGhlIGdyb3VwIHdpdGggdGhlIE5JRCBhdHRhY2hlZCAqLworCQlFQ19HUk9VUF9zZXRfYXNuMV9mbGFnKGVnLCBPUEVOU1NMX0VDX05BTUVEX0NVUlZFKTsKKwkJaWYgKEVDX0tFWV9zZXRfZ3JvdXAoaywgZWcpICE9IDEpCisJCQlmYXRhbCgiJXM6IEVDX0tFWV9zZXRfZ3JvdXAiLCBfX2Z1bmNfXyk7CisJfQorCXJldHVybiBuaWRzW2ldOworfQorCitzdGF0aWMgRUNfS0VZKgorZWNkc2FfZ2VuZXJhdGVfcHJpdmF0ZV9rZXkodV9pbnQgYml0cywgaW50ICpuaWQpCit7CisJRUNfS0VZICpwcml2YXRlOworCisJaWYgKCgqbmlkID0ga2V5X2VjZHNhX2JpdHNfdG9fbmlkKGJpdHMpKSA9PSAtMSkKKwkJZmF0YWwoIiVzOiBpbnZhbGlkIGtleSBsZW5ndGgiLCBfX2Z1bmNfXyk7CisJaWYgKChwcml2YXRlID0gRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lKCpuaWQpKSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZSBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJaWYgKEVDX0tFWV9nZW5lcmF0ZV9rZXkocHJpdmF0ZSkgIT0gMSkKKwkJZmF0YWwoIiVzOiBFQ19LRVlfZ2VuZXJhdGVfa2V5IGZhaWxlZCIsIF9fZnVuY19fKTsKKwlFQ19LRVlfc2V0X2FzbjFfZmxhZyhwcml2YXRlLCBPUEVOU1NMX0VDX05BTUVEX0NVUlZFKTsKKwlyZXR1cm4gcHJpdmF0ZTsKK30KKyNlbmRpZiAvKiBPUEVOU1NMX0hBU19FQ0MgKi8KKworS2V5ICoKK2tleV9nZW5lcmF0ZShpbnQgdHlwZSwgdV9pbnQgYml0cykKK3sKKwlLZXkgKmsgPSBrZXlfbmV3KEtFWV9VTlNQRUMpOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgS0VZX0RTQToKKwkJay0+ZHNhID0gZHNhX2dlbmVyYXRlX3ByaXZhdGVfa2V5KGJpdHMpOworCQlicmVhazsKKyNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKKwljYXNlIEtFWV9FQ0RTQToKKwkJay0+ZWNkc2EgPSBlY2RzYV9nZW5lcmF0ZV9wcml2YXRlX2tleShiaXRzLCAmay0+ZWNkc2FfbmlkKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIEtFWV9SU0E6CisJY2FzZSBLRVlfUlNBMToKKwkJay0+cnNhID0gcnNhX2dlbmVyYXRlX3ByaXZhdGVfa2V5KGJpdHMpOworCQlicmVhazsKKwljYXNlIEtFWV9SU0FfQ0VSVF9WMDA6CisJY2FzZSBLRVlfRFNBX0NFUlRfVjAwOgorCWNhc2UgS0VZX1JTQV9DRVJUOgorCWNhc2UgS0VZX0RTQV9DRVJUOgorCQlmYXRhbCgia2V5X2dlbmVyYXRlOiBjZXJ0IGtleXMgY2Fubm90IGJlIGdlbmVyYXRlZCBkaXJlY3RseSIpOworCWRlZmF1bHQ6CisJCWZhdGFsKCJrZXlfZ2VuZXJhdGU6IHVua25vd24gdHlwZSAlZCIsIHR5cGUpOworCX0KKwlrLT50eXBlID0gdHlwZTsKKwlyZXR1cm4gazsKK30KKwordm9pZAora2V5X2NlcnRfY29weShjb25zdCBLZXkgKmZyb21fa2V5LCBzdHJ1Y3QgS2V5ICp0b19rZXkpCit7CisJdV9pbnQgaTsKKwljb25zdCBzdHJ1Y3QgS2V5Q2VydCAqZnJvbTsKKwlzdHJ1Y3QgS2V5Q2VydCAqdG87CisKKwlpZiAodG9fa2V5LT5jZXJ0ICE9IE5VTEwpIHsKKwkJY2VydF9mcmVlKHRvX2tleS0+Y2VydCk7CisJCXRvX2tleS0+Y2VydCA9IE5VTEw7CisJfQorCisJaWYgKChmcm9tID0gZnJvbV9rZXktPmNlcnQpID09IE5VTEwpCisJCXJldHVybjsKKworCXRvID0gdG9fa2V5LT5jZXJ0ID0gY2VydF9uZXcoKTsKKworCWJ1ZmZlcl9hcHBlbmQoJnRvLT5jZXJ0YmxvYiwgYnVmZmVyX3B0cigmZnJvbS0+Y2VydGJsb2IpLAorCSAgICBidWZmZXJfbGVuKCZmcm9tLT5jZXJ0YmxvYikpOworCisJYnVmZmVyX2FwcGVuZCgmdG8tPmNyaXRpY2FsLAorCSAgICBidWZmZXJfcHRyKCZmcm9tLT5jcml0aWNhbCksIGJ1ZmZlcl9sZW4oJmZyb20tPmNyaXRpY2FsKSk7CisJYnVmZmVyX2FwcGVuZCgmdG8tPmV4dGVuc2lvbnMsCisJICAgIGJ1ZmZlcl9wdHIoJmZyb20tPmV4dGVuc2lvbnMpLCBidWZmZXJfbGVuKCZmcm9tLT5leHRlbnNpb25zKSk7CisKKwl0by0+c2VyaWFsID0gZnJvbS0+c2VyaWFsOworCXRvLT50eXBlID0gZnJvbS0+dHlwZTsKKwl0by0+a2V5X2lkID0gZnJvbS0+a2V5X2lkID09IE5VTEwgPyBOVUxMIDogeHN0cmR1cChmcm9tLT5rZXlfaWQpOworCXRvLT52YWxpZF9hZnRlciA9IGZyb20tPnZhbGlkX2FmdGVyOworCXRvLT52YWxpZF9iZWZvcmUgPSBmcm9tLT52YWxpZF9iZWZvcmU7CisJdG8tPnNpZ25hdHVyZV9rZXkgPSBmcm9tLT5zaWduYXR1cmVfa2V5ID09IE5VTEwgPworCSAgICBOVUxMIDoga2V5X2Zyb21fcHJpdmF0ZShmcm9tLT5zaWduYXR1cmVfa2V5KTsKKworCXRvLT5ucHJpbmNpcGFscyA9IGZyb20tPm5wcmluY2lwYWxzOworCWlmICh0by0+bnByaW5jaXBhbHMgPiBDRVJUX01BWF9QUklOQ0lQQUxTKQorCQlmYXRhbCgiJXM6IG5wcmluY2lwYWxzICgldSkgPiBDRVJUX01BWF9QUklOQ0lQQUxTICgldSkiLAorCQkgICAgX19mdW5jX18sIHRvLT5ucHJpbmNpcGFscywgQ0VSVF9NQVhfUFJJTkNJUEFMUyk7CisJaWYgKHRvLT5ucHJpbmNpcGFscyA+IDApIHsKKwkJdG8tPnByaW5jaXBhbHMgPSB4Y2FsbG9jKGZyb20tPm5wcmluY2lwYWxzLAorCQkgICAgc2l6ZW9mKCp0by0+cHJpbmNpcGFscykpOworCQlmb3IgKGkgPSAwOyBpIDwgdG8tPm5wcmluY2lwYWxzOyBpKyspCisJCQl0by0+cHJpbmNpcGFsc1tpXSA9IHhzdHJkdXAoZnJvbS0+cHJpbmNpcGFsc1tpXSk7CisJfQorfQorCitLZXkgKgora2V5X2Zyb21fcHJpdmF0ZShjb25zdCBLZXkgKmspCit7CisJS2V5ICpuID0gTlVMTDsKKwlzd2l0Y2ggKGstPnR5cGUpIHsKKwljYXNlIEtFWV9EU0E6CisJY2FzZSBLRVlfRFNBX0NFUlRfVjAwOgorCWNhc2UgS0VZX0RTQV9DRVJUOgorCQluID0ga2V5X25ldyhrLT50eXBlKTsKKwkJaWYgKChCTl9jb3B5KG4tPmRzYS0+cCwgay0+ZHNhLT5wKSA9PSBOVUxMKSB8fAorCQkgICAgKEJOX2NvcHkobi0+ZHNhLT5xLCBrLT5kc2EtPnEpID09IE5VTEwpIHx8CisJCSAgICAoQk5fY29weShuLT5kc2EtPmcsIGstPmRzYS0+ZykgPT0gTlVMTCkgfHwKKwkJICAgIChCTl9jb3B5KG4tPmRzYS0+cHViX2tleSwgay0+ZHNhLT5wdWJfa2V5KSA9PSBOVUxMKSkKKwkJCWZhdGFsKCJrZXlfZnJvbV9wcml2YXRlOiBCTl9jb3B5IGZhaWxlZCIpOworCQlicmVhazsKKyNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKKwljYXNlIEtFWV9FQ0RTQToKKwljYXNlIEtFWV9FQ0RTQV9DRVJUOgorCQluID0ga2V5X25ldyhrLT50eXBlKTsKKwkJbi0+ZWNkc2FfbmlkID0gay0+ZWNkc2FfbmlkOworCQlpZiAoKG4tPmVjZHNhID0gRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lKGstPmVjZHNhX25pZCkpID09IE5VTEwpCisJCQlmYXRhbCgiJXM6IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZSBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCWlmIChFQ19LRVlfc2V0X3B1YmxpY19rZXkobi0+ZWNkc2EsCisJCSAgICBFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KGstPmVjZHNhKSkgIT0gMSkKKwkJCWZhdGFsKCIlczogRUNfS0VZX3NldF9wdWJsaWNfa2V5IGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIEtFWV9SU0E6CisJY2FzZSBLRVlfUlNBMToKKwljYXNlIEtFWV9SU0FfQ0VSVF9WMDA6CisJY2FzZSBLRVlfUlNBX0NFUlQ6CisJCW4gPSBrZXlfbmV3KGstPnR5cGUpOworCQlpZiAoKEJOX2NvcHkobi0+cnNhLT5uLCBrLT5yc2EtPm4pID09IE5VTEwpIHx8CisJCSAgICAoQk5fY29weShuLT5yc2EtPmUsIGstPnJzYS0+ZSkgPT0gTlVMTCkpCisJCQlmYXRhbCgia2V5X2Zyb21fcHJpdmF0ZTogQk5fY29weSBmYWlsZWQiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZmF0YWwoImtleV9mcm9tX3ByaXZhdGU6IHVua25vd24gdHlwZSAlZCIsIGstPnR5cGUpOworCQlicmVhazsKKwl9CisJaWYgKGtleV9pc19jZXJ0KGspKQorCQlrZXlfY2VydF9jb3B5KGssIG4pOworCXJldHVybiBuOworfQorCitpbnQKK2tleV90eXBlX2Zyb21fbmFtZShjaGFyICpuYW1lKQoreworCWlmIChzdHJjbXAobmFtZSwgInJzYTEiKSA9PSAwKSB7CisJCXJldHVybiBLRVlfUlNBMTsKKwl9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAicnNhIikgPT0gMCkgeworCQlyZXR1cm4gS0VZX1JTQTsKKwl9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiZHNhIikgPT0gMCkgeworCQlyZXR1cm4gS0VZX0RTQTsKKwl9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAic3NoLXJzYSIpID09IDApIHsKKwkJcmV0dXJuIEtFWV9SU0E7CisJfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgInNzaC1kc3MiKSA9PSAwKSB7CisJCXJldHVybiBLRVlfRFNBOworI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJlY2RzYSIpID09IDAgfHwKKwkgICAgc3RyY21wKG5hbWUsICJlY2RzYS1zaGEyLW5pc3RwMjU2IikgPT0gMCB8fAorCSAgICBzdHJjbXAobmFtZSwgImVjZHNhLXNoYTItbmlzdHAzODQiKSA9PSAwIHx8CisJICAgIHN0cmNtcChuYW1lLCAiZWNkc2Etc2hhMi1uaXN0cDUyMSIpID09IDApIHsKKwkJcmV0dXJuIEtFWV9FQ0RTQTsKKyNlbmRpZgorCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJzc2gtcnNhLWNlcnQtdjAwQG9wZW5zc2guY29tIikgPT0gMCkgeworCQlyZXR1cm4gS0VZX1JTQV9DRVJUX1YwMDsKKwl9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAic3NoLWRzcy1jZXJ0LXYwMEBvcGVuc3NoLmNvbSIpID09IDApIHsKKwkJcmV0dXJuIEtFWV9EU0FfQ0VSVF9WMDA7CisJfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgInNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20iKSA9PSAwKSB7CisJCXJldHVybiBLRVlfUlNBX0NFUlQ7CisJfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgInNzaC1kc3MtY2VydC12MDFAb3BlbnNzaC5jb20iKSA9PSAwKSB7CisJCXJldHVybiBLRVlfRFNBX0NFUlQ7CisjaWZkZWYgT1BFTlNTTF9IQVNfRUNDCisJfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgImVjZHNhLXNoYTItbmlzdHAyNTYtY2VydC12MDFAb3BlbnNzaC5jb20iKSA9PSAwIHx8CisJICAgIHN0cmNtcChuYW1lLCAiZWNkc2Etc2hhMi1uaXN0cDM4NC1jZXJ0LXYwMUBvcGVuc3NoLmNvbSIpID09IDAgfHwKKwkgICAgc3RyY21wKG5hbWUsICJlY2RzYS1zaGEyLW5pc3RwNTIxLWNlcnQtdjAxQG9wZW5zc2guY29tIikgPT0gMCkgeworCQlyZXR1cm4gS0VZX0VDRFNBX0NFUlQ7CisjZW5kaWYKKwl9CisKKwlkZWJ1ZzIoImtleV90eXBlX2Zyb21fbmFtZTogdW5rbm93biBrZXkgdHlwZSAnJXMnIiwgbmFtZSk7CisJcmV0dXJuIEtFWV9VTlNQRUM7Cit9CisKK2ludAora2V5X2VjZHNhX25pZF9mcm9tX25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKyNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKKwlpZiAoc3RyY21wKG5hbWUsICJlY2RzYS1zaGEyLW5pc3RwMjU2IikgPT0gMCB8fAorCSAgICBzdHJjbXAobmFtZSwgImVjZHNhLXNoYTItbmlzdHAyNTYtY2VydC12MDFAb3BlbnNzaC5jb20iKSA9PSAwKQorCQlyZXR1cm4gTklEX1g5XzYyX3ByaW1lMjU2djE7CisJaWYgKHN0cmNtcChuYW1lLCAiZWNkc2Etc2hhMi1uaXN0cDM4NCIpID09IDAgfHwKKwkgICAgc3RyY21wKG5hbWUsICJlY2RzYS1zaGEyLW5pc3RwMzg0LWNlcnQtdjAxQG9wZW5zc2guY29tIikgPT0gMCkKKwkJcmV0dXJuIE5JRF9zZWNwMzg0cjE7CisJaWYgKHN0cmNtcChuYW1lLCAiZWNkc2Etc2hhMi1uaXN0cDUyMSIpID09IDAgfHwKKwkgICAgc3RyY21wKG5hbWUsICJlY2RzYS1zaGEyLW5pc3RwNTIxLWNlcnQtdjAxQG9wZW5zc2guY29tIikgPT0gMCkKKwkJcmV0dXJuIE5JRF9zZWNwNTIxcjE7CisjZW5kaWYgLyogT1BFTlNTTF9IQVNfRUNDICovCisKKwlkZWJ1ZzIoIiVzOiB1bmtub3duL25vbi1FQ0RTQSBrZXkgdHlwZSAnJXMnIiwgX19mdW5jX18sIG5hbWUpOworCXJldHVybiAtMTsKK30KKworaW50CitrZXlfbmFtZXNfdmFsaWQyKGNvbnN0IGNoYXIgKm5hbWVzKQoreworCWNoYXIgKnMsICpjcCwgKnA7CisKKwlpZiAobmFtZXMgPT0gTlVMTCB8fCBzdHJjbXAobmFtZXMsICIiKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlzID0gY3AgPSB4c3RyZHVwKG5hbWVzKTsKKwlmb3IgKChwID0gc3Ryc2VwKCZjcCwgIiwiKSk7IHAgJiYgKnAgIT0gJ1wwJzsKKwkgICAgKHAgPSBzdHJzZXAoJmNwLCAiLCIpKSkgeworCQlzd2l0Y2ggKGtleV90eXBlX2Zyb21fbmFtZShwKSkgeworCQljYXNlIEtFWV9SU0ExOgorCQljYXNlIEtFWV9VTlNQRUM6CisJCQl4ZnJlZShzKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWRlYnVnMygia2V5IG5hbWVzIG9rOiBbJXNdIiwgbmFtZXMpOworCXhmcmVlKHMpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitjZXJ0X3BhcnNlKEJ1ZmZlciAqYiwgS2V5ICprZXksIGNvbnN0IHVfY2hhciAqYmxvYiwgdV9pbnQgYmxlbikKK3sKKwl1X2NoYXIgKnByaW5jaXBhbHMsICpjcml0aWNhbCwgKmV4dHMsICpzaWdfa2V5LCAqc2lnOworCXVfaW50IHNpZ25lZF9sZW4sIHBsZW4sIGNsZW4sIHNrbGVuLCBzbGVuLCBraWRsZW4sIGVsZW47CisJQnVmZmVyIHRtcDsKKwljaGFyICpwcmluY2lwYWw7CisJaW50IHJldCA9IC0xOworCWludCB2MDAgPSBrZXktPnR5cGUgPT0gS0VZX0RTQV9DRVJUX1YwMCB8fAorCSAgICBrZXktPnR5cGUgPT0gS0VZX1JTQV9DRVJUX1YwMDsKKworCWJ1ZmZlcl9pbml0KCZ0bXApOworCisJLyogQ29weSB0aGUgZW50aXJlIGtleSBibG9iIGZvciB2ZXJpZmljYXRpb24gYW5kIGxhdGVyIHNlcmlhbGlzYXRpb24gKi8KKwlidWZmZXJfYXBwZW5kKCZrZXktPmNlcnQtPmNlcnRibG9iLCBibG9iLCBibGVuKTsKKworCWVsZW4gPSAwOyAvKiBOb3QgdG91Y2hlZCBmb3IgdjAwIGNlcnRzICovCisJcHJpbmNpcGFscyA9IGV4dHMgPSBjcml0aWNhbCA9IHNpZ19rZXkgPSBzaWcgPSBOVUxMOworCWlmICgoIXYwMCAmJiBidWZmZXJfZ2V0X2ludDY0X3JldCgma2V5LT5jZXJ0LT5zZXJpYWwsIGIpICE9IDApIHx8CisJICAgIGJ1ZmZlcl9nZXRfaW50X3JldCgma2V5LT5jZXJ0LT50eXBlLCBiKSAhPSAwIHx8CisJICAgIChrZXktPmNlcnQtPmtleV9pZCA9IGJ1ZmZlcl9nZXRfY3N0cmluZ19yZXQoYiwgJmtpZGxlbikpID09IE5VTEwgfHwKKwkgICAgKHByaW5jaXBhbHMgPSBidWZmZXJfZ2V0X3N0cmluZ19yZXQoYiwgJnBsZW4pKSA9PSBOVUxMIHx8CisJICAgIGJ1ZmZlcl9nZXRfaW50NjRfcmV0KCZrZXktPmNlcnQtPnZhbGlkX2FmdGVyLCBiKSAhPSAwIHx8CisJICAgIGJ1ZmZlcl9nZXRfaW50NjRfcmV0KCZrZXktPmNlcnQtPnZhbGlkX2JlZm9yZSwgYikgIT0gMCB8fAorCSAgICAoY3JpdGljYWwgPSBidWZmZXJfZ2V0X3N0cmluZ19yZXQoYiwgJmNsZW4pKSA9PSBOVUxMIHx8CisJICAgICghdjAwICYmIChleHRzID0gYnVmZmVyX2dldF9zdHJpbmdfcmV0KGIsICZlbGVuKSkgPT0gTlVMTCkgfHwKKwkgICAgKHYwMCAmJiBidWZmZXJfZ2V0X3N0cmluZ19wdHJfcmV0KGIsIE5VTEwpID09IE5VTEwpIHx8IC8qIG5vbmNlICovCisJICAgIGJ1ZmZlcl9nZXRfc3RyaW5nX3B0cl9yZXQoYiwgTlVMTCkgPT0gTlVMTCB8fCAvKiByZXNlcnZlZCAqLworCSAgICAoc2lnX2tleSA9IGJ1ZmZlcl9nZXRfc3RyaW5nX3JldChiLCAmc2tsZW4pKSA9PSBOVUxMKSB7CisJCWVycm9yKCIlczogcGFyc2UgZXJyb3IiLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFNpZ25hdHVyZSBpcyBsZWZ0IGluIHRoZSBidWZmZXIgc28gd2UgY2FuIGNhbGN1bGF0ZSB0aGlzIGxlbmd0aCAqLworCXNpZ25lZF9sZW4gPSBidWZmZXJfbGVuKCZrZXktPmNlcnQtPmNlcnRibG9iKSAtIGJ1ZmZlcl9sZW4oYik7CisKKwlpZiAoKHNpZyA9IGJ1ZmZlcl9nZXRfc3RyaW5nX3JldChiLCAmc2xlbikpID09IE5VTEwpIHsKKwkJZXJyb3IoIiVzOiBwYXJzZSBlcnJvciIsIF9fZnVuY19fKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGtleS0+Y2VydC0+dHlwZSAhPSBTU0gyX0NFUlRfVFlQRV9VU0VSICYmCisJICAgIGtleS0+Y2VydC0+dHlwZSAhPSBTU0gyX0NFUlRfVFlQRV9IT1NUKSB7CisJCWVycm9yKCJVbmtub3duIGNlcnRpZmljYXRlIHR5cGUgJXUiLCBrZXktPmNlcnQtPnR5cGUpOworCQlnb3RvIG91dDsKKwl9CisKKwlidWZmZXJfYXBwZW5kKCZ0bXAsIHByaW5jaXBhbHMsIHBsZW4pOworCXdoaWxlIChidWZmZXJfbGVuKCZ0bXApID4gMCkgeworCQlpZiAoa2V5LT5jZXJ0LT5ucHJpbmNpcGFscyA+PSBDRVJUX01BWF9QUklOQ0lQQUxTKSB7CisJCQllcnJvcigiJXM6IFRvbyBtYW55IHByaW5jaXBhbHMiLCBfX2Z1bmNfXyk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoKHByaW5jaXBhbCA9IGJ1ZmZlcl9nZXRfY3N0cmluZ19yZXQoJnRtcCwgJnBsZW4pKSA9PSBOVUxMKSB7CisJCQllcnJvcigiJXM6IFByaW5jaXBhbHMgZGF0YSBpbnZhbGlkIiwgX19mdW5jX18pOworCQkJZ290byBvdXQ7CisJCX0KKwkJa2V5LT5jZXJ0LT5wcmluY2lwYWxzID0geHJlYWxsb2Moa2V5LT5jZXJ0LT5wcmluY2lwYWxzLAorCQkgICAga2V5LT5jZXJ0LT5ucHJpbmNpcGFscyArIDEsIHNpemVvZigqa2V5LT5jZXJ0LT5wcmluY2lwYWxzKSk7CisJCWtleS0+Y2VydC0+cHJpbmNpcGFsc1trZXktPmNlcnQtPm5wcmluY2lwYWxzKytdID0gcHJpbmNpcGFsOworCX0KKworCWJ1ZmZlcl9jbGVhcigmdG1wKTsKKworCWJ1ZmZlcl9hcHBlbmQoJmtleS0+Y2VydC0+Y3JpdGljYWwsIGNyaXRpY2FsLCBjbGVuKTsKKwlidWZmZXJfYXBwZW5kKCZ0bXAsIGNyaXRpY2FsLCBjbGVuKTsKKwkvKiB2YWxpZGF0ZSBzdHJ1Y3R1cmUgKi8KKwl3aGlsZSAoYnVmZmVyX2xlbigmdG1wKSAhPSAwKSB7CisJCWlmIChidWZmZXJfZ2V0X3N0cmluZ19wdHJfcmV0KCZ0bXAsIE5VTEwpID09IE5VTEwgfHwKKwkJICAgIGJ1ZmZlcl9nZXRfc3RyaW5nX3B0cl9yZXQoJnRtcCwgTlVMTCkgPT0gTlVMTCkgeworCQkJZXJyb3IoIiVzOiBjcml0aWNhbCBvcHRpb24gZGF0YSBpbnZhbGlkIiwgX19mdW5jX18pOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJYnVmZmVyX2NsZWFyKCZ0bXApOworCisJYnVmZmVyX2FwcGVuZCgma2V5LT5jZXJ0LT5leHRlbnNpb25zLCBleHRzLCBlbGVuKTsKKwlidWZmZXJfYXBwZW5kKCZ0bXAsIGV4dHMsIGVsZW4pOworCS8qIHZhbGlkYXRlIHN0cnVjdHVyZSAqLworCXdoaWxlIChidWZmZXJfbGVuKCZ0bXApICE9IDApIHsKKwkJaWYgKGJ1ZmZlcl9nZXRfc3RyaW5nX3B0cl9yZXQoJnRtcCwgTlVMTCkgPT0gTlVMTCB8fAorCQkgICAgYnVmZmVyX2dldF9zdHJpbmdfcHRyX3JldCgmdG1wLCBOVUxMKSA9PSBOVUxMKSB7CisJCQllcnJvcigiJXM6IGV4dGVuc2lvbiBkYXRhIGludmFsaWQiLCBfX2Z1bmNfXyk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlidWZmZXJfY2xlYXIoJnRtcCk7CisKKwlpZiAoKGtleS0+Y2VydC0+c2lnbmF0dXJlX2tleSA9IGtleV9mcm9tX2Jsb2Ioc2lnX2tleSwKKwkgICAgc2tsZW4pKSA9PSBOVUxMKSB7CisJCWVycm9yKCIlczogU2lnbmF0dXJlIGtleSBpbnZhbGlkIiwgX19mdW5jX18pOworCQlnb3RvIG91dDsKKwl9CisJaWYgKGtleS0+Y2VydC0+c2lnbmF0dXJlX2tleS0+dHlwZSAhPSBLRVlfUlNBICYmCisJICAgIGtleS0+Y2VydC0+c2lnbmF0dXJlX2tleS0+dHlwZSAhPSBLRVlfRFNBICYmCisJICAgIGtleS0+Y2VydC0+c2lnbmF0dXJlX2tleS0+dHlwZSAhPSBLRVlfRUNEU0EpIHsKKwkJZXJyb3IoIiVzOiBJbnZhbGlkIHNpZ25hdHVyZSBrZXkgdHlwZSAlcyAoJWQpIiwgX19mdW5jX18sCisJCSAgICBrZXlfdHlwZShrZXktPmNlcnQtPnNpZ25hdHVyZV9rZXkpLAorCQkgICAga2V5LT5jZXJ0LT5zaWduYXR1cmVfa2V5LT50eXBlKTsKKwkJZ290byBvdXQ7CisJfQorCisJc3dpdGNoIChrZXlfdmVyaWZ5KGtleS0+Y2VydC0+c2lnbmF0dXJlX2tleSwgc2lnLCBzbGVuLCAKKwkgICAgYnVmZmVyX3B0cigma2V5LT5jZXJ0LT5jZXJ0YmxvYiksIHNpZ25lZF9sZW4pKSB7CisJY2FzZSAxOgorCQlyZXQgPSAwOworCQlicmVhazsgLyogR29vZCBzaWduYXR1cmUgKi8KKwljYXNlIDA6CisJCWVycm9yKCIlczogSW52YWxpZCBzaWduYXR1cmUgb24gY2VydGlmaWNhdGUiLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0OworCWNhc2UgLTE6CisJCWVycm9yKCIlczogQ2VydGlmaWNhdGUgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWQiLAorCQkgICAgX19mdW5jX18pOworCQlnb3RvIG91dDsKKwl9CisKKyBvdXQ6CisJYnVmZmVyX2ZyZWUoJnRtcCk7CisJaWYgKHByaW5jaXBhbHMgIT0gTlVMTCkKKwkJeGZyZWUocHJpbmNpcGFscyk7CisJaWYgKGNyaXRpY2FsICE9IE5VTEwpCisJCXhmcmVlKGNyaXRpY2FsKTsKKwlpZiAoZXh0cyAhPSBOVUxMKQorCQl4ZnJlZShleHRzKTsKKwlpZiAoc2lnX2tleSAhPSBOVUxMKQorCQl4ZnJlZShzaWdfa2V5KTsKKwlpZiAoc2lnICE9IE5VTEwpCisJCXhmcmVlKHNpZyk7CisJcmV0dXJuIHJldDsKK30KKworS2V5ICoKK2tleV9mcm9tX2Jsb2IoY29uc3QgdV9jaGFyICpibG9iLCB1X2ludCBibGVuKQoreworCUJ1ZmZlciBiOworCWludCBybGVuLCB0eXBlOworCWNoYXIgKmt0eXBlID0gTlVMTCwgKmN1cnZlID0gTlVMTDsKKwlLZXkgKmtleSA9IE5VTEw7CisjaWZkZWYgT1BFTlNTTF9IQVNfRUNDCisJRUNfUE9JTlQgKnEgPSBOVUxMOworCWludCBuaWQgPSAtMTsKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfUEsKKwlkdW1wX2Jhc2U2NChzdGRlcnIsIGJsb2IsIGJsZW4pOworI2VuZGlmCisJYnVmZmVyX2luaXQoJmIpOworCWJ1ZmZlcl9hcHBlbmQoJmIsIGJsb2IsIGJsZW4pOworCWlmICgoa3R5cGUgPSBidWZmZXJfZ2V0X2NzdHJpbmdfcmV0KCZiLCBOVUxMKSkgPT0gTlVMTCkgeworCQllcnJvcigia2V5X2Zyb21fYmxvYjogY2FuJ3QgcmVhZCBrZXkgdHlwZSIpOworCQlnb3RvIG91dDsKKwl9CisKKwl0eXBlID0ga2V5X3R5cGVfZnJvbV9uYW1lKGt0eXBlKTsKKyNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKKwlpZiAoa2V5X3R5cGVfcGxhaW4odHlwZSkgPT0gS0VZX0VDRFNBKQorCQluaWQgPSBrZXlfZWNkc2FfbmlkX2Zyb21fbmFtZShrdHlwZSk7CisjZW5kaWYKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgS0VZX1JTQV9DRVJUOgorCQkodm9pZClidWZmZXJfZ2V0X3N0cmluZ19wdHJfcmV0KCZiLCBOVUxMKTsgLyogU2tpcCBub25jZSAqLworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgS0VZX1JTQToKKwljYXNlIEtFWV9SU0FfQ0VSVF9WMDA6CisJCWtleSA9IGtleV9uZXcodHlwZSk7CisJCWlmIChidWZmZXJfZ2V0X2JpZ251bTJfcmV0KCZiLCBrZXktPnJzYS0+ZSkgPT0gLTEgfHwKKwkJICAgIGJ1ZmZlcl9nZXRfYmlnbnVtMl9yZXQoJmIsIGtleS0+cnNhLT5uKSA9PSAtMSkgeworCQkJZXJyb3IoImtleV9mcm9tX2Jsb2I6IGNhbid0IHJlYWQgcnNhIGtleSIpOworIGJhZGtleToKKwkJCWtleV9mcmVlKGtleSk7CisJCQlrZXkgPSBOVUxMOworCQkJZ290byBvdXQ7CisJCX0KKyNpZmRlZiBERUJVR19QSworCQlSU0FfcHJpbnRfZnAoc3RkZXJyLCBrZXktPnJzYSwgOCk7CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSBLRVlfRFNBX0NFUlQ6CisJCSh2b2lkKWJ1ZmZlcl9nZXRfc3RyaW5nX3B0cl9yZXQoJmIsIE5VTEwpOyAvKiBTa2lwIG5vbmNlICovCisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSBLRVlfRFNBOgorCWNhc2UgS0VZX0RTQV9DRVJUX1YwMDoKKwkJa2V5ID0ga2V5X25ldyh0eXBlKTsKKwkJaWYgKGJ1ZmZlcl9nZXRfYmlnbnVtMl9yZXQoJmIsIGtleS0+ZHNhLT5wKSA9PSAtMSB8fAorCQkgICAgYnVmZmVyX2dldF9iaWdudW0yX3JldCgmYiwga2V5LT5kc2EtPnEpID09IC0xIHx8CisJCSAgICBidWZmZXJfZ2V0X2JpZ251bTJfcmV0KCZiLCBrZXktPmRzYS0+ZykgPT0gLTEgfHwKKwkJICAgIGJ1ZmZlcl9nZXRfYmlnbnVtMl9yZXQoJmIsIGtleS0+ZHNhLT5wdWJfa2V5KSA9PSAtMSkgeworCQkJZXJyb3IoImtleV9mcm9tX2Jsb2I6IGNhbid0IHJlYWQgZHNhIGtleSIpOworCQkJZ290byBiYWRrZXk7CisJCX0KKyNpZmRlZiBERUJVR19QSworCQlEU0FfcHJpbnRfZnAoc3RkZXJyLCBrZXktPmRzYSwgOCk7CisjZW5kaWYKKwkJYnJlYWs7CisjaWZkZWYgT1BFTlNTTF9IQVNfRUNDCisJY2FzZSBLRVlfRUNEU0FfQ0VSVDoKKwkJKHZvaWQpYnVmZmVyX2dldF9zdHJpbmdfcHRyX3JldCgmYiwgTlVMTCk7IC8qIFNraXAgbm9uY2UgKi8KKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIEtFWV9FQ0RTQToKKwkJa2V5ID0ga2V5X25ldyh0eXBlKTsKKwkJa2V5LT5lY2RzYV9uaWQgPSBuaWQ7CisJCWlmICgoY3VydmUgPSBidWZmZXJfZ2V0X3N0cmluZ19yZXQoJmIsIE5VTEwpKSA9PSBOVUxMKSB7CisJCQllcnJvcigia2V5X2Zyb21fYmxvYjogY2FuJ3QgcmVhZCBlY2RzYSBjdXJ2ZSIpOworCQkJZ290byBiYWRrZXk7CisJCX0KKwkJaWYgKGtleS0+ZWNkc2FfbmlkICE9IGtleV9jdXJ2ZV9uYW1lX3RvX25pZChjdXJ2ZSkpIHsKKwkJCWVycm9yKCJrZXlfZnJvbV9ibG9iOiBlY2RzYSBjdXJ2ZSBkb2Vzbid0IG1hdGNoIHR5cGUiKTsKKwkJCWdvdG8gYmFka2V5OworCQl9CisJCWlmIChrZXktPmVjZHNhICE9IE5VTEwpCisJCQlFQ19LRVlfZnJlZShrZXktPmVjZHNhKTsKKwkJaWYgKChrZXktPmVjZHNhID0gRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lKGtleS0+ZWNkc2FfbmlkKSkKKwkJICAgID09IE5VTEwpCisJCQlmYXRhbCgia2V5X2Zyb21fYmxvYjogRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lIGZhaWxlZCIpOworCQlpZiAoKHEgPSBFQ19QT0lOVF9uZXcoRUNfS0VZX2dldDBfZ3JvdXAoa2V5LT5lY2RzYSkpKSA9PSBOVUxMKQorCQkJZmF0YWwoImtleV9mcm9tX2Jsb2I6IEVDX1BPSU5UX25ldyBmYWlsZWQiKTsKKwkJaWYgKGJ1ZmZlcl9nZXRfZWNwb2ludF9yZXQoJmIsIEVDX0tFWV9nZXQwX2dyb3VwKGtleS0+ZWNkc2EpLAorCQkgICAgcSkgPT0gLTEpIHsKKwkJCWVycm9yKCJrZXlfZnJvbV9ibG9iOiBjYW4ndCByZWFkIGVjZHNhIGtleSBwb2ludCIpOworCQkJZ290byBiYWRrZXk7CisJCX0KKwkJaWYgKGtleV9lY192YWxpZGF0ZV9wdWJsaWMoRUNfS0VZX2dldDBfZ3JvdXAoa2V5LT5lY2RzYSksCisJCSAgICBxKSAhPSAwKQorCQkJZ290byBiYWRrZXk7CisJCWlmIChFQ19LRVlfc2V0X3B1YmxpY19rZXkoa2V5LT5lY2RzYSwgcSkgIT0gMSkKKwkJCWZhdGFsKCJrZXlfZnJvbV9ibG9iOiBFQ19LRVlfc2V0X3B1YmxpY19rZXkgZmFpbGVkIik7CisjaWZkZWYgREVCVUdfUEsKKwkJa2V5X2R1bXBfZWNfcG9pbnQoRUNfS0VZX2dldDBfZ3JvdXAoa2V5LT5lY2RzYSksIHEpOworI2VuZGlmCisJCWJyZWFrOworI2VuZGlmIC8qIE9QRU5TU0xfSEFTX0VDQyAqLworCWNhc2UgS0VZX1VOU1BFQzoKKwkJa2V5ID0ga2V5X25ldyh0eXBlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyb3IoImtleV9mcm9tX2Jsb2I6IGNhbm5vdCBoYW5kbGUgdHlwZSAlcyIsIGt0eXBlKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChrZXlfaXNfY2VydChrZXkpICYmIGNlcnRfcGFyc2UoJmIsIGtleSwgYmxvYiwgYmxlbikgPT0gLTEpIHsKKwkJZXJyb3IoImtleV9mcm9tX2Jsb2I6IGNhbid0IHBhcnNlIGNlcnQgZGF0YSIpOworCQlnb3RvIGJhZGtleTsKKwl9CisJcmxlbiA9IGJ1ZmZlcl9sZW4oJmIpOworCWlmIChrZXkgIT0gTlVMTCAmJiBybGVuICE9IDApCisJCWVycm9yKCJrZXlfZnJvbV9ibG9iOiByZW1haW5pbmcgYnl0ZXMgaW4ga2V5IGJsb2IgJWQiLCBybGVuKTsKKyBvdXQ6CisJaWYgKGt0eXBlICE9IE5VTEwpCisJCXhmcmVlKGt0eXBlKTsKKwlpZiAoY3VydmUgIT0gTlVMTCkKKwkJeGZyZWUoY3VydmUpOworI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworCWlmIChxICE9IE5VTEwpCisJCUVDX1BPSU5UX2ZyZWUocSk7CisjZW5kaWYKKwlidWZmZXJfZnJlZSgmYik7CisJcmV0dXJuIGtleTsKK30KKworaW50CitrZXlfdG9fYmxvYihjb25zdCBLZXkgKmtleSwgdV9jaGFyICoqYmxvYnAsIHVfaW50ICpsZW5wKQoreworCUJ1ZmZlciBiOworCWludCBsZW47CisKKwlpZiAoa2V5ID09IE5VTEwpIHsKKwkJZXJyb3IoImtleV90b19ibG9iOiBrZXkgPT0gTlVMTCIpOworCQlyZXR1cm4gMDsKKwl9CisJYnVmZmVyX2luaXQoJmIpOworCXN3aXRjaCAoa2V5LT50eXBlKSB7CisJY2FzZSBLRVlfRFNBX0NFUlRfVjAwOgorCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKKwljYXNlIEtFWV9EU0FfQ0VSVDoKKwljYXNlIEtFWV9FQ0RTQV9DRVJUOgorCWNhc2UgS0VZX1JTQV9DRVJUOgorCQkvKiBVc2UgdGhlIGV4aXN0aW5nIGJsb2IgKi8KKwkJYnVmZmVyX2FwcGVuZCgmYiwgYnVmZmVyX3B0cigma2V5LT5jZXJ0LT5jZXJ0YmxvYiksCisJCSAgICBidWZmZXJfbGVuKCZrZXktPmNlcnQtPmNlcnRibG9iKSk7CisJCWJyZWFrOworCWNhc2UgS0VZX0RTQToKKwkJYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBrZXlfc3NoX25hbWUoa2V5KSk7CisJCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYiwga2V5LT5kc2EtPnApOworCQlidWZmZXJfcHV0X2JpZ251bTIoJmIsIGtleS0+ZHNhLT5xKTsKKwkJYnVmZmVyX3B1dF9iaWdudW0yKCZiLCBrZXktPmRzYS0+Zyk7CisJCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYiwga2V5LT5kc2EtPnB1Yl9rZXkpOworCQlicmVhazsKKyNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKKwljYXNlIEtFWV9FQ0RTQToKKwkJYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBrZXlfc3NoX25hbWUoa2V5KSk7CisJCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwga2V5X2N1cnZlX25pZF90b19uYW1lKGtleS0+ZWNkc2FfbmlkKSk7CisJCWJ1ZmZlcl9wdXRfZWNwb2ludCgmYiwgRUNfS0VZX2dldDBfZ3JvdXAoa2V5LT5lY2RzYSksCisJCSAgICBFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KGtleS0+ZWNkc2EpKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIEtFWV9SU0E6CisJCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwga2V5X3NzaF9uYW1lKGtleSkpOworCQlidWZmZXJfcHV0X2JpZ251bTIoJmIsIGtleS0+cnNhLT5lKTsKKwkJYnVmZmVyX3B1dF9iaWdudW0yKCZiLCBrZXktPnJzYS0+bik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycm9yKCJrZXlfdG9fYmxvYjogdW5zdXBwb3J0ZWQga2V5IHR5cGUgJWQiLCBrZXktPnR5cGUpOworCQlidWZmZXJfZnJlZSgmYik7CisJCXJldHVybiAwOworCX0KKwlsZW4gPSBidWZmZXJfbGVuKCZiKTsKKwlpZiAobGVucCAhPSBOVUxMKQorCQkqbGVucCA9IGxlbjsKKwlpZiAoYmxvYnAgIT0gTlVMTCkgeworCQkqYmxvYnAgPSB4bWFsbG9jKGxlbik7CisJCW1lbWNweSgqYmxvYnAsIGJ1ZmZlcl9wdHIoJmIpLCBsZW4pOworCX0KKwltZW1zZXQoYnVmZmVyX3B0cigmYiksIDAsIGxlbik7CisJYnVmZmVyX2ZyZWUoJmIpOworCXJldHVybiBsZW47Cit9CisKK2ludAora2V5X3NpZ24oCisgICAgY29uc3QgS2V5ICprZXksCisgICAgdV9jaGFyICoqc2lncCwgdV9pbnQgKmxlbnAsCisgICAgY29uc3QgdV9jaGFyICpkYXRhLCB1X2ludCBkYXRhbGVuKQoreworCXN3aXRjaCAoa2V5LT50eXBlKSB7CisJY2FzZSBLRVlfRFNBX0NFUlRfVjAwOgorCWNhc2UgS0VZX0RTQV9DRVJUOgorCWNhc2UgS0VZX0RTQToKKwkJcmV0dXJuIHNzaF9kc3Nfc2lnbihrZXksIHNpZ3AsIGxlbnAsIGRhdGEsIGRhdGFsZW4pOworI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworCWNhc2UgS0VZX0VDRFNBX0NFUlQ6CisJY2FzZSBLRVlfRUNEU0E6CisJCXJldHVybiBzc2hfZWNkc2Ffc2lnbihrZXksIHNpZ3AsIGxlbnAsIGRhdGEsIGRhdGFsZW4pOworI2VuZGlmCisJY2FzZSBLRVlfUlNBX0NFUlRfVjAwOgorCWNhc2UgS0VZX1JTQV9DRVJUOgorCWNhc2UgS0VZX1JTQToKKwkJcmV0dXJuIHNzaF9yc2Ffc2lnbihrZXksIHNpZ3AsIGxlbnAsIGRhdGEsIGRhdGFsZW4pOworCWRlZmF1bHQ6CisJCWVycm9yKCJrZXlfc2lnbjogaW52YWxpZCBrZXkgdHlwZSAlZCIsIGtleS0+dHlwZSk7CisJCXJldHVybiAtMTsKKwl9Cit9CisKKy8qCisgKiBrZXlfdmVyaWZ5IHJldHVybnMgMSBmb3IgYSBjb3JyZWN0IHNpZ25hdHVyZSwgMCBmb3IgYW4gaW5jb3JyZWN0IHNpZ25hdHVyZQorICogYW5kIC0xIG9uIGVycm9yLgorICovCitpbnQKK2tleV92ZXJpZnkoCisgICAgY29uc3QgS2V5ICprZXksCisgICAgY29uc3QgdV9jaGFyICpzaWduYXR1cmUsIHVfaW50IHNpZ25hdHVyZWxlbiwKKyAgICBjb25zdCB1X2NoYXIgKmRhdGEsIHVfaW50IGRhdGFsZW4pCit7CisJaWYgKHNpZ25hdHVyZWxlbiA9PSAwKQorCQlyZXR1cm4gLTE7CisKKwlzd2l0Y2ggKGtleS0+dHlwZSkgeworCWNhc2UgS0VZX0RTQV9DRVJUX1YwMDoKKwljYXNlIEtFWV9EU0FfQ0VSVDoKKwljYXNlIEtFWV9EU0E6CisJCXJldHVybiBzc2hfZHNzX3ZlcmlmeShrZXksIHNpZ25hdHVyZSwgc2lnbmF0dXJlbGVuLCBkYXRhLCBkYXRhbGVuKTsKKyNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKKwljYXNlIEtFWV9FQ0RTQV9DRVJUOgorCWNhc2UgS0VZX0VDRFNBOgorCQlyZXR1cm4gc3NoX2VjZHNhX3ZlcmlmeShrZXksIHNpZ25hdHVyZSwgc2lnbmF0dXJlbGVuLCBkYXRhLCBkYXRhbGVuKTsKKyNlbmRpZgorCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKKwljYXNlIEtFWV9SU0FfQ0VSVDoKKwljYXNlIEtFWV9SU0E6CisJCXJldHVybiBzc2hfcnNhX3ZlcmlmeShrZXksIHNpZ25hdHVyZSwgc2lnbmF0dXJlbGVuLCBkYXRhLCBkYXRhbGVuKTsKKwlkZWZhdWx0OgorCQllcnJvcigia2V5X3ZlcmlmeTogaW52YWxpZCBrZXkgdHlwZSAlZCIsIGtleS0+dHlwZSk7CisJCXJldHVybiAtMTsKKwl9Cit9CisKKy8qIENvbnZlcnRzIGEgcHJpdmF0ZSB0byBhIHB1YmxpYyBrZXkgKi8KK0tleSAqCitrZXlfZGVtb3RlKGNvbnN0IEtleSAqaykKK3sKKwlLZXkgKnBrOworCisJcGsgPSB4Y2FsbG9jKDEsIHNpemVvZigqcGspKTsKKwlway0+dHlwZSA9IGstPnR5cGU7CisJcGstPmZsYWdzID0gay0+ZmxhZ3M7CisJcGstPmVjZHNhX25pZCA9IGstPmVjZHNhX25pZDsKKwlway0+ZHNhID0gTlVMTDsKKwlway0+ZWNkc2EgPSBOVUxMOworCXBrLT5yc2EgPSBOVUxMOworCisJc3dpdGNoIChrLT50eXBlKSB7CisJY2FzZSBLRVlfUlNBX0NFUlRfVjAwOgorCWNhc2UgS0VZX1JTQV9DRVJUOgorCQlrZXlfY2VydF9jb3B5KGssIHBrKTsKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIEtFWV9SU0ExOgorCWNhc2UgS0VZX1JTQToKKwkJaWYgKChway0+cnNhID0gUlNBX25ldygpKSA9PSBOVUxMKQorCQkJZmF0YWwoImtleV9kZW1vdGU6IFJTQV9uZXcgZmFpbGVkIik7CisJCWlmICgocGstPnJzYS0+ZSA9IEJOX2R1cChrLT5yc2EtPmUpKSA9PSBOVUxMKQorCQkJZmF0YWwoImtleV9kZW1vdGU6IEJOX2R1cCBmYWlsZWQiKTsKKwkJaWYgKChway0+cnNhLT5uID0gQk5fZHVwKGstPnJzYS0+bikpID09IE5VTEwpCisJCQlmYXRhbCgia2V5X2RlbW90ZTogQk5fZHVwIGZhaWxlZCIpOworCQlicmVhazsKKwljYXNlIEtFWV9EU0FfQ0VSVF9WMDA6CisJY2FzZSBLRVlfRFNBX0NFUlQ6CisJCWtleV9jZXJ0X2NvcHkoaywgcGspOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgS0VZX0RTQToKKwkJaWYgKChway0+ZHNhID0gRFNBX25ldygpKSA9PSBOVUxMKQorCQkJZmF0YWwoImtleV9kZW1vdGU6IERTQV9uZXcgZmFpbGVkIik7CisJCWlmICgocGstPmRzYS0+cCA9IEJOX2R1cChrLT5kc2EtPnApKSA9PSBOVUxMKQorCQkJZmF0YWwoImtleV9kZW1vdGU6IEJOX2R1cCBmYWlsZWQiKTsKKwkJaWYgKChway0+ZHNhLT5xID0gQk5fZHVwKGstPmRzYS0+cSkpID09IE5VTEwpCisJCQlmYXRhbCgia2V5X2RlbW90ZTogQk5fZHVwIGZhaWxlZCIpOworCQlpZiAoKHBrLT5kc2EtPmcgPSBCTl9kdXAoay0+ZHNhLT5nKSkgPT0gTlVMTCkKKwkJCWZhdGFsKCJrZXlfZGVtb3RlOiBCTl9kdXAgZmFpbGVkIik7CisJCWlmICgocGstPmRzYS0+cHViX2tleSA9IEJOX2R1cChrLT5kc2EtPnB1Yl9rZXkpKSA9PSBOVUxMKQorCQkJZmF0YWwoImtleV9kZW1vdGU6IEJOX2R1cCBmYWlsZWQiKTsKKwkJYnJlYWs7CisjaWZkZWYgT1BFTlNTTF9IQVNfRUNDCisJY2FzZSBLRVlfRUNEU0FfQ0VSVDoKKwkJa2V5X2NlcnRfY29weShrLCBwayk7CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSBLRVlfRUNEU0E6CisJCWlmICgocGstPmVjZHNhID0gRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lKHBrLT5lY2RzYV9uaWQpKSA9PSBOVUxMKQorCQkJZmF0YWwoImtleV9kZW1vdGU6IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZSBmYWlsZWQiKTsKKwkJaWYgKEVDX0tFWV9zZXRfcHVibGljX2tleShway0+ZWNkc2EsCisJCSAgICBFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KGstPmVjZHNhKSkgIT0gMSkKKwkJCWZhdGFsKCJrZXlfZGVtb3RlOiBFQ19LRVlfc2V0X3B1YmxpY19rZXkgZmFpbGVkIik7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJZmF0YWwoImtleV9mcmVlOiBiYWQga2V5IHR5cGUgJWQiLCBrLT50eXBlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIChwayk7Cit9CisKK2ludAora2V5X2lzX2NlcnQoY29uc3QgS2V5ICprKQoreworCWlmIChrID09IE5VTEwpCisJCXJldHVybiAwOworCXN3aXRjaCAoay0+dHlwZSkgeworCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKKwljYXNlIEtFWV9EU0FfQ0VSVF9WMDA6CisJY2FzZSBLRVlfUlNBX0NFUlQ6CisJY2FzZSBLRVlfRFNBX0NFUlQ6CisJY2FzZSBLRVlfRUNEU0FfQ0VSVDoKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKiBSZXR1cm4gdGhlIGNlcnQtbGVzcyBlcXVpdmFsZW50IHRvIGEgY2VydGlmaWVkIGtleSB0eXBlICovCitpbnQKK2tleV90eXBlX3BsYWluKGludCB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKKwljYXNlIEtFWV9SU0FfQ0VSVDoKKwkJcmV0dXJuIEtFWV9SU0E7CisJY2FzZSBLRVlfRFNBX0NFUlRfVjAwOgorCWNhc2UgS0VZX0RTQV9DRVJUOgorCQlyZXR1cm4gS0VZX0RTQTsKKwljYXNlIEtFWV9FQ0RTQV9DRVJUOgorCQlyZXR1cm4gS0VZX0VDRFNBOworCWRlZmF1bHQ6CisJCXJldHVybiB0eXBlOworCX0KK30KKworLyogQ29udmVydCBhIEtFWV9SU0Egb3IgS0VZX0RTQSB0byB0aGVpciBfQ0VSVCBlcXVpdmFsZW50ICovCitpbnQKK2tleV90b19jZXJ0aWZpZWQoS2V5ICprLCBpbnQgbGVnYWN5KQoreworCXN3aXRjaCAoay0+dHlwZSkgeworCWNhc2UgS0VZX1JTQToKKwkJay0+Y2VydCA9IGNlcnRfbmV3KCk7CisJCWstPnR5cGUgPSBsZWdhY3kgPyBLRVlfUlNBX0NFUlRfVjAwIDogS0VZX1JTQV9DRVJUOworCQlyZXR1cm4gMDsKKwljYXNlIEtFWV9EU0E6CisJCWstPmNlcnQgPSBjZXJ0X25ldygpOworCQlrLT50eXBlID0gbGVnYWN5ID8gS0VZX0RTQV9DRVJUX1YwMCA6IEtFWV9EU0FfQ0VSVDsKKwkJcmV0dXJuIDA7CisJY2FzZSBLRVlfRUNEU0E6CisJCWlmIChsZWdhY3kpCisJCQlmYXRhbCgiJXM6IGxlZ2FjeSBFQ0RTQSBjZXJ0aWZpY2F0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQiLAorCQkJICAgIF9fZnVuY19fKTsKKwkJay0+Y2VydCA9IGNlcnRfbmV3KCk7CisJCWstPnR5cGUgPSBLRVlfRUNEU0FfQ0VSVDsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJZXJyb3IoIiVzOiBrZXkgaGFzIGluY29ycmVjdCB0eXBlICVzIiwgX19mdW5jX18sIGtleV90eXBlKGspKTsKKwkJcmV0dXJuIC0xOworCX0KK30KKworLyogQ29udmVydCBhIEtFWV9SU0FfQ0VSVCBvciBLRVlfRFNBX0NFUlQgdG8gdGhlaXIgcmF3IGtleSBlcXVpdmFsZW50ICovCitpbnQKK2tleV9kcm9wX2NlcnQoS2V5ICprKQoreworCXN3aXRjaCAoay0+dHlwZSkgeworCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKKwljYXNlIEtFWV9SU0FfQ0VSVDoKKwkJY2VydF9mcmVlKGstPmNlcnQpOworCQlrLT50eXBlID0gS0VZX1JTQTsKKwkJcmV0dXJuIDA7CisJY2FzZSBLRVlfRFNBX0NFUlRfVjAwOgorCWNhc2UgS0VZX0RTQV9DRVJUOgorCQljZXJ0X2ZyZWUoay0+Y2VydCk7CisJCWstPnR5cGUgPSBLRVlfRFNBOworCQlyZXR1cm4gMDsKKwljYXNlIEtFWV9FQ0RTQV9DRVJUOgorCQljZXJ0X2ZyZWUoay0+Y2VydCk7CisJCWstPnR5cGUgPSBLRVlfRUNEU0E7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCWVycm9yKCIlczoga2V5IGhhcyBpbmNvcnJlY3QgdHlwZSAlcyIsIF9fZnVuY19fLCBrZXlfdHlwZShrKSk7CisJCXJldHVybiAtMTsKKwl9Cit9CisKKy8qCisgKiBTaWduIGEgS0VZX1JTQV9DRVJULCBLRVlfRFNBX0NFUlQgb3IgS0VZX0VDRFNBX0NFUlQsIChyZS0pZ2VuZXJhdGluZworICogdGhlIHNpZ25lZCBjZXJ0YmxvYgorICovCitpbnQKK2tleV9jZXJ0aWZ5KEtleSAqaywgS2V5ICpjYSkKK3sKKwlCdWZmZXIgcHJpbmNpcGFsczsKKwl1X2NoYXIgKmNhX2Jsb2IsICpzaWdfYmxvYiwgbm9uY2VbMzJdOworCXVfaW50IGksIGNhX2xlbiwgc2lnX2xlbjsKKworCWlmIChrLT5jZXJ0ID09IE5VTEwpIHsKKwkJZXJyb3IoIiVzOiBrZXkgbGFja3MgY2VydCBpbmZvIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCFrZXlfaXNfY2VydChrKSkgeworCQllcnJvcigiJXM6IGNlcnRpZmljYXRlIGhhcyB1bmtub3duIHR5cGUgJWQiLCBfX2Z1bmNfXywKKwkJICAgIGstPmNlcnQtPnR5cGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGNhLT50eXBlICE9IEtFWV9SU0EgJiYgY2EtPnR5cGUgIT0gS0VZX0RTQSAmJgorCSAgICBjYS0+dHlwZSAhPSBLRVlfRUNEU0EpIHsKKwkJZXJyb3IoIiVzOiBDQSBrZXkgaGFzIHVuc3VwcG9ydGVkIHR5cGUgJXMiLCBfX2Z1bmNfXywKKwkJICAgIGtleV90eXBlKGNhKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlrZXlfdG9fYmxvYihjYSwgJmNhX2Jsb2IsICZjYV9sZW4pOworCisJYnVmZmVyX2NsZWFyKCZrLT5jZXJ0LT5jZXJ0YmxvYik7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZrLT5jZXJ0LT5jZXJ0YmxvYiwga2V5X3NzaF9uYW1lKGspKTsKKworCS8qIC12MDEgY2VydHMgcHV0IG5vbmNlIGZpcnN0ICovCisJYXJjNHJhbmRvbV9idWYoJm5vbmNlLCBzaXplb2Yobm9uY2UpKTsKKwlpZiAoIWtleV9jZXJ0X2lzX2xlZ2FjeShrKSkKKwkJYnVmZmVyX3B1dF9zdHJpbmcoJmstPmNlcnQtPmNlcnRibG9iLCBub25jZSwgc2l6ZW9mKG5vbmNlKSk7CisKKwlzd2l0Y2ggKGstPnR5cGUpIHsKKwljYXNlIEtFWV9EU0FfQ0VSVF9WMDA6CisJY2FzZSBLRVlfRFNBX0NFUlQ6CisJCWJ1ZmZlcl9wdXRfYmlnbnVtMigmay0+Y2VydC0+Y2VydGJsb2IsIGstPmRzYS0+cCk7CisJCWJ1ZmZlcl9wdXRfYmlnbnVtMigmay0+Y2VydC0+Y2VydGJsb2IsIGstPmRzYS0+cSk7CisJCWJ1ZmZlcl9wdXRfYmlnbnVtMigmay0+Y2VydC0+Y2VydGJsb2IsIGstPmRzYS0+Zyk7CisJCWJ1ZmZlcl9wdXRfYmlnbnVtMigmay0+Y2VydC0+Y2VydGJsb2IsIGstPmRzYS0+cHViX2tleSk7CisJCWJyZWFrOworI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworCWNhc2UgS0VZX0VDRFNBX0NFUlQ6CisJCWJ1ZmZlcl9wdXRfY3N0cmluZygmay0+Y2VydC0+Y2VydGJsb2IsCisJCSAgICBrZXlfY3VydmVfbmlkX3RvX25hbWUoay0+ZWNkc2FfbmlkKSk7CisJCWJ1ZmZlcl9wdXRfZWNwb2ludCgmay0+Y2VydC0+Y2VydGJsb2IsCisJCSAgICBFQ19LRVlfZ2V0MF9ncm91cChrLT5lY2RzYSksCisJCSAgICBFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KGstPmVjZHNhKSk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBLRVlfUlNBX0NFUlRfVjAwOgorCWNhc2UgS0VZX1JTQV9DRVJUOgorCQlidWZmZXJfcHV0X2JpZ251bTIoJmstPmNlcnQtPmNlcnRibG9iLCBrLT5yc2EtPmUpOworCQlidWZmZXJfcHV0X2JpZ251bTIoJmstPmNlcnQtPmNlcnRibG9iLCBrLT5yc2EtPm4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJvcigiJXM6IGtleSBoYXMgaW5jb3JyZWN0IHR5cGUgJXMiLCBfX2Z1bmNfXywga2V5X3R5cGUoaykpOworCQlidWZmZXJfY2xlYXIoJmstPmNlcnQtPmNlcnRibG9iKTsKKwkJeGZyZWUoY2FfYmxvYik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiAtdjAxIGNlcnRzIGhhdmUgYSBzZXJpYWwgbnVtYmVyIG5leHQgKi8KKwlpZiAoIWtleV9jZXJ0X2lzX2xlZ2FjeShrKSkKKwkJYnVmZmVyX3B1dF9pbnQ2NCgmay0+Y2VydC0+Y2VydGJsb2IsIGstPmNlcnQtPnNlcmlhbCk7CisKKwlidWZmZXJfcHV0X2ludCgmay0+Y2VydC0+Y2VydGJsb2IsIGstPmNlcnQtPnR5cGUpOworCWJ1ZmZlcl9wdXRfY3N0cmluZygmay0+Y2VydC0+Y2VydGJsb2IsIGstPmNlcnQtPmtleV9pZCk7CisKKwlidWZmZXJfaW5pdCgmcHJpbmNpcGFscyk7CisJZm9yIChpID0gMDsgaSA8IGstPmNlcnQtPm5wcmluY2lwYWxzOyBpKyspCisJCWJ1ZmZlcl9wdXRfY3N0cmluZygmcHJpbmNpcGFscywgay0+Y2VydC0+cHJpbmNpcGFsc1tpXSk7CisJYnVmZmVyX3B1dF9zdHJpbmcoJmstPmNlcnQtPmNlcnRibG9iLCBidWZmZXJfcHRyKCZwcmluY2lwYWxzKSwKKwkgICAgYnVmZmVyX2xlbigmcHJpbmNpcGFscykpOworCWJ1ZmZlcl9mcmVlKCZwcmluY2lwYWxzKTsKKworCWJ1ZmZlcl9wdXRfaW50NjQoJmstPmNlcnQtPmNlcnRibG9iLCBrLT5jZXJ0LT52YWxpZF9hZnRlcik7CisJYnVmZmVyX3B1dF9pbnQ2NCgmay0+Y2VydC0+Y2VydGJsb2IsIGstPmNlcnQtPnZhbGlkX2JlZm9yZSk7CisJYnVmZmVyX3B1dF9zdHJpbmcoJmstPmNlcnQtPmNlcnRibG9iLAorCSAgICBidWZmZXJfcHRyKCZrLT5jZXJ0LT5jcml0aWNhbCksIGJ1ZmZlcl9sZW4oJmstPmNlcnQtPmNyaXRpY2FsKSk7CisKKwkvKiAtdjAxIGNlcnRzIGhhdmUgbm9uLWNyaXRpY2FsIG9wdGlvbnMgaGVyZSAqLworCWlmICgha2V5X2NlcnRfaXNfbGVnYWN5KGspKSB7CisJCWJ1ZmZlcl9wdXRfc3RyaW5nKCZrLT5jZXJ0LT5jZXJ0YmxvYiwKKwkJICAgIGJ1ZmZlcl9wdHIoJmstPmNlcnQtPmV4dGVuc2lvbnMpLAorCQkgICAgYnVmZmVyX2xlbigmay0+Y2VydC0+ZXh0ZW5zaW9ucykpOworCX0KKworCS8qIC12MDAgY2VydHMgcHV0IHRoZSBub25jZSBhdCB0aGUgZW5kICovCisJaWYgKGtleV9jZXJ0X2lzX2xlZ2FjeShrKSkKKwkJYnVmZmVyX3B1dF9zdHJpbmcoJmstPmNlcnQtPmNlcnRibG9iLCBub25jZSwgc2l6ZW9mKG5vbmNlKSk7CisKKwlidWZmZXJfcHV0X3N0cmluZygmay0+Y2VydC0+Y2VydGJsb2IsIE5VTEwsIDApOyAvKiByZXNlcnZlZCAqLworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZrLT5jZXJ0LT5jZXJ0YmxvYiwgY2FfYmxvYiwgY2FfbGVuKTsKKwl4ZnJlZShjYV9ibG9iKTsKKworCS8qIFNpZ24gdGhlIHdob2xlIG1lc3MgKi8KKwlpZiAoa2V5X3NpZ24oY2EsICZzaWdfYmxvYiwgJnNpZ19sZW4sIGJ1ZmZlcl9wdHIoJmstPmNlcnQtPmNlcnRibG9iKSwKKwkgICAgYnVmZmVyX2xlbigmay0+Y2VydC0+Y2VydGJsb2IpKSAhPSAwKSB7CisJCWVycm9yKCIlczogc2lnbmF0dXJlIG9wZXJhdGlvbiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCWJ1ZmZlcl9jbGVhcigmay0+Y2VydC0+Y2VydGJsb2IpOworCQlyZXR1cm4gLTE7CisJfQorCS8qIEFwcGVuZCBzaWduYXR1cmUgYW5kIHdlIGFyZSBkb25lICovCisJYnVmZmVyX3B1dF9zdHJpbmcoJmstPmNlcnQtPmNlcnRibG9iLCBzaWdfYmxvYiwgc2lnX2xlbik7CisJeGZyZWUoc2lnX2Jsb2IpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAora2V5X2NlcnRfY2hlY2tfYXV0aG9yaXR5KGNvbnN0IEtleSAqaywgaW50IHdhbnRfaG9zdCwgaW50IHJlcXVpcmVfcHJpbmNpcGFsLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKipyZWFzb24pCit7CisJdV9pbnQgaSwgcHJpbmNpcGFsX21hdGNoZXM7CisJdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisKKwlpZiAod2FudF9ob3N0KSB7CisJCWlmIChrLT5jZXJ0LT50eXBlICE9IFNTSDJfQ0VSVF9UWVBFX0hPU1QpIHsKKwkJCSpyZWFzb24gPSAiQ2VydGlmaWNhdGUgaW52YWxpZDogbm90IGEgaG9zdCBjZXJ0aWZpY2F0ZSI7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoay0+Y2VydC0+dHlwZSAhPSBTU0gyX0NFUlRfVFlQRV9VU0VSKSB7CisJCQkqcmVhc29uID0gIkNlcnRpZmljYXRlIGludmFsaWQ6IG5vdCBhIHVzZXIgY2VydGlmaWNhdGUiOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCWlmIChub3cgPCAwKSB7CisJCWVycm9yKCIlczogc3lzdGVtIGNsb2NrIGxpZXMgYmVmb3JlIGVwb2NoIiwgX19mdW5jX18pOworCQkqcmVhc29uID0gIkNlcnRpZmljYXRlIGludmFsaWQ6IG5vdCB5ZXQgdmFsaWQiOworCQlyZXR1cm4gLTE7CisJfQorCWlmICgodV9pbnQ2NF90KW5vdyA8IGstPmNlcnQtPnZhbGlkX2FmdGVyKSB7CisJCSpyZWFzb24gPSAiQ2VydGlmaWNhdGUgaW52YWxpZDogbm90IHlldCB2YWxpZCI7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKCh1X2ludDY0X3Qpbm93ID49IGstPmNlcnQtPnZhbGlkX2JlZm9yZSkgeworCQkqcmVhc29uID0gIkNlcnRpZmljYXRlIGludmFsaWQ6IGV4cGlyZWQiOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChrLT5jZXJ0LT5ucHJpbmNpcGFscyA9PSAwKSB7CisJCWlmIChyZXF1aXJlX3ByaW5jaXBhbCkgeworCQkJKnJlYXNvbiA9ICJDZXJ0aWZpY2F0ZSBsYWNrcyBwcmluY2lwYWwgbGlzdCI7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IGVsc2UgaWYgKG5hbWUgIT0gTlVMTCkgeworCQlwcmluY2lwYWxfbWF0Y2hlcyA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBrLT5jZXJ0LT5ucHJpbmNpcGFsczsgaSsrKSB7CisJCQlpZiAoc3RyY21wKG5hbWUsIGstPmNlcnQtPnByaW5jaXBhbHNbaV0pID09IDApIHsKKwkJCQlwcmluY2lwYWxfbWF0Y2hlcyA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCFwcmluY2lwYWxfbWF0Y2hlcykgeworCQkJKnJlYXNvbiA9ICJDZXJ0aWZpY2F0ZSBpbnZhbGlkOiBuYW1lIGlzIG5vdCBhIGxpc3RlZCAiCisJCQkgICAgInByaW5jaXBhbCI7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludAora2V5X2NlcnRfaXNfbGVnYWN5KEtleSAqaykKK3sKKwlzd2l0Y2ggKGstPnR5cGUpIHsKKwljYXNlIEtFWV9EU0FfQ0VSVF9WMDA6CisJY2FzZSBLRVlfUlNBX0NFUlRfVjAwOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qIFhYWDogdGhlc2UgYXJlIHJlYWxseSBiZWdnaW5nIGZvciBhIHRhYmxlLWRyaXZlbiBhcHByb2FjaCAqLworaW50CitrZXlfY3VydmVfbmFtZV90b19uaWQoY29uc3QgY2hhciAqbmFtZSkKK3sKKyNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKKwlpZiAoc3RyY21wKG5hbWUsICJuaXN0cDI1NiIpID09IDApCisJCXJldHVybiBOSURfWDlfNjJfcHJpbWUyNTZ2MTsKKwllbHNlIGlmIChzdHJjbXAobmFtZSwgIm5pc3RwMzg0IikgPT0gMCkKKwkJcmV0dXJuIE5JRF9zZWNwMzg0cjE7CisJZWxzZSBpZiAoc3RyY21wKG5hbWUsICJuaXN0cDUyMSIpID09IDApCisJCXJldHVybiBOSURfc2VjcDUyMXIxOworI2VuZGlmCisKKwlkZWJ1ZygiJXM6IHVuc3VwcG9ydGVkIEVDIGN1cnZlIG5hbWUgXCIlLjEwMHNcIiIsIF9fZnVuY19fLCBuYW1lKTsKKwlyZXR1cm4gLTE7Cit9CisKK3VfaW50CitrZXlfY3VydmVfbmlkX3RvX2JpdHMoaW50IG5pZCkKK3sKKwlzd2l0Y2ggKG5pZCkgeworI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworCWNhc2UgTklEX1g5XzYyX3ByaW1lMjU2djE6CisJCXJldHVybiAyNTY7CisJY2FzZSBOSURfc2VjcDM4NHIxOgorCQlyZXR1cm4gMzg0OworCWNhc2UgTklEX3NlY3A1MjFyMToKKwkJcmV0dXJuIDUyMTsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCWVycm9yKCIlczogdW5zdXBwb3J0ZWQgRUMgY3VydmUgbmlkICVkIiwgX19mdW5jX18sIG5pZCk7CisJCXJldHVybiAwOworCX0KK30KKworY29uc3QgY2hhciAqCitrZXlfY3VydmVfbmlkX3RvX25hbWUoaW50IG5pZCkKK3sKKyNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKKwlpZiAobmlkID09IE5JRF9YOV82Ml9wcmltZTI1NnYxKQorCQlyZXR1cm4gIm5pc3RwMjU2IjsKKwllbHNlIGlmIChuaWQgPT0gTklEX3NlY3AzODRyMSkKKwkJcmV0dXJuICJuaXN0cDM4NCI7CisJZWxzZSBpZiAobmlkID09IE5JRF9zZWNwNTIxcjEpCisJCXJldHVybiAibmlzdHA1MjEiOworI2VuZGlmCisJZXJyb3IoIiVzOiB1bnN1cHBvcnRlZCBFQyBjdXJ2ZSBuaWQgJWQiLCBfX2Z1bmNfXywgbmlkKTsKKwlyZXR1cm4gTlVMTDsKK30KKworI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworY29uc3QgRVZQX01EICoKK2tleV9lY19uaWRfdG9fZXZwbWQoaW50IG5pZCkKK3sKKwlpbnQga2JpdHMgPSBrZXlfY3VydmVfbmlkX3RvX2JpdHMobmlkKTsKKworCWlmIChrYml0cyA9PSAwKQorCQlmYXRhbCgiJXM6IGludmFsaWQgbmlkICVkIiwgX19mdW5jX18sIG5pZCk7CisJLyogUkZDNTY1NiBzZWN0aW9uIDYuMi4xICovCisJaWYgKGtiaXRzIDw9IDI1NikKKwkJcmV0dXJuIEVWUF9zaGEyNTYoKTsKKwllbHNlIGlmIChrYml0cyA8PSAzODQpCisJCXJldHVybiBFVlBfc2hhMzg0KCk7CisJZWxzZQorCQlyZXR1cm4gRVZQX3NoYTUxMigpOworfQorCitpbnQKK2tleV9lY192YWxpZGF0ZV9wdWJsaWMoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBFQ19QT0lOVCAqcHVibGljKQoreworCUJOX0NUWCAqYm5jdHg7CisJRUNfUE9JTlQgKm5xID0gTlVMTDsKKwlCSUdOVU0gKm9yZGVyLCAqeCwgKnksICp0bXA7CisJaW50IHJldCA9IC0xOworCisJaWYgKChibmN0eCA9IEJOX0NUWF9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBCTl9DVFhfbmV3IGZhaWxlZCIsIF9fZnVuY19fKTsKKwlCTl9DVFhfc3RhcnQoYm5jdHgpOworCisJLyoKKwkgKiBXZSBzaG91bGRuJ3QgZXZlciBoaXQgdGhpcyBjYXNlIGJlY2F1c2UgYmlnbnVtX2dldF9lY3BvaW50KCkKKwkgKiByZWZ1c2VzIHRvIGxvYWQgR0YybSBwb2ludHMuCisJICovCisJaWYgKEVDX01FVEhPRF9nZXRfZmllbGRfdHlwZShFQ19HUk9VUF9tZXRob2Rfb2YoZ3JvdXApKSAhPQorCSAgICBOSURfWDlfNjJfcHJpbWVfZmllbGQpIHsKKwkJZXJyb3IoIiVzOiBncm91cCBpcyBub3QgYSBwcmltZSBmaWVsZCIsIF9fZnVuY19fKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogUSAhPSBpbmZpbml0eSAqLworCWlmIChFQ19QT0lOVF9pc19hdF9pbmZpbml0eShncm91cCwgcHVibGljKSkgeworCQllcnJvcigiJXM6IHJlY2VpdmVkIGRlZ2VuZXJhdGUgcHVibGljIGtleSAoaW5maW5pdHkpIiwKKwkJICAgIF9fZnVuY19fKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCh4ID0gQk5fQ1RYX2dldChibmN0eCkpID09IE5VTEwgfHwKKwkgICAgKHkgPSBCTl9DVFhfZ2V0KGJuY3R4KSkgPT0gTlVMTCB8fAorCSAgICAob3JkZXIgPSBCTl9DVFhfZ2V0KGJuY3R4KSkgPT0gTlVMTCB8fAorCSAgICAodG1wID0gQk5fQ1RYX2dldChibmN0eCkpID09IE5VTEwpCisJCWZhdGFsKCIlczogQk5fQ1RYX2dldCBmYWlsZWQiLCBfX2Z1bmNfXyk7CisKKwkvKiBsb2cyKHgpID4gbG9nMihvcmRlcikvMiwgbG9nMih5KSA+IGxvZzIob3JkZXIpLzIgKi8KKwlpZiAoRUNfR1JPVVBfZ2V0X29yZGVyKGdyb3VwLCBvcmRlciwgYm5jdHgpICE9IDEpCisJCWZhdGFsKCIlczogRUNfR1JPVVBfZ2V0X29yZGVyIGZhaWxlZCIsIF9fZnVuY19fKTsKKwlpZiAoRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAoZ3JvdXAsIHB1YmxpYywKKwkgICAgeCwgeSwgYm5jdHgpICE9IDEpCisJCWZhdGFsKCIlczogRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAiLCBfX2Z1bmNfXyk7CisJaWYgKEJOX251bV9iaXRzKHgpIDw9IEJOX251bV9iaXRzKG9yZGVyKSAvIDIpIHsKKwkJZXJyb3IoIiVzOiBwdWJsaWMga2V5IHggY29vcmRpbmF0ZSB0b28gc21hbGw6ICIKKwkJICAgICJiaXRzKHgpID0gJWQsIGJpdHMob3JkZXIpLzIgPSAlZCIsIF9fZnVuY19fLAorCQkgICAgQk5fbnVtX2JpdHMoeCksIEJOX251bV9iaXRzKG9yZGVyKSAvIDIpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKEJOX251bV9iaXRzKHkpIDw9IEJOX251bV9iaXRzKG9yZGVyKSAvIDIpIHsKKwkJZXJyb3IoIiVzOiBwdWJsaWMga2V5IHkgY29vcmRpbmF0ZSB0b28gc21hbGw6ICIKKwkJICAgICJiaXRzKHkpID0gJWQsIGJpdHMob3JkZXIpLzIgPSAlZCIsIF9fZnVuY19fLAorCQkgICAgQk5fbnVtX2JpdHMoeCksIEJOX251bV9iaXRzKG9yZGVyKSAvIDIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBuUSA9PSBpbmZpbml0eSAobiA9PSBvcmRlciBvZiBzdWJncm91cCkgKi8KKwlpZiAoKG5xID0gRUNfUE9JTlRfbmV3KGdyb3VwKSkgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBCTl9DVFhfdG1wIGZhaWxlZCIsIF9fZnVuY19fKTsKKwlpZiAoRUNfUE9JTlRfbXVsKGdyb3VwLCBucSwgTlVMTCwgcHVibGljLCBvcmRlciwgYm5jdHgpICE9IDEpCisJCWZhdGFsKCIlczogRUNfR1JPVVBfbXVsIGZhaWxlZCIsIF9fZnVuY19fKTsKKwlpZiAoRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIG5xKSAhPSAxKSB7CisJCWVycm9yKCIlczogcmVjZWl2ZWQgZGVnZW5lcmF0ZSBwdWJsaWMga2V5IChuUSAhPSBpbmZpbml0eSkiLAorCQkgICAgX19mdW5jX18pOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiB4IDwgb3JkZXIgLSAxLCB5IDwgb3JkZXIgLSAxICovCisJaWYgKCFCTl9zdWIodG1wLCBvcmRlciwgQk5fdmFsdWVfb25lKCkpKQorCQlmYXRhbCgiJXM6IEJOX3N1YiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJaWYgKEJOX2NtcCh4LCB0bXApID49IDApIHsKKwkJZXJyb3IoIiVzOiBwdWJsaWMga2V5IHggY29vcmRpbmF0ZSA+PSBncm91cCBvcmRlciAtIDEiLAorCQkgICAgX19mdW5jX18pOworCQlnb3RvIG91dDsKKwl9CisJaWYgKEJOX2NtcCh5LCB0bXApID49IDApIHsKKwkJZXJyb3IoIiVzOiBwdWJsaWMga2V5IHkgY29vcmRpbmF0ZSA+PSBncm91cCBvcmRlciAtIDEiLAorCQkgICAgX19mdW5jX18pOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gMDsKKyBvdXQ6CisJQk5fQ1RYX2ZyZWUoYm5jdHgpOworCUVDX1BPSU5UX2ZyZWUobnEpOworCXJldHVybiByZXQ7Cit9CisKK2ludAora2V5X2VjX3ZhbGlkYXRlX3ByaXZhdGUoY29uc3QgRUNfS0VZICprZXkpCit7CisJQk5fQ1RYICpibmN0eDsKKwlCSUdOVU0gKm9yZGVyLCAqdG1wOworCWludCByZXQgPSAtMTsKKworCWlmICgoYm5jdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCIlczogQk5fQ1RYX25ldyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJQk5fQ1RYX3N0YXJ0KGJuY3R4KTsKKworCWlmICgob3JkZXIgPSBCTl9DVFhfZ2V0KGJuY3R4KSkgPT0gTlVMTCB8fAorCSAgICAodG1wID0gQk5fQ1RYX2dldChibmN0eCkpID09IE5VTEwpCisJCWZhdGFsKCIlczogQk5fQ1RYX2dldCBmYWlsZWQiLCBfX2Z1bmNfXyk7CisKKwkvKiBsb2cyKHByaXZhdGUpID4gbG9nMihvcmRlcikvMiAqLworCWlmIChFQ19HUk9VUF9nZXRfb3JkZXIoRUNfS0VZX2dldDBfZ3JvdXAoa2V5KSwgb3JkZXIsIGJuY3R4KSAhPSAxKQorCQlmYXRhbCgiJXM6IEVDX0dST1VQX2dldF9vcmRlciBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJaWYgKEJOX251bV9iaXRzKEVDX0tFWV9nZXQwX3ByaXZhdGVfa2V5KGtleSkpIDw9CisJICAgIEJOX251bV9iaXRzKG9yZGVyKSAvIDIpIHsKKwkJZXJyb3IoIiVzOiBwcml2YXRlIGtleSB0b28gc21hbGw6ICIKKwkJICAgICJiaXRzKHkpID0gJWQsIGJpdHMob3JkZXIpLzIgPSAlZCIsIF9fZnVuY19fLAorCQkgICAgQk5fbnVtX2JpdHMoRUNfS0VZX2dldDBfcHJpdmF0ZV9rZXkoa2V5KSksCisJCSAgICBCTl9udW1fYml0cyhvcmRlcikgLyAyKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogcHJpdmF0ZSA8IG9yZGVyIC0gMSAqLworCWlmICghQk5fc3ViKHRtcCwgb3JkZXIsIEJOX3ZhbHVlX29uZSgpKSkKKwkJZmF0YWwoIiVzOiBCTl9zdWIgZmFpbGVkIiwgX19mdW5jX18pOworCWlmIChCTl9jbXAoRUNfS0VZX2dldDBfcHJpdmF0ZV9rZXkoa2V5KSwgdG1wKSA+PSAwKSB7CisJCWVycm9yKCIlczogcHJpdmF0ZSBrZXkgPj0gZ3JvdXAgb3JkZXIgLSAxIiwgX19mdW5jX18pOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gMDsKKyBvdXQ6CisJQk5fQ1RYX2ZyZWUoYm5jdHgpOworCXJldHVybiByZXQ7Cit9CisKKyNpZiBkZWZpbmVkKERFQlVHX0tFWEVDREgpIHx8IGRlZmluZWQoREVCVUdfUEspCit2b2lkCitrZXlfZHVtcF9lY19wb2ludChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIGNvbnN0IEVDX1BPSU5UICpwb2ludCkKK3sKKwlCSUdOVU0gKngsICp5OworCUJOX0NUWCAqYm5jdHg7CisKKwlpZiAocG9pbnQgPT0gTlVMTCkgeworCQlmcHV0cygicG9pbnQ9KE5VTEwpXG4iLCBzdGRlcnIpOworCQlyZXR1cm47CisJfQorCWlmICgoYm5jdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCIlczogQk5fQ1RYX25ldyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJQk5fQ1RYX3N0YXJ0KGJuY3R4KTsKKwlpZiAoKHggPSBCTl9DVFhfZ2V0KGJuY3R4KSkgPT0gTlVMTCB8fCAoeSA9IEJOX0NUWF9nZXQoYm5jdHgpKSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IEJOX0NUWF9nZXQgZmFpbGVkIiwgX19mdW5jX18pOworCWlmIChFQ19NRVRIT0RfZ2V0X2ZpZWxkX3R5cGUoRUNfR1JPVVBfbWV0aG9kX29mKGdyb3VwKSkgIT0KKwkgICAgTklEX1g5XzYyX3ByaW1lX2ZpZWxkKQorCQlmYXRhbCgiJXM6IGdyb3VwIGlzIG5vdCBhIHByaW1lIGZpZWxkIiwgX19mdW5jX18pOworCWlmIChFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcChncm91cCwgcG9pbnQsIHgsIHksIGJuY3R4KSAhPSAxKQorCQlmYXRhbCgiJXM6IEVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwIiwgX19mdW5jX18pOworCWZwdXRzKCJ4PSIsIHN0ZGVycik7CisJQk5fcHJpbnRfZnAoc3RkZXJyLCB4KTsKKwlmcHV0cygiXG55PSIsIHN0ZGVycik7CisJQk5fcHJpbnRfZnAoc3RkZXJyLCB5KTsKKwlmcHV0cygiXG4iLCBzdGRlcnIpOworCUJOX0NUWF9mcmVlKGJuY3R4KTsKK30KKwordm9pZAora2V5X2R1bXBfZWNfa2V5KGNvbnN0IEVDX0tFWSAqa2V5KQoreworCWNvbnN0IEJJR05VTSAqZXhwb25lbnQ7CisKKwlrZXlfZHVtcF9lY19wb2ludChFQ19LRVlfZ2V0MF9ncm91cChrZXkpLCBFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KGtleSkpOworCWZwdXRzKCJleHBvbmVudD0iLCBzdGRlcnIpOworCWlmICgoZXhwb25lbnQgPSBFQ19LRVlfZ2V0MF9wcml2YXRlX2tleShrZXkpKSA9PSBOVUxMKQorCQlmcHV0cygiKE5VTEwpIiwgc3RkZXJyKTsKKwllbHNlCisJCUJOX3ByaW50X2ZwKHN0ZGVyciwgRUNfS0VZX2dldDBfcHJpdmF0ZV9rZXkoa2V5KSk7CisJZnB1dHMoIlxuIiwgc3RkZXJyKTsKK30KKyNlbmRpZiAvKiBkZWZpbmVkKERFQlVHX0tFWEVDREgpIHx8IGRlZmluZWQoREVCVUdfUEspICovCisjZW5kaWYgLyogT1BFTlNTTF9IQVNfRUNDICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2tleS5oIGIvb3BlbnNzaC02LjBwMS9rZXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzVhYzVlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9rZXkuaApAQCAtMCwwICsxLDE1MSBAQAorLyogJE9wZW5CU0Q6IGtleS5oLHYgMS4zMyAyMDEwLzEwLzI4IDExOjIyOjA5IGRqbSBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBLRVlfSAorI2RlZmluZSBLRVlfSAorCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RzYS5oPgorI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworI2luY2x1ZGUgPG9wZW5zc2wvZWMuaD4KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBLZXkgS2V5OworZW51bSB0eXBlcyB7CisJS0VZX1JTQTEsCisJS0VZX1JTQSwKKwlLRVlfRFNBLAorCUtFWV9FQ0RTQSwKKwlLRVlfUlNBX0NFUlQsCisJS0VZX0RTQV9DRVJULAorCUtFWV9FQ0RTQV9DRVJULAorCUtFWV9SU0FfQ0VSVF9WMDAsCisJS0VZX0RTQV9DRVJUX1YwMCwKKwlLRVlfVU5TUEVDCit9OworZW51bSBmcF90eXBlIHsKKwlTU0hfRlBfU0hBMSwKKwlTU0hfRlBfTUQ1Cit9OworZW51bSBmcF9yZXAgeworCVNTSF9GUF9IRVgsCisJU1NIX0ZQX0JVQkJMRUJBQkJMRSwKKwlTU0hfRlBfUkFORE9NQVJUCit9OworCisvKiBrZXkgaXMgc3RvcmVkIGluIGV4dGVybmFsIGhhcmR3YXJlICovCisjZGVmaW5lIEtFWV9GTEFHX0VYVAkJMHgwMDAxCisKKyNkZWZpbmUgQ0VSVF9NQVhfUFJJTkNJUEFMUwkyNTYKK3N0cnVjdCBLZXlDZXJ0IHsKKwlCdWZmZXIJCSBjZXJ0YmxvYjsgLyogS2VwdCBhcm91bmQgZm9yIHVzZSBvbiB3aXJlICovCisJdV9pbnQJCSB0eXBlOyAvKiBTU0gyX0NFUlRfVFlQRV9VU0VSIG9yIFNTSDJfQ0VSVF9UWVBFX0hPU1QgKi8KKwl1X2ludDY0X3QJIHNlcmlhbDsKKwljaGFyCQkqa2V5X2lkOworCXVfaW50CQkgbnByaW5jaXBhbHM7CisJY2hhcgkJKipwcmluY2lwYWxzOworCXVfaW50NjRfdAkgdmFsaWRfYWZ0ZXIsIHZhbGlkX2JlZm9yZTsKKwlCdWZmZXIJCSBjcml0aWNhbDsKKwlCdWZmZXIJCSBleHRlbnNpb25zOworCUtleQkJKnNpZ25hdHVyZV9rZXk7Cit9OworCitzdHJ1Y3QgS2V5IHsKKwlpbnQJIHR5cGU7CisJaW50CSBmbGFnczsKKwlSU0EJKnJzYTsKKwlEU0EJKmRzYTsKKwlpbnQJIGVjZHNhX25pZDsJLyogTklEIG9mIGN1cnZlICovCisjaWZkZWYgT1BFTlNTTF9IQVNfRUNDCisJRUNfS0VZCSplY2RzYTsKKyNlbHNlCisJdm9pZAkqZWNkc2E7CisjZW5kaWYKKwlzdHJ1Y3QgS2V5Q2VydCAqY2VydDsKK307CisKK0tleQkJKmtleV9uZXcoaW50KTsKK3ZvaWQJCSBrZXlfYWRkX3ByaXZhdGUoS2V5ICopOworS2V5CQkqa2V5X25ld19wcml2YXRlKGludCk7Cit2b2lkCQkga2V5X2ZyZWUoS2V5ICopOworS2V5CQkqa2V5X2RlbW90ZShjb25zdCBLZXkgKik7CitpbnQJCSBrZXlfZXF1YWxfcHVibGljKGNvbnN0IEtleSAqLCBjb25zdCBLZXkgKik7CitpbnQJCSBrZXlfZXF1YWwoY29uc3QgS2V5ICosIGNvbnN0IEtleSAqKTsKK2NoYXIJCSprZXlfZmluZ2VycHJpbnQoS2V5ICosIGVudW0gZnBfdHlwZSwgZW51bSBmcF9yZXApOwordV9jaGFyCQkqa2V5X2ZpbmdlcnByaW50X3JhdyhLZXkgKiwgZW51bSBmcF90eXBlLCB1X2ludCAqKTsKK2NvbnN0IGNoYXIJKmtleV90eXBlKGNvbnN0IEtleSAqKTsKK2NvbnN0IGNoYXIJKmtleV9jZXJ0X3R5cGUoY29uc3QgS2V5ICopOworaW50CQkga2V5X3dyaXRlKGNvbnN0IEtleSAqLCBGSUxFICopOworaW50CQkga2V5X3JlYWQoS2V5ICosIGNoYXIgKiopOwordV9pbnQJCSBrZXlfc2l6ZShjb25zdCBLZXkgKik7CisKK0tleQkqa2V5X2dlbmVyYXRlKGludCwgdV9pbnQpOworS2V5CSprZXlfZnJvbV9wcml2YXRlKGNvbnN0IEtleSAqKTsKK2ludAkga2V5X3R5cGVfZnJvbV9uYW1lKGNoYXIgKik7CitpbnQJIGtleV9pc19jZXJ0KGNvbnN0IEtleSAqKTsKK2ludAkga2V5X3R5cGVfcGxhaW4oaW50KTsKK2ludAkga2V5X3RvX2NlcnRpZmllZChLZXkgKiwgaW50KTsKK2ludAkga2V5X2Ryb3BfY2VydChLZXkgKik7CitpbnQJIGtleV9jZXJ0aWZ5KEtleSAqLCBLZXkgKik7Cit2b2lkCSBrZXlfY2VydF9jb3B5KGNvbnN0IEtleSAqLCBzdHJ1Y3QgS2V5ICopOworaW50CSBrZXlfY2VydF9jaGVja19hdXRob3JpdHkoY29uc3QgS2V5ICosIGludCwgaW50LCBjb25zdCBjaGFyICosCisJICAgIGNvbnN0IGNoYXIgKiopOworaW50CSBrZXlfY2VydF9pc19sZWdhY3koS2V5ICopOworCitpbnQJCSBrZXlfZWNkc2FfbmlkX2Zyb21fbmFtZShjb25zdCBjaGFyICopOworaW50CQkga2V5X2N1cnZlX25hbWVfdG9fbmlkKGNvbnN0IGNoYXIgKik7Citjb25zdCBjaGFyICoJIGtleV9jdXJ2ZV9uaWRfdG9fbmFtZShpbnQpOwordV9pbnQJCSBrZXlfY3VydmVfbmlkX3RvX2JpdHMoaW50KTsKK2ludAkJIGtleV9lY2RzYV9iaXRzX3RvX25pZChpbnQpOworI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworaW50CQkga2V5X2VjZHNhX2tleV90b19uaWQoRUNfS0VZICopOworY29uc3QgRVZQX01EICoJIGtleV9lY19uaWRfdG9fZXZwbWQoaW50IG5pZCk7CitpbnQJCSBrZXlfZWNfdmFsaWRhdGVfcHVibGljKGNvbnN0IEVDX0dST1VQICosIGNvbnN0IEVDX1BPSU5UICopOworaW50CQkga2V5X2VjX3ZhbGlkYXRlX3ByaXZhdGUoY29uc3QgRUNfS0VZICopOworI2VuZGlmCisKK0tleQkJKmtleV9mcm9tX2Jsb2IoY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2ludAkJIGtleV90b19ibG9iKGNvbnN0IEtleSAqLCB1X2NoYXIgKiosIHVfaW50ICopOworY29uc3QgY2hhcgkqa2V5X3NzaF9uYW1lKGNvbnN0IEtleSAqKTsKK2NvbnN0IGNoYXIJKmtleV9zc2hfbmFtZV9wbGFpbihjb25zdCBLZXkgKik7CitpbnQJCSBrZXlfbmFtZXNfdmFsaWQyKGNvbnN0IGNoYXIgKik7CisKK2ludAkga2V5X3NpZ24oY29uc3QgS2V5ICosIHVfY2hhciAqKiwgdV9pbnQgKiwgY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2ludAkga2V5X3ZlcmlmeShjb25zdCBLZXkgKiwgY29uc3QgdV9jaGFyICosIHVfaW50LCBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworCitpbnQJIHNzaF9kc3Nfc2lnbihjb25zdCBLZXkgKiwgdV9jaGFyICoqLCB1X2ludCAqLCBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworaW50CSBzc2hfZHNzX3ZlcmlmeShjb25zdCBLZXkgKiwgY29uc3QgdV9jaGFyICosIHVfaW50LCBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworaW50CSBzc2hfZWNkc2Ffc2lnbihjb25zdCBLZXkgKiwgdV9jaGFyICoqLCB1X2ludCAqLCBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworaW50CSBzc2hfZWNkc2FfdmVyaWZ5KGNvbnN0IEtleSAqLCBjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitpbnQJIHNzaF9yc2Ffc2lnbihjb25zdCBLZXkgKiwgdV9jaGFyICoqLCB1X2ludCAqLCBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworaW50CSBzc2hfcnNhX3ZlcmlmeShjb25zdCBLZXkgKiwgY29uc3QgdV9jaGFyICosIHVfaW50LCBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworCisjaWYgZGVmaW5lZChPUEVOU1NMX0hBU19FQ0MpICYmIChkZWZpbmVkKERFQlVHX0tFWEVDREgpIHx8IGRlZmluZWQoREVCVUdfUEspKQordm9pZAlrZXlfZHVtcF9lY19wb2ludChjb25zdCBFQ19HUk9VUCAqLCBjb25zdCBFQ19QT0lOVCAqKTsKK3ZvaWQJa2V5X2R1bXBfZWNfa2V5KGNvbnN0IEVDX0tFWSAqKTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvbG9nLmMgYi9vcGVuc3NoLTYuMHAxL2xvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNWExMGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2xvZy5jCkBAIC0wLDAgKzEsNDMwIEBACisvKiAkT3BlbkJTRDogbG9nLmMsdiAxLjQyIDIwMTEvMDYvMTcgMjE6NDQ6MzAgZGptIEV4cCAkICovCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKKyAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCisgKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCisgKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCisgKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCisgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaWYgZGVmaW5lZChIQVZFX1NUUk5WSVMpICYmIGRlZmluZWQoSEFWRV9WSVNfSCkKKyMgaW5jbHVkZSA8dmlzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJsb2cuaCIKKworc3RhdGljIExvZ0xldmVsIGxvZ19sZXZlbCA9IFNZU0xPR19MRVZFTF9JTkZPOworc3RhdGljIGludCBsb2dfb25fc3RkZXJyID0gMTsKK3N0YXRpYyBpbnQgbG9nX2ZhY2lsaXR5ID0gTE9HX0FVVEg7CitzdGF0aWMgY2hhciAqYXJndjA7CitzdGF0aWMgbG9nX2hhbmRsZXJfZm4gKmxvZ19oYW5kbGVyOworc3RhdGljIHZvaWQgKmxvZ19oYW5kbGVyX2N0eDsKKworZXh0ZXJuIGNoYXIgKl9fcHJvZ25hbWU7CisKKyNkZWZpbmUgTE9HX1NZU0xPR19WSVMJKFZJU19DU1RZTEV8VklTX05MfFZJU19UQUJ8VklTX09DVEFMKQorI2RlZmluZSBMT0dfU1RERVJSX1ZJUwkoVklTX1NBRkV8VklTX09DVEFMKQorCisvKiB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIGxvZy1mYWNpbGl0aWVzL2xldmVscyAqLworCitzdGF0aWMgc3RydWN0IHsKKwljb25zdCBjaGFyICpuYW1lOworCVN5c2xvZ0ZhY2lsaXR5IHZhbDsKK30gbG9nX2ZhY2lsaXRpZXNbXSA9IHsKKwl7ICJEQUVNT04iLAlTWVNMT0dfRkFDSUxJVFlfREFFTU9OIH0sCisJeyAiVVNFUiIsCVNZU0xPR19GQUNJTElUWV9VU0VSIH0sCisJeyAiQVVUSCIsCVNZU0xPR19GQUNJTElUWV9BVVRIIH0sCisjaWZkZWYgTE9HX0FVVEhQUklWCisJeyAiQVVUSFBSSVYiLAlTWVNMT0dfRkFDSUxJVFlfQVVUSFBSSVYgfSwKKyNlbmRpZgorCXsgIkxPQ0FMMCIsCVNZU0xPR19GQUNJTElUWV9MT0NBTDAgfSwKKwl7ICJMT0NBTDEiLAlTWVNMT0dfRkFDSUxJVFlfTE9DQUwxIH0sCisJeyAiTE9DQUwyIiwJU1lTTE9HX0ZBQ0lMSVRZX0xPQ0FMMiB9LAorCXsgIkxPQ0FMMyIsCVNZU0xPR19GQUNJTElUWV9MT0NBTDMgfSwKKwl7ICJMT0NBTDQiLAlTWVNMT0dfRkFDSUxJVFlfTE9DQUw0IH0sCisJeyAiTE9DQUw1IiwJU1lTTE9HX0ZBQ0lMSVRZX0xPQ0FMNSB9LAorCXsgIkxPQ0FMNiIsCVNZU0xPR19GQUNJTElUWV9MT0NBTDYgfSwKKwl7ICJMT0NBTDciLAlTWVNMT0dfRkFDSUxJVFlfTE9DQUw3IH0sCisJeyBOVUxMLAkJU1lTTE9HX0ZBQ0lMSVRZX05PVF9TRVQgfQorfTsKKworc3RhdGljIHN0cnVjdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlMb2dMZXZlbCB2YWw7Cit9IGxvZ19sZXZlbHNbXSA9Cit7CisJeyAiUVVJRVQiLAlTWVNMT0dfTEVWRUxfUVVJRVQgfSwKKwl7ICJGQVRBTCIsCVNZU0xPR19MRVZFTF9GQVRBTCB9LAorCXsgIkVSUk9SIiwJU1lTTE9HX0xFVkVMX0VSUk9SIH0sCisJeyAiSU5GTyIsCVNZU0xPR19MRVZFTF9JTkZPIH0sCisJeyAiVkVSQk9TRSIsCVNZU0xPR19MRVZFTF9WRVJCT1NFIH0sCisJeyAiREVCVUciLAlTWVNMT0dfTEVWRUxfREVCVUcxIH0sCisJeyAiREVCVUcxIiwJU1lTTE9HX0xFVkVMX0RFQlVHMSB9LAorCXsgIkRFQlVHMiIsCVNZU0xPR19MRVZFTF9ERUJVRzIgfSwKKwl7ICJERUJVRzMiLAlTWVNMT0dfTEVWRUxfREVCVUczIH0sCisJeyBOVUxMLAkJU1lTTE9HX0xFVkVMX05PVF9TRVQgfQorfTsKKworU3lzbG9nRmFjaWxpdHkKK2xvZ19mYWNpbGl0eV9udW1iZXIoY2hhciAqbmFtZSkKK3sKKwlpbnQgaTsKKworCWlmIChuYW1lICE9IE5VTEwpCisJCWZvciAoaSA9IDA7IGxvZ19mYWNpbGl0aWVzW2ldLm5hbWU7IGkrKykKKwkJCWlmIChzdHJjYXNlY21wKGxvZ19mYWNpbGl0aWVzW2ldLm5hbWUsIG5hbWUpID09IDApCisJCQkJcmV0dXJuIGxvZ19mYWNpbGl0aWVzW2ldLnZhbDsKKwlyZXR1cm4gU1lTTE9HX0ZBQ0lMSVRZX05PVF9TRVQ7Cit9CisKK2NvbnN0IGNoYXIgKgorbG9nX2ZhY2lsaXR5X25hbWUoU3lzbG9nRmFjaWxpdHkgZmFjaWxpdHkpCit7CisJdV9pbnQgaTsKKworCWZvciAoaSA9IDA7ICBsb2dfZmFjaWxpdGllc1tpXS5uYW1lOyBpKyspCisJCWlmIChsb2dfZmFjaWxpdGllc1tpXS52YWwgPT0gZmFjaWxpdHkpCisJCQlyZXR1cm4gbG9nX2ZhY2lsaXRpZXNbaV0ubmFtZTsKKwlyZXR1cm4gTlVMTDsKK30KKworTG9nTGV2ZWwKK2xvZ19sZXZlbF9udW1iZXIoY2hhciAqbmFtZSkKK3sKKwlpbnQgaTsKKworCWlmIChuYW1lICE9IE5VTEwpCisJCWZvciAoaSA9IDA7IGxvZ19sZXZlbHNbaV0ubmFtZTsgaSsrKQorCQkJaWYgKHN0cmNhc2VjbXAobG9nX2xldmVsc1tpXS5uYW1lLCBuYW1lKSA9PSAwKQorCQkJCXJldHVybiBsb2dfbGV2ZWxzW2ldLnZhbDsKKwlyZXR1cm4gU1lTTE9HX0xFVkVMX05PVF9TRVQ7Cit9CisKK2NvbnN0IGNoYXIgKgorbG9nX2xldmVsX25hbWUoTG9nTGV2ZWwgbGV2ZWwpCit7CisJdV9pbnQgaTsKKworCWZvciAoaSA9IDA7IGxvZ19sZXZlbHNbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisJCWlmIChsb2dfbGV2ZWxzW2ldLnZhbCA9PSBsZXZlbCkKKwkJCXJldHVybiBsb2dfbGV2ZWxzW2ldLm5hbWU7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEVycm9yIG1lc3NhZ2VzIHRoYXQgc2hvdWxkIGJlIGxvZ2dlZC4gKi8KKwordm9pZAorZXJyb3IoY29uc3QgY2hhciAqZm10LC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWRvX2xvZyhTWVNMT0dfTEVWRUxfRVJST1IsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworfQorCit2b2lkCitzaWdkaWUoY29uc3QgY2hhciAqZm10LC4uLikKK3sKKyNpZmRlZiBET19MT0dfU0FGRV9JTl9TSUdIQU5ECisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlkb19sb2coU1lTTE9HX0xFVkVMX0ZBVEFMLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKyNlbmRpZgorCV9leGl0KDEpOworfQorCisKKy8qIExvZyB0aGlzIG1lc3NhZ2UgKGluZm9ybWF0aW9uIHRoYXQgdXN1YWxseSBzaG91bGQgZ28gdG8gdGhlIGxvZykuICovCisKK3ZvaWQKK2xvZ2l0KGNvbnN0IGNoYXIgKmZtdCwuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlkb19sb2coU1lTTE9HX0xFVkVMX0lORk8sIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworfQorCisvKiBNb3JlIGRldGFpbGVkIG1lc3NhZ2VzIChpbmZvcm1hdGlvbiB0aGF0IGRvZXMgbm90IG5lZWQgdG8gZ28gdG8gdGhlIGxvZykuICovCisKK3ZvaWQKK3ZlcmJvc2UoY29uc3QgY2hhciAqZm10LC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWRvX2xvZyhTWVNMT0dfTEVWRUxfVkVSQk9TRSwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7Cit9CisKKy8qIERlYnVnZ2luZyBtZXNzYWdlcyB0aGF0IHNob3VsZCBub3QgYmUgbG9nZ2VkIGR1cmluZyBub3JtYWwgb3BlcmF0aW9uLiAqLworCit2b2lkCitkZWJ1Zyhjb25zdCBjaGFyICpmbXQsLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJZG9fbG9nKFNZU0xPR19MRVZFTF9ERUJVRzEsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworfQorCit2b2lkCitkZWJ1ZzIoY29uc3QgY2hhciAqZm10LC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWRvX2xvZyhTWVNMT0dfTEVWRUxfREVCVUcyLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKK30KKwordm9pZAorZGVidWczKGNvbnN0IGNoYXIgKmZtdCwuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlkb19sb2coU1lTTE9HX0xFVkVMX0RFQlVHMywgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBsb2cuCisgKi8KKwordm9pZAorbG9nX2luaXQoY2hhciAqYXYwLCBMb2dMZXZlbCBsZXZlbCwgU3lzbG9nRmFjaWxpdHkgZmFjaWxpdHksIGludCBvbl9zdGRlcnIpCit7CisjaWYgZGVmaW5lZChIQVZFX09QRU5MT0dfUikgJiYgZGVmaW5lZChTWVNMT0dfREFUQV9JTklUKQorCXN0cnVjdCBzeXNsb2dfZGF0YSBzZGF0YSA9IFNZU0xPR19EQVRBX0lOSVQ7CisjZW5kaWYKKworCWFyZ3YwID0gYXYwOworCisJc3dpdGNoIChsZXZlbCkgeworCWNhc2UgU1lTTE9HX0xFVkVMX1FVSUVUOgorCWNhc2UgU1lTTE9HX0xFVkVMX0ZBVEFMOgorCWNhc2UgU1lTTE9HX0xFVkVMX0VSUk9SOgorCWNhc2UgU1lTTE9HX0xFVkVMX0lORk86CisJY2FzZSBTWVNMT0dfTEVWRUxfVkVSQk9TRToKKwljYXNlIFNZU0xPR19MRVZFTF9ERUJVRzE6CisJY2FzZSBTWVNMT0dfTEVWRUxfREVCVUcyOgorCWNhc2UgU1lTTE9HX0xFVkVMX0RFQlVHMzoKKwkJbG9nX2xldmVsID0gbGV2ZWw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoc3RkZXJyLCAiVW5yZWNvZ25pemVkIGludGVybmFsIHN5c2xvZyBsZXZlbCBjb2RlICVkXG4iLAorCQkgICAgKGludCkgbGV2ZWwpOworCQlleGl0KDEpOworCX0KKworCWxvZ19oYW5kbGVyID0gTlVMTDsKKwlsb2dfaGFuZGxlcl9jdHggPSBOVUxMOworCisJbG9nX29uX3N0ZGVyciA9IG9uX3N0ZGVycjsKKwlpZiAob25fc3RkZXJyKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGZhY2lsaXR5KSB7CisJY2FzZSBTWVNMT0dfRkFDSUxJVFlfREFFTU9OOgorCQlsb2dfZmFjaWxpdHkgPSBMT0dfREFFTU9OOworCQlicmVhazsKKwljYXNlIFNZU0xPR19GQUNJTElUWV9VU0VSOgorCQlsb2dfZmFjaWxpdHkgPSBMT0dfVVNFUjsKKwkJYnJlYWs7CisJY2FzZSBTWVNMT0dfRkFDSUxJVFlfQVVUSDoKKwkJbG9nX2ZhY2lsaXR5ID0gTE9HX0FVVEg7CisJCWJyZWFrOworI2lmZGVmIExPR19BVVRIUFJJVgorCWNhc2UgU1lTTE9HX0ZBQ0lMSVRZX0FVVEhQUklWOgorCQlsb2dfZmFjaWxpdHkgPSBMT0dfQVVUSFBSSVY7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBTWVNMT0dfRkFDSUxJVFlfTE9DQUwwOgorCQlsb2dfZmFjaWxpdHkgPSBMT0dfTE9DQUwwOworCQlicmVhazsKKwljYXNlIFNZU0xPR19GQUNJTElUWV9MT0NBTDE6CisJCWxvZ19mYWNpbGl0eSA9IExPR19MT0NBTDE7CisJCWJyZWFrOworCWNhc2UgU1lTTE9HX0ZBQ0lMSVRZX0xPQ0FMMjoKKwkJbG9nX2ZhY2lsaXR5ID0gTE9HX0xPQ0FMMjsKKwkJYnJlYWs7CisJY2FzZSBTWVNMT0dfRkFDSUxJVFlfTE9DQUwzOgorCQlsb2dfZmFjaWxpdHkgPSBMT0dfTE9DQUwzOworCQlicmVhazsKKwljYXNlIFNZU0xPR19GQUNJTElUWV9MT0NBTDQ6CisJCWxvZ19mYWNpbGl0eSA9IExPR19MT0NBTDQ7CisJCWJyZWFrOworCWNhc2UgU1lTTE9HX0ZBQ0lMSVRZX0xPQ0FMNToKKwkJbG9nX2ZhY2lsaXR5ID0gTE9HX0xPQ0FMNTsKKwkJYnJlYWs7CisJY2FzZSBTWVNMT0dfRkFDSUxJVFlfTE9DQUw2OgorCQlsb2dfZmFjaWxpdHkgPSBMT0dfTE9DQUw2OworCQlicmVhazsKKwljYXNlIFNZU0xPR19GQUNJTElUWV9MT0NBTDc6CisJCWxvZ19mYWNpbGl0eSA9IExPR19MT0NBTDc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoc3RkZXJyLAorCQkgICAgIlVucmVjb2duaXplZCBpbnRlcm5hbCBzeXNsb2cgZmFjaWxpdHkgY29kZSAlZFxuIiwKKwkJICAgIChpbnQpIGZhY2lsaXR5KTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKgorCSAqIElmIGFuIGV4dGVybmFsIGxpYnJhcnkgKGVnIGxpYndyYXApIGF0dGVtcHRzIHRvIHVzZSBzeXNsb2cKKwkgKiBpbW1lZGlhdGVseSBhZnRlciByZWV4ZWMsIHN5c2xvZyBtYXkgYmUgcG9pbnRpbmcgdG8gdGhlIHdyb25nCisJICogZmFjaWxpdHksIHNvIHdlIGZvcmNlIGFuIG9wZW4vY2xvc2Ugb2Ygc3lzbG9nIGhlcmUuCisJICovCisjaWYgZGVmaW5lZChIQVZFX09QRU5MT0dfUikgJiYgZGVmaW5lZChTWVNMT0dfREFUQV9JTklUKQorCW9wZW5sb2dfcihhcmd2MCA/IGFyZ3YwIDogX19wcm9nbmFtZSwgTE9HX1BJRCwgbG9nX2ZhY2lsaXR5LCAmc2RhdGEpOworCWNsb3NlbG9nX3IoJnNkYXRhKTsKKyNlbHNlCisJb3BlbmxvZyhhcmd2MCA/IGFyZ3YwIDogX19wcm9nbmFtZSwgTE9HX1BJRCwgbG9nX2ZhY2lsaXR5KTsKKwljbG9zZWxvZygpOworI2VuZGlmCit9CisKKyNkZWZpbmUgTVNHQlVGU0laIDEwMjQKKwordm9pZAorc2V0X2xvZ19oYW5kbGVyKGxvZ19oYW5kbGVyX2ZuICpoYW5kbGVyLCB2b2lkICpjdHgpCit7CisJbG9nX2hhbmRsZXIgPSBoYW5kbGVyOworCWxvZ19oYW5kbGVyX2N0eCA9IGN0eDsKK30KKwordm9pZAorZG9fbG9nMihMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciAqZm10LC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWRvX2xvZyhsZXZlbCwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7Cit9CisKK3ZvaWQKK2RvX2xvZyhMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCit7CisjaWYgZGVmaW5lZChIQVZFX09QRU5MT0dfUikgJiYgZGVmaW5lZChTWVNMT0dfREFUQV9JTklUKQorCXN0cnVjdCBzeXNsb2dfZGF0YSBzZGF0YSA9IFNZU0xPR19EQVRBX0lOSVQ7CisjZW5kaWYKKwljaGFyIG1zZ2J1ZltNU0dCVUZTSVpdOworCWNoYXIgZm10YnVmW01TR0JVRlNJWl07CisJY2hhciAqdHh0ID0gTlVMTDsKKwlpbnQgcHJpID0gTE9HX0lORk87CisJaW50IHNhdmVkX2Vycm5vID0gZXJybm87CisJbG9nX2hhbmRsZXJfZm4gKnRtcF9oYW5kbGVyOworCisJaWYgKGxldmVsID4gbG9nX2xldmVsKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGxldmVsKSB7CisJY2FzZSBTWVNMT0dfTEVWRUxfRkFUQUw6CisJCWlmICghbG9nX29uX3N0ZGVycikKKwkJCXR4dCA9ICJmYXRhbCI7CisJCXByaSA9IExPR19DUklUOworCQlicmVhazsKKwljYXNlIFNZU0xPR19MRVZFTF9FUlJPUjoKKwkJaWYgKCFsb2dfb25fc3RkZXJyKQorCQkJdHh0ID0gImVycm9yIjsKKwkJcHJpID0gTE9HX0VSUjsKKwkJYnJlYWs7CisJY2FzZSBTWVNMT0dfTEVWRUxfSU5GTzoKKwkJcHJpID0gTE9HX0lORk87CisJCWJyZWFrOworCWNhc2UgU1lTTE9HX0xFVkVMX1ZFUkJPU0U6CisJCXByaSA9IExPR19JTkZPOworCQlicmVhazsKKwljYXNlIFNZU0xPR19MRVZFTF9ERUJVRzE6CisJCXR4dCA9ICJkZWJ1ZzEiOworCQlwcmkgPSBMT0dfREVCVUc7CisJCWJyZWFrOworCWNhc2UgU1lTTE9HX0xFVkVMX0RFQlVHMjoKKwkJdHh0ID0gImRlYnVnMiI7CisJCXByaSA9IExPR19ERUJVRzsKKwkJYnJlYWs7CisJY2FzZSBTWVNMT0dfTEVWRUxfREVCVUczOgorCQl0eHQgPSAiZGVidWczIjsKKwkJcHJpID0gTE9HX0RFQlVHOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl0eHQgPSAiaW50ZXJuYWwgZXJyb3IiOworCQlwcmkgPSBMT0dfRVJSOworCQlicmVhazsKKwl9CisJaWYgKHR4dCAhPSBOVUxMICYmIGxvZ19oYW5kbGVyID09IE5VTEwpIHsKKwkJc25wcmludGYoZm10YnVmLCBzaXplb2YoZm10YnVmKSwgIiVzOiAlcyIsIHR4dCwgZm10KTsKKwkJdnNucHJpbnRmKG1zZ2J1Ziwgc2l6ZW9mKG1zZ2J1ZiksIGZtdGJ1ZiwgYXJncyk7CisJfSBlbHNlIHsKKwkJdnNucHJpbnRmKG1zZ2J1Ziwgc2l6ZW9mKG1zZ2J1ZiksIGZtdCwgYXJncyk7CisJfQorCXN0cm52aXMoZm10YnVmLCBtc2didWYsIHNpemVvZihmbXRidWYpLAorCSAgICBsb2dfb25fc3RkZXJyID8gTE9HX1NUREVSUl9WSVMgOiBMT0dfU1lTTE9HX1ZJUyk7CisJaWYgKGxvZ19oYW5kbGVyICE9IE5VTEwpIHsKKwkJLyogQXZvaWQgcmVjdXJzaW9uICovCisJCXRtcF9oYW5kbGVyID0gbG9nX2hhbmRsZXI7CisJCWxvZ19oYW5kbGVyID0gTlVMTDsKKwkJdG1wX2hhbmRsZXIobGV2ZWwsIGZtdGJ1ZiwgbG9nX2hhbmRsZXJfY3R4KTsKKwkJbG9nX2hhbmRsZXIgPSB0bXBfaGFuZGxlcjsKKwl9IGVsc2UgaWYgKGxvZ19vbl9zdGRlcnIpIHsKKwkJc25wcmludGYobXNnYnVmLCBzaXplb2YgbXNnYnVmLCAiJXNcclxuIiwgZm10YnVmKTsKKwkJd3JpdGUoU1RERVJSX0ZJTEVOTywgbXNnYnVmLCBzdHJsZW4obXNnYnVmKSk7CisJfSBlbHNlIHsKKyNpZiBkZWZpbmVkKEhBVkVfT1BFTkxPR19SKSAmJiBkZWZpbmVkKFNZU0xPR19EQVRBX0lOSVQpCisJCW9wZW5sb2dfcihhcmd2MCA/IGFyZ3YwIDogX19wcm9nbmFtZSwgTE9HX1BJRCwgbG9nX2ZhY2lsaXR5LCAmc2RhdGEpOworCQlzeXNsb2dfcihwcmksICZzZGF0YSwgIiUuNTAwcyIsIGZtdGJ1Zik7CisJCWNsb3NlbG9nX3IoJnNkYXRhKTsKKyNlbHNlCisJCW9wZW5sb2coYXJndjAgPyBhcmd2MCA6IF9fcHJvZ25hbWUsIExPR19QSUQsIGxvZ19mYWNpbGl0eSk7CisJCXN5c2xvZyhwcmksICIlLjUwMHMiLCBmbXRidWYpOworCQljbG9zZWxvZygpOworI2VuZGlmCisJfQorCWVycm5vID0gc2F2ZWRfZXJybm87Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2xvZy5oIGIvb3BlbnNzaC02LjBwMS9sb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjhkMjE0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9sb2cuaApAQCAtMCwwICsxLDc1IEBACisvKiAkT3BlbkJTRDogbG9nLmgsdiAxLjE4IDIwMTEvMDYvMTcgMjE6NDQ6MzAgZGptIEV4cCAkICovCisKKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqLworCisjaWZuZGVmIFNTSF9MT0dfSAorI2RlZmluZSBTU0hfTE9HX0gKKworLyogU3VwcG9ydGVkIHN5c2xvZyBmYWNpbGl0aWVzIGFuZCBsZXZlbHMuICovCit0eXBlZGVmIGVudW0geworCVNZU0xPR19GQUNJTElUWV9EQUVNT04sCisJU1lTTE9HX0ZBQ0lMSVRZX1VTRVIsCisJU1lTTE9HX0ZBQ0lMSVRZX0FVVEgsCisjaWZkZWYgTE9HX0FVVEhQUklWCisJU1lTTE9HX0ZBQ0lMSVRZX0FVVEhQUklWLAorI2VuZGlmCisJU1lTTE9HX0ZBQ0lMSVRZX0xPQ0FMMCwKKwlTWVNMT0dfRkFDSUxJVFlfTE9DQUwxLAorCVNZU0xPR19GQUNJTElUWV9MT0NBTDIsCisJU1lTTE9HX0ZBQ0lMSVRZX0xPQ0FMMywKKwlTWVNMT0dfRkFDSUxJVFlfTE9DQUw0LAorCVNZU0xPR19GQUNJTElUWV9MT0NBTDUsCisJU1lTTE9HX0ZBQ0lMSVRZX0xPQ0FMNiwKKwlTWVNMT0dfRkFDSUxJVFlfTE9DQUw3LAorCVNZU0xPR19GQUNJTElUWV9OT1RfU0VUID0gLTEKK30gICAgICAgU3lzbG9nRmFjaWxpdHk7CisKK3R5cGVkZWYgZW51bSB7CisJU1lTTE9HX0xFVkVMX1FVSUVULAorCVNZU0xPR19MRVZFTF9GQVRBTCwKKwlTWVNMT0dfTEVWRUxfRVJST1IsCisJU1lTTE9HX0xFVkVMX0lORk8sCisJU1lTTE9HX0xFVkVMX1ZFUkJPU0UsCisJU1lTTE9HX0xFVkVMX0RFQlVHMSwKKwlTWVNMT0dfTEVWRUxfREVCVUcyLAorCVNZU0xPR19MRVZFTF9ERUJVRzMsCisJU1lTTE9HX0xFVkVMX05PVF9TRVQgPSAtMQorfSAgICAgICBMb2dMZXZlbDsKKwordHlwZWRlZiB2b2lkIChsb2dfaGFuZGxlcl9mbikoTG9nTGV2ZWwsIGNvbnN0IGNoYXIgKiwgdm9pZCAqKTsKKwordm9pZCAgICAgbG9nX2luaXQoY2hhciAqLCBMb2dMZXZlbCwgU3lzbG9nRmFjaWxpdHksIGludCk7CisKK1N5c2xvZ0ZhY2lsaXR5CWxvZ19mYWNpbGl0eV9udW1iZXIoY2hhciAqKTsKK2NvbnN0IGNoYXIgKiAJbG9nX2ZhY2lsaXR5X25hbWUoU3lzbG9nRmFjaWxpdHkpOworTG9nTGV2ZWwJbG9nX2xldmVsX251bWJlcihjaGFyICopOworY29uc3QgY2hhciAqCWxvZ19sZXZlbF9uYW1lKExvZ0xldmVsKTsKKwordm9pZCAgICAgZmF0YWwoY29uc3QgY2hhciAqLCAuLi4pIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkKKyAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpOwordm9pZCAgICAgZXJyb3IoY29uc3QgY2hhciAqLCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDEsIDIpKSk7Cit2b2lkICAgICBzaWdkaWUoY29uc3QgY2hhciAqLCAuLi4pICBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpCisgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKK3ZvaWQgICAgIGxvZ2l0KGNvbnN0IGNoYXIgKiwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpOwordm9pZCAgICAgdmVyYm9zZShjb25zdCBjaGFyICosIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKK3ZvaWQgICAgIGRlYnVnKGNvbnN0IGNoYXIgKiwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpOwordm9pZCAgICAgZGVidWcyKGNvbnN0IGNoYXIgKiwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpOwordm9pZCAgICAgZGVidWczKGNvbnN0IGNoYXIgKiwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpOworCisKK3ZvaWQJIHNldF9sb2dfaGFuZGxlcihsb2dfaGFuZGxlcl9mbiAqLCB2b2lkICopOwordm9pZAkgZG9fbG9nMihMb2dMZXZlbCwgY29uc3QgY2hhciAqLCAuLi4pCisgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKK3ZvaWQJIGRvX2xvZyhMb2dMZXZlbCwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKK3ZvaWQJIGNsZWFudXBfZXhpdChpbnQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvbG9naW5yZWMuYyBiL29wZW5zc2gtNi4wcDEvbG9naW5yZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjk0MWM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9sb2dpbnJlYy5jCkBAIC0wLDAgKzEsMTcyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBBbmRyZSBMdWNhcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBQb3J0aW9ucyBjb3B5cmlnaHQgKGMpIDE5OTggVG9kZCBDLiBNaWxsZXIKKyAqIFBvcnRpb25zIGNvcHlyaWdodCAoYykgMTk5NiBKYXNvbiBEb3ducworICogUG9ydGlvbnMgY29weXJpZ2h0IChjKSAxOTk2IFRoZW8gZGUgUmFhZHQKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFRoZSBidG1wIGxvZ2dpbmcgY29kZSBpcyBkZXJpdmVkIGZyb20gbG9naW4uYyBmcm9tIHV0aWwtbGludXggYW5kIGlzIHVuZGVyCisgKiB0aGUgdGhlIGZvbGxvd2luZyBsaWNlbnNlOgorICoKKyAqIENvcHlyaWdodCAoYykgMTk4MCwgMTk4NywgMTk4OCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZQorICogZHVwbGljYXRlZCBpbiBhbGwgc3VjaCBmb3JtcyBhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiwKKyAqIGFkdmVydGlzaW5nIG1hdGVyaWFscywgYW5kIG90aGVyIG1hdGVyaWFscyByZWxhdGVkIHRvIHN1Y2gKKyAqIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIGFja25vd2xlZGdlIHRoYXQgdGhlIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQKKyAqIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5LiAgVGhlIG5hbWUgb2YgdGhlCisgKiBVbml2ZXJzaXR5IG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworCisvKioKKyAqKiBsb2dpbnJlYy5jOiAgcGxhdGZvcm0taW5kZXBlbmRlbnQgbG9naW4gcmVjb3JkaW5nIGFuZCBsYXN0bG9nIHJldHJpZXZhbAorICoqLworCisvKgorICogIFRoZSBuZXcgbG9naW4gY29kZSBleHBsYWluZWQKKyAqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogIFRoaXMgY29kZSBhdHRlbXB0cyB0byBwcm92aWRlIGEgY29tbW9uIGludGVyZmFjZSB0byBsb2dpbiByZWNvcmRpbmcKKyAqICAodXRtcCBhbmQgZnJpZW5kcykgYW5kIGxhc3QgbG9naW4gdGltZSByZXRyaWV2YWwuCisgKgorICogIEl0cyBwcmltYXJ5IG1lYW5zIG9mIGFjaGlldmluZyB0aGlzIGlzIHRvIHVzZSAnc3RydWN0IGxvZ2luaW5mbycsIGEKKyAqICB1bmlvbiBvZiBhbGwgdGhlIHVzZWZ1bCBmaWVsZHMgaW4gdGhlIHZhcmlvdXMgZGlmZmVyZW50IHR5cGVzIG9mCisgKiAgc3lzdGVtIGxvZ2luIHJlY29yZCBzdHJ1Y3R1cmVzIG9uZSBmaW5kcyBvbiBVTklYIHZhcmlhbnRzLgorICoKKyAqICBXZSBkZXBlbmQgb24gYXV0b2NvbmYgdG8gZGVmaW5lIHdoaWNoIHJlY29yZGluZyBtZXRob2RzIGFyZSB0byBiZQorICogIHVzZWQsIGFuZCB3aGljaCBmaWVsZHMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgcmVsZXZhbnQgZGF0YSBzdHJ1Y3R1cmVzCisgKiAgb24gdGhlIGxvY2FsIHN5c3RlbS4gTWFueSBDIHByZXByb2Nlc3NvciBzeW1ib2xzIGFmZmVjdCB3aGljaCBjb2RlCisgKiAgZ2V0cyBjb21waWxlZCBoZXJlLgorICoKKyAqICBUaGUgY29kZSBpcyBkZXNpZ25lZCB0byBtYWtlIGl0IGVhc3kgdG8gbW9kaWZ5IGEgcGFydGljdWxhcgorICogIHJlY29yZGluZyBtZXRob2QsIHdpdGhvdXQgYWZmZWN0aW5nIG90aGVyIG1ldGhvZHMgbm9yIHJlcXVpcmluZyBzbworICogIG1hbnkgbmVzdGVkIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGJsb2NrcyBhcyB3ZXJlIGNvbW1vbnBsYWNlIGluCisgKiAgdGhlIG9sZCBjb2RlLgorICoKKyAqICBGb3IgbG9naW4gcmVjb3JkaW5nLCB3ZSB0cnkgdG8gdXNlIHRoZSBsb2NhbCBzeXN0ZW0ncyBsaWJyYXJpZXMgYXMKKyAqICB0aGVzZSBhcmUgY2xlYXJseSBtb3N0IGxpa2VseSB0byB3b3JrIGNvcnJlY3RseS4gRm9yIHV0bXAgc3lzdGVtcworICogIHRoaXMgdXN1YWxseSBtZWFucyBsb2dpbigpIGFuZCBsb2dvdXQoKSBvciBzZXR1dGVudCgpIGV0Yy4sIHByb2JhYmx5CisgKiAgaW4gbGlidXRpbCwgYWxvbmcgd2l0aCBsb2d3dG1wKCkgZXRjLiBPbiB0aGVzZSBzeXN0ZW1zLCB3ZSBmYWxsIGJhY2sKKyAqICB0byB3cml0aW5nIHRoZSBmaWxlcyBkaXJlY3RseSBpZiB3ZSBoYXZlIHRvLCB0aG91Z2ggdGhpcyBtZXRob2QKKyAqICByZXF1aXJlcyB2ZXJ5IHRob3JvdWdoIHRlc3Rpbmcgc28gd2UgZG8gbm90IGNvcnJ1cHQgbG9jYWwgYXVkaXRpbmcKKyAqICBpbmZvcm1hdGlvbi4gVGhlc2UgZmlsZXMgYW5kIHRoZWlyIGFjY2VzcyBtZXRob2RzIGFyZSB2ZXJ5IHN5c3RlbQorICogIHNwZWNpZmljIGluZGVlZC4KKyAqCisgKiAgRm9yIHV0bXB4IHN5c3RlbXMsIHRoZSBjb3JyZXNwb25kaW5nIGxpYnJhcnkgZnVuY3Rpb25zIGFyZQorICogIHNldHV0eGVudCgpIGV0Yy4gVG8gdGhlIGF1dGhvcidzIGtub3dsZWRnZSwgYWxsIHV0bXB4IHN5c3RlbXMgaGF2ZQorICogIHRoZXNlIGxpYnJhcnkgZnVuY3Rpb25zIGFuZCBzbyBubyBkaXJlY3Qgd3JpdGUgaXMgYXR0ZW1wdGVkLiBJZiBzdWNoCisgKiAgYSBzeXN0ZW0gZXhpc3RzIGFuZCBuZWVkcyBzdXBwb3J0LCBkaXJlY3QgYW5hbG9ndWVzIG9mIHRoZSBbdXdddG1wCisgKiAgY29kZSBzaG91bGQgc3VmZmljZS4KKyAqCisgKiAgUmV0cmlldmluZyB0aGUgdGltZSBvZiBsYXN0IGxvZ2luICgnbGFzdGxvZycpIGlzIGluIHNvbWUgd2F5cyBldmVuCisgKiAgbW9yZSBwcm9ibGVtbWF0aWMgdGhhbiBsb2dpbiByZWNvcmRpbmcuIFNvbWUgc3lzdGVtcyBwcm92aWRlIGEKKyAqICBzaW1wbGUgdGFibGUgb2YgYWxsIHVzZXJzIHdoaWNoIHdlIHNlZWsgYmFzZWQgb24gdWlkIGFuZCByZXRyaWV2ZSBhCisgKiAgcmVsYXRpdmVseSBzdGFuZGFyZCBzdHJ1Y3R1cmUuIE90aGVycyByZWNvcmQgdGhlIHNhbWUgaW5mb3JtYXRpb24gaW4KKyAqICBhIGRpcmVjdG9yeSB3aXRoIGEgc2VwYXJhdGUgZmlsZSwgYW5kIG90aGVycyBkb24ndCByZWNvcmQgdGhlCisgKiAgaW5mb3JtYXRpb24gc2VwYXJhdGVseSBhdCBhbGwuIEZvciBzeXN0ZW1zIGluIHRoZSBsYXR0ZXIgY2F0ZWdvcnksCisgKiAgd2UgbG9vayBiYWNrd2FyZHMgaW4gdGhlIHd0bXAgb3Igd3RtcHggZmlsZSBmb3IgdGhlIGxhc3QgbG9naW4gZW50cnkKKyAqICBmb3Igb3VyIHVzZXIuIE5hdHVyYWxseSB0aGlzIGlzIHNsb3dlciBhbmQgb24gYnVzeSBzeXN0ZW1zIGNvdWxkCisgKiAgaW5jdXIgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBwZW5hbHR5LgorICoKKyAqICBDYWxsaW5nIHRoZSBuZXcgY29kZQorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogIEluIE9wZW5TU0ggYWxsIGxvZ2luIHJlY29yZGluZyBhbmQgcmV0cmlldmFsIGlzIHBlcmZvcm1lZCBpbgorICogIGxvZ2luLmMuIEhlcmUgeW91J2xsIGZpbmQgd29ya2luZyBleGFtcGxlcy4gQWxzbywgaW4gdGhlIGxvZ2ludGVzdC5jCisgKiAgcHJvZ3JhbSB0aGVyZSBhcmUgbW9yZSBleGFtcGxlcy4KKyAqCisgKiAgSW50ZXJuYWwgaGFuZGxlciBjYWxsaW5nIG1ldGhvZAorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgV2hlbiBhIGNhbGwgaXMgbWFkZSB0byBsb2dpbl9sb2dpbigpIG9yIGxvZ2luX2xvZ291dCgpLCBib3RoCisgKiAgcm91dGluZXMgc2V0IGEgc3RydWN0IGxvZ2luaW5mbyBmbGFnIGRlZmluaW5nIHdoaWNoIGFjdGlvbiAobG9nIGluLAorICogIG9yIGxvZyBvdXQpIGlzIHRvIGJlIHRha2VuLiBUaGV5IGJvdGggdGhlbiBjYWxsIGxvZ2luX3dyaXRlKCksIHdoaWNoCisgKiAgY2FsbHMgd2hpY2hldmVyIG9mIHRoZSBtYW55IHN0cnVjdHVyZS1zcGVjaWZpYyBoYW5kbGVycyBhdXRvY29uZgorICogIHNlbGVjdHMgZm9yIHRoZSBsb2NhbCBzeXN0ZW0uCisgKgorICogIFRoZSBoYW5kbGVycyB0aGVtc2VsdmVzIGhhbmRsZSBzeXN0ZW0gZGF0YSBzdHJ1Y3R1cmUgc3BlY2lmaWNzLiBCb3RoCisgKiAgc3RydWN0IHV0bXAgYW5kIHN0cnVjdCB1dG1weCBoYXZlIHV0aWxpdHkgZnVuY3Rpb25zIChzZWUKKyAqICBjb25zdHJ1Y3RfdXRtcCooKSkgdG8gdHJ5IHRvIG1ha2UgaXQgc2ltcGxlciB0byBhZGQgZXh0cmEgc3lzdGVtcworICogIHRoYXQgaW50cm9kdWNlIG5ldyBmZWF0dXJlcyB0byBlaXRoZXIgc3RydWN0dXJlLgorICoKKyAqICBXaGlsZSBpdCBtYXkgc2VlbSB0ZXJyaWJseSB3YXN0ZWZ1bCB0byByZXBsaWNhdGUgc28gbXVjaCBzaW1pbGFyCisgKiAgY29kZSBmb3IgZWFjaCBtZXRob2QsIGV4cGVyaWVuY2UgaGFzIHNob3duIHRoYXQgbWFpbnRhaW5pbmcgY29kZSB0bworICogIHdyaXRlIGJvdGggc3RydWN0IHV0bXAgYW5kIHV0bXB4IGluIG9uZSBmdW5jdGlvbiwgd2hpbHN0IG1haW50YWluaW5nCisgKiAgc3VwcG9ydCBmb3IgYWxsIHN5c3RlbXMgd2hldGhlciB0aGV5IGhhdmUgbGlicmFyeSBzdXBwb3J0IG9yIG5vdCwgaXMKKyAqICBhIGRpZmZpY3VsdCBhbmQgdGltZS1jb25zdW1pbmcgdGFzay4KKyAqCisgKiAgTGFzdGxvZyBzdXBwb3J0IHByb2NlZWRzIHNpbWlsYXJseS4gRnVuY3Rpb25zIGxvZ2luX2dldF9sYXN0bG9nKCkKKyAqICAoYW5kIGl0cyBPcGVuU1NILXR1bmVkIGZyaWVuZCBsb2dpbl9nZXRfbGFzdGxvZ190aW1lKCkpIGNhbGwKKyAqICBnZXRsYXN0X2VudHJ5KCksIHdoaWNoIHRyaWVzIG9uZSBvZiB0aHJlZSBtZXRob2RzIHRvIGZpbmQgdGhlIGxhc3QKKyAqICBsb2dpbiB0aW1lLiBJdCB1c2VzIGxvY2FsIHN5c3RlbSBsYXN0bG9nIHN1cHBvcnQgaWYgaXQgY2FuLAorICogIG90aGVyd2lzZSBpdCB0cmllcyB3dG1wIG9yIHd0bXB4IGJlZm9yZSBnaXZpbmcgdXAgYW5kIHJldHVybmluZyAwLAorICogIG1lYW5pbmcgInRpbHQiLgorICoKKyAqICBNYWludGVuYW5jZQorICogIC0tLS0tLS0tLS0tCisgKgorICogIEluIG1hbnkgY2FzZXMgaXQncyBwb3NzaWJsZSB0byB0d2VhayBhdXRvY29uZiB0byBzZWxlY3QgdGhlIGNvcnJlY3QKKyAqICBtZXRob2RzIGZvciBhIHBhcnRpY3VsYXIgcGxhdGZvcm0sIGVpdGhlciBieSBpbXByb3ZpbmcgdGhlIGRldGVjdGlvbgorICogIGNvZGUgKGJlc3QpLCBvciBieSBwcmVzZXR0aW5nIERJU0FCTEVfPG1ldGhvZD4gb3IgQ09ORl88bWV0aG9kPl9GSUxFCisgKiAgc3ltYm9scyBmb3IgdGhlIHBsYXRmb3JtLgorICoKKyAqICBVc2UgbG9naW50ZXN0IHRvIGNoZWNrIHdoaWNoIHN5bWJvbHMgYXJlIGRlZmluZWQgYmVmb3JlIG1vZGlmeWluZworICogIGNvbmZpZ3VyZS5hYyBhbmQgbG9naW5yZWMuYy4gKFlvdSBoYXZlIHRvIGJ1aWxkIGxvZ2ludGVzdCB5b3Vyc2VsZgorICogIHdpdGggJ21ha2UgbG9naW50ZXN0JyBhcyBpdCdzIG5vdCBidWlsdCBieSBkZWZhdWx0LikKKyAqCisgKiAgT3RoZXJ3aXNlLCBwYXRjaGVzIHRvIHRoZSBzcGVjaWZpYyBtZXRob2QocykgYXJlIHZlcnkgaGVscGZ1bCEKKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2lmZGVmIEhBVkVfUEFUSFNfSAorIyBpbmNsdWRlIDxwYXRocy5oPgorI2VuZGlmCisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgImhvc3RmaWxlLmgiCisjaW5jbHVkZSAic3NoLmgiCisjaW5jbHVkZSAibG9naW5yZWMuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJhdG9taWNpby5oIgorI2luY2x1ZGUgInBhY2tldC5oIgorI2luY2x1ZGUgImNhbm9ob3N0LmgiCisjaW5jbHVkZSAiYXV0aC5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorCisjaWZkZWYgSEFWRV9VVElMX0gKKyMgaW5jbHVkZSA8dXRpbC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0xJQlVUSUxfSAorIyBpbmNsdWRlIDxsaWJ1dGlsLmg+CisjZW5kaWYKKworLyoqCisgKiogcHJvdG90eXBlcyBmb3IgaGVscGVyIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUKKyAqKi8KKworI2lmIEhBVkVfVVRNUF9ICit2b2lkIHNldF91dG1wX3RpbWUoc3RydWN0IGxvZ2luaW5mbyAqbGksIHN0cnVjdCB1dG1wICp1dCk7Cit2b2lkIGNvbnN0cnVjdF91dG1wKHN0cnVjdCBsb2dpbmluZm8gKmxpLCBzdHJ1Y3QgdXRtcCAqdXQpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VUTVBYX0gKK3ZvaWQgc2V0X3V0bXB4X3RpbWUoc3RydWN0IGxvZ2luaW5mbyAqbGksIHN0cnVjdCB1dG1weCAqdXQpOwordm9pZCBjb25zdHJ1Y3RfdXRtcHgoc3RydWN0IGxvZ2luaW5mbyAqbGksIHN0cnVjdCB1dG1weCAqdXQpOworI2VuZGlmCisKK2ludCB1dG1wX3dyaXRlX2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpKTsKK2ludCB1dG1weF93cml0ZV9lbnRyeShzdHJ1Y3QgbG9naW5pbmZvICpsaSk7CitpbnQgd3RtcF93cml0ZV9lbnRyeShzdHJ1Y3QgbG9naW5pbmZvICpsaSk7CitpbnQgd3RtcHhfd3JpdGVfZW50cnkoc3RydWN0IGxvZ2luaW5mbyAqbGkpOworaW50IGxhc3Rsb2dfd3JpdGVfZW50cnkoc3RydWN0IGxvZ2luaW5mbyAqbGkpOworaW50IHN5c2xvZ2luX3dyaXRlX2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpKTsKKworaW50IGdldGxhc3RfZW50cnkoc3RydWN0IGxvZ2luaW5mbyAqbGkpOworaW50IGxhc3Rsb2dfZ2V0X2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpKTsKK2ludCB1dG1weF9nZXRfZW50cnkoc3RydWN0IGxvZ2luaW5mbyAqbGkpOworaW50IHd0bXBfZ2V0X2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpKTsKK2ludCB3dG1weF9nZXRfZW50cnkoc3RydWN0IGxvZ2luaW5mbyAqbGkpOworCitleHRlcm4gQnVmZmVyIGxvZ2lubXNnOworCisvKiBwaWNrIHRoZSBzaG9ydGVzdCBzdHJpbmcgKi8KKyNkZWZpbmUgTUlOX1NJWkVPRihzMSxzMikgKHNpemVvZihzMSkgPCBzaXplb2YoczIpID8gc2l6ZW9mKHMxKSA6IHNpemVvZihzMikpCisKKy8qKgorICoqIHBsYXRmb3JtLWluZGVwZW5kZW50IGxvZ2luIGZ1bmN0aW9ucworICoqLworCisvKgorICogbG9naW5fbG9naW4oc3RydWN0IGxvZ2luaW5mbyAqKSAtIFJlY29yZCBhIGxvZ2luCisgKgorICogQ2FsbCB3aXRoIGEgcG9pbnRlciB0byBhIHN0cnVjdCBsb2dpbmluZm8gaW5pdGlhbGlzZWQgd2l0aAorICogbG9naW5faW5pdF9lbnRyeSgpIG9yIGxvZ2luX2FsbG9jX2VudHJ5KCkKKyAqCisgKiBSZXR1cm5zOgorICogID4wIGlmIHN1Y2Nlc3NmdWwKKyAqICAwICBvbiBmYWlsdXJlICh3aWxsIHVzZSBPcGVuU1NIJ3MgbG9nZ2luZyBmYWNpbGl0aWVzIGZvciBkaWFnbm9zdGljcykKKyAqLworaW50Citsb2dpbl9sb2dpbihzdHJ1Y3QgbG9naW5pbmZvICpsaSkKK3sKKwlsaS0+dHlwZSA9IExUWVBFX0xPR0lOOworCXJldHVybiAobG9naW5fd3JpdGUobGkpKTsKK30KKworCisvKgorICogbG9naW5fbG9nb3V0KHN0cnVjdCBsb2dpbmluZm8gKikgLSBSZWNvcmQgYSBsb2dvdXQKKyAqCisgKiBDYWxsIGFzIHdpdGggbG9naW5fbG9naW4oKQorICoKKyAqIFJldHVybnM6CisgKiAgPjAgaWYgc3VjY2Vzc2Z1bAorICogIDAgIG9uIGZhaWx1cmUgKHdpbGwgdXNlIE9wZW5TU0gncyBsb2dnaW5nIGZhY2lsaXRpZXMgZm9yIGRpYWdub3N0aWNzKQorICovCitpbnQKK2xvZ2luX2xvZ291dChzdHJ1Y3QgbG9naW5pbmZvICpsaSkKK3sKKwlsaS0+dHlwZSA9IExUWVBFX0xPR09VVDsKKwlyZXR1cm4gKGxvZ2luX3dyaXRlKGxpKSk7Cit9CisKKy8qCisgKiBsb2dpbl9nZXRfbGFzdGxvZ190aW1lKGludCkgLSBSZXRyaWV2ZSB0aGUgbGFzdCBsb2dpbiB0aW1lCisgKgorICogUmV0cmlldmUgdGhlIGxhc3QgbG9naW4gdGltZSBmb3IgdGhlIGdpdmVuIHVpZC4gV2lsbCB0cnkgdG8gdXNlIHRoZQorICogc3lzdGVtIGxhc3Rsb2cgZmFjaWxpdGllcyBpZiB0aGV5IGFyZSBhdmFpbGFibGUsIGJ1dCB3aWxsIGZhbGwgYmFjaworICogdG8gbG9va2luZyBpbiB3dG1wL3d0bXB4IGlmIG5lY2Vzc2FyeQorICoKKyAqIFJldHVybnM6CisgKiAgIDAgb24gZmFpbHVyZSwgb3IgaWYgdXNlciBoYXMgbmV2ZXIgbG9nZ2VkIGluCisgKiAgIFRpbWUgaW4gc2Vjb25kcyBmcm9tIHRoZSBlcG9jaCBpZiBzdWNjZXNzZnVsCisgKgorICogVXNlZnVsIHByZXByb2Nlc3NvciBzeW1ib2xzOgorICogICBESVNBQkxFX0xBU1RMT0c6IElmIHNldCwgKm5ldmVyKiBldmVuIHRyeSB0byByZXRyaWV2ZSBsYXN0bG9nCisgKiAgICAgICAgICAgICAgICAgICAgaW5mbworICogICBVU0VfTEFTVExPRzogSWYgc2V0LCBpbmRpY2F0ZXMgdGhlIHByZXNlbmNlIG9mIHN5c3RlbSBsYXN0bG9nCisgKiAgICAgICAgICAgICAgICBmYWNpbGl0aWVzLiBJZiB0aGlzIGFuZCBESVNBQkxFX0xBU1RMT0cgYXJlIG5vdCBzZXQsCisgKiAgICAgICAgICAgICAgICB0cnkgdG8gcmV0cmlldmUgbGFzdGxvZyBpbmZvcm1hdGlvbiBmcm9tIHd0bXAvd3RtcHguCisgKi8KK3Vuc2lnbmVkIGludAorbG9naW5fZ2V0X2xhc3Rsb2dfdGltZShjb25zdCB1aWRfdCB1aWQpCit7CisJc3RydWN0IGxvZ2luaW5mbyBsaTsKKworCWlmIChsb2dpbl9nZXRfbGFzdGxvZygmbGksIHVpZCkpCisJCXJldHVybiAobGkudHZfc2VjKTsKKwllbHNlCisJCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBsb2dpbl9nZXRfbGFzdGxvZyhzdHJ1Y3QgbG9naW5pbmZvICosIGludCkgICAtIFJldHJpZXZlIGEgbGFzdGxvZyBlbnRyeQorICoKKyAqIFJldHJpZXZlIGEgbG9naW5pbmZvIHN0cnVjdHVyZSBwb3B1bGF0ZWQgKG9ubHkgcGFydGlhbGx5KSB3aXRoCisgKiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzeXN0ZW0gbGFzdGxvZyBkYXRhLCBvciBmcm9tIHd0bXAvd3RtcHggaWYgbm8KKyAqIHN5c3RlbSBsYXN0bG9nIGluZm9ybWF0aW9uIGV4aXN0cy4KKyAqCisgKiBOb3RlIHRoaXMgcm91dGluZSBtdXN0IGJlIGdpdmVuIGEgcHJlLWFsbG9jYXRlZCBsb2dpbmluZm8uCisgKgorICogUmV0dXJuczoKKyAqICA+MDogQSBwb2ludGVyIHRvIHlvdXIgc3RydWN0IGxvZ2luaW5mbyBpZiBzdWNjZXNzZnVsCisgKiAgMCAgb24gZmFpbHVyZSAod2lsbCB1c2UgT3BlblNTSCdzIGxvZ2dpbmcgZmFjaWxpdGllcyBmb3IgZGlhZ25vc3RpY3MpCisgKi8KK3N0cnVjdCBsb2dpbmluZm8gKgorbG9naW5fZ2V0X2xhc3Rsb2coc3RydWN0IGxvZ2luaW5mbyAqbGksIGNvbnN0IHVpZF90IHVpZCkKK3sKKwlzdHJ1Y3QgcGFzc3dkICpwdzsKKworCW1lbXNldChsaSwgJ1wwJywgc2l6ZW9mKCpsaSkpOworCWxpLT51aWQgPSB1aWQ7CisKKwkvKgorCSAqIElmIHdlIGRvbid0IGhhdmUgYSAncmVhbCcgbGFzdGxvZywgd2UgbmVlZCB0aGUgdXNlcm5hbWUgdG8KKwkgKiByZWxpYWJseSBzZWFyY2ggd3RtcCh4KSBmb3IgdGhlIGxhc3QgbG9naW4gKHNlZQorCSAqIHd0bXBfZ2V0X2VudHJ5KCkuKQorCSAqLworCXB3ID0gZ2V0cHd1aWQodWlkKTsKKwlpZiAocHcgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBDYW5ub3QgZmluZCBhY2NvdW50IGZvciB1aWQgJWxkIiwgX19mdW5jX18sCisJCSAgICAobG9uZyl1aWQpOworCisJLyogTm8gTUlOX1NJWkVPRiBoZXJlIC0gd2UgYWJzb2x1dGVseSAqbXVzdCBub3QqIHRydW5jYXRlIHRoZQorCSAqIHVzZXJuYW1lIChYWFggLSBzbyBjaGVjayBmb3IgdHJ1bmMhKSAqLworCXN0cmxjcHkobGktPnVzZXJuYW1lLCBwdy0+cHdfbmFtZSwgc2l6ZW9mKGxpLT51c2VybmFtZSkpOworCisJaWYgKGdldGxhc3RfZW50cnkobGkpKQorCQlyZXR1cm4gKGxpKTsKKwllbHNlCisJCXJldHVybiAoTlVMTCk7Cit9CisKKworLyoKKyAqIGxvZ2luX2FsbG9jX2VudHJ5KGludCwgY2hhciosIGNoYXIqLCBjaGFyKikgICAgLSBBbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgbG9naW5pbmZvIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIG5ldyBzdHJ1Y3QgbG9naW5pbmZvLCBhIGRhdGEgc3RydWN0dXJlCisgKiBtZWFudCB0byBjYXJyeSB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gcG9ydGFibHkgcmVjb3JkIGxvZ2luIGluZm8uCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBuZXdseSBjcmVhdGVkIHN0cnVjdCBsb2dpbmluZm8uIElmIG1lbW9yeQorICogYWxsb2NhdGlvbiBmYWlscywgdGhlIHByb2dyYW0gaGFsdHMuCisgKi8KK3N0cnVjdAorbG9naW5pbmZvICpsb2dpbl9hbGxvY19lbnRyeShwaWRfdCBwaWQsIGNvbnN0IGNoYXIgKnVzZXJuYW1lLAorICAgIGNvbnN0IGNoYXIgKmhvc3RuYW1lLCBjb25zdCBjaGFyICpsaW5lKQoreworCXN0cnVjdCBsb2dpbmluZm8gKm5ld2xpOworCisJbmV3bGkgPSB4bWFsbG9jKHNpemVvZigqbmV3bGkpKTsKKwlsb2dpbl9pbml0X2VudHJ5KG5ld2xpLCBwaWQsIHVzZXJuYW1lLCBob3N0bmFtZSwgbGluZSk7CisJcmV0dXJuIChuZXdsaSk7Cit9CisKKworLyogbG9naW5fZnJlZV9lbnRyeShzdHJ1Y3QgbG9naW5pbmZvICopICAgIC0gZnJlZSBzdHJ1Y3QgbWVtb3J5ICovCit2b2lkCitsb2dpbl9mcmVlX2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpKQoreworCXhmcmVlKGxpKTsKK30KKworCisvKiBsb2dpbl9pbml0X2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKiwgaW50LCBjaGFyKiwgY2hhciosIGNoYXIqKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBpbml0aWFsaXNlIGEgc3RydWN0IGxvZ2luaW5mbworICoKKyAqIFBvcHVsYXRlcyBhIG5ldyBzdHJ1Y3QgbG9naW5pbmZvLCBhIGRhdGEgc3RydWN0dXJlIG1lYW50IHRvIGNhcnJ5CisgKiB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gcG9ydGFibHkgcmVjb3JkIGxvZ2luIGluZm8uCisgKgorICogUmV0dXJuczogMQorICovCitpbnQKK2xvZ2luX2luaXRfZW50cnkoc3RydWN0IGxvZ2luaW5mbyAqbGksIHBpZF90IHBpZCwgY29uc3QgY2hhciAqdXNlcm5hbWUsCisgICAgY29uc3QgY2hhciAqaG9zdG5hbWUsIGNvbnN0IGNoYXIgKmxpbmUpCit7CisJc3RydWN0IHBhc3N3ZCAqcHc7CisKKwltZW1zZXQobGksIDAsIHNpemVvZigqbGkpKTsKKworCWxpLT5waWQgPSBwaWQ7CisKKwkvKiBzZXQgdGhlIGxpbmUgaW5mb3JtYXRpb24gKi8KKwlpZiAobGluZSkKKwkJbGluZV9mdWxsbmFtZShsaS0+bGluZSwgbGluZSwgc2l6ZW9mKGxpLT5saW5lKSk7CisKKwlpZiAodXNlcm5hbWUpIHsKKwkJc3RybGNweShsaS0+dXNlcm5hbWUsIHVzZXJuYW1lLCBzaXplb2YobGktPnVzZXJuYW1lKSk7CisJCXB3ID0gZ2V0cHduYW0obGktPnVzZXJuYW1lKTsKKwkJaWYgKHB3ID09IE5VTEwpIHsKKwkJCWZhdGFsKCIlczogQ2Fubm90IGZpbmQgdXNlciBcIiVzXCIiLCBfX2Z1bmNfXywKKwkJCSAgICBsaS0+dXNlcm5hbWUpOworCQl9CisJCWxpLT51aWQgPSBwdy0+cHdfdWlkOworCX0KKworCWlmIChob3N0bmFtZSkKKwkJc3RybGNweShsaS0+aG9zdG5hbWUsIGhvc3RuYW1lLCBzaXplb2YobGktPmhvc3RuYW1lKSk7CisKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogbG9naW5fc2V0X2N1cnJlbnRfdGltZShzdHJ1Y3QgbG9naW5pbmZvICopICAgIC0gc2V0IHRoZSBjdXJyZW50IHRpbWUKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgdGltZSBpbiBhIGxvZ2luaW5mbyBzdHJ1Y3R1cmUuIFRoaXMgZnVuY3Rpb24gaXMKKyAqIG1lYW50IHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCB0byBkZWFsIHdpdGggc3lzdGVtIGRlcGVuZGVuY2llcyBmb3IKKyAqIHRpbWUgaGFuZGxpbmcuCisgKi8KK3ZvaWQKK2xvZ2luX3NldF9jdXJyZW50X3RpbWUoc3RydWN0IGxvZ2luaW5mbyAqbGkpCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisKKwlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKworCWxpLT50dl9zZWMgPSB0di50dl9zZWM7CisJbGktPnR2X3VzZWMgPSB0di50dl91c2VjOworfQorCisvKiBjb3B5IGEgc29ja2FkZHJfKiBpbnRvIG91ciBsb2dpbmluZm8gKi8KK3ZvaWQKK2xvZ2luX3NldF9hZGRyKHN0cnVjdCBsb2dpbmluZm8gKmxpLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhLAorICAgIGNvbnN0IHVuc2lnbmVkIGludCBzYV9zaXplKQoreworCXVuc2lnbmVkIGludCBidWZzaXplID0gc2Ffc2l6ZTsKKworCS8qIG1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVycnVuIG91ciB1bmlvbiAqLworCWlmIChzaXplb2YobGktPmhvc3RhZGRyKSA8IHNhX3NpemUpCisJCWJ1ZnNpemUgPSBzaXplb2YobGktPmhvc3RhZGRyKTsKKworCW1lbWNweSgmbGktPmhvc3RhZGRyLnNhLCBzYSwgYnVmc2l6ZSk7Cit9CisKKworLyoqCisgKiogbG9naW5fd3JpdGU6IENhbGwgbG93LWxldmVsIHJlY29yZGluZyBmdW5jdGlvbnMgYmFzZWQgb24gYXV0b2NvbmYKKyAqKiByZXN1bHRzCisgKiovCitpbnQKK2xvZ2luX3dyaXRlKHN0cnVjdCBsb2dpbmluZm8gKmxpKQoreworI2lmbmRlZiBIQVZFX0NZR1dJTgorCWlmIChnZXRldWlkKCkgIT0gMCkgeworCQlsb2dpdCgiQXR0ZW1wdCB0byB3cml0ZSBsb2dpbiByZWNvcmRzIGJ5IG5vbi1yb290IHVzZXIgKGFib3J0aW5nKSIpOworCQlyZXR1cm4gKDEpOworCX0KKyNlbmRpZgorCisJLyogc2V0IHRoZSB0aW1lc3RhbXAgKi8KKwlsb2dpbl9zZXRfY3VycmVudF90aW1lKGxpKTsKKyNpZmRlZiBVU0VfTE9HSU4KKwlzeXNsb2dpbl93cml0ZV9lbnRyeShsaSk7CisjZW5kaWYKKyNpZmRlZiBVU0VfTEFTVExPRworCWlmIChsaS0+dHlwZSA9PSBMVFlQRV9MT0dJTikKKwkJbGFzdGxvZ193cml0ZV9lbnRyeShsaSk7CisjZW5kaWYKKyNpZmRlZiBVU0VfVVRNUAorCXV0bXBfd3JpdGVfZW50cnkobGkpOworI2VuZGlmCisjaWZkZWYgVVNFX1dUTVAKKwl3dG1wX3dyaXRlX2VudHJ5KGxpKTsKKyNlbmRpZgorI2lmZGVmIFVTRV9VVE1QWAorCXV0bXB4X3dyaXRlX2VudHJ5KGxpKTsKKyNlbmRpZgorI2lmZGVmIFVTRV9XVE1QWAorCXd0bXB4X3dyaXRlX2VudHJ5KGxpKTsKKyNlbmRpZgorI2lmZGVmIENVU1RPTV9TWVNfQVVUSF9SRUNPUkRfTE9HSU4KKwlpZiAobGktPnR5cGUgPT0gTFRZUEVfTE9HSU4gJiYKKwkgICAgIXN5c19hdXRoX3JlY29yZF9sb2dpbihsaS0+dXNlcm5hbWUsbGktPmhvc3RuYW1lLGxpLT5saW5lLAorCSAgICAmbG9naW5tc2cpKQorCQlsb2dpdCgiV3JpdGluZyBsb2dpbiByZWNvcmQgZmFpbGVkIGZvciAlcyIsIGxpLT51c2VybmFtZSk7CisjZW5kaWYKKyNpZmRlZiBTU0hfQVVESVRfRVZFTlRTCisJaWYgKGxpLT50eXBlID09IExUWVBFX0xPR0lOKQorCQlhdWRpdF9zZXNzaW9uX29wZW4obGkpOworCWVsc2UgaWYgKGxpLT50eXBlID09IExUWVBFX0xPR09VVCkKKwkJYXVkaXRfc2Vzc2lvbl9jbG9zZShsaSk7CisjZW5kaWYKKwlyZXR1cm4gKDApOworfQorCisjaWZkZWYgTE9HSU5fTkVFRFNfVVRNUFgKK2ludAorbG9naW5fdXRtcF9vbmx5KHN0cnVjdCBsb2dpbmluZm8gKmxpKQoreworCWxpLT50eXBlID0gTFRZUEVfTE9HSU47CisJbG9naW5fc2V0X2N1cnJlbnRfdGltZShsaSk7CisjIGlmZGVmIFVTRV9VVE1QCisJdXRtcF93cml0ZV9lbnRyeShsaSk7CisjIGVuZGlmCisjIGlmZGVmIFVTRV9XVE1QCisJd3RtcF93cml0ZV9lbnRyeShsaSk7CisjIGVuZGlmCisjIGlmZGVmIFVTRV9VVE1QWAorCXV0bXB4X3dyaXRlX2VudHJ5KGxpKTsKKyMgZW5kaWYKKyMgaWZkZWYgVVNFX1dUTVBYCisJd3RtcHhfd3JpdGVfZW50cnkobGkpOworIyBlbmRpZgorCXJldHVybiAoMCk7Cit9CisjZW5kaWYKKworLyoqCisgKiogZ2V0bGFzdF9lbnRyeTogQ2FsbCBsb3ctbGV2ZWwgZnVuY3Rpb25zIHRvIHJldHJpZXZlIHRoZSBsYXN0IGxvZ2luCisgKiogICAgICAgICAgICAgICAgdGltZS4KKyAqKi8KKworLyogdGFrZSB0aGUgdWlkIGluIGxpIGFuZCByZXR1cm4gdGhlIGxhc3QgbG9naW4gdGltZSAqLworaW50CitnZXRsYXN0X2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpKQoreworI2lmZGVmIFVTRV9MQVNUTE9HCisJcmV0dXJuKGxhc3Rsb2dfZ2V0X2VudHJ5KGxpKSk7CisjZWxzZSAvKiAhVVNFX0xBU1RMT0cgKi8KKyNpZiBkZWZpbmVkKFVTRV9VVE1QWCkgJiYgZGVmaW5lZChIQVZFX1NFVFVUWERCKSAmJiBcCisgICAgZGVmaW5lZChVVFhEQl9MQVNUTE9HSU4pICYmIGRlZmluZWQoSEFWRV9HRVRVVFhVU0VSKQorCXJldHVybiAodXRtcHhfZ2V0X2VudHJ5KGxpKSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoRElTQUJMRV9MQVNUTE9HKQorCS8qIE9uIHNvbWUgc3lzdGVtcyB3ZSBzaG91bGRuJ3QgZXZlbiB0cnkgdG8gb2J0YWluIGxhc3QgbG9naW4KKwkgKiB0aW1lLCBlLmcuIEFJWCAqLworCXJldHVybiAoMCk7CisjIGVsaWYgZGVmaW5lZChVU0VfV1RNUCkgJiYgXAorICAgIChkZWZpbmVkKEhBVkVfVElNRV9JTl9VVE1QKSB8fCBkZWZpbmVkKEhBVkVfVFZfSU5fVVRNUCkpCisJLyogcmV0cmlldmUgbGFzdCBsb2dpbiB0aW1lIGZyb20gdXRtcCAqLworCXJldHVybiAod3RtcF9nZXRfZW50cnkobGkpKTsKKyMgZWxpZiBkZWZpbmVkKFVTRV9XVE1QWCkgJiYgXAorICAgIChkZWZpbmVkKEhBVkVfVElNRV9JTl9VVE1QWCkgfHwgZGVmaW5lZChIQVZFX1RWX0lOX1VUTVBYKSkKKwkvKiBJZiB3dG1wIGlzbid0IGF2YWlsYWJsZSwgdHJ5IHd0bXB4ICovCisJcmV0dXJuICh3dG1weF9nZXRfZW50cnkobGkpKTsKKyMgZWxzZQorCS8qIEdpdmUgdXA6IE5vIG1lYW5zIG9mIHJldHJpZXZpbmcgbGFzdCBsb2dpbiB0aW1lICovCisJcmV0dXJuICgwKTsKKyMgZW5kaWYgLyogRElTQUJMRV9MQVNUTE9HICovCisjZW5kaWYgLyogVVNFX0xBU1RMT0cgKi8KK30KKworCisKKy8qCisgKiAnbGluZScgc3RyaW5nIHV0aWxpdHkgZnVuY3Rpb25zCisgKgorICogVGhlc2UgZnVuY3Rpb25zIHByb2Nlc3MgdGhlICdsaW5lJyBzdHJpbmcgaW50byBvbmUgb2YgdGhyZWUgZm9ybXM6CisgKgorICogMS4gVGhlIGZ1bGwgZmlsZW5hbWUgKGluY2x1ZGluZyAnL2RldicpCisgKiAyLiBUaGUgc3RyaXBwZWQgbmFtZSAoZXhjbHVkaW5nICcvZGV2JykKKyAqIDMuIFRoZSBhYmJyZXZpYXRlZCBuYW1lIChlLmcuIC9kZXYvdHR5cDAwIC0+IHlwMDAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9kZXYvcHRzLzEgIC0+IHRzLzEgKQorICoKKyAqIEZvcm0gMyBpcyB1c2VkIG9uIHNvbWUgc3lzdGVtcyB0byBpZGVudGlmeSBhIC50bXAuPyBlbnRyeSB3aGVuCisgKiBhdHRlbXB0aW5nIHRvIHJlbW92ZSBpdC4gVHlwaWNhbGx5IGJvdGggYWRkaXRpb24gYW5kIHJlbW92YWwgaXMKKyAqIHBlcmZvcm1lZCBieSBvbmUgYXBwbGljYXRpb24gLSBzYXksIHNzaGQgLSBzbyBhcyBsb25nIGFzIHRoZSBjaG9pY2UKKyAqIHVuaXF1ZWx5IGlkZW50aWZpZXMgYSB0ZXJtaW5hbCBpdCdzIG9rLgorICovCisKKworLyoKKyAqIGxpbmVfZnVsbG5hbWUoKTogYWRkIHRoZSBsZWFkaW5nICcvZGV2LycgaWYgaXQgZG9lc24ndCBleGlzdCBtYWtlCisgKiBzdXJlIGRzdCBoYXMgZW5vdWdoIHNwYWNlLCBpZiBub3QganVzdCBjb3B5IHNyYyAodWdoKQorICovCitjaGFyICoKK2xpbmVfZnVsbG5hbWUoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHVfaW50IGRzdHNpemUpCit7CisJbWVtc2V0KGRzdCwgJ1wwJywgZHN0c2l6ZSk7CisJaWYgKChzdHJuY21wKHNyYywgIi9kZXYvIiwgNSkgPT0gMCkgfHwgKGRzdHNpemUgPCAoc3RybGVuKHNyYykgKyA1KSkpCisJCXN0cmxjcHkoZHN0LCBzcmMsIGRzdHNpemUpOworCWVsc2UgeworCQlzdHJsY3B5KGRzdCwgIi9kZXYvIiwgZHN0c2l6ZSk7CisJCXN0cmxjYXQoZHN0LCBzcmMsIGRzdHNpemUpOworCX0KKwlyZXR1cm4gKGRzdCk7Cit9CisKKy8qIGxpbmVfc3RyaXBuYW1lKCk6IHN0cmlwIHRoZSBsZWFkaW5nICcvZGV2JyBpZiBpdCBleGlzdHMsIHJldHVybiBkc3QgKi8KK2NoYXIgKgorbGluZV9zdHJpcG5hbWUoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIGludCBkc3RzaXplKQoreworCW1lbXNldChkc3QsICdcMCcsIGRzdHNpemUpOworCWlmIChzdHJuY21wKHNyYywgIi9kZXYvIiwgNSkgPT0gMCkKKwkJc3RybGNweShkc3QsIHNyYyArIDUsIGRzdHNpemUpOworCWVsc2UKKwkJc3RybGNweShkc3QsIHNyYywgZHN0c2l6ZSk7CisJcmV0dXJuIChkc3QpOworfQorCisvKgorICogbGluZV9hYmJyZXZuYW1lKCk6IFJldHVybiB0aGUgYWJicmV2aWF0ZWQgKHVzdWFsbHkgZm91ci1jaGFyYWN0ZXIpCisgKiBmb3JtIG9mIHRoZSBsaW5lIChKdXN0IHVzZSB0aGUgbGFzdCA8ZHN0c2l6ZT4gY2hhcmFjdGVycyBvZiB0aGUKKyAqIGZ1bGwgbmFtZS4pCisgKgorICogTk9URTogdXNlIHN0cm5jcHkgYmVjYXVzZSB3ZSBkbyBOT1QgbmVjZXNzYXJpbHkgd2FudCB6ZXJvCisgKiB0ZXJtaW5hdGlvbgorICovCitjaGFyICoKK2xpbmVfYWJicmV2bmFtZShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgaW50IGRzdHNpemUpCit7CisJc2l6ZV90IGxlbjsKKworCW1lbXNldChkc3QsICdcMCcsIGRzdHNpemUpOworCisJLyogQWx3YXlzIHNraXAgcHJlZml4IGlmIHByZXNlbnQgKi8KKwlpZiAoc3RybmNtcChzcmMsICIvZGV2LyIsIDUpID09IDApCisJCXNyYyArPSA1OworCisjaWZkZWYgV0lUSF9BQkJSRVZfTk9fVFRZCisJaWYgKHN0cm5jbXAoc3JjLCAidHR5IiwgMykgPT0gMCkKKwkJc3JjICs9IDM7CisjZW5kaWYKKworCWxlbiA9IHN0cmxlbihzcmMpOworCisJaWYgKGxlbiA+IDApIHsKKwkJaWYgKCgoaW50KWxlbiAtIGRzdHNpemUpID4gMCkKKwkJCXNyYyArPSAgKChpbnQpbGVuIC0gZHN0c2l6ZSk7CisKKwkJLyogbm90ZTogX2Rvbid0XyBjaGFuZ2UgdGhpcyB0byBzdHJsY3B5ICovCisJCXN0cm5jcHkoZHN0LCBzcmMsIChzaXplX3QpZHN0c2l6ZSk7CisJfQorCisJcmV0dXJuIChkc3QpOworfQorCisvKioKKyAqKiB1dG1wIHV0aWxpdHkgZnVuY3Rpb25zCisgKioKKyAqKiBUaGVzZSBmdW5jdGlvbnMgbWFuaXB1bGF0ZSBzdHJ1Y3QgdXRtcCwgdGFraW5nIHN5c3RlbSBkaWZmZXJlbmNlcworICoqIGludG8gYWNjb3VudC4KKyAqKi8KKworI2lmIGRlZmluZWQoVVNFX1VUTVApIHx8IGRlZmluZWQgKFVTRV9XVE1QKSB8fCBkZWZpbmVkIChVU0VfTE9HSU4pCisKKy8qIGJ1aWxkIHRoZSB1dG1wIHN0cnVjdHVyZSAqLwordm9pZAorc2V0X3V0bXBfdGltZShzdHJ1Y3QgbG9naW5pbmZvICpsaSwgc3RydWN0IHV0bXAgKnV0KQoreworIyBpZiBkZWZpbmVkKEhBVkVfVFZfSU5fVVRNUCkKKwl1dC0+dXRfdHYudHZfc2VjID0gbGktPnR2X3NlYzsKKwl1dC0+dXRfdHYudHZfdXNlYyA9IGxpLT50dl91c2VjOworIyBlbGlmIGRlZmluZWQoSEFWRV9USU1FX0lOX1VUTVApCisJdXQtPnV0X3RpbWUgPSBsaS0+dHZfc2VjOworIyBlbmRpZgorfQorCit2b2lkCitjb25zdHJ1Y3RfdXRtcChzdHJ1Y3QgbG9naW5pbmZvICpsaSwKKwkJICAgIHN0cnVjdCB1dG1wICp1dCkKK3sKKyMgaWZkZWYgSEFWRV9BRERSX1Y2X0lOX1VUTVAKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzYTY7CisjIGVuZGlmCisKKwltZW1zZXQodXQsICdcMCcsIHNpemVvZigqdXQpKTsKKworCS8qIEZpcnN0IGZpbGwgb3V0IGZpZWxkcyB1c2VkIGZvciBib3RoIGxvZ2lucyBhbmQgbG9nb3V0cyAqLworCisjIGlmZGVmIEhBVkVfSURfSU5fVVRNUAorCWxpbmVfYWJicmV2bmFtZSh1dC0+dXRfaWQsIGxpLT5saW5lLCBzaXplb2YodXQtPnV0X2lkKSk7CisjIGVuZGlmCisKKyMgaWZkZWYgSEFWRV9UWVBFX0lOX1VUTVAKKwkvKiBUaGlzIGlzIGRvbmUgaGVyZSB0byBrZWVwIHV0bXAgY29uc3RhbnRzIG91dCBvZiBzdHJ1Y3QgbG9naW5pbmZvICovCisJc3dpdGNoIChsaS0+dHlwZSkgeworCWNhc2UgTFRZUEVfTE9HSU46CisJCXV0LT51dF90eXBlID0gVVNFUl9QUk9DRVNTOworI2lmZGVmIF9VTklDT1MKKwkJY3JheV9zZXRfdG1wZGlyKHV0KTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIExUWVBFX0xPR09VVDoKKwkJdXQtPnV0X3R5cGUgPSBERUFEX1BST0NFU1M7CisjaWZkZWYgX1VOSUNPUworCQljcmF5X3JldGFpbl91dG1wKHV0LCBsaS0+cGlkKTsKKyNlbmRpZgorCQlicmVhazsKKwl9CisjIGVuZGlmCisJc2V0X3V0bXBfdGltZShsaSwgdXQpOworCisJbGluZV9zdHJpcG5hbWUodXQtPnV0X2xpbmUsIGxpLT5saW5lLCBzaXplb2YodXQtPnV0X2xpbmUpKTsKKworIyBpZmRlZiBIQVZFX1BJRF9JTl9VVE1QCisJdXQtPnV0X3BpZCA9IGxpLT5waWQ7CisjIGVuZGlmCisKKwkvKiBJZiB3ZSdyZSBsb2dnaW5nIG91dCwgbGVhdmUgYWxsIG90aGVyIGZpZWxkcyBibGFuayAqLworCWlmIChsaS0+dHlwZSA9PSBMVFlQRV9MT0dPVVQpCisJCXJldHVybjsKKworCS8qCisJICogVGhlc2UgZmllbGRzIGFyZSBvbmx5IHVzZWQgd2hlbiBsb2dnaW5nIGluLCBhbmQgYXJlIGJsYW5rCisJICogZm9yIGxvZ291dHMuCisJICovCisKKwkvKiBVc2Ugc3RybmNweSBiZWNhdXNlIHdlIGRvbid0IG5lY2Vzc2FyaWx5IHdhbnQgbnVsbCB0ZXJtaW5hdGlvbiAqLworCXN0cm5jcHkodXQtPnV0X25hbWUsIGxpLT51c2VybmFtZSwKKwkgICAgTUlOX1NJWkVPRih1dC0+dXRfbmFtZSwgbGktPnVzZXJuYW1lKSk7CisjIGlmZGVmIEhBVkVfSE9TVF9JTl9VVE1QCisJc3RybmNweSh1dC0+dXRfaG9zdCwgbGktPmhvc3RuYW1lLAorCSAgICBNSU5fU0laRU9GKHV0LT51dF9ob3N0LCBsaS0+aG9zdG5hbWUpKTsKKyMgZW5kaWYKKyMgaWZkZWYgSEFWRV9BRERSX0lOX1VUTVAKKwkvKiB0aGlzIGlzIGp1c3QgYSAzMi1iaXQgSVAgYWRkcmVzcyAqLworCWlmIChsaS0+aG9zdGFkZHIuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQpCisJCXV0LT51dF9hZGRyID0gbGktPmhvc3RhZGRyLnNhX2luLnNpbl9hZGRyLnNfYWRkcjsKKyMgZW5kaWYKKyMgaWZkZWYgSEFWRV9BRERSX1Y2X0lOX1VUTVAKKwkvKiB0aGlzIGlzIGp1c3QgYSAxMjgtYml0IElQdjYgYWRkcmVzcyAqLworCWlmIChsaS0+aG9zdGFkZHIuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCXNhNiA9ICgoc3RydWN0IHNvY2thZGRyX2luNiAqKSZsaS0+aG9zdGFkZHIuc2EpOworCQltZW1jcHkodXQtPnV0X2FkZHJfdjYsIHNhNi0+c2luNl9hZGRyLnM2X2FkZHIsIDE2KTsKKwkJaWYgKElONl9JU19BRERSX1Y0TUFQUEVEKCZzYTYtPnNpbjZfYWRkcikpIHsKKwkJCXV0LT51dF9hZGRyX3Y2WzBdID0gdXQtPnV0X2FkZHJfdjZbM107CisJCQl1dC0+dXRfYWRkcl92NlsxXSA9IDA7CisJCQl1dC0+dXRfYWRkcl92NlsyXSA9IDA7CisJCQl1dC0+dXRfYWRkcl92NlszXSA9IDA7CisJCX0KKwl9CisjIGVuZGlmCit9CisjZW5kaWYgLyogVVNFX1VUTVAgfHwgVVNFX1dUTVAgfHwgVVNFX0xPR0lOICovCisKKy8qKgorICoqIHV0bXB4IHV0aWxpdHkgZnVuY3Rpb25zCisgKioKKyAqKiBUaGVzZSBmdW5jdGlvbnMgbWFuaXB1bGF0ZSBzdHJ1Y3QgdXRtcHgsIGFjY291bnRpbmcgZm9yIHN5c3RlbQorICoqIHZhcmlhdGlvbnMuCisgKiovCisKKyNpZiBkZWZpbmVkKFVTRV9VVE1QWCkgfHwgZGVmaW5lZCAoVVNFX1dUTVBYKQorLyogYnVpbGQgdGhlIHV0bXB4IHN0cnVjdHVyZSAqLwordm9pZAorc2V0X3V0bXB4X3RpbWUoc3RydWN0IGxvZ2luaW5mbyAqbGksIHN0cnVjdCB1dG1weCAqdXR4KQoreworIyBpZiBkZWZpbmVkKEhBVkVfVFZfSU5fVVRNUFgpCisJdXR4LT51dF90di50dl9zZWMgPSBsaS0+dHZfc2VjOworCXV0eC0+dXRfdHYudHZfdXNlYyA9IGxpLT50dl91c2VjOworIyBlbGlmIGRlZmluZWQoSEFWRV9USU1FX0lOX1VUTVBYKQorCXV0eC0+dXRfdGltZSA9IGxpLT50dl9zZWM7CisjIGVuZGlmCit9CisKK3ZvaWQKK2NvbnN0cnVjdF91dG1weChzdHJ1Y3QgbG9naW5pbmZvICpsaSwgc3RydWN0IHV0bXB4ICp1dHgpCit7CisjIGlmZGVmIEhBVkVfQUREUl9WNl9JTl9VVE1QCisJc3RydWN0IHNvY2thZGRyX2luNiAqc2E2OworIyAgZW5kaWYKKwltZW1zZXQodXR4LCAnXDAnLCBzaXplb2YoKnV0eCkpOworCisjIGlmZGVmIEhBVkVfSURfSU5fVVRNUFgKKwlsaW5lX2FiYnJldm5hbWUodXR4LT51dF9pZCwgbGktPmxpbmUsIHNpemVvZih1dHgtPnV0X2lkKSk7CisjIGVuZGlmCisKKwkvKiB0aGlzIGlzIGRvbmUgaGVyZSB0byBrZWVwIHV0bXAgY29uc3RhbnRzIG91dCBvZiBsb2dpbnJlYy5oICovCisJc3dpdGNoIChsaS0+dHlwZSkgeworCWNhc2UgTFRZUEVfTE9HSU46CisJCXV0eC0+dXRfdHlwZSA9IFVTRVJfUFJPQ0VTUzsKKwkJYnJlYWs7CisJY2FzZSBMVFlQRV9MT0dPVVQ6CisJCXV0eC0+dXRfdHlwZSA9IERFQURfUFJPQ0VTUzsKKwkJYnJlYWs7CisJfQorCWxpbmVfc3RyaXBuYW1lKHV0eC0+dXRfbGluZSwgbGktPmxpbmUsIHNpemVvZih1dHgtPnV0X2xpbmUpKTsKKwlzZXRfdXRtcHhfdGltZShsaSwgdXR4KTsKKwl1dHgtPnV0X3BpZCA9IGxpLT5waWQ7CisKKwkvKiBzdHJuY3B5KCk6IERvbid0IG5lY2Vzc2FyaWx5IHdhbnQgbnVsbCB0ZXJtaW5hdGlvbiAqLworCXN0cm5jcHkodXR4LT51dF91c2VyLCBsaS0+dXNlcm5hbWUsCisJICAgIE1JTl9TSVpFT0YodXR4LT51dF91c2VyLCBsaS0+dXNlcm5hbWUpKTsKKworCWlmIChsaS0+dHlwZSA9PSBMVFlQRV9MT0dPVVQpCisJCXJldHVybjsKKworCS8qCisJICogVGhlc2UgZmllbGRzIGFyZSBvbmx5IHVzZWQgd2hlbiBsb2dnaW5nIGluLCBhbmQgYXJlIGJsYW5rCisJICogZm9yIGxvZ291dHMuCisJICovCisKKyMgaWZkZWYgSEFWRV9IT1NUX0lOX1VUTVBYCisJc3RybmNweSh1dHgtPnV0X2hvc3QsIGxpLT5ob3N0bmFtZSwKKwkgICAgTUlOX1NJWkVPRih1dHgtPnV0X2hvc3QsIGxpLT5ob3N0bmFtZSkpOworIyBlbmRpZgorIyBpZmRlZiBIQVZFX0FERFJfSU5fVVRNUFgKKwkvKiB0aGlzIGlzIGp1c3QgYSAzMi1iaXQgSVAgYWRkcmVzcyAqLworCWlmIChsaS0+aG9zdGFkZHIuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQpCisJCXV0eC0+dXRfYWRkciA9IGxpLT5ob3N0YWRkci5zYV9pbi5zaW5fYWRkci5zX2FkZHI7CisjIGVuZGlmCisjIGlmZGVmIEhBVkVfQUREUl9WNl9JTl9VVE1QCisJLyogdGhpcyBpcyBqdXN0IGEgMTI4LWJpdCBJUHY2IGFkZHJlc3MgKi8KKwlpZiAobGktPmhvc3RhZGRyLnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQlzYTYgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmbGktPmhvc3RhZGRyLnNhKTsKKwkJbWVtY3B5KHV0LT51dF9hZGRyX3Y2LCBzYTYtPnNpbjZfYWRkci5zNl9hZGRyLCAxNik7CisJCWlmIChJTjZfSVNfQUREUl9WNE1BUFBFRCgmc2E2LT5zaW42X2FkZHIpKSB7CisJCQl1dC0+dXRfYWRkcl92NlswXSA9IHV0LT51dF9hZGRyX3Y2WzNdOworCQkJdXQtPnV0X2FkZHJfdjZbMV0gPSAwOworCQkJdXQtPnV0X2FkZHJfdjZbMl0gPSAwOworCQkJdXQtPnV0X2FkZHJfdjZbM10gPSAwOworCQl9CisJfQorIyBlbmRpZgorIyBpZmRlZiBIQVZFX1NZU0xFTl9JTl9VVE1QWAorCS8qIHV0X3N5c2xlbiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSB1dHhfaG9zdCBzdHJpbmcgKi8KKwl1dHgtPnV0X3N5c2xlbiA9IE1JTihzdHJsZW4obGktPmhvc3RuYW1lKSwgc2l6ZW9mKHV0eC0+dXRfaG9zdCkpOworIyBlbmRpZgorfQorI2VuZGlmIC8qIFVTRV9VVE1QWCB8fCBVU0VfV1RNUFggKi8KKworLyoqCisgKiogTG93LWxldmVsIHV0bXAgZnVuY3Rpb25zCisgKiovCisKKy8qIEZJWE1FOiAoQVRMKSB1dG1wX3dyaXRlX2RpcmVjdCBuZWVkcyB0ZXN0aW5nICovCisjaWZkZWYgVVNFX1VUTVAKKworLyogaWYgd2UgY2FuLCB1c2UgcHV0dXRsaW5lKCkgZXRjLiAqLworIyBpZiAhZGVmaW5lZChESVNBQkxFX1BVVFVUTElORSkgJiYgZGVmaW5lZChIQVZFX1NFVFVURU5UKSAmJiBcCisJZGVmaW5lZChIQVZFX1BVVFVUTElORSkKKyMgIGRlZmluZSBVVE1QX1VTRV9MSUJSQVJZCisjIGVuZGlmCisKKworLyogd3JpdGUgYSB1dG1wIGVudHJ5IHdpdGggdGhlIHN5c3RlbSdzIGhlbHAgKHB1dHV0bGluZSgpIGFuZCBwYWxzKSAqLworIyBpZmRlZiBVVE1QX1VTRV9MSUJSQVJZCitzdGF0aWMgaW50Cit1dG1wX3dyaXRlX2xpYnJhcnkoc3RydWN0IGxvZ2luaW5mbyAqbGksIHN0cnVjdCB1dG1wICp1dCkKK3sKKwlzZXR1dGVudCgpOworCXB1dHV0bGluZSh1dCk7CisjICBpZmRlZiBIQVZFX0VORFVURU5UCisJZW5kdXRlbnQoKTsKKyMgIGVuZGlmCisJcmV0dXJuICgxKTsKK30KKyMgZWxzZSAvKiBVVE1QX1VTRV9MSUJSQVJZICovCisKKy8qCisgKiBXcml0ZSBhIHV0bXAgZW50cnkgZGlyZWN0IHRvIHRoZSBmaWxlCisgKiBUaGlzIGlzIGEgc2xpZ2h0bHkgbW9kaWZpY2F0aW9uIG9mIGNvZGUgaW4gT3BlbkJTRCdzIGxvZ2luLmMKKyAqLworc3RhdGljIGludAordXRtcF93cml0ZV9kaXJlY3Qoc3RydWN0IGxvZ2luaW5mbyAqbGksIHN0cnVjdCB1dG1wICp1dCkKK3sKKwlzdHJ1Y3QgdXRtcCBvbGRfdXQ7CisJcmVnaXN0ZXIgaW50IGZkOworCWludCB0dHk7CisKKwkvKiBGSVhNRTogKEFUTCkgdHR5c2xvdCgpIG5lZWRzIGxvY2FsIGltcGxlbWVudGF0aW9uICovCisKKyNpZiBkZWZpbmVkKEhBVkVfR0VUVFRZRU5UKQorCXN0cnVjdCB0dHllbnQgKnR5OworCisJdHR5PTA7CisJc2V0dHR5ZW50KCk7CisJd2hpbGUgKE5VTEwgIT0gKHR5ID0gZ2V0dHR5ZW50KCkpKSB7CisJCXR0eSsrOworCQlpZiAoIXN0cm5jbXAodHktPnR5X25hbWUsIHV0LT51dF9saW5lLCBzaXplb2YodXQtPnV0X2xpbmUpKSkKKwkJCWJyZWFrOworCX0KKwllbmR0dHllbnQoKTsKKworCWlmIChOVUxMID09IHR5KSB7CisJCWxvZ2l0KCIlczogdHR5IG5vdCBmb3VuZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuICgwKTsKKwl9CisjZWxzZSAvKiBGSVhNRSAqLworCisJdHR5ID0gdHR5c2xvdCgpOyAvKiBzZWVtcyBvbmx5IHRvIHdvcmsgZm9yIC9kZXYvdHR5cD8gc3R5bGUgbmFtZXMgKi8KKworI2VuZGlmIC8qIEhBVkVfR0VUVFRZRU5UICovCisKKwlpZiAodHR5ID4gMCAmJiAoZmQgPSBvcGVuKFVUTVBfRklMRSwgT19SRFdSfE9fQ1JFQVQsIDA2NDQpKSA+PSAwKSB7CisJCW9mZl90IHBvcywgcmV0OworCisJCXBvcyA9IChvZmZfdCl0dHkgKiBzaXplb2Yoc3RydWN0IHV0bXApOworCQlpZiAoKHJldCA9IGxzZWVrKGZkLCBwb3MsIFNFRUtfU0VUKSkgPT0gLTEpIHsKKwkJCWxvZ2l0KCIlczogbHNlZWs6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJCQljbG9zZShmZCk7CisJCQlyZXR1cm4gKDApOworCQl9CisJCWlmIChyZXQgIT0gcG9zKSB7CisJCQlsb2dpdCgiJXM6IENvdWxkbid0IHNlZWsgdG8gdHR5ICVkIHNsb3QgaW4gJXMiLAorCQkJICAgIF9fZnVuY19fLCB0dHksIFVUTVBfRklMRSk7CisJCQljbG9zZShmZCk7CisJCQlyZXR1cm4gKDApOworCQl9CisJCS8qCisJCSAqIFByZXZlbnQgbHVzZXIgZnJvbSB6ZXJvJ2luZyBvdXQgdXRfaG9zdC4KKwkJICogSWYgdGhlIG5ldyB1dF9saW5lIGlzIGVtcHR5IGJ1dCB0aGUgb2xkIG9uZSBpcyBub3QKKwkJICogYW5kIHV0X2xpbmUgYW5kIHV0X25hbWUgbWF0Y2gsIHByZXNlcnZlIHRoZSBvbGQgdXRfbGluZS4KKwkJICovCisJCWlmIChhdG9taWNpbyhyZWFkLCBmZCwgJm9sZF91dCwgc2l6ZW9mKG9sZF91dCkpID09IHNpemVvZihvbGRfdXQpICYmCisJCSAgICAodXQtPnV0X2hvc3RbMF0gPT0gJ1wwJykgJiYgKG9sZF91dC51dF9ob3N0WzBdICE9ICdcMCcpICYmCisJCSAgICAoc3RybmNtcChvbGRfdXQudXRfbGluZSwgdXQtPnV0X2xpbmUsIHNpemVvZih1dC0+dXRfbGluZSkpID09IDApICYmCisJCSAgICAoc3RybmNtcChvbGRfdXQudXRfbmFtZSwgdXQtPnV0X25hbWUsIHNpemVvZih1dC0+dXRfbmFtZSkpID09IDApKQorCQkJbWVtY3B5KHV0LT51dF9ob3N0LCBvbGRfdXQudXRfaG9zdCwgc2l6ZW9mKHV0LT51dF9ob3N0KSk7CisKKwkJaWYgKChyZXQgPSBsc2VlayhmZCwgcG9zLCBTRUVLX1NFVCkpID09IC0xKSB7CisJCQlsb2dpdCgiJXM6IGxzZWVrOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCQkJY2xvc2UoZmQpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQlpZiAocmV0ICE9IHBvcykgeworCQkJbG9naXQoIiVzOiBDb3VsZG4ndCBzZWVrIHRvIHR0eSAlZCBzbG90IGluICVzIiwKKwkJCSAgICBfX2Z1bmNfXywgdHR5LCBVVE1QX0ZJTEUpOworCQkJY2xvc2UoZmQpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQlpZiAoYXRvbWljaW8odndyaXRlLCBmZCwgdXQsIHNpemVvZigqdXQpKSAhPSBzaXplb2YoKnV0KSkgeworCQkJbG9naXQoIiVzOiBlcnJvciB3cml0aW5nICVzOiAlcyIsIF9fZnVuY19fLAorCQkJICAgIFVUTVBfRklMRSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWNsb3NlKGZkKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKworCQljbG9zZShmZCk7CisJCXJldHVybiAoMSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuICgwKTsKKwl9Cit9CisjIGVuZGlmIC8qIFVUTVBfVVNFX0xJQlJBUlkgKi8KKworc3RhdGljIGludAordXRtcF9wZXJmb3JtX2xvZ2luKHN0cnVjdCBsb2dpbmluZm8gKmxpKQoreworCXN0cnVjdCB1dG1wIHV0OworCisJY29uc3RydWN0X3V0bXAobGksICZ1dCk7CisjIGlmZGVmIFVUTVBfVVNFX0xJQlJBUlkKKwlpZiAoIXV0bXBfd3JpdGVfbGlicmFyeShsaSwgJnV0KSkgeworCQlsb2dpdCgiJXM6IHV0bXBfd3JpdGVfbGlicmFyeSgpIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuICgwKTsKKwl9CisjIGVsc2UKKwlpZiAoIXV0bXBfd3JpdGVfZGlyZWN0KGxpLCAmdXQpKSB7CisJCWxvZ2l0KCIlczogdXRtcF93cml0ZV9kaXJlY3QoKSBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAoMCk7CisJfQorIyBlbmRpZgorCXJldHVybiAoMSk7Cit9CisKKworc3RhdGljIGludAordXRtcF9wZXJmb3JtX2xvZ291dChzdHJ1Y3QgbG9naW5pbmZvICpsaSkKK3sKKwlzdHJ1Y3QgdXRtcCB1dDsKKworCWNvbnN0cnVjdF91dG1wKGxpLCAmdXQpOworIyBpZmRlZiBVVE1QX1VTRV9MSUJSQVJZCisJaWYgKCF1dG1wX3dyaXRlX2xpYnJhcnkobGksICZ1dCkpIHsKKwkJbG9naXQoIiVzOiB1dG1wX3dyaXRlX2xpYnJhcnkoKSBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAoMCk7CisJfQorIyBlbHNlCisJaWYgKCF1dG1wX3dyaXRlX2RpcmVjdChsaSwgJnV0KSkgeworCQlsb2dpdCgiJXM6IHV0bXBfd3JpdGVfZGlyZWN0KCkgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gKDApOworCX0KKyMgZW5kaWYKKwlyZXR1cm4gKDEpOworfQorCisKK2ludAordXRtcF93cml0ZV9lbnRyeShzdHJ1Y3QgbG9naW5pbmZvICpsaSkKK3sKKwlzd2l0Y2gobGktPnR5cGUpIHsKKwljYXNlIExUWVBFX0xPR0lOOgorCQlyZXR1cm4gKHV0bXBfcGVyZm9ybV9sb2dpbihsaSkpOworCisJY2FzZSBMVFlQRV9MT0dPVVQ6CisJCXJldHVybiAodXRtcF9wZXJmb3JtX2xvZ291dChsaSkpOworCisJZGVmYXVsdDoKKwkJbG9naXQoIiVzOiBpbnZhbGlkIHR5cGUgZmllbGQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAoMCk7CisJfQorfQorI2VuZGlmIC8qIFVTRV9VVE1QICovCisKKworLyoqCisgKiogTG93LWxldmVsIHV0bXB4IGZ1bmN0aW9ucworICoqLworCisvKiBub3QgbXVjaCBwb2ludCBpZiB3ZSBkb24ndCB3YW50IHV0bXB4IGVudHJpZXMgKi8KKyNpZmRlZiBVU0VfVVRNUFgKKworLyogaWYgd2UgaGF2ZSB0aGUgd2hlcmV3aXRoYWxsLCB1c2UgcHV0dXR4bGluZSBldGMuICovCisjIGlmICFkZWZpbmVkKERJU0FCTEVfUFVUVVRYTElORSkgJiYgZGVmaW5lZChIQVZFX1NFVFVUWEVOVCkgJiYgXAorCWRlZmluZWQoSEFWRV9QVVRVVFhMSU5FKQorIyAgZGVmaW5lIFVUTVBYX1VTRV9MSUJSQVJZCisjIGVuZGlmCisKKworLyogd3JpdGUgYSB1dG1weCBlbnRyeSB3aXRoIHRoZSBzeXN0ZW0ncyBoZWxwIChwdXR1dHhsaW5lKCkgYW5kIHBhbHMpICovCisjIGlmZGVmIFVUTVBYX1VTRV9MSUJSQVJZCitzdGF0aWMgaW50Cit1dG1weF93cml0ZV9saWJyYXJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpLCBzdHJ1Y3QgdXRtcHggKnV0eCkKK3sKKwlzZXR1dHhlbnQoKTsKKwlwdXR1dHhsaW5lKHV0eCk7CisKKyMgIGlmZGVmIEhBVkVfRU5EVVRYRU5UCisJZW5kdXR4ZW50KCk7CisjICBlbmRpZgorCXJldHVybiAoMSk7Cit9CisKKyMgZWxzZSAvKiBVVE1QWF9VU0VfTElCUkFSWSAqLworCisvKiB3cml0ZSBhIHV0bXAgZW50cnkgZGlyZWN0IHRvIHRoZSBmaWxlICovCitzdGF0aWMgaW50Cit1dG1weF93cml0ZV9kaXJlY3Qoc3RydWN0IGxvZ2luaW5mbyAqbGksIHN0cnVjdCB1dG1weCAqdXR4KQoreworCWxvZ2l0KCIlczogbm90IGltcGxlbWVudGVkISIsIF9fZnVuY19fKTsKKwlyZXR1cm4gKDApOworfQorIyBlbmRpZiAvKiBVVE1QWF9VU0VfTElCUkFSWSAqLworCitzdGF0aWMgaW50Cit1dG1weF9wZXJmb3JtX2xvZ2luKHN0cnVjdCBsb2dpbmluZm8gKmxpKQoreworCXN0cnVjdCB1dG1weCB1dHg7CisKKwljb25zdHJ1Y3RfdXRtcHgobGksICZ1dHgpOworIyBpZmRlZiBVVE1QWF9VU0VfTElCUkFSWQorCWlmICghdXRtcHhfd3JpdGVfbGlicmFyeShsaSwgJnV0eCkpIHsKKwkJbG9naXQoIiVzOiB1dG1wX3dyaXRlX2xpYnJhcnkoKSBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAoMCk7CisJfQorIyBlbHNlCisJaWYgKCF1dG1weF93cml0ZV9kaXJlY3QobGksICZ1dCkpIHsKKwkJbG9naXQoIiVzOiB1dG1wX3dyaXRlX2RpcmVjdCgpIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuICgwKTsKKwl9CisjIGVuZGlmCisJcmV0dXJuICgxKTsKK30KKworCitzdGF0aWMgaW50Cit1dG1weF9wZXJmb3JtX2xvZ291dChzdHJ1Y3QgbG9naW5pbmZvICpsaSkKK3sKKwlzdHJ1Y3QgdXRtcHggdXR4OworCisJY29uc3RydWN0X3V0bXB4KGxpLCAmdXR4KTsKKyMgaWZkZWYgSEFWRV9JRF9JTl9VVE1QWAorCWxpbmVfYWJicmV2bmFtZSh1dHgudXRfaWQsIGxpLT5saW5lLCBzaXplb2YodXR4LnV0X2lkKSk7CisjIGVuZGlmCisjIGlmZGVmIEhBVkVfVFlQRV9JTl9VVE1QWAorCXV0eC51dF90eXBlID0gREVBRF9QUk9DRVNTOworIyBlbmRpZgorCisjIGlmZGVmIFVUTVBYX1VTRV9MSUJSQVJZCisJdXRtcHhfd3JpdGVfbGlicmFyeShsaSwgJnV0eCk7CisjIGVsc2UKKwl1dG1weF93cml0ZV9kaXJlY3QobGksICZ1dHgpOworIyBlbmRpZgorCXJldHVybiAoMSk7Cit9CisKK2ludAordXRtcHhfd3JpdGVfZW50cnkoc3RydWN0IGxvZ2luaW5mbyAqbGkpCit7CisJc3dpdGNoKGxpLT50eXBlKSB7CisJY2FzZSBMVFlQRV9MT0dJTjoKKwkJcmV0dXJuICh1dG1weF9wZXJmb3JtX2xvZ2luKGxpKSk7CisJY2FzZSBMVFlQRV9MT0dPVVQ6CisJCXJldHVybiAodXRtcHhfcGVyZm9ybV9sb2dvdXQobGkpKTsKKwlkZWZhdWx0OgorCQlsb2dpdCgiJXM6IGludmFsaWQgdHlwZSBmaWVsZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuICgwKTsKKwl9Cit9CisjZW5kaWYgLyogVVNFX1VUTVBYICovCisKKworLyoqCisgKiogTG93LWxldmVsIHd0bXAgZnVuY3Rpb25zCisgKiovCisKKyNpZmRlZiBVU0VfV1RNUAorCisvKgorICogV3JpdGUgYSB3dG1wIGVudHJ5IGRpcmVjdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlCisgKiBUaGlzIGlzIGEgc2xpZ2h0IG1vZGlmaWNhdGlvbiBvZiBjb2RlIGluIE9wZW5CU0QncyBsb2d3dG1wLmMKKyAqLworc3RhdGljIGludAord3RtcF93cml0ZShzdHJ1Y3QgbG9naW5pbmZvICpsaSwgc3RydWN0IHV0bXAgKnV0KQoreworCXN0cnVjdCBzdGF0IGJ1ZjsKKwlpbnQgZmQsIHJldCA9IDE7CisKKwlpZiAoKGZkID0gb3BlbihXVE1QX0ZJTEUsIE9fV1JPTkxZfE9fQVBQRU5ELCAwKSkgPCAwKSB7CisJCWxvZ2l0KCIlczogcHJvYmxlbSB3cml0aW5nICVzOiAlcyIsIF9fZnVuY19fLAorCQkgICAgV1RNUF9GSUxFLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKDApOworCX0KKwlpZiAoZnN0YXQoZmQsICZidWYpID09IDApCisJCWlmIChhdG9taWNpbyh2d3JpdGUsIGZkLCB1dCwgc2l6ZW9mKCp1dCkpICE9IHNpemVvZigqdXQpKSB7CisJCQlmdHJ1bmNhdGUoZmQsIGJ1Zi5zdF9zaXplKTsKKwkJCWxvZ2l0KCIlczogcHJvYmxlbSB3cml0aW5nICVzOiAlcyIsIF9fZnVuY19fLAorCQkJICAgIFdUTVBfRklMRSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldCA9IDA7CisJCX0KKwljbG9zZShmZCk7CisJcmV0dXJuIChyZXQpOworfQorCitzdGF0aWMgaW50Cit3dG1wX3BlcmZvcm1fbG9naW4oc3RydWN0IGxvZ2luaW5mbyAqbGkpCit7CisJc3RydWN0IHV0bXAgdXQ7CisKKwljb25zdHJ1Y3RfdXRtcChsaSwgJnV0KTsKKwlyZXR1cm4gKHd0bXBfd3JpdGUobGksICZ1dCkpOworfQorCisKK3N0YXRpYyBpbnQKK3d0bXBfcGVyZm9ybV9sb2dvdXQoc3RydWN0IGxvZ2luaW5mbyAqbGkpCit7CisJc3RydWN0IHV0bXAgdXQ7CisKKwljb25zdHJ1Y3RfdXRtcChsaSwgJnV0KTsKKwlyZXR1cm4gKHd0bXBfd3JpdGUobGksICZ1dCkpOworfQorCisKK2ludAord3RtcF93cml0ZV9lbnRyeShzdHJ1Y3QgbG9naW5pbmZvICpsaSkKK3sKKwlzd2l0Y2gobGktPnR5cGUpIHsKKwljYXNlIExUWVBFX0xPR0lOOgorCQlyZXR1cm4gKHd0bXBfcGVyZm9ybV9sb2dpbihsaSkpOworCWNhc2UgTFRZUEVfTE9HT1VUOgorCQlyZXR1cm4gKHd0bXBfcGVyZm9ybV9sb2dvdXQobGkpKTsKKwlkZWZhdWx0OgorCQlsb2dpdCgiJXM6IGludmFsaWQgdHlwZSBmaWVsZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuICgwKTsKKwl9Cit9CisKKworLyoKKyAqIE5vdGVzIG9uIGZldGNoaW5nIGxvZ2luIGRhdGEgZnJvbSB3dG1wL3d0bXB4CisgKgorICogTG9nb3V0cyBhcmUgdXN1YWxseSByZWNvcmRlZCB3aXRoIChhbW9uZ3N0IG90aGVyIHRoaW5ncykgYSBibGFuaworICogdXNlcm5hbWUgb24gYSBnaXZlbiB0dHkgbGluZS4gIEhvd2V2ZXIsIHNvbWUgc3lzdGVtcyAoSFAtVVggaXMgb25lKQorICogbGVhdmUgYWxsIGZpZWxkcyBzZXQsIGJ1dCBjaGFuZ2UgdGhlIHV0X3R5cGUgZmllbGQgdG8gREVBRF9QUk9DRVNTLgorICoKKyAqIFNpbmNlIHdlJ3JlIG9ubHkgbG9va2luZyBmb3IgbG9naW5zIGhlcmUsIHdlIGtub3cgdGhhdCB0aGUgdXNlcm5hbWUKKyAqIG11c3QgYmUgc2V0IGNvcnJlY3RseS4gT24gc3lzdGVtcyB0aGF0IGxlYXZlIGl0IGluLCB3ZSBjaGVjayBmb3IKKyAqIHV0X3R5cGU9PVVTRVJfUFJPQ0VTUyAoaW5kaWNhdGluZyBhIGxvZ2luLikKKyAqCisgKiBQb3J0YWJpbGl0eTogU29tZSBzeXN0ZW1zIG1heSBzZXQgc29tZXRoaW5nIG90aGVyIHRoYW4gVVNFUl9QUk9DRVNTCisgKiB0byBpbmRpY2F0ZSBhIGxvZ2luIHByb2Nlc3MuIEkgZG9uJ3Qga25vdyBvZiBhbnkgYXMgSSB3cml0ZS4gQWxzbywKKyAqIGl0J3MgcG9zc2libGUgdGhhdCBzb21lIHN5c3RlbXMgbWF5IGJvdGggbGVhdmUgdGhlIHVzZXJuYW1lIGluCisgKiBwbGFjZSBhbmQgbm90IGhhdmUgdXRfdHlwZS4KKyAqLworCisvKiByZXR1cm4gdHJ1ZSBpZiB0aGlzIHd0bXAgZW50cnkgaW5kaWNhdGVzIGEgbG9naW4gKi8KK3N0YXRpYyBpbnQKK3d0bXBfaXNsb2dpbihzdHJ1Y3QgbG9naW5pbmZvICpsaSwgc3RydWN0IHV0bXAgKnV0KQoreworCWlmIChzdHJuY21wKGxpLT51c2VybmFtZSwgdXQtPnV0X25hbWUsCisJICAgIE1JTl9TSVpFT0YobGktPnVzZXJuYW1lLCB1dC0+dXRfbmFtZSkpID09IDApIHsKKyMgaWZkZWYgSEFWRV9UWVBFX0lOX1VUTVAKKwkJaWYgKHV0LT51dF90eXBlICYgVVNFUl9QUk9DRVNTKQorCQkJcmV0dXJuICgxKTsKKyMgZWxzZQorCQlyZXR1cm4gKDEpOworIyBlbmRpZgorCX0KKwlyZXR1cm4gKDApOworfQorCitpbnQKK3d0bXBfZ2V0X2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpKQoreworCXN0cnVjdCBzdGF0IHN0OworCXN0cnVjdCB1dG1wIHV0OworCWludCBmZCwgZm91bmQgPSAwOworCisJLyogQ2xlYXIgdGhlIHRpbWUgZW50cmllcyBpbiBvdXIgbG9naW5pbmZvICovCisJbGktPnR2X3NlYyA9IGxpLT50dl91c2VjID0gMDsKKworCWlmICgoZmQgPSBvcGVuKFdUTVBfRklMRSwgT19SRE9OTFkpKSA8IDApIHsKKwkJbG9naXQoIiVzOiBwcm9ibGVtIG9wZW5pbmcgJXM6ICVzIiwgX19mdW5jX18sCisJCSAgICBXVE1QX0ZJTEUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoMCk7CisJfQorCWlmIChmc3RhdChmZCwgJnN0KSAhPSAwKSB7CisJCWxvZ2l0KCIlczogY291bGRuJ3Qgc3RhdCAlczogJXMiLCBfX2Z1bmNfXywKKwkJICAgIFdUTVBfRklMRSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gKDApOworCX0KKworCS8qIFNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsYXN0IHN0cnVjdCB1dG1wICovCisJaWYgKGxzZWVrKGZkLCAtKG9mZl90KXNpemVvZihzdHJ1Y3QgdXRtcCksIFNFRUtfRU5EKSA9PSAtMSkgeworCQkvKiBMb29rcyBsaWtlIHdlJ3ZlIGdvdCBhIGZyZXNoIHd0bXAgZmlsZSAqLworCQljbG9zZShmZCk7CisJCXJldHVybiAoMCk7CisJfQorCisJd2hpbGUgKCFmb3VuZCkgeworCQlpZiAoYXRvbWljaW8ocmVhZCwgZmQsICZ1dCwgc2l6ZW9mKHV0KSkgIT0gc2l6ZW9mKHV0KSkgeworCQkJbG9naXQoIiVzOiByZWFkIG9mICVzIGZhaWxlZDogJXMiLCBfX2Z1bmNfXywKKwkJCSAgICBXVE1QX0ZJTEUsIHN0cmVycm9yKGVycm5vKSk7CisJCQljbG9zZSAoZmQpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQlpZiAod3RtcF9pc2xvZ2luKGxpLCAmdXQpICkgeworCQkJZm91bmQgPSAxOworCQkJLyoKKwkJCSAqIFdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBmb3IgYSB0aW1lIGluIHN0cnVjdAorCQkJICogdXRtcCwgaW4gbG9naW5fZ2V0bGFzdCgpCisJCQkgKi8KKyMgaWZkZWYgSEFWRV9USU1FX0lOX1VUTVAKKwkJCWxpLT50dl9zZWMgPSB1dC51dF90aW1lOworIyBlbHNlCisjICBpZiBIQVZFX1RWX0lOX1VUTVAKKwkJCWxpLT50dl9zZWMgPSB1dC51dF90di50dl9zZWM7CisjICBlbmRpZgorIyBlbmRpZgorCQkJbGluZV9mdWxsbmFtZShsaS0+bGluZSwgdXQudXRfbGluZSwKKwkJCSAgICBNSU5fU0laRU9GKGxpLT5saW5lLCB1dC51dF9saW5lKSk7CisjIGlmZGVmIEhBVkVfSE9TVF9JTl9VVE1QCisJCQlzdHJsY3B5KGxpLT5ob3N0bmFtZSwgdXQudXRfaG9zdCwKKwkJCSAgICBNSU5fU0laRU9GKGxpLT5ob3N0bmFtZSwgdXQudXRfaG9zdCkpOworIyBlbmRpZgorCQkJY29udGludWU7CisJCX0KKwkJLyogU2VlayBiYWNrIDIgeCBzdHJ1Y3QgdXRtcCAqLworCQlpZiAobHNlZWsoZmQsIC0ob2ZmX3QpKDIgKiBzaXplb2Yoc3RydWN0IHV0bXApKSwgU0VFS19DVVIpID09IC0xKSB7CisJCQkvKiBXZSd2ZSBmb3VuZCB0aGUgc3RhcnQgb2YgdGhlIGZpbGUsIHNvIHF1aXQgKi8KKwkJCWNsb3NlKGZkKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisKKwkvKiBXZSBmb3VuZCBhbiBlbnRyeS4gVGlkeSB1cCBhbmQgcmV0dXJuICovCisJY2xvc2UoZmQpOworCXJldHVybiAoMSk7Cit9CisjIGVuZGlmIC8qIFVTRV9XVE1QICovCisKKworLyoqCisgKiogTG93LWxldmVsIHd0bXB4IGZ1bmN0aW9ucworICoqLworCisjaWZkZWYgVVNFX1dUTVBYCisvKgorICogV3JpdGUgYSB3dG1weCBlbnRyeSBkaXJlY3QgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZQorICogVGhpcyBpcyBhIHNsaWdodCBtb2RpZmljYXRpb24gb2YgY29kZSBpbiBPcGVuQlNEJ3MgbG9nd3RtcC5jCisgKi8KK3N0YXRpYyBpbnQKK3d0bXB4X3dyaXRlKHN0cnVjdCBsb2dpbmluZm8gKmxpLCBzdHJ1Y3QgdXRtcHggKnV0eCkKK3sKKyNpZm5kZWYgSEFWRV9VUERXVE1QWAorCXN0cnVjdCBzdGF0IGJ1ZjsKKwlpbnQgZmQsIHJldCA9IDE7CisKKwlpZiAoKGZkID0gb3BlbihXVE1QWF9GSUxFLCBPX1dST05MWXxPX0FQUEVORCwgMCkpIDwgMCkgeworCQlsb2dpdCgiJXM6IHByb2JsZW0gb3BlbmluZyAlczogJXMiLCBfX2Z1bmNfXywKKwkJICAgIFdUTVBYX0ZJTEUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoMCk7CisJfQorCisJaWYgKGZzdGF0KGZkLCAmYnVmKSA9PSAwKQorCQlpZiAoYXRvbWljaW8odndyaXRlLCBmZCwgdXR4LCBzaXplb2YoKnV0eCkpICE9IHNpemVvZigqdXR4KSkgeworCQkJZnRydW5jYXRlKGZkLCBidWYuc3Rfc2l6ZSk7CisJCQlsb2dpdCgiJXM6IHByb2JsZW0gd3JpdGluZyAlczogJXMiLCBfX2Z1bmNfXywKKwkJCSAgICBXVE1QWF9GSUxFLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0ID0gMDsKKwkJfQorCWNsb3NlKGZkKTsKKworCXJldHVybiAocmV0KTsKKyNlbHNlCisJdXBkd3RtcHgoV1RNUFhfRklMRSwgdXR4KTsKKwlyZXR1cm4gKDEpOworI2VuZGlmCit9CisKKworc3RhdGljIGludAord3RtcHhfcGVyZm9ybV9sb2dpbihzdHJ1Y3QgbG9naW5pbmZvICpsaSkKK3sKKwlzdHJ1Y3QgdXRtcHggdXR4OworCisJY29uc3RydWN0X3V0bXB4KGxpLCAmdXR4KTsKKwlyZXR1cm4gKHd0bXB4X3dyaXRlKGxpLCAmdXR4KSk7Cit9CisKKworc3RhdGljIGludAord3RtcHhfcGVyZm9ybV9sb2dvdXQoc3RydWN0IGxvZ2luaW5mbyAqbGkpCit7CisJc3RydWN0IHV0bXB4IHV0eDsKKworCWNvbnN0cnVjdF91dG1weChsaSwgJnV0eCk7CisJcmV0dXJuICh3dG1weF93cml0ZShsaSwgJnV0eCkpOworfQorCisKK2ludAord3RtcHhfd3JpdGVfZW50cnkoc3RydWN0IGxvZ2luaW5mbyAqbGkpCit7CisJc3dpdGNoKGxpLT50eXBlKSB7CisJY2FzZSBMVFlQRV9MT0dJTjoKKwkJcmV0dXJuICh3dG1weF9wZXJmb3JtX2xvZ2luKGxpKSk7CisJY2FzZSBMVFlQRV9MT0dPVVQ6CisJCXJldHVybiAod3RtcHhfcGVyZm9ybV9sb2dvdXQobGkpKTsKKwlkZWZhdWx0OgorCQlsb2dpdCgiJXM6IGludmFsaWQgdHlwZSBmaWVsZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuICgwKTsKKwl9Cit9CisKKy8qIFBsZWFzZSBzZWUgdGhlIG5vdGVzIGFib3ZlIHd0bXBfaXNsb2dpbigpIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgIG5leHQgdHdvIGZ1bmN0aW9ucyAqLworCisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHd0bXB4IGVudHJ5IGluZGljYXRlcyBhIGxvZ2luICovCitzdGF0aWMgaW50Cit3dG1weF9pc2xvZ2luKHN0cnVjdCBsb2dpbmluZm8gKmxpLCBzdHJ1Y3QgdXRtcHggKnV0eCkKK3sKKwlpZiAoc3RybmNtcChsaS0+dXNlcm5hbWUsIHV0eC0+dXRfdXNlciwKKwkgICAgTUlOX1NJWkVPRihsaS0+dXNlcm5hbWUsIHV0eC0+dXRfdXNlcikpID09IDAgKSB7CisjIGlmZGVmIEhBVkVfVFlQRV9JTl9VVE1QWAorCQlpZiAodXR4LT51dF90eXBlID09IFVTRVJfUFJPQ0VTUykKKwkJCXJldHVybiAoMSk7CisjIGVsc2UKKwkJcmV0dXJuICgxKTsKKyMgZW5kaWYKKwl9CisJcmV0dXJuICgwKTsKK30KKworCitpbnQKK3d0bXB4X2dldF9lbnRyeShzdHJ1Y3QgbG9naW5pbmZvICpsaSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlzdHJ1Y3QgdXRtcHggdXR4OworCWludCBmZCwgZm91bmQ9MDsKKworCS8qIENsZWFyIHRoZSB0aW1lIGVudHJpZXMgKi8KKwlsaS0+dHZfc2VjID0gbGktPnR2X3VzZWMgPSAwOworCisJaWYgKChmZCA9IG9wZW4oV1RNUFhfRklMRSwgT19SRE9OTFkpKSA8IDApIHsKKwkJbG9naXQoIiVzOiBwcm9ibGVtIG9wZW5pbmcgJXM6ICVzIiwgX19mdW5jX18sCisJCSAgICBXVE1QWF9GSUxFLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKDApOworCX0KKwlpZiAoZnN0YXQoZmQsICZzdCkgIT0gMCkgeworCQlsb2dpdCgiJXM6IGNvdWxkbid0IHN0YXQgJXM6ICVzIiwgX19mdW5jX18sCisJCSAgICBXVE1QWF9GSUxFLCBzdHJlcnJvcihlcnJubykpOworCQljbG9zZShmZCk7CisJCXJldHVybiAoMCk7CisJfQorCisJLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIGxhc3Qgc3RydWN0IHV0bXB4ICovCisJaWYgKGxzZWVrKGZkLCAtKG9mZl90KXNpemVvZihzdHJ1Y3QgdXRtcHgpLCBTRUVLX0VORCkgPT0gLTEgKSB7CisJCS8qIHByb2JhYmx5IGEgbmV3bHkgcm90YXRlZCB3dG1weCBmaWxlICovCisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwl3aGlsZSAoIWZvdW5kKSB7CisJCWlmIChhdG9taWNpbyhyZWFkLCBmZCwgJnV0eCwgc2l6ZW9mKHV0eCkpICE9IHNpemVvZih1dHgpKSB7CisJCQlsb2dpdCgiJXM6IHJlYWQgb2YgJXMgZmFpbGVkOiAlcyIsIF9fZnVuY19fLAorCQkJICAgIFdUTVBYX0ZJTEUsIHN0cmVycm9yKGVycm5vKSk7CisJCQljbG9zZSAoZmQpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQkvKgorCQkgKiBMb2dvdXRzIGFyZSByZWNvcmRlZCBhcyBhIGJsYW5rIHVzZXJuYW1lIG9uIGEgcGFydGljdWxhcgorCQkgKiBsaW5lLiBTbywgd2UganVzdCBuZWVkIHRvIGZpbmQgdGhlIHVzZXJuYW1lIGluIHN0cnVjdCB1dG1weAorCQkgKi8KKwkJaWYgKHd0bXB4X2lzbG9naW4obGksICZ1dHgpKSB7CisJCQlmb3VuZCA9IDE7CisjIGlmIGRlZmluZWQoSEFWRV9UVl9JTl9VVE1QWCkKKwkJCWxpLT50dl9zZWMgPSB1dHgudXRfdHYudHZfc2VjOworIyBlbGlmIGRlZmluZWQoSEFWRV9USU1FX0lOX1VUTVBYKQorCQkJbGktPnR2X3NlYyA9IHV0eC51dF90aW1lOworIyBlbmRpZgorCQkJbGluZV9mdWxsbmFtZShsaS0+bGluZSwgdXR4LnV0X2xpbmUsIHNpemVvZihsaS0+bGluZSkpOworIyBpZiBkZWZpbmVkKEhBVkVfSE9TVF9JTl9VVE1QWCkKKwkJCXN0cmxjcHkobGktPmhvc3RuYW1lLCB1dHgudXRfaG9zdCwKKwkJCSAgICBNSU5fU0laRU9GKGxpLT5ob3N0bmFtZSwgdXR4LnV0X2hvc3QpKTsKKyMgZW5kaWYKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChsc2VlayhmZCwgLShvZmZfdCkoMiAqIHNpemVvZihzdHJ1Y3QgdXRtcHgpKSwgU0VFS19DVVIpID09IC0xKSB7CisJCQljbG9zZShmZCk7CisJCQlyZXR1cm4gKDApOworCQl9CisJfQorCisJY2xvc2UoZmQpOworCXJldHVybiAoMSk7Cit9CisjZW5kaWYgLyogVVNFX1dUTVBYICovCisKKy8qKgorICoqIExvdy1sZXZlbCBsaWJ1dGlsIGxvZ2luKCkgZnVuY3Rpb25zCisgKiovCisKKyNpZmRlZiBVU0VfTE9HSU4KK3N0YXRpYyBpbnQKK3N5c2xvZ2luX3BlcmZvcm1fbG9naW4oc3RydWN0IGxvZ2luaW5mbyAqbGkpCit7CisJc3RydWN0IHV0bXAgKnV0OworCisJdXQgPSB4bWFsbG9jKHNpemVvZigqdXQpKTsKKwljb25zdHJ1Y3RfdXRtcChsaSwgdXQpOworCWxvZ2luKHV0KTsKKwlmcmVlKHV0KTsKKworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQKK3N5c2xvZ2luX3BlcmZvcm1fbG9nb3V0KHN0cnVjdCBsb2dpbmluZm8gKmxpKQoreworIyBpZmRlZiBIQVZFX0xPR09VVAorCWNoYXIgbGluZVtVVF9MSU5FU0laRV07CisKKwkodm9pZClsaW5lX3N0cmlwbmFtZShsaW5lLCBsaS0+bGluZSwgc2l6ZW9mKGxpbmUpKTsKKworCWlmICghbG9nb3V0KGxpbmUpKQorCQlsb2dpdCgiJXM6IGxvZ291dCgpIHJldHVybmVkIGFuIGVycm9yIiwgX19mdW5jX18pOworIyAgaWZkZWYgSEFWRV9MT0dXVE1QCisJZWxzZQorCQlsb2d3dG1wKGxpbmUsICIiLCAiIik7CisjICBlbmRpZgorCS8qIEZJWE1FOiAoQVRMIC0gaWYgdGhlIG5lZWQgYXJpc2VzKSBXaGF0IHRvIGRvIGlmIHdlIGhhdmUKKwkgKiBsb2dpbiwgYnV0IG5vIGxvZ291dD8gIHdoYXQgaWYgbG9nb3V0IGJ1dCBubyBsb2d3dG1wPyBBbGwKKwkgKiByb3V0aW5lcyBhcmUgaW4gbGlidXRpbCBzbyB0aGV5IHNob3VsZCBhbGwgYmUgdGhlcmUsCisJICogYnV0Li4uICovCisjIGVuZGlmCisJcmV0dXJuICgxKTsKK30KKworaW50CitzeXNsb2dpbl93cml0ZV9lbnRyeShzdHJ1Y3QgbG9naW5pbmZvICpsaSkKK3sKKwlzd2l0Y2ggKGxpLT50eXBlKSB7CisJY2FzZSBMVFlQRV9MT0dJTjoKKwkJcmV0dXJuIChzeXNsb2dpbl9wZXJmb3JtX2xvZ2luKGxpKSk7CisJY2FzZSBMVFlQRV9MT0dPVVQ6CisJCXJldHVybiAoc3lzbG9naW5fcGVyZm9ybV9sb2dvdXQobGkpKTsKKwlkZWZhdWx0OgorCQlsb2dpdCgiJXM6IEludmFsaWQgdHlwZSBmaWVsZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuICgwKTsKKwl9Cit9CisjZW5kaWYgLyogVVNFX0xPR0lOICovCisKKy8qIGVuZCBvZiBmaWxlIGxvZy1zeXNsb2dpbi5jICovCisKKy8qKgorICoqIExvdy1sZXZlbCBsYXN0bG9nIGZ1bmN0aW9ucworICoqLworCisjaWZkZWYgVVNFX0xBU1RMT0cKKworI2lmICFkZWZpbmVkKExBU1RMT0dfV1JJVEVfUFVUVVRYTElORSkgfHwgIWRlZmluZWQoSEFWRV9HRVRMQVNUTE9HWEJZTkFNRSkKKy8qIG9wZW4gdGhlIGZpbGUgKHVzaW5nIGZpbGVtb2RlKSBhbmQgc2VlayB0byB0aGUgbG9naW4gZW50cnkgKi8KK3N0YXRpYyBpbnQKK2xhc3Rsb2dfb3BlbnNlZWsoc3RydWN0IGxvZ2luaW5mbyAqbGksIGludCAqZmQsIGludCBmaWxlbW9kZSkKK3sKKwlvZmZfdCBvZmZzZXQ7CisJY2hhciBsYXN0bG9nX2ZpbGVbMTAyNF07CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAoc3RhdChMQVNUTE9HX0ZJTEUsICZzdCkgIT0gMCkgeworCQlsb2dpdCgiJXM6IENvdWxkbid0IHN0YXQgJXM6ICVzIiwgX19mdW5jX18sCisJCSAgICBMQVNUTE9HX0ZJTEUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoMCk7CisJfQorCWlmIChTX0lTRElSKHN0LnN0X21vZGUpKSB7CisJCXNucHJpbnRmKGxhc3Rsb2dfZmlsZSwgc2l6ZW9mKGxhc3Rsb2dfZmlsZSksICIlcy8lcyIsCisJCSAgICBMQVNUTE9HX0ZJTEUsIGxpLT51c2VybmFtZSk7CisJfSBlbHNlIGlmIChTX0lTUkVHKHN0LnN0X21vZGUpKSB7CisJCXN0cmxjcHkobGFzdGxvZ19maWxlLCBMQVNUTE9HX0ZJTEUsIHNpemVvZihsYXN0bG9nX2ZpbGUpKTsKKwl9IGVsc2UgeworCQlsb2dpdCgiJXM6ICUuMTAwcyBpcyBub3QgYSBmaWxlIG9yIGRpcmVjdG9yeSEiLCBfX2Z1bmNfXywKKwkJICAgIExBU1RMT0dfRklMRSk7CisJCXJldHVybiAoMCk7CisJfQorCisJKmZkID0gb3BlbihsYXN0bG9nX2ZpbGUsIGZpbGVtb2RlLCAwNjAwKTsKKwlpZiAoKmZkIDwgMCkgeworCQlkZWJ1ZygiJXM6IENvdWxkbid0IG9wZW4gJXM6ICVzIiwgX19mdW5jX18sCisJCSAgICBsYXN0bG9nX2ZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoMCk7CisJfQorCisJaWYgKFNfSVNSRUcoc3Quc3RfbW9kZSkpIHsKKwkJLyogZmluZCB0aGlzIHVpZCdzIG9mZnNldCBpbiB0aGUgbGFzdGxvZyBmaWxlICovCisJCW9mZnNldCA9IChvZmZfdCkgKCh1X2xvbmcpbGktPnVpZCAqIHNpemVvZihzdHJ1Y3QgbGFzdGxvZykpOworCisJCWlmIChsc2VlaygqZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IG9mZnNldCkgeworCQkJbG9naXQoIiVzOiAlcy0+bHNlZWsoKTogJXMiLCBfX2Z1bmNfXywKKwkJCSAgICBsYXN0bG9nX2ZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisJCQljbG9zZSgqZmQpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCX0KKworCXJldHVybiAoMSk7Cit9CisjZW5kaWYgLyogIUxBU1RMT0dfV1JJVEVfUFVUVVRYTElORSB8fCAhSEFWRV9HRVRMQVNUTE9HWEJZTkFNRSAqLworCisjaWZkZWYgTEFTVExPR19XUklURV9QVVRVVFhMSU5FCitpbnQKK2xhc3Rsb2dfd3JpdGVfZW50cnkoc3RydWN0IGxvZ2luaW5mbyAqbGkpCit7CisJc3dpdGNoKGxpLT50eXBlKSB7CisJY2FzZSBMVFlQRV9MT0dJTjoKKwkJcmV0dXJuIDE7IC8qIGxhc3Rsb2cgd3JpdHRlbiBieSBwdXR1dHhsaW5lICovCisJZGVmYXVsdDoKKwkJbG9naXQoImxhc3Rsb2dfd3JpdGVfZW50cnk6IEludmFsaWQgdHlwZSBmaWVsZCIpOworCQlyZXR1cm4gMDsKKwl9Cit9CisjZWxzZSAvKiBMQVNUTE9HX1dSSVRFX1BVVFVUWExJTkUgKi8KK2ludAorbGFzdGxvZ193cml0ZV9lbnRyeShzdHJ1Y3QgbG9naW5pbmZvICpsaSkKK3sKKwlzdHJ1Y3QgbGFzdGxvZyBsYXN0OworCWludCBmZDsKKworCXN3aXRjaChsaS0+dHlwZSkgeworCWNhc2UgTFRZUEVfTE9HSU46CisJCS8qIGNyZWF0ZSBvdXIgc3RydWN0IGxhc3Rsb2cgKi8KKwkJbWVtc2V0KCZsYXN0LCAnXDAnLCBzaXplb2YobGFzdCkpOworCQlsaW5lX3N0cmlwbmFtZShsYXN0LmxsX2xpbmUsIGxpLT5saW5lLCBzaXplb2YobGFzdC5sbF9saW5lKSk7CisJCXN0cmxjcHkobGFzdC5sbF9ob3N0LCBsaS0+aG9zdG5hbWUsCisJCSAgICBNSU5fU0laRU9GKGxhc3QubGxfaG9zdCwgbGktPmhvc3RuYW1lKSk7CisJCWxhc3QubGxfdGltZSA9IGxpLT50dl9zZWM7CisJCisJCWlmICghbGFzdGxvZ19vcGVuc2VlayhsaSwgJmZkLCBPX1JEV1J8T19DUkVBVCkpCisJCQlyZXR1cm4gKDApOworCQorCQkvKiB3cml0ZSB0aGUgZW50cnkgKi8KKwkJaWYgKGF0b21pY2lvKHZ3cml0ZSwgZmQsICZsYXN0LCBzaXplb2YobGFzdCkpICE9IHNpemVvZihsYXN0KSkgeworCQkJY2xvc2UoZmQpOworCQkJbG9naXQoIiVzOiBFcnJvciB3cml0aW5nIHRvICVzOiAlcyIsIF9fZnVuY19fLAorCQkJICAgIExBU1RMT0dfRklMRSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gKDEpOworCWRlZmF1bHQ6CisJCWxvZ2l0KCIlczogSW52YWxpZCB0eXBlIGZpZWxkIiwgX19mdW5jX18pOworCQlyZXR1cm4gKDApOworCX0KK30KKyNlbmRpZiAvKiBMQVNUTE9HX1dSSVRFX1BVVFVUWExJTkUgKi8KKworI2lmZGVmIEhBVkVfR0VUTEFTVExPR1hCWU5BTUUKK2ludAorbGFzdGxvZ19nZXRfZW50cnkoc3RydWN0IGxvZ2luaW5mbyAqbGkpCit7CisJc3RydWN0IGxhc3Rsb2d4IGwsICpsbDsKKworCWlmICgobGwgPSBnZXRsYXN0bG9neGJ5bmFtZShsaS0+dXNlcm5hbWUsICZsKSkgPT0gTlVMTCkgeworCQltZW1zZXQoJmwsICdcMCcsIHNpemVvZihsKSk7CisJCWxsID0gJmw7CisJfQorCWxpbmVfZnVsbG5hbWUobGktPmxpbmUsIGxsLT5sbF9saW5lLCBzaXplb2YobGktPmxpbmUpKTsKKwlzdHJsY3B5KGxpLT5ob3N0bmFtZSwgbGwtPmxsX2hvc3QsCisJCU1JTl9TSVpFT0YobGktPmhvc3RuYW1lLCBsbC0+bGxfaG9zdCkpOworCWxpLT50dl9zZWMgPSBsbC0+bGxfdHYudHZfc2VjOworCWxpLT50dl91c2VjID0gbGwtPmxsX3R2LnR2X3VzZWM7CisJcmV0dXJuICgxKTsKK30KKyNlbHNlIC8qIEhBVkVfR0VUTEFTVExPR1hCWU5BTUUgKi8KK2ludAorbGFzdGxvZ19nZXRfZW50cnkoc3RydWN0IGxvZ2luaW5mbyAqbGkpCit7CisJc3RydWN0IGxhc3Rsb2cgbGFzdDsKKwlpbnQgZmQsIHJldDsKKworCWlmICghbGFzdGxvZ19vcGVuc2VlayhsaSwgJmZkLCBPX1JET05MWSkpCisJCXJldHVybiAoMCk7CisKKwlyZXQgPSBhdG9taWNpbyhyZWFkLCBmZCwgJmxhc3QsIHNpemVvZihsYXN0KSk7CisJY2xvc2UoZmQpOworCisJc3dpdGNoIChyZXQpIHsKKwljYXNlIDA6CisJCW1lbXNldCgmbGFzdCwgJ1wwJywgc2l6ZW9mKGxhc3QpKTsKKwkJLyogRkFMTFRIUlUgKi8KKwljYXNlIHNpemVvZihsYXN0KToKKwkJbGluZV9mdWxsbmFtZShsaS0+bGluZSwgbGFzdC5sbF9saW5lLCBzaXplb2YobGktPmxpbmUpKTsKKwkJc3RybGNweShsaS0+aG9zdG5hbWUsIGxhc3QubGxfaG9zdCwKKwkJICAgIE1JTl9TSVpFT0YobGktPmhvc3RuYW1lLCBsYXN0LmxsX2hvc3QpKTsKKwkJbGktPnR2X3NlYyA9IGxhc3QubGxfdGltZTsKKwkJcmV0dXJuICgxKTsKKwljYXNlIC0xOgorCQllcnJvcigiJXM6IEVycm9yIHJlYWRpbmcgZnJvbSAlczogJXMiLCBfX2Z1bmNfXywKKwkJICAgIExBU1RMT0dfRklMRSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgwKTsKKwlkZWZhdWx0OgorCQllcnJvcigiJXM6IEVycm9yIHJlYWRpbmcgZnJvbSAlczogRXhwZWN0aW5nICVkLCBnb3QgJWQiLAorCQkgICAgX19mdW5jX18sIExBU1RMT0dfRklMRSwgKGludClzaXplb2YobGFzdCksIHJldCk7CisJCXJldHVybiAoMCk7CisJfQorCisJLyogTk9UUkVBQ0hFRCAqLworCXJldHVybiAoMCk7Cit9CisjZW5kaWYgLyogSEFWRV9HRVRMQVNUTE9HWEJZTkFNRSAqLworI2VuZGlmIC8qIFVTRV9MQVNUTE9HICovCisKKyNpZiBkZWZpbmVkKFVTRV9VVE1QWCkgJiYgZGVmaW5lZChIQVZFX1NFVFVUWERCKSAmJiBcCisgICAgZGVmaW5lZChVVFhEQl9MQVNUTE9HSU4pICYmIGRlZmluZWQoSEFWRV9HRVRVVFhVU0VSKQoraW50Cit1dG1weF9nZXRfZW50cnkoc3RydWN0IGxvZ2luaW5mbyAqbGkpCit7CisJc3RydWN0IHV0bXB4ICp1dHg7CisKKwlpZiAoc2V0dXR4ZGIoVVRYREJfTEFTVExPR0lOLCBOVUxMKSAhPSAwKQorCQlyZXR1cm4gKDApOworCXV0eCA9IGdldHV0eHVzZXIobGktPnVzZXJuYW1lKTsKKwlpZiAodXR4ID09IE5VTEwpIHsKKwkJZW5kdXR4ZW50KCk7CisJCXJldHVybiAoMCk7CisJfQorCisJbGluZV9mdWxsbmFtZShsaS0+bGluZSwgdXR4LT51dF9saW5lLAorCSAgICBNSU5fU0laRU9GKGxpLT5saW5lLCB1dHgtPnV0X2xpbmUpKTsKKwlzdHJsY3B5KGxpLT5ob3N0bmFtZSwgdXR4LT51dF9ob3N0LAorCSAgICBNSU5fU0laRU9GKGxpLT5ob3N0bmFtZSwgdXR4LT51dF9ob3N0KSk7CisJbGktPnR2X3NlYyA9IHV0eC0+dXRfdHYudHZfc2VjOworCWxpLT50dl91c2VjID0gdXR4LT51dF90di50dl91c2VjOworCWVuZHV0eGVudCgpOworCXJldHVybiAoMSk7Cit9CisjZW5kaWYgLyogVVNFX1VUTVBYICYmIEhBVkVfU0VUVVRYREIgJiYgVVRYREJfTEFTVExPR0lOICYmIEhBVkVfR0VUVVRYVVNFUiAqLworCisjaWZkZWYgVVNFX0JUTVAKKyAgLyoKKyAgICogTG9ncyBmYWlsZWQgbG9naW4gYXR0ZW1wdHMgaW4gX1BBVEhfQlRNUCBpZiB0aGF0IGV4aXN0cy4KKyAgICogVGhlIG1vc3QgY29tbW9uIGxvZ2luIGZhaWx1cmUgaXMgdG8gZ2l2ZSBwYXNzd29yZCBpbnN0ZWFkIG9mIHVzZXJuYW1lLgorICAgKiBTbyB0aGUgX1BBVEhfQlRNUCBmaWxlIGNoZWNrZWQgZm9yIHRoZSBjb3JyZWN0IHBlcm1pc3Npb24sIHNvIHRoYXQKKyAgICogb25seSByb290IGNhbiByZWFkIGl0LgorICAgKi8KKwordm9pZAorcmVjb3JkX2ZhaWxlZF9sb2dpbihjb25zdCBjaGFyICp1c2VybmFtZSwgY29uc3QgY2hhciAqaG9zdG5hbWUsCisgICAgY29uc3QgY2hhciAqdHR5bikKK3sKKwlpbnQgZmQ7CisJc3RydWN0IHV0bXAgdXQ7CisJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgZnJvbTsKKwlzb2NrbGVuX3QgZnJvbWxlbiA9IHNpemVvZihmcm9tKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmE0OworCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmE2OworCXRpbWVfdCB0OworCXN0cnVjdCBzdGF0IGZzdDsKKworCWlmIChnZXRldWlkKCkgIT0gMCkKKwkJcmV0dXJuOworCWlmICgoZmQgPSBvcGVuKF9QQVRIX0JUTVAsIE9fV1JPTkxZIHwgT19BUFBFTkQpKSA8IDApIHsKKwkJZGVidWcoIlVuYWJsZSB0byBvcGVuIHRoZSBidG1wIGZpbGUgJXM6ICVzIiwgX1BBVEhfQlRNUCwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybjsKKwl9CisJaWYgKGZzdGF0KGZkLCAmZnN0KSA8IDApIHsKKwkJbG9naXQoIiVzOiBmc3RhdCBvZiAlcyBmYWlsZWQ6ICVzIiwgX19mdW5jX18sIF9QQVRIX0JUTVAsCisJCSAgICBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIG91dDsKKwl9CisJaWYoKGZzdC5zdF9tb2RlICYgKFNfSVhHUlAgfCBTX0lSV1hPKSkgfHwgKGZzdC5zdF91aWQgIT0gMCkpeworCQlsb2dpdCgiRXhjZXNzIHBlcm1pc3Npb24gb3IgYmFkIG93bmVyc2hpcCBvbiBmaWxlICVzIiwKKwkJICAgIF9QQVRIX0JUTVApOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1zZXQoJnV0LCAwLCBzaXplb2YodXQpKTsKKwkvKiBzdHJuY3B5IGJlY2F1c2Ugd2UgZG9uJ3QgbmVjZXNzYXJpbHkgd2FudCBudWwgdGVybWluYXRpb24gKi8KKwlzdHJuY3B5KHV0LnV0X3VzZXIsIHVzZXJuYW1lLCBzaXplb2YodXQudXRfdXNlcikpOworCXN0cmxjcHkodXQudXRfbGluZSwgInNzaDpub3R0eSIsIHNpemVvZih1dC51dF9saW5lKSk7CisKKwl0aW1lKCZ0KTsKKwl1dC51dF90aW1lID0gdDsgICAgIC8qIHV0X3RpbWUgaXMgbm90IGFsd2F5cyBhIHRpbWVfdCAqLworCXV0LnV0X3R5cGUgPSBMT0dJTl9QUk9DRVNTOworCXV0LnV0X3BpZCA9IGdldHBpZCgpOworCisJLyogc3RybmNweSBiZWNhdXNlIHdlIGRvbid0IG5lY2Vzc2FyaWx5IHdhbnQgbnVsIHRlcm1pbmF0aW9uICovCisJc3RybmNweSh1dC51dF9ob3N0LCBob3N0bmFtZSwgc2l6ZW9mKHV0LnV0X2hvc3QpKTsKKworCWlmIChwYWNrZXRfY29ubmVjdGlvbl9pc19vbl9zb2NrZXQoKSAmJgorCSAgICBnZXRwZWVybmFtZShwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25faW4oKSwKKwkgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZmcm9tLCAmZnJvbWxlbikgPT0gMCkgeworCQlpcHY2NF9ub3JtYWxpc2VfbWFwcGVkKCZmcm9tLCAmZnJvbWxlbik7CisJCWlmIChmcm9tLnNzX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisJCQlhNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmZnJvbTsKKwkJCW1lbWNweSgmdXQudXRfYWRkciwgJihhNC0+c2luX2FkZHIpLAorCQkJICAgIE1JTl9TSVpFT0YodXQudXRfYWRkciwgYTQtPnNpbl9hZGRyKSk7CisJCX0KKyNpZmRlZiBIQVZFX0FERFJfVjZfSU5fVVRNUAorCQlpZiAoZnJvbS5zc19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJCWE2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmZnJvbTsKKwkJCW1lbWNweSgmdXQudXRfYWRkcl92NiwgJihhNi0+c2luNl9hZGRyKSwKKwkJCSAgICBNSU5fU0laRU9GKHV0LnV0X2FkZHJfdjYsIGE2LT5zaW42X2FkZHIpKTsKKwkJfQorI2VuZGlmCisJfQorCisJaWYgKGF0b21pY2lvKHZ3cml0ZSwgZmQsICZ1dCwgc2l6ZW9mKHV0KSkgIT0gc2l6ZW9mKHV0KSkKKwkJZXJyb3IoIkZhaWxlZCB0byB3cml0ZSB0byAlczogJXMiLCBfUEFUSF9CVE1QLAorCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKworb3V0OgorCWNsb3NlKGZkKTsKK30KKyNlbmRpZgkvKiBVU0VfQlRNUCAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9sb2dpbnJlYy5oIGIvb3BlbnNzaC02LjBwMS9sb2dpbnJlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4OTIzZTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL2xvZ2lucmVjLmgKQEAgLTAsMCArMSwxMzEgQEAKKyNpZm5kZWYgX0hBVkVfTE9HSU5SRUNfSF8KKyNkZWZpbmUgX0hBVkVfTE9HSU5SRUNfSF8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBBbmRyZSBMdWNhcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qKgorICoqIGxvZ2lucmVjLmg6ICBwbGF0Zm9ybS1pbmRlcGVuZGVudCBsb2dpbiByZWNvcmRpbmcgYW5kIGxhc3Rsb2cgcmV0cmlldmFsCisgKiovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisvKioKKyAqKiB5b3Ugc2hvdWxkIHVzZSB0aGUgbG9naW5fKiBjYWxscyB0byB3b3JrIGFyb3VuZCBwbGF0Zm9ybSBkZXBlbmRlbmNpZXMKKyAqKi8KKworLyoKKyAqIGxvZ2luX25ldGluZm8gc3RydWN0dXJlCisgKi8KKwordW5pb24gbG9naW5fbmV0aW5mbyB7CisJc3RydWN0IHNvY2thZGRyIHNhOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzYV9pbjsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzYV9zdG9yYWdlOworfTsKKworLyoKKyAqICAgKiBsb2dpbmluZm8gc3RydWN0dXJlICAqCisgKi8KKy8qIHR5cGVzIC0gZGlmZmVyZW50IHRvIHV0bXAuaCAndHlwZScgbWFjcm9zICovCisvKiAodGhvdWdoIHNldCB0byB0aGUgc2FtZSB2YWx1ZSBhcyBsaW51eCwgb3BlbmJzZCBhbmQgb3RoZXJzLi4uKSAqLworI2RlZmluZSBMVFlQRV9MT0dJTiAgICA3CisjZGVmaW5lIExUWVBFX0xPR09VVCAgIDgKKworLyogc3RyaW5nIGxlbmd0aHMgLSBzZXQgdmVyeSBsb25nICovCisjZGVmaW5lIExJTkZPX1BST0dTSVpFIDY0CisjZGVmaW5lIExJTkZPX0xJTkVTSVpFIDY0CisjZGVmaW5lIExJTkZPX05BTUVTSVpFIDUxMgorI2RlZmluZSBMSU5GT19IT1NUU0laRSAyNTYKKworc3RydWN0IGxvZ2luaW5mbyB7CisJY2hhciAgICAgICBwcm9nbmFtZVtMSU5GT19QUk9HU0laRV07ICAgICAvKiBuYW1lIG9mIHByb2dyYW0gKGZvciBQQU0pICovCisJaW50ICAgICAgICBwcm9nbmFtZV9udWxsOworCXNob3J0IGludCAgdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwZSBvZiBsb2dpbiAoTFRZUEVfKikgKi8KKwlwaWRfdCAgICAgIHBpZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBJRCBvZiBsb2dpbiBwcm9jZXNzICovCisJdWlkX3QgICAgICB1aWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVSUQgb2YgdGhpcyB1c2VyICovCisJY2hhciAgICAgICBsaW5lW0xJTkZPX0xJTkVTSVpFXTsgICAgICAgICAvKiB0dHkvcHR5IG5hbWUgKi8KKwljaGFyICAgICAgIHVzZXJuYW1lW0xJTkZPX05BTUVTSVpFXTsgICAgIC8qIGxvZ2luIHVzZXJuYW1lICovCisJY2hhciAgICAgICBob3N0bmFtZVtMSU5GT19IT1NUU0laRV07ICAgICAvKiByZW1vdGUgaG9zdG5hbWUgKi8KKwkvKiAnZXhpdF9zdGF0dXMnIHN0cnVjdHVyZSBjb21wb25lbnRzICovCisJaW50ICAgICAgICBleGl0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb2Nlc3MgZXhpdCBzdGF0dXMgKi8KKwlpbnQgICAgICAgIHRlcm1pbmF0aW9uOyAgICAgICAgICAgICAgICAgLyogcHJvY2VzcyB0ZXJtaW5hdGlvbiBzdGF0dXMgKi8KKwkvKiBzdHJ1Y3QgdGltZXZhbCAoc3lzL3RpbWUuaCkgaXNuJ3QgYWx3YXlzIGF2YWlsYWJsZSwgaWYgaXQgaXNuJ3Qgd2UnbGwKKwkgKiB1c2UgdGltZV90J3MgdmFsdWUgYXMgdHZfc2VjIGFuZCBzZXQgdHZfdXNlYyB0byAwCisJICovCisJdW5zaWduZWQgaW50IHR2X3NlYzsKKwl1bnNpZ25lZCBpbnQgdHZfdXNlYzsKKwl1bmlvbiBsb2dpbl9uZXRpbmZvIGhvc3RhZGRyOyAgICAgICAvKiBjYWxsZXIncyBob3N0IGFkZHJlc3MoZXMpICovCit9OyAvKiBzdHJ1Y3QgbG9naW5pbmZvICovCisKKy8qCisgKiBsb2dpbiByZWNvcmRpbmcgZnVuY3Rpb25zCisgKi8KKworLyoqICdwdWJsaWMnIGZ1bmN0aW9ucyAqLworCisvKiBjb25zdHJ1Y3QgYSBuZXcgbG9naW4gZW50cnkgKi8KK3N0cnVjdCBsb2dpbmluZm8gKmxvZ2luX2FsbG9jX2VudHJ5KHBpZF90IHBpZCwgY29uc3QgY2hhciAqdXNlcm5hbWUsCisJCQkJICAgIGNvbnN0IGNoYXIgKmhvc3RuYW1lLCBjb25zdCBjaGFyICpsaW5lKTsKKy8qIGZyZWUgYSBzdHJ1Y3R1cmUgKi8KK3ZvaWQgbG9naW5fZnJlZV9lbnRyeShzdHJ1Y3QgbG9naW5pbmZvICpsaSk7CisvKiBmaWxsIG91dCBhIHByZS1hbGxvY2F0ZWQgc3RydWN0dXJlIHdpdGggdXNlZnVsIGluZm9ybWF0aW9uICovCitpbnQgbG9naW5faW5pdF9lbnRyeShzdHJ1Y3QgbG9naW5pbmZvICpsaSwgcGlkX3QgcGlkLCBjb25zdCBjaGFyICp1c2VybmFtZSwKKwkJICAgICBjb25zdCBjaGFyICpob3N0bmFtZSwgY29uc3QgY2hhciAqbGluZSk7CisvKiBwbGFjZSB0aGUgY3VycmVudCB0aW1lIGluIGEgbG9naW5pbmZvIHN0cnVjdCAqLwordm9pZCBsb2dpbl9zZXRfY3VycmVudF90aW1lKHN0cnVjdCBsb2dpbmluZm8gKmxpKTsKKworLyogcmVjb3JkIHRoZSBlbnRyeSAqLworaW50IGxvZ2luX2xvZ2luIChzdHJ1Y3QgbG9naW5pbmZvICpsaSk7CitpbnQgbG9naW5fbG9nb3V0KHN0cnVjdCBsb2dpbmluZm8gKmxpKTsKKyNpZmRlZiBMT0dJTl9ORUVEU19VVE1QWAoraW50IGxvZ2luX3V0bXBfb25seShzdHJ1Y3QgbG9naW5pbmZvICpsaSk7CisjZW5kaWYKKworLyoqIEVuZCBvZiBwdWJsaWMgZnVuY3Rpb25zICovCisKKy8qIHJlY29yZCB0aGUgZW50cnkgKi8KK2ludCBsb2dpbl93cml0ZSAoc3RydWN0IGxvZ2luaW5mbyAqbGkpOworaW50IGxvZ2luX2xvZ19lbnRyeShzdHJ1Y3QgbG9naW5pbmZvICpsaSk7CisKKy8qIHNldCB0aGUgbmV0d29yayBhZGRyZXNzIGJhc2VkIG9uIG5ldHdvcmsgYWRkcmVzcyB0eXBlICovCit2b2lkIGxvZ2luX3NldF9hZGRyKHN0cnVjdCBsb2dpbmluZm8gKmxpLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhLAorCQkgICAgY29uc3QgdW5zaWduZWQgaW50IHNhX3NpemUpOworCisvKgorICogbGFzdGxvZyByZXRyaWV2YWwgZnVuY3Rpb25zCisgKi8KKy8qIGxhc3Rsb2cgKmVudHJ5KiBmdW5jdGlvbnMgZmlsbCBvdXQgYSBsb2dpbmluZm8gKi8KK3N0cnVjdCBsb2dpbmluZm8gKmxvZ2luX2dldF9sYXN0bG9nKHN0cnVjdCBsb2dpbmluZm8gKmxpLCBjb25zdCB1aWRfdCB1aWQpOworLyogbGFzdGxvZyAqdGltZSogZnVuY3Rpb25zIHJldHVybiB0aW1lX3QgZXF1aXZhbGVudCAodWludCkgKi8KK3Vuc2lnbmVkIGludCBsb2dpbl9nZXRfbGFzdGxvZ190aW1lKGNvbnN0IHVpZF90IHVpZCk7CisKKy8qIHByb2R1Y2UgdmFyaW91cyBmb3JtcyBvZiB0aGUgbGluZSBmaWxlbmFtZSAqLworY2hhciAqbGluZV9mdWxsbmFtZShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgdV9pbnQgZHN0c2l6ZSk7CitjaGFyICpsaW5lX3N0cmlwbmFtZShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgaW50IGRzdHNpemUpOworY2hhciAqbGluZV9hYmJyZXZuYW1lKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBpbnQgZHN0c2l6ZSk7CisKK3ZvaWQgcmVjb3JkX2ZhaWxlZF9sb2dpbihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKworI2VuZGlmIC8qIF9IQVZFX0xPR0lOUkVDX0hfICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL2xvZ2ludGVzdC5jIGIvb3BlbnNzaC02LjBwMS9sb2dpbnRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODk3YWUwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9sb2dpbnRlc3QuYwpAQCAtMCwwICsxLDMwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBBbmRyZSBMdWNhcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qKgorICoqIGxvZ2ludGVzdC5jOiAgc2ltcGxlIHRlc3QgZHJpdmVyIGZvciBwbGF0Zm9ybS1pbmRlcGVuZGVudCBsb2dpbiByZWNvcmRpbmcKKyAqKiAgICAgICAgICAgICAgIGFuZCBsYXN0bG9nIHJldHJpZXZhbAorICoqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2lmZGVmIEhBVkVfVElNRV9ICisjaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsb2dpbnJlYy5oIgorCitleHRlcm4gY2hhciAqX19wcm9nbmFtZTsKKworI2RlZmluZSBQQVVTRV9CRUZPUkVfTE9HT1VUIDMKKworaW50IG5vbG9ndGVzdCA9IDA7CitpbnQgY29tcGlsZV9vcHRzX29ubHkgPSAwOworaW50IGJlX3ZlcmJvc2UgPSAwOworCisKKy8qIER1bXAgYSBsb2dpbmluZm8gdG8gc3Rkb3V0LiBBc3N1bWVzIGEgdGFiIHNpemUgb2YgOCBjaGFycy4gKi8KK3ZvaWQKK2R1bXBfbG9naW5pbmZvKHN0cnVjdCBsb2dpbmluZm8gKmxpLCBjaGFyICpkZXNjbmFtZSkKK3sKKwkvKiB5ZXMgSSBrbm93IGhvdyBuYXN0eSB0aGlzIGlzICovCisJcHJpbnRmKCJzdHJ1Y3QgbG9naW5pbmZvICVzID0ge1xuXHQiCisJICAgICAgICJwcm9nbmFtZVx0JyVzJ1xuXHR0eXBlXHRcdCVkXG5cdCIKKwkgICAgICAgInBpZFx0XHQlZFxuXHR1aWRcdFx0JWRcblx0IgorCSAgICAgICAibGluZVx0XHQnJXMnXG5cdHVzZXJuYW1lXHQnJXMnXG5cdCIKKwkgICAgICAgImhvc3RuYW1lXHQnJXMnXG5cdGV4aXRcdFx0JWRcblx0dGVybWluYXRpb25cdCVkXG5cdCIKKwkgICAgICAgInR2X3NlY1x0JWRcblx0dHZfdXNlY1x0JWRcblx0IgorCSAgICAgICAic3RydWN0IGxvZ2luX25ldGluZm8gaG9zdGFkZHIge1xuXHRcdCIKKwkgICAgICAgInN0cnVjdCBzb2NrYWRkciBzYSB7XG4iCisJICAgICAgICJcdFx0XHRmYW1pbHlcdCVkXG5cdFx0fVxuIgorCSAgICAgICAiXHR9XG4iCisJICAgICAgICJ9XG4iLAorCSAgICAgICBkZXNjbmFtZSwgbGktPnByb2duYW1lLCBsaS0+dHlwZSwKKwkgICAgICAgbGktPnBpZCwgbGktPnVpZCwgbGktPmxpbmUsCisJICAgICAgIGxpLT51c2VybmFtZSwgbGktPmhvc3RuYW1lLCBsaS0+ZXhpdCwKKwkgICAgICAgbGktPnRlcm1pbmF0aW9uLCBsaS0+dHZfc2VjLCBsaS0+dHZfdXNlYywKKwkgICAgICAgbGktPmhvc3RhZGRyLnNhLnNhX2ZhbWlseSk7Cit9CisKKworaW50Cit0ZXN0QVBJKCkKK3sKKwlzdHJ1Y3QgbG9naW5pbmZvICpsaTE7CisJc3RydWN0IHBhc3N3ZCAqcHc7CisJc3RydWN0IGhvc3RlbnQgKmhlOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzYV9pbjQ7CisJY2hhciBjbWRzdHJpbmdbMjU2XSwgc3RyaXBsaW5lWzhdOworCWNoYXIgdXNlcm5hbWVbMzJdOworI2lmZGVmIEhBVkVfVElNRV9ICisJdGltZV90IHQwLCB0MSwgdDIsIGxvZ2ludGltZSwgbG9nb3V0dGltZTsKKwljaGFyIHNfdDBbNjRdLHNfdDFbNjRdLHNfdDJbNjRdOworCWNoYXIgc19sb2dpbnRpbWVbNjRdLCBzX2xvZ291dHRpbWVbNjRdOyAvKiBjdGltZSgpIHN0cmluZ3MgKi8KKyNlbmRpZgorCisJcHJpbnRmKCIqKlxuKiogVGVzdGluZyB0aGUgQVBJLi4uXG4qKlxuIik7CisKKwlwdyA9IGdldHB3dWlkKGdldHVpZCgpKTsKKwlzdHJsY3B5KHVzZXJuYW1lLCBwdy0+cHdfbmFtZSwgc2l6ZW9mKHVzZXJuYW1lKSk7CisKKwkvKiBnZXRob3N0bmFtZShob3N0bmFtZSwgc2l6ZW9mKGhvc3RuYW1lKSk7ICovCisKKwlwcmludGYoImxvZ2luX2FsbG9jX2VudHJ5IHRlc3QgKG5vIGhvc3QgaW5mbyk6XG4iKTsKKworCS8qIEZJWE1FIGZha2UgdHR5IG1vcmUgZWZmZWN0aXZlbHkgLSB0aGlzIGNvdWxkIHVwc2V0IHNvbWUgcGxhdGZvcm1zICovCisJbGkxID0gbG9naW5fYWxsb2NfZW50cnkoKGludClnZXRwaWQoKSwgdXNlcm5hbWUsIE5VTEwsIHR0eW5hbWUoMCkpOworCXN0cmxjcHkobGkxLT5wcm9nbmFtZSwgIk9wZW5TU0gtbG9naW50ZXN0Iiwgc2l6ZW9mKGxpMS0+cHJvZ25hbWUpKTsKKworCWlmIChiZV92ZXJib3NlKQorCQlkdW1wX2xvZ2luaW5mbyhsaTEsICJsaTEiKTsKKworCXByaW50ZigiU2V0dGluZyBob3N0IGFkZHJlc3MgaW5mbyBmb3IgJ2xvY2FsaG9zdCcgKG1heSBjYWxsIG91dCk6XG4iKTsKKwlpZiAoISAoaGUgPSBnZXRob3N0YnluYW1lKCJsb2NhbGhvc3QiKSkpIHsKKwkJcHJpbnRmKCJDb3VsZG4ndCBzZXQgaG9zdG5hbWUobG9va3VwIGZhaWxlZClcbiIpOworCX0gZWxzZSB7CisJCS8qIE5PVEU6IHRoaXMgaXMgbWVzc3ksIGJ1dCB0eXBpY2FsbHkgYSBwcm9ncmFtIHdvdWxkbid0IGhhdmUgdG8gc2V0CisJCSAqICBhbnkgb2YgdGhpcywgYSBzb2NrYWRkcl9pbiogd291bGQgYmUgYWxyZWFkeSBwcmVwYXJlZCAqLworCQltZW1jcHkoKHZvaWQgKikmKHNhX2luNC5zaW5fYWRkciksICh2b2lkICopJihoZS0+aF9hZGRyX2xpc3RbMF1bMF0pLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisJCWxvZ2luX3NldF9hZGRyKGxpMSwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2FfaW40LCBzaXplb2Yoc2FfaW40KSk7CisJCXN0cmxjcHkobGkxLT5ob3N0bmFtZSwgImxvY2FsaG9zdCIsIHNpemVvZihsaTEtPmhvc3RuYW1lKSk7CisJfQorCWlmIChiZV92ZXJib3NlKQorCQlkdW1wX2xvZ2luaW5mbyhsaTEsICJsaTEiKTsKKworCWlmICgoaW50KWdldGV1aWQoKSAhPSAwKSB7CisJCXByaW50ZigiTk9UIFJVTk5JTkcgTE9HSU4gVEVTVFMgLSB5b3UgYXJlIG5vdCByb290IVxuIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChub2xvZ3Rlc3QpCisJCXJldHVybiAxOworCisJbGluZV9zdHJpcG5hbWUoc3RyaXBsaW5lLCBsaTEtPmxpbmUsIHNpemVvZihzdHJpcGxpbmUpKTsKKworCXByaW50ZigiUGVyZm9ybWluZyBhbiBpbnZhbGlkIGxvZ2luIGF0dGVtcHQgKG5vIHR5cGUgZmllbGQpXG4tLVxuIik7CisJbG9naW5fd3JpdGUobGkxKTsKKwlwcmludGYoIi0tXG4oU2hvdWxkIGhhdmUgd3JpdHRlbiBlcnJvcnMgdG8gc3RkZXJyKVxuIik7CisKKyNpZmRlZiBIQVZFX1RJTUVfSAorCSh2b2lkKXRpbWUoJnQwKTsKKwlzdHJsY3B5KHNfdDAsIGN0aW1lKCZ0MCksIHNpemVvZihzX3QwKSk7CisJdDEgPSBsb2dpbl9nZXRfbGFzdGxvZ190aW1lKGdldHVpZCgpKTsKKwlzdHJsY3B5KHNfdDEsIGN0aW1lKCZ0MSksIHNpemVvZihzX3QxKSk7CisJcHJpbnRmKCJCZWZvcmUgbG9nZ2luZyBpbjpcblx0Y3VycmVudCB0aW1lIGlzICVkIC0gJXNcdCIKKwkgICAgICAgImxhc3Rsb2cgdGltZSBpcyAlZCAtICVzXG4iLAorCSAgICAgICAoaW50KXQwLCBzX3QwLCAoaW50KXQxLCBzX3QxKTsKKyNlbmRpZgorCisJcHJpbnRmKCJQZXJmb3JtaW5nIGEgbG9naW4gb24gbGluZSAlcyAiLCBzdHJpcGxpbmUpOworI2lmZGVmIEhBVkVfVElNRV9ICisJKHZvaWQpdGltZSgmbG9naW50aW1lKTsKKwlzdHJsY3B5KHNfbG9naW50aW1lLCBjdGltZSgmbG9naW50aW1lKSwgc2l6ZW9mKHNfbG9naW50aW1lKSk7CisJcHJpbnRmKCJhdCAlZCAtICVzIiwgKGludClsb2dpbnRpbWUsIHNfbG9naW50aW1lKTsKKyNlbmRpZgorCXByaW50ZigiLS1cbiIpOworCWxvZ2luX2xvZ2luKGxpMSk7CisKKwlzbnByaW50ZihjbWRzdHJpbmcsIHNpemVvZihjbWRzdHJpbmcpLCAid2hvIHwgZ3JlcCAnJXMgJyIsCisJCSBzdHJpcGxpbmUpOworCXN5c3RlbShjbWRzdHJpbmcpOworCisJcHJpbnRmKCItLVxuUGF1c2luZyBmb3IgJWQgc2Vjb25kKHMpLi4uXG4iLCBQQVVTRV9CRUZPUkVfTE9HT1VUKTsKKwlzbGVlcChQQVVTRV9CRUZPUkVfTE9HT1VUKTsKKworCXByaW50ZigiUGVyZm9ybWluZyBhIGxvZ291dCAiKTsKKyNpZmRlZiBIQVZFX1RJTUVfSAorCSh2b2lkKXRpbWUoJmxvZ291dHRpbWUpOworCXN0cmxjcHkoc19sb2dvdXR0aW1lLCBjdGltZSgmbG9nb3V0dGltZSksIHNpemVvZihzX2xvZ291dHRpbWUpKTsKKwlwcmludGYoImF0ICVkIC0gJXMiLCAoaW50KWxvZ291dHRpbWUsIHNfbG9nb3V0dGltZSk7CisjZW5kaWYKKwlwcmludGYoIlxuVGhlIHJvb3QgbG9naW4gc2hvd24gYWJvdmUgc2hvdWxkIGJlIGdvbmUuXG4iCisJICAgICAgICJJZiB0aGUgcm9vdCBsb2dpbiBoYXNuJ3QgZ29uZSwgYnV0IGFub3RoZXIgdXNlciBvbiB0aGUgc2FtZVxuIgorCSAgICAgICAicHR5IGhhcywgdGhpcyBpcyBPSyAtIHdlJ3JlIGhhY2tpbmcgaXQgaGVyZSwgYW5kIHRoZXJlXG4iCisJICAgICAgICJzaG91bGRuJ3QgYmUgdHdvIHVzZXJzIG9uIG9uZSBwdHkgaW4gcmVhbGl0eS4uLlxuIgorCSAgICAgICAiLS0gKCd3aG8nIG91dHB1dCBmb2xsb3dzKVxuIik7CisJbG9naW5fbG9nb3V0KGxpMSk7CisKKwlzeXN0ZW0oY21kc3RyaW5nKTsKKwlwcmludGYoIi0tICgnd2hvJyBvdXRwdXQgZW5kcylcbiIpOworCisjaWZkZWYgSEFWRV9USU1FX0gKKwl0MiA9IGxvZ2luX2dldF9sYXN0bG9nX3RpbWUoZ2V0dWlkKCkpOworCXN0cmxjcHkoc190MiwgY3RpbWUoJnQyKSwgc2l6ZW9mKHNfdDIpKTsKKwlwcmludGYoIkFmdGVyIGxvZ2dpbmcgaW4sIGxhc3Rsb2cgdGltZSBpcyAlZCAtICVzXG4iLCAoaW50KXQyLCBzX3QyKTsKKwlpZiAodDEgPT0gdDIpCisJCXByaW50ZigiVGhlIGxhc3Rsb2cgdGltZXMgYmVmb3JlIGFuZCBhZnRlciBsb2dnaW5nIGluIGFyZSB0aGUgIgorCQkgICAgICAgInNhbWUuXG5UaGlzIGluZGljYXRlcyB0aGF0IGxhc3Rsb2cgaXMgKiogTk9UIFdPUktJTkcgIgorCQkgICAgICAgIkNPUlJFQ1RMWSAqKlxuIik7CisJZWxzZSBpZiAodDAgIT0gdDIpCisJCS8qIFdlIGNhbiBiZSBvZmYgYnkgYSBzZWNvbmQgb3Igc28sIGV2ZW4gd2hlbiByZWNvcmRpbmcgd29ya3MgZmluZS4KKwkJICogSSdtIG5vdCAxMDAlIHN1cmUgd2h5LCBidXQgaXQncyB0cnVlLiAqLworCQlwcmludGYoIioqIFRoZSBsb2dpbiB0aW1lIGFuZCB0aGUgbGFzdGxvZyB0aW1lIGRpZmZlci5cbiIKKwkJICAgICAgICIqKiBUaGlzIGluZGljYXRlcyB0aGF0IGxhc3Rsb2cgaXMgZWl0aGVyIHJlY29yZGluZyB0aGUgIgorCQkgICAgICAgIndyb25nIHRpbWUsXG4qKiBvciByZXRyaWV2aW5nIHRoZSB3cm9uZyBlbnRyeS5cbiIKKwkJICAgICAgICJJZiBpdCdzIG9mZiBieSBsZXNzIHRoYW4gJWQgc2Vjb25kKHMpICIKKwkJICAgICAgICJydW4gdGhlIHRlc3QgYWdhaW4uXG4iLCBQQVVTRV9CRUZPUkVfTE9HT1VUKTsKKwllbHNlCisJCXByaW50ZigibGFzdGxvZyBhZ3JlZXMgd2l0aCB0aGUgbG9naW4gdGltZS4gVGhpcyBpcyBhIGdvb2QgdGhpbmcuXG4iKTsKKworI2VuZGlmCisKKwlwcmludGYoIi0tXG5UaGUgb3V0cHV0IG9mICdsYXN0JyBzaG93biBuZXh0IHNob3VsZCBoYXZlICIKKwkgICAgICAgImFuIGVudHJ5IGZvciByb290IFxuICBvbiAlcyBmb3IgdGhlIHRpbWUgc2hvd24gYWJvdmU6XG4tLVxuIiwKKwkgICAgICAgc3RyaXBsaW5lKTsKKwlzbnByaW50ZihjbWRzdHJpbmcsIHNpemVvZihjbWRzdHJpbmcpLCAibGFzdCB8IGdyZXAgJyVzICcgfCBoZWFkIC0zIiwKKwkJIHN0cmlwbGluZSk7CisJc3lzdGVtKGNtZHN0cmluZyk7CisKKwlwcmludGYoIi0tXG5FbmQgb2YgbG9naW4gdGVzdC5cbiIpOworCisJbG9naW5fZnJlZV9lbnRyeShsaTEpOworCisJcmV0dXJuIDE7Cit9IC8qIHRlc3RBUEkoKSAqLworCisKK3ZvaWQKK3Rlc3RMaW5lTmFtZShjaGFyICpsaW5lKQoreworCS8qIGhhdmUgdG8gbnVsbC10ZXJtaW5hdGUgLSB0aGVzZSBmdW5jdGlvbnMgYXJlIGRlc2lnbmVkIGZvcgorCSAqIHN0cnVjdHVyZXMgd2l0aCBmaXhlZC1sZW5ndGggY2hhciBhcnJheXMsIGFuZCBkb24ndCBudWxsLXRlcm0uKi8KKwljaGFyIGZ1bGxbMTddLCBzdHJpcFs5XSwgYWJicmV2WzVdOworCisJbWVtc2V0KGZ1bGwsICdcMCcsIHNpemVvZihmdWxsKSk7CisJbWVtc2V0KHN0cmlwLCAnXDAnLCBzaXplb2Yoc3RyaXApKTsKKwltZW1zZXQoYWJicmV2LCAnXDAnLCBzaXplb2YoYWJicmV2KSk7CisKKwlsaW5lX2Z1bGxuYW1lKGZ1bGwsIGxpbmUsIHNpemVvZihmdWxsKS0xKTsKKwlsaW5lX3N0cmlwbmFtZShzdHJpcCwgZnVsbCwgc2l6ZW9mKHN0cmlwKS0xKTsKKwlsaW5lX2FiYnJldm5hbWUoYWJicmV2LCBmdWxsLCBzaXplb2YoYWJicmV2KS0xKTsKKwlwcmludGYoIiVzOiAlcywgJXMsICVzXG4iLCBsaW5lLCBmdWxsLCBzdHJpcCwgYWJicmV2KTsKKworfSAvKiB0ZXN0TGluZU5hbWUoKSAqLworCisKK2ludAordGVzdE91dHB1dCgpCit7CisJcHJpbnRmKCIqKlxuKiogVGVzdGluZyBsaW5lbmFtZSBmdW5jdGlvbnNcbioqXG4iKTsKKwl0ZXN0TGluZU5hbWUoIi9kZXYvcHRzLzEiKTsKKwl0ZXN0TGluZU5hbWUoInB0cy8xIik7CisJdGVzdExpbmVOYW1lKCJwdHMvOTk5Iik7CisJdGVzdExpbmVOYW1lKCIvZGV2L3R0eXAwMCIpOworCXRlc3RMaW5lTmFtZSgidHR5cDAwIik7CisKKwlyZXR1cm4gMTsKK30gLyogdGVzdE91dHB1dCgpICovCisKKworLyogc2hvdyB3aGljaCBvcHRpb25zIGdvdCBjb21waWxlZCBpbiAqLwordm9pZAorc2hvd09wdGlvbnModm9pZCkKK3sKKwlwcmludGYoIioqXG4qKiBDb21waWxlLXRpbWUgb3B0aW9uc1xuKipcbiIpOworCisJcHJpbnRmKCJsb2dpbiByZWNvcmRpbmcgbWV0aG9kcyBzZWxlY3RlZDpcbiIpOworI2lmZGVmIFVTRV9MT0dJTgorCXByaW50ZigiXHRVU0VfTE9HSU5cbiIpOworI2VuZGlmCisjaWZkZWYgVVNFX1VUTVAKKwlwcmludGYoIlx0VVNFX1VUTVAgKFVUTVBfRklMRT0lcylcbiIsIFVUTVBfRklMRSk7CisjZW5kaWYKKyNpZmRlZiBVU0VfVVRNUFgKKwlwcmludGYoIlx0VVNFX1VUTVBYXG4iKTsKKyNlbmRpZgorI2lmZGVmIFVTRV9XVE1QCisJcHJpbnRmKCJcdFVTRV9XVE1QIChXVE1QX0ZJTEU9JXMpXG4iLCBXVE1QX0ZJTEUpOworI2VuZGlmCisjaWZkZWYgVVNFX1dUTVBYCisJcHJpbnRmKCJcdFVTRV9XVE1QWCAoV1RNUFhfRklMRT0lcylcbiIsIFdUTVBYX0ZJTEUpOworI2VuZGlmCisjaWZkZWYgVVNFX0xBU1RMT0cKKwlwcmludGYoIlx0VVNFX0xBU1RMT0cgKExBU1RMT0dfRklMRT0lcylcbiIsIExBU1RMT0dfRklMRSk7CisjZW5kaWYKKwlwcmludGYoIlxuIik7CisKK30gLyogc2hvd09wdGlvbnMoKSAqLworCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXByaW50ZigiUGxhdGZvcm0taW5kZXBlbmRlbnQgbG9naW4gcmVjb3JkaW5nIHRlc3QgZHJpdmVyXG4iKTsKKworCV9fcHJvZ25hbWUgPSBzc2hfZ2V0X3Byb2duYW1lKGFyZ3ZbMF0pOworCWlmIChhcmdjID09IDIpIHsKKwkJaWYgKHN0cm5jbXAoYXJndlsxXSwgIi1pIiwgMykgPT0gMCkKKwkJCWNvbXBpbGVfb3B0c19vbmx5ID0gMTsKKwkJZWxzZSBpZiAoc3RybmNtcChhcmd2WzFdLCAiLXYiLCAzKSA9PSAwKQorCQkJYmVfdmVyYm9zZT0xOworCX0KKworCWlmICghY29tcGlsZV9vcHRzX29ubHkpIHsKKwkJaWYgKGJlX3ZlcmJvc2UgJiYgIXRlc3RPdXRwdXQoKSkKKwkJCXJldHVybiAxOworCisJCWlmICghdGVzdEFQSSgpKQorCQkJcmV0dXJuIDE7CisJfQorCisJc2hvd09wdGlvbnMoKTsKKworCXJldHVybiAwOworfSAvKiBtYWluKCkgKi8KKwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9tYWMuYyBiL29wZW5zc2gtNi4wcDEvbWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMyZDNjNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvbWFjLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qICRPcGVuQlNEOiBtYWMuYyx2IDEuMTcgMjAxMS8xMi8wMiAwMDo0Mzo1NyBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2htYWMuaD4KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgImNpcGhlci5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgImtleC5oIgorI2luY2x1ZGUgIm1hYy5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKworI2luY2x1ZGUgInVtYWMuaCIKKworI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L29wZW5zc2wtY29tcGF0LmgiCisKKyNkZWZpbmUgU1NIX0VWUAkJMQkvKiBPcGVuU1NMIEVWUC1iYXNlZCBNQUMgKi8KKyNkZWZpbmUgU1NIX1VNQUMJMgkvKiBVTUFDIChub3QgaW50ZWdyYXRlZCB3aXRoIE9wZW5TU0wpICovCisKK3N0cnVjdCB7CisJY2hhcgkJKm5hbWU7CisJaW50CQl0eXBlOworCWNvbnN0IEVWUF9NRCAqCSgqbWRmdW5jKSh2b2lkKTsKKwlpbnQJCXRydW5jYXRlYml0czsJLyogdHJ1bmNhdGUgZGlnZXN0IGlmICE9IDAgKi8KKwlpbnQJCWtleV9sZW47CS8qIGp1c3QgZm9yIFVNQUMgKi8KKwlpbnQJCWxlbjsJCS8qIGp1c3QgZm9yIFVNQUMgKi8KK30gbWFjc1tdID0geworCXsgImhtYWMtc2hhMSIsCQkJU1NIX0VWUCwgRVZQX3NoYTEsIDAsIC0xLCAtMSB9LAorCXsgImhtYWMtc2hhMS05NiIsCQlTU0hfRVZQLCBFVlBfc2hhMSwgOTYsIC0xLCAtMSB9LAorI2lmZGVmIEhBVkVfRVZQX1NIQTI1NgorCXsgImhtYWMtc2hhMi0yNTYiLAkJU1NIX0VWUCwgRVZQX3NoYTI1NiwgMCwgLTEsIC0xIH0sCisJeyAiaG1hYy1zaGEyLTI1Ni05NiIsCQlTU0hfRVZQLCBFVlBfc2hhMjU2LCA5NiwgLTEsIC0xIH0sCisJeyAiaG1hYy1zaGEyLTUxMiIsCQlTU0hfRVZQLCBFVlBfc2hhNTEyLCAwLCAtMSwgLTEgfSwKKwl7ICJobWFjLXNoYTItNTEyLTk2IiwJCVNTSF9FVlAsIEVWUF9zaGE1MTIsIDk2LCAtMSwgLTEgfSwKKyNlbmRpZgorCXsgImhtYWMtbWQ1IiwJCQlTU0hfRVZQLCBFVlBfbWQ1LCAwLCAtMSwgLTEgfSwKKwl7ICJobWFjLW1kNS05NiIsCQlTU0hfRVZQLCBFVlBfbWQ1LCA5NiwgLTEsIC0xIH0sCisJeyAiaG1hYy1yaXBlbWQxNjAiLAkJU1NIX0VWUCwgRVZQX3JpcGVtZDE2MCwgMCwgLTEsIC0xIH0sCisJeyAiaG1hYy1yaXBlbWQxNjBAb3BlbnNzaC5jb20iLAlTU0hfRVZQLCBFVlBfcmlwZW1kMTYwLCAwLCAtMSwgLTEgfSwKKwl7ICJ1bWFjLTY0QG9wZW5zc2guY29tIiwJU1NIX1VNQUMsIE5VTEwsIDAsIDEyOCwgNjQgfSwKKwl7IE5VTEwsCQkJCTAsIE5VTEwsIDAsIC0xLCAtMSB9Cit9OworCitzdGF0aWMgdm9pZAorbWFjX3NldHVwX2J5X2lkKE1hYyAqbWFjLCBpbnQgd2hpY2gpCit7CisJaW50IGV2cF9sZW47CisJbWFjLT50eXBlID0gbWFjc1t3aGljaF0udHlwZTsKKwlpZiAobWFjLT50eXBlID09IFNTSF9FVlApIHsKKwkJbWFjLT5ldnBfbWQgPSAoKm1hY3Nbd2hpY2hdLm1kZnVuYykoKTsKKwkJaWYgKChldnBfbGVuID0gRVZQX01EX3NpemUobWFjLT5ldnBfbWQpKSA8PSAwKQorCQkJZmF0YWwoIm1hYyAlcyBsZW4gJWQiLCBtYWMtPm5hbWUsIGV2cF9sZW4pOworCQltYWMtPmtleV9sZW4gPSBtYWMtPm1hY19sZW4gPSAodV9pbnQpZXZwX2xlbjsKKwl9IGVsc2UgeworCQltYWMtPm1hY19sZW4gPSBtYWNzW3doaWNoXS5sZW4gLyA4OworCQltYWMtPmtleV9sZW4gPSBtYWNzW3doaWNoXS5rZXlfbGVuIC8gODsKKwkJbWFjLT51bWFjX2N0eCA9IE5VTEw7CisJfQorCWlmIChtYWNzW3doaWNoXS50cnVuY2F0ZWJpdHMgIT0gMCkKKwkJbWFjLT5tYWNfbGVuID0gbWFjc1t3aGljaF0udHJ1bmNhdGViaXRzIC8gODsKK30KKworaW50CittYWNfc2V0dXAoTWFjICptYWMsIGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBtYWNzW2ldLm5hbWU7IGkrKykgeworCQlpZiAoc3RyY21wKG5hbWUsIG1hY3NbaV0ubmFtZSkgPT0gMCkgeworCQkJaWYgKG1hYyAhPSBOVUxMKQorCQkJCW1hY19zZXR1cF9ieV9pZChtYWMsIGkpOworCQkJZGVidWcyKCJtYWNfc2V0dXA6IGZvdW5kICVzIiwgbmFtZSk7CisJCQlyZXR1cm4gKDApOworCQl9CisJfQorCWRlYnVnMigibWFjX3NldHVwOiB1bmtub3duICVzIiwgbmFtZSk7CisJcmV0dXJuICgtMSk7Cit9CisKK2ludAorbWFjX2luaXQoTWFjICptYWMpCit7CisJaWYgKG1hYy0+a2V5ID09IE5VTEwpCisJCWZhdGFsKCJtYWNfaW5pdDogbm8ga2V5Iik7CisJc3dpdGNoIChtYWMtPnR5cGUpIHsKKwljYXNlIFNTSF9FVlA6CisJCWlmIChtYWMtPmV2cF9tZCA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCQlITUFDX0NUWF9pbml0KCZtYWMtPmV2cF9jdHgpOworCQlITUFDX0luaXQoJm1hYy0+ZXZwX2N0eCwgbWFjLT5rZXksIG1hYy0+a2V5X2xlbiwgbWFjLT5ldnBfbWQpOworCQlyZXR1cm4gMDsKKwljYXNlIFNTSF9VTUFDOgorCQltYWMtPnVtYWNfY3R4ID0gdW1hY19uZXcobWFjLT5rZXkpOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorfQorCit1X2NoYXIgKgorbWFjX2NvbXB1dGUoTWFjICptYWMsIHVfaW50MzJfdCBzZXFubywgdV9jaGFyICpkYXRhLCBpbnQgZGF0YWxlbikKK3sKKwlzdGF0aWMgdV9jaGFyIG1bRVZQX01BWF9NRF9TSVpFXTsKKwl1X2NoYXIgYls0XSwgbm9uY2VbOF07CisKKwlpZiAobWFjLT5tYWNfbGVuID4gc2l6ZW9mKG0pKQorCQlmYXRhbCgibWFjX2NvbXB1dGU6IG1hYyB0b28gbG9uZyAldSAlbHUiLAorCQkgICAgbWFjLT5tYWNfbGVuLCAodV9sb25nKXNpemVvZihtKSk7CisKKwlzd2l0Y2ggKG1hYy0+dHlwZSkgeworCWNhc2UgU1NIX0VWUDoKKwkJcHV0X3UzMihiLCBzZXFubyk7CisJCS8qIHJlc2V0IEhNQUMgY29udGV4dCAqLworCQlITUFDX0luaXQoJm1hYy0+ZXZwX2N0eCwgTlVMTCwgMCwgTlVMTCk7CisJCUhNQUNfVXBkYXRlKCZtYWMtPmV2cF9jdHgsIGIsIHNpemVvZihiKSk7CisJCUhNQUNfVXBkYXRlKCZtYWMtPmV2cF9jdHgsIGRhdGEsIGRhdGFsZW4pOworCQlITUFDX0ZpbmFsKCZtYWMtPmV2cF9jdHgsIG0sIE5VTEwpOworCQlicmVhazsKKwljYXNlIFNTSF9VTUFDOgorCQlwdXRfdTY0KG5vbmNlLCBzZXFubyk7CisJCXVtYWNfdXBkYXRlKG1hYy0+dW1hY19jdHgsIGRhdGEsIGRhdGFsZW4pOworCQl1bWFjX2ZpbmFsKG1hYy0+dW1hY19jdHgsIG0sIG5vbmNlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZmF0YWwoIm1hY19jb21wdXRlOiB1bmtub3duIE1BQyB0eXBlIik7CisJfQorCXJldHVybiAobSk7Cit9CisKK3ZvaWQKK21hY19jbGVhcihNYWMgKm1hYykKK3sKKwlpZiAobWFjLT50eXBlID09IFNTSF9VTUFDKSB7CisJCWlmIChtYWMtPnVtYWNfY3R4ICE9IE5VTEwpCisJCQl1bWFjX2RlbGV0ZShtYWMtPnVtYWNfY3R4KTsKKwl9IGVsc2UgaWYgKG1hYy0+ZXZwX21kICE9IE5VTEwpCisJCUhNQUNfY2xlYW51cCgmbWFjLT5ldnBfY3R4KTsKKwltYWMtPmV2cF9tZCA9IE5VTEw7CisJbWFjLT51bWFjX2N0eCA9IE5VTEw7Cit9CisKKy8qIFhYWCBjb3BpZWQgZnJvbSBjaXBoZXJzX3ZhbGlkICovCisjZGVmaW5lCU1BQ19TRVAJIiwiCitpbnQKK21hY192YWxpZChjb25zdCBjaGFyICpuYW1lcykKK3sKKwljaGFyICptYWNsaXN0LCAqY3AsICpwOworCisJaWYgKG5hbWVzID09IE5VTEwgfHwgc3RyY21wKG5hbWVzLCAiIikgPT0gMCkKKwkJcmV0dXJuICgwKTsKKwltYWNsaXN0ID0gY3AgPSB4c3RyZHVwKG5hbWVzKTsKKwlmb3IgKChwID0gc3Ryc2VwKCZjcCwgTUFDX1NFUCkpOyBwICYmICpwICE9ICdcMCc7CisJICAgIChwID0gc3Ryc2VwKCZjcCwgTUFDX1NFUCkpKSB7CisJCWlmIChtYWNfc2V0dXAoTlVMTCwgcCkgPCAwKSB7CisJCQlkZWJ1ZygiYmFkIG1hYyAlcyBbJXNdIiwgcCwgbmFtZXMpOworCQkJeGZyZWUobWFjbGlzdCk7CisJCQlyZXR1cm4gKDApOworCQl9IGVsc2UgeworCQkJZGVidWczKCJtYWMgb2s6ICVzIFslc10iLCBwLCBuYW1lcyk7CisJCX0KKwl9CisJZGVidWczKCJtYWNzIG9rOiBbJXNdIiwgbmFtZXMpOworCXhmcmVlKG1hY2xpc3QpOworCXJldHVybiAoMSk7Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL21hYy5oIGIvb3BlbnNzaC02LjBwMS9tYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWY1NjRkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9tYWMuaApAQCAtMCwwICsxLDMwIEBACisvKiAkT3BlbkJTRDogbWFjLmgsdiAxLjYgMjAwNy8wNi8wNyAxOTozNzozNCBwdmFsY2hldiBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworaW50CSBtYWNfdmFsaWQoY29uc3QgY2hhciAqKTsKK2ludAkgbWFjX3NldHVwKE1hYyAqLCBjaGFyICopOworaW50CSBtYWNfaW5pdChNYWMgKik7Cit1X2NoYXIJKm1hY19jb21wdXRlKE1hYyAqLCB1X2ludDMyX3QsIHVfY2hhciAqLCBpbnQpOwordm9pZAkgbWFjX2NsZWFyKE1hYyAqKTsKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvbWF0Y2guYyBiL29wZW5zc2gtNi4wcDEvbWF0Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzg5NDc3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9tYXRjaC5jCkBAIC0wLDAgKzEsMjc4IEBACisvKiAkT3BlbkJTRDogbWF0Y2guYyx2IDEuMjcgMjAwOC8wNi8xMCAyMzowNjoxOSBkam0gRXhwICQgKi8KKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiBTaW1wbGUgcGF0dGVybiBtYXRjaGluZywgd2l0aCAnKicgYW5kICc/JyBhcyB3aWxkY2FyZHMuCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAibWF0Y2guaCIKKworLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3RyaW5nIG1hdGNoZXMgdGhlIHBhdHRlcm4gKHdoaWNoIG1heSBjb250YWluID8KKyAqIGFuZCAqIGFzIHdpbGRjYXJkcyksIGFuZCB6ZXJvIGlmIGl0IGRvZXMgbm90IG1hdGNoLgorICovCisKK2ludAorbWF0Y2hfcGF0dGVybihjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpwYXR0ZXJuKQoreworCWZvciAoOzspIHsKKwkJLyogSWYgYXQgZW5kIG9mIHBhdHRlcm4sIGFjY2VwdCBpZiBhbHNvIGF0IGVuZCBvZiBzdHJpbmcuICovCisJCWlmICghKnBhdHRlcm4pCisJCQlyZXR1cm4gISpzOworCisJCWlmICgqcGF0dGVybiA9PSAnKicpIHsKKwkJCS8qIFNraXAgdGhlIGFzdGVyaXNrLiAqLworCQkJcGF0dGVybisrOworCisJCQkvKiBJZiBhdCBlbmQgb2YgcGF0dGVybiwgYWNjZXB0IGltbWVkaWF0ZWx5LiAqLworCQkJaWYgKCEqcGF0dGVybikKKwkJCQlyZXR1cm4gMTsKKworCQkJLyogSWYgbmV4dCBjaGFyYWN0ZXIgaW4gcGF0dGVybiBpcyBrbm93biwgb3B0aW1pemUuICovCisJCQlpZiAoKnBhdHRlcm4gIT0gJz8nICYmICpwYXR0ZXJuICE9ICcqJykgeworCQkJCS8qCisJCQkJICogTG9vayBpbnN0YW5jZXMgb2YgdGhlIG5leHQgY2hhcmFjdGVyIGluCisJCQkJICogcGF0dGVybiwgYW5kIHRyeSB0byBtYXRjaCBzdGFydGluZyBmcm9tCisJCQkJICogdGhvc2UuCisJCQkJICovCisJCQkJZm9yICg7ICpzOyBzKyspCisJCQkJCWlmICgqcyA9PSAqcGF0dGVybiAmJgorCQkJCQkgICAgbWF0Y2hfcGF0dGVybihzICsgMSwgcGF0dGVybiArIDEpKQorCQkJCQkJcmV0dXJuIDE7CisJCQkJLyogRmFpbGVkLiAqLworCQkJCXJldHVybiAwOworCQkJfQorCQkJLyoKKwkJCSAqIE1vdmUgYWhlYWQgb25lIGNoYXJhY3RlciBhdCBhIHRpbWUgYW5kIHRyeSB0bworCQkJICogbWF0Y2ggYXQgZWFjaCBwb3NpdGlvbi4KKwkJCSAqLworCQkJZm9yICg7ICpzOyBzKyspCisJCQkJaWYgKG1hdGNoX3BhdHRlcm4ocywgcGF0dGVybikpCisJCQkJCXJldHVybiAxOworCQkJLyogRmFpbGVkLiAqLworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyoKKwkJICogVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgbW9yZSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4KKwkJICogSWYgd2UgYXJlIGF0IHRoZSBlbmQsIGZhaWwuCisJCSAqLworCQlpZiAoISpzKQorCQkJcmV0dXJuIDA7CisKKwkJLyogQ2hlY2sgaWYgdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgaXMgYWNjZXB0YWJsZS4gKi8KKwkJaWYgKCpwYXR0ZXJuICE9ICc/JyAmJiAqcGF0dGVybiAhPSAqcykKKwkJCXJldHVybiAwOworCisJCS8qIE1vdmUgdG8gdGhlIG5leHQgY2hhcmFjdGVyLCBib3RoIGluIHN0cmluZyBhbmQgaW4gcGF0dGVybi4gKi8KKwkJcysrOworCQlwYXR0ZXJuKys7CisJfQorCS8qIE5PVFJFQUNIRUQgKi8KK30KKworLyoKKyAqIFRyaWVzIHRvIG1hdGNoIHRoZSBzdHJpbmcgYWdhaW5zdCB0aGUKKyAqIGNvbW1hLXNlcGFyYXRlZCBzZXF1ZW5jZSBvZiBzdWJwYXR0ZXJucyAoZWFjaCBwb3NzaWJseSBwcmVjZWRlZCBieSAhIHRvCisgKiBpbmRpY2F0ZSBuZWdhdGlvbikuICBSZXR1cm5zIC0xIGlmIG5lZ2F0aW9uIG1hdGNoZXMsIDEgaWYgdGhlcmUgaXMKKyAqIGEgcG9zaXRpdmUgbWF0Y2gsIDAgaWYgdGhlcmUgaXMgbm8gbWF0Y2ggYXQgYWxsLgorICovCisKK2ludAorbWF0Y2hfcGF0dGVybl9saXN0KGNvbnN0IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqcGF0dGVybiwgdV9pbnQgbGVuLAorICAgIGludCBkb2xvd2VyKQoreworCWNoYXIgc3ViWzEwMjRdOworCWludCBuZWdhdGVkOworCWludCBnb3RfcG9zaXRpdmU7CisJdV9pbnQgaSwgc3ViaTsKKworCWdvdF9wb3NpdGl2ZSA9IDA7CisJZm9yIChpID0gMDsgaSA8IGxlbjspIHsKKwkJLyogQ2hlY2sgaWYgdGhlIHN1YnBhdHRlcm4gaXMgbmVnYXRlZC4gKi8KKwkJaWYgKHBhdHRlcm5baV0gPT0gJyEnKSB7CisJCQluZWdhdGVkID0gMTsKKwkJCWkrKzsKKwkJfSBlbHNlCisJCQluZWdhdGVkID0gMDsKKworCQkvKgorCQkgKiBFeHRyYWN0IHRoZSBzdWJwYXR0ZXJuIHVwIHRvIGEgY29tbWEgb3IgZW5kLiAgQ29udmVydCB0aGUKKwkJICogc3VicGF0dGVybiB0byBsb3dlcmNhc2UuCisJCSAqLworCQlmb3IgKHN1YmkgPSAwOworCQkgICAgaSA8IGxlbiAmJiBzdWJpIDwgc2l6ZW9mKHN1YikgLSAxICYmIHBhdHRlcm5baV0gIT0gJywnOworCQkgICAgc3ViaSsrLCBpKyspCisJCQlzdWJbc3ViaV0gPSBkb2xvd2VyICYmIGlzdXBwZXIocGF0dGVybltpXSkgPworCQkJICAgIChjaGFyKXRvbG93ZXIocGF0dGVybltpXSkgOiBwYXR0ZXJuW2ldOworCQkvKiBJZiBzdWJwYXR0ZXJuIHRvbyBsb25nLCByZXR1cm4gZmFpbHVyZSAobm8gbWF0Y2gpLiAqLworCQlpZiAoc3ViaSA+PSBzaXplb2Yoc3ViKSAtIDEpCisJCQlyZXR1cm4gMDsKKworCQkvKiBJZiB0aGUgc3VicGF0dGVybiB3YXMgdGVybWluYXRlZCBieSBhIGNvbW1hLCBza2lwIHRoZSBjb21tYS4gKi8KKwkJaWYgKGkgPCBsZW4gJiYgcGF0dGVybltpXSA9PSAnLCcpCisJCQlpKys7CisKKwkJLyogTnVsbC10ZXJtaW5hdGUgdGhlIHN1YnBhdHRlcm4uICovCisJCXN1YltzdWJpXSA9ICdcMCc7CisKKwkJLyogVHJ5IHRvIG1hdGNoIHRoZSBzdWJwYXR0ZXJuIGFnYWluc3QgdGhlIHN0cmluZy4gKi8KKwkJaWYgKG1hdGNoX3BhdHRlcm4oc3RyaW5nLCBzdWIpKSB7CisJCQlpZiAobmVnYXRlZCkKKwkJCQlyZXR1cm4gLTE7CQkvKiBOZWdhdGl2ZSAqLworCQkJZWxzZQorCQkJCWdvdF9wb3NpdGl2ZSA9IDE7CS8qIFBvc2l0aXZlICovCisJCX0KKwl9CisKKwkvKgorCSAqIFJldHVybiBzdWNjZXNzIGlmIGdvdCBhIHBvc2l0aXZlIG1hdGNoLiAgSWYgdGhlcmUgd2FzIGEgbmVnYXRpdmUKKwkgKiBtYXRjaCwgd2UgaGF2ZSBhbHJlYWR5IHJldHVybmVkIC0xIGFuZCBuZXZlciBnZXQgaGVyZS4KKwkgKi8KKwlyZXR1cm4gZ290X3Bvc2l0aXZlOworfQorCisvKgorICogVHJpZXMgdG8gbWF0Y2ggdGhlIGhvc3QgbmFtZSAod2hpY2ggbXVzdCBiZSBpbiBhbGwgbG93ZXJjYXNlKSBhZ2FpbnN0IHRoZQorICogY29tbWEtc2VwYXJhdGVkIHNlcXVlbmNlIG9mIHN1YnBhdHRlcm5zIChlYWNoIHBvc3NpYmx5IHByZWNlZGVkIGJ5ICEgdG8KKyAqIGluZGljYXRlIG5lZ2F0aW9uKS4gIFJldHVybnMgLTEgaWYgbmVnYXRpb24gbWF0Y2hlcywgMSBpZiB0aGVyZSBpcworICogYSBwb3NpdGl2ZSBtYXRjaCwgMCBpZiB0aGVyZSBpcyBubyBtYXRjaCBhdCBhbGwuCisgKi8KK2ludAorbWF0Y2hfaG9zdG5hbWUoY29uc3QgY2hhciAqaG9zdCwgY29uc3QgY2hhciAqcGF0dGVybiwgdV9pbnQgbGVuKQoreworCXJldHVybiBtYXRjaF9wYXR0ZXJuX2xpc3QoaG9zdCwgcGF0dGVybiwgbGVuLCAxKTsKK30KKworLyoKKyAqIHJldHVybnMgMCBpZiB3ZSBnZXQgYSBuZWdhdGl2ZSBtYXRjaCBmb3IgdGhlIGhvc3RuYW1lIG9yIHRoZSBpcAorICogb3IgaWYgd2UgZ2V0IG5vIG1hdGNoIGF0IGFsbC4gIHJldHVybnMgLTEgb24gZXJyb3IsIG9yIDEgb24KKyAqIHN1Y2Nlc3NmdWwgbWF0Y2guCisgKi8KK2ludAorbWF0Y2hfaG9zdF9hbmRfaXAoY29uc3QgY2hhciAqaG9zdCwgY29uc3QgY2hhciAqaXBhZGRyLAorICAgIGNvbnN0IGNoYXIgKnBhdHRlcm5zKQoreworCWludCBtaG9zdCwgbWlwOworCisJLyogZXJyb3IgaW4gaXBhZGRyIG1hdGNoICovCisJaWYgKChtaXAgPSBhZGRyX21hdGNoX2xpc3QoaXBhZGRyLCBwYXR0ZXJucykpID09IC0yKQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAobWlwID09IC0xKSAvKiBuZWdhdGl2ZSBpcCBhZGRyZXNzIG1hdGNoICovCisJCXJldHVybiAwOworCisJLyogbmVnYXRpdmUgaG9zdG5hbWUgbWF0Y2ggKi8KKwlpZiAoKG1ob3N0ID0gbWF0Y2hfaG9zdG5hbWUoaG9zdCwgcGF0dGVybnMsIHN0cmxlbihwYXR0ZXJucykpKSA9PSAtMSkKKwkJcmV0dXJuIDA7CisJLyogbm8gbWF0Y2ggYXQgYWxsICovCisJaWYgKG1ob3N0ID09IDAgJiYgbWlwID09IDApCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKgorICogbWF0Y2ggdXNlciwgdXNlckBob3N0X29yX2lwLCB1c2VyQGhvc3Rfb3JfaXBfbGlzdCBhZ2FpbnN0IHBhdHRlcm4KKyAqLworaW50CittYXRjaF91c2VyKGNvbnN0IGNoYXIgKnVzZXIsIGNvbnN0IGNoYXIgKmhvc3QsIGNvbnN0IGNoYXIgKmlwYWRkciwKKyAgICBjb25zdCBjaGFyICpwYXR0ZXJuKQoreworCWNoYXIgKnAsICpwYXQ7CisJaW50IHJldDsKKworCWlmICgocCA9IHN0cmNocihwYXR0ZXJuLCdAJykpID09IE5VTEwpCisJCXJldHVybiBtYXRjaF9wYXR0ZXJuKHVzZXIsIHBhdHRlcm4pOworCisJcGF0ID0geHN0cmR1cChwYXR0ZXJuKTsKKwlwID0gc3RyY2hyKHBhdCwgJ0AnKTsKKwkqcCsrID0gJ1wwJzsKKworCWlmICgocmV0ID0gbWF0Y2hfcGF0dGVybih1c2VyLCBwYXQpKSA9PSAxKQorCQlyZXQgPSBtYXRjaF9ob3N0X2FuZF9pcChob3N0LCBpcGFkZHIsIHApOworCXhmcmVlKHBhdCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUmV0dXJucyBmaXJzdCBpdGVtIGZyb20gY2xpZW50LWxpc3QgdGhhdCBpcyBhbHNvIHN1cHBvcnRlZCBieSBzZXJ2ZXItbGlzdCwKKyAqIGNhbGxlciBtdXN0IHhmcmVlKCkgcmV0dXJuZWQgc3RyaW5nLgorICovCisjZGVmaW5lCU1BWF9QUk9QCTQwCisjZGVmaW5lCVNFUAkiLCIKK2NoYXIgKgorbWF0Y2hfbGlzdChjb25zdCBjaGFyICpjbGllbnQsIGNvbnN0IGNoYXIgKnNlcnZlciwgdV9pbnQgKm5leHQpCit7CisJY2hhciAqc3Byb3Bvc2Fsc1tNQVhfUFJPUF07CisJY2hhciAqYywgKnMsICpwLCAqcmV0LCAqY3AsICpzcDsKKwlpbnQgaSwgaiwgbnByb3Bvc2FsczsKKworCWMgPSBjcCA9IHhzdHJkdXAoY2xpZW50KTsKKwlzID0gc3AgPSB4c3RyZHVwKHNlcnZlcik7CisKKwlmb3IgKChwID0gc3Ryc2VwKCZzcCwgU0VQKSksIGk9MDsgcCAmJiAqcCAhPSAnXDAnOworCSAgICAocCA9IHN0cnNlcCgmc3AsIFNFUCkpLCBpKyspIHsKKwkJaWYgKGkgPCBNQVhfUFJPUCkKKwkJCXNwcm9wb3NhbHNbaV0gPSBwOworCQllbHNlCisJCQlicmVhazsKKwl9CisJbnByb3Bvc2FscyA9IGk7CisKKwlmb3IgKChwID0gc3Ryc2VwKCZjcCwgU0VQKSksIGk9MDsgcCAmJiAqcCAhPSAnXDAnOworCSAgICAocCA9IHN0cnNlcCgmY3AsIFNFUCkpLCBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IG5wcm9wb3NhbHM7IGorKykgeworCQkJaWYgKHN0cmNtcChwLCBzcHJvcG9zYWxzW2pdKSA9PSAwKSB7CisJCQkJcmV0ID0geHN0cmR1cChwKTsKKwkJCQlpZiAobmV4dCAhPSBOVUxMKQorCQkJCQkqbmV4dCA9IChjcCA9PSBOVUxMKSA/CisJCQkJCSAgICBzdHJsZW4oYykgOiAodV9pbnQpKGNwIC0gYyk7CisJCQkJeGZyZWUoYyk7CisJCQkJeGZyZWUocyk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCX0KKwlpZiAobmV4dCAhPSBOVUxMKQorCQkqbmV4dCA9IHN0cmxlbihjKTsKKwl4ZnJlZShjKTsKKwl4ZnJlZShzKTsKKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvbWF0Y2guaCBiL29wZW5zc2gtNi4wcDEvbWF0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDdmNzBmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9tYXRjaC5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qICRPcGVuQlNEOiBtYXRjaC5oLHYgMS4xNSAyMDEwLzAyLzI2IDIwOjI5OjU0IGRqbSBFeHAgJCAqLworCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKKyAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCisgKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCisgKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCisgKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCisgKi8KKyNpZm5kZWYgTUFUQ0hfSAorI2RlZmluZSBNQVRDSF9ICisKK2ludAkgbWF0Y2hfcGF0dGVybihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitpbnQJIG1hdGNoX3BhdHRlcm5fbGlzdChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgdV9pbnQsIGludCk7CitpbnQJIG1hdGNoX2hvc3RuYW1lKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB1X2ludCk7CitpbnQJIG1hdGNoX2hvc3RfYW5kX2lwKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworaW50CSBtYXRjaF91c2VyKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitjaGFyCSptYXRjaF9saXN0KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB1X2ludCAqKTsKKworLyogYWRkcm1hdGNoLmMgKi8KK2ludAkgYWRkcl9tYXRjaF9saXN0KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2ludAkgYWRkcl9tYXRjaF9jaWRyX2xpc3QoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL21kLXNoYTI1Ni5jIGIvb3BlbnNzaC02LjBwMS9tZC1zaGEyNTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzFiM2I5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9tZC1zaGEyNTYuYwpAQCAtMCwwICsxLDg2IEBACisvKiAkT3BlbkJTRDogbWQtc2hhMjU2LmMsdiAxLjUgMjAwNi8wOC8wMyAwMzozNDo0MiBkZXJhYWR0IEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1IERhbWllbiBNaWxsZXIgPGRqbUBvcGVuYnNkLm9yZz4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKiBFVlAgd3JhcHBlciBmb3IgU0hBMjU2ICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3Nsdi5oPgorCisjaWYgIWRlZmluZWQoSEFWRV9FVlBfU0hBMjU2KSAmJiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDAwOTA3MDAwTCkKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaWZkZWYgSEFWRV9TSEEyNTZfVVBEQVRFCisjIGlmZGVmIEhBVkVfU0hBMl9ICisjICBpbmNsdWRlIDxzaGEyLmg+CisjIGVsaWYgZGVmaW5lZChIQVZFX0NSWVBUT19TSEEyX0gpCisjICBpbmNsdWRlIDxjcnlwdG8vc2hhMi5oPgorIyBlbmRpZgorI2VuZGlmCisKK2NvbnN0IEVWUF9NRCAqZXZwX3NzaF9zaGEyNTYodm9pZCk7CisKK3N0YXRpYyBpbnQKK3NzaF9zaGEyNTZfaW5pdChFVlBfTURfQ1RYICpjdHh0KQoreworCVNIQTI1Nl9Jbml0KGN0eHQtPm1kX2RhdGEpOworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQKK3NzaF9zaGEyNTZfdXBkYXRlKEVWUF9NRF9DVFggKmN0eHQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCVNIQTI1Nl9VcGRhdGUoY3R4dC0+bWRfZGF0YSwgZGF0YSwgbGVuKTsKKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW50Citzc2hfc2hhMjU2X2ZpbmFsKEVWUF9NRF9DVFggKmN0eHQsIHVuc2lnbmVkIGNoYXIgKmRpZ2VzdCkKK3sKKwlTSEEyNTZfRmluYWwoZGlnZXN0LCBjdHh0LT5tZF9kYXRhKTsKKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW50Citzc2hfc2hhMjU2X2NsZWFudXAoRVZQX01EX0NUWCAqY3R4dCkKK3sKKwltZW1zZXQoY3R4dC0+bWRfZGF0YSwgMCwgc2l6ZW9mKFNIQTI1Nl9DVFgpKTsKKwlyZXR1cm4gKDEpOworfQorCitjb25zdCBFVlBfTUQgKgorZXZwX3NzaF9zaGEyNTYodm9pZCkKK3sKKwlzdGF0aWMgRVZQX01EIHNzaF9zaGEyNTY7CisKKwltZW1zZXQoJnNzaF9zaGEyNTYsIDAsIHNpemVvZihzc2hfc2hhMjU2KSk7CisJc3NoX3NoYTI1Ni50eXBlID0gTklEX3VuZGVmOworCXNzaF9zaGEyNTYubWRfc2l6ZSA9IFNIQTI1Nl9ESUdFU1RfTEVOR1RIOworCXNzaF9zaGEyNTYuaW5pdCA9IHNzaF9zaGEyNTZfaW5pdDsKKwlzc2hfc2hhMjU2LnVwZGF0ZSA9IHNzaF9zaGEyNTZfdXBkYXRlOworCXNzaF9zaGEyNTYuZmluYWwgPSBzc2hfc2hhMjU2X2ZpbmFsOworCXNzaF9zaGEyNTYuY2xlYW51cCA9IHNzaF9zaGEyNTZfY2xlYW51cDsKKwlzc2hfc2hhMjU2LmJsb2NrX3NpemUgPSBTSEEyNTZfQkxPQ0tfTEVOR1RIOworCXNzaF9zaGEyNTYuY3R4X3NpemUgPSBzaXplb2YoU0hBMjU2X0NUWCk7CisKKwlyZXR1cm4gKCZzc2hfc2hhMjU2KTsKK30KKworI2VuZGlmIC8qICFkZWZpbmVkKEhBVkVfRVZQX1NIQTI1NikgJiYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwNzAwMEwpICovCisKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvbWQ1Y3J5cHQuYyBiL29wZW5zc2gtNi4wcDEvbWQ1Y3J5cHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmVmOTg5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9tZDVjcnlwdC5jCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIlRIRSBCRUVSLVdBUkUgTElDRU5TRSIgKFJldmlzaW9uIDQyKToKKyAqIDxwaGtAbG9naW4uZGtuZXQuZGs+IHdyb3RlIHRoaXMgZmlsZS4gIEFzIGxvbmcgYXMgeW91IHJldGFpbiB0aGlzCisgKiBub3RpY2UgeW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgc3R1ZmYuIElmIHdlIG1lZXQgc29tZQorICogZGF5LCBhbmQgeW91IHRoaW5rIHRoaXMgc3R1ZmYgaXMgd29ydGggaXQsIHlvdSBjYW4gYnV5IG1lIGEgYmVlciBpbgorICogcmV0dXJuLiAgIFBvdWwtSGVubmluZyBLYW1wCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpZiBkZWZpbmVkKEhBVkVfTUQ1X1BBU1NXT1JEUykgJiYgIWRlZmluZWQoSEFWRV9NRDVfQ1JZUFQpCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CisKKy8qIDAgLi4uIDYzID0+IGFzY2lpIC0gNjQgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGl0b2E2NFtdID0KKyAgICAiLi8wMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisKK3N0YXRpYyBjaGFyICptYWdpYyA9ICIkMSQiOworCitzdGF0aWMgY2hhciAqCit0bzY0KHVuc2lnbmVkIGxvbmcgdiwgaW50IG4pCit7CisJc3RhdGljIGNoYXIgYnVmWzVdOworCWNoYXIgKnMgPSBidWY7CisKKwlpZiAobiA+IDQpCisJCXJldHVybiAoTlVMTCk7CisKKwltZW1zZXQoYnVmLCAnXDAnLCBzaXplb2YoYnVmKSk7CisJd2hpbGUgKC0tbiA+PSAwKSB7CisJCSpzKysgPSBpdG9hNjRbdiYweDNmXTsKKwkJdiA+Pj0gNjsKKwl9CisKKwlyZXR1cm4gKGJ1Zik7Cit9CisKK2ludAoraXNfbWQ1X3NhbHQoY29uc3QgY2hhciAqc2FsdCkKK3sKKwlyZXR1cm4gKHN0cm5jbXAoc2FsdCwgbWFnaWMsIHN0cmxlbihtYWdpYykpID09IDApOworfQorCitjaGFyICoKK21kNV9jcnlwdChjb25zdCBjaGFyICpwdywgY29uc3QgY2hhciAqc2FsdCkKK3sKKwlzdGF0aWMgY2hhciBwYXNzd2RbMTIwXSwgc2FsdF9jb3B5WzldLCAqcDsKKwlzdGF0aWMgY29uc3QgY2hhciAqc3AsICplcDsKKwl1bnNpZ25lZCBjaGFyIGZpbmFsWzE2XTsKKwlpbnQgc2wsIHBsLCBpLCBqOworCU1ENV9DVFgJY3R4LCBjdHgxOworCXVuc2lnbmVkIGxvbmcgbDsKKworCS8qIFJlZmluZSB0aGUgU2FsdCBmaXJzdCAqLworCXNwID0gc2FsdDsKKworCS8qIElmIGl0IHN0YXJ0cyB3aXRoIHRoZSBtYWdpYyBzdHJpbmcsIHRoZW4gc2tpcCB0aGF0ICovCisJaWYoc3RybmNtcChzcCwgbWFnaWMsIHN0cmxlbihtYWdpYykpID09IDApCisJCXNwICs9IHN0cmxlbihtYWdpYyk7CisKKwkvKiBJdCBzdG9wcyBhdCB0aGUgZmlyc3QgJyQnLCBtYXggOCBjaGFycyAqLworCWZvciAoZXAgPSBzcDsgKmVwICE9ICckJzsgZXArKykgeworCQlpZiAoKmVwID09ICdcMCcgfHwgZXAgPj0gKHNwICsgOCkpCisJCQlyZXR1cm4gKE5VTEwpOworCX0KKworCS8qIGdldCB0aGUgbGVuZ3RoIG9mIHRoZSB0cnVlIHNhbHQgKi8KKwlzbCA9IGVwIC0gc3A7CisKKwkvKiBTdGFzaCB0aGUgc2FsdCAqLworCW1lbWNweShzYWx0X2NvcHksIHNwLCBzbCk7CisJc2FsdF9jb3B5W3NsXSA9ICdcMCc7CisKKwlNRDVfSW5pdCgmY3R4KTsKKworCS8qIFRoZSBwYXNzd29yZCBmaXJzdCwgc2luY2UgdGhhdCBpcyB3aGF0IGlzIG1vc3QgdW5rbm93biAqLworCU1ENV9VcGRhdGUoJmN0eCwgcHcsIHN0cmxlbihwdykpOworCisJLyogVGhlbiBvdXIgbWFnaWMgc3RyaW5nICovCisJTUQ1X1VwZGF0ZSgmY3R4LCBtYWdpYywgc3RybGVuKG1hZ2ljKSk7CisKKwkvKiBUaGVuIHRoZSByYXcgc2FsdCAqLworCU1ENV9VcGRhdGUoJmN0eCwgc3AsIHNsKTsKKworCS8qIFRoZW4ganVzdCBhcyBtYW55IGNoYXJhY3RlcnMgb2YgdGhlIE1ENShwdywgc2FsdCwgcHcpICovCisJTUQ1X0luaXQoJmN0eDEpOworCU1ENV9VcGRhdGUoJmN0eDEsIHB3LCBzdHJsZW4ocHcpKTsKKwlNRDVfVXBkYXRlKCZjdHgxLCBzcCwgc2wpOworCU1ENV9VcGRhdGUoJmN0eDEsIHB3LCBzdHJsZW4ocHcpKTsKKwlNRDVfRmluYWwoZmluYWwsICZjdHgxKTsKKworCWZvcihwbCA9IHN0cmxlbihwdyk7IHBsID4gMDsgcGwgLT0gMTYpCisJCU1ENV9VcGRhdGUoJmN0eCwgZmluYWwsIHBsID4gMTYgPyAxNiA6IHBsKTsKKworCS8qIERvbid0IGxlYXZlIGFueXRoaW5nIGFyb3VuZCBpbiB2bSB0aGV5IGNvdWxkIHVzZS4gKi8KKwltZW1zZXQoZmluYWwsICdcMCcsIHNpemVvZiBmaW5hbCk7CisKKwkvKiBUaGVuIHNvbWV0aGluZyByZWFsbHkgd2VpcmQuLi4gKi8KKwlmb3IgKGogPSAwLCBpID0gc3RybGVuKHB3KTsgaSAhPSAwOyBpID4+PSAxKQorCQlpZiAoaSAmIDEpCisJCQlNRDVfVXBkYXRlKCZjdHgsIGZpbmFsICsgaiwgMSk7CisJCWVsc2UKKwkJCU1ENV9VcGRhdGUoJmN0eCwgcHcgKyBqLCAxKTsKKworCS8qIE5vdyBtYWtlIHRoZSBvdXRwdXQgc3RyaW5nICovCisJc25wcmludGYocGFzc3dkLCBzaXplb2YocGFzc3dkKSwgIiVzJXMkIiwgbWFnaWMsIHNhbHRfY29weSk7CisKKwlNRDVfRmluYWwoZmluYWwsICZjdHgpOworCisJLyoKKwkgKiBhbmQgbm93LCBqdXN0IHRvIG1ha2Ugc3VyZSB0aGluZ3MgZG9uJ3QgcnVuIHRvbyBmYXN0CisJICogT24gYSA2MCBNaHogUGVudGl1bSB0aGlzIHRha2VzIDM0IG1zZWMsIHNvIHlvdSB3b3VsZAorCSAqIG5lZWQgMzAgc2Vjb25kcyB0byBidWlsZCBhIDEwMDAgZW50cnkgZGljdGlvbmFyeS4uLgorCSAqLworCWZvcihpID0gMDsgaSA8IDEwMDA7IGkrKykgeworCQlNRDVfSW5pdCgmY3R4MSk7CisJCWlmIChpICYgMSkKKwkJCU1ENV9VcGRhdGUoJmN0eDEsIHB3LCBzdHJsZW4ocHcpKTsKKwkJZWxzZQorCQkJTUQ1X1VwZGF0ZSgmY3R4MSwgZmluYWwsIDE2KTsKKworCQlpZiAoaSAlIDMpCisJCQlNRDVfVXBkYXRlKCZjdHgxLCBzcCwgc2wpOworCisJCWlmIChpICUgNykKKwkJCU1ENV9VcGRhdGUoJmN0eDEsIHB3LCBzdHJsZW4ocHcpKTsKKworCQlpZiAoaSAmIDEpCisJCQlNRDVfVXBkYXRlKCZjdHgxLCBmaW5hbCwgMTYpOworCQllbHNlCisJCQlNRDVfVXBkYXRlKCZjdHgxLCBwdywgc3RybGVuKHB3KSk7CisKKwkJTUQ1X0ZpbmFsKGZpbmFsLCAmY3R4MSk7CisJfQorCisJcCA9IHBhc3N3ZCArIHN0cmxlbihwYXNzd2QpOworCisJbCA9IChmaW5hbFsgMF08PDE2KSB8IChmaW5hbFsgNl08PDgpIHwgZmluYWxbMTJdOworCXN0cmxjYXQocGFzc3dkLCB0bzY0KGwsIDQpLCBzaXplb2YocGFzc3dkKSk7CisJbCA9IChmaW5hbFsgMV08PDE2KSB8IChmaW5hbFsgN108PDgpIHwgZmluYWxbMTNdOworCXN0cmxjYXQocGFzc3dkLCB0bzY0KGwsIDQpLCBzaXplb2YocGFzc3dkKSk7CisJbCA9IChmaW5hbFsgMl08PDE2KSB8IChmaW5hbFsgOF08PDgpIHwgZmluYWxbMTRdOworCXN0cmxjYXQocGFzc3dkLCB0bzY0KGwsIDQpLCBzaXplb2YocGFzc3dkKSk7CisJbCA9IChmaW5hbFsgM108PDE2KSB8IChmaW5hbFsgOV08PDgpIHwgZmluYWxbMTVdOworCXN0cmxjYXQocGFzc3dkLCB0bzY0KGwsIDQpLCBzaXplb2YocGFzc3dkKSk7CisJbCA9IChmaW5hbFsgNF08PDE2KSB8IChmaW5hbFsxMF08PDgpIHwgZmluYWxbIDVdOworCXN0cmxjYXQocGFzc3dkLCB0bzY0KGwsIDQpLCBzaXplb2YocGFzc3dkKSk7CisJbCA9ICAgICAgICAgICAgICAgICAgICBmaW5hbFsxMV0gICAgICAgICAgICAgICAgOworCXN0cmxjYXQocGFzc3dkLCB0bzY0KGwsIDIpLCBzaXplb2YocGFzc3dkKSk7CisKKwkvKiBEb24ndCBsZWF2ZSBhbnl0aGluZyBhcm91bmQgaW4gdm0gdGhleSBjb3VsZCB1c2UuICovCisJbWVtc2V0KGZpbmFsLCAwLCBzaXplb2YoZmluYWwpKTsKKwltZW1zZXQoc2FsdF9jb3B5LCAwLCBzaXplb2Yoc2FsdF9jb3B5KSk7CisJbWVtc2V0KCZjdHgsIDAsIHNpemVvZihjdHgpKTsKKwltZW1zZXQoJmN0eDEsIDAsIHNpemVvZihjdHgxKSk7CisJKHZvaWQpdG82NCgwLCA0KTsKKworCXJldHVybiAocGFzc3dkKTsKK30KKworI2VuZGlmIC8qIGRlZmluZWQoSEFWRV9NRDVfUEFTU1dPUkRTKSAmJiAhZGVmaW5lZChIQVZFX01ENV9DUllQVCkgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvbWQ1Y3J5cHQuaCBiL29wZW5zc2gtNi4wcDEvbWQ1Y3J5cHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzQxZTJjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9tZDVjcnlwdC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAiVEhFIEJFRVItV0FSRSBMSUNFTlNFIiAoUmV2aXNpb24gNDIpOgorICogPHBoa0Bsb2dpbi5ka25ldC5kaz4gd3JvdGUgdGhpcyBmaWxlLiAgQXMgbG9uZyBhcyB5b3UgcmV0YWluIHRoaXMgbm90aWNlIHlvdQorICogY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBzdHVmZi4gSWYgd2UgbWVldCBzb21lIGRheSwgYW5kIHlvdSB0aGluaworICogdGhpcyBzdHVmZiBpcyB3b3J0aCBpdCwgeW91IGNhbiBidXkgbWUgYSBiZWVyIGluIHJldHVybi4gICBQb3VsLUhlbm5pbmcgS2FtcAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qICRJZDogbWQ1Y3J5cHQuaCx2IDEuNCAyMDAzLzA1LzE4IDE0OjQ2OjQ2IGRqbSBFeHAgJCAqLworCisjaWZuZGVmIF9NRDVDUllQVF9ICisjZGVmaW5lIF9NRDVDUllQVF9ICisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIGRlZmluZWQoSEFWRV9NRDVfUEFTU1dPUkRTKSAmJiAhZGVmaW5lZChIQVZFX01ENV9DUllQVCkKKworaW50IGlzX21kNV9zYWx0KGNvbnN0IGNoYXIgKik7CitjaGFyICptZDVfY3J5cHQoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCisjZW5kaWYgLyogZGVmaW5lZChIQVZFX01ENV9QQVNTV09SRFMpICYmICFkZWZpbmVkKEhBVkVfTUQ1X0NSWVBUKSAqLworCisjZW5kaWYgLyogTUQ1Q1JZUFRfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9tZG9jMm1hbi5hd2sgYi9vcGVuc3NoLTYuMHAxL21kb2MybWFuLmF3awpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGU4ZDVmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9tZG9jMm1hbi5hd2sKQEAgLTAsMCArMSwzNzAgQEAKKyMhL3Vzci9iaW4vYXdrCisjCisjICRJZDogbWRvYzJtYW4uYXdrLHYgMS45IDIwMDkvMTAvMjQgMDA6NTI6NDIgZHR1Y2tlciBFeHAgJAorIworIyBWZXJzaW9uIGhpc3Rvcnk6CisjICB2NCsgQWRhcHRlZCBmb3IgT3BlblNTSCBQb3J0YWJsZSAoc2VlIGN2cyBJZCBhbmQgaGlzdG9yeSkKKyMgIHYzLCBJIHB1dCB0aGUgcHJvZ3JhbSB1bmRlciBhIHByb3BlciBsaWNlbnNlCisjICAgICAgRGFuIE5lbHNvbiA8ZG5lbHNvbkBhbGxhbnRncm91cC5jb20+IGFkZGVkIC5BbiwgLkFxIGFuZCBmaXhlZCBhIHR5cG8KKyMgIHYyLCBmaXhlZCB0byB3b3JrIG9uIEdOVSBhd2sgLS1wb3NpeCBhbmQgTWFjT1MgWAorIyAgdjEsIGZpcnN0IGF0dGVtcHQsIGRpZG4ndCB3b3JrIG9uIE1hY09TIFgKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDAzIFBldGVyIFN0dWdlIDxzdHVnZS1tZG9jMm1hbkBjZHkub3JnPgorIworIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyMgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorIyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorIyBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisjIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorIyBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorIyBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisKK0JFR0lOIHsKKyAgb3B0bGlzdD0wCisgIG9sZG9wdGxpc3Q9MAorICBub3NwYWNlPTAKKyAgc3lub3BzaXM9MAorICByZWZlcmVuY2U9MAorICBibG9jaz0wCisgIGV4dD0wCisgIGV4dG9wdD0wCisgIGxpdGVyYWw9MAorICBwcmVubD0wCisgIGJyZWFrdz0wCisgIGxpbmU9IiIKK30KKworZnVuY3Rpb24gd3RhaWwoKSB7CisgIHJldHZhbD0iIgorICB3aGlsZSh3PG53b3JkcykgeworICAgIGlmKGxlbmd0aChyZXR2YWwpKQorICAgICAgcmV0dmFsPXJldHZhbCBPRlMKKyAgICByZXR2YWw9cmV0dmFsIHdvcmRzWysrd10KKyAgfQorICByZXR1cm4gcmV0dmFsCit9CisKK2Z1bmN0aW9uIGFkZChzdHIpIHsKKyAgZm9yKDtwcmVubDtwcmVubC0tKQorICAgIGxpbmU9bGluZSAiXG4iCisgIGxpbmU9bGluZSBzdHIKK30KKworISAvXlwuLyB7CisgIGZvcig7cHJlbmw7cHJlbmwtLSkKKyAgICBwcmludCAiIgorICBwcmludAorICBpZihsaXRlcmFsKQorICAgIHByaW50ICIuYnIiCisgIG5leHQKK30KKworL15cLlxcIi8geyBuZXh0IH0KKworeworICBvcHRpb249MAorICBwYXJlbnM9MAorICBhbmdsZXM9MAorICBzdWIoIl5cXC4iLCIiKQorICBud29yZHM9c3BsaXQoJDAsd29yZHMpCisgIGZvcih3PTE7dzw9bndvcmRzO3crKykgeworICAgIHNraXA9MAorICAgIGlmKG1hdGNoKHdvcmRzW3ddLCJeTGl8UGYkIikpIHsKKyAgICAgIHNraXA9MQorICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXlhvJCIpKSB7CisgICAgICBza2lwPTEKKyAgICAgIGV4dD0xCisgICAgICBpZihsZW5ndGgobGluZSkmJiEobWF0Y2gobGluZSwiICQiKXx8cHJlbmwpKQorCWFkZChPRlMpCisgICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeWGMkIikpIHsKKyAgICAgIHNraXA9MQorICAgICAgZXh0PTAKKyAgICAgIGlmKCFleHRvcHQpCisJcHJlbmwrKworICAgICAgdz1ud29yZHMKKyAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5CZCQiKSkgeworICAgICAgc2tpcD0xCisgICAgICBpZihtYXRjaCh3b3Jkc1t3KzFdLCItbGl0ZXJhbCIpKSB7CisJbGl0ZXJhbD0xCisJcHJlbmwrKworCXc9bndvcmRzCisgICAgICB9CisgICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeRWQkIikpIHsKKyAgICAgIHNraXA9MQorICAgICAgbGl0ZXJhbD0wCisgICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeTnMkIikpIHsKKyAgICAgIHNraXA9MQorICAgICAgaWYoIW5vc3BhY2UpCisJbm9zcGFjZT0xCisgICAgICBzdWIoIiAkIiwiIixsaW5lKQorICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXk5vJCIpKSB7CisgICAgICBza2lwPTEKKyAgICAgIHN1YigiICQiLCIiLGxpbmUpCisgICAgICBhZGQod29yZHNbKyt3XSkKKyAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5EcSQiKSkgeworICAgICAgc2tpcD0xCisgICAgICBhZGQoImBgIikKKyAgICAgIGFkZCh3b3Jkc1srK3ddKQorICAgICAgd2hpbGUodzxud29yZHMmJiFtYXRjaCh3b3Jkc1t3KzFdLCJeW1xcLixdIikpCisJYWRkKE9GUyB3b3Jkc1srK3ddKQorICAgICAgYWRkKCInJyIpCisgICAgICBpZighbm9zcGFjZSYmbWF0Y2god29yZHNbdysxXSwiXltcXC4sXSIpKQorCW5vc3BhY2U9MQorICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXlNxfFFsJCIpKSB7CisgICAgICBza2lwPTEKKyAgICAgIGFkZCgiYCIgd29yZHNbKyt3XSAiJyIpCisgICAgICBpZighbm9zcGFjZSYmbWF0Y2god29yZHNbdysxXSwiXltcXC4sXSIpKQorCW5vc3BhY2U9MQorICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXk9vJCIpKSB7CisgICAgICBza2lwPTEKKyAgICAgIGV4dG9wdD0xCisgICAgICBpZighbm9zcGFjZSkKKwlub3NwYWNlPTEKKyAgICAgIGFkZCgiWyIpCisgICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeT2MkIikpIHsKKyAgICAgIHNraXA9MQorICAgICAgZXh0b3B0PTAKKyAgICAgIGFkZCgiXSIpCisgICAgfQorICAgIGlmKCFza2lwKSB7CisgICAgICBpZighbm9zcGFjZSYmbGVuZ3RoKGxpbmUpJiYhKG1hdGNoKGxpbmUsIiAkIil8fHByZW5sKSkKKwlhZGQoT0ZTKQorICAgICAgaWYobm9zcGFjZT09MSkKKwlub3NwYWNlPTAKKyAgICB9CisgICAgaWYobWF0Y2god29yZHNbd10sIl5EZCQiKSkgeworICAgICAgaWYobWF0Y2god29yZHNbdysxXSwiXlxcJE1kb2NkYXRlOiIpKSB7CisgICAgICAgIHcrKzsKKyAgICAgICAgaWYobWF0Y2god29yZHNbdys0XSwiXlxcJCQiKSkgeworICAgICAgICAgIHdvcmRzW3crNF0gPSAiIgorICAgICAgICB9CisgICAgICB9CisgICAgICBkYXRlPXd0YWlsKCkKKyAgICAgIG5leHQKKyAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5EdCQiKSkgeworICAgICAgaWQ9d3RhaWwoKQorICAgICAgbmV4dAorICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXlV4JCIpKSB7CisgICAgICBhZGQoIlVOSVgiKQorICAgICAgc2tpcD0xCisgICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeT3gkIikpIHsKKyAgICAgIGFkZCgiT3BlbkJTRCIpCisgICAgICBza2lwPTEKKyAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5PcyQiKSkgeworICAgICAgYWRkKCIuVEggIiBpZCAiIFwiIiBkYXRlICJcIiBcIiIgd3RhaWwoKSAiXCIiKQorICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXlNoJCIpKSB7CisgICAgICBhZGQoIi5TSCIpCisgICAgICBzeW5vcHNpcz1tYXRjaCh3b3Jkc1t3KzFdLCJTWU5PUFNJUyIpCisgICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeWHIkIikpIHsKKyAgICAgIGFkZCgiXFxmQiIgd29yZHNbKyt3XSAiXFxmUCgiIHdvcmRzWysrd10gIikiIHdvcmRzWysrd10pCisgICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeUnMkIikpIHsKKyAgICAgIHNwbGl0KCIiLHJlZmF1dGhvcnMpCisgICAgICBucmVmYXV0aG9ycz0wCisgICAgICByZWZ0aXRsZT0iIgorICAgICAgcmVmaXNzdWU9IiIKKyAgICAgIHJlZmRhdGU9IiIKKyAgICAgIHJlZm9wdD0iIgorICAgICAgcmVmcmVwb3J0PSIiCisgICAgICByZWZlcmVuY2U9MQorICAgICAgbmV4dAorICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXlJlJCIpKSB7CisgICAgICBwcmVubCsrCisgICAgICBmb3IoaT1ucmVmYXV0aG9ycy0xO2k+MDtpLS0pIHsKKwlhZGQocmVmYXV0aG9yc1tpXSkKKwlpZihpPjEpCisJICBhZGQoIiwgIikKKyAgICAgIH0KKyAgICAgIGlmKG5yZWZhdXRob3JzPjEpCisJYWRkKCIgYW5kICIpCisgICAgICBpZihucmVmYXV0aG9ycz4wKQorICAgICAgICBhZGQocmVmYXV0aG9yc1swXSAiLCAiKQorICAgICAgYWRkKCJcXGZJIiByZWZ0aXRsZSAiXFxmUCIpCisgICAgICBpZihsZW5ndGgocmVmaXNzdWUpKQorCWFkZCgiLCAiIHJlZmlzc3VlKQorICAgICAgaWYobGVuZ3RoKHJlZnJlcG9ydCkpIHsKKwlhZGQoIiwgIiByZWZyZXBvcnQpCisgICAgICB9CisgICAgICBpZihsZW5ndGgocmVmZGF0ZSkpCisJYWRkKCIsICIgcmVmZGF0ZSkKKyAgICAgIGlmKGxlbmd0aChyZWZvcHQpKQorCWFkZCgiLCAiIHJlZm9wdCkKKyAgICAgIGFkZCgiLiIpCisgICAgICByZWZlcmVuY2U9MAorICAgIH0gZWxzZSBpZihyZWZlcmVuY2UpIHsKKyAgICAgIGlmKG1hdGNoKHdvcmRzW3ddLCJeJUEkIikpIHsgcmVmYXV0aG9yc1tucmVmYXV0aG9ycysrXT13dGFpbCgpIH0KKyAgICAgIGlmKG1hdGNoKHdvcmRzW3ddLCJeJVQkIikpIHsKKwlyZWZ0aXRsZT13dGFpbCgpCisJc3ViKCJeXCIiLCIiLHJlZnRpdGxlKQorCXN1YigiXCIkIiwiIixyZWZ0aXRsZSkKKyAgICAgIH0KKyAgICAgIGlmKG1hdGNoKHdvcmRzW3ddLCJeJU4kIikpIHsgcmVmaXNzdWU9d3RhaWwoKSB9CisgICAgICBpZihtYXRjaCh3b3Jkc1t3XSwiXiVEJCIpKSB7IHJlZmRhdGU9d3RhaWwoKSB9CisgICAgICBpZihtYXRjaCh3b3Jkc1t3XSwiXiVPJCIpKSB7IHJlZm9wdD13dGFpbCgpIH0KKyAgICAgIGlmKG1hdGNoKHdvcmRzW3ddLCJeJVIkIikpIHsgcmVmcmVwb3J0PXd0YWlsKCkgfQorICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXk5tJCIpKSB7CisgICAgICBpZihzeW5vcHNpcykgeworCWFkZCgiLmJyIikKKwlwcmVubCsrCisgICAgICB9CisgICAgICBuPXdvcmRzWysrd10KKyAgICAgIGlmKCFsZW5ndGgobmFtZSkpCisJbmFtZT1uCisgICAgICBpZighbGVuZ3RoKG4pKQorCW49bmFtZQorICAgICAgYWRkKCJcXGZCIiBuICJcXGZQIikKKyAgICAgIGlmKCFub3NwYWNlJiZtYXRjaCh3b3Jkc1t3KzFdLCJeW1xcLixdIikpCisJbm9zcGFjZT0xCisgICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeTmQkIikpIHsKKyAgICAgIGFkZCgiXFwtICIgd3RhaWwoKSkKKyAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5GbCQiKSkgeworICAgICAgYWRkKCJcXGZCXFwtIiB3b3Jkc1srK3ddICJcXGZQIikKKyAgICAgIGlmKCFub3NwYWNlJiZtYXRjaCh3b3Jkc1t3KzFdLCJeW1xcLixdIikpCisJbm9zcGFjZT0xCisgICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeQXIkIikpIHsKKyAgICAgIGFkZCgiXFxmSSIpCisgICAgICBpZih3PT1ud29yZHMpCisJYWRkKCJmaWxlIC4uLlxcZlAiKQorICAgICAgZWxzZSB7CisJYWRkKHdvcmRzWysrd10gIlxcZlAiKQorCXdoaWxlKG1hdGNoKHdvcmRzW3crMV0sIl5cXHwkIikpCisJICBhZGQoT0ZTIHdvcmRzWysrd10gIiBcXGZJIiB3b3Jkc1srK3ddICJcXGZQIikKKyAgICAgIH0KKyAgICAgIGlmKCFub3NwYWNlJiZtYXRjaCh3b3Jkc1t3KzFdLCJeW1xcLixdIikpCisJbm9zcGFjZT0xCisgICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeQ20kIikpIHsKKyAgICAgIGFkZCgiXFxmQiIgd29yZHNbKyt3XSAiXFxmUCIpCisgICAgICB3aGlsZSh3PG53b3JkcyYmbWF0Y2god29yZHNbdysxXSwiXltcXC4sOjspXSIpKQorCWFkZCh3b3Jkc1srK3ddKQorICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXk9wJCIpKSB7CisgICAgICBvcHRpb249MQorICAgICAgaWYoIW5vc3BhY2UpCisJbm9zcGFjZT0xCisgICAgICBhZGQoIlsiKQorICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXlBwJCIpKSB7CisgICAgICBwcmVubCsrCisgICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeQW4kIikpIHsKKyAgICAgIHByZW5sKysKKyAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5TcyQiKSkgeworICAgICAgYWRkKCIuU1MiKQorICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXlBhJCIpJiYhb3B0aW9uKSB7CisgICAgICBhZGQoIlxcZkkiKQorICAgICAgdysrCisgICAgICBpZihtYXRjaCh3b3Jkc1t3XSwiXlxcLiIpKQorCWFkZCgiXFwmIikKKyAgICAgIGFkZCh3b3Jkc1t3XSAiXFxmUCIpCisgICAgICB3aGlsZSh3PG53b3JkcyYmbWF0Y2god29yZHNbdysxXSwiXltcXC4sOjspXSIpKQorCWFkZCh3b3Jkc1srK3ddKQorICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXkR2JCIpKSB7CisgICAgICBhZGQoIi5CUiIpCisgICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeRW18RXYkIikpIHsKKyAgICAgIGFkZCgiLklSIikKKyAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5QcSQiKSkgeworICAgICAgYWRkKCIoIikKKyAgICAgIG5vc3BhY2U9MQorICAgICAgcGFyZW5zPTEKKyAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5BcSQiKSkgeworICAgICAgYWRkKCI8IikKKyAgICAgIG5vc3BhY2U9MQorICAgICAgYW5nbGVzPTEKKyAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5TW3h5XSQiKSkgeworICAgICAgYWRkKCIuQiAiIHd0YWlsKCkpCisgICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeSWMkIikpIHsKKyAgICAgIHBsYWluPTEKKyAgICAgIGFkZCgiXFxmQiIpCisgICAgICB3aGlsZSh3PG53b3JkcykgeworCXcrKworCWlmKG1hdGNoKHdvcmRzW3ddLCJeT3AkIikpIHsKKwkgIHcrKworCSAgYWRkKCJbIikKKwkgIHdvcmRzW253b3Jkc109d29yZHNbbndvcmRzXSAiXSIKKwl9CisJaWYobWF0Y2god29yZHNbd10sIl5BciQiKSkgeworCSAgYWRkKCJcXGZJIiB3b3Jkc1srK3ddICJcXGZQIikKKwl9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5bXFwuLF0iKSkgeworCSAgc3ViKCIgJCIsIiIsbGluZSkKKwkgIGlmKHBsYWluKSB7CisJICAgIGFkZCgiXFxmUCIpCisJICAgIHBsYWluPTAKKwkgIH0KKwkgIGFkZCh3b3Jkc1t3XSkKKwl9IGVsc2UgeworCSAgaWYoIXBsYWluKSB7CisJICAgIGFkZCgiXFxmQiIpCisJICAgIHBsYWluPTEKKwkgIH0KKwkgIGFkZCh3b3Jkc1t3XSkKKwl9CisJaWYoIW5vc3BhY2UpCisJICBhZGQoT0ZTKQorICAgICAgfQorICAgICAgc3ViKCIgJCIsIiIsbGluZSkKKyAgICAgIGlmKHBsYWluKQorCWFkZCgiXFxmUCIpCisgICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeQmwkIikpIHsKKyAgICAgIG9sZG9wdGxpc3Q9b3B0bGlzdAorICAgICAgaWYobWF0Y2god29yZHNbdysxXSwiLWJ1bGxldCIpKQorCW9wdGxpc3Q9MQorICAgICAgZWxzZSBpZihtYXRjaCh3b3Jkc1t3KzFdLCItZW51bSIpKSB7CisJb3B0bGlzdD0yCisJZW51bT0wCisgICAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbdysxXSwiLXRhZyIpKQorCW9wdGxpc3Q9MworICAgICAgZWxzZSBpZihtYXRjaCh3b3Jkc1t3KzFdLCItaXRlbSIpKQorCW9wdGxpc3Q9NAorICAgICAgZWxzZSBpZihtYXRjaCh3b3Jkc1t3KzFdLCItYnVsbGV0IikpCisJb3B0bGlzdD0xCisgICAgICB3PW53b3JkcworICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXkVsJCIpKSB7CisgICAgICBvcHRsaXN0PW9sZG9wdGxpc3QKKyAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5CayQiKSkgeworICAgICAgaWYobWF0Y2god29yZHNbdysxXSwiLXdvcmRzIikpIHsKKwl3KysKKwlicmVha3c9MQorICAgICAgfQorICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXkVrJCIpKSB7CisgICAgICBicmVha3c9MAorICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXkl0JCIpJiZvcHRsaXN0KSB7CisgICAgICBpZihvcHRsaXN0PT0xKQorCWFkZCgiLklQIFxcKGJ1IikKKyAgICAgIGVsc2UgaWYob3B0bGlzdD09MikKKwlhZGQoIi5JUCAiICsrZW51bSAiLiIpCisgICAgICBlbHNlIGlmKG9wdGxpc3Q9PTMpIHsKKwlhZGQoIi5UUCIpCisJcHJlbmwrKworCWlmKG1hdGNoKHdvcmRzW3crMV0sIl5QYSR8XkV2JCIpKSB7CisJICBhZGQoIi5CIikKKwkgIHcrKworCX0KKyAgICAgIH0gZWxzZSBpZihvcHRsaXN0PT00KQorCWFkZCgiLklQIikKKyAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5TbSQiKSkgeworICAgICAgaWYobWF0Y2god29yZHNbdysxXSwib2ZmIikpCisJbm9zcGFjZT0yCisgICAgICBlbHNlIGlmKG1hdGNoKHdvcmRzW3crMV0sIm9uIikpCisJbm9zcGFjZT0wCisgICAgICB3KysKKyAgICB9IGVsc2UgaWYoIXNraXApIHsKKyAgICAgIGFkZCh3b3Jkc1t3XSkKKyAgICB9CisgIH0KKyAgaWYobWF0Y2gobGluZSwiXlxcLlteYS16QS1aXSIpKQorICAgIHN1YigiXlxcLiIsIiIsbGluZSkKKyAgaWYocGFyZW5zKQorICAgIGFkZCgiKSIpCisgIGlmKGFuZ2xlcykKKyAgICBhZGQoIj4iKQorICBpZihvcHRpb24pCisgICAgYWRkKCJdIikKKyAgaWYoZXh0JiYhZXh0b3B0JiYhbWF0Y2gobGluZSwiICQiKSkKKyAgICBhZGQoT0ZTKQorICBpZighZXh0JiYhZXh0b3B0JiZsZW5ndGgobGluZSkpIHsKKyAgICBwcmludCBsaW5lCisgICAgcHJlbmw9MAorICAgIGxpbmU9IiIKKyAgfQorfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9taXNjLmMgYi9vcGVuc3NoLTYuMHAxL21pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2EyM2RjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9taXNjLmMKQEAgLTAsMCArMSwxMDExIEBACisvKiAkT3BlbkJTRDogbWlzYy5jLHYgMS44NiAyMDExLzA5LzA1IDA1OjU5OjA4IGRqbSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwyMDA2IERhbWllbiBNaWxsZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW5fc3lzdG0uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2lmZGVmIEhBVkVfUEFUSFNfSAorIyBpbmNsdWRlIDxwYXRocy5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2VuZGlmCisjaWZkZWYgU1NIX1RVTl9PUEVOQlNECisjaW5jbHVkZSA8bmV0L2lmLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAic3NoLmgiCisKKy8qIHJlbW92ZSBuZXdsaW5lIGF0IGVuZCBvZiBzdHJpbmcgKi8KK2NoYXIgKgorY2hvcChjaGFyICpzKQoreworCWNoYXIgKnQgPSBzOworCXdoaWxlICgqdCkgeworCQlpZiAoKnQgPT0gJ1xuJyB8fCAqdCA9PSAnXHInKSB7CisJCQkqdCA9ICdcMCc7CisJCQlyZXR1cm4gczsKKwkJfQorCQl0Kys7CisJfQorCXJldHVybiBzOworCit9CisKKy8qIHNldC91bnNldCBmaWxlZGVzY3JpcHRvciB0byBub24tYmxvY2tpbmcgKi8KK2ludAorc2V0X25vbmJsb2NrKGludCBmZCkKK3sKKwlpbnQgdmFsOworCisJdmFsID0gZmNudGwoZmQsIEZfR0VURkwsIDApOworCWlmICh2YWwgPCAwKSB7CisJCWVycm9yKCJmY250bCglZCwgRl9HRVRGTCwgMCk6ICVzIiwgZmQsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoLTEpOworCX0KKwlpZiAodmFsICYgT19OT05CTE9DSykgeworCQlkZWJ1ZzMoImZkICVkIGlzIE9fTk9OQkxPQ0siLCBmZCk7CisJCXJldHVybiAoMCk7CisJfQorCWRlYnVnMigiZmQgJWQgc2V0dGluZyBPX05PTkJMT0NLIiwgZmQpOworCXZhbCB8PSBPX05PTkJMT0NLOworCWlmIChmY250bChmZCwgRl9TRVRGTCwgdmFsKSA9PSAtMSkgeworCQlkZWJ1ZygiZmNudGwoJWQsIEZfU0VURkwsIE9fTk9OQkxPQ0spOiAlcyIsIGZkLAorCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCXJldHVybiAoMCk7Cit9CisKK2ludAordW5zZXRfbm9uYmxvY2soaW50IGZkKQoreworCWludCB2YWw7CisKKwl2YWwgPSBmY250bChmZCwgRl9HRVRGTCwgMCk7CisJaWYgKHZhbCA8IDApIHsKKwkJZXJyb3IoImZjbnRsKCVkLCBGX0dFVEZMLCAwKTogJXMiLCBmZCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCWlmICghKHZhbCAmIE9fTk9OQkxPQ0spKSB7CisJCWRlYnVnMygiZmQgJWQgaXMgbm90IE9fTk9OQkxPQ0siLCBmZCk7CisJCXJldHVybiAoMCk7CisJfQorCWRlYnVnKCJmZCAlZCBjbGVhcmluZyBPX05PTkJMT0NLIiwgZmQpOworCXZhbCAmPSB+T19OT05CTE9DSzsKKwlpZiAoZmNudGwoZmQsIEZfU0VURkwsIHZhbCkgPT0gLTEpIHsKKwkJZGVidWcoImZjbnRsKCVkLCBGX1NFVEZMLCB+T19OT05CTE9DSyk6ICVzIiwKKwkJICAgIGZkLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJcmV0dXJuICgwKTsKK30KKworY29uc3QgY2hhciAqCitzc2hfZ2FpX3N0cmVycm9yKGludCBnYWllcnIpCit7CisJaWYgKGdhaWVyciA9PSBFQUlfU1lTVEVNKQorCQlyZXR1cm4gc3RyZXJyb3IoZXJybm8pOworCXJldHVybiBnYWlfc3RyZXJyb3IoZ2FpZXJyKTsKK30KKworLyogZGlzYWJsZSBuYWdsZSBvbiBzb2NrZXQgKi8KK3ZvaWQKK3NldF9ub2RlbGF5KGludCBmZCkKK3sKKwlpbnQgb3B0OworCXNvY2tsZW5fdCBvcHRsZW47CisKKwlvcHRsZW4gPSBzaXplb2Ygb3B0OworCWlmIChnZXRzb2Nrb3B0KGZkLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksICZvcHQsICZvcHRsZW4pID09IC0xKSB7CisJCWRlYnVnKCJnZXRzb2Nrb3B0IFRDUF9OT0RFTEFZOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm47CisJfQorCWlmIChvcHQgPT0gMSkgeworCQlkZWJ1ZzIoImZkICVkIGlzIFRDUF9OT0RFTEFZIiwgZmQpOworCQlyZXR1cm47CisJfQorCW9wdCA9IDE7CisJZGVidWcyKCJmZCAlZCBzZXR0aW5nIFRDUF9OT0RFTEFZIiwgZmQpOworCWlmIChzZXRzb2Nrb3B0KGZkLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksICZvcHQsIHNpemVvZiBvcHQpID09IC0xKQorCQllcnJvcigic2V0c29ja29wdCBUQ1BfTk9ERUxBWTogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKK30KKworLyogQ2hhcmFjdGVycyBjb25zaWRlcmVkIHdoaXRlc3BhY2UgaW4gc3Ryc2VwIGNhbGxzLiAqLworI2RlZmluZSBXSElURVNQQUNFICIgXHRcclxuIgorI2RlZmluZSBRVU9URQkiXCIiCisKKy8qIHJldHVybiBuZXh0IHRva2VuIGluIGNvbmZpZ3VyYXRpb24gbGluZSAqLworY2hhciAqCitzdHJkZWxpbShjaGFyICoqcykKK3sKKwljaGFyICpvbGQ7CisJaW50IHdzcGFjZSA9IDA7CisKKwlpZiAoKnMgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlvbGQgPSAqczsKKworCSpzID0gc3RycGJyaygqcywgV0hJVEVTUEFDRSBRVU9URSAiPSIpOworCWlmICgqcyA9PSBOVUxMKQorCQlyZXR1cm4gKG9sZCk7CisKKwlpZiAoKnNbMF0gPT0gJ1wiJykgeworCQltZW1tb3ZlKCpzLCAqcyArIDEsIHN0cmxlbigqcykpOyAvKiBtb3ZlIG51bCB0b28gKi8KKwkJLyogRmluZCBtYXRjaGluZyBxdW90ZSAqLworCQlpZiAoKCpzID0gc3RycGJyaygqcywgUVVPVEUpKSA9PSBOVUxMKSB7CisJCQlyZXR1cm4gKE5VTEwpOwkJLyogbm8gbWF0Y2hpbmcgcXVvdGUgKi8KKwkJfSBlbHNlIHsKKwkJCSpzWzBdID0gJ1wwJzsKKwkJCSpzICs9IHN0cnNwbigqcyArIDEsIFdISVRFU1BBQ0UpICsgMTsKKwkJCXJldHVybiAob2xkKTsKKwkJfQorCX0KKworCS8qIEFsbG93IG9ubHkgb25lICc9JyB0byBiZSBza2lwcGVkICovCisJaWYgKCpzWzBdID09ICc9JykKKwkJd3NwYWNlID0gMTsKKwkqc1swXSA9ICdcMCc7CisKKwkvKiBTa2lwIGFueSBleHRyYSB3aGl0ZXNwYWNlIGFmdGVyIGZpcnN0IHRva2VuICovCisJKnMgKz0gc3Ryc3BuKCpzICsgMSwgV0hJVEVTUEFDRSkgKyAxOworCWlmICgqc1swXSA9PSAnPScgJiYgIXdzcGFjZSkKKwkJKnMgKz0gc3Ryc3BuKCpzICsgMSwgV0hJVEVTUEFDRSkgKyAxOworCisJcmV0dXJuIChvbGQpOworfQorCitzdHJ1Y3QgcGFzc3dkICoKK3B3Y29weShzdHJ1Y3QgcGFzc3dkICpwdykKK3sKKwlzdHJ1Y3QgcGFzc3dkICpjb3B5ID0geGNhbGxvYygxLCBzaXplb2YoKmNvcHkpKTsKKworCWNvcHktPnB3X25hbWUgPSB4c3RyZHVwKHB3LT5wd19uYW1lKTsKKwljb3B5LT5wd19wYXNzd2QgPSB4c3RyZHVwKHB3LT5wd19wYXNzd2QpOworCWNvcHktPnB3X2dlY29zID0geHN0cmR1cChwdy0+cHdfZ2Vjb3MpOworCWNvcHktPnB3X3VpZCA9IHB3LT5wd191aWQ7CisJY29weS0+cHdfZ2lkID0gcHctPnB3X2dpZDsKKyNpZmRlZiBIQVZFX1BXX0VYUElSRV9JTl9QQVNTV0QKKwljb3B5LT5wd19leHBpcmUgPSBwdy0+cHdfZXhwaXJlOworI2VuZGlmCisjaWZkZWYgSEFWRV9QV19DSEFOR0VfSU5fUEFTU1dECisJY29weS0+cHdfY2hhbmdlID0gcHctPnB3X2NoYW5nZTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfUFdfQ0xBU1NfSU5fUEFTU1dECisJY29weS0+cHdfY2xhc3MgPSB4c3RyZHVwKHB3LT5wd19jbGFzcyk7CisjZW5kaWYKKwljb3B5LT5wd19kaXIgPSB4c3RyZHVwKHB3LT5wd19kaXIpOworCWNvcHktPnB3X3NoZWxsID0geHN0cmR1cChwdy0+cHdfc2hlbGwpOworCXJldHVybiBjb3B5OworfQorCisvKgorICogQ29udmVydCBBU0NJSSBzdHJpbmcgdG8gVENQL0lQIHBvcnQgbnVtYmVyLgorICogUG9ydCBtdXN0IGJlID49MCBhbmQgPD02NTUzNS4KKyAqIFJldHVybiAtMSBpZiBpbnZhbGlkLgorICovCitpbnQKK2EycG9ydChjb25zdCBjaGFyICpzKQoreworCWxvbmcgbG9uZyBwb3J0OworCWNvbnN0IGNoYXIgKmVycnN0cjsKKworCXBvcnQgPSBzdHJ0b251bShzLCAwLCA2NTUzNSwgJmVycnN0cik7CisJaWYgKGVycnN0ciAhPSBOVUxMKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIChpbnQpcG9ydDsKK30KKworaW50CithMnR1bihjb25zdCBjaGFyICpzLCBpbnQgKnJlbW90ZSkKK3sKKwljb25zdCBjaGFyICplcnJzdHIgPSBOVUxMOworCWNoYXIgKnNwLCAqZXA7CisJaW50IHR1bjsKKworCWlmIChyZW1vdGUgIT0gTlVMTCkgeworCQkqcmVtb3RlID0gU1NIX1RVTklEX0FOWTsKKwkJc3AgPSB4c3RyZHVwKHMpOworCQlpZiAoKGVwID0gc3RyY2hyKHNwLCAnOicpKSA9PSBOVUxMKSB7CisJCQl4ZnJlZShzcCk7CisJCQlyZXR1cm4gKGEydHVuKHMsIE5VTEwpKTsKKwkJfQorCQllcFswXSA9ICdcMCc7IGVwKys7CisJCSpyZW1vdGUgPSBhMnR1bihlcCwgTlVMTCk7CisJCXR1biA9IGEydHVuKHNwLCBOVUxMKTsKKwkJeGZyZWUoc3ApOworCQlyZXR1cm4gKCpyZW1vdGUgPT0gU1NIX1RVTklEX0VSUiA/ICpyZW1vdGUgOiB0dW4pOworCX0KKworCWlmIChzdHJjYXNlY21wKHMsICJhbnkiKSA9PSAwKQorCQlyZXR1cm4gKFNTSF9UVU5JRF9BTlkpOworCisJdHVuID0gc3RydG9udW0ocywgMCwgU1NIX1RVTklEX01BWCwgJmVycnN0cik7CisJaWYgKGVycnN0ciAhPSBOVUxMKQorCQlyZXR1cm4gKFNTSF9UVU5JRF9FUlIpOworCisJcmV0dXJuICh0dW4pOworfQorCisjZGVmaW5lIFNFQ09ORFMJCTEKKyNkZWZpbmUgTUlOVVRFUwkJKFNFQ09ORFMgKiA2MCkKKyNkZWZpbmUgSE9VUlMJCShNSU5VVEVTICogNjApCisjZGVmaW5lIERBWVMJCShIT1VSUyAqIDI0KQorI2RlZmluZSBXRUVLUwkJKERBWVMgKiA3KQorCisvKgorICogQ29udmVydCBhIHRpbWUgc3RyaW5nIGludG8gc2Vjb25kczsgZm9ybWF0IGlzCisgKiBhIHNlcXVlbmNlIG9mOgorICogICAgICB0aW1lW3F1YWxpZmllcl0KKyAqCisgKiBWYWxpZCB0aW1lIHF1YWxpZmllcnMgYXJlOgorICogICAgICA8bm9uZT4gIHNlY29uZHMKKyAqICAgICAgc3xTICAgICBzZWNvbmRzCisgKiAgICAgIG18TSAgICAgbWludXRlcworICogICAgICBofEggICAgIGhvdXJzCisgKiAgICAgIGR8RCAgICAgZGF5cworICogICAgICB3fFcgICAgIHdlZWtzCisgKgorICogRXhhbXBsZXM6CisgKiAgICAgIDkwbSAgICAgOTAgbWludXRlcworICogICAgICAxaDMwbSAgIDkwIG1pbnV0ZXMKKyAqICAgICAgMmQgICAgICAyIGRheXMKKyAqICAgICAgMXcgICAgICAxIHdlZWsKKyAqCisgKiBSZXR1cm4gLTEgaWYgdGltZSBzdHJpbmcgaXMgaW52YWxpZC4KKyAqLworbG9uZworY29udnRpbWUoY29uc3QgY2hhciAqcykKK3sKKwlsb25nIHRvdGFsLCBzZWNzOworCWNvbnN0IGNoYXIgKnA7CisJY2hhciAqZW5kcDsKKworCWVycm5vID0gMDsKKwl0b3RhbCA9IDA7CisJcCA9IHM7CisKKwlpZiAocCA9PSBOVUxMIHx8ICpwID09ICdcMCcpCisJCXJldHVybiAtMTsKKworCXdoaWxlICgqcCkgeworCQlzZWNzID0gc3RydG9sKHAsICZlbmRwLCAxMCk7CisJCWlmIChwID09IGVuZHAgfHwKKwkJICAgIChlcnJubyA9PSBFUkFOR0UgJiYgKHNlY3MgPT0gTE9OR19NSU4gfHwgc2VjcyA9PSBMT05HX01BWCkpIHx8CisJCSAgICBzZWNzIDwgMCkKKwkJCXJldHVybiAtMTsKKworCQlzd2l0Y2ggKCplbmRwKyspIHsKKwkJY2FzZSAnXDAnOgorCQkJZW5kcC0tOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQljYXNlICdTJzoKKwkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJY2FzZSAnTSc6CisJCQlzZWNzICo9IE1JTlVURVM7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCWNhc2UgJ0gnOgorCQkJc2VjcyAqPSBIT1VSUzsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJY2FzZSAnRCc6CisJCQlzZWNzICo9IERBWVM7CisJCQlicmVhazsKKwkJY2FzZSAndyc6CisJCWNhc2UgJ1cnOgorCQkJc2VjcyAqPSBXRUVLUzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC0xOworCQl9CisJCXRvdGFsICs9IHNlY3M7CisJCWlmICh0b3RhbCA8IDApCisJCQlyZXR1cm4gLTE7CisJCXAgPSBlbmRwOworCX0KKworCXJldHVybiB0b3RhbDsKK30KKworLyoKKyAqIFJldHVybnMgYSBzdGFuZGFyZGl6ZWQgaG9zdCtwb3J0IGlkZW50aWZpZXIgc3RyaW5nLgorICogQ2FsbGVyIG11c3QgZnJlZSByZXR1cm5lZCBzdHJpbmcuCisgKi8KK2NoYXIgKgorcHV0X2hvc3RfcG9ydChjb25zdCBjaGFyICpob3N0LCB1X3Nob3J0IHBvcnQpCit7CisJY2hhciAqaG9zdHN0cjsKKworCWlmIChwb3J0ID09IDAgfHwgcG9ydCA9PSBTU0hfREVGQVVMVF9QT1JUKQorCQlyZXR1cm4oeHN0cmR1cChob3N0KSk7CisJaWYgKGFzcHJpbnRmKCZob3N0c3RyLCAiWyVzXTolZCIsIGhvc3QsIChpbnQpcG9ydCkgPCAwKQorCQlmYXRhbCgicHV0X2hvc3RfcG9ydDogYXNwcmludGY6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlkZWJ1ZzMoInB1dF9ob3N0X3BvcnQ6ICVzIiwgaG9zdHN0cik7CisJcmV0dXJuIGhvc3RzdHI7Cit9CisKKy8qCisgKiBTZWFyY2ggZm9yIG5leHQgZGVsaW1pdGVyIGJldHdlZW4gaG9zdG5hbWVzL2FkZHJlc3NlcyBhbmQgcG9ydHMuCisgKiBBcmd1bWVudCBtYXkgYmUgbW9kaWZpZWQgKGZvciB0ZXJtaW5hdGlvbikuCisgKiBSZXR1cm5zICpjcCBpZiBwYXJzaW5nIHN1Y2NlZWRzLgorICogKmNwIGlzIHNldCB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgZGVsaW1pdGVyLCBpZiBvbmUgd2FzIGZvdW5kLgorICogSWYgdGhpcyBpcyB0aGUgbGFzdCBmaWVsZCwgKmNwIGlzIHNldCB0byBOVUxMLgorICovCitjaGFyICoKK2hwZGVsaW0oY2hhciAqKmNwKQoreworCWNoYXIgKnMsICpvbGQ7CisKKwlpZiAoY3AgPT0gTlVMTCB8fCAqY3AgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlvbGQgPSBzID0gKmNwOworCWlmICgqcyA9PSAnWycpIHsKKwkJaWYgKChzID0gc3RyY2hyKHMsICddJykpID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwkJZWxzZQorCQkJcysrOworCX0gZWxzZSBpZiAoKHMgPSBzdHJwYnJrKHMsICI6LyIpKSA9PSBOVUxMKQorCQlzID0gKmNwICsgc3RybGVuKCpjcCk7IC8qIHNraXAgdG8gZW5kIChzZWUgZmlyc3QgY2FzZSBiZWxvdykgKi8KKworCXN3aXRjaCAoKnMpIHsKKwljYXNlICdcMCc6CisJCSpjcCA9IE5VTEw7CS8qIG5vIG1vcmUgZmllbGRzKi8KKwkJYnJlYWs7CisKKwljYXNlICc6JzoKKwljYXNlICcvJzoKKwkJKnMgPSAnXDAnOwkvKiB0ZXJtaW5hdGUgKi8KKwkJKmNwID0gcyArIDE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIG9sZDsKK30KKworY2hhciAqCitjbGVhbmhvc3RuYW1lKGNoYXIgKmhvc3QpCit7CisJaWYgKCpob3N0ID09ICdbJyAmJiBob3N0W3N0cmxlbihob3N0KSAtIDFdID09ICddJykgeworCQlob3N0W3N0cmxlbihob3N0KSAtIDFdID0gJ1wwJzsKKwkJcmV0dXJuIChob3N0ICsgMSk7CisJfSBlbHNlCisJCXJldHVybiBob3N0OworfQorCitjaGFyICoKK2NvbG9uKGNoYXIgKmNwKQoreworCWludCBmbGFnID0gMDsKKworCWlmICgqY3AgPT0gJzonKQkJLyogTGVhZGluZyBjb2xvbiBpcyBwYXJ0IG9mIGZpbGUgbmFtZS4gKi8KKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpjcCA9PSAnWycpCisJCWZsYWcgPSAxOworCisJZm9yICg7ICpjcDsgKytjcCkgeworCQlpZiAoKmNwID09ICdAJyAmJiAqKGNwKzEpID09ICdbJykKKwkJCWZsYWcgPSAxOworCQlpZiAoKmNwID09ICddJyAmJiAqKGNwKzEpID09ICc6JyAmJiBmbGFnKQorCQkJcmV0dXJuIChjcCsxKTsKKwkJaWYgKCpjcCA9PSAnOicgJiYgIWZsYWcpCisJCQlyZXR1cm4gKGNwKTsKKwkJaWYgKCpjcCA9PSAnLycpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIGZ1bmN0aW9uIHRvIGFzc2lzdCBidWlsZGluZyBleGVjdigpIGFyZ3VtZW50cyAqLwordm9pZAorYWRkYXJncyhhcmdsaXN0ICphcmdzLCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWNoYXIgKmNwOworCXVfaW50IG5hbGxvYzsKKwlpbnQgcjsKKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCXIgPSB2YXNwcmludGYoJmNwLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCWlmIChyID09IC0xKQorCQlmYXRhbCgiYWRkYXJnczogYXJndW1lbnQgdG9vIGxvbmciKTsKKworCW5hbGxvYyA9IGFyZ3MtPm5hbGxvYzsKKwlpZiAoYXJncy0+bGlzdCA9PSBOVUxMKSB7CisJCW5hbGxvYyA9IDMyOworCQlhcmdzLT5udW0gPSAwOworCX0gZWxzZSBpZiAoYXJncy0+bnVtKzIgPj0gbmFsbG9jKQorCQluYWxsb2MgKj0gMjsKKworCWFyZ3MtPmxpc3QgPSB4cmVhbGxvYyhhcmdzLT5saXN0LCBuYWxsb2MsIHNpemVvZihjaGFyICopKTsKKwlhcmdzLT5uYWxsb2MgPSBuYWxsb2M7CisJYXJncy0+bGlzdFthcmdzLT5udW0rK10gPSBjcDsKKwlhcmdzLT5saXN0W2FyZ3MtPm51bV0gPSBOVUxMOworfQorCit2b2lkCityZXBsYWNlYXJnKGFyZ2xpc3QgKmFyZ3MsIHVfaW50IHdoaWNoLCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWNoYXIgKmNwOworCWludCByOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJciA9IHZhc3ByaW50ZigmY3AsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJaWYgKHIgPT0gLTEpCisJCWZhdGFsKCJyZXBsYWNlYXJnOiBhcmd1bWVudCB0b28gbG9uZyIpOworCisJaWYgKHdoaWNoID49IGFyZ3MtPm51bSkKKwkJZmF0YWwoInJlcGxhY2Vhcmc6IHRyaWVkIHRvIHJlcGxhY2UgaW52YWxpZCBhcmcgJWQgPj0gJWQiLAorCQkgICAgd2hpY2gsIGFyZ3MtPm51bSk7CisJeGZyZWUoYXJncy0+bGlzdFt3aGljaF0pOworCWFyZ3MtPmxpc3Rbd2hpY2hdID0gY3A7Cit9CisKK3ZvaWQKK2ZyZWVhcmdzKGFyZ2xpc3QgKmFyZ3MpCit7CisJdV9pbnQgaTsKKworCWlmIChhcmdzLT5saXN0ICE9IE5VTEwpIHsKKwkJZm9yIChpID0gMDsgaSA8IGFyZ3MtPm51bTsgaSsrKQorCQkJeGZyZWUoYXJncy0+bGlzdFtpXSk7CisJCXhmcmVlKGFyZ3MtPmxpc3QpOworCQlhcmdzLT5uYWxsb2MgPSBhcmdzLT5udW0gPSAwOworCQlhcmdzLT5saXN0ID0gTlVMTDsKKwl9Cit9CisKKy8qCisgKiBFeHBhbmRzIHRpbGRlcyBpbiB0aGUgZmlsZSBuYW1lLiAgUmV0dXJucyBkYXRhIGFsbG9jYXRlZCBieSB4bWFsbG9jLgorICogV2FybmluZzogdGhpcyBjYWxscyBnZXRwdyouCisgKi8KK2NoYXIgKgordGlsZGVfZXhwYW5kX2ZpbGVuYW1lKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB1aWRfdCB1aWQpCit7CisJY29uc3QgY2hhciAqcGF0aDsKKwljaGFyIHVzZXJbMTI4XSwgcmV0W01BWFBBVEhMRU5dOworCXN0cnVjdCBwYXNzd2QgKnB3OworCXVfaW50IGxlbiwgc2xhc2g7CisKKwlpZiAoKmZpbGVuYW1lICE9ICd+JykKKwkJcmV0dXJuICh4c3RyZHVwKGZpbGVuYW1lKSk7CisJZmlsZW5hbWUrKzsKKworCXBhdGggPSBzdHJjaHIoZmlsZW5hbWUsICcvJyk7CisJaWYgKHBhdGggIT0gTlVMTCAmJiBwYXRoID4gZmlsZW5hbWUpIHsJCS8qIH51c2VyL3BhdGggKi8KKwkJc2xhc2ggPSBwYXRoIC0gZmlsZW5hbWU7CisJCWlmIChzbGFzaCA+IHNpemVvZih1c2VyKSAtIDEpCisJCQlmYXRhbCgidGlsZGVfZXhwYW5kX2ZpbGVuYW1lOiB+dXNlcm5hbWUgdG9vIGxvbmciKTsKKwkJbWVtY3B5KHVzZXIsIGZpbGVuYW1lLCBzbGFzaCk7CisJCXVzZXJbc2xhc2hdID0gJ1wwJzsKKwkJaWYgKChwdyA9IGdldHB3bmFtKHVzZXIpKSA9PSBOVUxMKQorCQkJZmF0YWwoInRpbGRlX2V4cGFuZF9maWxlbmFtZTogTm8gc3VjaCB1c2VyICVzIiwgdXNlcik7CisJfSBlbHNlIGlmICgocHcgPSBnZXRwd3VpZCh1aWQpKSA9PSBOVUxMKQkvKiB+L3BhdGggKi8KKwkJZmF0YWwoInRpbGRlX2V4cGFuZF9maWxlbmFtZTogTm8gc3VjaCB1aWQgJWxkIiwgKGxvbmcpdWlkKTsKKworCWlmIChzdHJsY3B5KHJldCwgcHctPnB3X2Rpciwgc2l6ZW9mKHJldCkpID49IHNpemVvZihyZXQpKQorCQlmYXRhbCgidGlsZGVfZXhwYW5kX2ZpbGVuYW1lOiBQYXRoIHRvbyBsb25nIik7CisKKwkvKiBNYWtlIHN1cmUgZGlyZWN0b3J5IGhhcyBhIHRyYWlsaW5nICcvJyAqLworCWxlbiA9IHN0cmxlbihwdy0+cHdfZGlyKTsKKwlpZiAoKGxlbiA9PSAwIHx8IHB3LT5wd19kaXJbbGVuIC0gMV0gIT0gJy8nKSAmJgorCSAgICBzdHJsY2F0KHJldCwgIi8iLCBzaXplb2YocmV0KSkgPj0gc2l6ZW9mKHJldCkpCisJCWZhdGFsKCJ0aWxkZV9leHBhbmRfZmlsZW5hbWU6IFBhdGggdG9vIGxvbmciKTsKKworCS8qIFNraXAgbGVhZGluZyAnLycgZnJvbSBzcGVjaWZpZWQgcGF0aCAqLworCWlmIChwYXRoICE9IE5VTEwpCisJCWZpbGVuYW1lID0gcGF0aCArIDE7CisJaWYgKHN0cmxjYXQocmV0LCBmaWxlbmFtZSwgc2l6ZW9mKHJldCkpID49IHNpemVvZihyZXQpKQorCQlmYXRhbCgidGlsZGVfZXhwYW5kX2ZpbGVuYW1lOiBQYXRoIHRvbyBsb25nIik7CisKKwlyZXR1cm4gKHhzdHJkdXAocmV0KSk7Cit9CisKKy8qCisgKiBFeHBhbmQgYSBzdHJpbmcgd2l0aCBhIHNldCBvZiAlW2NoYXJdIGVzY2FwZXMuIEEgbnVtYmVyIG9mIGVzY2FwZXMgbWF5IGJlCisgKiBzcGVjaWZpZWQgYXMgKGNoYXIgKmVzY2FwZV9jaGFycywgY2hhciAqcmVwbGFjZW1lbnQpIHBhaXJzLiBUaGUgbGlzdCBtdXN0CisgKiBiZSB0ZXJtaW5hdGVkIGJ5IGEgTlVMTCBlc2NhcGVfY2hhci4gUmV0dXJucyByZXBsYWNlZCBzdHJpbmcgaW4gbWVtb3J5CisgKiBhbGxvY2F0ZWQgYnkgeG1hbGxvYy4KKyAqLworY2hhciAqCitwZXJjZW50X2V4cGFuZChjb25zdCBjaGFyICpzdHJpbmcsIC4uLikKK3sKKyNkZWZpbmUgRVhQQU5EX01BWF9LRVlTCTE2CisJdV9pbnQgbnVtX2tleXMsIGksIGo7CisJc3RydWN0IHsKKwkJY29uc3QgY2hhciAqa2V5OworCQljb25zdCBjaGFyICpyZXBsOworCX0ga2V5c1tFWFBBTkRfTUFYX0tFWVNdOworCWNoYXIgYnVmWzQwOTZdOworCXZhX2xpc3QgYXA7CisKKwkvKiBHYXRoZXIga2V5cyAqLworCXZhX3N0YXJ0KGFwLCBzdHJpbmcpOworCWZvciAobnVtX2tleXMgPSAwOyBudW1fa2V5cyA8IEVYUEFORF9NQVhfS0VZUzsgbnVtX2tleXMrKykgeworCQlrZXlzW251bV9rZXlzXS5rZXkgPSB2YV9hcmcoYXAsIGNoYXIgKik7CisJCWlmIChrZXlzW251bV9rZXlzXS5rZXkgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlrZXlzW251bV9rZXlzXS5yZXBsID0gdmFfYXJnKGFwLCBjaGFyICopOworCQlpZiAoa2V5c1tudW1fa2V5c10ucmVwbCA9PSBOVUxMKQorCQkJZmF0YWwoIiVzOiBOVUxMIHJlcGxhY2VtZW50IiwgX19mdW5jX18pOworCX0KKwlpZiAobnVtX2tleXMgPT0gRVhQQU5EX01BWF9LRVlTICYmIHZhX2FyZyhhcCwgY2hhciAqKSAhPSBOVUxMKQorCQlmYXRhbCgiJXM6IHRvbyBtYW55IGtleXMiLCBfX2Z1bmNfXyk7CisJdmFfZW5kKGFwKTsKKworCS8qIEV4cGFuZCBzdHJpbmcgKi8KKwkqYnVmID0gJ1wwJzsKKwlmb3IgKGkgPSAwOyAqc3RyaW5nICE9ICdcMCc7IHN0cmluZysrKSB7CisJCWlmICgqc3RyaW5nICE9ICclJykgeworIGFwcGVuZDoKKwkJCWJ1ZltpKytdID0gKnN0cmluZzsKKwkJCWlmIChpID49IHNpemVvZihidWYpKQorCQkJCWZhdGFsKCIlczogc3RyaW5nIHRvbyBsb25nIiwgX19mdW5jX18pOworCQkJYnVmW2ldID0gJ1wwJzsKKwkJCWNvbnRpbnVlOworCQl9CisJCXN0cmluZysrOworCQkvKiAlJSBjYXNlICovCisJCWlmICgqc3RyaW5nID09ICclJykKKwkJCWdvdG8gYXBwZW5kOworCQlmb3IgKGogPSAwOyBqIDwgbnVtX2tleXM7IGorKykgeworCQkJaWYgKHN0cmNocihrZXlzW2pdLmtleSwgKnN0cmluZykgIT0gTlVMTCkgeworCQkJCWkgPSBzdHJsY2F0KGJ1Ziwga2V5c1tqXS5yZXBsLCBzaXplb2YoYnVmKSk7CisJCQkJaWYgKGkgPj0gc2l6ZW9mKGJ1ZikpCisJCQkJCWZhdGFsKCIlczogc3RyaW5nIHRvbyBsb25nIiwgX19mdW5jX18pOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChqID49IG51bV9rZXlzKQorCQkJZmF0YWwoIiVzOiB1bmtub3duIGtleSAlJSVjIiwgX19mdW5jX18sICpzdHJpbmcpOworCX0KKwlyZXR1cm4gKHhzdHJkdXAoYnVmKSk7CisjdW5kZWYgRVhQQU5EX01BWF9LRVlTCit9CisKKy8qCisgKiBSZWFkIGFuIGVudGlyZSBsaW5lIGZyb20gYSBwdWJsaWMga2V5IGZpbGUgaW50byBhIHN0YXRpYyBidWZmZXIsIGRpc2NhcmRpbmcKKyAqIGxpbmVzIHRoYXQgZXhjZWVkIHRoZSBidWZmZXIgc2l6ZS4gIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorICovCitpbnQKK3JlYWRfa2V5ZmlsZV9saW5lKEZJTEUgKmYsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjaGFyICpidWYsIHNpemVfdCBidWZzeiwKKyAgIHVfbG9uZyAqbGluZW5vKQoreworCXdoaWxlIChmZ2V0cyhidWYsIGJ1ZnN6LCBmKSAhPSBOVUxMKSB7CisJCWlmIChidWZbMF0gPT0gJ1wwJykKKwkJCWNvbnRpbnVlOworCQkoKmxpbmVubykrKzsKKwkJaWYgKGJ1ZltzdHJsZW4oYnVmKSAtIDFdID09ICdcbicgfHwgZmVvZihmKSkgeworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlkZWJ1ZygiJXM6ICVzIGxpbmUgJWx1IGV4Y2VlZHMgc2l6ZSBsaW1pdCIsIF9fZnVuY19fLAorCQkJICAgIGZpbGVuYW1lLCAqbGluZW5vKTsKKwkJCS8qIGRpc2NhcmQgcmVtYWluZGVyIG9mIGxpbmUgKi8KKwkJCXdoaWxlIChmZ2V0YyhmKSAhPSAnXG4nICYmICFmZW9mKGYpKQorCQkJCTsJLyogbm90aGluZyAqLworCQl9CisJfQorCXJldHVybiAtMTsKK30KKworaW50Cit0dW5fb3BlbihpbnQgdHVuLCBpbnQgbW9kZSkKK3sKKyNpZiBkZWZpbmVkKENVU1RPTV9TWVNfVFVOX09QRU4pCisJcmV0dXJuIChzeXNfdHVuX29wZW4odHVuLCBtb2RlKSk7CisjZWxpZiBkZWZpbmVkKFNTSF9UVU5fT1BFTkJTRCkKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWNoYXIgbmFtZVsxMDBdOworCWludCBmZCA9IC0xLCBzb2NrOworCisJLyogT3BlbiB0aGUgdHVubmVsIGRldmljZSAqLworCWlmICh0dW4gPD0gU1NIX1RVTklEX01BWCkgeworCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIvZGV2L3R1biVkIiwgdHVuKTsKKwkJZmQgPSBvcGVuKG5hbWUsIE9fUkRXUik7CisJfSBlbHNlIGlmICh0dW4gPT0gU1NIX1RVTklEX0FOWSkgeworCQlmb3IgKHR1biA9IDEwMDsgdHVuID49IDA7IHR1bi0tKSB7CisJCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIvZGV2L3R1biVkIiwgdHVuKTsKKwkJCWlmICgoZmQgPSBvcGVuKG5hbWUsIE9fUkRXUikpID49IDApCisJCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlkZWJ1ZygiJXM6IGludmFsaWQgdHVubmVsICV1IiwgX19mdW5jX18sIHR1bik7CisJCXJldHVybiAoLTEpOworCX0KKworCWlmIChmZCA8IDApIHsKKwkJZGVidWcoIiVzOiAlcyBvcGVuIGZhaWxlZDogJXMiLCBfX2Z1bmNfXywgbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJZGVidWcoIiVzOiAlcyBtb2RlICVkIGZkICVkIiwgX19mdW5jX18sIG5hbWUsIG1vZGUsIGZkKTsKKworCS8qIFNldCB0aGUgdHVubmVsIGRldmljZSBvcGVyYXRpb24gbW9kZSAqLworCXNucHJpbnRmKGlmci5pZnJfbmFtZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSksICJ0dW4lZCIsIHR1bik7CisJaWYgKChzb2NrID0gc29ja2V0KFBGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKSkgPT0gLTEpCisJCWdvdG8gZmFpbGVkOworCisJaWYgKGlvY3RsKHNvY2ssIFNJT0NHSUZGTEFHUywgJmlmcikgPT0gLTEpCisJCWdvdG8gZmFpbGVkOworCisJLyogU2V0IGludGVyZmFjZSBtb2RlICovCisJaWZyLmlmcl9mbGFncyAmPSB+SUZGX1VQOworCWlmIChtb2RlID09IFNTSF9UVU5NT0RFX0VUSEVSTkVUKQorCQlpZnIuaWZyX2ZsYWdzIHw9IElGRl9MSU5LMDsKKwllbHNlCisJCWlmci5pZnJfZmxhZ3MgJj0gfklGRl9MSU5LMDsKKwlpZiAoaW9jdGwoc29jaywgU0lPQ1NJRkZMQUdTLCAmaWZyKSA9PSAtMSkKKwkJZ290byBmYWlsZWQ7CisKKwkvKiBCcmluZyBpbnRlcmZhY2UgdXAgKi8KKwlpZnIuaWZyX2ZsYWdzIHw9IElGRl9VUDsKKwlpZiAoaW9jdGwoc29jaywgU0lPQ1NJRkZMQUdTLCAmaWZyKSA9PSAtMSkKKwkJZ290byBmYWlsZWQ7CisKKwljbG9zZShzb2NrKTsKKwlyZXR1cm4gKGZkKTsKKworIGZhaWxlZDoKKwlpZiAoZmQgPj0gMCkKKwkJY2xvc2UoZmQpOworCWlmIChzb2NrID49IDApCisJCWNsb3NlKHNvY2spOworCWRlYnVnKCIlczogZmFpbGVkIHRvIHNldCAlcyBtb2RlICVkOiAlcyIsIF9fZnVuY19fLCBuYW1lLAorCSAgICBtb2RlLCBzdHJlcnJvcihlcnJubykpOworCXJldHVybiAoLTEpOworI2Vsc2UKKwllcnJvcigiVHVubmVsIGludGVyZmFjZXMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIpOworCXJldHVybiAoLTEpOworI2VuZGlmCit9CisKK3ZvaWQKK3Nhbml0aXNlX3N0ZGZkKHZvaWQpCit7CisJaW50IG51bGxmZCwgZHVwZmQ7CisKKwlpZiAoKG51bGxmZCA9IGR1cGZkID0gb3BlbihfUEFUSF9ERVZOVUxMLCBPX1JEV1IpKSA9PSAtMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IG9wZW4gL2Rldi9udWxsOiAlc1xuIiwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoMSk7CisJfQorCXdoaWxlICgrK2R1cGZkIDw9IDIpIHsKKwkJLyogT25seSBjbG9iYmVyIGNsb3NlZCBmZHMgKi8KKwkJaWYgKGZjbnRsKGR1cGZkLCBGX0dFVEZMLCAwKSA+PSAwKQorCQkJY29udGludWU7CisJCWlmIChkdXAyKG51bGxmZCwgZHVwZmQpID09IC0xKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImR1cDI6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKwlpZiAobnVsbGZkID4gMikKKwkJY2xvc2UobnVsbGZkKTsKK30KKworY2hhciAqCit0b2hleChjb25zdCB2b2lkICp2cCwgc2l6ZV90IGwpCit7CisJY29uc3QgdV9jaGFyICpwID0gKGNvbnN0IHVfY2hhciAqKXZwOworCWNoYXIgYlszXSwgKnI7CisJc2l6ZV90IGksIGhsOworCisJaWYgKGwgPiA2NTUzNikKKwkJcmV0dXJuIHhzdHJkdXAoInRvaGV4OiBsZW5ndGggPiA2NTUzNiIpOworCisJaGwgPSBsICogMiArIDE7CisJciA9IHhjYWxsb2MoMSwgaGwpOworCWZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHsKKwkJc25wcmludGYoYiwgc2l6ZW9mKGIpLCAiJTAyeCIsIHBbaV0pOworCQlzdHJsY2F0KHIsIGIsIGhsKTsKKwl9CisJcmV0dXJuIChyKTsKK30KKwordV9pbnQ2NF90CitnZXRfdTY0KGNvbnN0IHZvaWQgKnZwKQoreworCWNvbnN0IHVfY2hhciAqcCA9IChjb25zdCB1X2NoYXIgKil2cDsKKwl1X2ludDY0X3QgdjsKKworCXYgID0gKHVfaW50NjRfdClwWzBdIDw8IDU2OworCXYgfD0gKHVfaW50NjRfdClwWzFdIDw8IDQ4OworCXYgfD0gKHVfaW50NjRfdClwWzJdIDw8IDQwOworCXYgfD0gKHVfaW50NjRfdClwWzNdIDw8IDMyOworCXYgfD0gKHVfaW50NjRfdClwWzRdIDw8IDI0OworCXYgfD0gKHVfaW50NjRfdClwWzVdIDw8IDE2OworCXYgfD0gKHVfaW50NjRfdClwWzZdIDw8IDg7CisJdiB8PSAodV9pbnQ2NF90KXBbN107CisKKwlyZXR1cm4gKHYpOworfQorCit1X2ludDMyX3QKK2dldF91MzIoY29uc3Qgdm9pZCAqdnApCit7CisJY29uc3QgdV9jaGFyICpwID0gKGNvbnN0IHVfY2hhciAqKXZwOworCXVfaW50MzJfdCB2OworCisJdiAgPSAodV9pbnQzMl90KXBbMF0gPDwgMjQ7CisJdiB8PSAodV9pbnQzMl90KXBbMV0gPDwgMTY7CisJdiB8PSAodV9pbnQzMl90KXBbMl0gPDwgODsKKwl2IHw9ICh1X2ludDMyX3QpcFszXTsKKworCXJldHVybiAodik7Cit9CisKK3VfaW50MTZfdAorZ2V0X3UxNihjb25zdCB2b2lkICp2cCkKK3sKKwljb25zdCB1X2NoYXIgKnAgPSAoY29uc3QgdV9jaGFyICopdnA7CisJdV9pbnQxNl90IHY7CisKKwl2ICA9ICh1X2ludDE2X3QpcFswXSA8PCA4OworCXYgfD0gKHVfaW50MTZfdClwWzFdOworCisJcmV0dXJuICh2KTsKK30KKwordm9pZAorcHV0X3U2NCh2b2lkICp2cCwgdV9pbnQ2NF90IHYpCit7CisJdV9jaGFyICpwID0gKHVfY2hhciAqKXZwOworCisJcFswXSA9ICh1X2NoYXIpKHYgPj4gNTYpICYgMHhmZjsKKwlwWzFdID0gKHVfY2hhcikodiA+PiA0OCkgJiAweGZmOworCXBbMl0gPSAodV9jaGFyKSh2ID4+IDQwKSAmIDB4ZmY7CisJcFszXSA9ICh1X2NoYXIpKHYgPj4gMzIpICYgMHhmZjsKKwlwWzRdID0gKHVfY2hhcikodiA+PiAyNCkgJiAweGZmOworCXBbNV0gPSAodV9jaGFyKSh2ID4+IDE2KSAmIDB4ZmY7CisJcFs2XSA9ICh1X2NoYXIpKHYgPj4gOCkgJiAweGZmOworCXBbN10gPSAodV9jaGFyKXYgJiAweGZmOworfQorCit2b2lkCitwdXRfdTMyKHZvaWQgKnZwLCB1X2ludDMyX3QgdikKK3sKKwl1X2NoYXIgKnAgPSAodV9jaGFyICopdnA7CisKKwlwWzBdID0gKHVfY2hhcikodiA+PiAyNCkgJiAweGZmOworCXBbMV0gPSAodV9jaGFyKSh2ID4+IDE2KSAmIDB4ZmY7CisJcFsyXSA9ICh1X2NoYXIpKHYgPj4gOCkgJiAweGZmOworCXBbM10gPSAodV9jaGFyKXYgJiAweGZmOworfQorCisKK3ZvaWQKK3B1dF91MTYodm9pZCAqdnAsIHVfaW50MTZfdCB2KQoreworCXVfY2hhciAqcCA9ICh1X2NoYXIgKil2cDsKKworCXBbMF0gPSAodV9jaGFyKSh2ID4+IDgpICYgMHhmZjsKKwlwWzFdID0gKHVfY2hhcil2ICYgMHhmZjsKK30KKwordm9pZAorbXNfc3VidHJhY3RfZGlmZihzdHJ1Y3QgdGltZXZhbCAqc3RhcnQsIGludCAqbXMpCit7CisJc3RydWN0IHRpbWV2YWwgZGlmZiwgZmluaXNoOworCisJZ2V0dGltZW9mZGF5KCZmaW5pc2gsIE5VTEwpOworCXRpbWVyc3ViKCZmaW5pc2gsIHN0YXJ0LCAmZGlmZik7CQorCSptcyAtPSAoZGlmZi50dl9zZWMgKiAxMDAwKSArIChkaWZmLnR2X3VzZWMgLyAxMDAwKTsKK30KKwordm9pZAorbXNfdG9fdGltZXZhbChzdHJ1Y3QgdGltZXZhbCAqdHYsIGludCBtcykKK3sKKwlpZiAobXMgPCAwKQorCQltcyA9IDA7CisJdHYtPnR2X3NlYyA9IG1zIC8gMTAwMDsKKwl0di0+dHZfdXNlYyA9IChtcyAlIDEwMDApICogMTAwMDsKK30KKwordm9pZAorYmFuZHdpZHRoX2xpbWl0X2luaXQoc3RydWN0IGJ3bGltaXQgKmJ3LCB1X2ludDY0X3Qga2Jwcywgc2l6ZV90IGJ1ZmxlbikKK3sKKwlidy0+YnVmbGVuID0gYnVmbGVuOworCWJ3LT5yYXRlID0ga2JwczsKKwlidy0+dGhyZXNoID0gYnctPnJhdGU7CisJYnctPmxhbXQgPSAwOworCXRpbWVyY2xlYXIoJmJ3LT5id3N0YXJ0KTsKKwl0aW1lcmNsZWFyKCZidy0+YndlbmQpOworfQkKKworLyogQ2FsbGJhY2sgZnJvbSByZWFkL3dyaXRlIGxvb3AgdG8gaW5zZXJ0IGJhbmR3aWR0aC1saW1pdGluZyBkZWxheXMgKi8KK3ZvaWQKK2JhbmR3aWR0aF9saW1pdChzdHJ1Y3QgYndsaW1pdCAqYncsIHNpemVfdCByZWFkX2xlbikKK3sKKwl1X2ludDY0X3Qgd2FpdGxlbjsKKwlzdHJ1Y3QgdGltZXNwZWMgdHMsIHJtOworCisJaWYgKCF0aW1lcmlzc2V0KCZidy0+YndzdGFydCkpIHsKKwkJZ2V0dGltZW9mZGF5KCZidy0+YndzdGFydCwgTlVMTCk7CisJCXJldHVybjsKKwl9CisKKwlidy0+bGFtdCArPSByZWFkX2xlbjsKKwlpZiAoYnctPmxhbXQgPCBidy0+dGhyZXNoKQorCQlyZXR1cm47CisKKwlnZXR0aW1lb2ZkYXkoJmJ3LT5id2VuZCwgTlVMTCk7CisJdGltZXJzdWIoJmJ3LT5id2VuZCwgJmJ3LT5id3N0YXJ0LCAmYnctPmJ3ZW5kKTsKKwlpZiAoIXRpbWVyaXNzZXQoJmJ3LT5id2VuZCkpCisJCXJldHVybjsKKworCWJ3LT5sYW10ICo9IDg7CisJd2FpdGxlbiA9IChkb3VibGUpMTAwMDAwMEwgKiBidy0+bGFtdCAvIGJ3LT5yYXRlOworCisJYnctPmJ3c3RhcnQudHZfc2VjID0gd2FpdGxlbiAvIDEwMDAwMDBMOworCWJ3LT5id3N0YXJ0LnR2X3VzZWMgPSB3YWl0bGVuICUgMTAwMDAwMEw7CisKKwlpZiAodGltZXJjbXAoJmJ3LT5id3N0YXJ0LCAmYnctPmJ3ZW5kLCA+KSkgeworCQl0aW1lcnN1YigmYnctPmJ3c3RhcnQsICZidy0+YndlbmQsICZidy0+YndlbmQpOworCisJCS8qIEFkanVzdCB0aGUgd2FpdCB0aW1lICovCisJCWlmIChidy0+YndlbmQudHZfc2VjKSB7CisJCQlidy0+dGhyZXNoIC89IDI7CisJCQlpZiAoYnctPnRocmVzaCA8IGJ3LT5idWZsZW4gLyA0KQorCQkJCWJ3LT50aHJlc2ggPSBidy0+YnVmbGVuIC8gNDsKKwkJfSBlbHNlIGlmIChidy0+YndlbmQudHZfdXNlYyA8IDEwMDAwKSB7CisJCQlidy0+dGhyZXNoICo9IDI7CisJCQlpZiAoYnctPnRocmVzaCA+IGJ3LT5idWZsZW4gKiA4KQorCQkJCWJ3LT50aHJlc2ggPSBidy0+YnVmbGVuICogODsKKwkJfQorCisJCVRJTUVWQUxfVE9fVElNRVNQRUMoJmJ3LT5id2VuZCwgJnRzKTsKKwkJd2hpbGUgKG5hbm9zbGVlcCgmdHMsICZybSkgPT0gLTEpIHsKKwkJCWlmIChlcnJubyAhPSBFSU5UUikKKwkJCQlicmVhazsKKwkJCXRzID0gcm07CisJCX0KKwl9CisKKwlidy0+bGFtdCA9IDA7CisJZ2V0dGltZW9mZGF5KCZidy0+YndzdGFydCwgTlVMTCk7Cit9CisKKy8qIE1ha2UgYSB0ZW1wbGF0ZSBmaWxlbmFtZSBmb3IgbWtbc2RddGVtcCgpICovCit2b2lkCitta3RlbXBfcHJvdG8oY2hhciAqcywgc2l6ZV90IGxlbikKK3sKKwljb25zdCBjaGFyICp0bXBkaXI7CisJaW50IHI7CisKKwlpZiAoKHRtcGRpciA9IGdldGVudigiVE1QRElSIikpICE9IE5VTEwpIHsKKwkJciA9IHNucHJpbnRmKHMsIGxlbiwgIiVzL3NzaC1YWFhYWFhYWFhYWFgiLCB0bXBkaXIpOworCQlpZiAociA+IDAgJiYgKHNpemVfdClyIDwgbGVuKQorCQkJcmV0dXJuOworCX0KKwlyID0gc25wcmludGYocywgbGVuLCAiL3RtcC9zc2gtWFhYWFhYWFhYWFhYIik7CisJaWYgKHIgPCAwIHx8IChzaXplX3QpciA+PSBsZW4pCisJCWZhdGFsKCIlczogdGVtcGxhdGUgc3RyaW5nIHRvbyBzaG9ydCIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgdmFsdWU7Cit9IGlwcW9zW10gPSB7CisJeyAiYWYxMSIsIElQVE9TX0RTQ1BfQUYxMSB9LAorCXsgImFmMTIiLCBJUFRPU19EU0NQX0FGMTIgfSwKKwl7ICJhZjEzIiwgSVBUT1NfRFNDUF9BRjEzIH0sCisJeyAiYWYyMSIsIElQVE9TX0RTQ1BfQUYyMSB9LAorCXsgImFmMjIiLCBJUFRPU19EU0NQX0FGMjIgfSwKKwl7ICJhZjIzIiwgSVBUT1NfRFNDUF9BRjIzIH0sCisJeyAiYWYzMSIsIElQVE9TX0RTQ1BfQUYzMSB9LAorCXsgImFmMzIiLCBJUFRPU19EU0NQX0FGMzIgfSwKKwl7ICJhZjMzIiwgSVBUT1NfRFNDUF9BRjMzIH0sCisJeyAiYWY0MSIsIElQVE9TX0RTQ1BfQUY0MSB9LAorCXsgImFmNDIiLCBJUFRPU19EU0NQX0FGNDIgfSwKKwl7ICJhZjQzIiwgSVBUT1NfRFNDUF9BRjQzIH0sCisJeyAiY3MwIiwgSVBUT1NfRFNDUF9DUzAgfSwKKwl7ICJjczEiLCBJUFRPU19EU0NQX0NTMSB9LAorCXsgImNzMiIsIElQVE9TX0RTQ1BfQ1MyIH0sCisJeyAiY3MzIiwgSVBUT1NfRFNDUF9DUzMgfSwKKwl7ICJjczQiLCBJUFRPU19EU0NQX0NTNCB9LAorCXsgImNzNSIsIElQVE9TX0RTQ1BfQ1M1IH0sCisJeyAiY3M2IiwgSVBUT1NfRFNDUF9DUzYgfSwKKwl7ICJjczciLCBJUFRPU19EU0NQX0NTNyB9LAorCXsgImVmIiwgSVBUT1NfRFNDUF9FRiB9LAorCXsgImxvd2RlbGF5IiwgSVBUT1NfTE9XREVMQVkgfSwKKwl7ICJ0aHJvdWdocHV0IiwgSVBUT1NfVEhST1VHSFBVVCB9LAorCXsgInJlbGlhYmlsaXR5IiwgSVBUT1NfUkVMSUFCSUxJVFkgfSwKKwl7IE5VTEwsIC0xIH0KK307CisKK2ludAorcGFyc2VfaXBxb3MoY29uc3QgY2hhciAqY3ApCit7CisJdV9pbnQgaTsKKwljaGFyICplcDsKKwlsb25nIHZhbDsKKworCWlmIChjcCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJZm9yIChpID0gMDsgaXBxb3NbaV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKKwkJaWYgKHN0cmNhc2VjbXAoY3AsIGlwcW9zW2ldLm5hbWUpID09IDApCisJCQlyZXR1cm4gaXBxb3NbaV0udmFsdWU7CisJfQorCS8qIFRyeSBwYXJzaW5nIGFzIGFuIGludGVnZXIgKi8KKwl2YWwgPSBzdHJ0b2woY3AsICZlcCwgMCk7CisJaWYgKCpjcCA9PSAnXDAnIHx8ICplcCAhPSAnXDAnIHx8IHZhbCA8IDAgfHwgdmFsID4gMjU1KQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIHZhbDsKK30KKworY29uc3QgY2hhciAqCitpcHRvczJzdHIoaW50IGlwdG9zKQoreworCWludCBpOworCXN0YXRpYyBjaGFyIGlwdG9zX3N0cltzaXplb2YgIjB4ZmYiXTsKKworCWZvciAoaSA9IDA7IGlwcW9zW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7CisJCWlmIChpcHFvc1tpXS52YWx1ZSA9PSBpcHRvcykKKwkJCXJldHVybiBpcHFvc1tpXS5uYW1lOworCX0KKwlzbnByaW50ZihpcHRvc19zdHIsIHNpemVvZiBpcHRvc19zdHIsICIweCUwMngiLCBpcHRvcyk7CisJcmV0dXJuIGlwdG9zX3N0cjsKK30KK3ZvaWQKK3NvY2tfc2V0X3Y2b25seShpbnQgcykKK3sKKyNpZmRlZiBJUFY2X1Y2T05MWQorCWludCBvbiA9IDE7CisKKwlkZWJ1ZzMoIiVzOiBzZXQgc29ja2V0ICVkIElQVjZfVjZPTkxZIiwgX19mdW5jX18sIHMpOworCWlmIChzZXRzb2Nrb3B0KHMsIElQUFJPVE9fSVBWNiwgSVBWNl9WNk9OTFksICZvbiwgc2l6ZW9mKG9uKSkgPT0gLTEpCisJCWVycm9yKCJzZXRzb2Nrb3B0IElQVjZfVjZPTkxZOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvbWlzYy5oIGIvb3BlbnNzaC02LjBwMS9taXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxNDJhOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvbWlzYy5oCkBAIC0wLDAgKzEsMTA2IEBACisvKiAkT3BlbkJTRDogbWlzYy5oLHYgMS40OCAyMDExLzAzLzI5IDE4OjU0OjE3IHN0ZXZlc2sgRXhwICQgKi8KKworLyoKKyAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAorICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICovCisKKyNpZm5kZWYgX01JU0NfSAorI2RlZmluZSBfTUlTQ19ICisKKy8qIG1pc2MuYyAqLworCitjaGFyCSpjaG9wKGNoYXIgKik7CitjaGFyCSpzdHJkZWxpbShjaGFyICoqKTsKK2ludAkgc2V0X25vbmJsb2NrKGludCk7CitpbnQJIHVuc2V0X25vbmJsb2NrKGludCk7Cit2b2lkCSBzZXRfbm9kZWxheShpbnQpOworaW50CSBhMnBvcnQoY29uc3QgY2hhciAqKTsKK2ludAkgYTJ0dW4oY29uc3QgY2hhciAqLCBpbnQgKik7CitjaGFyCSpwdXRfaG9zdF9wb3J0KGNvbnN0IGNoYXIgKiwgdV9zaG9ydCk7CitjaGFyCSpocGRlbGltKGNoYXIgKiopOworY2hhcgkqY2xlYW5ob3N0bmFtZShjaGFyICopOworY2hhcgkqY29sb24oY2hhciAqKTsKK2xvbmcJIGNvbnZ0aW1lKGNvbnN0IGNoYXIgKik7CitjaGFyCSp0aWxkZV9leHBhbmRfZmlsZW5hbWUoY29uc3QgY2hhciAqLCB1aWRfdCk7CitjaGFyCSpwZXJjZW50X2V4cGFuZChjb25zdCBjaGFyICosIC4uLikgX19hdHRyaWJ1dGVfXygoX19zZW50aW5lbF9fKSk7CitjaGFyCSp0b2hleChjb25zdCB2b2lkICosIHNpemVfdCk7Cit2b2lkCSBzYW5pdGlzZV9zdGRmZCh2b2lkKTsKK3ZvaWQJIG1zX3N1YnRyYWN0X2RpZmYoc3RydWN0IHRpbWV2YWwgKiwgaW50ICopOwordm9pZAkgbXNfdG9fdGltZXZhbChzdHJ1Y3QgdGltZXZhbCAqLCBpbnQpOwordm9pZAkgc29ja19zZXRfdjZvbmx5KGludCk7CisKK3N0cnVjdCBwYXNzd2QgKnB3Y29weShzdHJ1Y3QgcGFzc3dkICopOworY29uc3QgY2hhciAqc3NoX2dhaV9zdHJlcnJvcihpbnQpOworCit0eXBlZGVmIHN0cnVjdCBhcmdsaXN0IGFyZ2xpc3Q7CitzdHJ1Y3QgYXJnbGlzdCB7CisJY2hhciAgICAqKmxpc3Q7CisJdV9pbnQgICBudW07CisJdV9pbnQgICBuYWxsb2M7Cit9Owordm9pZAkgYWRkYXJncyhhcmdsaXN0ICosIGNoYXIgKiwgLi4uKQorCSAgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKK3ZvaWQJIHJlcGxhY2VhcmcoYXJnbGlzdCAqLCB1X2ludCwgY2hhciAqLCAuLi4pCisJICAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAzLCA0KSkpOwordm9pZAkgZnJlZWFyZ3MoYXJnbGlzdCAqKTsKKworaW50CSB0dW5fb3BlbihpbnQsIGludCk7CisKKy8qIENvbW1vbiBkZWZpbml0aW9ucyBmb3Igc3NoIHR1bm5lbCBkZXZpY2UgZm9yd2FyZGluZyAqLworI2RlZmluZSBTU0hfVFVOTU9ERV9OTwkJMHgwMAorI2RlZmluZSBTU0hfVFVOTU9ERV9QT0lOVE9QT0lOVAkweDAxCisjZGVmaW5lIFNTSF9UVU5NT0RFX0VUSEVSTkVUCTB4MDIKKyNkZWZpbmUgU1NIX1RVTk1PREVfREVGQVVMVAlTU0hfVFVOTU9ERV9QT0lOVE9QT0lOVAorI2RlZmluZSBTU0hfVFVOTU9ERV9ZRVMJCShTU0hfVFVOTU9ERV9QT0lOVE9QT0lOVHxTU0hfVFVOTU9ERV9FVEhFUk5FVCkKKworI2RlZmluZSBTU0hfVFVOSURfQU5ZCQkweDdmZmZmZmZmCisjZGVmaW5lIFNTSF9UVU5JRF9FUlIJCShTU0hfVFVOSURfQU5ZIC0gMSkKKyNkZWZpbmUgU1NIX1RVTklEX01BWAkJKFNTSF9UVU5JRF9BTlkgLSAyKQorCisvKiBGdW5jdGlvbnMgdG8gZXh0cmFjdCBvciBzdG9yZSBiaWctZW5kaWFuIHdvcmRzIG9mIHZhcmlvdXMgc2l6ZXMgKi8KK3VfaW50NjRfdAlnZXRfdTY0KGNvbnN0IHZvaWQgKikKKyAgICBfX2F0dHJpYnV0ZV9fKChfX2JvdW5kZWRfXyggX19taW5ieXRlc19fLCAxLCA4KSkpOwordV9pbnQzMl90CWdldF91MzIoY29uc3Qgdm9pZCAqKQorICAgIF9fYXR0cmlidXRlX18oKF9fYm91bmRlZF9fKCBfX21pbmJ5dGVzX18sIDEsIDQpKSk7Cit1X2ludDE2X3QJZ2V0X3UxNihjb25zdCB2b2lkICopCisgICAgX19hdHRyaWJ1dGVfXygoX19ib3VuZGVkX18oIF9fbWluYnl0ZXNfXywgMSwgMikpKTsKK3ZvaWQJCXB1dF91NjQodm9pZCAqLCB1X2ludDY0X3QpCisgICAgX19hdHRyaWJ1dGVfXygoX19ib3VuZGVkX18oIF9fbWluYnl0ZXNfXywgMSwgOCkpKTsKK3ZvaWQJCXB1dF91MzIodm9pZCAqLCB1X2ludDMyX3QpCisgICAgX19hdHRyaWJ1dGVfXygoX19ib3VuZGVkX18oIF9fbWluYnl0ZXNfXywgMSwgNCkpKTsKK3ZvaWQJCXB1dF91MTYodm9pZCAqLCB1X2ludDE2X3QpCisgICAgX19hdHRyaWJ1dGVfXygoX19ib3VuZGVkX18oIF9fbWluYnl0ZXNfXywgMSwgMikpKTsKKworc3RydWN0IGJ3bGltaXQgeworCXNpemVfdCBidWZsZW47CisJdV9pbnQ2NF90IHJhdGUsIHRocmVzaCwgbGFtdDsKKwlzdHJ1Y3QgdGltZXZhbCBid3N0YXJ0LCBid2VuZDsKK307CisKK3ZvaWQgYmFuZHdpZHRoX2xpbWl0X2luaXQoc3RydWN0IGJ3bGltaXQgKiwgdV9pbnQ2NF90LCBzaXplX3QpOwordm9pZCBiYW5kd2lkdGhfbGltaXQoc3RydWN0IGJ3bGltaXQgKiwgc2l6ZV90KTsKKworaW50IHBhcnNlX2lwcW9zKGNvbnN0IGNoYXIgKik7Citjb25zdCBjaGFyICppcHRvczJzdHIoaW50KTsKK3ZvaWQgbWt0ZW1wX3Byb3RvKGNoYXIgKiwgc2l6ZV90KTsKKworLyogcmVhZHBhc3MuYyAqLworCisjZGVmaW5lIFJQX0VDSE8JCQkweDAwMDEKKyNkZWZpbmUgUlBfQUxMT1dfU1RESU4JCTB4MDAwMgorI2RlZmluZSBSUF9BTExPV19FT0YJCTB4MDAwNAorI2RlZmluZSBSUF9VU0VfQVNLUEFTUwkJMHgwMDA4CisKK2NoYXIJKnJlYWRfcGFzc3BocmFzZShjb25zdCBjaGFyICosIGludCk7CitpbnQJIGFza19wZXJtaXNzaW9uKGNvbnN0IGNoYXIgKiwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpOworaW50CSByZWFkX2tleWZpbGVfbGluZShGSUxFICosIGNvbnN0IGNoYXIgKiwgY2hhciAqLCBzaXplX3QsIHVfbG9uZyAqKTsKKworI2VuZGlmIC8qIF9NSVNDX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvbWtpbnN0YWxsZGlycyBiL29wZW5zc2gtNi4wcDEvbWtpbnN0YWxsZGlycwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40N2Q1ZjQzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9ta2luc3RhbGxkaXJzCkBAIC0wLDAgKzEsNDAgQEAKKyMhIC9iaW4vc2gKKyMgbWtpbnN0YWxsZGlycyAtLS0gbWFrZSBkaXJlY3RvcnkgaGllcmFyY2h5CisjIEF1dGhvcjogTm9haCBGcmllZG1hbiA8ZnJpZWRtYW5AcHJlcC5haS5taXQuZWR1PgorIyBDcmVhdGVkOiAxOTkzLTA1LTE2CisjIFB1YmxpYyBkb21haW4KKworIyAkSWQ6IG1raW5zdGFsbGRpcnMsdiAxLjIgMjAwMy8xMS8yMSAxMjo0ODo1NSBkam0gRXhwICQKKworZXJyc3RhdHVzPTAKKworZm9yIGZpbGUKK2RvCisgICBzZXQgZm5vcmQgYGVjaG8gIjokZmlsZSIgfCBzZWQgLW5lICdzL146XC8vIy87cy9eOi8vO3MvXC8vIC9nO3MvXiMvXC8vO3AnYAorICAgc2hpZnQKKworICAgcGF0aGNvbXA9CisgICBmb3IgZAorICAgZG8KKyAgICAgcGF0aGNvbXA9IiRwYXRoY29tcCRkIgorICAgICBjYXNlICIkcGF0aGNvbXAiIGluCisgICAgICAgLSogKSBwYXRoY29tcD0uLyRwYXRoY29tcCA7OworICAgICBlc2FjCisKKyAgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCisJZWNobyAibWtkaXIgJHBhdGhjb21wIgorCisJbWtkaXIgIiRwYXRoY29tcCIgfHwgbGFzdGVycj0kPworCisJaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCisJICBlcnJzdGF0dXM9JGxhc3RlcnIKKwlmaQorICAgICBmaQorCisgICAgIHBhdGhjb21wPSIkcGF0aGNvbXAvIgorICAgZG9uZQorZG9uZQorCitleGl0ICRlcnJzdGF0dXMKKworIyBta2luc3RhbGxkaXJzIGVuZHMgaGVyZQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9tb2R1bGkgYi9vcGVuc3NoLTYuMHAxL21vZHVsaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDA2YWQzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9tb2R1bGkKQEAgLTAsMCArMSwxODEgQEAKKyMgICAgJE9wZW5CU0Q6IG1vZHVsaSx2IDEuNiAyMDExLzExLzA0IDAwOjA5OjM5IGR0dWNrZXIgRXhwICQKKyMgVGltZSBUeXBlIFRlc3RzIFRyaWVzIFNpemUgR2VuZXJhdG9yIE1vZHVsdXMKKzIwMTExMDE2MTEyODUyIDIgNiAxMDAgMTAyMyAyIEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzIwQjMzNDMKKzIwMTExMDE2MTEyODUzIDIgNiAxMDAgMTAyMyAyIEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzIwRTgxNUIKKzIwMTExMDE2MTEyODU3IDIgNiAxMDAgMTAyMyA1IEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzIyN0I5MzcKKzIwMTExMDE2MTEyODU4IDIgNiAxMDAgMTAyMyA1IEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzIyOTUxREYKKzIwMTExMDE2MTEyOTAxIDIgNiAxMDAgMTAyMyA1IEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzIzMjAxM0YKKzIwMTExMDE2MTEyOTA3IDIgNiAxMDAgMTAyMyAyIEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzI1RUE2OEIKKzIwMTExMDE2MTEyOTEwIDIgNiAxMDAgMTAyMyAyIEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzI2RTlDQTMKKzIwMTExMDE2MTEyOTEyIDIgNiAxMDAgMTAyMyA1IEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzI2RjVDN0YKKzIwMTExMDE2MTEyOTE1IDIgNiAxMDAgMTAyMyAyIEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzI3RUMwRjMKKzIwMTExMDE2MTEyOTE4IDIgNiAxMDAgMTAyMyAyIEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzI4RTQ4ODMKKzIwMTExMDE2MTEyOTE5IDIgNiAxMDAgMTAyMyAyIEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzI5MzkwN0IKKzIwMTExMDE2MTEyOTIwIDIgNiAxMDAgMTAyMyAyIEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzI5M0YyRDMKKzIwMTExMDE2MTEyOTIyIDIgNiAxMDAgMTAyMyA1IEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzI5QzNDOUYKKzIwMTExMDE2MTEyOTI0IDIgNiAxMDAgMTAyMyAyIEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzJBMDIwRjMKKzIwMTExMDE2MTEyOTI3IDIgNiAxMDAgMTAyMyAyIEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzJCMkU1MkIKKzIwMTExMDE2MTEyOTMyIDIgNiAxMDAgMTAyMyA1IEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzJEMUY4QTcKKzIwMTExMDE2MTEyOTM2IDIgNiAxMDAgMTAyMyA1IEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzJFNTJBOEYKKzIwMTExMDE2MTEyOTM5IDIgNiAxMDAgMTAyMyA1IEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzJGNTMxRkYKKzIwMTExMDE2MTEyOTQwIDIgNiAxMDAgMTAyMyAyIEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzJGOEExODMKKzIwMTExMDE2MTEyOTQyIDIgNiAxMDAgMTAyMyAyIEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzJGQUZGODMKKzIwMTExMDE2MTEyOTQzIDIgNiAxMDAgMTAyMyA1IEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzJGQkE1NjcKKzIwMTExMDE2MTEyOTQ0IDIgNiAxMDAgMTAyMyA1IEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzJGRjVFQkYKKzIwMTExMDE2MTEyOTQ2IDIgNiAxMDAgMTAyMyA1IEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzMwODM3RDcKKzIwMTExMDE2MTEyOTQ4IDIgNiAxMDAgMTAyMyAyIEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzMwRjdCOUIKKzIwMTExMDE2MTEyOTQ5IDIgNiAxMDAgMTAyMyAyIEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzMxMDdBNkIKKzIwMTExMDE2MTEyOTU2IDIgNiAxMDAgMTAyMyAyIEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzMzQkQwODMKKzIwMTExMDE2MTEyOTU4IDIgNiAxMDAgMTAyMyAyIEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzMzRTg0MzMKKzIwMTExMDE2MTEzMDAyIDIgNiAxMDAgMTAyMyAyIEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzM1MzFFNEIKKzIwMTExMDE2MTEzMDA1IDIgNiAxMDAgMTAyMyAyIEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzM2OERGMEIKKzIwMTExMDE2MTEzMDA2IDIgNiAxMDAgMTAyMyA1IEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzM2OUU3MTcKKzIwMTExMDE2MTEzMDA5IDIgNiAxMDAgMTAyMyA1IEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzM3MjYxNjcKKzIwMTExMDE2MTEzMDE1IDIgNiAxMDAgMTAyMyAyIEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzM5RkFFNkIKKzIwMTExMDE2MTEzMDE5IDIgNiAxMDAgMTAyMyAyIEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzNCMDU3MzMKKzIwMTExMDE2MTEzMDIzIDIgNiAxMDAgMTAyMyA1IEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzNDODM0MkYKKzIwMTExMDE2MTEzMDI1IDIgNiAxMDAgMTAyMyA1IEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzNEMEEyNEYKKzIwMTExMDE2MTEzMDI5IDIgNiAxMDAgMTAyMyAyIEZCOUFGRUIyOTc1MjREMUE3QTM0QTRCNjdDRUYwOTMzMkRFMUNCMDU3MTExODIyMTA0MjVBMDVEMzU3NkU3NUJFQjNBM0QzQ0M5OTM4OTYwOUU1NDM0REJDNkNGRjZFQ0FENkI1NEY0MzUxQzREMEJBQjNCRUREMkFFOTM2QUZEMjIyMjZDNjIyNTRCOEM4QzBFRDgxODlDMENDNTQ2MzQ5NTZGOTM2MDAzNTE2MTBBM0VBRjYwQzBGREJDRDYxMzg0RkIxNjFCRTUwRTBGMEJCMEYxQUM1MjIwNDRFNDQzNjE4NzBENkEyQkM4NzFCQzk0QjUyOUVBQzNFRDExNEIKKzIwMTExMDE2MTEzNTU3IDIgNiAxMDAgMTUzNSAyIEY2MjE5MUExNzBFQzYxNzFDNjIwRDNCMzM0OTUyRjIyMDA3N0FBNUMwRkE3RjFBN0ZFMDhDNkI3QjBDNUY4NjVDREIyNDM0NkUzQkUwNUI5OUUyRDdGQ0MzNTgyRDBEMkQ2Mzc2NzJFQjBFQjFEQkI5NUJDRTFBMENBNTRERkM4M0VCRjU5OEEyNDkyOENBNDJBNUFCQzJBRTc1RTk4MDI0NTFCMEM5RTE4MEQ1RDUyNjk4REFBRjc5REEzQjk2OEY3MkI0OERBMUQwNDI0NkVBMDdDMkZBRDM2NzM5MkM0NThEMzRGQTE3REFBMDRDMjI5NzVFNDE3QUJEMThGQzY0MDdEMEEwNDMwMEQ1MjFBOEE4NjdGRTg1MEVCOUJBNkYxQUQzMjA4NDg1NkFBRkRFMTEyMjQ3RjIwNTc5Rjc0OTUwRUZBMzZBODAzQTQ3MTM0QkJGMDI0RjU2MURERTkwMDQyQTVBRjI1NDdFRDk1MjBCRTc3QUZCMTA0ODA0MworMjAxMTEwMTYxMTM2MTggMiA2IDEwMCAxNTM1IDUgRjYyMTkxQTE3MEVDNjE3MUM2MjBEM0IzMzQ5NTJGMjIwMDc3QUE1QzBGQTdGMUE3RkUwOEM2QjdCMEM1Rjg2NUNEQjI0MzQ2RTNCRTA1Qjk5RTJEN0ZDQzM1ODJEMEQyRDYzNzY3MkVCMEVCMURCQjk1QkNFMUEwQ0E1NERGQzgzRUJGNTk4QTI0OTI4Q0E0MkE1QUJDMkFFNzVFOTgwMjQ1MUIwQzlFMTgwRDVENTI2OThEQUFGNzlEQTNCOTY4RjcyQjQ4REExRDA0MjQ2RUEwN0MyRkFEMzY3MzkyQzQ1OEQzNEZBMTdEQUEwNEMyMjk3NUU0MTdBQkQxOEZDNjQwN0QwQTA0MzAwRDUyMUE4QTg2N0ZFODUwRUI5QkE2RjFBRDMyMDg0ODU2QUFGREUxMTIyNDdGMjA1NzlGNzQ5NTBFRkEzNkE4MDNBNDcxMzRCQkYwMjRGNTYxRERFOTAwNDJBNUFGMjU0N0VEOTUyMEJFNzdBRkIxMzM4QkZGCisyMDExMTAxNjExMzYyNyAyIDYgMTAwIDE1MzUgMiBGNjIxOTFBMTcwRUM2MTcxQzYyMEQzQjMzNDk1MkYyMjAwNzdBQTVDMEZBN0YxQTdGRTA4QzZCN0IwQzVGODY1Q0RCMjQzNDZFM0JFMDVCOTlFMkQ3RkNDMzU4MkQwRDJENjM3NjcyRUIwRUIxREJCOTVCQ0UxQTBDQTU0REZDODNFQkY1OThBMjQ5MjhDQTQyQTVBQkMyQUU3NUU5ODAyNDUxQjBDOUUxODBENUQ1MjY5OERBQUY3OURBM0I5NjhGNzJCNDhEQTFEMDQyNDZFQTA3QzJGQUQzNjczOTJDNDU4RDM0RkExN0RBQTA0QzIyOTc1RTQxN0FCRDE4RkM2NDA3RDBBMDQzMDBENTIxQThBODY3RkU4NTBFQjlCQTZGMUFEMzIwODQ4NTZBQUZERTExMjI0N0YyMDU3OUY3NDk1MEVGQTM2QTgwM0E0NzEzNEJCRjAyNEY1NjFEREU5MDA0MkE1QUYyNTQ3RUQ5NTIwQkU3N0FGQjE0MEVFRTMKKzIwMTExMDE2MTEzNjQwIDIgNiAxMDAgMTUzNSA1IEY2MjE5MUExNzBFQzYxNzFDNjIwRDNCMzM0OTUyRjIyMDA3N0FBNUMwRkE3RjFBN0ZFMDhDNkI3QjBDNUY4NjVDREIyNDM0NkUzQkUwNUI5OUUyRDdGQ0MzNTgyRDBEMkQ2Mzc2NzJFQjBFQjFEQkI5NUJDRTFBMENBNTRERkM4M0VCRjU5OEEyNDkyOENBNDJBNUFCQzJBRTc1RTk4MDI0NTFCMEM5RTE4MEQ1RDUyNjk4REFBRjc5REEzQjk2OEY3MkI0OERBMUQwNDI0NkVBMDdDMkZBRDM2NzM5MkM0NThEMzRGQTE3REFBMDRDMjI5NzVFNDE3QUJEMThGQzY0MDdEMEEwNDMwMEQ1MjFBOEE4NjdGRTg1MEVCOUJBNkYxQUQzMjA4NDg1NkFBRkRFMTEyMjQ3RjIwNTc5Rjc0OTUwRUZBMzZBODAzQTQ3MTM0QkJGMDI0RjU2MURERTkwMDQyQTVBRjI1NDdFRDk1MjBCRTc3QUZCMTVCMjAxRgorMjAxMTEwMTYxMTM2NDUgMiA2IDEwMCAxNTM1IDIgRjYyMTkxQTE3MEVDNjE3MUM2MjBEM0IzMzQ5NTJGMjIwMDc3QUE1QzBGQTdGMUE3RkUwOEM2QjdCMEM1Rjg2NUNEQjI0MzQ2RTNCRTA1Qjk5RTJEN0ZDQzM1ODJEMEQyRDYzNzY3MkVCMEVCMURCQjk1QkNFMUEwQ0E1NERGQzgzRUJGNTk4QTI0OTI4Q0E0MkE1QUJDMkFFNzVFOTgwMjQ1MUIwQzlFMTgwRDVENTI2OThEQUFGNzlEQTNCOTY4RjcyQjQ4REExRDA0MjQ2RUEwN0MyRkFEMzY3MzkyQzQ1OEQzNEZBMTdEQUEwNEMyMjk3NUU0MTdBQkQxOEZDNjQwN0QwQTA0MzAwRDUyMUE4QTg2N0ZFODUwRUI5QkE2RjFBRDMyMDg0ODU2QUFGREUxMTIyNDdGMjA1NzlGNzQ5NTBFRkEzNkE4MDNBNDcxMzRCQkYwMjRGNTYxRERFOTAwNDJBNUFGMjU0N0VEOTUyMEJFNzdBRkIxNjA1QzZCCisyMDExMTAxNjExMzY1MSAyIDYgMTAwIDE1MzUgMiBGNjIxOTFBMTcwRUM2MTcxQzYyMEQzQjMzNDk1MkYyMjAwNzdBQTVDMEZBN0YxQTdGRTA4QzZCN0IwQzVGODY1Q0RCMjQzNDZFM0JFMDVCOTlFMkQ3RkNDMzU4MkQwRDJENjM3NjcyRUIwRUIxREJCOTVCQ0UxQTBDQTU0REZDODNFQkY1OThBMjQ5MjhDQTQyQTVBQkMyQUU3NUU5ODAyNDUxQjBDOUUxODBENUQ1MjY5OERBQUY3OURBM0I5NjhGNzJCNDhEQTFEMDQyNDZFQTA3QzJGQUQzNjczOTJDNDU4RDM0RkExN0RBQTA0QzIyOTc1RTQxN0FCRDE4RkM2NDA3RDBBMDQzMDBENTIxQThBODY3RkU4NTBFQjlCQTZGMUFEMzIwODQ4NTZBQUZERTExMjI0N0YyMDU3OUY3NDk1MEVGQTM2QTgwM0E0NzEzNEJCRjAyNEY1NjFEREU5MDA0MkE1QUYyNTQ3RUQ5NTIwQkU3N0FGQjE2NzBEMjMKKzIwMTExMDE2MTEzNzAwIDIgNiAxMDAgMTUzNSA1IEY2MjE5MUExNzBFQzYxNzFDNjIwRDNCMzM0OTUyRjIyMDA3N0FBNUMwRkE3RjFBN0ZFMDhDNkI3QjBDNUY4NjVDREIyNDM0NkUzQkUwNUI5OUUyRDdGQ0MzNTgyRDBEMkQ2Mzc2NzJFQjBFQjFEQkI5NUJDRTFBMENBNTRERkM4M0VCRjU5OEEyNDkyOENBNDJBNUFCQzJBRTc1RTk4MDI0NTFCMEM5RTE4MEQ1RDUyNjk4REFBRjc5REEzQjk2OEY3MkI0OERBMUQwNDI0NkVBMDdDMkZBRDM2NzM5MkM0NThEMzRGQTE3REFBMDRDMjI5NzVFNDE3QUJEMThGQzY0MDdEMEEwNDMwMEQ1MjFBOEE4NjdGRTg1MEVCOUJBNkYxQUQzMjA4NDg1NkFBRkRFMTEyMjQ3RjIwNTc5Rjc0OTUwRUZBMzZBODAzQTQ3MTM0QkJGMDI0RjU2MURERTkwMDQyQTVBRjI1NDdFRDk1MjBCRTc3QUZCMTc3ODNGRgorMjAxMTEwMTYxMTM3MDUgMiA2IDEwMCAxNTM1IDIgRjYyMTkxQTE3MEVDNjE3MUM2MjBEM0IzMzQ5NTJGMjIwMDc3QUE1QzBGQTdGMUE3RkUwOEM2QjdCMEM1Rjg2NUNEQjI0MzQ2RTNCRTA1Qjk5RTJEN0ZDQzM1ODJEMEQyRDYzNzY3MkVCMEVCMURCQjk1QkNFMUEwQ0E1NERGQzgzRUJGNTk4QTI0OTI4Q0E0MkE1QUJDMkFFNzVFOTgwMjQ1MUIwQzlFMTgwRDVENTI2OThEQUFGNzlEQTNCOTY4RjcyQjQ4REExRDA0MjQ2RUEwN0MyRkFEMzY3MzkyQzQ1OEQzNEZBMTdEQUEwNEMyMjk3NUU0MTdBQkQxOEZDNjQwN0QwQTA0MzAwRDUyMUE4QTg2N0ZFODUwRUI5QkE2RjFBRDMyMDg0ODU2QUFGREUxMTIyNDdGMjA1NzlGNzQ5NTBFRkEzNkE4MDNBNDcxMzRCQkYwMjRGNTYxRERFOTAwNDJBNUFGMjU0N0VEOTUyMEJFNzdBRkIxN0MxMUEzCisyMDExMTAxNjExMzcwOSAyIDYgMTAwIDE1MzUgMiBGNjIxOTFBMTcwRUM2MTcxQzYyMEQzQjMzNDk1MkYyMjAwNzdBQTVDMEZBN0YxQTdGRTA4QzZCN0IwQzVGODY1Q0RCMjQzNDZFM0JFMDVCOTlFMkQ3RkNDMzU4MkQwRDJENjM3NjcyRUIwRUIxREJCOTVCQ0UxQTBDQTU0REZDODNFQkY1OThBMjQ5MjhDQTQyQTVBQkMyQUU3NUU5ODAyNDUxQjBDOUUxODBENUQ1MjY5OERBQUY3OURBM0I5NjhGNzJCNDhEQTFEMDQyNDZFQTA3QzJGQUQzNjczOTJDNDU4RDM0RkExN0RBQTA0QzIyOTc1RTQxN0FCRDE4RkM2NDA3RDBBMDQzMDBENTIxQThBODY3RkU4NTBFQjlCQTZGMUFEMzIwODQ4NTZBQUZERTExMjI0N0YyMDU3OUY3NDk1MEVGQTM2QTgwM0E0NzEzNEJCRjAyNEY1NjFEREU5MDA0MkE1QUYyNTQ3RUQ5NTIwQkU3N0FGQjE3REI4QkIKKzIwMTExMDE2MTEzNzE1IDIgNiAxMDAgMTUzNSAyIEY2MjE5MUExNzBFQzYxNzFDNjIwRDNCMzM0OTUyRjIyMDA3N0FBNUMwRkE3RjFBN0ZFMDhDNkI3QjBDNUY4NjVDREIyNDM0NkUzQkUwNUI5OUUyRDdGQ0MzNTgyRDBEMkQ2Mzc2NzJFQjBFQjFEQkI5NUJDRTFBMENBNTRERkM4M0VCRjU5OEEyNDkyOENBNDJBNUFCQzJBRTc1RTk4MDI0NTFCMEM5RTE4MEQ1RDUyNjk4REFBRjc5REEzQjk2OEY3MkI0OERBMUQwNDI0NkVBMDdDMkZBRDM2NzM5MkM0NThEMzRGQTE3REFBMDRDMjI5NzVFNDE3QUJEMThGQzY0MDdEMEEwNDMwMEQ1MjFBOEE4NjdGRTg1MEVCOUJBNkYxQUQzMjA4NDg1NkFBRkRFMTEyMjQ3RjIwNTc5Rjc0OTUwRUZBMzZBODAzQTQ3MTM0QkJGMDI0RjU2MURERTkwMDQyQTVBRjI1NDdFRDk1MjBCRTc3QUZCMTg2NDBCQgorMjAxMTEwMTYxMTM4MDEgMiA2IDEwMCAxNTM1IDUgRjYyMTkxQTE3MEVDNjE3MUM2MjBEM0IzMzQ5NTJGMjIwMDc3QUE1QzBGQTdGMUE3RkUwOEM2QjdCMEM1Rjg2NUNEQjI0MzQ2RTNCRTA1Qjk5RTJEN0ZDQzM1ODJEMEQyRDYzNzY3MkVCMEVCMURCQjk1QkNFMUEwQ0E1NERGQzgzRUJGNTk4QTI0OTI4Q0E0MkE1QUJDMkFFNzVFOTgwMjQ1MUIwQzlFMTgwRDVENTI2OThEQUFGNzlEQTNCOTY4RjcyQjQ4REExRDA0MjQ2RUEwN0MyRkFEMzY3MzkyQzQ1OEQzNEZBMTdEQUEwNEMyMjk3NUU0MTdBQkQxOEZDNjQwN0QwQTA0MzAwRDUyMUE4QTg2N0ZFODUwRUI5QkE2RjFBRDMyMDg0ODU2QUFGREUxMTIyNDdGMjA1NzlGNzQ5NTBFRkEzNkE4MDNBNDcxMzRCQkYwMjRGNTYxRERFOTAwNDJBNUFGMjU0N0VEOTUyMEJFNzdBRkIxRjI3MjE3CisyMDExMTAxNjExMzgxMiAyIDYgMTAwIDE1MzUgMiBGNjIxOTFBMTcwRUM2MTcxQzYyMEQzQjMzNDk1MkYyMjAwNzdBQTVDMEZBN0YxQTdGRTA4QzZCN0IwQzVGODY1Q0RCMjQzNDZFM0JFMDVCOTlFMkQ3RkNDMzU4MkQwRDJENjM3NjcyRUIwRUIxREJCOTVCQ0UxQTBDQTU0REZDODNFQkY1OThBMjQ5MjhDQTQyQTVBQkMyQUU3NUU5ODAyNDUxQjBDOUUxODBENUQ1MjY5OERBQUY3OURBM0I5NjhGNzJCNDhEQTFEMDQyNDZFQTA3QzJGQUQzNjczOTJDNDU4RDM0RkExN0RBQTA0QzIyOTc1RTQxN0FCRDE4RkM2NDA3RDBBMDQzMDBENTIxQThBODY3RkU4NTBFQjlCQTZGMUFEMzIwODQ4NTZBQUZERTExMjI0N0YyMDU3OUY3NDk1MEVGQTM2QTgwM0E0NzEzNEJCRjAyNEY1NjFEREU5MDA0MkE1QUYyNTQ3RUQ5NTIwQkU3N0FGQjIwNTdDNjMKKzIwMTExMDE2MTEzODE5IDIgNiAxMDAgMTUzNSA1IEY2MjE5MUExNzBFQzYxNzFDNjIwRDNCMzM0OTUyRjIyMDA3N0FBNUMwRkE3RjFBN0ZFMDhDNkI3QjBDNUY4NjVDREIyNDM0NkUzQkUwNUI5OUUyRDdGQ0MzNTgyRDBEMkQ2Mzc2NzJFQjBFQjFEQkI5NUJDRTFBMENBNTRERkM4M0VCRjU5OEEyNDkyOENBNDJBNUFCQzJBRTc1RTk4MDI0NTFCMEM5RTE4MEQ1RDUyNjk4REFBRjc5REEzQjk2OEY3MkI0OERBMUQwNDI0NkVBMDdDMkZBRDM2NzM5MkM0NThEMzRGQTE3REFBMDRDMjI5NzVFNDE3QUJEMThGQzY0MDdEMEEwNDMwMEQ1MjFBOEE4NjdGRTg1MEVCOUJBNkYxQUQzMjA4NDg1NkFBRkRFMTEyMjQ3RjIwNTc5Rjc0OTUwRUZBMzZBODAzQTQ3MTM0QkJGMDI0RjU2MURERTkwMDQyQTVBRjI1NDdFRDk1MjBCRTc3QUZCMjEyMkJBNworMjAxMTEwMTYxMTM4MjkgMiA2IDEwMCAxNTM1IDIgRjYyMTkxQTE3MEVDNjE3MUM2MjBEM0IzMzQ5NTJGMjIwMDc3QUE1QzBGQTdGMUE3RkUwOEM2QjdCMEM1Rjg2NUNEQjI0MzQ2RTNCRTA1Qjk5RTJEN0ZDQzM1ODJEMEQyRDYzNzY3MkVCMEVCMURCQjk1QkNFMUEwQ0E1NERGQzgzRUJGNTk4QTI0OTI4Q0E0MkE1QUJDMkFFNzVFOTgwMjQ1MUIwQzlFMTgwRDVENTI2OThEQUFGNzlEQTNCOTY4RjcyQjQ4REExRDA0MjQ2RUEwN0MyRkFEMzY3MzkyQzQ1OEQzNEZBMTdEQUEwNEMyMjk3NUU0MTdBQkQxOEZDNjQwN0QwQTA0MzAwRDUyMUE4QTg2N0ZFODUwRUI5QkE2RjFBRDMyMDg0ODU2QUFGREUxMTIyNDdGMjA1NzlGNzQ5NTBFRkEzNkE4MDNBNDcxMzRCQkYwMjRGNTYxRERFOTAwNDJBNUFGMjU0N0VEOTUyMEJFNzdBRkIyMjE0MjYzCisyMDExMTAxNjExMzkwNCAyIDYgMTAwIDE1MzUgMiBGNjIxOTFBMTcwRUM2MTcxQzYyMEQzQjMzNDk1MkYyMjAwNzdBQTVDMEZBN0YxQTdGRTA4QzZCN0IwQzVGODY1Q0RCMjQzNDZFM0JFMDVCOTlFMkQ3RkNDMzU4MkQwRDJENjM3NjcyRUIwRUIxREJCOTVCQ0UxQTBDQTU0REZDODNFQkY1OThBMjQ5MjhDQTQyQTVBQkMyQUU3NUU5ODAyNDUxQjBDOUUxODBENUQ1MjY5OERBQUY3OURBM0I5NjhGNzJCNDhEQTFEMDQyNDZFQTA3QzJGQUQzNjczOTJDNDU4RDM0RkExN0RBQTA0QzIyOTc1RTQxN0FCRDE4RkM2NDA3RDBBMDQzMDBENTIxQThBODY3RkU4NTBFQjlCQTZGMUFEMzIwODQ4NTZBQUZERTExMjI0N0YyMDU3OUY3NDk1MEVGQTM2QTgwM0E0NzEzNEJCRjAyNEY1NjFEREU5MDA0MkE1QUYyNTQ3RUQ5NTIwQkU3N0FGQjI3NjIxQjMKKzIwMTExMDE2MTEzOTEyIDIgNiAxMDAgMTUzNSA1IEY2MjE5MUExNzBFQzYxNzFDNjIwRDNCMzM0OTUyRjIyMDA3N0FBNUMwRkE3RjFBN0ZFMDhDNkI3QjBDNUY4NjVDREIyNDM0NkUzQkUwNUI5OUUyRDdGQ0MzNTgyRDBEMkQ2Mzc2NzJFQjBFQjFEQkI5NUJDRTFBMENBNTRERkM4M0VCRjU5OEEyNDkyOENBNDJBNUFCQzJBRTc1RTk4MDI0NTFCMEM5RTE4MEQ1RDUyNjk4REFBRjc5REEzQjk2OEY3MkI0OERBMUQwNDI0NkVBMDdDMkZBRDM2NzM5MkM0NThEMzRGQTE3REFBMDRDMjI5NzVFNDE3QUJEMThGQzY0MDdEMEEwNDMwMEQ1MjFBOEE4NjdGRTg1MEVCOUJBNkYxQUQzMjA4NDg1NkFBRkRFMTEyMjQ3RjIwNTc5Rjc0OTUwRUZBMzZBODAzQTQ3MTM0QkJGMDI0RjU2MURERTkwMDQyQTVBRjI1NDdFRDk1MjBCRTc3QUZCMjdGOENFNworMjAxMTEwMTYxMTM5NDAgMiA2IDEwMCAxNTM1IDIgRjYyMTkxQTE3MEVDNjE3MUM2MjBEM0IzMzQ5NTJGMjIwMDc3QUE1QzBGQTdGMUE3RkUwOEM2QjdCMEM1Rjg2NUNEQjI0MzQ2RTNCRTA1Qjk5RTJEN0ZDQzM1ODJEMEQyRDYzNzY3MkVCMEVCMURCQjk1QkNFMUEwQ0E1NERGQzgzRUJGNTk4QTI0OTI4Q0E0MkE1QUJDMkFFNzVFOTgwMjQ1MUIwQzlFMTgwRDVENTI2OThEQUFGNzlEQTNCOTY4RjcyQjQ4REExRDA0MjQ2RUEwN0MyRkFEMzY3MzkyQzQ1OEQzNEZBMTdEQUEwNEMyMjk3NUU0MTdBQkQxOEZDNjQwN0QwQTA0MzAwRDUyMUE4QTg2N0ZFODUwRUI5QkE2RjFBRDMyMDg0ODU2QUFGREUxMTIyNDdGMjA1NzlGNzQ5NTBFRkEzNkE4MDNBNDcxMzRCQkYwMjRGNTYxRERFOTAwNDJBNUFGMjU0N0VEOTUyMEJFNzdBRkIyQkZCMzNCCisyMDExMTAxNjExMzk0OCAyIDYgMTAwIDE1MzUgMiBGNjIxOTFBMTcwRUM2MTcxQzYyMEQzQjMzNDk1MkYyMjAwNzdBQTVDMEZBN0YxQTdGRTA4QzZCN0IwQzVGODY1Q0RCMjQzNDZFM0JFMDVCOTlFMkQ3RkNDMzU4MkQwRDJENjM3NjcyRUIwRUIxREJCOTVCQ0UxQTBDQTU0REZDODNFQkY1OThBMjQ5MjhDQTQyQTVBQkMyQUU3NUU5ODAyNDUxQjBDOUUxODBENUQ1MjY5OERBQUY3OURBM0I5NjhGNzJCNDhEQTFEMDQyNDZFQTA3QzJGQUQzNjczOTJDNDU4RDM0RkExN0RBQTA0QzIyOTc1RTQxN0FCRDE4RkM2NDA3RDBBMDQzMDBENTIxQThBODY3RkU4NTBFQjlCQTZGMUFEMzIwODQ4NTZBQUZERTExMjI0N0YyMDU3OUY3NDk1MEVGQTM2QTgwM0E0NzEzNEJCRjAyNEY1NjFEREU5MDA0MkE1QUYyNTQ3RUQ5NTIwQkU3N0FGQjJDQ0U5NUIKKzIwMTExMDE2MTE0MDM0IDIgNiAxMDAgMTUzNSA1IEY2MjE5MUExNzBFQzYxNzFDNjIwRDNCMzM0OTUyRjIyMDA3N0FBNUMwRkE3RjFBN0ZFMDhDNkI3QjBDNUY4NjVDREIyNDM0NkUzQkUwNUI5OUUyRDdGQ0MzNTgyRDBEMkQ2Mzc2NzJFQjBFQjFEQkI5NUJDRTFBMENBNTRERkM4M0VCRjU5OEEyNDkyOENBNDJBNUFCQzJBRTc1RTk4MDI0NTFCMEM5RTE4MEQ1RDUyNjk4REFBRjc5REEzQjk2OEY3MkI0OERBMUQwNDI0NkVBMDdDMkZBRDM2NzM5MkM0NThEMzRGQTE3REFBMDRDMjI5NzVFNDE3QUJEMThGQzY0MDdEMEEwNDMwMEQ1MjFBOEE4NjdGRTg1MEVCOUJBNkYxQUQzMjA4NDg1NkFBRkRFMTEyMjQ3RjIwNTc5Rjc0OTUwRUZBMzZBODAzQTQ3MTM0QkJGMDI0RjU2MURERTkwMDQyQTVBRjI1NDdFRDk1MjBCRTc3QUZCMzNCMzE1RgorMjAxMTEwMTYxMTQwNTMgMiA2IDEwMCAxNTM1IDUgRjYyMTkxQTE3MEVDNjE3MUM2MjBEM0IzMzQ5NTJGMjIwMDc3QUE1QzBGQTdGMUE3RkUwOEM2QjdCMEM1Rjg2NUNEQjI0MzQ2RTNCRTA1Qjk5RTJEN0ZDQzM1ODJEMEQyRDYzNzY3MkVCMEVCMURCQjk1QkNFMUEwQ0E1NERGQzgzRUJGNTk4QTI0OTI4Q0E0MkE1QUJDMkFFNzVFOTgwMjQ1MUIwQzlFMTgwRDVENTI2OThEQUFGNzlEQTNCOTY4RjcyQjQ4REExRDA0MjQ2RUEwN0MyRkFEMzY3MzkyQzQ1OEQzNEZBMTdEQUEwNEMyMjk3NUU0MTdBQkQxOEZDNjQwN0QwQTA0MzAwRDUyMUE4QTg2N0ZFODUwRUI5QkE2RjFBRDMyMDg0ODU2QUFGREUxMTIyNDdGMjA1NzlGNzQ5NTBFRkEzNkE4MDNBNDcxMzRCQkYwMjRGNTYxRERFOTAwNDJBNUFGMjU0N0VEOTUyMEJFNzdBRkIzNjI2M0U3CisyMDExMTAxNjExNDA1NyAyIDYgMTAwIDE1MzUgNSBGNjIxOTFBMTcwRUM2MTcxQzYyMEQzQjMzNDk1MkYyMjAwNzdBQTVDMEZBN0YxQTdGRTA4QzZCN0IwQzVGODY1Q0RCMjQzNDZFM0JFMDVCOTlFMkQ3RkNDMzU4MkQwRDJENjM3NjcyRUIwRUIxREJCOTVCQ0UxQTBDQTU0REZDODNFQkY1OThBMjQ5MjhDQTQyQTVBQkMyQUU3NUU5ODAyNDUxQjBDOUUxODBENUQ1MjY5OERBQUY3OURBM0I5NjhGNzJCNDhEQTFEMDQyNDZFQTA3QzJGQUQzNjczOTJDNDU4RDM0RkExN0RBQTA0QzIyOTc1RTQxN0FCRDE4RkM2NDA3RDBBMDQzMDBENTIxQThBODY3RkU4NTBFQjlCQTZGMUFEMzIwODQ4NTZBQUZERTExMjI0N0YyMDU3OUY3NDk1MEVGQTM2QTgwM0E0NzEzNEJCRjAyNEY1NjFEREU5MDA0MkE1QUYyNTQ3RUQ5NTIwQkU3N0FGQjM2MkUyNzcKKzIwMTExMDE2MTE0MTIyIDIgNiAxMDAgMTUzNSAyIEY2MjE5MUExNzBFQzYxNzFDNjIwRDNCMzM0OTUyRjIyMDA3N0FBNUMwRkE3RjFBN0ZFMDhDNkI3QjBDNUY4NjVDREIyNDM0NkUzQkUwNUI5OUUyRDdGQ0MzNTgyRDBEMkQ2Mzc2NzJFQjBFQjFEQkI5NUJDRTFBMENBNTRERkM4M0VCRjU5OEEyNDkyOENBNDJBNUFCQzJBRTc1RTk4MDI0NTFCMEM5RTE4MEQ1RDUyNjk4REFBRjc5REEzQjk2OEY3MkI0OERBMUQwNDI0NkVBMDdDMkZBRDM2NzM5MkM0NThEMzRGQTE3REFBMDRDMjI5NzVFNDE3QUJEMThGQzY0MDdEMEEwNDMwMEQ1MjFBOEE4NjdGRTg1MEVCOUJBNkYxQUQzMjA4NDg1NkFBRkRFMTEyMjQ3RjIwNTc5Rjc0OTUwRUZBMzZBODAzQTQ3MTM0QkJGMDI0RjU2MURERTkwMDQyQTVBRjI1NDdFRDk1MjBCRTc3QUZCMzk5MzQyQgorMjAxMTEwMTYxMTQxMjcgMiA2IDEwMCAxNTM1IDUgRjYyMTkxQTE3MEVDNjE3MUM2MjBEM0IzMzQ5NTJGMjIwMDc3QUE1QzBGQTdGMUE3RkUwOEM2QjdCMEM1Rjg2NUNEQjI0MzQ2RTNCRTA1Qjk5RTJEN0ZDQzM1ODJEMEQyRDYzNzY3MkVCMEVCMURCQjk1QkNFMUEwQ0E1NERGQzgzRUJGNTk4QTI0OTI4Q0E0MkE1QUJDMkFFNzVFOTgwMjQ1MUIwQzlFMTgwRDVENTI2OThEQUFGNzlEQTNCOTY4RjcyQjQ4REExRDA0MjQ2RUEwN0MyRkFEMzY3MzkyQzQ1OEQzNEZBMTdEQUEwNEMyMjk3NUU0MTdBQkQxOEZDNjQwN0QwQTA0MzAwRDUyMUE4QTg2N0ZFODUwRUI5QkE2RjFBRDMyMDg0ODU2QUFGREUxMTIyNDdGMjA1NzlGNzQ5NTBFRkEzNkE4MDNBNDcxMzRCQkYwMjRGNTYxRERFOTAwNDJBNUFGMjU0N0VEOTUyMEJFNzdBRkIzOUY4MUVGCisyMDExMTAxNjExNDEzMSAyIDYgMTAwIDE1MzUgNSBGNjIxOTFBMTcwRUM2MTcxQzYyMEQzQjMzNDk1MkYyMjAwNzdBQTVDMEZBN0YxQTdGRTA4QzZCN0IwQzVGODY1Q0RCMjQzNDZFM0JFMDVCOTlFMkQ3RkNDMzU4MkQwRDJENjM3NjcyRUIwRUIxREJCOTVCQ0UxQTBDQTU0REZDODNFQkY1OThBMjQ5MjhDQTQyQTVBQkMyQUU3NUU5ODAyNDUxQjBDOUUxODBENUQ1MjY5OERBQUY3OURBM0I5NjhGNzJCNDhEQTFEMDQyNDZFQTA3QzJGQUQzNjczOTJDNDU4RDM0RkExN0RBQTA0QzIyOTc1RTQxN0FCRDE4RkM2NDA3RDBBMDQzMDBENTIxQThBODY3RkU4NTBFQjlCQTZGMUFEMzIwODQ4NTZBQUZERTExMjI0N0YyMDU3OUY3NDk1MEVGQTM2QTgwM0E0NzEzNEJCRjAyNEY1NjFEREU5MDA0MkE1QUYyNTQ3RUQ5NTIwQkU3N0FGQjNBMTc4RTcKKzIwMTExMDE2MTE0MTQzIDIgNiAxMDAgMTUzNSA1IEY2MjE5MUExNzBFQzYxNzFDNjIwRDNCMzM0OTUyRjIyMDA3N0FBNUMwRkE3RjFBN0ZFMDhDNkI3QjBDNUY4NjVDREIyNDM0NkUzQkUwNUI5OUUyRDdGQ0MzNTgyRDBEMkQ2Mzc2NzJFQjBFQjFEQkI5NUJDRTFBMENBNTRERkM4M0VCRjU5OEEyNDkyOENBNDJBNUFCQzJBRTc1RTk4MDI0NTFCMEM5RTE4MEQ1RDUyNjk4REFBRjc5REEzQjk2OEY3MkI0OERBMUQwNDI0NkVBMDdDMkZBRDM2NzM5MkM0NThEMzRGQTE3REFBMDRDMjI5NzVFNDE3QUJEMThGQzY0MDdEMEEwNDMwMEQ1MjFBOEE4NjdGRTg1MEVCOUJBNkYxQUQzMjA4NDg1NkFBRkRFMTEyMjQ3RjIwNTc5Rjc0OTUwRUZBMzZBODAzQTQ3MTM0QkJGMDI0RjU2MURERTkwMDQyQTVBRjI1NDdFRDk1MjBCRTc3QUZCM0I5NDYxNworMjAxMTEwMTYxMTQyMjcgMiA2IDEwMCAxNTM1IDUgRjYyMTkxQTE3MEVDNjE3MUM2MjBEM0IzMzQ5NTJGMjIwMDc3QUE1QzBGQTdGMUE3RkUwOEM2QjdCMEM1Rjg2NUNEQjI0MzQ2RTNCRTA1Qjk5RTJEN0ZDQzM1ODJEMEQyRDYzNzY3MkVCMEVCMURCQjk1QkNFMUEwQ0E1NERGQzgzRUJGNTk4QTI0OTI4Q0E0MkE1QUJDMkFFNzVFOTgwMjQ1MUIwQzlFMTgwRDVENTI2OThEQUFGNzlEQTNCOTY4RjcyQjQ4REExRDA0MjQ2RUEwN0MyRkFEMzY3MzkyQzQ1OEQzNEZBMTdEQUEwNEMyMjk3NUU0MTdBQkQxOEZDNjQwN0QwQTA0MzAwRDUyMUE4QTg2N0ZFODUwRUI5QkE2RjFBRDMyMDg0ODU2QUFGREUxMTIyNDdGMjA1NzlGNzQ5NTBFRkEzNkE4MDNBNDcxMzRCQkYwMjRGNTYxRERFOTAwNDJBNUFGMjU0N0VEOTUyMEJFNzdBRkI0MjEyMUFGCisyMDExMTAxNjExNDIzNCAyIDYgMTAwIDE1MzUgMiBGNjIxOTFBMTcwRUM2MTcxQzYyMEQzQjMzNDk1MkYyMjAwNzdBQTVDMEZBN0YxQTdGRTA4QzZCN0IwQzVGODY1Q0RCMjQzNDZFM0JFMDVCOTlFMkQ3RkNDMzU4MkQwRDJENjM3NjcyRUIwRUIxREJCOTVCQ0UxQTBDQTU0REZDODNFQkY1OThBMjQ5MjhDQTQyQTVBQkMyQUU3NUU5ODAyNDUxQjBDOUUxODBENUQ1MjY5OERBQUY3OURBM0I5NjhGNzJCNDhEQTFEMDQyNDZFQTA3QzJGQUQzNjczOTJDNDU4RDM0RkExN0RBQTA0QzIyOTc1RTQxN0FCRDE4RkM2NDA3RDBBMDQzMDBENTIxQThBODY3RkU4NTBFQjlCQTZGMUFEMzIwODQ4NTZBQUZERTExMjI0N0YyMDU3OUY3NDk1MEVGQTM2QTgwM0E0NzEzNEJCRjAyNEY1NjFEREU5MDA0MkE1QUYyNTQ3RUQ5NTIwQkU3N0FGQjQyOUIxOUIKKzIwMTExMDE2MTE0MzQ2IDIgNiAxMDAgMTUzNSA1IEY2MjE5MUExNzBFQzYxNzFDNjIwRDNCMzM0OTUyRjIyMDA3N0FBNUMwRkE3RjFBN0ZFMDhDNkI3QjBDNUY4NjVDREIyNDM0NkUzQkUwNUI5OUUyRDdGQ0MzNTgyRDBEMkQ2Mzc2NzJFQjBFQjFEQkI5NUJDRTFBMENBNTRERkM4M0VCRjU5OEEyNDkyOENBNDJBNUFCQzJBRTc1RTk4MDI0NTFCMEM5RTE4MEQ1RDUyNjk4REFBRjc5REEzQjk2OEY3MkI0OERBMUQwNDI0NkVBMDdDMkZBRDM2NzM5MkM0NThEMzRGQTE3REFBMDRDMjI5NzVFNDE3QUJEMThGQzY0MDdEMEEwNDMwMEQ1MjFBOEE4NjdGRTg1MEVCOUJBNkYxQUQzMjA4NDg1NkFBRkRFMTEyMjQ3RjIwNTc5Rjc0OTUwRUZBMzZBODAzQTQ3MTM0QkJGMDI0RjU2MURERTkwMDQyQTVBRjI1NDdFRDk1MjBCRTc3QUZCNERERkExRgorMjAxMTEwMTYxMTQ0MDEgMiA2IDEwMCAxNTM1IDUgRjYyMTkxQTE3MEVDNjE3MUM2MjBEM0IzMzQ5NTJGMjIwMDc3QUE1QzBGQTdGMUE3RkUwOEM2QjdCMEM1Rjg2NUNEQjI0MzQ2RTNCRTA1Qjk5RTJEN0ZDQzM1ODJEMEQyRDYzNzY3MkVCMEVCMURCQjk1QkNFMUEwQ0E1NERGQzgzRUJGNTk4QTI0OTI4Q0E0MkE1QUJDMkFFNzVFOTgwMjQ1MUIwQzlFMTgwRDVENTI2OThEQUFGNzlEQTNCOTY4RjcyQjQ4REExRDA0MjQ2RUEwN0MyRkFEMzY3MzkyQzQ1OEQzNEZBMTdEQUEwNEMyMjk3NUU0MTdBQkQxOEZDNjQwN0QwQTA0MzAwRDUyMUE4QTg2N0ZFODUwRUI5QkE2RjFBRDMyMDg0ODU2QUFGREUxMTIyNDdGMjA1NzlGNzQ5NTBFRkEzNkE4MDNBNDcxMzRCQkYwMjRGNTYxRERFOTAwNDJBNUFGMjU0N0VEOTUyMEJFNzdBRkI0RjlFMEVGCisyMDExMTAxNjExNDQxNCAyIDYgMTAwIDE1MzUgMiBGNjIxOTFBMTcwRUM2MTcxQzYyMEQzQjMzNDk1MkYyMjAwNzdBQTVDMEZBN0YxQTdGRTA4QzZCN0IwQzVGODY1Q0RCMjQzNDZFM0JFMDVCOTlFMkQ3RkNDMzU4MkQwRDJENjM3NjcyRUIwRUIxREJCOTVCQ0UxQTBDQTU0REZDODNFQkY1OThBMjQ5MjhDQTQyQTVBQkMyQUU3NUU5ODAyNDUxQjBDOUUxODBENUQ1MjY5OERBQUY3OURBM0I5NjhGNzJCNDhEQTFEMDQyNDZFQTA3QzJGQUQzNjczOTJDNDU4RDM0RkExN0RBQTA0QzIyOTc1RTQxN0FCRDE4RkM2NDA3RDBBMDQzMDBENTIxQThBODY3RkU4NTBFQjlCQTZGMUFEMzIwODQ4NTZBQUZERTExMjI0N0YyMDU3OUY3NDk1MEVGQTM2QTgwM0E0NzEzNEJCRjAyNEY1NjFEREU5MDA0MkE1QUYyNTQ3RUQ5NTIwQkU3N0FGQjUxNTRGRkIKKzIwMTExMDE2MTE0NDQwIDIgNiAxMDAgMTUzNSAyIEY2MjE5MUExNzBFQzYxNzFDNjIwRDNCMzM0OTUyRjIyMDA3N0FBNUMwRkE3RjFBN0ZFMDhDNkI3QjBDNUY4NjVDREIyNDM0NkUzQkUwNUI5OUUyRDdGQ0MzNTgyRDBEMkQ2Mzc2NzJFQjBFQjFEQkI5NUJDRTFBMENBNTRERkM4M0VCRjU5OEEyNDkyOENBNDJBNUFCQzJBRTc1RTk4MDI0NTFCMEM5RTE4MEQ1RDUyNjk4REFBRjc5REEzQjk2OEY3MkI0OERBMUQwNDI0NkVBMDdDMkZBRDM2NzM5MkM0NThEMzRGQTE3REFBMDRDMjI5NzVFNDE3QUJEMThGQzY0MDdEMEEwNDMwMEQ1MjFBOEE4NjdGRTg1MEVCOUJBNkYxQUQzMjA4NDg1NkFBRkRFMTEyMjQ3RjIwNTc5Rjc0OTUwRUZBMzZBODAzQTQ3MTM0QkJGMDI0RjU2MURERTkwMDQyQTVBRjI1NDdFRDk1MjBCRTc3QUZCNTRGRkQ4QgorMjAxMTEwMTYxMTQ0NDMgMiA2IDEwMCAxNTM1IDIgRjYyMTkxQTE3MEVDNjE3MUM2MjBEM0IzMzQ5NTJGMjIwMDc3QUE1QzBGQTdGMUE3RkUwOEM2QjdCMEM1Rjg2NUNEQjI0MzQ2RTNCRTA1Qjk5RTJEN0ZDQzM1ODJEMEQyRDYzNzY3MkVCMEVCMURCQjk1QkNFMUEwQ0E1NERGQzgzRUJGNTk4QTI0OTI4Q0E0MkE1QUJDMkFFNzVFOTgwMjQ1MUIwQzlFMTgwRDVENTI2OThEQUFGNzlEQTNCOTY4RjcyQjQ4REExRDA0MjQ2RUEwN0MyRkFEMzY3MzkyQzQ1OEQzNEZBMTdEQUEwNEMyMjk3NUU0MTdBQkQxOEZDNjQwN0QwQTA0MzAwRDUyMUE4QTg2N0ZFODUwRUI5QkE2RjFBRDMyMDg0ODU2QUFGREUxMTIyNDdGMjA1NzlGNzQ5NTBFRkEzNkE4MDNBNDcxMzRCQkYwMjRGNTYxRERFOTAwNDJBNUFGMjU0N0VEOTUyMEJFNzdBRkI1NTAwNjhCCisyMDExMTAxNjExNTI0MyAyIDYgMTAwIDIwNDcgMiBGOThFN0REQjBCQjg1MTY5OUQzRUE5RTA0OTg3QkFDRjdBNjQ2RTk4NTA3NDU2QTFENzA0ODA0NkQ4MThDNkMxNjRGNzYyQkRCMzk1MTBCMTk5RjJFODVFMDI5RjdGMENEMzc4Q0U5MTJFMzkzQ0QxNjAyRUZDQkU2ODEzMUZCRDBGODY2RUQ0RjFDNDg4RDA1NjlEN0RDRTQ0RDQ5RjQ1NzRCQjkxODZDMzQ1OERGMkQ0MkJFRkNBQ0RBOEUxMDAzMzc5MjhBOUI4RDFFNkMyMkJDQzMzNDM3RUJGNDU3MTcxMUE0MjcyRURFM0Y1QjZBNjI5RDlCRDQ0RTlENEM0MUEyREFBRkY1RTQxN0EyRTBFOTBGQTg0MzhGQjc4NjgxNDJGNzc5RUE5QjFDQzUzQUFCREIxM0FBRjJGRTI1ODBBNTUxMzg4MjZDQkVEOEY4QTA2NzRBMDg1MTMxMTBFN0MxRjFBREYxNzM3MTc4OURENzY2QjUzRTQ1NEFEQ0JDRUJEQUJCRDA1MEY0NjlGRjJGMzU1ODQxRThCODIzQzA4NTQ4MjU0MjREQzg3QjI3MzQ0NkNDNzBDMkZEQjgyOEI0M0UwMTdCRUZDOUFDNjU3OERBMDI5OEM2NENDMkI2QTMzQTY2NTFDQjU1RTcyMEYxOTNEN0I2MkFGMDdFMworMjAxMTEwMTYxMTUzMTkgMiA2IDEwMCAyMDQ3IDIgRjk4RTdEREIwQkI4NTE2OTlEM0VBOUUwNDk4N0JBQ0Y3QTY0NkU5ODUwNzQ1NkExRDcwNDgwNDZEODE4QzZDMTY0Rjc2MkJEQjM5NTEwQjE5OUYyRTg1RTAyOUY3RjBDRDM3OENFOTEyRTM5M0NEMTYwMkVGQ0JFNjgxMzFGQkQwRjg2NkVENEYxQzQ4OEQwNTY5RDdEQ0U0NEQ0OUY0NTc0QkI5MTg2QzM0NThERjJENDJCRUZDQUNEQThFMTAwMzM3OTI4QTlCOEQxRTZDMjJCQ0MzMzQzN0VCRjQ1NzE3MTFBNDI3MkVERTNGNUI2QTYyOUQ5QkQ0NEU5RDRDNDFBMkRBQUZGNUU0MTdBMkUwRTkwRkE4NDM4RkI3ODY4MTQyRjc3OUVBOUIxQ0M1M0FBQkRCMTNBQUYyRkUyNTgwQTU1MTM4ODI2Q0JFRDhGOEEwNjc0QTA4NTEzMTEwRTdDMUYxQURGMTczNzE3ODlERDc2NkI1M0U0NTRBRENCQ0VCREFCQkQwNTBGNDY5RkYyRjM1NTg0MUU4QjgyM0MwODU0ODI1NDI0REM4N0IyNzM0NDZDQzcwQzJGREI4MjhCNDNFMDE3QkVGQzlBQzY1NzhEQTAyOThDNjRDQzJCNkEzM0E2NjUxQ0I1NUU3MjBGMTkzRDdCNjJEMDIwNDMKKzIwMTExMDE2MTE1MzMwIDIgNiAxMDAgMjA0NyAyIEY5OEU3RERCMEJCODUxNjk5RDNFQTlFMDQ5ODdCQUNGN0E2NDZFOTg1MDc0NTZBMUQ3MDQ4MDQ2RDgxOEM2QzE2NEY3NjJCREIzOTUxMEIxOTlGMkU4NUUwMjlGN0YwQ0QzNzhDRTkxMkUzOTNDRDE2MDJFRkNCRTY4MTMxRkJEMEY4NjZFRDRGMUM0ODhEMDU2OUQ3RENFNDRENDlGNDU3NEJCOTE4NkMzNDU4REYyRDQyQkVGQ0FDREE4RTEwMDMzNzkyOEE5QjhEMUU2QzIyQkNDMzM0MzdFQkY0NTcxNzExQTQyNzJFREUzRjVCNkE2MjlEOUJENDRFOUQ0QzQxQTJEQUFGRjVFNDE3QTJFMEU5MEZBODQzOEZCNzg2ODE0MkY3NzlFQTlCMUNDNTNBQUJEQjEzQUFGMkZFMjU4MEE1NTEzODgyNkNCRUQ4RjhBMDY3NEEwODUxMzExMEU3QzFGMUFERjE3MzcxNzg5REQ3NjZCNTNFNDU0QURDQkNFQkRBQkJEMDUwRjQ2OUZGMkYzNTU4NDFFOEI4MjNDMDg1NDgyNTQyNERDODdCMjczNDQ2Q0M3MEMyRkRCODI4QjQzRTAxN0JFRkM5QUM2NTc4REEwMjk4QzY0Q0MyQjZBMzNBNjY1MUNCNTVFNzIwRjE5M0Q3QjYyRDNDNDgzCisyMDExMTAxNjExNTQxMCAyIDYgMTAwIDIwNDcgNSBGOThFN0REQjBCQjg1MTY5OUQzRUE5RTA0OTg3QkFDRjdBNjQ2RTk4NTA3NDU2QTFENzA0ODA0NkQ4MThDNkMxNjRGNzYyQkRCMzk1MTBCMTk5RjJFODVFMDI5RjdGMENEMzc4Q0U5MTJFMzkzQ0QxNjAyRUZDQkU2ODEzMUZCRDBGODY2RUQ0RjFDNDg4RDA1NjlEN0RDRTQ0RDQ5RjQ1NzRCQjkxODZDMzQ1OERGMkQ0MkJFRkNBQ0RBOEUxMDAzMzc5MjhBOUI4RDFFNkMyMkJDQzMzNDM3RUJGNDU3MTcxMUE0MjcyRURFM0Y1QjZBNjI5RDlCRDQ0RTlENEM0MUEyREFBRkY1RTQxN0EyRTBFOTBGQTg0MzhGQjc4NjgxNDJGNzc5RUE5QjFDQzUzQUFCREIxM0FBRjJGRTI1ODBBNTUxMzg4MjZDQkVEOEY4QTA2NzRBMDg1MTMxMTBFN0MxRjFBREYxNzM3MTc4OURENzY2QjUzRTQ1NEFEQ0JDRUJEQUJCRDA1MEY0NjlGRjJGMzU1ODQxRThCODIzQzA4NTQ4MjU0MjREQzg3QjI3MzQ0NkNDNzBDMkZEQjgyOEI0M0UwMTdCRUZDOUFDNjU3OERBMDI5OEM2NENDMkI2QTMzQTY2NTFDQjU1RTcyMEYxOTNEN0I2MkY2Rjc5RgorMjAxMTEwMTYxMTU4NTcgMiA2IDEwMCAyMDQ3IDIgRjk4RTdEREIwQkI4NTE2OTlEM0VBOUUwNDk4N0JBQ0Y3QTY0NkU5ODUwNzQ1NkExRDcwNDgwNDZEODE4QzZDMTY0Rjc2MkJEQjM5NTEwQjE5OUYyRTg1RTAyOUY3RjBDRDM3OENFOTEyRTM5M0NEMTYwMkVGQ0JFNjgxMzFGQkQwRjg2NkVENEYxQzQ4OEQwNTY5RDdEQ0U0NEQ0OUY0NTc0QkI5MTg2QzM0NThERjJENDJCRUZDQUNEQThFMTAwMzM3OTI4QTlCOEQxRTZDMjJCQ0MzMzQzN0VCRjQ1NzE3MTFBNDI3MkVERTNGNUI2QTYyOUQ5QkQ0NEU5RDRDNDFBMkRBQUZGNUU0MTdBMkUwRTkwRkE4NDM4RkI3ODY4MTQyRjc3OUVBOUIxQ0M1M0FBQkRCMTNBQUYyRkUyNTgwQTU1MTM4ODI2Q0JFRDhGOEEwNjc0QTA4NTEzMTEwRTdDMUYxQURGMTczNzE3ODlERDc2NkI1M0U0NTRBRENCQ0VCREFCQkQwNTBGNDY5RkYyRjM1NTg0MUU4QjgyM0MwODU0ODI1NDI0REM4N0IyNzM0NDZDQzcwQzJGREI4MjhCNDNFMDE3QkVGQzlBQzY1NzhEQTAyOThDNjRDQzJCNkEzM0E2NjUxQ0I1NUU3MjBGMTkzRDdCNjQzNjVCNzMKKzIwMTExMDE2MTIwMDE5IDIgNiAxMDAgMjA0NyAyIEY5OEU3RERCMEJCODUxNjk5RDNFQTlFMDQ5ODdCQUNGN0E2NDZFOTg1MDc0NTZBMUQ3MDQ4MDQ2RDgxOEM2QzE2NEY3NjJCREIzOTUxMEIxOTlGMkU4NUUwMjlGN0YwQ0QzNzhDRTkxMkUzOTNDRDE2MDJFRkNCRTY4MTMxRkJEMEY4NjZFRDRGMUM0ODhEMDU2OUQ3RENFNDRENDlGNDU3NEJCOTE4NkMzNDU4REYyRDQyQkVGQ0FDREE4RTEwMDMzNzkyOEE5QjhEMUU2QzIyQkNDMzM0MzdFQkY0NTcxNzExQTQyNzJFREUzRjVCNkE2MjlEOUJENDRFOUQ0QzQxQTJEQUFGRjVFNDE3QTJFMEU5MEZBODQzOEZCNzg2ODE0MkY3NzlFQTlCMUNDNTNBQUJEQjEzQUFGMkZFMjU4MEE1NTEzODgyNkNCRUQ4RjhBMDY3NEEwODUxMzExMEU3QzFGMUFERjE3MzcxNzg5REQ3NjZCNTNFNDU0QURDQkNFQkRBQkJEMDUwRjQ2OUZGMkYzNTU4NDFFOEI4MjNDMDg1NDgyNTQyNERDODdCMjczNDQ2Q0M3MEMyRkRCODI4QjQzRTAxN0JFRkM5QUM2NTc4REEwMjk4QzY0Q0MyQjZBMzNBNjY1MUNCNTVFNzIwRjE5M0Q3QjY0ODdGMUVCCisyMDExMTAxNjEyMDEwMCAyIDYgMTAwIDIwNDcgMiBGOThFN0REQjBCQjg1MTY5OUQzRUE5RTA0OTg3QkFDRjdBNjQ2RTk4NTA3NDU2QTFENzA0ODA0NkQ4MThDNkMxNjRGNzYyQkRCMzk1MTBCMTk5RjJFODVFMDI5RjdGMENEMzc4Q0U5MTJFMzkzQ0QxNjAyRUZDQkU2ODEzMUZCRDBGODY2RUQ0RjFDNDg4RDA1NjlEN0RDRTQ0RDQ5RjQ1NzRCQjkxODZDMzQ1OERGMkQ0MkJFRkNBQ0RBOEUxMDAzMzc5MjhBOUI4RDFFNkMyMkJDQzMzNDM3RUJGNDU3MTcxMUE0MjcyRURFM0Y1QjZBNjI5RDlCRDQ0RTlENEM0MUEyREFBRkY1RTQxN0EyRTBFOTBGQTg0MzhGQjc4NjgxNDJGNzc5RUE5QjFDQzUzQUFCREIxM0FBRjJGRTI1ODBBNTUxMzg4MjZDQkVEOEY4QTA2NzRBMDg1MTMxMTBFN0MxRjFBREYxNzM3MTc4OURENzY2QjUzRTQ1NEFEQ0JDRUJEQUJCRDA1MEY0NjlGRjJGMzU1ODQxRThCODIzQzA4NTQ4MjU0MjREQzg3QjI3MzQ0NkNDNzBDMkZEQjgyOEI0M0UwMTdCRUZDOUFDNjU3OERBMDI5OEM2NENDMkI2QTMzQTY2NTFDQjU1RTcyMEYxOTNEN0I2NEFGMkY1MworMjAxMTEwMTYxMjAxMDggMiA2IDEwMCAyMDQ3IDUgRjk4RTdEREIwQkI4NTE2OTlEM0VBOUUwNDk4N0JBQ0Y3QTY0NkU5ODUwNzQ1NkExRDcwNDgwNDZEODE4QzZDMTY0Rjc2MkJEQjM5NTEwQjE5OUYyRTg1RTAyOUY3RjBDRDM3OENFOTEyRTM5M0NEMTYwMkVGQ0JFNjgxMzFGQkQwRjg2NkVENEYxQzQ4OEQwNTY5RDdEQ0U0NEQ0OUY0NTc0QkI5MTg2QzM0NThERjJENDJCRUZDQUNEQThFMTAwMzM3OTI4QTlCOEQxRTZDMjJCQ0MzMzQzN0VCRjQ1NzE3MTFBNDI3MkVERTNGNUI2QTYyOUQ5QkQ0NEU5RDRDNDFBMkRBQUZGNUU0MTdBMkUwRTkwRkE4NDM4RkI3ODY4MTQyRjc3OUVBOUIxQ0M1M0FBQkRCMTNBQUYyRkUyNTgwQTU1MTM4ODI2Q0JFRDhGOEEwNjc0QTA4NTEzMTEwRTdDMUYxQURGMTczNzE3ODlERDc2NkI1M0U0NTRBRENCQ0VCREFCQkQwNTBGNDY5RkYyRjM1NTg0MUU4QjgyM0MwODU0ODI1NDI0REM4N0IyNzM0NDZDQzcwQzJGREI4MjhCNDNFMDE3QkVGQzlBQzY1NzhEQTAyOThDNjRDQzJCNkEzM0E2NjUxQ0I1NUU3MjBGMTkzRDdCNjRCMDAwOUYKKzIwMTExMDE2MTIwMjExIDIgNiAxMDAgMjA0NyA1IEY5OEU3RERCMEJCODUxNjk5RDNFQTlFMDQ5ODdCQUNGN0E2NDZFOTg1MDc0NTZBMUQ3MDQ4MDQ2RDgxOEM2QzE2NEY3NjJCREIzOTUxMEIxOTlGMkU4NUUwMjlGN0YwQ0QzNzhDRTkxMkUzOTNDRDE2MDJFRkNCRTY4MTMxRkJEMEY4NjZFRDRGMUM0ODhEMDU2OUQ3RENFNDRENDlGNDU3NEJCOTE4NkMzNDU4REYyRDQyQkVGQ0FDREE4RTEwMDMzNzkyOEE5QjhEMUU2QzIyQkNDMzM0MzdFQkY0NTcxNzExQTQyNzJFREUzRjVCNkE2MjlEOUJENDRFOUQ0QzQxQTJEQUFGRjVFNDE3QTJFMEU5MEZBODQzOEZCNzg2ODE0MkY3NzlFQTlCMUNDNTNBQUJEQjEzQUFGMkZFMjU4MEE1NTEzODgyNkNCRUQ4RjhBMDY3NEEwODUxMzExMEU3QzFGMUFERjE3MzcxNzg5REQ3NjZCNTNFNDU0QURDQkNFQkRBQkJEMDUwRjQ2OUZGMkYzNTU4NDFFOEI4MjNDMDg1NDgyNTQyNERDODdCMjczNDQ2Q0M3MEMyRkRCODI4QjQzRTAxN0JFRkM5QUM2NTc4REEwMjk4QzY0Q0MyQjZBMzNBNjY1MUNCNTVFNzIwRjE5M0Q3QjY0RUE5NjQ3CisyMDExMTAxNjEyMDMxMiAyIDYgMTAwIDIwNDcgNSBGOThFN0REQjBCQjg1MTY5OUQzRUE5RTA0OTg3QkFDRjdBNjQ2RTk4NTA3NDU2QTFENzA0ODA0NkQ4MThDNkMxNjRGNzYyQkRCMzk1MTBCMTk5RjJFODVFMDI5RjdGMENEMzc4Q0U5MTJFMzkzQ0QxNjAyRUZDQkU2ODEzMUZCRDBGODY2RUQ0RjFDNDg4RDA1NjlEN0RDRTQ0RDQ5RjQ1NzRCQjkxODZDMzQ1OERGMkQ0MkJFRkNBQ0RBOEUxMDAzMzc5MjhBOUI4RDFFNkMyMkJDQzMzNDM3RUJGNDU3MTcxMUE0MjcyRURFM0Y1QjZBNjI5RDlCRDQ0RTlENEM0MUEyREFBRkY1RTQxN0EyRTBFOTBGQTg0MzhGQjc4NjgxNDJGNzc5RUE5QjFDQzUzQUFCREIxM0FBRjJGRTI1ODBBNTUxMzg4MjZDQkVEOEY4QTA2NzRBMDg1MTMxMTBFN0MxRjFBREYxNzM3MTc4OURENzY2QjUzRTQ1NEFEQ0JDRUJEQUJCRDA1MEY0NjlGRjJGMzU1ODQxRThCODIzQzA4NTQ4MjU0MjREQzg3QjI3MzQ0NkNDNzBDMkZEQjgyOEI0M0UwMTdCRUZDOUFDNjU3OERBMDI5OEM2NENDMkI2QTMzQTY2NTFDQjU1RTcyMEYxOTNEN0I2NTI3NkQ1NworMjAxMTEwMTYxMjA0MjQgMiA2IDEwMCAyMDQ3IDUgRjk4RTdEREIwQkI4NTE2OTlEM0VBOUUwNDk4N0JBQ0Y3QTY0NkU5ODUwNzQ1NkExRDcwNDgwNDZEODE4QzZDMTY0Rjc2MkJEQjM5NTEwQjE5OUYyRTg1RTAyOUY3RjBDRDM3OENFOTEyRTM5M0NEMTYwMkVGQ0JFNjgxMzFGQkQwRjg2NkVENEYxQzQ4OEQwNTY5RDdEQ0U0NEQ0OUY0NTc0QkI5MTg2QzM0NThERjJENDJCRUZDQUNEQThFMTAwMzM3OTI4QTlCOEQxRTZDMjJCQ0MzMzQzN0VCRjQ1NzE3MTFBNDI3MkVERTNGNUI2QTYyOUQ5QkQ0NEU5RDRDNDFBMkRBQUZGNUU0MTdBMkUwRTkwRkE4NDM4RkI3ODY4MTQyRjc3OUVBOUIxQ0M1M0FBQkRCMTNBQUYyRkUyNTgwQTU1MTM4ODI2Q0JFRDhGOEEwNjc0QTA4NTEzMTEwRTdDMUYxQURGMTczNzE3ODlERDc2NkI1M0U0NTRBRENCQ0VCREFCQkQwNTBGNDY5RkYyRjM1NTg0MUU4QjgyM0MwODU0ODI1NDI0REM4N0IyNzM0NDZDQzcwQzJGREI4MjhCNDNFMDE3QkVGQzlBQzY1NzhEQTAyOThDNjRDQzJCNkEzM0E2NjUxQ0I1NUU3MjBGMTkzRDdCNjU2RDI5MzcKKzIwMTExMDE2MTIwNTEzIDIgNiAxMDAgMjA0NyA1IEY5OEU3RERCMEJCODUxNjk5RDNFQTlFMDQ5ODdCQUNGN0E2NDZFOTg1MDc0NTZBMUQ3MDQ4MDQ2RDgxOEM2QzE2NEY3NjJCREIzOTUxMEIxOTlGMkU4NUUwMjlGN0YwQ0QzNzhDRTkxMkUzOTNDRDE2MDJFRkNCRTY4MTMxRkJEMEY4NjZFRDRGMUM0ODhEMDU2OUQ3RENFNDRENDlGNDU3NEJCOTE4NkMzNDU4REYyRDQyQkVGQ0FDREE4RTEwMDMzNzkyOEE5QjhEMUU2QzIyQkNDMzM0MzdFQkY0NTcxNzExQTQyNzJFREUzRjVCNkE2MjlEOUJENDRFOUQ0QzQxQTJEQUFGRjVFNDE3QTJFMEU5MEZBODQzOEZCNzg2ODE0MkY3NzlFQTlCMUNDNTNBQUJEQjEzQUFGMkZFMjU4MEE1NTEzODgyNkNCRUQ4RjhBMDY3NEEwODUxMzExMEU3QzFGMUFERjE3MzcxNzg5REQ3NjZCNTNFNDU0QURDQkNFQkRBQkJEMDUwRjQ2OUZGMkYzNTU4NDFFOEI4MjNDMDg1NDgyNTQyNERDODdCMjczNDQ2Q0M3MEMyRkRCODI4QjQzRTAxN0JFRkM5QUM2NTc4REEwMjk4QzY0Q0MyQjZBMzNBNjY1MUNCNTVFNzIwRjE5M0Q3QjY1OUQxQzVGCisyMDExMTAxNjEyMDUzMyAyIDYgMTAwIDIwNDcgNSBGOThFN0REQjBCQjg1MTY5OUQzRUE5RTA0OTg3QkFDRjdBNjQ2RTk4NTA3NDU2QTFENzA0ODA0NkQ4MThDNkMxNjRGNzYyQkRCMzk1MTBCMTk5RjJFODVFMDI5RjdGMENEMzc4Q0U5MTJFMzkzQ0QxNjAyRUZDQkU2ODEzMUZCRDBGODY2RUQ0RjFDNDg4RDA1NjlEN0RDRTQ0RDQ5RjQ1NzRCQjkxODZDMzQ1OERGMkQ0MkJFRkNBQ0RBOEUxMDAzMzc5MjhBOUI4RDFFNkMyMkJDQzMzNDM3RUJGNDU3MTcxMUE0MjcyRURFM0Y1QjZBNjI5RDlCRDQ0RTlENEM0MUEyREFBRkY1RTQxN0EyRTBFOTBGQTg0MzhGQjc4NjgxNDJGNzc5RUE5QjFDQzUzQUFCREIxM0FBRjJGRTI1ODBBNTUxMzg4MjZDQkVEOEY4QTA2NzRBMDg1MTMxMTBFN0MxRjFBREYxNzM3MTc4OURENzY2QjUzRTQ1NEFEQ0JDRUJEQUJCRDA1MEY0NjlGRjJGMzU1ODQxRThCODIzQzA4NTQ4MjU0MjREQzg3QjI3MzQ0NkNDNzBDMkZEQjgyOEI0M0UwMTdCRUZDOUFDNjU3OERBMDI5OEM2NENDMkI2QTMzQTY2NTFDQjU1RTcyMEYxOTNEN0I2NUFDNTFDRgorMjAxMTEwMTYxMjA2MzEgMiA2IDEwMCAyMDQ3IDUgRjk4RTdEREIwQkI4NTE2OTlEM0VBOUUwNDk4N0JBQ0Y3QTY0NkU5ODUwNzQ1NkExRDcwNDgwNDZEODE4QzZDMTY0Rjc2MkJEQjM5NTEwQjE5OUYyRTg1RTAyOUY3RjBDRDM3OENFOTEyRTM5M0NEMTYwMkVGQ0JFNjgxMzFGQkQwRjg2NkVENEYxQzQ4OEQwNTY5RDdEQ0U0NEQ0OUY0NTc0QkI5MTg2QzM0NThERjJENDJCRUZDQUNEQThFMTAwMzM3OTI4QTlCOEQxRTZDMjJCQ0MzMzQzN0VCRjQ1NzE3MTFBNDI3MkVERTNGNUI2QTYyOUQ5QkQ0NEU5RDRDNDFBMkRBQUZGNUU0MTdBMkUwRTkwRkE4NDM4RkI3ODY4MTQyRjc3OUVBOUIxQ0M1M0FBQkRCMTNBQUYyRkUyNTgwQTU1MTM4ODI2Q0JFRDhGOEEwNjc0QTA4NTEzMTEwRTdDMUYxQURGMTczNzE3ODlERDc2NkI1M0U0NTRBRENCQ0VCREFCQkQwNTBGNDY5RkYyRjM1NTg0MUU4QjgyM0MwODU0ODI1NDI0REM4N0IyNzM0NDZDQzcwQzJGREI4MjhCNDNFMDE3QkVGQzlBQzY1NzhEQTAyOThDNjRDQzJCNkEzM0E2NjUxQ0I1NUU3MjBGMTkzRDdCNjVFNjI0MTcKKzIwMTExMDE2MTIxMDI0IDIgNiAxMDAgMjA0NyAyIEY5OEU3RERCMEJCODUxNjk5RDNFQTlFMDQ5ODdCQUNGN0E2NDZFOTg1MDc0NTZBMUQ3MDQ4MDQ2RDgxOEM2QzE2NEY3NjJCREIzOTUxMEIxOTlGMkU4NUUwMjlGN0YwQ0QzNzhDRTkxMkUzOTNDRDE2MDJFRkNCRTY4MTMxRkJEMEY4NjZFRDRGMUM0ODhEMDU2OUQ3RENFNDRENDlGNDU3NEJCOTE4NkMzNDU4REYyRDQyQkVGQ0FDREE4RTEwMDMzNzkyOEE5QjhEMUU2QzIyQkNDMzM0MzdFQkY0NTcxNzExQTQyNzJFREUzRjVCNkE2MjlEOUJENDRFOUQ0QzQxQTJEQUFGRjVFNDE3QTJFMEU5MEZBODQzOEZCNzg2ODE0MkY3NzlFQTlCMUNDNTNBQUJEQjEzQUFGMkZFMjU4MEE1NTEzODgyNkNCRUQ4RjhBMDY3NEEwODUxMzExMEU3QzFGMUFERjE3MzcxNzg5REQ3NjZCNTNFNDU0QURDQkNFQkRBQkJEMDUwRjQ2OUZGMkYzNTU4NDFFOEI4MjNDMDg1NDgyNTQyNERDODdCMjczNDQ2Q0M3MEMyRkRCODI4QjQzRTAxN0JFRkM5QUM2NTc4REEwMjk4QzY0Q0MyQjZBMzNBNjY1MUNCNTVFNzIwRjE5M0Q3QjY2RTIzMEZCCisyMDExMTAxNjEyMTEyMyAyIDYgMTAwIDIwNDcgNSBGOThFN0REQjBCQjg1MTY5OUQzRUE5RTA0OTg3QkFDRjdBNjQ2RTk4NTA3NDU2QTFENzA0ODA0NkQ4MThDNkMxNjRGNzYyQkRCMzk1MTBCMTk5RjJFODVFMDI5RjdGMENEMzc4Q0U5MTJFMzkzQ0QxNjAyRUZDQkU2ODEzMUZCRDBGODY2RUQ0RjFDNDg4RDA1NjlEN0RDRTQ0RDQ5RjQ1NzRCQjkxODZDMzQ1OERGMkQ0MkJFRkNBQ0RBOEUxMDAzMzc5MjhBOUI4RDFFNkMyMkJDQzMzNDM3RUJGNDU3MTcxMUE0MjcyRURFM0Y1QjZBNjI5RDlCRDQ0RTlENEM0MUEyREFBRkY1RTQxN0EyRTBFOTBGQTg0MzhGQjc4NjgxNDJGNzc5RUE5QjFDQzUzQUFCREIxM0FBRjJGRTI1ODBBNTUxMzg4MjZDQkVEOEY4QTA2NzRBMDg1MTMxMTBFN0MxRjFBREYxNzM3MTc4OURENzY2QjUzRTQ1NEFEQ0JDRUJEQUJCRDA1MEY0NjlGRjJGMzU1ODQxRThCODIzQzA4NTQ4MjU0MjREQzg3QjI3MzQ0NkNDNzBDMkZEQjgyOEI0M0UwMTdCRUZDOUFDNjU3OERBMDI5OEM2NENDMkI2QTMzQTY2NTFDQjU1RTcyMEYxOTNEN0I2NzFBRTFDRgorMjAxMTEwMTYxMjExNTIgMiA2IDEwMCAyMDQ3IDIgRjk4RTdEREIwQkI4NTE2OTlEM0VBOUUwNDk4N0JBQ0Y3QTY0NkU5ODUwNzQ1NkExRDcwNDgwNDZEODE4QzZDMTY0Rjc2MkJEQjM5NTEwQjE5OUYyRTg1RTAyOUY3RjBDRDM3OENFOTEyRTM5M0NEMTYwMkVGQ0JFNjgxMzFGQkQwRjg2NkVENEYxQzQ4OEQwNTY5RDdEQ0U0NEQ0OUY0NTc0QkI5MTg2QzM0NThERjJENDJCRUZDQUNEQThFMTAwMzM3OTI4QTlCOEQxRTZDMjJCQ0MzMzQzN0VCRjQ1NzE3MTFBNDI3MkVERTNGNUI2QTYyOUQ5QkQ0NEU5RDRDNDFBMkRBQUZGNUU0MTdBMkUwRTkwRkE4NDM4RkI3ODY4MTQyRjc3OUVBOUIxQ0M1M0FBQkRCMTNBQUYyRkUyNTgwQTU1MTM4ODI2Q0JFRDhGOEEwNjc0QTA4NTEzMTEwRTdDMUYxQURGMTczNzE3ODlERDc2NkI1M0U0NTRBRENCQ0VCREFCQkQwNTBGNDY5RkYyRjM1NTg0MUU4QjgyM0MwODU0ODI1NDI0REM4N0IyNzM0NDZDQzcwQzJGREI4MjhCNDNFMDE3QkVGQzlBQzY1NzhEQTAyOThDNjRDQzJCNkEzM0E2NjUxQ0I1NUU3MjBGMTkzRDdCNjczMkE5QjMKKzIwMTExMDE2MTIxMjU2IDIgNiAxMDAgMjA0NyA1IEY5OEU3RERCMEJCODUxNjk5RDNFQTlFMDQ5ODdCQUNGN0E2NDZFOTg1MDc0NTZBMUQ3MDQ4MDQ2RDgxOEM2QzE2NEY3NjJCREIzOTUxMEIxOTlGMkU4NUUwMjlGN0YwQ0QzNzhDRTkxMkUzOTNDRDE2MDJFRkNCRTY4MTMxRkJEMEY4NjZFRDRGMUM0ODhEMDU2OUQ3RENFNDRENDlGNDU3NEJCOTE4NkMzNDU4REYyRDQyQkVGQ0FDREE4RTEwMDMzNzkyOEE5QjhEMUU2QzIyQkNDMzM0MzdFQkY0NTcxNzExQTQyNzJFREUzRjVCNkE2MjlEOUJENDRFOUQ0QzQxQTJEQUFGRjVFNDE3QTJFMEU5MEZBODQzOEZCNzg2ODE0MkY3NzlFQTlCMUNDNTNBQUJEQjEzQUFGMkZFMjU4MEE1NTEzODgyNkNCRUQ4RjhBMDY3NEEwODUxMzExMEU3QzFGMUFERjE3MzcxNzg5REQ3NjZCNTNFNDU0QURDQkNFQkRBQkJEMDUwRjQ2OUZGMkYzNTU4NDFFOEI4MjNDMDg1NDgyNTQyNERDODdCMjczNDQ2Q0M3MEMyRkRCODI4QjQzRTAxN0JFRkM5QUM2NTc4REEwMjk4QzY0Q0MyQjZBMzNBNjY1MUNCNTVFNzIwRjE5M0Q3QjY3NzM3MkM3CisyMDExMTAxNjEyMTMwOCAyIDYgMTAwIDIwNDcgMiBGOThFN0REQjBCQjg1MTY5OUQzRUE5RTA0OTg3QkFDRjdBNjQ2RTk4NTA3NDU2QTFENzA0ODA0NkQ4MThDNkMxNjRGNzYyQkRCMzk1MTBCMTk5RjJFODVFMDI5RjdGMENEMzc4Q0U5MTJFMzkzQ0QxNjAyRUZDQkU2ODEzMUZCRDBGODY2RUQ0RjFDNDg4RDA1NjlEN0RDRTQ0RDQ5RjQ1NzRCQjkxODZDMzQ1OERGMkQ0MkJFRkNBQ0RBOEUxMDAzMzc5MjhBOUI4RDFFNkMyMkJDQzMzNDM3RUJGNDU3MTcxMUE0MjcyRURFM0Y1QjZBNjI5RDlCRDQ0RTlENEM0MUEyREFBRkY1RTQxN0EyRTBFOTBGQTg0MzhGQjc4NjgxNDJGNzc5RUE5QjFDQzUzQUFCREIxM0FBRjJGRTI1ODBBNTUxMzg4MjZDQkVEOEY4QTA2NzRBMDg1MTMxMTBFN0MxRjFBREYxNzM3MTc4OURENzY2QjUzRTQ1NEFEQ0JDRUJEQUJCRDA1MEY0NjlGRjJGMzU1ODQxRThCODIzQzA4NTQ4MjU0MjREQzg3QjI3MzQ0NkNDNzBDMkZEQjgyOEI0M0UwMTdCRUZDOUFDNjU3OERBMDI5OEM2NENDMkI2QTMzQTY2NTFDQjU1RTcyMEYxOTNEN0I2Nzc5Mjg5MworMjAxMTEwMTYxMjE3NDUgMiA2IDEwMCAyMDQ3IDUgRjk4RTdEREIwQkI4NTE2OTlEM0VBOUUwNDk4N0JBQ0Y3QTY0NkU5ODUwNzQ1NkExRDcwNDgwNDZEODE4QzZDMTY0Rjc2MkJEQjM5NTEwQjE5OUYyRTg1RTAyOUY3RjBDRDM3OENFOTEyRTM5M0NEMTYwMkVGQ0JFNjgxMzFGQkQwRjg2NkVENEYxQzQ4OEQwNTY5RDdEQ0U0NEQ0OUY0NTc0QkI5MTg2QzM0NThERjJENDJCRUZDQUNEQThFMTAwMzM3OTI4QTlCOEQxRTZDMjJCQ0MzMzQzN0VCRjQ1NzE3MTFBNDI3MkVERTNGNUI2QTYyOUQ5QkQ0NEU5RDRDNDFBMkRBQUZGNUU0MTdBMkUwRTkwRkE4NDM4RkI3ODY4MTQyRjc3OUVBOUIxQ0M1M0FBQkRCMTNBQUYyRkUyNTgwQTU1MTM4ODI2Q0JFRDhGOEEwNjc0QTA4NTEzMTEwRTdDMUYxQURGMTczNzE3ODlERDc2NkI1M0U0NTRBRENCQ0VCREFCQkQwNTBGNDY5RkYyRjM1NTg0MUU4QjgyM0MwODU0ODI1NDI0REM4N0IyNzM0NDZDQzcwQzJGREI4MjhCNDNFMDE3QkVGQzlBQzY1NzhEQTAyOThDNjRDQzJCNkEzM0E2NjUxQ0I1NUU3MjBGMTkzRDdCNjhBOEJCNTcKKzIwMTExMDE2MTIxODI5IDIgNiAxMDAgMjA0NyAyIEY5OEU3RERCMEJCODUxNjk5RDNFQTlFMDQ5ODdCQUNGN0E2NDZFOTg1MDc0NTZBMUQ3MDQ4MDQ2RDgxOEM2QzE2NEY3NjJCREIzOTUxMEIxOTlGMkU4NUUwMjlGN0YwQ0QzNzhDRTkxMkUzOTNDRDE2MDJFRkNCRTY4MTMxRkJEMEY4NjZFRDRGMUM0ODhEMDU2OUQ3RENFNDRENDlGNDU3NEJCOTE4NkMzNDU4REYyRDQyQkVGQ0FDREE4RTEwMDMzNzkyOEE5QjhEMUU2QzIyQkNDMzM0MzdFQkY0NTcxNzExQTQyNzJFREUzRjVCNkE2MjlEOUJENDRFOUQ0QzQxQTJEQUFGRjVFNDE3QTJFMEU5MEZBODQzOEZCNzg2ODE0MkY3NzlFQTlCMUNDNTNBQUJEQjEzQUFGMkZFMjU4MEE1NTEzODgyNkNCRUQ4RjhBMDY3NEEwODUxMzExMEU3QzFGMUFERjE3MzcxNzg5REQ3NjZCNTNFNDU0QURDQkNFQkRBQkJEMDUwRjQ2OUZGMkYzNTU4NDFFOEI4MjNDMDg1NDgyNTQyNERDODdCMjczNDQ2Q0M3MEMyRkRCODI4QjQzRTAxN0JFRkM5QUM2NTc4REEwMjk4QzY0Q0MyQjZBMzNBNjY1MUNCNTVFNzIwRjE5M0Q3QjY4RDREQTFCCisyMDExMTAxNjEyMTg0NCAyIDYgMTAwIDIwNDcgMiBGOThFN0REQjBCQjg1MTY5OUQzRUE5RTA0OTg3QkFDRjdBNjQ2RTk4NTA3NDU2QTFENzA0ODA0NkQ4MThDNkMxNjRGNzYyQkRCMzk1MTBCMTk5RjJFODVFMDI5RjdGMENEMzc4Q0U5MTJFMzkzQ0QxNjAyRUZDQkU2ODEzMUZCRDBGODY2RUQ0RjFDNDg4RDA1NjlEN0RDRTQ0RDQ5RjQ1NzRCQjkxODZDMzQ1OERGMkQ0MkJFRkNBQ0RBOEUxMDAzMzc5MjhBOUI4RDFFNkMyMkJDQzMzNDM3RUJGNDU3MTcxMUE0MjcyRURFM0Y1QjZBNjI5RDlCRDQ0RTlENEM0MUEyREFBRkY1RTQxN0EyRTBFOTBGQTg0MzhGQjc4NjgxNDJGNzc5RUE5QjFDQzUzQUFCREIxM0FBRjJGRTI1ODBBNTUxMzg4MjZDQkVEOEY4QTA2NzRBMDg1MTMxMTBFN0MxRjFBREYxNzM3MTc4OURENzY2QjUzRTQ1NEFEQ0JDRUJEQUJCRDA1MEY0NjlGRjJGMzU1ODQxRThCODIzQzA4NTQ4MjU0MjREQzg3QjI3MzQ0NkNDNzBDMkZEQjgyOEI0M0UwMTdCRUZDOUFDNjU3OERBMDI5OEM2NENDMkI2QTMzQTY2NTFDQjU1RTcyMEYxOTNEN0I2OERFMENCQgorMjAxMTEwMTYxMjE5NTEgMiA2IDEwMCAyMDQ3IDUgRjk4RTdEREIwQkI4NTE2OTlEM0VBOUUwNDk4N0JBQ0Y3QTY0NkU5ODUwNzQ1NkExRDcwNDgwNDZEODE4QzZDMTY0Rjc2MkJEQjM5NTEwQjE5OUYyRTg1RTAyOUY3RjBDRDM3OENFOTEyRTM5M0NEMTYwMkVGQ0JFNjgxMzFGQkQwRjg2NkVENEYxQzQ4OEQwNTY5RDdEQ0U0NEQ0OUY0NTc0QkI5MTg2QzM0NThERjJENDJCRUZDQUNEQThFMTAwMzM3OTI4QTlCOEQxRTZDMjJCQ0MzMzQzN0VCRjQ1NzE3MTFBNDI3MkVERTNGNUI2QTYyOUQ5QkQ0NEU5RDRDNDFBMkRBQUZGNUU0MTdBMkUwRTkwRkE4NDM4RkI3ODY4MTQyRjc3OUVBOUIxQ0M1M0FBQkRCMTNBQUYyRkUyNTgwQTU1MTM4ODI2Q0JFRDhGOEEwNjc0QTA4NTEzMTEwRTdDMUYxQURGMTczNzE3ODlERDc2NkI1M0U0NTRBRENCQ0VCREFCQkQwNTBGNDY5RkYyRjM1NTg0MUU4QjgyM0MwODU0ODI1NDI0REM4N0IyNzM0NDZDQzcwQzJGREI4MjhCNDNFMDE3QkVGQzlBQzY1NzhEQTAyOThDNjRDQzJCNkEzM0E2NjUxQ0I1NUU3MjBGMTkzRDdCNjkyMzNFNzcKKzIwMTExMDE2MTIyMzA2IDIgNiAxMDAgMjA0NyA1IEY5OEU3RERCMEJCODUxNjk5RDNFQTlFMDQ5ODdCQUNGN0E2NDZFOTg1MDc0NTZBMUQ3MDQ4MDQ2RDgxOEM2QzE2NEY3NjJCREIzOTUxMEIxOTlGMkU4NUUwMjlGN0YwQ0QzNzhDRTkxMkUzOTNDRDE2MDJFRkNCRTY4MTMxRkJEMEY4NjZFRDRGMUM0ODhEMDU2OUQ3RENFNDRENDlGNDU3NEJCOTE4NkMzNDU4REYyRDQyQkVGQ0FDREE4RTEwMDMzNzkyOEE5QjhEMUU2QzIyQkNDMzM0MzdFQkY0NTcxNzExQTQyNzJFREUzRjVCNkE2MjlEOUJENDRFOUQ0QzQxQTJEQUFGRjVFNDE3QTJFMEU5MEZBODQzOEZCNzg2ODE0MkY3NzlFQTlCMUNDNTNBQUJEQjEzQUFGMkZFMjU4MEE1NTEzODgyNkNCRUQ4RjhBMDY3NEEwODUxMzExMEU3QzFGMUFERjE3MzcxNzg5REQ3NjZCNTNFNDU0QURDQkNFQkRBQkJEMDUwRjQ2OUZGMkYzNTU4NDFFOEI4MjNDMDg1NDgyNTQyNERDODdCMjczNDQ2Q0M3MEMyRkRCODI4QjQzRTAxN0JFRkM5QUM2NTc4REEwMjk4QzY0Q0MyQjZBMzNBNjY1MUNCNTVFNzIwRjE5M0Q3QjY5RjZDMDU3CisyMDExMTAxNjEyMjMyMCAyIDYgMTAwIDIwNDcgNSBGOThFN0REQjBCQjg1MTY5OUQzRUE5RTA0OTg3QkFDRjdBNjQ2RTk4NTA3NDU2QTFENzA0ODA0NkQ4MThDNkMxNjRGNzYyQkRCMzk1MTBCMTk5RjJFODVFMDI5RjdGMENEMzc4Q0U5MTJFMzkzQ0QxNjAyRUZDQkU2ODEzMUZCRDBGODY2RUQ0RjFDNDg4RDA1NjlEN0RDRTQ0RDQ5RjQ1NzRCQjkxODZDMzQ1OERGMkQ0MkJFRkNBQ0RBOEUxMDAzMzc5MjhBOUI4RDFFNkMyMkJDQzMzNDM3RUJGNDU3MTcxMUE0MjcyRURFM0Y1QjZBNjI5RDlCRDQ0RTlENEM0MUEyREFBRkY1RTQxN0EyRTBFOTBGQTg0MzhGQjc4NjgxNDJGNzc5RUE5QjFDQzUzQUFCREIxM0FBRjJGRTI1ODBBNTUxMzg4MjZDQkVEOEY4QTA2NzRBMDg1MTMxMTBFN0MxRjFBREYxNzM3MTc4OURENzY2QjUzRTQ1NEFEQ0JDRUJEQUJCRDA1MEY0NjlGRjJGMzU1ODQxRThCODIzQzA4NTQ4MjU0MjREQzg3QjI3MzQ0NkNDNzBDMkZEQjgyOEI0M0UwMTdCRUZDOUFDNjU3OERBMDI5OEM2NENDMkI2QTMzQTY2NTFDQjU1RTcyMEYxOTNEN0I2OUZEREEwRgorMjAxMTEwMTYxMjIzMzcgMiA2IDEwMCAyMDQ3IDIgRjk4RTdEREIwQkI4NTE2OTlEM0VBOUUwNDk4N0JBQ0Y3QTY0NkU5ODUwNzQ1NkExRDcwNDgwNDZEODE4QzZDMTY0Rjc2MkJEQjM5NTEwQjE5OUYyRTg1RTAyOUY3RjBDRDM3OENFOTEyRTM5M0NEMTYwMkVGQ0JFNjgxMzFGQkQwRjg2NkVENEYxQzQ4OEQwNTY5RDdEQ0U0NEQ0OUY0NTc0QkI5MTg2QzM0NThERjJENDJCRUZDQUNEQThFMTAwMzM3OTI4QTlCOEQxRTZDMjJCQ0MzMzQzN0VCRjQ1NzE3MTFBNDI3MkVERTNGNUI2QTYyOUQ5QkQ0NEU5RDRDNDFBMkRBQUZGNUU0MTdBMkUwRTkwRkE4NDM4RkI3ODY4MTQyRjc3OUVBOUIxQ0M1M0FBQkRCMTNBQUYyRkUyNTgwQTU1MTM4ODI2Q0JFRDhGOEEwNjc0QTA4NTEzMTEwRTdDMUYxQURGMTczNzE3ODlERDc2NkI1M0U0NTRBRENCQ0VCREFCQkQwNTBGNDY5RkYyRjM1NTg0MUU4QjgyM0MwODU0ODI1NDI0REM4N0IyNzM0NDZDQzcwQzJGREI4MjhCNDNFMDE3QkVGQzlBQzY1NzhEQTAyOThDNjRDQzJCNkEzM0E2NjUxQ0I1NUU3MjBGMTkzRDdCNkEwOEFERUIKKzIwMTExMDE2MTIyMzU3IDIgNiAxMDAgMjA0NyA1IEY5OEU3RERCMEJCODUxNjk5RDNFQTlFMDQ5ODdCQUNGN0E2NDZFOTg1MDc0NTZBMUQ3MDQ4MDQ2RDgxOEM2QzE2NEY3NjJCREIzOTUxMEIxOTlGMkU4NUUwMjlGN0YwQ0QzNzhDRTkxMkUzOTNDRDE2MDJFRkNCRTY4MTMxRkJEMEY4NjZFRDRGMUM0ODhEMDU2OUQ3RENFNDRENDlGNDU3NEJCOTE4NkMzNDU4REYyRDQyQkVGQ0FDREE4RTEwMDMzNzkyOEE5QjhEMUU2QzIyQkNDMzM0MzdFQkY0NTcxNzExQTQyNzJFREUzRjVCNkE2MjlEOUJENDRFOUQ0QzQxQTJEQUFGRjVFNDE3QTJFMEU5MEZBODQzOEZCNzg2ODE0MkY3NzlFQTlCMUNDNTNBQUJEQjEzQUFGMkZFMjU4MEE1NTEzODgyNkNCRUQ4RjhBMDY3NEEwODUxMzExMEU3QzFGMUFERjE3MzcxNzg5REQ3NjZCNTNFNDU0QURDQkNFQkRBQkJEMDUwRjQ2OUZGMkYzNTU4NDFFOEI4MjNDMDg1NDgyNTQyNERDODdCMjczNDQ2Q0M3MEMyRkRCODI4QjQzRTAxN0JFRkM5QUM2NTc4REEwMjk4QzY0Q0MyQjZBMzNBNjY1MUNCNTVFNzIwRjE5M0Q3QjZBMTc3NzdGCisyMDExMTAxNjEyMjQyMiAyIDYgMTAwIDIwNDcgMiBGOThFN0REQjBCQjg1MTY5OUQzRUE5RTA0OTg3QkFDRjdBNjQ2RTk4NTA3NDU2QTFENzA0ODA0NkQ4MThDNkMxNjRGNzYyQkRCMzk1MTBCMTk5RjJFODVFMDI5RjdGMENEMzc4Q0U5MTJFMzkzQ0QxNjAyRUZDQkU2ODEzMUZCRDBGODY2RUQ0RjFDNDg4RDA1NjlEN0RDRTQ0RDQ5RjQ1NzRCQjkxODZDMzQ1OERGMkQ0MkJFRkNBQ0RBOEUxMDAzMzc5MjhBOUI4RDFFNkMyMkJDQzMzNDM3RUJGNDU3MTcxMUE0MjcyRURFM0Y1QjZBNjI5RDlCRDQ0RTlENEM0MUEyREFBRkY1RTQxN0EyRTBFOTBGQTg0MzhGQjc4NjgxNDJGNzc5RUE5QjFDQzUzQUFCREIxM0FBRjJGRTI1ODBBNTUxMzg4MjZDQkVEOEY4QTA2NzRBMDg1MTMxMTBFN0MxRjFBREYxNzM3MTc4OURENzY2QjUzRTQ1NEFEQ0JDRUJEQUJCRDA1MEY0NjlGRjJGMzU1ODQxRThCODIzQzA4NTQ4MjU0MjREQzg3QjI3MzQ0NkNDNzBDMkZEQjgyOEI0M0UwMTdCRUZDOUFDNjU3OERBMDI5OEM2NENDMkI2QTMzQTY2NTFDQjU1RTcyMEYxOTNEN0I2QTJDNTI1MworMjAxMTEwMTYxMjM4NDEgMiA2IDEwMCAzMDcxIDIgRTY4NDZBNTgxNDhBQzc2MkREMENBOTA2NjJFNTYyNkQwQzU2NDdFNUM4Q0U3RDYxOTA5OTc4NDZGQjE3QTUwOTc2N0EyOEUxRTdCNUYxQUQ5OTQ0MDc2NjFDMTIyNUUwNUYzN0VFNDkwQUEzQzRDNUFFNzU3MTI5QkU5RUVDNURFREQ2NTAxRDI2RjQzQzJDQzBBMUUxRkY3RDExQTU1NjE2RDAyMDYxRTIwNTczQUM3NURBQjU5MkQ1NUM3ODE2MDhCOEEyMENCM0RBMkVCOUMyQzRDMkZEQTBDRjFFMDgzQjZDRkI0Mzc3MkZFRkU5NjlGREY1NkZBOTZFQkNCRkI0MTEwMzg0Q0JGMDMwN0YyREI1OTk1NEJBREUzNzZBRUI1NDRBQkFBMjY5RDM5REU1N0VDNTJFN0NFQjVFN0E1ODU1QkExNTIzQ0I3NzREMzg3RjRDMDE4RTY2QkZDREM4MUNDRTZFNTlBMkU5QkQ5RDBFNzg4RTZEQTA4MUIxNTg4MTczRTBDM0M3RDdCRUM2NjI1RDYyQUZCMjFCOUUxMjI4RkQyNjIwRTNDMjU3REVDRkIwNzlERUVCRDQzRUVDM0ZEOEI2N0FGNkQ0MUZCNzM1NUJEMTg0Nzk2RDY2RkZFQjM4NERCNDFDN0QxNEVDRkREQUY1OUY4NDVCMzUxRDU1RTI0QUU5N0NCRDNDMjFCMDkzRTU4QkY1MUFFRTMxMkE1NjFCOUI3QzUzMkM4NTk1NDdFMUUxOUQ1MzkzNzhCOEI4MDZCM0VDQzJBRDdDMEFEQkM2MjhBQUI5MURFQkM1RkEzMjlDMkU3MUY2NzhGOTYyQkMxMjMwNTMxNjkzNkQ1QTUwNjM0MTE2MTA2MzI0NTFDODM3RDgzODA2Qjk4REQwMzg1NDg1OTJBMjkxMEM0QkY0NzEzRkRGOEJGRDcwODk3Njk3RkZGMTdCN0Y1OUZEOEFENTA1MTAzRUVBQjdBMzlCRTFCREVDRDI4MzNEQjAyNTI0RUZBRjgzCisyMDExMTAxNjEyNDQxNiAyIDYgMTAwIDMwNzEgMiBFNjg0NkE1ODE0OEFDNzYyREQwQ0E5MDY2MkU1NjI2RDBDNTY0N0U1QzhDRTdENjE5MDk5Nzg0NkZCMTdBNTA5NzY3QTI4RTFFN0I1RjFBRDk5NDQwNzY2MUMxMjI1RTA1RjM3RUU0OTBBQTNDNEM1QUU3NTcxMjlCRTlFRUM1REVERDY1MDFEMjZGNDNDMkNDMEExRTFGRjdEMTFBNTU2MTZEMDIwNjFFMjA1NzNBQzc1REFCNTkyRDU1Qzc4MTYwOEI4QTIwQ0IzREEyRUI5QzJDNEMyRkRBMENGMUUwODNCNkNGQjQzNzcyRkVGRTk2OUZERjU2RkE5NkVCQ0JGQjQxMTAzODRDQkYwMzA3RjJEQjU5OTU0QkFERTM3NkFFQjU0NEFCQUEyNjlEMzlERTU3RUM1MkU3Q0VCNUU3QTU4NTVCQTE1MjNDQjc3NEQzODdGNEMwMThFNjZCRkNEQzgxQ0NFNkU1OUEyRTlCRDlEMEU3ODhFNkRBMDgxQjE1ODgxNzNFMEMzQzdEN0JFQzY2MjVENjJBRkIyMUI5RTEyMjhGRDI2MjBFM0MyNTdERUNGQjA3OURFRUJENDNFRUMzRkQ4QjY3QUY2RDQxRkI3MzU1QkQxODQ3OTZENjZGRkVCMzg0REI0MUM3RDE0RUNGRERBRjU5Rjg0NUIzNTFENTVFMjRBRTk3Q0JEM0MyMUIwOTNFNThCRjUxQUVFMzEyQTU2MUI5QjdDNTMyQzg1OTU0N0UxRTE5RDUzOTM3OEI4QjgwNkIzRUNDMkFEN0MwQURCQzYyOEFBQjkxREVCQzVGQTMyOUMyRTcxRjY3OEY5NjJCQzEyMzA1MzE2OTM2RDVBNTA2MzQxMTYxMDYzMjQ1MUM4MzdEODM4MDZCOThERDAzODU0ODU5MkEyOTEwQzRCRjQ3MTNGREY4QkZENzA4OTc2OTdGRkYxN0I3RjU5RkQ4QUQ1MDUxMDNFRUFCN0EzOUJFMUJERUNEMjgzM0RCMDI1MjU1REQ4OEIKKzIwMTExMDE2MTI1NjI5IDIgNiAxMDAgMzA3MSA1IEU2ODQ2QTU4MTQ4QUM3NjJERDBDQTkwNjYyRTU2MjZEMEM1NjQ3RTVDOENFN0Q2MTkwOTk3ODQ2RkIxN0E1MDk3NjdBMjhFMUU3QjVGMUFEOTk0NDA3NjYxQzEyMjVFMDVGMzdFRTQ5MEFBM0M0QzVBRTc1NzEyOUJFOUVFQzVERURENjUwMUQyNkY0M0MyQ0MwQTFFMUZGN0QxMUE1NTYxNkQwMjA2MUUyMDU3M0FDNzVEQUI1OTJENTVDNzgxNjA4QjhBMjBDQjNEQTJFQjlDMkM0QzJGREEwQ0YxRTA4M0I2Q0ZCNDM3NzJGRUZFOTY5RkRGNTZGQTk2RUJDQkZCNDExMDM4NENCRjAzMDdGMkRCNTk5NTRCQURFMzc2QUVCNTQ0QUJBQTI2OUQzOURFNTdFQzUyRTdDRUI1RTdBNTg1NUJBMTUyM0NCNzc0RDM4N0Y0QzAxOEU2NkJGQ0RDODFDQ0U2RTU5QTJFOUJEOUQwRTc4OEU2REEwODFCMTU4ODE3M0UwQzNDN0Q3QkVDNjYyNUQ2MkFGQjIxQjlFMTIyOEZEMjYyMEUzQzI1N0RFQ0ZCMDc5REVFQkQ0M0VFQzNGRDhCNjdBRjZENDFGQjczNTVCRDE4NDc5NkQ2NkZGRUIzODREQjQxQzdEMTRFQ0ZEREFGNTlGODQ1QjM1MUQ1NUUyNEFFOTdDQkQzQzIxQjA5M0U1OEJGNTFBRUUzMTJBNTYxQjlCN0M1MzJDODU5NTQ3RTFFMTlENTM5Mzc4QjhCODA2QjNFQ0MyQUQ3QzBBREJDNjI4QUFCOTFERUJDNUZBMzI5QzJFNzFGNjc4Rjk2MkJDMTIzMDUzMTY5MzZENUE1MDYzNDExNjEwNjMyNDUxQzgzN0Q4MzgwNkI5OEREMDM4NTQ4NTkyQTI5MTBDNEJGNDcxM0ZERjhCRkQ3MDg5NzY5N0ZGRjE3QjdGNTlGRDhBRDUwNTEwM0VFQUI3QTM5QkUxQkRFQ0QyODMzREIwMjUyNjU0NzM4RgorMjAxMTEwMTYxMzA2MzggMiA2IDEwMCAzMDcxIDIgRTY4NDZBNTgxNDhBQzc2MkREMENBOTA2NjJFNTYyNkQwQzU2NDdFNUM4Q0U3RDYxOTA5OTc4NDZGQjE3QTUwOTc2N0EyOEUxRTdCNUYxQUQ5OTQ0MDc2NjFDMTIyNUUwNUYzN0VFNDkwQUEzQzRDNUFFNzU3MTI5QkU5RUVDNURFREQ2NTAxRDI2RjQzQzJDQzBBMUUxRkY3RDExQTU1NjE2RDAyMDYxRTIwNTczQUM3NURBQjU5MkQ1NUM3ODE2MDhCOEEyMENCM0RBMkVCOUMyQzRDMkZEQTBDRjFFMDgzQjZDRkI0Mzc3MkZFRkU5NjlGREY1NkZBOTZFQkNCRkI0MTEwMzg0Q0JGMDMwN0YyREI1OTk1NEJBREUzNzZBRUI1NDRBQkFBMjY5RDM5REU1N0VDNTJFN0NFQjVFN0E1ODU1QkExNTIzQ0I3NzREMzg3RjRDMDE4RTY2QkZDREM4MUNDRTZFNTlBMkU5QkQ5RDBFNzg4RTZEQTA4MUIxNTg4MTczRTBDM0M3RDdCRUM2NjI1RDYyQUZCMjFCOUUxMjI4RkQyNjIwRTNDMjU3REVDRkIwNzlERUVCRDQzRUVDM0ZEOEI2N0FGNkQ0MUZCNzM1NUJEMTg0Nzk2RDY2RkZFQjM4NERCNDFDN0QxNEVDRkREQUY1OUY4NDVCMzUxRDU1RTI0QUU5N0NCRDNDMjFCMDkzRTU4QkY1MUFFRTMxMkE1NjFCOUI3QzUzMkM4NTk1NDdFMUUxOUQ1MzkzNzhCOEI4MDZCM0VDQzJBRDdDMEFEQkM2MjhBQUI5MURFQkM1RkEzMjlDMkU3MUY2NzhGOTYyQkMxMjMwNTMxNjkzNkQ1QTUwNjM0MTE2MTA2MzI0NTFDODM3RDgzODA2Qjk4REQwMzg1NDg1OTJBMjkxMEM0QkY0NzEzRkRGOEJGRDcwODk3Njk3RkZGMTdCN0Y1OUZEOEFENTA1MTAzRUVBQjdBMzlCRTFCREVDRDI4MzNEQjAyNTI3MUIzRDhCCisyMDExMTAxNjEzMTQ0NyAyIDYgMTAwIDMwNzEgMiBFNjg0NkE1ODE0OEFDNzYyREQwQ0E5MDY2MkU1NjI2RDBDNTY0N0U1QzhDRTdENjE5MDk5Nzg0NkZCMTdBNTA5NzY3QTI4RTFFN0I1RjFBRDk5NDQwNzY2MUMxMjI1RTA1RjM3RUU0OTBBQTNDNEM1QUU3NTcxMjlCRTlFRUM1REVERDY1MDFEMjZGNDNDMkNDMEExRTFGRjdEMTFBNTU2MTZEMDIwNjFFMjA1NzNBQzc1REFCNTkyRDU1Qzc4MTYwOEI4QTIwQ0IzREEyRUI5QzJDNEMyRkRBMENGMUUwODNCNkNGQjQzNzcyRkVGRTk2OUZERjU2RkE5NkVCQ0JGQjQxMTAzODRDQkYwMzA3RjJEQjU5OTU0QkFERTM3NkFFQjU0NEFCQUEyNjlEMzlERTU3RUM1MkU3Q0VCNUU3QTU4NTVCQTE1MjNDQjc3NEQzODdGNEMwMThFNjZCRkNEQzgxQ0NFNkU1OUEyRTlCRDlEMEU3ODhFNkRBMDgxQjE1ODgxNzNFMEMzQzdEN0JFQzY2MjVENjJBRkIyMUI5RTEyMjhGRDI2MjBFM0MyNTdERUNGQjA3OURFRUJENDNFRUMzRkQ4QjY3QUY2RDQxRkI3MzU1QkQxODQ3OTZENjZGRkVCMzg0REI0MUM3RDE0RUNGRERBRjU5Rjg0NUIzNTFENTVFMjRBRTk3Q0JEM0MyMUIwOTNFNThCRjUxQUVFMzEyQTU2MUI5QjdDNTMyQzg1OTU0N0UxRTE5RDUzOTM3OEI4QjgwNkIzRUNDMkFEN0MwQURCQzYyOEFBQjkxREVCQzVGQTMyOUMyRTcxRjY3OEY5NjJCQzEyMzA1MzE2OTM2RDVBNTA2MzQxMTYxMDYzMjQ1MUM4MzdEODM4MDZCOThERDAzODU0ODU5MkEyOTEwQzRCRjQ3MTNGREY4QkZENzA4OTc2OTdGRkYxN0I3RjU5RkQ4QUQ1MDUxMDNFRUFCN0EzOUJFMUJERUNEMjgzM0RCMDI1MjdCMUUwQUIKKzIwMTExMDE2MTMxNzIwIDIgNiAxMDAgMzA3MSAyIEU2ODQ2QTU4MTQ4QUM3NjJERDBDQTkwNjYyRTU2MjZEMEM1NjQ3RTVDOENFN0Q2MTkwOTk3ODQ2RkIxN0E1MDk3NjdBMjhFMUU3QjVGMUFEOTk0NDA3NjYxQzEyMjVFMDVGMzdFRTQ5MEFBM0M0QzVBRTc1NzEyOUJFOUVFQzVERURENjUwMUQyNkY0M0MyQ0MwQTFFMUZGN0QxMUE1NTYxNkQwMjA2MUUyMDU3M0FDNzVEQUI1OTJENTVDNzgxNjA4QjhBMjBDQjNEQTJFQjlDMkM0QzJGREEwQ0YxRTA4M0I2Q0ZCNDM3NzJGRUZFOTY5RkRGNTZGQTk2RUJDQkZCNDExMDM4NENCRjAzMDdGMkRCNTk5NTRCQURFMzc2QUVCNTQ0QUJBQTI2OUQzOURFNTdFQzUyRTdDRUI1RTdBNTg1NUJBMTUyM0NCNzc0RDM4N0Y0QzAxOEU2NkJGQ0RDODFDQ0U2RTU5QTJFOUJEOUQwRTc4OEU2REEwODFCMTU4ODE3M0UwQzNDN0Q3QkVDNjYyNUQ2MkFGQjIxQjlFMTIyOEZEMjYyMEUzQzI1N0RFQ0ZCMDc5REVFQkQ0M0VFQzNGRDhCNjdBRjZENDFGQjczNTVCRDE4NDc5NkQ2NkZGRUIzODREQjQxQzdEMTRFQ0ZEREFGNTlGODQ1QjM1MUQ1NUUyNEFFOTdDQkQzQzIxQjA5M0U1OEJGNTFBRUUzMTJBNTYxQjlCN0M1MzJDODU5NTQ3RTFFMTlENTM5Mzc4QjhCODA2QjNFQ0MyQUQ3QzBBREJDNjI4QUFCOTFERUJDNUZBMzI5QzJFNzFGNjc4Rjk2MkJDMTIzMDUzMTY5MzZENUE1MDYzNDExNjEwNjMyNDUxQzgzN0Q4MzgwNkI5OEREMDM4NTQ4NTkyQTI5MTBDNEJGNDcxM0ZERjhCRkQ3MDg5NzY5N0ZGRjE3QjdGNTlGRDhBRDUwNTEwM0VFQUI3QTM5QkUxQkRFQ0QyODMzREIwMjUyN0RFNDQwMworMjAxMTEwMTYxMzIzMDEgMiA2IDEwMCAzMDcxIDUgRTY4NDZBNTgxNDhBQzc2MkREMENBOTA2NjJFNTYyNkQwQzU2NDdFNUM4Q0U3RDYxOTA5OTc4NDZGQjE3QTUwOTc2N0EyOEUxRTdCNUYxQUQ5OTQ0MDc2NjFDMTIyNUUwNUYzN0VFNDkwQUEzQzRDNUFFNzU3MTI5QkU5RUVDNURFREQ2NTAxRDI2RjQzQzJDQzBBMUUxRkY3RDExQTU1NjE2RDAyMDYxRTIwNTczQUM3NURBQjU5MkQ1NUM3ODE2MDhCOEEyMENCM0RBMkVCOUMyQzRDMkZEQTBDRjFFMDgzQjZDRkI0Mzc3MkZFRkU5NjlGREY1NkZBOTZFQkNCRkI0MTEwMzg0Q0JGMDMwN0YyREI1OTk1NEJBREUzNzZBRUI1NDRBQkFBMjY5RDM5REU1N0VDNTJFN0NFQjVFN0E1ODU1QkExNTIzQ0I3NzREMzg3RjRDMDE4RTY2QkZDREM4MUNDRTZFNTlBMkU5QkQ5RDBFNzg4RTZEQTA4MUIxNTg4MTczRTBDM0M3RDdCRUM2NjI1RDYyQUZCMjFCOUUxMjI4RkQyNjIwRTNDMjU3REVDRkIwNzlERUVCRDQzRUVDM0ZEOEI2N0FGNkQ0MUZCNzM1NUJEMTg0Nzk2RDY2RkZFQjM4NERCNDFDN0QxNEVDRkREQUY1OUY4NDVCMzUxRDU1RTI0QUU5N0NCRDNDMjFCMDkzRTU4QkY1MUFFRTMxMkE1NjFCOUI3QzUzMkM4NTk1NDdFMUUxOUQ1MzkzNzhCOEI4MDZCM0VDQzJBRDdDMEFEQkM2MjhBQUI5MURFQkM1RkEzMjlDMkU3MUY2NzhGOTYyQkMxMjMwNTMxNjkzNkQ1QTUwNjM0MTE2MTA2MzI0NTFDODM3RDgzODA2Qjk4REQwMzg1NDg1OTJBMjkxMEM0QkY0NzEzRkRGOEJGRDcwODk3Njk3RkZGMTdCN0Y1OUZEOEFENTA1MTAzRUVBQjdBMzlCRTFCREVDRDI4MzNEQjAyNTI4NDRFRjI3CisyMDExMTAxNjEzMjQ0MyAyIDYgMTAwIDMwNzEgNSBFNjg0NkE1ODE0OEFDNzYyREQwQ0E5MDY2MkU1NjI2RDBDNTY0N0U1QzhDRTdENjE5MDk5Nzg0NkZCMTdBNTA5NzY3QTI4RTFFN0I1RjFBRDk5NDQwNzY2MUMxMjI1RTA1RjM3RUU0OTBBQTNDNEM1QUU3NTcxMjlCRTlFRUM1REVERDY1MDFEMjZGNDNDMkNDMEExRTFGRjdEMTFBNTU2MTZEMDIwNjFFMjA1NzNBQzc1REFCNTkyRDU1Qzc4MTYwOEI4QTIwQ0IzREEyRUI5QzJDNEMyRkRBMENGMUUwODNCNkNGQjQzNzcyRkVGRTk2OUZERjU2RkE5NkVCQ0JGQjQxMTAzODRDQkYwMzA3RjJEQjU5OTU0QkFERTM3NkFFQjU0NEFCQUEyNjlEMzlERTU3RUM1MkU3Q0VCNUU3QTU4NTVCQTE1MjNDQjc3NEQzODdGNEMwMThFNjZCRkNEQzgxQ0NFNkU1OUEyRTlCRDlEMEU3ODhFNkRBMDgxQjE1ODgxNzNFMEMzQzdEN0JFQzY2MjVENjJBRkIyMUI5RTEyMjhGRDI2MjBFM0MyNTdERUNGQjA3OURFRUJENDNFRUMzRkQ4QjY3QUY2RDQxRkI3MzU1QkQxODQ3OTZENjZGRkVCMzg0REI0MUM3RDE0RUNGRERBRjU5Rjg0NUIzNTFENTVFMjRBRTk3Q0JEM0MyMUIwOTNFNThCRjUxQUVFMzEyQTU2MUI5QjdDNTMyQzg1OTU0N0UxRTE5RDUzOTM3OEI4QjgwNkIzRUNDMkFEN0MwQURCQzYyOEFBQjkxREVCQzVGQTMyOUMyRTcxRjY3OEY5NjJCQzEyMzA1MzE2OTM2RDVBNTA2MzQxMTYxMDYzMjQ1MUM4MzdEODM4MDZCOThERDAzODU0ODU5MkEyOTEwQzRCRjQ3MTNGREY4QkZENzA4OTc2OTdGRkYxN0I3RjU5RkQ4QUQ1MDUxMDNFRUFCN0EzOUJFMUJERUNEMjgzM0RCMDI1Mjg2MDExMTcKKzIwMTExMDE2MTM0OTQ5IDIgNiAxMDAgMzA3MSA1IEU2ODQ2QTU4MTQ4QUM3NjJERDBDQTkwNjYyRTU2MjZEMEM1NjQ3RTVDOENFN0Q2MTkwOTk3ODQ2RkIxN0E1MDk3NjdBMjhFMUU3QjVGMUFEOTk0NDA3NjYxQzEyMjVFMDVGMzdFRTQ5MEFBM0M0QzVBRTc1NzEyOUJFOUVFQzVERURENjUwMUQyNkY0M0MyQ0MwQTFFMUZGN0QxMUE1NTYxNkQwMjA2MUUyMDU3M0FDNzVEQUI1OTJENTVDNzgxNjA4QjhBMjBDQjNEQTJFQjlDMkM0QzJGREEwQ0YxRTA4M0I2Q0ZCNDM3NzJGRUZFOTY5RkRGNTZGQTk2RUJDQkZCNDExMDM4NENCRjAzMDdGMkRCNTk5NTRCQURFMzc2QUVCNTQ0QUJBQTI2OUQzOURFNTdFQzUyRTdDRUI1RTdBNTg1NUJBMTUyM0NCNzc0RDM4N0Y0QzAxOEU2NkJGQ0RDODFDQ0U2RTU5QTJFOUJEOUQwRTc4OEU2REEwODFCMTU4ODE3M0UwQzNDN0Q3QkVDNjYyNUQ2MkFGQjIxQjlFMTIyOEZEMjYyMEUzQzI1N0RFQ0ZCMDc5REVFQkQ0M0VFQzNGRDhCNjdBRjZENDFGQjczNTVCRDE4NDc5NkQ2NkZGRUIzODREQjQxQzdEMTRFQ0ZEREFGNTlGODQ1QjM1MUQ1NUUyNEFFOTdDQkQzQzIxQjA5M0U1OEJGNTFBRUUzMTJBNTYxQjlCN0M1MzJDODU5NTQ3RTFFMTlENTM5Mzc4QjhCODA2QjNFQ0MyQUQ3QzBBREJDNjI4QUFCOTFERUJDNUZBMzI5QzJFNzFGNjc4Rjk2MkJDMTIzMDUzMTY5MzZENUE1MDYzNDExNjEwNjMyNDUxQzgzN0Q4MzgwNkI5OEREMDM4NTQ4NTkyQTI5MTBDNEJGNDcxM0ZERjhCRkQ3MDg5NzY5N0ZGRjE3QjdGNTlGRDhBRDUwNTEwM0VFQUI3QTM5QkUxQkRFQ0QyODMzREIwMjUyQTZEMURENworMjAxMTEwMTYxMzUyMDggMiA2IDEwMCAzMDcxIDIgRTY4NDZBNTgxNDhBQzc2MkREMENBOTA2NjJFNTYyNkQwQzU2NDdFNUM4Q0U3RDYxOTA5OTc4NDZGQjE3QTUwOTc2N0EyOEUxRTdCNUYxQUQ5OTQ0MDc2NjFDMTIyNUUwNUYzN0VFNDkwQUEzQzRDNUFFNzU3MTI5QkU5RUVDNURFREQ2NTAxRDI2RjQzQzJDQzBBMUUxRkY3RDExQTU1NjE2RDAyMDYxRTIwNTczQUM3NURBQjU5MkQ1NUM3ODE2MDhCOEEyMENCM0RBMkVCOUMyQzRDMkZEQTBDRjFFMDgzQjZDRkI0Mzc3MkZFRkU5NjlGREY1NkZBOTZFQkNCRkI0MTEwMzg0Q0JGMDMwN0YyREI1OTk1NEJBREUzNzZBRUI1NDRBQkFBMjY5RDM5REU1N0VDNTJFN0NFQjVFN0E1ODU1QkExNTIzQ0I3NzREMzg3RjRDMDE4RTY2QkZDREM4MUNDRTZFNTlBMkU5QkQ5RDBFNzg4RTZEQTA4MUIxNTg4MTczRTBDM0M3RDdCRUM2NjI1RDYyQUZCMjFCOUUxMjI4RkQyNjIwRTNDMjU3REVDRkIwNzlERUVCRDQzRUVDM0ZEOEI2N0FGNkQ0MUZCNzM1NUJEMTg0Nzk2RDY2RkZFQjM4NERCNDFDN0QxNEVDRkREQUY1OUY4NDVCMzUxRDU1RTI0QUU5N0NCRDNDMjFCMDkzRTU4QkY1MUFFRTMxMkE1NjFCOUI3QzUzMkM4NTk1NDdFMUUxOUQ1MzkzNzhCOEI4MDZCM0VDQzJBRDdDMEFEQkM2MjhBQUI5MURFQkM1RkEzMjlDMkU3MUY2NzhGOTYyQkMxMjMwNTMxNjkzNkQ1QTUwNjM0MTE2MTA2MzI0NTFDODM3RDgzODA2Qjk4REQwMzg1NDg1OTJBMjkxMEM0QkY0NzEzRkRGOEJGRDcwODk3Njk3RkZGMTdCN0Y1OUZEOEFENTA1MTAzRUVBQjdBMzlCRTFCREVDRDI4MzNEQjAyNTJBOTVCQkIzCisyMDExMTAxNjE0MDAxMyAyIDYgMTAwIDMwNzEgNSBFNjg0NkE1ODE0OEFDNzYyREQwQ0E5MDY2MkU1NjI2RDBDNTY0N0U1QzhDRTdENjE5MDk5Nzg0NkZCMTdBNTA5NzY3QTI4RTFFN0I1RjFBRDk5NDQwNzY2MUMxMjI1RTA1RjM3RUU0OTBBQTNDNEM1QUU3NTcxMjlCRTlFRUM1REVERDY1MDFEMjZGNDNDMkNDMEExRTFGRjdEMTFBNTU2MTZEMDIwNjFFMjA1NzNBQzc1REFCNTkyRDU1Qzc4MTYwOEI4QTIwQ0IzREEyRUI5QzJDNEMyRkRBMENGMUUwODNCNkNGQjQzNzcyRkVGRTk2OUZERjU2RkE5NkVCQ0JGQjQxMTAzODRDQkYwMzA3RjJEQjU5OTU0QkFERTM3NkFFQjU0NEFCQUEyNjlEMzlERTU3RUM1MkU3Q0VCNUU3QTU4NTVCQTE1MjNDQjc3NEQzODdGNEMwMThFNjZCRkNEQzgxQ0NFNkU1OUEyRTlCRDlEMEU3ODhFNkRBMDgxQjE1ODgxNzNFMEMzQzdEN0JFQzY2MjVENjJBRkIyMUI5RTEyMjhGRDI2MjBFM0MyNTdERUNGQjA3OURFRUJENDNFRUMzRkQ4QjY3QUY2RDQxRkI3MzU1QkQxODQ3OTZENjZGRkVCMzg0REI0MUM3RDE0RUNGRERBRjU5Rjg0NUIzNTFENTVFMjRBRTk3Q0JEM0MyMUIwOTNFNThCRjUxQUVFMzEyQTU2MUI5QjdDNTMyQzg1OTU0N0UxRTE5RDUzOTM3OEI4QjgwNkIzRUNDMkFEN0MwQURCQzYyOEFBQjkxREVCQzVGQTMyOUMyRTcxRjY3OEY5NjJCQzEyMzA1MzE2OTM2RDVBNTA2MzQxMTYxMDYzMjQ1MUM4MzdEODM4MDZCOThERDAzODU0ODU5MkEyOTEwQzRCRjQ3MTNGREY4QkZENzA4OTc2OTdGRkYxN0I3RjU5RkQ4QUQ1MDUxMDNFRUFCN0EzOUJFMUJERUNEMjgzM0RCMDI1MkIzN0E1M0YKKzIwMTExMDE2MTQwNjMwIDIgNiAxMDAgMzA3MSAyIEU2ODQ2QTU4MTQ4QUM3NjJERDBDQTkwNjYyRTU2MjZEMEM1NjQ3RTVDOENFN0Q2MTkwOTk3ODQ2RkIxN0E1MDk3NjdBMjhFMUU3QjVGMUFEOTk0NDA3NjYxQzEyMjVFMDVGMzdFRTQ5MEFBM0M0QzVBRTc1NzEyOUJFOUVFQzVERURENjUwMUQyNkY0M0MyQ0MwQTFFMUZGN0QxMUE1NTYxNkQwMjA2MUUyMDU3M0FDNzVEQUI1OTJENTVDNzgxNjA4QjhBMjBDQjNEQTJFQjlDMkM0QzJGREEwQ0YxRTA4M0I2Q0ZCNDM3NzJGRUZFOTY5RkRGNTZGQTk2RUJDQkZCNDExMDM4NENCRjAzMDdGMkRCNTk5NTRCQURFMzc2QUVCNTQ0QUJBQTI2OUQzOURFNTdFQzUyRTdDRUI1RTdBNTg1NUJBMTUyM0NCNzc0RDM4N0Y0QzAxOEU2NkJGQ0RDODFDQ0U2RTU5QTJFOUJEOUQwRTc4OEU2REEwODFCMTU4ODE3M0UwQzNDN0Q3QkVDNjYyNUQ2MkFGQjIxQjlFMTIyOEZEMjYyMEUzQzI1N0RFQ0ZCMDc5REVFQkQ0M0VFQzNGRDhCNjdBRjZENDFGQjczNTVCRDE4NDc5NkQ2NkZGRUIzODREQjQxQzdEMTRFQ0ZEREFGNTlGODQ1QjM1MUQ1NUUyNEFFOTdDQkQzQzIxQjA5M0U1OEJGNTFBRUUzMTJBNTYxQjlCN0M1MzJDODU5NTQ3RTFFMTlENTM5Mzc4QjhCODA2QjNFQ0MyQUQ3QzBBREJDNjI4QUFCOTFERUJDNUZBMzI5QzJFNzFGNjc4Rjk2MkJDMTIzMDUzMTY5MzZENUE1MDYzNDExNjEwNjMyNDUxQzgzN0Q4MzgwNkI5OEREMDM4NTQ4NTkyQTI5MTBDNEJGNDcxM0ZERjhCRkQ3MDg5NzY5N0ZGRjE3QjdGNTlGRDhBRDUwNTEwM0VFQUI3QTM5QkUxQkRFQ0QyODMzREIwMjUyQkIxQzREQgorMjAxMTEwMTYxNDA4NTggMiA2IDEwMCAzMDcxIDUgRTY4NDZBNTgxNDhBQzc2MkREMENBOTA2NjJFNTYyNkQwQzU2NDdFNUM4Q0U3RDYxOTA5OTc4NDZGQjE3QTUwOTc2N0EyOEUxRTdCNUYxQUQ5OTQ0MDc2NjFDMTIyNUUwNUYzN0VFNDkwQUEzQzRDNUFFNzU3MTI5QkU5RUVDNURFREQ2NTAxRDI2RjQzQzJDQzBBMUUxRkY3RDExQTU1NjE2RDAyMDYxRTIwNTczQUM3NURBQjU5MkQ1NUM3ODE2MDhCOEEyMENCM0RBMkVCOUMyQzRDMkZEQTBDRjFFMDgzQjZDRkI0Mzc3MkZFRkU5NjlGREY1NkZBOTZFQkNCRkI0MTEwMzg0Q0JGMDMwN0YyREI1OTk1NEJBREUzNzZBRUI1NDRBQkFBMjY5RDM5REU1N0VDNTJFN0NFQjVFN0E1ODU1QkExNTIzQ0I3NzREMzg3RjRDMDE4RTY2QkZDREM4MUNDRTZFNTlBMkU5QkQ5RDBFNzg4RTZEQTA4MUIxNTg4MTczRTBDM0M3RDdCRUM2NjI1RDYyQUZCMjFCOUUxMjI4RkQyNjIwRTNDMjU3REVDRkIwNzlERUVCRDQzRUVDM0ZEOEI2N0FGNkQ0MUZCNzM1NUJEMTg0Nzk2RDY2RkZFQjM4NERCNDFDN0QxNEVDRkREQUY1OUY4NDVCMzUxRDU1RTI0QUU5N0NCRDNDMjFCMDkzRTU4QkY1MUFFRTMxMkE1NjFCOUI3QzUzMkM4NTk1NDdFMUUxOUQ1MzkzNzhCOEI4MDZCM0VDQzJBRDdDMEFEQkM2MjhBQUI5MURFQkM1RkEzMjlDMkU3MUY2NzhGOTYyQkMxMjMwNTMxNjkzNkQ1QTUwNjM0MTE2MTA2MzI0NTFDODM3RDgzODA2Qjk4REQwMzg1NDg1OTJBMjkxMEM0QkY0NzEzRkRGOEJGRDcwODk3Njk3RkZGMTdCN0Y1OUZEOEFENTA1MTAzRUVBQjdBMzlCRTFCREVDRDI4MzNEQjAyNTJCREIxQjA3CisyMDExMTAxNjE0MTIxNiAyIDYgMTAwIDMwNzEgNSBFNjg0NkE1ODE0OEFDNzYyREQwQ0E5MDY2MkU1NjI2RDBDNTY0N0U1QzhDRTdENjE5MDk5Nzg0NkZCMTdBNTA5NzY3QTI4RTFFN0I1RjFBRDk5NDQwNzY2MUMxMjI1RTA1RjM3RUU0OTBBQTNDNEM1QUU3NTcxMjlCRTlFRUM1REVERDY1MDFEMjZGNDNDMkNDMEExRTFGRjdEMTFBNTU2MTZEMDIwNjFFMjA1NzNBQzc1REFCNTkyRDU1Qzc4MTYwOEI4QTIwQ0IzREEyRUI5QzJDNEMyRkRBMENGMUUwODNCNkNGQjQzNzcyRkVGRTk2OUZERjU2RkE5NkVCQ0JGQjQxMTAzODRDQkYwMzA3RjJEQjU5OTU0QkFERTM3NkFFQjU0NEFCQUEyNjlEMzlERTU3RUM1MkU3Q0VCNUU3QTU4NTVCQTE1MjNDQjc3NEQzODdGNEMwMThFNjZCRkNEQzgxQ0NFNkU1OUEyRTlCRDlEMEU3ODhFNkRBMDgxQjE1ODgxNzNFMEMzQzdEN0JFQzY2MjVENjJBRkIyMUI5RTEyMjhGRDI2MjBFM0MyNTdERUNGQjA3OURFRUJENDNFRUMzRkQ4QjY3QUY2RDQxRkI3MzU1QkQxODQ3OTZENjZGRkVCMzg0REI0MUM3RDE0RUNGRERBRjU5Rjg0NUIzNTFENTVFMjRBRTk3Q0JEM0MyMUIwOTNFNThCRjUxQUVFMzEyQTU2MUI5QjdDNTMyQzg1OTU0N0UxRTE5RDUzOTM3OEI4QjgwNkIzRUNDMkFEN0MwQURCQzYyOEFBQjkxREVCQzVGQTMyOUMyRTcxRjY3OEY5NjJCQzEyMzA1MzE2OTM2RDVBNTA2MzQxMTYxMDYzMjQ1MUM4MzdEODM4MDZCOThERDAzODU0ODU5MkEyOTEwQzRCRjQ3MTNGREY4QkZENzA4OTc2OTdGRkYxN0I3RjU5RkQ4QUQ1MDUxMDNFRUFCN0EzOUJFMUJERUNEMjgzM0RCMDI1MkMxOURDMUYKKzIwMTExMDE2MTQ1NzA5IDIgNiAxMDAgMzA3MSA1IEU2ODQ2QTU4MTQ4QUM3NjJERDBDQTkwNjYyRTU2MjZEMEM1NjQ3RTVDOENFN0Q2MTkwOTk3ODQ2RkIxN0E1MDk3NjdBMjhFMUU3QjVGMUFEOTk0NDA3NjYxQzEyMjVFMDVGMzdFRTQ5MEFBM0M0QzVBRTc1NzEyOUJFOUVFQzVERURENjUwMUQyNkY0M0MyQ0MwQTFFMUZGN0QxMUE1NTYxNkQwMjA2MUUyMDU3M0FDNzVEQUI1OTJENTVDNzgxNjA4QjhBMjBDQjNEQTJFQjlDMkM0QzJGREEwQ0YxRTA4M0I2Q0ZCNDM3NzJGRUZFOTY5RkRGNTZGQTk2RUJDQkZCNDExMDM4NENCRjAzMDdGMkRCNTk5NTRCQURFMzc2QUVCNTQ0QUJBQTI2OUQzOURFNTdFQzUyRTdDRUI1RTdBNTg1NUJBMTUyM0NCNzc0RDM4N0Y0QzAxOEU2NkJGQ0RDODFDQ0U2RTU5QTJFOUJEOUQwRTc4OEU2REEwODFCMTU4ODE3M0UwQzNDN0Q3QkVDNjYyNUQ2MkFGQjIxQjlFMTIyOEZEMjYyMEUzQzI1N0RFQ0ZCMDc5REVFQkQ0M0VFQzNGRDhCNjdBRjZENDFGQjczNTVCRDE4NDc5NkQ2NkZGRUIzODREQjQxQzdEMTRFQ0ZEREFGNTlGODQ1QjM1MUQ1NUUyNEFFOTdDQkQzQzIxQjA5M0U1OEJGNTFBRUUzMTJBNTYxQjlCN0M1MzJDODU5NTQ3RTFFMTlENTM5Mzc4QjhCODA2QjNFQ0MyQUQ3QzBBREJDNjI4QUFCOTFERUJDNUZBMzI5QzJFNzFGNjc4Rjk2MkJDMTIzMDUzMTY5MzZENUE1MDYzNDExNjEwNjMyNDUxQzgzN0Q4MzgwNkI5OEREMDM4NTQ4NTkyQTI5MTBDNEJGNDcxM0ZERjhCRkQ3MDg5NzY5N0ZGRjE3QjdGNTlGRDhBRDUwNTEwM0VFQUI3QTM5QkUxQkRFQ0QyODMzREIwMjUyRUZGN0M4NworMjAxMTEwMTYxNTIzMTYgMiA2IDEwMCAzMDcxIDUgRTY4NDZBNTgxNDhBQzc2MkREMENBOTA2NjJFNTYyNkQwQzU2NDdFNUM4Q0U3RDYxOTA5OTc4NDZGQjE3QTUwOTc2N0EyOEUxRTdCNUYxQUQ5OTQ0MDc2NjFDMTIyNUUwNUYzN0VFNDkwQUEzQzRDNUFFNzU3MTI5QkU5RUVDNURFREQ2NTAxRDI2RjQzQzJDQzBBMUUxRkY3RDExQTU1NjE2RDAyMDYxRTIwNTczQUM3NURBQjU5MkQ1NUM3ODE2MDhCOEEyMENCM0RBMkVCOUMyQzRDMkZEQTBDRjFFMDgzQjZDRkI0Mzc3MkZFRkU5NjlGREY1NkZBOTZFQkNCRkI0MTEwMzg0Q0JGMDMwN0YyREI1OTk1NEJBREUzNzZBRUI1NDRBQkFBMjY5RDM5REU1N0VDNTJFN0NFQjVFN0E1ODU1QkExNTIzQ0I3NzREMzg3RjRDMDE4RTY2QkZDREM4MUNDRTZFNTlBMkU5QkQ5RDBFNzg4RTZEQTA4MUIxNTg4MTczRTBDM0M3RDdCRUM2NjI1RDYyQUZCMjFCOUUxMjI4RkQyNjIwRTNDMjU3REVDRkIwNzlERUVCRDQzRUVDM0ZEOEI2N0FGNkQ0MUZCNzM1NUJEMTg0Nzk2RDY2RkZFQjM4NERCNDFDN0QxNEVDRkREQUY1OUY4NDVCMzUxRDU1RTI0QUU5N0NCRDNDMjFCMDkzRTU4QkY1MUFFRTMxMkE1NjFCOUI3QzUzMkM4NTk1NDdFMUUxOUQ1MzkzNzhCOEI4MDZCM0VDQzJBRDdDMEFEQkM2MjhBQUI5MURFQkM1RkEzMjlDMkU3MUY2NzhGOTYyQkMxMjMwNTMxNjkzNkQ1QTUwNjM0MTE2MTA2MzI0NTFDODM3RDgzODA2Qjk4REQwMzg1NDg1OTJBMjkxMEM0QkY0NzEzRkRGOEJGRDcwODk3Njk3RkZGMTdCN0Y1OUZEOEFENTA1MTAzRUVBQjdBMzlCRTFCREVDRDI4MzNEQjAyNTMxMjY5Njc3CisyMDExMTAxNjE1MzU1OCAyIDYgMTAwIDMwNzEgMiBFNjg0NkE1ODE0OEFDNzYyREQwQ0E5MDY2MkU1NjI2RDBDNTY0N0U1QzhDRTdENjE5MDk5Nzg0NkZCMTdBNTA5NzY3QTI4RTFFN0I1RjFBRDk5NDQwNzY2MUMxMjI1RTA1RjM3RUU0OTBBQTNDNEM1QUU3NTcxMjlCRTlFRUM1REVERDY1MDFEMjZGNDNDMkNDMEExRTFGRjdEMTFBNTU2MTZEMDIwNjFFMjA1NzNBQzc1REFCNTkyRDU1Qzc4MTYwOEI4QTIwQ0IzREEyRUI5QzJDNEMyRkRBMENGMUUwODNCNkNGQjQzNzcyRkVGRTk2OUZERjU2RkE5NkVCQ0JGQjQxMTAzODRDQkYwMzA3RjJEQjU5OTU0QkFERTM3NkFFQjU0NEFCQUEyNjlEMzlERTU3RUM1MkU3Q0VCNUU3QTU4NTVCQTE1MjNDQjc3NEQzODdGNEMwMThFNjZCRkNEQzgxQ0NFNkU1OUEyRTlCRDlEMEU3ODhFNkRBMDgxQjE1ODgxNzNFMEMzQzdEN0JFQzY2MjVENjJBRkIyMUI5RTEyMjhGRDI2MjBFM0MyNTdERUNGQjA3OURFRUJENDNFRUMzRkQ4QjY3QUY2RDQxRkI3MzU1QkQxODQ3OTZENjZGRkVCMzg0REI0MUM3RDE0RUNGRERBRjU5Rjg0NUIzNTFENTVFMjRBRTk3Q0JEM0MyMUIwOTNFNThCRjUxQUVFMzEyQTU2MUI5QjdDNTMyQzg1OTU0N0UxRTE5RDUzOTM3OEI4QjgwNkIzRUNDMkFEN0MwQURCQzYyOEFBQjkxREVCQzVGQTMyOUMyRTcxRjY3OEY5NjJCQzEyMzA1MzE2OTM2RDVBNTA2MzQxMTYxMDYzMjQ1MUM4MzdEODM4MDZCOThERDAzODU0ODU5MkEyOTEwQzRCRjQ3MTNGREY4QkZENzA4OTc2OTdGRkYxN0I3RjU5RkQ4QUQ1MDUxMDNFRUFCN0EzOUJFMUJERUNEMjgzM0RCMDI1MzIyRTFFOUIKKzIwMTExMDE2MTU0MjMyIDIgNiAxMDAgMzA3MSAyIEU2ODQ2QTU4MTQ4QUM3NjJERDBDQTkwNjYyRTU2MjZEMEM1NjQ3RTVDOENFN0Q2MTkwOTk3ODQ2RkIxN0E1MDk3NjdBMjhFMUU3QjVGMUFEOTk0NDA3NjYxQzEyMjVFMDVGMzdFRTQ5MEFBM0M0QzVBRTc1NzEyOUJFOUVFQzVERURENjUwMUQyNkY0M0MyQ0MwQTFFMUZGN0QxMUE1NTYxNkQwMjA2MUUyMDU3M0FDNzVEQUI1OTJENTVDNzgxNjA4QjhBMjBDQjNEQTJFQjlDMkM0QzJGREEwQ0YxRTA4M0I2Q0ZCNDM3NzJGRUZFOTY5RkRGNTZGQTk2RUJDQkZCNDExMDM4NENCRjAzMDdGMkRCNTk5NTRCQURFMzc2QUVCNTQ0QUJBQTI2OUQzOURFNTdFQzUyRTdDRUI1RTdBNTg1NUJBMTUyM0NCNzc0RDM4N0Y0QzAxOEU2NkJGQ0RDODFDQ0U2RTU5QTJFOUJEOUQwRTc4OEU2REEwODFCMTU4ODE3M0UwQzNDN0Q3QkVDNjYyNUQ2MkFGQjIxQjlFMTIyOEZEMjYyMEUzQzI1N0RFQ0ZCMDc5REVFQkQ0M0VFQzNGRDhCNjdBRjZENDFGQjczNTVCRDE4NDc5NkQ2NkZGRUIzODREQjQxQzdEMTRFQ0ZEREFGNTlGODQ1QjM1MUQ1NUUyNEFFOTdDQkQzQzIxQjA5M0U1OEJGNTFBRUUzMTJBNTYxQjlCN0M1MzJDODU5NTQ3RTFFMTlENTM5Mzc4QjhCODA2QjNFQ0MyQUQ3QzBBREJDNjI4QUFCOTFERUJDNUZBMzI5QzJFNzFGNjc4Rjk2MkJDMTIzMDUzMTY5MzZENUE1MDYzNDExNjEwNjMyNDUxQzgzN0Q4MzgwNkI5OEREMDM4NTQ4NTkyQTI5MTBDNEJGNDcxM0ZERjhCRkQ3MDg5NzY5N0ZGRjE3QjdGNTlGRDhBRDUwNTEwM0VFQUI3QTM5QkUxQkRFQ0QyODMzREIwMjUzMkIwRDFFMworMjAxMTEwMTYxNTQ4MzEgMiA2IDEwMCAzMDcxIDIgRTY4NDZBNTgxNDhBQzc2MkREMENBOTA2NjJFNTYyNkQwQzU2NDdFNUM4Q0U3RDYxOTA5OTc4NDZGQjE3QTUwOTc2N0EyOEUxRTdCNUYxQUQ5OTQ0MDc2NjFDMTIyNUUwNUYzN0VFNDkwQUEzQzRDNUFFNzU3MTI5QkU5RUVDNURFREQ2NTAxRDI2RjQzQzJDQzBBMUUxRkY3RDExQTU1NjE2RDAyMDYxRTIwNTczQUM3NURBQjU5MkQ1NUM3ODE2MDhCOEEyMENCM0RBMkVCOUMyQzRDMkZEQTBDRjFFMDgzQjZDRkI0Mzc3MkZFRkU5NjlGREY1NkZBOTZFQkNCRkI0MTEwMzg0Q0JGMDMwN0YyREI1OTk1NEJBREUzNzZBRUI1NDRBQkFBMjY5RDM5REU1N0VDNTJFN0NFQjVFN0E1ODU1QkExNTIzQ0I3NzREMzg3RjRDMDE4RTY2QkZDREM4MUNDRTZFNTlBMkU5QkQ5RDBFNzg4RTZEQTA4MUIxNTg4MTczRTBDM0M3RDdCRUM2NjI1RDYyQUZCMjFCOUUxMjI4RkQyNjIwRTNDMjU3REVDRkIwNzlERUVCRDQzRUVDM0ZEOEI2N0FGNkQ0MUZCNzM1NUJEMTg0Nzk2RDY2RkZFQjM4NERCNDFDN0QxNEVDRkREQUY1OUY4NDVCMzUxRDU1RTI0QUU5N0NCRDNDMjFCMDkzRTU4QkY1MUFFRTMxMkE1NjFCOUI3QzUzMkM4NTk1NDdFMUUxOUQ1MzkzNzhCOEI4MDZCM0VDQzJBRDdDMEFEQkM2MjhBQUI5MURFQkM1RkEzMjlDMkU3MUY2NzhGOTYyQkMxMjMwNTMxNjkzNkQ1QTUwNjM0MTE2MTA2MzI0NTFDODM3RDgzODA2Qjk4REQwMzg1NDg1OTJBMjkxMEM0QkY0NzEzRkRGOEJGRDcwODk3Njk3RkZGMTdCN0Y1OUZEOEFENTA1MTAzRUVBQjdBMzlCRTFCREVDRDI4MzNEQjAyNTMzMjkwM0FCCisyMDExMTAxNjE1NDkyMSAyIDYgMTAwIDMwNzEgMiBFNjg0NkE1ODE0OEFDNzYyREQwQ0E5MDY2MkU1NjI2RDBDNTY0N0U1QzhDRTdENjE5MDk5Nzg0NkZCMTdBNTA5NzY3QTI4RTFFN0I1RjFBRDk5NDQwNzY2MUMxMjI1RTA1RjM3RUU0OTBBQTNDNEM1QUU3NTcxMjlCRTlFRUM1REVERDY1MDFEMjZGNDNDMkNDMEExRTFGRjdEMTFBNTU2MTZEMDIwNjFFMjA1NzNBQzc1REFCNTkyRDU1Qzc4MTYwOEI4QTIwQ0IzREEyRUI5QzJDNEMyRkRBMENGMUUwODNCNkNGQjQzNzcyRkVGRTk2OUZERjU2RkE5NkVCQ0JGQjQxMTAzODRDQkYwMzA3RjJEQjU5OTU0QkFERTM3NkFFQjU0NEFCQUEyNjlEMzlERTU3RUM1MkU3Q0VCNUU3QTU4NTVCQTE1MjNDQjc3NEQzODdGNEMwMThFNjZCRkNEQzgxQ0NFNkU1OUEyRTlCRDlEMEU3ODhFNkRBMDgxQjE1ODgxNzNFMEMzQzdEN0JFQzY2MjVENjJBRkIyMUI5RTEyMjhGRDI2MjBFM0MyNTdERUNGQjA3OURFRUJENDNFRUMzRkQ4QjY3QUY2RDQxRkI3MzU1QkQxODQ3OTZENjZGRkVCMzg0REI0MUM3RDE0RUNGRERBRjU5Rjg0NUIzNTFENTVFMjRBRTk3Q0JEM0MyMUIwOTNFNThCRjUxQUVFMzEyQTU2MUI5QjdDNTMyQzg1OTU0N0UxRTE5RDUzOTM3OEI4QjgwNkIzRUNDMkFEN0MwQURCQzYyOEFBQjkxREVCQzVGQTMyOUMyRTcxRjY3OEY5NjJCQzEyMzA1MzE2OTM2RDVBNTA2MzQxMTYxMDYzMjQ1MUM4MzdEODM4MDZCOThERDAzODU0ODU5MkEyOTEwQzRCRjQ3MTNGREY4QkZENzA4OTc2OTdGRkYxN0I3RjU5RkQ4QUQ1MDUxMDNFRUFCN0EzOUJFMUJERUNEMjgzM0RCMDI1MzMzMjNDQUIKKzIwMTExMDE2MTU1MDI0IDIgNiAxMDAgMzA3MSA1IEU2ODQ2QTU4MTQ4QUM3NjJERDBDQTkwNjYyRTU2MjZEMEM1NjQ3RTVDOENFN0Q2MTkwOTk3ODQ2RkIxN0E1MDk3NjdBMjhFMUU3QjVGMUFEOTk0NDA3NjYxQzEyMjVFMDVGMzdFRTQ5MEFBM0M0QzVBRTc1NzEyOUJFOUVFQzVERURENjUwMUQyNkY0M0MyQ0MwQTFFMUZGN0QxMUE1NTYxNkQwMjA2MUUyMDU3M0FDNzVEQUI1OTJENTVDNzgxNjA4QjhBMjBDQjNEQTJFQjlDMkM0QzJGREEwQ0YxRTA4M0I2Q0ZCNDM3NzJGRUZFOTY5RkRGNTZGQTk2RUJDQkZCNDExMDM4NENCRjAzMDdGMkRCNTk5NTRCQURFMzc2QUVCNTQ0QUJBQTI2OUQzOURFNTdFQzUyRTdDRUI1RTdBNTg1NUJBMTUyM0NCNzc0RDM4N0Y0QzAxOEU2NkJGQ0RDODFDQ0U2RTU5QTJFOUJEOUQwRTc4OEU2REEwODFCMTU4ODE3M0UwQzNDN0Q3QkVDNjYyNUQ2MkFGQjIxQjlFMTIyOEZEMjYyMEUzQzI1N0RFQ0ZCMDc5REVFQkQ0M0VFQzNGRDhCNjdBRjZENDFGQjczNTVCRDE4NDc5NkQ2NkZGRUIzODREQjQxQzdEMTRFQ0ZEREFGNTlGODQ1QjM1MUQ1NUUyNEFFOTdDQkQzQzIxQjA5M0U1OEJGNTFBRUUzMTJBNTYxQjlCN0M1MzJDODU5NTQ3RTFFMTlENTM5Mzc4QjhCODA2QjNFQ0MyQUQ3QzBBREJDNjI4QUFCOTFERUJDNUZBMzI5QzJFNzFGNjc4Rjk2MkJDMTIzMDUzMTY5MzZENUE1MDYzNDExNjEwNjMyNDUxQzgzN0Q4MzgwNkI5OEREMDM4NTQ4NTkyQTI5MTBDNEJGNDcxM0ZERjhCRkQ3MDg5NzY5N0ZGRjE3QjdGNTlGRDhBRDUwNTEwM0VFQUI3QTM5QkUxQkRFQ0QyODMzREIwMjUzMzQwMjRDNworMjAxMTEwMTYxNTUyNTAgMiA2IDEwMCAzMDcxIDUgRTY4NDZBNTgxNDhBQzc2MkREMENBOTA2NjJFNTYyNkQwQzU2NDdFNUM4Q0U3RDYxOTA5OTc4NDZGQjE3QTUwOTc2N0EyOEUxRTdCNUYxQUQ5OTQ0MDc2NjFDMTIyNUUwNUYzN0VFNDkwQUEzQzRDNUFFNzU3MTI5QkU5RUVDNURFREQ2NTAxRDI2RjQzQzJDQzBBMUUxRkY3RDExQTU1NjE2RDAyMDYxRTIwNTczQUM3NURBQjU5MkQ1NUM3ODE2MDhCOEEyMENCM0RBMkVCOUMyQzRDMkZEQTBDRjFFMDgzQjZDRkI0Mzc3MkZFRkU5NjlGREY1NkZBOTZFQkNCRkI0MTEwMzg0Q0JGMDMwN0YyREI1OTk1NEJBREUzNzZBRUI1NDRBQkFBMjY5RDM5REU1N0VDNTJFN0NFQjVFN0E1ODU1QkExNTIzQ0I3NzREMzg3RjRDMDE4RTY2QkZDREM4MUNDRTZFNTlBMkU5QkQ5RDBFNzg4RTZEQTA4MUIxNTg4MTczRTBDM0M3RDdCRUM2NjI1RDYyQUZCMjFCOUUxMjI4RkQyNjIwRTNDMjU3REVDRkIwNzlERUVCRDQzRUVDM0ZEOEI2N0FGNkQ0MUZCNzM1NUJEMTg0Nzk2RDY2RkZFQjM4NERCNDFDN0QxNEVDRkREQUY1OUY4NDVCMzUxRDU1RTI0QUU5N0NCRDNDMjFCMDkzRTU4QkY1MUFFRTMxMkE1NjFCOUI3QzUzMkM4NTk1NDdFMUUxOUQ1MzkzNzhCOEI4MDZCM0VDQzJBRDdDMEFEQkM2MjhBQUI5MURFQkM1RkEzMjlDMkU3MUY2NzhGOTYyQkMxMjMwNTMxNjkzNkQ1QTUwNjM0MTE2MTA2MzI0NTFDODM3RDgzODA2Qjk4REQwMzg1NDg1OTJBMjkxMEM0QkY0NzEzRkRGOEJGRDcwODk3Njk3RkZGMTdCN0Y1OUZEOEFENTA1MTAzRUVBQjdBMzlCRTFCREVDRDI4MzNEQjAyNTMzNkE2MDY3CisyMDExMTAxNjE1NTYyMSAyIDYgMTAwIDMwNzEgNSBFNjg0NkE1ODE0OEFDNzYyREQwQ0E5MDY2MkU1NjI2RDBDNTY0N0U1QzhDRTdENjE5MDk5Nzg0NkZCMTdBNTA5NzY3QTI4RTFFN0I1RjFBRDk5NDQwNzY2MUMxMjI1RTA1RjM3RUU0OTBBQTNDNEM1QUU3NTcxMjlCRTlFRUM1REVERDY1MDFEMjZGNDNDMkNDMEExRTFGRjdEMTFBNTU2MTZEMDIwNjFFMjA1NzNBQzc1REFCNTkyRDU1Qzc4MTYwOEI4QTIwQ0IzREEyRUI5QzJDNEMyRkRBMENGMUUwODNCNkNGQjQzNzcyRkVGRTk2OUZERjU2RkE5NkVCQ0JGQjQxMTAzODRDQkYwMzA3RjJEQjU5OTU0QkFERTM3NkFFQjU0NEFCQUEyNjlEMzlERTU3RUM1MkU3Q0VCNUU3QTU4NTVCQTE1MjNDQjc3NEQzODdGNEMwMThFNjZCRkNEQzgxQ0NFNkU1OUEyRTlCRDlEMEU3ODhFNkRBMDgxQjE1ODgxNzNFMEMzQzdEN0JFQzY2MjVENjJBRkIyMUI5RTEyMjhGRDI2MjBFM0MyNTdERUNGQjA3OURFRUJENDNFRUMzRkQ4QjY3QUY2RDQxRkI3MzU1QkQxODQ3OTZENjZGRkVCMzg0REI0MUM3RDE0RUNGRERBRjU5Rjg0NUIzNTFENTVFMjRBRTk3Q0JEM0MyMUIwOTNFNThCRjUxQUVFMzEyQTU2MUI5QjdDNTMyQzg1OTU0N0UxRTE5RDUzOTM3OEI4QjgwNkIzRUNDMkFEN0MwQURCQzYyOEFBQjkxREVCQzVGQTMyOUMyRTcxRjY3OEY5NjJCQzEyMzA1MzE2OTM2RDVBNTA2MzQxMTYxMDYzMjQ1MUM4MzdEODM4MDZCOThERDAzODU0ODU5MkEyOTEwQzRCRjQ3MTNGREY4QkZENzA4OTc2OTdGRkYxN0I3RjU5RkQ4QUQ1MDUxMDNFRUFCN0EzOUJFMUJERUNEMjgzM0RCMDI1MzNBRjM2MzcKKzIwMTExMDE2MTYxNTI1IDIgNiAxMDAgMzA3MSAyIEU2ODQ2QTU4MTQ4QUM3NjJERDBDQTkwNjYyRTU2MjZEMEM1NjQ3RTVDOENFN0Q2MTkwOTk3ODQ2RkIxN0E1MDk3NjdBMjhFMUU3QjVGMUFEOTk0NDA3NjYxQzEyMjVFMDVGMzdFRTQ5MEFBM0M0QzVBRTc1NzEyOUJFOUVFQzVERURENjUwMUQyNkY0M0MyQ0MwQTFFMUZGN0QxMUE1NTYxNkQwMjA2MUUyMDU3M0FDNzVEQUI1OTJENTVDNzgxNjA4QjhBMjBDQjNEQTJFQjlDMkM0QzJGREEwQ0YxRTA4M0I2Q0ZCNDM3NzJGRUZFOTY5RkRGNTZGQTk2RUJDQkZCNDExMDM4NENCRjAzMDdGMkRCNTk5NTRCQURFMzc2QUVCNTQ0QUJBQTI2OUQzOURFNTdFQzUyRTdDRUI1RTdBNTg1NUJBMTUyM0NCNzc0RDM4N0Y0QzAxOEU2NkJGQ0RDODFDQ0U2RTU5QTJFOUJEOUQwRTc4OEU2REEwODFCMTU4ODE3M0UwQzNDN0Q3QkVDNjYyNUQ2MkFGQjIxQjlFMTIyOEZEMjYyMEUzQzI1N0RFQ0ZCMDc5REVFQkQ0M0VFQzNGRDhCNjdBRjZENDFGQjczNTVCRDE4NDc5NkQ2NkZGRUIzODREQjQxQzdEMTRFQ0ZEREFGNTlGODQ1QjM1MUQ1NUUyNEFFOTdDQkQzQzIxQjA5M0U1OEJGNTFBRUUzMTJBNTYxQjlCN0M1MzJDODU5NTQ3RTFFMTlENTM5Mzc4QjhCODA2QjNFQ0MyQUQ3QzBBREJDNjI4QUFCOTFERUJDNUZBMzI5QzJFNzFGNjc4Rjk2MkJDMTIzMDUzMTY5MzZENUE1MDYzNDExNjEwNjMyNDUxQzgzN0Q4MzgwNkI5OEREMDM4NTQ4NTkyQTI5MTBDNEJGNDcxM0ZERjhCRkQ3MDg5NzY5N0ZGRjE3QjdGNTlGRDhBRDUwNTEwM0VFQUI3QTM5QkUxQkRFQ0QyODMzREIwMjUzNTM2RDhGMworMjAxMTEwMTYxNjI1NTUgMiA2IDEwMCAzMDcxIDUgRTY4NDZBNTgxNDhBQzc2MkREMENBOTA2NjJFNTYyNkQwQzU2NDdFNUM4Q0U3RDYxOTA5OTc4NDZGQjE3QTUwOTc2N0EyOEUxRTdCNUYxQUQ5OTQ0MDc2NjFDMTIyNUUwNUYzN0VFNDkwQUEzQzRDNUFFNzU3MTI5QkU5RUVDNURFREQ2NTAxRDI2RjQzQzJDQzBBMUUxRkY3RDExQTU1NjE2RDAyMDYxRTIwNTczQUM3NURBQjU5MkQ1NUM3ODE2MDhCOEEyMENCM0RBMkVCOUMyQzRDMkZEQTBDRjFFMDgzQjZDRkI0Mzc3MkZFRkU5NjlGREY1NkZBOTZFQkNCRkI0MTEwMzg0Q0JGMDMwN0YyREI1OTk1NEJBREUzNzZBRUI1NDRBQkFBMjY5RDM5REU1N0VDNTJFN0NFQjVFN0E1ODU1QkExNTIzQ0I3NzREMzg3RjRDMDE4RTY2QkZDREM4MUNDRTZFNTlBMkU5QkQ5RDBFNzg4RTZEQTA4MUIxNTg4MTczRTBDM0M3RDdCRUM2NjI1RDYyQUZCMjFCOUUxMjI4RkQyNjIwRTNDMjU3REVDRkIwNzlERUVCRDQzRUVDM0ZEOEI2N0FGNkQ0MUZCNzM1NUJEMTg0Nzk2RDY2RkZFQjM4NERCNDFDN0QxNEVDRkREQUY1OUY4NDVCMzUxRDU1RTI0QUU5N0NCRDNDMjFCMDkzRTU4QkY1MUFFRTMxMkE1NjFCOUI3QzUzMkM4NTk1NDdFMUUxOUQ1MzkzNzhCOEI4MDZCM0VDQzJBRDdDMEFEQkM2MjhBQUI5MURFQkM1RkEzMjlDMkU3MUY2NzhGOTYyQkMxMjMwNTMxNjkzNkQ1QTUwNjM0MTE2MTA2MzI0NTFDODM3RDgzODA2Qjk4REQwMzg1NDg1OTJBMjkxMEM0QkY0NzEzRkRGOEJGRDcwODk3Njk3RkZGMTdCN0Y1OUZEOEFENTA1MTAzRUVBQjdBMzlCRTFCREVDRDI4MzNEQjAyNTM2MEMxMUI3CisyMDExMTAxNjE2MzAxNiAyIDYgMTAwIDMwNzEgNSBFNjg0NkE1ODE0OEFDNzYyREQwQ0E5MDY2MkU1NjI2RDBDNTY0N0U1QzhDRTdENjE5MDk5Nzg0NkZCMTdBNTA5NzY3QTI4RTFFN0I1RjFBRDk5NDQwNzY2MUMxMjI1RTA1RjM3RUU0OTBBQTNDNEM1QUU3NTcxMjlCRTlFRUM1REVERDY1MDFEMjZGNDNDMkNDMEExRTFGRjdEMTFBNTU2MTZEMDIwNjFFMjA1NzNBQzc1REFCNTkyRDU1Qzc4MTYwOEI4QTIwQ0IzREEyRUI5QzJDNEMyRkRBMENGMUUwODNCNkNGQjQzNzcyRkVGRTk2OUZERjU2RkE5NkVCQ0JGQjQxMTAzODRDQkYwMzA3RjJEQjU5OTU0QkFERTM3NkFFQjU0NEFCQUEyNjlEMzlERTU3RUM1MkU3Q0VCNUU3QTU4NTVCQTE1MjNDQjc3NEQzODdGNEMwMThFNjZCRkNEQzgxQ0NFNkU1OUEyRTlCRDlEMEU3ODhFNkRBMDgxQjE1ODgxNzNFMEMzQzdEN0JFQzY2MjVENjJBRkIyMUI5RTEyMjhGRDI2MjBFM0MyNTdERUNGQjA3OURFRUJENDNFRUMzRkQ4QjY3QUY2RDQxRkI3MzU1QkQxODQ3OTZENjZGRkVCMzg0REI0MUM3RDE0RUNGRERBRjU5Rjg0NUIzNTFENTVFMjRBRTk3Q0JEM0MyMUIwOTNFNThCRjUxQUVFMzEyQTU2MUI5QjdDNTMyQzg1OTU0N0UxRTE5RDUzOTM3OEI4QjgwNkIzRUNDMkFEN0MwQURCQzYyOEFBQjkxREVCQzVGQTMyOUMyRTcxRjY3OEY5NjJCQzEyMzA1MzE2OTM2RDVBNTA2MzQxMTYxMDYzMjQ1MUM4MzdEODM4MDZCOThERDAzODU0ODU5MkEyOTEwQzRCRjQ3MTNGREY4QkZENzA4OTc2OTdGRkYxN0I3RjU5RkQ4QUQ1MDUxMDNFRUFCN0EzOUJFMUJERUNEMjgzM0RCMDI1MzY1RUJCNkYKKzIwMTExMDE2MTc0MjM2IDIgNiAxMDAgNDA5NSA1IEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMUEwMTZBRkYKKzIwMTExMDE2MTgwNTUwIDIgNiAxMDAgNDA5NSAyIEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMUFENjM4RTMKKzIwMTExMDE2MTg0MjIxIDIgNiAxMDAgNDA5NSAyIEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMUMyODBFMUIKKzIwMTExMDE2MTg0OTMzIDIgNiAxMDAgNDA5NSAyIEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMUM2NjkzQzMKKzIwMTExMDE2MTkwMTM2IDIgNiAxMDAgNDA5NSA1IEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMUNEMjZCREYKKzIwMTExMDE2MTkyMDE5IDIgNiAxMDAgNDA5NSAyIEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMUQ3QUYwOTMKKzIwMTExMDE2MjAwNDA4IDIgNiAxMDAgNDA5NSA1IEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMUYwRUEwM0YKKzIwMTExMDE2MjAzODE2IDIgNiAxMDAgNDA5NSA1IEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMjAzQTJDOEYKKzIwMTExMDE2MjExMDExIDIgNiAxMDAgNDA5NSA1IEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMjE2MEUwNzcKKzIwMTExMDE2MjIyMDQyIDIgNiAxMDAgNDA5NSAyIEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMjNGNTZEQ0IKKzIwMTExMDE2MjIyMzU5IDIgNiAxMDAgNDA5NSA1IEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMjQwQTI1RUYKKzIwMTExMDE2MjIyODQ3IDIgNiAxMDAgNDA5NSAyIEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMjQyQkE5RkIKKzIwMTExMDE2MjIzMzA2IDIgNiAxMDAgNDA5NSA1IEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMjQ0QjZBMEYKKzIwMTExMDE2MjI1ODE3IDIgNiAxMDAgNDA5NSA1IEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMjUzMTlENEYKKzIwMTExMDE3MDEzOTAwIDIgNiAxMDAgNDA5NSAyIEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMkIwNkE4OTMKKzIwMTExMDE3MDIwMzM5IDIgNiAxMDAgNDA5NSA1IEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMkJFMDYxQjcKKzIwMTExMDE3MDIxOTQwIDIgNiAxMDAgNDA5NSA1IEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMkM2ODg1QkYKKzIwMTExMDE3MDIyNTU4IDIgNiAxMDAgNDA5NSAyIEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMkM5QjE5Q0IKKzIwMTExMDE3MDIyOTAzIDIgNiAxMDAgNDA5NSA1IEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMkNCMDM0RDcKKzIwMTExMDE3MDI1MjA5IDIgNiAxMDAgNDA5NSAyIEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMkQ3QjRERTMKKzIwMTExMDE3MDQzOTQ1IDIgNiAxMDAgNDA5NSA1IEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMzE1MUYzODcKKzIwMTExMDE3MDQ0NDQ4IDIgNiAxMDAgNDA5NSA1IEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMzE3QTgyNkYKKzIwMTExMDE3MDQ0OTU5IDIgNiAxMDAgNDA5NSA1IEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMzFBMjZGODcKKzIwMTExMDE3MDUxNTIwIDIgNiAxMDAgNDA5NSAyIEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMzI4NTVBMTMKKzIwMTExMDE3MDU0ODA4IDIgNiAxMDAgNDA5NSA1IEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMzNCMEU4REYKKzIwMTExMDE3MDYwMjM4IDIgNiAxMDAgNDA5NSAyIEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMzQyRjI0OEIKKzIwMTExMDE3MDY1NzMxIDIgNiAxMDAgNDA5NSAyIEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMzYyNUMwNEIKKzIwMTExMDE3MDcyOTI5IDIgNiAxMDAgNDA5NSA1IEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMzc0MUJBMUYKKzIwMTExMDE3MDczNzMwIDIgNiAxMDAgNDA5NSAyIEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMzc4NDg5NzMKKzIwMTExMDE3MDczODM2IDIgNiAxMDAgNDA5NSA1IEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMzc4NjI5MTcKKzIwMTExMDE3MDc0MTE2IDIgNiAxMDAgNDA5NSAyIEY1RDM4NDlEMjA5MkZENDI3QjRFQkQ4MzhFQTQ4MzAzOTdBNTVGODBCNjQ0NjI2MzIwREJCRTUxRThGNjNFRDg4MTQ4RDc4N0M5NEU3RTY3RTRGMzkzRjI2QzU2NUUxOTkyQjBDRkY4QTQ3QTk1MzQzOTQ2MkE0RDBGRkE1NzYzRUY2MEZGOTA4RjhFRTZDNEY2RUY5RjMyQjlCQTUwRjAxQUQ1NkZFN0VCRTkwODc2QTVDRjYxODEzQTRBRDRCQTdFQzA3MDQzMDNDOUJGODg3RDM2QUJCRDZDMkFBOTU0NUZDMjI2MzIzMjkyN0U3MzEwNjBGNUM3MDFDOTZEQzM0MDE2NjM2REY0MzhDRTMwOTczNzE1RjEyMUQ3NjdDRkI5OEI1RDA5QUU3Qjg2RkEzNkEwNTFBRDNDMjk0MUEyOTVBNjhFMkY1ODNBNTZCQzY5OTEzRUM5RDI1QUJFRjRGREYxRTMxRURFODI3QTAyNjIwREIwNThCOUYwNDFEQTA1MUM4QzBGMTNCMTMyQzE3Q0VCODkzRkE3QzRDRDhEOEZFRUJEODJDNUY5MTIwQ0IyMjFCOEU4OEM1RkU0REMxN0NBMDIwQTUzNTQ4NEM5MkM3RDRCRUU2OUM3NzAzRTFGQTlBNjUyRDQ0NEM4MDA2NTM0MkM2RUMwRkFDMjNDMjRERTI0NkUzREVFNzJDQThCQzhCRUNDREFERTJCMzY3NzFFRkNDMzUwNTU4MjY4RjUzNTJBRTUzRjJGNzFEQjYyMjQ5QUQ5QUM0RkFCREQ2REZCMDk5QzZDRkY4QzA1QkRFQTg5NDM5MEY5ODYwRjAxMUNDQTA0NkRGRUIyRjZFRjgxMDk0RTc5ODBCRTUyNjc0MjcwNkQxRjNEQjkyMERCMTA3NDA5MjkxQkI0QzExRjlBN0RDQkZBRjI2RDgwOEU2RjlGRTYzNkIyNkI5MzlERTQxOTEyOUU4NkIxRTYzMkM2MEVDMjNCNjVDODE1NzIzQzVEODYxQUYwNjhGRDBBQzhCMzdGNEMwNkVDQkQ1Q0IyRUYwNjlDQThEQUFDNUNCRDY3QzYxODJBNjVGRUQ2NTZEMERGQkJCOEE0MzBCMURCQUM3QkQ2MzAzQkVDOERFMDc4RkU2OUY0NDNBN0JDODEzMUEyODREMjVEQzI4NDRGMDk2MjQwQkZDNjFCNjJFOTFBODc4MDI5ODc2NTlCODg0QzA5NEM2ODc0MUQyOUFBNUNBMTlCOTQ1N0UxRjlERjYxQzdEQkJCMTNBNjFBNzlFNDY3MEIwODYwMjdGMjBEQTJBRjRGNUIwMjA3MjVGODgyODcyNjM3OUY0MjkxNzg5MjZBMzc5NzAzOUIKKzIwMTExMDA3MTA1NjU1IDIgNiAxMDAgNjE0MyAyIEVFRUNBQkIxNUJBNzY3Q0YxMDY4ODMyQjhDQTZGQjdEODZBN0IzQ0QyQTIzQkRCQjFEMDcxOEE4MjE1ODY0MTJDMEE2NTU1NkI3QkU5NTEyREU2NzVEMjkwQTgwMDg2MzRFN0FGRkUxOTYyRUQ5MjEzN0FEREYyQTVBMjZEMUM5ODAwMjlGNzMyQUMxMkFGNTQ0Q0UyQjhFOTU3NjBFNUJFNzhEREVDN0FGNUQ5MTIwRDQ2NkEyMEU0OEVDQUUxQTBGODUyMjIxRTM1RkIzREU5ODEwOEJGOTA2QkI0MTAzODg5NjRBODg5RDg1RUMyQjBDNjhBNUI4RkFCOUVDRDM2NDU5NEU5QjhERjYxMTU5QTA3QkZBMjU4OUQyQUMwODc5QkNBQjFFQUNFNTJDNUNCRDBFOUYxRjM5OTQ4Nzg3N0FCMDMyQzhCNEMyMEFFOTJENjQxMEQzOTk0NjgyOEIxOUIxMEVFQTAyRjQ2MjUzNEU3MjE0MEFENzlFOERCQUQ1MzE5NjdFQUNGMTYwQ0Y3NEVEMDExOTg4QUU1RkMxNzUxOTk4OUNDREYxQUQzNTRBM0NDMkI1NUI4MEI4NEQyRkNGNkFDODFCMURCNTQzNTgxMzYzOEVDRkM1OEZEQ0EwNThGNDZCNjc2NDRDOTY4ODEwNTU3Qjk4NzNBRUFGQkJCOEZDNDNEMEM5MUE3OEVDRjg4MjhCQzhGQTMyNDBEOEY5Q0U1RjU3NTlGQTM2RDRBNUU4MEU0RUFEODM0OTdBNTc3MkMwQTYyMjVGQUNCMDJGOTMyQzQ5NzQyNjUwM0Y0MzA2REMyMzEyQTE2NzgzN0ZENTBFQjlENjNDQzNGRERGMTBEMTk1Q0U2MTg0MjU5NkE4NUI1NEJDMUEzQjBEMDQ1OUQxQTMyRDJDRTFCMzAxNjFBMDRCMEU5Qjk4Rjc5MDQ1RTc3MzAzQTk1RUM2QkMyQUFBRkVDMzA1ODI2QzFERUJFQjEwMTVDMTZGMzBFMDdBMTlDN0NBQjNEMEFEQ0YyREQ0MTU4QURDRkU3NUUxQTI2MDMzQzgzQzFBRURCRUMwOUQ1MDlDMzAxQTU1ODE3OUVFN0QzMkFDRkZCOTgyNjA3NUNCQzY0OUYxMEZCMzIxMzQzNzUyMjNEQjBGNTIzMkYxRkQ3REZCMDE1MUU0RkYyNDEzNUE5N0YzMzFGM0I4QkQ2QjBCREY4RTFDQzU2RTE0NEIzRkU4QzlBNzdGMkU1MDc3RjE1QzQ2MUYwRjM5MDBGOTE2MTVGODRFRTNENDIwNzhBQUVBRjYwREZGNDdENzkxMzlCNkZCQjkyMENGOTAxRDY2Qzg2RDgxQTM2MEYyNjdCRkJBQ0FDNjUyOEQwNTU4QjFBNDM4OEIxOEM5NDQ3OUFDNkY1RUI3MEIxNDg2MTdBOTAwNTY1MzMxNDlDMzgzMTFGRDQxNDlBRDU0QzVENDc2MDdBNUQ2N0QzMERCNzBCOUY0QzREQjU5RkZDNEQ3NjVCMTg2NkVCQ0VBRDIxRjBGNEMxOTYzM0Y3NkEzM0QzNDFFNjJCRDU4NjFDOTRDMjQ0OTBBQUIzNEZFQ0E0NDFDQUY5RjJFMjk3OTQyM0UwNjFCNUZGRTVBM0UxMjMzNTIwNDM1NEFFNENFNTdEODgyREI1MDJFMEVDN0FGNzkyRjJCQkVEOTFDRTZEOTgwQjgxMEJFNDRFNzJCQzMyNkE4NTNGRDBCQjk3NTIyNzg4OTlGRjI0REZDOTdBQ0JBODVGREZDREEwQ0JEOEQxRDUxQUJDRDcxRjc1QkM4NUE0RURFOTk4OUFFQUUwRUU5NEQyMkFCMDEzNDZGQjVCNTM0OUNERDAxNjNCRDk4Q0U4MzVFNDRBRjA5RTFFQzU1MDk1MEJDMEQxNDZEMzkxRTM1M0RDNzBGQzk5NUExNDM1QjJCOUEwQkNGODhGMUQ0ODgyMkNGRkIyN0FFRkExMTJCODQ4N0FEOTZFODRGMEZDNUY5QjAzMjY1OUZCRTE1NkU1MEJDQzk1NTNGMEIyOUM1RDYwMworMjAxMTEwMDcxMDU5MzggMiA2IDEwMCA2MTQzIDIgRUVFQ0FCQjE1QkE3NjdDRjEwNjg4MzJCOENBNkZCN0Q4NkE3QjNDRDJBMjNCREJCMUQwNzE4QTgyMTU4NjQxMkMwQTY1NTU2QjdCRTk1MTJERTY3NUQyOTBBODAwODYzNEU3QUZGRTE5NjJFRDkyMTM3QURERjJBNUEyNkQxQzk4MDAyOUY3MzJBQzEyQUY1NDRDRTJCOEU5NTc2MEU1QkU3OERERUM3QUY1RDkxMjBENDY2QTIwRTQ4RUNBRTFBMEY4NTIyMjFFMzVGQjNERTk4MTA4QkY5MDZCQjQxMDM4ODk2NEE4ODlEODVFQzJCMEM2OEE1QjhGQUI5RUNEMzY0NTk0RTlCOERGNjExNTlBMDdCRkEyNTg5RDJBQzA4NzlCQ0FCMUVBQ0U1MkM1Q0JEMEU5RjFGMzk5NDg3ODc3QUIwMzJDOEI0QzIwQUU5MkQ2NDEwRDM5OTQ2ODI4QjE5QjEwRUVBMDJGNDYyNTM0RTcyMTQwQUQ3OUU4REJBRDUzMTk2N0VBQ0YxNjBDRjc0RUQwMTE5ODhBRTVGQzE3NTE5OTg5Q0NERjFBRDM1NEEzQ0MyQjU1QjgwQjg0RDJGQ0Y2QUM4MUIxREI1NDM1ODEzNjM4RUNGQzU4RkRDQTA1OEY0NkI2NzY0NEM5Njg4MTA1NTdCOTg3M0FFQUZCQkI4RkM0M0QwQzkxQTc4RUNGODgyOEJDOEZBMzI0MEQ4RjlDRTVGNTc1OUZBMzZENEE1RTgwRTRFQUQ4MzQ5N0E1NzcyQzBBNjIyNUZBQ0IwMkY5MzJDNDk3NDI2NTAzRjQzMDZEQzIzMTJBMTY3ODM3RkQ1MEVCOUQ2M0NDM0ZEREYxMEQxOTVDRTYxODQyNTk2QTg1QjU0QkMxQTNCMEQwNDU5RDFBMzJEMkNFMUIzMDE2MUEwNEIwRTlCOThGNzkwNDVFNzczMDNBOTVFQzZCQzJBQUFGRUMzMDU4MjZDMURFQkVCMTAxNUMxNkYzMEUwN0ExOUM3Q0FCM0QwQURDRjJERDQxNThBRENGRTc1RTFBMjYwMzNDODNDMUFFREJFQzA5RDUwOUMzMDFBNTU4MTc5RUU3RDMyQUNGRkI5ODI2MDc1Q0JDNjQ5RjEwRkIzMjEzNDM3NTIyM0RCMEY1MjMyRjFGRDdERkIwMTUxRTRGRjI0MTM1QTk3RjMzMUYzQjhCRDZCMEJERjhFMUNDNTZFMTQ0QjNGRThDOUE3N0YyRTUwNzdGMTVDNDYxRjBGMzkwMEY5MTYxNUY4NEVFM0Q0MjA3OEFBRUFGNjBERkY0N0Q3OTEzOUI2RkJCOTIwQ0Y5MDFENjZDODZEODFBMzYwRjI2N0JGQkFDQUM2NTI4RDA1NThCMUE0Mzg4QjE4Qzk0NDc5QUM2RjVFQjcwQjE0ODYxN0E5MDA1NjUzMzE0OUMzODMxMUZENDE0OUFENTRDNUQ0NzYwN0E1RDY3RDMwREI3MEI5RjRDNERCNTlGRkM0RDc2NUIxODY2RUJDRUFEMjFGMEY0QzE5NjMzRjc2QTMzRDM0MUU2MkJENTg2MUM5NEMyNDQ5MEFBQjM0RkVDQTQ0MUNBRjlGMkUyOTc5NDIzRTA2MUI1RkZFNUEzRTEyMzM1MjA0MzU0QUU0Q0U1N0Q4ODJEQjUwMkUwRUM3QUY3OTJGMkJCRUQ5MUNFNkQ5ODBCODEwQkU0NEU3MkJDMzI2QTg1M0ZEMEJCOTc1MjI3ODg5OUZGMjRERkM5N0FDQkE4NUZERkNEQTBDQkQ4RDFENTFBQkNENzFGNzVCQzg1QTRFREU5OTg5QUVBRTBFRTk0RDIyQUIwMTM0NkZCNUI1MzQ5Q0REMDE2M0JEOThDRTgzNUU0NEFGMDlFMUVDNTUwOTUwQkMwRDE0NkQzOTFFMzUzREM3MEZDOTk1QTE0MzVCMkI5QTBCQ0Y4OEYxRDQ4ODIyQ0ZGQjI3QUVGQTExMkI4NDg3QUQ5NkU4NEYwRkM1RjlCMDMyNjU5RkJFMTU2RTUwQkNDOTU1M0YwQjI5RDcyMzNCCisyMDExMTAwNzExNTIxMSAyIDYgMTAwIDYxNDMgMiBFRUVDQUJCMTVCQTc2N0NGMTA2ODgzMkI4Q0E2RkI3RDg2QTdCM0NEMkEyM0JEQkIxRDA3MThBODIxNTg2NDEyQzBBNjU1NTZCN0JFOTUxMkRFNjc1RDI5MEE4MDA4NjM0RTdBRkZFMTk2MkVEOTIxMzdBRERGMkE1QTI2RDFDOTgwMDI5RjczMkFDMTJBRjU0NENFMkI4RTk1NzYwRTVCRTc4RERFQzdBRjVEOTEyMEQ0NjZBMjBFNDhFQ0FFMUEwRjg1MjIyMUUzNUZCM0RFOTgxMDhCRjkwNkJCNDEwMzg4OTY0QTg4OUQ4NUVDMkIwQzY4QTVCOEZBQjlFQ0QzNjQ1OTRFOUI4REY2MTE1OUEwN0JGQTI1ODlEMkFDMDg3OUJDQUIxRUFDRTUyQzVDQkQwRTlGMUYzOTk0ODc4NzdBQjAzMkM4QjRDMjBBRTkyRDY0MTBEMzk5NDY4MjhCMTlCMTBFRUEwMkY0NjI1MzRFNzIxNDBBRDc5RThEQkFENTMxOTY3RUFDRjE2MENGNzRFRDAxMTk4OEFFNUZDMTc1MTk5ODlDQ0RGMUFEMzU0QTNDQzJCNTVCODBCODREMkZDRjZBQzgxQjFEQjU0MzU4MTM2MzhFQ0ZDNThGRENBMDU4RjQ2QjY3NjQ0Qzk2ODgxMDU1N0I5ODczQUVBRkJCQjhGQzQzRDBDOTFBNzhFQ0Y4ODI4QkM4RkEzMjQwRDhGOUNFNUY1NzU5RkEzNkQ0QTVFODBFNEVBRDgzNDk3QTU3NzJDMEE2MjI1RkFDQjAyRjkzMkM0OTc0MjY1MDNGNDMwNkRDMjMxMkExNjc4MzdGRDUwRUI5RDYzQ0MzRkRERjEwRDE5NUNFNjE4NDI1OTZBODVCNTRCQzFBM0IwRDA0NTlEMUEzMkQyQ0UxQjMwMTYxQTA0QjBFOUI5OEY3OTA0NUU3NzMwM0E5NUVDNkJDMkFBQUZFQzMwNTgyNkMxREVCRUIxMDE1QzE2RjMwRTA3QTE5QzdDQUIzRDBBRENGMkRENDE1OEFEQ0ZFNzVFMUEyNjAzM0M4M0MxQUVEQkVDMDlENTA5QzMwMUE1NTgxNzlFRTdEMzJBQ0ZGQjk4MjYwNzVDQkM2NDlGMTBGQjMyMTM0Mzc1MjIzREIwRjUyMzJGMUZEN0RGQjAxNTFFNEZGMjQxMzVBOTdGMzMxRjNCOEJENkIwQkRGOEUxQ0M1NkUxNDRCM0ZFOEM5QTc3RjJFNTA3N0YxNUM0NjFGMEYzOTAwRjkxNjE1Rjg0RUUzRDQyMDc4QUFFQUY2MERGRjQ3RDc5MTM5QjZGQkI5MjBDRjkwMUQ2NkM4NkQ4MUEzNjBGMjY3QkZCQUNBQzY1MjhEMDU1OEIxQTQzODhCMThDOTQ0NzlBQzZGNUVCNzBCMTQ4NjE3QTkwMDU2NTMzMTQ5QzM4MzExRkQ0MTQ5QUQ1NEM1RDQ3NjA3QTVENjdEMzBEQjcwQjlGNEM0REI1OUZGQzRENzY1QjE4NjZFQkNFQUQyMUYwRjRDMTk2MzNGNzZBMzNEMzQxRTYyQkQ1ODYxQzk0QzI0NDkwQUFCMzRGRUNBNDQxQ0FGOUYyRTI5Nzk0MjNFMDYxQjVGRkU1QTNFMTIzMzUyMDQzNTRBRTRDRTU3RDg4MkRCNTAyRTBFQzdBRjc5MkYyQkJFRDkxQ0U2RDk4MEI4MTBCRTQ0RTcyQkMzMjZBODUzRkQwQkI5NzUyMjc4ODk5RkYyNERGQzk3QUNCQTg1RkRGQ0RBMENCRDhEMUQ1MUFCQ0Q3MUY3NUJDODVBNEVERTk5ODlBRUFFMEVFOTREMjJBQjAxMzQ2RkI1QjUzNDlDREQwMTYzQkQ5OENFODM1RTQ0QUYwOUUxRUM1NTA5NTBCQzBEMTQ2RDM5MUUzNTNEQzcwRkM5OTVBMTQzNUIyQjlBMEJDRjg4RjFENDg4MjJDRkZCMjdBRUZBMTEyQjg0ODdBRDk2RTg0RjBGQzVGOUIwMzI2NTlGQkUxNTZFNTBCQ0M5NTUzRjBCMkJBMkZFMEIKKzIwMTExMDA3MTI1NjU2IDIgNiAxMDAgNjE0MyAyIEVFRUNBQkIxNUJBNzY3Q0YxMDY4ODMyQjhDQTZGQjdEODZBN0IzQ0QyQTIzQkRCQjFEMDcxOEE4MjE1ODY0MTJDMEE2NTU1NkI3QkU5NTEyREU2NzVEMjkwQTgwMDg2MzRFN0FGRkUxOTYyRUQ5MjEzN0FEREYyQTVBMjZEMUM5ODAwMjlGNzMyQUMxMkFGNTQ0Q0UyQjhFOTU3NjBFNUJFNzhEREVDN0FGNUQ5MTIwRDQ2NkEyMEU0OEVDQUUxQTBGODUyMjIxRTM1RkIzREU5ODEwOEJGOTA2QkI0MTAzODg5NjRBODg5RDg1RUMyQjBDNjhBNUI4RkFCOUVDRDM2NDU5NEU5QjhERjYxMTU5QTA3QkZBMjU4OUQyQUMwODc5QkNBQjFFQUNFNTJDNUNCRDBFOUYxRjM5OTQ4Nzg3N0FCMDMyQzhCNEMyMEFFOTJENjQxMEQzOTk0NjgyOEIxOUIxMEVFQTAyRjQ2MjUzNEU3MjE0MEFENzlFOERCQUQ1MzE5NjdFQUNGMTYwQ0Y3NEVEMDExOTg4QUU1RkMxNzUxOTk4OUNDREYxQUQzNTRBM0NDMkI1NUI4MEI4NEQyRkNGNkFDODFCMURCNTQzNTgxMzYzOEVDRkM1OEZEQ0EwNThGNDZCNjc2NDRDOTY4ODEwNTU3Qjk4NzNBRUFGQkJCOEZDNDNEMEM5MUE3OEVDRjg4MjhCQzhGQTMyNDBEOEY5Q0U1RjU3NTlGQTM2RDRBNUU4MEU0RUFEODM0OTdBNTc3MkMwQTYyMjVGQUNCMDJGOTMyQzQ5NzQyNjUwM0Y0MzA2REMyMzEyQTE2NzgzN0ZENTBFQjlENjNDQzNGRERGMTBEMTk1Q0U2MTg0MjU5NkE4NUI1NEJDMUEzQjBEMDQ1OUQxQTMyRDJDRTFCMzAxNjFBMDRCMEU5Qjk4Rjc5MDQ1RTc3MzAzQTk1RUM2QkMyQUFBRkVDMzA1ODI2QzFERUJFQjEwMTVDMTZGMzBFMDdBMTlDN0NBQjNEMEFEQ0YyREQ0MTU4QURDRkU3NUUxQTI2MDMzQzgzQzFBRURCRUMwOUQ1MDlDMzAxQTU1ODE3OUVFN0QzMkFDRkZCOTgyNjA3NUNCQzY0OUYxMEZCMzIxMzQzNzUyMjNEQjBGNTIzMkYxRkQ3REZCMDE1MUU0RkYyNDEzNUE5N0YzMzFGM0I4QkQ2QjBCREY4RTFDQzU2RTE0NEIzRkU4QzlBNzdGMkU1MDc3RjE1QzQ2MUYwRjM5MDBGOTE2MTVGODRFRTNENDIwNzhBQUVBRjYwREZGNDdENzkxMzlCNkZCQjkyMENGOTAxRDY2Qzg2RDgxQTM2MEYyNjdCRkJBQ0FDNjUyOEQwNTU4QjFBNDM4OEIxOEM5NDQ3OUFDNkY1RUI3MEIxNDg2MTdBOTAwNTY1MzMxNDlDMzgzMTFGRDQxNDlBRDU0QzVENDc2MDdBNUQ2N0QzMERCNzBCOUY0QzREQjU5RkZDNEQ3NjVCMTg2NkVCQ0VBRDIxRjBGNEMxOTYzM0Y3NkEzM0QzNDFFNjJCRDU4NjFDOTRDMjQ0OTBBQUIzNEZFQ0E0NDFDQUY5RjJFMjk3OTQyM0UwNjFCNUZGRTVBM0UxMjMzNTIwNDM1NEFFNENFNTdEODgyREI1MDJFMEVDN0FGNzkyRjJCQkVEOTFDRTZEOTgwQjgxMEJFNDRFNzJCQzMyNkE4NTNGRDBCQjk3NTIyNzg4OTlGRjI0REZDOTdBQ0JBODVGREZDREEwQ0JEOEQxRDUxQUJDRDcxRjc1QkM4NUE0RURFOTk4OUFFQUUwRUU5NEQyMkFCMDEzNDZGQjVCNTM0OUNERDAxNjNCRDk4Q0U4MzVFNDRBRjA5RTFFQzU1MDk1MEJDMEQxNDZEMzkxRTM1M0RDNzBGQzk5NUExNDM1QjJCOUEwQkNGODhGMUQ0ODgyMkNGRkIyN0FFRkExMTJCODQ4N0FEOTZFODRGMEZDNUY5QjAzMjY1OUZCRTE1NkU1MEJDQzk1NTNGMEIyREREQkVDQgorMjAxMTEwMDcxNDE1MjIgMiA2IDEwMCA2MTQzIDUgRUVFQ0FCQjE1QkE3NjdDRjEwNjg4MzJCOENBNkZCN0Q4NkE3QjNDRDJBMjNCREJCMUQwNzE4QTgyMTU4NjQxMkMwQTY1NTU2QjdCRTk1MTJERTY3NUQyOTBBODAwODYzNEU3QUZGRTE5NjJFRDkyMTM3QURERjJBNUEyNkQxQzk4MDAyOUY3MzJBQzEyQUY1NDRDRTJCOEU5NTc2MEU1QkU3OERERUM3QUY1RDkxMjBENDY2QTIwRTQ4RUNBRTFBMEY4NTIyMjFFMzVGQjNERTk4MTA4QkY5MDZCQjQxMDM4ODk2NEE4ODlEODVFQzJCMEM2OEE1QjhGQUI5RUNEMzY0NTk0RTlCOERGNjExNTlBMDdCRkEyNTg5RDJBQzA4NzlCQ0FCMUVBQ0U1MkM1Q0JEMEU5RjFGMzk5NDg3ODc3QUIwMzJDOEI0QzIwQUU5MkQ2NDEwRDM5OTQ2ODI4QjE5QjEwRUVBMDJGNDYyNTM0RTcyMTQwQUQ3OUU4REJBRDUzMTk2N0VBQ0YxNjBDRjc0RUQwMTE5ODhBRTVGQzE3NTE5OTg5Q0NERjFBRDM1NEEzQ0MyQjU1QjgwQjg0RDJGQ0Y2QUM4MUIxREI1NDM1ODEzNjM4RUNGQzU4RkRDQTA1OEY0NkI2NzY0NEM5Njg4MTA1NTdCOTg3M0FFQUZCQkI4RkM0M0QwQzkxQTc4RUNGODgyOEJDOEZBMzI0MEQ4RjlDRTVGNTc1OUZBMzZENEE1RTgwRTRFQUQ4MzQ5N0E1NzcyQzBBNjIyNUZBQ0IwMkY5MzJDNDk3NDI2NTAzRjQzMDZEQzIzMTJBMTY3ODM3RkQ1MEVCOUQ2M0NDM0ZEREYxMEQxOTVDRTYxODQyNTk2QTg1QjU0QkMxQTNCMEQwNDU5RDFBMzJEMkNFMUIzMDE2MUEwNEIwRTlCOThGNzkwNDVFNzczMDNBOTVFQzZCQzJBQUFGRUMzMDU4MjZDMURFQkVCMTAxNUMxNkYzMEUwN0ExOUM3Q0FCM0QwQURDRjJERDQxNThBRENGRTc1RTFBMjYwMzNDODNDMUFFREJFQzA5RDUwOUMzMDFBNTU4MTc5RUU3RDMyQUNGRkI5ODI2MDc1Q0JDNjQ5RjEwRkIzMjEzNDM3NTIyM0RCMEY1MjMyRjFGRDdERkIwMTUxRTRGRjI0MTM1QTk3RjMzMUYzQjhCRDZCMEJERjhFMUNDNTZFMTQ0QjNGRThDOUE3N0YyRTUwNzdGMTVDNDYxRjBGMzkwMEY5MTYxNUY4NEVFM0Q0MjA3OEFBRUFGNjBERkY0N0Q3OTEzOUI2RkJCOTIwQ0Y5MDFENjZDODZEODFBMzYwRjI2N0JGQkFDQUM2NTI4RDA1NThCMUE0Mzg4QjE4Qzk0NDc5QUM2RjVFQjcwQjE0ODYxN0E5MDA1NjUzMzE0OUMzODMxMUZENDE0OUFENTRDNUQ0NzYwN0E1RDY3RDMwREI3MEI5RjRDNERCNTlGRkM0RDc2NUIxODY2RUJDRUFEMjFGMEY0QzE5NjMzRjc2QTMzRDM0MUU2MkJENTg2MUM5NEMyNDQ5MEFBQjM0RkVDQTQ0MUNBRjlGMkUyOTc5NDIzRTA2MUI1RkZFNUEzRTEyMzM1MjA0MzU0QUU0Q0U1N0Q4ODJEQjUwMkUwRUM3QUY3OTJGMkJCRUQ5MUNFNkQ5ODBCODEwQkU0NEU3MkJDMzI2QTg1M0ZEMEJCOTc1MjI3ODg5OUZGMjRERkM5N0FDQkE4NUZERkNEQTBDQkQ4RDFENTFBQkNENzFGNzVCQzg1QTRFREU5OTg5QUVBRTBFRTk0RDIyQUIwMTM0NkZCNUI1MzQ5Q0REMDE2M0JEOThDRTgzNUU0NEFGMDlFMUVDNTUwOTUwQkMwRDE0NkQzOTFFMzUzREM3MEZDOTk1QTE0MzVCMkI5QTBCQ0Y4OEYxRDQ4ODIyQ0ZGQjI3QUVGQTExMkI4NDg3QUQ5NkU4NEYwRkM1RjlCMDMyNjU5RkJFMTU2RTUwQkNDOTU1M0YwQjMwOEU0OUNGCisyMDExMTAwNzE2MDI0OCAyIDYgMTAwIDYxNDMgNSBFRUVDQUJCMTVCQTc2N0NGMTA2ODgzMkI4Q0E2RkI3RDg2QTdCM0NEMkEyM0JEQkIxRDA3MThBODIxNTg2NDEyQzBBNjU1NTZCN0JFOTUxMkRFNjc1RDI5MEE4MDA4NjM0RTdBRkZFMTk2MkVEOTIxMzdBRERGMkE1QTI2RDFDOTgwMDI5RjczMkFDMTJBRjU0NENFMkI4RTk1NzYwRTVCRTc4RERFQzdBRjVEOTEyMEQ0NjZBMjBFNDhFQ0FFMUEwRjg1MjIyMUUzNUZCM0RFOTgxMDhCRjkwNkJCNDEwMzg4OTY0QTg4OUQ4NUVDMkIwQzY4QTVCOEZBQjlFQ0QzNjQ1OTRFOUI4REY2MTE1OUEwN0JGQTI1ODlEMkFDMDg3OUJDQUIxRUFDRTUyQzVDQkQwRTlGMUYzOTk0ODc4NzdBQjAzMkM4QjRDMjBBRTkyRDY0MTBEMzk5NDY4MjhCMTlCMTBFRUEwMkY0NjI1MzRFNzIxNDBBRDc5RThEQkFENTMxOTY3RUFDRjE2MENGNzRFRDAxMTk4OEFFNUZDMTc1MTk5ODlDQ0RGMUFEMzU0QTNDQzJCNTVCODBCODREMkZDRjZBQzgxQjFEQjU0MzU4MTM2MzhFQ0ZDNThGRENBMDU4RjQ2QjY3NjQ0Qzk2ODgxMDU1N0I5ODczQUVBRkJCQjhGQzQzRDBDOTFBNzhFQ0Y4ODI4QkM4RkEzMjQwRDhGOUNFNUY1NzU5RkEzNkQ0QTVFODBFNEVBRDgzNDk3QTU3NzJDMEE2MjI1RkFDQjAyRjkzMkM0OTc0MjY1MDNGNDMwNkRDMjMxMkExNjc4MzdGRDUwRUI5RDYzQ0MzRkRERjEwRDE5NUNFNjE4NDI1OTZBODVCNTRCQzFBM0IwRDA0NTlEMUEzMkQyQ0UxQjMwMTYxQTA0QjBFOUI5OEY3OTA0NUU3NzMwM0E5NUVDNkJDMkFBQUZFQzMwNTgyNkMxREVCRUIxMDE1QzE2RjMwRTA3QTE5QzdDQUIzRDBBRENGMkRENDE1OEFEQ0ZFNzVFMUEyNjAzM0M4M0MxQUVEQkVDMDlENTA5QzMwMUE1NTgxNzlFRTdEMzJBQ0ZGQjk4MjYwNzVDQkM2NDlGMTBGQjMyMTM0Mzc1MjIzREIwRjUyMzJGMUZEN0RGQjAxNTFFNEZGMjQxMzVBOTdGMzMxRjNCOEJENkIwQkRGOEUxQ0M1NkUxNDRCM0ZFOEM5QTc3RjJFNTA3N0YxNUM0NjFGMEYzOTAwRjkxNjE1Rjg0RUUzRDQyMDc4QUFFQUY2MERGRjQ3RDc5MTM5QjZGQkI5MjBDRjkwMUQ2NkM4NkQ4MUEzNjBGMjY3QkZCQUNBQzY1MjhEMDU1OEIxQTQzODhCMThDOTQ0NzlBQzZGNUVCNzBCMTQ4NjE3QTkwMDU2NTMzMTQ5QzM4MzExRkQ0MTQ5QUQ1NEM1RDQ3NjA3QTVENjdEMzBEQjcwQjlGNEM0REI1OUZGQzRENzY1QjE4NjZFQkNFQUQyMUYwRjRDMTk2MzNGNzZBMzNEMzQxRTYyQkQ1ODYxQzk0QzI0NDkwQUFCMzRGRUNBNDQxQ0FGOUYyRTI5Nzk0MjNFMDYxQjVGRkU1QTNFMTIzMzUyMDQzNTRBRTRDRTU3RDg4MkRCNTAyRTBFQzdBRjc5MkYyQkJFRDkxQ0U2RDk4MEI4MTBCRTQ0RTcyQkMzMjZBODUzRkQwQkI5NzUyMjc4ODk5RkYyNERGQzk3QUNCQTg1RkRGQ0RBMENCRDhEMUQ1MUFCQ0Q3MUY3NUJDODVBNEVERTk5ODlBRUFFMEVFOTREMjJBQjAxMzQ2RkI1QjUzNDlDREQwMTYzQkQ5OENFODM1RTQ0QUYwOUUxRUM1NTA5NTBCQzBEMTQ2RDM5MUUzNTNEQzcwRkM5OTVBMTQzNUIyQjlBMEJDRjg4RjFENDg4MjJDRkZCMjdBRUZBMTEyQjg0ODdBRDk2RTg0RjBGQzVGOUIwMzI2NTlGQkUxNTZFNTBCQ0M5NTUzRjBCMzQ0MEUxOUYKKzIwMTExMDA3MTkwNjM0IDIgNiAxMDAgNjE0MyAyIEVFRUNBQkIxNUJBNzY3Q0YxMDY4ODMyQjhDQTZGQjdEODZBN0IzQ0QyQTIzQkRCQjFEMDcxOEE4MjE1ODY0MTJDMEE2NTU1NkI3QkU5NTEyREU2NzVEMjkwQTgwMDg2MzRFN0FGRkUxOTYyRUQ5MjEzN0FEREYyQTVBMjZEMUM5ODAwMjlGNzMyQUMxMkFGNTQ0Q0UyQjhFOTU3NjBFNUJFNzhEREVDN0FGNUQ5MTIwRDQ2NkEyMEU0OEVDQUUxQTBGODUyMjIxRTM1RkIzREU5ODEwOEJGOTA2QkI0MTAzODg5NjRBODg5RDg1RUMyQjBDNjhBNUI4RkFCOUVDRDM2NDU5NEU5QjhERjYxMTU5QTA3QkZBMjU4OUQyQUMwODc5QkNBQjFFQUNFNTJDNUNCRDBFOUYxRjM5OTQ4Nzg3N0FCMDMyQzhCNEMyMEFFOTJENjQxMEQzOTk0NjgyOEIxOUIxMEVFQTAyRjQ2MjUzNEU3MjE0MEFENzlFOERCQUQ1MzE5NjdFQUNGMTYwQ0Y3NEVEMDExOTg4QUU1RkMxNzUxOTk4OUNDREYxQUQzNTRBM0NDMkI1NUI4MEI4NEQyRkNGNkFDODFCMURCNTQzNTgxMzYzOEVDRkM1OEZEQ0EwNThGNDZCNjc2NDRDOTY4ODEwNTU3Qjk4NzNBRUFGQkJCOEZDNDNEMEM5MUE3OEVDRjg4MjhCQzhGQTMyNDBEOEY5Q0U1RjU3NTlGQTM2RDRBNUU4MEU0RUFEODM0OTdBNTc3MkMwQTYyMjVGQUNCMDJGOTMyQzQ5NzQyNjUwM0Y0MzA2REMyMzEyQTE2NzgzN0ZENTBFQjlENjNDQzNGRERGMTBEMTk1Q0U2MTg0MjU5NkE4NUI1NEJDMUEzQjBEMDQ1OUQxQTMyRDJDRTFCMzAxNjFBMDRCMEU5Qjk4Rjc5MDQ1RTc3MzAzQTk1RUM2QkMyQUFBRkVDMzA1ODI2QzFERUJFQjEwMTVDMTZGMzBFMDdBMTlDN0NBQjNEMEFEQ0YyREQ0MTU4QURDRkU3NUUxQTI2MDMzQzgzQzFBRURCRUMwOUQ1MDlDMzAxQTU1ODE3OUVFN0QzMkFDRkZCOTgyNjA3NUNCQzY0OUYxMEZCMzIxMzQzNzUyMjNEQjBGNTIzMkYxRkQ3REZCMDE1MUU0RkYyNDEzNUE5N0YzMzFGM0I4QkQ2QjBCREY4RTFDQzU2RTE0NEIzRkU4QzlBNzdGMkU1MDc3RjE1QzQ2MUYwRjM5MDBGOTE2MTVGODRFRTNENDIwNzhBQUVBRjYwREZGNDdENzkxMzlCNkZCQjkyMENGOTAxRDY2Qzg2RDgxQTM2MEYyNjdCRkJBQ0FDNjUyOEQwNTU4QjFBNDM4OEIxOEM5NDQ3OUFDNkY1RUI3MEIxNDg2MTdBOTAwNTY1MzMxNDlDMzgzMTFGRDQxNDlBRDU0QzVENDc2MDdBNUQ2N0QzMERCNzBCOUY0QzREQjU5RkZDNEQ3NjVCMTg2NkVCQ0VBRDIxRjBGNEMxOTYzM0Y3NkEzM0QzNDFFNjJCRDU4NjFDOTRDMjQ0OTBBQUIzNEZFQ0E0NDFDQUY5RjJFMjk3OTQyM0UwNjFCNUZGRTVBM0UxMjMzNTIwNDM1NEFFNENFNTdEODgyREI1MDJFMEVDN0FGNzkyRjJCQkVEOTFDRTZEOTgwQjgxMEJFNDRFNzJCQzMyNkE4NTNGRDBCQjk3NTIyNzg4OTlGRjI0REZDOTdBQ0JBODVGREZDREEwQ0JEOEQxRDUxQUJDRDcxRjc1QkM4NUE0RURFOTk4OUFFQUUwRUU5NEQyMkFCMDEzNDZGQjVCNTM0OUNERDAxNjNCRDk4Q0U4MzVFNDRBRjA5RTFFQzU1MDk1MEJDMEQxNDZEMzkxRTM1M0RDNzBGQzk5NUExNDM1QjJCOUEwQkNGODhGMUQ0ODgyMkNGRkIyN0FFRkExMTJCODQ4N0FEOTZFODRGMEZDNUY5QjAzMjY1OUZCRTE1NkU1MEJDQzk1NTNGMEIzQTk0Q0I0MworMjAxMTEwMDcxOTQ0NDQgMiA2IDEwMCA2MTQzIDUgRUVFQ0FCQjE1QkE3NjdDRjEwNjg4MzJCOENBNkZCN0Q4NkE3QjNDRDJBMjNCREJCMUQwNzE4QTgyMTU4NjQxMkMwQTY1NTU2QjdCRTk1MTJERTY3NUQyOTBBODAwODYzNEU3QUZGRTE5NjJFRDkyMTM3QURERjJBNUEyNkQxQzk4MDAyOUY3MzJBQzEyQUY1NDRDRTJCOEU5NTc2MEU1QkU3OERERUM3QUY1RDkxMjBENDY2QTIwRTQ4RUNBRTFBMEY4NTIyMjFFMzVGQjNERTk4MTA4QkY5MDZCQjQxMDM4ODk2NEE4ODlEODVFQzJCMEM2OEE1QjhGQUI5RUNEMzY0NTk0RTlCOERGNjExNTlBMDdCRkEyNTg5RDJBQzA4NzlCQ0FCMUVBQ0U1MkM1Q0JEMEU5RjFGMzk5NDg3ODc3QUIwMzJDOEI0QzIwQUU5MkQ2NDEwRDM5OTQ2ODI4QjE5QjEwRUVBMDJGNDYyNTM0RTcyMTQwQUQ3OUU4REJBRDUzMTk2N0VBQ0YxNjBDRjc0RUQwMTE5ODhBRTVGQzE3NTE5OTg5Q0NERjFBRDM1NEEzQ0MyQjU1QjgwQjg0RDJGQ0Y2QUM4MUIxREI1NDM1ODEzNjM4RUNGQzU4RkRDQTA1OEY0NkI2NzY0NEM5Njg4MTA1NTdCOTg3M0FFQUZCQkI4RkM0M0QwQzkxQTc4RUNGODgyOEJDOEZBMzI0MEQ4RjlDRTVGNTc1OUZBMzZENEE1RTgwRTRFQUQ4MzQ5N0E1NzcyQzBBNjIyNUZBQ0IwMkY5MzJDNDk3NDI2NTAzRjQzMDZEQzIzMTJBMTY3ODM3RkQ1MEVCOUQ2M0NDM0ZEREYxMEQxOTVDRTYxODQyNTk2QTg1QjU0QkMxQTNCMEQwNDU5RDFBMzJEMkNFMUIzMDE2MUEwNEIwRTlCOThGNzkwNDVFNzczMDNBOTVFQzZCQzJBQUFGRUMzMDU4MjZDMURFQkVCMTAxNUMxNkYzMEUwN0ExOUM3Q0FCM0QwQURDRjJERDQxNThBRENGRTc1RTFBMjYwMzNDODNDMUFFREJFQzA5RDUwOUMzMDFBNTU4MTc5RUU3RDMyQUNGRkI5ODI2MDc1Q0JDNjQ5RjEwRkIzMjEzNDM3NTIyM0RCMEY1MjMyRjFGRDdERkIwMTUxRTRGRjI0MTM1QTk3RjMzMUYzQjhCRDZCMEJERjhFMUNDNTZFMTQ0QjNGRThDOUE3N0YyRTUwNzdGMTVDNDYxRjBGMzkwMEY5MTYxNUY4NEVFM0Q0MjA3OEFBRUFGNjBERkY0N0Q3OTEzOUI2RkJCOTIwQ0Y5MDFENjZDODZEODFBMzYwRjI2N0JGQkFDQUM2NTI4RDA1NThCMUE0Mzg4QjE4Qzk0NDc5QUM2RjVFQjcwQjE0ODYxN0E5MDA1NjUzMzE0OUMzODMxMUZENDE0OUFENTRDNUQ0NzYwN0E1RDY3RDMwREI3MEI5RjRDNERCNTlGRkM0RDc2NUIxODY2RUJDRUFEMjFGMEY0QzE5NjMzRjc2QTMzRDM0MUU2MkJENTg2MUM5NEMyNDQ5MEFBQjM0RkVDQTQ0MUNBRjlGMkUyOTc5NDIzRTA2MUI1RkZFNUEzRTEyMzM1MjA0MzU0QUU0Q0U1N0Q4ODJEQjUwMkUwRUM3QUY3OTJGMkJCRUQ5MUNFNkQ5ODBCODEwQkU0NEU3MkJDMzI2QTg1M0ZEMEJCOTc1MjI3ODg5OUZGMjRERkM5N0FDQkE4NUZERkNEQTBDQkQ4RDFENTFBQkNENzFGNzVCQzg1QTRFREU5OTg5QUVBRTBFRTk0RDIyQUIwMTM0NkZCNUI1MzQ5Q0REMDE2M0JEOThDRTgzNUU0NEFGMDlFMUVDNTUwOTUwQkMwRDE0NkQzOTFFMzUzREM3MEZDOTk1QTE0MzVCMkI5QTBCQ0Y4OEYxRDQ4ODIyQ0ZGQjI3QUVGQTExMkI4NDg3QUQ5NkU4NEYwRkM1RjlCMDMyNjU5RkJFMTU2RTUwQkNDOTU1M0YwQjNCREEyNTZGCisyMDExMTAwNzIwMDg0MSAyIDYgMTAwIDYxNDMgMiBFRUVDQUJCMTVCQTc2N0NGMTA2ODgzMkI4Q0E2RkI3RDg2QTdCM0NEMkEyM0JEQkIxRDA3MThBODIxNTg2NDEyQzBBNjU1NTZCN0JFOTUxMkRFNjc1RDI5MEE4MDA4NjM0RTdBRkZFMTk2MkVEOTIxMzdBRERGMkE1QTI2RDFDOTgwMDI5RjczMkFDMTJBRjU0NENFMkI4RTk1NzYwRTVCRTc4RERFQzdBRjVEOTEyMEQ0NjZBMjBFNDhFQ0FFMUEwRjg1MjIyMUUzNUZCM0RFOTgxMDhCRjkwNkJCNDEwMzg4OTY0QTg4OUQ4NUVDMkIwQzY4QTVCOEZBQjlFQ0QzNjQ1OTRFOUI4REY2MTE1OUEwN0JGQTI1ODlEMkFDMDg3OUJDQUIxRUFDRTUyQzVDQkQwRTlGMUYzOTk0ODc4NzdBQjAzMkM4QjRDMjBBRTkyRDY0MTBEMzk5NDY4MjhCMTlCMTBFRUEwMkY0NjI1MzRFNzIxNDBBRDc5RThEQkFENTMxOTY3RUFDRjE2MENGNzRFRDAxMTk4OEFFNUZDMTc1MTk5ODlDQ0RGMUFEMzU0QTNDQzJCNTVCODBCODREMkZDRjZBQzgxQjFEQjU0MzU4MTM2MzhFQ0ZDNThGRENBMDU4RjQ2QjY3NjQ0Qzk2ODgxMDU1N0I5ODczQUVBRkJCQjhGQzQzRDBDOTFBNzhFQ0Y4ODI4QkM4RkEzMjQwRDhGOUNFNUY1NzU5RkEzNkQ0QTVFODBFNEVBRDgzNDk3QTU3NzJDMEE2MjI1RkFDQjAyRjkzMkM0OTc0MjY1MDNGNDMwNkRDMjMxMkExNjc4MzdGRDUwRUI5RDYzQ0MzRkRERjEwRDE5NUNFNjE4NDI1OTZBODVCNTRCQzFBM0IwRDA0NTlEMUEzMkQyQ0UxQjMwMTYxQTA0QjBFOUI5OEY3OTA0NUU3NzMwM0E5NUVDNkJDMkFBQUZFQzMwNTgyNkMxREVCRUIxMDE1QzE2RjMwRTA3QTE5QzdDQUIzRDBBRENGMkRENDE1OEFEQ0ZFNzVFMUEyNjAzM0M4M0MxQUVEQkVDMDlENTA5QzMwMUE1NTgxNzlFRTdEMzJBQ0ZGQjk4MjYwNzVDQkM2NDlGMTBGQjMyMTM0Mzc1MjIzREIwRjUyMzJGMUZEN0RGQjAxNTFFNEZGMjQxMzVBOTdGMzMxRjNCOEJENkIwQkRGOEUxQ0M1NkUxNDRCM0ZFOEM5QTc3RjJFNTA3N0YxNUM0NjFGMEYzOTAwRjkxNjE1Rjg0RUUzRDQyMDc4QUFFQUY2MERGRjQ3RDc5MTM5QjZGQkI5MjBDRjkwMUQ2NkM4NkQ4MUEzNjBGMjY3QkZCQUNBQzY1MjhEMDU1OEIxQTQzODhCMThDOTQ0NzlBQzZGNUVCNzBCMTQ4NjE3QTkwMDU2NTMzMTQ5QzM4MzExRkQ0MTQ5QUQ1NEM1RDQ3NjA3QTVENjdEMzBEQjcwQjlGNEM0REI1OUZGQzRENzY1QjE4NjZFQkNFQUQyMUYwRjRDMTk2MzNGNzZBMzNEMzQxRTYyQkQ1ODYxQzk0QzI0NDkwQUFCMzRGRUNBNDQxQ0FGOUYyRTI5Nzk0MjNFMDYxQjVGRkU1QTNFMTIzMzUyMDQzNTRBRTRDRTU3RDg4MkRCNTAyRTBFQzdBRjc5MkYyQkJFRDkxQ0U2RDk4MEI4MTBCRTQ0RTcyQkMzMjZBODUzRkQwQkI5NzUyMjc4ODk5RkYyNERGQzk3QUNCQTg1RkRGQ0RBMENCRDhEMUQ1MUFCQ0Q3MUY3NUJDODVBNEVERTk5ODlBRUFFMEVFOTREMjJBQjAxMzQ2RkI1QjUzNDlDREQwMTYzQkQ5OENFODM1RTQ0QUYwOUUxRUM1NTA5NTBCQzBEMTQ2RDM5MUUzNTNEQzcwRkM5OTVBMTQzNUIyQjlBMEJDRjg4RjFENDg4MjJDRkZCMjdBRUZBMTEyQjg0ODdBRDk2RTg0RjBGQzVGOUIwMzI2NTlGQkUxNTZFNTBCQ0M5NTUzRjBCM0NBMzgxMkIKKzIwMTExMDA3MjAyODM0IDIgNiAxMDAgNjE0MyAyIEVFRUNBQkIxNUJBNzY3Q0YxMDY4ODMyQjhDQTZGQjdEODZBN0IzQ0QyQTIzQkRCQjFEMDcxOEE4MjE1ODY0MTJDMEE2NTU1NkI3QkU5NTEyREU2NzVEMjkwQTgwMDg2MzRFN0FGRkUxOTYyRUQ5MjEzN0FEREYyQTVBMjZEMUM5ODAwMjlGNzMyQUMxMkFGNTQ0Q0UyQjhFOTU3NjBFNUJFNzhEREVDN0FGNUQ5MTIwRDQ2NkEyMEU0OEVDQUUxQTBGODUyMjIxRTM1RkIzREU5ODEwOEJGOTA2QkI0MTAzODg5NjRBODg5RDg1RUMyQjBDNjhBNUI4RkFCOUVDRDM2NDU5NEU5QjhERjYxMTU5QTA3QkZBMjU4OUQyQUMwODc5QkNBQjFFQUNFNTJDNUNCRDBFOUYxRjM5OTQ4Nzg3N0FCMDMyQzhCNEMyMEFFOTJENjQxMEQzOTk0NjgyOEIxOUIxMEVFQTAyRjQ2MjUzNEU3MjE0MEFENzlFOERCQUQ1MzE5NjdFQUNGMTYwQ0Y3NEVEMDExOTg4QUU1RkMxNzUxOTk4OUNDREYxQUQzNTRBM0NDMkI1NUI4MEI4NEQyRkNGNkFDODFCMURCNTQzNTgxMzYzOEVDRkM1OEZEQ0EwNThGNDZCNjc2NDRDOTY4ODEwNTU3Qjk4NzNBRUFGQkJCOEZDNDNEMEM5MUE3OEVDRjg4MjhCQzhGQTMyNDBEOEY5Q0U1RjU3NTlGQTM2RDRBNUU4MEU0RUFEODM0OTdBNTc3MkMwQTYyMjVGQUNCMDJGOTMyQzQ5NzQyNjUwM0Y0MzA2REMyMzEyQTE2NzgzN0ZENTBFQjlENjNDQzNGRERGMTBEMTk1Q0U2MTg0MjU5NkE4NUI1NEJDMUEzQjBEMDQ1OUQxQTMyRDJDRTFCMzAxNjFBMDRCMEU5Qjk4Rjc5MDQ1RTc3MzAzQTk1RUM2QkMyQUFBRkVDMzA1ODI2QzFERUJFQjEwMTVDMTZGMzBFMDdBMTlDN0NBQjNEMEFEQ0YyREQ0MTU4QURDRkU3NUUxQTI2MDMzQzgzQzFBRURCRUMwOUQ1MDlDMzAxQTU1ODE3OUVFN0QzMkFDRkZCOTgyNjA3NUNCQzY0OUYxMEZCMzIxMzQzNzUyMjNEQjBGNTIzMkYxRkQ3REZCMDE1MUU0RkYyNDEzNUE5N0YzMzFGM0I4QkQ2QjBCREY4RTFDQzU2RTE0NEIzRkU4QzlBNzdGMkU1MDc3RjE1QzQ2MUYwRjM5MDBGOTE2MTVGODRFRTNENDIwNzhBQUVBRjYwREZGNDdENzkxMzlCNkZCQjkyMENGOTAxRDY2Qzg2RDgxQTM2MEYyNjdCRkJBQ0FDNjUyOEQwNTU4QjFBNDM4OEIxOEM5NDQ3OUFDNkY1RUI3MEIxNDg2MTdBOTAwNTY1MzMxNDlDMzgzMTFGRDQxNDlBRDU0QzVENDc2MDdBNUQ2N0QzMERCNzBCOUY0QzREQjU5RkZDNEQ3NjVCMTg2NkVCQ0VBRDIxRjBGNEMxOTYzM0Y3NkEzM0QzNDFFNjJCRDU4NjFDOTRDMjQ0OTBBQUIzNEZFQ0E0NDFDQUY5RjJFMjk3OTQyM0UwNjFCNUZGRTVBM0UxMjMzNTIwNDM1NEFFNENFNTdEODgyREI1MDJFMEVDN0FGNzkyRjJCQkVEOTFDRTZEOTgwQjgxMEJFNDRFNzJCQzMyNkE4NTNGRDBCQjk3NTIyNzg4OTlGRjI0REZDOTdBQ0JBODVGREZDREEwQ0JEOEQxRDUxQUJDRDcxRjc1QkM4NUE0RURFOTk4OUFFQUUwRUU5NEQyMkFCMDEzNDZGQjVCNTM0OUNERDAxNjNCRDk4Q0U4MzVFNDRBRjA5RTFFQzU1MDk1MEJDMEQxNDZEMzkxRTM1M0RDNzBGQzk5NUExNDM1QjJCOUEwQkNGODhGMUQ0ODgyMkNGRkIyN0FFRkExMTJCODQ4N0FEOTZFODRGMEZDNUY5QjAzMjY1OUZCRTE1NkU1MEJDQzk1NTNGMEIzRDQ3RjBDQgorMjAxMTEwMDcyMTA1NDQgMiA2IDEwMCA2MTQzIDIgRUVFQ0FCQjE1QkE3NjdDRjEwNjg4MzJCOENBNkZCN0Q4NkE3QjNDRDJBMjNCREJCMUQwNzE4QTgyMTU4NjQxMkMwQTY1NTU2QjdCRTk1MTJERTY3NUQyOTBBODAwODYzNEU3QUZGRTE5NjJFRDkyMTM3QURERjJBNUEyNkQxQzk4MDAyOUY3MzJBQzEyQUY1NDRDRTJCOEU5NTc2MEU1QkU3OERERUM3QUY1RDkxMjBENDY2QTIwRTQ4RUNBRTFBMEY4NTIyMjFFMzVGQjNERTk4MTA4QkY5MDZCQjQxMDM4ODk2NEE4ODlEODVFQzJCMEM2OEE1QjhGQUI5RUNEMzY0NTk0RTlCOERGNjExNTlBMDdCRkEyNTg5RDJBQzA4NzlCQ0FCMUVBQ0U1MkM1Q0JEMEU5RjFGMzk5NDg3ODc3QUIwMzJDOEI0QzIwQUU5MkQ2NDEwRDM5OTQ2ODI4QjE5QjEwRUVBMDJGNDYyNTM0RTcyMTQwQUQ3OUU4REJBRDUzMTk2N0VBQ0YxNjBDRjc0RUQwMTE5ODhBRTVGQzE3NTE5OTg5Q0NERjFBRDM1NEEzQ0MyQjU1QjgwQjg0RDJGQ0Y2QUM4MUIxREI1NDM1ODEzNjM4RUNGQzU4RkRDQTA1OEY0NkI2NzY0NEM5Njg4MTA1NTdCOTg3M0FFQUZCQkI4RkM0M0QwQzkxQTc4RUNGODgyOEJDOEZBMzI0MEQ4RjlDRTVGNTc1OUZBMzZENEE1RTgwRTRFQUQ4MzQ5N0E1NzcyQzBBNjIyNUZBQ0IwMkY5MzJDNDk3NDI2NTAzRjQzMDZEQzIzMTJBMTY3ODM3RkQ1MEVCOUQ2M0NDM0ZEREYxMEQxOTVDRTYxODQyNTk2QTg1QjU0QkMxQTNCMEQwNDU5RDFBMzJEMkNFMUIzMDE2MUEwNEIwRTlCOThGNzkwNDVFNzczMDNBOTVFQzZCQzJBQUFGRUMzMDU4MjZDMURFQkVCMTAxNUMxNkYzMEUwN0ExOUM3Q0FCM0QwQURDRjJERDQxNThBRENGRTc1RTFBMjYwMzNDODNDMUFFREJFQzA5RDUwOUMzMDFBNTU4MTc5RUU3RDMyQUNGRkI5ODI2MDc1Q0JDNjQ5RjEwRkIzMjEzNDM3NTIyM0RCMEY1MjMyRjFGRDdERkIwMTUxRTRGRjI0MTM1QTk3RjMzMUYzQjhCRDZCMEJERjhFMUNDNTZFMTQ0QjNGRThDOUE3N0YyRTUwNzdGMTVDNDYxRjBGMzkwMEY5MTYxNUY4NEVFM0Q0MjA3OEFBRUFGNjBERkY0N0Q3OTEzOUI2RkJCOTIwQ0Y5MDFENjZDODZEODFBMzYwRjI2N0JGQkFDQUM2NTI4RDA1NThCMUE0Mzg4QjE4Qzk0NDc5QUM2RjVFQjcwQjE0ODYxN0E5MDA1NjUzMzE0OUMzODMxMUZENDE0OUFENTRDNUQ0NzYwN0E1RDY3RDMwREI3MEI5RjRDNERCNTlGRkM0RDc2NUIxODY2RUJDRUFEMjFGMEY0QzE5NjMzRjc2QTMzRDM0MUU2MkJENTg2MUM5NEMyNDQ5MEFBQjM0RkVDQTQ0MUNBRjlGMkUyOTc5NDIzRTA2MUI1RkZFNUEzRTEyMzM1MjA0MzU0QUU0Q0U1N0Q4ODJEQjUwMkUwRUM3QUY3OTJGMkJCRUQ5MUNFNkQ5ODBCODEwQkU0NEU3MkJDMzI2QTg1M0ZEMEJCOTc1MjI3ODg5OUZGMjRERkM5N0FDQkE4NUZERkNEQTBDQkQ4RDFENTFBQkNENzFGNzVCQzg1QTRFREU5OTg5QUVBRTBFRTk0RDIyQUIwMTM0NkZCNUI1MzQ5Q0REMDE2M0JEOThDRTgzNUU0NEFGMDlFMUVDNTUwOTUwQkMwRDE0NkQzOTFFMzUzREM3MEZDOTk1QTE0MzVCMkI5QTBCQ0Y4OEYxRDQ4ODIyQ0ZGQjI3QUVGQTExMkI4NDg3QUQ5NkU4NEYwRkM1RjlCMDMyNjU5RkJFMTU2RTUwQkNDOTU1M0YwQjNFN0U2MkEzCisyMDExMTAwNzIxMTIzOSAyIDYgMTAwIDYxNDMgNSBFRUVDQUJCMTVCQTc2N0NGMTA2ODgzMkI4Q0E2RkI3RDg2QTdCM0NEMkEyM0JEQkIxRDA3MThBODIxNTg2NDEyQzBBNjU1NTZCN0JFOTUxMkRFNjc1RDI5MEE4MDA4NjM0RTdBRkZFMTk2MkVEOTIxMzdBRERGMkE1QTI2RDFDOTgwMDI5RjczMkFDMTJBRjU0NENFMkI4RTk1NzYwRTVCRTc4RERFQzdBRjVEOTEyMEQ0NjZBMjBFNDhFQ0FFMUEwRjg1MjIyMUUzNUZCM0RFOTgxMDhCRjkwNkJCNDEwMzg4OTY0QTg4OUQ4NUVDMkIwQzY4QTVCOEZBQjlFQ0QzNjQ1OTRFOUI4REY2MTE1OUEwN0JGQTI1ODlEMkFDMDg3OUJDQUIxRUFDRTUyQzVDQkQwRTlGMUYzOTk0ODc4NzdBQjAzMkM4QjRDMjBBRTkyRDY0MTBEMzk5NDY4MjhCMTlCMTBFRUEwMkY0NjI1MzRFNzIxNDBBRDc5RThEQkFENTMxOTY3RUFDRjE2MENGNzRFRDAxMTk4OEFFNUZDMTc1MTk5ODlDQ0RGMUFEMzU0QTNDQzJCNTVCODBCODREMkZDRjZBQzgxQjFEQjU0MzU4MTM2MzhFQ0ZDNThGRENBMDU4RjQ2QjY3NjQ0Qzk2ODgxMDU1N0I5ODczQUVBRkJCQjhGQzQzRDBDOTFBNzhFQ0Y4ODI4QkM4RkEzMjQwRDhGOUNFNUY1NzU5RkEzNkQ0QTVFODBFNEVBRDgzNDk3QTU3NzJDMEE2MjI1RkFDQjAyRjkzMkM0OTc0MjY1MDNGNDMwNkRDMjMxMkExNjc4MzdGRDUwRUI5RDYzQ0MzRkRERjEwRDE5NUNFNjE4NDI1OTZBODVCNTRCQzFBM0IwRDA0NTlEMUEzMkQyQ0UxQjMwMTYxQTA0QjBFOUI5OEY3OTA0NUU3NzMwM0E5NUVDNkJDMkFBQUZFQzMwNTgyNkMxREVCRUIxMDE1QzE2RjMwRTA3QTE5QzdDQUIzRDBBRENGMkRENDE1OEFEQ0ZFNzVFMUEyNjAzM0M4M0MxQUVEQkVDMDlENTA5QzMwMUE1NTgxNzlFRTdEMzJBQ0ZGQjk4MjYwNzVDQkM2NDlGMTBGQjMyMTM0Mzc1MjIzREIwRjUyMzJGMUZEN0RGQjAxNTFFNEZGMjQxMzVBOTdGMzMxRjNCOEJENkIwQkRGOEUxQ0M1NkUxNDRCM0ZFOEM5QTc3RjJFNTA3N0YxNUM0NjFGMEYzOTAwRjkxNjE1Rjg0RUUzRDQyMDc4QUFFQUY2MERGRjQ3RDc5MTM5QjZGQkI5MjBDRjkwMUQ2NkM4NkQ4MUEzNjBGMjY3QkZCQUNBQzY1MjhEMDU1OEIxQTQzODhCMThDOTQ0NzlBQzZGNUVCNzBCMTQ4NjE3QTkwMDU2NTMzMTQ5QzM4MzExRkQ0MTQ5QUQ1NEM1RDQ3NjA3QTVENjdEMzBEQjcwQjlGNEM0REI1OUZGQzRENzY1QjE4NjZFQkNFQUQyMUYwRjRDMTk2MzNGNzZBMzNEMzQxRTYyQkQ1ODYxQzk0QzI0NDkwQUFCMzRGRUNBNDQxQ0FGOUYyRTI5Nzk0MjNFMDYxQjVGRkU1QTNFMTIzMzUyMDQzNTRBRTRDRTU3RDg4MkRCNTAyRTBFQzdBRjc5MkYyQkJFRDkxQ0U2RDk4MEI4MTBCRTQ0RTcyQkMzMjZBODUzRkQwQkI5NzUyMjc4ODk5RkYyNERGQzk3QUNCQTg1RkRGQ0RBMENCRDhEMUQ1MUFCQ0Q3MUY3NUJDODVBNEVERTk5ODlBRUFFMEVFOTREMjJBQjAxMzQ2RkI1QjUzNDlDREQwMTYzQkQ5OENFODM1RTQ0QUYwOUUxRUM1NTA5NTBCQzBEMTQ2RDM5MUUzNTNEQzcwRkM5OTVBMTQzNUIyQjlBMEJDRjg4RjFENDg4MjJDRkZCMjdBRUZBMTEyQjg0ODdBRDk2RTg0RjBGQzVGOUIwMzI2NTlGQkUxNTZFNTBCQ0M5NTUzRjBCM0VBRkU5OUYKKzIwMTExMDA3MjExNTU1IDIgNiAxMDAgNjE0MyAyIEVFRUNBQkIxNUJBNzY3Q0YxMDY4ODMyQjhDQTZGQjdEODZBN0IzQ0QyQTIzQkRCQjFEMDcxOEE4MjE1ODY0MTJDMEE2NTU1NkI3QkU5NTEyREU2NzVEMjkwQTgwMDg2MzRFN0FGRkUxOTYyRUQ5MjEzN0FEREYyQTVBMjZEMUM5ODAwMjlGNzMyQUMxMkFGNTQ0Q0UyQjhFOTU3NjBFNUJFNzhEREVDN0FGNUQ5MTIwRDQ2NkEyMEU0OEVDQUUxQTBGODUyMjIxRTM1RkIzREU5ODEwOEJGOTA2QkI0MTAzODg5NjRBODg5RDg1RUMyQjBDNjhBNUI4RkFCOUVDRDM2NDU5NEU5QjhERjYxMTU5QTA3QkZBMjU4OUQyQUMwODc5QkNBQjFFQUNFNTJDNUNCRDBFOUYxRjM5OTQ4Nzg3N0FCMDMyQzhCNEMyMEFFOTJENjQxMEQzOTk0NjgyOEIxOUIxMEVFQTAyRjQ2MjUzNEU3MjE0MEFENzlFOERCQUQ1MzE5NjdFQUNGMTYwQ0Y3NEVEMDExOTg4QUU1RkMxNzUxOTk4OUNDREYxQUQzNTRBM0NDMkI1NUI4MEI4NEQyRkNGNkFDODFCMURCNTQzNTgxMzYzOEVDRkM1OEZEQ0EwNThGNDZCNjc2NDRDOTY4ODEwNTU3Qjk4NzNBRUFGQkJCOEZDNDNEMEM5MUE3OEVDRjg4MjhCQzhGQTMyNDBEOEY5Q0U1RjU3NTlGQTM2RDRBNUU4MEU0RUFEODM0OTdBNTc3MkMwQTYyMjVGQUNCMDJGOTMyQzQ5NzQyNjUwM0Y0MzA2REMyMzEyQTE2NzgzN0ZENTBFQjlENjNDQzNGRERGMTBEMTk1Q0U2MTg0MjU5NkE4NUI1NEJDMUEzQjBEMDQ1OUQxQTMyRDJDRTFCMzAxNjFBMDRCMEU5Qjk4Rjc5MDQ1RTc3MzAzQTk1RUM2QkMyQUFBRkVDMzA1ODI2QzFERUJFQjEwMTVDMTZGMzBFMDdBMTlDN0NBQjNEMEFEQ0YyREQ0MTU4QURDRkU3NUUxQTI2MDMzQzgzQzFBRURCRUMwOUQ1MDlDMzAxQTU1ODE3OUVFN0QzMkFDRkZCOTgyNjA3NUNCQzY0OUYxMEZCMzIxMzQzNzUyMjNEQjBGNTIzMkYxRkQ3REZCMDE1MUU0RkYyNDEzNUE5N0YzMzFGM0I4QkQ2QjBCREY4RTFDQzU2RTE0NEIzRkU4QzlBNzdGMkU1MDc3RjE1QzQ2MUYwRjM5MDBGOTE2MTVGODRFRTNENDIwNzhBQUVBRjYwREZGNDdENzkxMzlCNkZCQjkyMENGOTAxRDY2Qzg2RDgxQTM2MEYyNjdCRkJBQ0FDNjUyOEQwNTU4QjFBNDM4OEIxOEM5NDQ3OUFDNkY1RUI3MEIxNDg2MTdBOTAwNTY1MzMxNDlDMzgzMTFGRDQxNDlBRDU0QzVENDc2MDdBNUQ2N0QzMERCNzBCOUY0QzREQjU5RkZDNEQ3NjVCMTg2NkVCQ0VBRDIxRjBGNEMxOTYzM0Y3NkEzM0QzNDFFNjJCRDU4NjFDOTRDMjQ0OTBBQUIzNEZFQ0E0NDFDQUY5RjJFMjk3OTQyM0UwNjFCNUZGRTVBM0UxMjMzNTIwNDM1NEFFNENFNTdEODgyREI1MDJFMEVDN0FGNzkyRjJCQkVEOTFDRTZEOTgwQjgxMEJFNDRFNzJCQzMyNkE4NTNGRDBCQjk3NTIyNzg4OTlGRjI0REZDOTdBQ0JBODVGREZDREEwQ0JEOEQxRDUxQUJDRDcxRjc1QkM4NUE0RURFOTk4OUFFQUUwRUU5NEQyMkFCMDEzNDZGQjVCNTM0OUNERDAxNjNCRDk4Q0U4MzVFNDRBRjA5RTFFQzU1MDk1MEJDMEQxNDZEMzkxRTM1M0RDNzBGQzk5NUExNDM1QjJCOUEwQkNGODhGMUQ0ODgyMkNGRkIyN0FFRkExMTJCODQ4N0FEOTZFODRGMEZDNUY5QjAzMjY1OUZCRTE1NkU1MEJDQzk1NTNGMEIzRUMzRTBBMworMjAxMTEwMDcyMTUyNTkgMiA2IDEwMCA2MTQzIDIgRUVFQ0FCQjE1QkE3NjdDRjEwNjg4MzJCOENBNkZCN0Q4NkE3QjNDRDJBMjNCREJCMUQwNzE4QTgyMTU4NjQxMkMwQTY1NTU2QjdCRTk1MTJERTY3NUQyOTBBODAwODYzNEU3QUZGRTE5NjJFRDkyMTM3QURERjJBNUEyNkQxQzk4MDAyOUY3MzJBQzEyQUY1NDRDRTJCOEU5NTc2MEU1QkU3OERERUM3QUY1RDkxMjBENDY2QTIwRTQ4RUNBRTFBMEY4NTIyMjFFMzVGQjNERTk4MTA4QkY5MDZCQjQxMDM4ODk2NEE4ODlEODVFQzJCMEM2OEE1QjhGQUI5RUNEMzY0NTk0RTlCOERGNjExNTlBMDdCRkEyNTg5RDJBQzA4NzlCQ0FCMUVBQ0U1MkM1Q0JEMEU5RjFGMzk5NDg3ODc3QUIwMzJDOEI0QzIwQUU5MkQ2NDEwRDM5OTQ2ODI4QjE5QjEwRUVBMDJGNDYyNTM0RTcyMTQwQUQ3OUU4REJBRDUzMTk2N0VBQ0YxNjBDRjc0RUQwMTE5ODhBRTVGQzE3NTE5OTg5Q0NERjFBRDM1NEEzQ0MyQjU1QjgwQjg0RDJGQ0Y2QUM4MUIxREI1NDM1ODEzNjM4RUNGQzU4RkRDQTA1OEY0NkI2NzY0NEM5Njg4MTA1NTdCOTg3M0FFQUZCQkI4RkM0M0QwQzkxQTc4RUNGODgyOEJDOEZBMzI0MEQ4RjlDRTVGNTc1OUZBMzZENEE1RTgwRTRFQUQ4MzQ5N0E1NzcyQzBBNjIyNUZBQ0IwMkY5MzJDNDk3NDI2NTAzRjQzMDZEQzIzMTJBMTY3ODM3RkQ1MEVCOUQ2M0NDM0ZEREYxMEQxOTVDRTYxODQyNTk2QTg1QjU0QkMxQTNCMEQwNDU5RDFBMzJEMkNFMUIzMDE2MUEwNEIwRTlCOThGNzkwNDVFNzczMDNBOTVFQzZCQzJBQUFGRUMzMDU4MjZDMURFQkVCMTAxNUMxNkYzMEUwN0ExOUM3Q0FCM0QwQURDRjJERDQxNThBRENGRTc1RTFBMjYwMzNDODNDMUFFREJFQzA5RDUwOUMzMDFBNTU4MTc5RUU3RDMyQUNGRkI5ODI2MDc1Q0JDNjQ5RjEwRkIzMjEzNDM3NTIyM0RCMEY1MjMyRjFGRDdERkIwMTUxRTRGRjI0MTM1QTk3RjMzMUYzQjhCRDZCMEJERjhFMUNDNTZFMTQ0QjNGRThDOUE3N0YyRTUwNzdGMTVDNDYxRjBGMzkwMEY5MTYxNUY4NEVFM0Q0MjA3OEFBRUFGNjBERkY0N0Q3OTEzOUI2RkJCOTIwQ0Y5MDFENjZDODZEODFBMzYwRjI2N0JGQkFDQUM2NTI4RDA1NThCMUE0Mzg4QjE4Qzk0NDc5QUM2RjVFQjcwQjE0ODYxN0E5MDA1NjUzMzE0OUMzODMxMUZENDE0OUFENTRDNUQ0NzYwN0E1RDY3RDMwREI3MEI5RjRDNERCNTlGRkM0RDc2NUIxODY2RUJDRUFEMjFGMEY0QzE5NjMzRjc2QTMzRDM0MUU2MkJENTg2MUM5NEMyNDQ5MEFBQjM0RkVDQTQ0MUNBRjlGMkUyOTc5NDIzRTA2MUI1RkZFNUEzRTEyMzM1MjA0MzU0QUU0Q0U1N0Q4ODJEQjUwMkUwRUM3QUY3OTJGMkJCRUQ5MUNFNkQ5ODBCODEwQkU0NEU3MkJDMzI2QTg1M0ZEMEJCOTc1MjI3ODg5OUZGMjRERkM5N0FDQkE4NUZERkNEQTBDQkQ4RDFENTFBQkNENzFGNzVCQzg1QTRFREU5OTg5QUVBRTBFRTk0RDIyQUIwMTM0NkZCNUI1MzQ5Q0REMDE2M0JEOThDRTgzNUU0NEFGMDlFMUVDNTUwOTUwQkMwRDE0NkQzOTFFMzUzREM3MEZDOTk1QTE0MzVCMkI5QTBCQ0Y4OEYxRDQ4ODIyQ0ZGQjI3QUVGQTExMkI4NDg3QUQ5NkU4NEYwRkM1RjlCMDMyNjU5RkJFMTU2RTUwQkNDOTU1M0YwQjNGRkY3OTVCCisyMDExMTAwNzIyMjIxMCAyIDYgMTAwIDYxNDMgNSBFRUVDQUJCMTVCQTc2N0NGMTA2ODgzMkI4Q0E2RkI3RDg2QTdCM0NEMkEyM0JEQkIxRDA3MThBODIxNTg2NDEyQzBBNjU1NTZCN0JFOTUxMkRFNjc1RDI5MEE4MDA4NjM0RTdBRkZFMTk2MkVEOTIxMzdBRERGMkE1QTI2RDFDOTgwMDI5RjczMkFDMTJBRjU0NENFMkI4RTk1NzYwRTVCRTc4RERFQzdBRjVEOTEyMEQ0NjZBMjBFNDhFQ0FFMUEwRjg1MjIyMUUzNUZCM0RFOTgxMDhCRjkwNkJCNDEwMzg4OTY0QTg4OUQ4NUVDMkIwQzY4QTVCOEZBQjlFQ0QzNjQ1OTRFOUI4REY2MTE1OUEwN0JGQTI1ODlEMkFDMDg3OUJDQUIxRUFDRTUyQzVDQkQwRTlGMUYzOTk0ODc4NzdBQjAzMkM4QjRDMjBBRTkyRDY0MTBEMzk5NDY4MjhCMTlCMTBFRUEwMkY0NjI1MzRFNzIxNDBBRDc5RThEQkFENTMxOTY3RUFDRjE2MENGNzRFRDAxMTk4OEFFNUZDMTc1MTk5ODlDQ0RGMUFEMzU0QTNDQzJCNTVCODBCODREMkZDRjZBQzgxQjFEQjU0MzU4MTM2MzhFQ0ZDNThGRENBMDU4RjQ2QjY3NjQ0Qzk2ODgxMDU1N0I5ODczQUVBRkJCQjhGQzQzRDBDOTFBNzhFQ0Y4ODI4QkM4RkEzMjQwRDhGOUNFNUY1NzU5RkEzNkQ0QTVFODBFNEVBRDgzNDk3QTU3NzJDMEE2MjI1RkFDQjAyRjkzMkM0OTc0MjY1MDNGNDMwNkRDMjMxMkExNjc4MzdGRDUwRUI5RDYzQ0MzRkRERjEwRDE5NUNFNjE4NDI1OTZBODVCNTRCQzFBM0IwRDA0NTlEMUEzMkQyQ0UxQjMwMTYxQTA0QjBFOUI5OEY3OTA0NUU3NzMwM0E5NUVDNkJDMkFBQUZFQzMwNTgyNkMxREVCRUIxMDE1QzE2RjMwRTA3QTE5QzdDQUIzRDBBRENGMkRENDE1OEFEQ0ZFNzVFMUEyNjAzM0M4M0MxQUVEQkVDMDlENTA5QzMwMUE1NTgxNzlFRTdEMzJBQ0ZGQjk4MjYwNzVDQkM2NDlGMTBGQjMyMTM0Mzc1MjIzREIwRjUyMzJGMUZEN0RGQjAxNTFFNEZGMjQxMzVBOTdGMzMxRjNCOEJENkIwQkRGOEUxQ0M1NkUxNDRCM0ZFOEM5QTc3RjJFNTA3N0YxNUM0NjFGMEYzOTAwRjkxNjE1Rjg0RUUzRDQyMDc4QUFFQUY2MERGRjQ3RDc5MTM5QjZGQkI5MjBDRjkwMUQ2NkM4NkQ4MUEzNjBGMjY3QkZCQUNBQzY1MjhEMDU1OEIxQTQzODhCMThDOTQ0NzlBQzZGNUVCNzBCMTQ4NjE3QTkwMDU2NTMzMTQ5QzM4MzExRkQ0MTQ5QUQ1NEM1RDQ3NjA3QTVENjdEMzBEQjcwQjlGNEM0REI1OUZGQzRENzY1QjE4NjZFQkNFQUQyMUYwRjRDMTk2MzNGNzZBMzNEMzQxRTYyQkQ1ODYxQzk0QzI0NDkwQUFCMzRGRUNBNDQxQ0FGOUYyRTI5Nzk0MjNFMDYxQjVGRkU1QTNFMTIzMzUyMDQzNTRBRTRDRTU3RDg4MkRCNTAyRTBFQzdBRjc5MkYyQkJFRDkxQ0U2RDk4MEI4MTBCRTQ0RTcyQkMzMjZBODUzRkQwQkI5NzUyMjc4ODk5RkYyNERGQzk3QUNCQTg1RkRGQ0RBMENCRDhEMUQ1MUFCQ0Q3MUY3NUJDODVBNEVERTk5ODlBRUFFMEVFOTREMjJBQjAxMzQ2RkI1QjUzNDlDREQwMTYzQkQ5OENFODM1RTQ0QUYwOUUxRUM1NTA5NTBCQzBEMTQ2RDM5MUUzNTNEQzcwRkM5OTVBMTQzNUIyQjlBMEJDRjg4RjFENDg4MjJDRkZCMjdBRUZBMTEyQjg0ODdBRDk2RTg0RjBGQzVGOUIwMzI2NTlGQkUxNTZFNTBCQ0M5NTUzRjBCNDBGQUFBQUYKKzIwMTExMDA3MjMwNjI0IDIgNiAxMDAgNjE0MyA1IEVFRUNBQkIxNUJBNzY3Q0YxMDY4ODMyQjhDQTZGQjdEODZBN0IzQ0QyQTIzQkRCQjFEMDcxOEE4MjE1ODY0MTJDMEE2NTU1NkI3QkU5NTEyREU2NzVEMjkwQTgwMDg2MzRFN0FGRkUxOTYyRUQ5MjEzN0FEREYyQTVBMjZEMUM5ODAwMjlGNzMyQUMxMkFGNTQ0Q0UyQjhFOTU3NjBFNUJFNzhEREVDN0FGNUQ5MTIwRDQ2NkEyMEU0OEVDQUUxQTBGODUyMjIxRTM1RkIzREU5ODEwOEJGOTA2QkI0MTAzODg5NjRBODg5RDg1RUMyQjBDNjhBNUI4RkFCOUVDRDM2NDU5NEU5QjhERjYxMTU5QTA3QkZBMjU4OUQyQUMwODc5QkNBQjFFQUNFNTJDNUNCRDBFOUYxRjM5OTQ4Nzg3N0FCMDMyQzhCNEMyMEFFOTJENjQxMEQzOTk0NjgyOEIxOUIxMEVFQTAyRjQ2MjUzNEU3MjE0MEFENzlFOERCQUQ1MzE5NjdFQUNGMTYwQ0Y3NEVEMDExOTg4QUU1RkMxNzUxOTk4OUNDREYxQUQzNTRBM0NDMkI1NUI4MEI4NEQyRkNGNkFDODFCMURCNTQzNTgxMzYzOEVDRkM1OEZEQ0EwNThGNDZCNjc2NDRDOTY4ODEwNTU3Qjk4NzNBRUFGQkJCOEZDNDNEMEM5MUE3OEVDRjg4MjhCQzhGQTMyNDBEOEY5Q0U1RjU3NTlGQTM2RDRBNUU4MEU0RUFEODM0OTdBNTc3MkMwQTYyMjVGQUNCMDJGOTMyQzQ5NzQyNjUwM0Y0MzA2REMyMzEyQTE2NzgzN0ZENTBFQjlENjNDQzNGRERGMTBEMTk1Q0U2MTg0MjU5NkE4NUI1NEJDMUEzQjBEMDQ1OUQxQTMyRDJDRTFCMzAxNjFBMDRCMEU5Qjk4Rjc5MDQ1RTc3MzAzQTk1RUM2QkMyQUFBRkVDMzA1ODI2QzFERUJFQjEwMTVDMTZGMzBFMDdBMTlDN0NBQjNEMEFEQ0YyREQ0MTU4QURDRkU3NUUxQTI2MDMzQzgzQzFBRURCRUMwOUQ1MDlDMzAxQTU1ODE3OUVFN0QzMkFDRkZCOTgyNjA3NUNCQzY0OUYxMEZCMzIxMzQzNzUyMjNEQjBGNTIzMkYxRkQ3REZCMDE1MUU0RkYyNDEzNUE5N0YzMzFGM0I4QkQ2QjBCREY4RTFDQzU2RTE0NEIzRkU4QzlBNzdGMkU1MDc3RjE1QzQ2MUYwRjM5MDBGOTE2MTVGODRFRTNENDIwNzhBQUVBRjYwREZGNDdENzkxMzlCNkZCQjkyMENGOTAxRDY2Qzg2RDgxQTM2MEYyNjdCRkJBQ0FDNjUyOEQwNTU4QjFBNDM4OEIxOEM5NDQ3OUFDNkY1RUI3MEIxNDg2MTdBOTAwNTY1MzMxNDlDMzgzMTFGRDQxNDlBRDU0QzVENDc2MDdBNUQ2N0QzMERCNzBCOUY0QzREQjU5RkZDNEQ3NjVCMTg2NkVCQ0VBRDIxRjBGNEMxOTYzM0Y3NkEzM0QzNDFFNjJCRDU4NjFDOTRDMjQ0OTBBQUIzNEZFQ0E0NDFDQUY5RjJFMjk3OTQyM0UwNjFCNUZGRTVBM0UxMjMzNTIwNDM1NEFFNENFNTdEODgyREI1MDJFMEVDN0FGNzkyRjJCQkVEOTFDRTZEOTgwQjgxMEJFNDRFNzJCQzMyNkE4NTNGRDBCQjk3NTIyNzg4OTlGRjI0REZDOTdBQ0JBODVGREZDREEwQ0JEOEQxRDUxQUJDRDcxRjc1QkM4NUE0RURFOTk4OUFFQUUwRUU5NEQyMkFCMDEzNDZGQjVCNTM0OUNERDAxNjNCRDk4Q0U4MzVFNDRBRjA5RTFFQzU1MDk1MEJDMEQxNDZEMzkxRTM1M0RDNzBGQzk5NUExNDM1QjJCOUEwQkNGODhGMUQ0ODgyMkNGRkIyN0FFRkExMTJCODQ4N0FEOTZFODRGMEZDNUY5QjAzMjY1OUZCRTE1NkU1MEJDQzk1NTNGMEI0Mjc1OUEwNworMjAxMTEwMDcyMzI2MzQgMiA2IDEwMCA2MTQzIDIgRUVFQ0FCQjE1QkE3NjdDRjEwNjg4MzJCOENBNkZCN0Q4NkE3QjNDRDJBMjNCREJCMUQwNzE4QTgyMTU4NjQxMkMwQTY1NTU2QjdCRTk1MTJERTY3NUQyOTBBODAwODYzNEU3QUZGRTE5NjJFRDkyMTM3QURERjJBNUEyNkQxQzk4MDAyOUY3MzJBQzEyQUY1NDRDRTJCOEU5NTc2MEU1QkU3OERERUM3QUY1RDkxMjBENDY2QTIwRTQ4RUNBRTFBMEY4NTIyMjFFMzVGQjNERTk4MTA4QkY5MDZCQjQxMDM4ODk2NEE4ODlEODVFQzJCMEM2OEE1QjhGQUI5RUNEMzY0NTk0RTlCOERGNjExNTlBMDdCRkEyNTg5RDJBQzA4NzlCQ0FCMUVBQ0U1MkM1Q0JEMEU5RjFGMzk5NDg3ODc3QUIwMzJDOEI0QzIwQUU5MkQ2NDEwRDM5OTQ2ODI4QjE5QjEwRUVBMDJGNDYyNTM0RTcyMTQwQUQ3OUU4REJBRDUzMTk2N0VBQ0YxNjBDRjc0RUQwMTE5ODhBRTVGQzE3NTE5OTg5Q0NERjFBRDM1NEEzQ0MyQjU1QjgwQjg0RDJGQ0Y2QUM4MUIxREI1NDM1ODEzNjM4RUNGQzU4RkRDQTA1OEY0NkI2NzY0NEM5Njg4MTA1NTdCOTg3M0FFQUZCQkI4RkM0M0QwQzkxQTc4RUNGODgyOEJDOEZBMzI0MEQ4RjlDRTVGNTc1OUZBMzZENEE1RTgwRTRFQUQ4MzQ5N0E1NzcyQzBBNjIyNUZBQ0IwMkY5MzJDNDk3NDI2NTAzRjQzMDZEQzIzMTJBMTY3ODM3RkQ1MEVCOUQ2M0NDM0ZEREYxMEQxOTVDRTYxODQyNTk2QTg1QjU0QkMxQTNCMEQwNDU5RDFBMzJEMkNFMUIzMDE2MUEwNEIwRTlCOThGNzkwNDVFNzczMDNBOTVFQzZCQzJBQUFGRUMzMDU4MjZDMURFQkVCMTAxNUMxNkYzMEUwN0ExOUM3Q0FCM0QwQURDRjJERDQxNThBRENGRTc1RTFBMjYwMzNDODNDMUFFREJFQzA5RDUwOUMzMDFBNTU4MTc5RUU3RDMyQUNGRkI5ODI2MDc1Q0JDNjQ5RjEwRkIzMjEzNDM3NTIyM0RCMEY1MjMyRjFGRDdERkIwMTUxRTRGRjI0MTM1QTk3RjMzMUYzQjhCRDZCMEJERjhFMUNDNTZFMTQ0QjNGRThDOUE3N0YyRTUwNzdGMTVDNDYxRjBGMzkwMEY5MTYxNUY4NEVFM0Q0MjA3OEFBRUFGNjBERkY0N0Q3OTEzOUI2RkJCOTIwQ0Y5MDFENjZDODZEODFBMzYwRjI2N0JGQkFDQUM2NTI4RDA1NThCMUE0Mzg4QjE4Qzk0NDc5QUM2RjVFQjcwQjE0ODYxN0E5MDA1NjUzMzE0OUMzODMxMUZENDE0OUFENTRDNUQ0NzYwN0E1RDY3RDMwREI3MEI5RjRDNERCNTlGRkM0RDc2NUIxODY2RUJDRUFEMjFGMEY0QzE5NjMzRjc2QTMzRDM0MUU2MkJENTg2MUM5NEMyNDQ5MEFBQjM0RkVDQTQ0MUNBRjlGMkUyOTc5NDIzRTA2MUI1RkZFNUEzRTEyMzM1MjA0MzU0QUU0Q0U1N0Q4ODJEQjUwMkUwRUM3QUY3OTJGMkJCRUQ5MUNFNkQ5ODBCODEwQkU0NEU3MkJDMzI2QTg1M0ZEMEJCOTc1MjI3ODg5OUZGMjRERkM5N0FDQkE4NUZERkNEQTBDQkQ4RDFENTFBQkNENzFGNzVCQzg1QTRFREU5OTg5QUVBRTBFRTk0RDIyQUIwMTM0NkZCNUI1MzQ5Q0REMDE2M0JEOThDRTgzNUU0NEFGMDlFMUVDNTUwOTUwQkMwRDE0NkQzOTFFMzUzREM3MEZDOTk1QTE0MzVCMkI5QTBCQ0Y4OEYxRDQ4ODIyQ0ZGQjI3QUVGQTExMkI4NDg3QUQ5NkU4NEYwRkM1RjlCMDMyNjU5RkJFMTU2RTUwQkNDOTU1M0YwQjQzMUVGQTYzCisyMDExMTAwNzIzMzcwOCAyIDYgMTAwIDYxNDMgNSBFRUVDQUJCMTVCQTc2N0NGMTA2ODgzMkI4Q0E2RkI3RDg2QTdCM0NEMkEyM0JEQkIxRDA3MThBODIxNTg2NDEyQzBBNjU1NTZCN0JFOTUxMkRFNjc1RDI5MEE4MDA4NjM0RTdBRkZFMTk2MkVEOTIxMzdBRERGMkE1QTI2RDFDOTgwMDI5RjczMkFDMTJBRjU0NENFMkI4RTk1NzYwRTVCRTc4RERFQzdBRjVEOTEyMEQ0NjZBMjBFNDhFQ0FFMUEwRjg1MjIyMUUzNUZCM0RFOTgxMDhCRjkwNkJCNDEwMzg4OTY0QTg4OUQ4NUVDMkIwQzY4QTVCOEZBQjlFQ0QzNjQ1OTRFOUI4REY2MTE1OUEwN0JGQTI1ODlEMkFDMDg3OUJDQUIxRUFDRTUyQzVDQkQwRTlGMUYzOTk0ODc4NzdBQjAzMkM4QjRDMjBBRTkyRDY0MTBEMzk5NDY4MjhCMTlCMTBFRUEwMkY0NjI1MzRFNzIxNDBBRDc5RThEQkFENTMxOTY3RUFDRjE2MENGNzRFRDAxMTk4OEFFNUZDMTc1MTk5ODlDQ0RGMUFEMzU0QTNDQzJCNTVCODBCODREMkZDRjZBQzgxQjFEQjU0MzU4MTM2MzhFQ0ZDNThGRENBMDU4RjQ2QjY3NjQ0Qzk2ODgxMDU1N0I5ODczQUVBRkJCQjhGQzQzRDBDOTFBNzhFQ0Y4ODI4QkM4RkEzMjQwRDhGOUNFNUY1NzU5RkEzNkQ0QTVFODBFNEVBRDgzNDk3QTU3NzJDMEE2MjI1RkFDQjAyRjkzMkM0OTc0MjY1MDNGNDMwNkRDMjMxMkExNjc4MzdGRDUwRUI5RDYzQ0MzRkRERjEwRDE5NUNFNjE4NDI1OTZBODVCNTRCQzFBM0IwRDA0NTlEMUEzMkQyQ0UxQjMwMTYxQTA0QjBFOUI5OEY3OTA0NUU3NzMwM0E5NUVDNkJDMkFBQUZFQzMwNTgyNkMxREVCRUIxMDE1QzE2RjMwRTA3QTE5QzdDQUIzRDBBRENGMkRENDE1OEFEQ0ZFNzVFMUEyNjAzM0M4M0MxQUVEQkVDMDlENTA5QzMwMUE1NTgxNzlFRTdEMzJBQ0ZGQjk4MjYwNzVDQkM2NDlGMTBGQjMyMTM0Mzc1MjIzREIwRjUyMzJGMUZEN0RGQjAxNTFFNEZGMjQxMzVBOTdGMzMxRjNCOEJENkIwQkRGOEUxQ0M1NkUxNDRCM0ZFOEM5QTc3RjJFNTA3N0YxNUM0NjFGMEYzOTAwRjkxNjE1Rjg0RUUzRDQyMDc4QUFFQUY2MERGRjQ3RDc5MTM5QjZGQkI5MjBDRjkwMUQ2NkM4NkQ4MUEzNjBGMjY3QkZCQUNBQzY1MjhEMDU1OEIxQTQzODhCMThDOTQ0NzlBQzZGNUVCNzBCMTQ4NjE3QTkwMDU2NTMzMTQ5QzM4MzExRkQ0MTQ5QUQ1NEM1RDQ3NjA3QTVENjdEMzBEQjcwQjlGNEM0REI1OUZGQzRENzY1QjE4NjZFQkNFQUQyMUYwRjRDMTk2MzNGNzZBMzNEMzQxRTYyQkQ1ODYxQzk0QzI0NDkwQUFCMzRGRUNBNDQxQ0FGOUYyRTI5Nzk0MjNFMDYxQjVGRkU1QTNFMTIzMzUyMDQzNTRBRTRDRTU3RDg4MkRCNTAyRTBFQzdBRjc5MkYyQkJFRDkxQ0U2RDk4MEI4MTBCRTQ0RTcyQkMzMjZBODUzRkQwQkI5NzUyMjc4ODk5RkYyNERGQzk3QUNCQTg1RkRGQ0RBMENCRDhEMUQ1MUFCQ0Q3MUY3NUJDODVBNEVERTk5ODlBRUFFMEVFOTREMjJBQjAxMzQ2RkI1QjUzNDlDREQwMTYzQkQ5OENFODM1RTQ0QUYwOUUxRUM1NTA5NTBCQzBEMTQ2RDM5MUUzNTNEQzcwRkM5OTVBMTQzNUIyQjlBMEJDRjg4RjFENDg4MjJDRkZCMjdBRUZBMTEyQjg0ODdBRDk2RTg0RjBGQzVGOUIwMzI2NTlGQkUxNTZFNTBCQ0M5NTUzRjBCNDM2RTc5OTcKKzIwMTExMDA4MDAwMTA3IDIgNiAxMDAgNjE0MyA1IEVFRUNBQkIxNUJBNzY3Q0YxMDY4ODMyQjhDQTZGQjdEODZBN0IzQ0QyQTIzQkRCQjFEMDcxOEE4MjE1ODY0MTJDMEE2NTU1NkI3QkU5NTEyREU2NzVEMjkwQTgwMDg2MzRFN0FGRkUxOTYyRUQ5MjEzN0FEREYyQTVBMjZEMUM5ODAwMjlGNzMyQUMxMkFGNTQ0Q0UyQjhFOTU3NjBFNUJFNzhEREVDN0FGNUQ5MTIwRDQ2NkEyMEU0OEVDQUUxQTBGODUyMjIxRTM1RkIzREU5ODEwOEJGOTA2QkI0MTAzODg5NjRBODg5RDg1RUMyQjBDNjhBNUI4RkFCOUVDRDM2NDU5NEU5QjhERjYxMTU5QTA3QkZBMjU4OUQyQUMwODc5QkNBQjFFQUNFNTJDNUNCRDBFOUYxRjM5OTQ4Nzg3N0FCMDMyQzhCNEMyMEFFOTJENjQxMEQzOTk0NjgyOEIxOUIxMEVFQTAyRjQ2MjUzNEU3MjE0MEFENzlFOERCQUQ1MzE5NjdFQUNGMTYwQ0Y3NEVEMDExOTg4QUU1RkMxNzUxOTk4OUNDREYxQUQzNTRBM0NDMkI1NUI4MEI4NEQyRkNGNkFDODFCMURCNTQzNTgxMzYzOEVDRkM1OEZEQ0EwNThGNDZCNjc2NDRDOTY4ODEwNTU3Qjk4NzNBRUFGQkJCOEZDNDNEMEM5MUE3OEVDRjg4MjhCQzhGQTMyNDBEOEY5Q0U1RjU3NTlGQTM2RDRBNUU4MEU0RUFEODM0OTdBNTc3MkMwQTYyMjVGQUNCMDJGOTMyQzQ5NzQyNjUwM0Y0MzA2REMyMzEyQTE2NzgzN0ZENTBFQjlENjNDQzNGRERGMTBEMTk1Q0U2MTg0MjU5NkE4NUI1NEJDMUEzQjBEMDQ1OUQxQTMyRDJDRTFCMzAxNjFBMDRCMEU5Qjk4Rjc5MDQ1RTc3MzAzQTk1RUM2QkMyQUFBRkVDMzA1ODI2QzFERUJFQjEwMTVDMTZGMzBFMDdBMTlDN0NBQjNEMEFEQ0YyREQ0MTU4QURDRkU3NUUxQTI2MDMzQzgzQzFBRURCRUMwOUQ1MDlDMzAxQTU1ODE3OUVFN0QzMkFDRkZCOTgyNjA3NUNCQzY0OUYxMEZCMzIxMzQzNzUyMjNEQjBGNTIzMkYxRkQ3REZCMDE1MUU0RkYyNDEzNUE5N0YzMzFGM0I4QkQ2QjBCREY4RTFDQzU2RTE0NEIzRkU4QzlBNzdGMkU1MDc3RjE1QzQ2MUYwRjM5MDBGOTE2MTVGODRFRTNENDIwNzhBQUVBRjYwREZGNDdENzkxMzlCNkZCQjkyMENGOTAxRDY2Qzg2RDgxQTM2MEYyNjdCRkJBQ0FDNjUyOEQwNTU4QjFBNDM4OEIxOEM5NDQ3OUFDNkY1RUI3MEIxNDg2MTdBOTAwNTY1MzMxNDlDMzgzMTFGRDQxNDlBRDU0QzVENDc2MDdBNUQ2N0QzMERCNzBCOUY0QzREQjU5RkZDNEQ3NjVCMTg2NkVCQ0VBRDIxRjBGNEMxOTYzM0Y3NkEzM0QzNDFFNjJCRDU4NjFDOTRDMjQ0OTBBQUIzNEZFQ0E0NDFDQUY5RjJFMjk3OTQyM0UwNjFCNUZGRTVBM0UxMjMzNTIwNDM1NEFFNENFNTdEODgyREI1MDJFMEVDN0FGNzkyRjJCQkVEOTFDRTZEOTgwQjgxMEJFNDRFNzJCQzMyNkE4NTNGRDBCQjk3NTIyNzg4OTlGRjI0REZDOTdBQ0JBODVGREZDREEwQ0JEOEQxRDUxQUJDRDcxRjc1QkM4NUE0RURFOTk4OUFFQUUwRUU5NEQyMkFCMDEzNDZGQjVCNTM0OUNERDAxNjNCRDk4Q0U4MzVFNDRBRjA5RTFFQzU1MDk1MEJDMEQxNDZEMzkxRTM1M0RDNzBGQzk5NUExNDM1QjJCOUEwQkNGODhGMUQ0ODgyMkNGRkIyN0FFRkExMTJCODQ4N0FEOTZFODRGMEZDNUY5QjAzMjY1OUZCRTE1NkU1MEJDQzk1NTNGMEI0NDM2NzFBRgorMjAxMTEwMDgwMDE0NTcgMiA2IDEwMCA2MTQzIDIgRUVFQ0FCQjE1QkE3NjdDRjEwNjg4MzJCOENBNkZCN0Q4NkE3QjNDRDJBMjNCREJCMUQwNzE4QTgyMTU4NjQxMkMwQTY1NTU2QjdCRTk1MTJERTY3NUQyOTBBODAwODYzNEU3QUZGRTE5NjJFRDkyMTM3QURERjJBNUEyNkQxQzk4MDAyOUY3MzJBQzEyQUY1NDRDRTJCOEU5NTc2MEU1QkU3OERERUM3QUY1RDkxMjBENDY2QTIwRTQ4RUNBRTFBMEY4NTIyMjFFMzVGQjNERTk4MTA4QkY5MDZCQjQxMDM4ODk2NEE4ODlEODVFQzJCMEM2OEE1QjhGQUI5RUNEMzY0NTk0RTlCOERGNjExNTlBMDdCRkEyNTg5RDJBQzA4NzlCQ0FCMUVBQ0U1MkM1Q0JEMEU5RjFGMzk5NDg3ODc3QUIwMzJDOEI0QzIwQUU5MkQ2NDEwRDM5OTQ2ODI4QjE5QjEwRUVBMDJGNDYyNTM0RTcyMTQwQUQ3OUU4REJBRDUzMTk2N0VBQ0YxNjBDRjc0RUQwMTE5ODhBRTVGQzE3NTE5OTg5Q0NERjFBRDM1NEEzQ0MyQjU1QjgwQjg0RDJGQ0Y2QUM4MUIxREI1NDM1ODEzNjM4RUNGQzU4RkRDQTA1OEY0NkI2NzY0NEM5Njg4MTA1NTdCOTg3M0FFQUZCQkI4RkM0M0QwQzkxQTc4RUNGODgyOEJDOEZBMzI0MEQ4RjlDRTVGNTc1OUZBMzZENEE1RTgwRTRFQUQ4MzQ5N0E1NzcyQzBBNjIyNUZBQ0IwMkY5MzJDNDk3NDI2NTAzRjQzMDZEQzIzMTJBMTY3ODM3RkQ1MEVCOUQ2M0NDM0ZEREYxMEQxOTVDRTYxODQyNTk2QTg1QjU0QkMxQTNCMEQwNDU5RDFBMzJEMkNFMUIzMDE2MUEwNEIwRTlCOThGNzkwNDVFNzczMDNBOTVFQzZCQzJBQUFGRUMzMDU4MjZDMURFQkVCMTAxNUMxNkYzMEUwN0ExOUM3Q0FCM0QwQURDRjJERDQxNThBRENGRTc1RTFBMjYwMzNDODNDMUFFREJFQzA5RDUwOUMzMDFBNTU4MTc5RUU3RDMyQUNGRkI5ODI2MDc1Q0JDNjQ5RjEwRkIzMjEzNDM3NTIyM0RCMEY1MjMyRjFGRDdERkIwMTUxRTRGRjI0MTM1QTk3RjMzMUYzQjhCRDZCMEJERjhFMUNDNTZFMTQ0QjNGRThDOUE3N0YyRTUwNzdGMTVDNDYxRjBGMzkwMEY5MTYxNUY4NEVFM0Q0MjA3OEFBRUFGNjBERkY0N0Q3OTEzOUI2RkJCOTIwQ0Y5MDFENjZDODZEODFBMzYwRjI2N0JGQkFDQUM2NTI4RDA1NThCMUE0Mzg4QjE4Qzk0NDc5QUM2RjVFQjcwQjE0ODYxN0E5MDA1NjUzMzE0OUMzODMxMUZENDE0OUFENTRDNUQ0NzYwN0E1RDY3RDMwREI3MEI5RjRDNERCNTlGRkM0RDc2NUIxODY2RUJDRUFEMjFGMEY0QzE5NjMzRjc2QTMzRDM0MUU2MkJENTg2MUM5NEMyNDQ5MEFBQjM0RkVDQTQ0MUNBRjlGMkUyOTc5NDIzRTA2MUI1RkZFNUEzRTEyMzM1MjA0MzU0QUU0Q0U1N0Q4ODJEQjUwMkUwRUM3QUY3OTJGMkJCRUQ5MUNFNkQ5ODBCODEwQkU0NEU3MkJDMzI2QTg1M0ZEMEJCOTc1MjI3ODg5OUZGMjRERkM5N0FDQkE4NUZERkNEQTBDQkQ4RDFENTFBQkNENzFGNzVCQzg1QTRFREU5OTg5QUVBRTBFRTk0RDIyQUIwMTM0NkZCNUI1MzQ5Q0REMDE2M0JEOThDRTgzNUU0NEFGMDlFMUVDNTUwOTUwQkMwRDE0NkQzOTFFMzUzREM3MEZDOTk1QTE0MzVCMkI5QTBCQ0Y4OEYxRDQ4ODIyQ0ZGQjI3QUVGQTExMkI4NDg3QUQ5NkU4NEYwRkM1RjlCMDMyNjU5RkJFMTU2RTUwQkNDOTU1M0YwQjQ0QTY5RDJCCisyMDExMTAwNjAzNTk0MSAyIDYgMTAwIDgxOTEgMiBEQzFEODVBNDJERTRDODBDMTQ1NUMzMzkzOEFDNDZGNTA4RkRCRTE5N0RGOEZFOEJERjU5RTFDOEEyMzFCMTYyNERFREI2NjQ2RDFEQzQyNjE4MjZGMTE0NzNFRjMzMzlFNkI1QjAzMDMxMDY4MTU0NzdFOTFDMTM2RTlCM0VCQzY4Mzk3RUQ3MUJGNTQ4OTJERTg2RTVGNzJEMjNFQUNDQjVDM0QxNjU2NTQ1M0Y1OEQzRENGQTI4QTgxMkQxMUE1NDBEMUIzOEMyOURBNjUzMUNDNDNGMDhGNjU1RTA2N0ExNjI0ODM5MUY3QUU4QzUwNkUwMkFGMTU3NTREQUI3MjhDMjUwQzEzRUFEMDFDRkVCRkFGRjc0ODBEN0JGNEFDQzA3OTI0NDM0NkI3ODFERTUxRjg2NEM4MzA2NDcxNjU1MzIxNTVBODVEQTlBM0FBRTQ4RUE5RUY1Mjg3MjA4RjI0OUU0QzU0RUVGNDY1MjJGMjc2MkVCNDRDQUM4RDU4OTI5REI2NThBQjRCRDlDNjlFRURBRkY2M0NENzgwOEQ1OURGOTAxODc3OTI0MDk1OUE0M0ZDMkZDNDBENTVDMkUxMkM2MENGQ0E1NURENDUwMkJDN0UzRjc5OURCREIxOTlDQzVEQzNCMzk4MjVBNDQzRjMzQTBDRkRCRTE1NzI1MTk3OEE5ODZDRTkyMDgzNjkzNjBDMjZFOTk2MzFFNzQwODA1QTczRTI0QjBCOTVDRkIzRjc3OTRFMUQ4NzRDMDMxRkVBQzFENTk5M0ZEMjYwMTQ4QkE5Q0ZDMjQ2NDBBNEFEMzRBNUFCODk4MzhCMjRENzIwNUUxQzU5NTYxOEVENDk3QkFDQkI0QjMyNzg0NTRGMDQ1MjVBRkYzRkQ5RkM4Mzg4NTFGNTBCODE5QUY4MENERjkyMjI1NUY4NkY0ODBGOUQzRjM3QUQxMTk2NDQ2RjM3ODAxRTlCOTg1MDcyMjhDNjQ5RDVGRjkwODI5MkNGRTVEMDM5MkE0RTk4QkI3NzAxMkM5RDEzRDJDQjZCOTQxMjI1MjZDNEJBODkzQTk0RjBENjBBREJFNEVEQTcxMTdBQjY1Q0RFOEIzQTBFRDNFMTkzMDFDMUJBNjVDRUY2QjQwODBFODY2OTZGNzI5Qzg3NkNDREM0MDNCN0VEMDcwQjFCRDExQ0QxMTRCNkZEMDVGQTdGQzczMjNEQzVFQjAzQUVGMTBDRDc0RDlERjM1NDhFOEU3ODk1REY0MThDMTBFOTdCQTZEMDhBMjhFRjA1QkZBOTA4NkYzNUIwQTEzMUY5MUI2QjkwNUMwMUUyQ0ZCQjY5MTc2OTRERjM5OTZFNDQxNzM5MTEyN0JCMDMyRUIyNDkwNTg5QjVBQ0ZFNDZENjg5Qzg0Q0FENDdBMEM0RkQ0N0NEQUY3MTc0QjI4NEFGMDU1MThBOTMwRTYwRTk1REY3QjA3RjQwNTQ1RUM1REY3MDA1ODdBNDI0OTNBM0JEQ0RCMjNBQzgzNEE3NjIxMjJDOTFCMUU5RUIzMDNFQTM3MkQ2RkNBMjBBNEJBMzM1MTRCMjQ1RDEwOTgwNUEwMDU3NUU2MEFBQTUyNjlGNkVEOUIzMkQ1Nzk0RDQ1MTI3RDUyNzNGNENDRTc0Njk3MjRFRDhEQkFEMjA4QjUwMUYzOUEyOTQxQzRGNDg3MzU2QzYxMzFEM0M0RUYwMkRBNjE2RjBCRjM5RDExNEM5MjA1NEM5OEZDNUFFNUFGRUUxNDZCQkQxNDY2RTkwQkY4MTM1MkQ2QjI4RjQwRTQ0MTFBN0FBMjJENDlEODI0QTA5NzJFM0YyMDJFRERFN0FFQUIzNEQ3MjcxQ0VENzUyOUUxMjNBODEwQ0VENDgwRUFBMDc3Q0Q0NUFFNkY0QkJFRTQ3N0NDNzhDNUQ4QjU0RUQyNTMxRTYwQzk1MTZEQ0I4NEFCRDIxMDI3N0QyRTZBMUNCMkY3MDkxNDQ0N0VEN0JFNTRCNzA4MUNCM0EwQjlGRDUwQkRFMjM5NkRBQ0VGMTk2QUIwM0QwRkI2QTczQzBDMTA2NjMwRTgyRTVGNThCRTJGMUE5NDIzNkEzQjNCQzFGMjcwNENGNEI1OUQwOEQxQzRDREVBOUEzRjRDOUE0ODU2MzQ5QTdBQTgxNDZGMjVBMUFBMzM1QzYwRjc5ODAwN0ZDQ0EzQzUzRENDODgwOTBCMjhCQUVBQUE5RTIzMjYyNUEzREVFNDRFNERFN0UwQjI2MkIwMkNBRDRDN0MwM0NEODY2Rjc4QTYwNzk4MDM3RUE5NDYzQ0RFRkI1OEY4NTU0N0FGOUQ5RDM4RDdCNUUyNjVGOUIxMTFCREM1NzlFMzUyNjk5Qjc2NjEzNUNDMTQ4RTA1NEE4RjFEMjI5NzQ0MTRCODZCMzFERjU4RDU1QUVGMTc4MEZGOTExMTU0RUQ1QjZDQTBFMTZCMjc2NEQ0RTAwQzNBMjQ4OTM4MTk1MzY0OUVCQ0VDNzg1NDFEQzYyNjYzRTFCMzhFQjNCNkNGNzkxQjYzOTMxMzdEOTFGNEM1RkU2NjI1REZCOTYzMEMyMTk4RDc4NDc3QzJBN0MwN0M1REQ4MzIwQkM4RUI3QzFGREQ0QzJENjVCRjNGMzA1OUZGOTE5NEVBODc4OTJDMzExRUExQjFDRjkzNDVERjE0NEQ4MkVGRjRBM0M2MkVEQThFOTc3NTM1QjgzRDZDODZDQgorMjAxMTEwMDYwNDQ2NTEgMiA2IDEwMCA4MTkxIDUgREMxRDg1QTQyREU0QzgwQzE0NTVDMzM5MzhBQzQ2RjUwOEZEQkUxOTdERjhGRThCREY1OUUxQzhBMjMxQjE2MjRERURCNjY0NkQxREM0MjYxODI2RjExNDczRUYzMzM5RTZCNUIwMzAzMTA2ODE1NDc3RTkxQzEzNkU5QjNFQkM2ODM5N0VENzFCRjU0ODkyREU4NkU1RjcyRDIzRUFDQ0I1QzNEMTY1NjU0NTNGNThEM0RDRkEyOEE4MTJEMTFBNTQwRDFCMzhDMjlEQTY1MzFDQzQzRjA4RjY1NUUwNjdBMTYyNDgzOTFGN0FFOEM1MDZFMDJBRjE1NzU0REFCNzI4QzI1MEMxM0VBRDAxQ0ZFQkZBRkY3NDgwRDdCRjRBQ0MwNzkyNDQzNDZCNzgxREU1MUY4NjRDODMwNjQ3MTY1NTMyMTU1QTg1REE5QTNBQUU0OEVBOUVGNTI4NzIwOEYyNDlFNEM1NEVFRjQ2NTIyRjI3NjJFQjQ0Q0FDOEQ1ODkyOURCNjU4QUI0QkQ5QzY5RUVEQUZGNjNDRDc4MDhENTlERjkwMTg3NzkyNDA5NTlBNDNGQzJGQzQwRDU1QzJFMTJDNjBDRkNBNTVERDQ1MDJCQzdFM0Y3OTlEQkRCMTk5Q0M1REMzQjM5ODI1QTQ0M0YzM0EwQ0ZEQkUxNTcyNTE5NzhBOTg2Q0U5MjA4MzY5MzYwQzI2RTk5NjMxRTc0MDgwNUE3M0UyNEIwQjk1Q0ZCM0Y3Nzk0RTFEODc0QzAzMUZFQUMxRDU5OTNGRDI2MDE0OEJBOUNGQzI0NjQwQTRBRDM0QTVBQjg5ODM4QjI0RDcyMDVFMUM1OTU2MThFRDQ5N0JBQ0JCNEIzMjc4NDU0RjA0NTI1QUZGM0ZEOUZDODM4ODUxRjUwQjgxOUFGODBDREY5MjIyNTVGODZGNDgwRjlEM0YzN0FEMTE5NjQ0NkYzNzgwMUU5Qjk4NTA3MjI4QzY0OUQ1RkY5MDgyOTJDRkU1RDAzOTJBNEU5OEJCNzcwMTJDOUQxM0QyQ0I2Qjk0MTIyNTI2QzRCQTg5M0E5NEYwRDYwQURCRTRFREE3MTE3QUI2NUNERThCM0EwRUQzRTE5MzAxQzFCQTY1Q0VGNkI0MDgwRTg2Njk2RjcyOUM4NzZDQ0RDNDAzQjdFRDA3MEIxQkQxMUNEMTE0QjZGRDA1RkE3RkM3MzIzREM1RUIwM0FFRjEwQ0Q3NEQ5REYzNTQ4RThFNzg5NURGNDE4QzEwRTk3QkE2RDA4QTI4RUYwNUJGQTkwODZGMzVCMEExMzFGOTFCNkI5MDVDMDFFMkNGQkI2OTE3Njk0REYzOTk2RTQ0MTczOTExMjdCQjAzMkVCMjQ5MDU4OUI1QUNGRTQ2RDY4OUM4NENBRDQ3QTBDNEZENDdDREFGNzE3NEIyODRBRjA1NTE4QTkzMEU2MEU5NURGN0IwN0Y0MDU0NUVDNURGNzAwNTg3QTQyNDkzQTNCRENEQjIzQUM4MzRBNzYyMTIyQzkxQjFFOUVCMzAzRUEzNzJENkZDQTIwQTRCQTMzNTE0QjI0NUQxMDk4MDVBMDA1NzVFNjBBQUE1MjY5RjZFRDlCMzJENTc5NEQ0NTEyN0Q1MjczRjRDQ0U3NDY5NzI0RUQ4REJBRDIwOEI1MDFGMzlBMjk0MUM0RjQ4NzM1NkM2MTMxRDNDNEVGMDJEQTYxNkYwQkYzOUQxMTRDOTIwNTRDOThGQzVBRTVBRkVFMTQ2QkJEMTQ2NkU5MEJGODEzNTJENkIyOEY0MEU0NDExQTdBQTIyRDQ5RDgyNEEwOTcyRTNGMjAyRURERTdBRUFCMzRENzI3MUNFRDc1MjlFMTIzQTgxMENFRDQ4MEVBQTA3N0NENDVBRTZGNEJCRUU0NzdDQzc4QzVEOEI1NEVEMjUzMUU2MEM5NTE2RENCODRBQkQyMTAyNzdEMkU2QTFDQjJGNzA5MTQ0NDdFRDdCRTU0QjcwODFDQjNBMEI5RkQ1MEJERTIzOTZEQUNFRjE5NkFCMDNEMEZCNkE3M0MwQzEwNjYzMEU4MkU1RjU4QkUyRjFBOTQyMzZBM0IzQkMxRjI3MDRDRjRCNTlEMDhEMUM0Q0RFQTlBM0Y0QzlBNDg1NjM0OUE3QUE4MTQ2RjI1QTFBQTMzNUM2MEY3OTgwMDdGQ0NBM0M1M0RDQzg4MDkwQjI4QkFFQUFBOUUyMzI2MjVBM0RFRTQ0RTRERTdFMEIyNjJCMDJDQUQ0QzdDMDNDRDg2NkY3OEE2MDc5ODAzN0VBOTQ2M0NERUZCNThGODU1NDdBRjlEOUQzOEQ3QjVFMjY1RjlCMTExQkRDNTc5RTM1MjY5OUI3NjYxMzVDQzE0OEUwNTRBOEYxRDIyOTc0NDE0Qjg2QjMxREY1OEQ1NUFFRjE3ODBGRjkxMTE1NEVENUI2Q0EwRTE2QjI3NjRENEUwMEMzQTI0ODkzODE5NTM2NDlFQkNFQzc4NTQxREM2MjY2M0UxQjM4RUIzQjZDRjc5MUI2MzkzMTM3RDkxRjRDNUZFNjYyNURGQjk2MzBDMjE5OEQ3ODQ3N0MyQTdDMDdDNUREODMyMEJDOEVCN0MxRkRENEMyRDY1QkYzRjMwNTlGRjkxOTRFQTg3ODkyQzMxMUVBMUIxQ0Y5MzQ1REYxNDREODJFRkY0QTNDNjJFREE4RTk3NzUzNUI4M0UyRUMyMEYKKzIwMTExMDA2MDYyNzI3IDIgNiAxMDAgODE5MSAyIERDMUQ4NUE0MkRFNEM4MEMxNDU1QzMzOTM4QUM0NkY1MDhGREJFMTk3REY4RkU4QkRGNTlFMUM4QTIzMUIxNjI0REVEQjY2NDZEMURDNDI2MTgyNkYxMTQ3M0VGMzMzOUU2QjVCMDMwMzEwNjgxNTQ3N0U5MUMxMzZFOUIzRUJDNjgzOTdFRDcxQkY1NDg5MkRFODZFNUY3MkQyM0VBQ0NCNUMzRDE2NTY1NDUzRjU4RDNEQ0ZBMjhBODEyRDExQTU0MEQxQjM4QzI5REE2NTMxQ0M0M0YwOEY2NTVFMDY3QTE2MjQ4MzkxRjdBRThDNTA2RTAyQUYxNTc1NERBQjcyOEMyNTBDMTNFQUQwMUNGRUJGQUZGNzQ4MEQ3QkY0QUNDMDc5MjQ0MzQ2Qjc4MURFNTFGODY0QzgzMDY0NzE2NTUzMjE1NUE4NURBOUEzQUFFNDhFQTlFRjUyODcyMDhGMjQ5RTRDNTRFRUY0NjUyMkYyNzYyRUI0NENBQzhENTg5MjlEQjY1OEFCNEJEOUM2OUVFREFGRjYzQ0Q3ODA4RDU5REY5MDE4Nzc5MjQwOTU5QTQzRkMyRkM0MEQ1NUMyRTEyQzYwQ0ZDQTU1REQ0NTAyQkM3RTNGNzk5REJEQjE5OUNDNURDM0IzOTgyNUE0NDNGMzNBMENGREJFMTU3MjUxOTc4QTk4NkNFOTIwODM2OTM2MEMyNkU5OTYzMUU3NDA4MDVBNzNFMjRCMEI5NUNGQjNGNzc5NEUxRDg3NEMwMzFGRUFDMUQ1OTkzRkQyNjAxNDhCQTlDRkMyNDY0MEE0QUQzNEE1QUI4OTgzOEIyNEQ3MjA1RTFDNTk1NjE4RUQ0OTdCQUNCQjRCMzI3ODQ1NEYwNDUyNUFGRjNGRDlGQzgzODg1MUY1MEI4MTlBRjgwQ0RGOTIyMjU1Rjg2RjQ4MEY5RDNGMzdBRDExOTY0NDZGMzc4MDFFOUI5ODUwNzIyOEM2NDlENUZGOTA4MjkyQ0ZFNUQwMzkyQTRFOThCQjc3MDEyQzlEMTNEMkNCNkI5NDEyMjUyNkM0QkE4OTNBOTRGMEQ2MEFEQkU0RURBNzExN0FCNjVDREU4QjNBMEVEM0UxOTMwMUMxQkE2NUNFRjZCNDA4MEU4NjY5NkY3MjlDODc2Q0NEQzQwM0I3RUQwNzBCMUJEMTFDRDExNEI2RkQwNUZBN0ZDNzMyM0RDNUVCMDNBRUYxMENENzREOURGMzU0OEU4RTc4OTVERjQxOEMxMEU5N0JBNkQwOEEyOEVGMDVCRkE5MDg2RjM1QjBBMTMxRjkxQjZCOTA1QzAxRTJDRkJCNjkxNzY5NERGMzk5NkU0NDE3MzkxMTI3QkIwMzJFQjI0OTA1ODlCNUFDRkU0NkQ2ODlDODRDQUQ0N0EwQzRGRDQ3Q0RBRjcxNzRCMjg0QUYwNTUxOEE5MzBFNjBFOTVERjdCMDdGNDA1NDVFQzVERjcwMDU4N0E0MjQ5M0EzQkRDREIyM0FDODM0QTc2MjEyMkM5MUIxRTlFQjMwM0VBMzcyRDZGQ0EyMEE0QkEzMzUxNEIyNDVEMTA5ODA1QTAwNTc1RTYwQUFBNTI2OUY2RUQ5QjMyRDU3OTRENDUxMjdENTI3M0Y0Q0NFNzQ2OTcyNEVEOERCQUQyMDhCNTAxRjM5QTI5NDFDNEY0ODczNTZDNjEzMUQzQzRFRjAyREE2MTZGMEJGMzlEMTE0QzkyMDU0Qzk4RkM1QUU1QUZFRTE0NkJCRDE0NjZFOTBCRjgxMzUyRDZCMjhGNDBFNDQxMUE3QUEyMkQ0OUQ4MjRBMDk3MkUzRjIwMkVEREU3QUVBQjM0RDcyNzFDRUQ3NTI5RTEyM0E4MTBDRUQ0ODBFQUEwNzdDRDQ1QUU2RjRCQkVFNDc3Q0M3OEM1RDhCNTRFRDI1MzFFNjBDOTUxNkRDQjg0QUJEMjEwMjc3RDJFNkExQ0IyRjcwOTE0NDQ3RUQ3QkU1NEI3MDgxQ0IzQTBCOUZENTBCREUyMzk2REFDRUYxOTZBQjAzRDBGQjZBNzNDMEMxMDY2MzBFODJFNUY1OEJFMkYxQTk0MjM2QTNCM0JDMUYyNzA0Q0Y0QjU5RDA4RDFDNENERUE5QTNGNEM5QTQ4NTYzNDlBN0FBODE0NkYyNUExQUEzMzVDNjBGNzk4MDA3RkNDQTNDNTNEQ0M4ODA5MEIyOEJBRUFBQTlFMjMyNjI1QTNERUU0NEU0REU3RTBCMjYyQjAyQ0FENEM3QzAzQ0Q4NjZGNzhBNjA3OTgwMzdFQTk0NjNDREVGQjU4Rjg1NTQ3QUY5RDlEMzhEN0I1RTI2NUY5QjExMUJEQzU3OUUzNTI2OTlCNzY2MTM1Q0MxNDhFMDU0QThGMUQyMjk3NDQxNEI4NkIzMURGNThENTVBRUYxNzgwRkY5MTExNTRFRDVCNkNBMEUxNkIyNzY0RDRFMDBDM0EyNDg5MzgxOTUzNjQ5RUJDRUM3ODU0MURDNjI2NjNFMUIzOEVCM0I2Q0Y3OTFCNjM5MzEzN0Q5MUY0QzVGRTY2MjVERkI5NjMwQzIxOThENzg0NzdDMkE3QzA3QzVERDgzMjBCQzhFQjdDMUZERDRDMkQ2NUJGM0YzMDU5RkY5MTk0RUE4Nzg5MkMzMTFFQTFCMUNGOTM0NURGMTQ0RDgyRUZGNEEzQzYyRURBOEU5Nzc1MzVCODNGRDg3RDkzCisyMDExMTAwNjEzNDQwOCAyIDYgMTAwIDgxOTEgMiBEQzFEODVBNDJERTRDODBDMTQ1NUMzMzkzOEFDNDZGNTA4RkRCRTE5N0RGOEZFOEJERjU5RTFDOEEyMzFCMTYyNERFREI2NjQ2RDFEQzQyNjE4MjZGMTE0NzNFRjMzMzlFNkI1QjAzMDMxMDY4MTU0NzdFOTFDMTM2RTlCM0VCQzY4Mzk3RUQ3MUJGNTQ4OTJERTg2RTVGNzJEMjNFQUNDQjVDM0QxNjU2NTQ1M0Y1OEQzRENGQTI4QTgxMkQxMUE1NDBEMUIzOEMyOURBNjUzMUNDNDNGMDhGNjU1RTA2N0ExNjI0ODM5MUY3QUU4QzUwNkUwMkFGMTU3NTREQUI3MjhDMjUwQzEzRUFEMDFDRkVCRkFGRjc0ODBEN0JGNEFDQzA3OTI0NDM0NkI3ODFERTUxRjg2NEM4MzA2NDcxNjU1MzIxNTVBODVEQTlBM0FBRTQ4RUE5RUY1Mjg3MjA4RjI0OUU0QzU0RUVGNDY1MjJGMjc2MkVCNDRDQUM4RDU4OTI5REI2NThBQjRCRDlDNjlFRURBRkY2M0NENzgwOEQ1OURGOTAxODc3OTI0MDk1OUE0M0ZDMkZDNDBENTVDMkUxMkM2MENGQ0E1NURENDUwMkJDN0UzRjc5OURCREIxOTlDQzVEQzNCMzk4MjVBNDQzRjMzQTBDRkRCRTE1NzI1MTk3OEE5ODZDRTkyMDgzNjkzNjBDMjZFOTk2MzFFNzQwODA1QTczRTI0QjBCOTVDRkIzRjc3OTRFMUQ4NzRDMDMxRkVBQzFENTk5M0ZEMjYwMTQ4QkE5Q0ZDMjQ2NDBBNEFEMzRBNUFCODk4MzhCMjRENzIwNUUxQzU5NTYxOEVENDk3QkFDQkI0QjMyNzg0NTRGMDQ1MjVBRkYzRkQ5RkM4Mzg4NTFGNTBCODE5QUY4MENERjkyMjI1NUY4NkY0ODBGOUQzRjM3QUQxMTk2NDQ2RjM3ODAxRTlCOTg1MDcyMjhDNjQ5RDVGRjkwODI5MkNGRTVEMDM5MkE0RTk4QkI3NzAxMkM5RDEzRDJDQjZCOTQxMjI1MjZDNEJBODkzQTk0RjBENjBBREJFNEVEQTcxMTdBQjY1Q0RFOEIzQTBFRDNFMTkzMDFDMUJBNjVDRUY2QjQwODBFODY2OTZGNzI5Qzg3NkNDREM0MDNCN0VEMDcwQjFCRDExQ0QxMTRCNkZEMDVGQTdGQzczMjNEQzVFQjAzQUVGMTBDRDc0RDlERjM1NDhFOEU3ODk1REY0MThDMTBFOTdCQTZEMDhBMjhFRjA1QkZBOTA4NkYzNUIwQTEzMUY5MUI2QjkwNUMwMUUyQ0ZCQjY5MTc2OTRERjM5OTZFNDQxNzM5MTEyN0JCMDMyRUIyNDkwNTg5QjVBQ0ZFNDZENjg5Qzg0Q0FENDdBMEM0RkQ0N0NEQUY3MTc0QjI4NEFGMDU1MThBOTMwRTYwRTk1REY3QjA3RjQwNTQ1RUM1REY3MDA1ODdBNDI0OTNBM0JEQ0RCMjNBQzgzNEE3NjIxMjJDOTFCMUU5RUIzMDNFQTM3MkQ2RkNBMjBBNEJBMzM1MTRCMjQ1RDEwOTgwNUEwMDU3NUU2MEFBQTUyNjlGNkVEOUIzMkQ1Nzk0RDQ1MTI3RDUyNzNGNENDRTc0Njk3MjRFRDhEQkFEMjA4QjUwMUYzOUEyOTQxQzRGNDg3MzU2QzYxMzFEM0M0RUYwMkRBNjE2RjBCRjM5RDExNEM5MjA1NEM5OEZDNUFFNUFGRUUxNDZCQkQxNDY2RTkwQkY4MTM1MkQ2QjI4RjQwRTQ0MTFBN0FBMjJENDlEODI0QTA5NzJFM0YyMDJFRERFN0FFQUIzNEQ3MjcxQ0VENzUyOUUxMjNBODEwQ0VENDgwRUFBMDc3Q0Q0NUFFNkY0QkJFRTQ3N0NDNzhDNUQ4QjU0RUQyNTMxRTYwQzk1MTZEQ0I4NEFCRDIxMDI3N0QyRTZBMUNCMkY3MDkxNDQ0N0VEN0JFNTRCNzA4MUNCM0EwQjlGRDUwQkRFMjM5NkRBQ0VGMTk2QUIwM0QwRkI2QTczQzBDMTA2NjMwRTgyRTVGNThCRTJGMUE5NDIzNkEzQjNCQzFGMjcwNENGNEI1OUQwOEQxQzRDREVBOUEzRjRDOUE0ODU2MzQ5QTdBQTgxNDZGMjVBMUFBMzM1QzYwRjc5ODAwN0ZDQ0EzQzUzRENDODgwOTBCMjhCQUVBQUE5RTIzMjYyNUEzREVFNDRFNERFN0UwQjI2MkIwMkNBRDRDN0MwM0NEODY2Rjc4QTYwNzk4MDM3RUE5NDYzQ0RFRkI1OEY4NTU0N0FGOUQ5RDM4RDdCNUUyNjVGOUIxMTFCREM1NzlFMzUyNjk5Qjc2NjEzNUNDMTQ4RTA1NEE4RjFEMjI5NzQ0MTRCODZCMzFERjU4RDU1QUVGMTc4MEZGOTExMTU0RUQ1QjZDQTBFMTZCMjc2NEQ0RTAwQzNBMjQ4OTM4MTk1MzY0OUVCQ0VDNzg1NDFEQzYyNjYzRTFCMzhFQjNCNkNGNzkxQjYzOTMxMzdEOTFGNEM1RkU2NjI1REZCOTYzMEMyMTk4RDc4NDc3QzJBN0MwN0M1REQ4MzIwQkM4RUI3QzFGREQ0QzJENjVCRjNGMzA1OUZGOTE5NEVBODc4OTJDMzExRUExQjFDRjkzNDVERjE0NEQ4MkVGRjRBM0M2MkVEQThFOTc3NTM1Qjg0NzJCQzMzQgorMjAxMTEwMDYxNzA1MTQgMiA2IDEwMCA4MTkxIDIgREMxRDg1QTQyREU0QzgwQzE0NTVDMzM5MzhBQzQ2RjUwOEZEQkUxOTdERjhGRThCREY1OUUxQzhBMjMxQjE2MjRERURCNjY0NkQxREM0MjYxODI2RjExNDczRUYzMzM5RTZCNUIwMzAzMTA2ODE1NDc3RTkxQzEzNkU5QjNFQkM2ODM5N0VENzFCRjU0ODkyREU4NkU1RjcyRDIzRUFDQ0I1QzNEMTY1NjU0NTNGNThEM0RDRkEyOEE4MTJEMTFBNTQwRDFCMzhDMjlEQTY1MzFDQzQzRjA4RjY1NUUwNjdBMTYyNDgzOTFGN0FFOEM1MDZFMDJBRjE1NzU0REFCNzI4QzI1MEMxM0VBRDAxQ0ZFQkZBRkY3NDgwRDdCRjRBQ0MwNzkyNDQzNDZCNzgxREU1MUY4NjRDODMwNjQ3MTY1NTMyMTU1QTg1REE5QTNBQUU0OEVBOUVGNTI4NzIwOEYyNDlFNEM1NEVFRjQ2NTIyRjI3NjJFQjQ0Q0FDOEQ1ODkyOURCNjU4QUI0QkQ5QzY5RUVEQUZGNjNDRDc4MDhENTlERjkwMTg3NzkyNDA5NTlBNDNGQzJGQzQwRDU1QzJFMTJDNjBDRkNBNTVERDQ1MDJCQzdFM0Y3OTlEQkRCMTk5Q0M1REMzQjM5ODI1QTQ0M0YzM0EwQ0ZEQkUxNTcyNTE5NzhBOTg2Q0U5MjA4MzY5MzYwQzI2RTk5NjMxRTc0MDgwNUE3M0UyNEIwQjk1Q0ZCM0Y3Nzk0RTFEODc0QzAzMUZFQUMxRDU5OTNGRDI2MDE0OEJBOUNGQzI0NjQwQTRBRDM0QTVBQjg5ODM4QjI0RDcyMDVFMUM1OTU2MThFRDQ5N0JBQ0JCNEIzMjc4NDU0RjA0NTI1QUZGM0ZEOUZDODM4ODUxRjUwQjgxOUFGODBDREY5MjIyNTVGODZGNDgwRjlEM0YzN0FEMTE5NjQ0NkYzNzgwMUU5Qjk4NTA3MjI4QzY0OUQ1RkY5MDgyOTJDRkU1RDAzOTJBNEU5OEJCNzcwMTJDOUQxM0QyQ0I2Qjk0MTIyNTI2QzRCQTg5M0E5NEYwRDYwQURCRTRFREE3MTE3QUI2NUNERThCM0EwRUQzRTE5MzAxQzFCQTY1Q0VGNkI0MDgwRTg2Njk2RjcyOUM4NzZDQ0RDNDAzQjdFRDA3MEIxQkQxMUNEMTE0QjZGRDA1RkE3RkM3MzIzREM1RUIwM0FFRjEwQ0Q3NEQ5REYzNTQ4RThFNzg5NURGNDE4QzEwRTk3QkE2RDA4QTI4RUYwNUJGQTkwODZGMzVCMEExMzFGOTFCNkI5MDVDMDFFMkNGQkI2OTE3Njk0REYzOTk2RTQ0MTczOTExMjdCQjAzMkVCMjQ5MDU4OUI1QUNGRTQ2RDY4OUM4NENBRDQ3QTBDNEZENDdDREFGNzE3NEIyODRBRjA1NTE4QTkzMEU2MEU5NURGN0IwN0Y0MDU0NUVDNURGNzAwNTg3QTQyNDkzQTNCRENEQjIzQUM4MzRBNzYyMTIyQzkxQjFFOUVCMzAzRUEzNzJENkZDQTIwQTRCQTMzNTE0QjI0NUQxMDk4MDVBMDA1NzVFNjBBQUE1MjY5RjZFRDlCMzJENTc5NEQ0NTEyN0Q1MjczRjRDQ0U3NDY5NzI0RUQ4REJBRDIwOEI1MDFGMzlBMjk0MUM0RjQ4NzM1NkM2MTMxRDNDNEVGMDJEQTYxNkYwQkYzOUQxMTRDOTIwNTRDOThGQzVBRTVBRkVFMTQ2QkJEMTQ2NkU5MEJGODEzNTJENkIyOEY0MEU0NDExQTdBQTIyRDQ5RDgyNEEwOTcyRTNGMjAyRURERTdBRUFCMzRENzI3MUNFRDc1MjlFMTIzQTgxMENFRDQ4MEVBQTA3N0NENDVBRTZGNEJCRUU0NzdDQzc4QzVEOEI1NEVEMjUzMUU2MEM5NTE2RENCODRBQkQyMTAyNzdEMkU2QTFDQjJGNzA5MTQ0NDdFRDdCRTU0QjcwODFDQjNBMEI5RkQ1MEJERTIzOTZEQUNFRjE5NkFCMDNEMEZCNkE3M0MwQzEwNjYzMEU4MkU1RjU4QkUyRjFBOTQyMzZBM0IzQkMxRjI3MDRDRjRCNTlEMDhEMUM0Q0RFQTlBM0Y0QzlBNDg1NjM0OUE3QUE4MTQ2RjI1QTFBQTMzNUM2MEY3OTgwMDdGQ0NBM0M1M0RDQzg4MDkwQjI4QkFFQUFBOUUyMzI2MjVBM0RFRTQ0RTRERTdFMEIyNjJCMDJDQUQ0QzdDMDNDRDg2NkY3OEE2MDc5ODAzN0VBOTQ2M0NERUZCNThGODU1NDdBRjlEOUQzOEQ3QjVFMjY1RjlCMTExQkRDNTc5RTM1MjY5OUI3NjYxMzVDQzE0OEUwNTRBOEYxRDIyOTc0NDE0Qjg2QjMxREY1OEQ1NUFFRjE3ODBGRjkxMTE1NEVENUI2Q0EwRTE2QjI3NjRENEUwMEMzQTI0ODkzODE5NTM2NDlFQkNFQzc4NTQxREM2MjY2M0UxQjM4RUIzQjZDRjc5MUI2MzkzMTM3RDkxRjRDNUZFNjYyNURGQjk2MzBDMjE5OEQ3ODQ3N0MyQTdDMDdDNUREODMyMEJDOEVCN0MxRkRENEMyRDY1QkYzRjMwNTlGRjkxOTRFQTg3ODkyQzMxMUVBMUIxQ0Y5MzQ1REYxNDREODJFRkY0QTNDNjJFREE4RTk3NzUzNUI4NEE4MzAwMkIKKzIwMTExMDA2MTk0MTE4IDIgNiAxMDAgODE5MSAyIERDMUQ4NUE0MkRFNEM4MEMxNDU1QzMzOTM4QUM0NkY1MDhGREJFMTk3REY4RkU4QkRGNTlFMUM4QTIzMUIxNjI0REVEQjY2NDZEMURDNDI2MTgyNkYxMTQ3M0VGMzMzOUU2QjVCMDMwMzEwNjgxNTQ3N0U5MUMxMzZFOUIzRUJDNjgzOTdFRDcxQkY1NDg5MkRFODZFNUY3MkQyM0VBQ0NCNUMzRDE2NTY1NDUzRjU4RDNEQ0ZBMjhBODEyRDExQTU0MEQxQjM4QzI5REE2NTMxQ0M0M0YwOEY2NTVFMDY3QTE2MjQ4MzkxRjdBRThDNTA2RTAyQUYxNTc1NERBQjcyOEMyNTBDMTNFQUQwMUNGRUJGQUZGNzQ4MEQ3QkY0QUNDMDc5MjQ0MzQ2Qjc4MURFNTFGODY0QzgzMDY0NzE2NTUzMjE1NUE4NURBOUEzQUFFNDhFQTlFRjUyODcyMDhGMjQ5RTRDNTRFRUY0NjUyMkYyNzYyRUI0NENBQzhENTg5MjlEQjY1OEFCNEJEOUM2OUVFREFGRjYzQ0Q3ODA4RDU5REY5MDE4Nzc5MjQwOTU5QTQzRkMyRkM0MEQ1NUMyRTEyQzYwQ0ZDQTU1REQ0NTAyQkM3RTNGNzk5REJEQjE5OUNDNURDM0IzOTgyNUE0NDNGMzNBMENGREJFMTU3MjUxOTc4QTk4NkNFOTIwODM2OTM2MEMyNkU5OTYzMUU3NDA4MDVBNzNFMjRCMEI5NUNGQjNGNzc5NEUxRDg3NEMwMzFGRUFDMUQ1OTkzRkQyNjAxNDhCQTlDRkMyNDY0MEE0QUQzNEE1QUI4OTgzOEIyNEQ3MjA1RTFDNTk1NjE4RUQ0OTdCQUNCQjRCMzI3ODQ1NEYwNDUyNUFGRjNGRDlGQzgzODg1MUY1MEI4MTlBRjgwQ0RGOTIyMjU1Rjg2RjQ4MEY5RDNGMzdBRDExOTY0NDZGMzc4MDFFOUI5ODUwNzIyOEM2NDlENUZGOTA4MjkyQ0ZFNUQwMzkyQTRFOThCQjc3MDEyQzlEMTNEMkNCNkI5NDEyMjUyNkM0QkE4OTNBOTRGMEQ2MEFEQkU0RURBNzExN0FCNjVDREU4QjNBMEVEM0UxOTMwMUMxQkE2NUNFRjZCNDA4MEU4NjY5NkY3MjlDODc2Q0NEQzQwM0I3RUQwNzBCMUJEMTFDRDExNEI2RkQwNUZBN0ZDNzMyM0RDNUVCMDNBRUYxMENENzREOURGMzU0OEU4RTc4OTVERjQxOEMxMEU5N0JBNkQwOEEyOEVGMDVCRkE5MDg2RjM1QjBBMTMxRjkxQjZCOTA1QzAxRTJDRkJCNjkxNzY5NERGMzk5NkU0NDE3MzkxMTI3QkIwMzJFQjI0OTA1ODlCNUFDRkU0NkQ2ODlDODRDQUQ0N0EwQzRGRDQ3Q0RBRjcxNzRCMjg0QUYwNTUxOEE5MzBFNjBFOTVERjdCMDdGNDA1NDVFQzVERjcwMDU4N0E0MjQ5M0EzQkRDREIyM0FDODM0QTc2MjEyMkM5MUIxRTlFQjMwM0VBMzcyRDZGQ0EyMEE0QkEzMzUxNEIyNDVEMTA5ODA1QTAwNTc1RTYwQUFBNTI2OUY2RUQ5QjMyRDU3OTRENDUxMjdENTI3M0Y0Q0NFNzQ2OTcyNEVEOERCQUQyMDhCNTAxRjM5QTI5NDFDNEY0ODczNTZDNjEzMUQzQzRFRjAyREE2MTZGMEJGMzlEMTE0QzkyMDU0Qzk4RkM1QUU1QUZFRTE0NkJCRDE0NjZFOTBCRjgxMzUyRDZCMjhGNDBFNDQxMUE3QUEyMkQ0OUQ4MjRBMDk3MkUzRjIwMkVEREU3QUVBQjM0RDcyNzFDRUQ3NTI5RTEyM0E4MTBDRUQ0ODBFQUEwNzdDRDQ1QUU2RjRCQkVFNDc3Q0M3OEM1RDhCNTRFRDI1MzFFNjBDOTUxNkRDQjg0QUJEMjEwMjc3RDJFNkExQ0IyRjcwOTE0NDQ3RUQ3QkU1NEI3MDgxQ0IzQTBCOUZENTBCREUyMzk2REFDRUYxOTZBQjAzRDBGQjZBNzNDMEMxMDY2MzBFODJFNUY1OEJFMkYxQTk0MjM2QTNCM0JDMUYyNzA0Q0Y0QjU5RDA4RDFDNENERUE5QTNGNEM5QTQ4NTYzNDlBN0FBODE0NkYyNUExQUEzMzVDNjBGNzk4MDA3RkNDQTNDNTNEQ0M4ODA5MEIyOEJBRUFBQTlFMjMyNjI1QTNERUU0NEU0REU3RTBCMjYyQjAyQ0FENEM3QzAzQ0Q4NjZGNzhBNjA3OTgwMzdFQTk0NjNDREVGQjU4Rjg1NTQ3QUY5RDlEMzhEN0I1RTI2NUY5QjExMUJEQzU3OUUzNTI2OTlCNzY2MTM1Q0MxNDhFMDU0QThGMUQyMjk3NDQxNEI4NkIzMURGNThENTVBRUYxNzgwRkY5MTExNTRFRDVCNkNBMEUxNkIyNzY0RDRFMDBDM0EyNDg5MzgxOTUzNjQ5RUJDRUM3ODU0MURDNjI2NjNFMUIzOEVCM0I2Q0Y3OTFCNjM5MzEzN0Q5MUY0QzVGRTY2MjVERkI5NjMwQzIxOThENzg0NzdDMkE3QzA3QzVERDgzMjBCQzhFQjdDMUZERDRDMkQ2NUJGM0YzMDU5RkY5MTk0RUE4Nzg5MkMzMTFFQTFCMUNGOTM0NURGMTQ0RDgyRUZGNEEzQzYyRURBOEU5Nzc1MzVCODREMEFDOEMzCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL21vZHVsaS4wIGIvb3BlbnNzaC02LjBwMS9tb2R1bGkuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTI5NDg4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9tb2R1bGkuMApAQCAtMCwwICsxLDcyIEBACitNT0RVTEkoNSkgICAgICAgICAgICAgICAgIE9wZW5CU0QgUHJvZ3JhbW1lcidzIE1hbnVhbCAgICAgICAgICAgICAgICBNT0RVTEkoNSkKKworTkFNRQorICAgICBtb2R1bGkgLSBEaWZmaWUtSGVsbG1hbiBtb2R1bGkKKworREVTQ1JJUFRJT04KKyAgICAgVGhlIC9ldGMvbW9kdWxpIGZpbGUgY29udGFpbnMgcHJpbWUgbnVtYmVycyBhbmQgZ2VuZXJhdG9ycyBmb3IgdXNlIGJ5CisgICAgIHNzaGQoOCkgaW4gdGhlIERpZmZpZS1IZWxsbWFuIEdyb3VwIEV4Y2hhbmdlIGtleSBleGNoYW5nZSBtZXRob2QuCisKKyAgICAgTmV3IG1vZHVsaSBtYXkgYmUgZ2VuZXJhdGVkIHdpdGggc3NoLWtleWdlbigxKSB1c2luZyBhIHR3by1zdGVwIHByb2Nlc3MuCisgICAgIEFuIGluaXRpYWwgY2FuZGlkYXRlIGdlbmVyYXRpb24gcGFzcywgdXNpbmcgc3NoLWtleWdlbiAtRywgY2FsY3VsYXRlcworICAgICBudW1iZXJzIHRoYXQgYXJlIGxpa2VseSB0byBiZSB1c2VmdWwuICBBIHNlY29uZCBwcmltYWxpdHkgdGVzdGluZyBwYXNzLAorICAgICB1c2luZyBzc2gta2V5Z2VuIC1ULCBwcm92aWRlcyBhIGhpZ2ggZGVncmVlIG9mIGFzc3VyYW5jZSB0aGF0IHRoZSBudW1iZXJzCisgICAgIGFyZSBwcmltZSBhbmQgYXJlIHNhZmUgZm9yIHVzZSBpbiBEaWZmaWUtSGVsbG1hbiBvcGVyYXRpb25zIGJ5IHNzaGQoOCkuCisgICAgIFRoaXMgbW9kdWxpIGZvcm1hdCBpcyB1c2VkIGFzIHRoZSBvdXRwdXQgZnJvbSBlYWNoIHBhc3MuCisKKyAgICAgVGhlIGZpbGUgY29uc2lzdHMgb2YgbmV3bGluZS1zZXBhcmF0ZWQgcmVjb3Jkcywgb25lIHBlciBtb2R1bHVzLAorICAgICBjb250YWluaW5nIHNldmVuIHNwYWNlLXNlcGFyYXRlZCBmaWVsZHMuICBUaGVzZSBmaWVsZHMgYXJlIGFzIGZvbGxvd3M6CisKKyAgICAgICAgICAgdGltZXN0YW1wICAgIFRoZSB0aW1lIHRoYXQgdGhlIG1vZHVsdXMgd2FzIGxhc3QgcHJvY2Vzc2VkIGFzCisgICAgICAgICAgICAgICAgICAgICAgICBZWVlZTU1EREhITU1TUy4KKworICAgICAgICAgICB0eXBlICAgICAgICAgRGVjaW1hbCBudW1iZXIgc3BlY2lmeWluZyB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJpbWUgbW9kdWx1cy4gIFN1cHBvcnRlZCB0eXBlcyBhcmU6CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgIFVua25vd24sIG5vdCB0ZXN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAiU2FmZSIgcHJpbWU7IChwLTEpLzIgaXMgYWxzbyBwcmltZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgIFNvcGhpZSBHZXJtYWluOyAocCsxKSoyIGlzIGFsc28gcHJpbWUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsaSBjYW5kaWRhdGVzIGluaXRpYWxseSBwcm9kdWNlZCBieSBzc2gta2V5Z2VuKDEpCisgICAgICAgICAgICAgICAgICAgICAgICBhcmUgU29waGllIEdlcm1haW4gcHJpbWVzICh0eXBlIDQpLiAgRnVydGhlciBwcmltYWxpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmcgd2l0aCBzc2gta2V5Z2VuKDEpIHByb2R1Y2VzIHNhZmUgcHJpbWUgbW9kdWxpCisgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSAyKSB0aGF0IGFyZSByZWFkeSBmb3IgdXNlIGluIHNzaGQoOCkuICBPdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXMgYXJlIG5vdCB1c2VkIGJ5IE9wZW5TU0guCisKKyAgICAgICAgICAgdGVzdHMgICAgICAgIERlY2ltYWwgbnVtYmVyIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgcHJpbWFsaXR5IHRlc3RzCisgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZSBudW1iZXIgaGFzIGJlZW4gc3ViamVjdGVkIHRvIHJlcHJlc2VudGVkIGFzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hc2sgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgIE5vdCB0ZXN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAweDAxICBDb21wb3NpdGUgbnVtYmVyIC0gbm90IHByaW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgMHgwMiAgU2lldmUgb2YgRXJhdG9zdGhlbmVzLgorICAgICAgICAgICAgICAgICAgICAgICAgMHgwNCAgUHJvYmFiaWxpc3RpYyBNaWxsZXItUmFiaW4gcHJpbWFsaXR5IHRlc3RzLgorCisgICAgICAgICAgICAgICAgICAgICAgICBUaGUgc3NoLWtleWdlbigxKSBtb2R1bGkgY2FuZGlkYXRlIGdlbmVyYXRpb24gdXNlcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIFNpZXZlIG9mIEVyYXRvc3RoZW5lcyAoZmxhZyAweDAyKS4gIFN1YnNlcXVlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzaC1rZXlnZW4oMSkgcHJpbWFsaXR5IHRlc3RzIGFyZSBNaWxsZXItUmFiaW4gdGVzdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIChmbGFnIDB4MDQpLgorCisgICAgICAgICAgIHRyaWFscyAgICAgICBEZWNpbWFsIG51bWJlciBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgcHJpbWFsaXR5CisgICAgICAgICAgICAgICAgICAgICAgICB0cmlhbHMgdGhhdCBoYXZlIGJlZW4gcGVyZm9ybWVkIG9uIHRoZSBtb2R1bHVzLgorCisgICAgICAgICAgIHNpemUgICAgICAgICBEZWNpbWFsIG51bWJlciBpbmRpY2F0aW5nIHRoZSBzaXplIG9mIHRoZSBwcmltZSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgYml0cy4KKworICAgICAgICAgICBnZW5lcmF0b3IgICAgVGhlIHJlY29tbWVuZGVkIGdlbmVyYXRvciBmb3IgdXNlIHdpdGggdGhpcyBtb2R1bHVzCisgICAgICAgICAgICAgICAgICAgICAgICAoaGV4YWRlY2ltYWwpLgorCisgICAgICAgICAgIG1vZHVsdXMgICAgICBUaGUgbW9kdWx1cyBpdHNlbGYgaW4gaGV4YWRlY2ltYWwuCisKKyAgICAgV2hlbiBwZXJmb3JtaW5nIERpZmZpZS1IZWxsbWFuIEdyb3VwIEV4Y2hhbmdlLCBzc2hkKDgpIGZpcnN0IGVzdGltYXRlcworICAgICB0aGUgc2l6ZSBvZiB0aGUgbW9kdWx1cyByZXF1aXJlZCB0byBwcm9kdWNlIGVub3VnaCBEaWZmaWUtSGVsbG1hbiBvdXRwdXQKKyAgICAgdG8gc3VmZmljaWVudGx5IGtleSB0aGUgc2VsZWN0ZWQgc3ltbWV0cmljIGNpcGhlci4gIHNzaGQoOCkgdGhlbiByYW5kb21seQorICAgICBzZWxlY3RzIGEgbW9kdWx1cyBmcm9tIC9ldGMvbW9kdWxpIHRoYXQgYmVzdCBtZWV0cyB0aGUgc2l6ZSByZXF1aXJlbWVudC4KKworU0VFIEFMU08KKyAgICAgc3NoLWtleWdlbigxKSwgc3NoZCg4KQorCisgICAgIERpZmZpZS1IZWxsbWFuIEdyb3VwIEV4Y2hhbmdlIGZvciB0aGUgU2VjdXJlIFNoZWxsIChTU0gpIFRyYW5zcG9ydCBMYXllcgorICAgICBQcm90b2NvbCwgUkZDIDQ0MTksIDIwMDYuCisKK09wZW5CU0QgNS4wICAgICAgICAgICAgICAgICAgICBPY3RvYmVyIDE0LCAyMDEwICAgICAgICAgICAgICAgICAgICBPcGVuQlNEIDUuMApkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9tb2R1bGkuNSBiL29wZW5zc2gtNi4wcDEvbW9kdWxpLjUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUwMWI5NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvbW9kdWxpLjUKQEAgLTAsMCArMSwxMjIgQEAKKy5cIgkkT3BlbkJTRDogbW9kdWxpLjUsdiAxLjE1IDIwMTAvMTAvMTQgMjA6NDE6Mjggam1jIEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDIwMDggRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPgorLlwiCisuXCIgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisuXCIgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorLlwiIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisuXCIKKy5cIiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKy5cIiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKy5cIiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisuXCIgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisuXCIgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKy5cIiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorLkRkICRNZG9jZGF0ZTogT2N0b2JlciAxNCAyMDEwICQKKy5EdCBNT0RVTEkgNQorLk9zCisuU2ggTkFNRQorLk5tIG1vZHVsaQorLk5kIERpZmZpZS1IZWxsbWFuIG1vZHVsaQorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5QYSAvZXRjL21vZHVsaQorZmlsZSBjb250YWlucyBwcmltZSBudW1iZXJzIGFuZCBnZW5lcmF0b3JzIGZvciB1c2UgYnkKKy5YciBzc2hkIDgKK2luIHRoZSBEaWZmaWUtSGVsbG1hbiBHcm91cCBFeGNoYW5nZSBrZXkgZXhjaGFuZ2UgbWV0aG9kLgorLlBwCitOZXcgbW9kdWxpIG1heSBiZSBnZW5lcmF0ZWQgd2l0aAorLlhyIHNzaC1rZXlnZW4gMQordXNpbmcgYSB0d28tc3RlcCBwcm9jZXNzLgorQW4gaW5pdGlhbAorLkVtIGNhbmRpZGF0ZSBnZW5lcmF0aW9uCitwYXNzLCB1c2luZworLkljIHNzaC1rZXlnZW4gLUcgLAorY2FsY3VsYXRlcyBudW1iZXJzIHRoYXQgYXJlIGxpa2VseSB0byBiZSB1c2VmdWwuCitBIHNlY29uZAorLkVtIHByaW1hbGl0eSB0ZXN0aW5nCitwYXNzLCB1c2luZworLkljIHNzaC1rZXlnZW4gLVQgLAorcHJvdmlkZXMgYSBoaWdoIGRlZ3JlZSBvZiBhc3N1cmFuY2UgdGhhdCB0aGUgbnVtYmVycyBhcmUgcHJpbWUgYW5kIGFyZQorc2FmZSBmb3IgdXNlIGluIERpZmZpZS1IZWxsbWFuIG9wZXJhdGlvbnMgYnkKKy5YciBzc2hkIDggLgorVGhpcworLk5tCitmb3JtYXQgaXMgdXNlZCBhcyB0aGUgb3V0cHV0IGZyb20gZWFjaCBwYXNzLgorLlBwCitUaGUgZmlsZSBjb25zaXN0cyBvZiBuZXdsaW5lLXNlcGFyYXRlZCByZWNvcmRzLCBvbmUgcGVyIG1vZHVsdXMsCitjb250YWluaW5nIHNldmVuIHNwYWNlLXNlcGFyYXRlZCBmaWVsZHMuCitUaGVzZSBmaWVsZHMgYXJlIGFzIGZvbGxvd3M6CisuQmwgLXRhZyAtd2lkdGggRGVzY3JpcHRpb24gLW9mZnNldCBpbmRlbnQKKy5JdCB0aW1lc3RhbXAKK1RoZSB0aW1lIHRoYXQgdGhlIG1vZHVsdXMgd2FzIGxhc3QgcHJvY2Vzc2VkIGFzIFlZWVlNTURESEhNTVNTLgorLkl0IHR5cGUKK0RlY2ltYWwgbnVtYmVyIHNwZWNpZnlpbmcgdGhlIGludGVybmFsIHN0cnVjdHVyZSBvZiB0aGUgcHJpbWUgbW9kdWx1cy4KK1N1cHBvcnRlZCB0eXBlcyBhcmU6CisuUHAKKy5CbCAtdGFnIC13aWR0aCAweDAwIC1jb21wYWN0CisuSXQgMAorVW5rbm93biwgbm90IHRlc3RlZC4KKy5JdCAyCisiU2FmZSIgcHJpbWU7IChwLTEpLzIgaXMgYWxzbyBwcmltZS4KKy5JdCA0CitTb3BoaWUgR2VybWFpbjsgKHArMSkqMiBpcyBhbHNvIHByaW1lLgorLkVsCisuUHAKK01vZHVsaSBjYW5kaWRhdGVzIGluaXRpYWxseSBwcm9kdWNlZCBieQorLlhyIHNzaC1rZXlnZW4gMQorYXJlIFNvcGhpZSBHZXJtYWluIHByaW1lcyAodHlwZSA0KS4KK0Z1cnRoZXIgcHJpbWFsaXR5IHRlc3Rpbmcgd2l0aAorLlhyIHNzaC1rZXlnZW4gMQorcHJvZHVjZXMgc2FmZSBwcmltZSBtb2R1bGkgKHR5cGUgMikgdGhhdCBhcmUgcmVhZHkgZm9yIHVzZSBpbgorLlhyIHNzaGQgOCAuCitPdGhlciB0eXBlcyBhcmUgbm90IHVzZWQgYnkgT3BlblNTSC4KKy5JdCB0ZXN0cworRGVjaW1hbCBudW1iZXIgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBwcmltYWxpdHkgdGVzdHMgdGhhdCB0aGUgbnVtYmVyCitoYXMgYmVlbiBzdWJqZWN0ZWQgdG8gcmVwcmVzZW50ZWQgYXMgYSBiaXRtYXNrIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorLlBwCisuQmwgLXRhZyAtd2lkdGggMHgwMCAtY29tcGFjdAorLkl0IDB4MDAKK05vdCB0ZXN0ZWQuCisuSXQgMHgwMQorQ29tcG9zaXRlIG51bWJlciBcKGVuIG5vdCBwcmltZS4KKy5JdCAweDAyCitTaWV2ZSBvZiBFcmF0b3N0aGVuZXMuCisuSXQgMHgwNAorUHJvYmFiaWxpc3RpYyBNaWxsZXItUmFiaW4gcHJpbWFsaXR5IHRlc3RzLgorLkVsCisuUHAKK1RoZQorLlhyIHNzaC1rZXlnZW4gMQorbW9kdWxpIGNhbmRpZGF0ZSBnZW5lcmF0aW9uIHVzZXMgdGhlIFNpZXZlIG9mIEVyYXRvc3RoZW5lcyAoZmxhZyAweDAyKS4KK1N1YnNlcXVlbnQKKy5YciBzc2gta2V5Z2VuIDEKK3ByaW1hbGl0eSB0ZXN0cyBhcmUgTWlsbGVyLVJhYmluIHRlc3RzIChmbGFnIDB4MDQpLgorLkl0IHRyaWFscworRGVjaW1hbCBudW1iZXIgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIHByaW1hbGl0eSB0cmlhbHMKK3RoYXQgaGF2ZSBiZWVuIHBlcmZvcm1lZCBvbiB0aGUgbW9kdWx1cy4KKy5JdCBzaXplCitEZWNpbWFsIG51bWJlciBpbmRpY2F0aW5nIHRoZSBzaXplIG9mIHRoZSBwcmltZSBpbiBiaXRzLgorLkl0IGdlbmVyYXRvcgorVGhlIHJlY29tbWVuZGVkIGdlbmVyYXRvciBmb3IgdXNlIHdpdGggdGhpcyBtb2R1bHVzIChoZXhhZGVjaW1hbCkuCisuSXQgbW9kdWx1cworVGhlIG1vZHVsdXMgaXRzZWxmIGluIGhleGFkZWNpbWFsLgorLkVsCisuUHAKK1doZW4gcGVyZm9ybWluZyBEaWZmaWUtSGVsbG1hbiBHcm91cCBFeGNoYW5nZSwKKy5YciBzc2hkIDgKK2ZpcnN0IGVzdGltYXRlcyB0aGUgc2l6ZSBvZiB0aGUgbW9kdWx1cyByZXF1aXJlZCB0byBwcm9kdWNlIGVub3VnaAorRGlmZmllLUhlbGxtYW4gb3V0cHV0IHRvIHN1ZmZpY2llbnRseSBrZXkgdGhlIHNlbGVjdGVkIHN5bW1ldHJpYyBjaXBoZXIuCisuWHIgc3NoZCA4Cit0aGVuIHJhbmRvbWx5IHNlbGVjdHMgYSBtb2R1bHVzIGZyb20KKy5GYSAvZXRjL21vZHVsaQordGhhdCBiZXN0IG1lZXRzIHRoZSBzaXplIHJlcXVpcmVtZW50LgorLlNoIFNFRSBBTFNPCisuWHIgc3NoLWtleWdlbiAxICwKKy5YciBzc2hkIDgKKy5ScworLiVSIFJGQyA0NDE5CisuJVQgIkRpZmZpZS1IZWxsbWFuIEdyb3VwIEV4Y2hhbmdlIGZvciB0aGUgU2VjdXJlIFNoZWxsIChTU0gpIFRyYW5zcG9ydCBMYXllciBQcm90b2NvbCIKKy4lRCAyMDA2CisuUmUKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvbW9kdWxpLmMgYi9vcGVuc3NoLTYuMHAxL21vZHVsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3M2VlNjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL21vZHVsaS5jCkBAIC0wLDAgKzEsNzE3IEBACisvKiAkT3BlbkJTRDogbW9kdWxpLmMsdiAxLjI1IDIwMTEvMTAvMTkgMDA6MDY6MTAgZGptIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IDE5OTQgUGhpbCBLYXJuIDxrYXJuQHF1YWxjb21tLmNvbT4KKyAqIENvcHlyaWdodCAxOTk2LTE5OTgsIDIwMDMgV2lsbGlhbSBBbGxlbiBTaW1wc29uIDx3c2ltcHNvbkBncmVlbmRyYWdvbi5jb20+CisgKiBDb3B5cmlnaHQgMjAwMCBOaWVscyBQcm92b3MgPHByb3Zvc0BjaXRpLnVtaWNoLmVkdT4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBUd28tc3RlcCBwcm9jZXNzIHRvIGdlbmVyYXRlIHNhZmUgcHJpbWVzIGZvciBESEdFWAorICoKKyAqICBTaWV2ZSBjYW5kaWRhdGVzIGZvciAic2FmZSIgcHJpbWVzLAorICogIHN1aXRhYmxlIGZvciB1c2UgYXMgRGlmZmllLUhlbGxtYW4gbW9kdWxpOworICogIHRoYXQgaXMsIHdoZXJlIHEgPSAocC0xKS8yIGlzIGFsc28gcHJpbWUuCisgKgorICogRmlyc3Qgc3RlcDogZ2VuZXJhdGUgY2FuZGlkYXRlIHByaW1lcyAobWVtb3J5IGludGVuc2l2ZSkKKyAqIFNlY29uZCBzdGVwOiB0ZXN0IHByaW1lcycgc2FmZXR5IChwcm9jZXNzb3IgaW50ZW5zaXZlKQorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJkaC5oIgorI2luY2x1ZGUgImxvZy5oIgorCisjaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQuaCIKKworLyoKKyAqIEZpbGUgb3V0cHV0IGRlZmluZXMKKyAqLworCisvKiBuZWVkIGxpbmUgbG9uZyBlbm91Z2ggZm9yIGxhcmdlc3QgbW9kdWxpIHBsdXMgaGVhZGVycyAqLworI2RlZmluZSBRTElORVNJWkUJCSgxMDArODE5MikKKworLyoKKyAqIFNpemU6IGRlY2ltYWwuCisgKiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgKDAgdG8gTSkuCisgKiBXQVJOSU5HOiBpbnRlcm5hbGx5LCB1c3VhbGx5IDEgdG8gTi4KKyAqLworI2RlZmluZSBRU0laRV9NSU5JTVVNCQkoNTExKQorCisvKgorICogUHJpbWUgc2lldmluZyBkZWZpbmVzCisgKi8KKworLyogQ29uc3RhbnQ6IGFzc3VtaW5nIDggYml0IGJ5dGVzIGFuZCAzMiBiaXQgd29yZHMgKi8KKyNkZWZpbmUgU0hJRlRfQklUCSgzKQorI2RlZmluZSBTSElGVF9CWVRFCSgyKQorI2RlZmluZSBTSElGVF9XT1JECShTSElGVF9CSVQrU0hJRlRfQllURSkKKyNkZWZpbmUgU0hJRlRfTUVHQUJZVEUJKDIwKQorI2RlZmluZSBTSElGVF9NRUdBV09SRAkoU0hJRlRfTUVHQUJZVEUtU0hJRlRfQllURSkKKworLyoKKyAqIFVzaW5nIHZpcnR1YWwgbWVtb3J5IGNhbiBjYXVzZSB0aHJhc2hpbmcuICBUaGlzIHNob3VsZCBiZSB0aGUgbGFyZ2VzdAorICogbnVtYmVyIHRoYXQgaXMgc3VwcG9ydGVkIHdpdGhvdXQgYSBsYXJnZSBhbW91bnQgb2YgZGlzayBhY3Rpdml0eSAtLQorICogdGhhdCB3b3VsZCBpbmNyZWFzZSB0aGUgcnVuIHRpbWUgZnJvbSBob3VycyB0byBkYXlzIG9yIHdlZWtzIQorICovCisjZGVmaW5lIExBUkdFX01JTklNVU0JKDhVTCkJLyogbWVnYWJ5dGVzICovCisKKy8qCisgKiBEbyBub3QgaW5jcmVhc2UgdGhpcyBudW1iZXIgYmV5b25kIHRoZSB1bnNpZ25lZCBpbnRlZ2VyIGJpdCBzaXplLgorICogRHVlIHRvIGEgbXVsdGlwbGUgb2YgNCwgaXQgbXVzdCBiZSBMRVNTIHRoYW4gMTI4ICh5aWVsZGluZyAyKiozMCBiaXRzKS4KKyAqLworI2RlZmluZSBMQVJHRV9NQVhJTVVNCSgxMjdVTCkJLyogbWVnYWJ5dGVzICovCisKKy8qCisgKiBDb25zdGFudDogd2hlbiB1c2VkIHdpdGggMzItYml0IGludGVnZXJzLCB0aGUgbGFyZ2VzdCBzaWV2ZSBwcmltZQorICogaGFzIHRvIGJlIGxlc3MgdGhhbiAyKiozMi4KKyAqLworI2RlZmluZSBTTUFMTF9NQVhJTVVNCSgweGZmZmZmZmZmVUwpCisKKy8qIENvbnN0YW50OiBjYW4gc2lldmUgYWxsIHByaW1lcyBsZXNzIHRoYW4gMioqMzIsIGFzIDY1NTM3KioyID4gMioqMzItMS4gKi8KKyNkZWZpbmUgVElOWV9OVU1CRVIJKDFVTDw8MTYpCisKKy8qIEVuc3VyZSBlbm91Z2ggYml0IHNwYWNlIGZvciB0ZXN0aW5nIDIqcS4gKi8KKyNkZWZpbmUgVEVTVF9NQVhJTVVNCSgxVUw8PDE2KQorI2RlZmluZSBURVNUX01JTklNVU0JKFFTSVpFX01JTklNVU0gKyAxKQorLyogcmVhbCBURVNUX01JTklNVU0JKDFVTCA8PCAoU0hJRlRfV09SRCAtIFRFU1RfUE9XRVIpKSAqLworI2RlZmluZSBURVNUX1BPV0VSCSgzKQkvKiAyKipuLCBuIDwgU0hJRlRfV09SRCAqLworCisvKiBiaXQgb3BlcmF0aW9ucyBvbiAzMi1iaXQgd29yZHMgKi8KKyNkZWZpbmUgQklUX0NMRUFSKGEsbikJKChhKVsobik+PlNISUZUX1dPUkRdICY9IH4oMUwgPDwgKChuKSAmIDMxKSkpCisjZGVmaW5lIEJJVF9TRVQoYSxuKQkoKGEpWyhuKT4+U0hJRlRfV09SRF0gfD0gKDFMIDw8ICgobikgJiAzMSkpKQorI2RlZmluZSBCSVRfVEVTVChhLG4pCSgoYSlbKG4pPj5TSElGVF9XT1JEXSAmICgxTCA8PCAoKG4pICYgMzEpKSkKKworLyoKKyAqIFByaW1lIHRlc3RpbmcgZGVmaW5lcworICovCisKKy8qIE1pbmltdW0gbnVtYmVyIG9mIHByaW1hbGl0eSB0ZXN0cyB0byBwZXJmb3JtICovCisjZGVmaW5lIFRSSUFMX01JTklNVU0JKDQpCisKKy8qCisgKiBTaWV2aW5nIGRhdGEgKFhYWCAtIG1vdmUgdG8gc3RydWN0KQorICovCisKKy8qIHNpZXZlIDIqKjE2ICovCitzdGF0aWMgdV9pbnQzMl90ICpUaW55U2lldmUsIHRpbnliaXRzOworCisvKiBzaWV2ZSAyKiozMCBpbiAyKioxNiBwYXJ0cyAqLworc3RhdGljIHVfaW50MzJfdCAqU21hbGxTaWV2ZSwgc21hbGxiaXRzLCBzbWFsbGJhc2U7CisKKy8qIHNpZXZlIHJlbGF0aXZlIHRvIHRoZSBpbml0aWFsIHZhbHVlICovCitzdGF0aWMgdV9pbnQzMl90ICpMYXJnZVNpZXZlLCBsYXJnZXdvcmRzLCBsYXJnZXRyaWVzLCBsYXJnZW51bWJlcnM7CitzdGF0aWMgdV9pbnQzMl90IGxhcmdlYml0cywgbGFyZ2VtZW1vcnk7CS8qIG1lZ2FieXRlcyAqLworc3RhdGljIEJJR05VTSAqbGFyZ2ViYXNlOworCitpbnQgZ2VuX2NhbmRpZGF0ZXMoRklMRSAqLCB1X2ludDMyX3QsIHVfaW50MzJfdCwgQklHTlVNICopOworaW50IHByaW1lX3Rlc3QoRklMRSAqLCBGSUxFICosIHVfaW50MzJfdCwgdV9pbnQzMl90LCBjaGFyICopOworCisvKgorICogcHJpbnQgbW9kdWxpIG91dCBpbiBjb25zaXN0ZW50IGZvcm0sCisgKi8KK3N0YXRpYyBpbnQKK3FmaWxlb3V0KEZJTEUgKiBvZmlsZSwgdV9pbnQzMl90IG90eXBlLCB1X2ludDMyX3Qgb3Rlc3RzLCB1X2ludDMyX3Qgb3RyaWVzLAorICAgIHVfaW50MzJfdCBvc2l6ZSwgdV9pbnQzMl90IG9nZW5lcmF0b3IsIEJJR05VTSAqIG9tb2R1bHVzKQoreworCXN0cnVjdCB0bSAqZ3RtOworCXRpbWVfdCB0aW1lX25vdzsKKwlpbnQgcmVzOworCisJdGltZSgmdGltZV9ub3cpOworCWd0bSA9IGdtdGltZSgmdGltZV9ub3cpOworCisJcmVzID0gZnByaW50ZihvZmlsZSwgIiUwNGQlMDJkJTAyZCUwMmQlMDJkJTAyZCAldSAldSAldSAldSAleCAiLAorCSAgICBndG0tPnRtX3llYXIgKyAxOTAwLCBndG0tPnRtX21vbiArIDEsIGd0bS0+dG1fbWRheSwKKwkgICAgZ3RtLT50bV9ob3VyLCBndG0tPnRtX21pbiwgZ3RtLT50bV9zZWMsCisJICAgIG90eXBlLCBvdGVzdHMsIG90cmllcywgb3NpemUsIG9nZW5lcmF0b3IpOworCisJaWYgKHJlcyA8IDApCisJCXJldHVybiAoLTEpOworCisJaWYgKEJOX3ByaW50X2ZwKG9maWxlLCBvbW9kdWx1cykgPCAxKQorCQlyZXR1cm4gKC0xKTsKKworCXJlcyA9IGZwcmludGYob2ZpbGUsICJcbiIpOworCWZmbHVzaChvZmlsZSk7CisKKwlyZXR1cm4gKHJlcyA+IDAgPyAwIDogLTEpOworfQorCisKKy8qCisgKiogU2lldmUgcCdzIGFuZCBxJ3Mgd2l0aCBzbWFsbCBmYWN0b3JzCisgKi8KK3N0YXRpYyB2b2lkCitzaWV2ZV9sYXJnZSh1X2ludDMyX3QgcykKK3sKKwl1X2ludDMyX3QgciwgdTsKKworCWRlYnVnMygic2lldmVfbGFyZ2UgJXUiLCBzKTsKKwlsYXJnZXRyaWVzKys7CisJLyogciA9IGxhcmdlYmFzZSBtb2QgcyAqLworCXIgPSBCTl9tb2Rfd29yZChsYXJnZWJhc2UsIHMpOworCWlmIChyID09IDApCisJCXUgPSAwOyAvKiBzIGRpdmlkZXMgaW50byBsYXJnZWJhc2UgZXhhY3RseSAqLworCWVsc2UKKwkJdSA9IHMgLSByOyAvKiBsYXJnZWJhc2UrdSBpcyBmaXJzdCBlbnRyeSBkaXZpc2libGUgYnkgcyAqLworCisJaWYgKHUgPCBsYXJnZWJpdHMgKiAyKSB7CisJCS8qCisJCSAqIFRoZSBzaWV2ZSBvbWl0cyBwJ3MgYW5kIHEncyBkaXZpc2libGUgYnkgMiwgc28gZW5zdXJlIHRoYXQKKwkJICogbGFyZ2ViYXNlK3UgaXMgb2RkLiBUaGVuLCBzdGVwIHRocm91Z2ggdGhlIHNpZXZlIGluCisJCSAqIGluY3JlbWVudHMgb2YgMipzCisJCSAqLworCQlpZiAodSAmIDB4MSkKKwkJCXUgKz0gczsgLyogTWFrZSBsYXJnZWJhc2UrdSBvZGQsIGFuZCB1IGV2ZW4gKi8KKworCQkvKiBNYXJrIGFsbCBtdWx0aXBsZXMgb2YgMipzICovCisJCWZvciAodSAvPSAyOyB1IDwgbGFyZ2ViaXRzOyB1ICs9IHMpCisJCQlCSVRfU0VUKExhcmdlU2lldmUsIHUpOworCX0KKworCS8qIHIgPSBwIG1vZCBzICovCisJciA9ICgyICogciArIDEpICUgczsKKwlpZiAociA9PSAwKQorCQl1ID0gMDsgLyogcyBkaXZpZGVzIHAgZXhhY3RseSAqLworCWVsc2UKKwkJdSA9IHMgLSByOyAvKiBwK3UgaXMgZmlyc3QgZW50cnkgZGl2aXNpYmxlIGJ5IHMgKi8KKworCWlmICh1IDwgbGFyZ2ViaXRzICogNCkgeworCQkvKgorCQkgKiBUaGUgc2lldmUgb21pdHMgcCdzIGRpdmlzaWJsZSBieSA0LCBzbyBlbnN1cmUgdGhhdAorCQkgKiBsYXJnZWJhc2UrdSBpcyBub3QuIFRoZW4sIHN0ZXAgdGhyb3VnaCB0aGUgc2lldmUgaW4KKwkJICogaW5jcmVtZW50cyBvZiA0KnMKKwkJICovCisJCXdoaWxlICh1ICYgMHgzKSB7CisJCQlpZiAoU01BTExfTUFYSU1VTSAtIHUgPCBzKQorCQkJCXJldHVybjsKKwkJCXUgKz0gczsKKwkJfQorCisJCS8qIE1hcmsgYWxsIG11bHRpcGxlcyBvZiA0KnMgKi8KKwkJZm9yICh1IC89IDQ7IHUgPCBsYXJnZWJpdHM7IHUgKz0gcykKKwkJCUJJVF9TRVQoTGFyZ2VTaWV2ZSwgdSk7CisJfQorfQorCisvKgorICogbGlzdCBjYW5kaWRhdGVzIGZvciBTb3BoaWUtR2VybWFpbiBwcmltZXMgKHdoZXJlIHEgPSAocC0xKS8yKQorICogdG8gc3RhbmRhcmQgb3V0cHV0LgorICogVGhlIGxpc3QgaXMgY2hlY2tlZCBhZ2FpbnN0IHNtYWxsIGtub3duIHByaW1lcyAobGVzcyB0aGFuIDIqKjMwKS4KKyAqLworaW50CitnZW5fY2FuZGlkYXRlcyhGSUxFICpvdXQsIHVfaW50MzJfdCBtZW1vcnksIHVfaW50MzJfdCBwb3dlciwgQklHTlVNICpzdGFydCkKK3sKKwlCSUdOVU0gKnE7CisJdV9pbnQzMl90IGosIHIsIHMsIHQ7CisJdV9pbnQzMl90IHNtYWxsd29yZHMgPSBUSU5ZX05VTUJFUiA+PiA2OworCXVfaW50MzJfdCB0aW55d29yZHMgPSBUSU5ZX05VTUJFUiA+PiA2OworCXRpbWVfdCB0aW1lX3N0YXJ0LCB0aW1lX3N0b3A7CisJdV9pbnQzMl90IGk7CisJaW50IHJldCA9IDA7CisKKwlsYXJnZW1lbW9yeSA9IG1lbW9yeTsKKworCWlmIChtZW1vcnkgIT0gMCAmJgorCSAgICAobWVtb3J5IDwgTEFSR0VfTUlOSU1VTSB8fCBtZW1vcnkgPiBMQVJHRV9NQVhJTVVNKSkgeworCQllcnJvcigiSW52YWxpZCBtZW1vcnkgYW1vdW50IChtaW4gJWxkLCBtYXggJWxkKSIsCisJCSAgICBMQVJHRV9NSU5JTVVNLCBMQVJHRV9NQVhJTVVNKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJLyoKKwkgKiBTZXQgcG93ZXIgdG8gdGhlIGxlbmd0aCBpbiBiaXRzIG9mIHRoZSBwcmltZSB0byBiZSBnZW5lcmF0ZWQuCisJICogVGhpcyBpcyBjaGFuZ2VkIHRvIDEgbGVzcyB0aGFuIHRoZSBkZXNpcmVkIHNhZmUgcHJpbWUgbW9kdWxpIHAuCisJICovCisJaWYgKHBvd2VyID4gVEVTVF9NQVhJTVVNKSB7CisJCWVycm9yKCJUb28gbWFueSBiaXRzOiAldSA+ICVsdSIsIHBvd2VyLCBURVNUX01BWElNVU0pOworCQlyZXR1cm4gKC0xKTsKKwl9IGVsc2UgaWYgKHBvd2VyIDwgVEVTVF9NSU5JTVVNKSB7CisJCWVycm9yKCJUb28gZmV3IGJpdHM6ICV1IDwgJXUiLCBwb3dlciwgVEVTVF9NSU5JTVVNKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCXBvd2VyLS07IC8qIGRlY3JlbWVudCBiZWZvcmUgc3F1YXJpbmcgKi8KKworCS8qCisJICogVGhlIGRlbnNpdHkgb2Ygb3JkaW5hcnkgcHJpbWVzIGlzIG9uIHRoZSBvcmRlciBvZiAxL2JpdHMsIHNvIHRoZQorCSAqIGRlbnNpdHkgb2Ygc2FmZSBwcmltZXMgc2hvdWxkIGJlIGFib3V0ICgxL2JpdHMpKioyLiBTZXQgdGVzdCByYW5nZQorCSAqIHRvIHNvbWV0aGluZyB3ZWxsIGFib3ZlIGJpdHMqKjIgdG8gYmUgcmVhc29uYWJseSBzdXJlIChidXQgbm90CisJICogZ3VhcmFudGVlZCkgb2YgY2F0Y2hpbmcgYXQgbGVhc3Qgb25lIHNhZmUgcHJpbWUuCisJICovCisJbGFyZ2V3b3JkcyA9ICgocG93ZXIgKiBwb3dlcikgPj4gKFNISUZUX1dPUkQgLSBURVNUX1BPV0VSKSk7CisKKwkvKgorCSAqIE5lZWQgaWRlYSBvZiBob3cgbXVjaCBtZW1vcnkgaXMgYXZhaWxhYmxlLiBXZSBkb24ndCBoYXZlIHRvIHVzZSBhbGwKKwkgKiBvZiBpdC4KKwkgKi8KKwlpZiAobGFyZ2VtZW1vcnkgPiBMQVJHRV9NQVhJTVVNKSB7CisJCWxvZ2l0KCJMaW1pdGVkIG1lbW9yeTogJXUgTUI7IGxpbWl0ICVsdSBNQiIsCisJCSAgICBsYXJnZW1lbW9yeSwgTEFSR0VfTUFYSU1VTSk7CisJCWxhcmdlbWVtb3J5ID0gTEFSR0VfTUFYSU1VTTsKKwl9CisKKwlpZiAobGFyZ2V3b3JkcyA8PSAobGFyZ2VtZW1vcnkgPDwgU0hJRlRfTUVHQVdPUkQpKSB7CisJCWxvZ2l0KCJJbmNyZWFzZWQgbWVtb3J5OiAldSBNQjsgbmVlZCAldSBieXRlcyIsCisJCSAgICBsYXJnZW1lbW9yeSwgKGxhcmdld29yZHMgPDwgU0hJRlRfQllURSkpOworCQlsYXJnZXdvcmRzID0gKGxhcmdlbWVtb3J5IDw8IFNISUZUX01FR0FXT1JEKTsKKwl9IGVsc2UgaWYgKGxhcmdlbWVtb3J5ID4gMCkgeworCQlsb2dpdCgiRGVjcmVhc2VkIG1lbW9yeTogJXUgTUI7IHdhbnQgJXUgYnl0ZXMiLAorCQkgICAgbGFyZ2VtZW1vcnksIChsYXJnZXdvcmRzIDw8IFNISUZUX0JZVEUpKTsKKwkJbGFyZ2V3b3JkcyA9IChsYXJnZW1lbW9yeSA8PCBTSElGVF9NRUdBV09SRCk7CisJfQorCisJVGlueVNpZXZlID0geGNhbGxvYyh0aW55d29yZHMsIHNpemVvZih1X2ludDMyX3QpKTsKKwl0aW55Yml0cyA9IHRpbnl3b3JkcyA8PCBTSElGVF9XT1JEOworCisJU21hbGxTaWV2ZSA9IHhjYWxsb2Moc21hbGx3b3Jkcywgc2l6ZW9mKHVfaW50MzJfdCkpOworCXNtYWxsYml0cyA9IHNtYWxsd29yZHMgPDwgU0hJRlRfV09SRDsKKworCS8qCisJICogZHluYW1pY2FsbHkgZGV0ZXJtaW5lIGF2YWlsYWJsZSBtZW1vcnkKKwkgKi8KKwl3aGlsZSAoKExhcmdlU2lldmUgPSBjYWxsb2MobGFyZ2V3b3Jkcywgc2l6ZW9mKHVfaW50MzJfdCkpKSA9PSBOVUxMKQorCQlsYXJnZXdvcmRzIC09ICgxTCA8PCAoU0hJRlRfTUVHQVdPUkQgLSAyKSk7IC8qIDEvNCBNQiBjaHVua3MgKi8KKworCWxhcmdlYml0cyA9IGxhcmdld29yZHMgPDwgU0hJRlRfV09SRDsKKwlsYXJnZW51bWJlcnMgPSBsYXJnZWJpdHMgKiAyOwkvKiBldmVuIG51bWJlcnMgZXhjbHVkZWQgKi8KKworCS8qIHZhbGlkYXRpb24gY2hlY2s6IGNvdW50IHRoZSBudW1iZXIgb2YgcHJpbWVzIHRyaWVkICovCisJbGFyZ2V0cmllcyA9IDA7CisJaWYgKChxID0gQk5fbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCJCTl9uZXcgZmFpbGVkIik7CisKKwkvKgorCSAqIEdlbmVyYXRlIHJhbmRvbSBzdGFydGluZyBwb2ludCBmb3Igc3VicHJpbWUgc2VhcmNoLCBvciB1c2UKKwkgKiBzcGVjaWZpZWQgcGFyYW1ldGVyLgorCSAqLworCWlmICgobGFyZ2ViYXNlID0gQk5fbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCJCTl9uZXcgZmFpbGVkIik7CisJaWYgKHN0YXJ0ID09IE5VTEwpIHsKKwkJaWYgKEJOX3JhbmQobGFyZ2ViYXNlLCBwb3dlciwgMSwgMSkgPT0gMCkKKwkJCWZhdGFsKCJCTl9yYW5kIGZhaWxlZCIpOworCX0gZWxzZSB7CisJCWlmIChCTl9jb3B5KGxhcmdlYmFzZSwgc3RhcnQpID09IE5VTEwpCisJCQlmYXRhbCgiQk5fY29weTogZmFpbGVkIik7CisJfQorCisJLyogZW5zdXJlIG9kZCAqLworCWlmIChCTl9zZXRfYml0KGxhcmdlYmFzZSwgMCkgPT0gMCkKKwkJZmF0YWwoIkJOX3NldF9iaXQ6IGZhaWxlZCIpOworCisJdGltZSgmdGltZV9zdGFydCk7CisKKwlsb2dpdCgiJS4yNHMgU2lldmUgbmV4dCAldSBwbHVzICV1LWJpdCIsIGN0aW1lKCZ0aW1lX3N0YXJ0KSwKKwkgICAgbGFyZ2VudW1iZXJzLCBwb3dlcik7CisJZGVidWcyKCJzdGFydCBwb2ludDogMHglcyIsIEJOX2JuMmhleChsYXJnZWJhc2UpKTsKKworCS8qCisJICogVGlueVNpZXZlCisJICovCisJZm9yIChpID0gMDsgaSA8IHRpbnliaXRzOyBpKyspIHsKKwkJaWYgKEJJVF9URVNUKFRpbnlTaWV2ZSwgaSkpCisJCQljb250aW51ZTsgLyogMippKzMgaXMgY29tcG9zaXRlICovCisKKwkJLyogVGhlIG5leHQgdGlueSBwcmltZSAqLworCQl0ID0gMiAqIGkgKyAzOworCisJCS8qIE1hcmsgYWxsIG11bHRpcGxlcyBvZiB0ICovCisJCWZvciAoaiA9IGkgKyB0OyBqIDwgdGlueWJpdHM7IGogKz0gdCkKKwkJCUJJVF9TRVQoVGlueVNpZXZlLCBqKTsKKworCQlzaWV2ZV9sYXJnZSh0KTsKKwl9CisKKwkvKgorCSAqIFN0YXJ0IHRoZSBzbWFsbCBibG9jayBzZWFyY2ggYXQgdGhlIG5leHQgcG9zc2libGUgcHJpbWUuIFRvIGF2b2lkCisJICogZmVuY2Vwb3N0IGVycm9ycywgdGhlIGxhc3QgcGFzcyBpcyBza2lwcGVkLgorCSAqLworCWZvciAoc21hbGxiYXNlID0gVElOWV9OVU1CRVIgKyAzOworCSAgICBzbWFsbGJhc2UgPCAoU01BTExfTUFYSU1VTSAtIFRJTllfTlVNQkVSKTsKKwkgICAgc21hbGxiYXNlICs9IFRJTllfTlVNQkVSKSB7CisJCWZvciAoaSA9IDA7IGkgPCB0aW55Yml0czsgaSsrKSB7CisJCQlpZiAoQklUX1RFU1QoVGlueVNpZXZlLCBpKSkKKwkJCQljb250aW51ZTsgLyogMippKzMgaXMgY29tcG9zaXRlICovCisKKwkJCS8qIFRoZSBuZXh0IHRpbnkgcHJpbWUgKi8KKwkJCXQgPSAyICogaSArIDM7CisJCQlyID0gc21hbGxiYXNlICUgdDsKKworCQkJaWYgKHIgPT0gMCkgeworCQkJCXMgPSAwOyAvKiB0IGRpdmlkZXMgaW50byBzbWFsbGJhc2UgZXhhY3RseSAqLworCQkJfSBlbHNlIHsKKwkJCQkvKiBzbWFsbGJhc2UrcyBpcyBmaXJzdCBlbnRyeSBkaXZpc2libGUgYnkgdCAqLworCQkJCXMgPSB0IC0gcjsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFRoZSBzaWV2ZSBvbWl0cyBldmVuIG51bWJlcnMsIHNvIGVuc3VyZSB0aGF0CisJCQkgKiBzbWFsbGJhc2UrcyBpcyBvZGQuIFRoZW4sIHN0ZXAgdGhyb3VnaCB0aGUgc2lldmUKKwkJCSAqIGluIGluY3JlbWVudHMgb2YgMip0CisJCQkgKi8KKwkJCWlmIChzICYgMSkKKwkJCQlzICs9IHQ7IC8qIE1ha2Ugc21hbGxiYXNlK3Mgb2RkLCBhbmQgcyBldmVuICovCisKKwkJCS8qIE1hcmsgYWxsIG11bHRpcGxlcyBvZiAyKnQgKi8KKwkJCWZvciAocyAvPSAyOyBzIDwgc21hbGxiaXRzOyBzICs9IHQpCisJCQkJQklUX1NFVChTbWFsbFNpZXZlLCBzKTsKKwkJfQorCisJCS8qCisJCSAqIFNtYWxsU2lldmUKKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBzbWFsbGJpdHM7IGkrKykgeworCQkJaWYgKEJJVF9URVNUKFNtYWxsU2lldmUsIGkpKQorCQkJCWNvbnRpbnVlOyAvKiAyKmkrc21hbGxiYXNlIGlzIGNvbXBvc2l0ZSAqLworCisJCQkvKiBUaGUgbmV4dCBzbWFsbCBwcmltZSAqLworCQkJc2lldmVfbGFyZ2UoKDIgKiBpKSArIHNtYWxsYmFzZSk7CisJCX0KKworCQltZW1zZXQoU21hbGxTaWV2ZSwgMCwgc21hbGx3b3JkcyA8PCBTSElGVF9CWVRFKTsKKwl9CisKKwl0aW1lKCZ0aW1lX3N0b3ApOworCisJbG9naXQoIiUuMjRzIFNpZXZlZCB3aXRoICV1IHNtYWxsIHByaW1lcyBpbiAlbGQgc2Vjb25kcyIsCisJICAgIGN0aW1lKCZ0aW1lX3N0b3ApLCBsYXJnZXRyaWVzLCAobG9uZykgKHRpbWVfc3RvcCAtIHRpbWVfc3RhcnQpKTsKKworCWZvciAoaiA9IHIgPSAwOyBqIDwgbGFyZ2ViaXRzOyBqKyspIHsKKwkJaWYgKEJJVF9URVNUKExhcmdlU2lldmUsIGopKQorCQkJY29udGludWU7IC8qIERlZmluaXRlbHkgY29tcG9zaXRlLCBza2lwICovCisKKwkJZGVidWcyKCJ0ZXN0IHEgPSBsYXJnZWJhc2UrJXUiLCAyICogaik7CisJCWlmIChCTl9zZXRfd29yZChxLCAyICogaikgPT0gMCkKKwkJCWZhdGFsKCJCTl9zZXRfd29yZCBmYWlsZWQiKTsKKwkJaWYgKEJOX2FkZChxLCBxLCBsYXJnZWJhc2UpID09IDApCisJCQlmYXRhbCgiQk5fYWRkIGZhaWxlZCIpOworCQlpZiAocWZpbGVvdXQob3V0LCBNT0RVTElfVFlQRV9TT1BISUVfR0VSTUFJTiwKKwkJICAgIE1PRFVMSV9URVNUU19TSUVWRSwgbGFyZ2V0cmllcywKKwkJICAgIChwb3dlciAtIDEpIC8qIE1TQiAqLywgKDApLCBxKSA9PSAtMSkgeworCQkJcmV0ID0gLTE7CisJCQlicmVhazsKKwkJfQorCisJCXIrKzsgLyogY291bnQgcSAqLworCX0KKworCXRpbWUoJnRpbWVfc3RvcCk7CisKKwl4ZnJlZShMYXJnZVNpZXZlKTsKKwl4ZnJlZShTbWFsbFNpZXZlKTsKKwl4ZnJlZShUaW55U2lldmUpOworCisJbG9naXQoIiUuMjRzIEZvdW5kICV1IGNhbmRpZGF0ZXMiLCBjdGltZSgmdGltZV9zdG9wKSwgcik7CisKKwlyZXR1cm4gKHJldCk7Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZV9jaGVja3BvaW50KGNoYXIgKmNwZmlsZSwgdV9pbnQzMl90IGxpbmVubykKK3sKKwlGSUxFICpmcDsKKwljaGFyIHRtcFtNQVhQQVRITEVOXTsKKwlpbnQgcjsKKworCXIgPSBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiJXMuWFhYWFhYWFhYWCIsIGNwZmlsZSk7CisJaWYgKHIgPT0gLTEgfHwgciA+PSBNQVhQQVRITEVOKSB7CisJCWxvZ2l0KCJ3cml0ZV9jaGVja3BvaW50OiB0ZW1wIHBhdGhuYW1lIHRvbyBsb25nIik7CisJCXJldHVybjsKKwl9CisJaWYgKChyID0gbWtzdGVtcCh0bXApKSA9PSAtMSkgeworCQlsb2dpdCgibWtzdGVtcCglcyk6ICVzIiwgdG1wLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm47CisJfQorCWlmICgoZnAgPSBmZG9wZW4ociwgInciKSkgPT0gTlVMTCkgeworCQlsb2dpdCgid3JpdGVfY2hlY2twb2ludDogZmRvcGVuOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKHIpOworCQlyZXR1cm47CisJfQorCWlmIChmcHJpbnRmKGZwLCAiJWx1XG4iLCAodW5zaWduZWQgbG9uZylsaW5lbm8pID4gMCAmJiBmY2xvc2UoZnApID09IDAKKwkgICAgJiYgcmVuYW1lKHRtcCwgY3BmaWxlKSA9PSAwKQorCQlkZWJ1ZzMoIndyb3RlIGNoZWNrcG9pbnQgbGluZSAlbHUgdG8gJyVzJyIsCisJCSAgICAodW5zaWduZWQgbG9uZylsaW5lbm8sIGNwZmlsZSk7CisJZWxzZQorCQlsb2dpdCgiZmFpbGVkIHRvIHdyaXRlIHRvIGNoZWNrcG9pbnQgZmlsZSAnJXMnOiAlcyIsIGNwZmlsZSwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCityZWFkX2NoZWNrcG9pbnQoY2hhciAqY3BmaWxlKQoreworCUZJTEUgKmZwOworCXVuc2lnbmVkIGxvbmcgbGluZW5vID0gMDsKKworCWlmICgoZnAgPSBmb3BlbihjcGZpbGUsICJyIikpID09IE5VTEwpCisJCXJldHVybiAwOworCWlmIChmc2NhbmYoZnAsICIlbHVcbiIsICZsaW5lbm8pIDwgMSkKKwkJbG9naXQoIkZhaWxlZCB0byBsb2FkIGNoZWNrcG9pbnQgZnJvbSAnJXMnIiwgY3BmaWxlKTsKKwllbHNlCisJCWxvZ2l0KCJMb2FkZWQgY2hlY2twb2ludCBmcm9tICclcycgbGluZSAlbHUiLCBjcGZpbGUsIGxpbmVubyk7CisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gbGluZW5vOworfQorCisvKgorICogcGVyZm9ybSBhIE1pbGxlci1SYWJpbiBwcmltYWxpdHkgdGVzdAorICogb24gdGhlIGxpc3Qgb2YgY2FuZGlkYXRlcworICogKGNoZWNraW5nIGJvdGggcSBhbmQgcCkKKyAqIFRoZSByZXN1bHQgaXMgYSBsaXN0IG9mIHNvLWNhbGwgInNhZmUiIHByaW1lcworICovCitpbnQKK3ByaW1lX3Rlc3QoRklMRSAqaW4sIEZJTEUgKm91dCwgdV9pbnQzMl90IHRyaWFscywgdV9pbnQzMl90IGdlbmVyYXRvcl93YW50ZWQsCisgICAgY2hhciAqY2hlY2twb2ludF9maWxlKQoreworCUJJR05VTSAqcSwgKnAsICphOworCUJOX0NUWCAqY3R4OworCWNoYXIgKmNwLCAqbHA7CisJdV9pbnQzMl90IGNvdW50X2luID0gMCwgY291bnRfb3V0ID0gMCwgY291bnRfcG9zc2libGUgPSAwOworCXVfaW50MzJfdCBnZW5lcmF0b3Jfa25vd24sIGluX3Rlc3RzLCBpbl90cmllcywgaW5fdHlwZSwgaW5fc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGxhc3RfcHJvY2Vzc2VkID0gMDsKKwl0aW1lX3QgdGltZV9zdGFydCwgdGltZV9zdG9wOworCWludCByZXM7CisKKwlpZiAodHJpYWxzIDwgVFJJQUxfTUlOSU1VTSkgeworCQllcnJvcigiTWluaW11bSBwcmltYWxpdHkgdHJpYWxzIGlzICVkIiwgVFJJQUxfTUlOSU1VTSk7CisJCXJldHVybiAoLTEpOworCX0KKworCXRpbWUoJnRpbWVfc3RhcnQpOworCisJaWYgKChwID0gQk5fbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCJCTl9uZXcgZmFpbGVkIik7CisJaWYgKChxID0gQk5fbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCJCTl9uZXcgZmFpbGVkIik7CisJaWYgKChjdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCJCTl9DVFhfbmV3IGZhaWxlZCIpOworCisJZGVidWcyKCIlLjI0cyBGaW5hbCAldSBNaWxsZXItUmFiaW4gdHJpYWxzICgleCBnZW5lcmF0b3IpIiwKKwkgICAgY3RpbWUoJnRpbWVfc3RhcnQpLCB0cmlhbHMsIGdlbmVyYXRvcl93YW50ZWQpOworCisJaWYgKGNoZWNrcG9pbnRfZmlsZSAhPSBOVUxMKQorCQlsYXN0X3Byb2Nlc3NlZCA9IHJlYWRfY2hlY2twb2ludChjaGVja3BvaW50X2ZpbGUpOworCisJcmVzID0gMDsKKwlscCA9IHhtYWxsb2MoUUxJTkVTSVpFICsgMSk7CisJd2hpbGUgKGZnZXRzKGxwLCBRTElORVNJWkUgKyAxLCBpbikgIT0gTlVMTCkgeworCQljb3VudF9pbisrOworCQlpZiAoY2hlY2twb2ludF9maWxlICE9IE5VTEwpIHsKKwkJCWlmIChjb3VudF9pbiA8PSBsYXN0X3Byb2Nlc3NlZCkgeworCQkJCWRlYnVnMygic2tpcHBpbmcgbGluZSAldSwgYmVmb3JlIGNoZWNrcG9pbnQiLAorCQkJCSAgICBjb3VudF9pbik7CisJCQkJY29udGludWU7CisJCQl9CisJCQl3cml0ZV9jaGVja3BvaW50KGNoZWNrcG9pbnRfZmlsZSwgY291bnRfaW4pOworCQl9CisJCWlmIChzdHJsZW4obHApIDwgMTQgfHwgKmxwID09ICchJyB8fCAqbHAgPT0gJyMnKSB7CisJCQlkZWJ1ZzIoIiUxMHU6IGNvbW1lbnQgb3Igc2hvcnQgbGluZSIsIGNvdW50X2luKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogWFhYIC0gZnJhZ2lsZSBwYXJzZXIgKi8KKwkJLyogdGltZSAqLworCQljcCA9ICZscFsxNF07CS8qIChza2lwKSAqLworCisJCS8qIHR5cGUgKi8KKwkJaW5fdHlwZSA9IHN0cnRvdWwoY3AsICZjcCwgMTApOworCisJCS8qIHRlc3RzICovCisJCWluX3Rlc3RzID0gc3RydG91bChjcCwgJmNwLCAxMCk7CisKKwkJaWYgKGluX3Rlc3RzICYgTU9EVUxJX1RFU1RTX0NPTVBPU0lURSkgeworCQkJZGVidWcyKCIlMTB1OiBrbm93biBjb21wb3NpdGUiLCBjb3VudF9pbik7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHRyaWVzICovCisJCWluX3RyaWVzID0gc3RydG91bChjcCwgJmNwLCAxMCk7CisKKwkJLyogc2l6ZSAobW9zdCBzaWduaWZpY2FudCBiaXQpICovCisJCWluX3NpemUgPSBzdHJ0b3VsKGNwLCAmY3AsIDEwKTsKKworCQkvKiBnZW5lcmF0b3IgKGhleCkgKi8KKwkJZ2VuZXJhdG9yX2tub3duID0gc3RydG91bChjcCwgJmNwLCAxNik7CisKKwkJLyogU2tpcCB3aGl0ZSBzcGFjZSAqLworCQljcCArPSBzdHJzcG4oY3AsICIgIik7CisKKwkJLyogbW9kdWx1cyAoaGV4KSAqLworCQlzd2l0Y2ggKGluX3R5cGUpIHsKKwkJY2FzZSBNT0RVTElfVFlQRV9TT1BISUVfR0VSTUFJTjoKKwkJCWRlYnVnMigiJTEwdTogKCV1KSBTb3BoaWUtR2VybWFpbiIsIGNvdW50X2luLCBpbl90eXBlKTsKKwkJCWEgPSBxOworCQkJaWYgKEJOX2hleDJibigmYSwgY3ApID09IDApCisJCQkJZmF0YWwoIkJOX2hleDJibiBmYWlsZWQiKTsKKwkJCS8qIHAgPSAyKnEgKyAxICovCisJCQlpZiAoQk5fbHNoaWZ0KHAsIHEsIDEpID09IDApCisJCQkJZmF0YWwoIkJOX2xzaGlmdCBmYWlsZWQiKTsKKwkJCWlmIChCTl9hZGRfd29yZChwLCAxKSA9PSAwKQorCQkJCWZhdGFsKCJCTl9hZGRfd29yZCBmYWlsZWQiKTsKKwkJCWluX3NpemUgKz0gMTsKKwkJCWdlbmVyYXRvcl9rbm93biA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBNT0RVTElfVFlQRV9VTlNUUlVDVFVSRUQ6CisJCWNhc2UgTU9EVUxJX1RZUEVfU0FGRToKKwkJY2FzZSBNT0RVTElfVFlQRV9TQ0hOT1JSOgorCQljYXNlIE1PRFVMSV9UWVBFX1NUUk9ORzoKKwkJY2FzZSBNT0RVTElfVFlQRV9VTktOT1dOOgorCQkJZGVidWcyKCIlMTB1OiAoJXUpIiwgY291bnRfaW4sIGluX3R5cGUpOworCQkJYSA9IHA7CisJCQlpZiAoQk5faGV4MmJuKCZhLCBjcCkgPT0gMCkKKwkJCQlmYXRhbCgiQk5faGV4MmJuIGZhaWxlZCIpOworCQkJLyogcSA9IChwLTEpIC8gMiAqLworCQkJaWYgKEJOX3JzaGlmdChxLCBwLCAxKSA9PSAwKQorCQkJCWZhdGFsKCJCTl9yc2hpZnQgZmFpbGVkIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRlYnVnMigiVW5rbm93biBwcmltZSB0eXBlIik7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIGR1ZSB0byBlYXJsaWVyIGluY29uc2lzdGVuY2llcyBpbiBpbnRlcnByZXRhdGlvbiwgY2hlY2sKKwkJICogdGhlIHByb3Bvc2VkIGJpdCBzaXplLgorCQkgKi8KKwkJaWYgKCh1X2ludDMyX3QpQk5fbnVtX2JpdHMocCkgIT0gKGluX3NpemUgKyAxKSkgeworCQkJZGVidWcyKCIlMTB1OiBiaXQgc2l6ZSAldSBtaXNtYXRjaCIsIGNvdW50X2luLCBpbl9zaXplKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChpbl9zaXplIDwgUVNJWkVfTUlOSU1VTSkgeworCQkJZGVidWcyKCIlMTB1OiBiaXQgc2l6ZSAldSB0b28gc2hvcnQiLCBjb3VudF9pbiwgaW5fc2l6ZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChpbl90ZXN0cyAmIE1PRFVMSV9URVNUU19NSUxMRVJfUkFCSU4pCisJCQlpbl90cmllcyArPSB0cmlhbHM7CisJCWVsc2UKKwkJCWluX3RyaWVzID0gdHJpYWxzOworCisJCS8qCisJCSAqIGd1ZXNzIHVua25vd24gZ2VuZXJhdG9yCisJCSAqLworCQlpZiAoZ2VuZXJhdG9yX2tub3duID09IDApIHsKKwkJCWlmIChCTl9tb2Rfd29yZChwLCAyNCkgPT0gMTEpCisJCQkJZ2VuZXJhdG9yX2tub3duID0gMjsKKwkJCWVsc2UgaWYgKEJOX21vZF93b3JkKHAsIDEyKSA9PSA1KQorCQkJCWdlbmVyYXRvcl9rbm93biA9IDM7CisJCQllbHNlIHsKKwkJCQl1X2ludDMyX3QgciA9IEJOX21vZF93b3JkKHAsIDEwKTsKKworCQkJCWlmIChyID09IDMgfHwgciA9PSA3KQorCQkJCQlnZW5lcmF0b3Jfa25vd24gPSA1OworCQkJfQorCQl9CisJCS8qCisJCSAqIHNraXAgdGVzdHMgd2hlbiBkZXNpcmVkIGdlbmVyYXRvciBkb2Vzbid0IG1hdGNoCisJCSAqLworCQlpZiAoZ2VuZXJhdG9yX3dhbnRlZCA+IDAgJiYKKwkJICAgIGdlbmVyYXRvcl93YW50ZWQgIT0gZ2VuZXJhdG9yX2tub3duKSB7CisJCQlkZWJ1ZzIoIiUxMHU6IGdlbmVyYXRvciAlZCAhPSAlZCIsCisJCQkgICAgY291bnRfaW4sIGdlbmVyYXRvcl9rbm93biwgZ2VuZXJhdG9yX3dhbnRlZCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIFByaW1lcyB3aXRoIG5vIGtub3duIGdlbmVyYXRvciBhcmUgdXNlbGVzcyBmb3IgREgsIHNvCisJCSAqIHNraXAgdGhvc2UuCisJCSAqLworCQlpZiAoZ2VuZXJhdG9yX2tub3duID09IDApIHsKKwkJCWRlYnVnMigiJTEwdTogbm8ga25vd24gZ2VuZXJhdG9yIiwgY291bnRfaW4pOworCQkJY29udGludWU7CisJCX0KKworCQljb3VudF9wb3NzaWJsZSsrOworCisJCS8qCisJCSAqIFRoZSAoMS80KV5OIHBlcmZvcm1hbmNlIGJvdW5kIG9uIE1pbGxlci1SYWJpbiBpcworCQkgKiBleHRyZW1lbHkgcGVzc2ltaXN0aWMsIHNvIGRvbid0IHNwZW5kIGEgbG90IG9mIHRpbWUKKwkJICogcmVhbGx5IHZlcmlmeWluZyB0aGF0IHEgaXMgcHJpbWUgdW50aWwgYWZ0ZXIgd2Uga25vdworCQkgKiB0aGF0IHAgaXMgYWxzbyBwcmltZS4gQSBzaW5nbGUgcGFzcyB3aWxsIHdlZWQgb3V0IHRoZQorCQkgKiB2YXN0IG1ham9yaXR5IG9mIGNvbXBvc2l0ZSBxJ3MuCisJCSAqLworCQlpZiAoQk5faXNfcHJpbWVfZXgocSwgMSwgY3R4LCBOVUxMKSA8PSAwKSB7CisJCQlkZWJ1ZygiJTEwdTogcSBmYWlsZWQgZmlyc3QgcG9zc2libGUgcHJpbWUgdGVzdCIsCisJCQkgICAgY291bnRfaW4pOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBxIGlzIHBvc3NpYmx5IHByaW1lLCBzbyBnbyBhaGVhZCBhbmQgcmVhbGx5IG1ha2Ugc3VyZQorCQkgKiB0aGF0IHAgaXMgcHJpbWUuIElmIGl0IGlzLCB0aGVuIHdlIGNhbiBnbyBiYWNrIGFuZCBkbworCQkgKiB0aGUgc2FtZSBmb3IgcS4gSWYgcCBpcyBjb21wb3NpdGUsIGNoYW5jZXMgYXJlIHRoYXQKKwkJICogd2lsbCBzaG93IHVwIG9uIHRoZSBmaXJzdCBSYWJpbi1NaWxsZXIgaXRlcmF0aW9uIHNvIGl0CisJCSAqIGRvZXNuJ3QgaHVydCB0byBzcGVjaWZ5IGEgaGlnaCBpdGVyYXRpb24gY291bnQuCisJCSAqLworCQlpZiAoIUJOX2lzX3ByaW1lX2V4KHAsIHRyaWFscywgY3R4LCBOVUxMKSkgeworCQkJZGVidWcoIiUxMHU6IHAgaXMgbm90IHByaW1lIiwgY291bnRfaW4pOworCQkJY29udGludWU7CisJCX0KKwkJZGVidWcoIiUxMHU6IHAgaXMgYWxtb3N0IGNlcnRhaW5seSBwcmltZSIsIGNvdW50X2luKTsKKworCQkvKiByZWNoZWNrIHEgbW9yZSByaWdvcm91c2x5ICovCisJCWlmICghQk5faXNfcHJpbWVfZXgocSwgdHJpYWxzIC0gMSwgY3R4LCBOVUxMKSkgeworCQkJZGVidWcoIiUxMHU6IHEgaXMgbm90IHByaW1lIiwgY291bnRfaW4pOworCQkJY29udGludWU7CisJCX0KKwkJZGVidWcoIiUxMHU6IHEgaXMgYWxtb3N0IGNlcnRhaW5seSBwcmltZSIsIGNvdW50X2luKTsKKworCQlpZiAocWZpbGVvdXQob3V0LCBNT0RVTElfVFlQRV9TQUZFLAorCQkgICAgaW5fdGVzdHMgfCBNT0RVTElfVEVTVFNfTUlMTEVSX1JBQklOLAorCQkgICAgaW5fdHJpZXMsIGluX3NpemUsIGdlbmVyYXRvcl9rbm93biwgcCkpIHsKKwkJCXJlcyA9IC0xOworCQkJYnJlYWs7CisJCX0KKworCQljb3VudF9vdXQrKzsKKwl9CisKKwl0aW1lKCZ0aW1lX3N0b3ApOworCXhmcmVlKGxwKTsKKwlCTl9mcmVlKHApOworCUJOX2ZyZWUocSk7CisJQk5fQ1RYX2ZyZWUoY3R4KTsKKworCWlmIChjaGVja3BvaW50X2ZpbGUgIT0gTlVMTCkKKwkJdW5saW5rKGNoZWNrcG9pbnRfZmlsZSk7CisKKwlsb2dpdCgiJS4yNHMgRm91bmQgJXUgc2FmZSBwcmltZXMgb2YgJXUgY2FuZGlkYXRlcyBpbiAlbGQgc2Vjb25kcyIsCisJICAgIGN0aW1lKCZ0aW1lX3N0b3ApLCBjb3VudF9vdXQsIGNvdW50X3Bvc3NpYmxlLAorCSAgICAobG9uZykgKHRpbWVfc3RvcCAtIHRpbWVfc3RhcnQpKTsKKworCXJldHVybiAocmVzKTsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvbW9uaXRvci5jIGIvb3BlbnNzaC02LjBwMS9tb25pdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdhYmYyNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvbW9uaXRvci5jCkBAIC0wLDAgKzEsMjMwOSBAQAorLyogJE9wZW5CU0Q6IG1vbml0b3IuYyx2IDEuMTE2IDIwMTIvMDEvMDUgMDA6MTY6NTYgZGptIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IDIwMDIgTmllbHMgUHJvdm9zIDxwcm92b3NAY2l0aS51bWljaC5lZHU+CisgKiBDb3B5cmlnaHQgMjAwMiBNYXJrdXMgRnJpZWRsIDxtYXJrdXNAb3BlbmJzZC5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9zeXMtdHJlZS5oIgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZkZWYgSEFWRV9QQVRIU19ICisjaW5jbHVkZSA8cGF0aHMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2lmZGVmIEhBVkVfUE9MTF9ICisjaW5jbHVkZSA8cG9sbC5oPgorI2Vsc2UKKyMgaWZkZWYgSEFWRV9TWVNfUE9MTF9ICisjICBpbmNsdWRlIDxzeXMvcG9sbC5oPgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBTS0VZCisjaW5jbHVkZSA8c2tleS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+CisKKyNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9zeXMtcXVldWUuaCIKKyNpbmNsdWRlICJhdG9taWNpby5oIgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJzc2guaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJob3N0ZmlsZS5oIgorI2luY2x1ZGUgImF1dGguaCIKKyNpbmNsdWRlICJjaXBoZXIuaCIKKyNpbmNsdWRlICJrZXguaCIKKyNpbmNsdWRlICJkaC5oIgorI2lmZGVmIFRBUkdFVF9PU19NQUMJLyogWFhYIEJyb2tlbiBrcmI1IGhlYWRlcnMgb24gTWFjICovCisjdW5kZWYgVEFSR0VUX09TX01BQworI2luY2x1ZGUgInpsaWIuaCIKKyNkZWZpbmUgVEFSR0VUX09TX01BQyAxCisjZWxzZQorI2luY2x1ZGUgInpsaWIuaCIKKyNlbmRpZgorI2luY2x1ZGUgInBhY2tldC5oIgorI2luY2x1ZGUgImF1dGgtb3B0aW9ucy5oIgorI2luY2x1ZGUgInNzaHB0eS5oIgorI2luY2x1ZGUgImNoYW5uZWxzLmgiCisjaW5jbHVkZSAic2Vzc2lvbi5oIgorI2luY2x1ZGUgInNzaGxvZ2luLmgiCisjaW5jbHVkZSAiY2Fub2hvc3QuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJzZXJ2Y29uZi5oIgorI2luY2x1ZGUgIm1vbml0b3IuaCIKKyNpbmNsdWRlICJtb25pdG9yX21tLmgiCisjaWZkZWYgR1NTQVBJCisjaW5jbHVkZSAic3NoLWdzcy5oIgorI2VuZGlmCisjaW5jbHVkZSAibW9uaXRvcl93cmFwLmgiCisjaW5jbHVkZSAibW9uaXRvcl9mZHBhc3MuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisjaW5jbHVkZSAic3NoMi5oIgorI2luY2x1ZGUgImpwYWtlLmgiCisjaW5jbHVkZSAicm9hbWluZy5oIgorCisjaWZkZWYgR1NTQVBJCitzdGF0aWMgR3NzY3R4dCAqZ3NzY29udGV4dCA9IE5VTEw7CisjZW5kaWYKKworLyogSW1wb3J0cyAqLworZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKK2V4dGVybiB1X2ludCB1dG1wX2xlbjsKK2V4dGVybiBOZXdrZXlzICpjdXJyZW50X2tleXNbXTsKK2V4dGVybiB6X3N0cmVhbSBpbmNvbWluZ19zdHJlYW07CitleHRlcm4gel9zdHJlYW0gb3V0Z29pbmdfc3RyZWFtOworZXh0ZXJuIHVfY2hhciBzZXNzaW9uX2lkW107CitleHRlcm4gQnVmZmVyIGF1dGhfZGVidWc7CitleHRlcm4gaW50IGF1dGhfZGVidWdfaW5pdDsKK2V4dGVybiBCdWZmZXIgbG9naW5tc2c7CisKKy8qIFN0YXRlIGV4cG9ydGVkIGZyb20gdGhlIGNoaWxkICovCisKK3N0cnVjdCB7CisJel9zdHJlYW0gaW5jb21pbmc7CisJel9zdHJlYW0gb3V0Z29pbmc7CisJdV9jaGFyICprZXlpbjsKKwl1X2ludCBrZXlpbmxlbjsKKwl1X2NoYXIgKmtleW91dDsKKwl1X2ludCBrZXlvdXRsZW47CisJdV9jaGFyICppdmluOworCXVfaW50IGl2aW5sZW47CisJdV9jaGFyICppdm91dDsKKwl1X2ludCBpdm91dGxlbjsKKwl1X2NoYXIgKnNzaDFrZXk7CisJdV9pbnQgc3NoMWtleWxlbjsKKwlpbnQgc3NoMWNpcGhlcjsKKwlpbnQgc3NoMXByb3RvZmxhZ3M7CisJdV9jaGFyICppbnB1dDsKKwl1X2ludCBpbGVuOworCXVfY2hhciAqb3V0cHV0OworCXVfaW50IG9sZW47CisJdV9pbnQ2NF90IHNlbnRfYnl0ZXM7CisJdV9pbnQ2NF90IHJlY3ZfYnl0ZXM7Cit9IGNoaWxkX3N0YXRlOworCisvKiBGdW5jdGlvbnMgb24gdGhlIG1vbml0b3IgdGhhdCBhbnN3ZXIgdW5wcml2aWxlZ2VkIHJlcXVlc3RzICovCisKK2ludCBtbV9hbnN3ZXJfbW9kdWxpKGludCwgQnVmZmVyICopOworaW50IG1tX2Fuc3dlcl9zaWduKGludCwgQnVmZmVyICopOworaW50IG1tX2Fuc3dlcl9wd25hbWFsbG93KGludCwgQnVmZmVyICopOworaW50IG1tX2Fuc3dlcl9hdXRoMl9yZWFkX2Jhbm5lcihpbnQsIEJ1ZmZlciAqKTsKK2ludCBtbV9hbnN3ZXJfYXV0aHNlcnYoaW50LCBCdWZmZXIgKik7CitpbnQgbW1fYW5zd2VyX2F1dGhwYXNzd29yZChpbnQsIEJ1ZmZlciAqKTsKK2ludCBtbV9hbnN3ZXJfYnNkYXV0aHF1ZXJ5KGludCwgQnVmZmVyICopOworaW50IG1tX2Fuc3dlcl9ic2RhdXRocmVzcG9uZChpbnQsIEJ1ZmZlciAqKTsKK2ludCBtbV9hbnN3ZXJfc2tleXF1ZXJ5KGludCwgQnVmZmVyICopOworaW50IG1tX2Fuc3dlcl9za2V5cmVzcG9uZChpbnQsIEJ1ZmZlciAqKTsKK2ludCBtbV9hbnN3ZXJfa2V5YWxsb3dlZChpbnQsIEJ1ZmZlciAqKTsKK2ludCBtbV9hbnN3ZXJfa2V5dmVyaWZ5KGludCwgQnVmZmVyICopOworaW50IG1tX2Fuc3dlcl9wdHkoaW50LCBCdWZmZXIgKik7CitpbnQgbW1fYW5zd2VyX3B0eV9jbGVhbnVwKGludCwgQnVmZmVyICopOworaW50IG1tX2Fuc3dlcl90ZXJtKGludCwgQnVmZmVyICopOworaW50IG1tX2Fuc3dlcl9yc2Ffa2V5YWxsb3dlZChpbnQsIEJ1ZmZlciAqKTsKK2ludCBtbV9hbnN3ZXJfcnNhX2NoYWxsZW5nZShpbnQsIEJ1ZmZlciAqKTsKK2ludCBtbV9hbnN3ZXJfcnNhX3Jlc3BvbnNlKGludCwgQnVmZmVyICopOworaW50IG1tX2Fuc3dlcl9zZXNza2V5KGludCwgQnVmZmVyICopOworaW50IG1tX2Fuc3dlcl9zZXNzaWQoaW50LCBCdWZmZXIgKik7CitpbnQgbW1fYW5zd2VyX2pwYWtlX2dldF9wd2RhdGEoaW50LCBCdWZmZXIgKik7CitpbnQgbW1fYW5zd2VyX2pwYWtlX3N0ZXAxKGludCwgQnVmZmVyICopOworaW50IG1tX2Fuc3dlcl9qcGFrZV9zdGVwMihpbnQsIEJ1ZmZlciAqKTsKK2ludCBtbV9hbnN3ZXJfanBha2Vfa2V5X2NvbmZpcm0oaW50LCBCdWZmZXIgKik7CitpbnQgbW1fYW5zd2VyX2pwYWtlX2NoZWNrX2NvbmZpcm0oaW50LCBCdWZmZXIgKik7CisKKyNpZmRlZiBVU0VfUEFNCitpbnQgbW1fYW5zd2VyX3BhbV9zdGFydChpbnQsIEJ1ZmZlciAqKTsKK2ludCBtbV9hbnN3ZXJfcGFtX2FjY291bnQoaW50LCBCdWZmZXIgKik7CitpbnQgbW1fYW5zd2VyX3BhbV9pbml0X2N0eChpbnQsIEJ1ZmZlciAqKTsKK2ludCBtbV9hbnN3ZXJfcGFtX3F1ZXJ5KGludCwgQnVmZmVyICopOworaW50IG1tX2Fuc3dlcl9wYW1fcmVzcG9uZChpbnQsIEJ1ZmZlciAqKTsKK2ludCBtbV9hbnN3ZXJfcGFtX2ZyZWVfY3R4KGludCwgQnVmZmVyICopOworI2VuZGlmCisKKyNpZmRlZiBHU1NBUEkKK2ludCBtbV9hbnN3ZXJfZ3NzX3NldHVwX2N0eChpbnQsIEJ1ZmZlciAqKTsKK2ludCBtbV9hbnN3ZXJfZ3NzX2FjY2VwdF9jdHgoaW50LCBCdWZmZXIgKik7CitpbnQgbW1fYW5zd2VyX2dzc191c2Vyb2soaW50LCBCdWZmZXIgKik7CitpbnQgbW1fYW5zd2VyX2dzc19jaGVja21pYyhpbnQsIEJ1ZmZlciAqKTsKKyNlbmRpZgorCisjaWZkZWYgU1NIX0FVRElUX0VWRU5UUworaW50IG1tX2Fuc3dlcl9hdWRpdF9ldmVudChpbnQsIEJ1ZmZlciAqKTsKK2ludCBtbV9hbnN3ZXJfYXVkaXRfY29tbWFuZChpbnQsIEJ1ZmZlciAqKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IG1vbml0b3JfcmVhZF9sb2coc3RydWN0IG1vbml0b3IgKik7CisKK3N0YXRpYyBBdXRoY3R4dCAqYXV0aGN0eHQ7CitzdGF0aWMgQklHTlVNICpzc2gxX2NoYWxsZW5nZSA9IE5VTEw7CS8qIHVzZWQgZm9yIHNzaDEgcnNhIGF1dGggKi8KKworLyogbG9jYWwgc3RhdGUgZm9yIGtleSB2ZXJpZnkgKi8KK3N0YXRpYyB1X2NoYXIgKmtleV9ibG9iID0gTlVMTDsKK3N0YXRpYyB1X2ludCBrZXlfYmxvYmxlbiA9IDA7CitzdGF0aWMgaW50IGtleV9ibG9idHlwZSA9IE1NX05PS0VZOworc3RhdGljIGNoYXIgKmhvc3RiYXNlZF9jdXNlciA9IE5VTEw7CitzdGF0aWMgY2hhciAqaG9zdGJhc2VkX2Nob3N0ID0gTlVMTDsKK3N0YXRpYyBjaGFyICphdXRoX21ldGhvZCA9ICJ1bmtub3duIjsKK3N0YXRpYyB1X2ludCBzZXNzaW9uX2lkMl9sZW4gPSAwOworc3RhdGljIHVfY2hhciAqc2Vzc2lvbl9pZDIgPSBOVUxMOworc3RhdGljIHBpZF90IG1vbml0b3JfY2hpbGRfcGlkOworCitzdHJ1Y3QgbW9uX3RhYmxlIHsKKwllbnVtIG1vbml0b3JfcmVxdHlwZSB0eXBlOworCWludCBmbGFnczsKKwlpbnQgKCpmKShpbnQsIEJ1ZmZlciAqKTsKK307CisKKyNkZWZpbmUgTU9OX0lTQVVUSAkweDAwMDQJLyogUmVxdWlyZWQgZm9yIEF1dGhlbnRpY2F0aW9uICovCisjZGVmaW5lIE1PTl9BVVRIREVDSURFCTB4MDAwOAkvKiBEZWNpZGVzIEF1dGhlbnRpY2F0aW9uICovCisjZGVmaW5lIE1PTl9PTkNFCTB4MDAxMAkvKiBEaXNhYmxlIGFmdGVyIGNhbGxpbmcgKi8KKyNkZWZpbmUgTU9OX0FMT0cJMHgwMDIwCS8qIExvZyBhdXRoIGF0dGVtcHQgd2l0aG91dCBhdXRoZW50aWNhdGluZyAqLworCisjZGVmaW5lIE1PTl9BVVRICShNT05fSVNBVVRIfE1PTl9BVVRIREVDSURFKQorCisjZGVmaW5lIE1PTl9QRVJNSVQJMHgxMDAwCS8qIFJlcXVlc3QgaXMgcGVybWl0dGVkICovCisKK3N0cnVjdCBtb25fdGFibGUgbW9uX2Rpc3BhdGNoX3Byb3RvMjBbXSA9IHsKKyAgICB7TU9OSVRPUl9SRVFfTU9EVUxJLCBNT05fT05DRSwgbW1fYW5zd2VyX21vZHVsaX0sCisgICAge01PTklUT1JfUkVRX1NJR04sIE1PTl9PTkNFLCBtbV9hbnN3ZXJfc2lnbn0sCisgICAge01PTklUT1JfUkVRX1BXTkFNLCBNT05fT05DRSwgbW1fYW5zd2VyX3B3bmFtYWxsb3d9LAorICAgIHtNT05JVE9SX1JFUV9BVVRIU0VSViwgTU9OX09OQ0UsIG1tX2Fuc3dlcl9hdXRoc2Vydn0sCisgICAge01PTklUT1JfUkVRX0FVVEgyX1JFQURfQkFOTkVSLCBNT05fT05DRSwgbW1fYW5zd2VyX2F1dGgyX3JlYWRfYmFubmVyfSwKKyAgICB7TU9OSVRPUl9SRVFfQVVUSFBBU1NXT1JELCBNT05fQVVUSCwgbW1fYW5zd2VyX2F1dGhwYXNzd29yZH0sCisjaWZkZWYgVVNFX1BBTQorICAgIHtNT05JVE9SX1JFUV9QQU1fU1RBUlQsIE1PTl9PTkNFLCBtbV9hbnN3ZXJfcGFtX3N0YXJ0fSwKKyAgICB7TU9OSVRPUl9SRVFfUEFNX0FDQ09VTlQsIDAsIG1tX2Fuc3dlcl9wYW1fYWNjb3VudH0sCisgICAge01PTklUT1JfUkVRX1BBTV9JTklUX0NUWCwgTU9OX0lTQVVUSCwgbW1fYW5zd2VyX3BhbV9pbml0X2N0eH0sCisgICAge01PTklUT1JfUkVRX1BBTV9RVUVSWSwgTU9OX0lTQVVUSCwgbW1fYW5zd2VyX3BhbV9xdWVyeX0sCisgICAge01PTklUT1JfUkVRX1BBTV9SRVNQT05ELCBNT05fSVNBVVRILCBtbV9hbnN3ZXJfcGFtX3Jlc3BvbmR9LAorICAgIHtNT05JVE9SX1JFUV9QQU1fRlJFRV9DVFgsIE1PTl9PTkNFfE1PTl9BVVRIREVDSURFLCBtbV9hbnN3ZXJfcGFtX2ZyZWVfY3R4fSwKKyNlbmRpZgorI2lmZGVmIFNTSF9BVURJVF9FVkVOVFMKKyAgICB7TU9OSVRPUl9SRVFfQVVESVRfRVZFTlQsIE1PTl9QRVJNSVQsIG1tX2Fuc3dlcl9hdWRpdF9ldmVudH0sCisjZW5kaWYKKyNpZmRlZiBCU0RfQVVUSAorICAgIHtNT05JVE9SX1JFUV9CU0RBVVRIUVVFUlksIE1PTl9JU0FVVEgsIG1tX2Fuc3dlcl9ic2RhdXRocXVlcnl9LAorICAgIHtNT05JVE9SX1JFUV9CU0RBVVRIUkVTUE9ORCwgTU9OX0FVVEgsIG1tX2Fuc3dlcl9ic2RhdXRocmVzcG9uZH0sCisjZW5kaWYKKyNpZmRlZiBTS0VZCisgICAge01PTklUT1JfUkVRX1NLRVlRVUVSWSwgTU9OX0lTQVVUSCwgbW1fYW5zd2VyX3NrZXlxdWVyeX0sCisgICAge01PTklUT1JfUkVRX1NLRVlSRVNQT05ELCBNT05fQVVUSCwgbW1fYW5zd2VyX3NrZXlyZXNwb25kfSwKKyNlbmRpZgorICAgIHtNT05JVE9SX1JFUV9LRVlBTExPV0VELCBNT05fSVNBVVRILCBtbV9hbnN3ZXJfa2V5YWxsb3dlZH0sCisgICAge01PTklUT1JfUkVRX0tFWVZFUklGWSwgTU9OX0FVVEgsIG1tX2Fuc3dlcl9rZXl2ZXJpZnl9LAorI2lmZGVmIEdTU0FQSQorICAgIHtNT05JVE9SX1JFUV9HU1NTRVRVUCwgTU9OX0lTQVVUSCwgbW1fYW5zd2VyX2dzc19zZXR1cF9jdHh9LAorICAgIHtNT05JVE9SX1JFUV9HU1NTVEVQLCBNT05fSVNBVVRILCBtbV9hbnN3ZXJfZ3NzX2FjY2VwdF9jdHh9LAorICAgIHtNT05JVE9SX1JFUV9HU1NVU0VST0ssIE1PTl9BVVRILCBtbV9hbnN3ZXJfZ3NzX3VzZXJva30sCisgICAge01PTklUT1JfUkVRX0dTU0NIRUNLTUlDLCBNT05fSVNBVVRILCBtbV9hbnN3ZXJfZ3NzX2NoZWNrbWljfSwKKyNlbmRpZgorI2lmZGVmIEpQQUtFCisgICAge01PTklUT1JfUkVRX0pQQUtFX0dFVF9QV0RBVEEsIE1PTl9PTkNFLCBtbV9hbnN3ZXJfanBha2VfZ2V0X3B3ZGF0YX0sCisgICAge01PTklUT1JfUkVRX0pQQUtFX1NURVAxLCBNT05fSVNBVVRILCBtbV9hbnN3ZXJfanBha2Vfc3RlcDF9LAorICAgIHtNT05JVE9SX1JFUV9KUEFLRV9TVEVQMiwgTU9OX09OQ0UsIG1tX2Fuc3dlcl9qcGFrZV9zdGVwMn0sCisgICAge01PTklUT1JfUkVRX0pQQUtFX0tFWV9DT05GSVJNLCBNT05fT05DRSwgbW1fYW5zd2VyX2pwYWtlX2tleV9jb25maXJtfSwKKyAgICB7TU9OSVRPUl9SRVFfSlBBS0VfQ0hFQ0tfQ09ORklSTSwgTU9OX0FVVEgsIG1tX2Fuc3dlcl9qcGFrZV9jaGVja19jb25maXJtfSwKKyNlbmRpZgorICAgIHswLCAwLCBOVUxMfQorfTsKKworc3RydWN0IG1vbl90YWJsZSBtb25fZGlzcGF0Y2hfcG9zdGF1dGgyMFtdID0geworICAgIHtNT05JVE9SX1JFUV9NT0RVTEksIDAsIG1tX2Fuc3dlcl9tb2R1bGl9LAorICAgIHtNT05JVE9SX1JFUV9TSUdOLCAwLCBtbV9hbnN3ZXJfc2lnbn0sCisgICAge01PTklUT1JfUkVRX1BUWSwgMCwgbW1fYW5zd2VyX3B0eX0sCisgICAge01PTklUT1JfUkVRX1BUWUNMRUFOVVAsIDAsIG1tX2Fuc3dlcl9wdHlfY2xlYW51cH0sCisgICAge01PTklUT1JfUkVRX1RFUk0sIDAsIG1tX2Fuc3dlcl90ZXJtfSwKKyNpZmRlZiBTU0hfQVVESVRfRVZFTlRTCisgICAge01PTklUT1JfUkVRX0FVRElUX0VWRU5ULCBNT05fUEVSTUlULCBtbV9hbnN3ZXJfYXVkaXRfZXZlbnR9LAorICAgIHtNT05JVE9SX1JFUV9BVURJVF9DT01NQU5ELCBNT05fUEVSTUlULCBtbV9hbnN3ZXJfYXVkaXRfY29tbWFuZH0sCisjZW5kaWYKKyAgICB7MCwgMCwgTlVMTH0KK307CisKK3N0cnVjdCBtb25fdGFibGUgbW9uX2Rpc3BhdGNoX3Byb3RvMTVbXSA9IHsKKyAgICB7TU9OSVRPUl9SRVFfUFdOQU0sIE1PTl9PTkNFLCBtbV9hbnN3ZXJfcHduYW1hbGxvd30sCisgICAge01PTklUT1JfUkVRX1NFU1NLRVksIE1PTl9PTkNFLCBtbV9hbnN3ZXJfc2Vzc2tleX0sCisgICAge01PTklUT1JfUkVRX1NFU1NJRCwgTU9OX09OQ0UsIG1tX2Fuc3dlcl9zZXNzaWR9LAorICAgIHtNT05JVE9SX1JFUV9BVVRIUEFTU1dPUkQsIE1PTl9BVVRILCBtbV9hbnN3ZXJfYXV0aHBhc3N3b3JkfSwKKyAgICB7TU9OSVRPUl9SRVFfUlNBS0VZQUxMT1dFRCwgTU9OX0lTQVVUSHxNT05fQUxPRywgbW1fYW5zd2VyX3JzYV9rZXlhbGxvd2VkfSwKKyAgICB7TU9OSVRPUl9SRVFfS0VZQUxMT1dFRCwgTU9OX0lTQVVUSHxNT05fQUxPRywgbW1fYW5zd2VyX2tleWFsbG93ZWR9LAorICAgIHtNT05JVE9SX1JFUV9SU0FDSEFMTEVOR0UsIE1PTl9PTkNFLCBtbV9hbnN3ZXJfcnNhX2NoYWxsZW5nZX0sCisgICAge01PTklUT1JfUkVRX1JTQVJFU1BPTlNFLCBNT05fT05DRXxNT05fQVVUSERFQ0lERSwgbW1fYW5zd2VyX3JzYV9yZXNwb25zZX0sCisjaWZkZWYgQlNEX0FVVEgKKyAgICB7TU9OSVRPUl9SRVFfQlNEQVVUSFFVRVJZLCBNT05fSVNBVVRILCBtbV9hbnN3ZXJfYnNkYXV0aHF1ZXJ5fSwKKyAgICB7TU9OSVRPUl9SRVFfQlNEQVVUSFJFU1BPTkQsIE1PTl9BVVRILCBtbV9hbnN3ZXJfYnNkYXV0aHJlc3BvbmR9LAorI2VuZGlmCisjaWZkZWYgU0tFWQorICAgIHtNT05JVE9SX1JFUV9TS0VZUVVFUlksIE1PTl9JU0FVVEgsIG1tX2Fuc3dlcl9za2V5cXVlcnl9LAorICAgIHtNT05JVE9SX1JFUV9TS0VZUkVTUE9ORCwgTU9OX0FVVEgsIG1tX2Fuc3dlcl9za2V5cmVzcG9uZH0sCisjZW5kaWYKKyNpZmRlZiBVU0VfUEFNCisgICAge01PTklUT1JfUkVRX1BBTV9TVEFSVCwgTU9OX09OQ0UsIG1tX2Fuc3dlcl9wYW1fc3RhcnR9LAorICAgIHtNT05JVE9SX1JFUV9QQU1fQUNDT1VOVCwgMCwgbW1fYW5zd2VyX3BhbV9hY2NvdW50fSwKKyAgICB7TU9OSVRPUl9SRVFfUEFNX0lOSVRfQ1RYLCBNT05fSVNBVVRILCBtbV9hbnN3ZXJfcGFtX2luaXRfY3R4fSwKKyAgICB7TU9OSVRPUl9SRVFfUEFNX1FVRVJZLCBNT05fSVNBVVRILCBtbV9hbnN3ZXJfcGFtX3F1ZXJ5fSwKKyAgICB7TU9OSVRPUl9SRVFfUEFNX1JFU1BPTkQsIE1PTl9JU0FVVEgsIG1tX2Fuc3dlcl9wYW1fcmVzcG9uZH0sCisgICAge01PTklUT1JfUkVRX1BBTV9GUkVFX0NUWCwgTU9OX09OQ0V8TU9OX0FVVEhERUNJREUsIG1tX2Fuc3dlcl9wYW1fZnJlZV9jdHh9LAorI2VuZGlmCisjaWZkZWYgU1NIX0FVRElUX0VWRU5UUworICAgIHtNT05JVE9SX1JFUV9BVURJVF9FVkVOVCwgTU9OX1BFUk1JVCwgbW1fYW5zd2VyX2F1ZGl0X2V2ZW50fSwKKyNlbmRpZgorICAgIHswLCAwLCBOVUxMfQorfTsKKworc3RydWN0IG1vbl90YWJsZSBtb25fZGlzcGF0Y2hfcG9zdGF1dGgxNVtdID0geworICAgIHtNT05JVE9SX1JFUV9QVFksIE1PTl9PTkNFLCBtbV9hbnN3ZXJfcHR5fSwKKyAgICB7TU9OSVRPUl9SRVFfUFRZQ0xFQU5VUCwgTU9OX09OQ0UsIG1tX2Fuc3dlcl9wdHlfY2xlYW51cH0sCisgICAge01PTklUT1JfUkVRX1RFUk0sIDAsIG1tX2Fuc3dlcl90ZXJtfSwKKyNpZmRlZiBTU0hfQVVESVRfRVZFTlRTCisgICAge01PTklUT1JfUkVRX0FVRElUX0VWRU5ULCBNT05fUEVSTUlULCBtbV9hbnN3ZXJfYXVkaXRfZXZlbnR9LAorICAgIHtNT05JVE9SX1JFUV9BVURJVF9DT01NQU5ELCBNT05fUEVSTUlUfE1PTl9PTkNFLCBtbV9hbnN3ZXJfYXVkaXRfY29tbWFuZH0sCisjZW5kaWYKKyAgICB7MCwgMCwgTlVMTH0KK307CisKK3N0cnVjdCBtb25fdGFibGUgKm1vbl9kaXNwYXRjaDsKKworLyogU3BlY2lmaWVzIGlmIGEgY2VydGFpbiBtZXNzYWdlIGlzIGFsbG93ZWQgYXQgdGhlIG1vbWVudCAqLworCitzdGF0aWMgdm9pZAorbW9uaXRvcl9wZXJtaXQoc3RydWN0IG1vbl90YWJsZSAqZW50LCBlbnVtIG1vbml0b3JfcmVxdHlwZSB0eXBlLCBpbnQgcGVybWl0KQoreworCXdoaWxlIChlbnQtPmYgIT0gTlVMTCkgeworCQlpZiAoZW50LT50eXBlID09IHR5cGUpIHsKKwkJCWVudC0+ZmxhZ3MgJj0gfk1PTl9QRVJNSVQ7CisJCQllbnQtPmZsYWdzIHw9IHBlcm1pdCA/IE1PTl9QRVJNSVQgOiAwOworCQkJcmV0dXJuOworCQl9CisJCWVudCsrOworCX0KK30KKworc3RhdGljIHZvaWQKK21vbml0b3JfcGVybWl0X2F1dGhlbnRpY2F0aW9ucyhpbnQgcGVybWl0KQoreworCXN0cnVjdCBtb25fdGFibGUgKmVudCA9IG1vbl9kaXNwYXRjaDsKKworCXdoaWxlIChlbnQtPmYgIT0gTlVMTCkgeworCQlpZiAoZW50LT5mbGFncyAmIE1PTl9BVVRIKSB7CisJCQllbnQtPmZsYWdzICY9IH5NT05fUEVSTUlUOworCQkJZW50LT5mbGFncyB8PSBwZXJtaXQgPyBNT05fUEVSTUlUIDogMDsKKwkJfQorCQllbnQrKzsKKwl9Cit9CisKK3ZvaWQKK21vbml0b3JfY2hpbGRfcHJlYXV0aChBdXRoY3R4dCAqX2F1dGhjdHh0LCBzdHJ1Y3QgbW9uaXRvciAqcG1vbml0b3IpCit7CisJc3RydWN0IG1vbl90YWJsZSAqZW50OworCWludCBhdXRoZW50aWNhdGVkID0gMDsKKworCWRlYnVnMygicHJlYXV0aCBjaGlsZCBtb25pdG9yIHN0YXJ0ZWQiKTsKKworCWNsb3NlKHBtb25pdG9yLT5tX3JlY3ZmZCk7CisJY2xvc2UocG1vbml0b3ItPm1fbG9nX3NlbmRmZCk7CisJcG1vbml0b3ItPm1fbG9nX3NlbmRmZCA9IHBtb25pdG9yLT5tX3JlY3ZmZCA9IC0xOworCisJYXV0aGN0eHQgPSBfYXV0aGN0eHQ7CisJbWVtc2V0KGF1dGhjdHh0LCAwLCBzaXplb2YoKmF1dGhjdHh0KSk7CisKKwlhdXRoY3R4dC0+bG9naW5tc2cgPSAmbG9naW5tc2c7CisKKwlpZiAoY29tcGF0MjApIHsKKwkJbW9uX2Rpc3BhdGNoID0gbW9uX2Rpc3BhdGNoX3Byb3RvMjA7CisKKwkJLyogUGVybWl0IHJlcXVlc3RzIGZvciBtb2R1bGkgYW5kIHNpZ25hdHVyZXMgKi8KKwkJbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9NT0RVTEksIDEpOworCQltb25pdG9yX3Blcm1pdChtb25fZGlzcGF0Y2gsIE1PTklUT1JfUkVRX1NJR04sIDEpOworCX0gZWxzZSB7CisJCW1vbl9kaXNwYXRjaCA9IG1vbl9kaXNwYXRjaF9wcm90bzE1OworCisJCW1vbml0b3JfcGVybWl0KG1vbl9kaXNwYXRjaCwgTU9OSVRPUl9SRVFfU0VTU0tFWSwgMSk7CisJfQorCisJLyogVGhlIGZpcnN0IGZldyByZXF1ZXN0cyBkbyBub3QgcmVxdWlyZSBhc3luY2hyb25vdXMgYWNjZXNzICovCisJd2hpbGUgKCFhdXRoZW50aWNhdGVkKSB7CisJCWF1dGhfbWV0aG9kID0gInVua25vd24iOworCQlhdXRoZW50aWNhdGVkID0gKG1vbml0b3JfcmVhZChwbW9uaXRvciwgbW9uX2Rpc3BhdGNoLCAmZW50KSA9PSAxKTsKKwkJaWYgKGF1dGhlbnRpY2F0ZWQpIHsKKwkJCWlmICghKGVudC0+ZmxhZ3MgJiBNT05fQVVUSERFQ0lERSkpCisJCQkJZmF0YWwoIiVzOiB1bmV4cGVjdGVkIGF1dGhlbnRpY2F0aW9uIGZyb20gJWQiLAorCQkJCSAgICBfX2Z1bmNfXywgZW50LT50eXBlKTsKKwkJCWlmIChhdXRoY3R4dC0+cHctPnB3X3VpZCA9PSAwICYmCisJCQkgICAgIWF1dGhfcm9vdF9hbGxvd2VkKGF1dGhfbWV0aG9kKSkKKwkJCQlhdXRoZW50aWNhdGVkID0gMDsKKyNpZmRlZiBVU0VfUEFNCisJCQkvKiBQQU0gbmVlZHMgdG8gcGVyZm9ybSBhY2NvdW50IGNoZWNrcyBhZnRlciBhdXRoICovCisJCQlpZiAob3B0aW9ucy51c2VfcGFtICYmIGF1dGhlbnRpY2F0ZWQpIHsKKwkJCQlCdWZmZXIgbTsKKworCQkJCWJ1ZmZlcl9pbml0KCZtKTsKKwkJCQltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3NlbmRmZCwKKwkJCQkgICAgTU9OSVRPUl9SRVFfUEFNX0FDQ09VTlQsICZtKTsKKwkJCQlhdXRoZW50aWNhdGVkID0gbW1fYW5zd2VyX3BhbV9hY2NvdW50KHBtb25pdG9yLT5tX3NlbmRmZCwgJm0pOworCQkJCWJ1ZmZlcl9mcmVlKCZtKTsKKwkJCX0KKyNlbmRpZgorCQl9CisKKwkJaWYgKGVudC0+ZmxhZ3MgJiAoTU9OX0FVVEhERUNJREV8TU9OX0FMT0cpKSB7CisJCQlhdXRoX2xvZyhhdXRoY3R4dCwgYXV0aGVudGljYXRlZCwgYXV0aF9tZXRob2QsCisJCQkgICAgY29tcGF0MjAgPyAiIHNzaDIiIDogIiIpOworCQkJaWYgKCFhdXRoZW50aWNhdGVkKQorCQkJCWF1dGhjdHh0LT5mYWlsdXJlcysrOworCQl9CisjaWZkZWYgSlBBS0UKKwkJLyogQ2xlYW51cCBKUEFLRSBjb250ZXh0IGFmdGVyIGF1dGhlbnRpY2F0aW9uICovCisJCWlmIChlbnQtPmZsYWdzICYgTU9OX0FVVEhERUNJREUpIHsKKwkJCWlmIChhdXRoY3R4dC0+anBha2VfY3R4ICE9IE5VTEwpIHsKKwkJCQlqcGFrZV9mcmVlKGF1dGhjdHh0LT5qcGFrZV9jdHgpOworCQkJCWF1dGhjdHh0LT5qcGFrZV9jdHggPSBOVUxMOworCQkJfQorCQl9CisjZW5kaWYKKwl9CisKKwkvKiBEcmFpbiBhbnkgYnVmZmVyZWQgbWVzc2FnZXMgZnJvbSB0aGUgY2hpbGQgKi8KKwl3aGlsZSAocG1vbml0b3ItPm1fbG9nX3JlY3ZmZCAhPSAtMSAmJiBtb25pdG9yX3JlYWRfbG9nKHBtb25pdG9yKSA9PSAwKQorCQk7CisKKwlpZiAoIWF1dGhjdHh0LT52YWxpZCkKKwkJZmF0YWwoIiVzOiBhdXRoZW50aWNhdGVkIGludmFsaWQgdXNlciIsIF9fZnVuY19fKTsKKwlpZiAoc3RyY21wKGF1dGhfbWV0aG9kLCAidW5rbm93biIpID09IDApCisJCWZhdGFsKCIlczogYXV0aGVudGljYXRpb24gbWV0aG9kIG5hbWUgdW5rbm93biIsIF9fZnVuY19fKTsKKworCWRlYnVnKCIlczogJXMgaGFzIGJlZW4gYXV0aGVudGljYXRlZCBieSBwcml2aWxlZ2VkIHByb2Nlc3MiLAorCSAgICBfX2Z1bmNfXywgYXV0aGN0eHQtPnVzZXIpOworCisJbW1fZ2V0X2tleXN0YXRlKHBtb25pdG9yKTsKKworCWNsb3NlKHBtb25pdG9yLT5tX3NlbmRmZCk7CisJY2xvc2UocG1vbml0b3ItPm1fbG9nX3JlY3ZmZCk7CisJcG1vbml0b3ItPm1fc2VuZGZkID0gcG1vbml0b3ItPm1fbG9nX3JlY3ZmZCA9IC0xOworfQorCitzdGF0aWMgdm9pZAorbW9uaXRvcl9zZXRfY2hpbGRfaGFuZGxlcihwaWRfdCBwaWQpCit7CisJbW9uaXRvcl9jaGlsZF9waWQgPSBwaWQ7Cit9CisKK3N0YXRpYyB2b2lkCittb25pdG9yX2NoaWxkX2hhbmRsZXIoaW50IHNpZykKK3sKKwlraWxsKG1vbml0b3JfY2hpbGRfcGlkLCBzaWcpOworfQorCit2b2lkCittb25pdG9yX2NoaWxkX3Bvc3RhdXRoKHN0cnVjdCBtb25pdG9yICpwbW9uaXRvcikKK3sKKwljbG9zZShwbW9uaXRvci0+bV9yZWN2ZmQpOworCXBtb25pdG9yLT5tX3JlY3ZmZCA9IC0xOworCisJbW9uaXRvcl9zZXRfY2hpbGRfaGFuZGxlcihwbW9uaXRvci0+bV9waWQpOworCXNpZ25hbChTSUdIVVAsICZtb25pdG9yX2NoaWxkX2hhbmRsZXIpOworCXNpZ25hbChTSUdURVJNLCAmbW9uaXRvcl9jaGlsZF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHSU5ULCAmbW9uaXRvcl9jaGlsZF9oYW5kbGVyKTsKKworCWlmIChjb21wYXQyMCkgeworCQltb25fZGlzcGF0Y2ggPSBtb25fZGlzcGF0Y2hfcG9zdGF1dGgyMDsKKworCQkvKiBQZXJtaXQgcmVxdWVzdHMgZm9yIG1vZHVsaSBhbmQgc2lnbmF0dXJlcyAqLworCQltb25pdG9yX3Blcm1pdChtb25fZGlzcGF0Y2gsIE1PTklUT1JfUkVRX01PRFVMSSwgMSk7CisJCW1vbml0b3JfcGVybWl0KG1vbl9kaXNwYXRjaCwgTU9OSVRPUl9SRVFfU0lHTiwgMSk7CisJCW1vbml0b3JfcGVybWl0KG1vbl9kaXNwYXRjaCwgTU9OSVRPUl9SRVFfVEVSTSwgMSk7CisJfSBlbHNlIHsKKwkJbW9uX2Rpc3BhdGNoID0gbW9uX2Rpc3BhdGNoX3Bvc3RhdXRoMTU7CisJCW1vbml0b3JfcGVybWl0KG1vbl9kaXNwYXRjaCwgTU9OSVRPUl9SRVFfVEVSTSwgMSk7CisJfQorCWlmICghbm9fcHR5X2ZsYWcpIHsKKwkJbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9QVFksIDEpOworCQltb25pdG9yX3Blcm1pdChtb25fZGlzcGF0Y2gsIE1PTklUT1JfUkVRX1BUWUNMRUFOVVAsIDEpOworCX0KKworCWZvciAoOzspCisJCW1vbml0b3JfcmVhZChwbW9uaXRvciwgbW9uX2Rpc3BhdGNoLCBOVUxMKTsKKworCWNsb3NlKHBtb25pdG9yLT5tX3NlbmRmZCk7CisJcG1vbml0b3ItPm1fc2VuZGZkID0gLTE7Cit9CisKK3ZvaWQKK21vbml0b3Jfc3luYyhzdHJ1Y3QgbW9uaXRvciAqcG1vbml0b3IpCit7CisJaWYgKG9wdGlvbnMuY29tcHJlc3Npb24pIHsKKwkJLyogVGhlIG1lbWJlciBhbGxvY2F0aW9uIGlzIG5vdCB2aXNpYmxlLCBzbyBzeW5jIGl0ICovCisJCW1tX3NoYXJlX3N5bmMoJnBtb25pdG9yLT5tX3psaWIsICZwbW9uaXRvci0+bV96YmFjayk7CisJfQorfQorCitzdGF0aWMgaW50Cittb25pdG9yX3JlYWRfbG9nKHN0cnVjdCBtb25pdG9yICpwbW9uaXRvcikKK3sKKwlCdWZmZXIgbG9nbXNnOworCXVfaW50IGxlbiwgbGV2ZWw7CisJY2hhciAqbXNnOworCisJYnVmZmVyX2luaXQoJmxvZ21zZyk7CisKKwkvKiBSZWFkIGxlbmd0aCAqLworCWJ1ZmZlcl9hcHBlbmRfc3BhY2UoJmxvZ21zZywgNCk7CisJaWYgKGF0b21pY2lvKHJlYWQsIHBtb25pdG9yLT5tX2xvZ19yZWN2ZmQsCisJICAgIGJ1ZmZlcl9wdHIoJmxvZ21zZyksIGJ1ZmZlcl9sZW4oJmxvZ21zZykpICE9IGJ1ZmZlcl9sZW4oJmxvZ21zZykpIHsKKwkJaWYgKGVycm5vID09IEVQSVBFKSB7CisJCQlidWZmZXJfZnJlZSgmbG9nbXNnKTsKKwkJCWRlYnVnKCIlczogY2hpbGQgbG9nIGZkIGNsb3NlZCIsIF9fZnVuY19fKTsKKwkJCWNsb3NlKHBtb25pdG9yLT5tX2xvZ19yZWN2ZmQpOworCQkJcG1vbml0b3ItPm1fbG9nX3JlY3ZmZCA9IC0xOworCQkJcmV0dXJuIC0xOworCQl9CisJCWZhdGFsKCIlczogbG9nIGZkIHJlYWQ6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJfQorCWxlbiA9IGJ1ZmZlcl9nZXRfaW50KCZsb2dtc2cpOworCWlmIChsZW4gPD0gNCB8fCBsZW4gPiA4MTkyKQorCQlmYXRhbCgiJXM6IGludmFsaWQgbG9nIG1lc3NhZ2UgbGVuZ3RoICV1IiwgX19mdW5jX18sIGxlbik7CisKKwkvKiBSZWFkIHNldmVyaXR5LCBtZXNzYWdlICovCisJYnVmZmVyX2NsZWFyKCZsb2dtc2cpOworCWJ1ZmZlcl9hcHBlbmRfc3BhY2UoJmxvZ21zZywgbGVuKTsKKwlpZiAoYXRvbWljaW8ocmVhZCwgcG1vbml0b3ItPm1fbG9nX3JlY3ZmZCwKKwkgICAgYnVmZmVyX3B0cigmbG9nbXNnKSwgYnVmZmVyX2xlbigmbG9nbXNnKSkgIT0gYnVmZmVyX2xlbigmbG9nbXNnKSkKKwkJZmF0YWwoIiVzOiBsb2cgZmQgcmVhZDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKworCS8qIExvZyBpdCAqLworCWxldmVsID0gYnVmZmVyX2dldF9pbnQoJmxvZ21zZyk7CisJbXNnID0gYnVmZmVyX2dldF9zdHJpbmcoJmxvZ21zZywgTlVMTCk7CisJaWYgKGxvZ19sZXZlbF9uYW1lKGxldmVsKSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IGludmFsaWQgbG9nIGxldmVsICV1IChjb3JydXB0ZWQgbWVzc2FnZT8pIiwKKwkJICAgIF9fZnVuY19fLCBsZXZlbCk7CisJZG9fbG9nMihsZXZlbCwgIiVzIFtwcmVhdXRoXSIsIG1zZyk7CisKKwlidWZmZXJfZnJlZSgmbG9nbXNnKTsKKwl4ZnJlZShtc2cpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAorbW9uaXRvcl9yZWFkKHN0cnVjdCBtb25pdG9yICpwbW9uaXRvciwgc3RydWN0IG1vbl90YWJsZSAqZW50LAorICAgIHN0cnVjdCBtb25fdGFibGUgKipwZW50KQoreworCUJ1ZmZlciBtOworCWludCByZXQ7CisJdV9jaGFyIHR5cGU7CisJc3RydWN0IHBvbGxmZCBwZmRbMl07CisKKwlmb3IgKDs7KSB7CisJCWJ6ZXJvKCZwZmQsIHNpemVvZihwZmQpKTsKKwkJcGZkWzBdLmZkID0gcG1vbml0b3ItPm1fc2VuZGZkOworCQlwZmRbMF0uZXZlbnRzID0gUE9MTElOOworCQlwZmRbMV0uZmQgPSBwbW9uaXRvci0+bV9sb2dfcmVjdmZkOworCQlwZmRbMV0uZXZlbnRzID0gcGZkWzFdLmZkID09IC0xID8gMCA6IFBPTExJTjsKKwkJaWYgKHBvbGwocGZkLCBwZmRbMV0uZmQgPT0gLTEgPyAxIDogMiwgLTEpID09IC0xKSB7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOKQorCQkJCWNvbnRpbnVlOworCQkJZmF0YWwoIiVzOiBwb2xsOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCQl9CisJCWlmIChwZmRbMV0ucmV2ZW50cykgeworCQkJLyoKKwkJCSAqIERyYWluIGFsbCBsb2cgbWVzc2FnZXMgYmVmb3JlIHByb2Nlc3NpbmcgbmV4dAorCQkJICogbW9uaXRvciByZXF1ZXN0LgorCQkJICovCisJCQltb25pdG9yX3JlYWRfbG9nKHBtb25pdG9yKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChwZmRbMF0ucmV2ZW50cykKKwkJCWJyZWFrOyAgLyogQ29udGludWVzIGJlbG93ICovCisJfQorCisJYnVmZmVyX2luaXQoJm0pOworCisJbW1fcmVxdWVzdF9yZWNlaXZlKHBtb25pdG9yLT5tX3NlbmRmZCwgJm0pOworCXR5cGUgPSBidWZmZXJfZ2V0X2NoYXIoJm0pOworCisJZGVidWczKCIlczogY2hlY2tpbmcgcmVxdWVzdCAlZCIsIF9fZnVuY19fLCB0eXBlKTsKKworCXdoaWxlIChlbnQtPmYgIT0gTlVMTCkgeworCQlpZiAoZW50LT50eXBlID09IHR5cGUpCisJCQlicmVhazsKKwkJZW50Kys7CisJfQorCisJaWYgKGVudC0+ZiAhPSBOVUxMKSB7CisJCWlmICghKGVudC0+ZmxhZ3MgJiBNT05fUEVSTUlUKSkKKwkJCWZhdGFsKCIlczogdW5wZXJtaXR0ZWQgcmVxdWVzdCAlZCIsIF9fZnVuY19fLAorCQkJICAgIHR5cGUpOworCQlyZXQgPSAoKmVudC0+ZikocG1vbml0b3ItPm1fc2VuZGZkLCAmbSk7CisJCWJ1ZmZlcl9mcmVlKCZtKTsKKworCQkvKiBUaGUgY2hpbGQgbWF5IHVzZSB0aGlzIHJlcXVlc3Qgb25seSBvbmNlLCBkaXNhYmxlIGl0ICovCisJCWlmIChlbnQtPmZsYWdzICYgTU9OX09OQ0UpIHsKKwkJCWRlYnVnMigiJXM6ICVkIHVzZWQgb25jZSwgZGlzYWJsaW5nIG5vdyIsIF9fZnVuY19fLAorCQkJICAgIHR5cGUpOworCQkJZW50LT5mbGFncyAmPSB+TU9OX1BFUk1JVDsKKwkJfQorCisJCWlmIChwZW50ICE9IE5VTEwpCisJCQkqcGVudCA9IGVudDsKKworCQlyZXR1cm4gcmV0OworCX0KKworCWZhdGFsKCIlczogdW5zdXBwb3J0ZWQgcmVxdWVzdDogJWQiLCBfX2Z1bmNfXywgdHlwZSk7CisKKwkvKiBOT1RSRUFDSEVEICovCisJcmV0dXJuICgtMSk7Cit9CisKKy8qIGFsbG93ZWQga2V5IHN0YXRlICovCitzdGF0aWMgaW50Cittb25pdG9yX2FsbG93ZWRfa2V5KHVfY2hhciAqYmxvYiwgdV9pbnQgYmxvYmxlbikKK3sKKwkvKiBtYWtlIHN1cmUga2V5IGlzIGFsbG93ZWQgKi8KKwlpZiAoa2V5X2Jsb2IgPT0gTlVMTCB8fCBrZXlfYmxvYmxlbiAhPSBibG9ibGVuIHx8CisJICAgIHRpbWluZ3NhZmVfYmNtcChrZXlfYmxvYiwgYmxvYiwga2V5X2Jsb2JsZW4pKQorCQlyZXR1cm4gKDApOworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCittb25pdG9yX3Jlc2V0X2tleV9zdGF0ZSh2b2lkKQoreworCS8qIHJlc2V0IHN0YXRlICovCisJaWYgKGtleV9ibG9iICE9IE5VTEwpCisJCXhmcmVlKGtleV9ibG9iKTsKKwlpZiAoaG9zdGJhc2VkX2N1c2VyICE9IE5VTEwpCisJCXhmcmVlKGhvc3RiYXNlZF9jdXNlcik7CisJaWYgKGhvc3RiYXNlZF9jaG9zdCAhPSBOVUxMKQorCQl4ZnJlZShob3N0YmFzZWRfY2hvc3QpOworCWtleV9ibG9iID0gTlVMTDsKKwlrZXlfYmxvYmxlbiA9IDA7CisJa2V5X2Jsb2J0eXBlID0gTU1fTk9LRVk7CisJaG9zdGJhc2VkX2N1c2VyID0gTlVMTDsKKwlob3N0YmFzZWRfY2hvc3QgPSBOVUxMOworfQorCitpbnQKK21tX2Fuc3dlcl9tb2R1bGkoaW50IHNvY2ssIEJ1ZmZlciAqbSkKK3sKKwlESCAqZGg7CisJaW50IG1pbiwgd2FudCwgbWF4OworCisJbWluID0gYnVmZmVyX2dldF9pbnQobSk7CisJd2FudCA9IGJ1ZmZlcl9nZXRfaW50KG0pOworCW1heCA9IGJ1ZmZlcl9nZXRfaW50KG0pOworCisJZGVidWczKCIlczogZ290IHBhcmFtZXRlcnM6ICVkICVkICVkIiwKKwkgICAgX19mdW5jX18sIG1pbiwgd2FudCwgbWF4KTsKKwkvKiBXZSBuZWVkIHRvIGNoZWNrIGhlcmUsIHRvbywgaW4gY2FzZSB0aGUgY2hpbGQgZ290IGNvcnJ1cHRlZCAqLworCWlmIChtYXggPCBtaW4gfHwgd2FudCA8IG1pbiB8fCBtYXggPCB3YW50KQorCQlmYXRhbCgiJXM6IGJhZCBwYXJhbWV0ZXJzOiAlZCAlZCAlZCIsCisJCSAgICBfX2Z1bmNfXywgbWluLCB3YW50LCBtYXgpOworCisJYnVmZmVyX2NsZWFyKG0pOworCisJZGggPSBjaG9vc2VfZGgobWluLCB3YW50LCBtYXgpOworCWlmIChkaCA9PSBOVUxMKSB7CisJCWJ1ZmZlcl9wdXRfY2hhcihtLCAwKTsKKwkJcmV0dXJuICgwKTsKKwl9IGVsc2UgeworCQkvKiBTZW5kIGZpcnN0IGJpZ251bSAqLworCQlidWZmZXJfcHV0X2NoYXIobSwgMSk7CisJCWJ1ZmZlcl9wdXRfYmlnbnVtMihtLCBkaC0+cCk7CisJCWJ1ZmZlcl9wdXRfYmlnbnVtMihtLCBkaC0+Zyk7CisKKwkJREhfZnJlZShkaCk7CisJfQorCW1tX3JlcXVlc3Rfc2VuZChzb2NrLCBNT05JVE9SX0FOU19NT0RVTEksIG0pOworCXJldHVybiAoMCk7Cit9CisKK2ludAorbW1fYW5zd2VyX3NpZ24oaW50IHNvY2ssIEJ1ZmZlciAqbSkKK3sKKwlLZXkgKmtleTsKKwl1X2NoYXIgKnA7CisJdV9jaGFyICpzaWduYXR1cmU7CisJdV9pbnQgc2lnbGVuLCBkYXRsZW47CisJaW50IGtleWlkOworCisJZGVidWczKCIlcyIsIF9fZnVuY19fKTsKKworCWtleWlkID0gYnVmZmVyX2dldF9pbnQobSk7CisJcCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKG0sICZkYXRsZW4pOworCisJLyoKKwkgKiBTdXBwb3J0ZWQgS0VYIHR5cGVzIHVzZSBTSEExICgyMCBieXRlcyksIFNIQTI1NiAoMzIgYnl0ZXMpLAorCSAqIFNIQTM4NCAoNDggYnl0ZXMpIGFuZCBTSEE1MTIgKDY0IGJ5dGVzKS4KKwkgKi8KKwlpZiAoZGF0bGVuICE9IDIwICYmIGRhdGxlbiAhPSAzMiAmJiBkYXRsZW4gIT0gNDggJiYgZGF0bGVuICE9IDY0KQorCQlmYXRhbCgiJXM6IGRhdGEgbGVuZ3RoIGluY29ycmVjdDogJXUiLCBfX2Z1bmNfXywgZGF0bGVuKTsKKworCS8qIHNhdmUgc2Vzc2lvbiBpZCwgaXQgd2lsbCBiZSBwYXNzZWQgb24gdGhlIGZpcnN0IGNhbGwgKi8KKwlpZiAoc2Vzc2lvbl9pZDJfbGVuID09IDApIHsKKwkJc2Vzc2lvbl9pZDJfbGVuID0gZGF0bGVuOworCQlzZXNzaW9uX2lkMiA9IHhtYWxsb2Moc2Vzc2lvbl9pZDJfbGVuKTsKKwkJbWVtY3B5KHNlc3Npb25faWQyLCBwLCBzZXNzaW9uX2lkMl9sZW4pOworCX0KKworCWlmICgoa2V5ID0gZ2V0X2hvc3RrZXlfYnlfaW5kZXgoa2V5aWQpKSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IG5vIGhvc3RrZXkgZnJvbSBpbmRleCAlZCIsIF9fZnVuY19fLCBrZXlpZCk7CisJaWYgKGtleV9zaWduKGtleSwgJnNpZ25hdHVyZSwgJnNpZ2xlbiwgcCwgZGF0bGVuKSA8IDApCisJCWZhdGFsKCIlczoga2V5X3NpZ24gZmFpbGVkIiwgX19mdW5jX18pOworCisJZGVidWczKCIlczogc2lnbmF0dXJlICVwKCV1KSIsIF9fZnVuY19fLCBzaWduYXR1cmUsIHNpZ2xlbik7CisKKwlidWZmZXJfY2xlYXIobSk7CisJYnVmZmVyX3B1dF9zdHJpbmcobSwgc2lnbmF0dXJlLCBzaWdsZW4pOworCisJeGZyZWUocCk7CisJeGZyZWUoc2lnbmF0dXJlKTsKKworCW1tX3JlcXVlc3Rfc2VuZChzb2NrLCBNT05JVE9SX0FOU19TSUdOLCBtKTsKKworCS8qIFR1cm4gb24gcGVybWlzc2lvbnMgZm9yIGdldHB3bmFtICovCisJbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9QV05BTSwgMSk7CisKKwlyZXR1cm4gKDApOworfQorCisvKiBSZXRyaWV2ZXMgdGhlIHBhc3N3b3JkIGVudHJ5IGFuZCBhbHNvIGNoZWNrcyBpZiB0aGUgdXNlciBpcyBwZXJtaXR0ZWQgKi8KKworaW50CittbV9hbnN3ZXJfcHduYW1hbGxvdyhpbnQgc29jaywgQnVmZmVyICptKQoreworCWNoYXIgKnVzZXJuYW1lOworCXN0cnVjdCBwYXNzd2QgKnB3ZW50OworCWludCBhbGxvd2VkID0gMDsKKwl1X2ludCBpOworCisJZGVidWczKCIlcyIsIF9fZnVuY19fKTsKKworCWlmIChhdXRoY3R4dC0+YXR0ZW1wdCsrICE9IDApCisJCWZhdGFsKCIlczogbXVsdGlwbGUgYXR0ZW1wdHMgZm9yIGdldHB3bmFtIiwgX19mdW5jX18pOworCisJdXNlcm5hbWUgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCBOVUxMKTsKKworCXB3ZW50ID0gZ2V0cHduYW1hbGxvdyh1c2VybmFtZSk7CisKKwlhdXRoY3R4dC0+dXNlciA9IHhzdHJkdXAodXNlcm5hbWUpOworCXNldHByb2N0aXRsZSgiJXMgW3ByaXZdIiwgcHdlbnQgPyB1c2VybmFtZSA6ICJ1bmtub3duIik7CisJeGZyZWUodXNlcm5hbWUpOworCisJYnVmZmVyX2NsZWFyKG0pOworCisJaWYgKHB3ZW50ID09IE5VTEwpIHsKKwkJYnVmZmVyX3B1dF9jaGFyKG0sIDApOworCQlhdXRoY3R4dC0+cHcgPSBmYWtlcHcoKTsKKwkJZ290byBvdXQ7CisJfQorCisJYWxsb3dlZCA9IDE7CisJYXV0aGN0eHQtPnB3ID0gcHdlbnQ7CisJYXV0aGN0eHQtPnZhbGlkID0gMTsKKworCWJ1ZmZlcl9wdXRfY2hhcihtLCAxKTsKKwlidWZmZXJfcHV0X3N0cmluZyhtLCBwd2VudCwgc2l6ZW9mKHN0cnVjdCBwYXNzd2QpKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcobSwgcHdlbnQtPnB3X25hbWUpOworCWJ1ZmZlcl9wdXRfY3N0cmluZyhtLCAiKiIpOworCWJ1ZmZlcl9wdXRfY3N0cmluZyhtLCBwd2VudC0+cHdfZ2Vjb3MpOworI2lmZGVmIEhBVkVfUFdfQ0xBU1NfSU5fUEFTU1dECisJYnVmZmVyX3B1dF9jc3RyaW5nKG0sIHB3ZW50LT5wd19jbGFzcyk7CisjZW5kaWYKKwlidWZmZXJfcHV0X2NzdHJpbmcobSwgcHdlbnQtPnB3X2Rpcik7CisJYnVmZmVyX3B1dF9jc3RyaW5nKG0sIHB3ZW50LT5wd19zaGVsbCk7CisKKyBvdXQ6CisJYnVmZmVyX3B1dF9zdHJpbmcobSwgJm9wdGlvbnMsIHNpemVvZihvcHRpb25zKSk7CisKKyNkZWZpbmUgTV9DUF9TVFJPUFQoeCkgZG8geyBcCisJCWlmIChvcHRpb25zLnggIT0gTlVMTCkgXAorCQkJYnVmZmVyX3B1dF9jc3RyaW5nKG0sIG9wdGlvbnMueCk7IFwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBNX0NQX1NUUkFSUkFZT1BUKHgsIG54KSBkbyB7IFwKKwkJZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubng7IGkrKykgXAorCQkJYnVmZmVyX3B1dF9jc3RyaW5nKG0sIG9wdGlvbnMueFtpXSk7IFwKKwl9IHdoaWxlICgwKQorCS8qIFNlZSBjb21tZW50IGluIHNlcnZjb25mLmggKi8KKwlDT1BZX01BVENIX1NUUklOR19PUFRTKCk7CisjdW5kZWYgTV9DUF9TVFJPUFQKKyN1bmRlZiBNX0NQX1NUUkFSUkFZT1BUCisJCisJZGVidWczKCIlczogc2VuZGluZyBNT05JVE9SX0FOU19QV05BTTogJWQiLCBfX2Z1bmNfXywgYWxsb3dlZCk7CisJbW1fcmVxdWVzdF9zZW5kKHNvY2ssIE1PTklUT1JfQU5TX1BXTkFNLCBtKTsKKworCS8qIEZvciBTU0h2MSBhbGxvdyBhdXRoZW50aWNhdGlvbiBub3cgKi8KKwlpZiAoIWNvbXBhdDIwKQorCQltb25pdG9yX3Blcm1pdF9hdXRoZW50aWNhdGlvbnMoMSk7CisJZWxzZSB7CisJCS8qIEFsbG93IHNlcnZpY2Uvc3R5bGUgaW5mb3JtYXRpb24gb24gdGhlIGF1dGggY29udGV4dCAqLworCQltb25pdG9yX3Blcm1pdChtb25fZGlzcGF0Y2gsIE1PTklUT1JfUkVRX0FVVEhTRVJWLCAxKTsKKwkJbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9BVVRIMl9SRUFEX0JBTk5FUiwgMSk7CisJfQorI2lmZGVmIFVTRV9QQU0KKwlpZiAob3B0aW9ucy51c2VfcGFtKQorCQltb25pdG9yX3Blcm1pdChtb25fZGlzcGF0Y2gsIE1PTklUT1JfUkVRX1BBTV9TVEFSVCwgMSk7CisjZW5kaWYKKworCXJldHVybiAoMCk7Cit9CisKK2ludCBtbV9hbnN3ZXJfYXV0aDJfcmVhZF9iYW5uZXIoaW50IHNvY2ssIEJ1ZmZlciAqbSkKK3sKKwljaGFyICpiYW5uZXI7CisKKwlidWZmZXJfY2xlYXIobSk7CisJYmFubmVyID0gYXV0aDJfcmVhZF9iYW5uZXIoKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcobSwgYmFubmVyICE9IE5VTEwgPyBiYW5uZXIgOiAiIik7CisJbW1fcmVxdWVzdF9zZW5kKHNvY2ssIE1PTklUT1JfQU5TX0FVVEgyX1JFQURfQkFOTkVSLCBtKTsKKworCWlmIChiYW5uZXIgIT0gTlVMTCkKKwkJeGZyZWUoYmFubmVyKTsKKworCXJldHVybiAoMCk7Cit9CisKK2ludAorbW1fYW5zd2VyX2F1dGhzZXJ2KGludCBzb2NrLCBCdWZmZXIgKm0pCit7CisJbW9uaXRvcl9wZXJtaXRfYXV0aGVudGljYXRpb25zKDEpOworCisJYXV0aGN0eHQtPnNlcnZpY2UgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCBOVUxMKTsKKwlhdXRoY3R4dC0+c3R5bGUgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCBOVUxMKTsKKwlkZWJ1ZzMoIiVzOiBzZXJ2aWNlPSVzLCBzdHlsZT0lcyIsCisJICAgIF9fZnVuY19fLCBhdXRoY3R4dC0+c2VydmljZSwgYXV0aGN0eHQtPnN0eWxlKTsKKworCWlmIChzdHJsZW4oYXV0aGN0eHQtPnN0eWxlKSA9PSAwKSB7CisJCXhmcmVlKGF1dGhjdHh0LT5zdHlsZSk7CisJCWF1dGhjdHh0LT5zdHlsZSA9IE5VTEw7CisJfQorCisJcmV0dXJuICgwKTsKK30KKworaW50CittbV9hbnN3ZXJfYXV0aHBhc3N3b3JkKGludCBzb2NrLCBCdWZmZXIgKm0pCit7CisJc3RhdGljIGludCBjYWxsX2NvdW50OworCWNoYXIgKnBhc3N3ZDsKKwlpbnQgYXV0aGVudGljYXRlZDsKKwl1X2ludCBwbGVuOworCisJcGFzc3dkID0gYnVmZmVyX2dldF9zdHJpbmcobSwgJnBsZW4pOworCS8qIE9ubHkgYXV0aGVudGljYXRlIGlmIHRoZSBjb250ZXh0IGlzIHZhbGlkICovCisJYXV0aGVudGljYXRlZCA9IG9wdGlvbnMucGFzc3dvcmRfYXV0aGVudGljYXRpb24gJiYKKwkgICAgYXV0aF9wYXNzd29yZChhdXRoY3R4dCwgcGFzc3dkKTsKKwltZW1zZXQocGFzc3dkLCAwLCBzdHJsZW4ocGFzc3dkKSk7CisJeGZyZWUocGFzc3dkKTsKKworCWJ1ZmZlcl9jbGVhcihtKTsKKwlidWZmZXJfcHV0X2ludChtLCBhdXRoZW50aWNhdGVkKTsKKworCWRlYnVnMygiJXM6IHNlbmRpbmcgcmVzdWx0ICVkIiwgX19mdW5jX18sIGF1dGhlbnRpY2F0ZWQpOworCW1tX3JlcXVlc3Rfc2VuZChzb2NrLCBNT05JVE9SX0FOU19BVVRIUEFTU1dPUkQsIG0pOworCisJY2FsbF9jb3VudCsrOworCWlmIChwbGVuID09IDAgJiYgY2FsbF9jb3VudCA9PSAxKQorCQlhdXRoX21ldGhvZCA9ICJub25lIjsKKwllbHNlCisJCWF1dGhfbWV0aG9kID0gInBhc3N3b3JkIjsKKworCS8qIENhdXNlcyBtb25pdG9yIGxvb3AgdG8gdGVybWluYXRlIGlmIGF1dGhlbnRpY2F0ZWQgKi8KKwlyZXR1cm4gKGF1dGhlbnRpY2F0ZWQpOworfQorCisjaWZkZWYgQlNEX0FVVEgKK2ludAorbW1fYW5zd2VyX2JzZGF1dGhxdWVyeShpbnQgc29jaywgQnVmZmVyICptKQoreworCWNoYXIgKm5hbWUsICppbmZvdHh0OworCXVfaW50IG51bXByb21wdHM7CisJdV9pbnQgKmVjaG9fb247CisJY2hhciAqKnByb21wdHM7CisJdV9pbnQgc3VjY2VzczsKKworCXN1Y2Nlc3MgPSBic2RhdXRoX3F1ZXJ5KGF1dGhjdHh0LCAmbmFtZSwgJmluZm90eHQsICZudW1wcm9tcHRzLAorCSAgICAmcHJvbXB0cywgJmVjaG9fb24pIDwgMCA/IDAgOiAxOworCisJYnVmZmVyX2NsZWFyKG0pOworCWJ1ZmZlcl9wdXRfaW50KG0sIHN1Y2Nlc3MpOworCWlmIChzdWNjZXNzKQorCQlidWZmZXJfcHV0X2NzdHJpbmcobSwgcHJvbXB0c1swXSk7CisKKwlkZWJ1ZzMoIiVzOiBzZW5kaW5nIGNoYWxsZW5nZSBzdWNjZXNzOiAldSIsIF9fZnVuY19fLCBzdWNjZXNzKTsKKwltbV9yZXF1ZXN0X3NlbmQoc29jaywgTU9OSVRPUl9BTlNfQlNEQVVUSFFVRVJZLCBtKTsKKworCWlmIChzdWNjZXNzKSB7CisJCXhmcmVlKG5hbWUpOworCQl4ZnJlZShpbmZvdHh0KTsKKwkJeGZyZWUocHJvbXB0cyk7CisJCXhmcmVlKGVjaG9fb24pOworCX0KKworCXJldHVybiAoMCk7Cit9CisKK2ludAorbW1fYW5zd2VyX2JzZGF1dGhyZXNwb25kKGludCBzb2NrLCBCdWZmZXIgKm0pCit7CisJY2hhciAqcmVzcG9uc2U7CisJaW50IGF1dGhvazsKKworCWlmIChhdXRoY3R4dC0+YXMgPT0gMCkKKwkJZmF0YWwoIiVzOiBubyBic2QgYXV0aCBzZXNzaW9uIiwgX19mdW5jX18pOworCisJcmVzcG9uc2UgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCBOVUxMKTsKKwlhdXRob2sgPSBvcHRpb25zLmNoYWxsZW5nZV9yZXNwb25zZV9hdXRoZW50aWNhdGlvbiAmJgorCSAgICBhdXRoX3VzZXJyZXNwb25zZShhdXRoY3R4dC0+YXMsIHJlc3BvbnNlLCAwKTsKKwlhdXRoY3R4dC0+YXMgPSBOVUxMOworCWRlYnVnMygiJXM6IDwlcz4gPSA8JWQ+IiwgX19mdW5jX18sIHJlc3BvbnNlLCBhdXRob2spOworCXhmcmVlKHJlc3BvbnNlKTsKKworCWJ1ZmZlcl9jbGVhcihtKTsKKwlidWZmZXJfcHV0X2ludChtLCBhdXRob2spOworCisJZGVidWczKCIlczogc2VuZGluZyBhdXRoZW50aWNhdGVkOiAlZCIsIF9fZnVuY19fLCBhdXRob2spOworCW1tX3JlcXVlc3Rfc2VuZChzb2NrLCBNT05JVE9SX0FOU19CU0RBVVRIUkVTUE9ORCwgbSk7CisKKwlhdXRoX21ldGhvZCA9ICJic2RhdXRoIjsKKworCXJldHVybiAoYXV0aG9rICE9IDApOworfQorI2VuZGlmCisKKyNpZmRlZiBTS0VZCitpbnQKK21tX2Fuc3dlcl9za2V5cXVlcnkoaW50IHNvY2ssIEJ1ZmZlciAqbSkKK3sKKwlzdHJ1Y3Qgc2tleSBza2V5OworCWNoYXIgY2hhbGxlbmdlWzEwMjRdOworCXVfaW50IHN1Y2Nlc3M7CisKKwlzdWNjZXNzID0gX2NvbXBhdF9za2V5Y2hhbGxlbmdlKCZza2V5LCBhdXRoY3R4dC0+dXNlciwgY2hhbGxlbmdlLAorCSAgICBzaXplb2YoY2hhbGxlbmdlKSkgPCAwID8gMCA6IDE7CisKKwlidWZmZXJfY2xlYXIobSk7CisJYnVmZmVyX3B1dF9pbnQobSwgc3VjY2Vzcyk7CisJaWYgKHN1Y2Nlc3MpCisJCWJ1ZmZlcl9wdXRfY3N0cmluZyhtLCBjaGFsbGVuZ2UpOworCisJZGVidWczKCIlczogc2VuZGluZyBjaGFsbGVuZ2Ugc3VjY2VzczogJXUiLCBfX2Z1bmNfXywgc3VjY2Vzcyk7CisJbW1fcmVxdWVzdF9zZW5kKHNvY2ssIE1PTklUT1JfQU5TX1NLRVlRVUVSWSwgbSk7CisKKwlyZXR1cm4gKDApOworfQorCitpbnQKK21tX2Fuc3dlcl9za2V5cmVzcG9uZChpbnQgc29jaywgQnVmZmVyICptKQoreworCWNoYXIgKnJlc3BvbnNlOworCWludCBhdXRob2s7CisKKwlyZXNwb25zZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKG0sIE5VTEwpOworCisJYXV0aG9rID0gKG9wdGlvbnMuY2hhbGxlbmdlX3Jlc3BvbnNlX2F1dGhlbnRpY2F0aW9uICYmCisJICAgIGF1dGhjdHh0LT52YWxpZCAmJgorCSAgICBza2V5X2hhc2tleShhdXRoY3R4dC0+cHctPnB3X25hbWUpID09IDAgJiYKKwkgICAgc2tleV9wYXNzY2hlY2soYXV0aGN0eHQtPnB3LT5wd19uYW1lLCByZXNwb25zZSkgIT0gLTEpOworCisJeGZyZWUocmVzcG9uc2UpOworCisJYnVmZmVyX2NsZWFyKG0pOworCWJ1ZmZlcl9wdXRfaW50KG0sIGF1dGhvayk7CisKKwlkZWJ1ZzMoIiVzOiBzZW5kaW5nIGF1dGhlbnRpY2F0ZWQ6ICVkIiwgX19mdW5jX18sIGF1dGhvayk7CisJbW1fcmVxdWVzdF9zZW5kKHNvY2ssIE1PTklUT1JfQU5TX1NLRVlSRVNQT05ELCBtKTsKKworCWF1dGhfbWV0aG9kID0gInNrZXkiOworCisJcmV0dXJuIChhdXRob2sgIT0gMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIFVTRV9QQU0KK2ludAorbW1fYW5zd2VyX3BhbV9zdGFydChpbnQgc29jaywgQnVmZmVyICptKQoreworCWlmICghb3B0aW9ucy51c2VfcGFtKQorCQlmYXRhbCgiVXNlUEFNIG5vdCBzZXQsIGJ1dCBlbmRlZCB1cCBpbiAlcyBhbnl3YXkiLCBfX2Z1bmNfXyk7CisKKwlzdGFydF9wYW0oYXV0aGN0eHQpOworCisJbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9QQU1fQUNDT1VOVCwgMSk7CisKKwlyZXR1cm4gKDApOworfQorCitpbnQKK21tX2Fuc3dlcl9wYW1fYWNjb3VudChpbnQgc29jaywgQnVmZmVyICptKQoreworCXVfaW50IHJldDsKKworCWlmICghb3B0aW9ucy51c2VfcGFtKQorCQlmYXRhbCgiVXNlUEFNIG5vdCBzZXQsIGJ1dCBlbmRlZCB1cCBpbiAlcyBhbnl3YXkiLCBfX2Z1bmNfXyk7CisKKwlyZXQgPSBkb19wYW1fYWNjb3VudCgpOworCisJYnVmZmVyX3B1dF9pbnQobSwgcmV0KTsKKwlidWZmZXJfcHV0X3N0cmluZyhtLCBidWZmZXJfcHRyKCZsb2dpbm1zZyksIGJ1ZmZlcl9sZW4oJmxvZ2lubXNnKSk7CisKKwltbV9yZXF1ZXN0X3NlbmQoc29jaywgTU9OSVRPUl9BTlNfUEFNX0FDQ09VTlQsIG0pOworCisJcmV0dXJuIChyZXQpOworfQorCitzdGF0aWMgdm9pZCAqc3NocGFtX2N0eHQsICpzc2hwYW1fYXV0aG9rOworZXh0ZXJuIEtiZGludERldmljZSBzc2hwYW1fZGV2aWNlOworCitpbnQKK21tX2Fuc3dlcl9wYW1faW5pdF9jdHgoaW50IHNvY2ssIEJ1ZmZlciAqbSkKK3sKKworCWRlYnVnMygiJXMiLCBfX2Z1bmNfXyk7CisJYXV0aGN0eHQtPnVzZXIgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCBOVUxMKTsKKwlzc2hwYW1fY3R4dCA9IChzc2hwYW1fZGV2aWNlLmluaXRfY3R4KShhdXRoY3R4dCk7CisJc3NocGFtX2F1dGhvayA9IE5VTEw7CisJYnVmZmVyX2NsZWFyKG0pOworCWlmIChzc2hwYW1fY3R4dCAhPSBOVUxMKSB7CisJCW1vbml0b3JfcGVybWl0KG1vbl9kaXNwYXRjaCwgTU9OSVRPUl9SRVFfUEFNX0ZSRUVfQ1RYLCAxKTsKKwkJYnVmZmVyX3B1dF9pbnQobSwgMSk7CisJfSBlbHNlIHsKKwkJYnVmZmVyX3B1dF9pbnQobSwgMCk7CisJfQorCW1tX3JlcXVlc3Rfc2VuZChzb2NrLCBNT05JVE9SX0FOU19QQU1fSU5JVF9DVFgsIG0pOworCXJldHVybiAoMCk7Cit9CisKK2ludAorbW1fYW5zd2VyX3BhbV9xdWVyeShpbnQgc29jaywgQnVmZmVyICptKQoreworCWNoYXIgKm5hbWUgPSBOVUxMLCAqaW5mbyA9IE5VTEwsICoqcHJvbXB0cyA9IE5VTEw7CisJdV9pbnQgaSwgbnVtID0gMCwgKmVjaG9fb24gPSAwOworCWludCByZXQ7CisKKwlkZWJ1ZzMoIiVzIiwgX19mdW5jX18pOworCXNzaHBhbV9hdXRob2sgPSBOVUxMOworCXJldCA9IChzc2hwYW1fZGV2aWNlLnF1ZXJ5KShzc2hwYW1fY3R4dCwgJm5hbWUsICZpbmZvLCAmbnVtLCAmcHJvbXB0cywgJmVjaG9fb24pOworCWlmIChyZXQgPT0gMCAmJiBudW0gPT0gMCkKKwkJc3NocGFtX2F1dGhvayA9IHNzaHBhbV9jdHh0OworCWlmIChudW0gPiAxIHx8IG5hbWUgPT0gTlVMTCB8fCBpbmZvID09IE5VTEwpCisJCXJldCA9IC0xOworCWJ1ZmZlcl9jbGVhcihtKTsKKwlidWZmZXJfcHV0X2ludChtLCByZXQpOworCWJ1ZmZlcl9wdXRfY3N0cmluZyhtLCBuYW1lKTsKKwl4ZnJlZShuYW1lKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcobSwgaW5mbyk7CisJeGZyZWUoaW5mbyk7CisJYnVmZmVyX3B1dF9pbnQobSwgbnVtKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKKwkJYnVmZmVyX3B1dF9jc3RyaW5nKG0sIHByb21wdHNbaV0pOworCQl4ZnJlZShwcm9tcHRzW2ldKTsKKwkJYnVmZmVyX3B1dF9pbnQobSwgZWNob19vbltpXSk7CisJfQorCWlmIChwcm9tcHRzICE9IE5VTEwpCisJCXhmcmVlKHByb21wdHMpOworCWlmIChlY2hvX29uICE9IE5VTEwpCisJCXhmcmVlKGVjaG9fb24pOworCWF1dGhfbWV0aG9kID0gImtleWJvYXJkLWludGVyYWN0aXZlL3BhbSI7CisJbW1fcmVxdWVzdF9zZW5kKHNvY2ssIE1PTklUT1JfQU5TX1BBTV9RVUVSWSwgbSk7CisJcmV0dXJuICgwKTsKK30KKworaW50CittbV9hbnN3ZXJfcGFtX3Jlc3BvbmQoaW50IHNvY2ssIEJ1ZmZlciAqbSkKK3sKKwljaGFyICoqcmVzcDsKKwl1X2ludCBpLCBudW07CisJaW50IHJldDsKKworCWRlYnVnMygiJXMiLCBfX2Z1bmNfXyk7CisJc3NocGFtX2F1dGhvayA9IE5VTEw7CisJbnVtID0gYnVmZmVyX2dldF9pbnQobSk7CisJaWYgKG51bSA+IDApIHsKKwkJcmVzcCA9IHhjYWxsb2MobnVtLCBzaXplb2YoY2hhciAqKSk7CisJCWZvciAoaSA9IDA7IGkgPCBudW07ICsraSkKKwkJCXJlc3BbaV0gPSBidWZmZXJfZ2V0X3N0cmluZyhtLCBOVUxMKTsKKwkJcmV0ID0gKHNzaHBhbV9kZXZpY2UucmVzcG9uZCkoc3NocGFtX2N0eHQsIG51bSwgcmVzcCk7CisJCWZvciAoaSA9IDA7IGkgPCBudW07ICsraSkKKwkJCXhmcmVlKHJlc3BbaV0pOworCQl4ZnJlZShyZXNwKTsKKwl9IGVsc2UgeworCQlyZXQgPSAoc3NocGFtX2RldmljZS5yZXNwb25kKShzc2hwYW1fY3R4dCwgbnVtLCBOVUxMKTsKKwl9CisJYnVmZmVyX2NsZWFyKG0pOworCWJ1ZmZlcl9wdXRfaW50KG0sIHJldCk7CisJbW1fcmVxdWVzdF9zZW5kKHNvY2ssIE1PTklUT1JfQU5TX1BBTV9SRVNQT05ELCBtKTsKKwlhdXRoX21ldGhvZCA9ICJrZXlib2FyZC1pbnRlcmFjdGl2ZS9wYW0iOworCWlmIChyZXQgPT0gMCkKKwkJc3NocGFtX2F1dGhvayA9IHNzaHBhbV9jdHh0OworCXJldHVybiAoMCk7Cit9CisKK2ludAorbW1fYW5zd2VyX3BhbV9mcmVlX2N0eChpbnQgc29jaywgQnVmZmVyICptKQoreworCisJZGVidWczKCIlcyIsIF9fZnVuY19fKTsKKwkoc3NocGFtX2RldmljZS5mcmVlX2N0eCkoc3NocGFtX2N0eHQpOworCWJ1ZmZlcl9jbGVhcihtKTsKKwltbV9yZXF1ZXN0X3NlbmQoc29jaywgTU9OSVRPUl9BTlNfUEFNX0ZSRUVfQ1RYLCBtKTsKKwlhdXRoX21ldGhvZCA9ICJrZXlib2FyZC1pbnRlcmFjdGl2ZS9wYW0iOworCXJldHVybiAoc3NocGFtX2F1dGhvayA9PSBzc2hwYW1fY3R4dCk7Cit9CisjZW5kaWYKKworaW50CittbV9hbnN3ZXJfa2V5YWxsb3dlZChpbnQgc29jaywgQnVmZmVyICptKQoreworCUtleSAqa2V5OworCWNoYXIgKmN1c2VyLCAqY2hvc3Q7CisJdV9jaGFyICpibG9iOworCXVfaW50IGJsb2JsZW47CisJZW51bSBtbV9rZXl0eXBlIHR5cGUgPSAwOworCWludCBhbGxvd2VkID0gMDsKKworCWRlYnVnMygiJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7CisKKwl0eXBlID0gYnVmZmVyX2dldF9pbnQobSk7CisJY3VzZXIgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCBOVUxMKTsKKwljaG9zdCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKG0sIE5VTEwpOworCWJsb2IgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCAmYmxvYmxlbik7CisKKwlrZXkgPSBrZXlfZnJvbV9ibG9iKGJsb2IsIGJsb2JsZW4pOworCisJaWYgKChjb21wYXQyMCAmJiB0eXBlID09IE1NX1JTQUhPU1RLRVkpIHx8CisJICAgICghY29tcGF0MjAgJiYgdHlwZSAhPSBNTV9SU0FIT1NUS0VZKSkKKwkJZmF0YWwoIiVzOiBrZXkgdHlwZSBhbmQgcHJvdG9jb2wgbWlzbWF0Y2giLCBfX2Z1bmNfXyk7CisKKwlkZWJ1ZzMoIiVzOiBrZXlfZnJvbV9ibG9iOiAlcCIsIF9fZnVuY19fLCBrZXkpOworCisJaWYgKGtleSAhPSBOVUxMICYmIGF1dGhjdHh0LT52YWxpZCkgeworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBNTV9VU0VSS0VZOgorCQkJYWxsb3dlZCA9IG9wdGlvbnMucHVia2V5X2F1dGhlbnRpY2F0aW9uICYmCisJCQkgICAgdXNlcl9rZXlfYWxsb3dlZChhdXRoY3R4dC0+cHcsIGtleSk7CisJCQlhdXRoX21ldGhvZCA9ICJwdWJsaWNrZXkiOworCQkJaWYgKG9wdGlvbnMucHVia2V5X2F1dGhlbnRpY2F0aW9uICYmIGFsbG93ZWQgIT0gMSkKKwkJCQlhdXRoX2NsZWFyX29wdGlvbnMoKTsKKwkJCWJyZWFrOworCQljYXNlIE1NX0hPU1RLRVk6CisJCQlhbGxvd2VkID0gb3B0aW9ucy5ob3N0YmFzZWRfYXV0aGVudGljYXRpb24gJiYKKwkJCSAgICBob3N0YmFzZWRfa2V5X2FsbG93ZWQoYXV0aGN0eHQtPnB3LAorCQkJICAgIGN1c2VyLCBjaG9zdCwga2V5KTsKKwkJCWF1dGhfbWV0aG9kID0gImhvc3RiYXNlZCI7CisJCQlicmVhazsKKwkJY2FzZSBNTV9SU0FIT1NUS0VZOgorCQkJa2V5LT50eXBlID0gS0VZX1JTQTE7IC8qIFhYWCAqLworCQkJYWxsb3dlZCA9IG9wdGlvbnMucmhvc3RzX3JzYV9hdXRoZW50aWNhdGlvbiAmJgorCQkJICAgIGF1dGhfcmhvc3RzX3JzYV9rZXlfYWxsb3dlZChhdXRoY3R4dC0+cHcsCisJCQkgICAgY3VzZXIsIGNob3N0LCBrZXkpOworCQkJaWYgKG9wdGlvbnMucmhvc3RzX3JzYV9hdXRoZW50aWNhdGlvbiAmJiBhbGxvd2VkICE9IDEpCisJCQkJYXV0aF9jbGVhcl9vcHRpb25zKCk7CisJCQlhdXRoX21ldGhvZCA9ICJyc2EiOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmYXRhbCgiJXM6IHVua25vd24ga2V5IHR5cGUgJWQiLCBfX2Z1bmNfXywgdHlwZSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoa2V5ICE9IE5VTEwpCisJCWtleV9mcmVlKGtleSk7CisKKwkvKiBjbGVhciB0ZW1wb3JhcmlseSBzdG9yYWdlICh1c2VkIGJ5IHZlcmlmeSkgKi8KKwltb25pdG9yX3Jlc2V0X2tleV9zdGF0ZSgpOworCisJaWYgKGFsbG93ZWQpIHsKKwkJLyogU2F2ZSB0ZW1wb3JhcmlseSBmb3IgY29tcGFyaXNvbiBpbiB2ZXJpZnkgKi8KKwkJa2V5X2Jsb2IgPSBibG9iOworCQlrZXlfYmxvYmxlbiA9IGJsb2JsZW47CisJCWtleV9ibG9idHlwZSA9IHR5cGU7CisJCWhvc3RiYXNlZF9jdXNlciA9IGN1c2VyOworCQlob3N0YmFzZWRfY2hvc3QgPSBjaG9zdDsKKwl9IGVsc2UgeworCQkvKiBMb2cgZmFpbGVkIGF0dGVtcHQgKi8KKwkJYXV0aF9sb2coYXV0aGN0eHQsIDAsIGF1dGhfbWV0aG9kLCBjb21wYXQyMCA/ICIgc3NoMiIgOiAiIik7CisJCXhmcmVlKGJsb2IpOworCQl4ZnJlZShjdXNlcik7CisJCXhmcmVlKGNob3N0KTsKKwl9CisKKwlkZWJ1ZzMoIiVzOiBrZXkgJXAgaXMgJXMiLAorCSAgICBfX2Z1bmNfXywga2V5LCBhbGxvd2VkID8gImFsbG93ZWQiIDogIm5vdCBhbGxvd2VkIik7CisKKwlidWZmZXJfY2xlYXIobSk7CisJYnVmZmVyX3B1dF9pbnQobSwgYWxsb3dlZCk7CisJYnVmZmVyX3B1dF9pbnQobSwgZm9yY2VkX2NvbW1hbmQgIT0gTlVMTCk7CisKKwltbV9yZXF1ZXN0X3NlbmQoc29jaywgTU9OSVRPUl9BTlNfS0VZQUxMT1dFRCwgbSk7CisKKwlpZiAodHlwZSA9PSBNTV9SU0FIT1NUS0VZKQorCQltb25pdG9yX3Blcm1pdChtb25fZGlzcGF0Y2gsIE1PTklUT1JfUkVRX1JTQUNIQUxMRU5HRSwgYWxsb3dlZCk7CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50Cittb25pdG9yX3ZhbGlkX3VzZXJibG9iKHVfY2hhciAqZGF0YSwgdV9pbnQgZGF0YWxlbikKK3sKKwlCdWZmZXIgYjsKKwljaGFyICpwOworCXVfaW50IGxlbjsKKwlpbnQgZmFpbCA9IDA7CisKKwlidWZmZXJfaW5pdCgmYik7CisJYnVmZmVyX2FwcGVuZCgmYiwgZGF0YSwgZGF0YWxlbik7CisKKwlpZiAoZGF0YWZlbGxvd3MgJiBTU0hfT0xEX1NFU1NJT05JRCkgeworCQlwID0gYnVmZmVyX3B0cigmYik7CisJCWxlbiA9IGJ1ZmZlcl9sZW4oJmIpOworCQlpZiAoKHNlc3Npb25faWQyID09IE5VTEwpIHx8CisJCSAgICAobGVuIDwgc2Vzc2lvbl9pZDJfbGVuKSB8fAorCQkgICAgKHRpbWluZ3NhZmVfYmNtcChwLCBzZXNzaW9uX2lkMiwgc2Vzc2lvbl9pZDJfbGVuKSAhPSAwKSkKKwkJCWZhaWwrKzsKKwkJYnVmZmVyX2NvbnN1bWUoJmIsIHNlc3Npb25faWQyX2xlbik7CisJfSBlbHNlIHsKKwkJcCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZiLCAmbGVuKTsKKwkJaWYgKChzZXNzaW9uX2lkMiA9PSBOVUxMKSB8fAorCQkgICAgKGxlbiAhPSBzZXNzaW9uX2lkMl9sZW4pIHx8CisJCSAgICAodGltaW5nc2FmZV9iY21wKHAsIHNlc3Npb25faWQyLCBzZXNzaW9uX2lkMl9sZW4pICE9IDApKQorCQkJZmFpbCsrOworCQl4ZnJlZShwKTsKKwl9CisJaWYgKGJ1ZmZlcl9nZXRfY2hhcigmYikgIT0gU1NIMl9NU0dfVVNFUkFVVEhfUkVRVUVTVCkKKwkJZmFpbCsrOworCXAgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgTlVMTCk7CisJaWYgKHN0cmNtcChhdXRoY3R4dC0+dXNlciwgcCkgIT0gMCkgeworCQlsb2dpdCgid3JvbmcgdXNlciBuYW1lIHBhc3NlZCB0byBtb25pdG9yOiBleHBlY3RlZCAlcyAhPSAlLjEwMHMiLAorCQkgICAgYXV0aGN0eHQtPnVzZXIsIHApOworCQlmYWlsKys7CisJfQorCXhmcmVlKHApOworCWJ1ZmZlcl9za2lwX3N0cmluZygmYik7CisJaWYgKGRhdGFmZWxsb3dzICYgU1NIX0JVR19QS0FVVEgpIHsKKwkJaWYgKCFidWZmZXJfZ2V0X2NoYXIoJmIpKQorCQkJZmFpbCsrOworCX0gZWxzZSB7CisJCXAgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgTlVMTCk7CisJCWlmIChzdHJjbXAoInB1YmxpY2tleSIsIHApICE9IDApCisJCQlmYWlsKys7CisJCXhmcmVlKHApOworCQlpZiAoIWJ1ZmZlcl9nZXRfY2hhcigmYikpCisJCQlmYWlsKys7CisJCWJ1ZmZlcl9za2lwX3N0cmluZygmYik7CisJfQorCWJ1ZmZlcl9za2lwX3N0cmluZygmYik7CisJaWYgKGJ1ZmZlcl9sZW4oJmIpICE9IDApCisJCWZhaWwrKzsKKwlidWZmZXJfZnJlZSgmYik7CisJcmV0dXJuIChmYWlsID09IDApOworfQorCitzdGF0aWMgaW50Cittb25pdG9yX3ZhbGlkX2hvc3RiYXNlZGJsb2IodV9jaGFyICpkYXRhLCB1X2ludCBkYXRhbGVuLCBjaGFyICpjdXNlciwKKyAgICBjaGFyICpjaG9zdCkKK3sKKwlCdWZmZXIgYjsKKwljaGFyICpwOworCXVfaW50IGxlbjsKKwlpbnQgZmFpbCA9IDA7CisKKwlidWZmZXJfaW5pdCgmYik7CisJYnVmZmVyX2FwcGVuZCgmYiwgZGF0YSwgZGF0YWxlbik7CisKKwlwID0gYnVmZmVyX2dldF9zdHJpbmcoJmIsICZsZW4pOworCWlmICgoc2Vzc2lvbl9pZDIgPT0gTlVMTCkgfHwKKwkgICAgKGxlbiAhPSBzZXNzaW9uX2lkMl9sZW4pIHx8CisJICAgICh0aW1pbmdzYWZlX2JjbXAocCwgc2Vzc2lvbl9pZDIsIHNlc3Npb25faWQyX2xlbikgIT0gMCkpCisJCWZhaWwrKzsKKwl4ZnJlZShwKTsKKworCWlmIChidWZmZXJfZ2V0X2NoYXIoJmIpICE9IFNTSDJfTVNHX1VTRVJBVVRIX1JFUVVFU1QpCisJCWZhaWwrKzsKKwlwID0gYnVmZmVyX2dldF9zdHJpbmcoJmIsIE5VTEwpOworCWlmIChzdHJjbXAoYXV0aGN0eHQtPnVzZXIsIHApICE9IDApIHsKKwkJbG9naXQoIndyb25nIHVzZXIgbmFtZSBwYXNzZWQgdG8gbW9uaXRvcjogZXhwZWN0ZWQgJXMgIT0gJS4xMDBzIiwKKwkJICAgIGF1dGhjdHh0LT51c2VyLCBwKTsKKwkJZmFpbCsrOworCX0KKwl4ZnJlZShwKTsKKwlidWZmZXJfc2tpcF9zdHJpbmcoJmIpOwkvKiBzZXJ2aWNlICovCisJcCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZiLCBOVUxMKTsKKwlpZiAoc3RyY21wKHAsICJob3N0YmFzZWQiKSAhPSAwKQorCQlmYWlsKys7CisJeGZyZWUocCk7CisJYnVmZmVyX3NraXBfc3RyaW5nKCZiKTsJLyogcGthbGcgKi8KKwlidWZmZXJfc2tpcF9zdHJpbmcoJmIpOwkvKiBwa2Jsb2IgKi8KKworCS8qIHZlcmlmeSBjbGllbnQgaG9zdCwgc3RyaXAgdHJhaWxpbmcgZG90IGlmIG5lY2Vzc2FyeSAqLworCXAgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgTlVMTCk7CisJaWYgKCgobGVuID0gc3RybGVuKHApKSA+IDApICYmIHBbbGVuIC0gMV0gPT0gJy4nKQorCQlwW2xlbiAtIDFdID0gJ1wwJzsKKwlpZiAoc3RyY21wKHAsIGNob3N0KSAhPSAwKQorCQlmYWlsKys7CisJeGZyZWUocCk7CisKKwkvKiB2ZXJpZnkgY2xpZW50IHVzZXIgKi8KKwlwID0gYnVmZmVyX2dldF9zdHJpbmcoJmIsIE5VTEwpOworCWlmIChzdHJjbXAocCwgY3VzZXIpICE9IDApCisJCWZhaWwrKzsKKwl4ZnJlZShwKTsKKworCWlmIChidWZmZXJfbGVuKCZiKSAhPSAwKQorCQlmYWlsKys7CisJYnVmZmVyX2ZyZWUoJmIpOworCXJldHVybiAoZmFpbCA9PSAwKTsKK30KKworaW50CittbV9hbnN3ZXJfa2V5dmVyaWZ5KGludCBzb2NrLCBCdWZmZXIgKm0pCit7CisJS2V5ICprZXk7CisJdV9jaGFyICpzaWduYXR1cmUsICpkYXRhLCAqYmxvYjsKKwl1X2ludCBzaWduYXR1cmVsZW4sIGRhdGFsZW4sIGJsb2JsZW47CisJaW50IHZlcmlmaWVkID0gMDsKKwlpbnQgdmFsaWRfZGF0YSA9IDA7CisKKwlibG9iID0gYnVmZmVyX2dldF9zdHJpbmcobSwgJmJsb2JsZW4pOworCXNpZ25hdHVyZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKG0sICZzaWduYXR1cmVsZW4pOworCWRhdGEgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCAmZGF0YWxlbik7CisKKwlpZiAoaG9zdGJhc2VkX2N1c2VyID09IE5VTEwgfHwgaG9zdGJhc2VkX2Nob3N0ID09IE5VTEwgfHwKKwkgICFtb25pdG9yX2FsbG93ZWRfa2V5KGJsb2IsIGJsb2JsZW4pKQorCQlmYXRhbCgiJXM6IGJhZCBrZXksIG5vdCBwcmV2aW91c2x5IGFsbG93ZWQiLCBfX2Z1bmNfXyk7CisKKwlrZXkgPSBrZXlfZnJvbV9ibG9iKGJsb2IsIGJsb2JsZW4pOworCWlmIChrZXkgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBiYWQgcHVibGljIGtleSBibG9iIiwgX19mdW5jX18pOworCisJc3dpdGNoIChrZXlfYmxvYnR5cGUpIHsKKwljYXNlIE1NX1VTRVJLRVk6CisJCXZhbGlkX2RhdGEgPSBtb25pdG9yX3ZhbGlkX3VzZXJibG9iKGRhdGEsIGRhdGFsZW4pOworCQlicmVhazsKKwljYXNlIE1NX0hPU1RLRVk6CisJCXZhbGlkX2RhdGEgPSBtb25pdG9yX3ZhbGlkX2hvc3RiYXNlZGJsb2IoZGF0YSwgZGF0YWxlbiwKKwkJICAgIGhvc3RiYXNlZF9jdXNlciwgaG9zdGJhc2VkX2Nob3N0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdmFsaWRfZGF0YSA9IDA7CisJCWJyZWFrOworCX0KKwlpZiAoIXZhbGlkX2RhdGEpCisJCWZhdGFsKCIlczogYmFkIHNpZ25hdHVyZSBkYXRhIGJsb2IiLCBfX2Z1bmNfXyk7CisKKwl2ZXJpZmllZCA9IGtleV92ZXJpZnkoa2V5LCBzaWduYXR1cmUsIHNpZ25hdHVyZWxlbiwgZGF0YSwgZGF0YWxlbik7CisJZGVidWczKCIlczoga2V5ICVwIHNpZ25hdHVyZSAlcyIsCisJICAgIF9fZnVuY19fLCBrZXksICh2ZXJpZmllZCA9PSAxKSA/ICJ2ZXJpZmllZCIgOiAidW52ZXJpZmllZCIpOworCisJa2V5X2ZyZWUoa2V5KTsKKwl4ZnJlZShibG9iKTsKKwl4ZnJlZShzaWduYXR1cmUpOworCXhmcmVlKGRhdGEpOworCisJYXV0aF9tZXRob2QgPSBrZXlfYmxvYnR5cGUgPT0gTU1fVVNFUktFWSA/ICJwdWJsaWNrZXkiIDogImhvc3RiYXNlZCI7CisKKwltb25pdG9yX3Jlc2V0X2tleV9zdGF0ZSgpOworCisJYnVmZmVyX2NsZWFyKG0pOworCWJ1ZmZlcl9wdXRfaW50KG0sIHZlcmlmaWVkKTsKKwltbV9yZXF1ZXN0X3NlbmQoc29jaywgTU9OSVRPUl9BTlNfS0VZVkVSSUZZLCBtKTsKKworCXJldHVybiAodmVyaWZpZWQgPT0gMSk7Cit9CisKK3N0YXRpYyB2b2lkCittbV9yZWNvcmRfbG9naW4oU2Vzc2lvbiAqcywgc3RydWN0IHBhc3N3ZCAqcHcpCit7CisJc29ja2xlbl90IGZyb21sZW47CisJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgZnJvbTsKKworCS8qCisJICogR2V0IElQIGFkZHJlc3Mgb2YgY2xpZW50LiBJZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgYSBzb2NrZXQsIGxldAorCSAqIHRoZSBhZGRyZXNzIGJlIDAuMC4wLjAuCisJICovCisJbWVtc2V0KCZmcm9tLCAwLCBzaXplb2YoZnJvbSkpOworCWZyb21sZW4gPSBzaXplb2YoZnJvbSk7CisJaWYgKHBhY2tldF9jb25uZWN0aW9uX2lzX29uX3NvY2tldCgpKSB7CisJCWlmIChnZXRwZWVybmFtZShwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25faW4oKSwKKwkJICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmZnJvbSwgJmZyb21sZW4pIDwgMCkgeworCQkJZGVidWcoImdldHBlZXJuYW1lOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCQkJY2xlYW51cF9leGl0KDI1NSk7CisJCX0KKwl9CisJLyogUmVjb3JkIHRoYXQgdGhlcmUgd2FzIGEgbG9naW4gb24gdGhhdCB0dHkgZnJvbSB0aGUgcmVtb3RlIGhvc3QuICovCisJcmVjb3JkX2xvZ2luKHMtPnBpZCwgcy0+dHR5LCBwdy0+cHdfbmFtZSwgcHctPnB3X3VpZCwKKwkgICAgZ2V0X3JlbW90ZV9uYW1lX29yX2lwKHV0bXBfbGVuLCBvcHRpb25zLnVzZV9kbnMpLAorCSAgICAoc3RydWN0IHNvY2thZGRyICopJmZyb20sIGZyb21sZW4pOworfQorCitzdGF0aWMgdm9pZAorbW1fc2Vzc2lvbl9jbG9zZShTZXNzaW9uICpzKQoreworCWRlYnVnMygiJXM6IHNlc3Npb24gJWQgcGlkICVsZCIsIF9fZnVuY19fLCBzLT5zZWxmLCAobG9uZylzLT5waWQpOworCWlmIChzLT50dHlmZCAhPSAtMSkgeworCQlkZWJ1ZzMoIiVzOiB0dHkgJXMgcHR5ZmQgJWQiLCBfX2Z1bmNfXywgcy0+dHR5LCBzLT5wdHlmZCk7CisJCXNlc3Npb25fcHR5X2NsZWFudXAyKHMpOworCX0KKwlzZXNzaW9uX3VudXNlZChzLT5zZWxmKTsKK30KKworaW50CittbV9hbnN3ZXJfcHR5KGludCBzb2NrLCBCdWZmZXIgKm0pCit7CisJZXh0ZXJuIHN0cnVjdCBtb25pdG9yICpwbW9uaXRvcjsKKwlTZXNzaW9uICpzOworCWludCByZXMsIGZkMDsKKworCWRlYnVnMygiJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7CisKKwlidWZmZXJfY2xlYXIobSk7CisJcyA9IHNlc3Npb25fbmV3KCk7CisJaWYgKHMgPT0gTlVMTCkKKwkJZ290byBlcnJvcjsKKwlzLT5hdXRoY3R4dCA9IGF1dGhjdHh0OworCXMtPnB3ID0gYXV0aGN0eHQtPnB3OworCXMtPnBpZCA9IHBtb25pdG9yLT5tX3BpZDsKKwlyZXMgPSBwdHlfYWxsb2NhdGUoJnMtPnB0eWZkLCAmcy0+dHR5ZmQsIHMtPnR0eSwgc2l6ZW9mKHMtPnR0eSkpOworCWlmIChyZXMgPT0gMCkKKwkJZ290byBlcnJvcjsKKwlwdHlfc2V0b3duZXIoYXV0aGN0eHQtPnB3LCBzLT50dHkpOworCisJYnVmZmVyX3B1dF9pbnQobSwgMSk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKG0sIHMtPnR0eSk7CisKKwkvKiBXZSBuZWVkIHRvIHRyaWNrIHR0eXNsb3QgKi8KKwlpZiAoZHVwMihzLT50dHlmZCwgMCkgPT0gLTEpCisJCWZhdGFsKCIlczogZHVwMiIsIF9fZnVuY19fKTsKKworCW1tX3JlY29yZF9sb2dpbihzLCBhdXRoY3R4dC0+cHcpOworCisJLyogTm93IHdlIGNhbiBjbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9yIGFnYWluICovCisJY2xvc2UoMCk7CisKKwkvKiBzZW5kIG1lc3NhZ2VzIGdlbmVyYXRlZCBieSByZWNvcmRfbG9naW4gKi8KKwlidWZmZXJfcHV0X3N0cmluZyhtLCBidWZmZXJfcHRyKCZsb2dpbm1zZyksIGJ1ZmZlcl9sZW4oJmxvZ2lubXNnKSk7CisJYnVmZmVyX2NsZWFyKCZsb2dpbm1zZyk7CisKKwltbV9yZXF1ZXN0X3NlbmQoc29jaywgTU9OSVRPUl9BTlNfUFRZLCBtKTsKKworCWlmIChtbV9zZW5kX2ZkKHNvY2ssIHMtPnB0eWZkKSA9PSAtMSB8fAorCSAgICBtbV9zZW5kX2ZkKHNvY2ssIHMtPnR0eWZkKSA9PSAtMSkKKwkJZmF0YWwoIiVzOiBzZW5kIGZkcyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisKKwkvKiBtYWtlIHN1cmUgbm90aGluZyB1c2VzIGZkIDAgKi8KKwlpZiAoKGZkMCA9IG9wZW4oX1BBVEhfREVWTlVMTCwgT19SRE9OTFkpKSA8IDApCisJCWZhdGFsKCIlczogb3BlbigvZGV2L251bGwpOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCWlmIChmZDAgIT0gMCkKKwkJZXJyb3IoIiVzOiBmZDAgJWQgIT0gMCIsIF9fZnVuY19fLCBmZDApOworCisJLyogc2xhdmUgaXMgbm90IG5lZWRlZCAqLworCWNsb3NlKHMtPnR0eWZkKTsKKwlzLT50dHlmZCA9IHMtPnB0eWZkOworCS8qIG5vIG5lZWQgdG8gZHVwKCkgYmVjYXVzZSBub2JvZHkgY2xvc2VzIHB0eWZkICovCisJcy0+cHR5bWFzdGVyID0gcy0+cHR5ZmQ7CisKKwlkZWJ1ZzMoIiVzOiB0dHkgJXMgcHR5ZmQgJWQiLCBfX2Z1bmNfXywgcy0+dHR5LCBzLT50dHlmZCk7CisKKwlyZXR1cm4gKDApOworCisgZXJyb3I6CisJaWYgKHMgIT0gTlVMTCkKKwkJbW1fc2Vzc2lvbl9jbG9zZShzKTsKKwlidWZmZXJfcHV0X2ludChtLCAwKTsKKwltbV9yZXF1ZXN0X3NlbmQoc29jaywgTU9OSVRPUl9BTlNfUFRZLCBtKTsKKwlyZXR1cm4gKDApOworfQorCitpbnQKK21tX2Fuc3dlcl9wdHlfY2xlYW51cChpbnQgc29jaywgQnVmZmVyICptKQoreworCVNlc3Npb24gKnM7CisJY2hhciAqdHR5OworCisJZGVidWczKCIlcyBlbnRlcmluZyIsIF9fZnVuY19fKTsKKworCXR0eSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKG0sIE5VTEwpOworCWlmICgocyA9IHNlc3Npb25fYnlfdHR5KHR0eSkpICE9IE5VTEwpCisJCW1tX3Nlc3Npb25fY2xvc2Uocyk7CisJYnVmZmVyX2NsZWFyKG0pOworCXhmcmVlKHR0eSk7CisJcmV0dXJuICgwKTsKK30KKworaW50CittbV9hbnN3ZXJfc2Vzc2tleShpbnQgc29jaywgQnVmZmVyICptKQoreworCUJJR05VTSAqcDsKKwlpbnQgcnNhZmFpbDsKKworCS8qIFR1cm4gb2ZmIHBlcm1pc3Npb25zICovCisJbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9TRVNTS0VZLCAwKTsKKworCWlmICgocCA9IEJOX25ldygpKSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IEJOX25ldyIsIF9fZnVuY19fKTsKKworCWJ1ZmZlcl9nZXRfYmlnbnVtMihtLCBwKTsKKworCXJzYWZhaWwgPSBzc2gxX3Nlc3Npb25fa2V5KHApOworCisJYnVmZmVyX2NsZWFyKG0pOworCWJ1ZmZlcl9wdXRfaW50KG0sIHJzYWZhaWwpOworCWJ1ZmZlcl9wdXRfYmlnbnVtMihtLCBwKTsKKworCUJOX2NsZWFyX2ZyZWUocCk7CisKKwltbV9yZXF1ZXN0X3NlbmQoc29jaywgTU9OSVRPUl9BTlNfU0VTU0tFWSwgbSk7CisKKwkvKiBUdXJuIG9uIHBlcm1pc3Npb25zIGZvciBzZXNzaWQgcGFzc2luZyAqLworCW1vbml0b3JfcGVybWl0KG1vbl9kaXNwYXRjaCwgTU9OSVRPUl9SRVFfU0VTU0lELCAxKTsKKworCXJldHVybiAoMCk7Cit9CisKK2ludAorbW1fYW5zd2VyX3Nlc3NpZChpbnQgc29jaywgQnVmZmVyICptKQoreworCWludCBpOworCisJZGVidWczKCIlcyBlbnRlcmluZyIsIF9fZnVuY19fKTsKKworCWlmIChidWZmZXJfbGVuKG0pICE9IDE2KQorCQlmYXRhbCgiJXM6IGJhZCBzc2gxIHNlc3Npb24gaWQiLCBfX2Z1bmNfXyk7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCXNlc3Npb25faWRbaV0gPSBidWZmZXJfZ2V0X2NoYXIobSk7CisKKwkvKiBUdXJuIG9uIHBlcm1pc3Npb25zIGZvciBnZXRwd25hbSAqLworCW1vbml0b3JfcGVybWl0KG1vbl9kaXNwYXRjaCwgTU9OSVRPUl9SRVFfUFdOQU0sIDEpOworCisJcmV0dXJuICgwKTsKK30KKworaW50CittbV9hbnN3ZXJfcnNhX2tleWFsbG93ZWQoaW50IHNvY2ssIEJ1ZmZlciAqbSkKK3sKKwlCSUdOVU0gKmNsaWVudF9uOworCUtleSAqa2V5ID0gTlVMTDsKKwl1X2NoYXIgKmJsb2IgPSBOVUxMOworCXVfaW50IGJsZW4gPSAwOworCWludCBhbGxvd2VkID0gMDsKKworCWRlYnVnMygiJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7CisKKwlhdXRoX21ldGhvZCA9ICJyc2EiOworCWlmIChvcHRpb25zLnJzYV9hdXRoZW50aWNhdGlvbiAmJiBhdXRoY3R4dC0+dmFsaWQpIHsKKwkJaWYgKChjbGllbnRfbiA9IEJOX25ldygpKSA9PSBOVUxMKQorCQkJZmF0YWwoIiVzOiBCTl9uZXciLCBfX2Z1bmNfXyk7CisJCWJ1ZmZlcl9nZXRfYmlnbnVtMihtLCBjbGllbnRfbik7CisJCWFsbG93ZWQgPSBhdXRoX3JzYV9rZXlfYWxsb3dlZChhdXRoY3R4dC0+cHcsIGNsaWVudF9uLCAma2V5KTsKKwkJQk5fY2xlYXJfZnJlZShjbGllbnRfbik7CisJfQorCWJ1ZmZlcl9jbGVhcihtKTsKKwlidWZmZXJfcHV0X2ludChtLCBhbGxvd2VkKTsKKwlidWZmZXJfcHV0X2ludChtLCBmb3JjZWRfY29tbWFuZCAhPSBOVUxMKTsKKworCS8qIGNsZWFyIHRlbXBvcmFyaWx5IHN0b3JhZ2UgKHVzZWQgYnkgZ2VuZXJhdGUgY2hhbGxlbmdlKSAqLworCW1vbml0b3JfcmVzZXRfa2V5X3N0YXRlKCk7CisKKwlpZiAoYWxsb3dlZCAmJiBrZXkgIT0gTlVMTCkgeworCQlrZXktPnR5cGUgPSBLRVlfUlNBOwkvKiBjaGVhdCBmb3Iga2V5X3RvX2Jsb2IgKi8KKwkJaWYgKGtleV90b19ibG9iKGtleSwgJmJsb2IsICZibGVuKSA9PSAwKQorCQkJZmF0YWwoIiVzOiBrZXlfdG9fYmxvYiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCWJ1ZmZlcl9wdXRfc3RyaW5nKG0sIGJsb2IsIGJsZW4pOworCisJCS8qIFNhdmUgdGVtcG9yYXJpbHkgZm9yIGNvbXBhcmlzb24gaW4gdmVyaWZ5ICovCisJCWtleV9ibG9iID0gYmxvYjsKKwkJa2V5X2Jsb2JsZW4gPSBibGVuOworCQlrZXlfYmxvYnR5cGUgPSBNTV9SU0FVU0VSS0VZOworCX0KKwlpZiAoa2V5ICE9IE5VTEwpCisJCWtleV9mcmVlKGtleSk7CisKKwltbV9yZXF1ZXN0X3NlbmQoc29jaywgTU9OSVRPUl9BTlNfUlNBS0VZQUxMT1dFRCwgbSk7CisKKwltb25pdG9yX3Blcm1pdChtb25fZGlzcGF0Y2gsIE1PTklUT1JfUkVRX1JTQUNIQUxMRU5HRSwgYWxsb3dlZCk7CisJbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9SU0FSRVNQT05TRSwgMCk7CisJcmV0dXJuICgwKTsKK30KKworaW50CittbV9hbnN3ZXJfcnNhX2NoYWxsZW5nZShpbnQgc29jaywgQnVmZmVyICptKQoreworCUtleSAqa2V5ID0gTlVMTDsKKwl1X2NoYXIgKmJsb2I7CisJdV9pbnQgYmxlbjsKKworCWRlYnVnMygiJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7CisKKwlpZiAoIWF1dGhjdHh0LT52YWxpZCkKKwkJZmF0YWwoIiVzOiBhdXRoY3R4dCBub3QgdmFsaWQiLCBfX2Z1bmNfXyk7CisJYmxvYiA9IGJ1ZmZlcl9nZXRfc3RyaW5nKG0sICZibGVuKTsKKwlpZiAoIW1vbml0b3JfYWxsb3dlZF9rZXkoYmxvYiwgYmxlbikpCisJCWZhdGFsKCIlczogYmFkIGtleSwgbm90IHByZXZpb3VzbHkgYWxsb3dlZCIsIF9fZnVuY19fKTsKKwlpZiAoa2V5X2Jsb2J0eXBlICE9IE1NX1JTQVVTRVJLRVkgJiYga2V5X2Jsb2J0eXBlICE9IE1NX1JTQUhPU1RLRVkpCisJCWZhdGFsKCIlczoga2V5IHR5cGUgbWlzbWF0Y2giLCBfX2Z1bmNfXyk7CisJaWYgKChrZXkgPSBrZXlfZnJvbV9ibG9iKGJsb2IsIGJsZW4pKSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IHJlY2VpdmVkIGJhZCBrZXkiLCBfX2Z1bmNfXyk7CisJaWYgKGtleS0+dHlwZSAhPSBLRVlfUlNBKQorCQlmYXRhbCgiJXM6IHJlY2VpdmVkIGJhZCBrZXkgdHlwZSAlZCIsIF9fZnVuY19fLCBrZXktPnR5cGUpOworCWtleS0+dHlwZSA9IEtFWV9SU0ExOworCWlmIChzc2gxX2NoYWxsZW5nZSkKKwkJQk5fY2xlYXJfZnJlZShzc2gxX2NoYWxsZW5nZSk7CisJc3NoMV9jaGFsbGVuZ2UgPSBhdXRoX3JzYV9nZW5lcmF0ZV9jaGFsbGVuZ2Uoa2V5KTsKKworCWJ1ZmZlcl9jbGVhcihtKTsKKwlidWZmZXJfcHV0X2JpZ251bTIobSwgc3NoMV9jaGFsbGVuZ2UpOworCisJZGVidWczKCIlcyBzZW5kaW5nIHJlcGx5IiwgX19mdW5jX18pOworCW1tX3JlcXVlc3Rfc2VuZChzb2NrLCBNT05JVE9SX0FOU19SU0FDSEFMTEVOR0UsIG0pOworCisJbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9SU0FSRVNQT05TRSwgMSk7CisKKwl4ZnJlZShibG9iKTsKKwlrZXlfZnJlZShrZXkpOworCXJldHVybiAoMCk7Cit9CisKK2ludAorbW1fYW5zd2VyX3JzYV9yZXNwb25zZShpbnQgc29jaywgQnVmZmVyICptKQoreworCUtleSAqa2V5ID0gTlVMTDsKKwl1X2NoYXIgKmJsb2IsICpyZXNwb25zZTsKKwl1X2ludCBibGVuLCBsZW47CisJaW50IHN1Y2Nlc3M7CisKKwlkZWJ1ZzMoIiVzIGVudGVyaW5nIiwgX19mdW5jX18pOworCisJaWYgKCFhdXRoY3R4dC0+dmFsaWQpCisJCWZhdGFsKCIlczogYXV0aGN0eHQgbm90IHZhbGlkIiwgX19mdW5jX18pOworCWlmIChzc2gxX2NoYWxsZW5nZSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IG5vIHNzaDFfY2hhbGxlbmdlIiwgX19mdW5jX18pOworCisJYmxvYiA9IGJ1ZmZlcl9nZXRfc3RyaW5nKG0sICZibGVuKTsKKwlpZiAoIW1vbml0b3JfYWxsb3dlZF9rZXkoYmxvYiwgYmxlbikpCisJCWZhdGFsKCIlczogYmFkIGtleSwgbm90IHByZXZpb3VzbHkgYWxsb3dlZCIsIF9fZnVuY19fKTsKKwlpZiAoa2V5X2Jsb2J0eXBlICE9IE1NX1JTQVVTRVJLRVkgJiYga2V5X2Jsb2J0eXBlICE9IE1NX1JTQUhPU1RLRVkpCisJCWZhdGFsKCIlczoga2V5IHR5cGUgbWlzbWF0Y2g6ICVkIiwgX19mdW5jX18sIGtleV9ibG9idHlwZSk7CisJaWYgKChrZXkgPSBrZXlfZnJvbV9ibG9iKGJsb2IsIGJsZW4pKSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IHJlY2VpdmVkIGJhZCBrZXkiLCBfX2Z1bmNfXyk7CisJcmVzcG9uc2UgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCAmbGVuKTsKKwlpZiAobGVuICE9IDE2KQorCQlmYXRhbCgiJXM6IHJlY2VpdmVkIGJhZCByZXNwb25zZSB0byBjaGFsbGVuZ2UiLCBfX2Z1bmNfXyk7CisJc3VjY2VzcyA9IGF1dGhfcnNhX3ZlcmlmeV9yZXNwb25zZShrZXksIHNzaDFfY2hhbGxlbmdlLCByZXNwb25zZSk7CisKKwl4ZnJlZShibG9iKTsKKwlrZXlfZnJlZShrZXkpOworCXhmcmVlKHJlc3BvbnNlKTsKKworCWF1dGhfbWV0aG9kID0ga2V5X2Jsb2J0eXBlID09IE1NX1JTQVVTRVJLRVkgPyAicnNhIiA6ICJyaG9zdHMtcnNhIjsKKworCS8qIHJlc2V0IHN0YXRlICovCisJQk5fY2xlYXJfZnJlZShzc2gxX2NoYWxsZW5nZSk7CisJc3NoMV9jaGFsbGVuZ2UgPSBOVUxMOworCW1vbml0b3JfcmVzZXRfa2V5X3N0YXRlKCk7CisKKwlidWZmZXJfY2xlYXIobSk7CisJYnVmZmVyX3B1dF9pbnQobSwgc3VjY2Vzcyk7CisJbW1fcmVxdWVzdF9zZW5kKHNvY2ssIE1PTklUT1JfQU5TX1JTQVJFU1BPTlNFLCBtKTsKKworCXJldHVybiAoc3VjY2Vzcyk7Cit9CisKK2ludAorbW1fYW5zd2VyX3Rlcm0oaW50IHNvY2ssIEJ1ZmZlciAqcmVxKQoreworCWV4dGVybiBzdHJ1Y3QgbW9uaXRvciAqcG1vbml0b3I7CisJaW50IHJlcywgc3RhdHVzOworCisJZGVidWczKCIlczogdGVhcmluZyBkb3duIHNlc3Npb25zIiwgX19mdW5jX18pOworCisJLyogVGhlIGNoaWxkIGlzIHRlcm1pbmF0aW5nICovCisJc2Vzc2lvbl9kZXN0cm95X2FsbCgmbW1fc2Vzc2lvbl9jbG9zZSk7CisKKyNpZmRlZiBVU0VfUEFNCisJaWYgKG9wdGlvbnMudXNlX3BhbSkKKwkJc3NocGFtX2NsZWFudXAoKTsKKyNlbmRpZgorCisJd2hpbGUgKHdhaXRwaWQocG1vbml0b3ItPm1fcGlkLCAmc3RhdHVzLCAwKSA9PSAtMSkKKwkJaWYgKGVycm5vICE9IEVJTlRSKQorCQkJZXhpdCgxKTsKKworCXJlcyA9IFdJRkVYSVRFRChzdGF0dXMpID8gV0VYSVRTVEFUVVMoc3RhdHVzKSA6IDE7CisKKwkvKiBUZXJtaW5hdGUgcHJvY2VzcyAqLworCWV4aXQocmVzKTsKK30KKworI2lmZGVmIFNTSF9BVURJVF9FVkVOVFMKKy8qIFJlcG9ydCB0aGF0IGFuIGF1ZGl0IGV2ZW50IG9jY3VycmVkICovCitpbnQKK21tX2Fuc3dlcl9hdWRpdF9ldmVudChpbnQgc29ja2V0LCBCdWZmZXIgKm0pCit7CisJc3NoX2F1ZGl0X2V2ZW50X3QgZXZlbnQ7CisKKwlkZWJ1ZzMoIiVzIGVudGVyaW5nIiwgX19mdW5jX18pOworCisJZXZlbnQgPSBidWZmZXJfZ2V0X2ludChtKTsKKwlzd2l0Y2goZXZlbnQpIHsKKwljYXNlIFNTSF9BVVRIX0ZBSUxfUFVCS0VZOgorCWNhc2UgU1NIX0FVVEhfRkFJTF9IT1NUQkFTRUQ6CisJY2FzZSBTU0hfQVVUSF9GQUlMX0dTU0FQSToKKwljYXNlIFNTSF9MT0dJTl9FWENFRURfTUFYVFJJRVM6CisJY2FzZSBTU0hfTE9HSU5fUk9PVF9ERU5JRUQ6CisJY2FzZSBTU0hfQ09OTkVDVElPTl9DTE9TRToKKwljYXNlIFNTSF9JTlZBTElEX1VTRVI6CisJCWF1ZGl0X2V2ZW50KGV2ZW50KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZmF0YWwoIkF1ZGl0IGV2ZW50IHR5cGUgJWQgbm90IHBlcm1pdHRlZCIsIGV2ZW50KTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCitpbnQKK21tX2Fuc3dlcl9hdWRpdF9jb21tYW5kKGludCBzb2NrZXQsIEJ1ZmZlciAqbSkKK3sKKwl1X2ludCBsZW47CisJY2hhciAqY21kOworCisJZGVidWczKCIlcyBlbnRlcmluZyIsIF9fZnVuY19fKTsKKwljbWQgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCAmbGVuKTsKKwkvKiBzYW5pdHkgY2hlY2sgY29tbWFuZCwgaWYgc28gaG93PyAqLworCWF1ZGl0X3J1bl9jb21tYW5kKGNtZCk7CisJeGZyZWUoY21kKTsKKwlyZXR1cm4gKDApOworfQorI2VuZGlmIC8qIFNTSF9BVURJVF9FVkVOVFMgKi8KKwordm9pZAorbW9uaXRvcl9hcHBseV9rZXlzdGF0ZShzdHJ1Y3QgbW9uaXRvciAqcG1vbml0b3IpCit7CisJaWYgKGNvbXBhdDIwKSB7CisJCXNldF9uZXdrZXlzKE1PREVfSU4pOworCQlzZXRfbmV3a2V5cyhNT0RFX09VVCk7CisJfSBlbHNlIHsKKwkJcGFja2V0X3NldF9wcm90b2NvbF9mbGFncyhjaGlsZF9zdGF0ZS5zc2gxcHJvdG9mbGFncyk7CisJCXBhY2tldF9zZXRfZW5jcnlwdGlvbl9rZXkoY2hpbGRfc3RhdGUuc3NoMWtleSwKKwkJICAgIGNoaWxkX3N0YXRlLnNzaDFrZXlsZW4sIGNoaWxkX3N0YXRlLnNzaDFjaXBoZXIpOworCQl4ZnJlZShjaGlsZF9zdGF0ZS5zc2gxa2V5KTsKKwl9CisKKwkvKiBmb3IgcmM0IGFuZCBvdGhlciBzdGF0ZWZ1bCBjaXBoZXJzICovCisJcGFja2V0X3NldF9rZXljb250ZXh0KE1PREVfT1VULCBjaGlsZF9zdGF0ZS5rZXlvdXQpOworCXhmcmVlKGNoaWxkX3N0YXRlLmtleW91dCk7CisJcGFja2V0X3NldF9rZXljb250ZXh0KE1PREVfSU4sIGNoaWxkX3N0YXRlLmtleWluKTsKKwl4ZnJlZShjaGlsZF9zdGF0ZS5rZXlpbik7CisKKwlpZiAoIWNvbXBhdDIwKSB7CisJCXBhY2tldF9zZXRfaXYoTU9ERV9PVVQsIGNoaWxkX3N0YXRlLml2b3V0KTsKKwkJeGZyZWUoY2hpbGRfc3RhdGUuaXZvdXQpOworCQlwYWNrZXRfc2V0X2l2KE1PREVfSU4sIGNoaWxkX3N0YXRlLml2aW4pOworCQl4ZnJlZShjaGlsZF9zdGF0ZS5pdmluKTsKKwl9CisKKwltZW1jcHkoJmluY29taW5nX3N0cmVhbSwgJmNoaWxkX3N0YXRlLmluY29taW5nLAorCSAgICBzaXplb2YoaW5jb21pbmdfc3RyZWFtKSk7CisJbWVtY3B5KCZvdXRnb2luZ19zdHJlYW0sICZjaGlsZF9zdGF0ZS5vdXRnb2luZywKKwkgICAgc2l6ZW9mKG91dGdvaW5nX3N0cmVhbSkpOworCisJLyogVXBkYXRlIHdpdGggbmV3IGFkZHJlc3MgKi8KKwlpZiAob3B0aW9ucy5jb21wcmVzc2lvbikKKwkJbW1faW5pdF9jb21wcmVzc2lvbihwbW9uaXRvci0+bV96bGliKTsKKworCS8qIE5ldHdvcmsgSS9PIGJ1ZmZlcnMgKi8KKwkvKiBYWFggaW5lZmZpY2llbnQgZm9yIGxhcmdlIGJ1ZmZlcnMsIG5lZWQ6IGJ1ZmZlcl9pbml0X2Zyb21fc3RyaW5nICovCisJYnVmZmVyX2NsZWFyKHBhY2tldF9nZXRfaW5wdXQoKSk7CisJYnVmZmVyX2FwcGVuZChwYWNrZXRfZ2V0X2lucHV0KCksIGNoaWxkX3N0YXRlLmlucHV0LCBjaGlsZF9zdGF0ZS5pbGVuKTsKKwltZW1zZXQoY2hpbGRfc3RhdGUuaW5wdXQsIDAsIGNoaWxkX3N0YXRlLmlsZW4pOworCXhmcmVlKGNoaWxkX3N0YXRlLmlucHV0KTsKKworCWJ1ZmZlcl9jbGVhcihwYWNrZXRfZ2V0X291dHB1dCgpKTsKKwlidWZmZXJfYXBwZW5kKHBhY2tldF9nZXRfb3V0cHV0KCksIGNoaWxkX3N0YXRlLm91dHB1dCwKKwkJICAgICAgY2hpbGRfc3RhdGUub2xlbik7CisJbWVtc2V0KGNoaWxkX3N0YXRlLm91dHB1dCwgMCwgY2hpbGRfc3RhdGUub2xlbik7CisJeGZyZWUoY2hpbGRfc3RhdGUub3V0cHV0KTsKKworCS8qIFJvYW1pbmcgKi8KKwlpZiAoY29tcGF0MjApCisJCXJvYW1fc2V0X2J5dGVzKGNoaWxkX3N0YXRlLnNlbnRfYnl0ZXMsIGNoaWxkX3N0YXRlLnJlY3ZfYnl0ZXMpOworfQorCitzdGF0aWMgS2V4ICoKK21tX2dldF9rZXgoQnVmZmVyICptKQoreworCUtleCAqa2V4OworCXZvaWQgKmJsb2I7CisJdV9pbnQgYmxvYmxlbjsKKworCWtleCA9IHhjYWxsb2MoMSwgc2l6ZW9mKCprZXgpKTsKKwlrZXgtPnNlc3Npb25faWQgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCAma2V4LT5zZXNzaW9uX2lkX2xlbik7CisJaWYgKHNlc3Npb25faWQyID09IE5VTEwgfHwKKwkgICAga2V4LT5zZXNzaW9uX2lkX2xlbiAhPSBzZXNzaW9uX2lkMl9sZW4gfHwKKwkgICAgdGltaW5nc2FmZV9iY21wKGtleC0+c2Vzc2lvbl9pZCwgc2Vzc2lvbl9pZDIsIHNlc3Npb25faWQyX2xlbikgIT0gMCkKKwkJZmF0YWwoIm1tX2dldF9nZXQ6IGludGVybmFsIGVycm9yOiBiYWQgc2Vzc2lvbiBpZCIpOworCWtleC0+d2VfbmVlZCA9IGJ1ZmZlcl9nZXRfaW50KG0pOworCWtleC0+a2V4W0tFWF9ESF9HUlAxX1NIQTFdID0ga2V4ZGhfc2VydmVyOworCWtleC0+a2V4W0tFWF9ESF9HUlAxNF9TSEExXSA9IGtleGRoX3NlcnZlcjsKKwlrZXgtPmtleFtLRVhfREhfR0VYX1NIQTFdID0ga2V4Z2V4X3NlcnZlcjsKKwlrZXgtPmtleFtLRVhfREhfR0VYX1NIQTI1Nl0gPSBrZXhnZXhfc2VydmVyOworCWtleC0+a2V4W0tFWF9FQ0RIX1NIQTJdID0ga2V4ZWNkaF9zZXJ2ZXI7CisJa2V4LT5zZXJ2ZXIgPSAxOworCWtleC0+aG9zdGtleV90eXBlID0gYnVmZmVyX2dldF9pbnQobSk7CisJa2V4LT5rZXhfdHlwZSA9IGJ1ZmZlcl9nZXRfaW50KG0pOworCWJsb2IgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCAmYmxvYmxlbik7CisJYnVmZmVyX2luaXQoJmtleC0+bXkpOworCWJ1ZmZlcl9hcHBlbmQoJmtleC0+bXksIGJsb2IsIGJsb2JsZW4pOworCXhmcmVlKGJsb2IpOworCWJsb2IgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCAmYmxvYmxlbik7CisJYnVmZmVyX2luaXQoJmtleC0+cGVlcik7CisJYnVmZmVyX2FwcGVuZCgma2V4LT5wZWVyLCBibG9iLCBibG9ibGVuKTsKKwl4ZnJlZShibG9iKTsKKwlrZXgtPmRvbmUgPSAxOworCWtleC0+ZmxhZ3MgPSBidWZmZXJfZ2V0X2ludChtKTsKKwlrZXgtPmNsaWVudF92ZXJzaW9uX3N0cmluZyA9IGJ1ZmZlcl9nZXRfc3RyaW5nKG0sIE5VTEwpOworCWtleC0+c2VydmVyX3ZlcnNpb25fc3RyaW5nID0gYnVmZmVyX2dldF9zdHJpbmcobSwgTlVMTCk7CisJa2V4LT5sb2FkX2hvc3RfcHVibGljX2tleT0mZ2V0X2hvc3RrZXlfcHVibGljX2J5X3R5cGU7CisJa2V4LT5sb2FkX2hvc3RfcHJpdmF0ZV9rZXk9JmdldF9ob3N0a2V5X3ByaXZhdGVfYnlfdHlwZTsKKwlrZXgtPmhvc3Rfa2V5X2luZGV4PSZnZXRfaG9zdGtleV9pbmRleDsKKworCXJldHVybiAoa2V4KTsKK30KKworLyogVGhpcyBmdW5jdGlvbiByZXF1cmllcyBjYXJlZnVsIHNhbml0eSBjaGVja2luZyAqLworCit2b2lkCittbV9nZXRfa2V5c3RhdGUoc3RydWN0IG1vbml0b3IgKnBtb25pdG9yKQoreworCUJ1ZmZlciBtOworCXVfY2hhciAqYmxvYiwgKnA7CisJdV9pbnQgYmxvYmxlbiwgcGxlbjsKKwl1X2ludDMyX3Qgc2VxbnIsIHBhY2tldHM7CisJdV9pbnQ2NF90IGJsb2NrcywgYnl0ZXM7CisKKwlkZWJ1ZzMoIiVzOiBXYWl0aW5nIGZvciBuZXcga2V5cyIsIF9fZnVuY19fKTsKKworCWJ1ZmZlcl9pbml0KCZtKTsKKwltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3NlbmRmZCwgTU9OSVRPUl9SRVFfS0VZRVhQT1JULCAmbSk7CisJaWYgKCFjb21wYXQyMCkgeworCQljaGlsZF9zdGF0ZS5zc2gxcHJvdG9mbGFncyA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKKwkJY2hpbGRfc3RhdGUuc3NoMWNpcGhlciA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKKwkJY2hpbGRfc3RhdGUuc3NoMWtleSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLAorCQkgICAgJmNoaWxkX3N0YXRlLnNzaDFrZXlsZW4pOworCQljaGlsZF9zdGF0ZS5pdm91dCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLAorCQkgICAgJmNoaWxkX3N0YXRlLml2b3V0bGVuKTsKKwkJY2hpbGRfc3RhdGUuaXZpbiA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCAmY2hpbGRfc3RhdGUuaXZpbmxlbik7CisJCWdvdG8gc2tpcDsKKwl9IGVsc2UgeworCQkvKiBHZXQgdGhlIEtleCBmb3IgcmVrZXlpbmcgKi8KKwkJKnBtb25pdG9yLT5tX3BrZXggPSBtbV9nZXRfa2V4KCZtKTsKKwl9CisKKwlibG9iID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sICZibG9ibGVuKTsKKwljdXJyZW50X2tleXNbTU9ERV9PVVRdID0gbW1fbmV3a2V5c19mcm9tX2Jsb2IoYmxvYiwgYmxvYmxlbik7CisJeGZyZWUoYmxvYik7CisKKwlkZWJ1ZzMoIiVzOiBXYWl0aW5nIGZvciBzZWNvbmQga2V5IiwgX19mdW5jX18pOworCWJsb2IgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgJmJsb2JsZW4pOworCWN1cnJlbnRfa2V5c1tNT0RFX0lOXSA9IG1tX25ld2tleXNfZnJvbV9ibG9iKGJsb2IsIGJsb2JsZW4pOworCXhmcmVlKGJsb2IpOworCisJLyogTm93IGdldCBzZXF1ZW5jZSBudW1iZXJzIGZvciB0aGUgcGFja2V0cyAqLworCXNlcW5yID0gYnVmZmVyX2dldF9pbnQoJm0pOworCWJsb2NrcyA9IGJ1ZmZlcl9nZXRfaW50NjQoJm0pOworCXBhY2tldHMgPSBidWZmZXJfZ2V0X2ludCgmbSk7CisJYnl0ZXMgPSBidWZmZXJfZ2V0X2ludDY0KCZtKTsKKwlwYWNrZXRfc2V0X3N0YXRlKE1PREVfT1VULCBzZXFuciwgYmxvY2tzLCBwYWNrZXRzLCBieXRlcyk7CisJc2VxbnIgPSBidWZmZXJfZ2V0X2ludCgmbSk7CisJYmxvY2tzID0gYnVmZmVyX2dldF9pbnQ2NCgmbSk7CisJcGFja2V0cyA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKKwlieXRlcyA9IGJ1ZmZlcl9nZXRfaW50NjQoJm0pOworCXBhY2tldF9zZXRfc3RhdGUoTU9ERV9JTiwgc2VxbnIsIGJsb2NrcywgcGFja2V0cywgYnl0ZXMpOworCisgc2tpcDoKKwkvKiBHZXQgdGhlIGtleSBjb250ZXh0ICovCisJY2hpbGRfc3RhdGUua2V5b3V0ID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sICZjaGlsZF9zdGF0ZS5rZXlvdXRsZW4pOworCWNoaWxkX3N0YXRlLmtleWluICA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCAmY2hpbGRfc3RhdGUua2V5aW5sZW4pOworCisJZGVidWczKCIlczogR2V0dGluZyBjb21wcmVzc2lvbiBzdGF0ZSIsIF9fZnVuY19fKTsKKwkvKiBHZXQgY29tcHJlc3Npb24gc3RhdGUgKi8KKwlwID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sICZwbGVuKTsKKwlpZiAocGxlbiAhPSBzaXplb2YoY2hpbGRfc3RhdGUub3V0Z29pbmcpKQorCQlmYXRhbCgiJXM6IGJhZCByZXF1ZXN0IHNpemUiLCBfX2Z1bmNfXyk7CisJbWVtY3B5KCZjaGlsZF9zdGF0ZS5vdXRnb2luZywgcCwgc2l6ZW9mKGNoaWxkX3N0YXRlLm91dGdvaW5nKSk7CisJeGZyZWUocCk7CisKKwlwID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sICZwbGVuKTsKKwlpZiAocGxlbiAhPSBzaXplb2YoY2hpbGRfc3RhdGUuaW5jb21pbmcpKQorCQlmYXRhbCgiJXM6IGJhZCByZXF1ZXN0IHNpemUiLCBfX2Z1bmNfXyk7CisJbWVtY3B5KCZjaGlsZF9zdGF0ZS5pbmNvbWluZywgcCwgc2l6ZW9mKGNoaWxkX3N0YXRlLmluY29taW5nKSk7CisJeGZyZWUocCk7CisKKwkvKiBOZXR3b3JrIEkvTyBidWZmZXJzICovCisJZGVidWczKCIlczogR2V0dGluZyBOZXR3b3JrIEkvTyBidWZmZXJzIiwgX19mdW5jX18pOworCWNoaWxkX3N0YXRlLmlucHV0ID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sICZjaGlsZF9zdGF0ZS5pbGVuKTsKKwljaGlsZF9zdGF0ZS5vdXRwdXQgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgJmNoaWxkX3N0YXRlLm9sZW4pOworCisJLyogUm9hbWluZyAqLworCWlmIChjb21wYXQyMCkgeworCQljaGlsZF9zdGF0ZS5zZW50X2J5dGVzID0gYnVmZmVyX2dldF9pbnQ2NCgmbSk7CisJCWNoaWxkX3N0YXRlLnJlY3ZfYnl0ZXMgPSBidWZmZXJfZ2V0X2ludDY0KCZtKTsKKwl9CisKKwlidWZmZXJfZnJlZSgmbSk7Cit9CisKKworLyogQWxsb2NhdGlvbiBmdW5jdGlvbnMgZm9yIHpsaWIgKi8KK3ZvaWQgKgorbW1femFsbG9jKHN0cnVjdCBtbV9tYXN0ZXIgKm1tLCB1X2ludCBuY291bnQsIHVfaW50IHNpemUpCit7CisJc2l6ZV90IGxlbiA9IChzaXplX3QpIHNpemUgKiBuY291bnQ7CisJdm9pZCAqYWRkcmVzczsKKworCWlmIChsZW4gPT0gMCB8fCBuY291bnQgPiBTSVpFX1RfTUFYIC8gc2l6ZSkKKwkJZmF0YWwoIiVzOiBtbV96YWxsb2MoJXUsICV1KSIsIF9fZnVuY19fLCBuY291bnQsIHNpemUpOworCisJYWRkcmVzcyA9IG1tX21hbGxvYyhtbSwgbGVuKTsKKworCXJldHVybiAoYWRkcmVzcyk7Cit9CisKK3ZvaWQKK21tX3pmcmVlKHN0cnVjdCBtbV9tYXN0ZXIgKm1tLCB2b2lkICphZGRyZXNzKQoreworCW1tX2ZyZWUobW0sIGFkZHJlc3MpOworfQorCit2b2lkCittbV9pbml0X2NvbXByZXNzaW9uKHN0cnVjdCBtbV9tYXN0ZXIgKm1tKQoreworCW91dGdvaW5nX3N0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYyltbV96YWxsb2M7CisJb3V0Z29pbmdfc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYyltbV96ZnJlZTsKKwlvdXRnb2luZ19zdHJlYW0ub3BhcXVlID0gbW07CisKKwlpbmNvbWluZ19zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpbW1femFsbG9jOworCWluY29taW5nX3N0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpbW1femZyZWU7CisJaW5jb21pbmdfc3RyZWFtLm9wYXF1ZSA9IG1tOworfQorCisvKiBYWFggKi8KKworI2RlZmluZSBGRF9DTE9TRU9ORVhFQyh4KSBkbyB7IFwKKwlpZiAoZmNudGwoeCwgRl9TRVRGRCwgRkRfQ0xPRVhFQykgPT0gLTEpIFwKKwkJZmF0YWwoImZjbnRsKCVkLCBGX1NFVEZEKSIsIHgpOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZAorbW9uaXRvcl9vcGVuZmRzKHN0cnVjdCBtb25pdG9yICptb24sIGludCBkb19sb2dmZHMpCit7CisJaW50IHBhaXJbMl07CisKKwlpZiAoc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgcGFpcikgPT0gLTEpCisJCWZhdGFsKCIlczogc29ja2V0cGFpcjogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwlGRF9DTE9TRU9ORVhFQyhwYWlyWzBdKTsKKwlGRF9DTE9TRU9ORVhFQyhwYWlyWzFdKTsKKwltb24tPm1fcmVjdmZkID0gcGFpclswXTsKKwltb24tPm1fc2VuZGZkID0gcGFpclsxXTsKKworCWlmIChkb19sb2dmZHMpIHsKKwkJaWYgKHBpcGUocGFpcikgPT0gLTEpCisJCQlmYXRhbCgiJXM6IHBpcGU6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJCUZEX0NMT1NFT05FWEVDKHBhaXJbMF0pOworCQlGRF9DTE9TRU9ORVhFQyhwYWlyWzFdKTsKKwkJbW9uLT5tX2xvZ19yZWN2ZmQgPSBwYWlyWzBdOworCQltb24tPm1fbG9nX3NlbmRmZCA9IHBhaXJbMV07CisJfSBlbHNlCisJCW1vbi0+bV9sb2dfcmVjdmZkID0gbW9uLT5tX2xvZ19zZW5kZmQgPSAtMTsKK30KKworI2RlZmluZSBNTV9NRU1TSVpFCTY1NTM2CisKK3N0cnVjdCBtb25pdG9yICoKK21vbml0b3JfaW5pdCh2b2lkKQoreworCXN0cnVjdCBtb25pdG9yICptb247CisKKwltb24gPSB4Y2FsbG9jKDEsIHNpemVvZigqbW9uKSk7CisKKwltb25pdG9yX29wZW5mZHMobW9uLCAxKTsKKworCS8qIFVzZWQgdG8gc2hhcmUgemxpYiBzcGFjZSBhY3Jvc3MgcHJvY2Vzc2VzICovCisJaWYgKG9wdGlvbnMuY29tcHJlc3Npb24pIHsKKwkJbW9uLT5tX3piYWNrID0gbW1fY3JlYXRlKE5VTEwsIE1NX01FTVNJWkUpOworCQltb24tPm1femxpYiA9IG1tX2NyZWF0ZShtb24tPm1femJhY2ssIDIwICogTU1fTUVNU0laRSk7CisKKwkJLyogQ29tcHJlc3Npb24gbmVlZHMgdG8gc2hhcmUgc3RhdGUgYWNyb3NzIGJvcmRlcnMgKi8KKwkJbW1faW5pdF9jb21wcmVzc2lvbihtb24tPm1femxpYik7CisJfQorCisJcmV0dXJuIG1vbjsKK30KKwordm9pZAorbW9uaXRvcl9yZWluaXQoc3RydWN0IG1vbml0b3IgKm1vbikKK3sKKwltb25pdG9yX29wZW5mZHMobW9uLCAwKTsKK30KKworI2lmZGVmIEdTU0FQSQoraW50CittbV9hbnN3ZXJfZ3NzX3NldHVwX2N0eChpbnQgc29jaywgQnVmZmVyICptKQoreworCWdzc19PSURfZGVzYyBnb2lkOworCU9NX3VpbnQzMiBtYWpvcjsKKwl1X2ludCBsZW47CisKKwlnb2lkLmVsZW1lbnRzID0gYnVmZmVyX2dldF9zdHJpbmcobSwgJmxlbik7CisJZ29pZC5sZW5ndGggPSBsZW47CisKKwltYWpvciA9IHNzaF9nc3NhcGlfc2VydmVyX2N0eCgmZ3NzY29udGV4dCwgJmdvaWQpOworCisJeGZyZWUoZ29pZC5lbGVtZW50cyk7CisKKwlidWZmZXJfY2xlYXIobSk7CisJYnVmZmVyX3B1dF9pbnQobSwgbWFqb3IpOworCisJbW1fcmVxdWVzdF9zZW5kKHNvY2ssIE1PTklUT1JfQU5TX0dTU1NFVFVQLCBtKTsKKworCS8qIE5vdyB3ZSBoYXZlIGEgY29udGV4dCwgZW5hYmxlIHRoZSBzdGVwICovCisJbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9HU1NTVEVQLCAxKTsKKworCXJldHVybiAoMCk7Cit9CisKK2ludAorbW1fYW5zd2VyX2dzc19hY2NlcHRfY3R4KGludCBzb2NrLCBCdWZmZXIgKm0pCit7CisJZ3NzX2J1ZmZlcl9kZXNjIGluOworCWdzc19idWZmZXJfZGVzYyBvdXQgPSBHU1NfQ19FTVBUWV9CVUZGRVI7CisJT01fdWludDMyIG1ham9yLCBtaW5vcjsKKwlPTV91aW50MzIgZmxhZ3MgPSAwOyAvKiBHU0kgbmVlZHMgdGhpcyAqLworCXVfaW50IGxlbjsKKworCWluLnZhbHVlID0gYnVmZmVyX2dldF9zdHJpbmcobSwgJmxlbik7CisJaW4ubGVuZ3RoID0gbGVuOworCW1ham9yID0gc3NoX2dzc2FwaV9hY2NlcHRfY3R4KGdzc2NvbnRleHQsICZpbiwgJm91dCwgJmZsYWdzKTsKKwl4ZnJlZShpbi52YWx1ZSk7CisKKwlidWZmZXJfY2xlYXIobSk7CisJYnVmZmVyX3B1dF9pbnQobSwgbWFqb3IpOworCWJ1ZmZlcl9wdXRfc3RyaW5nKG0sIG91dC52YWx1ZSwgb3V0Lmxlbmd0aCk7CisJYnVmZmVyX3B1dF9pbnQobSwgZmxhZ3MpOworCW1tX3JlcXVlc3Rfc2VuZChzb2NrLCBNT05JVE9SX0FOU19HU1NTVEVQLCBtKTsKKworCWdzc19yZWxlYXNlX2J1ZmZlcigmbWlub3IsICZvdXQpOworCisJaWYgKG1ham9yID09IEdTU19TX0NPTVBMRVRFKSB7CisJCW1vbml0b3JfcGVybWl0KG1vbl9kaXNwYXRjaCwgTU9OSVRPUl9SRVFfR1NTU1RFUCwgMCk7CisJCW1vbml0b3JfcGVybWl0KG1vbl9kaXNwYXRjaCwgTU9OSVRPUl9SRVFfR1NTVVNFUk9LLCAxKTsKKwkJbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9HU1NDSEVDS01JQywgMSk7CisJfQorCXJldHVybiAoMCk7Cit9CisKK2ludAorbW1fYW5zd2VyX2dzc19jaGVja21pYyhpbnQgc29jaywgQnVmZmVyICptKQoreworCWdzc19idWZmZXJfZGVzYyBnc3NidWYsIG1pYzsKKwlPTV91aW50MzIgcmV0OworCXVfaW50IGxlbjsKKworCWdzc2J1Zi52YWx1ZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKG0sICZsZW4pOworCWdzc2J1Zi5sZW5ndGggPSBsZW47CisJbWljLnZhbHVlID0gYnVmZmVyX2dldF9zdHJpbmcobSwgJmxlbik7CisJbWljLmxlbmd0aCA9IGxlbjsKKworCXJldCA9IHNzaF9nc3NhcGlfY2hlY2ttaWMoZ3NzY29udGV4dCwgJmdzc2J1ZiwgJm1pYyk7CisKKwl4ZnJlZShnc3NidWYudmFsdWUpOworCXhmcmVlKG1pYy52YWx1ZSk7CisKKwlidWZmZXJfY2xlYXIobSk7CisJYnVmZmVyX3B1dF9pbnQobSwgcmV0KTsKKworCW1tX3JlcXVlc3Rfc2VuZChzb2NrLCBNT05JVE9SX0FOU19HU1NDSEVDS01JQywgbSk7CisKKwlpZiAoIUdTU19FUlJPUihyZXQpKQorCQltb25pdG9yX3Blcm1pdChtb25fZGlzcGF0Y2gsIE1PTklUT1JfUkVRX0dTU1VTRVJPSywgMSk7CisKKwlyZXR1cm4gKDApOworfQorCitpbnQKK21tX2Fuc3dlcl9nc3NfdXNlcm9rKGludCBzb2NrLCBCdWZmZXIgKm0pCit7CisJaW50IGF1dGhlbnRpY2F0ZWQ7CisKKwlhdXRoZW50aWNhdGVkID0gYXV0aGN0eHQtPnZhbGlkICYmIHNzaF9nc3NhcGlfdXNlcm9rKGF1dGhjdHh0LT51c2VyKTsKKworCWJ1ZmZlcl9jbGVhcihtKTsKKwlidWZmZXJfcHV0X2ludChtLCBhdXRoZW50aWNhdGVkKTsKKworCWRlYnVnMygiJXM6IHNlbmRpbmcgcmVzdWx0ICVkIiwgX19mdW5jX18sIGF1dGhlbnRpY2F0ZWQpOworCW1tX3JlcXVlc3Rfc2VuZChzb2NrLCBNT05JVE9SX0FOU19HU1NVU0VST0ssIG0pOworCisJYXV0aF9tZXRob2QgPSAiZ3NzYXBpLXdpdGgtbWljIjsKKworCS8qIE1vbml0b3IgbG9vcCB3aWxsIHRlcm1pbmF0ZSBpZiBhdXRoZW50aWNhdGVkICovCisJcmV0dXJuIChhdXRoZW50aWNhdGVkKTsKK30KKyNlbmRpZiAvKiBHU1NBUEkgKi8KKworI2lmZGVmIEpQQUtFCitpbnQKK21tX2Fuc3dlcl9qcGFrZV9zdGVwMShpbnQgc29jaywgQnVmZmVyICptKQoreworCXN0cnVjdCBqcGFrZV9jdHggKnBjdHg7CisJdV9jaGFyICp4M19wcm9vZiwgKng0X3Byb29mOworCXVfaW50IHgzX3Byb29mX2xlbiwgeDRfcHJvb2ZfbGVuOworCisJaWYgKCFvcHRpb25zLnplcm9fa25vd2xlZGdlX3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uKQorCQlmYXRhbCgiemVyb19rbm93bGVkZ2VfcGFzc3dvcmRfYXV0aGVudGljYXRpb24gZGlzYWJsZWQiKTsKKworCWlmIChhdXRoY3R4dC0+anBha2VfY3R4ICE9IE5VTEwpCisJCWZhdGFsKCIlczogYXV0aGN0eHQtPmpwYWtlX2N0eCBhbHJlYWR5IHNldCAoJXApIiwKKwkJICAgIF9fZnVuY19fLCBhdXRoY3R4dC0+anBha2VfY3R4KTsKKwlhdXRoY3R4dC0+anBha2VfY3R4ID0gcGN0eCA9IGpwYWtlX25ldygpOworCisJanBha2Vfc3RlcDEocGN0eC0+Z3JwLAorCSAgICAmcGN0eC0+c2VydmVyX2lkLCAmcGN0eC0+c2VydmVyX2lkX2xlbiwKKwkgICAgJnBjdHgtPngzLCAmcGN0eC0+eDQsICZwY3R4LT5nX3gzLCAmcGN0eC0+Z194NCwKKwkgICAgJngzX3Byb29mLCAmeDNfcHJvb2ZfbGVuLAorCSAgICAmeDRfcHJvb2YsICZ4NF9wcm9vZl9sZW4pOworCisJSlBBS0VfREVCVUdfQ1RYKChwY3R4LCAic3RlcDEgZG9uZSBpbiAlcyIsIF9fZnVuY19fKSk7CisKKwlidWZmZXJfY2xlYXIobSk7CisKKwlidWZmZXJfcHV0X3N0cmluZyhtLCBwY3R4LT5zZXJ2ZXJfaWQsIHBjdHgtPnNlcnZlcl9pZF9sZW4pOworCWJ1ZmZlcl9wdXRfYmlnbnVtMihtLCBwY3R4LT5nX3gzKTsKKwlidWZmZXJfcHV0X2JpZ251bTIobSwgcGN0eC0+Z194NCk7CisJYnVmZmVyX3B1dF9zdHJpbmcobSwgeDNfcHJvb2YsIHgzX3Byb29mX2xlbik7CisJYnVmZmVyX3B1dF9zdHJpbmcobSwgeDRfcHJvb2YsIHg0X3Byb29mX2xlbik7CisKKwlkZWJ1ZzMoIiVzOiBzZW5kaW5nIHN0ZXAxIiwgX19mdW5jX18pOworCW1tX3JlcXVlc3Rfc2VuZChzb2NrLCBNT05JVE9SX0FOU19KUEFLRV9TVEVQMSwgbSk7CisKKwliemVybyh4M19wcm9vZiwgeDNfcHJvb2ZfbGVuKTsKKwliemVybyh4NF9wcm9vZiwgeDRfcHJvb2ZfbGVuKTsKKwl4ZnJlZSh4M19wcm9vZik7CisJeGZyZWUoeDRfcHJvb2YpOworCisJbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9KUEFLRV9HRVRfUFdEQVRBLCAxKTsKKwltb25pdG9yX3Blcm1pdChtb25fZGlzcGF0Y2gsIE1PTklUT1JfUkVRX0pQQUtFX1NURVAxLCAwKTsKKworCXJldHVybiAwOworfQorCitpbnQKK21tX2Fuc3dlcl9qcGFrZV9nZXRfcHdkYXRhKGludCBzb2NrLCBCdWZmZXIgKm0pCit7CisJc3RydWN0IGpwYWtlX2N0eCAqcGN0eCA9IGF1dGhjdHh0LT5qcGFrZV9jdHg7CisJY2hhciAqaGFzaF9zY2hlbWUsICpzYWx0OworCisJaWYgKHBjdHggPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBwY3R4ID09IE5VTEwiLCBfX2Z1bmNfXyk7CisKKwlhdXRoMl9qcGFrZV9nZXRfcHdkYXRhKGF1dGhjdHh0LCAmcGN0eC0+cywgJmhhc2hfc2NoZW1lLCAmc2FsdCk7CisKKwlidWZmZXJfY2xlYXIobSk7CisJLyogcGN0eC0+cyBpcyBzZW5zaXRpdmUsIG5vdCByZXR1cm5lZCB0byBzbGF2ZSAqLworCWJ1ZmZlcl9wdXRfY3N0cmluZyhtLCBoYXNoX3NjaGVtZSk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKG0sIHNhbHQpOworCisJZGVidWczKCIlczogc2VuZGluZyBwd2RhdGEiLCBfX2Z1bmNfXyk7CisJbW1fcmVxdWVzdF9zZW5kKHNvY2ssIE1PTklUT1JfQU5TX0pQQUtFX0dFVF9QV0RBVEEsIG0pOworCisJYnplcm8oaGFzaF9zY2hlbWUsIHN0cmxlbihoYXNoX3NjaGVtZSkpOworCWJ6ZXJvKHNhbHQsIHN0cmxlbihzYWx0KSk7CisJeGZyZWUoaGFzaF9zY2hlbWUpOworCXhmcmVlKHNhbHQpOworCisJbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9KUEFLRV9TVEVQMiwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50CittbV9hbnN3ZXJfanBha2Vfc3RlcDIoaW50IHNvY2ssIEJ1ZmZlciAqbSkKK3sKKwlzdHJ1Y3QganBha2VfY3R4ICpwY3R4ID0gYXV0aGN0eHQtPmpwYWtlX2N0eDsKKwl1X2NoYXIgKngxX3Byb29mLCAqeDJfcHJvb2YsICp4NF9zX3Byb29mOworCXVfaW50IHgxX3Byb29mX2xlbiwgeDJfcHJvb2ZfbGVuLCB4NF9zX3Byb29mX2xlbjsKKworCWlmIChwY3R4ID09IE5VTEwpCisJCWZhdGFsKCIlczogcGN0eCA9PSBOVUxMIiwgX19mdW5jX18pOworCisJaWYgKChwY3R4LT5nX3gxID0gQk5fbmV3KCkpID09IE5VTEwgfHwKKwkgICAgKHBjdHgtPmdfeDIgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBCTl9uZXciLCBfX2Z1bmNfXyk7CisJYnVmZmVyX2dldF9iaWdudW0yKG0sIHBjdHgtPmdfeDEpOworCWJ1ZmZlcl9nZXRfYmlnbnVtMihtLCBwY3R4LT5nX3gyKTsKKwlwY3R4LT5jbGllbnRfaWQgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCAmcGN0eC0+Y2xpZW50X2lkX2xlbik7CisJeDFfcHJvb2YgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCAmeDFfcHJvb2ZfbGVuKTsKKwl4Ml9wcm9vZiA9IGJ1ZmZlcl9nZXRfc3RyaW5nKG0sICZ4Ml9wcm9vZl9sZW4pOworCisJanBha2Vfc3RlcDIocGN0eC0+Z3JwLCBwY3R4LT5zLCBwY3R4LT5nX3gzLAorCSAgICBwY3R4LT5nX3gxLCBwY3R4LT5nX3gyLCBwY3R4LT54NCwKKwkgICAgcGN0eC0+Y2xpZW50X2lkLCBwY3R4LT5jbGllbnRfaWRfbGVuLAorCSAgICBwY3R4LT5zZXJ2ZXJfaWQsIHBjdHgtPnNlcnZlcl9pZF9sZW4sCisJICAgIHgxX3Byb29mLCB4MV9wcm9vZl9sZW4sCisJICAgIHgyX3Byb29mLCB4Ml9wcm9vZl9sZW4sCisJICAgICZwY3R4LT5iLAorCSAgICAmeDRfc19wcm9vZiwgJng0X3NfcHJvb2ZfbGVuKTsKKworCUpQQUtFX0RFQlVHX0NUWCgocGN0eCwgInN0ZXAyIGRvbmUgaW4gJXMiLCBfX2Z1bmNfXykpOworCisJYnplcm8oeDFfcHJvb2YsIHgxX3Byb29mX2xlbik7CisJYnplcm8oeDJfcHJvb2YsIHgyX3Byb29mX2xlbik7CisJeGZyZWUoeDFfcHJvb2YpOworCXhmcmVlKHgyX3Byb29mKTsKKworCWJ1ZmZlcl9jbGVhcihtKTsKKworCWJ1ZmZlcl9wdXRfYmlnbnVtMihtLCBwY3R4LT5iKTsKKwlidWZmZXJfcHV0X3N0cmluZyhtLCB4NF9zX3Byb29mLCB4NF9zX3Byb29mX2xlbik7CisKKwlkZWJ1ZzMoIiVzOiBzZW5kaW5nIHN0ZXAyIiwgX19mdW5jX18pOworCW1tX3JlcXVlc3Rfc2VuZChzb2NrLCBNT05JVE9SX0FOU19KUEFLRV9TVEVQMiwgbSk7CisKKwliemVybyh4NF9zX3Byb29mLCB4NF9zX3Byb29mX2xlbik7CisJeGZyZWUoeDRfc19wcm9vZik7CisKKwltb25pdG9yX3Blcm1pdChtb25fZGlzcGF0Y2gsIE1PTklUT1JfUkVRX0pQQUtFX0tFWV9DT05GSVJNLCAxKTsKKworCXJldHVybiAwOworfQorCitpbnQKK21tX2Fuc3dlcl9qcGFrZV9rZXlfY29uZmlybShpbnQgc29jaywgQnVmZmVyICptKQoreworCXN0cnVjdCBqcGFrZV9jdHggKnBjdHggPSBhdXRoY3R4dC0+anBha2VfY3R4OworCXVfY2hhciAqeDJfc19wcm9vZjsKKwl1X2ludCB4Ml9zX3Byb29mX2xlbjsKKworCWlmIChwY3R4ID09IE5VTEwpCisJCWZhdGFsKCIlczogcGN0eCA9PSBOVUxMIiwgX19mdW5jX18pOworCisJaWYgKChwY3R4LT5hID0gQk5fbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCIlczogQk5fbmV3IiwgX19mdW5jX18pOworCWJ1ZmZlcl9nZXRfYmlnbnVtMihtLCBwY3R4LT5hKTsKKwl4Ml9zX3Byb29mID0gYnVmZmVyX2dldF9zdHJpbmcobSwgJngyX3NfcHJvb2ZfbGVuKTsKKworCWpwYWtlX2tleV9jb25maXJtKHBjdHgtPmdycCwgcGN0eC0+cywgcGN0eC0+YSwKKwkgICAgcGN0eC0+eDQsIHBjdHgtPmdfeDMsIHBjdHgtPmdfeDQsIHBjdHgtPmdfeDEsIHBjdHgtPmdfeDIsCisJICAgIHBjdHgtPnNlcnZlcl9pZCwgcGN0eC0+c2VydmVyX2lkX2xlbiwKKwkgICAgcGN0eC0+Y2xpZW50X2lkLCBwY3R4LT5jbGllbnRfaWRfbGVuLAorCSAgICBzZXNzaW9uX2lkMiwgc2Vzc2lvbl9pZDJfbGVuLAorCSAgICB4Ml9zX3Byb29mLCB4Ml9zX3Byb29mX2xlbiwKKwkgICAgJnBjdHgtPmssCisJICAgICZwY3R4LT5oX2tfc2lkX3Nlc3NpZCwgJnBjdHgtPmhfa19zaWRfc2Vzc2lkX2xlbik7CisKKwlKUEFLRV9ERUJVR19DVFgoKHBjdHgsICJrZXlfY29uZmlybSBkb25lIGluICVzIiwgX19mdW5jX18pKTsKKworCWJ6ZXJvKHgyX3NfcHJvb2YsIHgyX3NfcHJvb2ZfbGVuKTsKKwlidWZmZXJfY2xlYXIobSk7CisKKwkvKiBwY3R4LT5rIGlzIHNlbnNpdGl2ZSwgbm90IHNlbnQgKi8KKwlidWZmZXJfcHV0X3N0cmluZyhtLCBwY3R4LT5oX2tfc2lkX3Nlc3NpZCwgcGN0eC0+aF9rX3NpZF9zZXNzaWRfbGVuKTsKKworCWRlYnVnMygiJXM6IHNlbmRpbmcgY29uZmlybWF0aW9uIGhhc2giLCBfX2Z1bmNfXyk7CisJbW1fcmVxdWVzdF9zZW5kKHNvY2ssIE1PTklUT1JfQU5TX0pQQUtFX0tFWV9DT05GSVJNLCBtKTsKKworCW1vbml0b3JfcGVybWl0KG1vbl9kaXNwYXRjaCwgTU9OSVRPUl9SRVFfSlBBS0VfQ0hFQ0tfQ09ORklSTSwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50CittbV9hbnN3ZXJfanBha2VfY2hlY2tfY29uZmlybShpbnQgc29jaywgQnVmZmVyICptKQoreworCWludCBhdXRoZW50aWNhdGVkID0gMDsKKwl1X2NoYXIgKnBlZXJfY29uZmlybV9oYXNoOworCXVfaW50IHBlZXJfY29uZmlybV9oYXNoX2xlbjsKKwlzdHJ1Y3QganBha2VfY3R4ICpwY3R4ID0gYXV0aGN0eHQtPmpwYWtlX2N0eDsKKworCWlmIChwY3R4ID09IE5VTEwpCisJCWZhdGFsKCIlczogcGN0eCA9PSBOVUxMIiwgX19mdW5jX18pOworCisJcGVlcl9jb25maXJtX2hhc2ggPSBidWZmZXJfZ2V0X3N0cmluZyhtLCAmcGVlcl9jb25maXJtX2hhc2hfbGVuKTsKKworCWF1dGhlbnRpY2F0ZWQgPSBqcGFrZV9jaGVja19jb25maXJtKHBjdHgtPmssCisJICAgIHBjdHgtPmNsaWVudF9pZCwgcGN0eC0+Y2xpZW50X2lkX2xlbiwKKwkgICAgc2Vzc2lvbl9pZDIsIHNlc3Npb25faWQyX2xlbiwKKwkgICAgcGVlcl9jb25maXJtX2hhc2gsIHBlZXJfY29uZmlybV9oYXNoX2xlbikgJiYgYXV0aGN0eHQtPnZhbGlkOworCisJSlBBS0VfREVCVUdfQ1RYKChwY3R4LCAiY2hlY2tfY29uZmlybSBkb25lIGluICVzIiwgX19mdW5jX18pKTsKKworCWJ6ZXJvKHBlZXJfY29uZmlybV9oYXNoLCBwZWVyX2NvbmZpcm1faGFzaF9sZW4pOworCXhmcmVlKHBlZXJfY29uZmlybV9oYXNoKTsKKworCWJ1ZmZlcl9jbGVhcihtKTsKKwlidWZmZXJfcHV0X2ludChtLCBhdXRoZW50aWNhdGVkKTsKKworCWRlYnVnMygiJXM6IHNlbmRpbmcgcmVzdWx0ICVkIiwgX19mdW5jX18sIGF1dGhlbnRpY2F0ZWQpOworCW1tX3JlcXVlc3Rfc2VuZChzb2NrLCBNT05JVE9SX0FOU19KUEFLRV9DSEVDS19DT05GSVJNLCBtKTsKKworCW1vbml0b3JfcGVybWl0KG1vbl9kaXNwYXRjaCwgTU9OSVRPUl9SRVFfSlBBS0VfU1RFUDEsIDEpOworCisJYXV0aF9tZXRob2QgPSAianBha2UtMDFAb3BlbnNzaC5jb20iOworCXJldHVybiBhdXRoZW50aWNhdGVkOworfQorCisjZW5kaWYgLyogSlBBS0UgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvbW9uaXRvci5oIGIvb3BlbnNzaC02LjBwMS9tb25pdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU3ZDU1MgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvbW9uaXRvci5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qICRPcGVuQlNEOiBtb25pdG9yLmgsdiAxLjE2IDIwMTEvMDYvMTcgMjE6NDQ6MzEgZGptIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiBOaWVscyBQcm92b3MgPHByb3Zvc0BjaXRpLnVtaWNoLmVkdT4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX01PTklUT1JfSF8KKyNkZWZpbmUgX01PTklUT1JfSF8KKworZW51bSBtb25pdG9yX3JlcXR5cGUgeworCU1PTklUT1JfUkVRX01PRFVMSSwgTU9OSVRPUl9BTlNfTU9EVUxJLAorCU1PTklUT1JfUkVRX0ZSRUUsIE1PTklUT1JfUkVRX0FVVEhTRVJWLAorCU1PTklUT1JfUkVRX1NJR04sIE1PTklUT1JfQU5TX1NJR04sCisJTU9OSVRPUl9SRVFfUFdOQU0sIE1PTklUT1JfQU5TX1BXTkFNLAorCU1PTklUT1JfUkVRX0FVVEgyX1JFQURfQkFOTkVSLCBNT05JVE9SX0FOU19BVVRIMl9SRUFEX0JBTk5FUiwKKwlNT05JVE9SX1JFUV9BVVRIUEFTU1dPUkQsIE1PTklUT1JfQU5TX0FVVEhQQVNTV09SRCwKKwlNT05JVE9SX1JFUV9CU0RBVVRIUVVFUlksIE1PTklUT1JfQU5TX0JTREFVVEhRVUVSWSwKKwlNT05JVE9SX1JFUV9CU0RBVVRIUkVTUE9ORCwgTU9OSVRPUl9BTlNfQlNEQVVUSFJFU1BPTkQsCisJTU9OSVRPUl9SRVFfU0tFWVFVRVJZLCBNT05JVE9SX0FOU19TS0VZUVVFUlksCisJTU9OSVRPUl9SRVFfU0tFWVJFU1BPTkQsIE1PTklUT1JfQU5TX1NLRVlSRVNQT05ELAorCU1PTklUT1JfUkVRX0tFWUFMTE9XRUQsIE1PTklUT1JfQU5TX0tFWUFMTE9XRUQsCisJTU9OSVRPUl9SRVFfS0VZVkVSSUZZLCBNT05JVE9SX0FOU19LRVlWRVJJRlksCisJTU9OSVRPUl9SRVFfS0VZRVhQT1JULAorCU1PTklUT1JfUkVRX1BUWSwgTU9OSVRPUl9BTlNfUFRZLAorCU1PTklUT1JfUkVRX1BUWUNMRUFOVVAsCisJTU9OSVRPUl9SRVFfU0VTU0tFWSwgTU9OSVRPUl9BTlNfU0VTU0tFWSwKKwlNT05JVE9SX1JFUV9TRVNTSUQsCisJTU9OSVRPUl9SRVFfUlNBS0VZQUxMT1dFRCwgTU9OSVRPUl9BTlNfUlNBS0VZQUxMT1dFRCwKKwlNT05JVE9SX1JFUV9SU0FDSEFMTEVOR0UsIE1PTklUT1JfQU5TX1JTQUNIQUxMRU5HRSwKKwlNT05JVE9SX1JFUV9SU0FSRVNQT05TRSwgTU9OSVRPUl9BTlNfUlNBUkVTUE9OU0UsCisJTU9OSVRPUl9SRVFfR1NTU0VUVVAsIE1PTklUT1JfQU5TX0dTU1NFVFVQLAorCU1PTklUT1JfUkVRX0dTU1NURVAsIE1PTklUT1JfQU5TX0dTU1NURVAsCisJTU9OSVRPUl9SRVFfR1NTVVNFUk9LLCBNT05JVE9SX0FOU19HU1NVU0VST0ssCisJTU9OSVRPUl9SRVFfR1NTQ0hFQ0tNSUMsIE1PTklUT1JfQU5TX0dTU0NIRUNLTUlDLAorCU1PTklUT1JfUkVRX1BBTV9TVEFSVCwKKwlNT05JVE9SX1JFUV9QQU1fQUNDT1VOVCwgTU9OSVRPUl9BTlNfUEFNX0FDQ09VTlQsCisJTU9OSVRPUl9SRVFfUEFNX0lOSVRfQ1RYLCBNT05JVE9SX0FOU19QQU1fSU5JVF9DVFgsCisJTU9OSVRPUl9SRVFfUEFNX1FVRVJZLCBNT05JVE9SX0FOU19QQU1fUVVFUlksCisJTU9OSVRPUl9SRVFfUEFNX1JFU1BPTkQsIE1PTklUT1JfQU5TX1BBTV9SRVNQT05ELAorCU1PTklUT1JfUkVRX1BBTV9GUkVFX0NUWCwgTU9OSVRPUl9BTlNfUEFNX0ZSRUVfQ1RYLAorCU1PTklUT1JfUkVRX0FVRElUX0VWRU5ULCBNT05JVE9SX1JFUV9BVURJVF9DT01NQU5ELAorCU1PTklUT1JfUkVRX1RFUk0sCisJTU9OSVRPUl9SRVFfSlBBS0VfU1RFUDEsIE1PTklUT1JfQU5TX0pQQUtFX1NURVAxLAorCU1PTklUT1JfUkVRX0pQQUtFX0dFVF9QV0RBVEEsIE1PTklUT1JfQU5TX0pQQUtFX0dFVF9QV0RBVEEsCisJTU9OSVRPUl9SRVFfSlBBS0VfU1RFUDIsIE1PTklUT1JfQU5TX0pQQUtFX1NURVAyLAorCU1PTklUT1JfUkVRX0pQQUtFX0tFWV9DT05GSVJNLCBNT05JVE9SX0FOU19KUEFLRV9LRVlfQ09ORklSTSwKKwlNT05JVE9SX1JFUV9KUEFLRV9DSEVDS19DT05GSVJNLCBNT05JVE9SX0FOU19KUEFLRV9DSEVDS19DT05GSVJNLAorfTsKKworc3RydWN0IG1tX21hc3RlcjsKK3N0cnVjdCBtb25pdG9yIHsKKwlpbnQJCQkgbV9yZWN2ZmQ7CisJaW50CQkJIG1fc2VuZGZkOworCWludAkJCSBtX2xvZ19yZWN2ZmQ7CisJaW50CQkJIG1fbG9nX3NlbmRmZDsKKwlzdHJ1Y3QgbW1fbWFzdGVyCSptX3piYWNrOworCXN0cnVjdCBtbV9tYXN0ZXIJKm1femxpYjsKKwlzdHJ1Y3QgS2V4CQkqKm1fcGtleDsKKwlwaWRfdAkJCSBtX3BpZDsKK307CisKK3N0cnVjdCBtb25pdG9yICptb25pdG9yX2luaXQodm9pZCk7Cit2b2lkIG1vbml0b3JfcmVpbml0KHN0cnVjdCBtb25pdG9yICopOwordm9pZCBtb25pdG9yX3N5bmMoc3RydWN0IG1vbml0b3IgKik7CisKK3N0cnVjdCBBdXRoY3R4dDsKK3ZvaWQgbW9uaXRvcl9jaGlsZF9wcmVhdXRoKHN0cnVjdCBBdXRoY3R4dCAqLCBzdHJ1Y3QgbW9uaXRvciAqKTsKK3ZvaWQgbW9uaXRvcl9jaGlsZF9wb3N0YXV0aChzdHJ1Y3QgbW9uaXRvciAqKTsKKworc3RydWN0IG1vbl90YWJsZTsKK2ludCBtb25pdG9yX3JlYWQoc3RydWN0IG1vbml0b3IqLCBzdHJ1Y3QgbW9uX3RhYmxlICosIHN0cnVjdCBtb25fdGFibGUgKiopOworCisvKiBQcm90b3R5cGVzIGZvciByZXF1ZXN0IHNlbmRpbmcgYW5kIHJlY2VpdmluZyAqLwordm9pZCBtbV9yZXF1ZXN0X3NlbmQoaW50LCBlbnVtIG1vbml0b3JfcmVxdHlwZSwgQnVmZmVyICopOwordm9pZCBtbV9yZXF1ZXN0X3JlY2VpdmUoaW50LCBCdWZmZXIgKik7Cit2b2lkIG1tX3JlcXVlc3RfcmVjZWl2ZV9leHBlY3QoaW50LCBlbnVtIG1vbml0b3JfcmVxdHlwZSwgQnVmZmVyICopOworCisjZW5kaWYgLyogX01PTklUT1JfSF8gKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvbW9uaXRvcl9mZHBhc3MuYyBiL29wZW5zc2gtNi4wcDEvbW9uaXRvcl9mZHBhc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWI2ZjVjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9tb25pdG9yX2ZkcGFzcy5jCkBAIC0wLDAgKzEsMTgyIEBACisvKiAkT3BlbkJTRDogbW9uaXRvcl9mZHBhc3MuYyx2IDEuMTkgMjAxMC8wMS8xMiAwMDo1ODoyNSBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgMjAwMSBOaWVscyBQcm92b3MgPHByb3Zvc0BjaXRpLnVtaWNoLmVkdT4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpZmRlZiBIQVZFX1NZU19VTl9ICisjaW5jbHVkZSA8c3lzL3VuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaWZkZWYgSEFWRV9QT0xMX0gKKyNpbmNsdWRlIDxwb2xsLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgIm1vbml0b3JfZmRwYXNzLmgiCisKK2ludAorbW1fc2VuZF9mZChpbnQgc29jaywgaW50IGZkKQoreworI2lmIGRlZmluZWQoSEFWRV9TRU5ETVNHKSAmJiAoZGVmaW5lZChIQVZFX0FDQ1JJR0hUU19JTl9NU0dIRFIpIHx8IGRlZmluZWQoSEFWRV9DT05UUk9MX0lOX01TR0hEUikpCisJc3RydWN0IG1zZ2hkciBtc2c7CisjaWZuZGVmIEhBVkVfQUNDUklHSFRTX0lOX01TR0hEUgorCXVuaW9uIHsKKwkJc3RydWN0IGNtc2doZHIgaGRyOworCQljaGFyIGJ1ZltDTVNHX1NQQUNFKHNpemVvZihpbnQpKV07CisJfSBjbXNnYnVmOworCXN0cnVjdCBjbXNnaGRyICpjbXNnOworI2VuZGlmCisJc3RydWN0IGlvdmVjIHZlYzsKKwljaGFyIGNoID0gJ1wwJzsKKwlzc2l6ZV90IG47CisJc3RydWN0IHBvbGxmZCBwZmQ7CisKKwltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOworI2lmZGVmIEhBVkVfQUNDUklHSFRTX0lOX01TR0hEUgorCW1zZy5tc2dfYWNjcmlnaHRzID0gKGNhZGRyX3QpJmZkOworCW1zZy5tc2dfYWNjcmlnaHRzbGVuID0gc2l6ZW9mKGZkKTsKKyNlbHNlCisJbXNnLm1zZ19jb250cm9sID0gKGNhZGRyX3QpJmNtc2didWYuYnVmOworCW1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZihjbXNnYnVmLmJ1Zik7CisJY21zZyA9IENNU0dfRklSU1RIRFIoJm1zZyk7CisJY21zZy0+Y21zZ19sZW4gPSBDTVNHX0xFTihzaXplb2YoaW50KSk7CisJY21zZy0+Y21zZ19sZXZlbCA9IFNPTF9TT0NLRVQ7CisJY21zZy0+Y21zZ190eXBlID0gU0NNX1JJR0hUUzsKKwkqKGludCAqKUNNU0dfREFUQShjbXNnKSA9IGZkOworI2VuZGlmCisKKwl2ZWMuaW92X2Jhc2UgPSAmY2g7CisJdmVjLmlvdl9sZW4gPSAxOworCW1zZy5tc2dfaW92ID0gJnZlYzsKKwltc2cubXNnX2lvdmxlbiA9IDE7CisKKwlwZmQuZmQgPSBzb2NrOworCXBmZC5ldmVudHMgPSBQT0xMT1VUOworCXdoaWxlICgobiA9IHNlbmRtc2coc29jaywgJm1zZywgMCkpID09IC0xICYmCisJICAgIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRUlOVFIpKSB7CisJCWRlYnVnMygiJXM6IHNlbmRtc2coJWQpOiAlcyIsIF9fZnVuY19fLCBmZCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJKHZvaWQpcG9sbCgmcGZkLCAxLCAtMSk7CisJfQorCWlmIChuID09IC0xKSB7CisJCWVycm9yKCIlczogc2VuZG1zZyglZCk6ICVzIiwgX19mdW5jX18sIGZkLAorCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChuICE9IDEpIHsKKwkJZXJyb3IoIiVzOiBzZW5kbXNnOiBleHBlY3RlZCBzZW50IDEgZ290ICVsZCIsCisJCSAgICBfX2Z1bmNfXywgKGxvbmcpbik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7CisjZWxzZQorCWVycm9yKCIlczogZmlsZSBkZXNjcmlwdG9yIHBhc3Npbmcgbm90IHN1cHBvcnRlZCIsIF9fZnVuY19fKTsKKwlyZXR1cm4gLTE7CisjZW5kaWYKK30KKworaW50CittbV9yZWNlaXZlX2ZkKGludCBzb2NrKQoreworI2lmIGRlZmluZWQoSEFWRV9SRUNWTVNHKSAmJiAoZGVmaW5lZChIQVZFX0FDQ1JJR0hUU19JTl9NU0dIRFIpIHx8IGRlZmluZWQoSEFWRV9DT05UUk9MX0lOX01TR0hEUikpCisJc3RydWN0IG1zZ2hkciBtc2c7CisjaWZuZGVmIEhBVkVfQUNDUklHSFRTX0lOX01TR0hEUgorCXVuaW9uIHsKKwkJc3RydWN0IGNtc2doZHIgaGRyOworCQljaGFyIGJ1ZltDTVNHX1NQQUNFKHNpemVvZihpbnQpKV07CisJfSBjbXNnYnVmOworCXN0cnVjdCBjbXNnaGRyICpjbXNnOworI2VuZGlmCisJc3RydWN0IGlvdmVjIHZlYzsKKwlzc2l6ZV90IG47CisJY2hhciBjaDsKKwlpbnQgZmQ7CisJc3RydWN0IHBvbGxmZCBwZmQ7CisKKwltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOworCXZlYy5pb3ZfYmFzZSA9ICZjaDsKKwl2ZWMuaW92X2xlbiA9IDE7CisJbXNnLm1zZ19pb3YgPSAmdmVjOworCW1zZy5tc2dfaW92bGVuID0gMTsKKyNpZmRlZiBIQVZFX0FDQ1JJR0hUU19JTl9NU0dIRFIKKwltc2cubXNnX2FjY3JpZ2h0cyA9IChjYWRkcl90KSZmZDsKKwltc2cubXNnX2FjY3JpZ2h0c2xlbiA9IHNpemVvZihmZCk7CisjZWxzZQorCW1zZy5tc2dfY29udHJvbCA9ICZjbXNnYnVmLmJ1ZjsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoY21zZ2J1Zi5idWYpOworI2VuZGlmCisKKwlwZmQuZmQgPSBzb2NrOworCXBmZC5ldmVudHMgPSBQT0xMSU47CisJd2hpbGUgKChuID0gcmVjdm1zZyhzb2NrLCAmbXNnLCAwKSkgPT0gLTEgJiYKKwkgICAgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFSU5UUikpIHsKKwkJZGVidWczKCIlczogcmVjdm1zZzogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJKHZvaWQpcG9sbCgmcGZkLCAxLCAtMSk7CisJfQorCWlmIChuID09IC0xKSB7CisJCWVycm9yKCIlczogcmVjdm1zZzogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChuICE9IDEpIHsKKwkJZXJyb3IoIiVzOiByZWN2bXNnOiBleHBlY3RlZCByZWNlaXZlZCAxIGdvdCAlbGQiLAorCQkgICAgX19mdW5jX18sIChsb25nKW4pOworCQlyZXR1cm4gLTE7CisJfQorCisjaWZkZWYgSEFWRV9BQ0NSSUdIVFNfSU5fTVNHSERSCisJaWYgKG1zZy5tc2dfYWNjcmlnaHRzbGVuICE9IHNpemVvZihmZCkpIHsKKwkJZXJyb3IoIiVzOiBubyBmZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKyNlbHNlCisJY21zZyA9IENNU0dfRklSU1RIRFIoJm1zZyk7CisJaWYgKGNtc2cgPT0gTlVMTCkgeworCQllcnJvcigiJXM6IG5vIG1lc3NhZ2UgaGVhZGVyIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCisjaWZuZGVmIEJST0tFTl9DTVNHX1RZUEUKKwlpZiAoY21zZy0+Y21zZ190eXBlICE9IFNDTV9SSUdIVFMpIHsKKwkJZXJyb3IoIiVzOiBleHBlY3RlZCB0eXBlICVkIGdvdCAlZCIsIF9fZnVuY19fLAorCQkgICAgU0NNX1JJR0hUUywgY21zZy0+Y21zZ190eXBlKTsKKwkJcmV0dXJuIC0xOworCX0KKyNlbmRpZgorCWZkID0gKCooaW50ICopQ01TR19EQVRBKGNtc2cpKTsKKyNlbmRpZgorCXJldHVybiBmZDsKKyNlbHNlCisJZXJyb3IoIiVzOiBmaWxlIGRlc2NyaXB0b3IgcGFzc2luZyBub3Qgc3VwcG9ydGVkIiwgX19mdW5jX18pOworCXJldHVybiAtMTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9tb25pdG9yX2ZkcGFzcy5oIGIvb3BlbnNzaC02LjBwMS9tb25pdG9yX2ZkcGFzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YjFmNjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL21vbml0b3JfZmRwYXNzLmgKQEAgLTAsMCArMSwzNCBAQAorLyogJE9wZW5CU0Q6IG1vbml0b3JfZmRwYXNzLmgsdiAxLjQgMjAwNy8wOS8wNCAwMzoyMTowMyBkam0gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAyMDAyIE5pZWxzIFByb3ZvcyA8cHJvdm9zQGNpdGkudW1pY2guZWR1PgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfTU1fRkRQQVNTX0hfCisjZGVmaW5lIF9NTV9GRFBBU1NfSF8KKworaW50IG1tX3NlbmRfZmQoaW50LCBpbnQpOworaW50IG1tX3JlY2VpdmVfZmQoaW50KTsKKworI2VuZGlmIC8qIF9NTV9GRFBBU1NfSF8gKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvbW9uaXRvcl9tbS5jIGIvb3BlbnNzaC02LjBwMS9tb25pdG9yX21tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmOWYzZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvbW9uaXRvcl9tbS5jCkBAIC0wLDAgKzEsMzUyIEBACisvKiAkT3BlbkJTRDogbW9uaXRvcl9tbS5jLHYgMS4xNiAyMDA5LzA2LzIyIDA1OjM5OjI4IGR0dWNrZXIgRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgMjAwMiBOaWVscyBQcm92b3MgPHByb3Zvc0BjaXRpLnVtaWNoLmVkdT4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9TWVNfTU1BTl9ICisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L3N5cy10cmVlLmgiCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgInNzaC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgIm1vbml0b3JfbW0uaCIKKworc3RhdGljIGludAorbW1fY29tcGFyZShzdHJ1Y3QgbW1fc2hhcmUgKmEsIHN0cnVjdCBtbV9zaGFyZSAqYikKK3sKKwlsb25nIGRpZmYgPSAoY2hhciAqKWEtPmFkZHJlc3MgLSAoY2hhciAqKWItPmFkZHJlc3M7CisKKwlpZiAoZGlmZiA9PSAwKQorCQlyZXR1cm4gKDApOworCWVsc2UgaWYgKGRpZmYgPCAwKQorCQlyZXR1cm4gKC0xKTsKKwllbHNlCisJCXJldHVybiAoMSk7Cit9CisKK1JCX0dFTkVSQVRFKG1tdHJlZSwgbW1fc2hhcmUsIG5leHQsIG1tX2NvbXBhcmUpCisKK3N0YXRpYyBzdHJ1Y3QgbW1fc2hhcmUgKgorbW1fbWFrZV9lbnRyeShzdHJ1Y3QgbW1fbWFzdGVyICptbSwgc3RydWN0IG1tdHJlZSAqaGVhZCwKKyAgICB2b2lkICphZGRyZXNzLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgbW1fc2hhcmUgKnRtcCwgKnRtcDI7CisKKwlpZiAobW0tPm1tYWxsb2MgPT0gTlVMTCkKKwkJdG1wID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IG1tX3NoYXJlKSk7CisJZWxzZQorCQl0bXAgPSBtbV94bWFsbG9jKG1tLT5tbWFsbG9jLCBzaXplb2Yoc3RydWN0IG1tX3NoYXJlKSk7CisJdG1wLT5hZGRyZXNzID0gYWRkcmVzczsKKwl0bXAtPnNpemUgPSBzaXplOworCisJdG1wMiA9IFJCX0lOU0VSVChtbXRyZWUsIGhlYWQsIHRtcCk7CisJaWYgKHRtcDIgIT0gTlVMTCkKKwkJZmF0YWwoIm1tX21ha2VfZW50cnkoJXApOiBkb3VibGUgYWRkcmVzcyAlcC0+JXAoJWx1KSIsCisJCSAgICBtbSwgdG1wMiwgYWRkcmVzcywgKHVfbG9uZylzaXplKTsKKworCXJldHVybiAodG1wKTsKK30KKworLyogQ3JlYXRlcyBhIHNoYXJlZCBtZW1vcnkgYXJlYSBvZiBhIGNlcnRhaW4gc2l6ZSAqLworCitzdHJ1Y3QgbW1fbWFzdGVyICoKK21tX2NyZWF0ZShzdHJ1Y3QgbW1fbWFzdGVyICptbWFsbG9jLCBzaXplX3Qgc2l6ZSkKK3sKKwl2b2lkICphZGRyZXNzOworCXN0cnVjdCBtbV9tYXN0ZXIgKm1tOworCisJaWYgKG1tYWxsb2MgPT0gTlVMTCkKKwkJbW0gPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgbW1fbWFzdGVyKSk7CisJZWxzZQorCQltbSA9IG1tX3htYWxsb2MobW1hbGxvYywgc2l6ZW9mKHN0cnVjdCBtbV9tYXN0ZXIpKTsKKworCS8qCisJICogSWYgdGhlIG1lbW9yeSBtYXAgaGFzIGEgbW1fbWFzdGVyIGl0IGNhbiBiZSBjb21wbGV0ZWx5CisJICogc2hhcmVkIGluY2x1ZGluZyBhdXRoZW50aWNhdGlvbiBiZXR3ZWVuIHRoZSBjaGlsZAorCSAqIGFuZCB0aGUgY2xpZW50LgorCSAqLworCW1tLT5tbWFsbG9jID0gbW1hbGxvYzsKKworCWFkZHJlc3MgPSB4bW1hcChzaXplKTsKKwlpZiAoYWRkcmVzcyA9PSAodm9pZCAqKU1BUF9GQUlMRUQpCisJCWZhdGFsKCJtbWFwKCVsdSk6ICVzIiwgKHVfbG9uZylzaXplLCBzdHJlcnJvcihlcnJubykpOworCisJbW0tPmFkZHJlc3MgPSBhZGRyZXNzOworCW1tLT5zaXplID0gc2l6ZTsKKworCVJCX0lOSVQoJm1tLT5yYl9mcmVlKTsKKwlSQl9JTklUKCZtbS0+cmJfYWxsb2NhdGVkKTsKKworCW1tX21ha2VfZW50cnkobW0sICZtbS0+cmJfZnJlZSwgYWRkcmVzcywgc2l6ZSk7CisKKwlyZXR1cm4gKG1tKTsKK30KKworLyogRnJlZXMgZWl0aGVyIHRoZSBhbGxvY2F0ZWQgb3IgdGhlIGZyZWUgbGlzdCAqLworCitzdGF0aWMgdm9pZAorbW1fZnJlZWxpc3Qoc3RydWN0IG1tX21hc3RlciAqbW1hbGxvYywgc3RydWN0IG1tdHJlZSAqaGVhZCkKK3sKKwlzdHJ1Y3QgbW1fc2hhcmUgKm1tcywgKm5leHQ7CisKKwlmb3IgKG1tcyA9IFJCX1JPT1QoaGVhZCk7IG1tczsgbW1zID0gbmV4dCkgeworCQluZXh0ID0gUkJfTkVYVChtbXRyZWUsIGhlYWQsIG1tcyk7CisJCVJCX1JFTU9WRShtbXRyZWUsIGhlYWQsIG1tcyk7CisJCWlmIChtbWFsbG9jID09IE5VTEwpCisJCQl4ZnJlZShtbXMpOworCQllbHNlCisJCQltbV9mcmVlKG1tYWxsb2MsIG1tcyk7CisJfQorfQorCisvKiBEZXN0cm95cyBhIG1lbW9yeSBtYXBwZWQgYXJlYSAqLworCit2b2lkCittbV9kZXN0cm95KHN0cnVjdCBtbV9tYXN0ZXIgKm1tKQoreworCW1tX2ZyZWVsaXN0KG1tLT5tbWFsbG9jLCAmbW0tPnJiX2ZyZWUpOworCW1tX2ZyZWVsaXN0KG1tLT5tbWFsbG9jLCAmbW0tPnJiX2FsbG9jYXRlZCk7CisKKyNpZmRlZiBIQVZFX01NQVAKKwlpZiAobXVubWFwKG1tLT5hZGRyZXNzLCBtbS0+c2l6ZSkgPT0gLTEpCisJCWZhdGFsKCJtdW5tYXAoJXAsICVsdSk6ICVzIiwgbW0tPmFkZHJlc3MsICh1X2xvbmcpbW0tPnNpemUsCisJCSAgICBzdHJlcnJvcihlcnJubykpOworI2Vsc2UKKwlmYXRhbCgiJXM6IFVzZVByaXZpbGVnZVNlcGFyYXRpb249eWVzIGFuZCBDb21wcmVzc2lvbj15ZXMgbm90IHN1cHBvcnRlZCIsCisJICAgIF9fZnVuY19fKTsKKyNlbmRpZgorCWlmIChtbS0+bW1hbGxvYyA9PSBOVUxMKQorCQl4ZnJlZShtbSk7CisJZWxzZQorCQltbV9mcmVlKG1tLT5tbWFsbG9jLCBtbSk7Cit9CisKK3ZvaWQgKgorbW1feG1hbGxvYyhzdHJ1Y3QgbW1fbWFzdGVyICptbSwgc2l6ZV90IHNpemUpCit7CisJdm9pZCAqYWRkcmVzczsKKworCWFkZHJlc3MgPSBtbV9tYWxsb2MobW0sIHNpemUpOworCWlmIChhZGRyZXNzID09IE5VTEwpCisJCWZhdGFsKCIlczogbW1fbWFsbG9jKCVsdSkiLCBfX2Z1bmNfXywgKHVfbG9uZylzaXplKTsKKwlyZXR1cm4gKGFkZHJlc3MpOworfQorCisKKy8qIEFsbG9jYXRlcyBkYXRhIGZyb20gYSBtZW1vcnkgbWFwcGVkIGFyZWEgKi8KKwordm9pZCAqCittbV9tYWxsb2Moc3RydWN0IG1tX21hc3RlciAqbW0sIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBtbV9zaGFyZSAqbW1zLCAqdG1wOworCisJaWYgKHNpemUgPT0gMCkKKwkJZmF0YWwoIm1tX21hbGxvYzogdHJ5IHRvIGFsbG9jYXRlIDAgc3BhY2UiKTsKKwlpZiAoc2l6ZSA+IFNJWkVfVF9NQVggLSBNTV9NSU5TSVpFICsgMSkKKwkJZmF0YWwoIm1tX21hbGxvYzogc2l6ZSB0b28gYmlnIik7CisKKwlzaXplID0gKChzaXplICsgKE1NX01JTlNJWkUgLSAxKSkgLyBNTV9NSU5TSVpFKSAqIE1NX01JTlNJWkU7CisKKwlSQl9GT1JFQUNIKG1tcywgbW10cmVlLCAmbW0tPnJiX2ZyZWUpIHsKKwkJaWYgKG1tcy0+c2l6ZSA+PSBzaXplKQorCQkJYnJlYWs7CisJfQorCisJaWYgKG1tcyA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJLyogRGVidWcgKi8KKwltZW1zZXQobW1zLT5hZGRyZXNzLCAweGQwLCBzaXplKTsKKworCXRtcCA9IG1tX21ha2VfZW50cnkobW0sICZtbS0+cmJfYWxsb2NhdGVkLCBtbXMtPmFkZHJlc3MsIHNpemUpOworCisJLyogRG9lcyBub3QgY2hhbmdlIG9yZGVyIGluIFJCIHRyZWUgKi8KKwltbXMtPnNpemUgLT0gc2l6ZTsKKwltbXMtPmFkZHJlc3MgPSAodV9jaGFyICopbW1zLT5hZGRyZXNzICsgc2l6ZTsKKworCWlmIChtbXMtPnNpemUgPT0gMCkgeworCQlSQl9SRU1PVkUobW10cmVlLCAmbW0tPnJiX2ZyZWUsIG1tcyk7CisJCWlmIChtbS0+bW1hbGxvYyA9PSBOVUxMKQorCQkJeGZyZWUobW1zKTsKKwkJZWxzZQorCQkJbW1fZnJlZShtbS0+bW1hbGxvYywgbW1zKTsKKwl9CisKKwlyZXR1cm4gKHRtcC0+YWRkcmVzcyk7Cit9CisKKy8qIEZyZWVzIG1lbW9yeSBpbiBhIG1lbW9yeSBtYXBwZWQgYXJlYSAqLworCit2b2lkCittbV9mcmVlKHN0cnVjdCBtbV9tYXN0ZXIgKm1tLCB2b2lkICphZGRyZXNzKQoreworCXN0cnVjdCBtbV9zaGFyZSAqbW1zLCAqcHJldiwgdG1wOworCisJdG1wLmFkZHJlc3MgPSBhZGRyZXNzOworCW1tcyA9IFJCX0ZJTkQobW10cmVlLCAmbW0tPnJiX2FsbG9jYXRlZCwgJnRtcCk7CisJaWYgKG1tcyA9PSBOVUxMKQorCQlmYXRhbCgibW1fZnJlZSglcCk6IGNhbiBub3QgZmluZCAlcCIsIG1tLCBhZGRyZXNzKTsKKworCS8qIERlYnVnICovCisJbWVtc2V0KG1tcy0+YWRkcmVzcywgMHhkMCwgbW1zLT5zaXplKTsKKworCS8qIFJlbW92ZSBmcm9tIGFsbG9jYXRlZCBsaXN0IGFuZCBpbnNlcnQgaW4gZnJlZSBsaXN0ICovCisJUkJfUkVNT1ZFKG1tdHJlZSwgJm1tLT5yYl9hbGxvY2F0ZWQsIG1tcyk7CisJaWYgKFJCX0lOU0VSVChtbXRyZWUsICZtbS0+cmJfZnJlZSwgbW1zKSAhPSBOVUxMKQorCQlmYXRhbCgibW1fZnJlZSglcCk6IGRvdWJsZSBhZGRyZXNzICVwIiwgbW0sIGFkZHJlc3MpOworCisJLyogRmluZCBwcmV2aW91cyBlbnRyeSAqLworCXByZXYgPSBtbXM7CisJaWYgKFJCX0xFRlQocHJldiwgbmV4dCkpIHsKKwkJcHJldiA9IFJCX0xFRlQocHJldiwgbmV4dCk7CisJCXdoaWxlIChSQl9SSUdIVChwcmV2LCBuZXh0KSkKKwkJCXByZXYgPSBSQl9SSUdIVChwcmV2LCBuZXh0KTsKKwl9IGVsc2UgeworCQlpZiAoUkJfUEFSRU5UKHByZXYsIG5leHQpICYmCisJCSAgICAocHJldiA9PSBSQl9SSUdIVChSQl9QQVJFTlQocHJldiwgbmV4dCksIG5leHQpKSkKKwkJCXByZXYgPSBSQl9QQVJFTlQocHJldiwgbmV4dCk7CisJCWVsc2UgeworCQkJd2hpbGUgKFJCX1BBUkVOVChwcmV2LCBuZXh0KSAmJgorCQkJICAgIChwcmV2ID09IFJCX0xFRlQoUkJfUEFSRU5UKHByZXYsIG5leHQpLCBuZXh0KSkpCisJCQkJcHJldiA9IFJCX1BBUkVOVChwcmV2LCBuZXh0KTsKKwkJCXByZXYgPSBSQl9QQVJFTlQocHJldiwgbmV4dCk7CisJCX0KKwl9CisKKwkvKiBDaGVjayBpZiByYW5nZSBkb2VzIG5vdCBvdmVybGFwICovCisJaWYgKHByZXYgIT0gTlVMTCAmJiBNTV9BRERSRVNTX0VORChwcmV2KSA+IGFkZHJlc3MpCisJCWZhdGFsKCJtbV9mcmVlOiBtZW1vcnkgY29ycnVwdGlvbjogJXAoJWx1KSA+ICVwIiwKKwkJICAgIHByZXYtPmFkZHJlc3MsICh1X2xvbmcpcHJldi0+c2l6ZSwgYWRkcmVzcyk7CisKKwkvKiBTZWUgaWYgd2UgY2FuIG1lcmdlIGJhY2t3YXJkcyAqLworCWlmIChwcmV2ICE9IE5VTEwgJiYgTU1fQUREUkVTU19FTkQocHJldikgPT0gYWRkcmVzcykgeworCQlwcmV2LT5zaXplICs9IG1tcy0+c2l6ZTsKKwkJUkJfUkVNT1ZFKG1tdHJlZSwgJm1tLT5yYl9mcmVlLCBtbXMpOworCQlpZiAobW0tPm1tYWxsb2MgPT0gTlVMTCkKKwkJCXhmcmVlKG1tcyk7CisJCWVsc2UKKwkJCW1tX2ZyZWUobW0tPm1tYWxsb2MsIG1tcyk7CisJfSBlbHNlCisJCXByZXYgPSBtbXM7CisKKwlpZiAocHJldiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBDaGVjayBpZiB3ZSBjYW4gbWVyZ2UgZm9yd2FyZHMgKi8KKwltbXMgPSBSQl9ORVhUKG1tdHJlZSwgJm1tLT5yYl9mcmVlLCBwcmV2KTsKKwlpZiAobW1zID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChNTV9BRERSRVNTX0VORChwcmV2KSA+IG1tcy0+YWRkcmVzcykKKwkJZmF0YWwoIm1tX2ZyZWU6IG1lbW9yeSBjb3JydXB0aW9uOiAlcCA8ICVwKCVsdSkiLAorCQkgICAgbW1zLT5hZGRyZXNzLCBwcmV2LT5hZGRyZXNzLCAodV9sb25nKXByZXYtPnNpemUpOworCWlmIChNTV9BRERSRVNTX0VORChwcmV2KSAhPSBtbXMtPmFkZHJlc3MpCisJCXJldHVybjsKKworCXByZXYtPnNpemUgKz0gbW1zLT5zaXplOworCVJCX1JFTU9WRShtbXRyZWUsICZtbS0+cmJfZnJlZSwgbW1zKTsKKworCWlmIChtbS0+bW1hbGxvYyA9PSBOVUxMKQorCQl4ZnJlZShtbXMpOworCWVsc2UKKwkJbW1fZnJlZShtbS0+bW1hbGxvYywgbW1zKTsKK30KKworc3RhdGljIHZvaWQKK21tX3N5bmNfbGlzdChzdHJ1Y3QgbW10cmVlICpvbGR0cmVlLCBzdHJ1Y3QgbW10cmVlICpuZXd0cmVlLAorICAgIHN0cnVjdCBtbV9tYXN0ZXIgKm1tLCBzdHJ1Y3QgbW1fbWFzdGVyICptbW9sZCkKK3sKKwlzdHJ1Y3QgbW1fbWFzdGVyICptbWFsbG9jID0gbW0tPm1tYWxsb2M7CisJc3RydWN0IG1tX3NoYXJlICptbXMsICpuZXc7CisKKwkvKiBTeW5jIGZyZWUgbGlzdCAqLworCVJCX0ZPUkVBQ0gobW1zLCBtbXRyZWUsIG9sZHRyZWUpIHsKKwkJLyogQ2hlY2sgdGhlIHZhbHVlcyAqLworCQltbV9tZW12YWxpZChtbW9sZCwgbW1zLCBzaXplb2Yoc3RydWN0IG1tX3NoYXJlKSk7CisJCW1tX21lbXZhbGlkKG1tLCBtbXMtPmFkZHJlc3MsIG1tcy0+c2l6ZSk7CisKKwkJbmV3ID0gbW1feG1hbGxvYyhtbWFsbG9jLCBzaXplb2Yoc3RydWN0IG1tX3NoYXJlKSk7CisJCW1lbWNweShuZXcsIG1tcywgc2l6ZW9mKHN0cnVjdCBtbV9zaGFyZSkpOworCQlSQl9JTlNFUlQobW10cmVlLCBuZXd0cmVlLCBuZXcpOworCX0KK30KKwordm9pZAorbW1fc2hhcmVfc3luYyhzdHJ1Y3QgbW1fbWFzdGVyICoqcG1tLCBzdHJ1Y3QgbW1fbWFzdGVyICoqcG1tYWxsb2MpCit7CisJc3RydWN0IG1tX21hc3RlciAqbW07CisJc3RydWN0IG1tX21hc3RlciAqbW1hbGxvYzsKKwlzdHJ1Y3QgbW1fbWFzdGVyICptbW9sZDsKKwlzdHJ1Y3QgbW10cmVlIHJiX2ZyZWUsIHJiX2FsbG9jYXRlZDsKKworCWRlYnVnMygiJXM6IFNoYXJlIHN5bmMiLCBfX2Z1bmNfXyk7CisKKwltbSA9ICpwbW07CisJbW1vbGQgPSBtbS0+bW1hbGxvYzsKKwltbV9tZW12YWxpZChtbW9sZCwgbW0sIHNpemVvZigqbW0pKTsKKworCW1tYWxsb2MgPSBtbV9jcmVhdGUoTlVMTCwgbW0tPnNpemUpOworCW1tID0gbW1feG1hbGxvYyhtbWFsbG9jLCBzaXplb2Yoc3RydWN0IG1tX21hc3RlcikpOworCW1lbWNweShtbSwgKnBtbSwgc2l6ZW9mKHN0cnVjdCBtbV9tYXN0ZXIpKTsKKwltbS0+bW1hbGxvYyA9IG1tYWxsb2M7CisKKwlyYl9mcmVlID0gbW0tPnJiX2ZyZWU7CisJcmJfYWxsb2NhdGVkID0gbW0tPnJiX2FsbG9jYXRlZDsKKworCVJCX0lOSVQoJm1tLT5yYl9mcmVlKTsKKwlSQl9JTklUKCZtbS0+cmJfYWxsb2NhdGVkKTsKKworCW1tX3N5bmNfbGlzdCgmcmJfZnJlZSwgJm1tLT5yYl9mcmVlLCBtbSwgbW1vbGQpOworCW1tX3N5bmNfbGlzdCgmcmJfYWxsb2NhdGVkLCAmbW0tPnJiX2FsbG9jYXRlZCwgbW0sIG1tb2xkKTsKKworCW1tX2Rlc3Ryb3kobW1vbGQpOworCisJKnBtbSA9IG1tOworCSpwbW1hbGxvYyA9IG1tYWxsb2M7CisKKwlkZWJ1ZzMoIiVzOiBTaGFyZSBzeW5jIGVuZCIsIF9fZnVuY19fKTsKK30KKwordm9pZAorbW1fbWVtdmFsaWQoc3RydWN0IG1tX21hc3RlciAqbW0sIHZvaWQgKmFkZHJlc3MsIHNpemVfdCBzaXplKQoreworCXZvaWQgKmVuZCA9ICh1X2NoYXIgKilhZGRyZXNzICsgc2l6ZTsKKworCWlmIChhZGRyZXNzIDwgbW0tPmFkZHJlc3MpCisJCWZhdGFsKCJtbV9tZW12YWxpZDogYWRkcmVzcyB0b28gc21hbGw6ICVwIiwgYWRkcmVzcyk7CisJaWYgKGVuZCA8IGFkZHJlc3MpCisJCWZhdGFsKCJtbV9tZW12YWxpZDogZW5kIDwgYWRkcmVzczogJXAgPCAlcCIsIGVuZCwgYWRkcmVzcyk7CisJaWYgKGVuZCA+ICh2b2lkICopKCh1X2NoYXIgKiltbS0+YWRkcmVzcyArIG1tLT5zaXplKSkKKwkJZmF0YWwoIm1tX21lbXZhbGlkOiBhZGRyZXNzIHRvbyBsYXJnZTogJXAiLCBhZGRyZXNzKTsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvbW9uaXRvcl9tbS5oIGIvb3BlbnNzaC02LjBwMS9tb25pdG9yX21tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg5MGY3NwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvbW9uaXRvcl9tbS5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qICRPcGVuQlNEOiBtb25pdG9yX21tLmgsdiAxLjUgMjAwOC8wNC8yOSAxMToyMDozMSBvdHRvIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiBOaWVscyBQcm92b3MgPHByb3Zvc0BjaXRpLnVtaWNoLmVkdT4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX01NX0hfCisjZGVmaW5lIF9NTV9IXworCitzdHJ1Y3QgbW1fc2hhcmUgeworCVJCX0VOVFJZKG1tX3NoYXJlKSBuZXh0OworCXZvaWQgKmFkZHJlc3M7CisJc2l6ZV90IHNpemU7Cit9OworCitzdHJ1Y3QgbW1fbWFzdGVyIHsKKwlSQl9IRUFEKG1tdHJlZSwgbW1fc2hhcmUpIHJiX2ZyZWU7CisJc3RydWN0IG1tdHJlZSByYl9hbGxvY2F0ZWQ7CisJdm9pZCAqYWRkcmVzczsKKwlzaXplX3Qgc2l6ZTsKKworCXN0cnVjdCBtbV9tYXN0ZXIgKm1tYWxsb2M7CS8qIFVzZWQgdG8gY29tcGxldGVseSBzaGFyZSAqLworfTsKKworUkJfUFJPVE9UWVBFKG1tdHJlZSwgbW1fc2hhcmUsIG5leHQsIG1tX2NvbXBhcmUpCisKKyNkZWZpbmUgTU1fTUlOU0laRQkJMTI4CisKKyNkZWZpbmUgTU1fQUREUkVTU19FTkQoeCkJKHZvaWQgKikoKHVfY2hhciAqKSh4KS0+YWRkcmVzcyArICh4KS0+c2l6ZSkKKworc3RydWN0IG1tX21hc3RlciAqbW1fY3JlYXRlKHN0cnVjdCBtbV9tYXN0ZXIgKiwgc2l6ZV90KTsKK3ZvaWQgbW1fZGVzdHJveShzdHJ1Y3QgbW1fbWFzdGVyICopOworCit2b2lkIG1tX3NoYXJlX3N5bmMoc3RydWN0IG1tX21hc3RlciAqKiwgc3RydWN0IG1tX21hc3RlciAqKik7CisKK3ZvaWQgKm1tX21hbGxvYyhzdHJ1Y3QgbW1fbWFzdGVyICosIHNpemVfdCk7Cit2b2lkICptbV94bWFsbG9jKHN0cnVjdCBtbV9tYXN0ZXIgKiwgc2l6ZV90KTsKK3ZvaWQgbW1fZnJlZShzdHJ1Y3QgbW1fbWFzdGVyICosIHZvaWQgKik7CisKK3ZvaWQgbW1fbWVtdmFsaWQoc3RydWN0IG1tX21hc3RlciAqLCB2b2lkICosIHNpemVfdCk7CisjZW5kaWYgLyogX01NX0hfICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL21vbml0b3Jfd3JhcC5jIGIvb3BlbnNzaC02LjBwMS9tb25pdG9yX3dyYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjYwNjU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9tb25pdG9yX3dyYXAuYwpAQCAtMCwwICsxLDE0NTIgQEAKKy8qICRPcGVuQlNEOiBtb25pdG9yX3dyYXAuYyx2IDEuNzMgMjAxMS8wNi8xNyAyMTo0NDozMSBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgMjAwMiBOaWVscyBQcm92b3MgPHByb3Zvc0BjaXRpLnVtaWNoLmVkdT4KKyAqIENvcHlyaWdodCAyMDAyIE1hcmt1cyBGcmllZGwgPG1hcmt1c0BvcGVuYnNkLm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCisjaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvc3lzLXF1ZXVlLmgiCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgInNzaC5oIgorI2luY2x1ZGUgImRoLmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAia2V5LmgiCisjaW5jbHVkZSAiY2lwaGVyLmgiCisjaW5jbHVkZSAia2V4LmgiCisjaW5jbHVkZSAiaG9zdGZpbGUuaCIKKyNpbmNsdWRlICJhdXRoLmgiCisjaW5jbHVkZSAiYXV0aC1vcHRpb25zLmgiCisjaW5jbHVkZSAicGFja2V0LmgiCisjaW5jbHVkZSAibWFjLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaWZkZWYgVEFSR0VUX09TX01BQyAgICAvKiBYWFggQnJva2VuIGtyYjUgaGVhZGVycyBvbiBNYWMgKi8KKyN1bmRlZiBUQVJHRVRfT1NfTUFDCisjaW5jbHVkZSAiemxpYi5oIgorI2RlZmluZSBUQVJHRVRfT1NfTUFDIDEKKyNlbHNlCisjaW5jbHVkZSAiemxpYi5oIgorI2VuZGlmCisjaW5jbHVkZSAibW9uaXRvci5oIgorI2lmZGVmIEdTU0FQSQorI2luY2x1ZGUgInNzaC1nc3MuaCIKKyNlbmRpZgorI2luY2x1ZGUgIm1vbml0b3Jfd3JhcC5oIgorI2luY2x1ZGUgImF0b21pY2lvLmgiCisjaW5jbHVkZSAibW9uaXRvcl9mZHBhc3MuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAic2Nobm9yci5oIgorI2luY2x1ZGUgImpwYWtlLmgiCisjaW5jbHVkZSAidXVlbmNvZGUuaCIKKworI2luY2x1ZGUgImNoYW5uZWxzLmgiCisjaW5jbHVkZSAic2Vzc2lvbi5oIgorI2luY2x1ZGUgInNlcnZjb25mLmgiCisjaW5jbHVkZSAicm9hbWluZy5oIgorCisvKiBJbXBvcnRzICovCitleHRlcm4gaW50IGNvbXBhdDIwOworZXh0ZXJuIHpfc3RyZWFtIGluY29taW5nX3N0cmVhbTsKK2V4dGVybiB6X3N0cmVhbSBvdXRnb2luZ19zdHJlYW07CitleHRlcm4gc3RydWN0IG1vbml0b3IgKnBtb25pdG9yOworZXh0ZXJuIEJ1ZmZlciBsb2dpbm1zZzsKK2V4dGVybiBTZXJ2ZXJPcHRpb25zIG9wdGlvbnM7CisKK3ZvaWQKK21tX2xvZ19oYW5kbGVyKExvZ0xldmVsIGxldmVsLCBjb25zdCBjaGFyICptc2csIHZvaWQgKmN0eCkKK3sKKwlCdWZmZXIgbG9nX21zZzsKKwlzdHJ1Y3QgbW9uaXRvciAqbW9uID0gKHN0cnVjdCBtb25pdG9yICopY3R4OworCisJaWYgKG1vbi0+bV9sb2dfc2VuZGZkID09IC0xKQorCQlmYXRhbCgiJXM6IG5vIGxvZyBjaGFubmVsIiwgX19mdW5jX18pOworCisJYnVmZmVyX2luaXQoJmxvZ19tc2cpOworCS8qCisJICogUGxhY2Vob2xkZXIgZm9yIHBhY2tldCBsZW5ndGguIFdpbGwgYmUgZmlsbGVkIGluIHdpdGggdGhlIGFjdHVhbAorCSAqIHBhY2tldCBsZW5ndGggb25jZSB0aGUgcGFja2V0IGhhcyBiZWVuIGNvbnN0dWN0ZWQuIFRoaXMgc2F2ZXMKKwkgKiBmcmFnaWxlIG1hdGguCisJICovCisJYnVmZmVyX3B1dF9pbnQoJmxvZ19tc2csIDApOworCisJYnVmZmVyX3B1dF9pbnQoJmxvZ19tc2csIGxldmVsKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcoJmxvZ19tc2csIG1zZyk7CisJcHV0X3UzMihidWZmZXJfcHRyKCZsb2dfbXNnKSwgYnVmZmVyX2xlbigmbG9nX21zZykgLSA0KTsKKwlpZiAoYXRvbWljaW8odndyaXRlLCBtb24tPm1fbG9nX3NlbmRmZCwgYnVmZmVyX3B0cigmbG9nX21zZyksCisJICAgIGJ1ZmZlcl9sZW4oJmxvZ19tc2cpKSAhPSBidWZmZXJfbGVuKCZsb2dfbXNnKSkKKwkJZmF0YWwoIiVzOiB3cml0ZTogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwlidWZmZXJfZnJlZSgmbG9nX21zZyk7Cit9CisKK2ludAorbW1faXNfbW9uaXRvcih2b2lkKQoreworCS8qCisJICogbV9waWQgaXMgb25seSBzZXQgaW4gdGhlIHByaXZpbGVnZWQgcGFydCwgYW5kCisJICogcG9pbnRzIHRvIHRoZSB1bnByaXZpbGVnZWQgY2hpbGQuCisJICovCisJcmV0dXJuIChwbW9uaXRvciAmJiBwbW9uaXRvci0+bV9waWQgPiAwKTsKK30KKwordm9pZAorbW1fcmVxdWVzdF9zZW5kKGludCBzb2NrLCBlbnVtIG1vbml0b3JfcmVxdHlwZSB0eXBlLCBCdWZmZXIgKm0pCit7CisJdV9pbnQgbWxlbiA9IGJ1ZmZlcl9sZW4obSk7CisJdV9jaGFyIGJ1Zls1XTsKKworCWRlYnVnMygiJXMgZW50ZXJpbmc6IHR5cGUgJWQiLCBfX2Z1bmNfXywgdHlwZSk7CisKKwlwdXRfdTMyKGJ1ZiwgbWxlbiArIDEpOworCWJ1Zls0XSA9ICh1X2NoYXIpIHR5cGU7CQkvKiAxc3QgYnl0ZSBvZiBwYXlsb2FkIGlzIG1lc2ctdHlwZSAqLworCWlmIChhdG9taWNpbyh2d3JpdGUsIHNvY2ssIGJ1Ziwgc2l6ZW9mKGJ1ZikpICE9IHNpemVvZihidWYpKQorCQlmYXRhbCgiJXM6IHdyaXRlOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCWlmIChhdG9taWNpbyh2d3JpdGUsIHNvY2ssIGJ1ZmZlcl9wdHIobSksIG1sZW4pICE9IG1sZW4pCisJCWZhdGFsKCIlczogd3JpdGU6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Cit9CisKK3ZvaWQKK21tX3JlcXVlc3RfcmVjZWl2ZShpbnQgc29jaywgQnVmZmVyICptKQoreworCXVfY2hhciBidWZbNF07CisJdV9pbnQgbXNnX2xlbjsKKworCWRlYnVnMygiJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7CisKKwlpZiAoYXRvbWljaW8ocmVhZCwgc29jaywgYnVmLCBzaXplb2YoYnVmKSkgIT0gc2l6ZW9mKGJ1ZikpIHsKKwkJaWYgKGVycm5vID09IEVQSVBFKQorCQkJY2xlYW51cF9leGl0KDI1NSk7CisJCWZhdGFsKCIlczogcmVhZDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisJbXNnX2xlbiA9IGdldF91MzIoYnVmKTsKKwlpZiAobXNnX2xlbiA+IDI1NiAqIDEwMjQpCisJCWZhdGFsKCIlczogcmVhZDogYmFkIG1zZ19sZW4gJWQiLCBfX2Z1bmNfXywgbXNnX2xlbik7CisJYnVmZmVyX2NsZWFyKG0pOworCWJ1ZmZlcl9hcHBlbmRfc3BhY2UobSwgbXNnX2xlbik7CisJaWYgKGF0b21pY2lvKHJlYWQsIHNvY2ssIGJ1ZmZlcl9wdHIobSksIG1zZ19sZW4pICE9IG1zZ19sZW4pCisJCWZhdGFsKCIlczogcmVhZDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKK30KKwordm9pZAorbW1fcmVxdWVzdF9yZWNlaXZlX2V4cGVjdChpbnQgc29jaywgZW51bSBtb25pdG9yX3JlcXR5cGUgdHlwZSwgQnVmZmVyICptKQoreworCXVfY2hhciBydHlwZTsKKworCWRlYnVnMygiJXMgZW50ZXJpbmc6IHR5cGUgJWQiLCBfX2Z1bmNfXywgdHlwZSk7CisKKwltbV9yZXF1ZXN0X3JlY2VpdmUoc29jaywgbSk7CisJcnR5cGUgPSBidWZmZXJfZ2V0X2NoYXIobSk7CisJaWYgKHJ0eXBlICE9IHR5cGUpCisJCWZhdGFsKCIlczogcmVhZDogcnR5cGUgJWQgIT0gdHlwZSAlZCIsIF9fZnVuY19fLAorCQkgICAgcnR5cGUsIHR5cGUpOworfQorCitESCAqCittbV9jaG9vc2VfZGgoaW50IG1pbiwgaW50IG5iaXRzLCBpbnQgbWF4KQoreworCUJJR05VTSAqcCwgKmc7CisJaW50IHN1Y2Nlc3MgPSAwOworCUJ1ZmZlciBtOworCisJYnVmZmVyX2luaXQoJm0pOworCWJ1ZmZlcl9wdXRfaW50KCZtLCBtaW4pOworCWJ1ZmZlcl9wdXRfaW50KCZtLCBuYml0cyk7CisJYnVmZmVyX3B1dF9pbnQoJm0sIG1heCk7CisKKwltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX1JFUV9NT0RVTEksICZtKTsKKworCWRlYnVnMygiJXM6IHdhaXRpbmcgZm9yIE1PTklUT1JfQU5TX01PRFVMSSIsIF9fZnVuY19fKTsKKwltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9BTlNfTU9EVUxJLCAmbSk7CisKKwlzdWNjZXNzID0gYnVmZmVyX2dldF9jaGFyKCZtKTsKKwlpZiAoc3VjY2VzcyA9PSAwKQorCQlmYXRhbCgiJXM6IE1PTklUT1JfQU5TX01PRFVMSSBmYWlsZWQiLCBfX2Z1bmNfXyk7CisKKwlpZiAoKHAgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBCTl9uZXcgZmFpbGVkIiwgX19mdW5jX18pOworCWlmICgoZyA9IEJOX25ldygpKSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IEJOX25ldyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJYnVmZmVyX2dldF9iaWdudW0yKCZtLCBwKTsKKwlidWZmZXJfZ2V0X2JpZ251bTIoJm0sIGcpOworCisJZGVidWczKCIlczogcmVtYWluaW5nICVkIiwgX19mdW5jX18sIGJ1ZmZlcl9sZW4oJm0pKTsKKwlidWZmZXJfZnJlZSgmbSk7CisKKwlyZXR1cm4gKGRoX25ld19ncm91cChnLCBwKSk7Cit9CisKK2ludAorbW1fa2V5X3NpZ24oS2V5ICprZXksIHVfY2hhciAqKnNpZ3AsIHVfaW50ICpsZW5wLCB1X2NoYXIgKmRhdGEsIHVfaW50IGRhdGFsZW4pCit7CisJS2V4ICprZXggPSAqcG1vbml0b3ItPm1fcGtleDsKKwlCdWZmZXIgbTsKKworCWRlYnVnMygiJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7CisKKwlidWZmZXJfaW5pdCgmbSk7CisJYnVmZmVyX3B1dF9pbnQoJm0sIGtleC0+aG9zdF9rZXlfaW5kZXgoa2V5KSk7CisJYnVmZmVyX3B1dF9zdHJpbmcoJm0sIGRhdGEsIGRhdGFsZW4pOworCisJbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfU0lHTiwgJm0pOworCisJZGVidWczKCIlczogd2FpdGluZyBmb3IgTU9OSVRPUl9BTlNfU0lHTiIsIF9fZnVuY19fKTsKKwltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9BTlNfU0lHTiwgJm0pOworCSpzaWdwICA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBsZW5wKTsKKwlidWZmZXJfZnJlZSgmbSk7CisKKwlyZXR1cm4gKDApOworfQorCitzdHJ1Y3QgcGFzc3dkICoKK21tX2dldHB3bmFtYWxsb3coY29uc3QgY2hhciAqdXNlcm5hbWUpCit7CisJQnVmZmVyIG07CisJc3RydWN0IHBhc3N3ZCAqcHc7CisJdV9pbnQgbGVuLCBpOworCVNlcnZlck9wdGlvbnMgKm5ld29wdHM7CisKKwlkZWJ1ZzMoIiVzIGVudGVyaW5nIiwgX19mdW5jX18pOworCisJYnVmZmVyX2luaXQoJm0pOworCWJ1ZmZlcl9wdXRfY3N0cmluZygmbSwgdXNlcm5hbWUpOworCisJbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfUFdOQU0sICZtKTsKKworCWRlYnVnMygiJXM6IHdhaXRpbmcgZm9yIE1PTklUT1JfQU5TX1BXTkFNIiwgX19mdW5jX18pOworCW1tX3JlcXVlc3RfcmVjZWl2ZV9leHBlY3QocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX0FOU19QV05BTSwgJm0pOworCisJaWYgKGJ1ZmZlcl9nZXRfY2hhcigmbSkgPT0gMCkgeworCQlwdyA9IE5VTEw7CisJCWdvdG8gb3V0OworCX0KKwlwdyA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCAmbGVuKTsKKwlpZiAobGVuICE9IHNpemVvZihzdHJ1Y3QgcGFzc3dkKSkKKwkJZmF0YWwoIiVzOiBzdHJ1Y3QgcGFzc3dkIHNpemUgbWlzbWF0Y2giLCBfX2Z1bmNfXyk7CisJcHctPnB3X25hbWUgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgTlVMTCk7CisJcHctPnB3X3Bhc3N3ZCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKKwlwdy0+cHdfZ2Vjb3MgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgTlVMTCk7CisjaWZkZWYgSEFWRV9QV19DTEFTU19JTl9QQVNTV0QKKwlwdy0+cHdfY2xhc3MgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgTlVMTCk7CisjZW5kaWYKKwlwdy0+cHdfZGlyID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIE5VTEwpOworCXB3LT5wd19zaGVsbCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKKworb3V0OgorCS8qIGNvcHkgb3B0aW9ucyBibG9jayBhcyBhIE1hdGNoIGRpcmVjdGl2ZSBtYXkgaGF2ZSBjaGFuZ2VkIHNvbWUgKi8KKwluZXdvcHRzID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sICZsZW4pOworCWlmIChsZW4gIT0gc2l6ZW9mKCpuZXdvcHRzKSkKKwkJZmF0YWwoIiVzOiBvcHRpb24gYmxvY2sgc2l6ZSBtaXNtYXRjaCIsIF9fZnVuY19fKTsKKworI2RlZmluZSBNX0NQX1NUUk9QVCh4KSBkbyB7IFwKKwkJaWYgKG5ld29wdHMtPnggIT0gTlVMTCkgXAorCQkJbmV3b3B0cy0+eCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsgXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIE1fQ1BfU1RSQVJSQVlPUFQoeCwgbngpIGRvIHsgXAorCQlmb3IgKGkgPSAwOyBpIDwgbmV3b3B0cy0+bng7IGkrKykgXAorCQkJbmV3b3B0cy0+eFtpXSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsgXAorCX0gd2hpbGUgKDApCisJLyogU2VlIGNvbW1lbnQgaW4gc2VydmNvbmYuaCAqLworCUNPUFlfTUFUQ0hfU1RSSU5HX09QVFMoKTsKKyN1bmRlZiBNX0NQX1NUUk9QVAorI3VuZGVmIE1fQ1BfU1RSQVJSQVlPUFQKKworCWNvcHlfc2V0X3NlcnZlcl9vcHRpb25zKCZvcHRpb25zLCBuZXdvcHRzLCAxKTsKKwl4ZnJlZShuZXdvcHRzKTsKKworCWJ1ZmZlcl9mcmVlKCZtKTsKKworCXJldHVybiAocHcpOworfQorCitjaGFyICoKK21tX2F1dGgyX3JlYWRfYmFubmVyKHZvaWQpCit7CisJQnVmZmVyIG07CisJY2hhciAqYmFubmVyOworCisJZGVidWczKCIlcyBlbnRlcmluZyIsIF9fZnVuY19fKTsKKworCWJ1ZmZlcl9pbml0KCZtKTsKKwltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX1JFUV9BVVRIMl9SRUFEX0JBTk5FUiwgJm0pOworCWJ1ZmZlcl9jbGVhcigmbSk7CisKKwltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3JlY3ZmZCwKKwkgICAgTU9OSVRPUl9BTlNfQVVUSDJfUkVBRF9CQU5ORVIsICZtKTsKKwliYW5uZXIgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgTlVMTCk7CisJYnVmZmVyX2ZyZWUoJm0pOworCisJLyogdHJlYXQgZW1wdHkgYmFubmVyIGFzIG1pc3NpbmcgYmFubmVyICovCisJaWYgKHN0cmxlbihiYW5uZXIpID09IDApIHsKKwkJeGZyZWUoYmFubmVyKTsKKwkJYmFubmVyID0gTlVMTDsKKwl9CisJcmV0dXJuIChiYW5uZXIpOworfQorCisvKiBJbmZvcm0gdGhlIHByaXZpbGVnZWQgcHJvY2VzcyBhYm91dCBzZXJ2aWNlIGFuZCBzdHlsZSAqLworCit2b2lkCittbV9pbmZvcm1fYXV0aHNlcnYoY2hhciAqc2VydmljZSwgY2hhciAqc3R5bGUpCit7CisJQnVmZmVyIG07CisKKwlkZWJ1ZzMoIiVzIGVudGVyaW5nIiwgX19mdW5jX18pOworCisJYnVmZmVyX2luaXQoJm0pOworCWJ1ZmZlcl9wdXRfY3N0cmluZygmbSwgc2VydmljZSk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZtLCBzdHlsZSA/IHN0eWxlIDogIiIpOworCisJbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfQVVUSFNFUlYsICZtKTsKKworCWJ1ZmZlcl9mcmVlKCZtKTsKK30KKworLyogRG8gdGhlIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uICovCitpbnQKK21tX2F1dGhfcGFzc3dvcmQoQXV0aGN0eHQgKmF1dGhjdHh0LCBjaGFyICpwYXNzd29yZCkKK3sKKwlCdWZmZXIgbTsKKwlpbnQgYXV0aGVudGljYXRlZCA9IDA7CisKKwlkZWJ1ZzMoIiVzIGVudGVyaW5nIiwgX19mdW5jX18pOworCisJYnVmZmVyX2luaXQoJm0pOworCWJ1ZmZlcl9wdXRfY3N0cmluZygmbSwgcGFzc3dvcmQpOworCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfUkVRX0FVVEhQQVNTV09SRCwgJm0pOworCisJZGVidWczKCIlczogd2FpdGluZyBmb3IgTU9OSVRPUl9BTlNfQVVUSFBBU1NXT1JEIiwgX19mdW5jX18pOworCW1tX3JlcXVlc3RfcmVjZWl2ZV9leHBlY3QocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX0FOU19BVVRIUEFTU1dPUkQsICZtKTsKKworCWF1dGhlbnRpY2F0ZWQgPSBidWZmZXJfZ2V0X2ludCgmbSk7CisKKwlidWZmZXJfZnJlZSgmbSk7CisKKwlkZWJ1ZzMoIiVzOiB1c2VyICVzYXV0aGVudGljYXRlZCIsCisJICAgIF9fZnVuY19fLCBhdXRoZW50aWNhdGVkID8gIiIgOiAibm90ICIpOworCXJldHVybiAoYXV0aGVudGljYXRlZCk7Cit9CisKK2ludAorbW1fdXNlcl9rZXlfYWxsb3dlZChzdHJ1Y3QgcGFzc3dkICpwdywgS2V5ICprZXkpCit7CisJcmV0dXJuIChtbV9rZXlfYWxsb3dlZChNTV9VU0VSS0VZLCBOVUxMLCBOVUxMLCBrZXkpKTsKK30KKworaW50CittbV9ob3N0YmFzZWRfa2V5X2FsbG93ZWQoc3RydWN0IHBhc3N3ZCAqcHcsIGNoYXIgKnVzZXIsIGNoYXIgKmhvc3QsCisgICAgS2V5ICprZXkpCit7CisJcmV0dXJuIChtbV9rZXlfYWxsb3dlZChNTV9IT1NUS0VZLCB1c2VyLCBob3N0LCBrZXkpKTsKK30KKworaW50CittbV9hdXRoX3Job3N0c19yc2Ffa2V5X2FsbG93ZWQoc3RydWN0IHBhc3N3ZCAqcHcsIGNoYXIgKnVzZXIsCisgICAgY2hhciAqaG9zdCwgS2V5ICprZXkpCit7CisJaW50IHJldDsKKworCWtleS0+dHlwZSA9IEtFWV9SU0E7IC8qIFhYWCBoYWNrIGZvciBrZXlfdG9fYmxvYiAqLworCXJldCA9IG1tX2tleV9hbGxvd2VkKE1NX1JTQUhPU1RLRVksIHVzZXIsIGhvc3QsIGtleSk7CisJa2V5LT50eXBlID0gS0VZX1JTQTE7CisJcmV0dXJuIChyZXQpOworfQorCitpbnQKK21tX2tleV9hbGxvd2VkKGVudW0gbW1fa2V5dHlwZSB0eXBlLCBjaGFyICp1c2VyLCBjaGFyICpob3N0LCBLZXkgKmtleSkKK3sKKwlCdWZmZXIgbTsKKwl1X2NoYXIgKmJsb2I7CisJdV9pbnQgbGVuOworCWludCBhbGxvd2VkID0gMCwgaGF2ZV9mb3JjZWQgPSAwOworCisJZGVidWczKCIlcyBlbnRlcmluZyIsIF9fZnVuY19fKTsKKworCS8qIENvbnZlcnQgdGhlIGtleSB0byBhIGJsb2IgYW5kIHRoZSBwYXNzIGl0IG92ZXIgKi8KKwlpZiAoIWtleV90b19ibG9iKGtleSwgJmJsb2IsICZsZW4pKQorCQlyZXR1cm4gKDApOworCisJYnVmZmVyX2luaXQoJm0pOworCWJ1ZmZlcl9wdXRfaW50KCZtLCB0eXBlKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcoJm0sIHVzZXIgPyB1c2VyIDogIiIpOworCWJ1ZmZlcl9wdXRfY3N0cmluZygmbSwgaG9zdCA/IGhvc3QgOiAiIik7CisJYnVmZmVyX3B1dF9zdHJpbmcoJm0sIGJsb2IsIGxlbik7CisJeGZyZWUoYmxvYik7CisKKwltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX1JFUV9LRVlBTExPV0VELCAmbSk7CisKKwlkZWJ1ZzMoIiVzOiB3YWl0aW5nIGZvciBNT05JVE9SX0FOU19LRVlBTExPV0VEIiwgX19mdW5jX18pOworCW1tX3JlcXVlc3RfcmVjZWl2ZV9leHBlY3QocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX0FOU19LRVlBTExPV0VELCAmbSk7CisKKwlhbGxvd2VkID0gYnVmZmVyX2dldF9pbnQoJm0pOworCisJLyogZmFrZSBmb3JjZWQgY29tbWFuZCAqLworCWF1dGhfY2xlYXJfb3B0aW9ucygpOworCWhhdmVfZm9yY2VkID0gYnVmZmVyX2dldF9pbnQoJm0pOworCWZvcmNlZF9jb21tYW5kID0gaGF2ZV9mb3JjZWQgPyB4c3RyZHVwKCJ0cnVlIikgOiBOVUxMOworCisJYnVmZmVyX2ZyZWUoJm0pOworCisJcmV0dXJuIChhbGxvd2VkKTsKK30KKworLyoKKyAqIFRoaXMga2V5IHZlcmlmeSBuZWVkcyB0byBzZW5kIHRoZSBrZXkgdHlwZSBhbG9uZywgYmVjYXVzZSB0aGUKKyAqIHByaXZpbGVnZWQgcGFyZW50IG1ha2VzIHRoZSBkZWNpc2lvbiBpZiB0aGUga2V5IGlzIGFsbG93ZWQKKyAqIGZvciBhdXRoZW50aWNhdGlvbi4KKyAqLworCitpbnQKK21tX2tleV92ZXJpZnkoS2V5ICprZXksIHVfY2hhciAqc2lnLCB1X2ludCBzaWdsZW4sIHVfY2hhciAqZGF0YSwgdV9pbnQgZGF0YWxlbikKK3sKKwlCdWZmZXIgbTsKKwl1X2NoYXIgKmJsb2I7CisJdV9pbnQgbGVuOworCWludCB2ZXJpZmllZCA9IDA7CisKKwlkZWJ1ZzMoIiVzIGVudGVyaW5nIiwgX19mdW5jX18pOworCisJLyogQ29udmVydCB0aGUga2V5IHRvIGEgYmxvYiBhbmQgdGhlIHBhc3MgaXQgb3ZlciAqLworCWlmICgha2V5X3RvX2Jsb2Ioa2V5LCAmYmxvYiwgJmxlbikpCisJCXJldHVybiAoMCk7CisKKwlidWZmZXJfaW5pdCgmbSk7CisJYnVmZmVyX3B1dF9zdHJpbmcoJm0sIGJsb2IsIGxlbik7CisJYnVmZmVyX3B1dF9zdHJpbmcoJm0sIHNpZywgc2lnbGVuKTsKKwlidWZmZXJfcHV0X3N0cmluZygmbSwgZGF0YSwgZGF0YWxlbik7CisJeGZyZWUoYmxvYik7CisKKwltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX1JFUV9LRVlWRVJJRlksICZtKTsKKworCWRlYnVnMygiJXM6IHdhaXRpbmcgZm9yIE1PTklUT1JfQU5TX0tFWVZFUklGWSIsIF9fZnVuY19fKTsKKwltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9BTlNfS0VZVkVSSUZZLCAmbSk7CisKKwl2ZXJpZmllZCA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKKworCWJ1ZmZlcl9mcmVlKCZtKTsKKworCXJldHVybiAodmVyaWZpZWQpOworfQorCisvKiBFeHBvcnQga2V5IHN0YXRlIGFmdGVyIGF1dGhlbnRpY2F0aW9uICovCitOZXdrZXlzICoKK21tX25ld2tleXNfZnJvbV9ibG9iKHVfY2hhciAqYmxvYiwgaW50IGJsZW4pCit7CisJQnVmZmVyIGI7CisJdV9pbnQgbGVuOworCU5ld2tleXMgKm5ld2tleSA9IE5VTEw7CisJRW5jICplbmM7CisJTWFjICptYWM7CisJQ29tcCAqY29tcDsKKworCWRlYnVnMygiJXM6ICVwKCVkKSIsIF9fZnVuY19fLCBibG9iLCBibGVuKTsKKyNpZmRlZiBERUJVR19QSworCWR1bXBfYmFzZTY0KHN0ZGVyciwgYmxvYiwgYmxlbik7CisjZW5kaWYKKwlidWZmZXJfaW5pdCgmYik7CisJYnVmZmVyX2FwcGVuZCgmYiwgYmxvYiwgYmxlbik7CisKKwluZXdrZXkgPSB4bWFsbG9jKHNpemVvZigqbmV3a2V5KSk7CisJZW5jID0gJm5ld2tleS0+ZW5jOworCW1hYyA9ICZuZXdrZXktPm1hYzsKKwljb21wID0gJm5ld2tleS0+Y29tcDsKKworCS8qIEVuYyBzdHJ1Y3R1cmUgKi8KKwllbmMtPm5hbWUgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgTlVMTCk7CisJYnVmZmVyX2dldCgmYiwgJmVuYy0+Y2lwaGVyLCBzaXplb2YoZW5jLT5jaXBoZXIpKTsKKwllbmMtPmVuYWJsZWQgPSBidWZmZXJfZ2V0X2ludCgmYik7CisJZW5jLT5ibG9ja19zaXplID0gYnVmZmVyX2dldF9pbnQoJmIpOworCWVuYy0+a2V5ID0gYnVmZmVyX2dldF9zdHJpbmcoJmIsICZlbmMtPmtleV9sZW4pOworCWVuYy0+aXYgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgJmxlbik7CisJaWYgKGxlbiAhPSBlbmMtPmJsb2NrX3NpemUpCisJCWZhdGFsKCIlczogYmFkIGl2bGVuOiBleHBlY3RlZCAldSAhPSAldSIsIF9fZnVuY19fLAorCQkgICAgZW5jLT5ibG9ja19zaXplLCBsZW4pOworCisJaWYgKGVuYy0+bmFtZSA9PSBOVUxMIHx8IGNpcGhlcl9ieV9uYW1lKGVuYy0+bmFtZSkgIT0gZW5jLT5jaXBoZXIpCisJCWZhdGFsKCIlczogYmFkIGNpcGhlciBuYW1lICVzIG9yIHBvaW50ZXIgJXAiLCBfX2Z1bmNfXywKKwkJICAgIGVuYy0+bmFtZSwgZW5jLT5jaXBoZXIpOworCisJLyogTWFjIHN0cnVjdHVyZSAqLworCW1hYy0+bmFtZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZiLCBOVUxMKTsKKwlpZiAobWFjLT5uYW1lID09IE5VTEwgfHwgbWFjX3NldHVwKG1hYywgbWFjLT5uYW1lKSA9PSAtMSkKKwkJZmF0YWwoIiVzOiBjYW4gbm90IHNldHVwIG1hYyAlcyIsIF9fZnVuY19fLCBtYWMtPm5hbWUpOworCW1hYy0+ZW5hYmxlZCA9IGJ1ZmZlcl9nZXRfaW50KCZiKTsKKwltYWMtPmtleSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZiLCAmbGVuKTsKKwlpZiAobGVuID4gbWFjLT5rZXlfbGVuKQorCQlmYXRhbCgiJXM6IGJhZCBtYWMga2V5IGxlbmd0aDogJXUgPiAlZCIsIF9fZnVuY19fLCBsZW4sCisJCSAgICBtYWMtPmtleV9sZW4pOworCW1hYy0+a2V5X2xlbiA9IGxlbjsKKworCS8qIENvbXAgc3RydWN0dXJlICovCisJY29tcC0+dHlwZSA9IGJ1ZmZlcl9nZXRfaW50KCZiKTsKKwljb21wLT5lbmFibGVkID0gYnVmZmVyX2dldF9pbnQoJmIpOworCWNvbXAtPm5hbWUgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgTlVMTCk7CisKKwlsZW4gPSBidWZmZXJfbGVuKCZiKTsKKwlpZiAobGVuICE9IDApCisJCWVycm9yKCJuZXdrZXlzX2Zyb21fYmxvYjogcmVtYWluaW5nIGJ5dGVzIGluIGJsb2IgJXUiLCBsZW4pOworCWJ1ZmZlcl9mcmVlKCZiKTsKKwlyZXR1cm4gKG5ld2tleSk7Cit9CisKK2ludAorbW1fbmV3a2V5c190b19ibG9iKGludCBtb2RlLCB1X2NoYXIgKipibG9icCwgdV9pbnQgKmxlbnApCit7CisJQnVmZmVyIGI7CisJaW50IGxlbjsKKwlFbmMgKmVuYzsKKwlNYWMgKm1hYzsKKwlDb21wICpjb21wOworCU5ld2tleXMgKm5ld2tleSA9IChOZXdrZXlzICopcGFja2V0X2dldF9uZXdrZXlzKG1vZGUpOworCisJZGVidWczKCIlczogY29udmVydGluZyAlcCIsIF9fZnVuY19fLCBuZXdrZXkpOworCisJaWYgKG5ld2tleSA9PSBOVUxMKSB7CisJCWVycm9yKCIlczogbmV3a2V5ID09IE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKwllbmMgPSAmbmV3a2V5LT5lbmM7CisJbWFjID0gJm5ld2tleS0+bWFjOworCWNvbXAgPSAmbmV3a2V5LT5jb21wOworCisJYnVmZmVyX2luaXQoJmIpOworCS8qIEVuYyBzdHJ1Y3R1cmUgKi8KKwlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIGVuYy0+bmFtZSk7CisJLyogVGhlIGNpcGhlciBzdHJ1Y3QgaXMgY29uc3RhbnQgYW5kIHNoYXJlZCwgeW91IGV4cG9ydCBwb2ludGVyICovCisJYnVmZmVyX2FwcGVuZCgmYiwgJmVuYy0+Y2lwaGVyLCBzaXplb2YoZW5jLT5jaXBoZXIpKTsKKwlidWZmZXJfcHV0X2ludCgmYiwgZW5jLT5lbmFibGVkKTsKKwlidWZmZXJfcHV0X2ludCgmYiwgZW5jLT5ibG9ja19zaXplKTsKKwlidWZmZXJfcHV0X3N0cmluZygmYiwgZW5jLT5rZXksIGVuYy0+a2V5X2xlbik7CisJcGFja2V0X2dldF9rZXlpdihtb2RlLCBlbmMtPml2LCBlbmMtPmJsb2NrX3NpemUpOworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZiLCBlbmMtPml2LCBlbmMtPmJsb2NrX3NpemUpOworCisJLyogTWFjIHN0cnVjdHVyZSAqLworCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwgbWFjLT5uYW1lKTsKKwlidWZmZXJfcHV0X2ludCgmYiwgbWFjLT5lbmFibGVkKTsKKwlidWZmZXJfcHV0X3N0cmluZygmYiwgbWFjLT5rZXksIG1hYy0+a2V5X2xlbik7CisKKwkvKiBDb21wIHN0cnVjdHVyZSAqLworCWJ1ZmZlcl9wdXRfaW50KCZiLCBjb21wLT50eXBlKTsKKwlidWZmZXJfcHV0X2ludCgmYiwgY29tcC0+ZW5hYmxlZCk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBjb21wLT5uYW1lKTsKKworCWxlbiA9IGJ1ZmZlcl9sZW4oJmIpOworCWlmIChsZW5wICE9IE5VTEwpCisJCSpsZW5wID0gbGVuOworCWlmIChibG9icCAhPSBOVUxMKSB7CisJCSpibG9icCA9IHhtYWxsb2MobGVuKTsKKwkJbWVtY3B5KCpibG9icCwgYnVmZmVyX3B0cigmYiksIGxlbik7CisJfQorCW1lbXNldChidWZmZXJfcHRyKCZiKSwgMCwgbGVuKTsKKwlidWZmZXJfZnJlZSgmYik7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHZvaWQKK21tX3NlbmRfa2V4KEJ1ZmZlciAqbSwgS2V4ICprZXgpCit7CisJYnVmZmVyX3B1dF9zdHJpbmcobSwga2V4LT5zZXNzaW9uX2lkLCBrZXgtPnNlc3Npb25faWRfbGVuKTsKKwlidWZmZXJfcHV0X2ludChtLCBrZXgtPndlX25lZWQpOworCWJ1ZmZlcl9wdXRfaW50KG0sIGtleC0+aG9zdGtleV90eXBlKTsKKwlidWZmZXJfcHV0X2ludChtLCBrZXgtPmtleF90eXBlKTsKKwlidWZmZXJfcHV0X3N0cmluZyhtLCBidWZmZXJfcHRyKCZrZXgtPm15KSwgYnVmZmVyX2xlbigma2V4LT5teSkpOworCWJ1ZmZlcl9wdXRfc3RyaW5nKG0sIGJ1ZmZlcl9wdHIoJmtleC0+cGVlciksIGJ1ZmZlcl9sZW4oJmtleC0+cGVlcikpOworCWJ1ZmZlcl9wdXRfaW50KG0sIGtleC0+ZmxhZ3MpOworCWJ1ZmZlcl9wdXRfY3N0cmluZyhtLCBrZXgtPmNsaWVudF92ZXJzaW9uX3N0cmluZyk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKG0sIGtleC0+c2VydmVyX3ZlcnNpb25fc3RyaW5nKTsKK30KKwordm9pZAorbW1fc2VuZF9rZXlzdGF0ZShzdHJ1Y3QgbW9uaXRvciAqbW9uaXRvcikKK3sKKwlCdWZmZXIgbSwgKmlucHV0LCAqb3V0cHV0OworCXVfY2hhciAqYmxvYiwgKnA7CisJdV9pbnQgYmxvYmxlbiwgcGxlbjsKKwl1X2ludDMyX3Qgc2VxbnIsIHBhY2tldHM7CisJdV9pbnQ2NF90IGJsb2NrcywgYnl0ZXM7CisKKwlidWZmZXJfaW5pdCgmbSk7CisKKwlpZiAoIWNvbXBhdDIwKSB7CisJCXVfY2hhciBpdlsyNF07CisJCXVfY2hhciAqa2V5OworCQl1X2ludCBpdmxlbiwga2V5bGVuOworCisJCWJ1ZmZlcl9wdXRfaW50KCZtLCBwYWNrZXRfZ2V0X3Byb3RvY29sX2ZsYWdzKCkpOworCisJCWJ1ZmZlcl9wdXRfaW50KCZtLCBwYWNrZXRfZ2V0X3NzaDFfY2lwaGVyKCkpOworCisJCWRlYnVnMygiJXM6IFNlbmRpbmcgc3NoMSBLRVkrSVYiLCBfX2Z1bmNfXyk7CisJCWtleWxlbiA9IHBhY2tldF9nZXRfZW5jcnlwdGlvbl9rZXkoTlVMTCk7CisJCWtleSA9IHhtYWxsb2Moa2V5bGVuKzEpOwkvKiBhZGQgMSBpZiBrZXlsZW4gPT0gMCAqLworCQlrZXlsZW4gPSBwYWNrZXRfZ2V0X2VuY3J5cHRpb25fa2V5KGtleSk7CisJCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCBrZXksIGtleWxlbik7CisJCW1lbXNldChrZXksIDAsIGtleWxlbik7CisJCXhmcmVlKGtleSk7CisKKwkJaXZsZW4gPSBwYWNrZXRfZ2V0X2tleWl2X2xlbihNT0RFX09VVCk7CisJCXBhY2tldF9nZXRfa2V5aXYoTU9ERV9PVVQsIGl2LCBpdmxlbik7CisJCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCBpdiwgaXZsZW4pOworCQlpdmxlbiA9IHBhY2tldF9nZXRfa2V5aXZfbGVuKE1PREVfT1VUKTsKKwkJcGFja2V0X2dldF9rZXlpdihNT0RFX0lOLCBpdiwgaXZsZW4pOworCQlidWZmZXJfcHV0X3N0cmluZygmbSwgaXYsIGl2bGVuKTsKKwkJZ290byBza2lwOworCX0gZWxzZSB7CisJCS8qIEtleCBmb3IgcmVrZXlpbmcgKi8KKwkJbW1fc2VuZF9rZXgoJm0sICptb25pdG9yLT5tX3BrZXgpOworCX0KKworCWRlYnVnMygiJXM6IFNlbmRpbmcgbmV3IGtleXM6ICVwICVwIiwKKwkgICAgX19mdW5jX18sIHBhY2tldF9nZXRfbmV3a2V5cyhNT0RFX09VVCksCisJICAgIHBhY2tldF9nZXRfbmV3a2V5cyhNT0RFX0lOKSk7CisKKwkvKiBLZXlzIGZyb20gS2V4ICovCisJaWYgKCFtbV9uZXdrZXlzX3RvX2Jsb2IoTU9ERV9PVVQsICZibG9iLCAmYmxvYmxlbikpCisJCWZhdGFsKCIlczogY29udmVyc2lvbiBvZiBuZXdrZXlzIGZhaWxlZCIsIF9fZnVuY19fKTsKKworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCBibG9iLCBibG9ibGVuKTsKKwl4ZnJlZShibG9iKTsKKworCWlmICghbW1fbmV3a2V5c190b19ibG9iKE1PREVfSU4sICZibG9iLCAmYmxvYmxlbikpCisJCWZhdGFsKCIlczogY29udmVyc2lvbiBvZiBuZXdrZXlzIGZhaWxlZCIsIF9fZnVuY19fKTsKKworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCBibG9iLCBibG9ibGVuKTsKKwl4ZnJlZShibG9iKTsKKworCXBhY2tldF9nZXRfc3RhdGUoTU9ERV9PVVQsICZzZXFuciwgJmJsb2NrcywgJnBhY2tldHMsICZieXRlcyk7CisJYnVmZmVyX3B1dF9pbnQoJm0sIHNlcW5yKTsKKwlidWZmZXJfcHV0X2ludDY0KCZtLCBibG9ja3MpOworCWJ1ZmZlcl9wdXRfaW50KCZtLCBwYWNrZXRzKTsKKwlidWZmZXJfcHV0X2ludDY0KCZtLCBieXRlcyk7CisJcGFja2V0X2dldF9zdGF0ZShNT0RFX0lOLCAmc2VxbnIsICZibG9ja3MsICZwYWNrZXRzLCAmYnl0ZXMpOworCWJ1ZmZlcl9wdXRfaW50KCZtLCBzZXFucik7CisJYnVmZmVyX3B1dF9pbnQ2NCgmbSwgYmxvY2tzKTsKKwlidWZmZXJfcHV0X2ludCgmbSwgcGFja2V0cyk7CisJYnVmZmVyX3B1dF9pbnQ2NCgmbSwgYnl0ZXMpOworCisJZGVidWczKCIlczogTmV3IGtleXMgaGF2ZSBiZWVuIHNlbnQiLCBfX2Z1bmNfXyk7Cisgc2tpcDoKKwkvKiBNb3JlIGtleSBjb250ZXh0ICovCisJcGxlbiA9IHBhY2tldF9nZXRfa2V5Y29udGV4dChNT0RFX09VVCwgTlVMTCk7CisJcCA9IHhtYWxsb2MocGxlbisxKTsKKwlwYWNrZXRfZ2V0X2tleWNvbnRleHQoTU9ERV9PVVQsIHApOworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCBwLCBwbGVuKTsKKwl4ZnJlZShwKTsKKworCXBsZW4gPSBwYWNrZXRfZ2V0X2tleWNvbnRleHQoTU9ERV9JTiwgTlVMTCk7CisJcCA9IHhtYWxsb2MocGxlbisxKTsKKwlwYWNrZXRfZ2V0X2tleWNvbnRleHQoTU9ERV9JTiwgcCk7CisJYnVmZmVyX3B1dF9zdHJpbmcoJm0sIHAsIHBsZW4pOworCXhmcmVlKHApOworCisJLyogQ29tcHJlc3Npb24gc3RhdGUgKi8KKwlkZWJ1ZzMoIiVzOiBTZW5kaW5nIGNvbXByZXNzaW9uIHN0YXRlIiwgX19mdW5jX18pOworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCAmb3V0Z29pbmdfc3RyZWFtLCBzaXplb2Yob3V0Z29pbmdfc3RyZWFtKSk7CisJYnVmZmVyX3B1dF9zdHJpbmcoJm0sICZpbmNvbWluZ19zdHJlYW0sIHNpemVvZihpbmNvbWluZ19zdHJlYW0pKTsKKworCS8qIE5ldHdvcmsgSS9PIGJ1ZmZlcnMgKi8KKwlpbnB1dCA9IChCdWZmZXIgKilwYWNrZXRfZ2V0X2lucHV0KCk7CisJb3V0cHV0ID0gKEJ1ZmZlciAqKXBhY2tldF9nZXRfb3V0cHV0KCk7CisJYnVmZmVyX3B1dF9zdHJpbmcoJm0sIGJ1ZmZlcl9wdHIoaW5wdXQpLCBidWZmZXJfbGVuKGlucHV0KSk7CisJYnVmZmVyX3B1dF9zdHJpbmcoJm0sIGJ1ZmZlcl9wdHIob3V0cHV0KSwgYnVmZmVyX2xlbihvdXRwdXQpKTsKKworCS8qIFJvYW1pbmcgKi8KKwlpZiAoY29tcGF0MjApIHsKKwkJYnVmZmVyX3B1dF9pbnQ2NCgmbSwgZ2V0X3NlbnRfYnl0ZXMoKSk7CisJCWJ1ZmZlcl9wdXRfaW50NjQoJm0sIGdldF9yZWN2X2J5dGVzKCkpOworCX0KKworCW1tX3JlcXVlc3Rfc2VuZChtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfS0VZRVhQT1JULCAmbSk7CisJZGVidWczKCIlczogRmluaXNoZWQgc2VuZGluZyBzdGF0ZSIsIF9fZnVuY19fKTsKKworCWJ1ZmZlcl9mcmVlKCZtKTsKK30KKworaW50CittbV9wdHlfYWxsb2NhdGUoaW50ICpwdHlmZCwgaW50ICp0dHlmZCwgY2hhciAqbmFtZWJ1Ziwgc2l6ZV90IG5hbWVidWZsZW4pCit7CisJQnVmZmVyIG07CisJY2hhciAqcCwgKm1zZzsKKwlpbnQgc3VjY2VzcyA9IDAsIHRtcDEgPSAtMSwgdG1wMiA9IC0xOworCisJLyogS2x1ZGdlOiBlbnN1cmUgdGhlcmUgYXJlIGZkcyBmcmVlIHRvIHJlY2VpdmUgdGhlIHB0eS90dHkgKi8KKwlpZiAoKHRtcDEgPSBkdXAocG1vbml0b3ItPm1fcmVjdmZkKSkgPT0gLTEgfHwKKwkgICAgKHRtcDIgPSBkdXAocG1vbml0b3ItPm1fcmVjdmZkKSkgPT0gLTEpIHsKKwkJZXJyb3IoIiVzOiBjYW5ub3QgYWxsb2NhdGUgZmRzIGZvciBwdHkiLCBfX2Z1bmNfXyk7CisJCWlmICh0bXAxID4gMCkKKwkJCWNsb3NlKHRtcDEpOworCQlpZiAodG1wMiA+IDApCisJCQljbG9zZSh0bXAyKTsKKwkJcmV0dXJuIDA7CisJfQorCWNsb3NlKHRtcDEpOworCWNsb3NlKHRtcDIpOworCisJYnVmZmVyX2luaXQoJm0pOworCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfUkVRX1BUWSwgJm0pOworCisJZGVidWczKCIlczogd2FpdGluZyBmb3IgTU9OSVRPUl9BTlNfUFRZIiwgX19mdW5jX18pOworCW1tX3JlcXVlc3RfcmVjZWl2ZV9leHBlY3QocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX0FOU19QVFksICZtKTsKKworCXN1Y2Nlc3MgPSBidWZmZXJfZ2V0X2ludCgmbSk7CisJaWYgKHN1Y2Nlc3MgPT0gMCkgeworCQlkZWJ1ZzMoIiVzOiBwdHkgYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlidWZmZXJfZnJlZSgmbSk7CisJCXJldHVybiAoMCk7CisJfQorCXAgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgTlVMTCk7CisJbXNnID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIE5VTEwpOworCWJ1ZmZlcl9mcmVlKCZtKTsKKworCXN0cmxjcHkobmFtZWJ1ZiwgcCwgbmFtZWJ1Zmxlbik7IC8qIFBvc3NpYmxlIHRydW5jYXRpb24gKi8KKwl4ZnJlZShwKTsKKworCWJ1ZmZlcl9hcHBlbmQoJmxvZ2lubXNnLCBtc2csIHN0cmxlbihtc2cpKTsKKwl4ZnJlZShtc2cpOworCisJaWYgKCgqcHR5ZmQgPSBtbV9yZWNlaXZlX2ZkKHBtb25pdG9yLT5tX3JlY3ZmZCkpID09IC0xIHx8CisJICAgICgqdHR5ZmQgPSBtbV9yZWNlaXZlX2ZkKHBtb25pdG9yLT5tX3JlY3ZmZCkpID09IC0xKQorCQlmYXRhbCgiJXM6IHJlY2VpdmUgZmRzIGZhaWxlZCIsIF9fZnVuY19fKTsKKworCS8qIFN1Y2Nlc3MgKi8KKwlyZXR1cm4gKDEpOworfQorCit2b2lkCittbV9zZXNzaW9uX3B0eV9jbGVhbnVwMihTZXNzaW9uICpzKQoreworCUJ1ZmZlciBtOworCisJaWYgKHMtPnR0eWZkID09IC0xKQorCQlyZXR1cm47CisJYnVmZmVyX2luaXQoJm0pOworCWJ1ZmZlcl9wdXRfY3N0cmluZygmbSwgcy0+dHR5KTsKKwltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX1JFUV9QVFlDTEVBTlVQLCAmbSk7CisJYnVmZmVyX2ZyZWUoJm0pOworCisJLyogY2xvc2VkIGR1cCdlZCBtYXN0ZXIgKi8KKwlpZiAocy0+cHR5bWFzdGVyICE9IC0xICYmIGNsb3NlKHMtPnB0eW1hc3RlcikgPCAwKQorCQllcnJvcigiY2xvc2Uocy0+cHR5bWFzdGVyLyVkKTogJXMiLAorCQkgICAgcy0+cHR5bWFzdGVyLCBzdHJlcnJvcihlcnJubykpOworCisJLyogdW5saW5rIHB0eSBmcm9tIHNlc3Npb24gKi8KKwlzLT50dHlmZCA9IC0xOworfQorCisjaWZkZWYgVVNFX1BBTQordm9pZAorbW1fc3RhcnRfcGFtKEF1dGhjdHh0ICphdXRoY3R4dCkKK3sKKwlCdWZmZXIgbTsKKworCWRlYnVnMygiJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7CisJaWYgKCFvcHRpb25zLnVzZV9wYW0pCisJCWZhdGFsKCJVc2VQQU09bm8sIGJ1dCBlbmRlZCB1cCBpbiAlcyBhbnl3YXkiLCBfX2Z1bmNfXyk7CisKKwlidWZmZXJfaW5pdCgmbSk7CisJbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfUEFNX1NUQVJULCAmbSk7CisKKwlidWZmZXJfZnJlZSgmbSk7Cit9CisKK3VfaW50CittbV9kb19wYW1fYWNjb3VudCh2b2lkKQoreworCUJ1ZmZlciBtOworCXVfaW50IHJldDsKKwljaGFyICptc2c7CisKKwlkZWJ1ZzMoIiVzIGVudGVyaW5nIiwgX19mdW5jX18pOworCWlmICghb3B0aW9ucy51c2VfcGFtKQorCQlmYXRhbCgiVXNlUEFNPW5vLCBidXQgZW5kZWQgdXAgaW4gJXMgYW55d2F5IiwgX19mdW5jX18pOworCisJYnVmZmVyX2luaXQoJm0pOworCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfUkVRX1BBTV9BQ0NPVU5ULCAmbSk7CisKKwltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3JlY3ZmZCwKKwkgICAgTU9OSVRPUl9BTlNfUEFNX0FDQ09VTlQsICZtKTsKKwlyZXQgPSBidWZmZXJfZ2V0X2ludCgmbSk7CisJbXNnID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIE5VTEwpOworCWJ1ZmZlcl9hcHBlbmQoJmxvZ2lubXNnLCBtc2csIHN0cmxlbihtc2cpKTsKKwl4ZnJlZShtc2cpOworCisJYnVmZmVyX2ZyZWUoJm0pOworCisJZGVidWczKCIlcyByZXR1cm5pbmcgJWQiLCBfX2Z1bmNfXywgcmV0KTsKKworCXJldHVybiAocmV0KTsKK30KKwordm9pZCAqCittbV9zc2hwYW1faW5pdF9jdHgoQXV0aGN0eHQgKmF1dGhjdHh0KQoreworCUJ1ZmZlciBtOworCWludCBzdWNjZXNzOworCisJZGVidWczKCIlcyIsIF9fZnVuY19fKTsKKwlidWZmZXJfaW5pdCgmbSk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZtLCBhdXRoY3R4dC0+dXNlcik7CisJbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfUEFNX0lOSVRfQ1RYLCAmbSk7CisJZGVidWczKCIlczogd2FpdGluZyBmb3IgTU9OSVRPUl9BTlNfUEFNX0lOSVRfQ1RYIiwgX19mdW5jX18pOworCW1tX3JlcXVlc3RfcmVjZWl2ZV9leHBlY3QocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX0FOU19QQU1fSU5JVF9DVFgsICZtKTsKKwlzdWNjZXNzID0gYnVmZmVyX2dldF9pbnQoJm0pOworCWlmIChzdWNjZXNzID09IDApIHsKKwkJZGVidWczKCIlczogcGFtX2luaXRfY3R4IGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJYnVmZmVyX2ZyZWUoJm0pOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlidWZmZXJfZnJlZSgmbSk7CisJcmV0dXJuIChhdXRoY3R4dCk7Cit9CisKK2ludAorbW1fc3NocGFtX3F1ZXJ5KHZvaWQgKmN0eCwgY2hhciAqKm5hbWUsIGNoYXIgKippbmZvLAorICAgIHVfaW50ICpudW0sIGNoYXIgKioqcHJvbXB0cywgdV9pbnQgKiplY2hvX29uKQoreworCUJ1ZmZlciBtOworCXVfaW50IGk7CisJaW50IHJldDsKKworCWRlYnVnMygiJXMiLCBfX2Z1bmNfXyk7CisJYnVmZmVyX2luaXQoJm0pOworCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfUkVRX1BBTV9RVUVSWSwgJm0pOworCWRlYnVnMygiJXM6IHdhaXRpbmcgZm9yIE1PTklUT1JfQU5TX1BBTV9RVUVSWSIsIF9fZnVuY19fKTsKKwltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9BTlNfUEFNX1FVRVJZLCAmbSk7CisJcmV0ID0gYnVmZmVyX2dldF9pbnQoJm0pOworCWRlYnVnMygiJXM6IHBhbV9xdWVyeSByZXR1cm5lZCAlZCIsIF9fZnVuY19fLCByZXQpOworCSpuYW1lID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIE5VTEwpOworCSppbmZvID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIE5VTEwpOworCSpudW0gPSBidWZmZXJfZ2V0X2ludCgmbSk7CisJaWYgKCpudW0gPiBQQU1fTUFYX05VTV9NU0cpCisJCWZhdGFsKCIlczogcmVjaWV2ZWQgJXUgUEFNIG1lc3NhZ2VzLCBleHBlY3RlZCA8PSAldSIsCisJCSAgICBfX2Z1bmNfXywgKm51bSwgUEFNX01BWF9OVU1fTVNHKTsKKwkqcHJvbXB0cyA9IHhjYWxsb2MoKCpudW0gKyAxKSwgc2l6ZW9mKGNoYXIgKikpOworCSplY2hvX29uID0geGNhbGxvYygoKm51bSArIDEpLCBzaXplb2YodV9pbnQpKTsKKwlmb3IgKGkgPSAwOyBpIDwgKm51bTsgKytpKSB7CisJCSgqcHJvbXB0cylbaV0gPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgTlVMTCk7CisJCSgqZWNob19vbilbaV0gPSBidWZmZXJfZ2V0X2ludCgmbSk7CisJfQorCWJ1ZmZlcl9mcmVlKCZtKTsKKwlyZXR1cm4gKHJldCk7Cit9CisKK2ludAorbW1fc3NocGFtX3Jlc3BvbmQodm9pZCAqY3R4LCB1X2ludCBudW0sIGNoYXIgKipyZXNwKQoreworCUJ1ZmZlciBtOworCXVfaW50IGk7CisJaW50IHJldDsKKworCWRlYnVnMygiJXMiLCBfX2Z1bmNfXyk7CisJYnVmZmVyX2luaXQoJm0pOworCWJ1ZmZlcl9wdXRfaW50KCZtLCBudW0pOworCWZvciAoaSA9IDA7IGkgPCBudW07ICsraSkKKwkJYnVmZmVyX3B1dF9jc3RyaW5nKCZtLCByZXNwW2ldKTsKKwltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX1JFUV9QQU1fUkVTUE9ORCwgJm0pOworCWRlYnVnMygiJXM6IHdhaXRpbmcgZm9yIE1PTklUT1JfQU5TX1BBTV9SRVNQT05EIiwgX19mdW5jX18pOworCW1tX3JlcXVlc3RfcmVjZWl2ZV9leHBlY3QocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX0FOU19QQU1fUkVTUE9ORCwgJm0pOworCXJldCA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKKwlkZWJ1ZzMoIiVzOiBwYW1fcmVzcG9uZCByZXR1cm5lZCAlZCIsIF9fZnVuY19fLCByZXQpOworCWJ1ZmZlcl9mcmVlKCZtKTsKKwlyZXR1cm4gKHJldCk7Cit9CisKK3ZvaWQKK21tX3NzaHBhbV9mcmVlX2N0eCh2b2lkICpjdHh0cCkKK3sKKwlCdWZmZXIgbTsKKworCWRlYnVnMygiJXMiLCBfX2Z1bmNfXyk7CisJYnVmZmVyX2luaXQoJm0pOworCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfUkVRX1BBTV9GUkVFX0NUWCwgJm0pOworCWRlYnVnMygiJXM6IHdhaXRpbmcgZm9yIE1PTklUT1JfQU5TX1BBTV9GUkVFX0NUWCIsIF9fZnVuY19fKTsKKwltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9BTlNfUEFNX0ZSRUVfQ1RYLCAmbSk7CisJYnVmZmVyX2ZyZWUoJm0pOworfQorI2VuZGlmIC8qIFVTRV9QQU0gKi8KKworLyogUmVxdWVzdCBwcm9jZXNzIHRlcm1pbmF0aW9uICovCisKK3ZvaWQKK21tX3Rlcm1pbmF0ZSh2b2lkKQoreworCUJ1ZmZlciBtOworCisJYnVmZmVyX2luaXQoJm0pOworCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfUkVRX1RFUk0sICZtKTsKKwlidWZmZXJfZnJlZSgmbSk7Cit9CisKK2ludAorbW1fc3NoMV9zZXNzaW9uX2tleShCSUdOVU0gKm51bSkKK3sKKwlpbnQgcnNhZmFpbDsKKwlCdWZmZXIgbTsKKworCWJ1ZmZlcl9pbml0KCZtKTsKKwlidWZmZXJfcHV0X2JpZ251bTIoJm0sIG51bSk7CisJbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfU0VTU0tFWSwgJm0pOworCisJbW1fcmVxdWVzdF9yZWNlaXZlX2V4cGVjdChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfQU5TX1NFU1NLRVksICZtKTsKKworCXJzYWZhaWwgPSBidWZmZXJfZ2V0X2ludCgmbSk7CisJYnVmZmVyX2dldF9iaWdudW0yKCZtLCBudW0pOworCisJYnVmZmVyX2ZyZWUoJm0pOworCisJcmV0dXJuIChyc2FmYWlsKTsKK30KKworc3RhdGljIHZvaWQKK21tX2NoYWxsX3NldHVwKGNoYXIgKipuYW1lLCBjaGFyICoqaW5mb3R4dCwgdV9pbnQgKm51bXByb21wdHMsCisgICAgY2hhciAqKipwcm9tcHRzLCB1X2ludCAqKmVjaG9fb24pCit7CisJKm5hbWUgPSB4c3RyZHVwKCIiKTsKKwkqaW5mb3R4dCA9IHhzdHJkdXAoIiIpOworCSpudW1wcm9tcHRzID0gMTsKKwkqcHJvbXB0cyA9IHhjYWxsb2MoKm51bXByb21wdHMsIHNpemVvZihjaGFyICopKTsKKwkqZWNob19vbiA9IHhjYWxsb2MoKm51bXByb21wdHMsIHNpemVvZih1X2ludCkpOworCSgqZWNob19vbilbMF0gPSAwOworfQorCitpbnQKK21tX2JzZGF1dGhfcXVlcnkodm9pZCAqY3R4LCBjaGFyICoqbmFtZSwgY2hhciAqKmluZm90eHQsCisgICB1X2ludCAqbnVtcHJvbXB0cywgY2hhciAqKipwcm9tcHRzLCB1X2ludCAqKmVjaG9fb24pCit7CisJQnVmZmVyIG07CisJdV9pbnQgc3VjY2VzczsKKwljaGFyICpjaGFsbGVuZ2U7CisKKwlkZWJ1ZzMoIiVzOiBlbnRlcmluZyIsIF9fZnVuY19fKTsKKworCWJ1ZmZlcl9pbml0KCZtKTsKKwltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX1JFUV9CU0RBVVRIUVVFUlksICZtKTsKKworCW1tX3JlcXVlc3RfcmVjZWl2ZV9leHBlY3QocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX0FOU19CU0RBVVRIUVVFUlksCisJICAgICZtKTsKKwlzdWNjZXNzID0gYnVmZmVyX2dldF9pbnQoJm0pOworCWlmIChzdWNjZXNzID09IDApIHsKKwkJZGVidWczKCIlczogbm8gY2hhbGxlbmdlIiwgX19mdW5jX18pOworCQlidWZmZXJfZnJlZSgmbSk7CisJCXJldHVybiAoLTEpOworCX0KKworCS8qIEdldCB0aGUgY2hhbGxlbmdlLCBhbmQgZm9ybWF0IHRoZSByZXNwb25zZSAqLworCWNoYWxsZW5nZSAgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgTlVMTCk7CisJYnVmZmVyX2ZyZWUoJm0pOworCisJbW1fY2hhbGxfc2V0dXAobmFtZSwgaW5mb3R4dCwgbnVtcHJvbXB0cywgcHJvbXB0cywgZWNob19vbik7CisJKCpwcm9tcHRzKVswXSA9IGNoYWxsZW5nZTsKKworCWRlYnVnMygiJXM6IHJlY2VpdmVkIGNoYWxsZW5nZTogJXMiLCBfX2Z1bmNfXywgY2hhbGxlbmdlKTsKKworCXJldHVybiAoMCk7Cit9CisKK2ludAorbW1fYnNkYXV0aF9yZXNwb25kKHZvaWQgKmN0eCwgdV9pbnQgbnVtcmVzcG9uc2VzLCBjaGFyICoqcmVzcG9uc2VzKQoreworCUJ1ZmZlciBtOworCWludCBhdXRob2s7CisKKwlkZWJ1ZzMoIiVzOiBlbnRlcmluZyIsIF9fZnVuY19fKTsKKwlpZiAobnVtcmVzcG9uc2VzICE9IDEpCisJCXJldHVybiAoLTEpOworCisJYnVmZmVyX2luaXQoJm0pOworCWJ1ZmZlcl9wdXRfY3N0cmluZygmbSwgcmVzcG9uc2VzWzBdKTsKKwltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX1JFUV9CU0RBVVRIUkVTUE9ORCwgJm0pOworCisJbW1fcmVxdWVzdF9yZWNlaXZlX2V4cGVjdChwbW9uaXRvci0+bV9yZWN2ZmQsCisJICAgIE1PTklUT1JfQU5TX0JTREFVVEhSRVNQT05ELCAmbSk7CisKKwlhdXRob2sgPSBidWZmZXJfZ2V0X2ludCgmbSk7CisJYnVmZmVyX2ZyZWUoJm0pOworCisJcmV0dXJuICgoYXV0aG9rID09IDApID8gLTEgOiAwKTsKK30KKworI2lmZGVmIFNLRVkKK2ludAorbW1fc2tleV9xdWVyeSh2b2lkICpjdHgsIGNoYXIgKipuYW1lLCBjaGFyICoqaW5mb3R4dCwKKyAgIHVfaW50ICpudW1wcm9tcHRzLCBjaGFyICoqKnByb21wdHMsIHVfaW50ICoqZWNob19vbikKK3sKKwlCdWZmZXIgbTsKKwl1X2ludCBzdWNjZXNzOworCWNoYXIgKmNoYWxsZW5nZTsKKworCWRlYnVnMygiJXM6IGVudGVyaW5nIiwgX19mdW5jX18pOworCisJYnVmZmVyX2luaXQoJm0pOworCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfUkVRX1NLRVlRVUVSWSwgJm0pOworCisJbW1fcmVxdWVzdF9yZWNlaXZlX2V4cGVjdChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfQU5TX1NLRVlRVUVSWSwKKwkgICAgJm0pOworCXN1Y2Nlc3MgPSBidWZmZXJfZ2V0X2ludCgmbSk7CisJaWYgKHN1Y2Nlc3MgPT0gMCkgeworCQlkZWJ1ZzMoIiVzOiBubyBjaGFsbGVuZ2UiLCBfX2Z1bmNfXyk7CisJCWJ1ZmZlcl9mcmVlKCZtKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJLyogR2V0IHRoZSBjaGFsbGVuZ2UsIGFuZCBmb3JtYXQgdGhlIHJlc3BvbnNlICovCisJY2hhbGxlbmdlICA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKKwlidWZmZXJfZnJlZSgmbSk7CisKKwlkZWJ1ZzMoIiVzOiByZWNlaXZlZCBjaGFsbGVuZ2U6ICVzIiwgX19mdW5jX18sIGNoYWxsZW5nZSk7CisKKwltbV9jaGFsbF9zZXR1cChuYW1lLCBpbmZvdHh0LCBudW1wcm9tcHRzLCBwcm9tcHRzLCBlY2hvX29uKTsKKworCXhhc3ByaW50ZigqcHJvbXB0cywgIiVzJXMiLCBjaGFsbGVuZ2UsIFNLRVlfUFJPTVBUKTsKKwl4ZnJlZShjaGFsbGVuZ2UpOworCisJcmV0dXJuICgwKTsKK30KKworaW50CittbV9za2V5X3Jlc3BvbmQodm9pZCAqY3R4LCB1X2ludCBudW1yZXNwb25zZXMsIGNoYXIgKipyZXNwb25zZXMpCit7CisJQnVmZmVyIG07CisJaW50IGF1dGhvazsKKworCWRlYnVnMygiJXM6IGVudGVyaW5nIiwgX19mdW5jX18pOworCWlmIChudW1yZXNwb25zZXMgIT0gMSkKKwkJcmV0dXJuICgtMSk7CisKKwlidWZmZXJfaW5pdCgmbSk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZtLCByZXNwb25zZXNbMF0pOworCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfUkVRX1NLRVlSRVNQT05ELCAmbSk7CisKKwltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3JlY3ZmZCwKKwkgICAgTU9OSVRPUl9BTlNfU0tFWVJFU1BPTkQsICZtKTsKKworCWF1dGhvayA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKKwlidWZmZXJfZnJlZSgmbSk7CisKKwlyZXR1cm4gKChhdXRob2sgPT0gMCkgPyAtMSA6IDApOworfQorI2VuZGlmIC8qIFNLRVkgKi8KKwordm9pZAorbW1fc3NoMV9zZXNzaW9uX2lkKHVfY2hhciBzZXNzaW9uX2lkWzE2XSkKK3sKKwlCdWZmZXIgbTsKKwlpbnQgaTsKKworCWRlYnVnMygiJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7CisKKwlidWZmZXJfaW5pdCgmbSk7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCWJ1ZmZlcl9wdXRfY2hhcigmbSwgc2Vzc2lvbl9pZFtpXSk7CisKKwltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX1JFUV9TRVNTSUQsICZtKTsKKwlidWZmZXJfZnJlZSgmbSk7Cit9CisKK2ludAorbW1fYXV0aF9yc2Ffa2V5X2FsbG93ZWQoc3RydWN0IHBhc3N3ZCAqcHcsIEJJR05VTSAqY2xpZW50X24sIEtleSAqKnJrZXkpCit7CisJQnVmZmVyIG07CisJS2V5ICprZXk7CisJdV9jaGFyICpibG9iOworCXVfaW50IGJsZW47CisJaW50IGFsbG93ZWQgPSAwLCBoYXZlX2ZvcmNlZCA9IDA7CisKKwlkZWJ1ZzMoIiVzIGVudGVyaW5nIiwgX19mdW5jX18pOworCisJYnVmZmVyX2luaXQoJm0pOworCWJ1ZmZlcl9wdXRfYmlnbnVtMigmbSwgY2xpZW50X24pOworCisJbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfUlNBS0VZQUxMT1dFRCwgJm0pOworCW1tX3JlcXVlc3RfcmVjZWl2ZV9leHBlY3QocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX0FOU19SU0FLRVlBTExPV0VELCAmbSk7CisKKwlhbGxvd2VkID0gYnVmZmVyX2dldF9pbnQoJm0pOworCisJLyogZmFrZSBmb3JjZWQgY29tbWFuZCAqLworCWF1dGhfY2xlYXJfb3B0aW9ucygpOworCWhhdmVfZm9yY2VkID0gYnVmZmVyX2dldF9pbnQoJm0pOworCWZvcmNlZF9jb21tYW5kID0gaGF2ZV9mb3JjZWQgPyB4c3RyZHVwKCJ0cnVlIikgOiBOVUxMOworCisJaWYgKGFsbG93ZWQgJiYgcmtleSAhPSBOVUxMKSB7CisJCWJsb2IgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgJmJsZW4pOworCQlpZiAoKGtleSA9IGtleV9mcm9tX2Jsb2IoYmxvYiwgYmxlbikpID09IE5VTEwpCisJCQlmYXRhbCgiJXM6IGtleV9mcm9tX2Jsb2IgZmFpbGVkIiwgX19mdW5jX18pOworCQkqcmtleSA9IGtleTsKKwkJeGZyZWUoYmxvYik7CisJfQorCWJ1ZmZlcl9mcmVlKCZtKTsKKworCXJldHVybiAoYWxsb3dlZCk7Cit9CisKK0JJR05VTSAqCittbV9hdXRoX3JzYV9nZW5lcmF0ZV9jaGFsbGVuZ2UoS2V5ICprZXkpCit7CisJQnVmZmVyIG07CisJQklHTlVNICpjaGFsbGVuZ2U7CisJdV9jaGFyICpibG9iOworCXVfaW50IGJsZW47CisKKwlkZWJ1ZzMoIiVzIGVudGVyaW5nIiwgX19mdW5jX18pOworCisJaWYgKChjaGFsbGVuZ2UgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBCTl9uZXcgZmFpbGVkIiwgX19mdW5jX18pOworCisJa2V5LT50eXBlID0gS0VZX1JTQTsgICAgLyogWFhYIGNoZWF0IGZvciBrZXlfdG9fYmxvYiAqLworCWlmIChrZXlfdG9fYmxvYihrZXksICZibG9iLCAmYmxlbikgPT0gMCkKKwkJZmF0YWwoIiVzOiBrZXlfdG9fYmxvYiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJa2V5LT50eXBlID0gS0VZX1JTQTE7CisKKwlidWZmZXJfaW5pdCgmbSk7CisJYnVmZmVyX3B1dF9zdHJpbmcoJm0sIGJsb2IsIGJsZW4pOworCXhmcmVlKGJsb2IpOworCisJbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfUlNBQ0hBTExFTkdFLCAmbSk7CisJbW1fcmVxdWVzdF9yZWNlaXZlX2V4cGVjdChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfQU5TX1JTQUNIQUxMRU5HRSwgJm0pOworCisJYnVmZmVyX2dldF9iaWdudW0yKCZtLCBjaGFsbGVuZ2UpOworCWJ1ZmZlcl9mcmVlKCZtKTsKKworCXJldHVybiAoY2hhbGxlbmdlKTsKK30KKworaW50CittbV9hdXRoX3JzYV92ZXJpZnlfcmVzcG9uc2UoS2V5ICprZXksIEJJR05VTSAqcCwgdV9jaGFyIHJlc3BvbnNlWzE2XSkKK3sKKwlCdWZmZXIgbTsKKwl1X2NoYXIgKmJsb2I7CisJdV9pbnQgYmxlbjsKKwlpbnQgc3VjY2VzcyA9IDA7CisKKwlkZWJ1ZzMoIiVzIGVudGVyaW5nIiwgX19mdW5jX18pOworCisJa2V5LT50eXBlID0gS0VZX1JTQTsgICAgLyogWFhYIGNoZWF0IGZvciBrZXlfdG9fYmxvYiAqLworCWlmIChrZXlfdG9fYmxvYihrZXksICZibG9iLCAmYmxlbikgPT0gMCkKKwkJZmF0YWwoIiVzOiBrZXlfdG9fYmxvYiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJa2V5LT50eXBlID0gS0VZX1JTQTE7CisKKwlidWZmZXJfaW5pdCgmbSk7CisJYnVmZmVyX3B1dF9zdHJpbmcoJm0sIGJsb2IsIGJsZW4pOworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCByZXNwb25zZSwgMTYpOworCXhmcmVlKGJsb2IpOworCisJbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfUlNBUkVTUE9OU0UsICZtKTsKKwltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9BTlNfUlNBUkVTUE9OU0UsICZtKTsKKworCXN1Y2Nlc3MgPSBidWZmZXJfZ2V0X2ludCgmbSk7CisJYnVmZmVyX2ZyZWUoJm0pOworCisJcmV0dXJuIChzdWNjZXNzKTsKK30KKworI2lmZGVmIFNTSF9BVURJVF9FVkVOVFMKK3ZvaWQKK21tX2F1ZGl0X2V2ZW50KHNzaF9hdWRpdF9ldmVudF90IGV2ZW50KQoreworCUJ1ZmZlciBtOworCisJZGVidWczKCIlcyBlbnRlcmluZyIsIF9fZnVuY19fKTsKKworCWJ1ZmZlcl9pbml0KCZtKTsKKwlidWZmZXJfcHV0X2ludCgmbSwgZXZlbnQpOworCisJbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfQVVESVRfRVZFTlQsICZtKTsKKwlidWZmZXJfZnJlZSgmbSk7Cit9CisKK3ZvaWQKK21tX2F1ZGl0X3J1bl9jb21tYW5kKGNvbnN0IGNoYXIgKmNvbW1hbmQpCit7CisJQnVmZmVyIG07CisKKwlkZWJ1ZzMoIiVzIGVudGVyaW5nIGNvbW1hbmQgJXMiLCBfX2Z1bmNfXywgY29tbWFuZCk7CisKKwlidWZmZXJfaW5pdCgmbSk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZtLCBjb21tYW5kKTsKKworCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfUkVRX0FVRElUX0NPTU1BTkQsICZtKTsKKwlidWZmZXJfZnJlZSgmbSk7Cit9CisjZW5kaWYgLyogU1NIX0FVRElUX0VWRU5UUyAqLworCisjaWZkZWYgR1NTQVBJCitPTV91aW50MzIKK21tX3NzaF9nc3NhcGlfc2VydmVyX2N0eChHc3NjdHh0ICoqY3R4LCBnc3NfT0lEIGdvaWQpCit7CisJQnVmZmVyIG07CisJT01fdWludDMyIG1ham9yOworCisJLyogQ2xpZW50IGRvZXNuJ3QgZ2V0IHRvIHNlZSB0aGUgY29udGV4dCAqLworCSpjdHggPSBOVUxMOworCisJYnVmZmVyX2luaXQoJm0pOworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCBnb2lkLT5lbGVtZW50cywgZ29pZC0+bGVuZ3RoKTsKKworCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfUkVRX0dTU1NFVFVQLCAmbSk7CisJbW1fcmVxdWVzdF9yZWNlaXZlX2V4cGVjdChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfQU5TX0dTU1NFVFVQLCAmbSk7CisKKwltYWpvciA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKKworCWJ1ZmZlcl9mcmVlKCZtKTsKKwlyZXR1cm4gKG1ham9yKTsKK30KKworT01fdWludDMyCittbV9zc2hfZ3NzYXBpX2FjY2VwdF9jdHgoR3NzY3R4dCAqY3R4LCBnc3NfYnVmZmVyX2Rlc2MgKmluLAorICAgIGdzc19idWZmZXJfZGVzYyAqb3V0LCBPTV91aW50MzIgKmZsYWdzKQoreworCUJ1ZmZlciBtOworCU9NX3VpbnQzMiBtYWpvcjsKKwl1X2ludCBsZW47CisKKwlidWZmZXJfaW5pdCgmbSk7CisJYnVmZmVyX3B1dF9zdHJpbmcoJm0sIGluLT52YWx1ZSwgaW4tPmxlbmd0aCk7CisKKwltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX1JFUV9HU1NTVEVQLCAmbSk7CisJbW1fcmVxdWVzdF9yZWNlaXZlX2V4cGVjdChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfQU5TX0dTU1NURVAsICZtKTsKKworCW1ham9yID0gYnVmZmVyX2dldF9pbnQoJm0pOworCW91dC0+dmFsdWUgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgJmxlbik7CisJb3V0LT5sZW5ndGggPSBsZW47CisJaWYgKGZsYWdzKQorCQkqZmxhZ3MgPSBidWZmZXJfZ2V0X2ludCgmbSk7CisKKwlidWZmZXJfZnJlZSgmbSk7CisKKwlyZXR1cm4gKG1ham9yKTsKK30KKworT01fdWludDMyCittbV9zc2hfZ3NzYXBpX2NoZWNrbWljKEdzc2N0eHQgKmN0eCwgZ3NzX2J1ZmZlcl90IGdzc2J1ZiwgZ3NzX2J1ZmZlcl90IGdzc21pYykKK3sKKwlCdWZmZXIgbTsKKwlPTV91aW50MzIgbWFqb3I7CisKKwlidWZmZXJfaW5pdCgmbSk7CisJYnVmZmVyX3B1dF9zdHJpbmcoJm0sIGdzc2J1Zi0+dmFsdWUsIGdzc2J1Zi0+bGVuZ3RoKTsKKwlidWZmZXJfcHV0X3N0cmluZygmbSwgZ3NzbWljLT52YWx1ZSwgZ3NzbWljLT5sZW5ndGgpOworCisJbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfR1NTQ0hFQ0tNSUMsICZtKTsKKwltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9BTlNfR1NTQ0hFQ0tNSUMsCisJICAgICZtKTsKKworCW1ham9yID0gYnVmZmVyX2dldF9pbnQoJm0pOworCWJ1ZmZlcl9mcmVlKCZtKTsKKwlyZXR1cm4obWFqb3IpOworfQorCitpbnQKK21tX3NzaF9nc3NhcGlfdXNlcm9rKGNoYXIgKnVzZXIpCit7CisJQnVmZmVyIG07CisJaW50IGF1dGhlbnRpY2F0ZWQgPSAwOworCisJYnVmZmVyX2luaXQoJm0pOworCisJbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfR1NTVVNFUk9LLCAmbSk7CisJbW1fcmVxdWVzdF9yZWNlaXZlX2V4cGVjdChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfQU5TX0dTU1VTRVJPSywKKwkJCQkgICZtKTsKKworCWF1dGhlbnRpY2F0ZWQgPSBidWZmZXJfZ2V0X2ludCgmbSk7CisKKwlidWZmZXJfZnJlZSgmbSk7CisJZGVidWczKCIlczogdXNlciAlc2F1dGhlbnRpY2F0ZWQiLF9fZnVuY19fLCBhdXRoZW50aWNhdGVkID8gIiIgOiAibm90ICIpOworCXJldHVybiAoYXV0aGVudGljYXRlZCk7Cit9CisjZW5kaWYgLyogR1NTQVBJICovCisKKyNpZmRlZiBKUEFLRQordm9pZAorbW1fYXV0aDJfanBha2VfZ2V0X3B3ZGF0YShBdXRoY3R4dCAqYXV0aGN0eHQsIEJJR05VTSAqKnMsCisgICAgY2hhciAqKmhhc2hfc2NoZW1lLCBjaGFyICoqc2FsdCkKK3sKKwlCdWZmZXIgbTsKKworCWRlYnVnMygiJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7CisKKwlidWZmZXJfaW5pdCgmbSk7CisJbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwKKwkgICAgTU9OSVRPUl9SRVFfSlBBS0VfR0VUX1BXREFUQSwgJm0pOworCisJZGVidWczKCIlczogd2FpdGluZyBmb3IgTU9OSVRPUl9BTlNfSlBBS0VfR0VUX1BXREFUQSIsIF9fZnVuY19fKTsKKwltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3JlY3ZmZCwKKwkgICAgTU9OSVRPUl9BTlNfSlBBS0VfR0VUX1BXREFUQSwgJm0pOworCisJKmhhc2hfc2NoZW1lID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIE5VTEwpOworCSpzYWx0ID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIE5VTEwpOworCisJYnVmZmVyX2ZyZWUoJm0pOworfQorCit2b2lkCittbV9qcGFrZV9zdGVwMShzdHJ1Y3QgbW9kcF9ncm91cCAqZ3JwLAorICAgIHVfY2hhciAqKmlkLCB1X2ludCAqaWRfbGVuLAorICAgIEJJR05VTSAqKnByaXYxLCBCSUdOVU0gKipwcml2MiwgQklHTlVNICoqZ19wcml2MSwgQklHTlVNICoqZ19wcml2MiwKKyAgICB1X2NoYXIgKipwcml2MV9wcm9vZiwgdV9pbnQgKnByaXYxX3Byb29mX2xlbiwKKyAgICB1X2NoYXIgKipwcml2Ml9wcm9vZiwgdV9pbnQgKnByaXYyX3Byb29mX2xlbikKK3sKKwlCdWZmZXIgbTsKKworCWRlYnVnMygiJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7CisKKwlidWZmZXJfaW5pdCgmbSk7CisJbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwKKwkgICAgTU9OSVRPUl9SRVFfSlBBS0VfU1RFUDEsICZtKTsKKworCWRlYnVnMygiJXM6IHdhaXRpbmcgZm9yIE1PTklUT1JfQU5TX0pQQUtFX1NURVAxIiwgX19mdW5jX18pOworCW1tX3JlcXVlc3RfcmVjZWl2ZV9leHBlY3QocG1vbml0b3ItPm1fcmVjdmZkLAorCSAgICBNT05JVE9SX0FOU19KUEFLRV9TVEVQMSwgJm0pOworCisJaWYgKCgqcHJpdjEgPSBCTl9uZXcoKSkgPT0gTlVMTCB8fAorCSAgICAoKnByaXYyID0gQk5fbmV3KCkpID09IE5VTEwgfHwKKwkgICAgKCpnX3ByaXYxID0gQk5fbmV3KCkpID09IE5VTEwgfHwKKwkgICAgKCpnX3ByaXYyID0gQk5fbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCIlczogQk5fbmV3IiwgX19mdW5jX18pOworCisJKmlkID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIGlkX2xlbik7CisJLyogcHJpdjEgYW5kIHByaXYyIGFyZSwgd2VsbCwgcHJpdmF0ZSAqLworCWJ1ZmZlcl9nZXRfYmlnbnVtMigmbSwgKmdfcHJpdjEpOworCWJ1ZmZlcl9nZXRfYmlnbnVtMigmbSwgKmdfcHJpdjIpOworCSpwcml2MV9wcm9vZiA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBwcml2MV9wcm9vZl9sZW4pOworCSpwcml2Ml9wcm9vZiA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBwcml2Ml9wcm9vZl9sZW4pOworCisJYnVmZmVyX2ZyZWUoJm0pOworfQorCit2b2lkCittbV9qcGFrZV9zdGVwMihzdHJ1Y3QgbW9kcF9ncm91cCAqZ3JwLCBCSUdOVU0gKnMsCisgICAgQklHTlVNICpteXB1YjEsIEJJR05VTSAqdGhlaXJwdWIxLCBCSUdOVU0gKnRoZWlycHViMiwgQklHTlVNICpteXByaXYyLAorICAgIGNvbnN0IHVfY2hhciAqdGhlaXJpZCwgdV9pbnQgdGhlaXJpZF9sZW4sCisgICAgY29uc3QgdV9jaGFyICpteWlkLCB1X2ludCBteWlkX2xlbiwKKyAgICBjb25zdCB1X2NoYXIgKnRoZWlycHViMV9wcm9vZiwgdV9pbnQgdGhlaXJwdWIxX3Byb29mX2xlbiwKKyAgICBjb25zdCB1X2NoYXIgKnRoZWlycHViMl9wcm9vZiwgdV9pbnQgdGhlaXJwdWIyX3Byb29mX2xlbiwKKyAgICBCSUdOVU0gKipuZXdwdWIsCisgICAgdV9jaGFyICoqbmV3cHViX2V4cG9uZW50X3Byb29mLCB1X2ludCAqbmV3cHViX2V4cG9uZW50X3Byb29mX2xlbikKK3sKKwlCdWZmZXIgbTsKKworCWRlYnVnMygiJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7CisKKwlidWZmZXJfaW5pdCgmbSk7CisJLyogbW9uaXRvciBhbHJlYWR5IGhhcyBhbGwgYmlnbnVtcyBleGNlcHQgdGhlaXJwdWIxLCB0aGVpcnB1YjIgKi8KKwlidWZmZXJfcHV0X2JpZ251bTIoJm0sIHRoZWlycHViMSk7CisJYnVmZmVyX3B1dF9iaWdudW0yKCZtLCB0aGVpcnB1YjIpOworCS8qIG1vbml0b3IgYWxyZWFkeSBrbm93cyBvdXIgaWQgKi8KKwlidWZmZXJfcHV0X3N0cmluZygmbSwgdGhlaXJpZCwgdGhlaXJpZF9sZW4pOworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCB0aGVpcnB1YjFfcHJvb2YsIHRoZWlycHViMV9wcm9vZl9sZW4pOworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCB0aGVpcnB1YjJfcHJvb2YsIHRoZWlycHViMl9wcm9vZl9sZW4pOworCisJbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwKKwkgICAgTU9OSVRPUl9SRVFfSlBBS0VfU1RFUDIsICZtKTsKKworCWRlYnVnMygiJXM6IHdhaXRpbmcgZm9yIE1PTklUT1JfQU5TX0pQQUtFX1NURVAyIiwgX19mdW5jX18pOworCW1tX3JlcXVlc3RfcmVjZWl2ZV9leHBlY3QocG1vbml0b3ItPm1fcmVjdmZkLAorCSAgICBNT05JVE9SX0FOU19KUEFLRV9TVEVQMiwgJm0pOworCisJaWYgKCgqbmV3cHViID0gQk5fbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCIlczogQk5fbmV3IiwgX19mdW5jX18pOworCisJYnVmZmVyX2dldF9iaWdudW0yKCZtLCAqbmV3cHViKTsKKwkqbmV3cHViX2V4cG9uZW50X3Byb29mID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sCisJICAgIG5ld3B1Yl9leHBvbmVudF9wcm9vZl9sZW4pOworCisJYnVmZmVyX2ZyZWUoJm0pOworfQorCit2b2lkCittbV9qcGFrZV9rZXlfY29uZmlybShzdHJ1Y3QgbW9kcF9ncm91cCAqZ3JwLCBCSUdOVU0gKnMsIEJJR05VTSAqc3RlcDJfdmFsLAorICAgIEJJR05VTSAqbXlwcml2MiwgQklHTlVNICpteXB1YjEsIEJJR05VTSAqbXlwdWIyLAorICAgIEJJR05VTSAqdGhlaXJwdWIxLCBCSUdOVU0gKnRoZWlycHViMiwKKyAgICBjb25zdCB1X2NoYXIgKm15X2lkLCB1X2ludCBteV9pZF9sZW4sCisgICAgY29uc3QgdV9jaGFyICp0aGVpcl9pZCwgdV9pbnQgdGhlaXJfaWRfbGVuLAorICAgIGNvbnN0IHVfY2hhciAqc2Vzc19pZCwgdV9pbnQgc2Vzc19pZF9sZW4sCisgICAgY29uc3QgdV9jaGFyICp0aGVpcnByaXYyX3NfcHJvb2YsIHVfaW50IHRoZWlycHJpdjJfc19wcm9vZl9sZW4sCisgICAgQklHTlVNICoqaywKKyAgICB1X2NoYXIgKipjb25maXJtX2hhc2gsIHVfaW50ICpjb25maXJtX2hhc2hfbGVuKQoreworCUJ1ZmZlciBtOworCisJZGVidWczKCIlcyBlbnRlcmluZyIsIF9fZnVuY19fKTsKKworCWJ1ZmZlcl9pbml0KCZtKTsKKwkvKiBtb25pdG9yIGFscmVhZHkgaGFzIGFsbCBiaWdudW1zIGV4Y2VwdCBzdGVwMl92YWwgKi8KKwlidWZmZXJfcHV0X2JpZ251bTIoJm0sIHN0ZXAyX3ZhbCk7CisJLyogbW9uaXRvciBhbHJlYWR5IGtub3dzIGFsbCB0aGUgaWRzICovCisJYnVmZmVyX3B1dF9zdHJpbmcoJm0sIHRoZWlycHJpdjJfc19wcm9vZiwgdGhlaXJwcml2Ml9zX3Byb29mX2xlbik7CisKKwltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLAorCSAgICBNT05JVE9SX1JFUV9KUEFLRV9LRVlfQ09ORklSTSwgJm0pOworCisJZGVidWczKCIlczogd2FpdGluZyBmb3IgTU9OSVRPUl9BTlNfSlBBS0VfS0VZX0NPTkZJUk0iLCBfX2Z1bmNfXyk7CisJbW1fcmVxdWVzdF9yZWNlaXZlX2V4cGVjdChwbW9uaXRvci0+bV9yZWN2ZmQsCisJICAgIE1PTklUT1JfQU5TX0pQQUtFX0tFWV9DT05GSVJNLCAmbSk7CisKKwkvKiAnaycgaXMgc2Vuc2l0aXZlIGFuZCBzdGF5cyBpbiB0aGUgbW9uaXRvciAqLworCSpjb25maXJtX2hhc2ggPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgY29uZmlybV9oYXNoX2xlbik7CisKKwlidWZmZXJfZnJlZSgmbSk7Cit9CisKK2ludAorbW1fanBha2VfY2hlY2tfY29uZmlybShjb25zdCBCSUdOVU0gKmssCisgICAgY29uc3QgdV9jaGFyICpwZWVyX2lkLCB1X2ludCBwZWVyX2lkX2xlbiwKKyAgICBjb25zdCB1X2NoYXIgKnNlc3NfaWQsIHVfaW50IHNlc3NfaWRfbGVuLAorICAgIGNvbnN0IHVfY2hhciAqcGVlcl9jb25maXJtX2hhc2gsIHVfaW50IHBlZXJfY29uZmlybV9oYXNoX2xlbikKK3sKKwlCdWZmZXIgbTsKKwlpbnQgc3VjY2VzcyA9IDA7CisKKwlkZWJ1ZzMoIiVzIGVudGVyaW5nIiwgX19mdW5jX18pOworCisJYnVmZmVyX2luaXQoJm0pOworCS8qIGsgaXMgZHVtbXkgaW4gc2xhdmUsIGlnbm9yZWQgKi8KKwkvKiBtb25pdG9yIGtub3dzIGFsbCB0aGUgaWRzICovCisJYnVmZmVyX3B1dF9zdHJpbmcoJm0sIHBlZXJfY29uZmlybV9oYXNoLCBwZWVyX2NvbmZpcm1faGFzaF9sZW4pOworCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsCisJICAgIE1PTklUT1JfUkVRX0pQQUtFX0NIRUNLX0NPTkZJUk0sICZtKTsKKworCWRlYnVnMygiJXM6IHdhaXRpbmcgZm9yIE1PTklUT1JfQU5TX0pQQUtFX0NIRUNLX0NPTkZJUk0iLCBfX2Z1bmNfXyk7CisJbW1fcmVxdWVzdF9yZWNlaXZlX2V4cGVjdChwbW9uaXRvci0+bV9yZWN2ZmQsCisJICAgIE1PTklUT1JfQU5TX0pQQUtFX0NIRUNLX0NPTkZJUk0sICZtKTsKKworCXN1Y2Nlc3MgPSBidWZmZXJfZ2V0X2ludCgmbSk7CisJYnVmZmVyX2ZyZWUoJm0pOworCisJZGVidWczKCIlczogc3VjY2VzcyA9ICVkIiwgX19mdW5jX18sIHN1Y2Nlc3MpOworCXJldHVybiBzdWNjZXNzOworfQorI2VuZGlmIC8qIEpQQUtFICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL21vbml0b3Jfd3JhcC5oIGIvb3BlbnNzaC02LjBwMS9tb25pdG9yX3dyYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzdmMmUzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9tb25pdG9yX3dyYXAuaApAQCAtMCwwICsxLDEzMSBAQAorLyogJE9wZW5CU0Q6IG1vbml0b3Jfd3JhcC5oLHYgMS4yMyAyMDExLzA2LzE3IDIxOjQ0OjMxIGRqbSBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IDIwMDIgTmllbHMgUHJvdm9zIDxwcm92b3NAY2l0aS51bWljaC5lZHU+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9NTV9XUkFQX0hfCisjZGVmaW5lIF9NTV9XUkFQX0hfCisKK2V4dGVybiBpbnQgdXNlX3ByaXZzZXA7CisjZGVmaW5lIFBSSVZTRVAoeCkJKHVzZV9wcml2c2VwID8gbW1fIyN4IDogeCkKKworZW51bSBtbV9rZXl0eXBlIHtNTV9OT0tFWSwgTU1fSE9TVEtFWSwgTU1fVVNFUktFWSwgTU1fUlNBSE9TVEtFWSwgTU1fUlNBVVNFUktFWX07CisKK3N0cnVjdCBtb25pdG9yOworc3RydWN0IG1tX21hc3RlcjsKK3N0cnVjdCBBdXRoY3R4dDsKKwordm9pZCBtbV9sb2dfaGFuZGxlcihMb2dMZXZlbCwgY29uc3QgY2hhciAqLCB2b2lkICopOworaW50IG1tX2lzX21vbml0b3Iodm9pZCk7CitESCAqbW1fY2hvb3NlX2RoKGludCwgaW50LCBpbnQpOworaW50IG1tX2tleV9zaWduKEtleSAqLCB1X2NoYXIgKiosIHVfaW50ICosIHVfY2hhciAqLCB1X2ludCk7Cit2b2lkIG1tX2luZm9ybV9hdXRoc2VydihjaGFyICosIGNoYXIgKik7CitzdHJ1Y3QgcGFzc3dkICptbV9nZXRwd25hbWFsbG93KGNvbnN0IGNoYXIgKik7CitjaGFyICptbV9hdXRoMl9yZWFkX2Jhbm5lcih2b2lkKTsKK2ludCBtbV9hdXRoX3Bhc3N3b3JkKHN0cnVjdCBBdXRoY3R4dCAqLCBjaGFyICopOworaW50IG1tX2tleV9hbGxvd2VkKGVudW0gbW1fa2V5dHlwZSwgY2hhciAqLCBjaGFyICosIEtleSAqKTsKK2ludCBtbV91c2VyX2tleV9hbGxvd2VkKHN0cnVjdCBwYXNzd2QgKiwgS2V5ICopOworaW50IG1tX2hvc3RiYXNlZF9rZXlfYWxsb3dlZChzdHJ1Y3QgcGFzc3dkICosIGNoYXIgKiwgY2hhciAqLCBLZXkgKik7CitpbnQgbW1fYXV0aF9yaG9zdHNfcnNhX2tleV9hbGxvd2VkKHN0cnVjdCBwYXNzd2QgKiwgY2hhciAqLCBjaGFyICosIEtleSAqKTsKK2ludCBtbV9rZXlfdmVyaWZ5KEtleSAqLCB1X2NoYXIgKiwgdV9pbnQsIHVfY2hhciAqLCB1X2ludCk7CitpbnQgbW1fYXV0aF9yc2Ffa2V5X2FsbG93ZWQoc3RydWN0IHBhc3N3ZCAqLCBCSUdOVU0gKiwgS2V5ICoqKTsKK2ludCBtbV9hdXRoX3JzYV92ZXJpZnlfcmVzcG9uc2UoS2V5ICosIEJJR05VTSAqLCB1X2NoYXIgKik7CitCSUdOVU0gKm1tX2F1dGhfcnNhX2dlbmVyYXRlX2NoYWxsZW5nZShLZXkgKik7CisKKyNpZmRlZiBHU1NBUEkKK09NX3VpbnQzMiBtbV9zc2hfZ3NzYXBpX3NlcnZlcl9jdHgoR3NzY3R4dCAqKiwgZ3NzX09JRCk7CitPTV91aW50MzIgbW1fc3NoX2dzc2FwaV9hY2NlcHRfY3R4KEdzc2N0eHQgKiwKKyAgIGdzc19idWZmZXJfZGVzYyAqLCBnc3NfYnVmZmVyX2Rlc2MgKiwgT01fdWludDMyICopOworaW50IG1tX3NzaF9nc3NhcGlfdXNlcm9rKGNoYXIgKnVzZXIpOworT01fdWludDMyIG1tX3NzaF9nc3NhcGlfY2hlY2ttaWMoR3NzY3R4dCAqLCBnc3NfYnVmZmVyX3QsIGdzc19idWZmZXJfdCk7CisjZW5kaWYKKworI2lmZGVmIFVTRV9QQU0KK3ZvaWQgbW1fc3RhcnRfcGFtKHN0cnVjdCBBdXRoY3R4dCAqKTsKK3VfaW50IG1tX2RvX3BhbV9hY2NvdW50KHZvaWQpOwordm9pZCAqbW1fc3NocGFtX2luaXRfY3R4KHN0cnVjdCBBdXRoY3R4dCAqKTsKK2ludCBtbV9zc2hwYW1fcXVlcnkodm9pZCAqLCBjaGFyICoqLCBjaGFyICoqLCB1X2ludCAqLCBjaGFyICoqKiwgdV9pbnQgKiopOworaW50IG1tX3NzaHBhbV9yZXNwb25kKHZvaWQgKiwgdV9pbnQsIGNoYXIgKiopOwordm9pZCBtbV9zc2hwYW1fZnJlZV9jdHgodm9pZCAqKTsKKyNlbmRpZgorCisjaWZkZWYgU1NIX0FVRElUX0VWRU5UUworI2luY2x1ZGUgImF1ZGl0LmgiCit2b2lkIG1tX2F1ZGl0X2V2ZW50KHNzaF9hdWRpdF9ldmVudF90KTsKK3ZvaWQgbW1fYXVkaXRfcnVuX2NvbW1hbmQoY29uc3QgY2hhciAqKTsKKyNlbmRpZgorCitzdHJ1Y3QgU2Vzc2lvbjsKK3ZvaWQgbW1fdGVybWluYXRlKHZvaWQpOworaW50IG1tX3B0eV9hbGxvY2F0ZShpbnQgKiwgaW50ICosIGNoYXIgKiwgc2l6ZV90KTsKK3ZvaWQgbW1fc2Vzc2lvbl9wdHlfY2xlYW51cDIoc3RydWN0IFNlc3Npb24gKik7CisKKy8qIFNTSHYxIGludGVyZmFjZXMgKi8KK3ZvaWQgbW1fc3NoMV9zZXNzaW9uX2lkKHVfY2hhciAqKTsKK2ludCBtbV9zc2gxX3Nlc3Npb25fa2V5KEJJR05VTSAqKTsKKworLyogS2V5IGV4cG9ydCBmdW5jdGlvbnMgKi8KK3N0cnVjdCBOZXdrZXlzICptbV9uZXdrZXlzX2Zyb21fYmxvYih1X2NoYXIgKiwgaW50KTsKK2ludCBtbV9uZXdrZXlzX3RvX2Jsb2IoaW50LCB1X2NoYXIgKiosIHVfaW50ICopOworCit2b2lkIG1vbml0b3JfYXBwbHlfa2V5c3RhdGUoc3RydWN0IG1vbml0b3IgKik7Cit2b2lkIG1tX2dldF9rZXlzdGF0ZShzdHJ1Y3QgbW9uaXRvciAqKTsKK3ZvaWQgbW1fc2VuZF9rZXlzdGF0ZShzdHJ1Y3QgbW9uaXRvciopOworCisvKiBic2RhdXRoICovCitpbnQgbW1fYnNkYXV0aF9xdWVyeSh2b2lkICosIGNoYXIgKiosIGNoYXIgKiosIHVfaW50ICosIGNoYXIgKioqLCB1X2ludCAqKik7CitpbnQgbW1fYnNkYXV0aF9yZXNwb25kKHZvaWQgKiwgdV9pbnQsIGNoYXIgKiopOworCisvKiBza2V5ICovCitpbnQgbW1fc2tleV9xdWVyeSh2b2lkICosIGNoYXIgKiosIGNoYXIgKiosIHVfaW50ICosIGNoYXIgKioqLCB1X2ludCAqKik7CitpbnQgbW1fc2tleV9yZXNwb25kKHZvaWQgKiwgdV9pbnQsIGNoYXIgKiopOworCisvKiBqcGFrZSAqLworc3RydWN0IG1vZHBfZ3JvdXA7Cit2b2lkIG1tX2F1dGgyX2pwYWtlX2dldF9wd2RhdGEoc3RydWN0IEF1dGhjdHh0ICosIEJJR05VTSAqKiwgY2hhciAqKiwgY2hhciAqKik7Cit2b2lkIG1tX2pwYWtlX3N0ZXAxKHN0cnVjdCBtb2RwX2dyb3VwICosIHVfY2hhciAqKiwgdV9pbnQgKiwKKyAgICBCSUdOVU0gKiosIEJJR05VTSAqKiwgQklHTlVNICoqLCBCSUdOVU0gKiosCisgICAgdV9jaGFyICoqLCB1X2ludCAqLCB1X2NoYXIgKiosIHVfaW50ICopOwordm9pZCBtbV9qcGFrZV9zdGVwMihzdHJ1Y3QgbW9kcF9ncm91cCAqLCBCSUdOVU0gKiwKKyAgICBCSUdOVU0gKiwgQklHTlVNICosIEJJR05VTSAqLCBCSUdOVU0gKiwKKyAgICBjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGNvbnN0IHVfY2hhciAqLCB1X2ludCwKKyAgICBjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGNvbnN0IHVfY2hhciAqLCB1X2ludCwKKyAgICBCSUdOVU0gKiosIHVfY2hhciAqKiwgdV9pbnQgKik7Cit2b2lkIG1tX2pwYWtlX2tleV9jb25maXJtKHN0cnVjdCBtb2RwX2dyb3VwICosIEJJR05VTSAqLCBCSUdOVU0gKiwKKyAgICBCSUdOVU0gKiwgQklHTlVNICosIEJJR05VTSAqLCBCSUdOVU0gKiwgQklHTlVNICosCisgICAgY29uc3QgdV9jaGFyICosIHVfaW50LCBjb25zdCB1X2NoYXIgKiwgdV9pbnQsCisgICAgY29uc3QgdV9jaGFyICosIHVfaW50LCBjb25zdCB1X2NoYXIgKiwgdV9pbnQsCisgICAgQklHTlVNICoqLCB1X2NoYXIgKiosIHVfaW50ICopOworaW50IG1tX2pwYWtlX2NoZWNrX2NvbmZpcm0oY29uc3QgQklHTlVNICosCisgICAgY29uc3QgdV9jaGFyICosIHVfaW50LCBjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CisKKworLyogemxpYiBhbGxvY2F0aW9uIGhvb2tzICovCisKK3ZvaWQgKm1tX3phbGxvYyhzdHJ1Y3QgbW1fbWFzdGVyICosIHVfaW50LCB1X2ludCk7Cit2b2lkIG1tX3pmcmVlKHN0cnVjdCBtbV9tYXN0ZXIgKiwgdm9pZCAqKTsKK3ZvaWQgbW1faW5pdF9jb21wcmVzc2lvbihzdHJ1Y3QgbW1fbWFzdGVyICopOworCisjZW5kaWYgLyogX01NX1dSQVBfSF8gKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvbXNnLmMgYi9vcGVuc3NoLTYuMHAxL21zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNWY5OGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL21zZy5jCkBAIC0wLDAgKzEsODkgQEAKKy8qICRPcGVuQlNEOiBtc2cuYyx2IDEuMTUgMjAwNi8wOC8wMyAwMzozNDo0MiBkZXJhYWR0IEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgImF0b21pY2lvLmgiCisjaW5jbHVkZSAibXNnLmgiCisjaW5jbHVkZSAibWlzYy5oIgorCitpbnQKK3NzaF9tc2dfc2VuZChpbnQgZmQsIHVfY2hhciB0eXBlLCBCdWZmZXIgKm0pCit7CisJdV9jaGFyIGJ1Zls1XTsKKwl1X2ludCBtbGVuID0gYnVmZmVyX2xlbihtKTsKKworCWRlYnVnMygic3NoX21zZ19zZW5kOiB0eXBlICV1IiwgKHVuc2lnbmVkIGludCl0eXBlICYgMHhmZik7CisKKwlwdXRfdTMyKGJ1ZiwgbWxlbiArIDEpOworCWJ1Zls0XSA9IHR5cGU7CQkvKiAxc3QgYnl0ZSBvZiBwYXlsb2FkIGlzIG1lc2ctdHlwZSAqLworCWlmIChhdG9taWNpbyh2d3JpdGUsIGZkLCBidWYsIHNpemVvZihidWYpKSAhPSBzaXplb2YoYnVmKSkgeworCQllcnJvcigic3NoX21zZ19zZW5kOiB3cml0ZSIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJaWYgKGF0b21pY2lvKHZ3cml0ZSwgZmQsIGJ1ZmZlcl9wdHIobSksIG1sZW4pICE9IG1sZW4pIHsKKwkJZXJyb3IoInNzaF9tc2dfc2VuZDogd3JpdGUiKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCXJldHVybiAoMCk7Cit9CisKK2ludAorc3NoX21zZ19yZWN2KGludCBmZCwgQnVmZmVyICptKQoreworCXVfY2hhciBidWZbNF07CisJdV9pbnQgbXNnX2xlbjsKKworCWRlYnVnMygic3NoX21zZ19yZWN2IGVudGVyaW5nIik7CisKKwlpZiAoYXRvbWljaW8ocmVhZCwgZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpICE9IHNpemVvZihidWYpKSB7CisJCWlmIChlcnJubyAhPSBFUElQRSkKKwkJCWVycm9yKCJzc2hfbXNnX3JlY3Y6IHJlYWQ6IGhlYWRlciIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJbXNnX2xlbiA9IGdldF91MzIoYnVmKTsKKwlpZiAobXNnX2xlbiA+IDI1NiAqIDEwMjQpIHsKKwkJZXJyb3IoInNzaF9tc2dfcmVjdjogcmVhZDogYmFkIG1zZ19sZW4gJXUiLCBtc2dfbGVuKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCWJ1ZmZlcl9jbGVhcihtKTsKKwlidWZmZXJfYXBwZW5kX3NwYWNlKG0sIG1zZ19sZW4pOworCWlmIChhdG9taWNpbyhyZWFkLCBmZCwgYnVmZmVyX3B0cihtKSwgbXNnX2xlbikgIT0gbXNnX2xlbikgeworCQllcnJvcigic3NoX21zZ19yZWN2OiByZWFkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoLTEpOworCX0KKwlyZXR1cm4gKDApOworfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9tc2cuaCBiL29wZW5zc2gtNi4wcDEvbXNnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBjYjliNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvbXNnLmgKQEAgLTAsMCArMSwzMSBAQAorLyogJE9wZW5CU0Q6IG1zZy5oLHYgMS40IDIwMDYvMDMvMjUgMjI6MjI6NDMgZGptIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBTU0hfTVNHX0gKKyNkZWZpbmUgU1NIX01TR19ICisKK2ludAkgc3NoX21zZ19zZW5kKGludCwgdV9jaGFyLCBCdWZmZXIgKik7CitpbnQJIHNzaF9tc2dfcmVjdihpbnQsIEJ1ZmZlciAqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL211eC5jIGIvb3BlbnNzaC02LjBwMS9tdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTA2MDVlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9tdXguYwpAQCAtMCwwICsxLDIxMDYgQEAKKy8qICRPcGVuQlNEOiBtdXguYyx2IDEuMzQgMjAxMi8wMS8wNyAyMToxMTozNiBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwOCBEYW1pZW4gTWlsbGVyIDxkam1Ab3BlbmJzZC5vcmc+CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyogc3NoIHNlc3Npb24gbXVsdGlwbGV4aW5nIHN1cHBvcnQgKi8KKworLyoKKyAqIFRPRE86CisgKiAgIC0gQmV0dGVyIHNpZ25hbGxpbmcgZnJvbSBtYXN0ZXIgdG8gc2xhdmUsIGVzcGVjaWFsbHkgcGFzc2luZyBvZgorICogICAgICBlcnJvciBtZXNzYWdlcworICogICAtIEJldHRlciBmYWxsLWJhY2sgZnJvbSBtdXggc2xhdmUgZXJyb3IgdG8gbmV3IGNvbm5lY3Rpb24uCisgKiAgIC0gRXhpdE9uRm9yd2FyZGluZ0ZhaWx1cmUKKyAqICAgLSBNYXliZSBleHRlbnNpb24gbWVjaGFuaXNtcyBmb3IgbXVsdGktWDExL211bHRpLWFnZW50IGZvcndhcmRpbmcKKyAqICAgLSBTdXBwb3J0IH5eWiBpbiBtdXggc2xhdmVzLgorICogICAtIEluc3BlY3Qgb3IgY29udHJvbCBzZXNzaW9ucyBpbiBtYXN0ZXIuCisgKiAgIC0gSWYgd2UgZXZlciBzdXBwb3J0IHRoZSAic2lnbmFsIiBjaGFubmVsIHJlcXVlc3QsIHNlbmQgc2lnbmFscyBvbgorICogICAgIHNlc3Npb25zIGluIG1hc3Rlci4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaWZkZWYgSEFWRV9QQVRIU19ICisjaW5jbHVkZSA8cGF0aHMuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9QT0xMX0gKKyNpbmNsdWRlIDxwb2xsLmg+CisjZWxzZQorIyBpZmRlZiBIQVZFX1NZU19QT0xMX0gKKyMgIGluY2x1ZGUgPHN5cy9wb2xsLmg+CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfVVRJTF9ICisjIGluY2x1ZGUgPHV0aWwuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9MSUJVVElMX0gKKyMgaW5jbHVkZSA8bGlidXRpbC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9zeXMtcXVldWUuaCIKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAic3NoLmgiCisjaW5jbHVkZSAic3NoMi5oIgorI2luY2x1ZGUgInBhdGhuYW1lcy5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJtYXRjaC5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImNoYW5uZWxzLmgiCisjaW5jbHVkZSAibXNnLmgiCisjaW5jbHVkZSAicGFja2V0LmgiCisjaW5jbHVkZSAibW9uaXRvcl9mZHBhc3MuaCIKKyNpbmNsdWRlICJzc2hwdHkuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJyZWFkY29uZi5oIgorI2luY2x1ZGUgImNsaWVudGxvb3AuaCIKKworLyogZnJvbSBzc2guYyAqLworZXh0ZXJuIGludCB0dHlfZmxhZzsKK2V4dGVybiBPcHRpb25zIG9wdGlvbnM7CitleHRlcm4gaW50IHN0ZGluX251bGxfZmxhZzsKK2V4dGVybiBjaGFyICpob3N0OworZXh0ZXJuIGludCBzdWJzeXN0ZW1fZmxhZzsKK2V4dGVybiBCdWZmZXIgY29tbWFuZDsKK2V4dGVybiB2b2xhdGlsZSBzaWdfYXRvbWljX3QgcXVpdF9wZW5kaW5nOworZXh0ZXJuIGNoYXIgKnN0ZGlvX2ZvcndhcmRfaG9zdDsKK2V4dGVybiBpbnQgc3RkaW9fZm9yd2FyZF9wb3J0OworCisvKiBDb250ZXh0IGZvciBzZXNzaW9uIG9wZW4gY29uZmlybWF0aW9uIGNhbGxiYWNrICovCitzdHJ1Y3QgbXV4X3Nlc3Npb25fY29uZmlybV9jdHggeworCXVfaW50IHdhbnRfdHR5OworCXVfaW50IHdhbnRfc3Vic3lzOworCXVfaW50IHdhbnRfeF9md2Q7CisJdV9pbnQgd2FudF9hZ2VudF9md2Q7CisJQnVmZmVyIGNtZDsKKwljaGFyICp0ZXJtOworCXN0cnVjdCB0ZXJtaW9zIHRpbzsKKwljaGFyICoqZW52OworCXVfaW50IHJpZDsKK307CisKKy8qIENvbnRleHQgZm9yIGdsb2JhbCBjaGFubmVsIGNhbGxiYWNrICovCitzdHJ1Y3QgbXV4X2NoYW5uZWxfY29uZmlybV9jdHggeworCXVfaW50IGNpZDsJLyogY2hhbm5lbCBpZCAqLworCXVfaW50IHJpZDsJLyogcmVxdWVzdCBpZCAqLworCWludCBmaWQ7CS8qIGZvcndhcmQgaWQgKi8KK307CisKKy8qIGZkIHRvIGNvbnRyb2wgc29ja2V0ICovCitpbnQgbXV4c2VydmVyX3NvY2sgPSAtMTsKKworLyogY2xpZW50IHJlcXVlc3QgaWQgKi8KK3VfaW50IG11eGNsaWVudF9yZXF1ZXN0X2lkID0gMDsKKworLyogTXVsdGlwbGV4aW5nIGNvbnRyb2wgY29tbWFuZCAqLwordV9pbnQgbXV4Y2xpZW50X2NvbW1hbmQgPSAwOworCisvKiBTZXQgd2hlbiBzaWduYWxsZWQuICovCitzdGF0aWMgdm9sYXRpbGUgc2lnX2F0b21pY190IG11eGNsaWVudF90ZXJtaW5hdGUgPSAwOworCisvKiBQSUQgb2YgbXVsdGlwbGV4IHNlcnZlciAqLworc3RhdGljIHVfaW50IG11eHNlcnZlcl9waWQgPSAwOworCitzdGF0aWMgQ2hhbm5lbCAqbXV4X2xpc3RlbmVyX2NoYW5uZWwgPSBOVUxMOworCitzdHJ1Y3QgbXV4X21hc3Rlcl9zdGF0ZSB7CisJaW50IGhlbGxvX3JjdmQ7Cit9OworCisvKiBtdXggcHJvdG9jb2wgbWVzc2FnZXMgKi8KKyNkZWZpbmUgTVVYX01TR19IRUxMTwkJMHgwMDAwMDAwMQorI2RlZmluZSBNVVhfQ19ORVdfU0VTU0lPTgkweDEwMDAwMDAyCisjZGVmaW5lIE1VWF9DX0FMSVZFX0NIRUNLCTB4MTAwMDAwMDQKKyNkZWZpbmUgTVVYX0NfVEVSTUlOQVRFCQkweDEwMDAwMDA1CisjZGVmaW5lIE1VWF9DX09QRU5fRldECQkweDEwMDAwMDA2CisjZGVmaW5lIE1VWF9DX0NMT1NFX0ZXRAkJMHgxMDAwMDAwNworI2RlZmluZSBNVVhfQ19ORVdfU1RESU9fRldECTB4MTAwMDAwMDgKKyNkZWZpbmUgTVVYX0NfU1RPUF9MSVNURU5JTkcJMHgxMDAwMDAwOQorI2RlZmluZSBNVVhfU19PSwkJMHg4MDAwMDAwMQorI2RlZmluZSBNVVhfU19QRVJNSVNTSU9OX0RFTklFRAkweDgwMDAwMDAyCisjZGVmaW5lIE1VWF9TX0ZBSUxVUkUJCTB4ODAwMDAwMDMKKyNkZWZpbmUgTVVYX1NfRVhJVF9NRVNTQUdFCTB4ODAwMDAwMDQKKyNkZWZpbmUgTVVYX1NfQUxJVkUJCTB4ODAwMDAwMDUKKyNkZWZpbmUgTVVYX1NfU0VTU0lPTl9PUEVORUQJMHg4MDAwMDAwNgorI2RlZmluZSBNVVhfU19SRU1PVEVfUE9SVAkweDgwMDAwMDA3CisjZGVmaW5lIE1VWF9TX1RUWV9BTExPQ19GQUlMCTB4ODAwMDAwMDgKKworLyogdHlwZSBjb2RlcyBmb3IgTVVYX0NfT1BFTl9GV0QgYW5kIE1VWF9DX0NMT1NFX0ZXRCAqLworI2RlZmluZSBNVVhfRldEX0xPQ0FMICAgMQorI2RlZmluZSBNVVhfRldEX1JFTU9URSAgMgorI2RlZmluZSBNVVhfRldEX0RZTkFNSUMgMworCitzdGF0aWMgdm9pZCBtdXhfc2Vzc2lvbl9jb25maXJtKGludCwgaW50LCB2b2lkICopOworCitzdGF0aWMgaW50IHByb2Nlc3NfbXV4X21hc3Rlcl9oZWxsbyh1X2ludCwgQ2hhbm5lbCAqLCBCdWZmZXIgKiwgQnVmZmVyICopOworc3RhdGljIGludCBwcm9jZXNzX211eF9uZXdfc2Vzc2lvbih1X2ludCwgQ2hhbm5lbCAqLCBCdWZmZXIgKiwgQnVmZmVyICopOworc3RhdGljIGludCBwcm9jZXNzX211eF9hbGl2ZV9jaGVjayh1X2ludCwgQ2hhbm5lbCAqLCBCdWZmZXIgKiwgQnVmZmVyICopOworc3RhdGljIGludCBwcm9jZXNzX211eF90ZXJtaW5hdGUodV9pbnQsIENoYW5uZWwgKiwgQnVmZmVyICosIEJ1ZmZlciAqKTsKK3N0YXRpYyBpbnQgcHJvY2Vzc19tdXhfb3Blbl9md2QodV9pbnQsIENoYW5uZWwgKiwgQnVmZmVyICosIEJ1ZmZlciAqKTsKK3N0YXRpYyBpbnQgcHJvY2Vzc19tdXhfY2xvc2VfZndkKHVfaW50LCBDaGFubmVsICosIEJ1ZmZlciAqLCBCdWZmZXIgKik7CitzdGF0aWMgaW50IHByb2Nlc3NfbXV4X3N0ZGlvX2Z3ZCh1X2ludCwgQ2hhbm5lbCAqLCBCdWZmZXIgKiwgQnVmZmVyICopOworc3RhdGljIGludCBwcm9jZXNzX211eF9zdG9wX2xpc3RlbmluZyh1X2ludCwgQ2hhbm5lbCAqLCBCdWZmZXIgKiwgQnVmZmVyICopOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1X2ludCB0eXBlOworCWludCAoKmhhbmRsZXIpKHVfaW50LCBDaGFubmVsICosIEJ1ZmZlciAqLCBCdWZmZXIgKik7Cit9IG11eF9tYXN0ZXJfaGFuZGxlcnNbXSA9IHsKKwl7IE1VWF9NU0dfSEVMTE8sIHByb2Nlc3NfbXV4X21hc3Rlcl9oZWxsbyB9LAorCXsgTVVYX0NfTkVXX1NFU1NJT04sIHByb2Nlc3NfbXV4X25ld19zZXNzaW9uIH0sCisJeyBNVVhfQ19BTElWRV9DSEVDSywgcHJvY2Vzc19tdXhfYWxpdmVfY2hlY2sgfSwKKwl7IE1VWF9DX1RFUk1JTkFURSwgcHJvY2Vzc19tdXhfdGVybWluYXRlIH0sCisJeyBNVVhfQ19PUEVOX0ZXRCwgcHJvY2Vzc19tdXhfb3Blbl9md2QgfSwKKwl7IE1VWF9DX0NMT1NFX0ZXRCwgcHJvY2Vzc19tdXhfY2xvc2VfZndkIH0sCisJeyBNVVhfQ19ORVdfU1RESU9fRldELCBwcm9jZXNzX211eF9zdGRpb19md2QgfSwKKwl7IE1VWF9DX1NUT1BfTElTVEVOSU5HLCBwcm9jZXNzX211eF9zdG9wX2xpc3RlbmluZyB9LAorCXsgMCwgTlVMTCB9Cit9OworCisvKiBDbGVhbnVwIGNhbGxiYWNrIGZpcmVkIG9uIGNsb3N1cmUgb2YgbXV4IHNsYXZlIF9zZXNzaW9uXyBjaGFubmVsICovCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK211eF9tYXN0ZXJfc2Vzc2lvbl9jbGVhbnVwX2NiKGludCBjaWQsIHZvaWQgKnVudXNlZCkKK3sKKwlDaGFubmVsICpjYywgKmMgPSBjaGFubmVsX2J5X2lkKGNpZCk7CisKKwlkZWJ1ZzMoIiVzOiBlbnRlcmluZyBmb3IgY2hhbm5lbCAlZCIsIF9fZnVuY19fLCBjaWQpOworCWlmIChjID09IE5VTEwpCisJCWZhdGFsKCIlczogY2hhbm5lbF9ieV9pZCglaSkgPT0gTlVMTCIsIF9fZnVuY19fLCBjaWQpOworCWlmIChjLT5jdGxfY2hhbiAhPSAtMSkgeworCQlpZiAoKGNjID0gY2hhbm5lbF9ieV9pZChjLT5jdGxfY2hhbikpID09IE5VTEwpCisJCQlmYXRhbCgiJXM6IGNoYW5uZWwgJWQgbWlzc2luZyBjb250cm9sIGNoYW5uZWwgJWQiLAorCQkJICAgIF9fZnVuY19fLCBjLT5zZWxmLCBjLT5jdGxfY2hhbik7CisJCWMtPmN0bF9jaGFuID0gLTE7CisJCWNjLT5yZW1vdGVfaWQgPSAtMTsKKwkJY2hhbl9yY3ZkX29jbG9zZShjYyk7CisJfQorCWNoYW5uZWxfY2FuY2VsX2NsZWFudXAoYy0+c2VsZik7Cit9CisKKy8qIENsZWFudXAgY2FsbGJhY2sgZmlyZWQgb24gY2xvc3VyZSBvZiBtdXggc2xhdmUgX2NvbnRyb2xfIGNoYW5uZWwgKi8KKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorbXV4X21hc3Rlcl9jb250cm9sX2NsZWFudXBfY2IoaW50IGNpZCwgdm9pZCAqdW51c2VkKQoreworCUNoYW5uZWwgKnNjLCAqYyA9IGNoYW5uZWxfYnlfaWQoY2lkKTsKKworCWRlYnVnMygiJXM6IGVudGVyaW5nIGZvciBjaGFubmVsICVkIiwgX19mdW5jX18sIGNpZCk7CisJaWYgKGMgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBjaGFubmVsX2J5X2lkKCVpKSA9PSBOVUxMIiwgX19mdW5jX18sIGNpZCk7CisJaWYgKGMtPnJlbW90ZV9pZCAhPSAtMSkgeworCQlpZiAoKHNjID0gY2hhbm5lbF9ieV9pZChjLT5yZW1vdGVfaWQpKSA9PSBOVUxMKQorCQkJZmF0YWwoIiVzOiBjaGFubmVsICVkIG1pc3Npbmcgc2Vzc2lvbiBjaGFubmVsICVkIiwKKwkJCSAgICBfX2Z1bmNfXywgYy0+c2VsZiwgYy0+cmVtb3RlX2lkKTsKKwkJYy0+cmVtb3RlX2lkID0gLTE7CisJCXNjLT5jdGxfY2hhbiA9IC0xOworCQlpZiAoc2MtPnR5cGUgIT0gU1NIX0NIQU5ORUxfT1BFTikgeworCQkJZGVidWcyKCIlczogY2hhbm5lbCAlZDogbm90IG9wZW4iLCBfX2Z1bmNfXywgc2MtPnNlbGYpOworCQkJY2hhbl9tYXJrX2RlYWQoc2MpOworCQl9IGVsc2UgeworCQkJaWYgKHNjLT5pc3RhdGUgPT0gQ0hBTl9JTlBVVF9PUEVOKQorCQkJCWNoYW5fcmVhZF9mYWlsZWQoc2MpOworCQkJaWYgKHNjLT5vc3RhdGUgPT0gQ0hBTl9PVVRQVVRfT1BFTikKKwkJCQljaGFuX3dyaXRlX2ZhaWxlZChzYyk7CisJCX0KKwl9CisJY2hhbm5lbF9jYW5jZWxfY2xlYW51cChjLT5zZWxmKTsKK30KKworLyogQ2hlY2sgbXV4IGNsaWVudCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byBtdXggbWFzdGVyLiAqLworc3RhdGljIGludAorZW52X3Blcm1pdHRlZChjaGFyICplbnYpCit7CisJaW50IGksIHJldDsKKwljaGFyIG5hbWVbMTAyNF0sICpjcDsKKworCWlmICgoY3AgPSBzdHJjaHIoZW52LCAnPScpKSA9PSBOVUxMIHx8IGNwID09IGVudikKKwkJcmV0dXJuIDA7CisJcmV0ID0gc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJS4qcyIsIChpbnQpKGNwIC0gZW52KSwgZW52KTsKKwlpZiAocmV0IDw9IDAgfHwgKHNpemVfdClyZXQgPj0gc2l6ZW9mKG5hbWUpKSB7CisJCWVycm9yKCJlbnZfcGVybWl0dGVkOiBuYW1lICclLjEwMHMuLi4nIHRvbyBsb25nIiwgZW52KTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubnVtX3NlbmRfZW52OyBpKyspCisJCWlmIChtYXRjaF9wYXR0ZXJuKG5hbWUsIG9wdGlvbnMuc2VuZF9lbnZbaV0pKQorCQkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyogTXV4IG1hc3RlciBwcm90b2NvbCBtZXNzYWdlIGhhbmRsZXJzICovCisKK3N0YXRpYyBpbnQKK3Byb2Nlc3NfbXV4X21hc3Rlcl9oZWxsbyh1X2ludCByaWQsIENoYW5uZWwgKmMsIEJ1ZmZlciAqbSwgQnVmZmVyICpyKQoreworCXVfaW50IHZlcjsKKwlzdHJ1Y3QgbXV4X21hc3Rlcl9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IG11eF9tYXN0ZXJfc3RhdGUgKiljLT5tdXhfY3R4OworCisJaWYgKHN0YXRlID09IE5VTEwpCisJCWZhdGFsKCIlczogY2hhbm5lbCAlZDogYy0+bXV4X2N0eCA9PSBOVUxMIiwgX19mdW5jX18sIGMtPnNlbGYpOworCWlmIChzdGF0ZS0+aGVsbG9fcmN2ZCkgeworCQllcnJvcigiJXM6IEhFTExPIHJlY2VpdmVkIHR3aWNlIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChidWZmZXJfZ2V0X2ludF9yZXQoJnZlciwgbSkgIT0gMCkgeworIG1hbGY6CisJCWVycm9yKCIlczogbWFsZm9ybWVkIG1lc3NhZ2UiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHZlciAhPSBTU0hNVVhfVkVSKSB7CisJCWVycm9yKCJVbnN1cHBvcnRlZCBtdWx0aXBsZXhpbmcgcHJvdG9jb2wgdmVyc2lvbiAlZCAiCisJCSAgICAiKGV4cGVjdGVkICVkKSIsIHZlciwgU1NITVVYX1ZFUik7CisJCXJldHVybiAtMTsKKwl9CisJZGVidWcyKCIlczogY2hhbm5lbCAlZCBzbGF2ZSB2ZXJzaW9uICV1IiwgX19mdW5jX18sIGMtPnNlbGYsIHZlcik7CisKKwkvKiBObyBleHRlbnNpb25zIGFyZSBwcmVzZW50bHkgZGVmaW5lZCAqLworCXdoaWxlIChidWZmZXJfbGVuKG0pID4gMCkgeworCQljaGFyICpuYW1lID0gYnVmZmVyX2dldF9zdHJpbmdfcmV0KG0sIE5VTEwpOworCQljaGFyICp2YWx1ZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nX3JldChtLCBOVUxMKTsKKworCQlpZiAobmFtZSA9PSBOVUxMIHx8IHZhbHVlID09IE5VTEwpIHsKKwkJCWlmIChuYW1lICE9IE5VTEwpCisJCQkJeGZyZWUobmFtZSk7CisJCQlnb3RvIG1hbGY7CisJCX0KKwkJZGVidWcyKCJVbnJlY29nbmlzZWQgc2xhdmUgZXh0ZW5zaW9uIFwiJXNcIiIsIG5hbWUpOworCQl4ZnJlZShuYW1lKTsKKwkJeGZyZWUodmFsdWUpOworCX0KKwlzdGF0ZS0+aGVsbG9fcmN2ZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Byb2Nlc3NfbXV4X25ld19zZXNzaW9uKHVfaW50IHJpZCwgQ2hhbm5lbCAqYywgQnVmZmVyICptLCBCdWZmZXIgKnIpCit7CisJQ2hhbm5lbCAqbmM7CisJc3RydWN0IG11eF9zZXNzaW9uX2NvbmZpcm1fY3R4ICpjY3R4OworCWNoYXIgKnJlc2VydmVkLCAqY21kLCAqY3A7CisJdV9pbnQgaSwgaiwgbGVuLCBlbnZfbGVuLCBlc2NhcGVfY2hhciwgd2luZG93LCBwYWNrZXRtYXg7CisJaW50IG5ld19mZFszXTsKKworCS8qIFJlcGx5IGZvciBTU0hNVVhfQ09NTUFORF9PUEVOICovCisJY2N0eCA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpjY3R4KSk7CisJY2N0eC0+dGVybSA9IE5VTEw7CisJY2N0eC0+cmlkID0gcmlkOworCWNtZCA9IHJlc2VydmVkID0gTlVMTDsKKwlpZiAoKHJlc2VydmVkID0gYnVmZmVyX2dldF9zdHJpbmdfcmV0KG0sIE5VTEwpKSA9PSBOVUxMIHx8CisJICAgIGJ1ZmZlcl9nZXRfaW50X3JldCgmY2N0eC0+d2FudF90dHksIG0pICE9IDAgfHwKKwkgICAgYnVmZmVyX2dldF9pbnRfcmV0KCZjY3R4LT53YW50X3hfZndkLCBtKSAhPSAwIHx8CisJICAgIGJ1ZmZlcl9nZXRfaW50X3JldCgmY2N0eC0+d2FudF9hZ2VudF9md2QsIG0pICE9IDAgfHwKKwkgICAgYnVmZmVyX2dldF9pbnRfcmV0KCZjY3R4LT53YW50X3N1YnN5cywgbSkgIT0gMCB8fAorCSAgICBidWZmZXJfZ2V0X2ludF9yZXQoJmVzY2FwZV9jaGFyLCBtKSAhPSAwIHx8CisJICAgIChjY3R4LT50ZXJtID0gYnVmZmVyX2dldF9zdHJpbmdfcmV0KG0sICZsZW4pKSA9PSBOVUxMIHx8CisJICAgIChjbWQgPSBidWZmZXJfZ2V0X3N0cmluZ19yZXQobSwgJmxlbikpID09IE5VTEwpIHsKKyBtYWxmOgorCQlpZiAoY21kICE9IE5VTEwpCisJCQl4ZnJlZShjbWQpOworCQlpZiAocmVzZXJ2ZWQgIT0gTlVMTCkKKwkJCXhmcmVlKHJlc2VydmVkKTsKKwkJaWYgKGNjdHgtPnRlcm0gIT0gTlVMTCkKKwkJCXhmcmVlKGNjdHgtPnRlcm0pOworCQllcnJvcigiJXM6IG1hbGZvcm1lZCBtZXNzYWdlIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCXhmcmVlKHJlc2VydmVkKTsKKwlyZXNlcnZlZCA9IE5VTEw7CisKKwljY3R4LT5lbnYgPSBOVUxMOworCWVudl9sZW4gPSAwOworCXdoaWxlIChidWZmZXJfbGVuKG0pID4gMCkgeworI2RlZmluZSBNVVhfTUFYX0VOVl9WQVJTCTQwOTYKKwkJaWYgKChjcCA9IGJ1ZmZlcl9nZXRfc3RyaW5nX3JldChtLCAmbGVuKSkgPT0gTlVMTCkKKwkJCWdvdG8gbWFsZjsKKwkJaWYgKCFlbnZfcGVybWl0dGVkKGNwKSkgeworCQkJeGZyZWUoY3ApOworCQkJY29udGludWU7CisJCX0KKwkJY2N0eC0+ZW52ID0geHJlYWxsb2MoY2N0eC0+ZW52LCBlbnZfbGVuICsgMiwKKwkJICAgIHNpemVvZigqY2N0eC0+ZW52KSk7CisJCWNjdHgtPmVudltlbnZfbGVuKytdID0gY3A7CisJCWNjdHgtPmVudltlbnZfbGVuXSA9IE5VTEw7CisJCWlmIChlbnZfbGVuID4gTVVYX01BWF9FTlZfVkFSUykgeworCQkJZXJyb3IoIj4lZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVjZWl2ZWQsIGlnbm9yaW5nICIKKwkJCSAgICAiYWRkaXRpb25hbCIsIE1VWF9NQVhfRU5WX1ZBUlMpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlkZWJ1ZzIoIiVzOiBjaGFubmVsICVkOiByZXF1ZXN0IHR0eSAlZCwgWCAlZCwgYWdlbnQgJWQsIHN1YnN5cyAlZCwgIgorCSAgICAidGVybSBcIiVzXCIsIGNtZCBcIiVzXCIsIGVudiAldSIsIF9fZnVuY19fLCBjLT5zZWxmLAorCSAgICBjY3R4LT53YW50X3R0eSwgY2N0eC0+d2FudF94X2Z3ZCwgY2N0eC0+d2FudF9hZ2VudF9md2QsCisJICAgIGNjdHgtPndhbnRfc3Vic3lzLCBjY3R4LT50ZXJtLCBjbWQsIGVudl9sZW4pOworCisJYnVmZmVyX2luaXQoJmNjdHgtPmNtZCk7CisJYnVmZmVyX2FwcGVuZCgmY2N0eC0+Y21kLCBjbWQsIHN0cmxlbihjbWQpKTsKKwl4ZnJlZShjbWQpOworCWNtZCA9IE5VTEw7CisKKwkvKiBHYXRoZXIgZmRzIGZyb20gY2xpZW50ICovCisJZm9yKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWlmICgobmV3X2ZkW2ldID0gbW1fcmVjZWl2ZV9mZChjLT5zb2NrKSkgPT0gLTEpIHsKKwkJCWVycm9yKCIlczogZmFpbGVkIHRvIHJlY2VpdmUgZmQgJWQgZnJvbSBzbGF2ZSIsCisJCQkgICAgX19mdW5jX18sIGkpOworCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKKwkJCQljbG9zZShuZXdfZmRbal0pOworCQkJZm9yIChqID0gMDsgaiA8IGVudl9sZW47IGorKykKKwkJCQl4ZnJlZShjY3R4LT5lbnZbal0pOworCQkJaWYgKGVudl9sZW4gPiAwKQorCQkJCXhmcmVlKGNjdHgtPmVudik7CisJCQl4ZnJlZShjY3R4LT50ZXJtKTsKKwkJCWJ1ZmZlcl9mcmVlKCZjY3R4LT5jbWQpOworCQkJeGZyZWUoY2N0eCk7CisKKwkJCS8qIHByZXBhcmUgcmVwbHkgKi8KKwkJCWJ1ZmZlcl9wdXRfaW50KHIsIE1VWF9TX0ZBSUxVUkUpOworCQkJYnVmZmVyX3B1dF9pbnQociwgcmlkKTsKKwkJCWJ1ZmZlcl9wdXRfY3N0cmluZyhyLAorCQkJICAgICJkaWQgbm90IHJlY2VpdmUgZmlsZSBkZXNjcmlwdG9ycyIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJZGVidWczKCIlczogZ290IGZkcyBzdGRpbiAlZCwgc3Rkb3V0ICVkLCBzdGRlcnIgJWQiLCBfX2Z1bmNfXywKKwkgICAgbmV3X2ZkWzBdLCBuZXdfZmRbMV0sIG5ld19mZFsyXSk7CisKKwkvKiBYWFggc3VwcG9ydCBtdWx0aXBsZSBjaGlsZCBzZXNzaW9ucyBpbiBmdXR1cmUgKi8KKwlpZiAoYy0+cmVtb3RlX2lkICE9IC0xKSB7CisJCWRlYnVnMigiJXM6IHNlc3Npb24gYWxyZWFkeSBvcGVuIiwgX19mdW5jX18pOworCQkvKiBwcmVwYXJlIHJlcGx5ICovCisJCWJ1ZmZlcl9wdXRfaW50KHIsIE1VWF9TX0ZBSUxVUkUpOworCQlidWZmZXJfcHV0X2ludChyLCByaWQpOworCQlidWZmZXJfcHV0X2NzdHJpbmcociwgIk11bHRpcGxlIHNlc3Npb25zIG5vdCBzdXBwb3J0ZWQiKTsKKyBjbGVhbnVwOgorCQljbG9zZShuZXdfZmRbMF0pOworCQljbG9zZShuZXdfZmRbMV0pOworCQljbG9zZShuZXdfZmRbMl0pOworCQl4ZnJlZShjY3R4LT50ZXJtKTsKKwkJaWYgKGVudl9sZW4gIT0gMCkgeworCQkJZm9yIChpID0gMDsgaSA8IGVudl9sZW47IGkrKykKKwkJCQl4ZnJlZShjY3R4LT5lbnZbaV0pOworCQkJeGZyZWUoY2N0eC0+ZW52KTsKKwkJfQorCQlidWZmZXJfZnJlZSgmY2N0eC0+Y21kKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG9wdGlvbnMuY29udHJvbF9tYXN0ZXIgPT0gU1NIQ1RMX01BU1RFUl9BU0sgfHwKKwkgICAgb3B0aW9ucy5jb250cm9sX21hc3RlciA9PSBTU0hDVExfTUFTVEVSX0FVVE9fQVNLKSB7CisJCWlmICghYXNrX3Blcm1pc3Npb24oIkFsbG93IHNoYXJlZCBjb25uZWN0aW9uIHRvICVzPyAiLCBob3N0KSkgeworCQkJZGVidWcyKCIlczogc2Vzc2lvbiByZWZ1c2VkIGJ5IHVzZXIiLCBfX2Z1bmNfXyk7CisJCQkvKiBwcmVwYXJlIHJlcGx5ICovCisJCQlidWZmZXJfcHV0X2ludChyLCBNVVhfU19QRVJNSVNTSU9OX0RFTklFRCk7CisJCQlidWZmZXJfcHV0X2ludChyLCByaWQpOworCQkJYnVmZmVyX3B1dF9jc3RyaW5nKHIsICJQZXJtaXNzaW9uIGRlbmllZCIpOworCQkJZ290byBjbGVhbnVwOworCQl9CisJfQorCisJLyogVHJ5IHRvIHBpY2sgdXAgdHR5bW9kZXMgZnJvbSBjbGllbnQgYmVmb3JlIGl0IGdvZXMgcmF3ICovCisJaWYgKGNjdHgtPndhbnRfdHR5ICYmIHRjZ2V0YXR0cihuZXdfZmRbMF0sICZjY3R4LT50aW8pID09IC0xKQorCQllcnJvcigiJXM6IHRjZ2V0YXR0cjogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKworCS8qIGVuYWJsZSBub25ibG9ja2luZyB1bmxlc3MgdHR5ICovCisJaWYgKCFpc2F0dHkobmV3X2ZkWzBdKSkKKwkJc2V0X25vbmJsb2NrKG5ld19mZFswXSk7CisJaWYgKCFpc2F0dHkobmV3X2ZkWzFdKSkKKwkJc2V0X25vbmJsb2NrKG5ld19mZFsxXSk7CisJaWYgKCFpc2F0dHkobmV3X2ZkWzJdKSkKKwkJc2V0X25vbmJsb2NrKG5ld19mZFsyXSk7CisKKwl3aW5kb3cgPSBDSEFOX1NFU19XSU5ET1dfREVGQVVMVDsKKwlwYWNrZXRtYXggPSBDSEFOX1NFU19QQUNLRVRfREVGQVVMVDsKKwlpZiAoY2N0eC0+d2FudF90dHkpIHsKKwkJd2luZG93ID4+PSAxOworCQlwYWNrZXRtYXggPj49IDE7CisJfQorCisJbmMgPSBjaGFubmVsX25ldygic2Vzc2lvbiIsIFNTSF9DSEFOTkVMX09QRU5JTkcsCisJICAgIG5ld19mZFswXSwgbmV3X2ZkWzFdLCBuZXdfZmRbMl0sIHdpbmRvdywgcGFja2V0bWF4LAorCSAgICBDSEFOX0VYVEVOREVEX1dSSVRFLCAiY2xpZW50LXNlc3Npb24iLCAvKm5vbmJsb2NrKi8wKTsKKworCW5jLT5jdGxfY2hhbiA9IGMtPnNlbGY7CQkvKiBsaW5rIHNlc3Npb24gLT4gY29udHJvbCBjaGFubmVsICovCisJYy0+cmVtb3RlX2lkID0gbmMtPnNlbGY7IAkvKiBsaW5rIGNvbnRyb2wgLT4gc2Vzc2lvbiBjaGFubmVsICovCisKKwlpZiAoY2N0eC0+d2FudF90dHkgJiYgZXNjYXBlX2NoYXIgIT0gMHhmZmZmZmZmZikgeworCQljaGFubmVsX3JlZ2lzdGVyX2ZpbHRlcihuYy0+c2VsZiwKKwkJICAgIGNsaWVudF9zaW1wbGVfZXNjYXBlX2ZpbHRlciwgTlVMTCwKKwkJICAgIGNsaWVudF9maWx0ZXJfY2xlYW51cCwKKwkJICAgIGNsaWVudF9uZXdfZXNjYXBlX2ZpbHRlcl9jdHgoKGludCllc2NhcGVfY2hhcikpOworCX0KKworCWRlYnVnMigiJXM6IGNoYW5uZWxfbmV3OiAlZCBsaW5rZWQgdG8gY29udHJvbCBjaGFubmVsICVkIiwKKwkgICAgX19mdW5jX18sIG5jLT5zZWxmLCBuYy0+Y3RsX2NoYW4pOworCisJY2hhbm5lbF9zZW5kX29wZW4obmMtPnNlbGYpOworCWNoYW5uZWxfcmVnaXN0ZXJfb3Blbl9jb25maXJtKG5jLT5zZWxmLCBtdXhfc2Vzc2lvbl9jb25maXJtLCBjY3R4KTsKKwljLT5tdXhfcGF1c2UgPSAxOyAvKiBzdG9wIGhhbmRsaW5nIG1lc3NhZ2VzIHVudGlsIG9wZW5fY29uZmlybSBkb25lICovCisJY2hhbm5lbF9yZWdpc3Rlcl9jbGVhbnVwKG5jLT5zZWxmLCBtdXhfbWFzdGVyX3Nlc3Npb25fY2xlYW51cF9jYiwgMSk7CisKKwkvKiByZXBseSBpcyBkZWZlcnJlZCwgc2VudCBieSBtdXhfc2Vzc2lvbl9jb25maXJtICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Byb2Nlc3NfbXV4X2FsaXZlX2NoZWNrKHVfaW50IHJpZCwgQ2hhbm5lbCAqYywgQnVmZmVyICptLCBCdWZmZXIgKnIpCit7CisJZGVidWcyKCIlczogY2hhbm5lbCAlZDogYWxpdmUgY2hlY2siLCBfX2Z1bmNfXywgYy0+c2VsZik7CisKKwkvKiBwcmVwYXJlIHJlcGx5ICovCisJYnVmZmVyX3B1dF9pbnQociwgTVVYX1NfQUxJVkUpOworCWJ1ZmZlcl9wdXRfaW50KHIsIHJpZCk7CisJYnVmZmVyX3B1dF9pbnQociwgKHVfaW50KWdldHBpZCgpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citwcm9jZXNzX211eF90ZXJtaW5hdGUodV9pbnQgcmlkLCBDaGFubmVsICpjLCBCdWZmZXIgKm0sIEJ1ZmZlciAqcikKK3sKKwlkZWJ1ZzIoIiVzOiBjaGFubmVsICVkOiB0ZXJtaW5hdGUgcmVxdWVzdCIsIF9fZnVuY19fLCBjLT5zZWxmKTsKKworCWlmIChvcHRpb25zLmNvbnRyb2xfbWFzdGVyID09IFNTSENUTF9NQVNURVJfQVNLIHx8CisJICAgIG9wdGlvbnMuY29udHJvbF9tYXN0ZXIgPT0gU1NIQ1RMX01BU1RFUl9BVVRPX0FTSykgeworCQlpZiAoIWFza19wZXJtaXNzaW9uKCJUZXJtaW5hdGUgc2hhcmVkIGNvbm5lY3Rpb24gdG8gJXM/ICIsCisJCSAgICBob3N0KSkgeworCQkJZGVidWcyKCIlczogdGVybWluYXRpb24gcmVmdXNlZCBieSB1c2VyIiwgX19mdW5jX18pOworCQkJYnVmZmVyX3B1dF9pbnQociwgTVVYX1NfUEVSTUlTU0lPTl9ERU5JRUQpOworCQkJYnVmZmVyX3B1dF9pbnQociwgcmlkKTsKKwkJCWJ1ZmZlcl9wdXRfY3N0cmluZyhyLCAiUGVybWlzc2lvbiBkZW5pZWQiKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcXVpdF9wZW5kaW5nID0gMTsKKwlidWZmZXJfcHV0X2ludChyLCBNVVhfU19PSyk7CisJYnVmZmVyX3B1dF9pbnQociwgcmlkKTsKKwkvKiBYWFggZXhpdCBoYXBwZW5zIHRvbyBzb29uIC0gbWVzc2FnZSBuZXZlciBtYWtlcyBpdCB0byBjbGllbnQgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgKgorZm9ybWF0X2ZvcndhcmQodV9pbnQgZnR5cGUsIEZvcndhcmQgKmZ3ZCkKK3sKKwljaGFyICpyZXQ7CisKKwlzd2l0Y2ggKGZ0eXBlKSB7CisJY2FzZSBNVVhfRldEX0xPQ0FMOgorCQl4YXNwcmludGYoJnJldCwgImxvY2FsIGZvcndhcmQgJS4yMDBzOiVkIC0+ICUuMjAwczolZCIsCisJCSAgICAoZndkLT5saXN0ZW5faG9zdCA9PSBOVUxMKSA/CisJCSAgICAob3B0aW9ucy5nYXRld2F5X3BvcnRzID8gIioiIDogIkxPQ0FMSE9TVCIpIDoKKwkJICAgIGZ3ZC0+bGlzdGVuX2hvc3QsIGZ3ZC0+bGlzdGVuX3BvcnQsCisJCSAgICBmd2QtPmNvbm5lY3RfaG9zdCwgZndkLT5jb25uZWN0X3BvcnQpOworCQlicmVhazsKKwljYXNlIE1VWF9GV0RfRFlOQU1JQzoKKwkJeGFzcHJpbnRmKCZyZXQsICJkeW5hbWljIGZvcndhcmQgJS4yMDBzOiVkIC0+ICoiLAorCQkgICAgKGZ3ZC0+bGlzdGVuX2hvc3QgPT0gTlVMTCkgPworCQkgICAgKG9wdGlvbnMuZ2F0ZXdheV9wb3J0cyA/ICIqIiA6ICJMT0NBTEhPU1QiKSA6CisJCSAgICAgZndkLT5saXN0ZW5faG9zdCwgZndkLT5saXN0ZW5fcG9ydCk7CisJCWJyZWFrOworCWNhc2UgTVVYX0ZXRF9SRU1PVEU6CisJCXhhc3ByaW50ZigmcmV0LCAicmVtb3RlIGZvcndhcmQgJS4yMDBzOiVkIC0+ICUuMjAwczolZCIsCisJCSAgICAoZndkLT5saXN0ZW5faG9zdCA9PSBOVUxMKSA/CisJCSAgICAiTE9DQUxIT1NUIiA6IGZ3ZC0+bGlzdGVuX2hvc3QsCisJCSAgICBmd2QtPmxpc3Rlbl9wb3J0LAorCQkgICAgZndkLT5jb25uZWN0X2hvc3QsIGZ3ZC0+Y29ubmVjdF9wb3J0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZmF0YWwoIiVzOiB1bmtub3duIGZvcndhcmQgdHlwZSAldSIsIF9fZnVuY19fLCBmdHlwZSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2NvbXBhcmVfaG9zdChjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiKQoreworCWlmIChhID09IE5VTEwgJiYgYiA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKwlpZiAoYSA9PSBOVUxMIHx8IGIgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHN0cmNtcChhLCBiKSA9PSAwOworfQorCitzdGF0aWMgaW50Citjb21wYXJlX2ZvcndhcmQoRm9yd2FyZCAqYSwgRm9yd2FyZCAqYikKK3sKKwlpZiAoIWNvbXBhcmVfaG9zdChhLT5saXN0ZW5faG9zdCwgYi0+bGlzdGVuX2hvc3QpKQorCQlyZXR1cm4gMDsKKwlpZiAoYS0+bGlzdGVuX3BvcnQgIT0gYi0+bGlzdGVuX3BvcnQpCisJCXJldHVybiAwOworCWlmICghY29tcGFyZV9ob3N0KGEtPmNvbm5lY3RfaG9zdCwgYi0+Y29ubmVjdF9ob3N0KSkKKwkJcmV0dXJuIDA7CisJaWYgKGEtPmNvbm5lY3RfcG9ydCAhPSBiLT5jb25uZWN0X3BvcnQpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCittdXhfY29uZmlybV9yZW1vdGVfZm9yd2FyZChpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKK3sKKwlzdHJ1Y3QgbXV4X2NoYW5uZWxfY29uZmlybV9jdHggKmZjdHggPSBjdHh0OworCWNoYXIgKmZhaWxtc2cgPSBOVUxMOworCUZvcndhcmQgKnJmd2Q7CisJQ2hhbm5lbCAqYzsKKwlCdWZmZXIgb3V0OworCisJaWYgKChjID0gY2hhbm5lbF9ieV9pZChmY3R4LT5jaWQpKSA9PSBOVUxMKSB7CisJCS8qIG5vIGNoYW5uZWwgZm9yIHJlcGx5ICovCisJCWVycm9yKCIlczogdW5rbm93biBjaGFubmVsIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWJ1ZmZlcl9pbml0KCZvdXQpOworCWlmIChmY3R4LT5maWQgPj0gb3B0aW9ucy5udW1fcmVtb3RlX2ZvcndhcmRzKSB7CisJCXhhc3ByaW50ZigmZmFpbG1zZywgInVua25vd24gZm9yd2FyZGluZyBpZCAlZCIsIGZjdHgtPmZpZCk7CisJCWdvdG8gZmFpbDsKKwl9CisJcmZ3ZCA9ICZvcHRpb25zLnJlbW90ZV9mb3J3YXJkc1tmY3R4LT5maWRdOworCWRlYnVnKCIlczogJXMgZm9yOiBsaXN0ZW4gJWQsIGNvbm5lY3QgJXM6JWQiLCBfX2Z1bmNfXywKKwkgICAgdHlwZSA9PSBTU0gyX01TR19SRVFVRVNUX1NVQ0NFU1MgPyAic3VjY2VzcyIgOiAiZmFpbHVyZSIsCisJICAgIHJmd2QtPmxpc3Rlbl9wb3J0LCByZndkLT5jb25uZWN0X2hvc3QsIHJmd2QtPmNvbm5lY3RfcG9ydCk7CisJaWYgKHR5cGUgPT0gU1NIMl9NU0dfUkVRVUVTVF9TVUNDRVNTKSB7CisJCWlmIChyZndkLT5saXN0ZW5fcG9ydCA9PSAwKSB7CisJCQlyZndkLT5hbGxvY2F0ZWRfcG9ydCA9IHBhY2tldF9nZXRfaW50KCk7CisJCQlsb2dpdCgiQWxsb2NhdGVkIHBvcnQgJXUgZm9yIG11eCByZW1vdGUgZm9yd2FyZCIKKwkJCSAgICAiIHRvICVzOiVkIiwgcmZ3ZC0+YWxsb2NhdGVkX3BvcnQsCisJCQkgICAgcmZ3ZC0+Y29ubmVjdF9ob3N0LCByZndkLT5jb25uZWN0X3BvcnQpOworCQkJYnVmZmVyX3B1dF9pbnQoJm91dCwgTVVYX1NfUkVNT1RFX1BPUlQpOworCQkJYnVmZmVyX3B1dF9pbnQoJm91dCwgZmN0eC0+cmlkKTsKKwkJCWJ1ZmZlcl9wdXRfaW50KCZvdXQsIHJmd2QtPmFsbG9jYXRlZF9wb3J0KTsKKwkJCWNoYW5uZWxfdXBkYXRlX3Blcm1pdHRlZF9vcGVucyhyZndkLT5oYW5kbGUsCisJCQkgICByZndkLT5hbGxvY2F0ZWRfcG9ydCk7CisJCX0gZWxzZSB7CisJCQlidWZmZXJfcHV0X2ludCgmb3V0LCBNVVhfU19PSyk7CisJCQlidWZmZXJfcHV0X2ludCgmb3V0LCBmY3R4LT5yaWQpOworCQl9CisJCWdvdG8gb3V0OworCX0gZWxzZSB7CisJCWlmIChyZndkLT5saXN0ZW5fcG9ydCA9PSAwKQorCQkJY2hhbm5lbF91cGRhdGVfcGVybWl0dGVkX29wZW5zKHJmd2QtPmhhbmRsZSwgLTEpOworCQl4YXNwcmludGYoJmZhaWxtc2csICJyZW1vdGUgcG9ydCBmb3J3YXJkaW5nIGZhaWxlZCBmb3IgIgorCQkgICAgImxpc3RlbiBwb3J0ICVkIiwgcmZ3ZC0+bGlzdGVuX3BvcnQpOworCX0KKyBmYWlsOgorCWVycm9yKCIlczogJXMiLCBfX2Z1bmNfXywgZmFpbG1zZyk7CisJYnVmZmVyX3B1dF9pbnQoJm91dCwgTVVYX1NfRkFJTFVSRSk7CisJYnVmZmVyX3B1dF9pbnQoJm91dCwgZmN0eC0+cmlkKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcoJm91dCwgZmFpbG1zZyk7CisJeGZyZWUoZmFpbG1zZyk7Cisgb3V0OgorCWJ1ZmZlcl9wdXRfc3RyaW5nKCZjLT5vdXRwdXQsIGJ1ZmZlcl9wdHIoJm91dCksIGJ1ZmZlcl9sZW4oJm91dCkpOworCWJ1ZmZlcl9mcmVlKCZvdXQpOworCWlmIChjLT5tdXhfcGF1c2UgPD0gMCkKKwkJZmF0YWwoIiVzOiBtdXhfcGF1c2UgJWQiLCBfX2Z1bmNfXywgYy0+bXV4X3BhdXNlKTsKKwljLT5tdXhfcGF1c2UgPSAwOyAvKiBzdGFydCBwcm9jZXNzaW5nIG1lc3NhZ2VzIGFnYWluICovCit9CisKK3N0YXRpYyBpbnQKK3Byb2Nlc3NfbXV4X29wZW5fZndkKHVfaW50IHJpZCwgQ2hhbm5lbCAqYywgQnVmZmVyICptLCBCdWZmZXIgKnIpCit7CisJRm9yd2FyZCBmd2Q7CisJY2hhciAqZndkX2Rlc2MgPSBOVUxMOworCXVfaW50IGZ0eXBlOworCWludCBpLCByZXQgPSAwLCBmcmVlZndkID0gMTsKKworCWZ3ZC5saXN0ZW5faG9zdCA9IGZ3ZC5jb25uZWN0X2hvc3QgPSBOVUxMOworCWlmIChidWZmZXJfZ2V0X2ludF9yZXQoJmZ0eXBlLCBtKSAhPSAwIHx8CisJICAgIChmd2QubGlzdGVuX2hvc3QgPSBidWZmZXJfZ2V0X3N0cmluZ19yZXQobSwgTlVMTCkpID09IE5VTEwgfHwKKwkgICAgYnVmZmVyX2dldF9pbnRfcmV0KCZmd2QubGlzdGVuX3BvcnQsIG0pICE9IDAgfHwKKwkgICAgKGZ3ZC5jb25uZWN0X2hvc3QgPSBidWZmZXJfZ2V0X3N0cmluZ19yZXQobSwgTlVMTCkpID09IE5VTEwgfHwKKwkgICAgYnVmZmVyX2dldF9pbnRfcmV0KCZmd2QuY29ubmVjdF9wb3J0LCBtKSAhPSAwKSB7CisJCWVycm9yKCIlczogbWFsZm9ybWVkIG1lc3NhZ2UiLCBfX2Z1bmNfXyk7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKmZ3ZC5saXN0ZW5faG9zdCA9PSAnXDAnKSB7CisJCXhmcmVlKGZ3ZC5saXN0ZW5faG9zdCk7CisJCWZ3ZC5saXN0ZW5faG9zdCA9IE5VTEw7CisJfQorCWlmICgqZndkLmNvbm5lY3RfaG9zdCA9PSAnXDAnKSB7CisJCXhmcmVlKGZ3ZC5jb25uZWN0X2hvc3QpOworCQlmd2QuY29ubmVjdF9ob3N0ID0gTlVMTDsKKwl9CisKKwlkZWJ1ZzIoIiVzOiBjaGFubmVsICVkOiByZXF1ZXN0ICVzIiwgX19mdW5jX18sIGMtPnNlbGYsCisJICAgIChmd2RfZGVzYyA9IGZvcm1hdF9mb3J3YXJkKGZ0eXBlLCAmZndkKSkpOworCisJaWYgKGZ0eXBlICE9IE1VWF9GV0RfTE9DQUwgJiYgZnR5cGUgIT0gTVVYX0ZXRF9SRU1PVEUgJiYKKwkgICAgZnR5cGUgIT0gTVVYX0ZXRF9EWU5BTUlDKSB7CisJCWxvZ2l0KCIlczogaW52YWxpZCBmb3J3YXJkaW5nIHR5cGUgJXUiLCBfX2Z1bmNfXywgZnR5cGUpOworIGludmFsaWQ6CisJCWlmIChmd2QubGlzdGVuX2hvc3QpCisJCQl4ZnJlZShmd2QubGlzdGVuX2hvc3QpOworCQlpZiAoZndkLmNvbm5lY3RfaG9zdCkKKwkJCXhmcmVlKGZ3ZC5jb25uZWN0X2hvc3QpOworCQlidWZmZXJfcHV0X2ludChyLCBNVVhfU19GQUlMVVJFKTsKKwkJYnVmZmVyX3B1dF9pbnQociwgcmlkKTsKKwkJYnVmZmVyX3B1dF9jc3RyaW5nKHIsICJJbnZhbGlkIGZvcndhcmRpbmcgcmVxdWVzdCIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGZ3ZC5saXN0ZW5fcG9ydCA+PSA2NTUzNikgeworCQlsb2dpdCgiJXM6IGludmFsaWQgbGlzdGVuIHBvcnQgJXUiLCBfX2Z1bmNfXywKKwkJICAgIGZ3ZC5saXN0ZW5fcG9ydCk7CisJCWdvdG8gaW52YWxpZDsKKwl9CisJaWYgKGZ3ZC5jb25uZWN0X3BvcnQgPj0gNjU1MzYgfHwgKGZ0eXBlICE9IE1VWF9GV0RfRFlOQU1JQyAmJgorCSAgICBmdHlwZSAhPSBNVVhfRldEX1JFTU9URSAmJiBmd2QuY29ubmVjdF9wb3J0ID09IDApKSB7CisJCWxvZ2l0KCIlczogaW52YWxpZCBjb25uZWN0IHBvcnQgJXUiLCBfX2Z1bmNfXywKKwkJICAgIGZ3ZC5jb25uZWN0X3BvcnQpOworCQlnb3RvIGludmFsaWQ7CisJfQorCWlmIChmdHlwZSAhPSBNVVhfRldEX0RZTkFNSUMgJiYgZndkLmNvbm5lY3RfaG9zdCA9PSBOVUxMKSB7CisJCWxvZ2l0KCIlczogbWlzc2luZyBjb25uZWN0IGhvc3QiLCBfX2Z1bmNfXyk7CisJCWdvdG8gaW52YWxpZDsKKwl9CisKKwkvKiBTa2lwIGZvcndhcmRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkICovCisJc3dpdGNoIChmdHlwZSkgeworCWNhc2UgTVVYX0ZXRF9MT0NBTDoKKwljYXNlIE1VWF9GV0RfRFlOQU1JQzoKKwkJZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubnVtX2xvY2FsX2ZvcndhcmRzOyBpKyspIHsKKwkJCWlmIChjb21wYXJlX2ZvcndhcmQoJmZ3ZCwKKwkJCSAgICBvcHRpb25zLmxvY2FsX2ZvcndhcmRzICsgaSkpIHsKKyBleGlzdHM6CisJCQkJZGVidWcyKCIlczogZm91bmQgZXhpc3RpbmcgZm9yd2FyZGluZyIsCisJCQkJICAgIF9fZnVuY19fKTsKKwkJCQlidWZmZXJfcHV0X2ludChyLCBNVVhfU19PSyk7CisJCQkJYnVmZmVyX3B1dF9pbnQociwgcmlkKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIE1VWF9GV0RfUkVNT1RFOgorCQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1fcmVtb3RlX2ZvcndhcmRzOyBpKyspIHsKKwkJCWlmIChjb21wYXJlX2ZvcndhcmQoJmZ3ZCwKKwkJCSAgICBvcHRpb25zLnJlbW90ZV9mb3J3YXJkcyArIGkpKSB7CisJCQkJaWYgKGZ3ZC5saXN0ZW5fcG9ydCAhPSAwKQorCQkJCQlnb3RvIGV4aXN0czsKKwkJCQlkZWJ1ZzIoIiVzOiBmb3VuZCBhbGxvY2F0ZWQgcG9ydCIsCisJCQkJICAgIF9fZnVuY19fKTsKKwkJCQlidWZmZXJfcHV0X2ludChyLCBNVVhfU19SRU1PVEVfUE9SVCk7CisJCQkJYnVmZmVyX3B1dF9pbnQociwgcmlkKTsKKwkJCQlidWZmZXJfcHV0X2ludChyLAorCQkJCSAgICBvcHRpb25zLnJlbW90ZV9mb3J3YXJkc1tpXS5hbGxvY2F0ZWRfcG9ydCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCisJaWYgKG9wdGlvbnMuY29udHJvbF9tYXN0ZXIgPT0gU1NIQ1RMX01BU1RFUl9BU0sgfHwKKwkgICAgb3B0aW9ucy5jb250cm9sX21hc3RlciA9PSBTU0hDVExfTUFTVEVSX0FVVE9fQVNLKSB7CisJCWlmICghYXNrX3Blcm1pc3Npb24oIk9wZW4gJXMgb24gJXM/IiwgZndkX2Rlc2MsIGhvc3QpKSB7CisJCQlkZWJ1ZzIoIiVzOiBmb3J3YXJkaW5nIHJlZnVzZWQgYnkgdXNlciIsIF9fZnVuY19fKTsKKwkJCWJ1ZmZlcl9wdXRfaW50KHIsIE1VWF9TX1BFUk1JU1NJT05fREVOSUVEKTsKKwkJCWJ1ZmZlcl9wdXRfaW50KHIsIHJpZCk7CisJCQlidWZmZXJfcHV0X2NzdHJpbmcociwgIlBlcm1pc3Npb24gZGVuaWVkIik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChmdHlwZSA9PSBNVVhfRldEX0xPQ0FMIHx8IGZ0eXBlID09IE1VWF9GV0RfRFlOQU1JQykgeworCQlpZiAoY2hhbm5lbF9zZXR1cF9sb2NhbF9md2RfbGlzdGVuZXIoZndkLmxpc3Rlbl9ob3N0LAorCQkgICAgZndkLmxpc3Rlbl9wb3J0LCBmd2QuY29ubmVjdF9ob3N0LCBmd2QuY29ubmVjdF9wb3J0LAorCQkgICAgb3B0aW9ucy5nYXRld2F5X3BvcnRzKSA8IDApIHsKKyBmYWlsOgorCQkJbG9naXQoInNsYXZlLXJlcXVlc3RlZCAlcyBmYWlsZWQiLCBmd2RfZGVzYyk7CisJCQlidWZmZXJfcHV0X2ludChyLCBNVVhfU19GQUlMVVJFKTsKKwkJCWJ1ZmZlcl9wdXRfaW50KHIsIHJpZCk7CisJCQlidWZmZXJfcHV0X2NzdHJpbmcociwgIlBvcnQgZm9yd2FyZGluZyBmYWlsZWQiKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWFkZF9sb2NhbF9mb3J3YXJkKCZvcHRpb25zLCAmZndkKTsKKwkJZnJlZWZ3ZCA9IDA7CisJfSBlbHNlIHsKKwkJc3RydWN0IG11eF9jaGFubmVsX2NvbmZpcm1fY3R4ICpmY3R4OworCisJCWZ3ZC5oYW5kbGUgPSBjaGFubmVsX3JlcXVlc3RfcmVtb3RlX2ZvcndhcmRpbmcoZndkLmxpc3Rlbl9ob3N0LAorCQkgICAgZndkLmxpc3Rlbl9wb3J0LCBmd2QuY29ubmVjdF9ob3N0LCBmd2QuY29ubmVjdF9wb3J0KTsKKwkJaWYgKGZ3ZC5oYW5kbGUgPCAwKQorCQkJZ290byBmYWlsOworCQlhZGRfcmVtb3RlX2ZvcndhcmQoJm9wdGlvbnMsICZmd2QpOworCQlmY3R4ID0geGNhbGxvYygxLCBzaXplb2YoKmZjdHgpKTsKKwkJZmN0eC0+Y2lkID0gYy0+c2VsZjsKKwkJZmN0eC0+cmlkID0gcmlkOworCQlmY3R4LT5maWQgPSBvcHRpb25zLm51bV9yZW1vdGVfZm9yd2FyZHMgLSAxOworCQljbGllbnRfcmVnaXN0ZXJfZ2xvYmFsX2NvbmZpcm0obXV4X2NvbmZpcm1fcmVtb3RlX2ZvcndhcmQsCisJCSAgICBmY3R4KTsKKwkJZnJlZWZ3ZCA9IDA7CisJCWMtPm11eF9wYXVzZSA9IDE7IC8qIHdhaXQgZm9yIG11eF9jb25maXJtX3JlbW90ZV9mb3J3YXJkICovCisJCS8qIGRlbGF5ZWQgcmVwbHkgaW4gbXV4X2NvbmZpcm1fcmVtb3RlX2ZvcndhcmQgKi8KKwkJZ290byBvdXQ7CisJfQorCWJ1ZmZlcl9wdXRfaW50KHIsIE1VWF9TX09LKTsKKwlidWZmZXJfcHV0X2ludChyLCByaWQpOworIG91dDoKKwlpZiAoZndkX2Rlc2MgIT0gTlVMTCkKKwkJeGZyZWUoZndkX2Rlc2MpOworCWlmIChmcmVlZndkKSB7CisJCWlmIChmd2QubGlzdGVuX2hvc3QgIT0gTlVMTCkKKwkJCXhmcmVlKGZ3ZC5saXN0ZW5faG9zdCk7CisJCWlmIChmd2QuY29ubmVjdF9ob3N0ICE9IE5VTEwpCisJCQl4ZnJlZShmd2QuY29ubmVjdF9ob3N0KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorcHJvY2Vzc19tdXhfY2xvc2VfZndkKHVfaW50IHJpZCwgQ2hhbm5lbCAqYywgQnVmZmVyICptLCBCdWZmZXIgKnIpCit7CisJRm9yd2FyZCBmd2QsICpmb3VuZF9md2Q7CisJY2hhciAqZndkX2Rlc2MgPSBOVUxMOworCWNvbnN0IGNoYXIgKmVycm9yX3JlYXNvbiA9IE5VTEw7CisJdV9pbnQgZnR5cGU7CisJaW50IGksIGxpc3Rlbl9wb3J0LCByZXQgPSAwOworCisJZndkLmxpc3Rlbl9ob3N0ID0gZndkLmNvbm5lY3RfaG9zdCA9IE5VTEw7CisJaWYgKGJ1ZmZlcl9nZXRfaW50X3JldCgmZnR5cGUsIG0pICE9IDAgfHwKKwkgICAgKGZ3ZC5saXN0ZW5faG9zdCA9IGJ1ZmZlcl9nZXRfc3RyaW5nX3JldChtLCBOVUxMKSkgPT0gTlVMTCB8fAorCSAgICBidWZmZXJfZ2V0X2ludF9yZXQoJmZ3ZC5saXN0ZW5fcG9ydCwgbSkgIT0gMCB8fAorCSAgICAoZndkLmNvbm5lY3RfaG9zdCA9IGJ1ZmZlcl9nZXRfc3RyaW5nX3JldChtLCBOVUxMKSkgPT0gTlVMTCB8fAorCSAgICBidWZmZXJfZ2V0X2ludF9yZXQoJmZ3ZC5jb25uZWN0X3BvcnQsIG0pICE9IDApIHsKKwkJZXJyb3IoIiVzOiBtYWxmb3JtZWQgbWVzc2FnZSIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCWlmICgqZndkLmxpc3Rlbl9ob3N0ID09ICdcMCcpIHsKKwkJeGZyZWUoZndkLmxpc3Rlbl9ob3N0KTsKKwkJZndkLmxpc3Rlbl9ob3N0ID0gTlVMTDsKKwl9CisJaWYgKCpmd2QuY29ubmVjdF9ob3N0ID09ICdcMCcpIHsKKwkJeGZyZWUoZndkLmNvbm5lY3RfaG9zdCk7CisJCWZ3ZC5jb25uZWN0X2hvc3QgPSBOVUxMOworCX0KKworCWRlYnVnMigiJXM6IGNoYW5uZWwgJWQ6IHJlcXVlc3QgY2FuY2VsICVzIiwgX19mdW5jX18sIGMtPnNlbGYsCisJICAgIChmd2RfZGVzYyA9IGZvcm1hdF9mb3J3YXJkKGZ0eXBlLCAmZndkKSkpOworCisJLyogbWFrZSBzdXJlIHRoaXMgaGFzIGJlZW4gcmVxdWVzdGVkICovCisJZm91bmRfZndkID0gTlVMTDsKKwlzd2l0Y2ggKGZ0eXBlKSB7CisJY2FzZSBNVVhfRldEX0xPQ0FMOgorCWNhc2UgTVVYX0ZXRF9EWU5BTUlDOgorCQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1fbG9jYWxfZm9yd2FyZHM7IGkrKykgeworCQkJaWYgKGNvbXBhcmVfZm9yd2FyZCgmZndkLAorCQkJICAgIG9wdGlvbnMubG9jYWxfZm9yd2FyZHMgKyBpKSkgeworCQkJCWZvdW5kX2Z3ZCA9IG9wdGlvbnMubG9jYWxfZm9yd2FyZHMgKyBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgTVVYX0ZXRF9SRU1PVEU6CisJCWZvciAoaSA9IDA7IGkgPCBvcHRpb25zLm51bV9yZW1vdGVfZm9yd2FyZHM7IGkrKykgeworCQkJaWYgKGNvbXBhcmVfZm9yd2FyZCgmZndkLAorCQkJICAgIG9wdGlvbnMucmVtb3RlX2ZvcndhcmRzICsgaSkpIHsKKwkJCQlmb3VuZF9md2QgPSBvcHRpb25zLnJlbW90ZV9mb3J3YXJkcyArIGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCisJaWYgKGZvdW5kX2Z3ZCA9PSBOVUxMKQorCQllcnJvcl9yZWFzb24gPSAicG9ydCBub3QgZm9yd2FyZGVkIjsKKwllbHNlIGlmIChmdHlwZSA9PSBNVVhfRldEX1JFTU9URSkgeworCQkvKgorCQkgKiBUaGlzIHNob3VsZG4ndCBmYWlsIHVubGVzcyB3ZSBjb25mdXNlZCB0aGUgaG9zdC9wb3J0CisJCSAqIGJldHdlZW4gb3B0aW9ucy5yZW1vdGVfZm9yd2FyZHMgYW5kIHBlcm1pdHRlZF9vcGVucy4KKwkJICogSG93ZXZlciwgZm9yIGR5bmFtaWMgYWxsb2NhdGVkIGxpc3RlbiBwb3J0cyB3ZSBuZWVkCisJCSAqIHRvIGxvb2t1cCB0aGUgYWN0dWFsIGxpc3RlbiBwb3J0LgorCQkgKi8KKwkgICAgICAgIGxpc3Rlbl9wb3J0ID0gKGZ3ZC5saXN0ZW5fcG9ydCA9PSAwKSA/CisJCSAgICBmb3VuZF9md2QtPmFsbG9jYXRlZF9wb3J0IDogZndkLmxpc3Rlbl9wb3J0OworCQlpZiAoY2hhbm5lbF9yZXF1ZXN0X3Jmb3J3YXJkX2NhbmNlbChmd2QubGlzdGVuX2hvc3QsCisJCSAgICBsaXN0ZW5fcG9ydCkgPT0gLTEpCisJCQllcnJvcl9yZWFzb24gPSAicG9ydCBub3QgaW4gcGVybWl0dGVkIG9wZW5zIjsKKwl9IGVsc2UgewkvKiBsb2NhbCBhbmQgZHluYW1pYyBmb3J3YXJkcyAqLworCQkvKiBEaXR0byAqLworCQlpZiAoY2hhbm5lbF9jYW5jZWxfbHBvcnRfbGlzdGVuZXIoZndkLmxpc3Rlbl9ob3N0LAorCQkgICAgZndkLmxpc3Rlbl9wb3J0LCBmd2QuY29ubmVjdF9wb3J0LAorCQkgICAgb3B0aW9ucy5nYXRld2F5X3BvcnRzKSA9PSAtMSkKKwkJCWVycm9yX3JlYXNvbiA9ICJwb3J0IG5vdCBmb3VuZCI7CisJfQorCisJaWYgKGVycm9yX3JlYXNvbiA9PSBOVUxMKSB7CisJCWJ1ZmZlcl9wdXRfaW50KHIsIE1VWF9TX09LKTsKKwkJYnVmZmVyX3B1dF9pbnQociwgcmlkKTsKKworCQlpZiAoZm91bmRfZndkLT5saXN0ZW5faG9zdCAhPSBOVUxMKQorCQkJeGZyZWUoZm91bmRfZndkLT5saXN0ZW5faG9zdCk7CisJCWlmIChmb3VuZF9md2QtPmNvbm5lY3RfaG9zdCAhPSBOVUxMKQorCQkJeGZyZWUoZm91bmRfZndkLT5jb25uZWN0X2hvc3QpOworCQlmb3VuZF9md2QtPmxpc3Rlbl9ob3N0ID0gZm91bmRfZndkLT5jb25uZWN0X2hvc3QgPSBOVUxMOworCQlmb3VuZF9md2QtPmxpc3Rlbl9wb3J0ID0gZm91bmRfZndkLT5jb25uZWN0X3BvcnQgPSAwOworCX0gZWxzZSB7CisJCWJ1ZmZlcl9wdXRfaW50KHIsIE1VWF9TX0ZBSUxVUkUpOworCQlidWZmZXJfcHV0X2ludChyLCByaWQpOworCQlidWZmZXJfcHV0X2NzdHJpbmcociwgZXJyb3JfcmVhc29uKTsKKwl9Cisgb3V0OgorCWlmIChmd2RfZGVzYyAhPSBOVUxMKQorCQl4ZnJlZShmd2RfZGVzYyk7CisJaWYgKGZ3ZC5saXN0ZW5faG9zdCAhPSBOVUxMKQorCQl4ZnJlZShmd2QubGlzdGVuX2hvc3QpOworCWlmIChmd2QuY29ubmVjdF9ob3N0ICE9IE5VTEwpCisJCXhmcmVlKGZ3ZC5jb25uZWN0X2hvc3QpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorcHJvY2Vzc19tdXhfc3RkaW9fZndkKHVfaW50IHJpZCwgQ2hhbm5lbCAqYywgQnVmZmVyICptLCBCdWZmZXIgKnIpCit7CisJQ2hhbm5lbCAqbmM7CisJY2hhciAqcmVzZXJ2ZWQsICpjaG9zdDsKKwl1X2ludCBjcG9ydCwgaSwgajsKKwlpbnQgbmV3X2ZkWzJdOworCisJY2hvc3QgPSByZXNlcnZlZCA9IE5VTEw7CisJaWYgKChyZXNlcnZlZCA9IGJ1ZmZlcl9nZXRfc3RyaW5nX3JldChtLCBOVUxMKSkgPT0gTlVMTCB8fAorCSAgIChjaG9zdCA9IGJ1ZmZlcl9nZXRfc3RyaW5nX3JldChtLCBOVUxMKSkgPT0gTlVMTCB8fAorCSAgICBidWZmZXJfZ2V0X2ludF9yZXQoJmNwb3J0LCBtKSAhPSAwKSB7CisJCWlmIChyZXNlcnZlZCAhPSBOVUxMKQorCQkJeGZyZWUocmVzZXJ2ZWQpOworCQlpZiAoY2hvc3QgIT0gTlVMTCkKKwkJCXhmcmVlKGNob3N0KTsKKwkJZXJyb3IoIiVzOiBtYWxmb3JtZWQgbWVzc2FnZSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKwl4ZnJlZShyZXNlcnZlZCk7CisKKwlkZWJ1ZzIoIiVzOiBjaGFubmVsICVkOiByZXF1ZXN0IHN0ZGlvIGZ3ZCB0byAlczoldSIsCisJICAgIF9fZnVuY19fLCBjLT5zZWxmLCBjaG9zdCwgY3BvcnQpOworCisJLyogR2F0aGVyIGZkcyBmcm9tIGNsaWVudCAqLworCWZvcihpID0gMDsgaSA8IDI7IGkrKykgeworCQlpZiAoKG5ld19mZFtpXSA9IG1tX3JlY2VpdmVfZmQoYy0+c29jaykpID09IC0xKSB7CisJCQllcnJvcigiJXM6IGZhaWxlZCB0byByZWNlaXZlIGZkICVkIGZyb20gc2xhdmUiLAorCQkJICAgIF9fZnVuY19fLCBpKTsKKwkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJCQkJY2xvc2UobmV3X2ZkW2pdKTsKKwkJCXhmcmVlKGNob3N0KTsKKworCQkJLyogcHJlcGFyZSByZXBseSAqLworCQkJYnVmZmVyX3B1dF9pbnQociwgTVVYX1NfRkFJTFVSRSk7CisJCQlidWZmZXJfcHV0X2ludChyLCByaWQpOworCQkJYnVmZmVyX3B1dF9jc3RyaW5nKHIsCisJCQkgICAgImRpZCBub3QgcmVjZWl2ZSBmaWxlIGRlc2NyaXB0b3JzIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlkZWJ1ZzMoIiVzOiBnb3QgZmRzIHN0ZGluICVkLCBzdGRvdXQgJWQiLCBfX2Z1bmNfXywKKwkgICAgbmV3X2ZkWzBdLCBuZXdfZmRbMV0pOworCisJLyogWFhYIHN1cHBvcnQgbXVsdGlwbGUgY2hpbGQgc2Vzc2lvbnMgaW4gZnV0dXJlICovCisJaWYgKGMtPnJlbW90ZV9pZCAhPSAtMSkgeworCQlkZWJ1ZzIoIiVzOiBzZXNzaW9uIGFscmVhZHkgb3BlbiIsIF9fZnVuY19fKTsKKwkJLyogcHJlcGFyZSByZXBseSAqLworCQlidWZmZXJfcHV0X2ludChyLCBNVVhfU19GQUlMVVJFKTsKKwkJYnVmZmVyX3B1dF9pbnQociwgcmlkKTsKKwkJYnVmZmVyX3B1dF9jc3RyaW5nKHIsICJNdWx0aXBsZSBzZXNzaW9ucyBub3Qgc3VwcG9ydGVkIik7CisgY2xlYW51cDoKKwkJY2xvc2UobmV3X2ZkWzBdKTsKKwkJY2xvc2UobmV3X2ZkWzFdKTsKKwkJeGZyZWUoY2hvc3QpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAob3B0aW9ucy5jb250cm9sX21hc3RlciA9PSBTU0hDVExfTUFTVEVSX0FTSyB8fAorCSAgICBvcHRpb25zLmNvbnRyb2xfbWFzdGVyID09IFNTSENUTF9NQVNURVJfQVVUT19BU0spIHsKKwkJaWYgKCFhc2tfcGVybWlzc2lvbigiQWxsb3cgZm9yd2FyZCB0byAlczoldT8gIiwKKwkJICAgIGNob3N0LCBjcG9ydCkpIHsKKwkJCWRlYnVnMigiJXM6IHN0ZGlvIGZ3ZCByZWZ1c2VkIGJ5IHVzZXIiLCBfX2Z1bmNfXyk7CisJCQkvKiBwcmVwYXJlIHJlcGx5ICovCisJCQlidWZmZXJfcHV0X2ludChyLCBNVVhfU19QRVJNSVNTSU9OX0RFTklFRCk7CisJCQlidWZmZXJfcHV0X2ludChyLCByaWQpOworCQkJYnVmZmVyX3B1dF9jc3RyaW5nKHIsICJQZXJtaXNzaW9uIGRlbmllZCIpOworCQkJZ290byBjbGVhbnVwOworCQl9CisJfQorCisJLyogZW5hYmxlIG5vbmJsb2NraW5nIHVubGVzcyB0dHkgKi8KKwlpZiAoIWlzYXR0eShuZXdfZmRbMF0pKQorCQlzZXRfbm9uYmxvY2sobmV3X2ZkWzBdKTsKKwlpZiAoIWlzYXR0eShuZXdfZmRbMV0pKQorCQlzZXRfbm9uYmxvY2sobmV3X2ZkWzFdKTsKKworCW5jID0gY2hhbm5lbF9jb25uZWN0X3N0ZGlvX2Z3ZChjaG9zdCwgY3BvcnQsIG5ld19mZFswXSwgbmV3X2ZkWzFdKTsKKworCW5jLT5jdGxfY2hhbiA9IGMtPnNlbGY7CQkvKiBsaW5rIHNlc3Npb24gLT4gY29udHJvbCBjaGFubmVsICovCisJYy0+cmVtb3RlX2lkID0gbmMtPnNlbGY7IAkvKiBsaW5rIGNvbnRyb2wgLT4gc2Vzc2lvbiBjaGFubmVsICovCisKKwlkZWJ1ZzIoIiVzOiBjaGFubmVsX25ldzogJWQgbGlua2VkIHRvIGNvbnRyb2wgY2hhbm5lbCAlZCIsCisJICAgIF9fZnVuY19fLCBuYy0+c2VsZiwgbmMtPmN0bF9jaGFuKTsKKworCWNoYW5uZWxfcmVnaXN0ZXJfY2xlYW51cChuYy0+c2VsZiwgbXV4X21hc3Rlcl9zZXNzaW9uX2NsZWFudXBfY2IsIDEpOworCisJLyogcHJlcGFyZSByZXBseSAqLworCS8qIFhYWCBkZWZlciB1bnRpbCBjaGFubmVsIGNvbmZpcm1lZCAqLworCWJ1ZmZlcl9wdXRfaW50KHIsIE1VWF9TX1NFU1NJT05fT1BFTkVEKTsKKwlidWZmZXJfcHV0X2ludChyLCByaWQpOworCWJ1ZmZlcl9wdXRfaW50KHIsIG5jLT5zZWxmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citwcm9jZXNzX211eF9zdG9wX2xpc3RlbmluZyh1X2ludCByaWQsIENoYW5uZWwgKmMsIEJ1ZmZlciAqbSwgQnVmZmVyICpyKQoreworCWRlYnVnKCIlczogY2hhbm5lbCAlZDogc3RvcCBsaXN0ZW5pbmciLCBfX2Z1bmNfXywgYy0+c2VsZik7CisKKwlpZiAob3B0aW9ucy5jb250cm9sX21hc3RlciA9PSBTU0hDVExfTUFTVEVSX0FTSyB8fAorCSAgICBvcHRpb25zLmNvbnRyb2xfbWFzdGVyID09IFNTSENUTF9NQVNURVJfQVVUT19BU0spIHsKKwkJaWYgKCFhc2tfcGVybWlzc2lvbigiRGlzYWJsZSBmdXJ0aGVyIG11bHRpcGxleGluZyBvbiBzaGFyZWQgIgorCQkgICAgImNvbm5lY3Rpb24gdG8gJXM/ICIsIGhvc3QpKSB7CisJCQlkZWJ1ZzIoIiVzOiBzdG9wIGxpc3RlbiByZWZ1c2VkIGJ5IHVzZXIiLCBfX2Z1bmNfXyk7CisJCQlidWZmZXJfcHV0X2ludChyLCBNVVhfU19QRVJNSVNTSU9OX0RFTklFRCk7CisJCQlidWZmZXJfcHV0X2ludChyLCByaWQpOworCQkJYnVmZmVyX3B1dF9jc3RyaW5nKHIsICJQZXJtaXNzaW9uIGRlbmllZCIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAobXV4X2xpc3RlbmVyX2NoYW5uZWwgIT0gTlVMTCkgeworCQljaGFubmVsX2ZyZWUobXV4X2xpc3RlbmVyX2NoYW5uZWwpOworCQljbGllbnRfc3RvcF9tdXgoKTsKKwkJeGZyZWUob3B0aW9ucy5jb250cm9sX3BhdGgpOworCQlvcHRpb25zLmNvbnRyb2xfcGF0aCA9IE5VTEw7CisJCW11eF9saXN0ZW5lcl9jaGFubmVsID0gTlVMTDsKKwkJbXV4c2VydmVyX3NvY2sgPSAtMTsKKwl9CisKKwkvKiBwcmVwYXJlIHJlcGx5ICovCisJYnVmZmVyX3B1dF9pbnQociwgTVVYX1NfT0spOworCWJ1ZmZlcl9wdXRfaW50KHIsIHJpZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2hhbm5lbCBjYWxsYmFja3MgZmlyZWQgb24gcmVhZC93cml0ZSBmcm9tIG11eCBzbGF2ZSBmZCAqLworc3RhdGljIGludAorbXV4X21hc3Rlcl9yZWFkX2NiKENoYW5uZWwgKmMpCit7CisJc3RydWN0IG11eF9tYXN0ZXJfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBtdXhfbWFzdGVyX3N0YXRlICopYy0+bXV4X2N0eDsKKwlCdWZmZXIgaW4sIG91dDsKKwl2b2lkICpwdHI7CisJdV9pbnQgdHlwZSwgcmlkLCBoYXZlLCBpOworCWludCByZXQgPSAtMTsKKworCS8qIFNldHVwIGN0eCBhbmQgICovCisJaWYgKGMtPm11eF9jdHggPT0gTlVMTCkgeworCQlzdGF0ZSA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpzdGF0ZSkpOworCQljLT5tdXhfY3R4ID0gc3RhdGU7CisJCWNoYW5uZWxfcmVnaXN0ZXJfY2xlYW51cChjLT5zZWxmLAorCQkgICAgbXV4X21hc3Rlcl9jb250cm9sX2NsZWFudXBfY2IsIDApOworCisJCS8qIFNlbmQgaGVsbG8gKi8KKwkJYnVmZmVyX2luaXQoJm91dCk7CisJCWJ1ZmZlcl9wdXRfaW50KCZvdXQsIE1VWF9NU0dfSEVMTE8pOworCQlidWZmZXJfcHV0X2ludCgmb3V0LCBTU0hNVVhfVkVSKTsKKwkJLyogbm8gZXh0ZW5zaW9ucyAqLworCQlidWZmZXJfcHV0X3N0cmluZygmYy0+b3V0cHV0LCBidWZmZXJfcHRyKCZvdXQpLAorCQkgICAgYnVmZmVyX2xlbigmb3V0KSk7CisJCWJ1ZmZlcl9mcmVlKCZvdXQpOworCQlkZWJ1ZzMoIiVzOiBjaGFubmVsICVkOiBoZWxsbyBzZW50IiwgX19mdW5jX18sIGMtPnNlbGYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlidWZmZXJfaW5pdCgmaW4pOworCWJ1ZmZlcl9pbml0KCZvdXQpOworCisJLyogQ2hhbm5lbCBjb2RlIGVuc3VyZXMgdGhhdCB3ZSByZWNlaXZlIHdob2xlIHBhY2tldHMgKi8KKwlpZiAoKHB0ciA9IGJ1ZmZlcl9nZXRfc3RyaW5nX3B0cl9yZXQoJmMtPmlucHV0LCAmaGF2ZSkpID09IE5VTEwpIHsKKyBtYWxmOgorCQllcnJvcigiJXM6IG1hbGZvcm1lZCBtZXNzYWdlIiwgX19mdW5jX18pOworCQlnb3RvIG91dDsKKwl9CisJYnVmZmVyX2FwcGVuZCgmaW4sIHB0ciwgaGF2ZSk7CisKKwlpZiAoYnVmZmVyX2dldF9pbnRfcmV0KCZ0eXBlLCAmaW4pICE9IDApCisJCWdvdG8gbWFsZjsKKwlkZWJ1ZzMoIiVzOiBjaGFubmVsICVkIHBhY2tldCB0eXBlIDB4JTA4eCBsZW4gJXUiLAorCSAgICBfX2Z1bmNfXywgYy0+c2VsZiwgdHlwZSwgYnVmZmVyX2xlbigmaW4pKTsKKworCWlmICh0eXBlID09IE1VWF9NU0dfSEVMTE8pCisJCXJpZCA9IDA7CisJZWxzZSB7CisJCWlmICghc3RhdGUtPmhlbGxvX3JjdmQpIHsKKwkJCWVycm9yKCIlczogZXhwZWN0ZWQgTVVYX01TR19IRUxMTygweCUwOHgpLCAiCisJCQkgICAgInJlY2VpdmVkIDB4JTA4eCIsIF9fZnVuY19fLCBNVVhfTVNHX0hFTExPLCB0eXBlKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChidWZmZXJfZ2V0X2ludF9yZXQoJnJpZCwgJmluKSAhPSAwKQorCQkJZ290byBtYWxmOworCX0KKworCWZvciAoaSA9IDA7IG11eF9tYXN0ZXJfaGFuZGxlcnNbaV0uaGFuZGxlciAhPSBOVUxMOyBpKyspIHsKKwkJaWYgKHR5cGUgPT0gbXV4X21hc3Rlcl9oYW5kbGVyc1tpXS50eXBlKSB7CisJCQlyZXQgPSBtdXhfbWFzdGVyX2hhbmRsZXJzW2ldLmhhbmRsZXIocmlkLCBjLCAmaW4sICZvdXQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKG11eF9tYXN0ZXJfaGFuZGxlcnNbaV0uaGFuZGxlciA9PSBOVUxMKSB7CisJCWVycm9yKCIlczogdW5zdXBwb3J0ZWQgbXV4IG1lc3NhZ2UgMHglMDh4IiwgX19mdW5jX18sIHR5cGUpOworCQlidWZmZXJfcHV0X2ludCgmb3V0LCBNVVhfU19GQUlMVVJFKTsKKwkJYnVmZmVyX3B1dF9pbnQoJm91dCwgcmlkKTsKKwkJYnVmZmVyX3B1dF9jc3RyaW5nKCZvdXQsICJ1bnN1cHBvcnRlZCByZXF1ZXN0Iik7CisJCXJldCA9IDA7CisJfQorCS8qIEVucXVldWUgcmVwbHkgcGFja2V0ICovCisJaWYgKGJ1ZmZlcl9sZW4oJm91dCkgIT0gMCkgeworCQlidWZmZXJfcHV0X3N0cmluZygmYy0+b3V0cHV0LCBidWZmZXJfcHRyKCZvdXQpLAorCQkgICAgYnVmZmVyX2xlbigmb3V0KSk7CisJfQorIG91dDoKKwlidWZmZXJfZnJlZSgmaW4pOworCWJ1ZmZlcl9mcmVlKCZvdXQpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK211eF9leGl0X21lc3NhZ2UoQ2hhbm5lbCAqYywgaW50IGV4aXR2YWwpCit7CisJQnVmZmVyIG07CisJQ2hhbm5lbCAqbXV4X2NoYW47CisKKwlkZWJ1ZzMoIiVzOiBjaGFubmVsICVkOiBleGl0IG1lc3NhZ2UsIGV2aXR2YWwgJWQiLCBfX2Z1bmNfXywgYy0+c2VsZiwKKwkgICAgZXhpdHZhbCk7CisKKwlpZiAoKG11eF9jaGFuID0gY2hhbm5lbF9ieV9pZChjLT5jdGxfY2hhbikpID09IE5VTEwpCisJCWZhdGFsKCIlczogY2hhbm5lbCAlZCBtaXNzaW5nIG11eCBjaGFubmVsICVkIiwKKwkJICAgIF9fZnVuY19fLCBjLT5zZWxmLCBjLT5jdGxfY2hhbik7CisKKwkvKiBBcHBlbmQgZXhpdCBtZXNzYWdlIHBhY2tldCB0byBjb250cm9sIHNvY2tldCBvdXRwdXQgcXVldWUgKi8KKwlidWZmZXJfaW5pdCgmbSk7CisJYnVmZmVyX3B1dF9pbnQoJm0sIE1VWF9TX0VYSVRfTUVTU0FHRSk7CisJYnVmZmVyX3B1dF9pbnQoJm0sIGMtPnNlbGYpOworCWJ1ZmZlcl9wdXRfaW50KCZtLCBleGl0dmFsKTsKKworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtdXhfY2hhbi0+b3V0cHV0LCBidWZmZXJfcHRyKCZtKSwgYnVmZmVyX2xlbigmbSkpOworCWJ1ZmZlcl9mcmVlKCZtKTsKK30KKwordm9pZAorbXV4X3R0eV9hbGxvY19mYWlsZWQoQ2hhbm5lbCAqYykKK3sKKwlCdWZmZXIgbTsKKwlDaGFubmVsICptdXhfY2hhbjsKKworCWRlYnVnMygiJXM6IGNoYW5uZWwgJWQ6IFRUWSBhbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXywgYy0+c2VsZik7CisKKwlpZiAoKG11eF9jaGFuID0gY2hhbm5lbF9ieV9pZChjLT5jdGxfY2hhbikpID09IE5VTEwpCisJCWZhdGFsKCIlczogY2hhbm5lbCAlZCBtaXNzaW5nIG11eCBjaGFubmVsICVkIiwKKwkJICAgIF9fZnVuY19fLCBjLT5zZWxmLCBjLT5jdGxfY2hhbik7CisKKwkvKiBBcHBlbmQgZXhpdCBtZXNzYWdlIHBhY2tldCB0byBjb250cm9sIHNvY2tldCBvdXRwdXQgcXVldWUgKi8KKwlidWZmZXJfaW5pdCgmbSk7CisJYnVmZmVyX3B1dF9pbnQoJm0sIE1VWF9TX1RUWV9BTExPQ19GQUlMKTsKKwlidWZmZXJfcHV0X2ludCgmbSwgYy0+c2VsZik7CisKKwlidWZmZXJfcHV0X3N0cmluZygmbXV4X2NoYW4tPm91dHB1dCwgYnVmZmVyX3B0cigmbSksIGJ1ZmZlcl9sZW4oJm0pKTsKKwlidWZmZXJfZnJlZSgmbSk7Cit9CisKKy8qIFByZXBhcmUgYSBtdXggbWFzdGVyIHRvIGxpc3RlbiBvbiBhIFVuaXggZG9tYWluIHNvY2tldC4gKi8KK3ZvaWQKK211eHNlcnZlcl9saXN0ZW4odm9pZCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcjsKKwlzb2NrbGVuX3Qgc3VuX2xlbjsKKwltb2RlX3Qgb2xkX3VtYXNrOworCWNoYXIgKm9yaWdfY29udHJvbF9wYXRoID0gb3B0aW9ucy5jb250cm9sX3BhdGg7CisJY2hhciByYnVmWzE2KzFdOworCXVfaW50IGksIHI7CisKKwlpZiAob3B0aW9ucy5jb250cm9sX3BhdGggPT0gTlVMTCB8fAorCSAgICBvcHRpb25zLmNvbnRyb2xfbWFzdGVyID09IFNTSENUTF9NQVNURVJfTk8pCisJCXJldHVybjsKKworCWRlYnVnKCJzZXR0aW5nIHVwIG11bHRpcGxleCBtYXN0ZXIgc29ja2V0Iik7CisKKwkvKgorCSAqIFVzZSBhIHRlbXBvcmFyeSBwYXRoIGJlZm9yZSBsaXN0ZW4gc28gd2UgY2FuIHBzZXVkby1hdG9taWNhbGx5CisJICogZXN0YWJsaXNoIHRoZSBsaXN0ZW5pbmcgc29ja2V0IGluIGl0cyBmaW5hbCBsb2NhdGlvbiB0byBhdm9pZAorCSAqIG90aGVyIHByb2Nlc3NlcyByYWNpbmcgaW4gYmV0d2VlbiBiaW5kKCkgYW5kIGxpc3RlbigpIGFuZCBoaXR0aW5nCisJICogYW4gdW5yZWFkeSBzb2NrZXQuCisJICovCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihyYnVmKSAtIDE7IGkrKykgeworCQlyID0gYXJjNHJhbmRvbV91bmlmb3JtKDI2KzI2KzEwKTsKKwkJcmJ1ZltpXSA9IChyIDwgMjYpID8gJ2EnICsgciA6CisJCSAgICAociA8IDI2KjIpID8gJ0EnICsgciAtIDI2IDoKKwkJICAgICcwJyArIHIgLSAyNiAtIDI2OworCX0KKwlyYnVmW3NpemVvZihyYnVmKSAtIDFdID0gJ1wwJzsKKwlvcHRpb25zLmNvbnRyb2xfcGF0aCA9IE5VTEw7CisJeGFzcHJpbnRmKCZvcHRpb25zLmNvbnRyb2xfcGF0aCwgIiVzLiVzIiwgb3JpZ19jb250cm9sX3BhdGgsIHJidWYpOworCWRlYnVnMygiJXM6IHRlbXBvcmFyeSBjb250cm9sIHBhdGggJXMiLCBfX2Z1bmNfXywgb3B0aW9ucy5jb250cm9sX3BhdGgpOworCisJbWVtc2V0KCZhZGRyLCAnXDAnLCBzaXplb2YoYWRkcikpOworCWFkZHIuc3VuX2ZhbWlseSA9IEFGX1VOSVg7CisJc3VuX2xlbiA9IG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpICsKKwkgICAgc3RybGVuKG9wdGlvbnMuY29udHJvbF9wYXRoKSArIDE7CisKKwlpZiAoc3RybGNweShhZGRyLnN1bl9wYXRoLCBvcHRpb25zLmNvbnRyb2xfcGF0aCwKKwkgICAgc2l6ZW9mKGFkZHIuc3VuX3BhdGgpKSA+PSBzaXplb2YoYWRkci5zdW5fcGF0aCkpIHsKKwkJZXJyb3IoIkNvbnRyb2xQYXRoIFwiJXNcIiB0b28gbG9uZyBmb3IgVW5peCBkb21haW4gc29ja2V0IiwKKwkJICAgIG9wdGlvbnMuY29udHJvbF9wYXRoKTsKKwkJZ290byBkaXNhYmxlX211eF9tYXN0ZXI7CisJfQorCisJaWYgKChtdXhzZXJ2ZXJfc29jayA9IHNvY2tldChQRl9VTklYLCBTT0NLX1NUUkVBTSwgMCkpIDwgMCkKKwkJZmF0YWwoIiVzIHNvY2tldCgpOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCisJb2xkX3VtYXNrID0gdW1hc2soMDE3Nyk7CisJaWYgKGJpbmQobXV4c2VydmVyX3NvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc3VuX2xlbikgPT0gLTEpIHsKKwkJaWYgKGVycm5vID09IEVJTlZBTCB8fCBlcnJubyA9PSBFQUREUklOVVNFKSB7CisJCQllcnJvcigiQ29udHJvbFNvY2tldCAlcyBhbHJlYWR5IGV4aXN0cywgIgorCQkJICAgICJkaXNhYmxpbmcgbXVsdGlwbGV4aW5nIiwgb3B0aW9ucy5jb250cm9sX3BhdGgpOworIGRpc2FibGVfbXV4X21hc3RlcjoKKwkJCWlmIChtdXhzZXJ2ZXJfc29jayAhPSAtMSkgeworCQkJCWNsb3NlKG11eHNlcnZlcl9zb2NrKTsKKwkJCQltdXhzZXJ2ZXJfc29jayA9IC0xOworCQkJfQorCQkJeGZyZWUob3B0aW9ucy5jb250cm9sX3BhdGgpOworCQkJb3B0aW9ucy5jb250cm9sX3BhdGggPSBOVUxMOworCQkJb3B0aW9ucy5jb250cm9sX21hc3RlciA9IFNTSENUTF9NQVNURVJfTk87CisJCQlyZXR1cm47CisJCX0gZWxzZQorCQkJZmF0YWwoIiVzIGJpbmQoKTogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisJdW1hc2sob2xkX3VtYXNrKTsKKworCWlmIChsaXN0ZW4obXV4c2VydmVyX3NvY2ssIDY0KSA9PSAtMSkKKwkJZmF0YWwoIiVzIGxpc3RlbigpOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCisJLyogTm93IGF0b21pY2FsbHkgIm1vdmUiIHRoZSBtdXggc29ja2V0IGludG8gcG9zaXRpb24gKi8KKwlpZiAobGluayhvcHRpb25zLmNvbnRyb2xfcGF0aCwgb3JpZ19jb250cm9sX3BhdGgpICE9IDApIHsKKwkJaWYgKGVycm5vICE9IEVFWElTVCkgeworCQkJZmF0YWwoIiVzOiBsaW5rIG11eCBsaXN0ZW5lciAlcyA9PiAlczogJXMiLCBfX2Z1bmNfXywgCisJCQkgICAgb3B0aW9ucy5jb250cm9sX3BhdGgsIG9yaWdfY29udHJvbF9wYXRoLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCX0KKwkJZXJyb3IoIkNvbnRyb2xTb2NrZXQgJXMgYWxyZWFkeSBleGlzdHMsIGRpc2FibGluZyBtdWx0aXBsZXhpbmciLAorCQkgICAgb3JpZ19jb250cm9sX3BhdGgpOworCQl4ZnJlZShvcmlnX2NvbnRyb2xfcGF0aCk7CisJCXVubGluayhvcHRpb25zLmNvbnRyb2xfcGF0aCk7CisJCWdvdG8gZGlzYWJsZV9tdXhfbWFzdGVyOworCX0KKwl1bmxpbmsob3B0aW9ucy5jb250cm9sX3BhdGgpOworCXhmcmVlKG9wdGlvbnMuY29udHJvbF9wYXRoKTsKKwlvcHRpb25zLmNvbnRyb2xfcGF0aCA9IG9yaWdfY29udHJvbF9wYXRoOworCisJc2V0X25vbmJsb2NrKG11eHNlcnZlcl9zb2NrKTsKKworCW11eF9saXN0ZW5lcl9jaGFubmVsID0gY2hhbm5lbF9uZXcoIm11eCBsaXN0ZW5lciIsCisJICAgIFNTSF9DSEFOTkVMX01VWF9MSVNURU5FUiwgbXV4c2VydmVyX3NvY2ssIG11eHNlcnZlcl9zb2NrLCAtMSwKKwkgICAgQ0hBTl9UQ1BfV0lORE9XX0RFRkFVTFQsIENIQU5fVENQX1BBQ0tFVF9ERUZBVUxULAorCSAgICAwLCBvcHRpb25zLmNvbnRyb2xfcGF0aCwgMSk7CisJbXV4X2xpc3RlbmVyX2NoYW5uZWwtPm11eF9yY2IgPSBtdXhfbWFzdGVyX3JlYWRfY2I7CisJZGVidWczKCIlczogbXV4IGxpc3RlbmVyIGNoYW5uZWwgJWQgZmQgJWQiLCBfX2Z1bmNfXywKKwkgICAgbXV4X2xpc3RlbmVyX2NoYW5uZWwtPnNlbGYsIG11eF9saXN0ZW5lcl9jaGFubmVsLT5zb2NrKTsKK30KKworLyogQ2FsbGJhY2sgb24gb3BlbiBjb25maXJtYXRpb24gaW4gbXV4IG1hc3RlciBmb3IgYSBtdXggY2xpZW50IHNlc3Npb24uICovCitzdGF0aWMgdm9pZAorbXV4X3Nlc3Npb25fY29uZmlybShpbnQgaWQsIGludCBzdWNjZXNzLCB2b2lkICphcmcpCit7CisJc3RydWN0IG11eF9zZXNzaW9uX2NvbmZpcm1fY3R4ICpjY3R4ID0gYXJnOworCWNvbnN0IGNoYXIgKmRpc3BsYXk7CisJQ2hhbm5lbCAqYywgKmNjOworCWludCBpOworCUJ1ZmZlciByZXBseTsKKworCWlmIChjY3R4ID09IE5VTEwpCisJCWZhdGFsKCIlczogY2N0eCA9PSBOVUxMIiwgX19mdW5jX18pOworCWlmICgoYyA9IGNoYW5uZWxfYnlfaWQoaWQpKSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IG5vIGNoYW5uZWwgZm9yIGlkICVkIiwgX19mdW5jX18sIGlkKTsKKwlpZiAoKGNjID0gY2hhbm5lbF9ieV9pZChjLT5jdGxfY2hhbikpID09IE5VTEwpCisJCWZhdGFsKCIlczogY2hhbm5lbCAlZCBsYWNrcyBjb250cm9sIGNoYW5uZWwgJWQiLCBfX2Z1bmNfXywKKwkJICAgIGlkLCBjLT5jdGxfY2hhbik7CisKKwlpZiAoIXN1Y2Nlc3MpIHsKKwkJZGVidWczKCIlczogc2VuZGluZyBmYWlsdXJlIHJlcGx5IiwgX19mdW5jX18pOworCQkvKiBwcmVwYXJlIHJlcGx5ICovCisJCWJ1ZmZlcl9pbml0KCZyZXBseSk7CisJCWJ1ZmZlcl9wdXRfaW50KCZyZXBseSwgTVVYX1NfRkFJTFVSRSk7CisJCWJ1ZmZlcl9wdXRfaW50KCZyZXBseSwgY2N0eC0+cmlkKTsKKwkJYnVmZmVyX3B1dF9jc3RyaW5nKCZyZXBseSwgIlNlc3Npb24gb3BlbiByZWZ1c2VkIGJ5IHBlZXIiKTsKKwkJZ290byBkb25lOworCX0KKworCWRpc3BsYXkgPSBnZXRlbnYoIkRJU1BMQVkiKTsKKwlpZiAoY2N0eC0+d2FudF94X2Z3ZCAmJiBvcHRpb25zLmZvcndhcmRfeDExICYmIGRpc3BsYXkgIT0gTlVMTCkgeworCQljaGFyICpwcm90bywgKmRhdGE7CisKKwkJLyogR2V0IHJlYXNvbmFibGUgbG9jYWwgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24uICovCisJCWNsaWVudF94MTFfZ2V0X3Byb3RvKGRpc3BsYXksIG9wdGlvbnMueGF1dGhfbG9jYXRpb24sCisJCSAgICBvcHRpb25zLmZvcndhcmRfeDExX3RydXN0ZWQsIG9wdGlvbnMuZm9yd2FyZF94MTFfdGltZW91dCwKKwkJICAgICZwcm90bywgJmRhdGEpOworCQkvKiBSZXF1ZXN0IGZvcndhcmRpbmcgd2l0aCBhdXRoZW50aWNhdGlvbiBzcG9vZmluZy4gKi8KKwkJZGVidWcoIlJlcXVlc3RpbmcgWDExIGZvcndhcmRpbmcgd2l0aCBhdXRoZW50aWNhdGlvbiAiCisJCSAgICAic3Bvb2ZpbmcuIik7CisJCXgxMV9yZXF1ZXN0X2ZvcndhcmRpbmdfd2l0aF9zcG9vZmluZyhpZCwgZGlzcGxheSwgcHJvdG8sCisJCSAgICBkYXRhLCAxKTsKKwkJY2xpZW50X2V4cGVjdF9jb25maXJtKGlkLCAiWDExIGZvcndhcmRpbmciLCBDT05GSVJNX1dBUk4pOworCQkvKiBYWFggZXhpdF9vbl9mb3J3YXJkX2ZhaWx1cmUgKi8KKwl9CisKKwlpZiAoY2N0eC0+d2FudF9hZ2VudF9md2QgJiYgb3B0aW9ucy5mb3J3YXJkX2FnZW50KSB7CisJCWRlYnVnKCJSZXF1ZXN0aW5nIGF1dGhlbnRpY2F0aW9uIGFnZW50IGZvcndhcmRpbmcuIik7CisJCWNoYW5uZWxfcmVxdWVzdF9zdGFydChpZCwgImF1dGgtYWdlbnQtcmVxQG9wZW5zc2guY29tIiwgMCk7CisJCXBhY2tldF9zZW5kKCk7CisJfQorCisJY2xpZW50X3Nlc3Npb24yX3NldHVwKGlkLCBjY3R4LT53YW50X3R0eSwgY2N0eC0+d2FudF9zdWJzeXMsCisJICAgIGNjdHgtPnRlcm0sICZjY3R4LT50aW8sIGMtPnJmZCwgJmNjdHgtPmNtZCwgY2N0eC0+ZW52KTsKKworCWRlYnVnMygiJXM6IHNlbmRpbmcgc3VjY2VzcyByZXBseSIsIF9fZnVuY19fKTsKKwkvKiBwcmVwYXJlIHJlcGx5ICovCisJYnVmZmVyX2luaXQoJnJlcGx5KTsKKwlidWZmZXJfcHV0X2ludCgmcmVwbHksIE1VWF9TX1NFU1NJT05fT1BFTkVEKTsKKwlidWZmZXJfcHV0X2ludCgmcmVwbHksIGNjdHgtPnJpZCk7CisJYnVmZmVyX3B1dF9pbnQoJnJlcGx5LCBjLT5zZWxmKTsKKworIGRvbmU6CisJLyogU2VuZCByZXBseSAqLworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZjYy0+b3V0cHV0LCBidWZmZXJfcHRyKCZyZXBseSksIGJ1ZmZlcl9sZW4oJnJlcGx5KSk7CisJYnVmZmVyX2ZyZWUoJnJlcGx5KTsKKworCWlmIChjYy0+bXV4X3BhdXNlIDw9IDApCisJCWZhdGFsKCIlczogbXV4X3BhdXNlICVkIiwgX19mdW5jX18sIGNjLT5tdXhfcGF1c2UpOworCWNjLT5tdXhfcGF1c2UgPSAwOyAvKiBzdGFydCBwcm9jZXNzaW5nIG1lc3NhZ2VzIGFnYWluICovCisJYy0+b3Blbl9jb25maXJtX2N0eCA9IE5VTEw7CisJYnVmZmVyX2ZyZWUoJmNjdHgtPmNtZCk7CisJeGZyZWUoY2N0eC0+dGVybSk7CisJaWYgKGNjdHgtPmVudiAhPSBOVUxMKSB7CisJCWZvciAoaSA9IDA7IGNjdHgtPmVudltpXSAhPSBOVUxMOyBpKyspCisJCQl4ZnJlZShjY3R4LT5lbnZbaV0pOworCQl4ZnJlZShjY3R4LT5lbnYpOworCX0KKwl4ZnJlZShjY3R4KTsKK30KKworLyogKiogTXVsdGlwbGV4aW5nIGNsaWVudCBzdXBwb3J0ICovCisKKy8qIEV4aXQgc2lnbmFsIGhhbmRsZXIgKi8KK3N0YXRpYyB2b2lkCitjb250cm9sX2NsaWVudF9zaWdoYW5kbGVyKGludCBzaWdubykKK3sKKwltdXhjbGllbnRfdGVybWluYXRlID0gc2lnbm87Cit9CisKKy8qCisgKiBSZWxheSBzaWduYWwgaGFuZGxlciAtIHVzZWQgdG8gcGFzcyBzb21lIHNpZ25hbHMgZnJvbSBtdXggY2xpZW50IHRvCisgKiBtdXggbWFzdGVyLgorICovCitzdGF0aWMgdm9pZAorY29udHJvbF9jbGllbnRfc2lncmVsYXkoaW50IHNpZ25vKQoreworCWludCBzYXZlX2Vycm5vID0gZXJybm87CisKKwlpZiAobXV4c2VydmVyX3BpZCA+IDEpCisJCWtpbGwobXV4c2VydmVyX3BpZCwgc2lnbm8pOworCisJZXJybm8gPSBzYXZlX2Vycm5vOworfQorCitzdGF0aWMgaW50CittdXhfY2xpZW50X3JlYWQoaW50IGZkLCBCdWZmZXIgKmIsIHVfaW50IG5lZWQpCit7CisJdV9pbnQgaGF2ZTsKKwlzc2l6ZV90IGxlbjsKKwl1X2NoYXIgKnA7CisJc3RydWN0IHBvbGxmZCBwZmQ7CisKKwlwZmQuZmQgPSBmZDsKKwlwZmQuZXZlbnRzID0gUE9MTElOOworCXAgPSBidWZmZXJfYXBwZW5kX3NwYWNlKGIsIG5lZWQpOworCWZvciAoaGF2ZSA9IDA7IGhhdmUgPCBuZWVkOyApIHsKKwkJaWYgKG11eGNsaWVudF90ZXJtaW5hdGUpIHsKKwkJCWVycm5vID0gRUlOVFI7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbGVuID0gcmVhZChmZCwgcCArIGhhdmUsIG5lZWQgLSBoYXZlKTsKKwkJaWYgKGxlbiA8IDApIHsKKwkJCXN3aXRjaCAoZXJybm8pIHsKKyNpZiBkZWZpbmVkKEVXT1VMREJMT0NLKSAmJiAoRVdPVUxEQkxPQ0sgIT0gRUFHQUlOKQorCQkJY2FzZSBFV09VTERCTE9DSzoKKyNlbmRpZgorCQkJY2FzZSBFQUdBSU46CisJCQkJKHZvaWQpcG9sbCgmcGZkLCAxLCAtMSk7CisJCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJCWNhc2UgRUlOVFI6CisJCQkJY29udGludWU7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAobGVuID09IDApIHsKKwkJCWVycm5vID0gRVBJUEU7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaGF2ZSArPSAodV9pbnQpbGVuOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbXV4X2NsaWVudF93cml0ZV9wYWNrZXQoaW50IGZkLCBCdWZmZXIgKm0pCit7CisJQnVmZmVyIHF1ZXVlOworCXVfaW50IGhhdmUsIG5lZWQ7CisJaW50IG9lcnJubywgbGVuOworCXVfY2hhciAqcHRyOworCXN0cnVjdCBwb2xsZmQgcGZkOworCisJcGZkLmZkID0gZmQ7CisJcGZkLmV2ZW50cyA9IFBPTExPVVQ7CisJYnVmZmVyX2luaXQoJnF1ZXVlKTsKKwlidWZmZXJfcHV0X3N0cmluZygmcXVldWUsIGJ1ZmZlcl9wdHIobSksIGJ1ZmZlcl9sZW4obSkpOworCisJbmVlZCA9IGJ1ZmZlcl9sZW4oJnF1ZXVlKTsKKwlwdHIgPSBidWZmZXJfcHRyKCZxdWV1ZSk7CisKKwlmb3IgKGhhdmUgPSAwOyBoYXZlIDwgbmVlZDsgKSB7CisJCWlmIChtdXhjbGllbnRfdGVybWluYXRlKSB7CisJCQlidWZmZXJfZnJlZSgmcXVldWUpOworCQkJZXJybm8gPSBFSU5UUjsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlsZW4gPSB3cml0ZShmZCwgcHRyICsgaGF2ZSwgbmVlZCAtIGhhdmUpOworCQlpZiAobGVuIDwgMCkgeworCQkJc3dpdGNoIChlcnJubykgeworI2lmIGRlZmluZWQoRVdPVUxEQkxPQ0spICYmIChFV09VTERCTE9DSyAhPSBFQUdBSU4pCisJCQljYXNlIEVXT1VMREJMT0NLOgorI2VuZGlmCisJCQljYXNlIEVBR0FJTjoKKwkJCQkodm9pZClwb2xsKCZwZmQsIDEsIC0xKTsKKwkJCQkvKiBGQUxMVEhST1VHSCAqLworCQkJY2FzZSBFSU5UUjoKKwkJCQljb250aW51ZTsKKwkJCWRlZmF1bHQ6CisJCQkJb2Vycm5vID0gZXJybm87CisJCQkJYnVmZmVyX2ZyZWUoJnF1ZXVlKTsKKwkJCQllcnJubyA9IG9lcnJubzsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGxlbiA9PSAwKSB7CisJCQlidWZmZXJfZnJlZSgmcXVldWUpOworCQkJZXJybm8gPSBFUElQRTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQloYXZlICs9ICh1X2ludClsZW47CisJfQorCWJ1ZmZlcl9mcmVlKCZxdWV1ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK211eF9jbGllbnRfcmVhZF9wYWNrZXQoaW50IGZkLCBCdWZmZXIgKm0pCit7CisJQnVmZmVyIHF1ZXVlOworCXVfaW50IG5lZWQsIGhhdmU7CisJdm9pZCAqcHRyOworCWludCBvZXJybm87CisKKwlidWZmZXJfaW5pdCgmcXVldWUpOworCWlmIChtdXhfY2xpZW50X3JlYWQoZmQsICZxdWV1ZSwgNCkgIT0gMCkgeworCQlpZiAoKG9lcnJubyA9IGVycm5vKSA9PSBFUElQRSkKKwkJZGVidWczKCIlczogcmVhZCBoZWFkZXIgZmFpbGVkOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCQllcnJubyA9IG9lcnJubzsKKwkJcmV0dXJuIC0xOworCX0KKwluZWVkID0gZ2V0X3UzMihidWZmZXJfcHRyKCZxdWV1ZSkpOworCWlmIChtdXhfY2xpZW50X3JlYWQoZmQsICZxdWV1ZSwgbmVlZCkgIT0gMCkgeworCQlvZXJybm8gPSBlcnJubzsKKwkJZGVidWczKCIlczogcmVhZCBib2R5IGZhaWxlZDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJZXJybm8gPSBvZXJybm87CisJCXJldHVybiAtMTsKKwl9CisJcHRyID0gYnVmZmVyX2dldF9zdHJpbmdfcHRyKCZxdWV1ZSwgJmhhdmUpOworCWJ1ZmZlcl9hcHBlbmQobSwgcHRyLCBoYXZlKTsKKwlidWZmZXJfZnJlZSgmcXVldWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CittdXhfY2xpZW50X2hlbGxvX2V4Y2hhbmdlKGludCBmZCkKK3sKKwlCdWZmZXIgbTsKKwl1X2ludCB0eXBlLCB2ZXI7CisKKwlidWZmZXJfaW5pdCgmbSk7CisJYnVmZmVyX3B1dF9pbnQoJm0sIE1VWF9NU0dfSEVMTE8pOworCWJ1ZmZlcl9wdXRfaW50KCZtLCBTU0hNVVhfVkVSKTsKKwkvKiBubyBleHRlbnNpb25zICovCisKKwlpZiAobXV4X2NsaWVudF93cml0ZV9wYWNrZXQoZmQsICZtKSAhPSAwKQorCQlmYXRhbCgiJXM6IHdyaXRlIHBhY2tldDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKworCWJ1ZmZlcl9jbGVhcigmbSk7CisKKwkvKiBSZWFkIHRoZWlyIEhFTExPICovCisJaWYgKG11eF9jbGllbnRfcmVhZF9wYWNrZXQoZmQsICZtKSAhPSAwKSB7CisJCWJ1ZmZlcl9mcmVlKCZtKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXR5cGUgPSBidWZmZXJfZ2V0X2ludCgmbSk7CisJaWYgKHR5cGUgIT0gTVVYX01TR19IRUxMTykKKwkJZmF0YWwoIiVzOiBleHBlY3RlZCBIRUxMTyAoJXUpIHJlY2VpdmVkICV1IiwKKwkJICAgIF9fZnVuY19fLCBNVVhfTVNHX0hFTExPLCB0eXBlKTsKKwl2ZXIgPSBidWZmZXJfZ2V0X2ludCgmbSk7CisJaWYgKHZlciAhPSBTU0hNVVhfVkVSKQorCQlmYXRhbCgiVW5zdXBwb3J0ZWQgbXVsdGlwbGV4aW5nIHByb3RvY29sIHZlcnNpb24gJWQgIgorCQkgICAgIihleHBlY3RlZCAlZCkiLCB2ZXIsIFNTSE1VWF9WRVIpOworCWRlYnVnMigiJXM6IG1hc3RlciB2ZXJzaW9uICV1IiwgX19mdW5jX18sIHZlcik7CisJLyogTm8gZXh0ZW5zaW9ucyBhcmUgcHJlc2VudGx5IGRlZmluZWQgKi8KKwl3aGlsZSAoYnVmZmVyX2xlbigmbSkgPiAwKSB7CisJCWNoYXIgKm5hbWUgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgTlVMTCk7CisJCWNoYXIgKnZhbHVlID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIE5VTEwpOworCisJCWRlYnVnMigiVW5yZWNvZ25pc2VkIG1hc3RlciBleHRlbnNpb24gXCIlc1wiIiwgbmFtZSk7CisJCXhmcmVlKG5hbWUpOworCQl4ZnJlZSh2YWx1ZSk7CisJfQorCWJ1ZmZlcl9mcmVlKCZtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVfaW50CittdXhfY2xpZW50X3JlcXVlc3RfYWxpdmUoaW50IGZkKQoreworCUJ1ZmZlciBtOworCWNoYXIgKmU7CisJdV9pbnQgcGlkLCB0eXBlLCByaWQ7CisKKwlkZWJ1ZzMoIiVzOiBlbnRlcmluZyIsIF9fZnVuY19fKTsKKworCWJ1ZmZlcl9pbml0KCZtKTsKKwlidWZmZXJfcHV0X2ludCgmbSwgTVVYX0NfQUxJVkVfQ0hFQ0spOworCWJ1ZmZlcl9wdXRfaW50KCZtLCBtdXhjbGllbnRfcmVxdWVzdF9pZCk7CisKKwlpZiAobXV4X2NsaWVudF93cml0ZV9wYWNrZXQoZmQsICZtKSAhPSAwKQorCQlmYXRhbCgiJXM6IHdyaXRlIHBhY2tldDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKworCWJ1ZmZlcl9jbGVhcigmbSk7CisKKwkvKiBSZWFkIHRoZWlyIHJlcGx5ICovCisJaWYgKG11eF9jbGllbnRfcmVhZF9wYWNrZXQoZmQsICZtKSAhPSAwKSB7CisJCWJ1ZmZlcl9mcmVlKCZtKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdHlwZSA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKKwlpZiAodHlwZSAhPSBNVVhfU19BTElWRSkgeworCQllID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIE5VTEwpOworCQlmYXRhbCgiJXM6IG1hc3RlciByZXR1cm5lZCBlcnJvcjogJXMiLCBfX2Z1bmNfXywgZSk7CisJfQorCisJaWYgKChyaWQgPSBidWZmZXJfZ2V0X2ludCgmbSkpICE9IG11eGNsaWVudF9yZXF1ZXN0X2lkKQorCQlmYXRhbCgiJXM6IG91dCBvZiBzZXF1ZW5jZSByZXBseTogbXkgaWQgJXUgdGhlaXJzICV1IiwKKwkJICAgIF9fZnVuY19fLCBtdXhjbGllbnRfcmVxdWVzdF9pZCwgcmlkKTsKKwlwaWQgPSBidWZmZXJfZ2V0X2ludCgmbSk7CisJYnVmZmVyX2ZyZWUoJm0pOworCisJZGVidWczKCIlczogZG9uZSBwaWQgPSAldSIsIF9fZnVuY19fLCBwaWQpOworCisJbXV4Y2xpZW50X3JlcXVlc3RfaWQrKzsKKworCXJldHVybiBwaWQ7Cit9CisKK3N0YXRpYyB2b2lkCittdXhfY2xpZW50X3JlcXVlc3RfdGVybWluYXRlKGludCBmZCkKK3sKKwlCdWZmZXIgbTsKKwljaGFyICplOworCXVfaW50IHR5cGUsIHJpZDsKKworCWRlYnVnMygiJXM6IGVudGVyaW5nIiwgX19mdW5jX18pOworCisJYnVmZmVyX2luaXQoJm0pOworCWJ1ZmZlcl9wdXRfaW50KCZtLCBNVVhfQ19URVJNSU5BVEUpOworCWJ1ZmZlcl9wdXRfaW50KCZtLCBtdXhjbGllbnRfcmVxdWVzdF9pZCk7CisKKwlpZiAobXV4X2NsaWVudF93cml0ZV9wYWNrZXQoZmQsICZtKSAhPSAwKQorCQlmYXRhbCgiJXM6IHdyaXRlIHBhY2tldDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKworCWJ1ZmZlcl9jbGVhcigmbSk7CisKKwkvKiBSZWFkIHRoZWlyIHJlcGx5ICovCisJaWYgKG11eF9jbGllbnRfcmVhZF9wYWNrZXQoZmQsICZtKSAhPSAwKSB7CisJCS8qIFJlbW90ZSBlbmQgZXhpdGVkIGFscmVhZHkgKi8KKwkJaWYgKGVycm5vID09IEVQSVBFKSB7CisJCQlidWZmZXJfZnJlZSgmbSk7CisJCQlyZXR1cm47CisJCX0KKwkJZmF0YWwoIiVzOiByZWFkIGZyb20gbWFzdGVyIGZhaWxlZDogJXMiLAorCQkgICAgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJfQorCisJdHlwZSA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKKwlpZiAoKHJpZCA9IGJ1ZmZlcl9nZXRfaW50KCZtKSkgIT0gbXV4Y2xpZW50X3JlcXVlc3RfaWQpCisJCWZhdGFsKCIlczogb3V0IG9mIHNlcXVlbmNlIHJlcGx5OiBteSBpZCAldSB0aGVpcnMgJXUiLAorCQkgICAgX19mdW5jX18sIG11eGNsaWVudF9yZXF1ZXN0X2lkLCByaWQpOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgTVVYX1NfT0s6CisJCWJyZWFrOworCWNhc2UgTVVYX1NfUEVSTUlTU0lPTl9ERU5JRUQ6CisJCWUgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgTlVMTCk7CisJCWZhdGFsKCJNYXN0ZXIgcmVmdXNlZCB0ZXJtaW5hdGlvbiByZXF1ZXN0OiAlcyIsIGUpOworCWNhc2UgTVVYX1NfRkFJTFVSRToKKwkJZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKKwkJZmF0YWwoIiVzOiB0ZXJtaW5hdGlvbiByZXF1ZXN0IGZhaWxlZDogJXMiLCBfX2Z1bmNfXywgZSk7CisJZGVmYXVsdDoKKwkJZmF0YWwoIiVzOiB1bmV4cGVjdGVkIHJlc3BvbnNlIGZyb20gbWFzdGVyIDB4JTA4eCIsCisJCSAgICBfX2Z1bmNfXywgdHlwZSk7CisJfQorCWJ1ZmZlcl9mcmVlKCZtKTsKKwltdXhjbGllbnRfcmVxdWVzdF9pZCsrOworfQorCitzdGF0aWMgaW50CittdXhfY2xpZW50X2ZvcndhcmQoaW50IGZkLCBpbnQgY2FuY2VsX2ZsYWcsIHVfaW50IGZ0eXBlLCBGb3J3YXJkICpmd2QpCit7CisJQnVmZmVyIG07CisJY2hhciAqZSwgKmZ3ZF9kZXNjOworCXVfaW50IHR5cGUsIHJpZDsKKworCWZ3ZF9kZXNjID0gZm9ybWF0X2ZvcndhcmQoZnR5cGUsIGZ3ZCk7CisJZGVidWcoIlJlcXVlc3RpbmcgJXMgJXMiLAorCSAgICBjYW5jZWxfZmxhZyA/ICJjYW5jZWxsYXRpb24gb2YiIDogImZvcndhcmRpbmcgb2YiLCBmd2RfZGVzYyk7CisJeGZyZWUoZndkX2Rlc2MpOworCisJYnVmZmVyX2luaXQoJm0pOworCWJ1ZmZlcl9wdXRfaW50KCZtLCBjYW5jZWxfZmxhZyA/IE1VWF9DX0NMT1NFX0ZXRCA6IE1VWF9DX09QRU5fRldEKTsKKwlidWZmZXJfcHV0X2ludCgmbSwgbXV4Y2xpZW50X3JlcXVlc3RfaWQpOworCWJ1ZmZlcl9wdXRfaW50KCZtLCBmdHlwZSk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZtLAorCSAgICBmd2QtPmxpc3Rlbl9ob3N0ID09IE5VTEwgPyAiIiA6IGZ3ZC0+bGlzdGVuX2hvc3QpOworCWJ1ZmZlcl9wdXRfaW50KCZtLCBmd2QtPmxpc3Rlbl9wb3J0KTsKKwlidWZmZXJfcHV0X2NzdHJpbmcoJm0sCisJICAgIGZ3ZC0+Y29ubmVjdF9ob3N0ID09IE5VTEwgPyAiIiA6IGZ3ZC0+Y29ubmVjdF9ob3N0KTsKKwlidWZmZXJfcHV0X2ludCgmbSwgZndkLT5jb25uZWN0X3BvcnQpOworCisJaWYgKG11eF9jbGllbnRfd3JpdGVfcGFja2V0KGZkLCAmbSkgIT0gMCkKKwkJZmF0YWwoIiVzOiB3cml0ZSBwYWNrZXQ6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisKKwlidWZmZXJfY2xlYXIoJm0pOworCisJLyogUmVhZCB0aGVpciByZXBseSAqLworCWlmIChtdXhfY2xpZW50X3JlYWRfcGFja2V0KGZkLCAmbSkgIT0gMCkgeworCQlidWZmZXJfZnJlZSgmbSk7CisJCXJldHVybiAtMTsKKwl9CisKKwl0eXBlID0gYnVmZmVyX2dldF9pbnQoJm0pOworCWlmICgocmlkID0gYnVmZmVyX2dldF9pbnQoJm0pKSAhPSBtdXhjbGllbnRfcmVxdWVzdF9pZCkKKwkJZmF0YWwoIiVzOiBvdXQgb2Ygc2VxdWVuY2UgcmVwbHk6IG15IGlkICV1IHRoZWlycyAldSIsCisJCSAgICBfX2Z1bmNfXywgbXV4Y2xpZW50X3JlcXVlc3RfaWQsIHJpZCk7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBNVVhfU19PSzoKKwkJYnJlYWs7CisJY2FzZSBNVVhfU19SRU1PVEVfUE9SVDoKKwkJaWYgKGNhbmNlbF9mbGFnKQorCQkJZmF0YWwoIiVzOiBnb3QgTVVYX1NfUkVNT1RFX1BPUlQgZm9yIGNhbmNlbCIsIF9fZnVuY19fKTsKKwkJZndkLT5hbGxvY2F0ZWRfcG9ydCA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKKwkJbG9naXQoIkFsbG9jYXRlZCBwb3J0ICV1IGZvciByZW1vdGUgZm9yd2FyZCB0byAlczolZCIsCisJCSAgICBmd2QtPmFsbG9jYXRlZF9wb3J0LAorCQkgICAgZndkLT5jb25uZWN0X2hvc3QgPyBmd2QtPmNvbm5lY3RfaG9zdCA6ICIiLAorCQkgICAgZndkLT5jb25uZWN0X3BvcnQpOworCQlpZiAobXV4Y2xpZW50X2NvbW1hbmQgPT0gU1NITVVYX0NPTU1BTkRfRk9SV0FSRCkKKwkJCWZwcmludGYoc3Rkb3V0LCAiJXVcbiIsIGZ3ZC0+YWxsb2NhdGVkX3BvcnQpOworCQlicmVhazsKKwljYXNlIE1VWF9TX1BFUk1JU1NJT05fREVOSUVEOgorCQllID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIE5VTEwpOworCQlidWZmZXJfZnJlZSgmbSk7CisJCWVycm9yKCJNYXN0ZXIgcmVmdXNlZCBmb3J3YXJkaW5nIHJlcXVlc3Q6ICVzIiwgZSk7CisJCXJldHVybiAtMTsKKwljYXNlIE1VWF9TX0ZBSUxVUkU6CisJCWUgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgTlVMTCk7CisJCWJ1ZmZlcl9mcmVlKCZtKTsKKwkJZXJyb3IoIiVzOiBmb3J3YXJkaW5nIHJlcXVlc3QgZmFpbGVkOiAlcyIsIF9fZnVuY19fLCBlKTsKKwkJcmV0dXJuIC0xOworCWRlZmF1bHQ6CisJCWZhdGFsKCIlczogdW5leHBlY3RlZCByZXNwb25zZSBmcm9tIG1hc3RlciAweCUwOHgiLAorCQkgICAgX19mdW5jX18sIHR5cGUpOworCX0KKwlidWZmZXJfZnJlZSgmbSk7CisKKwltdXhjbGllbnRfcmVxdWVzdF9pZCsrOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CittdXhfY2xpZW50X2ZvcndhcmRzKGludCBmZCwgaW50IGNhbmNlbF9mbGFnKQoreworCWludCBpLCByZXQgPSAwOworCisJZGVidWczKCIlczogJXMgZm9yd2FyZGluZ3M6ICVkIGxvY2FsLCAlZCByZW1vdGUiLCBfX2Z1bmNfXywKKwkgICAgY2FuY2VsX2ZsYWcgPyAiY2FuY2VsIiA6ICJyZXF1ZXN0IiwKKwkgICAgb3B0aW9ucy5udW1fbG9jYWxfZm9yd2FyZHMsIG9wdGlvbnMubnVtX3JlbW90ZV9mb3J3YXJkcyk7CisKKwkvKiBYWFggRXhpdE9uRm9yd2FyZGluZ0ZhaWx1cmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1fbG9jYWxfZm9yd2FyZHM7IGkrKykgeworCQlpZiAobXV4X2NsaWVudF9mb3J3YXJkKGZkLCBjYW5jZWxfZmxhZywKKwkJICAgIG9wdGlvbnMubG9jYWxfZm9yd2FyZHNbaV0uY29ubmVjdF9wb3J0ID09IDAgPworCQkgICAgTVVYX0ZXRF9EWU5BTUlDIDogTVVYX0ZXRF9MT0NBTCwKKwkJICAgIG9wdGlvbnMubG9jYWxfZm9yd2FyZHMgKyBpKSAhPSAwKQorCQkJcmV0ID0gLTE7CisJfQorCWZvciAoaSA9IDA7IGkgPCBvcHRpb25zLm51bV9yZW1vdGVfZm9yd2FyZHM7IGkrKykgeworCQlpZiAobXV4X2NsaWVudF9mb3J3YXJkKGZkLCBjYW5jZWxfZmxhZywgTVVYX0ZXRF9SRU1PVEUsCisJCSAgICBvcHRpb25zLnJlbW90ZV9mb3J3YXJkcyArIGkpICE9IDApCisJCQlyZXQgPSAtMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorbXV4X2NsaWVudF9yZXF1ZXN0X3Nlc3Npb24oaW50IGZkKQoreworCUJ1ZmZlciBtOworCWNoYXIgKmUsICp0ZXJtOworCXVfaW50IGksIHJpZCwgc2lkLCBlc2lkLCBleGl0dmFsLCB0eXBlLCBleGl0dmFsX3NlZW47CisJZXh0ZXJuIGNoYXIgKiplbnZpcm9uOworCWludCBkZXZudWxsLCByYXdtb2RlOworCisJZGVidWczKCIlczogZW50ZXJpbmciLCBfX2Z1bmNfXyk7CisKKwlpZiAoKG11eHNlcnZlcl9waWQgPSBtdXhfY2xpZW50X3JlcXVlc3RfYWxpdmUoZmQpKSA9PSAwKSB7CisJCWVycm9yKCIlczogbWFzdGVyIGFsaXZlIHJlcXVlc3QgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCisJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCisJaWYgKHN0ZGluX251bGxfZmxhZykgeworCQlpZiAoKGRldm51bGwgPSBvcGVuKF9QQVRIX0RFVk5VTEwsIE9fUkRPTkxZKSkgPT0gLTEpCisJCQlmYXRhbCgib3BlbigvZGV2L251bGwpOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWlmIChkdXAyKGRldm51bGwsIFNURElOX0ZJTEVOTykgPT0gLTEpCisJCQlmYXRhbCgiZHVwMjogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQlpZiAoZGV2bnVsbCA+IFNUREVSUl9GSUxFTk8pCisJCQljbG9zZShkZXZudWxsKTsKKwl9CisKKwl0ZXJtID0gZ2V0ZW52KCJURVJNIik7CisKKwlidWZmZXJfaW5pdCgmbSk7CisJYnVmZmVyX3B1dF9pbnQoJm0sIE1VWF9DX05FV19TRVNTSU9OKTsKKwlidWZmZXJfcHV0X2ludCgmbSwgbXV4Y2xpZW50X3JlcXVlc3RfaWQpOworCWJ1ZmZlcl9wdXRfY3N0cmluZygmbSwgIiIpOyAvKiByZXNlcnZlZCAqLworCWJ1ZmZlcl9wdXRfaW50KCZtLCB0dHlfZmxhZyk7CisJYnVmZmVyX3B1dF9pbnQoJm0sIG9wdGlvbnMuZm9yd2FyZF94MTEpOworCWJ1ZmZlcl9wdXRfaW50KCZtLCBvcHRpb25zLmZvcndhcmRfYWdlbnQpOworCWJ1ZmZlcl9wdXRfaW50KCZtLCBzdWJzeXN0ZW1fZmxhZyk7CisJYnVmZmVyX3B1dF9pbnQoJm0sIG9wdGlvbnMuZXNjYXBlX2NoYXIgPT0gU1NIX0VTQ0FQRUNIQVJfTk9ORSA/CisJICAgIDB4ZmZmZmZmZmYgOiAodV9pbnQpb3B0aW9ucy5lc2NhcGVfY2hhcik7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZtLCB0ZXJtID09IE5VTEwgPyAiIiA6IHRlcm0pOworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCBidWZmZXJfcHRyKCZjb21tYW5kKSwgYnVmZmVyX2xlbigmY29tbWFuZCkpOworCisJaWYgKG9wdGlvbnMubnVtX3NlbmRfZW52ID4gMCAmJiBlbnZpcm9uICE9IE5VTEwpIHsKKwkJLyogUGFzcyBlbnZpcm9ubWVudCAqLworCQlmb3IgKGkgPSAwOyBlbnZpcm9uW2ldICE9IE5VTEw7IGkrKykgeworCQkJaWYgKGVudl9wZXJtaXR0ZWQoZW52aXJvbltpXSkpIHsKKwkJCQlidWZmZXJfcHV0X2NzdHJpbmcoJm0sIGVudmlyb25baV0pOworCQkJfQorCQl9CisJfQorCisJaWYgKG11eF9jbGllbnRfd3JpdGVfcGFja2V0KGZkLCAmbSkgIT0gMCkKKwkJZmF0YWwoIiVzOiB3cml0ZSBwYWNrZXQ6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisKKwkvKiBTZW5kIHRoZSBzdGRpbyBmaWxlIGRlc2NyaXB0b3JzICovCisJaWYgKG1tX3NlbmRfZmQoZmQsIFNURElOX0ZJTEVOTykgPT0gLTEgfHwKKwkgICAgbW1fc2VuZF9mZChmZCwgU1RET1VUX0ZJTEVOTykgPT0gLTEgfHwKKwkgICAgbW1fc2VuZF9mZChmZCwgU1RERVJSX0ZJTEVOTykgPT0gLTEpCisJCWZhdGFsKCIlczogc2VuZCBmZHMgZmFpbGVkIiwgX19mdW5jX18pOworCisJZGVidWczKCIlczogc2Vzc2lvbiByZXF1ZXN0IHNlbnQiLCBfX2Z1bmNfXyk7CisKKwkvKiBSZWFkIHRoZWlyIHJlcGx5ICovCisJYnVmZmVyX2NsZWFyKCZtKTsKKwlpZiAobXV4X2NsaWVudF9yZWFkX3BhY2tldChmZCwgJm0pICE9IDApIHsKKwkJZXJyb3IoIiVzOiByZWFkIGZyb20gbWFzdGVyIGZhaWxlZDogJXMiLAorCQkgICAgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJCWJ1ZmZlcl9mcmVlKCZtKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXR5cGUgPSBidWZmZXJfZ2V0X2ludCgmbSk7CisJaWYgKChyaWQgPSBidWZmZXJfZ2V0X2ludCgmbSkpICE9IG11eGNsaWVudF9yZXF1ZXN0X2lkKQorCQlmYXRhbCgiJXM6IG91dCBvZiBzZXF1ZW5jZSByZXBseTogbXkgaWQgJXUgdGhlaXJzICV1IiwKKwkJICAgIF9fZnVuY19fLCBtdXhjbGllbnRfcmVxdWVzdF9pZCwgcmlkKTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIE1VWF9TX1NFU1NJT05fT1BFTkVEOgorCQlzaWQgPSBidWZmZXJfZ2V0X2ludCgmbSk7CisJCWRlYnVnKCIlczogbWFzdGVyIHNlc3Npb24gaWQ6ICV1IiwgX19mdW5jX18sIHNpZCk7CisJCWJyZWFrOworCWNhc2UgTVVYX1NfUEVSTUlTU0lPTl9ERU5JRUQ6CisJCWUgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgTlVMTCk7CisJCWJ1ZmZlcl9mcmVlKCZtKTsKKwkJZXJyb3IoIk1hc3RlciByZWZ1c2VkIHNlc3Npb24gcmVxdWVzdDogJXMiLCBlKTsKKwkJcmV0dXJuIC0xOworCWNhc2UgTVVYX1NfRkFJTFVSRToKKwkJZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKKwkJYnVmZmVyX2ZyZWUoJm0pOworCQllcnJvcigiJXM6IHNlc3Npb24gcmVxdWVzdCBmYWlsZWQ6ICVzIiwgX19mdW5jX18sIGUpOworCQlyZXR1cm4gLTE7CisJZGVmYXVsdDoKKwkJYnVmZmVyX2ZyZWUoJm0pOworCQllcnJvcigiJXM6IHVuZXhwZWN0ZWQgcmVzcG9uc2UgZnJvbSBtYXN0ZXIgMHglMDh4IiwKKwkJICAgIF9fZnVuY19fLCB0eXBlKTsKKwkJcmV0dXJuIC0xOworCX0KKwltdXhjbGllbnRfcmVxdWVzdF9pZCsrOworCisJc2lnbmFsKFNJR0hVUCwgY29udHJvbF9jbGllbnRfc2lnaGFuZGxlcik7CisJc2lnbmFsKFNJR0lOVCwgY29udHJvbF9jbGllbnRfc2lnaGFuZGxlcik7CisJc2lnbmFsKFNJR1RFUk0sIGNvbnRyb2xfY2xpZW50X3NpZ2hhbmRsZXIpOworCXNpZ25hbChTSUdXSU5DSCwgY29udHJvbF9jbGllbnRfc2lncmVsYXkpOworCisJcmF3bW9kZSA9IHR0eV9mbGFnOworCWlmICh0dHlfZmxhZykKKwkJZW50ZXJfcmF3X21vZGUob3B0aW9ucy5yZXF1ZXN0X3R0eSA9PSBSRVFVRVNUX1RUWV9GT1JDRSk7CisKKwkvKgorCSAqIFN0aWNrIGFyb3VuZCB1bnRpbCB0aGUgY29udHJvbGVlIGNsb3NlcyB0aGUgY2xpZW50X2ZkLgorCSAqIEJlZm9yZSBpdCBkb2VzLCBpdCBpcyBleHBlY3RlZCB0byB3cml0ZSBhbiBleGl0IG1lc3NhZ2UuCisJICogVGhpcyBwcm9jZXNzIG11c3QgcmVhZCB0aGUgdmFsdWUgYW5kIHdhaXQgZm9yIHRoZSBjbG9zdXJlIG9mCisJICogdGhlIGNsaWVudF9mZDsgaWYgdGhpcyBvbmUgY2xvc2VzIGVhcmx5LCB0aGUgbXVsdGlwbGV4IG1hc3RlciB3aWxsCisJICogdGVybWluYXRlIGVhcmx5IHRvbyAocG9zc2libHkgbG9zaW5nIGRhdGEpLgorCSAqLworCWZvciAoZXhpdHZhbCA9IDI1NSwgZXhpdHZhbF9zZWVuID0gMDs7KSB7CisJCWJ1ZmZlcl9jbGVhcigmbSk7CisJCWlmIChtdXhfY2xpZW50X3JlYWRfcGFja2V0KGZkLCAmbSkgIT0gMCkKKwkJCWJyZWFrOworCQl0eXBlID0gYnVmZmVyX2dldF9pbnQoJm0pOworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBNVVhfU19UVFlfQUxMT0NfRkFJTDoKKwkJCWlmICgoZXNpZCA9IGJ1ZmZlcl9nZXRfaW50KCZtKSkgIT0gc2lkKQorCQkJCWZhdGFsKCIlczogdHR5IGFsbG9jIGZhaWwgb24gdW5rbm93biBzZXNzaW9uOiAiCisJCQkJICAgICJteSBpZCAldSB0aGVpcnMgJXUiLAorCQkJCSAgICBfX2Z1bmNfXywgc2lkLCBlc2lkKTsKKwkJCWxlYXZlX3Jhd19tb2RlKG9wdGlvbnMucmVxdWVzdF90dHkgPT0KKwkJCSAgICBSRVFVRVNUX1RUWV9GT1JDRSk7CisJCQlyYXdtb2RlID0gMDsKKwkJCWNvbnRpbnVlOworCQljYXNlIE1VWF9TX0VYSVRfTUVTU0FHRToKKwkJCWlmICgoZXNpZCA9IGJ1ZmZlcl9nZXRfaW50KCZtKSkgIT0gc2lkKQorCQkJCWZhdGFsKCIlczogZXhpdCBvbiB1bmtub3duIHNlc3Npb246ICIKKwkJCQkgICAgIm15IGlkICV1IHRoZWlycyAldSIsCisJCQkJICAgIF9fZnVuY19fLCBzaWQsIGVzaWQpOworCQkJaWYgKGV4aXR2YWxfc2VlbikKKwkJCQlmYXRhbCgiJXM6IGV4aXR2YWwgc2VudCB0d2ljZSIsIF9fZnVuY19fKTsKKwkJCWV4aXR2YWwgPSBidWZmZXJfZ2V0X2ludCgmbSk7CisJCQlleGl0dmFsX3NlZW4gPSAxOworCQkJY29udGludWU7CisJCWRlZmF1bHQ6CisJCQllID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIE5VTEwpOworCQkJZmF0YWwoIiVzOiBtYXN0ZXIgcmV0dXJuZWQgZXJyb3I6ICVzIiwgX19mdW5jX18sIGUpOworCQl9CisJfQorCisJY2xvc2UoZmQpOworCWlmIChyYXdtb2RlKQorCQlsZWF2ZV9yYXdfbW9kZShvcHRpb25zLnJlcXVlc3RfdHR5ID09IFJFUVVFU1RfVFRZX0ZPUkNFKTsKKworCWlmIChtdXhjbGllbnRfdGVybWluYXRlKSB7CisJCWRlYnVnMigiRXhpdGluZyBvbiBzaWduYWwgJWQiLCBtdXhjbGllbnRfdGVybWluYXRlKTsKKwkJZXhpdHZhbCA9IDI1NTsKKwl9IGVsc2UgaWYgKCFleGl0dmFsX3NlZW4pIHsKKwkJZGVidWcyKCJDb250cm9sIG1hc3RlciB0ZXJtaW5hdGVkIHVuZXhwZWN0ZWRseSIpOworCQlleGl0dmFsID0gMjU1OworCX0gZWxzZQorCQlkZWJ1ZzIoIlJlY2VpdmVkIGV4aXQgc3RhdHVzIGZyb20gbWFzdGVyICVkIiwgZXhpdHZhbCk7CisKKwlpZiAodHR5X2ZsYWcgJiYgb3B0aW9ucy5sb2dfbGV2ZWwgIT0gU1lTTE9HX0xFVkVMX1FVSUVUKQorCQlmcHJpbnRmKHN0ZGVyciwgIlNoYXJlZCBjb25uZWN0aW9uIHRvICVzIGNsb3NlZC5cclxuIiwgaG9zdCk7CisKKwlleGl0KGV4aXR2YWwpOworfQorCitzdGF0aWMgaW50CittdXhfY2xpZW50X3JlcXVlc3Rfc3RkaW9fZndkKGludCBmZCkKK3sKKwlCdWZmZXIgbTsKKwljaGFyICplOworCXVfaW50IHR5cGUsIHJpZCwgc2lkOworCWludCBkZXZudWxsOworCisJZGVidWczKCIlczogZW50ZXJpbmciLCBfX2Z1bmNfXyk7CisKKwlpZiAoKG11eHNlcnZlcl9waWQgPSBtdXhfY2xpZW50X3JlcXVlc3RfYWxpdmUoZmQpKSA9PSAwKSB7CisJCWVycm9yKCIlczogbWFzdGVyIGFsaXZlIHJlcXVlc3QgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCisJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCisJaWYgKHN0ZGluX251bGxfZmxhZykgeworCQlpZiAoKGRldm51bGwgPSBvcGVuKF9QQVRIX0RFVk5VTEwsIE9fUkRPTkxZKSkgPT0gLTEpCisJCQlmYXRhbCgib3BlbigvZGV2L251bGwpOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWlmIChkdXAyKGRldm51bGwsIFNURElOX0ZJTEVOTykgPT0gLTEpCisJCQlmYXRhbCgiZHVwMjogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQlpZiAoZGV2bnVsbCA+IFNUREVSUl9GSUxFTk8pCisJCQljbG9zZShkZXZudWxsKTsKKwl9CisKKwlidWZmZXJfaW5pdCgmbSk7CisJYnVmZmVyX3B1dF9pbnQoJm0sIE1VWF9DX05FV19TVERJT19GV0QpOworCWJ1ZmZlcl9wdXRfaW50KCZtLCBtdXhjbGllbnRfcmVxdWVzdF9pZCk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZtLCAiIik7IC8qIHJlc2VydmVkICovCisJYnVmZmVyX3B1dF9jc3RyaW5nKCZtLCBzdGRpb19mb3J3YXJkX2hvc3QpOworCWJ1ZmZlcl9wdXRfaW50KCZtLCBzdGRpb19mb3J3YXJkX3BvcnQpOworCisJaWYgKG11eF9jbGllbnRfd3JpdGVfcGFja2V0KGZkLCAmbSkgIT0gMCkKKwkJZmF0YWwoIiVzOiB3cml0ZSBwYWNrZXQ6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisKKwkvKiBTZW5kIHRoZSBzdGRpbyBmaWxlIGRlc2NyaXB0b3JzICovCisJaWYgKG1tX3NlbmRfZmQoZmQsIFNURElOX0ZJTEVOTykgPT0gLTEgfHwKKwkgICAgbW1fc2VuZF9mZChmZCwgU1RET1VUX0ZJTEVOTykgPT0gLTEpCisJCWZhdGFsKCIlczogc2VuZCBmZHMgZmFpbGVkIiwgX19mdW5jX18pOworCisJZGVidWczKCIlczogc3RkaW8gZm9yd2FyZCByZXF1ZXN0IHNlbnQiLCBfX2Z1bmNfXyk7CisKKwkvKiBSZWFkIHRoZWlyIHJlcGx5ICovCisJYnVmZmVyX2NsZWFyKCZtKTsKKworCWlmIChtdXhfY2xpZW50X3JlYWRfcGFja2V0KGZkLCAmbSkgIT0gMCkgeworCQllcnJvcigiJXM6IHJlYWQgZnJvbSBtYXN0ZXIgZmFpbGVkOiAlcyIsCisJCSAgICBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJYnVmZmVyX2ZyZWUoJm0pOworCQlyZXR1cm4gLTE7CisJfQorCisJdHlwZSA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKKwlpZiAoKHJpZCA9IGJ1ZmZlcl9nZXRfaW50KCZtKSkgIT0gbXV4Y2xpZW50X3JlcXVlc3RfaWQpCisJCWZhdGFsKCIlczogb3V0IG9mIHNlcXVlbmNlIHJlcGx5OiBteSBpZCAldSB0aGVpcnMgJXUiLAorCQkgICAgX19mdW5jX18sIG11eGNsaWVudF9yZXF1ZXN0X2lkLCByaWQpOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgTVVYX1NfU0VTU0lPTl9PUEVORUQ6CisJCXNpZCA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKKwkJZGVidWcoIiVzOiBtYXN0ZXIgc2Vzc2lvbiBpZDogJXUiLCBfX2Z1bmNfXywgc2lkKTsKKwkJYnJlYWs7CisJY2FzZSBNVVhfU19QRVJNSVNTSU9OX0RFTklFRDoKKwkJZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKKwkJYnVmZmVyX2ZyZWUoJm0pOworCQlmYXRhbCgiTWFzdGVyIHJlZnVzZWQgc3RkaW8gZm9yd2FyZGluZyByZXF1ZXN0OiAlcyIsIGUpOworCWNhc2UgTVVYX1NfRkFJTFVSRToKKwkJZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKKwkJYnVmZmVyX2ZyZWUoJm0pOworCQlmYXRhbCgiJXM6IHN0ZGlvIGZvcndhcmRpbmcgcmVxdWVzdCBmYWlsZWQ6ICVzIiwgX19mdW5jX18sIGUpOworCWRlZmF1bHQ6CisJCWJ1ZmZlcl9mcmVlKCZtKTsKKwkJZXJyb3IoIiVzOiB1bmV4cGVjdGVkIHJlc3BvbnNlIGZyb20gbWFzdGVyIDB4JTA4eCIsCisJCSAgICBfX2Z1bmNfXywgdHlwZSk7CisJCXJldHVybiAtMTsKKwl9CisJbXV4Y2xpZW50X3JlcXVlc3RfaWQrKzsKKworCXNpZ25hbChTSUdIVVAsIGNvbnRyb2xfY2xpZW50X3NpZ2hhbmRsZXIpOworCXNpZ25hbChTSUdJTlQsIGNvbnRyb2xfY2xpZW50X3NpZ2hhbmRsZXIpOworCXNpZ25hbChTSUdURVJNLCBjb250cm9sX2NsaWVudF9zaWdoYW5kbGVyKTsKKwlzaWduYWwoU0lHV0lOQ0gsIGNvbnRyb2xfY2xpZW50X3NpZ3JlbGF5KTsKKworCS8qCisJICogU3RpY2sgYXJvdW5kIHVudGlsIHRoZSBjb250cm9sZWUgY2xvc2VzIHRoZSBjbGllbnRfZmQuCisJICovCisJYnVmZmVyX2NsZWFyKCZtKTsKKwlpZiAobXV4X2NsaWVudF9yZWFkX3BhY2tldChmZCwgJm0pICE9IDApIHsKKwkJaWYgKGVycm5vID09IEVQSVBFIHx8CisJCSAgICAoZXJybm8gPT0gRUlOVFIgJiYgbXV4Y2xpZW50X3Rlcm1pbmF0ZSAhPSAwKSkKKwkJCXJldHVybiAwOworCQlmYXRhbCgiJXM6IG11eF9jbGllbnRfcmVhZF9wYWNrZXQ6ICVzIiwKKwkJICAgIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCX0KKwlmYXRhbCgiJXM6IG1hc3RlciByZXR1cm5lZCB1bmV4cGVjdGVkIG1lc3NhZ2UgJXUiLCBfX2Z1bmNfXywgdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkCittdXhfY2xpZW50X3JlcXVlc3Rfc3RvcF9saXN0ZW5pbmcoaW50IGZkKQoreworCUJ1ZmZlciBtOworCWNoYXIgKmU7CisJdV9pbnQgdHlwZSwgcmlkOworCisJZGVidWczKCIlczogZW50ZXJpbmciLCBfX2Z1bmNfXyk7CisKKwlidWZmZXJfaW5pdCgmbSk7CisJYnVmZmVyX3B1dF9pbnQoJm0sIE1VWF9DX1NUT1BfTElTVEVOSU5HKTsKKwlidWZmZXJfcHV0X2ludCgmbSwgbXV4Y2xpZW50X3JlcXVlc3RfaWQpOworCisJaWYgKG11eF9jbGllbnRfd3JpdGVfcGFja2V0KGZkLCAmbSkgIT0gMCkKKwkJZmF0YWwoIiVzOiB3cml0ZSBwYWNrZXQ6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisKKwlidWZmZXJfY2xlYXIoJm0pOworCisJLyogUmVhZCB0aGVpciByZXBseSAqLworCWlmIChtdXhfY2xpZW50X3JlYWRfcGFja2V0KGZkLCAmbSkgIT0gMCkKKwkJZmF0YWwoIiVzOiByZWFkIGZyb20gbWFzdGVyIGZhaWxlZDogJXMiLAorCQkgICAgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisKKwl0eXBlID0gYnVmZmVyX2dldF9pbnQoJm0pOworCWlmICgocmlkID0gYnVmZmVyX2dldF9pbnQoJm0pKSAhPSBtdXhjbGllbnRfcmVxdWVzdF9pZCkKKwkJZmF0YWwoIiVzOiBvdXQgb2Ygc2VxdWVuY2UgcmVwbHk6IG15IGlkICV1IHRoZWlycyAldSIsCisJCSAgICBfX2Z1bmNfXywgbXV4Y2xpZW50X3JlcXVlc3RfaWQsIHJpZCk7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBNVVhfU19PSzoKKwkJYnJlYWs7CisJY2FzZSBNVVhfU19QRVJNSVNTSU9OX0RFTklFRDoKKwkJZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKKwkJZmF0YWwoIk1hc3RlciByZWZ1c2VkIHN0b3AgbGlzdGVuaW5nIHJlcXVlc3Q6ICVzIiwgZSk7CisJY2FzZSBNVVhfU19GQUlMVVJFOgorCQllID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIE5VTEwpOworCQlmYXRhbCgiJXM6IHN0b3AgbGlzdGVuaW5nIHJlcXVlc3QgZmFpbGVkOiAlcyIsIF9fZnVuY19fLCBlKTsKKwlkZWZhdWx0OgorCQlmYXRhbCgiJXM6IHVuZXhwZWN0ZWQgcmVzcG9uc2UgZnJvbSBtYXN0ZXIgMHglMDh4IiwKKwkJICAgIF9fZnVuY19fLCB0eXBlKTsKKwl9CisJYnVmZmVyX2ZyZWUoJm0pOworCW11eGNsaWVudF9yZXF1ZXN0X2lkKys7Cit9CisKKy8qIE11bHRpcGxleCBjbGllbnQgbWFpbiBsb29wLiAqLwordm9pZAorbXV4Y2xpZW50KGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc3RydWN0IHNvY2thZGRyX3VuIGFkZHI7CisJc29ja2xlbl90IHN1bl9sZW47CisJaW50IHNvY2s7CisJdV9pbnQgcGlkOworCisJaWYgKG11eGNsaWVudF9jb21tYW5kID09IDApIHsKKwkJaWYgKHN0ZGlvX2ZvcndhcmRfaG9zdCAhPSBOVUxMKQorCQkJbXV4Y2xpZW50X2NvbW1hbmQgPSBTU0hNVVhfQ09NTUFORF9TVERJT19GV0Q7CisJCWVsc2UKKwkJCW11eGNsaWVudF9jb21tYW5kID0gU1NITVVYX0NPTU1BTkRfT1BFTjsKKwl9CisKKwlzd2l0Y2ggKG9wdGlvbnMuY29udHJvbF9tYXN0ZXIpIHsKKwljYXNlIFNTSENUTF9NQVNURVJfQVVUTzoKKwljYXNlIFNTSENUTF9NQVNURVJfQVVUT19BU0s6CisJCWRlYnVnKCJhdXRvLW11eDogVHJ5aW5nIGV4aXN0aW5nIG1hc3RlciIpOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgU1NIQ1RMX01BU1RFUl9OTzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKworCW1lbXNldCgmYWRkciwgJ1wwJywgc2l6ZW9mKGFkZHIpKTsKKwlhZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOworCXN1bl9sZW4gPSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKSArCisJICAgIHN0cmxlbihwYXRoKSArIDE7CisKKwlpZiAoc3RybGNweShhZGRyLnN1bl9wYXRoLCBwYXRoLAorCSAgICBzaXplb2YoYWRkci5zdW5fcGF0aCkpID49IHNpemVvZihhZGRyLnN1bl9wYXRoKSkKKwkJZmF0YWwoIkNvbnRyb2xQYXRoIHRvbyBsb25nIik7CisKKwlpZiAoKHNvY2sgPSBzb2NrZXQoUEZfVU5JWCwgU09DS19TVFJFQU0sIDApKSA8IDApCisJCWZhdGFsKCIlcyBzb2NrZXQoKTogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKworCWlmIChjb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc3VuX2xlbikgPT0gLTEpIHsKKwkJc3dpdGNoIChtdXhjbGllbnRfY29tbWFuZCkgeworCQljYXNlIFNTSE1VWF9DT01NQU5EX09QRU46CisJCWNhc2UgU1NITVVYX0NPTU1BTkRfU1RESU9fRldEOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmYXRhbCgiQ29udHJvbCBzb2NrZXQgY29ubmVjdCglLjEwMHMpOiAlcyIsIHBhdGgsCisJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCQlpZiAoZXJybm8gPT0gRUNPTk5SRUZVU0VEICYmCisJCSAgICBvcHRpb25zLmNvbnRyb2xfbWFzdGVyICE9IFNTSENUTF9NQVNURVJfTk8pIHsKKwkJCWRlYnVnKCJTdGFsZSBjb250cm9sIHNvY2tldCAlLjEwMHMsIHVubGlua2luZyIsIHBhdGgpOworCQkJdW5saW5rKHBhdGgpOworCQl9IGVsc2UgaWYgKGVycm5vID09IEVOT0VOVCkgeworCQkJZGVidWcoIkNvbnRyb2wgc29ja2V0IFwiJS4xMDBzXCIgZG9lcyBub3QgZXhpc3QiLCBwYXRoKTsKKwkJfSBlbHNlIHsKKwkJCWVycm9yKCJDb250cm9sIHNvY2tldCBjb25uZWN0KCUuMTAwcyk6ICVzIiwgcGF0aCwKKwkJCSAgICBzdHJlcnJvcihlcnJubykpOworCQl9CisJCWNsb3NlKHNvY2spOworCQlyZXR1cm47CisJfQorCXNldF9ub25ibG9jayhzb2NrKTsKKworCWlmIChtdXhfY2xpZW50X2hlbGxvX2V4Y2hhbmdlKHNvY2spICE9IDApIHsKKwkJZXJyb3IoIiVzOiBtYXN0ZXIgaGVsbG8gZXhjaGFuZ2UgZmFpbGVkIiwgX19mdW5jX18pOworCQljbG9zZShzb2NrKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAobXV4Y2xpZW50X2NvbW1hbmQpIHsKKwljYXNlIFNTSE1VWF9DT01NQU5EX0FMSVZFX0NIRUNLOgorCQlpZiAoKHBpZCA9IG11eF9jbGllbnRfcmVxdWVzdF9hbGl2ZShzb2NrKSkgPT0gMCkKKwkJCWZhdGFsKCIlczogbWFzdGVyIGFsaXZlIGNoZWNrIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJZnByaW50ZihzdGRlcnIsICJNYXN0ZXIgcnVubmluZyAocGlkPSVkKVxyXG4iLCBwaWQpOworCQlleGl0KDApOworCWNhc2UgU1NITVVYX0NPTU1BTkRfVEVSTUlOQVRFOgorCQltdXhfY2xpZW50X3JlcXVlc3RfdGVybWluYXRlKHNvY2spOworCQlmcHJpbnRmKHN0ZGVyciwgIkV4aXQgcmVxdWVzdCBzZW50LlxyXG4iKTsKKwkJZXhpdCgwKTsKKwljYXNlIFNTSE1VWF9DT01NQU5EX0ZPUldBUkQ6CisJCWlmIChtdXhfY2xpZW50X2ZvcndhcmRzKHNvY2ssIDApICE9IDApCisJCQlmYXRhbCgiJXM6IG1hc3RlciBmb3J3YXJkIHJlcXVlc3QgZmFpbGVkIiwgX19mdW5jX18pOworCQlleGl0KDApOworCWNhc2UgU1NITVVYX0NPTU1BTkRfT1BFTjoKKwkJaWYgKG11eF9jbGllbnRfZm9yd2FyZHMoc29jaywgMCkgIT0gMCkgeworCQkJZXJyb3IoIiVzOiBtYXN0ZXIgZm9yd2FyZCByZXF1ZXN0IGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJCXJldHVybjsKKwkJfQorCQltdXhfY2xpZW50X3JlcXVlc3Rfc2Vzc2lvbihzb2NrKTsKKwkJcmV0dXJuOworCWNhc2UgU1NITVVYX0NPTU1BTkRfU1RESU9fRldEOgorCQltdXhfY2xpZW50X3JlcXVlc3Rfc3RkaW9fZndkKHNvY2spOworCQlleGl0KDApOworCWNhc2UgU1NITVVYX0NPTU1BTkRfU1RPUDoKKwkJbXV4X2NsaWVudF9yZXF1ZXN0X3N0b3BfbGlzdGVuaW5nKHNvY2spOworCQlmcHJpbnRmKHN0ZGVyciwgIlN0b3AgbGlzdGVuaW5nIHJlcXVlc3Qgc2VudC5cclxuIik7CisJCWV4aXQoMCk7CisJY2FzZSBTU0hNVVhfQ09NTUFORF9DQU5DRUxfRldEOgorCQlpZiAobXV4X2NsaWVudF9mb3J3YXJkcyhzb2NrLCAxKSAhPSAwKQorCQkJZXJyb3IoIiVzOiBtYXN0ZXIgY2FuY2VsIGZvcndhcmQgcmVxdWVzdCBmYWlsZWQiLAorCQkJICAgIF9fZnVuY19fKTsKKwkJZXhpdCgwKTsKKwlkZWZhdWx0OgorCQlmYXRhbCgidW5yZWNvZ25pc2VkIG11eGNsaWVudF9jb21tYW5kICVkIiwgbXV4Y2xpZW50X2NvbW1hbmQpOworCX0KK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvbXlwcm9wb3NhbC5oIGIvb3BlbnNzaC02LjBwMS9teXByb3Bvc2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJjMWM3NwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvbXlwcm9wb3NhbC5oCkBAIC0wLDAgKzEsMTEyIEBACisvKiAkT3BlbkJTRDogbXlwcm9wb3NhbC5oLHYgMS4yOCAyMDExLzA4LzAyIDAxOjIyOjExIGRqbSBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3Nsdi5oPgorCisjaWZkZWYgT1BFTlNTTF9IQVNfRUNDCisjIGRlZmluZSBLRVhfRUNESF9NRVRIT0RTIFwKKwkiZWNkaC1zaGEyLW5pc3RwMjU2LCIgXAorCSJlY2RoLXNoYTItbmlzdHAzODQsIiBcCisJImVjZGgtc2hhMi1uaXN0cDUyMSwiCisjIGRlZmluZSBIT1NUS0VZX0VDRFNBX0NFUlRfTUVUSE9EUyBcCisJImVjZHNhLXNoYTItbmlzdHAyNTYtY2VydC12MDFAb3BlbnNzaC5jb20sIiBcCisJImVjZHNhLXNoYTItbmlzdHAzODQtY2VydC12MDFAb3BlbnNzaC5jb20sIiBcCisJImVjZHNhLXNoYTItbmlzdHA1MjEtY2VydC12MDFAb3BlbnNzaC5jb20sIgorIyBkZWZpbmUgSE9TVEtFWV9FQ0RTQV9NRVRIT0RTIFwKKwkiZWNkc2Etc2hhMi1uaXN0cDI1NiwiIFwKKwkiZWNkc2Etc2hhMi1uaXN0cDM4NCwiIFwKKwkiZWNkc2Etc2hhMi1uaXN0cDUyMSwiCisjZWxzZQorIyBkZWZpbmUgS0VYX0VDREhfTUVUSE9EUworIyBkZWZpbmUgSE9TVEtFWV9FQ0RTQV9DRVJUX01FVEhPRFMKKyMgZGVmaW5lIEhPU1RLRVlfRUNEU0FfTUVUSE9EUworI2VuZGlmCisKKy8qIE9sZCBPcGVuU1NMIGRvZXNuJ3Qgc3VwcG9ydCB3aGF0IHdlIG5lZWQgZm9yIERIR0VYLXNoYTI1NiAqLworI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwNzAwMEwKKyMgZGVmaW5lIEtFWF9TSEEyNTZfTUVUSE9EUyBcCisJImRpZmZpZS1oZWxsbWFuLWdyb3VwLWV4Y2hhbmdlLXNoYTI1NiwiCisjZWxzZQorIyBkZWZpbmUgS0VYX1NIQTI1Nl9NRVRIT0RTCisjZW5kaWYKKworIyBkZWZpbmUgS0VYX0RFRkFVTFRfS0VYIFwKKwlLRVhfRUNESF9NRVRIT0RTIFwKKwlLRVhfU0hBMjU2X01FVEhPRFMgXAorCSJkaWZmaWUtaGVsbG1hbi1ncm91cC1leGNoYW5nZS1zaGExLCIgXAorCSJkaWZmaWUtaGVsbG1hbi1ncm91cDE0LXNoYTEsIiBcCisJImRpZmZpZS1oZWxsbWFuLWdyb3VwMS1zaGExIgorCisjZGVmaW5lCUtFWF9ERUZBVUxUX1BLX0FMRwlcCisJSE9TVEtFWV9FQ0RTQV9DRVJUX01FVEhPRFMgXAorCSJzc2gtcnNhLWNlcnQtdjAxQG9wZW5zc2guY29tLCIgXAorCSJzc2gtZHNzLWNlcnQtdjAxQG9wZW5zc2guY29tLCIgXAorCSJzc2gtcnNhLWNlcnQtdjAwQG9wZW5zc2guY29tLCIgXAorCSJzc2gtZHNzLWNlcnQtdjAwQG9wZW5zc2guY29tLCIgXAorCUhPU1RLRVlfRUNEU0FfTUVUSE9EUyBcCisJInNzaC1yc2EsIiBcCisJInNzaC1kc3MiCisKKyNkZWZpbmUJS0VYX0RFRkFVTFRfRU5DUllQVCBcCisJImFlczEyOC1jdHIsYWVzMTkyLWN0cixhZXMyNTYtY3RyLCIgXAorCSJhcmNmb3VyMjU2LGFyY2ZvdXIxMjgsIiBcCisJImFlczEyOC1jYmMsM2Rlcy1jYmMsYmxvd2Zpc2gtY2JjLGNhc3QxMjgtY2JjLCIgXAorCSJhZXMxOTItY2JjLGFlczI1Ni1jYmMsYXJjZm91cixyaWpuZGFlbC1jYmNAbHlzYXRvci5saXUuc2UiCisjaWZkZWYgSEFWRV9FVlBfU0hBMjU2CisjZGVmaW5lCVNIQTJfSE1BQ19NT0RFUyBcCisJImhtYWMtc2hhMi0yNTYsIiBcCisJImhtYWMtc2hhMi0yNTYtOTYsIiBcCisJImhtYWMtc2hhMi01MTIsIiBcCisJImhtYWMtc2hhMi01MTItOTYsIgorI2Vsc2UKKyMgZGVmaW5lIFNIQTJfSE1BQ19NT0RFUworI2VuZGlmCisjZGVmaW5lCUtFWF9ERUZBVUxUX01BQyBcCisJImhtYWMtbWQ1LCIgXAorCSJobWFjLXNoYTEsIiBcCisJInVtYWMtNjRAb3BlbnNzaC5jb20sIiBcCisJU0hBMl9ITUFDX01PREVTIFwKKwkiaG1hYy1yaXBlbWQxNjAsIiBcCisJImhtYWMtcmlwZW1kMTYwQG9wZW5zc2guY29tLCIgXAorCSJobWFjLXNoYTEtOTYsIiBcCisJImhtYWMtbWQ1LTk2IgorCisjZGVmaW5lCUtFWF9ERUZBVUxUX0NPTVAJIm5vbmUsemxpYkBvcGVuc3NoLmNvbSx6bGliIgorI2RlZmluZQlLRVhfREVGQVVMVF9MQU5HCSIiCisKKworc3RhdGljIGNoYXIgKm15cHJvcG9zYWxbUFJPUE9TQUxfTUFYXSA9IHsKKwlLRVhfREVGQVVMVF9LRVgsCisJS0VYX0RFRkFVTFRfUEtfQUxHLAorCUtFWF9ERUZBVUxUX0VOQ1JZUFQsCisJS0VYX0RFRkFVTFRfRU5DUllQVCwKKwlLRVhfREVGQVVMVF9NQUMsCisJS0VYX0RFRkFVTFRfTUFDLAorCUtFWF9ERUZBVUxUX0NPTVAsCisJS0VYX0RFRkFVTFRfQ09NUCwKKwlLRVhfREVGQVVMVF9MQU5HLAorCUtFWF9ERUZBVUxUX0xBTkcKK307CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL25jaGFuLmMgYi9vcGVuc3NoLTYuMHAxL25jaGFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBmNmEyZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvbmNoYW4uYwpAQCAtMCwwICsxLDUzMSBAQAorLyogJE9wZW5CU0Q6IG5jaGFuLmMsdiAxLjYzIDIwMTAvMDEvMjYgMDE6Mjg6MzUgZGptIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9zeXMtcXVldWUuaCIKKyNpbmNsdWRlICJzc2gxLmgiCisjaW5jbHVkZSAic3NoMi5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgInBhY2tldC5oIgorI2luY2x1ZGUgImNoYW5uZWxzLmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisjaW5jbHVkZSAibG9nLmgiCisKKy8qCisgKiBTU0ggUHJvdG9jb2wgMS41IGFrYSBOZXcgQ2hhbm5lbCBQcm90b2NvbAorICogVGhhbmtzIHRvIE1hcnRpbmEsIEF4ZWwgYW5kIGV2ZXJ5b25lIHdobyBsZWZ0IEVybGFuZ2VuLCBsZWF2aW5nIG1lIGJvcmVkLgorICogV3JpdHRlbiBieSBNYXJrdXMgRnJpZWRsIGluIE9jdG9iZXIgMTk5OQorICoKKyAqIFByb3RvY29sIHZlcnNpb25zIDEuMyBhbmQgMS41IGRpZmZlciBpbiB0aGUgaGFuZHNoYWtlIHByb3RvY29sIHVzZWQgZm9yIHRoZQorICogdGVhciBkb3duIG9mIGNoYW5uZWxzOgorICoKKyAqIDEuMzoJc3RyaWN0IHJlcXVlc3QtYWNrLXByb3RvY29sOgorICoJQ0xPU0UJLT4KKyAqCQk8LSAgQ0xPU0VfQ09ORklSTQorICoKKyAqIDEuNToJdXNlcyB2YXJpYXRpb25zIG9mOgorICoJSUVPRgktPgorICoJCTwtICBPQ0xPU0UKKyAqCQk8LSAgSUVPRgorICoJT0NMT1NFCS0+CisgKglpLmUuIGJvdGggc2lkZXMgaGF2ZSB0byBjbG9zZSB0aGUgY2hhbm5lbAorICoKKyAqIDIuMDogdGhlIEVPRiBtZXNzYWdlcyBhcmUgb3B0aW9uYWwKKyAqCisgKiBTZWUgdGhlIGRlYnVnZ2luZyBvdXRwdXQgZnJvbSAnc3NoIC12JyBhbmQgJ3NzaGQgLWQnIG9mCisgKiBzc2gtMS4yLjI3IGFzIGFuIGV4YW1wbGUuCisgKgorICovCisKKy8qIGZ1bmN0aW9ucyBtYW5pcHVsYXRpbmcgY2hhbm5lbCBzdGF0ZXMgKi8KKy8qCisgKiBFVkVOVFMgdXBkYXRlIGNoYW5uZWwgaW5wdXQvb3V0cHV0IHN0YXRlcyBleGVjdXRlIEFDVElPTlMKKyAqLworLyoKKyAqIEFDVElPTlM6IHNob3VsZCBuZXZlciB1cGRhdGUgdGhlIGNoYW5uZWwgc3RhdGVzCisgKi8KK3N0YXRpYyB2b2lkCWNoYW5fc2VuZF9pZW9mMShDaGFubmVsICopOworc3RhdGljIHZvaWQJY2hhbl9zZW5kX29jbG9zZTEoQ2hhbm5lbCAqKTsKK3N0YXRpYyB2b2lkCWNoYW5fc2VuZF9jbG9zZTIoQ2hhbm5lbCAqKTsKK3N0YXRpYyB2b2lkCWNoYW5fc2VuZF9lb2YyKENoYW5uZWwgKik7CitzdGF0aWMgdm9pZAljaGFuX3NlbmRfZW93MihDaGFubmVsICopOworCisvKiBoZWxwZXIgKi8KK3N0YXRpYyB2b2lkCWNoYW5fc2h1dGRvd25fd3JpdGUoQ2hhbm5lbCAqKTsKK3N0YXRpYyB2b2lkCWNoYW5fc2h1dGRvd25fcmVhZChDaGFubmVsICopOworCitzdGF0aWMgY2hhciAqb3N0YXRlc1tdID0geyAib3BlbiIsICJkcmFpbiIsICJ3YWl0X2llb2YiLCAiY2xvc2VkIiB9Oworc3RhdGljIGNoYXIgKmlzdGF0ZXNbXSA9IHsgIm9wZW4iLCAiZHJhaW4iLCAid2FpdF9vY2xvc2UiLCAiY2xvc2VkIiB9OworCitzdGF0aWMgdm9pZAorY2hhbl9zZXRfaXN0YXRlKENoYW5uZWwgKmMsIHVfaW50IG5leHQpCit7CisJaWYgKGMtPmlzdGF0ZSA+IENIQU5fSU5QVVRfQ0xPU0VEIHx8IG5leHQgPiBDSEFOX0lOUFVUX0NMT1NFRCkKKwkJZmF0YWwoImNoYW5fc2V0X2lzdGF0ZTogYmFkIHN0YXRlICVkIC0+ICVkIiwgYy0+aXN0YXRlLCBuZXh0KTsKKwlkZWJ1ZzIoImNoYW5uZWwgJWQ6IGlucHV0ICVzIC0+ICVzIiwgYy0+c2VsZiwgaXN0YXRlc1tjLT5pc3RhdGVdLAorCSAgICBpc3RhdGVzW25leHRdKTsKKwljLT5pc3RhdGUgPSBuZXh0OworfQorc3RhdGljIHZvaWQKK2NoYW5fc2V0X29zdGF0ZShDaGFubmVsICpjLCB1X2ludCBuZXh0KQoreworCWlmIChjLT5vc3RhdGUgPiBDSEFOX09VVFBVVF9DTE9TRUQgfHwgbmV4dCA+IENIQU5fT1VUUFVUX0NMT1NFRCkKKwkJZmF0YWwoImNoYW5fc2V0X29zdGF0ZTogYmFkIHN0YXRlICVkIC0+ICVkIiwgYy0+b3N0YXRlLCBuZXh0KTsKKwlkZWJ1ZzIoImNoYW5uZWwgJWQ6IG91dHB1dCAlcyAtPiAlcyIsIGMtPnNlbGYsIG9zdGF0ZXNbYy0+b3N0YXRlXSwKKwkgICAgb3N0YXRlc1tuZXh0XSk7CisJYy0+b3N0YXRlID0gbmV4dDsKK30KKworLyoKKyAqIFNTSDEgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgZXZlbnQgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQKK2NoYW5fcmN2ZF9vY2xvc2UxKENoYW5uZWwgKmMpCit7CisJZGVidWcyKCJjaGFubmVsICVkOiByY3ZkIG9jbG9zZSIsIGMtPnNlbGYpOworCXN3aXRjaCAoYy0+aXN0YXRlKSB7CisJY2FzZSBDSEFOX0lOUFVUX1dBSVRfT0NMT1NFOgorCQljaGFuX3NldF9pc3RhdGUoYywgQ0hBTl9JTlBVVF9DTE9TRUQpOworCQlicmVhazsKKwljYXNlIENIQU5fSU5QVVRfT1BFTjoKKwkJY2hhbl9zaHV0ZG93bl9yZWFkKGMpOworCQljaGFuX3NlbmRfaWVvZjEoYyk7CisJCWNoYW5fc2V0X2lzdGF0ZShjLCBDSEFOX0lOUFVUX0NMT1NFRCk7CisJCWJyZWFrOworCWNhc2UgQ0hBTl9JTlBVVF9XQUlUX0RSQUlOOgorCQkvKiBib3RoIGxvY2FsIHJlYWRfZmFpbGVkIGFuZCByZW1vdGUgd3JpdGVfZmFpbGVkICAqLworCQljaGFuX3NlbmRfaWVvZjEoYyk7CisJCWNoYW5fc2V0X2lzdGF0ZShjLCBDSEFOX0lOUFVUX0NMT1NFRCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycm9yKCJjaGFubmVsICVkOiBwcm90b2NvbCBlcnJvcjogcmN2ZF9vY2xvc2UgZm9yIGlzdGF0ZSAlZCIsCisJCSAgICBjLT5zZWxmLCBjLT5pc3RhdGUpOworCQlyZXR1cm47CisJfQorfQordm9pZAorY2hhbl9yZWFkX2ZhaWxlZChDaGFubmVsICpjKQoreworCWRlYnVnMigiY2hhbm5lbCAlZDogcmVhZCBmYWlsZWQiLCBjLT5zZWxmKTsKKwlzd2l0Y2ggKGMtPmlzdGF0ZSkgeworCWNhc2UgQ0hBTl9JTlBVVF9PUEVOOgorCQljaGFuX3NodXRkb3duX3JlYWQoYyk7CisJCWNoYW5fc2V0X2lzdGF0ZShjLCBDSEFOX0lOUFVUX1dBSVRfRFJBSU4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJvcigiY2hhbm5lbCAlZDogY2hhbl9yZWFkX2ZhaWxlZCBmb3IgaXN0YXRlICVkIiwKKwkJICAgIGMtPnNlbGYsIGMtPmlzdGF0ZSk7CisJCWJyZWFrOworCX0KK30KK3ZvaWQKK2NoYW5faWJ1Zl9lbXB0eShDaGFubmVsICpjKQoreworCWRlYnVnMigiY2hhbm5lbCAlZDogaWJ1ZiBlbXB0eSIsIGMtPnNlbGYpOworCWlmIChidWZmZXJfbGVuKCZjLT5pbnB1dCkpIHsKKwkJZXJyb3IoImNoYW5uZWwgJWQ6IGNoYW5faWJ1Zl9lbXB0eSBmb3Igbm9uIGVtcHR5IGJ1ZmZlciIsCisJCSAgICBjLT5zZWxmKTsKKwkJcmV0dXJuOworCX0KKwlzd2l0Y2ggKGMtPmlzdGF0ZSkgeworCWNhc2UgQ0hBTl9JTlBVVF9XQUlUX0RSQUlOOgorCQlpZiAoY29tcGF0MjApIHsKKwkJCWlmICghKGMtPmZsYWdzICYgKENIQU5fQ0xPU0VfU0VOVHxDSEFOX0xPQ0FMKSkpCisJCQkJY2hhbl9zZW5kX2VvZjIoYyk7CisJCQljaGFuX3NldF9pc3RhdGUoYywgQ0hBTl9JTlBVVF9DTE9TRUQpOworCQl9IGVsc2UgeworCQkJY2hhbl9zZW5kX2llb2YxKGMpOworCQkJY2hhbl9zZXRfaXN0YXRlKGMsIENIQU5fSU5QVVRfV0FJVF9PQ0xPU0UpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycm9yKCJjaGFubmVsICVkOiBjaGFuX2lidWZfZW1wdHkgZm9yIGlzdGF0ZSAlZCIsCisJCSAgICBjLT5zZWxmLCBjLT5pc3RhdGUpOworCQlicmVhazsKKwl9Cit9CitzdGF0aWMgdm9pZAorY2hhbl9yY3ZkX2llb2YxKENoYW5uZWwgKmMpCit7CisJZGVidWcyKCJjaGFubmVsICVkOiByY3ZkIGllb2YiLCBjLT5zZWxmKTsKKwlzd2l0Y2ggKGMtPm9zdGF0ZSkgeworCWNhc2UgQ0hBTl9PVVRQVVRfT1BFTjoKKwkJY2hhbl9zZXRfb3N0YXRlKGMsIENIQU5fT1VUUFVUX1dBSVRfRFJBSU4pOworCQlicmVhazsKKwljYXNlIENIQU5fT1VUUFVUX1dBSVRfSUVPRjoKKwkJY2hhbl9zZXRfb3N0YXRlKGMsIENIQU5fT1VUUFVUX0NMT1NFRCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycm9yKCJjaGFubmVsICVkOiBwcm90b2NvbCBlcnJvcjogcmN2ZF9pZW9mIGZvciBvc3RhdGUgJWQiLAorCQkgICAgYy0+c2VsZiwgYy0+b3N0YXRlKTsKKwkJYnJlYWs7CisJfQorfQorc3RhdGljIHZvaWQKK2NoYW5fd3JpdGVfZmFpbGVkMShDaGFubmVsICpjKQoreworCWRlYnVnMigiY2hhbm5lbCAlZDogd3JpdGUgZmFpbGVkIiwgYy0+c2VsZik7CisJc3dpdGNoIChjLT5vc3RhdGUpIHsKKwljYXNlIENIQU5fT1VUUFVUX09QRU46CisJCWNoYW5fc2h1dGRvd25fd3JpdGUoYyk7CisJCWNoYW5fc2VuZF9vY2xvc2UxKGMpOworCQljaGFuX3NldF9vc3RhdGUoYywgQ0hBTl9PVVRQVVRfV0FJVF9JRU9GKTsKKwkJYnJlYWs7CisJY2FzZSBDSEFOX09VVFBVVF9XQUlUX0RSQUlOOgorCQljaGFuX3NodXRkb3duX3dyaXRlKGMpOworCQljaGFuX3NlbmRfb2Nsb3NlMShjKTsKKwkJY2hhbl9zZXRfb3N0YXRlKGMsIENIQU5fT1VUUFVUX0NMT1NFRCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycm9yKCJjaGFubmVsICVkOiBjaGFuX3dyaXRlX2ZhaWxlZCBmb3Igb3N0YXRlICVkIiwKKwkJICAgIGMtPnNlbGYsIGMtPm9zdGF0ZSk7CisJCWJyZWFrOworCX0KK30KK3ZvaWQKK2NoYW5fb2J1Zl9lbXB0eShDaGFubmVsICpjKQoreworCWRlYnVnMigiY2hhbm5lbCAlZDogb2J1ZiBlbXB0eSIsIGMtPnNlbGYpOworCWlmIChidWZmZXJfbGVuKCZjLT5vdXRwdXQpKSB7CisJCWVycm9yKCJjaGFubmVsICVkOiBjaGFuX29idWZfZW1wdHkgZm9yIG5vbiBlbXB0eSBidWZmZXIiLAorCQkgICAgYy0+c2VsZik7CisJCXJldHVybjsKKwl9CisJc3dpdGNoIChjLT5vc3RhdGUpIHsKKwljYXNlIENIQU5fT1VUUFVUX1dBSVRfRFJBSU46CisJCWNoYW5fc2h1dGRvd25fd3JpdGUoYyk7CisJCWlmICghY29tcGF0MjApCisJCQljaGFuX3NlbmRfb2Nsb3NlMShjKTsKKwkJY2hhbl9zZXRfb3N0YXRlKGMsIENIQU5fT1VUUFVUX0NMT1NFRCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycm9yKCJjaGFubmVsICVkOiBpbnRlcm5hbCBlcnJvcjogb2J1Zl9lbXB0eSBmb3Igb3N0YXRlICVkIiwKKwkJICAgIGMtPnNlbGYsIGMtPm9zdGF0ZSk7CisJCWJyZWFrOworCX0KK30KK3N0YXRpYyB2b2lkCitjaGFuX3NlbmRfaWVvZjEoQ2hhbm5lbCAqYykKK3sKKwlkZWJ1ZzIoImNoYW5uZWwgJWQ6IHNlbmQgaWVvZiIsIGMtPnNlbGYpOworCXN3aXRjaCAoYy0+aXN0YXRlKSB7CisJY2FzZSBDSEFOX0lOUFVUX09QRU46CisJY2FzZSBDSEFOX0lOUFVUX1dBSVRfRFJBSU46CisJCXBhY2tldF9zdGFydChTU0hfTVNHX0NIQU5ORUxfSU5QVVRfRU9GKTsKKwkJcGFja2V0X3B1dF9pbnQoYy0+cmVtb3RlX2lkKTsKKwkJcGFja2V0X3NlbmQoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyb3IoImNoYW5uZWwgJWQ6IGNhbm5vdCBzZW5kIGllb2YgZm9yIGlzdGF0ZSAlZCIsCisJCSAgICBjLT5zZWxmLCBjLT5pc3RhdGUpOworCQlicmVhazsKKwl9Cit9CitzdGF0aWMgdm9pZAorY2hhbl9zZW5kX29jbG9zZTEoQ2hhbm5lbCAqYykKK3sKKwlkZWJ1ZzIoImNoYW5uZWwgJWQ6IHNlbmQgb2Nsb3NlIiwgYy0+c2VsZik7CisJc3dpdGNoIChjLT5vc3RhdGUpIHsKKwljYXNlIENIQU5fT1VUUFVUX09QRU46CisJY2FzZSBDSEFOX09VVFBVVF9XQUlUX0RSQUlOOgorCQlidWZmZXJfY2xlYXIoJmMtPm91dHB1dCk7CisJCXBhY2tldF9zdGFydChTU0hfTVNHX0NIQU5ORUxfT1VUUFVUX0NMT1NFKTsKKwkJcGFja2V0X3B1dF9pbnQoYy0+cmVtb3RlX2lkKTsKKwkJcGFja2V0X3NlbmQoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyb3IoImNoYW5uZWwgJWQ6IGNhbm5vdCBzZW5kIG9jbG9zZSBmb3Igb3N0YXRlICVkIiwKKwkJICAgIGMtPnNlbGYsIGMtPm9zdGF0ZSk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIHRoZSBzYW1lIGZvciBTU0gyCisgKi8KK3N0YXRpYyB2b2lkCitjaGFuX3JjdmRfY2xvc2UyKENoYW5uZWwgKmMpCit7CisJZGVidWcyKCJjaGFubmVsICVkOiByY3ZkIGNsb3NlIiwgYy0+c2VsZik7CisJaWYgKCEoYy0+ZmxhZ3MgJiBDSEFOX0xPQ0FMKSkgeworCQlpZiAoYy0+ZmxhZ3MgJiBDSEFOX0NMT1NFX1JDVkQpCisJCQllcnJvcigiY2hhbm5lbCAlZDogcHJvdG9jb2wgZXJyb3I6IGNsb3NlIHJjdmQgdHdpY2UiLAorCQkJICAgIGMtPnNlbGYpOworCQljLT5mbGFncyB8PSBDSEFOX0NMT1NFX1JDVkQ7CisJfQorCWlmIChjLT50eXBlID09IFNTSF9DSEFOTkVMX0xBUlZBTCkgeworCQkvKiB0ZWFyIGRvd24gbGFydmFsIGNoYW5uZWxzIGltbWVkaWF0ZWx5ICovCisJCWNoYW5fc2V0X29zdGF0ZShjLCBDSEFOX09VVFBVVF9DTE9TRUQpOworCQljaGFuX3NldF9pc3RhdGUoYywgQ0hBTl9JTlBVVF9DTE9TRUQpOworCQlyZXR1cm47CisJfQorCXN3aXRjaCAoYy0+b3N0YXRlKSB7CisJY2FzZSBDSEFOX09VVFBVVF9PUEVOOgorCQkvKgorCQkgKiB3YWl0IHVudGlsIGEgZGF0YSBmcm9tIHRoZSBjaGFubmVsIGlzIGNvbnN1bWVkIGlmIGEgQ0xPU0UKKwkJICogaXMgcmVjZWl2ZWQKKwkJICovCisJCWNoYW5fc2V0X29zdGF0ZShjLCBDSEFOX09VVFBVVF9XQUlUX0RSQUlOKTsKKwkJYnJlYWs7CisJfQorCXN3aXRjaCAoYy0+aXN0YXRlKSB7CisJY2FzZSBDSEFOX0lOUFVUX09QRU46CisJCWNoYW5fc2h1dGRvd25fcmVhZChjKTsKKwkJY2hhbl9zZXRfaXN0YXRlKGMsIENIQU5fSU5QVVRfQ0xPU0VEKTsKKwkJYnJlYWs7CisJY2FzZSBDSEFOX0lOUFVUX1dBSVRfRFJBSU46CisJCWlmICghKGMtPmZsYWdzICYgQ0hBTl9MT0NBTCkpCisJCQljaGFuX3NlbmRfZW9mMihjKTsKKwkJY2hhbl9zZXRfaXN0YXRlKGMsIENIQU5fSU5QVVRfQ0xPU0VEKTsKKwkJYnJlYWs7CisJfQorfQorCit2b2lkCitjaGFuX3JjdmRfZW93KENoYW5uZWwgKmMpCit7CisJZGVidWcyKCJjaGFubmVsICVkOiByY3ZkIGVvdyIsIGMtPnNlbGYpOworCXN3aXRjaCAoYy0+aXN0YXRlKSB7CisJY2FzZSBDSEFOX0lOUFVUX09QRU46CisJCWNoYW5fc2h1dGRvd25fcmVhZChjKTsKKwkJY2hhbl9zZXRfaXN0YXRlKGMsIENIQU5fSU5QVVRfQ0xPU0VEKTsKKwkJYnJlYWs7CisJfQorfQorc3RhdGljIHZvaWQKK2NoYW5fcmN2ZF9lb2YyKENoYW5uZWwgKmMpCit7CisJZGVidWcyKCJjaGFubmVsICVkOiByY3ZkIGVvZiIsIGMtPnNlbGYpOworCWMtPmZsYWdzIHw9IENIQU5fRU9GX1JDVkQ7CisJaWYgKGMtPm9zdGF0ZSA9PSBDSEFOX09VVFBVVF9PUEVOKQorCQljaGFuX3NldF9vc3RhdGUoYywgQ0hBTl9PVVRQVVRfV0FJVF9EUkFJTik7Cit9CitzdGF0aWMgdm9pZAorY2hhbl93cml0ZV9mYWlsZWQyKENoYW5uZWwgKmMpCit7CisJZGVidWcyKCJjaGFubmVsICVkOiB3cml0ZSBmYWlsZWQiLCBjLT5zZWxmKTsKKwlzd2l0Y2ggKGMtPm9zdGF0ZSkgeworCWNhc2UgQ0hBTl9PVVRQVVRfT1BFTjoKKwljYXNlIENIQU5fT1VUUFVUX1dBSVRfRFJBSU46CisJCWNoYW5fc2h1dGRvd25fd3JpdGUoYyk7CisJCWlmIChzdHJjbXAoYy0+Y3R5cGUsICJzZXNzaW9uIikgPT0gMCkKKwkJCWNoYW5fc2VuZF9lb3cyKGMpOworCQljaGFuX3NldF9vc3RhdGUoYywgQ0hBTl9PVVRQVVRfQ0xPU0VEKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyb3IoImNoYW5uZWwgJWQ6IGNoYW5fd3JpdGVfZmFpbGVkIGZvciBvc3RhdGUgJWQiLAorCQkgICAgYy0+c2VsZiwgYy0+b3N0YXRlKTsKKwkJYnJlYWs7CisJfQorfQorc3RhdGljIHZvaWQKK2NoYW5fc2VuZF9lb2YyKENoYW5uZWwgKmMpCit7CisJZGVidWcyKCJjaGFubmVsICVkOiBzZW5kIGVvZiIsIGMtPnNlbGYpOworCXN3aXRjaCAoYy0+aXN0YXRlKSB7CisJY2FzZSBDSEFOX0lOUFVUX1dBSVRfRFJBSU46CisJCXBhY2tldF9zdGFydChTU0gyX01TR19DSEFOTkVMX0VPRik7CisJCXBhY2tldF9wdXRfaW50KGMtPnJlbW90ZV9pZCk7CisJCXBhY2tldF9zZW5kKCk7CisJCWMtPmZsYWdzIHw9IENIQU5fRU9GX1NFTlQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycm9yKCJjaGFubmVsICVkOiBjYW5ub3Qgc2VuZCBlb2YgZm9yIGlzdGF0ZSAlZCIsCisJCSAgICBjLT5zZWxmLCBjLT5pc3RhdGUpOworCQlicmVhazsKKwl9Cit9CitzdGF0aWMgdm9pZAorY2hhbl9zZW5kX2Nsb3NlMihDaGFubmVsICpjKQoreworCWRlYnVnMigiY2hhbm5lbCAlZDogc2VuZCBjbG9zZSIsIGMtPnNlbGYpOworCWlmIChjLT5vc3RhdGUgIT0gQ0hBTl9PVVRQVVRfQ0xPU0VEIHx8CisJICAgIGMtPmlzdGF0ZSAhPSBDSEFOX0lOUFVUX0NMT1NFRCkgeworCQllcnJvcigiY2hhbm5lbCAlZDogY2Fubm90IHNlbmQgY2xvc2UgZm9yIGlzdGF0ZS9vc3RhdGUgJWQvJWQiLAorCQkgICAgYy0+c2VsZiwgYy0+aXN0YXRlLCBjLT5vc3RhdGUpOworCX0gZWxzZSBpZiAoYy0+ZmxhZ3MgJiBDSEFOX0NMT1NFX1NFTlQpIHsKKwkJZXJyb3IoImNoYW5uZWwgJWQ6IGFscmVhZHkgc2VudCBjbG9zZSIsIGMtPnNlbGYpOworCX0gZWxzZSB7CisJCXBhY2tldF9zdGFydChTU0gyX01TR19DSEFOTkVMX0NMT1NFKTsKKwkJcGFja2V0X3B1dF9pbnQoYy0+cmVtb3RlX2lkKTsKKwkJcGFja2V0X3NlbmQoKTsKKwkJYy0+ZmxhZ3MgfD0gQ0hBTl9DTE9TRV9TRU5UOworCX0KK30KK3N0YXRpYyB2b2lkCitjaGFuX3NlbmRfZW93MihDaGFubmVsICpjKQoreworCWRlYnVnMigiY2hhbm5lbCAlZDogc2VuZCBlb3ciLCBjLT5zZWxmKTsKKwlpZiAoYy0+b3N0YXRlID09IENIQU5fT1VUUFVUX0NMT1NFRCkgeworCQllcnJvcigiY2hhbm5lbCAlZDogbXVzdCBub3Qgc2VudCBlb3cgb24gY2xvc2VkIG91dHB1dCIsCisJCSAgICBjLT5zZWxmKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIShkYXRhZmVsbG93cyAmIFNTSF9ORVdfT1BFTlNTSCkpCisJCXJldHVybjsKKwlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfQ0hBTk5FTF9SRVFVRVNUKTsKKwlwYWNrZXRfcHV0X2ludChjLT5yZW1vdGVfaWQpOworCXBhY2tldF9wdXRfY3N0cmluZygiZW93QG9wZW5zc2guY29tIik7CisJcGFja2V0X3B1dF9jaGFyKDApOworCXBhY2tldF9zZW5kKCk7Cit9CisKKy8qIHNoYXJlZCAqLworCit2b2lkCitjaGFuX3JjdmRfaWVvZihDaGFubmVsICpjKQoreworCWlmIChjb21wYXQyMCkKKwkJY2hhbl9yY3ZkX2VvZjIoYyk7CisJZWxzZQorCQljaGFuX3JjdmRfaWVvZjEoYyk7CisJaWYgKGMtPm9zdGF0ZSA9PSBDSEFOX09VVFBVVF9XQUlUX0RSQUlOICYmCisJICAgIGJ1ZmZlcl9sZW4oJmMtPm91dHB1dCkgPT0gMCAmJgorCSAgICAhQ0hBTk5FTF9FRkRfT1VUUFVUX0FDVElWRShjKSkKKwkJY2hhbl9vYnVmX2VtcHR5KGMpOworfQordm9pZAorY2hhbl9yY3ZkX29jbG9zZShDaGFubmVsICpjKQoreworCWlmIChjb21wYXQyMCkKKwkJY2hhbl9yY3ZkX2Nsb3NlMihjKTsKKwllbHNlCisJCWNoYW5fcmN2ZF9vY2xvc2UxKGMpOworfQordm9pZAorY2hhbl93cml0ZV9mYWlsZWQoQ2hhbm5lbCAqYykKK3sKKwlpZiAoY29tcGF0MjApCisJCWNoYW5fd3JpdGVfZmFpbGVkMihjKTsKKwllbHNlCisJCWNoYW5fd3JpdGVfZmFpbGVkMShjKTsKK30KKwordm9pZAorY2hhbl9tYXJrX2RlYWQoQ2hhbm5lbCAqYykKK3sKKwljLT50eXBlID0gU1NIX0NIQU5ORUxfWk9NQklFOworfQorCitpbnQKK2NoYW5faXNfZGVhZChDaGFubmVsICpjLCBpbnQgZG9fc2VuZCkKK3sKKwlpZiAoYy0+dHlwZSA9PSBTU0hfQ0hBTk5FTF9aT01CSUUpIHsKKwkJZGVidWcyKCJjaGFubmVsICVkOiB6b21iaWUiLCBjLT5zZWxmKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChjLT5pc3RhdGUgIT0gQ0hBTl9JTlBVVF9DTE9TRUQgfHwgYy0+b3N0YXRlICE9IENIQU5fT1VUUFVUX0NMT1NFRCkKKwkJcmV0dXJuIDA7CisJaWYgKCFjb21wYXQyMCkgeworCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IGlzIGRlYWQiLCBjLT5zZWxmKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmICgoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX0VYVEVPRikgJiYKKwkgICAgYy0+ZXh0ZW5kZWRfdXNhZ2UgPT0gQ0hBTl9FWFRFTkRFRF9XUklURSAmJgorCSAgICBjLT5lZmQgIT0gLTEgJiYKKwkgICAgYnVmZmVyX2xlbigmYy0+ZXh0ZW5kZWQpID4gMCkgeworCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IGFjdGl2ZSBlZmQ6ICVkIGxlbiAlZCIsCisJCSAgICBjLT5zZWxmLCBjLT5lZmQsIGJ1ZmZlcl9sZW4oJmMtPmV4dGVuZGVkKSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoYy0+ZmxhZ3MgJiBDSEFOX0xPQ0FMKSB7CisJCWRlYnVnMigiY2hhbm5lbCAlZDogaXMgZGVhZCAobG9jYWwpIiwgYy0+c2VsZik7CisJCXJldHVybiAxOworCX0JCQorCWlmICghKGMtPmZsYWdzICYgQ0hBTl9DTE9TRV9TRU5UKSkgeworCQlpZiAoZG9fc2VuZCkgeworCQkJY2hhbl9zZW5kX2Nsb3NlMihjKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGNoYW5uZWwgd291bGQgYmUgZGVhZCBpZiB3ZSBzZW50IGEgY2xvc2UgKi8KKwkJCWlmIChjLT5mbGFncyAmIENIQU5fQ0xPU0VfUkNWRCkgeworCQkJCWRlYnVnMigiY2hhbm5lbCAlZDogYWxtb3N0IGRlYWQiLAorCQkJCSAgICBjLT5zZWxmKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoKGMtPmZsYWdzICYgQ0hBTl9DTE9TRV9TRU5UKSAmJgorCSAgICAoYy0+ZmxhZ3MgJiBDSEFOX0NMT1NFX1JDVkQpKSB7CisJCWRlYnVnMigiY2hhbm5lbCAlZDogaXMgZGVhZCIsIGMtPnNlbGYpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGhlbHBlciAqLworc3RhdGljIHZvaWQKK2NoYW5fc2h1dGRvd25fd3JpdGUoQ2hhbm5lbCAqYykKK3sKKwlidWZmZXJfY2xlYXIoJmMtPm91dHB1dCk7CisJaWYgKGNvbXBhdDIwICYmIGMtPnR5cGUgPT0gU1NIX0NIQU5ORUxfTEFSVkFMKQorCQlyZXR1cm47CisJLyogc2h1dGRvd24gZmFpbHVyZSBpcyBhbGxvd2VkIGlmIHdyaXRlIGZhaWxlZCBhbHJlYWR5ICovCisJZGVidWcyKCJjaGFubmVsICVkOiBjbG9zZV93cml0ZSIsIGMtPnNlbGYpOworCWlmIChjLT5zb2NrICE9IC0xKSB7CisJCWlmIChzaHV0ZG93bihjLT5zb2NrLCBTSFVUX1dSKSA8IDApCisJCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IGNoYW5fc2h1dGRvd25fd3JpdGU6ICIKKwkJCSAgICAic2h1dGRvd24oKSBmYWlsZWQgZm9yIGZkICVkOiAlLjEwMHMiLAorCQkJICAgIGMtPnNlbGYsIGMtPnNvY2ssIHN0cmVycm9yKGVycm5vKSk7CisJfSBlbHNlIHsKKwkJaWYgKGNoYW5uZWxfY2xvc2VfZmQoJmMtPndmZCkgPCAwKQorCQkJbG9naXQoImNoYW5uZWwgJWQ6IGNoYW5fc2h1dGRvd25fd3JpdGU6ICIKKwkJCSAgICAiY2xvc2UoKSBmYWlsZWQgZm9yIGZkICVkOiAlLjEwMHMiLAorCQkJICAgIGMtPnNlbGYsIGMtPndmZCwgc3RyZXJyb3IoZXJybm8pKTsKKwl9Cit9CitzdGF0aWMgdm9pZAorY2hhbl9zaHV0ZG93bl9yZWFkKENoYW5uZWwgKmMpCit7CisJaWYgKGNvbXBhdDIwICYmIGMtPnR5cGUgPT0gU1NIX0NIQU5ORUxfTEFSVkFMKQorCQlyZXR1cm47CisJZGVidWcyKCJjaGFubmVsICVkOiBjbG9zZV9yZWFkIiwgYy0+c2VsZik7CisJaWYgKGMtPnNvY2sgIT0gLTEpIHsKKwkJLyoKKwkJICogc2h1dGRvd24oc29jaywgU0hVVF9SRUFEKSBtYXkgcmV0dXJuIEVOT1RDT05OIGlmIHRoZQorCQkgKiB3cml0ZSBzaWRlIGhhcyBiZWVuIGNsb3NlZCBhbHJlYWR5LiAoYnVnIG9uIExpbnV4KQorCQkgKiBIUC1VWCBtYXkgcmV0dXJuIEVOT1RDT05OIGFsc28uCisJCSAqLworCQlpZiAoc2h1dGRvd24oYy0+c29jaywgU0hVVF9SRCkgPCAwCisJCSAgICAmJiBlcnJubyAhPSBFTk9UQ09OTikKKwkJCWVycm9yKCJjaGFubmVsICVkOiBjaGFuX3NodXRkb3duX3JlYWQ6ICIKKwkJCSAgICAic2h1dGRvd24oKSBmYWlsZWQgZm9yIGZkICVkIFtpJWQgbyVkXTogJS4xMDBzIiwKKwkJCSAgICBjLT5zZWxmLCBjLT5zb2NrLCBjLT5pc3RhdGUsIGMtPm9zdGF0ZSwKKwkJCSAgICBzdHJlcnJvcihlcnJubykpOworCX0gZWxzZSB7CisJCWlmIChjaGFubmVsX2Nsb3NlX2ZkKCZjLT5yZmQpIDwgMCkKKwkJCWxvZ2l0KCJjaGFubmVsICVkOiBjaGFuX3NodXRkb3duX3JlYWQ6ICIKKwkJCSAgICAiY2xvc2UoKSBmYWlsZWQgZm9yIGZkICVkOiAlLjEwMHMiLAorCQkJICAgIGMtPnNlbGYsIGMtPnJmZCwgc3RyZXJyb3IoZXJybm8pKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL25jaGFuLm1zIGIvb3BlbnNzaC02LjBwMS9uY2hhbi5tcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzU3NjAxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9uY2hhbi5tcwpAQCAtMCwwICsxLDk5IEBACisuXCIJJE9wZW5CU0Q6IG5jaGFuLm1zLHYgMS44IDIwMDMvMTEvMjEgMTE6NTc6MDMgZGptIEV4cCAkCisuXCIKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5OSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisuXCIgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLlwiIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisuXCIgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLlwiIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLlwiIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy5cIiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy5cIiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisuXCIgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisuXCIgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy5cIgorLlRMCitPcGVuU1NIIENoYW5uZWwgQ2xvc2UgUHJvdG9jb2wgMS41IEltcGxlbWVudGF0aW9uCisuU0gKK0NoYW5uZWwgSW5wdXQgU3RhdGUgRGlhZ3JhbQorLlBTCityZXNldAorbD0xCitzPTEuMgorZWxsaXBzZXdpZD1zKmVsbGlwc2V3aWQKK2JveHdpZD1zKmJveHdpZAorZWxsaXBzZWh0PXMqZWxsaXBzZWh0CitTMTogZWxsaXBzZSAiSU5QVVQiICJPUEVOIgorbW92ZSByaWdodCAyKmwgZnJvbSBsYXN0IGVsbGlwc2UuZQorUzQ6IGVsbGlwc2UgIklOUFVUIiAiQ0xPU0VEIgorbW92ZSBkb3duIGwgZnJvbSBsYXN0IGVsbGlwc2UucworUzM6IGVsbGlwc2UgIklOUFVUIiAiV0FJVCIgIk9DTE9TRUQiCittb3ZlIGRvd24gbCBmcm9tIDFzdCBlbGxpcHNlLnMKK1MyOiBlbGxpcHNlICJJTlBVVCIgIldBSVQiICJEUkFJTiIKK2Fycm93ICIiICJyY3ZkIE9DTE9TRS8iICJzaHV0ZG93bl9yZWFkIiAic2VuZCBJRU9GIiBmcm9tIFMxLmUgdG8gUzQudworYXJyb3cgImlidWZfZW1wdHkvIiAic2VuZCBJRU9GIiBmcm9tIFMyLmUgdG8gUzMudworYXJyb3cgZnJvbSBTMS5zIHRvIFMyLm4KK2JveCBpbnZpcyAicmVhZF9mYWlsZWQvIiAic2h1dGRvd25fcmVhZCIgd2l0aCAuZSBhdCBsYXN0IGFycm93LmMKK2Fycm93ICBmcm9tIFMzLm4gdG8gUzQucworYm94IGludmlzICJyY3ZkIE9DTE9TRS8iICItIiB3aXRoIC53IGF0IGxhc3QgYXJyb3cuYworZWxsaXBzZSB3aWQgLjkqZWxsaXBzZXdpZCBodCAuOSplbGxpcHNlaHQgYXQgUzQKK2Fycm93ICJzdGFydCIgIiIgZnJvbSBTMS53KygtMC41LDApIHRvIFMxLncKK2Fycm93IGZyb20gUzIubmUgdG8gUzQuc3cKK2JveCBpbnZpcyAicmN2ZCBPQ0xPU0UvICAgICAiIHdpdGggLmUgYXQgbGFzdCBhcnJvdy5jCitib3ggaW52aXMgIiBzZW5kIElFT0YiIHdpdGggLncgYXQgbGFzdCBhcnJvdy5jCisuUEUKKy5TSAorQ2hhbm5lbCBPdXRwdXQgU3RhdGUgRGlhZ3JhbQorLlBTCitTMTogZWxsaXBzZSAiT1VUUFVUIiAiT1BFTiIKK21vdmUgcmlnaHQgMipsIGZyb20gbGFzdCBlbGxpcHNlLmUKK1MzOiBlbGxpcHNlICJPVVRQVVQiICJXQUlUIiAiSUVPRiIKK21vdmUgZG93biBsIGZyb20gbGFzdCBlbGxpcHNlLnMKK1M0OiBlbGxpcHNlICJPVVRQVVQiICJDTE9TRUQiCittb3ZlIGRvd24gbCBmcm9tIDFzdCBlbGxpcHNlLnMKK1MyOiBlbGxpcHNlICJPVVRQVVQiICJXQUlUIiAiRFJBSU4iCithcnJvdyAiIiAid3JpdGVfZmFpbGVkLyIgInNodXRkb3duX3dyaXRlIiAic2VuZCBPQ0xPU0UiIGZyb20gUzEuZSB0byBTMy53CithcnJvdyAib2J1Zl9lbXB0eSB8fCIgIndyaXRlX2ZhaWxlZC8iICJzaHV0ZG93bl93cml0ZSIgInNlbmQgT0NMT1NFIiBmcm9tIFMyLmUgdG8gUzQudworYXJyb3cgZnJvbSBTMS5zIHRvIFMyLm4KK2JveCBpbnZpcyAicmN2ZCBJRU9GLyIgIi0iIHdpdGggLmUgYXQgbGFzdCBhcnJvdy5jCithcnJvdyBmcm9tIFMzLnMgdG8gUzQubgorYm94IGludmlzICJyY3ZkIElFT0YvIiAiLSIgd2l0aCAudyBhdCBsYXN0IGFycm93LmMKK2VsbGlwc2Ugd2lkIC45KmVsbGlwc2V3aWQgaHQgLjkqZWxsaXBzZWh0IGF0IFM0CithcnJvdyAic3RhcnQiICIiIGZyb20gUzEudysoLTAuNSwwKSB0byBTMS53CisuUEUKKy5TSAorTm90ZXMKKy5QUAorVGhlIGlucHV0IGJ1ZmZlciBpcyBmaWxsZWQgd2l0aCBkYXRhIGZyb20gdGhlIHNvY2tldAorKHRoZSBzb2NrZXQgcmVwcmVzZW50cyB0aGUgbG9jYWwgY29uc3VtZXIvcHJvZHVjZXIgb2YgdGhlCitmb3J3YXJkZWQgY2hhbm5lbCkuCitUaGUgZGF0YSBpcyB0aGVuIHNlbnQgb3ZlciB0aGUgSU5QVVQtZW5kICh0cmFuc21pdC1lbmQpIG9mIHRoZSBjaGFubmVsIHRvIHRoZQorcmVtb3RlIHBlZXIuCitEYXRhIHNlbnQgYnkgdGhlIHBlZXIgaXMgcmVjZWl2ZWQgb24gdGhlIE9VVFBVVC1lbmQgKHJlY2VpdmUtZW5kKSwKK3NhdmVkIGluIHRoZSBvdXRwdXQgYnVmZmVyIGFuZCB3cml0dGVuIHRvIHRoZSBzb2NrZXQuCisuUFAKK0lmIHRoZSBsb2NhbCBwcm90b2NvbCBpbnN0YW5jZSBoYXMgZm9yd2FyZGVkIGFsbCBkYXRhIG9uIHRoZQorSU5QVVQtZW5kIG9mIHRoZSBjaGFubmVsLCBpdCBzZW5kcyBhbiBJRU9GIG1lc3NhZ2UgdG8gdGhlIHBlZXIuCitJZiB0aGUgcGVlciByZWNlaXZlcyB0aGUgSUVPRiBhbmQgaGFzIGNvbnN1bWVkIGFsbAorZGF0YSBoZSByZXBsaWVzIHdpdGggYW4gT0NMT1NFLgorV2hlbiB0aGUgbG9jYWwgaW5zdGFuY2UgcmVjZWl2ZXMgdGhlIE9DTE9TRQoraGUgY29uc2lkZXJzIHRoZSBJTlBVVC1oYWxmIG9mIHRoZSBjaGFubmVsIGNsb3NlZC4KK1RoZSBwZWVyIGhhcyBoaXMgT1VUT1VULWhhbGYgY2xvc2VkLgorLlBQCitBIGNoYW5uZWwgY2FuIGJlIGRlYWxsb2NhdGVkIGJ5IGEgcHJvdG9jb2wgaW5zdGFuY2UKK2lmIGJvdGggdGhlIElOUFVULSBhbmQgdGhlIE9VVE9VVC1oYWxmIG9uIGhpcworc2lkZSBvZiB0aGUgY2hhbm5lbCBhcmUgY2xvc2VkLgorTm90ZSB0aGF0IHdoZW4gYW4gaW5zdGFuY2UgaXMgdW5hYmxlIHRvIGNvbnN1bWUgdGhlCityZWNlaXZlZCBkYXRhLCBoZSBpcyBwZXJtaXR0ZWQgdG8gc2VuZCBhbiBPQ0xPU0UKK2JlZm9yZSB0aGUgbWF0Y2hpbmcgSUVPRiBpcyByZWNlaXZlZC4KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvbmNoYW4yLm1zIGIvb3BlbnNzaC02LjBwMS9uY2hhbjIubXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAwMTUwNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvbmNoYW4yLm1zCkBAIC0wLDAgKzEsODggQEAKKy5cIgkkT3BlbkJTRDogbmNoYW4yLm1zLHYgMS40IDIwMDgvMDUvMTUgMjM6NTI6MjQgZGptIEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLlwiIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy5cIiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLlwiIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy5cIiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy5cIiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisuXCIgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisuXCIgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLlwiIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLlwiIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisuXCIKKy5UTAorT3BlblNTSCBDaGFubmVsIENsb3NlIFByb3RvY29sIDIuMCBJbXBsZW1lbnRhdGlvbgorLlNICitDaGFubmVsIElucHV0IFN0YXRlIERpYWdyYW0KKy5QUworcmVzZXQKK2w9MQorcz0xLjIKK2VsbGlwc2V3aWQ9cyplbGxpcHNld2lkCitib3h3aWQ9cypib3h3aWQKK2VsbGlwc2VodD1zKmVsbGlwc2VodAorUzE6IGVsbGlwc2UgIklOUFVUIiAiT1BFTiIKK21vdmUgcmlnaHQgMipsIGZyb20gbGFzdCBlbGxpcHNlLmUKK1MzOiBlbGxpcHNlIGludmlzCittb3ZlIGRvd24gbCBmcm9tIGxhc3QgZWxsaXBzZS5zCitTNDogZWxsaXBzZSAiSU5QVVQiICJDTE9TRUQiCittb3ZlIGRvd24gbCBmcm9tIDFzdCBlbGxpcHNlLnMKK1MyOiBlbGxpcHNlICJJTlBVVCIgIldBSVQiICJEUkFJTiIKK2Fycm93IGZyb20gUzEuZSB0byBTNC5uCitib3ggaW52aXMgInJjdmQgQ0xPU0UvIiAic2h1dGRvd25fcmVhZCIgd2l0aCAuc3cgYXQgbGFzdCBhcnJvdy5jCithcnJvdyAiaWJ1Zl9lbXB0eSB8fCIgInJjdmQgQ0xPU0UvIiAic2VuZCBFT0YiICIiIGZyb20gUzIuZSB0byBTNC53CithcnJvdyBmcm9tIFMxLnMgdG8gUzIubgorYm94IGludmlzICJyZWFkX2ZhaWxlZCB8fCIgInJjdmQgRU9XLyIgInNodXRkb3duX3JlYWQiIHdpdGggLmUgYXQgbGFzdCBhcnJvdy5jCitlbGxpcHNlIHdpZCAuOSplbGxpcHNld2lkIGh0IC45KmVsbGlwc2VodCBhdCBTNAorYXJyb3cgInN0YXJ0IiAiIiBmcm9tIFMxLncrKC0wLjUsMCkgdG8gUzEudworLlBFCisuU0gKK0NoYW5uZWwgT3V0cHV0IFN0YXRlIERpYWdyYW0KKy5QUworUzE6IGVsbGlwc2UgIk9VVFBVVCIgIk9QRU4iCittb3ZlIHJpZ2h0IDIqbCBmcm9tIGxhc3QgZWxsaXBzZS5lCitTMzogZWxsaXBzZSBpbnZpcworbW92ZSBkb3duIGwgZnJvbSBsYXN0IGVsbGlwc2UucworUzQ6IGVsbGlwc2UgIk9VVFBVVCIgIkNMT1NFRCIKK21vdmUgZG93biBsIGZyb20gMXN0IGVsbGlwc2UucworUzI6IGVsbGlwc2UgIk9VVFBVVCIgIldBSVQiICJEUkFJTiIKK2Fycm93IGZyb20gUzEuZSB0byBTNC5uCitib3ggaW52aXMgIndyaXRlX2ZhaWxlZC8iICJzaHV0ZG93bl93cml0ZSIgInNlbmQgRU9XIiB3aXRoIC5zdyBhdCBsYXN0IGFycm93LmMKK2Fycm93ICJvYnVmX2VtcHR5IHx8IiAid3JpdGVfZmFpbGVkLyIgInNodXRkb3duX3dyaXRlIiAiIiBmcm9tIFMyLmUgdG8gUzQudworYXJyb3cgZnJvbSBTMS5zIHRvIFMyLm4KK2JveCBpbnZpcyAicmN2ZCBFT0YgfHwiICJyY3ZkIENMT1NFLyIgIi0iIHdpdGggLmUgYXQgbGFzdCBhcnJvdy5jCitlbGxpcHNlIHdpZCAuOSplbGxpcHNld2lkIGh0IC45KmVsbGlwc2VodCBhdCBTNAorYXJyb3cgInN0YXJ0IiAiIiBmcm9tIFMxLncrKC0wLjUsMCkgdG8gUzEudworLlBFCisuU0gKK05vdGVzCisuUFAKK1RoZSBpbnB1dCBidWZmZXIgaXMgZmlsbGVkIHdpdGggZGF0YSBmcm9tIHRoZSBzb2NrZXQKKyh0aGUgc29ja2V0IHJlcHJlc2VudHMgdGhlIGxvY2FsIGNvbnN1bWVyL3Byb2R1Y2VyIG9mIHRoZQorZm9yd2FyZGVkIGNoYW5uZWwpLgorVGhlIGRhdGEgaXMgdGhlbiBzZW50IG92ZXIgdGhlIElOUFVULWVuZCAodHJhbnNtaXQtZW5kKSBvZiB0aGUgY2hhbm5lbCB0byB0aGUKK3JlbW90ZSBwZWVyLgorRGF0YSBzZW50IGJ5IHRoZSBwZWVyIGlzIHJlY2VpdmVkIG9uIHRoZSBPVVRQVVQtZW5kIChyZWNlaXZlLWVuZCksCitzYXZlZCBpbiB0aGUgb3V0cHV0IGJ1ZmZlciBhbmQgd3JpdHRlbiB0byB0aGUgc29ja2V0LgorLlBQCitJZiB0aGUgbG9jYWwgcHJvdG9jb2wgaW5zdGFuY2UgaGFzIGZvcndhcmRlZCBhbGwgZGF0YSBvbiB0aGUKK0lOUFVULWVuZCBvZiB0aGUgY2hhbm5lbCwgaXQgc2VuZHMgYW4gRU9GIG1lc3NhZ2UgdG8gdGhlIHBlZXIuCisuUFAKK0EgQ0xPU0UgbWVzc2FnZSBpcyBzZW50IHRvIHRoZSBwZWVyIGlmCitib3RoIHRoZSBJTlBVVC0gYW5kIHRoZSBPVVRPVVQtaGFsZiBvZiB0aGUgbG9jYWwKK2VuZCBvZiB0aGUgY2hhbm5lbCBhcmUgY2xvc2VkLgorLlBQCitUaGUgY2hhbm5lbCBjYW4gYmUgZGVhbGxvY2F0ZWQgYnkgYSBwcm90b2NvbCBpbnN0YW5jZQoraWYgYSBDTE9TRSBtZXNzYWdlIGhlIGJlZW4gYm90aCBzZW50IGFuZCByZWNlaXZlZC4KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvTWFrZWZpbGUuaW4gYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NmE4MWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNDIgQEAKKyMgJElkOiBNYWtlZmlsZS5pbix2IDEuNDggMjAxMS8xMS8wNCAwMDoyNToyNSBkdHVja2VyIEV4cCAkCisKK3N5c2NvbmZkaXI9QHN5c2NvbmZkaXJACitwaWRkaXI9QHBpZGRpckAKK3NyY2Rpcj1Ac3JjZGlyQAordG9wX3NyY2Rpcj1AdG9wX3NyY2RpckAKKworVlBBVEg9QHNyY2RpckAKK0NDPUBDQ0AKK0xEPUBMREAKK0NGTEFHUz1AQ0ZMQUdTQAorQ1BQRkxBR1M9LUkuIC1JLi4gLUkkKHNyY2RpcikgLUkkKHNyY2RpcikvLi4gQENQUEZMQUdTQCBAREVGU0AKK0xJQlM9QExJQlNACitBUj1AQVJACitSQU5MSUI9QFJBTkxJQkAKK0lOU1RBTEw9QElOU1RBTExACitMREZMQUdTPS1MLiBATERGTEFHU0AKKworT1BFTkJTRD1iYXNlNjQubyBiYXNlbmFtZS5vIGJpbmRyZXN2cG9ydC5vIGRhZW1vbi5vIGRpcm5hbWUubyBmbXRfc2NhbGVkLm8gZ2V0Y3dkLm8gZ2V0Z3JvdXBsaXN0Lm8gZ2V0b3B0Lm8gZ2V0cnJzZXRieW5hbWUubyBnbG9iLm8gaW5ldF9hdG9uLm8gaW5ldF9udG9hLm8gaW5ldF9udG9wLm8gbWt0ZW1wLm8gcHdjYWNoZS5vIHJlYWRwYXNzcGhyYXNlLm8gcmVhbHBhdGgubyBycmVzdnBvcnQubyBzZXRlbnYubyBzZXRwcm9jdGl0bGUubyBzaGEyLm8gc2lnYWN0Lm8gc3RybGNhdC5vIHN0cmxjcHkubyBzdHJtb2RlLm8gc3Rybmxlbi5vIHN0cnB0aW1lLm8gc3Ryc2VwLm8gc3RydG9udW0ubyBzdHJ0b2xsLm8gc3RydG91bC5vIHRpbWluZ3NhZmVfYmNtcC5vIHZpcy5vCisKK0NPTVBBVD1ic2QtYXJjNHJhbmRvbS5vIGJzZC1hc3ByaW50Zi5vIGJzZC1jbG9zZWZyb20ubyBic2QtY3JheS5vIGJzZC1jeWd3aW5fdXRpbC5vIGJzZC1nZXRwZWVyZWlkLm8gZ2V0cnJzZXRieW5hbWUtbGRucy5vIGJzZC1taXNjLm8gYnNkLW5leHRzdGVwLm8gYnNkLW9wZW5wdHkubyBic2QtcG9sbC5vIGJzZC1zbnByaW50Zi5vIGJzZC1zdGF0dmZzLm8gYnNkLXdhaXRwaWQubyBmYWtlLXJmYzI1NTMubyBvcGVuc3NsLWNvbXBhdC5vIHhtbWFwLm8geGNyeXB0Lm8KKworUE9SVFM9cG9ydC1haXgubyBwb3J0LWlyaXgubyBwb3J0LWxpbnV4Lm8gcG9ydC1zb2xhcmlzLm8gcG9ydC10dW4ubyBwb3J0LXV3Lm8KKworLmMubzoKKwkkKENDKSAkKENGTEFHUykgJChDUFBGTEFHUykgLWMgJDwKKworYWxsOiBsaWJvcGVuYnNkLWNvbXBhdC5hCisKKyQoQ09NUEFUKTogLi4vY29uZmlnLmgKKyQoT1BFTkJTRCk6IC4uL2NvbmZpZy5oCiskKFBPUlRTKTogLi4vY29uZmlnLmgKKworbGlib3BlbmJzZC1jb21wYXQuYTogICQoQ09NUEFUKSAkKE9QRU5CU0QpICQoUE9SVFMpCisJJChBUikgcnYgJEAgJChDT01QQVQpICQoT1BFTkJTRCkgJChQT1JUUykKKwkkKFJBTkxJQikgJEAKKworY2xlYW46CisJcm0gLWYgKi5vICouYSBjb3JlIAorCitkaXN0Y2xlYW46IGNsZWFuCisJcm0gLWYgTWFrZWZpbGUgKn4KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYmFzZTY0LmMgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2Jhc2U2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNzQ2NjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2Jhc2U2NC5jCkBAIC0wLDAgKzEsMzE1IEBACisvKgkkT3BlbkJTRDogYmFzZTY0LmMsdiAxLjUgMjAwNi8xMC8yMSAwOTo1NTowMyBvdHRvIEV4cCAkCSovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYgYnkgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1bS4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIElOVEVSTkVUIFNPRlRXQVJFIENPTlNPUlRJVU0gRElTQ0xBSU1TCisgKiBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIElOVEVSTkVUIFNPRlRXQVJFCisgKiBDT05TT1JUSVVNIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMKKyAqIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUworICogU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5NSBieSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzLCBJbmMuCisgKgorICogSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgSW5jLiAoaGVyZWluYWZ0ZXIgY2FsbGVkIElCTSkgZ3JhbnRzCisgKiBwZXJtaXNzaW9uIHVuZGVyIGl0cyBjb3B5cmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBTb2Z0d2FyZSB3aXRoIG9yIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogYWxsIHBhcmFncmFwaHMgb2YgdGhpcyBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IHRoZSBuYW1lIG9mIElCTQorICogbm90IGJlIHVzZWQgaW4gY29ubmVjdGlvbiB3aXRoIHRoZSBtYXJrZXRpbmcgb2YgYW55IHByb2R1Y3QgaW5jb3Jwb3JhdGluZworICogdGhlIFNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmVvZiwgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvcgorICogcGVybWlzc2lvbi4KKyAqCisgKiBUbyB0aGUgZXh0ZW50IGl0IGhhcyBhIHJpZ2h0IHRvIGRvIHNvLCBJQk0gZ3JhbnRzIGFuIGltbXVuaXR5IGZyb20gc3VpdAorICogdW5kZXIgaXRzIHBhdGVudHMsIGlmIGFueSwgZm9yIHRoZSB1c2UsIHNhbGUgb3IgbWFudWZhY3R1cmUgb2YgcHJvZHVjdHMgdG8KKyAqIHRoZSBleHRlbnQgdGhhdCBzdWNoIHByb2R1Y3RzIGFyZSB1c2VkIGZvciBwZXJmb3JtaW5nIERvbWFpbiBOYW1lIFN5c3RlbQorICogZHluYW1pYyB1cGRhdGVzIGluIFRDUC9JUCBuZXR3b3JrcyBieSBtZWFucyBvZiB0aGUgU29mdHdhcmUuICBObyBpbW11bml0eSBpcworICogZ3JhbnRlZCBmb3IgYW55IHByb2R1Y3QgcGVyIHNlIG9yIGZvciBhbnkgb3RoZXIgZnVuY3Rpb24gb2YgYW55IHByb2R1Y3QuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIEFORCBJQk0gRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBCisgKiBQQVJUSUNVTEFSIFBVUlBPU0UuICBJTiBOTyBFVkVOVCBTSEFMTCBJQk0gQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIEFSSVNJTkcKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBJQk0gSVMgQVBQUklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisvKiBPUEVOQlNEIE9SSUdJTkFMOiBsaWIvbGliYy9uZXQvYmFzZTY0LmMgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpZiAoIWRlZmluZWQoSEFWRV9CNjRfTlRPUCkgJiYgIWRlZmluZWQoSEFWRV9fX0I2NF9OVE9QKSkgfHwgKCFkZWZpbmVkKEhBVkVfQjY0X1BUT04pICYmICFkZWZpbmVkKEhBVkVfX19CNjRfUFRPTikpCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJiYXNlNjQuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgQmFzZTY0W10gPQorCSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKK3N0YXRpYyBjb25zdCBjaGFyIFBhZDY0ID0gJz0nOworCisvKiAoRnJvbSBSRkMxNTIxIGFuZCBkcmFmdC1pZXRmLWRuc3NlYy1zZWNleHQtMDMudHh0KQorICAgVGhlIGZvbGxvd2luZyBlbmNvZGluZyB0ZWNobmlxdWUgaXMgdGFrZW4gZnJvbSBSRkMgMTUyMSBieSBCb3JlbnN0ZWluCisgICBhbmQgRnJlZWQuICBJdCBpcyByZXByb2R1Y2VkIGhlcmUgaW4gYSBzbGlnaHRseSBlZGl0ZWQgZm9ybSBmb3IKKyAgIGNvbnZlbmllbmNlLgorCisgICBBIDY1LWNoYXJhY3RlciBzdWJzZXQgb2YgVVMtQVNDSUkgaXMgdXNlZCwgZW5hYmxpbmcgNiBiaXRzIHRvIGJlCisgICByZXByZXNlbnRlZCBwZXIgcHJpbnRhYmxlIGNoYXJhY3Rlci4gKFRoZSBleHRyYSA2NXRoIGNoYXJhY3RlciwgIj0iLAorICAgaXMgdXNlZCB0byBzaWduaWZ5IGEgc3BlY2lhbCBwcm9jZXNzaW5nIGZ1bmN0aW9uLikKKworICAgVGhlIGVuY29kaW5nIHByb2Nlc3MgcmVwcmVzZW50cyAyNC1iaXQgZ3JvdXBzIG9mIGlucHV0IGJpdHMgYXMgb3V0cHV0CisgICBzdHJpbmdzIG9mIDQgZW5jb2RlZCBjaGFyYWN0ZXJzLiBQcm9jZWVkaW5nIGZyb20gbGVmdCB0byByaWdodCwgYQorICAgMjQtYml0IGlucHV0IGdyb3VwIGlzIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIDMgOC1iaXQgaW5wdXQgZ3JvdXBzLgorICAgVGhlc2UgMjQgYml0cyBhcmUgdGhlbiB0cmVhdGVkIGFzIDQgY29uY2F0ZW5hdGVkIDYtYml0IGdyb3VwcywgZWFjaAorICAgb2Ygd2hpY2ggaXMgdHJhbnNsYXRlZCBpbnRvIGEgc2luZ2xlIGRpZ2l0IGluIHRoZSBiYXNlNjQgYWxwaGFiZXQuCisKKyAgIEVhY2ggNi1iaXQgZ3JvdXAgaXMgdXNlZCBhcyBhbiBpbmRleCBpbnRvIGFuIGFycmF5IG9mIDY0IHByaW50YWJsZQorICAgY2hhcmFjdGVycy4gVGhlIGNoYXJhY3RlciByZWZlcmVuY2VkIGJ5IHRoZSBpbmRleCBpcyBwbGFjZWQgaW4gdGhlCisgICBvdXRwdXQgc3RyaW5nLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgMTogVGhlIEJhc2U2NCBBbHBoYWJldAorCisgICAgICBWYWx1ZSBFbmNvZGluZyAgVmFsdWUgRW5jb2RpbmcgIFZhbHVlIEVuY29kaW5nICBWYWx1ZSBFbmNvZGluZworICAgICAgICAgIDAgQSAgICAgICAgICAgIDE3IFIgICAgICAgICAgICAzNCBpICAgICAgICAgICAgNTEgegorICAgICAgICAgIDEgQiAgICAgICAgICAgIDE4IFMgICAgICAgICAgICAzNSBqICAgICAgICAgICAgNTIgMAorICAgICAgICAgIDIgQyAgICAgICAgICAgIDE5IFQgICAgICAgICAgICAzNiBrICAgICAgICAgICAgNTMgMQorICAgICAgICAgIDMgRCAgICAgICAgICAgIDIwIFUgICAgICAgICAgICAzNyBsICAgICAgICAgICAgNTQgMgorICAgICAgICAgIDQgRSAgICAgICAgICAgIDIxIFYgICAgICAgICAgICAzOCBtICAgICAgICAgICAgNTUgMworICAgICAgICAgIDUgRiAgICAgICAgICAgIDIyIFcgICAgICAgICAgICAzOSBuICAgICAgICAgICAgNTYgNAorICAgICAgICAgIDYgRyAgICAgICAgICAgIDIzIFggICAgICAgICAgICA0MCBvICAgICAgICAgICAgNTcgNQorICAgICAgICAgIDcgSCAgICAgICAgICAgIDI0IFkgICAgICAgICAgICA0MSBwICAgICAgICAgICAgNTggNgorICAgICAgICAgIDggSSAgICAgICAgICAgIDI1IFogICAgICAgICAgICA0MiBxICAgICAgICAgICAgNTkgNworICAgICAgICAgIDkgSiAgICAgICAgICAgIDI2IGEgICAgICAgICAgICA0MyByICAgICAgICAgICAgNjAgOAorICAgICAgICAgMTAgSyAgICAgICAgICAgIDI3IGIgICAgICAgICAgICA0NCBzICAgICAgICAgICAgNjEgOQorICAgICAgICAgMTEgTCAgICAgICAgICAgIDI4IGMgICAgICAgICAgICA0NSB0ICAgICAgICAgICAgNjIgKworICAgICAgICAgMTIgTSAgICAgICAgICAgIDI5IGQgICAgICAgICAgICA0NiB1ICAgICAgICAgICAgNjMgLworICAgICAgICAgMTMgTiAgICAgICAgICAgIDMwIGUgICAgICAgICAgICA0NyB2CisgICAgICAgICAxNCBPICAgICAgICAgICAgMzEgZiAgICAgICAgICAgIDQ4IHcgICAgICAgICAocGFkKSA9CisgICAgICAgICAxNSBQICAgICAgICAgICAgMzIgZyAgICAgICAgICAgIDQ5IHgKKyAgICAgICAgIDE2IFEgICAgICAgICAgICAzMyBoICAgICAgICAgICAgNTAgeQorCisgICBTcGVjaWFsIHByb2Nlc3NpbmcgaXMgcGVyZm9ybWVkIGlmIGZld2VyIHRoYW4gMjQgYml0cyBhcmUgYXZhaWxhYmxlCisgICBhdCB0aGUgZW5kIG9mIHRoZSBkYXRhIGJlaW5nIGVuY29kZWQuICBBIGZ1bGwgZW5jb2RpbmcgcXVhbnR1bSBpcworICAgYWx3YXlzIGNvbXBsZXRlZCBhdCB0aGUgZW5kIG9mIGEgcXVhbnRpdHkuICBXaGVuIGZld2VyIHRoYW4gMjQgaW5wdXQKKyAgIGJpdHMgYXJlIGF2YWlsYWJsZSBpbiBhbiBpbnB1dCBncm91cCwgemVybyBiaXRzIGFyZSBhZGRlZCAob24gdGhlCisgICByaWdodCkgdG8gZm9ybSBhbiBpbnRlZ3JhbCBudW1iZXIgb2YgNi1iaXQgZ3JvdXBzLiAgUGFkZGluZyBhdCB0aGUKKyAgIGVuZCBvZiB0aGUgZGF0YSBpcyBwZXJmb3JtZWQgdXNpbmcgdGhlICc9JyBjaGFyYWN0ZXIuCisKKyAgIFNpbmNlIGFsbCBiYXNlNjQgaW5wdXQgaXMgYW4gaW50ZWdyYWwgbnVtYmVyIG9mIG9jdGV0cywgb25seSB0aGUKKyAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgIAorICAgZm9sbG93aW5nIGNhc2VzIGNhbiBhcmlzZToKKyAgIAorICAgICAgICgxKSB0aGUgZmluYWwgcXVhbnR1bSBvZiBlbmNvZGluZyBpbnB1dCBpcyBhbiBpbnRlZ3JhbAorICAgICAgICAgICBtdWx0aXBsZSBvZiAyNCBiaXRzOyBoZXJlLCB0aGUgZmluYWwgdW5pdCBvZiBlbmNvZGVkCisJICAgb3V0cHV0IHdpbGwgYmUgYW4gaW50ZWdyYWwgbXVsdGlwbGUgb2YgNCBjaGFyYWN0ZXJzCisJICAgd2l0aCBubyAiPSIgcGFkZGluZywKKyAgICAgICAoMikgdGhlIGZpbmFsIHF1YW50dW0gb2YgZW5jb2RpbmcgaW5wdXQgaXMgZXhhY3RseSA4IGJpdHM7CisgICAgICAgICAgIGhlcmUsIHRoZSBmaW5hbCB1bml0IG9mIGVuY29kZWQgb3V0cHV0IHdpbGwgYmUgdHdvCisJICAgY2hhcmFjdGVycyBmb2xsb3dlZCBieSB0d28gIj0iIHBhZGRpbmcgY2hhcmFjdGVycywgb3IKKyAgICAgICAoMykgdGhlIGZpbmFsIHF1YW50dW0gb2YgZW5jb2RpbmcgaW5wdXQgaXMgZXhhY3RseSAxNiBiaXRzOworICAgICAgICAgICBoZXJlLCB0aGUgZmluYWwgdW5pdCBvZiBlbmNvZGVkIG91dHB1dCB3aWxsIGJlIHRocmVlCisJICAgY2hhcmFjdGVycyBmb2xsb3dlZCBieSBvbmUgIj0iIHBhZGRpbmcgY2hhcmFjdGVyLgorICAgKi8KKworI2lmICFkZWZpbmVkKEhBVkVfQjY0X05UT1ApICYmICFkZWZpbmVkKEhBVkVfX19CNjRfTlRPUCkgCitpbnQKK2I2NF9udG9wKHVfY2hhciBjb25zdCAqc3JjLCBzaXplX3Qgc3JjbGVuZ3RoLCBjaGFyICp0YXJnZXQsIHNpemVfdCB0YXJnc2l6ZSkKK3sKKwlzaXplX3QgZGF0YWxlbmd0aCA9IDA7CisJdV9jaGFyIGlucHV0WzNdOworCXVfY2hhciBvdXRwdXRbNF07CisJdV9pbnQgaTsKKworCXdoaWxlICgyIDwgc3JjbGVuZ3RoKSB7CisJCWlucHV0WzBdID0gKnNyYysrOworCQlpbnB1dFsxXSA9ICpzcmMrKzsKKwkJaW5wdXRbMl0gPSAqc3JjKys7CisJCXNyY2xlbmd0aCAtPSAzOworCisJCW91dHB1dFswXSA9IGlucHV0WzBdID4+IDI7CisJCW91dHB1dFsxXSA9ICgoaW5wdXRbMF0gJiAweDAzKSA8PCA0KSArIChpbnB1dFsxXSA+PiA0KTsKKwkJb3V0cHV0WzJdID0gKChpbnB1dFsxXSAmIDB4MGYpIDw8IDIpICsgKGlucHV0WzJdID4+IDYpOworCQlvdXRwdXRbM10gPSBpbnB1dFsyXSAmIDB4M2Y7CisKKwkJaWYgKGRhdGFsZW5ndGggKyA0ID4gdGFyZ3NpemUpCisJCQlyZXR1cm4gKC0xKTsKKwkJdGFyZ2V0W2RhdGFsZW5ndGgrK10gPSBCYXNlNjRbb3V0cHV0WzBdXTsKKwkJdGFyZ2V0W2RhdGFsZW5ndGgrK10gPSBCYXNlNjRbb3V0cHV0WzFdXTsKKwkJdGFyZ2V0W2RhdGFsZW5ndGgrK10gPSBCYXNlNjRbb3V0cHV0WzJdXTsKKwkJdGFyZ2V0W2RhdGFsZW5ndGgrK10gPSBCYXNlNjRbb3V0cHV0WzNdXTsKKwl9CisgICAgCisJLyogTm93IHdlIHdvcnJ5IGFib3V0IHBhZGRpbmcuICovCisJaWYgKDAgIT0gc3JjbGVuZ3RoKSB7CisJCS8qIEdldCB3aGF0J3MgbGVmdC4gKi8KKwkJaW5wdXRbMF0gPSBpbnB1dFsxXSA9IGlucHV0WzJdID0gJ1wwJzsKKwkJZm9yIChpID0gMDsgaSA8IHNyY2xlbmd0aDsgaSsrKQorCQkJaW5wdXRbaV0gPSAqc3JjKys7CisJCisJCW91dHB1dFswXSA9IGlucHV0WzBdID4+IDI7CisJCW91dHB1dFsxXSA9ICgoaW5wdXRbMF0gJiAweDAzKSA8PCA0KSArIChpbnB1dFsxXSA+PiA0KTsKKwkJb3V0cHV0WzJdID0gKChpbnB1dFsxXSAmIDB4MGYpIDw8IDIpICsgKGlucHV0WzJdID4+IDYpOworCisJCWlmIChkYXRhbGVuZ3RoICsgNCA+IHRhcmdzaXplKQorCQkJcmV0dXJuICgtMSk7CisJCXRhcmdldFtkYXRhbGVuZ3RoKytdID0gQmFzZTY0W291dHB1dFswXV07CisJCXRhcmdldFtkYXRhbGVuZ3RoKytdID0gQmFzZTY0W291dHB1dFsxXV07CisJCWlmIChzcmNsZW5ndGggPT0gMSkKKwkJCXRhcmdldFtkYXRhbGVuZ3RoKytdID0gUGFkNjQ7CisJCWVsc2UKKwkJCXRhcmdldFtkYXRhbGVuZ3RoKytdID0gQmFzZTY0W291dHB1dFsyXV07CisJCXRhcmdldFtkYXRhbGVuZ3RoKytdID0gUGFkNjQ7CisJfQorCWlmIChkYXRhbGVuZ3RoID49IHRhcmdzaXplKQorCQlyZXR1cm4gKC0xKTsKKwl0YXJnZXRbZGF0YWxlbmd0aF0gPSAnXDAnOwkvKiBSZXR1cm5lZCB2YWx1ZSBkb2Vzbid0IGNvdW50IFwwLiAqLworCXJldHVybiAoZGF0YWxlbmd0aCk7Cit9CisjZW5kaWYgLyogIWRlZmluZWQoSEFWRV9CNjRfTlRPUCkgJiYgIWRlZmluZWQoSEFWRV9fX0I2NF9OVE9QKSAqLworCisjaWYgIWRlZmluZWQoSEFWRV9CNjRfUFRPTikgJiYgIWRlZmluZWQoSEFWRV9fX0I2NF9QVE9OKQorCisvKiBza2lwcyBhbGwgd2hpdGVzcGFjZSBhbnl3aGVyZS4KKyAgIGNvbnZlcnRzIGNoYXJhY3RlcnMsIGZvdXIgYXQgYSB0aW1lLCBzdGFydGluZyBhdCAob3IgYWZ0ZXIpCisgICBzcmMgZnJvbSBiYXNlIC0gNjQgbnVtYmVycyBpbnRvIHRocmVlIDggYml0IGJ5dGVzIGluIHRoZSB0YXJnZXQgYXJlYS4KKyAgIGl0IHJldHVybnMgdGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHN0b3JlZCBhdCB0aGUgdGFyZ2V0LCBvciAtMSBvbiBlcnJvci4KKyAqLworCitpbnQKK2I2NF9wdG9uKGNoYXIgY29uc3QgKnNyYywgdV9jaGFyICp0YXJnZXQsIHNpemVfdCB0YXJnc2l6ZSkKK3sKKwl1X2ludCB0YXJpbmRleCwgc3RhdGU7CisJaW50IGNoOworCWNoYXIgKnBvczsKKworCXN0YXRlID0gMDsKKwl0YXJpbmRleCA9IDA7CisKKwl3aGlsZSAoKGNoID0gKnNyYysrKSAhPSAnXDAnKSB7CisJCWlmIChpc3NwYWNlKGNoKSkJLyogU2tpcCB3aGl0ZXNwYWNlIGFueXdoZXJlLiAqLworCQkJY29udGludWU7CisKKwkJaWYgKGNoID09IFBhZDY0KQorCQkJYnJlYWs7CisKKwkJcG9zID0gc3RyY2hyKEJhc2U2NCwgY2gpOworCQlpZiAocG9zID09IDApIAkJLyogQSBub24tYmFzZTY0IGNoYXJhY3Rlci4gKi8KKwkJCXJldHVybiAoLTEpOworCisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSAwOgorCQkJaWYgKHRhcmdldCkgeworCQkJCWlmICh0YXJpbmRleCA+PSB0YXJnc2l6ZSkKKwkJCQkJcmV0dXJuICgtMSk7CisJCQkJdGFyZ2V0W3RhcmluZGV4XSA9IChwb3MgLSBCYXNlNjQpIDw8IDI7CisJCQl9CisJCQlzdGF0ZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJaWYgKHRhcmdldCkgeworCQkJCWlmICh0YXJpbmRleCArIDEgPj0gdGFyZ3NpemUpCisJCQkJCXJldHVybiAoLTEpOworCQkJCXRhcmdldFt0YXJpbmRleF0gICB8PSAgKHBvcyAtIEJhc2U2NCkgPj4gNDsKKwkJCQl0YXJnZXRbdGFyaW5kZXgrMV0gID0gKChwb3MgLSBCYXNlNjQpICYgMHgwZikKKwkJCQkJCQk8PCA0IDsKKwkJCX0KKwkJCXRhcmluZGV4Kys7CisJCQlzdGF0ZSA9IDI7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJaWYgKHRhcmdldCkgeworCQkJCWlmICh0YXJpbmRleCArIDEgPj0gdGFyZ3NpemUpCisJCQkJCXJldHVybiAoLTEpOworCQkJCXRhcmdldFt0YXJpbmRleF0gICB8PSAgKHBvcyAtIEJhc2U2NCkgPj4gMjsKKwkJCQl0YXJnZXRbdGFyaW5kZXgrMV0gID0gKChwb3MgLSBCYXNlNjQpICYgMHgwMykKKwkJCQkJCQk8PCA2OworCQkJfQorCQkJdGFyaW5kZXgrKzsKKwkJCXN0YXRlID0gMzsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlpZiAodGFyZ2V0KSB7CisJCQkJaWYgKHRhcmluZGV4ID49IHRhcmdzaXplKQorCQkJCQlyZXR1cm4gKC0xKTsKKwkJCQl0YXJnZXRbdGFyaW5kZXhdIHw9IChwb3MgLSBCYXNlNjQpOworCQkJfQorCQkJdGFyaW5kZXgrKzsKKwkJCXN0YXRlID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBXZSBhcmUgZG9uZSBkZWNvZGluZyBCYXNlLTY0IGNoYXJzLiAgTGV0J3Mgc2VlIGlmIHdlIGVuZGVkCisJICogb24gYSBieXRlIGJvdW5kYXJ5LCBhbmQvb3Igd2l0aCBlcnJvbmVvdXMgdHJhaWxpbmcgY2hhcmFjdGVycy4KKwkgKi8KKworCWlmIChjaCA9PSBQYWQ2NCkgewkJLyogV2UgZ290IGEgcGFkIGNoYXIuICovCisJCWNoID0gKnNyYysrOwkJLyogU2tpcCBpdCwgZ2V0IG5leHQuICovCisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSAwOgkJLyogSW52YWxpZCA9IGluIGZpcnN0IHBvc2l0aW9uICovCisJCWNhc2UgMToJCS8qIEludmFsaWQgPSBpbiBzZWNvbmQgcG9zaXRpb24gKi8KKwkJCXJldHVybiAoLTEpOworCisJCWNhc2UgMjoJCS8qIFZhbGlkLCBtZWFucyBvbmUgYnl0ZSBvZiBpbmZvICovCisJCQkvKiBTa2lwIGFueSBudW1iZXIgb2Ygc3BhY2VzLiAqLworCQkJZm9yICg7IGNoICE9ICdcMCc7IGNoID0gKnNyYysrKQorCQkJCWlmICghaXNzcGFjZShjaCkpCisJCQkJCWJyZWFrOworCQkJLyogTWFrZSBzdXJlIHRoZXJlIGlzIGFub3RoZXIgdHJhaWxpbmcgPSBzaWduLiAqLworCQkJaWYgKGNoICE9IFBhZDY0KQorCQkJCXJldHVybiAoLTEpOworCQkJY2ggPSAqc3JjKys7CQkvKiBTa2lwIHRoZSA9ICovCisJCQkvKiBGYWxsIHRocm91Z2ggdG8gInNpbmdsZSB0cmFpbGluZyA9IiBjYXNlLiAqLworCQkJLyogRkFMTFRIUk9VR0ggKi8KKworCQljYXNlIDM6CQkvKiBWYWxpZCwgbWVhbnMgdHdvIGJ5dGVzIG9mIGluZm8gKi8KKwkJCS8qCisJCQkgKiBXZSBrbm93IHRoaXMgY2hhciBpcyBhbiA9LiAgSXMgdGhlcmUgYW55dGhpbmcgYnV0CisJCQkgKiB3aGl0ZXNwYWNlIGFmdGVyIGl0PworCQkJICovCisJCQlmb3IgKDsgY2ggIT0gJ1wwJzsgY2ggPSAqc3JjKyspCisJCQkJaWYgKCFpc3NwYWNlKGNoKSkKKwkJCQkJcmV0dXJuICgtMSk7CisKKwkJCS8qCisJCQkgKiBOb3cgbWFrZSBzdXJlIGZvciBjYXNlcyAyIGFuZCAzIHRoYXQgdGhlICJleHRyYSIKKwkJCSAqIGJpdHMgdGhhdCBzbG9wcGVkIHBhc3QgdGhlIGxhc3QgZnVsbCBieXRlIHdlcmUKKwkJCSAqIHplcm9zLiAgSWYgd2UgZG9uJ3QgY2hlY2sgdGhlbSwgdGhleSBiZWNvbWUgYQorCQkJICogc3VibGltaW5hbCBjaGFubmVsLgorCQkJICovCisJCQlpZiAodGFyZ2V0ICYmIHRhcmdldFt0YXJpbmRleF0gIT0gMCkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIFdlIGVuZGVkIGJ5IHNlZWluZyB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuICBNYWtlIHN1cmUgd2UKKwkJICogaGF2ZSBubyBwYXJ0aWFsIGJ5dGVzIGx5aW5nIGFyb3VuZC4KKwkJICovCisJCWlmIChzdGF0ZSAhPSAwKQorCQkJcmV0dXJuICgtMSk7CisJfQorCisJcmV0dXJuICh0YXJpbmRleCk7Cit9CisKKyNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX0I2NF9QVE9OKSAmJiAhZGVmaW5lZChIQVZFX19fQjY0X1BUT04pICovCisjZW5kaWYgCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2Jhc2U2NC5oIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9iYXNlNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzJjNmIzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9iYXNlNjQuaApAQCAtMCwwICsxLDY1IEBACisvKiAkSWQ6IGJhc2U2NC5oLHYgMS42IDIwMDMvMDgvMjkgMTY6NTk6NTIgbW91cmluZyBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2IGJ5IEludGVybmV0IFNvZnR3YXJlIENvbnNvcnRpdW0uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBJTlRFUk5FVCBTT0ZUV0FSRSBDT05TT1JUSVVNIERJU0NMQUlNUworICogQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBJTlRFUk5FVCBTT0ZUV0FSRQorICogQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTCisgKiBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTUgYnkgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgSW5jLgorICoKKyAqIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMsIEluYy4gKGhlcmVpbmFmdGVyIGNhbGxlZCBJQk0pIGdyYW50cworICogcGVybWlzc2lvbiB1bmRlciBpdHMgY29weXJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogU29mdHdhcmUgd2l0aCBvciB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIGFsbCBwYXJhZ3JhcGhzIG9mIHRoaXMgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBJQk0KKyAqIG5vdCBiZSB1c2VkIGluIGNvbm5lY3Rpb24gd2l0aCB0aGUgbWFya2V0aW5nIG9mIGFueSBwcm9kdWN0IGluY29ycG9yYXRpbmcKKyAqIHRoZSBTb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJlb2YsIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IKKyAqIHBlcm1pc3Npb24uCisgKgorICogVG8gdGhlIGV4dGVudCBpdCBoYXMgYSByaWdodCB0byBkbyBzbywgSUJNIGdyYW50cyBhbiBpbW11bml0eSBmcm9tIHN1aXQKKyAqIHVuZGVyIGl0cyBwYXRlbnRzLCBpZiBhbnksIGZvciB0aGUgdXNlLCBzYWxlIG9yIG1hbnVmYWN0dXJlIG9mIHByb2R1Y3RzIHRvCisgKiB0aGUgZXh0ZW50IHRoYXQgc3VjaCBwcm9kdWN0cyBhcmUgdXNlZCBmb3IgcGVyZm9ybWluZyBEb21haW4gTmFtZSBTeXN0ZW0KKyAqIGR5bmFtaWMgdXBkYXRlcyBpbiBUQ1AvSVAgbmV0d29ya3MgYnkgbWVhbnMgb2YgdGhlIFNvZnR3YXJlLiAgTm8gaW1tdW5pdHkgaXMKKyAqIGdyYW50ZWQgZm9yIGFueSBwcm9kdWN0IHBlciBzZSBvciBmb3IgYW55IG90aGVyIGZ1bmN0aW9uIG9mIGFueSBwcm9kdWN0LgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBBTkQgSUJNIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQQorICogUEFSVElDVUxBUiBQVVJQT1NFLiAgSU4gTk8gRVZFTlQgU0hBTEwgSUJNIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsCisgKiBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgSUJNIElTIEFQUFJJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2lmbmRlZiBfQlNEX0JBU0U2NF9ICisjZGVmaW5lIF9CU0RfQkFTRTY0X0gKKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpZm5kZWYgSEFWRV9fX0I2NF9OVE9QCisjIGlmbmRlZiBIQVZFX0I2NF9OVE9QCitpbnQgYjY0X250b3AodV9jaGFyIGNvbnN0ICpzcmMsIHNpemVfdCBzcmNsZW5ndGgsIGNoYXIgKnRhcmdldCwgCisgICAgc2l6ZV90IHRhcmdzaXplKTsKKyMgZW5kaWYgLyogIUhBVkVfQjY0X05UT1AgKi8KKyMgZGVmaW5lIF9fYjY0X250b3AoYSxiLGMsZCkgYjY0X250b3AoYSxiLGMsZCkKKyNlbmRpZiAvKiBIQVZFX19fQjY0X05UT1AgKi8KKworI2lmbmRlZiBIQVZFX19fQjY0X1BUT04KKyMgaWZuZGVmIEhBVkVfQjY0X1BUT04KK2ludCBiNjRfcHRvbihjaGFyIGNvbnN0ICpzcmMsIHVfY2hhciAqdGFyZ2V0LCBzaXplX3QgdGFyZ3NpemUpOworIyBlbmRpZiAvKiAhSEFWRV9CNjRfUFRPTiAqLworIyBkZWZpbmUgX19iNjRfcHRvbihhLGIsYykgYjY0X3B0b24oYSxiLGMpCisjZW5kaWYgLyogSEFWRV9fX0I2NF9QVE9OICovCisKKyNlbmRpZiAvKiBfQlNEX0JBU0U2NF9IICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2Jhc2VuYW1lLmMgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2Jhc2VuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZhNWM4OQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYmFzZW5hbWUuYwpAQCAtMCwwICsxLDY3IEBACisvKgkkT3BlbkJTRDogYmFzZW5hbWUuYyx2IDEuMTQgMjAwNS8wOC8wOCAwODowNTozMyBlc3BpZSBFeHAgJAkqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDA0IFRvZGQgQy4gTWlsbGVyIDxUb2RkLk1pbGxlckBjb3VydGVzYW4uY29tPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qIE9QRU5CU0QgT1JJR0lOQUw6IGxpYi9saWJjL2dlbi9iYXNlbmFtZS5jICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorI2lmbmRlZiBIQVZFX0JBU0VOQU1FCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworY2hhciAqCitiYXNlbmFtZShjb25zdCBjaGFyICpwYXRoKQoreworCXN0YXRpYyBjaGFyIGJuYW1lW01BWFBBVEhMRU5dOworCXNpemVfdCBsZW47CisJY29uc3QgY2hhciAqZW5kcCwgKnN0YXJ0cDsKKworCS8qIEVtcHR5IG9yIE5VTEwgc3RyaW5nIGdldHMgdHJlYXRlZCBhcyAiLiIgKi8KKwlpZiAocGF0aCA9PSBOVUxMIHx8ICpwYXRoID09ICdcMCcpIHsKKwkJYm5hbWVbMF0gPSAnLic7CisJCWJuYW1lWzFdID0gJ1wwJzsKKwkJcmV0dXJuIChibmFtZSk7CisJfQorCisJLyogU3RyaXAgYW55IHRyYWlsaW5nIHNsYXNoZXMgKi8KKwllbmRwID0gcGF0aCArIHN0cmxlbihwYXRoKSAtIDE7CisJd2hpbGUgKGVuZHAgPiBwYXRoICYmICplbmRwID09ICcvJykKKwkJZW5kcC0tOworCisJLyogQWxsIHNsYXNoZXMgYmVjb21lcyAiLyIgKi8KKwlpZiAoZW5kcCA9PSBwYXRoICYmICplbmRwID09ICcvJykgeworCQlibmFtZVswXSA9ICcvJzsKKwkJYm5hbWVbMV0gPSAnXDAnOworCQlyZXR1cm4gKGJuYW1lKTsKKwl9CisKKwkvKiBGaW5kIHRoZSBzdGFydCBvZiB0aGUgYmFzZSAqLworCXN0YXJ0cCA9IGVuZHA7CisJd2hpbGUgKHN0YXJ0cCA+IHBhdGggJiYgKihzdGFydHAgLSAxKSAhPSAnLycpCisJCXN0YXJ0cC0tOworCisJbGVuID0gZW5kcCAtIHN0YXJ0cCArIDE7CisJaWYgKGxlbiA+PSBzaXplb2YoYm5hbWUpKSB7CisJCWVycm5vID0gRU5BTUVUT09MT05HOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwltZW1jcHkoYm5hbWUsIHN0YXJ0cCwgbGVuKTsKKwlibmFtZVtsZW5dID0gJ1wwJzsKKwlyZXR1cm4gKGJuYW1lKTsKK30KKworI2VuZGlmIC8qICFkZWZpbmVkKEhBVkVfQkFTRU5BTUUpICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2JpbmRyZXN2cG9ydC5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9iaW5kcmVzdnBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODlmMjE0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9iaW5kcmVzdnBvcnQuYwpAQCAtMCwwICsxLDExOCBAQAorLyogVGhpcyBmaWxlIGhhcyBiZSBzdWJzdGFudGlhbGx5IG1vZGlmaWVkIGZyb20gdGhlIG9yaWdpbmFsIE9wZW5CU0Qgc291cmNlICovCisKKy8qCSRPcGVuQlNEOiBiaW5kcmVzdnBvcnQuYyx2IDEuMTcgMjAwNS8xMi8yMSAwMTo0MDoyMiBtaWxsZXJ0IEV4cCAkCSovCisKKy8qCisgKiBDb3B5cmlnaHQgMTk5NiwgSmFzb24gRG93bnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDE5OTgsIFRoZW8gZGUgUmFhZHQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDAsIERhbWllbiBNaWxsZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKiBPUEVOQlNEIE9SSUdJTkFMOiBsaWIvbGliYy9ycGMvYmluZHJlc3Zwb3J0LmMgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpZm5kZWYgSEFWRV9CSU5EUkVTVlBPUlRfU0EKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIFNUQVJUUE9SVCA2MDAKKyNkZWZpbmUgRU5EUE9SVCAoSVBQT1JUX1JFU0VSVkVEIC0gMSkKKyNkZWZpbmUgTlBPUlRTCShFTkRQT1JUIC0gU1RBUlRQT1JUICsgMSkKKworLyoKKyAqIEJpbmQgYSBzb2NrZXQgdG8gYSBwcml2aWxlZ2VkIElQIHBvcnQKKyAqLworaW50CitiaW5kcmVzdnBvcnRfc2EoaW50IHNkLCBzdHJ1Y3Qgc29ja2FkZHIgKnNhKQoreworCWludCBlcnJvciwgYWY7CisJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgbXlhZGRyOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqaW47CisJc3RydWN0IHNvY2thZGRyX2luNiAqaW42OworCXVfaW50MTZfdCAqcG9ydHA7CisJdV9pbnQxNl90IHBvcnQ7CisJc29ja2xlbl90IHNhbGVuOworCWludCBpOworCisJaWYgKHNhID09IE5VTEwpIHsKKwkJbWVtc2V0KCZteWFkZHIsIDAsIHNpemVvZihteWFkZHIpKTsKKwkJc2EgPSAoc3RydWN0IHNvY2thZGRyICopJm15YWRkcjsKKworCQlpZiAoZ2V0c29ja25hbWUoc2QsIHNhLCAmc2FsZW4pID09IC0xKQorCQkJcmV0dXJuIC0xOwkvKiBlcnJubyBpcyBjb3JyZWN0bHkgc2V0ICovCisKKwkJYWYgPSBzYS0+c2FfZmFtaWx5OworCQltZW1zZXQoJm15YWRkciwgMCwgc2FsZW4pOworCX0gZWxzZQorCQlhZiA9IHNhLT5zYV9mYW1pbHk7CisKKwlpZiAoYWYgPT0gQUZfSU5FVCkgeworCQlpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYTsKKwkJc2FsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKwkJcG9ydHAgPSAmaW4tPnNpbl9wb3J0OworCX0gZWxzZSBpZiAoYWYgPT0gQUZfSU5FVDYpIHsKKwkJaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYTsKKwkJc2FsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisJCXBvcnRwID0gJmluNi0+c2luNl9wb3J0OworCX0gZWxzZSB7CisJCWVycm5vID0gRVBGTk9TVVBQT1JUOworCQlyZXR1cm4gKC0xKTsKKwl9CisJc2EtPnNhX2ZhbWlseSA9IGFmOworCisJcG9ydCA9IG50b2hzKCpwb3J0cCk7CisJaWYgKHBvcnQgPT0gMCkKKwkJcG9ydCA9IGFyYzRyYW5kb21fdW5pZm9ybShOUE9SVFMpICsgU1RBUlRQT1JUOworCisJLyogQXZvaWQgd2FybmluZyAqLworCWVycm9yID0gLTE7CisKKwlmb3IoaSA9IDA7IGkgPCBOUE9SVFM7IGkrKykgeworCQkqcG9ydHAgPSBodG9ucyhwb3J0KTsKKwkJCisJCWVycm9yID0gYmluZChzZCwgc2EsIHNhbGVuKTsKKworCQkvKiBUZXJtaW5hdGUgb24gc3VjY2VzcyAqLworCQlpZiAoZXJyb3IgPT0gMCkKKwkJCWJyZWFrOworCQkJCisJCS8qIFRlcm1pbmF0ZSBvbiBlcnJvcnMsIGV4Y2VwdCAiYWRkcmVzcyBhbHJlYWR5IGluIHVzZSIgKi8KKwkJaWYgKChlcnJvciA8IDApICYmICEoKGVycm5vID09IEVBRERSSU5VU0UpIHx8IChlcnJubyA9PSBFSU5WQUwpKSkKKwkJCWJyZWFrOworCQkJCisJCXBvcnQrKzsKKwkJaWYgKHBvcnQgPiBFTkRQT1JUKQorCQkJcG9ydCA9IFNUQVJUUE9SVDsKKwl9CisKKwlyZXR1cm4gKGVycm9yKTsKK30KKworI2VuZGlmIC8qIEhBVkVfQklORFJFU1ZQT1JUX1NBICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2JzZC1hcmM0cmFuZG9tLmMgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2JzZC1hcmM0cmFuZG9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdjNTg2MgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYnNkLWFyYzRyYW5kb20uYwpAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OSwyMDAwLDIwMDQgRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgImxvZy5oIgorCisjaWZuZGVmIEhBVkVfQVJDNFJBTkRPTQorCisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYzQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCisvKiBTaXplIG9mIGtleSB0byB1c2UgKi8KKyNkZWZpbmUgU0VFRF9TSVpFIDIwCisKKy8qIE51bWJlciBvZiBieXRlcyB0byByZXNlZWQgYWZ0ZXIgKi8KKyNkZWZpbmUgUkVLRVlfQllURVMJKDEgPDwgMjQpCisKK3N0YXRpYyBpbnQgcmM0X3JlYWR5ID0gMDsKK3N0YXRpYyBSQzRfS0VZIHJjNDsKKwordW5zaWduZWQgaW50CithcmM0cmFuZG9tKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHIgPSAwOworCXN0YXRpYyBpbnQgZmlyc3RfdGltZSA9IDE7CisKKwlpZiAocmM0X3JlYWR5IDw9IDApIHsKKwkJaWYgKGZpcnN0X3RpbWUpCisJCQlzZWVkX3JuZygpOworCQlmaXJzdF90aW1lID0gMDsKKwkJYXJjNHJhbmRvbV9zdGlyKCk7CisJfQorCisJUkM0KCZyYzQsIHNpemVvZihyKSwgKHVuc2lnbmVkIGNoYXIgKikmciwgKHVuc2lnbmVkIGNoYXIgKikmcik7CisKKwlyYzRfcmVhZHkgLT0gc2l6ZW9mKHIpOworCQorCXJldHVybihyKTsKK30KKwordm9pZAorYXJjNHJhbmRvbV9zdGlyKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciByYW5kX2J1ZltTRUVEX1NJWkVdOworCWludCBpOworCisJbWVtc2V0KCZyYzQsIDAsIHNpemVvZihyYzQpKTsKKwlpZiAoUkFORF9ieXRlcyhyYW5kX2J1Ziwgc2l6ZW9mKHJhbmRfYnVmKSkgPD0gMCkKKwkJZmF0YWwoIkNvdWxkbid0IG9idGFpbiByYW5kb20gYnl0ZXMgKGVycm9yICVsZCkiLAorCQkgICAgRVJSX2dldF9lcnJvcigpKTsKKwlSQzRfc2V0X2tleSgmcmM0LCBzaXplb2YocmFuZF9idWYpLCByYW5kX2J1Zik7CisKKwkvKgorCSAqIERpc2NhcmQgZWFybHkga2V5c3RyZWFtLCBhcyBwZXIgcmVjb21tZW5kYXRpb25zIGluOgorCSAqIGh0dHA6Ly93d3cud2lzZG9tLndlaXptYW5uLmFjLmlsL35pdHNpay9SQzQvUGFwZXJzL1JjNF9rc2EucHMKKwkgKi8KKwlmb3IoaSA9IDA7IGkgPD0gMjU2OyBpICs9IHNpemVvZihyYW5kX2J1ZikpCisJCVJDNCgmcmM0LCBzaXplb2YocmFuZF9idWYpLCByYW5kX2J1ZiwgcmFuZF9idWYpOworCisJbWVtc2V0KHJhbmRfYnVmLCAwLCBzaXplb2YocmFuZF9idWYpKTsKKworCXJjNF9yZWFkeSA9IFJFS0VZX0JZVEVTOworfQorI2VuZGlmIC8qICFIQVZFX0FSQzRSQU5ET00gKi8KKworI2lmbmRlZiBIQVZFX0FSQzRSQU5ET01fQlVGCit2b2lkCithcmM0cmFuZG9tX2J1Zih2b2lkICpfYnVmLCBzaXplX3QgbikKK3sKKwlzaXplX3QgaTsKKwl1X2ludDMyX3QgciA9IDA7CisJY2hhciAqYnVmID0gKGNoYXIgKilfYnVmOworCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQlpZiAoaSAlIDQgPT0gMCkKKwkJCXIgPSBhcmM0cmFuZG9tKCk7CisJCWJ1ZltpXSA9IHIgJiAweGZmOworCQlyID4+PSA4OworCX0KKwlpID0gciA9IDA7Cit9CisjZW5kaWYgLyogIUhBVkVfQVJDNFJBTkRPTV9CVUYgKi8KKworI2lmbmRlZiBIQVZFX0FSQzRSQU5ET01fVU5JRk9STQorLyoKKyAqIENhbGN1bGF0ZSBhIHVuaWZvcm1seSBkaXN0cmlidXRlZCByYW5kb20gbnVtYmVyIGxlc3MgdGhhbiB1cHBlcl9ib3VuZAorICogYXZvaWRpbmcgIm1vZHVsbyBiaWFzIi4KKyAqCisgKiBVbmlmb3JtaXR5IGlzIGFjaGlldmVkIGJ5IGdlbmVyYXRpbmcgbmV3IHJhbmRvbSBudW1iZXJzIHVudGlsIHRoZSBvbmUKKyAqIHJldHVybmVkIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLCAyKiozMiAlIHVwcGVyX2JvdW5kKS4gIFRoaXMKKyAqIGd1YXJhbnRlZXMgdGhlIHNlbGVjdGVkIHJhbmRvbSBudW1iZXIgd2lsbCBiZSBpbnNpZGUKKyAqIFsyKiozMiAlIHVwcGVyX2JvdW5kLCAyKiozMikgd2hpY2ggbWFwcyBiYWNrIHRvIFswLCB1cHBlcl9ib3VuZCkKKyAqIGFmdGVyIHJlZHVjdGlvbiBtb2R1bG8gdXBwZXJfYm91bmQuCisgKi8KK3VfaW50MzJfdAorYXJjNHJhbmRvbV91bmlmb3JtKHVfaW50MzJfdCB1cHBlcl9ib3VuZCkKK3sKKwl1X2ludDMyX3QgciwgbWluOworCisJaWYgKHVwcGVyX2JvdW5kIDwgMikKKwkJcmV0dXJuIDA7CisKKyNpZiAoVUxPTkdfTUFYID4gMHhmZmZmZmZmZlVMKQorCW1pbiA9IDB4MTAwMDAwMDAwVUwgJSB1cHBlcl9ib3VuZDsKKyNlbHNlCisJLyogQ2FsY3VsYXRlICgyKiozMiAlIHVwcGVyX2JvdW5kKSBhdm9pZGluZyA2NC1iaXQgbWF0aCAqLworCWlmICh1cHBlcl9ib3VuZCA+IDB4ODAwMDAwMDApCisJCW1pbiA9IDEgKyB+dXBwZXJfYm91bmQ7CQkvKiAyKiozMiAtIHVwcGVyX2JvdW5kICovCisJZWxzZSB7CisJCS8qICgyKiozMiAtICh4ICogMikpICUgeCA9PSAyKiozMiAlIHggd2hlbiB4IDw9IDIqKjMxICovCisJCW1pbiA9ICgoMHhmZmZmZmZmZiAtICh1cHBlcl9ib3VuZCAqIDIpKSArIDEpICUgdXBwZXJfYm91bmQ7CisJfQorI2VuZGlmCisKKwkvKgorCSAqIFRoaXMgY291bGQgdGhlb3JldGljYWxseSBsb29wIGZvcmV2ZXIgYnV0IGVhY2ggcmV0cnkgaGFzCisJICogcCA+IDAuNSAod29yc3QgY2FzZSwgdXN1YWxseSBmYXIgYmV0dGVyKSBvZiBzZWxlY3RpbmcgYQorCSAqIG51bWJlciBpbnNpZGUgdGhlIHJhbmdlIHdlIG5lZWQsIHNvIGl0IHNob3VsZCByYXJlbHkgbmVlZAorCSAqIHRvIHJlLXJvbGwuCisJICovCisJZm9yICg7OykgeworCQlyID0gYXJjNHJhbmRvbSgpOworCQlpZiAociA+PSBtaW4pCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gciAlIHVwcGVyX2JvdW5kOworfQorI2VuZGlmIC8qICFIQVZFX0FSQzRSQU5ET01fVU5JRk9STSAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2QtYXNwcmludGYuYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYnNkLWFzcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM2ODE5NQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYnNkLWFzcHJpbnRmLmMKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGFycmVuIFR1Y2tlci4KKyAqCisgKiBCYXNlZCBvcmlnaW5hbGx5IG9uIGFzcHJpbnRmLmMgZnJvbSBPcGVuQlNEOgorICogQ29weXJpZ2h0IChjKSAxOTk3IFRvZGQgQy4gTWlsbGVyIDxUb2RkLk1pbGxlckBjb3VydGVzYW4uY29tPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaWZuZGVmIEhBVkVfVkFTUFJJTlRGCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWZuZGVmIFZBX0NPUFkKKyMgaWZkZWYgSEFWRV9WQV9DT1BZCisjICBkZWZpbmUgVkFfQ09QWShkZXN0LCBzcmMpIHZhX2NvcHkoZGVzdCwgc3JjKQorIyBlbHNlCisjICBpZmRlZiBIQVZFX19fVkFfQ09QWQorIyAgIGRlZmluZSBWQV9DT1BZKGRlc3QsIHNyYykgX192YV9jb3B5KGRlc3QsIHNyYykKKyMgIGVsc2UKKyMgICBkZWZpbmUgVkFfQ09QWShkZXN0LCBzcmMpIChkZXN0KSA9IChzcmMpCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgSU5JVF9TWgkxMjgKKworaW50Cit2YXNwcmludGYoY2hhciAqKnN0ciwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworCWludCByZXQgPSAtMTsKKwl2YV9saXN0IGFwMjsKKwljaGFyICpzdHJpbmcsICpuZXdzdHI7CisJc2l6ZV90IGxlbjsKKworCVZBX0NPUFkoYXAyLCBhcCk7CisJaWYgKChzdHJpbmcgPSBtYWxsb2MoSU5JVF9TWikpID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKworCXJldCA9IHZzbnByaW50ZihzdHJpbmcsIElOSVRfU1osIGZtdCwgYXAyKTsKKwlpZiAocmV0ID49IDAgJiYgcmV0IDwgSU5JVF9TWikgeyAvKiBzdWNjZWVkZWQgd2l0aCBpbml0aWFsIGFsbG9jICovCisJCSpzdHIgPSBzdHJpbmc7CisJfSBlbHNlIGlmIChyZXQgPT0gSU5UX01BWCB8fCByZXQgPCAwKSB7IC8qIEJhZCBsZW5ndGggKi8KKwkJZnJlZShzdHJpbmcpOworCQlnb3RvIGZhaWw7CisJfSBlbHNlIHsJLyogYmlnZ2VyIHRoYW4gaW5pdGlhbCwgcmVhbGxvYyBhbGxvd2luZyBmb3IgbnVsICovCisJCWxlbiA9IChzaXplX3QpcmV0ICsgMTsKKwkJaWYgKChuZXdzdHIgPSByZWFsbG9jKHN0cmluZywgbGVuKSkgPT0gTlVMTCkgeworCQkJZnJlZShzdHJpbmcpOworCQkJZ290byBmYWlsOworCQl9IGVsc2UgeworCQkJdmFfZW5kKGFwMik7CisJCQlWQV9DT1BZKGFwMiwgYXApOworCQkJcmV0ID0gdnNucHJpbnRmKG5ld3N0ciwgbGVuLCBmbXQsIGFwMik7CisJCQlpZiAocmV0ID49IDAgJiYgKHNpemVfdClyZXQgPCBsZW4pIHsKKwkJCQkqc3RyID0gbmV3c3RyOworCQkJfSBlbHNlIHsgLyogZmFpbGVkIHdpdGggcmVhbGxvYydlZCBzdHJpbmcsIGdpdmUgdXAgKi8KKwkJCQlmcmVlKG5ld3N0cik7CisJCQkJZ290byBmYWlsOworCQkJfQorCQl9CisJfQorCXZhX2VuZChhcDIpOworCXJldHVybiAocmV0KTsKKworZmFpbDoKKwkqc3RyID0gTlVMTDsKKwllcnJubyA9IEVOT01FTTsKKwl2YV9lbmQoYXAyKTsKKwlyZXR1cm4gKC0xKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfQVNQUklOVEYKK2ludCBhc3ByaW50ZihjaGFyICoqc3RyLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWludCByZXQ7CisJCisJKnN0ciA9IE5VTEw7CisJdmFfc3RhcnQoYXAsIGZtdCk7CisJcmV0ID0gdmFzcHJpbnRmKHN0ciwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYnNkLWNsb3NlZnJvbS5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2QtY2xvc2Vmcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM4MGIzMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYnNkLWNsb3NlZnJvbS5jCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgVG9kZCBDLiBNaWxsZXIgPFRvZGQuTWlsbGVyQGNvdXJ0ZXNhbi5jb20+CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpZm5kZWYgSEFWRV9DTE9TRUZST00KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgSEFWRV9GQ05UTF9ICisjIGluY2x1ZGUgPGZjbnRsLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZmRlZiBIQVZFX0RJUkVOVF9ICisjIGluY2x1ZGUgPGRpcmVudC5oPgorIyBkZWZpbmUgTkFNTEVOKGRpcmVudCkgc3RybGVuKChkaXJlbnQpLT5kX25hbWUpCisjZWxzZQorIyBkZWZpbmUgZGlyZW50IGRpcmVjdAorIyBkZWZpbmUgTkFNTEVOKGRpcmVudCkgKGRpcmVudCktPmRfbmFtbGVuCisjIGlmZGVmIEhBVkVfU1lTX05ESVJfSAorIyAgaW5jbHVkZSA8c3lzL25kaXIuaD4KKyMgZW5kaWYKKyMgaWZkZWYgSEFWRV9TWVNfRElSX0gKKyMgIGluY2x1ZGUgPHN5cy9kaXIuaD4KKyMgZW5kaWYKKyMgaWZkZWYgSEFWRV9ORElSX0gKKyMgIGluY2x1ZGUgPG5kaXIuaD4KKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5fTUFYCisjIGRlZmluZSBPUEVOX01BWAkyNTYKKyNlbmRpZgorCisjaWYgMAorX191bnVzZWQgc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSA9ICIkU3VkbzogY2xvc2Vmcm9tLmMsdiAxLjExIDIwMDYvMDgvMTcgMTU6MjY6NTQgbWlsbGVydCBFeHAgJCI7CisjZW5kaWYgLyogbGludCAqLworCisvKgorICogQ2xvc2UgYWxsIGZpbGUgZGVzY3JpcHRvcnMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGxvd2ZkLgorICovCisjaWZkZWYgSEFWRV9GQ05UTF9DTE9TRU0KK3ZvaWQKK2Nsb3NlZnJvbShpbnQgbG93ZmQpCit7CisgICAgKHZvaWQpIGZjbnRsKGxvd2ZkLCBGX0NMT1NFTSwgMCk7Cit9CisjZWxzZQordm9pZAorY2xvc2Vmcm9tKGludCBsb3dmZCkKK3sKKyAgICBsb25nIGZkLCBtYXhmZDsKKyNpZiBkZWZpbmVkKEhBVkVfRElSRkQpICYmIGRlZmluZWQoSEFWRV9QUk9DX1BJRCkKKyAgICBjaGFyIGZkcGF0aFtQQVRIX01BWF0sICplbmRwOworICAgIHN0cnVjdCBkaXJlbnQgKmRlbnQ7CisgICAgRElSICpkaXJwOworICAgIGludCBsZW47CisKKyAgICAvKiBDaGVjayBmb3IgYSAvcHJvYy8kJC9mZCBkaXJlY3RvcnkuICovCisgICAgbGVuID0gc25wcmludGYoZmRwYXRoLCBzaXplb2YoZmRwYXRoKSwgIi9wcm9jLyVsZC9mZCIsIChsb25nKWdldHBpZCgpKTsKKyAgICBpZiAobGVuID4gMCAmJiAoc2l6ZV90KWxlbiA8PSBzaXplb2YoZmRwYXRoKSAmJiAoZGlycCA9IG9wZW5kaXIoZmRwYXRoKSkpIHsKKwl3aGlsZSAoKGRlbnQgPSByZWFkZGlyKGRpcnApKSAhPSBOVUxMKSB7CisJICAgIGZkID0gc3RydG9sKGRlbnQtPmRfbmFtZSwgJmVuZHAsIDEwKTsKKwkgICAgaWYgKGRlbnQtPmRfbmFtZSAhPSBlbmRwICYmICplbmRwID09ICdcMCcgJiYKKwkJZmQgPj0gMCAmJiBmZCA8IElOVF9NQVggJiYgZmQgPj0gbG93ZmQgJiYgZmQgIT0gZGlyZmQoZGlycCkpCisJCSh2b2lkKSBjbG9zZSgoaW50KSBmZCk7CisJfQorCSh2b2lkKSBjbG9zZWRpcihkaXJwKTsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIHsKKwkvKgorCSAqIEZhbGwgYmFjayBvbiBzeXNjb25mKCkgb3IgZ2V0ZHRhYmxlc2l6ZSgpLiAgV2UgYXZvaWQgY2hlY2tpbmcKKwkgKiByZXNvdXJjZSBsaW1pdHMgc2luY2UgaXQgaXMgcG9zc2libGUgdG8gb3BlbiBhIGZpbGUgZGVzY3JpcHRvcgorCSAqIGFuZCB0aGVuIGRyb3AgdGhlIHJsaW1pdCBzdWNoIHRoYXQgaXQgaXMgYmVsb3cgdGhlIG9wZW4gZmQuCisJICovCisjaWZkZWYgSEFWRV9TWVNDT05GCisJbWF4ZmQgPSBzeXNjb25mKF9TQ19PUEVOX01BWCk7CisjZWxzZQorCW1heGZkID0gZ2V0ZHRhYmxlc2l6ZSgpOworI2VuZGlmIC8qIEhBVkVfU1lTQ09ORiAqLworCWlmIChtYXhmZCA8IDApCisJICAgIG1heGZkID0gT1BFTl9NQVg7CisKKwlmb3IgKGZkID0gbG93ZmQ7IGZkIDwgbWF4ZmQ7IGZkKyspCisJICAgICh2b2lkKSBjbG9zZSgoaW50KSBmZCk7CisgICAgfQorfQorI2VuZGlmIC8qICFIQVZFX0ZDTlRMX0NMT1NFTSAqLworI2VuZGlmIC8qIEhBVkVfQ0xPU0VGUk9NICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2JzZC1jcmF5LmMgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2JzZC1jcmF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFiYmQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYnNkLWNyYXkuYwpAQCAtMCwwICsxLDgxNyBAQAorLyogCisgKiAkSWQ6IGJzZC1jcmF5LmMsdiAxLjE3IDIwMDcvMDgvMTUgMDk6MTc6NDMgZHR1Y2tlciBFeHAgJAorICoKKyAqIGJzZC1jcmF5LmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIENyYXkgSW5jLiAgKFdlbmR5IFBhbG0gPHdlbmR5cEBjcmF5LmNvbT4pCisgKiBTaWduaWZpY2FudCBwb3J0aW9ucyBwcm92aWRlZCBieSAKKyAqICAgICAgICAgIFdheW5lIFNjaHJvZWRlciwgU0RTQyA8c2Nocm9lZGVyQHNkc2MuZWR1PgorICogICAgICAgICAgV2lsbGlhbSBKb25lcywgVVRleGFzIDxqb25lc0B0YWNjLnV0ZXhhcy5lZHU+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIENyZWF0ZWQ6IEFwciAyMiAxNi4zNDowMCAyMDAyIHdwCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyByZXF1aXJlZCBmb3IgcHJvcGVyIGV4ZWN1dGlvbgorICogb24gVU5JQ09TIHN5c3RlbXMuCisgKgorICovCisjaWZkZWYgX1VOSUNPUworCisjaW5jbHVkZSA8dWRiLmg+CisjaW5jbHVkZSA8dG1wZGlyLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL2NhdGVnb3J5Lmg+CisjaW5jbHVkZSA8dXRtcC5oPgorI2luY2x1ZGUgPHN5cy9qdGFiLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3ByaXYuaD4KKyNpbmNsdWRlIDxzeXMvc2VjcGFybS5oPgorI2luY2x1ZGUgPHN5cy90Zm0uaD4KKyNpbmNsdWRlIDxzeXMvdXNydi5oPgorI2luY2x1ZGUgPHN5cy9zeXN2Lmg+CisjaW5jbHVkZSA8c3lzL3NlY3RhYi5oPgorI2luY2x1ZGUgPHN5cy9zZWNzdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc2Vzc2lvbi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxpYS5oPgorI2luY2x1ZGUgPHVybS5oPgorI2luY2x1ZGUgInNzaC5oIgorCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKyNpbmNsdWRlICJzeXMvdHlwZXMuaCIKKworI2lmbmRlZiBIQVZFX1NUUlVDVF9TT0NLQUREUl9TVE9SQUdFCisjIGRlZmluZSAgICAgIF9TU19NQVhTSVpFICAgICAxMjggICAgIC8qIEltcGxlbWVudGF0aW9uIHNwZWNpZmljIG1heCBzaXplICovCisjIGRlZmluZSAgICAgICBfU1NfUEFEU0laRSAgICAgKF9TU19NQVhTSVpFIC0gc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHIpKQorCisjIGRlZmluZSBzc19mYW1pbHkgc3Nfc2Euc2FfZmFtaWx5CisjZW5kaWYgLyogIUhBVkVfU1RSVUNUX1NPQ0tBRERSX1NUT1JBR0UgKi8KKworI2lmbmRlZiBJTjZfSVNfQUREUl9MT09QQkFDSworIyBkZWZpbmUgSU42X0lTX0FERFJfTE9PUEJBQ0soYSkgXAorCSgoKHVfaW50MzJfdCAqKSAoYSkpWzBdID09IDAgJiYgKCh1X2ludDMyX3QgKikgKGEpKVsxXSA9PSAwICYmIFwKKwkgKCh1X2ludDMyX3QgKikgKGEpKVsyXSA9PSAwICYmICgodV9pbnQzMl90ICopIChhKSlbM10gPT0gaHRvbmwgKDEpKQorI2VuZGlmIC8qICFJTjZfSVNfQUREUl9MT09QQkFDSyAqLworCisjaWZuZGVmIEFGX0lORVQ2CisvKiBEZWZpbmUgaXQgdG8gc29tZXRoaW5nIHRoYXQgc2hvdWxkIG5ldmVyIGFwcGVhciAqLworI2RlZmluZSBBRl9JTkVUNiBBRl9NQVgKKyNlbmRpZgorCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAic2VydmNvbmYuaCIKKyNpbmNsdWRlICJic2QtY3JheS5oIgorCisjZGVmaW5lIE1BWEFDSUQgODAKKworZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKKworY2hhciBjcmF5X3RtcGRpcltUUEFUSFNJWiArIDFdOwkJICAgIC8qIGpvYiBUTVBESVIgcGF0aCAqLworCitzdHJ1Y3Qgc3lzdiBzeXN2OwkvKiBzeXN0ZW0gc2VjdXJpdHkgc3RydWN0dXJlICovCitzdHJ1Y3QgdXNydiB1c3J2OwkvKiB1c2VyIHNlY3VyaXR5IHN0cnVjdHVyZSAqLworCisvKgorICogRnVuY3Rpb25zLgorICovCit2b2lkIGNyYXlfcmV0YWluX3V0bXAoc3RydWN0IHV0bXAgKiwgaW50KTsKK3ZvaWQgY3JheV9kZWxldGVfdG1wZGlyKGNoYXIgKiwgaW50LCB1aWRfdCk7Cit2b2lkIGNyYXlfaW5pdF9qb2Ioc3RydWN0IHBhc3N3ZCAqKTsKK3ZvaWQgY3JheV9zZXRfdG1wZGlyKHN0cnVjdCB1dG1wICopOwordm9pZCBjcmF5X2xvZ2luX2ZhaWx1cmUoY2hhciAqLCBpbnQpOworaW50IGNyYXlfc2V0dXAodWlkX3QsIGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2ludCBjcmF5X2FjY2Vzc19kZW5pZWQoY2hhciAqKTsKKwordm9pZAorY3JheV9sb2dpbl9mYWlsdXJlKGNoYXIgKnVzZXJuYW1lLCBpbnQgZXJyY29kZSkKK3sKKwlzdHJ1Y3QgdWRiICp1ZXB0cjsJCS8qIFVEQiBwb2ludGVyIGZvciB1c2VybmFtZSAqLworCWlhX2ZhaWx1cmVfdCBmc2VudDsJCS8qIGlhX2ZhaWx1cmUgc3RydWN0dXJlICovCisJaWFfZmFpbHVyZV9yZXRfdCBmcmV0OwkJLyogaWFfZmFpbHVyZSByZXR1cm4gc3R1ZmYgKi8KKwlzdHJ1Y3QganRhYiBqdGFiOwkJLyogam9iIHRhYmxlIHN0cnVjdHVyZSAqLworCWludCBqaWQgPSAwOwkJCS8qIGpvYiBpZCAqLworCisJaWYgKChqaWQgPSBnZXRqdGFiKCZqdGFiKSkgPCAwKQorCQlkZWJ1ZygiY3JheV9sb2dpbl9mYWlsdXJlKCk6IGdldGp0YWIgZXJyb3IiKTsKKworCWdldHN5c3VkYigpOworCWlmICgodWVwdHIgPSBnZXR1ZGJuYW0odXNlcm5hbWUpKSA9PSBVREJfTlVMTCkKKwkJZGVidWcoImNyYXlfbG9naW5fZmFpbHVyZSgpOiBnZXR1ZGJuYW1lKCkgcmV0dXJuZWQgTlVMTCIpOworCWVuZHVkYigpOworCisJbWVtc2V0KCZmc2VudCwgJ1wwJywgc2l6ZW9mKGZzZW50KSk7CisJZnNlbnQucmV2aXNpb24gPSAwOworCWZzZW50LnVuYW1lID0gdXNlcm5hbWU7CisJZnNlbnQuaG9zdCA9IChjaGFyICopZ2V0X2Nhbm9uaWNhbF9ob3N0bmFtZShvcHRpb25zLnVzZV9kbnMpOworCWZzZW50LnR0eW4gPSAic3NoZCI7CisJZnNlbnQuY2FsbGVyID0gSUFfU1NIRDsKKwlmc2VudC5mbGFncyA9IElBX0lOVEVSQUNUSVZFOworCWZzZW50LnVlcHRyID0gdWVwdHI7CisJZnNlbnQuamlkID0gamlkOworCWZzZW50LmVycmNvZGUgPSBlcnJjb2RlOworCWZzZW50LnB3ZHAgPSBOVUxMOworCWZzZW50LmV4aXRjb2RlID0gMDsJLyogZG9udCBleGl0IGluIGlhX2ZhaWx1cmUoKSAqLworCisJZnJldC5yZXZpc2lvbiA9IDA7CisJZnJldC5ub3JtYWwgPSAwOworCisJLyoKKwkgKiBDYWxsIGlhX2ZhaWx1cmUgYmVjYXVzZSBvZiBhbiBsb2dpbiBmYWlsdXJlLgorCSAqLworCWlhX2ZhaWx1cmUoJmZzZW50LCAmZnJldCk7Cit9CisKKy8qCisgKiAgQ3JheSBhY2Nlc3MgZGVuaWVkCisgKi8KK2ludAorY3JheV9hY2Nlc3NfZGVuaWVkKGNoYXIgKnVzZXJuYW1lKQoreworCXN0cnVjdCB1ZGIgKnVlcHRyOwkJLyogVURCIHBvaW50ZXIgZm9yIHVzZXJuYW1lICovCisJaW50IGVycmNvZGU7CQkJLyogSUEgZXJyb3Jjb2RlICovCisKKwllcnJjb2RlID0gMDsKKwlnZXRzeXN1ZGIoKTsKKwlpZiAoKHVlcHRyID0gZ2V0dWRibmFtKHVzZXJuYW1lKSkgPT0gVURCX05VTEwpCisJCWRlYnVnKCJjcmF5X2xvZ2luX2ZhaWx1cmUoKTogZ2V0dWRibmFtZSgpIHJldHVybmVkIE5VTEwiKTsKKwllbmR1ZGIoKTsKKworCWlmICh1ZXB0ciAhPSBOVUxMICYmIHVlcHRyLT51ZV9kaXNhYmxlZCkKKwkJZXJyY29kZSA9IElBX0RJU0FCTEVEOworCWlmIChlcnJjb2RlKQorCQljcmF5X2xvZ2luX2ZhaWx1cmUodXNlcm5hbWUsIGVycmNvZGUpOworCisJcmV0dXJuIChlcnJjb2RlKTsKK30KKworLyoKKyAqIHJlY29yZF9mYWlsZWRfbG9naW46IGdlbmVyaWMgImxvZ2luIGZhaWxlZCIgaW50ZXJmYWNlIGZ1bmN0aW9uCisgKi8KK3ZvaWQKK3JlY29yZF9mYWlsZWRfbG9naW4oY29uc3QgY2hhciAqdXNlciwgY29uc3QgY2hhciAqaG9zdG5hbWUsIGNvbnN0IGNoYXIgKnR0eW5hbWUpCit7CisJY3JheV9sb2dpbl9mYWlsdXJlKChjaGFyICopdXNlciwgSUFfVURCRVJSKTsKK30KKworaW50CitjcmF5X3NldHVwICh1aWRfdCB1aWQsIGNoYXIgKnVzZXJuYW1lLCBjb25zdCBjaGFyICpjb21tYW5kKQoreworCWV4dGVybiBzdHJ1Y3QgdWRiICpnZXR1ZGIoKTsKKwlleHRlcm4gY2hhciAqc2V0bGltaXRzKCk7CisKKwlpbnQgZXJyOwkJCS8qIGVycm9yIHJldHVybiAqLworCXRpbWVfdCBzeXN0ZW1fdGltZTsJCS8qIGN1cnJlbnQgc3lzdGVtIGNsb2NrICovCisJdGltZV90IGV4cGlyYXRpb25fdGltZTsJCS8qIHBhc3N3b3JkIGV4cGlyYXRpb24gdGltZSAqLworCWludCBtYXhhdHRlbXB0czsJCS8qIG1heGltdW0gbm8uIG9mIGZhaWxlZCBsb2dpbiBhdHRlbXB0cyAqLworCWludCBTZWN1cmVTeXM7CQkJLyogdW5pY29zIHNlY3VyaXR5IGZsYWcgKi8KKwlpbnQgbWluc2xldmVsID0gMDsJCS8qIHN5c3RlbSBtaW5pbXVtIHNlY3VyaXR5IGxldmVsICovCisJaW50IGksIGo7CisJaW50IHZhbGlkX2FjY3QgPSAtMTsJCS8qIGZsYWcgZm9yIHJlYWRpbmcgdmFsaWQgYWNjdCAqLworCWNoYXIgYWNjdF9uYW1lW01BWEFDSURdID0geyAiIiB9OyAvKiB1c2VkIHRvIHJlYWQgYWNjdCBuYW1lICovCisJc3RydWN0IGp0YWIganRhYjsJCS8qIEpvYiB0YWJsZSBzdHJ1Y3QgKi8KKwlzdHJ1Y3QgdWRiIHVlOwkJCS8qIHVkYiBlbnRyeSBmb3IgbG9nZ2luZy1pbiB1c2VyICovCisJc3RydWN0IHVkYiAqdXA7CQkJLyogcG9pbnRlciB0byBVREIgZW50cnkgKi8KKwlzdHJ1Y3Qgc2Vjc3RhdCBzZWNpbmZvOwkJLyogZmlsZSAgc2VjdXJpdHkgYXR0cmlidXRlcyAqLworCXN0cnVjdCBzZXJ2cHJvdiBpbml0X2luZm87CS8qIHVzZWQgZm9yIHNlc3NjbnRsKCkgY2FsbCAqLworCWludCBqaWQ7CQkJLyogam9iIElEICovCisJaW50IHBpZDsJCQkvKiBwcm9jZXNzIElEICovCisJY2hhciAqc3I7CQkJLyogc3RhdHVzIHJldHVybiBmcm9tIHNldGxpbWl0cygpICovCisJY2hhciAqdHR5biA9IE5VTEw7CQkvKiB0dHluYW1lIG9yIGNvbW1hbmQgbmFtZSovCisJY2hhciBob3N0bmFtZVtNQVhIT1NUTkFNRUxFTl07CisJLyogcGFzc3dkIHN0dWZmIGZvciBpYV91c2VyICovCisJcGFzc3dkX3QgcHdkYWNtLCBwd2RkaWFsdXAsIHB3ZHVkYiwgcHdkd2FsLCBwd2RkY2U7CisJaWFfdXNlcl9yZXRfdCB1cmV0OwkJLyogc3R1ZmYgcmV0dXJuZWQgZnJvbSBpYV91c2VyICovCisJaWFfdXNlcl90IHVzZW50OwkJLyogaWFfdXNlciBtYWluIHN0cnVjdHVyZSAqLworCWludCBpYV9yY29kZTsJCQkvKiBpYV91c2VyIHJldHVybiBjb2RlICovCisJaWFfZmFpbHVyZV90IGZzZW50OwkJLyogaWFfZmFpbHVyZSBzdHJ1Y3R1cmUgKi8KKwlpYV9mYWlsdXJlX3JldF90IGZyZXQ7CQkvKiBpYV9mYWlsdXJlIHJldHVybiBzdHVmZiAqLworCWlhX3N1Y2Nlc3NfdCBzc2VudDsJCS8qIGlhX3N1Y2Nlc3Mgc3RydWN0dXJlICovCisJaWFfc3VjY2Vzc19yZXRfdCBzcmV0OwkJLyogaWFfc3VjY2VzcyByZXR1cm4gc3R1ZmYgKi8KKwlpbnQgaWFfbWxzcmNvZGU7CQkvKiBpYV9tbHN1c2VyIHJldHVybiBjb2RlICovCisJaW50IHNlY3N0YXRyYzsJCQkvKiBbZl1zZWNzdGF0IHJldHVybiBjb2RlICovCisKKwlpZiAoU2VjdXJlU3lzID0gKGludClzeXNjb25mKF9TQ19DUkFZX1NFQ1VSRV9TWVMpKSB7CisJCWdldHN5c3YoJnN5c3YsIHNpemVvZihzdHJ1Y3Qgc3lzdikpOworCQltaW5zbGV2ZWwgPSBzeXN2LnN5X21pbmx2bDsKKwkJaWYgKGdldHVzcnYoJnVzcnYpIDwgMCkKKwkJCWZhdGFsKCJnZXR1c3J2KCkgZmFpbGVkLCBlcnJubyA9ICVkIiwgZXJybm8pOworCX0KKwlob3N0bmFtZVswXSA9ICdcMCc7CisJc3RybGNweShob3N0bmFtZSwKKwkgICAoY2hhciAqKWdldF9jYW5vbmljYWxfaG9zdG5hbWUob3B0aW9ucy51c2VfZG5zKSwKKwkgICBNQVhIT1NUTkFNRUxFTik7CisJLyoKKwkgKiAgRmV0Y2ggdXNlcidzIFVEQiBlbnRyeS4KKwkgKi8KKwlnZXRzeXN1ZGIoKTsKKwlpZiAoKHVwID0gZ2V0dWRibmFtKHVzZXJuYW1lKSkgPT0gVURCX05VTEwpCisJCWZhdGFsKCJjYW5ub3QgZmV0Y2ggdXNlcidzIFVEQiBlbnRyeSIpOworCisJLyoKKwkgKiAgUHJldmVudCBhbnkgcG9zc2libGUgZnVkZ2luZyBzbyBwZXJmb3JtIGEgZGF0YQorCSAqICBzYWZldHkgY2hlY2sgYW5kIGNvbXBhcmUgdGhlIHN1cHBsaWVkIHVpZCBhZ2FpbnN0CisJICogIHRoZSB1ZGIncyB1aWQuCisJICovCisJaWYgKHVwLT51ZV91aWQgIT0gdWlkKQorCQlmYXRhbCgiSUEgdWlkIG1pc3NtYXRjaCIpOworCWVuZHVkYigpOworCisJaWYgKChqaWQgPSBnZXRqdGFiKCZqdGFiKSkgPCAwKSB7CisJCWRlYnVnKCJnZXRqdGFiIik7CisJCXJldHVybigtMSk7CisJfQorCXBpZCA9IGdldHBpZCgpOworCXR0eW4gPSB0dHluYW1lKDApOworCWlmIChTZWN1cmVTeXMpIHsKKwkJaWYgKHR0eW4gIT0gTlVMTCkKKwkJCXNlY3N0YXRyYyA9IHNlY3N0YXQodHR5biwgJnNlY2luZm8pOworCQllbHNlCisJCQlzZWNzdGF0cmMgPSBmc2Vjc3RhdCgxLCAmc2VjaW5mbyk7CisKKwkJaWYgKHNlY3N0YXRyYyA9PSAwKQorCQkJZGVidWcoIltmXXNlY3N0YXQoKSBzdWNjZXNzZnVsIik7CisJCWVsc2UKKwkJCWZhdGFsKCJbZl1zZWNzdGF0KCkgZXJyb3IsIHJjID0gJWQiLCBzZWNzdGF0cmMpOworCX0KKwlpZiAoKHR0eW4gPT0gTlVMTCkgJiYgKChjaGFyICopY29tbWFuZCAhPSBOVUxMKSkKKwkJdHR5biA9IChjaGFyICopY29tbWFuZDsKKwkvKgorCSAqICBJbml0aWFsaXplIGFsbCBzdHJ1Y3R1cmVzIHRvIGNhbGwgaWFfdXNlcgorCSAqLworCXVzZW50LnJldmlzaW9uID0gMDsKKwl1c2VudC51bmFtZSA9IHVzZXJuYW1lOworCXVzZW50Lmhvc3QgPSBob3N0bmFtZTsKKwl1c2VudC50dHluID0gdHR5bjsKKwl1c2VudC5jYWxsZXIgPSBJQV9TU0hEOyAKKwl1c2VudC5wc3dkbGlzdCA9ICZwd2RhY207CisJdXNlbnQudWVwdHIgPSAmdWU7CisJdXNlbnQuZmxhZ3MgPSBJQV9JTlRFUkFDVElWRSB8IElBX0ZGTEFHOworCXB3ZGFjbS5hdHlwZSA9IElBX1NFQ1VSSUQ7CisJcHdkYWNtLnB3ZHAgPSBOVUxMOworCXB3ZGFjbS5uZXh0ID0gJnB3ZHVkYjsKKworCXB3ZHVkYi5hdHlwZSA9IElBX1VEQjsKKwlwd2R1ZGIucHdkcCA9IE5VTEw7CisJcHdkdWRiLm5leHQgPSAmcHdkZGNlOworCisJcHdkZGNlLmF0eXBlID0gSUFfRENFOworCXB3ZGRjZS5wd2RwID0gTlVMTDsKKwlwd2RkY2UubmV4dCA9ICZwd2RkaWFsdXA7CisKKwlwd2RkaWFsdXAuYXR5cGUgPSBJQV9ESUFMVVA7CisJcHdkZGlhbHVwLnB3ZHAgPSBOVUxMOworCS8qIHB3ZGRpYWx1cC5uZXh0ID0gJnB3ZHdhbDsgKi8KKwlwd2RkaWFsdXAubmV4dCA9IE5VTEw7CisKKwlwd2R3YWwuYXR5cGUgPSBJQV9XQUw7CisJcHdkd2FsLnB3ZHAgPSBOVUxMOworCXB3ZHdhbC5uZXh0ID0gTlVMTDsKKworCXVyZXQucmV2aXNpb24gPSAwOworCXVyZXQucHN3ZCA9IE5VTEw7CisJdXJldC5ub3JtYWwgPSAwOworCisJaWFfcmNvZGUgPSBpYV91c2VyKCZ1c2VudCwgJnVyZXQpOworCXN3aXRjaCAoaWFfcmNvZGUpIHsKKwkvKgorCSAqICBUaGVzZSBhcmUgYWNjZXB0YWJsZSByZXR1cm4gY29kZXMgZnJvbSBpYV91c2VyKCkKKwkgKi8KKwljYXNlIElBX1VEQldFRUs6ICAgICAgICAvKiBQYXNzd29yZCBFeHBpcmVzIGluIDEgd2VlayAqLworCQlleHBpcmF0aW9uX3RpbWUgPSB1ZS51ZV9wd2FnZS50aW1lICsgdWUudWVfcHdhZ2UubWF4YWdlOworCQlwcmludGYgKCJXQVJOSU5HIC0geW91ciBjdXJyZW50IHBhc3N3b3JkIHdpbGwgZXhwaXJlICVzXG4iLAorCQljdGltZSgoY29uc3QgdGltZV90ICopJmV4cGlyYXRpb25fdGltZSkpOworCQlicmVhazsKKwljYXNlIElBX1VEQkVYUElSRUQ6CisJCWlmICh0dHluYW1lKDApICE9IE5VTEwpIHsKKwkJCS8qIEZvcmNlIGEgcGFzc3dvcmQgY2hhbmdlICovCisJCQlwcmludGYoIllvdXIgcGFzc3dvcmQgaGFzIGV4cGlyZWQ7IENob29zZSBhIG5ldyBvbmUuXG4iKTsKKwkJCWV4ZWNsKCIvYmluL3Bhc3N3ZCIsICJwYXNzd2QiLCB1c2VybmFtZSwgMCk7CisJCQlleGl0KDkpOworCQkJfQorCQlicmVhazsKKwljYXNlIElBX05PUk1BTDogICAgICAgICAvKiBOb3JtYWwgUmV0dXJuIENvZGUgKi8KKwkJYnJlYWs7CisJY2FzZSBJQV9CQUNLRE9PUjoKKwkJLyogWFhYOiBjYW4gd2UgbWVtc2V0IGl0IHRvIHplcm8gaGVyZSBzbyBzYXZlIHNvbWUgb2YgdGhpcyAqLworCQlzdHJsY3B5KHVlLnVlX25hbWUsICJyb290Iiwgc2l6ZW9mKHVlLnVlX25hbWUpKTsKKwkJc3RybGNweSh1ZS51ZV9kaXIsICIvIiwgc2l6ZW9mKHVlLnVlX2RpcikpOworCQlzdHJsY3B5KHVlLnVlX3NoZWxsLCAiL2Jpbi9zaCIsIHNpemVvZih1ZS51ZV9zaGVsbCkpOworCisJCXVlLnVlX3Bhc3N3ZFswXSA9ICdcMCc7CisJCXVlLnVlX2FnZVswXSA9ICdcMCc7CisJCXVlLnVlX2NvbW1lbnRbMF0gPSAnXDAnOworCQl1ZS51ZV9sb2dob3N0WzBdID0gJ1wwJzsKKwkJdWUudWVfbG9nbGluZVswXSA9ICdcMCc7CisKKwkJdWUudWVfdWlkID0gLTE7CisJCXVlLnVlX25pY2VbVURCUkNfSU5URVJdID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgTUFYVklEUzsgaSsrKQorCQkJdWUudWVfZ2lkc1tpXSA9IDA7CisKKwkJdWUudWVfbG9nZmFpbHMgPSAwOworCQl1ZS51ZV9taW5sdmwgPSB1ZS51ZV9tYXhsdmwgPSB1ZS51ZV9kZWZsdmwgPSBtaW5zbGV2ZWw7CisJCXVlLnVlX2RlZmNvbXBzID0gMDsKKwkJdWUudWVfY29tcGFydHMgPSAwOworCQl1ZS51ZV9wZXJtaXRzID0gMDsKKwkJdWUudWVfdHJhcCA9IDA7CisJCXVlLnVlX2Rpc2FibGVkID0gMDsKKwkJdWUudWVfbG9ndGltZSA9IDA7CisJCWJyZWFrOworCWNhc2UgSUFfQ09OU09MRTogICAgICAgIC8qIFN1cGVydXNlciBub3QgZnJvbSBDb25zb2xlICovCisJY2FzZSBJQV9UUlVTVEVEOgkvKiBUcnVzdGVkIHVzZXIgKi8KKwkJaWYgKG9wdGlvbnMucGVybWl0X3Jvb3RfbG9naW4gPiBQRVJNSVRfTk8pCisJCQlicmVhazsJLyogQWNjZXB0IHJvb3QgbG9naW4gKi8KKwlkZWZhdWx0OgorCS8qCisJICogIFRoZXNlIGFyZSBmYWlsZWQgcmV0dXJuIGNvZGVzIGZyb20gaWFfdXNlcigpCisJICovCisJCXN3aXRjaCAoaWFfcmNvZGUpIAorCQl7CisJCWNhc2UgSUFfQkFEQVVUSDoKKwkJCXByaW50ZigiQmFkIGF1dGhvcml6YXRpb24sIGFjY2VzcyBkZW5pZWQuXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElBX0RJU0FCTEVEOgorCQkJcHJpbnRmKCJZb3VyIGxvZ2luIGhhcyBiZWVuIGRpc2FibGVkLiBDb250YWN0IHRoZSBzeXN0ZW0gIik7CisJCQlwcmludGYoImFkbWluaXN0cmF0b3IgZm9yIGFzc2lzdGFuY2UuXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElBX0dFVFNZU1Y6CisJCQlwcmludGYoImdldHN5c3YoKSBmYWlsZWQgLSBlcnJubyA9ICVkXG4iLCBlcnJubyk7CisJCQlicmVhazsKKwkJY2FzZSBJQV9NQVhMT0dTOgorCQkJcHJpbnRmKCJNYXhpbXVtIG51bWJlciBvZiBmYWlsZWQgbG9naW4gYXR0ZW1wdHMgZXhjZWVkZWQuXG4iKTsKKwkJCXByaW50ZigiQWNjZXNzIGRlbmllZC5cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSUFfVURCUFdETlVMTDoKKwkJCWlmIChTZWN1cmVTeXMpCisJCQkJcHJpbnRmKCJOVUxMIFBhc3N3b3JkIG5vdCBhbGxvd2VkIG9uIE1MUyBzeXN0ZW1zLlxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogIEF1dGhlbnRpY2F0aW9uIGZhaWxlZC4KKwkJICovCisJCXByaW50Zigic3NoZDogTG9naW4gaW5jb3JyZWN0LCAoMCVvKVxuIiwKKwkJICAgIGlhX3Jjb2RlLUlBX0VSUk9SQ09ERSk7CisKKwkJLyoKKwkJICogIEluaXRpYWxpemUgc3RydWN0dXJlIGZvciBpYV9mYWlsdXJlCisJCSAqICB3aGljaCB3aWxsIGV4aXQuCisJCSAqLworCQlmc2VudC5yZXZpc2lvbiA9IDA7CisJCWZzZW50LnVuYW1lID0gdXNlcm5hbWU7CisJCWZzZW50Lmhvc3QgPSBob3N0bmFtZTsKKwkJZnNlbnQudHR5biA9IHR0eW47CisJCWZzZW50LmNhbGxlciA9IElBX1NTSEQ7CisJCWZzZW50LmZsYWdzID0gSUFfSU5URVJBQ1RJVkU7CisJCWZzZW50LnVlcHRyID0gJnVlOworCQlmc2VudC5qaWQgPSBqaWQ7CisJCWZzZW50LmVycmNvZGUgPSBpYV9yY29kZTsKKwkJZnNlbnQucHdkcCA9IHVyZXQucHN3ZDsKKwkJZnNlbnQuZXhpdGNvZGUgPSAxOworCisJCWZyZXQucmV2aXNpb24gPSAwOworCQlmcmV0Lm5vcm1hbCA9IDA7CisKKwkJLyoKKwkJKiAgQ2FsbCBpYV9mYWlsdXJlIGJlY2F1c2Ugb2YgYW4gSUEgZmFpbHVyZS4KKwkJKiAgVGhlcmUgaXMgbm8gcmV0dXJuIGJlY2F1c2UgaWFfZmFpbHVyZSBleGl0cy4KKwkJKi8KKwkJaWFfZmFpbHVyZSgmZnNlbnQsICZmcmV0KTsKKworCQlleGl0KDEpOyAKKwl9CisKKwlpYV9tbHNyY29kZSA9IElBX05PUk1BTDsKKwlpZiAoU2VjdXJlU3lzKSB7CisJCWRlYnVnKCJjYWxsaW5nIGlhX21sc3VzZXIoKSIpOworCQlpYV9tbHNyY29kZSA9IGlhX21sc3VzZXIoJnVlLCAmc2VjaW5mbywgJnVzcnYsIE5VTEwsIDApOworCX0KKwlpZiAoaWFfbWxzcmNvZGUgIT0gSUFfTk9STUFMKSB7CisJCXByaW50Zigic3NoZDogTG9naW4gaW5jb3JyZWN0LCAoMCVvKVxuIiwKKwkJICAgIGlhX21sc3Jjb2RlLUlBX0VSUk9SQ09ERSk7CisJCS8qCisJCSAqICBJbml0aWFsaXplIHN0cnVjdHVyZSBmb3IgaWFfZmFpbHVyZQorCQkgKiAgd2hpY2ggd2lsbCBleGl0LgorCQkgKi8KKwkJZnNlbnQucmV2aXNpb24gPSAwOworCQlmc2VudC51bmFtZSA9IHVzZXJuYW1lOworCQlmc2VudC5ob3N0ID0gaG9zdG5hbWU7CisJCWZzZW50LnR0eW4gPSB0dHluOworCQlmc2VudC5jYWxsZXIgPSBJQV9TU0hEOworCQlmc2VudC5mbGFncyA9IElBX0lOVEVSQUNUSVZFOworCQlmc2VudC51ZXB0ciA9ICZ1ZTsKKwkJZnNlbnQuamlkICA9IGppZDsKKwkJZnNlbnQuZXJyY29kZSA9IGlhX21sc3Jjb2RlOworCQlmc2VudC5wd2RwID0gdXJldC5wc3dkOworCQlmc2VudC5leGl0Y29kZSA9IDE7CisJCWZyZXQucmV2aXNpb24gPSAwOworCQlmcmV0Lm5vcm1hbCA9IDA7CisKKwkJLyoKKwkJICogIENhbGwgaWFfZmFpbHVyZSBiZWNhdXNlIG9mIGFuIElBIGZhaWx1cmUuCisJCSAqICBUaGVyZSBpcyBubyByZXR1cm4gYmVjYXVzZSBpYV9mYWlsdXJlIGV4aXRzLgorCQkgKi8KKwkJaWFfZmFpbHVyZSgmZnNlbnQsJmZyZXQpOworCQlleGl0KDEpOyAKKwl9CisKKwkvKiBQcm92aWRlIGxvZ2luIHN0YXR1cyBpbmZvcm1hdGlvbiAqLworCWlmIChvcHRpb25zLnByaW50X2xhc3Rsb2cgJiYgdWUudWVfbG9ndGltZSAhPSAwKSB7CisJCXByaW50ZigiTGFzdCBzdWNjZXNzZnVsIGxvZ2luIHdhcyA6ICUuKnMgIiwgMTksCisJCSAgICAoY2hhciAqKWN0aW1lKCZ1ZS51ZV9sb2d0aW1lKSk7CisKKwkJaWYgKCp1ZS51ZV9sb2dob3N0ICE9ICdcMCcpIHsKKwkJCXByaW50ZigiZnJvbSAlLipzXG4iLCBzaXplb2YodWUudWVfbG9naG9zdCksCisJCQkgICAgdWUudWVfbG9naG9zdCk7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIm9uICUuKnNcbiIsIHNpemVvZih1ZS51ZV9sb2dsaW5lKSwKKwkJCSAgICB1ZS51ZV9sb2dsaW5lKTsKKwkJfQorCisJCWlmIChTZWN1cmVTeXMgJiYgKHVlLnVlX2xvZ2ZhaWxzICE9IDApKSB7CisJCQlwcmludGYoIiAgZm9sbG93ZWQgYnkgJWQgZmFpbGVkIGF0dGVtcHRzXG4iLAorCQkJICAgIHVlLnVlX2xvZ2ZhaWxzKTsKKwkJfQorCX0KKworCS8qCisJICogQ2FsbCBpYV9zdWNjZXNzIHRvIHByb2Nlc3Mgc3VjY2Vzc2Z1bCBJL0EuCisJICovCisJc3NlbnQucmV2aXNpb24gPSAwOworCXNzZW50LnVuYW1lID0gdXNlcm5hbWU7CisJc3NlbnQuaG9zdCA9IGhvc3RuYW1lOworCXNzZW50LnR0eW4gPSB0dHluOworCXNzZW50LmNhbGxlciA9IElBX1NTSEQ7CisJc3NlbnQuZmxhZ3MgPSBJQV9JTlRFUkFDVElWRTsKKwlzc2VudC51ZXB0ciA9ICZ1ZTsKKwlzc2VudC5qaWQgPSBqaWQ7CisJc3NlbnQuZXJyY29kZSA9IGlhX3Jjb2RlOworCXNzZW50LnVzID0gTlVMTDsKKwlzc2VudC50aW1lID0gMTsJLyogU2V0IHVlX2xvZ3RpbWUgKi8KKworCXNyZXQucmV2aXNpb24gPSAwOworCXNyZXQubm9ybWFsID0gMDsKKworCWlhX3N1Y2Nlc3MoJnNzZW50LCAmc3JldCk7CisKKwkvKgorCSAqIFF1ZXJ5IGZvciBhY2NvdW50LCBpZmYgPiAxIHZhbGlkIGFjaWQgJiBhc2thY2lkIHBlcm1iaXQKKwkgKi8KKwlpZiAoKCh1ZS51ZV9wZXJtYml0cyAmIFBFUk1CSVRTX0FDQ1RJRCkgfHwKKwkgICAgKHVlLnVlX2FjaWRzWzBdID49IDApICYmICh1ZS51ZV9hY2lkc1sxXSA+PSAwKSkgJiYKKwkgICAgdWUudWVfcGVybWJpdHMgJiBQRVJNQklUU19BU0tBQ0lEKSB7CisJCWlmICh0dHluYW1lKDApICE9IE5VTEwpIHsKKwkJCWRlYnVnKCJjcmF5X3NldHVwOiB0dHluYW1lIHRydWUgY2FzZSwgJS4xMDBzIiwgdHR5bmFtZSk7CisJCQl3aGlsZSAodmFsaWRfYWNjdCA9PSAtMSkgeworCQkJCXByaW50ZigiQWNjb3VudCAoPyBmb3IgYXZhaWxhYmxlIGFjY291bnRzKSIKKwkJCQkgICAgIiBbJXNdOiAiLCBhY2lkMm5hbSh1ZS51ZV9hY2lkc1swXSkpOworCQkJCWZnZXRzKGFjY3RfbmFtZSwgTUFYQUNJRCwgc3RkaW4pOworCQkJCXN3aXRjaCAoYWNjdF9uYW1lWzBdKSB7CisJCQkJY2FzZSBFT0Y6CisJCQkJCWV4aXQoMCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1wwJzoKKwkJCQkJdmFsaWRfYWNjdCA9IHVlLnVlX2FjaWRzWzBdOworCQkJCQlzdHJsY3B5KGFjY3RfbmFtZSwgYWNpZDJuYW0odmFsaWRfYWNjdCksIE1BWEFDSUQpOworCQkJCQlicmVhazsKKwkJCQljYXNlICc/JzoKKwkJCQkJLyogUHJpbnQgdGhlIGxpc3QgMyB3aWRlICovCisJCQkJCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgTUFYVklEUzsgaSsrKSB7CisJCQkJCQlpZiAodWUudWVfYWNpZHNbaV0gPT0gLTEpIHsKKwkJCQkJCQlwcmludGYoIlxuIik7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlpZiAoKytqID09IDQpIHsKKwkJCQkJCQlqID0gMTsKKwkJCQkJCQlwcmludGYoIlxuIik7CisJCQkJCQl9CisJCQkJCQlwcmludGYoIiAlcyIsCisJCQkJCQkgICAgYWNpZDJuYW0odWUudWVfYWNpZHNbaV0pKTsKKwkJCQkJfQorCQkJCQlpZiAodWUudWVfcGVybWJpdHMgJiBQRVJNQklUU19BQ0NUSUQpIHsKKwkJCQkJCXByaW50ZigiXCJhY2N0aWRcIiBwZXJtYml0IGFsc28gYWxsb3dzIgorCQkJCQkJICAgICIgeW91IHRvIHNlbGVjdCBhbnkgdmFsaWQgIgorCQkJCQkJICAgICJhY2NvdW50IG5hbWUuXG4iKTsKKwkJCQkJfQorCQkJCQlwcmludGYoIlxuIik7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXZhbGlkX2FjY3QgPSBuYW0yYWNpZChhY2N0X25hbWUpOworCQkJCQlpZiAodmFsaWRfYWNjdCA9PSAtMSkgCisJCQkJCQlwcmludGYoCisJCQkJCQkgICAgIkFjY291bnQgaWQgbm90IGZvdW5kIGZvciIKKwkJCQkJCSAgICAiIGFjY291bnQgbmFtZSBcIiVzXCJcblxuIiwKKwkJCQkJCSAgICBhY2N0X25hbWUpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBJZiBhbiBhY2NvdW50IHdhcyBnaXZlbiwgc2VhcmNoIHRoZSB1c2VyJ3MKKwkJCQkgKiBhY2lkcyBhcnJheSB0byB2ZXJpZnkgdGhleSBjYW4gdXNlIHRoaXMgYWNjb3VudC4KKwkJCQkgKi8KKwkJCQlpZiAoKHZhbGlkX2FjY3QgIT0gLTEpICYmCisJCQkJICAgICEodWUudWVfcGVybWJpdHMgJiBQRVJNQklUU19BQ0NUSUQpKSB7CisJCQkJCWZvciAoaSA9IDA7IGkgPCBNQVhWSURTOyBpKyspIHsKKwkJCQkJCWlmICh1ZS51ZV9hY2lkc1tpXSA9PSAtMSkKKwkJCQkJCQlicmVhazsKKwkJCQkJCWlmICh2YWxpZF9hY2N0ID09IHVlLnVlX2FjaWRzW2ldKQorCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmIChpID09IE1BWFZJRFMgfHwKKwkJCQkJICAgIHVlLnVlX2FjaWRzW2ldID09IC0xKSB7CisJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBzZXQiCisJCQkJCQkgICAgIiBhY2NvdW50IG5hbWUgdG8gIgorCQkJCQkJICAgICJcIiVzXCIsIHBlcm1pc3Npb24gIgorCQkJCQkJICAgICJkZW5pZWRcblxuIiwgYWNjdF9uYW1lKTsKKwkJCQkJCXZhbGlkX2FjY3QgPSAtMTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBUaGUgY2xpZW50IGlzbid0IGNvbm5lY3RlZCB0byBhIHRlcm1pbmFsIGFuZCBjYW4ndAorCQkJICogcmVzcG9uZCB0byBhbiBhY2lkIHByb21wdC4gIFVzZSBkZWZhdWx0IGFjaWQuCisJCQkgKi8KKwkJCWRlYnVnKCJjcmF5X3NldHVwOiB0dHluYW1lIGZhbHNlIGNhc2UsICUuMTAwcyIsCisJCQkgICAgdHR5bmFtZSk7CisJCQl2YWxpZF9hY2N0ID0gdWUudWVfYWNpZHNbMF07CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGUgdXNlciBkb2Vzbid0IGhhdmUgdGhlIGFza2FjaWQgcGVybWJpdCBzZXQgb3IKKwkJICogb25seSBoYXMgb25lIHZhbGlkIGFjY291bnQgdG8gdXNlLgorCQkgKi8KKwkJdmFsaWRfYWNjdCA9IHVlLnVlX2FjaWRzWzBdOworCX0KKwlpZiAoYWNjdGlkKDAsIHZhbGlkX2FjY3QpIDwgMCkgeworCQlwcmludGYgKCJCYWQgYWNjb3VudCBpZDogJWRcbiIsIHZhbGlkX2FjY3QpOworCQlleGl0KDEpOworCX0KKworCS8qIAorCSAqIE5vdyBzZXQgc2hhcmVzLCBxdW90YXMsIGxpbWl0cywgaW5jbHVkaW5nIENQVSB0aW1lIGZvciB0aGUgCisJICogKGludGVyYWN0aXZlKSBqb2IgYW5kIHByb2Nlc3MsIGFuZCBzZXQgdXAgcGVybWlzc2lvbnMgCisJICogKGZvciBjaG93biBldGMpLCBldGMuCisJICovCisJaWYgKHNldHNoYXJlcyh1ZS51ZV91aWQsIHZhbGlkX2FjY3QsIHByaW50ZiwgMCwgMCkpIHsKKwkJcHJpbnRmKCJVbmFibGUgdG8gZ2l2ZSAlZCBzaGFyZXMgdG8gPCVzPiglZC8lZClcbiIsCisJCSAgICB1ZS51ZV9zaGFyZXMsIHVlLnVlX25hbWUsIHVlLnVlX3VpZCwgdmFsaWRfYWNjdCk7CisJCWV4aXQoMSk7CisJfQorCisJc3IgPSBzZXRsaW1pdHModXNlcm5hbWUsIENfUFJPQywgcGlkLCBVREJSQ19JTlRFUik7CisJaWYgKHNyICE9IE5VTEwpIHsKKwkJZGVidWcoIiUuMjAwcyIsIHNyKTsKKwkJZXhpdCgxKTsKKwl9CisJc3IgPSBzZXRsaW1pdHModXNlcm5hbWUsIENfSk9CLCBqaWQsIFVEQlJDX0lOVEVSKTsKKwlpZiAoc3IgIT0gTlVMTCkgeworCQlkZWJ1ZygiJS4yMDBzIiwgc3IpOworCQlleGl0KDEpOworCX0KKwkvKgorCSAqIFBsYWNlIHRoZSBzZXJ2aWNlIHByb3ZpZGVyIGluZm9ybWF0aW9uIGludG8KKwkgKiB0aGUgc2Vzc2lvbiB0YWJsZSAoVW5pY29zKSBvciBqb2IgdGFibGUgKFVuaWNvcy9taykuCisJICogVGhlcmUgZXhpc3QgZG91YmxlIGRlZmluZXMgZm9yIHRoZSBqb2Ivc2Vzc2lvbiB0YWJsZSBpbgorCSAqIHVuaWNvcy9tayAoanRhYi5oKSBzbyBubyBuZWVkIGZvciBhIGNvbXBpbGUgdGltZSBzd2l0Y2guCisJICovCisJbWVtc2V0KCZpbml0X2luZm8sICdcMCcsIHNpemVvZihpbml0X2luZm8pKTsKKwlpbml0X2luZm8uc19zZXNzaW5pdC5zaV9pZCA9IFVSTV9TUFRfTE9HSU47CisJaW5pdF9pbmZvLnNfc2Vzc2luaXQuc2lfcGlkID0gZ2V0cGlkKCk7CisJaW5pdF9pbmZvLnNfc2Vzc2luaXQuc2lfc2lkID0gamlkOworCXNlc3NjbnRsKDAsIFNfU0VUU0VSVlBPLCAoaW50KSZpbml0X2luZm8pOworCisJLyoKKwkgKiBTZXQgdXNlciBhbmQgY29udHJvbGxpbmcgdHR5IHNlY3VyaXR5IGF0dHJpYnV0ZXMuCisJICovCisJaWYgKFNlY3VyZVN5cykgeworCQlpZiAoc2V0dXNydigmdXNydikgPT0gLTEpIHsKKwkJCWRlYnVnKCJzZXR1c3J2KCkgZmFpbGVkLCBlcnJubyA9ICVkIixlcnJubyk7CisJCQlleGl0KDEpOworCQl9CisJfQorCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFRoZSByYy4qIGFuZCAvZXRjL3NkYWVtb24gbWV0aG9kcyBvZiBzdGFydGluZyBhIHByb2dyYW0gb24gdW5pY29zL3VuaWNvc21rCisgKiBjYW4gaGF2ZSBwYWwgcHJpdmlsZWdlcyB0aGF0IHNzaGQgY2FuIGluaGVyaXQgd2hpY2gKKyAqIGNvdWxkIGFsbG93IGEgdXNlciB0byBzdSB0byByb290IHdpdGggb3V0IGEgcGFzc3dvcmQuCisgKiBUaGlzIHN1YnJvdXRpbmUgY2xlYXJzIGFsbCBwcml2aWxlZ2VzLgorICovCit2b2lkCitkcm9wX2NyYXlfcHJpdnMoKQoreworI2lmIGRlZmluZWQoX1NDX0NSQVlfUFJJVl9TVSkKKwlwcml2X3Byb2NfdCAqcHJpdnN0YXRlOworCWludCByZXN1bHQ7CisJZXh0ZXJuIGludCBwcml2X3NldF9wcm9jKCk7CisJZXh0ZXJuIHByaXZfcHJvY190ICpwcml2X2luaXRfcHJvYygpOworCisJLyoKKwkgKiBJZiBldGhlciBvZiB0aGVzZXMgdHdvIGZsYWdzIGFyZSBub3Qgc2V0CisJICogdGhlbiBkb24ndCBhbGxvdyB0aGlzIHZlcnNpb24gb2Ygc3NoIHRvIHJ1bi4KKwkgKi8KKwlpZiAoIXN5c2NvbmYoX1NDX0NSQVlfUFJJVl9TVSkpCisJCWZhdGFsKCJOb3QgUFJJVl9TVSBzeXN0ZW0uIik7CisJaWYgKCFzeXNjb25mKF9TQ19DUkFZX1BPU0lYX1BSSVYpKQorCQlmYXRhbCgiTm90IFBPU0lYX1BSSVYuIik7CisKKwlkZWJ1ZygiU2V0dGluZyBNTFMgbGFiZWxzLiIpOzsKKworCWlmIChzeXNjb25mKF9TQ19DUkFZX1NFQ1VSRV9NQUMpKSB7CisJCXVzcnYuc3ZfbWlubHZsID0gU1lTTE9XOworCQl1c3J2LnN2X2FjdGx2bCA9IFNZU0hJR0g7CisJCXVzcnYuc3ZfbWF4bHZsID0gU1lTSElHSDsKKwl9IGVsc2UgeworCQl1c3J2LnN2X21pbmx2bCA9IHN5c3Yuc3lfbWlubHZsOworCQl1c3J2LnN2X2FjdGx2bCA9IHN5c3Yuc3lfbWlubHZsOworCQl1c3J2LnN2X21heGx2bCA9IHN5c3Yuc3lfbWF4bHZsOworCX0gICAgICAgCisJdXNydi5zdl9hY3RjbXAgPSAwOworCXVzcnYuc3ZfdmFsY21wID0gc3lzdi5zeV92YWxjbXA7CisKKwl1c3J2LnN2X2ludGNhdCA9IFRGTV9TWVNURU07CisJdXNydi5zdl92YWxjYXQgfD0gKFRGTV9TWVNURU0gfCBURk1fU1lTRklMRSk7CisKKwlpZiAoc2V0dXNydigmdXNydikgPCAwKSB7CisJCWZhdGFsKCIlcyglZCk6IHNldHVzcnYoKTogJXMiLCBfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgICBzdHJlcnJvcihlcnJubykpOworCX0KKworCWlmICgocHJpdnN0YXRlID0gcHJpdl9pbml0X3Byb2MoKSkgIT0gTlVMTCkgeworCQlyZXN1bHQgPSBwcml2X3NldF9wcm9jKHByaXZzdGF0ZSk7CisJCWlmIChyZXN1bHQgIT0gMCApIHsKKwkJCWZhdGFsKCIlcyglZCk6IHByaXZfc2V0X3Byb2MoKTogJXMiLAorCQkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCQlwcml2X2ZyZWVfcHJvYyhwcml2c3RhdGUpOworCX0KKwlkZWJ1ZyAoIlByaXZpbGVnZXMgc2hvdWxkIGJlIGNsZWFyZWQuLi4iKTsKKyNlbHNlCisJLyogWFhYOiBkbyB0aGlzIGRpZmZlcmVudGx5ICovCisjCWVycm9yIENyYXkgc3lzdGVtcyBtdXN0IGJlIHJ1biB3aXRoIF9TQ19DUkFZX1BSSVZfU1Ugb24hCisjZW5kaWYKK30KKworCisvKgorICogIFJldGFpbiB1dG1wL3d0bXAgaW5mb3JtYXRpb24gLSB1c2VkIGJ5IGNyYXkgYWNjb3VudGluZy4KKyAqLwordm9pZAorY3JheV9yZXRhaW5fdXRtcChzdHJ1Y3QgdXRtcCAqdXQsIGludCBwaWQpCit7CisJaW50IGZkOworCXN0cnVjdCB1dG1wIHV0bXA7CisKKwlpZiAoKGZkID0gb3BlbihVVE1QX0ZJTEUsIE9fUkRPTkxZKSkgIT0gLTEpIHsKKwkJLyogWFhYIHVzZSBhdG9taWNpbyAqLworCQl3aGlsZSAocmVhZChmZCwgKGNoYXIgKikmdXRtcCwgc2l6ZW9mKHV0bXApKSA9PSBzaXplb2YodXRtcCkpIHsKKwkJCWlmIChwaWQgPT0gdXRtcC51dF9waWQpIHsKKwkJCQl1dC0+dXRfamlkID0gdXRtcC51dF9qaWQ7CisJCQkJc3RybmNweSh1dC0+dXRfdHBhdGgsIHV0bXAudXRfdHBhdGgsIHNpemVvZih1dG1wLnV0X3RwYXRoKSk7CisJCQkJc3RybmNweSh1dC0+dXRfaG9zdCwgdXRtcC51dF9ob3N0LCBzaXplb2YodXRtcC51dF9ob3N0KSk7CisJCQkJc3RybmNweSh1dC0+dXRfbmFtZSwgdXRtcC51dF9uYW1lLCBzaXplb2YodXRtcC51dF9uYW1lKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJY2xvc2UoZmQpOworCX0gZWxzZQorCQlmYXRhbCgiVW5hYmxlIHRvIG9wZW4gdXRtcCBmaWxlIik7Cit9CisKKy8qCisgKiB0bXBkaXIgc3VwcG9ydC4KKyAqLworCisvKgorICogZmluZCBhbmQgZGVsZXRlIGpvYnMgdG1wZGlyLgorICovCit2b2lkCitjcmF5X2RlbGV0ZV90bXBkaXIoY2hhciAqbG9naW4sIGludCBqaWQsIHVpZF90IHVpZCkKK3sKKwlzdGF0aWMgY2hhciBqdG1wW1RQQVRIU0laXTsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCWludCBjaGlsZCwgYywgd3N0YXQ7CisKKwlmb3IgKGMgPSAnYSc7IGMgPD0gJ3onOyBjKyspIHsKKwkJc25wcmludGYoanRtcCwgVFBBVEhTSVosICIlcy9qdG1wLiUwNmQlYyIsIEpUTVBESVIsIGppZCwgYyk7CisJCWlmIChzdGF0KGp0bXAsICZzdGF0YnVmKSA9PSAwICYmIHN0YXRidWYuc3RfdWlkID09IHVpZCkKKwkJCWJyZWFrOworCX0KKworCWlmIChjID4gJ3onKQorCQlyZXR1cm47CisKKwlpZiAoKGNoaWxkID0gZm9yaygpKSA9PSAwKSB7CisJCWV4ZWNsKENMRUFOVE1QQ01ELCBDTEVBTlRNUENNRCwgbG9naW4sIGp0bXAsIChjaGFyICopTlVMTCk7CisJCWZhdGFsKCJjcmF5X2RlbGV0ZV90bXBkaXI6IGV4ZWNsIG9mIENMRUFOVE1QQ01EIGZhaWxlZCIpOworCX0KKworCXdoaWxlICh3YWl0cGlkKGNoaWxkLCAmd3N0YXQsIDApID09IC0xICYmIGVycm5vID09IEVJTlRSKQorCQk7Cit9CisKKy8qCisgKiBSZW1vdmUgdG1wZGlyIG9uIGpvYiB0ZXJtaW5hdGlvbi4KKyAqLwordm9pZAorY3JheV9qb2JfdGVybWluYXRpb25faGFuZGxlcihpbnQgc2lnKQoreworCWludCBqaWQ7CisJY2hhciAqbG9naW4gPSBOVUxMOworCXN0cnVjdCBqdGFiIGp0YWI7CisKKwlpZiAoKGppZCA9IHdhaXRqb2IoJmp0YWIpKSA9PSAtMSB8fAorCSAgICAobG9naW4gPSB1aWQybmFtKGp0YWIual91aWQpKSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwljcmF5X2RlbGV0ZV90bXBkaXIobG9naW4sIGppZCwganRhYi5qX3VpZCk7Cit9CisKKy8qCisgKiBTZXQgam9iIGlkIGFuZCBjcmVhdGUgdG1wZGlyIGRpcmVjdG9yeS4KKyAqLwordm9pZAorY3JheV9pbml0X2pvYihzdHJ1Y3QgcGFzc3dkICpwdykKK3sKKwlpbnQgamlkOworCWludCBjOworCisJamlkID0gc2V0am9iKHB3LT5wd191aWQsIFdKU0lHTkFMKTsKKwlpZiAoamlkIDwgMCkKKwkJZmF0YWwoIlN5c3RlbSBjYWxsIHNldGpvYiBmYWlsdXJlIik7CisKKwlmb3IgKGMgPSAnYSc7IGMgPD0gJ3onOyBjKyspIHsKKwkJc25wcmludGYoY3JheV90bXBkaXIsIFRQQVRIU0laLCAiJXMvanRtcC4lMDZkJWMiLCBKVE1QRElSLCBqaWQsIGMpOworCQlpZiAobWtkaXIoY3JheV90bXBkaXIsIEpUTVBNT0RFKSAhPSAwKQorCQkJY29udGludWU7CisJCWlmIChjaG93bihjcmF5X3RtcGRpciwJcHctPnB3X3VpZCwgcHctPnB3X2dpZCkgIT0gMCkgeworCQkJcm1kaXIoY3JheV90bXBkaXIpOworCQkJY29udGludWU7CisJCX0KKwkJYnJlYWs7CisJfQorCisJaWYgKGMgPiAneicpCisJCWNyYXlfdG1wZGlyWzBdID0gJ1wwJzsKK30KKwordm9pZAorY3JheV9zZXRfdG1wZGlyKHN0cnVjdCB1dG1wICp1dCkKK3sKKwlpbnQgamlkOworCXN0cnVjdCBqdGFiIGpidWY7CisKKwlpZiAoKGppZCA9IGdldGp0YWIoJmpidWYpKSA8IDApCisJCXJldHVybjsKKworCS8qCisJICogU2V0IGppZCBhbmQgdG1wZGlyIGluIHV0bXAgcmVjb3JkLgorCSAqLworCXV0LT51dF9qaWQgPSBqaWQ7CisJc3RybmNweSh1dC0+dXRfdHBhdGgsIGNyYXlfdG1wZGlyLCBUUEFUSFNJWik7Cit9CisjZW5kaWYgLyogVU5JQ09TICovCisKKyNpZmRlZiBfVU5JQ09TTVAKKyNpbmNsdWRlIDxwd2QuaD4KKy8qCisgKiBTZXQgam9iIGlkIGFuZCBjcmVhdGUgdG1wZGlyIGRpcmVjdG9yeS4KKyAqLwordm9pZAorY3JheV9pbml0X2pvYihzdHJ1Y3QgcGFzc3dkICpwdykKK3sKKwlpbml0cm1fc2lsZW50KHB3LT5wd191aWQpOworCXJldHVybjsKK30KKyNlbmRpZiAvKiBfVU5JQ09TTVAgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYnNkLWNyYXkuaCBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYnNkLWNyYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzRlY2ViCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2QtY3JheS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qICRJZDogYnNkLWNyYXkuaCx2IDEuMTIgMjAwNS8wMi8wMiAwNjoxMDoxMSBkdHVja2VyIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIENyYXkgSW5jLiAgKFdlbmR5IFBhbG0gPHdlbmR5cEBjcmF5LmNvbT4pCisgKiBTaWduaWZpY2FudCBwb3J0aW9ucyBwcm92aWRlZCBieSAKKyAqICAgICAgICAgIFdheW5lIFNjaHJvZWRlciwgU0RTQyA8c2Nocm9lZGVyQHNkc2MuZWR1PgorICogICAgICAgICAgV2lsbGlhbSBKb25lcywgVVRleGFzIDxqb25lc0B0YWNjLnV0ZXhhcy5lZHU+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIENyZWF0ZWQ6IEFwciAyMiAxNi4zNDowMCAyMDAyIHdwCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyByZXF1aXJlZCBmb3IgcHJvcGVyIGV4ZWN1dGlvbgorICogb24gVU5JQ09TIHN5c3RlbXMuCisgKgorICovCisKKyNpZm5kZWYgX0JTRF9DUkFZX0gKKyNkZWZpbmUgX0JTRF9DUkFZX0gKKworI2lmZGVmIF9VTklDT1MKKwordm9pZCBjcmF5X2luaXRfam9iKHN0cnVjdCBwYXNzd2QgKik7Cit2b2lkIGNyYXlfam9iX3Rlcm1pbmF0aW9uX2hhbmRsZXIoaW50KTsKK3ZvaWQgY3JheV9sb2dpbl9mYWlsdXJlKGNoYXIgKiwgaW50ICk7CitpbnQgY3JheV9hY2Nlc3NfZGVuaWVkKGNoYXIgKik7CitleHRlcm4gY2hhciBjcmF5X3RtcGRpcltdOworCisjZGVmaW5lIENVU1RPTV9GQUlMRURfTE9HSU4gMQorCisjaWZuZGVmIElBX1NTSEQKKyMgZGVmaW5lIElBX1NTSEQgSUFfTE9HSU4KKyNlbmRpZgorI2lmbmRlZiBNQVhIT1NUTkFNRUxFTgorIyBkZWZpbmUgTUFYSE9TVE5BTUVMRU4gIDY0CisjZW5kaWYKKyNpZm5kZWYgX0NSQVlUM0UKKyMgZGVmaW5lIFRJT0NHUEdSUCAodElPQ3wyMCkKKyNlbmRpZgorCisjZW5kaWYgLyogVU5JQ09TICovCisKKyNlbmRpZiAvKiBfQlNEX0NSQVlfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2QtY3lnd2luX3V0aWwuYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYnNkLWN5Z3dpbl91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJlZmMwMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYnNkLWN5Z3dpbl91dGlsLmMKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMTEgQ29yaW5uYSBWaW5zY2hlbiA8dmluc2NoZW5AcmVkaGF0LmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogQ3JlYXRlZDogU2F0IFNlcCAwMiAxMjoxNzowMCAyMDAwIGN2CisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgZm9yY2luZyBvcGVuZWQgZmlsZSBkZXNjcmlwdG9ycyB0bworICogYmluYXJ5IG1vZGUgb24gV2luZG93cyBzeXN0ZW1zLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaWZkZWYgSEFWRV9DWUdXSU4KKworI2lmIGRlZmluZWQob3BlbikgJiYgb3BlbiA9PSBiaW5hcnlfb3BlbgorIyB1bmRlZiBvcGVuCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisKK2ludCAKK2JpbmFyeV9vcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCW1vZGVfdCBtb2RlOworCQorCXZhX3N0YXJ0KGFwLCBmbGFncyk7CisJbW9kZSA9IHZhX2FyZyhhcCwgbW9kZV90KTsKKwl2YV9lbmQoYXApOworCXJldHVybiAob3BlbihmaWxlbmFtZSwgZmxhZ3MgfCBPX0JJTkFSWSwgbW9kZSkpOworfQorCitpbnQKK2NoZWNrX250c2VjKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCXJldHVybiAocGF0aGNvbmYoZmlsZW5hbWUsIF9QQ19QT1NJWF9QRVJNSVNTSU9OUykpOworfQorCisjZGVmaW5lIE5MKHgpIHgsIChzaXplb2YgKHgpIC0gMSkKKyNkZWZpbmUgV0VOVl9TSVogKHNpemVvZiAod2Vudl9hcnIpIC8gc2l6ZW9mICh3ZW52X2FyclswXSkpCisKK3N0YXRpYyBzdHJ1Y3Qgd2VudiB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzaXplX3QgbmFtZWxlbjsKK30gd2Vudl9hcnJbXSA9IHsKKwl7IE5MKCJBTExVU0VSU1BST0ZJTEU9IikgfSwKKwl7IE5MKCJDT01QVVRFUk5BTUU9IikgfSwKKwl7IE5MKCJDT01TUEVDPSIpIH0sCisJeyBOTCgiQ1lHV0lOPSIpIH0sCisJeyBOTCgiT1M9IikgfSwKKwl7IE5MKCJQQVRIPSIpIH0sCisJeyBOTCgiUEFUSEVYVD0iKSB9LAorCXsgTkwoIlBST0dSQU1GSUxFUz0iKSB9LAorCXsgTkwoIlNZU1RFTURSSVZFPSIpIH0sCisJeyBOTCgiU1lTVEVNUk9PVD0iKSB9LAorCXsgTkwoIldJTkRJUj0iKSB9Cit9OworCitjaGFyICoqCitmZXRjaF93aW5kb3dzX2Vudmlyb25tZW50KHZvaWQpCit7CisJY2hhciAqKmUsICoqcDsKKwl1bnNpZ25lZCBpbnQgaSwgaWR4ID0gMDsKKworCXAgPSB4Y2FsbG9jKFdFTlZfU0laICsgMSwgc2l6ZW9mKGNoYXIgKikpOworCWZvciAoZSA9IGVudmlyb247ICplICE9IE5VTEw7ICsrZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgV0VOVl9TSVo7ICsraSkgeworCQkJaWYgKCFzdHJuY21wKCplLCB3ZW52X2FycltpXS5uYW1lLCB3ZW52X2FycltpXS5uYW1lbGVuKSkKKwkJCQlwW2lkeCsrXSA9ICplOworCQl9CisJfQorCXBbaWR4XSA9IE5VTEw7CisJcmV0dXJuIHA7Cit9CisKK3ZvaWQKK2ZyZWVfd2luZG93c19lbnZpcm9ubWVudChjaGFyICoqcCkKK3sKKwl4ZnJlZShwKTsKK30KKworI2VuZGlmIC8qIEhBVkVfQ1lHV0lOICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2JzZC1jeWd3aW5fdXRpbC5oIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2QtY3lnd2luX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjIzNzkyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2QtY3lnd2luX3V0aWwuaApAQCAtMCwwICsxLDU4IEBACisvKiAkSWQ6IGJzZC1jeWd3aW5fdXRpbC5oLHYgMS4xNCAyMDEyLzAzLzMwIDAzOjA3OjA3IGRqbSBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDExIENvcmlubmEgVmluc2NoZW4gPHZpbnNjaGVuQHJlZGhhdC5jb20+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIENyZWF0ZWQ6IFNhdCBTZXAgMDIgMTI6MTc6MDAgMjAwMCBjdgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgZm9yIGZvcmNpbmcgb3BlbmVkIGZpbGUgZGVzY3JpcHRvcnMgdG8KKyAqIGJpbmFyeSBtb2RlIG9uIFdpbmRvd3Mgc3lzdGVtcy4KKyAqLworCisjaWZuZGVmIF9CU0RfQ1lHV0lOX1VUSUxfSAorI2RlZmluZSBfQlNEX0NZR1dJTl9VVElMX0gKKworI2lmZGVmIEhBVkVfQ1lHV0lOCisKKyN1bmRlZiBFUlJPUgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHN5cy9jeWd3aW4uaD4KKyNpbmNsdWRlIDxpby5oPgorCisvKiBNYWtlIHN1cmUgX1dJTjMyIGlzbid0IGRlZmluZWQgbGF0ZXIgaW4gdGhlIGNvZGUsIG90aGVyd2lzZSBoZWFkZXJzIGZyb20KKyAgIG90aGVyIHBhY2thZ2VzIG1pZ2h0IGdldCB0aGUgd3JvbmcgaWRlYSBhYm91dCB0aGUgdGFyZ2V0IHN5c3RlbS4gKi8KKyNpZmRlZiBfV0lOMzIKKyN1bmRlZiBfV0lOMzIKKyNlbmRpZgorCitpbnQgYmluYXJ5X29wZW4oY29uc3QgY2hhciAqLCBpbnQgLCAuLi4pOworaW50IGNoZWNrX250c2VjKGNvbnN0IGNoYXIgKik7CitjaGFyICoqZmV0Y2hfd2luZG93c19lbnZpcm9ubWVudCh2b2lkKTsKK3ZvaWQgZnJlZV93aW5kb3dzX2Vudmlyb25tZW50KGNoYXIgKiopOworCisjZGVmaW5lIG9wZW4gYmluYXJ5X29wZW4KKworI2VuZGlmIC8qIEhBVkVfQ1lHV0lOICovCisKKyNlbmRpZiAvKiBfQlNEX0NZR1dJTl9VVElMX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYnNkLWdldHBlZXJlaWQuYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYnNkLWdldHBlZXJlaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjdlNjc3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2QtZ2V0cGVlcmVpZC5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsMjAwNCBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpZiAhZGVmaW5lZChIQVZFX0dFVFBFRVJFSUQpCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmIGRlZmluZWQoU09fUEVFUkNSRUQpCitpbnQKK2dldHBlZXJlaWQoaW50IHMsIHVpZF90ICpldWlkLCBnaWRfdCAqZ2lkKQoreworCXN0cnVjdCB1Y3JlZCBjcmVkOworCXNvY2tsZW5fdCBsZW4gPSBzaXplb2YoY3JlZCk7CisKKwlpZiAoZ2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19QRUVSQ1JFRCwgJmNyZWQsICZsZW4pIDwgMCkKKwkJcmV0dXJuICgtMSk7CisJKmV1aWQgPSBjcmVkLnVpZDsKKwkqZ2lkID0gY3JlZC5naWQ7CisKKwlyZXR1cm4gKDApOworfQorI2VsaWYgZGVmaW5lZChIQVZFX0dFVFBFRVJVQ1JFRCkKKworI2lmZGVmIEhBVkVfVUNSRURfSAorIyBpbmNsdWRlIDx1Y3JlZC5oPgorI2VuZGlmCisKK2ludAorZ2V0cGVlcmVpZChpbnQgcywgdWlkX3QgKmV1aWQsIGdpZF90ICpnaWQpCit7CisJdWNyZWRfdCAqdWNyZWQgPSBOVUxMOworCisJaWYgKGdldHBlZXJ1Y3JlZChzLCAmdWNyZWQpID09IC0xKQorCQlyZXR1cm4gKC0xKTsKKwlpZiAoKCpldWlkID0gdWNyZWRfZ2V0ZXVpZCh1Y3JlZCkpID09IC0xKQorCQlyZXR1cm4gKC0xKTsKKwlpZiAoKCpnaWQgPSB1Y3JlZF9nZXRyZ2lkKHVjcmVkKSkgPT0gLTEpCisJCXJldHVybiAoLTEpOworCisJdWNyZWRfZnJlZSh1Y3JlZCk7CisKKwlyZXR1cm4gKDApOworfQorI2Vsc2UKK2ludAorZ2V0cGVlcmVpZChpbnQgcywgdWlkX3QgKmV1aWQsIGdpZF90ICpnaWQpCit7CisJKmV1aWQgPSBnZXRldWlkKCk7CisJKmdpZCA9IGdldGdpZCgpOworCisJcmV0dXJuICgwKTsKK30KKyNlbmRpZiAvKiBkZWZpbmVkKFNPX1BFRVJDUkVEKSAqLworCisjZW5kaWYgLyogIWRlZmluZWQoSEFWRV9HRVRQRUVSRUlEKSAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2QtbWlzYy5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2QtbWlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZjM3M2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2JzZC1taXNjLmMKQEAgLTAsMCArMSwyNDkgQEAKKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA0IERhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1lTX1NFTEVDVF9ICisjIGluY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorIyBpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgInhtYWxsb2MuaCIKKworI2lmbmRlZiBIQVZFX19fUFJPR05BTUUKK2NoYXIgKl9fcHJvZ25hbWU7CisjZW5kaWYKKworLyoKKyAqIE5CLiBkdXBsaWNhdGUgX19wcm9nbmFtZSBpbiBjYXNlIGl0IGlzIGFuIGFsaWFzIGZvciBhcmd2WzBdCisgKiBPdGhlcndpc2UgaXQgbWF5IGdldCBjbG9iYmVyZWQgYnkgc2V0cHJvY3RpdGxlKCkKKyAqLworY2hhciAqc3NoX2dldF9wcm9nbmFtZShjaGFyICphcmd2MCkKK3sKKyNpZmRlZiBIQVZFX19fUFJPR05BTUUKKwlleHRlcm4gY2hhciAqX19wcm9nbmFtZTsKKworCXJldHVybiB4c3RyZHVwKF9fcHJvZ25hbWUpOworI2Vsc2UKKwljaGFyICpwOworCisJaWYgKGFyZ3YwID09IE5VTEwpCisJCXJldHVybiAoInVua25vd24iKTsJLyogWFhYICovCisJcCA9IHN0cnJjaHIoYXJndjAsICcvJyk7CisJaWYgKHAgPT0gTlVMTCkKKwkJcCA9IGFyZ3YwOworCWVsc2UKKwkJcCsrOworCisJcmV0dXJuICh4c3RyZHVwKHApKTsKKyNlbmRpZgorfQorCisjaWZuZGVmIEhBVkVfU0VUTE9HSU4KK2ludCBzZXRsb2dpbihjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiAoMCk7Cit9CisjZW5kaWYgLyogIUhBVkVfU0VUTE9HSU4gKi8KKworI2lmbmRlZiBIQVZFX0lOTkVUR1IKK2ludCBpbm5ldGdyKGNvbnN0IGNoYXIgKm5ldGdyb3VwLCBjb25zdCBjaGFyICpob3N0LCAKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVzZXIsIGNvbnN0IGNoYXIgKmRvbWFpbikKK3sKKwlyZXR1cm4gKDApOworfQorI2VuZGlmIC8qIEhBVkVfSU5ORVRHUiAqLworCisjaWYgIWRlZmluZWQoSEFWRV9TRVRFVUlEKSAmJiBkZWZpbmVkKEhBVkVfU0VUUkVVSUQpCitpbnQgc2V0ZXVpZCh1aWRfdCBldWlkKQoreworCXJldHVybiAoc2V0cmV1aWQoLTEsIGV1aWQpKTsKK30KKyNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX1NFVEVVSUQpICYmIGRlZmluZWQoSEFWRV9TRVRSRVVJRCkgKi8KKworI2lmICFkZWZpbmVkKEhBVkVfU0VURUdJRCkgJiYgZGVmaW5lZChIQVZFX1NFVFJFU0dJRCkKK2ludCBzZXRlZ2lkKHVpZF90IGVnaWQpCit7CisJcmV0dXJuKHNldHJlc2dpZCgtMSwgZWdpZCwgLTEpKTsKK30KKyNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX1NFVEVHSUQpICYmIGRlZmluZWQoSEFWRV9TRVRSRVNHSUQpICovCisKKyNpZiAhZGVmaW5lZChIQVZFX1NUUkVSUk9SKSAmJiBkZWZpbmVkKEhBVkVfU1lTX0VSUkxJU1QpICYmIGRlZmluZWQoSEFWRV9TWVNfTkVSUikKK2NvbnN0IGNoYXIgKnN0cmVycm9yKGludCBlKQoreworCWV4dGVybiBpbnQgc3lzX25lcnI7CisJZXh0ZXJuIGNoYXIgKnN5c19lcnJsaXN0W107CisJCisJaWYgKChlID49IDApICYmIChlIDwgc3lzX25lcnIpKQorCQlyZXR1cm4gKHN5c19lcnJsaXN0W2VdKTsKKworCXJldHVybiAoInVubGlzdGVkIGVycm9yIik7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1VUSU1FUworaW50IHV0aW1lcyhjaGFyICpmaWxlbmFtZSwgc3RydWN0IHRpbWV2YWwgKnR2cCkKK3sKKwlzdHJ1Y3QgdXRpbWJ1ZiB1YjsKKworCXViLmFjdGltZSA9IHR2cFswXS50dl9zZWM7CisJdWIubW9kdGltZSA9IHR2cFsxXS50dl9zZWM7CisJCisJcmV0dXJuICh1dGltZShmaWxlbmFtZSwgJnViKSk7Cit9CisjZW5kaWYgCisKKyNpZm5kZWYgSEFWRV9UUlVOQ0FURQoraW50IHRydW5jYXRlKGNvbnN0IGNoYXIgKnBhdGgsIG9mZl90IGxlbmd0aCkKK3sKKwlpbnQgZmQsIHJldCwgc2F2ZXJybm87CisKKwlmZCA9IG9wZW4ocGF0aCwgT19XUk9OTFkpOworCWlmIChmZCA8IDApCisJCXJldHVybiAoLTEpOworCisJcmV0ID0gZnRydW5jYXRlKGZkLCBsZW5ndGgpOworCXNhdmVycm5vID0gZXJybm87CisJY2xvc2UoZmQpOworCWlmIChyZXQgPT0gLTEpCisJCWVycm5vID0gc2F2ZXJybm87CisKKwlyZXR1cm4ocmV0KTsKK30KKyNlbmRpZiAvKiBIQVZFX1RSVU5DQVRFICovCisKKyNpZiAhZGVmaW5lZChIQVZFX05BTk9TTEVFUCkgJiYgIWRlZmluZWQoSEFWRV9OU0xFRVApCitpbnQgbmFub3NsZWVwKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqcmVxLCBzdHJ1Y3QgdGltZXNwZWMgKnJlbSkKK3sKKwlpbnQgcmMsIHNhdmVycm5vOworCWV4dGVybiBpbnQgZXJybm87CisJc3RydWN0IHRpbWV2YWwgdHN0YXJ0LCB0c3RvcCwgdHJlbWFpbiwgdGltZTJ3YWl0OworCisJVElNRVNQRUNfVE9fVElNRVZBTCgmdGltZTJ3YWl0LCByZXEpCisJKHZvaWQpIGdldHRpbWVvZmRheSgmdHN0YXJ0LCBOVUxMKTsKKwlyYyA9IHNlbGVjdCgwLCBOVUxMLCBOVUxMLCBOVUxMLCAmdGltZTJ3YWl0KTsKKwlpZiAocmMgPT0gLTEpIHsKKwkJc2F2ZXJybm8gPSBlcnJubzsKKwkJKHZvaWQpIGdldHRpbWVvZmRheSAoJnRzdG9wLCBOVUxMKTsKKwkJZXJybm8gPSBzYXZlcnJubzsKKwkJdHJlbWFpbi50dl9zZWMgPSB0aW1lMndhaXQudHZfc2VjIC0gCisJCQkodHN0b3AudHZfc2VjIC0gdHN0YXJ0LnR2X3NlYyk7CisJCXRyZW1haW4udHZfdXNlYyA9IHRpbWUyd2FpdC50dl91c2VjIC0gCisJCQkodHN0b3AudHZfdXNlYyAtIHRzdGFydC50dl91c2VjKTsKKwkJdHJlbWFpbi50dl9zZWMgKz0gdHJlbWFpbi50dl91c2VjIC8gMTAwMDAwMEw7CisJCXRyZW1haW4udHZfdXNlYyAlPSAxMDAwMDAwTDsKKwl9IGVsc2UgeworCQl0cmVtYWluLnR2X3NlYyA9IDA7CisJCXRyZW1haW4udHZfdXNlYyA9IDA7CisJfQorCWlmIChyZW0gIT0gTlVMTCkKKwkJVElNRVZBTF9UT19USU1FU1BFQygmdHJlbWFpbiwgcmVtKQorCisJcmV0dXJuKHJjKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfVENHRVRQR1JQCitwaWRfdAordGNnZXRwZ3JwKGludCBmZCkKK3sKKwlpbnQgY3R0eV9wZ3JwOworCisJaWYgKGlvY3RsKGZkLCBUSU9DR1BHUlAsICZjdHR5X3BncnApID09IC0xKQorCQlyZXR1cm4oLTEpOworCWVsc2UKKwkJcmV0dXJuKGN0dHlfcGdycCk7Cit9CisjZW5kaWYgLyogSEFWRV9UQ0dFVFBHUlAgKi8KKworI2lmbmRlZiBIQVZFX1RDU0VOREJSRUFLCitpbnQKK3Rjc2VuZGJyZWFrKGludCBmZCwgaW50IGR1cmF0aW9uKQoreworIyBpZiBkZWZpbmVkKFRJT0NTQlJLKSAmJiBkZWZpbmVkKFRJT0NDQlJLKQorCXN0cnVjdCB0aW1ldmFsIHNsZWVweXRpbWU7CisKKwlzbGVlcHl0aW1lLnR2X3NlYyA9IDA7CisJc2xlZXB5dGltZS50dl91c2VjID0gNDAwMDAwOworCWlmIChpb2N0bChmZCwgVElPQ1NCUkssIDApID09IC0xKQorCQlyZXR1cm4gKC0xKTsKKwkodm9pZClzZWxlY3QoMCwgMCwgMCwgMCwgJnNsZWVweXRpbWUpOworCWlmIChpb2N0bChmZCwgVElPQ0NCUkssIDApID09IC0xKQorCQlyZXR1cm4gKC0xKTsKKwlyZXR1cm4gKDApOworIyBlbHNlCisJcmV0dXJuIC0xOworIyBlbmRpZgorfQorI2VuZGlmIC8qIEhBVkVfVENTRU5EQlJFQUsgKi8KKworbXlzaWdfdAorbXlzaWduYWwoaW50IHNpZywgbXlzaWdfdCBhY3QpCit7CisjaWZkZWYgSEFWRV9TSUdBQ1RJT04KKwlzdHJ1Y3Qgc2lnYWN0aW9uIHNhLCBvc2E7CisKKwlpZiAoc2lnYWN0aW9uKHNpZywgTlVMTCwgJm9zYSkgPT0gLTEpCisJCXJldHVybiAobXlzaWdfdCkgLTE7CisJaWYgKG9zYS5zYV9oYW5kbGVyICE9IGFjdCkgeworCQltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKwkJc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOworCQlzYS5zYV9mbGFncyA9IDA7CisjaWZkZWYgU0FfSU5URVJSVVBUCisJCWlmIChzaWcgPT0gU0lHQUxSTSkKKwkJCXNhLnNhX2ZsYWdzIHw9IFNBX0lOVEVSUlVQVDsKKyNlbmRpZgorCQlzYS5zYV9oYW5kbGVyID0gYWN0OworCQlpZiAoc2lnYWN0aW9uKHNpZywgJnNhLCBOVUxMKSA9PSAtMSkKKwkJCXJldHVybiAobXlzaWdfdCkgLTE7CisJfQorCXJldHVybiAob3NhLnNhX2hhbmRsZXIpOworI2Vsc2UKKwkjdW5kZWYgc2lnbmFsCisJcmV0dXJuIChzaWduYWwoc2lnLCBhY3QpKTsKKyNlbmRpZgorfQorCisjaWZuZGVmIEhBVkVfU1RSRFVQCitjaGFyICoKK3N0cmR1cChjb25zdCBjaGFyICpzdHIpCit7CisJc2l6ZV90IGxlbjsKKwljaGFyICpjcDsKKworCWxlbiA9IHN0cmxlbihzdHIpICsgMTsKKwljcCA9IG1hbGxvYyhsZW4pOworCWlmIChjcCAhPSBOVUxMKQorCQlyZXR1cm4obWVtY3B5KGNwLCBzdHIsIGxlbikpOworCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9JU0JMQU5LCitpbnQgaXNibGFuayhpbnQgYykKK3sKKwlyZXR1cm4gKGMgPT0gJyAnIHx8IGMgPT0gJ1x0Jyk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYnNkLW1pc2MuaCBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYnNkLW1pc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzcxNzU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2QtbWlzYy5oCkBAIC0wLDAgKzEsMTAyIEBACisvKiAkSWQ6IGJzZC1taXNjLmgsdiAxLjIwIDIwMTIvMDIvMTQgMTg6MDM6MzEgdGltIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNCBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfQlNEX01JU0NfSAorI2RlZmluZSBfQlNEX01JU0NfSAorCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworY2hhciAqc3NoX2dldF9wcm9nbmFtZShjaGFyICopOworCisjaWZuZGVmIEhBVkVfU0VUU0lECisjZGVmaW5lIHNldHNpZCgpIHNldHBncnAoMCwgZ2V0cGlkKCkpCisjZW5kaWYgLyogIUhBVkVfU0VUU0lEICovCisKKyNpZm5kZWYgSEFWRV9TRVRFTlYKK2ludCBzZXRlbnYoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7CisjZW5kaWYgLyogIUhBVkVfU0VURU5WICovCisKKyNpZm5kZWYgSEFWRV9TRVRMT0dJTgoraW50IHNldGxvZ2luKGNvbnN0IGNoYXIgKik7CisjZW5kaWYgLyogIUhBVkVfU0VUTE9HSU4gKi8KKworI2lmbmRlZiBIQVZFX0lOTkVUR1IKK2ludCBpbm5ldGdyKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisjZW5kaWYgLyogSEFWRV9JTk5FVEdSICovCisKKyNpZiAhZGVmaW5lZChIQVZFX1NFVEVVSUQpICYmIGRlZmluZWQoSEFWRV9TRVRSRVVJRCkKK2ludCBzZXRldWlkKHVpZF90KTsKKyNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX1NFVEVVSUQpICYmIGRlZmluZWQoSEFWRV9TRVRSRVVJRCkgKi8KKworI2lmICFkZWZpbmVkKEhBVkVfU0VURUdJRCkgJiYgZGVmaW5lZChIQVZFX1NFVFJFU0dJRCkKK2ludCBzZXRlZ2lkKHVpZF90KTsKKyNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX1NFVEVHSUQpICYmIGRlZmluZWQoSEFWRV9TRVRSRVNHSUQpICovCisKKyNpZiAhZGVmaW5lZChIQVZFX1NUUkVSUk9SKSAmJiBkZWZpbmVkKEhBVkVfU1lTX0VSUkxJU1QpICYmIGRlZmluZWQoSEFWRV9TWVNfTkVSUikKK2NvbnN0IGNoYXIgKnN0cmVycm9yKGludCk7CisjZW5kaWYgCisKKworI2lmbmRlZiBIQVZFX1VUSU1FUworI2lmbmRlZiBIQVZFX1NUUlVDVF9USU1FVkFMCitzdHJ1Y3QgdGltZXZhbCB7CisJbG9uZyB0dl9zZWM7CisJbG9uZyB0dl91c2VjOworfQorI2VuZGlmIC8qIEhBVkVfU1RSVUNUX1RJTUVWQUwgKi8KKworaW50IHV0aW1lcyhjaGFyICosIHN0cnVjdCB0aW1ldmFsICopOworI2VuZGlmIC8qIEhBVkVfVVRJTUVTICovCisKKyNpZm5kZWYgSEFWRV9UUlVOQ0FURQoraW50IHRydW5jYXRlIChjb25zdCBjaGFyICosIG9mZl90KTsKKyNlbmRpZiAvKiBIQVZFX1RSVU5DQVRFICovCisKKyNpZiAhZGVmaW5lZChIQVZFX05BTk9TTEVFUCkgJiYgIWRlZmluZWQoSEFWRV9OU0xFRVApCisjaWZuZGVmIEhBVkVfU1RSVUNUX1RJTUVTUEVDCitzdHJ1Y3QgdGltZXNwZWMgeworCXRpbWVfdAl0dl9zZWM7CisJbG9uZwl0dl9uc2VjOworfTsKKyNlbmRpZgoraW50IG5hbm9zbGVlcChjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKiwgc3RydWN0IHRpbWVzcGVjICopOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9UQ0dFVFBHUlAKK3BpZF90IHRjZ2V0cGdycChpbnQpOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9UQ1NFTkRCUkVBSworaW50IHRjc2VuZGJyZWFrKGludCwgaW50KTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfVU5TRVRFTlYKK2ludCB1bnNldGVudihjb25zdCBjaGFyICopOworI2VuZGlmCisKKy8qIHdyYXBwZXIgZm9yIHNpZ25hbCBpbnRlcmZhY2UgKi8KK3R5cGVkZWYgdm9pZCAoKm15c2lnX3QpKGludCk7CitteXNpZ190IG15c2lnbmFsKGludCBzaWcsIG15c2lnX3QgYWN0KTsKKworI2RlZmluZSBzaWduYWwoYSxiKSBteXNpZ25hbChhLGIpCisKKyNpZm5kZWYgSEFWRV9JU0JMQU5LCitpbnQJaXNibGFuayhpbnQpOworI2VuZGlmCisKKyNlbmRpZiAvKiBfQlNEX01JU0NfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2QtbmV4dHN0ZXAuYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYnNkLW5leHRzdGVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE5NWFmOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYnNkLW5leHRzdGVwLmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMSBCZW4gTGluZHN0cm9tLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpZmRlZiBIQVZFX05FWFQKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSAiYnNkLW5leHRzdGVwLmgiCisKK3BpZF90IAorcG9zaXhfd2FpdChpbnQgKnN0YXR1cykKK3sKKwl1bmlvbiB3YWl0IHN0YXR1c3A7CisJcGlkX3Qgd2FpdF9waWQ7CisKKwkjdW5kZWYgd2FpdAkJCS8qIFVzZSBOZVhUJ3Mgd2FpdCgpIGZ1bmN0aW9uICovCisJd2FpdF9waWQgPSB3YWl0KCZzdGF0dXNwKTsKKwlpZiAoc3RhdHVzKQorCQkqc3RhdHVzID0gKGludCkgc3RhdHVzcC53X3N0YXR1czsKKworCXJldHVybiAod2FpdF9waWQpOworfQorCitpbnQKK3RjZ2V0YXR0cihpbnQgZmQsIHN0cnVjdCB0ZXJtaW9zICp0KQoreworCXJldHVybiAoaW9jdGwoZmQsIFRJT0NHRVRBLCB0KSk7Cit9CisKK2ludAordGNzZXRhdHRyKGludCBmZCwgaW50IG9wdCwgY29uc3Qgc3RydWN0IHRlcm1pb3MgKnQpCit7CisJc3RydWN0IHRlcm1pb3MgbG9jYWx0ZXJtOworCisJaWYgKG9wdCAmIFRDU0FTT0ZUKSB7CisJCWxvY2FsdGVybSA9ICp0OworCQlsb2NhbHRlcm0uY19jZmxhZyB8PSBDSUdOT1JFOworCQl0ID0gJmxvY2FsdGVybTsKKwl9CisJc3dpdGNoIChvcHQgJiB+VENTQVNPRlQpIHsKKwljYXNlIFRDU0FOT1c6CisJCXJldHVybiAoaW9jdGwoZmQsIFRJT0NTRVRBLCB0KSk7CisJY2FzZSBUQ1NBRFJBSU46CisJCXJldHVybiAoaW9jdGwoZmQsIFRJT0NTRVRBVywgdCkpOworCWNhc2UgVENTQUZMVVNIOgorCQlyZXR1cm4gKGlvY3RsKGZkLCBUSU9DU0VUQUYsIHQpKTsKKwlkZWZhdWx0OgorCQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuICgtMSk7CisJfQorfQorCitpbnQgdGNzZXRwZ3JwKGludCBmZCwgcGlkX3QgcGdycCkKK3sKKwlyZXR1cm4gKGlvY3RsKGZkLCBUSU9DU1BHUlAsICZwZ3JwKSk7Cit9CisKK3NwZWVkX3QgY2ZnZXRvc3BlZWQoY29uc3Qgc3RydWN0IHRlcm1pb3MgKnQpCit7CisJcmV0dXJuICh0LT5jX29zcGVlZCk7Cit9CisKK3NwZWVkX3QgY2ZnZXRpc3BlZWQoY29uc3Qgc3RydWN0IHRlcm1pb3MgKnQpCit7CisJcmV0dXJuICh0LT5jX2lzcGVlZCk7Cit9CisKK2ludAorY2ZzZXRvc3BlZWQoc3RydWN0IHRlcm1pb3MgKnQsaW50IHNwZWVkKQoreworCXQtPmNfb3NwZWVkID0gc3BlZWQ7CisJcmV0dXJuICgwKTsKK30KKworaW50CitjZnNldGlzcGVlZChzdHJ1Y3QgdGVybWlvcyAqdCwgaW50IHNwZWVkKQoreworCXQtPmNfaXNwZWVkID0gc3BlZWQ7CisJcmV0dXJuICgwKTsKK30KKyNlbmRpZiAvKiBIQVZFX05FWFQgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYnNkLW5leHRzdGVwLmggYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2JzZC1uZXh0c3RlcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNWI0YjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2JzZC1uZXh0c3RlcC5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qICRJZDogYnNkLW5leHRzdGVwLmgsdiAxLjkgMjAwMy8wOC8yOSAxNjo1OTo1MiBtb3VyaW5nIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMSBCZW4gTGluZHN0cm9tLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgX05FWFRfUE9TSVhfSAorI2RlZmluZSBfTkVYVF9QT1NJWF9ICisKKyNpZmRlZiBIQVZFX05FWFQKKyNpbmNsdWRlIDxzeXMvZGlyLmg+CisKKy8qIE5HUk9VUFNfTUFYIGlzIGJlaGluZCAtbHBvc2l4LiAgVXNlIHRoZSBCU0QgdmVyc2lvbiB3aGljaCBpcyBOR1JPVVBTICovCisjdW5kZWYgTkdST1VQU19NQVgKKyNkZWZpbmUgTkdST1VQU19NQVggTkdST1VQUworCisvKiBOZVhUJ3MgcmVhZGRpcigpIGlzIEJTRCAoc3RydWN0IGRpcmVjdCkgbm90IFBPU0lYIChzdHJ1Y3QgZGlyZW50KSAqLworI2RlZmluZSBkaXJlbnQgZGlyZWN0CisKKy8qIFN3YXAgb3V0IE5lWFQncyBCU0Qgd2FpdCgpIGZvciBhIG1vcmUgUE9TSVggY29tcGxpZW50IG9uZSAqLworcGlkX3QgcG9zaXhfd2FpdChpbnQgKik7CisjZGVmaW5lIHdhaXQoYSkgcG9zaXhfd2FpdChhKQorCisvKiAjaWZkZWYgd3JhcHBlZCBmdW5jdGlvbnMgdGhhdCBuZWVkIGRlZmluaW5nIGZvciBjbGVhbiBjb21waWxpbmcgKi8KK3BpZF90IGdldHBwaWQodm9pZCk7Cit2b2lkIHZoYW5ndXAodm9pZCk7CitpbnQgaW5uZXRncihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCisvKiBURVJNQ0FQICovCitpbnQgdGNnZXRhdHRyKGludCwgc3RydWN0IHRlcm1pb3MgKik7CitpbnQgdGNzZXRhdHRyKGludCwgaW50LCBjb25zdCBzdHJ1Y3QgdGVybWlvcyAqKTsKK2ludCB0Y3NldHBncnAoaW50LCBwaWRfdCk7CitzcGVlZF90IGNmZ2V0b3NwZWVkKGNvbnN0IHN0cnVjdCB0ZXJtaW9zICopOworc3BlZWRfdCBjZmdldGlzcGVlZChjb25zdCBzdHJ1Y3QgdGVybWlvcyAqKTsKK2ludCBjZnNldG9zcGVlZChzdHJ1Y3QgdGVybWlvcyAqLCBpbnQpOworaW50IGNmc2V0aXNwZWVkKHN0cnVjdCB0ZXJtaW9zICosIGludCk7CisjZW5kaWYgLyogSEFWRV9ORVhUICovCisjZW5kaWYgLyogX05FWFRfUE9TSVhfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2Qtb3BlbnB0eS5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2Qtb3BlbnB0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NzdlYjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2JzZC1vcGVucHR5LmMKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBQbGVhc2Ugbm90ZTogdGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBvcGVucHR5KCkgaXMgZmFyIGZyb20gY29tcGxldGUuCisgKiBpdCBpcyBqdXN0IGVub3VnaCBmb3IgcG9ydGFibGUgT3BlblNTSCdzIG5lZWRzLgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiBBbGxvY2F0aW5nIGEgcHNldWRvLXRlcm1pbmFsLCBhbmQgbWFraW5nIGl0IHRoZSBjb250cm9sbGluZyB0dHkuCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKyNpZiAhZGVmaW5lZChIQVZFX09QRU5QVFkpCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19JT0NUTF9ICisjIGluY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0ZDTlRMX0gKKyMgaW5jbHVkZSA8ZmNudGwuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9VVElMX0gKKyMgaW5jbHVkZSA8dXRpbC5oPgorI2VuZGlmIC8qIEhBVkVfVVRJTF9IICovCisKKyNpZmRlZiBIQVZFX1BUWV9ICisjIGluY2x1ZGUgPHB0eS5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX0RFVl9QVE1YKSAmJiBkZWZpbmVkKEhBVkVfU1lTX1NUUk9QVFNfSCkKKyMgaW5jbHVkZSA8c3lzL3N0cm9wdHMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZm5kZWYgT19OT0NUVFkKKyNkZWZpbmUgT19OT0NUVFkgMAorI2VuZGlmCisKK2ludAorb3BlbnB0eShpbnQgKmFtYXN0ZXIsIGludCAqYXNsYXZlLCBjaGFyICpuYW1lLCBzdHJ1Y3QgdGVybWlvcyAqdGVybXAsCisgICBzdHJ1Y3Qgd2luc2l6ZSAqd2lucCkKK3sKKyNpZiBkZWZpbmVkKEhBVkVfX0dFVFBUWSkKKwkvKgorCSAqIF9nZXRwdHkoMykgZXhpc3RzIGluIFNHSSBJcml4IDQueCwgNS54ICYgNi54IC0tIGl0IGdlbmVyYXRlcyBtb3JlCisJICogcHR5J3MgYXV0b21hZ2ljYWxseSB3aGVuIG5lZWRlZAorCSAqLworCWNoYXIgKnNsYXZlOworCisJaWYgKChzbGF2ZSA9IF9nZXRwdHkoYW1hc3RlciwgT19SRFdSLCAwNjIyLCAwKSkgPT0gTlVMTCkKKwkJcmV0dXJuICgtMSk7CisKKwkvKiBPcGVuIHRoZSBzbGF2ZSBzaWRlLiAqLworCWlmICgoKmFzbGF2ZSA9IG9wZW4oc2xhdmUsIE9fUkRXUiB8IE9fTk9DVFRZKSkgPT0gLTEpIHsKKwkJY2xvc2UoKmFtYXN0ZXIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJcmV0dXJuICgwKTsKKworI2VsaWYgZGVmaW5lZChIQVZFX0RFVl9QVE1YKQorCS8qCisJICogVGhpcyBjb2RlIGlzIHVzZWQgZS5nLiBvbiBTb2xhcmlzIDIueC4gIChOb3RlIHRoYXQgU29sYXJpcyAyLjMKKwkgKiBhbHNvIGhhcyBic2Qtc3R5bGUgcHR5cywgYnV0IHRoZXkgc2ltcGx5IGRvIG5vdCB3b3JrLikKKwkgKi8KKwlpbnQgcHRtOworCWNoYXIgKnB0czsKKwlteXNpZ190IG9sZF9zaWduYWw7CisKKwlpZiAoKHB0bSA9IG9wZW4oIi9kZXYvcHRteCIsIE9fUkRXUiB8IE9fTk9DVFRZKSkgPT0gLTEpCisJCXJldHVybiAoLTEpOworCisJLyogWFhYOiBuZWVkIHRvIGNsb3NlIHB0bSBvbiBlcnJvcj8gKi8KKwlvbGRfc2lnbmFsID0gc2lnbmFsKFNJR0NITEQsIFNJR19ERkwpOworCWlmIChncmFudHB0KHB0bSkgPCAwKQorCQlyZXR1cm4gKC0xKTsKKwlzaWduYWwoU0lHQ0hMRCwgb2xkX3NpZ25hbCk7CisKKwlpZiAodW5sb2NrcHQocHRtKSA8IDApCisJCXJldHVybiAoLTEpOworCisJaWYgKChwdHMgPSBwdHNuYW1lKHB0bSkpID09IE5VTEwpCisJCXJldHVybiAoLTEpOworCSphbWFzdGVyID0gcHRtOworCisJLyogT3BlbiB0aGUgc2xhdmUgc2lkZS4gKi8KKwlpZiAoKCphc2xhdmUgPSBvcGVuKHB0cywgT19SRFdSIHwgT19OT0NUVFkpKSA9PSAtMSkgeworCQljbG9zZSgqYW1hc3Rlcik7CisJCXJldHVybiAoLTEpOworCX0KKworCS8qCisJICogVHJ5IHRvIHB1c2ggdGhlIGFwcHJvcHJpYXRlIHN0cmVhbXMgbW9kdWxlcywgYXMgZGVzY3JpYmVkIAorCSAqIGluIFNvbGFyaXMgcHRzKDcpLgorCSAqLworCWlvY3RsKCphc2xhdmUsIElfUFVTSCwgInB0ZW0iKTsKKwlpb2N0bCgqYXNsYXZlLCBJX1BVU0gsICJsZHRlcm0iKTsKKyMgaWZuZGVmIF9faHB1eAorCWlvY3RsKCphc2xhdmUsIElfUFVTSCwgInR0Y29tcGF0Iik7CisjIGVuZGlmIC8qIF9faHB1eCAqLworCisJcmV0dXJuICgwKTsKKworI2VsaWYgZGVmaW5lZChIQVZFX0RFVl9QVFNfQU5EX1BUQykKKwkvKiBBSVgtc3R5bGUgcHR5IGNvZGUuICovCisJY29uc3QgY2hhciAqdHRuYW1lOworCisJaWYgKCgqYW1hc3RlciA9IG9wZW4oIi9kZXYvcHRjIiwgT19SRFdSIHwgT19OT0NUVFkpKSA9PSAtMSkKKwkJcmV0dXJuICgtMSk7CisJaWYgKCh0dG5hbWUgPSB0dHluYW1lKCphbWFzdGVyKSkgPT0gTlVMTCkKKwkJcmV0dXJuICgtMSk7CisJaWYgKCgqYXNsYXZlID0gb3Blbih0dG5hbWUsIE9fUkRXUiB8IE9fTk9DVFRZKSkgPT0gLTEpIHsKKwkJY2xvc2UoKmFtYXN0ZXIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJcmV0dXJuICgwKTsKKworI2VsaWYgZGVmaW5lZChfVU5JQ09TKQorCWNoYXIgcHRidWZbNjRdLCB0dGJ1Zls2NF07CisJaW50IGk7CisJaW50IGhpZ2hwdHk7CisKKwloaWdocHR5ID0gMTI4OworI2lmZGVmIF9TQ19DUkFZX05QVFkKKwlpZiAoKGhpZ2hwdHkgPSBzeXNjb25mKF9TQ19DUkFZX05QVFkpKSA9PSAtMSkKKwkJaGlnaHB0eSA9IDEyODsKKyNlbmRpZiAvKiBfU0NfQ1JBWV9OUFRZICovCisKKwlmb3IgKGkgPSAwOyBpIDwgaGlnaHB0eTsgaSsrKSB7CisJCXNucHJpbnRmKHB0YnVmLCBzaXplb2YocHRidWYpLCAiL2Rldi9wdHkvJTAzZCIsIGkpOworCQlzbnByaW50Zih0dGJ1Ziwgc2l6ZW9mKHR0YnVmKSwgIi9kZXYvdHR5cCUwM2QiLCBpKTsKKwkJaWYgKCgqYW1hc3RlciA9IG9wZW4ocHRidWYsIE9fUkRXUnxPX05PQ1RUWSkpID09IC0xKQorCQkJY29udGludWU7CisJCS8qIE9wZW4gdGhlIHNsYXZlIHNpZGUuICovCisJCWlmICgoKmFzbGF2ZSA9IG9wZW4odHRidWYsIE9fUkRXUnxPX05PQ1RUWSkpID09IC0xKSB7CisJCQljbG9zZSgqYW1hc3Rlcik7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlyZXR1cm4gKDApOworCX0KKwlyZXR1cm4gKC0xKTsKKworI2Vsc2UKKwkvKiBCU0Qtc3R5bGUgcHR5IGNvZGUuICovCisJY2hhciBwdGJ1Zls2NF0sIHR0YnVmWzY0XTsKKwlpbnQgaTsKKwljb25zdCBjaGFyICpwdHltYWpvcnMgPSAicHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtbm8iCisJICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI7CisJY29uc3QgY2hhciAqcHR5bWlub3JzID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCWludCBudW1fbWlub3JzID0gc3RybGVuKHB0eW1pbm9ycyk7CisJaW50IG51bV9wdHlzID0gc3RybGVuKHB0eW1ham9ycykgKiBudW1fbWlub3JzOworCXN0cnVjdCB0ZXJtaW9zIHRpbzsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcHR5czsgaSsrKSB7CisJCXNucHJpbnRmKHB0YnVmLCBzaXplb2YocHRidWYpLCAiL2Rldi9wdHklYyVjIiwgCisJCSAgICBwdHltYWpvcnNbaSAvIG51bV9taW5vcnNdLCBwdHltaW5vcnNbaSAlIG51bV9taW5vcnNdKTsKKwkJc25wcmludGYodHRidWYsIHNpemVvZih0dGJ1ZiksICIvZGV2L3R0eSVjJWMiLAorCQkgICAgcHR5bWFqb3JzW2kgLyBudW1fbWlub3JzXSwgcHR5bWlub3JzW2kgJSBudW1fbWlub3JzXSk7CisKKwkJaWYgKCgqYW1hc3RlciA9IG9wZW4ocHRidWYsIE9fUkRXUiB8IE9fTk9DVFRZKSkgPT0gLTEpIHsKKwkJCS8qIFRyeSBTQ08gc3R5bGUgbmFtaW5nICovCisJCQlzbnByaW50ZihwdGJ1Ziwgc2l6ZW9mKHB0YnVmKSwgIi9kZXYvcHR5cCVkIiwgaSk7CisJCQlzbnByaW50Zih0dGJ1Ziwgc2l6ZW9mKHR0YnVmKSwgIi9kZXYvdHR5cCVkIiwgaSk7CisJCQlpZiAoKCphbWFzdGVyID0gb3BlbihwdGJ1ZiwgT19SRFdSIHwgT19OT0NUVFkpKSA9PSAtMSkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCS8qIE9wZW4gdGhlIHNsYXZlIHNpZGUuICovCisJCWlmICgoKmFzbGF2ZSA9IG9wZW4odHRidWYsIE9fUkRXUiB8IE9fTk9DVFRZKSkgPT0gLTEpIHsKKwkJCWNsb3NlKCphbWFzdGVyKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJCS8qIHNldCB0dHkgbW9kZXMgdG8gYSBzYW5lIHN0YXRlIGZvciBicm9rZW4gY2xpZW50cyAqLworCQlpZiAodGNnZXRhdHRyKCphbWFzdGVyLCAmdGlvKSAhPSAtMSkgeworCQkJdGlvLmNfbGZsYWcgfD0gKEVDSE8gfCBJU0lHIHwgSUNBTk9OKTsKKwkJCXRpby5jX29mbGFnIHw9IChPUE9TVCB8IE9OTENSKTsKKwkJCXRpby5jX2lmbGFnIHw9IElDUk5MOworCQkJdGNzZXRhdHRyKCphbWFzdGVyLCBUQ1NBTk9XLCAmdGlvKTsKKwkJfQorCisJCXJldHVybiAoMCk7CisJfQorCXJldHVybiAoLTEpOworI2VuZGlmCit9CisKKyNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX09QRU5QVFkpICovCisKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYnNkLXBvbGwuYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYnNkLXBvbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODk5ZDdhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2QtcG9sbC5jCkBAIC0wLDAgKzEsMTE5IEBACisvKiAkSWQ6IGJzZC1wb2xsLmMsdiAxLjQgMjAwOC8wOC8yOSAyMTozMjozOCBkdHVja2VyIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUsIDIwMDcgRGFycmVuIFR1Y2tlciAoZHR1Y2tlciBhdCB6aXAgY29tIGF1KS4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKyNpZiAhZGVmaW5lZChIQVZFX1BPTEwpCisKKyNpZmRlZiBIQVZFX1NZU19TRUxFQ1RfSAorIyBpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAiYnNkLXBvbGwuaCIKKworLyoKKyAqIEEgbWluaW1hbCBpbXBsZW1lbnRhdGlvbiBvZiBwb2xsKDIpLCBidWlsdCBvbiB0b3Agb2Ygc2VsZWN0KDIpLgorICoKKyAqIE9ubHkgc3VwcG9ydHMgUE9MTElOIGFuZCBQT0xMT1VUIGZsYWdzIGluIHBmZC5ldmVudHMsIGFuZCBQT0xMSU4sIFBPTExPVVQKKyAqIGFuZCBQT0xMRVJSIGZsYWdzIGluIHJldmVudHMuCisgKgorICogU3VwcG9ydHMgcGZkLmZkID0gLTEgbWVhbmluZyAidW51c2VkIiBhbHRob3VnaCBpdCdzIG5vdCBzdGFuZGFyZC4KKyAqLworCitpbnQKK3BvbGwoc3RydWN0IHBvbGxmZCAqZmRzLCBuZmRzX3QgbmZkcywgaW50IHRpbWVvdXQpCit7CisJbmZkc190IGk7CisJaW50IHNhdmVkX2Vycm5vLCByZXQsIGZkLCBtYXhmZCA9IDA7CisJZmRfc2V0ICpyZWFkZmRzID0gTlVMTCwgKndyaXRlZmRzID0gTlVMTCwgKmV4Y2VwdGZkcyA9IE5VTEw7CisJc2l6ZV90IG5tZW1iOworCXN0cnVjdCB0aW1ldmFsIHR2LCAqdHZwID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBuZmRzOyBpKyspIHsKKwkJZmQgPSBmZHNbaV0uZmQ7CisJCWlmIChmZCA+PSBGRF9TRVRTSVpFKSB7CisJCQllcnJubyA9IEVJTlZBTDsKKwkJCXJldHVybiAtMTsKKwkJfQorCQltYXhmZCA9IE1BWChtYXhmZCwgZmQpOworCX0KKworCW5tZW1iID0gaG93bWFueShtYXhmZCArIDEgLCBORkRCSVRTKTsKKwlpZiAoKHJlYWRmZHMgPSBjYWxsb2Mobm1lbWIsIHNpemVvZihmZF9tYXNrKSkpID09IE5VTEwgfHwKKwkgICAgKHdyaXRlZmRzID0gY2FsbG9jKG5tZW1iLCBzaXplb2YoZmRfbWFzaykpKSA9PSBOVUxMIHx8CisJICAgIChleGNlcHRmZHMgPSBjYWxsb2Mobm1lbWIsIHNpemVvZihmZF9tYXNrKSkpID09IE5VTEwpIHsKKwkJc2F2ZWRfZXJybm8gPSBFTk9NRU07CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBwb3B1bGF0ZSBldmVudCBiaXQgdmVjdG9ycyBmb3IgdGhlIGV2ZW50cyB3ZSdyZSBpbnRlcmVzdGVkIGluICovCisJZm9yIChpID0gMDsgaSA8IG5mZHM7IGkrKykgeworCQlmZCA9IGZkc1tpXS5mZDsKKwkJaWYgKGZkID09IC0xKQorCQkJY29udGludWU7CisJCWlmIChmZHNbaV0uZXZlbnRzICYgUE9MTElOKSB7CisJCQlGRF9TRVQoZmQsIHJlYWRmZHMpOworCQkJRkRfU0VUKGZkLCBleGNlcHRmZHMpOworCQl9CisJCWlmIChmZHNbaV0uZXZlbnRzICYgUE9MTE9VVCkgeworCQkJRkRfU0VUKGZkLCB3cml0ZWZkcyk7CisJCQlGRF9TRVQoZmQsIGV4Y2VwdGZkcyk7CisJCX0KKwl9CisKKwkvKiBwb2xsIHRpbWVvdXQgaXMgbXNlYywgc2VsZWN0IGlzIHRpbWV2YWwgKHNlYyArIHVzZWMpICovCisJaWYgKHRpbWVvdXQgPj0gMCkgeworCQl0di50dl9zZWMgPSB0aW1lb3V0IC8gMTAwMDsKKwkJdHYudHZfdXNlYyA9ICh0aW1lb3V0ICUgMTAwMCkgKiAxMDAwOworCQl0dnAgPSAmdHY7CisJfQorCisJcmV0ID0gc2VsZWN0KG1heGZkICsgMSwgcmVhZGZkcywgd3JpdGVmZHMsIGV4Y2VwdGZkcywgdHZwKTsKKwlzYXZlZF9lcnJubyA9IGVycm5vOworCisJLyogc2NhbiB0aHJvdWdoIHNlbGVjdCByZXN1bHRzIGFuZCBzZXQgcG9sbCgpIGZsYWdzICovCisJZm9yIChpID0gMDsgaSA8IG5mZHM7IGkrKykgeworCQlmZCA9IGZkc1tpXS5mZDsKKwkJZmRzW2ldLnJldmVudHMgPSAwOworCQlpZiAoZmQgPT0gLTEpCisJCQljb250aW51ZTsKKwkJaWYgKEZEX0lTU0VUKGZkLCByZWFkZmRzKSkgeworCQkJZmRzW2ldLnJldmVudHMgfD0gUE9MTElOOworCQl9CisJCWlmIChGRF9JU1NFVChmZCwgd3JpdGVmZHMpKSB7CisJCQlmZHNbaV0ucmV2ZW50cyB8PSBQT0xMT1VUOworCQl9CisJCWlmIChGRF9JU1NFVChmZCwgZXhjZXB0ZmRzKSkgeworCQkJZmRzW2ldLnJldmVudHMgfD0gUE9MTEVSUjsKKwkJfQorCX0KKworb3V0OgorCWlmIChyZWFkZmRzICE9IE5VTEwpCisJCWZyZWUocmVhZGZkcyk7CisJaWYgKHdyaXRlZmRzICE9IE5VTEwpCisJCWZyZWUod3JpdGVmZHMpOworCWlmIChleGNlcHRmZHMgIT0gTlVMTCkKKwkJZnJlZShleGNlcHRmZHMpOworCWlmIChyZXQgPT0gLTEpCisJCWVycm5vID0gc2F2ZWRfZXJybm87CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2QtcG9sbC5oIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2QtcG9sbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYmI5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2JzZC1wb2xsLmgKQEAgLTAsMCArMSw2MSBAQAorLyoJJE9wZW5CU0Q6IHBvbGwuaCx2IDEuMTEgMjAwMy8xMi8xMCAyMzoxMDowOCBtaWxsZXJ0IEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYgVGhlbyBkZSBSYWFkdAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyogT1BFTkJTRCBPUklHSU5BTDogc3lzL3N5cy9wb2xsLmggKi8KKworI2lmICFkZWZpbmVkKEhBVkVfUE9MTCkgJiYgIWRlZmluZWQoSEFWRV9QT0xMX0gpCisjaWZuZGVmCV9DT01QQVRfUE9MTF9IXworI2RlZmluZQlfQ09NUEFUX1BPTExfSF8KKwordHlwZWRlZiBzdHJ1Y3QgcG9sbGZkIHsKKwlpbnQgCWZkOworCXNob3J0CWV2ZW50czsKKwlzaG9ydAlyZXZlbnRzOworfSBwb2xsZmRfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQJbmZkc190OworCisjZGVmaW5lCVBPTExJTgkJMHgwMDAxCisjZGVmaW5lCVBPTExPVVQJCTB4MDAwNAorI2RlZmluZQlQT0xMRVJSCQkweDAwMDgKKyNpZiAwCisvKiB0aGUgZm9sbG93aW5nIGFyZSBjdXJyZW50bHkgbm90IGltcGxlbWVudGVkICovCisjZGVmaW5lCVBPTExQUkkJCTB4MDAwMgorI2RlZmluZQlQT0xMSFVQCQkweDAwMTAKKyNkZWZpbmUJUE9MTE5WQUwJMHgwMDIwCisjZGVmaW5lCVBPTExSRE5PUk0JMHgwMDQwCisjZGVmaW5lIFBPTExOT1JNCVBPTExSRE5PUk0KKyNkZWZpbmUgUE9MTFdSTk9STSAgICAgIFBPTExPVVQKKyNkZWZpbmUJUE9MTFJEQkFORAkweDAwODAKKyNkZWZpbmUJUE9MTFdSQkFORAkweDAxMDAKKyNlbmRpZgorCisjZGVmaW5lIElORlRJTQkJKC0xKQkvKiBub3Qgc3RhbmRhcmQgKi8KKworaW50ICAgcG9sbChzdHJ1Y3QgcG9sbGZkICosIG5mZHNfdCwgaW50KTsKKyNlbmRpZiAvKiAhX0NPTVBBVF9QT0xMX0hfICovCisjZW5kaWYgLyogIUhBVkVfUE9MTF9IICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2JzZC1zbnByaW50Zi5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2Qtc25wcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWQyYmUyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2Qtc25wcmludGYuYwpAQCAtMCwwICsxLDg1MCBAQAorLyoKKyAqIENvcHlyaWdodCBQYXRyaWNrIFBvd2VsbCAxOTk1CisgKiBUaGlzIGNvZGUgaXMgYmFzZWQgb24gY29kZSB3cml0dGVuIGJ5IFBhdHJpY2sgUG93ZWxsIChwYXBvd2VsbEBhc3RhcnQuY29tKQorICogSXQgbWF5IGJlIHVzZWQgZm9yIGFueSBwdXJwb3NlIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgcmVtYWlucyBpbnRhY3QKKyAqIG9uIGFsbCBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbDoKKyAqIFBhdHJpY2sgUG93ZWxsIFR1ZSBBcHIgMTEgMDk6NDg6MjEgUERUIDE5OTUKKyAqIEEgYm9tYnByb29mIHZlcnNpb24gb2YgZG9wcm50IChkb3ByKSBpbmNsdWRlZC4KKyAqIFNpZ2guICBUaGlzIHNvcnQgb2YgdGhpbmcgaXMgYWx3YXlzIG5hc3R5IGRvIGRlYWwgd2l0aC4gIE5vdGUgdGhhdAorICogdGhlIHZlcnNpb24gaGVyZSBkb2VzIG5vdCBpbmNsdWRlIGZsb2F0aW5nIHBvaW50Li4uCisgKgorICogc25wcmludGYoKSBpcyB1c2VkIGluc3RlYWQgb2Ygc3ByaW50ZigpIGFzIGl0IGRvZXMgbGltaXQgY2hlY2tzCisgKiBmb3Igc3RyaW5nIGxlbmd0aC4gIFRoaXMgY292ZXJzIGEgbmFzdHkgbG9vcGhvbGUuCisgKgorICogVGhlIG90aGVyIGZ1bmN0aW9ucyBhcmUgdGhlcmUgdG8gcHJldmVudCBOVUxMIHBvaW50ZXJzIGZyb20KKyAqIGNhdXNpbmcgbmFzdCBlZmZlY3RzLgorICoKKyAqIE1vcmUgUmVjZW50bHk6CisgKiAgQnJhbmRvbiBMb25nIDxibG9uZ0BmaWN0aW9uLm5ldD4gOS8xNS85NiBmb3IgbXV0dCAwLjQzCisgKiAgVGhpcyB3YXMgdWdseS4gIEl0IGlzIHN0aWxsIHVnbHkuICBJIG9wdGVkIG91dCBvZiBmbG9hdGluZyBwb2ludAorICogIG51bWJlcnMsIGJ1dCB0aGUgZm9ybWF0dGVyIHVuZGVyc3RhbmRzIGp1c3QgYWJvdXQgZXZlcnl0aGluZworICogIGZyb20gdGhlIG5vcm1hbCBDIHN0cmluZyBmb3JtYXQsIGF0IGxlYXN0IGFzIGZhciBhcyBJIGNhbiB0ZWxsIGZyb20KKyAqICB0aGUgU29sYXJpcyAyLjUgcHJpbnRmKDNTKSBtYW4gcGFnZS4KKyAqCisgKiAgQnJhbmRvbiBMb25nIDxibG9uZ0BmaWN0aW9uLm5ldD4gMTAvMjIvOTcgZm9yIG11dHQgMC44Ny4xCisgKiAgICBPaywgYWRkZWQgc29tZSBtaW5pbWFsIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQsIHdoaWNoIG1lYW5zIHRoaXMKKyAqICAgIHByb2JhYmx5IHJlcXVpcmVzIGxpYm0gb24gbW9zdCBvcGVyYXRpbmcgc3lzdGVtcy4gIERvbid0IHlldAorICogICAgc3VwcG9ydCB0aGUgZXhwb25lbnQgKGUsRSkgYW5kIHNpZ2ZpZyAoZyxHKS4gIEFsc28sIGZtdGludCgpCisgKiAgICB3YXMgcHJldHR5IGJhZGx5IGJyb2tlbiwgaXQganVzdCB3YXNuJ3QgYmVpbmcgZXhlcmNpc2VkIGluIHdheXMKKyAqICAgIHdoaWNoIHNob3dlZCBpdCwgc28gdGhhdCdzIGJlZW4gZml4ZWQuICBBbHNvLCBmb3JtYXRlZCB0aGUgY29kZQorICogICAgdG8gbXV0dCBjb252ZW50aW9ucywgYW5kIHJlbW92ZWQgZGVhZCBjb2RlIGxlZnQgb3ZlciBmcm9tIHRoZQorICogICAgb3JpZ2luYWwuICBBbHNvLCB0aGVyZSBpcyBub3cgYSBidWlsdGluLXRlc3QsIGp1c3QgY29tcGlsZSB3aXRoOgorICogICAgICAgICAgIGdjYyAtRFRFU1RfU05QUklOVEYgLW8gc25wcmludGYgc25wcmludGYuYyAtbG0KKyAqICAgIGFuZCBydW4gc25wcmludGYgZm9yIHJlc3VsdHMuCisgKiAKKyAqICBUaG9tYXMgUm9lc3NsZXIgPHJvZXNzbGVyQGd1dWcuZGU+IDAxLzI3Lzk4IGZvciBtdXR0IDAuODlpCisgKiAgICBUaGUgUEdQIGNvZGUgd2FzIHVzaW5nIHVuc2lnbmVkIGhleGFkZWNpbWFsIGZvcm1hdHMuIAorICogICAgVW5mb3J0dW5hdGVseSwgdW5zaWduZWQgZm9ybWF0cyBzaW1wbHkgZGlkbid0IHdvcmsuCisgKgorICogIE1pY2hhZWwgRWxraW5zIDxtZUBjcy5obWMuZWR1PiAwMy8wNS85OCBmb3IgbXV0dCAwLjkwLjgKKyAqICAgIFRoZSBvcmlnaW5hbCBjb2RlIGFzc3VtZWQgdGhhdCBib3RoIHNucHJpbnRmKCkgYW5kIHZzbnByaW50ZigpIHdlcmUKKyAqICAgIG1pc3NpbmcuICBTb21lIHN5c3RlbXMgb25seSBoYXZlIHNucHJpbnRmKCkgYnV0IG5vdCB2c25wcmludGYoKSwgc28KKyAqICAgIHRoZSBjb2RlIGlzIG5vdyBicm9rZW4gZG93biB1bmRlciBIQVZFX1NOUFJJTlRGIGFuZCBIQVZFX1ZTTlBSSU5URi4KKyAqCisgKiAgQW5kcmV3IFRyaWRnZWxsICh0cmlkZ2VAc2FtYmEub3JnKSBPY3QgMTk5OAorICogICAgZml4ZWQgaGFuZGxpbmcgb2YgJS4wZgorICogICAgYWRkZWQgdGVzdCBmb3IgSEFWRV9MT05HX0RPVUJMRQorICoKKyAqIHRyaWRnZUBzYW1iYS5vcmcsIGlkcmFAc2FtYmEub3JnLCBBcHJpbCAyMDAxCisgKiAgICBnb3QgcmlkIG9mIGZjdnQgY29kZSAodHdhcyBidWdneSBhbmQgbWFkZSB0ZXN0aW5nIGhhcmRlcikKKyAqICAgIGFkZGVkIEM5OSBzZW1hbnRpY3MKKyAqCisgKiBkYXRlOiAyMDAyLzEyLzE5IDE5OjU2OjMxOyAgYXV0aG9yOiBoZXJiOyAgc3RhdGU6IEV4cDsgIGxpbmVzOiArMiAtMAorICogYWN0dWFsbHkgcHJpbnQgYXJncyBmb3IgJWcgYW5kICVlCisgKiAKKyAqIGRhdGU6IDIwMDIvMDYvMDMgMTM6Mzc6NTI7ICBhdXRob3I6IGptY2Q7ICBzdGF0ZTogRXhwOyAgbGluZXM6ICs4IC0wCisgKiBTaW5jZSBpbmNsdWRlcy5oIGlzbid0IGluY2x1ZGVkIGhlcmUsIFZBX0NPUFkgaGFzIHRvIGJlIGRlZmluZWQgaGVyZS4gIEkgZG9uJ3QKKyAqIHNlZSBhbnkgaW5jbHVkZSBmaWxlIHRoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSBoZXJlLCBzbyBJJ20gZGVmaW5pbmcgaXQKKyAqIGxvY2FsbHkuICBGaXhlcyBBSVggYW5kIFNvbGFyaXMgYnVpbGRzLgorICogCisgKiBkYXRlOiAyMDAyLzA2LzAzIDAzOjA3OjI0OyAgYXV0aG9yOiB0cmlkZ2U7ICBzdGF0ZTogRXhwOyAgbGluZXM6ICs1IC0xMworICogcHV0IHRoZSBpZmRlZiBmb3IgSEFWRV9WQV9DT1BZIGluIG9uZSBwbGFjZSByYXRoZXIgdGhhbiBpbiBsb3RzIG9mCisgKiBmdW5jdGlvbnMKKyAqIAorICogZGF0ZTogMjAwMi8wNS8xNyAxNDo1MToyMjsgIGF1dGhvcjogam1jZDsgIHN0YXRlOiBFeHA7ICBsaW5lczogKzIxIC00CisgKiBGaXggdXNhZ2Ugb2YgdmFfbGlzdCBwYXNzZWQgYXMgYW4gYXJnLiAgVXNlIF9fdmFfY29weSBiZWZvcmUgdXNpbmcgaXQKKyAqIHdoZW4gaXQgZXhpc3RzLgorICogCisgKiBkYXRlOiAyMDAyLzA0LzE2IDIyOjM4OjA0OyAgYXV0aG9yOiBpZHJhOyAgc3RhdGU6IEV4cDsgIGxpbmVzOiArMjAgLTE0CisgKiBGaXggaW5jb3JyZWN0IHpwYWRsZW4gaGFuZGxpbmcgaW4gZm10ZnAuCisgKiBUaGFua3MgdG8gT2xsaWUgT2xkaGFtIDxvbGxpZS5vbGRoYW1AbWV0cm8tb3B0aXguY29tPiBmb3Igc3BvdHRpbmcgaXQuCisgKiBmZXcgbW9kcyB0byBtYWtlIGl0IGVhc2llciB0byBjb21waWxlIHRoZSB0ZXN0cy4KKyAqIGFkZGVkZCB0aGUgIk9sbGllIiB0ZXN0IHRvIHRoZSBmbG9hdGluZyBwb2ludCBvbmVzLgorICoKKyAqIE1hcnRpbiBQb29sIChtYnBAc2FtYmEub3JnKSBBcHJpbCAyMDAzCisgKiAgICBSZW1vdmUgTk9fQ09ORklHX0ggc28gdGhhdCB0aGUgdGVzdCBjYXNlIGNhbiBiZSBidWlsdCB3aXRoaW4gYSBzb3VyY2UKKyAqICAgIHRyZWUgd2l0aCBsZXNzIHRyb3VibGUuCisgKiAgICBSZW1vdmUgdW5uZWNlc3NhcnkgU0FGRV9GUkVFKCkgZGVmaW5pdGlvbi4KKyAqCisgKiBNYXJ0aW4gUG9vbCAobWJwQHNhbWJhLm9yZykgTWF5IDIwMDMKKyAqICAgIFB1dCBpbiBhIHByb3RvdHlwZSBmb3IgZHVtbXlfc25wcmludGYoKSB0byBxdWlldCBjb21waWxlciB3YXJuaW5ncy4KKyAqCisgKiAgICBNb3ZlICNlbmRpZiB0byBtYWtlIHN1cmUgVkFfQ09QWSwgTERPVUJMRSwgZXRjIGFyZSBkZWZpbmVkIGV2ZW4KKyAqICAgIGlmIHRoZSBDIGxpYnJhcnkgaGFzIHNvbWUgc25wcmludGYgZnVuY3Rpb25zIGFscmVhZHkuCisgKgorICogRGFtaWVuIE1pbGxlciAoZGptQG1pbmRyb3Qub3JnKSBKYW4gMjAwNworICogICAgRml4IGludGVnZXIgb3ZlcmZsb3dzIGluIHJldHVybiB2YWx1ZS4KKyAqICAgIE1ha2UgZm9ybWF0dGluZyBxdWl0ZSBhIGJpdCBmYXN0ZXIgYnkgaW5saW5pbmcgZG9wcl9vdXRjaCgpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2lmIGRlZmluZWQoQlJPS0VOX1NOUFJJTlRGKQkJLyogRm9yIHRob3NlIHdpdGggYnJva2VuIHNucHJpbnRmKCkgKi8KKyMgdW5kZWYgSEFWRV9TTlBSSU5URgorIyB1bmRlZiBIQVZFX1ZTTlBSSU5URgorI2VuZGlmCisKKyNpZm5kZWYgVkFfQ09QWQorIyBpZmRlZiBIQVZFX1ZBX0NPUFkKKyMgIGRlZmluZSBWQV9DT1BZKGRlc3QsIHNyYykgdmFfY29weShkZXN0LCBzcmMpCisjIGVsc2UKKyMgIGlmZGVmIEhBVkVfX19WQV9DT1BZCisjICAgZGVmaW5lIFZBX0NPUFkoZGVzdCwgc3JjKSBfX3ZhX2NvcHkoZGVzdCwgc3JjKQorIyAgZWxzZQorIyAgIGRlZmluZSBWQV9DT1BZKGRlc3QsIHNyYykgKGRlc3QpID0gKHNyYykKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEhBVkVfU05QUklOVEYpIHx8ICFkZWZpbmVkKEhBVkVfVlNOUFJJTlRGKQorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaWZkZWYgSEFWRV9MT05HX0RPVUJMRQorIyBkZWZpbmUgTERPVUJMRSBsb25nIGRvdWJsZQorI2Vsc2UKKyMgZGVmaW5lIExET1VCTEUgZG91YmxlCisjZW5kaWYKKworI2lmZGVmIEhBVkVfTE9OR19MT05HCisjIGRlZmluZSBMTE9ORyBsb25nIGxvbmcKKyNlbHNlCisjIGRlZmluZSBMTE9ORyBsb25nCisjZW5kaWYKKworLyoKKyAqIGRvcHIoKTogcG9vciBtYW4ncyB2ZXJzaW9uIG9mIGRvcHJpbnRmCisgKi8KKworLyogZm9ybWF0IHJlYWQgc3RhdGVzICovCisjZGVmaW5lIERQX1NfREVGQVVMVCAwCisjZGVmaW5lIERQX1NfRkxBR1MgICAxCisjZGVmaW5lIERQX1NfTUlOICAgICAyCisjZGVmaW5lIERQX1NfRE9UICAgICAzCisjZGVmaW5lIERQX1NfTUFYICAgICA0CisjZGVmaW5lIERQX1NfTU9EICAgICA1CisjZGVmaW5lIERQX1NfQ09OViAgICA2CisjZGVmaW5lIERQX1NfRE9ORSAgICA3CisKKy8qIGZvcm1hdCBmbGFncyAtIEJpdHMgKi8KKyNkZWZpbmUgRFBfRl9NSU5VUyAJKDEgPDwgMCkKKyNkZWZpbmUgRFBfRl9QTFVTICAJKDEgPDwgMSkKKyNkZWZpbmUgRFBfRl9TUEFDRSAJKDEgPDwgMikKKyNkZWZpbmUgRFBfRl9OVU0gICAJKDEgPDwgMykKKyNkZWZpbmUgRFBfRl9aRVJPICAJKDEgPDwgNCkKKyNkZWZpbmUgRFBfRl9VUCAgICAJKDEgPDwgNSkKKyNkZWZpbmUgRFBfRl9VTlNJR05FRCAJKDEgPDwgNikKKworLyogQ29udmVyc2lvbiBGbGFncyAqLworI2RlZmluZSBEUF9DX1NIT1JUICAgMQorI2RlZmluZSBEUF9DX0xPTkcgICAgMgorI2RlZmluZSBEUF9DX0xET1VCTEUgMworI2RlZmluZSBEUF9DX0xMT05HICAgNAorCisjZGVmaW5lIGNoYXJfdG9faW50KHApICgocCktICcwJykKKyNpZm5kZWYgTUFYCisjIGRlZmluZSBNQVgocCxxKSAoKChwKSA+PSAocSkpID8gKHApIDogKHEpKQorI2VuZGlmCisKKyNkZWZpbmUgRE9QUl9PVVRDSChidWYsIHBvcywgYnVmbGVuLCB0aGVjaGFyKSBcCisJZG8geyBcCisJCWlmIChwb3MgKyAxID49IElOVF9NQVgpIHsgXAorCQkJZXJybm8gPSBFUkFOR0U7IFwKKwkJCXJldHVybiAtMTsgXAorCQl9IFwKKwkJaWYgKHBvcyA8IGJ1ZmxlbikgXAorCQkJYnVmW3Bvc10gPSB0aGVjaGFyOyBcCisJCShwb3MpKys7IFwKKwl9IHdoaWxlICgwKQorCitzdGF0aWMgaW50IGRvcHIoY2hhciAqYnVmZmVyLCBzaXplX3QgbWF4bGVuLCBjb25zdCBjaGFyICpmb3JtYXQsIAorICAgIHZhX2xpc3QgYXJnc19pbik7CitzdGF0aWMgaW50IGZtdHN0cihjaGFyICpidWZmZXIsIHNpemVfdCAqY3Vycmxlbiwgc2l6ZV90IG1heGxlbiwKKyAgICBjaGFyICp2YWx1ZSwgaW50IGZsYWdzLCBpbnQgbWluLCBpbnQgbWF4KTsKK3N0YXRpYyBpbnQgZm10aW50KGNoYXIgKmJ1ZmZlciwgc2l6ZV90ICpjdXJybGVuLCBzaXplX3QgbWF4bGVuLAorICAgIExMT05HIHZhbHVlLCBpbnQgYmFzZSwgaW50IG1pbiwgaW50IG1heCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgZm10ZnAoY2hhciAqYnVmZmVyLCBzaXplX3QgKmN1cnJsZW4sIHNpemVfdCBtYXhsZW4sCisgICAgTERPVUJMRSBmdmFsdWUsIGludCBtaW4sIGludCBtYXgsIGludCBmbGFncyk7CisKK3N0YXRpYyBpbnQKK2RvcHIoY2hhciAqYnVmZmVyLCBzaXplX3QgbWF4bGVuLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJnc19pbikKK3sKKwljaGFyIGNoOworCUxMT05HIHZhbHVlOworCUxET1VCTEUgZnZhbHVlOworCWNoYXIgKnN0cnZhbHVlOworCWludCBtaW47CisJaW50IG1heDsKKwlpbnQgc3RhdGU7CisJaW50IGZsYWdzOworCWludCBjZmxhZ3M7CisJc2l6ZV90IGN1cnJsZW47CisJdmFfbGlzdCBhcmdzOworCisJVkFfQ09QWShhcmdzLCBhcmdzX2luKTsKKwkKKwlzdGF0ZSA9IERQX1NfREVGQVVMVDsKKwljdXJybGVuID0gZmxhZ3MgPSBjZmxhZ3MgPSBtaW4gPSAwOworCW1heCA9IC0xOworCWNoID0gKmZvcm1hdCsrOworCQorCXdoaWxlIChzdGF0ZSAhPSBEUF9TX0RPTkUpIHsKKwkJaWYgKGNoID09ICdcMCcpIAorCQkJc3RhdGUgPSBEUF9TX0RPTkU7CisKKwkJc3dpdGNoKHN0YXRlKSB7CisJCWNhc2UgRFBfU19ERUZBVUxUOgorCQkJaWYgKGNoID09ICclJykgCisJCQkJc3RhdGUgPSBEUF9TX0ZMQUdTOworCQkJZWxzZQorCQkJCURPUFJfT1VUQ0goYnVmZmVyLCBjdXJybGVuLCBtYXhsZW4sIGNoKTsKKwkJCWNoID0gKmZvcm1hdCsrOworCQkJYnJlYWs7CisJCWNhc2UgRFBfU19GTEFHUzoKKwkJCXN3aXRjaCAoY2gpIHsKKwkJCWNhc2UgJy0nOgorCQkJCWZsYWdzIHw9IERQX0ZfTUlOVVM7CisJCQkJY2ggPSAqZm9ybWF0Kys7CisJCQkJYnJlYWs7CisJCQljYXNlICcrJzoKKwkJCQlmbGFncyB8PSBEUF9GX1BMVVM7CisJCQkJY2ggPSAqZm9ybWF0Kys7CisJCQkJYnJlYWs7CisJCQljYXNlICcgJzoKKwkJCQlmbGFncyB8PSBEUF9GX1NQQUNFOworCQkJCWNoID0gKmZvcm1hdCsrOworCQkJCWJyZWFrOworCQkJY2FzZSAnIyc6CisJCQkJZmxhZ3MgfD0gRFBfRl9OVU07CisJCQkJY2ggPSAqZm9ybWF0Kys7CisJCQkJYnJlYWs7CisJCQljYXNlICcwJzoKKwkJCQlmbGFncyB8PSBEUF9GX1pFUk87CisJCQkJY2ggPSAqZm9ybWF0Kys7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXN0YXRlID0gRFBfU19NSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBEUF9TX01JTjoKKwkJCWlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKWNoKSkgeworCQkJCW1pbiA9IDEwKm1pbiArIGNoYXJfdG9faW50IChjaCk7CisJCQkJY2ggPSAqZm9ybWF0Kys7CisJCQl9IGVsc2UgaWYgKGNoID09ICcqJykgeworCQkJCW1pbiA9IHZhX2FyZyAoYXJncywgaW50KTsKKwkJCQljaCA9ICpmb3JtYXQrKzsKKwkJCQlzdGF0ZSA9IERQX1NfRE9UOworCQkJfSBlbHNlIHsKKwkJCQlzdGF0ZSA9IERQX1NfRE9UOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRFBfU19ET1Q6CisJCQlpZiAoY2ggPT0gJy4nKSB7CisJCQkJc3RhdGUgPSBEUF9TX01BWDsKKwkJCQljaCA9ICpmb3JtYXQrKzsKKwkJCX0gZWxzZSB7IAorCQkJCXN0YXRlID0gRFBfU19NT0Q7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBEUF9TX01BWDoKKwkJCWlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKWNoKSkgeworCQkJCWlmIChtYXggPCAwKQorCQkJCQltYXggPSAwOworCQkJCW1heCA9IDEwKm1heCArIGNoYXJfdG9faW50IChjaCk7CisJCQkJY2ggPSAqZm9ybWF0Kys7CisJCQl9IGVsc2UgaWYgKGNoID09ICcqJykgeworCQkJCW1heCA9IHZhX2FyZyAoYXJncywgaW50KTsKKwkJCQljaCA9ICpmb3JtYXQrKzsKKwkJCQlzdGF0ZSA9IERQX1NfTU9EOworCQkJfSBlbHNlIHsKKwkJCQlzdGF0ZSA9IERQX1NfTU9EOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRFBfU19NT0Q6CisJCQlzd2l0Y2ggKGNoKSB7CisJCQljYXNlICdoJzoKKwkJCQljZmxhZ3MgPSBEUF9DX1NIT1JUOworCQkJCWNoID0gKmZvcm1hdCsrOworCQkJCWJyZWFrOworCQkJY2FzZSAnbCc6CisJCQkJY2ZsYWdzID0gRFBfQ19MT05HOworCQkJCWNoID0gKmZvcm1hdCsrOworCQkJCWlmIChjaCA9PSAnbCcpIHsJLyogSXQncyBhIGxvbmcgbG9uZyAqLworCQkJCQljZmxhZ3MgPSBEUF9DX0xMT05HOworCQkJCQljaCA9ICpmb3JtYXQrKzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICdMJzoKKwkJCQljZmxhZ3MgPSBEUF9DX0xET1VCTEU7CisJCQkJY2ggPSAqZm9ybWF0Kys7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJc3RhdGUgPSBEUF9TX0NPTlY7CisJCQlicmVhazsKKwkJY2FzZSBEUF9TX0NPTlY6CisJCQlzd2l0Y2ggKGNoKSB7CisJCQljYXNlICdkJzoKKwkJCWNhc2UgJ2knOgorCQkJCWlmIChjZmxhZ3MgPT0gRFBfQ19TSE9SVCkgCisJCQkJCXZhbHVlID0gdmFfYXJnIChhcmdzLCBpbnQpOworCQkJCWVsc2UgaWYgKGNmbGFncyA9PSBEUF9DX0xPTkcpCisJCQkJCXZhbHVlID0gdmFfYXJnIChhcmdzLCBsb25nIGludCk7CisJCQkJZWxzZSBpZiAoY2ZsYWdzID09IERQX0NfTExPTkcpCisJCQkJCXZhbHVlID0gdmFfYXJnIChhcmdzLCBMTE9ORyk7CisJCQkJZWxzZQorCQkJCQl2YWx1ZSA9IHZhX2FyZyAoYXJncywgaW50KTsKKwkJCQlpZiAoZm10aW50KGJ1ZmZlciwgJmN1cnJsZW4sIG1heGxlbiwKKwkJCQkgICAgdmFsdWUsIDEwLCBtaW4sIG1heCwgZmxhZ3MpID09IC0xKQorCQkJCQlyZXR1cm4gLTE7CisJCQkJYnJlYWs7CisJCQljYXNlICdvJzoKKwkJCQlmbGFncyB8PSBEUF9GX1VOU0lHTkVEOworCQkJCWlmIChjZmxhZ3MgPT0gRFBfQ19TSE9SVCkKKwkJCQkJdmFsdWUgPSB2YV9hcmcgKGFyZ3MsIHVuc2lnbmVkIGludCk7CisJCQkJZWxzZSBpZiAoY2ZsYWdzID09IERQX0NfTE9ORykKKwkJCQkJdmFsdWUgPSAobG9uZyl2YV9hcmcgKGFyZ3MsIHVuc2lnbmVkIGxvbmcgaW50KTsKKwkJCQllbHNlIGlmIChjZmxhZ3MgPT0gRFBfQ19MTE9ORykKKwkJCQkJdmFsdWUgPSAobG9uZyl2YV9hcmcgKGFyZ3MsIHVuc2lnbmVkIExMT05HKTsKKwkJCQllbHNlCisJCQkJCXZhbHVlID0gKGxvbmcpdmFfYXJnIChhcmdzLCB1bnNpZ25lZCBpbnQpOworCQkJCWlmIChmbXRpbnQoYnVmZmVyLCAmY3VycmxlbiwgbWF4bGVuLCB2YWx1ZSwKKwkJCQkgICAgOCwgbWluLCBtYXgsIGZsYWdzKSA9PSAtMSkKKwkJCQkJcmV0dXJuIC0xOworCQkJCWJyZWFrOworCQkJY2FzZSAndSc6CisJCQkJZmxhZ3MgfD0gRFBfRl9VTlNJR05FRDsKKwkJCQlpZiAoY2ZsYWdzID09IERQX0NfU0hPUlQpCisJCQkJCXZhbHVlID0gdmFfYXJnIChhcmdzLCB1bnNpZ25lZCBpbnQpOworCQkJCWVsc2UgaWYgKGNmbGFncyA9PSBEUF9DX0xPTkcpCisJCQkJCXZhbHVlID0gKGxvbmcpdmFfYXJnIChhcmdzLCB1bnNpZ25lZCBsb25nIGludCk7CisJCQkJZWxzZSBpZiAoY2ZsYWdzID09IERQX0NfTExPTkcpCisJCQkJCXZhbHVlID0gKExMT05HKXZhX2FyZyAoYXJncywgdW5zaWduZWQgTExPTkcpOworCQkJCWVsc2UKKwkJCQkJdmFsdWUgPSAobG9uZyl2YV9hcmcgKGFyZ3MsIHVuc2lnbmVkIGludCk7CisJCQkJaWYgKGZtdGludChidWZmZXIsICZjdXJybGVuLCBtYXhsZW4sIHZhbHVlLAorCQkJCSAgICAxMCwgbWluLCBtYXgsIGZsYWdzKSA9PSAtMSkKKwkJCQkJcmV0dXJuIC0xOworCQkJCWJyZWFrOworCQkJY2FzZSAnWCc6CisJCQkJZmxhZ3MgfD0gRFBfRl9VUDsKKwkJCWNhc2UgJ3gnOgorCQkJCWZsYWdzIHw9IERQX0ZfVU5TSUdORUQ7CisJCQkJaWYgKGNmbGFncyA9PSBEUF9DX1NIT1JUKQorCQkJCQl2YWx1ZSA9IHZhX2FyZyAoYXJncywgdW5zaWduZWQgaW50KTsKKwkJCQllbHNlIGlmIChjZmxhZ3MgPT0gRFBfQ19MT05HKQorCQkJCQl2YWx1ZSA9IChsb25nKXZhX2FyZyAoYXJncywgdW5zaWduZWQgbG9uZyBpbnQpOworCQkJCWVsc2UgaWYgKGNmbGFncyA9PSBEUF9DX0xMT05HKQorCQkJCQl2YWx1ZSA9IChMTE9ORyl2YV9hcmcgKGFyZ3MsIHVuc2lnbmVkIExMT05HKTsKKwkJCQllbHNlCisJCQkJCXZhbHVlID0gKGxvbmcpdmFfYXJnIChhcmdzLCB1bnNpZ25lZCBpbnQpOworCQkJCWlmIChmbXRpbnQoYnVmZmVyLCAmY3VycmxlbiwgbWF4bGVuLCB2YWx1ZSwKKwkJCQkgICAgMTYsIG1pbiwgbWF4LCBmbGFncykgPT0gLTEpCisJCQkJCXJldHVybiAtMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2YnOgorCQkJCWlmIChjZmxhZ3MgPT0gRFBfQ19MRE9VQkxFKQorCQkJCQlmdmFsdWUgPSB2YV9hcmcgKGFyZ3MsIExET1VCTEUpOworCQkJCWVsc2UKKwkJCQkJZnZhbHVlID0gdmFfYXJnIChhcmdzLCBkb3VibGUpOworCQkJCWlmIChmbXRmcChidWZmZXIsICZjdXJybGVuLCBtYXhsZW4sIGZ2YWx1ZSwKKwkJCQkgICAgbWluLCBtYXgsIGZsYWdzKSA9PSAtMSkKKwkJCQkJcmV0dXJuIC0xOworCQkJCWJyZWFrOworCQkJY2FzZSAnRSc6CisJCQkJZmxhZ3MgfD0gRFBfRl9VUDsKKwkJCWNhc2UgJ2UnOgorCQkJCWlmIChjZmxhZ3MgPT0gRFBfQ19MRE9VQkxFKQorCQkJCQlmdmFsdWUgPSB2YV9hcmcgKGFyZ3MsIExET1VCTEUpOworCQkJCWVsc2UKKwkJCQkJZnZhbHVlID0gdmFfYXJnIChhcmdzLCBkb3VibGUpOworCQkJCWlmIChmbXRmcChidWZmZXIsICZjdXJybGVuLCBtYXhsZW4sIGZ2YWx1ZSwKKwkJCQkgICAgbWluLCBtYXgsIGZsYWdzKSA9PSAtMSkKKwkJCQkJcmV0dXJuIC0xOworCQkJCWJyZWFrOworCQkJY2FzZSAnRyc6CisJCQkJZmxhZ3MgfD0gRFBfRl9VUDsKKwkJCWNhc2UgJ2cnOgorCQkJCWlmIChjZmxhZ3MgPT0gRFBfQ19MRE9VQkxFKQorCQkJCQlmdmFsdWUgPSB2YV9hcmcgKGFyZ3MsIExET1VCTEUpOworCQkJCWVsc2UKKwkJCQkJZnZhbHVlID0gdmFfYXJnIChhcmdzLCBkb3VibGUpOworCQkJCWlmIChmbXRmcChidWZmZXIsICZjdXJybGVuLCBtYXhsZW4sIGZ2YWx1ZSwKKwkJCQkgICAgbWluLCBtYXgsIGZsYWdzKSA9PSAtMSkKKwkJCQkJcmV0dXJuIC0xOworCQkJCWJyZWFrOworCQkJY2FzZSAnYyc6CisJCQkJRE9QUl9PVVRDSChidWZmZXIsIGN1cnJsZW4sIG1heGxlbiwKKwkJCQkgICAgdmFfYXJnIChhcmdzLCBpbnQpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3MnOgorCQkJCXN0cnZhbHVlID0gdmFfYXJnIChhcmdzLCBjaGFyICopOworCQkJCWlmICghc3RydmFsdWUpIHN0cnZhbHVlID0gIihOVUxMKSI7CisJCQkJaWYgKG1heCA9PSAtMSkgeworCQkJCQltYXggPSBzdHJsZW4oc3RydmFsdWUpOworCQkJCX0KKwkJCQlpZiAobWluID4gMCAmJiBtYXggPj0gMCAmJiBtaW4gPiBtYXgpIG1heCA9IG1pbjsKKwkJCQlpZiAoZm10c3RyKGJ1ZmZlciwgJmN1cnJsZW4sIG1heGxlbiwKKwkJCQkgICAgc3RydmFsdWUsIGZsYWdzLCBtaW4sIG1heCkgPT0gLTEpCisJCQkJCXJldHVybiAtMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3AnOgorCQkJCXN0cnZhbHVlID0gdmFfYXJnIChhcmdzLCB2b2lkICopOworCQkJCWlmIChmbXRpbnQoYnVmZmVyLCAmY3VycmxlbiwgbWF4bGVuLAorCQkJCSAgICAobG9uZykgc3RydmFsdWUsIDE2LCBtaW4sIG1heCwgZmxhZ3MpID09IC0xKQorCQkJCQlyZXR1cm4gLTE7CisJCQkJYnJlYWs7CisJCQljYXNlICduJzoKKwkJCQlpZiAoY2ZsYWdzID09IERQX0NfU0hPUlQpIHsKKwkJCQkJc2hvcnQgaW50ICpudW07CisJCQkJCW51bSA9IHZhX2FyZyAoYXJncywgc2hvcnQgaW50ICopOworCQkJCQkqbnVtID0gY3VycmxlbjsKKwkJCQl9IGVsc2UgaWYgKGNmbGFncyA9PSBEUF9DX0xPTkcpIHsKKwkJCQkJbG9uZyBpbnQgKm51bTsKKwkJCQkJbnVtID0gdmFfYXJnIChhcmdzLCBsb25nIGludCAqKTsKKwkJCQkJKm51bSA9IChsb25nIGludCljdXJybGVuOworCQkJCX0gZWxzZSBpZiAoY2ZsYWdzID09IERQX0NfTExPTkcpIHsKKwkJCQkJTExPTkcgKm51bTsKKwkJCQkJbnVtID0gdmFfYXJnIChhcmdzLCBMTE9ORyAqKTsKKwkJCQkJKm51bSA9IChMTE9ORyljdXJybGVuOworCQkJCX0gZWxzZSB7CisJCQkJCWludCAqbnVtOworCQkJCQludW0gPSB2YV9hcmcgKGFyZ3MsIGludCAqKTsKKwkJCQkJKm51bSA9IGN1cnJsZW47CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAnJSc6CisJCQkJRE9QUl9PVVRDSChidWZmZXIsIGN1cnJsZW4sIG1heGxlbiwgY2gpOworCQkJCWJyZWFrOworCQkJY2FzZSAndyc6CisJCQkJLyogbm90IHN1cHBvcnRlZCB5ZXQsIHRyZWF0IGFzIG5leHQgY2hhciAqLworCQkJCWNoID0gKmZvcm1hdCsrOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvKiBVbmtub3duLCBza2lwICovCisJCQkJYnJlYWs7CisJCQl9CisJCQljaCA9ICpmb3JtYXQrKzsKKwkJCXN0YXRlID0gRFBfU19ERUZBVUxUOworCQkJZmxhZ3MgPSBjZmxhZ3MgPSBtaW4gPSAwOworCQkJbWF4ID0gLTE7CisJCQlicmVhazsKKwkJY2FzZSBEUF9TX0RPTkU6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIGhtbT8gKi8KKwkJCWJyZWFrOyAvKiBzb21lIHBpY2t5IGNvbXBpbGVycyBuZWVkIHRoaXMgKi8KKwkJfQorCX0KKwlpZiAobWF4bGVuICE9IDApIHsKKwkJaWYgKGN1cnJsZW4gPCBtYXhsZW4gLSAxKSAKKwkJCWJ1ZmZlcltjdXJybGVuXSA9ICdcMCc7CisJCWVsc2UgaWYgKG1heGxlbiA+IDApIAorCQkJYnVmZmVyW21heGxlbiAtIDFdID0gJ1wwJzsKKwl9CisJCisJcmV0dXJuIGN1cnJsZW4gPCBJTlRfTUFYID8gKGludCljdXJybGVuIDogLTE7Cit9CisKK3N0YXRpYyBpbnQKK2ZtdHN0cihjaGFyICpidWZmZXIsIHNpemVfdCAqY3Vycmxlbiwgc2l6ZV90IG1heGxlbiwKKyAgICBjaGFyICp2YWx1ZSwgaW50IGZsYWdzLCBpbnQgbWluLCBpbnQgbWF4KQoreworCWludCBwYWRsZW4sIHN0cmxuOyAgICAgLyogYW1vdW50IHRvIHBhZCAqLworCWludCBjbnQgPSAwOworCisjaWZkZWYgREVCVUdfU05QUklOVEYKKwlwcmludGYoImZtdHN0ciBtaW49JWQgbWF4PSVkIHM9WyVzXVxuIiwgbWluLCBtYXgsIHZhbHVlKTsKKyNlbmRpZgorCWlmICh2YWx1ZSA9PSAwKSB7CisJCXZhbHVlID0gIjxOVUxMPiI7CisJfQorCisJZm9yIChzdHJsbiA9IDA7IHN0cmxuIDwgbWF4ICYmIHZhbHVlW3N0cmxuXTsgKytzdHJsbik7IC8qIHN0cmxlbiAqLworCXBhZGxlbiA9IG1pbiAtIHN0cmxuOworCWlmIChwYWRsZW4gPCAwKSAKKwkJcGFkbGVuID0gMDsKKwlpZiAoZmxhZ3MgJiBEUF9GX01JTlVTKSAKKwkJcGFkbGVuID0gLXBhZGxlbjsgLyogTGVmdCBKdXN0aWZ5ICovCisJCisJd2hpbGUgKChwYWRsZW4gPiAwKSAmJiAoY250IDwgbWF4KSkgeworCQlET1BSX09VVENIKGJ1ZmZlciwgKmN1cnJsZW4sIG1heGxlbiwgJyAnKTsKKwkJLS1wYWRsZW47CisJCSsrY250OworCX0KKwl3aGlsZSAoKnZhbHVlICYmIChjbnQgPCBtYXgpKSB7CisJCURPUFJfT1VUQ0goYnVmZmVyLCAqY3VycmxlbiwgbWF4bGVuLCAqdmFsdWUpOworCQkqdmFsdWUrKzsKKwkJKytjbnQ7CisJfQorCXdoaWxlICgocGFkbGVuIDwgMCkgJiYgKGNudCA8IG1heCkpIHsKKwkJRE9QUl9PVVRDSChidWZmZXIsICpjdXJybGVuLCBtYXhsZW4sICcgJyk7CisJCSsrcGFkbGVuOworCQkrK2NudDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIEhhdmUgdG8gaGFuZGxlIERQX0ZfTlVNIChpZSAweCBhbmQgMCBhbHRlcm5hdGVzKSAqLworCitzdGF0aWMgaW50CitmbXRpbnQoY2hhciAqYnVmZmVyLCBzaXplX3QgKmN1cnJsZW4sIHNpemVfdCBtYXhsZW4sCisJCSAgICBMTE9ORyB2YWx1ZSwgaW50IGJhc2UsIGludCBtaW4sIGludCBtYXgsIGludCBmbGFncykKK3sKKwlpbnQgc2lnbnZhbHVlID0gMDsKKwl1bnNpZ25lZCBMTE9ORyB1dmFsdWU7CisJY2hhciBjb252ZXJ0WzIwXTsKKwlpbnQgcGxhY2UgPSAwOworCWludCBzcGFkbGVuID0gMDsgLyogYW1vdW50IHRvIHNwYWNlIHBhZCAqLworCWludCB6cGFkbGVuID0gMDsgLyogYW1vdW50IHRvIHplcm8gcGFkICovCisJaW50IGNhcHMgPSAwOworCQorCWlmIChtYXggPCAwKQorCQltYXggPSAwOworCQorCXV2YWx1ZSA9IHZhbHVlOworCQorCWlmKCEoZmxhZ3MgJiBEUF9GX1VOU0lHTkVEKSkgeworCQlpZiggdmFsdWUgPCAwICkgeworCQkJc2lnbnZhbHVlID0gJy0nOworCQkJdXZhbHVlID0gLXZhbHVlOworCQl9IGVsc2UgeworCQkJaWYgKGZsYWdzICYgRFBfRl9QTFVTKSAgLyogRG8gYSBzaWduICgrL2kpICovCisJCQkJc2lnbnZhbHVlID0gJysnOworCQkJZWxzZSBpZiAoZmxhZ3MgJiBEUF9GX1NQQUNFKQorCQkJCXNpZ252YWx1ZSA9ICcgJzsKKwkJfQorCX0KKyAgCisJaWYgKGZsYWdzICYgRFBfRl9VUCkgY2FwcyA9IDE7IC8qIFNob3VsZCBjaGFyYWN0ZXJzIGJlIHVwcGVyIGNhc2U/ICovCisKKwlkbyB7CisJCWNvbnZlcnRbcGxhY2UrK10gPQorCQkJKGNhcHM/ICIwMTIzNDU2Nzg5QUJDREVGIjoiMDEyMzQ1Njc4OWFiY2RlZiIpCisJCQlbdXZhbHVlICUgKHVuc2lnbmVkKWJhc2UgIF07CisJCXV2YWx1ZSA9ICh1dmFsdWUgLyAodW5zaWduZWQpYmFzZSApOworCX0gd2hpbGUodXZhbHVlICYmIChwbGFjZSA8IDIwKSk7CisJaWYgKHBsYWNlID09IDIwKSBwbGFjZS0tOworCWNvbnZlcnRbcGxhY2VdID0gMDsKKworCXpwYWRsZW4gPSBtYXggLSBwbGFjZTsKKwlzcGFkbGVuID0gbWluIC0gTUFYIChtYXgsIHBsYWNlKSAtIChzaWdudmFsdWUgPyAxIDogMCk7CisJaWYgKHpwYWRsZW4gPCAwKSB6cGFkbGVuID0gMDsKKwlpZiAoc3BhZGxlbiA8IDApIHNwYWRsZW4gPSAwOworCWlmIChmbGFncyAmIERQX0ZfWkVSTykgeworCQl6cGFkbGVuID0gTUFYKHpwYWRsZW4sIHNwYWRsZW4pOworCQlzcGFkbGVuID0gMDsKKwl9CisJaWYgKGZsYWdzICYgRFBfRl9NSU5VUykgCisJCXNwYWRsZW4gPSAtc3BhZGxlbjsgLyogTGVmdCBKdXN0aWZ0eSAqLworCisjaWZkZWYgREVCVUdfU05QUklOVEYKKwlwcmludGYoInpwYWQ6ICVkLCBzcGFkOiAlZCwgbWluOiAlZCwgbWF4OiAlZCwgcGxhY2U6ICVkXG4iLAorCSAgICAgICB6cGFkbGVuLCBzcGFkbGVuLCBtaW4sIG1heCwgcGxhY2UpOworI2VuZGlmCisKKwkvKiBTcGFjZXMgKi8KKwl3aGlsZSAoc3BhZGxlbiA+IDApIHsKKwkJRE9QUl9PVVRDSChidWZmZXIsICpjdXJybGVuLCBtYXhsZW4sICcgJyk7CisJCS0tc3BhZGxlbjsKKwl9CisKKwkvKiBTaWduICovCisJaWYgKHNpZ252YWx1ZSkgCisJCURPUFJfT1VUQ0goYnVmZmVyLCAqY3VycmxlbiwgbWF4bGVuLCBzaWdudmFsdWUpOworCisJLyogWmVyb3MgKi8KKwlpZiAoenBhZGxlbiA+IDApIHsKKwkJd2hpbGUgKHpwYWRsZW4gPiAwKSB7CisJCQlET1BSX09VVENIKGJ1ZmZlciwgKmN1cnJsZW4sIG1heGxlbiwgJzAnKTsKKwkJCS0tenBhZGxlbjsKKwkJfQorCX0KKworCS8qIERpZ2l0cyAqLworCXdoaWxlIChwbGFjZSA+IDApIHsKKwkJLS1wbGFjZTsKKwkJRE9QUl9PVVRDSChidWZmZXIsICpjdXJybGVuLCBtYXhsZW4sIGNvbnZlcnRbcGxhY2VdKTsKKwl9CisgIAorCS8qIExlZnQgSnVzdGlmaWVkIHNwYWNlcyAqLworCXdoaWxlIChzcGFkbGVuIDwgMCkgeworCQlET1BSX09VVENIKGJ1ZmZlciwgKmN1cnJsZW4sIG1heGxlbiwgJyAnKTsKKwkJKytzcGFkbGVuOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIExET1VCTEUgYWJzX3ZhbChMRE9VQkxFIHZhbHVlKQoreworCUxET1VCTEUgcmVzdWx0ID0gdmFsdWU7CisKKwlpZiAodmFsdWUgPCAwKQorCQlyZXN1bHQgPSAtdmFsdWU7CisJCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIExET1VCTEUgUE9XMTAoaW50IHZhbCkKK3sKKwlMRE9VQkxFIHJlc3VsdCA9IDE7CisJCisJd2hpbGUgKHZhbCkgeworCQlyZXN1bHQgKj0gMTA7CisJCXZhbC0tOworCX0KKyAgCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIExMT05HIFJPVU5EKExET1VCTEUgdmFsdWUpCit7CisJTExPTkcgaW50cGFydDsKKworCWludHBhcnQgPSAoTExPTkcpdmFsdWU7CisJdmFsdWUgPSB2YWx1ZSAtIGludHBhcnQ7CisJaWYgKHZhbHVlID49IDAuNSkgaW50cGFydCsrOworCQorCXJldHVybiBpbnRwYXJ0OworfQorCisvKiBhIHJlcGxhY2VtZW50IGZvciBtb2RmIHRoYXQgZG9lc24ndCBuZWVkIHRoZSBtYXRoIGxpYnJhcnkuIFNob3VsZAorICAgYmUgcG9ydGFibGUsIGJ1dCBzbG93ICovCitzdGF0aWMgZG91YmxlIG15X21vZGYoZG91YmxlIHgwLCBkb3VibGUgKmlwdHIpCit7CisJaW50IGk7CisJbG9uZyBsOworCWRvdWJsZSB4ID0geDA7CisJZG91YmxlIGYgPSAxLjA7CisKKwlmb3IgKGk9MDtpPDEwMDtpKyspIHsKKwkJbCA9IChsb25nKXg7CisJCWlmIChsIDw9ICh4KzEpICYmIGwgPj0gKHgtMSkpIGJyZWFrOworCQl4ICo9IDAuMTsKKwkJZiAqPSAxMC4wOworCX0KKworCWlmIChpID09IDEwMCkgeworCQkvKgorCQkgKiB5aWtlcyEgdGhlIG51bWJlciBpcyBiZXlvbmQgd2hhdCB3ZSBjYW4gaGFuZGxlLgorCQkgKiBXaGF0IGRvIHdlIGRvPworCQkgKi8KKwkJKCppcHRyKSA9IDA7CisJCXJldHVybiAwOworCX0KKworCWlmIChpICE9IDApIHsKKwkJZG91YmxlIGkyOworCQlkb3VibGUgcmV0OworCisJCXJldCA9IG15X21vZGYoeDAtbCpmLCAmaTIpOworCQkoKmlwdHIpID0gbCpmICsgaTI7CisJCXJldHVybiByZXQ7CisJfSAKKworCSgqaXB0cikgPSBsOworCXJldHVybiB4IC0gKCppcHRyKTsKK30KKworCitzdGF0aWMgaW50CitmbXRmcCAoY2hhciAqYnVmZmVyLCBzaXplX3QgKmN1cnJsZW4sIHNpemVfdCBtYXhsZW4sCisgICAgTERPVUJMRSBmdmFsdWUsIGludCBtaW4sIGludCBtYXgsIGludCBmbGFncykKK3sKKwlpbnQgc2lnbnZhbHVlID0gMDsKKwlkb3VibGUgdWZ2YWx1ZTsKKwljaGFyIGljb252ZXJ0WzMxMV07CisJY2hhciBmY29udmVydFszMTFdOworCWludCBpcGxhY2UgPSAwOworCWludCBmcGxhY2UgPSAwOworCWludCBwYWRsZW4gPSAwOyAvKiBhbW91bnQgdG8gcGFkICovCisJaW50IHpwYWRsZW4gPSAwOyAKKwlpbnQgY2FwcyA9IDA7CisJaW50IGlkeDsKKwlkb3VibGUgaW50cGFydDsKKwlkb3VibGUgZnJhY3BhcnQ7CisJZG91YmxlIHRlbXA7CisgIAorCS8qIAorCSAqIEFJWCBtYW5wYWdlIHNheXMgdGhlIGRlZmF1bHQgaXMgMCwgYnV0IFNvbGFyaXMgc2F5cyB0aGUgZGVmYXVsdAorCSAqIGlzIDYsIGFuZCBzcHJpbnRmIG9uIEFJWCBkZWZhdWx0cyB0byA2CisJICovCisJaWYgKG1heCA8IDApCisJCW1heCA9IDY7CisKKwl1ZnZhbHVlID0gYWJzX3ZhbCAoZnZhbHVlKTsKKworCWlmIChmdmFsdWUgPCAwKSB7CisJCXNpZ252YWx1ZSA9ICctJzsKKwl9IGVsc2UgeworCQlpZiAoZmxhZ3MgJiBEUF9GX1BMVVMpIHsgLyogRG8gYSBzaWduICgrL2kpICovCisJCQlzaWdudmFsdWUgPSAnKyc7CisJCX0gZWxzZSB7CisJCQlpZiAoZmxhZ3MgJiBEUF9GX1NQQUNFKQorCQkJCXNpZ252YWx1ZSA9ICcgJzsKKwkJfQorCX0KKworI2lmIDAKKwlpZiAoZmxhZ3MgJiBEUF9GX1VQKSBjYXBzID0gMTsgLyogU2hvdWxkIGNoYXJhY3RlcnMgYmUgdXBwZXIgY2FzZT8gKi8KKyNlbmRpZgorCisjaWYgMAorCSBpZiAobWF4ID09IDApIHVmdmFsdWUgKz0gMC41OyAvKiBpZiBtYXggPSAwIHdlIG11c3Qgcm91bmQgKi8KKyNlbmRpZgorCisJLyogCisJICogU29ycnksIHdlIG9ubHkgc3VwcG9ydCAxNiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBiZWNhdXNlIG9mIG91ciAKKwkgKiBjb252ZXJzaW9uIG1ldGhvZAorCSAqLworCWlmIChtYXggPiAxNikKKwkJbWF4ID0gMTY7CisKKwkvKiBXZSAiY2hlYXQiIGJ5IGNvbnZlcnRpbmcgdGhlIGZyYWN0aW9uYWwgcGFydCB0byBpbnRlZ2VyIGJ5CisJICogbXVsdGlwbHlpbmcgYnkgYSBmYWN0b3Igb2YgMTAKKwkgKi8KKworCXRlbXAgPSB1ZnZhbHVlOworCW15X21vZGYodGVtcCwgJmludHBhcnQpOworCisJZnJhY3BhcnQgPSBST1VORCgoUE9XMTAobWF4KSkgKiAodWZ2YWx1ZSAtIGludHBhcnQpKTsKKwkKKwlpZiAoZnJhY3BhcnQgPj0gUE9XMTAobWF4KSkgeworCQlpbnRwYXJ0Kys7CisJCWZyYWNwYXJ0IC09IFBPVzEwKG1heCk7CisJfQorCisJLyogQ29udmVydCBpbnRlZ2VyIHBhcnQgKi8KKwlkbyB7CisJCXRlbXAgPSBpbnRwYXJ0KjAuMTsKKwkJbXlfbW9kZih0ZW1wLCAmaW50cGFydCk7CisJCWlkeCA9IChpbnQpICgodGVtcCAtaW50cGFydCArMC4wNSkqIDEwLjApOworCQkvKiBpZHggPSAoaW50KSAoKChkb3VibGUpKHRlbXAqMC4xKSAtaW50cGFydCArMC4wNSkgKjEwLjApOyAqLworCQkvKiBwcmludGYgKCIlbGxmLCAlZiwgJXhcbiIsIHRlbXAsIGludHBhcnQsIGlkeCk7ICovCisJCWljb252ZXJ0W2lwbGFjZSsrXSA9CisJCQkoY2Fwcz8gIjAxMjM0NTY3ODlBQkNERUYiOiIwMTIzNDU2Nzg5YWJjZGVmIilbaWR4XTsKKwl9IHdoaWxlIChpbnRwYXJ0ICYmIChpcGxhY2UgPCAzMTEpKTsKKwlpZiAoaXBsYWNlID09IDMxMSkgaXBsYWNlLS07CisJaWNvbnZlcnRbaXBsYWNlXSA9IDA7CisKKwkvKiBDb252ZXJ0IGZyYWN0aW9uYWwgcGFydCAqLworCWlmIChmcmFjcGFydCkKKwl7CisJCWRvIHsKKwkJCXRlbXAgPSBmcmFjcGFydCowLjE7CisJCQlteV9tb2RmKHRlbXAsICZmcmFjcGFydCk7CisJCQlpZHggPSAoaW50KSAoKHRlbXAgLWZyYWNwYXJ0ICswLjA1KSogMTAuMCk7CisJCQkvKiBpZHggPSAoaW50KSAoKCgodGVtcC8xMCkgLWZyYWNwYXJ0KSArMC4wNSkgKjEwKTsgKi8KKwkJCS8qIHByaW50ZiAoIiVsZiwgJWxmLCAlbGRcbiIsIHRlbXAsIGZyYWNwYXJ0LCBpZHggKTsgKi8KKwkJCWZjb252ZXJ0W2ZwbGFjZSsrXSA9CisJCQkoY2Fwcz8gIjAxMjM0NTY3ODlBQkNERUYiOiIwMTIzNDU2Nzg5YWJjZGVmIilbaWR4XTsKKwkJfSB3aGlsZShmcmFjcGFydCAmJiAoZnBsYWNlIDwgMzExKSk7CisJCWlmIChmcGxhY2UgPT0gMzExKSBmcGxhY2UtLTsKKwl9CisJZmNvbnZlcnRbZnBsYWNlXSA9IDA7CisgIAorCS8qIC0xIGZvciBkZWNpbWFsIHBvaW50LCBhbm90aGVyIC0xIGlmIHdlIGFyZSBwcmludGluZyBhIHNpZ24gKi8KKwlwYWRsZW4gPSBtaW4gLSBpcGxhY2UgLSBtYXggLSAxIC0gKChzaWdudmFsdWUpID8gMSA6IDApOyAKKwl6cGFkbGVuID0gbWF4IC0gZnBsYWNlOworCWlmICh6cGFkbGVuIDwgMCkgenBhZGxlbiA9IDA7CisJaWYgKHBhZGxlbiA8IDApIAorCQlwYWRsZW4gPSAwOworCWlmIChmbGFncyAmIERQX0ZfTUlOVVMpIAorCQlwYWRsZW4gPSAtcGFkbGVuOyAvKiBMZWZ0IEp1c3RpZnR5ICovCisJCisJaWYgKChmbGFncyAmIERQX0ZfWkVSTykgJiYgKHBhZGxlbiA+IDApKSB7CisJCWlmIChzaWdudmFsdWUpIHsKKwkJCURPUFJfT1VUQ0goYnVmZmVyLCAqY3VycmxlbiwgbWF4bGVuLCBzaWdudmFsdWUpOworCQkJLS1wYWRsZW47CisJCQlzaWdudmFsdWUgPSAwOworCQl9CisJCXdoaWxlIChwYWRsZW4gPiAwKSB7CisJCQlET1BSX09VVENIKGJ1ZmZlciwgKmN1cnJsZW4sIG1heGxlbiwgJzAnKTsKKwkJCS0tcGFkbGVuOworCQl9CisJfQorCXdoaWxlIChwYWRsZW4gPiAwKSB7CisJCURPUFJfT1VUQ0goYnVmZmVyLCAqY3VycmxlbiwgbWF4bGVuLCAnICcpOworCQktLXBhZGxlbjsKKwl9CisJaWYgKHNpZ252YWx1ZSkgCisJCURPUFJfT1VUQ0goYnVmZmVyLCAqY3VycmxlbiwgbWF4bGVuLCBzaWdudmFsdWUpOworCQorCXdoaWxlIChpcGxhY2UgPiAwKSB7CisJCS0taXBsYWNlOworCQlET1BSX09VVENIKGJ1ZmZlciwgKmN1cnJsZW4sIG1heGxlbiwgaWNvbnZlcnRbaXBsYWNlXSk7CisJfQorCisjaWZkZWYgREVCVUdfU05QUklOVEYKKwlwcmludGYoImZtdGZwOiBmcGxhY2U9JWQgenBhZGxlbj0lZFxuIiwgZnBsYWNlLCB6cGFkbGVuKTsKKyNlbmRpZgorCisJLyoKKwkgKiBEZWNpbWFsIHBvaW50LiAgVGhpcyBzaG91bGQgcHJvYmFibHkgdXNlIGxvY2FsZSB0byBmaW5kIHRoZSBjb3JyZWN0CisJICogY2hhciB0byBwcmludCBvdXQuCisJICovCisJaWYgKG1heCA+IDApIHsKKwkJRE9QUl9PVVRDSChidWZmZXIsICpjdXJybGVuLCBtYXhsZW4sICcuJyk7CisJCQorCQl3aGlsZSAoenBhZGxlbiA+IDApIHsKKwkJCURPUFJfT1VUQ0goYnVmZmVyLCAqY3VycmxlbiwgbWF4bGVuLCAnMCcpOworCQkJLS16cGFkbGVuOworCQl9CisKKwkJd2hpbGUgKGZwbGFjZSA+IDApIHsKKwkJCS0tZnBsYWNlOworCQkJRE9QUl9PVVRDSChidWZmZXIsICpjdXJybGVuLCBtYXhsZW4sIGZjb252ZXJ0W2ZwbGFjZV0pOworCQl9CisJfQorCisJd2hpbGUgKHBhZGxlbiA8IDApIHsKKwkJRE9QUl9PVVRDSChidWZmZXIsICpjdXJybGVuLCBtYXhsZW4sICcgJyk7CisJCSsrcGFkbGVuOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX1NOUFJJTlRGKSB8fCAhZGVmaW5lZChIQVZFX1ZTTlBSSU5URikgKi8KKworI2lmICFkZWZpbmVkKEhBVkVfVlNOUFJJTlRGKQoraW50Cit2c25wcmludGYgKGNoYXIgKnN0ciwgc2l6ZV90IGNvdW50LCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKK3sKKwlyZXR1cm4gZG9wcihzdHIsIGNvdW50LCBmbXQsIGFyZ3MpOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChIQVZFX1NOUFJJTlRGKQoraW50CitzbnByaW50ZihjaGFyICpzdHIsIHNpemVfdCBjb3VudCwgU05QUklOVEZfQ09OU1QgY2hhciAqZm10LCAuLi4pCit7CisJc2l6ZV90IHJldDsKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJcmV0ID0gdnNucHJpbnRmKHN0ciwgY291bnQsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2Qtc3RhdHZmcy5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2Qtc3RhdHZmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NGQ1YjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2JzZC1zdGF0dmZzLmMKQEAgLTAsMCArMSwzNyBAQAorLyogJElkOiBic2Qtc3RhdHZmcy5jLHYgMS4xIDIwMDgvMDYvMDggMTc6MzI6MjkgZHR1Y2tlciBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IERhcnJlbiBUdWNrZXIgPGR0dWNrZXJAemlwLmNvbS5hdT4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIE1JTkQsIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpZm5kZWYgSEFWRV9TVEFUVkZTCitpbnQgc3RhdHZmcyhjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3Qgc3RhdHZmcyAqYnVmKQoreworCWVycm5vID0gRU5PU1lTOworCXJldHVybiAtMTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfRlNUQVRWRlMKK2ludCBmc3RhdHZmcyhpbnQgZmQsIHN0cnVjdCBzdGF0dmZzICpidWYpCit7CisJZXJybm8gPSBFTk9TWVM7CisJcmV0dXJuIC0xOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2JzZC1zdGF0dmZzLmggYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2JzZC1zdGF0dmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEyMTVmZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYnNkLXN0YXR2ZnMuaApAQCAtMCwwICsxLDY4IEBACisvKiAkSWQ6IGJzZC1zdGF0dmZzLmgsdiAxLjEgMjAwOC8wNi8wOCAxNzozMjoyOSBkdHVja2VyIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggRGFycmVuIFR1Y2tlciA8ZHR1Y2tlckB6aXAuY29tLmF1PgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgTUlORCwgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpZmRlZiBIQVZFX1NZU19TVEFURlNfSAorI2luY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RBVFZGUworCisjaWZuZGVmIEhBVkVfRlNCTEtDTlRfVAordHlwZWRlZiB1bnNpZ25lZCBsb25nIGZzYmxrY250X3Q7CisjZW5kaWYKKyNpZm5kZWYgSEFWRV9GU0ZJTENOVF9UCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZnNmaWxjbnRfdDsKKyNlbmRpZgorCisjaWZuZGVmIFNUX1JET05MWQorI2RlZmluZSBTVF9SRE9OTFkJMQorI2VuZGlmCisjaWZuZGVmIFNUX05PU1VJRAorI2RlZmluZSBTVF9OT1NVSUQJMgorI2VuZGlmCisKKwkvKiBhcyBkZWZpbmVkIGluIElFRUUgU3RkIDEwMDMuMSwgMjAwNCBFZGl0aW9uICovCitzdHJ1Y3Qgc3RhdHZmcyB7CisJdW5zaWduZWQgbG9uZyBmX2JzaXplOwkvKiBGaWxlIHN5c3RlbSBibG9jayBzaXplLiAqLworCXVuc2lnbmVkIGxvbmcgZl9mcnNpemU7CS8qIEZ1bmRhbWVudGFsIGZpbGUgc3lzdGVtIGJsb2NrIHNpemUuICovCisJZnNibGtjbnRfdCBmX2Jsb2NrczsJLyogVG90YWwgbnVtYmVyIG9mIGJsb2NrcyBvbiBmaWxlIHN5c3RlbSBpbiAqLworCQkJCS8qIHVuaXRzIG9mIGZfZnJzaXplLiAqLworCWZzYmxrY250X3QgICAgZl9iZnJlZTsJLyogVG90YWwgbnVtYmVyIG9mIGZyZWUgYmxvY2tzLiAqLworCWZzYmxrY250X3QgICAgZl9iYXZhaWw7CS8qIE51bWJlciBvZiBmcmVlIGJsb2NrcyBhdmFpbGFibGUgdG8gICovCisJCQkJLyogbm9uLXByaXZpbGVnZWQgcHJvY2Vzcy4gICovCisJZnNmaWxjbnRfdCAgICBmX2ZpbGVzOwkvKiBUb3RhbCBudW1iZXIgb2YgZmlsZSBzZXJpYWwgbnVtYmVycy4gKi8KKwlmc2ZpbGNudF90ICAgIGZfZmZyZWU7CS8qIFRvdGFsIG51bWJlciBvZiBmcmVlIGZpbGUgc2VyaWFsIG51bWJlcnMuICovCisJZnNmaWxjbnRfdCAgICBmX2ZhdmFpbDsJLyogTnVtYmVyIG9mIGZpbGUgc2VyaWFsIG51bWJlcnMgYXZhaWxhYmxlIHRvICovCisJCQkJLyogbm9uLXByaXZpbGVnZWQgcHJvY2Vzcy4gKi8KKwl1bnNpZ25lZCBsb25nIGZfZnNpZDsJLyogRmlsZSBzeXN0ZW0gSUQuICovCisJdW5zaWduZWQgbG9uZyBmX2ZsYWc7CS8qIEJCaXQgbWFzayBvZiBmX2ZsYWcgdmFsdWVzLiAqLworCXVuc2lnbmVkIGxvbmcgZl9uYW1lbWF4Oy8qICBNYXhpbXVtIGZpbGVuYW1lIGxlbmd0aC4gKi8KK307CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUQVRWRlMKK2ludCBzdGF0dmZzKGNvbnN0IGNoYXIgKiwgc3RydWN0IHN0YXR2ZnMgKik7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0ZTVEFUVkZTCitpbnQgZnN0YXR2ZnMoaW50LCBzdHJ1Y3Qgc3RhdHZmcyAqKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2Qtd2FpdHBpZC5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2Qtd2FpdHBpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZTZmZmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2JzZC13YWl0cGlkLmMKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBCZW4gTGluZHN0cm9tLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpZm5kZWYgSEFWRV9XQUlUUElEIAorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlICJic2Qtd2FpdHBpZC5oIgorCitwaWRfdAord2FpdHBpZChpbnQgcGlkLCBpbnQgKnN0YXRfbG9jLCBpbnQgb3B0aW9ucykKK3sKKwl1bmlvbiB3YWl0IHN0YXR1c3A7CisJcGlkX3Qgd2FpdF9waWQ7CisKKwlpZiAocGlkIDw9IDApIHsKKwkJaWYgKHBpZCAhPSAtMSkgeworCQkJZXJybm8gPSBFSU5WQUw7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQkvKiB3YWl0NCgpIHdhbnRzIHBpZD0wIGZvciBpbmRpc2NyaW1pbmF0ZSB3YWl0LiAqLworCQlwaWQgPSAwOworCX0KKyAgICAgICAgd2FpdF9waWQgPSB3YWl0NChwaWQsICZzdGF0dXNwLCBvcHRpb25zLCBOVUxMKTsKKwlpZiAoc3RhdF9sb2MpCisgICAgICAgIAkqc3RhdF9sb2MgPSAoaW50KSBzdGF0dXNwLndfc3RhdHVzOyAgICAgICAgICAgIAorCisgICAgICAgIHJldHVybiAod2FpdF9waWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30KKworI2VuZGlmIC8qICFIQVZFX1dBSVRQSUQgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYnNkLXdhaXRwaWQuaCBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvYnNkLXdhaXRwaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDg1M2RiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ic2Qtd2FpdHBpZC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qICRJZDogYnNkLXdhaXRwaWQuaCx2IDEuNSAyMDAzLzA4LzI5IDE2OjU5OjUyIG1vdXJpbmcgRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBCZW4gTGluZHN0cm9tLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgX0JTRF9XQUlUUElEX0gKKyNkZWZpbmUgX0JTRF9XQUlUUElEX0gKKworI2lmbmRlZiBIQVZFX1dBSVRQSUQKKy8qIENsZWFuIG91dCBhbnkgcG90ZW50YWwgaXNzdWVzICovCisjdW5kZWYgV0lGRVhJVEVECisjdW5kZWYgV0lGU1RPUFBFRAorI3VuZGVmIFdJRlNJR05BTEVECisKKy8qIERlZmluZSByZXF1aXJlZCBmdW5jdGlvbnMgdG8gbWltaWMgYSBQT1NJWCBsb29rIGFuZCBmZWVsICovCisjZGVmaW5lIF9XX0lOVCh3KQkoKihpbnQqKSYodykpCS8qIGNvbnZlcnQgdW5pb24gd2FpdCB0byBpbnQgKi8KKyNkZWZpbmUgV0lGRVhJVEVEKHcpCSghKChfV19JTlQodykpICYgMDM3NykpCisjZGVmaW5lIFdJRlNUT1BQRUQodykJKChfV19JTlQodykpICYgMDEwMCkKKyNkZWZpbmUgV0lGU0lHTkFMRUQodykJKCFXSUZFWElURUQodykgJiYgIVdJRlNUT1BQRUQodykpCisjZGVmaW5lIFdFWElUU1RBVFVTKHcpCShpbnQpKFdJRkVYSVRFRCh3KSA/ICgoX1dfSU5UKHcpID4+IDgpICYgMDM3NykgOiAtMSkKKyNkZWZpbmUgV1RFUk1TSUcodykJKGludCkoV0lGU0lHTkFMRUQodykgPyAoX1dfSU5UKHcpICYgMDE3NykgOiAtMSkKKyNkZWZpbmUgV0NPUkVGTEFHCTB4ODAKKyNkZWZpbmUgV0NPUkVEVU1QKHcpIAkoKF9XX0lOVCh3KSkgJiBXQ09SRUZMQUcpCisKKy8qIFByb3RvdHlwZSAqLworcGlkX3Qgd2FpdHBpZChpbnQsIGludCAqLCBpbnQpOworCisjZW5kaWYgLyogIUhBVkVfV0FJVFBJRCAqLworI2VuZGlmIC8qIF9CU0RfV0FJVFBJRF9IICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2NoYXJjbGFzcy5oIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9jaGFyY2xhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWY1MTc0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9jaGFyY2xhc3MuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogUHVibGljIGRvbWFpbiwgMjAwOCwgVG9kZCBDLiBNaWxsZXIgPFRvZGQuTWlsbGVyQGNvdXJ0ZXNhbi5jb20+CisgKgorICogJE9wZW5CU0Q6IGNoYXJjbGFzcy5oLHYgMS4xIDIwMDgvMTAvMDEgMjM6MDQ6MTMgbWlsbGVydCBFeHAgJAorICovCisKKy8qIE9QRU5CU0QgT1JJR0lOQUw6IGxpYi9saWJjL2dlbi9jaGFyY2xhc3MuaCAqLworCisvKgorICogUE9TSVggY2hhcmFjdGVyIGNsYXNzIHN1cHBvcnQgZm9yIGZubWF0Y2goKSBhbmQgZ2xvYigpLgorICovCitzdGF0aWMgc3RydWN0IGNjbGFzcyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCppc2N0eXBlKShpbnQpOworfSBjY2xhc3Nlc1tdID0geworCXsgImFsbnVtIiwJaXNhbG51bSB9LAorCXsgImFscGhhIiwJaXNhbHBoYSB9LAorCXsgImJsYW5rIiwJaXNibGFuayB9LAorCXsgImNudHJsIiwJaXNjbnRybCB9LAorCXsgImRpZ2l0IiwJaXNkaWdpdCB9LAorCXsgImdyYXBoIiwJaXNncmFwaCB9LAorCXsgImxvd2VyIiwJaXNsb3dlciB9LAorCXsgInByaW50IiwJaXNwcmludCB9LAorCXsgInB1bmN0IiwJaXNwdW5jdCB9LAorCXsgInNwYWNlIiwJaXNzcGFjZSB9LAorCXsgInVwcGVyIiwJaXN1cHBlciB9LAorCXsgInhkaWdpdCIsCWlzeGRpZ2l0IH0sCisJeyBOVUxMLAkJTlVMTCB9Cit9OworCisjZGVmaW5lIE5DQ0xBU1NFUwkoc2l6ZW9mKGNjbGFzc2VzKSAvIHNpemVvZihjY2xhc3Nlc1swXSkgLSAxKQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9kYWVtb24uYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvZGFlbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VmZTE0YwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvZGFlbW9uLmMKQEAgLTAsMCArMSw4MiBAQAorLyoJJE9wZW5CU0Q6IGRhZW1vbi5jLHYgMS42IDIwMDUvMDgvMDggMDg6MDU6MzMgZXNwaWUgRXhwICQgKi8KKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvZ2VuL2RhZW1vbi5jICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaWZuZGVmIEhBVkVfREFFTU9OCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0ZDTlRMX0gKKyMgaW5jbHVkZSA8ZmNudGwuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9VTklTVERfSAorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCitpbnQKK2RhZW1vbihpbnQgbm9jaGRpciwgaW50IG5vY2xvc2UpCit7CisJaW50IGZkOworCisJc3dpdGNoIChmb3JrKCkpIHsKKwljYXNlIC0xOgorCQlyZXR1cm4gKC0xKTsKKwljYXNlIDA6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCV9leGl0KDApOworCX0KKworCWlmIChzZXRzaWQoKSA9PSAtMSkKKwkJcmV0dXJuICgtMSk7CisKKwlpZiAoIW5vY2hkaXIpCisJCSh2b2lkKWNoZGlyKCIvIik7CisKKwlpZiAoIW5vY2xvc2UgJiYgKGZkID0gb3BlbihfUEFUSF9ERVZOVUxMLCBPX1JEV1IsIDApKSAhPSAtMSkgeworCQkodm9pZClkdXAyKGZkLCBTVERJTl9GSUxFTk8pOworCQkodm9pZClkdXAyKGZkLCBTVERPVVRfRklMRU5PKTsKKwkJKHZvaWQpZHVwMihmZCwgU1RERVJSX0ZJTEVOTyk7CisJCWlmIChmZCA+IDIpCisJCQkodm9pZCljbG9zZSAoZmQpOworCX0KKwlyZXR1cm4gKDApOworfQorCisjZW5kaWYgLyogIUhBVkVfREFFTU9OICovCisKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvZGlybmFtZS5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9kaXJuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBmY2I0OQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvZGlybmFtZS5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qCSRPcGVuQlNEOiBkaXJuYW1lLmMsdiAxLjEzIDIwMDUvMDgvMDggMDg6MDU6MzMgZXNwaWUgRXhwICQJKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NywgMjAwNCBUb2RkIEMuIE1pbGxlciA8VG9kZC5NaWxsZXJAY291cnRlc2FuLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKiBPUEVOQlNEIE9SSUdJTkFMOiBsaWIvbGliYy9nZW4vZGlybmFtZS5jICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorI2lmbmRlZiBIQVZFX0RJUk5BTUUKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKK2NoYXIgKgorZGlybmFtZShjb25zdCBjaGFyICpwYXRoKQoreworCXN0YXRpYyBjaGFyIGRuYW1lW01BWFBBVEhMRU5dOworCXNpemVfdCBsZW47CisJY29uc3QgY2hhciAqZW5kcDsKKworCS8qIEVtcHR5IG9yIE5VTEwgc3RyaW5nIGdldHMgdHJlYXRlZCBhcyAiLiIgKi8KKwlpZiAocGF0aCA9PSBOVUxMIHx8ICpwYXRoID09ICdcMCcpIHsKKwkJZG5hbWVbMF0gPSAnLic7CisJCWRuYW1lWzFdID0gJ1wwJzsKKwkJcmV0dXJuIChkbmFtZSk7CisJfQorCisJLyogU3RyaXAgYW55IHRyYWlsaW5nIHNsYXNoZXMgKi8KKwllbmRwID0gcGF0aCArIHN0cmxlbihwYXRoKSAtIDE7CisJd2hpbGUgKGVuZHAgPiBwYXRoICYmICplbmRwID09ICcvJykKKwkJZW5kcC0tOworCisJLyogRmluZCB0aGUgc3RhcnQgb2YgdGhlIGRpciAqLworCXdoaWxlIChlbmRwID4gcGF0aCAmJiAqZW5kcCAhPSAnLycpCisJCWVuZHAtLTsKKworCS8qIEVpdGhlciB0aGUgZGlyIGlzICIvIiBvciB0aGVyZSBhcmUgbm8gc2xhc2hlcyAqLworCWlmIChlbmRwID09IHBhdGgpIHsKKwkJZG5hbWVbMF0gPSAqZW5kcCA9PSAnLycgPyAnLycgOiAnLic7CisJCWRuYW1lWzFdID0gJ1wwJzsKKwkJcmV0dXJuIChkbmFtZSk7CisJfSBlbHNlIHsKKwkJLyogTW92ZSBmb3J3YXJkIHBhc3QgdGhlIHNlcGFyYXRpbmcgc2xhc2hlcyAqLworCQlkbyB7CisJCQllbmRwLS07CisJCX0gd2hpbGUgKGVuZHAgPiBwYXRoICYmICplbmRwID09ICcvJyk7CisJfQorCisJbGVuID0gZW5kcCAtIHBhdGggKyAxOworCWlmIChsZW4gPj0gc2l6ZW9mKGRuYW1lKSkgeworCQllcnJubyA9IEVOQU1FVE9PTE9ORzsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJbWVtY3B5KGRuYW1lLCBwYXRoLCBsZW4pOworCWRuYW1lW2xlbl0gPSAnXDAnOworCXJldHVybiAoZG5hbWUpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2Zha2UtcmZjMjU1My5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9mYWtlLXJmYzI1NTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTZkOWUwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9mYWtlLXJmYzI1NTMuYwpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIERhbWllbiBNaWxsZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAxOTk5IFdJREUgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFBzZXVkby1pbXBsZW1lbnRhdGlvbiBvZiBSRkMyNTUzIG5hbWUgLyBhZGRyZXNzIHJlc29sdXRpb24gZnVuY3Rpb25zCisgKgorICogQnV0IHRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IGltcGxlbWVudGVkIGNvcnJlY3RseS4gVGhlIG1pbmltdW0gc3Vic2V0CisgKiBpcyBpbXBsZW1lbnRlZCBmb3Igc3NoIHVzZSBvbmx5LiBGb3IgZXhhbXBsZSwgdGhpcyByb3V0aW5lIGFzc3VtZXMKKyAqIHRoYXQgYWlfZmFtaWx5IGlzIEFGX0lORVQuIERvbid0IHVzZSBpdCBmb3IgYW5vdGhlciBwdXJwb3NlLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpZm5kZWYgSEFWRV9HRVROQU1FSU5GTworaW50IGdldG5hbWVpbmZvKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EsIHNpemVfdCBzYWxlbiwgY2hhciAqaG9zdCwgCisgICAgICAgICAgICAgICAgc2l6ZV90IGhvc3RsZW4sIGNoYXIgKnNlcnYsIHNpemVfdCBzZXJ2bGVuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopc2E7CisJc3RydWN0IGhvc3RlbnQgKmhwOworCWNoYXIgdG1wc2VydlsxNl07CisKKwlpZiAoc2EtPnNhX2ZhbWlseSAhPSBBRl9VTlNQRUMgJiYgc2EtPnNhX2ZhbWlseSAhPSBBRl9JTkVUKQorCQlyZXR1cm4gKEVBSV9GQU1JTFkpOworCWlmIChzZXJ2ICE9IE5VTEwpIHsKKwkJc25wcmludGYodG1wc2Vydiwgc2l6ZW9mKHRtcHNlcnYpLCAiJWQiLCBudG9ocyhzaW4tPnNpbl9wb3J0KSk7CisJCWlmIChzdHJsY3B5KHNlcnYsIHRtcHNlcnYsIHNlcnZsZW4pID49IHNlcnZsZW4pCisJCQlyZXR1cm4gKEVBSV9NRU1PUlkpOworCX0KKworCWlmIChob3N0ICE9IE5VTEwpIHsKKwkJaWYgKGZsYWdzICYgTklfTlVNRVJJQ0hPU1QpIHsKKwkJCWlmIChzdHJsY3B5KGhvc3QsIGluZXRfbnRvYShzaW4tPnNpbl9hZGRyKSwKKwkJCSAgICBob3N0bGVuKSA+PSBob3N0bGVuKQorCQkJCXJldHVybiAoRUFJX01FTU9SWSk7CisJCQllbHNlCisJCQkJcmV0dXJuICgwKTsKKwkJfSBlbHNlIHsKKwkJCWhwID0gZ2V0aG9zdGJ5YWRkcigoY2hhciAqKSZzaW4tPnNpbl9hZGRyLCAKKwkJCSAgICBzaXplb2Yoc3RydWN0IGluX2FkZHIpLCBBRl9JTkVUKTsKKwkJCWlmIChocCA9PSBOVUxMKQorCQkJCXJldHVybiAoRUFJX05PREFUQSk7CisJCQkKKwkJCWlmIChzdHJsY3B5KGhvc3QsIGhwLT5oX25hbWUsIGhvc3RsZW4pID49IGhvc3RsZW4pCisJCQkJcmV0dXJuIChFQUlfTUVNT1JZKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gKDApOworCQl9CisJfQorCXJldHVybiAoMCk7Cit9CisjZW5kaWYgLyogIUhBVkVfR0VUTkFNRUlORk8gKi8KKworI2lmbmRlZiBIQVZFX0dBSV9TVFJFUlJPUgorI2lmZGVmIEhBVkVfQ09OU1RfR0FJX1NUUkVSUk9SX1BST1RPCitjb25zdCBjaGFyICoKKyNlbHNlCitjaGFyICoKKyNlbmRpZgorZ2FpX3N0cmVycm9yKGludCBlcnIpCit7CisJc3dpdGNoIChlcnIpIHsKKwljYXNlIEVBSV9OT0RBVEE6CisJCXJldHVybiAoIm5vIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIG5hbWUiKTsKKwljYXNlIEVBSV9NRU1PUlk6CisJCXJldHVybiAoIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuIik7CisJY2FzZSBFQUlfTk9OQU1FOgorCQlyZXR1cm4gKCJub2RlbmFtZSBub3Igc2Vydm5hbWUgcHJvdmlkZWQsIG9yIG5vdCBrbm93biIpOworCWNhc2UgRUFJX0ZBTUlMWToKKwkJcmV0dXJuICgiYWlfZmFtaWx5IG5vdCBzdXBwb3J0ZWQiKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKCJ1bmtub3duL2ludmFsaWQgZXJyb3IuIik7CisJfQorfSAgICAKKyNlbmRpZiAvKiAhSEFWRV9HQUlfU1RSRVJST1IgKi8KKworI2lmbmRlZiBIQVZFX0ZSRUVBRERSSU5GTwordm9pZAorZnJlZWFkZHJpbmZvKHN0cnVjdCBhZGRyaW5mbyAqYWkpCit7CisJc3RydWN0IGFkZHJpbmZvICpuZXh0OworCisJZm9yKDsgYWkgIT0gTlVMTDspIHsKKwkJbmV4dCA9IGFpLT5haV9uZXh0OworCQlmcmVlKGFpKTsKKwkJYWkgPSBuZXh0OworCX0KK30KKyNlbmRpZiAvKiAhSEFWRV9GUkVFQUREUklORk8gKi8KKworI2lmbmRlZiBIQVZFX0dFVEFERFJJTkZPCitzdGF0aWMgc3RydWN0CithZGRyaW5mbyAqbWFsbG9jX2FpKGludCBwb3J0LCB1X2xvbmcgYWRkciwgY29uc3Qgc3RydWN0IGFkZHJpbmZvICpoaW50cykKK3sKKwlzdHJ1Y3QgYWRkcmluZm8gKmFpOworCisJYWkgPSBtYWxsb2Moc2l6ZW9mKCphaSkgKyBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisJaWYgKGFpID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisJCisJbWVtc2V0KGFpLCAnXDAnLCBzaXplb2YoKmFpKSArIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKwkKKwlhaS0+YWlfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikoYWkgKyAxKTsKKwkvKiBYWFggLS0gc3NoIGRvZXNuJ3QgdXNlIHNhX2xlbiAqLworCWFpLT5haV9hZGRybGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJYWktPmFpX2FkZHItPnNhX2ZhbWlseSA9IGFpLT5haV9mYW1pbHkgPSBBRl9JTkVUOworCisJKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikoYWkpLT5haV9hZGRyKS0+c2luX3BvcnQgPSBwb3J0OworCSgoc3RydWN0IHNvY2thZGRyX2luICopKGFpKS0+YWlfYWRkciktPnNpbl9hZGRyLnNfYWRkciA9IGFkZHI7CisJCisJLyogWFhYOiB0aGUgZm9sbG93aW5nIGlzIG5vdCBnZW5lcmFsbHkgY29ycmVjdCwgYnV0IGRvZXMgd2hhdCB3ZSB3YW50ICovCisJaWYgKGhpbnRzLT5haV9zb2NrdHlwZSkKKwkJYWktPmFpX3NvY2t0eXBlID0gaGludHMtPmFpX3NvY2t0eXBlOworCWVsc2UKKwkJYWktPmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisKKwlpZiAoaGludHMtPmFpX3Byb3RvY29sKQorCQlhaS0+YWlfcHJvdG9jb2wgPSBoaW50cy0+YWlfcHJvdG9jb2w7CisKKwlyZXR1cm4gKGFpKTsKK30KKworaW50CitnZXRhZGRyaW5mbyhjb25zdCBjaGFyICpob3N0bmFtZSwgY29uc3QgY2hhciAqc2Vydm5hbWUsIAorICAgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqaGludHMsIHN0cnVjdCBhZGRyaW5mbyAqKnJlcykKK3sKKwlzdHJ1Y3QgaG9zdGVudCAqaHA7CisJc3RydWN0IHNlcnZlbnQgKnNwOworCXN0cnVjdCBpbl9hZGRyIGluOworCWludCBpOworCWxvbmcgaW50IHBvcnQ7CisJdV9sb25nIGFkZHI7CisKKwlwb3J0ID0gMDsKKwlpZiAoaGludHMgJiYgaGludHMtPmFpX2ZhbWlseSAhPSBBRl9VTlNQRUMgJiYKKwkgICAgaGludHMtPmFpX2ZhbWlseSAhPSBBRl9JTkVUKQorCQlyZXR1cm4gKEVBSV9GQU1JTFkpOworCWlmIChzZXJ2bmFtZSAhPSBOVUxMKSB7CisJCWNoYXIgKmNwOworCisJCXBvcnQgPSBzdHJ0b2woc2Vydm5hbWUsICZjcCwgMTApOworCQlpZiAocG9ydCA+IDAgJiYgcG9ydCA8PSA2NTUzNSAmJiAqY3AgPT0gJ1wwJykKKwkJCXBvcnQgPSBodG9ucyhwb3J0KTsKKwkJZWxzZSBpZiAoKHNwID0gZ2V0c2VydmJ5bmFtZShzZXJ2bmFtZSwgTlVMTCkpICE9IE5VTEwpCisJCQlwb3J0ID0gc3AtPnNfcG9ydDsKKwkJZWxzZQorCQkJcG9ydCA9IDA7CisJfQorCisJaWYgKGhpbnRzICYmIGhpbnRzLT5haV9mbGFncyAmIEFJX1BBU1NJVkUpIHsKKwkJYWRkciA9IGh0b25sKDB4MDAwMDAwMDApOworCQlpZiAoaG9zdG5hbWUgJiYgaW5ldF9hdG9uKGhvc3RuYW1lLCAmaW4pICE9IDApCisJCQlhZGRyID0gaW4uc19hZGRyOworCQkqcmVzID0gbWFsbG9jX2FpKHBvcnQsIGFkZHIsIGhpbnRzKTsKKwkJaWYgKCpyZXMgPT0gTlVMTCkgCisJCQlyZXR1cm4gKEVBSV9NRU1PUlkpOworCQlyZXR1cm4gKDApOworCX0KKwkJCisJaWYgKCFob3N0bmFtZSkgeworCQkqcmVzID0gbWFsbG9jX2FpKHBvcnQsIGh0b25sKDB4N2YwMDAwMDEpLCBoaW50cyk7CisJCWlmICgqcmVzID09IE5VTEwpIAorCQkJcmV0dXJuIChFQUlfTUVNT1JZKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJCisJaWYgKGluZXRfYXRvbihob3N0bmFtZSwgJmluKSkgeworCQkqcmVzID0gbWFsbG9jX2FpKHBvcnQsIGluLnNfYWRkciwgaGludHMpOworCQlpZiAoKnJlcyA9PSBOVUxMKSAKKwkJCXJldHVybiAoRUFJX01FTU9SWSk7CisJCXJldHVybiAoMCk7CisJfQorCQorCS8qIERvbid0IHRyeSBETlMgaWYgQUlfTlVNRVJJQ0hPU1QgaXMgc2V0ICovCisJaWYgKGhpbnRzICYmIGhpbnRzLT5haV9mbGFncyAmIEFJX05VTUVSSUNIT1NUKQorCQlyZXR1cm4gKEVBSV9OT05BTUUpOworCQorCWhwID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZSk7CisJaWYgKGhwICYmIGhwLT5oX25hbWUgJiYgaHAtPmhfbmFtZVswXSAmJiBocC0+aF9hZGRyX2xpc3RbMF0pIHsKKwkJc3RydWN0IGFkZHJpbmZvICpjdXIsICpwcmV2OworCisJCWN1ciA9IHByZXYgPSAqcmVzID0gTlVMTDsKKwkJZm9yIChpID0gMDsgaHAtPmhfYWRkcl9saXN0W2ldOyBpKyspIHsKKwkJCXN0cnVjdCBpbl9hZGRyICppbiA9IChzdHJ1Y3QgaW5fYWRkciAqKWhwLT5oX2FkZHJfbGlzdFtpXTsKKworCQkJY3VyID0gbWFsbG9jX2FpKHBvcnQsIGluLT5zX2FkZHIsIGhpbnRzKTsKKwkJCWlmIChjdXIgPT0gTlVMTCkgeworCQkJCWlmICgqcmVzICE9IE5VTEwpCisJCQkJCWZyZWVhZGRyaW5mbygqcmVzKTsKKwkJCQlyZXR1cm4gKEVBSV9NRU1PUlkpOworCQkJfQorCQkJaWYgKHByZXYpCisJCQkJcHJldi0+YWlfbmV4dCA9IGN1cjsKKwkJCWVsc2UKKwkJCQkqcmVzID0gY3VyOworCisJCQlwcmV2ID0gY3VyOworCQl9CisJCXJldHVybiAoMCk7CisJfQorCQorCXJldHVybiAoRUFJX05PREFUQSk7Cit9CisjZW5kaWYgLyogIUhBVkVfR0VUQUREUklORk8gKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvZmFrZS1yZmMyNTUzLmggYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2Zha2UtcmZjMjU1My5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlOTA5MGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2Zha2UtcmZjMjU1My5oCkBAIC0wLDAgKzEsMTc1IEBACisvKiAkSWQ6IGZha2UtcmZjMjU1My5oLHYgMS4xNiAyMDA4LzA3LzE0IDExOjM3OjM3IGRqbSBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgRGFtaWVuIE1pbGxlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgV0lERSBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogUHNldWRvLWltcGxlbWVudGF0aW9uIG9mIFJGQzI1NTMgbmFtZSAvIGFkZHJlc3MgcmVzb2x1dGlvbiBmdW5jdGlvbnMKKyAqCisgKiBCdXQgdGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgaW1wbGVtZW50ZWQgY29ycmVjdGx5LiBUaGUgbWluaW11bSBzdWJzZXQKKyAqIGlzIGltcGxlbWVudGVkIGZvciBzc2ggdXNlIG9ubHkuIEZvciBleGFtcGxlLCB0aGlzIHJvdXRpbmUgYXNzdW1lcworICogdGhhdCBhaV9mYW1pbHkgaXMgQUZfSU5FVC4gRG9uJ3QgdXNlIGl0IGZvciBhbm90aGVyIHB1cnBvc2UuCisgKi8KKworI2lmbmRlZiBfRkFLRV9SRkMyNTUzX0gKKyNkZWZpbmUgX0ZBS0VfUkZDMjU1M19ICisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIGRlZmluZWQoSEFWRV9ORVREQl9IKQorIyBpbmNsdWRlIDxuZXRkYi5oPgorI2VuZGlmCisKKy8qCisgKiBGaXJzdCwgc29ja2V0IGFuZCBJTkVUNiByZWxhdGVkIGRlZmluaXRpb25zIAorICovCisjaWZuZGVmIEhBVkVfU1RSVUNUX1NPQ0tBRERSX1NUT1JBR0UKKyMgZGVmaW5lCV9TU19NQVhTSVpFCTEyOAkvKiBJbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBtYXggc2l6ZSAqLworIyBkZWZpbmUgICAgICAgX1NTX1BBRFNJWkUgICAgIChfU1NfTUFYU0laRSAtIHNpemVvZiAoc3RydWN0IHNvY2thZGRyKSkKK3N0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHsKKwlzdHJ1Y3Qgc29ja2FkZHIJc3Nfc2E7CisJY2hhcgkJX19zc19wYWQyW19TU19QQURTSVpFXTsKK307CisjIGRlZmluZSBzc19mYW1pbHkgc3Nfc2Euc2FfZmFtaWx5CisjZW5kaWYgLyogIUhBVkVfU1RSVUNUX1NPQ0tBRERSX1NUT1JBR0UgKi8KKworI2lmbmRlZiBJTjZfSVNfQUREUl9MT09QQkFDSworIyBkZWZpbmUgSU42X0lTX0FERFJfTE9PUEJBQ0soYSkgXAorCSgoKHVfaW50MzJfdCAqKShhKSlbMF0gPT0gMCAmJiAoKHVfaW50MzJfdCAqKShhKSlbMV0gPT0gMCAmJiBcCisJICgodV9pbnQzMl90ICopKGEpKVsyXSA9PSAwICYmICgodV9pbnQzMl90ICopKGEpKVszXSA9PSBodG9ubCgxKSkKKyNlbmRpZiAvKiAhSU42X0lTX0FERFJfTE9PUEJBQ0sgKi8KKworI2lmbmRlZiBIQVZFX1NUUlVDVF9JTjZfQUREUgorc3RydWN0IGluNl9hZGRyIHsKKwl1X2ludDhfdAlzNl9hZGRyWzE2XTsKK307CisjZW5kaWYgLyogIUhBVkVfU1RSVUNUX0lONl9BRERSICovCisKKyNpZm5kZWYgSEFWRV9TVFJVQ1RfU09DS0FERFJfSU42CitzdHJ1Y3Qgc29ja2FkZHJfaW42IHsKKwl1bnNpZ25lZCBzaG9ydAlzaW42X2ZhbWlseTsKKwl1X2ludDE2X3QJc2luNl9wb3J0OworCXVfaW50MzJfdAlzaW42X2Zsb3dpbmZvOworCXN0cnVjdCBpbjZfYWRkcglzaW42X2FkZHI7CisJdV9pbnQzMl90CXNpbjZfc2NvcGVfaWQ7Cit9OworI2VuZGlmIC8qICFIQVZFX1NUUlVDVF9TT0NLQUREUl9JTjYgKi8KKworI2lmbmRlZiBBRl9JTkVUNgorLyogRGVmaW5lIGl0IHRvIHNvbWV0aGluZyB0aGF0IHNob3VsZCBuZXZlciBhcHBlYXIgKi8KKyNkZWZpbmUgQUZfSU5FVDYgQUZfTUFYCisjZW5kaWYKKworLyoKKyAqIE5leHQsIFJGQzI1NTMgbmFtZSAvIGFkZHJlc3MgcmVzb2x1dGlvbiBBUEkKKyAqLworCisjaWZuZGVmIE5JX05VTUVSSUNIT1NUCisjIGRlZmluZSBOSV9OVU1FUklDSE9TVCAgICAoMSkKKyNlbmRpZgorI2lmbmRlZiBOSV9OQU1FUkVRRAorIyBkZWZpbmUgTklfTkFNRVJFUUQgICAgICAgKDE8PDEpCisjZW5kaWYKKyNpZm5kZWYgTklfTlVNRVJJQ1NFUlYKKyMgZGVmaW5lIE5JX05VTUVSSUNTRVJWICAgICgxPDwyKQorI2VuZGlmCisKKyNpZm5kZWYgQUlfUEFTU0lWRQorIyBkZWZpbmUgQUlfUEFTU0lWRQkJKDEpCisjZW5kaWYKKyNpZm5kZWYgQUlfQ0FOT05OQU1FCisjIGRlZmluZSBBSV9DQU5PTk5BTUUJCSgxPDwxKQorI2VuZGlmCisjaWZuZGVmIEFJX05VTUVSSUNIT1NUCisjIGRlZmluZSBBSV9OVU1FUklDSE9TVAkJKDE8PDIpCisjZW5kaWYKKworI2lmbmRlZiBOSV9NQVhTRVJWCisjIGRlZmluZSBOSV9NQVhTRVJWIDMyCisjZW5kaWYgLyogIU5JX01BWFNFUlYgKi8KKyNpZm5kZWYgTklfTUFYSE9TVAorIyBkZWZpbmUgTklfTUFYSE9TVCAxMDI1CisjZW5kaWYgLyogIU5JX01BWEhPU1QgKi8KKworI2lmbmRlZiBFQUlfTk9EQVRBCisjIGRlZmluZSBFQUlfTk9EQVRBCShJTlRfTUFYIC0gMSkKKyNlbmRpZgorI2lmbmRlZiBFQUlfTUVNT1JZCisjIGRlZmluZSBFQUlfTUVNT1JZCShJTlRfTUFYIC0gMikKKyNlbmRpZgorI2lmbmRlZiBFQUlfTk9OQU1FCisjIGRlZmluZSBFQUlfTk9OQU1FCShJTlRfTUFYIC0gMykKKyNlbmRpZgorI2lmbmRlZiBFQUlfU1lTVEVNCisjIGRlZmluZSBFQUlfU1lTVEVNCShJTlRfTUFYIC0gNCkKKyNlbmRpZgorI2lmbmRlZiBFQUlfRkFNSUxZCisjIGRlZmluZSBFQUlfRkFNSUxZCShJTlRfTUFYIC0gNSkKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSVUNUX0FERFJJTkZPCitzdHJ1Y3QgYWRkcmluZm8geworCWludAlhaV9mbGFnczsJLyogQUlfUEFTU0lWRSwgQUlfQ0FOT05OQU1FICovCisJaW50CWFpX2ZhbWlseTsJLyogUEZfeHh4ICovCisJaW50CWFpX3NvY2t0eXBlOwkvKiBTT0NLX3h4eCAqLworCWludAlhaV9wcm90b2NvbDsJLyogMCBvciBJUFBST1RPX3h4eCBmb3IgSVB2NCBhbmQgSVB2NiAqLworCXNpemVfdAlhaV9hZGRybGVuOwkvKiBsZW5ndGggb2YgYWlfYWRkciAqLworCWNoYXIJKmFpX2Nhbm9ubmFtZTsJLyogY2Fub25pY2FsIG5hbWUgZm9yIGhvc3RuYW1lICovCisJc3RydWN0IHNvY2thZGRyICphaV9hZGRyOwkvKiBiaW5hcnkgYWRkcmVzcyAqLworCXN0cnVjdCBhZGRyaW5mbyAqYWlfbmV4dDsJLyogbmV4dCBzdHJ1Y3R1cmUgaW4gbGlua2VkIGxpc3QgKi8KK307CisjZW5kaWYgLyogIUhBVkVfU1RSVUNUX0FERFJJTkZPICovCisKKyNpZm5kZWYgSEFWRV9HRVRBRERSSU5GTworI2lmZGVmIGdldGFkZHJpbmZvCisjIHVuZGVmIGdldGFkZHJpbmZvCisjZW5kaWYKKyNkZWZpbmUgZ2V0YWRkcmluZm8oYSxiLGMsZCkJKHNzaF9nZXRhZGRyaW5mbyhhLGIsYyxkKSkKK2ludCBnZXRhZGRyaW5mbyhjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgCisgICAgY29uc3Qgc3RydWN0IGFkZHJpbmZvICosIHN0cnVjdCBhZGRyaW5mbyAqKik7CisjZW5kaWYgLyogIUhBVkVfR0VUQUREUklORk8gKi8KKworI2lmICFkZWZpbmVkKEhBVkVfR0FJX1NUUkVSUk9SKSAmJiAhZGVmaW5lZChIQVZFX0NPTlNUX0dBSV9TVFJFUlJPUl9QUk9UTykKKyNkZWZpbmUgZ2FpX3N0cmVycm9yKGEpCQkoX3NzaF9jb21wYXRfZ2FpX3N0cmVycm9yKGEpKQorY2hhciAqZ2FpX3N0cmVycm9yKGludCk7CisjZW5kaWYgLyogIUhBVkVfR0FJX1NUUkVSUk9SICovCisKKyNpZm5kZWYgSEFWRV9GUkVFQUREUklORk8KKyNkZWZpbmUgZnJlZWFkZHJpbmZvKGEpCQkoc3NoX2ZyZWVhZGRyaW5mbyhhKSkKK3ZvaWQgZnJlZWFkZHJpbmZvKHN0cnVjdCBhZGRyaW5mbyAqKTsKKyNlbmRpZiAvKiAhSEFWRV9GUkVFQUREUklORk8gKi8KKworI2lmbmRlZiBIQVZFX0dFVE5BTUVJTkZPCisjZGVmaW5lIGdldG5hbWVpbmZvKGEsYixjLGQsZSxmLGcpIChzc2hfZ2V0bmFtZWluZm8oYSxiLGMsZCxlLGYsZykpCitpbnQgZ2V0bmFtZWluZm8oY29uc3Qgc3RydWN0IHNvY2thZGRyICosIHNpemVfdCwgY2hhciAqLCBzaXplX3QsIAorICAgIGNoYXIgKiwgc2l6ZV90LCBpbnQpOworI2VuZGlmIC8qICFIQVZFX0dFVE5BTUVJTkZPICovCisKKyNlbmRpZiAvKiAhX0ZBS0VfUkZDMjU1M19IICovCisKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvZm10X3NjYWxlZC5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9mbXRfc2NhbGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRkNjgyYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvZm10X3NjYWxlZC5jCkBAIC0wLDAgKzEsMjc0IEBACisvKgkkT3BlbkJTRDogZm10X3NjYWxlZC5jLHYgMS45IDIwMDcvMDMvMjAgMDM6NDI6NTIgdGVkdSBFeHAgJAkqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyLCAyMDAzIElhbiBGLiBEYXJ3aW4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYnV0aWwvZm10X3NjYWxlZC5jICovCisKKy8qCisgKiBmbXRfc2NhbGVkOiBGb3JtYXQgbnVtYmVycyBzY2FsZWQgZm9yIGh1bWFuIGNvbXByZWhlbnNpb24KKyAqIHNjYW5fc2NhbGVkOiBTY2FuIG51bWJlcnMgaW4gdGhpcyBmb3JtYXQuCisgKgorICogIkh1bWFuLXJlYWRhYmxlIiBvdXRwdXQgdXNlcyA0IGRpZ2l0cyBtYXgsIGFuZCBwdXRzIGEgdW5pdCBzdWZmaXggYXQKKyAqIHRoZSBlbmQuICBNYWtlcyBvdXRwdXQgY29tcGFjdCBhbmQgZWFzeS10by1yZWFkIGVzcC4gb24gaHVnZSBkaXNrcy4KKyAqIEZvcm1hdHRpbmcgY29kZSB3YXMgb3JpZ2luYWxseSBpbiBPcGVuQlNEICJkZiIsIGNvbnZlcnRlZCB0byBsaWJyYXJ5IHJvdXRpbmUuCisgKiBTY2FubmluZyBjb2RlIHdyaXR0ZW4gZm9yIE9wZW5CU0QgbGlidXRpbC4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2lmbmRlZiBIQVZFX0ZNVF9TQ0FMRUQKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCit0eXBlZGVmIGVudW0geworCU5PTkUgPSAwLCBLSUxPID0gMSwgTUVHQSA9IDIsIEdJR0EgPSAzLCBURVJBID0gNCwgUEVUQSA9IDUsIEVYQSA9IDYKK30gdW5pdF90eXBlOworCisvKiBUaGVzZSB0aHJlZSBhcnJheXMgTVVTVCBiZSBpbiBzeW5jISAgWFhYIG1ha2UgYSBzdHJ1Y3QgKi8KK3N0YXRpYyB1bml0X3R5cGUgdW5pdHNbXSA9IHsgTk9ORSwgS0lMTywgTUVHQSwgR0lHQSwgVEVSQSwgUEVUQSwgRVhBIH07CitzdGF0aWMgY2hhciBzY2FsZV9jaGFyc1tdID0gIkJLTUdUUEUiOworc3RhdGljIGxvbmcgbG9uZyBzY2FsZV9mYWN0b3JzW10gPSB7CisJMUxMLAorCTEwMjRMTCwKKwkxMDI0TEwqMTAyNCwKKwkxMDI0TEwqMTAyNCoxMDI0LAorCTEwMjRMTCoxMDI0KjEwMjQqMTAyNCwKKwkxMDI0TEwqMTAyNCoxMDI0KjEwMjQqMTAyNCwKKwkxMDI0TEwqMTAyNCoxMDI0KjEwMjQqMTAyNCoxMDI0LAorfTsKKyNkZWZpbmUJU0NBTEVfTEVOR1RIIChzaXplb2YodW5pdHMpL3NpemVvZih1bml0c1swXSkpCisKKyNkZWZpbmUgTUFYX0RJR0lUUyAoU0NBTEVfTEVOR1RIICogMykJLyogWFhYIHN0cmxlbihzcHJpbnRmKCIlbGxkIiwgLTEpPyAqLworCisvKiogQ29udmVydCB0aGUgZ2l2ZW4gaW5wdXQgc3RyaW5nICJzY2FsZWQiIGludG8gbnVtZXJpYyBpbiAicmVzdWx0Ii4KKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIGFuZCBlcnJubyBzZXQgb24gZXJyb3IuCisgKi8KK2ludAorc2Nhbl9zY2FsZWQoY2hhciAqc2NhbGVkLCBsb25nIGxvbmcgKnJlc3VsdCkKK3sKKwljaGFyICpwID0gc2NhbGVkOworCWludCBzaWduID0gMDsKKwl1bnNpZ25lZCBpbnQgaSwgbmRpZ2l0cyA9IDAsIGZyYWN0X2RpZ2l0cyA9IDA7CisJbG9uZyBsb25nIHNjYWxlX2ZhY3QgPSAxLCB3aG9sZSA9IDAsIGZwYXJ0ID0gMDsKKworCS8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlICovCisJd2hpbGUgKGlzYXNjaWkoKnApICYmIGlzc3BhY2UoKnApKQorCQkrK3A7CisKKwkvKiBUaGVuIGF0IG1vc3Qgb25lIGxlYWRpbmcgKyBvciAtICovCisJd2hpbGUgKCpwID09ICctJyB8fCAqcCA9PSAnKycpIHsKKwkJaWYgKCpwID09ICctJykgeworCQkJaWYgKHNpZ24pIHsKKwkJCQllcnJubyA9IEVJTlZBTDsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlzaWduID0gLTE7CisJCQkrK3A7CisJCX0gZWxzZSBpZiAoKnAgPT0gJysnKSB7CisJCQlpZiAoc2lnbikgeworCQkJCWVycm5vID0gRUlOVkFMOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXNpZ24gPSArMTsKKwkJCSsrcDsKKwkJfQorCX0KKworCS8qIE1haW4gbG9vcDogU2NhbiBkaWdpdHMsIGZpbmQgZGVjaW1hbCBwb2ludCwgaWYgcHJlc2VudC4KKwkgKiBXZSBkb24ndCBhbGxvdyBleHBvbmVudGlhbHMsIHNvIG5vIHNjaWVudGlmaWMgbm90YXRpb24KKwkgKiAoYnV0IG5vdGUgdGhhdCBFIGZvciBFeGEgbWlnaHQgbG9vayBsaWtlIGUgdG8gc29tZSEpLgorCSAqIEFkdmFuY2UgJ3AnIHRvIGVuZCwgdG8gZ2V0IHNjYWxlIGZhY3Rvci4KKwkgKi8KKwlmb3IgKDsgaXNhc2NpaSgqcCkgJiYgKGlzZGlnaXQoKnApIHx8ICpwPT0nLicpOyArK3ApIHsKKwkJaWYgKCpwID09ICcuJykgeworCQkJaWYgKGZyYWN0X2RpZ2l0cyA+IDApIHsJLyogb29wcywgbW9yZSB0aGFuIG9uZSAnLicgKi8KKwkJCQllcnJubyA9IEVJTlZBTDsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlmcmFjdF9kaWdpdHMgPSAxOworCQkJY29udGludWU7CisJCX0KKworCQlpID0gKCpwKSAtICcwJzsJCQkvKiB3aGV3ISBmaW5hbGx5IGEgZGlnaXQgd2UgY2FuIHVzZSAqLworCQlpZiAoZnJhY3RfZGlnaXRzID4gMCkgeworCQkJaWYgKGZyYWN0X2RpZ2l0cyA+PSBNQVhfRElHSVRTLTEpCisJCQkJLyogaWdub3JlIGV4dHJhIGZyYWN0aW9uYWwgZGlnaXRzICovCisJCQkJY29udGludWU7CisJCQlmcmFjdF9kaWdpdHMrKzsJCS8qIGZvciBsYXRlciBzY2FsaW5nICovCisJCQlmcGFydCAqPSAxMDsKKwkJCWZwYXJ0ICs9IGk7CisJCX0gZWxzZSB7CQkJCS8qIG5vcm1hbCBkaWdpdCAqLworCQkJaWYgKCsrbmRpZ2l0cyA+PSBNQVhfRElHSVRTKSB7CisJCQkJZXJybm8gPSBFUkFOR0U7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJd2hvbGUgKj0gMTA7CisJCQl3aG9sZSArPSBpOworCQl9CisJfQorCisJaWYgKHNpZ24pIHsKKwkJd2hvbGUgKj0gc2lnbjsKKwkJZnBhcnQgKj0gc2lnbjsKKwl9CisKKwkvKiBJZiBubyBzY2FsZSBmYWN0b3IgZ2l2ZW4sIHdlJ3JlIGRvbmUuIGZyYWN0aW9uIGlzIGRpc2NhcmRlZC4gKi8KKwlpZiAoISpwKSB7CisJCSpyZXN1bHQgPSB3aG9sZTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVmFsaWRhdGUgc2NhbGUgZmFjdG9yLCBhbmQgc2NhbGUgd2hvbGUgYW5kIGZyYWN0aW9uIGJ5IGl0LiAqLworCWZvciAoaSA9IDA7IGkgPCBTQ0FMRV9MRU5HVEg7IGkrKykgeworCisJCS8qKiBBcmUgd2UgdGhlcmUgeWV0PyAqLworCQlpZiAoKnAgPT0gc2NhbGVfY2hhcnNbaV0gfHwKKwkJCSpwID09IHRvbG93ZXIoc2NhbGVfY2hhcnNbaV0pKSB7CisKKwkJCS8qIElmIGl0IGVuZHMgd2l0aCBhbHBoYW51bWVyaWNzIGFmdGVyIHRoZSBzY2FsZSBjaGFyLCBiYWQuICovCisJCQlpZiAoaXNhbG51bSgqKHArMSkpKSB7CisJCQkJZXJybm8gPSBFSU5WQUw7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJc2NhbGVfZmFjdCA9IHNjYWxlX2ZhY3RvcnNbaV07CisKKwkJCS8qIHNjYWxlIHdob2xlIHBhcnQgKi8KKwkJCXdob2xlICo9IHNjYWxlX2ZhY3Q7CisKKwkJCS8qIHRydW5jYXRlIGZwYXJ0IHNvIGl0IGRvZXMndCBvdmVyZmxvdy4KKwkJCSAqIHRoZW4gc2NhbGUgZnJhY3Rpb25hbCBwYXJ0LgorCQkJICovCisJCQl3aGlsZSAoZnBhcnQgPj0gTExPTkdfTUFYIC8gc2NhbGVfZmFjdCkgeworCQkJCWZwYXJ0IC89IDEwOworCQkJCWZyYWN0X2RpZ2l0cy0tOworCQkJfQorCQkJZnBhcnQgKj0gc2NhbGVfZmFjdDsKKwkJCWlmIChmcmFjdF9kaWdpdHMgPiAwKSB7CisJCQkJZm9yIChpID0gMDsgaSA8IGZyYWN0X2RpZ2l0cyAtMTsgaSsrKQorCQkJCQlmcGFydCAvPSAxMDsKKwkJCX0KKwkJCXdob2xlICs9IGZwYXJ0OworCQkJKnJlc3VsdCA9IHdob2xlOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJZXJybm8gPSBFUkFOR0U7CisJcmV0dXJuIC0xOworfQorCisvKiBGb3JtYXQgdGhlIGdpdmVuICJudW1iZXIiIGludG8gaHVtYW4tcmVhZGFibGUgZm9ybSBpbiAicmVzdWx0Ii4KKyAqIFJlc3VsdCBtdXN0IHBvaW50IHRvIGFuIGFsbG9jYXRlZCBidWZmZXIgb2YgbGVuZ3RoIEZNVF9TQ0FMRURfU1RSU0laRS4KKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIGFuZCBlcnJubyBzZXQgaWYgZXJyb3IuCisgKi8KK2ludAorZm10X3NjYWxlZChsb25nIGxvbmcgbnVtYmVyLCBjaGFyICpyZXN1bHQpCit7CisJbG9uZyBsb25nIGFidmFsLCBmcmFjdCA9IDA7CisJdW5zaWduZWQgaW50IGk7CisJdW5pdF90eXBlIHVuaXQgPSBOT05FOworCisJYWJ2YWwgPSAobnVtYmVyIDwgMExMKSA/IC1udW1iZXIgOiBudW1iZXI7CS8qIG5vIGxvbmcgbG9uZ19hYnMgeWV0ICovCisKKwkvKiBOb3QgZXZlcnkgbmVnYXRpdmUgbG9uZyBsb25nIGhhcyBhIHBvc2l0aXZlIHJlcHJlc2VudGF0aW9uLgorCSAqIEFsc28gY2hlY2sgZm9yIG51bWJlcnMgdGhhdCBhcmUganVzdCB0b28gZGFybmVkIGJpZyB0byBmb3JtYXQKKwkgKi8KKwlpZiAoYWJ2YWwgPCAwIHx8IGFidmFsIC8gMTAyNCA+PSBzY2FsZV9mYWN0b3JzW1NDQUxFX0xFTkdUSC0xXSkgeworCQllcnJubyA9IEVSQU5HRTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHNjYWxlIHdob2xlIHBhcnQ7IGdldCB1bnNjYWxlZCBmcmFjdGlvbiAqLworCWZvciAoaSA9IDA7IGkgPCBTQ0FMRV9MRU5HVEg7IGkrKykgeworCQlpZiAoYWJ2YWwvMTAyNCA8IHNjYWxlX2ZhY3RvcnNbaV0pIHsKKwkJCXVuaXQgPSB1bml0c1tpXTsKKwkJCWZyYWN0ID0gKGkgPT0gMCkgPyAwIDogYWJ2YWwgJSBzY2FsZV9mYWN0b3JzW2ldOworCQkJbnVtYmVyIC89IHNjYWxlX2ZhY3RvcnNbaV07CisJCQlpZiAoaSA+IDApCisJCQkJZnJhY3QgLz0gc2NhbGVfZmFjdG9yc1tpIC0gMV07CisJCQlicmVhazsKKwkJfQorCX0KKworCWZyYWN0ID0gKDEwICogZnJhY3QgKyA1MTIpIC8gMTAyNDsKKwkvKiBpZiB0aGUgcmVzdWx0IHdvdWxkIGJlID49IDEwLCByb3VuZCBtYWluIG51bWJlciAqLworCWlmIChmcmFjdCA9PSAxMCkgeworCQlpZiAobnVtYmVyID49IDApCisJCQludW1iZXIrKzsKKwkJZWxzZQorCQkJbnVtYmVyLS07CisJCWZyYWN0ID0gMDsKKwl9CisKKwlpZiAobnVtYmVyID09IDApCisJCXN0cmxjcHkocmVzdWx0LCAiMEIiLCBGTVRfU0NBTEVEX1NUUlNJWkUpOworCWVsc2UgaWYgKHVuaXQgPT0gTk9ORSB8fCBudW1iZXIgPj0gMTAwIHx8IG51bWJlciA8PSAtMTAwKSB7CisJCWlmIChmcmFjdCA+PSA1KSB7CisJCQlpZiAobnVtYmVyID49IDApCisJCQkJbnVtYmVyKys7CisJCQllbHNlCisJCQkJbnVtYmVyLS07CisJCX0KKwkJKHZvaWQpc25wcmludGYocmVzdWx0LCBGTVRfU0NBTEVEX1NUUlNJWkUsICIlbGxkJWMiLAorCQkJbnVtYmVyLCBzY2FsZV9jaGFyc1t1bml0XSk7CisJfSBlbHNlCisJCSh2b2lkKXNucHJpbnRmKHJlc3VsdCwgRk1UX1NDQUxFRF9TVFJTSVpFLCAiJWxsZC4lMWxsZCVjIiwKKwkJCW51bWJlciwgZnJhY3QsIHNjYWxlX2NoYXJzW3VuaXRdKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYJTUFJTgorLyoKKyAqIFRoaXMgaXMgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIHByb2dyYW0gaW4gdGhlIG1hbiBwYWdlLgorICogQ29weS1hbmQtcGFzdGUgd2hhdGV2ZXIgeW91IG5lZWQgZnJvbSBpdC4KKyAqLworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpjaW5wdXQgPSAiMS41SyIsIGJ1ZltGTVRfU0NBTEVEX1NUUlNJWkVdOworCWxvbmcgbG9uZyBuaW5wdXQgPSAxMDQ4Mzg5MiwgcmVzdWx0OworCisJaWYgKHNjYW5fc2NhbGVkKGNpbnB1dCwgJnJlc3VsdCkgPT0gMCkKKwkJcHJpbnRmKCJcIiVzXCIgLT4gJWxsZFxuIiwgY2lucHV0LCByZXN1bHQpOworCWVsc2UKKwkJcGVycm9yKGNpbnB1dCk7CisKKwlpZiAoZm10X3NjYWxlZChuaW5wdXQsIGJ1ZikgPT0gMCkKKwkJcHJpbnRmKCIlbGxkIC0+IFwiJXNcIlxuIiwgbmlucHV0LCBidWYpOworCWVsc2UKKwkJZnByaW50ZihzdGRlcnIsICIlbGxkIGludmFsaWQgKCVzKVxuIiwgbmlucHV0LCBzdHJlcnJvcihlcnJubykpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIEhBVkVfRk1UX1NDQUxFRCAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9nZXRjd2QuYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvZ2V0Y3dkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkYmI5YwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvZ2V0Y3dkLmMKQEAgLTAsMCArMSwyNDAgQEAKKy8qCWZyb20gT3BlbkJTRDogZ2V0Y3dkLmMsdiAxLjE0IDIwMDUvMDgvMDggMDg6MDU6MzQgZXNwaWUgRXhwICovCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvZ2VuL2dldGN3ZC5jICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaWYgIWRlZmluZWQoSEFWRV9HRVRDV0QpCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8c3lzL2Rpci5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2RlZmluZQlJU0RPVChkcCkgXAorCShkcC0+ZF9uYW1lWzBdID09ICcuJyAmJiAoZHAtPmRfbmFtZVsxXSA9PSAnXDAnIHx8IFwKKwkgICAgKGRwLT5kX25hbWVbMV0gPT0gJy4nICYmIGRwLT5kX25hbWVbMl0gPT0gJ1wwJykpKQorCitjaGFyICoKK2dldGN3ZChjaGFyICpwdCwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGRpcmVudCAqZHA7CisJRElSICpkaXIgPSBOVUxMOworCWRldl90IGRldjsKKwlpbm9fdCBpbm87CisJaW50IGZpcnN0OworCWNoYXIgKmJwdCwgKmJ1cDsKKwlzdHJ1Y3Qgc3RhdCBzOworCWRldl90IHJvb3RfZGV2OworCWlub190IHJvb3RfaW5vOworCXNpemVfdCBwdHNpemUsIHVwc2l6ZTsKKwlpbnQgc2F2ZV9lcnJubzsKKwljaGFyICplcHQsICpldXAsICp1cDsKKworCS8qCisJICogSWYgbm8gYnVmZmVyIHNwZWNpZmllZCBieSB0aGUgdXNlciwgYWxsb2NhdGUgb25lIGFzIG5lY2Vzc2FyeS4KKwkgKiBJZiBhIGJ1ZmZlciBpcyBzcGVjaWZpZWQsIHRoZSBzaXplIGhhcyB0byBiZSBub24temVyby4gIFRoZSBwYXRoCisJICogaXMgYnVpbHQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXIgYmFja3dhcmRzLgorCSAqLworCWlmIChwdCkgeworCQlwdHNpemUgPSAwOworCQlpZiAoIXNpemUpIHsKKwkJCWVycm5vID0gRUlOVkFMOworCQkJcmV0dXJuIChOVUxMKTsKKwkJfQorCQllcHQgPSBwdCArIHNpemU7CisJfSBlbHNlIHsKKwkJaWYgKChwdCA9IG1hbGxvYyhwdHNpemUgPSBNQVhQQVRITEVOKSkgPT0gTlVMTCkKKwkJCXJldHVybiAoTlVMTCk7CisJCWVwdCA9IHB0ICsgcHRzaXplOworCX0KKwlicHQgPSBlcHQgLSAxOworCSpicHQgPSAnXDAnOworCisJLyoKKwkgKiBBbGxvY2F0ZSBieXRlcyBmb3IgdGhlIHN0cmluZyBvZiAiLi4vIidzLgorCSAqIFNob3VsZCBhbHdheXMgYmUgZW5vdWdoIChpdCdzIDM0MCBsZXZlbHMpLiAgSWYgaXQncyBub3QsIGFsbG9jYXRlCisJICogYXMgbmVjZXNzYXJ5LiAgU3BlY2lhbCAqIGNhc2UgdGhlIGZpcnN0IHN0YXQsIGl0J3MgIi4iLCBub3QgIi4uIi4KKwkgKi8KKwlpZiAoKHVwID0gbWFsbG9jKHVwc2l6ZSA9IE1BWFBBVEhMRU4pKSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKwlldXAgPSB1cCArIHVwc2l6ZTsKKwlidXAgPSB1cDsKKwl1cFswXSA9ICcuJzsKKwl1cFsxXSA9ICdcMCc7CisKKwkvKiBTYXZlIHJvb3QgdmFsdWVzLCBzbyBrbm93IHdoZW4gdG8gc3RvcC4gKi8KKwlpZiAoc3RhdCgiLyIsICZzKSkKKwkJZ290byBlcnI7CisJcm9vdF9kZXYgPSBzLnN0X2RldjsKKwlyb290X2lubyA9IHMuc3RfaW5vOworCisJZXJybm8gPSAwOwkJCS8qIFhYWCByZWFkZGlyIGhhcyBubyBlcnJvciByZXR1cm4uICovCisKKwlmb3IgKGZpcnN0ID0gMTs7IGZpcnN0ID0gMCkgeworCQkvKiBTdGF0IHRoZSBjdXJyZW50IGxldmVsLiAqLworCQlpZiAobHN0YXQodXAsICZzKSkKKwkJCWdvdG8gZXJyOworCisJCS8qIFNhdmUgY3VycmVudCBub2RlIHZhbHVlcy4gKi8KKwkJaW5vID0gcy5zdF9pbm87CisJCWRldiA9IHMuc3RfZGV2OworCisJCS8qIENoZWNrIGZvciByZWFjaGluZyByb290LiAqLworCQlpZiAocm9vdF9kZXYgPT0gZGV2ICYmIHJvb3RfaW5vID09IGlubykgeworCQkJKi0tYnB0ID0gJy8nOworCQkJLyoKKwkJCSAqIEl0J3MgdW5jbGVhciB0aGF0IGl0J3MgYSByZXF1aXJlbWVudCB0byBjb3B5IHRoZQorCQkJICogcGF0aCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIsIGJ1dCBpdCdzIGFsd2F5cworCQkJICogYmVlbiB0aGF0IHdheSBhbmQgc3R1ZmYgd291bGQgcHJvYmFibHkgYnJlYWsuCisJCQkgKi8KKwkJCW1lbW1vdmUocHQsIGJwdCwgZXB0IC0gYnB0KTsKKwkJCWZyZWUodXApOworCQkJcmV0dXJuIChwdCk7CisJCX0KKworCQkvKgorCQkgKiBCdWlsZCBwb2ludGVyIHRvIHRoZSBwYXJlbnQgZGlyZWN0b3J5LCBhbGxvY2F0aW5nIG1lbW9yeQorCQkgKiBhcyBuZWNlc3NhcnkuICBNYXggbGVuZ3RoIGlzIDMgZm9yICIuLi8iLCB0aGUgbGFyZ2VzdAorCQkgKiBwb3NzaWJsZSBjb21wb25lbnQgbmFtZSwgcGx1cyBhIHRyYWlsaW5nIE5VTC4KKwkJICovCisJCWlmIChidXAgKyAzICArIE1BWE5BTUxFTiArIDEgPj0gZXVwKSB7CisJCQljaGFyICpudXA7CisKKwkJCWlmICgobnVwID0gcmVhbGxvYyh1cCwgdXBzaXplICo9IDIpKSA9PSBOVUxMKQorCQkJCWdvdG8gZXJyOworCQkJYnVwID0gbnVwICsgKGJ1cCAtIHVwKTsKKwkJCXVwID0gbnVwOworCQkJZXVwID0gdXAgKyB1cHNpemU7CisJCX0KKwkJKmJ1cCsrID0gJy4nOworCQkqYnVwKysgPSAnLic7CisJCSpidXAgPSAnXDAnOworCisJCS8qIE9wZW4gYW5kIHN0YXQgcGFyZW50IGRpcmVjdG9yeS4gKi8KKwkJaWYgKCEoZGlyID0gb3BlbmRpcih1cCkpIHx8IGZzdGF0KGRpcmZkKGRpciksICZzKSkKKwkJCWdvdG8gZXJyOworCisJCS8qIEFkZCB0cmFpbGluZyBzbGFzaCBmb3IgbmV4dCBkaXJlY3RvcnkuICovCisJCSpidXArKyA9ICcvJzsKKworCQkvKgorCQkgKiBJZiBpdCdzIGEgbW91bnQgcG9pbnQsIGhhdmUgdG8gc3RhdCBlYWNoIGVsZW1lbnQgYmVjYXVzZQorCQkgKiB0aGUgaW5vZGUgbnVtYmVyIGluIHRoZSBkaXJlY3RvcnkgaXMgZm9yIHRoZSBlbnRyeSBpbiB0aGUKKwkJICogcGFyZW50IGRpcmVjdG9yeSwgbm90IHRoZSBpbm9kZSBudW1iZXIgb2YgdGhlIG1vdW50ZWQgZmlsZS4KKwkJICovCisJCXNhdmVfZXJybm8gPSAwOworCQlpZiAocy5zdF9kZXYgPT0gZGV2KSB7CisJCQlmb3IgKDs7KSB7CisJCQkJaWYgKCEoZHAgPSByZWFkZGlyKGRpcikpKQorCQkJCQlnb3RvIG5vdGZvdW5kOworCQkJCWlmIChkcC0+ZF9maWxlbm8gPT0gaW5vKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlCisJCQlmb3IgKDs7KSB7CisJCQkJaWYgKCEoZHAgPSByZWFkZGlyKGRpcikpKQorCQkJCQlnb3RvIG5vdGZvdW5kOworCQkJCWlmIChJU0RPVChkcCkpCisJCQkJCWNvbnRpbnVlOworCQkJCW1lbWNweShidXAsIGRwLT5kX25hbWUsIGRwLT5kX25hbWxlbiArIDEpOworCisJCQkJLyogU2F2ZSB0aGUgZmlyc3QgZXJyb3IgZm9yIGxhdGVyLiAqLworCQkJCWlmIChsc3RhdCh1cCwgJnMpKSB7CisJCQkJCWlmICghc2F2ZV9lcnJubykKKwkJCQkJCXNhdmVfZXJybm8gPSBlcnJubzsKKwkJCQkJZXJybm8gPSAwOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKHMuc3RfZGV2ID09IGRldiAmJiBzLnN0X2lubyA9PSBpbm8pCisJCQkJCWJyZWFrOworCQkJfQorCisJCS8qCisJCSAqIENoZWNrIGZvciBsZW5ndGggb2YgdGhlIGN1cnJlbnQgbmFtZSwgcHJlY2VkaW5nIHNsYXNoLAorCQkgKiBsZWFkaW5nIHNsYXNoLgorCQkgKi8KKwkJaWYgKGJwdCAtIHB0IDwgZHAtPmRfbmFtbGVuICsgKGZpcnN0ID8gMSA6IDIpKSB7CisJCQlzaXplX3QgbGVuOworCQkJY2hhciAqbnB0OworCisJCQlpZiAoIXB0c2l6ZSkgeworCQkJCWVycm5vID0gRVJBTkdFOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJbGVuID0gZXB0IC0gYnB0OworCQkJaWYgKChucHQgPSByZWFsbG9jKHB0LCBwdHNpemUgKj0gMikpID09IE5VTEwpCisJCQkJZ290byBlcnI7CisJCQlicHQgPSBucHQgKyAoYnB0IC0gcHQpOworCQkJcHQgPSBucHQ7CisJCQllcHQgPSBwdCArIHB0c2l6ZTsKKwkJCW1lbW1vdmUoZXB0IC0gbGVuLCBicHQsIGxlbik7CisJCQlicHQgPSBlcHQgLSBsZW47CisJCX0KKwkJaWYgKCFmaXJzdCkKKwkJCSotLWJwdCA9ICcvJzsKKwkJYnB0IC09IGRwLT5kX25hbWxlbjsKKwkJbWVtY3B5KGJwdCwgZHAtPmRfbmFtZSwgZHAtPmRfbmFtbGVuKTsKKwkJKHZvaWQpY2xvc2VkaXIoZGlyKTsKKworCQkvKiBUcnVuY2F0ZSBhbnkgZmlsZSBuYW1lLiAqLworCQkqYnVwID0gJ1wwJzsKKwl9CisKK25vdGZvdW5kOgorCS8qCisJICogSWYgcmVhZGRpciBzZXQgZXJybm8sIHVzZSBpdCwgbm90IGFueSBzYXZlZCBlcnJvcjsgb3RoZXJ3aXNlLAorCSAqIGRpZG4ndCBmaW5kIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpbiBpdHMgcGFyZW50IGRpcmVjdG9yeSwgc2V0CisJICogZXJybm8gdG8gRU5PRU5ULgorCSAqLworCWlmICghZXJybm8pCisJCWVycm5vID0gc2F2ZV9lcnJubyA/IHNhdmVfZXJybm8gOiBFTk9FTlQ7CisJLyogRkFMTFRIUk9VR0ggKi8KK2VycjoKKwlzYXZlX2Vycm5vID0gZXJybm87CisKKwlpZiAocHRzaXplKQorCQlmcmVlKHB0KTsKKwlmcmVlKHVwKTsKKwlpZiAoZGlyKQorCQkodm9pZCljbG9zZWRpcihkaXIpOworCisJZXJybm8gPSBzYXZlX2Vycm5vOworCisJcmV0dXJuIChOVUxMKTsKK30KKworI2VuZGlmIC8qICFkZWZpbmVkKEhBVkVfR0VUQ1dEKSAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9nZXRncm91cGxpc3QuYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvZ2V0Z3JvdXBsaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FmY2I5MgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvZ2V0Z3JvdXBsaXN0LmMKQEAgLTAsMCArMSw5NSBAQAorLyoJZnJvbSBPcGVuQlNEOiBnZXRncm91cGxpc3QuYyx2IDEuMTIgMjAwNS8wOC8wOCAwODowNTozNCBlc3BpZSBFeHAgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKiBPUEVOQlNEIE9SSUdJTkFMOiBsaWIvbGliYy9nZW4vZ2V0Z3JvdXBsaXN0LmMgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpZm5kZWYgSEFWRV9HRVRHUk9VUExJU1QKKworLyoKKyAqIGdldCBjcmVkZW50aWFsCisgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxncnAuaD4KKworaW50CitnZXRncm91cGxpc3QoY29uc3QgY2hhciAqdW5hbWUsIGdpZF90IGFncm91cCwgZ2lkX3QgKmdyb3VwcywgaW50ICpncnBjbnQpCit7CisJc3RydWN0IGdyb3VwICpncnA7CisJaW50IGksIG5ncm91cHM7CisJaW50IHJldCwgbWF4Z3JvdXBzOworCWludCBiYWlsOworCisJcmV0ID0gMDsKKwluZ3JvdXBzID0gMDsKKwltYXhncm91cHMgPSAqZ3JwY250OworCisJLyoKKwkgKiBpbnN0YWxsIHByaW1hcnkgZ3JvdXAKKwkgKi8KKwlpZiAobmdyb3VwcyA+PSBtYXhncm91cHMpIHsKKwkJKmdycGNudCA9IG5ncm91cHM7CisJCXJldHVybiAoLTEpOworCX0KKwlncm91cHNbbmdyb3VwcysrXSA9IGFncm91cDsKKworCS8qCisJICogU2NhbiB0aGUgZ3JvdXAgZmlsZSB0byBmaW5kIGFkZGl0aW9uYWwgZ3JvdXBzLgorCSAqLworCXNldGdyZW50KCk7CisJd2hpbGUgKChncnAgPSBnZXRncmVudCgpKSkgeworCQlpZiAoZ3JwLT5ncl9naWQgPT0gYWdyb3VwKQorCQkJY29udGludWU7CisJCWZvciAoYmFpbCA9IDAsIGkgPSAwOyBiYWlsID09IDAgJiYgaSA8IG5ncm91cHM7IGkrKykKKwkJCWlmIChncm91cHNbaV0gPT0gZ3JwLT5ncl9naWQpCisJCQkJYmFpbCA9IDE7CisJCWlmIChiYWlsKQorCQkJY29udGludWU7CisJCWZvciAoaSA9IDA7IGdycC0+Z3JfbWVtW2ldOyBpKyspIHsKKwkJCWlmICghc3RyY21wKGdycC0+Z3JfbWVtW2ldLCB1bmFtZSkpIHsKKwkJCQlpZiAobmdyb3VwcyA+PSBtYXhncm91cHMpIHsKKwkJCQkJcmV0ID0gLTE7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlncm91cHNbbmdyb3VwcysrXSA9IGdycC0+Z3JfZ2lkOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorb3V0OgorCWVuZGdyZW50KCk7CisJKmdycGNudCA9IG5ncm91cHM7CisJcmV0dXJuIChyZXQpOworfQorCisjZW5kaWYgLyogSEFWRV9HRVRHUk9VUExJU1QgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvZ2V0b3B0LmMgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2dldG9wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTBlNDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2dldG9wdC5jCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg3LCAxOTkzLCAxOTk0CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvc3RkbGliL2dldG9wdC5jICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorI2lmICFkZWZpbmVkKEhBVkVfR0VUT1BUKSB8fCAhZGVmaW5lZChIQVZFX0dFVE9QVF9PUFRSRVNFVCkKKworI2lmIGRlZmluZWQoTElCQ19TQ0NTKSAmJiAhZGVmaW5lZChsaW50KQorc3RhdGljIGNoYXIgKnJjc2lkID0gIiRPcGVuQlNEOiBnZXRvcHQuYyx2IDEuNSAyMDAzLzA2LzAyIDIwOjE4OjM3IG1pbGxlcnQgRXhwICQiOworI2VuZGlmIC8qIExJQkNfU0NDUyBhbmQgbm90IGxpbnQgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2ludAlCU0RvcHRlcnIgPSAxLAkJLyogaWYgZXJyb3IgbWVzc2FnZSBzaG91bGQgYmUgcHJpbnRlZCAqLworCUJTRG9wdGluZCA9IDEsCQkvKiBpbmRleCBpbnRvIHBhcmVudCBhcmd2IHZlY3RvciAqLworCUJTRG9wdG9wdCwJCS8qIGNoYXJhY3RlciBjaGVja2VkIGZvciB2YWxpZGl0eSAqLworCUJTRG9wdHJlc2V0OwkJLyogcmVzZXQgZ2V0b3B0ICovCitjaGFyCSpCU0RvcHRhcmc7CQkvKiBhcmd1bWVudCBhc3NvY2lhdGVkIHdpdGggb3B0aW9uICovCisKKyNkZWZpbmUJQkFEQ0gJKGludCknPycKKyNkZWZpbmUJQkFEQVJHCShpbnQpJzonCisjZGVmaW5lCUVNU0cJIiIKKworLyoKKyAqIGdldG9wdCAtLQorICoJUGFyc2UgYXJnYy9hcmd2IGFyZ3VtZW50IHZlY3Rvci4KKyAqLworaW50CitCU0RnZXRvcHQobmFyZ2MsIG5hcmd2LCBvc3RyKQorCWludCBuYXJnYzsKKwljaGFyICogY29uc3QgKm5hcmd2OworCWNvbnN0IGNoYXIgKm9zdHI7Cit7CisJZXh0ZXJuIGNoYXIgKl9fcHJvZ25hbWU7CisJc3RhdGljIGNoYXIgKnBsYWNlID0gRU1TRzsJCS8qIG9wdGlvbiBsZXR0ZXIgcHJvY2Vzc2luZyAqLworCWNoYXIgKm9saTsJCQkJLyogb3B0aW9uIGxldHRlciBsaXN0IGluZGV4ICovCisKKwlpZiAob3N0ciA9PSBOVUxMKQorCQlyZXR1cm4gKC0xKTsKKworCWlmIChCU0RvcHRyZXNldCB8fCAhKnBsYWNlKSB7CQkvKiB1cGRhdGUgc2Nhbm5pbmcgcG9pbnRlciAqLworCQlCU0RvcHRyZXNldCA9IDA7CisJCWlmIChCU0RvcHRpbmQgPj0gbmFyZ2MgfHwgKihwbGFjZSA9IG5hcmd2W0JTRG9wdGluZF0pICE9ICctJykgeworCQkJcGxhY2UgPSBFTVNHOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJaWYgKHBsYWNlWzFdICYmICorK3BsYWNlID09ICctJykgewkvKiBmb3VuZCAiLS0iICovCisJCQkrK0JTRG9wdGluZDsKKwkJCXBsYWNlID0gRU1TRzsKKwkJCXJldHVybiAoLTEpOworCQl9CisJfQkJCQkJLyogb3B0aW9uIGxldHRlciBva2F5PyAqLworCWlmICgoQlNEb3B0b3B0ID0gKGludCkqcGxhY2UrKykgPT0gKGludCknOicgfHwKKwkgICAgIShvbGkgPSBzdHJjaHIob3N0ciwgQlNEb3B0b3B0KSkpIHsKKwkJLyoKKwkJICogaWYgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgJy0nIGFzIGFuIG9wdGlvbiwKKwkJICogYXNzdW1lIGl0IG1lYW5zIC0xLgorCQkgKi8KKwkJaWYgKEJTRG9wdG9wdCA9PSAoaW50KSctJykKKwkJCXJldHVybiAoLTEpOworCQlpZiAoISpwbGFjZSkKKwkJCSsrQlNEb3B0aW5kOworCQlpZiAoQlNEb3B0ZXJyICYmICpvc3RyICE9ICc6JykKKwkJCSh2b2lkKWZwcmludGYoc3RkZXJyLAorCQkJICAgICIlczogaWxsZWdhbCBvcHRpb24gLS0gJWNcbiIsIF9fcHJvZ25hbWUsIEJTRG9wdG9wdCk7CisJCXJldHVybiAoQkFEQ0gpOworCX0KKwlpZiAoKisrb2xpICE9ICc6JykgewkJCS8qIGRvbid0IG5lZWQgYXJndW1lbnQgKi8KKwkJQlNEb3B0YXJnID0gTlVMTDsKKwkJaWYgKCEqcGxhY2UpCisJCQkrK0JTRG9wdGluZDsKKwl9CisJZWxzZSB7CQkJCQkvKiBuZWVkIGFuIGFyZ3VtZW50ICovCisJCWlmICgqcGxhY2UpCQkJLyogbm8gd2hpdGUgc3BhY2UgKi8KKwkJCUJTRG9wdGFyZyA9IHBsYWNlOworCQllbHNlIGlmIChuYXJnYyA8PSArK0JTRG9wdGluZCkgewkvKiBubyBhcmcgKi8KKwkJCXBsYWNlID0gRU1TRzsKKwkJCWlmICgqb3N0ciA9PSAnOicpCisJCQkJcmV0dXJuIChCQURBUkcpOworCQkJaWYgKEJTRG9wdGVycikKKwkJCQkodm9pZClmcHJpbnRmKHN0ZGVyciwKKwkJCQkgICAgIiVzOiBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQgLS0gJWNcbiIsCisJCQkJICAgIF9fcHJvZ25hbWUsIEJTRG9wdG9wdCk7CisJCQlyZXR1cm4gKEJBRENIKTsKKwkJfQorCSAJZWxzZQkJCQkvKiB3aGl0ZSBzcGFjZSAqLworCQkJQlNEb3B0YXJnID0gbmFyZ3ZbQlNEb3B0aW5kXTsKKwkJcGxhY2UgPSBFTVNHOworCQkrK0JTRG9wdGluZDsKKwl9CisJcmV0dXJuIChCU0RvcHRvcHQpOwkJCS8qIGR1bXAgYmFjayBvcHRpb24gbGV0dGVyICovCit9CisKKyNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX0dFVE9QVCkgfHwgIWRlZmluZWQoSEFWRV9PUFRSRVNFVCkgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvZ2V0cnJzZXRieW5hbWUtbGRucy5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9nZXRycnNldGJ5bmFtZS1sZG5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlNTY3OAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvZ2V0cnJzZXRieW5hbWUtbGRucy5jCkBAIC0wLDAgKzEsMjg0IEBACisvKiAkT3BlbkJTRDogZ2V0cnJzZXRieW5hbWUuYyx2IDEuMTAgMjAwNS8wMy8zMCAwMjo1ODoyOCB0ZWR1IEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgU2ltb24gVmFsbGV0IC8gR2Vub3Njb3BlIDxzdmFsbGV0QGdlbm9zY29wZS5jbnMuZnI+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIEludGVybmV0IFNvZnR3YXJlIENvbnNvcnRpdW0uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBJTlRFUk5FVCBTT0ZUV0FSRSBDT05TT1JUSVVNCisgKiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTAorICogSU5URVJORVQgU09GVFdBUkUgQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsCisgKiBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HCisgKiBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaWYgIWRlZmluZWQgKEhBVkVfR0VUUlJTRVRCWU5BTUUpICYmIGRlZmluZWQgKEhBVkVfTEROUykKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8bGRucy9sZG5zLmg+CisKKyNpbmNsdWRlICJnZXRycnNldGJ5bmFtZS5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKworI2RlZmluZSBtYWxsb2MoeCkJKHhtYWxsb2MoeCkpCisjZGVmaW5lIGNhbGxvYyh4LCB5KQkoeGNhbGxvYygoeCksKHkpKSkKKyNkZWZpbmUgZnJlZSh4KQkJKHhmcmVlKHgpKQorCitpbnQKK2dldHJyc2V0YnluYW1lKGNvbnN0IGNoYXIgKmhvc3RuYW1lLCB1bnNpZ25lZCBpbnQgcmRjbGFzcywKKwkgICAgICAgdW5zaWduZWQgaW50IHJkdHlwZSwgdW5zaWduZWQgaW50IGZsYWdzLAorCSAgICAgICBzdHJ1Y3QgcnJzZXRpbmZvICoqcmVzKQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgaW50IGksIGosIGluZGV4X2FucywgaW5kZXhfc2lnOworCXN0cnVjdCBycnNldGluZm8gKnJyc2V0ID0gTlVMTDsKKwlzdHJ1Y3QgcmRhdGFpbmZvICpyZGF0YTsKKwlzaXplX3QgbGVuOworCWxkbnNfcmVzb2x2ZXIgKmxkbnNfcmVzOworCWxkbnNfcmRmICpkb21haW4gPSBOVUxMOworCWxkbnNfcGt0ICpwa3QgPSBOVUxMOworCWxkbnNfcnJfbGlzdCAqcnJzaWdzID0gTlVMTCwgKnJyZGF0YSA9IE5VTEw7CisJbGRuc19zdGF0dXMgZXJyOworCWxkbnNfcnIgKnJyOworCisJLyogY2hlY2sgZm9yIGludmFsaWQgY2xhc3MgYW5kIHR5cGUgKi8KKwlpZiAocmRjbGFzcyA+IDB4ZmZmZiB8fCByZHR5cGUgPiAweGZmZmYpIHsKKwkJcmVzdWx0ID0gRVJSU0VUX0lOVkFMOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogZG9uJ3QgYWxsb3cgcXVlcmllcyBvZiBjbGFzcyBvciB0eXBlIEFOWSAqLworCWlmIChyZGNsYXNzID09IDB4ZmYgfHwgcmR0eXBlID09IDB4ZmYpIHsKKwkJcmVzdWx0ID0gRVJSU0VUX0lOVkFMOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogZG9uJ3QgYWxsb3cgZmxhZ3MgeWV0LCB1bmltcGxlbWVudGVkICovCisJaWYgKGZsYWdzKSB7CisJCXJlc3VsdCA9IEVSUlNFVF9JTlZBTDsKKwkJZ290byBmYWlsOworCX0KKworCS8qIEluaXRpYWxpemUgcmVzb2x2ZXIgZnJvbSByZXNvbHYuY29uZiAqLworCWRvbWFpbiA9IGxkbnNfZG5hbWVfbmV3X2ZybV9zdHIoaG9zdG5hbWUpOworCWlmICgoZXJyID0gbGRuc19yZXNvbHZlcl9uZXdfZnJtX2ZpbGUoJmxkbnNfcmVzLCBOVUxMKSkgIT0gXAorCSAgICBMRE5TX1NUQVRVU19PSykgeworCQlyZXN1bHQgPSBFUlJTRVRfRkFJTDsKKwkJZ290byBmYWlsOworCX0KKworI2lmZGVmIExETlNfREVCVUcKKwlsZG5zX3Jlc29sdmVyX3NldF9kZWJ1ZyhsZG5zX3JlcywgdHJ1ZSk7CisjZW5kaWYgLyogTEROU19ERUJVRyAqLworCisJbGRuc19yZXNvbHZlcl9zZXRfZG5zc2VjKGxkbnNfcmVzLCB0cnVlKTsgLyogVXNlIEROU1NFQyAqLworCisJLyogbWFrZSBxdWVyeSAqLworCXBrdCA9IGxkbnNfcmVzb2x2ZXJfcXVlcnkobGRuc19yZXMsIGRvbWFpbiwgcmR0eXBlLCByZGNsYXNzLCBMRE5TX1JEKTsKKworCS8qKiogVE9ETzogZmluZXIgZXJyY29kZXMgLS0gc2VlIG9yaWdpbmFsICoqLworCWlmICghcGt0IHx8IGxkbnNfcGt0X2FuY291bnQocGt0KSA8IDEpIHsKKwkJcmVzdWx0ID0gRVJSU0VUX0ZBSUw7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBpbml0aWFsaXplIHJyc2V0ICovCisJcnJzZXQgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBycnNldGluZm8pKTsKKwlpZiAocnJzZXQgPT0gTlVMTCkgeworCQlyZXN1bHQgPSBFUlJTRVRfTk9NRU1PUlk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlycmRhdGEgPSBsZG5zX3BrdF9ycl9saXN0X2J5X3R5cGUocGt0LCByZHR5cGUsIExETlNfU0VDVElPTl9BTlNXRVIpOworCXJyc2V0LT5ycmlfbnJkYXRhcyA9IGxkbnNfcnJfbGlzdF9ycl9jb3VudChycmRhdGEpOworCWlmICghcnJzZXQtPnJyaV9ucmRhdGFzKSB7CisJCXJlc3VsdCA9IEVSUlNFVF9OT0RBVEE7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBjb3B5IG5hbWUgZnJvbSBhbnN3ZXIgc2VjdGlvbiAqLworCWxlbiA9IGxkbnNfcmRmX3NpemUobGRuc19ycl9vd25lcihsZG5zX3JyX2xpc3RfcnIocnJkYXRhLCAwKSkpOworCWlmICgocnJzZXQtPnJyaV9uYW1lID0gbWFsbG9jKGxlbikpID09IE5VTEwpIHsKKwkJcmVzdWx0ID0gRVJSU0VUX05PTUVNT1JZOworCQlnb3RvIGZhaWw7CisJfQorCW1lbWNweShycnNldC0+cnJpX25hbWUsCisJICAgIGxkbnNfcmRmX2RhdGEobGRuc19ycl9vd25lcihsZG5zX3JyX2xpc3RfcnIocnJkYXRhLCAwKSkpLCBsZW4pOworCisJcnJzZXQtPnJyaV9yZGNsYXNzID0gbGRuc19ycl9nZXRfY2xhc3MobGRuc19ycl9saXN0X3JyKHJyZGF0YSwgMCkpOworCXJyc2V0LT5ycmlfcmR0eXBlID0gbGRuc19ycl9nZXRfdHlwZShsZG5zX3JyX2xpc3RfcnIocnJkYXRhLCAwKSk7CisJcnJzZXQtPnJyaV90dGwgPSBsZG5zX3JyX3R0bChsZG5zX3JyX2xpc3RfcnIocnJkYXRhLCAwKSk7CisKKwlkZWJ1ZzIoImxkbnM6IGdvdCAldSBhbnN3ZXJzIGZyb20gRE5TIiwgcnJzZXQtPnJyaV9ucmRhdGFzKTsKKworCS8qIENoZWNrIGZvciBhdXRoZW50aWNhdGVkIGRhdGEgKi8KKwlpZiAobGRuc19wa3RfYWQocGt0KSkgeworCQlycnNldC0+cnJpX2ZsYWdzIHw9IFJSU0VUX1ZBTElEQVRFRDsKKwl9IGVsc2UgeyAvKiBBRCBpcyBub3Qgc2V0LCB0cnkgYXV0b25vbW91cyB2YWxpZGF0aW9uICovCisJCWxkbnNfcnJfbGlzdCAqIHRydXN0ZWRfa2V5cyA9IGxkbnNfcnJfbGlzdF9uZXcoKTsKKworCQlkZWJ1ZzIoImxkbnM6IHRyeWluZyB0byB2YWxpZGF0ZSBSUnNldCIpOworCQkvKiBHZXQgZXZlbnR1YWwgc2lncyAqLworCQlycnNpZ3MgPSBsZG5zX3BrdF9ycl9saXN0X2J5X3R5cGUocGt0LCBMRE5TX1JSX1RZUEVfUlJTSUcsCisJCSAgICBMRE5TX1NFQ1RJT05fQU5TV0VSKTsKKworCQlycnNldC0+cnJpX25zaWdzID0gbGRuc19ycl9saXN0X3JyX2NvdW50KHJyc2lncyk7CisJCWRlYnVnMigibGRuczogZ290ICV1IHNpZ25hdHVyZShzKSAoUlJUWVBFICV1KSBmcm9tIEROUyIsCisJCSAgICAgICBycnNldC0+cnJpX25zaWdzLCBMRE5TX1JSX1RZUEVfUlJTSUcpOworCisJCWlmICgoZXJyID0gbGRuc192ZXJpZnlfdHJ1c3RlZChsZG5zX3JlcywgcnJkYXRhLCBycnNpZ3MsCisJCSAgICAgdHJ1c3RlZF9rZXlzKSkgPT0gTEROU19TVEFUVVNfT0spIHsKKwkJCXJyc2V0LT5ycmlfZmxhZ3MgfD0gUlJTRVRfVkFMSURBVEVEOworCQkJZGVidWcyKCJsZG5zOiBSUnNldCBpcyBzaWduZWQgd2l0aCBhIHZhbGlkIGtleSIpOworCQl9IGVsc2UgeworCQkJZGVidWcyKCJsZG5zOiBSUnNldCB2YWxpZGF0aW9uIGZhaWxlZDogJXMiLAorCQkJICAgIGxkbnNfZ2V0X2Vycm9yc3RyX2J5X2lkKGVycikpOworCQl9CisKKwkJbGRuc19ycl9saXN0X2RlZXBfZnJlZSh0cnVzdGVkX2tleXMpOworCX0KKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgYW5zd2VycyAqLworCXJyc2V0LT5ycmlfcmRhdGFzID0gY2FsbG9jKHJyc2V0LT5ycmlfbnJkYXRhcywKKwkgICBzaXplb2Yoc3RydWN0IHJkYXRhaW5mbykpOworCisJaWYgKHJyc2V0LT5ycmlfcmRhdGFzID09IE5VTEwpIHsKKwkJcmVzdWx0ID0gRVJSU0VUX05PTUVNT1JZOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBzaWduYXR1cmVzICovCisJaWYgKHJyc2V0LT5ycmlfbnNpZ3MgPiAwKSB7CisJCXJyc2V0LT5ycmlfc2lncyA9IGNhbGxvYyhycnNldC0+cnJpX25zaWdzLAorCQkgICAgc2l6ZW9mKHN0cnVjdCByZGF0YWluZm8pKTsKKworCQlpZiAocnJzZXQtPnJyaV9zaWdzID09IE5VTEwpIHsKKwkJCXJlc3VsdCA9IEVSUlNFVF9OT01FTU9SWTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCS8qIGNvcHkgYW5zd2VycyAmIHNpZ25hdHVyZXMgKi8KKwlmb3IgKGk9MCwgaW5kZXhfYW5zPTAsIGluZGV4X3NpZz0wOyBpPCBwa3QtPl9oZWFkZXItPl9hbmNvdW50OyBpKyspIHsKKwkJcmRhdGEgPSBOVUxMOworCQlyciA9IGxkbnNfcnJfbGlzdF9ycihsZG5zX3BrdF9hbnN3ZXIocGt0KSwgaSk7CisKKwkJaWYgKGxkbnNfcnJfZ2V0X2NsYXNzKHJyKSA9PSBycnNldC0+cnJpX3JkY2xhc3MgJiYKKwkJICAgIGxkbnNfcnJfZ2V0X3R5cGUocnIpID09IHJyc2V0LT5ycmlfcmR0eXBlKSB7CisJCQlyZGF0YSA9ICZycnNldC0+cnJpX3JkYXRhc1tpbmRleF9hbnMrK107CisJCX0KKworCQlpZiAocnItPl9ycl9jbGFzcyA9PSBycnNldC0+cnJpX3JkY2xhc3MgJiYKKwkJICAgIHJyLT5fcnJfdHlwZSA9PSBMRE5TX1JSX1RZUEVfUlJTSUcpIHsKKwkJCXJkYXRhID0gJnJyc2V0LT5ycmlfc2lnc1tpbmRleF9zaWcrK107CisJCX0KKworCQlpZiAocmRhdGEpIHsKKwkJCXNpemVfdCByZGF0YV9vZmZzZXQgPSAwOworCisJCQlyZGF0YS0+cmRpX2xlbmd0aCA9IDA7CisJCQlmb3IgKGo9MDsgajwgcnItPl9yZF9jb3VudDsgaisrKSB7CisJCQkJcmRhdGEtPnJkaV9sZW5ndGggKz0KKwkJCQkgICAgbGRuc19yZGZfc2l6ZShsZG5zX3JyX3JkZihyciwgaikpOworCQkJfQorCisJCQlyZGF0YS0+cmRpX2RhdGEgPSBtYWxsb2MocmRhdGEtPnJkaV9sZW5ndGgpOworCQkJaWYgKHJkYXRhLT5yZGlfZGF0YSA9PSBOVUxMKSB7CisJCQkJcmVzdWx0ID0gRVJSU0VUX05PTUVNT1JZOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKworCQkJLyogUmUtY3JlYXRlIHRoZSByYXcgRE5TIFJEQVRBICovCisJCQlmb3IgKGo9MDsgajwgcnItPl9yZF9jb3VudDsgaisrKSB7CisJCQkJbGVuID0gbGRuc19yZGZfc2l6ZShsZG5zX3JyX3JkZihyciwgaikpOworCQkJCW1lbWNweShyZGF0YS0+cmRpX2RhdGEgKyByZGF0YV9vZmZzZXQsCisJCQkJICAgICAgIGxkbnNfcmRmX2RhdGEobGRuc19ycl9yZGYocnIsIGopKSwgbGVuKTsKKwkJCQlyZGF0YV9vZmZzZXQgKz0gbGVuOworCQkJfQorCQl9CisJfQorCisJKnJlcyA9IHJyc2V0OworCXJlc3VsdCA9IEVSUlNFVF9TVUNDRVNTOworCitmYWlsOgorCS8qIGZyZWVycnNldChycnNldCk7ICovCisJbGRuc19yZGZfZGVlcF9mcmVlKGRvbWFpbik7CisJbGRuc19wa3RfZnJlZShwa3QpOworCWxkbnNfcnJfbGlzdF9kZWVwX2ZyZWUocnJzaWdzKTsKKwlsZG5zX3JyX2xpc3RfZGVlcF9mcmVlKHJyZGF0YSk7CisJbGRuc19yZXNvbHZlcl9kZWVwX2ZyZWUobGRuc19yZXMpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworCit2b2lkCitmcmVlcnJzZXQoc3RydWN0IHJyc2V0aW5mbyAqcnJzZXQpCit7CisJdV9pbnQxNl90IGk7CisKKwlpZiAocnJzZXQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKHJyc2V0LT5ycmlfcmRhdGFzKSB7CisJCWZvciAoaSA9IDA7IGkgPCBycnNldC0+cnJpX25yZGF0YXM7IGkrKykgeworCQkJaWYgKHJyc2V0LT5ycmlfcmRhdGFzW2ldLnJkaV9kYXRhID09IE5VTEwpCisJCQkJYnJlYWs7CisJCQlmcmVlKHJyc2V0LT5ycmlfcmRhdGFzW2ldLnJkaV9kYXRhKTsKKwkJfQorCQlmcmVlKHJyc2V0LT5ycmlfcmRhdGFzKTsKKwl9CisKKwlpZiAocnJzZXQtPnJyaV9zaWdzKSB7CisJCWZvciAoaSA9IDA7IGkgPCBycnNldC0+cnJpX25zaWdzOyBpKyspIHsKKwkJCWlmIChycnNldC0+cnJpX3NpZ3NbaV0ucmRpX2RhdGEgPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJCWZyZWUocnJzZXQtPnJyaV9zaWdzW2ldLnJkaV9kYXRhKTsKKwkJfQorCQlmcmVlKHJyc2V0LT5ycmlfc2lncyk7CisJfQorCisJaWYgKHJyc2V0LT5ycmlfbmFtZSkKKwkJZnJlZShycnNldC0+cnJpX25hbWUpOworCWZyZWUocnJzZXQpOworfQorCisKKyNlbmRpZiAvKiAhZGVmaW5lZCAoSEFWRV9HRVRSUlNFVEJZTkFNRSkgJiYgZGVmaW5lZCAoSEFWRV9MRE5TKSAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9nZXRycnNldGJ5bmFtZS5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9nZXRycnNldGJ5bmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNmZlMDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2dldHJyc2V0YnluYW1lLmMKQEAgLTAsMCArMSw2MTAgQEAKKy8qICRPcGVuQlNEOiBnZXRycnNldGJ5bmFtZS5jLHYgMS4xMSAyMDA3LzEwLzExIDE4OjM2OjQxIGpha29iIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSmFrb2IgU2NobHl0ZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIEludGVybmV0IFNvZnR3YXJlIENvbnNvcnRpdW0uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBJTlRFUk5FVCBTT0ZUV0FSRSBDT05TT1JUSVVNCisgKiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTAorICogSU5URVJORVQgU09GVFdBUkUgQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsCisgKiBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HCisgKiBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qIE9QRU5CU0QgT1JJR0lOQUw6IGxpYi9saWJjL25ldC9nZXRycnNldGJ5bmFtZS5jICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaWYgIWRlZmluZWQgKEhBVkVfR0VUUlJTRVRCWU5BTUUpICYmICFkZWZpbmVkIChIQVZFX0xETlMpCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgImdldHJyc2V0YnluYW1lLmgiCisKKyNpZiBkZWZpbmVkKEhBVkVfREVDTF9IX0VSUk5PKSAmJiAhSEFWRV9ERUNMX0hfRVJSTk8KK2V4dGVybiBpbnQgaF9lcnJubzsKKyNlbmRpZgorCisvKiBXZSBkb24ndCBuZWVkIG11bHRpdGhyZWFkIHN1cHBvcnQgaGVyZSAqLworI2lmZGVmIF9USFJFQURfUFJJVkFURQorIyB1bmRlZiBfVEhSRUFEX1BSSVZBVEUKKyNlbmRpZgorI2RlZmluZSBfVEhSRUFEX1BSSVZBVEUoYSxiLGMpIChjKQorCisjaWZuZGVmIEhBVkVfX1JFU19FWFRFUk4KK3N0cnVjdCBfX3Jlc19zdGF0ZSBfcmVzOworI2VuZGlmCisKKy8qIE5lY2Vzc2FyeSBmdW5jdGlvbnMgYW5kIG1hY3JvcyAqLworCisvKgorICogSW5saW5lIHZlcnNpb25zIG9mIGdldC9wdXQgc2hvcnQvbG9uZy4gIFBvaW50ZXIgaXMgYWR2YW5jZWQuCisgKgorICogVGhlc2UgbWFjcm9zIGRlbW9uc3RyYXRlIHRoZSBwcm9wZXJ0eSBvZiBDIHdoZXJlYnkgaXQgY2FuIGJlCisgKiBwb3J0YWJsZSBvciBpdCBjYW4gYmUgZWxlZ2FudCBidXQgcmFyZWx5IGJvdGguCisgKi8KKworI2lmbmRlZiBJTlQzMlNaCisjIGRlZmluZSBJTlQzMlNaCTQKKyNlbmRpZgorI2lmbmRlZiBJTlQxNlNaCisjIGRlZmluZSBJTlQxNlNaCTIKKyNlbmRpZgorCisjaWZuZGVmIEdFVFNIT1JUCisjZGVmaW5lIEdFVFNIT1JUKHMsIGNwKSB7IFwKKwlyZWdpc3RlciB1X2NoYXIgKnRfY3AgPSAodV9jaGFyICopKGNwKTsgXAorCShzKSA9ICgodV9pbnQxNl90KXRfY3BbMF0gPDwgOCkgXAorCSAgICB8ICgodV9pbnQxNl90KXRfY3BbMV0pIFwKKwkgICAgOyBcCisJKGNwKSArPSBJTlQxNlNaOyBcCit9CisjZW5kaWYKKworI2lmbmRlZiBHRVRMT05HCisjZGVmaW5lIEdFVExPTkcobCwgY3ApIHsgXAorCXJlZ2lzdGVyIHVfY2hhciAqdF9jcCA9ICh1X2NoYXIgKikoY3ApOyBcCisJKGwpID0gKCh1X2ludDMyX3QpdF9jcFswXSA8PCAyNCkgXAorCSAgICB8ICgodV9pbnQzMl90KXRfY3BbMV0gPDwgMTYpIFwKKwkgICAgfCAoKHVfaW50MzJfdCl0X2NwWzJdIDw8IDgpIFwKKwkgICAgfCAoKHVfaW50MzJfdCl0X2NwWzNdKSBcCisJICAgIDsgXAorCShjcCkgKz0gSU5UMzJTWjsgXAorfQorI2VuZGlmCisKKy8qCisgKiBSb3V0aW5lcyB0byBpbnNlcnQvZXh0cmFjdCBzaG9ydC9sb25nJ3MuCisgKi8KKworI2lmbmRlZiBIQVZFX19HRVRTSE9SVAorc3RhdGljIHVfaW50MTZfdAorX2dldHNob3J0KG1zZ3ApCisJcmVnaXN0ZXIgY29uc3QgdV9jaGFyICptc2dwOworeworCXJlZ2lzdGVyIHVfaW50MTZfdCB1OworCisJR0VUU0hPUlQodSwgbXNncCk7CisJcmV0dXJuICh1KTsKK30KKyNlbGlmIGRlZmluZWQoSEFWRV9ERUNMX19HRVRTSE9SVCkgJiYgKEhBVkVfREVDTF9fR0VUU0hPUlQgPT0gMCkKK3VfaW50MTZfdCBfZ2V0c2hvcnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICopOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9fR0VUTE9ORworc3RhdGljIHVfaW50MzJfdAorX2dldGxvbmcobXNncCkKKwlyZWdpc3RlciBjb25zdCB1X2NoYXIgKm1zZ3A7Cit7CisJcmVnaXN0ZXIgdV9pbnQzMl90IHU7CisKKwlHRVRMT05HKHUsIG1zZ3ApOworCXJldHVybiAodSk7Cit9CisjZWxpZiBkZWZpbmVkKEhBVkVfREVDTF9fR0VUTE9ORykgJiYgKEhBVkVfREVDTF9fR0VUTE9ORyA9PSAwKQordV9pbnQzMl90IF9nZXRsb25nKHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqKTsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIEFOU1dFUl9CVUZGRVJfU0laRSAweGZmZmYKKworc3RydWN0IGRuc19xdWVyeSB7CisJY2hhcgkJCSpuYW1lOworCXVfaW50MTZfdAkJdHlwZTsKKwl1X2ludDE2X3QJCWNsYXNzOworCXN0cnVjdCBkbnNfcXVlcnkJKm5leHQ7Cit9OworCitzdHJ1Y3QgZG5zX3JyIHsKKwljaGFyCQkJKm5hbWU7CisJdV9pbnQxNl90CQl0eXBlOworCXVfaW50MTZfdAkJY2xhc3M7CisJdV9pbnQxNl90CQl0dGw7CisJdV9pbnQxNl90CQlzaXplOworCXZvaWQJCQkqcmRhdGE7CisJc3RydWN0IGRuc19ycgkJKm5leHQ7Cit9OworCitzdHJ1Y3QgZG5zX3Jlc3BvbnNlIHsKKwlIRUFERVIJCQloZWFkZXI7CisJc3RydWN0IGRuc19xdWVyeQkqcXVlcnk7CisJc3RydWN0IGRuc19ycgkJKmFuc3dlcjsKKwlzdHJ1Y3QgZG5zX3JyCQkqYXV0aG9yaXR5OworCXN0cnVjdCBkbnNfcnIJCSphZGRpdGlvbmFsOworfTsKKworc3RhdGljIHN0cnVjdCBkbnNfcmVzcG9uc2UgKnBhcnNlX2Ruc19yZXNwb25zZShjb25zdCB1X2NoYXIgKiwgaW50KTsKK3N0YXRpYyBzdHJ1Y3QgZG5zX3F1ZXJ5ICpwYXJzZV9kbnNfcXNlY3Rpb24oY29uc3QgdV9jaGFyICosIGludCwKKyAgICBjb25zdCB1X2NoYXIgKiosIGludCk7CitzdGF0aWMgc3RydWN0IGRuc19yciAqcGFyc2VfZG5zX3Jyc2VjdGlvbihjb25zdCB1X2NoYXIgKiwgaW50LCBjb25zdCB1X2NoYXIgKiosCisgICAgaW50KTsKKworc3RhdGljIHZvaWQgZnJlZV9kbnNfcXVlcnkoc3RydWN0IGRuc19xdWVyeSAqKTsKK3N0YXRpYyB2b2lkIGZyZWVfZG5zX3JyKHN0cnVjdCBkbnNfcnIgKik7CitzdGF0aWMgdm9pZCBmcmVlX2Ruc19yZXNwb25zZShzdHJ1Y3QgZG5zX3Jlc3BvbnNlICopOworCitzdGF0aWMgaW50IGNvdW50X2Ruc19ycihzdHJ1Y3QgZG5zX3JyICosIHVfaW50MTZfdCwgdV9pbnQxNl90KTsKKworaW50CitnZXRycnNldGJ5bmFtZShjb25zdCBjaGFyICpob3N0bmFtZSwgdW5zaWduZWQgaW50IHJkY2xhc3MsCisgICAgdW5zaWduZWQgaW50IHJkdHlwZSwgdW5zaWduZWQgaW50IGZsYWdzLAorICAgIHN0cnVjdCBycnNldGluZm8gKipyZXMpCit7CisJc3RydWN0IF9fcmVzX3N0YXRlICpfcmVzcCA9IF9USFJFQURfUFJJVkFURShfcmVzLCBfcmVzLCAmX3Jlcyk7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcnJzZXRpbmZvICpycnNldCA9IE5VTEw7CisJc3RydWN0IGRuc19yZXNwb25zZSAqcmVzcG9uc2UgPSBOVUxMOworCXN0cnVjdCBkbnNfcnIgKnJyOworCXN0cnVjdCByZGF0YWluZm8gKnJkYXRhOworCWludCBsZW5ndGg7CisJdW5zaWduZWQgaW50IGluZGV4X2FucywgaW5kZXhfc2lnOworCXVfY2hhciBhbnN3ZXJbQU5TV0VSX0JVRkZFUl9TSVpFXTsKKworCS8qIGNoZWNrIGZvciBpbnZhbGlkIGNsYXNzIGFuZCB0eXBlICovCisJaWYgKHJkY2xhc3MgPiAweGZmZmYgfHwgcmR0eXBlID4gMHhmZmZmKSB7CisJCXJlc3VsdCA9IEVSUlNFVF9JTlZBTDsKKwkJZ290byBmYWlsOworCX0KKworCS8qIGRvbid0IGFsbG93IHF1ZXJpZXMgb2YgY2xhc3Mgb3IgdHlwZSBBTlkgKi8KKwlpZiAocmRjbGFzcyA9PSAweGZmIHx8IHJkdHlwZSA9PSAweGZmKSB7CisJCXJlc3VsdCA9IEVSUlNFVF9JTlZBTDsKKwkJZ290byBmYWlsOworCX0KKworCS8qIGRvbid0IGFsbG93IGZsYWdzIHlldCwgdW5pbXBsZW1lbnRlZCAqLworCWlmIChmbGFncykgeworCQlyZXN1bHQgPSBFUlJTRVRfSU5WQUw7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBpbml0aWFsaXplIHJlc29sdmVyICovCisJaWYgKChfcmVzcC0+b3B0aW9ucyAmIFJFU19JTklUKSA9PSAwICYmIHJlc19pbml0KCkgPT0gLTEpIHsKKwkJcmVzdWx0ID0gRVJSU0VUX0ZBSUw7CisJCWdvdG8gZmFpbDsKKwl9CisKKyNpZmRlZiBERUJVRworCV9yZXNwLT5vcHRpb25zIHw9IFJFU19ERUJVRzsKKyNlbmRpZiAvKiBERUJVRyAqLworCisjaWZkZWYgUkVTX1VTRV9ETlNTRUMKKwkvKiB0dXJuIG9uIEROU1NFQyBpZiBFRE5TMCBpcyBjb25maWd1cmVkICovCisJaWYgKF9yZXNwLT5vcHRpb25zICYgUkVTX1VTRV9FRE5TMCkKKwkJX3Jlc3AtPm9wdGlvbnMgfD0gUkVTX1VTRV9ETlNTRUM7CisjZW5kaWYgLyogUkVTX1VTRV9ETlNFQyAqLworCisJLyogbWFrZSBxdWVyeSAqLworCWxlbmd0aCA9IHJlc19xdWVyeShob3N0bmFtZSwgKHNpZ25lZCBpbnQpIHJkY2xhc3MsIChzaWduZWQgaW50KSByZHR5cGUsCisJICAgIGFuc3dlciwgc2l6ZW9mKGFuc3dlcikpOworCWlmIChsZW5ndGggPCAwKSB7CisJCXN3aXRjaChoX2Vycm5vKSB7CisJCWNhc2UgSE9TVF9OT1RfRk9VTkQ6CisJCQlyZXN1bHQgPSBFUlJTRVRfTk9OQU1FOworCQkJZ290byBmYWlsOworCQljYXNlIE5PX0RBVEE6CisJCQlyZXN1bHQgPSBFUlJTRVRfTk9EQVRBOworCQkJZ290byBmYWlsOworCQlkZWZhdWx0OgorCQkJcmVzdWx0ID0gRVJSU0VUX0ZBSUw7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwkvKiBwYXJzZSByZXN1bHQgKi8KKwlyZXNwb25zZSA9IHBhcnNlX2Ruc19yZXNwb25zZShhbnN3ZXIsIGxlbmd0aCk7CisJaWYgKHJlc3BvbnNlID09IE5VTEwpIHsKKwkJcmVzdWx0ID0gRVJSU0VUX0ZBSUw7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAocmVzcG9uc2UtPmhlYWRlci5xZGNvdW50ICE9IDEpIHsKKwkJcmVzdWx0ID0gRVJSU0VUX0ZBSUw7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBpbml0aWFsaXplIHJyc2V0ICovCisJcnJzZXQgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBycnNldGluZm8pKTsKKwlpZiAocnJzZXQgPT0gTlVMTCkgeworCQlyZXN1bHQgPSBFUlJTRVRfTk9NRU1PUlk7CisJCWdvdG8gZmFpbDsKKwl9CisJcnJzZXQtPnJyaV9yZGNsYXNzID0gcmVzcG9uc2UtPnF1ZXJ5LT5jbGFzczsKKwlycnNldC0+cnJpX3JkdHlwZSA9IHJlc3BvbnNlLT5xdWVyeS0+dHlwZTsKKwlycnNldC0+cnJpX3R0bCA9IHJlc3BvbnNlLT5hbnN3ZXItPnR0bDsKKwlycnNldC0+cnJpX25yZGF0YXMgPSByZXNwb25zZS0+aGVhZGVyLmFuY291bnQ7CisKKyNpZmRlZiBIQVZFX0hFQURFUl9BRAorCS8qIGNoZWNrIGZvciBhdXRoZW50aWNhdGVkIGRhdGEgKi8KKwlpZiAocmVzcG9uc2UtPmhlYWRlci5hZCA9PSAxKQorCQlycnNldC0+cnJpX2ZsYWdzIHw9IFJSU0VUX1ZBTElEQVRFRDsKKyNlbmRpZgorCisJLyogY29weSBuYW1lIGZyb20gYW5zd2VyIHNlY3Rpb24gKi8KKwlycnNldC0+cnJpX25hbWUgPSBzdHJkdXAocmVzcG9uc2UtPmFuc3dlci0+bmFtZSk7CisJaWYgKHJyc2V0LT5ycmlfbmFtZSA9PSBOVUxMKSB7CisJCXJlc3VsdCA9IEVSUlNFVF9OT01FTU9SWTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIGNvdW50IGFuc3dlcnMgKi8KKwlycnNldC0+cnJpX25yZGF0YXMgPSBjb3VudF9kbnNfcnIocmVzcG9uc2UtPmFuc3dlciwgcnJzZXQtPnJyaV9yZGNsYXNzLAorCSAgICBycnNldC0+cnJpX3JkdHlwZSk7CisJcnJzZXQtPnJyaV9uc2lncyA9IGNvdW50X2Ruc19ycihyZXNwb25zZS0+YW5zd2VyLCBycnNldC0+cnJpX3JkY2xhc3MsCisJICAgIFRfUlJTSUcpOworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBhbnN3ZXJzICovCisJcnJzZXQtPnJyaV9yZGF0YXMgPSBjYWxsb2MocnJzZXQtPnJyaV9ucmRhdGFzLAorCSAgICBzaXplb2Yoc3RydWN0IHJkYXRhaW5mbykpOworCWlmIChycnNldC0+cnJpX3JkYXRhcyA9PSBOVUxMKSB7CisJCXJlc3VsdCA9IEVSUlNFVF9OT01FTU9SWTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igc2lnbmF0dXJlcyAqLworCWlmIChycnNldC0+cnJpX25zaWdzID4gMCkgeworCQlycnNldC0+cnJpX3NpZ3MgPSBjYWxsb2MocnJzZXQtPnJyaV9uc2lncywgc2l6ZW9mKHN0cnVjdCByZGF0YWluZm8pKTsKKwkJaWYgKHJyc2V0LT5ycmlfc2lncyA9PSBOVUxMKSB7CisJCQlyZXN1bHQgPSBFUlJTRVRfTk9NRU1PUlk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwkvKiBjb3B5IGFuc3dlcnMgJiBzaWduYXR1cmVzICovCisJZm9yIChyciA9IHJlc3BvbnNlLT5hbnN3ZXIsIGluZGV4X2FucyA9IDAsIGluZGV4X3NpZyA9IDA7CisJICAgIHJyOyByciA9IHJyLT5uZXh0KSB7CisKKwkJcmRhdGEgPSBOVUxMOworCisJCWlmIChyci0+Y2xhc3MgPT0gcnJzZXQtPnJyaV9yZGNsYXNzICYmCisJCSAgICByci0+dHlwZSAgPT0gcnJzZXQtPnJyaV9yZHR5cGUpCisJCQlyZGF0YSA9ICZycnNldC0+cnJpX3JkYXRhc1tpbmRleF9hbnMrK107CisKKwkJaWYgKHJyLT5jbGFzcyA9PSBycnNldC0+cnJpX3JkY2xhc3MgJiYKKwkJICAgIHJyLT50eXBlICA9PSBUX1JSU0lHKQorCQkJcmRhdGEgPSAmcnJzZXQtPnJyaV9zaWdzW2luZGV4X3NpZysrXTsKKworCQlpZiAocmRhdGEpIHsKKwkJCXJkYXRhLT5yZGlfbGVuZ3RoID0gcnItPnNpemU7CisJCQlyZGF0YS0+cmRpX2RhdGEgICA9IG1hbGxvYyhyci0+c2l6ZSk7CisKKwkJCWlmIChyZGF0YS0+cmRpX2RhdGEgPT0gTlVMTCkgeworCQkJCXJlc3VsdCA9IEVSUlNFVF9OT01FTU9SWTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCQltZW1jcHkocmRhdGEtPnJkaV9kYXRhLCByci0+cmRhdGEsIHJyLT5zaXplKTsKKwkJfQorCX0KKwlmcmVlX2Ruc19yZXNwb25zZShyZXNwb25zZSk7CisKKwkqcmVzID0gcnJzZXQ7CisJcmV0dXJuIChFUlJTRVRfU1VDQ0VTUyk7CisKK2ZhaWw6CisJaWYgKHJyc2V0ICE9IE5VTEwpCisJCWZyZWVycnNldChycnNldCk7CisJaWYgKHJlc3BvbnNlICE9IE5VTEwpCisJCWZyZWVfZG5zX3Jlc3BvbnNlKHJlc3BvbnNlKTsKKwlyZXR1cm4gKHJlc3VsdCk7Cit9CisKK3ZvaWQKK2ZyZWVycnNldChzdHJ1Y3QgcnJzZXRpbmZvICpycnNldCkKK3sKKwl1X2ludDE2X3QgaTsKKworCWlmIChycnNldCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAocnJzZXQtPnJyaV9yZGF0YXMpIHsKKwkJZm9yIChpID0gMDsgaSA8IHJyc2V0LT5ycmlfbnJkYXRhczsgaSsrKSB7CisJCQlpZiAocnJzZXQtPnJyaV9yZGF0YXNbaV0ucmRpX2RhdGEgPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJCWZyZWUocnJzZXQtPnJyaV9yZGF0YXNbaV0ucmRpX2RhdGEpOworCQl9CisJCWZyZWUocnJzZXQtPnJyaV9yZGF0YXMpOworCX0KKworCWlmIChycnNldC0+cnJpX3NpZ3MpIHsKKwkJZm9yIChpID0gMDsgaSA8IHJyc2V0LT5ycmlfbnNpZ3M7IGkrKykgeworCQkJaWYgKHJyc2V0LT5ycmlfc2lnc1tpXS5yZGlfZGF0YSA9PSBOVUxMKQorCQkJCWJyZWFrOworCQkJZnJlZShycnNldC0+cnJpX3NpZ3NbaV0ucmRpX2RhdGEpOworCQl9CisJCWZyZWUocnJzZXQtPnJyaV9zaWdzKTsKKwl9CisKKwlpZiAocnJzZXQtPnJyaV9uYW1lKQorCQlmcmVlKHJyc2V0LT5ycmlfbmFtZSk7CisJZnJlZShycnNldCk7Cit9CisKKy8qCisgKiBETlMgcmVzcG9uc2UgcGFyc2luZyByb3V0aW5lcworICovCitzdGF0aWMgc3RydWN0IGRuc19yZXNwb25zZSAqCitwYXJzZV9kbnNfcmVzcG9uc2UoY29uc3QgdV9jaGFyICphbnN3ZXIsIGludCBzaXplKQoreworCXN0cnVjdCBkbnNfcmVzcG9uc2UgKnJlc3A7CisJY29uc3QgdV9jaGFyICpjcDsKKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHJlc3BvbnNlICovCisJcmVzcCA9IGNhbGxvYygxLCBzaXplb2YoKnJlc3ApKTsKKwlpZiAocmVzcCA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJLyogaW5pdGlhbGl6ZSBjdXJyZW50IHBvaW50ZXIgKi8KKwljcCA9IGFuc3dlcjsKKworCS8qIGNvcHkgaGVhZGVyICovCisJbWVtY3B5KCZyZXNwLT5oZWFkZXIsIGNwLCBIRklYRURTWik7CisJY3AgKz0gSEZJWEVEU1o7CisKKwkvKiBmaXggaGVhZGVyIGJ5dGUgb3JkZXIgKi8KKwlyZXNwLT5oZWFkZXIucWRjb3VudCA9IG50b2hzKHJlc3AtPmhlYWRlci5xZGNvdW50KTsKKwlyZXNwLT5oZWFkZXIuYW5jb3VudCA9IG50b2hzKHJlc3AtPmhlYWRlci5hbmNvdW50KTsKKwlyZXNwLT5oZWFkZXIubnNjb3VudCA9IG50b2hzKHJlc3AtPmhlYWRlci5uc2NvdW50KTsKKwlyZXNwLT5oZWFkZXIuYXJjb3VudCA9IG50b2hzKHJlc3AtPmhlYWRlci5hcmNvdW50KTsKKworCS8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIHF1ZXJ5ICovCisJaWYgKHJlc3AtPmhlYWRlci5xZGNvdW50IDwgMSkgeworCQlmcmVlX2Ruc19yZXNwb25zZShyZXNwKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwkvKiBwYXJzZSBxdWVyeSBzZWN0aW9uICovCisJcmVzcC0+cXVlcnkgPSBwYXJzZV9kbnNfcXNlY3Rpb24oYW5zd2VyLCBzaXplLCAmY3AsCisJICAgIHJlc3AtPmhlYWRlci5xZGNvdW50KTsKKwlpZiAocmVzcC0+aGVhZGVyLnFkY291bnQgJiYgcmVzcC0+cXVlcnkgPT0gTlVMTCkgeworCQlmcmVlX2Ruc19yZXNwb25zZShyZXNwKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwkvKiBwYXJzZSBhbnN3ZXIgc2VjdGlvbiAqLworCXJlc3AtPmFuc3dlciA9IHBhcnNlX2Ruc19ycnNlY3Rpb24oYW5zd2VyLCBzaXplLCAmY3AsCisJICAgIHJlc3AtPmhlYWRlci5hbmNvdW50KTsKKwlpZiAocmVzcC0+aGVhZGVyLmFuY291bnQgJiYgcmVzcC0+YW5zd2VyID09IE5VTEwpIHsKKwkJZnJlZV9kbnNfcmVzcG9uc2UocmVzcCk7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJLyogcGFyc2UgYXV0aG9yaXR5IHNlY3Rpb24gKi8KKwlyZXNwLT5hdXRob3JpdHkgPSBwYXJzZV9kbnNfcnJzZWN0aW9uKGFuc3dlciwgc2l6ZSwgJmNwLAorCSAgICByZXNwLT5oZWFkZXIubnNjb3VudCk7CisJaWYgKHJlc3AtPmhlYWRlci5uc2NvdW50ICYmIHJlc3AtPmF1dGhvcml0eSA9PSBOVUxMKSB7CisJCWZyZWVfZG5zX3Jlc3BvbnNlKHJlc3ApOworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCS8qIHBhcnNlIGFkZGl0aW9uYWwgc2VjdGlvbiAqLworCXJlc3AtPmFkZGl0aW9uYWwgPSBwYXJzZV9kbnNfcnJzZWN0aW9uKGFuc3dlciwgc2l6ZSwgJmNwLAorCSAgICByZXNwLT5oZWFkZXIuYXJjb3VudCk7CisJaWYgKHJlc3AtPmhlYWRlci5hcmNvdW50ICYmIHJlc3AtPmFkZGl0aW9uYWwgPT0gTlVMTCkgeworCQlmcmVlX2Ruc19yZXNwb25zZShyZXNwKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwlyZXR1cm4gKHJlc3ApOworfQorCitzdGF0aWMgc3RydWN0IGRuc19xdWVyeSAqCitwYXJzZV9kbnNfcXNlY3Rpb24oY29uc3QgdV9jaGFyICphbnN3ZXIsIGludCBzaXplLCBjb25zdCB1X2NoYXIgKipjcCwgaW50IGNvdW50KQoreworCXN0cnVjdCBkbnNfcXVlcnkgKmhlYWQsICpjdXJyLCAqcHJldjsKKwlpbnQgaSwgbGVuZ3RoOworCWNoYXIgbmFtZVtNQVhETkFNRV07CisKKwlmb3IgKGkgPSAxLCBoZWFkID0gTlVMTCwgcHJldiA9IE5VTEw7IGkgPD0gY291bnQ7IGkrKywgcHJldiA9IGN1cnIpIHsKKworCQkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBzdHJ1Y3QgKi8KKwkJY3VyciA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGRuc19xdWVyeSkpOworCQlpZiAoY3VyciA9PSBOVUxMKSB7CisJCQlmcmVlX2Ruc19xdWVyeShoZWFkKTsKKwkJCXJldHVybiAoTlVMTCk7CisJCX0KKwkJaWYgKGhlYWQgPT0gTlVMTCkKKwkJCWhlYWQgPSBjdXJyOworCQlpZiAocHJldiAhPSBOVUxMKQorCQkJcHJldi0+bmV4dCA9IGN1cnI7CisKKwkJLyogbmFtZSAqLworCQlsZW5ndGggPSBkbl9leHBhbmQoYW5zd2VyLCBhbnN3ZXIgKyBzaXplLCAqY3AsIG5hbWUsCisJCSAgICBzaXplb2YobmFtZSkpOworCQlpZiAobGVuZ3RoIDwgMCkgeworCQkJZnJlZV9kbnNfcXVlcnkoaGVhZCk7CisJCQlyZXR1cm4gKE5VTEwpOworCQl9CisJCWN1cnItPm5hbWUgPSBzdHJkdXAobmFtZSk7CisJCWlmIChjdXJyLT5uYW1lID09IE5VTEwpIHsKKwkJCWZyZWVfZG5zX3F1ZXJ5KGhlYWQpOworCQkJcmV0dXJuIChOVUxMKTsKKwkJfQorCQkqY3AgKz0gbGVuZ3RoOworCisJCS8qIHR5cGUgKi8KKwkJY3Vyci0+dHlwZSA9IF9nZXRzaG9ydCgqY3ApOworCQkqY3AgKz0gSU5UMTZTWjsKKworCQkvKiBjbGFzcyAqLworCQljdXJyLT5jbGFzcyA9IF9nZXRzaG9ydCgqY3ApOworCQkqY3AgKz0gSU5UMTZTWjsKKwl9CisKKwlyZXR1cm4gKGhlYWQpOworfQorCitzdGF0aWMgc3RydWN0IGRuc19yciAqCitwYXJzZV9kbnNfcnJzZWN0aW9uKGNvbnN0IHVfY2hhciAqYW5zd2VyLCBpbnQgc2l6ZSwgY29uc3QgdV9jaGFyICoqY3AsCisgICAgaW50IGNvdW50KQoreworCXN0cnVjdCBkbnNfcnIgKmhlYWQsICpjdXJyLCAqcHJldjsKKwlpbnQgaSwgbGVuZ3RoOworCWNoYXIgbmFtZVtNQVhETkFNRV07CisKKwlmb3IgKGkgPSAxLCBoZWFkID0gTlVMTCwgcHJldiA9IE5VTEw7IGkgPD0gY291bnQ7IGkrKywgcHJldiA9IGN1cnIpIHsKKworCQkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBzdHJ1Y3QgKi8KKwkJY3VyciA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGRuc19ycikpOworCQlpZiAoY3VyciA9PSBOVUxMKSB7CisJCQlmcmVlX2Ruc19ycihoZWFkKTsKKwkJCXJldHVybiAoTlVMTCk7CisJCX0KKwkJaWYgKGhlYWQgPT0gTlVMTCkKKwkJCWhlYWQgPSBjdXJyOworCQlpZiAocHJldiAhPSBOVUxMKQorCQkJcHJldi0+bmV4dCA9IGN1cnI7CisKKwkJLyogbmFtZSAqLworCQlsZW5ndGggPSBkbl9leHBhbmQoYW5zd2VyLCBhbnN3ZXIgKyBzaXplLCAqY3AsIG5hbWUsCisJCSAgICBzaXplb2YobmFtZSkpOworCQlpZiAobGVuZ3RoIDwgMCkgeworCQkJZnJlZV9kbnNfcnIoaGVhZCk7CisJCQlyZXR1cm4gKE5VTEwpOworCQl9CisJCWN1cnItPm5hbWUgPSBzdHJkdXAobmFtZSk7CisJCWlmIChjdXJyLT5uYW1lID09IE5VTEwpIHsKKwkJCWZyZWVfZG5zX3JyKGhlYWQpOworCQkJcmV0dXJuIChOVUxMKTsKKwkJfQorCQkqY3AgKz0gbGVuZ3RoOworCisJCS8qIHR5cGUgKi8KKwkJY3Vyci0+dHlwZSA9IF9nZXRzaG9ydCgqY3ApOworCQkqY3AgKz0gSU5UMTZTWjsKKworCQkvKiBjbGFzcyAqLworCQljdXJyLT5jbGFzcyA9IF9nZXRzaG9ydCgqY3ApOworCQkqY3AgKz0gSU5UMTZTWjsKKworCQkvKiB0dGwgKi8KKwkJY3Vyci0+dHRsID0gX2dldGxvbmcoKmNwKTsKKwkJKmNwICs9IElOVDMyU1o7CisKKwkJLyogcmRhdGEgc2l6ZSAqLworCQljdXJyLT5zaXplID0gX2dldHNob3J0KCpjcCk7CisJCSpjcCArPSBJTlQxNlNaOworCisJCS8qIHJkYXRhIGl0c2VsZiAqLworCQljdXJyLT5yZGF0YSA9IG1hbGxvYyhjdXJyLT5zaXplKTsKKwkJaWYgKGN1cnItPnJkYXRhID09IE5VTEwpIHsKKwkJCWZyZWVfZG5zX3JyKGhlYWQpOworCQkJcmV0dXJuIChOVUxMKTsKKwkJfQorCQltZW1jcHkoY3Vyci0+cmRhdGEsICpjcCwgY3Vyci0+c2l6ZSk7CisJCSpjcCArPSBjdXJyLT5zaXplOworCX0KKworCXJldHVybiAoaGVhZCk7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX2Ruc19xdWVyeShzdHJ1Y3QgZG5zX3F1ZXJ5ICpwKQoreworCWlmIChwID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChwLT5uYW1lKQorCQlmcmVlKHAtPm5hbWUpOworCWZyZWVfZG5zX3F1ZXJ5KHAtPm5leHQpOworCWZyZWUocCk7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX2Ruc19ycihzdHJ1Y3QgZG5zX3JyICpwKQoreworCWlmIChwID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChwLT5uYW1lKQorCQlmcmVlKHAtPm5hbWUpOworCWlmIChwLT5yZGF0YSkKKwkJZnJlZShwLT5yZGF0YSk7CisJZnJlZV9kbnNfcnIocC0+bmV4dCk7CisJZnJlZShwKTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfZG5zX3Jlc3BvbnNlKHN0cnVjdCBkbnNfcmVzcG9uc2UgKnApCit7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZnJlZV9kbnNfcXVlcnkocC0+cXVlcnkpOworCWZyZWVfZG5zX3JyKHAtPmFuc3dlcik7CisJZnJlZV9kbnNfcnIocC0+YXV0aG9yaXR5KTsKKwlmcmVlX2Ruc19ycihwLT5hZGRpdGlvbmFsKTsKKwlmcmVlKHApOworfQorCitzdGF0aWMgaW50Citjb3VudF9kbnNfcnIoc3RydWN0IGRuc19yciAqcCwgdV9pbnQxNl90IGNsYXNzLCB1X2ludDE2X3QgdHlwZSkKK3sKKwlpbnQgbiA9IDA7CisKKwl3aGlsZShwKSB7CisJCWlmIChwLT5jbGFzcyA9PSBjbGFzcyAmJiBwLT50eXBlID09IHR5cGUpCisJCQluKys7CisJCXAgPSBwLT5uZXh0OworCX0KKworCXJldHVybiAobik7Cit9CisKKyNlbmRpZiAvKiAgIWRlZmluZWQgKEhBVkVfR0VUUlJTRVRCWU5BTUUpICYmICFkZWZpbmVkIChIQVZFX0xETlMpICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2dldHJyc2V0YnluYW1lLmggYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2dldHJyc2V0YnluYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4M2Y1NQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvZ2V0cnJzZXRieW5hbWUuaApAQCAtMCwwICsxLDExMCBAQAorLyogT1BFTkJTRCBCQVNFRCBPTiA6IGluY2x1ZGUvbmV0ZGIuaCAqLworCisvKiAkT3BlbkJTRDogZ2V0cnJzZXRieW5hbWUuYyx2IDEuNCAyMDAxLzA4LzE2IDE4OjE2OjQzIGhvIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSmFrb2IgU2NobHl0ZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCAKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBJbnRlcm5ldCBTb2Z0d2FyZSBDb25zb3J0aXVtLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgSU5URVJORVQgU09GVFdBUkUgQ09OU09SVElVTQorICogRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTAorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIElOVEVSTkVUIFNPRlRXQVJFIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULAorICogSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORworICogRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9HRVRSUlNFVEJZTkFNRV9ICisjZGVmaW5lIF9HRVRSUlNFVEJZTkFNRV9ICisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaWZuZGVmIEhBVkVfR0VUUlJTRVRCWU5BTUUKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL25hbWVzZXIuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHJlc29sdi5oPgorCisjaWZuZGVmIEhGSVhFRFNaCisjZGVmaW5lIEhGSVhFRFNaIDEyCisjZW5kaWYKKworI2lmbmRlZiBUX1JSU0lHCisjZGVmaW5lIFRfUlJTSUcgNDYKKyNlbmRpZgorCisvKgorICogRmxhZ3MgZm9yIGdldHJyc2V0YnluYW1lKCkKKyAqLworI2lmbmRlZiBSUlNFVF9WQUxJREFURUQKKyMgZGVmaW5lIFJSU0VUX1ZBTElEQVRFRAkxCisjZW5kaWYKKworLyoKKyAqIFJldHVybiBjb2RlcyBmb3IgZ2V0cnJzZXRieW5hbWUoKQorICovCisjaWZuZGVmIEVSUlNFVF9TVUNDRVNTCisjIGRlZmluZSBFUlJTRVRfU1VDQ0VTUwkJMAorIyBkZWZpbmUgRVJSU0VUX05PTUVNT1JZCTEKKyMgZGVmaW5lIEVSUlNFVF9GQUlMCQkyCisjIGRlZmluZSBFUlJTRVRfSU5WQUwJCTMKKyMgZGVmaW5lIEVSUlNFVF9OT05BTUUJCTQKKyMgZGVmaW5lIEVSUlNFVF9OT0RBVEEJCTUKKyNlbmRpZgorCitzdHJ1Y3QgcmRhdGFpbmZvIHsKKwl1bnNpZ25lZCBpbnQJCXJkaV9sZW5ndGg7CS8qIGxlbmd0aCBvZiBkYXRhICovCisJdW5zaWduZWQgY2hhcgkJKnJkaV9kYXRhOwkvKiByZWNvcmQgZGF0YSAqLworfTsKKworc3RydWN0IHJyc2V0aW5mbyB7CisJdW5zaWduZWQgaW50CQlycmlfZmxhZ3M7CS8qIFJSU0VUX1ZBTElEQVRFRCAuLi4gKi8KKwl1bnNpZ25lZCBpbnQJCXJyaV9yZGNsYXNzOwkvKiBjbGFzcyBudW1iZXIgKi8KKwl1bnNpZ25lZCBpbnQJCXJyaV9yZHR5cGU7CS8qIFJSIHR5cGUgbnVtYmVyICovCisJdW5zaWduZWQgaW50CQlycmlfdHRsOwkvKiB0aW1lIHRvIGxpdmUgKi8KKwl1bnNpZ25lZCBpbnQJCXJyaV9ucmRhdGFzOwkvKiBzaXplIG9mIHJkYXRhcyBhcnJheSAqLworCXVuc2lnbmVkIGludAkJcnJpX25zaWdzOwkvKiBzaXplIG9mIHNpZ3MgYXJyYXkgKi8KKwljaGFyCQkJKnJyaV9uYW1lOwkvKiBjYW5vbmljYWwgbmFtZSAqLworCXN0cnVjdCByZGF0YWluZm8JKnJyaV9yZGF0YXM7CS8qIGluZGl2aWR1YWwgcmVjb3JkcyAqLworCXN0cnVjdCByZGF0YWluZm8JKnJyaV9zaWdzOwkvKiBpbmRpdmlkdWFsIHNpZ25hdHVyZXMgKi8KK307CisKK2ludAkJZ2V0cnJzZXRieW5hbWUoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBzdHJ1Y3QgcnJzZXRpbmZvICoqKTsKK3ZvaWQJCWZyZWVycnNldChzdHJ1Y3QgcnJzZXRpbmZvICopOworCisjZW5kaWYgLyogIWRlZmluZWQoSEFWRV9HRVRSUlNFVEJZTkFNRSkgKi8KKworI2VuZGlmIC8qIF9HRVRSUlNFVEJZTkFNRV9IICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2dsb2IuYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvZ2xvYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MmI0YjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2dsb2IuYwpAQCAtMCwwICsxLDEwNjUgQEAKKy8qCSRPcGVuQlNEOiBnbG9iLmMsdiAxLjM4IDIwMTEvMDkvMjIgMDY6Mjc6MjkgZGptIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBHdWlkbyB2YW4gUm9zc3VtLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKiBPUEVOQlNEIE9SSUdJTkFMOiBsaWIvbGliYy9nZW4vZ2xvYi5jICovCisKKy8qCisgKiBnbG9iKDMpIC0tIGEgc3VwZXJzZXQgb2YgdGhlIG9uZSBkZWZpbmVkIGluIFBPU0lYIDEwMDMuMi4KKyAqCisgKiBUaGUgWyEuLi5dIGNvbnZlbnRpb24gdG8gbmVnYXRlIGEgcmFuZ2UgaXMgc3VwcG9ydGVkIChTeXNWLCBQb3NpeCwga3NoKS4KKyAqCisgKiBPcHRpb25hbCBleHRyYSBzZXJ2aWNlcywgY29udHJvbGxlZCBieSBmbGFncyBub3QgZGVmaW5lZCBieSBQT1NJWDoKKyAqCisgKiBHTE9CX1FVT1RFOgorICoJRXNjYXBpbmcgY29udmVudGlvbjogXCBpbmhpYml0cyBhbnkgc3BlY2lhbCBtZWFuaW5nIHRoZSBmb2xsb3dpbmcKKyAqCWNoYXJhY3RlciBtaWdodCBoYXZlIChleGNlcHQgXCBhdCBlbmQgb2Ygc3RyaW5nIGlzIHJldGFpbmVkKS4KKyAqIEdMT0JfTUFHQ0hBUjoKKyAqCVNldCBpbiBnbF9mbGFncyBpZiBwYXR0ZXJuIGNvbnRhaW5lZCBhIGdsb2JiaW5nIGNoYXJhY3Rlci4KKyAqIEdMT0JfTk9NQUdJQzoKKyAqCVNhbWUgYXMgR0xPQl9OT0NIRUNLLCBidXQgaXQgd2lsbCBvbmx5IGFwcGVuZCBwYXR0ZXJuIGlmIGl0IGRpZAorICoJbm90IGNvbnRhaW4gYW55IG1hZ2ljIGNoYXJhY3RlcnMuICBbVXNlZCBpbiBjc2ggc3R5bGUgZ2xvYmJpbmddCisgKiBHTE9CX0FMVERJUkZVTkM6CisgKglVc2UgYWx0ZXJuYXRlbHkgc3BlY2lmaWVkIGRpcmVjdG9yeSBhY2Nlc3MgZnVuY3Rpb25zLgorICogR0xPQl9USUxERToKKyAqCWV4cGFuZCB+dXNlci9mb28gdG8gdGhlIC9ob21lL2Rpci9vZi91c2VyL2ZvbworICogR0xPQl9CUkFDRToKKyAqCWV4cGFuZCB7MSwyfXthLGJ9IHRvIDFhIDFiIDJhIDJiCisgKiBnbF9tYXRjaGM6CisgKglOdW1iZXIgb2YgbWF0Y2hlcyBpbiB0aGUgY3VycmVudCBpbnZvY2F0aW9uIG9mIGdsb2IuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWYgIWRlZmluZWQoSEFWRV9HTE9CKSB8fCAhZGVmaW5lZChHTE9CX0hBU19BTFRESVJGVU5DKSB8fCBcCisgICAgIWRlZmluZWQoR0xPQl9IQVNfR0xfTUFUQ0hDKSB8fCAhZGVmaW5lZChHTE9CX0hBU19HTF9TVEFUVikgfHwgXAorICAgICFkZWZpbmVkKEhBVkVfREVDTF9HTE9CX05PTUFUQ0gpIHx8IEhBVkVfREVDTF9HTE9CX05PTUFUQ0ggPT0gMCB8fCBcCisgICAgZGVmaW5lZChCUk9LRU5fR0xPQikKKworI2luY2x1ZGUgImNoYXJjbGFzcy5oIgorCisjZGVmaW5lCURPTExBUgkJJyQnCisjZGVmaW5lCURPVAkJJy4nCisjZGVmaW5lCUVPUwkJJ1wwJworI2RlZmluZQlMQlJBQ0tFVAknWycKKyNkZWZpbmUJTk9UCQknIScKKyNkZWZpbmUJUVVFU1RJT04JJz8nCisjZGVmaW5lCVFVT1RFCQknXFwnCisjZGVmaW5lCVJBTkdFCQknLScKKyNkZWZpbmUJUkJSQUNLRVQJJ10nCisjZGVmaW5lCVNFUAkJJy8nCisjZGVmaW5lCVNUQVIJCScqJworI2RlZmluZQlUSUxERQkJJ34nCisjZGVmaW5lCVVOREVSU0NPUkUJJ18nCisjZGVmaW5lCUxCUkFDRQkJJ3snCisjZGVmaW5lCVJCUkFDRQkJJ30nCisjZGVmaW5lCVNMQVNICQknLycKKyNkZWZpbmUJQ09NTUEJCScsJworCisjaWZuZGVmIERFQlVHCisKKyNkZWZpbmUJTV9RVU9URQkJMHg4MDAwCisjZGVmaW5lCU1fUFJPVEVDVAkweDQwMDAKKyNkZWZpbmUJTV9NQVNLCQkweGZmZmYKKyNkZWZpbmUJTV9BU0NJSQkJMHgwMGZmCisKK3R5cGVkZWYgdV9zaG9ydCBDaGFyOworCisjZWxzZQorCisjZGVmaW5lCU1fUVVPVEUJCTB4ODAKKyNkZWZpbmUJTV9QUk9URUNUCTB4NDAKKyNkZWZpbmUJTV9NQVNLCQkweGZmCisjZGVmaW5lCU1fQVNDSUkJCTB4N2YKKwordHlwZWRlZiBjaGFyIENoYXI7CisKKyNlbmRpZgorCisKKyNkZWZpbmUJQ0hBUihjKQkJKChDaGFyKSgoYykmTV9BU0NJSSkpCisjZGVmaW5lCU1FVEEoYykJCSgoQ2hhcikoKGMpfE1fUVVPVEUpKQorI2RlZmluZQlNX0FMTAkJTUVUQSgnKicpCisjZGVmaW5lCU1fRU5ECQlNRVRBKCddJykKKyNkZWZpbmUJTV9OT1QJCU1FVEEoJyEnKQorI2RlZmluZQlNX09ORQkJTUVUQSgnPycpCisjZGVmaW5lCU1fUk5HCQlNRVRBKCctJykKKyNkZWZpbmUJTV9TRVQJCU1FVEEoJ1snKQorI2RlZmluZQlNX0NMQVNTCQlNRVRBKCc6JykKKyNkZWZpbmUJaXNtZXRhKGMpCSgoKGMpJk1fUVVPVEUpICE9IDApCisKKyNkZWZpbmUJR0xPQl9MSU1JVF9NQUxMT0MJNjU1MzYKKyNkZWZpbmUJR0xPQl9MSU1JVF9TVEFUCQkxMjgKKyNkZWZpbmUJR0xPQl9MSU1JVF9SRUFERElSCTE2Mzg0CisKKy8qIExpbWl0IG9mIHJlY3Vyc2lvbiBkdXJpbmcgbWF0Y2hpbmcgYXR0ZW1wdHMuICovCisjZGVmaW5lIEdMT0JfTElNSVRfUkVDVVIJNjQKKworc3RydWN0IGdsb2JfbGltIHsKKwlzaXplX3QJZ2xpbV9tYWxsb2M7CisJc2l6ZV90CWdsaW1fc3RhdDsKKwlzaXplX3QJZ2xpbV9yZWFkZGlyOworfTsKKworc3RydWN0IGdsb2JfcGF0aF9zdGF0IHsKKwljaGFyCQkqZ3BzX3BhdGg7CisJc3RydWN0IHN0YXQJKmdwc19zdGF0OworfTsKKworc3RhdGljIGludAkgY29tcGFyZShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik7CitzdGF0aWMgaW50CSBjb21wYXJlX2dwcyhjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik7CitzdGF0aWMgaW50CSBnX0N0b2MoY29uc3QgQ2hhciAqLCBjaGFyICosIHVfaW50KTsKK3N0YXRpYyBpbnQJIGdfbHN0YXQoQ2hhciAqLCBzdHJ1Y3Qgc3RhdCAqLCBnbG9iX3QgKik7CitzdGF0aWMgRElSCSpnX29wZW5kaXIoQ2hhciAqLCBnbG9iX3QgKik7CitzdGF0aWMgQ2hhcgkqZ19zdHJjaHIoY29uc3QgQ2hhciAqLCBpbnQpOworc3RhdGljIGludAkgZ19zdHJuY21wKGNvbnN0IENoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworc3RhdGljIGludAkgZ19zdGF0KENoYXIgKiwgc3RydWN0IHN0YXQgKiwgZ2xvYl90ICopOworc3RhdGljIGludAkgZ2xvYjAoY29uc3QgQ2hhciAqLCBnbG9iX3QgKiwgc3RydWN0IGdsb2JfbGltICopOworc3RhdGljIGludAkgZ2xvYjEoQ2hhciAqLCBDaGFyICosIGdsb2JfdCAqLCBzdHJ1Y3QgZ2xvYl9saW0gKik7CitzdGF0aWMgaW50CSBnbG9iMihDaGFyICosIENoYXIgKiwgQ2hhciAqLCBDaGFyICosIENoYXIgKiwgQ2hhciAqLAorCQkgICAgZ2xvYl90ICosIHN0cnVjdCBnbG9iX2xpbSAqKTsKK3N0YXRpYyBpbnQJIGdsb2IzKENoYXIgKiwgQ2hhciAqLCBDaGFyICosIENoYXIgKiwgQ2hhciAqLAorCQkgICAgQ2hhciAqLCBDaGFyICosIGdsb2JfdCAqLCBzdHJ1Y3QgZ2xvYl9saW0gKik7CitzdGF0aWMgaW50CSBnbG9iZXh0ZW5kKGNvbnN0IENoYXIgKiwgZ2xvYl90ICosIHN0cnVjdCBnbG9iX2xpbSAqLAorCQkgICAgc3RydWN0IHN0YXQgKik7CitzdGF0aWMgY29uc3QgQ2hhciAqCisJCSBnbG9idGlsZGUoY29uc3QgQ2hhciAqLCBDaGFyICosIHNpemVfdCwgZ2xvYl90ICopOworc3RhdGljIGludAkgZ2xvYmV4cDEoY29uc3QgQ2hhciAqLCBnbG9iX3QgKiwgc3RydWN0IGdsb2JfbGltICopOworc3RhdGljIGludAkgZ2xvYmV4cDIoY29uc3QgQ2hhciAqLCBjb25zdCBDaGFyICosIGdsb2JfdCAqLAorCQkgICAgc3RydWN0IGdsb2JfbGltICopOworc3RhdGljIGludAkgbWF0Y2goQ2hhciAqLCBDaGFyICosIENoYXIgKiwgaW50KTsKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQJIHFwcmludGYoY29uc3QgY2hhciAqLCBDaGFyICopOworI2VuZGlmCisKK2ludAorZ2xvYihjb25zdCBjaGFyICpwYXR0ZXJuLCBpbnQgZmxhZ3MsIGludCAoKmVycmZ1bmMpKGNvbnN0IGNoYXIgKiwgaW50KSwKKyAgICBnbG9iX3QgKnBnbG9iKQoreworCWNvbnN0IHVfY2hhciAqcGF0bmV4dDsKKwlpbnQgYzsKKwlDaGFyICpidWZuZXh0LCAqYnVmZW5kLCBwYXRidWZbTUFYUEFUSExFTl07CisJc3RydWN0IGdsb2JfbGltIGxpbWl0ID0geyAwLCAwLCAwIH07CisKKwlpZiAoc3RybmxlbihwYXR0ZXJuLCBQQVRIX01BWCkgPT0gUEFUSF9NQVgpCisJCXJldHVybihHTE9CX05PTUFUQ0gpOworCisJcGF0bmV4dCA9ICh1X2NoYXIgKikgcGF0dGVybjsKKwlpZiAoIShmbGFncyAmIEdMT0JfQVBQRU5EKSkgeworCQlwZ2xvYi0+Z2xfcGF0aGMgPSAwOworCQlwZ2xvYi0+Z2xfcGF0aHYgPSBOVUxMOworCQlwZ2xvYi0+Z2xfc3RhdHYgPSBOVUxMOworCQlpZiAoIShmbGFncyAmIEdMT0JfRE9PRkZTKSkKKwkJCXBnbG9iLT5nbF9vZmZzID0gMDsKKwl9CisJcGdsb2ItPmdsX2ZsYWdzID0gZmxhZ3MgJiB+R0xPQl9NQUdDSEFSOworCXBnbG9iLT5nbF9lcnJmdW5jID0gZXJyZnVuYzsKKwlwZ2xvYi0+Z2xfbWF0Y2hjID0gMDsKKworCWlmIChwZ2xvYi0+Z2xfb2ZmcyA8IDAgfHwgcGdsb2ItPmdsX3BhdGhjIDwgMCB8fAorCSAgICBwZ2xvYi0+Z2xfb2ZmcyA+PSBJTlRfTUFYIHx8IHBnbG9iLT5nbF9wYXRoYyA+PSBJTlRfTUFYIHx8CisJICAgIHBnbG9iLT5nbF9wYXRoYyA+PSBJTlRfTUFYIC0gcGdsb2ItPmdsX29mZnMgLSAxKQorCQlyZXR1cm4gR0xPQl9OT1NQQUNFOworCisJYnVmbmV4dCA9IHBhdGJ1ZjsKKwlidWZlbmQgPSBidWZuZXh0ICsgTUFYUEFUSExFTiAtIDE7CisJaWYgKGZsYWdzICYgR0xPQl9OT0VTQ0FQRSkKKwkJd2hpbGUgKGJ1Zm5leHQgPCBidWZlbmQgJiYgKGMgPSAqcGF0bmV4dCsrKSAhPSBFT1MpCisJCQkqYnVmbmV4dCsrID0gYzsKKwllbHNlIHsKKwkJLyogUHJvdGVjdCB0aGUgcXVvdGVkIGNoYXJhY3RlcnMuICovCisJCXdoaWxlIChidWZuZXh0IDwgYnVmZW5kICYmIChjID0gKnBhdG5leHQrKykgIT0gRU9TKQorCQkJaWYgKGMgPT0gUVVPVEUpIHsKKwkJCQlpZiAoKGMgPSAqcGF0bmV4dCsrKSA9PSBFT1MpIHsKKwkJCQkJYyA9IFFVT1RFOworCQkJCQktLXBhdG5leHQ7CisJCQkJfQorCQkJCSpidWZuZXh0KysgPSBjIHwgTV9QUk9URUNUOworCQkJfSBlbHNlCisJCQkJKmJ1Zm5leHQrKyA9IGM7CisJfQorCSpidWZuZXh0ID0gRU9TOworCisJaWYgKGZsYWdzICYgR0xPQl9CUkFDRSkKKwkJcmV0dXJuIGdsb2JleHAxKHBhdGJ1ZiwgcGdsb2IsICZsaW1pdCk7CisJZWxzZQorCQlyZXR1cm4gZ2xvYjAocGF0YnVmLCBwZ2xvYiwgJmxpbWl0KTsKK30KKworLyoKKyAqIEV4cGFuZCByZWN1cnNpdmVseSBhIGdsb2Ige30gcGF0dGVybi4gV2hlbiB0aGVyZSBpcyBubyBtb3JlIGV4cGFuc2lvbgorICogaW52b2tlIHRoZSBzdGFuZGFyZCBnbG9iYmluZyByb3V0aW5lIHRvIGdsb2IgdGhlIHJlc3Qgb2YgdGhlIG1hZ2ljCisgKiBjaGFyYWN0ZXJzCisgKi8KK3N0YXRpYyBpbnQKK2dsb2JleHAxKGNvbnN0IENoYXIgKnBhdHRlcm4sIGdsb2JfdCAqcGdsb2IsIHN0cnVjdCBnbG9iX2xpbSAqbGltaXRwKQoreworCWNvbnN0IENoYXIqIHB0ciA9IHBhdHRlcm47CisKKwkvKiBQcm90ZWN0IGEgc2luZ2xlIHt9LCBmb3IgZmluZCgxKSwgbGlrZSBjc2ggKi8KKwlpZiAocGF0dGVyblswXSA9PSBMQlJBQ0UgJiYgcGF0dGVyblsxXSA9PSBSQlJBQ0UgJiYgcGF0dGVyblsyXSA9PSBFT1MpCisJCXJldHVybiBnbG9iMChwYXR0ZXJuLCBwZ2xvYiwgbGltaXRwKTsKKworCWlmICgocHRyID0gKGNvbnN0IENoYXIgKikgZ19zdHJjaHIocHRyLCBMQlJBQ0UpKSAhPSBOVUxMKQorCQlyZXR1cm4gZ2xvYmV4cDIocHRyLCBwYXR0ZXJuLCBwZ2xvYiwgbGltaXRwKTsKKworCXJldHVybiBnbG9iMChwYXR0ZXJuLCBwZ2xvYiwgbGltaXRwKTsKK30KKworCisvKgorICogUmVjdXJzaXZlIGJyYWNlIGdsb2JiaW5nIGhlbHBlci4gVHJpZXMgdG8gZXhwYW5kIGEgc2luZ2xlIGJyYWNlLgorICogSWYgaXQgc3VjY2VlZHMgdGhlbiBpdCBpbnZva2VzIGdsb2JleHAxIHdpdGggdGhlIG5ldyBwYXR0ZXJuLgorICogSWYgaXQgZmFpbHMgdGhlbiBpdCB0cmllcyB0byBnbG9iIHRoZSByZXN0IG9mIHRoZSBwYXR0ZXJuIGFuZCByZXR1cm5zLgorICovCitzdGF0aWMgaW50CitnbG9iZXhwMihjb25zdCBDaGFyICpwdHIsIGNvbnN0IENoYXIgKnBhdHRlcm4sIGdsb2JfdCAqcGdsb2IsCisgICAgc3RydWN0IGdsb2JfbGltICpsaW1pdHApCit7CisJaW50ICAgICBpLCBydjsKKwlDaGFyICAgKmxtLCAqbHM7CisJY29uc3QgQ2hhciAqcGUsICpwbSwgKnBsOworCUNoYXIgICAgcGF0YnVmW01BWFBBVEhMRU5dOworCisJLyogY29weSBwYXJ0IHVwIHRvIHRoZSBicmFjZSAqLworCWZvciAobG0gPSBwYXRidWYsIHBtID0gcGF0dGVybjsgcG0gIT0gcHRyOyAqbG0rKyA9ICpwbSsrKQorCQk7CisJKmxtID0gRU9TOworCWxzID0gbG07CisKKwkvKiBGaW5kIHRoZSBiYWxhbmNlZCBicmFjZSAqLworCWZvciAoaSA9IDAsIHBlID0gKytwdHI7ICpwZTsgcGUrKykKKwkJaWYgKCpwZSA9PSBMQlJBQ0tFVCkgeworCQkJLyogSWdub3JlIGV2ZXJ5dGhpbmcgYmV0d2VlbiBbXSAqLworCQkJZm9yIChwbSA9IHBlKys7ICpwZSAhPSBSQlJBQ0tFVCAmJiAqcGUgIT0gRU9TOyBwZSsrKQorCQkJCTsKKwkJCWlmICgqcGUgPT0gRU9TKSB7CisJCQkJLyoKKwkJCQkgKiBXZSBjb3VsZCBub3QgZmluZCBhIG1hdGNoaW5nIFJCUkFDS0VULgorCQkJCSAqIElnbm9yZSBhbmQganVzdCBsb29rIGZvciBSQlJBQ0UKKwkJCQkgKi8KKwkJCQlwZSA9IHBtOworCQkJfQorCQl9IGVsc2UgaWYgKCpwZSA9PSBMQlJBQ0UpCisJCQlpKys7CisJCWVsc2UgaWYgKCpwZSA9PSBSQlJBQ0UpIHsKKwkJCWlmIChpID09IDApCisJCQkJYnJlYWs7CisJCQlpLS07CisJCX0KKworCS8qIE5vbiBtYXRjaGluZyBicmFjZXM7IGp1c3QgZ2xvYiB0aGUgcGF0dGVybiAqLworCWlmIChpICE9IDAgfHwgKnBlID09IEVPUykKKwkJcmV0dXJuIGdsb2IwKHBhdGJ1ZiwgcGdsb2IsIGxpbWl0cCk7CisKKwlmb3IgKGkgPSAwLCBwbCA9IHBtID0gcHRyOyBwbSA8PSBwZTsgcG0rKykgeworCQlzd2l0Y2ggKCpwbSkgeworCQljYXNlIExCUkFDS0VUOgorCQkJLyogSWdub3JlIGV2ZXJ5dGhpbmcgYmV0d2VlbiBbXSAqLworCQkJZm9yIChwbCA9IHBtKys7ICpwbSAhPSBSQlJBQ0tFVCAmJiAqcG0gIT0gRU9TOyBwbSsrKQorCQkJCTsKKwkJCWlmICgqcG0gPT0gRU9TKSB7CisJCQkJLyoKKwkJCQkgKiBXZSBjb3VsZCBub3QgZmluZCBhIG1hdGNoaW5nIFJCUkFDS0VULgorCQkJCSAqIElnbm9yZSBhbmQganVzdCBsb29rIGZvciBSQlJBQ0UKKwkJCQkgKi8KKwkJCQlwbSA9IHBsOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBMQlJBQ0U6CisJCQlpKys7CisJCQlicmVhazsKKworCQljYXNlIFJCUkFDRToKKwkJCWlmIChpKSB7CisJCQkJaS0tOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJY2FzZSBDT01NQToKKwkJCWlmIChpICYmICpwbSA9PSBDT01NQSkKKwkJCQlicmVhazsKKwkJCWVsc2UgeworCQkJCS8qIEFwcGVuZCB0aGUgY3VycmVudCBzdHJpbmcgKi8KKwkJCQlmb3IgKGxtID0gbHM7IChwbCA8IHBtKTsgKmxtKysgPSAqcGwrKykKKwkJCQkJOworCisJCQkJLyoKKwkJCQkgKiBBcHBlbmQgdGhlIHJlc3Qgb2YgdGhlIHBhdHRlcm4gYWZ0ZXIgdGhlCisJCQkJICogY2xvc2luZyBicmFjZQorCQkJCSAqLworCQkJCWZvciAocGwgPSBwZSArIDE7ICgqbG0rKyA9ICpwbCsrKSAhPSBFT1M7ICkKKwkJCQkJOworCisJCQkJLyogRXhwYW5kIHRoZSBjdXJyZW50IHBhdHRlcm4gKi8KKyNpZmRlZiBERUJVRworCQkJCXFwcmludGYoImdsb2JleHAyOiIsIHBhdGJ1Zik7CisjZW5kaWYKKwkJCQlydiA9IGdsb2JleHAxKHBhdGJ1ZiwgcGdsb2IsIGxpbWl0cCk7CisJCQkJaWYgKHJ2ICYmIHJ2ICE9IEdMT0JfTk9NQVRDSCkKKwkJCQkJcmV0dXJuIHJ2OworCisJCQkJLyogbW92ZSBhZnRlciB0aGUgY29tbWEsIHRvIHRoZSBuZXh0IHN0cmluZyAqLworCQkJCXBsID0gcG0gKyAxOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAwOworfQorCisKKworLyoKKyAqIGV4cGFuZCB0aWxkZSBmcm9tIHRoZSBwYXNzd2QgZmlsZS4KKyAqLworc3RhdGljIGNvbnN0IENoYXIgKgorZ2xvYnRpbGRlKGNvbnN0IENoYXIgKnBhdHRlcm4sIENoYXIgKnBhdGJ1Ziwgc2l6ZV90IHBhdGJ1Zl9sZW4sIGdsb2JfdCAqcGdsb2IpCit7CisJc3RydWN0IHBhc3N3ZCAqcHdkOworCWNoYXIgKmg7CisJY29uc3QgQ2hhciAqcDsKKwlDaGFyICpiLCAqZWI7CisKKwlpZiAoKnBhdHRlcm4gIT0gVElMREUgfHwgIShwZ2xvYi0+Z2xfZmxhZ3MgJiBHTE9CX1RJTERFKSkKKwkJcmV0dXJuIHBhdHRlcm47CisKKwkvKiBDb3B5IHVwIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyBvciAvICovCisJZWIgPSAmcGF0YnVmW3BhdGJ1Zl9sZW4gLSAxXTsKKwlmb3IgKHAgPSBwYXR0ZXJuICsgMSwgaCA9IChjaGFyICopIHBhdGJ1ZjsKKwkgICAgaCA8IChjaGFyICopZWIgJiYgKnAgJiYgKnAgIT0gU0xBU0g7ICpoKysgPSAqcCsrKQorCQk7CisKKwkqaCA9IEVPUzsKKworI2lmIDAKKwlpZiAoaCA9PSAoY2hhciAqKWViKQorCQlyZXR1cm4gd2hhdDsKKyNlbmRpZgorCisJaWYgKCgoY2hhciAqKSBwYXRidWYpWzBdID09IEVPUykgeworCQkvKgorCQkgKiBoYW5kbGUgYSBwbGFpbiB+IG9yIH4vIGJ5IGV4cGFuZGluZyAkSE9NRQorCQkgKiBmaXJzdCBhbmQgdGhlbiB0cnlpbmcgdGhlIHBhc3N3b3JkIGZpbGUKKwkJICovCisjaWYgMAorCQlpZiAoaXNzZXR1Z2lkKCkgIT0gMCB8fCAoaCA9IGdldGVudigiSE9NRSIpKSA9PSBOVUxMKSB7CisjZW5kaWYKKwkJaWYgKChnZXR1aWQoKSAhPSBnZXRldWlkKCkpIHx8IChoID0gZ2V0ZW52KCJIT01FIikpID09IE5VTEwpIHsKKwkJCWlmICgocHdkID0gZ2V0cHd1aWQoZ2V0dWlkKCkpKSA9PSBOVUxMKQorCQkJCXJldHVybiBwYXR0ZXJuOworCQkJZWxzZQorCQkJCWggPSBwd2QtPnB3X2RpcjsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIEV4cGFuZCBhIH51c2VyCisJCSAqLworCQlpZiAoKHB3ZCA9IGdldHB3bmFtKChjaGFyKikgcGF0YnVmKSkgPT0gTlVMTCkKKwkJCXJldHVybiBwYXR0ZXJuOworCQllbHNlCisJCQloID0gcHdkLT5wd19kaXI7CisJfQorCisJLyogQ29weSB0aGUgaG9tZSBkaXJlY3RvcnkgKi8KKwlmb3IgKGIgPSBwYXRidWY7IGIgPCBlYiAmJiAqaDsgKmIrKyA9ICpoKyspCisJCTsKKworCS8qIEFwcGVuZCB0aGUgcmVzdCBvZiB0aGUgcGF0dGVybiAqLworCXdoaWxlIChiIDwgZWIgJiYgKCpiKysgPSAqcCsrKSAhPSBFT1MpCisJCTsKKwkqYiA9IEVPUzsKKworCXJldHVybiBwYXRidWY7Cit9CisKK3N0YXRpYyBpbnQKK2dfc3RybmNtcChjb25zdCBDaGFyICpzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuKQoreworCWludCBydiA9IDA7CisKKwl3aGlsZSAobi0tKSB7CisJCXJ2ID0gKihDaGFyICopczEgLSAqKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzMisrOworCQlpZiAocnYpCisJCQlicmVhazsKKwkJaWYgKCpzMSsrID09ICdcMCcpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50CitnX2NoYXJjbGFzcyhjb25zdCBDaGFyICoqcGF0dGVybnAsIENoYXIgKipidWZuZXh0cCkKK3sKKwljb25zdCBDaGFyICpwYXR0ZXJuID0gKnBhdHRlcm5wICsgMTsKKwlDaGFyICpidWZuZXh0ID0gKmJ1Zm5leHRwOworCWNvbnN0IENoYXIgKmNvbG9uOworCXN0cnVjdCBjY2xhc3MgKmNjOworCXNpemVfdCBsZW47CisKKwlpZiAoKGNvbG9uID0gZ19zdHJjaHIocGF0dGVybiwgJzonKSkgPT0gTlVMTCB8fCBjb2xvblsxXSAhPSAnXScpCisJCXJldHVybiAxOwkvKiBub3QgYSBjaGFyYWN0ZXIgY2xhc3MgKi8KKworCWxlbiA9IChzaXplX3QpKGNvbG9uIC0gcGF0dGVybik7CisJZm9yIChjYyA9IGNjbGFzc2VzOyBjYy0+bmFtZSAhPSBOVUxMOyBjYysrKSB7CisJCWlmICghZ19zdHJuY21wKHBhdHRlcm4sIGNjLT5uYW1lLCBsZW4pICYmIGNjLT5uYW1lW2xlbl0gPT0gJ1wwJykKKwkJCWJyZWFrOworCX0KKwlpZiAoY2MtPm5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOwkvKiBpbnZhbGlkIGNoYXJhY3RlciBjbGFzcyAqLworCSpidWZuZXh0KysgPSBNX0NMQVNTOworCSpidWZuZXh0KysgPSAoQ2hhcikoY2MgLSAmY2NsYXNzZXNbMF0pOworCSpidWZuZXh0cCA9IGJ1Zm5leHQ7CisJKnBhdHRlcm5wICs9IGxlbiArIDM7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZSBtYWluIGdsb2IoKSByb3V0aW5lOiBjb21waWxlcyB0aGUgcGF0dGVybiAob3B0aW9uYWxseSBwcm9jZXNzaW5nCisgKiBxdW90ZXMpLCBjYWxscyBnbG9iMSgpIHRvIGRvIHRoZSByZWFsIHBhdHRlcm4gbWF0Y2hpbmcsIGFuZCBmaW5hbGx5CisgKiBzb3J0cyB0aGUgbGlzdCAodW5sZXNzIHVuc29ydGVkIG9wZXJhdGlvbiBpcyByZXF1ZXN0ZWQpLiAgUmV0dXJucyAwCisgKiBpZiB0aGluZ3Mgd2VudCB3ZWxsLCBub256ZXJvIGlmIGVycm9ycyBvY2N1cnJlZC4gIEl0IGlzIG5vdCBhbiBlcnJvcgorICogdG8gZmluZCBubyBtYXRjaGVzLgorICovCitzdGF0aWMgaW50CitnbG9iMChjb25zdCBDaGFyICpwYXR0ZXJuLCBnbG9iX3QgKnBnbG9iLCBzdHJ1Y3QgZ2xvYl9saW0gKmxpbWl0cCkKK3sKKwljb25zdCBDaGFyICpxcGF0bmV4dDsKKwlpbnQgYywgZXJyLCBvbGRwYXRoYzsKKwlDaGFyICpidWZuZXh0LCBwYXRidWZbTUFYUEFUSExFTl07CisKKwlxcGF0bmV4dCA9IGdsb2J0aWxkZShwYXR0ZXJuLCBwYXRidWYsIE1BWFBBVEhMRU4sIHBnbG9iKTsKKwlvbGRwYXRoYyA9IHBnbG9iLT5nbF9wYXRoYzsKKwlidWZuZXh0ID0gcGF0YnVmOworCisJLyogV2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgYnVmZmVyIG92ZXJmbG93IGFueSBtb3JlLiAqLworCXdoaWxlICgoYyA9ICpxcGF0bmV4dCsrKSAhPSBFT1MpIHsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgTEJSQUNLRVQ6CisJCQljID0gKnFwYXRuZXh0OworCQkJaWYgKGMgPT0gTk9UKQorCQkJCSsrcXBhdG5leHQ7CisJCQlpZiAoKnFwYXRuZXh0ID09IEVPUyB8fAorCQkJICAgIGdfc3RyY2hyKHFwYXRuZXh0KzEsIFJCUkFDS0VUKSA9PSBOVUxMKSB7CisJCQkJKmJ1Zm5leHQrKyA9IExCUkFDS0VUOworCQkJCWlmIChjID09IE5PVCkKKwkJCQkJLS1xcGF0bmV4dDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCSpidWZuZXh0KysgPSBNX1NFVDsKKwkJCWlmIChjID09IE5PVCkKKwkJCQkqYnVmbmV4dCsrID0gTV9OT1Q7CisJCQljID0gKnFwYXRuZXh0Kys7CisJCQlkbyB7CisJCQkJaWYgKGMgPT0gTEJSQUNLRVQgJiYgKnFwYXRuZXh0ID09ICc6JykgeworCQkJCQlkbyB7CisJCQkJCQllcnIgPSBnX2NoYXJjbGFzcygmcXBhdG5leHQsCisJCQkJCQkgICAgJmJ1Zm5leHQpOworCQkJCQkJaWYgKGVycikKKwkJCQkJCQlicmVhazsKKwkJCQkJCWMgPSAqcXBhdG5leHQrKzsKKwkJCQkJfSB3aGlsZSAoYyA9PSBMQlJBQ0tFVCAmJiAqcXBhdG5leHQgPT0gJzonKTsKKwkJCQkJaWYgKGVyciA9PSAtMSAmJgorCQkJCQkgICAgIShwZ2xvYi0+Z2xfZmxhZ3MgJiBHTE9CX05PQ0hFQ0spKQorCQkJCQkJcmV0dXJuIEdMT0JfTk9NQVRDSDsKKwkJCQkJaWYgKGMgPT0gUkJSQUNLRVQpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJKmJ1Zm5leHQrKyA9IENIQVIoYyk7CisJCQkJaWYgKCpxcGF0bmV4dCA9PSBSQU5HRSAmJgorCQkJCSAgICAoYyA9IHFwYXRuZXh0WzFdKSAhPSBSQlJBQ0tFVCkgeworCQkJCQkqYnVmbmV4dCsrID0gTV9STkc7CisJCQkJCSpidWZuZXh0KysgPSBDSEFSKGMpOworCQkJCQlxcGF0bmV4dCArPSAyOworCQkJCX0KKwkJCX0gd2hpbGUgKChjID0gKnFwYXRuZXh0KyspICE9IFJCUkFDS0VUKTsKKwkJCXBnbG9iLT5nbF9mbGFncyB8PSBHTE9CX01BR0NIQVI7CisJCQkqYnVmbmV4dCsrID0gTV9FTkQ7CisJCQlicmVhazsKKwkJY2FzZSBRVUVTVElPTjoKKwkJCXBnbG9iLT5nbF9mbGFncyB8PSBHTE9CX01BR0NIQVI7CisJCQkqYnVmbmV4dCsrID0gTV9PTkU7CisJCQlicmVhazsKKwkJY2FzZSBTVEFSOgorCQkJcGdsb2ItPmdsX2ZsYWdzIHw9IEdMT0JfTUFHQ0hBUjsKKwkJCS8qIGNvbGxhcHNlIGFkamFjZW50IHN0YXJzIHRvIG9uZSwKKwkJCSAqIHRvIGF2b2lkIGV4cG9uZW50aWFsIGJlaGF2aW9yCisJCQkgKi8KKwkJCWlmIChidWZuZXh0ID09IHBhdGJ1ZiB8fCBidWZuZXh0Wy0xXSAhPSBNX0FMTCkKKwkJCQkqYnVmbmV4dCsrID0gTV9BTEw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCSpidWZuZXh0KysgPSBDSEFSKGMpOworCQkJYnJlYWs7CisJCX0KKwl9CisJKmJ1Zm5leHQgPSBFT1M7CisjaWZkZWYgREVCVUcKKwlxcHJpbnRmKCJnbG9iMDoiLCBwYXRidWYpOworI2VuZGlmCisKKwlpZiAoKGVyciA9IGdsb2IxKHBhdGJ1ZiwgcGF0YnVmK01BWFBBVEhMRU4tMSwgcGdsb2IsIGxpbWl0cCkpICE9IDApCisJCXJldHVybihlcnIpOworCisJLyoKKwkgKiBJZiB0aGVyZSB3YXMgbm8gbWF0Y2ggd2UgYXJlIGdvaW5nIHRvIGFwcGVuZCB0aGUgcGF0dGVybgorCSAqIGlmIEdMT0JfTk9DSEVDSyB3YXMgc3BlY2lmaWVkIG9yIGlmIEdMT0JfTk9NQUdJQyB3YXMgc3BlY2lmaWVkCisJICogYW5kIHRoZSBwYXR0ZXJuIGRpZCBub3QgY29udGFpbiBhbnkgbWFnaWMgY2hhcmFjdGVycworCSAqIEdMT0JfTk9NQUdJQyBpcyB0aGVyZSBqdXN0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggY3NoLgorCSAqLworCWlmIChwZ2xvYi0+Z2xfcGF0aGMgPT0gb2xkcGF0aGMpIHsKKwkJaWYgKChwZ2xvYi0+Z2xfZmxhZ3MgJiBHTE9CX05PQ0hFQ0spIHx8CisJCSAgICAoKHBnbG9iLT5nbF9mbGFncyAmIEdMT0JfTk9NQUdJQykgJiYKKwkJICAgICEocGdsb2ItPmdsX2ZsYWdzICYgR0xPQl9NQUdDSEFSKSkpCisJCQlyZXR1cm4oZ2xvYmV4dGVuZChwYXR0ZXJuLCBwZ2xvYiwgbGltaXRwLCBOVUxMKSk7CisJCWVsc2UKKwkJCXJldHVybihHTE9CX05PTUFUQ0gpOworCX0KKwlpZiAoIShwZ2xvYi0+Z2xfZmxhZ3MgJiBHTE9CX05PU09SVCkpIHsKKwkJaWYgKChwZ2xvYi0+Z2xfZmxhZ3MgJiBHTE9CX0tFRVBTVEFUKSkgeworCQkJLyogS2VlcCB0aGUgcGF0aHMgYW5kIHN0YXQgaW5mbyBzeW5jZWQgZHVyaW5nIHNvcnQgKi8KKwkJCXN0cnVjdCBnbG9iX3BhdGhfc3RhdCAqcGF0aF9zdGF0OworCQkJaW50IGk7CisJCQlpbnQgbiA9IHBnbG9iLT5nbF9wYXRoYyAtIG9sZHBhdGhjOworCQkJaW50IG8gPSBwZ2xvYi0+Z2xfb2ZmcyArIG9sZHBhdGhjOworCisJCQlpZiAoKHBhdGhfc3RhdCA9IGNhbGxvYyhuLCBzaXplb2YoKnBhdGhfc3RhdCkpKSA9PSBOVUxMKQorCQkJCXJldHVybiBHTE9CX05PU1BBQ0U7CisJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQkJcGF0aF9zdGF0W2ldLmdwc19wYXRoID0gcGdsb2ItPmdsX3BhdGh2W28gKyBpXTsKKwkJCQlwYXRoX3N0YXRbaV0uZ3BzX3N0YXQgPSBwZ2xvYi0+Z2xfc3RhdHZbbyArIGldOworCQkJfQorCQkJcXNvcnQocGF0aF9zdGF0LCBuLCBzaXplb2YoKnBhdGhfc3RhdCksIGNvbXBhcmVfZ3BzKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCQlwZ2xvYi0+Z2xfcGF0aHZbbyArIGldID0gcGF0aF9zdGF0W2ldLmdwc19wYXRoOworCQkJCXBnbG9iLT5nbF9zdGF0dltvICsgaV0gPSBwYXRoX3N0YXRbaV0uZ3BzX3N0YXQ7CisJCQl9CisJCQlmcmVlKHBhdGhfc3RhdCk7CisJCX0gZWxzZSB7CisJCQlxc29ydChwZ2xvYi0+Z2xfcGF0aHYgKyBwZ2xvYi0+Z2xfb2ZmcyArIG9sZHBhdGhjLAorCQkJICAgIHBnbG9iLT5nbF9wYXRoYyAtIG9sZHBhdGhjLCBzaXplb2YoY2hhciAqKSwKKwkJCSAgICBjb21wYXJlKTsKKwkJfQorCX0KKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQKK2NvbXBhcmUoY29uc3Qgdm9pZCAqcCwgY29uc3Qgdm9pZCAqcSkKK3sKKwlyZXR1cm4oc3RyY21wKCooY2hhciAqKilwLCAqKGNoYXIgKiopcSkpOworfQorCitzdGF0aWMgaW50Citjb21wYXJlX2dwcyhjb25zdCB2b2lkICpfcCwgY29uc3Qgdm9pZCAqX3EpCit7CisJY29uc3Qgc3RydWN0IGdsb2JfcGF0aF9zdGF0ICpwID0gKGNvbnN0IHN0cnVjdCBnbG9iX3BhdGhfc3RhdCAqKV9wOworCWNvbnN0IHN0cnVjdCBnbG9iX3BhdGhfc3RhdCAqcSA9IChjb25zdCBzdHJ1Y3QgZ2xvYl9wYXRoX3N0YXQgKilfcTsKKworCXJldHVybihzdHJjbXAocC0+Z3BzX3BhdGgsIHEtPmdwc19wYXRoKSk7Cit9CisKK3N0YXRpYyBpbnQKK2dsb2IxKENoYXIgKnBhdHRlcm4sIENoYXIgKnBhdHRlcm5fbGFzdCwgZ2xvYl90ICpwZ2xvYiwgc3RydWN0IGdsb2JfbGltICpsaW1pdHApCit7CisJQ2hhciBwYXRoYnVmW01BWFBBVEhMRU5dOworCisJLyogQSBudWxsIHBhdGhuYW1lIGlzIGludmFsaWQgLS0gUE9TSVggMTAwMy4xIHNlY3QuIDIuNC4gKi8KKwlpZiAoKnBhdHRlcm4gPT0gRU9TKQorCQlyZXR1cm4oMCk7CisJcmV0dXJuKGdsb2IyKHBhdGhidWYsIHBhdGhidWYrTUFYUEFUSExFTi0xLAorCSAgICBwYXRoYnVmLCBwYXRoYnVmK01BWFBBVEhMRU4tMSwKKwkgICAgcGF0dGVybiwgcGF0dGVybl9sYXN0LCBwZ2xvYiwgbGltaXRwKSk7Cit9CisKKy8qCisgKiBUaGUgZnVuY3Rpb25zIGdsb2IyIGFuZCBnbG9iMyBhcmUgbXV0dWFsbHkgcmVjdXJzaXZlOyB0aGVyZSBpcyBvbmUgbGV2ZWwKKyAqIG9mIHJlY3Vyc2lvbiBmb3IgZWFjaCBzZWdtZW50IGluIHRoZSBwYXR0ZXJuIHRoYXQgY29udGFpbnMgb25lIG9yIG1vcmUKKyAqIG1ldGEgY2hhcmFjdGVycy4KKyAqLworc3RhdGljIGludAorZ2xvYjIoQ2hhciAqcGF0aGJ1ZiwgQ2hhciAqcGF0aGJ1Zl9sYXN0LCBDaGFyICpwYXRoZW5kLCBDaGFyICpwYXRoZW5kX2xhc3QsCisgICAgQ2hhciAqcGF0dGVybiwgQ2hhciAqcGF0dGVybl9sYXN0LCBnbG9iX3QgKnBnbG9iLCBzdHJ1Y3QgZ2xvYl9saW0gKmxpbWl0cCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzYjsKKwlDaGFyICpwLCAqcTsKKwlpbnQgYW55bWV0YTsKKworCS8qCisJICogTG9vcCBvdmVyIHBhdHRlcm4gc2VnbWVudHMgdW50aWwgZW5kIG9mIHBhdHRlcm4gb3IgdW50aWwKKwkgKiBzZWdtZW50IHdpdGggbWV0YSBjaGFyYWN0ZXIgZm91bmQuCisJICovCisJZm9yIChhbnltZXRhID0gMDs7KSB7CisJCWlmICgqcGF0dGVybiA9PSBFT1MpIHsJCS8qIEVuZCBvZiBwYXR0ZXJuPyAqLworCQkJKnBhdGhlbmQgPSBFT1M7CisJCQlpZiAoZ19sc3RhdChwYXRoYnVmLCAmc2IsIHBnbG9iKSkKKwkJCQlyZXR1cm4oMCk7CisKKwkJCWlmICgocGdsb2ItPmdsX2ZsYWdzICYgR0xPQl9MSU1JVCkgJiYKKwkJCSAgICBsaW1pdHAtPmdsaW1fc3RhdCsrID49IEdMT0JfTElNSVRfU1RBVCkgeworCQkJCWVycm5vID0gMDsKKwkJCQkqcGF0aGVuZCsrID0gU0VQOworCQkJCSpwYXRoZW5kID0gRU9TOworCQkJCXJldHVybihHTE9CX05PU1BBQ0UpOworCQkJfQorCisJCQlpZiAoKChwZ2xvYi0+Z2xfZmxhZ3MgJiBHTE9CX01BUkspICYmCisJCQkgICAgcGF0aGVuZFstMV0gIT0gU0VQKSAmJiAoU19JU0RJUihzYi5zdF9tb2RlKSB8fAorCQkJICAgIChTX0lTTE5LKHNiLnN0X21vZGUpICYmCisJCQkgICAgKGdfc3RhdChwYXRoYnVmLCAmc2IsIHBnbG9iKSA9PSAwKSAmJgorCQkJICAgIFNfSVNESVIoc2Iuc3RfbW9kZSkpKSkgeworCQkJCWlmIChwYXRoZW5kKzEgPiBwYXRoZW5kX2xhc3QpCisJCQkJCXJldHVybiAoMSk7CisJCQkJKnBhdGhlbmQrKyA9IFNFUDsKKwkJCQkqcGF0aGVuZCA9IEVPUzsKKwkJCX0KKwkJCSsrcGdsb2ItPmdsX21hdGNoYzsKKwkJCXJldHVybihnbG9iZXh0ZW5kKHBhdGhidWYsIHBnbG9iLCBsaW1pdHAsICZzYikpOworCQl9CisKKwkJLyogRmluZCBlbmQgb2YgbmV4dCBzZWdtZW50LCBjb3B5IHRlbnRhdGl2ZWx5IHRvIHBhdGhlbmQuICovCisJCXEgPSBwYXRoZW5kOworCQlwID0gcGF0dGVybjsKKwkJd2hpbGUgKCpwICE9IEVPUyAmJiAqcCAhPSBTRVApIHsKKwkJCWlmIChpc21ldGEoKnApKQorCQkJCWFueW1ldGEgPSAxOworCQkJaWYgKHErMSA+IHBhdGhlbmRfbGFzdCkKKwkJCQlyZXR1cm4gKDEpOworCQkJKnErKyA9ICpwKys7CisJCX0KKworCQlpZiAoIWFueW1ldGEpIHsJCS8qIE5vIGV4cGFuc2lvbiwgZG8gbmV4dCBzZWdtZW50LiAqLworCQkJcGF0aGVuZCA9IHE7CisJCQlwYXR0ZXJuID0gcDsKKwkJCXdoaWxlICgqcGF0dGVybiA9PSBTRVApIHsKKwkJCQlpZiAocGF0aGVuZCsxID4gcGF0aGVuZF9sYXN0KQorCQkJCQlyZXR1cm4gKDEpOworCQkJCSpwYXRoZW5kKysgPSAqcGF0dGVybisrOworCQkJfQorCQl9IGVsc2UKKwkJCS8qIE5lZWQgZXhwYW5zaW9uLCByZWN1cnNlLiAqLworCQkJcmV0dXJuKGdsb2IzKHBhdGhidWYsIHBhdGhidWZfbGFzdCwgcGF0aGVuZCwKKwkJCSAgICBwYXRoZW5kX2xhc3QsIHBhdHRlcm4sIHAsIHBhdHRlcm5fbGFzdCwKKwkJCSAgICBwZ2xvYiwgbGltaXRwKSk7CisJfQorCS8qIE5PVFJFQUNIRUQgKi8KK30KKworc3RhdGljIGludAorZ2xvYjMoQ2hhciAqcGF0aGJ1ZiwgQ2hhciAqcGF0aGJ1Zl9sYXN0LCBDaGFyICpwYXRoZW5kLCBDaGFyICpwYXRoZW5kX2xhc3QsCisgICAgQ2hhciAqcGF0dGVybiwgQ2hhciAqcmVzdHBhdHRlcm4sIENoYXIgKnJlc3RwYXR0ZXJuX2xhc3QsIGdsb2JfdCAqcGdsb2IsCisgICAgc3RydWN0IGdsb2JfbGltICpsaW1pdHApCit7CisJc3RydWN0IGRpcmVudCAqZHA7CisJRElSICpkaXJwOworCWludCBlcnI7CisJY2hhciBidWZbTUFYUEFUSExFTl07CisKKwkvKgorCSAqIFRoZSByZWFkZGlyZnVuYyBkZWNsYXJhdGlvbiBjYW4ndCBiZSBwcm90b3R5cGVkLCBiZWNhdXNlIGl0IGlzCisJICogYXNzaWduZWQsIGJlbG93LCB0byB0d28gZnVuY3Rpb25zIHdoaWNoIGFyZSBwcm90b3R5cGVkIGluIGdsb2IuaAorCSAqIGFuZCBkaXJlbnQuaCBhcyB0YWtpbmcgcG9pbnRlcnMgdG8gZGlmZmVyZW50bHkgdHlwZWQgb3BhcXVlCisJICogc3RydWN0dXJlcy4KKwkgKi8KKwlzdHJ1Y3QgZGlyZW50ICooKnJlYWRkaXJmdW5jKSh2b2lkICopOworCisJaWYgKHBhdGhlbmQgPiBwYXRoZW5kX2xhc3QpCisJCXJldHVybiAoMSk7CisJKnBhdGhlbmQgPSBFT1M7CisJZXJybm8gPSAwOworCisJaWYgKChkaXJwID0gZ19vcGVuZGlyKHBhdGhidWYsIHBnbG9iKSkgPT0gTlVMTCkgeworCQkvKiBUT0RPOiBkb24ndCBjYWxsIGZvciBFTk9FTlQgb3IgRU5PVERJUj8gKi8KKwkJaWYgKHBnbG9iLT5nbF9lcnJmdW5jKSB7CisJCQlpZiAoZ19DdG9jKHBhdGhidWYsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKQorCQkJCXJldHVybihHTE9CX0FCT1JURUQpOworCQkJaWYgKHBnbG9iLT5nbF9lcnJmdW5jKGJ1ZiwgZXJybm8pIHx8CisJCQkgICAgcGdsb2ItPmdsX2ZsYWdzICYgR0xPQl9FUlIpCisJCQkJcmV0dXJuKEdMT0JfQUJPUlRFRCk7CisJCX0KKwkJcmV0dXJuKDApOworCX0KKworCWVyciA9IDA7CisKKwkvKiBTZWFyY2ggZGlyZWN0b3J5IGZvciBtYXRjaGluZyBuYW1lcy4gKi8KKwlpZiAocGdsb2ItPmdsX2ZsYWdzICYgR0xPQl9BTFRESVJGVU5DKQorCQlyZWFkZGlyZnVuYyA9IHBnbG9iLT5nbF9yZWFkZGlyOworCWVsc2UKKwkJcmVhZGRpcmZ1bmMgPSAoc3RydWN0IGRpcmVudCAqKCopKHZvaWQgKikpcmVhZGRpcjsKKwl3aGlsZSAoKGRwID0gKCpyZWFkZGlyZnVuYykoZGlycCkpKSB7CisJCXVfY2hhciAqc2M7CisJCUNoYXIgKmRjOworCisJCWlmICgocGdsb2ItPmdsX2ZsYWdzICYgR0xPQl9MSU1JVCkgJiYKKwkJICAgIGxpbWl0cC0+Z2xpbV9yZWFkZGlyKysgPj0gR0xPQl9MSU1JVF9SRUFERElSKSB7CisJCQllcnJubyA9IDA7CisJCQkqcGF0aGVuZCsrID0gU0VQOworCQkJKnBhdGhlbmQgPSBFT1M7CisJCQllcnIgPSBHTE9CX05PU1BBQ0U7CisJCQlicmVhazsKKwkJfQorCisJCS8qIEluaXRpYWwgRE9UIG11c3QgYmUgbWF0Y2hlZCBsaXRlcmFsbHkuICovCisJCWlmIChkcC0+ZF9uYW1lWzBdID09IERPVCAmJiAqcGF0dGVybiAhPSBET1QpCisJCQljb250aW51ZTsKKwkJZGMgPSBwYXRoZW5kOworCQlzYyA9ICh1X2NoYXIgKikgZHAtPmRfbmFtZTsKKwkJd2hpbGUgKGRjIDwgcGF0aGVuZF9sYXN0ICYmICgqZGMrKyA9ICpzYysrKSAhPSBFT1MpCisJCQk7CisJCWlmIChkYyA+PSBwYXRoZW5kX2xhc3QpIHsKKwkJCSpkYyA9IEVPUzsKKwkJCWVyciA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCWlmICghbWF0Y2gocGF0aGVuZCwgcGF0dGVybiwgcmVzdHBhdHRlcm4sIEdMT0JfTElNSVRfUkVDVVIpKSB7CisJCQkqcGF0aGVuZCA9IEVPUzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVyciA9IGdsb2IyKHBhdGhidWYsIHBhdGhidWZfbGFzdCwgLS1kYywgcGF0aGVuZF9sYXN0LAorCQkgICAgcmVzdHBhdHRlcm4sIHJlc3RwYXR0ZXJuX2xhc3QsIHBnbG9iLCBsaW1pdHApOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJfQorCisJaWYgKHBnbG9iLT5nbF9mbGFncyAmIEdMT0JfQUxURElSRlVOQykKKwkJKCpwZ2xvYi0+Z2xfY2xvc2VkaXIpKGRpcnApOworCWVsc2UKKwkJY2xvc2VkaXIoZGlycCk7CisJcmV0dXJuKGVycik7Cit9CisKKworLyoKKyAqIEV4dGVuZCB0aGUgZ2xfcGF0aHYgbWVtYmVyIG9mIGEgZ2xvYl90IHN0cnVjdHVyZSB0byBhY2NvbW1vZGF0ZSBhIG5ldyBpdGVtLAorICogYWRkIHRoZSBuZXcgaXRlbSwgYW5kIHVwZGF0ZSBnbF9wYXRoYy4KKyAqCisgKiBUaGlzIGFzc3VtZXMgdGhlIEJTRCByZWFsbG9jLCB3aGljaCBvbmx5IGNvcGllcyB0aGUgYmxvY2sgd2hlbiBpdHMgc2l6ZQorICogY3Jvc3NlcyBhIHBvd2VyLW9mLXR3byBib3VuZGFyeTsgZm9yIHY3IHJlYWxsb2MsIHRoaXMgd291bGQgY2F1c2UgcXVhZHJhdGljCisgKiBiZWhhdmlvci4KKyAqCisgKiBSZXR1cm4gMCBpZiBuZXcgaXRlbSBhZGRlZCwgZXJyb3IgY29kZSBpZiBtZW1vcnkgY291bGRuJ3QgYmUgYWxsb2NhdGVkLgorICoKKyAqIEludmFyaWFudCBvZiB0aGUgZ2xvYl90IHN0cnVjdHVyZToKKyAqCUVpdGhlciBnbF9wYXRoYyBpcyB6ZXJvIGFuZCBnbF9wYXRodiBpcyBOVUxMOyBvciBnbF9wYXRoYyA+IDAgYW5kCisgKglnbF9wYXRodiBwb2ludHMgdG8gKGdsX29mZnMgKyBnbF9wYXRoYyArIDEpIGl0ZW1zLgorICovCitzdGF0aWMgaW50CitnbG9iZXh0ZW5kKGNvbnN0IENoYXIgKnBhdGgsIGdsb2JfdCAqcGdsb2IsIHN0cnVjdCBnbG9iX2xpbSAqbGltaXRwLAorICAgIHN0cnVjdCBzdGF0ICpzYikKK3sKKwljaGFyICoqcGF0aHY7CisJc3NpemVfdCBpOworCXNpemVfdCBuZXduLCBsZW47CisJY2hhciAqY29weSA9IE5VTEw7CisJY29uc3QgQ2hhciAqcDsKKwlzdHJ1Y3Qgc3RhdCAqKnN0YXR2OworCisJbmV3biA9IDIgKyBwZ2xvYi0+Z2xfcGF0aGMgKyBwZ2xvYi0+Z2xfb2ZmczsKKwlpZiAocGdsb2ItPmdsX29mZnMgPj0gSU5UX01BWCB8fAorCSAgICBwZ2xvYi0+Z2xfcGF0aGMgPj0gSU5UX01BWCB8fAorCSAgICBuZXduID49IElOVF9NQVggfHwKKwkgICAgU0laRV9NQVggLyBzaXplb2YoKnBhdGh2KSA8PSBuZXduIHx8CisJICAgIFNJWkVfTUFYIC8gc2l6ZW9mKCpzdGF0dikgPD0gbmV3bikgeworIG5vc3BhY2U6CisJCWZvciAoaSA9IHBnbG9iLT5nbF9vZmZzOyBpIDwgKHNzaXplX3QpKG5ld24gLSAyKTsgaSsrKSB7CisJCQlpZiAocGdsb2ItPmdsX3BhdGh2ICYmIHBnbG9iLT5nbF9wYXRodltpXSkKKwkJCQlmcmVlKHBnbG9iLT5nbF9wYXRodltpXSk7CisJCQlpZiAoKHBnbG9iLT5nbF9mbGFncyAmIEdMT0JfS0VFUFNUQVQpICE9IDAgJiYKKwkJCSAgICBwZ2xvYi0+Z2xfcGF0aHYgJiYgcGdsb2ItPmdsX3BhdGh2W2ldKQorCQkJCWZyZWUocGdsb2ItPmdsX3N0YXR2W2ldKTsKKwkJfQorCQlpZiAocGdsb2ItPmdsX3BhdGh2KSB7CisJCQlmcmVlKHBnbG9iLT5nbF9wYXRodik7CisJCQlwZ2xvYi0+Z2xfcGF0aHYgPSBOVUxMOworCQl9CisJCWlmIChwZ2xvYi0+Z2xfc3RhdHYpIHsKKwkJCWZyZWUocGdsb2ItPmdsX3N0YXR2KTsKKwkJCXBnbG9iLT5nbF9zdGF0diA9IE5VTEw7CisJCX0KKwkJcmV0dXJuKEdMT0JfTk9TUEFDRSk7CisJfQorCisJcGF0aHYgPSByZWFsbG9jKHBnbG9iLT5nbF9wYXRodiwgbmV3biAqIHNpemVvZigqcGF0aHYpKTsKKwlpZiAocGF0aHYgPT0gTlVMTCkKKwkJZ290byBub3NwYWNlOworCWlmIChwZ2xvYi0+Z2xfcGF0aHYgPT0gTlVMTCAmJiBwZ2xvYi0+Z2xfb2ZmcyA+IDApIHsKKwkJLyogZmlyc3QgdGltZSBhcm91bmQgLS0gY2xlYXIgaW5pdGlhbCBnbF9vZmZzIGl0ZW1zICovCisJCXBhdGh2ICs9IHBnbG9iLT5nbF9vZmZzOworCQlmb3IgKGkgPSBwZ2xvYi0+Z2xfb2ZmczsgLS1pID49IDA7ICkKKwkJCSotLXBhdGh2ID0gTlVMTDsKKwl9CisJcGdsb2ItPmdsX3BhdGh2ID0gcGF0aHY7CisKKwlpZiAoKHBnbG9iLT5nbF9mbGFncyAmIEdMT0JfS0VFUFNUQVQpICE9IDApIHsKKwkJc3RhdHYgPSByZWFsbG9jKHBnbG9iLT5nbF9zdGF0diwgbmV3biAqIHNpemVvZigqc3RhdHYpKTsKKwkJaWYgKHN0YXR2ID09IE5VTEwpCisJCQlnb3RvIG5vc3BhY2U7CisJCWlmIChwZ2xvYi0+Z2xfc3RhdHYgPT0gTlVMTCAmJiBwZ2xvYi0+Z2xfb2ZmcyA+IDApIHsKKwkJCS8qIGZpcnN0IHRpbWUgYXJvdW5kIC0tIGNsZWFyIGluaXRpYWwgZ2xfb2ZmcyBpdGVtcyAqLworCQkJc3RhdHYgKz0gcGdsb2ItPmdsX29mZnM7CisJCQlmb3IgKGkgPSBwZ2xvYi0+Z2xfb2ZmczsgLS1pID49IDA7ICkKKwkJCQkqLS1zdGF0diA9IE5VTEw7CisJCX0KKwkJcGdsb2ItPmdsX3N0YXR2ID0gc3RhdHY7CisJCWlmIChzYiA9PSBOVUxMKQorCQkJc3RhdHZbcGdsb2ItPmdsX29mZnMgKyBwZ2xvYi0+Z2xfcGF0aGNdID0gTlVMTDsKKwkJZWxzZSB7CisJCQlsaW1pdHAtPmdsaW1fbWFsbG9jICs9IHNpemVvZigqKnN0YXR2KTsKKwkJCWlmICgocGdsb2ItPmdsX2ZsYWdzICYgR0xPQl9MSU1JVCkgJiYKKwkJCSAgICBsaW1pdHAtPmdsaW1fbWFsbG9jID49IEdMT0JfTElNSVRfTUFMTE9DKSB7CisJCQkJZXJybm8gPSAwOworCQkJCXJldHVybihHTE9CX05PU1BBQ0UpOworCQkJfQorCQkJaWYgKChzdGF0dltwZ2xvYi0+Z2xfb2ZmcyArIHBnbG9iLT5nbF9wYXRoY10gPQorCQkJICAgIG1hbGxvYyhzaXplb2YoKipzdGF0dikpKSA9PSBOVUxMKQorCQkJCWdvdG8gY29weV9lcnJvcjsKKwkJCW1lbWNweShzdGF0dltwZ2xvYi0+Z2xfb2ZmcyArIHBnbG9iLT5nbF9wYXRoY10sIHNiLAorCQkJICAgIHNpemVvZigqc2IpKTsKKwkJfQorCQlzdGF0dltwZ2xvYi0+Z2xfb2ZmcyArIHBnbG9iLT5nbF9wYXRoYyArIDFdID0gTlVMTDsKKwl9CisKKwlmb3IgKHAgPSBwYXRoOyAqcCsrOykKKwkJOworCWxlbiA9IChzaXplX3QpKHAgLSBwYXRoKTsKKwlsaW1pdHAtPmdsaW1fbWFsbG9jICs9IGxlbjsKKwlpZiAoKGNvcHkgPSBtYWxsb2MobGVuKSkgIT0gTlVMTCkgeworCQlpZiAoZ19DdG9jKHBhdGgsIGNvcHksIGxlbikpIHsKKwkJCWZyZWUoY29weSk7CisJCQlyZXR1cm4oR0xPQl9OT1NQQUNFKTsKKwkJfQorCQlwYXRodltwZ2xvYi0+Z2xfb2ZmcyArIHBnbG9iLT5nbF9wYXRoYysrXSA9IGNvcHk7CisJfQorCXBhdGh2W3BnbG9iLT5nbF9vZmZzICsgcGdsb2ItPmdsX3BhdGhjXSA9IE5VTEw7CisKKwlpZiAoKHBnbG9iLT5nbF9mbGFncyAmIEdMT0JfTElNSVQpICYmCisJICAgIChuZXduICogc2l6ZW9mKCpwYXRodikpICsgbGltaXRwLT5nbGltX21hbGxvYyA+CisJICAgIEdMT0JfTElNSVRfTUFMTE9DKSB7CisJCWVycm5vID0gMDsKKwkJcmV0dXJuKEdMT0JfTk9TUEFDRSk7CisJfQorIGNvcHlfZXJyb3I6CisJcmV0dXJuKGNvcHkgPT0gTlVMTCA/IEdMT0JfTk9TUEFDRSA6IDApOworfQorCisKKy8qCisgKiBwYXR0ZXJuIG1hdGNoaW5nIGZ1bmN0aW9uIGZvciBmaWxlbmFtZXMuICBFYWNoIG9jY3VycmVuY2Ugb2YgdGhlICoKKyAqIHBhdHRlcm4gY2F1c2VzIGEgcmVjdXJzaW9uIGxldmVsLgorICovCitzdGF0aWMgaW50CittYXRjaChDaGFyICpuYW1lLCBDaGFyICpwYXQsIENoYXIgKnBhdGVuZCwgaW50IHJlY3VyKQoreworCWludCBvaywgbmVnYXRlX3JhbmdlOworCUNoYXIgYywgazsKKworCWlmIChyZWN1ci0tID09IDApCisJCXJldHVybihHTE9CX05PU1BBQ0UpOworCisJd2hpbGUgKHBhdCA8IHBhdGVuZCkgeworCQljID0gKnBhdCsrOworCQlzd2l0Y2ggKGMgJiBNX01BU0spIHsKKwkJY2FzZSBNX0FMTDoKKwkJCXdoaWxlIChwYXQgPCBwYXRlbmQgJiYgKCpwYXQgJiBNX01BU0spID09IE1fQUxMKQorCQkJCXBhdCsrOwkvKiBlYXQgY29uc2VjdXRpdmUgJyonICovCisJCQlpZiAocGF0ID09IHBhdGVuZCkKKwkJCQlyZXR1cm4oMSk7CisJCQlkbyB7CisJCQkgICAgaWYgKG1hdGNoKG5hbWUsIHBhdCwgcGF0ZW5kLCByZWN1cikpCisJCQkJICAgIHJldHVybigxKTsKKwkJCX0gd2hpbGUgKCpuYW1lKysgIT0gRU9TKTsKKwkJCXJldHVybigwKTsKKwkJY2FzZSBNX09ORToKKwkJCWlmICgqbmFtZSsrID09IEVPUykKKwkJCQlyZXR1cm4oMCk7CisJCQlicmVhazsKKwkJY2FzZSBNX1NFVDoKKwkJCW9rID0gMDsKKwkJCWlmICgoayA9ICpuYW1lKyspID09IEVPUykKKwkJCQlyZXR1cm4oMCk7CisJCQlpZiAoKG5lZ2F0ZV9yYW5nZSA9ICgoKnBhdCAmIE1fTUFTSykgPT0gTV9OT1QpKSAhPSBFT1MpCisJCQkJKytwYXQ7CisJCQl3aGlsZSAoKChjID0gKnBhdCsrKSAmIE1fTUFTSykgIT0gTV9FTkQpIHsKKwkJCQlpZiAoKGMgJiBNX01BU0spID09IE1fQ0xBU1MpIHsKKwkJCQkJQ2hhciBpZHggPSAqcGF0ICYgTV9NQVNLOworCQkJCQlpZiAoaWR4IDwgTkNDTEFTU0VTICYmCisJCQkJCSAgICBjY2xhc3Nlc1tpZHhdLmlzY3R5cGUoaykpCisJCQkJCQlvayA9IDE7CisJCQkJCSsrcGF0OworCQkJCX0KKwkJCQlpZiAoKCpwYXQgJiBNX01BU0spID09IE1fUk5HKSB7CisJCQkJCWlmIChjIDw9IGsgJiYgayA8PSBwYXRbMV0pCisJCQkJCQlvayA9IDE7CisJCQkJCXBhdCArPSAyOworCQkJCX0gZWxzZSBpZiAoYyA9PSBrKQorCQkJCQlvayA9IDE7CisJCQl9CisJCQlpZiAob2sgPT0gbmVnYXRlX3JhbmdlKQorCQkJCXJldHVybigwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKCpuYW1lKysgIT0gYykKKwkJCQlyZXR1cm4oMCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4oKm5hbWUgPT0gRU9TKTsKK30KKworLyogRnJlZSBhbGxvY2F0ZWQgZGF0YSBiZWxvbmdpbmcgdG8gYSBnbG9iX3Qgc3RydWN0dXJlLiAqLwordm9pZAorZ2xvYmZyZWUoZ2xvYl90ICpwZ2xvYikKK3sKKwlpbnQgaTsKKwljaGFyICoqcHA7CisKKwlpZiAocGdsb2ItPmdsX3BhdGh2ICE9IE5VTEwpIHsKKwkJcHAgPSBwZ2xvYi0+Z2xfcGF0aHYgKyBwZ2xvYi0+Z2xfb2ZmczsKKwkJZm9yIChpID0gcGdsb2ItPmdsX3BhdGhjOyBpLS07ICsrcHApCisJCQlpZiAoKnBwKQorCQkJCWZyZWUoKnBwKTsKKwkJZnJlZShwZ2xvYi0+Z2xfcGF0aHYpOworCQlwZ2xvYi0+Z2xfcGF0aHYgPSBOVUxMOworCX0KKwlpZiAocGdsb2ItPmdsX3N0YXR2ICE9IE5VTEwpIHsKKwkJZm9yIChpID0gMDsgaSA8IHBnbG9iLT5nbF9wYXRoYzsgaSsrKSB7CisJCQlpZiAocGdsb2ItPmdsX3N0YXR2W2ldICE9IE5VTEwpCisJCQkJZnJlZShwZ2xvYi0+Z2xfc3RhdHZbaV0pOworCQl9CisJCWZyZWUocGdsb2ItPmdsX3N0YXR2KTsKKwkJcGdsb2ItPmdsX3N0YXR2ID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBESVIgKgorZ19vcGVuZGlyKENoYXIgKnN0ciwgZ2xvYl90ICpwZ2xvYikKK3sKKwljaGFyIGJ1ZltNQVhQQVRITEVOXTsKKworCWlmICghKnN0cikKKwkJc3RybGNweShidWYsICIuIiwgc2l6ZW9mIGJ1Zik7CisJZWxzZSB7CisJCWlmIChnX0N0b2Moc3RyLCBidWYsIHNpemVvZihidWYpKSkKKwkJCXJldHVybihOVUxMKTsKKwl9CisKKwlpZiAocGdsb2ItPmdsX2ZsYWdzICYgR0xPQl9BTFRESVJGVU5DKQorCQlyZXR1cm4oKCpwZ2xvYi0+Z2xfb3BlbmRpcikoYnVmKSk7CisKKwlyZXR1cm4ob3BlbmRpcihidWYpKTsKK30KKworc3RhdGljIGludAorZ19sc3RhdChDaGFyICpmbiwgc3RydWN0IHN0YXQgKnNiLCBnbG9iX3QgKnBnbG9iKQoreworCWNoYXIgYnVmW01BWFBBVEhMRU5dOworCisJaWYgKGdfQ3RvYyhmbiwgYnVmLCBzaXplb2YoYnVmKSkpCisJCXJldHVybigtMSk7CisJaWYgKHBnbG9iLT5nbF9mbGFncyAmIEdMT0JfQUxURElSRlVOQykKKwkJcmV0dXJuKCgqcGdsb2ItPmdsX2xzdGF0KShidWYsIHNiKSk7CisJcmV0dXJuKGxzdGF0KGJ1Ziwgc2IpKTsKK30KKworc3RhdGljIGludAorZ19zdGF0KENoYXIgKmZuLCBzdHJ1Y3Qgc3RhdCAqc2IsIGdsb2JfdCAqcGdsb2IpCit7CisJY2hhciBidWZbTUFYUEFUSExFTl07CisKKwlpZiAoZ19DdG9jKGZuLCBidWYsIHNpemVvZihidWYpKSkKKwkJcmV0dXJuKC0xKTsKKwlpZiAocGdsb2ItPmdsX2ZsYWdzICYgR0xPQl9BTFRESVJGVU5DKQorCQlyZXR1cm4oKCpwZ2xvYi0+Z2xfc3RhdCkoYnVmLCBzYikpOworCXJldHVybihzdGF0KGJ1Ziwgc2IpKTsKK30KKworc3RhdGljIENoYXIgKgorZ19zdHJjaHIoY29uc3QgQ2hhciAqc3RyLCBpbnQgY2gpCit7CisJZG8geworCQlpZiAoKnN0ciA9PSBjaCkKKwkJCXJldHVybiAoKENoYXIgKilzdHIpOworCX0gd2hpbGUgKCpzdHIrKyk7CisJcmV0dXJuIChOVUxMKTsKK30KKworc3RhdGljIGludAorZ19DdG9jKGNvbnN0IENoYXIgKnN0ciwgY2hhciAqYnVmLCB1X2ludCBsZW4pCit7CisKKwl3aGlsZSAobGVuLS0pIHsKKwkJaWYgKCgqYnVmKysgPSAqc3RyKyspID09IEVPUykKKwkJCXJldHVybiAoMCk7CisJfQorCXJldHVybiAoMSk7Cit9CisKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQKK3FwcmludGYoY29uc3QgY2hhciAqc3RyLCBDaGFyICpzKQoreworCUNoYXIgKnA7CisKKwkodm9pZClwcmludGYoIiVzOlxuIiwgc3RyKTsKKwlmb3IgKHAgPSBzOyAqcDsgcCsrKQorCQkodm9pZClwcmludGYoIiVjIiwgQ0hBUigqcCkpOworCSh2b2lkKXByaW50ZigiXG4iKTsKKwlmb3IgKHAgPSBzOyAqcDsgcCsrKQorCQkodm9pZClwcmludGYoIiVjIiwgKnAgJiBNX1BST1RFQ1QgPyAnIicgOiAnICcpOworCSh2b2lkKXByaW50ZigiXG4iKTsKKwlmb3IgKHAgPSBzOyAqcDsgcCsrKQorCQkodm9pZClwcmludGYoIiVjIiwgaXNtZXRhKCpwKSA/ICdfJyA6ICcgJyk7CisJKHZvaWQpcHJpbnRmKCJcbiIpOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX0dMT0IpIHx8ICFkZWZpbmVkKEdMT0JfSEFTX0FMVERJUkZVTkMpIHx8CisgICAgICAgICAgIWRlZmluZWQoR0xPQl9IQVNfR0xfTUFUQ0hDKSB8fCAhZGVmaW5lZChHTE9CX0hBU19HTF9TVEFUVikgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvZ2xvYi5oIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9nbG9iLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhhN2ZhNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvZ2xvYi5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgkkT3BlbkJTRDogZ2xvYi5oLHYgMS4xMSAyMDEwLzA5LzI0IDEzOjMyOjU1IGRqbSBFeHAgJAkqLworLyoJJE5ldEJTRDogZ2xvYi5oLHYgMS41IDE5OTQvMTAvMjYgMDA6NTU6NTYgY2dkIEV4cCAkCSovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODksIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEd1aWRvIHZhbiBSb3NzdW0uCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylnbG9iLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCisgKi8KKworLyogT1BFTkJTRCBPUklHSU5BTDogaW5jbHVkZS9nbG9iLmggKi8KKworI2lmICFkZWZpbmVkKEhBVkVfR0xPQl9IKSB8fCAhZGVmaW5lZChHTE9CX0hBU19BTFRESVJGVU5DKSB8fCBcCisgICAgIWRlZmluZWQoR0xPQl9IQVNfR0xfTUFUQ0hDKSB8fCAhZGVmaW5lZChHTE9CX0hBU19HTF9TVEFUVikgfHwgXAorICAgICFkZWZpbmVkKEhBVkVfREVDTF9HTE9CX05PTUFUQ0gpIHx8IEhBVkVfREVDTF9HTE9CX05PTUFUQ0ggPT0gMCB8fCBcCisgICAgZGVmaW5lZChCUk9LRU5fR0xPQikKKworI2lmbmRlZiBfR0xPQl9IXworI2RlZmluZQlfR0xPQl9IXworCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworc3RydWN0IHN0YXQ7Cit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGdsX3BhdGhjOwkJLyogQ291bnQgb2YgdG90YWwgcGF0aHMgc28gZmFyLiAqLworCWludCBnbF9tYXRjaGM7CQkvKiBDb3VudCBvZiBwYXRocyBtYXRjaGluZyBwYXR0ZXJuLiAqLworCWludCBnbF9vZmZzOwkJLyogUmVzZXJ2ZWQgYXQgYmVnaW5uaW5nIG9mIGdsX3BhdGh2LiAqLworCWludCBnbF9mbGFnczsJCS8qIENvcHkgb2YgZmxhZ3MgcGFyYW1ldGVyIHRvIGdsb2IuICovCisJY2hhciAqKmdsX3BhdGh2OwkvKiBMaXN0IG9mIHBhdGhzIG1hdGNoaW5nIHBhdHRlcm4uICovCisJc3RydWN0IHN0YXQgKipnbF9zdGF0djsJLyogU3RhdCBlbnRyaWVzIGNvcnJlc3BvbmRpbmcgdG8gZ2xfcGF0aHYgKi8KKwkJCQkvKiBDb3B5IG9mIGVycmZ1bmMgcGFyYW1ldGVyIHRvIGdsb2IuICovCisJaW50ICgqZ2xfZXJyZnVuYykoY29uc3QgY2hhciAqLCBpbnQpOworCisJLyoKKwkgKiBBbHRlcm5hdGUgZmlsZXN5c3RlbSBhY2Nlc3MgbWV0aG9kcyBmb3IgZ2xvYjsgcmVwbGFjZW1lbnQKKwkgKiB2ZXJzaW9ucyBvZiBjbG9zZWRpcigzKSwgcmVhZGRpcigzKSwgb3BlbmRpcigzKSwgc3RhdCgyKQorCSAqIGFuZCBsc3RhdCgyKS4KKwkgKi8KKwl2b2lkICgqZ2xfY2xvc2VkaXIpKHZvaWQgKik7CisJc3RydWN0IGRpcmVudCAqKCpnbF9yZWFkZGlyKSh2b2lkICopOwkKKwl2b2lkICooKmdsX29wZW5kaXIpKGNvbnN0IGNoYXIgKik7CisJaW50ICgqZ2xfbHN0YXQpKGNvbnN0IGNoYXIgKiwgc3RydWN0IHN0YXQgKik7CisJaW50ICgqZ2xfc3RhdCkoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3RhdCAqKTsKK30gZ2xvYl90OworCisjZGVmaW5lCUdMT0JfQVBQRU5ECTB4MDAwMQkvKiBBcHBlbmQgdG8gb3V0cHV0IGZyb20gcHJldmlvdXMgY2FsbC4gKi8KKyNkZWZpbmUJR0xPQl9ET09GRlMJMHgwMDAyCS8qIFVzZSBnbF9vZmZzLiAqLworI2RlZmluZQlHTE9CX0VSUgkweDAwMDQJLyogUmV0dXJuIG9uIGVycm9yLiAqLworI2RlZmluZQlHTE9CX01BUksJMHgwMDA4CS8qIEFwcGVuZCAvIHRvIG1hdGNoaW5nIGRpcmVjdG9yaWVzLiAqLworI2RlZmluZQlHTE9CX05PQ0hFQ0sJMHgwMDEwCS8qIFJldHVybiBwYXR0ZXJuIGl0c2VsZiBpZiBub3RoaW5nIG1hdGNoZXMuICovCisjZGVmaW5lCUdMT0JfTk9TT1JUCTB4MDAyMAkvKiBEb24ndCBzb3J0LiAqLworI2RlZmluZQlHTE9CX05PRVNDQVBFCTB4MTAwMAkvKiBEaXNhYmxlIGJhY2tzbGFzaCBlc2NhcGluZy4gKi8KKworI2RlZmluZQlHTE9CX05PU1BBQ0UJKC0xKQkvKiBNYWxsb2MgY2FsbCBmYWlsZWQuICovCisjZGVmaW5lCUdMT0JfQUJPUlRFRAkoLTIpCS8qIFVuaWdub3JlZCBlcnJvci4gKi8KKyNkZWZpbmUJR0xPQl9OT01BVENICSgtMykJLyogTm8gbWF0Y2ggYW5kIEdMT0JfTk9DSEVDSyBub3Qgc2V0LiAqLworI2RlZmluZQlHTE9CX05PU1lTCSgtNCkJLyogRnVuY3Rpb24gbm90IHN1cHBvcnRlZC4gKi8KKworI2RlZmluZQlHTE9CX0FMVERJUkZVTkMJMHgwMDQwCS8qIFVzZSBhbHRlcm5hdGVseSBzcGVjaWZpZWQgZGlyZWN0b3J5IGZ1bmNzLiAqLworI2RlZmluZQlHTE9CX0JSQUNFCTB4MDA4MAkvKiBFeHBhbmQgYnJhY2VzIGFsYSBjc2guICovCisjZGVmaW5lCUdMT0JfTUFHQ0hBUgkweDAxMDAJLyogUGF0dGVybiBoYWQgZ2xvYmJpbmcgY2hhcmFjdGVycy4gKi8KKyNkZWZpbmUJR0xPQl9OT01BR0lDCTB4MDIwMAkvKiBHTE9CX05PQ0hFQ0sgd2l0aG91dCBtYWdpYyBjaGFycyAoY3NoKS4gKi8KKyNkZWZpbmUJR0xPQl9RVU9URQkweDA0MDAJLyogUXVvdGUgc3BlY2lhbCBjaGFycyB3aXRoIFwuICovCisjZGVmaW5lCUdMT0JfVElMREUJMHgwODAwCS8qIEV4cGFuZCB0aWxkZSBuYW1lcyBmcm9tIHRoZSBwYXNzd2QgZmlsZS4gKi8KKyNkZWZpbmUgR0xPQl9MSU1JVAkweDIwMDAJLyogTGltaXQgcGF0dGVybiBtYXRjaCBvdXRwdXQgdG8gQVJHX01BWCAqLworI2RlZmluZQlHTE9CX0tFRVBTVEFUCTB4NDAwMAkvKiBSZXRhaW4gc3RhdCBkYXRhIGZvciBwYXRocyBpbiBnbF9zdGF0di4gKi8KKyNkZWZpbmUgR0xPQl9BQkVORAlHTE9CX0FCT1JURUQgLyogYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworCitpbnQJZ2xvYihjb25zdCBjaGFyICosIGludCwgaW50ICgqKShjb25zdCBjaGFyICosIGludCksIGdsb2JfdCAqKTsKK3ZvaWQJZ2xvYmZyZWUoZ2xvYl90ICopOworCisjZW5kaWYgLyogIV9HTE9CX0hfICovCisKKyNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX0dMT0JfSCkgfHwgIWRlZmluZWQoR0xPQl9IQVNfQUxURElSRlVOQykgIHx8CisJICAhZGVmaW5lZChHTE9CX0hBU19HTF9NQVRDSEMpIHx8ICFkZWZpbmVkKEdMT0hfSEFTX0dMX1NUQVRWKSAqLworCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2luZXRfYXRvbi5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9pbmV0X2F0b24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzA1OTdlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9pbmV0X2F0b24uYwpAQCAtMCwwICsxLDE3OSBAQAorLyoJJE9wZW5CU0Q6IGluZXRfYWRkci5jLHYgMS45IDIwMDUvMDgvMDYgMjA6MzA6MDMgZXNwaWUgRXhwICQJKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MywgMTk5MCwgMTk5MworICogICAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAtCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTMgYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24uCisgKiAKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQKKyAqIHRoZSBuYW1lIG9mIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIGRvY3VtZW50IG9yIHNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBESUdJVEFMIEVRVUlQTUVOVCBDT1JQLiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuICAgSU4gTk8gRVZFTlQgU0hBTEwgRElHSVRBTCBFUVVJUE1FTlQKKyAqIENPUlBPUkFUSU9OIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMKKyAqIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUworICogU09GVFdBUkUuCisgKiAtCisgKiAtLUNvcHlyaWdodC0tCisgKi8KKworLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvbmV0L2luZXRfYWRkci5jICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaWYgIWRlZmluZWQoSEFWRV9JTkVUX0FUT04pCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2lmIDAKKy8qCisgKiBBc2NpaSBpbnRlcm5ldCBhZGRyZXNzIGludGVycHJldGF0aW9uIHJvdXRpbmUuCisgKiBUaGUgdmFsdWUgcmV0dXJuZWQgaXMgaW4gbmV0d29yayBvcmRlci4KKyAqLworaW5fYWRkcl90CitpbmV0X2FkZHIoY29uc3QgY2hhciAqY3ApCit7CisJc3RydWN0IGluX2FkZHIgdmFsOworCisJaWYgKGluZXRfYXRvbihjcCwgJnZhbCkpCisJCXJldHVybiAodmFsLnNfYWRkcik7CisJcmV0dXJuIChJTkFERFJfTk9ORSk7Cit9CisjZW5kaWYKKworLyogCisgKiBDaGVjayB3aGV0aGVyICJjcCIgaXMgYSB2YWxpZCBhc2NpaSByZXByZXNlbnRhdGlvbgorICogb2YgYW4gSW50ZXJuZXQgYWRkcmVzcyBhbmQgY29udmVydCB0byBhIGJpbmFyeSBhZGRyZXNzLgorICogUmV0dXJucyAxIGlmIHRoZSBhZGRyZXNzIGlzIHZhbGlkLCAwIGlmIG5vdC4KKyAqIFRoaXMgcmVwbGFjZXMgaW5ldF9hZGRyLCB0aGUgcmV0dXJuIHZhbHVlIGZyb20gd2hpY2gKKyAqIGNhbm5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGZhaWx1cmUgYW5kIGEgbG9jYWwgYnJvYWRjYXN0IGFkZHJlc3MuCisgKi8KK2ludAoraW5ldF9hdG9uKGNvbnN0IGNoYXIgKmNwLCBzdHJ1Y3QgaW5fYWRkciAqYWRkcikKK3sKKwl1X2ludDMyX3QgdmFsOworCWludCBiYXNlLCBuOworCWNoYXIgYzsKKwl1X2ludCBwYXJ0c1s0XTsKKwl1X2ludCAqcHAgPSBwYXJ0czsKKworCWMgPSAqY3A7CisJZm9yICg7OykgeworCQkvKgorCQkgKiBDb2xsZWN0IG51bWJlciB1cCB0byBgYC4nJy4KKwkJICogVmFsdWVzIGFyZSBzcGVjaWZpZWQgYXMgZm9yIEM6CisJCSAqIDB4PWhleCwgMD1vY3RhbCwgaXNkaWdpdD1kZWNpbWFsLgorCQkgKi8KKwkJaWYgKCFpc2RpZ2l0KGMpKQorCQkJcmV0dXJuICgwKTsKKwkJdmFsID0gMDsgYmFzZSA9IDEwOworCQlpZiAoYyA9PSAnMCcpIHsKKwkJCWMgPSAqKytjcDsKKwkJCWlmIChjID09ICd4JyB8fCBjID09ICdYJykKKwkJCQliYXNlID0gMTYsIGMgPSAqKytjcDsKKwkJCWVsc2UKKwkJCQliYXNlID0gODsKKwkJfQorCQlmb3IgKDs7KSB7CisJCQlpZiAoaXNhc2NpaShjKSAmJiBpc2RpZ2l0KGMpKSB7CisJCQkJdmFsID0gKHZhbCAqIGJhc2UpICsgKGMgLSAnMCcpOworCQkJCWMgPSAqKytjcDsKKwkJCX0gZWxzZSBpZiAoYmFzZSA9PSAxNiAmJiBpc2FzY2lpKGMpICYmIGlzeGRpZ2l0KGMpKSB7CisJCQkJdmFsID0gKHZhbCA8PCA0KSB8CisJCQkJCShjICsgMTAgLSAoaXNsb3dlcihjKSA/ICdhJyA6ICdBJykpOworCQkJCWMgPSAqKytjcDsKKwkJCX0gZWxzZQorCQkJCWJyZWFrOworCQl9CisJCWlmIChjID09ICcuJykgeworCQkJLyoKKwkJCSAqIEludGVybmV0IGZvcm1hdDoKKwkJCSAqCWEuYi5jLmQKKwkJCSAqCWEuYi5jCSh3aXRoIGMgdHJlYXRlZCBhcyAxNiBiaXRzKQorCQkJICoJYS5iCSh3aXRoIGIgdHJlYXRlZCBhcyAyNCBiaXRzKQorCQkJICovCisJCQlpZiAocHAgPj0gcGFydHMgKyAzKQorCQkJCXJldHVybiAoMCk7CisJCQkqcHArKyA9IHZhbDsKKwkJCWMgPSAqKytjcDsKKwkJfSBlbHNlCisJCQlicmVhazsKKwl9CisJLyoKKwkgKiBDaGVjayBmb3IgdHJhaWxpbmcgY2hhcmFjdGVycy4KKwkgKi8KKwlpZiAoYyAhPSAnXDAnICYmICghaXNhc2NpaShjKSB8fCAhaXNzcGFjZShjKSkpCisJCXJldHVybiAoMCk7CisJLyoKKwkgKiBDb25jb2N0IHRoZSBhZGRyZXNzIGFjY29yZGluZyB0bworCSAqIHRoZSBudW1iZXIgb2YgcGFydHMgc3BlY2lmaWVkLgorCSAqLworCW4gPSBwcCAtIHBhcnRzICsgMTsKKwlzd2l0Y2ggKG4pIHsKKworCWNhc2UgMDoKKwkJcmV0dXJuICgwKTsJCS8qIGluaXRpYWwgbm9uZGlnaXQgKi8KKworCWNhc2UgMToJCQkJLyogYSAtLSAzMiBiaXRzICovCisJCWJyZWFrOworCisJY2FzZSAyOgkJCQkvKiBhLmIgLS0gOC4yNCBiaXRzICovCisJCWlmICgodmFsID4gMHhmZmZmZmYpIHx8IChwYXJ0c1swXSA+IDB4ZmYpKQorCQkJcmV0dXJuICgwKTsKKwkJdmFsIHw9IHBhcnRzWzBdIDw8IDI0OworCQlicmVhazsKKworCWNhc2UgMzoJCQkJLyogYS5iLmMgLS0gOC44LjE2IGJpdHMgKi8KKwkJaWYgKCh2YWwgPiAweGZmZmYpIHx8IChwYXJ0c1swXSA+IDB4ZmYpIHx8IChwYXJ0c1sxXSA+IDB4ZmYpKQorCQkJcmV0dXJuICgwKTsKKwkJdmFsIHw9IChwYXJ0c1swXSA8PCAyNCkgfCAocGFydHNbMV0gPDwgMTYpOworCQlicmVhazsKKworCWNhc2UgNDoJCQkJLyogYS5iLmMuZCAtLSA4LjguOC44IGJpdHMgKi8KKwkJaWYgKCh2YWwgPiAweGZmKSB8fCAocGFydHNbMF0gPiAweGZmKSB8fCAocGFydHNbMV0gPiAweGZmKSB8fCAocGFydHNbMl0gPiAweGZmKSkKKwkJCXJldHVybiAoMCk7CisJCXZhbCB8PSAocGFydHNbMF0gPDwgMjQpIHwgKHBhcnRzWzFdIDw8IDE2KSB8IChwYXJ0c1syXSA8PCA4KTsKKwkJYnJlYWs7CisJfQorCWlmIChhZGRyKQorCQlhZGRyLT5zX2FkZHIgPSBodG9ubCh2YWwpOworCXJldHVybiAoMSk7Cit9CisKKyNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX0lORVRfQVRPTikgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvaW5ldF9udG9hLmMgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2luZXRfbnRvYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYjdiM2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2luZXRfbnRvYS5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qCSRPcGVuQlNEOiBpbmV0X250b2EuYyx2IDEuNiAyMDA1LzA4LzA2IDIwOjMwOjAzIGVzcGllIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvbmV0L2luZXRfbnRvYS5jICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaWYgZGVmaW5lZChCUk9LRU5fSU5FVF9OVE9BKSB8fCAhZGVmaW5lZChIQVZFX0lORVRfTlRPQSkKKworLyoKKyAqIENvbnZlcnQgbmV0d29yay1mb3JtYXQgaW50ZXJuZXQgYWRkcmVzcworICogdG8gYmFzZSAyNTYgZC5kLmQuZCByZXByZXNlbnRhdGlvbi4KKyAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitjaGFyICoKK2luZXRfbnRvYShzdHJ1Y3QgaW5fYWRkciBpbikKK3sKKwlzdGF0aWMgY2hhciBiWzE4XTsKKwljaGFyICpwOworCisJcCA9IChjaGFyICopJmluOworI2RlZmluZQlVQyhiKQkoKChpbnQpYikmMHhmZikKKwkodm9pZClzbnByaW50ZihiLCBzaXplb2YoYiksCisJICAgICIldS4ldS4ldS4ldSIsIFVDKHBbMF0pLCBVQyhwWzFdKSwgVUMocFsyXSksIFVDKHBbM10pKTsKKwlyZXR1cm4gKGIpOworfQorCisjZW5kaWYgLyogZGVmaW5lZChCUk9LRU5fSU5FVF9OVE9BKSB8fCAhZGVmaW5lZChIQVZFX0lORVRfTlRPQSkgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvaW5ldF9udG9wLmMgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2luZXRfbnRvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNTkwMzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L2luZXRfbnRvcC5jCkBAIC0wLDAgKzEsMjExIEBACisvKgkkT3BlbkJTRDogaW5ldF9udG9wLmMsdiAxLjggMjAwOC8xMi8wOSAxOTozODozOCBvdHRvIEV4cCAkCSovCisKKy8qIENvcHlyaWdodCAoYykgMTk5NiBieSBJbnRlcm5ldCBTb2Z0d2FyZSBDb25zb3J0aXVtLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgSU5URVJORVQgU09GVFdBUkUgQ09OU09SVElVTSBESVNDTEFJTVMKKyAqIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgSU5URVJORVQgU09GVFdBUkUKKyAqIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUworICogQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCisgKiBTT0ZUV0FSRS4KKyAqLworCisvKiBPUEVOQlNEIE9SSUdJTkFMOiBsaWIvbGliYy9uZXQvaW5ldF9udG9wLmMgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpZm5kZWYgSEFWRV9JTkVUX05UT1AKKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZuZGVmIElONkFERFJTWgorI2RlZmluZSBJTjZBRERSU1ogICAxNiAgIC8qIElQdjYgVF9BQUFBICovICAgICAgICAgICAgICAgICAKKyNlbmRpZgorCisjaWZuZGVmIElOVDE2U1oKKyNkZWZpbmUgSU5UMTZTWiAgICAgMiAgICAvKiBmb3Igc3lzdGVtcyB3aXRob3V0IDE2LWJpdCBpbnRzICovCisjZW5kaWYKKworLyoKKyAqIFdBUk5JTkc6IERvbid0IGV2ZW4gY29uc2lkZXIgdHJ5aW5nIHRvIGNvbXBpbGUgdGhpcyBvbiBhIHN5c3RlbSB3aGVyZQorICogc2l6ZW9mKGludCkgPCA0LiAgc2l6ZW9mKGludCkgPiA0IGlzIGZpbmU7IGFsbCB0aGUgd29ybGQncyBub3QgYSBWQVguCisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmluZXRfbnRvcDQoY29uc3QgdV9jaGFyICpzcmMsIGNoYXIgKmRzdCwgc2l6ZV90IHNpemUpOworc3RhdGljIGNvbnN0IGNoYXIgKmluZXRfbnRvcDYoY29uc3QgdV9jaGFyICpzcmMsIGNoYXIgKmRzdCwgc2l6ZV90IHNpemUpOworCisvKiBjaGFyICoKKyAqIGluZXRfbnRvcChhZiwgc3JjLCBkc3QsIHNpemUpCisgKgljb252ZXJ0IGEgbmV0d29yayBmb3JtYXQgYWRkcmVzcyB0byBwcmVzZW50YXRpb24gZm9ybWF0LgorICogcmV0dXJuOgorICoJcG9pbnRlciB0byBwcmVzZW50YXRpb24gZm9ybWF0IGFkZHJlc3MgKGBkc3QnKSwgb3IgTlVMTCAoc2VlIGVycm5vKS4KKyAqIGF1dGhvcjoKKyAqCVBhdWwgVml4aWUsIDE5OTYuCisgKi8KK2NvbnN0IGNoYXIgKgoraW5ldF9udG9wKGludCBhZiwgY29uc3Qgdm9pZCAqc3JjLCBjaGFyICpkc3QsIHNvY2tsZW5fdCBzaXplKQoreworCXN3aXRjaCAoYWYpIHsKKwljYXNlIEFGX0lORVQ6CisJCXJldHVybiAoaW5ldF9udG9wNChzcmMsIGRzdCwgKHNpemVfdClzaXplKSk7CisJY2FzZSBBRl9JTkVUNjoKKwkJcmV0dXJuIChpbmV0X250b3A2KHNyYywgZHN0LCAoc2l6ZV90KXNpemUpKTsKKwlkZWZhdWx0OgorCQllcnJubyA9IEVBRk5PU1VQUE9SVDsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisvKiBjb25zdCBjaGFyICoKKyAqIGluZXRfbnRvcDQoc3JjLCBkc3QsIHNpemUpCisgKglmb3JtYXQgYW4gSVB2NCBhZGRyZXNzLCBtb3JlIG9yIGxlc3MgbGlrZSBpbmV0X250b2EoKQorICogcmV0dXJuOgorICoJYGRzdCcgKGFzIGEgY29uc3QpCisgKiBub3RlczoKKyAqCSgxKSB1c2VzIG5vIHN0YXRpY3MKKyAqCSgyKSB0YWtlcyBhIHVfY2hhciogbm90IGFuIGluX2FkZHIgYXMgaW5wdXQKKyAqIGF1dGhvcjoKKyAqCVBhdWwgVml4aWUsIDE5OTYuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK2luZXRfbnRvcDQoY29uc3QgdV9jaGFyICpzcmMsIGNoYXIgKmRzdCwgc2l6ZV90IHNpemUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgZm10W10gPSAiJXUuJXUuJXUuJXUiOworCWNoYXIgdG1wW3NpemVvZiAiMjU1LjI1NS4yNTUuMjU1Il07CisJaW50IGw7CisKKwlsID0gc25wcmludGYodG1wLCBzaXplLCBmbXQsIHNyY1swXSwgc3JjWzFdLCBzcmNbMl0sIHNyY1szXSk7CisJaWYgKGwgPD0gMCB8fCBsID49IHNpemUpIHsKKwkJZXJybm8gPSBFTk9TUEM7CisJCXJldHVybiAoTlVMTCk7CisJfQorCXN0cmxjcHkoZHN0LCB0bXAsIHNpemUpOworCXJldHVybiAoZHN0KTsKK30KKworLyogY29uc3QgY2hhciAqCisgKiBpbmV0X250b3A2KHNyYywgZHN0LCBzaXplKQorICoJY29udmVydCBJUHY2IGJpbmFyeSBhZGRyZXNzIGludG8gcHJlc2VudGF0aW9uIChwcmludGFibGUpIGZvcm1hdAorICogYXV0aG9yOgorICoJUGF1bCBWaXhpZSwgMTk5Ni4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKgoraW5ldF9udG9wNihjb25zdCB1X2NoYXIgKnNyYywgY2hhciAqZHN0LCBzaXplX3Qgc2l6ZSkKK3sKKwkvKgorCSAqIE5vdGUgdGhhdCBpbnQzMl90IGFuZCBpbnQxNl90IG5lZWQgb25seSBiZSAiYXQgbGVhc3QiIGxhcmdlIGVub3VnaAorCSAqIHRvIGNvbnRhaW4gYSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHNpemUuICBPbiBzb21lIHN5c3RlbXMsIGxpa2UKKwkgKiBDcmF5cywgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBhbiBpbnRlZ2VyIHZhcmlhYmxlIHdpdGggMTYgYml0cy4KKwkgKiBLZWVwIHRoaXMgaW4gbWluZCBpZiB5b3UgdGhpbmsgdGhpcyBmdW5jdGlvbiBzaG91bGQgaGF2ZSBiZWVuIGNvZGVkCisJICogdG8gdXNlIHBvaW50ZXIgb3ZlcmxheXMuICBBbGwgdGhlIHdvcmxkJ3Mgbm90IGEgVkFYLgorCSAqLworCWNoYXIgdG1wW3NpemVvZiAiZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6MjU1LjI1NS4yNTUuMjU1Il07CisJY2hhciAqdHAsICplcDsKKwlzdHJ1Y3QgeyBpbnQgYmFzZSwgbGVuOyB9IGJlc3QsIGN1cjsKKwl1X2ludCB3b3Jkc1tJTjZBRERSU1ogLyBJTlQxNlNaXTsKKwlpbnQgaTsKKwlpbnQgYWR2YW5jZTsKKworCS8qCisJICogUHJlcHJvY2VzczoKKwkgKglDb3B5IHRoZSBpbnB1dCAoYnl0ZXdpc2UpIGFycmF5IGludG8gYSB3b3Jkd2lzZSBhcnJheS4KKwkgKglGaW5kIHRoZSBsb25nZXN0IHJ1biBvZiAweDAwJ3MgaW4gc3JjW10gZm9yIDo6IHNob3J0aGFuZGluZy4KKwkgKi8KKwltZW1zZXQod29yZHMsICdcMCcsIHNpemVvZiB3b3Jkcyk7CisJZm9yIChpID0gMDsgaSA8IElONkFERFJTWjsgaSsrKQorCQl3b3Jkc1tpIC8gMl0gfD0gKHNyY1tpXSA8PCAoKDEgLSAoaSAlIDIpKSA8PCAzKSk7CisJYmVzdC5iYXNlID0gLTE7CisJY3VyLmJhc2UgPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgKElONkFERFJTWiAvIElOVDE2U1opOyBpKyspIHsKKwkJaWYgKHdvcmRzW2ldID09IDApIHsKKwkJCWlmIChjdXIuYmFzZSA9PSAtMSkKKwkJCQljdXIuYmFzZSA9IGksIGN1ci5sZW4gPSAxOworCQkJZWxzZQorCQkJCWN1ci5sZW4rKzsKKwkJfSBlbHNlIHsKKwkJCWlmIChjdXIuYmFzZSAhPSAtMSkgeworCQkJCWlmIChiZXN0LmJhc2UgPT0gLTEgfHwgY3VyLmxlbiA+IGJlc3QubGVuKQorCQkJCQliZXN0ID0gY3VyOworCQkJCWN1ci5iYXNlID0gLTE7CisJCQl9CisJCX0KKwl9CisJaWYgKGN1ci5iYXNlICE9IC0xKSB7CisJCWlmIChiZXN0LmJhc2UgPT0gLTEgfHwgY3VyLmxlbiA+IGJlc3QubGVuKQorCQkJYmVzdCA9IGN1cjsKKwl9CisJaWYgKGJlc3QuYmFzZSAhPSAtMSAmJiBiZXN0LmxlbiA8IDIpCisJCWJlc3QuYmFzZSA9IC0xOworCisJLyoKKwkgKiBGb3JtYXQgdGhlIHJlc3VsdC4KKwkgKi8KKwl0cCA9IHRtcDsKKwllcCA9IHRtcCArIHNpemVvZih0bXApOworCWZvciAoaSA9IDA7IGkgPCAoSU42QUREUlNaIC8gSU5UMTZTWikgJiYgdHAgPCBlcDsgaSsrKSB7CisJCS8qIEFyZSB3ZSBpbnNpZGUgdGhlIGJlc3QgcnVuIG9mIDB4MDAncz8gKi8KKwkJaWYgKGJlc3QuYmFzZSAhPSAtMSAmJiBpID49IGJlc3QuYmFzZSAmJgorCQkgICAgaSA8IChiZXN0LmJhc2UgKyBiZXN0LmxlbikpIHsKKwkJCWlmIChpID09IGJlc3QuYmFzZSkgeworCQkJCWlmICh0cCArIDEgPj0gZXApCisJCQkJCXJldHVybiAoTlVMTCk7CisJCQkJKnRwKysgPSAnOic7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBBcmUgd2UgZm9sbG93aW5nIGFuIGluaXRpYWwgcnVuIG9mIDB4MDBzIG9yIGFueSByZWFsIGhleD8gKi8KKwkJaWYgKGkgIT0gMCkgeworCQkJaWYgKHRwICsgMSA+PSBlcCkKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJKnRwKysgPSAnOic7CisJCX0KKwkJLyogSXMgdGhpcyBhZGRyZXNzIGFuIGVuY2Fwc3VsYXRlZCBJUHY0PyAqLworCQlpZiAoaSA9PSA2ICYmIGJlc3QuYmFzZSA9PSAwICYmCisJCSAgICAoYmVzdC5sZW4gPT0gNiB8fCAoYmVzdC5sZW4gPT0gNSAmJiB3b3Jkc1s1XSA9PSAweGZmZmYpKSkgeworCQkJaWYgKCFpbmV0X250b3A0KHNyYysxMiwgdHAsIChzaXplX3QpKGVwIC0gdHApKSkKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJdHAgKz0gc3RybGVuKHRwKTsKKwkJCWJyZWFrOworCQl9CisJCWFkdmFuY2UgPSBzbnByaW50Zih0cCwgZXAgLSB0cCwgIiV4Iiwgd29yZHNbaV0pOworCQlpZiAoYWR2YW5jZSA8PSAwIHx8IGFkdmFuY2UgPj0gZXAgLSB0cCkKKwkJCXJldHVybiAoTlVMTCk7CisJCXRwICs9IGFkdmFuY2U7CisJfQorCS8qIFdhcyBpdCBhIHRyYWlsaW5nIHJ1biBvZiAweDAwJ3M/ICovCisJaWYgKGJlc3QuYmFzZSAhPSAtMSAmJiAoYmVzdC5iYXNlICsgYmVzdC5sZW4pID09IChJTjZBRERSU1ogLyBJTlQxNlNaKSkgeworCQlpZiAodHAgKyAxID49IGVwKQorCQkJcmV0dXJuIChOVUxMKTsKKwkJKnRwKysgPSAnOic7CisJfQorCWlmICh0cCArIDEgPj0gZXApCisJCXJldHVybiAoTlVMTCk7CisJKnRwKysgPSAnXDAnOworCisJLyoKKwkgKiBDaGVjayBmb3Igb3ZlcmZsb3csIGNvcHksIGFuZCB3ZSdyZSBkb25lLgorCSAqLworCWlmICgoc2l6ZV90KSh0cCAtIHRtcCkgPiBzaXplKSB7CisJCWVycm5vID0gRU5PU1BDOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlzdHJsY3B5KGRzdCwgdG1wLCBzaXplKTsKKwlyZXR1cm4gKGRzdCk7Cit9CisKKyNlbmRpZiAvKiAhSEFWRV9JTkVUX05UT1AgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvbWt0ZW1wLmMgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L21rdGVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYjUyZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L21rdGVtcC5jCkBAIC0wLDAgKzEsMTQxIEBACisvKiBUSElTIEZJTEUgSEFTIEJFRU4gTU9ESUZJRUQgRlJPTSBUSEUgT1JJR0lOQUwgT1BFTkJTRCBTT1VSQ0UgKi8KKy8qIENoYW5nZXM6IFJlbW92ZWQgbWt0ZW1wICovCisKKy8qCSRPcGVuQlNEOiBta3RlbXAuYyx2IDEuMzAgMjAxMC8wMy8yMSAyMzowOTozMCBzY2h3YXJ6ZSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk4LCAyMDA4IFRoZW8gZGUgUmFhZHQKKyAqIENvcHlyaWdodCAoYykgMTk5NywgMjAwOC0yMDA5IFRvZGQgQy4gTWlsbGVyCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvc3RkaW8vbWt0ZW1wLmMgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZiAhZGVmaW5lZChIQVZFX01LRFRFTVApIHx8IGRlZmluZWQoSEFWRV9TVFJJQ1RfTUtTVEVNUCkKKworI2RlZmluZSBNS1RFTVBfTkFNRQkwCisjZGVmaW5lIE1LVEVNUF9GSUxFCTEKKyNkZWZpbmUgTUtURU1QX0RJUgkyCisKKyNkZWZpbmUgVEVNUENIQVJTCSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSIKKyNkZWZpbmUgTlVNX0NIQVJTCShzaXplb2YoVEVNUENIQVJTKSAtIDEpCisKK3N0YXRpYyBpbnQKK21rdGVtcF9pbnRlcm5hbChjaGFyICpwYXRoLCBpbnQgc2xlbiwgaW50IG1vZGUpCit7CisJY2hhciAqc3RhcnQsICpjcCwgKmVwOworCWNvbnN0IGNoYXIgKnRlbXBjaGFycyA9IFRFTVBDSEFSUzsKKwl1bnNpZ25lZCBpbnQgciwgdHJpZXM7CisJc3RydWN0IHN0YXQgc2I7CisJc2l6ZV90IGxlbjsKKwlpbnQgZmQ7CisKKwlsZW4gPSBzdHJsZW4ocGF0aCk7CisJaWYgKGxlbiA9PSAwIHx8IHNsZW4gPCAwIHx8IChzaXplX3Qpc2xlbiA+PSBsZW4pIHsKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybigtMSk7CisJfQorCWVwID0gcGF0aCArIGxlbiAtIHNsZW47CisKKwl0cmllcyA9IDE7CisJZm9yIChzdGFydCA9IGVwOyBzdGFydCA+IHBhdGggJiYgc3RhcnRbLTFdID09ICdYJzsgc3RhcnQtLSkgeworCQlpZiAodHJpZXMgPCBJTlRfTUFYIC8gTlVNX0NIQVJTKQorCQkJdHJpZXMgKj0gTlVNX0NIQVJTOworCX0KKwl0cmllcyAqPSAyOworCisJZG8geworCQlmb3IgKGNwID0gc3RhcnQ7IGNwICE9IGVwOyBjcCsrKSB7CisJCQlyID0gYXJjNHJhbmRvbV91bmlmb3JtKE5VTV9DSEFSUyk7CisJCQkqY3AgPSB0ZW1wY2hhcnNbcl07CisJCX0KKworCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBNS1RFTVBfTkFNRToKKwkJCWlmIChsc3RhdChwYXRoLCAmc2IpICE9IDApCisJCQkJcmV0dXJuKGVycm5vID09IEVOT0VOVCA/IDAgOiAtMSk7CisJCQlicmVhazsKKwkJY2FzZSBNS1RFTVBfRklMRToKKwkJCWZkID0gb3BlbihwYXRoLCBPX0NSRUFUfE9fRVhDTHxPX1JEV1IsIFNfSVJVU1J8U19JV1VTUik7CisJCQlpZiAoZmQgIT0gLTEgfHwgZXJybm8gIT0gRUVYSVNUKQorCQkJCXJldHVybihmZCk7CisJCQlicmVhazsKKwkJY2FzZSBNS1RFTVBfRElSOgorCQkJaWYgKG1rZGlyKHBhdGgsIFNfSVJVU1J8U19JV1VTUnxTX0lYVVNSKSA9PSAwKQorCQkJCXJldHVybigwKTsKKwkJCWlmIChlcnJubyAhPSBFRVhJU1QpCisJCQkJcmV0dXJuKC0xKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoLS10cmllcyk7CisKKwllcnJubyA9IEVFWElTVDsKKwlyZXR1cm4oLTEpOworfQorCisjaWYgMAorY2hhciAqX21rdGVtcChjaGFyICopOworCitjaGFyICoKK19ta3RlbXAoY2hhciAqcGF0aCkKK3sKKwlpZiAobWt0ZW1wX2ludGVybmFsKHBhdGgsIDAsIE1LVEVNUF9OQU1FKSA9PSAtMSkKKwkJcmV0dXJuKE5VTEwpOworCXJldHVybihwYXRoKTsKK30KKworX193YXJuX3JlZmVyZW5jZXMobWt0ZW1wLAorICAgICJ3YXJuaW5nOiBta3RlbXAoKSBwb3NzaWJseSB1c2VkIHVuc2FmZWx5OyBjb25zaWRlciB1c2luZyBta3N0ZW1wKCkiKTsKKworY2hhciAqCitta3RlbXAoY2hhciAqcGF0aCkKK3sKKwlyZXR1cm4oX21rdGVtcChwYXRoKSk7Cit9CisjZW5kaWYKKworaW50Citta3N0ZW1wKGNoYXIgKnBhdGgpCit7CisJcmV0dXJuKG1rdGVtcF9pbnRlcm5hbChwYXRoLCAwLCBNS1RFTVBfRklMRSkpOworfQorCitpbnQKK21rc3RlbXBzKGNoYXIgKnBhdGgsIGludCBzbGVuKQoreworCXJldHVybihta3RlbXBfaW50ZXJuYWwocGF0aCwgc2xlbiwgTUtURU1QX0ZJTEUpKTsKK30KKworY2hhciAqCitta2R0ZW1wKGNoYXIgKnBhdGgpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBta3RlbXBfaW50ZXJuYWwocGF0aCwgMCwgTUtURU1QX0RJUik7CisJcmV0dXJuKGVycm9yID8gTlVMTCA6IHBhdGgpOworfQorCisjZW5kaWYgLyogIWRlZmluZWQoSEFWRV9NS0RURU1QKSB8fCBkZWZpbmVkKEhBVkVfU1RSSUNUX01LU1RFTVApICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L29wZW5ic2QtY29tcGF0LmggYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L29wZW5ic2QtY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA3YWNmNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvb3BlbmJzZC1jb21wYXQuaApAQCAtMCwwICsxLDIzOCBAQAorLyogJElkOiBvcGVuYnNkLWNvbXBhdC5oLHYgMS41MiAyMDExLzA5LzIzIDAxOjE2OjExIGRqbSBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDMgRGFtaWVuIE1pbGxlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgQmVuIExpbmRzdHJvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaW0gUmljZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX09QRU5CU0RfQ09NUEFUX0gKKyNkZWZpbmUgX09QRU5CU0RfQ09NUEFUX0gKKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworLyogT3BlbkJTRCBmdW5jdGlvbiByZXBsYWNlbWVudHMgKi8KKyNpbmNsdWRlICJiYXNlNjQuaCIKKyNpbmNsdWRlICJzaWdhY3QuaCIKKyNpbmNsdWRlICJnbG9iLmgiCisjaW5jbHVkZSAicmVhZHBhc3NwaHJhc2UuaCIKKyNpbmNsdWRlICJ2aXMuaCIKKyNpbmNsdWRlICJnZXRycnNldGJ5bmFtZS5oIgorI2luY2x1ZGUgInNoYTIuaCIKKworI2lmbmRlZiBIQVZFX0JBU0VOQU1FCitjaGFyICpiYXNlbmFtZShjb25zdCBjaGFyICpwYXRoKTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfQklORFJFU1ZQT1JUX1NBCitpbnQgYmluZHJlc3Zwb3J0X3NhKGludCBzZCwgc3RydWN0IHNvY2thZGRyICpzYSk7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0NMT1NFRlJPTQordm9pZCBjbG9zZWZyb20oaW50KTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfR0VUQ1dECitjaGFyICpnZXRjd2QoY2hhciAqcHQsIHNpemVfdCBzaXplKTsKKyNlbmRpZiAKKworI2lmICFkZWZpbmVkKEhBVkVfUkVBTFBBVEgpIHx8IGRlZmluZWQoQlJPS0VOX1JFQUxQQVRIKQorY2hhciAqcmVhbHBhdGgoY29uc3QgY2hhciAqcGF0aCwgY2hhciAqcmVzb2x2ZWQpOworI2VuZGlmIAorCisjaWZuZGVmIEhBVkVfUlJFU1ZQT1JUX0FGCitpbnQgcnJlc3Zwb3J0X2FmKGludCAqYWxwb3J0LCBzYV9mYW1pbHlfdCBhZik7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUkxDUFkKKy8qICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gWFhYIFN0aWxsIG5lZWRlZD8gKi8KK3NpemVfdCBzdHJsY3B5KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc2l6KTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSTENBVAorLyogI2luY2x1ZGUgPHN5cy90eXBlcy5oPiBYWFggU3RpbGwgbmVlZGVkPyAqLworc2l6ZV90IHN0cmxjYXQoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzaXopOworI2VuZGlmIAorCisjaWZuZGVmIEhBVkVfU0VURU5WCitpbnQgc2V0ZW52KHJlZ2lzdGVyIGNvbnN0IGNoYXIgKm5hbWUsIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnZhbHVlLCBpbnQgcmV3cml0ZSk7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUk1PREUKK3ZvaWQgc3RybW9kZShpbnQgbW9kZSwgY2hhciAqcCk7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUlBUSU1FCisjaW5jbHVkZSAgPHRpbWUuaD4KK2NoYXIgKnN0cnB0aW1lKGNvbnN0IGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqZm10LCBzdHJ1Y3QgdG0gKnRtKTsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSEFWRV9NS0RURU1QKSB8fCBkZWZpbmVkKEhBVkVfU1RSSUNUX01LU1RFTVApCitpbnQgbWtzdGVtcHMoY2hhciAqcGF0aCwgaW50IHNsZW4pOworaW50IG1rc3RlbXAoY2hhciAqcGF0aCk7CitjaGFyICpta2R0ZW1wKGNoYXIgKnBhdGgpOworI2VuZGlmIAorCisjaWZuZGVmIEhBVkVfREFFTU9OCitpbnQgZGFlbW9uKGludCBub2NoZGlyLCBpbnQgbm9jbG9zZSk7CisjZW5kaWYgCisKKyNpZm5kZWYgSEFWRV9ESVJOQU1FCitjaGFyICpkaXJuYW1lKGNvbnN0IGNoYXIgKnBhdGgpOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9GTVRfU0NBTEVECisjZGVmaW5lCUZNVF9TQ0FMRURfU1RSU0laRQk3CitpbnQJZm10X3NjYWxlZChsb25nIGxvbmcgbnVtYmVyLCBjaGFyICpyZXN1bHQpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJST0tFTl9JTkVUX05UT0EpIHx8ICFkZWZpbmVkKEhBVkVfSU5FVF9OVE9BKQorY2hhciAqaW5ldF9udG9hKHN0cnVjdCBpbl9hZGRyIGluKTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfSU5FVF9OVE9QCitjb25zdCBjaGFyICppbmV0X250b3AoaW50IGFmLCBjb25zdCB2b2lkICpzcmMsIGNoYXIgKmRzdCwgc29ja2xlbl90IHNpemUpOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9JTkVUX0FUT04KK2ludCBpbmV0X2F0b24oY29uc3QgY2hhciAqY3AsIHN0cnVjdCBpbl9hZGRyICphZGRyKTsKKyNlbmRpZiAKKworI2lmbmRlZiBIQVZFX1NUUlNFUAorY2hhciAqc3Ryc2VwKGNoYXIgKipzdHJpbmdwLCBjb25zdCBjaGFyICpkZWxpbSk7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NFVFBST0NUSVRMRQordm9pZCBzZXRwcm9jdGl0bGUoY29uc3QgY2hhciAqZm10LCAuLi4pOwordm9pZCBjb21wYXRfaW5pdF9zZXRwcm9jdGl0bGUoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0dFVEdST1VQTElTVAorLyogI2luY2x1ZGUgPGdycC5oPiBYWFhYIFN0aWxsIG5lZWRlZCA/ICovCitpbnQgZ2V0Z3JvdXBsaXN0KGNvbnN0IGNoYXIgKiwgZ2lkX3QsIGdpZF90ICosIGludCAqKTsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSEFWRV9HRVRPUFQpIHx8ICFkZWZpbmVkKEhBVkVfR0VUT1BUX09QVFJFU0VUKQoraW50IEJTRGdldG9wdChpbnQgYXJnYywgY2hhciAqIGNvbnN0ICphcmd2LCBjb25zdCBjaGFyICpvcHRzKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX0RFQ0xfV1JJVEVWKSAmJiBIQVZFX0RFQ0xfV1JJVEVWID09IDAKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHN5cy91aW8uaD4KK2ludCB3cml0ZXYoaW50LCBzdHJ1Y3QgaW92ZWMgKiwgaW50KTsKKyNlbmRpZgorCisvKiBIb21lIGdyb3duIHJvdXRpbmVzICovCisjaW5jbHVkZSAiYnNkLW1pc2MuaCIKKyNpbmNsdWRlICJic2Qtc3RhdHZmcy5oIgorI2luY2x1ZGUgImJzZC13YWl0cGlkLmgiCisjaW5jbHVkZSAiYnNkLXBvbGwuaCIKKworI2lmbmRlZiBIQVZFX0dFVFBFRVJFSUQKK2ludCBnZXRwZWVyZWlkKGludCAsIHVpZF90ICosIGdpZF90ICopOworI2VuZGlmIAorCisjaWZuZGVmIEhBVkVfQVJDNFJBTkRPTQordW5zaWduZWQgaW50IGFyYzRyYW5kb20odm9pZCk7Cit2b2lkIGFyYzRyYW5kb21fc3Rpcih2b2lkKTsKKyNlbmRpZiAvKiAhSEFWRV9BUkM0UkFORE9NICovCisKKyNpZm5kZWYgSEFWRV9BUkM0UkFORE9NX0JVRgordm9pZCBhcmM0cmFuZG9tX2J1Zih2b2lkICosIHNpemVfdCk7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0FSQzRSQU5ET01fVU5JRk9STQordV9pbnQzMl90IGFyYzRyYW5kb21fdW5pZm9ybSh1X2ludDMyX3QpOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9BU1BSSU5URgoraW50IGFzcHJpbnRmKGNoYXIgKiosIGNvbnN0IGNoYXIgKiwgLi4uKTsKKyNlbmRpZiAKKworI2lmbmRlZiBIQVZFX09QRU5QVFkKKyMgaW5jbHVkZSA8c3lzL2lvY3RsLmg+CS8qIGZvciBzdHJ1Y3Qgd2luc2l6ZSAqLworaW50IG9wZW5wdHkoaW50ICosIGludCAqLCBjaGFyICosIHN0cnVjdCB0ZXJtaW9zICosIHN0cnVjdCB3aW5zaXplICopOworI2VuZGlmIC8qIEhBVkVfT1BFTlBUWSAqLworCisvKiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+IFhYWCBuZWVkZWQ/IEZvciBzaXplX3QgKi8KKworI2lmbmRlZiBIQVZFX1NOUFJJTlRGCitpbnQgc25wcmludGYoY2hhciAqLCBzaXplX3QsIFNOUFJJTlRGX0NPTlNUIGNoYXIgKiwgLi4uKTsKKyNlbmRpZiAKKworI2lmbmRlZiBIQVZFX1NUUlRPTEwKK2xvbmcgbG9uZyBzdHJ0b2xsKGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgaW50KTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSVE9OVU0KK2xvbmcgbG9uZyBzdHJ0b251bShjb25zdCBjaGFyICosIGxvbmcgbG9uZywgbG9uZyBsb25nLCBjb25zdCBjaGFyICoqKTsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSEFWRV9WQVNQUklOVEYpIHx8ICFkZWZpbmVkKEhBVkVfVlNOUFJJTlRGKQorIyBpbmNsdWRlIDxzdGRhcmcuaD4KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfVkFTUFJJTlRGCitpbnQgdmFzcHJpbnRmKGNoYXIgKiosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1ZTTlBSSU5URgoraW50IHZzbnByaW50ZihjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfVVNFUl9GUk9NX1VJRAorY2hhciAqdXNlcl9mcm9tX3VpZCh1aWRfdCwgaW50KTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfR1JPVVBfRlJPTV9HSUQKK2NoYXIgKmdyb3VwX2Zyb21fZ2lkKGdpZF90LCBpbnQpOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9USU1JTkdTQUZFX0JDTVAKK2ludCB0aW1pbmdzYWZlX2JjbXAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CisjZW5kaWYKKwordm9pZCAqeG1tYXAoc2l6ZV90IHNpemUpOworY2hhciAqeGNyeXB0KGNvbnN0IGNoYXIgKnBhc3N3b3JkLCBjb25zdCBjaGFyICpzYWx0KTsKK2NoYXIgKnNoYWRvd19wdyhzdHJ1Y3QgcGFzc3dkICpwdyk7CisKKy8qIHJmYzI1NTMgc29ja2V0IEFQSSByZXBsYWNlbWVudHMgKi8KKyNpbmNsdWRlICJmYWtlLXJmYzI1NTMuaCIKKworLyogUm91dGluZXMgZm9yIGEgc2luZ2xlIE9TIHBsYXRmb3JtICovCisjaW5jbHVkZSAiYnNkLWNyYXkuaCIKKyNpbmNsdWRlICJic2QtY3lnd2luX3V0aWwuaCIKKworI2luY2x1ZGUgInBvcnQtYWl4LmgiCisjaW5jbHVkZSAicG9ydC1pcml4LmgiCisjaW5jbHVkZSAicG9ydC1saW51eC5oIgorI2luY2x1ZGUgInBvcnQtc29sYXJpcy5oIgorI2luY2x1ZGUgInBvcnQtdHVuLmgiCisjaW5jbHVkZSAicG9ydC11dy5oIgorCisjZW5kaWYgLyogX09QRU5CU0RfQ09NUEFUX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQuYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTg5Y2FiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9vcGVuc3NsLWNvbXBhdC5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKiAkSWQ6IG9wZW5zc2wtY29tcGF0LmMsdiAxLjE0IDIwMTEvMDUvMTAgMDE6MTM6MzggZHR1Y2tlciBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1IERhcnJlbiBUdWNrZXIgPGR0dWNrZXJAemlwLmNvbS5hdT4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIE1JTkQsIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgVVNFX09QRU5TU0xfRU5HSU5FCisjIGluY2x1ZGUgPG9wZW5zc2wvZW5naW5lLmg+CisjIGluY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9SU0FfR0VUX0RFRkFVTFRfTUVUSE9ECisjIGluY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxvZy5oIgorCisjZGVmaW5lIFNTSF9ET05UX09WRVJMT0FEX09QRU5TU0xfRlVOQ1MKKyNpbmNsdWRlICJvcGVuc3NsLWNvbXBhdC5oIgorCisjaWZkZWYgU1NIX09MRF9FVlAKK2ludAorc3NoX0VWUF9DaXBoZXJJbml0KEVWUF9DSVBIRVJfQ1RYICpldnAsIGNvbnN0IEVWUF9DSVBIRVIgKnR5cGUsCisgICAgdW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZCBjaGFyICppdiwgaW50IGVuYykKK3sKKwlFVlBfQ2lwaGVySW5pdChldnAsIHR5cGUsIGtleSwgaXYsIGVuYyk7CisJcmV0dXJuIDE7Cit9CisKK2ludAorc3NoX0VWUF9DaXBoZXIoRVZQX0NJUEhFUl9DVFggKmV2cCwgY2hhciAqZHN0LCBjaGFyICpzcmMsIGludCBsZW4pCit7CisJRVZQX0NpcGhlcihldnAsIGRzdCwgc3JjLCBsZW4pOworCXJldHVybiAxOworfQorCitpbnQKK3NzaF9FVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKEVWUF9DSVBIRVJfQ1RYICpldnApCit7CisJRVZQX0NJUEhFUl9DVFhfY2xlYW51cChldnApOworCXJldHVybiAxOworfQorI2VuZGlmCisKKyNpZmRlZiBPUEVOU1NMX0VWUF9ESUdFU1RVUERBVEVfVk9JRAoraW50Citzc2hfRVZQX0RpZ2VzdFVwZGF0ZShFVlBfTURfQ1RYICpjdHgsIGNvbnN0IHZvaWQgKmQsIHVuc2lnbmVkIGludCBjbnQpCit7CisJRVZQX0RpZ2VzdFVwZGF0ZShjdHgsIGQsIGNudCk7CisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0JOX0lTX1BSSU1FX0VYCitpbnQKK0JOX2lzX3ByaW1lX2V4KGNvbnN0IEJJR05VTSAqcCwgaW50IG5jaGVja3MsIEJOX0NUWCAqY3R4LCB2b2lkICpjYikKK3sKKwlpZiAoY2IgIT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBjYWxsYmFjayBhcmdzIG5vdCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXyk7CisJcmV0dXJuIEJOX2lzX3ByaW1lKHAsIG5jaGVja3MsIE5VTEwsIGN0eCwgTlVMTCk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1JTQV9HRU5FUkFURV9LRVlfRVgKK2ludAorUlNBX2dlbmVyYXRlX2tleV9leChSU0EgKnJzYSwgaW50IGJpdHMsIEJJR05VTSAqYm5fZSwgdm9pZCAqY2IpCit7CisJUlNBICpuZXdfcnNhLCB0bXBfcnNhOworCXVuc2lnbmVkIGxvbmcgZTsKKworCWlmIChjYiAhPSBOVUxMKQorCQlmYXRhbCgiJXM6IGNhbGxiYWNrIGFyZ3Mgbm90IHN1cHBvcnRlZCIsIF9fZnVuY19fKTsKKwllID0gQk5fZ2V0X3dvcmQoYm5fZSk7CisJaWYgKGUgPT0gMHhmZmZmZmZmZkwpCisJCWZhdGFsKCIlczogdmFsdWUgb2YgZSB0b28gbGFyZ2UiLCBfX2Z1bmNfXyk7CisJbmV3X3JzYSA9IFJTQV9nZW5lcmF0ZV9rZXkoYml0cywgZSwgTlVMTCwgTlVMTCk7CisJaWYgKG5ld19yc2EgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJLyogc3dhcCByc2EvbmV3X3JzYSB0aGVuIGZyZWUgbmV3X3JzYSAqLworCXRtcF9yc2EgPSAqcnNhOworCSpyc2EgPSAqbmV3X3JzYTsKKwkqbmV3X3JzYSA9IHRtcF9yc2E7CisJUlNBX2ZyZWUobmV3X3JzYSk7CisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0RTQV9HRU5FUkFURV9QQVJBTUVURVJTX0VYCitpbnQKK0RTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzX2V4KERTQSAqZHNhLCBpbnQgYml0cywgY29uc3QgdW5zaWduZWQgY2hhciAqc2VlZCwKKyAgICBpbnQgc2VlZF9sZW4sIGludCAqY291bnRlcl9yZXQsIHVuc2lnbmVkIGxvbmcgKmhfcmV0LCB2b2lkICpjYikKK3sKKwlEU0EgKm5ld19kc2EsIHRtcF9kc2E7CisKKwlpZiAoY2IgIT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBjYWxsYmFjayBhcmdzIG5vdCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXyk7CisJbmV3X2RzYSA9IERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzKGJpdHMsICh1bnNpZ25lZCBjaGFyICopc2VlZCwgc2VlZF9sZW4sCisJICAgIGNvdW50ZXJfcmV0LCBoX3JldCwgTlVMTCwgTlVMTCk7CisJaWYgKG5ld19kc2EgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJLyogc3dhcCBkc2EvbmV3X2RzYSB0aGVuIGZyZWUgbmV3X2RzYSAqLworCXRtcF9kc2EgPSAqZHNhOworCSpkc2EgPSAqbmV3X2RzYTsKKwkqbmV3X2RzYSA9IHRtcF9kc2E7CisJRFNBX2ZyZWUobmV3X2RzYSk7CisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1JTQV9HRVRfREVGQVVMVF9NRVRIT0QKK1JTQV9NRVRIT0QgKgorUlNBX2dldF9kZWZhdWx0X21ldGhvZCh2b2lkKQoreworCXJldHVybiBSU0FfUEtDUzFfU1NMZWF5KCk7Cit9CisjZW5kaWYKKworI2lmZGVmCVVTRV9PUEVOU1NMX0VOR0lORQordm9pZAorc3NoX09wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKHZvaWQpCit7CisJT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKTsKKworCS8qIEVuYWJsZSB1c2Ugb2YgY3J5cHRvIGhhcmR3YXJlICovCisJRU5HSU5FX2xvYWRfYnVpbHRpbl9lbmdpbmVzKCk7CisJRU5HSU5FX3JlZ2lzdGVyX2FsbF9jb21wbGV0ZSgpOworCU9QRU5TU0xfY29uZmlnKE5VTEwpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L29wZW5zc2wtY29tcGF0LmggYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L29wZW5zc2wtY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE1MWVmZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQuaApAQCAtMCwwICsxLDEzOSBAQAorLyogJElkOiBvcGVuc3NsLWNvbXBhdC5oLHYgMS4yMCAyMDEyLzAxLzE3IDAzOjAzOjM5IGR0dWNrZXIgRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXJyZW4gVHVja2VyIDxkdHVja2VyQHppcC5jb20uYXU+CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBNSU5ELCBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORworICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3Nsdi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RzYS5oPgorCisvKiBPbmx5IGluIDAuOS44ICovCisjaWZuZGVmIE9QRU5TU0xfRFNBX01BWF9NT0RVTFVTX0JJVFMKKyMgZGVmaW5lIE9QRU5TU0xfRFNBX01BWF9NT0RVTFVTX0JJVFMgICAgICAgIDEwMDAwCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9SU0FfTUFYX01PRFVMVVNfQklUUworIyBkZWZpbmUgT1BFTlNTTF9SU0FfTUFYX01PRFVMVVNfQklUUyAgICAgICAgMTYzODQKKyNlbmRpZgorCisvKiBPUEVOU1NMX2ZyZWUoKSBpcyBGcmVlKCkgaW4gdmVyc2lvbnMgYmVmb3JlIE9wZW5TU0wgMC45LjYgKi8KKyNpZiAhZGVmaW5lZChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSKSB8fCAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IDB4MDA5MDYwMGYpCisjIGRlZmluZSBPUEVOU1NMX2ZyZWUoeCkgRnJlZSh4KQorI2VuZGlmCisKKyNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgwMDkwNjAwMEwKKyMgZGVmaW5lIFNTSF9PTERfRVZQCisjIGRlZmluZSBFVlBfQ0lQSEVSX0NUWF9nZXRfYXBwX2RhdGEoZSkJCSgoZSktPmFwcF9kYXRhKQorI2VuZGlmCisKKyNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgxMDAwMDAwZkwKKyMgZGVmaW5lIExJQkNSWVBUT19FVlBfSU5MX1RZUEUgdW5zaWduZWQgaW50CisjZWxzZQorIyBkZWZpbmUgTElCQ1JZUFRPX0VWUF9JTkxfVFlQRSBzaXplX3QKKyNlbmRpZgorCisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCAweDAwOTA3MDAwTCkgfHwgZGVmaW5lZChPUEVOU1NMX0xPQk9UT01JU0VEX0FFUykKKyMgZGVmaW5lIFVTRV9CVUlMVElOX1JJSk5EQUVMCisjZW5kaWYKKworI2lmZGVmIFVTRV9CVUlMVElOX1JJSk5EQUVMCisjIGluY2x1ZGUgInJpam5kYWVsLmgiCisjIGRlZmluZSBBRVNfS0VZIHJpam5kYWVsX2N0eAorIyBkZWZpbmUgQUVTX0JMT0NLX1NJWkUgMTYKKyMgZGVmaW5lIEFFU19lbmNyeXB0KGEsIGIsIGMpCQlyaWpuZGFlbF9lbmNyeXB0KGMsIGEsIGIpCisjIGRlZmluZSBBRVNfc2V0X2VuY3J5cHRfa2V5KGEsIGIsIGMpCXJpam5kYWVsX3NldF9rZXkoYywgKGNoYXIgKilhLCBiLCAxKQorIyBkZWZpbmUgRVZQX2Flc18xMjhfY2JjIGV2cF9yaWpuZGFlbAorIyBkZWZpbmUgRVZQX2Flc18xOTJfY2JjIGV2cF9yaWpuZGFlbAorIyBkZWZpbmUgRVZQX2Flc18yNTZfY2JjIGV2cF9yaWpuZGFlbAorZXh0ZXJuIGNvbnN0IEVWUF9DSVBIRVIgKmV2cF9yaWpuZGFlbCh2b2lkKTsKK2V4dGVybiB2b2lkIHNzaF9yaWpuZGFlbF9pdihFVlBfQ0lQSEVSX0NUWCAqLCBpbnQsIHVfY2hhciAqLCB1X2ludCk7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKEVWUF9DVFJMX1NFVF9BQ1NTX01PREUpCisjIGlmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MDA5MDcwMDBMKQorIyAgZGVmaW5lIFVTRV9DSVBIRVJfQUNTUyAxCitleHRlcm4gY29uc3QgRVZQX0NJUEhFUiAqZXZwX2Fjc3Modm9pZCk7CisjICBkZWZpbmUgRVZQX2Fjc3MgZXZwX2Fjc3MKKyMgZWxzZQorIyAgZGVmaW5lIEVWUF9hY3NzIE5VTEwKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBPcGVuU1NMIDAuOS44ZSByZXR1cm5zIGNpcGhlciBrZXkgbGVuIG5vdCBjb250ZXh0IGtleSBsZW4gKi8KKyNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA9PSAweDAwOTA4MDVmTCkKKyMgZGVmaW5lIEVWUF9DSVBIRVJfQ1RYX2tleV9sZW5ndGgoYykgKChjKS0+a2V5X2xlbikKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfUlNBX0dFVF9ERUZBVUxUX01FVEhPRAorUlNBX01FVEhPRCAqUlNBX2dldF9kZWZhdWx0X21ldGhvZCh2b2lkKTsKKyNlbmRpZgorCisvKgorICogV2Ugb3ZlcmxvYWQgc29tZSBvZiB0aGUgT3BlblNTTCBjcnlwdG8gZnVuY3Rpb25zIHdpdGggc3NoXyogZXF1aXZhbGVudHMKKyAqIHdoaWNoIGNhdGVyIGZvciBvbGRlciBhbmQvb3IgbGVzcyBmZWF0dXJlZnVsIE9wZW5TU0wgdmVyc2lvbi4KKyAqCisgKiBJbiBvcmRlciBmb3IgdGhlIGNvbXBhdCBsaWJyYXJ5IHRvIGNhbGwgdGhlIHJlYWwgZnVuY3Rpb25zLCBpdCBtdXN0CisgKiBkZWZpbmUgU1NIX0RPTlRfT1ZFUkxPQURfT1BFTlNTTF9GVU5DUyBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZSBhbmQKKyAqIGltcGxlbWVudCB0aGUgc3NoXyogZXF1aXZhbGVudHMuCisgKi8KKyNpZm5kZWYgU1NIX0RPTlRfT1ZFUkxPQURfT1BFTlNTTF9GVU5DUworCisjIGlmZGVmIFNTSF9PTERfRVZQCisjICBpZmRlZiBFVlBfQ2lwaGVyCisjICAgdW5kZWYgRVZQX0NpcGhlcgorIyAgZW5kaWYKKyMgIGRlZmluZSBFVlBfQ2lwaGVySW5pdChhLGIsYyxkLGUpCXNzaF9FVlBfQ2lwaGVySW5pdCgoYSksKGIpLChjKSwoZCksKGUpKQorIyAgZGVmaW5lIEVWUF9DaXBoZXIoYSxiLGMsZCkJCXNzaF9FVlBfQ2lwaGVyKChhKSwoYiksKGMpLChkKSkKKyMgIGRlZmluZSBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKGEpCXNzaF9FVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKChhKSkKKyMgZW5kaWYgLyogU1NIX09MRF9FVlAgKi8KKworIyBpZmRlZiBPUEVOU1NMX0VWUF9ESUdFU1RVUERBVEVfVk9JRAorIyAgZGVmaW5lIEVWUF9EaWdlc3RVcGRhdGUoYSxiLGMpCXNzaF9FVlBfRGlnZXN0VXBkYXRlKChhKSwoYiksKGMpKQorIyAgZW5kaWYKKworIyBpZmRlZiBVU0VfT1BFTlNTTF9FTkdJTkUKKyMgIGlmZGVmIE9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zCisjICAgdW5kZWYgT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMKKyMgIGVuZGlmCisjICBkZWZpbmUgT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKSAgc3NoX09wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCkKKyMgZW5kaWYKKworIyBpZm5kZWYgSEFWRV9CTl9JU19QUklNRV9FWAoraW50IEJOX2lzX3ByaW1lX2V4KGNvbnN0IEJJR05VTSAqLCBpbnQsIEJOX0NUWCAqLCB2b2lkICopOworIyBlbmRpZgorCisjIGlmbmRlZiBIQVZFX0RTQV9HRU5FUkFURV9QQVJBTUVURVJTX0VYCitpbnQgRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnNfZXgoRFNBICosIGludCwgY29uc3QgdW5zaWduZWQgY2hhciAqLCBpbnQsIGludCAqLAorICAgIHVuc2lnbmVkIGxvbmcgKiwgdm9pZCAqKTsKKyMgZW5kaWYKKworIyBpZm5kZWYgSEFWRV9SU0FfR0VORVJBVEVfS0VZX0VYCitpbnQgUlNBX2dlbmVyYXRlX2tleV9leChSU0EgKiwgaW50LCBCSUdOVU0gKiwgdm9pZCAqKTsKKyMgZW5kaWYKKworaW50IHNzaF9FVlBfQ2lwaGVySW5pdChFVlBfQ0lQSEVSX0NUWCAqLCBjb25zdCBFVlBfQ0lQSEVSICosIHVuc2lnbmVkIGNoYXIgKiwKKyAgICB1bnNpZ25lZCBjaGFyICosIGludCk7CitpbnQgc3NoX0VWUF9DaXBoZXIoRVZQX0NJUEhFUl9DVFggKiwgY2hhciAqLCBjaGFyICosIGludCk7CitpbnQgc3NoX0VWUF9DSVBIRVJfQ1RYX2NsZWFudXAoRVZQX0NJUEhFUl9DVFggKik7Cit2b2lkIHNzaF9PcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcyh2b2lkKTsKKworIyBpZm5kZWYgSEFWRV9ITUFDX0NUWF9JTklUCisjICBkZWZpbmUgSE1BQ19DVFhfaW5pdChhKQorIyBlbmRpZgorCisjZW5kaWYJLyogU1NIX0RPTlRfT1ZFUkxPQURfT1BFTlNTTF9GVU5DUyAqLworCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3BvcnQtYWl4LmMgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3BvcnQtYWl4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJkZWZiZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcG9ydC1haXguYwpAQCAtMCwwICsxLDQ3NCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgR2VydCBEb2VyaW5nLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywyMDA0LDIwMDUsMjAwNiBEYXJyZW4gVHVja2VyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJob3N0ZmlsZS5oIgorI2luY2x1ZGUgImF1dGguaCIKKyNpbmNsdWRlICJzc2guaCIKKyNpbmNsdWRlICJsb2cuaCIKKworI2lmZGVmIF9BSVgKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaWYgZGVmaW5lZChIQVZFX05FVERCX0gpCisjIGluY2x1ZGUgPG5ldGRiLmg+CisjZW5kaWYKKyNpbmNsdWRlIDx1aW5mby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2lmZGVmIFdJVEhfQUlYQVVUSEVOVElDQVRFCisjIGluY2x1ZGUgPGxvZ2luLmg+CisjIGluY2x1ZGUgPHVzZXJwdy5oPgorIyBpZiBkZWZpbmVkKEhBVkVfU1lTX0FVRElUX0gpICYmIGRlZmluZWQoQUlYX0xPR0lORkFJTEVEXzRBUkcpCisjICBpbmNsdWRlIDxzeXMvYXVkaXQuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8dXNlcnNlYy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJwb3J0LWFpeC5oIgorCitzdGF0aWMgY2hhciAqbGFzdGxvZ2luX21zZyA9IE5VTEw7CisKKyMgaWZkZWYgSEFWRV9TRVRBVVRIREIKK3N0YXRpYyBjaGFyIG9sZF9yZWdpc3RyeVtSRUdJU1RSWV9TSVpFXSA9ICIiOworIyBlbmRpZgorCisvKgorICogQUlYIGhhcyBhICJ1c3JpbmZvIiBhcmVhIHdoZXJlIGxvZ25hbWUgYW5kIG90aGVyIHN0dWZmIGlzIHN0b3JlZCAtCisgKiBhIGZldyBhcHBsaWNhdGlvbnMgYWN0dWFsbHkgdXNlIHRoaXMgYW5kIGRpZSBpZiBpdCdzIG5vdCBzZXQKKyAqCisgKiBOT1RFOiBUVFk9IHNob3VsZCBiZSBzZXQsIGJ1dCBzaW5jZSBubyBvbmUgdXNlcyBpdCBhbmQgaXQncyBoYXJkIHRvCisgKiBhY3F1aXJlIGR1ZSB0byBwcml2c2VwIGNvZGUuICBXZSB3aWxsIGp1c3QgZHJvcCBzdXBwb3J0LgorICovCit2b2lkCithaXhfdXNyaW5mbyhzdHJ1Y3QgcGFzc3dkICpwdykKK3sKKwl1X2ludCBpOworCXNpemVfdCBsZW47CisJY2hhciAqY3A7CisKKwlsZW4gPSBzaXplb2YoIkxPR05BTUU9IE5BTUU9ICIpICsgKDIgKiBzdHJsZW4ocHctPnB3X25hbWUpKTsKKwljcCA9IHhtYWxsb2MobGVuKTsKKworCWkgPSBzbnByaW50ZihjcCwgbGVuLCAiTE9HTkFNRT0lcyVjTkFNRT0lcyVjIiwgcHctPnB3X25hbWUsICdcMCcsCisJICAgIHB3LT5wd19uYW1lLCAnXDAnKTsKKwlpZiAodXNyaW5mbyhTRVRVSU5GTywgY3AsIGkpID09IC0xKQorCQlmYXRhbCgiQ291bGRuJ3Qgc2V0IHVzcmluZm86ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlkZWJ1ZzMoIkFJWC9Vc3JJbmZvOiBzZXQgbGVuICVkIiwgaSk7CisKKwl4ZnJlZShjcCk7Cit9CisKKyMgaWZkZWYgV0lUSF9BSVhBVVRIRU5USUNBVEUKKy8qCisgKiBSZW1vdmUgZW1iZWRkZWQgbmV3bGluZXMgaW4gc3RyaW5nIChpZiBhbnkpLgorICogVXNlZCBiZWZvcmUgbG9nZ2luZyBtZXNzYWdlcyByZXR1cm5lZCBieSBBSVggYXV0aGVudGljYXRpb24gZnVuY3Rpb25zCisgKiBzbyB0aGUgbWVzc2FnZSBpcyBsb2dnZWQgb24gb25lIGxpbmUuCisgKi8KK3ZvaWQKK2FpeF9yZW1vdmVfZW1iZWRkZWRfbmV3bGluZXMoY2hhciAqcCkKK3sKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlmb3IgKDsgKnA7IHArKykgeworCQlpZiAoKnAgPT0gJ1xuJykKKwkJCSpwID0gJyAnOworCX0KKwkvKiBSZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLworCWlmICgqLS1wID09ICcgJykKKwkJKnAgPSAnXDAnOworfQorCisvKgorICogVGVzdCBzcGVjaWZpY2FsbHkgZm9yIHRoZSBjYXNlIHdoZXJlIFNZU1RFTSA9PSBOT05FIGFuZCBBVVRIMSBjb250YWlucworICogYW55dGhpbmcgb3RoZXIgdGhhbiBOT05FIG9yIFNZU1RFTSwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIGFkbWluIGhhcworICogY29uZmlndXJlZCB0aGUgYWNjb3VudCBmb3IgcHVyZWx5IEFVVEgxLXR5cGUgYXV0aGVudGljYXRpb24uCisgKgorICogU2luY2UgYXV0aGVudGljYXRlKCkgZG9lc24ndCBjaGVjayBBVVRIMSwgYW5kIHNzaGQgY2FuJ3Qgc2FuZWx5IHN1cHBvcnQKKyAqIEFVVEgxIGl0c2VsZiwgaW4gc3VjaCBhIGNhc2UgYXV0aGVudGljYXRlKCkgd2lsbCBhbGxvdyBhY2Nlc3Mgd2l0aG91dAorICogYXV0aGVudGF0aW9uLCB3aGljaCBpcyBhbG1vc3QgY2VydGFpbmx5IG5vdCB3aGF0IHRoZSBhZG1pbiBpbnRlbmRzLgorICoKKyAqIChUaGUgbmF0aXZlIHRvb2xzLCBlZyBsb2dpbiwgd2lsbCBwcm9jZXNzIHRoZSBBVVRIMSBsaXN0IGluIGFkZGl0aW9uIHRvCisgKiB0aGUgU1lTVEVNIGxpc3QgYnkgdXNpbmcgY2t1c2VySUQoKSwgaG93ZXZlciBja3VzZXJJRCgpIGFuZCBBVVRIMSBtZXRob2RzCisgKiBoYXZlIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSBBSVggNC4yLnggYW5kIHdvdWxkIGJlIHZlcnkgZGlmZmljdWx0IGZvciBzc2hkCisgKiB0byBzdXBwb3J0LgorICoKKyAqIFJldHVybnMgMCBpZiBhbiB1bnN1cHBvcnRhYmxlIGNvbWJpbmF0aW9uIGlzIGZvdW5kLCAxIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludAorYWl4X3ZhbGlkX2F1dGhlbnRpY2F0aW9ucyhjb25zdCBjaGFyICp1c2VyKQoreworCWNoYXIgKmF1dGgxLCAqc3lzLCAqcDsKKwlpbnQgdmFsaWQgPSAxOworCisJaWYgKGdldHVzZXJhdHRyKChjaGFyICopdXNlciwgU19BVVRIU1lTVEVNLCAmc3lzLCBTRUNfQ0hBUikgIT0gMCkgeworCQlsb2dpdCgiQ2FuJ3QgcmV0cmlldmUgYXR0cmlidXRlIFNZU1RFTSBmb3IgJXM6ICUuMTAwcyIsCisJCSAgICB1c2VyLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZWJ1ZzMoIkFJWCBTWVNURU0gYXR0cmlidXRlICVzIiwgc3lzKTsKKwlpZiAoc3RyY21wKHN5cywgIk5PTkUiKSAhPSAwKQorCQlyZXR1cm4gMTsJLyogbm90ICJOT05FIiwgc28gaXMgT0sgKi8KKworCWlmIChnZXR1c2VyYXR0cigoY2hhciAqKXVzZXIsIFNfQVVUSDEsICZhdXRoMSwgU0VDX0xJU1QpICE9IDApIHsKKwkJbG9naXQoIkNhbid0IHJldHJpZXZlIGF0dHJpYnV0ZSBhdXRoMSBmb3IgJXM6ICUuMTAwcyIsCisJCSAgICB1c2VyLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwID0gYXV0aDE7CisJLyogQSBTRUNfTElTVCBpcyBjb25jYXRlbmF0ZWQgc3RyaW5ncywgZW5kaW5nIHdpdGggdHdvIE5VTHMuICovCisJd2hpbGUgKHBbMF0gIT0gJ1wwJyAmJiBwWzFdICE9ICdcMCcpIHsKKwkJZGVidWczKCJBSVggYXV0aDEgYXR0cmlidXRlIGxpc3QgbWVtYmVyICVzIiwgcCk7CisJCWlmIChzdHJjbXAocCwgIk5PTkUiKSAhPSAwICYmIHN0cmNtcChwLCAiU1lTVEVNIikpIHsKKwkJCWxvZ2l0KCJBY2NvdW50ICVzIGhhcyB1bnN1cHBvcnRlZCBhdXRoMSB2YWx1ZSAnJXMnIiwKKwkJCSAgICB1c2VyLCBwKTsKKwkJCXZhbGlkID0gMDsKKwkJfQorCQlwICs9IHN0cmxlbihwKSArIDE7CisJfQorCisJcmV0dXJuICh2YWxpZCk7Cit9CisKKy8qCisgKiBEbyBhdXRoZW50aWNhdGlvbiB2aWEgQUlYJ3MgYXV0aGVudGljYXRlIHJvdXRpbmUuICBXZSBsb29wIHVudGlsIHRoZQorICogcmVlbnRlciBwYXJhbWV0ZXIgaXMgMCwgYnV0IG5vcm1hbGx5IGF1dGhlbnRpY2F0ZSBpcyBjYWxsZWQgb25seSBvbmNlLgorICoKKyAqIE5vdGU6IHRoaXMgZnVuY3Rpb24gcmV0dXJucyAxIG9uIHN1Y2Nlc3MsIHdoZXJlYXMgQUlYJ3MgYXV0aGVudGljYXRlKCkKKyAqIHJldHVybnMgMC4KKyAqLworaW50CitzeXNfYXV0aF9wYXNzd2QoQXV0aGN0eHQgKmN0eHQsIGNvbnN0IGNoYXIgKnBhc3N3b3JkKQoreworCWNoYXIgKmF1dGhtc2cgPSBOVUxMLCAqbXNnID0gTlVMTCwgKm5hbWUgPSBjdHh0LT5wdy0+cHdfbmFtZTsKKwlpbnQgYXV0aHN1Y2Nlc3MgPSAwLCBleHBpcmVkLCByZWVudGVyLCByZXN1bHQ7CisKKwlkbyB7CisJCXJlc3VsdCA9IGF1dGhlbnRpY2F0ZSgoY2hhciAqKW5hbWUsIChjaGFyICopcGFzc3dvcmQsICZyZWVudGVyLAorCQkgICAgJmF1dGhtc2cpOworCQlhaXhfcmVtb3ZlX2VtYmVkZGVkX25ld2xpbmVzKGF1dGhtc2cpOwkKKwkJZGVidWczKCJBSVgvYXV0aGVudGljYXRlIHJlc3VsdCAlZCwgYXV0aG1zZyAlLjEwMHMiLCByZXN1bHQsCisJCSAgICBhdXRobXNnKTsKKwl9IHdoaWxlIChyZWVudGVyKTsKKworCWlmICghYWl4X3ZhbGlkX2F1dGhlbnRpY2F0aW9ucyhuYW1lKSkKKwkJcmVzdWx0ID0gLTE7CisKKwlpZiAocmVzdWx0ID09IDApIHsKKwkJYXV0aHN1Y2Nlc3MgPSAxOworCisJCS8qCisJCSAqIFJlY29yZCBzdWNjZXNzZnVsIGxvZ2luLiAgV2UgZG9uJ3QgaGF2ZSBhIHB0eSB5ZXQsIHNvIGp1c3QKKwkJICogbGFiZWwgdGhlIGxpbmUgYXMgInNzaCIKKwkJICovCisJCWFpeF9zZXRhdXRoZGIobmFtZSk7CisKKwkJLyoKKwkJICogQ2hlY2sgaWYgdGhlIHVzZXIncyBwYXNzd29yZCBpcyBleHBpcmVkLgorCQkgKi8KKwkJZXhwaXJlZCA9IHBhc3N3ZGV4cGlyZWQobmFtZSwgJm1zZyk7CisJCWlmIChtc2cgJiYgKm1zZykgeworCQkJYnVmZmVyX2FwcGVuZChjdHh0LT5sb2dpbm1zZywgbXNnLCBzdHJsZW4obXNnKSk7CisJCQlhaXhfcmVtb3ZlX2VtYmVkZGVkX25ld2xpbmVzKG1zZyk7CisJCX0KKwkJZGVidWczKCJBSVgvcGFzc3dkZXhwaXJlZCByZXR1cm5lZCAlZCBtc2cgJS4xMDBzIiwgZXhwaXJlZCwgbXNnKTsKKworCQlzd2l0Y2ggKGV4cGlyZWQpIHsKKwkJY2FzZSAwOiAvKiBwYXNzd29yZCBub3QgZXhwaXJlZCAqLworCQkJYnJlYWs7CisJCWNhc2UgMTogLyogZXhwaXJlZCwgcGFzc3dvcmQgY2hhbmdlIHJlcXVpcmVkICovCisJCQljdHh0LT5mb3JjZV9wd2NoYW5nZSA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDogLyogdXNlciBjYW4ndCBjaGFuZ2UoMikgb3Igb3RoZXIgZXJyb3IgKC0xKSAqLworCQkJbG9naXQoIlBhc3N3b3JkIGNhbid0IGJlIGNoYW5nZWQgZm9yIHVzZXIgJXM6ICUuMTAwcyIsCisJCQkgICAgbmFtZSwgbXNnKTsKKwkJCWlmIChtc2cpCisJCQkJeGZyZWUobXNnKTsKKwkJCWF1dGhzdWNjZXNzID0gMDsKKwkJfQorCisJCWFpeF9yZXN0b3JlYXV0aGRiKCk7CisJfQorCisJaWYgKGF1dGhtc2cgIT0gTlVMTCkKKwkJeGZyZWUoYXV0aG1zZyk7CisKKwlyZXR1cm4gYXV0aHN1Y2Nlc3M7Cit9CisKKy8qCisgKiBDaGVjayBpZiBzcGVjaWZpZWQgYWNjb3VudCBpcyBwZXJtaXR0ZWQgdG8gbG9nIGluLgorICogUmV0dXJucyAxIGlmIGxvZ2luIGlzIGFsbG93ZWQsIDAgaWYgbm90IGFsbG93ZWQuCisgKi8KK2ludAorc3lzX2F1dGhfYWxsb3dlZF91c2VyKHN0cnVjdCBwYXNzd2QgKnB3LCBCdWZmZXIgKmxvZ2lubXNnKQoreworCWNoYXIgKm1zZyA9IE5VTEw7CisJaW50IHJlc3VsdCwgcGVybWl0dGVkID0gMDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCS8qCisJICogRG9uJ3QgcGVyZm9ybSBjaGVja3MgZm9yIHJvb3QgYWNjb3VudCAoUGVybWl0Um9vdExvZ2luIGNvbnRyb2xzCisJICogbG9naW5zIHZpYSBzc2gpIG9yIGlmIHJ1bm5pbmcgYXMgbm9uLXJvb3QgdXNlciAoc2luY2UKKwkgKiBsb2dpbnJlc3RyaWN0aW9ucyB3aWxsIGFsd2F5cyBmYWlsIGR1ZSB0byBpbnN1ZmZpY2llbnQgcHJpdmlsZWdlKS4KKwkgKi8KKwlpZiAocHctPnB3X3VpZCA9PSAwIHx8IGdldGV1aWQoKSAhPSAwKSB7CisJCWRlYnVnMygiJXM6IG5vdCBjaGVja2luZyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmVzdWx0ID0gbG9naW5yZXN0cmljdGlvbnMocHctPnB3X25hbWUsIFNfUkxPR0lOLCBOVUxMLCAmbXNnKTsKKwlpZiAocmVzdWx0ID09IDApCisJCXBlcm1pdHRlZCA9IDE7CisJLyoKKwkgKiBJZiByZXN0cmljdGVkIGJlY2F1c2UgL2V0Yy9ub2xvZ2luIGV4aXN0cywgdGhlIGxvZ2luIHdpbGwgYmUgZGVuaWVkCisJICogaW4gc2Vzc2lvbi5jIGFmdGVyIHRoZSBub2xvZ2luIG1lc3NhZ2UgaXMgc2VudCwgc28gYWxsb3cgZm9yIG5vdworCSAqIGFuZCBkbyBub3QgYXBwZW5kIHRoZSByZXR1cm5lZCBtZXNzYWdlLgorCSAqLworCWlmIChyZXN1bHQgPT0gLTEgJiYgZXJybm8gPT0gRVBFUk0gJiYgc3RhdChfUEFUSF9OT0xPR0lOLCAmc3QpID09IDApCisJCXBlcm1pdHRlZCA9IDE7CisJZWxzZSBpZiAobXNnICE9IE5VTEwpCisJCWJ1ZmZlcl9hcHBlbmQobG9naW5tc2csIG1zZywgc3RybGVuKG1zZykpOworCWlmIChtc2cgPT0gTlVMTCkKKwkJbXNnID0geHN0cmR1cCgiKG5vbmUpIik7CisJYWl4X3JlbW92ZV9lbWJlZGRlZF9uZXdsaW5lcyhtc2cpOworCWRlYnVnMygiQUlYL2xvZ2lucmVzdHJpY3Rpb25zIHJldHVybmVkICVkIG1zZyAlLjEwMHMiLCByZXN1bHQsIG1zZyk7CisKKwlpZiAoIXBlcm1pdHRlZCkKKwkJbG9naXQoIkxvZ2luIHJlc3RyaWN0ZWQgZm9yICVzOiAlLjEwMHMiLCBwdy0+cHdfbmFtZSwgbXNnKTsKKwl4ZnJlZShtc2cpOworCXJldHVybiBwZXJtaXR0ZWQ7Cit9CisKK2ludAorc3lzX2F1dGhfcmVjb3JkX2xvZ2luKGNvbnN0IGNoYXIgKnVzZXIsIGNvbnN0IGNoYXIgKmhvc3QsIGNvbnN0IGNoYXIgKnR0eW5tLAorICAgIEJ1ZmZlciAqbG9naW5tc2cpCit7CisJY2hhciAqbXNnID0gTlVMTDsKKwlpbnQgc3VjY2VzcyA9IDA7CisKKwlhaXhfc2V0YXV0aGRiKHVzZXIpOworCWlmIChsb2dpbnN1Y2Nlc3MoKGNoYXIgKil1c2VyLCAoY2hhciAqKWhvc3QsIChjaGFyICopdHR5bm0sICZtc2cpID09IDApIHsKKwkJc3VjY2VzcyA9IDE7CisJCWlmIChtc2cgIT0gTlVMTCkgeworCQkJZGVidWcoIkFJWC9sb2dpbnN1Y2Nlc3M6IG1zZyAlcyIsIG1zZyk7CisJCQlpZiAobGFzdGxvZ2luX21zZyA9PSBOVUxMKQorCQkJCWxhc3Rsb2dpbl9tc2cgPSBtc2c7CisJCX0KKwl9CisJYWl4X3Jlc3RvcmVhdXRoZGIoKTsKKwlyZXR1cm4gKHN1Y2Nlc3MpOworfQorCitjaGFyICoKK3N5c19hdXRoX2dldF9sYXN0bG9naW5fbXNnKGNvbnN0IGNoYXIgKnVzZXIsIHVpZF90IHVpZCkKK3sKKwljaGFyICptc2cgPSBsYXN0bG9naW5fbXNnOworCisJbGFzdGxvZ2luX21zZyA9IE5VTEw7CisJcmV0dXJuIG1zZzsKK30KKworIyAgaWZkZWYgQ1VTVE9NX0ZBSUxFRF9MT0dJTgorLyoKKyAqIHJlY29yZF9mYWlsZWRfbG9naW46IGdlbmVyaWMgImxvZ2luIGZhaWxlZCIgaW50ZXJmYWNlIGZ1bmN0aW9uCisgKi8KK3ZvaWQKK3JlY29yZF9mYWlsZWRfbG9naW4oY29uc3QgY2hhciAqdXNlciwgY29uc3QgY2hhciAqaG9zdG5hbWUsIGNvbnN0IGNoYXIgKnR0eW5hbWUpCit7CisJaWYgKGdldGV1aWQoKSAhPSAwKQorCQlyZXR1cm47CisKKwlhaXhfc2V0YXV0aGRiKHVzZXIpOworIyAgIGlmZGVmIEFJWF9MT0dJTkZBSUxFRF80QVJHCisJbG9naW5mYWlsZWQoKGNoYXIgKil1c2VyLCAoY2hhciAqKWhvc3RuYW1lLCAoY2hhciAqKXR0eW5hbWUsCisJICAgIEFVRElUX0ZBSUxfQVVUSCk7CisjICAgZWxzZQorCWxvZ2luZmFpbGVkKChjaGFyICopdXNlciwgKGNoYXIgKilob3N0bmFtZSwgKGNoYXIgKil0dHluYW1lKTsKKyMgICBlbmRpZgorCWFpeF9yZXN0b3JlYXV0aGRiKCk7Cit9CisjICBlbmRpZiAvKiBDVVNUT01fRkFJTEVEX0xPR0lOICovCisKKy8qCisgKiBJZiB3ZSBoYXZlIHNldGF1dGhkYiwgcmV0cmlldmUgdGhlIHBhc3N3b3JkIHJlZ2lzdHJ5IGZvciB0aGUgdXNlcidzCisgKiBhY2NvdW50IHRoZW4gZmVlZCBpdCB0byBzZXRhdXRoZGIuICBUaGlzIHdpbGwgbWVhbiB0aGF0IHN1YnNlcXVlbnQgQUlYIGF1dGgKKyAqIGZ1bmN0aW9ucyB3aWxsIG9ubHkgdXNlIHRoZSBzcGVjaWZpZWQgbG9hZGFibGUgbW9kdWxlLiAgSWYgd2UgZG9uJ3QgaGF2ZQorICogc2V0YXV0aGRiIHRoaXMgaXMgYSBuby1vcC4KKyAqLwordm9pZAorYWl4X3NldGF1dGhkYihjb25zdCBjaGFyICp1c2VyKQoreworIyAgaWZkZWYgSEFWRV9TRVRBVVRIREIKKwljaGFyICpyZWdpc3RyeTsKKworCWlmIChzZXR1c2VyZGIoU19SRUFEKSA9PSAtMSkgeworCQlkZWJ1ZzMoIiVzOiBDb3VsZCBub3Qgb3BlbiB1c2VyZGIgdG8gcmVhZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoZ2V0dXNlcmF0dHIoKGNoYXIgKil1c2VyLCBTX1JFR0lTVFJZLCAmcmVnaXN0cnksIFNFQ19DSEFSKSA9PSAwKSB7CisJCWlmIChzZXRhdXRoZGIocmVnaXN0cnksIG9sZF9yZWdpc3RyeSkgPT0gMCkKKwkJCWRlYnVnMygiQUlYL3NldGF1dGhkYiBzZXQgcmVnaXN0cnkgJyVzJyIsIHJlZ2lzdHJ5KTsKKwkJZWxzZSAKKwkJCWRlYnVnMygiQUlYL3NldGF1dGhkYiBzZXQgcmVnaXN0cnkgJyVzJyBmYWlsZWQ6ICVzIiwKKwkJCSAgICByZWdpc3RyeSwgc3RyZXJyb3IoZXJybm8pKTsKKwl9IGVsc2UKKwkJZGVidWczKCIlczogQ291bGQgbm90IHJlYWQgU19SRUdJU1RSWSBmb3IgdXNlcjogJXMiLCBfX2Z1bmNfXywKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJZW5kdXNlcmRiKCk7CisjICBlbmRpZiAvKiBIQVZFX1NFVEFVVEhEQiAqLworfQorCisvKgorICogUmVzdG9yZSB0aGUgdXNlcidzIHJlZ2lzdHJ5IHNldHRpbmdzIGZyb20gb2xkX3JlZ2lzdHJ5LgorICogTm90ZSB0aGF0IGlmIHRoZSBmaXJzdCBhaXhfc2V0YXV0aGRiIGZhaWxzLCBzZXRhdXRoZGIoIiIpIGlzIHN0aWxsIHNhZmUKKyAqIChpdCByZXN0b3JlcyB0aGUgc3lzdGVtIGRlZmF1bHQgYmVoYXZpb3VyKS4gIElmIHdlIGRvbid0IGhhdmUgc2V0YXV0aGRiLAorICogdGhpcyBpcyBhIG5vLW9wLgorICovCit2b2lkCithaXhfcmVzdG9yZWF1dGhkYih2b2lkKQoreworIyAgaWZkZWYgSEFWRV9TRVRBVVRIREIKKwlpZiAoc2V0YXV0aGRiKG9sZF9yZWdpc3RyeSwgTlVMTCkgPT0gMCkKKwkJZGVidWczKCIlczogcmVzdG9yaW5nIG9sZCByZWdpc3RyeSAnJXMnIiwgX19mdW5jX18sCisJCSAgICBvbGRfcmVnaXN0cnkpOworCWVsc2UKKwkJZGVidWczKCIlczogZmFpbGVkIHRvIHJlc3RvcmUgb2xkIHJlZ2lzdHJ5ICVzIiwgX19mdW5jX18sCisJCSAgICBvbGRfcmVnaXN0cnkpOworIyAgZW5kaWYgLyogSEFWRV9TRVRBVVRIREIgKi8KK30KKworIyBlbmRpZiAvKiBXSVRIX0FJWEFVVEhFTlRJQ0FURSAqLworCisjIGlmZGVmIFVTRV9BSVhfS1JCX05BTUUKKy8qCisgKiBhaXhfa3JiNV9nZXRfcHJpbmNpcGFsX25hbWU6IHJldHVybnMgdGhlIHVzZXIncyBrZXJiZXJvcyBjbGllbnQgcHJpbmNpcGFsIG5hbWUgaWYKKyAqIGNvbmZpZ3VyZWQsIG90aGVyd2lzZSBOVUxMLiAgQ2FsbGVyIG11c3QgZnJlZSByZXR1cm5lZCBzdHJpbmcuCisgKi8KK2NoYXIgKgorYWl4X2tyYjVfZ2V0X3ByaW5jaXBhbF9uYW1lKGNoYXIgKnB3X25hbWUpCit7CisJY2hhciAqYXV0aG5hbWUgPSBOVUxMLCAqYXV0aGRvbWFpbiA9IE5VTEwsICpwcmluY2lwYWwgPSBOVUxMOworCisJc2V0dXNlcmRiKFNfUkVBRCk7CisJaWYgKGdldHVzZXJhdHRyKHB3X25hbWUsIFNfQVVUSERPTUFJTiwgJmF1dGhkb21haW4sIFNFQ19DSEFSKSAhPSAwKQorCQlkZWJ1ZygiQUlYIGdldHVzZXJhdHRyIFNfQVVUSERPTUFJTjogJXMiLCBzdHJlcnJvcihlcnJubykpOworCWlmIChnZXR1c2VyYXR0cihwd19uYW1lLCBTX0FVVEhOQU1FLCAmYXV0aG5hbWUsIFNFQ19DSEFSKSAhPSAwKQorCQlkZWJ1ZygiQUlYIGdldHVzZXJhdHRyIFNfQVVUSE5BTUU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKworCWlmIChhdXRoZG9tYWluICE9IE5VTEwpCisJCXhhc3ByaW50ZigmcHJpbmNpcGFsLCAiJXNAJXMiLCBhdXRobmFtZSA/IGF1dGhuYW1lIDogcHdfbmFtZSwgYXV0aGRvbWFpbik7CisJZWxzZSBpZiAoYXV0aG5hbWUgIT0gTlVMTCkKKwkJcHJpbmNpcGFsID0geHN0cmR1cChhdXRobmFtZSk7CisJZW5kdXNlcmRiKCk7CisJcmV0dXJuIHByaW5jaXBhbDsKK30KKyMgZW5kaWYgLyogVVNFX0FJWF9LUkJfTkFNRSAqLworCisjIGlmIGRlZmluZWQoQUlYX0dFVE5BTUVJTkZPX0hBQ0spICYmICFkZWZpbmVkKEJST0tFTl9BRERSSU5GTykKKyMgdW5kZWYgZ2V0bmFtZWluZm8KKy8qCisgKiBGb3Igc29tZSByZWFzb24sIEFJWCdzIGdldG5hbWVpbmZvIHdpbGwgcmVmdXNlIHRvIHJlc29sdmUgdGhlIGFsbC16ZXJvcworICogSVB2NiBhZGRyZXNzIGludG8gaXRzIHRleHR1YWwgcmVwcmVzZW50YXRpb24gKCI6OiIpLCBzbyB3ZSB3cmFwIGl0CisgKiB3aXRoIGEgZnVuY3Rpb24gdGhhdCB3aWxsLgorICovCitpbnQKK3NzaGFpeF9nZXRuYW1laW5mbyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhLCBzaXplX3Qgc2FsZW4sIGNoYXIgKmhvc3QsCisgICAgc2l6ZV90IGhvc3RsZW4sIGNoYXIgKnNlcnYsIHNpemVfdCBzZXJ2bGVuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2thZGRyX2luNiAqc2E2OworCXVfaW50MzJfdCAqYTY7CisKKwlpZiAoZmxhZ3MgJiAoTklfTlVNRVJJQ0hPU1R8TklfTlVNRVJJQ1NFUlYpICYmCisJICAgIHNhLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJc2E2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYTsKKwkJYTYgPSBzYTYtPnNpbjZfYWRkci51Nl9hZGRyLnU2X2FkZHIzMjsKKworCQlpZiAoYTZbMF0gPT0gMCAmJiBhNlsxXSA9PSAwICYmIGE2WzJdID09IDAgJiYgYTZbM10gPT0gMCkgeworCQkJc3RybGNweShob3N0LCAiOjoiLCBob3N0bGVuKTsKKwkJCXNucHJpbnRmKHNlcnYsIHNlcnZsZW4sICIlZCIsIHNhNi0+c2luNl9wb3J0KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiBnZXRuYW1laW5mbyhzYSwgc2FsZW4sIGhvc3QsIGhvc3RsZW4sIHNlcnYsIHNlcnZsZW4sIGZsYWdzKTsKK30KKyMgZW5kaWYgLyogQUlYX0dFVE5BTUVJTkZPX0hBQ0sgKi8KKworIyBpZiBkZWZpbmVkKFVTRV9HRVRHUlNFVCkKKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgoraW50CitnZXRncm91cGxpc3QoY29uc3QgY2hhciAqdXNlciwgZ2lkX3QgcGdpZCwgZ2lkX3QgKmdyb3VwcywgaW50ICpncnBjbnQpCit7CisJY2hhciAqY3AsICpncnBsaXN0LCAqZ3JwOworCWdpZF90IGdpZDsKKwlpbnQgcmV0ID0gMCwgbmdyb3VwcyA9IDAsIG1heGdyb3VwczsKKwlsb25nIGw7CisKKwltYXhncm91cHMgPSAqZ3JwY250OworCisJaWYgKChjcCA9IGdycGxpc3QgPSBnZXRncnNldCh1c2VyKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJLyogaGFuZGxlIHplcm8tbGVuZ3RoIGNhc2UgKi8KKwlpZiAobWF4Z3JvdXBzIDw9IDApIHsKKwkJKmdycGNudCA9IDA7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBjb3B5IHByaW1hcnkgZ3JvdXAgKi8KKwlncm91cHNbbmdyb3VwcysrXSA9IHBnaWQ7CisKKwkvKiBjb3B5IGVhY2ggZW50cnkgZnJvbSBnZXRncnNldCBpbnRvIGdyb3VwIGxpc3QgKi8KKwl3aGlsZSAoKGdycCA9IHN0cnNlcCgmZ3JwbGlzdCwgIiwiKSkgIT0gTlVMTCkgeworCQlsID0gc3RydG9sKGdycCwgTlVMTCwgMTApOworCQlpZiAobmdyb3VwcyA+PSBtYXhncm91cHMgfHwgbCA9PSBMT05HX01JTiB8fCBsID09IExPTkdfTUFYKSB7CisJCQlyZXQgPSAtMTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWdpZCA9IChnaWRfdClsOworCQlpZiAoZ2lkID09IHBnaWQpCisJCQljb250aW51ZTsJLyogd2UgaGF2ZSBhbHJlYWR5IGFkZGVkIHByaW1hcnkgZ2lkICovCisJCWdyb3Vwc1tuZ3JvdXBzKytdID0gZ2lkOworCX0KK291dDoKKwlmcmVlKGNwKTsKKwkqZ3JwY250ID0gbmdyb3VwczsKKwlyZXR1cm4gcmV0OworfQorIyBlbmRpZgkvKiBVU0VfR0VUR1JTRVQgKi8KKworI2VuZGlmIC8qIF9BSVggKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcG9ydC1haXguaCBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcG9ydC1haXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2U0ZTg4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9wb3J0LWFpeC5oCkBAIC0wLDAgKzEsMTI3IEBACisvKiAkSWQ6IHBvcnQtYWl4LmgsdiAxLjMyIDIwMDkvMTIvMjAgMjM6NDk6MjIgZHR1Y2tlciBFeHAgJCAqLworCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBHZXJ0IERvZXJpbmcuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA0LDIwMDUsMjAwNiBEYXJyZW4gVHVja2VyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmZGVmIF9BSVgKKworI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICisjIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiYnVmZmVyLmgiCisKKy8qIFRoZXNlIHNob3VsZCBiZSBpbiB0aGUgc3lzdGVtIGhlYWRlcnMgYnV0IGFyZSBub3QuICovCitpbnQgdXNyaW5mbyhpbnQsIGNoYXIgKiwgaW50KTsKKyNpZiBkZWZpbmVkKEhBVkVfREVDTF9TRVRBVVRIREIpICYmIChIQVZFX0RFQ0xfU0VUQVVUSERCID09IDApCitpbnQgc2V0YXV0aGRiKGNvbnN0IGNoYXIgKiwgY2hhciAqKTsKKyNlbmRpZgorLyogdGhlc2UgbWF5IG9yIG1heSBub3QgYmUgaW4gdGhlIGhlYWRlcnMgZGVwZW5kaW5nIG9uIHRoZSB2ZXJzaW9uICovCisjaWYgZGVmaW5lZChIQVZFX0RFQ0xfQVVUSEVOVElDQVRFKSAmJiAoSEFWRV9ERUNMX0FVVEhFTlRJQ0FURSA9PSAwKQoraW50IGF1dGhlbnRpY2F0ZShjaGFyICosIGNoYXIgKiwgaW50ICosIGNoYXIgKiopOworI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX0RFQ0xfTE9HSU5GQUlMRUQpICYmIChIQVZFX0RFQ0xfTE9HSU5GQUlMRUQgPT0gMCkKK2ludCBsb2dpbmZhaWxlZChjaGFyICosIGNoYXIgKiwgY2hhciAqKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9ERUNMX0xPR0lOUkVTVFJJQ1RJT05TKSAmJiAoSEFWRV9ERUNMX0xPR0lOUkVTVFJJQ1RJT05TID09IDApCitpbnQgbG9naW5yZXN0cmljdGlvbnMoY2hhciAqLCBpbnQsIGNoYXIgKiwgY2hhciAqKik7CisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBVkVfREVDTF9MT0dJTlNVQ0NFU1MpICYmIChIQVZFX0RFQ0xfTE9HSU5TVUNDRVNTID09IDApCitpbnQgbG9naW5zdWNjZXNzKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiopOworI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX0RFQ0xfUEFTU1dERVhQSVJFRCkgJiYgKEhBVkVfREVDTF9QQVNTV0RFWFBJUkVEID09IDApCitpbnQgcGFzc3dkZXhwaXJlZChjaGFyICosIGNoYXIgKiopOworI2VuZGlmCisKKy8qIFNvbWUgdmVyc2lvbnMgZGVmaW5lIHJfdHlwZSBpbiB0aGUgYWJvdmUgaGVhZGVycywgd2hpY2ggY2F1c2VzIGEgY29uZmxpY3QgKi8KKyNpZmRlZiByX3R5cGUKKyMgdW5kZWYgcl90eXBlCisjZW5kaWYKKworLyogQUlYIDQuMi54IGRvZXNuJ3QgaGF2ZSBuYW5vc2xlZXAgYnV0IGRvZXMgaGF2ZSBuc2xlZXAgd2hpY2ggaXMgZXF1aXZhbGVudCAqLworI2lmICFkZWZpbmVkKEhBVkVfTkFOT1NMRUVQKSAmJiBkZWZpbmVkKEhBVkVfTlNMRUVQKQorIyBkZWZpbmUgbmFub3NsZWVwKGEsYikgbnNsZWVwKGEsYikKKyNlbmRpZgorCisvKiBGb3Igc3RydWN0IHRpbWVzcGVjIG9uIEFJWCA0LjIueCAqLworI2lmZGVmIEhBVkVfU1lTX1RJTUVSU19ICisjIGluY2x1ZGUgPHN5cy90aW1lcnMuaD4KKyNlbmRpZgorCisvKiBmb3Igc2V0cGNyZWQgYW5kIGZyaWVuZHMgKi8KKyNpZmRlZiBIQVZFX1VTRVJTRUNfSAorIyBpbmNsdWRlIDx1c2Vyc2VjLmg+CisjZW5kaWYKKworLyoKKyAqIEFjY29yZGluZyB0byB0aGUgc2V0YXV0aGRiIG1hbiBwYWdlLCBBSVggcGFzc3dvcmQgcmVnaXN0cmllcyBtdXN0IGJlIDE1CisgKiBjaGFycyBvciBsZXNzIHBsdXMgdGVybWluYXRpbmcgTlVMLgorICovCisjaWZkZWYgSEFWRV9TRVRBVVRIREIKKyMgZGVmaW5lIFJFR0lTVFJZX1NJWkUJMTYKKyNlbmRpZgorCit2b2lkIGFpeF91c3JpbmZvKHN0cnVjdCBwYXNzd2QgKik7CisKKyNpZmRlZiBXSVRIX0FJWEFVVEhFTlRJQ0FURQorIyBkZWZpbmUgQ1VTVE9NX1NZU19BVVRIX1BBU1NXRCAxCisjIGRlZmluZSBDVVNUT01fU1lTX0FVVEhfQUxMT1dFRF9VU0VSIDEKK2ludCBzeXNfYXV0aF9hbGxvd2VkX3VzZXIoc3RydWN0IHBhc3N3ZCAqLCBCdWZmZXIgKik7CisjIGRlZmluZSBDVVNUT01fU1lTX0FVVEhfUkVDT1JEX0xPR0lOIDEKK2ludCBzeXNfYXV0aF9yZWNvcmRfbG9naW4oY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgQnVmZmVyICopOworIyBkZWZpbmUgQ1VTVE9NX1NZU19BVVRIX0dFVF9MQVNUTE9HSU5fTVNHCitjaGFyICpzeXNfYXV0aF9nZXRfbGFzdGxvZ2luX21zZyhjb25zdCBjaGFyICosIHVpZF90KTsKKyMgZGVmaW5lIENVU1RPTV9GQUlMRURfTE9HSU4gMQorIyBpZiBkZWZpbmVkKFNfQVVUSERPTUFJTikgICYmIGRlZmluZWQgKFNfQVVUSE5BTUUpCisjIGRlZmluZSBVU0VfQUlYX0tSQl9OQU1FCitjaGFyICphaXhfa3JiNV9nZXRfcHJpbmNpcGFsX25hbWUoY2hhciAqKTsKKyMgZW5kaWYKKyNlbmRpZgorCit2b2lkIGFpeF9zZXRhdXRoZGIoY29uc3QgY2hhciAqKTsKK3ZvaWQgYWl4X3Jlc3RvcmVhdXRoZGIodm9pZCk7Cit2b2lkIGFpeF9yZW1vdmVfZW1iZWRkZWRfbmV3bGluZXMoY2hhciAqKTsKKworI2lmIGRlZmluZWQoQUlYX0dFVE5BTUVJTkZPX0hBQ0spICYmICFkZWZpbmVkKEJST0tFTl9HRVRBRERSSU5GTykKKyMgaWZkZWYgZ2V0bmFtZWluZm8KKyMgIHVuZGVmIGdldG5hbWVpbmZvCisjIGVuZGlmCitpbnQgc3NoYWl4X2dldG5hbWVpbmZvKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqLCBzaXplX3QsIGNoYXIgKiwgc2l6ZV90LAorICAgIGNoYXIgKiwgc2l6ZV90LCBpbnQpOworIyBkZWZpbmUgZ2V0bmFtZWluZm8oYSxiLGMsZCxlLGYsZykgKHNzaGFpeF9nZXRuYW1laW5mbyhhLGIsYyxkLGUsZixnKSkKKyNlbmRpZgorCisvKgorICogV2UgdXNlIGdldGdyc2V0IGluIHByZWZlcmVuY2UgdG8gbXVsdGlwbGUgZ2V0Z3JlbnQgY2FsbHMgZm9yIGVmZmljaWVuY3kKKyAqIHBsdXMgaXQgc3VwcG9ydHMgTklTIGFuZCBMREFQIGdyb3Vwcy4KKyAqLworI2lmICFkZWZpbmVkKEhBVkVfR0VUR1JPVVBMSVNUKSAmJiBkZWZpbmVkKEhBVkVfR0VUR1JTRVQpCisjIGRlZmluZSBIQVZFX0dFVEdST1VQTElTVAorIyBkZWZpbmUgVVNFX0dFVEdSU0VUCitpbnQgZ2V0Z3JvdXBsaXN0KGNvbnN0IGNoYXIgKiwgZ2lkX3QsIGdpZF90ICosIGludCAqKTsKKyNlbmRpZgorCisjZW5kaWYgLyogX0FJWCAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9wb3J0LWlyaXguYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcG9ydC1pcml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3NTFhNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcG9ydC1pcml4LmMKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBEZW5pcyBQYXJrZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwIE1pY2hhZWwgU3RvbmUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2lmIGRlZmluZWQoV0lUSF9JUklYX1BST0pFQ1QpIHx8IFwKKyAgICBkZWZpbmVkKFdJVEhfSVJJWF9KT0JTKSB8fCBcCisgICAgZGVmaW5lZChXSVRIX0lSSVhfQVJSQVkpCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZkZWYgV0lUSF9JUklYX1BST0pFQ1QKKyMgaW5jbHVkZSA8cHJvai5oPgorI2VuZGlmIC8qIFdJVEhfSVJJWF9QUk9KRUNUICovCisjaWZkZWYgV0lUSF9JUklYX0pPQlMKKyMgaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjZW5kaWYKKyNpZmRlZiBXSVRIX0lSSVhfQVVESVQKKyMgaW5jbHVkZSA8c2F0Lmg+CisjZW5kaWYgLyogV0lUSF9JUklYX0FVRElUICovCisKK3ZvaWQKK2lyaXhfc2V0dXNlcmNvbnRleHQoc3RydWN0IHBhc3N3ZCAqcHcpCit7CisjaWZkZWYgV0lUSF9JUklYX1BST0pFQ1QKKyAgICAgICAgcHJpZF90IHByb2ppZDsKKyNlbmRpZgorI2lmZGVmIFdJVEhfSVJJWF9KT0JTCisgICAgICAgIGppZF90IGppZCA9IDA7CisjZWxpZiBkZWZpbmVkKFdJVEhfSVJJWF9BUlJBWSkKKyAgICAgICAgaW50IGppZCA9IDA7CisjZW5kaWYKKworI2lmZGVmIFdJVEhfSVJJWF9KT0JTCisgICAgICAgIGppZCA9IGpsaW1pdF9zdGFydGpvYihwdy0+cHdfbmFtZSwgcHctPnB3X3VpZCwgImludGVyYWN0aXZlIik7CisgICAgICAgIGlmIChqaWQgPT0gLTEpCisgICAgICAgICAgICAgICAgZmF0YWwoIkZhaWxlZCB0byBjcmVhdGUgam9iIGNvbnRhaW5lcjogJS4xMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyNlbmRpZiAvKiBXSVRIX0lSSVhfSk9CUyAqLworI2lmZGVmIFdJVEhfSVJJWF9BUlJBWQorICAgICAgICAvKiBpbml0aWFsaXplIGFycmF5IHNlc3Npb24gKi8KKyAgICAgICAgaWYgKGppZCA9PSAwICAmJiBuZXdhcnJheXNlc3MoKSAhPSAwKQorICAgICAgICAgICAgICAgIGZhdGFsKCJGYWlsZWQgdG8gc2V0IHVwIG5ldyBhcnJheSBzZXNzaW9uOiAlLjEwMHMiLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworI2VuZGlmIC8qIFdJVEhfSVJJWF9BUlJBWSAqLworI2lmZGVmIFdJVEhfSVJJWF9QUk9KRUNUCisgICAgICAgIC8qIGluaXRpYWxpemUgaXJpeCBwcm9qZWN0IGluZm8gKi8KKyAgICAgICAgaWYgKChwcm9qaWQgPSBnZXRkZmx0cHJvanVzZXIocHctPnB3X25hbWUpKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIGRlYnVnKCJGYWlsZWQgdG8gZ2V0IHByb2plY3QgaWQsIHVzaW5nIHByb2ppZCAwIik7CisgICAgICAgICAgICAgICAgcHJvamlkID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2V0cHJpZChwcm9qaWQpKQorICAgICAgICAgICAgICAgIGZhdGFsKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcm9qZWN0ICVkIGZvciAlczogJS4xMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgKGludClwcm9qaWQsIHB3LT5wd19uYW1lLCBzdHJlcnJvcihlcnJubykpOworI2VuZGlmIC8qIFdJVEhfSVJJWF9QUk9KRUNUICovCisjaWZkZWYgV0lUSF9JUklYX0FVRElUCisgICAgICAgIGlmIChzeXNjb25mKF9TQ19BVURJVCkpIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZygiU2V0dGluZyBzYXQgaWQgdG8gJWQiLCAoaW50KSBwdy0+cHdfdWlkKTsKKyAgICAgICAgICAgICAgICBpZiAoc2F0c2V0aWQocHctPnB3X3VpZCkpCisgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZygiZXJyb3Igc2V0dGluZyBzYXRpZDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFdJVEhfSVJJWF9BVURJVCAqLworfQorCisKKyNlbmRpZiAvKiBkZWZpbmVkKFdJVEhfSVJJWF9QUk9KRUNUKSB8fCBkZWZpbmVkKFdJVEhfSVJJWF9KT0JTKSB8fCBkZWZpbmVkKFdJVEhfSVJJWF9BUlJBWSkgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcG9ydC1pcml4LmggYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3BvcnQtaXJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YzQ4NjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3BvcnQtaXJpeC5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qICRJZDogcG9ydC1pcml4LmgsdiAxLjQgMjAwMy8wOC8yOSAxNjo1OTo1MiBtb3VyaW5nIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgRGVuaXMgUGFya2VyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCBNaWNoYWVsIFN0b25lLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfUE9SVF9JUklYX0gKKyNkZWZpbmUgX1BPUlRfSVJJWF9ICisKKyNpZiBkZWZpbmVkKFdJVEhfSVJJWF9QUk9KRUNUKSB8fCBcCisgICAgZGVmaW5lZChXSVRIX0lSSVhfSk9CUykgfHwgXAorICAgIGRlZmluZWQoV0lUSF9JUklYX0FSUkFZKQorCit2b2lkIGlyaXhfc2V0dXNlcmNvbnRleHQoc3RydWN0IHBhc3N3ZCAqcHcpOworCisjZW5kaWYgLyogZGVmaW5lZChXSVRIX0lSSVhfUFJPSkVDVCkgfHwgZGVmaW5lZChXSVRIX0lSSVhfSk9CUykgfHwgZGVmaW5lZChXSVRIX0lSSVhfQVJSQVkpICovCisKKyNlbmRpZiAvKiAhIF9QT1JUX0lSSVhfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9wb3J0LWxpbnV4LmMgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3BvcnQtbGludXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmE3NTM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9wb3J0LWxpbnV4LmMKQEAgLTAsMCArMSwzMTMgQEAKKy8qICRJZDogcG9ydC1saW51eC5jLHYgMS4xNyAyMDEyLzAzLzA4IDIzOjI1OjE4IGRqbSBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1IERhbmllbCBXYWxzaCA8ZHdhbHNoQHJlZGhhdC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgRGFtaWVuIE1pbGxlciA8ZGptQG9wZW5ic2Qub3JnPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBMaW51eC1zcGVjaWZpYyBwb3J0YWJpbGl0eSBjb2RlIC0ganVzdCBTRUxpbnV4IHN1cHBvcnQgYXQgcHJlc2VudAorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaWYgZGVmaW5lZChXSVRIX1NFTElOVVgpIHx8IGRlZmluZWQoTElOVVhfT09NX0FESlVTVCkKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAicG9ydC1saW51eC5oIgorCisjaWZkZWYgV0lUSF9TRUxJTlVYCisjaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+CisjaW5jbHVkZSA8c2VsaW51eC9mbGFzay5oPgorI2luY2x1ZGUgPHNlbGludXgvZ2V0X2NvbnRleHRfbGlzdC5oPgorCisjaWZuZGVmIFNTSF9TRUxJTlVYX1VOQ09ORklORURfVFlQRQorIyBkZWZpbmUgU1NIX1NFTElOVVhfVU5DT05GSU5FRF9UWVBFICI6dW5jb25maW5lZF90OiIKKyNlbmRpZgorCisvKiBXcmFwcGVyIGFyb3VuZCBpc19zZWxpbnV4X2VuYWJsZWQoKSB0byBsb2cgaXRzIHJldHVybiB2YWx1ZSBvbmNlIG9ubHkgKi8KK2ludAorc3NoX3NlbGludXhfZW5hYmxlZCh2b2lkKQoreworCXN0YXRpYyBpbnQgZW5hYmxlZCA9IC0xOworCisJaWYgKGVuYWJsZWQgPT0gLTEpIHsKKwkJZW5hYmxlZCA9IChpc19zZWxpbnV4X2VuYWJsZWQoKSA9PSAxKTsKKwkJZGVidWcoIlNFTGludXggc3VwcG9ydCAlcyIsIGVuYWJsZWQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwl9CisKKwlyZXR1cm4gKGVuYWJsZWQpOworfQorCisvKiBSZXR1cm4gdGhlIGRlZmF1bHQgc2VjdXJpdHkgY29udGV4dCBmb3IgdGhlIGdpdmVuIHVzZXJuYW1lICovCitzdGF0aWMgc2VjdXJpdHlfY29udGV4dF90Citzc2hfc2VsaW51eF9nZXRjdHhieW5hbWUoY2hhciAqcHduYW1lKQoreworCXNlY3VyaXR5X2NvbnRleHRfdCBzYyA9IE5VTEw7CisJY2hhciAqc2VuYW1lID0gTlVMTCwgKmx2bCA9IE5VTEw7CisJaW50IHI7CisKKyNpZmRlZiBIQVZFX0dFVFNFVVNFUkJZTkFNRQorCWlmIChnZXRzZXVzZXJieW5hbWUocHduYW1lLCAmc2VuYW1lLCAmbHZsKSAhPSAwKQorCQlyZXR1cm4gTlVMTDsKKyNlbHNlCisJc2VuYW1lID0gcHduYW1lOworCWx2bCA9IE5VTEw7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfR0VUX0RFRkFVTFRfQ09OVEVYVF9XSVRIX0xFVkVMCisJciA9IGdldF9kZWZhdWx0X2NvbnRleHRfd2l0aF9sZXZlbChzZW5hbWUsIGx2bCwgTlVMTCwgJnNjKTsKKyNlbHNlCisJciA9IGdldF9kZWZhdWx0X2NvbnRleHQoc2VuYW1lLCBOVUxMLCAmc2MpOworI2VuZGlmCisKKwlpZiAociAhPSAwKSB7CisJCXN3aXRjaCAoc2VjdXJpdHlfZ2V0ZW5mb3JjZSgpKSB7CisJCWNhc2UgLTE6CisJCQlmYXRhbCgiJXM6IHNzaF9zZWxpbnV4X2dldGN0eGJ5bmFtZTogIgorCQkJICAgICJzZWN1cml0eV9nZXRlbmZvcmNlKCkgZmFpbGVkIiwgX19mdW5jX18pOworCQljYXNlIDA6CisJCQllcnJvcigiJXM6IEZhaWxlZCB0byBnZXQgZGVmYXVsdCBTRUxpbnV4IHNlY3VyaXR5ICIKKwkJCSAgICAiY29udGV4dCBmb3IgJXMiLCBfX2Z1bmNfXywgcHduYW1lKTsKKwkJCXNjID0gTlVMTDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZmF0YWwoIiVzOiBGYWlsZWQgdG8gZ2V0IGRlZmF1bHQgU0VMaW51eCBzZWN1cml0eSAiCisJCQkgICAgImNvbnRleHQgZm9yICVzIChpbiBlbmZvcmNpbmcgbW9kZSkiLAorCQkJICAgIF9fZnVuY19fLCBwd25hbWUpOworCQl9CisJfQorCisjaWZkZWYgSEFWRV9HRVRTRVVTRVJCWU5BTUUKKwlpZiAoc2VuYW1lICE9IE5VTEwpCisJCXhmcmVlKHNlbmFtZSk7CisJaWYgKGx2bCAhPSBOVUxMKQorCQl4ZnJlZShsdmwpOworI2VuZGlmCisKKwlyZXR1cm4gc2M7Cit9CisKKy8qIFNldCB0aGUgZXhlY3V0aW9uIGNvbnRleHQgdG8gdGhlIGRlZmF1bHQgZm9yIHRoZSBzcGVjaWZpZWQgdXNlciAqLwordm9pZAorc3NoX3NlbGludXhfc2V0dXBfZXhlY19jb250ZXh0KGNoYXIgKnB3bmFtZSkKK3sKKwlzZWN1cml0eV9jb250ZXh0X3QgdXNlcl9jdHggPSBOVUxMOworCisJaWYgKCFzc2hfc2VsaW51eF9lbmFibGVkKCkpCisJCXJldHVybjsKKworCWRlYnVnMygiJXM6IHNldHRpbmcgZXhlY3V0aW9uIGNvbnRleHQiLCBfX2Z1bmNfXyk7CisKKwl1c2VyX2N0eCA9IHNzaF9zZWxpbnV4X2dldGN0eGJ5bmFtZShwd25hbWUpOworCWlmIChzZXRleGVjY29uKHVzZXJfY3R4KSAhPSAwKSB7CisJCXN3aXRjaCAoc2VjdXJpdHlfZ2V0ZW5mb3JjZSgpKSB7CisJCWNhc2UgLTE6CisJCQlmYXRhbCgiJXM6IHNlY3VyaXR5X2dldGVuZm9yY2UoKSBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCWNhc2UgMDoKKwkJCWVycm9yKCIlczogRmFpbGVkIHRvIHNldCBTRUxpbnV4IGV4ZWN1dGlvbiAiCisJCQkgICAgImNvbnRleHQgZm9yICVzIiwgX19mdW5jX18sIHB3bmFtZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZhdGFsKCIlczogRmFpbGVkIHRvIHNldCBTRUxpbnV4IGV4ZWN1dGlvbiBjb250ZXh0ICIKKwkJCSAgICAiZm9yICVzIChpbiBlbmZvcmNpbmcgbW9kZSkiLCBfX2Z1bmNfXywgcHduYW1lKTsKKwkJfQorCX0KKwlpZiAodXNlcl9jdHggIT0gTlVMTCkKKwkJZnJlZWNvbih1c2VyX2N0eCk7CisKKwlkZWJ1ZzMoIiVzOiBkb25lIiwgX19mdW5jX18pOworfQorCisvKiBTZXQgdGhlIFRUWSBjb250ZXh0IGZvciB0aGUgc3BlY2lmaWVkIHVzZXIgKi8KK3ZvaWQKK3NzaF9zZWxpbnV4X3NldHVwX3B0eShjaGFyICpwd25hbWUsIGNvbnN0IGNoYXIgKnR0eSkKK3sKKwlzZWN1cml0eV9jb250ZXh0X3QgbmV3X3R0eV9jdHggPSBOVUxMOworCXNlY3VyaXR5X2NvbnRleHRfdCB1c2VyX2N0eCA9IE5VTEw7CisJc2VjdXJpdHlfY29udGV4dF90IG9sZF90dHlfY3R4ID0gTlVMTDsKKworCWlmICghc3NoX3NlbGludXhfZW5hYmxlZCgpKQorCQlyZXR1cm47CisKKwlkZWJ1ZzMoIiVzOiBzZXR0aW5nIFRUWSBjb250ZXh0IG9uICVzIiwgX19mdW5jX18sIHR0eSk7CisKKwl1c2VyX2N0eCA9IHNzaF9zZWxpbnV4X2dldGN0eGJ5bmFtZShwd25hbWUpOworCisJLyogWFhYOiBzaG91bGQgdGhlc2UgY2FsbHMgZmF0YWwoKSB1cG9uIGZhaWx1cmUgaW4gZW5mb3JjaW5nIG1vZGU/ICovCisKKwlpZiAoZ2V0ZmlsZWNvbih0dHksICZvbGRfdHR5X2N0eCkgPT0gLTEpIHsKKwkJZXJyb3IoIiVzOiBnZXRmaWxlY29uOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoc2VjdXJpdHlfY29tcHV0ZV9yZWxhYmVsKHVzZXJfY3R4LCBvbGRfdHR5X2N0eCwKKwkgICAgU0VDQ0xBU1NfQ0hSX0ZJTEUsICZuZXdfdHR5X2N0eCkgIT0gMCkgeworCQllcnJvcigiJXM6IHNlY3VyaXR5X2NvbXB1dGVfcmVsYWJlbDogJXMiLAorCQkgICAgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChzZXRmaWxlY29uKHR0eSwgbmV3X3R0eV9jdHgpICE9IDApCisJCWVycm9yKCIlczogc2V0ZmlsZWNvbjogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKyBvdXQ6CisJaWYgKG5ld190dHlfY3R4ICE9IE5VTEwpCisJCWZyZWVjb24obmV3X3R0eV9jdHgpOworCWlmIChvbGRfdHR5X2N0eCAhPSBOVUxMKQorCQlmcmVlY29uKG9sZF90dHlfY3R4KTsKKwlpZiAodXNlcl9jdHggIT0gTlVMTCkKKwkJZnJlZWNvbih1c2VyX2N0eCk7CisJZGVidWczKCIlczogZG9uZSIsIF9fZnVuY19fKTsKK30KKwordm9pZAorc3NoX3NlbGludXhfY2hhbmdlX2NvbnRleHQoY29uc3QgY2hhciAqbmV3bmFtZSkKK3sKKwlpbnQgbGVuLCBuZXdsZW47CisJY2hhciAqb2xkY3R4LCAqbmV3Y3R4LCAqY3g7CisJdm9pZCAoKnN3aXRjaGxvZykgKGNvbnN0IGNoYXIgKmZtdCwuLi4pID0gbG9naXQ7CisKKwlpZiAoIXNzaF9zZWxpbnV4X2VuYWJsZWQoKSkKKwkJcmV0dXJuOworCisJaWYgKGdldGNvbigoc2VjdXJpdHlfY29udGV4dF90ICopJm9sZGN0eCkgPCAwKSB7CisJCWxvZ2l0KCIlczogZ2V0Y29uIGZhaWxlZCB3aXRoICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybjsKKwl9CisJaWYgKChjeCA9IGluZGV4KG9sZGN0eCwgJzonKSkgPT0gTlVMTCB8fCAoY3ggPSBpbmRleChjeCArIDEsICc6JykpID09CisJICAgIE5VTEwpIHsKKwkJbG9naXQgKCIlczogdW5wYXJzZWFibGUgY29udGV4dCAlcyIsIF9fZnVuY19fLCBvbGRjdHgpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBDaGVjayB3aGV0aGVyIHdlIGFyZSBhdHRlbXB0aW5nIHRvIHN3aXRjaCBhd2F5IGZyb20gYW4gdW5jb25maW5lZAorCSAqIHNlY3VyaXR5IGNvbnRleHQuCisJICovCisJaWYgKHN0cm5jbXAoY3gsIFNTSF9TRUxJTlVYX1VOQ09ORklORURfVFlQRSwKKwkgICAgc2l6ZW9mKFNTSF9TRUxJTlVYX1VOQ09ORklORURfVFlQRSkgLSAxKSA9PSAwKQorCQlzd2l0Y2hsb2cgPSBkZWJ1ZzM7CisKKwluZXdsZW4gPSBzdHJsZW4ob2xkY3R4KSArIHN0cmxlbihuZXduYW1lKSArIDE7CisJbmV3Y3R4ID0geG1hbGxvYyhuZXdsZW4pOworCWxlbiA9IGN4IC0gb2xkY3R4ICsgMTsKKwltZW1jcHkobmV3Y3R4LCBvbGRjdHgsIGxlbik7CisJc3RybGNweShuZXdjdHggKyBsZW4sIG5ld25hbWUsIG5ld2xlbiAtIGxlbik7CisJaWYgKChjeCA9IGluZGV4KGN4ICsgMSwgJzonKSkpCisJCXN0cmxjYXQobmV3Y3R4LCBjeCwgbmV3bGVuKTsKKwlkZWJ1ZzMoIiVzOiBzZXR0aW5nIGNvbnRleHQgZnJvbSAnJXMnIHRvICclcyciLCBfX2Z1bmNfXywKKwkgICAgb2xkY3R4LCBuZXdjdHgpOworCWlmIChzZXRjb24obmV3Y3R4KSA8IDApCisJCXN3aXRjaGxvZygiJXM6IHNldGNvbiAlcyBmcm9tICVzIGZhaWxlZCB3aXRoICVzIiwgX19mdW5jX18sCisJCSAgICBuZXdjdHgsIG9sZGN0eCwgc3RyZXJyb3IoZXJybm8pKTsKKwl4ZnJlZShvbGRjdHgpOworCXhmcmVlKG5ld2N0eCk7Cit9CisKK3ZvaWQKK3NzaF9zZWxpbnV4X3NldGZzY3JlYXRlY29uKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc2VjdXJpdHlfY29udGV4dF90IGNvbnRleHQ7CisKKwlpZiAoIXNzaF9zZWxpbnV4X2VuYWJsZWQoKSkKKwkJcmV0dXJuOworCWlmIChwYXRoID09IE5VTEwpIHsKKwkJc2V0ZnNjcmVhdGVjb24oTlVMTCk7CisJCXJldHVybjsKKwl9CisJaWYgKG1hdGNocGF0aGNvbihwYXRoLCAwNzAwLCAmY29udGV4dCkgPT0gMCkKKwkJc2V0ZnNjcmVhdGVjb24oY29udGV4dCk7Cit9CisKKyNlbmRpZiAvKiBXSVRIX1NFTElOVVggKi8KKworI2lmZGVmIExJTlVYX09PTV9BREpVU1QKKy8qCisgKiBUaGUgbWFnaWMgImRvbid0IGtpbGwgbWUiIHZhbHVlcywgb2xkIGFuZCBuZXcsIGFzIGRvY3VtZW50ZWQgaW4gZWc6CisgKiBodHRwOi8vbHhyLmxpbnV4Lm5vLyNsaW51eCt2Mi42LjMyL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKKyAqIGh0dHA6Ly9seHIubGludXgubm8vI2xpbnV4K3YyLjYuMzYvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAorICovCisKK3N0YXRpYyBpbnQgb29tX2Fkal9zYXZlID0gSU5UX01JTjsKK3N0YXRpYyBjaGFyICpvb21fYWRqX3BhdGggPSBOVUxMOworc3RydWN0IHsKKwljaGFyICpwYXRoOworCWludCB2YWx1ZTsKK30gb29tX2FkanVzdFtdID0geworCXsiL3Byb2Mvc2VsZi9vb21fc2NvcmVfYWRqIiwgLTEwMDB9LAkvKiBrZXJuZWxzID49IDIuNi4zNiAqLworCXsiL3Byb2Mvc2VsZi9vb21fYWRqIiwgLTE3fSwJCS8qIGtlcm5lbHMgPD0gMi42LjM1ICovCisJe05VTEwsIDB9LAorfTsKKworLyoKKyAqIFRlbGwgdGhlIGtlcm5lbCdzIG91dC1vZi1tZW1vcnkga2lsbGVyIHRvIGF2b2lkIHNzaGQuCisgKiBSZXR1cm5zIHRoZSBwcmV2aW91cyBvb21fYWRqIHZhbHVlIG9yIHplcm8uCisgKi8KK3ZvaWQKK29vbV9hZGp1c3Rfc2V0dXAodm9pZCkKK3sKKwlpbnQgaSwgdmFsdWU7CisJRklMRSAqZnA7CisKKwlkZWJ1ZzMoIiVzIiwgX19mdW5jX18pOworCSBmb3IgKGkgPSAwOyBvb21fYWRqdXN0W2ldLnBhdGggIT0gTlVMTDsgaSsrKSB7CisJCW9vbV9hZGpfcGF0aCA9IG9vbV9hZGp1c3RbaV0ucGF0aDsKKwkJdmFsdWUgPSBvb21fYWRqdXN0W2ldLnZhbHVlOworCQlpZiAoKGZwID0gZm9wZW4ob29tX2Fkal9wYXRoLCAicisiKSkgIT0gTlVMTCkgeworCQkJaWYgKGZzY2FuZihmcCwgIiVkIiwgJm9vbV9hZGpfc2F2ZSkgIT0gMSkKKwkJCQl2ZXJib3NlKCJlcnJvciByZWFkaW5nICVzOiAlcyIsIG9vbV9hZGpfcGF0aCwKKwkJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWVsc2UgeworCQkJCXJld2luZChmcCk7CisJCQkJaWYgKGZwcmludGYoZnAsICIlZFxuIiwgdmFsdWUpIDw9IDApCisJCQkJCXZlcmJvc2UoImVycm9yIHdyaXRpbmcgJXM6ICVzIiwKKwkJCQkJICAgb29tX2Fkal9wYXRoLCBzdHJlcnJvcihlcnJubykpOworCQkJCWVsc2UKKwkJCQkJdmVyYm9zZSgiU2V0ICVzIGZyb20gJWQgdG8gJWQiLAorCQkJCQkgICBvb21fYWRqX3BhdGgsIG9vbV9hZGpfc2F2ZSwgdmFsdWUpOworCQkJfQorCQkJZmNsb3NlKGZwKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlvb21fYWRqX3BhdGggPSBOVUxMOworfQorCisvKiBSZXN0b3JlIHRoZSBzYXZlZCBPT00gYWRqdXN0bWVudCAqLwordm9pZAorb29tX2FkanVzdF9yZXN0b3JlKHZvaWQpCit7CisJRklMRSAqZnA7CisKKwlkZWJ1ZzMoIiVzIiwgX19mdW5jX18pOworCWlmIChvb21fYWRqX3NhdmUgPT0gSU5UX01JTiB8fCBvb21fYWRqX3BhdGggPT0gTlVMTCB8fAorCSAgICAoZnAgPSBmb3Blbihvb21fYWRqX3BhdGgsICJ3IikpID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChmcHJpbnRmKGZwLCAiJWRcbiIsIG9vbV9hZGpfc2F2ZSkgPD0gMCkKKwkJdmVyYm9zZSgiZXJyb3Igd3JpdGluZyAlczogJXMiLCBvb21fYWRqX3BhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJZWxzZQorCQl2ZXJib3NlKCJTZXQgJXMgdG8gJWQiLCBvb21fYWRqX3BhdGgsIG9vbV9hZGpfc2F2ZSk7CisKKwlmY2xvc2UoZnApOworCXJldHVybjsKK30KKyNlbmRpZiAvKiBMSU5VWF9PT01fQURKVVNUICovCisjZW5kaWYgLyogV0lUSF9TRUxJTlVYIHx8IExJTlVYX09PTV9BREpVU1QgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcG9ydC1saW51eC5oIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9wb3J0LWxpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNkMTAwNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcG9ydC1saW51eC5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qICRJZDogcG9ydC1saW51eC5oLHYgMS41IDIwMTEvMDEvMjUgMDE6MTY6MTggZGptIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgRGFtaWVuIE1pbGxlciA8ZGptQG9wZW5ic2Qub3JnPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX1BPUlRfTElOVVhfSAorI2RlZmluZSBfUE9SVF9MSU5VWF9ICisKKyNpZmRlZiBXSVRIX1NFTElOVVgKK2ludCBzc2hfc2VsaW51eF9lbmFibGVkKHZvaWQpOwordm9pZCBzc2hfc2VsaW51eF9zZXR1cF9wdHkoY2hhciAqLCBjb25zdCBjaGFyICopOwordm9pZCBzc2hfc2VsaW51eF9zZXR1cF9leGVjX2NvbnRleHQoY2hhciAqKTsKK3ZvaWQgc3NoX3NlbGludXhfY2hhbmdlX2NvbnRleHQoY29uc3QgY2hhciAqKTsKK3ZvaWQgc3NoX3NlbGludXhfc2V0ZnNjcmVhdGVjb24oY29uc3QgY2hhciAqKTsKKyNlbmRpZgorCisjaWZkZWYgTElOVVhfT09NX0FESlVTVAordm9pZCBvb21fYWRqdXN0X3Jlc3RvcmUodm9pZCk7Cit2b2lkIG9vbV9hZGp1c3Rfc2V0dXAodm9pZCk7CisjZW5kaWYKKworI2VuZGlmIC8qICEgX1BPUlRfTElOVVhfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9wb3J0LXNvbGFyaXMuYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcG9ydC1zb2xhcmlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzODJmMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcG9ydC1zb2xhcmlzLmMKQEAgLTAsMCArMSwyMjkgQEAKKy8qICRJZDogcG9ydC1zb2xhcmlzLmMsdiAxLjQgMjAxMC8xMS8wNSAwMTowMzowNSBkdHVja2VyIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgQ2hhZCBNeW5oaWVyLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaWZkZWYgVVNFX1NPTEFSSVNfUFJPQ0VTU19DT05UUkFDVFMKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2lmZGVmIEhBVkVfRkNOVExfSAorIyBpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxsaWJjb250cmFjdC5oPgorI2luY2x1ZGUgPHN5cy9jb250cmFjdC9wcm9jZXNzLmg+CisjaW5jbHVkZSA8c3lzL2N0ZnMuaD4KKworI2luY2x1ZGUgImxvZy5oIgorCisjZGVmaW5lIENUX1RFTVBMQVRFCUNURlNfUk9PVCAiL3Byb2Nlc3MvdGVtcGxhdGUiCisjZGVmaW5lIENUX0xBVEVTVAlDVEZTX1JPT1QgIi9wcm9jZXNzL2xhdGVzdCIKKworc3RhdGljIGludCB0bXBsX2ZkID0gLTE7CisKKy8qIExvb2t1cCB0aGUgbGF0ZXN0IHByb2Nlc3MgY29udHJhY3QgKi8KK3N0YXRpYyBjdGlkX3QKK2dldF9hY3RpdmVfcHJvY2Vzc19jb250cmFjdF9pZCh2b2lkKQoreworCWludCBzdGF0X2ZkOworCWN0aWRfdCBjdGlkID0gLTE7CisJY3Rfc3RhdGhkbF90IHN0YXRoZGw7CisKKwlpZiAoKHN0YXRfZmQgPSBvcGVuNjQoQ1RfTEFURVNULCBPX1JET05MWSkpID09IC0xKSB7CisJCWVycm9yKCIlczogRXJyb3Igb3BlbmluZyAnbGF0ZXN0JyBwcm9jZXNzICIKKwkJICAgICJjb250cmFjdDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoY3Rfc3RhdHVzX3JlYWQoc3RhdF9mZCwgQ1REX0NPTU1PTiwgJnN0YXRoZGwpICE9IDApIHsKKwkJZXJyb3IoIiVzOiBFcnJvciByZWFkaW5nIHByb2Nlc3MgY29udHJhY3QgIgorCQkgICAgInN0YXR1czogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBvdXQ7CisJfQorCWlmICgoY3RpZCA9IGN0X3N0YXR1c19nZXRfaWQoc3RhdGhkbCkpIDwgMCkgeworCQllcnJvcigiJXM6IEVycm9yIGdldHRpbmcgcHJvY2VzcyBjb250cmFjdCBpZDogJXMiLAorCQkgICAgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gb3V0OworCX0KKworCWN0X3N0YXR1c19mcmVlKHN0YXRoZGwpOworIG91dDoKKwljbG9zZShzdGF0X2ZkKTsKKwlyZXR1cm4gY3RpZDsKK30KKwordm9pZAorc29sYXJpc19jb250cmFjdF9wcmVfZm9yayh2b2lkKQoreworCWlmICgodG1wbF9mZCA9IG9wZW42NChDVF9URU1QTEFURSwgT19SRFdSKSkgPT0gLTEpIHsKKwkJZXJyb3IoIiVzOiBvcGVuICVzOiAlcyIsIF9fZnVuY19fLAorCQkgICAgQ1RfVEVNUExBVEUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybjsKKwl9CisKKwlkZWJ1ZzIoIiVzOiBzZXR0aW5nIHVwIHByb2Nlc3MgY29udHJhY3QgdGVtcGxhdGUgb24gZmQgJWQiLAorCSAgICBfX2Z1bmNfXywgdG1wbF9mZCk7CisKKwkvKiBGaXJzdCB3ZSBzZXQgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgYW5kIGV2ZW50IHNldHMuICovCisJaWYgKGN0X3ByX3RtcGxfc2V0X3BhcmFtKHRtcGxfZmQsIENUX1BSX1BHUlBPTkxZKSAhPSAwKSB7CisJCWVycm9yKCIlczogRXJyb3Igc2V0dGluZyBwcm9jZXNzIGNvbnRyYWN0IHBhcmFtZXRlciBzZXQgIgorCQkgICAgIihwZ3Jwb25seSk6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKGN0X3ByX3RtcGxfc2V0X2ZhdGFsKHRtcGxfZmQsIENUX1BSX0VWX0hXRVJSKSAhPSAwKSB7CisJCWVycm9yKCIlczogRXJyb3Igc2V0dGluZyBwcm9jZXNzIGNvbnRyYWN0IHRlbXBsYXRlICIKKwkJICAgICJmYXRhbCBldmVudHM6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKGN0X3RtcGxfc2V0X2NyaXRpY2FsKHRtcGxfZmQsIDApICE9IDApIHsKKwkJZXJyb3IoIiVzOiBFcnJvciBzZXR0aW5nIHByb2Nlc3MgY29udHJhY3QgdGVtcGxhdGUgIgorCQkgICAgImNyaXRpY2FsIGV2ZW50czogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAoY3RfdG1wbF9zZXRfaW5mb3JtYXRpdmUodG1wbF9mZCwgQ1RfUFJfRVZfSFdFUlIpICE9IDApIHsKKwkJZXJyb3IoIiVzOiBFcnJvciBzZXR0aW5nIHByb2Nlc3MgY29udHJhY3QgdGVtcGxhdGUgIgorCQkgICAgImluZm9ybWF0aXZlIGV2ZW50czogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIE5vdyBtYWtlIHRoaXMgdGhlIGFjdGl2ZSB0ZW1wbGF0ZSBmb3IgdGhpcyBwcm9jZXNzLiAqLworCWlmIChjdF90bXBsX2FjdGl2YXRlKHRtcGxfZmQpICE9IDApIHsKKwkJZXJyb3IoIiVzOiBFcnJvciBhY3RpdmF0aW5nIHByb2Nlc3MgY29udHJhY3QgIgorCQkgICAgInRlbXBsYXRlOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIGZhaWw7CisJfQorCXJldHVybjsKKworIGZhaWw6CisJaWYgKHRtcGxfZmQgIT0gLTEpIHsKKwkJY2xvc2UodG1wbF9mZCk7CisJCXRtcGxfZmQgPSAtMTsKKwl9Cit9CisKK3ZvaWQKK3NvbGFyaXNfY29udHJhY3RfcG9zdF9mb3JrX2NoaWxkKCkKK3sKKwlkZWJ1ZzIoIiVzOiBjbGVhcmluZyBwcm9jZXNzIGNvbnRyYWN0IHRlbXBsYXRlIG9uIGZkICVkIiwKKwkgICAgX19mdW5jX18sIHRtcGxfZmQpOworCisJLyogQ2xlYXIgdGhlIGFjdGl2ZSB0ZW1wbGF0ZS4gKi8KKwlpZiAoY3RfdG1wbF9jbGVhcih0bXBsX2ZkKSAhPSAwKQorCQllcnJvcigiJXM6IEVycm9yIGNsZWFyaW5nIGFjdGl2ZSBwcm9jZXNzIGNvbnRyYWN0ICIKKwkJICAgICJ0ZW1wbGF0ZTogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKworCWNsb3NlKHRtcGxfZmQpOworCXRtcGxfZmQgPSAtMTsKK30KKwordm9pZAorc29sYXJpc19jb250cmFjdF9wb3N0X2ZvcmtfcGFyZW50KHBpZF90IHBpZCkKK3sKKwljdGlkX3QgY3RpZDsKKwljaGFyIGN0bF9wYXRoWzI1Nl07CisJaW50IHIsIGN0bF9mZCA9IC0xLCBzdGF0X2ZkID0gLTE7CisKKwlkZWJ1ZzIoIiVzOiBjbGVhcmluZyB0ZW1wbGF0ZSAoZmQgJWQpIiwgX19mdW5jX18sIHRtcGxfZmQpOworCisJaWYgKHRtcGxfZmQgPT0gLTEpCisJCXJldHVybjsKKworCS8qIEZpcnN0IGNsZWFyIHRoZSBhY3RpdmUgdGVtcGxhdGUuICovCisJaWYgKChyID0gY3RfdG1wbF9jbGVhcih0bXBsX2ZkKSkgIT0gMCkKKwkJZXJyb3IoIiVzOiBFcnJvciBjbGVhcmluZyBhY3RpdmUgcHJvY2VzcyBjb250cmFjdCAiCisJCSAgICAidGVtcGxhdGU6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisKKwljbG9zZSh0bXBsX2ZkKTsKKwl0bXBsX2ZkID0gLTE7CisKKwkvKgorCSAqIElmIGVpdGhlciB0aGUgZm9yayBkaWRuJ3Qgc3VjY2VlZCAocGlkIDwgMCksIG9yIGNsZWFyaW5nCisJICogdGggYWN0aXZlIGNvbnRyYWN0IGZhaWxlZCAociAhPSAwKSwgdGhlbiB3ZSBoYXZlIG5vdGhpbmcKKwkgKiBtb3JlIGRvLgorCSAqLworCWlmIChyICE9IDAgfHwgcGlkIDw9IDApCisJCXJldHVybjsKKworCS8qIE5vdyBsb29rdXAgYW5kIGFiYW5kb24gdGhlIGNvbnRyYWN0IHdlJ3ZlIGNyZWF0ZWQuICovCisJY3RpZCA9IGdldF9hY3RpdmVfcHJvY2Vzc19jb250cmFjdF9pZCgpOworCisJZGVidWcyKCIlczogYWJhbmRvbmluZyBjb250cmFjdCBpZCAlbGQiLCBfX2Z1bmNfXywgY3RpZCk7CisKKwlzbnByaW50ZihjdGxfcGF0aCwgc2l6ZW9mKGN0bF9wYXRoKSwKKwkgICAgQ1RGU19ST09UICIvcHJvY2Vzcy8lbGQvY3RsIiwgY3RpZCk7CisJaWYgKChjdGxfZmQgPSBvcGVuNjQoY3RsX3BhdGgsIE9fV1JPTkxZKSkgPCAwKSB7CisJCWVycm9yKCIlczogRXJyb3Igb3BlbmluZyBwcm9jZXNzIGNvbnRyYWN0ICIKKwkJICAgICJjdGwgZmlsZTogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAoY3RfY3RsX2FiYW5kb24oY3RsX2ZkKSA8IDApIHsKKwkJZXJyb3IoIiVzOiBFcnJvciBhYmFuZG9uaW5nIHByb2Nlc3MgY29udHJhY3Q6ICVzIiwKKwkJICAgIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIGZhaWw7CisJfQorCWNsb3NlKGN0bF9mZCk7CisJcmV0dXJuOworCisgZmFpbDoKKwlpZiAodG1wbF9mZCAhPSAtMSkgeworCQljbG9zZSh0bXBsX2ZkKTsKKwkJdG1wbF9mZCA9IC0xOworCX0KKwlpZiAoc3RhdF9mZCAhPSAtMSkKKwkJY2xvc2Uoc3RhdF9mZCk7CisJaWYgKGN0bF9mZCAhPSAtMSkKKwkJY2xvc2UoY3RsX2ZkKTsKK30KKyNlbmRpZgorCisjaWZkZWYgVVNFX1NPTEFSSVNfUFJPSkVDVFMKKyNpbmNsdWRlIDxzeXMvdGFzay5oPgorI2luY2x1ZGUgPHByb2plY3QuaD4KKworLyoKKyAqIEdldC9zZXQgc29sYXJpcyBkZWZhdWx0IHByb2plY3QuCisgKiBJZiB3ZSBmYWlsLCBqdXN0IHJ1biBhbG9uZyBncmFjZWZ1bGx5LgorICovCit2b2lkCitzb2xhcmlzX3NldF9kZWZhdWx0X3Byb2plY3Qoc3RydWN0IHBhc3N3ZCAqcHcpCit7CisJc3RydWN0IHByb2plY3QgICpkZWZhdWx0cHJvamVjdDsKKwlzdHJ1Y3QgcHJvamVjdCAgIHRlbXBwcm9qZWN0OworCWNoYXIgYnVmWzEwMjRdOworCisJLyogZ2V0IGRlZmF1bHQgcHJvamVjdCwgaWYgd2UgZmFpbCBqdXN0IHJldHVybiBncmFjZWZ1bGx5ICAqLworCWlmICgoZGVmYXVsdHByb2plY3QgPSBnZXRkZWZhdWx0cHJvaihwdy0+cHdfbmFtZSwgJnRlbXBwcm9qZWN0LCAmYnVmLAorCSAgICBzaXplb2YoYnVmKSkpID4gMCkgeworCQkvKiBzZXQgZGVmYXVsdCBwcm9qZWN0ICovCisJCWlmIChzZXRwcm9qZWN0KGRlZmF1bHRwcm9qZWN0LT5wal9uYW1lLCBwdy0+cHdfbmFtZSwKKwkJICAgIFRBU0tfTk9STUFMKSAhPSAwKQorCQkJZGVidWcoInNldHByb2plY3QoJXMpOiAlcyIsIGRlZmF1bHRwcm9qZWN0LT5wal9uYW1lLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJfSBlbHNlIHsKKwkJLyogZGVidWcgb24gZ2V0ZGVmYXVsdHByb2ooKSBlcnJvciAqLworCQlkZWJ1ZygiZ2V0ZGVmYXVsdHByb2ooJXMpOiAlcyIsIHB3LT5wd19uYW1lLCBzdHJlcnJvcihlcnJubykpOworCX0KK30KKyNlbmRpZiAvKiBVU0VfU09MQVJJU19QUk9KRUNUUyAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9wb3J0LXNvbGFyaXMuaCBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcG9ydC1zb2xhcmlzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0NDJlNwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcG9ydC1zb2xhcmlzLmgKQEAgLTAsMCArMSwzMCBAQAorLyogJElkOiBwb3J0LXNvbGFyaXMuaCx2IDEuMiAyMDEwLzExLzA1IDAxOjAzOjA1IGR0dWNrZXIgRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBDaGFkIE15bmhpZXIuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfUE9SVF9TT0xBUklTX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8cHdkLmg+CisKK3ZvaWQgc29sYXJpc19jb250cmFjdF9wcmVfZm9yayh2b2lkKTsKK3ZvaWQgc29sYXJpc19jb250cmFjdF9wb3N0X2ZvcmtfY2hpbGQodm9pZCk7Cit2b2lkIHNvbGFyaXNfY29udHJhY3RfcG9zdF9mb3JrX3BhcmVudChwaWRfdCBwaWQpOwordm9pZCBzb2xhcmlzX3NldF9kZWZhdWx0X3Byb2plY3Qoc3RydWN0IHBhc3N3ZCAqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3BvcnQtdHVuLmMgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3BvcnQtdHVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ3NTZmNwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcG9ydC10dW4uYwpAQCAtMCwwICsxLDI3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBSZXlrIEZsb2V0ZXIgPHJleWtAb3BlbmJzZC5vcmc+CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9zeXMtcXVldWUuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAiY2hhbm5lbHMuaCIKKworLyoKKyAqIFRoaXMgaXMgdGhlIHBvcnRhYmxlIHZlcnNpb24gb2YgdGhlIFNTSCB0dW5uZWwgZm9yd2FyZGluZywgaXQKKyAqIHVzZXMgc29tZSBwcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgZm9yIHZhcmlvdXMgcGxhdGZvcm0tc3BlY2lmaWMKKyAqIHNldHRpbmdzLgorICoKKyAqIFNTSF9UVU5fTElOVVgJVXNlIHRoZSAobmV3ZXIpIExpbnV4IHR1bi90YXAgZGV2aWNlCisgKiBTU0hfVFVOX0ZSRUVCU0QJVXNlIHRoZSBGcmVlQlNEIHR1bi90YXAgZGV2aWNlCisgKiBTU0hfVFVOX0NPTVBBVF9BRglUcmFuc2xhdGUgdGhlIE9wZW5CU0QgYWRkcmVzcyBmYW1pbHkKKyAqIFNTSF9UVU5fUFJFUEVORF9BRglQcmVwZW5kL3JlbW92ZSB0aGUgYWRkcmVzcyBmYW1pbHkKKyAqLworCisvKgorICogU3lzdGVtLXNwZWNpZmljIHR1bm5lbCBvcGVuIGZ1bmN0aW9uCisgKi8KKworI2lmIGRlZmluZWQoU1NIX1RVTl9MSU5VWCkKKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3R1bi5oPgorCitpbnQKK3N5c190dW5fb3BlbihpbnQgdHVuLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCBmZCA9IC0xOworCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworCisJaWYgKChmZCA9IG9wZW4oIi9kZXYvbmV0L3R1biIsIE9fUkRXUikpID09IC0xKSB7CisJCWRlYnVnKCIlczogZmFpbGVkIHRvIG9wZW4gdHVubmVsIGNvbnRyb2wgaW50ZXJmYWNlOiAlcyIsCisJCSAgICBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJYnplcm8oJmlmciwgc2l6ZW9mKGlmcikpOwkKKworCWlmIChtb2RlID09IFNTSF9UVU5NT0RFX0VUSEVSTkVUKSB7CisJCWlmci5pZnJfZmxhZ3MgPSBJRkZfVEFQOworCQluYW1lID0gInRhcCVkIjsKKwl9IGVsc2UgeworCQlpZnIuaWZyX2ZsYWdzID0gSUZGX1RVTjsKKwkJbmFtZSA9ICJ0dW4lZCI7CisJfQorCWlmci5pZnJfZmxhZ3MgfD0gSUZGX05PX1BJOworCisJaWYgKHR1biAhPSBTU0hfVFVOSURfQU5ZKSB7CisJCWlmICh0dW4gPiBTU0hfVFVOSURfTUFYKSB7CisJCQlkZWJ1ZygiJXM6IGludmFsaWQgdHVubmVsIGlkICV4OiAlcyIsIF9fZnVuY19fLAorCQkJICAgIHR1biwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisJCXNucHJpbnRmKGlmci5pZnJfbmFtZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSksIG5hbWUsIHR1bik7CisJfQorCisJaWYgKGlvY3RsKGZkLCBUVU5TRVRJRkYsICZpZnIpID09IC0xKSB7CisJCWRlYnVnKCIlczogZmFpbGVkIHRvIGNvbmZpZ3VyZSB0dW5uZWwgKG1vZGUgJWQpOiAlcyIsIF9fZnVuY19fLAorCQkgICAgbW9kZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJaWYgKHR1biA9PSBTU0hfVFVOSURfQU5ZKQorCQlkZWJ1ZygiJXM6IHR1bm5lbCBtb2RlICVkIGZkICVkIiwgX19mdW5jX18sIG1vZGUsIGZkKTsKKwllbHNlCisJCWRlYnVnKCIlczogJXMgbW9kZSAlZCBmZCAlZCIsIF9fZnVuY19fLCBpZnIuaWZyX25hbWUsIG1vZGUsIGZkKTsKKworCXJldHVybiAoZmQpOworCisgZmFpbGVkOgorCWNsb3NlKGZkKTsKKwlyZXR1cm4gKC0xKTsKK30KKyNlbmRpZiAvKiBTU0hfVFVOX0xJTlVYICovCisKKyNpZmRlZiBTU0hfVFVOX0ZSRUVCU0QKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisKKyNpZmRlZiBIQVZFX05FVF9JRl9UVU5fSAorI2luY2x1ZGUgPG5ldC9pZl90dW4uaD4KKyNlbmRpZgorCitpbnQKK3N5c190dW5fb3BlbihpbnQgdHVuLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWNoYXIgbmFtZVsxMDBdOworCWludCBmZCA9IC0xLCBzb2NrLCBmbGFnOworCWNvbnN0IGNoYXIgKnR1bmJhc2UgPSAidHVuIjsKKworCWlmIChtb2RlID09IFNTSF9UVU5NT0RFX0VUSEVSTkVUKSB7CisjaWZkZWYgU1NIX1RVTl9OT19MMgorCQlkZWJ1ZygiJXM6IG5vIGxheWVyIDIgdHVubmVsbGluZyBzdXBwb3J0IiwgX19mdW5jX18pOworCQlyZXR1cm4gKC0xKTsKKyNlbHNlCisJCXR1bmJhc2UgPSAidGFwIjsKKyNlbmRpZgorCX0KKworCS8qIE9wZW4gdGhlIHR1bm5lbCBkZXZpY2UgKi8KKwlpZiAodHVuIDw9IFNTSF9UVU5JRF9NQVgpIHsKKwkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiL2Rldi8lcyVkIiwgdHVuYmFzZSwgdHVuKTsKKwkJZmQgPSBvcGVuKG5hbWUsIE9fUkRXUik7CisJfSBlbHNlIGlmICh0dW4gPT0gU1NIX1RVTklEX0FOWSkgeworCQlmb3IgKHR1biA9IDEwMDsgdHVuID49IDA7IHR1bi0tKSB7CisJCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIvZGV2LyVzJWQiLAorCQkJICAgIHR1bmJhc2UsIHR1bik7CisJCQlpZiAoKGZkID0gb3BlbihuYW1lLCBPX1JEV1IpKSA+PSAwKQorCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJZGVidWcoIiVzOiBpbnZhbGlkIHR1bm5lbCAldVxuIiwgX19mdW5jX18sIHR1bik7CisJCXJldHVybiAoLTEpOworCX0KKworCWlmIChmZCA8IDApIHsKKwkJZGVidWcoIiVzOiAlcyBvcGVuIGZhaWxlZDogJXMiLCBfX2Z1bmNfXywgbmFtZSwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoLTEpOworCX0KKworCS8qIFR1cm4gb24gdHVubmVsIGhlYWRlcnMgKi8KKwlmbGFnID0gMTsKKyNpZiBkZWZpbmVkKFRVTlNJRkhFQUQpICYmICFkZWZpbmVkKFNTSF9UVU5fUFJFUEVORF9BRikKKwlpZiAobW9kZSAhPSBTU0hfVFVOTU9ERV9FVEhFUk5FVCAmJgorCSAgICBpb2N0bChmZCwgVFVOU0lGSEVBRCwgJmZsYWcpID09IC0xKSB7CisJCWRlYnVnKCIlczogaW9jdGwoJWQsIFRVTlNJRkhFQUQsIDEpOiAlcyIsIF9fZnVuY19fLCBmZCwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKGZkKTsKKwl9CisjZW5kaWYKKworCWRlYnVnKCIlczogJXMgbW9kZSAlZCBmZCAlZCIsIF9fZnVuY19fLCBuYW1lLCBtb2RlLCBmZCk7CisKKwkvKiBTZXQgdGhlIHR1bm5lbCBkZXZpY2Ugb3BlcmF0aW9uIG1vZGUgKi8KKwlzbnByaW50ZihpZnIuaWZyX25hbWUsIHNpemVvZihpZnIuaWZyX25hbWUpLCAiJXMlZCIsIHR1bmJhc2UsIHR1bik7CisJaWYgKChzb2NrID0gc29ja2V0KFBGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKSkgPT0gLTEpCisJCWdvdG8gZmFpbGVkOworCisJaWYgKGlvY3RsKHNvY2ssIFNJT0NHSUZGTEFHUywgJmlmcikgPT0gLTEpCisJCWdvdG8gZmFpbGVkOworCWlmICgoaWZyLmlmcl9mbGFncyAmIElGRl9VUCkgPT0gMCkgeworCQlpZnIuaWZyX2ZsYWdzIHw9IElGRl9VUDsKKwkJaWYgKGlvY3RsKHNvY2ssIFNJT0NTSUZGTEFHUywgJmlmcikgPT0gLTEpCisJCQlnb3RvIGZhaWxlZDsKKwl9CisKKwljbG9zZShzb2NrKTsKKwlyZXR1cm4gKGZkKTsKKworIGZhaWxlZDoKKwlpZiAoZmQgPj0gMCkKKwkJY2xvc2UoZmQpOworCWlmIChzb2NrID49IDApCisJCWNsb3NlKHNvY2spOworCWRlYnVnKCIlczogZmFpbGVkIHRvIHNldCAlcyBtb2RlICVkOiAlcyIsIF9fZnVuY19fLCBuYW1lLAorCSAgICBtb2RlLCBzdHJlcnJvcihlcnJubykpOworCXJldHVybiAoLTEpOworfQorI2VuZGlmIC8qIFNTSF9UVU5fRlJFRUJTRCAqLworCisvKgorICogU3lzdGVtLXNwZWNpZmljIGNoYW5uZWwgZmlsdGVycworICovCisKKyNpZiBkZWZpbmVkKFNTSF9UVU5fRklMVEVSKQorI2RlZmluZSBPUEVOQlNEX0FGX0lORVQJCTIKKyNkZWZpbmUgT1BFTkJTRF9BRl9JTkVUNgkyNAorCitpbnQKK3N5c190dW5faW5maWx0ZXIoc3RydWN0IENoYW5uZWwgKmMsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKyNpZiBkZWZpbmVkKFNTSF9UVU5fUFJFUEVORF9BRikKKwljaGFyIHJidWZbQ0hBTl9SQlVGXTsKKwlzdHJ1Y3QgaXAgKmlwaDsKKyNlbmRpZgorCXVfaW50MzJfdCAqYWY7CisJY2hhciAqcHRyID0gYnVmOworCisjaWYgZGVmaW5lZChTU0hfVFVOX1BSRVBFTkRfQUYpCisJaWYgKGxlbiA8PSAwIHx8IGxlbiA+IChpbnQpKHNpemVvZihyYnVmKSAtIHNpemVvZigqYWYpKSkKKwkJcmV0dXJuICgtMSk7CisJcHRyID0gKGNoYXIgKikmcmJ1ZlswXTsKKwliY29weShidWYsIHB0ciArIHNpemVvZih1X2ludDMyX3QpLCBsZW4pOworCWxlbiArPSBzaXplb2YodV9pbnQzMl90KTsKKwlhZiA9ICh1X2ludDMyX3QgKilwdHI7CisKKwlpcGggPSAoc3RydWN0IGlwICopKHB0ciArIHNpemVvZih1X2ludDMyX3QpKTsKKwlzd2l0Y2ggKGlwaC0+aXBfdikgeworCWNhc2UgNjoKKwkJKmFmID0gQUZfSU5FVDY7CisJCWJyZWFrOworCWNhc2UgNDoKKwlkZWZhdWx0OgorCQkqYWYgPSBBRl9JTkVUOworCQlicmVhazsKKwl9CisjZW5kaWYKKworI2lmIGRlZmluZWQoU1NIX1RVTl9DT01QQVRfQUYpCisJaWYgKGxlbiA8IChpbnQpc2l6ZW9mKHVfaW50MzJfdCkpCisJCXJldHVybiAoLTEpOworCisJYWYgPSAodV9pbnQzMl90ICopcHRyOworCWlmICgqYWYgPT0gaHRvbmwoQUZfSU5FVDYpKQorCQkqYWYgPSBodG9ubChPUEVOQlNEX0FGX0lORVQ2KTsKKwllbHNlCisJCSphZiA9IGh0b25sKE9QRU5CU0RfQUZfSU5FVCk7CisjZW5kaWYKKworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZjLT5pbnB1dCwgcHRyLCBsZW4pOworCXJldHVybiAoMCk7Cit9CisKK3VfY2hhciAqCitzeXNfdHVuX291dGZpbHRlcihzdHJ1Y3QgQ2hhbm5lbCAqYywgdV9jaGFyICoqZGF0YSwgdV9pbnQgKmRsZW4pCit7CisJdV9jaGFyICpidWY7CisJdV9pbnQzMl90ICphZjsKKworCSpkYXRhID0gYnVmZmVyX2dldF9zdHJpbmcoJmMtPm91dHB1dCwgZGxlbik7CisJaWYgKCpkbGVuIDwgc2l6ZW9mKCphZikpCisJCXJldHVybiAoTlVMTCk7CisJYnVmID0gKmRhdGE7CisKKyNpZiBkZWZpbmVkKFNTSF9UVU5fUFJFUEVORF9BRikKKwkqZGxlbiAtPSBzaXplb2YodV9pbnQzMl90KTsKKwlidWYgPSAqZGF0YSArIHNpemVvZih1X2ludDMyX3QpOworI2VsaWYgZGVmaW5lZChTU0hfVFVOX0NPTVBBVF9BRikKKwlhZiA9IG50b2hsKCoodV9pbnQzMl90ICopYnVmKTsKKwlpZiAoKmFmID09IE9QRU5CU0RfQUZfSU5FVDYpCisJCSphZiA9IGh0b25sKEFGX0lORVQ2KTsKKwllbHNlCisJCSphZiA9IGh0b25sKEFGX0lORVQpOworI2VuZGlmCisKKwlyZXR1cm4gKGJ1Zik7Cit9CisjZW5kaWYgLyogU1NIX1RVTl9GSUxURVIgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcG9ydC10dW4uaCBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcG9ydC10dW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTNkZjAxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9wb3J0LXR1bi5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgUmV5ayBGbG9ldGVyIDxyZXlrQG9wZW5ic2Qub3JnPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX1BPUlRfVFVOX0gKKyNkZWZpbmUgX1BPUlRfVFVOX0gKKworc3RydWN0IENoYW5uZWw7CisKKyNpZiBkZWZpbmVkKFNTSF9UVU5fTElOVVgpIHx8IGRlZmluZWQoU1NIX1RVTl9GUkVFQlNEKQorIyBkZWZpbmUgQ1VTVE9NX1NZU19UVU5fT1BFTgoraW50CSAgc3lzX3R1bl9vcGVuKGludCwgaW50KTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTU0hfVFVOX0NPTVBBVF9BRikgfHwgZGVmaW5lZChTU0hfVFVOX1BSRVBFTkRfQUYpCisjIGRlZmluZSBTU0hfVFVOX0ZJTFRFUgoraW50CSBzeXNfdHVuX2luZmlsdGVyKHN0cnVjdCBDaGFubmVsICosIGNoYXIgKiwgaW50KTsKK3VfY2hhcgkqc3lzX3R1bl9vdXRmaWx0ZXIoc3RydWN0IENoYW5uZWwgKiwgdV9jaGFyICoqLCB1X2ludCAqKTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcG9ydC11dy5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9wb3J0LXV3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFmYmZhMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcG9ydC11dy5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBTQ08gR3JvdXAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGltIFJpY2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaWYgZGVmaW5lZChIQVZFX0xJQklBRikgICYmICAhZGVmaW5lZChIQVZFX1NFQ1VSRVdBUkUpCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9DUllQVF9ICisjIGluY2x1ZGUgPGNyeXB0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgInBhY2tldC5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgImF1dGgtb3B0aW9ucy5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInNlcnZjb25mLmgiCisjaW5jbHVkZSAiaG9zdGZpbGUuaCIKKyNpbmNsdWRlICJhdXRoLmgiCisjaW5jbHVkZSAic3NoLmgiCisKK2ludCBuaXNjaGVjayhjaGFyICopOworCitpbnQKK3N5c19hdXRoX3Bhc3N3ZChBdXRoY3R4dCAqYXV0aGN0eHQsIGNvbnN0IGNoYXIgKnBhc3N3b3JkKQoreworCXN0cnVjdCBwYXNzd2QgKnB3ID0gYXV0aGN0eHQtPnB3OworCWNoYXIgKnNhbHQ7CisJaW50IHJlc3VsdDsKKworCS8qIEp1c3QgdXNlIHRoZSBzdXBwbGllZCBmYWtlIHBhc3N3b3JkIGlmIGF1dGhjdHh0IGlzIGludmFsaWQgKi8KKwljaGFyICpwd19wYXNzd29yZCA9IGF1dGhjdHh0LT52YWxpZCA/IHNoYWRvd19wdyhwdykgOiBwdy0+cHdfcGFzc3dkOworCisJLyogQ2hlY2sgZm9yIHVzZXJzIHdpdGggbm8gcGFzc3dvcmQuICovCisJaWYgKHN0cmNtcChwd19wYXNzd29yZCwgIiIpID09IDAgJiYgc3RyY21wKHBhc3N3b3JkLCAiIikgPT0gMCkKKwkJcmV0dXJuICgxKTsKKworCS8qIEVuY3J5cHQgdGhlIGNhbmRpZGF0ZSBwYXNzd29yZCB1c2luZyB0aGUgcHJvcGVyIHNhbHQuICovCisJc2FsdCA9IChwd19wYXNzd29yZFswXSAmJiBwd19wYXNzd29yZFsxXSkgPyBwd19wYXNzd29yZCA6ICJ4eCI7CisKKwkvKgorCSAqIEF1dGhlbnRpY2F0aW9uIGlzIGFjY2VwdGVkIGlmIHRoZSBlbmNyeXB0ZWQgcGFzc3dvcmRzCisJICogYXJlIGlkZW50aWNhbC4KKwkgKi8KKyNpZmRlZiBVTklYV0FSRV9MT05HX1BBU1NXT1JEUworCWlmICghbmlzY2hlY2socHctPnB3X25hbWUpKSB7CisJCXJlc3VsdCA9ICgoc3RyY21wKGJpZ2NyeXB0KHBhc3N3b3JkLCBzYWx0KSwgcHdfcGFzc3dvcmQpID09IDApCisJCXx8ICAoc3RyY21wKG9zcjViaWdjcnlwdChwYXNzd29yZCwgc2FsdCksIHB3X3Bhc3N3b3JkKSA9PSAwKSk7CisJfQorCWVsc2UKKyNlbmRpZiAvKiBVTklYV0FSRV9MT05HX1BBU1NXT1JEUyAqLworCQlyZXN1bHQgPSAoc3RyY21wKHhjcnlwdChwYXNzd29yZCwgc2FsdCksIHB3X3Bhc3N3b3JkKSA9PSAwKTsKKworI2lmZGVmIFVTRV9MSUJJQUYKKwlpZiAoYXV0aGN0eHQtPnZhbGlkKQorCQlmcmVlKHB3X3Bhc3N3b3JkKTsKKyNlbmRpZgorCXJldHVybihyZXN1bHQpOworfQorCisjaWZkZWYgVU5JWFdBUkVfTE9OR19QQVNTV09SRFMKK2ludAorbmlzY2hlY2soY2hhciAqbmFtZXApCit7CisJY2hhciBwYXNzd29yZF9maWxlW10gPSAiL2V0Yy9wYXNzd2QiOworCUZJTEUgKmZkOworCXN0cnVjdCBwYXNzd2QgKmVudCA9IE5VTEw7CisKKwlpZiAoKGZkID0gZm9wZW4gKHBhc3N3b3JkX2ZpbGUsICJyIikpID09IE5VTEwpIHsKKwkJLyoKKwkJICogSWYgdGhlIHBhc3N3ZCBmaWxlIGhhcyBkaXNzYXBlYXJlZCB3ZSBhcmUgaW4gYSBiYWQgc3RhdGUuCisJCSAqIEhvd2V2ZXIsIHJldHVybmluZyAwIHdpbGwgc2VuZCB1cyBiYWNrIHRocm91Z2ggdGhlCisJCSAqIGF1dGhlbnRpY2F0aW9uIHNjaGVtZSB0aGF0IGhhcyBjaGVja2VkIHRoZSBpYSBkYXRhYmFzZSBmb3IKKwkJICogcGFzc3dvcmRzIGVhcmxpZXIuCisJCSAqLworCQlyZXR1cm4oMCk7CisJfQorCisJLyoKKwkgKiBmZ2V0cHdlbnQoKSBvbmx5IHJlYWRzIGZyb20gcGFzc3dvcmQgZmlsZSwgc28gd2Uga25vdyBmb3IgY2VydGFpbgorCSAqIHRoYXQgdGhlIHVzZXIgaXMgbG9jYWwuCisJICovCisJd2hpbGUgKGVudCA9IGZnZXRwd2VudChmZCkpIHsKKwkJaWYgKHN0cmNtcCAoZW50LT5wd19uYW1lLCBuYW1lcCkgPT0gMCkgeworCQkJLyogTG9jYWwgdXNlciAqLworCQkJZmNsb3NlIChmZCk7CisJCQlyZXR1cm4oMCk7CisJCX0KKwl9CisKKwlmY2xvc2UgKGZkKTsKKwlyZXR1cm4gKDEpOworfQorCisjZW5kaWYgLyogVU5JWFdBUkVfTE9OR19QQVNTV09SRFMgKi8KKworLyoKKwlOT1RFOiBpYV9nZXRfbG9ncHdkKCkgYWxsb2NhdGVzIG1lbW9yeSBmb3IgYXJnIDIKKwlmdW5jdGlvbnMgdGhhdCBjYWxsIHNoYWRvd19wdygpIHdpbGwgbmVlZCB0byBmcmVlCisgKi8KKworI2lmZGVmIFVTRV9MSUJJQUYKK2NoYXIgKgorZ2V0X2lhZl9wYXNzd29yZChzdHJ1Y3QgcGFzc3dkICpwdykKK3sKKwljaGFyICpwd19wYXNzd29yZCA9IE5VTEw7CisKKwl1aW5mb190IHVpbmZvOworCWlmICghaWFfb3BlbmluZm8ocHctPnB3X25hbWUsJnVpbmZvKSkgeworCQlpYV9nZXRfbG9ncHdkKHVpbmZvLCAmcHdfcGFzc3dvcmQpOworCQlpZiAocHdfcGFzc3dvcmQgPT0gTlVMTCkKKwkJCWZhdGFsKCJpYV9nZXRfbG9ncHdkOiBVbmFibGUgdG8gZ2V0IHRoZSBzaGFkb3cgcGFzc3dkIik7CisJCWlhX2Nsb3NlaW5mbyh1aW5mbyk7CisJIAlyZXR1cm4gcHdfcGFzc3dvcmQ7CisJfQorCWVsc2UKKwkJZmF0YWwoImlhX29wZW5pbmZvOiBVbmFibGUgdG8gb3BlbiB0aGUgc2hhZG93IHBhc3N3ZCBmaWxlIik7Cit9CisjZW5kaWYgLyogVVNFX0xJQklBRiAqLworI2VuZGlmIC8qIEhBVkVfTElCSUFGIGFuZCBub3QgSEFWRV9TRUNVUkVXQVJFICovCisKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcG9ydC11dy5oIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9wb3J0LXV3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYzZDhiNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcG9ydC11dy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGltIFJpY2UuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2lmZGVmIFVTRV9MSUJJQUYKK2NoYXIgKiBnZXRfaWFmX3Bhc3N3b3JkKHN0cnVjdCBwYXNzd2QgKnB3KTsKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3B3Y2FjaGUuYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcHdjYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOGI3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3B3Y2FjaGUuYwpAQCAtMCwwICsxLDExNCBAQAorLyoJJE9wZW5CU0Q6IHB3Y2FjaGUuYyx2IDEuOSAyMDA1LzA4LzA4IDA4OjA1OjM0IGVzcGllIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvZ2VuL3B3Y2FjaGUuYyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8Z3JwLmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZQlOQ0FDSEUJNjQJCQkvKiBwb3dlciBvZiAyICovCisjZGVmaW5lCU1BU0sJKE5DQUNIRSAtIDEpCQkvKiBiaXRzIHRvIHN0b3JlIHdpdGggKi8KKworI2lmbmRlZiBIQVZFX1VTRVJfRlJPTV9VSUQKK2NoYXIgKgordXNlcl9mcm9tX3VpZCh1aWRfdCB1aWQsIGludCBub3VzZXIpCit7CisJc3RhdGljIHN0cnVjdCBuY2FjaGUgeworCQl1aWRfdAl1aWQ7CisJCWNoYXIJKm5hbWU7CisJfSBjX3VpZFtOQ0FDSEVdOworCXN0YXRpYyBpbnQgcHdvcGVuOworCXN0YXRpYyBjaGFyIG5idWZbMTVdOwkJLyogMzIgYml0cyA9PSAxMCBkaWdpdHMgKi8KKwlzdHJ1Y3QgcGFzc3dkICpwdzsKKwlzdHJ1Y3QgbmNhY2hlICpjcDsKKworCWNwID0gY191aWQgKyAodWlkICYgTUFTSyk7CisJaWYgKGNwLT51aWQgIT0gdWlkIHx8IGNwLT5uYW1lID09IE5VTEwpIHsKKwkJaWYgKHB3b3BlbiA9PSAwKSB7CisjaWZkZWYgSEFWRV9TRVRQQVNTRU5UCisJCQlzZXRwYXNzZW50KDEpOworI2VuZGlmCisJCQlwd29wZW4gPSAxOworCQl9CisJCWlmICgocHcgPSBnZXRwd3VpZCh1aWQpKSA9PSBOVUxMKSB7CisJCQlpZiAobm91c2VyKQorCQkJCXJldHVybiAoTlVMTCk7CisJCQkodm9pZClzbnByaW50ZihuYnVmLCBzaXplb2YobmJ1ZiksICIldSIsIHVpZCk7CisJCX0KKwkJY3AtPnVpZCA9IHVpZDsKKwkJaWYgKGNwLT5uYW1lICE9IE5VTEwpCisJCQlmcmVlKGNwLT5uYW1lKTsKKwkJY3AtPm5hbWUgPSBzdHJkdXAocHcgPyBwdy0+cHdfbmFtZSA6IG5idWYpOworCX0KKwlyZXR1cm4gKGNwLT5uYW1lKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfR1JPVVBfRlJPTV9HSUQKK2NoYXIgKgorZ3JvdXBfZnJvbV9naWQoZ2lkX3QgZ2lkLCBpbnQgbm9ncm91cCkKK3sKKwlzdGF0aWMgc3RydWN0IG5jYWNoZSB7CisJCWdpZF90CWdpZDsKKwkJY2hhcgkqbmFtZTsKKwl9IGNfZ2lkW05DQUNIRV07CisJc3RhdGljIGludCBncm9wZW47CisJc3RhdGljIGNoYXIgbmJ1ZlsxNV07CQkvKiAzMiBiaXRzID09IDEwIGRpZ2l0cyAqLworCXN0cnVjdCBncm91cCAqZ3I7CisJc3RydWN0IG5jYWNoZSAqY3A7CisKKwljcCA9IGNfZ2lkICsgKGdpZCAmIE1BU0spOworCWlmIChjcC0+Z2lkICE9IGdpZCB8fCBjcC0+bmFtZSA9PSBOVUxMKSB7CisJCWlmIChncm9wZW4gPT0gMCkgeworI2lmZGVmIEhBVkVfU0VUR1JPVVBFTlQKKwkJCXNldGdyb3VwZW50KDEpOworI2VuZGlmCisJCQlncm9wZW4gPSAxOworCQl9CisJCWlmICgoZ3IgPSBnZXRncmdpZChnaWQpKSA9PSBOVUxMKSB7CisJCQlpZiAobm9ncm91cCkKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJKHZvaWQpc25wcmludGYobmJ1Ziwgc2l6ZW9mKG5idWYpLCAiJXUiLCBnaWQpOworCQl9CisJCWNwLT5naWQgPSBnaWQ7CisJCWlmIChjcC0+bmFtZSAhPSBOVUxMKQorCQkJZnJlZShjcC0+bmFtZSk7CisJCWNwLT5uYW1lID0gc3RyZHVwKGdyID8gZ3ItPmdyX25hbWUgOiBuYnVmKTsKKwl9CisJcmV0dXJuIChjcC0+bmFtZSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcmVhZHBhc3NwaHJhc2UuYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcmVhZHBhc3NwaHJhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmI2ZDBkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9yZWFkcGFzc3BocmFzZS5jCkBAIC0wLDAgKzEsMjA1IEBACisvKgkkT3BlbkJTRDogcmVhZHBhc3NwaHJhc2UuYyx2IDEuMjIgMjAxMC8wMS8xMyAxMDoyMDo1NCBkdHVja2VyIEV4cCAkCSovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiwgMjAwNyBUb2RkIEMuIE1pbGxlciA8VG9kZC5NaWxsZXJAY291cnRlc2FuLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqCisgKiBTcG9uc29yZWQgaW4gcGFydCBieSB0aGUgRGVmZW5zZSBBZHZhbmNlZCBSZXNlYXJjaCBQcm9qZWN0cworICogQWdlbmN5IChEQVJQQSkgYW5kIEFpciBGb3JjZSBSZXNlYXJjaCBMYWJvcmF0b3J5LCBBaXIgRm9yY2UKKyAqIE1hdGVyaWVsIENvbW1hbmQsIFVTQUYsIHVuZGVyIGFncmVlbWVudCBudW1iZXIgRjM5NTAyLTk5LTEtMDUxMi4KKyAqLworCisvKiBPUEVOQlNEIE9SSUdJTkFMOiBsaWIvbGliYy9nZW4vcmVhZHBhc3NwaHJhc2UuYyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2lmbmRlZiBIQVZFX1JFQURQQVNTUEhSQVNFCisKKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHJlYWRwYXNzcGhyYXNlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmZGVmIFRDU0FTT0ZUCisjIGRlZmluZSBfVF9GTFVTSAkoVENTQUZMVVNIfFRDU0FTT0ZUKQorI2Vsc2UKKyMgZGVmaW5lIF9UX0ZMVVNICShUQ1NBRkxVU0gpCisjZW5kaWYKKworLyogU3VuT1MgNC54IHdoaWNoIGxhY2tzIF9QT1NJWF9WRElTQUJMRSwgYnV0IGhhcyBWRElTQUJMRSAqLworI2lmICFkZWZpbmVkKF9QT1NJWF9WRElTQUJMRSkgJiYgZGVmaW5lZChWRElTQUJMRSkKKyMgIGRlZmluZSBfUE9TSVhfVkRJU0FCTEUgICAgICAgVkRJU0FCTEUKKyNlbmRpZgorCitzdGF0aWMgdm9sYXRpbGUgc2lnX2F0b21pY190IHNpZ25vW19OU0lHXTsKKworc3RhdGljIHZvaWQgaGFuZGxlcihpbnQpOworCitjaGFyICoKK3JlYWRwYXNzcGhyYXNlKGNvbnN0IGNoYXIgKnByb21wdCwgY2hhciAqYnVmLCBzaXplX3QgYnVmc2l6LCBpbnQgZmxhZ3MpCit7CisJc3NpemVfdCBucjsKKwlpbnQgaW5wdXQsIG91dHB1dCwgc2F2ZV9lcnJubywgaSwgbmVlZF9yZXN0YXJ0OworCWNoYXIgY2gsICpwLCAqZW5kOworCXN0cnVjdCB0ZXJtaW9zIHRlcm0sIG90ZXJtOworCXN0cnVjdCBzaWdhY3Rpb24gc2EsIHNhdmVhbHJtLCBzYXZlaW50LCBzYXZlaHVwLCBzYXZlcXVpdCwgc2F2ZXRlcm07CisJc3RydWN0IHNpZ2FjdGlvbiBzYXZldHN0cCwgc2F2ZXR0aW4sIHNhdmV0dG91LCBzYXZlcGlwZTsKKworCS8qIEkgc3VwcG9zZSB3ZSBjb3VsZCBhbGxvYyBvbiBkZW1hbmQgaW4gdGhpcyBjYXNlIChYWFgpLiAqLworCWlmIChidWZzaXogPT0gMCkgeworCQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworcmVzdGFydDoKKwlmb3IgKGkgPSAwOyBpIDwgX05TSUc7IGkrKykKKwkJc2lnbm9baV0gPSAwOworCW5yID0gLTE7CisJc2F2ZV9lcnJubyA9IDA7CisJbmVlZF9yZXN0YXJ0ID0gMDsKKwkvKgorCSAqIFJlYWQgYW5kIHdyaXRlIHRvIC9kZXYvdHR5IGlmIGF2YWlsYWJsZS4gIElmIG5vdCwgcmVhZCBmcm9tCisJICogc3RkaW4gYW5kIHdyaXRlIHRvIHN0ZGVyciB1bmxlc3MgYSB0dHkgaXMgcmVxdWlyZWQuCisJICovCisJaWYgKChmbGFncyAmIFJQUF9TVERJTikgfHwKKwkgICAgKGlucHV0ID0gb3V0cHV0ID0gb3BlbihfUEFUSF9UVFksIE9fUkRXUikpID09IC0xKSB7CisJCWlmIChmbGFncyAmIFJQUF9SRVFVSVJFX1RUWSkgeworCQkJZXJybm8gPSBFTk9UVFk7CisJCQlyZXR1cm4oTlVMTCk7CisJCX0KKwkJaW5wdXQgPSBTVERJTl9GSUxFTk87CisJCW91dHB1dCA9IFNUREVSUl9GSUxFTk87CisJfQorCisJLyoKKwkgKiBDYXRjaCBzaWduYWxzIHRoYXQgd291bGQgb3RoZXJ3aXNlIGNhdXNlIHRoZSB1c2VyIHRvIGVuZAorCSAqIHVwIHdpdGggZWNobyB0dXJuZWQgb2ZmIGluIHRoZSBzaGVsbC4gIERvbid0IHdvcnJ5IGFib3V0CisJICogdGhpbmdzIGxpa2UgU0lHWENQVSBhbmQgU0lHVlRBTFJNIGZvciBub3cuCisJICovCisJc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOworCXNhLnNhX2ZsYWdzID0gMDsJCS8qIGRvbid0IHJlc3RhcnQgc3lzdGVtIGNhbGxzICovCisJc2Euc2FfaGFuZGxlciA9IGhhbmRsZXI7CisJKHZvaWQpc2lnYWN0aW9uKFNJR0FMUk0sICZzYSwgJnNhdmVhbHJtKTsKKwkodm9pZClzaWdhY3Rpb24oU0lHSFVQLCAmc2EsICZzYXZlaHVwKTsKKwkodm9pZClzaWdhY3Rpb24oU0lHSU5ULCAmc2EsICZzYXZlaW50KTsKKwkodm9pZClzaWdhY3Rpb24oU0lHUElQRSwgJnNhLCAmc2F2ZXBpcGUpOworCSh2b2lkKXNpZ2FjdGlvbihTSUdRVUlULCAmc2EsICZzYXZlcXVpdCk7CisJKHZvaWQpc2lnYWN0aW9uKFNJR1RFUk0sICZzYSwgJnNhdmV0ZXJtKTsKKwkodm9pZClzaWdhY3Rpb24oU0lHVFNUUCwgJnNhLCAmc2F2ZXRzdHApOworCSh2b2lkKXNpZ2FjdGlvbihTSUdUVElOLCAmc2EsICZzYXZldHRpbik7CisJKHZvaWQpc2lnYWN0aW9uKFNJR1RUT1UsICZzYSwgJnNhdmV0dG91KTsKKworCS8qIFR1cm4gb2ZmIGVjaG8gaWYgcG9zc2libGUuICovCisJaWYgKGlucHV0ICE9IFNURElOX0ZJTEVOTyAmJiB0Y2dldGF0dHIoaW5wdXQsICZvdGVybSkgPT0gMCkgeworCQltZW1jcHkoJnRlcm0sICZvdGVybSwgc2l6ZW9mKHRlcm0pKTsKKwkJaWYgKCEoZmxhZ3MgJiBSUFBfRUNIT19PTikpCisJCQl0ZXJtLmNfbGZsYWcgJj0gfihFQ0hPIHwgRUNIT05MKTsKKyNpZmRlZiBWU1RBVFVTCisJCWlmICh0ZXJtLmNfY2NbVlNUQVRVU10gIT0gX1BPU0lYX1ZESVNBQkxFKQorCQkJdGVybS5jX2NjW1ZTVEFUVVNdID0gX1BPU0lYX1ZESVNBQkxFOworI2VuZGlmCisJCSh2b2lkKXRjc2V0YXR0cihpbnB1dCwgX1RfRkxVU0gsICZ0ZXJtKTsKKwl9IGVsc2UgeworCQltZW1zZXQoJnRlcm0sIDAsIHNpemVvZih0ZXJtKSk7CisJCXRlcm0uY19sZmxhZyB8PSBFQ0hPOworCQltZW1zZXQoJm90ZXJtLCAwLCBzaXplb2Yob3Rlcm0pKTsKKwkJb3Rlcm0uY19sZmxhZyB8PSBFQ0hPOworCX0KKworCS8qIE5vIEkvTyBpZiB3ZSBhcmUgYWxyZWFkeSBiYWNrZ3JvdW5kZWQuICovCisJaWYgKHNpZ25vW1NJR1RUT1VdICE9IDEgJiYgc2lnbm9bU0lHVFRJTl0gIT0gMSkgeworCQlpZiAoIShmbGFncyAmIFJQUF9TVERJTikpCisJCQkodm9pZCl3cml0ZShvdXRwdXQsIHByb21wdCwgc3RybGVuKHByb21wdCkpOworCQllbmQgPSBidWYgKyBidWZzaXogLSAxOworCQlwID0gYnVmOworCQl3aGlsZSAoKG5yID0gcmVhZChpbnB1dCwgJmNoLCAxKSkgPT0gMSAmJiBjaCAhPSAnXG4nICYmIGNoICE9ICdccicpIHsKKwkJCWlmIChwIDwgZW5kKSB7CisJCQkJaWYgKChmbGFncyAmIFJQUF9TRVZFTkJJVCkpCisJCQkJCWNoICY9IDB4N2Y7CisJCQkJaWYgKGlzYWxwaGEoY2gpKSB7CisJCQkJCWlmICgoZmxhZ3MgJiBSUFBfRk9SQ0VMT1dFUikpCisJCQkJCQljaCA9IChjaGFyKXRvbG93ZXIoY2gpOworCQkJCQlpZiAoKGZsYWdzICYgUlBQX0ZPUkNFVVBQRVIpKQorCQkJCQkJY2ggPSAoY2hhcil0b3VwcGVyKGNoKTsKKwkJCQl9CisJCQkJKnArKyA9IGNoOworCQkJfQorCQl9CisJCSpwID0gJ1wwJzsKKwkJc2F2ZV9lcnJubyA9IGVycm5vOworCQlpZiAoISh0ZXJtLmNfbGZsYWcgJiBFQ0hPKSkKKwkJCSh2b2lkKXdyaXRlKG91dHB1dCwgIlxuIiwgMSk7CisJfQorCisJLyogUmVzdG9yZSBvbGQgdGVybWluYWwgc2V0dGluZ3MgYW5kIHNpZ25hbHMuICovCisJaWYgKG1lbWNtcCgmdGVybSwgJm90ZXJtLCBzaXplb2YodGVybSkpICE9IDApIHsKKwkJd2hpbGUgKHRjc2V0YXR0cihpbnB1dCwgX1RfRkxVU0gsICZvdGVybSkgPT0gLTEgJiYKKwkJICAgIGVycm5vID09IEVJTlRSKQorCQkJY29udGludWU7CisJfQorCSh2b2lkKXNpZ2FjdGlvbihTSUdBTFJNLCAmc2F2ZWFscm0sIE5VTEwpOworCSh2b2lkKXNpZ2FjdGlvbihTSUdIVVAsICZzYXZlaHVwLCBOVUxMKTsKKwkodm9pZClzaWdhY3Rpb24oU0lHSU5ULCAmc2F2ZWludCwgTlVMTCk7CisJKHZvaWQpc2lnYWN0aW9uKFNJR1FVSVQsICZzYXZlcXVpdCwgTlVMTCk7CisJKHZvaWQpc2lnYWN0aW9uKFNJR1BJUEUsICZzYXZlcGlwZSwgTlVMTCk7CisJKHZvaWQpc2lnYWN0aW9uKFNJR1RFUk0sICZzYXZldGVybSwgTlVMTCk7CisJKHZvaWQpc2lnYWN0aW9uKFNJR1RTVFAsICZzYXZldHN0cCwgTlVMTCk7CisJKHZvaWQpc2lnYWN0aW9uKFNJR1RUSU4sICZzYXZldHRpbiwgTlVMTCk7CisJKHZvaWQpc2lnYWN0aW9uKFNJR1RUT1UsICZzYXZldHRvdSwgTlVMTCk7CisJaWYgKGlucHV0ICE9IFNURElOX0ZJTEVOTykKKwkJKHZvaWQpY2xvc2UoaW5wdXQpOworCisJLyoKKwkgKiBJZiB3ZSB3ZXJlIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLCByZXNlbmQgaXQgdG8gb3Vyc2VsdmVzCisJICogbm93IHRoYXQgd2UgaGF2ZSByZXN0b3JlZCB0aGUgc2lnbmFsIGhhbmRsZXJzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBfTlNJRzsgaSsrKSB7CisJCWlmIChzaWdub1tpXSkgeworCQkJa2lsbChnZXRwaWQoKSwgaSk7CisJCQlzd2l0Y2ggKGkpIHsKKwkJCWNhc2UgU0lHVFNUUDoKKwkJCWNhc2UgU0lHVFRJTjoKKwkJCWNhc2UgU0lHVFRPVToKKwkJCQluZWVkX3Jlc3RhcnQgPSAxOworCQkJfQorCQl9CisJfQorCWlmIChuZWVkX3Jlc3RhcnQpCisJCWdvdG8gcmVzdGFydDsKKworCWlmIChzYXZlX2Vycm5vKQorCQllcnJubyA9IHNhdmVfZXJybm87CisJcmV0dXJuKG5yID09IC0xID8gTlVMTCA6IGJ1Zik7Cit9CisKKyNpZiAwCitjaGFyICoKK2dldHBhc3MoY29uc3QgY2hhciAqcHJvbXB0KQoreworCXN0YXRpYyBjaGFyIGJ1ZltfUEFTU1dPUkRfTEVOICsgMV07CisKKwlyZXR1cm4ocmVhZHBhc3NwaHJhc2UocHJvbXB0LCBidWYsIHNpemVvZihidWYpLCBSUFBfRUNIT19PRkYpKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBoYW5kbGVyKGludCBzKQoreworCisJc2lnbm9bc10gPSAxOworfQorI2VuZGlmIC8qIEhBVkVfUkVBRFBBU1NQSFJBU0UgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcmVhZHBhc3NwaHJhc2UuaCBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcmVhZHBhc3NwaHJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmQ3YzVkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9yZWFkcGFzc3BocmFzZS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCSRPcGVuQlNEOiByZWFkcGFzc3BocmFzZS5oLHYgMS41IDIwMDMvMDYvMTcgMjE6NTY6MjMgbWlsbGVydCBFeHAgJAkqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIFRvZGQgQy4gTWlsbGVyIDxUb2RkLk1pbGxlckBjb3VydGVzYW4uY29tPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqIFNwb25zb3JlZCBpbiBwYXJ0IGJ5IHRoZSBEZWZlbnNlIEFkdmFuY2VkIFJlc2VhcmNoIFByb2plY3RzCisgKiBBZ2VuY3kgKERBUlBBKSBhbmQgQWlyIEZvcmNlIFJlc2VhcmNoIExhYm9yYXRvcnksIEFpciBGb3JjZQorICogTWF0ZXJpZWwgQ29tbWFuZCwgVVNBRiwgdW5kZXIgYWdyZWVtZW50IG51bWJlciBGMzk1MDItOTktMS0wNTEyLgorICovCisKKy8qIE9QRU5CU0QgT1JJR0lOQUw6IGluY2x1ZGUvcmVhZHBhc3NwaHJhc2UuaCAqLworCisjaWZuZGVmIF9SRUFEUEFTU1BIUkFTRV9IXworI2RlZmluZSBfUkVBRFBBU1NQSFJBU0VfSF8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpZm5kZWYgSEFWRV9SRUFEUEFTU1BIUkFTRQorCisjZGVmaW5lIFJQUF9FQ0hPX09GRiAgICAweDAwCQkvKiBUdXJuIG9mZiBlY2hvIChkZWZhdWx0KS4gKi8KKyNkZWZpbmUgUlBQX0VDSE9fT04gICAgIDB4MDEJCS8qIExlYXZlIGVjaG8gb24uICovCisjZGVmaW5lIFJQUF9SRVFVSVJFX1RUWSAweDAyCQkvKiBGYWlsIGlmIHRoZXJlIGlzIG5vIHR0eS4gKi8KKyNkZWZpbmUgUlBQX0ZPUkNFTE9XRVIgIDB4MDQJCS8qIEZvcmNlIGlucHV0IHRvIGxvd2VyIGNhc2UuICovCisjZGVmaW5lIFJQUF9GT1JDRVVQUEVSICAweDA4CQkvKiBGb3JjZSBpbnB1dCB0byB1cHBlciBjYXNlLiAqLworI2RlZmluZSBSUFBfU0VWRU5CSVQgICAgMHgxMAkJLyogU3RyaXAgdGhlIGhpZ2ggYml0IGZyb20gaW5wdXQuICovCisjZGVmaW5lIFJQUF9TVERJTiAgICAgICAweDIwCQkvKiBSZWFkIGZyb20gc3RkaW4sIG5vdCAvZGV2L3R0eSAqLworCitjaGFyICogcmVhZHBhc3NwaHJhc2UoY29uc3QgY2hhciAqLCBjaGFyICosIHNpemVfdCwgaW50KTsKKworI2VuZGlmIC8qIEhBVkVfUkVBRFBBU1NQSFJBU0UgKi8KKworI2VuZGlmIC8qICFfUkVBRFBBU1NQSFJBU0VfSF8gKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcmVhbHBhdGguYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcmVhbHBhdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjEyMGQwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9yZWFscGF0aC5jCkBAIC0wLDAgKzEsMTk3IEBACisvKgkkT3BlbkJTRDogcmVhbHBhdGguYyx2IDEuMTMgMjAwNS8wOC8wOCAwODowNTozNyBlc3BpZSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBDb25zdGFudGluIFMuIFN2aW50c29mZiA8a29zdGlrQGljbHViLm5zdS5ydT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYXV0aG9ycyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvc3RkbGliL3JlYWxwYXRoLmMgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpZiAhZGVmaW5lZChIQVZFX1JFQUxQQVRIKSB8fCBkZWZpbmVkKEJST0tFTl9SRUFMUEFUSCkKKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisvKgorICogY2hhciAqcmVhbHBhdGgoY29uc3QgY2hhciAqcGF0aCwgY2hhciByZXNvbHZlZFtQQVRIX01BWF0pOworICoKKyAqIEZpbmQgdGhlIHJlYWwgbmFtZSBvZiBwYXRoLCBieSByZW1vdmluZyBhbGwgIi4iLCAiLi4iIGFuZCBzeW1saW5rCisgKiBjb21wb25lbnRzLiAgUmV0dXJucyAocmVzb2x2ZWQpIG9uIHN1Y2Nlc3MsIG9yIChOVUxMKSBvbiBmYWlsdXJlLAorICogaW4gd2hpY2ggY2FzZSB0aGUgcGF0aCB3aGljaCBjYXVzZWQgdHJvdWJsZSBpcyBsZWZ0IGluIChyZXNvbHZlZCkuCisgKi8KK2NoYXIgKgorcmVhbHBhdGgoY29uc3QgY2hhciAqcGF0aCwgY2hhciByZXNvbHZlZFtQQVRIX01BWF0pCit7CisJc3RydWN0IHN0YXQgc2I7CisJY2hhciAqcCwgKnEsICpzOworCXNpemVfdCBsZWZ0X2xlbiwgcmVzb2x2ZWRfbGVuOworCXVuc2lnbmVkIHN5bWxpbmtzOworCWludCBzZXJybm8sIHNsZW47CisJY2hhciBsZWZ0W1BBVEhfTUFYXSwgbmV4dF90b2tlbltQQVRIX01BWF0sIHN5bWxpbmtbUEFUSF9NQVhdOworCisJc2Vycm5vID0gZXJybm87CisJc3ltbGlua3MgPSAwOworCWlmIChwYXRoWzBdID09ICcvJykgeworCQlyZXNvbHZlZFswXSA9ICcvJzsKKwkJcmVzb2x2ZWRbMV0gPSAnXDAnOworCQlpZiAocGF0aFsxXSA9PSAnXDAnKQorCQkJcmV0dXJuIChyZXNvbHZlZCk7CisJCXJlc29sdmVkX2xlbiA9IDE7CisJCWxlZnRfbGVuID0gc3RybGNweShsZWZ0LCBwYXRoICsgMSwgc2l6ZW9mKGxlZnQpKTsKKwl9IGVsc2UgeworCQlpZiAoZ2V0Y3dkKHJlc29sdmVkLCBQQVRIX01BWCkgPT0gTlVMTCkgeworCQkJc3RybGNweShyZXNvbHZlZCwgIi4iLCBQQVRIX01BWCk7CisJCQlyZXR1cm4gKE5VTEwpOworCQl9CisJCXJlc29sdmVkX2xlbiA9IHN0cmxlbihyZXNvbHZlZCk7CisJCWxlZnRfbGVuID0gc3RybGNweShsZWZ0LCBwYXRoLCBzaXplb2YobGVmdCkpOworCX0KKwlpZiAobGVmdF9sZW4gPj0gc2l6ZW9mKGxlZnQpIHx8IHJlc29sdmVkX2xlbiA+PSBQQVRIX01BWCkgeworCQllcnJubyA9IEVOQU1FVE9PTE9ORzsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwkvKgorCSAqIEl0ZXJhdGUgb3ZlciBwYXRoIGNvbXBvbmVudHMgaW4gYGxlZnQnLgorCSAqLworCXdoaWxlIChsZWZ0X2xlbiAhPSAwKSB7CisJCS8qCisJCSAqIEV4dHJhY3QgdGhlIG5leHQgcGF0aCBjb21wb25lbnQgYW5kIGFkanVzdCBgbGVmdCcKKwkJICogYW5kIGl0cyBsZW5ndGguCisJCSAqLworCQlwID0gc3RyY2hyKGxlZnQsICcvJyk7CisJCXMgPSBwID8gcCA6IGxlZnQgKyBsZWZ0X2xlbjsKKwkJaWYgKHMgLSBsZWZ0ID49IHNpemVvZihuZXh0X3Rva2VuKSkgeworCQkJZXJybm8gPSBFTkFNRVRPT0xPTkc7CisJCQlyZXR1cm4gKE5VTEwpOworCQl9CisJCW1lbWNweShuZXh0X3Rva2VuLCBsZWZ0LCBzIC0gbGVmdCk7CisJCW5leHRfdG9rZW5bcyAtIGxlZnRdID0gJ1wwJzsKKwkJbGVmdF9sZW4gLT0gcyAtIGxlZnQ7CisJCWlmIChwICE9IE5VTEwpCisJCQltZW1tb3ZlKGxlZnQsIHMgKyAxLCBsZWZ0X2xlbiArIDEpOworCQlpZiAocmVzb2x2ZWRbcmVzb2x2ZWRfbGVuIC0gMV0gIT0gJy8nKSB7CisJCQlpZiAocmVzb2x2ZWRfbGVuICsgMSA+PSBQQVRIX01BWCkgeworCQkJCWVycm5vID0gRU5BTUVUT09MT05HOworCQkJCXJldHVybiAoTlVMTCk7CisJCQl9CisJCQlyZXNvbHZlZFtyZXNvbHZlZF9sZW4rK10gPSAnLyc7CisJCQlyZXNvbHZlZFtyZXNvbHZlZF9sZW5dID0gJ1wwJzsKKwkJfQorCQlpZiAobmV4dF90b2tlblswXSA9PSAnXDAnKQorCQkJY29udGludWU7CisJCWVsc2UgaWYgKHN0cmNtcChuZXh0X3Rva2VuLCAiLiIpID09IDApCisJCQljb250aW51ZTsKKwkJZWxzZSBpZiAoc3RyY21wKG5leHRfdG9rZW4sICIuLiIpID09IDApIHsKKwkJCS8qCisJCQkgKiBTdHJpcCB0aGUgbGFzdCBwYXRoIGNvbXBvbmVudCBleGNlcHQgd2hlbiB3ZSBoYXZlCisJCQkgKiBzaW5nbGUgIi8iCisJCQkgKi8KKwkJCWlmIChyZXNvbHZlZF9sZW4gPiAxKSB7CisJCQkJcmVzb2x2ZWRbcmVzb2x2ZWRfbGVuIC0gMV0gPSAnXDAnOworCQkJCXEgPSBzdHJyY2hyKHJlc29sdmVkLCAnLycpICsgMTsKKwkJCQkqcSA9ICdcMCc7CisJCQkJcmVzb2x2ZWRfbGVuID0gcSAtIHJlc29sdmVkOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBBcHBlbmQgdGhlIG5leHQgcGF0aCBjb21wb25lbnQgYW5kIGxzdGF0KCkgaXQuIElmCisJCSAqIGxzdGF0KCkgZmFpbHMgd2Ugc3RpbGwgY2FuIHJldHVybiBzdWNjZXNzZnVsbHkgaWYKKwkJICogdGhlcmUgYXJlIG5vIG1vcmUgcGF0aCBjb21wb25lbnRzIGxlZnQuCisJCSAqLworCQlyZXNvbHZlZF9sZW4gPSBzdHJsY2F0KHJlc29sdmVkLCBuZXh0X3Rva2VuLCBQQVRIX01BWCk7CisJCWlmIChyZXNvbHZlZF9sZW4gPj0gUEFUSF9NQVgpIHsKKwkJCWVycm5vID0gRU5BTUVUT09MT05HOworCQkJcmV0dXJuIChOVUxMKTsKKwkJfQorCQlpZiAobHN0YXQocmVzb2x2ZWQsICZzYikgIT0gMCkgeworCQkJaWYgKGVycm5vID09IEVOT0VOVCAmJiBwID09IE5VTEwpIHsKKwkJCQllcnJubyA9IHNlcnJubzsKKwkJCQlyZXR1cm4gKHJlc29sdmVkKTsKKwkJCX0KKwkJCXJldHVybiAoTlVMTCk7CisJCX0KKwkJaWYgKFNfSVNMTksoc2Iuc3RfbW9kZSkpIHsKKwkJCWlmIChzeW1saW5rcysrID4gTUFYU1lNTElOS1MpIHsKKwkJCQllcnJubyA9IEVMT09QOworCQkJCXJldHVybiAoTlVMTCk7CisJCQl9CisJCQlzbGVuID0gcmVhZGxpbmsocmVzb2x2ZWQsIHN5bWxpbmssIHNpemVvZihzeW1saW5rKSAtIDEpOworCQkJaWYgKHNsZW4gPCAwKQorCQkJCXJldHVybiAoTlVMTCk7CisJCQlzeW1saW5rW3NsZW5dID0gJ1wwJzsKKwkJCWlmIChzeW1saW5rWzBdID09ICcvJykgeworCQkJCXJlc29sdmVkWzFdID0gMDsKKwkJCQlyZXNvbHZlZF9sZW4gPSAxOworCQkJfSBlbHNlIGlmIChyZXNvbHZlZF9sZW4gPiAxKSB7CisJCQkJLyogU3RyaXAgdGhlIGxhc3QgcGF0aCBjb21wb25lbnQuICovCisJCQkJcmVzb2x2ZWRbcmVzb2x2ZWRfbGVuIC0gMV0gPSAnXDAnOworCQkJCXEgPSBzdHJyY2hyKHJlc29sdmVkLCAnLycpICsgMTsKKwkJCQkqcSA9ICdcMCc7CisJCQkJcmVzb2x2ZWRfbGVuID0gcSAtIHJlc29sdmVkOworCQkJfQorCisJCQkvKgorCQkJICogSWYgdGhlcmUgYXJlIGFueSBwYXRoIGNvbXBvbmVudHMgbGVmdCwgdGhlbgorCQkJICogYXBwZW5kIHRoZW0gdG8gc3ltbGluay4gVGhlIHJlc3VsdCBpcyBwbGFjZWQKKwkJCSAqIGluIGBsZWZ0Jy4KKwkJCSAqLworCQkJaWYgKHAgIT0gTlVMTCkgeworCQkJCWlmIChzeW1saW5rW3NsZW4gLSAxXSAhPSAnLycpIHsKKwkJCQkJaWYgKHNsZW4gKyAxID49IHNpemVvZihzeW1saW5rKSkgeworCQkJCQkJZXJybm8gPSBFTkFNRVRPT0xPTkc7CisJCQkJCQlyZXR1cm4gKE5VTEwpOworCQkJCQl9CisJCQkJCXN5bWxpbmtbc2xlbl0gPSAnLyc7CisJCQkJCXN5bWxpbmtbc2xlbiArIDFdID0gMDsKKwkJCQl9CisJCQkJbGVmdF9sZW4gPSBzdHJsY2F0KHN5bWxpbmssIGxlZnQsIHNpemVvZihsZWZ0KSk7CisJCQkJaWYgKGxlZnRfbGVuID49IHNpemVvZihsZWZ0KSkgeworCQkJCQllcnJubyA9IEVOQU1FVE9PTE9ORzsKKwkJCQkJcmV0dXJuIChOVUxMKTsKKwkJCQl9CisJCQl9CisJCQlsZWZ0X2xlbiA9IHN0cmxjcHkobGVmdCwgc3ltbGluaywgc2l6ZW9mKGxlZnQpKTsKKwkJfQorCX0KKworCS8qCisJICogUmVtb3ZlIHRyYWlsaW5nIHNsYXNoIGV4Y2VwdCB3aGVuIHRoZSByZXNvbHZlZCBwYXRobmFtZQorCSAqIGlzIGEgc2luZ2xlICIvIi4KKwkgKi8KKwlpZiAocmVzb2x2ZWRfbGVuID4gMSAmJiByZXNvbHZlZFtyZXNvbHZlZF9sZW4gLSAxXSA9PSAnLycpCisJCXJlc29sdmVkW3Jlc29sdmVkX2xlbiAtIDFdID0gJ1wwJzsKKwlyZXR1cm4gKHJlc29sdmVkKTsKK30KKyNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX1JFQUxQQVRIKSB8fCBkZWZpbmVkKEJST0tFTl9SRUFMUEFUSCkgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcmVncmVzcy9NYWtlZmlsZS5pbiBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcmVncmVzcy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2YyMTRiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9yZWdyZXNzL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMzggQEAKKyMgJElkOiBNYWtlZmlsZS5pbix2IDEuNCAyMDA2LzA4LzE5IDA5OjEyOjE0IGR0dWNrZXIgRXhwICQKKworc3lzY29uZmRpcj1Ac3lzY29uZmRpckAKK3BpZGRpcj1AcGlkZGlyQAorc3JjZGlyPUBzcmNkaXJACit0b3Bfc3JjZGlyPUB0b3Bfc3JjZGlyQAorCitWUEFUSD1Ac3JjZGlyQAorQ0M9QENDQAorTEQ9QExEQAorQ0ZMQUdTPUBDRkxBR1NACitDUFBGTEFHUz0tSS4gLUkuLiAtSSQoc3JjZGlyKSAtSSQoc3JjZGlyKS8uLiBAQ1BQRkxBR1NAIEBERUZTQAorRVhFRVhUPUBFWEVFWFRACitMSUJDT01QQVQ9Li4vbGlib3BlbmJzZC1jb21wYXQuYQorTElCUz1ATElCU0AKK0xERkxBR1M9QExERkxBR1NAICQoTElCQ09NUEFUKQorCitURVNUUFJPR1M9Y2xvc2Vmcm9tdGVzdCQoRVhFRVhUKSBzbnByaW50ZnRlc3QkKEVYRUVYVCkgc3RyZHVwdGVzdCQoRVhFRVhUKSBcCisJc3RydG9udW10ZXN0JChFWEVFWFQpCisKK2FsbDoJdC1leGVjICR7T1RIRVJURVNUU30KKworJSQoRVhFRVhUKToJJS5jCisJJChDQykgJChDRkxBR1MpICQoQ1BQRkxBR1MpICQoTERGTEFHUykgLW8gJEAgJDwgJChMSUJDT01QQVQpICQoTElCUykKKwordC1leGVjOgkkKFRFU1RQUk9HUykKKwlAZWNobyBydW5uaW5nIGNvbXBhdCByZWdyZXNzIHRlc3RzCisJQGZvciBURVNUIGluICIiJD87IGRvIFwKKwkJZWNobyAicnVuIHRlc3QgJCR7VEVTVH0iIC4uLiAxPiYyOyBcCisJCS4vJCR7VEVTVH0kKEVYRUVYVCkgfHwgZXhpdCAkJD8gOyBcCisJZG9uZQorCUBlY2hvIGZpbmlzaGVkIGNvbXBhdCByZWdyZXNzIHRlc3RzCisKK2NsZWFuOgorCXJtIC1mICoubyAqLmEgY29yZSAkKFRFU1RQUk9HUykgdmFsaWQub3V0CisKK2Rpc3RjbGVhbjogY2xlYW4KKwlybSAtZiBNYWtlZmlsZSAqfgpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9yZWdyZXNzL2Nsb3NlZnJvbXRlc3QuYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcmVncmVzcy9jbG9zZWZyb210ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJmZmViOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcmVncmVzcy9jbG9zZWZyb210ZXN0LmMKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBEYXJyZW4gVHVja2VyCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgTlVNX09QRU5TIDEwCisKK2ludCBjbG9zZWZyb20oaW50KTsKKwordm9pZAorZmFpbChjaGFyICptc2cpCit7CisJZnByaW50ZihzdGRlcnIsICJjbG9zZWZyb206ICVzXG4iLCBtc2cpOworCWV4aXQoMSk7Cit9CisKK2ludAorbWFpbih2b2lkKQoreworCWludCBpLCBtYXgsIGZkc1tOVU1fT1BFTlNdOworCWNoYXIgYnVmWzUxMl07CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX09QRU5TOyBpKyspCisJCWlmICgoZmRzW2ldID0gb3BlbigiL2Rldi9udWxsIiwgT19SRE9OTFkpKSA9PSAtMSkKKwkJCWV4aXQoMCk7CS8qIGNhbid0IHRlc3QgKi8KKwltYXggPSBpIC0gMTsKKworCS8qIHNob3VsZCBjbG9zZSBsYXN0IGZkIG9ubHkgKi8KKwljbG9zZWZyb20oZmRzW21heF0pOworCWlmIChjbG9zZShmZHNbbWF4XSkgIT0gLTEpCisJCWZhaWwoImZhaWxlZCB0byBjbG9zZSBoaWdoZXN0IGZkIik7CisKKwkvKiBtYWtlIHN1cmUgd2UgY2FuIHN0aWxsIHVzZSByZW1haW5pbmcgZGVzY3JpcHRvcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspCisJCWlmIChyZWFkKGZkc1tpXSwgYnVmLCBzaXplb2YoYnVmKSkgPT0gLTEpCisJCQlmYWlsKCJjbG9zZWQgZGVzY3JpcHRvcnMgaXQgc2hvdWxkIG5vdCBoYXZlIik7CisKKwkvKiBzaG91bGQgY2xvc2UgYWxsIGZkcyAqLworCWNsb3NlZnJvbShmZHNbMF0pOworCWZvciAoaSA9IDA7IGkgPCBOVU1fT1BFTlM7IGkrKykKKwkJaWYgKGNsb3NlKGZkc1tpXSkgIT0gLTEpCisJCQlmYWlsKCJmYWlsZWQgdG8gY2xvc2UgZnJvbSBsb3dlc3QgZmQiKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcmVncmVzcy9zbnByaW50ZnRlc3QuYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcmVncmVzcy9zbnByaW50ZnRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2E2M2UxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9yZWdyZXNzL3NucHJpbnRmdGVzdC5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGFycmVuIFR1Y2tlcgorICogQ29weXJpZ2h0IChjKSAyMDA1IERhbWllbiBNaWxsZXIKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjZGVmaW5lIEJVRlNaIDIwNDgKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBpbnQgZmFpbGVkID0gMDsKKworc3RhdGljIHZvaWQKK2ZhaWwoY29uc3QgY2hhciAqbSkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgInNucHJpbnRmdGVzdDogJXNcbiIsIG0pOworCWZhaWxlZCA9IDE7Cit9CisKK2ludCB4X3NucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IGNvdW50LCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlzaXplX3QgcmV0OworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgZm10KTsKKwlyZXQgPSB2c25wcmludGYoc3RyLCBjb3VudCwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK21haW4odm9pZCkKK3sKKwljaGFyIGJbNV07CisJY2hhciAqc3JjOworCisJc25wcmludGYoYiw1LCIxMjM0NTY3ODkiKTsKKwlpZiAoYls0XSAhPSAnXDAnKQorCQlmYWlsKCJzbnByaW50ZiBkb2VzIG5vdCBjb3JyZWN0bHkgdGVybWluYXRlIGxvbmcgc3RyaW5ncyIpOworCisJLyogY2hlY2sgZm9yIHJlYWQgb3ZlcnJ1biBvbiB1bnRlcm1pbmF0ZWQgc3RyaW5nICovCisJaWYgKChzcmMgPSBtYWxsb2MoQlVGU1opKSA9PSBOVUxMKSB7CisJCWZhaWwoIm1hbGxvYyBmYWlsZWQiKTsKKwl9IGVsc2UgeworCQltZW1zZXQoc3JjLCAnYScsIEJVRlNaKTsKKwkJc25wcmludGYoYiwgc2l6ZW9mKGIpLCAiJS4qcyIsIDEsIHNyYyk7CisJCWlmIChzdHJjbXAoYiwgImEiKSAhPSAwKQorCQkJZmFpbCgiZmFpbGVkIHdpdGggbGVuZ3RoIGxpbWl0ICclJS5zJyIpOworCX0KKworCS8qIGNoZWNrIHRoYXQgc25wcmludGYgYW5kIHZzbnByaW50ZiByZXR1cm4gc2FuZSB2YWx1ZXMgKi8KKwlpZiAoc25wcmludGYoYiwgMSwgIiVzICVkIiwgImhlbGxvIiwgMTIzNDUpICE9IDExKQorCQlmYWlsKCJzbnByaW50ZiBkb2VzIG5vdCByZXR1cm4gcmVxdWlyZWQgbGVuZ3RoIik7CisJaWYgKHhfc25wcmludGYoYiwgMSwgIiVzICVkIiwgImhlbGxvIiwgMTIzNDUpICE9IDExKQorCQlmYWlsKCJ2c25wcmludGYgZG9lcyBub3QgcmV0dXJuIHJlcXVpcmVkIGxlbmd0aCIpOworCisJcmV0dXJuIGZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvcmVncmVzcy9zdHJkdXB0ZXN0LmMgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3JlZ3Jlc3Mvc3RyZHVwdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNmQ3NzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3JlZ3Jlc3Mvc3RyZHVwdGVzdC5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGFycmVuIFR1Y2tlcgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworc3RhdGljIGludCBmYWlsID0gMDsKKwordm9pZAordGVzdChjb25zdCBjaGFyICphKQoreworCWNoYXIgKmI7CisKKwliID0gc3RyZHVwKGEpOworCWlmIChiID09IDApIHsKKwkJZmFpbCA9IDE7CisJCXJldHVybjsKKwl9CisJaWYgKHN0cmNtcChhLCBiKSAhPSAwKQorCQlmYWlsID0gMTsKKwlmcmVlKGIpOworfQorCitpbnQKK21haW4odm9pZCkKK3sKKwl0ZXN0KCIiKTsKKwl0ZXN0KCJhIik7CisJdGVzdCgiXDAiKTsKKwl0ZXN0KCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIpOworCXJldHVybiBmYWlsOworfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9yZWdyZXNzL3N0cnRvbnVtdGVzdC5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9yZWdyZXNzL3N0cnRvbnVtdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwY2E1YmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3JlZ3Jlc3Mvc3RydG9udW10ZXN0LmMKQEAgLTAsMCArMSw4MCBAQAorLyoJJE9wZW5CU0Q6IHN0cnRvbnVtdGVzdC5jLHYgMS4xIDIwMDQvMDgvMDMgMjA6Mzg6MzYgb3R0byBFeHAgJAkqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBPdHRvIE1vZXJiZWVrIDxvdHRvQGRyaWpmLm5ldD4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKiBPUEVOQlNEIE9SSUdJTkFMOiByZWdyZXNzL2xpYi9saWJjL3N0cnRvbnVtL3N0cnRvbnVtdGVzdC5jICovCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiBMTE9OR19NQVggaXMga25vd24gYXMgTE9OR0xPTkdfTUFYIG9uIEFJWCAqLworI2lmIGRlZmluZWQoTE9OR0xPTkdfTUFYKSAmJiAhZGVmaW5lZChMTE9OR19NQVgpCisjIGRlZmluZSBMTE9OR19NQVggTE9OR0xPTkdfTUFYCisjIGRlZmluZSBMTE9OR19NSU4gTE9OR0xPTkdfTUlOCisjZW5kaWYKKworLyogTExPTkdfTUFYIGlzIGtub3duIGFzIExPTkdfTE9OR19NQVggb24gSFAtVVggKi8KKyNpZiBkZWZpbmVkKExPTkdfTE9OR19NQVgpICYmICFkZWZpbmVkKExMT05HX01BWCkKKyMgZGVmaW5lIExMT05HX01BWCBMT05HX0xPTkdfTUFYCisjIGRlZmluZSBMTE9OR19NSU4gTE9OR19MT05HX01JTgorI2VuZGlmCisKK2xvbmcgbG9uZyBzdHJ0b251bShjb25zdCBjaGFyICosIGxvbmcgbG9uZywgbG9uZyBsb25nLCBjb25zdCBjaGFyICoqKTsKKworaW50IGZhaWw7CisKK3ZvaWQKK3Rlc3QoY29uc3QgY2hhciAqcCwgbG9uZyBsb25nIGxiLCBsb25nIGxvbmcgdWIsIGludCBvaykKK3sKKwlsb25nIGxvbmcgdmFsOworCWNvbnN0IGNoYXIgKnE7CisKKwl2YWwgPSBzdHJ0b251bShwLCBsYiwgdWIsICZxKTsKKwlpZiAob2sgJiYgcSAhPSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXMgWyVsbGQtJWxsZF0gIiwgcCwgbGIsIHViKTsKKwkJZnByaW50ZihzdGRlcnIsICJOVU1CRVIgTk9UIEFDQ0VQVEVEICVzXG4iLCBxKTsKKwkJZmFpbCA9IDE7CisJfSBlbHNlIGlmICghb2sgJiYgcSA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXMgWyVsbGQtJWxsZF0gJWxsZCAiLCBwLCBsYiwgdWIsIHZhbCk7CisJCWZwcmludGYoc3RkZXJyLCAiTlVNQkVSIEFDQ0VQVEVEXG4iKTsKKwkJZmFpbCA9IDE7CisJfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXRlc3QoIjEiLCAwLCAxMCwgMSk7CisJdGVzdCgiMCIsIC0yLCA1LCAxKTsKKwl0ZXN0KCIwIiwgMiwgNSwgMCk7CisJdGVzdCgiMCIsIDIsIExMT05HX01BWCwgMCk7CisJdGVzdCgiLTIiLCAwLCBMTE9OR19NQVgsIDApOworCXRlc3QoIjAiLCAtNSwgTExPTkdfTUFYLCAxKTsKKwl0ZXN0KCItMyIsIC0zLCBMTE9OR19NQVgsIDEpOworCXRlc3QoIi05MjIzMzcyMDM2ODU0Nzc1ODA4IiwgTExPTkdfTUlOLCBMTE9OR19NQVgsIDEpOworCXRlc3QoIjkyMjMzNzIwMzY4NTQ3NzU4MDciLCBMTE9OR19NSU4sIExMT05HX01BWCwgMSk7CisJdGVzdCgiLTkyMjMzNzIwMzY4NTQ3NzU4MDkiLCBMTE9OR19NSU4sIExMT05HX01BWCwgMCk7CisJdGVzdCgiOTIyMzM3MjAzNjg1NDc3NTgwOCIsIExMT05HX01JTiwgTExPTkdfTUFYLCAwKTsKKwl0ZXN0KCIxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgTExPTkdfTUlOLCBMTE9OR19NQVgsIDApOworCXRlc3QoIi0xMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgTExPTkdfTUlOLCBMTE9OR19NQVgsIDApOworCXRlc3QoIi0yIiwgMTAsIC0xLCAwKTsKKwl0ZXN0KCItMiIsIC0xMCwgLTEsIDEpOworCXRlc3QoIi0yMCIsIC0xMCwgLTEsIDApOworCXRlc3QoIjIwIiwgLTEwLCAtMSwgMCk7CisKKwlyZXR1cm4gKGZhaWwpOworfQorCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3JyZXN2cG9ydC5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ycmVzdnBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2Q2MWU1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9ycmVzdnBvcnQuYwpAQCAtMCwwICsxLDEwOCBAQAorLyogJE9wZW5CU0Q6IHJyZXN2cG9ydC5jLHYgMS45IDIwMDUvMTEvMTAgMTA6MDA6MTcgZXNwaWUgRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYsIDE5OTggVGhlbyBkZSBSYWFkdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTMsIDE5OTQKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKiBPUEVOQlNEIE9SSUdJTkFMOiBsaWIvbGliYy9uZXQvcnJlc3Zwb3J0LmMgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpZm5kZWYgSEFWRV9SUkVTVlBPUlRfQUYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZiAwCitpbnQKK3JyZXN2cG9ydChpbnQgKmFscG9ydCkKK3sKKwlyZXR1cm4gcnJlc3Zwb3J0X2FmKGFscG9ydCwgQUZfSU5FVCk7Cit9CisjZW5kaWYKKworaW50CitycmVzdnBvcnRfYWYoaW50ICphbHBvcnQsIHNhX2ZhbWlseV90IGFmKQoreworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNzOworCXN0cnVjdCBzb2NrYWRkciAqc2E7CisJdV9pbnQxNl90ICpwb3J0cDsKKwlpbnQgczsKKwlzb2NrbGVuX3Qgc2FsZW47CisKKwltZW1zZXQoJnNzLCAnXDAnLCBzaXplb2Ygc3MpOworCXNhID0gKHN0cnVjdCBzb2NrYWRkciAqKSZzczsKKworCXN3aXRjaCAoYWYpIHsKKwljYXNlIEFGX0lORVQ6CisJCXNhbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJCXBvcnRwID0gJigoc3RydWN0IHNvY2thZGRyX2luICopc2EpLT5zaW5fcG9ydDsKKwkJYnJlYWs7CisJY2FzZSBBRl9JTkVUNjoKKwkJc2FsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisJCXBvcnRwID0gJigoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhKS0+c2luNl9wb3J0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJubyA9IEVQRk5PU1VQUE9SVDsKKwkJcmV0dXJuICgtMSk7CisJfQorCXNhLT5zYV9mYW1pbHkgPSBhZjsKKwkKKwlzID0gc29ja2V0KGFmLCBTT0NLX1NUUkVBTSwgMCk7CisJaWYgKHMgPCAwKQorCQlyZXR1cm4gKC0xKTsKKworCSpwb3J0cCA9IGh0b25zKCphbHBvcnQpOworCWlmICgqYWxwb3J0IDwgSVBQT1JUX1JFU0VSVkVEIC0gMSkgeworCQlpZiAoYmluZChzLCBzYSwgc2FsZW4pID49IDApCisJCQlyZXR1cm4gKHMpOworCQlpZiAoZXJybm8gIT0gRUFERFJJTlVTRSkgeworCQkJKHZvaWQpY2xvc2Uocyk7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCX0KKworCSpwb3J0cCA9IDA7CisJc2EtPnNhX2ZhbWlseSA9IGFmOworCWlmIChiaW5kcmVzdnBvcnRfc2Eocywgc2EpID09IC0xKSB7CisJCSh2b2lkKWNsb3NlKHMpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJKmFscG9ydCA9IG50b2hzKCpwb3J0cCk7CisJcmV0dXJuIChzKTsKK30KKworI2VuZGlmIC8qIEhBVkVfUlJFU1ZQT1JUX0FGICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3NldGVudi5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9zZXRlbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzNiNzAxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9zZXRlbnYuYwpAQCAtMCwwICsxLDIyNiBAQAorLyoJJE9wZW5CU0Q6IHNldGVudi5jLHYgMS4xMyAyMDEwLzA4LzIzIDIyOjMxOjUwIG1pbGxlcnQgRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODcgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvc3RkbGliL3NldGVudi5jICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaWYgIWRlZmluZWQoSEFWRV9TRVRFTlYpIHx8ICFkZWZpbmVkKEhBVkVfVU5TRVRFTlYpCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitleHRlcm4gY2hhciAqKmVudmlyb247CitzdGF0aWMgY2hhciAqKmxhc3RlbnY7CQkJCS8qIGxhc3QgdmFsdWUgb2YgZW52aXJvbiAqLworCisvKiBPcGVuU1NIIFBvcnRhYmxlOiBfX2ZpbmRlbnYgaXMgZnJvbSBnZXRlbnYuYyByZXYgMS44LCBtYWRlIHN0YXRpYyAqLworLyoKKyAqIF9fZmluZGVudiAtLQorICoJUmV0dXJucyBwb2ludGVyIHRvIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBuYW1lLCBpZiBhbnksIGVsc2UgTlVMTC4KKyAqCVN0YXJ0cyBzZWFyY2hpbmcgd2l0aGluIHRoZSBlbnZpcm9ubWVudGFsIGFycmF5IGF0IG9mZnNldC4KKyAqCVNldHMgb2Zmc2V0IHRvIGJlIHRoZSBvZmZzZXQgb2YgdGhlIG5hbWUvdmFsdWUgY29tYmluYXRpb24gaW4gdGhlCisgKgllbnZpcm9ubWVudGFsIGFycmF5LCBmb3IgdXNlIGJ5IHB1dGVudigzKSwgc2V0ZW52KDMpIGFuZCB1bnNldGVudigzKS4KKyAqCUV4cGxpY2l0bHkgcmVtb3ZlcyAnPScgaW4gYXJndW1lbnQgbmFtZS4KKyAqCisgKglUaGlzIHJvdXRpbmUgKnNob3VsZCogYmUgYSBzdGF0aWM7IGRvbid0IHVzZSBpdC4KKyAqLworc3RhdGljIGNoYXIgKgorX19maW5kZW52KGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sIGludCAqb2Zmc2V0KQoreworCWV4dGVybiBjaGFyICoqZW52aXJvbjsKKwlpbnQgaTsKKwljb25zdCBjaGFyICpucDsKKwljaGFyICoqcCwgKmNwOworCisJaWYgKG5hbWUgPT0gTlVMTCB8fCBlbnZpcm9uID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisJZm9yIChwID0gZW52aXJvbiArICpvZmZzZXQ7IChjcCA9ICpwKSAhPSBOVUxMOyArK3ApIHsKKwkJZm9yIChucCA9IG5hbWUsIGkgPSBsZW47IGkgJiYgKmNwOyBpLS0pCisJCQlpZiAoKmNwKysgIT0gKm5wKyspCisJCQkJYnJlYWs7CisJCWlmIChpID09IDAgJiYgKmNwKysgPT0gJz0nKSB7CisJCQkqb2Zmc2V0ID0gcCAtIGVudmlyb247CisJCQlyZXR1cm4gKGNwKTsKKwkJfQorCX0KKwlyZXR1cm4gKE5VTEwpOworfQorCisjaWYgMCAvKiBub3RoaW5nIHVzZXMgcHV0ZW52ICovCisvKgorICogcHV0ZW52IC0tCisgKglBZGQgYSBuYW1lPXZhbHVlIHN0cmluZyBkaXJlY3RseSB0byB0aGUgZW52aXJvbm1lbnRhbCwgcmVwbGFjaW5nCisgKglhbnkgY3VycmVudCB2YWx1ZS4KKyAqLworaW50CitwdXRlbnYoY2hhciAqc3RyKQoreworCWNoYXIgKipQLCAqY3A7CisJc2l6ZV90IGNudDsKKwlpbnQgb2Zmc2V0ID0gMDsKKworCWZvciAoY3AgPSBzdHI7ICpjcCAmJiAqY3AgIT0gJz0nOyArK2NwKQorCQk7CisJaWYgKCpjcCAhPSAnPScpIHsKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiAoLTEpOwkJCS8qIG1pc3NpbmcgYD0nIGluIHN0cmluZyAqLworCX0KKworCWlmIChfX2ZpbmRlbnYoc3RyLCAoaW50KShjcCAtIHN0ciksICZvZmZzZXQpICE9IE5VTEwpIHsKKwkJZW52aXJvbltvZmZzZXQrK10gPSBzdHI7CisJCS8qIGNvdWxkIGJlIHNldCBtdWx0aXBsZSB0aW1lcyAqLworCQl3aGlsZSAoX19maW5kZW52KHN0ciwgKGludCkoY3AgLSBzdHIpLCAmb2Zmc2V0KSkgeworCQkJZm9yIChQID0gJmVudmlyb25bb2Zmc2V0XTs7ICsrUCkKKwkJCQlpZiAoISgqUCA9ICooUCArIDEpKSkKKwkJCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuICgwKTsKKwl9CisKKwkvKiBjcmVhdGUgbmV3IHNsb3QgZm9yIHN0cmluZyAqLworCWZvciAoUCA9IGVudmlyb247ICpQICE9IE5VTEw7IFArKykKKwkJOworCWNudCA9IFAgLSBlbnZpcm9uOworCVAgPSAoY2hhciAqKilyZWFsbG9jKGxhc3RlbnYsIHNpemVvZihjaGFyICopICogKGNudCArIDIpKTsKKwlpZiAoIVApCisJCXJldHVybiAoLTEpOworCWlmIChsYXN0ZW52ICE9IGVudmlyb24pCisJCW1lbWNweShQLCBlbnZpcm9uLCBjbnQgKiBzaXplb2YoY2hhciAqKSk7CisJbGFzdGVudiA9IGVudmlyb24gPSBQOworCWVudmlyb25bY250XSA9IHN0cjsKKwllbnZpcm9uW2NudCArIDFdID0gTlVMTDsKKwlyZXR1cm4gKDApOworfQorCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NFVEVOVgorLyoKKyAqIHNldGVudiAtLQorICoJU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnRhbCB2YXJpYWJsZSAibmFtZSIgdG8gYmUKKyAqCSJ2YWx1ZSIuICBJZiByZXdyaXRlIGlzIHNldCwgcmVwbGFjZSBhbnkgY3VycmVudCB2YWx1ZS4KKyAqLworaW50CitzZXRlbnYoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIGludCByZXdyaXRlKQoreworCWNoYXIgKkMsICoqUDsKKwljb25zdCBjaGFyICpucDsKKwlpbnQgbF92YWx1ZSwgb2Zmc2V0ID0gMDsKKworCWZvciAobnAgPSBuYW1lOyAqbnAgJiYgKm5wICE9ICc9JzsgKytucCkKKwkJOworI2lmZGVmIG5vdHlldAorCWlmICgqbnApIHsKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiAoLTEpOwkJCS8qIGhhcyBgPScgaW4gbmFtZSAqLworCX0KKyNlbmRpZgorCisJbF92YWx1ZSA9IHN0cmxlbih2YWx1ZSk7CisJaWYgKChDID0gX19maW5kZW52KG5hbWUsIChpbnQpKG5wIC0gbmFtZSksICZvZmZzZXQpKSAhPSBOVUxMKSB7CisJCWludCB0bXBvZmYgPSBvZmZzZXQgKyAxOworCQlpZiAoIXJld3JpdGUpCisJCQlyZXR1cm4gKDApOworI2lmIDAgLyogWFhYIC0gZXhpc3RpbmcgZW50cnkgbWF5IG5vdCBiZSB3cml0YWJsZSAqLworCQlpZiAoc3RybGVuKEMpID49IGxfdmFsdWUpIHsJLyogb2xkIGxhcmdlcjsgY29weSBvdmVyICovCisJCQl3aGlsZSAoKCpDKysgPSAqdmFsdWUrKykpCisJCQkJOworCQkJcmV0dXJuICgwKTsKKwkJfQorI2VuZGlmCisJCS8qIGNvdWxkIGJlIHNldCBtdWx0aXBsZSB0aW1lcyAqLworCQl3aGlsZSAoX19maW5kZW52KG5hbWUsIChpbnQpKG5wIC0gbmFtZSksICZ0bXBvZmYpKSB7CisJCQlmb3IgKFAgPSAmZW52aXJvblt0bXBvZmZdOzsgKytQKQorCQkJCWlmICghKCpQID0gKihQICsgMSkpKQorCQkJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CQkJCQkvKiBjcmVhdGUgbmV3IHNsb3QgKi8KKwkJc2l6ZV90IGNudDsKKworCQlmb3IgKFAgPSBlbnZpcm9uOyAqUCAhPSBOVUxMOyBQKyspCisJCQk7CisJCWNudCA9IFAgLSBlbnZpcm9uOworCQlQID0gKGNoYXIgKiopcmVhbGxvYyhsYXN0ZW52LCBzaXplb2YoY2hhciAqKSAqIChjbnQgKyAyKSk7CisJCWlmICghUCkKKwkJCXJldHVybiAoLTEpOworCQlpZiAobGFzdGVudiAhPSBlbnZpcm9uKQorCQkJbWVtY3B5KFAsIGVudmlyb24sIGNudCAqIHNpemVvZihjaGFyICopKTsKKwkJbGFzdGVudiA9IGVudmlyb24gPSBQOworCQlvZmZzZXQgPSBjbnQ7CisJCWVudmlyb25bY250ICsgMV0gPSBOVUxMOworCX0KKwlpZiAoIShlbnZpcm9uW29mZnNldF0gPQkJCS8qIG5hbWUgKyBgPScgKyB2YWx1ZSAqLworCSAgICBtYWxsb2MoKHNpemVfdCkoKGludCkobnAgLSBuYW1lKSArIGxfdmFsdWUgKyAyKSkpKQorCQlyZXR1cm4gKC0xKTsKKwlmb3IgKEMgPSBlbnZpcm9uW29mZnNldF07ICgqQyA9ICpuYW1lKyspICYmICpDICE9ICc9JzsgKytDKQorCQk7CisJZm9yICgqQysrID0gJz0nOyAoKkMrKyA9ICp2YWx1ZSsrKTsgKQorCQk7CisJcmV0dXJuICgwKTsKK30KKworI2VuZGlmIC8qIEhBVkVfU0VURU5WICovCisKKyNpZm5kZWYgSEFWRV9VTlNFVEVOVgorLyoKKyAqIHVuc2V0ZW52KG5hbWUpIC0tCisgKglEZWxldGUgZW52aXJvbm1lbnRhbCB2YXJpYWJsZSAibmFtZSIuCisgKi8KK2ludAordW5zZXRlbnYoY29uc3QgY2hhciAqbmFtZSkKK3sKKwljaGFyICoqUDsKKwljb25zdCBjaGFyICpucDsKKwlpbnQgb2Zmc2V0ID0gMDsKKworCWlmICghbmFtZSB8fCAhKm5hbWUpIHsKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiAoLTEpOworCX0KKwlmb3IgKG5wID0gbmFtZTsgKm5wICYmICpucCAhPSAnPSc7ICsrbnApCisJCTsKKwlpZiAoKm5wKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gKC0xKTsJCQkvKiBoYXMgYD0nIGluIG5hbWUgKi8KKwl9CisKKwkvKiBjb3VsZCBiZSBzZXQgbXVsdGlwbGUgdGltZXMgKi8KKwl3aGlsZSAoX19maW5kZW52KG5hbWUsIChpbnQpKG5wIC0gbmFtZSksICZvZmZzZXQpKSB7CisJCWZvciAoUCA9ICZlbnZpcm9uW29mZnNldF07OyArK1ApCisJCQlpZiAoISgqUCA9ICooUCArIDEpKSkKKwkJCQlicmVhazsKKwl9CisJcmV0dXJuICgwKTsKK30KKyNlbmRpZiAvKiBIQVZFX1VOU0VURU5WICovCisKKyNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX1NFVEVOVikgfHwgIWRlZmluZWQoSEFWRV9VTlNFVEVOVikgKi8KKwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9zZXRwcm9jdGl0bGUuYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvc2V0cHJvY3RpdGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk2NWY2OAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvc2V0cHJvY3RpdGxlLmMKQEAgLTAsMCArMSwxNjQgQEAKKy8qIEJhc2VkIG9uIGNvbmYuYyBmcm9tIFVDQiBzZW5kbWFpbCA4LjguOCAqLworCisvKgorICogQ29weXJpZ2h0IDIwMDMgRGFtaWVuIE1pbGxlcgorICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTk1LTE5OTcgRXJpYyBQLiBBbGxtYW4KKyAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaWZuZGVmIEhBVkVfU0VUUFJPQ1RJVExFCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZmRlZiBIQVZFX1NZU19QU1RBVF9ICisjaW5jbHVkZSA8c3lzL3BzdGF0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHZpcy5oPgorCisjZGVmaW5lIFNQVF9OT05FCTAJLyogZG9uJ3QgdXNlIGl0IGF0IGFsbCAqLworI2RlZmluZSBTUFRfUFNUQVQJMQkvKiB1c2UgcHN0YXQoUFNUQVRfU0VUQ01ELCAuLi4pICovCisjZGVmaW5lIFNQVF9SRVVTRUFSR1YJMgkvKiBjb3ZlciBhcmd2IHdpdGggdGl0bGUgaW5mb3JtYXRpb24gKi8KKworI2lmbmRlZiBTUFRfVFlQRQorIyBkZWZpbmUgU1BUX1RZUEUJU1BUX05PTkUKKyNlbmRpZgorCisjaWZuZGVmIFNQVF9QQURDSEFSCisjIGRlZmluZSBTUFRfUEFEQ0hBUgknXDAnCisjZW5kaWYKKworI2lmIFNQVF9UWVBFID09IFNQVF9SRVVTRUFSR1YKK3N0YXRpYyBjaGFyICphcmd2X3N0YXJ0ID0gTlVMTDsKK3N0YXRpYyBzaXplX3QgYXJndl9lbnZfbGVuID0gMDsKKyNlbmRpZgorCisjZW5kaWYgLyogSEFWRV9TRVRQUk9DVElUTEUgKi8KKwordm9pZAorY29tcGF0X2luaXRfc2V0cHJvY3RpdGxlKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisjaWYgZGVmaW5lZChTUFRfVFlQRSkgJiYgU1BUX1RZUEUgPT0gU1BUX1JFVVNFQVJHVgorCWV4dGVybiBjaGFyICoqZW52aXJvbjsKKwljaGFyICpsYXN0YXJndiA9IE5VTEw7CisJY2hhciAqKmVudnAgPSBlbnZpcm9uOworCWludCBpOworCisJLyoKKwkgKiBOQjogVGhpcyBhc3N1bWVzIHRoYXQgYXJndiBoYXMgYWxyZWFkeSBiZWVuIGNvcGllZCBvdXQgb2YgdGhlCisJICogd2F5LiBUaGlzIGlzIHRydWUgZm9yIHNzaGQsIGJ1dCBtYXkgbm90IGJlIHRydWUgZm9yIG90aGVyIAorCSAqIHByb2dyYW1zLiBCZXdhcmUuCisJICovCisKKwlpZiAoYXJnYyA9PSAwIHx8IGFyZ3ZbMF0gPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogRmFpbCBpZiB3ZSBjYW4ndCBhbGxvY2F0ZSByb29tIGZvciB0aGUgbmV3IGVudmlyb25tZW50ICovCisJZm9yIChpID0gMDsgZW52cFtpXSAhPSBOVUxMOyBpKyspCisJCTsKKwlpZiAoKGVudmlyb24gPSBjYWxsb2MoaSArIDEsIHNpemVvZigqZW52aXJvbikpKSA9PSBOVUxMKSB7CisJCWVudmlyb24gPSBlbnZwOwkvKiBwdXQgaXQgYmFjayAqLworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBGaW5kIHRoZSBsYXN0IGFyZ3Ygc3RyaW5nIG9yIGVudmlyb25tZW50IHZhcmlhYmxlIHdpdGhpbiAKKwkgKiBvdXIgcHJvY2VzcyBtZW1vcnkgYXJlYS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisJCWlmIChsYXN0YXJndiA9PSBOVUxMIHx8IGxhc3Rhcmd2ICsgMSA9PSBhcmd2W2ldKQorCQkJbGFzdGFyZ3YgPSBhcmd2W2ldICsgc3RybGVuKGFyZ3ZbaV0pOworCX0KKwlmb3IgKGkgPSAwOyBlbnZwW2ldICE9IE5VTEw7IGkrKykgeworCQlpZiAobGFzdGFyZ3YgKyAxID09IGVudnBbaV0pCisJCQlsYXN0YXJndiA9IGVudnBbaV0gKyBzdHJsZW4oZW52cFtpXSk7CisJfQorCisJYXJndlsxXSA9IE5VTEw7CisJYXJndl9zdGFydCA9IGFyZ3ZbMF07CisJYXJndl9lbnZfbGVuID0gbGFzdGFyZ3YgLSBhcmd2WzBdIC0gMTsKKworCS8qIAorCSAqIENvcHkgZW52aXJvbm1lbnQgCisJICogWFhYIC0gd2lsbCB0cnVuY2F0ZSBlbnYgb24gc3RyZHVwIGZhaWwKKwkgKi8KKwlmb3IgKGkgPSAwOyBlbnZwW2ldICE9IE5VTEw7IGkrKykKKwkJZW52aXJvbltpXSA9IHN0cmR1cChlbnZwW2ldKTsKKwllbnZpcm9uW2ldID0gTlVMTDsKKyNlbmRpZiAvKiBTUFRfUkVVU0VBUkdWICovCit9CisKKyNpZm5kZWYgSEFWRV9TRVRQUk9DVElUTEUKK3ZvaWQKK3NldHByb2N0aXRsZShjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyNpZiBTUFRfVFlQRSAhPSBTUFRfTk9ORQorCXZhX2xpc3QgYXA7CisJY2hhciBidWZbMTAyNF0sIHB0aXRsZVsxMDI0XTsKKwlzaXplX3QgbGVuOworCWV4dGVybiBjaGFyICpfX3Byb2duYW1lOworI2lmIFNQVF9UWVBFID09IFNQVF9QU1RBVAorCXVuaW9uIHBzdHVuIHBzdDsKKyNlbmRpZgorCisjaWYgU1BUX1RZUEUgPT0gU1BUX1JFVVNFQVJHVgorCWlmIChhcmd2X2Vudl9sZW4gPD0gMCkKKwkJcmV0dXJuOworI2VuZGlmCisKKwlzdHJsY3B5KGJ1ZiwgX19wcm9nbmFtZSwgc2l6ZW9mKGJ1ZikpOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJaWYgKGZtdCAhPSBOVUxMKSB7CisJCWxlbiA9IHN0cmxjYXQoYnVmLCAiOiAiLCBzaXplb2YoYnVmKSk7CisJCWlmIChsZW4gPCBzaXplb2YoYnVmKSkKKwkJCXZzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuICwgZm10LCBhcCk7CisJfQorCXZhX2VuZChhcCk7CisJc3RybnZpcyhwdGl0bGUsIGJ1Ziwgc2l6ZW9mKHB0aXRsZSksCisJICAgIFZJU19DU1RZTEV8VklTX05MfFZJU19UQUJ8VklTX09DVEFMKTsKKworI2lmIFNQVF9UWVBFID09IFNQVF9QU1RBVAorCXBzdC5wc3RfY29tbWFuZCA9IHB0aXRsZTsKKwlwc3RhdChQU1RBVF9TRVRDTUQsIHBzdCwgc3RybGVuKHB0aXRsZSksIDAsIDApOworI2VsaWYgU1BUX1RZUEUgPT0gU1BUX1JFVVNFQVJHVgorLyoJZGVidWcoInNldHByb2N0aXRsZTogY29weSBcIiVzXCIgaW50byBsZW4gJWQiLCAKKwkgICAgYnVmLCBhcmd2X2Vudl9sZW4pOyAqLworCWxlbiA9IHN0cmxjcHkoYXJndl9zdGFydCwgcHRpdGxlLCBhcmd2X2Vudl9sZW4pOworCWZvcig7IGxlbiA8IGFyZ3ZfZW52X2xlbjsgbGVuKyspCisJCWFyZ3Zfc3RhcnRbbGVuXSA9IFNQVF9QQURDSEFSOworI2VuZGlmCisKKyNlbmRpZiAvKiBTUFRfTk9ORSAqLworfQorCisjZW5kaWYgLyogSEFWRV9TRVRQUk9DVElUTEUgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvc2hhMi5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9zaGEyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjViZjc0ZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvc2hhMi5jCkBAIC0wLDAgKzEsODgyIEBACisvKglmcm9tIE9wZW5CU0Q6IHNoYTIuYyx2IDEuMTEgMjAwNS8wOC8wOCAwODowNTozNSBlc3BpZSBFeHAgCSovCisKKy8qCisgKiBGSUxFOglzaGEyLmMKKyAqIEFVVEhPUjoJQWFyb24gRC4gR2lmZm9yZCA8bWVAYWFyb25naWZmb3JkLmNvbT4KKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEsIEFhcm9uIEQuIEdpZmZvcmQKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgbmFtZXMgb2YgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SKFMpIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUihTKSBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyb206IHNoYTIuYyx2IDEuMSAyMDAxLzExLzA4IDAwOjAxOjUxIGFkZyBFeHAgYWRnICQKKyAqLworCisvKiBPUEVOQlNEIE9SSUdJTkFMOiBsaWIvbGliYy9oYXNoL3NoYTIuYyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbHYuaD4KKworI2lmICFkZWZpbmVkKEhBVkVfRVZQX1NIQTI1NikgJiYgIWRlZmluZWQoSEFWRV9TSEEyNTZfVVBEQVRFKSAmJiBcCisgICAgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwNzAwMEwpCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAic2hhMi5oIgorCisvKgorICogVU5ST0xMRUQgVFJBTlNGT1JNIExPT1AgTk9URToKKyAqIFlvdSBjYW4gZGVmaW5lIFNIQTJfVU5ST0xMX1RSQU5TRk9STSB0byB1c2UgdGhlIHVucm9sbGVkIHRyYW5zZm9ybQorICogbG9vcCB2ZXJzaW9uIGZvciB0aGUgaGFzaCB0cmFuc2Zvcm0gcm91bmRzIChkZWZpbmVkIHVzaW5nIG1hY3JvcworICogbGF0ZXIgaW4gdGhpcyBmaWxlKS4gIEVpdGhlciBkZWZpbmUgb24gdGhlIGNvbW1hbmQgbGluZSwgZm9yIGV4YW1wbGU6CisgKgorICogICBjYyAtRFNIQTJfVU5ST0xMX1RSQU5TRk9STSAtbyBzaGEyIHNoYTIuYyBzaGEycHJvZy5jCisgKgorICogb3IgZGVmaW5lIGJlbG93OgorICoKKyAqICAgI2RlZmluZSBTSEEyX1VOUk9MTF9UUkFOU0ZPUk0KKyAqCisgKi8KKworLyoqKiBTSEEtMjU2LzM4NC81MTIgTWFjaGluZSBBcmNoaXRlY3R1cmUgRGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKiovCisvKgorICogQllURV9PUkRFUiBOT1RFOgorICoKKyAqIFBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3VyIHN5c3RlbSBkZWZpbmVzIEJZVEVfT1JERVIuICBJZiB5b3VyCisgKiBhcmNoaXRlY3R1cmUgaXMgbGl0dGxlLWVuZGlhbiwgbWFrZSBzdXJlIGl0IGFsc28gZGVmaW5lcworICogTElUVExFX0VORElBTiBhbmQgdGhhdCB0aGUgdHdvIChCWVRFX09SREVSIGFuZCBMSVRUTEVfRU5ESUFOKSBhcmUKKyAqIGVxdWl2aWxlbnQuCisgKgorICogSWYgeW91ciBzeXN0ZW0gZG9lcyBub3QgZGVmaW5lIHRoZSBhYm92ZSwgdGhlbiB5b3UgY2FuIGRvIHNvIGJ5CisgKiBoYW5kIGxpa2UgdGhpczoKKyAqCisgKiAgICNkZWZpbmUgTElUVExFX0VORElBTiAxMjM0CisgKiAgICNkZWZpbmUgQklHX0VORElBTiAgICA0MzIxCisgKgorICogQW5kIGZvciBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzLCBhZGQ6CisgKgorICogICAjZGVmaW5lIEJZVEVfT1JERVIgTElUVExFX0VORElBTiAKKyAqCisgKiBPciBmb3IgYmlnLWVuZGlhbiBtYWNoaW5lczoKKyAqCisgKiAgICNkZWZpbmUgQllURV9PUkRFUiBCSUdfRU5ESUFOCisgKgorICogVGhlIEZyZWVCU0QgbWFjaGluZSB0aGlzIHdhcyB3cml0dGVuIG9uIGRlZmluZXMgQllURV9PUkRFUgorICogYXBwcm9wcmlhdGVseSBieSBpbmNsdWRpbmcgPHN5cy90eXBlcy5oPiAod2hpY2ggaW4gdHVybiBpbmNsdWRlcworICogPG1hY2hpbmUvZW5kaWFuLmg+IHdoZXJlIHRoZSBhcHByb3ByaWF0ZSBkZWZpbml0aW9ucyBhcmUgYWN0dWFsbHkKKyAqIG1hZGUpLgorICovCisjaWYgIWRlZmluZWQoQllURV9PUkRFUikgfHwgKEJZVEVfT1JERVIgIT0gTElUVExFX0VORElBTiAmJiBCWVRFX09SREVSICE9IEJJR19FTkRJQU4pCisjZXJyb3IgRGVmaW5lIEJZVEVfT1JERVIgdG8gYmUgZXF1YWwgdG8gZWl0aGVyIExJVFRMRV9FTkRJQU4gb3IgQklHX0VORElBTgorI2VuZGlmCisKKworLyoqKiBTSEEtMjU2LzM4NC81MTIgVmFyaW91cyBMZW5ndGggRGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBOT1RFOiBNb3N0IG9mIHRoZXNlIGFyZSBpbiBzaGEyLmggKi8KKyNkZWZpbmUgU0hBMjU2X1NIT1JUX0JMT0NLX0xFTkdUSAkoU0hBMjU2X0JMT0NLX0xFTkdUSCAtIDgpCisjZGVmaW5lIFNIQTM4NF9TSE9SVF9CTE9DS19MRU5HVEgJKFNIQTM4NF9CTE9DS19MRU5HVEggLSAxNikKKyNkZWZpbmUgU0hBNTEyX1NIT1JUX0JMT0NLX0xFTkdUSAkoU0hBNTEyX0JMT0NLX0xFTkdUSCAtIDE2KQorCisvKioqIEVORElBTiBTUEVDSUZJQyBDT1BZIE1BQ1JPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQkVfOF9UT18zMihkc3QsIGNwKSBkbyB7CQkJCQlcCisJKGRzdCkgPSAodV9pbnQzMl90KShjcClbM10gfCAoKHVfaW50MzJfdCkoY3ApWzJdIDw8IDgpIHwJXAorCSAgICAoKHVfaW50MzJfdCkoY3ApWzFdIDw8IDE2KSB8ICgodV9pbnQzMl90KShjcClbMF0gPDwgMjQpOwlcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgQkVfOF9UT182NChkc3QsIGNwKSBkbyB7CQkJCQlcCisJKGRzdCkgPSAodV9pbnQ2NF90KShjcClbN10gfCAoKHVfaW50NjRfdCkoY3ApWzZdIDw8IDgpIHwJXAorCSAgICAoKHVfaW50NjRfdCkoY3ApWzVdIDw8IDE2KSB8ICgodV9pbnQ2NF90KShjcClbNF0gPDwgMjQpIHwJXAorCSAgICAoKHVfaW50NjRfdCkoY3ApWzNdIDw8IDMyKSB8ICgodV9pbnQ2NF90KShjcClbMl0gPDwgNDApIHwJXAorCSAgICAoKHVfaW50NjRfdCkoY3ApWzFdIDw8IDQ4KSB8ICgodV9pbnQ2NF90KShjcClbMF0gPDwgNTYpOwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEJFXzY0X1RPXzgoY3AsIHNyYykgZG8gewkJCQkJXAorCShjcClbMF0gPSAoc3JjKSA+PiA1NjsJCQkJCQlcCisgICAgICAgIChjcClbMV0gPSAoc3JjKSA+PiA0ODsJCQkJCQlcCisJKGNwKVsyXSA9IChzcmMpID4+IDQwOwkJCQkJCVwKKwkoY3ApWzNdID0gKHNyYykgPj4gMzI7CQkJCQkJXAorCShjcClbNF0gPSAoc3JjKSA+PiAyNDsJCQkJCQlcCisJKGNwKVs1XSA9IChzcmMpID4+IDE2OwkJCQkJCVwKKwkoY3ApWzZdID0gKHNyYykgPj4gODsJCQkJCQlcCisJKGNwKVs3XSA9IChzcmMpOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQkVfMzJfVE9fOChjcCwgc3JjKSBkbyB7CQkJCQlcCisJKGNwKVswXSA9IChzcmMpID4+IDI0OwkJCQkJCVwKKwkoY3ApWzFdID0gKHNyYykgPj4gMTY7CQkJCQkJXAorCShjcClbMl0gPSAoc3JjKSA+PiA4OwkJCQkJCVwKKwkoY3ApWzNdID0gKHNyYyk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIE1hY3JvIGZvciBpbmNyZW1lbnRhbGx5IGFkZGluZyB0aGUgdW5zaWduZWQgNjQtYml0IGludGVnZXIgbiB0byB0aGUKKyAqIHVuc2lnbmVkIDEyOC1iaXQgaW50ZWdlciAocmVwcmVzZW50ZWQgdXNpbmcgYSB0d28tZWxlbWVudCBhcnJheSBvZgorICogNjQtYml0IHdvcmRzKToKKyAqLworI2RlZmluZSBBRERJTkMxMjgodyxuKSBkbyB7CQkJCQkJXAorCSh3KVswXSArPSAodV9pbnQ2NF90KShuKTsJCQkJCVwKKwlpZiAoKHcpWzBdIDwgKG4pKSB7CQkJCQkJXAorCQkodylbMV0rKzsJCQkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyoqKiBUSEUgU0lYIExPR0lDQUwgRlVOQ1RJT05TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQml0IHNoaWZ0aW5nIGFuZCByb3RhdGlvbiAodXNlZCBieSB0aGUgc2l4IFNIQS1YWVogbG9naWNhbCBmdW5jdGlvbnM6CisgKgorICogICBOT1RFOiAgVGhlIG5hbWluZyBvZiBSIGFuZCBTIGFwcGVhcnMgYmFja3dhcmRzIGhlcmUgKFIgaXMgYSBTSElGVCBhbmQKKyAqICAgUyBpcyBhIFJPVEFUSU9OKSBiZWNhdXNlIHRoZSBTSEEtMjU2LzM4NC81MTIgZGVzY3JpcHRpb24gZG9jdW1lbnQKKyAqICAgKHNlZSBodHRwOi8vY3NyYy5uaXN0Lmdvdi9jcnlwdHZhbC9zaHMvc2hhMjU2LTM4NC01MTIucGRmKSB1c2VzIHRoaXMKKyAqICAgc2FtZSAiYmFja3dhcmRzIiBkZWZpbml0aW9uLgorICovCisvKiBTaGlmdC1yaWdodCAodXNlZCBpbiBTSEEtMjU2LCBTSEEtMzg0LCBhbmQgU0hBLTUxMik6ICovCisjZGVmaW5lIFIoYix4KSAJCSgoeCkgPj4gKGIpKQorLyogMzItYml0IFJvdGF0ZS1yaWdodCAodXNlZCBpbiBTSEEtMjU2KTogKi8KKyNkZWZpbmUgUzMyKGIseCkJKCgoeCkgPj4gKGIpKSB8ICgoeCkgPDwgKDMyIC0gKGIpKSkpCisvKiA2NC1iaXQgUm90YXRlLXJpZ2h0ICh1c2VkIGluIFNIQS0zODQgYW5kIFNIQS01MTIpOiAqLworI2RlZmluZSBTNjQoYix4KQkoKCh4KSA+PiAoYikpIHwgKCh4KSA8PCAoNjQgLSAoYikpKSkKKworLyogVHdvIG9mIHNpeCBsb2dpY2FsIGZ1bmN0aW9ucyB1c2VkIGluIFNIQS0yNTYsIFNIQS0zODQsIGFuZCBTSEEtNTEyOiAqLworI2RlZmluZSBDaCh4LHkseikJKCgoeCkgJiAoeSkpIF4gKCh+KHgpKSAmICh6KSkpCisjZGVmaW5lIE1haih4LHkseikJKCgoeCkgJiAoeSkpIF4gKCh4KSAmICh6KSkgXiAoKHkpICYgKHopKSkKKworLyogRm91ciBvZiBzaXggbG9naWNhbCBmdW5jdGlvbnMgdXNlZCBpbiBTSEEtMjU2OiAqLworI2RlZmluZSBTaWdtYTBfMjU2KHgpCShTMzIoMiwgICh4KSkgXiBTMzIoMTMsICh4KSkgXiBTMzIoMjIsICh4KSkpCisjZGVmaW5lIFNpZ21hMV8yNTYoeCkJKFMzMig2LCAgKHgpKSBeIFMzMigxMSwgKHgpKSBeIFMzMigyNSwgKHgpKSkKKyNkZWZpbmUgc2lnbWEwXzI1Nih4KQkoUzMyKDcsICAoeCkpIF4gUzMyKDE4LCAoeCkpIF4gUigzICwgICAoeCkpKQorI2RlZmluZSBzaWdtYTFfMjU2KHgpCShTMzIoMTcsICh4KSkgXiBTMzIoMTksICh4KSkgXiBSKDEwLCAgICh4KSkpCisKKy8qIEZvdXIgb2Ygc2l4IGxvZ2ljYWwgZnVuY3Rpb25zIHVzZWQgaW4gU0hBLTM4NCBhbmQgU0hBLTUxMjogKi8KKyNkZWZpbmUgU2lnbWEwXzUxMih4KQkoUzY0KDI4LCAoeCkpIF4gUzY0KDM0LCAoeCkpIF4gUzY0KDM5LCAoeCkpKQorI2RlZmluZSBTaWdtYTFfNTEyKHgpCShTNjQoMTQsICh4KSkgXiBTNjQoMTgsICh4KSkgXiBTNjQoNDEsICh4KSkpCisjZGVmaW5lIHNpZ21hMF81MTIoeCkJKFM2NCggMSwgKHgpKSBeIFM2NCggOCwgKHgpKSBeIFIoIDcsICAgKHgpKSkKKyNkZWZpbmUgc2lnbWExXzUxMih4KQkoUzY0KDE5LCAoeCkpIF4gUzY0KDYxLCAoeCkpIF4gUiggNiwgICAoeCkpKQorCisKKy8qKiogU0hBLVhZWiBJTklUSUFMIEhBU0ggVkFMVUVTIEFORCBDT05TVEFOVFMgKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSGFzaCBjb25zdGFudCB3b3JkcyBLIGZvciBTSEEtMjU2OiAqLworY29uc3Qgc3RhdGljIHVfaW50MzJfdCBLMjU2WzY0XSA9IHsKKwkweDQyOGEyZjk4VUwsIDB4NzEzNzQ0OTFVTCwgMHhiNWMwZmJjZlVMLCAweGU5YjVkYmE1VUwsCisJMHgzOTU2YzI1YlVMLCAweDU5ZjExMWYxVUwsIDB4OTIzZjgyYTRVTCwgMHhhYjFjNWVkNVVMLAorCTB4ZDgwN2FhOThVTCwgMHgxMjgzNWIwMVVMLCAweDI0MzE4NWJlVUwsIDB4NTUwYzdkYzNVTCwKKwkweDcyYmU1ZDc0VUwsIDB4ODBkZWIxZmVVTCwgMHg5YmRjMDZhN1VMLCAweGMxOWJmMTc0VUwsCisJMHhlNDliNjljMVVMLCAweGVmYmU0Nzg2VUwsIDB4MGZjMTlkYzZVTCwgMHgyNDBjYTFjY1VMLAorCTB4MmRlOTJjNmZVTCwgMHg0YTc0ODRhYVVMLCAweDVjYjBhOWRjVUwsIDB4NzZmOTg4ZGFVTCwKKwkweDk4M2U1MTUyVUwsIDB4YTgzMWM2NmRVTCwgMHhiMDAzMjdjOFVMLCAweGJmNTk3ZmM3VUwsCisJMHhjNmUwMGJmM1VMLCAweGQ1YTc5MTQ3VUwsIDB4MDZjYTYzNTFVTCwgMHgxNDI5Mjk2N1VMLAorCTB4MjdiNzBhODVVTCwgMHgyZTFiMjEzOFVMLCAweDRkMmM2ZGZjVUwsIDB4NTMzODBkMTNVTCwKKwkweDY1MGE3MzU0VUwsIDB4NzY2YTBhYmJVTCwgMHg4MWMyYzkyZVVMLCAweDkyNzIyYzg1VUwsCisJMHhhMmJmZThhMVVMLCAweGE4MWE2NjRiVUwsIDB4YzI0YjhiNzBVTCwgMHhjNzZjNTFhM1VMLAorCTB4ZDE5MmU4MTlVTCwgMHhkNjk5MDYyNFVMLCAweGY0MGUzNTg1VUwsIDB4MTA2YWEwNzBVTCwKKwkweDE5YTRjMTE2VUwsIDB4MWUzNzZjMDhVTCwgMHgyNzQ4Nzc0Y1VMLCAweDM0YjBiY2I1VUwsCisJMHgzOTFjMGNiM1VMLCAweDRlZDhhYTRhVUwsIDB4NWI5Y2NhNGZVTCwgMHg2ODJlNmZmM1VMLAorCTB4NzQ4ZjgyZWVVTCwgMHg3OGE1NjM2ZlVMLCAweDg0Yzg3ODE0VUwsIDB4OGNjNzAyMDhVTCwKKwkweDkwYmVmZmZhVUwsIDB4YTQ1MDZjZWJVTCwgMHhiZWY5YTNmN1VMLCAweGM2NzE3OGYyVUwKK307CisKKy8qIEluaXRpYWwgaGFzaCB2YWx1ZSBIIGZvciBTSEEtMjU2OiAqLworY29uc3Qgc3RhdGljIHVfaW50MzJfdCBzaGEyNTZfaW5pdGlhbF9oYXNoX3ZhbHVlWzhdID0geworCTB4NmEwOWU2NjdVTCwKKwkweGJiNjdhZTg1VUwsCisJMHgzYzZlZjM3MlVMLAorCTB4YTU0ZmY1M2FVTCwKKwkweDUxMGU1MjdmVUwsCisJMHg5YjA1Njg4Y1VMLAorCTB4MWY4M2Q5YWJVTCwKKwkweDViZTBjZDE5VUwKK307CisKKy8qIEhhc2ggY29uc3RhbnQgd29yZHMgSyBmb3IgU0hBLTM4NCBhbmQgU0hBLTUxMjogKi8KK2NvbnN0IHN0YXRpYyB1X2ludDY0X3QgSzUxMls4MF0gPSB7CisJMHg0MjhhMmY5OGQ3MjhhZTIyVUxMLCAweDcxMzc0NDkxMjNlZjY1Y2RVTEwsCisJMHhiNWMwZmJjZmVjNGQzYjJmVUxMLCAweGU5YjVkYmE1ODE4OWRiYmNVTEwsCisJMHgzOTU2YzI1YmYzNDhiNTM4VUxMLCAweDU5ZjExMWYxYjYwNWQwMTlVTEwsCisJMHg5MjNmODJhNGFmMTk0ZjliVUxMLCAweGFiMWM1ZWQ1ZGE2ZDgxMThVTEwsCisJMHhkODA3YWE5OGEzMDMwMjQyVUxMLCAweDEyODM1YjAxNDU3MDZmYmVVTEwsCisJMHgyNDMxODViZTRlZTRiMjhjVUxMLCAweDU1MGM3ZGMzZDVmZmI0ZTJVTEwsCisJMHg3MmJlNWQ3NGYyN2I4OTZmVUxMLCAweDgwZGViMWZlM2IxNjk2YjFVTEwsCisJMHg5YmRjMDZhNzI1YzcxMjM1VUxMLCAweGMxOWJmMTc0Y2Y2OTI2OTRVTEwsCisJMHhlNDliNjljMTllZjE0YWQyVUxMLCAweGVmYmU0Nzg2Mzg0ZjI1ZTNVTEwsCisJMHgwZmMxOWRjNjhiOGNkNWI1VUxMLCAweDI0MGNhMWNjNzdhYzljNjVVTEwsCisJMHgyZGU5MmM2ZjU5MmIwMjc1VUxMLCAweDRhNzQ4NGFhNmVhNmU0ODNVTEwsCisJMHg1Y2IwYTlkY2JkNDFmYmQ0VUxMLCAweDc2Zjk4OGRhODMxMTUzYjVVTEwsCisJMHg5ODNlNTE1MmVlNjZkZmFiVUxMLCAweGE4MzFjNjZkMmRiNDMyMTBVTEwsCisJMHhiMDAzMjdjODk4ZmIyMTNmVUxMLCAweGJmNTk3ZmM3YmVlZjBlZTRVTEwsCisJMHhjNmUwMGJmMzNkYTg4ZmMyVUxMLCAweGQ1YTc5MTQ3OTMwYWE3MjVVTEwsCisJMHgwNmNhNjM1MWUwMDM4MjZmVUxMLCAweDE0MjkyOTY3MGEwZTZlNzBVTEwsCisJMHgyN2I3MGE4NTQ2ZDIyZmZjVUxMLCAweDJlMWIyMTM4NWMyNmM5MjZVTEwsCisJMHg0ZDJjNmRmYzVhYzQyYWVkVUxMLCAweDUzMzgwZDEzOWQ5NWIzZGZVTEwsCisJMHg2NTBhNzM1NDhiYWY2M2RlVUxMLCAweDc2NmEwYWJiM2M3N2IyYThVTEwsCisJMHg4MWMyYzkyZTQ3ZWRhZWU2VUxMLCAweDkyNzIyYzg1MTQ4MjM1M2JVTEwsCisJMHhhMmJmZThhMTRjZjEwMzY0VUxMLCAweGE4MWE2NjRiYmM0MjMwMDFVTEwsCisJMHhjMjRiOGI3MGQwZjg5NzkxVUxMLCAweGM3NmM1MWEzMDY1NGJlMzBVTEwsCisJMHhkMTkyZTgxOWQ2ZWY1MjE4VUxMLCAweGQ2OTkwNjI0NTU2NWE5MTBVTEwsCisJMHhmNDBlMzU4NTU3NzEyMDJhVUxMLCAweDEwNmFhMDcwMzJiYmQxYjhVTEwsCisJMHgxOWE0YzExNmI4ZDJkMGM4VUxMLCAweDFlMzc2YzA4NTE0MWFiNTNVTEwsCisJMHgyNzQ4Nzc0Y2RmOGVlYjk5VUxMLCAweDM0YjBiY2I1ZTE5YjQ4YThVTEwsCisJMHgzOTFjMGNiM2M1Yzk1YTYzVUxMLCAweDRlZDhhYTRhZTM0MThhY2JVTEwsCisJMHg1YjljY2E0Zjc3NjNlMzczVUxMLCAweDY4MmU2ZmYzZDZiMmI4YTNVTEwsCisJMHg3NDhmODJlZTVkZWZiMmZjVUxMLCAweDc4YTU2MzZmNDMxNzJmNjBVTEwsCisJMHg4NGM4NzgxNGExZjBhYjcyVUxMLCAweDhjYzcwMjA4MWE2NDM5ZWNVTEwsCisJMHg5MGJlZmZmYTIzNjMxZTI4VUxMLCAweGE0NTA2Y2ViZGU4MmJkZTlVTEwsCisJMHhiZWY5YTNmN2IyYzY3OTE1VUxMLCAweGM2NzE3OGYyZTM3MjUzMmJVTEwsCisJMHhjYTI3M2VjZWVhMjY2MTljVUxMLCAweGQxODZiOGM3MjFjMGMyMDdVTEwsCisJMHhlYWRhN2RkNmNkZTBlYjFlVUxMLCAweGY1N2Q0ZjdmZWU2ZWQxNzhVTEwsCisJMHgwNmYwNjdhYTcyMTc2ZmJhVUxMLCAweDBhNjM3ZGM1YTJjODk4YTZVTEwsCisJMHgxMTNmOTgwNGJlZjkwZGFlVUxMLCAweDFiNzEwYjM1MTMxYzQ3MWJVTEwsCisJMHgyOGRiNzdmNTIzMDQ3ZDg0VUxMLCAweDMyY2FhYjdiNDBjNzI0OTNVTEwsCisJMHgzYzllYmUwYTE1YzliZWJjVUxMLCAweDQzMWQ2N2M0OWMxMDBkNGNVTEwsCisJMHg0Y2M1ZDRiZWNiM2U0MmI2VUxMLCAweDU5N2YyOTljZmM2NTdlMmFVTEwsCisJMHg1ZmNiNmZhYjNhZDZmYWVjVUxMLCAweDZjNDQxOThjNGE0NzU4MTdVTEwKK307CisKKy8qIEluaXRpYWwgaGFzaCB2YWx1ZSBIIGZvciBTSEEtMzg0ICovCitjb25zdCBzdGF0aWMgdV9pbnQ2NF90IHNoYTM4NF9pbml0aWFsX2hhc2hfdmFsdWVbOF0gPSB7CisJMHhjYmJiOWQ1ZGMxMDU5ZWQ4VUxMLAorCTB4NjI5YTI5MmEzNjdjZDUwN1VMTCwKKwkweDkxNTkwMTVhMzA3MGRkMTdVTEwsCisJMHgxNTJmZWNkOGY3MGU1OTM5VUxMLAorCTB4NjczMzI2NjdmZmMwMGIzMVVMTCwKKwkweDhlYjQ0YTg3Njg1ODE1MTFVTEwsCisJMHhkYjBjMmUwZDY0Zjk4ZmE3VUxMLAorCTB4NDdiNTQ4MWRiZWZhNGZhNFVMTAorfTsKKworLyogSW5pdGlhbCBoYXNoIHZhbHVlIEggZm9yIFNIQS01MTIgKi8KK2NvbnN0IHN0YXRpYyB1X2ludDY0X3Qgc2hhNTEyX2luaXRpYWxfaGFzaF92YWx1ZVs4XSA9IHsKKwkweDZhMDllNjY3ZjNiY2M5MDhVTEwsCisJMHhiYjY3YWU4NTg0Y2FhNzNiVUxMLAorCTB4M2M2ZWYzNzJmZTk0ZjgyYlVMTCwKKwkweGE1NGZmNTNhNWYxZDM2ZjFVTEwsCisJMHg1MTBlNTI3ZmFkZTY4MmQxVUxMLAorCTB4OWIwNTY4OGMyYjNlNmMxZlVMTCwKKwkweDFmODNkOWFiZmI0MWJkNmJVTEwsCisJMHg1YmUwY2QxOTEzN2UyMTc5VUxMCit9OworCisKKy8qKiogU0hBLTI1NjogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorU0hBMjU2X0luaXQoU0hBMjU2X0NUWCAqY29udGV4dCkKK3sKKwlpZiAoY29udGV4dCA9PSBOVUxMKQorCQlyZXR1cm47CisJbWVtY3B5KGNvbnRleHQtPnN0YXRlLCBzaGEyNTZfaW5pdGlhbF9oYXNoX3ZhbHVlLAorCSAgICBzaXplb2Yoc2hhMjU2X2luaXRpYWxfaGFzaF92YWx1ZSkpOworCW1lbXNldChjb250ZXh0LT5idWZmZXIsIDAsIHNpemVvZihjb250ZXh0LT5idWZmZXIpKTsKKwljb250ZXh0LT5iaXRjb3VudCA9IDA7Cit9CisKKyNpZmRlZiBTSEEyX1VOUk9MTF9UUkFOU0ZPUk0KKworLyogVW5yb2xsZWQgU0hBLTI1NiByb3VuZCBtYWNyb3M6ICovCisKKyNkZWZpbmUgUk9VTkQyNTZfMF9UT18xNShhLGIsYyxkLGUsZixnLGgpIGRvIHsJCQkJICAgIFwKKwlCRV84X1RPXzMyKFcyNTZbal0sIGRhdGEpOwkJCQkJICAgIFwKKwlkYXRhICs9IDQ7CQkJCQkJCSAgICBcCisJVDEgPSAoaCkgKyBTaWdtYTFfMjU2KChlKSkgKyBDaCgoZSksIChmKSwgKGcpKSArIEsyNTZbal0gKyBXMjU2W2pdOyBcCisJKGQpICs9IFQxOwkJCQkJCQkgICAgXAorCShoKSA9IFQxICsgU2lnbWEwXzI1NigoYSkpICsgTWFqKChhKSwgKGIpLCAoYykpOwkJICAgIFwKKwlqKys7CQkJCQkJCQkgICAgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIFJPVU5EMjU2KGEsYixjLGQsZSxmLGcsaCkgZG8gewkJCQkJICAgIFwKKwlzMCA9IFcyNTZbKGorMSkmMHgwZl07CQkJCQkJICAgIFwKKwlzMCA9IHNpZ21hMF8yNTYoczApOwkJCQkJCSAgICBcCisJczEgPSBXMjU2WyhqKzE0KSYweDBmXTsJCQkJCQkgICAgXAorCXMxID0gc2lnbWExXzI1NihzMSk7CQkJCQkJICAgIFwKKwlUMSA9IChoKSArIFNpZ21hMV8yNTYoKGUpKSArIENoKChlKSwgKGYpLCAoZykpICsgSzI1NltqXSArCSAgICBcCisJICAgICAoVzI1NltqJjB4MGZdICs9IHMxICsgVzI1Nlsoais5KSYweDBmXSArIHMwKTsJCSAgICBcCisJKGQpICs9IFQxOwkJCQkJCQkgICAgXAorCShoKSA9IFQxICsgU2lnbWEwXzI1NigoYSkpICsgTWFqKChhKSwgKGIpLCAoYykpOwkJICAgIFwKKwlqKys7CQkJCQkJCQkgICAgXAorfSB3aGlsZSgwKQorCit2b2lkCitTSEEyNTZfVHJhbnNmb3JtKHVfaW50MzJfdCBzdGF0ZVs4XSwgY29uc3QgdV9pbnQ4X3QgZGF0YVtTSEEyNTZfQkxPQ0tfTEVOR1RIXSkKK3sKKwl1X2ludDMyX3QJYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgczAsIHMxOworCXVfaW50MzJfdAlUMSwgVzI1NlsxNl07CisJaW50CQlqOworCisJLyogSW5pdGlhbGl6ZSByZWdpc3RlcnMgd2l0aCB0aGUgcHJldi4gaW50ZXJtZWRpYXRlIHZhbHVlICovCisJYSA9IHN0YXRlWzBdOworCWIgPSBzdGF0ZVsxXTsKKwljID0gc3RhdGVbMl07CisJZCA9IHN0YXRlWzNdOworCWUgPSBzdGF0ZVs0XTsKKwlmID0gc3RhdGVbNV07CisJZyA9IHN0YXRlWzZdOworCWggPSBzdGF0ZVs3XTsKKworCWogPSAwOworCWRvIHsKKwkJLyogUm91bmRzIDAgdG8gMTUgKHVucm9sbGVkKTogKi8KKwkJUk9VTkQyNTZfMF9UT18xNShhLGIsYyxkLGUsZixnLGgpOworCQlST1VORDI1Nl8wX1RPXzE1KGgsYSxiLGMsZCxlLGYsZyk7CisJCVJPVU5EMjU2XzBfVE9fMTUoZyxoLGEsYixjLGQsZSxmKTsKKwkJUk9VTkQyNTZfMF9UT18xNShmLGcsaCxhLGIsYyxkLGUpOworCQlST1VORDI1Nl8wX1RPXzE1KGUsZixnLGgsYSxiLGMsZCk7CisJCVJPVU5EMjU2XzBfVE9fMTUoZCxlLGYsZyxoLGEsYixjKTsKKwkJUk9VTkQyNTZfMF9UT18xNShjLGQsZSxmLGcsaCxhLGIpOworCQlST1VORDI1Nl8wX1RPXzE1KGIsYyxkLGUsZixnLGgsYSk7CisJfSB3aGlsZSAoaiA8IDE2KTsKKworCS8qIE5vdyBmb3IgdGhlIHJlbWFpbmluZyByb3VuZHMgdXAgdG8gNjM6ICovCisJZG8geworCQlST1VORDI1NihhLGIsYyxkLGUsZixnLGgpOworCQlST1VORDI1NihoLGEsYixjLGQsZSxmLGcpOworCQlST1VORDI1NihnLGgsYSxiLGMsZCxlLGYpOworCQlST1VORDI1NihmLGcsaCxhLGIsYyxkLGUpOworCQlST1VORDI1NihlLGYsZyxoLGEsYixjLGQpOworCQlST1VORDI1NihkLGUsZixnLGgsYSxiLGMpOworCQlST1VORDI1NihjLGQsZSxmLGcsaCxhLGIpOworCQlST1VORDI1NihiLGMsZCxlLGYsZyxoLGEpOworCX0gd2hpbGUgKGogPCA2NCk7CisKKwkvKiBDb21wdXRlIHRoZSBjdXJyZW50IGludGVybWVkaWF0ZSBoYXNoIHZhbHVlICovCisJc3RhdGVbMF0gKz0gYTsKKwlzdGF0ZVsxXSArPSBiOworCXN0YXRlWzJdICs9IGM7CisJc3RhdGVbM10gKz0gZDsKKwlzdGF0ZVs0XSArPSBlOworCXN0YXRlWzVdICs9IGY7CisJc3RhdGVbNl0gKz0gZzsKKwlzdGF0ZVs3XSArPSBoOworCisJLyogQ2xlYW4gdXAgKi8KKwlhID0gYiA9IGMgPSBkID0gZSA9IGYgPSBnID0gaCA9IFQxID0gMDsKK30KKworI2Vsc2UgLyogU0hBMl9VTlJPTExfVFJBTlNGT1JNICovCisKK3ZvaWQKK1NIQTI1Nl9UcmFuc2Zvcm0odV9pbnQzMl90IHN0YXRlWzhdLCBjb25zdCB1X2ludDhfdCBkYXRhW1NIQTI1Nl9CTE9DS19MRU5HVEhdKQoreworCXVfaW50MzJfdAlhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBzMCwgczE7CisJdV9pbnQzMl90CVQxLCBUMiwgVzI1NlsxNl07CisJaW50CQlqOworCisJLyogSW5pdGlhbGl6ZSByZWdpc3RlcnMgd2l0aCB0aGUgcHJldi4gaW50ZXJtZWRpYXRlIHZhbHVlICovCisJYSA9IHN0YXRlWzBdOworCWIgPSBzdGF0ZVsxXTsKKwljID0gc3RhdGVbMl07CisJZCA9IHN0YXRlWzNdOworCWUgPSBzdGF0ZVs0XTsKKwlmID0gc3RhdGVbNV07CisJZyA9IHN0YXRlWzZdOworCWggPSBzdGF0ZVs3XTsKKworCWogPSAwOworCWRvIHsKKwkJQkVfOF9UT18zMihXMjU2W2pdLCBkYXRhKTsKKwkJZGF0YSArPSA0OworCQkvKiBBcHBseSB0aGUgU0hBLTI1NiBjb21wcmVzc2lvbiBmdW5jdGlvbiB0byB1cGRhdGUgYS4uaCAqLworCQlUMSA9IGggKyBTaWdtYTFfMjU2KGUpICsgQ2goZSwgZiwgZykgKyBLMjU2W2pdICsgVzI1NltqXTsKKwkJVDIgPSBTaWdtYTBfMjU2KGEpICsgTWFqKGEsIGIsIGMpOworCQloID0gZzsKKwkJZyA9IGY7CisJCWYgPSBlOworCQllID0gZCArIFQxOworCQlkID0gYzsKKwkJYyA9IGI7CisJCWIgPSBhOworCQlhID0gVDEgKyBUMjsKKworCQlqKys7CisJfSB3aGlsZSAoaiA8IDE2KTsKKworCWRvIHsKKwkJLyogUGFydCBvZiB0aGUgbWVzc2FnZSBibG9jayBleHBhbnNpb246ICovCisJCXMwID0gVzI1NlsoaisxKSYweDBmXTsKKwkJczAgPSBzaWdtYTBfMjU2KHMwKTsKKwkJczEgPSBXMjU2WyhqKzE0KSYweDBmXTsJCisJCXMxID0gc2lnbWExXzI1NihzMSk7CisKKwkJLyogQXBwbHkgdGhlIFNIQS0yNTYgY29tcHJlc3Npb24gZnVuY3Rpb24gdG8gdXBkYXRlIGEuLmggKi8KKwkJVDEgPSBoICsgU2lnbWExXzI1NihlKSArIENoKGUsIGYsIGcpICsgSzI1NltqXSArIAorCQkgICAgIChXMjU2W2omMHgwZl0gKz0gczEgKyBXMjU2WyhqKzkpJjB4MGZdICsgczApOworCQlUMiA9IFNpZ21hMF8yNTYoYSkgKyBNYWooYSwgYiwgYyk7CisJCWggPSBnOworCQlnID0gZjsKKwkJZiA9IGU7CisJCWUgPSBkICsgVDE7CisJCWQgPSBjOworCQljID0gYjsKKwkJYiA9IGE7CisJCWEgPSBUMSArIFQyOworCisJCWorKzsKKwl9IHdoaWxlIChqIDwgNjQpOworCisJLyogQ29tcHV0ZSB0aGUgY3VycmVudCBpbnRlcm1lZGlhdGUgaGFzaCB2YWx1ZSAqLworCXN0YXRlWzBdICs9IGE7CisJc3RhdGVbMV0gKz0gYjsKKwlzdGF0ZVsyXSArPSBjOworCXN0YXRlWzNdICs9IGQ7CisJc3RhdGVbNF0gKz0gZTsKKwlzdGF0ZVs1XSArPSBmOworCXN0YXRlWzZdICs9IGc7CisJc3RhdGVbN10gKz0gaDsKKworCS8qIENsZWFuIHVwICovCisJYSA9IGIgPSBjID0gZCA9IGUgPSBmID0gZyA9IGggPSBUMSA9IFQyID0gMDsKK30KKworI2VuZGlmIC8qIFNIQTJfVU5ST0xMX1RSQU5TRk9STSAqLworCit2b2lkCitTSEEyNTZfVXBkYXRlKFNIQTI1Nl9DVFggKmNvbnRleHQsIGNvbnN0IHVfaW50OF90ICpkYXRhLCBzaXplX3QgbGVuKQoreworCXNpemVfdAlmcmVlc3BhY2UsIHVzZWRzcGFjZTsKKworCS8qIENhbGxpbmcgd2l0aCBubyBkYXRhIGlzIHZhbGlkICh3ZSBkbyBub3RoaW5nKSAqLworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuOworCisJdXNlZHNwYWNlID0gKGNvbnRleHQtPmJpdGNvdW50ID4+IDMpICUgU0hBMjU2X0JMT0NLX0xFTkdUSDsKKwlpZiAodXNlZHNwYWNlID4gMCkgeworCQkvKiBDYWxjdWxhdGUgaG93IG11Y2ggZnJlZSBzcGFjZSBpcyBhdmFpbGFibGUgaW4gdGhlIGJ1ZmZlciAqLworCQlmcmVlc3BhY2UgPSBTSEEyNTZfQkxPQ0tfTEVOR1RIIC0gdXNlZHNwYWNlOworCisJCWlmIChsZW4gPj0gZnJlZXNwYWNlKSB7CisJCQkvKiBGaWxsIHRoZSBidWZmZXIgY29tcGxldGVseSBhbmQgcHJvY2VzcyBpdCAqLworCQkJbWVtY3B5KCZjb250ZXh0LT5idWZmZXJbdXNlZHNwYWNlXSwgZGF0YSwgZnJlZXNwYWNlKTsKKwkJCWNvbnRleHQtPmJpdGNvdW50ICs9IGZyZWVzcGFjZSA8PCAzOworCQkJbGVuIC09IGZyZWVzcGFjZTsKKwkJCWRhdGEgKz0gZnJlZXNwYWNlOworCQkJU0hBMjU2X1RyYW5zZm9ybShjb250ZXh0LT5zdGF0ZSwgY29udGV4dC0+YnVmZmVyKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFRoZSBidWZmZXIgaXMgbm90IHlldCBmdWxsICovCisJCQltZW1jcHkoJmNvbnRleHQtPmJ1ZmZlclt1c2Vkc3BhY2VdLCBkYXRhLCBsZW4pOworCQkJY29udGV4dC0+Yml0Y291bnQgKz0gbGVuIDw8IDM7CisJCQkvKiBDbGVhbiB1cDogKi8KKwkJCXVzZWRzcGFjZSA9IGZyZWVzcGFjZSA9IDA7CisJCQlyZXR1cm47CisJCX0KKwl9CisJd2hpbGUgKGxlbiA+PSBTSEEyNTZfQkxPQ0tfTEVOR1RIKSB7CisJCS8qIFByb2Nlc3MgYXMgbWFueSBjb21wbGV0ZSBibG9ja3MgYXMgd2UgY2FuICovCisJCVNIQTI1Nl9UcmFuc2Zvcm0oY29udGV4dC0+c3RhdGUsIGRhdGEpOworCQljb250ZXh0LT5iaXRjb3VudCArPSBTSEEyNTZfQkxPQ0tfTEVOR1RIIDw8IDM7CisJCWxlbiAtPSBTSEEyNTZfQkxPQ0tfTEVOR1RIOworCQlkYXRhICs9IFNIQTI1Nl9CTE9DS19MRU5HVEg7CisJfQorCWlmIChsZW4gPiAwKSB7CisJCS8qIFRoZXJlJ3MgbGVmdC1vdmVycywgc28gc2F2ZSAnZW0gKi8KKwkJbWVtY3B5KGNvbnRleHQtPmJ1ZmZlciwgZGF0YSwgbGVuKTsKKwkJY29udGV4dC0+Yml0Y291bnQgKz0gbGVuIDw8IDM7CisJfQorCS8qIENsZWFuIHVwOiAqLworCXVzZWRzcGFjZSA9IGZyZWVzcGFjZSA9IDA7Cit9CisKK3ZvaWQKK1NIQTI1Nl9QYWQoU0hBMjU2X0NUWCAqY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQJdXNlZHNwYWNlOworCisJdXNlZHNwYWNlID0gKGNvbnRleHQtPmJpdGNvdW50ID4+IDMpICUgU0hBMjU2X0JMT0NLX0xFTkdUSDsKKwlpZiAodXNlZHNwYWNlID4gMCkgeworCQkvKiBCZWdpbiBwYWRkaW5nIHdpdGggYSAxIGJpdDogKi8KKwkJY29udGV4dC0+YnVmZmVyW3VzZWRzcGFjZSsrXSA9IDB4ODA7CisKKwkJaWYgKHVzZWRzcGFjZSA8PSBTSEEyNTZfU0hPUlRfQkxPQ0tfTEVOR1RIKSB7CisJCQkvKiBTZXQtdXAgZm9yIHRoZSBsYXN0IHRyYW5zZm9ybTogKi8KKwkJCW1lbXNldCgmY29udGV4dC0+YnVmZmVyW3VzZWRzcGFjZV0sIDAsCisJCQkgICAgU0hBMjU2X1NIT1JUX0JMT0NLX0xFTkdUSCAtIHVzZWRzcGFjZSk7CisJCX0gZWxzZSB7CisJCQlpZiAodXNlZHNwYWNlIDwgU0hBMjU2X0JMT0NLX0xFTkdUSCkgeworCQkJCW1lbXNldCgmY29udGV4dC0+YnVmZmVyW3VzZWRzcGFjZV0sIDAsCisJCQkJICAgIFNIQTI1Nl9CTE9DS19MRU5HVEggLSB1c2Vkc3BhY2UpOworCQkJfQorCQkJLyogRG8gc2Vjb25kLXRvLWxhc3QgdHJhbnNmb3JtOiAqLworCQkJU0hBMjU2X1RyYW5zZm9ybShjb250ZXh0LT5zdGF0ZSwgY29udGV4dC0+YnVmZmVyKTsKKworCQkJLyogUHJlcGFyZSBmb3IgbGFzdCB0cmFuc2Zvcm06ICovCisJCQltZW1zZXQoY29udGV4dC0+YnVmZmVyLCAwLCBTSEEyNTZfU0hPUlRfQkxPQ0tfTEVOR1RIKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFNldC11cCBmb3IgdGhlIGxhc3QgdHJhbnNmb3JtOiAqLworCQltZW1zZXQoY29udGV4dC0+YnVmZmVyLCAwLCBTSEEyNTZfU0hPUlRfQkxPQ0tfTEVOR1RIKTsKKworCQkvKiBCZWdpbiBwYWRkaW5nIHdpdGggYSAxIGJpdDogKi8KKwkJKmNvbnRleHQtPmJ1ZmZlciA9IDB4ODA7CisJfQorCS8qIFN0b3JlIHRoZSBsZW5ndGggb2YgaW5wdXQgZGF0YSAoaW4gYml0cykgaW4gYmlnIGVuZGlhbiBmb3JtYXQ6ICovCisJQkVfNjRfVE9fOCgmY29udGV4dC0+YnVmZmVyW1NIQTI1Nl9TSE9SVF9CTE9DS19MRU5HVEhdLAorCSAgICBjb250ZXh0LT5iaXRjb3VudCk7CisKKwkvKiBGaW5hbCB0cmFuc2Zvcm06ICovCisJU0hBMjU2X1RyYW5zZm9ybShjb250ZXh0LT5zdGF0ZSwgY29udGV4dC0+YnVmZmVyKTsKKworCS8qIENsZWFuIHVwOiAqLworCXVzZWRzcGFjZSA9IDA7Cit9CisKK3ZvaWQKK1NIQTI1Nl9GaW5hbCh1X2ludDhfdCBkaWdlc3RbU0hBMjU2X0RJR0VTVF9MRU5HVEhdLCBTSEEyNTZfQ1RYICpjb250ZXh0KQoreworCVNIQTI1Nl9QYWQoY29udGV4dCk7CisKKwkvKiBJZiBubyBkaWdlc3QgYnVmZmVyIGlzIHBhc3NlZCwgd2UgZG9uJ3QgYm90aGVyIGRvaW5nIHRoaXM6ICovCisJaWYgKGRpZ2VzdCAhPSBOVUxMKSB7CisjaWYgQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOCisJCWludAlpOworCisJCS8qIENvbnZlcnQgVE8gaG9zdCBieXRlIG9yZGVyICovCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQlCRV8zMl9UT184KGRpZ2VzdCArIGkgKiA0LCBjb250ZXh0LT5zdGF0ZVtpXSk7CisjZWxzZQorCQltZW1jcHkoZGlnZXN0LCBjb250ZXh0LT5zdGF0ZSwgU0hBMjU2X0RJR0VTVF9MRU5HVEgpOworI2VuZGlmCisJCW1lbXNldChjb250ZXh0LCAwLCBzaXplb2YoKmNvbnRleHQpKTsKKwl9Cit9CisKKworLyoqKiBTSEEtNTEyOiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitTSEE1MTJfSW5pdChTSEE1MTJfQ1RYICpjb250ZXh0KQoreworCWlmIChjb250ZXh0ID09IE5VTEwpCisJCXJldHVybjsKKwltZW1jcHkoY29udGV4dC0+c3RhdGUsIHNoYTUxMl9pbml0aWFsX2hhc2hfdmFsdWUsCisJICAgIHNpemVvZihzaGE1MTJfaW5pdGlhbF9oYXNoX3ZhbHVlKSk7CisJbWVtc2V0KGNvbnRleHQtPmJ1ZmZlciwgMCwgc2l6ZW9mKGNvbnRleHQtPmJ1ZmZlcikpOworCWNvbnRleHQtPmJpdGNvdW50WzBdID0gY29udGV4dC0+Yml0Y291bnRbMV0gPSAgMDsKK30KKworI2lmZGVmIFNIQTJfVU5ST0xMX1RSQU5TRk9STQorCisvKiBVbnJvbGxlZCBTSEEtNTEyIHJvdW5kIG1hY3JvczogKi8KKworI2RlZmluZSBST1VORDUxMl8wX1RPXzE1KGEsYixjLGQsZSxmLGcsaCkgZG8gewkJCQkgICAgXAorCUJFXzhfVE9fNjQoVzUxMltqXSwgZGF0YSk7CQkJCQkgICAgXAorCWRhdGEgKz0gODsJCQkJCQkJICAgIFwKKwlUMSA9IChoKSArIFNpZ21hMV81MTIoKGUpKSArIENoKChlKSwgKGYpLCAoZykpICsgSzUxMltqXSArIFc1MTJbal07IFwKKwkoZCkgKz0gVDE7CQkJCQkJCSAgICBcCisJKGgpID0gVDEgKyBTaWdtYTBfNTEyKChhKSkgKyBNYWooKGEpLCAoYiksIChjKSk7CQkgICAgXAorCWorKzsJCQkJCQkJCSAgICBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBST1VORDUxMihhLGIsYyxkLGUsZixnLGgpIGRvIHsJCQkJCSAgICBcCisJczAgPSBXNTEyWyhqKzEpJjB4MGZdOwkJCQkJCSAgICBcCisJczAgPSBzaWdtYTBfNTEyKHMwKTsJCQkJCQkgICAgXAorCXMxID0gVzUxMlsoaisxNCkmMHgwZl07CQkJCQkJICAgIFwKKwlzMSA9IHNpZ21hMV81MTIoczEpOwkJCQkJCSAgICBcCisJVDEgPSAoaCkgKyBTaWdtYTFfNTEyKChlKSkgKyBDaCgoZSksIChmKSwgKGcpKSArIEs1MTJbal0gKwkgICAgXAorICAgICAgICAgICAgIChXNTEyW2omMHgwZl0gKz0gczEgKyBXNTEyWyhqKzkpJjB4MGZdICsgczApOwkJICAgIFwKKwkoZCkgKz0gVDE7CQkJCQkJCSAgICBcCisJKGgpID0gVDEgKyBTaWdtYTBfNTEyKChhKSkgKyBNYWooKGEpLCAoYiksIChjKSk7CQkgICAgXAorCWorKzsJCQkJCQkJCSAgICBcCit9IHdoaWxlKDApCisKK3ZvaWQKK1NIQTUxMl9UcmFuc2Zvcm0odV9pbnQ2NF90IHN0YXRlWzhdLCBjb25zdCB1X2ludDhfdCBkYXRhW1NIQTUxMl9CTE9DS19MRU5HVEhdKQoreworCXVfaW50NjRfdAlhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBzMCwgczE7CisJdV9pbnQ2NF90CVQxLCBXNTEyWzE2XTsKKwlpbnQJCWo7CisKKwkvKiBJbml0aWFsaXplIHJlZ2lzdGVycyB3aXRoIHRoZSBwcmV2LiBpbnRlcm1lZGlhdGUgdmFsdWUgKi8KKwlhID0gc3RhdGVbMF07CisJYiA9IHN0YXRlWzFdOworCWMgPSBzdGF0ZVsyXTsKKwlkID0gc3RhdGVbM107CisJZSA9IHN0YXRlWzRdOworCWYgPSBzdGF0ZVs1XTsKKwlnID0gc3RhdGVbNl07CisJaCA9IHN0YXRlWzddOworCisJaiA9IDA7CisJZG8geworCQkvKiBSb3VuZHMgMCB0byAxNSAodW5yb2xsZWQpOiAqLworCQlST1VORDUxMl8wX1RPXzE1KGEsYixjLGQsZSxmLGcsaCk7CisJCVJPVU5ENTEyXzBfVE9fMTUoaCxhLGIsYyxkLGUsZixnKTsKKwkJUk9VTkQ1MTJfMF9UT18xNShnLGgsYSxiLGMsZCxlLGYpOworCQlST1VORDUxMl8wX1RPXzE1KGYsZyxoLGEsYixjLGQsZSk7CisJCVJPVU5ENTEyXzBfVE9fMTUoZSxmLGcsaCxhLGIsYyxkKTsKKwkJUk9VTkQ1MTJfMF9UT18xNShkLGUsZixnLGgsYSxiLGMpOworCQlST1VORDUxMl8wX1RPXzE1KGMsZCxlLGYsZyxoLGEsYik7CisJCVJPVU5ENTEyXzBfVE9fMTUoYixjLGQsZSxmLGcsaCxhKTsKKwl9IHdoaWxlIChqIDwgMTYpOworCisJLyogTm93IGZvciB0aGUgcmVtYWluaW5nIHJvdW5kcyB1cCB0byA3OTogKi8KKwlkbyB7CisJCVJPVU5ENTEyKGEsYixjLGQsZSxmLGcsaCk7CisJCVJPVU5ENTEyKGgsYSxiLGMsZCxlLGYsZyk7CisJCVJPVU5ENTEyKGcsaCxhLGIsYyxkLGUsZik7CisJCVJPVU5ENTEyKGYsZyxoLGEsYixjLGQsZSk7CisJCVJPVU5ENTEyKGUsZixnLGgsYSxiLGMsZCk7CisJCVJPVU5ENTEyKGQsZSxmLGcsaCxhLGIsYyk7CisJCVJPVU5ENTEyKGMsZCxlLGYsZyxoLGEsYik7CisJCVJPVU5ENTEyKGIsYyxkLGUsZixnLGgsYSk7CisJfSB3aGlsZSAoaiA8IDgwKTsKKworCS8qIENvbXB1dGUgdGhlIGN1cnJlbnQgaW50ZXJtZWRpYXRlIGhhc2ggdmFsdWUgKi8KKwlzdGF0ZVswXSArPSBhOworCXN0YXRlWzFdICs9IGI7CisJc3RhdGVbMl0gKz0gYzsKKwlzdGF0ZVszXSArPSBkOworCXN0YXRlWzRdICs9IGU7CisJc3RhdGVbNV0gKz0gZjsKKwlzdGF0ZVs2XSArPSBnOworCXN0YXRlWzddICs9IGg7CisKKwkvKiBDbGVhbiB1cCAqLworCWEgPSBiID0gYyA9IGQgPSBlID0gZiA9IGcgPSBoID0gVDEgPSAwOworfQorCisjZWxzZSAvKiBTSEEyX1VOUk9MTF9UUkFOU0ZPUk0gKi8KKwordm9pZAorU0hBNTEyX1RyYW5zZm9ybSh1X2ludDY0X3Qgc3RhdGVbOF0sIGNvbnN0IHVfaW50OF90IGRhdGFbU0hBNTEyX0JMT0NLX0xFTkdUSF0pCit7CisJdV9pbnQ2NF90CWEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIHMwLCBzMTsKKwl1X2ludDY0X3QJVDEsIFQyLCBXNTEyWzE2XTsKKwlpbnQJCWo7CisKKwkvKiBJbml0aWFsaXplIHJlZ2lzdGVycyB3aXRoIHRoZSBwcmV2LiBpbnRlcm1lZGlhdGUgdmFsdWUgKi8KKwlhID0gc3RhdGVbMF07CisJYiA9IHN0YXRlWzFdOworCWMgPSBzdGF0ZVsyXTsKKwlkID0gc3RhdGVbM107CisJZSA9IHN0YXRlWzRdOworCWYgPSBzdGF0ZVs1XTsKKwlnID0gc3RhdGVbNl07CisJaCA9IHN0YXRlWzddOworCisJaiA9IDA7CisJZG8geworCQlCRV84X1RPXzY0KFc1MTJbal0sIGRhdGEpOworCQlkYXRhICs9IDg7CisJCS8qIEFwcGx5IHRoZSBTSEEtNTEyIGNvbXByZXNzaW9uIGZ1bmN0aW9uIHRvIHVwZGF0ZSBhLi5oICovCisJCVQxID0gaCArIFNpZ21hMV81MTIoZSkgKyBDaChlLCBmLCBnKSArIEs1MTJbal0gKyBXNTEyW2pdOworCQlUMiA9IFNpZ21hMF81MTIoYSkgKyBNYWooYSwgYiwgYyk7CisJCWggPSBnOworCQlnID0gZjsKKwkJZiA9IGU7CisJCWUgPSBkICsgVDE7CisJCWQgPSBjOworCQljID0gYjsKKwkJYiA9IGE7CisJCWEgPSBUMSArIFQyOworCisJCWorKzsKKwl9IHdoaWxlIChqIDwgMTYpOworCisJZG8geworCQkvKiBQYXJ0IG9mIHRoZSBtZXNzYWdlIGJsb2NrIGV4cGFuc2lvbjogKi8KKwkJczAgPSBXNTEyWyhqKzEpJjB4MGZdOworCQlzMCA9IHNpZ21hMF81MTIoczApOworCQlzMSA9IFc1MTJbKGorMTQpJjB4MGZdOworCQlzMSA9ICBzaWdtYTFfNTEyKHMxKTsKKworCQkvKiBBcHBseSB0aGUgU0hBLTUxMiBjb21wcmVzc2lvbiBmdW5jdGlvbiB0byB1cGRhdGUgYS4uaCAqLworCQlUMSA9IGggKyBTaWdtYTFfNTEyKGUpICsgQ2goZSwgZiwgZykgKyBLNTEyW2pdICsKKwkJICAgICAoVzUxMltqJjB4MGZdICs9IHMxICsgVzUxMlsoais5KSYweDBmXSArIHMwKTsKKwkJVDIgPSBTaWdtYTBfNTEyKGEpICsgTWFqKGEsIGIsIGMpOworCQloID0gZzsKKwkJZyA9IGY7CisJCWYgPSBlOworCQllID0gZCArIFQxOworCQlkID0gYzsKKwkJYyA9IGI7CisJCWIgPSBhOworCQlhID0gVDEgKyBUMjsKKworCQlqKys7CisJfSB3aGlsZSAoaiA8IDgwKTsKKworCS8qIENvbXB1dGUgdGhlIGN1cnJlbnQgaW50ZXJtZWRpYXRlIGhhc2ggdmFsdWUgKi8KKwlzdGF0ZVswXSArPSBhOworCXN0YXRlWzFdICs9IGI7CisJc3RhdGVbMl0gKz0gYzsKKwlzdGF0ZVszXSArPSBkOworCXN0YXRlWzRdICs9IGU7CisJc3RhdGVbNV0gKz0gZjsKKwlzdGF0ZVs2XSArPSBnOworCXN0YXRlWzddICs9IGg7CisKKwkvKiBDbGVhbiB1cCAqLworCWEgPSBiID0gYyA9IGQgPSBlID0gZiA9IGcgPSBoID0gVDEgPSBUMiA9IDA7Cit9CisKKyNlbmRpZiAvKiBTSEEyX1VOUk9MTF9UUkFOU0ZPUk0gKi8KKwordm9pZAorU0hBNTEyX1VwZGF0ZShTSEE1MTJfQ1RYICpjb250ZXh0LCBjb25zdCB1X2ludDhfdCAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKwlzaXplX3QJZnJlZXNwYWNlLCB1c2Vkc3BhY2U7CisKKwkvKiBDYWxsaW5nIHdpdGggbm8gZGF0YSBpcyB2YWxpZCAod2UgZG8gbm90aGluZykgKi8KKwlpZiAobGVuID09IDApCisJCXJldHVybjsKKworCXVzZWRzcGFjZSA9IChjb250ZXh0LT5iaXRjb3VudFswXSA+PiAzKSAlIFNIQTUxMl9CTE9DS19MRU5HVEg7CisJaWYgKHVzZWRzcGFjZSA+IDApIHsKKwkJLyogQ2FsY3VsYXRlIGhvdyBtdWNoIGZyZWUgc3BhY2UgaXMgYXZhaWxhYmxlIGluIHRoZSBidWZmZXIgKi8KKwkJZnJlZXNwYWNlID0gU0hBNTEyX0JMT0NLX0xFTkdUSCAtIHVzZWRzcGFjZTsKKworCQlpZiAobGVuID49IGZyZWVzcGFjZSkgeworCQkJLyogRmlsbCB0aGUgYnVmZmVyIGNvbXBsZXRlbHkgYW5kIHByb2Nlc3MgaXQgKi8KKwkJCW1lbWNweSgmY29udGV4dC0+YnVmZmVyW3VzZWRzcGFjZV0sIGRhdGEsIGZyZWVzcGFjZSk7CisJCQlBRERJTkMxMjgoY29udGV4dC0+Yml0Y291bnQsIGZyZWVzcGFjZSA8PCAzKTsKKwkJCWxlbiAtPSBmcmVlc3BhY2U7CisJCQlkYXRhICs9IGZyZWVzcGFjZTsKKwkJCVNIQTUxMl9UcmFuc2Zvcm0oY29udGV4dC0+c3RhdGUsIGNvbnRleHQtPmJ1ZmZlcik7CisJCX0gZWxzZSB7CisJCQkvKiBUaGUgYnVmZmVyIGlzIG5vdCB5ZXQgZnVsbCAqLworCQkJbWVtY3B5KCZjb250ZXh0LT5idWZmZXJbdXNlZHNwYWNlXSwgZGF0YSwgbGVuKTsKKwkJCUFERElOQzEyOChjb250ZXh0LT5iaXRjb3VudCwgbGVuIDw8IDMpOworCQkJLyogQ2xlYW4gdXA6ICovCisJCQl1c2Vkc3BhY2UgPSBmcmVlc3BhY2UgPSAwOworCQkJcmV0dXJuOworCQl9CisJfQorCXdoaWxlIChsZW4gPj0gU0hBNTEyX0JMT0NLX0xFTkdUSCkgeworCQkvKiBQcm9jZXNzIGFzIG1hbnkgY29tcGxldGUgYmxvY2tzIGFzIHdlIGNhbiAqLworCQlTSEE1MTJfVHJhbnNmb3JtKGNvbnRleHQtPnN0YXRlLCBkYXRhKTsKKwkJQURESU5DMTI4KGNvbnRleHQtPmJpdGNvdW50LCBTSEE1MTJfQkxPQ0tfTEVOR1RIIDw8IDMpOworCQlsZW4gLT0gU0hBNTEyX0JMT0NLX0xFTkdUSDsKKwkJZGF0YSArPSBTSEE1MTJfQkxPQ0tfTEVOR1RIOworCX0KKwlpZiAobGVuID4gMCkgeworCQkvKiBUaGVyZSdzIGxlZnQtb3ZlcnMsIHNvIHNhdmUgJ2VtICovCisJCW1lbWNweShjb250ZXh0LT5idWZmZXIsIGRhdGEsIGxlbik7CisJCUFERElOQzEyOChjb250ZXh0LT5iaXRjb3VudCwgbGVuIDw8IDMpOworCX0KKwkvKiBDbGVhbiB1cDogKi8KKwl1c2Vkc3BhY2UgPSBmcmVlc3BhY2UgPSAwOworfQorCit2b2lkCitTSEE1MTJfUGFkKFNIQTUxMl9DVFggKmNvbnRleHQpCit7CisJdW5zaWduZWQgaW50CXVzZWRzcGFjZTsKKworCXVzZWRzcGFjZSA9IChjb250ZXh0LT5iaXRjb3VudFswXSA+PiAzKSAlIFNIQTUxMl9CTE9DS19MRU5HVEg7CisJaWYgKHVzZWRzcGFjZSA+IDApIHsKKwkJLyogQmVnaW4gcGFkZGluZyB3aXRoIGEgMSBiaXQ6ICovCisJCWNvbnRleHQtPmJ1ZmZlclt1c2Vkc3BhY2UrK10gPSAweDgwOworCisJCWlmICh1c2Vkc3BhY2UgPD0gU0hBNTEyX1NIT1JUX0JMT0NLX0xFTkdUSCkgeworCQkJLyogU2V0LXVwIGZvciB0aGUgbGFzdCB0cmFuc2Zvcm06ICovCisJCQltZW1zZXQoJmNvbnRleHQtPmJ1ZmZlclt1c2Vkc3BhY2VdLCAwLCBTSEE1MTJfU0hPUlRfQkxPQ0tfTEVOR1RIIC0gdXNlZHNwYWNlKTsKKwkJfSBlbHNlIHsKKwkJCWlmICh1c2Vkc3BhY2UgPCBTSEE1MTJfQkxPQ0tfTEVOR1RIKSB7CisJCQkJbWVtc2V0KCZjb250ZXh0LT5idWZmZXJbdXNlZHNwYWNlXSwgMCwgU0hBNTEyX0JMT0NLX0xFTkdUSCAtIHVzZWRzcGFjZSk7CisJCQl9CisJCQkvKiBEbyBzZWNvbmQtdG8tbGFzdCB0cmFuc2Zvcm06ICovCisJCQlTSEE1MTJfVHJhbnNmb3JtKGNvbnRleHQtPnN0YXRlLCBjb250ZXh0LT5idWZmZXIpOworCisJCQkvKiBBbmQgc2V0LXVwIGZvciB0aGUgbGFzdCB0cmFuc2Zvcm06ICovCisJCQltZW1zZXQoY29udGV4dC0+YnVmZmVyLCAwLCBTSEE1MTJfQkxPQ0tfTEVOR1RIIC0gMik7CisJCX0KKwl9IGVsc2UgeworCQkvKiBQcmVwYXJlIGZvciBmaW5hbCB0cmFuc2Zvcm06ICovCisJCW1lbXNldChjb250ZXh0LT5idWZmZXIsIDAsIFNIQTUxMl9TSE9SVF9CTE9DS19MRU5HVEgpOworCisJCS8qIEJlZ2luIHBhZGRpbmcgd2l0aCBhIDEgYml0OiAqLworCQkqY29udGV4dC0+YnVmZmVyID0gMHg4MDsKKwl9CisJLyogU3RvcmUgdGhlIGxlbmd0aCBvZiBpbnB1dCBkYXRhIChpbiBiaXRzKSBpbiBiaWcgZW5kaWFuIGZvcm1hdDogKi8KKwlCRV82NF9UT184KCZjb250ZXh0LT5idWZmZXJbU0hBNTEyX1NIT1JUX0JMT0NLX0xFTkdUSF0sCisJICAgIGNvbnRleHQtPmJpdGNvdW50WzFdKTsKKwlCRV82NF9UT184KCZjb250ZXh0LT5idWZmZXJbU0hBNTEyX1NIT1JUX0JMT0NLX0xFTkdUSCArIDhdLAorCSAgICBjb250ZXh0LT5iaXRjb3VudFswXSk7CisKKwkvKiBGaW5hbCB0cmFuc2Zvcm06ICovCisJU0hBNTEyX1RyYW5zZm9ybShjb250ZXh0LT5zdGF0ZSwgY29udGV4dC0+YnVmZmVyKTsKKworCS8qIENsZWFuIHVwOiAqLworCXVzZWRzcGFjZSA9IDA7Cit9CisKK3ZvaWQKK1NIQTUxMl9GaW5hbCh1X2ludDhfdCBkaWdlc3RbU0hBNTEyX0RJR0VTVF9MRU5HVEhdLCBTSEE1MTJfQ1RYICpjb250ZXh0KQoreworCVNIQTUxMl9QYWQoY29udGV4dCk7CisKKwkvKiBJZiBubyBkaWdlc3QgYnVmZmVyIGlzIHBhc3NlZCwgd2UgZG9uJ3QgYm90aGVyIGRvaW5nIHRoaXM6ICovCisJaWYgKGRpZ2VzdCAhPSBOVUxMKSB7CisjaWYgQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOCisJCWludAlpOworCisJCS8qIENvbnZlcnQgVE8gaG9zdCBieXRlIG9yZGVyICovCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQlCRV82NF9UT184KGRpZ2VzdCArIGkgKiA4LCBjb250ZXh0LT5zdGF0ZVtpXSk7CisjZWxzZQorCQltZW1jcHkoZGlnZXN0LCBjb250ZXh0LT5zdGF0ZSwgU0hBNTEyX0RJR0VTVF9MRU5HVEgpOworI2VuZGlmCisJCW1lbXNldChjb250ZXh0LCAwLCBzaXplb2YoKmNvbnRleHQpKTsKKwl9Cit9CisKKworI2lmIDAKKy8qKiogU0hBLTM4NDogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorU0hBMzg0X0luaXQoU0hBMzg0X0NUWCAqY29udGV4dCkKK3sKKwlpZiAoY29udGV4dCA9PSBOVUxMKQorCQlyZXR1cm47CisJbWVtY3B5KGNvbnRleHQtPnN0YXRlLCBzaGEzODRfaW5pdGlhbF9oYXNoX3ZhbHVlLAorCSAgICBzaXplb2Yoc2hhMzg0X2luaXRpYWxfaGFzaF92YWx1ZSkpOworCW1lbXNldChjb250ZXh0LT5idWZmZXIsIDAsIHNpemVvZihjb250ZXh0LT5idWZmZXIpKTsKKwljb250ZXh0LT5iaXRjb3VudFswXSA9IGNvbnRleHQtPmJpdGNvdW50WzFdID0gMDsKK30KKworX193ZWFrX2FsaWFzKFNIQTM4NF9UcmFuc2Zvcm0sIFNIQTUxMl9UcmFuc2Zvcm0pOworX193ZWFrX2FsaWFzKFNIQTM4NF9VcGRhdGUsIFNIQTUxMl9VcGRhdGUpOworX193ZWFrX2FsaWFzKFNIQTM4NF9QYWQsIFNIQTUxMl9QYWQpOworCit2b2lkCitTSEEzODRfRmluYWwodV9pbnQ4X3QgZGlnZXN0W1NIQTM4NF9ESUdFU1RfTEVOR1RIXSwgU0hBMzg0X0NUWCAqY29udGV4dCkKK3sKKwlTSEEzODRfUGFkKGNvbnRleHQpOworCisJLyogSWYgbm8gZGlnZXN0IGJ1ZmZlciBpcyBwYXNzZWQsIHdlIGRvbid0IGJvdGhlciBkb2luZyB0aGlzOiAqLworCWlmIChkaWdlc3QgIT0gTlVMTCkgeworI2lmIEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTgorCQlpbnQJaTsKKworCQkvKiBDb252ZXJ0IFRPIGhvc3QgYnl0ZSBvcmRlciAqLworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJQkVfNjRfVE9fOChkaWdlc3QgKyBpICogOCwgY29udGV4dC0+c3RhdGVbaV0pOworI2Vsc2UKKwkJbWVtY3B5KGRpZ2VzdCwgY29udGV4dC0+c3RhdGUsIFNIQTM4NF9ESUdFU1RfTEVOR1RIKTsKKyNlbmRpZgorCX0KKworCS8qIFplcm8gb3V0IHN0YXRlIGRhdGEgKi8KKwltZW1zZXQoY29udGV4dCwgMCwgc2l6ZW9mKCpjb250ZXh0KSk7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qICFkZWZpbmVkKEhBVkVfRVZQX1NIQTI1NikgJiYgIWRlZmluZWQoSEFWRV9TSEEyNTZfVVBEQVRFKSAmJiBcCisgICAgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwNzAwMEwpICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3NoYTIuaCBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvc2hhMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZTk0ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3NoYTIuaApAQCAtMCwwICsxLDEzMyBAQAorLyoJT3BlbkJTRDogc2hhMi5oLHYgMS42IDIwMDQvMDYvMjIgMDE6NTc6MzAgamZiIEV4cCAJKi8KKworLyoKKyAqIEZJTEU6CXNoYTIuaAorICogQVVUSE9SOglBYXJvbiBELiBHaWZmb3JkIDxtZUBhYXJvbmdpZmZvcmQuY29tPgorICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSwgQWFyb24gRC4gR2lmZm9yZAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXIgbm9yIHRoZSBuYW1lcyBvZiBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1IoUykgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SKFMpIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJvbTogc2hhMi5oLHYgMS4xIDIwMDEvMTEvMDggMDA6MDI6MDEgYWRnIEV4cCBhZGcgJAorICovCisKKy8qIE9QRU5CU0QgT1JJR0lOQUw6IGluY2x1ZGUvc2hhMi5oICovCisKKyNpZm5kZWYgX1NTSFNIQTJfSAorI2RlZmluZSBfU1NIU0hBMl9ICisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3Nsdi5oPgorCisjaWYgIWRlZmluZWQoSEFWRV9FVlBfU0hBMjU2KSAmJiAhZGVmaW5lZChIQVZFX1NIQTI1Nl9VUERBVEUpICYmIFwKKyAgICAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDAwOTA3MDAwTCkKKworLyoqKiBTSEEtMjU2LzM4NC81MTIgVmFyaW91cyBMZW5ndGggRGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFNIQTI1Nl9CTE9DS19MRU5HVEgJCTY0CisjZGVmaW5lIFNIQTI1Nl9ESUdFU1RfTEVOR1RICQkzMgorI2RlZmluZSBTSEEyNTZfRElHRVNUX1NUUklOR19MRU5HVEgJKFNIQTI1Nl9ESUdFU1RfTEVOR1RIICogMiArIDEpCisjZGVmaW5lIFNIQTM4NF9CTE9DS19MRU5HVEgJCTEyOAorI2RlZmluZSBTSEEzODRfRElHRVNUX0xFTkdUSAkJNDgKKyNkZWZpbmUgU0hBMzg0X0RJR0VTVF9TVFJJTkdfTEVOR1RICShTSEEzODRfRElHRVNUX0xFTkdUSCAqIDIgKyAxKQorI2RlZmluZSBTSEE1MTJfQkxPQ0tfTEVOR1RICQkxMjgKKyNkZWZpbmUgU0hBNTEyX0RJR0VTVF9MRU5HVEgJCTY0CisjZGVmaW5lIFNIQTUxMl9ESUdFU1RfU1RSSU5HX0xFTkdUSAkoU0hBNTEyX0RJR0VTVF9MRU5HVEggKiAyICsgMSkKKworCisvKioqIFNIQS0yNTYvMzg0LzUxMiBDb250ZXh0IFN0cnVjdHVyZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IF9TSEEyNTZfQ1RYIHsKKwl1X2ludDMyX3QJc3RhdGVbOF07CisJdV9pbnQ2NF90CWJpdGNvdW50OworCXVfaW50OF90CWJ1ZmZlcltTSEEyNTZfQkxPQ0tfTEVOR1RIXTsKK30gU0hBMjU2X0NUWDsKK3R5cGVkZWYgc3RydWN0IF9TSEE1MTJfQ1RYIHsKKwl1X2ludDY0X3QJc3RhdGVbOF07CisJdV9pbnQ2NF90CWJpdGNvdW50WzJdOworCXVfaW50OF90CWJ1ZmZlcltTSEE1MTJfQkxPQ0tfTEVOR1RIXTsKK30gU0hBNTEyX0NUWDsKKworI2lmIDAKK3R5cGVkZWYgU0hBNTEyX0NUWCBTSEEzODRfQ1RYOworI2VuZGlmCisKK3ZvaWQgU0hBMjU2X0luaXQoU0hBMjU2X0NUWCAqKTsKK3ZvaWQgU0hBMjU2X1RyYW5zZm9ybSh1X2ludDMyX3Qgc3RhdGVbOF0sIGNvbnN0IHVfaW50OF90IFtTSEEyNTZfQkxPQ0tfTEVOR1RIXSk7Cit2b2lkIFNIQTI1Nl9VcGRhdGUoU0hBMjU2X0NUWCAqLCBjb25zdCB1X2ludDhfdCAqLCBzaXplX3QpCisJX19hdHRyaWJ1dGVfXygoX19ib3VuZGVkX18oX19zdHJpbmdfXywyLDMpKSk7Cit2b2lkIFNIQTI1Nl9QYWQoU0hBMjU2X0NUWCAqKTsKK3ZvaWQgU0hBMjU2X0ZpbmFsKHVfaW50OF90IFtTSEEyNTZfRElHRVNUX0xFTkdUSF0sIFNIQTI1Nl9DVFggKikKKwlfX2F0dHJpYnV0ZV9fKChfX2JvdW5kZWRfXyhfX21pbmJ5dGVzX18sMSxTSEEyNTZfRElHRVNUX0xFTkdUSCkpKTsKK2NoYXIgKlNIQTI1Nl9FbmQoU0hBMjU2X0NUWCAqLCBjaGFyICopCisJX19hdHRyaWJ1dGVfXygoX19ib3VuZGVkX18oX19taW5ieXRlc19fLDIsU0hBMjU2X0RJR0VTVF9TVFJJTkdfTEVOR1RIKSkpOworY2hhciAqU0hBMjU2X0ZpbGUoY29uc3QgY2hhciAqLCBjaGFyICopCisJX19hdHRyaWJ1dGVfXygoX19ib3VuZGVkX18oX19taW5ieXRlc19fLDIsU0hBMjU2X0RJR0VTVF9TVFJJTkdfTEVOR1RIKSkpOworY2hhciAqU0hBMjU2X0ZpbGVDaHVuayhjb25zdCBjaGFyICosIGNoYXIgKiwgb2ZmX3QsIG9mZl90KQorCV9fYXR0cmlidXRlX18oKF9fYm91bmRlZF9fKF9fbWluYnl0ZXNfXywyLFNIQTI1Nl9ESUdFU1RfU1RSSU5HX0xFTkdUSCkpKTsKK2NoYXIgKlNIQTI1Nl9EYXRhKGNvbnN0IHVfaW50OF90ICosIHNpemVfdCwgY2hhciAqKQorCV9fYXR0cmlidXRlX18oKF9fYm91bmRlZF9fKF9fc3RyaW5nX18sMSwyKSkpCisJX19hdHRyaWJ1dGVfXygoX19ib3VuZGVkX18oX19taW5ieXRlc19fLDMsU0hBMjU2X0RJR0VTVF9TVFJJTkdfTEVOR1RIKSkpOworCisjaWYgMAordm9pZCBTSEEzODRfSW5pdChTSEEzODRfQ1RYICopOwordm9pZCBTSEEzODRfVHJhbnNmb3JtKHVfaW50NjRfdCBzdGF0ZVs4XSwgY29uc3QgdV9pbnQ4X3QgW1NIQTM4NF9CTE9DS19MRU5HVEhdKTsKK3ZvaWQgU0hBMzg0X1VwZGF0ZShTSEEzODRfQ1RYICosIGNvbnN0IHVfaW50OF90ICosIHNpemVfdCkKKwlfX2F0dHJpYnV0ZV9fKChfX2JvdW5kZWRfXyhfX3N0cmluZ19fLDIsMykpKTsKK3ZvaWQgU0hBMzg0X1BhZChTSEEzODRfQ1RYICopOwordm9pZCBTSEEzODRfRmluYWwodV9pbnQ4X3QgW1NIQTM4NF9ESUdFU1RfTEVOR1RIXSwgU0hBMzg0X0NUWCAqKQorCV9fYXR0cmlidXRlX18oKF9fYm91bmRlZF9fKF9fbWluYnl0ZXNfXywxLFNIQTM4NF9ESUdFU1RfTEVOR1RIKSkpOworY2hhciAqU0hBMzg0X0VuZChTSEEzODRfQ1RYICosIGNoYXIgKikKKwlfX2F0dHJpYnV0ZV9fKChfX2JvdW5kZWRfXyhfX21pbmJ5dGVzX18sMixTSEEzODRfRElHRVNUX1NUUklOR19MRU5HVEgpKSk7CitjaGFyICpTSEEzODRfRmlsZShjb25zdCBjaGFyICosIGNoYXIgKikKKwlfX2F0dHJpYnV0ZV9fKChfX2JvdW5kZWRfXyhfX21pbmJ5dGVzX18sMixTSEEzODRfRElHRVNUX1NUUklOR19MRU5HVEgpKSk7CitjaGFyICpTSEEzODRfRmlsZUNodW5rKGNvbnN0IGNoYXIgKiwgY2hhciAqLCBvZmZfdCwgb2ZmX3QpCisJX19hdHRyaWJ1dGVfXygoX19ib3VuZGVkX18oX19taW5ieXRlc19fLDIsU0hBMzg0X0RJR0VTVF9TVFJJTkdfTEVOR1RIKSkpOworY2hhciAqU0hBMzg0X0RhdGEoY29uc3QgdV9pbnQ4X3QgKiwgc2l6ZV90LCBjaGFyICopCisJX19hdHRyaWJ1dGVfXygoX19ib3VuZGVkX18oX19zdHJpbmdfXywxLDIpKSkKKwlfX2F0dHJpYnV0ZV9fKChfX2JvdW5kZWRfXyhfX21pbmJ5dGVzX18sMyxTSEEzODRfRElHRVNUX1NUUklOR19MRU5HVEgpKSk7CisjZW5kaWYgLyogMCAqLworCit2b2lkIFNIQTUxMl9Jbml0KFNIQTUxMl9DVFggKik7Cit2b2lkIFNIQTUxMl9UcmFuc2Zvcm0odV9pbnQ2NF90IHN0YXRlWzhdLCBjb25zdCB1X2ludDhfdCBbU0hBNTEyX0JMT0NLX0xFTkdUSF0pOwordm9pZCBTSEE1MTJfVXBkYXRlKFNIQTUxMl9DVFggKiwgY29uc3QgdV9pbnQ4X3QgKiwgc2l6ZV90KQorCV9fYXR0cmlidXRlX18oKF9fYm91bmRlZF9fKF9fc3RyaW5nX18sMiwzKSkpOwordm9pZCBTSEE1MTJfUGFkKFNIQTUxMl9DVFggKik7Cit2b2lkIFNIQTUxMl9GaW5hbCh1X2ludDhfdCBbU0hBNTEyX0RJR0VTVF9MRU5HVEhdLCBTSEE1MTJfQ1RYICopCisJX19hdHRyaWJ1dGVfXygoX19ib3VuZGVkX18oX19taW5ieXRlc19fLDEsU0hBNTEyX0RJR0VTVF9MRU5HVEgpKSk7CitjaGFyICpTSEE1MTJfRW5kKFNIQTUxMl9DVFggKiwgY2hhciAqKQorCV9fYXR0cmlidXRlX18oKF9fYm91bmRlZF9fKF9fbWluYnl0ZXNfXywyLFNIQTUxMl9ESUdFU1RfU1RSSU5HX0xFTkdUSCkpKTsKK2NoYXIgKlNIQTUxMl9GaWxlKGNvbnN0IGNoYXIgKiwgY2hhciAqKQorCV9fYXR0cmlidXRlX18oKF9fYm91bmRlZF9fKF9fbWluYnl0ZXNfXywyLFNIQTUxMl9ESUdFU1RfU1RSSU5HX0xFTkdUSCkpKTsKK2NoYXIgKlNIQTUxMl9GaWxlQ2h1bmsoY29uc3QgY2hhciAqLCBjaGFyICosIG9mZl90LCBvZmZfdCkKKwlfX2F0dHJpYnV0ZV9fKChfX2JvdW5kZWRfXyhfX21pbmJ5dGVzX18sMixTSEE1MTJfRElHRVNUX1NUUklOR19MRU5HVEgpKSk7CitjaGFyICpTSEE1MTJfRGF0YShjb25zdCB1X2ludDhfdCAqLCBzaXplX3QsIGNoYXIgKikKKwlfX2F0dHJpYnV0ZV9fKChfX2JvdW5kZWRfXyhfX3N0cmluZ19fLDEsMikpKQorCV9fYXR0cmlidXRlX18oKF9fYm91bmRlZF9fKF9fbWluYnl0ZXNfXywzLFNIQTUxMl9ESUdFU1RfU1RSSU5HX0xFTkdUSCkpKTsKKworI2VuZGlmIC8qICFkZWZpbmVkKEhBVkVfRVZQX1NIQTI1NikgJiYgIWRlZmluZWQoSEFWRV9TSEEyNTZfVVBEQVRFKSAmJiBcCisgICAgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwNzAwMEwpICovCisKKyNlbmRpZiAvKiBfU1NIU0hBMl9IICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3NpZ2FjdC5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9zaWdhY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjc4NDVjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9zaWdhY3QuYwpAQCAtMCwwICsxLDEzMiBAQAorLyoJJE9wZW5CU0Q6IHNpZ2FjdGlvbi5jLHYgMS40IDIwMDEvMDEvMjIgMTg6MDE6NDggbWlsbGVydCBFeHAgJAkqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAxOTk4LDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgKgorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAgICAgICAgICAgICoKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgICAgICAqCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsICAgICAgKgorICogZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSB3aXRoIG1vZGlmaWNhdGlvbnMsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICAgICAgICoKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAgICAqCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkICAqCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTICAqCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBQk9WRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgICAqCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgKgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgICoKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgICoKKyAqIGhvbGRlcnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlICAgICAqCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgKgorICogYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEF1dGhvcjogWmV5ZCBNLiBCZW4tSGFsaW0gPHptYmVuaGFsQG5ldGNvbS5jb20+IDE5OTIsMTk5NSAgICAgICAgICAgICAgICoKKyAqICAgICBhbmQ6IEVyaWMgUy4gUmF5bW9uZCA8ZXNyQHNuYXJrLnRoeXJzdXMuY29tPiAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmN1cnNlcy9iYXNlL3NpZ2FjdGlvbi5jICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSAic2lnYWN0LmgiCisKKy8qIFRoaXMgZmlsZSBwcm92aWRlcyBzaWdhY3Rpb24oKSBlbXVsYXRpb24gdXNpbmcgc2lndmVjKCkgKi8KKy8qIFVzZSBvbmx5IGlmIHRoaXMgaXMgbm9uIFBPU0lYIHN5c3RlbSAqLworCisjaWYgIUhBVkVfU0lHQUNUSU9OICYmIEhBVkVfU0lHVkVDCisKK2ludAorc2lnYWN0aW9uKGludCBzaWcsIHN0cnVjdCBzaWdhY3Rpb24gKnNpZ2FjdCwgc3RydWN0IHNpZ2FjdGlvbiAqb3NpZ2FjdCkKK3sKKwlyZXR1cm4gc2lndmVjKHNpZywgc2lnYWN0ID8gJnNpZ2FjdC0+c3YgOiBOVUxMLAorCSAgICBvc2lnYWN0ID8gJm9zaWdhY3QtPnN2IDogTlVMTCk7Cit9CisKK2ludAorc2lnZW1wdHlzZXQgKHNpZ3NldF90ICptYXNrKQoreworCWlmICghbWFzaykgeworCQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuIC0xOworCX0KKwkqbWFzayA9IDA7CisJcmV0dXJuIDA7Cit9CisKK2ludAorc2lncHJvY21hc2sgKGludCBtb2RlLCBzaWdzZXRfdCAqbWFzaywgc2lnc2V0X3QgKm9tYXNrKQoreworCXNpZ3NldF90IGN1cnJlbnQgPSBzaWdzZXRtYXNrKDApOworCisJaWYgKCFtYXNrKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG9tYXNrKQorCQkqb21hc2sgPSBjdXJyZW50OworCisJaWYgKG1vZGUgPT0gU0lHX0JMT0NLKQorCQljdXJyZW50IHw9ICptYXNrOworCWVsc2UgaWYgKG1vZGUgPT0gU0lHX1VOQkxPQ0spCisJCWN1cnJlbnQgJj0gfiptYXNrOworCWVsc2UgaWYgKG1vZGUgPT0gU0lHX1NFVE1BU0spCisJY3VycmVudCA9ICptYXNrOworCisJc2lnc2V0bWFzayhjdXJyZW50KTsKKwlyZXR1cm4gMDsKK30KKworaW50CitzaWdzdXNwZW5kIChzaWdzZXRfdCAqbWFzaykKK3sKKwlpZiAoIW1hc2spIHsKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIHNpZ3BhdXNlKCptYXNrKTsKK30KKworaW50CitzaWdkZWxzZXQgKHNpZ3NldF90ICptYXNrLCBpbnQgc2lnKQoreworCWlmICghbWFzaykgeworCQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuIC0xOworCX0KKwkqbWFzayAmPSB+c2lnbWFzayhzaWcpOworCXJldHVybiAwOworfQorCitpbnQKK3NpZ2FkZHNldCAoc2lnc2V0X3QgKm1hc2ssIGludCBzaWcpCit7CisJaWYgKCFtYXNrKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gLTE7CisJfQorCSptYXNrIHw9IHNpZ21hc2soc2lnKTsKKwlyZXR1cm4gMDsKK30KKworaW50CitzaWdpc21lbWJlciAoc2lnc2V0X3QgKm1hc2ssIGludCBzaWcpCit7CisJaWYgKCFtYXNrKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAoKm1hc2sgJiBzaWdtYXNrKHNpZykpICE9IDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9zaWdhY3QuaCBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvc2lnYWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI5NmQwYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvc2lnYWN0LmgKQEAgLTAsMCArMSw5MCBAQAorLyoJJE9wZW5CU0Q6IFNpZ0FjdGlvbi5oLHYgMS4zIDIwMDEvMDEvMjIgMTg6MDE6MzIgbWlsbGVydCBFeHAgJAkqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAxOTk4LDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgKgorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAgICAgICAgICAgICoKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgICAgICAqCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsICAgICAgKgorICogZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSB3aXRoIG1vZGlmaWNhdGlvbnMsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICAgICAgICoKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAgICAqCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkICAqCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTICAqCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBQk9WRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgICAqCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgKgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgICoKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgICoKKyAqIGhvbGRlcnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlICAgICAqCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgKgorICogYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEF1dGhvcjogWmV5ZCBNLiBCZW4tSGFsaW0gPHptYmVuaGFsQG5ldGNvbS5jb20+IDE5OTIsMTk5NSAgICAgICAgICAgICAgICoKKyAqICAgICBhbmQ6IEVyaWMgUy4gUmF5bW9uZCA8ZXNyQHNuYXJrLnRoeXJzdXMuY29tPiAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICRGcm9tOiBTaWdBY3Rpb24uaCx2IDEuNiAyMDAwLzEyLzEwIDAyOjM2OjEwIHRvbSBFeHAgJAorICoKKyAqIFRoaXMgZmlsZSBleGlzdHMgdG8gaGFuZGxlIG5vbi1QT1NJWCBzeXN0ZW1zIHdoaWNoIGRvbid0IGhhdmUgPHVuaXN0ZC5oPiwKKyAqIGFuZCB1c3VhbGx5IG5vIHNpZ2FjdGlvbigpIG5vciA8dGVybWlvcy5oPgorICovCisKKy8qIE9QRU5CU0QgT1JJR0lOQUw6IGxpYi9saWJjdXJzZXMvU2lnQWN0aW9uLmggKi8KKworI2lmbmRlZiBfU0lHQUNUSU9OX0gKKyNkZWZpbmUgX1NJR0FDVElPTl9ICisKKyNpZiAhZGVmaW5lZChIQVZFX1NJR0FDVElPTikgJiYgZGVmaW5lZChIQVZFX1NJR1ZFQykKKworI3VuZGVmICBTSUdfQkxPQ0sKKyNkZWZpbmUgU0lHX0JMT0NLICAgICAgIDAwCisKKyN1bmRlZiAgU0lHX1VOQkxPQ0sKKyNkZWZpbmUgU0lHX1VOQkxPQ0sgICAgIDAxCisKKyN1bmRlZiAgU0lHX1NFVE1BU0sKKyNkZWZpbmUgU0lHX1NFVE1BU0sgICAgIDAyCisKKy8qCisgKiA8YnNkL3NpZ25hbC5oPiBpcyBpbiB0aGUgTGludXggMS4yLjggKyBnY2MgMi43LjAgY29uZmlndXJhdGlvbiwKKyAqIGFuZCBpcyB1c2VmdWwgZm9yIHRlc3RpbmcgdGhpcyBoZWFkZXIgZmlsZS4KKyAqLworI2lmIEhBVkVfQlNEX1NJR05BTF9ICisjIGluY2x1ZGUgPGJzZC9zaWduYWwuaD4KKyNlbmRpZgorCitzdHJ1Y3Qgc2lnYWN0aW9uCit7CisJc3RydWN0IHNpZ3ZlYyBzdjsKK307CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBzaWdzZXRfdDsKKworI3VuZGVmICBzYV9tYXNrCisjZGVmaW5lIHNhX21hc2sgc3Yuc3ZfbWFzaworI3VuZGVmICBzYV9oYW5kbGVyCisjZGVmaW5lIHNhX2hhbmRsZXIgc3Yuc3ZfaGFuZGxlcgorI3VuZGVmICBzYV9mbGFncworI2RlZmluZSBzYV9mbGFncyBzdi5zdl9mbGFncworCitpbnQgc2lnYWN0aW9uKGludCBzaWcsIHN0cnVjdCBzaWdhY3Rpb24gKnNpZ2FjdCwgc3RydWN0IHNpZ2FjdGlvbiAqb3NpZ2FjdCk7CitpbnQgc2lncHJvY21hc2sgKGludCBob3csIHNpZ3NldF90ICptYXNrLCBzaWdzZXRfdCAqb21hc2spOworaW50IHNpZ2VtcHR5c2V0IChzaWdzZXRfdCAqbWFzayk7CitpbnQgc2lnc3VzcGVuZCAoc2lnc2V0X3QgKm1hc2spOworaW50IHNpZ2RlbHNldCAoc2lnc2V0X3QgKm1hc2ssIGludCBzaWcpOworaW50IHNpZ2FkZHNldCAoc2lnc2V0X3QgKm1hc2ssIGludCBzaWcpOworCisjZW5kaWYgLyogIWRlZmluZWQoSEFWRV9TSUdBQ1RJT04pICYmIGRlZmluZWQoSEFWRV9TSUdWRUMpICovCisKKyNlbmRpZiAvKiAhZGVmaW5lZChfU0lHQUNUSU9OX0gpICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3N0cmxjYXQuYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvc3RybGNhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYzFiNjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3N0cmxjYXQuYwpAQCAtMCwwICsxLDYyIEBACisvKgkkT3BlbkJTRDogc3RybGNhdC5jLHYgMS4xMyAyMDA1LzA4LzA4IDA4OjA1OjM3IGVzcGllIEV4cCAkCSovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTggVG9kZCBDLiBNaWxsZXIgPFRvZGQuTWlsbGVyQGNvdXJ0ZXNhbi5jb20+CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvc3RyaW5nL3N0cmxjYXQuYyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKyNpZm5kZWYgSEFWRV9TVFJMQ0FUCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoKKyAqIEFwcGVuZHMgc3JjIHRvIHN0cmluZyBkc3Qgb2Ygc2l6ZSBzaXogKHVubGlrZSBzdHJuY2F0LCBzaXogaXMgdGhlCisgKiBmdWxsIHNpemUgb2YgZHN0LCBub3Qgc3BhY2UgbGVmdCkuICBBdCBtb3N0IHNpei0xIGNoYXJhY3RlcnMKKyAqIHdpbGwgYmUgY29waWVkLiAgQWx3YXlzIE5VTCB0ZXJtaW5hdGVzICh1bmxlc3Mgc2l6IDw9IHN0cmxlbihkc3QpKS4KKyAqIFJldHVybnMgc3RybGVuKHNyYykgKyBNSU4oc2l6LCBzdHJsZW4oaW5pdGlhbCBkc3QpKS4KKyAqIElmIHJldHZhbCA+PSBzaXosIHRydW5jYXRpb24gb2NjdXJyZWQuCisgKi8KK3NpemVfdAorc3RybGNhdChjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNpeikKK3sKKwljaGFyICpkID0gZHN0OworCWNvbnN0IGNoYXIgKnMgPSBzcmM7CisJc2l6ZV90IG4gPSBzaXo7CisJc2l6ZV90IGRsZW47CisKKwkvKiBGaW5kIHRoZSBlbmQgb2YgZHN0IGFuZCBhZGp1c3QgYnl0ZXMgbGVmdCBidXQgZG9uJ3QgZ28gcGFzdCBlbmQgKi8KKwl3aGlsZSAobi0tICE9IDAgJiYgKmQgIT0gJ1wwJykKKwkJZCsrOworCWRsZW4gPSBkIC0gZHN0OworCW4gPSBzaXogLSBkbGVuOworCisJaWYgKG4gPT0gMCkKKwkJcmV0dXJuKGRsZW4gKyBzdHJsZW4ocykpOworCXdoaWxlICgqcyAhPSAnXDAnKSB7CisJCWlmIChuICE9IDEpIHsKKwkJCSpkKysgPSAqczsKKwkJCW4tLTsKKwkJfQorCQlzKys7CisJfQorCSpkID0gJ1wwJzsKKworCXJldHVybihkbGVuICsgKHMgLSBzcmMpKTsJLyogY291bnQgZG9lcyBub3QgaW5jbHVkZSBOVUwgKi8KK30KKworI2VuZGlmIC8qICFIQVZFX1NUUkxDQVQgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvc3RybGNweS5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9zdHJsY3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiMWI2MAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvc3RybGNweS5jCkBAIC0wLDAgKzEsNTggQEAKKy8qCSRPcGVuQlNEOiBzdHJsY3B5LmMsdiAxLjExIDIwMDYvMDUvMDUgMTU6Mjc6MzggbWlsbGVydCBFeHAgJAkqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk4IFRvZGQgQy4gTWlsbGVyIDxUb2RkLk1pbGxlckBjb3VydGVzYW4uY29tPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qIE9QRU5CU0QgT1JJR0lOQUw6IGxpYi9saWJjL3N0cmluZy9zdHJsY3B5LmMgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisjaWZuZGVmIEhBVkVfU1RSTENQWQorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qCisgKiBDb3B5IHNyYyB0byBzdHJpbmcgZHN0IG9mIHNpemUgc2l6LiAgQXQgbW9zdCBzaXotMSBjaGFyYWN0ZXJzCisgKiB3aWxsIGJlIGNvcGllZC4gIEFsd2F5cyBOVUwgdGVybWluYXRlcyAodW5sZXNzIHNpeiA9PSAwKS4KKyAqIFJldHVybnMgc3RybGVuKHNyYyk7IGlmIHJldHZhbCA+PSBzaXosIHRydW5jYXRpb24gb2NjdXJyZWQuCisgKi8KK3NpemVfdAorc3RybGNweShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNpeikKK3sKKwljaGFyICpkID0gZHN0OworCWNvbnN0IGNoYXIgKnMgPSBzcmM7CisJc2l6ZV90IG4gPSBzaXo7CisKKwkvKiBDb3B5IGFzIG1hbnkgYnl0ZXMgYXMgd2lsbCBmaXQgKi8KKwlpZiAobiAhPSAwKSB7CisJCXdoaWxlICgtLW4gIT0gMCkgeworCQkJaWYgKCgqZCsrID0gKnMrKykgPT0gJ1wwJykKKwkJCQlicmVhazsKKwkJfQorCX0KKworCS8qIE5vdCBlbm91Z2ggcm9vbSBpbiBkc3QsIGFkZCBOVUwgYW5kIHRyYXZlcnNlIHJlc3Qgb2Ygc3JjICovCisJaWYgKG4gPT0gMCkgeworCQlpZiAoc2l6ICE9IDApCisJCQkqZCA9ICdcMCc7CQkvKiBOVUwtdGVybWluYXRlIGRzdCAqLworCQl3aGlsZSAoKnMrKykKKwkJCTsKKwl9CisKKwlyZXR1cm4ocyAtIHNyYyAtIDEpOwkvKiBjb3VudCBkb2VzIG5vdCBpbmNsdWRlIE5VTCAqLworfQorCisjZW5kaWYgLyogIUhBVkVfU1RSTENQWSAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9zdHJtb2RlLmMgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3N0cm1vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTgxNjE0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9zdHJtb2RlLmMKQEAgLTAsMCArMSwxNDggQEAKKy8qCSRPcGVuQlNEOiBzdHJtb2RlLmMsdiAxLjcgMjAwNS8wOC8wOCAwODowNTozNyBlc3BpZSBFeHAgJCAqLworLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qIE9QRU5CU0QgT1JJR0lOQUw6IGxpYi9saWJjL3N0cmluZy9zdHJtb2RlLmMgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisjaWZuZGVmIEhBVkVfU1RSTU9ERQorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyogWFhYIG1vZGUgc2hvdWxkIGJlIG1vZGVfdCAqLworCit2b2lkCitzdHJtb2RlKGludCBtb2RlLCBjaGFyICpwKQoreworCSAvKiBwcmludCB0eXBlICovCisJc3dpdGNoIChtb2RlICYgU19JRk1UKSB7CisJY2FzZSBTX0lGRElSOgkJCS8qIGRpcmVjdG9yeSAqLworCQkqcCsrID0gJ2QnOworCQlicmVhazsKKwljYXNlIFNfSUZDSFI6CQkJLyogY2hhcmFjdGVyIHNwZWNpYWwgKi8KKwkJKnArKyA9ICdjJzsKKwkJYnJlYWs7CisJY2FzZSBTX0lGQkxLOgkJCS8qIGJsb2NrIHNwZWNpYWwgKi8KKwkJKnArKyA9ICdiJzsKKwkJYnJlYWs7CisJY2FzZSBTX0lGUkVHOgkJCS8qIHJlZ3VsYXIgKi8KKwkJKnArKyA9ICctJzsKKwkJYnJlYWs7CisJY2FzZSBTX0lGTE5LOgkJCS8qIHN5bWJvbGljIGxpbmsgKi8KKwkJKnArKyA9ICdsJzsKKwkJYnJlYWs7CisjaWZkZWYgU19JRlNPQ0sKKwljYXNlIFNfSUZTT0NLOgkJCS8qIHNvY2tldCAqLworCQkqcCsrID0gJ3MnOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIFNfSUZJRk8KKwljYXNlIFNfSUZJRk86CQkJLyogZmlmbyAqLworCQkqcCsrID0gJ3AnOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CQkJLyogdW5rbm93biAqLworCQkqcCsrID0gJz8nOworCQlicmVhazsKKwl9CisJLyogdXNyICovCisJaWYgKG1vZGUgJiBTX0lSVVNSKQorCQkqcCsrID0gJ3InOworCWVsc2UKKwkJKnArKyA9ICctJzsKKwlpZiAobW9kZSAmIFNfSVdVU1IpCisJCSpwKysgPSAndyc7CisJZWxzZQorCQkqcCsrID0gJy0nOworCXN3aXRjaCAobW9kZSAmIChTX0lYVVNSIHwgU19JU1VJRCkpIHsKKwljYXNlIDA6CisJCSpwKysgPSAnLSc7CisJCWJyZWFrOworCWNhc2UgU19JWFVTUjoKKwkJKnArKyA9ICd4JzsKKwkJYnJlYWs7CisJY2FzZSBTX0lTVUlEOgorCQkqcCsrID0gJ1MnOworCQlicmVhazsKKwljYXNlIFNfSVhVU1IgfCBTX0lTVUlEOgorCQkqcCsrID0gJ3MnOworCQlicmVhazsKKwl9CisJLyogZ3JvdXAgKi8KKwlpZiAobW9kZSAmIFNfSVJHUlApCisJCSpwKysgPSAncic7CisJZWxzZQorCQkqcCsrID0gJy0nOworCWlmIChtb2RlICYgU19JV0dSUCkKKwkJKnArKyA9ICd3JzsKKwllbHNlCisJCSpwKysgPSAnLSc7CisJc3dpdGNoIChtb2RlICYgKFNfSVhHUlAgfCBTX0lTR0lEKSkgeworCWNhc2UgMDoKKwkJKnArKyA9ICctJzsKKwkJYnJlYWs7CisJY2FzZSBTX0lYR1JQOgorCQkqcCsrID0gJ3gnOworCQlicmVhazsKKwljYXNlIFNfSVNHSUQ6CisJCSpwKysgPSAnUyc7CisJCWJyZWFrOworCWNhc2UgU19JWEdSUCB8IFNfSVNHSUQ6CisJCSpwKysgPSAncyc7CisJCWJyZWFrOworCX0KKwkvKiBvdGhlciAqLworCWlmIChtb2RlICYgU19JUk9USCkKKwkJKnArKyA9ICdyJzsKKwllbHNlCisJCSpwKysgPSAnLSc7CisJaWYgKG1vZGUgJiBTX0lXT1RIKQorCQkqcCsrID0gJ3cnOworCWVsc2UKKwkJKnArKyA9ICctJzsKKwlzd2l0Y2ggKG1vZGUgJiAoU19JWE9USCB8IFNfSVNWVFgpKSB7CisJY2FzZSAwOgorCQkqcCsrID0gJy0nOworCQlicmVhazsKKwljYXNlIFNfSVhPVEg6CisJCSpwKysgPSAneCc7CisJCWJyZWFrOworCWNhc2UgU19JU1ZUWDoKKwkJKnArKyA9ICdUJzsKKwkJYnJlYWs7CisJY2FzZSBTX0lYT1RIIHwgU19JU1ZUWDoKKwkJKnArKyA9ICd0JzsKKwkJYnJlYWs7CisJfQorCSpwKysgPSAnICc7CQkvKiB3aWxsIGJlIGEgJysnIGlmIEFDTCdzIGltcGxlbWVudGVkICovCisJKnAgPSAnXDAnOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3N0cm5sZW4uYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvc3Rybmxlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZDUxNTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3N0cm5sZW4uYwpAQCAtMCwwICsxLDM3IEBACisvKgkkT3BlbkJTRDogc3Rybmxlbi5jLHYgMS4zIDIwMTAvMDYvMDIgMTI6NTg6MTIgbWlsbGVydCBFeHAgJAkqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFRvZGQgQy4gTWlsbGVyIDxUb2RkLk1pbGxlckBjb3VydGVzYW4uY29tPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qIE9QRU5CU0QgT1JJR0lOQUw6IGxpYi9saWJjL3N0cmluZy9zdHJubGVuLmMgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lmbmRlZiBIQVZFX1NUUk5MRU4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitzaXplX3QKK3N0cm5sZW4oY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbWF4bGVuKQoreworCWNvbnN0IGNoYXIgKmNwOworCisJZm9yIChjcCA9IHN0cjsgbWF4bGVuICE9IDAgJiYgKmNwICE9ICdcMCc7IGNwKyssIG1heGxlbi0tKQorCQk7CisKKwlyZXR1cm4gKHNpemVfdCkoY3AgLSBzdHIpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3N0cnB0aW1lLmMgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3N0cnB0aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkODNkOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvc3RycHRpbWUuYwpAQCAtMCwwICsxLDQwMSBAQAorLyoJJE9wZW5CU0Q6IHN0cnB0aW1lLmMsdiAxLjEyIDIwMDgvMDYvMjYgMDU6NDI6MDUgcmF5IEV4cCAkICovCisvKgkkTmV0QlNEOiBzdHJwdGltZS5jLHYgMS4xMiAxOTk4LzAxLzIwIDIxOjM5OjQwIG15Y3JvZnQgRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTggVGhlIE5ldEJTRCBGb3VuZGF0aW9uLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSB3YXMgY29udHJpYnV0ZWQgdG8gVGhlIE5ldEJTRCBGb3VuZGF0aW9uIGJ5IEtsYXVzIEtsZWluLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE5FVEJTRCBGT1VOREFUSU9OLCBJTkMuIEFORCBDT05UUklCVVRPUlMKKyAqIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorICogVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgRk9VTkRBVElPTiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qIE9QRU5CU0QgT1JJR0lOQUw6IGxpYi9saWJjL3RpbWUvc3RycHRpbWUuYyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2lmbmRlZiBIQVZFX1NUUlBUSU1FCisKKyNkZWZpbmUgVE1fWUVBUl9CQVNFIDE5MDAJLyogZnJvbSB0emZpbGUuaCAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxsb2NhbGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKy8qICNkZWZpbmUJX2N0bG9jKHgpCQkoX0N1cnJlbnRUaW1lTG9jYWxlLT54KSAqLworCisvKgorICogV2UgZG8gbm90IGltcGxlbWVudCBhbHRlcm5hdGUgcmVwcmVzZW50YXRpb25zLiBIb3dldmVyLCB3ZSBhbHdheXMKKyAqIGNoZWNrIHdoZXRoZXIgYSBnaXZlbiBtb2RpZmllciBpcyBhbGxvd2VkIGZvciBhIGNlcnRhaW4gY29udmVyc2lvbi4KKyAqLworI2RlZmluZSBfQUxUX0UJCQkweDAxCisjZGVmaW5lIF9BTFRfTwkJCTB4MDIKKyNkZWZpbmUJX0xFR0FMX0FMVCh4KQkJeyBpZiAoYWx0X2Zvcm1hdCAmIH4oeCkpIHJldHVybiAoMCk7IH0KKworCitzdGF0aWMJaW50IF9jb252X251bShjb25zdCB1bnNpZ25lZCBjaGFyICoqLCBpbnQgKiwgaW50LCBpbnQpOworc3RhdGljCWNoYXIgKl9zdHJwdGltZShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgc3RydWN0IHRtICosIGludCk7CisKKworY2hhciAqCitzdHJwdGltZShjb25zdCBjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZtdCwgc3RydWN0IHRtICp0bSkKK3sKKwlyZXR1cm4oX3N0cnB0aW1lKGJ1ZiwgZm10LCB0bSwgMSkpOworfQorCitzdGF0aWMgY2hhciAqCitfc3RycHRpbWUoY29uc3QgY2hhciAqYnVmLCBjb25zdCBjaGFyICpmbXQsIHN0cnVjdCB0bSAqdG0sIGludCBpbml0aWFsaXplKQoreworCXVuc2lnbmVkIGNoYXIgYzsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpicDsKKwlzaXplX3QgbGVuOworCWludCBhbHRfZm9ybWF0LCBpOworCXN0YXRpYyBpbnQgY2VudHVyeSwgcmVseWVhcjsKKworCWlmIChpbml0aWFsaXplKSB7CisJCWNlbnR1cnkgPSBUTV9ZRUFSX0JBU0U7CisJCXJlbHllYXIgPSAtMTsKKwl9CisKKwlicCA9ICh1bnNpZ25lZCBjaGFyICopYnVmOworCXdoaWxlICgoYyA9ICpmbXQpICE9ICdcMCcpIHsKKwkJLyogQ2xlYXIgYGFsdGVybmF0ZScgbW9kaWZpZXIgcHJpb3IgdG8gbmV3IGNvbnZlcnNpb24uICovCisJCWFsdF9mb3JtYXQgPSAwOworCisJCS8qIEVhdCB1cCB3aGl0ZS1zcGFjZS4gKi8KKwkJaWYgKGlzc3BhY2UoYykpIHsKKwkJCXdoaWxlIChpc3NwYWNlKCpicCkpCisJCQkJYnArKzsKKworCQkJZm10Kys7CisJCQljb250aW51ZTsKKwkJfQorCQkJCQorCQlpZiAoKGMgPSAqZm10KyspICE9ICclJykKKwkJCWdvdG8gbGl0ZXJhbDsKKworCithZ2FpbjoJCXN3aXRjaCAoYyA9ICpmbXQrKykgeworCQljYXNlICclJzoJLyogIiUlIiBpcyBjb252ZXJ0ZWQgdG8gIiUiLiAqLworbGl0ZXJhbDoKKwkJaWYgKGMgIT0gKmJwKyspCisJCQlyZXR1cm4gKE5VTEwpOworCisJCWJyZWFrOworCisJCS8qCisJCSAqICJBbHRlcm5hdGl2ZSIgbW9kaWZpZXJzLiBKdXN0IHNldCB0aGUgYXBwcm9wcmlhdGUgZmxhZworCQkgKiBhbmQgc3RhcnQgb3ZlciBhZ2Fpbi4KKwkJICovCisJCWNhc2UgJ0UnOgkvKiAiJUU/IiBhbHRlcm5hdGl2ZSBjb252ZXJzaW9uIG1vZGlmaWVyLiAqLworCQkJX0xFR0FMX0FMVCgwKTsKKwkJCWFsdF9mb3JtYXQgfD0gX0FMVF9FOworCQkJZ290byBhZ2FpbjsKKworCQljYXNlICdPJzoJLyogIiVPPyIgYWx0ZXJuYXRpdmUgY29udmVyc2lvbiBtb2RpZmllci4gKi8KKwkJCV9MRUdBTF9BTFQoMCk7CisJCQlhbHRfZm9ybWF0IHw9IF9BTFRfTzsKKwkJCWdvdG8gYWdhaW47CisJCQkKKwkJLyoKKwkJICogIkNvbXBsZXgiIGNvbnZlcnNpb24gcnVsZXMsIGltcGxlbWVudGVkIHRocm91Z2ggcmVjdXJzaW9uLgorCQkgKi8KKyNpZiAwCisJCWNhc2UgJ2MnOgkvKiBEYXRlIGFuZCB0aW1lLCB1c2luZyB0aGUgbG9jYWxlJ3MgZm9ybWF0LiAqLworCQkJX0xFR0FMX0FMVChfQUxUX0UpOworCQkJaWYgKCEoYnAgPSBfc3RycHRpbWUoYnAsIF9jdGxvYyhkX3RfZm10KSwgdG0sIDApKSkKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJY2FzZSAnRCc6CS8qIFRoZSBkYXRlIGFzICIlbS8lZC8leSIuICovCisJCQlfTEVHQUxfQUxUKDApOworCQkJaWYgKCEoYnAgPSBfc3RycHRpbWUoYnAsICIlbS8lZC8leSIsIHRtLCAwKSkpCisJCQkJcmV0dXJuIChOVUxMKTsKKwkJCWJyZWFrOworCQorCQljYXNlICdSJzoJLyogVGhlIHRpbWUgYXMgIiVIOiVNIi4gKi8KKwkJCV9MRUdBTF9BTFQoMCk7CisJCQlpZiAoIShicCA9IF9zdHJwdGltZShicCwgIiVIOiVNIiwgdG0sIDApKSkKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJYnJlYWs7CisKKwkJY2FzZSAncic6CS8qIFRoZSB0aW1lIGFzICIlSTolTTolUyAlcCIuICovCisJCQlfTEVHQUxfQUxUKDApOworCQkJaWYgKCEoYnAgPSBfc3RycHRpbWUoYnAsICIlSTolTTolUyAlcCIsIHRtLCAwKSkpCisJCQkJcmV0dXJuIChOVUxMKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ1QnOgkvKiBUaGUgdGltZSBhcyAiJUg6JU06JVMiLiAqLworCQkJX0xFR0FMX0FMVCgwKTsKKwkJCWlmICghKGJwID0gX3N0cnB0aW1lKGJwLCAiJUg6JU06JVMiLCB0bSwgMCkpKQorCQkJCXJldHVybiAoTlVMTCk7CisJCQlicmVhazsKKyNpZiAwCisJCWNhc2UgJ1gnOgkvKiBUaGUgdGltZSwgdXNpbmcgdGhlIGxvY2FsZSdzIGZvcm1hdC4gKi8KKwkJCV9MRUdBTF9BTFQoX0FMVF9FKTsKKwkJCWlmICghKGJwID0gX3N0cnB0aW1lKGJwLCBfY3Rsb2ModF9mbXQpLCB0bSwgMCkpKQorCQkJCXJldHVybiAoTlVMTCk7CisJCQlicmVhazsKKworCQljYXNlICd4JzoJLyogVGhlIGRhdGUsIHVzaW5nIHRoZSBsb2NhbGUncyBmb3JtYXQuICovCisJCQlfTEVHQUxfQUxUKF9BTFRfRSk7CisJCQlpZiAoIShicCA9IF9zdHJwdGltZShicCwgX2N0bG9jKGRfZm10KSwgdG0sIDApKSkKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJLyoKKwkJICogIkVsZW1lbnRhcnkiIGNvbnZlcnNpb24gcnVsZXMuCisJCSAqLworI2lmIDAKKwkJY2FzZSAnQSc6CS8qIFRoZSBkYXkgb2Ygd2VlaywgdXNpbmcgdGhlIGxvY2FsZSdzIGZvcm0uICovCisJCWNhc2UgJ2EnOgorCQkJX0xFR0FMX0FMVCgwKTsKKwkJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJCQkvKiBGdWxsIG5hbWUuICovCisJCQkJbGVuID0gc3RybGVuKF9jdGxvYyhkYXlbaV0pKTsKKwkJCQlpZiAoc3RybmNhc2VjbXAoX2N0bG9jKGRheVtpXSksIGJwLCBsZW4pID09IDApCisJCQkJCWJyZWFrOworCisJCQkJLyogQWJicmV2aWF0ZWQgbmFtZS4gKi8KKwkJCQlsZW4gPSBzdHJsZW4oX2N0bG9jKGFiZGF5W2ldKSk7CisJCQkJaWYgKHN0cm5jYXNlY21wKF9jdGxvYyhhYmRheVtpXSksIGJwLCBsZW4pID09IDApCisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBOb3RoaW5nIG1hdGNoZWQuICovCisJCQlpZiAoaSA9PSA3KQorCQkJCXJldHVybiAoTlVMTCk7CisKKwkJCXRtLT50bV93ZGF5ID0gaTsKKwkJCWJwICs9IGxlbjsKKwkJCWJyZWFrOworCisJCWNhc2UgJ0InOgkvKiBUaGUgbW9udGgsIHVzaW5nIHRoZSBsb2NhbGUncyBmb3JtLiAqLworCQljYXNlICdiJzoKKwkJY2FzZSAnaCc6CisJCQlfTEVHQUxfQUxUKDApOworCQkJZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHsKKwkJCQkvKiBGdWxsIG5hbWUuICovCisJCQkJbGVuID0gc3RybGVuKF9jdGxvYyhtb25baV0pKTsKKwkJCQlpZiAoc3RybmNhc2VjbXAoX2N0bG9jKG1vbltpXSksIGJwLCBsZW4pID09IDApCisJCQkJCWJyZWFrOworCisJCQkJLyogQWJicmV2aWF0ZWQgbmFtZS4gKi8KKwkJCQlsZW4gPSBzdHJsZW4oX2N0bG9jKGFibW9uW2ldKSk7CisJCQkJaWYgKHN0cm5jYXNlY21wKF9jdGxvYyhhYm1vbltpXSksIGJwLCBsZW4pID09IDApCisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBOb3RoaW5nIG1hdGNoZWQuICovCisJCQlpZiAoaSA9PSAxMikKKwkJCQlyZXR1cm4gKE5VTEwpOworCisJCQl0bS0+dG1fbW9uID0gaTsKKwkJCWJwICs9IGxlbjsKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJY2FzZSAnQyc6CS8qIFRoZSBjZW50dXJ5IG51bWJlci4gKi8KKwkJCV9MRUdBTF9BTFQoX0FMVF9FKTsKKwkJCWlmICghKF9jb252X251bSgmYnAsICZpLCAwLCA5OSkpKQorCQkJCXJldHVybiAoTlVMTCk7CisKKwkJCWNlbnR1cnkgPSBpICogMTAwOworCQkJYnJlYWs7CisKKwkJY2FzZSAnZCc6CS8qIFRoZSBkYXkgb2YgbW9udGguICovCisJCWNhc2UgJ2UnOgorCQkJX0xFR0FMX0FMVChfQUxUX08pOworCQkJaWYgKCEoX2NvbnZfbnVtKCZicCwgJnRtLT50bV9tZGF5LCAxLCAzMSkpKQorCQkJCXJldHVybiAoTlVMTCk7CisJCQlicmVhazsKKworCQljYXNlICdrJzoJLyogVGhlIGhvdXIgKDI0LWhvdXIgY2xvY2sgcmVwcmVzZW50YXRpb24pLiAqLworCQkJX0xFR0FMX0FMVCgwKTsKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWNhc2UgJ0gnOgorCQkJX0xFR0FMX0FMVChfQUxUX08pOworCQkJaWYgKCEoX2NvbnZfbnVtKCZicCwgJnRtLT50bV9ob3VyLCAwLCAyMykpKQorCQkJCXJldHVybiAoTlVMTCk7CisJCQlicmVhazsKKworCQljYXNlICdsJzoJLyogVGhlIGhvdXIgKDEyLWhvdXIgY2xvY2sgcmVwcmVzZW50YXRpb24pLiAqLworCQkJX0xFR0FMX0FMVCgwKTsKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWNhc2UgJ0knOgorCQkJX0xFR0FMX0FMVChfQUxUX08pOworCQkJaWYgKCEoX2NvbnZfbnVtKCZicCwgJnRtLT50bV9ob3VyLCAxLCAxMikpKQorCQkJCXJldHVybiAoTlVMTCk7CisJCQlicmVhazsKKworCQljYXNlICdqJzoJLyogVGhlIGRheSBvZiB5ZWFyLiAqLworCQkJX0xFR0FMX0FMVCgwKTsKKwkJCWlmICghKF9jb252X251bSgmYnAsICZ0bS0+dG1feWRheSwgMSwgMzY2KSkpCisJCQkJcmV0dXJuIChOVUxMKTsKKwkJCXRtLT50bV95ZGF5LS07CisJCQlicmVhazsKKworCQljYXNlICdNJzoJLyogVGhlIG1pbnV0ZS4gKi8KKwkJCV9MRUdBTF9BTFQoX0FMVF9PKTsKKwkJCWlmICghKF9jb252X251bSgmYnAsICZ0bS0+dG1fbWluLCAwLCA1OSkpKQorCQkJCXJldHVybiAoTlVMTCk7CisJCQlicmVhazsKKworCQljYXNlICdtJzoJLyogVGhlIG1vbnRoLiAqLworCQkJX0xFR0FMX0FMVChfQUxUX08pOworCQkJaWYgKCEoX2NvbnZfbnVtKCZicCwgJnRtLT50bV9tb24sIDEsIDEyKSkpCisJCQkJcmV0dXJuIChOVUxMKTsKKwkJCXRtLT50bV9tb24tLTsKKwkJCWJyZWFrOworCisjaWYgMAorCQljYXNlICdwJzoJLyogVGhlIGxvY2FsZSdzIGVxdWl2YWxlbnQgb2YgQU0vUE0uICovCisJCQlfTEVHQUxfQUxUKDApOworCQkJLyogQU0/ICovCisJCQlsZW4gPSBzdHJsZW4oX2N0bG9jKGFtX3BtWzBdKSk7CisJCQlpZiAoc3RybmNhc2VjbXAoX2N0bG9jKGFtX3BtWzBdKSwgYnAsIGxlbikgPT0gMCkgeworCQkJCWlmICh0bS0+dG1faG91ciA+IDEyKQkvKiBpLmUuLCAxMzowMCBBTSA/ISAqLworCQkJCQlyZXR1cm4gKE5VTEwpOworCQkJCWVsc2UgaWYgKHRtLT50bV9ob3VyID09IDEyKQorCQkJCQl0bS0+dG1faG91ciA9IDA7CisKKwkJCQlicCArPSBsZW47CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBQTT8gKi8KKwkJCWxlbiA9IHN0cmxlbihfY3Rsb2MoYW1fcG1bMV0pKTsKKwkJCWlmIChzdHJuY2FzZWNtcChfY3Rsb2MoYW1fcG1bMV0pLCBicCwgbGVuKSA9PSAwKSB7CisJCQkJaWYgKHRtLT50bV9ob3VyID4gMTIpCS8qIGkuZS4sIDEzOjAwIFBNID8hICovCisJCQkJCXJldHVybiAoTlVMTCk7CisJCQkJZWxzZSBpZiAodG0tPnRtX2hvdXIgPCAxMikKKwkJCQkJdG0tPnRtX2hvdXIgKz0gMTI7CisKKwkJCQlicCArPSBsZW47CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIE5vdGhpbmcgbWF0Y2hlZC4gKi8KKwkJCXJldHVybiAoTlVMTCk7CisjZW5kaWYKKwkJY2FzZSAnUyc6CS8qIFRoZSBzZWNvbmRzLiAqLworCQkJX0xFR0FMX0FMVChfQUxUX08pOworCQkJaWYgKCEoX2NvbnZfbnVtKCZicCwgJnRtLT50bV9zZWMsIDAsIDYxKSkpCisJCQkJcmV0dXJuIChOVUxMKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ1UnOgkvKiBUaGUgd2VlayBvZiB5ZWFyLCBiZWdpbm5pbmcgb24gc3VuZGF5LiAqLworCQljYXNlICdXJzoJLyogVGhlIHdlZWsgb2YgeWVhciwgYmVnaW5uaW5nIG9uIG1vbmRheS4gKi8KKwkJCV9MRUdBTF9BTFQoX0FMVF9PKTsKKwkJCS8qCisJCQkgKiBYWFggVGhpcyBpcyBib2d1cywgYXMgd2UgY2FuIG5vdCBhc3N1bWUgYW55IHZhbGlkCisJCQkgKiBpbmZvcm1hdGlvbiBwcmVzZW50IGluIHRoZSB0bSBzdHJ1Y3R1cmUgYXQgdGhpcworCQkJICogcG9pbnQgdG8gY2FsY3VsYXRlIGEgcmVhbCB2YWx1ZSwgc28ganVzdCBjaGVjayB0aGUKKwkJCSAqIHJhbmdlIGZvciBub3cuCisJCQkgKi8KKwkJCSBpZiAoIShfY29udl9udW0oJmJwLCAmaSwgMCwgNTMpKSkKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJIGJyZWFrOworCisJCWNhc2UgJ3cnOgkvKiBUaGUgZGF5IG9mIHdlZWssIGJlZ2lubmluZyBvbiBzdW5kYXkuICovCisJCQlfTEVHQUxfQUxUKF9BTFRfTyk7CisJCQlpZiAoIShfY29udl9udW0oJmJwLCAmdG0tPnRtX3dkYXksIDAsIDYpKSkKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJYnJlYWs7CisKKwkJY2FzZSAnWSc6CS8qIFRoZSB5ZWFyLiAqLworCQkJX0xFR0FMX0FMVChfQUxUX0UpOworCQkJaWYgKCEoX2NvbnZfbnVtKCZicCwgJmksIDAsIDk5OTkpKSkKKwkJCQlyZXR1cm4gKE5VTEwpOworCisJCQlyZWx5ZWFyID0gLTE7CisJCQl0bS0+dG1feWVhciA9IGkgLSBUTV9ZRUFSX0JBU0U7CisJCQlicmVhazsKKworCQljYXNlICd5JzoJLyogVGhlIHllYXIgd2l0aGluIHRoZSBjZW50dXJ5ICgyIGRpZ2l0cykuICovCisJCQlfTEVHQUxfQUxUKF9BTFRfRSB8IF9BTFRfTyk7CisJCQlpZiAoIShfY29udl9udW0oJmJwLCAmcmVseWVhciwgMCwgOTkpKSkKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJYnJlYWs7CisKKwkJLyoKKwkJICogTWlzY2VsbGFuZW91cyBjb252ZXJzaW9ucy4KKwkJICovCisJCWNhc2UgJ24nOgkvKiBBbnkga2luZCBvZiB3aGl0ZS1zcGFjZS4gKi8KKwkJY2FzZSAndCc6CisJCQlfTEVHQUxfQUxUKDApOworCQkJd2hpbGUgKGlzc3BhY2UoKmJwKSkKKwkJCQlicCsrOworCQkJYnJlYWs7CisKKworCQlkZWZhdWx0OgkvKiBVbmtub3duL3Vuc3VwcG9ydGVkIGNvbnZlcnNpb24uICovCisJCQlyZXR1cm4gKE5VTEwpOworCQl9CisKKworCX0KKworCS8qCisJICogV2UgbmVlZCB0byBldmFsdWF0ZSB0aGUgdHdvIGRpZ2l0IHllYXIgc3BlYyAoJXkpCisJICogbGFzdCBhcyB3ZSBjYW4gZ2V0IGEgY2VudHVyeSBzcGVjICglQykgYXQgYW55IHRpbWUuCisJICovCisJaWYgKHJlbHllYXIgIT0gLTEpIHsKKwkJaWYgKGNlbnR1cnkgPT0gVE1fWUVBUl9CQVNFKSB7CisJCQlpZiAocmVseWVhciA8PSA2OCkKKwkJCQl0bS0+dG1feWVhciA9IHJlbHllYXIgKyAyMDAwIC0gVE1fWUVBUl9CQVNFOworCQkJZWxzZQorCQkJCXRtLT50bV95ZWFyID0gcmVseWVhciArIDE5MDAgLSBUTV9ZRUFSX0JBU0U7CisJCX0gZWxzZSB7CisJCQl0bS0+dG1feWVhciA9IHJlbHllYXIgKyBjZW50dXJ5IC0gVE1fWUVBUl9CQVNFOworCQl9CisJfQorCisJcmV0dXJuICgoY2hhciAqKWJwKTsKK30KKworCitzdGF0aWMgaW50CitfY29udl9udW0oY29uc3QgdW5zaWduZWQgY2hhciAqKmJ1ZiwgaW50ICpkZXN0LCBpbnQgbGxpbSwgaW50IHVsaW0pCit7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IHJ1bGltID0gdWxpbTsKKworCWlmICgqKmJ1ZiA8ICcwJyB8fCAqKmJ1ZiA+ICc5JykKKwkJcmV0dXJuICgwKTsKKworCS8qIHdlIHVzZSBydWxpbSB0byBicmVhayBvdXQgb2YgdGhlIGxvb3Agd2hlbiB3ZSBydW4gb3V0IG9mIGRpZ2l0cyAqLworCWRvIHsKKwkJcmVzdWx0ICo9IDEwOworCQlyZXN1bHQgKz0gKigqYnVmKSsrIC0gJzAnOworCQlydWxpbSAvPSAxMDsKKwl9IHdoaWxlICgocmVzdWx0ICogMTAgPD0gdWxpbSkgJiYgcnVsaW0gJiYgKipidWYgPj0gJzAnICYmICoqYnVmIDw9ICc5Jyk7CisKKwlpZiAocmVzdWx0IDwgbGxpbSB8fCByZXN1bHQgPiB1bGltKQorCQlyZXR1cm4gKDApOworCisJKmRlc3QgPSByZXN1bHQ7CisJcmV0dXJuICgxKTsKK30KKworI2VuZGlmIC8qIEhBVkVfU1RSUFRJTUUgKi8KKwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9zdHJzZXAuYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvc3Ryc2VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2ZWI4ZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvc3Ryc2VwLmMKQEAgLTAsMCArMSw3OSBAQAorLyoJJE9wZW5CU0Q6IHN0cnNlcC5jLHYgMS42IDIwMDUvMDgvMDggMDg6MDU6MzcgZXNwaWUgRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKiBPUEVOQlNEIE9SSUdJTkFMOiBsaWIvbGliYy9zdHJpbmcvc3Ryc2VwLmMgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpZiAhZGVmaW5lZChIQVZFX1NUUlNFUCkKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qCisgKiBHZXQgbmV4dCB0b2tlbiBmcm9tIHN0cmluZyAqc3RyaW5ncCwgd2hlcmUgdG9rZW5zIGFyZSBwb3NzaWJseS1lbXB0eQorICogc3RyaW5ncyBzZXBhcmF0ZWQgYnkgY2hhcmFjdGVycyBmcm9tIGRlbGltLiAgCisgKgorICogV3JpdGVzIE5VTHMgaW50byB0aGUgc3RyaW5nIGF0ICpzdHJpbmdwIHRvIGVuZCB0b2tlbnMuCisgKiBkZWxpbSBuZWVkIG5vdCByZW1haW4gY29uc3RhbnQgZnJvbSBjYWxsIHRvIGNhbGwuCisgKiBPbiByZXR1cm4sICpzdHJpbmdwIHBvaW50cyBwYXN0IHRoZSBsYXN0IE5VTCB3cml0dGVuIChpZiB0aGVyZSBtaWdodAorICogYmUgZnVydGhlciB0b2tlbnMpLCBvciBpcyBOVUxMIChpZiB0aGVyZSBhcmUgZGVmaW5pdGVseSBubyBtb3JlIHRva2VucykuCisgKgorICogSWYgKnN0cmluZ3AgaXMgTlVMTCwgc3Ryc2VwIHJldHVybnMgTlVMTC4KKyAqLworY2hhciAqCitzdHJzZXAoY2hhciAqKnN0cmluZ3AsIGNvbnN0IGNoYXIgKmRlbGltKQoreworCWNoYXIgKnM7CisJY29uc3QgY2hhciAqc3BhbnA7CisJaW50IGMsIHNjOworCWNoYXIgKnRvazsKKworCWlmICgocyA9ICpzdHJpbmdwKSA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCWZvciAodG9rID0gczs7KSB7CisJCWMgPSAqcysrOworCQlzcGFucCA9IGRlbGltOworCQlkbyB7CisJCQlpZiAoKHNjID0gKnNwYW5wKyspID09IGMpIHsKKwkJCQlpZiAoYyA9PSAwKQorCQkJCQlzID0gTlVMTDsKKwkJCQllbHNlCisJCQkJCXNbLTFdID0gMDsKKwkJCQkqc3RyaW5ncCA9IHM7CisJCQkJcmV0dXJuICh0b2spOworCQkJfQorCQl9IHdoaWxlIChzYyAhPSAwKTsKKwl9CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisjZW5kaWYgLyogIWRlZmluZWQoSEFWRV9TVFJTRVApICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3N0cnRvbGwuYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvc3RydG9sbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MjkzMDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3N0cnRvbGwuYwpAQCAtMCwwICsxLDE0OCBAQAorLyogJE9wZW5CU0Q6IHN0cnRvbGwuYyx2IDEuNiAyMDA1LzExLzEwIDEwOjAwOjE3IGVzcGllIEV4cCAkICovCisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvc3RkbGliL3N0cnRvbGwuYyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKyNpZm5kZWYgSEFWRV9TVFJUT0xMCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyoKKyAqIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBsb25nIGxvbmcuCisgKgorICogSWdub3JlcyBgbG9jYWxlJyBzdHVmZi4gIEFzc3VtZXMgdGhhdCB0aGUgdXBwZXIgYW5kIGxvd2VyIGNhc2UKKyAqIGFscGhhYmV0cyBhbmQgZGlnaXRzIGFyZSBlYWNoIGNvbnRpZ3VvdXMuCisgKi8KK2xvbmcgbG9uZworc3RydG9sbChjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSkKK3sKKwljb25zdCBjaGFyICpzOworCWxvbmcgbG9uZyBhY2MsIGN1dG9mZjsKKwlpbnQgYzsKKwlpbnQgbmVnLCBhbnksIGN1dGxpbTsKKworCS8qCisJICogU2tpcCB3aGl0ZSBzcGFjZSBhbmQgcGljayB1cCBsZWFkaW5nICsvLSBzaWduIGlmIGFueS4KKwkgKiBJZiBiYXNlIGlzIDAsIGFsbG93IDB4IGZvciBoZXggYW5kIDAgZm9yIG9jdGFsLCBlbHNlCisJICogYXNzdW1lIGRlY2ltYWw7IGlmIGJhc2UgaXMgYWxyZWFkeSAxNiwgYWxsb3cgMHguCisJICovCisJcyA9IG5wdHI7CisJZG8geworCQljID0gKHVuc2lnbmVkIGNoYXIpICpzKys7CisJfSB3aGlsZSAoaXNzcGFjZShjKSk7CisJaWYgKGMgPT0gJy0nKSB7CisJCW5lZyA9IDE7CisJCWMgPSAqcysrOworCX0gZWxzZSB7CisJCW5lZyA9IDA7CisJCWlmIChjID09ICcrJykKKwkJCWMgPSAqcysrOworCX0KKwlpZiAoKGJhc2UgPT0gMCB8fCBiYXNlID09IDE2KSAmJgorCSAgICBjID09ICcwJyAmJiAoKnMgPT0gJ3gnIHx8ICpzID09ICdYJykpIHsKKwkJYyA9IHNbMV07CisJCXMgKz0gMjsKKwkJYmFzZSA9IDE2OworCX0KKwlpZiAoYmFzZSA9PSAwKQorCQliYXNlID0gYyA9PSAnMCcgPyA4IDogMTA7CisKKwkvKgorCSAqIENvbXB1dGUgdGhlIGN1dG9mZiB2YWx1ZSBiZXR3ZWVuIGxlZ2FsIG51bWJlcnMgYW5kIGlsbGVnYWwKKwkgKiBudW1iZXJzLiAgVGhhdCBpcyB0aGUgbGFyZ2VzdCBsZWdhbCB2YWx1ZSwgZGl2aWRlZCBieSB0aGUKKwkgKiBiYXNlLiAgQW4gaW5wdXQgbnVtYmVyIHRoYXQgaXMgZ3JlYXRlciB0aGFuIHRoaXMgdmFsdWUsIGlmCisJICogZm9sbG93ZWQgYnkgYSBsZWdhbCBpbnB1dCBjaGFyYWN0ZXIsIGlzIHRvbyBiaWcuICBPbmUgdGhhdAorCSAqIGlzIGVxdWFsIHRvIHRoaXMgdmFsdWUgbWF5IGJlIHZhbGlkIG9yIG5vdDsgdGhlIGxpbWl0CisJICogYmV0d2VlbiB2YWxpZCBhbmQgaW52YWxpZCBudW1iZXJzIGlzIHRoZW4gYmFzZWQgb24gdGhlIGxhc3QKKwkgKiBkaWdpdC4gIEZvciBpbnN0YW5jZSwgaWYgdGhlIHJhbmdlIGZvciBsb25nIGxvbmdzIGlzCisJICogWy05MjIzMzcyMDM2ODU0Nzc1ODA4Li45MjIzMzcyMDM2ODU0Nzc1ODA3XSBhbmQgdGhlIGlucHV0IGJhc2UKKwkgKiBpcyAxMCwgY3V0b2ZmIHdpbGwgYmUgc2V0IHRvIDkyMjMzNzIwMzY4NTQ3NzU4MCBhbmQgY3V0bGltIHRvCisJICogZWl0aGVyIDcgKG5lZz09MCkgb3IgOCAobmVnPT0xKSwgbWVhbmluZyB0aGF0IGlmIHdlIGhhdmUKKwkgKiBhY2N1bXVsYXRlZCBhIHZhbHVlID4gOTIyMzM3MjAzNjg1NDc3NTgwLCBvciBlcXVhbCBidXQgdGhlCisJICogbmV4dCBkaWdpdCBpcyA+IDcgKG9yIDgpLCB0aGUgbnVtYmVyIGlzIHRvbyBiaWcsIGFuZCB3ZSB3aWxsCisJICogcmV0dXJuIGEgcmFuZ2UgZXJyb3IuCisJICoKKwkgKiBTZXQgYW55IGlmIGFueSBgZGlnaXRzJyBjb25zdW1lZDsgbWFrZSBpdCBuZWdhdGl2ZSB0byBpbmRpY2F0ZQorCSAqIG92ZXJmbG93LgorCSAqLworCWN1dG9mZiA9IG5lZyA/IExMT05HX01JTiA6IExMT05HX01BWDsKKwljdXRsaW0gPSBjdXRvZmYgJSBiYXNlOworCWN1dG9mZiAvPSBiYXNlOworCWlmIChuZWcpIHsKKwkJaWYgKGN1dGxpbSA+IDApIHsKKwkJCWN1dGxpbSAtPSBiYXNlOworCQkJY3V0b2ZmICs9IDE7CisJCX0KKwkJY3V0bGltID0gLWN1dGxpbTsKKwl9CisJZm9yIChhY2MgPSAwLCBhbnkgPSAwOzsgYyA9ICh1bnNpZ25lZCBjaGFyKSAqcysrKSB7CisJCWlmIChpc2RpZ2l0KGMpKQorCQkJYyAtPSAnMCc7CisJCWVsc2UgaWYgKGlzYWxwaGEoYykpCisJCQljIC09IGlzdXBwZXIoYykgPyAnQScgLSAxMCA6ICdhJyAtIDEwOworCQllbHNlCisJCQlicmVhazsKKwkJaWYgKGMgPj0gYmFzZSkKKwkJCWJyZWFrOworCQlpZiAoYW55IDwgMCkKKwkJCWNvbnRpbnVlOworCQlpZiAobmVnKSB7CisJCQlpZiAoYWNjIDwgY3V0b2ZmIHx8IChhY2MgPT0gY3V0b2ZmICYmIGMgPiBjdXRsaW0pKSB7CisJCQkJYW55ID0gLTE7CisJCQkJYWNjID0gTExPTkdfTUlOOworCQkJCWVycm5vID0gRVJBTkdFOworCQkJfSBlbHNlIHsKKwkJCQlhbnkgPSAxOworCQkJCWFjYyAqPSBiYXNlOworCQkJCWFjYyAtPSBjOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGFjYyA+IGN1dG9mZiB8fCAoYWNjID09IGN1dG9mZiAmJiBjID4gY3V0bGltKSkgeworCQkJCWFueSA9IC0xOworCQkJCWFjYyA9IExMT05HX01BWDsKKwkJCQllcnJubyA9IEVSQU5HRTsKKwkJCX0gZWxzZSB7CisJCQkJYW55ID0gMTsKKwkJCQlhY2MgKj0gYmFzZTsKKwkJCQlhY2MgKz0gYzsKKwkJCX0KKwkJfQorCX0KKwlpZiAoZW5kcHRyICE9IDApCisJCSplbmRwdHIgPSAoY2hhciAqKSAoYW55ID8gcyAtIDEgOiBucHRyKTsKKwlyZXR1cm4gKGFjYyk7Cit9CisjZW5kaWYgLyogSEFWRV9TVFJUT0xMICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3N0cnRvbnVtLmMgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3N0cnRvbnVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmMmYyNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvc3RydG9udW0uYwpAQCAtMCwwICsxLDcyIEBACisvKgkkT3BlbkJTRDogc3RydG9udW0uYyx2IDEuNiAyMDA0LzA4LzAzIDE5OjM4OjAxIG1pbGxlcnQgRXhwICQJKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBUZWQgVW5hbmdzdCBhbmQgVG9kZCBNaWxsZXIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvc3RkbGliL3N0cnRvbnVtLmMgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpZm5kZWYgSEFWRV9TVFJUT05VTQorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNkZWZpbmUgSU5WQUxJRCAJMQorI2RlZmluZSBUT09TTUFMTCAJMgorI2RlZmluZSBUT09MQVJHRSAJMworCitsb25nIGxvbmcKK3N0cnRvbnVtKGNvbnN0IGNoYXIgKm51bXN0ciwgbG9uZyBsb25nIG1pbnZhbCwgbG9uZyBsb25nIG1heHZhbCwKKyAgICBjb25zdCBjaGFyICoqZXJyc3RycCkKK3sKKwlsb25nIGxvbmcgbGwgPSAwOworCWNoYXIgKmVwOworCWludCBlcnJvciA9IDA7CisJc3RydWN0IGVycnZhbCB7CisJCWNvbnN0IGNoYXIgKmVycnN0cjsKKwkJaW50IGVycjsKKwl9IGV2WzRdID0geworCQl7IE5VTEwsCQkwIH0sCisJCXsgImludmFsaWQiLAlFSU5WQUwgfSwKKwkJeyAidG9vIHNtYWxsIiwJRVJBTkdFIH0sCisJCXsgInRvbyBsYXJnZSIsCUVSQU5HRSB9LAorCX07CisKKwlldlswXS5lcnIgPSBlcnJubzsKKwllcnJubyA9IDA7CisJaWYgKG1pbnZhbCA+IG1heHZhbCkKKwkJZXJyb3IgPSBJTlZBTElEOworCWVsc2UgeworCQlsbCA9IHN0cnRvbGwobnVtc3RyLCAmZXAsIDEwKTsKKwkJaWYgKG51bXN0ciA9PSBlcCB8fCAqZXAgIT0gJ1wwJykKKwkJCWVycm9yID0gSU5WQUxJRDsKKwkJZWxzZSBpZiAoKGxsID09IExMT05HX01JTiAmJiBlcnJubyA9PSBFUkFOR0UpIHx8IGxsIDwgbWludmFsKQorCQkJZXJyb3IgPSBUT09TTUFMTDsKKwkJZWxzZSBpZiAoKGxsID09IExMT05HX01BWCAmJiBlcnJubyA9PSBFUkFOR0UpIHx8IGxsID4gbWF4dmFsKQorCQkJZXJyb3IgPSBUT09MQVJHRTsKKwl9CisJaWYgKGVycnN0cnAgIT0gTlVMTCkKKwkJKmVycnN0cnAgPSBldltlcnJvcl0uZXJyc3RyOworCWVycm5vID0gZXZbZXJyb3JdLmVycjsKKwlpZiAoZXJyb3IpCisJCWxsID0gMDsKKworCXJldHVybiAobGwpOworfQorCisjZW5kaWYgLyogSEFWRV9TVFJUT05VTSAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9zdHJ0b3VsLmMgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3N0cnRvdWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjE5YzgzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9zdHJ0b3VsLmMKQEAgLTAsMCArMSwxMDggQEAKKy8qCSRPcGVuQlNEOiBzdHJ0b3VsLmMsdiAxLjcgMjAwNS8wOC8wOCAwODowNTozNyBlc3BpZSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKiBPUEVOQlNEIE9SSUdJTkFMOiBsaWIvbGliYy9zdGRsaWIvc3RydG91bC5jICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorI2lmbmRlZiBIQVZFX1NUUlRPVUwKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyoKKyAqIENvbnZlcnQgYSBzdHJpbmcgdG8gYW4gdW5zaWduZWQgbG9uZyBpbnRlZ2VyLgorICoKKyAqIElnbm9yZXMgYGxvY2FsZScgc3R1ZmYuICBBc3N1bWVzIHRoYXQgdGhlIHVwcGVyIGFuZCBsb3dlciBjYXNlCisgKiBhbHBoYWJldHMgYW5kIGRpZ2l0cyBhcmUgZWFjaCBjb250aWd1b3VzLgorICovCit1bnNpZ25lZCBsb25nCitzdHJ0b3VsKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKQoreworCWNvbnN0IGNoYXIgKnM7CisJdW5zaWduZWQgbG9uZyBhY2MsIGN1dG9mZjsKKwlpbnQgYzsKKwlpbnQgbmVnLCBhbnksIGN1dGxpbTsKKworCS8qCisJICogU2VlIHN0cnRvbCBmb3IgY29tbWVudHMgYXMgdG8gdGhlIGxvZ2ljIHVzZWQuCisJICovCisJcyA9IG5wdHI7CisJZG8geworCQljID0gKHVuc2lnbmVkIGNoYXIpICpzKys7CisJfSB3aGlsZSAoaXNzcGFjZShjKSk7CisJaWYgKGMgPT0gJy0nKSB7CisJCW5lZyA9IDE7CisJCWMgPSAqcysrOworCX0gZWxzZSB7CisJCW5lZyA9IDA7CisJCWlmIChjID09ICcrJykKKwkJCWMgPSAqcysrOworCX0KKwlpZiAoKGJhc2UgPT0gMCB8fCBiYXNlID09IDE2KSAmJgorCSAgICBjID09ICcwJyAmJiAoKnMgPT0gJ3gnIHx8ICpzID09ICdYJykpIHsKKwkJYyA9IHNbMV07CisJCXMgKz0gMjsKKwkJYmFzZSA9IDE2OworCX0KKwlpZiAoYmFzZSA9PSAwKQorCQliYXNlID0gYyA9PSAnMCcgPyA4IDogMTA7CisKKwljdXRvZmYgPSBVTE9OR19NQVggLyAodW5zaWduZWQgbG9uZyliYXNlOworCWN1dGxpbSA9IFVMT05HX01BWCAlICh1bnNpZ25lZCBsb25nKWJhc2U7CisJZm9yIChhY2MgPSAwLCBhbnkgPSAwOzsgYyA9ICh1bnNpZ25lZCBjaGFyKSAqcysrKSB7CisJCWlmIChpc2RpZ2l0KGMpKQorCQkJYyAtPSAnMCc7CisJCWVsc2UgaWYgKGlzYWxwaGEoYykpCisJCQljIC09IGlzdXBwZXIoYykgPyAnQScgLSAxMCA6ICdhJyAtIDEwOworCQllbHNlCisJCQlicmVhazsKKwkJaWYgKGMgPj0gYmFzZSkKKwkJCWJyZWFrOworCQlpZiAoYW55IDwgMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoYWNjID4gY3V0b2ZmIHx8IGFjYyA9PSBjdXRvZmYgJiYgYyA+IGN1dGxpbSkgeworCQkJYW55ID0gLTE7CisJCQlhY2MgPSBVTE9OR19NQVg7CisJCQllcnJubyA9IEVSQU5HRTsKKwkJfSBlbHNlIHsKKwkJCWFueSA9IDE7CisJCQlhY2MgKj0gKHVuc2lnbmVkIGxvbmcpYmFzZTsKKwkJCWFjYyArPSBjOworCQl9CisJfQorCWlmIChuZWcgJiYgYW55ID4gMCkKKwkJYWNjID0gLWFjYzsKKwlpZiAoZW5kcHRyICE9IDApCisJCSplbmRwdHIgPSAoY2hhciAqKSAoYW55ID8gcyAtIDEgOiBucHRyKTsKKwlyZXR1cm4gKGFjYyk7Cit9CisjZW5kaWYgLyogIUhBVkVfU1RSVE9VTCAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9zeXMtcXVldWUuaCBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvc3lzLXF1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNmMDU4NwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvc3lzLXF1ZXVlLmgKQEAgLTAsMCArMSw2MTIgQEAKKy8qCSRPcGVuQlNEOiBxdWV1ZS5oLHYgMS4zMiAyMDA3LzA0LzMwIDE4OjQyOjM0IHBlZHJvIEV4cCAkCSovCisvKgkkTmV0QlNEOiBxdWV1ZS5oLHYgMS4xMSAxOTk2LzA1LzE2IDA1OjE3OjE0IG15Y3JvZnQgRXhwICQJKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylxdWV1ZS5oCTguNSAoQmVya2VsZXkpIDgvMjAvOTQKKyAqLworCisvKiBPUEVOQlNEIE9SSUdJTkFMOiBzeXMvc3lzL3F1ZXVlLmggKi8KKworI2lmbmRlZglfRkFLRV9RVUVVRV9IXworI2RlZmluZQlfRkFLRV9RVUVVRV9IXworCisvKgorICogUmVxdWlyZSBmb3IgT1MvWCBhbmQgb3RoZXIgcGxhdGZvcm1zIHRoYXQgaGF2ZSBvbGQvYnJva2VuL2luY29tcGxldGUKKyAqIDxzeXMvcXVldWUuaD4uCisgKi8KKyN1bmRlZiBTTElTVF9IRUFECisjdW5kZWYgU0xJU1RfSEVBRF9JTklUSUFMSVpFUgorI3VuZGVmIFNMSVNUX0VOVFJZCisjdW5kZWYgU0xJU1RfRk9SRUFDSF9QUkVWUFRSCisjdW5kZWYgU0xJU1RfRklSU1QKKyN1bmRlZiBTTElTVF9FTkQKKyN1bmRlZiBTTElTVF9FTVBUWQorI3VuZGVmIFNMSVNUX05FWFQKKyN1bmRlZiBTTElTVF9GT1JFQUNICisjdW5kZWYgU0xJU1RfSU5JVAorI3VuZGVmIFNMSVNUX0lOU0VSVF9BRlRFUgorI3VuZGVmIFNMSVNUX0lOU0VSVF9IRUFECisjdW5kZWYgU0xJU1RfUkVNT1ZFX0hFQUQKKyN1bmRlZiBTTElTVF9SRU1PVkUKKyN1bmRlZiBTTElTVF9SRU1PVkVfTkVYVAorI3VuZGVmIExJU1RfSEVBRAorI3VuZGVmIExJU1RfSEVBRF9JTklUSUFMSVpFUgorI3VuZGVmIExJU1RfRU5UUlkKKyN1bmRlZiBMSVNUX0ZJUlNUCisjdW5kZWYgTElTVF9FTkQKKyN1bmRlZiBMSVNUX0VNUFRZCisjdW5kZWYgTElTVF9ORVhUCisjdW5kZWYgTElTVF9GT1JFQUNICisjdW5kZWYgTElTVF9JTklUCisjdW5kZWYgTElTVF9JTlNFUlRfQUZURVIKKyN1bmRlZiBMSVNUX0lOU0VSVF9CRUZPUkUKKyN1bmRlZiBMSVNUX0lOU0VSVF9IRUFECisjdW5kZWYgTElTVF9SRU1PVkUKKyN1bmRlZiBMSVNUX1JFUExBQ0UKKyN1bmRlZiBTSU1QTEVRX0hFQUQKKyN1bmRlZiBTSU1QTEVRX0hFQURfSU5JVElBTElaRVIKKyN1bmRlZiBTSU1QTEVRX0VOVFJZCisjdW5kZWYgU0lNUExFUV9GSVJTVAorI3VuZGVmIFNJTVBMRVFfRU5ECisjdW5kZWYgU0lNUExFUV9FTVBUWQorI3VuZGVmIFNJTVBMRVFfTkVYVAorI3VuZGVmIFNJTVBMRVFfRk9SRUFDSAorI3VuZGVmIFNJTVBMRVFfSU5JVAorI3VuZGVmIFNJTVBMRVFfSU5TRVJUX0hFQUQKKyN1bmRlZiBTSU1QTEVRX0lOU0VSVF9UQUlMCisjdW5kZWYgU0lNUExFUV9JTlNFUlRfQUZURVIKKyN1bmRlZiBTSU1QTEVRX1JFTU9WRV9IRUFECisjdW5kZWYgVEFJTFFfSEVBRAorI3VuZGVmIFRBSUxRX0hFQURfSU5JVElBTElaRVIKKyN1bmRlZiBUQUlMUV9FTlRSWQorI3VuZGVmIFRBSUxRX0ZJUlNUCisjdW5kZWYgVEFJTFFfRU5ECisjdW5kZWYgVEFJTFFfTkVYVAorI3VuZGVmIFRBSUxRX0xBU1QKKyN1bmRlZiBUQUlMUV9QUkVWCisjdW5kZWYgVEFJTFFfRU1QVFkKKyN1bmRlZiBUQUlMUV9GT1JFQUNICisjdW5kZWYgVEFJTFFfRk9SRUFDSF9SRVZFUlNFCisjdW5kZWYgVEFJTFFfSU5JVAorI3VuZGVmIFRBSUxRX0lOU0VSVF9IRUFECisjdW5kZWYgVEFJTFFfSU5TRVJUX1RBSUwKKyN1bmRlZiBUQUlMUV9JTlNFUlRfQUZURVIKKyN1bmRlZiBUQUlMUV9JTlNFUlRfQkVGT1JFCisjdW5kZWYgVEFJTFFfUkVNT1ZFCisjdW5kZWYgVEFJTFFfUkVQTEFDRQorI3VuZGVmIENJUkNMRVFfSEVBRAorI3VuZGVmIENJUkNMRVFfSEVBRF9JTklUSUFMSVpFUgorI3VuZGVmIENJUkNMRVFfRU5UUlkKKyN1bmRlZiBDSVJDTEVRX0ZJUlNUCisjdW5kZWYgQ0lSQ0xFUV9MQVNUCisjdW5kZWYgQ0lSQ0xFUV9FTkQKKyN1bmRlZiBDSVJDTEVRX05FWFQKKyN1bmRlZiBDSVJDTEVRX1BSRVYKKyN1bmRlZiBDSVJDTEVRX0VNUFRZCisjdW5kZWYgQ0lSQ0xFUV9GT1JFQUNICisjdW5kZWYgQ0lSQ0xFUV9GT1JFQUNIX1JFVkVSU0UKKyN1bmRlZiBDSVJDTEVRX0lOSVQKKyN1bmRlZiBDSVJDTEVRX0lOU0VSVF9BRlRFUgorI3VuZGVmIENJUkNMRVFfSU5TRVJUX0JFRk9SRQorI3VuZGVmIENJUkNMRVFfSU5TRVJUX0hFQUQKKyN1bmRlZiBDSVJDTEVRX0lOU0VSVF9UQUlMCisjdW5kZWYgQ0lSQ0xFUV9SRU1PVkUKKyN1bmRlZiBDSVJDTEVRX1JFUExBQ0UKKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGZpdmUgdHlwZXMgb2YgZGF0YSBzdHJ1Y3R1cmVzOiBzaW5nbHktbGlua2VkIGxpc3RzLCAKKyAqIGxpc3RzLCBzaW1wbGUgcXVldWVzLCB0YWlsIHF1ZXVlcywgYW5kIGNpcmN1bGFyIHF1ZXVlcy4KKyAqCisgKgorICogQSBzaW5nbHktbGlua2VkIGxpc3QgaXMgaGVhZGVkIGJ5IGEgc2luZ2xlIGZvcndhcmQgcG9pbnRlci4gVGhlIGVsZW1lbnRzCisgKiBhcmUgc2luZ2x5IGxpbmtlZCBmb3IgbWluaW11bSBzcGFjZSBhbmQgcG9pbnRlciBtYW5pcHVsYXRpb24gb3ZlcmhlYWQgYXQKKyAqIHRoZSBleHBlbnNlIG9mIE8obikgcmVtb3ZhbCBmb3IgYXJiaXRyYXJ5IGVsZW1lbnRzLiBOZXcgZWxlbWVudHMgY2FuIGJlCisgKiBhZGRlZCB0byB0aGUgbGlzdCBhZnRlciBhbiBleGlzdGluZyBlbGVtZW50IG9yIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LgorICogRWxlbWVudHMgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBoZWFkIG9mIHRoZSBsaXN0IHNob3VsZCB1c2UgdGhlIGV4cGxpY2l0CisgKiBtYWNybyBmb3IgdGhpcyBwdXJwb3NlIGZvciBvcHRpbXVtIGVmZmljaWVuY3kuIEEgc2luZ2x5LWxpbmtlZCBsaXN0IG1heQorICogb25seSBiZSB0cmF2ZXJzZWQgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uLiAgU2luZ2x5LWxpbmtlZCBsaXN0cyBhcmUgaWRlYWwKKyAqIGZvciBhcHBsaWNhdGlvbnMgd2l0aCBsYXJnZSBkYXRhc2V0cyBhbmQgZmV3IG9yIG5vIHJlbW92YWxzIG9yIGZvcgorICogaW1wbGVtZW50aW5nIGEgTElGTyBxdWV1ZS4KKyAqCisgKiBBIGxpc3QgaXMgaGVhZGVkIGJ5IGEgc2luZ2xlIGZvcndhcmQgcG9pbnRlciAob3IgYW4gYXJyYXkgb2YgZm9yd2FyZAorICogcG9pbnRlcnMgZm9yIGEgaGFzaCB0YWJsZSBoZWFkZXIpLiBUaGUgZWxlbWVudHMgYXJlIGRvdWJseSBsaW5rZWQKKyAqIHNvIHRoYXQgYW4gYXJiaXRyYXJ5IGVsZW1lbnQgY2FuIGJlIHJlbW92ZWQgd2l0aG91dCBhIG5lZWQgdG8KKyAqIHRyYXZlcnNlIHRoZSBsaXN0LiBOZXcgZWxlbWVudHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IGJlZm9yZQorICogb3IgYWZ0ZXIgYW4gZXhpc3RpbmcgZWxlbWVudCBvciBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gQSBsaXN0CisgKiBtYXkgb25seSBiZSB0cmF2ZXJzZWQgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uLgorICoKKyAqIEEgc2ltcGxlIHF1ZXVlIGlzIGhlYWRlZCBieSBhIHBhaXIgb2YgcG9pbnRlcnMsIG9uZSB0aGUgaGVhZCBvZiB0aGUKKyAqIGxpc3QgYW5kIHRoZSBvdGhlciB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdC4gVGhlIGVsZW1lbnRzIGFyZSBzaW5nbHkKKyAqIGxpbmtlZCB0byBzYXZlIHNwYWNlLCBzbyBlbGVtZW50cyBjYW4gb25seSBiZSByZW1vdmVkIGZyb20gdGhlCisgKiBoZWFkIG9mIHRoZSBsaXN0LiBOZXcgZWxlbWVudHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IGJlZm9yZSBvciBhZnRlcgorICogYW4gZXhpc3RpbmcgZWxlbWVudCwgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIG9yIGF0IHRoZSBlbmQgb2YgdGhlCisgKiBsaXN0LiBBIHNpbXBsZSBxdWV1ZSBtYXkgb25seSBiZSB0cmF2ZXJzZWQgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uLgorICoKKyAqIEEgdGFpbCBxdWV1ZSBpcyBoZWFkZWQgYnkgYSBwYWlyIG9mIHBvaW50ZXJzLCBvbmUgdG8gdGhlIGhlYWQgb2YgdGhlCisgKiBsaXN0IGFuZCB0aGUgb3RoZXIgdG8gdGhlIHRhaWwgb2YgdGhlIGxpc3QuIFRoZSBlbGVtZW50cyBhcmUgZG91Ymx5CisgKiBsaW5rZWQgc28gdGhhdCBhbiBhcmJpdHJhcnkgZWxlbWVudCBjYW4gYmUgcmVtb3ZlZCB3aXRob3V0IGEgbmVlZCB0bworICogdHJhdmVyc2UgdGhlIGxpc3QuIE5ldyBlbGVtZW50cyBjYW4gYmUgYWRkZWQgdG8gdGhlIGxpc3QgYmVmb3JlIG9yCisgKiBhZnRlciBhbiBleGlzdGluZyBlbGVtZW50LCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgb3IgYXQgdGhlIGVuZCBvZgorICogdGhlIGxpc3QuIEEgdGFpbCBxdWV1ZSBtYXkgYmUgdHJhdmVyc2VkIGluIGVpdGhlciBkaXJlY3Rpb24uCisgKgorICogQSBjaXJjbGUgcXVldWUgaXMgaGVhZGVkIGJ5IGEgcGFpciBvZiBwb2ludGVycywgb25lIHRvIHRoZSBoZWFkIG9mIHRoZQorICogbGlzdCBhbmQgdGhlIG90aGVyIHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0LiBUaGUgZWxlbWVudHMgYXJlIGRvdWJseQorICogbGlua2VkIHNvIHRoYXQgYW4gYXJiaXRyYXJ5IGVsZW1lbnQgY2FuIGJlIHJlbW92ZWQgd2l0aG91dCBhIG5lZWQgdG8KKyAqIHRyYXZlcnNlIHRoZSBsaXN0LiBOZXcgZWxlbWVudHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IGJlZm9yZSBvciBhZnRlcgorICogYW4gZXhpc3RpbmcgZWxlbWVudCwgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIG9yIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCisgKiBBIGNpcmNsZSBxdWV1ZSBtYXkgYmUgdHJhdmVyc2VkIGluIGVpdGhlciBkaXJlY3Rpb24sIGJ1dCBoYXMgYSBtb3JlCisgKiBjb21wbGV4IGVuZCBvZiBsaXN0IGRldGVjdGlvbi4KKyAqCisgKiBGb3IgZGV0YWlscyBvbiB0aGUgdXNlIG9mIHRoZXNlIG1hY3Jvcywgc2VlIHRoZSBxdWV1ZSgzKSBtYW51YWwgcGFnZS4KKyAqLworCisjaWYgZGVmaW5lZChRVUVVRV9NQUNST19ERUJVRykgfHwgKGRlZmluZWQoX0tFUk5FTCkgJiYgZGVmaW5lZChESUFHTk9TVElDKSkKKyNkZWZpbmUgX1FfSU5WQUxJREFURShhKSAoYSkgPSAoKHZvaWQgKiktMSkKKyNlbHNlCisjZGVmaW5lIF9RX0lOVkFMSURBVEUoYSkKKyNlbmRpZgorCisvKgorICogU2luZ2x5LWxpbmtlZCBMaXN0IGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIFNMSVNUX0hFQUQobmFtZSwgdHlwZSkJCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKnNsaF9maXJzdDsJLyogZmlyc3QgZWxlbWVudCAqLwkJCVwKK30KKyAKKyNkZWZpbmUJU0xJU1RfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgTlVMTCB9CisgCisjZGVmaW5lIFNMSVNUX0VOVFJZKHR5cGUpCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqc2xlX25leHQ7CS8qIG5leHQgZWxlbWVudCAqLwkJCVwKK30KKyAKKy8qCisgKiBTaW5nbHktbGlua2VkIExpc3QgYWNjZXNzIG1ldGhvZHMuCisgKi8KKyNkZWZpbmUJU0xJU1RfRklSU1QoaGVhZCkJKChoZWFkKS0+c2xoX2ZpcnN0KQorI2RlZmluZQlTTElTVF9FTkQoaGVhZCkJCU5VTEwKKyNkZWZpbmUJU0xJU1RfRU1QVFkoaGVhZCkJKFNMSVNUX0ZJUlNUKGhlYWQpID09IFNMSVNUX0VORChoZWFkKSkKKyNkZWZpbmUJU0xJU1RfTkVYVChlbG0sIGZpZWxkKQkoKGVsbSktPmZpZWxkLnNsZV9uZXh0KQorCisjZGVmaW5lCVNMSVNUX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJCVwKKwlmb3IoKHZhcikgPSBTTElTVF9GSVJTVChoZWFkKTsJCQkJCVwKKwkgICAgKHZhcikgIT0gU0xJU1RfRU5EKGhlYWQpOwkJCQkJXAorCSAgICAodmFyKSA9IFNMSVNUX05FWFQodmFyLCBmaWVsZCkpCisKKyNkZWZpbmUJU0xJU1RfRk9SRUFDSF9QUkVWUFRSKHZhciwgdmFycCwgaGVhZCwgZmllbGQpCQkJXAorCWZvciAoKHZhcnApID0gJlNMSVNUX0ZJUlNUKChoZWFkKSk7CQkJCVwKKwkgICAgKCh2YXIpID0gKih2YXJwKSkgIT0gU0xJU1RfRU5EKGhlYWQpOwkJCVwKKwkgICAgKHZhcnApID0gJlNMSVNUX05FWFQoKHZhciksIGZpZWxkKSkKKworLyoKKyAqIFNpbmdseS1saW5rZWQgTGlzdCBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUJU0xJU1RfSU5JVChoZWFkKSB7CQkJCQkJXAorCVNMSVNUX0ZJUlNUKGhlYWQpID0gU0xJU1RfRU5EKGhlYWQpOwkJCQlcCit9CisKKyNkZWZpbmUJU0xJU1RfSU5TRVJUX0FGVEVSKHNsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC5zbGVfbmV4dCA9IChzbGlzdGVsbSktPmZpZWxkLnNsZV9uZXh0OwkJXAorCShzbGlzdGVsbSktPmZpZWxkLnNsZV9uZXh0ID0gKGVsbSk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJU0xJU1RfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwkoZWxtKS0+ZmllbGQuc2xlX25leHQgPSAoaGVhZCktPnNsaF9maXJzdDsJCQlcCisJKGhlYWQpLT5zbGhfZmlyc3QgPSAoZWxtKTsJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJU0xJU1RfUkVNT1ZFX05FWFQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwkoZWxtKS0+ZmllbGQuc2xlX25leHQgPSAoZWxtKS0+ZmllbGQuc2xlX25leHQtPmZpZWxkLnNsZV9uZXh0OwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVNMSVNUX1JFTU9WRV9IRUFEKGhlYWQsIGZpZWxkKSBkbyB7CQkJCVwKKwkoaGVhZCktPnNsaF9maXJzdCA9IChoZWFkKS0+c2xoX2ZpcnN0LT5maWVsZC5zbGVfbmV4dDsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU0xJU1RfUkVNT1ZFKGhlYWQsIGVsbSwgdHlwZSwgZmllbGQpIGRvIHsJCQlcCisJaWYgKChoZWFkKS0+c2xoX2ZpcnN0ID09IChlbG0pKSB7CQkJCVwKKwkJU0xJU1RfUkVNT1ZFX0hFQUQoKGhlYWQpLCBmaWVsZCk7CQkJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkJc3RydWN0IHR5cGUgKmN1cmVsbSA9IChoZWFkKS0+c2xoX2ZpcnN0OwkJXAorCQkJCQkJCQkJXAorCQl3aGlsZSAoY3VyZWxtLT5maWVsZC5zbGVfbmV4dCAhPSAoZWxtKSkJCQlcCisJCQljdXJlbG0gPSBjdXJlbG0tPmZpZWxkLnNsZV9uZXh0OwkJXAorCQljdXJlbG0tPmZpZWxkLnNsZV9uZXh0ID0JCQkJXAorCQkgICAgY3VyZWxtLT5maWVsZC5zbGVfbmV4dC0+ZmllbGQuc2xlX25leHQ7CQlcCisJCV9RX0lOVkFMSURBVEUoKGVsbSktPmZpZWxkLnNsZV9uZXh0KTsJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIExpc3QgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUgTElTVF9IRUFEKG5hbWUsIHR5cGUpCQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpsaF9maXJzdDsJLyogZmlyc3QgZWxlbWVudCAqLwkJCVwKK30KKworI2RlZmluZSBMSVNUX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCQkJCVwKKwl7IE5VTEwgfQorCisjZGVmaW5lIExJU1RfRU5UUlkodHlwZSkJCQkJCQlcCitzdHJ1Y3QgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpsZV9uZXh0OwkvKiBuZXh0IGVsZW1lbnQgKi8JCQlcCisJc3RydWN0IHR5cGUgKipsZV9wcmV2OwkvKiBhZGRyZXNzIG9mIHByZXZpb3VzIG5leHQgZWxlbWVudCAqLwlcCit9CisKKy8qCisgKiBMaXN0IGFjY2VzcyBtZXRob2RzCisgKi8KKyNkZWZpbmUJTElTVF9GSVJTVChoZWFkKQkJKChoZWFkKS0+bGhfZmlyc3QpCisjZGVmaW5lCUxJU1RfRU5EKGhlYWQpCQkJTlVMTAorI2RlZmluZQlMSVNUX0VNUFRZKGhlYWQpCQkoTElTVF9GSVJTVChoZWFkKSA9PSBMSVNUX0VORChoZWFkKSkKKyNkZWZpbmUJTElTVF9ORVhUKGVsbSwgZmllbGQpCQkoKGVsbSktPmZpZWxkLmxlX25leHQpCisKKyNkZWZpbmUgTElTVF9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpCQkJCQlcCisJZm9yKCh2YXIpID0gTElTVF9GSVJTVChoZWFkKTsJCQkJCVwKKwkgICAgKHZhcikhPSBMSVNUX0VORChoZWFkKTsJCQkJCVwKKwkgICAgKHZhcikgPSBMSVNUX05FWFQodmFyLCBmaWVsZCkpCisKKy8qCisgKiBMaXN0IGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlMSVNUX0lOSVQoaGVhZCkgZG8gewkJCQkJCVwKKwlMSVNUX0ZJUlNUKGhlYWQpID0gTElTVF9FTkQoaGVhZCk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTElTVF9JTlNFUlRfQUZURVIobGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoKChlbG0pLT5maWVsZC5sZV9uZXh0ID0gKGxpc3RlbG0pLT5maWVsZC5sZV9uZXh0KSAhPSBOVUxMKQlcCisJCShsaXN0ZWxtKS0+ZmllbGQubGVfbmV4dC0+ZmllbGQubGVfcHJldiA9CQlcCisJCSAgICAmKGVsbSktPmZpZWxkLmxlX25leHQ7CQkJCVwKKwkobGlzdGVsbSktPmZpZWxkLmxlX25leHQgPSAoZWxtKTsJCQkJXAorCShlbG0pLT5maWVsZC5sZV9wcmV2ID0gJihsaXN0ZWxtKS0+ZmllbGQubGVfbmV4dDsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJTElTVF9JTlNFUlRfQkVGT1JFKGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLmxlX3ByZXYgPSAobGlzdGVsbSktPmZpZWxkLmxlX3ByZXY7CQlcCisJKGVsbSktPmZpZWxkLmxlX25leHQgPSAobGlzdGVsbSk7CQkJCVwKKwkqKGxpc3RlbG0pLT5maWVsZC5sZV9wcmV2ID0gKGVsbSk7CQkJCVwKKwkobGlzdGVsbSktPmZpZWxkLmxlX3ByZXYgPSAmKGVsbSktPmZpZWxkLmxlX25leHQ7CQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIExJU1RfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKCgoZWxtKS0+ZmllbGQubGVfbmV4dCA9IChoZWFkKS0+bGhfZmlyc3QpICE9IE5VTEwpCQlcCisJCShoZWFkKS0+bGhfZmlyc3QtPmZpZWxkLmxlX3ByZXYgPSAmKGVsbSktPmZpZWxkLmxlX25leHQ7XAorCShoZWFkKS0+bGhfZmlyc3QgPSAoZWxtKTsJCQkJCVwKKwkoZWxtKS0+ZmllbGQubGVfcHJldiA9ICYoaGVhZCktPmxoX2ZpcnN0OwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTElTVF9SRU1PVkUoZWxtLCBmaWVsZCkgZG8gewkJCQkJXAorCWlmICgoZWxtKS0+ZmllbGQubGVfbmV4dCAhPSBOVUxMKQkJCQlcCisJCShlbG0pLT5maWVsZC5sZV9uZXh0LT5maWVsZC5sZV9wcmV2ID0JCQlcCisJCSAgICAoZWxtKS0+ZmllbGQubGVfcHJldjsJCQkJXAorCSooZWxtKS0+ZmllbGQubGVfcHJldiA9IChlbG0pLT5maWVsZC5sZV9uZXh0OwkJCVwKKwlfUV9JTlZBTElEQVRFKChlbG0pLT5maWVsZC5sZV9wcmV2KTsJCQkJXAorCV9RX0lOVkFMSURBVEUoKGVsbSktPmZpZWxkLmxlX25leHQpOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIExJU1RfUkVQTEFDRShlbG0sIGVsbTIsIGZpZWxkKSBkbyB7CQkJCVwKKwlpZiAoKChlbG0yKS0+ZmllbGQubGVfbmV4dCA9IChlbG0pLT5maWVsZC5sZV9uZXh0KSAhPSBOVUxMKQlcCisJCShlbG0yKS0+ZmllbGQubGVfbmV4dC0+ZmllbGQubGVfcHJldiA9CQkJXAorCQkgICAgJihlbG0yKS0+ZmllbGQubGVfbmV4dDsJCQkJXAorCShlbG0yKS0+ZmllbGQubGVfcHJldiA9IChlbG0pLT5maWVsZC5sZV9wcmV2OwkJCVwKKwkqKGVsbTIpLT5maWVsZC5sZV9wcmV2ID0gKGVsbTIpOwkJCQlcCisJX1FfSU5WQUxJREFURSgoZWxtKS0+ZmllbGQubGVfcHJldik7CQkJCVwKKwlfUV9JTlZBTElEQVRFKChlbG0pLT5maWVsZC5sZV9uZXh0KTsJCQkJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIFNpbXBsZSBxdWV1ZSBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBTSU1QTEVRX0hFQUQobmFtZSwgdHlwZSkJCQkJCVwKK3N0cnVjdCBuYW1lIHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqc3FoX2ZpcnN0OwkvKiBmaXJzdCBlbGVtZW50ICovCQkJXAorCXN0cnVjdCB0eXBlICoqc3FoX2xhc3Q7CS8qIGFkZHIgb2YgbGFzdCBuZXh0IGVsZW1lbnQgKi8JCVwKK30KKworI2RlZmluZSBTSU1QTEVRX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCQkJCVwKKwl7IE5VTEwsICYoaGVhZCkuc3FoX2ZpcnN0IH0KKworI2RlZmluZSBTSU1QTEVRX0VOVFJZKHR5cGUpCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqc3FlX25leHQ7CS8qIG5leHQgZWxlbWVudCAqLwkJCVwKK30KKworLyoKKyAqIFNpbXBsZSBxdWV1ZSBhY2Nlc3MgbWV0aG9kcy4KKyAqLworI2RlZmluZQlTSU1QTEVRX0ZJUlNUKGhlYWQpCSAgICAoKGhlYWQpLT5zcWhfZmlyc3QpCisjZGVmaW5lCVNJTVBMRVFfRU5EKGhlYWQpCSAgICBOVUxMCisjZGVmaW5lCVNJTVBMRVFfRU1QVFkoaGVhZCkJICAgIChTSU1QTEVRX0ZJUlNUKGhlYWQpID09IFNJTVBMRVFfRU5EKGhlYWQpKQorI2RlZmluZQlTSU1QTEVRX05FWFQoZWxtLCBmaWVsZCkgICAgKChlbG0pLT5maWVsZC5zcWVfbmV4dCkKKworI2RlZmluZSBTSU1QTEVRX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJXAorCWZvcigodmFyKSA9IFNJTVBMRVFfRklSU1QoaGVhZCk7CQkJCVwKKwkgICAgKHZhcikgIT0gU0lNUExFUV9FTkQoaGVhZCk7CQkJCQlcCisJICAgICh2YXIpID0gU0lNUExFUV9ORVhUKHZhciwgZmllbGQpKQorCisvKgorICogU2ltcGxlIHF1ZXVlIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlTSU1QTEVRX0lOSVQoaGVhZCkgZG8gewkJCQkJCVwKKwkoaGVhZCktPnNxaF9maXJzdCA9IE5VTEw7CQkJCQlcCisJKGhlYWQpLT5zcWhfbGFzdCA9ICYoaGVhZCktPnNxaF9maXJzdDsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTSU1QTEVRX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJaWYgKCgoZWxtKS0+ZmllbGQuc3FlX25leHQgPSAoaGVhZCktPnNxaF9maXJzdCkgPT0gTlVMTCkJXAorCQkoaGVhZCktPnNxaF9sYXN0ID0gJihlbG0pLT5maWVsZC5zcWVfbmV4dDsJCVwKKwkoaGVhZCktPnNxaF9maXJzdCA9IChlbG0pOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTSU1QTEVRX0lOU0VSVF9UQUlMKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLnNxZV9uZXh0ID0gTlVMTDsJCQkJCVwKKwkqKGhlYWQpLT5zcWhfbGFzdCA9IChlbG0pOwkJCQkJXAorCShoZWFkKS0+c3FoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnNxZV9uZXh0OwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU0lNUExFUV9JTlNFUlRfQUZURVIoaGVhZCwgbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJXAorCWlmICgoKGVsbSktPmZpZWxkLnNxZV9uZXh0ID0gKGxpc3RlbG0pLT5maWVsZC5zcWVfbmV4dCkgPT0gTlVMTClcCisJCShoZWFkKS0+c3FoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnNxZV9uZXh0OwkJXAorCShsaXN0ZWxtKS0+ZmllbGQuc3FlX25leHQgPSAoZWxtKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTSU1QTEVRX1JFTU9WRV9IRUFEKGhlYWQsIGZpZWxkKSBkbyB7CQkJXAorCWlmICgoKGhlYWQpLT5zcWhfZmlyc3QgPSAoaGVhZCktPnNxaF9maXJzdC0+ZmllbGQuc3FlX25leHQpID09IE5VTEwpIFwKKwkJKGhlYWQpLT5zcWhfbGFzdCA9ICYoaGVhZCktPnNxaF9maXJzdDsJCQlcCit9IHdoaWxlICgwKQorCisvKgorICogVGFpbCBxdWV1ZSBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBUQUlMUV9IRUFEKG5hbWUsIHR5cGUpCQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICp0cWhfZmlyc3Q7CS8qIGZpcnN0IGVsZW1lbnQgKi8JCQlcCisJc3RydWN0IHR5cGUgKip0cWhfbGFzdDsJLyogYWRkciBvZiBsYXN0IG5leHQgZWxlbWVudCAqLwkJXAorfQorCisjZGVmaW5lIFRBSUxRX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCQkJCVwKKwl7IE5VTEwsICYoaGVhZCkudHFoX2ZpcnN0IH0KKworI2RlZmluZSBUQUlMUV9FTlRSWSh0eXBlKQkJCQkJCVwKK3N0cnVjdCB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKnRxZV9uZXh0OwkvKiBuZXh0IGVsZW1lbnQgKi8JCQlcCisJc3RydWN0IHR5cGUgKip0cWVfcHJldjsJLyogYWRkcmVzcyBvZiBwcmV2aW91cyBuZXh0IGVsZW1lbnQgKi8JXAorfQorCisvKiAKKyAqIHRhaWwgcXVldWUgYWNjZXNzIG1ldGhvZHMgCisgKi8KKyNkZWZpbmUJVEFJTFFfRklSU1QoaGVhZCkJCSgoaGVhZCktPnRxaF9maXJzdCkKKyNkZWZpbmUJVEFJTFFfRU5EKGhlYWQpCQkJTlVMTAorI2RlZmluZQlUQUlMUV9ORVhUKGVsbSwgZmllbGQpCQkoKGVsbSktPmZpZWxkLnRxZV9uZXh0KQorI2RlZmluZSBUQUlMUV9MQVNUKGhlYWQsIGhlYWRuYW1lKQkJCQkJXAorCSgqKCgoc3RydWN0IGhlYWRuYW1lICopKChoZWFkKS0+dHFoX2xhc3QpKS0+dHFoX2xhc3QpKQorLyogWFhYICovCisjZGVmaW5lIFRBSUxRX1BSRVYoZWxtLCBoZWFkbmFtZSwgZmllbGQpCQkJCVwKKwkoKigoKHN0cnVjdCBoZWFkbmFtZSAqKSgoZWxtKS0+ZmllbGQudHFlX3ByZXYpKS0+dHFoX2xhc3QpKQorI2RlZmluZQlUQUlMUV9FTVBUWShoZWFkKQkJCQkJCVwKKwkoVEFJTFFfRklSU1QoaGVhZCkgPT0gVEFJTFFfRU5EKGhlYWQpKQorCisjZGVmaW5lIFRBSUxRX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJCVwKKwlmb3IoKHZhcikgPSBUQUlMUV9GSVJTVChoZWFkKTsJCQkJCVwKKwkgICAgKHZhcikgIT0gVEFJTFFfRU5EKGhlYWQpOwkJCQkJXAorCSAgICAodmFyKSA9IFRBSUxRX05FWFQodmFyLCBmaWVsZCkpCisKKyNkZWZpbmUgVEFJTFFfRk9SRUFDSF9SRVZFUlNFKHZhciwgaGVhZCwgaGVhZG5hbWUsIGZpZWxkKQkJXAorCWZvcigodmFyKSA9IFRBSUxRX0xBU1QoaGVhZCwgaGVhZG5hbWUpOwkJCQlcCisJICAgICh2YXIpICE9IFRBSUxRX0VORChoZWFkKTsJCQkJCVwKKwkgICAgKHZhcikgPSBUQUlMUV9QUkVWKHZhciwgaGVhZG5hbWUsIGZpZWxkKSkKKworLyoKKyAqIFRhaWwgcXVldWUgZnVuY3Rpb25zLgorICovCisjZGVmaW5lCVRBSUxRX0lOSVQoaGVhZCkgZG8gewkJCQkJCVwKKwkoaGVhZCktPnRxaF9maXJzdCA9IE5VTEw7CQkJCQlcCisJKGhlYWQpLT50cWhfbGFzdCA9ICYoaGVhZCktPnRxaF9maXJzdDsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUQUlMUV9JTlNFUlRfSEVBRChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCWlmICgoKGVsbSktPmZpZWxkLnRxZV9uZXh0ID0gKGhlYWQpLT50cWhfZmlyc3QpICE9IE5VTEwpCVwKKwkJKGhlYWQpLT50cWhfZmlyc3QtPmZpZWxkLnRxZV9wcmV2ID0JCQlcCisJCSAgICAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPnRxaF9sYXN0ID0gJihlbG0pLT5maWVsZC50cWVfbmV4dDsJCVwKKwkoaGVhZCktPnRxaF9maXJzdCA9IChlbG0pOwkJCQkJXAorCShlbG0pLT5maWVsZC50cWVfcHJldiA9ICYoaGVhZCktPnRxaF9maXJzdDsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFRBSUxRX0lOU0VSVF9UQUlMKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLnRxZV9uZXh0ID0gTlVMTDsJCQkJCVwKKwkoZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAoaGVhZCktPnRxaF9sYXN0OwkJCVwKKwkqKGhlYWQpLT50cWhfbGFzdCA9IChlbG0pOwkJCQkJXAorCShoZWFkKS0+dHFoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVEFJTFFfSU5TRVJUX0FGVEVSKGhlYWQsIGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCVwKKwlpZiAoKChlbG0pLT5maWVsZC50cWVfbmV4dCA9IChsaXN0ZWxtKS0+ZmllbGQudHFlX25leHQpICE9IE5VTEwpXAorCQkoZWxtKS0+ZmllbGQudHFlX25leHQtPmZpZWxkLnRxZV9wcmV2ID0JCQlcCisJCSAgICAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPnRxaF9sYXN0ID0gJihlbG0pLT5maWVsZC50cWVfbmV4dDsJCVwKKwkobGlzdGVsbSktPmZpZWxkLnRxZV9uZXh0ID0gKGVsbSk7CQkJCVwKKwkoZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAmKGxpc3RlbG0pLT5maWVsZC50cWVfbmV4dDsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJVEFJTFFfSU5TRVJUX0JFRk9SRShsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC50cWVfcHJldiA9IChsaXN0ZWxtKS0+ZmllbGQudHFlX3ByZXY7CQlcCisJKGVsbSktPmZpZWxkLnRxZV9uZXh0ID0gKGxpc3RlbG0pOwkJCQlcCisJKihsaXN0ZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAoZWxtKTsJCQkJXAorCShsaXN0ZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUQUlMUV9SRU1PVkUoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKCgoZWxtKS0+ZmllbGQudHFlX25leHQpICE9IE5VTEwpCQkJCVwKKwkJKGVsbSktPmZpZWxkLnRxZV9uZXh0LT5maWVsZC50cWVfcHJldiA9CQkJXAorCQkgICAgKGVsbSktPmZpZWxkLnRxZV9wcmV2OwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPnRxaF9sYXN0ID0gKGVsbSktPmZpZWxkLnRxZV9wcmV2OwkJXAorCSooZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAoZWxtKS0+ZmllbGQudHFlX25leHQ7CQkJXAorCV9RX0lOVkFMSURBVEUoKGVsbSktPmZpZWxkLnRxZV9wcmV2KTsJCQkJXAorCV9RX0lOVkFMSURBVEUoKGVsbSktPmZpZWxkLnRxZV9uZXh0KTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUQUlMUV9SRVBMQUNFKGhlYWQsIGVsbSwgZWxtMiwgZmllbGQpIGRvIHsJCQlcCisJaWYgKCgoZWxtMiktPmZpZWxkLnRxZV9uZXh0ID0gKGVsbSktPmZpZWxkLnRxZV9uZXh0KSAhPSBOVUxMKQlcCisJCShlbG0yKS0+ZmllbGQudHFlX25leHQtPmZpZWxkLnRxZV9wcmV2ID0JCVwKKwkJICAgICYoZWxtMiktPmZpZWxkLnRxZV9uZXh0OwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPnRxaF9sYXN0ID0gJihlbG0yKS0+ZmllbGQudHFlX25leHQ7CQlcCisJKGVsbTIpLT5maWVsZC50cWVfcHJldiA9IChlbG0pLT5maWVsZC50cWVfcHJldjsJCQlcCisJKihlbG0yKS0+ZmllbGQudHFlX3ByZXYgPSAoZWxtMik7CQkJCVwKKwlfUV9JTlZBTElEQVRFKChlbG0pLT5maWVsZC50cWVfcHJldik7CQkJCVwKKwlfUV9JTlZBTElEQVRFKChlbG0pLT5maWVsZC50cWVfbmV4dCk7CQkJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBDaXJjdWxhciBxdWV1ZSBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBDSVJDTEVRX0hFQUQobmFtZSwgdHlwZSkJCQkJCVwKK3N0cnVjdCBuYW1lIHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqY3FoX2ZpcnN0OwkJLyogZmlyc3QgZWxlbWVudCAqLwkJXAorCXN0cnVjdCB0eXBlICpjcWhfbGFzdDsJCS8qIGxhc3QgZWxlbWVudCAqLwkJXAorfQorCisjZGVmaW5lIENJUkNMRVFfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgQ0lSQ0xFUV9FTkQoJmhlYWQpLCBDSVJDTEVRX0VORCgmaGVhZCkgfQorCisjZGVmaW5lIENJUkNMRVFfRU5UUlkodHlwZSkJCQkJCQlcCitzdHJ1Y3QgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpjcWVfbmV4dDsJCS8qIG5leHQgZWxlbWVudCAqLwkJXAorCXN0cnVjdCB0eXBlICpjcWVfcHJldjsJCS8qIHByZXZpb3VzIGVsZW1lbnQgKi8JCVwKK30KKworLyoKKyAqIENpcmN1bGFyIHF1ZXVlIGFjY2VzcyBtZXRob2RzIAorICovCisjZGVmaW5lCUNJUkNMRVFfRklSU1QoaGVhZCkJCSgoaGVhZCktPmNxaF9maXJzdCkKKyNkZWZpbmUJQ0lSQ0xFUV9MQVNUKGhlYWQpCQkoKGhlYWQpLT5jcWhfbGFzdCkKKyNkZWZpbmUJQ0lSQ0xFUV9FTkQoaGVhZCkJCSgodm9pZCAqKShoZWFkKSkKKyNkZWZpbmUJQ0lSQ0xFUV9ORVhUKGVsbSwgZmllbGQpCSgoZWxtKS0+ZmllbGQuY3FlX25leHQpCisjZGVmaW5lCUNJUkNMRVFfUFJFVihlbG0sIGZpZWxkKQkoKGVsbSktPmZpZWxkLmNxZV9wcmV2KQorI2RlZmluZQlDSVJDTEVRX0VNUFRZKGhlYWQpCQkJCQkJXAorCShDSVJDTEVRX0ZJUlNUKGhlYWQpID09IENJUkNMRVFfRU5EKGhlYWQpKQorCisjZGVmaW5lIENJUkNMRVFfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQlcCisJZm9yKCh2YXIpID0gQ0lSQ0xFUV9GSVJTVChoZWFkKTsJCQkJXAorCSAgICAodmFyKSAhPSBDSVJDTEVRX0VORChoZWFkKTsJCQkJCVwKKwkgICAgKHZhcikgPSBDSVJDTEVRX05FWFQodmFyLCBmaWVsZCkpCisKKyNkZWZpbmUgQ0lSQ0xFUV9GT1JFQUNIX1JFVkVSU0UodmFyLCBoZWFkLCBmaWVsZCkJCQlcCisJZm9yKCh2YXIpID0gQ0lSQ0xFUV9MQVNUKGhlYWQpOwkJCQkJXAorCSAgICAodmFyKSAhPSBDSVJDTEVRX0VORChoZWFkKTsJCQkJCVwKKwkgICAgKHZhcikgPSBDSVJDTEVRX1BSRVYodmFyLCBmaWVsZCkpCisKKy8qCisgKiBDaXJjdWxhciBxdWV1ZSBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUJQ0lSQ0xFUV9JTklUKGhlYWQpIGRvIHsJCQkJCQlcCisJKGhlYWQpLT5jcWhfZmlyc3QgPSBDSVJDTEVRX0VORChoZWFkKTsJCQkJXAorCShoZWFkKS0+Y3FoX2xhc3QgPSBDSVJDTEVRX0VORChoZWFkKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDSVJDTEVRX0lOU0VSVF9BRlRFUihoZWFkLCBsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQlcCisJKGVsbSktPmZpZWxkLmNxZV9uZXh0ID0gKGxpc3RlbG0pLT5maWVsZC5jcWVfbmV4dDsJCVwKKwkoZWxtKS0+ZmllbGQuY3FlX3ByZXYgPSAobGlzdGVsbSk7CQkJCVwKKwlpZiAoKGxpc3RlbG0pLT5maWVsZC5jcWVfbmV4dCA9PSBDSVJDTEVRX0VORChoZWFkKSkJCVwKKwkJKGhlYWQpLT5jcWhfbGFzdCA9IChlbG0pOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkobGlzdGVsbSktPmZpZWxkLmNxZV9uZXh0LT5maWVsZC5jcWVfcHJldiA9IChlbG0pOwlcCisJKGxpc3RlbG0pLT5maWVsZC5jcWVfbmV4dCA9IChlbG0pOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENJUkNMRVFfSU5TRVJUX0JFRk9SRShoZWFkLCBsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQlcCisJKGVsbSktPmZpZWxkLmNxZV9uZXh0ID0gKGxpc3RlbG0pOwkJCQlcCisJKGVsbSktPmZpZWxkLmNxZV9wcmV2ID0gKGxpc3RlbG0pLT5maWVsZC5jcWVfcHJldjsJCVwKKwlpZiAoKGxpc3RlbG0pLT5maWVsZC5jcWVfcHJldiA9PSBDSVJDTEVRX0VORChoZWFkKSkJCVwKKwkJKGhlYWQpLT5jcWhfZmlyc3QgPSAoZWxtKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGxpc3RlbG0pLT5maWVsZC5jcWVfcHJldi0+ZmllbGQuY3FlX25leHQgPSAoZWxtKTsJXAorCShsaXN0ZWxtKS0+ZmllbGQuY3FlX3ByZXYgPSAoZWxtKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDSVJDTEVRX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLmNxZV9uZXh0ID0gKGhlYWQpLT5jcWhfZmlyc3Q7CQkJXAorCShlbG0pLT5maWVsZC5jcWVfcHJldiA9IENJUkNMRVFfRU5EKGhlYWQpOwkJCVwKKwlpZiAoKGhlYWQpLT5jcWhfbGFzdCA9PSBDSVJDTEVRX0VORChoZWFkKSkJCQlcCisJCShoZWFkKS0+Y3FoX2xhc3QgPSAoZWxtKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGhlYWQpLT5jcWhfZmlyc3QtPmZpZWxkLmNxZV9wcmV2ID0gKGVsbSk7CQlcCisJKGhlYWQpLT5jcWhfZmlyc3QgPSAoZWxtKTsJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0lSQ0xFUV9JTlNFUlRfVEFJTChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC5jcWVfbmV4dCA9IENJUkNMRVFfRU5EKGhlYWQpOwkJCVwKKwkoZWxtKS0+ZmllbGQuY3FlX3ByZXYgPSAoaGVhZCktPmNxaF9sYXN0OwkJCVwKKwlpZiAoKGhlYWQpLT5jcWhfZmlyc3QgPT0gQ0lSQ0xFUV9FTkQoaGVhZCkpCQkJXAorCQkoaGVhZCktPmNxaF9maXJzdCA9IChlbG0pOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPmNxaF9sYXN0LT5maWVsZC5jcWVfbmV4dCA9IChlbG0pOwkJXAorCShoZWFkKS0+Y3FoX2xhc3QgPSAoZWxtKTsJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJQ0lSQ0xFUV9SRU1PVkUoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKChlbG0pLT5maWVsZC5jcWVfbmV4dCA9PSBDSVJDTEVRX0VORChoZWFkKSkJCQlcCisJCShoZWFkKS0+Y3FoX2xhc3QgPSAoZWxtKS0+ZmllbGQuY3FlX3ByZXY7CQlcCisJZWxzZQkJCQkJCQkJXAorCQkoZWxtKS0+ZmllbGQuY3FlX25leHQtPmZpZWxkLmNxZV9wcmV2ID0JCQlcCisJCSAgICAoZWxtKS0+ZmllbGQuY3FlX3ByZXY7CQkJCVwKKwlpZiAoKGVsbSktPmZpZWxkLmNxZV9wcmV2ID09IENJUkNMRVFfRU5EKGhlYWQpKQkJCVwKKwkJKGhlYWQpLT5jcWhfZmlyc3QgPSAoZWxtKS0+ZmllbGQuY3FlX25leHQ7CQlcCisJZWxzZQkJCQkJCQkJXAorCQkoZWxtKS0+ZmllbGQuY3FlX3ByZXYtPmZpZWxkLmNxZV9uZXh0ID0JCQlcCisJCSAgICAoZWxtKS0+ZmllbGQuY3FlX25leHQ7CQkJCVwKKwlfUV9JTlZBTElEQVRFKChlbG0pLT5maWVsZC5jcWVfcHJldik7CQkJCVwKKwlfUV9JTlZBTElEQVRFKChlbG0pLT5maWVsZC5jcWVfbmV4dCk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0lSQ0xFUV9SRVBMQUNFKGhlYWQsIGVsbSwgZWxtMiwgZmllbGQpIGRvIHsJCQlcCisJaWYgKCgoZWxtMiktPmZpZWxkLmNxZV9uZXh0ID0gKGVsbSktPmZpZWxkLmNxZV9uZXh0KSA9PQkJXAorCSAgICBDSVJDTEVRX0VORChoZWFkKSkJCQkJCQlcCisJCShoZWFkKS5jcWhfbGFzdCA9IChlbG0yKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGVsbTIpLT5maWVsZC5jcWVfbmV4dC0+ZmllbGQuY3FlX3ByZXYgPSAoZWxtMik7CVwKKwlpZiAoKChlbG0yKS0+ZmllbGQuY3FlX3ByZXYgPSAoZWxtKS0+ZmllbGQuY3FlX3ByZXYpID09CQlcCisJICAgIENJUkNMRVFfRU5EKGhlYWQpKQkJCQkJCVwKKwkJKGhlYWQpLmNxaF9maXJzdCA9IChlbG0yKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGVsbTIpLT5maWVsZC5jcWVfcHJldi0+ZmllbGQuY3FlX25leHQgPSAoZWxtMik7CVwKKwlfUV9JTlZBTElEQVRFKChlbG0pLT5maWVsZC5jcWVfcHJldik7CQkJCVwKKwlfUV9JTlZBTElEQVRFKChlbG0pLT5maWVsZC5jcWVfbmV4dCk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNlbmRpZgkvKiAhX0ZBS0VfUVVFVUVfSF8gKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvc3lzLXRyZWUuaCBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvc3lzLXRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDk0OWI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC9zeXMtdHJlZS5oCkBAIC0wLDAgKzEsNjc5IEBACisvKgkkT3BlbkJTRDogdHJlZS5oLHYgMS4xMCAyMDA3LzEwLzI5IDIzOjQ5OjQxIGRqbSBFeHAgJAkqLworLyoKKyAqIENvcHlyaWdodCAyMDAyIE5pZWxzIFByb3ZvcyA8cHJvdm9zQGNpdGkudW1pY2guZWR1PgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyogT1BFTkJTRCBPUklHSU5BTDogc3lzL3N5cy90cmVlLmggKi8KKworI2lmbmRlZglfU1lTX1RSRUVfSF8KKyNkZWZpbmUJX1NZU19UUkVFX0hfCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBkYXRhIHN0cnVjdHVyZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiB0cmVlczoKKyAqIHNwbGF5IHRyZWVzIGFuZCByZWQtYmxhY2sgdHJlZXMuCisgKgorICogQSBzcGxheSB0cmVlIGlzIGEgc2VsZi1vcmdhbml6aW5nIGRhdGEgc3RydWN0dXJlLiAgRXZlcnkgb3BlcmF0aW9uCisgKiBvbiB0aGUgdHJlZSBjYXVzZXMgYSBzcGxheSB0byBoYXBwZW4uICBUaGUgc3BsYXkgbW92ZXMgdGhlIHJlcXVlc3RlZAorICogbm9kZSB0byB0aGUgcm9vdCBvZiB0aGUgdHJlZSBhbmQgcGFydGx5IHJlYmFsYW5jZXMgaXQuCisgKgorICogVGhpcyBoYXMgdGhlIGJlbmVmaXQgdGhhdCByZXF1ZXN0IGxvY2FsaXR5IGNhdXNlcyBmYXN0ZXIgbG9va3VwcyBhcworICogdGhlIHJlcXVlc3RlZCBub2RlcyBtb3ZlIHRvIHRoZSB0b3Agb2YgdGhlIHRyZWUuICBPbiB0aGUgb3RoZXIgaGFuZCwKKyAqIGV2ZXJ5IGxvb2t1cCBjYXVzZXMgbWVtb3J5IHdyaXRlcy4KKyAqCisgKiBUaGUgQmFsYW5jZSBUaGVvcmVtIGJvdW5kcyB0aGUgdG90YWwgYWNjZXNzIHRpbWUgZm9yIG0gb3BlcmF0aW9ucworICogYW5kIG4gaW5zZXJ0cyBvbiBhbiBpbml0aWFsbHkgZW1wdHkgdHJlZSBhcyBPKChtICsgbilsZyBuKS4gIFRoZQorICogYW1vcnRpemVkIGNvc3QgZm9yIGEgc2VxdWVuY2Ugb2YgbSBhY2Nlc3NlcyB0byBhIHNwbGF5IHRyZWUgaXMgTyhsZyBuKTsKKyAqCisgKiBBIHJlZC1ibGFjayB0cmVlIGlzIGEgYmluYXJ5IHNlYXJjaCB0cmVlIHdpdGggdGhlIG5vZGUgY29sb3IgYXMgYW4KKyAqIGV4dHJhIGF0dHJpYnV0ZS4gIEl0IGZ1bGZpbGxzIGEgc2V0IG9mIGNvbmRpdGlvbnM6CisgKgktIGV2ZXJ5IHNlYXJjaCBwYXRoIGZyb20gdGhlIHJvb3QgdG8gYSBsZWFmIGNvbnNpc3RzIG9mIHRoZQorICoJICBzYW1lIG51bWJlciBvZiBibGFjayBub2RlcywKKyAqCS0gZWFjaCByZWQgbm9kZSAoZXhjZXB0IGZvciB0aGUgcm9vdCkgaGFzIGEgYmxhY2sgcGFyZW50LAorICoJLSBlYWNoIGxlYWYgbm9kZSBpcyBibGFjay4KKyAqCisgKiBFdmVyeSBvcGVyYXRpb24gb24gYSByZWQtYmxhY2sgdHJlZSBpcyBib3VuZGVkIGFzIE8obGcgbikuCisgKiBUaGUgbWF4aW11bSBoZWlnaHQgb2YgYSByZWQtYmxhY2sgdHJlZSBpcyAybGcgKG4rMSkuCisgKi8KKworI2RlZmluZSBTUExBWV9IRUFEKG5hbWUsIHR5cGUpCQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpzcGhfcm9vdDsgLyogcm9vdCBvZiB0aGUgdHJlZSAqLwkJCVwKK30KKworI2RlZmluZSBTUExBWV9JTklUSUFMSVpFUihyb290KQkJCQkJCVwKKwl7IE5VTEwgfQorCisjZGVmaW5lIFNQTEFZX0lOSVQocm9vdCkgZG8gewkJCQkJCVwKKwkocm9vdCktPnNwaF9yb290ID0gTlVMTDsJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1BMQVlfRU5UUlkodHlwZSkJCQkJCQlcCitzdHJ1Y3QgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpzcGVfbGVmdDsgLyogbGVmdCBlbGVtZW50ICovCQkJXAorCXN0cnVjdCB0eXBlICpzcGVfcmlnaHQ7IC8qIHJpZ2h0IGVsZW1lbnQgKi8JCQlcCit9CisKKyNkZWZpbmUgU1BMQVlfTEVGVChlbG0sIGZpZWxkKQkJKGVsbSktPmZpZWxkLnNwZV9sZWZ0CisjZGVmaW5lIFNQTEFZX1JJR0hUKGVsbSwgZmllbGQpCQkoZWxtKS0+ZmllbGQuc3BlX3JpZ2h0CisjZGVmaW5lIFNQTEFZX1JPT1QoaGVhZCkJCShoZWFkKS0+c3BoX3Jvb3QKKyNkZWZpbmUgU1BMQVlfRU1QVFkoaGVhZCkJCShTUExBWV9ST09UKGhlYWQpID09IE5VTEwpCisKKy8qIFNQTEFZX1JPVEFURV97TEVGVCxSSUdIVH0gZXhwZWN0IHRoYXQgdG1wIGhvbGQgU1BMQVlfe1JJR0hULExFRlR9ICovCisjZGVmaW5lIFNQTEFZX1JPVEFURV9SSUdIVChoZWFkLCB0bXAsIGZpZWxkKSBkbyB7CQkJXAorCVNQTEFZX0xFRlQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpID0gU1BMQVlfUklHSFQodG1wLCBmaWVsZCk7CVwKKwlTUExBWV9SSUdIVCh0bXAsIGZpZWxkKSA9IChoZWFkKS0+c3BoX3Jvb3Q7CQkJXAorCShoZWFkKS0+c3BoX3Jvb3QgPSB0bXA7CQkJCQkJXAorfSB3aGlsZSAoMCkKKwkKKyNkZWZpbmUgU1BMQVlfUk9UQVRFX0xFRlQoaGVhZCwgdG1wLCBmaWVsZCkgZG8gewkJCVwKKwlTUExBWV9SSUdIVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCkgPSBTUExBWV9MRUZUKHRtcCwgZmllbGQpOwlcCisJU1BMQVlfTEVGVCh0bXAsIGZpZWxkKSA9IChoZWFkKS0+c3BoX3Jvb3Q7CQkJXAorCShoZWFkKS0+c3BoX3Jvb3QgPSB0bXA7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTUExBWV9MSU5LTEVGVChoZWFkLCB0bXAsIGZpZWxkKSBkbyB7CQkJCVwKKwlTUExBWV9MRUZUKHRtcCwgZmllbGQpID0gKGhlYWQpLT5zcGhfcm9vdDsJCQlcCisJdG1wID0gKGhlYWQpLT5zcGhfcm9vdDsJCQkJCQlcCisJKGhlYWQpLT5zcGhfcm9vdCA9IFNQTEFZX0xFRlQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTUExBWV9MSU5LUklHSFQoaGVhZCwgdG1wLCBmaWVsZCkgZG8gewkJCQlcCisJU1BMQVlfUklHSFQodG1wLCBmaWVsZCkgPSAoaGVhZCktPnNwaF9yb290OwkJCVwKKwl0bXAgPSAoaGVhZCktPnNwaF9yb290OwkJCQkJCVwKKwkoaGVhZCktPnNwaF9yb290ID0gU1BMQVlfUklHSFQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpOwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNQTEFZX0FTU0VNQkxFKGhlYWQsIG5vZGUsIGxlZnQsIHJpZ2h0LCBmaWVsZCkgZG8gewkJXAorCVNQTEFZX1JJR0hUKGxlZnQsIGZpZWxkKSA9IFNQTEFZX0xFRlQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpOwlcCisJU1BMQVlfTEVGVChyaWdodCwgZmllbGQpID0gU1BMQVlfUklHSFQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpO1wKKwlTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9IFNQTEFZX1JJR0hUKG5vZGUsIGZpZWxkKTsJXAorCVNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9IFNQTEFZX0xFRlQobm9kZSwgZmllbGQpOwlcCit9IHdoaWxlICgwKQorCisvKiBHZW5lcmF0ZXMgcHJvdG90eXBlcyBhbmQgaW5saW5lIGZ1bmN0aW9ucyAqLworCisjZGVmaW5lIFNQTEFZX1BST1RPVFlQRShuYW1lLCB0eXBlLCBmaWVsZCwgY21wKQkJCQlcCit2b2lkIG5hbWUjI19TUExBWShzdHJ1Y3QgbmFtZSAqLCBzdHJ1Y3QgdHlwZSAqKTsJCQlcCit2b2lkIG5hbWUjI19TUExBWV9NSU5NQVgoc3RydWN0IG5hbWUgKiwgaW50KTsJCQkJXAorc3RydWN0IHR5cGUgKm5hbWUjI19TUExBWV9JTlNFUlQoc3RydWN0IG5hbWUgKiwgc3RydWN0IHR5cGUgKik7CQlcCitzdHJ1Y3QgdHlwZSAqbmFtZSMjX1NQTEFZX1JFTU9WRShzdHJ1Y3QgbmFtZSAqLCBzdHJ1Y3QgdHlwZSAqKTsJCVwKKwkJCQkJCQkJCVwKKy8qIEZpbmRzIHRoZSBub2RlIHdpdGggdGhlIHNhbWUga2V5IGFzIGVsbSAqLwkJCQlcCitzdGF0aWMgX19pbmxpbmUgc3RydWN0IHR5cGUgKgkJCQkJCVwKK25hbWUjI19TUExBWV9GSU5EKHN0cnVjdCBuYW1lICpoZWFkLCBzdHJ1Y3QgdHlwZSAqZWxtKQkJCVwKK3sJCQkJCQkJCQlcCisJaWYgKFNQTEFZX0VNUFRZKGhlYWQpKQkJCQkJCVwKKwkJcmV0dXJuKE5VTEwpOwkJCQkJCVwKKwluYW1lIyNfU1BMQVkoaGVhZCwgZWxtKTsJCQkJCVwKKwlpZiAoKGNtcCkoZWxtLCAoaGVhZCktPnNwaF9yb290KSA9PSAwKQkJCQlcCisJCXJldHVybiAoaGVhZC0+c3BoX3Jvb3QpOwkJCQlcCisJcmV0dXJuIChOVUxMKTsJCQkJCQkJXAorfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBfX2lubGluZSBzdHJ1Y3QgdHlwZSAqCQkJCQkJXAorbmFtZSMjX1NQTEFZX05FWFQoc3RydWN0IG5hbWUgKmhlYWQsIHN0cnVjdCB0eXBlICplbG0pCQkJXAorewkJCQkJCQkJCVwKKwluYW1lIyNfU1BMQVkoaGVhZCwgZWxtKTsJCQkJCVwKKwlpZiAoU1BMQVlfUklHSFQoZWxtLCBmaWVsZCkgIT0gTlVMTCkgewkJCQlcCisJCWVsbSA9IFNQTEFZX1JJR0hUKGVsbSwgZmllbGQpOwkJCQlcCisJCXdoaWxlIChTUExBWV9MRUZUKGVsbSwgZmllbGQpICE9IE5VTEwpIHsJCVwKKwkJCWVsbSA9IFNQTEFZX0xFRlQoZWxtLCBmaWVsZCk7CQkJXAorCQl9CQkJCQkJCVwKKwl9IGVsc2UJCQkJCQkJCVwKKwkJZWxtID0gTlVMTDsJCQkJCQlcCisJcmV0dXJuIChlbG0pOwkJCQkJCQlcCit9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIF9faW5saW5lIHN0cnVjdCB0eXBlICoJCQkJCQlcCituYW1lIyNfU1BMQVlfTUlOX01BWChzdHJ1Y3QgbmFtZSAqaGVhZCwgaW50IHZhbCkJCQlcCit7CQkJCQkJCQkJXAorCW5hbWUjI19TUExBWV9NSU5NQVgoaGVhZCwgdmFsKTsJCQkJCVwKKyAgICAgICAgcmV0dXJuIChTUExBWV9ST09UKGhlYWQpKTsJCQkJCVwKK30KKworLyogTWFpbiBzcGxheSBvcGVyYXRpb24uCisgKiBNb3ZlcyBub2RlIGNsb3NlIHRvIHRoZSBrZXkgb2YgZWxtIHRvIHRvcAorICovCisjZGVmaW5lIFNQTEFZX0dFTkVSQVRFKG5hbWUsIHR5cGUsIGZpZWxkLCBjbXApCQkJCVwKK3N0cnVjdCB0eXBlICoJCQkJCQkJCVwKK25hbWUjI19TUExBWV9JTlNFUlQoc3RydWN0IG5hbWUgKmhlYWQsIHN0cnVjdCB0eXBlICplbG0pCQlcCit7CQkJCQkJCQkJXAorICAgIGlmIChTUExBWV9FTVBUWShoZWFkKSkgewkJCQkJCVwKKwkgICAgU1BMQVlfTEVGVChlbG0sIGZpZWxkKSA9IFNQTEFZX1JJR0hUKGVsbSwgZmllbGQpID0gTlVMTDsJXAorICAgIH0gZWxzZSB7CQkJCQkJCQlcCisJICAgIGludCBfX2NvbXA7CQkJCQkJCVwKKwkgICAgbmFtZSMjX1NQTEFZKGhlYWQsIGVsbSk7CQkJCQlcCisJICAgIF9fY29tcCA9IChjbXApKGVsbSwgKGhlYWQpLT5zcGhfcm9vdCk7CQkJXAorCSAgICBpZihfX2NvbXAgPCAwKSB7CQkJCQkJXAorCQkgICAgU1BMQVlfTEVGVChlbG0sIGZpZWxkKSA9IFNQTEFZX0xFRlQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpO1wKKwkJICAgIFNQTEFZX1JJR0hUKGVsbSwgZmllbGQpID0gKGhlYWQpLT5zcGhfcm9vdDsJCVwKKwkJICAgIFNQTEFZX0xFRlQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpID0gTlVMTDsJCVwKKwkgICAgfSBlbHNlIGlmIChfX2NvbXAgPiAwKSB7CQkJCQlcCisJCSAgICBTUExBWV9SSUdIVChlbG0sIGZpZWxkKSA9IFNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKTtcCisJCSAgICBTUExBWV9MRUZUKGVsbSwgZmllbGQpID0gKGhlYWQpLT5zcGhfcm9vdDsJCVwKKwkJICAgIFNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9IE5VTEw7CVwKKwkgICAgfSBlbHNlCQkJCQkJCVwKKwkJICAgIHJldHVybiAoKGhlYWQpLT5zcGhfcm9vdCk7CQkJCVwKKyAgICB9CQkJCQkJCQkJXAorICAgIChoZWFkKS0+c3BoX3Jvb3QgPSAoZWxtKTsJCQkJCQlcCisgICAgcmV0dXJuIChOVUxMKTsJCQkJCQkJXAorfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0cnVjdCB0eXBlICoJCQkJCQkJCVwKK25hbWUjI19TUExBWV9SRU1PVkUoc3RydWN0IG5hbWUgKmhlYWQsIHN0cnVjdCB0eXBlICplbG0pCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpfX3RtcDsJCQkJCQlcCisJaWYgKFNQTEFZX0VNUFRZKGhlYWQpKQkJCQkJCVwKKwkJcmV0dXJuIChOVUxMKTsJCQkJCQlcCisJbmFtZSMjX1NQTEFZKGhlYWQsIGVsbSk7CQkJCQlcCisJaWYgKChjbXApKGVsbSwgKGhlYWQpLT5zcGhfcm9vdCkgPT0gMCkgewkJCVwKKwkJaWYgKFNQTEFZX0xFRlQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpID09IE5VTEwpIHsJXAorCQkJKGhlYWQpLT5zcGhfcm9vdCA9IFNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKTtcCisJCX0gZWxzZSB7CQkJCQkJXAorCQkJX190bXAgPSBTUExBWV9SSUdIVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCk7CVwKKwkJCShoZWFkKS0+c3BoX3Jvb3QgPSBTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKTtcCisJCQluYW1lIyNfU1BMQVkoaGVhZCwgZWxtKTsJCQlcCisJCQlTUExBWV9SSUdIVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCkgPSBfX3RtcDsJXAorCQl9CQkJCQkJCVwKKwkJcmV0dXJuIChlbG0pOwkJCQkJCVwKKwl9CQkJCQkJCQlcCisJcmV0dXJuIChOVUxMKTsJCQkJCQkJXAorfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3ZvaWQJCQkJCQkJCQlcCituYW1lIyNfU1BMQVkoc3RydWN0IG5hbWUgKmhlYWQsIHN0cnVjdCB0eXBlICplbG0pCQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSBfX25vZGUsICpfX2xlZnQsICpfX3JpZ2h0LCAqX190bXA7CQkJXAorCWludCBfX2NvbXA7CQkJCQkJCVwKK1wKKwlTUExBWV9MRUZUKCZfX25vZGUsIGZpZWxkKSA9IFNQTEFZX1JJR0hUKCZfX25vZGUsIGZpZWxkKSA9IE5VTEw7XAorCV9fbGVmdCA9IF9fcmlnaHQgPSAmX19ub2RlOwkJCQkJXAorXAorCXdoaWxlICgoX19jb21wID0gKGNtcCkoZWxtLCAoaGVhZCktPnNwaF9yb290KSkpIHsJCVwKKwkJaWYgKF9fY29tcCA8IDApIHsJCQkJCVwKKwkJCV9fdG1wID0gU1BMQVlfTEVGVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCk7CVwKKwkJCWlmIChfX3RtcCA9PSBOVUxMKQkJCQlcCisJCQkJYnJlYWs7CQkJCQlcCisJCQlpZiAoKGNtcCkoZWxtLCBfX3RtcCkgPCAwKXsJCQlcCisJCQkJU1BMQVlfUk9UQVRFX1JJR0hUKGhlYWQsIF9fdG1wLCBmaWVsZCk7CVwKKwkJCQlpZiAoU1BMQVlfTEVGVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCkgPT0gTlVMTClcCisJCQkJCWJyZWFrOwkJCQlcCisJCQl9CQkJCQkJXAorCQkJU1BMQVlfTElOS0xFRlQoaGVhZCwgX19yaWdodCwgZmllbGQpOwkJXAorCQl9IGVsc2UgaWYgKF9fY29tcCA+IDApIHsJCQkJXAorCQkJX190bXAgPSBTUExBWV9SSUdIVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCk7CVwKKwkJCWlmIChfX3RtcCA9PSBOVUxMKQkJCQlcCisJCQkJYnJlYWs7CQkJCQlcCisJCQlpZiAoKGNtcCkoZWxtLCBfX3RtcCkgPiAwKXsJCQlcCisJCQkJU1BMQVlfUk9UQVRFX0xFRlQoaGVhZCwgX190bXAsIGZpZWxkKTsJXAorCQkJCWlmIChTUExBWV9SSUdIVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCkgPT0gTlVMTClcCisJCQkJCWJyZWFrOwkJCQlcCisJCQl9CQkJCQkJXAorCQkJU1BMQVlfTElOS1JJR0hUKGhlYWQsIF9fbGVmdCwgZmllbGQpOwkJXAorCQl9CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisJU1BMQVlfQVNTRU1CTEUoaGVhZCwgJl9fbm9kZSwgX19sZWZ0LCBfX3JpZ2h0LCBmaWVsZCk7CQlcCit9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorLyogU3BsYXkgd2l0aCBlaXRoZXIgdGhlIG1pbmltdW0gb3IgdGhlIG1heGltdW0gZWxlbWVudAkJCVwKKyAqIFVzZWQgdG8gZmluZCBtaW5pbXVtIG9yIG1heGltdW0gZWxlbWVudCBpbiB0cmVlLgkJCVwKKyAqLwkJCQkJCQkJCVwKK3ZvaWQgbmFtZSMjX1NQTEFZX01JTk1BWChzdHJ1Y3QgbmFtZSAqaGVhZCwgaW50IF9fY29tcCkgXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSBfX25vZGUsICpfX2xlZnQsICpfX3JpZ2h0LCAqX190bXA7CQkJXAorXAorCVNQTEFZX0xFRlQoJl9fbm9kZSwgZmllbGQpID0gU1BMQVlfUklHSFQoJl9fbm9kZSwgZmllbGQpID0gTlVMTDtcCisJX19sZWZ0ID0gX19yaWdodCA9ICZfX25vZGU7CQkJCQlcCitcCisJd2hpbGUgKDEpIHsJCQkJCQkJXAorCQlpZiAoX19jb21wIDwgMCkgewkJCQkJXAorCQkJX190bXAgPSBTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKTsJXAorCQkJaWYgKF9fdG1wID09IE5VTEwpCQkJCVwKKwkJCQlicmVhazsJCQkJCVwKKwkJCWlmIChfX2NvbXAgPCAwKXsJCQkJXAorCQkJCVNQTEFZX1JPVEFURV9SSUdIVChoZWFkLCBfX3RtcCwgZmllbGQpOwlcCisJCQkJaWYgKFNQTEFZX0xFRlQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpID09IE5VTEwpXAorCQkJCQlicmVhazsJCQkJXAorCQkJfQkJCQkJCVwKKwkJCVNQTEFZX0xJTktMRUZUKGhlYWQsIF9fcmlnaHQsIGZpZWxkKTsJCVwKKwkJfSBlbHNlIGlmIChfX2NvbXAgPiAwKSB7CQkJCVwKKwkJCV9fdG1wID0gU1BMQVlfUklHSFQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpOwlcCisJCQlpZiAoX190bXAgPT0gTlVMTCkJCQkJXAorCQkJCWJyZWFrOwkJCQkJXAorCQkJaWYgKF9fY29tcCA+IDApIHsJCQkJXAorCQkJCVNQTEFZX1JPVEFURV9MRUZUKGhlYWQsIF9fdG1wLCBmaWVsZCk7CVwKKwkJCQlpZiAoU1BMQVlfUklHSFQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpID09IE5VTEwpXAorCQkJCQlicmVhazsJCQkJXAorCQkJfQkJCQkJCVwKKwkJCVNQTEFZX0xJTktSSUdIVChoZWFkLCBfX2xlZnQsIGZpZWxkKTsJCVwKKwkJfQkJCQkJCQlcCisJfQkJCQkJCQkJXAorCVNQTEFZX0FTU0VNQkxFKGhlYWQsICZfX25vZGUsIF9fbGVmdCwgX19yaWdodCwgZmllbGQpOwkJXAorfQorCisjZGVmaW5lIFNQTEFZX05FR0lORgktMQorI2RlZmluZSBTUExBWV9JTkYJMQorCisjZGVmaW5lIFNQTEFZX0lOU0VSVChuYW1lLCB4LCB5KQluYW1lIyNfU1BMQVlfSU5TRVJUKHgsIHkpCisjZGVmaW5lIFNQTEFZX1JFTU9WRShuYW1lLCB4LCB5KQluYW1lIyNfU1BMQVlfUkVNT1ZFKHgsIHkpCisjZGVmaW5lIFNQTEFZX0ZJTkQobmFtZSwgeCwgeSkJCW5hbWUjI19TUExBWV9GSU5EKHgsIHkpCisjZGVmaW5lIFNQTEFZX05FWFQobmFtZSwgeCwgeSkJCW5hbWUjI19TUExBWV9ORVhUKHgsIHkpCisjZGVmaW5lIFNQTEFZX01JTihuYW1lLCB4KQkJKFNQTEFZX0VNUFRZKHgpID8gTlVMTAlcCisJCQkJCTogbmFtZSMjX1NQTEFZX01JTl9NQVgoeCwgU1BMQVlfTkVHSU5GKSkKKyNkZWZpbmUgU1BMQVlfTUFYKG5hbWUsIHgpCQkoU1BMQVlfRU1QVFkoeCkgPyBOVUxMCVwKKwkJCQkJOiBuYW1lIyNfU1BMQVlfTUlOX01BWCh4LCBTUExBWV9JTkYpKQorCisjZGVmaW5lIFNQTEFZX0ZPUkVBQ0goeCwgbmFtZSwgaGVhZCkJCQkJCVwKKwlmb3IgKCh4KSA9IFNQTEFZX01JTihuYW1lLCBoZWFkKTsJCQkJXAorCSAgICAgKHgpICE9IE5VTEw7CQkJCQkJXAorCSAgICAgKHgpID0gU1BMQVlfTkVYVChuYW1lLCBoZWFkLCB4KSkKKworLyogTWFjcm9zIHRoYXQgZGVmaW5lIGEgcmVkLWJsYWNrIHRyZWUgKi8KKyNkZWZpbmUgUkJfSEVBRChuYW1lLCB0eXBlKQkJCQkJCVwKK3N0cnVjdCBuYW1lIHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqcmJoX3Jvb3Q7IC8qIHJvb3Qgb2YgdGhlIHRyZWUgKi8JCQlcCit9CisKKyNkZWZpbmUgUkJfSU5JVElBTElaRVIocm9vdCkJCQkJCQlcCisJeyBOVUxMIH0KKworI2RlZmluZSBSQl9JTklUKHJvb3QpIGRvIHsJCQkJCQlcCisJKHJvb3QpLT5yYmhfcm9vdCA9IE5VTEw7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFJCX0JMQUNLCTAKKyNkZWZpbmUgUkJfUkVECQkxCisjZGVmaW5lIFJCX0VOVFJZKHR5cGUpCQkJCQkJCVwKK3N0cnVjdCB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKnJiZV9sZWZ0OwkJLyogbGVmdCBlbGVtZW50ICovCQlcCisJc3RydWN0IHR5cGUgKnJiZV9yaWdodDsJCS8qIHJpZ2h0IGVsZW1lbnQgKi8JCVwKKwlzdHJ1Y3QgdHlwZSAqcmJlX3BhcmVudDsJLyogcGFyZW50IGVsZW1lbnQgKi8JCVwKKwlpbnQgcmJlX2NvbG9yOwkJCS8qIG5vZGUgY29sb3IgKi8JCVwKK30KKworI2RlZmluZSBSQl9MRUZUKGVsbSwgZmllbGQpCQkoZWxtKS0+ZmllbGQucmJlX2xlZnQKKyNkZWZpbmUgUkJfUklHSFQoZWxtLCBmaWVsZCkJCShlbG0pLT5maWVsZC5yYmVfcmlnaHQKKyNkZWZpbmUgUkJfUEFSRU5UKGVsbSwgZmllbGQpCQkoZWxtKS0+ZmllbGQucmJlX3BhcmVudAorI2RlZmluZSBSQl9DT0xPUihlbG0sIGZpZWxkKQkJKGVsbSktPmZpZWxkLnJiZV9jb2xvcgorI2RlZmluZSBSQl9ST09UKGhlYWQpCQkJKGhlYWQpLT5yYmhfcm9vdAorI2RlZmluZSBSQl9FTVBUWShoZWFkKQkJCShSQl9ST09UKGhlYWQpID09IE5VTEwpCisKKyNkZWZpbmUgUkJfU0VUKGVsbSwgcGFyZW50LCBmaWVsZCkgZG8gewkJCQkJXAorCVJCX1BBUkVOVChlbG0sIGZpZWxkKSA9IHBhcmVudDsJCQkJCVwKKwlSQl9MRUZUKGVsbSwgZmllbGQpID0gUkJfUklHSFQoZWxtLCBmaWVsZCkgPSBOVUxMOwkJXAorCVJCX0NPTE9SKGVsbSwgZmllbGQpID0gUkJfUkVEOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBSQl9TRVRfQkxBQ0tSRUQoYmxhY2ssIHJlZCwgZmllbGQpIGRvIHsJCQkJXAorCVJCX0NPTE9SKGJsYWNrLCBmaWVsZCkgPSBSQl9CTEFDSzsJCQkJXAorCVJCX0NPTE9SKHJlZCwgZmllbGQpID0gUkJfUkVEOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2lmbmRlZiBSQl9BVUdNRU5UCisjZGVmaW5lIFJCX0FVR01FTlQoeCkKKyNlbmRpZgorCisjZGVmaW5lIFJCX1JPVEFURV9MRUZUKGhlYWQsIGVsbSwgdG1wLCBmaWVsZCkgZG8gewkJCVwKKwkodG1wKSA9IFJCX1JJR0hUKGVsbSwgZmllbGQpOwkJCQkJXAorCWlmICgoUkJfUklHSFQoZWxtLCBmaWVsZCkgPSBSQl9MRUZUKHRtcCwgZmllbGQpKSkgewkJXAorCQlSQl9QQVJFTlQoUkJfTEVGVCh0bXAsIGZpZWxkKSwgZmllbGQpID0gKGVsbSk7CQlcCisJfQkJCQkJCQkJXAorCVJCX0FVR01FTlQoZWxtKTsJCQkJCQlcCisJaWYgKChSQl9QQVJFTlQodG1wLCBmaWVsZCkgPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCkpKSB7CQlcCisJCWlmICgoZWxtKSA9PSBSQl9MRUZUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpKQlcCisJCQlSQl9MRUZUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpID0gKHRtcCk7CVwKKwkJZWxzZQkJCQkJCQlcCisJCQlSQl9SSUdIVChSQl9QQVJFTlQoZWxtLCBmaWVsZCksIGZpZWxkKSA9ICh0bXApOwlcCisJfSBlbHNlCQkJCQkJCQlcCisJCShoZWFkKS0+cmJoX3Jvb3QgPSAodG1wKTsJCQkJXAorCVJCX0xFRlQodG1wLCBmaWVsZCkgPSAoZWxtKTsJCQkJCVwKKwlSQl9QQVJFTlQoZWxtLCBmaWVsZCkgPSAodG1wKTsJCQkJCVwKKwlSQl9BVUdNRU5UKHRtcCk7CQkJCQkJXAorCWlmICgoUkJfUEFSRU5UKHRtcCwgZmllbGQpKSkJCQkJCVwKKwkJUkJfQVVHTUVOVChSQl9QQVJFTlQodG1wLCBmaWVsZCkpOwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUkJfUk9UQVRFX1JJR0hUKGhlYWQsIGVsbSwgdG1wLCBmaWVsZCkgZG8gewkJCVwKKwkodG1wKSA9IFJCX0xFRlQoZWxtLCBmaWVsZCk7CQkJCQlcCisJaWYgKChSQl9MRUZUKGVsbSwgZmllbGQpID0gUkJfUklHSFQodG1wLCBmaWVsZCkpKSB7CQlcCisJCVJCX1BBUkVOVChSQl9SSUdIVCh0bXAsIGZpZWxkKSwgZmllbGQpID0gKGVsbSk7CQlcCisJfQkJCQkJCQkJXAorCVJCX0FVR01FTlQoZWxtKTsJCQkJCQlcCisJaWYgKChSQl9QQVJFTlQodG1wLCBmaWVsZCkgPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCkpKSB7CQlcCisJCWlmICgoZWxtKSA9PSBSQl9MRUZUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpKQlcCisJCQlSQl9MRUZUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpID0gKHRtcCk7CVwKKwkJZWxzZQkJCQkJCQlcCisJCQlSQl9SSUdIVChSQl9QQVJFTlQoZWxtLCBmaWVsZCksIGZpZWxkKSA9ICh0bXApOwlcCisJfSBlbHNlCQkJCQkJCQlcCisJCShoZWFkKS0+cmJoX3Jvb3QgPSAodG1wKTsJCQkJXAorCVJCX1JJR0hUKHRtcCwgZmllbGQpID0gKGVsbSk7CQkJCQlcCisJUkJfUEFSRU5UKGVsbSwgZmllbGQpID0gKHRtcCk7CQkJCQlcCisJUkJfQVVHTUVOVCh0bXApOwkJCQkJCVwKKwlpZiAoKFJCX1BBUkVOVCh0bXAsIGZpZWxkKSkpCQkJCQlcCisJCVJCX0FVR01FTlQoUkJfUEFSRU5UKHRtcCwgZmllbGQpKTsJCQlcCit9IHdoaWxlICgwKQorCisvKiBHZW5lcmF0ZXMgcHJvdG90eXBlcyBhbmQgaW5saW5lIGZ1bmN0aW9ucyAqLworI2RlZmluZSBSQl9QUk9UT1RZUEUobmFtZSwgdHlwZSwgZmllbGQsIGNtcCkJCQkJXAordm9pZCBuYW1lIyNfUkJfSU5TRVJUX0NPTE9SKHN0cnVjdCBuYW1lICosIHN0cnVjdCB0eXBlICopOwlcCit2b2lkIG5hbWUjI19SQl9SRU1PVkVfQ09MT1Ioc3RydWN0IG5hbWUgKiwgc3RydWN0IHR5cGUgKiwgc3RydWN0IHR5cGUgKik7XAorc3RydWN0IHR5cGUgKm5hbWUjI19SQl9SRU1PVkUoc3RydWN0IG5hbWUgKiwgc3RydWN0IHR5cGUgKik7CQlcCitzdHJ1Y3QgdHlwZSAqbmFtZSMjX1JCX0lOU0VSVChzdHJ1Y3QgbmFtZSAqLCBzdHJ1Y3QgdHlwZSAqKTsJCVwKK3N0cnVjdCB0eXBlICpuYW1lIyNfUkJfRklORChzdHJ1Y3QgbmFtZSAqLCBzdHJ1Y3QgdHlwZSAqKTsJCVwKK3N0cnVjdCB0eXBlICpuYW1lIyNfUkJfTkVYVChzdHJ1Y3QgdHlwZSAqKTsJCQkJXAorc3RydWN0IHR5cGUgKm5hbWUjI19SQl9NSU5NQVgoc3RydWN0IG5hbWUgKiwgaW50KTsJCQkKKworCisvKiBNYWluIHJiIG9wZXJhdGlvbi4KKyAqIE1vdmVzIG5vZGUgY2xvc2UgdG8gdGhlIGtleSBvZiBlbG0gdG8gdG9wCisgKi8KKyNkZWZpbmUgUkJfR0VORVJBVEUobmFtZSwgdHlwZSwgZmllbGQsIGNtcCkJCQkJXAordm9pZAkJCQkJCQkJCVwKK25hbWUjI19SQl9JTlNFUlRfQ09MT1Ioc3RydWN0IG5hbWUgKmhlYWQsIHN0cnVjdCB0eXBlICplbG0pCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpwYXJlbnQsICpncGFyZW50LCAqdG1wOwkJCQlcCisJd2hpbGUgKChwYXJlbnQgPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCkpICYmCQkJXAorCSAgICBSQl9DT0xPUihwYXJlbnQsIGZpZWxkKSA9PSBSQl9SRUQpIHsJCQlcCisJCWdwYXJlbnQgPSBSQl9QQVJFTlQocGFyZW50LCBmaWVsZCk7CQkJXAorCQlpZiAocGFyZW50ID09IFJCX0xFRlQoZ3BhcmVudCwgZmllbGQpKSB7CQlcCisJCQl0bXAgPSBSQl9SSUdIVChncGFyZW50LCBmaWVsZCk7CQkJXAorCQkJaWYgKHRtcCAmJiBSQl9DT0xPUih0bXAsIGZpZWxkKSA9PSBSQl9SRUQpIHsJXAorCQkJCVJCX0NPTE9SKHRtcCwgZmllbGQpID0gUkJfQkxBQ0s7CVwKKwkJCQlSQl9TRVRfQkxBQ0tSRUQocGFyZW50LCBncGFyZW50LCBmaWVsZCk7XAorCQkJCWVsbSA9IGdwYXJlbnQ7CQkJCVwKKwkJCQljb250aW51ZTsJCQkJXAorCQkJfQkJCQkJCVwKKwkJCWlmIChSQl9SSUdIVChwYXJlbnQsIGZpZWxkKSA9PSBlbG0pIHsJCVwKKwkJCQlSQl9ST1RBVEVfTEVGVChoZWFkLCBwYXJlbnQsIHRtcCwgZmllbGQpO1wKKwkJCQl0bXAgPSBwYXJlbnQ7CQkJCVwKKwkJCQlwYXJlbnQgPSBlbG07CQkJCVwKKwkJCQllbG0gPSB0bXA7CQkJCVwKKwkJCX0JCQkJCQlcCisJCQlSQl9TRVRfQkxBQ0tSRUQocGFyZW50LCBncGFyZW50LCBmaWVsZCk7CVwKKwkJCVJCX1JPVEFURV9SSUdIVChoZWFkLCBncGFyZW50LCB0bXAsIGZpZWxkKTsJXAorCQl9IGVsc2UgewkJCQkJCVwKKwkJCXRtcCA9IFJCX0xFRlQoZ3BhcmVudCwgZmllbGQpOwkJCVwKKwkJCWlmICh0bXAgJiYgUkJfQ09MT1IodG1wLCBmaWVsZCkgPT0gUkJfUkVEKSB7CVwKKwkJCQlSQl9DT0xPUih0bXAsIGZpZWxkKSA9IFJCX0JMQUNLOwlcCisJCQkJUkJfU0VUX0JMQUNLUkVEKHBhcmVudCwgZ3BhcmVudCwgZmllbGQpO1wKKwkJCQllbG0gPSBncGFyZW50OwkJCQlcCisJCQkJY29udGludWU7CQkJCVwKKwkJCX0JCQkJCQlcCisJCQlpZiAoUkJfTEVGVChwYXJlbnQsIGZpZWxkKSA9PSBlbG0pIHsJCVwKKwkJCQlSQl9ST1RBVEVfUklHSFQoaGVhZCwgcGFyZW50LCB0bXAsIGZpZWxkKTtcCisJCQkJdG1wID0gcGFyZW50OwkJCQlcCisJCQkJcGFyZW50ID0gZWxtOwkJCQlcCisJCQkJZWxtID0gdG1wOwkJCQlcCisJCQl9CQkJCQkJXAorCQkJUkJfU0VUX0JMQUNLUkVEKHBhcmVudCwgZ3BhcmVudCwgZmllbGQpOwlcCisJCQlSQl9ST1RBVEVfTEVGVChoZWFkLCBncGFyZW50LCB0bXAsIGZpZWxkKTsJXAorCQl9CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisJUkJfQ09MT1IoaGVhZC0+cmJoX3Jvb3QsIGZpZWxkKSA9IFJCX0JMQUNLOwkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCit2b2lkCQkJCQkJCQkJXAorbmFtZSMjX1JCX1JFTU9WRV9DT0xPUihzdHJ1Y3QgbmFtZSAqaGVhZCwgc3RydWN0IHR5cGUgKnBhcmVudCwgc3RydWN0IHR5cGUgKmVsbSkgXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqdG1wOwkJCQkJCVwKKwl3aGlsZSAoKGVsbSA9PSBOVUxMIHx8IFJCX0NPTE9SKGVsbSwgZmllbGQpID09IFJCX0JMQUNLKSAmJglcCisJICAgIGVsbSAhPSBSQl9ST09UKGhlYWQpKSB7CQkJCQlcCisJCWlmIChSQl9MRUZUKHBhcmVudCwgZmllbGQpID09IGVsbSkgewkJCVwKKwkJCXRtcCA9IFJCX1JJR0hUKHBhcmVudCwgZmllbGQpOwkJCVwKKwkJCWlmIChSQl9DT0xPUih0bXAsIGZpZWxkKSA9PSBSQl9SRUQpIHsJCVwKKwkJCQlSQl9TRVRfQkxBQ0tSRUQodG1wLCBwYXJlbnQsIGZpZWxkKTsJXAorCQkJCVJCX1JPVEFURV9MRUZUKGhlYWQsIHBhcmVudCwgdG1wLCBmaWVsZCk7XAorCQkJCXRtcCA9IFJCX1JJR0hUKHBhcmVudCwgZmllbGQpOwkJXAorCQkJfQkJCQkJCVwKKwkJCWlmICgoUkJfTEVGVCh0bXAsIGZpZWxkKSA9PSBOVUxMIHx8CQlcCisJCQkgICAgUkJfQ09MT1IoUkJfTEVGVCh0bXAsIGZpZWxkKSwgZmllbGQpID09IFJCX0JMQUNLKSAmJlwKKwkJCSAgICAoUkJfUklHSFQodG1wLCBmaWVsZCkgPT0gTlVMTCB8fAkJXAorCQkJICAgIFJCX0NPTE9SKFJCX1JJR0hUKHRtcCwgZmllbGQpLCBmaWVsZCkgPT0gUkJfQkxBQ0spKSB7XAorCQkJCVJCX0NPTE9SKHRtcCwgZmllbGQpID0gUkJfUkVEOwkJXAorCQkJCWVsbSA9IHBhcmVudDsJCQkJXAorCQkJCXBhcmVudCA9IFJCX1BBUkVOVChlbG0sIGZpZWxkKTsJCVwKKwkJCX0gZWxzZSB7CQkJCQlcCisJCQkJaWYgKFJCX1JJR0hUKHRtcCwgZmllbGQpID09IE5VTEwgfHwJXAorCQkJCSAgICBSQl9DT0xPUihSQl9SSUdIVCh0bXAsIGZpZWxkKSwgZmllbGQpID09IFJCX0JMQUNLKSB7XAorCQkJCQlzdHJ1Y3QgdHlwZSAqb2xlZnQ7CQlcCisJCQkJCWlmICgob2xlZnQgPSBSQl9MRUZUKHRtcCwgZmllbGQpKSlcCisJCQkJCQlSQl9DT0xPUihvbGVmdCwgZmllbGQpID0gUkJfQkxBQ0s7XAorCQkJCQlSQl9DT0xPUih0bXAsIGZpZWxkKSA9IFJCX1JFRDsJXAorCQkJCQlSQl9ST1RBVEVfUklHSFQoaGVhZCwgdG1wLCBvbGVmdCwgZmllbGQpO1wKKwkJCQkJdG1wID0gUkJfUklHSFQocGFyZW50LCBmaWVsZCk7CVwKKwkJCQl9CQkJCQlcCisJCQkJUkJfQ09MT1IodG1wLCBmaWVsZCkgPSBSQl9DT0xPUihwYXJlbnQsIGZpZWxkKTtcCisJCQkJUkJfQ09MT1IocGFyZW50LCBmaWVsZCkgPSBSQl9CTEFDSzsJXAorCQkJCWlmIChSQl9SSUdIVCh0bXAsIGZpZWxkKSkJCVwKKwkJCQkJUkJfQ09MT1IoUkJfUklHSFQodG1wLCBmaWVsZCksIGZpZWxkKSA9IFJCX0JMQUNLO1wKKwkJCQlSQl9ST1RBVEVfTEVGVChoZWFkLCBwYXJlbnQsIHRtcCwgZmllbGQpO1wKKwkJCQllbG0gPSBSQl9ST09UKGhlYWQpOwkJCVwKKwkJCQlicmVhazsJCQkJCVwKKwkJCX0JCQkJCQlcCisJCX0gZWxzZSB7CQkJCQkJXAorCQkJdG1wID0gUkJfTEVGVChwYXJlbnQsIGZpZWxkKTsJCQlcCisJCQlpZiAoUkJfQ09MT1IodG1wLCBmaWVsZCkgPT0gUkJfUkVEKSB7CQlcCisJCQkJUkJfU0VUX0JMQUNLUkVEKHRtcCwgcGFyZW50LCBmaWVsZCk7CVwKKwkJCQlSQl9ST1RBVEVfUklHSFQoaGVhZCwgcGFyZW50LCB0bXAsIGZpZWxkKTtcCisJCQkJdG1wID0gUkJfTEVGVChwYXJlbnQsIGZpZWxkKTsJCVwKKwkJCX0JCQkJCQlcCisJCQlpZiAoKFJCX0xFRlQodG1wLCBmaWVsZCkgPT0gTlVMTCB8fAkJXAorCQkJICAgIFJCX0NPTE9SKFJCX0xFRlQodG1wLCBmaWVsZCksIGZpZWxkKSA9PSBSQl9CTEFDSykgJiZcCisJCQkgICAgKFJCX1JJR0hUKHRtcCwgZmllbGQpID09IE5VTEwgfHwJCVwKKwkJCSAgICBSQl9DT0xPUihSQl9SSUdIVCh0bXAsIGZpZWxkKSwgZmllbGQpID09IFJCX0JMQUNLKSkge1wKKwkJCQlSQl9DT0xPUih0bXAsIGZpZWxkKSA9IFJCX1JFRDsJCVwKKwkJCQllbG0gPSBwYXJlbnQ7CQkJCVwKKwkJCQlwYXJlbnQgPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCk7CQlcCisJCQl9IGVsc2UgewkJCQkJXAorCQkJCWlmIChSQl9MRUZUKHRtcCwgZmllbGQpID09IE5VTEwgfHwJXAorCQkJCSAgICBSQl9DT0xPUihSQl9MRUZUKHRtcCwgZmllbGQpLCBmaWVsZCkgPT0gUkJfQkxBQ0spIHtcCisJCQkJCXN0cnVjdCB0eXBlICpvcmlnaHQ7CQlcCisJCQkJCWlmICgob3JpZ2h0ID0gUkJfUklHSFQodG1wLCBmaWVsZCkpKVwKKwkJCQkJCVJCX0NPTE9SKG9yaWdodCwgZmllbGQpID0gUkJfQkxBQ0s7XAorCQkJCQlSQl9DT0xPUih0bXAsIGZpZWxkKSA9IFJCX1JFRDsJXAorCQkJCQlSQl9ST1RBVEVfTEVGVChoZWFkLCB0bXAsIG9yaWdodCwgZmllbGQpO1wKKwkJCQkJdG1wID0gUkJfTEVGVChwYXJlbnQsIGZpZWxkKTsJXAorCQkJCX0JCQkJCVwKKwkJCQlSQl9DT0xPUih0bXAsIGZpZWxkKSA9IFJCX0NPTE9SKHBhcmVudCwgZmllbGQpO1wKKwkJCQlSQl9DT0xPUihwYXJlbnQsIGZpZWxkKSA9IFJCX0JMQUNLOwlcCisJCQkJaWYgKFJCX0xFRlQodG1wLCBmaWVsZCkpCQlcCisJCQkJCVJCX0NPTE9SKFJCX0xFRlQodG1wLCBmaWVsZCksIGZpZWxkKSA9IFJCX0JMQUNLO1wKKwkJCQlSQl9ST1RBVEVfUklHSFQoaGVhZCwgcGFyZW50LCB0bXAsIGZpZWxkKTtcCisJCQkJZWxtID0gUkJfUk9PVChoZWFkKTsJCQlcCisJCQkJYnJlYWs7CQkJCQlcCisJCQl9CQkJCQkJXAorCQl9CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisJaWYgKGVsbSkJCQkJCQkJXAorCQlSQl9DT0xPUihlbG0sIGZpZWxkKSA9IFJCX0JMQUNLOwkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdHJ1Y3QgdHlwZSAqCQkJCQkJCQlcCituYW1lIyNfUkJfUkVNT1ZFKHN0cnVjdCBuYW1lICpoZWFkLCBzdHJ1Y3QgdHlwZSAqZWxtKQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKmNoaWxkLCAqcGFyZW50LCAqb2xkID0gZWxtOwkJCVwKKwlpbnQgY29sb3I7CQkJCQkJCVwKKwlpZiAoUkJfTEVGVChlbG0sIGZpZWxkKSA9PSBOVUxMKQkJCQlcCisJCWNoaWxkID0gUkJfUklHSFQoZWxtLCBmaWVsZCk7CQkJCVwKKwllbHNlIGlmIChSQl9SSUdIVChlbG0sIGZpZWxkKSA9PSBOVUxMKQkJCQlcCisJCWNoaWxkID0gUkJfTEVGVChlbG0sIGZpZWxkKTsJCQkJXAorCWVsc2UgewkJCQkJCQkJXAorCQlzdHJ1Y3QgdHlwZSAqbGVmdDsJCQkJCVwKKwkJZWxtID0gUkJfUklHSFQoZWxtLCBmaWVsZCk7CQkJCVwKKwkJd2hpbGUgKChsZWZ0ID0gUkJfTEVGVChlbG0sIGZpZWxkKSkpCQkJXAorCQkJZWxtID0gbGVmdDsJCQkJCVwKKwkJY2hpbGQgPSBSQl9SSUdIVChlbG0sIGZpZWxkKTsJCQkJXAorCQlwYXJlbnQgPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCk7CQkJCVwKKwkJY29sb3IgPSBSQl9DT0xPUihlbG0sIGZpZWxkKTsJCQkJXAorCQlpZiAoY2hpbGQpCQkJCQkJXAorCQkJUkJfUEFSRU5UKGNoaWxkLCBmaWVsZCkgPSBwYXJlbnQ7CQlcCisJCWlmIChwYXJlbnQpIHsJCQkJCQlcCisJCQlpZiAoUkJfTEVGVChwYXJlbnQsIGZpZWxkKSA9PSBlbG0pCQlcCisJCQkJUkJfTEVGVChwYXJlbnQsIGZpZWxkKSA9IGNoaWxkOwkJXAorCQkJZWxzZQkJCQkJCVwKKwkJCQlSQl9SSUdIVChwYXJlbnQsIGZpZWxkKSA9IGNoaWxkOwlcCisJCQlSQl9BVUdNRU5UKHBhcmVudCk7CQkJCVwKKwkJfSBlbHNlCQkJCQkJCVwKKwkJCVJCX1JPT1QoaGVhZCkgPSBjaGlsZDsJCQkJXAorCQlpZiAoUkJfUEFSRU5UKGVsbSwgZmllbGQpID09IG9sZCkJCQlcCisJCQlwYXJlbnQgPSBlbG07CQkJCQlcCisJCShlbG0pLT5maWVsZCA9IChvbGQpLT5maWVsZDsJCQkJXAorCQlpZiAoUkJfUEFSRU5UKG9sZCwgZmllbGQpKSB7CQkJCVwKKwkJCWlmIChSQl9MRUZUKFJCX1BBUkVOVChvbGQsIGZpZWxkKSwgZmllbGQpID09IG9sZClcCisJCQkJUkJfTEVGVChSQl9QQVJFTlQob2xkLCBmaWVsZCksIGZpZWxkKSA9IGVsbTtcCisJCQllbHNlCQkJCQkJXAorCQkJCVJCX1JJR0hUKFJCX1BBUkVOVChvbGQsIGZpZWxkKSwgZmllbGQpID0gZWxtO1wKKwkJCVJCX0FVR01FTlQoUkJfUEFSRU5UKG9sZCwgZmllbGQpKTsJCVwKKwkJfSBlbHNlCQkJCQkJCVwKKwkJCVJCX1JPT1QoaGVhZCkgPSBlbG07CQkJCVwKKwkJUkJfUEFSRU5UKFJCX0xFRlQob2xkLCBmaWVsZCksIGZpZWxkKSA9IGVsbTsJCVwKKwkJaWYgKFJCX1JJR0hUKG9sZCwgZmllbGQpKQkJCQlcCisJCQlSQl9QQVJFTlQoUkJfUklHSFQob2xkLCBmaWVsZCksIGZpZWxkKSA9IGVsbTsJXAorCQlpZiAocGFyZW50KSB7CQkJCQkJXAorCQkJbGVmdCA9IHBhcmVudDsJCQkJCVwKKwkJCWRvIHsJCQkJCQlcCisJCQkJUkJfQVVHTUVOVChsZWZ0KTsJCQlcCisJCQl9IHdoaWxlICgobGVmdCA9IFJCX1BBUkVOVChsZWZ0LCBmaWVsZCkpKTsJXAorCQl9CQkJCQkJCVwKKwkJZ290byBjb2xvcjsJCQkJCQlcCisJfQkJCQkJCQkJXAorCXBhcmVudCA9IFJCX1BBUkVOVChlbG0sIGZpZWxkKTsJCQkJCVwKKwljb2xvciA9IFJCX0NPTE9SKGVsbSwgZmllbGQpOwkJCQkJXAorCWlmIChjaGlsZCkJCQkJCQkJXAorCQlSQl9QQVJFTlQoY2hpbGQsIGZpZWxkKSA9IHBhcmVudDsJCQlcCisJaWYgKHBhcmVudCkgewkJCQkJCQlcCisJCWlmIChSQl9MRUZUKHBhcmVudCwgZmllbGQpID09IGVsbSkJCQlcCisJCQlSQl9MRUZUKHBhcmVudCwgZmllbGQpID0gY2hpbGQ7CQkJXAorCQllbHNlCQkJCQkJCVwKKwkJCVJCX1JJR0hUKHBhcmVudCwgZmllbGQpID0gY2hpbGQ7CQlcCisJCVJCX0FVR01FTlQocGFyZW50KTsJCQkJCVwKKwl9IGVsc2UJCQkJCQkJCVwKKwkJUkJfUk9PVChoZWFkKSA9IGNoaWxkOwkJCQkJXAorY29sb3I6CQkJCQkJCQkJXAorCWlmIChjb2xvciA9PSBSQl9CTEFDSykJCQkJCQlcCisJCW5hbWUjI19SQl9SRU1PVkVfQ09MT1IoaGVhZCwgcGFyZW50LCBjaGlsZCk7CQlcCisJcmV0dXJuIChvbGQpOwkJCQkJCQlcCit9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorLyogSW5zZXJ0cyBhIG5vZGUgaW50byB0aGUgUkIgdHJlZSAqLwkJCQkJXAorc3RydWN0IHR5cGUgKgkJCQkJCQkJXAorbmFtZSMjX1JCX0lOU0VSVChzdHJ1Y3QgbmFtZSAqaGVhZCwgc3RydWN0IHR5cGUgKmVsbSkJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICp0bXA7CQkJCQkJXAorCXN0cnVjdCB0eXBlICpwYXJlbnQgPSBOVUxMOwkJCQkJXAorCWludCBjb21wID0gMDsJCQkJCQkJXAorCXRtcCA9IFJCX1JPT1QoaGVhZCk7CQkJCQkJXAorCXdoaWxlICh0bXApIHsJCQkJCQkJXAorCQlwYXJlbnQgPSB0bXA7CQkJCQkJXAorCQljb21wID0gKGNtcCkoZWxtLCBwYXJlbnQpOwkJCQlcCisJCWlmIChjb21wIDwgMCkJCQkJCQlcCisJCQl0bXAgPSBSQl9MRUZUKHRtcCwgZmllbGQpOwkJCVwKKwkJZWxzZSBpZiAoY29tcCA+IDApCQkJCQlcCisJCQl0bXAgPSBSQl9SSUdIVCh0bXAsIGZpZWxkKTsJCQlcCisJCWVsc2UJCQkJCQkJXAorCQkJcmV0dXJuICh0bXApOwkJCQkJXAorCX0JCQkJCQkJCVwKKwlSQl9TRVQoZWxtLCBwYXJlbnQsIGZpZWxkKTsJCQkJCVwKKwlpZiAocGFyZW50ICE9IE5VTEwpIHsJCQkJCQlcCisJCWlmIChjb21wIDwgMCkJCQkJCQlcCisJCQlSQl9MRUZUKHBhcmVudCwgZmllbGQpID0gZWxtOwkJCVwKKwkJZWxzZQkJCQkJCQlcCisJCQlSQl9SSUdIVChwYXJlbnQsIGZpZWxkKSA9IGVsbTsJCQlcCisJCVJCX0FVR01FTlQocGFyZW50KTsJCQkJCVwKKwl9IGVsc2UJCQkJCQkJCVwKKwkJUkJfUk9PVChoZWFkKSA9IGVsbTsJCQkJCVwKKwluYW1lIyNfUkJfSU5TRVJUX0NPTE9SKGhlYWQsIGVsbSk7CQkJCVwKKwlyZXR1cm4gKE5VTEwpOwkJCQkJCQlcCit9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorLyogRmluZHMgdGhlIG5vZGUgd2l0aCB0aGUgc2FtZSBrZXkgYXMgZWxtICovCQkJCVwKK3N0cnVjdCB0eXBlICoJCQkJCQkJCVwKK25hbWUjI19SQl9GSU5EKHN0cnVjdCBuYW1lICpoZWFkLCBzdHJ1Y3QgdHlwZSAqZWxtKQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKnRtcCA9IFJCX1JPT1QoaGVhZCk7CQkJCVwKKwlpbnQgY29tcDsJCQkJCQkJXAorCXdoaWxlICh0bXApIHsJCQkJCQkJXAorCQljb21wID0gY21wKGVsbSwgdG1wKTsJCQkJCVwKKwkJaWYgKGNvbXAgPCAwKQkJCQkJCVwKKwkJCXRtcCA9IFJCX0xFRlQodG1wLCBmaWVsZCk7CQkJXAorCQllbHNlIGlmIChjb21wID4gMCkJCQkJCVwKKwkJCXRtcCA9IFJCX1JJR0hUKHRtcCwgZmllbGQpOwkJCVwKKwkJZWxzZQkJCQkJCQlcCisJCQlyZXR1cm4gKHRtcCk7CQkJCQlcCisJfQkJCQkJCQkJXAorCXJldHVybiAoTlVMTCk7CQkJCQkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdHJ1Y3QgdHlwZSAqCQkJCQkJCQlcCituYW1lIyNfUkJfTkVYVChzdHJ1Y3QgdHlwZSAqZWxtKQkJCQkJXAorewkJCQkJCQkJCVwKKwlpZiAoUkJfUklHSFQoZWxtLCBmaWVsZCkpIHsJCQkJCVwKKwkJZWxtID0gUkJfUklHSFQoZWxtLCBmaWVsZCk7CQkJCVwKKwkJd2hpbGUgKFJCX0xFRlQoZWxtLCBmaWVsZCkpCQkJCVwKKwkJCWVsbSA9IFJCX0xFRlQoZWxtLCBmaWVsZCk7CQkJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkJaWYgKFJCX1BBUkVOVChlbG0sIGZpZWxkKSAmJgkJCQlcCisJCSAgICAoZWxtID09IFJCX0xFRlQoUkJfUEFSRU5UKGVsbSwgZmllbGQpLCBmaWVsZCkpKQlcCisJCQllbG0gPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCk7CQkJXAorCQllbHNlIHsJCQkJCQkJXAorCQkJd2hpbGUgKFJCX1BBUkVOVChlbG0sIGZpZWxkKSAmJgkJCVwKKwkJCSAgICAoZWxtID09IFJCX1JJR0hUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpKSlcCisJCQkJZWxtID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpOwkJXAorCQkJZWxtID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpOwkJCVwKKwkJfQkJCQkJCQlcCisJfQkJCQkJCQkJXAorCXJldHVybiAoZWxtKTsJCQkJCQkJXAorfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0cnVjdCB0eXBlICoJCQkJCQkJCVwKK25hbWUjI19SQl9NSU5NQVgoc3RydWN0IG5hbWUgKmhlYWQsIGludCB2YWwpCQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKnRtcCA9IFJCX1JPT1QoaGVhZCk7CQkJCVwKKwlzdHJ1Y3QgdHlwZSAqcGFyZW50ID0gTlVMTDsJCQkJCVwKKwl3aGlsZSAodG1wKSB7CQkJCQkJCVwKKwkJcGFyZW50ID0gdG1wOwkJCQkJCVwKKwkJaWYgKHZhbCA8IDApCQkJCQkJXAorCQkJdG1wID0gUkJfTEVGVCh0bXAsIGZpZWxkKTsJCQlcCisJCWVsc2UJCQkJCQkJXAorCQkJdG1wID0gUkJfUklHSFQodG1wLCBmaWVsZCk7CQkJXAorCX0JCQkJCQkJCVwKKwlyZXR1cm4gKHBhcmVudCk7CQkJCQkJXAorfQorCisjZGVmaW5lIFJCX05FR0lORgktMQorI2RlZmluZSBSQl9JTkYJMQorCisjZGVmaW5lIFJCX0lOU0VSVChuYW1lLCB4LCB5KQluYW1lIyNfUkJfSU5TRVJUKHgsIHkpCisjZGVmaW5lIFJCX1JFTU9WRShuYW1lLCB4LCB5KQluYW1lIyNfUkJfUkVNT1ZFKHgsIHkpCisjZGVmaW5lIFJCX0ZJTkQobmFtZSwgeCwgeSkJbmFtZSMjX1JCX0ZJTkQoeCwgeSkKKyNkZWZpbmUgUkJfTkVYVChuYW1lLCB4LCB5KQluYW1lIyNfUkJfTkVYVCh5KQorI2RlZmluZSBSQl9NSU4obmFtZSwgeCkJCW5hbWUjI19SQl9NSU5NQVgoeCwgUkJfTkVHSU5GKQorI2RlZmluZSBSQl9NQVgobmFtZSwgeCkJCW5hbWUjI19SQl9NSU5NQVgoeCwgUkJfSU5GKQorCisjZGVmaW5lIFJCX0ZPUkVBQ0goeCwgbmFtZSwgaGVhZCkJCQkJCVwKKwlmb3IgKCh4KSA9IFJCX01JTihuYW1lLCBoZWFkKTsJCQkJCVwKKwkgICAgICh4KSAhPSBOVUxMOwkJCQkJCVwKKwkgICAgICh4KSA9IG5hbWUjI19SQl9ORVhUKHgpKQorCisjZW5kaWYJLyogX1NZU19UUkVFX0hfICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3RpbWluZ3NhZmVfYmNtcC5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC90aW1pbmdzYWZlX2JjbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTI4YzBlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC90aW1pbmdzYWZlX2JjbXAuYwpAQCAtMCwwICsxLDM0IEBACisvKgkkT3BlbkJTRDogdGltaW5nc2FmZV9iY21wLmMsdiAxLjEgMjAxMC8wOS8yNCAxMzozMzowMCBtYXR0aGV3IEV4cCAkCSovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIERhbWllbiBNaWxsZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qIE9QRU5CU0QgT1JJR0lOQUw6IGxpYi9saWJjL3N0cmluZy90aW1pbmdzYWZlX2JjbXAuYyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKyNpZm5kZWYgSEFWRV9USU1JTkdTQUZFX0JDTVAKKworaW50Cit0aW1pbmdzYWZlX2JjbXAoY29uc3Qgdm9pZCAqYjEsIGNvbnN0IHZvaWQgKmIyLCBzaXplX3QgbikKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwMSA9IGIxLCAqcDIgPSBiMjsKKwlpbnQgcmV0ID0gMDsKKworCWZvciAoOyBuID4gMDsgbi0tKQorCQlyZXQgfD0gKnAxKysgXiAqcDIrKzsKKwlyZXR1cm4gKHJldCAhPSAwKTsKK30KKworI2VuZGlmIC8qIFRJTUlOR1NBRkVfQkNNUCAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC92aXMuYyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvdmlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EwODdiMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbmJzZC1jb21wYXQvdmlzLmMKQEAgLTAsMCArMSwyMjUgQEAKKy8qCSRPcGVuQlNEOiB2aXMuYyx2IDEuMTkgMjAwNS8wOS8wMSAxNzoxNTo0OSBtaWxsZXJ0IEV4cCAkICovCisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qIE9QRU5CU0QgT1JJR0lOQUw6IGxpYi9saWJjL2dlbi92aXMuYyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKyNpZiAhZGVmaW5lZChIQVZFX1NUUk5WSVMpCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAidmlzLmgiCisKKyNkZWZpbmUJaXNvY3RhbChjKQkoKCh1X2NoYXIpKGMpKSA+PSAnMCcgJiYgKCh1X2NoYXIpKGMpKSA8PSAnNycpCisjZGVmaW5lCWlzdmlzaWJsZShjKQkJCQkJCQlcCisJKCgodV9pbnQpKGMpIDw9IFVDSEFSX01BWCAmJiBpc2FzY2lpKCh1X2NoYXIpKGMpKSAmJgkJXAorCSgoKGMpICE9ICcqJyAmJiAoYykgIT0gJz8nICYmIChjKSAhPSAnWycgJiYgKGMpICE9ICcjJykgfHwJXAorCQkoZmxhZyAmIFZJU19HTE9CKSA9PSAwKSAmJiBpc2dyYXBoKCh1X2NoYXIpKGMpKSkgfHwJXAorCSgoZmxhZyAmIFZJU19TUCkgPT0gMCAmJiAoYykgPT0gJyAnKSB8fAkJCQlcCisJKChmbGFnICYgVklTX1RBQikgPT0gMCAmJiAoYykgPT0gJ1x0JykgfHwJCQlcCisJKChmbGFnICYgVklTX05MKSA9PSAwICYmIChjKSA9PSAnXG4nKSB8fAkJCVwKKwkoKGZsYWcgJiBWSVNfU0FGRSkgJiYgKChjKSA9PSAnXGInIHx8CQkJCVwKKwkJKGMpID09ICdcMDA3JyB8fCAoYykgPT0gJ1xyJyB8fAkJCQlcCisJCWlzZ3JhcGgoKHVfY2hhcikoYykpKSkpCisKKy8qCisgKiB2aXMgLSB2aXN1YWxseSBlbmNvZGUgY2hhcmFjdGVycworICovCitjaGFyICoKK3ZpcyhjaGFyICpkc3QsIGludCBjLCBpbnQgZmxhZywgaW50IG5leHRjKQoreworCWlmIChpc3Zpc2libGUoYykpIHsKKwkJKmRzdCsrID0gYzsKKwkJaWYgKGMgPT0gJ1xcJyAmJiAoZmxhZyAmIFZJU19OT1NMQVNIKSA9PSAwKQorCQkJKmRzdCsrID0gJ1xcJzsKKwkJKmRzdCA9ICdcMCc7CisJCXJldHVybiAoZHN0KTsKKwl9CisKKwlpZiAoZmxhZyAmIFZJU19DU1RZTEUpIHsKKwkJc3dpdGNoKGMpIHsKKwkJY2FzZSAnXG4nOgorCQkJKmRzdCsrID0gJ1xcJzsKKwkJCSpkc3QrKyA9ICduJzsKKwkJCWdvdG8gZG9uZTsKKwkJY2FzZSAnXHInOgorCQkJKmRzdCsrID0gJ1xcJzsKKwkJCSpkc3QrKyA9ICdyJzsKKwkJCWdvdG8gZG9uZTsKKwkJY2FzZSAnXGInOgorCQkJKmRzdCsrID0gJ1xcJzsKKwkJCSpkc3QrKyA9ICdiJzsKKwkJCWdvdG8gZG9uZTsKKwkJY2FzZSAnXGEnOgorCQkJKmRzdCsrID0gJ1xcJzsKKwkJCSpkc3QrKyA9ICdhJzsKKwkJCWdvdG8gZG9uZTsKKwkJY2FzZSAnXHYnOgorCQkJKmRzdCsrID0gJ1xcJzsKKwkJCSpkc3QrKyA9ICd2JzsKKwkJCWdvdG8gZG9uZTsKKwkJY2FzZSAnXHQnOgorCQkJKmRzdCsrID0gJ1xcJzsKKwkJCSpkc3QrKyA9ICd0JzsKKwkJCWdvdG8gZG9uZTsKKwkJY2FzZSAnXGYnOgorCQkJKmRzdCsrID0gJ1xcJzsKKwkJCSpkc3QrKyA9ICdmJzsKKwkJCWdvdG8gZG9uZTsKKwkJY2FzZSAnICc6CisJCQkqZHN0KysgPSAnXFwnOworCQkJKmRzdCsrID0gJ3MnOworCQkJZ290byBkb25lOworCQljYXNlICdcMCc6CisJCQkqZHN0KysgPSAnXFwnOworCQkJKmRzdCsrID0gJzAnOworCQkJaWYgKGlzb2N0YWwobmV4dGMpKSB7CisJCQkJKmRzdCsrID0gJzAnOworCQkJCSpkc3QrKyA9ICcwJzsKKwkJCX0KKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKwlpZiAoKChjICYgMDE3NykgPT0gJyAnKSB8fCAoZmxhZyAmIFZJU19PQ1RBTCkgfHwKKwkgICAgKChmbGFnICYgVklTX0dMT0IpICYmIChjID09ICcqJyB8fCBjID09ICc/JyB8fCBjID09ICdbJyB8fCBjID09ICcjJykpKSB7CisJCSpkc3QrKyA9ICdcXCc7CisJCSpkc3QrKyA9ICgodV9jaGFyKWMgPj4gNiAmIDA3KSArICcwJzsKKwkJKmRzdCsrID0gKCh1X2NoYXIpYyA+PiAzICYgMDcpICsgJzAnOworCQkqZHN0KysgPSAoKHVfY2hhciljICYgMDcpICsgJzAnOworCQlnb3RvIGRvbmU7CisJfQorCWlmICgoZmxhZyAmIFZJU19OT1NMQVNIKSA9PSAwKQorCQkqZHN0KysgPSAnXFwnOworCWlmIChjICYgMDIwMCkgeworCQljICY9IDAxNzc7CisJCSpkc3QrKyA9ICdNJzsKKwl9CisJaWYgKGlzY250cmwoKHVfY2hhciljKSkgeworCQkqZHN0KysgPSAnXic7CisJCWlmIChjID09IDAxNzcpCisJCQkqZHN0KysgPSAnPyc7CisJCWVsc2UKKwkJCSpkc3QrKyA9IGMgKyAnQCc7CisJfSBlbHNlIHsKKwkJKmRzdCsrID0gJy0nOworCQkqZHN0KysgPSBjOworCX0KK2RvbmU6CisJKmRzdCA9ICdcMCc7CisJcmV0dXJuIChkc3QpOworfQorCisvKgorICogc3RydmlzLCBzdHJudmlzLCBzdHJ2aXN4IC0gdmlzdWFsbHkgZW5jb2RlIGNoYXJhY3RlcnMgZnJvbSBzcmMgaW50byBkc3QKKyAqCQorICoJRHN0IG11c3QgYmUgNCB0aW1lcyB0aGUgc2l6ZSBvZiBzcmMgdG8gYWNjb3VudCBmb3IgcG9zc2libGUKKyAqCWV4cGFuc2lvbi4gIFRoZSBsZW5ndGggb2YgZHN0LCBub3QgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBOVUxMLAorICoJaXMgcmV0dXJuZWQuIAorICoKKyAqCVN0cm52aXMgd2lsbCB3cml0ZSBubyBtb3JlIHRoYW4gc2l6LTEgYnl0ZXMgKGFuZCB3aWxsIE5VTEwgdGVybWluYXRlKS4KKyAqCVRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIGZ1bGx5IGVuY29kZSB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgorICoKKyAqCVN0cnZpc3ggZW5jb2RlcyBleGFjdGx5IGxlbiBieXRlcyBmcm9tIHNyYyBpbnRvIGRzdC4KKyAqCVRoaXMgaXMgdXNlZnVsIGZvciBlbmNvZGluZyBhIGJsb2NrIG9mIGRhdGEuCisgKi8KK2ludAorc3RydmlzKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBpbnQgZmxhZykKK3sKKwljaGFyIGM7CisJY2hhciAqc3RhcnQ7CisKKwlmb3IgKHN0YXJ0ID0gZHN0OyAoYyA9ICpzcmMpOykKKwkJZHN0ID0gdmlzKGRzdCwgYywgZmxhZywgKisrc3JjKTsKKwkqZHN0ID0gJ1wwJzsKKwlyZXR1cm4gKGRzdCAtIHN0YXJ0KTsKK30KKworaW50CitzdHJudmlzKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc2l6LCBpbnQgZmxhZykKK3sKKwljaGFyICpzdGFydCwgKmVuZDsKKwljaGFyIHRidWZbNV07CisJaW50IGMsIGk7CisKKwlpID0gMDsKKwlmb3IgKHN0YXJ0ID0gZHN0LCBlbmQgPSBzdGFydCArIHNpeiAtIDE7IChjID0gKnNyYykgJiYgZHN0IDwgZW5kOyApIHsKKwkJaWYgKGlzdmlzaWJsZShjKSkgeworCQkJaSA9IDE7CisJCQkqZHN0KysgPSBjOworCQkJaWYgKGMgPT0gJ1xcJyAmJiAoZmxhZyAmIFZJU19OT1NMQVNIKSA9PSAwKSB7CisJCQkJLyogbmVlZCBzcGFjZSBmb3IgdGhlIGV4dHJhICdcXCcgKi8KKwkJCQlpZiAoZHN0IDwgZW5kKQorCQkJCQkqZHN0KysgPSAnXFwnOworCQkJCWVsc2UgeworCQkJCQlkc3QtLTsKKwkJCQkJaSA9IDI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCXNyYysrOworCQl9IGVsc2UgeworCQkJaSA9IHZpcyh0YnVmLCBjLCBmbGFnLCAqKytzcmMpIC0gdGJ1ZjsKKwkJCWlmIChkc3QgKyBpIDw9IGVuZCkgeworCQkJCW1lbWNweShkc3QsIHRidWYsIGkpOworCQkJCWRzdCArPSBpOworCQkJfSBlbHNlIHsKKwkJCQlzcmMtLTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlpZiAoc2l6ID4gMCkKKwkJKmRzdCA9ICdcMCc7CisJaWYgKGRzdCArIGkgPiBlbmQpIHsKKwkJLyogYWRqdXN0IHJldHVybiB2YWx1ZSBmb3IgdHJ1bmNhdGlvbiAqLworCQl3aGlsZSAoKGMgPSAqc3JjKSkKKwkJCWRzdCArPSB2aXModGJ1ZiwgYywgZmxhZywgKisrc3JjKSAtIHRidWY7CisJfQorCXJldHVybiAoZHN0IC0gc3RhcnQpOworfQorCitpbnQKK3N0cnZpc3goY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBsZW4sIGludCBmbGFnKQoreworCWNoYXIgYzsKKwljaGFyICpzdGFydDsKKworCWZvciAoc3RhcnQgPSBkc3Q7IGxlbiA+IDE7IGxlbi0tKSB7CisJCWMgPSAqc3JjOworCQlkc3QgPSB2aXMoZHN0LCBjLCBmbGFnLCAqKytzcmMpOworCX0KKwlpZiAobGVuKQorCQlkc3QgPSB2aXMoZHN0LCAqc3JjLCBmbGFnLCAnXDAnKTsKKwkqZHN0ID0gJ1wwJzsKKwlyZXR1cm4gKGRzdCAtIHN0YXJ0KTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3Zpcy5oIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC92aXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODk4YTllCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC92aXMuaApAQCAtMCwwICsxLDk1IEBACisvKgkkT3BlbkJTRDogdmlzLmgsdiAxLjExIDIwMDUvMDgvMDkgMTk6Mzg6MzEgbWlsbGVydCBFeHAgJAkqLworLyoJJE5ldEJTRDogdmlzLmgsdiAxLjQgMTk5NC8xMC8yNiAwMDo1Njo0MSBjZ2QgRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl2aXMuaAk1LjkgKEJlcmtlbGV5KSA0LzMvOTEKKyAqLworCisvKiBPUEVOQlNEIE9SSUdJTkFMOiBpbmNsdWRlL3Zpcy5oICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorI2lmICFkZWZpbmVkKEhBVkVfU1RSTlZJUykKKworI2lmbmRlZiBfVklTX0hfCisjZGVmaW5lCV9WSVNfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisvKgorICogdG8gc2VsZWN0IGFsdGVybmF0ZSBlbmNvZGluZyBmb3JtYXQKKyAqLworI2RlZmluZQlWSVNfT0NUQUwJMHgwMQkvKiB1c2Ugb2N0YWwgXGRkZCBmb3JtYXQgKi8KKyNkZWZpbmUJVklTX0NTVFlMRQkweDAyCS8qIHVzZSBcW25yZnQwLi5dIHdoZXJlIGFwcHJvcHJpYXRlICovCisKKy8qCisgKiB0byBhbHRlciBzZXQgb2YgY2hhcmFjdGVycyBlbmNvZGVkIChkZWZhdWx0IGlzIHRvIGVuY29kZSBhbGwKKyAqIG5vbi1ncmFwaGljIGV4Y2VwdCBzcGFjZSwgdGFiLCBhbmQgbmV3bGluZSkuCisgKi8KKyNkZWZpbmUJVklTX1NQCQkweDA0CS8qIGFsc28gZW5jb2RlIHNwYWNlICovCisjZGVmaW5lCVZJU19UQUIJCTB4MDgJLyogYWxzbyBlbmNvZGUgdGFiICovCisjZGVmaW5lCVZJU19OTAkJMHgxMAkvKiBhbHNvIGVuY29kZSBuZXdsaW5lICovCisjZGVmaW5lCVZJU19XSElURQkoVklTX1NQIHwgVklTX1RBQiB8IFZJU19OTCkKKyNkZWZpbmUJVklTX1NBRkUJMHgyMAkvKiBvbmx5IGVuY29kZSAidW5zYWZlIiBjaGFyYWN0ZXJzICovCisKKy8qCisgKiBvdGhlcgorICovCisjZGVmaW5lCVZJU19OT1NMQVNICTB4NDAJLyogaW5oaWJpdCBwcmludGluZyAnXCcgKi8KKyNkZWZpbmUJVklTX0dMT0IJMHgxMDAJLyogZW5jb2RlIGdsb2IoMykgbWFnaWNzIGFuZCAnIycgKi8KKworLyoKKyAqIHVudmlzIHJldHVybiBjb2RlcworICovCisjZGVmaW5lCVVOVklTX1ZBTElECSAxCS8qIGNoYXJhY3RlciB2YWxpZCAqLworI2RlZmluZQlVTlZJU19WQUxJRFBVU0gJIDIJLyogY2hhcmFjdGVyIHZhbGlkLCBwdXNoIGJhY2sgcGFzc2VkIGNoYXIgKi8KKyNkZWZpbmUJVU5WSVNfTk9DSEFSCSAzCS8qIHZhbGlkIHNlcXVlbmNlLCBubyBjaGFyYWN0ZXIgcHJvZHVjZWQgKi8KKyNkZWZpbmUJVU5WSVNfU1lOQkFECS0xCS8qIHVucmVjb2duaXplZCBlc2NhcGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUJVU5WSVNfRVJST1IJLTIJLyogZGVjb2RlciBpbiB1bmtub3duIHN0YXRlICh1bnJlY292ZXJhYmxlKSAqLworCisvKgorICogdW52aXMgZmxhZ3MKKyAqLworI2RlZmluZQlVTlZJU19FTkQJMQkvKiBubyBtb3JlIGNoYXJhY3RlcnMgKi8KKworY2hhcgkqdmlzKGNoYXIgKiwgaW50LCBpbnQsIGludCk7CitpbnQJc3RydmlzKGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpOworaW50CXN0cm52aXMoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCwgaW50KQorCQlfX2F0dHJpYnV0ZV9fICgoX19ib3VuZGVkX18oX19zdHJpbmdfXywxLDMpKSk7CitpbnQJc3RydmlzeChjaGFyICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBpbnQpCisJCV9fYXR0cmlidXRlX18gKChfX2JvdW5kZWRfXyhfX3N0cmluZ19fLDEsMykpKTsKK2ludAlzdHJ1bnZpcyhjaGFyICosIGNvbnN0IGNoYXIgKik7CitpbnQJdW52aXMoY2hhciAqLCBjaGFyLCBpbnQgKiwgaW50KTsKK3NzaXplX3Qgc3RybnVudmlzKGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpCisJCV9fYXR0cmlidXRlX18gKChfX2JvdW5kZWRfXyhfX3N0cmluZ19fLDEsMykpKTsKKworI2VuZGlmIC8qICFfVklTX0hfICovCisKKyNlbmRpZiAvKiAhSEFWRV9TVFJOVklTICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3hjcnlwdC5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC94Y3J5cHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjkxZTI4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC94Y3J5cHQuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBCZW4gTGluZHN0cm9tLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKworIyBpZiBkZWZpbmVkKEhBVkVfQ1JZUFRfSCkgJiYgIWRlZmluZWQoSEFWRV9TRUNVUkVXQVJFKQorIyAgaW5jbHVkZSA8Y3J5cHQuaD4KKyMgZW5kaWYKKworIyBpZmRlZiBfX2hwdXgKKyMgIGluY2x1ZGUgPGhwc2VjdXJpdHkuaD4KKyMgIGluY2x1ZGUgPHByb3QuaD4KKyMgZW5kaWYKKworIyBpZmRlZiBIQVZFX1NFQ1VSRVdBUkUKKyMgIGluY2x1ZGUgPHN5cy9zZWN1cml0eS5oPgorIyAgaW5jbHVkZSA8c3lzL2F1ZGl0Lmg+CisjICBpbmNsdWRlIDxwcm90Lmg+CisjIGVuZGlmIAorCisjIGlmIGRlZmluZWQoSEFWRV9TSEFET1dfSCkgJiYgIWRlZmluZWQoRElTQUJMRV9TSEFET1cpCisjICBpbmNsdWRlIDxzaGFkb3cuaD4KKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkKEhBVkVfR0VUUFdBTkFNKSAmJiAhZGVmaW5lZChESVNBQkxFX1NIQURPVykKKyMgIGluY2x1ZGUgPHN5cy9sYWJlbC5oPgorIyAgaW5jbHVkZSA8c3lzL2F1ZGl0Lmg+CisjICBpbmNsdWRlIDxwd2RhZGouaD4KKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkKEhBVkVfTUQ1X1BBU1NXT1JEUykgJiYgIWRlZmluZWQoSEFWRV9NRDVfQ1JZUFQpCisjICBpbmNsdWRlICJtZDVjcnlwdC5oIgorIyBlbmRpZiAKKworY2hhciAqCit4Y3J5cHQoY29uc3QgY2hhciAqcGFzc3dvcmQsIGNvbnN0IGNoYXIgKnNhbHQpCit7CisJY2hhciAqY3J5cHRlZDsKKworIyBpZmRlZiBIQVZFX01ENV9QQVNTV09SRFMKKyAgICAgICAgaWYgKGlzX21kNV9zYWx0KHNhbHQpKQorICAgICAgICAgICAgICAgIGNyeXB0ZWQgPSBtZDVfY3J5cHQocGFzc3dvcmQsIHNhbHQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY3J5cHRlZCA9IGNyeXB0KHBhc3N3b3JkLCBzYWx0KTsKKyMgZWxpZiBkZWZpbmVkKF9faHB1eCkgJiYgIWRlZmluZWQoSEFWRV9TRUNVUkVXQVJFKQorCWlmIChpc2NvbXNlYygpKQorICAgICAgICAgICAgICAgIGNyeXB0ZWQgPSBiaWdjcnlwdChwYXNzd29yZCwgc2FsdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjcnlwdGVkID0gY3J5cHQocGFzc3dvcmQsIHNhbHQpOworIyBlbGlmIGRlZmluZWQoSEFWRV9TRUNVUkVXQVJFKQorICAgICAgICBjcnlwdGVkID0gYmlnY3J5cHQocGFzc3dvcmQsIHNhbHQpOworIyBlbHNlCisgICAgICAgIGNyeXB0ZWQgPSBjcnlwdChwYXNzd29yZCwgc2FsdCk7CisjIGVuZGlmIAorCisJcmV0dXJuIGNyeXB0ZWQ7Cit9CisKKy8qCisgKiBIYW5kbGUgc2hhZG93ZWQgcGFzc3dvcmQgc3lzdGVtcyBpbiBhIGNsZWFuZXIgd2F5IGZvciBwb3J0YWJsZQorICogdmVyc2lvbi4KKyAqLworCitjaGFyICoKK3NoYWRvd19wdyhzdHJ1Y3QgcGFzc3dkICpwdykKK3sKKwljaGFyICpwd19wYXNzd29yZCA9IHB3LT5wd19wYXNzd2Q7CisKKyMgaWYgZGVmaW5lZChIQVZFX1NIQURPV19IKSAmJiAhZGVmaW5lZChESVNBQkxFX1NIQURPVykKKwlzdHJ1Y3Qgc3B3ZCAqc3B3ID0gZ2V0c3BuYW0ocHctPnB3X25hbWUpOworCisJaWYgKHNwdyAhPSBOVUxMKQorCQlwd19wYXNzd29yZCA9IHNwdy0+c3BfcHdkcDsKKyMgZW5kaWYKKworI2lmZGVmIFVTRV9MSUJJQUYKKwlyZXR1cm4oZ2V0X2lhZl9wYXNzd29yZChwdykpOworI2VuZGlmCisKKyMgaWYgZGVmaW5lZChIQVZFX0dFVFBXQU5BTSkgJiYgIWRlZmluZWQoRElTQUJMRV9TSEFET1cpCisJc3RydWN0IHBhc3N3ZF9hZGp1bmN0ICpzcHc7CisJaWYgKGlzc2VjdXJlKCkgJiYgKHNwdyA9IGdldHB3YW5hbShwdy0+cHdfbmFtZSkpICE9IE5VTEwpCisJCXB3X3Bhc3N3b3JkID0gc3B3LT5wd2FfcGFzc3dkOworIyBlbGlmIGRlZmluZWQoSEFWRV9TRUNVUkVXQVJFKQorCXN0cnVjdCBwcl9wYXNzd2QgKnNwdyA9IGdldHBycHduYW0ocHctPnB3X25hbWUpOworCisJaWYgKHNwdyAhPSBOVUxMKQorCQlwd19wYXNzd29yZCA9IHNwdy0+dWZsZC5mZF9lbmNyeXB0OworIyBlbmRpZgorCisJcmV0dXJuIHB3X3Bhc3N3b3JkOworfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC94bW1hcC5jIGIvb3BlbnNzaC02LjBwMS9vcGVuYnNkLWNvbXBhdC94bW1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YzZiYWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL29wZW5ic2QtY29tcGF0L3htbWFwLmMKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaW0gUmljZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBNQVBfRkFJTEVEIGNvZGUgYnkgU29sYXIgRGVzaWduZXIuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKiAkSWQ6IHhtbWFwLmMsdiAxLjE1IDIwMDkvMDIvMTYgMDQ6MjE6NDAgZGptIEV4cCAkICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9TWVNfTU1BTl9ICisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpZmRlZiBIQVZFX0ZDTlRMX0gKKyMgaW5jbHVkZSA8ZmNudGwuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJsb2cuaCIKKwordm9pZCAqCit4bW1hcChzaXplX3Qgc2l6ZSkKK3sKKyNpZmRlZiBIQVZFX01NQVAKKwl2b2lkICphZGRyZXNzOworCisjIGlmZGVmIE1BUF9BTk9OCisJYWRkcmVzcyA9IG1tYXAoTlVMTCwgc2l6ZSwgUFJPVF9XUklURXxQUk9UX1JFQUQsIE1BUF9BTk9OfE1BUF9TSEFSRUQsCisJICAgIC0xLCAob2ZmX3QpMCk7CisjIGVsc2UKKwlhZGRyZXNzID0gbW1hcChOVUxMLCBzaXplLCBQUk9UX1dSSVRFfFBST1RfUkVBRCwgTUFQX1NIQVJFRCwKKwkgICAgb3BlbigiL2Rldi96ZXJvIiwgT19SRFdSKSwgKG9mZl90KTApOworIyBlbmRpZgorCisjZGVmaW5lIE1NX1NXQVBfVEVNUExBVEUgIi92YXIvcnVuL3NzaGQubW0uWFhYWFhYWFgiCisJaWYgKGFkZHJlc3MgPT0gKHZvaWQgKilNQVBfRkFJTEVEKSB7CisJCWNoYXIgdG1wbmFtZVtzaXplb2YoTU1fU1dBUF9URU1QTEFURSldID0gTU1fU1dBUF9URU1QTEFURTsKKwkJaW50IHRtcGZkOworCQltb2RlX3Qgb2xkX3VtYXNrOworCisJCW9sZF91bWFzayA9IHVtYXNrKDAxNzcpOworCQl0bXBmZCA9IG1rc3RlbXAodG1wbmFtZSk7CisJCXVtYXNrKG9sZF91bWFzayk7CisJCWlmICh0bXBmZCA9PSAtMSkKKwkJCWZhdGFsKCJta3N0ZW1wKFwiJXNcIik6ICVzIiwKKwkJCSAgICBNTV9TV0FQX1RFTVBMQVRFLCBzdHJlcnJvcihlcnJubykpOworCQl1bmxpbmsodG1wbmFtZSk7CisJCWlmIChmdHJ1bmNhdGUodG1wZmQsIHNpemUpICE9IDApCisJCQlmYXRhbCgiJXM6IGZ0cnVuY2F0ZTogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJYWRkcmVzcyA9IG1tYXAoTlVMTCwgc2l6ZSwgUFJPVF9XUklURXxQUk9UX1JFQUQsIE1BUF9TSEFSRUQsCisJCSAgICB0bXBmZCwgKG9mZl90KTApOworCQljbG9zZSh0bXBmZCk7CisJfQorCisJcmV0dXJuIChhZGRyZXNzKTsKKyNlbHNlCisJZmF0YWwoIiVzOiBVc2VQcml2aWxlZ2VTZXBhcmF0aW9uPXllcyBhbmQgQ29tcHJlc3Npb249eWVzIG5vdCBzdXBwb3J0ZWQiLAorCSAgICBfX2Z1bmNfXyk7CisjZW5kaWYgLyogSEFWRV9NTUFQICovCisKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9vcGVuc3NoLnhtbC5pbiBiL29wZW5zc2gtNi4wcDEvb3BlbnNzaC54bWwuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFmZTFkMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvb3BlbnNzaC54bWwuaW4KQEAgLTAsMCArMSw5MCBAQAorPD94bWwgdmVyc2lvbj0nMS4wJz8+Cis8IURPQ1RZUEUgc2VydmljZV9idW5kbGUgU1lTVEVNICcvdXNyL3NoYXJlL2xpYi94bWwvZHRkL3NlcnZpY2VfYnVuZGxlLmR0ZC4xJz4KKzwhLS0KKyAgICBDb3B5cmlnaHQgKGMpIDIwMDYgQ2hhZCBNeW5oaWVyLgorCisgICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgICAgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICAgIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisKKyAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAgICBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgICAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAgICBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgICAgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgICAgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAgICBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorLS0+CisKKzxzZXJ2aWNlX2J1bmRsZSB0eXBlPSdtYW5pZmVzdCcgbmFtZT0nT3BlblNTSCBzZXJ2ZXInPgorCisgICAgPHNlcnZpY2UKKyAgICAgICAgbmFtZT0nc2l0ZS9fX1NZU1ZJTklUX05BTUVfXycKKyAgICAgICAgdHlwZT0nc2VydmljZScKKyAgICAgICAgdmVyc2lvbj0nMSc+CisKKzwhLS0KKwlXZSBkZWZhdWx0IHRvIGRpc2FibGVkIHNvIGFkbWluaXN0cmF0b3IgY2FuIGRlY2lkZSB0byBlbmFibGUgb3Igbm90LgorLS0+CisgICAgICAgIDxjcmVhdGVfZGVmYXVsdF9pbnN0YW5jZSBlbmFibGVkPSdmYWxzZScvPgorCisgICAgICAgIDxzaW5nbGVfaW5zdGFuY2UvPgorCisgICAgICAgIDxkZXBlbmRlbmN5CisgICAgICAgICAgICBuYW1lPSdmaWxlc3lzdGVtLWxvY2FsJworICAgICAgICAgICAgZ3JvdXBpbmc9J3JlcXVpcmVfYWxsJworICAgICAgICAgICAgcmVzdGFydF9vbj0nbm9uZScKKyAgICAgICAgICAgIHR5cGU9J3NlcnZpY2UnPgorICAgICAgICAgICAgPHNlcnZpY2VfZm1yaSB2YWx1ZT0nc3ZjOi9zeXN0ZW0vZmlsZXN5c3RlbS9sb2NhbCcvPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3kKKyAgICAgICAgICAgIG5hbWU9J25ldHdvcmsnCisgICAgICAgICAgICBncm91cGluZz0ncmVxdWlyZV9hbGwnCisgICAgICAgICAgICByZXN0YXJ0X29uPSdub25lJworICAgICAgICAgICAgdHlwZT0nc2VydmljZSc+CisgICAgICAgICAgICA8c2VydmljZV9mbXJpIHZhbHVlPSdzdmM6L21pbGVzdG9uZS9uZXR3b3JrJy8+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW50CisgICAgICAgICAgICBuYW1lPSdtdWx0aS11c2VyLXNlcnZlcicKKyAgICAgICAgICAgIHJlc3RhcnRfb249J25vbmUnCisgICAgICAgICAgICBncm91cGluZz0nb3B0aW9uYWxfYWxsJz4KKyAgICAgICAgICAgIDxzZXJ2aWNlX2ZtcmkgdmFsdWU9J3N2YzovbWlsZXN0b25lL211bHRpLXVzZXItc2VydmVyJy8+CisgICAgICAgIDwvZGVwZW5kZW50PgorCisgICAgICAgIDxleGVjX21ldGhvZAorICAgICAgICAgICAgbmFtZT0nc3RhcnQnCisgICAgICAgICAgICB0eXBlPSdtZXRob2QnCisgICAgICAgICAgICBleGVjPSdfX1NNRl9NRVRIT0RfRElSX18vX19TWVNWSU5JVF9OQU1FX18gc3RhcnQnCisgICAgICAgICAgICB0aW1lb3V0X3NlY29uZHM9JzYwJz4KKyAgICAgICAgICAgIDxtZXRob2RfY29udGV4dC8+CisgICAgICAgIDwvZXhlY19tZXRob2Q+CisKKyAgICAgICAgPGV4ZWNfbWV0aG9kCisgICAgICAgICAgICBuYW1lPSdzdG9wJworICAgICAgICAgICAgdHlwZT0nbWV0aG9kJworICAgICAgICAgICAgZXhlYz0nOmtpbGwnCisgICAgICAgICAgICB0aW1lb3V0X3NlY29uZHM9JzYwJz4KKyAgICAgICAgICAgIDxtZXRob2RfY29udGV4dC8+CisgICAgICAgIDwvZXhlY19tZXRob2Q+CisKKyAgICAgICAgPHByb3BlcnR5X2dyb3VwCisgICAgICAgICAgICBuYW1lPSdzdGFydGQnCisgICAgICAgICAgICB0eXBlPSdmcmFtZXdvcmsnPgorICAgICAgICAgICAgPHByb3B2YWwgbmFtZT0naWdub3JlX2Vycm9yJyB0eXBlPSdhc3RyaW5nJyB2YWx1ZT0nY29yZSxzaWduYWwnLz4KKyAgICAgICAgPC9wcm9wZXJ0eV9ncm91cD4KKworICAgICAgICA8dGVtcGxhdGU+CisgICAgICAgICAgICA8Y29tbW9uX25hbWU+CisgICAgICAgICAgICAgICAgPGxvY3RleHQgeG1sOmxhbmc9J0MnPk9wZW5TU0ggc2VydmVyPC9sb2N0ZXh0PgorICAgICAgICAgICAgPC9jb21tb25fbmFtZT4KKyAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgIDxtYW5wYWdlCisgICAgICAgICAgICAgICAgICAgIHRpdGxlPSdzc2hkJworICAgICAgICAgICAgICAgICAgICBzZWN0aW9uPScxTScKKyAgICAgICAgICAgICAgICAgICAgbWFucGF0aD0nQHByZWZpeEAvbWFuJy8+CisgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgIDwvdGVtcGxhdGU+CisgICAgPC9zZXJ2aWNlPgorPC9zZXJ2aWNlX2J1bmRsZT4KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvb3BlbnNzaGQuaW5pdC5pbiBiL29wZW5zc2gtNi4wcDEvb3BlbnNzaGQuaW5pdC5pbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZGI2MGNhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9vcGVuc3NoZC5pbml0LmluCkBAIC0wLDAgKzEsODggQEAKKyMhQFNUQVJUVVBfU0NSSVBUX1NIRUxMQAorIyBEb25hdGVkIGNvZGUgdGhhdCB3YXMgcHV0IHVuZGVyIFBEIGxpY2Vuc2UuCisjCisjIFN0cmlwcGVkIFBSTkdkIG91dCBvZiBpdCBmb3IgdGhlIHRpbWUgYmVpbmcuCisKK3VtYXNrIDAyMgorCitDQVQ9QENBVEAKK0tJTEw9QEtJTExACisKK3ByZWZpeD1AcHJlZml4QAorc3lzY29uZmRpcj1Ac3lzY29uZmRpckAKK3BpZGRpcj1AcGlkZGlyQAorCitTU0hEPSRwcmVmaXgvc2Jpbi9zc2hkCitQSURGSUxFPSRwaWRkaXIvc3NoZC5waWQKK1BpZEZpbGU9YGdyZXAgIl5QaWRGaWxlIiAke3N5c2NvbmZkaXJ9L3NzaGRfY29uZmlnIHwgdHIgIj0iICIgIiB8IGF3ayAne3ByaW50ICQyfSdgCitbIFgkUGlkRmlsZSA9IFggXSAgfHwgIFBJREZJTEU9JFBpZEZpbGUKK1NTSF9LRVlHRU49JHByZWZpeC9iaW4vc3NoLWtleWdlbgorSE9TVF9LRVlfUlNBMT0kc3lzY29uZmRpci9zc2hfaG9zdF9rZXkKK0hPU1RfS0VZX0RTQT0kc3lzY29uZmRpci9zc2hfaG9zdF9kc2Ffa2V5CitIT1NUX0tFWV9SU0E9JHN5c2NvbmZkaXIvc3NoX2hvc3RfcnNhX2tleQorQENPTU1FTlRfT1VUX0VDQ0BIT1NUX0tFWV9FQ0RTQT0kc3lzY29uZmRpci9zc2hfaG9zdF9lY2RzYV9rZXkKKworCitjaGVja2tleXMoKSB7CisgICAgaWYgWyAhIC1mICRIT1NUX0tFWV9SU0ExIF07IHRoZW4KKwkke1NTSF9LRVlHRU59IC10IHJzYTEgLWYgJHtIT1NUX0tFWV9SU0ExfSAtTiAiIgorICAgIGZpCisgICAgaWYgWyAhIC1mICRIT1NUX0tFWV9EU0EgXTsgdGhlbgorCSR7U1NIX0tFWUdFTn0gLXQgZHNhIC1mICR7SE9TVF9LRVlfRFNBfSAtTiAiIgorICAgIGZpCisgICAgaWYgWyAhIC1mICRIT1NUX0tFWV9SU0EgXTsgdGhlbgorCSR7U1NIX0tFWUdFTn0gLXQgcnNhIC1mICR7SE9TVF9LRVlfUlNBfSAtTiAiIgorICAgIGZpCitAQ09NTUVOVF9PVVRfRUNDQCAgICBpZiBbICEgLWYgJEhPU1RfS0VZX0VDRFNBIF07IHRoZW4KK0BDT01NRU5UX09VVF9FQ0NACSR7U1NIX0tFWUdFTn0gLXQgZWNkc2EgLWYgJHtIT1NUX0tFWV9FQ0RTQX0gLU4gIiIKK0BDT01NRU5UX09VVF9FQ0NAICAgIGZpCit9CisKK3N0b3Bfc2VydmljZSgpIHsKKyAgICBpZiBbICAtciAkUElERklMRSAgLWEgICEgLXogJHtQSURGSUxFfSAgXTsgdGhlbgorCVBJRD1gJHtDQVR9ICR7UElERklMRX1gCisgICAgZmkKKyAgICBpZiBbICAke1BJRDo9MH0gLWd0IDEgLWEgICEgIlgkUElEIiA9ICJYICIgIF07IHRoZW4KKwkke0tJTEx9ICR7UElEfQorICAgIGVsc2UKKwllY2hvICJVbmFibGUgdG8gcmVhZCBQSUQgZmlsZSIKKyAgICBmaQorfQorCitzdGFydF9zZXJ2aWNlKCkgeworICAgICMgWFhYIFdlIHJlYWxseSBzaG91bGQgY2hlY2sgaWYgdGhlIHNlcnZpY2UgaXMgYWxyZWFkeSBnb2luZywgYnV0CisgICAgIyBYWFggd2Ugd2lsbCBvcHQgb3V0IGF0IHRoaXMgdGltZS4gLSBCYWwKKworICAgICMgQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUga2V5cyB0aGF0IG5lZWQgdG8gYmUgbWFkZQorICAgIGNoZWNra2V5cworCisgICAgIyBTdGFydCBTU0hECisgICAgZWNobyAic3RhcnRpbmcgJFNTSEQuLi4gXGMiICAgICAgICAgOyAkU1NIRAorCisgICAgc3NoZF9yYz0kPworICAgIGlmIFsgJHNzaGRfcmMgLW5lIDAgXTsgdGhlbgorCWVjaG8gIiQwOiBFcnJvciAke3NzaGRfcmN9IHN0YXJ0aW5nICR7U1NIRH0uLi4gYmFpbGluZy4iCisJZXhpdCAkc3NoZF9yYworICAgIGZpCisgICAgZWNobyBkb25lLgorfQorCitjYXNlICQxIGluCisKKydzdGFydCcpCisgICAgc3RhcnRfc2VydmljZQorICAgIDs7CisKKydzdG9wJykKKyAgICBzdG9wX3NlcnZpY2UKKyAgICA7OworCisncmVzdGFydCcpCisgICAgc3RvcF9zZXJ2aWNlCisgICAgc3RhcnRfc2VydmljZQorICAgIDs7CisKKyopCisgICAgZWNobyAiJDA6ICB1c2FnZTogICQwIHtzdGFydHxzdG9wfHJlc3RhcnR9IgorICAgIDs7Citlc2FjCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3BhY2tldC5jIGIvb3BlbnNzaC02LjBwMS9wYWNrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGM2NmZlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9wYWNrZXQuYwpAQCAtMCwwICsxLDE5NjYgQEAKKy8qICRPcGVuQlNEOiBwYWNrZXQuYyx2IDEuMTc2IDIwMTIvMDEvMjUgMTk6NDA6MDkgbWFya3VzIEV4cCAkICovCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgaW1wbGVtZW50aW5nIHRoZSBwYWNrZXQgcHJvdG9jb2wgYW5kIGNvbW11bmljYXRpb24KKyAqIHdpdGggdGhlIG90aGVyIHNpZGUuICBUaGlzIHNhbWUgY29kZSBpcyB1c2VkIGJvdGggb24gY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZS4KKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICoKKyAqCisgKiBTU0gyIHBhY2tldCBmb3JtYXQgYWRkZWQgYnkgTWFya3VzIEZyaWVkbC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisgCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvc3lzLXF1ZXVlLmgiCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorIyBpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgInBhY2tldC5oIgorI2luY2x1ZGUgImNyYzMyLmgiCisjaW5jbHVkZSAiY29tcHJlc3MuaCIKKyNpbmNsdWRlICJkZWF0dGFjay5oIgorI2luY2x1ZGUgImNoYW5uZWxzLmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisjaW5jbHVkZSAic3NoMS5oIgorI2luY2x1ZGUgInNzaDIuaCIKKyNpbmNsdWRlICJjaXBoZXIuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJrZXguaCIKKyNpbmNsdWRlICJtYWMuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJjYW5vaG9zdC5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJzc2guaCIKKyNpbmNsdWRlICJyb2FtaW5nLmgiCisKKyNpZmRlZiBQQUNLRVRfREVCVUcKKyNkZWZpbmUgREJHKHgpIHgKKyNlbHNlCisjZGVmaW5lIERCRyh4KQorI2VuZGlmCisKKyNkZWZpbmUgUEFDS0VUX01BWF9TSVpFICgyNTYgKiAxMDI0KQorCitzdHJ1Y3QgcGFja2V0X3N0YXRlIHsKKwl1X2ludDMyX3Qgc2VxbnI7CisJdV9pbnQzMl90IHBhY2tldHM7CisJdV9pbnQ2NF90IGJsb2NrczsKKwl1X2ludDY0X3QgYnl0ZXM7Cit9OworCitzdHJ1Y3QgcGFja2V0IHsKKwlUQUlMUV9FTlRSWShwYWNrZXQpIG5leHQ7CisJdV9jaGFyIHR5cGU7CisJQnVmZmVyIHBheWxvYWQ7Cit9OworCitzdHJ1Y3Qgc2Vzc2lvbl9zdGF0ZSB7CisJLyoKKwkgKiBUaGlzIHZhcmlhYmxlIGNvbnRhaW5zIHRoZSBmaWxlIGRlc2NyaXB0b3JzIHVzZWQgZm9yCisJICogY29tbXVuaWNhdGluZyB3aXRoIHRoZSBvdGhlciBzaWRlLiAgY29ubmVjdGlvbl9pbiBpcyB1c2VkIGZvcgorCSAqIHJlYWRpbmc7IGNvbm5lY3Rpb25fb3V0IGZvciB3cml0aW5nLiAgVGhlc2UgY2FuIGJlIHRoZSBzYW1lCisJICogZGVzY3JpcHRvciwgaW4gd2hpY2ggY2FzZSBpdCBpcyBhc3N1bWVkIHRvIGJlIGEgc29ja2V0LgorCSAqLworCWludCBjb25uZWN0aW9uX2luOworCWludCBjb25uZWN0aW9uX291dDsKKworCS8qIFByb3RvY29sIGZsYWdzIGZvciB0aGUgcmVtb3RlIHNpZGUuICovCisJdV9pbnQgcmVtb3RlX3Byb3RvY29sX2ZsYWdzOworCisJLyogRW5jcnlwdGlvbiBjb250ZXh0IGZvciByZWNlaXZpbmcgZGF0YS4gIE9ubHkgdXNlZCBmb3IgZGVjcnlwdGlvbi4gKi8KKwlDaXBoZXJDb250ZXh0IHJlY2VpdmVfY29udGV4dDsKKworCS8qIEVuY3J5cHRpb24gY29udGV4dCBmb3Igc2VuZGluZyBkYXRhLiAgT25seSB1c2VkIGZvciBlbmNyeXB0aW9uLiAqLworCUNpcGhlckNvbnRleHQgc2VuZF9jb250ZXh0OworCisJLyogQnVmZmVyIGZvciByYXcgaW5wdXQgZGF0YSBmcm9tIHRoZSBzb2NrZXQuICovCisJQnVmZmVyIGlucHV0OworCisJLyogQnVmZmVyIGZvciByYXcgb3V0cHV0IGRhdGEgZ29pbmcgdG8gdGhlIHNvY2tldC4gKi8KKwlCdWZmZXIgb3V0cHV0OworCisJLyogQnVmZmVyIGZvciB0aGUgcGFydGlhbCBvdXRnb2luZyBwYWNrZXQgYmVpbmcgY29uc3RydWN0ZWQuICovCisJQnVmZmVyIG91dGdvaW5nX3BhY2tldDsKKworCS8qIEJ1ZmZlciBmb3IgdGhlIGluY29taW5nIHBhY2tldCBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiAqLworCUJ1ZmZlciBpbmNvbWluZ19wYWNrZXQ7CisKKwkvKiBTY3JhdGNoIGJ1ZmZlciBmb3IgcGFja2V0IGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24uICovCisJQnVmZmVyIGNvbXByZXNzaW9uX2J1ZmZlcjsKKwlpbnQgY29tcHJlc3Npb25fYnVmZmVyX3JlYWR5OworCisJLyoKKwkgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciBwYWNrZXQgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBpcworCSAqIGVuYWJsZWQuCisJICovCisJaW50IHBhY2tldF9jb21wcmVzc2lvbjsKKworCS8qIGRlZmF1bHQgbWF4aW11bSBwYWNrZXQgc2l6ZSAqLworCXVfaW50IG1heF9wYWNrZXRfc2l6ZTsKKworCS8qIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgbW9kdWxlIGhhcyBiZWVuIGluaXRpYWxpemVkLiAqLworCWludCBpbml0aWFsaXplZDsKKworCS8qIFNldCB0byB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIGlzIGludGVyYWN0aXZlLiAqLworCWludCBpbnRlcmFjdGl2ZV9tb2RlOworCisJLyogU2V0IHRvIHRydWUgaWYgd2UgYXJlIHRoZSBzZXJ2ZXIgc2lkZS4gKi8KKwlpbnQgc2VydmVyX3NpZGU7CisKKwkvKiBTZXQgdG8gdHJ1ZSBpZiB3ZSBhcmUgYXV0aGVudGljYXRlZC4gKi8KKwlpbnQgYWZ0ZXJfYXV0aGVudGljYXRpb247CisKKwlpbnQga2VlcF9hbGl2ZV90aW1lb3V0czsKKworCS8qIFRoZSBtYXhpbXVtIHRpbWUgdGhhdCB3ZSB3aWxsIHdhaXQgdG8gc2VuZCBvciByZWNlaXZlIGEgcGFja2V0ICovCisJaW50IHBhY2tldF90aW1lb3V0X21zOworCisJLyogU2Vzc2lvbiBrZXkgaW5mb3JtYXRpb24gZm9yIEVuY3J5cHRpb24gYW5kIE1BQyAqLworCU5ld2tleXMgKm5ld2tleXNbTU9ERV9NQVhdOworCXN0cnVjdCBwYWNrZXRfc3RhdGUgcF9yZWFkLCBwX3NlbmQ7CisKKwl1X2ludDY0X3QgbWF4X2Jsb2Nrc19pbiwgbWF4X2Jsb2Nrc19vdXQ7CisJdV9pbnQzMl90IHJla2V5X2xpbWl0OworCisJLyogU2Vzc2lvbiBrZXkgZm9yIHByb3RvY29sIHYxICovCisJdV9jaGFyIHNzaDFfa2V5W1NTSF9TRVNTSU9OX0tFWV9MRU5HVEhdOworCXVfaW50IHNzaDFfa2V5bGVuOworCisJLyogcm91bmR1cCBjdXJyZW50IG1lc3NhZ2UgdG8gZXh0cmFfcGFkIGJ5dGVzICovCisJdV9jaGFyIGV4dHJhX3BhZDsKKworCS8qIFhYWCBkaXNjYXJkIGluY29taW5nIGRhdGEgYWZ0ZXIgTUFDIGVycm9yICovCisJdV9pbnQgcGFja2V0X2Rpc2NhcmQ7CisJTWFjICpwYWNrZXRfZGlzY2FyZF9tYWM7CisKKwkvKiBVc2VkIGluIHBhY2tldF9yZWFkX3BvbGwyKCkgKi8KKwl1X2ludCBwYWNrbGVuOworCisJLyogVXNlZCBpbiBwYWNrZXRfc2VuZDIgKi8KKwlpbnQgcmVrZXlpbmc7CisKKwkvKiBVc2VkIGluIHBhY2tldF9zZXRfaW50ZXJhY3RpdmUgKi8KKwlpbnQgc2V0X2ludGVyYWN0aXZlX2NhbGxlZDsKKworCS8qIFVzZWQgaW4gcGFja2V0X3NldF9tYXhzaXplICovCisJaW50IHNldF9tYXhzaXplX2NhbGxlZDsKKworCVRBSUxRX0hFQUQoLCBwYWNrZXQpIG91dGdvaW5nOworfTsKKworc3RhdGljIHN0cnVjdCBzZXNzaW9uX3N0YXRlICphY3RpdmVfc3RhdGUsICpiYWNrdXBfc3RhdGU7CisKK3N0YXRpYyBzdHJ1Y3Qgc2Vzc2lvbl9zdGF0ZSAqCithbGxvY19zZXNzaW9uX3N0YXRlKHZvaWQpCit7CisJc3RydWN0IHNlc3Npb25fc3RhdGUgKnMgPSB4Y2FsbG9jKDEsIHNpemVvZigqcykpOworCisJcy0+Y29ubmVjdGlvbl9pbiA9IC0xOworCXMtPmNvbm5lY3Rpb25fb3V0ID0gLTE7CisJcy0+bWF4X3BhY2tldF9zaXplID0gMzI3Njg7CisJcy0+cGFja2V0X3RpbWVvdXRfbXMgPSAtMTsKKwlyZXR1cm4gczsKK30KKworLyoKKyAqIFNldHMgdGhlIGRlc2NyaXB0b3JzIHVzZWQgZm9yIGNvbW11bmljYXRpb24uICBEaXNhYmxlcyBlbmNyeXB0aW9uIHVudGlsCisgKiBwYWNrZXRfc2V0X2VuY3J5cHRpb25fa2V5IGlzIGNhbGxlZC4KKyAqLwordm9pZAorcGFja2V0X3NldF9jb25uZWN0aW9uKGludCBmZF9pbiwgaW50IGZkX291dCkKK3sKKwlDaXBoZXIgKm5vbmUgPSBjaXBoZXJfYnlfbmFtZSgibm9uZSIpOworCisJaWYgKG5vbmUgPT0gTlVMTCkKKwkJZmF0YWwoInBhY2tldF9zZXRfY29ubmVjdGlvbjogY2Fubm90IGxvYWQgY2lwaGVyICdub25lJyIpOworCWlmIChhY3RpdmVfc3RhdGUgPT0gTlVMTCkKKwkJYWN0aXZlX3N0YXRlID0gYWxsb2Nfc2Vzc2lvbl9zdGF0ZSgpOworCWFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9pbiA9IGZkX2luOworCWFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9vdXQgPSBmZF9vdXQ7CisJY2lwaGVyX2luaXQoJmFjdGl2ZV9zdGF0ZS0+c2VuZF9jb250ZXh0LCBub25lLCAoY29uc3QgdV9jaGFyICopIiIsCisJICAgIDAsIE5VTEwsIDAsIENJUEhFUl9FTkNSWVBUKTsKKwljaXBoZXJfaW5pdCgmYWN0aXZlX3N0YXRlLT5yZWNlaXZlX2NvbnRleHQsIG5vbmUsIChjb25zdCB1X2NoYXIgKikiIiwKKwkgICAgMCwgTlVMTCwgMCwgQ0lQSEVSX0RFQ1JZUFQpOworCWFjdGl2ZV9zdGF0ZS0+bmV3a2V5c1tNT0RFX0lOXSA9IGFjdGl2ZV9zdGF0ZS0+bmV3a2V5c1tNT0RFX09VVF0gPSBOVUxMOworCWlmICghYWN0aXZlX3N0YXRlLT5pbml0aWFsaXplZCkgeworCQlhY3RpdmVfc3RhdGUtPmluaXRpYWxpemVkID0gMTsKKwkJYnVmZmVyX2luaXQoJmFjdGl2ZV9zdGF0ZS0+aW5wdXQpOworCQlidWZmZXJfaW5pdCgmYWN0aXZlX3N0YXRlLT5vdXRwdXQpOworCQlidWZmZXJfaW5pdCgmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQpOworCQlidWZmZXJfaW5pdCgmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQpOworCQlUQUlMUV9JTklUKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nKTsKKwkJYWN0aXZlX3N0YXRlLT5wX3NlbmQucGFja2V0cyA9IGFjdGl2ZV9zdGF0ZS0+cF9yZWFkLnBhY2tldHMgPSAwOworCX0KK30KKwordm9pZAorcGFja2V0X3NldF90aW1lb3V0KGludCB0aW1lb3V0LCBpbnQgY291bnQpCit7CisJaWYgKHRpbWVvdXQgPD0gMCB8fCBjb3VudCA8PSAwKSB7CisJCWFjdGl2ZV9zdGF0ZS0+cGFja2V0X3RpbWVvdXRfbXMgPSAtMTsKKwkJcmV0dXJuOworCX0KKwlpZiAoKElOVF9NQVggLyAxMDAwKSAvIGNvdW50IDwgdGltZW91dCkKKwkJYWN0aXZlX3N0YXRlLT5wYWNrZXRfdGltZW91dF9tcyA9IElOVF9NQVg7CisJZWxzZQorCQlhY3RpdmVfc3RhdGUtPnBhY2tldF90aW1lb3V0X21zID0gdGltZW91dCAqIGNvdW50ICogMTAwMDsKK30KKworc3RhdGljIHZvaWQKK3BhY2tldF9zdG9wX2Rpc2NhcmQodm9pZCkKK3sKKwlpZiAoYWN0aXZlX3N0YXRlLT5wYWNrZXRfZGlzY2FyZF9tYWMpIHsKKwkJY2hhciBidWZbMTAyNF07CisJCQorCQltZW1zZXQoYnVmLCAnYScsIHNpemVvZihidWYpKTsKKwkJd2hpbGUgKGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0KSA8CisJCSAgICBQQUNLRVRfTUFYX1NJWkUpCisJCQlidWZmZXJfYXBwZW5kKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCwgYnVmLAorCQkJICAgIHNpemVvZihidWYpKTsKKwkJKHZvaWQpIG1hY19jb21wdXRlKGFjdGl2ZV9zdGF0ZS0+cGFja2V0X2Rpc2NhcmRfbWFjLAorCQkgICAgYWN0aXZlX3N0YXRlLT5wX3JlYWQuc2VxbnIsCisJCSAgICBidWZmZXJfcHRyKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCksCisJCSAgICBQQUNLRVRfTUFYX1NJWkUpOworCX0KKwlsb2dpdCgiRmluaXNoZWQgZGlzY2FyZGluZyBmb3IgJS4yMDBzIiwgZ2V0X3JlbW90ZV9pcGFkZHIoKSk7CisJY2xlYW51cF9leGl0KDI1NSk7Cit9CisKK3N0YXRpYyB2b2lkCitwYWNrZXRfc3RhcnRfZGlzY2FyZChFbmMgKmVuYywgTWFjICptYWMsIHVfaW50IHBhY2tldF9sZW5ndGgsIHVfaW50IGRpc2NhcmQpCit7CisJaWYgKGVuYyA9PSBOVUxMIHx8ICFjaXBoZXJfaXNfY2JjKGVuYy0+Y2lwaGVyKSkKKwkJcGFja2V0X2Rpc2Nvbm5lY3QoIlBhY2tldCBjb3JydXB0Iik7CisJaWYgKHBhY2tldF9sZW5ndGggIT0gUEFDS0VUX01BWF9TSVpFICYmIG1hYyAmJiBtYWMtPmVuYWJsZWQpCisJCWFjdGl2ZV9zdGF0ZS0+cGFja2V0X2Rpc2NhcmRfbWFjID0gbWFjOworCWlmIChidWZmZXJfbGVuKCZhY3RpdmVfc3RhdGUtPmlucHV0KSA+PSBkaXNjYXJkKQorCQlwYWNrZXRfc3RvcF9kaXNjYXJkKCk7CisJYWN0aXZlX3N0YXRlLT5wYWNrZXRfZGlzY2FyZCA9IGRpc2NhcmQgLQorCSAgICBidWZmZXJfbGVuKCZhY3RpdmVfc3RhdGUtPmlucHV0KTsKK30KKworLyogUmV0dXJucyAxIGlmIHJlbW90ZSBob3N0IGlzIGNvbm5lY3RlZCB2aWEgc29ja2V0LCAwIGlmIG5vdC4gKi8KKworaW50CitwYWNrZXRfY29ubmVjdGlvbl9pc19vbl9zb2NrZXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBmcm9tLCB0bzsKKwlzb2NrbGVuX3QgZnJvbWxlbiwgdG9sZW47CisKKwkvKiBmaWxlZGVzY3JpcHRvcnMgaW4gYW5kIG91dCBhcmUgdGhlIHNhbWUsIHNvIGl0J3MgYSBzb2NrZXQgKi8KKwlpZiAoYWN0aXZlX3N0YXRlLT5jb25uZWN0aW9uX2luID09IGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9vdXQpCisJCXJldHVybiAxOworCWZyb21sZW4gPSBzaXplb2YoZnJvbSk7CisJbWVtc2V0KCZmcm9tLCAwLCBzaXplb2YoZnJvbSkpOworCWlmIChnZXRwZWVybmFtZShhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25faW4sIChzdHJ1Y3Qgc29ja2FkZHIgKikmZnJvbSwKKwkgICAgJmZyb21sZW4pIDwgMCkKKwkJcmV0dXJuIDA7CisJdG9sZW4gPSBzaXplb2YodG8pOworCW1lbXNldCgmdG8sIDAsIHNpemVvZih0bykpOworCWlmIChnZXRwZWVybmFtZShhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25fb3V0LCAoc3RydWN0IHNvY2thZGRyICopJnRvLAorCSAgICAmdG9sZW4pIDwgMCkKKwkJcmV0dXJuIDA7CisJaWYgKGZyb21sZW4gIT0gdG9sZW4gfHwgbWVtY21wKCZmcm9tLCAmdG8sIGZyb21sZW4pICE9IDApCisJCXJldHVybiAwOworCWlmIChmcm9tLnNzX2ZhbWlseSAhPSBBRl9JTkVUICYmIGZyb20uc3NfZmFtaWx5ICE9IEFGX0lORVQ2KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEV4cG9ydHMgYW4gSVYgZnJvbSB0aGUgQ2lwaGVyQ29udGV4dCByZXF1aXJlZCB0byBleHBvcnQgdGhlIGtleQorICogc3RhdGUgYmFjayBmcm9tIHRoZSB1bnByaXZpbGVnZWQgY2hpbGQgdG8gdGhlIHByaXZpbGVnZWQgcGFyZW50CisgKiBwcm9jZXNzLgorICovCisKK3ZvaWQKK3BhY2tldF9nZXRfa2V5aXYoaW50IG1vZGUsIHVfY2hhciAqaXYsIHVfaW50IGxlbikKK3sKKwlDaXBoZXJDb250ZXh0ICpjYzsKKworCWlmIChtb2RlID09IE1PREVfT1VUKQorCQljYyA9ICZhY3RpdmVfc3RhdGUtPnNlbmRfY29udGV4dDsKKwllbHNlCisJCWNjID0gJmFjdGl2ZV9zdGF0ZS0+cmVjZWl2ZV9jb250ZXh0OworCisJY2lwaGVyX2dldF9rZXlpdihjYywgaXYsIGxlbik7Cit9CisKK2ludAorcGFja2V0X2dldF9rZXljb250ZXh0KGludCBtb2RlLCB1X2NoYXIgKmRhdCkKK3sKKwlDaXBoZXJDb250ZXh0ICpjYzsKKworCWlmIChtb2RlID09IE1PREVfT1VUKQorCQljYyA9ICZhY3RpdmVfc3RhdGUtPnNlbmRfY29udGV4dDsKKwllbHNlCisJCWNjID0gJmFjdGl2ZV9zdGF0ZS0+cmVjZWl2ZV9jb250ZXh0OworCisJcmV0dXJuIChjaXBoZXJfZ2V0X2tleWNvbnRleHQoY2MsIGRhdCkpOworfQorCit2b2lkCitwYWNrZXRfc2V0X2tleWNvbnRleHQoaW50IG1vZGUsIHVfY2hhciAqZGF0KQoreworCUNpcGhlckNvbnRleHQgKmNjOworCisJaWYgKG1vZGUgPT0gTU9ERV9PVVQpCisJCWNjID0gJmFjdGl2ZV9zdGF0ZS0+c2VuZF9jb250ZXh0OworCWVsc2UKKwkJY2MgPSAmYWN0aXZlX3N0YXRlLT5yZWNlaXZlX2NvbnRleHQ7CisKKwljaXBoZXJfc2V0X2tleWNvbnRleHQoY2MsIGRhdCk7Cit9CisKK2ludAorcGFja2V0X2dldF9rZXlpdl9sZW4oaW50IG1vZGUpCit7CisJQ2lwaGVyQ29udGV4dCAqY2M7CisKKwlpZiAobW9kZSA9PSBNT0RFX09VVCkKKwkJY2MgPSAmYWN0aXZlX3N0YXRlLT5zZW5kX2NvbnRleHQ7CisJZWxzZQorCQljYyA9ICZhY3RpdmVfc3RhdGUtPnJlY2VpdmVfY29udGV4dDsKKworCXJldHVybiAoY2lwaGVyX2dldF9rZXlpdl9sZW4oY2MpKTsKK30KKwordm9pZAorcGFja2V0X3NldF9pdihpbnQgbW9kZSwgdV9jaGFyICpkYXQpCit7CisJQ2lwaGVyQ29udGV4dCAqY2M7CisKKwlpZiAobW9kZSA9PSBNT0RFX09VVCkKKwkJY2MgPSAmYWN0aXZlX3N0YXRlLT5zZW5kX2NvbnRleHQ7CisJZWxzZQorCQljYyA9ICZhY3RpdmVfc3RhdGUtPnJlY2VpdmVfY29udGV4dDsKKworCWNpcGhlcl9zZXRfa2V5aXYoY2MsIGRhdCk7Cit9CisKK2ludAorcGFja2V0X2dldF9zc2gxX2NpcGhlcih2b2lkKQoreworCXJldHVybiAoY2lwaGVyX2dldF9udW1iZXIoYWN0aXZlX3N0YXRlLT5yZWNlaXZlX2NvbnRleHQuY2lwaGVyKSk7Cit9CisKK3ZvaWQKK3BhY2tldF9nZXRfc3RhdGUoaW50IG1vZGUsIHVfaW50MzJfdCAqc2VxbnIsIHVfaW50NjRfdCAqYmxvY2tzLAorICAgIHVfaW50MzJfdCAqcGFja2V0cywgdV9pbnQ2NF90ICpieXRlcykKK3sKKwlzdHJ1Y3QgcGFja2V0X3N0YXRlICpzdGF0ZTsKKworCXN0YXRlID0gKG1vZGUgPT0gTU9ERV9JTikgPworCSAgICAmYWN0aXZlX3N0YXRlLT5wX3JlYWQgOiAmYWN0aXZlX3N0YXRlLT5wX3NlbmQ7CisJaWYgKHNlcW5yKQorCQkqc2VxbnIgPSBzdGF0ZS0+c2VxbnI7CisJaWYgKGJsb2NrcykKKwkJKmJsb2NrcyA9IHN0YXRlLT5ibG9ja3M7CisJaWYgKHBhY2tldHMpCisJCSpwYWNrZXRzID0gc3RhdGUtPnBhY2tldHM7CisJaWYgKGJ5dGVzKQorCQkqYnl0ZXMgPSBzdGF0ZS0+Ynl0ZXM7Cit9CisKK3ZvaWQKK3BhY2tldF9zZXRfc3RhdGUoaW50IG1vZGUsIHVfaW50MzJfdCBzZXFuciwgdV9pbnQ2NF90IGJsb2NrcywgdV9pbnQzMl90IHBhY2tldHMsCisgICAgdV9pbnQ2NF90IGJ5dGVzKQoreworCXN0cnVjdCBwYWNrZXRfc3RhdGUgKnN0YXRlOworCisJc3RhdGUgPSAobW9kZSA9PSBNT0RFX0lOKSA/CisJICAgICZhY3RpdmVfc3RhdGUtPnBfcmVhZCA6ICZhY3RpdmVfc3RhdGUtPnBfc2VuZDsKKwlzdGF0ZS0+c2VxbnIgPSBzZXFucjsKKwlzdGF0ZS0+YmxvY2tzID0gYmxvY2tzOworCXN0YXRlLT5wYWNrZXRzID0gcGFja2V0czsKKwlzdGF0ZS0+Ynl0ZXMgPSBieXRlczsKK30KKworc3RhdGljIGludAorcGFja2V0X2Nvbm5lY3Rpb25fYWYodm9pZCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSB0bzsKKwlzb2NrbGVuX3QgdG9sZW4gPSBzaXplb2YodG8pOworCisJbWVtc2V0KCZ0bywgMCwgc2l6ZW9mKHRvKSk7CisJaWYgKGdldHNvY2tuYW1lKGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9vdXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmdG8sCisJICAgICZ0b2xlbikgPCAwKQorCQlyZXR1cm4gMDsKKyNpZmRlZiBJUFY0X0lOX0lQVjYKKwlpZiAodG8uc3NfZmFtaWx5ID09IEFGX0lORVQ2ICYmCisJICAgIElONl9JU19BRERSX1Y0TUFQUEVEKCYoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmdG8pLT5zaW42X2FkZHIpKQorCQlyZXR1cm4gQUZfSU5FVDsKKyNlbmRpZgorCXJldHVybiB0by5zc19mYW1pbHk7Cit9CisKKy8qIFNldHMgdGhlIGNvbm5lY3Rpb24gaW50byBub24tYmxvY2tpbmcgbW9kZS4gKi8KKwordm9pZAorcGFja2V0X3NldF9ub25ibG9ja2luZyh2b2lkKQoreworCS8qIFNldCB0aGUgc29ja2V0IGludG8gbm9uLWJsb2NraW5nIG1vZGUuICovCisJc2V0X25vbmJsb2NrKGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9pbik7CisKKwlpZiAoYWN0aXZlX3N0YXRlLT5jb25uZWN0aW9uX291dCAhPSBhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25faW4pCisJCXNldF9ub25ibG9jayhhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25fb3V0KTsKK30KKworLyogUmV0dXJucyB0aGUgc29ja2V0IHVzZWQgZm9yIHJlYWRpbmcuICovCisKK2ludAorcGFja2V0X2dldF9jb25uZWN0aW9uX2luKHZvaWQpCit7CisJcmV0dXJuIGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9pbjsKK30KKworLyogUmV0dXJucyB0aGUgZGVzY3JpcHRvciB1c2VkIGZvciB3cml0aW5nLiAqLworCitpbnQKK3BhY2tldF9nZXRfY29ubmVjdGlvbl9vdXQodm9pZCkKK3sKKwlyZXR1cm4gYWN0aXZlX3N0YXRlLT5jb25uZWN0aW9uX291dDsKK30KKworLyogQ2xvc2VzIHRoZSBjb25uZWN0aW9uIGFuZCBjbGVhcnMgYW5kIGZyZWVzIGludGVybmFsIGRhdGEgc3RydWN0dXJlcy4gKi8KKwordm9pZAorcGFja2V0X2Nsb3NlKHZvaWQpCit7CisJaWYgKCFhY3RpdmVfc3RhdGUtPmluaXRpYWxpemVkKQorCQlyZXR1cm47CisJYWN0aXZlX3N0YXRlLT5pbml0aWFsaXplZCA9IDA7CisJaWYgKGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9pbiA9PSBhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25fb3V0KSB7CisJCXNodXRkb3duKGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9vdXQsIFNIVVRfUkRXUik7CisJCWNsb3NlKGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9vdXQpOworCX0gZWxzZSB7CisJCWNsb3NlKGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9pbik7CisJCWNsb3NlKGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9vdXQpOworCX0KKwlidWZmZXJfZnJlZSgmYWN0aXZlX3N0YXRlLT5pbnB1dCk7CisJYnVmZmVyX2ZyZWUoJmFjdGl2ZV9zdGF0ZS0+b3V0cHV0KTsKKwlidWZmZXJfZnJlZSgmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQpOworCWJ1ZmZlcl9mcmVlKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCk7CisJaWYgKGFjdGl2ZV9zdGF0ZS0+Y29tcHJlc3Npb25fYnVmZmVyX3JlYWR5KSB7CisJCWJ1ZmZlcl9mcmVlKCZhY3RpdmVfc3RhdGUtPmNvbXByZXNzaW9uX2J1ZmZlcik7CisJCWJ1ZmZlcl9jb21wcmVzc191bmluaXQoKTsKKwl9CisJY2lwaGVyX2NsZWFudXAoJmFjdGl2ZV9zdGF0ZS0+c2VuZF9jb250ZXh0KTsKKwljaXBoZXJfY2xlYW51cCgmYWN0aXZlX3N0YXRlLT5yZWNlaXZlX2NvbnRleHQpOworfQorCisvKiBTZXRzIHJlbW90ZSBzaWRlIHByb3RvY29sIGZsYWdzLiAqLworCit2b2lkCitwYWNrZXRfc2V0X3Byb3RvY29sX2ZsYWdzKHVfaW50IHByb3RvY29sX2ZsYWdzKQoreworCWFjdGl2ZV9zdGF0ZS0+cmVtb3RlX3Byb3RvY29sX2ZsYWdzID0gcHJvdG9jb2xfZmxhZ3M7Cit9CisKKy8qIFJldHVybnMgdGhlIHJlbW90ZSBwcm90b2NvbCBmbGFncyBzZXQgZWFybGllciBieSB0aGUgYWJvdmUgZnVuY3Rpb24uICovCisKK3VfaW50CitwYWNrZXRfZ2V0X3Byb3RvY29sX2ZsYWdzKHZvaWQpCit7CisJcmV0dXJuIGFjdGl2ZV9zdGF0ZS0+cmVtb3RlX3Byb3RvY29sX2ZsYWdzOworfQorCisvKgorICogU3RhcnRzIHBhY2tldCBjb21wcmVzc2lvbiBmcm9tIHRoZSBuZXh0IHBhY2tldCBvbiBpbiBib3RoIGRpcmVjdGlvbnMuCisgKiBMZXZlbCBpcyBjb21wcmVzc2lvbiBsZXZlbCAxIChmYXN0ZXN0KSAtIDkgKHNsb3csIGJlc3QpIGFzIGluIGd6aXAuCisgKi8KKworc3RhdGljIHZvaWQKK3BhY2tldF9pbml0X2NvbXByZXNzaW9uKHZvaWQpCit7CisJaWYgKGFjdGl2ZV9zdGF0ZS0+Y29tcHJlc3Npb25fYnVmZmVyX3JlYWR5ID09IDEpCisJCXJldHVybjsKKwlhY3RpdmVfc3RhdGUtPmNvbXByZXNzaW9uX2J1ZmZlcl9yZWFkeSA9IDE7CisJYnVmZmVyX2luaXQoJmFjdGl2ZV9zdGF0ZS0+Y29tcHJlc3Npb25fYnVmZmVyKTsKK30KKwordm9pZAorcGFja2V0X3N0YXJ0X2NvbXByZXNzaW9uKGludCBsZXZlbCkKK3sKKwlpZiAoYWN0aXZlX3N0YXRlLT5wYWNrZXRfY29tcHJlc3Npb24gJiYgIWNvbXBhdDIwKQorCQlmYXRhbCgiQ29tcHJlc3Npb24gYWxyZWFkeSBlbmFibGVkLiIpOworCWFjdGl2ZV9zdGF0ZS0+cGFja2V0X2NvbXByZXNzaW9uID0gMTsKKwlwYWNrZXRfaW5pdF9jb21wcmVzc2lvbigpOworCWJ1ZmZlcl9jb21wcmVzc19pbml0X3NlbmQobGV2ZWwpOworCWJ1ZmZlcl9jb21wcmVzc19pbml0X3JlY3YoKTsKK30KKworLyoKKyAqIENhdXNlcyBhbnkgZnVydGhlciBwYWNrZXRzIHRvIGJlIGVuY3J5cHRlZCB1c2luZyB0aGUgZ2l2ZW4ga2V5LiAgVGhlIHNhbWUKKyAqIGtleSBpcyB1c2VkIGZvciBib3RoIHNlbmRpbmcgYW5kIHJlY2VwdGlvbi4gIEhvd2V2ZXIsIGJvdGggZGlyZWN0aW9ucyBhcmUKKyAqIGVuY3J5cHRlZCBpbmRlcGVuZGVudGx5IG9mIGVhY2ggb3RoZXIuCisgKi8KKwordm9pZAorcGFja2V0X3NldF9lbmNyeXB0aW9uX2tleShjb25zdCB1X2NoYXIgKmtleSwgdV9pbnQga2V5bGVuLCBpbnQgbnVtYmVyKQoreworCUNpcGhlciAqY2lwaGVyID0gY2lwaGVyX2J5X251bWJlcihudW1iZXIpOworCisJaWYgKGNpcGhlciA9PSBOVUxMKQorCQlmYXRhbCgicGFja2V0X3NldF9lbmNyeXB0aW9uX2tleTogdW5rbm93biBjaXBoZXIgbnVtYmVyICVkIiwgbnVtYmVyKTsKKwlpZiAoa2V5bGVuIDwgMjApCisJCWZhdGFsKCJwYWNrZXRfc2V0X2VuY3J5cHRpb25fa2V5OiBrZXlsZW4gdG9vIHNtYWxsOiAlZCIsIGtleWxlbik7CisJaWYgKGtleWxlbiA+IFNTSF9TRVNTSU9OX0tFWV9MRU5HVEgpCisJCWZhdGFsKCJwYWNrZXRfc2V0X2VuY3J5cHRpb25fa2V5OiBrZXlsZW4gdG9vIGJpZzogJWQiLCBrZXlsZW4pOworCW1lbWNweShhY3RpdmVfc3RhdGUtPnNzaDFfa2V5LCBrZXksIGtleWxlbik7CisJYWN0aXZlX3N0YXRlLT5zc2gxX2tleWxlbiA9IGtleWxlbjsKKwljaXBoZXJfaW5pdCgmYWN0aXZlX3N0YXRlLT5zZW5kX2NvbnRleHQsIGNpcGhlciwga2V5LCBrZXlsZW4sIE5VTEwsCisJICAgIDAsIENJUEhFUl9FTkNSWVBUKTsKKwljaXBoZXJfaW5pdCgmYWN0aXZlX3N0YXRlLT5yZWNlaXZlX2NvbnRleHQsIGNpcGhlciwga2V5LCBrZXlsZW4sIE5VTEwsCisJICAgIDAsIENJUEhFUl9ERUNSWVBUKTsKK30KKwordV9pbnQKK3BhY2tldF9nZXRfZW5jcnlwdGlvbl9rZXkodV9jaGFyICprZXkpCit7CisJaWYgKGtleSA9PSBOVUxMKQorCQlyZXR1cm4gKGFjdGl2ZV9zdGF0ZS0+c3NoMV9rZXlsZW4pOworCW1lbWNweShrZXksIGFjdGl2ZV9zdGF0ZS0+c3NoMV9rZXksIGFjdGl2ZV9zdGF0ZS0+c3NoMV9rZXlsZW4pOworCXJldHVybiAoYWN0aXZlX3N0YXRlLT5zc2gxX2tleWxlbik7Cit9CisKKy8qIFN0YXJ0IGNvbnN0cnVjdGluZyBhIHBhY2tldCB0byBzZW5kLiAqLwordm9pZAorcGFja2V0X3N0YXJ0KHVfY2hhciB0eXBlKQoreworCXVfY2hhciBidWZbOV07CisJaW50IGxlbjsKKworCURCRyhkZWJ1ZygicGFja2V0X3N0YXJ0WyVkXSIsIHR5cGUpKTsKKwlsZW4gPSBjb21wYXQyMCA/IDYgOiA5OworCW1lbXNldChidWYsIDAsIGxlbiAtIDEpOworCWJ1ZltsZW4gLSAxXSA9IHR5cGU7CisJYnVmZmVyX2NsZWFyKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCk7CisJYnVmZmVyX2FwcGVuZCgmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQsIGJ1ZiwgbGVuKTsKK30KKworLyogQXBwZW5kIHBheWxvYWQuICovCit2b2lkCitwYWNrZXRfcHV0X2NoYXIoaW50IHZhbHVlKQoreworCWNoYXIgY2ggPSB2YWx1ZTsKKworCWJ1ZmZlcl9hcHBlbmQoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0LCAmY2gsIDEpOworfQorCit2b2lkCitwYWNrZXRfcHV0X2ludCh1X2ludCB2YWx1ZSkKK3sKKwlidWZmZXJfcHV0X2ludCgmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQsIHZhbHVlKTsKK30KKwordm9pZAorcGFja2V0X3B1dF9pbnQ2NCh1X2ludDY0X3QgdmFsdWUpCit7CisJYnVmZmVyX3B1dF9pbnQ2NCgmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQsIHZhbHVlKTsKK30KKwordm9pZAorcGFja2V0X3B1dF9zdHJpbmcoY29uc3Qgdm9pZCAqYnVmLCB1X2ludCBsZW4pCit7CisJYnVmZmVyX3B1dF9zdHJpbmcoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0LCBidWYsIGxlbik7Cit9CisKK3ZvaWQKK3BhY2tldF9wdXRfY3N0cmluZyhjb25zdCBjaGFyICpzdHIpCit7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCwgc3RyKTsKK30KKwordm9pZAorcGFja2V0X3B1dF9yYXcoY29uc3Qgdm9pZCAqYnVmLCB1X2ludCBsZW4pCit7CisJYnVmZmVyX2FwcGVuZCgmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQsIGJ1ZiwgbGVuKTsKK30KKwordm9pZAorcGFja2V0X3B1dF9iaWdudW0oQklHTlVNICogdmFsdWUpCit7CisJYnVmZmVyX3B1dF9iaWdudW0oJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0LCB2YWx1ZSk7Cit9CisKK3ZvaWQKK3BhY2tldF9wdXRfYmlnbnVtMihCSUdOVU0gKiB2YWx1ZSkKK3sKKwlidWZmZXJfcHV0X2JpZ251bTIoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0LCB2YWx1ZSk7Cit9CisKKyNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKK3ZvaWQKK3BhY2tldF9wdXRfZWNwb2ludChjb25zdCBFQ19HUk9VUCAqY3VydmUsIGNvbnN0IEVDX1BPSU5UICpwb2ludCkKK3sKKwlidWZmZXJfcHV0X2VjcG9pbnQoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0LCBjdXJ2ZSwgcG9pbnQpOworfQorI2VuZGlmCisKKy8qCisgKiBGaW5hbGl6ZXMgYW5kIHNlbmRzIHRoZSBwYWNrZXQuICBJZiB0aGUgZW5jcnlwdGlvbiBrZXkgaGFzIGJlZW4gc2V0LAorICogZW5jcnlwdHMgdGhlIHBhY2tldCBiZWZvcmUgc2VuZGluZy4KKyAqLworCitzdGF0aWMgdm9pZAorcGFja2V0X3NlbmQxKHZvaWQpCit7CisJdV9jaGFyIGJ1Zls4XSwgKmNwOworCWludCBpLCBwYWRkaW5nLCBsZW47CisJdV9pbnQgY2hlY2tzdW07CisJdV9pbnQzMl90IHJuZCA9IDA7CisKKwkvKgorCSAqIElmIHVzaW5nIHBhY2tldCBjb21wcmVzc2lvbiwgY29tcHJlc3MgdGhlIHBheWxvYWQgb2YgdGhlIG91dGdvaW5nCisJICogcGFja2V0LgorCSAqLworCWlmIChhY3RpdmVfc3RhdGUtPnBhY2tldF9jb21wcmVzc2lvbikgeworCQlidWZmZXJfY2xlYXIoJmFjdGl2ZV9zdGF0ZS0+Y29tcHJlc3Npb25fYnVmZmVyKTsKKwkJLyogU2tpcCBwYWRkaW5nLiAqLworCQlidWZmZXJfY29uc3VtZSgmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQsIDgpOworCQkvKiBwYWRkaW5nICovCisJCWJ1ZmZlcl9hcHBlbmQoJmFjdGl2ZV9zdGF0ZS0+Y29tcHJlc3Npb25fYnVmZmVyLAorCQkgICAgIlwwXDBcMFwwXDBcMFwwXDAiLCA4KTsKKwkJYnVmZmVyX2NvbXByZXNzKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCwKKwkJICAgICZhY3RpdmVfc3RhdGUtPmNvbXByZXNzaW9uX2J1ZmZlcik7CisJCWJ1ZmZlcl9jbGVhcigmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQpOworCQlidWZmZXJfYXBwZW5kKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCwKKwkJICAgIGJ1ZmZlcl9wdHIoJmFjdGl2ZV9zdGF0ZS0+Y29tcHJlc3Npb25fYnVmZmVyKSwKKwkJICAgIGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+Y29tcHJlc3Npb25fYnVmZmVyKSk7CisJfQorCS8qIENvbXB1dGUgcGFja2V0IGxlbmd0aCB3aXRob3V0IHBhZGRpbmcgKGFkZCBjaGVja3N1bSwgcmVtb3ZlIHBhZGRpbmcpLiAqLworCWxlbiA9IGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0KSArIDQgLSA4OworCisJLyogSW5zZXJ0IHBhZGRpbmcuIEluaXRpYWxpemVkIHRvIHplcm8gaW4gcGFja2V0X3N0YXJ0MSgpICovCisJcGFkZGluZyA9IDggLSBsZW4gJSA4OworCWlmICghYWN0aXZlX3N0YXRlLT5zZW5kX2NvbnRleHQucGxhaW50ZXh0KSB7CisJCWNwID0gYnVmZmVyX3B0cigmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQpOworCQlmb3IgKGkgPSAwOyBpIDwgcGFkZGluZzsgaSsrKSB7CisJCQlpZiAoaSAlIDQgPT0gMCkKKwkJCQlybmQgPSBhcmM0cmFuZG9tKCk7CisJCQljcFs3IC0gaV0gPSBybmQgJiAweGZmOworCQkJcm5kID4+PSA4OworCQl9CisJfQorCWJ1ZmZlcl9jb25zdW1lKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCwgOCAtIHBhZGRpbmcpOworCisJLyogQWRkIGNoZWNrIGJ5dGVzLiAqLworCWNoZWNrc3VtID0gc3NoX2NyYzMyKGJ1ZmZlcl9wdHIoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0KSwKKwkgICAgYnVmZmVyX2xlbigmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQpKTsKKwlwdXRfdTMyKGJ1ZiwgY2hlY2tzdW0pOworCWJ1ZmZlcl9hcHBlbmQoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0LCBidWYsIDQpOworCisjaWZkZWYgUEFDS0VUX0RFQlVHCisJZnByaW50ZihzdGRlcnIsICJwYWNrZXRfc2VuZCBwbGFpbjogIik7CisJYnVmZmVyX2R1bXAoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0KTsKKyNlbmRpZgorCisJLyogQXBwZW5kIHRvIG91dHB1dC4gKi8KKwlwdXRfdTMyKGJ1ZiwgbGVuKTsKKwlidWZmZXJfYXBwZW5kKCZhY3RpdmVfc3RhdGUtPm91dHB1dCwgYnVmLCA0KTsKKwljcCA9IGJ1ZmZlcl9hcHBlbmRfc3BhY2UoJmFjdGl2ZV9zdGF0ZS0+b3V0cHV0LAorCSAgICBidWZmZXJfbGVuKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCkpOworCWNpcGhlcl9jcnlwdCgmYWN0aXZlX3N0YXRlLT5zZW5kX2NvbnRleHQsIGNwLAorCSAgICBidWZmZXJfcHRyKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCksCisJICAgIGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0KSk7CisKKyNpZmRlZiBQQUNLRVRfREVCVUcKKwlmcHJpbnRmKHN0ZGVyciwgImVuY3J5cHRlZDogIik7CisJYnVmZmVyX2R1bXAoJmFjdGl2ZV9zdGF0ZS0+b3V0cHV0KTsKKyNlbmRpZgorCWFjdGl2ZV9zdGF0ZS0+cF9zZW5kLnBhY2tldHMrKzsKKwlhY3RpdmVfc3RhdGUtPnBfc2VuZC5ieXRlcyArPSBsZW4gKworCSAgICBidWZmZXJfbGVuKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCk7CisJYnVmZmVyX2NsZWFyKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCk7CisKKwkvKgorCSAqIE5vdGUgdGhhdCB0aGUgcGFja2V0IGlzIG5vdyBvbmx5IGJ1ZmZlcmVkIGluIG91dHB1dC4gIEl0IHdvbid0IGJlCisJICogYWN0dWFsbHkgc2VudCB1bnRpbCBwYWNrZXRfd3JpdGVfd2FpdCBvciBwYWNrZXRfd3JpdGVfcG9sbCBpcworCSAqIGNhbGxlZC4KKwkgKi8KK30KKwordm9pZAorc2V0X25ld2tleXMoaW50IG1vZGUpCit7CisJRW5jICplbmM7CisJTWFjICptYWM7CisJQ29tcCAqY29tcDsKKwlDaXBoZXJDb250ZXh0ICpjYzsKKwl1X2ludDY0X3QgKm1heF9ibG9ja3M7CisJaW50IGNyeXB0X3R5cGU7CisKKwlkZWJ1ZzIoInNldF9uZXdrZXlzOiBtb2RlICVkIiwgbW9kZSk7CisKKwlpZiAobW9kZSA9PSBNT0RFX09VVCkgeworCQljYyA9ICZhY3RpdmVfc3RhdGUtPnNlbmRfY29udGV4dDsKKwkJY3J5cHRfdHlwZSA9IENJUEhFUl9FTkNSWVBUOworCQlhY3RpdmVfc3RhdGUtPnBfc2VuZC5wYWNrZXRzID0gYWN0aXZlX3N0YXRlLT5wX3NlbmQuYmxvY2tzID0gMDsKKwkJbWF4X2Jsb2NrcyA9ICZhY3RpdmVfc3RhdGUtPm1heF9ibG9ja3Nfb3V0OworCX0gZWxzZSB7CisJCWNjID0gJmFjdGl2ZV9zdGF0ZS0+cmVjZWl2ZV9jb250ZXh0OworCQljcnlwdF90eXBlID0gQ0lQSEVSX0RFQ1JZUFQ7CisJCWFjdGl2ZV9zdGF0ZS0+cF9yZWFkLnBhY2tldHMgPSBhY3RpdmVfc3RhdGUtPnBfcmVhZC5ibG9ja3MgPSAwOworCQltYXhfYmxvY2tzID0gJmFjdGl2ZV9zdGF0ZS0+bWF4X2Jsb2Nrc19pbjsKKwl9CisJaWYgKGFjdGl2ZV9zdGF0ZS0+bmV3a2V5c1ttb2RlXSAhPSBOVUxMKSB7CisJCWRlYnVnKCJzZXRfbmV3a2V5czogcmVrZXlpbmciKTsKKwkJY2lwaGVyX2NsZWFudXAoY2MpOworCQllbmMgID0gJmFjdGl2ZV9zdGF0ZS0+bmV3a2V5c1ttb2RlXS0+ZW5jOworCQltYWMgID0gJmFjdGl2ZV9zdGF0ZS0+bmV3a2V5c1ttb2RlXS0+bWFjOworCQljb21wID0gJmFjdGl2ZV9zdGF0ZS0+bmV3a2V5c1ttb2RlXS0+Y29tcDsKKwkJbWFjX2NsZWFyKG1hYyk7CisJCXhmcmVlKGVuYy0+bmFtZSk7CisJCXhmcmVlKGVuYy0+aXYpOworCQl4ZnJlZShlbmMtPmtleSk7CisJCXhmcmVlKG1hYy0+bmFtZSk7CisJCXhmcmVlKG1hYy0+a2V5KTsKKwkJeGZyZWUoY29tcC0+bmFtZSk7CisJCXhmcmVlKGFjdGl2ZV9zdGF0ZS0+bmV3a2V5c1ttb2RlXSk7CisJfQorCWFjdGl2ZV9zdGF0ZS0+bmV3a2V5c1ttb2RlXSA9IGtleF9nZXRfbmV3a2V5cyhtb2RlKTsKKwlpZiAoYWN0aXZlX3N0YXRlLT5uZXdrZXlzW21vZGVdID09IE5VTEwpCisJCWZhdGFsKCJuZXdrZXlzOiBubyBrZXlzIGZvciBtb2RlICVkIiwgbW9kZSk7CisJZW5jICA9ICZhY3RpdmVfc3RhdGUtPm5ld2tleXNbbW9kZV0tPmVuYzsKKwltYWMgID0gJmFjdGl2ZV9zdGF0ZS0+bmV3a2V5c1ttb2RlXS0+bWFjOworCWNvbXAgPSAmYWN0aXZlX3N0YXRlLT5uZXdrZXlzW21vZGVdLT5jb21wOworCWlmIChtYWNfaW5pdChtYWMpID09IDApCisJCW1hYy0+ZW5hYmxlZCA9IDE7CisJREJHKGRlYnVnKCJjaXBoZXJfaW5pdF9jb250ZXh0OiAlZCIsIG1vZGUpKTsKKwljaXBoZXJfaW5pdChjYywgZW5jLT5jaXBoZXIsIGVuYy0+a2V5LCBlbmMtPmtleV9sZW4sCisJICAgIGVuYy0+aXYsIGVuYy0+YmxvY2tfc2l6ZSwgY3J5cHRfdHlwZSk7CisJLyogRGVsZXRpbmcgdGhlIGtleXMgZG9lcyBub3QgZ2FpbiBleHRyYSBzZWN1cml0eSAqLworCS8qIG1lbXNldChlbmMtPml2LCAgMCwgZW5jLT5ibG9ja19zaXplKTsKKwkgICBtZW1zZXQoZW5jLT5rZXksIDAsIGVuYy0+a2V5X2xlbik7CisJICAgbWVtc2V0KG1hYy0+a2V5LCAwLCBtYWMtPmtleV9sZW4pOyAqLworCWlmICgoY29tcC0+dHlwZSA9PSBDT01QX1pMSUIgfHwKKwkgICAgKGNvbXAtPnR5cGUgPT0gQ09NUF9ERUxBWUVEICYmCisJICAgICBhY3RpdmVfc3RhdGUtPmFmdGVyX2F1dGhlbnRpY2F0aW9uKSkgJiYgY29tcC0+ZW5hYmxlZCA9PSAwKSB7CisJCXBhY2tldF9pbml0X2NvbXByZXNzaW9uKCk7CisJCWlmIChtb2RlID09IE1PREVfT1VUKQorCQkJYnVmZmVyX2NvbXByZXNzX2luaXRfc2VuZCg2KTsKKwkJZWxzZQorCQkJYnVmZmVyX2NvbXByZXNzX2luaXRfcmVjdigpOworCQljb21wLT5lbmFibGVkID0gMTsKKwl9CisJLyoKKwkgKiBUaGUgMl4oYmxvY2tzaXplKjIpIGxpbWl0IGlzIHRvbyBleHBlbnNpdmUgZm9yIDNERVMsCisJICogYmxvd2Zpc2gsIGV0Yywgc28gZW5mb3JjZSBhIDFHQiBsaW1pdCBmb3Igc21hbGwgYmxvY2tzaXplcy4KKwkgKi8KKwlpZiAoZW5jLT5ibG9ja19zaXplID49IDE2KQorCQkqbWF4X2Jsb2NrcyA9ICh1X2ludDY0X3QpMSA8PCAoZW5jLT5ibG9ja19zaXplKjIpOworCWVsc2UKKwkJKm1heF9ibG9ja3MgPSAoKHVfaW50NjRfdCkxIDw8IDMwKSAvIGVuYy0+YmxvY2tfc2l6ZTsKKwlpZiAoYWN0aXZlX3N0YXRlLT5yZWtleV9saW1pdCkKKwkJKm1heF9ibG9ja3MgPSBNSU4oKm1heF9ibG9ja3MsCisJCSAgICBhY3RpdmVfc3RhdGUtPnJla2V5X2xpbWl0IC8gZW5jLT5ibG9ja19zaXplKTsKK30KKworLyoKKyAqIERlbGF5ZWQgY29tcHJlc3Npb24gZm9yIFNTSDIgaXMgZW5hYmxlZCBhZnRlciBhdXRoZW50aWNhdGlvbjoKKyAqIFRoaXMgaGFwcGVucyBvbiB0aGUgc2VydmVyIHNpZGUgYWZ0ZXIgYSBTU0gyX01TR19VU0VSQVVUSF9TVUNDRVNTIGlzIHNlbnQsCisgKiBhbmQgb24gdGhlIGNsaWVudCBzaWRlIGFmdGVyIGEgU1NIMl9NU0dfVVNFUkFVVEhfU1VDQ0VTUyBpcyByZWNlaXZlZC4KKyAqLworc3RhdGljIHZvaWQKK3BhY2tldF9lbmFibGVfZGVsYXllZF9jb21wcmVzcyh2b2lkKQoreworCUNvbXAgKmNvbXAgPSBOVUxMOworCWludCBtb2RlOworCisJLyoKKwkgKiBSZW1lbWJlciB0aGF0IHdlIGFyZSBwYXN0IHRoZSBhdXRoZW50aWNhdGlvbiBzdGVwLCBzbyByZWtleWluZworCSAqIHdpdGggQ09NUF9ERUxBWUVEIHdpbGwgdHVybiBvbiBjb21wcmVzc2lvbiBpbW1lZGlhdGVseS4KKwkgKi8KKwlhY3RpdmVfc3RhdGUtPmFmdGVyX2F1dGhlbnRpY2F0aW9uID0gMTsKKwlmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTU9ERV9NQVg7IG1vZGUrKykgeworCQkvKiBwcm90b2NvbCBlcnJvcjogVVNFUkFVVEhfU1VDQ0VTUyByZWNlaXZlZCBiZWZvcmUgTkVXS0VZUyAqLworCQlpZiAoYWN0aXZlX3N0YXRlLT5uZXdrZXlzW21vZGVdID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJY29tcCA9ICZhY3RpdmVfc3RhdGUtPm5ld2tleXNbbW9kZV0tPmNvbXA7CisJCWlmIChjb21wICYmICFjb21wLT5lbmFibGVkICYmIGNvbXAtPnR5cGUgPT0gQ09NUF9ERUxBWUVEKSB7CisJCQlwYWNrZXRfaW5pdF9jb21wcmVzc2lvbigpOworCQkJaWYgKG1vZGUgPT0gTU9ERV9PVVQpCisJCQkJYnVmZmVyX2NvbXByZXNzX2luaXRfc2VuZCg2KTsKKwkJCWVsc2UKKwkJCQlidWZmZXJfY29tcHJlc3NfaW5pdF9yZWN2KCk7CisJCQljb21wLT5lbmFibGVkID0gMTsKKwkJfQorCX0KK30KKworLyoKKyAqIEZpbmFsaXplIHBhY2tldCBpbiBTU0gyIGZvcm1hdCAoY29tcHJlc3MsIG1hYywgZW5jcnlwdCwgZW5xdWV1ZSkKKyAqLworc3RhdGljIHZvaWQKK3BhY2tldF9zZW5kMl93cmFwcGVkKHZvaWQpCit7CisJdV9jaGFyIHR5cGUsICpjcCwgKm1hY2J1ZiA9IE5VTEw7CisJdV9jaGFyIHBhZGxlbiwgcGFkOworCXVfaW50IHBhY2tldF9sZW5ndGggPSAwOworCXVfaW50IGksIGxlbjsKKwl1X2ludDMyX3Qgcm5kID0gMDsKKwlFbmMgKmVuYyAgID0gTlVMTDsKKwlNYWMgKm1hYyAgID0gTlVMTDsKKwlDb21wICpjb21wID0gTlVMTDsKKwlpbnQgYmxvY2tfc2l6ZTsKKworCWlmIChhY3RpdmVfc3RhdGUtPm5ld2tleXNbTU9ERV9PVVRdICE9IE5VTEwpIHsKKwkJZW5jICA9ICZhY3RpdmVfc3RhdGUtPm5ld2tleXNbTU9ERV9PVVRdLT5lbmM7CisJCW1hYyAgPSAmYWN0aXZlX3N0YXRlLT5uZXdrZXlzW01PREVfT1VUXS0+bWFjOworCQljb21wID0gJmFjdGl2ZV9zdGF0ZS0+bmV3a2V5c1tNT0RFX09VVF0tPmNvbXA7CisJfQorCWJsb2NrX3NpemUgPSBlbmMgPyBlbmMtPmJsb2NrX3NpemUgOiA4OworCisJY3AgPSBidWZmZXJfcHRyKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCk7CisJdHlwZSA9IGNwWzVdOworCisjaWZkZWYgUEFDS0VUX0RFQlVHCisJZnByaW50ZihzdGRlcnIsICJwbGFpbjogICAgICIpOworCWJ1ZmZlcl9kdW1wKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCk7CisjZW5kaWYKKworCWlmIChjb21wICYmIGNvbXAtPmVuYWJsZWQpIHsKKwkJbGVuID0gYnVmZmVyX2xlbigmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQpOworCQkvKiBza2lwIGhlYWRlciwgY29tcHJlc3Mgb25seSBwYXlsb2FkICovCisJCWJ1ZmZlcl9jb25zdW1lKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCwgNSk7CisJCWJ1ZmZlcl9jbGVhcigmYWN0aXZlX3N0YXRlLT5jb21wcmVzc2lvbl9idWZmZXIpOworCQlidWZmZXJfY29tcHJlc3MoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0LAorCQkgICAgJmFjdGl2ZV9zdGF0ZS0+Y29tcHJlc3Npb25fYnVmZmVyKTsKKwkJYnVmZmVyX2NsZWFyKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCk7CisJCWJ1ZmZlcl9hcHBlbmQoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0LCAiXDBcMFwwXDBcMCIsIDUpOworCQlidWZmZXJfYXBwZW5kKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCwKKwkJICAgIGJ1ZmZlcl9wdHIoJmFjdGl2ZV9zdGF0ZS0+Y29tcHJlc3Npb25fYnVmZmVyKSwKKwkJICAgIGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+Y29tcHJlc3Npb25fYnVmZmVyKSk7CisJCURCRyhkZWJ1ZygiY29tcHJlc3Npb246IHJhdyAlZCBjb21wcmVzc2VkICVkIiwgbGVuLAorCQkgICAgYnVmZmVyX2xlbigmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQpKSk7CisJfQorCisJLyogc2l6ZW9mIChwYWNrZXRfbGVuICsgcGFkX2xlbiArIHBheWxvYWQpICovCisJbGVuID0gYnVmZmVyX2xlbigmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQpOworCisJLyoKKwkgKiBjYWxjIHNpemUgb2YgcGFkZGluZywgYWxsb2Mgc3BhY2UsIGdldCByYW5kb20gZGF0YSwKKwkgKiBtaW5pbXVtIHBhZGRpbmcgaXMgNCBieXRlcworCSAqLworCXBhZGxlbiA9IGJsb2NrX3NpemUgLSAobGVuICUgYmxvY2tfc2l6ZSk7CisJaWYgKHBhZGxlbiA8IDQpCisJCXBhZGxlbiArPSBibG9ja19zaXplOworCWlmIChhY3RpdmVfc3RhdGUtPmV4dHJhX3BhZCkgeworCQkvKiB3aWxsIHdyYXAgaWYgZXh0cmFfcGFkK3BhZGxlbiA+IDI1NSAqLworCQlhY3RpdmVfc3RhdGUtPmV4dHJhX3BhZCA9CisJCSAgICByb3VuZHVwKGFjdGl2ZV9zdGF0ZS0+ZXh0cmFfcGFkLCBibG9ja19zaXplKTsKKwkJcGFkID0gYWN0aXZlX3N0YXRlLT5leHRyYV9wYWQgLQorCQkgICAgKChsZW4gKyBwYWRsZW4pICUgYWN0aXZlX3N0YXRlLT5leHRyYV9wYWQpOworCQlkZWJ1ZzMoInBhY2tldF9zZW5kMjogYWRkaW5nICVkIChsZW4gJWQgcGFkbGVuICVkIGV4dHJhX3BhZCAlZCkiLAorCQkgICAgcGFkLCBsZW4sIHBhZGxlbiwgYWN0aXZlX3N0YXRlLT5leHRyYV9wYWQpOworCQlwYWRsZW4gKz0gcGFkOworCQlhY3RpdmVfc3RhdGUtPmV4dHJhX3BhZCA9IDA7CisJfQorCWNwID0gYnVmZmVyX2FwcGVuZF9zcGFjZSgmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQsIHBhZGxlbik7CisJaWYgKGVuYyAmJiAhYWN0aXZlX3N0YXRlLT5zZW5kX2NvbnRleHQucGxhaW50ZXh0KSB7CisJCS8qIHJhbmRvbSBwYWRkaW5nICovCisJCWZvciAoaSA9IDA7IGkgPCBwYWRsZW47IGkrKykgeworCQkJaWYgKGkgJSA0ID09IDApCisJCQkJcm5kID0gYXJjNHJhbmRvbSgpOworCQkJY3BbaV0gPSBybmQgJiAweGZmOworCQkJcm5kID4+PSA4OworCQl9CisJfSBlbHNlIHsKKwkJLyogY2xlYXIgcGFkZGluZyAqLworCQltZW1zZXQoY3AsIDAsIHBhZGxlbik7CisJfQorCS8qIHBhY2tldF9sZW5ndGggaW5jbHVkZXMgcGF5bG9hZCwgcGFkZGluZyBhbmQgcGFkZGluZyBsZW5ndGggZmllbGQgKi8KKwlwYWNrZXRfbGVuZ3RoID0gYnVmZmVyX2xlbigmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQpIC0gNDsKKwljcCA9IGJ1ZmZlcl9wdHIoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0KTsKKwlwdXRfdTMyKGNwLCBwYWNrZXRfbGVuZ3RoKTsKKwljcFs0XSA9IHBhZGxlbjsKKwlEQkcoZGVidWcoInNlbmQ6IGxlbiAlZCAoaW5jbHVkZXMgcGFkbGVuICVkKSIsIHBhY2tldF9sZW5ndGgrNCwgcGFkbGVuKSk7CisKKwkvKiBjb21wdXRlIE1BQyBvdmVyIHNlcW5yIGFuZCBwYWNrZXQobGVuZ3RoIGZpZWxkcywgcGF5bG9hZCwgcGFkZGluZykgKi8KKwlpZiAobWFjICYmIG1hYy0+ZW5hYmxlZCkgeworCQltYWNidWYgPSBtYWNfY29tcHV0ZShtYWMsIGFjdGl2ZV9zdGF0ZS0+cF9zZW5kLnNlcW5yLAorCQkgICAgYnVmZmVyX3B0cigmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQpLAorCQkgICAgYnVmZmVyX2xlbigmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQpKTsKKwkJREJHKGRlYnVnKCJkb25lIGNhbGMgTUFDIG91dCAjJWQiLCBhY3RpdmVfc3RhdGUtPnBfc2VuZC5zZXFucikpOworCX0KKwkvKiBlbmNyeXB0IHBhY2tldCBhbmQgYXBwZW5kIHRvIG91dHB1dCBidWZmZXIuICovCisJY3AgPSBidWZmZXJfYXBwZW5kX3NwYWNlKCZhY3RpdmVfc3RhdGUtPm91dHB1dCwKKwkgICAgYnVmZmVyX2xlbigmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQpKTsKKwljaXBoZXJfY3J5cHQoJmFjdGl2ZV9zdGF0ZS0+c2VuZF9jb250ZXh0LCBjcCwKKwkgICAgYnVmZmVyX3B0cigmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQpLAorCSAgICBidWZmZXJfbGVuKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCkpOworCS8qIGFwcGVuZCB1bmVuY3J5cHRlZCBNQUMgKi8KKwlpZiAobWFjICYmIG1hYy0+ZW5hYmxlZCkKKwkJYnVmZmVyX2FwcGVuZCgmYWN0aXZlX3N0YXRlLT5vdXRwdXQsIG1hY2J1ZiwgbWFjLT5tYWNfbGVuKTsKKyNpZmRlZiBQQUNLRVRfREVCVUcKKwlmcHJpbnRmKHN0ZGVyciwgImVuY3J5cHRlZDogIik7CisJYnVmZmVyX2R1bXAoJmFjdGl2ZV9zdGF0ZS0+b3V0cHV0KTsKKyNlbmRpZgorCS8qIGluY3JlbWVudCBzZXF1ZW5jZSBudW1iZXIgZm9yIG91dGdvaW5nIHBhY2tldHMgKi8KKwlpZiAoKythY3RpdmVfc3RhdGUtPnBfc2VuZC5zZXFuciA9PSAwKQorCQlsb2dpdCgib3V0Z29pbmcgc2VxbnIgd3JhcHMgYXJvdW5kIik7CisJaWYgKCsrYWN0aXZlX3N0YXRlLT5wX3NlbmQucGFja2V0cyA9PSAwKQorCQlpZiAoIShkYXRhZmVsbG93cyAmIFNTSF9CVUdfTk9SRUtFWSkpCisJCQlmYXRhbCgiWFhYIHRvbyBtYW55IHBhY2tldHMgd2l0aCBzYW1lIGtleSIpOworCWFjdGl2ZV9zdGF0ZS0+cF9zZW5kLmJsb2NrcyArPSAocGFja2V0X2xlbmd0aCArIDQpIC8gYmxvY2tfc2l6ZTsKKwlhY3RpdmVfc3RhdGUtPnBfc2VuZC5ieXRlcyArPSBwYWNrZXRfbGVuZ3RoICsgNDsKKwlidWZmZXJfY2xlYXIoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0KTsKKworCWlmICh0eXBlID09IFNTSDJfTVNHX05FV0tFWVMpCisJCXNldF9uZXdrZXlzKE1PREVfT1VUKTsKKwllbHNlIGlmICh0eXBlID09IFNTSDJfTVNHX1VTRVJBVVRIX1NVQ0NFU1MgJiYgYWN0aXZlX3N0YXRlLT5zZXJ2ZXJfc2lkZSkKKwkJcGFja2V0X2VuYWJsZV9kZWxheWVkX2NvbXByZXNzKCk7Cit9CisKK3N0YXRpYyB2b2lkCitwYWNrZXRfc2VuZDIodm9pZCkKK3sKKwlzdHJ1Y3QgcGFja2V0ICpwOworCXVfY2hhciB0eXBlLCAqY3A7CisKKwljcCA9IGJ1ZmZlcl9wdHIoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0KTsKKwl0eXBlID0gY3BbNV07CisKKwkvKiBkdXJpbmcgcmVrZXlpbmcgd2UgY2FuIG9ubHkgc2VuZCBrZXkgZXhjaGFuZ2UgbWVzc2FnZXMgKi8KKwlpZiAoYWN0aXZlX3N0YXRlLT5yZWtleWluZykgeworCQlpZiAoKHR5cGUgPCBTU0gyX01TR19UUkFOU1BPUlRfTUlOKSB8fAorCQkgICAgKHR5cGUgPiBTU0gyX01TR19UUkFOU1BPUlRfTUFYKSB8fAorCQkgICAgKHR5cGUgPT0gU1NIMl9NU0dfU0VSVklDRV9SRVFVRVNUKSB8fAorCQkgICAgKHR5cGUgPT0gU1NIMl9NU0dfU0VSVklDRV9BQ0NFUFQpKSB7CisJCQlkZWJ1ZygiZW5xdWV1ZSBwYWNrZXQ6ICV1IiwgdHlwZSk7CisJCQlwID0geG1hbGxvYyhzaXplb2YoKnApKTsKKwkJCXAtPnR5cGUgPSB0eXBlOworCQkJbWVtY3B5KCZwLT5wYXlsb2FkLCAmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQsCisJCQkgICAgc2l6ZW9mKEJ1ZmZlcikpOworCQkJYnVmZmVyX2luaXQoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0KTsKKwkJCVRBSUxRX0lOU0VSVF9UQUlMKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nLCBwLCBuZXh0KTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIHJla2V5aW5nIHN0YXJ0cyB3aXRoIHNlbmRpbmcgS0VYSU5JVCAqLworCWlmICh0eXBlID09IFNTSDJfTVNHX0tFWElOSVQpCisJCWFjdGl2ZV9zdGF0ZS0+cmVrZXlpbmcgPSAxOworCisJcGFja2V0X3NlbmQyX3dyYXBwZWQoKTsKKworCS8qIGFmdGVyIGEgTkVXS0VZUyBtZXNzYWdlIHdlIGNhbiBzZW5kIHRoZSBjb21wbGV0ZSBxdWV1ZSAqLworCWlmICh0eXBlID09IFNTSDJfTVNHX05FV0tFWVMpIHsKKwkJYWN0aXZlX3N0YXRlLT5yZWtleWluZyA9IDA7CisJCXdoaWxlICgocCA9IFRBSUxRX0ZJUlNUKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nKSkpIHsKKwkJCXR5cGUgPSBwLT50eXBlOworCQkJZGVidWcoImRlcXVldWUgcGFja2V0OiAldSIsIHR5cGUpOworCQkJYnVmZmVyX2ZyZWUoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0KTsKKwkJCW1lbWNweSgmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQsICZwLT5wYXlsb2FkLAorCQkJICAgIHNpemVvZihCdWZmZXIpKTsKKwkJCVRBSUxRX1JFTU9WRSgmYWN0aXZlX3N0YXRlLT5vdXRnb2luZywgcCwgbmV4dCk7CisJCQl4ZnJlZShwKTsKKwkJCXBhY2tldF9zZW5kMl93cmFwcGVkKCk7CisJCX0KKwl9Cit9CisKK3ZvaWQKK3BhY2tldF9zZW5kKHZvaWQpCit7CisJaWYgKGNvbXBhdDIwKQorCQlwYWNrZXRfc2VuZDIoKTsKKwllbHNlCisJCXBhY2tldF9zZW5kMSgpOworCURCRyhkZWJ1ZygicGFja2V0X3NlbmQgZG9uZSIpKTsKK30KKworLyoKKyAqIFdhaXRzIHVudGlsIGEgcGFja2V0IGhhcyBiZWVuIHJlY2VpdmVkLCBhbmQgcmV0dXJucyBpdHMgdHlwZS4gIE5vdGUgdGhhdAorICogbm8gb3RoZXIgZGF0YSBpcyBwcm9jZXNzZWQgdW50aWwgdGhpcyByZXR1cm5zLCBzbyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBub3QKKyAqIGJlIHVzZWQgZHVyaW5nIHRoZSBpbnRlcmFjdGl2ZSBzZXNzaW9uLgorICovCisKK2ludAorcGFja2V0X3JlYWRfc2VxbnIodV9pbnQzMl90ICpzZXFucl9wKQoreworCWludCB0eXBlLCBsZW4sIHJldCwgbXNfcmVtYWluLCBjb250OworCWZkX3NldCAqc2V0cDsKKwljaGFyIGJ1Zls4MTkyXTsKKwlzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0LCBzdGFydCwgKnRpbWVvdXRwID0gTlVMTDsKKworCURCRyhkZWJ1ZygicGFja2V0X3JlYWQoKSIpKTsKKworCXNldHAgPSAoZmRfc2V0ICopeGNhbGxvYyhob3dtYW55KGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9pbiArIDEsCisJICAgIE5GREJJVFMpLCBzaXplb2YoZmRfbWFzaykpOworCisJLyogU2luY2Ugd2UgYXJlIGJsb2NraW5nLCBlbnN1cmUgdGhhdCBhbGwgd3JpdHRlbiBwYWNrZXRzIGhhdmUgYmVlbiBzZW50LiAqLworCXBhY2tldF93cml0ZV93YWl0KCk7CisKKwkvKiBTdGF5IGluIHRoZSBsb29wIHVudGlsIHdlIGhhdmUgcmVjZWl2ZWQgYSBjb21wbGV0ZSBwYWNrZXQuICovCisJZm9yICg7OykgeworCQkvKiBUcnkgdG8gcmVhZCBhIHBhY2tldCBmcm9tIHRoZSBidWZmZXIuICovCisJCXR5cGUgPSBwYWNrZXRfcmVhZF9wb2xsX3NlcW5yKHNlcW5yX3ApOworCQlpZiAoIWNvbXBhdDIwICYmICgKKwkJICAgIHR5cGUgPT0gU1NIX1NNU0dfU1VDQ0VTUworCQkgICAgfHwgdHlwZSA9PSBTU0hfU01TR19GQUlMVVJFCisJCSAgICB8fCB0eXBlID09IFNTSF9DTVNHX0VPRgorCQkgICAgfHwgdHlwZSA9PSBTU0hfQ01TR19FWElUX0NPTkZJUk1BVElPTikpCisJCQlwYWNrZXRfY2hlY2tfZW9tKCk7CisJCS8qIElmIHdlIGdvdCBhIHBhY2tldCwgcmV0dXJuIGl0LiAqLworCQlpZiAodHlwZSAhPSBTU0hfTVNHX05PTkUpIHsKKwkJCXhmcmVlKHNldHApOworCQkJcmV0dXJuIHR5cGU7CisJCX0KKwkJLyoKKwkJICogT3RoZXJ3aXNlLCB3YWl0IGZvciBzb21lIGRhdGEgdG8gYXJyaXZlLCBhZGQgaXQgdG8gdGhlCisJCSAqIGJ1ZmZlciwgYW5kIHRyeSBhZ2Fpbi4KKwkJICovCisJCW1lbXNldChzZXRwLCAwLCBob3dtYW55KGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9pbiArIDEsCisJCSAgICBORkRCSVRTKSAqIHNpemVvZihmZF9tYXNrKSk7CisJCUZEX1NFVChhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25faW4sIHNldHApOworCisJCWlmIChhY3RpdmVfc3RhdGUtPnBhY2tldF90aW1lb3V0X21zID4gMCkgeworCQkJbXNfcmVtYWluID0gYWN0aXZlX3N0YXRlLT5wYWNrZXRfdGltZW91dF9tczsKKwkJCXRpbWVvdXRwID0gJnRpbWVvdXQ7CisJCX0KKwkJLyogV2FpdCBmb3Igc29tZSBkYXRhIHRvIGFycml2ZS4gKi8KKwkJZm9yICg7OykgeworCQkJaWYgKGFjdGl2ZV9zdGF0ZS0+cGFja2V0X3RpbWVvdXRfbXMgIT0gLTEpIHsKKwkJCQltc190b190aW1ldmFsKCZ0aW1lb3V0LCBtc19yZW1haW4pOworCQkJCWdldHRpbWVvZmRheSgmc3RhcnQsIE5VTEwpOworCQkJfQorCQkJaWYgKChyZXQgPSBzZWxlY3QoYWN0aXZlX3N0YXRlLT5jb25uZWN0aW9uX2luICsgMSwgc2V0cCwKKwkJCSAgICBOVUxMLCBOVUxMLCB0aW1lb3V0cCkpID49IDApCisJCQkJYnJlYWs7CisJCQlpZiAoZXJybm8gIT0gRUFHQUlOICYmIGVycm5vICE9IEVJTlRSICYmCisJCQkgICAgZXJybm8gIT0gRVdPVUxEQkxPQ0spCisJCQkJYnJlYWs7CisJCQlpZiAoYWN0aXZlX3N0YXRlLT5wYWNrZXRfdGltZW91dF9tcyA9PSAtMSkKKwkJCQljb250aW51ZTsKKwkJCW1zX3N1YnRyYWN0X2RpZmYoJnN0YXJ0LCAmbXNfcmVtYWluKTsKKwkJCWlmIChtc19yZW1haW4gPD0gMCkgeworCQkJCXJldCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHJldCA9PSAwKSB7CisJCQlsb2dpdCgiQ29ubmVjdGlvbiB0byAlLjIwMHMgdGltZWQgb3V0IHdoaWxlICIKKwkJCSAgICAid2FpdGluZyB0byByZWFkIiwgZ2V0X3JlbW90ZV9pcGFkZHIoKSk7CisJCQljbGVhbnVwX2V4aXQoMjU1KTsKKwkJfQorCQkvKiBSZWFkIGRhdGEgZnJvbSB0aGUgc29ja2V0LiAqLworCQlkbyB7CisJCQljb250ID0gMDsKKwkJCWxlbiA9IHJvYW1pbmdfcmVhZChhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25faW4sIGJ1ZiwKKwkJCSAgICBzaXplb2YoYnVmKSwgJmNvbnQpOworCQl9IHdoaWxlIChsZW4gPT0gMCAmJiBjb250KTsKKwkJaWYgKGxlbiA9PSAwKSB7CisJCQlsb2dpdCgiQ29ubmVjdGlvbiBjbG9zZWQgYnkgJS4yMDBzIiwgZ2V0X3JlbW90ZV9pcGFkZHIoKSk7CisJCQljbGVhbnVwX2V4aXQoMjU1KTsKKwkJfQorCQlpZiAobGVuIDwgMCkKKwkJCWZhdGFsKCJSZWFkIGZyb20gc29ja2V0IGZhaWxlZDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJLyogQXBwZW5kIGl0IHRvIHRoZSBidWZmZXIuICovCisJCXBhY2tldF9wcm9jZXNzX2luY29taW5nKGJ1ZiwgbGVuKTsKKwl9CisJLyogTk9UUkVBQ0hFRCAqLworfQorCitpbnQKK3BhY2tldF9yZWFkKHZvaWQpCit7CisJcmV0dXJuIHBhY2tldF9yZWFkX3NlcW5yKE5VTEwpOworfQorCisvKgorICogV2FpdHMgdW50aWwgYSBwYWNrZXQgaGFzIGJlZW4gcmVjZWl2ZWQsIHZlcmlmaWVzIHRoYXQgaXRzIHR5cGUgbWF0Y2hlcworICogdGhhdCBnaXZlbiwgYW5kIGdpdmVzIGEgZmF0YWwgZXJyb3IgYW5kIGV4aXRzIGlmIHRoZXJlIGlzIGEgbWlzbWF0Y2guCisgKi8KKwordm9pZAorcGFja2V0X3JlYWRfZXhwZWN0KGludCBleHBlY3RlZF90eXBlKQoreworCWludCB0eXBlOworCisJdHlwZSA9IHBhY2tldF9yZWFkKCk7CisJaWYgKHR5cGUgIT0gZXhwZWN0ZWRfdHlwZSkKKwkJcGFja2V0X2Rpc2Nvbm5lY3QoIlByb3RvY29sIGVycm9yOiBleHBlY3RlZCBwYWNrZXQgdHlwZSAlZCwgZ290ICVkIiwKKwkJICAgIGV4cGVjdGVkX3R5cGUsIHR5cGUpOworfQorCisvKiBDaGVja3MgaWYgYSBmdWxsIHBhY2tldCBpcyBhdmFpbGFibGUgaW4gdGhlIGRhdGEgcmVjZWl2ZWQgc28gZmFyIHZpYQorICogcGFja2V0X3Byb2Nlc3NfaW5jb21pbmcuICBJZiBzbywgcmVhZHMgdGhlIHBhY2tldDsgb3RoZXJ3aXNlIHJldHVybnMKKyAqIFNTSF9NU0dfTk9ORS4gIFRoaXMgZG9lcyBub3Qgd2FpdCBmb3IgZGF0YSBmcm9tIHRoZSBjb25uZWN0aW9uLgorICoKKyAqIFNTSF9NU0dfRElTQ09OTkVDVCBpcyBoYW5kbGVkIHNwZWNpYWxseSBoZXJlLiAgQWxzbywKKyAqIFNTSF9NU0dfSUdOT1JFIG1lc3NhZ2VzIGFyZSBza2lwcGVkIGJ5IHRoaXMgZnVuY3Rpb24gYW5kIGFyZSBuZXZlciByZXR1cm5lZAorICogdG8gaGlnaGVyIGxldmVscy4KKyAqLworCitzdGF0aWMgaW50CitwYWNrZXRfcmVhZF9wb2xsMSh2b2lkKQoreworCXVfaW50IGxlbiwgcGFkZGVkX2xlbjsKKwl1X2NoYXIgKmNwLCB0eXBlOworCXVfaW50IGNoZWNrc3VtLCBzdG9yZWRfY2hlY2tzdW07CisKKwkvKiBDaGVjayBpZiBpbnB1dCBzaXplIGlzIGxlc3MgdGhhbiBtaW5pbXVtIHBhY2tldCBzaXplLiAqLworCWlmIChidWZmZXJfbGVuKCZhY3RpdmVfc3RhdGUtPmlucHV0KSA8IDQgKyA4KQorCQlyZXR1cm4gU1NIX01TR19OT05FOworCS8qIEdldCBsZW5ndGggb2YgaW5jb21pbmcgcGFja2V0LiAqLworCWNwID0gYnVmZmVyX3B0cigmYWN0aXZlX3N0YXRlLT5pbnB1dCk7CisJbGVuID0gZ2V0X3UzMihjcCk7CisJaWYgKGxlbiA8IDEgKyAyICsgMiB8fCBsZW4gPiAyNTYgKiAxMDI0KQorCQlwYWNrZXRfZGlzY29ubmVjdCgiQmFkIHBhY2tldCBsZW5ndGggJXUuIiwgbGVuKTsKKwlwYWRkZWRfbGVuID0gKGxlbiArIDgpICYgfjc7CisKKwkvKiBDaGVjayBpZiB0aGUgcGFja2V0IGhhcyBiZWVuIGVudGlyZWx5IHJlY2VpdmVkLiAqLworCWlmIChidWZmZXJfbGVuKCZhY3RpdmVfc3RhdGUtPmlucHV0KSA8IDQgKyBwYWRkZWRfbGVuKQorCQlyZXR1cm4gU1NIX01TR19OT05FOworCisJLyogVGhlIGVudGlyZSBwYWNrZXQgaXMgaW4gYnVmZmVyLiAqLworCisJLyogQ29uc3VtZSBwYWNrZXQgbGVuZ3RoLiAqLworCWJ1ZmZlcl9jb25zdW1lKCZhY3RpdmVfc3RhdGUtPmlucHV0LCA0KTsKKworCS8qCisJICogQ3J5cHRvZ3JhcGhpYyBhdHRhY2sgZGV0ZWN0b3IgZm9yIHNzaAorCSAqIChDKTE5OTggQ09SRS1TREksIEJ1ZW5vcyBBaXJlcyBBcmdlbnRpbmEKKwkgKiBBcmllbCBGdXRvcmFuc2t5KGZ1dG9AY29yZS1zZGkuY29tKQorCSAqLworCWlmICghYWN0aXZlX3N0YXRlLT5yZWNlaXZlX2NvbnRleHQucGxhaW50ZXh0KSB7CisJCXN3aXRjaCAoZGV0ZWN0X2F0dGFjayhidWZmZXJfcHRyKCZhY3RpdmVfc3RhdGUtPmlucHV0KSwKKwkJICAgIHBhZGRlZF9sZW4pKSB7CisJCWNhc2UgREVBVFRBQ0tfREVURUNURUQ6CisJCQlwYWNrZXRfZGlzY29ubmVjdCgiY3JjMzIgY29tcGVuc2F0aW9uIGF0dGFjazogIgorCQkJICAgICJuZXR3b3JrIGF0dGFjayBkZXRlY3RlZCIpOworCQljYXNlIERFQVRUQUNLX0RPU19ERVRFQ1RFRDoKKwkJCXBhY2tldF9kaXNjb25uZWN0KCJkZWF0dGFjayBkZW5pYWwgb2YgIgorCQkJICAgICJzZXJ2aWNlIGRldGVjdGVkIik7CisJCX0KKwl9CisKKwkvKiBEZWNyeXB0IGRhdGEgdG8gaW5jb21pbmdfcGFja2V0LiAqLworCWJ1ZmZlcl9jbGVhcigmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQpOworCWNwID0gYnVmZmVyX2FwcGVuZF9zcGFjZSgmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQsIHBhZGRlZF9sZW4pOworCWNpcGhlcl9jcnlwdCgmYWN0aXZlX3N0YXRlLT5yZWNlaXZlX2NvbnRleHQsIGNwLAorCSAgICBidWZmZXJfcHRyKCZhY3RpdmVfc3RhdGUtPmlucHV0KSwgcGFkZGVkX2xlbik7CisKKwlidWZmZXJfY29uc3VtZSgmYWN0aXZlX3N0YXRlLT5pbnB1dCwgcGFkZGVkX2xlbik7CisKKyNpZmRlZiBQQUNLRVRfREVCVUcKKwlmcHJpbnRmKHN0ZGVyciwgInJlYWRfcG9sbCBwbGFpbjogIik7CisJYnVmZmVyX2R1bXAoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0KTsKKyNlbmRpZgorCisJLyogQ29tcHV0ZSBwYWNrZXQgY2hlY2tzdW0uICovCisJY2hlY2tzdW0gPSBzc2hfY3JjMzIoYnVmZmVyX3B0cigmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQpLAorCSAgICBidWZmZXJfbGVuKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCkgLSA0KTsKKworCS8qIFNraXAgcGFkZGluZy4gKi8KKwlidWZmZXJfY29uc3VtZSgmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQsIDggLSBsZW4gJSA4KTsKKworCS8qIFRlc3QgY2hlY2sgYnl0ZXMuICovCisJaWYgKGxlbiAhPSBidWZmZXJfbGVuKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCkpCisJCXBhY2tldF9kaXNjb25uZWN0KCJwYWNrZXRfcmVhZF9wb2xsMTogbGVuICVkICE9IGJ1ZmZlcl9sZW4gJWQuIiwKKwkJICAgIGxlbiwgYnVmZmVyX2xlbigmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQpKTsKKworCWNwID0gKHVfY2hhciAqKWJ1ZmZlcl9wdHIoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0KSArIGxlbiAtIDQ7CisJc3RvcmVkX2NoZWNrc3VtID0gZ2V0X3UzMihjcCk7CisJaWYgKGNoZWNrc3VtICE9IHN0b3JlZF9jaGVja3N1bSkKKwkJcGFja2V0X2Rpc2Nvbm5lY3QoIkNvcnJ1cHRlZCBjaGVjayBieXRlcyBvbiBpbnB1dC4iKTsKKwlidWZmZXJfY29uc3VtZV9lbmQoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0LCA0KTsKKworCWlmIChhY3RpdmVfc3RhdGUtPnBhY2tldF9jb21wcmVzc2lvbikgeworCQlidWZmZXJfY2xlYXIoJmFjdGl2ZV9zdGF0ZS0+Y29tcHJlc3Npb25fYnVmZmVyKTsKKwkJYnVmZmVyX3VuY29tcHJlc3MoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0LAorCQkgICAgJmFjdGl2ZV9zdGF0ZS0+Y29tcHJlc3Npb25fYnVmZmVyKTsKKwkJYnVmZmVyX2NsZWFyKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCk7CisJCWJ1ZmZlcl9hcHBlbmQoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0LAorCQkgICAgYnVmZmVyX3B0cigmYWN0aXZlX3N0YXRlLT5jb21wcmVzc2lvbl9idWZmZXIpLAorCQkgICAgYnVmZmVyX2xlbigmYWN0aXZlX3N0YXRlLT5jb21wcmVzc2lvbl9idWZmZXIpKTsKKwl9CisJYWN0aXZlX3N0YXRlLT5wX3JlYWQucGFja2V0cysrOworCWFjdGl2ZV9zdGF0ZS0+cF9yZWFkLmJ5dGVzICs9IHBhZGRlZF9sZW4gKyA0OworCXR5cGUgPSBidWZmZXJfZ2V0X2NoYXIoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0KTsKKwlpZiAodHlwZSA8IFNTSF9NU0dfTUlOIHx8IHR5cGUgPiBTU0hfTVNHX01BWCkKKwkJcGFja2V0X2Rpc2Nvbm5lY3QoIkludmFsaWQgc3NoMSBwYWNrZXQgdHlwZTogJWQiLCB0eXBlKTsKKwlyZXR1cm4gdHlwZTsKK30KKworc3RhdGljIGludAorcGFja2V0X3JlYWRfcG9sbDIodV9pbnQzMl90ICpzZXFucl9wKQoreworCXVfaW50IHBhZGxlbiwgbmVlZDsKKwl1X2NoYXIgKm1hY2J1ZiwgKmNwLCB0eXBlOworCXVfaW50IG1hY2xlbiwgYmxvY2tfc2l6ZTsKKwlFbmMgKmVuYyAgID0gTlVMTDsKKwlNYWMgKm1hYyAgID0gTlVMTDsKKwlDb21wICpjb21wID0gTlVMTDsKKworCWlmIChhY3RpdmVfc3RhdGUtPnBhY2tldF9kaXNjYXJkKQorCQlyZXR1cm4gU1NIX01TR19OT05FOworCisJaWYgKGFjdGl2ZV9zdGF0ZS0+bmV3a2V5c1tNT0RFX0lOXSAhPSBOVUxMKSB7CisJCWVuYyAgPSAmYWN0aXZlX3N0YXRlLT5uZXdrZXlzW01PREVfSU5dLT5lbmM7CisJCW1hYyAgPSAmYWN0aXZlX3N0YXRlLT5uZXdrZXlzW01PREVfSU5dLT5tYWM7CisJCWNvbXAgPSAmYWN0aXZlX3N0YXRlLT5uZXdrZXlzW01PREVfSU5dLT5jb21wOworCX0KKwltYWNsZW4gPSBtYWMgJiYgbWFjLT5lbmFibGVkID8gbWFjLT5tYWNfbGVuIDogMDsKKwlibG9ja19zaXplID0gZW5jID8gZW5jLT5ibG9ja19zaXplIDogODsKKworCWlmIChhY3RpdmVfc3RhdGUtPnBhY2tsZW4gPT0gMCkgeworCQkvKgorCQkgKiBjaGVjayBpZiBpbnB1dCBzaXplIGlzIGxlc3MgdGhhbiB0aGUgY2lwaGVyIGJsb2NrIHNpemUsCisJCSAqIGRlY3J5cHQgZmlyc3QgYmxvY2sgYW5kIGV4dHJhY3QgbGVuZ3RoIG9mIGluY29taW5nIHBhY2tldAorCQkgKi8KKwkJaWYgKGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+aW5wdXQpIDwgYmxvY2tfc2l6ZSkKKwkJCXJldHVybiBTU0hfTVNHX05PTkU7CisJCWJ1ZmZlcl9jbGVhcigmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQpOworCQljcCA9IGJ1ZmZlcl9hcHBlbmRfc3BhY2UoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0LAorCQkgICAgYmxvY2tfc2l6ZSk7CisJCWNpcGhlcl9jcnlwdCgmYWN0aXZlX3N0YXRlLT5yZWNlaXZlX2NvbnRleHQsIGNwLAorCQkgICAgYnVmZmVyX3B0cigmYWN0aXZlX3N0YXRlLT5pbnB1dCksIGJsb2NrX3NpemUpOworCQljcCA9IGJ1ZmZlcl9wdHIoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0KTsKKwkJYWN0aXZlX3N0YXRlLT5wYWNrbGVuID0gZ2V0X3UzMihjcCk7CisJCWlmIChhY3RpdmVfc3RhdGUtPnBhY2tsZW4gPCAxICsgNCB8fAorCQkgICAgYWN0aXZlX3N0YXRlLT5wYWNrbGVuID4gUEFDS0VUX01BWF9TSVpFKSB7CisjaWZkZWYgUEFDS0VUX0RFQlVHCisJCQlidWZmZXJfZHVtcCgmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQpOworI2VuZGlmCisJCQlsb2dpdCgiQmFkIHBhY2tldCBsZW5ndGggJXUuIiwgYWN0aXZlX3N0YXRlLT5wYWNrbGVuKTsKKwkJCXBhY2tldF9zdGFydF9kaXNjYXJkKGVuYywgbWFjLCBhY3RpdmVfc3RhdGUtPnBhY2tsZW4sCisJCQkgICAgUEFDS0VUX01BWF9TSVpFKTsKKwkJCXJldHVybiBTU0hfTVNHX05PTkU7CisJCX0KKwkJREJHKGRlYnVnKCJpbnB1dDogcGFja2V0IGxlbiAldSIsIGFjdGl2ZV9zdGF0ZS0+cGFja2xlbis0KSk7CisJCWJ1ZmZlcl9jb25zdW1lKCZhY3RpdmVfc3RhdGUtPmlucHV0LCBibG9ja19zaXplKTsKKwl9CisJLyogd2UgaGF2ZSBhIHBhcnRpYWwgcGFja2V0IG9mIGJsb2NrX3NpemUgYnl0ZXMgKi8KKwluZWVkID0gNCArIGFjdGl2ZV9zdGF0ZS0+cGFja2xlbiAtIGJsb2NrX3NpemU7CisJREJHKGRlYnVnKCJwYXJ0aWFsIHBhY2tldCAlZCwgbmVlZCAlZCwgbWFjbGVuICVkIiwgYmxvY2tfc2l6ZSwKKwkgICAgbmVlZCwgbWFjbGVuKSk7CisJaWYgKG5lZWQgJSBibG9ja19zaXplICE9IDApIHsKKwkJbG9naXQoInBhZGRpbmcgZXJyb3I6IG5lZWQgJWQgYmxvY2sgJWQgbW9kICVkIiwKKwkJICAgIG5lZWQsIGJsb2NrX3NpemUsIG5lZWQgJSBibG9ja19zaXplKTsKKwkJcGFja2V0X3N0YXJ0X2Rpc2NhcmQoZW5jLCBtYWMsIGFjdGl2ZV9zdGF0ZS0+cGFja2xlbiwKKwkJICAgIFBBQ0tFVF9NQVhfU0laRSAtIGJsb2NrX3NpemUpOworCQlyZXR1cm4gU1NIX01TR19OT05FOworCX0KKwkvKgorCSAqIGNoZWNrIGlmIHRoZSBlbnRpcmUgcGFja2V0IGhhcyBiZWVuIHJlY2VpdmVkIGFuZAorCSAqIGRlY3J5cHQgaW50byBpbmNvbWluZ19wYWNrZXQKKwkgKi8KKwlpZiAoYnVmZmVyX2xlbigmYWN0aXZlX3N0YXRlLT5pbnB1dCkgPCBuZWVkICsgbWFjbGVuKQorCQlyZXR1cm4gU1NIX01TR19OT05FOworI2lmZGVmIFBBQ0tFVF9ERUJVRworCWZwcmludGYoc3RkZXJyLCAicmVhZF9wb2xsIGVuYy9mdWxsOiAiKTsKKwlidWZmZXJfZHVtcCgmYWN0aXZlX3N0YXRlLT5pbnB1dCk7CisjZW5kaWYKKwljcCA9IGJ1ZmZlcl9hcHBlbmRfc3BhY2UoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0LCBuZWVkKTsKKwljaXBoZXJfY3J5cHQoJmFjdGl2ZV9zdGF0ZS0+cmVjZWl2ZV9jb250ZXh0LCBjcCwKKwkgICAgYnVmZmVyX3B0cigmYWN0aXZlX3N0YXRlLT5pbnB1dCksIG5lZWQpOworCWJ1ZmZlcl9jb25zdW1lKCZhY3RpdmVfc3RhdGUtPmlucHV0LCBuZWVkKTsKKwkvKgorCSAqIGNvbXB1dGUgTUFDIG92ZXIgc2VxbnIgYW5kIHBhY2tldCwKKwkgKiBpbmNyZW1lbnQgc2VxdWVuY2UgbnVtYmVyIGZvciBpbmNvbWluZyBwYWNrZXQKKwkgKi8KKwlpZiAobWFjICYmIG1hYy0+ZW5hYmxlZCkgeworCQltYWNidWYgPSBtYWNfY29tcHV0ZShtYWMsIGFjdGl2ZV9zdGF0ZS0+cF9yZWFkLnNlcW5yLAorCQkgICAgYnVmZmVyX3B0cigmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQpLAorCQkgICAgYnVmZmVyX2xlbigmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQpKTsKKwkJaWYgKHRpbWluZ3NhZmVfYmNtcChtYWNidWYsIGJ1ZmZlcl9wdHIoJmFjdGl2ZV9zdGF0ZS0+aW5wdXQpLAorCQkgICAgbWFjLT5tYWNfbGVuKSAhPSAwKSB7CisJCQlsb2dpdCgiQ29ycnVwdGVkIE1BQyBvbiBpbnB1dC4iKTsKKwkJCWlmIChuZWVkID4gUEFDS0VUX01BWF9TSVpFKQorCQkJCWZhdGFsKCJpbnRlcm5hbCBlcnJvciBuZWVkICVkIiwgbmVlZCk7CisJCQlwYWNrZXRfc3RhcnRfZGlzY2FyZChlbmMsIG1hYywgYWN0aXZlX3N0YXRlLT5wYWNrbGVuLAorCQkJICAgIFBBQ0tFVF9NQVhfU0laRSAtIG5lZWQpOworCQkJcmV0dXJuIFNTSF9NU0dfTk9ORTsKKwkJfQorCQkJCQorCQlEQkcoZGVidWcoIk1BQyAjJWQgb2siLCBhY3RpdmVfc3RhdGUtPnBfcmVhZC5zZXFucikpOworCQlidWZmZXJfY29uc3VtZSgmYWN0aXZlX3N0YXRlLT5pbnB1dCwgbWFjLT5tYWNfbGVuKTsKKwl9CisJLyogWFhYIG5vdyBpdCdzIHNhZmUgdG8gdXNlIGZhdGFsL3BhY2tldF9kaXNjb25uZWN0ICovCisJaWYgKHNlcW5yX3AgIT0gTlVMTCkKKwkJKnNlcW5yX3AgPSBhY3RpdmVfc3RhdGUtPnBfcmVhZC5zZXFucjsKKwlpZiAoKythY3RpdmVfc3RhdGUtPnBfcmVhZC5zZXFuciA9PSAwKQorCQlsb2dpdCgiaW5jb21pbmcgc2VxbnIgd3JhcHMgYXJvdW5kIik7CisJaWYgKCsrYWN0aXZlX3N0YXRlLT5wX3JlYWQucGFja2V0cyA9PSAwKQorCQlpZiAoIShkYXRhZmVsbG93cyAmIFNTSF9CVUdfTk9SRUtFWSkpCisJCQlmYXRhbCgiWFhYIHRvbyBtYW55IHBhY2tldHMgd2l0aCBzYW1lIGtleSIpOworCWFjdGl2ZV9zdGF0ZS0+cF9yZWFkLmJsb2NrcyArPSAoYWN0aXZlX3N0YXRlLT5wYWNrbGVuICsgNCkgLyBibG9ja19zaXplOworCWFjdGl2ZV9zdGF0ZS0+cF9yZWFkLmJ5dGVzICs9IGFjdGl2ZV9zdGF0ZS0+cGFja2xlbiArIDQ7CisKKwkvKiBnZXQgcGFkbGVuICovCisJY3AgPSBidWZmZXJfcHRyKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCk7CisJcGFkbGVuID0gY3BbNF07CisJREJHKGRlYnVnKCJpbnB1dDogcGFkbGVuICVkIiwgcGFkbGVuKSk7CisJaWYgKHBhZGxlbiA8IDQpCisJCXBhY2tldF9kaXNjb25uZWN0KCJDb3JydXB0ZWQgcGFkbGVuICVkIG9uIGlucHV0LiIsIHBhZGxlbik7CisKKwkvKiBza2lwIHBhY2tldCBzaXplICsgcGFkbGVuLCBkaXNjYXJkIHBhZGRpbmcgKi8KKwlidWZmZXJfY29uc3VtZSgmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQsIDQgKyAxKTsKKwlidWZmZXJfY29uc3VtZV9lbmQoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0LCBwYWRsZW4pOworCisJREJHKGRlYnVnKCJpbnB1dDogbGVuIGJlZm9yZSBkZS1jb21wcmVzcyAlZCIsCisJICAgIGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0KSkpOworCWlmIChjb21wICYmIGNvbXAtPmVuYWJsZWQpIHsKKwkJYnVmZmVyX2NsZWFyKCZhY3RpdmVfc3RhdGUtPmNvbXByZXNzaW9uX2J1ZmZlcik7CisJCWJ1ZmZlcl91bmNvbXByZXNzKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCwKKwkJICAgICZhY3RpdmVfc3RhdGUtPmNvbXByZXNzaW9uX2J1ZmZlcik7CisJCWJ1ZmZlcl9jbGVhcigmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQpOworCQlidWZmZXJfYXBwZW5kKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCwKKwkJICAgIGJ1ZmZlcl9wdHIoJmFjdGl2ZV9zdGF0ZS0+Y29tcHJlc3Npb25fYnVmZmVyKSwKKwkJICAgIGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+Y29tcHJlc3Npb25fYnVmZmVyKSk7CisJCURCRyhkZWJ1ZygiaW5wdXQ6IGxlbiBhZnRlciBkZS1jb21wcmVzcyAlZCIsCisJCSAgICBidWZmZXJfbGVuKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCkpKTsKKwl9CisJLyoKKwkgKiBnZXQgcGFja2V0IHR5cGUsIGltcGxpZXMgY29uc3VtZS4KKwkgKiByZXR1cm4gbGVuZ3RoIG9mIHBheWxvYWQgKHdpdGhvdXQgdHlwZSBmaWVsZCkKKwkgKi8KKwl0eXBlID0gYnVmZmVyX2dldF9jaGFyKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCk7CisJaWYgKHR5cGUgPCBTU0gyX01TR19NSU4gfHwgdHlwZSA+PSBTU0gyX01TR19MT0NBTF9NSU4pCisJCXBhY2tldF9kaXNjb25uZWN0KCJJbnZhbGlkIHNzaDIgcGFja2V0IHR5cGU6ICVkIiwgdHlwZSk7CisJaWYgKHR5cGUgPT0gU1NIMl9NU0dfTkVXS0VZUykKKwkJc2V0X25ld2tleXMoTU9ERV9JTik7CisJZWxzZSBpZiAodHlwZSA9PSBTU0gyX01TR19VU0VSQVVUSF9TVUNDRVNTICYmCisJICAgICFhY3RpdmVfc3RhdGUtPnNlcnZlcl9zaWRlKQorCQlwYWNrZXRfZW5hYmxlX2RlbGF5ZWRfY29tcHJlc3MoKTsKKyNpZmRlZiBQQUNLRVRfREVCVUcKKwlmcHJpbnRmKHN0ZGVyciwgInJlYWQvcGxhaW5bJWRdOlxyXG4iLCB0eXBlKTsKKwlidWZmZXJfZHVtcCgmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQpOworI2VuZGlmCisJLyogcmVzZXQgZm9yIG5leHQgcGFja2V0ICovCisJYWN0aXZlX3N0YXRlLT5wYWNrbGVuID0gMDsKKwlyZXR1cm4gdHlwZTsKK30KKworaW50CitwYWNrZXRfcmVhZF9wb2xsX3NlcW5yKHVfaW50MzJfdCAqc2VxbnJfcCkKK3sKKwl1X2ludCByZWFzb24sIHNlcW5yOworCXVfY2hhciB0eXBlOworCWNoYXIgKm1zZzsKKworCWZvciAoOzspIHsKKwkJaWYgKGNvbXBhdDIwKSB7CisJCQl0eXBlID0gcGFja2V0X3JlYWRfcG9sbDIoc2VxbnJfcCk7CisJCQlpZiAodHlwZSkgeworCQkJCWFjdGl2ZV9zdGF0ZS0+a2VlcF9hbGl2ZV90aW1lb3V0cyA9IDA7CisJCQkJREJHKGRlYnVnKCJyZWNlaXZlZCBwYWNrZXQgdHlwZSAlZCIsIHR5cGUpKTsKKwkJCX0KKwkJCXN3aXRjaCAodHlwZSkgeworCQkJY2FzZSBTU0gyX01TR19JR05PUkU6CisJCQkJZGVidWczKCJSZWNlaXZlZCBTU0gyX01TR19JR05PUkUiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU1NIMl9NU0dfREVCVUc6CisJCQkJcGFja2V0X2dldF9jaGFyKCk7CisJCQkJbXNnID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7CisJCQkJZGVidWcoIlJlbW90ZTogJS45MDBzIiwgbXNnKTsKKwkJCQl4ZnJlZShtc2cpOworCQkJCW1zZyA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOworCQkJCXhmcmVlKG1zZyk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNTSDJfTVNHX0RJU0NPTk5FQ1Q6CisJCQkJcmVhc29uID0gcGFja2V0X2dldF9pbnQoKTsKKwkJCQltc2cgPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKKwkJCQlsb2dpdCgiUmVjZWl2ZWQgZGlzY29ubmVjdCBmcm9tICVzOiAldTogJS40MDBzIiwKKwkJCQkgICAgZ2V0X3JlbW90ZV9pcGFkZHIoKSwgcmVhc29uLCBtc2cpOworCQkJCXhmcmVlKG1zZyk7CisJCQkJY2xlYW51cF9leGl0KDI1NSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNTSDJfTVNHX1VOSU1QTEVNRU5URUQ6CisJCQkJc2VxbnIgPSBwYWNrZXRfZ2V0X2ludCgpOworCQkJCWRlYnVnKCJSZWNlaXZlZCBTU0gyX01TR19VTklNUExFTUVOVEVEIGZvciAldSIsCisJCQkJICAgIHNlcW5yKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIHR5cGU7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0eXBlID0gcGFja2V0X3JlYWRfcG9sbDEoKTsKKwkJCXN3aXRjaCAodHlwZSkgeworCQkJY2FzZSBTU0hfTVNHX0lHTk9SRToKKwkJCQlicmVhazsKKwkJCWNhc2UgU1NIX01TR19ERUJVRzoKKwkJCQltc2cgPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKKwkJCQlkZWJ1ZygiUmVtb3RlOiAlLjkwMHMiLCBtc2cpOworCQkJCXhmcmVlKG1zZyk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNTSF9NU0dfRElTQ09OTkVDVDoKKwkJCQltc2cgPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKKwkJCQlsb2dpdCgiUmVjZWl2ZWQgZGlzY29ubmVjdCBmcm9tICVzOiAlLjQwMHMiLAorCQkJCSAgICBnZXRfcmVtb3RlX2lwYWRkcigpLCBtc2cpOworCQkJCWNsZWFudXBfZXhpdCgyNTUpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlpZiAodHlwZSkKKwkJCQkJREJHKGRlYnVnKCJyZWNlaXZlZCBwYWNrZXQgdHlwZSAlZCIsIHR5cGUpKTsKKwkJCQlyZXR1cm4gdHlwZTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoKKyAqIEJ1ZmZlcnMgdGhlIGdpdmVuIGFtb3VudCBvZiBpbnB1dCBjaGFyYWN0ZXJzLiAgVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkCisgKiB0b2dldGhlciB3aXRoIHBhY2tldF9yZWFkX3BvbGwuCisgKi8KKwordm9pZAorcGFja2V0X3Byb2Nlc3NfaW5jb21pbmcoY29uc3QgY2hhciAqYnVmLCB1X2ludCBsZW4pCit7CisJaWYgKGFjdGl2ZV9zdGF0ZS0+cGFja2V0X2Rpc2NhcmQpIHsKKwkJYWN0aXZlX3N0YXRlLT5rZWVwX2FsaXZlX3RpbWVvdXRzID0gMDsgLyogPz8gKi8KKwkJaWYgKGxlbiA+PSBhY3RpdmVfc3RhdGUtPnBhY2tldF9kaXNjYXJkKQorCQkJcGFja2V0X3N0b3BfZGlzY2FyZCgpOworCQlhY3RpdmVfc3RhdGUtPnBhY2tldF9kaXNjYXJkIC09IGxlbjsKKwkJcmV0dXJuOworCX0KKwlidWZmZXJfYXBwZW5kKCZhY3RpdmVfc3RhdGUtPmlucHV0LCBidWYsIGxlbik7Cit9CisKKy8qIFJldHVybnMgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgcGFja2V0LiAqLworCit1X2ludAorcGFja2V0X2dldF9jaGFyKHZvaWQpCit7CisJY2hhciBjaDsKKworCWJ1ZmZlcl9nZXQoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0LCAmY2gsIDEpOworCXJldHVybiAodV9jaGFyKSBjaDsKK30KKworLyogUmV0dXJucyBhbiBpbnRlZ2VyIGZyb20gdGhlIHBhY2tldCBkYXRhLiAqLworCit1X2ludAorcGFja2V0X2dldF9pbnQodm9pZCkKK3sKKwlyZXR1cm4gYnVmZmVyX2dldF9pbnQoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0KTsKK30KKworLyogUmV0dXJucyBhbiA2NCBiaXQgaW50ZWdlciBmcm9tIHRoZSBwYWNrZXQgZGF0YS4gKi8KKwordV9pbnQ2NF90CitwYWNrZXRfZ2V0X2ludDY0KHZvaWQpCit7CisJcmV0dXJuIGJ1ZmZlcl9nZXRfaW50NjQoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0KTsKK30KKworLyoKKyAqIFJldHVybnMgYW4gYXJiaXRyYXJ5IHByZWNpc2lvbiBpbnRlZ2VyIGZyb20gdGhlIHBhY2tldCBkYXRhLiAgVGhlIGludGVnZXIKKyAqIG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGNhbGwuCisgKi8KKwordm9pZAorcGFja2V0X2dldF9iaWdudW0oQklHTlVNICogdmFsdWUpCit7CisJYnVmZmVyX2dldF9iaWdudW0oJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0LCB2YWx1ZSk7Cit9CisKK3ZvaWQKK3BhY2tldF9nZXRfYmlnbnVtMihCSUdOVU0gKiB2YWx1ZSkKK3sKKwlidWZmZXJfZ2V0X2JpZ251bTIoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0LCB2YWx1ZSk7Cit9CisKKyNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKK3ZvaWQKK3BhY2tldF9nZXRfZWNwb2ludChjb25zdCBFQ19HUk9VUCAqY3VydmUsIEVDX1BPSU5UICpwb2ludCkKK3sKKwlidWZmZXJfZ2V0X2VjcG9pbnQoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0LCBjdXJ2ZSwgcG9pbnQpOworfQorI2VuZGlmCisKK3ZvaWQgKgorcGFja2V0X2dldF9yYXcodV9pbnQgKmxlbmd0aF9wdHIpCit7CisJdV9pbnQgYnl0ZXMgPSBidWZmZXJfbGVuKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCk7CisKKwlpZiAobGVuZ3RoX3B0ciAhPSBOVUxMKQorCQkqbGVuZ3RoX3B0ciA9IGJ5dGVzOworCXJldHVybiBidWZmZXJfcHRyKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCk7Cit9CisKK2ludAorcGFja2V0X3JlbWFpbmluZyh2b2lkKQoreworCXJldHVybiBidWZmZXJfbGVuKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCk7Cit9CisKKy8qCisgKiBSZXR1cm5zIGEgc3RyaW5nIGZyb20gdGhlIHBhY2tldCBkYXRhLiAgVGhlIHN0cmluZyBpcyBhbGxvY2F0ZWQgdXNpbmcKKyAqIHhtYWxsb2M7IGl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGluZyBwcm9ncmFtIHRvIGZyZWUgaXQgd2hlbgorICogbm8gbG9uZ2VyIG5lZWRlZC4gIFRoZSBsZW5ndGhfcHRyIGFyZ3VtZW50IG1heSBiZSBOVUxMLCBvciBwb2ludCB0byBhbgorICogaW50ZWdlciBpbnRvIHdoaWNoIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBpcyBzdG9yZWQuCisgKi8KKwordm9pZCAqCitwYWNrZXRfZ2V0X3N0cmluZyh1X2ludCAqbGVuZ3RoX3B0cikKK3sKKwlyZXR1cm4gYnVmZmVyX2dldF9zdHJpbmcoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0LCBsZW5ndGhfcHRyKTsKK30KKwordm9pZCAqCitwYWNrZXRfZ2V0X3N0cmluZ19wdHIodV9pbnQgKmxlbmd0aF9wdHIpCit7CisJcmV0dXJuIGJ1ZmZlcl9nZXRfc3RyaW5nX3B0cigmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQsIGxlbmd0aF9wdHIpOworfQorCisvKiBFbnN1cmVzIHRoZSByZXR1cm5lZCBzdHJpbmcgaGFzIG5vIGVtYmVkZGVkIFwwIGNoYXJhY3RlcnMgaW4gaXQuICovCitjaGFyICoKK3BhY2tldF9nZXRfY3N0cmluZyh1X2ludCAqbGVuZ3RoX3B0cikKK3sKKwlyZXR1cm4gYnVmZmVyX2dldF9jc3RyaW5nKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCwgbGVuZ3RoX3B0cik7Cit9CisKKy8qCisgKiBTZW5kcyBhIGRpYWdub3N0aWMgbWVzc2FnZSBmcm9tIHRoZSBzZXJ2ZXIgdG8gdGhlIGNsaWVudC4gIFRoaXMgbWVzc2FnZQorICogY2FuIGJlIHNlbnQgYXQgYW55IHRpbWUgKGJ1dCBub3Qgd2hpbGUgY29uc3RydWN0aW5nIGFub3RoZXIgbWVzc2FnZSkuIFRoZQorICogbWVzc2FnZSBpcyBwcmludGVkIGltbWVkaWF0ZWx5LCBidXQgb25seSBpZiB0aGUgY2xpZW50IGlzIGJlaW5nIGV4ZWN1dGVkCisgKiBpbiB2ZXJib3NlIG1vZGUuICBUaGVzZSBtZXNzYWdlcyBhcmUgcHJpbWFyaWx5IGludGVuZGVkIHRvIGVhc2UgZGVidWdnaW5nCisgKiBhdXRoZW50aWNhdGlvbiBwcm9ibGVtcy4gICBUaGUgbGVuZ3RoIG9mIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZSBtdXN0IG5vdAorICogZXhjZWVkIDEwMjQgYnl0ZXMuICBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBjYWxsIHBhY2tldF93cml0ZV93YWl0LgorICovCisKK3ZvaWQKK3BhY2tldF9zZW5kX2RlYnVnKGNvbnN0IGNoYXIgKmZtdCwuLi4pCit7CisJY2hhciBidWZbMTAyNF07CisJdmFfbGlzdCBhcmdzOworCisJaWYgKGNvbXBhdDIwICYmIChkYXRhZmVsbG93cyAmIFNTSF9CVUdfREVCVUcpKQorCQlyZXR1cm47CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCWlmIChjb21wYXQyMCkgeworCQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfREVCVUcpOworCQlwYWNrZXRfcHV0X2NoYXIoMCk7CS8qIGJvb2w6IGFsd2F5cyBkaXNwbGF5ICovCisJCXBhY2tldF9wdXRfY3N0cmluZyhidWYpOworCQlwYWNrZXRfcHV0X2NzdHJpbmcoIiIpOworCX0gZWxzZSB7CisJCXBhY2tldF9zdGFydChTU0hfTVNHX0RFQlVHKTsKKwkJcGFja2V0X3B1dF9jc3RyaW5nKGJ1Zik7CisJfQorCXBhY2tldF9zZW5kKCk7CisJcGFja2V0X3dyaXRlX3dhaXQoKTsKK30KKworLyoKKyAqIExvZ3MgdGhlIGVycm9yIHBsdXMgY29uc3RydWN0cyBhbmQgc2VuZHMgYSBkaXNjb25uZWN0IHBhY2tldCwgY2xvc2VzIHRoZQorICogY29ubmVjdGlvbiwgYW5kIGV4aXRzLiAgVGhpcyBmdW5jdGlvbiBuZXZlciByZXR1cm5zLiBUaGUgZXJyb3IgbWVzc2FnZQorICogc2hvdWxkIG5vdCBjb250YWluIGEgbmV3bGluZS4gIFRoZSBsZW5ndGggb2YgdGhlIGZvcm1hdHRlZCBtZXNzYWdlIG11c3QKKyAqIG5vdCBleGNlZWQgMTAyNCBieXRlcy4KKyAqLworCit2b2lkCitwYWNrZXRfZGlzY29ubmVjdChjb25zdCBjaGFyICpmbXQsLi4uKQoreworCWNoYXIgYnVmWzEwMjRdOworCXZhX2xpc3QgYXJnczsKKwlzdGF0aWMgaW50IGRpc2Nvbm5lY3RpbmcgPSAwOworCisJaWYgKGRpc2Nvbm5lY3RpbmcpCS8qIEd1YXJkIGFnYWluc3QgcmVjdXJzaXZlIGludm9jYXRpb25zLiAqLworCQlmYXRhbCgicGFja2V0X2Rpc2Nvbm5lY3QgY2FsbGVkIHJlY3Vyc2l2ZWx5LiIpOworCWRpc2Nvbm5lY3RpbmcgPSAxOworCisJLyoKKwkgKiBGb3JtYXQgdGhlIG1lc3NhZ2UuICBOb3RlIHRoYXQgdGhlIGNhbGxlciBtdXN0IG1ha2Ugc3VyZSB0aGUKKwkgKiBtZXNzYWdlIGlzIG9mIGxpbWl0ZWQgc2l6ZS4KKwkgKi8KKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCS8qIERpc3BsYXkgdGhlIGVycm9yIGxvY2FsbHkgKi8KKwlsb2dpdCgiRGlzY29ubmVjdGluZzogJS4xMDBzIiwgYnVmKTsKKworCS8qIFNlbmQgdGhlIGRpc2Nvbm5lY3QgbWVzc2FnZSB0byB0aGUgb3RoZXIgc2lkZSwgYW5kIHdhaXQgZm9yIGl0IHRvIGdldCBzZW50LiAqLworCWlmIChjb21wYXQyMCkgeworCQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfRElTQ09OTkVDVCk7CisJCXBhY2tldF9wdXRfaW50KFNTSDJfRElTQ09OTkVDVF9QUk9UT0NPTF9FUlJPUik7CisJCXBhY2tldF9wdXRfY3N0cmluZyhidWYpOworCQlwYWNrZXRfcHV0X2NzdHJpbmcoIiIpOworCX0gZWxzZSB7CisJCXBhY2tldF9zdGFydChTU0hfTVNHX0RJU0NPTk5FQ1QpOworCQlwYWNrZXRfcHV0X2NzdHJpbmcoYnVmKTsKKwl9CisJcGFja2V0X3NlbmQoKTsKKwlwYWNrZXRfd3JpdGVfd2FpdCgpOworCisJLyogU3RvcCBsaXN0ZW5pbmcgZm9yIGNvbm5lY3Rpb25zLiAqLworCWNoYW5uZWxfY2xvc2VfYWxsKCk7CisKKwkvKiBDbG9zZSB0aGUgY29ubmVjdGlvbi4gKi8KKwlwYWNrZXRfY2xvc2UoKTsKKwljbGVhbnVwX2V4aXQoMjU1KTsKK30KKworLyogQ2hlY2tzIGlmIHRoZXJlIGlzIGFueSBidWZmZXJlZCBvdXRwdXQsIGFuZCB0cmllcyB0byB3cml0ZSBzb21lIG9mIHRoZSBvdXRwdXQuICovCisKK3ZvaWQKK3BhY2tldF93cml0ZV9wb2xsKHZvaWQpCit7CisJaW50IGxlbiA9IGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+b3V0cHV0KTsKKwlpbnQgY29udDsKKworCWlmIChsZW4gPiAwKSB7CisJCWNvbnQgPSAwOworCQlsZW4gPSByb2FtaW5nX3dyaXRlKGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9vdXQsCisJCSAgICBidWZmZXJfcHRyKCZhY3RpdmVfc3RhdGUtPm91dHB1dCksIGxlbiwgJmNvbnQpOworCQlpZiAobGVuID09IC0xKSB7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOIHx8CisJCQkgICAgZXJybm8gPT0gRVdPVUxEQkxPQ0spCisJCQkJcmV0dXJuOworCQkJZmF0YWwoIldyaXRlIGZhaWxlZDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCQlpZiAobGVuID09IDAgJiYgIWNvbnQpCisJCQlmYXRhbCgiV3JpdGUgY29ubmVjdGlvbiBjbG9zZWQiKTsKKwkJYnVmZmVyX2NvbnN1bWUoJmFjdGl2ZV9zdGF0ZS0+b3V0cHV0LCBsZW4pOworCX0KK30KKworLyoKKyAqIENhbGxzIHBhY2tldF93cml0ZV9wb2xsIHJlcGVhdGVkbHkgdW50aWwgYWxsIHBlbmRpbmcgb3V0cHV0IGRhdGEgaGFzIGJlZW4KKyAqIHdyaXR0ZW4uCisgKi8KKwordm9pZAorcGFja2V0X3dyaXRlX3dhaXQodm9pZCkKK3sKKwlmZF9zZXQgKnNldHA7CisJaW50IHJldCwgbXNfcmVtYWluOworCXN0cnVjdCB0aW1ldmFsIHN0YXJ0LCB0aW1lb3V0LCAqdGltZW91dHAgPSBOVUxMOworCisJc2V0cCA9IChmZF9zZXQgKil4Y2FsbG9jKGhvd21hbnkoYWN0aXZlX3N0YXRlLT5jb25uZWN0aW9uX291dCArIDEsCisJICAgIE5GREJJVFMpLCBzaXplb2YoZmRfbWFzaykpOworCXBhY2tldF93cml0ZV9wb2xsKCk7CisJd2hpbGUgKHBhY2tldF9oYXZlX2RhdGFfdG9fd3JpdGUoKSkgeworCQltZW1zZXQoc2V0cCwgMCwgaG93bWFueShhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25fb3V0ICsgMSwKKwkJICAgIE5GREJJVFMpICogc2l6ZW9mKGZkX21hc2spKTsKKwkJRkRfU0VUKGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9vdXQsIHNldHApOworCisJCWlmIChhY3RpdmVfc3RhdGUtPnBhY2tldF90aW1lb3V0X21zID4gMCkgeworCQkJbXNfcmVtYWluID0gYWN0aXZlX3N0YXRlLT5wYWNrZXRfdGltZW91dF9tczsKKwkJCXRpbWVvdXRwID0gJnRpbWVvdXQ7CisJCX0KKwkJZm9yICg7OykgeworCQkJaWYgKGFjdGl2ZV9zdGF0ZS0+cGFja2V0X3RpbWVvdXRfbXMgIT0gLTEpIHsKKwkJCQltc190b190aW1ldmFsKCZ0aW1lb3V0LCBtc19yZW1haW4pOworCQkJCWdldHRpbWVvZmRheSgmc3RhcnQsIE5VTEwpOworCQkJfQorCQkJaWYgKChyZXQgPSBzZWxlY3QoYWN0aXZlX3N0YXRlLT5jb25uZWN0aW9uX291dCArIDEsCisJCQkgICAgTlVMTCwgc2V0cCwgTlVMTCwgdGltZW91dHApKSA+PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKGVycm5vICE9IEVBR0FJTiAmJiBlcnJubyAhPSBFSU5UUiAmJgorCQkJICAgIGVycm5vICE9IEVXT1VMREJMT0NLKQorCQkJCWJyZWFrOworCQkJaWYgKGFjdGl2ZV9zdGF0ZS0+cGFja2V0X3RpbWVvdXRfbXMgPT0gLTEpCisJCQkJY29udGludWU7CisJCQltc19zdWJ0cmFjdF9kaWZmKCZzdGFydCwgJm1zX3JlbWFpbik7CisJCQlpZiAobXNfcmVtYWluIDw9IDApIHsKKwkJCQlyZXQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChyZXQgPT0gMCkgeworCQkJbG9naXQoIkNvbm5lY3Rpb24gdG8gJS4yMDBzIHRpbWVkIG91dCB3aGlsZSAiCisJCQkgICAgIndhaXRpbmcgdG8gd3JpdGUiLCBnZXRfcmVtb3RlX2lwYWRkcigpKTsKKwkJCWNsZWFudXBfZXhpdCgyNTUpOworCQl9CisJCXBhY2tldF93cml0ZV9wb2xsKCk7CisJfQorCXhmcmVlKHNldHApOworfQorCisvKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYnVmZmVyZWQgZGF0YSB0byB3cml0ZSB0byB0aGUgY29ubmVjdGlvbi4gKi8KKworaW50CitwYWNrZXRfaGF2ZV9kYXRhX3RvX3dyaXRlKHZvaWQpCit7CisJcmV0dXJuIGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+b3V0cHV0KSAhPSAwOworfQorCisvKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgbm90IHRvbyBtdWNoIGRhdGEgdG8gd3JpdGUgdG8gdGhlIGNvbm5lY3Rpb24uICovCisKK2ludAorcGFja2V0X25vdF92ZXJ5X211Y2hfZGF0YV90b193cml0ZSh2b2lkKQoreworCWlmIChhY3RpdmVfc3RhdGUtPmludGVyYWN0aXZlX21vZGUpCisJCXJldHVybiBidWZmZXJfbGVuKCZhY3RpdmVfc3RhdGUtPm91dHB1dCkgPCAxNjM4NDsKKwllbHNlCisJCXJldHVybiBidWZmZXJfbGVuKCZhY3RpdmVfc3RhdGUtPm91dHB1dCkgPCAxMjggKiAxMDI0OworfQorCitzdGF0aWMgdm9pZAorcGFja2V0X3NldF90b3MoaW50IHRvcykKK3sKKyNpZm5kZWYgSVBfVE9TX0lTX0JST0tFTgorCWlmICghcGFja2V0X2Nvbm5lY3Rpb25faXNfb25fc29ja2V0KCkpCisJCXJldHVybjsKKwlzd2l0Y2ggKHBhY2tldF9jb25uZWN0aW9uX2FmKCkpIHsKKyMgaWZkZWYgSVBfVE9TCisJY2FzZSBBRl9JTkVUOgorCQlkZWJ1ZzMoIiVzOiBzZXQgSVBfVE9TIDB4JTAyeCIsIF9fZnVuY19fLCB0b3MpOworCQlpZiAoc2V0c29ja29wdChhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25faW4sCisJCSAgICBJUFBST1RPX0lQLCBJUF9UT1MsICZ0b3MsIHNpemVvZih0b3MpKSA8IDApCisJCQllcnJvcigic2V0c29ja29wdCBJUF9UT1MgJWQ6ICUuMTAwczoiLAorCQkJICAgIHRvcywgc3RyZXJyb3IoZXJybm8pKTsKKwkJYnJlYWs7CisjIGVuZGlmIC8qIElQX1RPUyAqLworIyBpZmRlZiBJUFY2X1RDTEFTUworCWNhc2UgQUZfSU5FVDY6CisJCWRlYnVnMygiJXM6IHNldCBJUFY2X1RDTEFTUyAweCUwMngiLCBfX2Z1bmNfXywgdG9zKTsKKwkJaWYgKHNldHNvY2tvcHQoYWN0aXZlX3N0YXRlLT5jb25uZWN0aW9uX2luLAorCQkgICAgSVBQUk9UT19JUFY2LCBJUFY2X1RDTEFTUywgJnRvcywgc2l6ZW9mKHRvcykpIDwgMCkKKwkJCWVycm9yKCJzZXRzb2Nrb3B0IElQVjZfVENMQVNTICVkOiAlLjEwMHM6IiwKKwkJCSAgICB0b3MsIHN0cmVycm9yKGVycm5vKSk7CisJCWJyZWFrOworIyBlbmRpZiAvKiBJUFY2X1RDTEFTUyAqLworCX0KKyNlbmRpZiAvKiBJUF9UT1NfSVNfQlJPS0VOICovCit9CisKKy8qIEluZm9ybXMgdGhhdCB0aGUgY3VycmVudCBzZXNzaW9uIGlzIGludGVyYWN0aXZlLiAgU2V0cyBJUCBmbGFncyBmb3IgdGhhdC4gKi8KKwordm9pZAorcGFja2V0X3NldF9pbnRlcmFjdGl2ZShpbnQgaW50ZXJhY3RpdmUsIGludCBxb3NfaW50ZXJhY3RpdmUsIGludCBxb3NfYnVsaykKK3sKKwlpZiAoYWN0aXZlX3N0YXRlLT5zZXRfaW50ZXJhY3RpdmVfY2FsbGVkKQorCQlyZXR1cm47CisJYWN0aXZlX3N0YXRlLT5zZXRfaW50ZXJhY3RpdmVfY2FsbGVkID0gMTsKKworCS8qIFJlY29yZCB0aGF0IHdlIGFyZSBpbiBpbnRlcmFjdGl2ZSBtb2RlLiAqLworCWFjdGl2ZV9zdGF0ZS0+aW50ZXJhY3RpdmVfbW9kZSA9IGludGVyYWN0aXZlOworCisJLyogT25seSBzZXQgc29ja2V0IG9wdGlvbnMgaWYgdXNpbmcgYSBzb2NrZXQuICAqLworCWlmICghcGFja2V0X2Nvbm5lY3Rpb25faXNfb25fc29ja2V0KCkpCisJCXJldHVybjsKKwlzZXRfbm9kZWxheShhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25faW4pOworCXBhY2tldF9zZXRfdG9zKGludGVyYWN0aXZlID8gcW9zX2ludGVyYWN0aXZlIDogcW9zX2J1bGspOworfQorCisvKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBpcyBpbnRlcmFjdGl2ZS4gKi8KKworaW50CitwYWNrZXRfaXNfaW50ZXJhY3RpdmUodm9pZCkKK3sKKwlyZXR1cm4gYWN0aXZlX3N0YXRlLT5pbnRlcmFjdGl2ZV9tb2RlOworfQorCitpbnQKK3BhY2tldF9zZXRfbWF4c2l6ZSh1X2ludCBzKQoreworCWlmIChhY3RpdmVfc3RhdGUtPnNldF9tYXhzaXplX2NhbGxlZCkgeworCQlsb2dpdCgicGFja2V0X3NldF9tYXhzaXplOiBjYWxsZWQgdHdpY2U6IG9sZCAlZCBuZXcgJWQiLAorCQkgICAgYWN0aXZlX3N0YXRlLT5tYXhfcGFja2V0X3NpemUsIHMpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChzIDwgNCAqIDEwMjQgfHwgcyA+IDEwMjQgKiAxMDI0KSB7CisJCWxvZ2l0KCJwYWNrZXRfc2V0X21heHNpemU6IGJhZCBzaXplICVkIiwgcyk7CisJCXJldHVybiAtMTsKKwl9CisJYWN0aXZlX3N0YXRlLT5zZXRfbWF4c2l6ZV9jYWxsZWQgPSAxOworCWRlYnVnKCJwYWNrZXRfc2V0X21heHNpemU6IHNldHRpbmcgdG8gJWQiLCBzKTsKKwlhY3RpdmVfc3RhdGUtPm1heF9wYWNrZXRfc2l6ZSA9IHM7CisJcmV0dXJuIHM7Cit9CisKK2ludAorcGFja2V0X2luY19hbGl2ZV90aW1lb3V0cyh2b2lkKQoreworCXJldHVybiArK2FjdGl2ZV9zdGF0ZS0+a2VlcF9hbGl2ZV90aW1lb3V0czsKK30KKwordm9pZAorcGFja2V0X3NldF9hbGl2ZV90aW1lb3V0cyhpbnQga2EpCit7CisJYWN0aXZlX3N0YXRlLT5rZWVwX2FsaXZlX3RpbWVvdXRzID0ga2E7Cit9CisKK3VfaW50CitwYWNrZXRfZ2V0X21heHNpemUodm9pZCkKK3sKKwlyZXR1cm4gYWN0aXZlX3N0YXRlLT5tYXhfcGFja2V0X3NpemU7Cit9CisKKy8qIHJvdW5kdXAgY3VycmVudCBtZXNzYWdlIHRvIHBhZCBieXRlcyAqLwordm9pZAorcGFja2V0X2FkZF9wYWRkaW5nKHVfY2hhciBwYWQpCit7CisJYWN0aXZlX3N0YXRlLT5leHRyYV9wYWQgPSBwYWQ7Cit9CisKKy8qCisgKiA5LjIuICBJZ25vcmVkIERhdGEgTWVzc2FnZQorICoKKyAqICAgYnl0ZSAgICAgIFNTSF9NU0dfSUdOT1JFCisgKiAgIHN0cmluZyAgICBkYXRhCisgKgorICogQWxsIGltcGxlbWVudGF0aW9ucyBNVVNUIHVuZGVyc3RhbmQgKGFuZCBpZ25vcmUpIHRoaXMgbWVzc2FnZSBhdCBhbnkKKyAqIHRpbWUgKGFmdGVyIHJlY2VpdmluZyB0aGUgcHJvdG9jb2wgdmVyc2lvbikuIE5vIGltcGxlbWVudGF0aW9uIGlzCisgKiByZXF1aXJlZCB0byBzZW5kIHRoZW0uIFRoaXMgbWVzc2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBhZGRpdGlvbmFsCisgKiBwcm90ZWN0aW9uIG1lYXN1cmUgYWdhaW5zdCBhZHZhbmNlZCB0cmFmZmljIGFuYWx5c2lzIHRlY2huaXF1ZXMuCisgKi8KK3ZvaWQKK3BhY2tldF9zZW5kX2lnbm9yZShpbnQgbmJ5dGVzKQoreworCXVfaW50MzJfdCBybmQgPSAwOworCWludCBpOworCisJcGFja2V0X3N0YXJ0KGNvbXBhdDIwID8gU1NIMl9NU0dfSUdOT1JFIDogU1NIX01TR19JR05PUkUpOworCXBhY2tldF9wdXRfaW50KG5ieXRlcyk7CisJZm9yIChpID0gMDsgaSA8IG5ieXRlczsgaSsrKSB7CisJCWlmIChpICUgNCA9PSAwKQorCQkJcm5kID0gYXJjNHJhbmRvbSgpOworCQlwYWNrZXRfcHV0X2NoYXIoKHVfY2hhcilybmQgJiAweGZmKTsKKwkJcm5kID4+PSA4OworCX0KK30KKworI2RlZmluZSBNQVhfUEFDS0VUUwkoMVU8PDMxKQoraW50CitwYWNrZXRfbmVlZF9yZWtleWluZyh2b2lkKQoreworCWlmIChkYXRhZmVsbG93cyAmIFNTSF9CVUdfTk9SRUtFWSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuCisJICAgIChhY3RpdmVfc3RhdGUtPnBfc2VuZC5wYWNrZXRzID4gTUFYX1BBQ0tFVFMpIHx8CisJICAgIChhY3RpdmVfc3RhdGUtPnBfcmVhZC5wYWNrZXRzID4gTUFYX1BBQ0tFVFMpIHx8CisJICAgIChhY3RpdmVfc3RhdGUtPm1heF9ibG9ja3Nfb3V0ICYmCisJICAgICAgICAoYWN0aXZlX3N0YXRlLT5wX3NlbmQuYmxvY2tzID4gYWN0aXZlX3N0YXRlLT5tYXhfYmxvY2tzX291dCkpIHx8CisJICAgIChhY3RpdmVfc3RhdGUtPm1heF9ibG9ja3NfaW4gJiYKKwkgICAgICAgIChhY3RpdmVfc3RhdGUtPnBfcmVhZC5ibG9ja3MgPiBhY3RpdmVfc3RhdGUtPm1heF9ibG9ja3NfaW4pKTsKK30KKwordm9pZAorcGFja2V0X3NldF9yZWtleV9saW1pdCh1X2ludDMyX3QgYnl0ZXMpCit7CisJYWN0aXZlX3N0YXRlLT5yZWtleV9saW1pdCA9IGJ5dGVzOworfQorCit2b2lkCitwYWNrZXRfc2V0X3NlcnZlcih2b2lkKQoreworCWFjdGl2ZV9zdGF0ZS0+c2VydmVyX3NpZGUgPSAxOworfQorCit2b2lkCitwYWNrZXRfc2V0X2F1dGhlbnRpY2F0ZWQodm9pZCkKK3sKKwlhY3RpdmVfc3RhdGUtPmFmdGVyX2F1dGhlbnRpY2F0aW9uID0gMTsKK30KKwordm9pZCAqCitwYWNrZXRfZ2V0X2lucHV0KHZvaWQpCit7CisJcmV0dXJuICh2b2lkICopJmFjdGl2ZV9zdGF0ZS0+aW5wdXQ7Cit9CisKK3ZvaWQgKgorcGFja2V0X2dldF9vdXRwdXQodm9pZCkKK3sKKwlyZXR1cm4gKHZvaWQgKikmYWN0aXZlX3N0YXRlLT5vdXRwdXQ7Cit9CisKK3ZvaWQgKgorcGFja2V0X2dldF9uZXdrZXlzKGludCBtb2RlKQoreworCXJldHVybiAodm9pZCAqKWFjdGl2ZV9zdGF0ZS0+bmV3a2V5c1ttb2RlXTsKK30KKworLyoKKyAqIFNhdmUgdGhlIHN0YXRlIGZvciB0aGUgcmVhbCBjb25uZWN0aW9uLCBhbmQgdXNlIGEgc2VwYXJhdGUgc3RhdGUgd2hlbgorICogcmVzdW1pbmcgYSBzdXNwZW5kZWQgY29ubmVjdGlvbi4KKyAqLwordm9pZAorcGFja2V0X2JhY2t1cF9zdGF0ZSh2b2lkKQoreworCXN0cnVjdCBzZXNzaW9uX3N0YXRlICp0bXA7CisKKwljbG9zZShhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25faW4pOworCWFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9pbiA9IC0xOworCWNsb3NlKGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9vdXQpOworCWFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9vdXQgPSAtMTsKKwlpZiAoYmFja3VwX3N0YXRlKQorCQl0bXAgPSBiYWNrdXBfc3RhdGU7CisJZWxzZQorCQl0bXAgPSBhbGxvY19zZXNzaW9uX3N0YXRlKCk7CisJYmFja3VwX3N0YXRlID0gYWN0aXZlX3N0YXRlOworCWFjdGl2ZV9zdGF0ZSA9IHRtcDsKK30KKworLyoKKyAqIFN3YXAgaW4gdGhlIG9sZCBzdGF0ZSB3aGVuIHJlc3VtaW5nIGEgY29ubmVjaW9uLgorICovCit2b2lkCitwYWNrZXRfcmVzdG9yZV9zdGF0ZSh2b2lkKQoreworCXN0cnVjdCBzZXNzaW9uX3N0YXRlICp0bXA7CisJdm9pZCAqYnVmOworCXVfaW50IGxlbjsKKworCXRtcCA9IGJhY2t1cF9zdGF0ZTsKKwliYWNrdXBfc3RhdGUgPSBhY3RpdmVfc3RhdGU7CisJYWN0aXZlX3N0YXRlID0gdG1wOworCWFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9pbiA9IGJhY2t1cF9zdGF0ZS0+Y29ubmVjdGlvbl9pbjsKKwliYWNrdXBfc3RhdGUtPmNvbm5lY3Rpb25faW4gPSAtMTsKKwlhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25fb3V0ID0gYmFja3VwX3N0YXRlLT5jb25uZWN0aW9uX291dDsKKwliYWNrdXBfc3RhdGUtPmNvbm5lY3Rpb25fb3V0ID0gLTE7CisJbGVuID0gYnVmZmVyX2xlbigmYmFja3VwX3N0YXRlLT5pbnB1dCk7CisJaWYgKGxlbiA+IDApIHsKKwkJYnVmID0gYnVmZmVyX3B0cigmYmFja3VwX3N0YXRlLT5pbnB1dCk7CisJCWJ1ZmZlcl9hcHBlbmQoJmFjdGl2ZV9zdGF0ZS0+aW5wdXQsIGJ1ZiwgbGVuKTsKKwkJYnVmZmVyX2NsZWFyKCZiYWNrdXBfc3RhdGUtPmlucHV0KTsKKwkJYWRkX3JlY3ZfYnl0ZXMobGVuKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3BhY2tldC5oIGIvb3BlbnNzaC02LjBwMS9wYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWJhMDc5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9wYWNrZXQuaApAQCAtMCwwICsxLDEyNiBAQAorLyogJE9wZW5CU0Q6IHBhY2tldC5oLHYgMS41NyAyMDEyLzAxLzI1IDE5OjQwOjA5IG1hcmt1cyBFeHAgJCAqLworCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICogSW50ZXJmYWNlIGZvciB0aGUgcGFja2V0IHByb3RvY29sIGZ1bmN0aW9ucy4KKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICovCisKKyNpZm5kZWYgUEFDS0VUX0gKKyNkZWZpbmUgUEFDS0VUX0gKKworI2luY2x1ZGUgPHRlcm1pb3MuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKKyNpbmNsdWRlIDxvcGVuc3NsL2VjLmg+CisjZW5kaWYKKwordm9pZCAgICAgcGFja2V0X3NldF9jb25uZWN0aW9uKGludCwgaW50KTsKK3ZvaWQgICAgIHBhY2tldF9zZXRfdGltZW91dChpbnQsIGludCk7Cit2b2lkICAgICBwYWNrZXRfc2V0X25vbmJsb2NraW5nKHZvaWQpOworaW50ICAgICAgcGFja2V0X2dldF9jb25uZWN0aW9uX2luKHZvaWQpOworaW50ICAgICAgcGFja2V0X2dldF9jb25uZWN0aW9uX291dCh2b2lkKTsKK3ZvaWQgICAgIHBhY2tldF9jbG9zZSh2b2lkKTsKK3ZvaWQJIHBhY2tldF9zZXRfZW5jcnlwdGlvbl9rZXkoY29uc3QgdV9jaGFyICosIHVfaW50LCBpbnQpOwordV9pbnQJIHBhY2tldF9nZXRfZW5jcnlwdGlvbl9rZXkodV9jaGFyICopOwordm9pZCAgICAgcGFja2V0X3NldF9wcm90b2NvbF9mbGFncyh1X2ludCk7Cit1X2ludAkgcGFja2V0X2dldF9wcm90b2NvbF9mbGFncyh2b2lkKTsKK3ZvaWQgICAgIHBhY2tldF9zdGFydF9jb21wcmVzc2lvbihpbnQpOwordm9pZCAgICAgcGFja2V0X3NldF9pbnRlcmFjdGl2ZShpbnQsIGludCwgaW50KTsKK2ludCAgICAgIHBhY2tldF9pc19pbnRlcmFjdGl2ZSh2b2lkKTsKK3ZvaWQgICAgIHBhY2tldF9zZXRfc2VydmVyKHZvaWQpOwordm9pZCAgICAgcGFja2V0X3NldF9hdXRoZW50aWNhdGVkKHZvaWQpOworCit2b2lkICAgICBwYWNrZXRfc3RhcnQodV9jaGFyKTsKK3ZvaWQgICAgIHBhY2tldF9wdXRfY2hhcihpbnQgY2gpOwordm9pZCAgICAgcGFja2V0X3B1dF9pbnQodV9pbnQgdmFsdWUpOwordm9pZCAgICAgcGFja2V0X3B1dF9pbnQ2NCh1X2ludDY0X3QgdmFsdWUpOwordm9pZCAgICAgcGFja2V0X3B1dF9iaWdudW0oQklHTlVNICogdmFsdWUpOwordm9pZCAgICAgcGFja2V0X3B1dF9iaWdudW0yKEJJR05VTSAqIHZhbHVlKTsKKyNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKK3ZvaWQgICAgIHBhY2tldF9wdXRfZWNwb2ludChjb25zdCBFQ19HUk9VUCAqLCBjb25zdCBFQ19QT0lOVCAqKTsKKyNlbmRpZgordm9pZCAgICAgcGFja2V0X3B1dF9zdHJpbmcoY29uc3Qgdm9pZCAqYnVmLCB1X2ludCBsZW4pOwordm9pZCAgICAgcGFja2V0X3B1dF9jc3RyaW5nKGNvbnN0IGNoYXIgKnN0cik7Cit2b2lkICAgICBwYWNrZXRfcHV0X3Jhdyhjb25zdCB2b2lkICpidWYsIHVfaW50IGxlbik7Cit2b2lkICAgICBwYWNrZXRfc2VuZCh2b2lkKTsKKworaW50ICAgICAgcGFja2V0X3JlYWQodm9pZCk7Cit2b2lkICAgICBwYWNrZXRfcmVhZF9leHBlY3QoaW50IHR5cGUpOwordm9pZCAgICAgcGFja2V0X3Byb2Nlc3NfaW5jb21pbmcoY29uc3QgY2hhciAqYnVmLCB1X2ludCBsZW4pOworaW50ICAgICAgcGFja2V0X3JlYWRfc2VxbnIodV9pbnQzMl90ICpzZXFucl9wKTsKK2ludCAgICAgIHBhY2tldF9yZWFkX3BvbGxfc2VxbnIodV9pbnQzMl90ICpzZXFucl9wKTsKKwordV9pbnQJIHBhY2tldF9nZXRfY2hhcih2b2lkKTsKK3VfaW50CSBwYWNrZXRfZ2V0X2ludCh2b2lkKTsKK3VfaW50NjRfdCBwYWNrZXRfZ2V0X2ludDY0KHZvaWQpOwordm9pZCAgICAgcGFja2V0X2dldF9iaWdudW0oQklHTlVNICogdmFsdWUpOwordm9pZCAgICAgcGFja2V0X2dldF9iaWdudW0yKEJJR05VTSAqIHZhbHVlKTsKKyNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKK3ZvaWQJIHBhY2tldF9nZXRfZWNwb2ludChjb25zdCBFQ19HUk9VUCAqLCBFQ19QT0lOVCAqKTsKKyNlbmRpZgordm9pZAkqcGFja2V0X2dldF9yYXcodV9pbnQgKmxlbmd0aF9wdHIpOwordm9pZAkqcGFja2V0X2dldF9zdHJpbmcodV9pbnQgKmxlbmd0aF9wdHIpOworY2hhcgkqcGFja2V0X2dldF9jc3RyaW5nKHVfaW50ICpsZW5ndGhfcHRyKTsKK3ZvaWQJKnBhY2tldF9nZXRfc3RyaW5nX3B0cih1X2ludCAqbGVuZ3RoX3B0cik7Cit2b2lkICAgICBwYWNrZXRfZGlzY29ubmVjdChjb25zdCBjaGFyICpmbXQsLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpOwordm9pZCAgICAgcGFja2V0X3NlbmRfZGVidWcoY29uc3QgY2hhciAqZm10LC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKKwordm9pZAkgc2V0X25ld2tleXMoaW50IG1vZGUpOworaW50CSBwYWNrZXRfZ2V0X2tleWl2X2xlbihpbnQpOwordm9pZAkgcGFja2V0X2dldF9rZXlpdihpbnQsIHVfY2hhciAqLCB1X2ludCk7CitpbnQJIHBhY2tldF9nZXRfa2V5Y29udGV4dChpbnQsIHVfY2hhciAqKTsKK3ZvaWQJIHBhY2tldF9zZXRfa2V5Y29udGV4dChpbnQsIHVfY2hhciAqKTsKK3ZvaWQJIHBhY2tldF9nZXRfc3RhdGUoaW50LCB1X2ludDMyX3QgKiwgdV9pbnQ2NF90ICosIHVfaW50MzJfdCAqLCB1X2ludDY0X3QgKik7Cit2b2lkCSBwYWNrZXRfc2V0X3N0YXRlKGludCwgdV9pbnQzMl90LCB1X2ludDY0X3QsIHVfaW50MzJfdCwgdV9pbnQ2NF90KTsKK2ludAkgcGFja2V0X2dldF9zc2gxX2NpcGhlcih2b2lkKTsKK3ZvaWQJIHBhY2tldF9zZXRfaXYoaW50LCB1X2NoYXIgKik7Cit2b2lkCSpwYWNrZXRfZ2V0X25ld2tleXMoaW50KTsKKwordm9pZCAgICAgcGFja2V0X3dyaXRlX3BvbGwodm9pZCk7Cit2b2lkICAgICBwYWNrZXRfd3JpdGVfd2FpdCh2b2lkKTsKK2ludCAgICAgIHBhY2tldF9oYXZlX2RhdGFfdG9fd3JpdGUodm9pZCk7CitpbnQgICAgICBwYWNrZXRfbm90X3ZlcnlfbXVjaF9kYXRhX3RvX3dyaXRlKHZvaWQpOworCitpbnQJIHBhY2tldF9jb25uZWN0aW9uX2lzX29uX3NvY2tldCh2b2lkKTsKK2ludAkgcGFja2V0X3JlbWFpbmluZyh2b2lkKTsKK3ZvaWQJIHBhY2tldF9zZW5kX2lnbm9yZShpbnQpOwordm9pZAkgcGFja2V0X2FkZF9wYWRkaW5nKHVfY2hhcik7CisKK3ZvaWQJIHR0eV9tYWtlX21vZGVzKGludCwgc3RydWN0IHRlcm1pb3MgKik7Cit2b2lkCSB0dHlfcGFyc2VfbW9kZXMoaW50LCBpbnQgKik7CisKK3ZvaWQJIHBhY2tldF9zZXRfYWxpdmVfdGltZW91dHMoaW50KTsKK2ludAkgcGFja2V0X2luY19hbGl2ZV90aW1lb3V0cyh2b2lkKTsKK2ludAkgcGFja2V0X3NldF9tYXhzaXplKHVfaW50KTsKK3VfaW50CSBwYWNrZXRfZ2V0X21heHNpemUodm9pZCk7CisKKy8qIGRvbid0IGFsbG93IHJlbWFpbmluZyBieXRlcyBhZnRlciB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlICovCisjZGVmaW5lIHBhY2tldF9jaGVja19lb20oKSBcCitkbyB7IFwKKwlpbnQgX2xlbiA9IHBhY2tldF9yZW1haW5pbmcoKTsgXAorCWlmIChfbGVuID4gMCkgeyBcCisJCWxvZ2l0KCJQYWNrZXQgaW50ZWdyaXR5IGVycm9yICglZCBieXRlcyByZW1haW5pbmcpIGF0ICVzOiVkIiwgXAorCQkgICAgX2xlbiAsX19GSUxFX18sIF9fTElORV9fKTsgXAorCQlwYWNrZXRfZGlzY29ubmVjdCgiUGFja2V0IGludGVncml0eSBlcnJvci4iKTsgXAorCX0gXAorfSB3aGlsZSAoMCkKKworaW50CSBwYWNrZXRfbmVlZF9yZWtleWluZyh2b2lkKTsKK3ZvaWQJIHBhY2tldF9zZXRfcmVrZXlfbGltaXQodV9pbnQzMl90KTsKKwordm9pZAkgcGFja2V0X2JhY2t1cF9zdGF0ZSh2b2lkKTsKK3ZvaWQJIHBhY2tldF9yZXN0b3JlX3N0YXRlKHZvaWQpOworCit2b2lkCSpwYWNrZXRfZ2V0X2lucHV0KHZvaWQpOwordm9pZAkqcGFja2V0X2dldF9vdXRwdXQodm9pZCk7CisKKyNlbmRpZgkJCQkvKiBQQUNLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9wYXRobmFtZXMuaCBiL29wZW5zc2gtNi4wcDEvcGF0aG5hbWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkOWFiZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcGF0aG5hbWVzLmgKQEAgLTAsMCArMSwxODEgQEAKKy8qICRPcGVuQlNEOiBwYXRobmFtZXMuaCx2IDEuMjIgMjAxMS8wNS8yMyAwMzozMDowNyBkam0gRXhwICQgKi8KKworLyoKKyAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAorICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICovCisKKyNkZWZpbmUgRVRDRElSCQkJCSIvZXRjIgorCisjaWZuZGVmIFNTSERJUgorI2RlZmluZSBTU0hESVIJCQkJRVRDRElSICIvc3NoIgorI2VuZGlmCisKKyNpZm5kZWYgX1BBVEhfU1NIX1BJRERJUgorI2RlZmluZSBfUEFUSF9TU0hfUElERElSCQkiL3Zhci9ydW4iCisjZW5kaWYKKworLyoKKyAqIFN5c3RlbS13aWRlIGZpbGUgY29udGFpbmluZyBob3N0IGtleXMgb2Yga25vd24gaG9zdHMuICBUaGlzIGZpbGUgc2hvdWxkIGJlCisgKiB3b3JsZC1yZWFkYWJsZS4KKyAqLworI2RlZmluZSBfUEFUSF9TU0hfU1lTVEVNX0hPU1RGSUxFCVNTSERJUiAiL3NzaF9rbm93bl9ob3N0cyIKKy8qIGJhY2t3YXJkIGNvbXBhdCBmb3IgcHJvdG9jb2wgMiAqLworI2RlZmluZSBfUEFUSF9TU0hfU1lTVEVNX0hPU1RGSUxFMglTU0hESVIgIi9zc2hfa25vd25faG9zdHMyIgorCisvKgorICogT2YgdGhlc2UsIHNzaF9ob3N0X2tleSBtdXN0IGJlIHJlYWRhYmxlIG9ubHkgYnkgcm9vdCwgd2hlcmVhcyBzc2hfY29uZmlnCisgKiBzaG91bGQgYmUgd29ybGQtcmVhZGFibGUuCisgKi8KKyNkZWZpbmUgX1BBVEhfU0VSVkVSX0NPTkZJR19GSUxFCVNTSERJUiAiL3NzaGRfY29uZmlnIgorI2RlZmluZSBfUEFUSF9IT1NUX0NPTkZJR19GSUxFCQlTU0hESVIgIi9zc2hfY29uZmlnIgorI2RlZmluZSBfUEFUSF9IT1NUX0tFWV9GSUxFCQlTU0hESVIgIi9zc2hfaG9zdF9rZXkiCisjZGVmaW5lIF9QQVRIX0hPU1RfRFNBX0tFWV9GSUxFCQlTU0hESVIgIi9zc2hfaG9zdF9kc2Ffa2V5IgorI2RlZmluZSBfUEFUSF9IT1NUX0VDRFNBX0tFWV9GSUxFCVNTSERJUiAiL3NzaF9ob3N0X2VjZHNhX2tleSIKKyNkZWZpbmUgX1BBVEhfSE9TVF9SU0FfS0VZX0ZJTEUJCVNTSERJUiAiL3NzaF9ob3N0X3JzYV9rZXkiCisjZGVmaW5lIF9QQVRIX0RIX01PRFVMSQkJCVNTSERJUiAiL21vZHVsaSIKKy8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIF9QQVRIX0RIX1BSSU1FUwkJCVNTSERJUiAiL3ByaW1lcyIKKworI2lmbmRlZiBfUEFUSF9TU0hfUFJPR1JBTQorI2RlZmluZSBfUEFUSF9TU0hfUFJPR1JBTQkJIi91c3IvYmluL3NzaCIKKyNlbmRpZgorCisvKgorICogVGhlIHByb2Nlc3MgaWQgb2YgdGhlIGRhZW1vbiBsaXN0ZW5pbmcgZm9yIGNvbm5lY3Rpb25zIGlzIHNhdmVkIGhlcmUgdG8KKyAqIG1ha2UgaXQgZWFzaWVyIHRvIGtpbGwgdGhlIGNvcnJlY3QgZGFlbW9uIHdoZW4gbmVjZXNzYXJ5LgorICovCisjZGVmaW5lIF9QQVRIX1NTSF9EQUVNT05fUElEX0ZJTEUJX1BBVEhfU1NIX1BJRERJUiAiL3NzaGQucGlkIgorCisvKgorICogVGhlIGRpcmVjdG9yeSBpbiB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGZpbGVzIHJlc2lkZS4gVGhlCisgKiBkaXJlY3Rvcnkgc2hvdWxkIGJlIHdvcmxkLXJlYWRhYmxlICh0aG91Z2ggbm90IGFsbCBmaWxlcyBhcmUpLgorICovCisjZGVmaW5lIF9QQVRIX1NTSF9VU0VSX0RJUgkJIi5zc2giCisKKy8qCisgKiBQZXItdXNlciBmaWxlIGNvbnRhaW5pbmcgaG9zdCBrZXlzIG9mIGtub3duIGhvc3RzLiAgVGhpcyBmaWxlIG5lZWQgbm90IGJlCisgKiByZWFkYWJsZSBieSBhbnlvbmUgZXhjZXB0IHRoZSB1c2VyIGhpbS9oZXJzZWxmLCB0aG91Z2ggdGhpcyBkb2VzIG5vdAorICogY29udGFpbiBhbnl0aGluZyBwYXJ0aWN1bGFybHkgc2VjcmV0LgorICovCisjZGVmaW5lIF9QQVRIX1NTSF9VU0VSX0hPU1RGSUxFCQkifi8uc3NoL2tub3duX2hvc3RzIgorLyogYmFja3dhcmQgY29tcGF0IGZvciBwcm90b2NvbCAyICovCisjZGVmaW5lIF9QQVRIX1NTSF9VU0VSX0hPU1RGSUxFMgkifi8uc3NoL2tub3duX2hvc3RzMiIKKworLyoKKyAqIE5hbWUgb2YgdGhlIGRlZmF1bHQgZmlsZSBjb250YWluaW5nIGNsaWVudC1zaWRlIGF1dGhlbnRpY2F0aW9uIGtleS4gVGhpcworICogZmlsZSBzaG91bGQgb25seSBiZSByZWFkYWJsZSBieSB0aGUgdXNlciBoaW0vaGVyc2VsZi4KKyAqLworI2RlZmluZSBfUEFUSF9TU0hfQ0xJRU5UX0lERU5USVRZCSIuc3NoL2lkZW50aXR5IgorI2RlZmluZSBfUEFUSF9TU0hfQ0xJRU5UX0lEX0RTQQkJIi5zc2gvaWRfZHNhIgorI2RlZmluZSBfUEFUSF9TU0hfQ0xJRU5UX0lEX0VDRFNBCSIuc3NoL2lkX2VjZHNhIgorI2RlZmluZSBfUEFUSF9TU0hfQ0xJRU5UX0lEX1JTQQkJIi5zc2gvaWRfcnNhIgorCisvKgorICogQ29uZmlndXJhdGlvbiBmaWxlIGluIHVzZXIncyBob21lIGRpcmVjdG9yeS4gIFRoaXMgZmlsZSBuZWVkIG5vdCBiZQorICogcmVhZGFibGUgYnkgYW55b25lIGJ1dCB0aGUgdXNlciBoaW0vaGVyc2VsZiwgYnV0IGRvZXMgbm90IGNvbnRhaW4gYW55dGhpbmcKKyAqIHBhcnRpY3VsYXJseSBzZWNyZXQuICBJZiB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5IHJlc2lkZXMgb24gYW4gTkZTCisgKiB2b2x1bWUgd2hlcmUgcm9vdCBpcyBtYXBwZWQgdG8gbm9ib2R5LCB0aGlzIG1heSBuZWVkIHRvIGJlIHdvcmxkLXJlYWRhYmxlLgorICovCisjZGVmaW5lIF9QQVRIX1NTSF9VU0VSX0NPTkZGSUxFCQkiLnNzaC9jb25maWciCisKKy8qCisgKiBGaWxlIGNvbnRhaW5pbmcgYSBsaXN0IG9mIHRob3NlIHJzYSBrZXlzIHRoYXQgcGVybWl0IGxvZ2dpbmcgaW4gYXMgdGhpcworICogdXNlci4gIFRoaXMgZmlsZSBuZWVkIG5vdCBiZSByZWFkYWJsZSBieSBhbnlvbmUgYnV0IHRoZSB1c2VyIGhpbS9oZXJzZWxmLAorICogYnV0IGRvZXMgbm90IGNvbnRhaW4gYW55dGhpbmcgcGFydGljdWxhcmx5IHNlY3JldC4gIElmIHRoZSB1c2VyJ3MgaG9tZQorICogZGlyZWN0b3J5IHJlc2lkZXMgb24gYW4gTkZTIHZvbHVtZSB3aGVyZSByb290IGlzIG1hcHBlZCB0byBub2JvZHksIHRoaXMKKyAqIG1heSBuZWVkIHRvIGJlIHdvcmxkLXJlYWRhYmxlLiAgKFRoaXMgZmlsZSBpcyByZWFkIGJ5IHRoZSBkYWVtb24gd2hpY2ggaXMKKyAqIHJ1bm5pbmcgYXMgcm9vdC4pCisgKi8KKyNkZWZpbmUgX1BBVEhfU1NIX1VTRVJfUEVSTUlUVEVEX0tFWVMJIi5zc2gvYXV0aG9yaXplZF9rZXlzIgorCisvKiBiYWNrd2FyZCBjb21wYXQgZm9yIHByb3RvY29sIHYyICovCisjZGVmaW5lIF9QQVRIX1NTSF9VU0VSX1BFUk1JVFRFRF9LRVlTMgkiLnNzaC9hdXRob3JpemVkX2tleXMyIgorCisvKgorICogUGVyLXVzZXIgYW5kIHN5c3RlbS13aWRlIHNzaCAicmMiIGZpbGVzLiAgVGhlc2UgZmlsZXMgYXJlIGV4ZWN1dGVkIHdpdGgKKyAqIC9iaW4vc2ggYmVmb3JlIHN0YXJ0aW5nIHRoZSBzaGVsbCBvciBjb21tYW5kIGlmIHRoZXkgZXhpc3QuICBUaGV5IHdpbGwgYmUKKyAqIHBhc3NlZCAicHJvdG8gY29va2llIiBhcyBhcmd1bWVudHMgaWYgWDExIGZvcndhcmRpbmcgd2l0aCBzcG9vZmluZyBpcyBpbgorICogdXNlLiAgeGF1dGggd2lsbCBiZSBydW4gaWYgbmVpdGhlciBvZiB0aGVzZSBleGlzdHMuCisgKi8KKyNkZWZpbmUgX1BBVEhfU1NIX1VTRVJfUkMJCSIuc3NoL3JjIgorI2RlZmluZSBfUEFUSF9TU0hfU1lTVEVNX1JDCQlTU0hESVIgIi9zc2hyYyIKKworLyoKKyAqIFNzaC1vbmx5IHZlcnNpb24gb2YgL2V0Yy9ob3N0cy5lcXVpdi4gIEFkZGl0aW9uYWxseSwgdGhlIGRhZW1vbiBtYXkgdXNlCisgKiB+Ly5yaG9zdHMgYW5kIC9ldGMvaG9zdHMuZXF1aXYgaWYgcmhvc3RzIGF1dGhlbnRpY2F0aW9uIGlzIGVuYWJsZWQuCisgKi8KKyNkZWZpbmUgX1BBVEhfU1NIX0hPU1RTX0VRVUlWCQlTU0hESVIgIi9zaG9zdHMuZXF1aXYiCisjZGVmaW5lIF9QQVRIX1JIT1NUU19FUVVJVgkJIi9ldGMvaG9zdHMuZXF1aXYiCisKKy8qCisgKiBEZWZhdWx0IGxvY2F0aW9uIG9mIGFza3Bhc3MKKyAqLworI2lmbmRlZiBfUEFUSF9TU0hfQVNLUEFTU19ERUZBVUxUCisjZGVmaW5lIF9QQVRIX1NTSF9BU0tQQVNTX0RFRkFVTFQJIi91c3IvWDExUjYvYmluL3NzaC1hc2twYXNzIgorI2VuZGlmCisKKy8qIExvY2F0aW9uIG9mIHNzaC1rZXlzaWduIGZvciBob3N0YmFzZWQgYXV0aGVudGljYXRpb24gKi8KKyNpZm5kZWYgX1BBVEhfU1NIX0tFWV9TSUdOCisjZGVmaW5lIF9QQVRIX1NTSF9LRVlfU0lHTgkJIi91c3IvbGliZXhlYy9zc2gta2V5c2lnbiIKKyNlbmRpZgorCisvKiBMb2NhdGlvbiBvZiBzc2gtcGtjczExLWhlbHBlciB0byBzdXBwb3J0IGtleXMgaW4gdG9rZW5zICovCisjaWZuZGVmIF9QQVRIX1NTSF9QS0NTMTFfSEVMUEVSCisjZGVmaW5lIF9QQVRIX1NTSF9QS0NTMTFfSEVMUEVSCQkiL3Vzci9saWJleGVjL3NzaC1wa2NzMTEtaGVscGVyIgorI2VuZGlmCisKKy8qIHhhdXRoIGZvciBYMTEgZm9yd2FyZGluZyAqLworI2lmbmRlZiBfUEFUSF9YQVVUSAorI2RlZmluZSBfUEFUSF9YQVVUSAkJCSIvdXNyL1gxMVI2L2Jpbi94YXV0aCIKKyNlbmRpZgorCisvKiBVTklYIGRvbWFpbiBzb2NrZXQgZm9yIFgxMSBzZXJ2ZXI7IGRpc3BsYXludW0gd2lsbCByZXBsYWNlICV1ICovCisjaWZuZGVmIF9QQVRIX1VOSVhfWAorI2RlZmluZSBfUEFUSF9VTklYX1ggIi90bXAvLlgxMS11bml4L1gldSIKKyNlbmRpZgorCisvKiBmb3Igc2NwICovCisjaWZuZGVmIF9QQVRIX0NQCisjZGVmaW5lIF9QQVRIX0NQCQkJImNwIgorI2VuZGlmCisKKy8qIGZvciBzZnRwICovCisjaWZuZGVmIF9QQVRIX1NGVFBfU0VSVkVSCisjZGVmaW5lIF9QQVRIX1NGVFBfU0VSVkVSCQkiL3Vzci9saWJleGVjL3NmdHAtc2VydmVyIgorI2VuZGlmCisKKy8qIGNocm9vdCBkaXJlY3RvcnkgZm9yIHVucHJpdmlsZWdlZCB1c2VyIHdoZW4gVXNlUHJpdmlsZWdlU2VwYXJhdGlvbj15ZXMgKi8KKyNpZm5kZWYgX1BBVEhfUFJJVlNFUF9DSFJPT1RfRElSCisjZGVmaW5lIF9QQVRIX1BSSVZTRVBfQ0hST09UX0RJUgkiL3Zhci9lbXB0eSIKKyNlbmRpZgorCisvKiBmb3IgcGFzc3dkIGNoYW5nZSAqLworI2lmbmRlZiBfUEFUSF9QQVNTV0RfUFJPRworI2RlZmluZSBfUEFUSF9QQVNTV0RfUFJPRyAgICAgICAgICAgICAiL3Vzci9iaW4vcGFzc3dkIgorI2VuZGlmCisKKyNpZm5kZWYgX1BBVEhfTFMKKyNkZWZpbmUgX1BBVEhfTFMJCQkibHMiCisjZW5kaWYKKworLyogcGF0aCB0byBsb2dpbiBwcm9ncmFtICovCisjaWZuZGVmIExPR0lOX1BST0dSQU0KKyMgaWZkZWYgTE9HSU5fUFJPR1JBTV9GQUxMQkFDSworIyAgZGVmaW5lIExPR0lOX1BST0dSQU0gICAgICAgICBMT0dJTl9QUk9HUkFNX0ZBTExCQUNLCisjIGVsc2UKKyMgIGRlZmluZSBMT0dJTl9QUk9HUkFNICAgICAgICAgIi91c3IvYmluL2xvZ2luIgorIyBlbmRpZgorI2VuZGlmIC8qIExPR0lOX1BST0dSQU0gKi8KKworLyogQXNrcGFzcyBwcm9ncmFtIGRlZmluZSAqLworI2lmbmRlZiBBU0tQQVNTX1BST0dSQU0KKyNkZWZpbmUgQVNLUEFTU19QUk9HUkFNICAgICAgICAgIi91c3IvbGliL3NzaC9zc2gtYXNrcGFzcyIKKyNlbmRpZiAvKiBBU0tQQVNTX1BST0dSQU0gKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcGtjczExLmggYi9vcGVuc3NoLTYuMHAxL3BrY3MxMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZGU1YjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3BrY3MxMS5oCkBAIC0wLDAgKzEsMTM1NyBAQAorLyogJE9wZW5CU0Q6IHBrY3MxMS5oLHYgMS4yIDIwMTAvMDIvMjQgMDY6MTI6NTMgZGptIEV4cCAkICovCisvKiBwa2NzMTEuaAorICAgQ29weXJpZ2h0IDIwMDYsIDIwMDcgZzEwIENvZGUgR21iSAorICAgQ29weXJpZ2h0IDIwMDYgQW5kcmVhcyBKZWxsaW5naGF1cworCisgICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0aGUgYXV0aG9yIGdpdmVzCisgICB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyAgIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisgICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgICBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0IGV2ZW4KKyAgIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAgIFBVUlBPU0UuICAqLworCisvKiBQbGVhc2Ugc3VibWl0IGNoYW5nZXMgYmFjayB0byB0aGUgU2N1dGUgcHJvamVjdCBhdAorICAgaHR0cDovL3d3dy5zY3V0ZS5vcmcvIChvciBzZW5kIHRoZW0gdG8gbWFyY3VzQGcxMGNvZGUuY29tKSwgc28gdGhhdAorICAgdGhleSBjYW4gYmUgcGlja2VkIHVwIGJ5IG90aGVyIHByb2plY3RzIGZyb20gdGhlcmUgYXMgd2VsbC4gICovCisKKy8qIFRoaXMgZmlsZSBpcyBhIG1vZGlmaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBQS0NTICMxMSBzdGFuZGFyZCBieQorICAgUlNBIFNlY3VyaXR5IEluYy4gIEl0IGlzIG1vc3RseSBhIGRyb3AtaW4gcmVwbGFjZW1lbnQsIHdpdGggdGhlCisgICBmb2xsb3dpbmcgY2hhbmdlOgorCisgICBUaGlzIGhlYWRlciBmaWxlIGRvZXMgbm90IHJlcXVpcmUgYW55IG1hY3JvIGRlZmluaXRpb25zIGJ5IHRoZSB1c2VyCisgICAobGlrZSBDS19ERUZJTkVfRlVOQ1RJT04gZXRjKS4gIEluIGZhY3QsIGl0IGRlZmluZXMgdGhvc2UgbWFjcm9zCisgICBmb3IgeW91IChpZiB1c2VmdWwsIHNvbWUgYXJlIG1pc3NpbmcsIGxldCBtZSBrbm93IGlmIHlvdSBuZWVkCisgICBtb3JlKS4KKworICAgVGhlcmUgaXMgYW4gYWRkaXRpb25hbCBBUEkgYXZhaWxhYmxlIHRoYXQgZG9lcyBjb21wbHkgYmV0dGVyIHRvIHRoZQorICAgR05VIGNvZGluZyBzdGFuZGFyZC4gIEl0IGNhbiBiZSBzd2l0Y2hlZCBvbiBieSBkZWZpbmluZworICAgQ1JZUFRPS0lfR05VIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgZmlsZS4gIEZvciB0aGlzLCB0aGUKKyAgIGZvbGxvd2luZyBjaGFuZ2VzIGFyZSBtYWRlIHRvIHRoZSBzcGVjaWZpY2F0aW9uOgorCisgICBBbGwgc3RydWN0dXJlIHR5cGVzIGFyZSBjaGFuZ2VkIHRvIGEgInN0cnVjdCBja19mb28iIHdoZXJlIENLX0ZPTworICAgaXMgdGhlIHR5cGUgbmFtZSBpbiBQS0NTICMxMS4KKworICAgQWxsIG5vbi1zdHJ1Y3R1cmUgdHlwZXMgYXJlIGNoYW5nZWQgdG8gY2tfZm9vX3Qgd2hlcmUgQ0tfRk9PIGlzIHRoZQorICAgbG93ZXJjYXNlIHZlcnNpb24gb2YgdGhlIHR5cGUgbmFtZSBpbiBQS0NTICMxMS4gIFRoZSBiYXNpYyB0eXBlcworICAgKENLX1VMT05HIGV0IGFsLikgYXJlIHJlbW92ZWQgd2l0aG91dCBzdWJzdGl0dXRlLgorCisgICBBbGwgbWVtYmVycyBvZiBzdHJ1Y3R1cmVzIGFyZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIHdheTogVHlwZQorICAgaW5kaWNhdGlvbiBwcmVmaXhlcyBhcmUgcmVtb3ZlZCwgYW5kIHVuZGVyc2NvcmUgY2hhcmFjdGVycyBhcmUKKyAgIGluc2VydGVkIGJlZm9yZSB3b3Jkcy4gIFRoZW4gdGhlIHJlc3VsdCBpcyBsb3dlcmNhc2VkLgorCisgICBOb3RlIHRoYXQgZnVuY3Rpb24gbmFtZXMgYXJlIHN0aWxsIGluIHRoZSBvcmlnaW5hbCBjYXNlLCBhcyB0aGV5CisgICBuZWVkIGZvciBBQkkgY29tcGF0aWJpbGl0eS4KKworICAgQ0tfRkFMU0UsIENLX1RSVUUgYW5kIE5VTExfUFRSIGFyZSByZW1vdmVkIHdpdGhvdXQgc3Vic3RpdHV0ZS4gIFVzZQorICAgPHN0ZGJvb2wuaD4uCisKKyAgIElmIENSWVBUT0tJX0NPTVBBVCBpcyBkZWZpbmVkIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgZmlsZSwKKyAgIHRoZW4gbm9uZSBvZiB0aGUgQVBJIGNoYW5nZXMgYWJvdmUgdGFrZSBwbGFjZSwgYW5kIHRoZSBBUEkgaXMgdGhlCisgICBvbmUgZGVmaW5lZCBieSB0aGUgUEtDUyAjMTEgc3RhbmRhcmQuICAqLworCisjaWZuZGVmIFBLQ1MxMV9ICisjZGVmaW5lIFBLQ1MxMV9IIDEKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIFRoZSB2ZXJzaW9uIG9mIGNyeXB0b2tpIHdlIGltcGxlbWVudC4gIFRoZSByZXZpc2lvbiBpcyBjaGFuZ2VkIHdpdGgKKyAgIGVhY2ggbW9kaWZpY2F0aW9uIG9mIHRoaXMgZmlsZS4gIElmIHlvdSBkbyBub3QgdXNlIHRoZSAib2ZmaWNpYWwiCisgICB2ZXJzaW9uIG9mIHRoaXMgZmlsZSwgcGxlYXNlIGNvbnNpZGVyIGRlbGV0aW5nIHRoZSByZXZpc2lvbiBtYWNybworICAgKHlvdSBtYXkgdXNlIGEgbWFjcm8gd2l0aCBhIGRpZmZlcmVudCBuYW1lIHRvIGtlZXAgdHJhY2sgb2YgeW91cgorICAgdmVyc2lvbnMpLiAgKi8KKyNkZWZpbmUgQ1JZUFRPS0lfVkVSU0lPTl9NQUpPUgkJMgorI2RlZmluZSBDUllQVE9LSV9WRVJTSU9OX01JTk9SCQkyMAorI2RlZmluZSBDUllQVE9LSV9WRVJTSU9OX1JFVklTSU9OCTYKKworCisvKiBDb21wYXRpYmlsaXR5IGludGVyZmFjZSBpcyBkZWZhdWx0LCB1bmxlc3MgQ1JZUFRPS0lfR05VIGlzCisgICBnaXZlbi4gICovCisjaWZuZGVmIENSWVBUT0tJX0dOVQorI2lmbmRlZiBDUllQVE9LSV9DT01QQVQKKyNkZWZpbmUgQ1JZUFRPS0lfQ09NUEFUIDEKKyNlbmRpZgorI2VuZGlmCisKKy8qIFN5c3RlbSBkZXBlbmRlbmNpZXMuICAqLworCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoQ1JZUFRPS0lfRk9SQ0VfV0lOMzIpCisKKy8qIFRoZXJlIGlzIGEgbWF0Y2hpbmcgcG9wIGJlbG93LiAgKi8KKyNwcmFnbWEgcGFjayhwdXNoLCBjcnlwdG9raSwgMSkKKworI2lmZGVmIENSWVBUT0tJX0VYUE9SVFMKKyNkZWZpbmUgQ0tfU1BFQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyNlbHNlCisjZGVmaW5lIENLX1NQRUMgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjZW5kaWYKKworI2Vsc2UKKworI2RlZmluZSBDS19TUEVDCisKKyNlbmRpZgorCisKKyNpZmRlZiBDUllQVE9LSV9DT01QQVQKKyAgLyogSWYgd2UgYXJlIGluIGNvbXBhdGliaWxpdHkgbW9kZSwgc3dpdGNoIGFsbCBleHBvc2VkIG5hbWVzIHRvIHRoZQorICAgICBQS0NTICMxMSB2YXJpYW50LiAgVGhlcmUgYXJlIGNvcnJlc3BvbmRpbmcgI3VuZGVmcyBiZWxvdy4gICovCisKKyNkZWZpbmUgY2tfZmxhZ3NfdCBDS19GTEFHUworI2RlZmluZSBja192ZXJzaW9uIF9DS19WRVJTSU9OCisKKyNkZWZpbmUgY2tfaW5mbyBfQ0tfSU5GTworI2RlZmluZSBjcnlwdG9raV92ZXJzaW9uIGNyeXB0b2tpVmVyc2lvbgorI2RlZmluZSBtYW51ZmFjdHVyZXJfaWQgbWFudWZhY3R1cmVySUQKKyNkZWZpbmUgbGlicmFyeV9kZXNjcmlwdGlvbiBsaWJyYXJ5RGVzY3JpcHRpb24KKyNkZWZpbmUgbGlicmFyeV92ZXJzaW9uIGxpYnJhcnlWZXJzaW9uCisKKyNkZWZpbmUgY2tfbm90aWZpY2F0aW9uX3QgQ0tfTk9USUZJQ0FUSU9OCisjZGVmaW5lIGNrX3Nsb3RfaWRfdCBDS19TTE9UX0lECisKKyNkZWZpbmUgY2tfc2xvdF9pbmZvIF9DS19TTE9UX0lORk8KKyNkZWZpbmUgc2xvdF9kZXNjcmlwdGlvbiBzbG90RGVzY3JpcHRpb24KKyNkZWZpbmUgaGFyZHdhcmVfdmVyc2lvbiBoYXJkd2FyZVZlcnNpb24KKyNkZWZpbmUgZmlybXdhcmVfdmVyc2lvbiBmaXJtd2FyZVZlcnNpb24KKworI2RlZmluZSBja190b2tlbl9pbmZvIF9DS19UT0tFTl9JTkZPCisjZGVmaW5lIHNlcmlhbF9udW1iZXIgc2VyaWFsTnVtYmVyCisjZGVmaW5lIG1heF9zZXNzaW9uX2NvdW50IHVsTWF4U2Vzc2lvbkNvdW50CisjZGVmaW5lIHNlc3Npb25fY291bnQgdWxTZXNzaW9uQ291bnQKKyNkZWZpbmUgbWF4X3J3X3Nlc3Npb25fY291bnQgdWxNYXhSd1Nlc3Npb25Db3VudAorI2RlZmluZSByd19zZXNzaW9uX2NvdW50IHVsUndTZXNzaW9uQ291bnQKKyNkZWZpbmUgbWF4X3Bpbl9sZW4gdWxNYXhQaW5MZW4KKyNkZWZpbmUgbWluX3Bpbl9sZW4gdWxNaW5QaW5MZW4KKyNkZWZpbmUgdG90YWxfcHVibGljX21lbW9yeSB1bFRvdGFsUHVibGljTWVtb3J5CisjZGVmaW5lIGZyZWVfcHVibGljX21lbW9yeSB1bEZyZWVQdWJsaWNNZW1vcnkKKyNkZWZpbmUgdG90YWxfcHJpdmF0ZV9tZW1vcnkgdWxUb3RhbFByaXZhdGVNZW1vcnkKKyNkZWZpbmUgZnJlZV9wcml2YXRlX21lbW9yeSB1bEZyZWVQcml2YXRlTWVtb3J5CisjZGVmaW5lIHV0Y190aW1lIHV0Y1RpbWUKKworI2RlZmluZSBja19zZXNzaW9uX2hhbmRsZV90IENLX1NFU1NJT05fSEFORExFCisjZGVmaW5lIGNrX3VzZXJfdHlwZV90IENLX1VTRVJfVFlQRQorI2RlZmluZSBja19zdGF0ZV90IENLX1NUQVRFCisKKyNkZWZpbmUgY2tfc2Vzc2lvbl9pbmZvIF9DS19TRVNTSU9OX0lORk8KKyNkZWZpbmUgc2xvdF9pZCBzbG90SUQKKyNkZWZpbmUgZGV2aWNlX2Vycm9yIHVsRGV2aWNlRXJyb3IKKworI2RlZmluZSBja19vYmplY3RfaGFuZGxlX3QgQ0tfT0JKRUNUX0hBTkRMRQorI2RlZmluZSBja19vYmplY3RfY2xhc3NfdCBDS19PQkpFQ1RfQ0xBU1MKKyNkZWZpbmUgY2tfaHdfZmVhdHVyZV90eXBlX3QgQ0tfSFdfRkVBVFVSRV9UWVBFCisjZGVmaW5lIGNrX2tleV90eXBlX3QgQ0tfS0VZX1RZUEUKKyNkZWZpbmUgY2tfY2VydGlmaWNhdGVfdHlwZV90IENLX0NFUlRJRklDQVRFX1RZUEUKKyNkZWZpbmUgY2tfYXR0cmlidXRlX3R5cGVfdCBDS19BVFRSSUJVVEVfVFlQRQorCisjZGVmaW5lIGNrX2F0dHJpYnV0ZSBfQ0tfQVRUUklCVVRFCisjZGVmaW5lIHZhbHVlIHBWYWx1ZQorI2RlZmluZSB2YWx1ZV9sZW4gdWxWYWx1ZUxlbgorCisjZGVmaW5lIGNrX2RhdGUgX0NLX0RBVEUKKworI2RlZmluZSBja19tZWNoYW5pc21fdHlwZV90IENLX01FQ0hBTklTTV9UWVBFCisKKyNkZWZpbmUgY2tfbWVjaGFuaXNtIF9DS19NRUNIQU5JU00KKyNkZWZpbmUgcGFyYW1ldGVyIHBQYXJhbWV0ZXIKKyNkZWZpbmUgcGFyYW1ldGVyX2xlbiB1bFBhcmFtZXRlckxlbgorCisjZGVmaW5lIGNrX21lY2hhbmlzbV9pbmZvIF9DS19NRUNIQU5JU01fSU5GTworI2RlZmluZSBtaW5fa2V5X3NpemUgdWxNaW5LZXlTaXplCisjZGVmaW5lIG1heF9rZXlfc2l6ZSB1bE1heEtleVNpemUKKworI2RlZmluZSBja19ydl90IENLX1JWCisjZGVmaW5lIGNrX25vdGlmeV90IENLX05PVElGWQorCisjZGVmaW5lIGNrX2Z1bmN0aW9uX2xpc3QgX0NLX0ZVTkNUSU9OX0xJU1QKKworI2RlZmluZSBja19jcmVhdGVtdXRleF90IENLX0NSRUFURU1VVEVYCisjZGVmaW5lIGNrX2Rlc3Ryb3ltdXRleF90IENLX0RFU1RST1lNVVRFWAorI2RlZmluZSBja19sb2NrbXV0ZXhfdCBDS19MT0NLTVVURVgKKyNkZWZpbmUgY2tfdW5sb2NrbXV0ZXhfdCBDS19VTkxPQ0tNVVRFWAorCisjZGVmaW5lIGNrX2NfaW5pdGlhbGl6ZV9hcmdzIF9DS19DX0lOSVRJQUxJWkVfQVJHUworI2RlZmluZSBjcmVhdGVfbXV0ZXggQ3JlYXRlTXV0ZXgKKyNkZWZpbmUgZGVzdHJveV9tdXRleCBEZXN0cm95TXV0ZXgKKyNkZWZpbmUgbG9ja19tdXRleCBMb2NrTXV0ZXgKKyNkZWZpbmUgdW5sb2NrX211dGV4IFVubG9ja011dGV4CisjZGVmaW5lIHJlc2VydmVkIHBSZXNlcnZlZAorCisjZW5kaWYJLyogQ1JZUFRPS0lfQ09NUEFUICovCisKKworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgY2tfZmxhZ3NfdDsKKworc3RydWN0IGNrX3ZlcnNpb24KK3sKKyAgdW5zaWduZWQgY2hhciBtYWpvcjsKKyAgdW5zaWduZWQgY2hhciBtaW5vcjsKK307CisKKworc3RydWN0IGNrX2luZm8KK3sKKyAgc3RydWN0IGNrX3ZlcnNpb24gY3J5cHRva2lfdmVyc2lvbjsKKyAgdW5zaWduZWQgY2hhciBtYW51ZmFjdHVyZXJfaWRbMzJdOworICBja19mbGFnc190IGZsYWdzOworICB1bnNpZ25lZCBjaGFyIGxpYnJhcnlfZGVzY3JpcHRpb25bMzJdOworICBzdHJ1Y3QgY2tfdmVyc2lvbiBsaWJyYXJ5X3ZlcnNpb247Cit9OworCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBja19ub3RpZmljYXRpb25fdDsKKworI2RlZmluZSBDS05fU1VSUkVOREVSCSgwKQorCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBja19zbG90X2lkX3Q7CisKKworc3RydWN0IGNrX3Nsb3RfaW5mbworeworICB1bnNpZ25lZCBjaGFyIHNsb3RfZGVzY3JpcHRpb25bNjRdOworICB1bnNpZ25lZCBjaGFyIG1hbnVmYWN0dXJlcl9pZFszMl07CisgIGNrX2ZsYWdzX3QgZmxhZ3M7CisgIHN0cnVjdCBja192ZXJzaW9uIGhhcmR3YXJlX3ZlcnNpb247CisgIHN0cnVjdCBja192ZXJzaW9uIGZpcm13YXJlX3ZlcnNpb247Cit9OworCisKKyNkZWZpbmUgQ0tGX1RPS0VOX1BSRVNFTlQJKDEgPDwgMCkKKyNkZWZpbmUgQ0tGX1JFTU9WQUJMRV9ERVZJQ0UJKDEgPDwgMSkKKyNkZWZpbmUgQ0tGX0hXX1NMT1QJCSgxIDw8IDIpCisjZGVmaW5lIENLRl9BUlJBWV9BVFRSSUJVVEUJKDEgPDwgMzApCisKKworc3RydWN0IGNrX3Rva2VuX2luZm8KK3sKKyAgdW5zaWduZWQgY2hhciBsYWJlbFszMl07CisgIHVuc2lnbmVkIGNoYXIgbWFudWZhY3R1cmVyX2lkWzMyXTsKKyAgdW5zaWduZWQgY2hhciBtb2RlbFsxNl07CisgIHVuc2lnbmVkIGNoYXIgc2VyaWFsX251bWJlclsxNl07CisgIGNrX2ZsYWdzX3QgZmxhZ3M7CisgIHVuc2lnbmVkIGxvbmcgbWF4X3Nlc3Npb25fY291bnQ7CisgIHVuc2lnbmVkIGxvbmcgc2Vzc2lvbl9jb3VudDsKKyAgdW5zaWduZWQgbG9uZyBtYXhfcndfc2Vzc2lvbl9jb3VudDsKKyAgdW5zaWduZWQgbG9uZyByd19zZXNzaW9uX2NvdW50OworICB1bnNpZ25lZCBsb25nIG1heF9waW5fbGVuOworICB1bnNpZ25lZCBsb25nIG1pbl9waW5fbGVuOworICB1bnNpZ25lZCBsb25nIHRvdGFsX3B1YmxpY19tZW1vcnk7CisgIHVuc2lnbmVkIGxvbmcgZnJlZV9wdWJsaWNfbWVtb3J5OworICB1bnNpZ25lZCBsb25nIHRvdGFsX3ByaXZhdGVfbWVtb3J5OworICB1bnNpZ25lZCBsb25nIGZyZWVfcHJpdmF0ZV9tZW1vcnk7CisgIHN0cnVjdCBja192ZXJzaW9uIGhhcmR3YXJlX3ZlcnNpb247CisgIHN0cnVjdCBja192ZXJzaW9uIGZpcm13YXJlX3ZlcnNpb247CisgIHVuc2lnbmVkIGNoYXIgdXRjX3RpbWVbMTZdOworfTsKKworCisjZGVmaW5lIENLRl9STkcJCQkJCSgxIDw8IDApCisjZGVmaW5lIENLRl9XUklURV9QUk9URUNURUQJCQkoMSA8PCAxKQorI2RlZmluZSBDS0ZfTE9HSU5fUkVRVUlSRUQJCQkoMSA8PCAyKQorI2RlZmluZSBDS0ZfVVNFUl9QSU5fSU5JVElBTElaRUQJCSgxIDw8IDMpCisjZGVmaW5lIENLRl9SRVNUT1JFX0tFWV9OT1RfTkVFREVECQkoMSA8PCA1KQorI2RlZmluZSBDS0ZfQ0xPQ0tfT05fVE9LRU4JCQkoMSA8PCA2KQorI2RlZmluZSBDS0ZfUFJPVEVDVEVEX0FVVEhFTlRJQ0FUSU9OX1BBVEgJKDEgPDwgOCkKKyNkZWZpbmUgQ0tGX0RVQUxfQ1JZUFRPX09QRVJBVElPTlMJCSgxIDw8IDkpCisjZGVmaW5lIENLRl9UT0tFTl9JTklUSUFMSVpFRAkJCSgxIDw8IDEwKQorI2RlZmluZSBDS0ZfU0VDT05EQVJZX0FVVEhFTlRJQ0FUSU9OCQkoMSA8PCAxMSkKKyNkZWZpbmUgQ0tGX1VTRVJfUElOX0NPVU5UX0xPVwkJCSgxIDw8IDE2KQorI2RlZmluZSBDS0ZfVVNFUl9QSU5fRklOQUxfVFJZCQkJKDEgPDwgMTcpCisjZGVmaW5lIENLRl9VU0VSX1BJTl9MT0NLRUQJCQkoMSA8PCAxOCkKKyNkZWZpbmUgQ0tGX1VTRVJfUElOX1RPX0JFX0NIQU5HRUQJCSgxIDw8IDE5KQorI2RlZmluZSBDS0ZfU09fUElOX0NPVU5UX0xPVwkJCSgxIDw8IDIwKQorI2RlZmluZSBDS0ZfU09fUElOX0ZJTkFMX1RSWQkJCSgxIDw8IDIxKQorI2RlZmluZSBDS0ZfU09fUElOX0xPQ0tFRAkJCSgxIDw8IDIyKQorI2RlZmluZSBDS0ZfU09fUElOX1RPX0JFX0NIQU5HRUQJCSgxIDw8IDIzKQorCisjZGVmaW5lIENLX1VOQVZBSUxBQkxFX0lORk9STUFUSU9OCSgodW5zaWduZWQgbG9uZykgLTEpCisjZGVmaW5lIENLX0VGRkVDVElWRUxZX0lORklOSVRFCQkoMCkKKworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgY2tfc2Vzc2lvbl9oYW5kbGVfdDsKKworI2RlZmluZSBDS19JTlZBTElEX0hBTkRMRQkoMCkKKworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgY2tfdXNlcl90eXBlX3Q7CisKKyNkZWZpbmUgQ0tVX1NPCQkJKDApCisjZGVmaW5lIENLVV9VU0VSCQkoMSkKKyNkZWZpbmUgQ0tVX0NPTlRFWFRfU1BFQ0lGSUMJKDIpCisKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGNrX3N0YXRlX3Q7CisKKyNkZWZpbmUgQ0tTX1JPX1BVQkxJQ19TRVNTSU9OCSgwKQorI2RlZmluZSBDS1NfUk9fVVNFUl9GVU5DVElPTlMJKDEpCisjZGVmaW5lIENLU19SV19QVUJMSUNfU0VTU0lPTgkoMikKKyNkZWZpbmUgQ0tTX1JXX1VTRVJfRlVOQ1RJT05TCSgzKQorI2RlZmluZSBDS1NfUldfU09fRlVOQ1RJT05TCSg0KQorCisKK3N0cnVjdCBja19zZXNzaW9uX2luZm8KK3sKKyAgY2tfc2xvdF9pZF90IHNsb3RfaWQ7CisgIGNrX3N0YXRlX3Qgc3RhdGU7CisgIGNrX2ZsYWdzX3QgZmxhZ3M7CisgIHVuc2lnbmVkIGxvbmcgZGV2aWNlX2Vycm9yOworfTsKKworI2RlZmluZSBDS0ZfUldfU0VTU0lPTgkJKDEgPDwgMSkKKyNkZWZpbmUgQ0tGX1NFUklBTF9TRVNTSU9OCSgxIDw8IDIpCisKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGNrX29iamVjdF9oYW5kbGVfdDsKKworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgY2tfb2JqZWN0X2NsYXNzX3Q7CisKKyNkZWZpbmUgQ0tPX0RBVEEJCSgwKQorI2RlZmluZSBDS09fQ0VSVElGSUNBVEUJCSgxKQorI2RlZmluZSBDS09fUFVCTElDX0tFWQkJKDIpCisjZGVmaW5lIENLT19QUklWQVRFX0tFWQkJKDMpCisjZGVmaW5lIENLT19TRUNSRVRfS0VZCQkoNCkKKyNkZWZpbmUgQ0tPX0hXX0ZFQVRVUkUJCSg1KQorI2RlZmluZSBDS09fRE9NQUlOX1BBUkFNRVRFUlMJKDYpCisjZGVmaW5lIENLT19NRUNIQU5JU00JCSg3KQorI2RlZmluZSBDS09fVkVORE9SX0RFRklORUQJKCh1bnNpZ25lZCBsb25nKSAoMSA8PCAzMSkpCisKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGNrX2h3X2ZlYXR1cmVfdHlwZV90OworCisjZGVmaW5lIENLSF9NT05PVE9OSUNfQ09VTlRFUgkoMSkKKyNkZWZpbmUgQ0tIX0NMT0NLCQkoMikKKyNkZWZpbmUgQ0tIX1VTRVJfSU5URVJGQUNFCSgzKQorI2RlZmluZSBDS0hfVkVORE9SX0RFRklORUQJKCh1bnNpZ25lZCBsb25nKSAoMSA8PCAzMSkpCisKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGNrX2tleV90eXBlX3Q7CisKKyNkZWZpbmUgQ0tLX1JTQQkJCSgwKQorI2RlZmluZSBDS0tfRFNBCQkJKDEpCisjZGVmaW5lIENLS19ESAkJCSgyKQorI2RlZmluZSBDS0tfRUNEU0EJCSgzKQorI2RlZmluZSBDS0tfRUMJCQkoMykKKyNkZWZpbmUgQ0tLX1g5XzQyX0RICQkoNCkKKyNkZWZpbmUgQ0tLX0tFQQkJCSg1KQorI2RlZmluZSBDS0tfR0VORVJJQ19TRUNSRVQJKDB4MTApCisjZGVmaW5lIENLS19SQzIJCQkoMHgxMSkKKyNkZWZpbmUgQ0tLX1JDNAkJCSgweDEyKQorI2RlZmluZSBDS0tfREVTCQkJKDB4MTMpCisjZGVmaW5lIENLS19ERVMyCQkoMHgxNCkKKyNkZWZpbmUgQ0tLX0RFUzMJCSgweDE1KQorI2RlZmluZSBDS0tfQ0FTVAkJKDB4MTYpCisjZGVmaW5lIENLS19DQVNUMwkJKDB4MTcpCisjZGVmaW5lIENLS19DQVNUMTI4CQkoMHgxOCkKKyNkZWZpbmUgQ0tLX1JDNQkJCSgweDE5KQorI2RlZmluZSBDS0tfSURFQQkJKDB4MWEpCisjZGVmaW5lIENLS19TS0lQSkFDSwkJKDB4MWIpCisjZGVmaW5lIENLS19CQVRPTgkJKDB4MWMpCisjZGVmaW5lIENLS19KVU5JUEVSCQkoMHgxZCkKKyNkZWZpbmUgQ0tLX0NETUYJCSgweDFlKQorI2RlZmluZSBDS0tfQUVTCQkJKDB4MWYpCisjZGVmaW5lIENLS19CTE9XRklTSAkJKDB4MjApCisjZGVmaW5lIENLS19UV09GSVNICQkoMHgyMSkKKyNkZWZpbmUgQ0tLX1ZFTkRPUl9ERUZJTkVECSgodW5zaWduZWQgbG9uZykgKDEgPDwgMzEpKQorCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgY2tfY2VydGlmaWNhdGVfdHlwZV90OworCisjZGVmaW5lIENLQ19YXzUwOQkJKDApCisjZGVmaW5lIENLQ19YXzUwOV9BVFRSX0NFUlQJKDEpCisjZGVmaW5lIENLQ19XVExTCQkoMikKKyNkZWZpbmUgQ0tDX1ZFTkRPUl9ERUZJTkVECSgodW5zaWduZWQgbG9uZykgKDEgPDwgMzEpKQorCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBja19hdHRyaWJ1dGVfdHlwZV90OworCisjZGVmaW5lIENLQV9DTEFTUwkJCSgwKQorI2RlZmluZSBDS0FfVE9LRU4JCQkoMSkKKyNkZWZpbmUgQ0tBX1BSSVZBVEUJCQkoMikKKyNkZWZpbmUgQ0tBX0xBQkVMCQkJKDMpCisjZGVmaW5lIENLQV9BUFBMSUNBVElPTgkJCSgweDEwKQorI2RlZmluZSBDS0FfVkFMVUUJCQkoMHgxMSkKKyNkZWZpbmUgQ0tBX09CSkVDVF9JRAkJCSgweDEyKQorI2RlZmluZSBDS0FfQ0VSVElGSUNBVEVfVFlQRQkJKDB4ODApCisjZGVmaW5lIENLQV9JU1NVRVIJCQkoMHg4MSkKKyNkZWZpbmUgQ0tBX1NFUklBTF9OVU1CRVIJCSgweDgyKQorI2RlZmluZSBDS0FfQUNfSVNTVUVSCQkJKDB4ODMpCisjZGVmaW5lIENLQV9PV05FUgkJCSgweDg0KQorI2RlZmluZSBDS0FfQVRUUl9UWVBFUwkJCSgweDg1KQorI2RlZmluZSBDS0FfVFJVU1RFRAkJCSgweDg2KQorI2RlZmluZSBDS0FfQ0VSVElGSUNBVEVfQ0FURUdPUlkJKDB4ODcpCisjZGVmaW5lIENLQV9KQVZBX01JRFBfU0VDVVJJVFlfRE9NQUlOCSgweDg4KQorI2RlZmluZSBDS0FfVVJMCQkJCSgweDg5KQorI2RlZmluZSBDS0FfSEFTSF9PRl9TVUJKRUNUX1BVQkxJQ19LRVkJKDB4OGEpCisjZGVmaW5lIENLQV9IQVNIX09GX0lTU1VFUl9QVUJMSUNfS0VZCSgweDhiKQorI2RlZmluZSBDS0FfQ0hFQ0tfVkFMVUUJCQkoMHg5MCkKKyNkZWZpbmUgQ0tBX0tFWV9UWVBFCQkJKDB4MTAwKQorI2RlZmluZSBDS0FfU1VCSkVDVAkJCSgweDEwMSkKKyNkZWZpbmUgQ0tBX0lECQkJCSgweDEwMikKKyNkZWZpbmUgQ0tBX1NFTlNJVElWRQkJCSgweDEwMykKKyNkZWZpbmUgQ0tBX0VOQ1JZUFQJCQkoMHgxMDQpCisjZGVmaW5lIENLQV9ERUNSWVBUCQkJKDB4MTA1KQorI2RlZmluZSBDS0FfV1JBUAkJCSgweDEwNikKKyNkZWZpbmUgQ0tBX1VOV1JBUAkJCSgweDEwNykKKyNkZWZpbmUgQ0tBX1NJR04JCQkoMHgxMDgpCisjZGVmaW5lIENLQV9TSUdOX1JFQ09WRVIJCSgweDEwOSkKKyNkZWZpbmUgQ0tBX1ZFUklGWQkJCSgweDEwYSkKKyNkZWZpbmUgQ0tBX1ZFUklGWV9SRUNPVkVSCQkoMHgxMGIpCisjZGVmaW5lIENLQV9ERVJJVkUJCQkoMHgxMGMpCisjZGVmaW5lIENLQV9TVEFSVF9EQVRFCQkJKDB4MTEwKQorI2RlZmluZSBDS0FfRU5EX0RBVEUJCQkoMHgxMTEpCisjZGVmaW5lIENLQV9NT0RVTFVTCQkJKDB4MTIwKQorI2RlZmluZSBDS0FfTU9EVUxVU19CSVRTCQkoMHgxMjEpCisjZGVmaW5lIENLQV9QVUJMSUNfRVhQT05FTlQJCSgweDEyMikKKyNkZWZpbmUgQ0tBX1BSSVZBVEVfRVhQT05FTlQJCSgweDEyMykKKyNkZWZpbmUgQ0tBX1BSSU1FXzEJCQkoMHgxMjQpCisjZGVmaW5lIENLQV9QUklNRV8yCQkJKDB4MTI1KQorI2RlZmluZSBDS0FfRVhQT05FTlRfMQkJCSgweDEyNikKKyNkZWZpbmUgQ0tBX0VYUE9ORU5UXzIJCQkoMHgxMjcpCisjZGVmaW5lIENLQV9DT0VGRklDSUVOVAkJCSgweDEyOCkKKyNkZWZpbmUgQ0tBX1BSSU1FCQkJKDB4MTMwKQorI2RlZmluZSBDS0FfU1VCUFJJTUUJCQkoMHgxMzEpCisjZGVmaW5lIENLQV9CQVNFCQkJKDB4MTMyKQorI2RlZmluZSBDS0FfUFJJTUVfQklUUwkJCSgweDEzMykKKyNkZWZpbmUgQ0tBX1NVQl9QUklNRV9CSVRTCQkoMHgxMzQpCisjZGVmaW5lIENLQV9WQUxVRV9CSVRTCQkJKDB4MTYwKQorI2RlZmluZSBDS0FfVkFMVUVfTEVOCQkJKDB4MTYxKQorI2RlZmluZSBDS0FfRVhUUkFDVEFCTEUJCQkoMHgxNjIpCisjZGVmaW5lIENLQV9MT0NBTAkJCSgweDE2MykKKyNkZWZpbmUgQ0tBX05FVkVSX0VYVFJBQ1RBQkxFCQkoMHgxNjQpCisjZGVmaW5lIENLQV9BTFdBWVNfU0VOU0lUSVZFCQkoMHgxNjUpCisjZGVmaW5lIENLQV9LRVlfR0VOX01FQ0hBTklTTQkJKDB4MTY2KQorI2RlZmluZSBDS0FfTU9ESUZJQUJMRQkJCSgweDE3MCkKKyNkZWZpbmUgQ0tBX0VDRFNBX1BBUkFNUwkJKDB4MTgwKQorI2RlZmluZSBDS0FfRUNfUEFSQU1TCQkJKDB4MTgwKQorI2RlZmluZSBDS0FfRUNfUE9JTlQJCQkoMHgxODEpCisjZGVmaW5lIENLQV9TRUNPTkRBUllfQVVUSAkJKDB4MjAwKQorI2RlZmluZSBDS0FfQVVUSF9QSU5fRkxBR1MJCSgweDIwMSkKKyNkZWZpbmUgQ0tBX0FMV0FZU19BVVRIRU5USUNBVEUJCSgweDIwMikKKyNkZWZpbmUgQ0tBX1dSQVBfV0lUSF9UUlVTVEVECQkoMHgyMTApCisjZGVmaW5lIENLQV9IV19GRUFUVVJFX1RZUEUJCSgweDMwMCkKKyNkZWZpbmUgQ0tBX1JFU0VUX09OX0lOSVQJCSgweDMwMSkKKyNkZWZpbmUgQ0tBX0hBU19SRVNFVAkJCSgweDMwMikKKyNkZWZpbmUgQ0tBX1BJWEVMX1gJCQkoMHg0MDApCisjZGVmaW5lIENLQV9QSVhFTF9ZCQkJKDB4NDAxKQorI2RlZmluZSBDS0FfUkVTT0xVVElPTgkJCSgweDQwMikKKyNkZWZpbmUgQ0tBX0NIQVJfUk9XUwkJCSgweDQwMykKKyNkZWZpbmUgQ0tBX0NIQVJfQ09MVU1OUwkJKDB4NDA0KQorI2RlZmluZSBDS0FfQ09MT1IJCQkoMHg0MDUpCisjZGVmaW5lIENLQV9CSVRTX1BFUl9QSVhFTAkJKDB4NDA2KQorI2RlZmluZSBDS0FfQ0hBUl9TRVRTCQkJKDB4NDgwKQorI2RlZmluZSBDS0FfRU5DT0RJTkdfTUVUSE9EUwkJKDB4NDgxKQorI2RlZmluZSBDS0FfTUlNRV9UWVBFUwkJCSgweDQ4MikKKyNkZWZpbmUgQ0tBX01FQ0hBTklTTV9UWVBFCQkoMHg1MDApCisjZGVmaW5lIENLQV9SRVFVSVJFRF9DTVNfQVRUUklCVVRFUwkoMHg1MDEpCisjZGVmaW5lIENLQV9ERUZBVUxUX0NNU19BVFRSSUJVVEVTCSgweDUwMikKKyNkZWZpbmUgQ0tBX1NVUFBPUlRFRF9DTVNfQVRUUklCVVRFUwkoMHg1MDMpCisjZGVmaW5lIENLQV9XUkFQX1RFTVBMQVRFCQkoQ0tGX0FSUkFZX0FUVFJJQlVURSB8IDB4MjExKQorI2RlZmluZSBDS0FfVU5XUkFQX1RFTVBMQVRFCQkoQ0tGX0FSUkFZX0FUVFJJQlVURSB8IDB4MjEyKQorI2RlZmluZSBDS0FfQUxMT1dFRF9NRUNIQU5JU01TCQkoQ0tGX0FSUkFZX0FUVFJJQlVURSB8IDB4NjAwKQorI2RlZmluZSBDS0FfVkVORE9SX0RFRklORUQJCSgodW5zaWduZWQgbG9uZykgKDEgPDwgMzEpKQorCisKK3N0cnVjdCBja19hdHRyaWJ1dGUKK3sKKyAgY2tfYXR0cmlidXRlX3R5cGVfdCB0eXBlOworICB2b2lkICp2YWx1ZTsKKyAgdW5zaWduZWQgbG9uZyB2YWx1ZV9sZW47Cit9OworCisKK3N0cnVjdCBja19kYXRlCit7CisgIHVuc2lnbmVkIGNoYXIgeWVhcls0XTsKKyAgdW5zaWduZWQgY2hhciBtb250aFsyXTsKKyAgdW5zaWduZWQgY2hhciBkYXlbMl07Cit9OworCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBja19tZWNoYW5pc21fdHlwZV90OworCisjZGVmaW5lIENLTV9SU0FfUEtDU19LRVlfUEFJUl9HRU4JKDApCisjZGVmaW5lIENLTV9SU0FfUEtDUwkJCSgxKQorI2RlZmluZSBDS01fUlNBXzk3OTYJCQkoMikKKyNkZWZpbmUgQ0tNX1JTQV9YXzUwOQkJCSgzKQorI2RlZmluZSBDS01fTUQyX1JTQV9QS0NTCQkoNCkKKyNkZWZpbmUgQ0tNX01ENV9SU0FfUEtDUwkJKDUpCisjZGVmaW5lIENLTV9TSEExX1JTQV9QS0NTCQkoNikKKyNkZWZpbmUgQ0tNX1JJUEVNRDEyOF9SU0FfUEtDUwkJKDcpCisjZGVmaW5lIENLTV9SSVBFTUQxNjBfUlNBX1BLQ1MJCSg4KQorI2RlZmluZSBDS01fUlNBX1BLQ1NfT0FFUAkJKDkpCisjZGVmaW5lIENLTV9SU0FfWDlfMzFfS0VZX1BBSVJfR0VOCSgweGEpCisjZGVmaW5lIENLTV9SU0FfWDlfMzEJCQkoMHhiKQorI2RlZmluZSBDS01fU0hBMV9SU0FfWDlfMzEJCSgweGMpCisjZGVmaW5lIENLTV9SU0FfUEtDU19QU1MJCSgweGQpCisjZGVmaW5lIENLTV9TSEExX1JTQV9QS0NTX1BTUwkJKDB4ZSkKKyNkZWZpbmUgQ0tNX0RTQV9LRVlfUEFJUl9HRU4JCSgweDEwKQorI2RlZmluZQlDS01fRFNBCQkJCSgweDExKQorI2RlZmluZSBDS01fRFNBX1NIQTEJCQkoMHgxMikKKyNkZWZpbmUgQ0tNX0RIX1BLQ1NfS0VZX1BBSVJfR0VOCSgweDIwKQorI2RlZmluZSBDS01fREhfUEtDU19ERVJJVkUJCSgweDIxKQorI2RlZmluZQlDS01fWDlfNDJfREhfS0VZX1BBSVJfR0VOCSgweDMwKQorI2RlZmluZSBDS01fWDlfNDJfREhfREVSSVZFCQkoMHgzMSkKKyNkZWZpbmUgQ0tNX1g5XzQyX0RIX0hZQlJJRF9ERVJJVkUJKDB4MzIpCisjZGVmaW5lIENLTV9YOV80Ml9NUVZfREVSSVZFCQkoMHgzMykKKyNkZWZpbmUgQ0tNX1NIQTI1Nl9SU0FfUEtDUwkJKDB4NDApCisjZGVmaW5lIENLTV9TSEEzODRfUlNBX1BLQ1MJCSgweDQxKQorI2RlZmluZSBDS01fU0hBNTEyX1JTQV9QS0NTCQkoMHg0MikKKyNkZWZpbmUgQ0tNX1NIQTI1Nl9SU0FfUEtDU19QU1MJCSgweDQzKQorI2RlZmluZSBDS01fU0hBMzg0X1JTQV9QS0NTX1BTUwkJKDB4NDQpCisjZGVmaW5lIENLTV9TSEE1MTJfUlNBX1BLQ1NfUFNTCQkoMHg0NSkKKyNkZWZpbmUgQ0tNX1JDMl9LRVlfR0VOCQkJKDB4MTAwKQorI2RlZmluZSBDS01fUkMyX0VDQgkJCSgweDEwMSkKKyNkZWZpbmUJQ0tNX1JDMl9DQkMJCQkoMHgxMDIpCisjZGVmaW5lCUNLTV9SQzJfTUFDCQkJKDB4MTAzKQorI2RlZmluZSBDS01fUkMyX01BQ19HRU5FUkFMCQkoMHgxMDQpCisjZGVmaW5lIENLTV9SQzJfQ0JDX1BBRAkJCSgweDEwNSkKKyNkZWZpbmUgQ0tNX1JDNF9LRVlfR0VOCQkJKDB4MTEwKQorI2RlZmluZSBDS01fUkM0CQkJCSgweDExMSkKKyNkZWZpbmUgQ0tNX0RFU19LRVlfR0VOCQkJKDB4MTIwKQorI2RlZmluZSBDS01fREVTX0VDQgkJCSgweDEyMSkKKyNkZWZpbmUgQ0tNX0RFU19DQkMJCQkoMHgxMjIpCisjZGVmaW5lIENLTV9ERVNfTUFDCQkJKDB4MTIzKQorI2RlZmluZSBDS01fREVTX01BQ19HRU5FUkFMCQkoMHgxMjQpCisjZGVmaW5lIENLTV9ERVNfQ0JDX1BBRAkJCSgweDEyNSkKKyNkZWZpbmUgQ0tNX0RFUzJfS0VZX0dFTgkJKDB4MTMwKQorI2RlZmluZSBDS01fREVTM19LRVlfR0VOCQkoMHgxMzEpCisjZGVmaW5lIENLTV9ERVMzX0VDQgkJCSgweDEzMikKKyNkZWZpbmUgQ0tNX0RFUzNfQ0JDCQkJKDB4MTMzKQorI2RlZmluZSBDS01fREVTM19NQUMJCQkoMHgxMzQpCisjZGVmaW5lIENLTV9ERVMzX01BQ19HRU5FUkFMCQkoMHgxMzUpCisjZGVmaW5lIENLTV9ERVMzX0NCQ19QQUQJCSgweDEzNikKKyNkZWZpbmUgQ0tNX0NETUZfS0VZX0dFTgkJKDB4MTQwKQorI2RlZmluZSBDS01fQ0RNRl9FQ0IJCQkoMHgxNDEpCisjZGVmaW5lIENLTV9DRE1GX0NCQwkJCSgweDE0MikKKyNkZWZpbmUgQ0tNX0NETUZfTUFDCQkJKDB4MTQzKQorI2RlZmluZSBDS01fQ0RNRl9NQUNfR0VORVJBTAkJKDB4MTQ0KQorI2RlZmluZSBDS01fQ0RNRl9DQkNfUEFECQkoMHgxNDUpCisjZGVmaW5lIENLTV9NRDIJCQkJKDB4MjAwKQorI2RlZmluZSBDS01fTUQyX0hNQUMJCQkoMHgyMDEpCisjZGVmaW5lIENLTV9NRDJfSE1BQ19HRU5FUkFMCQkoMHgyMDIpCisjZGVmaW5lIENLTV9NRDUJCQkJKDB4MjEwKQorI2RlZmluZSBDS01fTUQ1X0hNQUMJCQkoMHgyMTEpCisjZGVmaW5lIENLTV9NRDVfSE1BQ19HRU5FUkFMCQkoMHgyMTIpCisjZGVmaW5lIENLTV9TSEFfMQkJCSgweDIyMCkKKyNkZWZpbmUgQ0tNX1NIQV8xX0hNQUMJCQkoMHgyMjEpCisjZGVmaW5lIENLTV9TSEFfMV9ITUFDX0dFTkVSQUwJCSgweDIyMikKKyNkZWZpbmUgQ0tNX1JJUEVNRDEyOAkJCSgweDIzMCkKKyNkZWZpbmUgQ0tNX1JJUEVNRDEyOF9ITUFDCQkoMHgyMzEpCisjZGVmaW5lIENLTV9SSVBFTUQxMjhfSE1BQ19HRU5FUkFMCSgweDIzMikKKyNkZWZpbmUgQ0tNX1JJUEVNRDE2MAkJCSgweDI0MCkKKyNkZWZpbmUgQ0tNX1JJUEVNRDE2MF9ITUFDCQkoMHgyNDEpCisjZGVmaW5lIENLTV9SSVBFTUQxNjBfSE1BQ19HRU5FUkFMCSgweDI0MikKKyNkZWZpbmUgQ0tNX1NIQTI1NgkJCSgweDI1MCkKKyNkZWZpbmUgQ0tNX1NIQTI1Nl9ITUFDCQkJKDB4MjUxKQorI2RlZmluZSBDS01fU0hBMjU2X0hNQUNfR0VORVJBTAkJKDB4MjUyKQorI2RlZmluZSBDS01fU0hBMzg0CQkJKDB4MjYwKQorI2RlZmluZSBDS01fU0hBMzg0X0hNQUMJCQkoMHgyNjEpCisjZGVmaW5lIENLTV9TSEEzODRfSE1BQ19HRU5FUkFMCQkoMHgyNjIpCisjZGVmaW5lIENLTV9TSEE1MTIJCQkoMHgyNzApCisjZGVmaW5lIENLTV9TSEE1MTJfSE1BQwkJCSgweDI3MSkKKyNkZWZpbmUgQ0tNX1NIQTUxMl9ITUFDX0dFTkVSQUwJCSgweDI3MikKKyNkZWZpbmUgQ0tNX0NBU1RfS0VZX0dFTgkJKDB4MzAwKQorI2RlZmluZSBDS01fQ0FTVF9FQ0IJCQkoMHgzMDEpCisjZGVmaW5lIENLTV9DQVNUX0NCQwkJCSgweDMwMikKKyNkZWZpbmUgQ0tNX0NBU1RfTUFDCQkJKDB4MzAzKQorI2RlZmluZSBDS01fQ0FTVF9NQUNfR0VORVJBTAkJKDB4MzA0KQorI2RlZmluZSBDS01fQ0FTVF9DQkNfUEFECQkoMHgzMDUpCisjZGVmaW5lIENLTV9DQVNUM19LRVlfR0VOCQkoMHgzMTApCisjZGVmaW5lIENLTV9DQVNUM19FQ0IJCQkoMHgzMTEpCisjZGVmaW5lIENLTV9DQVNUM19DQkMJCQkoMHgzMTIpCisjZGVmaW5lIENLTV9DQVNUM19NQUMJCQkoMHgzMTMpCisjZGVmaW5lIENLTV9DQVNUM19NQUNfR0VORVJBTAkJKDB4MzE0KQorI2RlZmluZSBDS01fQ0FTVDNfQ0JDX1BBRAkJKDB4MzE1KQorI2RlZmluZSBDS01fQ0FTVDVfS0VZX0dFTgkJKDB4MzIwKQorI2RlZmluZSBDS01fQ0FTVDEyOF9LRVlfR0VOCQkoMHgzMjApCisjZGVmaW5lIENLTV9DQVNUNV9FQ0IJCQkoMHgzMjEpCisjZGVmaW5lIENLTV9DQVNUMTI4X0VDQgkJCSgweDMyMSkKKyNkZWZpbmUgQ0tNX0NBU1Q1X0NCQwkJCSgweDMyMikKKyNkZWZpbmUgQ0tNX0NBU1QxMjhfQ0JDCQkJKDB4MzIyKQorI2RlZmluZSBDS01fQ0FTVDVfTUFDCQkJKDB4MzIzKQorI2RlZmluZQlDS01fQ0FTVDEyOF9NQUMJCQkoMHgzMjMpCisjZGVmaW5lIENLTV9DQVNUNV9NQUNfR0VORVJBTAkJKDB4MzI0KQorI2RlZmluZSBDS01fQ0FTVDEyOF9NQUNfR0VORVJBTAkJKDB4MzI0KQorI2RlZmluZSBDS01fQ0FTVDVfQ0JDX1BBRAkJKDB4MzI1KQorI2RlZmluZSBDS01fQ0FTVDEyOF9DQkNfUEFECQkoMHgzMjUpCisjZGVmaW5lIENLTV9SQzVfS0VZX0dFTgkJCSgweDMzMCkKKyNkZWZpbmUgQ0tNX1JDNV9FQ0IJCQkoMHgzMzEpCisjZGVmaW5lIENLTV9SQzVfQ0JDCQkJKDB4MzMyKQorI2RlZmluZSBDS01fUkM1X01BQwkJCSgweDMzMykKKyNkZWZpbmUgQ0tNX1JDNV9NQUNfR0VORVJBTAkJKDB4MzM0KQorI2RlZmluZSBDS01fUkM1X0NCQ19QQUQJCQkoMHgzMzUpCisjZGVmaW5lIENLTV9JREVBX0tFWV9HRU4JCSgweDM0MCkKKyNkZWZpbmUgQ0tNX0lERUFfRUNCCQkJKDB4MzQxKQorI2RlZmluZQlDS01fSURFQV9DQkMJCQkoMHgzNDIpCisjZGVmaW5lIENLTV9JREVBX01BQwkJCSgweDM0MykKKyNkZWZpbmUgQ0tNX0lERUFfTUFDX0dFTkVSQUwJCSgweDM0NCkKKyNkZWZpbmUgQ0tNX0lERUFfQ0JDX1BBRAkJKDB4MzQ1KQorI2RlZmluZSBDS01fR0VORVJJQ19TRUNSRVRfS0VZX0dFTgkoMHgzNTApCisjZGVmaW5lIENLTV9DT05DQVRFTkFURV9CQVNFX0FORF9LRVkJKDB4MzYwKQorI2RlZmluZSBDS01fQ09OQ0FURU5BVEVfQkFTRV9BTkRfREFUQQkoMHgzNjIpCisjZGVmaW5lIENLTV9DT05DQVRFTkFURV9EQVRBX0FORF9CQVNFCSgweDM2MykKKyNkZWZpbmUgQ0tNX1hPUl9CQVNFX0FORF9EQVRBCQkoMHgzNjQpCisjZGVmaW5lIENLTV9FWFRSQUNUX0tFWV9GUk9NX0tFWQkoMHgzNjUpCisjZGVmaW5lIENLTV9TU0wzX1BSRV9NQVNURVJfS0VZX0dFTgkoMHgzNzApCisjZGVmaW5lIENLTV9TU0wzX01BU1RFUl9LRVlfREVSSVZFCSgweDM3MSkKKyNkZWZpbmUgQ0tNX1NTTDNfS0VZX0FORF9NQUNfREVSSVZFCSgweDM3MikKKyNkZWZpbmUgQ0tNX1NTTDNfTUFTVEVSX0tFWV9ERVJJVkVfREgJKDB4MzczKQorI2RlZmluZSBDS01fVExTX1BSRV9NQVNURVJfS0VZX0dFTgkoMHgzNzQpCisjZGVmaW5lIENLTV9UTFNfTUFTVEVSX0tFWV9ERVJJVkUJKDB4Mzc1KQorI2RlZmluZSBDS01fVExTX0tFWV9BTkRfTUFDX0RFUklWRQkoMHgzNzYpCisjZGVmaW5lIENLTV9UTFNfTUFTVEVSX0tFWV9ERVJJVkVfREgJKDB4Mzc3KQorI2RlZmluZSBDS01fU1NMM19NRDVfTUFDCQkoMHgzODApCisjZGVmaW5lIENLTV9TU0wzX1NIQTFfTUFDCQkoMHgzODEpCisjZGVmaW5lIENLTV9NRDVfS0VZX0RFUklWQVRJT04JCSgweDM5MCkKKyNkZWZpbmUgQ0tNX01EMl9LRVlfREVSSVZBVElPTgkJKDB4MzkxKQorI2RlZmluZSBDS01fU0hBMV9LRVlfREVSSVZBVElPTgkJKDB4MzkyKQorI2RlZmluZSBDS01fUEJFX01EMl9ERVNfQ0JDCQkoMHgzYTApCisjZGVmaW5lIENLTV9QQkVfTUQ1X0RFU19DQkMJCSgweDNhMSkKKyNkZWZpbmUgQ0tNX1BCRV9NRDVfQ0FTVF9DQkMJCSgweDNhMikKKyNkZWZpbmUgQ0tNX1BCRV9NRDVfQ0FTVDNfQ0JDCQkoMHgzYTMpCisjZGVmaW5lIENLTV9QQkVfTUQ1X0NBU1Q1X0NCQwkJKDB4M2E0KQorI2RlZmluZSBDS01fUEJFX01ENV9DQVNUMTI4X0NCQwkJKDB4M2E0KQorI2RlZmluZSBDS01fUEJFX1NIQTFfQ0FTVDVfQ0JDCQkoMHgzYTUpCisjZGVmaW5lIENLTV9QQkVfU0hBMV9DQVNUMTI4X0NCQwkoMHgzYTUpCisjZGVmaW5lIENLTV9QQkVfU0hBMV9SQzRfMTI4CQkoMHgzYTYpCisjZGVmaW5lIENLTV9QQkVfU0hBMV9SQzRfNDAJCSgweDNhNykKKyNkZWZpbmUgQ0tNX1BCRV9TSEExX0RFUzNfRURFX0NCQwkoMHgzYTgpCisjZGVmaW5lIENLTV9QQkVfU0hBMV9ERVMyX0VERV9DQkMJKDB4M2E5KQorI2RlZmluZSBDS01fUEJFX1NIQTFfUkMyXzEyOF9DQkMJKDB4M2FhKQorI2RlZmluZSBDS01fUEJFX1NIQTFfUkMyXzQwX0NCQwkJKDB4M2FiKQorI2RlZmluZSBDS01fUEtDUzVfUEJLRDIJCQkoMHgzYjApCisjZGVmaW5lIENLTV9QQkFfU0hBMV9XSVRIX1NIQTFfSE1BQwkoMHgzYzApCisjZGVmaW5lIENLTV9LRVlfV1JBUF9MWU5LUwkJKDB4NDAwKQorI2RlZmluZSBDS01fS0VZX1dSQVBfU0VUX09BRVAJCSgweDQwMSkKKyNkZWZpbmUgQ0tNX1NLSVBKQUNLX0tFWV9HRU4JCSgweDEwMDApCisjZGVmaW5lIENLTV9TS0lQSkFDS19FQ0I2NAkJKDB4MTAwMSkKKyNkZWZpbmUgQ0tNX1NLSVBKQUNLX0NCQzY0CQkoMHgxMDAyKQorI2RlZmluZSBDS01fU0tJUEpBQ0tfT0ZCNjQJCSgweDEwMDMpCisjZGVmaW5lIENLTV9TS0lQSkFDS19DRkI2NAkJKDB4MTAwNCkKKyNkZWZpbmUgQ0tNX1NLSVBKQUNLX0NGQjMyCQkoMHgxMDA1KQorI2RlZmluZSBDS01fU0tJUEpBQ0tfQ0ZCMTYJCSgweDEwMDYpCisjZGVmaW5lIENLTV9TS0lQSkFDS19DRkI4CQkoMHgxMDA3KQorI2RlZmluZSBDS01fU0tJUEpBQ0tfV1JBUAkJKDB4MTAwOCkKKyNkZWZpbmUgQ0tNX1NLSVBKQUNLX1BSSVZBVEVfV1JBUAkoMHgxMDA5KQorI2RlZmluZSBDS01fU0tJUEpBQ0tfUkVMQVlYCQkoMHgxMDBhKQorI2RlZmluZSBDS01fS0VBX0tFWV9QQUlSX0dFTgkJKDB4MTAxMCkKKyNkZWZpbmUgQ0tNX0tFQV9LRVlfREVSSVZFCQkoMHgxMDExKQorI2RlZmluZSBDS01fRk9SVEVaWkFfVElNRVNUQU1QCQkoMHgxMDIwKQorI2RlZmluZSBDS01fQkFUT05fS0VZX0dFTgkJKDB4MTAzMCkKKyNkZWZpbmUgQ0tNX0JBVE9OX0VDQjEyOAkJKDB4MTAzMSkKKyNkZWZpbmUgQ0tNX0JBVE9OX0VDQjk2CQkJKDB4MTAzMikKKyNkZWZpbmUgQ0tNX0JBVE9OX0NCQzEyOAkJKDB4MTAzMykKKyNkZWZpbmUgQ0tNX0JBVE9OX0NPVU5URVIJCSgweDEwMzQpCisjZGVmaW5lIENLTV9CQVRPTl9TSFVGRkxFCQkoMHgxMDM1KQorI2RlZmluZSBDS01fQkFUT05fV1JBUAkJCSgweDEwMzYpCisjZGVmaW5lIENLTV9FQ0RTQV9LRVlfUEFJUl9HRU4JCSgweDEwNDApCisjZGVmaW5lIENLTV9FQ19LRVlfUEFJUl9HRU4JCSgweDEwNDApCisjZGVmaW5lIENLTV9FQ0RTQQkJCSgweDEwNDEpCisjZGVmaW5lIENLTV9FQ0RTQV9TSEExCQkJKDB4MTA0MikKKyNkZWZpbmUgQ0tNX0VDREgxX0RFUklWRQkJKDB4MTA1MCkKKyNkZWZpbmUgQ0tNX0VDREgxX0NPRkFDVE9SX0RFUklWRQkoMHgxMDUxKQorI2RlZmluZSBDS01fRUNNUVZfREVSSVZFCQkoMHgxMDUyKQorI2RlZmluZSBDS01fSlVOSVBFUl9LRVlfR0VOCQkoMHgxMDYwKQorI2RlZmluZSBDS01fSlVOSVBFUl9FQ0IxMjgJCSgweDEwNjEpCisjZGVmaW5lIENLTV9KVU5JUEVSX0NCQzEyOAkJKDB4MTA2MikKKyNkZWZpbmUgQ0tNX0pVTklQRVJfQ09VTlRFUgkJKDB4MTA2MykKKyNkZWZpbmUgQ0tNX0pVTklQRVJfU0hVRkZMRQkJKDB4MTA2NCkKKyNkZWZpbmUgQ0tNX0pVTklQRVJfV1JBUAkJKDB4MTA2NSkKKyNkZWZpbmUgQ0tNX0ZBU1RIQVNICQkJKDB4MTA3MCkKKyNkZWZpbmUgQ0tNX0FFU19LRVlfR0VOCQkJKDB4MTA4MCkKKyNkZWZpbmUgQ0tNX0FFU19FQ0IJCQkoMHgxMDgxKQorI2RlZmluZSBDS01fQUVTX0NCQwkJCSgweDEwODIpCisjZGVmaW5lIENLTV9BRVNfTUFDCQkJKDB4MTA4MykKKyNkZWZpbmUgQ0tNX0FFU19NQUNfR0VORVJBTAkJKDB4MTA4NCkKKyNkZWZpbmUgQ0tNX0FFU19DQkNfUEFECQkJKDB4MTA4NSkKKyNkZWZpbmUgQ0tNX0RTQV9QQVJBTUVURVJfR0VOCQkoMHgyMDAwKQorI2RlZmluZSBDS01fREhfUEtDU19QQVJBTUVURVJfR0VOCSgweDIwMDEpCisjZGVmaW5lIENLTV9YOV80Ml9ESF9QQVJBTUVURVJfR0VOCSgweDIwMDIpCisjZGVmaW5lIENLTV9WRU5ET1JfREVGSU5FRAkJKCh1bnNpZ25lZCBsb25nKSAoMSA8PCAzMSkpCisKKworc3RydWN0IGNrX21lY2hhbmlzbQoreworICBja19tZWNoYW5pc21fdHlwZV90IG1lY2hhbmlzbTsKKyAgdm9pZCAqcGFyYW1ldGVyOworICB1bnNpZ25lZCBsb25nIHBhcmFtZXRlcl9sZW47Cit9OworCisKK3N0cnVjdCBja19tZWNoYW5pc21faW5mbworeworICB1bnNpZ25lZCBsb25nIG1pbl9rZXlfc2l6ZTsKKyAgdW5zaWduZWQgbG9uZyBtYXhfa2V5X3NpemU7CisgIGNrX2ZsYWdzX3QgZmxhZ3M7Cit9OworCisjZGVmaW5lIENLRl9IVwkJCSgxIDw8IDApCisjZGVmaW5lIENLRl9FTkNSWVBUCQkoMSA8PCA4KQorI2RlZmluZSBDS0ZfREVDUllQVAkJKDEgPDwgOSkKKyNkZWZpbmUgQ0tGX0RJR0VTVAkJKDEgPDwgMTApCisjZGVmaW5lIENLRl9TSUdOCQkoMSA8PCAxMSkKKyNkZWZpbmUgQ0tGX1NJR05fUkVDT1ZFUgkoMSA8PCAxMikKKyNkZWZpbmUgQ0tGX1ZFUklGWQkJKDEgPDwgMTMpCisjZGVmaW5lIENLRl9WRVJJRllfUkVDT1ZFUgkoMSA8PCAxNCkKKyNkZWZpbmUgQ0tGX0dFTkVSQVRFCQkoMSA8PCAxNSkKKyNkZWZpbmUgQ0tGX0dFTkVSQVRFX0tFWV9QQUlSCSgxIDw8IDE2KQorI2RlZmluZSBDS0ZfV1JBUAkJKDEgPDwgMTcpCisjZGVmaW5lIENLRl9VTldSQVAJCSgxIDw8IDE4KQorI2RlZmluZSBDS0ZfREVSSVZFCQkoMSA8PCAxOSkKKyNkZWZpbmUgQ0tGX0VYVEVOU0lPTgkJKCh1bnNpZ25lZCBsb25nKSAoMSA8PCAzMSkpCisKKworLyogRmxhZ3MgZm9yIENfV2FpdEZvclNsb3RFdmVudC4gICovCisjZGVmaW5lIENLRl9ET05UX0JMT0NLCQkJCSgxKQorCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBja19ydl90OworCisKK3R5cGVkZWYgY2tfcnZfdCAoKmNrX25vdGlmeV90KSAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkJCWNrX25vdGlmaWNhdGlvbl90IGV2ZW50LCB2b2lkICphcHBsaWNhdGlvbik7CisKKy8qIEZvcndhcmQgcmVmZXJlbmNlLiAgKi8KK3N0cnVjdCBja19mdW5jdGlvbl9saXN0OworCisjZGVmaW5lIF9DS19ERUNMQVJFX0ZVTkNUSU9OKG5hbWUsIGFyZ3MpCVwKK3R5cGVkZWYgY2tfcnZfdCAoKkNLXyAjIyBuYW1lKSBhcmdzOwkJXAorY2tfcnZfdCBDS19TUEVDIG5hbWUgYXJncworCitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19Jbml0aWFsaXplLCAodm9pZCAqaW5pdF9hcmdzKSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19GaW5hbGl6ZSwgKHZvaWQgKnJlc2VydmVkKSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19HZXRJbmZvLCAoc3RydWN0IGNrX2luZm8gKmluZm8pKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0dldEZ1bmN0aW9uTGlzdCwKKwkJICAgICAgKHN0cnVjdCBja19mdW5jdGlvbl9saXN0ICoqZnVuY3Rpb25fbGlzdCkpOworCitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19HZXRTbG90TGlzdCwKKwkJICAgICAgKHVuc2lnbmVkIGNoYXIgdG9rZW5fcHJlc2VudCwgY2tfc2xvdF9pZF90ICpzbG90X2xpc3QsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICpjb3VudCkpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfR2V0U2xvdEluZm8sCisJCSAgICAgIChja19zbG90X2lkX3Qgc2xvdF9pZCwgc3RydWN0IGNrX3Nsb3RfaW5mbyAqaW5mbykpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfR2V0VG9rZW5JbmZvLAorCQkgICAgICAoY2tfc2xvdF9pZF90IHNsb3RfaWQsIHN0cnVjdCBja190b2tlbl9pbmZvICppbmZvKSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19XYWl0Rm9yU2xvdEV2ZW50LAorCQkgICAgICAoY2tfZmxhZ3NfdCBmbGFncywgY2tfc2xvdF9pZF90ICpzbG90LCB2b2lkICpyZXNlcnZlZCkpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfR2V0TWVjaGFuaXNtTGlzdCwKKwkJICAgICAgKGNrX3Nsb3RfaWRfdCBzbG90X2lkLAorCQkgICAgICAgY2tfbWVjaGFuaXNtX3R5cGVfdCAqbWVjaGFuaXNtX2xpc3QsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICpjb3VudCkpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfR2V0TWVjaGFuaXNtSW5mbywKKwkJICAgICAgKGNrX3Nsb3RfaWRfdCBzbG90X2lkLCBja19tZWNoYW5pc21fdHlwZV90IHR5cGUsCisJCSAgICAgICBzdHJ1Y3QgY2tfbWVjaGFuaXNtX2luZm8gKmluZm8pKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0luaXRUb2tlbiwKKwkJICAgICAgKGNrX3Nsb3RfaWRfdCBzbG90X2lkLCB1bnNpZ25lZCBjaGFyICpwaW4sCisJCSAgICAgICB1bnNpZ25lZCBsb25nIHBpbl9sZW4sIHVuc2lnbmVkIGNoYXIgKmxhYmVsKSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19Jbml0UElOLAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLCB1bnNpZ25lZCBjaGFyICpwaW4sCisJCSAgICAgICB1bnNpZ25lZCBsb25nIHBpbl9sZW4pKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX1NldFBJTiwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwgdW5zaWduZWQgY2hhciAqb2xkX3BpbiwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgb2xkX2xlbiwgdW5zaWduZWQgY2hhciAqbmV3X3BpbiwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgbmV3X2xlbikpOworCitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19PcGVuU2Vzc2lvbiwKKwkJICAgICAgKGNrX3Nsb3RfaWRfdCBzbG90X2lkLCBja19mbGFnc190IGZsYWdzLAorCQkgICAgICAgdm9pZCAqYXBwbGljYXRpb24sIGNrX25vdGlmeV90IG5vdGlmeSwKKwkJICAgICAgIGNrX3Nlc3Npb25faGFuZGxlX3QgKnNlc3Npb24pKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0Nsb3NlU2Vzc2lvbiwgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbikpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfQ2xvc2VBbGxTZXNzaW9ucywgKGNrX3Nsb3RfaWRfdCBzbG90X2lkKSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19HZXRTZXNzaW9uSW5mbywKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHN0cnVjdCBja19zZXNzaW9uX2luZm8gKmluZm8pKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0dldE9wZXJhdGlvblN0YXRlLAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqb3BlcmF0aW9uX3N0YXRlLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqb3BlcmF0aW9uX3N0YXRlX2xlbikpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfU2V0T3BlcmF0aW9uU3RhdGUsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpvcGVyYXRpb25fc3RhdGUsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIG9wZXJhdGlvbl9zdGF0ZV9sZW4sCisJCSAgICAgICBja19vYmplY3RfaGFuZGxlX3QgZW5jcnlwdGlvbl9rZXksCisJCSAgICAgICBja19vYmplY3RfaGFuZGxlX3QgYXV0aGVudGlhdGlvbl9rZXkpKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0xvZ2luLAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLCBja191c2VyX3R5cGVfdCB1c2VyX3R5cGUsCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpwaW4sIHVuc2lnbmVkIGxvbmcgcGluX2xlbikpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfTG9nb3V0LCAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uKSk7CisKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0NyZWF0ZU9iamVjdCwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHN0cnVjdCBja19hdHRyaWJ1dGUgKnRlbXBsLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgY2tfb2JqZWN0X2hhbmRsZV90ICpvYmplY3QpKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0NvcHlPYmplY3QsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sIGNrX29iamVjdF9oYW5kbGVfdCBvYmplY3QsCisJCSAgICAgICBzdHJ1Y3QgY2tfYXR0cmlidXRlICp0ZW1wbCwgdW5zaWduZWQgbG9uZyBjb3VudCwKKwkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCAqbmV3X29iamVjdCkpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfRGVzdHJveU9iamVjdCwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCBvYmplY3QpKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0dldE9iamVjdFNpemUsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICBja19vYmplY3RfaGFuZGxlX3Qgb2JqZWN0LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqc2l6ZSkpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfR2V0QXR0cmlidXRlVmFsdWUsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICBja19vYmplY3RfaGFuZGxlX3Qgb2JqZWN0LAorCQkgICAgICAgc3RydWN0IGNrX2F0dHJpYnV0ZSAqdGVtcGwsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50KSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19TZXRBdHRyaWJ1dGVWYWx1ZSwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCBvYmplY3QsCisJCSAgICAgICBzdHJ1Y3QgY2tfYXR0cmlidXRlICp0ZW1wbCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQpKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0ZpbmRPYmplY3RzSW5pdCwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHN0cnVjdCBja19hdHRyaWJ1dGUgKnRlbXBsLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCkpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfRmluZE9iamVjdHMsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICBja19vYmplY3RfaGFuZGxlX3QgKm9iamVjdCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgbWF4X29iamVjdF9jb3VudCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm9iamVjdF9jb3VudCkpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfRmluZE9iamVjdHNGaW5hbCwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbikpOworCitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19FbmNyeXB0SW5pdCwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHN0cnVjdCBja19tZWNoYW5pc20gKm1lY2hhbmlzbSwKKwkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCBrZXkpKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0VuY3J5cHQsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBsb25nIGRhdGFfbGVuLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqZW5jcnlwdGVkX2RhdGEsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICplbmNyeXB0ZWRfZGF0YV9sZW4pKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0VuY3J5cHRVcGRhdGUsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpwYXJ0LCB1bnNpZ25lZCBsb25nIHBhcnRfbGVuLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqZW5jcnlwdGVkX3BhcnQsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICplbmNyeXB0ZWRfcGFydF9sZW4pKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0VuY3J5cHRGaW5hbCwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmxhc3RfZW5jcnlwdGVkX3BhcnQsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICpsYXN0X2VuY3J5cHRlZF9wYXJ0X2xlbikpOworCitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19EZWNyeXB0SW5pdCwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHN0cnVjdCBja19tZWNoYW5pc20gKm1lY2hhbmlzbSwKKwkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCBrZXkpKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0RlY3J5cHQsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICplbmNyeXB0ZWRfZGF0YSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgZW5jcnlwdGVkX2RhdGFfbGVuLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgbG9uZyAqZGF0YV9sZW4pKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0RlY3J5cHRVcGRhdGUsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICplbmNyeXB0ZWRfcGFydCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgZW5jcnlwdGVkX3BhcnRfbGVuLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqcGFydCwgdW5zaWduZWQgbG9uZyAqcGFydF9sZW4pKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0RlY3J5cHRGaW5hbCwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmxhc3RfcGFydCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmxhc3RfcGFydF9sZW4pKTsKKworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfRGlnZXN0SW5pdCwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHN0cnVjdCBja19tZWNoYW5pc20gKm1lY2hhbmlzbSkpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfRGlnZXN0LAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgbG9uZyBkYXRhX2xlbiwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmRpZ2VzdCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmRpZ2VzdF9sZW4pKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0RpZ2VzdFVwZGF0ZSwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnBhcnQsIHVuc2lnbmVkIGxvbmcgcGFydF9sZW4pKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0RpZ2VzdEtleSwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwgY2tfb2JqZWN0X2hhbmRsZV90IGtleSkpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfRGlnZXN0RmluYWwsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpkaWdlc3QsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICpkaWdlc3RfbGVuKSk7CisKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX1NpZ25Jbml0LAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgc3RydWN0IGNrX21lY2hhbmlzbSAqbWVjaGFuaXNtLAorCQkgICAgICAgY2tfb2JqZWN0X2hhbmRsZV90IGtleSkpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfU2lnbiwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGxvbmcgZGF0YV9sZW4sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICpzaWduYXR1cmVfbGVuKSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19TaWduVXBkYXRlLAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqcGFydCwgdW5zaWduZWQgbG9uZyBwYXJ0X2xlbikpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfU2lnbkZpbmFsLAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqc2lnbmF0dXJlLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqc2lnbmF0dXJlX2xlbikpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfU2lnblJlY292ZXJJbml0LAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgc3RydWN0IGNrX21lY2hhbmlzbSAqbWVjaGFuaXNtLAorCQkgICAgICAgY2tfb2JqZWN0X2hhbmRsZV90IGtleSkpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfU2lnblJlY292ZXIsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBsb25nIGRhdGFfbGVuLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqc2lnbmF0dXJlLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqc2lnbmF0dXJlX2xlbikpOworCitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19WZXJpZnlJbml0LAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgc3RydWN0IGNrX21lY2hhbmlzbSAqbWVjaGFuaXNtLAorCQkgICAgICAgY2tfb2JqZWN0X2hhbmRsZV90IGtleSkpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfVmVyaWZ5LAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgbG9uZyBkYXRhX2xlbiwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnNpZ25hdHVyZSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2lnbmF0dXJlX2xlbikpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfVmVyaWZ5VXBkYXRlLAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqcGFydCwgdW5zaWduZWQgbG9uZyBwYXJ0X2xlbikpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfVmVyaWZ5RmluYWwsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIHNpZ25hdHVyZV9sZW4pKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX1ZlcmlmeVJlY292ZXJJbml0LAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgc3RydWN0IGNrX21lY2hhbmlzbSAqbWVjaGFuaXNtLAorCQkgICAgICAgY2tfb2JqZWN0X2hhbmRsZV90IGtleSkpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfVmVyaWZ5UmVjb3ZlciwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnNpZ25hdHVyZSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2lnbmF0dXJlX2xlbiwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICpkYXRhX2xlbikpOworCitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19EaWdlc3RFbmNyeXB0VXBkYXRlLAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqcGFydCwgdW5zaWduZWQgbG9uZyBwYXJ0X2xlbiwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmVuY3J5cHRlZF9wYXJ0LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqZW5jcnlwdGVkX3BhcnRfbGVuKSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19EZWNyeXB0RGlnZXN0VXBkYXRlLAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqZW5jcnlwdGVkX3BhcnQsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGVuY3J5cHRlZF9wYXJ0X2xlbiwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnBhcnQsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICpwYXJ0X2xlbikpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfU2lnbkVuY3J5cHRVcGRhdGUsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpwYXJ0LCB1bnNpZ25lZCBsb25nIHBhcnRfbGVuLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqZW5jcnlwdGVkX3BhcnQsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICplbmNyeXB0ZWRfcGFydF9sZW4pKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0RlY3J5cHRWZXJpZnlVcGRhdGUsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICplbmNyeXB0ZWRfcGFydCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgZW5jcnlwdGVkX3BhcnRfbGVuLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqcGFydCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnBhcnRfbGVuKSk7CisKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0dlbmVyYXRlS2V5LAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgc3RydWN0IGNrX21lY2hhbmlzbSAqbWVjaGFuaXNtLAorCQkgICAgICAgc3RydWN0IGNrX2F0dHJpYnV0ZSAqdGVtcGwsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LAorCQkgICAgICAgY2tfb2JqZWN0X2hhbmRsZV90ICprZXkpKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0dlbmVyYXRlS2V5UGFpciwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHN0cnVjdCBja19tZWNoYW5pc20gKm1lY2hhbmlzbSwKKwkJICAgICAgIHN0cnVjdCBja19hdHRyaWJ1dGUgKnB1YmxpY19rZXlfdGVtcGxhdGUsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIHB1YmxpY19rZXlfYXR0cmlidXRlX2NvdW50LAorCQkgICAgICAgc3RydWN0IGNrX2F0dHJpYnV0ZSAqcHJpdmF0ZV9rZXlfdGVtcGxhdGUsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIHByaXZhdGVfa2V5X2F0dHJpYnV0ZV9jb3VudCwKKwkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCAqcHVibGljX2tleSwKKwkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCAqcHJpdmF0ZV9rZXkpKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX1dyYXBLZXksCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICBzdHJ1Y3QgY2tfbWVjaGFuaXNtICptZWNoYW5pc20sCisJCSAgICAgICBja19vYmplY3RfaGFuZGxlX3Qgd3JhcHBpbmdfa2V5LAorCQkgICAgICAgY2tfb2JqZWN0X2hhbmRsZV90IGtleSwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKndyYXBwZWRfa2V5LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqd3JhcHBlZF9rZXlfbGVuKSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19VbndyYXBLZXksCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICBzdHJ1Y3QgY2tfbWVjaGFuaXNtICptZWNoYW5pc20sCisJCSAgICAgICBja19vYmplY3RfaGFuZGxlX3QgdW53cmFwcGluZ19rZXksCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICp3cmFwcGVkX2tleSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgd3JhcHBlZF9rZXlfbGVuLAorCQkgICAgICAgc3RydWN0IGNrX2F0dHJpYnV0ZSAqdGVtcGwsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGF0dHJpYnV0ZV9jb3VudCwKKwkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCAqa2V5KSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19EZXJpdmVLZXksCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICBzdHJ1Y3QgY2tfbWVjaGFuaXNtICptZWNoYW5pc20sCisJCSAgICAgICBja19vYmplY3RfaGFuZGxlX3QgYmFzZV9rZXksCisJCSAgICAgICBzdHJ1Y3QgY2tfYXR0cmlidXRlICp0ZW1wbCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXR0cmlidXRlX2NvdW50LAorCQkgICAgICAgY2tfb2JqZWN0X2hhbmRsZV90ICprZXkpKTsKKworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfU2VlZFJhbmRvbSwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwgdW5zaWduZWQgY2hhciAqc2VlZCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2VlZF9sZW4pKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0dlbmVyYXRlUmFuZG9tLAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqcmFuZG9tX2RhdGEsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIHJhbmRvbV9sZW4pKTsKKworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfR2V0RnVuY3Rpb25TdGF0dXMsIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24pKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0NhbmNlbEZ1bmN0aW9uLCAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uKSk7CisKKworc3RydWN0IGNrX2Z1bmN0aW9uX2xpc3QKK3sKKyAgc3RydWN0IGNrX3ZlcnNpb24gdmVyc2lvbjsKKyAgQ0tfQ19Jbml0aWFsaXplIENfSW5pdGlhbGl6ZTsKKyAgQ0tfQ19GaW5hbGl6ZSBDX0ZpbmFsaXplOworICBDS19DX0dldEluZm8gQ19HZXRJbmZvOworICBDS19DX0dldEZ1bmN0aW9uTGlzdCBDX0dldEZ1bmN0aW9uTGlzdDsKKyAgQ0tfQ19HZXRTbG90TGlzdCBDX0dldFNsb3RMaXN0OworICBDS19DX0dldFNsb3RJbmZvIENfR2V0U2xvdEluZm87CisgIENLX0NfR2V0VG9rZW5JbmZvIENfR2V0VG9rZW5JbmZvOworICBDS19DX0dldE1lY2hhbmlzbUxpc3QgQ19HZXRNZWNoYW5pc21MaXN0OworICBDS19DX0dldE1lY2hhbmlzbUluZm8gQ19HZXRNZWNoYW5pc21JbmZvOworICBDS19DX0luaXRUb2tlbiBDX0luaXRUb2tlbjsKKyAgQ0tfQ19Jbml0UElOIENfSW5pdFBJTjsKKyAgQ0tfQ19TZXRQSU4gQ19TZXRQSU47CisgIENLX0NfT3BlblNlc3Npb24gQ19PcGVuU2Vzc2lvbjsKKyAgQ0tfQ19DbG9zZVNlc3Npb24gQ19DbG9zZVNlc3Npb247CisgIENLX0NfQ2xvc2VBbGxTZXNzaW9ucyBDX0Nsb3NlQWxsU2Vzc2lvbnM7CisgIENLX0NfR2V0U2Vzc2lvbkluZm8gQ19HZXRTZXNzaW9uSW5mbzsKKyAgQ0tfQ19HZXRPcGVyYXRpb25TdGF0ZSBDX0dldE9wZXJhdGlvblN0YXRlOworICBDS19DX1NldE9wZXJhdGlvblN0YXRlIENfU2V0T3BlcmF0aW9uU3RhdGU7CisgIENLX0NfTG9naW4gQ19Mb2dpbjsKKyAgQ0tfQ19Mb2dvdXQgQ19Mb2dvdXQ7CisgIENLX0NfQ3JlYXRlT2JqZWN0IENfQ3JlYXRlT2JqZWN0OworICBDS19DX0NvcHlPYmplY3QgQ19Db3B5T2JqZWN0OworICBDS19DX0Rlc3Ryb3lPYmplY3QgQ19EZXN0cm95T2JqZWN0OworICBDS19DX0dldE9iamVjdFNpemUgQ19HZXRPYmplY3RTaXplOworICBDS19DX0dldEF0dHJpYnV0ZVZhbHVlIENfR2V0QXR0cmlidXRlVmFsdWU7CisgIENLX0NfU2V0QXR0cmlidXRlVmFsdWUgQ19TZXRBdHRyaWJ1dGVWYWx1ZTsKKyAgQ0tfQ19GaW5kT2JqZWN0c0luaXQgQ19GaW5kT2JqZWN0c0luaXQ7CisgIENLX0NfRmluZE9iamVjdHMgQ19GaW5kT2JqZWN0czsKKyAgQ0tfQ19GaW5kT2JqZWN0c0ZpbmFsIENfRmluZE9iamVjdHNGaW5hbDsKKyAgQ0tfQ19FbmNyeXB0SW5pdCBDX0VuY3J5cHRJbml0OworICBDS19DX0VuY3J5cHQgQ19FbmNyeXB0OworICBDS19DX0VuY3J5cHRVcGRhdGUgQ19FbmNyeXB0VXBkYXRlOworICBDS19DX0VuY3J5cHRGaW5hbCBDX0VuY3J5cHRGaW5hbDsKKyAgQ0tfQ19EZWNyeXB0SW5pdCBDX0RlY3J5cHRJbml0OworICBDS19DX0RlY3J5cHQgQ19EZWNyeXB0OworICBDS19DX0RlY3J5cHRVcGRhdGUgQ19EZWNyeXB0VXBkYXRlOworICBDS19DX0RlY3J5cHRGaW5hbCBDX0RlY3J5cHRGaW5hbDsKKyAgQ0tfQ19EaWdlc3RJbml0IENfRGlnZXN0SW5pdDsKKyAgQ0tfQ19EaWdlc3QgQ19EaWdlc3Q7CisgIENLX0NfRGlnZXN0VXBkYXRlIENfRGlnZXN0VXBkYXRlOworICBDS19DX0RpZ2VzdEtleSBDX0RpZ2VzdEtleTsKKyAgQ0tfQ19EaWdlc3RGaW5hbCBDX0RpZ2VzdEZpbmFsOworICBDS19DX1NpZ25Jbml0IENfU2lnbkluaXQ7CisgIENLX0NfU2lnbiBDX1NpZ247CisgIENLX0NfU2lnblVwZGF0ZSBDX1NpZ25VcGRhdGU7CisgIENLX0NfU2lnbkZpbmFsIENfU2lnbkZpbmFsOworICBDS19DX1NpZ25SZWNvdmVySW5pdCBDX1NpZ25SZWNvdmVySW5pdDsKKyAgQ0tfQ19TaWduUmVjb3ZlciBDX1NpZ25SZWNvdmVyOworICBDS19DX1ZlcmlmeUluaXQgQ19WZXJpZnlJbml0OworICBDS19DX1ZlcmlmeSBDX1ZlcmlmeTsKKyAgQ0tfQ19WZXJpZnlVcGRhdGUgQ19WZXJpZnlVcGRhdGU7CisgIENLX0NfVmVyaWZ5RmluYWwgQ19WZXJpZnlGaW5hbDsKKyAgQ0tfQ19WZXJpZnlSZWNvdmVySW5pdCBDX1ZlcmlmeVJlY292ZXJJbml0OworICBDS19DX1ZlcmlmeVJlY292ZXIgQ19WZXJpZnlSZWNvdmVyOworICBDS19DX0RpZ2VzdEVuY3J5cHRVcGRhdGUgQ19EaWdlc3RFbmNyeXB0VXBkYXRlOworICBDS19DX0RlY3J5cHREaWdlc3RVcGRhdGUgQ19EZWNyeXB0RGlnZXN0VXBkYXRlOworICBDS19DX1NpZ25FbmNyeXB0VXBkYXRlIENfU2lnbkVuY3J5cHRVcGRhdGU7CisgIENLX0NfRGVjcnlwdFZlcmlmeVVwZGF0ZSBDX0RlY3J5cHRWZXJpZnlVcGRhdGU7CisgIENLX0NfR2VuZXJhdGVLZXkgQ19HZW5lcmF0ZUtleTsKKyAgQ0tfQ19HZW5lcmF0ZUtleVBhaXIgQ19HZW5lcmF0ZUtleVBhaXI7CisgIENLX0NfV3JhcEtleSBDX1dyYXBLZXk7CisgIENLX0NfVW53cmFwS2V5IENfVW53cmFwS2V5OworICBDS19DX0Rlcml2ZUtleSBDX0Rlcml2ZUtleTsKKyAgQ0tfQ19TZWVkUmFuZG9tIENfU2VlZFJhbmRvbTsKKyAgQ0tfQ19HZW5lcmF0ZVJhbmRvbSBDX0dlbmVyYXRlUmFuZG9tOworICBDS19DX0dldEZ1bmN0aW9uU3RhdHVzIENfR2V0RnVuY3Rpb25TdGF0dXM7CisgIENLX0NfQ2FuY2VsRnVuY3Rpb24gQ19DYW5jZWxGdW5jdGlvbjsKKyAgQ0tfQ19XYWl0Rm9yU2xvdEV2ZW50IENfV2FpdEZvclNsb3RFdmVudDsKK307CisKKwordHlwZWRlZiBja19ydl90ICgqY2tfY3JlYXRlbXV0ZXhfdCkgKHZvaWQgKiptdXRleCk7Cit0eXBlZGVmIGNrX3J2X3QgKCpja19kZXN0cm95bXV0ZXhfdCkgKHZvaWQgKm11dGV4KTsKK3R5cGVkZWYgY2tfcnZfdCAoKmNrX2xvY2ttdXRleF90KSAodm9pZCAqbXV0ZXgpOwordHlwZWRlZiBja19ydl90ICgqY2tfdW5sb2NrbXV0ZXhfdCkgKHZvaWQgKm11dGV4KTsKKworCitzdHJ1Y3QgY2tfY19pbml0aWFsaXplX2FyZ3MKK3sKKyAgY2tfY3JlYXRlbXV0ZXhfdCBjcmVhdGVfbXV0ZXg7CisgIGNrX2Rlc3Ryb3ltdXRleF90IGRlc3Ryb3lfbXV0ZXg7CisgIGNrX2xvY2ttdXRleF90IGxvY2tfbXV0ZXg7CisgIGNrX3VubG9ja211dGV4X3QgdW5sb2NrX211dGV4OworICBja19mbGFnc190IGZsYWdzOworICB2b2lkICpyZXNlcnZlZDsKK307CisKKworI2RlZmluZSBDS0ZfTElCUkFSWV9DQU5UX0NSRUFURV9PU19USFJFQURTCSgxIDw8IDApCisjZGVmaW5lIENLRl9PU19MT0NLSU5HX09LCQkJKDEgPDwgMSkKKworI2RlZmluZSBDS1JfT0sJCQkJCSgwKQorI2RlZmluZSBDS1JfQ0FOQ0VMCQkJCSgxKQorI2RlZmluZSBDS1JfSE9TVF9NRU1PUlkJCQkJKDIpCisjZGVmaW5lIENLUl9TTE9UX0lEX0lOVkFMSUQJCQkoMykKKyNkZWZpbmUgQ0tSX0dFTkVSQUxfRVJST1IJCQkoNSkKKyNkZWZpbmUgQ0tSX0ZVTkNUSU9OX0ZBSUxFRAkJCSg2KQorI2RlZmluZSBDS1JfQVJHVU1FTlRTX0JBRAkJCSg3KQorI2RlZmluZSBDS1JfTk9fRVZFTlQJCQkJKDgpCisjZGVmaW5lIENLUl9ORUVEX1RPX0NSRUFURV9USFJFQURTCQkoOSkKKyNkZWZpbmUgQ0tSX0NBTlRfTE9DSwkJCQkoMHhhKQorI2RlZmluZSBDS1JfQVRUUklCVVRFX1JFQURfT05MWQkJCSgweDEwKQorI2RlZmluZSBDS1JfQVRUUklCVVRFX1NFTlNJVElWRQkJCSgweDExKQorI2RlZmluZSBDS1JfQVRUUklCVVRFX1RZUEVfSU5WQUxJRAkJKDB4MTIpCisjZGVmaW5lIENLUl9BVFRSSUJVVEVfVkFMVUVfSU5WQUxJRAkJKDB4MTMpCisjZGVmaW5lIENLUl9EQVRBX0lOVkFMSUQJCQkoMHgyMCkKKyNkZWZpbmUgQ0tSX0RBVEFfTEVOX1JBTkdFCQkJKDB4MjEpCisjZGVmaW5lIENLUl9ERVZJQ0VfRVJST1IJCQkoMHgzMCkKKyNkZWZpbmUgQ0tSX0RFVklDRV9NRU1PUlkJCQkoMHgzMSkKKyNkZWZpbmUgQ0tSX0RFVklDRV9SRU1PVkVECQkJKDB4MzIpCisjZGVmaW5lIENLUl9FTkNSWVBURURfREFUQV9JTlZBTElECQkoMHg0MCkKKyNkZWZpbmUgQ0tSX0VOQ1JZUFRFRF9EQVRBX0xFTl9SQU5HRQkJKDB4NDEpCisjZGVmaW5lIENLUl9GVU5DVElPTl9DQU5DRUxFRAkJCSgweDUwKQorI2RlZmluZSBDS1JfRlVOQ1RJT05fTk9UX1BBUkFMTEVMCQkoMHg1MSkKKyNkZWZpbmUgQ0tSX0ZVTkNUSU9OX05PVF9TVVBQT1JURUQJCSgweDU0KQorI2RlZmluZSBDS1JfS0VZX0hBTkRMRV9JTlZBTElECQkJKDB4NjApCisjZGVmaW5lIENLUl9LRVlfU0laRV9SQU5HRQkJCSgweDYyKQorI2RlZmluZSBDS1JfS0VZX1RZUEVfSU5DT05TSVNURU5UCQkoMHg2MykKKyNkZWZpbmUgQ0tSX0tFWV9OT1RfTkVFREVECQkJKDB4NjQpCisjZGVmaW5lIENLUl9LRVlfQ0hBTkdFRAkJCQkoMHg2NSkKKyNkZWZpbmUgQ0tSX0tFWV9ORUVERUQJCQkJKDB4NjYpCisjZGVmaW5lIENLUl9LRVlfSU5ESUdFU1RJQkxFCQkJKDB4NjcpCisjZGVmaW5lIENLUl9LRVlfRlVOQ1RJT05fTk9UX1BFUk1JVFRFRAkJKDB4NjgpCisjZGVmaW5lIENLUl9LRVlfTk9UX1dSQVBQQUJMRQkJCSgweDY5KQorI2RlZmluZSBDS1JfS0VZX1VORVhUUkFDVEFCTEUJCQkoMHg2YSkKKyNkZWZpbmUgQ0tSX01FQ0hBTklTTV9JTlZBTElECQkJKDB4NzApCisjZGVmaW5lIENLUl9NRUNIQU5JU01fUEFSQU1fSU5WQUxJRAkJKDB4NzEpCisjZGVmaW5lIENLUl9PQkpFQ1RfSEFORExFX0lOVkFMSUQJCSgweDgyKQorI2RlZmluZSBDS1JfT1BFUkFUSU9OX0FDVElWRQkJCSgweDkwKQorI2RlZmluZSBDS1JfT1BFUkFUSU9OX05PVF9JTklUSUFMSVpFRAkJKDB4OTEpCisjZGVmaW5lIENLUl9QSU5fSU5DT1JSRUNUCQkJKDB4YTApCisjZGVmaW5lIENLUl9QSU5fSU5WQUxJRAkJCQkoMHhhMSkKKyNkZWZpbmUgQ0tSX1BJTl9MRU5fUkFOR0UJCQkoMHhhMikKKyNkZWZpbmUgQ0tSX1BJTl9FWFBJUkVECQkJCSgweGEzKQorI2RlZmluZSBDS1JfUElOX0xPQ0tFRAkJCQkoMHhhNCkKKyNkZWZpbmUgQ0tSX1NFU1NJT05fQ0xPU0VECQkJKDB4YjApCisjZGVmaW5lIENLUl9TRVNTSU9OX0NPVU5UCQkJKDB4YjEpCisjZGVmaW5lIENLUl9TRVNTSU9OX0hBTkRMRV9JTlZBTElECQkoMHhiMykKKyNkZWZpbmUgQ0tSX1NFU1NJT05fUEFSQUxMRUxfTk9UX1NVUFBPUlRFRAkoMHhiNCkKKyNkZWZpbmUgQ0tSX1NFU1NJT05fUkVBRF9PTkxZCQkJKDB4YjUpCisjZGVmaW5lIENLUl9TRVNTSU9OX0VYSVNUUwkJCSgweGI2KQorI2RlZmluZSBDS1JfU0VTU0lPTl9SRUFEX09OTFlfRVhJU1RTCQkoMHhiNykKKyNkZWZpbmUgQ0tSX1NFU1NJT05fUkVBRF9XUklURV9TT19FWElTVFMJKDB4YjgpCisjZGVmaW5lIENLUl9TSUdOQVRVUkVfSU5WQUxJRAkJCSgweGMwKQorI2RlZmluZSBDS1JfU0lHTkFUVVJFX0xFTl9SQU5HRQkJCSgweGMxKQorI2RlZmluZSBDS1JfVEVNUExBVEVfSU5DT01QTEVURQkJCSgweGQwKQorI2RlZmluZSBDS1JfVEVNUExBVEVfSU5DT05TSVNURU5UCQkoMHhkMSkKKyNkZWZpbmUgQ0tSX1RPS0VOX05PVF9QUkVTRU5UCQkJKDB4ZTApCisjZGVmaW5lIENLUl9UT0tFTl9OT1RfUkVDT0dOSVpFRAkJKDB4ZTEpCisjZGVmaW5lIENLUl9UT0tFTl9XUklURV9QUk9URUNURUQJCSgweGUyKQorI2RlZmluZQlDS1JfVU5XUkFQUElOR19LRVlfSEFORExFX0lOVkFMSUQJKDB4ZjApCisjZGVmaW5lIENLUl9VTldSQVBQSU5HX0tFWV9TSVpFX1JBTkdFCQkoMHhmMSkKKyNkZWZpbmUgQ0tSX1VOV1JBUFBJTkdfS0VZX1RZUEVfSU5DT05TSVNURU5UCSgweGYyKQorI2RlZmluZSBDS1JfVVNFUl9BTFJFQURZX0xPR0dFRF9JTgkJKDB4MTAwKQorI2RlZmluZSBDS1JfVVNFUl9OT1RfTE9HR0VEX0lOCQkJKDB4MTAxKQorI2RlZmluZSBDS1JfVVNFUl9QSU5fTk9UX0lOSVRJQUxJWkVECQkoMHgxMDIpCisjZGVmaW5lIENLUl9VU0VSX1RZUEVfSU5WQUxJRAkJCSgweDEwMykKKyNkZWZpbmUgQ0tSX1VTRVJfQU5PVEhFUl9BTFJFQURZX0xPR0dFRF9JTgkoMHgxMDQpCisjZGVmaW5lIENLUl9VU0VSX1RPT19NQU5ZX1RZUEVTCQkJKDB4MTA1KQorI2RlZmluZSBDS1JfV1JBUFBFRF9LRVlfSU5WQUxJRAkJCSgweDExMCkKKyNkZWZpbmUgQ0tSX1dSQVBQRURfS0VZX0xFTl9SQU5HRQkJKDB4MTEyKQorI2RlZmluZSBDS1JfV1JBUFBJTkdfS0VZX0hBTkRMRV9JTlZBTElECQkoMHgxMTMpCisjZGVmaW5lIENLUl9XUkFQUElOR19LRVlfU0laRV9SQU5HRQkJKDB4MTE0KQorI2RlZmluZSBDS1JfV1JBUFBJTkdfS0VZX1RZUEVfSU5DT05TSVNURU5UCSgweDExNSkKKyNkZWZpbmUgQ0tSX1JBTkRPTV9TRUVEX05PVF9TVVBQT1JURUQJCSgweDEyMCkKKyNkZWZpbmUgQ0tSX1JBTkRPTV9OT19STkcJCQkoMHgxMjEpCisjZGVmaW5lIENLUl9ET01BSU5fUEFSQU1TX0lOVkFMSUQJCSgweDEzMCkKKyNkZWZpbmUgQ0tSX0JVRkZFUl9UT09fU01BTEwJCQkoMHgxNTApCisjZGVmaW5lIENLUl9TQVZFRF9TVEFURV9JTlZBTElECQkJKDB4MTYwKQorI2RlZmluZSBDS1JfSU5GT1JNQVRJT05fU0VOU0lUSVZFCQkoMHgxNzApCisjZGVmaW5lIENLUl9TVEFURV9VTlNBVkVBQkxFCQkJKDB4MTgwKQorI2RlZmluZSBDS1JfQ1JZUFRPS0lfTk9UX0lOSVRJQUxJWkVECQkoMHgxOTApCisjZGVmaW5lIENLUl9DUllQVE9LSV9BTFJFQURZX0lOSVRJQUxJWkVECSgweDE5MSkKKyNkZWZpbmUgQ0tSX01VVEVYX0JBRAkJCQkoMHgxYTApCisjZGVmaW5lIENLUl9NVVRFWF9OT1RfTE9DS0VECQkJKDB4MWExKQorI2RlZmluZSBDS1JfRlVOQ1RJT05fUkVKRUNURUQJCQkoMHgyMDApCisjZGVmaW5lIENLUl9WRU5ET1JfREVGSU5FRAkJCSgodW5zaWduZWQgbG9uZykgKDEgPDwgMzEpKQorCisKKworLyogQ29tcGF0aWJpbGl0eSBsYXllci4gICovCisKKyNpZmRlZiBDUllQVE9LSV9DT01QQVQKKworI3VuZGVmIENLX0RFRklORV9GVU5DVElPTgorI2RlZmluZSBDS19ERUZJTkVfRlVOQ1RJT04ocmV0dmFsLCBuYW1lKSByZXR2YWwgQ0tfU1BFQyBuYW1lCisKKy8qIEZvciBOVUxMLiAgKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIENLX0JZVEU7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgQ0tfQ0hBUjsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBDS19VVEY4Q0hBUjsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBDS19CQk9PTDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgQ0tfVUxPTkc7Cit0eXBlZGVmIGxvbmcgaW50IENLX0xPTkc7Cit0eXBlZGVmIENLX0JZVEUgKkNLX0JZVEVfUFRSOwordHlwZWRlZiBDS19DSEFSICpDS19DSEFSX1BUUjsKK3R5cGVkZWYgQ0tfVVRGOENIQVIgKkNLX1VURjhDSEFSX1BUUjsKK3R5cGVkZWYgQ0tfVUxPTkcgKkNLX1VMT05HX1BUUjsKK3R5cGVkZWYgdm9pZCAqQ0tfVk9JRF9QVFI7Cit0eXBlZGVmIHZvaWQgKipDS19WT0lEX1BUUl9QVFI7CisjZGVmaW5lIENLX0ZBTFNFIDAKKyNkZWZpbmUgQ0tfVFJVRSAxCisjaWZuZGVmIENLX0RJU0FCTEVfVFJVRV9GQUxTRQorI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFIDEKKyNlbmRpZgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGNrX3ZlcnNpb24gQ0tfVkVSU0lPTjsKK3R5cGVkZWYgc3RydWN0IGNrX3ZlcnNpb24gKkNLX1ZFUlNJT05fUFRSOworCit0eXBlZGVmIHN0cnVjdCBja19pbmZvIENLX0lORk87Cit0eXBlZGVmIHN0cnVjdCBja19pbmZvICpDS19JTkZPX1BUUjsKKwordHlwZWRlZiBja19zbG90X2lkX3QgKkNLX1NMT1RfSURfUFRSOworCit0eXBlZGVmIHN0cnVjdCBja19zbG90X2luZm8gQ0tfU0xPVF9JTkZPOwordHlwZWRlZiBzdHJ1Y3QgY2tfc2xvdF9pbmZvICpDS19TTE9UX0lORk9fUFRSOworCit0eXBlZGVmIHN0cnVjdCBja190b2tlbl9pbmZvIENLX1RPS0VOX0lORk87Cit0eXBlZGVmIHN0cnVjdCBja190b2tlbl9pbmZvICpDS19UT0tFTl9JTkZPX1BUUjsKKwordHlwZWRlZiBja19zZXNzaW9uX2hhbmRsZV90ICpDS19TRVNTSU9OX0hBTkRMRV9QVFI7CisKK3R5cGVkZWYgc3RydWN0IGNrX3Nlc3Npb25faW5mbyBDS19TRVNTSU9OX0lORk87Cit0eXBlZGVmIHN0cnVjdCBja19zZXNzaW9uX2luZm8gKkNLX1NFU1NJT05fSU5GT19QVFI7CisKK3R5cGVkZWYgY2tfb2JqZWN0X2hhbmRsZV90ICpDS19PQkpFQ1RfSEFORExFX1BUUjsKKwordHlwZWRlZiBja19vYmplY3RfY2xhc3NfdCAqQ0tfT0JKRUNUX0NMQVNTX1BUUjsKKwordHlwZWRlZiBzdHJ1Y3QgY2tfYXR0cmlidXRlIENLX0FUVFJJQlVURTsKK3R5cGVkZWYgc3RydWN0IGNrX2F0dHJpYnV0ZSAqQ0tfQVRUUklCVVRFX1BUUjsKKwordHlwZWRlZiBzdHJ1Y3QgY2tfZGF0ZSBDS19EQVRFOwordHlwZWRlZiBzdHJ1Y3QgY2tfZGF0ZSAqQ0tfREFURV9QVFI7CisKK3R5cGVkZWYgY2tfbWVjaGFuaXNtX3R5cGVfdCAqQ0tfTUVDSEFOSVNNX1RZUEVfUFRSOworCit0eXBlZGVmIHN0cnVjdCBja19tZWNoYW5pc20gQ0tfTUVDSEFOSVNNOwordHlwZWRlZiBzdHJ1Y3QgY2tfbWVjaGFuaXNtICpDS19NRUNIQU5JU01fUFRSOworCit0eXBlZGVmIHN0cnVjdCBja19tZWNoYW5pc21faW5mbyBDS19NRUNIQU5JU01fSU5GTzsKK3R5cGVkZWYgc3RydWN0IGNrX21lY2hhbmlzbV9pbmZvICpDS19NRUNIQU5JU01fSU5GT19QVFI7CisKK3R5cGVkZWYgc3RydWN0IGNrX2Z1bmN0aW9uX2xpc3QgQ0tfRlVOQ1RJT05fTElTVDsKK3R5cGVkZWYgc3RydWN0IGNrX2Z1bmN0aW9uX2xpc3QgKkNLX0ZVTkNUSU9OX0xJU1RfUFRSOwordHlwZWRlZiBzdHJ1Y3QgY2tfZnVuY3Rpb25fbGlzdCAqKkNLX0ZVTkNUSU9OX0xJU1RfUFRSX1BUUjsKKwordHlwZWRlZiBzdHJ1Y3QgY2tfY19pbml0aWFsaXplX2FyZ3MgQ0tfQ19JTklUSUFMSVpFX0FSR1M7Cit0eXBlZGVmIHN0cnVjdCBja19jX2luaXRpYWxpemVfYXJncyAqQ0tfQ19JTklUSUFMSVpFX0FSR1NfUFRSOworCisjZGVmaW5lIE5VTExfUFRSIE5VTEwKKworLyogRGVsZXRlIHRoZSBoZWxwZXIgbWFjcm9zIGRlZmluZWQgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZS4gICovCisjdW5kZWYgY2tfZmxhZ3NfdAorI3VuZGVmIGNrX3ZlcnNpb24KKworI3VuZGVmIGNrX2luZm8KKyN1bmRlZiBjcnlwdG9raV92ZXJzaW9uCisjdW5kZWYgbWFudWZhY3R1cmVyX2lkCisjdW5kZWYgbGlicmFyeV9kZXNjcmlwdGlvbgorI3VuZGVmIGxpYnJhcnlfdmVyc2lvbgorCisjdW5kZWYgY2tfbm90aWZpY2F0aW9uX3QKKyN1bmRlZiBja19zbG90X2lkX3QKKworI3VuZGVmIGNrX3Nsb3RfaW5mbworI3VuZGVmIHNsb3RfZGVzY3JpcHRpb24KKyN1bmRlZiBoYXJkd2FyZV92ZXJzaW9uCisjdW5kZWYgZmlybXdhcmVfdmVyc2lvbgorCisjdW5kZWYgY2tfdG9rZW5faW5mbworI3VuZGVmIHNlcmlhbF9udW1iZXIKKyN1bmRlZiBtYXhfc2Vzc2lvbl9jb3VudAorI3VuZGVmIHNlc3Npb25fY291bnQKKyN1bmRlZiBtYXhfcndfc2Vzc2lvbl9jb3VudAorI3VuZGVmIHJ3X3Nlc3Npb25fY291bnQKKyN1bmRlZiBtYXhfcGluX2xlbgorI3VuZGVmIG1pbl9waW5fbGVuCisjdW5kZWYgdG90YWxfcHVibGljX21lbW9yeQorI3VuZGVmIGZyZWVfcHVibGljX21lbW9yeQorI3VuZGVmIHRvdGFsX3ByaXZhdGVfbWVtb3J5CisjdW5kZWYgZnJlZV9wcml2YXRlX21lbW9yeQorI3VuZGVmIHV0Y190aW1lCisKKyN1bmRlZiBja19zZXNzaW9uX2hhbmRsZV90CisjdW5kZWYgY2tfdXNlcl90eXBlX3QKKyN1bmRlZiBja19zdGF0ZV90CisKKyN1bmRlZiBja19zZXNzaW9uX2luZm8KKyN1bmRlZiBzbG90X2lkCisjdW5kZWYgZGV2aWNlX2Vycm9yCisKKyN1bmRlZiBja19vYmplY3RfaGFuZGxlX3QKKyN1bmRlZiBja19vYmplY3RfY2xhc3NfdAorI3VuZGVmIGNrX2h3X2ZlYXR1cmVfdHlwZV90CisjdW5kZWYgY2tfa2V5X3R5cGVfdAorI3VuZGVmIGNrX2NlcnRpZmljYXRlX3R5cGVfdAorI3VuZGVmIGNrX2F0dHJpYnV0ZV90eXBlX3QKKworI3VuZGVmIGNrX2F0dHJpYnV0ZQorI3VuZGVmIHZhbHVlCisjdW5kZWYgdmFsdWVfbGVuCisKKyN1bmRlZiBja19kYXRlCisKKyN1bmRlZiBja19tZWNoYW5pc21fdHlwZV90CisKKyN1bmRlZiBja19tZWNoYW5pc20KKyN1bmRlZiBwYXJhbWV0ZXIKKyN1bmRlZiBwYXJhbWV0ZXJfbGVuCisKKyN1bmRlZiBja19tZWNoYW5pc21faW5mbworI3VuZGVmIG1pbl9rZXlfc2l6ZQorI3VuZGVmIG1heF9rZXlfc2l6ZQorCisjdW5kZWYgY2tfcnZfdAorI3VuZGVmIGNrX25vdGlmeV90CisKKyN1bmRlZiBja19mdW5jdGlvbl9saXN0CisKKyN1bmRlZiBja19jcmVhdGVtdXRleF90CisjdW5kZWYgY2tfZGVzdHJveW11dGV4X3QKKyN1bmRlZiBja19sb2NrbXV0ZXhfdAorI3VuZGVmIGNrX3VubG9ja211dGV4X3QKKworI3VuZGVmIGNrX2NfaW5pdGlhbGl6ZV9hcmdzCisjdW5kZWYgY3JlYXRlX211dGV4CisjdW5kZWYgZGVzdHJveV9tdXRleAorI3VuZGVmIGxvY2tfbXV0ZXgKKyN1bmRlZiB1bmxvY2tfbXV0ZXgKKyN1bmRlZiByZXNlcnZlZAorCisjZW5kaWYJLyogQ1JZUFRPS0lfQ09NUEFUICovCisKKworLyogU3lzdGVtIGRlcGVuZGVuY2llcy4gICovCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoQ1JZUFRPS0lfRk9SQ0VfV0lOMzIpCisjcHJhZ21hIHBhY2socG9wLCBjcnlwdG9raSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYJLyogUEtDUzExX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcGxhdGZvcm0uYyBiL29wZW5zc2gtNi4wcDEvcGxhdGZvcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDU1NDcyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9wbGF0Zm9ybS5jCkBAIC0wLDAgKzEsMTk2IEBACisvKiAkSWQ6IHBsYXRmb3JtLmMsdiAxLjE4IDIwMTEvMDEvMTEgMDY6MDI6MjUgZGptIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgRGFycmVuIFR1Y2tlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAic2VydmNvbmYuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJob3N0ZmlsZS5oIgorI2luY2x1ZGUgImF1dGguaCIKKyNpbmNsdWRlICJhdXRoLXBhbS5oIgorI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKyNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9vcGVuYnNkLWNvbXBhdC5oIgorCitleHRlcm4gaW50IHVzZV9wcml2c2VwOworZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKKwordm9pZAorcGxhdGZvcm1fcHJlX2xpc3Rlbih2b2lkKQoreworI2lmZGVmIExJTlVYX09PTV9BREpVU1QKKwkvKiBBZGp1c3Qgb3V0LW9mLW1lbW9yeSBraWxsZXIgc28gbGlzdGVuaW5nIHByb2Nlc3MgaXMgbm90IGtpbGxlZCAqLworCW9vbV9hZGp1c3Rfc2V0dXAoKTsKKyNlbmRpZgorfQorCit2b2lkCitwbGF0Zm9ybV9wcmVfZm9yayh2b2lkKQoreworI2lmZGVmIFVTRV9TT0xBUklTX1BST0NFU1NfQ09OVFJBQ1RTCisJc29sYXJpc19jb250cmFjdF9wcmVfZm9yaygpOworI2VuZGlmCit9CisKK3ZvaWQKK3BsYXRmb3JtX3Bvc3RfZm9ya19wYXJlbnQocGlkX3QgY2hpbGRfcGlkKQoreworI2lmZGVmIFVTRV9TT0xBUklTX1BST0NFU1NfQ09OVFJBQ1RTCisJc29sYXJpc19jb250cmFjdF9wb3N0X2ZvcmtfcGFyZW50KGNoaWxkX3BpZCk7CisjZW5kaWYKK30KKwordm9pZAorcGxhdGZvcm1fcG9zdF9mb3JrX2NoaWxkKHZvaWQpCit7CisjaWZkZWYgVVNFX1NPTEFSSVNfUFJPQ0VTU19DT05UUkFDVFMKKwlzb2xhcmlzX2NvbnRyYWN0X3Bvc3RfZm9ya19jaGlsZCgpOworI2VuZGlmCisjaWZkZWYgTElOVVhfT09NX0FESlVTVAorCW9vbV9hZGp1c3RfcmVzdG9yZSgpOworI2VuZGlmCit9CisKKy8qIHJldHVybiAxIGlmIHdlIGFyZSBydW5uaW5nIHdpdGggcHJpdmlsZWdlIHRvIHN3YXAgVUlEcywgMCBvdGhlcndpc2UgKi8KK2ludAorcGxhdGZvcm1fcHJpdmlsZWdlZF91aWRzd2FwKHZvaWQpCit7CisjaWZkZWYgSEFWRV9DWUdXSU4KKwkvKiB1aWQgMCBpcyBub3Qgc3BlY2lhbCBvbiBDeWd3aW4gc28gYWx3YXlzIHRyeSAqLworCXJldHVybiAxOworI2Vsc2UKKwlyZXR1cm4gKGdldHVpZCgpID09IDAgfHwgZ2V0ZXVpZCgpID09IDApOworI2VuZGlmCit9CisKKy8qCisgKiBUaGlzIGdldHMgY2FsbGVkIGJlZm9yZSBzd2l0Y2hpbmcgVUlEcywgYW5kIGlzIGNhbGxlZCBldmVuIHdoZW4gc3NoZCBpcworICogbm90IHJ1bm5pbmcgYXMgcm9vdC4KKyAqLwordm9pZAorcGxhdGZvcm1fc2V0dXNlcmNvbnRleHQoc3RydWN0IHBhc3N3ZCAqcHcpCit7CisjaWZkZWYgV0lUSF9TRUxJTlVYCisJLyogQ2FjaGUgc2VsaW51eCBzdGF0dXMgZm9yIGxhdGVyIHVzZSAqLworCSh2b2lkKXNzaF9zZWxpbnV4X2VuYWJsZWQoKTsKKyNlbmRpZgorCisjaWZkZWYgVVNFX1NPTEFSSVNfUFJPSkVDVFMKKwkvKiBpZiBzb2xhcmlzIHByb2plY3RzIHdlcmUgZGV0ZWN0ZWQsIHNldCB0aGUgZGVmYXVsdCBub3cgKi8KKwlpZiAoZ2V0dWlkKCkgPT0gMCB8fCBnZXRldWlkKCkgPT0gMCkKKwkJc29sYXJpc19zZXRfZGVmYXVsdF9wcm9qZWN0KHB3KTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX0xPR0lOX0NBUCkgJiYgZGVmaW5lZCAoX19ic2RpX18pCisJaWYgKGdldHVpZCgpID09IDAgfHwgZ2V0ZXVpZCgpID09IDApCisJCXNldHBnaWQoMCwgMCk7CisjIGVuZGlmCisKKyNpZiBkZWZpbmVkKEhBVkVfTE9HSU5fQ0FQKSAmJiBkZWZpbmVkKFVTRV9QQU0pCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGJvdGggTE9HSU5fQ0FQIGFuZCBQQU0sIHdlIHdhbnQgdG8gZXN0YWJsaXNoIGNyZWRzCisJICogYmVmb3JlIGNhbGxpbmcgc2V0dXNlcmNvbnRleHQgKGluIHNlc3Npb24uYzpkb19zZXR1c2VyY29udGV4dCkuCisJICovCisJaWYgKGdldHVpZCgpID09IDAgfHwgZ2V0ZXVpZCgpID09IDApIHsKKwkJaWYgKG9wdGlvbnMudXNlX3BhbSkgeworCQkJZG9fcGFtX3NldGNyZWQodXNlX3ByaXZzZXApOworCQl9CisJfQorIyBlbmRpZiAvKiBVU0VfUEFNICovCisKKyNpZiAhZGVmaW5lZChIQVZFX0xPR0lOX0NBUCkgJiYgZGVmaW5lZChIQVZFX0dFVExVSUQpICYmIGRlZmluZWQoSEFWRV9TRVRMVUlEKQorCWlmIChnZXR1aWQoKSA9PSAwIHx8IGdldGV1aWQoKSA9PSAwKSB7CisJCS8qIFNldHMgbG9naW4gdWlkIGZvciBhY2NvdW50aW5nICovCisJCWlmIChnZXRsdWlkKCkgPT0gLTEgJiYgc2V0bHVpZChwdy0+cHdfdWlkKSA9PSAtMSkKKwkJCWVycm9yKCJzZXRsdWlkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJfQorI2VuZGlmCit9CisKKy8qCisgKiBUaGlzIGdldHMgY2FsbGVkIGFmdGVyIHdlJ3ZlIGVzdGFibGlzaGVkIHRoZSB1c2VyJ3MgZ3JvdXBzLCBhbmQgaXMgb25seQorICogY2FsbGVkIGlmIHNzaGQgaXMgcnVubmluZyBhcyByb290LgorICovCit2b2lkCitwbGF0Zm9ybV9zZXR1c2VyY29udGV4dF9wb3N0X2dyb3VwcyhzdHJ1Y3QgcGFzc3dkICpwdykKK3sKKyNpZiAhZGVmaW5lZChIQVZFX0xPR0lOX0NBUCkgJiYgZGVmaW5lZChVU0VfUEFNKQorCS8qCisJICogUEFNIGNyZWRlbnRpYWxzIG1heSB0YWtlIHRoZSBmb3JtIG9mIHN1cHBsZW1lbnRhcnkgZ3JvdXBzLgorCSAqIFRoZXNlIHdpbGwgaGF2ZSBiZWVuIHdpcGVkIGJ5IHRoZSBhYm92ZSBpbml0Z3JvdXBzKCkgY2FsbC4KKwkgKiBSZWVzdGFibGlzaCB0aGVtIGhlcmUuCisJICovCisJaWYgKG9wdGlvbnMudXNlX3BhbSkgeworCQlkb19wYW1fc2V0Y3JlZCh1c2VfcHJpdnNlcCk7CisJfQorI2VuZGlmIC8qIFVTRV9QQU0gKi8KKworI2lmICFkZWZpbmVkKEhBVkVfTE9HSU5fQ0FQKSAmJiAoZGVmaW5lZChXSVRIX0lSSVhfUFJPSkVDVCkgfHwgXAorICAgIGRlZmluZWQoV0lUSF9JUklYX0pPQlMpIHx8IGRlZmluZWQoV0lUSF9JUklYX0FSUkFZKSkKKwlpcml4X3NldHVzZXJjb250ZXh0KHB3KTsKKyNlbmRpZiAvKiBkZWZpbmVkKFdJVEhfSVJJWF9QUk9KRUNUKSB8fCBkZWZpbmVkKFdJVEhfSVJJWF9KT0JTKSB8fCBkZWZpbmVkKFdJVEhfSVJJWF9BUlJBWSkgKi8KKworI2lmZGVmIF9BSVgKKwlhaXhfdXNyaW5mbyhwdyk7CisjZW5kaWYgLyogX0FJWCAqLworCisjaWYgIWRlZmluZWQoSEFWRV9MT0dJTl9DQVApICYmIGRlZmluZWQoVVNFX0xJQklBRikKKwlpZiAoc2V0X2lkKHB3LT5wd19uYW1lKSAhPSAwKSB7CisJCWV4aXQoMSk7CisJfQorIyBlbmRpZiAvKiBVU0VfTElCSUFGICovCisKKyNpZmRlZiBIQVZFX1NFVFBDUkVECisJLyoKKwkgKiBJZiB3ZSBoYXZlIGEgY2hyb290IGRpcmVjdG9yeSwgd2Ugc2V0IGFsbCBjcmVkcyBleGNlcHQgcmVhbAorCSAqIHVpZCB3aGljaCB3ZSB3aWxsIG5lZWQgZm9yIGNocm9vdC4gIElmIHdlIGRvbid0IGhhdmUgYQorCSAqIGNocm9vdCBkaXJlY3RvcnksIHdlIGRvbid0IG92ZXJyaWRlIGFueXRoaW5nLgorCSAqLworCXsKKwkJY2hhciAqKmNyZWRzID0gTlVMTCwgKmNocm9vdF9jcmVkc1tdID0KKwkJICAgIHsgIlJFQUxfVVNFUj1yb290IiwgTlVMTCB9OworCisJCWlmIChvcHRpb25zLmNocm9vdF9kaXJlY3RvcnkgIT0gTlVMTCAmJgorCQkgICAgc3RyY2FzZWNtcChvcHRpb25zLmNocm9vdF9kaXJlY3RvcnksICJub25lIikgIT0gMCkKKwkJCWNyZWRzID0gY2hyb290X2NyZWRzOworCisJCWlmIChzZXRwY3JlZChwdy0+cHdfbmFtZSwgY3JlZHMpID09IC0xKQorCQkJZmF0YWwoIkZhaWxlZCB0byBzZXQgcHJvY2VzcyBjcmVkZW50aWFscyIpOworCX0KKyNlbmRpZiAvKiBIQVZFX1NFVFBDUkVEICovCisjaWZkZWYgV0lUSF9TRUxJTlVYCisJc3NoX3NlbGludXhfc2V0dXBfZXhlY19jb250ZXh0KHB3LT5wd19uYW1lKTsKKyNlbmRpZgorfQorCitjaGFyICoKK3BsYXRmb3JtX2tyYjVfZ2V0X3ByaW5jaXBhbF9uYW1lKGNvbnN0IGNoYXIgKnB3X25hbWUpCit7CisjaWZkZWYgVVNFX0FJWF9LUkJfTkFNRQorCXJldHVybiBhaXhfa3JiNV9nZXRfcHJpbmNpcGFsX25hbWUocHdfbmFtZSk7CisjZWxzZQorCXJldHVybiBOVUxMOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3BsYXRmb3JtLmggYi9vcGVuc3NoLTYuMHAxL3BsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ0ZDJjMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcGxhdGZvcm0uaApAQCAtMCwwICsxLDMzIEBACisvKiAkSWQ6IHBsYXRmb3JtLmgsdiAxLjcgMjAxMC8xMS8wNSAwMzo0NzowMSBkdHVja2VyIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgRGFycmVuIFR1Y2tlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8cHdkLmg+CisKK3ZvaWQgcGxhdGZvcm1fcHJlX2xpc3Rlbih2b2lkKTsKK3ZvaWQgcGxhdGZvcm1fcHJlX2Zvcmsodm9pZCk7Cit2b2lkIHBsYXRmb3JtX3Bvc3RfZm9ya19wYXJlbnQocGlkX3QgY2hpbGRfcGlkKTsKK3ZvaWQgcGxhdGZvcm1fcG9zdF9mb3JrX2NoaWxkKHZvaWQpOworaW50ICBwbGF0Zm9ybV9wcml2aWxlZ2VkX3VpZHN3YXAodm9pZCk7Cit2b2lkIHBsYXRmb3JtX3NldHVzZXJjb250ZXh0KHN0cnVjdCBwYXNzd2QgKik7Cit2b2lkIHBsYXRmb3JtX3NldHVzZXJjb250ZXh0X3Bvc3RfZ3JvdXBzKHN0cnVjdCBwYXNzd2QgKik7CitjaGFyICpwbGF0Zm9ybV9nZXRfa3JiNV9jbGllbnQoY29uc3QgY2hhciAqKTsKK2NoYXIgKnBsYXRmb3JtX2tyYjVfZ2V0X3ByaW5jaXBhbF9uYW1lKGNvbnN0IGNoYXIgKik7CisKKwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9wcm9ncmVzc21ldGVyLmMgYi9vcGVuc3NoLTYuMHAxL3Byb2dyZXNzbWV0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjk1MjIyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9wcm9ncmVzc21ldGVyLmMKQEAgLTAsMCArMSwzMDUgQEAKKy8qICRPcGVuQlNEOiBwcm9ncmVzc21ldGVyLmMsdiAxLjM3IDIwMDYvMDgvMDMgMDM6MzQ6NDIgZGVyYWFkdCBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBOaWxzIE5vcmRtYW4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJwcm9ncmVzc21ldGVyLmgiCisjaW5jbHVkZSAiYXRvbWljaW8uaCIKKyNpbmNsdWRlICJtaXNjLmgiCisKKyNkZWZpbmUgREVGQVVMVF9XSU5TSVpFIDgwCisjZGVmaW5lIE1BWF9XSU5TSVpFIDUxMgorI2RlZmluZSBQQURESU5HIDEJCS8qIHBhZGRpbmcgYmV0d2VlbiB0aGUgcHJvZ3Jlc3MgaW5kaWNhdG9ycyAqLworI2RlZmluZSBVUERBVEVfSU5URVJWQUwgMQkvKiB1cGRhdGUgdGhlIHByb2dyZXNzIG1ldGVyIGV2ZXJ5IHNlY29uZCAqLworI2RlZmluZSBTVEFMTF9USU1FIDUJCS8qIHdlJ3JlIHN0YWxsZWQgYWZ0ZXIgdGhpcyBtYW55IHNlY29uZHMgKi8KKworLyogZGV0ZXJtaW5lcyB3aGV0aGVyIHdlIGNhbiBvdXRwdXQgdG8gdGhlIHRlcm1pbmFsICovCitzdGF0aWMgaW50IGNhbl9vdXRwdXQodm9pZCk7CisKKy8qIGZvcm1hdHMgYW5kIGluc2VydHMgdGhlIHNwZWNpZmllZCBzaXplIGludG8gdGhlIGdpdmVuIGJ1ZmZlciAqLworc3RhdGljIHZvaWQgZm9ybWF0X3NpemUoY2hhciAqLCBpbnQsIG9mZl90KTsKK3N0YXRpYyB2b2lkIGZvcm1hdF9yYXRlKGNoYXIgKiwgaW50LCBvZmZfdCk7CisKKy8qIHdpbmRvdyByZXNpemluZyAqLworc3RhdGljIHZvaWQgc2lnX3dpbmNoKGludCk7CitzdGF0aWMgdm9pZCBzZXRzY3JlZW5zaXplKHZvaWQpOworCisvKiB1cGRhdGVzIHRoZSBwcm9ncmVzc21ldGVyIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHRyYW5zZmVyICovCit2b2lkIHJlZnJlc2hfcHJvZ3Jlc3NfbWV0ZXIodm9pZCk7CisKKy8qIHNpZ25hbCBoYW5kbGVyIGZvciB1cGRhdGluZyB0aGUgcHJvZ3Jlc3MgbWV0ZXIgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9wcm9ncmVzc19tZXRlcihpbnQpOworCitzdGF0aWMgdGltZV90IHN0YXJ0OwkJLyogc3RhcnQgcHJvZ3Jlc3MgKi8KK3N0YXRpYyB0aW1lX3QgbGFzdF91cGRhdGU7CS8qIGxhc3QgcHJvZ3Jlc3MgdXBkYXRlICovCitzdGF0aWMgY2hhciAqZmlsZTsJCS8qIG5hbWUgb2YgdGhlIGZpbGUgYmVpbmcgdHJhbnNmZXJyZWQgKi8KK3N0YXRpYyBvZmZfdCBlbmRfcG9zOwkJLyogZW5kaW5nIHBvc2l0aW9uIG9mIHRyYW5zZmVyICovCitzdGF0aWMgb2ZmX3QgY3VyX3BvczsJCS8qIHRyYW5zZmVyIHBvc2l0aW9uIGFzIG9mIGxhc3QgcmVmcmVzaCAqLworc3RhdGljIHZvbGF0aWxlIG9mZl90ICpjb3VudGVyOwkvKiBwcm9ncmVzcyBjb3VudGVyICovCitzdGF0aWMgbG9uZyBzdGFsbGVkOwkJLyogaG93IGxvbmcgd2UgaGF2ZSBiZWVuIHN0YWxsZWQgKi8KK3N0YXRpYyBpbnQgYnl0ZXNfcGVyX3NlY29uZDsJLyogY3VycmVudCBzcGVlZCBpbiBieXRlcyBwZXIgc2Vjb25kICovCitzdGF0aWMgaW50IHdpbl9zaXplOwkJLyogdGVybWluYWwgd2luZG93IHNpemUgKi8KK3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3Qgd2luX3Jlc2l6ZWQ7IC8qIGZvciB3aW5kb3cgcmVzaXppbmcgKi8KKworLyogdW5pdHMgZm9yIGZvcm1hdF9zaXplICovCitzdGF0aWMgY29uc3QgY2hhciB1bml0W10gPSAiIEtNR1QiOworCitzdGF0aWMgaW50CitjYW5fb3V0cHV0KHZvaWQpCit7CisJcmV0dXJuIChnZXRwZ3JwKCkgPT0gdGNnZXRwZ3JwKFNURE9VVF9GSUxFTk8pKTsKK30KKworc3RhdGljIHZvaWQKK2Zvcm1hdF9yYXRlKGNoYXIgKmJ1ZiwgaW50IHNpemUsIG9mZl90IGJ5dGVzKQoreworCWludCBpOworCisJYnl0ZXMgKj0gMTAwOworCWZvciAoaSA9IDA7IGJ5dGVzID49IDEwMCoxMDAwICYmIHVuaXRbaV0gIT0gJ1QnOyBpKyspCisJCWJ5dGVzID0gKGJ5dGVzICsgNTEyKSAvIDEwMjQ7CisJaWYgKGkgPT0gMCkgeworCQlpKys7CisJCWJ5dGVzID0gKGJ5dGVzICsgNTEyKSAvIDEwMjQ7CisJfQorCXNucHJpbnRmKGJ1Ziwgc2l6ZSwgIiUzbGxkLiUxbGxkJWMlcyIsCisJICAgIChsb25nIGxvbmcpIChieXRlcyArIDUpIC8gMTAwLAorCSAgICAobG9uZyBsb25nKSAoYnl0ZXMgKyA1KSAvIDEwICUgMTAsCisJICAgIHVuaXRbaV0sCisJICAgIGkgPyAiQiIgOiAiICIpOworfQorCitzdGF0aWMgdm9pZAorZm9ybWF0X3NpemUoY2hhciAqYnVmLCBpbnQgc2l6ZSwgb2ZmX3QgYnl0ZXMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBieXRlcyA+PSAxMDAwMCAmJiB1bml0W2ldICE9ICdUJzsgaSsrKQorCQlieXRlcyA9IChieXRlcyArIDUxMikgLyAxMDI0OworCXNucHJpbnRmKGJ1Ziwgc2l6ZSwgIiU0bGxkJWMlcyIsCisJICAgIChsb25nIGxvbmcpIGJ5dGVzLAorCSAgICB1bml0W2ldLAorCSAgICBpID8gIkIiIDogIiAiKTsKK30KKwordm9pZAorcmVmcmVzaF9wcm9ncmVzc19tZXRlcih2b2lkKQoreworCWNoYXIgYnVmW01BWF9XSU5TSVpFICsgMV07CisJdGltZV90IG5vdzsKKwlvZmZfdCB0cmFuc2ZlcnJlZDsKKwlkb3VibGUgZWxhcHNlZDsKKwlpbnQgcGVyY2VudDsKKwlvZmZfdCBieXRlc19sZWZ0OworCWludCBjdXJfc3BlZWQ7CisJaW50IGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzOworCWludCBpLCBsZW47CisJaW50IGZpbGVfbGVuOworCisJdHJhbnNmZXJyZWQgPSAqY291bnRlciAtIGN1cl9wb3M7CisJY3VyX3BvcyA9ICpjb3VudGVyOworCW5vdyA9IHRpbWUoTlVMTCk7CisJYnl0ZXNfbGVmdCA9IGVuZF9wb3MgLSBjdXJfcG9zOworCisJaWYgKGJ5dGVzX2xlZnQgPiAwKQorCQllbGFwc2VkID0gbm93IC0gbGFzdF91cGRhdGU7CisJZWxzZSB7CisJCWVsYXBzZWQgPSBub3cgLSBzdGFydDsKKwkJLyogQ2FsY3VsYXRlIHRydWUgdG90YWwgc3BlZWQgd2hlbiBkb25lICovCisJCXRyYW5zZmVycmVkID0gZW5kX3BvczsKKwkJYnl0ZXNfcGVyX3NlY29uZCA9IDA7CisJfQorCisJLyogY2FsY3VsYXRlIHNwZWVkICovCisJaWYgKGVsYXBzZWQgIT0gMCkKKwkJY3VyX3NwZWVkID0gKHRyYW5zZmVycmVkIC8gZWxhcHNlZCk7CisJZWxzZQorCQljdXJfc3BlZWQgPSB0cmFuc2ZlcnJlZDsKKworI2RlZmluZSBBR0VfRkFDVE9SIDAuOQorCWlmIChieXRlc19wZXJfc2Vjb25kICE9IDApIHsKKwkJYnl0ZXNfcGVyX3NlY29uZCA9IChieXRlc19wZXJfc2Vjb25kICogQUdFX0ZBQ1RPUikgKworCQkgICAgKGN1cl9zcGVlZCAqICgxLjAgLSBBR0VfRkFDVE9SKSk7CisJfSBlbHNlCisJCWJ5dGVzX3Blcl9zZWNvbmQgPSBjdXJfc3BlZWQ7CisKKwkvKiBmaWxlbmFtZSAqLworCWJ1ZlswXSA9ICdcMCc7CisJZmlsZV9sZW4gPSB3aW5fc2l6ZSAtIDM1OworCWlmIChmaWxlX2xlbiA+IDApIHsKKwkJbGVuID0gc25wcmludGYoYnVmLCBmaWxlX2xlbiArIDEsICJcciVzIiwgZmlsZSk7CisJCWlmIChsZW4gPCAwKQorCQkJbGVuID0gMDsKKwkJaWYgKGxlbiA+PSBmaWxlX2xlbiArIDEpCisJCQlsZW4gPSBmaWxlX2xlbjsKKwkJZm9yIChpID0gbGVuOyBpIDwgZmlsZV9sZW47IGkrKykKKwkJCWJ1ZltpXSA9ICcgJzsKKwkJYnVmW2ZpbGVfbGVuXSA9ICdcMCc7CisJfQorCisJLyogcGVyY2VudCBvZiB0cmFuc2ZlciBkb25lICovCisJaWYgKGVuZF9wb3MgIT0gMCkKKwkJcGVyY2VudCA9ICgoZmxvYXQpY3VyX3BvcyAvIGVuZF9wb3MpICogMTAwOworCWVsc2UKKwkJcGVyY2VudCA9IDEwMDsKKwlzbnByaW50ZihidWYgKyBzdHJsZW4oYnVmKSwgd2luX3NpemUgLSBzdHJsZW4oYnVmKSwKKwkgICAgIiAlM2QlJSAiLCBwZXJjZW50KTsKKworCS8qIGFtb3VudCB0cmFuc2ZlcnJlZCAqLworCWZvcm1hdF9zaXplKGJ1ZiArIHN0cmxlbihidWYpLCB3aW5fc2l6ZSAtIHN0cmxlbihidWYpLAorCSAgICBjdXJfcG9zKTsKKwlzdHJsY2F0KGJ1ZiwgIiAiLCB3aW5fc2l6ZSk7CisKKwkvKiBiYW5kd2lkdGggdXNhZ2UgKi8KKwlmb3JtYXRfcmF0ZShidWYgKyBzdHJsZW4oYnVmKSwgd2luX3NpemUgLSBzdHJsZW4oYnVmKSwKKwkgICAgKG9mZl90KWJ5dGVzX3Blcl9zZWNvbmQpOworCXN0cmxjYXQoYnVmLCAiL3MgIiwgd2luX3NpemUpOworCisJLyogRVRBICovCisJaWYgKCF0cmFuc2ZlcnJlZCkKKwkJc3RhbGxlZCArPSBlbGFwc2VkOworCWVsc2UKKwkJc3RhbGxlZCA9IDA7CisKKwlpZiAoc3RhbGxlZCA+PSBTVEFMTF9USU1FKQorCQlzdHJsY2F0KGJ1ZiwgIi0gc3RhbGxlZCAtIiwgd2luX3NpemUpOworCWVsc2UgaWYgKGJ5dGVzX3Blcl9zZWNvbmQgPT0gMCAmJiBieXRlc19sZWZ0KQorCQlzdHJsY2F0KGJ1ZiwgIiAgLS06LS0gRVRBIiwgd2luX3NpemUpOworCWVsc2UgeworCQlpZiAoYnl0ZXNfbGVmdCA+IDApCisJCQlzZWNvbmRzID0gYnl0ZXNfbGVmdCAvIGJ5dGVzX3Blcl9zZWNvbmQ7CisJCWVsc2UKKwkJCXNlY29uZHMgPSBlbGFwc2VkOworCisJCWhvdXJzID0gc2Vjb25kcyAvIDM2MDA7CisJCXNlY29uZHMgLT0gaG91cnMgKiAzNjAwOworCQltaW51dGVzID0gc2Vjb25kcyAvIDYwOworCQlzZWNvbmRzIC09IG1pbnV0ZXMgKiA2MDsKKworCQlpZiAoaG91cnMgIT0gMCkKKwkJCXNucHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLCB3aW5fc2l6ZSAtIHN0cmxlbihidWYpLAorCQkJICAgICIlZDolMDJkOiUwMmQiLCBob3VycywgbWludXRlcywgc2Vjb25kcyk7CisJCWVsc2UKKwkJCXNucHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLCB3aW5fc2l6ZSAtIHN0cmxlbihidWYpLAorCQkJICAgICIgICUwMmQ6JTAyZCIsIG1pbnV0ZXMsIHNlY29uZHMpOworCisJCWlmIChieXRlc19sZWZ0ID4gMCkKKwkJCXN0cmxjYXQoYnVmLCAiIEVUQSIsIHdpbl9zaXplKTsKKwkJZWxzZQorCQkJc3RybGNhdChidWYsICIgICAgIiwgd2luX3NpemUpOworCX0KKworCWF0b21pY2lvKHZ3cml0ZSwgU1RET1VUX0ZJTEVOTywgYnVmLCB3aW5fc2l6ZSAtIDEpOworCWxhc3RfdXBkYXRlID0gbm93OworfQorCisvKkFSR1NVU0VEKi8KK3N0YXRpYyB2b2lkCit1cGRhdGVfcHJvZ3Jlc3NfbWV0ZXIoaW50IGlnbm9yZSkKK3sKKwlpbnQgc2F2ZV9lcnJubzsKKworCXNhdmVfZXJybm8gPSBlcnJubzsKKworCWlmICh3aW5fcmVzaXplZCkgeworCQlzZXRzY3JlZW5zaXplKCk7CisJCXdpbl9yZXNpemVkID0gMDsKKwl9CisJaWYgKGNhbl9vdXRwdXQoKSkKKwkJcmVmcmVzaF9wcm9ncmVzc19tZXRlcigpOworCisJc2lnbmFsKFNJR0FMUk0sIHVwZGF0ZV9wcm9ncmVzc19tZXRlcik7CisJYWxhcm0oVVBEQVRFX0lOVEVSVkFMKTsKKwllcnJubyA9IHNhdmVfZXJybm87Cit9CisKK3ZvaWQKK3N0YXJ0X3Byb2dyZXNzX21ldGVyKGNoYXIgKmYsIG9mZl90IGZpbGVzaXplLCBvZmZfdCAqY3RyKQoreworCXN0YXJ0ID0gbGFzdF91cGRhdGUgPSB0aW1lKE5VTEwpOworCWZpbGUgPSBmOworCWVuZF9wb3MgPSBmaWxlc2l6ZTsKKwljdXJfcG9zID0gMDsKKwljb3VudGVyID0gY3RyOworCXN0YWxsZWQgPSAwOworCWJ5dGVzX3Blcl9zZWNvbmQgPSAwOworCisJc2V0c2NyZWVuc2l6ZSgpOworCWlmIChjYW5fb3V0cHV0KCkpCisJCXJlZnJlc2hfcHJvZ3Jlc3NfbWV0ZXIoKTsKKworCXNpZ25hbChTSUdBTFJNLCB1cGRhdGVfcHJvZ3Jlc3NfbWV0ZXIpOworCXNpZ25hbChTSUdXSU5DSCwgc2lnX3dpbmNoKTsKKwlhbGFybShVUERBVEVfSU5URVJWQUwpOworfQorCit2b2lkCitzdG9wX3Byb2dyZXNzX21ldGVyKHZvaWQpCit7CisJYWxhcm0oMCk7CisKKwlpZiAoIWNhbl9vdXRwdXQoKSkKKwkJcmV0dXJuOworCisJLyogRW5zdXJlIHdlIGNvbXBsZXRlIHRoZSBwcm9ncmVzcyAqLworCWlmIChjdXJfcG9zICE9IGVuZF9wb3MpCisJCXJlZnJlc2hfcHJvZ3Jlc3NfbWV0ZXIoKTsKKworCWF0b21pY2lvKHZ3cml0ZSwgU1RET1VUX0ZJTEVOTywgIlxuIiwgMSk7Cit9CisKKy8qQVJHU1VTRUQqLworc3RhdGljIHZvaWQKK3NpZ193aW5jaChpbnQgc2lnKQoreworCXdpbl9yZXNpemVkID0gMTsKK30KKworc3RhdGljIHZvaWQKK3NldHNjcmVlbnNpemUodm9pZCkKK3sKKwlzdHJ1Y3Qgd2luc2l6ZSB3aW5zaXplOworCisJaWYgKGlvY3RsKFNURE9VVF9GSUxFTk8sIFRJT0NHV0lOU1osICZ3aW5zaXplKSAhPSAtMSAmJgorCSAgICB3aW5zaXplLndzX2NvbCAhPSAwKSB7CisJCWlmICh3aW5zaXplLndzX2NvbCA+IE1BWF9XSU5TSVpFKQorCQkJd2luX3NpemUgPSBNQVhfV0lOU0laRTsKKwkJZWxzZQorCQkJd2luX3NpemUgPSB3aW5zaXplLndzX2NvbDsKKwl9IGVsc2UKKwkJd2luX3NpemUgPSBERUZBVUxUX1dJTlNJWkU7CisJd2luX3NpemUgKz0gMTsJCQkJCS8qIHRyYWlsaW5nIFwwICovCit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3Byb2dyZXNzbWV0ZXIuaCBiL29wZW5zc2gtNi4wcDEvcHJvZ3Jlc3NtZXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYmFiOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3Byb2dyZXNzbWV0ZXIuaApAQCAtMCwwICsxLDI3IEBACisvKiAkT3BlbkJTRDogcHJvZ3Jlc3NtZXRlci5oLHYgMS4yIDIwMDYvMDMvMjUgMjI6MjI6NDMgZGptIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIE5pbHMgTm9yZG1hbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3ZvaWQJc3RhcnRfcHJvZ3Jlc3NfbWV0ZXIoY2hhciAqLCBvZmZfdCwgb2ZmX3QgKik7Cit2b2lkCXN0b3BfcHJvZ3Jlc3NfbWV0ZXIodm9pZCk7CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlYWRjb25mLmMgYi9vcGVuc3NoLTYuMHAxL3JlYWRjb25mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk3YmIwNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVhZGNvbmYuYwpAQCAtMCwwICsxLDE0NzQgQEAKKy8qICRPcGVuQlNEOiByZWFkY29uZi5jLHYgMS4xOTQgMjAxMS8wOS8yMyAwNzo0NTowNSBtYXJrdXMgRXhwICQgKi8KKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiBGdW5jdGlvbnMgZm9yIHJlYWRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW5fc3lzdG0uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgInNzaC5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorI2luY2x1ZGUgImNpcGhlci5oIgorI2luY2x1ZGUgInBhdGhuYW1lcy5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgInJlYWRjb25mLmgiCisjaW5jbHVkZSAibWF0Y2guaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAia2V4LmgiCisjaW5jbHVkZSAibWFjLmgiCisKKy8qIEZvcm1hdCBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlOgorCisgICAjIENvbmZpZ3VyYXRpb24gZGF0YSBpcyBwYXJzZWQgYXMgZm9sbG93czoKKyAgICMgIDEuIGNvbW1hbmQgbGluZSBvcHRpb25zCisgICAjICAyLiB1c2VyLXNwZWNpZmljIGZpbGUKKyAgICMgIDMuIHN5c3RlbS13aWRlIGZpbGUKKyAgICMgQW55IGNvbmZpZ3VyYXRpb24gdmFsdWUgaXMgb25seSBjaGFuZ2VkIHRoZSBmaXJzdCB0aW1lIGl0IGlzIHNldC4KKyAgICMgVGh1cywgaG9zdC1zcGVjaWZpYyBkZWZpbml0aW9ucyBzaG91bGQgYmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgICMgY29uZmlndXJhdGlvbiBmaWxlLCBhbmQgZGVmYXVsdHMgYXQgdGhlIGVuZC4KKworICAgIyBIb3N0LXNwZWNpZmljIGRlY2xhcmF0aW9ucy4gIFRoZXNlIG1heSBvdmVycmlkZSBhbnl0aGluZyBhYm92ZS4gIEEgc2luZ2xlCisgICAjIGhvc3QgbWF5IG1hdGNoIG11bHRpcGxlIGRlY2xhcmF0aW9uczsgdGhlc2UgYXJlIHByb2Nlc3NlZCBpbiB0aGUgb3JkZXIKKyAgICMgdGhhdCB0aGV5IGFyZSBnaXZlbiBpbi4KKworICAgSG9zdCAqLm5ncy5maSBuZ3MuZmkKKyAgICAgVXNlciBmb28KKworICAgSG9zdCBmYWtlLmNvbQorICAgICBIb3N0TmFtZSBhbm90aGVyLmhvc3QubmFtZS5yZWFsLm9yZworICAgICBVc2VyIGJsYWFoCisgICAgIFBvcnQgMzQyODkKKyAgICAgRm9yd2FyZFgxMSBubworICAgICBGb3J3YXJkQWdlbnQgbm8KKworICAgSG9zdCBib29rcy5jb20KKyAgICAgUmVtb3RlRm9yd2FyZCA5OTk5IHNoYWRvd3MuY3MuaHV0LmZpOjk5OTkKKyAgICAgQ2lwaGVyIDNkZXMKKworICAgSG9zdCBmYXNjaXN0LmJsb2IuY29tCisgICAgIFBvcnQgMjMxMjMKKyAgICAgVXNlciB0eWxvbmVuCisgICAgIFBhc3N3b3JkQXV0aGVudGljYXRpb24gbm8KKworICAgSG9zdCBwdXVra28uaHV0LmZpCisgICAgIFVzZXIgdDM1MTI0cAorICAgICBQcm94eUNvbW1hbmQgc3NoLXByb3h5ICVoICVwCisKKyAgIEhvc3QgKi5mcgorICAgICBQdWJsaWNLZXlBdXRoZW50aWNhdGlvbiBubworCisgICBIb3N0ICouc3UKKyAgICAgQ2lwaGVyIG5vbmUKKyAgICAgUGFzc3dvcmRBdXRoZW50aWNhdGlvbiBubworCisgICBIb3N0IHZwbi5mYWtlLmNvbQorICAgICBUdW5uZWwgeWVzCisgICAgIFR1bm5lbERldmljZSAzCisKKyAgICMgRGVmYXVsdHMgZm9yIHZhcmlvdXMgb3B0aW9ucworICAgSG9zdCAqCisgICAgIEZvcndhcmRBZ2VudCBubworICAgICBGb3J3YXJkWDExIG5vCisgICAgIFBhc3N3b3JkQXV0aGVudGljYXRpb24geWVzCisgICAgIFJTQUF1dGhlbnRpY2F0aW9uIHllcworICAgICBSaG9zdHNSU0FBdXRoZW50aWNhdGlvbiB5ZXMKKyAgICAgU3RyaWN0SG9zdEtleUNoZWNraW5nIHllcworICAgICBUY3BLZWVwQWxpdmUgbm8KKyAgICAgSWRlbnRpdHlGaWxlIH4vLnNzaC9pZGVudGl0eQorICAgICBQb3J0IDIyCisgICAgIEVzY2FwZUNoYXIgfgorCisqLworCisvKiBLZXl3b3JkIHRva2Vucy4gKi8KKwordHlwZWRlZiBlbnVtIHsKKwlvQmFkT3B0aW9uLAorCW9Gb3J3YXJkQWdlbnQsIG9Gb3J3YXJkWDExLCBvRm9yd2FyZFgxMVRydXN0ZWQsIG9Gb3J3YXJkWDExVGltZW91dCwKKwlvR2F0ZXdheVBvcnRzLCBvRXhpdE9uRm9yd2FyZEZhaWx1cmUsCisJb1Bhc3N3b3JkQXV0aGVudGljYXRpb24sIG9SU0FBdXRoZW50aWNhdGlvbiwKKwlvQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbiwgb1hBdXRoTG9jYXRpb24sCisJb0lkZW50aXR5RmlsZSwgb0hvc3ROYW1lLCBvUG9ydCwgb0NpcGhlciwgb1JlbW90ZUZvcndhcmQsIG9Mb2NhbEZvcndhcmQsCisJb1VzZXIsIG9Ib3N0LCBvRXNjYXBlQ2hhciwgb1Job3N0c1JTQUF1dGhlbnRpY2F0aW9uLCBvUHJveHlDb21tYW5kLAorCW9HbG9iYWxLbm93bkhvc3RzRmlsZSwgb1VzZXJLbm93bkhvc3RzRmlsZSwgb0Nvbm5lY3Rpb25BdHRlbXB0cywKKwlvQmF0Y2hNb2RlLCBvQ2hlY2tIb3N0SVAsIG9TdHJpY3RIb3N0S2V5Q2hlY2tpbmcsIG9Db21wcmVzc2lvbiwKKwlvQ29tcHJlc3Npb25MZXZlbCwgb1RDUEtlZXBBbGl2ZSwgb051bWJlck9mUGFzc3dvcmRQcm9tcHRzLAorCW9Vc2VQcml2aWxlZ2VkUG9ydCwgb0xvZ0xldmVsLCBvQ2lwaGVycywgb1Byb3RvY29sLCBvTWFjcywKKwlvR2xvYmFsS25vd25Ib3N0c0ZpbGUyLCBvVXNlcktub3duSG9zdHNGaWxlMiwgb1B1YmtleUF1dGhlbnRpY2F0aW9uLAorCW9LYmRJbnRlcmFjdGl2ZUF1dGhlbnRpY2F0aW9uLCBvS2JkSW50ZXJhY3RpdmVEZXZpY2VzLCBvSG9zdEtleUFsaWFzLAorCW9EeW5hbWljRm9yd2FyZCwgb1ByZWZlcnJlZEF1dGhlbnRpY2F0aW9ucywgb0hvc3RiYXNlZEF1dGhlbnRpY2F0aW9uLAorCW9Ib3N0S2V5QWxnb3JpdGhtcywgb0JpbmRBZGRyZXNzLCBvUEtDUzExUHJvdmlkZXIsCisJb0NsZWFyQWxsRm9yd2FyZGluZ3MsIG9Ob0hvc3RBdXRoZW50aWNhdGlvbkZvckxvY2FsaG9zdCwKKwlvRW5hYmxlU1NIS2V5c2lnbiwgb1Jla2V5TGltaXQsIG9WZXJpZnlIb3N0S2V5RE5TLCBvQ29ubmVjdFRpbWVvdXQsCisJb0FkZHJlc3NGYW1pbHksIG9Hc3NBdXRoZW50aWNhdGlvbiwgb0dzc0RlbGVnYXRlQ3JlZHMsCisJb1NlcnZlckFsaXZlSW50ZXJ2YWwsIG9TZXJ2ZXJBbGl2ZUNvdW50TWF4LCBvSWRlbnRpdGllc09ubHksCisJb1NlbmRFbnYsIG9Db250cm9sUGF0aCwgb0NvbnRyb2xNYXN0ZXIsIG9Db250cm9sUGVyc2lzdCwKKwlvSGFzaEtub3duSG9zdHMsCisJb1R1bm5lbCwgb1R1bm5lbERldmljZSwgb0xvY2FsQ29tbWFuZCwgb1Blcm1pdExvY2FsQ29tbWFuZCwKKwlvVmlzdWFsSG9zdEtleSwgb1VzZVJvYW1pbmcsIG9aZXJvS25vd2xlZGdlUGFzc3dvcmRBdXRoZW50aWNhdGlvbiwKKwlvS2V4QWxnb3JpdGhtcywgb0lQUW9TLCBvUmVxdWVzdFRUWSwKKwlvRGVwcmVjYXRlZCwgb1Vuc3VwcG9ydGVkCit9IE9wQ29kZXM7CisKKy8qIFRleHR1YWwgcmVwcmVzZW50YXRpb25zIG9mIHRoZSB0b2tlbnMuICovCisKK3N0YXRpYyBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJT3BDb2RlcyBvcGNvZGU7Cit9IGtleXdvcmRzW10gPSB7CisJeyAiZm9yd2FyZGFnZW50Iiwgb0ZvcndhcmRBZ2VudCB9LAorCXsgImZvcndhcmR4MTEiLCBvRm9yd2FyZFgxMSB9LAorCXsgImZvcndhcmR4MTF0cnVzdGVkIiwgb0ZvcndhcmRYMTFUcnVzdGVkIH0sCisJeyAiZm9yd2FyZHgxMXRpbWVvdXQiLCBvRm9yd2FyZFgxMVRpbWVvdXQgfSwKKwl7ICJleGl0b25mb3J3YXJkZmFpbHVyZSIsIG9FeGl0T25Gb3J3YXJkRmFpbHVyZSB9LAorCXsgInhhdXRobG9jYXRpb24iLCBvWEF1dGhMb2NhdGlvbiB9LAorCXsgImdhdGV3YXlwb3J0cyIsIG9HYXRld2F5UG9ydHMgfSwKKwl7ICJ1c2Vwcml2aWxlZ2VkcG9ydCIsIG9Vc2VQcml2aWxlZ2VkUG9ydCB9LAorCXsgInJob3N0c2F1dGhlbnRpY2F0aW9uIiwgb0RlcHJlY2F0ZWQgfSwKKwl7ICJwYXNzd29yZGF1dGhlbnRpY2F0aW9uIiwgb1Bhc3N3b3JkQXV0aGVudGljYXRpb24gfSwKKwl7ICJrYmRpbnRlcmFjdGl2ZWF1dGhlbnRpY2F0aW9uIiwgb0tiZEludGVyYWN0aXZlQXV0aGVudGljYXRpb24gfSwKKwl7ICJrYmRpbnRlcmFjdGl2ZWRldmljZXMiLCBvS2JkSW50ZXJhY3RpdmVEZXZpY2VzIH0sCisJeyAicnNhYXV0aGVudGljYXRpb24iLCBvUlNBQXV0aGVudGljYXRpb24gfSwKKwl7ICJwdWJrZXlhdXRoZW50aWNhdGlvbiIsIG9QdWJrZXlBdXRoZW50aWNhdGlvbiB9LAorCXsgImRzYWF1dGhlbnRpY2F0aW9uIiwgb1B1YmtleUF1dGhlbnRpY2F0aW9uIH0sCQkgICAgLyogYWxpYXMgKi8KKwl7ICJyaG9zdHNyc2FhdXRoZW50aWNhdGlvbiIsIG9SaG9zdHNSU0FBdXRoZW50aWNhdGlvbiB9LAorCXsgImhvc3RiYXNlZGF1dGhlbnRpY2F0aW9uIiwgb0hvc3RiYXNlZEF1dGhlbnRpY2F0aW9uIH0sCisJeyAiY2hhbGxlbmdlcmVzcG9uc2VhdXRoZW50aWNhdGlvbiIsIG9DaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIH0sCisJeyAic2tleWF1dGhlbnRpY2F0aW9uIiwgb0NoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24gfSwgLyogYWxpYXMgKi8KKwl7ICJ0aXNhdXRoZW50aWNhdGlvbiIsIG9DaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIH0sICAvKiBhbGlhcyAqLworCXsgImtlcmJlcm9zYXV0aGVudGljYXRpb24iLCBvVW5zdXBwb3J0ZWQgfSwKKwl7ICJrZXJiZXJvc3RndHBhc3NpbmciLCBvVW5zdXBwb3J0ZWQgfSwKKwl7ICJhZnN0b2tlbnBhc3NpbmciLCBvVW5zdXBwb3J0ZWQgfSwKKyNpZiBkZWZpbmVkKEdTU0FQSSkKKwl7ICJnc3NhcGlhdXRoZW50aWNhdGlvbiIsIG9Hc3NBdXRoZW50aWNhdGlvbiB9LAorCXsgImdzc2FwaWRlbGVnYXRlY3JlZGVudGlhbHMiLCBvR3NzRGVsZWdhdGVDcmVkcyB9LAorI2Vsc2UKKwl7ICJnc3NhcGlhdXRoZW50aWNhdGlvbiIsIG9VbnN1cHBvcnRlZCB9LAorCXsgImdzc2FwaWRlbGVnYXRlY3JlZGVudGlhbHMiLCBvVW5zdXBwb3J0ZWQgfSwKKyNlbmRpZgorCXsgImZhbGxiYWNrdG9yc2giLCBvRGVwcmVjYXRlZCB9LAorCXsgInVzZXJzaCIsIG9EZXByZWNhdGVkIH0sCisJeyAiaWRlbnRpdHlmaWxlIiwgb0lkZW50aXR5RmlsZSB9LAorCXsgImlkZW50aXR5ZmlsZTIiLCBvSWRlbnRpdHlGaWxlIH0sCQkJLyogb2Jzb2xldGUgKi8KKwl7ICJpZGVudGl0aWVzb25seSIsIG9JZGVudGl0aWVzT25seSB9LAorCXsgImhvc3RuYW1lIiwgb0hvc3ROYW1lIH0sCisJeyAiaG9zdGtleWFsaWFzIiwgb0hvc3RLZXlBbGlhcyB9LAorCXsgInByb3h5Y29tbWFuZCIsIG9Qcm94eUNvbW1hbmQgfSwKKwl7ICJwb3J0Iiwgb1BvcnQgfSwKKwl7ICJjaXBoZXIiLCBvQ2lwaGVyIH0sCisJeyAiY2lwaGVycyIsIG9DaXBoZXJzIH0sCisJeyAibWFjcyIsIG9NYWNzIH0sCisJeyAicHJvdG9jb2wiLCBvUHJvdG9jb2wgfSwKKwl7ICJyZW1vdGVmb3J3YXJkIiwgb1JlbW90ZUZvcndhcmQgfSwKKwl7ICJsb2NhbGZvcndhcmQiLCBvTG9jYWxGb3J3YXJkIH0sCisJeyAidXNlciIsIG9Vc2VyIH0sCisJeyAiaG9zdCIsIG9Ib3N0IH0sCisJeyAiZXNjYXBlY2hhciIsIG9Fc2NhcGVDaGFyIH0sCisJeyAiZ2xvYmFsa25vd25ob3N0c2ZpbGUiLCBvR2xvYmFsS25vd25Ib3N0c0ZpbGUgfSwKKwl7ICJnbG9iYWxrbm93bmhvc3RzZmlsZTIiLCBvRGVwcmVjYXRlZCB9LAorCXsgInVzZXJrbm93bmhvc3RzZmlsZSIsIG9Vc2VyS25vd25Ib3N0c0ZpbGUgfSwKKwl7ICJ1c2Vya25vd25ob3N0c2ZpbGUyIiwgb0RlcHJlY2F0ZWQgfSwgCisJeyAiY29ubmVjdGlvbmF0dGVtcHRzIiwgb0Nvbm5lY3Rpb25BdHRlbXB0cyB9LAorCXsgImJhdGNobW9kZSIsIG9CYXRjaE1vZGUgfSwKKwl7ICJjaGVja2hvc3RpcCIsIG9DaGVja0hvc3RJUCB9LAorCXsgInN0cmljdGhvc3RrZXljaGVja2luZyIsIG9TdHJpY3RIb3N0S2V5Q2hlY2tpbmcgfSwKKwl7ICJjb21wcmVzc2lvbiIsIG9Db21wcmVzc2lvbiB9LAorCXsgImNvbXByZXNzaW9ubGV2ZWwiLCBvQ29tcHJlc3Npb25MZXZlbCB9LAorCXsgInRjcGtlZXBhbGl2ZSIsIG9UQ1BLZWVwQWxpdmUgfSwKKwl7ICJrZWVwYWxpdmUiLCBvVENQS2VlcEFsaXZlIH0sCQkJCS8qIG9ic29sZXRlICovCisJeyAibnVtYmVyb2ZwYXNzd29yZHByb21wdHMiLCBvTnVtYmVyT2ZQYXNzd29yZFByb21wdHMgfSwKKwl7ICJsb2dsZXZlbCIsIG9Mb2dMZXZlbCB9LAorCXsgImR5bmFtaWNmb3J3YXJkIiwgb0R5bmFtaWNGb3J3YXJkIH0sCisJeyAicHJlZmVycmVkYXV0aGVudGljYXRpb25zIiwgb1ByZWZlcnJlZEF1dGhlbnRpY2F0aW9ucyB9LAorCXsgImhvc3RrZXlhbGdvcml0aG1zIiwgb0hvc3RLZXlBbGdvcml0aG1zIH0sCisJeyAiYmluZGFkZHJlc3MiLCBvQmluZEFkZHJlc3MgfSwKKyNpZmRlZiBFTkFCTEVfUEtDUzExCisJeyAic21hcnRjYXJkZGV2aWNlIiwgb1BLQ1MxMVByb3ZpZGVyIH0sCisJeyAicGtjczExcHJvdmlkZXIiLCBvUEtDUzExUHJvdmlkZXIgfSwKKyNlbHNlCisJeyAic21hcnRjYXJkZGV2aWNlIiwgb1Vuc3VwcG9ydGVkIH0sCisJeyAicGtjczExcHJvdmlkZXIiLCBvVW5zdXBwb3J0ZWQgfSwKKyNlbmRpZgorCXsgImNsZWFyYWxsZm9yd2FyZGluZ3MiLCBvQ2xlYXJBbGxGb3J3YXJkaW5ncyB9LAorCXsgImVuYWJsZXNzaGtleXNpZ24iLCBvRW5hYmxlU1NIS2V5c2lnbiB9LAorCXsgInZlcmlmeWhvc3RrZXlkbnMiLCBvVmVyaWZ5SG9zdEtleUROUyB9LAorCXsgIm5vaG9zdGF1dGhlbnRpY2F0aW9uZm9ybG9jYWxob3N0Iiwgb05vSG9zdEF1dGhlbnRpY2F0aW9uRm9yTG9jYWxob3N0IH0sCisJeyAicmVrZXlsaW1pdCIsIG9SZWtleUxpbWl0IH0sCisJeyAiY29ubmVjdHRpbWVvdXQiLCBvQ29ubmVjdFRpbWVvdXQgfSwKKwl7ICJhZGRyZXNzZmFtaWx5Iiwgb0FkZHJlc3NGYW1pbHkgfSwKKwl7ICJzZXJ2ZXJhbGl2ZWludGVydmFsIiwgb1NlcnZlckFsaXZlSW50ZXJ2YWwgfSwKKwl7ICJzZXJ2ZXJhbGl2ZWNvdW50bWF4Iiwgb1NlcnZlckFsaXZlQ291bnRNYXggfSwKKwl7ICJzZW5kZW52Iiwgb1NlbmRFbnYgfSwKKwl7ICJjb250cm9scGF0aCIsIG9Db250cm9sUGF0aCB9LAorCXsgImNvbnRyb2xtYXN0ZXIiLCBvQ29udHJvbE1hc3RlciB9LAorCXsgImNvbnRyb2xwZXJzaXN0Iiwgb0NvbnRyb2xQZXJzaXN0IH0sCisJeyAiaGFzaGtub3duaG9zdHMiLCBvSGFzaEtub3duSG9zdHMgfSwKKwl7ICJ0dW5uZWwiLCBvVHVubmVsIH0sCisJeyAidHVubmVsZGV2aWNlIiwgb1R1bm5lbERldmljZSB9LAorCXsgImxvY2FsY29tbWFuZCIsIG9Mb2NhbENvbW1hbmQgfSwKKwl7ICJwZXJtaXRsb2NhbGNvbW1hbmQiLCBvUGVybWl0TG9jYWxDb21tYW5kIH0sCisJeyAidmlzdWFsaG9zdGtleSIsIG9WaXN1YWxIb3N0S2V5IH0sCisJeyAidXNlcm9hbWluZyIsIG9Vc2VSb2FtaW5nIH0sCisjaWZkZWYgSlBBS0UKKwl7ICJ6ZXJva25vd2xlZGdlcGFzc3dvcmRhdXRoZW50aWNhdGlvbiIsCisJICAgIG9aZXJvS25vd2xlZGdlUGFzc3dvcmRBdXRoZW50aWNhdGlvbiB9LAorI2Vsc2UKKwl7ICJ6ZXJva25vd2xlZGdlcGFzc3dvcmRhdXRoZW50aWNhdGlvbiIsIG9VbnN1cHBvcnRlZCB9LAorI2VuZGlmCisJeyAia2V4YWxnb3JpdGhtcyIsIG9LZXhBbGdvcml0aG1zIH0sCisJeyAiaXBxb3MiLCBvSVBRb1MgfSwKKwl7ICJyZXF1ZXN0dHR5Iiwgb1JlcXVlc3RUVFkgfSwKKworCXsgTlVMTCwgb0JhZE9wdGlvbiB9Cit9OworCisvKgorICogQWRkcyBhIGxvY2FsIFRDUC9JUCBwb3J0IGZvcndhcmQgdG8gb3B0aW9ucy4gIE5ldmVyIHJldHVybnMgaWYgdGhlcmUgaXMgYW4KKyAqIGVycm9yLgorICovCisKK3ZvaWQKK2FkZF9sb2NhbF9mb3J3YXJkKE9wdGlvbnMgKm9wdGlvbnMsIGNvbnN0IEZvcndhcmQgKm5ld2Z3ZCkKK3sKKwlGb3J3YXJkICpmd2Q7CisjaWZuZGVmIE5PX0lQUE9SVF9SRVNFUlZFRF9DT05DRVBUCisJZXh0ZXJuIHVpZF90IG9yaWdpbmFsX3JlYWxfdWlkOworCWlmIChuZXdmd2QtPmxpc3Rlbl9wb3J0IDwgSVBQT1JUX1JFU0VSVkVEICYmIG9yaWdpbmFsX3JlYWxfdWlkICE9IDApCisJCWZhdGFsKCJQcml2aWxlZ2VkIHBvcnRzIGNhbiBvbmx5IGJlIGZvcndhcmRlZCBieSByb290LiIpOworI2VuZGlmCisJb3B0aW9ucy0+bG9jYWxfZm9yd2FyZHMgPSB4cmVhbGxvYyhvcHRpb25zLT5sb2NhbF9mb3J3YXJkcywKKwkgICAgb3B0aW9ucy0+bnVtX2xvY2FsX2ZvcndhcmRzICsgMSwKKwkgICAgc2l6ZW9mKCpvcHRpb25zLT5sb2NhbF9mb3J3YXJkcykpOworCWZ3ZCA9ICZvcHRpb25zLT5sb2NhbF9mb3J3YXJkc1tvcHRpb25zLT5udW1fbG9jYWxfZm9yd2FyZHMrK107CisKKwlmd2QtPmxpc3Rlbl9ob3N0ID0gbmV3ZndkLT5saXN0ZW5faG9zdDsKKwlmd2QtPmxpc3Rlbl9wb3J0ID0gbmV3ZndkLT5saXN0ZW5fcG9ydDsKKwlmd2QtPmNvbm5lY3RfaG9zdCA9IG5ld2Z3ZC0+Y29ubmVjdF9ob3N0OworCWZ3ZC0+Y29ubmVjdF9wb3J0ID0gbmV3ZndkLT5jb25uZWN0X3BvcnQ7Cit9CisKKy8qCisgKiBBZGRzIGEgcmVtb3RlIFRDUC9JUCBwb3J0IGZvcndhcmQgdG8gb3B0aW9ucy4gIE5ldmVyIHJldHVybnMgaWYgdGhlcmUgaXMKKyAqIGFuIGVycm9yLgorICovCisKK3ZvaWQKK2FkZF9yZW1vdGVfZm9yd2FyZChPcHRpb25zICpvcHRpb25zLCBjb25zdCBGb3J3YXJkICpuZXdmd2QpCit7CisJRm9yd2FyZCAqZndkOworCisJb3B0aW9ucy0+cmVtb3RlX2ZvcndhcmRzID0geHJlYWxsb2Mob3B0aW9ucy0+cmVtb3RlX2ZvcndhcmRzLAorCSAgICBvcHRpb25zLT5udW1fcmVtb3RlX2ZvcndhcmRzICsgMSwKKwkgICAgc2l6ZW9mKCpvcHRpb25zLT5yZW1vdGVfZm9yd2FyZHMpKTsKKwlmd2QgPSAmb3B0aW9ucy0+cmVtb3RlX2ZvcndhcmRzW29wdGlvbnMtPm51bV9yZW1vdGVfZm9yd2FyZHMrK107CisKKwlmd2QtPmxpc3Rlbl9ob3N0ID0gbmV3ZndkLT5saXN0ZW5faG9zdDsKKwlmd2QtPmxpc3Rlbl9wb3J0ID0gbmV3ZndkLT5saXN0ZW5fcG9ydDsKKwlmd2QtPmNvbm5lY3RfaG9zdCA9IG5ld2Z3ZC0+Y29ubmVjdF9ob3N0OworCWZ3ZC0+Y29ubmVjdF9wb3J0ID0gbmV3ZndkLT5jb25uZWN0X3BvcnQ7CisJZndkLT5oYW5kbGUgPSBuZXdmd2QtPmhhbmRsZTsKKwlmd2QtPmFsbG9jYXRlZF9wb3J0ID0gMDsKK30KKworc3RhdGljIHZvaWQKK2NsZWFyX2ZvcndhcmRpbmdzKE9wdGlvbnMgKm9wdGlvbnMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy0+bnVtX2xvY2FsX2ZvcndhcmRzOyBpKyspIHsKKwkJaWYgKG9wdGlvbnMtPmxvY2FsX2ZvcndhcmRzW2ldLmxpc3Rlbl9ob3N0ICE9IE5VTEwpCisJCQl4ZnJlZShvcHRpb25zLT5sb2NhbF9mb3J3YXJkc1tpXS5saXN0ZW5faG9zdCk7CisJCXhmcmVlKG9wdGlvbnMtPmxvY2FsX2ZvcndhcmRzW2ldLmNvbm5lY3RfaG9zdCk7CisJfQorCWlmIChvcHRpb25zLT5udW1fbG9jYWxfZm9yd2FyZHMgPiAwKSB7CisJCXhmcmVlKG9wdGlvbnMtPmxvY2FsX2ZvcndhcmRzKTsKKwkJb3B0aW9ucy0+bG9jYWxfZm9yd2FyZHMgPSBOVUxMOworCX0KKwlvcHRpb25zLT5udW1fbG9jYWxfZm9yd2FyZHMgPSAwOworCWZvciAoaSA9IDA7IGkgPCBvcHRpb25zLT5udW1fcmVtb3RlX2ZvcndhcmRzOyBpKyspIHsKKwkJaWYgKG9wdGlvbnMtPnJlbW90ZV9mb3J3YXJkc1tpXS5saXN0ZW5faG9zdCAhPSBOVUxMKQorCQkJeGZyZWUob3B0aW9ucy0+cmVtb3RlX2ZvcndhcmRzW2ldLmxpc3Rlbl9ob3N0KTsKKwkJeGZyZWUob3B0aW9ucy0+cmVtb3RlX2ZvcndhcmRzW2ldLmNvbm5lY3RfaG9zdCk7CisJfQorCWlmIChvcHRpb25zLT5udW1fcmVtb3RlX2ZvcndhcmRzID4gMCkgeworCQl4ZnJlZShvcHRpb25zLT5yZW1vdGVfZm9yd2FyZHMpOworCQlvcHRpb25zLT5yZW1vdGVfZm9yd2FyZHMgPSBOVUxMOworCX0KKwlvcHRpb25zLT5udW1fcmVtb3RlX2ZvcndhcmRzID0gMDsKKwlvcHRpb25zLT50dW5fb3BlbiA9IFNTSF9UVU5NT0RFX05POworfQorCisvKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSB0b2tlbiBwb2ludGVkIHRvIGJ5IGNwIG9yIG9CYWRPcHRpb24uCisgKi8KKworc3RhdGljIE9wQ29kZXMKK3BhcnNlX3Rva2VuKGNvbnN0IGNoYXIgKmNwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVudW0pCit7CisJdV9pbnQgaTsKKworCWZvciAoaSA9IDA7IGtleXdvcmRzW2ldLm5hbWU7IGkrKykKKwkJaWYgKHN0cmNhc2VjbXAoY3AsIGtleXdvcmRzW2ldLm5hbWUpID09IDApCisJCQlyZXR1cm4ga2V5d29yZHNbaV0ub3Bjb2RlOworCisJZXJyb3IoIiVzOiBsaW5lICVkOiBCYWQgY29uZmlndXJhdGlvbiBvcHRpb246ICVzIiwKKwkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGNwKTsKKwlyZXR1cm4gb0JhZE9wdGlvbjsKK30KKworLyoKKyAqIFByb2Nlc3NlcyBhIHNpbmdsZSBvcHRpb24gbGluZSBhcyB1c2VkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzLiBUaGlzCisgKiBvbmx5IHNldHMgdGhvc2UgdmFsdWVzIHRoYXQgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIHNldC4KKyAqLworI2RlZmluZSBXSElURVNQQUNFICIgXHRcclxuIgorCitpbnQKK3Byb2Nlc3NfY29uZmlnX2xpbmUoT3B0aW9ucyAqb3B0aW9ucywgY29uc3QgY2hhciAqaG9zdCwKKwkJICAgIGNoYXIgKmxpbmUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW51bSwKKwkJICAgIGludCAqYWN0aXZlcCkKK3sKKwljaGFyICpzLCAqKmNoYXJwdHIsICplbmRvZm51bWJlciwgKmtleXdvcmQsICphcmcsICphcmcyOworCWNoYXIgKipjcHB0ciwgZndkYXJnWzI1Nl07CisJdV9pbnQgKnVpbnRwdHIsIG1heF9lbnRyaWVzID0gMDsKKwlpbnQgbmVnYXRlZCwgb3Bjb2RlLCAqaW50cHRyLCB2YWx1ZSwgdmFsdWUyLCBzY2FsZTsKKwlMb2dMZXZlbCAqbG9nX2xldmVsX3B0cjsKKwlsb25nIGxvbmcgb3JpZywgdmFsNjQ7CisJc2l6ZV90IGxlbjsKKwlGb3J3YXJkIGZ3ZDsKKworCS8qIFN0cmlwIHRyYWlsaW5nIHdoaXRlc3BhY2UgKi8KKwlmb3IgKGxlbiA9IHN0cmxlbihsaW5lKSAtIDE7IGxlbiA+IDA7IGxlbi0tKSB7CisJCWlmIChzdHJjaHIoV0hJVEVTUEFDRSwgbGluZVtsZW5dKSA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWxpbmVbbGVuXSA9ICdcMCc7CisJfQorCisJcyA9IGxpbmU7CisJLyogR2V0IHRoZSBrZXl3b3JkLiAoRWFjaCBsaW5lIGlzIHN1cHBvc2VkIHRvIGJlZ2luIHdpdGggYSBrZXl3b3JkKS4gKi8KKwlpZiAoKGtleXdvcmQgPSBzdHJkZWxpbSgmcykpID09IE5VTEwpCisJCXJldHVybiAwOworCS8qIElnbm9yZSBsZWFkaW5nIHdoaXRlc3BhY2UuICovCisJaWYgKCprZXl3b3JkID09ICdcMCcpCisJCWtleXdvcmQgPSBzdHJkZWxpbSgmcyk7CisJaWYgKGtleXdvcmQgPT0gTlVMTCB8fCAhKmtleXdvcmQgfHwgKmtleXdvcmQgPT0gJ1xuJyB8fCAqa2V5d29yZCA9PSAnIycpCisJCXJldHVybiAwOworCisJb3Bjb2RlID0gcGFyc2VfdG9rZW4oa2V5d29yZCwgZmlsZW5hbWUsIGxpbmVudW0pOworCisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIG9CYWRPcHRpb246CisJCS8qIGRvbid0IHBhbmljLCBidXQgY291bnQgYmFkIG9wdGlvbnMgKi8KKwkJcmV0dXJuIC0xOworCQkvKiBOT1RSRUFDSEVEICovCisJY2FzZSBvQ29ubmVjdFRpbWVvdXQ6CisJCWludHB0ciA9ICZvcHRpb25zLT5jb25uZWN0aW9uX3RpbWVvdXQ7CitwYXJzZV90aW1lOgorCQlhcmcgPSBzdHJkZWxpbSgmcyk7CisJCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKKwkJCWZhdGFsKCIlcyBsaW5lICVkOiBtaXNzaW5nIHRpbWUgdmFsdWUuIiwKKwkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7CisJCWlmICgodmFsdWUgPSBjb252dGltZShhcmcpKSA9PSAtMSkKKwkJCWZhdGFsKCIlcyBsaW5lICVkOiBpbnZhbGlkIHRpbWUgdmFsdWUuIiwKKwkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7CisJCWlmICgqYWN0aXZlcCAmJiAqaW50cHRyID09IC0xKQorCQkJKmludHB0ciA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2Ugb0ZvcndhcmRBZ2VudDoKKwkJaW50cHRyID0gJm9wdGlvbnMtPmZvcndhcmRfYWdlbnQ7CitwYXJzZV9mbGFnOgorCQlhcmcgPSBzdHJkZWxpbSgmcyk7CisJCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKKwkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogTWlzc2luZyB5ZXMvbm8gYXJndW1lbnQuIiwgZmlsZW5hbWUsIGxpbmVudW0pOworCQl2YWx1ZSA9IDA7CS8qIFRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcuLi4gKi8KKwkJaWYgKHN0cmNtcChhcmcsICJ5ZXMiKSA9PSAwIHx8IHN0cmNtcChhcmcsICJ0cnVlIikgPT0gMCkKKwkJCXZhbHVlID0gMTsKKwkJZWxzZSBpZiAoc3RyY21wKGFyZywgIm5vIikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiZmFsc2UiKSA9PSAwKQorCQkJdmFsdWUgPSAwOworCQllbHNlCisJCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IEJhZCB5ZXMvbm8gYXJndW1lbnQuIiwgZmlsZW5hbWUsIGxpbmVudW0pOworCQlpZiAoKmFjdGl2ZXAgJiYgKmludHB0ciA9PSAtMSkKKwkJCSppbnRwdHIgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIG9Gb3J3YXJkWDExOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+Zm9yd2FyZF94MTE7CisJCWdvdG8gcGFyc2VfZmxhZzsKKworCWNhc2Ugb0ZvcndhcmRYMTFUcnVzdGVkOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+Zm9yd2FyZF94MTFfdHJ1c3RlZDsKKwkJZ290byBwYXJzZV9mbGFnOworCQorCWNhc2Ugb0ZvcndhcmRYMTFUaW1lb3V0OgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+Zm9yd2FyZF94MTFfdGltZW91dDsKKwkJZ290byBwYXJzZV90aW1lOworCisJY2FzZSBvR2F0ZXdheVBvcnRzOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+Z2F0ZXdheV9wb3J0czsKKwkJZ290byBwYXJzZV9mbGFnOworCisJY2FzZSBvRXhpdE9uRm9yd2FyZEZhaWx1cmU6CisJCWludHB0ciA9ICZvcHRpb25zLT5leGl0X29uX2ZvcndhcmRfZmFpbHVyZTsKKwkJZ290byBwYXJzZV9mbGFnOworCisJY2FzZSBvVXNlUHJpdmlsZWdlZFBvcnQ6CisJCWludHB0ciA9ICZvcHRpb25zLT51c2VfcHJpdmlsZWdlZF9wb3J0OworCQlnb3RvIHBhcnNlX2ZsYWc7CisKKwljYXNlIG9QYXNzd29yZEF1dGhlbnRpY2F0aW9uOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+cGFzc3dvcmRfYXV0aGVudGljYXRpb247CisJCWdvdG8gcGFyc2VfZmxhZzsKKworCWNhc2Ugb1plcm9Lbm93bGVkZ2VQYXNzd29yZEF1dGhlbnRpY2F0aW9uOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+emVyb19rbm93bGVkZ2VfcGFzc3dvcmRfYXV0aGVudGljYXRpb247CisJCWdvdG8gcGFyc2VfZmxhZzsKKworCWNhc2Ugb0tiZEludGVyYWN0aXZlQXV0aGVudGljYXRpb246CisJCWludHB0ciA9ICZvcHRpb25zLT5rYmRfaW50ZXJhY3RpdmVfYXV0aGVudGljYXRpb247CisJCWdvdG8gcGFyc2VfZmxhZzsKKworCWNhc2Ugb0tiZEludGVyYWN0aXZlRGV2aWNlczoKKwkJY2hhcnB0ciA9ICZvcHRpb25zLT5rYmRfaW50ZXJhY3RpdmVfZGV2aWNlczsKKwkJZ290byBwYXJzZV9zdHJpbmc7CisKKwljYXNlIG9QdWJrZXlBdXRoZW50aWNhdGlvbjoKKwkJaW50cHRyID0gJm9wdGlvbnMtPnB1YmtleV9hdXRoZW50aWNhdGlvbjsKKwkJZ290byBwYXJzZV9mbGFnOworCisJY2FzZSBvUlNBQXV0aGVudGljYXRpb246CisJCWludHB0ciA9ICZvcHRpb25zLT5yc2FfYXV0aGVudGljYXRpb247CisJCWdvdG8gcGFyc2VfZmxhZzsKKworCWNhc2Ugb1Job3N0c1JTQUF1dGhlbnRpY2F0aW9uOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+cmhvc3RzX3JzYV9hdXRoZW50aWNhdGlvbjsKKwkJZ290byBwYXJzZV9mbGFnOworCisJY2FzZSBvSG9zdGJhc2VkQXV0aGVudGljYXRpb246CisJCWludHB0ciA9ICZvcHRpb25zLT5ob3N0YmFzZWRfYXV0aGVudGljYXRpb247CisJCWdvdG8gcGFyc2VfZmxhZzsKKworCWNhc2Ugb0NoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb246CisJCWludHB0ciA9ICZvcHRpb25zLT5jaGFsbGVuZ2VfcmVzcG9uc2VfYXV0aGVudGljYXRpb247CisJCWdvdG8gcGFyc2VfZmxhZzsKKworCWNhc2Ugb0dzc0F1dGhlbnRpY2F0aW9uOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+Z3NzX2F1dGhlbnRpY2F0aW9uOworCQlnb3RvIHBhcnNlX2ZsYWc7CisKKwljYXNlIG9Hc3NEZWxlZ2F0ZUNyZWRzOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+Z3NzX2RlbGVnX2NyZWRzOworCQlnb3RvIHBhcnNlX2ZsYWc7CisKKwljYXNlIG9CYXRjaE1vZGU6CisJCWludHB0ciA9ICZvcHRpb25zLT5iYXRjaF9tb2RlOworCQlnb3RvIHBhcnNlX2ZsYWc7CisKKwljYXNlIG9DaGVja0hvc3RJUDoKKwkJaW50cHRyID0gJm9wdGlvbnMtPmNoZWNrX2hvc3RfaXA7CisJCWdvdG8gcGFyc2VfZmxhZzsKKworCWNhc2Ugb1ZlcmlmeUhvc3RLZXlETlM6CisJCWludHB0ciA9ICZvcHRpb25zLT52ZXJpZnlfaG9zdF9rZXlfZG5zOworCQlnb3RvIHBhcnNlX3llc25vYXNrOworCisJY2FzZSBvU3RyaWN0SG9zdEtleUNoZWNraW5nOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+c3RyaWN0X2hvc3Rfa2V5X2NoZWNraW5nOworcGFyc2VfeWVzbm9hc2s6CisJCWFyZyA9IHN0cmRlbGltKCZzKTsKKwkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQorCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBNaXNzaW5nIHllcy9uby9hc2sgYXJndW1lbnQuIiwKKwkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7CisJCXZhbHVlID0gMDsJLyogVG8gYXZvaWQgY29tcGlsZXIgd2FybmluZy4uLiAqLworCQlpZiAoc3RyY21wKGFyZywgInllcyIpID09IDAgfHwgc3RyY21wKGFyZywgInRydWUiKSA9PSAwKQorCQkJdmFsdWUgPSAxOworCQllbHNlIGlmIChzdHJjbXAoYXJnLCAibm8iKSA9PSAwIHx8IHN0cmNtcChhcmcsICJmYWxzZSIpID09IDApCisJCQl2YWx1ZSA9IDA7CisJCWVsc2UgaWYgKHN0cmNtcChhcmcsICJhc2siKSA9PSAwKQorCQkJdmFsdWUgPSAyOworCQllbHNlCisJCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IEJhZCB5ZXMvbm8vYXNrIGFyZ3VtZW50LiIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJaWYgKCphY3RpdmVwICYmICppbnRwdHIgPT0gLTEpCisJCQkqaW50cHRyID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBvQ29tcHJlc3Npb246CisJCWludHB0ciA9ICZvcHRpb25zLT5jb21wcmVzc2lvbjsKKwkJZ290byBwYXJzZV9mbGFnOworCisJY2FzZSBvVENQS2VlcEFsaXZlOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+dGNwX2tlZXBfYWxpdmU7CisJCWdvdG8gcGFyc2VfZmxhZzsKKworCWNhc2Ugb05vSG9zdEF1dGhlbnRpY2F0aW9uRm9yTG9jYWxob3N0OgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+bm9faG9zdF9hdXRoZW50aWNhdGlvbl9mb3JfbG9jYWxob3N0OworCQlnb3RvIHBhcnNlX2ZsYWc7CisKKwljYXNlIG9OdW1iZXJPZlBhc3N3b3JkUHJvbXB0czoKKwkJaW50cHRyID0gJm9wdGlvbnMtPm51bWJlcl9vZl9wYXNzd29yZF9wcm9tcHRzOworCQlnb3RvIHBhcnNlX2ludDsKKworCWNhc2Ugb0NvbXByZXNzaW9uTGV2ZWw6CisJCWludHB0ciA9ICZvcHRpb25zLT5jb21wcmVzc2lvbl9sZXZlbDsKKwkJZ290byBwYXJzZV9pbnQ7CisKKwljYXNlIG9SZWtleUxpbWl0OgorCQlhcmcgPSBzdHJkZWxpbSgmcyk7CisJCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKKwkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogTWlzc2luZyBhcmd1bWVudC4iLCBmaWxlbmFtZSwgbGluZW51bSk7CisJCWlmIChhcmdbMF0gPCAnMCcgfHwgYXJnWzBdID4gJzknKQorCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBCYWQgbnVtYmVyLiIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJb3JpZyA9IHZhbDY0ID0gc3RydG9sbChhcmcsICZlbmRvZm51bWJlciwgMTApOworCQlpZiAoYXJnID09IGVuZG9mbnVtYmVyKQorCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBCYWQgbnVtYmVyLiIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJc3dpdGNoICh0b3VwcGVyKCplbmRvZm51bWJlcikpIHsKKwkJY2FzZSAnXDAnOgorCQkJc2NhbGUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ0snOgorCQkJc2NhbGUgPSAxPDwxMDsKKwkJCWJyZWFrOworCQljYXNlICdNJzoKKwkJCXNjYWxlID0gMTw8MjA7CisJCQlicmVhazsKKwkJY2FzZSAnRyc6CisJCQlzY2FsZSA9IDE8PDMwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IEludmFsaWQgUmVrZXlMaW1pdCBzdWZmaXgiLAorCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJfQorCQl2YWw2NCAqPSBzY2FsZTsKKwkJLyogZGV0ZWN0IGludGVnZXIgd3JhcCBhbmQgdG9vLWxhcmdlIGxpbWl0cyAqLworCQlpZiAoKHZhbDY0IC8gc2NhbGUpICE9IG9yaWcgfHwgdmFsNjQgPiBVSU5UX01BWCkKKwkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogUmVrZXlMaW1pdCB0b28gbGFyZ2UiLAorCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJaWYgKHZhbDY0IDwgMTYpCisJCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IFJla2V5TGltaXQgdG9vIHNtYWxsIiwKKwkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7CisJCWlmICgqYWN0aXZlcCAmJiBvcHRpb25zLT5yZWtleV9saW1pdCA9PSAtMSkKKwkJCW9wdGlvbnMtPnJla2V5X2xpbWl0ID0gKHVfaW50MzJfdCl2YWw2NDsKKwkJYnJlYWs7CisKKwljYXNlIG9JZGVudGl0eUZpbGU6CisJCWFyZyA9IHN0cmRlbGltKCZzKTsKKwkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQorCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBNaXNzaW5nIGFyZ3VtZW50LiIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJaWYgKCphY3RpdmVwKSB7CisJCQlpbnRwdHIgPSAmb3B0aW9ucy0+bnVtX2lkZW50aXR5X2ZpbGVzOworCQkJaWYgKCppbnRwdHIgPj0gU1NIX01BWF9JREVOVElUWV9GSUxFUykKKwkJCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IFRvbyBtYW55IGlkZW50aXR5IGZpbGVzIHNwZWNpZmllZCAobWF4ICVkKS4iLAorCQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSwgU1NIX01BWF9JREVOVElUWV9GSUxFUyk7CisJCQljaGFycHRyID0gJm9wdGlvbnMtPmlkZW50aXR5X2ZpbGVzWyppbnRwdHJdOworCQkJKmNoYXJwdHIgPSB4c3RyZHVwKGFyZyk7CisJCQkqaW50cHRyID0gKmludHB0ciArIDE7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIG9YQXV0aExvY2F0aW9uOgorCQljaGFycHRyPSZvcHRpb25zLT54YXV0aF9sb2NhdGlvbjsKKwkJZ290byBwYXJzZV9zdHJpbmc7CisKKwljYXNlIG9Vc2VyOgorCQljaGFycHRyID0gJm9wdGlvbnMtPnVzZXI7CitwYXJzZV9zdHJpbmc6CisJCWFyZyA9IHN0cmRlbGltKCZzKTsKKwkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQorCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBNaXNzaW5nIGFyZ3VtZW50LiIsCisJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOworCQlpZiAoKmFjdGl2ZXAgJiYgKmNoYXJwdHIgPT0gTlVMTCkKKwkJCSpjaGFycHRyID0geHN0cmR1cChhcmcpOworCQlicmVhazsKKworCWNhc2Ugb0dsb2JhbEtub3duSG9zdHNGaWxlOgorCQljcHB0ciA9IChjaGFyICoqKSZvcHRpb25zLT5zeXN0ZW1faG9zdGZpbGVzOworCQl1aW50cHRyID0gJm9wdGlvbnMtPm51bV9zeXN0ZW1faG9zdGZpbGVzOworCQltYXhfZW50cmllcyA9IFNTSF9NQVhfSE9TVFNfRklMRVM7CitwYXJzZV9jaGFyX2FycmF5OgorCQlpZiAoKmFjdGl2ZXAgJiYgKnVpbnRwdHIgPT0gMCkgeworCQkJd2hpbGUgKChhcmcgPSBzdHJkZWxpbSgmcykpICE9IE5VTEwgJiYgKmFyZyAhPSAnXDAnKSB7CisJCQkJaWYgKCgqdWludHB0cikgPj0gbWF4X2VudHJpZXMpCisJCQkJCWZhdGFsKCIlcyBsaW5lICVkOiAiCisJCQkJCSAgICAidG9vIG1hbnkgYXV0aG9yaXplZCBrZXlzIGZpbGVzLiIsCisJCQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7CisJCQkJY3BwdHJbKCp1aW50cHRyKSsrXSA9IHhzdHJkdXAoYXJnKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2Ugb1VzZXJLbm93bkhvc3RzRmlsZToKKwkJY3BwdHIgPSAoY2hhciAqKikmb3B0aW9ucy0+dXNlcl9ob3N0ZmlsZXM7CisJCXVpbnRwdHIgPSAmb3B0aW9ucy0+bnVtX3VzZXJfaG9zdGZpbGVzOworCQltYXhfZW50cmllcyA9IFNTSF9NQVhfSE9TVFNfRklMRVM7CisJCWdvdG8gcGFyc2VfY2hhcl9hcnJheTsKKworCWNhc2Ugb0hvc3ROYW1lOgorCQljaGFycHRyID0gJm9wdGlvbnMtPmhvc3RuYW1lOworCQlnb3RvIHBhcnNlX3N0cmluZzsKKworCWNhc2Ugb0hvc3RLZXlBbGlhczoKKwkJY2hhcnB0ciA9ICZvcHRpb25zLT5ob3N0X2tleV9hbGlhczsKKwkJZ290byBwYXJzZV9zdHJpbmc7CisKKwljYXNlIG9QcmVmZXJyZWRBdXRoZW50aWNhdGlvbnM6CisJCWNoYXJwdHIgPSAmb3B0aW9ucy0+cHJlZmVycmVkX2F1dGhlbnRpY2F0aW9uczsKKwkJZ290byBwYXJzZV9zdHJpbmc7CisKKwljYXNlIG9CaW5kQWRkcmVzczoKKwkJY2hhcnB0ciA9ICZvcHRpb25zLT5iaW5kX2FkZHJlc3M7CisJCWdvdG8gcGFyc2Vfc3RyaW5nOworCisJY2FzZSBvUEtDUzExUHJvdmlkZXI6CisJCWNoYXJwdHIgPSAmb3B0aW9ucy0+cGtjczExX3Byb3ZpZGVyOworCQlnb3RvIHBhcnNlX3N0cmluZzsKKworCWNhc2Ugb1Byb3h5Q29tbWFuZDoKKwkJY2hhcnB0ciA9ICZvcHRpb25zLT5wcm94eV9jb21tYW5kOworcGFyc2VfY29tbWFuZDoKKwkJaWYgKHMgPT0gTlVMTCkKKwkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogTWlzc2luZyBhcmd1bWVudC4iLCBmaWxlbmFtZSwgbGluZW51bSk7CisJCWxlbiA9IHN0cnNwbihzLCBXSElURVNQQUNFICI9Iik7CisJCWlmICgqYWN0aXZlcCAmJiAqY2hhcnB0ciA9PSBOVUxMKQorCQkJKmNoYXJwdHIgPSB4c3RyZHVwKHMgKyBsZW4pOworCQlyZXR1cm4gMDsKKworCWNhc2Ugb1BvcnQ6CisJCWludHB0ciA9ICZvcHRpb25zLT5wb3J0OworcGFyc2VfaW50OgorCQlhcmcgPSBzdHJkZWxpbSgmcyk7CisJCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKKwkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogTWlzc2luZyBhcmd1bWVudC4iLCBmaWxlbmFtZSwgbGluZW51bSk7CisJCWlmIChhcmdbMF0gPCAnMCcgfHwgYXJnWzBdID4gJzknKQorCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBCYWQgbnVtYmVyLiIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKKworCQkvKiBPY3RhbCwgZGVjaW1hbCwgb3IgaGV4IGZvcm1hdD8gKi8KKwkJdmFsdWUgPSBzdHJ0b2woYXJnLCAmZW5kb2ZudW1iZXIsIDApOworCQlpZiAoYXJnID09IGVuZG9mbnVtYmVyKQorCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBCYWQgbnVtYmVyLiIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJaWYgKCphY3RpdmVwICYmICppbnRwdHIgPT0gLTEpCisJCQkqaW50cHRyID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBvQ29ubmVjdGlvbkF0dGVtcHRzOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+Y29ubmVjdGlvbl9hdHRlbXB0czsKKwkJZ290byBwYXJzZV9pbnQ7CisKKwljYXNlIG9DaXBoZXI6CisJCWludHB0ciA9ICZvcHRpb25zLT5jaXBoZXI7CisJCWFyZyA9IHN0cmRlbGltKCZzKTsKKwkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQorCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBNaXNzaW5nIGFyZ3VtZW50LiIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJdmFsdWUgPSBjaXBoZXJfbnVtYmVyKGFyZyk7CisJCWlmICh2YWx1ZSA9PSAtMSkKKwkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogQmFkIGNpcGhlciAnJXMnLiIsCisJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGFyZyA/IGFyZyA6ICI8Tk9ORT4iKTsKKwkJaWYgKCphY3RpdmVwICYmICppbnRwdHIgPT0gLTEpCisJCQkqaW50cHRyID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBvQ2lwaGVyczoKKwkJYXJnID0gc3RyZGVsaW0oJnMpOworCQlpZiAoIWFyZyB8fCAqYXJnID09ICdcMCcpCisJCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IE1pc3NpbmcgYXJndW1lbnQuIiwgZmlsZW5hbWUsIGxpbmVudW0pOworCQlpZiAoIWNpcGhlcnNfdmFsaWQoYXJnKSkKKwkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogQmFkIFNTSDIgY2lwaGVyIHNwZWMgJyVzJy4iLAorCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtLCBhcmcgPyBhcmcgOiAiPE5PTkU+Iik7CisJCWlmICgqYWN0aXZlcCAmJiBvcHRpb25zLT5jaXBoZXJzID09IE5VTEwpCisJCQlvcHRpb25zLT5jaXBoZXJzID0geHN0cmR1cChhcmcpOworCQlicmVhazsKKworCWNhc2Ugb01hY3M6CisJCWFyZyA9IHN0cmRlbGltKCZzKTsKKwkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQorCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBNaXNzaW5nIGFyZ3VtZW50LiIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJaWYgKCFtYWNfdmFsaWQoYXJnKSkKKwkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogQmFkIFNTSDIgTWFjIHNwZWMgJyVzJy4iLAorCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtLCBhcmcgPyBhcmcgOiAiPE5PTkU+Iik7CisJCWlmICgqYWN0aXZlcCAmJiBvcHRpb25zLT5tYWNzID09IE5VTEwpCisJCQlvcHRpb25zLT5tYWNzID0geHN0cmR1cChhcmcpOworCQlicmVhazsKKworCWNhc2Ugb0tleEFsZ29yaXRobXM6CisJCWFyZyA9IHN0cmRlbGltKCZzKTsKKwkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQorCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBNaXNzaW5nIGFyZ3VtZW50LiIsCisJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOworCQlpZiAoIWtleF9uYW1lc192YWxpZChhcmcpKQorCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBCYWQgU1NIMiBLZXhBbGdvcml0aG1zICclcycuIiwKKwkJCSAgICBmaWxlbmFtZSwgbGluZW51bSwgYXJnID8gYXJnIDogIjxOT05FPiIpOworCQlpZiAoKmFjdGl2ZXAgJiYgb3B0aW9ucy0+a2V4X2FsZ29yaXRobXMgPT0gTlVMTCkKKwkJCW9wdGlvbnMtPmtleF9hbGdvcml0aG1zID0geHN0cmR1cChhcmcpOworCQlicmVhazsKKworCWNhc2Ugb0hvc3RLZXlBbGdvcml0aG1zOgorCQlhcmcgPSBzdHJkZWxpbSgmcyk7CisJCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKKwkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogTWlzc2luZyBhcmd1bWVudC4iLCBmaWxlbmFtZSwgbGluZW51bSk7CisJCWlmICgha2V5X25hbWVzX3ZhbGlkMihhcmcpKQorCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBCYWQgcHJvdG9jb2wgMiBob3N0IGtleSBhbGdvcml0aG1zICclcycuIiwKKwkJCSAgICBmaWxlbmFtZSwgbGluZW51bSwgYXJnID8gYXJnIDogIjxOT05FPiIpOworCQlpZiAoKmFjdGl2ZXAgJiYgb3B0aW9ucy0+aG9zdGtleWFsZ29yaXRobXMgPT0gTlVMTCkKKwkJCW9wdGlvbnMtPmhvc3RrZXlhbGdvcml0aG1zID0geHN0cmR1cChhcmcpOworCQlicmVhazsKKworCWNhc2Ugb1Byb3RvY29sOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+cHJvdG9jb2w7CisJCWFyZyA9IHN0cmRlbGltKCZzKTsKKwkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQorCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBNaXNzaW5nIGFyZ3VtZW50LiIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJdmFsdWUgPSBwcm90b19zcGVjKGFyZyk7CisJCWlmICh2YWx1ZSA9PSBTU0hfUFJPVE9fVU5LTk9XTikKKwkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogQmFkIHByb3RvY29sIHNwZWMgJyVzJy4iLAorCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtLCBhcmcgPyBhcmcgOiAiPE5PTkU+Iik7CisJCWlmICgqYWN0aXZlcCAmJiAqaW50cHRyID09IFNTSF9QUk9UT19VTktOT1dOKQorCQkJKmludHB0ciA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2Ugb0xvZ0xldmVsOgorCQlsb2dfbGV2ZWxfcHRyID0gJm9wdGlvbnMtPmxvZ19sZXZlbDsKKwkJYXJnID0gc3RyZGVsaW0oJnMpOworCQl2YWx1ZSA9IGxvZ19sZXZlbF9udW1iZXIoYXJnKTsKKwkJaWYgKHZhbHVlID09IFNZU0xPR19MRVZFTF9OT1RfU0VUKQorCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiB1bnN1cHBvcnRlZCBsb2cgbGV2ZWwgJyVzJyIsCisJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGFyZyA/IGFyZyA6ICI8Tk9ORT4iKTsKKwkJaWYgKCphY3RpdmVwICYmICpsb2dfbGV2ZWxfcHRyID09IFNZU0xPR19MRVZFTF9OT1RfU0VUKQorCQkJKmxvZ19sZXZlbF9wdHIgPSAoTG9nTGV2ZWwpIHZhbHVlOworCQlicmVhazsKKworCWNhc2Ugb0xvY2FsRm9yd2FyZDoKKwljYXNlIG9SZW1vdGVGb3J3YXJkOgorCWNhc2Ugb0R5bmFtaWNGb3J3YXJkOgorCQlhcmcgPSBzdHJkZWxpbSgmcyk7CisJCWlmIChhcmcgPT0gTlVMTCB8fCAqYXJnID09ICdcMCcpCisJCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IE1pc3NpbmcgcG9ydCBhcmd1bWVudC4iLAorCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKKworCQlpZiAob3Bjb2RlID09IG9Mb2NhbEZvcndhcmQgfHwKKwkJICAgIG9wY29kZSA9PSBvUmVtb3RlRm9yd2FyZCkgeworCQkJYXJnMiA9IHN0cmRlbGltKCZzKTsKKwkJCWlmIChhcmcyID09IE5VTEwgfHwgKmFyZzIgPT0gJ1wwJykKKwkJCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IE1pc3NpbmcgdGFyZ2V0IGFyZ3VtZW50LiIsCisJCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKKworCQkJLyogY29uc3RydWN0IGEgc3RyaW5nIGZvciBwYXJzZV9mb3J3YXJkICovCisJCQlzbnByaW50Zihmd2RhcmcsIHNpemVvZihmd2RhcmcpLCAiJXM6JXMiLCBhcmcsIGFyZzIpOworCQl9IGVsc2UgaWYgKG9wY29kZSA9PSBvRHluYW1pY0ZvcndhcmQpIHsKKwkJCXN0cmxjcHkoZndkYXJnLCBhcmcsIHNpemVvZihmd2RhcmcpKTsKKwkJfQorCisJCWlmIChwYXJzZV9mb3J3YXJkKCZmd2QsIGZ3ZGFyZywKKwkJICAgIG9wY29kZSA9PSBvRHluYW1pY0ZvcndhcmQgPyAxIDogMCwKKwkJICAgIG9wY29kZSA9PSBvUmVtb3RlRm9yd2FyZCA/IDEgOiAwKSA9PSAwKQorCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBCYWQgZm9yd2FyZGluZyBzcGVjaWZpY2F0aW9uLiIsCisJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOworCisJCWlmICgqYWN0aXZlcCkgeworCQkJaWYgKG9wY29kZSA9PSBvTG9jYWxGb3J3YXJkIHx8CisJCQkgICAgb3Bjb2RlID09IG9EeW5hbWljRm9yd2FyZCkKKwkJCQlhZGRfbG9jYWxfZm9yd2FyZChvcHRpb25zLCAmZndkKTsKKwkJCWVsc2UgaWYgKG9wY29kZSA9PSBvUmVtb3RlRm9yd2FyZCkKKwkJCQlhZGRfcmVtb3RlX2ZvcndhcmQob3B0aW9ucywgJmZ3ZCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIG9DbGVhckFsbEZvcndhcmRpbmdzOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+Y2xlYXJfZm9yd2FyZGluZ3M7CisJCWdvdG8gcGFyc2VfZmxhZzsKKworCWNhc2Ugb0hvc3Q6CisJCSphY3RpdmVwID0gMDsKKwkJYXJnMiA9IE5VTEw7CisJCXdoaWxlICgoYXJnID0gc3RyZGVsaW0oJnMpKSAhPSBOVUxMICYmICphcmcgIT0gJ1wwJykgeworCQkJbmVnYXRlZCA9ICphcmcgPT0gJyEnOworCQkJaWYgKG5lZ2F0ZWQpCisJCQkJYXJnKys7CisJCQlpZiAobWF0Y2hfcGF0dGVybihob3N0LCBhcmcpKSB7CisJCQkJaWYgKG5lZ2F0ZWQpIHsKKwkJCQkJZGVidWcoIiUuMjAwcyBsaW5lICVkOiBTa2lwcGluZyBIb3N0ICIKKwkJCQkJICAgICJibG9jayBiZWNhdXNlIG9mIG5lZ2F0ZWQgbWF0Y2ggIgorCQkJCQkgICAgImZvciAlLjEwMHMiLCBmaWxlbmFtZSwgbGluZW51bSwKKwkJCQkJICAgIGFyZyk7CisJCQkJCSphY3RpdmVwID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmICghKmFjdGl2ZXApCisJCQkJCWFyZzIgPSBhcmc7IC8qIGxvZ2dlZCBiZWxvdyAqLworCQkJCSphY3RpdmVwID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoKmFjdGl2ZXApCisJCQlkZWJ1ZygiJS4yMDBzIGxpbmUgJWQ6IEFwcGx5aW5nIG9wdGlvbnMgZm9yICUuMTAwcyIsCisJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGFyZzIpOworCQkvKiBBdm9pZCBnYXJiYWdlIGNoZWNrIGJlbG93LCBhcyBzdHJkZWxpbSBpcyBkb25lLiAqLworCQlyZXR1cm4gMDsKKworCWNhc2Ugb0VzY2FwZUNoYXI6CisJCWludHB0ciA9ICZvcHRpb25zLT5lc2NhcGVfY2hhcjsKKwkJYXJnID0gc3RyZGVsaW0oJnMpOworCQlpZiAoIWFyZyB8fCAqYXJnID09ICdcMCcpCisJCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IE1pc3NpbmcgYXJndW1lbnQuIiwgZmlsZW5hbWUsIGxpbmVudW0pOworCQlpZiAoYXJnWzBdID09ICdeJyAmJiBhcmdbMl0gPT0gMCAmJgorCQkgICAgKHVfY2hhcikgYXJnWzFdID49IDY0ICYmICh1X2NoYXIpIGFyZ1sxXSA8IDEyOCkKKwkJCXZhbHVlID0gKHVfY2hhcikgYXJnWzFdICYgMzE7CisJCWVsc2UgaWYgKHN0cmxlbihhcmcpID09IDEpCisJCQl2YWx1ZSA9ICh1X2NoYXIpIGFyZ1swXTsKKwkJZWxzZSBpZiAoc3RyY21wKGFyZywgIm5vbmUiKSA9PSAwKQorCQkJdmFsdWUgPSBTU0hfRVNDQVBFQ0hBUl9OT05FOworCQllbHNlIHsKKwkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogQmFkIGVzY2FwZSBjaGFyYWN0ZXIuIiwKKwkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCQl2YWx1ZSA9IDA7CS8qIEF2b2lkIGNvbXBpbGVyIHdhcm5pbmcuICovCisJCX0KKwkJaWYgKCphY3RpdmVwICYmICppbnRwdHIgPT0gLTEpCisJCQkqaW50cHRyID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBvQWRkcmVzc0ZhbWlseToKKwkJYXJnID0gc3RyZGVsaW0oJnMpOworCQlpZiAoIWFyZyB8fCAqYXJnID09ICdcMCcpCisJCQlmYXRhbCgiJXMgbGluZSAlZDogbWlzc2luZyBhZGRyZXNzIGZhbWlseS4iLAorCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJaW50cHRyID0gJm9wdGlvbnMtPmFkZHJlc3NfZmFtaWx5OworCQlpZiAoc3RyY2FzZWNtcChhcmcsICJpbmV0IikgPT0gMCkKKwkJCXZhbHVlID0gQUZfSU5FVDsKKwkJZWxzZSBpZiAoc3RyY2FzZWNtcChhcmcsICJpbmV0NiIpID09IDApCisJCQl2YWx1ZSA9IEFGX0lORVQ2OworCQllbHNlIGlmIChzdHJjYXNlY21wKGFyZywgImFueSIpID09IDApCisJCQl2YWx1ZSA9IEFGX1VOU1BFQzsKKwkJZWxzZQorCQkJZmF0YWwoIlVuc3VwcG9ydGVkIEFkZHJlc3NGYW1pbHkgXCIlc1wiIiwgYXJnKTsKKwkJaWYgKCphY3RpdmVwICYmICppbnRwdHIgPT0gLTEpCisJCQkqaW50cHRyID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBvRW5hYmxlU1NIS2V5c2lnbjoKKwkJaW50cHRyID0gJm9wdGlvbnMtPmVuYWJsZV9zc2hfa2V5c2lnbjsKKwkJZ290byBwYXJzZV9mbGFnOworCisJY2FzZSBvSWRlbnRpdGllc09ubHk6CisJCWludHB0ciA9ICZvcHRpb25zLT5pZGVudGl0aWVzX29ubHk7CisJCWdvdG8gcGFyc2VfZmxhZzsKKworCWNhc2Ugb1NlcnZlckFsaXZlSW50ZXJ2YWw6CisJCWludHB0ciA9ICZvcHRpb25zLT5zZXJ2ZXJfYWxpdmVfaW50ZXJ2YWw7CisJCWdvdG8gcGFyc2VfdGltZTsKKworCWNhc2Ugb1NlcnZlckFsaXZlQ291bnRNYXg6CisJCWludHB0ciA9ICZvcHRpb25zLT5zZXJ2ZXJfYWxpdmVfY291bnRfbWF4OworCQlnb3RvIHBhcnNlX2ludDsKKworCWNhc2Ugb1NlbmRFbnY6CisJCXdoaWxlICgoYXJnID0gc3RyZGVsaW0oJnMpKSAhPSBOVUxMICYmICphcmcgIT0gJ1wwJykgeworCQkJaWYgKHN0cmNocihhcmcsICc9JykgIT0gTlVMTCkKKwkJCQlmYXRhbCgiJXMgbGluZSAlZDogSW52YWxpZCBlbnZpcm9ubWVudCBuYW1lLiIsCisJCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJCWlmICghKmFjdGl2ZXApCisJCQkJY29udGludWU7CisJCQlpZiAob3B0aW9ucy0+bnVtX3NlbmRfZW52ID49IE1BWF9TRU5EX0VOVikKKwkJCQlmYXRhbCgiJXMgbGluZSAlZDogdG9vIG1hbnkgc2VuZCBlbnYuIiwKKwkJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOworCQkJb3B0aW9ucy0+c2VuZF9lbnZbb3B0aW9ucy0+bnVtX3NlbmRfZW52KytdID0KKwkJCSAgICB4c3RyZHVwKGFyZyk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIG9Db250cm9sUGF0aDoKKwkJY2hhcnB0ciA9ICZvcHRpb25zLT5jb250cm9sX3BhdGg7CisJCWdvdG8gcGFyc2Vfc3RyaW5nOworCisJY2FzZSBvQ29udHJvbE1hc3RlcjoKKwkJaW50cHRyID0gJm9wdGlvbnMtPmNvbnRyb2xfbWFzdGVyOworCQlhcmcgPSBzdHJkZWxpbSgmcyk7CisJCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKKwkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogTWlzc2luZyBDb250cm9sTWFzdGVyIGFyZ3VtZW50LiIsCisJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOworCQl2YWx1ZSA9IDA7CS8qIFRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcuLi4gKi8KKwkJaWYgKHN0cmNtcChhcmcsICJ5ZXMiKSA9PSAwIHx8IHN0cmNtcChhcmcsICJ0cnVlIikgPT0gMCkKKwkJCXZhbHVlID0gU1NIQ1RMX01BU1RFUl9ZRVM7CisJCWVsc2UgaWYgKHN0cmNtcChhcmcsICJubyIpID09IDAgfHwgc3RyY21wKGFyZywgImZhbHNlIikgPT0gMCkKKwkJCXZhbHVlID0gU1NIQ1RMX01BU1RFUl9OTzsKKwkJZWxzZSBpZiAoc3RyY21wKGFyZywgImF1dG8iKSA9PSAwKQorCQkJdmFsdWUgPSBTU0hDVExfTUFTVEVSX0FVVE87CisJCWVsc2UgaWYgKHN0cmNtcChhcmcsICJhc2siKSA9PSAwKQorCQkJdmFsdWUgPSBTU0hDVExfTUFTVEVSX0FTSzsKKwkJZWxzZSBpZiAoc3RyY21wKGFyZywgImF1dG9hc2siKSA9PSAwKQorCQkJdmFsdWUgPSBTU0hDVExfTUFTVEVSX0FVVE9fQVNLOworCQllbHNlCisJCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IEJhZCBDb250cm9sTWFzdGVyIGFyZ3VtZW50LiIsCisJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOworCQlpZiAoKmFjdGl2ZXAgJiYgKmludHB0ciA9PSAtMSkKKwkJCSppbnRwdHIgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIG9Db250cm9sUGVyc2lzdDoKKwkJLyogbm8vZmFsc2UveWVzL3RydWUsIG9yIGEgdGltZSBzcGVjICovCisJCWludHB0ciA9ICZvcHRpb25zLT5jb250cm9sX3BlcnNpc3Q7CisJCWFyZyA9IHN0cmRlbGltKCZzKTsKKwkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQorCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBNaXNzaW5nIENvbnRyb2xQZXJzaXN0IgorCQkJICAgICIgYXJndW1lbnQuIiwgZmlsZW5hbWUsIGxpbmVudW0pOworCQl2YWx1ZSA9IDA7CisJCXZhbHVlMiA9IDA7CS8qIHRpbWVvdXQgKi8KKwkJaWYgKHN0cmNtcChhcmcsICJubyIpID09IDAgfHwgc3RyY21wKGFyZywgImZhbHNlIikgPT0gMCkKKwkJCXZhbHVlID0gMDsKKwkJZWxzZSBpZiAoc3RyY21wKGFyZywgInllcyIpID09IDAgfHwgc3RyY21wKGFyZywgInRydWUiKSA9PSAwKQorCQkJdmFsdWUgPSAxOworCQllbHNlIGlmICgodmFsdWUyID0gY29udnRpbWUoYXJnKSkgPj0gMCkKKwkJCXZhbHVlID0gMTsKKwkJZWxzZQorCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBCYWQgQ29udHJvbFBlcnNpc3QgYXJndW1lbnQuIiwKKwkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7CisJCWlmICgqYWN0aXZlcCAmJiAqaW50cHRyID09IC0xKSB7CisJCQkqaW50cHRyID0gdmFsdWU7CisJCQlvcHRpb25zLT5jb250cm9sX3BlcnNpc3RfdGltZW91dCA9IHZhbHVlMjsKKwkJfQorCQlicmVhazsKKworCWNhc2Ugb0hhc2hLbm93bkhvc3RzOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+aGFzaF9rbm93bl9ob3N0czsKKwkJZ290byBwYXJzZV9mbGFnOworCisJY2FzZSBvVHVubmVsOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+dHVuX29wZW47CisJCWFyZyA9IHN0cmRlbGltKCZzKTsKKwkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQorCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IE1pc3NpbmcgeWVzL3BvaW50LXRvLXBvaW50LyIKKwkJCSAgICAiZXRoZXJuZXQvbm8gYXJndW1lbnQuIiwgZmlsZW5hbWUsIGxpbmVudW0pOworCQl2YWx1ZSA9IDA7CS8qIHNpbGVuY2UgY29tcGlsZXIgKi8KKwkJaWYgKHN0cmNhc2VjbXAoYXJnLCAiZXRoZXJuZXQiKSA9PSAwKQorCQkJdmFsdWUgPSBTU0hfVFVOTU9ERV9FVEhFUk5FVDsKKwkJZWxzZSBpZiAoc3RyY2FzZWNtcChhcmcsICJwb2ludC10by1wb2ludCIpID09IDApCisJCQl2YWx1ZSA9IFNTSF9UVU5NT0RFX1BPSU5UT1BPSU5UOworCQllbHNlIGlmIChzdHJjYXNlY21wKGFyZywgInllcyIpID09IDApCisJCQl2YWx1ZSA9IFNTSF9UVU5NT0RFX0RFRkFVTFQ7CisJCWVsc2UgaWYgKHN0cmNhc2VjbXAoYXJnLCAibm8iKSA9PSAwKQorCQkJdmFsdWUgPSBTU0hfVFVOTU9ERV9OTzsKKwkJZWxzZQorCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IEJhZCB5ZXMvcG9pbnQtdG8tcG9pbnQvZXRoZXJuZXQvIgorCQkJICAgICJubyBhcmd1bWVudDogJXMiLCBmaWxlbmFtZSwgbGluZW51bSwgYXJnKTsKKwkJaWYgKCphY3RpdmVwKQorCQkJKmludHB0ciA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2Ugb1R1bm5lbERldmljZToKKwkJYXJnID0gc3RyZGVsaW0oJnMpOworCQlpZiAoIWFyZyB8fCAqYXJnID09ICdcMCcpCisJCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IE1pc3NpbmcgYXJndW1lbnQuIiwgZmlsZW5hbWUsIGxpbmVudW0pOworCQl2YWx1ZSA9IGEydHVuKGFyZywgJnZhbHVlMik7CisJCWlmICh2YWx1ZSA9PSBTU0hfVFVOSURfRVJSKQorCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBCYWQgdHVuIGRldmljZS4iLCBmaWxlbmFtZSwgbGluZW51bSk7CisJCWlmICgqYWN0aXZlcCkgeworCQkJb3B0aW9ucy0+dHVuX2xvY2FsID0gdmFsdWU7CisJCQlvcHRpb25zLT50dW5fcmVtb3RlID0gdmFsdWUyOworCQl9CisJCWJyZWFrOworCisJY2FzZSBvTG9jYWxDb21tYW5kOgorCQljaGFycHRyID0gJm9wdGlvbnMtPmxvY2FsX2NvbW1hbmQ7CisJCWdvdG8gcGFyc2VfY29tbWFuZDsKKworCWNhc2Ugb1Blcm1pdExvY2FsQ29tbWFuZDoKKwkJaW50cHRyID0gJm9wdGlvbnMtPnBlcm1pdF9sb2NhbF9jb21tYW5kOworCQlnb3RvIHBhcnNlX2ZsYWc7CisKKwljYXNlIG9WaXN1YWxIb3N0S2V5OgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+dmlzdWFsX2hvc3Rfa2V5OworCQlnb3RvIHBhcnNlX2ZsYWc7CisKKwljYXNlIG9JUFFvUzoKKwkJYXJnID0gc3RyZGVsaW0oJnMpOworCQlpZiAoKHZhbHVlID0gcGFyc2VfaXBxb3MoYXJnKSkgPT0gLTEpCisJCQlmYXRhbCgiJXMgbGluZSAlZDogQmFkIElQUW9TIHZhbHVlOiAlcyIsCisJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGFyZyk7CisJCWFyZyA9IHN0cmRlbGltKCZzKTsKKwkJaWYgKGFyZyA9PSBOVUxMKQorCQkJdmFsdWUyID0gdmFsdWU7CisJCWVsc2UgaWYgKCh2YWx1ZTIgPSBwYXJzZV9pcHFvcyhhcmcpKSA9PSAtMSkKKwkJCWZhdGFsKCIlcyBsaW5lICVkOiBCYWQgSVBRb1MgdmFsdWU6ICVzIiwKKwkJCSAgICBmaWxlbmFtZSwgbGluZW51bSwgYXJnKTsKKwkJaWYgKCphY3RpdmVwKSB7CisJCQlvcHRpb25zLT5pcF9xb3NfaW50ZXJhY3RpdmUgPSB2YWx1ZTsKKwkJCW9wdGlvbnMtPmlwX3Fvc19idWxrID0gdmFsdWUyOworCQl9CisJCWJyZWFrOworCisJY2FzZSBvVXNlUm9hbWluZzoKKwkJaW50cHRyID0gJm9wdGlvbnMtPnVzZV9yb2FtaW5nOworCQlnb3RvIHBhcnNlX2ZsYWc7CisKKwljYXNlIG9SZXF1ZXN0VFRZOgorCQlhcmcgPSBzdHJkZWxpbSgmcyk7CisJCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKKwkJCWZhdGFsKCIlcyBsaW5lICVkOiBtaXNzaW5nIGFyZ3VtZW50LiIsCisJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOworCQlpbnRwdHIgPSAmb3B0aW9ucy0+cmVxdWVzdF90dHk7CisJCWlmIChzdHJjYXNlY21wKGFyZywgInllcyIpID09IDApCisJCQl2YWx1ZSA9IFJFUVVFU1RfVFRZX1lFUzsKKwkJZWxzZSBpZiAoc3RyY2FzZWNtcChhcmcsICJubyIpID09IDApCisJCQl2YWx1ZSA9IFJFUVVFU1RfVFRZX05POworCQllbHNlIGlmIChzdHJjYXNlY21wKGFyZywgImZvcmNlIikgPT0gMCkKKwkJCXZhbHVlID0gUkVRVUVTVF9UVFlfRk9SQ0U7CisJCWVsc2UgaWYgKHN0cmNhc2VjbXAoYXJnLCAiYXV0byIpID09IDApCisJCQl2YWx1ZSA9IFJFUVVFU1RfVFRZX0FVVE87CisJCWVsc2UKKwkJCWZhdGFsKCJVbnN1cHBvcnRlZCBSZXF1ZXN0VFRZIFwiJXNcIiIsIGFyZyk7CisJCWlmICgqYWN0aXZlcCAmJiAqaW50cHRyID09IC0xKQorCQkJKmludHB0ciA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2Ugb0RlcHJlY2F0ZWQ6CisJCWRlYnVnKCIlcyBsaW5lICVkOiBEZXByZWNhdGVkIG9wdGlvbiBcIiVzXCIiLAorCQkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGtleXdvcmQpOworCQlyZXR1cm4gMDsKKworCWNhc2Ugb1Vuc3VwcG9ydGVkOgorCQllcnJvcigiJXMgbGluZSAlZDogVW5zdXBwb3J0ZWQgb3B0aW9uIFwiJXNcIiIsCisJCSAgICBmaWxlbmFtZSwgbGluZW51bSwga2V5d29yZCk7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJZmF0YWwoInByb2Nlc3NfY29uZmlnX2xpbmU6IFVuaW1wbGVtZW50ZWQgb3Bjb2RlICVkIiwgb3Bjb2RlKTsKKwl9CisKKwkvKiBDaGVjayB0aGF0IHRoZXJlIGlzIG5vIGdhcmJhZ2UgYXQgZW5kIG9mIGxpbmUuICovCisJaWYgKChhcmcgPSBzdHJkZWxpbSgmcykpICE9IE5VTEwgJiYgKmFyZyAhPSAnXDAnKSB7CisJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogZ2FyYmFnZSBhdCBlbmQgb2YgbGluZTsgXCIlLjIwMHNcIi4iLAorCQkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGFyZyk7CisJfQorCXJldHVybiAwOworfQorCisKKy8qCisgKiBSZWFkcyB0aGUgY29uZmlnIGZpbGUgYW5kIG1vZGlmaWVzIHRoZSBvcHRpb25zIGFjY29yZGluZ2x5LiAgT3B0aW9ucworICogc2hvdWxkIGFscmVhZHkgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgY2FsbC4gIFRoaXMgbmV2ZXIgcmV0dXJucyBpZgorICogdGhlcmUgaXMgYW4gZXJyb3IuICBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgdGhpcyByZXR1cm5zIDAuCisgKi8KKworaW50CityZWFkX2NvbmZpZ19maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpob3N0LCBPcHRpb25zICpvcHRpb25zLAorICAgIGludCBjaGVja3Blcm0pCit7CisJRklMRSAqZjsKKwljaGFyIGxpbmVbMTAyNF07CisJaW50IGFjdGl2ZSwgbGluZW51bTsKKwlpbnQgYmFkX29wdGlvbnMgPSAwOworCisJaWYgKChmID0gZm9wZW4oZmlsZW5hbWUsICJyIikpID09IE5VTEwpCisJCXJldHVybiAwOworCisJaWYgKGNoZWNrcGVybSkgeworCQlzdHJ1Y3Qgc3RhdCBzYjsKKworCQlpZiAoZnN0YXQoZmlsZW5vKGYpLCAmc2IpID09IC0xKQorCQkJZmF0YWwoImZzdGF0ICVzOiAlcyIsIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlpZiAoKChzYi5zdF91aWQgIT0gMCAmJiBzYi5zdF91aWQgIT0gZ2V0dWlkKCkpIHx8CisJCSAgICAoc2Iuc3RfbW9kZSAmIDAyMikgIT0gMCkpCisJCQlmYXRhbCgiQmFkIG93bmVyIG9yIHBlcm1pc3Npb25zIG9uICVzIiwgZmlsZW5hbWUpOworCX0KKworCWRlYnVnKCJSZWFkaW5nIGNvbmZpZ3VyYXRpb24gZGF0YSAlLjIwMHMiLCBmaWxlbmFtZSk7CisKKwkvKgorCSAqIE1hcmsgdGhhdCB3ZSBhcmUgbm93IHByb2Nlc3NpbmcgdGhlIG9wdGlvbnMuICBUaGlzIGZsYWcgaXMgdHVybmVkCisJICogb24vb2ZmIGJ5IEhvc3Qgc3BlY2lmaWNhdGlvbnMuCisJICovCisJYWN0aXZlID0gMTsKKwlsaW5lbnVtID0gMDsKKwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmKSkgeworCQkvKiBVcGRhdGUgbGluZSBudW1iZXIgY291bnRlci4gKi8KKwkJbGluZW51bSsrOworCQlpZiAocHJvY2Vzc19jb25maWdfbGluZShvcHRpb25zLCBob3N0LCBsaW5lLCBmaWxlbmFtZSwgbGluZW51bSwgJmFjdGl2ZSkgIT0gMCkKKwkJCWJhZF9vcHRpb25zKys7CisJfQorCWZjbG9zZShmKTsKKwlpZiAoYmFkX29wdGlvbnMgPiAwKQorCQlmYXRhbCgiJXM6IHRlcm1pbmF0aW5nLCAlZCBiYWQgY29uZmlndXJhdGlvbiBvcHRpb25zIiwKKwkJICAgIGZpbGVuYW1lLCBiYWRfb3B0aW9ucyk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBJbml0aWFsaXplcyBvcHRpb25zIHRvIHNwZWNpYWwgdmFsdWVzIHRoYXQgaW5kaWNhdGUgdGhhdCB0aGV5IGhhdmUgbm90IHlldAorICogYmVlbiBzZXQuICBSZWFkX2NvbmZpZ19maWxlIHdpbGwgb25seSBzZXQgb3B0aW9ucyB3aXRoIHRoaXMgdmFsdWUuIE9wdGlvbnMKKyAqIGFyZSBwcm9jZXNzZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogY29tbWFuZCBsaW5lLCB1c2VyIGNvbmZpZyBmaWxlLAorICogc3lzdGVtIGNvbmZpZyBmaWxlLiAgTGFzdCwgZmlsbF9kZWZhdWx0X29wdGlvbnMgaXMgY2FsbGVkLgorICovCisKK3ZvaWQKK2luaXRpYWxpemVfb3B0aW9ucyhPcHRpb25zICogb3B0aW9ucykKK3sKKwltZW1zZXQob3B0aW9ucywgJ1gnLCBzaXplb2YoKm9wdGlvbnMpKTsKKwlvcHRpb25zLT5mb3J3YXJkX2FnZW50ID0gLTE7CisJb3B0aW9ucy0+Zm9yd2FyZF94MTEgPSAtMTsKKwlvcHRpb25zLT5mb3J3YXJkX3gxMV90cnVzdGVkID0gLTE7CisJb3B0aW9ucy0+Zm9yd2FyZF94MTFfdGltZW91dCA9IC0xOworCW9wdGlvbnMtPmV4aXRfb25fZm9yd2FyZF9mYWlsdXJlID0gLTE7CisJb3B0aW9ucy0+eGF1dGhfbG9jYXRpb24gPSBOVUxMOworCW9wdGlvbnMtPmdhdGV3YXlfcG9ydHMgPSAtMTsKKwlvcHRpb25zLT51c2VfcHJpdmlsZWdlZF9wb3J0ID0gLTE7CisJb3B0aW9ucy0+cnNhX2F1dGhlbnRpY2F0aW9uID0gLTE7CisJb3B0aW9ucy0+cHVia2V5X2F1dGhlbnRpY2F0aW9uID0gLTE7CisJb3B0aW9ucy0+Y2hhbGxlbmdlX3Jlc3BvbnNlX2F1dGhlbnRpY2F0aW9uID0gLTE7CisJb3B0aW9ucy0+Z3NzX2F1dGhlbnRpY2F0aW9uID0gLTE7CisJb3B0aW9ucy0+Z3NzX2RlbGVnX2NyZWRzID0gLTE7CisJb3B0aW9ucy0+cGFzc3dvcmRfYXV0aGVudGljYXRpb24gPSAtMTsKKwlvcHRpb25zLT5rYmRfaW50ZXJhY3RpdmVfYXV0aGVudGljYXRpb24gPSAtMTsKKwlvcHRpb25zLT5rYmRfaW50ZXJhY3RpdmVfZGV2aWNlcyA9IE5VTEw7CisJb3B0aW9ucy0+cmhvc3RzX3JzYV9hdXRoZW50aWNhdGlvbiA9IC0xOworCW9wdGlvbnMtPmhvc3RiYXNlZF9hdXRoZW50aWNhdGlvbiA9IC0xOworCW9wdGlvbnMtPmJhdGNoX21vZGUgPSAtMTsKKwlvcHRpb25zLT5jaGVja19ob3N0X2lwID0gLTE7CisJb3B0aW9ucy0+c3RyaWN0X2hvc3Rfa2V5X2NoZWNraW5nID0gLTE7CisJb3B0aW9ucy0+Y29tcHJlc3Npb24gPSAtMTsKKwlvcHRpb25zLT50Y3Bfa2VlcF9hbGl2ZSA9IC0xOworCW9wdGlvbnMtPmNvbXByZXNzaW9uX2xldmVsID0gLTE7CisJb3B0aW9ucy0+cG9ydCA9IC0xOworCW9wdGlvbnMtPmFkZHJlc3NfZmFtaWx5ID0gLTE7CisJb3B0aW9ucy0+Y29ubmVjdGlvbl9hdHRlbXB0cyA9IC0xOworCW9wdGlvbnMtPmNvbm5lY3Rpb25fdGltZW91dCA9IC0xOworCW9wdGlvbnMtPm51bWJlcl9vZl9wYXNzd29yZF9wcm9tcHRzID0gLTE7CisJb3B0aW9ucy0+Y2lwaGVyID0gLTE7CisJb3B0aW9ucy0+Y2lwaGVycyA9IE5VTEw7CisJb3B0aW9ucy0+bWFjcyA9IE5VTEw7CisJb3B0aW9ucy0+a2V4X2FsZ29yaXRobXMgPSBOVUxMOworCW9wdGlvbnMtPmhvc3RrZXlhbGdvcml0aG1zID0gTlVMTDsKKwlvcHRpb25zLT5wcm90b2NvbCA9IFNTSF9QUk9UT19VTktOT1dOOworCW9wdGlvbnMtPm51bV9pZGVudGl0eV9maWxlcyA9IDA7CisJb3B0aW9ucy0+aG9zdG5hbWUgPSBOVUxMOworCW9wdGlvbnMtPmhvc3Rfa2V5X2FsaWFzID0gTlVMTDsKKwlvcHRpb25zLT5wcm94eV9jb21tYW5kID0gTlVMTDsKKwlvcHRpb25zLT51c2VyID0gTlVMTDsKKwlvcHRpb25zLT5lc2NhcGVfY2hhciA9IC0xOworCW9wdGlvbnMtPm51bV9zeXN0ZW1faG9zdGZpbGVzID0gMDsKKwlvcHRpb25zLT5udW1fdXNlcl9ob3N0ZmlsZXMgPSAwOworCW9wdGlvbnMtPmxvY2FsX2ZvcndhcmRzID0gTlVMTDsKKwlvcHRpb25zLT5udW1fbG9jYWxfZm9yd2FyZHMgPSAwOworCW9wdGlvbnMtPnJlbW90ZV9mb3J3YXJkcyA9IE5VTEw7CisJb3B0aW9ucy0+bnVtX3JlbW90ZV9mb3J3YXJkcyA9IDA7CisJb3B0aW9ucy0+Y2xlYXJfZm9yd2FyZGluZ3MgPSAtMTsKKwlvcHRpb25zLT5sb2dfbGV2ZWwgPSBTWVNMT0dfTEVWRUxfTk9UX1NFVDsKKwlvcHRpb25zLT5wcmVmZXJyZWRfYXV0aGVudGljYXRpb25zID0gTlVMTDsKKwlvcHRpb25zLT5iaW5kX2FkZHJlc3MgPSBOVUxMOworCW9wdGlvbnMtPnBrY3MxMV9wcm92aWRlciA9IE5VTEw7CisJb3B0aW9ucy0+ZW5hYmxlX3NzaF9rZXlzaWduID0gLSAxOworCW9wdGlvbnMtPm5vX2hvc3RfYXV0aGVudGljYXRpb25fZm9yX2xvY2FsaG9zdCA9IC0gMTsKKwlvcHRpb25zLT5pZGVudGl0aWVzX29ubHkgPSAtIDE7CisJb3B0aW9ucy0+cmVrZXlfbGltaXQgPSAtIDE7CisJb3B0aW9ucy0+dmVyaWZ5X2hvc3Rfa2V5X2RucyA9IC0xOworCW9wdGlvbnMtPnNlcnZlcl9hbGl2ZV9pbnRlcnZhbCA9IC0xOworCW9wdGlvbnMtPnNlcnZlcl9hbGl2ZV9jb3VudF9tYXggPSAtMTsKKwlvcHRpb25zLT5udW1fc2VuZF9lbnYgPSAwOworCW9wdGlvbnMtPmNvbnRyb2xfcGF0aCA9IE5VTEw7CisJb3B0aW9ucy0+Y29udHJvbF9tYXN0ZXIgPSAtMTsKKwlvcHRpb25zLT5jb250cm9sX3BlcnNpc3QgPSAtMTsKKwlvcHRpb25zLT5jb250cm9sX3BlcnNpc3RfdGltZW91dCA9IDA7CisJb3B0aW9ucy0+aGFzaF9rbm93bl9ob3N0cyA9IC0xOworCW9wdGlvbnMtPnR1bl9vcGVuID0gLTE7CisJb3B0aW9ucy0+dHVuX2xvY2FsID0gLTE7CisJb3B0aW9ucy0+dHVuX3JlbW90ZSA9IC0xOworCW9wdGlvbnMtPmxvY2FsX2NvbW1hbmQgPSBOVUxMOworCW9wdGlvbnMtPnBlcm1pdF9sb2NhbF9jb21tYW5kID0gLTE7CisJb3B0aW9ucy0+dXNlX3JvYW1pbmcgPSAtMTsKKwlvcHRpb25zLT52aXN1YWxfaG9zdF9rZXkgPSAtMTsKKwlvcHRpb25zLT56ZXJvX2tub3dsZWRnZV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbiA9IC0xOworCW9wdGlvbnMtPmlwX3Fvc19pbnRlcmFjdGl2ZSA9IC0xOworCW9wdGlvbnMtPmlwX3Fvc19idWxrID0gLTE7CisJb3B0aW9ucy0+cmVxdWVzdF90dHkgPSAtMTsKK30KKworLyoKKyAqIENhbGxlZCBhZnRlciBwcm9jZXNzaW5nIG90aGVyIHNvdXJjZXMgb2Ygb3B0aW9uIGRhdGEsIHRoaXMgZmlsbHMgdGhvc2UKKyAqIG9wdGlvbnMgZm9yIHdoaWNoIG5vIHZhbHVlIGhhcyBiZWVuIHNwZWNpZmllZCB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICovCisKK3ZvaWQKK2ZpbGxfZGVmYXVsdF9vcHRpb25zKE9wdGlvbnMgKiBvcHRpb25zKQoreworCWludCBsZW47CisKKwlpZiAob3B0aW9ucy0+Zm9yd2FyZF9hZ2VudCA9PSAtMSkKKwkJb3B0aW9ucy0+Zm9yd2FyZF9hZ2VudCA9IDA7CisJaWYgKG9wdGlvbnMtPmZvcndhcmRfeDExID09IC0xKQorCQlvcHRpb25zLT5mb3J3YXJkX3gxMSA9IDA7CisJaWYgKG9wdGlvbnMtPmZvcndhcmRfeDExX3RydXN0ZWQgPT0gLTEpCisJCW9wdGlvbnMtPmZvcndhcmRfeDExX3RydXN0ZWQgPSAwOworCWlmIChvcHRpb25zLT5mb3J3YXJkX3gxMV90aW1lb3V0ID09IC0xKQorCQlvcHRpb25zLT5mb3J3YXJkX3gxMV90aW1lb3V0ID0gMTIwMDsKKwlpZiAob3B0aW9ucy0+ZXhpdF9vbl9mb3J3YXJkX2ZhaWx1cmUgPT0gLTEpCisJCW9wdGlvbnMtPmV4aXRfb25fZm9yd2FyZF9mYWlsdXJlID0gMDsKKwlpZiAob3B0aW9ucy0+eGF1dGhfbG9jYXRpb24gPT0gTlVMTCkKKwkJb3B0aW9ucy0+eGF1dGhfbG9jYXRpb24gPSBfUEFUSF9YQVVUSDsKKwlpZiAob3B0aW9ucy0+Z2F0ZXdheV9wb3J0cyA9PSAtMSkKKwkJb3B0aW9ucy0+Z2F0ZXdheV9wb3J0cyA9IDA7CisJaWYgKG9wdGlvbnMtPnVzZV9wcml2aWxlZ2VkX3BvcnQgPT0gLTEpCisJCW9wdGlvbnMtPnVzZV9wcml2aWxlZ2VkX3BvcnQgPSAwOworCWlmIChvcHRpb25zLT5yc2FfYXV0aGVudGljYXRpb24gPT0gLTEpCisJCW9wdGlvbnMtPnJzYV9hdXRoZW50aWNhdGlvbiA9IDE7CisJaWYgKG9wdGlvbnMtPnB1YmtleV9hdXRoZW50aWNhdGlvbiA9PSAtMSkKKwkJb3B0aW9ucy0+cHVia2V5X2F1dGhlbnRpY2F0aW9uID0gMTsKKwlpZiAob3B0aW9ucy0+Y2hhbGxlbmdlX3Jlc3BvbnNlX2F1dGhlbnRpY2F0aW9uID09IC0xKQorCQlvcHRpb25zLT5jaGFsbGVuZ2VfcmVzcG9uc2VfYXV0aGVudGljYXRpb24gPSAxOworCWlmIChvcHRpb25zLT5nc3NfYXV0aGVudGljYXRpb24gPT0gLTEpCisJCW9wdGlvbnMtPmdzc19hdXRoZW50aWNhdGlvbiA9IDA7CisJaWYgKG9wdGlvbnMtPmdzc19kZWxlZ19jcmVkcyA9PSAtMSkKKwkJb3B0aW9ucy0+Z3NzX2RlbGVnX2NyZWRzID0gMDsKKwlpZiAob3B0aW9ucy0+cGFzc3dvcmRfYXV0aGVudGljYXRpb24gPT0gLTEpCisJCW9wdGlvbnMtPnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uID0gMTsKKwlpZiAob3B0aW9ucy0+a2JkX2ludGVyYWN0aXZlX2F1dGhlbnRpY2F0aW9uID09IC0xKQorCQlvcHRpb25zLT5rYmRfaW50ZXJhY3RpdmVfYXV0aGVudGljYXRpb24gPSAxOworCWlmIChvcHRpb25zLT5yaG9zdHNfcnNhX2F1dGhlbnRpY2F0aW9uID09IC0xKQorCQlvcHRpb25zLT5yaG9zdHNfcnNhX2F1dGhlbnRpY2F0aW9uID0gMDsKKwlpZiAob3B0aW9ucy0+aG9zdGJhc2VkX2F1dGhlbnRpY2F0aW9uID09IC0xKQorCQlvcHRpb25zLT5ob3N0YmFzZWRfYXV0aGVudGljYXRpb24gPSAwOworCWlmIChvcHRpb25zLT5iYXRjaF9tb2RlID09IC0xKQorCQlvcHRpb25zLT5iYXRjaF9tb2RlID0gMDsKKwlpZiAob3B0aW9ucy0+Y2hlY2tfaG9zdF9pcCA9PSAtMSkKKwkJb3B0aW9ucy0+Y2hlY2tfaG9zdF9pcCA9IDE7CisJaWYgKG9wdGlvbnMtPnN0cmljdF9ob3N0X2tleV9jaGVja2luZyA9PSAtMSkKKwkJb3B0aW9ucy0+c3RyaWN0X2hvc3Rfa2V5X2NoZWNraW5nID0gMjsJLyogMiBpcyBkZWZhdWx0ICovCisJaWYgKG9wdGlvbnMtPmNvbXByZXNzaW9uID09IC0xKQorCQlvcHRpb25zLT5jb21wcmVzc2lvbiA9IDA7CisJaWYgKG9wdGlvbnMtPnRjcF9rZWVwX2FsaXZlID09IC0xKQorCQlvcHRpb25zLT50Y3Bfa2VlcF9hbGl2ZSA9IDE7CisJaWYgKG9wdGlvbnMtPmNvbXByZXNzaW9uX2xldmVsID09IC0xKQorCQlvcHRpb25zLT5jb21wcmVzc2lvbl9sZXZlbCA9IDY7CisJaWYgKG9wdGlvbnMtPnBvcnQgPT0gLTEpCisJCW9wdGlvbnMtPnBvcnQgPSAwOwkvKiBGaWxsZWQgaW4gc3NoX2Nvbm5lY3QuICovCisJaWYgKG9wdGlvbnMtPmFkZHJlc3NfZmFtaWx5ID09IC0xKQorCQlvcHRpb25zLT5hZGRyZXNzX2ZhbWlseSA9IEFGX1VOU1BFQzsKKwlpZiAob3B0aW9ucy0+Y29ubmVjdGlvbl9hdHRlbXB0cyA9PSAtMSkKKwkJb3B0aW9ucy0+Y29ubmVjdGlvbl9hdHRlbXB0cyA9IDE7CisJaWYgKG9wdGlvbnMtPm51bWJlcl9vZl9wYXNzd29yZF9wcm9tcHRzID09IC0xKQorCQlvcHRpb25zLT5udW1iZXJfb2ZfcGFzc3dvcmRfcHJvbXB0cyA9IDM7CisJLyogU2VsZWN0ZWQgaW4gc3NoX2xvZ2luKCkuICovCisJaWYgKG9wdGlvbnMtPmNpcGhlciA9PSAtMSkKKwkJb3B0aW9ucy0+Y2lwaGVyID0gU1NIX0NJUEhFUl9OT1RfU0VUOworCS8qIG9wdGlvbnMtPmNpcGhlcnMsIGRlZmF1bHQgc2V0IGluIG15cHJvcG9zYWxzLmggKi8KKwkvKiBvcHRpb25zLT5tYWNzLCBkZWZhdWx0IHNldCBpbiBteXByb3Bvc2Fscy5oICovCisJLyogb3B0aW9ucy0+a2V4X2FsZ29yaXRobXMsIGRlZmF1bHQgc2V0IGluIG15cHJvcG9zYWxzLmggKi8KKwkvKiBvcHRpb25zLT5ob3N0a2V5YWxnb3JpdGhtcywgZGVmYXVsdCBzZXQgaW4gbXlwcm9wb3NhbHMuaCAqLworCWlmIChvcHRpb25zLT5wcm90b2NvbCA9PSBTU0hfUFJPVE9fVU5LTk9XTikKKwkJb3B0aW9ucy0+cHJvdG9jb2wgPSBTU0hfUFJPVE9fMjsKKwlpZiAob3B0aW9ucy0+bnVtX2lkZW50aXR5X2ZpbGVzID09IDApIHsKKwkJaWYgKG9wdGlvbnMtPnByb3RvY29sICYgU1NIX1BST1RPXzEpIHsKKwkJCWxlbiA9IDIgKyBzdHJsZW4oX1BBVEhfU1NIX0NMSUVOVF9JREVOVElUWSkgKyAxOworCQkJb3B0aW9ucy0+aWRlbnRpdHlfZmlsZXNbb3B0aW9ucy0+bnVtX2lkZW50aXR5X2ZpbGVzXSA9CisJCQkgICAgeG1hbGxvYyhsZW4pOworCQkJc25wcmludGYob3B0aW9ucy0+aWRlbnRpdHlfZmlsZXNbb3B0aW9ucy0+bnVtX2lkZW50aXR5X2ZpbGVzKytdLAorCQkJICAgIGxlbiwgIn4vJS4xMDBzIiwgX1BBVEhfU1NIX0NMSUVOVF9JREVOVElUWSk7CisJCX0KKwkJaWYgKG9wdGlvbnMtPnByb3RvY29sICYgU1NIX1BST1RPXzIpIHsKKwkJCWxlbiA9IDIgKyBzdHJsZW4oX1BBVEhfU1NIX0NMSUVOVF9JRF9SU0EpICsgMTsKKwkJCW9wdGlvbnMtPmlkZW50aXR5X2ZpbGVzW29wdGlvbnMtPm51bV9pZGVudGl0eV9maWxlc10gPQorCQkJICAgIHhtYWxsb2MobGVuKTsKKwkJCXNucHJpbnRmKG9wdGlvbnMtPmlkZW50aXR5X2ZpbGVzW29wdGlvbnMtPm51bV9pZGVudGl0eV9maWxlcysrXSwKKwkJCSAgICBsZW4sICJ+LyUuMTAwcyIsIF9QQVRIX1NTSF9DTElFTlRfSURfUlNBKTsKKworCQkJbGVuID0gMiArIHN0cmxlbihfUEFUSF9TU0hfQ0xJRU5UX0lEX0RTQSkgKyAxOworCQkJb3B0aW9ucy0+aWRlbnRpdHlfZmlsZXNbb3B0aW9ucy0+bnVtX2lkZW50aXR5X2ZpbGVzXSA9CisJCQkgICAgeG1hbGxvYyhsZW4pOworCQkJc25wcmludGYob3B0aW9ucy0+aWRlbnRpdHlfZmlsZXNbb3B0aW9ucy0+bnVtX2lkZW50aXR5X2ZpbGVzKytdLAorCQkJICAgIGxlbiwgIn4vJS4xMDBzIiwgX1BBVEhfU1NIX0NMSUVOVF9JRF9EU0EpOworI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworCQkJbGVuID0gMiArIHN0cmxlbihfUEFUSF9TU0hfQ0xJRU5UX0lEX0VDRFNBKSArIDE7CisJCQlvcHRpb25zLT5pZGVudGl0eV9maWxlc1tvcHRpb25zLT5udW1faWRlbnRpdHlfZmlsZXNdID0KKwkJCSAgICB4bWFsbG9jKGxlbik7CisJCQlzbnByaW50ZihvcHRpb25zLT5pZGVudGl0eV9maWxlc1tvcHRpb25zLT5udW1faWRlbnRpdHlfZmlsZXMrK10sCisJCQkgICAgbGVuLCAifi8lLjEwMHMiLCBfUEFUSF9TU0hfQ0xJRU5UX0lEX0VDRFNBKTsKKyNlbmRpZgorCQl9CisJfQorCWlmIChvcHRpb25zLT5lc2NhcGVfY2hhciA9PSAtMSkKKwkJb3B0aW9ucy0+ZXNjYXBlX2NoYXIgPSAnfic7CisJaWYgKG9wdGlvbnMtPm51bV9zeXN0ZW1faG9zdGZpbGVzID09IDApIHsKKwkJb3B0aW9ucy0+c3lzdGVtX2hvc3RmaWxlc1tvcHRpb25zLT5udW1fc3lzdGVtX2hvc3RmaWxlcysrXSA9CisJCSAgICB4c3RyZHVwKF9QQVRIX1NTSF9TWVNURU1fSE9TVEZJTEUpOworCQlvcHRpb25zLT5zeXN0ZW1faG9zdGZpbGVzW29wdGlvbnMtPm51bV9zeXN0ZW1faG9zdGZpbGVzKytdID0KKwkJICAgIHhzdHJkdXAoX1BBVEhfU1NIX1NZU1RFTV9IT1NURklMRTIpOworCX0KKwlpZiAob3B0aW9ucy0+bnVtX3VzZXJfaG9zdGZpbGVzID09IDApIHsKKwkJb3B0aW9ucy0+dXNlcl9ob3N0ZmlsZXNbb3B0aW9ucy0+bnVtX3VzZXJfaG9zdGZpbGVzKytdID0KKwkJICAgIHhzdHJkdXAoX1BBVEhfU1NIX1VTRVJfSE9TVEZJTEUpOworCQlvcHRpb25zLT51c2VyX2hvc3RmaWxlc1tvcHRpb25zLT5udW1fdXNlcl9ob3N0ZmlsZXMrK10gPQorCQkgICAgeHN0cmR1cChfUEFUSF9TU0hfVVNFUl9IT1NURklMRTIpOworCX0KKwlpZiAob3B0aW9ucy0+bG9nX2xldmVsID09IFNZU0xPR19MRVZFTF9OT1RfU0VUKQorCQlvcHRpb25zLT5sb2dfbGV2ZWwgPSBTWVNMT0dfTEVWRUxfSU5GTzsKKwlpZiAob3B0aW9ucy0+Y2xlYXJfZm9yd2FyZGluZ3MgPT0gMSkKKwkJY2xlYXJfZm9yd2FyZGluZ3Mob3B0aW9ucyk7CisJaWYgKG9wdGlvbnMtPm5vX2hvc3RfYXV0aGVudGljYXRpb25fZm9yX2xvY2FsaG9zdCA9PSAtIDEpCisJCW9wdGlvbnMtPm5vX2hvc3RfYXV0aGVudGljYXRpb25fZm9yX2xvY2FsaG9zdCA9IDA7CisJaWYgKG9wdGlvbnMtPmlkZW50aXRpZXNfb25seSA9PSAtMSkKKwkJb3B0aW9ucy0+aWRlbnRpdGllc19vbmx5ID0gMDsKKwlpZiAob3B0aW9ucy0+ZW5hYmxlX3NzaF9rZXlzaWduID09IC0xKQorCQlvcHRpb25zLT5lbmFibGVfc3NoX2tleXNpZ24gPSAwOworCWlmIChvcHRpb25zLT5yZWtleV9saW1pdCA9PSAtMSkKKwkJb3B0aW9ucy0+cmVrZXlfbGltaXQgPSAwOworCWlmIChvcHRpb25zLT52ZXJpZnlfaG9zdF9rZXlfZG5zID09IC0xKQorCQlvcHRpb25zLT52ZXJpZnlfaG9zdF9rZXlfZG5zID0gMDsKKwlpZiAob3B0aW9ucy0+c2VydmVyX2FsaXZlX2ludGVydmFsID09IC0xKQorCQlvcHRpb25zLT5zZXJ2ZXJfYWxpdmVfaW50ZXJ2YWwgPSAwOworCWlmIChvcHRpb25zLT5zZXJ2ZXJfYWxpdmVfY291bnRfbWF4ID09IC0xKQorCQlvcHRpb25zLT5zZXJ2ZXJfYWxpdmVfY291bnRfbWF4ID0gMzsKKwlpZiAob3B0aW9ucy0+Y29udHJvbF9tYXN0ZXIgPT0gLTEpCisJCW9wdGlvbnMtPmNvbnRyb2xfbWFzdGVyID0gMDsKKwlpZiAob3B0aW9ucy0+Y29udHJvbF9wZXJzaXN0ID09IC0xKSB7CisJCW9wdGlvbnMtPmNvbnRyb2xfcGVyc2lzdCA9IDA7CisJCW9wdGlvbnMtPmNvbnRyb2xfcGVyc2lzdF90aW1lb3V0ID0gMDsKKwl9CisJaWYgKG9wdGlvbnMtPmhhc2hfa25vd25faG9zdHMgPT0gLTEpCisJCW9wdGlvbnMtPmhhc2hfa25vd25faG9zdHMgPSAwOworCWlmIChvcHRpb25zLT50dW5fb3BlbiA9PSAtMSkKKwkJb3B0aW9ucy0+dHVuX29wZW4gPSBTU0hfVFVOTU9ERV9OTzsKKwlpZiAob3B0aW9ucy0+dHVuX2xvY2FsID09IC0xKQorCQlvcHRpb25zLT50dW5fbG9jYWwgPSBTU0hfVFVOSURfQU5ZOworCWlmIChvcHRpb25zLT50dW5fcmVtb3RlID09IC0xKQorCQlvcHRpb25zLT50dW5fcmVtb3RlID0gU1NIX1RVTklEX0FOWTsKKwlpZiAob3B0aW9ucy0+cGVybWl0X2xvY2FsX2NvbW1hbmQgPT0gLTEpCisJCW9wdGlvbnMtPnBlcm1pdF9sb2NhbF9jb21tYW5kID0gMDsKKwlpZiAob3B0aW9ucy0+dXNlX3JvYW1pbmcgPT0gLTEpCisJCW9wdGlvbnMtPnVzZV9yb2FtaW5nID0gMTsKKwlpZiAob3B0aW9ucy0+dmlzdWFsX2hvc3Rfa2V5ID09IC0xKQorCQlvcHRpb25zLT52aXN1YWxfaG9zdF9rZXkgPSAwOworCWlmIChvcHRpb25zLT56ZXJvX2tub3dsZWRnZV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbiA9PSAtMSkKKwkJb3B0aW9ucy0+emVyb19rbm93bGVkZ2VfcGFzc3dvcmRfYXV0aGVudGljYXRpb24gPSAwOworCWlmIChvcHRpb25zLT5pcF9xb3NfaW50ZXJhY3RpdmUgPT0gLTEpCisJCW9wdGlvbnMtPmlwX3Fvc19pbnRlcmFjdGl2ZSA9IElQVE9TX0xPV0RFTEFZOworCWlmIChvcHRpb25zLT5pcF9xb3NfYnVsayA9PSAtMSkKKwkJb3B0aW9ucy0+aXBfcW9zX2J1bGsgPSBJUFRPU19USFJPVUdIUFVUOworCWlmIChvcHRpb25zLT5yZXF1ZXN0X3R0eSA9PSAtMSkKKwkJb3B0aW9ucy0+cmVxdWVzdF90dHkgPSBSRVFVRVNUX1RUWV9BVVRPOworCS8qIG9wdGlvbnMtPmxvY2FsX2NvbW1hbmQgc2hvdWxkIG5vdCBiZSBzZXQgYnkgZGVmYXVsdCAqLworCS8qIG9wdGlvbnMtPnByb3h5X2NvbW1hbmQgc2hvdWxkIG5vdCBiZSBzZXQgYnkgZGVmYXVsdCAqLworCS8qIG9wdGlvbnMtPnVzZXIgd2lsbCBiZSBzZXQgaW4gdGhlIG1haW4gcHJvZ3JhbSBpZiBhcHByb3ByaWF0ZSAqLworCS8qIG9wdGlvbnMtPmhvc3RuYW1lIHdpbGwgYmUgc2V0IGluIHRoZSBtYWluIHByb2dyYW0gaWYgYXBwcm9wcmlhdGUgKi8KKwkvKiBvcHRpb25zLT5ob3N0X2tleV9hbGlhcyBzaG91bGQgbm90IGJlIHNldCBieSBkZWZhdWx0ICovCisJLyogb3B0aW9ucy0+cHJlZmVycmVkX2F1dGhlbnRpY2F0aW9ucyB3aWxsIGJlIHNldCBpbiBzc2ggKi8KK30KKworLyoKKyAqIHBhcnNlX2ZvcndhcmQKKyAqIHBhcnNlcyBhIHN0cmluZyBjb250YWluaW5nIGEgcG9ydCBmb3J3YXJkaW5nIHNwZWNpZmljYXRpb24gb2YgdGhlIGZvcm06CisgKiAgIGR5bmFtaWNmd2QgPT0gMAorICoJW2xpc3Rlbmhvc3Q6XWxpc3RlbnBvcnQ6Y29ubmVjdGhvc3Q6Y29ubmVjdHBvcnQKKyAqICAgZHluYW1pY2Z3ZCA9PSAxCisgKglbbGlzdGVuaG9zdDpdbGlzdGVucG9ydAorICogcmV0dXJucyBudW1iZXIgb2YgYXJndW1lbnRzIHBhcnNlZCBvciB6ZXJvIG9uIGVycm9yCisgKi8KK2ludAorcGFyc2VfZm9yd2FyZChGb3J3YXJkICpmd2QsIGNvbnN0IGNoYXIgKmZ3ZHNwZWMsIGludCBkeW5hbWljZndkLCBpbnQgcmVtb3RlZndkKQoreworCWludCBpOworCWNoYXIgKnAsICpjcCwgKmZ3ZGFyZ1s0XTsKKworCW1lbXNldChmd2QsICdcMCcsIHNpemVvZigqZndkKSk7CisKKwljcCA9IHAgPSB4c3RyZHVwKGZ3ZHNwZWMpOworCisJLyogc2tpcCBsZWFkaW5nIHNwYWNlcyAqLworCXdoaWxlIChpc3NwYWNlKCpjcCkpCisJCWNwKys7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKQorCQlpZiAoKGZ3ZGFyZ1tpXSA9IGhwZGVsaW0oJmNwKSkgPT0gTlVMTCkKKwkJCWJyZWFrOworCisJLyogQ2hlY2sgZm9yIHRyYWlsaW5nIGdhcmJhZ2UgKi8KKwlpZiAoY3AgIT0gTlVMTCkKKwkJaSA9IDA7CS8qIGZhaWx1cmUgKi8KKworCXN3aXRjaCAoaSkgeworCWNhc2UgMToKKwkJZndkLT5saXN0ZW5faG9zdCA9IE5VTEw7CisJCWZ3ZC0+bGlzdGVuX3BvcnQgPSBhMnBvcnQoZndkYXJnWzBdKTsKKwkJZndkLT5jb25uZWN0X2hvc3QgPSB4c3RyZHVwKCJzb2NrcyIpOworCQlicmVhazsKKworCWNhc2UgMjoKKwkJZndkLT5saXN0ZW5faG9zdCA9IHhzdHJkdXAoY2xlYW5ob3N0bmFtZShmd2RhcmdbMF0pKTsKKwkJZndkLT5saXN0ZW5fcG9ydCA9IGEycG9ydChmd2RhcmdbMV0pOworCQlmd2QtPmNvbm5lY3RfaG9zdCA9IHhzdHJkdXAoInNvY2tzIik7CisJCWJyZWFrOworCisJY2FzZSAzOgorCQlmd2QtPmxpc3Rlbl9ob3N0ID0gTlVMTDsKKwkJZndkLT5saXN0ZW5fcG9ydCA9IGEycG9ydChmd2RhcmdbMF0pOworCQlmd2QtPmNvbm5lY3RfaG9zdCA9IHhzdHJkdXAoY2xlYW5ob3N0bmFtZShmd2RhcmdbMV0pKTsKKwkJZndkLT5jb25uZWN0X3BvcnQgPSBhMnBvcnQoZndkYXJnWzJdKTsKKwkJYnJlYWs7CisKKwljYXNlIDQ6CisJCWZ3ZC0+bGlzdGVuX2hvc3QgPSB4c3RyZHVwKGNsZWFuaG9zdG5hbWUoZndkYXJnWzBdKSk7CisJCWZ3ZC0+bGlzdGVuX3BvcnQgPSBhMnBvcnQoZndkYXJnWzFdKTsKKwkJZndkLT5jb25uZWN0X2hvc3QgPSB4c3RyZHVwKGNsZWFuaG9zdG5hbWUoZndkYXJnWzJdKSk7CisJCWZ3ZC0+Y29ubmVjdF9wb3J0ID0gYTJwb3J0KGZ3ZGFyZ1szXSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWkgPSAwOyAvKiBmYWlsdXJlICovCisJfQorCisJeGZyZWUocCk7CisKKwlpZiAoZHluYW1pY2Z3ZCkgeworCQlpZiAoIShpID09IDEgfHwgaSA9PSAyKSkKKwkJCWdvdG8gZmFpbF9mcmVlOworCX0gZWxzZSB7CisJCWlmICghKGkgPT0gMyB8fCBpID09IDQpKQorCQkJZ290byBmYWlsX2ZyZWU7CisJCWlmIChmd2QtPmNvbm5lY3RfcG9ydCA8PSAwKQorCQkJZ290byBmYWlsX2ZyZWU7CisJfQorCisJaWYgKGZ3ZC0+bGlzdGVuX3BvcnQgPCAwIHx8ICghcmVtb3RlZndkICYmIGZ3ZC0+bGlzdGVuX3BvcnQgPT0gMCkpCisJCWdvdG8gZmFpbF9mcmVlOworCisJaWYgKGZ3ZC0+Y29ubmVjdF9ob3N0ICE9IE5VTEwgJiYKKwkgICAgc3RybGVuKGZ3ZC0+Y29ubmVjdF9ob3N0KSA+PSBOSV9NQVhIT1NUKQorCQlnb3RvIGZhaWxfZnJlZTsKKwlpZiAoZndkLT5saXN0ZW5faG9zdCAhPSBOVUxMICYmCisJICAgIHN0cmxlbihmd2QtPmxpc3Rlbl9ob3N0KSA+PSBOSV9NQVhIT1NUKQorCQlnb3RvIGZhaWxfZnJlZTsKKworCisJcmV0dXJuIChpKTsKKworIGZhaWxfZnJlZToKKwlpZiAoZndkLT5jb25uZWN0X2hvc3QgIT0gTlVMTCkgeworCQl4ZnJlZShmd2QtPmNvbm5lY3RfaG9zdCk7CisJCWZ3ZC0+Y29ubmVjdF9ob3N0ID0gTlVMTDsKKwl9CisJaWYgKGZ3ZC0+bGlzdGVuX2hvc3QgIT0gTlVMTCkgeworCQl4ZnJlZShmd2QtPmxpc3Rlbl9ob3N0KTsKKwkJZndkLT5saXN0ZW5faG9zdCA9IE5VTEw7CisJfQorCXJldHVybiAoMCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlYWRjb25mLmggYi9vcGVuc3NoLTYuMHAxL3JlYWRjb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUzMGVlMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVhZGNvbmYuaApAQCAtMCwwICsxLDE2MiBAQAorLyogJE9wZW5CU0Q6IHJlYWRjb25mLmgsdiAxLjkxIDIwMTEvMDkvMjMgMDc6NDU6MDUgbWFya3VzIEV4cCAkICovCisKKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiBGdW5jdGlvbnMgZm9yIHJlYWRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICovCisKKyNpZm5kZWYgUkVBRENPTkZfSAorI2RlZmluZSBSRUFEQ09ORl9ICisKKy8qIERhdGEgc3RydWN0dXJlIGZvciByZXByZXNlbnRpbmcgYSBmb3J3YXJkaW5nIHJlcXVlc3QuICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyCSAqbGlzdGVuX2hvc3Q7CQkvKiBIb3N0IChhZGRyZXNzKSB0byBsaXN0ZW4gb24uICovCisJaW50CSAgbGlzdGVuX3BvcnQ7CQkvKiBQb3J0IHRvIGZvcndhcmQuICovCisJY2hhcgkgKmNvbm5lY3RfaG9zdDsJCS8qIEhvc3QgdG8gY29ubmVjdC4gKi8KKwlpbnQJICBjb25uZWN0X3BvcnQ7CQkvKiBQb3J0IHRvIGNvbm5lY3Qgb24gY29ubmVjdF9ob3N0LiAqLworCWludAkgIGFsbG9jYXRlZF9wb3J0OwkvKiBEeW5hbWljYWxseSBhbGxvY2F0ZWQgbGlzdGVuIHBvcnQgKi8KKwlpbnQJICBoYW5kbGU7CQkvKiBIYW5kbGUgZm9yIGR5bmFtaWMgbGlzdGVuIHBvcnRzICovCit9ICAgICAgIEZvcndhcmQ7CisvKiBEYXRhIHN0cnVjdHVyZSBmb3IgcmVwcmVzZW50aW5nIG9wdGlvbiBkYXRhLiAqLworCisjZGVmaW5lIE1BWF9TRU5EX0VOVgkJMjU2CisjZGVmaW5lIFNTSF9NQVhfSE9TVFNfRklMRVMJMjU2CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgICAgIGZvcndhcmRfYWdlbnQ7CS8qIEZvcndhcmQgYXV0aGVudGljYXRpb24gYWdlbnQuICovCisJaW50ICAgICBmb3J3YXJkX3gxMTsJLyogRm9yd2FyZCBYMTEgZGlzcGxheS4gKi8KKwlpbnQgICAgIGZvcndhcmRfeDExX3RpbWVvdXQ7CS8qIEV4cGlyYXRpb24gZm9yIENvb2tpZXMgKi8KKwlpbnQgICAgIGZvcndhcmRfeDExX3RydXN0ZWQ7CS8qIFRydXN0IEZvcndhcmQgWDExIGRpc3BsYXkuICovCisJaW50ICAgICBleGl0X29uX2ZvcndhcmRfZmFpbHVyZTsJLyogRXhpdCBpZiBiaW5kKDIpIGZhaWxzIGZvciAtTC8tUiAqLworCWNoYXIgICAqeGF1dGhfbG9jYXRpb247CS8qIExvY2F0aW9uIGZvciB4YXV0aCBwcm9ncmFtICovCisJaW50ICAgICBnYXRld2F5X3BvcnRzOwkvKiBBbGxvdyByZW1vdGUgY29ubmVjdHMgdG8gZm9yd2FyZGVkIHBvcnRzLiAqLworCWludCAgICAgdXNlX3ByaXZpbGVnZWRfcG9ydDsJLyogRG9uJ3QgdXNlIHByaXZpbGVnZWQgcG9ydCBpZiBmYWxzZS4gKi8KKwlpbnQgICAgIHJob3N0c19yc2FfYXV0aGVudGljYXRpb247CS8qIFRyeSByaG9zdHMgd2l0aCBSU0EKKwkJCQkJCSAqIGF1dGhlbnRpY2F0aW9uLiAqLworCWludCAgICAgcnNhX2F1dGhlbnRpY2F0aW9uOwkvKiBUcnkgUlNBIGF1dGhlbnRpY2F0aW9uLiAqLworCWludCAgICAgcHVia2V5X2F1dGhlbnRpY2F0aW9uOwkvKiBUcnkgc3NoMiBwdWJrZXkgYXV0aGVudGljYXRpb24uICovCisJaW50ICAgICBob3N0YmFzZWRfYXV0aGVudGljYXRpb247CS8qIHNzaDIncyByaG9zdHNfcnNhICovCisJaW50ICAgICBjaGFsbGVuZ2VfcmVzcG9uc2VfYXV0aGVudGljYXRpb247CisJCQkJCS8qIFRyeSBTL0tleSBvciBUSVMsIGF1dGhlbnRpY2F0aW9uLiAqLworCWludCAgICAgZ3NzX2F1dGhlbnRpY2F0aW9uOwkvKiBUcnkgR1NTIGF1dGhlbnRpY2F0aW9uICovCisJaW50ICAgICBnc3NfZGVsZWdfY3JlZHM7CS8qIERlbGVnYXRlIEdTUyBjcmVkZW50aWFscyAqLworCWludCAgICAgcGFzc3dvcmRfYXV0aGVudGljYXRpb247CS8qIFRyeSBwYXNzd29yZAorCQkJCQkJICogYXV0aGVudGljYXRpb24uICovCisJaW50ICAgICBrYmRfaW50ZXJhY3RpdmVfYXV0aGVudGljYXRpb247IC8qIFRyeSBrZXlib2FyZC1pbnRlcmFjdGl2ZSBhdXRoLiAqLworCWNoYXIJKmtiZF9pbnRlcmFjdGl2ZV9kZXZpY2VzOyAvKiBLZXlib2FyZC1pbnRlcmFjdGl2ZSBhdXRoIGRldmljZXMuICovCisJaW50ICAgICB6ZXJvX2tub3dsZWRnZV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbjsJLyogVHJ5IGpwYWtlICovCisJaW50ICAgICBiYXRjaF9tb2RlOwkvKiBCYXRjaCBtb2RlOiBkbyBub3QgYXNrIGZvciBwYXNzd29yZHMuICovCisJaW50ICAgICBjaGVja19ob3N0X2lwOwkvKiBBbHNvIGtlZXAgdHJhY2sgb2Yga2V5cyBmb3IgSVAgYWRkcmVzcyAqLworCWludCAgICAgc3RyaWN0X2hvc3Rfa2V5X2NoZWNraW5nOwkvKiBTdHJpY3QgaG9zdCBrZXkgY2hlY2tpbmcuICovCisJaW50ICAgICBjb21wcmVzc2lvbjsJLyogQ29tcHJlc3MgcGFja2V0cyBpbiBib3RoIGRpcmVjdGlvbnMuICovCisJaW50ICAgICBjb21wcmVzc2lvbl9sZXZlbDsJLyogQ29tcHJlc3Npb24gbGV2ZWwgMSAoZmFzdCkgdG8gOQorCQkJCQkgKiAoYmVzdCkuICovCisJaW50ICAgICB0Y3Bfa2VlcF9hbGl2ZTsJLyogU2V0IFNPX0tFRVBBTElWRS4gKi8KKwlpbnQJaXBfcW9zX2ludGVyYWN0aXZlOwkvKiBJUCBUb1MvRFNDUC9jbGFzcyBmb3IgaW50ZXJhY3RpdmUgKi8KKwlpbnQJaXBfcW9zX2J1bGs7CQkvKiBJUCBUb1MvRFNDUC9jbGFzcyBmb3IgYnVsayB0cmFmZmljICovCisJTG9nTGV2ZWwgbG9nX2xldmVsOwkvKiBMZXZlbCBmb3IgbG9nZ2luZy4gKi8KKworCWludCAgICAgcG9ydDsJCS8qIFBvcnQgdG8gY29ubmVjdC4gKi8KKwlpbnQgICAgIGFkZHJlc3NfZmFtaWx5OworCWludCAgICAgY29ubmVjdGlvbl9hdHRlbXB0czsJLyogTWF4IGF0dGVtcHRzIChzZWNvbmRzKSBiZWZvcmUKKwkJCQkJICogZ2l2aW5nIHVwICovCisJaW50ICAgICBjb25uZWN0aW9uX3RpbWVvdXQ7CS8qIE1heCB0aW1lIChzZWNvbmRzKSBiZWZvcmUKKwkJCQkJICogYWJvcnRpbmcgY29ubmVjdGlvbiBhdHRlbXB0ICovCisJaW50ICAgICBudW1iZXJfb2ZfcGFzc3dvcmRfcHJvbXB0czsJLyogTWF4IG51bWJlciBvZiBwYXNzd29yZAorCQkJCQkJICogcHJvbXB0cy4gKi8KKwlpbnQgICAgIGNpcGhlcjsJCS8qIENpcGhlciB0byB1c2UuICovCisJY2hhciAgICpjaXBoZXJzOwkvKiBTU0gyIGNpcGhlcnMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4gKi8KKwljaGFyICAgKm1hY3M7CQkvKiBTU0gyIG1hY3MgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4gKi8KKwljaGFyICAgKmhvc3RrZXlhbGdvcml0aG1zOwkvKiBTU0gyIHNlcnZlciBrZXkgdHlwZXMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4gKi8KKwljaGFyICAgKmtleF9hbGdvcml0aG1zOwkvKiBTU0gyIGtleCBtZXRob2RzIGluIG9yZGVyIG9mIHByZWZlcmVuY2UuICovCisJaW50CXByb3RvY29sOwkvKiBQcm90b2NvbCBpbiBvcmRlciBvZiBwcmVmZXJlbmNlLiAqLworCWNoYXIgICAqaG9zdG5hbWU7CS8qIFJlYWwgaG9zdCB0byBjb25uZWN0LiAqLworCWNoYXIgICAqaG9zdF9rZXlfYWxpYXM7CS8qIGhvc3RuYW1lIGFsaWFzIGZvciAuc3NoL2tub3duX2hvc3RzICovCisJY2hhciAgICpwcm94eV9jb21tYW5kOwkvKiBQcm94eSBjb21tYW5kIGZvciBjb25uZWN0aW5nIHRoZSBob3N0LiAqLworCWNoYXIgICAqdXNlcjsJCS8qIFVzZXIgdG8gbG9nIGluIGFzLiAqLworCWludCAgICAgZXNjYXBlX2NoYXI7CS8qIEVzY2FwZSBjaGFyYWN0ZXI7IC0yID0gbm9uZSAqLworCisJdV9pbnQJbnVtX3N5c3RlbV9ob3N0ZmlsZXM7CS8qIFBhdGhzIGZvciAvZXRjL3NzaC9zc2hfa25vd25faG9zdHMgKi8KKwljaGFyICAgKnN5c3RlbV9ob3N0ZmlsZXNbU1NIX01BWF9IT1NUU19GSUxFU107CisJdV9pbnQJbnVtX3VzZXJfaG9zdGZpbGVzOwkvKiBQYXRoIGZvciAkSE9NRS8uc3NoL2tub3duX2hvc3RzICovCisJY2hhciAgICp1c2VyX2hvc3RmaWxlc1tTU0hfTUFYX0hPU1RTX0ZJTEVTXTsKKwljaGFyICAgKnByZWZlcnJlZF9hdXRoZW50aWNhdGlvbnM7CisJY2hhciAgICpiaW5kX2FkZHJlc3M7CS8qIGxvY2FsIHNvY2tldCBhZGRyZXNzIGZvciBjb25uZWN0aW9uIHRvIHNzaGQgKi8KKwljaGFyICAgKnBrY3MxMV9wcm92aWRlcjsgLyogUEtDUyMxMSBwcm92aWRlciAqLworCWludAl2ZXJpZnlfaG9zdF9rZXlfZG5zOwkvKiBWZXJpZnkgaG9zdCBrZXkgdXNpbmcgRE5TICovCisKKwlpbnQgICAgIG51bV9pZGVudGl0eV9maWxlczsJLyogTnVtYmVyIG9mIGZpbGVzIGZvciBSU0EvRFNBIGlkZW50aXRpZXMuICovCisJY2hhciAgICppZGVudGl0eV9maWxlc1tTU0hfTUFYX0lERU5USVRZX0ZJTEVTXTsKKwlLZXkgICAgKmlkZW50aXR5X2tleXNbU1NIX01BWF9JREVOVElUWV9GSUxFU107CisKKwkvKiBMb2NhbCBUQ1AvSVAgZm9yd2FyZCByZXF1ZXN0cy4gKi8KKwlpbnQgICAgIG51bV9sb2NhbF9mb3J3YXJkczsKKwlGb3J3YXJkICpsb2NhbF9mb3J3YXJkczsKKworCS8qIFJlbW90ZSBUQ1AvSVAgZm9yd2FyZCByZXF1ZXN0cy4gKi8KKwlpbnQgICAgIG51bV9yZW1vdGVfZm9yd2FyZHM7CisJRm9yd2FyZCAqcmVtb3RlX2ZvcndhcmRzOworCWludAljbGVhcl9mb3J3YXJkaW5nczsKKworCWludAllbmFibGVfc3NoX2tleXNpZ247CisJaW50NjRfdCByZWtleV9saW1pdDsKKwlpbnQJbm9faG9zdF9hdXRoZW50aWNhdGlvbl9mb3JfbG9jYWxob3N0OworCWludAlpZGVudGl0aWVzX29ubHk7CisJaW50CXNlcnZlcl9hbGl2ZV9pbnRlcnZhbDsKKwlpbnQJc2VydmVyX2FsaXZlX2NvdW50X21heDsKKworCWludCAgICAgbnVtX3NlbmRfZW52OworCWNoYXIgICAqc2VuZF9lbnZbTUFYX1NFTkRfRU5WXTsKKworCWNoYXIJKmNvbnRyb2xfcGF0aDsKKwlpbnQJY29udHJvbF9tYXN0ZXI7CisJaW50ICAgICBjb250cm9sX3BlcnNpc3Q7IC8qIENvbnRyb2xQZXJzaXN0IGZsYWcgKi8KKwlpbnQgICAgIGNvbnRyb2xfcGVyc2lzdF90aW1lb3V0OyAvKiBDb250cm9sUGVyc2lzdCB0aW1lb3V0IChzZWNvbmRzKSAqLworCisJaW50CWhhc2hfa25vd25faG9zdHM7CisKKwlpbnQJdHVuX29wZW47CS8qIHR1big0KSAqLworCWludCAgICAgdHVuX2xvY2FsOwkvKiBmb3JjZSB0dW4gZGV2aWNlIChvcHRpb25hbCkgKi8KKwlpbnQgICAgIHR1bl9yZW1vdGU7CS8qIGZvcmNlIHR1biBkZXZpY2UgKG9wdGlvbmFsKSAqLworCisJY2hhcgkqbG9jYWxfY29tbWFuZDsKKwlpbnQJcGVybWl0X2xvY2FsX2NvbW1hbmQ7CisJaW50CXZpc3VhbF9ob3N0X2tleTsKKworCWludAl1c2Vfcm9hbWluZzsKKworCWludAlyZXF1ZXN0X3R0eTsKK30gICAgICAgT3B0aW9uczsKKworI2RlZmluZSBTU0hDVExfTUFTVEVSX05PCTAKKyNkZWZpbmUgU1NIQ1RMX01BU1RFUl9ZRVMJMQorI2RlZmluZSBTU0hDVExfTUFTVEVSX0FVVE8JMgorI2RlZmluZSBTU0hDVExfTUFTVEVSX0FTSwkzCisjZGVmaW5lIFNTSENUTF9NQVNURVJfQVVUT19BU0sJNAorCisjZGVmaW5lIFJFUVVFU1RfVFRZX0FVVE8JMAorI2RlZmluZSBSRVFVRVNUX1RUWV9OTwkJMQorI2RlZmluZSBSRVFVRVNUX1RUWV9ZRVMJCTIKKyNkZWZpbmUgUkVRVUVTVF9UVFlfRk9SQ0UJMworCit2b2lkICAgICBpbml0aWFsaXplX29wdGlvbnMoT3B0aW9ucyAqKTsKK3ZvaWQgICAgIGZpbGxfZGVmYXVsdF9vcHRpb25zKE9wdGlvbnMgKik7CitpbnQJIHJlYWRfY29uZmlnX2ZpbGUoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIE9wdGlvbnMgKiwgaW50KTsKK2ludAkgcGFyc2VfZm9yd2FyZChGb3J3YXJkICosIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpOworCitpbnQKK3Byb2Nlc3NfY29uZmlnX2xpbmUoT3B0aW9ucyAqLCBjb25zdCBjaGFyICosIGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQsIGludCAqKTsKKwordm9pZAkgYWRkX2xvY2FsX2ZvcndhcmQoT3B0aW9ucyAqLCBjb25zdCBGb3J3YXJkICopOwordm9pZAkgYWRkX3JlbW90ZV9mb3J3YXJkKE9wdGlvbnMgKiwgY29uc3QgRm9yd2FyZCAqKTsKKworI2VuZGlmCQkJCS8qIFJFQURDT05GX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVhZHBhc3MuYyBiL29wZW5zc2gtNi4wcDEvcmVhZHBhc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTljOGVmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yZWFkcGFzcy5jCkBAIC0wLDAgKzEsMTkzIEBACisvKiAkT3BlbkJTRDogcmVhZHBhc3MuYyx2IDEuNDggMjAxMC8xMi8xNSAwMDo0OToyNyBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZmRlZiBIQVZFX1BBVEhTX0gKKyMgaW5jbHVkZSA8cGF0aHMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAibWlzYy5oIgorI2luY2x1ZGUgInBhdGhuYW1lcy5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInNzaC5oIgorI2luY2x1ZGUgInVpZHN3YXAuaCIKKworc3RhdGljIGNoYXIgKgorc3NoX2Fza3Bhc3MoY2hhciAqYXNrcGFzcywgY29uc3QgY2hhciAqbXNnKQoreworCXBpZF90IHBpZCwgcmV0OworCXNpemVfdCBsZW47CisJY2hhciAqcGFzczsKKwlpbnQgcFsyXSwgc3RhdHVzOworCWNoYXIgYnVmWzEwMjRdOworCXZvaWQgKCpvc2lnY2hsZCkoaW50KTsKKworCWlmIChmZmx1c2goc3Rkb3V0KSAhPSAwKQorCQllcnJvcigic3NoX2Fza3Bhc3M6IGZmbHVzaDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCWlmIChhc2twYXNzID09IE5VTEwpCisJCWZhdGFsKCJpbnRlcm5hbCBlcnJvcjogYXNrcGFzcyB1bmRlZmluZWQiKTsKKwlpZiAocGlwZShwKSA8IDApIHsKKwkJZXJyb3IoInNzaF9hc2twYXNzOiBwaXBlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiBOVUxMOworCX0KKwlvc2lnY2hsZCA9IHNpZ25hbChTSUdDSExELCBTSUdfREZMKTsKKwlpZiAoKHBpZCA9IGZvcmsoKSkgPCAwKSB7CisJCWVycm9yKCJzc2hfYXNrcGFzczogZm9yazogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQlzaWduYWwoU0lHQ0hMRCwgb3NpZ2NobGQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHBpZCA9PSAwKSB7CisJCXBlcm1hbmVudGx5X2Ryb3Bfc3VpZChnZXR1aWQoKSk7CisJCWNsb3NlKHBbMF0pOworCQlpZiAoZHVwMihwWzFdLCBTVERPVVRfRklMRU5PKSA8IDApCisJCQlmYXRhbCgic3NoX2Fza3Bhc3M6IGR1cDI6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZXhlY2xwKGFza3Bhc3MsIGFza3Bhc3MsIG1zZywgKGNoYXIgKikgMCk7CisJCWZhdGFsKCJzc2hfYXNrcGFzczogZXhlYyglcyk6ICVzIiwgYXNrcGFzcywgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisJY2xvc2UocFsxXSk7CisKKwlsZW4gPSAwOworCWRvIHsKKwkJc3NpemVfdCByID0gcmVhZChwWzBdLCBidWYgKyBsZW4sIHNpemVvZihidWYpIC0gMSAtIGxlbik7CisKKwkJaWYgKHIgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpCisJCQljb250aW51ZTsKKwkJaWYgKHIgPD0gMCkKKwkJCWJyZWFrOworCQlsZW4gKz0gcjsKKwl9IHdoaWxlIChzaXplb2YoYnVmKSAtIDEgLSBsZW4gPiAwKTsKKwlidWZbbGVuXSA9ICdcMCc7CisKKwljbG9zZShwWzBdKTsKKwl3aGlsZSAoKHJldCA9IHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKSkgPCAwKQorCQlpZiAoZXJybm8gIT0gRUlOVFIpCisJCQlicmVhazsKKwlzaWduYWwoU0lHQ0hMRCwgb3NpZ2NobGQpOworCWlmIChyZXQgPT0gLTEgfHwgIVdJRkVYSVRFRChzdGF0dXMpIHx8IFdFWElUU1RBVFVTKHN0YXR1cykgIT0gMCkgeworCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWJ1ZltzdHJjc3BuKGJ1ZiwgIlxyXG4iKV0gPSAnXDAnOworCXBhc3MgPSB4c3RyZHVwKGJ1Zik7CisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCXJldHVybiBwYXNzOworfQorCisvKgorICogUmVhZHMgYSBwYXNzcGhyYXNlIGZyb20gL2Rldi90dHkgd2l0aCBlY2hvIHR1cm5lZCBvZmYvb24uICBSZXR1cm5zIHRoZQorICogcGFzc3BocmFzZSAoYWxsb2NhdGVkIHdpdGggeG1hbGxvYykuICBFeGl0cyBpZiBFT0YgaXMgZW5jb3VudGVyZWQuIElmCisgKiBSUF9BTExPV19TVERJTiBpcyBzZXQsIHRoZSBwYXNzcGhyYXNlIHdpbGwgYmUgcmVhZCBmcm9tIHN0ZGluIGlmIG5vCisgKiB0dHkgaXMgYXZhaWxhYmxlCisgKi8KK2NoYXIgKgorcmVhZF9wYXNzcGhyYXNlKGNvbnN0IGNoYXIgKnByb21wdCwgaW50IGZsYWdzKQoreworCWNoYXIgKmFza3Bhc3MgPSBOVUxMLCAqcmV0LCBidWZbMTAyNF07CisJaW50IHJwcGZsYWdzLCB1c2VfYXNrcGFzcyA9IDAsIHR0eWZkOworCisJcnBwZmxhZ3MgPSAoZmxhZ3MgJiBSUF9FQ0hPKSA/IFJQUF9FQ0hPX09OIDogUlBQX0VDSE9fT0ZGOworCWlmIChmbGFncyAmIFJQX1VTRV9BU0tQQVNTKQorCQl1c2VfYXNrcGFzcyA9IDE7CisJZWxzZSBpZiAoZmxhZ3MgJiBSUF9BTExPV19TVERJTikgeworCQlpZiAoIWlzYXR0eShTVERJTl9GSUxFTk8pKSB7CisJCQlkZWJ1ZygicmVhZF9wYXNzcGhyYXNlOiBzdGRpbiBpcyBub3QgYSB0dHkiKTsKKwkJCXVzZV9hc2twYXNzID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCXJwcGZsYWdzIHw9IFJQUF9SRVFVSVJFX1RUWTsKKwkJdHR5ZmQgPSBvcGVuKF9QQVRIX1RUWSwgT19SRFdSKTsKKwkJaWYgKHR0eWZkID49IDApCisJCQljbG9zZSh0dHlmZCk7CisJCWVsc2UgeworCQkJZGVidWcoInJlYWRfcGFzc3BocmFzZTogY2FuJ3Qgb3BlbiAlczogJXMiLCBfUEFUSF9UVFksCisJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXVzZV9hc2twYXNzID0gMTsKKwkJfQorCX0KKworCWlmICgoZmxhZ3MgJiBSUF9VU0VfQVNLUEFTUykgJiYgZ2V0ZW52KCJESVNQTEFZIikgPT0gTlVMTCkKKwkJcmV0dXJuIChmbGFncyAmIFJQX0FMTE9XX0VPRikgPyBOVUxMIDogeHN0cmR1cCgiIik7CisKKwlpZiAodXNlX2Fza3Bhc3MgJiYgZ2V0ZW52KCJESVNQTEFZIikpIHsKKwkJaWYgKGdldGVudihTU0hfQVNLUEFTU19FTlYpKQorCQkJYXNrcGFzcyA9IGdldGVudihTU0hfQVNLUEFTU19FTlYpOworCQllbHNlCisJCQlhc2twYXNzID0gX1BBVEhfU1NIX0FTS1BBU1NfREVGQVVMVDsKKwkJaWYgKChyZXQgPSBzc2hfYXNrcGFzcyhhc2twYXNzLCBwcm9tcHQpKSA9PSBOVUxMKQorCQkJaWYgKCEoZmxhZ3MgJiBSUF9BTExPV19FT0YpKQorCQkJCXJldHVybiB4c3RyZHVwKCIiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocmVhZHBhc3NwaHJhc2UocHJvbXB0LCBidWYsIHNpemVvZiBidWYsIHJwcGZsYWdzKSA9PSBOVUxMKSB7CisJCWlmIChmbGFncyAmIFJQX0FMTE9XX0VPRikKKwkJCXJldHVybiBOVUxMOworCQlyZXR1cm4geHN0cmR1cCgiIik7CisJfQorCisJcmV0ID0geHN0cmR1cChidWYpOworCW1lbXNldChidWYsICd4Jywgc2l6ZW9mIGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworaW50Cithc2tfcGVybWlzc2lvbihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJY2hhciAqcCwgcHJvbXB0WzEwMjRdOworCWludCBhbGxvd2VkID0gMDsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdnNucHJpbnRmKHByb21wdCwgc2l6ZW9mKHByb21wdCksIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJcCA9IHJlYWRfcGFzc3BocmFzZShwcm9tcHQsIFJQX1VTRV9BU0tQQVNTfFJQX0FMTE9XX0VPRik7CisJaWYgKHAgIT0gTlVMTCkgeworCQkvKgorCQkgKiBBY2NlcHQgZW1wdHkgcmVzcG9uc2VzIGFuZCByZXNwb25zZXMgY29uc2lzdGluZworCQkgKiBvZiB0aGUgd29yZCAieWVzIiBhcyBhZmZpcm1hdGl2ZS4KKwkJICovCisJCWlmICgqcCA9PSAnXDAnIHx8ICpwID09ICdcbicgfHwKKwkJICAgIHN0cmNhc2VjbXAocCwgInllcyIpID09IDApCisJCQlhbGxvd2VkID0gMTsKKwkJeGZyZWUocCk7CisJfQorCisJcmV0dXJuIChhbGxvd2VkKTsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy9NYWtlZmlsZSBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTE0YzI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTU2IEBACisjCSRPcGVuQlNEOiBNYWtlZmlsZSx2IDEuNTggMjAxMS8wMS8wNiAyMjo0NjoyMSBkam0gRXhwICQKKworUkVHUkVTU19UQVJHRVRTPQl0MSB0MiB0MyB0NCB0NSB0NiB0NyB0OCB0OSB0LWV4ZWMKK3Rlc3RzOgkJJChSRUdSRVNTX1RBUkdFVFMpCisKKyMgSW50ZXJvcCB0ZXN0cyBhcmUgbm90IHJ1biBieSBkZWZhdWx0CitpbnRlcm9wIGludGVyb3AtdGVzdHM6IHQtZXhlYy1pbnRlcm9wCisKK2NsZWFuOgorCWZvciBGIGluICQoQ0xFQU5GSUxFUyk7IGRvIHJtIC1mICQoT0JKKSQkRjsgZG9uZQorCXJtIC1yZiAkKE9CSikucHV0dHkKKworZGlzdGNsZWFuOgljbGVhbgorCitMVEVTVFM9IAljb25uZWN0IFwKKwkJcHJveHktY29ubmVjdCBcCisJCWNvbm5lY3QtcHJpdnNlcCBcCisJCXByb3RvLXZlcnNpb24gXAorCQlwcm90by1taXNtYXRjaCBcCisJCWV4aXQtc3RhdHVzIFwKKwkJZW52cGFzcyBcCisJCXRyYW5zZmVyIFwKKwkJYmFubmVyIFwKKwkJcmVrZXkgXAorCQlzdGRlcnItZGF0YSBcCisJCXN0ZGVyci1hZnRlci1lb2YgXAorCQlicm9rZW4tcGlwZSBcCisJCXRyeS1jaXBoZXJzIFwKKwkJeWVzLWhlYWQgXAorCQlsb2dpbi10aW1lb3V0IFwKKwkJYWdlbnQgXAorCQlhZ2VudC1nZXRwZWVyZWlkIFwKKwkJYWdlbnQtdGltZW91dCBcCisJCWFnZW50LXB0cmFjZSBcCisJCWtleXNjYW4gXAorCQlrZXlnZW4tY2hhbmdlIFwKKwkJa2V5Z2VuLWNvbnZlcnQgXAorCQlrZXktb3B0aW9ucyBcCisJCXNjcCBcCisJCXNmdHAgXAorCQlzZnRwLWNtZHMgXAorCQlzZnRwLWJhZGNtZHMgXAorCQlzZnRwLWJhdGNoIFwKKwkJc2Z0cC1nbG9iIFwKKwkJcmVjb25maWd1cmUgXAorCQlkeW5hbWljLWZvcndhcmQgXAorCQlmb3J3YXJkaW5nIFwKKwkJbXVsdGlwbGV4IFwKKwkJcmVleGVjIFwKKwkJYnJva2Vua2V5cyBcCisJCWNmZ21hdGNoIFwKKwkJYWRkcm1hdGNoIFwKKwkJbG9jYWxjb21tYW5kIFwKKwkJZm9yY2Vjb21tYW5kIFwKKwkJcG9ydG51bSBcCisJCWtleXR5cGUgXAorCQlrZXh0eXBlIFwKKwkJY2VydC1ob3N0a2V5IFwKKwkJY2VydC11c2Vya2V5IFwKKwkJaG9zdC1leHBhbmQKKworSU5URVJPUF9URVNUUz0JcHV0dHktdHJhbnNmZXIgcHV0dHktY2lwaGVycyBwdXR0eS1rZXggY29uY2gtY2lwaGVycworI0lOVEVST1BfVEVTVFMrPXNzaC1jb20gc3NoLWNvbS1jbGllbnQgc3NoLWNvbS1rZXlnZW4gc3NoLWNvbS1zZnRwCisKKyNMVEVTVFM9IAljaXBoZXItc3BlZWQKKworVVNFUiE9CQlpZCAtdW4KK0NMRUFORklMRVM9CXQyLm91dCB0My5vdXQgdDYub3V0MSB0Ni5vdXQyIHQ3Lm91dCB0Ny5vdXQucHViIGNvcHkuMSBjb3B5LjIgXAorCQl0OC5vdXQgdDgub3V0LnB1YiB0OS5vdXQgdDkub3V0LnB1YiBcCisJCWF1dGhvcml6ZWRfa2V5c18ke1VTRVJ9IGtub3duX2hvc3RzIHBpZGZpbGUgXAorCQlzc2hfY29uZmlnIHNzaGRfY29uZmlnLm9yaWcgc3NoX3Byb3h5IHNzaGRfY29uZmlnIHNzaGRfcHJveHkgXAorCQlyc2EucHViIHJzYSByc2ExLnB1YiByc2ExIGhvc3QucnNhIGhvc3QucnNhMSBcCisJCXJzYS1hZ2VudCByc2EtYWdlbnQucHViIHJzYTEtYWdlbnQgcnNhMS1hZ2VudC5wdWIgXAorCQlscy5jb3B5IGJhbm5lci5pbiBiYW5uZXIub3V0IGVtcHR5LmluIFwKKwkJc2NwLXNzaC13cmFwcGVyLnNjcCBzc2hfcHJveHlfZW52cGFzcyByZW1vdGVfcGlkIFwKKwkJc3NoZF9wcm94eV9iYWsgcnNhX3NzaDJfY3IucHJ2IHJzYV9zc2gyX2NybmwucHJ2IFwKKwkJa25vd25faG9zdHMtY2VydCBob3N0X2NhX2tleSogY2VydF9ob3N0X2tleSogXAorCQlwdXR0eS5yc2EyIHNzaGRfcHJveHlfb3JpZyBzc2hfcHJveHlfYmFrIFwKKwkJa2V5LnJzYS0qIGtleS5kc2EtKiBrZXkuZWNkc2EtKiBcCisJCWF1dGhvcml6ZWRfcHJpbmNpcGFsc18ke1VTRVJ9IGV4cGVjdCBhY3R1YWwKKworIyBFbmFibGUgYWxsIG1hbGxvYygzKSByYW5kb21pc2F0aW9ucyBhbmQgY2hlY2tzCitURVNUX0VOVj0gICAgICAiTUFMTE9DX09QVElPTlM9QUZHSlBSWCIKKworVEVTVF9TU0hfU1NIS0VZR0VOPz1zc2gta2V5Z2VuCisKK3QxOgorCSR7VEVTVF9TU0hfU1NIS0VZR0VOfSAtaWYgJHsuQ1VSRElSfS9yc2Ffc3NoMi5wcnYgfCBkaWZmIC0gJHsuQ1VSRElSfS9yc2Ffb3BlbnNzaC5wcnYKKwl0ciAnXG4nICdccicgPCR7LkNVUkRJUn0vcnNhX3NzaDIucHJ2ID4gJHsuT0JKRElSfS9yc2Ffc3NoMl9jci5wcnYKKwkke1RFU1RfU1NIX1NTSEtFWUdFTn0gLWlmICR7Lk9CSkRJUn0vcnNhX3NzaDJfY3IucHJ2IHwgZGlmZiAtICR7LkNVUkRJUn0vcnNhX29wZW5zc2gucHJ2CisJYXdrICd7cHJpbnQgJCQwICJcciJ9JyAkey5DVVJESVJ9L3JzYV9zc2gyLnBydiA+ICR7Lk9CSkRJUn0vcnNhX3NzaDJfY3JubC5wcnYKKwkke1RFU1RfU1NIX1NTSEtFWUdFTn0gLWlmICR7Lk9CSkRJUn0vcnNhX3NzaDJfY3JubC5wcnYgfCBkaWZmIC0gJHsuQ1VSRElSfS9yc2Ffb3BlbnNzaC5wcnYKKwordDI6CisJY2F0ICR7LkNVUkRJUn0vcnNhX29wZW5zc2gucHJ2ID4gJChPQkopL3QyLm91dAorCWNobW9kIDYwMCAkKE9CSikvdDIub3V0CisJJHtURVNUX1NTSF9TU0hLRVlHRU59IC15ZiAkKE9CSikvdDIub3V0IHwgZGlmZiAtICR7LkNVUkRJUn0vcnNhX29wZW5zc2gucHViCisKK3QzOgorCSR7VEVTVF9TU0hfU1NIS0VZR0VOfSAtZWYgJHsuQ1VSRElSfS9yc2Ffb3BlbnNzaC5wdWIgPiQoT0JKKS90My5vdXQKKwkke1RFU1RfU1NIX1NTSEtFWUdFTn0gLWlmICQoT0JKKS90My5vdXQgfCBkaWZmIC0gJHsuQ1VSRElSfS9yc2Ffb3BlbnNzaC5wdWIKKwordDQ6CisJJHtURVNUX1NTSF9TU0hLRVlHRU59IC1sZiAkey5DVVJESVJ9L3JzYV9vcGVuc3NoLnB1YiB8XAorCQlhd2sgJ3twcmludCAkJDJ9JyB8IGRpZmYgLSAkey5DVVJESVJ9L3Q0Lm9rCisKK3Q1OgorCSR7VEVTVF9TU0hfU1NIS0VZR0VOfSAtQmYgJHsuQ1VSRElSfS9yc2Ffb3BlbnNzaC5wdWIgfFwKKwkJYXdrICd7cHJpbnQgJCQyfScgfCBkaWZmIC0gJHsuQ1VSRElSfS90NS5vaworCit0NjoKKwkke1RFU1RfU1NIX1NTSEtFWUdFTn0gLWlmICR7LkNVUkRJUn0vZHNhX3NzaDIucHJ2ID4gJChPQkopL3Q2Lm91dDEKKwkke1RFU1RfU1NIX1NTSEtFWUdFTn0gLWlmICR7LkNVUkRJUn0vZHNhX3NzaDIucHViID4gJChPQkopL3Q2Lm91dDIKKwljaG1vZCA2MDAgJChPQkopL3Q2Lm91dDEKKwkke1RFU1RfU1NIX1NTSEtFWUdFTn0gLXlmICQoT0JKKS90Ni5vdXQxIHwgZGlmZiAtICQoT0JKKS90Ni5vdXQyCisKKyQoT0JKKS90Ny5vdXQ6CisJJHtURVNUX1NTSF9TU0hLRVlHRU59IC1xIC10IHJzYSAtTiAnJyAtZiAkQAorCit0NzogJChPQkopL3Q3Lm91dAorCSR7VEVTVF9TU0hfU1NIS0VZR0VOfSAtbGYgJChPQkopL3Q3Lm91dCA+IC9kZXYvbnVsbAorCSR7VEVTVF9TU0hfU1NIS0VZR0VOfSAtQmYgJChPQkopL3Q3Lm91dCA+IC9kZXYvbnVsbAorCiskKE9CSikvdDgub3V0OgorCSR7VEVTVF9TU0hfU1NIS0VZR0VOfSAtcSAtdCBkc2EgLU4gJycgLWYgJEAKKwordDg6ICQoT0JKKS90OC5vdXQKKwkke1RFU1RfU1NIX1NTSEtFWUdFTn0gLWxmICQoT0JKKS90OC5vdXQgPiAvZGV2L251bGwKKwkke1RFU1RfU1NIX1NTSEtFWUdFTn0gLUJmICQoT0JKKS90OC5vdXQgPiAvZGV2L251bGwKKworJChPQkopL3Q5Lm91dDoKKwl0ZXN0ICIke1RFU1RfU1NIX0VDQ30iICE9IHllcyB8fCBcCisJJHtURVNUX1NTSF9TU0hLRVlHRU59IC1xIC10IGVjZHNhIC1OICcnIC1mICRACisKK3Q5OiAkKE9CSikvdDkub3V0CisJdGVzdCAiJHtURVNUX1NTSF9FQ0N9IiAhPSB5ZXMgfHwgXAorCSR7VEVTVF9TU0hfU1NIS0VZR0VOfSAtbGYgJChPQkopL3Q5Lm91dCA+IC9kZXYvbnVsbAorCXRlc3QgIiR7VEVTVF9TU0hfRUNDfSIgIT0geWVzIHx8IFwKKwkke1RFU1RfU1NIX1NTSEtFWUdFTn0gLUJmICQoT0JKKS90OS5vdXQgPiAvZGV2L251bGwKKwordC1leGVjOgkke0xURVNUUzo9LnNofQorCUBpZiBbICJ4JD8iID0gIngiIF07IHRoZW4gZXhpdCAwOyBmaTsgXAorCWZvciBURVNUIGluICIiJD87IGRvIFwKKwkJZWNobyAicnVuIHRlc3QgJCR7VEVTVH0iIC4uLiAxPiYyOyBcCisJCShlbnYgU1VETz0iJHtTVURPfSIgVEVTVF9FTlY9JHtURVNUX0VOVn0gc2ggJHsuQ1VSRElSfS90ZXN0LWV4ZWMuc2ggJHsuT0JKRElSfSAkey5DVVJESVJ9LyQke1RFU1R9KSB8fCBleGl0ICQkPzsgXAorCWRvbmUKKwordC1leGVjLWludGVyb3A6CSR7SU5URVJPUF9URVNUUzo9LnNofQorCUBpZiBbICJ4JD8iID0gIngiIF07IHRoZW4gZXhpdCAwOyBmaTsgXAorCWZvciBURVNUIGluICIiJD87IGRvIFwKKwkJZWNobyAicnVuIHRlc3QgJCR7VEVTVH0iIC4uLiAxPiYyOyBcCisJCShlbnYgU1VETz0iJHtTVURPfSIgVEVTVF9FTlY9JHtURVNUX0VOVn0gc2ggJHsuQ1VSRElSfS90ZXN0LWV4ZWMuc2ggJHsuT0JKRElSfSAkey5DVVJESVJ9LyQke1RFU1R9KSB8fCBleGl0ICQkPzsgXAorCWRvbmUKKworIyBOb3QgcnVuIGJ5IGRlZmF1bHQKK2ludGVyb3A6ICR7SU5URVJPUF9UQVJHRVRTfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9yZWdyZXNzL1JFQURNRS5yZWdyZXNzIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL1JFQURNRS5yZWdyZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZTRjYzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvUkVBRE1FLnJlZ3Jlc3MKQEAgLTAsMCArMSwxMDQgQEAKK092ZXJ2aWV3LgorCiskIC4vY29uZmlndXJlICYmIG1ha2UgdGVzdHMKKworWW91J2xsIHNlZSBzb21lIHByb2dyZXNzIGluZm8uIEEgZmFpbHVyZSB3aWxsIGNhdXNlIGVpdGhlciB0aGUgbWFrZSB0bworYWJvcnQgb3IgdGhlIGRyaXZlciBzY3JpcHQgdG8gcmVwb3J0IGEgIkZBVEFMIiBmYWlsdXJlLgorCitUaGUgdGVzdCBjb25zaXN0cyBvZiAyIHBhcnRzLiBUaGUgZmlyc3QgaXMgdGhlIGZpbGUtYmFzZWQgdGVzdHMgd2hpY2ggaXMKK2RyaXZlbiBieSB0aGUgTWFrZWZpbGUsIGFuZCB0aGUgc2Vjb25kIGlzIGEgc2V0IG9mIG5ldHdvcmsgb3IgcHJveHljb21tYW5kCitiYXNlZCB0ZXN0cywgd2hpY2ggYXJlIGRyaXZlbiBieSBhIGRyaXZlciBzY3JpcHQgKHRlc3QtZXhlYy5zaCkgd2hpY2ggaXMKK2NhbGxlZCBtdWx0aXBsZSB0aW1lcyBieSB0aGUgTWFrZWZpbGUuCisKK0ZhaWx1cmVzIGluIHRoZSBmaXJzdCBwYXJ0IHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlIHRvIHJldHVybiBhbiBlcnJvci4KK0ZhaWx1cmVzIGluIHRoZSBzZWNvbmQgcGFydCB3aWxsIHByaW50IGEgIkZBVEFMIiBtZXNzYWdlIGZvciB0aGUgZmFpbGVkCit0ZXN0IGFuZCBjb250aW51ZS4KKworT3BlbkJTRCBoYXMgYSBzeXN0ZW0td2lkZSByZWdyZXNzaW9uIHRlc3Qgc3VpdGUuIE9wZW5TU0ggUG9ydGFibGUncyB0ZXN0CitzdWl0ZSBpcyBiYXNlZCBvbiBPcGVuQlNEJ3Mgd2l0aCBtb2RpZmljYXRpb25zLgorCisKK0Vudmlyb25tZW50IHZhcmlhYmxlcy4KKworU1VETzogcGF0aCB0byBzdWRvIGNvbW1hbmQsIGlmIGRlc2lyZWQuIE5vdGUgdGhhdCBzb21lIHN5c3RlbXMgKG5vdGFibHkKKwlzeXN0ZW1zIHVzaW5nIFBBTSkgcmVxdWlyZSBzdWRvIHRvIGV4ZWN1dGUgc29tZSB0ZXN0cy4KK1RFU1RfU1NIX1RSQUNFOiBzZXQgdG8gInllcyIgZm9yIHZlcmJvc2Ugb3V0cHV0IGZyb20gdGVzdHMgCitURVNUX1NTSF9RVUlFVDogc2V0IHRvICJ5ZXMiIHRvIHN1cHByZXNzIG5vbi1mYXRhbCBvdXRwdXQuCitURVNUX1NTSF94OiBwYXRoIHRvICJzc2giIGNvbW1hbmQgdW5kZXIgdGVzdCwgd2hlcmUgeD1TU0gsU1NIRCxTU0hBR0VOVCxTU0hBREQKKwlTU0hLRVlHRU4sU1NIS0VZU0NBTixTRlRQLFNGVFBTRVJWRVIKK09CSjogdXNlZCBieSB0ZXN0IHNjcmlwdHMgdG8gYWNjZXNzIGJ1aWxkIGRpci4KK1RFU1RfU0hFTEw6IHNoZWxsIHVzZWQgZm9yIHJ1bm5pbmcgdGhlIHRlc3Qgc2NyaXB0cy4KK1RFU1RfU1NIX1BPUlQ6IFRDUCBwb3J0IHRvIGJlIHVzZWQgZm9yIHRoZSBsaXN0ZW5pbmcgdGVzdHMuCitURVNUX1NTSF9TU0hfQ09ORk9QVFM6IENvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcyB0byBiZSBhZGRlZCB0byBzc2hfY29uZmlnCisJYmVmb3JlIHJ1bm5pbmcgZWFjaCB0ZXN0LgorVEVTVF9TU0hfU1NIRF9DT05GT1RQUzogQ29uZmlndXJhdGlvbiBkaXJlY3RpdmVzIHRvIGJlIGFkZGVkIHRvIHNzaGRfY29uZmlnCisJYmVmb3JlIHJ1bm5pbmcgZWFjaCB0ZXN0LgorCisKK0luZGl2aWR1YWwgdGVzdHMuCisKK1lvdSBjYW4gcnVuIGFuIGluZGl2aWR1YWwgdGVzdCBmcm9tIHRoZSB0b3AtbGV2ZWwgTWFrZWZpbGUsIGVnOgorJCBtYWtlIHRlc3RzIExURVNUUz1hZ2VudC10aW1lb3V0CisKK0lmIHlvdSBuZWVkIHRvIG1hbmlwdWxhdGUgdGhlIGVudmlyb25tZW50IG1vcmUgeW91IGNhbiBpbnZva2UgdGVzdC1leGVjLnNoCitkaXJlY3RseSBpZiB5b3Ugc2V0IHVwIHRoZSBwYXRoIHRvIGZpbmQgdGhlIGJpbmFyaWVzIHVuZGVyIHRlc3QgYW5kIHRoZQordGVzdCBzY3JpcHRzIHRoZW1zZWx2ZXMsIGZvciBleGFtcGxlOgorCiskIGNkIHJlZ3Jlc3MKKyQgUEFUSD1gcHdkYC8uLjokUEFUSDouIFRFU1RfU0hFTEw9L2Jpbi9zaCBzaCB0ZXN0LWV4ZWMuc2ggYHB3ZGAgXAorICAgIGFnZW50LXRpbWVvdXQuc2gKK29rIGFnZW50IHRpbWVvdXQgdGVzdAorCisKK0ZpbGVzLgorCit0ZXN0LWV4ZWMuc2g6IHRoZSBtYWluIHRlc3QgZHJpdmVyLiBTZXRzIGVudmlyb25tZW50LCBjcmVhdGVzIGNvbmZpZyBmaWxlcworYW5kIGtleXMgYW5kIHJ1bnMgdGhlIHNwZWNpZmllZCB0ZXN0LgorCitBdCB0aGUgdGltZSBvZiB3cml0aW5nLCB0aGUgaW5kaXZpZHVhbCB0ZXN0cyBhcmU6CithZ2VudC10aW1lb3V0LnNoOglhZ2VudCB0aW1lb3V0IHRlc3QKK2FnZW50LnNoOgkJc2ltcGxlIGFnZW50IHRlc3QKK2Jyb2tlbi1waXBlLnNoOgkJYnJva2VuIHBpcGUgdGVzdAorY29ubmVjdC1wcml2c2VwLnNoOglwcm94eSBjb25uZWN0IHdpdGggcHJpdnNlcAorY29ubmVjdC5zaDoJCXNpbXBsZSBjb25uZWN0CitleGl0LXN0YXR1cy5zaDoJCXJlbW90ZSBleGl0IHN0YXR1cworZm9yd2FyZGluZy5zaDoJCWxvY2FsIGFuZCByZW1vdGUgZm9yd2FyZGluZwora2V5Z2VuLWNoYW5nZS5zaDoJY2hhbmdlIHBhc3NwaHJhc2UgZm9yIGtleQora2V5c2Nhbi5zaDoJCWtleXNjYW4KK3Byb3RvLW1pc21hdGNoLnNoOglwcm90b2NvbCB2ZXJzaW9uIG1pc21hdGNoCitwcm90by12ZXJzaW9uLnNoOglzc2hkIHZlcnNpb24gd2l0aCBkaWZmZXJlbnQgcHJvdG9jb2wgY29tYmluYXRpb25zCitwcm94eS1jb25uZWN0LnNoOglwcm94eSBjb25uZWN0CitzZnRwLnNoOgkJYmFzaWMgc2Z0cCBwdXQvZ2V0Citzc2gtY29tLWNsaWVudC5zaDoJY29ubmVjdCB3aXRoIHNzaC5jb20gY2xpZW50Citzc2gtY29tLWtleWdlbi5zaDoJc3NoLmNvbSBrZXkgaW1wb3J0Citzc2gtY29tLXNmdHAuc2g6CWJhc2ljIHNmdHAgcHV0L2dldCB3aXRoIHNzaC5jb20gc2VydmVyCitzc2gtY29tLnNoOgkJY29ubmVjdCB0byBzc2guY29tIHNlcnZlcgorc3RkZXJyLWFmdGVyLWVvZi5zaDoJc3RkZXJyIGRhdGEgYWZ0ZXIgZW9mCitzdGRlcnItZGF0YS5zaDoJCXN0ZGVyciBkYXRhIHRyYW5zZmVyCit0cmFuc2Zlci5zaDoJCXRyYW5zZmVyIGRhdGEKK3RyeS1jaXBoZXJzLnNoOgkJdHJ5IGNpcGhlcnMKK3llcy1oZWFkLnNoOgkJeWVzIHBpcGUgaGVhZAorCisKK1Byb2JsZW1zPworCitSdW4gdGhlIGZhaWxpbmcgdGVzdCB3aXRoIHNoZWxsIHRyYWNpbmcgKC14KSB0dXJuZWQgb246CiskIFBBVEg9YHB3ZGAvLi46JFBBVEg6LiBzaCAteCB0ZXN0LWV4ZWMuc2ggYHB3ZGAgYWdlbnQtdGltZW91dC5zaAorCitGYWlsZWQgdGVzdHMgY2FuIGJlIGRpZmZpY3VsdCB0byBkaWFnbm9zZS4gU3VnZ2VzdGlvbnM6CistIHJ1biB0aGUgaW5kaXZpZHVhbCB0ZXN0IHZpYSAuL3Rlc3QtZXhlYy5zaCBgcHdkYCBbdGVzdG5hbWVdCistIHNldCBMb2dMZXZlbCB0byBWRVJCT1NFIGluIHRlc3QtZXhlYy5zaCBhbmQgZW5hYmxlIHN5c2xvZ2dpbmcgb2YKKyAgYXV0aC5kZWJ1ZyAoZWcgdG8gL3Zhci9sb2cvYXV0aGxvZykuCisKKworS25vd24gSXNzdWVzLgorCistIFNpbWlsYXJseSwgaWYgeW91IGRvIG5vdCBoYXZlICJzY3AiIGluIHlvdXIgc3lzdGVtJ3MgJFBBVEggdGhlbiB0aGUKKyAgbXVsdGlwbGV4IHNjcCB0ZXN0cyB3aWxsIGZhaWwgKHNpbmNlIHRoZSBzeXN0ZW0ncyBzaGVsbCBzdGFydHVwIHNjcmlwdHMKKyAgd2lsbCBkZXRlcm1pbmUgd2hlcmUgdGhlIHNoZWxsIHN0YXJ0ZWQgYnkgc3NoZCB3aWxsIGxvb2sgZm9yIHNjcCkuCisKKy0gUmVjZW50IEdOVSBjb3JldXRpbHMgZGVwcmVjYXRlICJoZWFkIC1bbl0iOiB0aGlzIHdpbGwgY2F1c2UgdGhlIHllcy1oZWFkCisgIHRlc3QgdG8gZmFpbC4gIFRoZSBvbGQgYmVoYXZpb3VyIGNhbiBiZSByZXN0b3JlZCBieSBzZXR0aW5nIChhbmQKKyAgZXhwb3J0aW5nKSBfUE9TSVgyX1ZFUlNJT049MTk5MjA5IGJlZm9yZSBydW5uaW5nIHRoZSB0ZXN0cy4KKworJElkOiBSRUFETUUucmVncmVzcyx2IDEuMTIgMjAxMS8wNS8wNSAwMzo0ODo0MiBkam0gRXhwICQKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy9hZGRybWF0Y2guc2ggYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvYWRkcm1hdGNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZGRkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvYWRkcm1hdGNoLnNoCkBAIC0wLDAgKzEsNDUgQEAKKyMJJE9wZW5CU0Q6IGFkZHJtYXRjaC5zaCx2IDEuMyAyMDEwLzAyLzA5IDA0OjU3OjM2IGRqbSBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKK3RpZD0iYWRkcmVzcyBtYXRjaCIKKworbXYgJE9CSi9zc2hkX3Byb3h5ICRPQkovc3NoZF9wcm94eV9iYWsKKworcnVuX3RyaWFsKCkKK3sKKwl1c2VyPSIkMSI7IGFkZHI9IiQyIjsgaG9zdD0iJDMiOyBleHBlY3RlZD0iJDQiOyBkZXNjcj0iJDUiCisKKwl2ZXJib3NlICJ0ZXN0ICRkZXNjciBmb3IgJHVzZXIgJGFkZHIgJGhvc3QiCisJcmVzdWx0PWAke1NTSER9IC1mICRPQkovc3NoZF9wcm94eSAtVCBcCisJICAgIC1DIHVzZXI9JHt1c2VyfSxhZGRyPSR7YWRkcn0saG9zdD0ke2hvc3R9IHwgXAorCSAgICBhd2sgJy9ecGFzc3dvcmRhdXRoZW50aWNhdGlvbi8ge3ByaW50ICQyfSdgCisJaWYgWyAiJHJlc3VsdCIgIT0gIiRleHBlY3RlZCIgXTsgdGhlbgorCQlmYWlsICJmYWlsZWQgZm9yICR1c2VyICRhZGRyICRob3N0OiBleHBlY3RlZCAkZXhwZWN0ZWQsIGdvdCAkcmVzdWx0IgorCWZpCit9CisKK2NwICRPQkovc3NoZF9wcm94eV9iYWsgJE9CSi9zc2hkX3Byb3h5CitjYXQgPj4kT0JKL3NzaGRfcHJveHkgPDxFT0QKK1Bhc3N3b3JkQXV0aGVudGljYXRpb24gbm8KK01hdGNoIEFkZHJlc3MgMTkyLjE2OC4wLjAvMTYsITE5Mi4xNjguMzAuMC8yNCwxMC4wLjAuMC84LGhvc3QuZXhhbXBsZS5jb20KKwlQYXNzd29yZEF1dGhlbnRpY2F0aW9uIHllcworTWF0Y2ggQWRkcmVzcyAxLjEuMS4xLDo6MSwhOjozLDIwMDA6Oi8xNgorCVBhc3N3b3JkQXV0aGVudGljYXRpb24geWVzCitFT0QKKworcnVuX3RyaWFsIHVzZXIgMTkyLjE2OC4wLjEgc29tZWhvc3QgeWVzCQkicGVybWl0LCBmaXJzdCBlbnRyeSIKK3J1bl90cmlhbCB1c2VyIDE5Mi4xNjguMzAuMSBzb21laG9zdCBubwkJImRlbnksIG5lZ2F0aXZlIG1hdGNoIgorcnVuX3RyaWFsIHVzZXIgMTkuMC4wLjEgc29tZWhvc3Qgbm8JCSJkZW55LCBubyBtYXRjaCIKK3J1bl90cmlhbCB1c2VyIDEwLjI1NS4yNTUuMjU0IHNvbWVob3N0IHllcwkicGVybWl0LCBsaXN0IG1pZGRsZSIKK3J1bl90cmlhbCB1c2VyIDE5Mi4xNjguMzAuMSAxOTIuMTY4LjAuMSBubwkiZGVueSwgZmFrZWQgSVAgaW4gaG9zdG5hbWUiCitydW5fdHJpYWwgdXNlciAxLjEuMS4xIHNvbWVob3N0LmV4YW1wbGUuY29tIHllcwkicGVybWl0LCBiYXJlIElQNCBhZGRyZXNzIgordGVzdCAiJFRFU1RfU1NIX0lQVjYiID0gIm5vIiAmJiBleGl0CitydW5fdHJpYWwgdXNlciA6OjEgc29tZWhvc3QuZXhhbXBsZS5jb20JIHllcwkicGVybWl0LCBiYXJlIElQNiBhZGRyZXNzIgorcnVuX3RyaWFsIHVzZXIgOjoyIHNvbWVob3N0LmV4YXBsZS5jb20gbm8JImRlbnkgSVB2NiIKK3J1bl90cmlhbCB1c2VyIDo6MyBzb21laG9zdCBubwkJCSJkZW55IElQNiBuZWdhdGVkIgorcnVuX3RyaWFsIHVzZXIgOjo0IHNvbWVob3N0IG5vCQkJImRlbnksIElQNiBubyBtYXRjaCIKK3J1bl90cmlhbCB1c2VyIDIwMDA6OjEgc29tZWhvc3QgeWVzCQkicGVybWl0LCBJUDYgbmV0d29yayIKK3J1bl90cmlhbCB1c2VyIDIwMDE6OjEgc29tZWhvc3Qgbm8JCSJkZW55LCBJUDYgbmV0d29yayIKKworY3AgJE9CSi9zc2hkX3Byb3h5X2JhayAkT0JKL3NzaGRfcHJveHkKK3JtICRPQkovc3NoZF9wcm94eV9iYWsKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy9hZ2VudC1nZXRwZWVyZWlkLnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2FnZW50LWdldHBlZXJlaWQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmNjU0YwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9hZ2VudC1nZXRwZWVyZWlkLnNoCkBAIC0wLDAgKzEsNDYgQEAKKyMJJE9wZW5CU0Q6IGFnZW50LWdldHBlZXJlaWQuc2gsdiAxLjQgMjAwNy8xMS8yNSAxNTozNTowOSBqbWMgRXhwICQKKyMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgorCit0aWQ9ImRpc2FsbG93IGFnZW50IGF0dGFjaCBmcm9tIG90aGVyIHVpZCIKKworVU5QUklWPW5vYm9keQorQVNPQ0s9JHtPQkp9L2FnZW50CitTU0hfQVVUSF9TT0NLPS9ub25leGlzdGVudAorCitpZiBjb25maWdfZGVmaW5lZCBIQVZFX0dFVFBFRVJFSUQgSEFWRV9HRVRQRUVSVUNSRUQgSEFWRV9TT19QRUVSQ1JFRCA7IHRoZW4KKwk6CitlbHNlCisJZWNobyAic2tpcHBlZCAobm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtKSIKKwlleGl0IDAKK2ZpCitpZiBbIC16ICIkU1VETyIgXTsgdGhlbgorCWVjaG8gInNraXBwZWQ6IG5lZWQgU1VETyB0byBzd2l0Y2ggdG8gdWlkICRVTlBSSVYiCisJZXhpdCAwCitmaQorCisKK3RyYWNlICJzdGFydCBhZ2VudCIKK2V2YWwgYCR7U1NIQUdFTlR9IC1zIC1hICR7QVNPQ0t9YCA+IC9kZXYvbnVsbAorcj0kPworaWYgWyAkciAtbmUgMCBdOyB0aGVuCisJZmFpbCAiY291bGQgbm90IHN0YXJ0IHNzaC1hZ2VudDogZXhpdCBjb2RlICRyIgorZWxzZQorCWNobW9kIDY0NCAke1NTSF9BVVRIX1NPQ0t9CisKKwlzc2gtYWRkIC1sID4gL2Rldi9udWxsIDI+JjEKKwlyPSQ/CisJaWYgWyAkciAtbmUgMSBdOyB0aGVuCisJCWZhaWwgInNzaC1hZGQgZmFpbGVkIHdpdGggJHIgIT0gMSIKKwlmaQorCisJPCAvZGV2L251bGwgJHtTVURPfSAtUyAtdSAke1VOUFJJVn0gc3NoLWFkZCAtbCAyPi9kZXYvbnVsbAorCXI9JD8KKwlpZiBbICRyIC1sdCAyIF07IHRoZW4KKwkJZmFpbCAic3NoLWFkZCBkaWQgbm90IGZhaWwgZm9yICR7VU5QUklWfTogJHIgPCAyIgorCWZpCisKKwl0cmFjZSAia2lsbCBhZ2VudCIKKwkke1NTSEFHRU5UfSAtayA+IC9kZXYvbnVsbAorZmkKKworcm0gLWYgJHtPQkp9L2FnZW50CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvYWdlbnQtcGtjczExLnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2FnZW50LXBrY3MxMS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjMzYWIzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2FnZW50LXBrY3MxMS5zaApAQCAtMCwwICsxLDY5IEBACisjCSRPcGVuQlNEOiBhZ2VudC1wa2NzMTEuc2gsdiAxLjEgMjAxMC8wMi8wOCAxMDo1Mjo0NyBtYXJrdXMgRXhwICQKKyMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgorCit0aWQ9InBrY3MxMSBhZ2VudCB0ZXN0IgorCitURVNUX1NTSF9QSU49IiIKK1RFU1RfU1NIX1BLQ1MxMT0vdXNyL2xvY2FsL2xpYi9zb2Z0LXBrY3MxMS5zby4wLjAKKworIyBzZXR1cCBlbnZpcm9ubWVudCBmb3Igc29mdC1wa2NzMTEgdG9rZW4KK1NPRlRQS0NTMTFSQz0kT0JKL3BrY3MxMS5pbmZvCitleHBvcnQgU09GVFBLQ1MxMVJDCisjIHByZXZlbnQgc3NoLWFnZW50IGZyb20gY2FsbGluZyBzc2gtYXNrcGFzcworU1NIX0FTS1BBU1M9L3Vzci9iaW4vdHJ1ZQorZXhwb3J0IFNTSF9BU0tQQVNTCit1bnNldCBESVNQTEFZCisKKyMgc3RhcnQgY29tbWFuZCB3L28gdHR5LCBzbyBzc2gtYWRkIGFjY2VwdHMgcGluIGZyb20gc3RkaW4KK25vdHR5KCkgeworCXBlcmwgLWUgJ3VzZSBQT1NJWDsgUE9TSVg6OnNldHNpZCgpOyAKKwkgICAgaWYgKGZvcmspIHsgd2FpdDsgZXhpdCgkPyA+PiA4KTsgfSBlbHNlIHsgZXhlYyhAQVJHVikgfScgIiRAIgorfQorCit0cmFjZSAic3RhcnQgYWdlbnQiCitldmFsIGAke1NTSEFHRU5UfSAtc2AgPiAvZGV2L251bGwKK3I9JD8KK2lmIFsgJHIgLW5lIDAgXTsgdGhlbgorCWZhaWwgImNvdWxkIG5vdCBzdGFydCBzc2gtYWdlbnQ6IGV4aXQgY29kZSAkciIKK2Vsc2UKKwl0cmFjZSAiZ2VuZXJhdGluZyBrZXkvY2VydCIKKwlybSAtZiAkT0JKL3BrY3MxMS5rZXkgJE9CSi9wa2NzMTEuY3J0CisJb3BlbnNzbCBnZW5yc2EgLW91dCAkT0JKL3BrY3MxMS5rZXkgMjA0OCA+IC9kZXYvbnVsbCAyPiYxCisJY2htb2QgNjAwICRPQkovcGtjczExLmtleSAKKwlvcGVuc3NsIHJlcSAta2V5ICRPQkovcGtjczExLmtleSAtbmV3IC14NTA5IFwKKwkgICAgLW91dCAkT0JKL3BrY3MxMS5jcnQgLXRleHQgLXN1YmogJy9DTj1wa2NzMTEgdGVzdCcgPiAvZGV2L251bGwKKwlwcmludGYgImFcdGFcdCRPQkovcGtjczExLmNydFx0JE9CSi9wa2NzMTEua2V5IiA+ICRTT0ZUUEtDUzExUkMKKwkjIGFkZCB0byBhdXRob3JpemVkIGtleXMKKwkke1NTSEtFWUdFTn0gLXkgLWYgJE9CSi9wa2NzMTEua2V5ID4gJE9CSi9hdXRob3JpemVkX2tleXNfJFVTRVIKKworCXRyYWNlICJhZGQgcGtjczExIGtleSB0byBhZ2VudCIKKwllY2hvICR7VEVTVF9TU0hfUElOfSB8IG5vdHR5ICR7U1NIQUREfSAtcyAke1RFU1RfU1NIX1BLQ1MxMX0gPiAvZGV2L251bGwgMj4mMQorCXI9JD8KKwlpZiBbICRyIC1uZSAwIF07IHRoZW4KKwkJZmFpbCAic3NoLWFkZCAtcyBmYWlsZWQ6IGV4aXQgY29kZSAkciIKKwlmaQorCisJdHJhY2UgInBrY3MxMSBsaXN0IHZpYSBhZ2VudCIKKwkke1NTSEFERH0gLWwgPiAvZGV2L251bGwgMj4mMQorCXI9JD8KKwlpZiBbICRyIC1uZSAwIF07IHRoZW4KKwkJZmFpbCAic3NoLWFkZCAtbCBmYWlsZWQ6IGV4aXQgY29kZSAkciIKKwlmaQorCisJdHJhY2UgInBrY3MxMSBjb25uZWN0IHZpYSBhZ2VudCIKKwkke1NTSH0gLTIgLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgZXhpdCA1CisJcj0kPworCWlmIFsgJHIgLW5lIDUgXTsgdGhlbgorCQlmYWlsICJzc2ggY29ubmVjdCBmYWlsZWQgKGV4aXQgY29kZSAkcikiCisJZmkKKworCXRyYWNlICJyZW1vdmUgcGtjczExIGtleXMiCisJZWNobyAke1RFU1RfU1NIX1BJTn0gfCBub3R0eSAke1NTSEFERH0gLWUgJHtURVNUX1NTSF9QS0NTMTF9ID4gL2Rldi9udWxsIDI+JjEKKwlyPSQ/CisJaWYgWyAkciAtbmUgMCBdOyB0aGVuCisJCWZhaWwgInNzaC1hZGQgLWUgZmFpbGVkOiBleGl0IGNvZGUgJHIiCisJZmkKKworCXRyYWNlICJraWxsIGFnZW50IgorCSR7U1NIQUdFTlR9IC1rID4gL2Rldi9udWxsCitmaQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2FnZW50LXB0cmFjZS5zaCBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9hZ2VudC1wdHJhY2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYyOTQ2NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9hZ2VudC1wdHJhY2Uuc2gKQEAgLTAsMCArMSw1MyBAQAorIwkkT3BlbkJTRDogYWdlbnQtcHRyYWNlLnNoLHYgMS4xIDIwMDIvMTIvMDkgMTU6Mzg6MzAgbWFya3VzIEV4cCAkCisjCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KKwordGlkPSJkaXNhbGxvdyBhZ2VudCBwdHJhY2UgYXR0YWNoIgorCitpZiBoYXZlX3Byb2cgdW5hbWUgOyB0aGVuCisJY2FzZSBgdW5hbWVgIGluCisJQUlYfENZR1dJTip8T1NGMSkKKwkJZWNobyAic2tpcHBlZCAobm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtKSIKKwkJZXhpdCAwCisJCTs7CisJZXNhYworZmkKKworaWYgaGF2ZV9wcm9nIGdkYiA7IHRoZW4KKwk6IG9rCitlbHNlCisJZWNobyAic2tpcHBlZCAoZ2RiIG5vdCBmb3VuZCkiCisJZXhpdCAwCitmaQorCitpZiB0ZXN0IC16ICIkU1VETyIgOyB0aGVuCisJZWNobyAic2tpcHBlZCAoU1VETyBub3Qgc2V0KSIKKwlleGl0IDAKK2Vsc2UKKwkkU1VETyBjaG93biAwICR7U1NIQUdFTlR9CisJJFNVRE8gY2hncnAgMCAke1NTSEFHRU5UfQorCSRTVURPIGNobW9kIDI3NTUgJHtTU0hBR0VOVH0KK2ZpCisKK3RyYWNlICJzdGFydCBhZ2VudCIKK2V2YWwgYCR7U1NIQUdFTlR9IC1zYCA+IC9kZXYvbnVsbAorcj0kPworaWYgWyAkciAtbmUgMCBdOyB0aGVuCisJZmFpbCAiY291bGQgbm90IHN0YXJ0IHNzaC1hZ2VudDogZXhpdCBjb2RlICRyIgorZWxzZQorCSMgbHMgLWwgJHtTU0hfQVVUSF9TT0NLfQorCWdkYiAke1NTSEFHRU5UfSAke1NTSF9BR0VOVF9QSUR9ID4gJHtPQkp9L2dkYi5vdXQgMj4mMSA8PCBFT0YKKwkJcXVpdAorRU9GCisJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJCWZhaWwgImdkYiBmYWlsZWQ6IGV4aXQgY29kZSAkPyIKKwlmaQorCWVncmVwICdwdHJhY2U6IE9wZXJhdGlvbiBub3QgcGVybWl0dGVkLnxwcm9jZnM6LipQZXJtaXNzaW9uIGRlbmllZC58dHRyYWNlLipQZXJtaXNzaW9uIGRlbmllZC58cHJvY2ZzOi4qOiBJbnZhbGlkIGFyZ3VtZW50LnxVbmFibGUgdG8gYWNjZXNzIHRhc2sgJyA+L2Rldi9udWxsICR7T0JKfS9nZGIub3V0CisJcj0kPworCXJtIC1mICR7T0JKfS9nZGIub3V0CisJaWYgWyAkciAtbmUgMCBdOyB0aGVuCisJCWZhaWwgInB0cmFjZSBzdWNjZWVkZWQ/OiBleGl0IGNvZGUgJHIiCisJZmkKKworCXRyYWNlICJraWxsIGFnZW50IgorCSR7U1NIQUdFTlR9IC1rID4gL2Rldi9udWxsCitmaQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2FnZW50LXRpbWVvdXQuc2ggYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvYWdlbnQtdGltZW91dC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTQwZTdhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2FnZW50LXRpbWVvdXQuc2gKQEAgLTAsMCArMSwzNiBAQAorIwkkT3BlbkJTRDogYWdlbnQtdGltZW91dC5zaCx2IDEuMSAyMDAyLzA2LzA2IDAwOjM4OjQwIG1hcmt1cyBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKK3RpZD0iYWdlbnQgdGltZW91dCB0ZXN0IgorCitTU0hBR0VOVF9USU1FT1VUPTEwCisKK3RyYWNlICJzdGFydCBhZ2VudCIKK2V2YWwgYCR7U1NIQUdFTlR9IC1zYCA+IC9kZXYvbnVsbAorcj0kPworaWYgWyAkciAtbmUgMCBdOyB0aGVuCisJZmFpbCAiY291bGQgbm90IHN0YXJ0IHNzaC1hZ2VudDogZXhpdCBjb2RlICRyIgorZWxzZQorCXRyYWNlICJhZGQga2V5cyB3aXRoIHRpbWVvdXQiCisJZm9yIHQgaW4gcnNhIHJzYTE7IGRvCisJCSR7U1NIQUREfSAtdCAke1NTSEFHRU5UX1RJTUVPVVR9ICRPQkovJHQgPiAvZGV2L251bGwgMj4mMQorCQlpZiBbICQ/IC1uZSAwIF07IHRoZW4KKwkJCWZhaWwgInNzaC1hZGQgZGlkIHN1Y2NlZWQgZXhpdCBjb2RlIDAiCisJCWZpCisJZG9uZQorCW49YCR7U1NIQUREfSAtbCAyPiAvZGV2L251bGwgfCB3YyAtbGAKKwl0cmFjZSAiYWdlbnQgaGFzICRuIGtleXMiCisJaWYgWyAkbiAtbmUgMiBdOyB0aGVuCisJCWZhaWwgInNzaC1hZGQgLWwgZGlkIG5vdCByZXR1cm4gMiBrZXlzOiAkbiIKKwlmaQorCXRyYWNlICJzbGVlcGluZyAyKiR7U1NIQUdFTlRfVElNRU9VVH0gc2Vjb25kcyIKKwlzbGVlcCAke1NTSEFHRU5UX1RJTUVPVVR9CisJc2xlZXAgJHtTU0hBR0VOVF9USU1FT1VUfQorCSR7U1NIQUREfSAtbCAyPiAvZGV2L251bGwgfCBncmVwICdUaGUgYWdlbnQgaGFzIG5vIGlkZW50aXRpZXMuJyA+L2Rldi9udWxsCisJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJCWZhaWwgInNzaC1hZGQgLWwgc3RpbGwgcmV0dXJucyBrZXlzIGFmdGVyIHRpbWVvdXQiCisJZmkKKworCXRyYWNlICJraWxsIGFnZW50IgorCSR7U1NIQUdFTlR9IC1rID4gL2Rldi9udWxsCitmaQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2FnZW50LnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2FnZW50LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NGNmNjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvYWdlbnQuc2gKQEAgLTAsMCArMSw3NSBAQAorIwkkT3BlbkJTRDogYWdlbnQuc2gsdiAxLjcgMjAwNy8xMS8yNSAxNTozNTowOSBqbWMgRXhwICQKKyMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgorCit0aWQ9InNpbXBsZSBhZ2VudCB0ZXN0IgorCitTU0hfQVVUSF9TT0NLPS9ub25leGlzdGVudCAke1NTSEFERH0gLWwgPiAvZGV2L251bGwgMj4mMQoraWYgWyAkPyAtbmUgMiBdOyB0aGVuCisJZmFpbCAic3NoLWFkZCAtbCBkaWQgbm90IGZhaWwgd2l0aCBleGl0IGNvZGUgMiIKK2ZpCisKK3RyYWNlICJzdGFydCBhZ2VudCIKK2V2YWwgYCR7U1NIQUdFTlR9IC1zYCA+IC9kZXYvbnVsbAorcj0kPworaWYgWyAkciAtbmUgMCBdOyB0aGVuCisJZmFpbCAiY291bGQgbm90IHN0YXJ0IHNzaC1hZ2VudDogZXhpdCBjb2RlICRyIgorZWxzZQorCSR7U1NIQUREfSAtbCA+IC9kZXYvbnVsbCAyPiYxCisJaWYgWyAkPyAtbmUgMSBdOyB0aGVuCisJCWZhaWwgInNzaC1hZGQgLWwgZGlkIG5vdCBmYWlsIHdpdGggZXhpdCBjb2RlIDEiCisJZmkKKwl0cmFjZSAib3ZlcndyaXRlIGF1dGhvcml6ZWQga2V5cyIKKwllY2hvbiA+ICRPQkovYXV0aG9yaXplZF9rZXlzXyRVU0VSCisJZm9yIHQgaW4gcnNhIHJzYTE7IGRvCisJCSMgZ2VuZXJhdGUgdXNlciBrZXkgZm9yIGFnZW50CisJCXJtIC1mICRPQkovJHQtYWdlbnQKKwkJJHtTU0hLRVlHRU59IC1xIC1OICcnIC10ICR0IC1mICRPQkovJHQtYWdlbnQgfHxcCisJCQkgZmFpbCAic3NoLWtleWdlbiBmb3IgJHQtYWdlbnQgZmFpbGVkIgorCQkjIGFkZCB0byBhdXRob3JpemVkIGtleXMKKwkJY2F0ICRPQkovJHQtYWdlbnQucHViID4+ICRPQkovYXV0aG9yaXplZF9rZXlzXyRVU0VSCisJCSMgYWRkIHByaXZhdCBrZXkgdG8gYWdlbnQKKwkJJHtTU0hBRER9ICRPQkovJHQtYWdlbnQgPiAvZGV2L251bGwgMj4mMQorCQlpZiBbICQ/IC1uZSAwIF07IHRoZW4KKwkJCWZhaWwgInNzaC1hZGQgZGlkIHN1Y2NlZWQgZXhpdCBjb2RlIDAiCisJCWZpCisJZG9uZQorCSR7U1NIQUREfSAtbCA+IC9kZXYvbnVsbCAyPiYxCisJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJCWZhaWwgInNzaC1hZGQgLWwgZmFpbGVkOiBleGl0IGNvZGUgJD8iCisJZmkKKwkjIHRoZSBzYW1lIGZvciBmdWxsIHB1YmtleSBvdXRwdXQKKwkke1NTSEFERH0gLUwgPiAvZGV2L251bGwgMj4mMQorCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCQlmYWlsICJzc2gtYWRkIC1MIGZhaWxlZDogZXhpdCBjb2RlICQ/IgorCWZpCisKKwl0cmFjZSAic2ltcGxlIGNvbm5lY3QgdmlhIGFnZW50IgorCWZvciBwIGluIDEgMjsgZG8KKwkJJHtTU0h9IC0kcCAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCBleGl0IDUkcAorCQlpZiBbICQ/IC1uZSA1JHAgXTsgdGhlbgorCQkJZmFpbCAic3NoIGNvbm5lY3Qgd2l0aCBwcm90b2NvbCAkcCBmYWlsZWQgKGV4aXQgY29kZSAkPykiCisJCWZpCisJZG9uZQorCisJdHJhY2UgImFnZW50IGZvcndhcmRpbmciCisJZm9yIHAgaW4gMSAyOyBkbworCQkke1NTSH0gLUEgLSRwIC1GICRPQkovc3NoX3Byb3h5IHNvbWVob3N0ICR7U1NIQUREfSAtbCA+IC9kZXYvbnVsbCAyPiYxCisJCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCQkJZmFpbCAic3NoLWFkZCAtbCB2aWEgYWdlbnQgZndkIHByb3RvICRwIGZhaWxlZCAoZXhpdCBjb2RlICQ/KSIKKwkJZmkKKwkJJHtTU0h9IC1BIC0kcCAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCBcCisJCQkiJHtTU0h9IC0kcCAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCBleGl0IDUkcCIKKwkJaWYgWyAkPyAtbmUgNSRwIF07IHRoZW4KKwkJCWZhaWwgImFnZW50IGZ3ZCBwcm90byAkcCBmYWlsZWQgKGV4aXQgY29kZSAkPykiCisJCWZpCisJZG9uZQorCisJdHJhY2UgImRlbGV0ZSBhbGwgYWdlbnQga2V5cyIKKwkke1NTSEFERH0gLUQgPiAvZGV2L251bGwgMj4mMQorCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCQlmYWlsICJzc2gtYWRkIC1EIGZhaWxlZDogZXhpdCBjb2RlICQ/IgorCWZpCisKKwl0cmFjZSAia2lsbCBhZ2VudCIKKwkke1NTSEFHRU5UfSAtayA+IC9kZXYvbnVsbAorZmkKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy9iYW5uZXIuc2ggYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvYmFubmVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiOWM5NTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvYmFubmVyLnNoCkBAIC0wLDAgKzEsNDQgQEAKKyMJJE9wZW5CU0Q6IGJhbm5lci5zaCx2IDEuMiAyMDAzLzEwLzExIDExOjQ5OjQ5IGR0dWNrZXIgRXhwICQKKyMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgorCit0aWQ9ImJhbm5lciIKK2VjaG8gIkJhbm5lciAkT0JKL2Jhbm5lci5pbiIgPj4gJE9CSi9zc2hkX3Byb3h5CisKK3JtIC1mICRPQkovYmFubmVyLm91dCAkT0JKL2Jhbm5lci5pbiAkT0JKL2VtcHR5LmluCit0b3VjaCAkT0JKL2VtcHR5LmluCisKK3RyYWNlICJ0ZXN0IG1pc3NpbmcgYmFubmVyIGZpbGUiCit2ZXJib3NlICJ0ZXN0ICR0aWQ6IG1pc3NpbmcgYmFubmVyIGZpbGUiCisoICR7U1NIfSAtMiAtRiAkT0JKL3NzaF9wcm94eSBvdGhlcmhvc3QgdHJ1ZSAyPiRPQkovYmFubmVyLm91dCAmJiBcCisJY21wICRPQkovZW1wdHkuaW4gJE9CSi9iYW5uZXIub3V0ICkgfHwgXAorCWZhaWwgIm1pc3NpbmcgYmFubmVyIGZpbGUiCisKK2ZvciBzIGluIDAgMTAgMTAwIDEwMDAgMTAwMDAgMTAwMDAwIDsgZG8KKwlpZiBbICIkcyIgPSAiMCIgXTsgdGhlbgorCQkjIGNyZWF0ZSBlbXB0eSBiYW5uZXIKKwkJdG91Y2ggJE9CSi9iYW5uZXIuaW4KKwllbGlmIFsgIiRzIiA9ICIxMCIgXTsgdGhlbgorCQkjIGNyZWF0ZSAxMC1ieXRlIGJhbm5lciBmaWxlCisJCWVjaG8gImFiY2RlZmdoaSIgPiRPQkovYmFubmVyLmluCisJZWxzZQorCQkjIGluY3JlYXNlIHNpemUgMTB4CisJCWNwICRPQkovYmFubmVyLmluICRPQkovYmFubmVyLm91dAorCQlmb3IgaSBpbiAwIDEgMiAzIDQgNSA2IDcgOCA7IGRvCisJCQljYXQgJE9CSi9iYW5uZXIub3V0ID4+ICRPQkovYmFubmVyLmluCisJCWRvbmUKKwlmaQorCisJdHJhY2UgInRlc3QgYmFubmVyIHNpemUgJHMiCisJdmVyYm9zZSAidGVzdCAkdGlkOiBzaXplICRzIgorCSggJHtTU0h9IC0yIC1GICRPQkovc3NoX3Byb3h5IG90aGVyaG9zdCB0cnVlIDI+JE9CSi9iYW5uZXIub3V0ICYmIFwKKwkJY21wICRPQkovYmFubmVyLmluICRPQkovYmFubmVyLm91dCApIHx8IFwKKwkJZmFpbCAiYmFubmVyIHNpemUgJHMgbWlzbWF0Y2giCitkb25lCisKK3RyYWNlICJ0ZXN0IHN1cHByZXNzIGJhbm5lciAoLXEpIgordmVyYm9zZSAidGVzdCAkdGlkOiBzdXBwcmVzcyBiYW5uZXIgKC1xKSIKKyggJHtTU0h9IC1xIC0yIC1GICRPQkovc3NoX3Byb3h5IG90aGVyaG9zdCB0cnVlIDI+JE9CSi9iYW5uZXIub3V0ICYmIFwKKwljbXAgJE9CSi9lbXB0eS5pbiAkT0JKL2Jhbm5lci5vdXQgKSB8fCBcCisJZmFpbCAic3VwcHJlc3MgYmFubmVyICgtcSkiCisKK3JtIC1mICRPQkovYmFubmVyLm91dCAkT0JKL2Jhbm5lci5pbiAkT0JKL2VtcHR5LmluCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvYnJva2VuLXBpcGUuc2ggYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvYnJva2VuLXBpcGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4Yzg0OQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9icm9rZW4tcGlwZS5zaApAQCAtMCwwICsxLDE1IEBACisjCSRPcGVuQlNEOiBicm9rZW4tcGlwZS5zaCx2IDEuNCAyMDAyLzAzLzE1IDEzOjA4OjU2IG1hcmt1cyBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKK3RpZD0iYnJva2VuIHBpcGUgdGVzdCIKKworZm9yIHAgaW4gMSAyOyBkbworCXRyYWNlICJwcm90b2NvbCAkcCIKKwlmb3IgaSBpbiAxIDIgMyA0OyBkbworCQkke1NTSH0gLSRwIC1GICRPQkovc3NoX2NvbmZpZ19jb25maWcgbmV4dGhvc3QgZWNobyAkaSAyPiAvZGV2L251bGwgfCB0cnVlCisJCXI9JD8KKwkJaWYgWyAkciAtbmUgMCBdOyB0aGVuCisJCQlmYWlsICJicm9rZW4gcGlwZSByZXR1cm5zICRyIGZvciBwcm90b2NvbCAkcCIKKwkJZmkKKwlkb25lCitkb25lCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvYnJva2Vua2V5cy5zaCBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9icm9rZW5rZXlzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNzBjMzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvYnJva2Vua2V5cy5zaApAQCAtMCwwICsxLDIzIEBACisjCSRPcGVuQlNEOiBicm9rZW5rZXlzLnNoLHYgMS4xIDIwMDQvMTAvMjkgMjM6NTk6MjIgZGptIEV4cCAkCisjCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KKwordGlkPSJicm9rZW4ga2V5cyIKKworS0VZUz0iJE9CSi9hdXRob3JpemVkX2tleXNfJHtVU0VSfSIKKworc3RhcnRfc3NoZAorCittdiAke0tFWVN9ICR7S0VZU30uYmFrCisKKyMgVHJ1bmNhdGVkIGtleQorZWNobyAic3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBQkl3QUFBSUVBQlRNPSBiYWQga2V5IiA+ICRLRVlTCitjYXQgJHtLRVlTfS5iYWsgPj4gJHtLRVlTfQorY2F0ICRPQkovJHQucHViID4+ICRPQkovYXV0aG9yaXplZF9rZXlzXyRVU0VSCisKKyR7U1NIfSAtMiAtRiAkT0JKL3NzaF9jb25maWcgc29tZWhvc3QgdHJ1ZQoraWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJZmFpbCAic3NoIGNvbm5lY3Qgd2l0aCBwcm90b2NvbCAkcCBmYWlsZWQiCitmaQorCittdiAke0tFWVN9LmJhayAke0tFWVN9CisKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy9ic2QucmVncmVzcy5tayBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9ic2QucmVncmVzcy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjgwMTFhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2JzZC5yZWdyZXNzLm1rCkBAIC0wLDAgKzEsNzkgQEAKKyMJJE9wZW5CU0Q6IGJzZC5yZWdyZXNzLm1rLHYgMS45IDIwMDIvMDIvMTcgMDE6MTA6MTUgbWFyYyBFeHAgJAorIyBObyBtYW4gcGFnZXMgZm9yIHJlZ3Jlc3Npb24gdGVzdHMuCitOT01BTj0KKworIyBObyBpbnN0YWxsYXRpb24uCitpbnN0YWxsOgorCisjIElmIFJFR1JFU1NUQVJHRVRTIGlzIGRlZmluZWQgYW5kIFBST0cgaXMgbm90IGRlZmluZWQsIHNldCBOT1BST0cKKy5pZiBkZWZpbmVkKFJFR1JFU1NUQVJHRVRTKSAmJiAhZGVmaW5lZChQUk9HKQorTk9QUk9HPQorLmVuZGlmCisKKy5pbmNsdWRlIDxic2QucHJvZy5taz4KKworLk1BSU46IGFsbAorYWxsOiByZWdyZXNzCisKKyMgWFhYIC0gTmVlZCBmdWxsIHBhdGggdG8gUkVHUkVTU0xPRywgb3RoZXJ3aXNlIHRoZXJlIHdpbGwgYmUgbXVjaCBwYWluLgorCitSRUdSRVNTTE9HPz0vZGV2L251bGwKK1JFR1JFU1NOQU1FPSR7LkNVUkRJUjpTLyR7QlNEU1JDRElSfVwvcmVncmVzc1wvLy99CisKKy5pZiBkZWZpbmVkKFBST0cpICYmICFlbXB0eShQUk9HKQorcnVuLXJlZ3Jlc3MtJHtQUk9HfTogJHtQUk9HfQorCS4vJHtQUk9HfQorLmVuZGlmCisKKy5pZiAhZGVmaW5lZChSRUdSRVNTVEFSR0VUUykKK1JFR1JFU1NUQVJHRVRTPXJ1bi1yZWdyZXNzLSR7UFJPR30KKy4gIGlmIGRlZmluZWQoUkVHUkVTU1NLSVApCitSRUdSRVNTU0tJUFRBUkdFVFM9cnVuLXJlZ3Jlc3MtJHtQUk9HfQorLiAgZW5kaWYKKy5lbmRpZgorCitSRUdSRVNTU0tJUFNMT1c/PW5vCisKKyMuaWYgKCR7UkVHUkVTU1NLSVBTTE9XOkx9ID09ICJ5ZXMiKSAmJiBkZWZpbmVkKFJFR1JFU1NTTE9XVEFSR0VUUykKKworLmlmICgke1JFR1JFU1NTS0lQU0xPV30gPT0gInllcyIpICYmIGRlZmluZWQoUkVHUkVTU1NMT1dUQVJHRVRTKQorUkVHUkVTU1NLSVBUQVJHRVRTKz0ke1JFR1JFU1NTTE9XVEFSR0VUU30KKy5lbmRpZgorCisuaWYgZGVmaW5lZChSRUdSRVNTUk9PVFRBUkdFVFMpCitST09UVVNFUiE9aWQgLWcKK1NVRE8/PQorLiBpZiAoJHtST09UVVNFUn0gIT0gMCkgJiYgZW1wdHkoU1VETykKK1JFR1JFU1NTS0lQVEFSR0VUUys9JHtSRUdSRVNTUk9PVFRBUkdFVFN9CisuIGVuZGlmCisuZW5kaWYKKworUkVHUkVTU1NLSVBUQVJHRVRTPz0KKworcmVncmVzczoKKy5mb3IgUlQgaW4gJHtSRUdSRVNTVEFSR0VUU30gCisuICBpZiAke1JFR1JFU1NTS0lQVEFSR0VUUzpNJHtSVH19CisJQGVjaG8gLW4gIlNLSVAgIiA+PiAke1JFR1JFU1NMT0d9CisuICBlbHNlCisjIFhYWCAtIHdlIG5lZWQgYSBiZXR0ZXIgbWV0aG9kIHRvIHNlZSBpZiBhIHRlc3QgZmFpbHMgZHVlIHRvIHRpbWVvdXQgb3IganVzdAorIyAgICAgICBub3JtYWwgZmFpbHVyZS4KKy4gICBpZiAhZGVmaW5lZChSRUdSRVNTTUFYVElNRSkKKwlAaWYgY2QgJHsuQ1VSRElSfSAmJiAke01BS0V9ICR7UlR9OyB0aGVuIFwKKwkgICAgZWNobyAtbiAiU1VDQ0VTUyAiID4+ICR7UkVHUkVTU0xPR30gOyBcCisJZWxzZSBcCisJICAgIGVjaG8gLW4gIkZBSUwgIiA+PiAke1JFR1JFU1NMT0d9IDsgXAorCSAgICBlY2hvIEZBSUxFRCA7IFwKKwlmaQorLiAgIGVsc2UKKwlAaWYgY2QgJHsuQ1VSRElSfSAmJiAodWxpbWl0IC10ICR7UkVHUkVTU01BWFRJTUV9IDsgJHtNQUtFfSAke1JUfSk7IHRoZW4gXAorCSAgICBlY2hvIC1uICJTVUNDRVNTICIgPj4gJHtSRUdSRVNTTE9HfSA7IFwKKwllbHNlIFwKKwkgICAgZWNobyAtbiAiRkFJTCAocG9zc2libGUgdGltZW91dCkgIiA+PiAke1JFR1JFU1NMT0d9IDsgXAorCSAgICBlY2hvIEZBSUxFRCA7IFwKKwlmaQorLiAgIGVuZGlmCisuICBlbmRpZgorCUBlY2hvICR7UkVHUkVTU05BTUV9LyR7UlQ6Uy9ecnVuLXJlZ3Jlc3MtLy99ID4+ICR7UkVHUkVTU0xPR30KKy5lbmRmb3IKKworLlBIT05ZOiByZWdyZXNzCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvY2VydC1ob3N0a2V5LnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2NlcnQtaG9zdGtleS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjE2YWJkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2NlcnQtaG9zdGtleS5zaApAQCAtMCwwICsxLDI1NiBAQAorIwkkT3BlbkJTRDogY2VydC1ob3N0a2V5LnNoLHYgMS42IDIwMTEvMDUvMjAgMDI6NDM6MzYgZGptIEV4cCAkCisjCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KKwordGlkPSJjZXJ0aWZpZWQgaG9zdCBrZXlzIgorCisjIHVzZWQgdG8gZGlzYWJsZSBFQ0MgYmFzZWQgdGVzdHMgb24gcGxhdGZvcm1zIHdpdGhvdXQgRUNDCitlY2RzYT0iIgoraWYgdGVzdCAieCRURVNUX1NTSF9FQ0MiID0gInh5ZXMiOyB0aGVuCisJZWNkc2E9ZWNkc2EKK2ZpCisKK3JtIC1mICRPQkova25vd25faG9zdHMtY2VydCAkT0JKL2hvc3RfY2Ffa2V5KiAkT0JKL2NlcnRfaG9zdF9rZXkqCitjcCAkT0JKL3NzaGRfcHJveHkgJE9CSi9zc2hkX3Byb3h5X2JhaworCitIT1NUUz0nbG9jYWxob3N0LXdpdGgtYWxpYXMsMTI3LjAuMC4xLDo6MScKKworIyBDcmVhdGUgYSBDQSBrZXkgYW5kIGFkZCBpdCB0byBrbm93biBob3N0cworJHtTU0hLRVlHRU59IC1xIC1OICcnIC10IHJzYSAgLWYgJE9CSi9ob3N0X2NhX2tleSB8fFwKKwlmYWlsICJzc2gta2V5Z2VuIG9mIGhvc3RfY2Ffa2V5IGZhaWxlZCIKKygKKwllY2hvbiAnQGNlcnQtYXV0aG9yaXR5ICcKKwllY2hvbiAiJEhPU1RTICIKKwljYXQgJE9CSi9ob3N0X2NhX2tleS5wdWIKKykgPiAkT0JKL2tub3duX2hvc3RzLWNlcnQKKworIyBHZW5lcmF0ZSBhbmQgc2lnbiBob3N0IGtleXMKK2ZvciBrdHlwZSBpbiByc2EgZHNhICRlY2RzYSA7IGRvIAorCXZlcmJvc2UgIiR0aWQ6IHNpZ24gaG9zdCAke2t0eXBlfSBjZXJ0IgorCSMgR2VuZXJhdGUgYW5kIHNpZ24gYSBob3N0IGtleQorCSR7U1NIS0VZR0VOfSAtcSAtTiAnJyAtdCAke2t0eXBlfSBcCisJICAgIC1mICRPQkovY2VydF9ob3N0X2tleV8ke2t0eXBlfSB8fCBcCisJCWZhaWwgInNzaC1rZXlnZW4gb2YgY2VydF9ob3N0X2tleV8ke2t0eXBlfSBmYWlsZWQiCisJJHtTU0hLRVlHRU59IC1oIC1xIC1zICRPQkovaG9zdF9jYV9rZXkgXAorCSAgICAtSSAicmVncmVzcyBob3N0IGtleSBmb3IgJFVTRVIiIFwKKwkgICAgLW4gJEhPU1RTICRPQkovY2VydF9ob3N0X2tleV8ke2t0eXBlfSB8fAorCQlmYWlsICJjb3VsZG4ndCBzaWduIGNlcnRfaG9zdF9rZXlfJHtrdHlwZX0iCisJIyB2MDAgZWNkc2EgY2VydHMgZG8gbm90IGV4aXN0CisJdGVzdCAiJHtrdHlwZX0iID0gImVjZHNhIiAmJiBjb250aW51ZQorCWNwICRPQkovY2VydF9ob3N0X2tleV8ke2t0eXBlfSAkT0JKL2NlcnRfaG9zdF9rZXlfJHtrdHlwZX1fdjAwCisJY3AgJE9CSi9jZXJ0X2hvc3Rfa2V5XyR7a3R5cGV9LnB1YiAkT0JKL2NlcnRfaG9zdF9rZXlfJHtrdHlwZX1fdjAwLnB1YgorCSR7U1NIS0VZR0VOfSAtdCB2MDAgLWggLXEgLXMgJE9CSi9ob3N0X2NhX2tleSBcCisJICAgIC1JICJyZWdyZXNzIGhvc3Qga2V5IGZvciAkVVNFUiIgXAorCSAgICAtbiAkSE9TVFMgJE9CSi9jZXJ0X2hvc3Rfa2V5XyR7a3R5cGV9X3YwMCB8fAorCQlmYWlsICJjb3VsZG4ndCBzaWduIGNlcnRfaG9zdF9rZXlfJHtrdHlwZX1fdjAwIgorZG9uZQorCisjIEJhc2ljIGNvbm5lY3QgdGVzdHMKK2ZvciBwcml2c2VwIGluIHllcyBubyA7IGRvCisJZm9yIGt0eXBlIGluIHJzYSBkc2EgJGVjZHNhIHJzYV92MDAgZHNhX3YwMDsgZG8gCisJCXZlcmJvc2UgIiR0aWQ6IGhvc3QgJHtrdHlwZX0gY2VydCBjb25uZWN0IHByaXZzZXAgJHByaXZzZXAiCisJCSgKKwkJCWNhdCAkT0JKL3NzaGRfcHJveHlfYmFrCisJCQllY2hvIEhvc3RLZXkgJE9CSi9jZXJ0X2hvc3Rfa2V5XyR7a3R5cGV9CisJCQllY2hvIEhvc3RDZXJ0aWZpY2F0ZSAkT0JKL2NlcnRfaG9zdF9rZXlfJHtrdHlwZX0tY2VydC5wdWIKKwkJCWVjaG8gVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiAkcHJpdnNlcAorCQkpID4gJE9CSi9zc2hkX3Byb3h5CisKKwkJJHtTU0h9IC0yIC1vVXNlcktub3duSG9zdHNGaWxlPSRPQkova25vd25faG9zdHMtY2VydCBcCisJCSAgICAtb0dsb2JhbEtub3duSG9zdHNGaWxlPSRPQkova25vd25faG9zdHMtY2VydCBcCisJCQktRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCB0cnVlCisJCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCQkJZmFpbCAic3NoIGNlcnQgY29ubmVjdCBmYWlsZWQiCisJCWZpCisJZG9uZQorZG9uZQorCisjIFJldm9rZWQgY2VydGlmaWNhdGVzIHdpdGgga2V5IHByZXNlbnQKKygKKwllY2hvbiAnQGNlcnQtYXV0aG9yaXR5ICcKKwllY2hvbiAiJEhPU1RTICIKKwljYXQgJE9CSi9ob3N0X2NhX2tleS5wdWIKKwllY2hvbiAnQHJldm9rZWQgJworCWVjaG9uICIqICIKKwljYXQgJE9CSi9jZXJ0X2hvc3Rfa2V5X3JzYS5wdWIKKwlpZiB0ZXN0ICJ4JFRFU1RfU1NIX0VDQyIgPSAieHllcyI7IHRoZW4KKwkJZWNob24gJ0ByZXZva2VkICcKKwkJZWNob24gIiogIgorCQljYXQgJE9CSi9jZXJ0X2hvc3Rfa2V5X2VjZHNhLnB1YgorCWZpCisJZWNob24gJ0ByZXZva2VkICcKKwllY2hvbiAiKiAiCisJY2F0ICRPQkovY2VydF9ob3N0X2tleV9kc2EucHViCisJZWNob24gJ0ByZXZva2VkICcKKwllY2hvbiAiKiAiCisJY2F0ICRPQkovY2VydF9ob3N0X2tleV9yc2FfdjAwLnB1YgorCWVjaG9uICdAcmV2b2tlZCAnCisJZWNob24gIiogIgorCWNhdCAkT0JKL2NlcnRfaG9zdF9rZXlfZHNhX3YwMC5wdWIKKykgPiAkT0JKL2tub3duX2hvc3RzLWNlcnQKK2ZvciBwcml2c2VwIGluIHllcyBubyA7IGRvCisJZm9yIGt0eXBlIGluIHJzYSBkc2EgJGVjZHNhIHJzYV92MDAgZHNhX3YwMDsgZG8gCisJCXZlcmJvc2UgIiR0aWQ6IGhvc3QgJHtrdHlwZX0gcmV2b2tlZCBjZXJ0IHByaXZzZXAgJHByaXZzZXAiCisJCSgKKwkJCWNhdCAkT0JKL3NzaGRfcHJveHlfYmFrCisJCQllY2hvIEhvc3RLZXkgJE9CSi9jZXJ0X2hvc3Rfa2V5XyR7a3R5cGV9CisJCQllY2hvIEhvc3RDZXJ0aWZpY2F0ZSAkT0JKL2NlcnRfaG9zdF9rZXlfJHtrdHlwZX0tY2VydC5wdWIKKwkJCWVjaG8gVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiAkcHJpdnNlcAorCQkpID4gJE9CSi9zc2hkX3Byb3h5CisKKwkJJHtTU0h9IC0yIC1vVXNlcktub3duSG9zdHNGaWxlPSRPQkova25vd25faG9zdHMtY2VydCBcCisJCSAgICAtb0dsb2JhbEtub3duSG9zdHNGaWxlPSRPQkova25vd25faG9zdHMtY2VydCBcCisJCQktRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCB0cnVlID4vZGV2L251bGwgMj4mMQorCQlpZiBbICQ/IC1lcSAwIF07IHRoZW4KKwkJCWZhaWwgInNzaCBjZXJ0IGNvbm5lY3Qgc3VjY2VlZGVkIHVuZXhwZWN0ZWRseSIKKwkJZmkKKwlkb25lCitkb25lCisKKyMgUmV2b2tlZCBDQQorKAorCWVjaG9uICdAY2VydC1hdXRob3JpdHkgJworCWVjaG9uICIkSE9TVFMgIgorCWNhdCAkT0JKL2hvc3RfY2Ffa2V5LnB1YgorCWVjaG9uICdAcmV2b2tlZCAnCisJZWNob24gIiogIgorCWNhdCAkT0JKL2hvc3RfY2Ffa2V5LnB1YgorKSA+ICRPQkova25vd25faG9zdHMtY2VydAorZm9yIGt0eXBlIGluIHJzYSBkc2EgJGVjZHNhIHJzYV92MDAgZHNhX3YwMCA7IGRvIAorCXZlcmJvc2UgIiR0aWQ6IGhvc3QgJHtrdHlwZX0gcmV2b2tlZCBjZXJ0IgorCSgKKwkJY2F0ICRPQkovc3NoZF9wcm94eV9iYWsKKwkJZWNobyBIb3N0S2V5ICRPQkovY2VydF9ob3N0X2tleV8ke2t0eXBlfQorCQllY2hvIEhvc3RDZXJ0aWZpY2F0ZSAkT0JKL2NlcnRfaG9zdF9rZXlfJHtrdHlwZX0tY2VydC5wdWIKKwkpID4gJE9CSi9zc2hkX3Byb3h5CisJJHtTU0h9IC0yIC1vVXNlcktub3duSG9zdHNGaWxlPSRPQkova25vd25faG9zdHMtY2VydCBcCisJICAgIC1vR2xvYmFsS25vd25Ib3N0c0ZpbGU9JE9CSi9rbm93bl9ob3N0cy1jZXJ0IFwKKwkJLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgdHJ1ZSA+L2Rldi9udWxsIDI+JjEKKwlpZiBbICQ/IC1lcSAwIF07IHRoZW4KKwkJZmFpbCAic3NoIGNlcnQgY29ubmVjdCBzdWNjZWVkZWQgdW5leHBlY3RlZGx5IgorCWZpCitkb25lCisKKyMgQ3JlYXRlIGEgQ0Ega2V5IGFuZCBhZGQgaXQgdG8ga25vd24gaG9zdHMKKygKKwllY2hvbiAnQGNlcnQtYXV0aG9yaXR5ICcKKwllY2hvbiAiJEhPU1RTICIKKwljYXQgJE9CSi9ob3N0X2NhX2tleS5wdWIKKykgPiAkT0JKL2tub3duX2hvc3RzLWNlcnQKKwordGVzdF9vbmUoKSB7CisJaWRlbnQ9JDEKKwlyZXN1bHQ9JDIKKwlzaWduX29wdHM9JDMKKworCWZvciBrdCBpbiByc2EgcnNhX3YwMCA7IGRvCisJCWNhc2UgJGt0IGluCisJCSpfdjAwKSBhcmdzPSItdCB2MDAiIDs7CisJCSopIGFyZ3M9IiIgOzsKKwkJZXNhYworCisJCXZlcmJvc2UgIiR0aWQ6IGhvc3QgY2VydCBjb25uZWN0ICRpZGVudCAka3QgZXhwZWN0ICRyZXN1bHQiCisJCSR7U1NIS0VZR0VOfSAtcSAtcyAkT0JKL2hvc3RfY2Ffa2V5IFwKKwkJICAgIC1JICJyZWdyZXNzIGhvc3Qga2V5IGZvciAkVVNFUiIgXAorCQkgICAgJHNpZ25fb3B0cyAkYXJncyBcCisJCSAgICAkT0JKL2NlcnRfaG9zdF9rZXlfJHtrdH0gfHwKKwkJCWZhaWwgImNvdWxkbid0IHNpZ24gY2VydF9ob3N0X2tleV8ke2t0fSIKKwkJKAorCQkJY2F0ICRPQkovc3NoZF9wcm94eV9iYWsKKwkJCWVjaG8gSG9zdEtleSAkT0JKL2NlcnRfaG9zdF9rZXlfJHtrdH0KKwkJCWVjaG8gSG9zdENlcnRpZmljYXRlICRPQkovY2VydF9ob3N0X2tleV8ke2t0fS1jZXJ0LnB1YgorCQkpID4gJE9CSi9zc2hkX3Byb3h5CisJCisJCSR7U1NIfSAtMiAtb1VzZXJLbm93bkhvc3RzRmlsZT0kT0JKL2tub3duX2hvc3RzLWNlcnQgXAorCQkgICAgLW9HbG9iYWxLbm93bkhvc3RzRmlsZT0kT0JKL2tub3duX2hvc3RzLWNlcnQgXAorCQkgICAgLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgdHJ1ZSA+L2Rldi9udWxsIDI+JjEKKwkJcmM9JD8KKwkJaWYgWyAieCRyZXN1bHQiID0gInhzdWNjZXNzIiBdIDsgdGhlbgorCQkJaWYgWyAkcmMgLW5lIDAgXTsgdGhlbgorCQkJCWZhaWwgInNzaCBjZXJ0IGNvbm5lY3QgJGlkZW50IGZhaWxlZCB1bmV4cGVjdGVkbHkiCisJCQlmaQorCQllbHNlCisJCQlpZiBbICRyYyAtZXEgMCBdOyB0aGVuCisJCQkJZmFpbCAic3NoIGNlcnQgY29ubmVjdCAkaWRlbnQgc3VjY2VlZGVkIHVuZXhwZWN0ZWRseSIKKwkJCWZpCisJCWZpCisJZG9uZQorfQorCit0ZXN0X29uZSAidXNlci1jZXJ0aWZpY2F0ZSIJZmFpbHVyZSAiLW4gJEhPU1RTIgordGVzdF9vbmUgImVtcHR5IHByaW5jaXBhbHMiCXN1Y2Nlc3MgIi1oIgordGVzdF9vbmUgIndyb25nIHByaW5jaXBhbHMiCWZhaWx1cmUgIi1oIC1uIGZvbyIKK3Rlc3Rfb25lICJjZXJ0IG5vdCB5ZXQgdmFsaWQiCWZhaWx1cmUgIi1oIC1WMjAyMDAxMDE6MjAzMDAxMDEiCit0ZXN0X29uZSAiY2VydCBleHBpcmVkIgkJZmFpbHVyZSAiLWggLVYxOTgwMDEwMToxOTkwMDEwMSIKK3Rlc3Rfb25lICJjZXJ0IHZhbGlkIGludGVydmFsIglzdWNjZXNzICItaCAtVi0xdzorMnciCit0ZXN0X29uZSAiY2VydCBoYXMgY29uc3RyYWludHMiCWZhaWx1cmUgIi1oIC1PZm9yY2UtY29tbWFuZD1mYWxzZSIKKworIyBDaGVjayBkb3duZ3JhZGUgb2YgY2VydCB0byByYXcga2V5IHdoZW4gbm8gQ0EgZm91bmQKK2ZvciB2IGluIHYwMSB2MDAgOyAgZG8gCisJZm9yIGt0eXBlIGluIHJzYSBkc2EgJGVjZHNhIDsgZG8gCisJCSMgdjAwIGVjZHNhIGNlcnRzIGRvIG5vdCBleGlzdC4KKwkJdGVzdCAiJHt2fSR7a3R5cGV9IiA9ICJ2MDBlY2RzYSIgJiYgY29udGludWUKKwkJcm0gLWYgJE9CSi9rbm93bl9ob3N0cy1jZXJ0ICRPQkovY2VydF9ob3N0X2tleSoKKwkJdmVyYm9zZSAiJHRpZDogaG9zdCAke2t0eXBlfSAke3Z9IGNlcnQgZG93bmdyYWRlIHRvIHJhdyBrZXkiCisJCSMgR2VuZXJhdGUgYW5kIHNpZ24gYSBob3N0IGtleQorCQkke1NTSEtFWUdFTn0gLXEgLU4gJycgLXQgJHtrdHlwZX0gXAorCQkgICAgLWYgJE9CSi9jZXJ0X2hvc3Rfa2V5XyR7a3R5cGV9IHx8IFwKKwkJCWZhaWwgInNzaC1rZXlnZW4gb2YgY2VydF9ob3N0X2tleV8ke2t0eXBlfSBmYWlsZWQiCisJCSR7U1NIS0VZR0VOfSAtdCAke3Z9IC1oIC1xIC1zICRPQkovaG9zdF9jYV9rZXkgXAorCQkgICAgLUkgInJlZ3Jlc3MgaG9zdCBrZXkgZm9yICRVU0VSIiBcCisJCSAgICAtbiAkSE9TVFMgJE9CSi9jZXJ0X2hvc3Rfa2V5XyR7a3R5cGV9IHx8CisJCQlmYWlsICJjb3VsZG4ndCBzaWduIGNlcnRfaG9zdF9rZXlfJHtrdHlwZX0iCisJCSgKKwkJCWVjaG9uICIkSE9TVFMgIgorCQkJY2F0ICRPQkovY2VydF9ob3N0X2tleV8ke2t0eXBlfS5wdWIKKwkJKSA+ICRPQkova25vd25faG9zdHMtY2VydAorCQkoCisJCQljYXQgJE9CSi9zc2hkX3Byb3h5X2JhaworCQkJZWNobyBIb3N0S2V5ICRPQkovY2VydF9ob3N0X2tleV8ke2t0eXBlfQorCQkJZWNobyBIb3N0Q2VydGlmaWNhdGUgJE9CSi9jZXJ0X2hvc3Rfa2V5XyR7a3R5cGV9LWNlcnQucHViCisJCSkgPiAkT0JKL3NzaGRfcHJveHkKKwkJCisJCSR7U1NIfSAtMiAtb1VzZXJLbm93bkhvc3RzRmlsZT0kT0JKL2tub3duX2hvc3RzLWNlcnQgXAorCQkgICAgLW9HbG9iYWxLbm93bkhvc3RzRmlsZT0kT0JKL2tub3duX2hvc3RzLWNlcnQgXAorCQkJLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgdHJ1ZQorCQlpZiBbICQ/IC1uZSAwIF07IHRoZW4KKwkJCWZhaWwgInNzaCBjZXJ0IGNvbm5lY3QgZmFpbGVkIgorCQlmaQorCWRvbmUKK2RvbmUKKworIyBXcm9uZyBjZXJ0aWZpY2F0ZQorKAorCWVjaG9uICdAY2VydC1hdXRob3JpdHkgJworCWVjaG9uICIkSE9TVFMgIgorCWNhdCAkT0JKL2hvc3RfY2Ffa2V5LnB1YgorKSA+ICRPQkova25vd25faG9zdHMtY2VydAorZm9yIHYgaW4gdjAxIHYwMCA7ICBkbyAKKwlmb3Iga3QgaW4gcnNhIGRzYSAkZWNkc2EgOyBkbyAKKwkJIyB2MDAgZWNkc2EgY2VydHMgZG8gbm90IGV4aXN0LgorCQl0ZXN0ICIke3Z9JHtrdHlwZX0iID0gInYwMGVjZHNhIiAmJiBjb250aW51ZQorCQlybSAtZiAkT0JKL2NlcnRfaG9zdF9rZXkqCisJCSMgU2VsZi1zaWduIGtleQorCQkke1NTSEtFWUdFTn0gLXEgLU4gJycgLXQgJHtrdH0gXAorCQkgICAgLWYgJE9CSi9jZXJ0X2hvc3Rfa2V5XyR7a3R9IHx8IFwKKwkJCWZhaWwgInNzaC1rZXlnZW4gb2YgY2VydF9ob3N0X2tleV8ke2t0fSBmYWlsZWQiCisJCSR7U1NIS0VZR0VOfSAtdCAke3Z9IC1oIC1xIC1zICRPQkovY2VydF9ob3N0X2tleV8ke2t0fSBcCisJCSAgICAtSSAicmVncmVzcyBob3N0IGtleSBmb3IgJFVTRVIiIFwKKwkJICAgIC1uICRIT1NUUyAkT0JKL2NlcnRfaG9zdF9rZXlfJHtrdH0gfHwKKwkJCWZhaWwgImNvdWxkbid0IHNpZ24gY2VydF9ob3N0X2tleV8ke2t0fSIKKwkJdmVyYm9zZSAiJHRpZDogaG9zdCAke2t0fSBjb25uZWN0IHdyb25nIGNlcnQiCisJCSgKKwkJCWNhdCAkT0JKL3NzaGRfcHJveHlfYmFrCisJCQllY2hvIEhvc3RLZXkgJE9CSi9jZXJ0X2hvc3Rfa2V5XyR7a3R9CisJCQllY2hvIEhvc3RDZXJ0aWZpY2F0ZSAkT0JKL2NlcnRfaG9zdF9rZXlfJHtrdH0tY2VydC5wdWIKKwkJKSA+ICRPQkovc3NoZF9wcm94eQorCQorCQkke1NTSH0gLTIgLW9Vc2VyS25vd25Ib3N0c0ZpbGU9JE9CSi9rbm93bl9ob3N0cy1jZXJ0IFwKKwkJICAgIC1vR2xvYmFsS25vd25Ib3N0c0ZpbGU9JE9CSi9rbm93bl9ob3N0cy1jZXJ0IFwKKwkJCS1GICRPQkovc3NoX3Byb3h5IC1xIHNvbWVob3N0IHRydWUgPi9kZXYvbnVsbCAyPiYxCisJCWlmIFsgJD8gLWVxIDAgXTsgdGhlbgorCQkJZmFpbCAic3NoIGNlcnQgY29ubmVjdCAkaWRlbnQgc3VjY2VlZGVkIHVuZXhwZWN0ZWRseSIKKwkJZmkKKwlkb25lCitkb25lCisKK3JtIC1mICRPQkova25vd25faG9zdHMtY2VydCAkT0JKL2hvc3RfY2Ffa2V5KiAkT0JKL2NlcnRfaG9zdF9rZXkqCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvY2VydC11c2Vya2V5LnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2NlcnQtdXNlcmtleS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzAwZGIyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2NlcnQtdXNlcmtleS5zaApAQCAtMCwwICsxLDMzOCBAQAorIwkkT3BlbkJTRDogY2VydC11c2Vya2V5LnNoLHYgMS44IDIwMTEvMDUvMTcgMDc6MTM6MzEgZGptIEV4cCAkCisjCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KKwordGlkPSJjZXJ0aWZpZWQgdXNlciBrZXlzIgorCisjIHVzZWQgdG8gZGlzYWJsZSBFQ0MgYmFzZWQgdGVzdHMgb24gcGxhdGZvcm1zIHdpdGhvdXQgRUNDCitlY2RzYT0iIgoraWYgdGVzdCAieCRURVNUX1NTSF9FQ0MiID0gInh5ZXMiOyB0aGVuCisJZWNkc2E9ZWNkc2EKK2ZpCisKK3JtIC1mICRPQkovYXV0aG9yaXplZF9rZXlzXyRVU0VSICRPQkovdXNlcl9jYV9rZXkqICRPQkovY2VydF91c2VyX2tleSoKK2NwICRPQkovc3NoZF9wcm94eSAkT0JKL3NzaGRfcHJveHlfYmFrCisKKyMgQ3JlYXRlIGEgQ0Ega2V5Ciske1NTSEtFWUdFTn0gLXEgLU4gJycgLXQgcnNhICAtZiAkT0JKL3VzZXJfY2Ffa2V5IHx8XAorCWZhaWwgInNzaC1rZXlnZW4gb2YgdXNlcl9jYV9rZXkgZmFpbGVkIgorCisjIEdlbmVyYXRlIGFuZCBzaWduIHVzZXIga2V5cworZm9yIGt0eXBlIGluIHJzYSBkc2EgJGVjZHNhIDsgZG8gCisJdmVyYm9zZSAiJHRpZDogc2lnbiB1c2VyICR7a3R5cGV9IGNlcnQiCisJJHtTU0hLRVlHRU59IC1xIC1OICcnIC10ICR7a3R5cGV9IFwKKwkgICAgLWYgJE9CSi9jZXJ0X3VzZXJfa2V5XyR7a3R5cGV9IHx8IFwKKwkJZmFpbCAic3NoLWtleWdlbiBvZiBjZXJ0X3VzZXJfa2V5XyR7a3R5cGV9IGZhaWxlZCIKKwkke1NTSEtFWUdFTn0gLXEgLXMgJE9CSi91c2VyX2NhX2tleSAtSSBcCisJICAgICJyZWdyZXNzIHVzZXIga2V5IGZvciAkVVNFUiIgXAorCSAgICAtbiAke1VTRVJ9LG1la21pdGFzZGlnb2F0ICRPQkovY2VydF91c2VyX2tleV8ke2t0eXBlfSB8fAorCQlmYWlsICJjb3VsZG4ndCBzaWduIGNlcnRfdXNlcl9rZXlfJHtrdHlwZX0iCisJIyB2MDAgZWNkc2EgY2VydHMgZG8gbm90IGV4aXN0CisJdGVzdCAiJHtrdHlwZX0iID0gImVjZHNhIiAmJiBjb250aW51ZQorCWNwICRPQkovY2VydF91c2VyX2tleV8ke2t0eXBlfSAkT0JKL2NlcnRfdXNlcl9rZXlfJHtrdHlwZX1fdjAwCisJY3AgJE9CSi9jZXJ0X3VzZXJfa2V5XyR7a3R5cGV9LnB1YiAkT0JKL2NlcnRfdXNlcl9rZXlfJHtrdHlwZX1fdjAwLnB1YgorCSR7U1NIS0VZR0VOfSAtcSAtdCB2MDAgLXMgJE9CSi91c2VyX2NhX2tleSAtSSBcCisJICAgICJyZWdyZXNzIHVzZXIga2V5IGZvciAkVVNFUiIgXAorCSAgICAtbiAke1VTRVJ9LG1la21pdGFzZGlnb2F0ICRPQkovY2VydF91c2VyX2tleV8ke2t0eXBlfV92MDAgfHwKKwkJZmFpbCAiY291bGRuJ3Qgc2lnbiBjZXJ0X3VzZXJfa2V5XyR7a3R5cGV9X3YwMCIKK2RvbmUKKworIyBUZXN0IGV4cGxpY2l0bHktc3BlY2lmaWVkIHByaW5jaXBhbHMKK2ZvciBrdHlwZSBpbiByc2EgZHNhICRlY2RzYSByc2FfdjAwIGRzYV92MDAgOyBkbyAKKwlmb3IgcHJpdnNlcCBpbiB5ZXMgbm8gOyBkbworCQlfcHJlZml4PSIke2t0eXBlfSBwcml2c2VwICRwcml2c2VwIgorCisJCSMgU2V0dXAgZm9yIEF1dGhvcml6ZWRQcmluY2lwYWxzRmlsZQorCQlybSAtZiAkT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgorCQkoCisJCQljYXQgJE9CSi9zc2hkX3Byb3h5X2JhaworCQkJZWNobyAiVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiAkcHJpdnNlcCIKKwkJCWVjaG8gIkF1dGhvcml6ZWRQcmluY2lwYWxzRmlsZSAiIFwKKwkJCSAgICAiJE9CSi9hdXRob3JpemVkX3ByaW5jaXBhbHNfJXUiCisJCQllY2hvICJUcnVzdGVkVXNlckNBS2V5cyAkT0JKL3VzZXJfY2Ffa2V5LnB1YiIKKwkJKSA+ICRPQkovc3NoZF9wcm94eQorCisJCSMgTWlzc2luZyBhdXRob3JpemVkX3ByaW5jaXBhbHMKKwkJdmVyYm9zZSAiJHRpZDogJHtfcHJlZml4fSBtaXNzaW5nIGF1dGhvcml6ZWRfcHJpbmNpcGFscyIKKwkJcm0gLWYgJE9CSi9hdXRob3JpemVkX3ByaW5jaXBhbHNfJFVTRVIKKwkJJHtTU0h9IC0yaSAkT0JKL2NlcnRfdXNlcl9rZXlfJHtrdHlwZX0gXAorCQkgICAgLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgdHJ1ZSA+L2Rldi9udWxsIDI+JjEKKwkJaWYgWyAkPyAtZXEgMCBdOyB0aGVuCisJCQlmYWlsICJzc2ggY2VydCBjb25uZWN0IHN1Y2NlZWRlZCB1bmV4cGVjdGVkbHkiCisJCWZpCisKKwkJIyBFbXB0eSBhdXRob3JpemVkX3ByaW5jaXBhbHMKKwkJdmVyYm9zZSAiJHRpZDogJHtfcHJlZml4fSBlbXB0eSBhdXRob3JpemVkX3ByaW5jaXBhbHMiCisJCWVjaG8gPiAkT0JKL2F1dGhvcml6ZWRfcHJpbmNpcGFsc18kVVNFUgorCQkke1NTSH0gLTJpICRPQkovY2VydF91c2VyX2tleV8ke2t0eXBlfSBcCisJCSAgICAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCB0cnVlID4vZGV2L251bGwgMj4mMQorCQlpZiBbICQ/IC1lcSAwIF07IHRoZW4KKwkJCWZhaWwgInNzaCBjZXJ0IGNvbm5lY3Qgc3VjY2VlZGVkIHVuZXhwZWN0ZWRseSIKKwkJZmkKKwkKKwkJIyBXcm9uZyBhdXRob3JpemVkX3ByaW5jaXBhbHMKKwkJdmVyYm9zZSAiJHRpZDogJHtfcHJlZml4fSB3cm9uZyBhdXRob3JpemVkX3ByaW5jaXBhbHMiCisJCWVjaG8gZ3JlZ29yc2Ftc2EgPiAkT0JKL2F1dGhvcml6ZWRfcHJpbmNpcGFsc18kVVNFUgorCQkke1NTSH0gLTJpICRPQkovY2VydF91c2VyX2tleV8ke2t0eXBlfSBcCisJCSAgICAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCB0cnVlID4vZGV2L251bGwgMj4mMQorCQlpZiBbICQ/IC1lcSAwIF07IHRoZW4KKwkJCWZhaWwgInNzaCBjZXJ0IGNvbm5lY3Qgc3VjY2VlZGVkIHVuZXhwZWN0ZWRseSIKKwkJZmkKKworCQkjIENvcnJlY3QgYXV0aG9yaXplZF9wcmluY2lwYWxzCisJCXZlcmJvc2UgIiR0aWQ6ICR7X3ByZWZpeH0gY29ycmVjdCBhdXRob3JpemVkX3ByaW5jaXBhbHMiCisJCWVjaG8gbWVrbWl0YXNkaWdvYXQgPiAkT0JKL2F1dGhvcml6ZWRfcHJpbmNpcGFsc18kVVNFUgorCQkke1NTSH0gLTJpICRPQkovY2VydF91c2VyX2tleV8ke2t0eXBlfSBcCisJCSAgICAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCB0cnVlID4vZGV2L251bGwgMj4mMQorCQlpZiBbICQ/IC1uZSAwIF07IHRoZW4KKwkJCWZhaWwgInNzaCBjZXJ0IGNvbm5lY3QgZmFpbGVkIgorCQlmaQorCisJCSMgYXV0aG9yaXplZF9wcmluY2lwYWxzIHdpdGggYmFkIGtleSBvcHRpb24KKwkJdmVyYm9zZSAiJHRpZDogJHtfcHJlZml4fSBhdXRob3JpemVkX3ByaW5jaXBhbHMgYmFkIGtleSBvcHQiCisJCWVjaG8gJ2JsYWggbWVrbWl0YXNkaWdvYXQnID4gJE9CSi9hdXRob3JpemVkX3ByaW5jaXBhbHNfJFVTRVIKKwkJJHtTU0h9IC0yaSAkT0JKL2NlcnRfdXNlcl9rZXlfJHtrdHlwZX0gXAorCQkgICAgLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgdHJ1ZSA+L2Rldi9udWxsIDI+JjEKKwkJaWYgWyAkPyAtZXEgMCBdOyB0aGVuCisJCQlmYWlsICJzc2ggY2VydCBjb25uZWN0IHN1Y2NlZWRlZCB1bmV4cGVjdGVkbHkiCisJCWZpCisKKwkJIyBhdXRob3JpemVkX3ByaW5jaXBhbHMgd2l0aCBjb21tYW5kPWZhbHNlCisJCXZlcmJvc2UgIiR0aWQ6ICR7X3ByZWZpeH0gYXV0aG9yaXplZF9wcmluY2lwYWxzIGNvbW1hbmQ9ZmFsc2UiCisJCWVjaG8gJ2NvbW1hbmQ9ImZhbHNlIiBtZWttaXRhc2RpZ29hdCcgPiBcCisJCSAgICAkT0JKL2F1dGhvcml6ZWRfcHJpbmNpcGFsc18kVVNFUgorCQkke1NTSH0gLTJpICRPQkovY2VydF91c2VyX2tleV8ke2t0eXBlfSBcCisJCSAgICAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCB0cnVlID4vZGV2L251bGwgMj4mMQorCQlpZiBbICQ/IC1lcSAwIF07IHRoZW4KKwkJCWZhaWwgInNzaCBjZXJ0IGNvbm5lY3Qgc3VjY2VlZGVkIHVuZXhwZWN0ZWRseSIKKwkJZmkKKworCisJCSMgYXV0aG9yaXplZF9wcmluY2lwYWxzIHdpdGggY29tbWFuZD10cnVlCisJCXZlcmJvc2UgIiR0aWQ6ICR7X3ByZWZpeH0gYXV0aG9yaXplZF9wcmluY2lwYWxzIGNvbW1hbmQ9dHJ1ZSIKKwkJZWNobyAnY29tbWFuZD0idHJ1ZSIgbWVrbWl0YXNkaWdvYXQnID4gXAorCQkgICAgJE9CSi9hdXRob3JpemVkX3ByaW5jaXBhbHNfJFVTRVIKKwkJJHtTU0h9IC0yaSAkT0JKL2NlcnRfdXNlcl9rZXlfJHtrdHlwZX0gXAorCQkgICAgLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgZmFsc2UgPi9kZXYvbnVsbCAyPiYxCisJCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCQkJZmFpbCAic3NoIGNlcnQgY29ubmVjdCBmYWlsZWQiCisJCWZpCisKKwkJIyBTZXR1cCBmb3IgcHJpbmNpcGFscz0ga2V5IG9wdGlvbgorCQlybSAtZiAkT0JKL2F1dGhvcml6ZWRfcHJpbmNpcGFsc18kVVNFUgorCQkoCisJCQljYXQgJE9CSi9zc2hkX3Byb3h5X2JhaworCQkJZWNobyAiVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiAkcHJpdnNlcCIKKwkJKSA+ICRPQkovc3NoZF9wcm94eQorCisJCSMgV3JvbmcgcHJpbmNpcGFscyBsaXN0CisJCXZlcmJvc2UgIiR0aWQ6ICR7X3ByZWZpeH0gd3JvbmcgcHJpbmNpcGFscyBrZXkgb3B0aW9uIgorCQkoCisJCQllY2hvbiAnY2VydC1hdXRob3JpdHkscHJpbmNpcGFscz0iZ3JlZ29yc2Ftc2EiICcKKwkJCWNhdCAkT0JKL3VzZXJfY2Ffa2V5LnB1YgorCQkpID4gJE9CSi9hdXRob3JpemVkX2tleXNfJFVTRVIKKwkJJHtTU0h9IC0yaSAkT0JKL2NlcnRfdXNlcl9rZXlfJHtrdHlwZX0gXAorCQkgICAgLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgdHJ1ZSA+L2Rldi9udWxsIDI+JjEKKwkJaWYgWyAkPyAtZXEgMCBdOyB0aGVuCisJCQlmYWlsICJzc2ggY2VydCBjb25uZWN0IHN1Y2NlZWRlZCB1bmV4cGVjdGVkbHkiCisJCWZpCisKKwkJIyBDb3JyZWN0IHByaW5jaXBhbHMgbGlzdAorCQl2ZXJib3NlICIkdGlkOiAke19wcmVmaXh9IGNvcnJlY3QgcHJpbmNpcGFscyBrZXkgb3B0aW9uIgorCQkoCisJCQllY2hvbiAnY2VydC1hdXRob3JpdHkscHJpbmNpcGFscz0ibWVrbWl0YXNkaWdvYXQiICcKKwkJCWNhdCAkT0JKL3VzZXJfY2Ffa2V5LnB1YgorCQkpID4gJE9CSi9hdXRob3JpemVkX2tleXNfJFVTRVIKKwkJJHtTU0h9IC0yaSAkT0JKL2NlcnRfdXNlcl9rZXlfJHtrdHlwZX0gXAorCQkgICAgLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgdHJ1ZSA+L2Rldi9udWxsIDI+JjEKKwkJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJCQlmYWlsICJzc2ggY2VydCBjb25uZWN0IGZhaWxlZCIKKwkJZmkKKwlkb25lCitkb25lCisKK2Jhc2ljX3Rlc3RzKCkgeworCWF1dGg9JDEKKwlpZiB0ZXN0ICJ4JGF1dGgiID0gInhhdXRob3JpemVkX2tleXMiIDsgdGhlbgorCQkjIEFkZCBDQSB0byBhdXRob3JpemVkX2tleXMKKwkJKAorCQkJZWNob24gJ2NlcnQtYXV0aG9yaXR5ICcKKwkJCWNhdCAkT0JKL3VzZXJfY2Ffa2V5LnB1YgorCQkpID4gJE9CSi9hdXRob3JpemVkX2tleXNfJFVTRVIKKwllbHNlCisJCWVjaG8gPiAkT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgorCQlleHRyYV9zc2hkPSJUcnVzdGVkVXNlckNBS2V5cyAkT0JKL3VzZXJfY2Ffa2V5LnB1YiIKKwlmaQorCQorCWZvciBrdHlwZSBpbiByc2EgZHNhICRlY2RzYSByc2FfdjAwIGRzYV92MDAgOyBkbyAKKwkJZm9yIHByaXZzZXAgaW4geWVzIG5vIDsgZG8KKwkJCV9wcmVmaXg9IiR7a3R5cGV9IHByaXZzZXAgJHByaXZzZXAgJGF1dGgiCisJCQkjIFNpbXBsZSBjb25uZWN0CisJCQl2ZXJib3NlICIkdGlkOiAke19wcmVmaXh9IGNvbm5lY3QiCisJCQkoCisJCQkJY2F0ICRPQkovc3NoZF9wcm94eV9iYWsKKwkJCQllY2hvICJVc2VQcml2aWxlZ2VTZXBhcmF0aW9uICRwcml2c2VwIgorCQkJCWVjaG8gIiRleHRyYV9zc2hkIgorCQkJKSA+ICRPQkovc3NoZF9wcm94eQorCQorCQkJJHtTU0h9IC0yaSAkT0JKL2NlcnRfdXNlcl9rZXlfJHtrdHlwZX0gXAorCQkJICAgIC1GICRPQkovc3NoX3Byb3h5IHNvbWVob3N0IHRydWUKKwkJCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCQkJCWZhaWwgInNzaCBjZXJ0IGNvbm5lY3QgZmFpbGVkIgorCQkJZmkKKworCQkJIyBSZXZva2VkIGtleXMKKwkJCXZlcmJvc2UgIiR0aWQ6ICR7X3ByZWZpeH0gcmV2b2tlZCBrZXkiCisJCQkoCisJCQkJY2F0ICRPQkovc3NoZF9wcm94eV9iYWsKKwkJCQllY2hvICJVc2VQcml2aWxlZ2VTZXBhcmF0aW9uICRwcml2c2VwIgorCQkJCWVjaG8gIlJldm9rZWRLZXlzICRPQkovY2VydF91c2VyX2tleV8ke2t0eXBlfS5wdWIiCisJCQkJZWNobyAiJGV4dHJhX3NzaGQiCisJCQkpID4gJE9CSi9zc2hkX3Byb3h5CisJCQkke1NTSH0gLTJpICRPQkovY2VydF91c2VyX2tleV8ke2t0eXBlfSBcCisJCQkgICAgLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgdHJ1ZSA+L2Rldi9udWxsIDI+JjEKKwkJCWlmIFsgJD8gLWVxIDAgXTsgdGhlbgorCQkJCWZhaWwgInNzaCBjZXJ0IGNvbm5lY3Qgc3VjY2VlZGVkIHVuZXhwZWNlZGx5IgorCQkJZmkKKwkJZG9uZQorCQorCQkjIFJldm9rZWQgQ0EKKwkJdmVyYm9zZSAiJHRpZDogJHtrdHlwZX0gJGF1dGggcmV2b2tlZCBDQSBrZXkiCisJCSgKKwkJCWNhdCAkT0JKL3NzaGRfcHJveHlfYmFrCisJCQllY2hvICJSZXZva2VkS2V5cyAkT0JKL3VzZXJfY2Ffa2V5LnB1YiIKKwkJCWVjaG8gIiRleHRyYV9zc2hkIgorCQkpID4gJE9CSi9zc2hkX3Byb3h5CisJCSR7U1NIfSAtMmkgJE9CSi9jZXJ0X3VzZXJfa2V5XyR7a3R5cGV9IC1GICRPQkovc3NoX3Byb3h5IFwKKwkJICAgIHNvbWVob3N0IHRydWUgPi9kZXYvbnVsbCAyPiYxCisJCWlmIFsgJD8gLWVxIDAgXTsgdGhlbgorCQkJZmFpbCAic3NoIGNlcnQgY29ubmVjdCBzdWNjZWVkZWQgdW5leHBlY2VkbHkiCisJCWZpCisJZG9uZQorCQorCXZlcmJvc2UgIiR0aWQ6ICRhdXRoIENBIGRvZXMgbm90IGF1dGhlbnRpY2F0ZSIKKwkoCisJCWNhdCAkT0JKL3NzaGRfcHJveHlfYmFrCisJCWVjaG8gIiRleHRyYV9zc2hkIgorCSkgPiAkT0JKL3NzaGRfcHJveHkKKwl2ZXJib3NlICIkdGlkOiBlbnN1cmUgQ0Ega2V5IGRvZXMgbm90IGF1dGhlbnRpY2F0ZSB1c2VyIgorCSR7U1NIfSAtMmkgJE9CSi91c2VyX2NhX2tleSBcCisJICAgIC1GICRPQkovc3NoX3Byb3h5IHNvbWVob3N0IHRydWUgPi9kZXYvbnVsbCAyPiYxCisJaWYgWyAkPyAtZXEgMCBdOyB0aGVuCisJCWZhaWwgInNzaCBjZXJ0IGNvbm5lY3Qgd2l0aCBDQSBrZXkgc3VjY2VlZGVkIHVuZXhwZWN0ZWRseSIKKwlmaQorfQorCitiYXNpY190ZXN0cyBhdXRob3JpemVkX2tleXMKK2Jhc2ljX3Rlc3RzIFRydXN0ZWRVc2VyQ0FLZXlzCisKK3Rlc3Rfb25lKCkgeworCWlkZW50PSQxCisJcmVzdWx0PSQyCisJc2lnbl9vcHRzPSQzCisJYXV0aF9jaG9pY2U9JDQKKwlhdXRoX29wdD0kNQorCisJaWYgdGVzdCAieCRhdXRoX2Nob2ljZSIgPSAieCIgOyB0aGVuCisJCWF1dGhfY2hvaWNlPSJhdXRob3JpemVkX2tleXMgVHJ1c3RlZFVzZXJDQUtleXMiCisJZmkKKworCWZvciBhdXRoIGluICRhdXRoX2Nob2ljZSA7IGRvCisJCWZvciBrdHlwZSBpbiByc2EgcnNhX3YwMCA7IGRvCisJCQljYXNlICRrdHlwZSBpbgorCQkJKl92MDApIGtleXY9Ii10IHYwMCIgOzsKKwkJCSopIGtleXY9IiIgOzsKKwkJCWVzYWMKKworCQkJY2F0ICRPQkovc3NoZF9wcm94eV9iYWsgPiAkT0JKL3NzaGRfcHJveHkKKwkJCWlmIHRlc3QgIngkYXV0aCIgPSAieGF1dGhvcml6ZWRfa2V5cyIgOyB0aGVuCisJCQkJIyBBZGQgQ0EgdG8gYXV0aG9yaXplZF9rZXlzCisJCQkJKAorCQkJCQllY2hvbiAiY2VydC1hdXRob3JpdHkke2F1dGhfb3B0fSAiCisJCQkJCWNhdCAkT0JKL3VzZXJfY2Ffa2V5LnB1YgorCQkJCSkgPiAkT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgorCQkJZWxzZQorCQkJCWVjaG8gPiAkT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgorCQkJCWVjaG8gIlRydXN0ZWRVc2VyQ0FLZXlzICRPQkovdXNlcl9jYV9rZXkucHViIiBcCisJCQkJICAgID4+ICRPQkovc3NoZF9wcm94eQorCQkJCWlmIHRlc3QgIngkYXV0aF9vcHQiICE9ICJ4IiA7IHRoZW4KKwkJCQkJZWNobyAkYXV0aF9vcHQgPj4gJE9CSi9zc2hkX3Byb3h5CisJCQkJZmkKKwkJCWZpCisJCQkKKwkJCXZlcmJvc2UgIiR0aWQ6ICRpZGVudCBhdXRoICRhdXRoIGV4cGVjdCAkcmVzdWx0ICRrdHlwZSIKKwkJCSR7U1NIS0VZR0VOfSAtcSAtcyAkT0JKL3VzZXJfY2Ffa2V5IFwKKwkJCSAgICAtSSAicmVncmVzcyB1c2VyIGtleSBmb3IgJFVTRVIiIFwKKwkJCSAgICAkc2lnbl9vcHRzICRrZXl2IFwKKwkJCSAgICAkT0JKL2NlcnRfdXNlcl9rZXlfJHtrdHlwZX0gfHwKKwkJCQlmYWlsICJjb3VsZG4ndCBzaWduIGNlcnRfdXNlcl9rZXlfJHtrdHlwZX0iCisKKwkJCSR7U1NIfSAtMmkgJE9CSi9jZXJ0X3VzZXJfa2V5XyR7a3R5cGV9IFwKKwkJCSAgICAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCB0cnVlID4vZGV2L251bGwgMj4mMQorCQkJcmM9JD8KKwkJCWlmIFsgIngkcmVzdWx0IiA9ICJ4c3VjY2VzcyIgXSA7IHRoZW4KKwkJCQlpZiBbICRyYyAtbmUgMCBdOyB0aGVuCisJCQkJCWZhaWwgIiRpZGVudCBmYWlsZWQgdW5leHBlY3RlZGx5IgorCQkJCWZpCisJCQllbHNlCisJCQkJaWYgWyAkcmMgLWVxIDAgXTsgdGhlbgorCQkJCQlmYWlsICIkaWRlbnQgc3VjY2VlZGVkIHVuZXhwZWN0ZWRseSIKKwkJCQlmaQorCQkJZmkKKwkJZG9uZQorCWRvbmUKK30KKwordGVzdF9vbmUgImNvcnJlY3QgcHJpbmNpcGFsIglzdWNjZXNzICItbiAke1VTRVJ9IgordGVzdF9vbmUgImhvc3QtY2VydGlmaWNhdGUiCWZhaWx1cmUgIi1uICR7VVNFUn0gLWgiCit0ZXN0X29uZSAid3JvbmcgcHJpbmNpcGFscyIJZmFpbHVyZSAiLW4gZm9vIgordGVzdF9vbmUgImNlcnQgbm90IHlldCB2YWxpZCIJZmFpbHVyZSAiLW4gJHtVU0VSfSAtVjIwMjAwMTAxOjIwMzAwMTAxIgordGVzdF9vbmUgImNlcnQgZXhwaXJlZCIJCWZhaWx1cmUgIi1uICR7VVNFUn0gLVYxOTgwMDEwMToxOTkwMDEwMSIKK3Rlc3Rfb25lICJjZXJ0IHZhbGlkIGludGVydmFsIglzdWNjZXNzICItbiAke1VTRVJ9IC1WLTF3OisydyIKK3Rlc3Rfb25lICJ3cm9uZyBzb3VyY2UtYWRkcmVzcyIJZmFpbHVyZSAiLW4gJHtVU0VSfSAtT3NvdXJjZS1hZGRyZXNzPTEwLjAuMC4wLzgiCit0ZXN0X29uZSAiZm9yY2UtY29tbWFuZCIJZmFpbHVyZSAiLW4gJHtVU0VSfSAtT2ZvcmNlLWNvbW1hbmQ9ZmFsc2UiCisKKyMgQmVoYXZpb3VyIGlzIGRpZmZlcmVudCBoZXJlOiBUcnVzdGVkVXNlckNBS2V5cyBkb2Vzbid0IGFsbG93IGVtcHR5IHByaW5jaXBhbHMKK3Rlc3Rfb25lICJlbXB0eSBwcmluY2lwYWxzIglzdWNjZXNzICIiIGF1dGhvcml6ZWRfa2V5cwordGVzdF9vbmUgImVtcHR5IHByaW5jaXBhbHMiCWZhaWx1cmUgIiIgVHJ1c3RlZFVzZXJDQUtleXMKKworIyBDaGVjayBleHBsaWNpdGx5LXNwZWNpZmllZCBwcmluY2lwYWxzOiBhbiBlbXB0eSBwcmluY2lwYWxzIGxpc3QgaW4gdGhlIGNlcnQKKyMgc2hvdWxkIGFsd2F5cyBiZSByZWZ1c2VkLgorCisjIEF1dGhvcml6ZWRQcmluY2lwYWxzRmlsZQorcm0gLWYgJE9CSi9hdXRob3JpemVkX2tleXNfJFVTRVIKK2VjaG8gbWVrbWl0YXNkaWdvYXQgPiAkT0JKL2F1dGhvcml6ZWRfcHJpbmNpcGFsc18kVVNFUgordGVzdF9vbmUgIkF1dGhvcml6ZWRQcmluY2lwYWxzRmlsZSBwcmluY2lwYWxzIiBzdWNjZXNzICItbiBtZWttaXRhc2RpZ29hdCIgXAorICAgIFRydXN0ZWRVc2VyQ0FLZXlzICJBdXRob3JpemVkUHJpbmNpcGFsc0ZpbGUgJE9CSi9hdXRob3JpemVkX3ByaW5jaXBhbHNfJXUiCit0ZXN0X29uZSAiQXV0aG9yaXplZFByaW5jaXBhbHNGaWxlIG5vIHByaW5jaXBhbHMiIGZhaWx1cmUgIiIgXAorICAgIFRydXN0ZWRVc2VyQ0FLZXlzICJBdXRob3JpemVkUHJpbmNpcGFsc0ZpbGUgJE9CSi9hdXRob3JpemVkX3ByaW5jaXBhbHNfJXUiCisKKyMgcHJpbmNpcGFscz0ga2V5IG9wdGlvbgorcm0gLWYgJE9CSi9hdXRob3JpemVkX3ByaW5jaXBhbHNfJFVTRVIKK3Rlc3Rfb25lICJwcmluY2lwYWxzIGtleSBvcHRpb24gcHJpbmNpcGFscyIgc3VjY2VzcyAiLW4gbWVrbWl0YXNkaWdvYXQiIFwKKyAgICBhdXRob3JpemVkX2tleXMgJyxwcmluY2lwYWxzPSJtZWttaXRhc2RpZ29hdCInCit0ZXN0X29uZSAicHJpbmNpcGFscyBrZXkgb3B0aW9uIG5vIHByaW5jaXBhbHMiIGZhaWx1cmUgIiIgXAorICAgIGF1dGhvcml6ZWRfa2V5cyAnLHByaW5jaXBhbHM9Im1la21pdGFzZGlnb2F0IicKKworIyBXcm9uZyBjZXJ0aWZpY2F0ZQorY2F0ICRPQkovc3NoZF9wcm94eV9iYWsgPiAkT0JKL3NzaGRfcHJveHkKK2ZvciBrdHlwZSBpbiByc2EgZHNhICRlY2RzYSByc2FfdjAwIGRzYV92MDAgOyBkbyAKKwljYXNlICRrdHlwZSBpbgorCSpfdjAwKSBhcmdzPSItdCB2MDAiIDs7CisJKikgYXJncz0iIiA7OworCWVzYWMKKwkjIFNlbGYtc2lnbgorCSR7U1NIS0VZR0VOfSAkYXJncyAtcSAtcyAkT0JKL2NlcnRfdXNlcl9rZXlfJHtrdHlwZX0gLUkgXAorCSAgICAicmVncmVzcyB1c2VyIGtleSBmb3IgJFVTRVIiIFwKKwkgICAgLW4gJFVTRVIgJE9CSi9jZXJ0X3VzZXJfa2V5XyR7a3R5cGV9IHx8CisJCWZhaWwgImNvdWxkbid0IHNpZ24gY2VydF91c2VyX2tleV8ke2t0eXBlfSIKKwl2ZXJib3NlICIkdGlkOiB1c2VyICR7a3R5cGV9IGNvbm5lY3Qgd3JvbmcgY2VydCIKKwkke1NTSH0gLTJpICRPQkovY2VydF91c2VyX2tleV8ke2t0eXBlfSAtRiAkT0JKL3NzaF9wcm94eSBcCisJICAgIHNvbWVob3N0IHRydWUgPi9kZXYvbnVsbCAyPiYxCisJaWYgWyAkPyAtZXEgMCBdOyB0aGVuCisJCWZhaWwgInNzaCBjZXJ0IGNvbm5lY3QgJGlkZW50IHN1Y2NlZWRlZCB1bmV4cGVjdGVkbHkiCisJZmkKK2RvbmUKKworcm0gLWYgJE9CSi9hdXRob3JpemVkX2tleXNfJFVTRVIgJE9CSi91c2VyX2NhX2tleSogJE9CSi9jZXJ0X3VzZXJfa2V5Kgorcm0gLWYgJE9CSi9hdXRob3JpemVkX3ByaW5jaXBhbHNfJFVTRVIKKwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2NmZ21hdGNoLnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2NmZ21hdGNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MDNmYWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvY2ZnbWF0Y2guc2gKQEAgLTAsMCArMSwxMjcgQEAKKyMJJE9wZW5CU0Q6IGNmZ21hdGNoLnNoLHYgMS42IDIwMTEvMDYvMDMgMDU6MzU6MTAgZHR1Y2tlciBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKK3RpZD0ic3NoZF9jb25maWcgbWF0Y2giCisKK3BpZGZpbGU9JE9CSi9yZW1vdGVfcGlkCitmd2Rwb3J0PTMzMDEKK2Z3ZD0iLUwgJGZ3ZHBvcnQ6MTI3LjAuMC4xOiRQT1JUIgorCitlY2hvICJFeGl0T25Gb3J3YXJkRmFpbHVyZT15ZXMiID4+ICRPQkovc3NoX2NvbmZpZworZWNobyAiRXhpdE9uRm9yd2FyZEZhaWx1cmU9eWVzIiA+PiAkT0JKL3NzaF9wcm94eQorCitzdGFydF9jbGllbnQoKQoreworCXJtIC1mICRwaWRmaWxlCisJJHtTU0h9IC1xIC0kcCAkZndkICIkQCIgc29tZWhvc3QgXAorCSAgICBleGVjIHNoIC1jIFwnImVjaG8gXCRcJCA+ICRwaWRmaWxlOyBleGVjIHNsZWVwIDEwMCJcJyBcCisJICAgID4+JFRFU1RfU1NIX0xPR0ZJTEUgMj4mMSAmCisJY2xpZW50X3BpZD0kIQorCSMgV2FpdCBmb3IgcmVtb3RlIGVuZAorCW49MAorCXdoaWxlIHRlc3QgISAtZiAkcGlkZmlsZSA7IGRvCisJCXNsZWVwIDEKKwkJbj1gZXhwciAkbiArIDFgCisJCWlmIHRlc3QgJG4gLWd0IDYwOyB0aGVuCisJCQlraWxsICRjbGllbnRfcGlkCisJCQlmYXRhbCAidGltZW91dCB3YWl0aW5nIGZvciBiYWNrZ3JvdW5kIHNzaCIKKwkJZmkKKwlkb25lCQorfQorCitzdG9wX2NsaWVudCgpCit7CisJcGlkPWBjYXQgJHBpZGZpbGVgCisJaWYgWyAhIC16ICIkcGlkIiBdOyB0aGVuCisJCWtpbGwgJHBpZAorCQlzbGVlcCAxCisJZmkKKwl3YWl0Cit9CisKK2NwICRPQkovc3NoZF9wcm94eSAkT0JKL3NzaGRfcHJveHlfYmFrCitncmVwIC12IEF1dGhvcml6ZWRLZXlzRmlsZSAkT0JKL3NzaGRfcHJveHlfYmFrID4gJE9CSi9zc2hkX3Byb3h5CitlY2hvICJBdXRob3JpemVkS2V5c0ZpbGUgL2Rldi9udWxsIiA+PiRPQkovc3NoZF9wcm94eQorZWNobyAiUGVybWl0T3BlbiAxMjcuMC4wLjE6MSIgPj4kT0JKL3NzaGRfY29uZmlnCitlY2hvICJNYXRjaCB1c2VyICRVU0VSIiA+PiRPQkovc3NoZF9wcm94eQorZWNobyAiQXV0aG9yaXplZEtleXNGaWxlIC9kZXYvbnVsbCAkT0JKL2F1dGhvcml6ZWRfa2V5c18ldSIgPj4kT0JKL3NzaGRfcHJveHkKK2VjaG8gIk1hdGNoIEFkZHJlc3MgMTI3LjAuMC4xIiA+PiRPQkovc3NoZF9jb25maWcKK2VjaG8gIlBlcm1pdE9wZW4gMTI3LjAuMC4xOiRQT1JUIiA+PiRPQkovc3NoZF9jb25maWcKKworZWNobyAiUGVybWl0T3BlbiAxMjcuMC4wLjE6MSIgPj4kT0JKL3NzaGRfcHJveHkKK2VjaG8gIk1hdGNoIEFkZHJlc3MgMTI3LjAuMC4xIiA+PiRPQkovc3NoZF9wcm94eQorZWNobyAiUGVybWl0T3BlbiAxMjcuMC4wLjE6JFBPUlQiID4+JE9CSi9zc2hkX3Byb3h5CisKK3N0YXJ0X3NzaGQKKworI3NldCAteAorCisjIFRlc3QgTWF0Y2ggKyBQZXJtaXRPcGVuIGluIHNzaGRfY29uZmlnLiAgVGhpcyBzaG91bGQgYmUgcGVybWl0dGVkCitmb3IgcCBpbiAxIDI7IGRvCisJdHJhY2UgIm1hdGNoIHBlcm1pdG9wZW4gbG9jYWxob3N0IHByb3RvICRwIgorCXN0YXJ0X2NsaWVudCAtRiAkT0JKL3NzaF9jb25maWcKKwkke1NTSH0gLXEgLSRwIC1wICRmd2Rwb3J0IC1GICRPQkovc3NoX2NvbmZpZyBzb21laG9zdCB0cnVlIHx8IFwKKwkgICAgZmFpbCAibWF0Y2ggcGVybWl0b3BlbiBwZXJtaXQgcHJvdG8gJHAiCisJc3RvcF9jbGllbnQKK2RvbmUKKworIyBTYW1lIGJ1dCBmcm9tIGRpZmZlcmVudCBzb3VyY2UuICBUaGlzIHNob3VsZCBub3QgYmUgcGVybWl0dGVkCitmb3IgcCBpbiAxIDI7IGRvCisJdHJhY2UgIm1hdGNoIHBlcm1pdG9wZW4gcHJveHkgcHJvdG8gJHAiCisJc3RhcnRfY2xpZW50IC1GICRPQkovc3NoX3Byb3h5CisJJHtTU0h9IC1xIC0kcCAtcCAkZndkcG9ydCAtRiAkT0JKL3NzaF9jb25maWcgc29tZWhvc3QgdHJ1ZSAmJiBcCisJICAgIGZhaWwgIm1hdGNoIHBlcm1pdG9wZW4gZGVueSBwcm90byAkcCIKKwlzdG9wX2NsaWVudAorZG9uZQorCisjIFJldHJ5IHByZXZpb3VzIHdpdGgga2V5IG9wdGlvbiwgc2hvdWxkIGFsc28gYmUgZGVuaWVkLgorZWNob24gJ3Blcm1pdG9wZW49IjEyNy4wLjAuMTonJFBPUlQnIiAnID4kT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgorY2F0ICRPQkovcnNhLnB1YiA+PiAkT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgorZWNob24gJ3Blcm1pdG9wZW49IjEyNy4wLjAuMTonJFBPUlQnIiAnID4+JE9CSi9hdXRob3JpemVkX2tleXNfJFVTRVIKK2NhdCAkT0JKL3JzYTEucHViID4+ICRPQkovYXV0aG9yaXplZF9rZXlzXyRVU0VSCitmb3IgcCBpbiAxIDI7IGRvCisJdHJhY2UgIm1hdGNoIHBlcm1pdG9wZW4gcHJveHkgdy9rZXkgb3B0cyBwcm90byAkcCIKKwlzdGFydF9jbGllbnQgLUYgJE9CSi9zc2hfcHJveHkKKwkke1NTSH0gLXEgLSRwIC1wICRmd2Rwb3J0IC1GICRPQkovc3NoX2NvbmZpZyBzb21laG9zdCB0cnVlICYmIFwKKwkgICAgZmFpbCAibWF0Y2ggcGVybWl0b3BlbiBkZW55IHcva2V5IG9wdCBwcm90byAkcCIKKwlzdG9wX2NsaWVudAorZG9uZQorCisjIFRlc3QgYm90aCBzc2hkX2NvbmZpZyBhbmQga2V5IG9wdGlvbnMgcGVybWl0dGluZyB0aGUgc2FtZSBkc3QvcG9ydCBwYWlyLgorIyBTaG91bGQgYmUgcGVybWl0dGVkLgorZm9yIHAgaW4gMSAyOyBkbworCXRyYWNlICJtYXRjaCBwZXJtaXRvcGVuIGxvY2FsaG9zdCBwcm90byAkcCIKKwlzdGFydF9jbGllbnQgLUYgJE9CSi9zc2hfY29uZmlnCisJJHtTU0h9IC1xIC0kcCAtcCAkZndkcG9ydCAtRiAkT0JKL3NzaF9jb25maWcgc29tZWhvc3QgdHJ1ZSB8fCBcCisJICAgIGZhaWwgIm1hdGNoIHBlcm1pdG9wZW4gcGVybWl0IHByb3RvICRwIgorCXN0b3BfY2xpZW50Citkb25lCisKK2NwICRPQkovc3NoZF9wcm94eV9iYWsgJE9CSi9zc2hkX3Byb3h5CitlY2hvICJQZXJtaXRPcGVuIDEyNy4wLjAuMToxIDEyNy4wLjAuMTokUE9SVCAxMjcuMC4wLjI6MiIgPj4kT0JKL3NzaGRfcHJveHkKK2VjaG8gIk1hdGNoIFVzZXIgJFVTRVIiID4+JE9CSi9zc2hkX3Byb3h5CitlY2hvICJQZXJtaXRPcGVuIDEyNy4wLjAuMToxIDEyNy4wLjAuMToyIiA+PiRPQkovc3NoZF9wcm94eQorCisjIFRlc3QgdGhhdCBhIE1hdGNoIG92ZXJyaWRlcyBhIFBlcm1pdE9wZW4gaW4gdGhlIGdsb2JhbCBzZWN0aW9uCitmb3IgcCBpbiAxIDI7IGRvCisJdHJhY2UgIm1hdGNoIHBlcm1pdG9wZW4gcHJveHkgdy9rZXkgb3B0cyBwcm90byAkcCIKKwlzdGFydF9jbGllbnQgLUYgJE9CSi9zc2hfcHJveHkKKwkke1NTSH0gLXEgLSRwIC1wICRmd2Rwb3J0IC1GICRPQkovc3NoX2NvbmZpZyBzb21laG9zdCB0cnVlICYmIFwKKwkgICAgZmFpbCAibWF0Y2ggb3ZlcnJpZGUgcGVybWl0b3BlbiBwcm90byAkcCIKKwlzdG9wX2NsaWVudAorZG9uZQorCitjcCAkT0JKL3NzaGRfcHJveHlfYmFrICRPQkovc3NoZF9wcm94eQorZWNobyAiUGVybWl0T3BlbiAxMjcuMC4wLjE6MSAxMjcuMC4wLjE6JFBPUlQgMTI3LjAuMC4yOjIiID4+JE9CSi9zc2hkX3Byb3h5CitlY2hvICJNYXRjaCBVc2VyIE5vU3VjaFVzZXIiID4+JE9CSi9zc2hkX3Byb3h5CitlY2hvICJQZXJtaXRPcGVuIDEyNy4wLjAuMToxIDEyNy4wLjAuMToyIiA+PiRPQkovc3NoZF9wcm94eQorCisjIFRlc3QgdGhhdCBhIHJ1bGUgdGhhdCBkb2Vzbid0IG1hdGNoIGRvZXNuJ3Qgb3ZlcnJpZGUsIHBsdXMgdGVzdCBhCisjIFBlcm1pdE9wZW4gZW50cnkgdGhhdCdzIG5vdCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpc3QKK2ZvciBwIGluIDEgMjsgZG8KKwl0cmFjZSAibm9tYXRjaCBwZXJtaXRvcGVuIHByb3h5IHcva2V5IG9wdHMgcHJvdG8gJHAiCisJc3RhcnRfY2xpZW50IC1GICRPQkovc3NoX3Byb3h5CisJJHtTU0h9IC1xIC0kcCAtcCAkZndkcG9ydCAtRiAkT0JKL3NzaF9jb25maWcgc29tZWhvc3QgdHJ1ZSB8fCBcCisJICAgIGZhaWwgIm5vbWF0Y2ggb3ZlcnJpZGUgcGVybWl0b3BlbiBwcm90byAkcCIKKwlzdG9wX2NsaWVudAorZG9uZQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2NpcGhlci1zcGVlZC5zaCBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9jaXBoZXItc3BlZWQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3YWZkMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9jaXBoZXItc3BlZWQuc2gKQEAgLTAsMCArMSw1MSBAQAorIwkkT3BlbkJTRDogY2lwaGVyLXNwZWVkLnNoLHYgMS40IDIwMTEvMDgvMDIgMDE6MjM6NDEgZGptIEV4cCAkCisjCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KKwordGlkPSJjaXBoZXIgc3BlZWQiCisKK2dldGJ5dGVzICgpCit7CisJc2VkIC1uICcvdHJhbnNmZXJyZWQvcy8uKnNlY3MgKFwoLiogYnl0ZXMuc2VjXCkuKi9cMS9wJworfQorCit0cmllcz0iMSAyIgorREFUQT0vYmluL2xzCitEQVRBPS9ic2QKKworY2lwaGVycz0iYWVzMTI4LWNiYyAzZGVzLWNiYyBibG93ZmlzaC1jYmMgY2FzdDEyOC1jYmMgCisJYXJjZm91cjEyOCBhcmNmb3VyMjU2IGFyY2ZvdXIgCisJYWVzMTkyLWNiYyBhZXMyNTYtY2JjIHJpam5kYWVsLWNiY0BseXNhdG9yLmxpdS5zZQorCWFlczEyOC1jdHIgYWVzMTkyLWN0ciBhZXMyNTYtY3RyIgorbWFjcz0iaG1hYy1zaGExIGhtYWMtbWQ1IHVtYWMtNjRAb3BlbnNzaC5jb20gaG1hYy1zaGExLTk2IGhtYWMtbWQ1LTk2IgorY29uZmlnX2RlZmluZWQgSEFWRV9FVlBfU0hBMjU2ICYmCisgICAgbWFjcz0iJG1hY3MgaG1hYy1zaGEyLTI1NiBobWFjLXNoYTItMjU2LTk2IGhtYWMtc2hhMi01MTIgaG1hYy1zaGEyLTUxMi05NiIKKworZm9yIGMgaW4gJGNpcGhlcnM7IGRvIGZvciBtIGluICRtYWNzOyBkbworCXRyYWNlICJwcm90byAyIGNpcGhlciAkYyBtYWMgJG0iCisJZm9yIHggaW4gJHRyaWVzOyBkbworCQllY2hvbiAiJGMvJG06XHQiCisJCSggJHtTU0h9IC1vICdjb21wcmVzc2lvbiBubycgXAorCQkJLUYgJE9CSi9zc2hfcHJveHkgLTIgLW0gJG0gLWMgJGMgc29tZWhvc3QgXAorCQkJZXhlYyBzaCAtYyBcJyJkZCBvZj0vZGV2L251bGwgb2JzPTMyayJcJyBcCisJCTwgJHtEQVRBfSApIDI+JjEgfCBnZXRieXRlcworCisJCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCQkJZmFpbCAic3NoIC0yIGZhaWxlZCB3aXRoIG1hYyAkbSBjaXBoZXIgJGMiCisJCWZpCisJZG9uZQorZG9uZTsgZG9uZQorCitjaXBoZXJzPSIzZGVzIGJsb3dmaXNoIgorZm9yIGMgaW4gJGNpcGhlcnM7IGRvCisJdHJhY2UgInByb3RvIDEgY2lwaGVyICRjIgorCWZvciB4IGluICR0cmllczsgZG8KKwkJZWNob24gIiRjOlx0IgorCQkoICR7U1NIfSAtbyAnY29tcHJlc3Npb24gbm8nIFwKKwkJCS1GICRPQkovc3NoX3Byb3h5IC0xIC1jICRjIHNvbWVob3N0IFwKKwkJCWV4ZWMgc2ggLWMgXCciZGQgb2Y9L2Rldi9udWxsIG9icz0zMmsiXCcgXAorCQk8ICR7REFUQX0gKSAyPiYxIHwgZ2V0Ynl0ZXMKKwkJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJCQlmYWlsICJzc2ggLTEgZmFpbGVkIHdpdGggY2lwaGVyICRjIgorCQlmaQorCWRvbmUKK2RvbmUKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy9jb25jaC1jaXBoZXJzLnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2NvbmNoLWNpcGhlcnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2NWNkOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9jb25jaC1jaXBoZXJzLnNoCkBAIC0wLDAgKzEsMzEgQEAKKyMJJE9wZW5CU0Q6IGNvbmNoLWNpcGhlcnMuc2gsdiAxLjIgMjAwOC8wNi8zMCAxMDo0MzowMyBkam0gRXhwICQKKyMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgorCit0aWQ9ImNvbmNoIGNpcGhlcnMiCisKK0RBVEE9L2Jpbi9scworQ09QWT0ke09CSn0vY29weQorCitpZiB0ZXN0ICJ4JFJFR1JFU1NfSU5URVJPUF9DT05DSCIgIT0gInh5ZXMiIDsgdGhlbgorCWVjaG8gImNvbmNoIGludGVyb3AgdGVzdHMgbm90IGVuYWJsZWQiCisJZXhpdCAwCitmaQorCitzdGFydF9zc2hkCisKK2ZvciBjIGluIGFlczI1Ni1jdHIgYWVzMjU2LWNiYyBhZXMxOTItY3RyIGFlczE5Mi1jYmMgYWVzMTI4LWN0ciBhZXMxMjgtY2JjIFwKKyAgICAgICAgIGNhc3QxMjgtY2JjIGJsb3dmaXNoIDNkZXMtY2JjIDsgZG8KKwl2ZXJib3NlICIkdGlkOiBjaXBoZXIgJGMiCisJcm0gLWYgJHtDT1BZfQorCSMgWFhYIHRoZSAybmQgImNhdCIgc2VlbXMgdG8gYmUgbmVlZGVkIGJlY2F1c2Ugb2YgYnVnZ3kgRkQgaGFuZGxpbmcKKwkjIGluIGNvbmNoCisJJHtDT05DSH0gLS1pZGVudGl0eSAkT0JKL3JzYSAtLXBvcnQgJFBPUlQgLS11c2VyICRVU0VSICAtZSBub25lIFwKKwkgICAgLS1rbm93bi1ob3N0cyAkT0JKL2tub3duX2hvc3RzIC0tbm90dHkgLS1ub2FnZW50IC0tbm94MTEgLW4gXAorCSAgICAxMjcuMC4wLjEgImNhdCAke0RBVEF9IiAyPi9kZXYvbnVsbCB8IGNhdCA+ICR7Q09QWX0KKwlpZiBbICQ/IC1uZSAwIF07IHRoZW4KKwkJZmFpbCAic3NoIGNhdCAkREFUQSBmYWlsZWQiCisJZmkKKwljbXAgJHtEQVRBfSAke0NPUFl9CQl8fCBmYWlsICJjb3JydXB0ZWQgY29weSIKK2RvbmUKK3JtIC1mICR7Q09QWX0KKwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2Nvbm5lY3QtcHJpdnNlcC5zaCBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9jb25uZWN0LXByaXZzZXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmYjlhZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9jb25uZWN0LXByaXZzZXAuc2gKQEAgLTAsMCArMSwyNSBAQAorIwkkT3BlbkJTRDogY29ubmVjdC1wcml2c2VwLnNoLHYgMS4yIDIwMTEvMDYvMzAgMjI6NDQ6NDMgbWFya3VzIEV4cCAkCisjCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KKwordGlkPSJwcm94eSBjb25uZWN0IHdpdGggcHJpdnNlcCIKKworY3AgJE9CSi9zc2hkX3Byb3h5ICRPQkovc3NoZF9wcm94eS5vcmlnCitlY2hvICdVc2VQcml2aWxlZ2VTZXBhcmF0aW9uIHllcycgPj4gJE9CSi9zc2hkX3Byb3h5CisKK2ZvciBwIGluIDEgMjsgZG8KKwkke1NTSH0gLSRwIC1GICRPQkovc3NoX3Byb3h5IDk5OS45OTkuOTk5Ljk5OSB0cnVlCisJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJCWZhaWwgInNzaCBwcml2c2VwK3Byb3h5Y29ubmVjdCBwcm90b2NvbCAkcCBmYWlsZWQiCisJZmkKK2RvbmUKKworY3AgJE9CSi9zc2hkX3Byb3h5Lm9yaWcgJE9CSi9zc2hkX3Byb3h5CitlY2hvICdVc2VQcml2aWxlZ2VTZXBhcmF0aW9uIHNhbmRib3gnID4+ICRPQkovc3NoZF9wcm94eQorCitmb3IgcCBpbiAxIDI7IGRvCisJJHtTU0h9IC0kcCAtRiAkT0JKL3NzaF9wcm94eSA5OTkuOTk5Ljk5OS45OTkgdHJ1ZQorCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCQkjIFhYWCByZXBsYWNlIHRoaXMgd2l0aCBmYWlsIG9uY2Ugc2FuZGJveCBoYXMgc3RhYmlsaXNlZAorCQl3YXJuICJzc2ggcHJpdnNlcC9zYW5kYm94K3Byb3h5Y29ubmVjdCBwcm90b2NvbCAkcCBmYWlsZWQiCisJZmkKK2RvbmUKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy9jb25uZWN0LnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2Nvbm5lY3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE4NmZhNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9jb25uZWN0LnNoCkBAIC0wLDAgKzEsMTMgQEAKKyMJJE9wZW5CU0Q6IGNvbm5lY3Quc2gsdiAxLjQgMjAwMi8wMy8xNSAxMzowODo1NiBtYXJrdXMgRXhwICQKKyMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgorCit0aWQ9InNpbXBsZSBjb25uZWN0IgorCitzdGFydF9zc2hkCisKK2ZvciBwIGluIDEgMjsgZG8KKwkke1NTSH0gLW8gIlByb3RvY29sPSRwIiAtRiAkT0JKL3NzaF9jb25maWcgc29tZWhvc3QgdHJ1ZQorCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCQlmYWlsICJzc2ggY29ubmVjdCB3aXRoIHByb3RvY29sICRwIGZhaWxlZCIKKwlmaQorZG9uZQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2RzYV9zc2gyLnBydiBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9kc2Ffc3NoMi5wcnYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkzYjQwMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9kc2Ffc3NoMi5wcnYKQEAgLTAsMCArMSwxNCBAQAorLS0tLSBCRUdJTiBTU0gyIEVOQ1JZUFRFRCBQUklWQVRFIEtFWSAtLS0tCitTdWJqZWN0OiBzc2gta2V5Z2VuIHRlc3QKK0NvbW1lbnQ6ICIxMDI0LWJpdCBkc2EsIFR1ZSBKYW4gMDggMjAwMiAyMjowMDoyMyArMDEwMCIKK1AyLzU2d0FBQWdJQUFBQW1aR3d0Ylc5a2NIdHphV2R1ZTJSellTMXVhWE4wTFhOb1lURjlMR1JvZTNCc1lXbHVmWDBBQUEKK0FFYm05dVpRQUFBY1FBQUFIQUFBQUFBQUFBQkFDd1VmbTNBeFpUdXQzaWNCbXdDY0Q0OG5ZNjRIenVFTGxRK3ZFcWpJY1IKK0xvNDllcy9EUVRlTE5RK2tkS1JDZm91b3NHTnYwV3F4UnRGMHRVc1dkWHhTMzdvSEdhNFFQdWdCZEhSZDdZbFpHWnY4a2cKK3g3RnNvZXBZN3Y3RTY4My85N2R2Mnp4TDNBR2FnVEV6V3I3ZmwweVBleEFhWm9EdnRRcnJqWDQ0Qkxtd0FBQkFDV1FrdnYKK014bkQ4ZUZrUzFrb25GZk1KMUNrdVJmVE4zNENCWjZkWTdWVFNHZW15NFF3dEZkTUttb3VmRDBlS2d5M3A1V09lV0NZS3QKK0Y0RmhqSEtaay9hYXhGampJYnRrcm5sdlhnNjRRSTExZFNaeUJONi9WaVFrSFBTa1VERitBNkFBRWhyTmJRYkFGU3ZhbzEKK2tUdk50UEN0TDBBa1VJZHVFTXpHUWZMQ1RBQUFBS0RlQzA0M1lWbzlabzB6QUVlSUE0dVpoNExCQ1FBQUEvOWFqN1k1aWsKK2VoeWdKNHFURFNsVnlwc1B1VituNTl0TVMwZTJwZnJTRzg3eWY1cjk0QUtCbUplaG81T082d1lhWEN4c1ZCN0FGYlNVRDYKKzc1QUs4bUhGNHYxLys3U1dLazVmOHhsTUNNU1BaOUswK2ovVzFkL3EycWtobm5EWm9sT0hEb21MQStVMDBpNXlhL2puVFYKK3p5RFBXTEZwV0s4dTN4R0JQQVlYMzI0Z0FBQUtESEZ2b29SbmFYZFpiZVdHVFRxbWdIQjFHVTlBPT0KKy0tLS0gRU5EIFNTSDIgRU5DUllQVEVEIFBSSVZBVEUgS0VZIC0tLS0KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy9kc2Ffc3NoMi5wdWIgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvZHNhX3NzaDIucHViCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNWQ3M2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvZHNhX3NzaDIucHViCkBAIC0wLDAgKzEsMTMgQEAKKy0tLS0gQkVHSU4gU1NIMiBQVUJMSUMgS0VZIC0tLS0KK1N1YmplY3Q6IHNzaC1rZXlnZW4gdGVzdAorQ29tbWVudDogIjEwMjQtYml0IGRzYSwgVHVlIEphbiAwOCAyMDAyIDIyOjAwOjIzICswMTAwIgorQUFBQUIzTnphQzFrYzNNQUFBQ0JBTEJSK2JjREZsTzYzZUp3R2JBSndQanlkanJnZk80UXVWRDY4U3FNaHhFdWpqMTZ6OAorTkJONHMxRDZSMHBFSitpNml3WTIvUmFyRkcwWFMxU3haMWZGTGZ1Z2NacmhBKzZBRjBkRjN0aVZrWm0veVNESHNXeWg2bAoranUvc1RyemYvM3QyL2JQRXZjQVpxQk1UTmF2dCtYVEk5N0VCcG1nTysxQ3V1TmZqZ0V1YkFBQUFGUURlQzA0M1lWbzlabworMHpBRWVJQTR1Wmg0TEJDUUFBQUlFQWxrSkw3ek1ady9IaFpFdFpLSnhYekNkUXBMa1gwemQrQWdXZW5XTzFVMGhucHN1RQorTUxSWFRDcHFMbnc5SGlvTXQ2ZVZqbmxnbUNyUmVCWVl4eW1aUDJtc1JZNHlHN1pLNTViMTRPdUVDTmRYVW1jZ1RldjFZaworSkJ6MHBGQXhmZ09nQUJJYXpXMEd3QlVyMnFOWkU3emJUd3JTOUFKRkNIYmhETXhrSHl3a3dBQUFDQVdvKzJPWXBIb2NvQworZUtrdzBwVmNxYkQ3bGZwK2ZiVEV0SHRxWDYwaHZPOG4rYS9lQUNnWmlYb2FPVGp1c0dHbHdzYkZRZXdCVzBsQSt1K1FDdgorSmh4ZUw5Zi91MGxpcE9YL01aVEFqRWoyZlN0UG8vMXRYZjZ0cXBJWjV3MmFKVGh3Nkppd1BsTk5JdWNtdjQ1MDFjOGd6MQoraXhhVml2THQ4UmdUd0dGOTl1ST0KKy0tLS0gRU5EIFNTSDIgUFVCTElDIEtFWSAtLS0tCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvZHluYW1pYy1mb3J3YXJkLnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2R5bmFtaWMtZm9yd2FyZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWFiODA1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2R5bmFtaWMtZm9yd2FyZC5zaApAQCAtMCwwICsxLDYxIEBACisjCSRPcGVuQlNEOiBkeW5hbWljLWZvcndhcmQuc2gsdiAxLjkgMjAxMS8wNi8wMyAwMDoyOTo1MiBkdHVja2VyIEV4cCAkCisjCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KKwordGlkPSJkeW5hbWljIGZvcndhcmRpbmciCisKK0ZXRFBPUlQ9YGV4cHIgJFBPUlQgKyAxYAorCitEQVRBPS9iaW4vbHMke0VYRUVYVH0KKworaWYgaGF2ZV9wcm9nIG5jICYmIG5jIC1oIDI+JjEgfCBncmVwICJwcm94eSBhZGRyZXNzIiA+L2Rldi9udWxsOyB0aGVuCisJcHJveHljbWQ9Im5jIC14IDEyNy4wLjAuMTokRldEUE9SVCAtWCIKK2VsaWYgaGF2ZV9wcm9nIGNvbm5lY3Q7IHRoZW4KKwlwcm94eWNtZD0iY29ubmVjdCAtUyAxMjcuMC4wLjE6JEZXRFBPUlQgLSIKK2Vsc2UKKwllY2hvICJza2lwcGVkIChubyBzdWl0YWJsZSBQcm94eUNvbW1hbmQgZm91bmQpIgorCWV4aXQgMAorZmkKK3RyYWNlICJ3aWxsIHVzZSBQcm94eUNvbW1hbmQgJHByb3h5Y21kIgorCitzdGFydF9zc2hkCisKK2ZvciBwIGluIDEgMjsgZG8KKwluPTAKKwllcnJvcj0iMSIKKwl0cmFjZSAic3RhcnQgZHluYW1pYyBmb3J3YXJkaW5nLCBmb3JrIHRvIGJhY2tncm91bmQiCisJd2hpbGUgWyAiJGVycm9yIiAtbmUgMCAtYSAiJG4iIC1sdCAzIF07IGRvCisJCW49YGV4cHIgJG4gKyAxYAorCQkke1NTSH0gLSRwIC1GICRPQkovc3NoX2NvbmZpZyAtZiAtRCAkRldEUE9SVCAtcSBcCisJCSAgICAtb0V4aXRPbkZvcndhcmRGYWlsdXJlPXllcyBzb21laG9zdCBleGVjIHNoIC1jIFwKKwkJCVwnImVjaG8gXCRcJCA+ICRPQkovcmVtb3RlX3BpZDsgZXhlYyBzbGVlcCA0NDQiXCcKKwkJZXJyb3I9JD8KKwkJaWYgWyAiJGVycm9yIiAtbmUgMCBdOyB0aGVuCisJCQl0cmFjZSAiZm9yd2FyZCBmYWlsZWQgcHJvdG8gJHAgYXR0ZW1wdCAkbiBlcnIgJGVycm9yIgorCQkJc2xlZXAgJG4KKwkJZmkKKwlkb25lCisJaWYgWyAiJGVycm9yIiAtbmUgMCBdOyB0aGVuCisJCWZhdGFsICJmYWlsZWQgdG8gc3RhcnQgZHluYW1pYyBmb3J3YXJkaW5nIHByb3RvICRwIgorCWZpCisKKwlmb3IgcyBpbiA0IDU7IGRvCisJICAgIGZvciBoIGluIDEyNy4wLjAuMSBsb2NhbGhvc3Q7IGRvCisJCXRyYWNlICJ0ZXN0aW5nIHNzaCBwcm90b2NvbCAkcCBzb2NrcyB2ZXJzaW9uICRzIGhvc3QgJGgiCisJCSR7U1NIfSAtRiAkT0JKL3NzaF9jb25maWcgXAorCQkJLW8gIlByb3h5Q29tbWFuZCAke3Byb3h5Y21kfSR7c30gJGggJFBPUlQiIFwKKwkJCXNvbWVob3N0IGNhdCAkREFUQSA+ICRPQkovbHMuY29weQorCQl0ZXN0IC1mICRPQkovbHMuY29weQkgfHwgZmFpbCAiZmFpbGVkIGNvcHkgJERBVEEiCisJCWNtcCAkREFUQSAkT0JKL2xzLmNvcHkgfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkgb2YgJERBVEEiCisJICAgIGRvbmUKKwlkb25lCisKKwlpZiBbIC1mICRPQkovcmVtb3RlX3BpZCBdOyB0aGVuCisJCXJlbW90ZT1gY2F0ICRPQkovcmVtb3RlX3BpZGAKKwkJdHJhY2UgInRlcm1pbmF0ZSByZW1vdGUgc2hlbGwsIHBpZCAkcmVtb3RlIgorCQlpZiBbICRyZW1vdGUgLWd0IDEgXTsgdGhlbgorCQkJa2lsbCAtSFVQICRyZW1vdGUKKwkJZmkKKwllbHNlCisJCWZhaWwgIm5vIHBpZCBmaWxlOiAkT0JKL3JlbW90ZV9waWQiCisJZmkKK2RvbmUKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy9lbnZwYXNzLnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2VudnBhc3Muc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY3ZWFmZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9lbnZwYXNzLnNoCkBAIC0wLDAgKzEsNjAgQEAKKyMJJE9wZW5CU0Q6IGVudnBhc3Muc2gsdiAxLjQgMjAwNS8wMy8wNCAwODo0ODo0NiBkam0gRXhwICQKKyMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgorCit0aWQ9ImVudmlyb25tZW50IHBhc3NpbmciCisKKyMgTkIgYWNjZXB0ZWQgZW52IHZhcnMgYXJlIGluIHRlc3QtZXhlYy5zaCAoX1hYWF9URVNUXyogYW5kIF9YWFhfVEVTVCkKKworIyBQcmVwYXJlIGEgY3VzdG9tIGNvbmZpZyB0byB0ZXN0IGZvciBhIGNvbmZpZ3VyYXRpb24gcGFyc2luZyBidWcgZml4ZWQgaW4gNC4wCitjYXQgPDwgRU9GID4gJE9CSi9zc2hfcHJveHlfZW52cGFzcworSG9zdCB0ZXN0LXNlbmRlbnYtY29uZnBhcnNlLWJ1ZworCVNlbmRFbnYgKgorRU9GCitjYXQgJE9CSi9zc2hfcHJveHkgPj4gJE9CSi9zc2hfcHJveHlfZW52cGFzcworCit0cmFjZSAicGFzcyBlbnYsIGRvbid0IGFjY2VwdCIKK3ZlcmJvc2UgInRlc3QgJHRpZDogcGFzcyBlbnYsIGRvbid0IGFjY2VwdCIKK19URVNUX0VOVj1ibGFoICR7U1NIfSAtb1NlbmRFbnY9IioiIC1GICRPQkovc3NoX3Byb3h5X2VudnBhc3Mgb3RoZXJob3N0IFwKKwlzaCA8PCAnRU9GJworCXRlc3QgLXogIiRfVEVTVF9FTlYiCitFT0YKK3I9JD8KK2lmIFsgJHIgLW5lIDAgXTsgdGhlbgorCWZhaWwgImVudmlyb25tZW50IGZvdW5kIgorZmkKKwordHJhY2UgImRvbid0IHBhc3MgZW52LCBhY2NlcHQiCit2ZXJib3NlICJ0ZXN0ICR0aWQ6IGRvbid0IHBhc3MgZW52LCBhY2NlcHQiCitfWFhYX1RFU1RfQT0xIF9YWFhfVEVTVF9CPTIgJHtTU0h9IC1GICRPQkovc3NoX3Byb3h5X2VudnBhc3Mgb3RoZXJob3N0IFwKKwlzaCA8PCAnRU9GJworCXRlc3QgLXogIiRfWFhYX1RFU1RfQSIgJiYgdGVzdCAteiAiJF9YWFhfVEVTVF9CIgorRU9GCityPSQ/CitpZiBbICRyIC1uZSAwIF07IHRoZW4KKwlmYWlsICJlbnZpcm9ubWVudCBmb3VuZCIKK2ZpCisKK3RyYWNlICJwYXNzIHNpbmdsZSBlbnYsIGFjY2VwdCBzaW5nbGUgZW52IgordmVyYm9zZSAidGVzdCAkdGlkOiBwYXNzIHNpbmdsZSBlbnYsIGFjY2VwdCBzaW5nbGUgZW52IgorX1hYWF9URVNUPWJsYWggJHtTU0h9IC1vU2VuZEVudj0iX1hYWF9URVNUIiAtRiAkT0JKL3NzaF9wcm94eV9lbnZwYXNzIFwKKyAgICBvdGhlcmhvc3Qgc2ggPDwgJ0VPRicKKwl0ZXN0IFgiJF9YWFhfVEVTVCIgPSBYImJsYWgiCitFT0YKK3I9JD8KK2lmIFsgJHIgLW5lIDAgXTsgdGhlbgorCWZhaWwgImVudmlyb25tZW50IG5vdCBmb3VuZCIKK2ZpCisKK3RyYWNlICJwYXNzIG11bHRpcGxlIGVudiwgYWNjZXB0IG11bHRpcGxlIGVudiIKK3ZlcmJvc2UgInRlc3QgJHRpZDogcGFzcyBtdWx0aXBsZSBlbnYsIGFjY2VwdCBtdWx0aXBsZSBlbnYiCitfWFhYX1RFU1RfQT0xIF9YWFhfVEVTVF9CPTIgJHtTU0h9IC1vU2VuZEVudj0iX1hYWF9URVNUXyoiIFwKKyAgICAtRiAkT0JKL3NzaF9wcm94eV9lbnZwYXNzIG90aGVyaG9zdCBcCisJc2ggPDwgJ0VPRicKKwl0ZXN0IFgiJF9YWFhfVEVTVF9BIiA9IFgiMSIgLWEgWCIkX1hYWF9URVNUX0IiID0gWCIyIgorRU9GCityPSQ/CitpZiBbICRyIC1uZSAwIF07IHRoZW4KKwlmYWlsICJlbnZpcm9ubWVudCBub3QgZm91bmQiCitmaQorCitybSAtZiAkT0JKL3NzaF9wcm94eV9lbnZwYXNzCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvZXhpdC1zdGF0dXMuc2ggYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvZXhpdC1zdGF0dXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiNzhhNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9leGl0LXN0YXR1cy5zaApAQCAtMCwwICsxLDI0IEBACisjCSRPcGVuQlNEOiBleGl0LXN0YXR1cy5zaCx2IDEuNiAyMDAyLzAzLzE1IDEzOjA4OjU2IG1hcmt1cyBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKK3RpZD0icmVtb3RlIGV4aXQgc3RhdHVzIgorCitmb3IgcCBpbiAxIDI7IGRvCisJZm9yIHMgaW4gMCAxIDQgNSA0NDsgZG8KKwkJdHJhY2UgInByb3RvICRwIHN0YXR1cyAkcyIKKwkJdmVyYm9zZSAidGVzdCAkdGlkOiBwcm90byAkcCBzdGF0dXMgJHMiCisJCSR7U1NIfSAtJHAgLUYgJE9CSi9zc2hfcHJveHkgb3RoZXJob3N0IGV4aXQgJHMKKwkJcj0kPworCQlpZiBbICRyIC1uZSAkcyBdOyB0aGVuCisJCQlmYWlsICJleGl0IGNvZGUgbWlzbWF0Y2ggZm9yIHByb3RvY29sICRwOiAkciAhPSAkcyIKKwkJZmkKKworCQkjIHNhbWUgd2l0aCBlYXJseSBjbG9zZSBvZiBzdGRvdXQvZXJyCisJCSR7U1NIfSAtJHAgLUYgJE9CSi9zc2hfcHJveHkgLW4gb3RoZXJob3N0IFwKKyAgICAgICAgICAgICAgICAJZXhlYyBzaCAtYyBcJyJzbGVlcCAyOyBleGVjID4gL2Rldi9udWxsIDI+JjE7IHNsZWVwIDM7IGV4aXQgJHMiXCcKKwkJcj0kPworCQlpZiBbICRyIC1uZSAkcyBdOyB0aGVuCisJCQlmYWlsICJleGl0IGNvZGUgKHdpdGggc2xlZXApIG1pc21hdGNoIGZvciBwcm90b2NvbCAkcDogJHIgIT0gJHMiCisJCWZpCisJZG9uZQorZG9uZQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2ZvcmNlY29tbWFuZC5zaCBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9mb3JjZWNvbW1hbmQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTllNTFhNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9mb3JjZWNvbW1hbmQuc2gKQEAgLTAsMCArMSw0MiBAQAorIwkkT3BlbkJTRDogZm9yY2Vjb21tYW5kLnNoLHYgMS4xIDIwMDYvMDcvMTkgMTM6MDk6MjggZHR1Y2tlciBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKK3RpZD0iZm9yY2VkIGNvbW1hbmQiCisKK2NwICRPQkovc3NoZF9wcm94eSAkT0JKL3NzaGRfcHJveHlfYmFrCisKK2VjaG9uICdjb21tYW5kPSJ0cnVlIiAnID4kT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgorY2F0ICRPQkovcnNhLnB1YiA+PiAkT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgorZWNob24gJ2NvbW1hbmQ9InRydWUiICcgPj4kT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgorY2F0ICRPQkovcnNhMS5wdWIgPj4gJE9CSi9hdXRob3JpemVkX2tleXNfJFVTRVIKKworZm9yIHAgaW4gMSAyOyBkbworCXRyYWNlICJmb3JjZWQgY29tbWFuZCBpbiBrZXkgb3B0aW9uIHByb3RvICRwIgorCSR7U1NIfSAtJHAgLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgZmFsc2UgXCB8fAorCSAgICBmYWlsICJmb3JjZWQgY29tbWFuZCBpbiBrZXkgcHJvdG8gJHAiCitkb25lCisKK2VjaG9uICdjb21tYW5kPSJmYWxzZSIgJyA+JE9CSi9hdXRob3JpemVkX2tleXNfJFVTRVIKK2NhdCAkT0JKL3JzYS5wdWIgPj4gJE9CSi9hdXRob3JpemVkX2tleXNfJFVTRVIKK2VjaG9uICdjb21tYW5kPSJmYWxzZSIgJyA+PiRPQkovYXV0aG9yaXplZF9rZXlzXyRVU0VSCitjYXQgJE9CSi9yc2ExLnB1YiA+PiAkT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgorCitjcCAkT0JKL3NzaGRfcHJveHlfYmFrICRPQkovc3NoZF9wcm94eQorZWNobyAiRm9yY2VDb21tYW5kIHRydWUiID4+ICRPQkovc3NoZF9wcm94eQorCitmb3IgcCBpbiAxIDI7IGRvCisJdHJhY2UgImZvcmNlZCBjb21tYW5kIGluIHNzaGRfY29uZmlnIG92ZXJyaWRlcyBrZXkgb3B0aW9uIHByb3RvICRwIgorCSR7U1NIfSAtJHAgLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgZmFsc2UgXCB8fAorCSAgICBmYWlsICJmb3JjZWQgY29tbWFuZCBpbiBrZXkgcHJvdG8gJHAiCitkb25lCisKK2NwICRPQkovc3NoZF9wcm94eV9iYWsgJE9CSi9zc2hkX3Byb3h5CitlY2hvICJGb3JjZUNvbW1hbmQgZmFsc2UiID4+ICRPQkovc3NoZF9wcm94eQorZWNobyAiTWF0Y2ggVXNlciAkVVNFUiIgPj4gJE9CSi9zc2hkX3Byb3h5CitlY2hvICIgICAgRm9yY2VDb21tYW5kIHRydWUiID4+ICRPQkovc3NoZF9wcm94eQorCitmb3IgcCBpbiAxIDI7IGRvCisJdHJhY2UgImZvcmNlZCBjb21tYW5kIHdpdGggbWF0Y2ggcHJvdG8gJHAiCisJJHtTU0h9IC0kcCAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCBmYWxzZSBcIHx8CisJICAgIGZhaWwgImZvcmNlZCBjb21tYW5kIGluIGtleSBwcm90byAkcCIKK2RvbmUKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy9mb3J3YXJkaW5nLnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2ZvcndhcmRpbmcuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRlYzk5MQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9mb3J3YXJkaW5nLnNoCkBAIC0wLDAgKzEsMTA1IEBACisjCSRPcGVuQlNEOiBmb3J3YXJkaW5nLnNoLHYgMS43IDIwMTAvMDEvMTEgMDI6NTM6NDQgZHR1Y2tlciBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKK3RpZD0ibG9jYWwgYW5kIHJlbW90ZSBmb3J3YXJkaW5nIgorREFUQT0vYmluL2xzJHtFWEVFWFR9CisKK3N0YXJ0X3NzaGQKKworYmFzZT0zMworbGFzdD0kUE9SVAorZndkPSIiCitmb3IgaiBpbiAwIDEgMjsgZG8KKwlmb3IgaSBpbiAwIDEgMjsgZG8KKwkJYT0kYmFzZSRqJGkKKwkJYj1gZXhwciAkYSArIDUwYAorCQljPSRsYXN0CisJCSMgZndkIGNoYWluOiAkYSAtPiAkYiAtPiAkYworCQlmd2Q9IiRmd2QgLUwkYToxMjcuMC4wLjE6JGIgLVIkYjoxMjcuMC4wLjE6JGMiCisJCWxhc3Q9JGEKKwlkb25lCitkb25lCitmb3IgcCBpbiAxIDI7IGRvCisJcT1gZXhwciAzIC0gJHBgCisJdHJhY2UgInN0YXJ0IGZvcndhcmRpbmcsIGZvcmsgdG8gYmFja2dyb3VuZCIKKwkke1NTSH0gLSRwIC1GICRPQkovc3NoX2NvbmZpZyAtZiAkZndkIHNvbWVob3N0IHNsZWVwIDEwCisKKwl0cmFjZSAidHJhbnNmZXIgb3ZlciBmb3J3YXJkZWQgY2hhbm5lbHMgYW5kIGNoZWNrIHJlc3VsdCIKKwkke1NTSH0gLSRxIC1GICRPQkovc3NoX2NvbmZpZyAtcCRsYXN0IC1vICdDb25uZWN0aW9uQXR0ZW1wdHM9NCcgXAorCQlzb21laG9zdCBjYXQgJERBVEEgPiAkT0JKL2xzLmNvcHkKKwl0ZXN0IC1mICRPQkovbHMuY29weQkJCXx8IGZhaWwgImZhaWxlZCBjb3B5ICREQVRBIgorCWNtcCAkREFUQSAkT0JKL2xzLmNvcHkJCQl8fCBmYWlsICJjb3JydXB0ZWQgY29weSBvZiAkREFUQSIKKworCXNsZWVwIDEwCitkb25lCisKK2ZvciBwIGluIDEgMjsgZG8KK2ZvciBkIGluIEwgUjsgZG8KKwl0cmFjZSAiZXhpdCBvbiAtJGQgZm9yd2FyZCBmYWlsdXJlLCBwcm90byAkcCIKKworCSMgdGhpcyBvbmUgc2hvdWxkIHN1Y2NlZWQKKwkke1NTSH0gLSRwIC1GICRPQkovc3NoX2NvbmZpZyBcCisJICAgIC0kZCAke2Jhc2V9MDE6MTI3LjAuMC4xOiRQT1JUIFwKKwkgICAgLSRkICR7YmFzZX0wMjoxMjcuMC4wLjE6JFBPUlQgXAorCSAgICAtJGQgJHtiYXNlfTAzOjEyNy4wLjAuMTokUE9SVCBcCisJICAgIC0kZCAke2Jhc2V9MDQ6MTI3LjAuMC4xOiRQT1JUIFwKKwkgICAgLW9FeGl0T25Gb3J3YXJkRmFpbHVyZT15ZXMgc29tZWhvc3QgdHJ1ZQorCWlmIFsgJD8gIT0gMCBdOyB0aGVuCisJCWZhaWwgImNvbm5lY3Rpb24gZmFpbGVkLCBzaG91bGQgbm90IgorCWVsc2UKKwkJIyB0aGlzIG9uZSBzaG91bGQgZmFpbAorCQkke1NTSH0gLXEgLSRwIC1GICRPQkovc3NoX2NvbmZpZyBcCisJCSAgICAtJGQgJHtiYXNlfTAxOjEyNy4wLjAuMTokUE9SVCBcCisJCSAgICAtJGQgJHtiYXNlfTAyOjEyNy4wLjAuMTokUE9SVCBcCisJCSAgICAtJGQgJHtiYXNlfTAzOjEyNy4wLjAuMTokUE9SVCBcCisJCSAgICAtJGQgJHtiYXNlfTAxOjEyNy4wLjAuMTokUE9SVCBcCisJCSAgICAtJGQgJHtiYXNlfTA0OjEyNy4wLjAuMTokUE9SVCBcCisJCSAgICAtb0V4aXRPbkZvcndhcmRGYWlsdXJlPXllcyBzb21laG9zdCB0cnVlCisJCXI9JD8KKwkJaWYgWyAkciAhPSAyNTUgXTsgdGhlbgorCQkJZmFpbCAiY29ubmVjdGlvbiBub3QgdGVybWludGF0ZWQsIGJ1dCBzaG91bGQgKCRyKSIKKwkJZmkKKwlmaQorZG9uZQorZG9uZQorCitmb3IgcCBpbiAxIDI7IGRvCisJdHJhY2UgInNpbXBsZSBjbGVhciBmb3J3YXJkaW5nIHByb3RvICRwIgorCSR7U1NIfSAtJHAgLUYgJE9CSi9zc2hfY29uZmlnIC1vQ2xlYXJBbGxGb3J3YXJkaW5ncz15ZXMgc29tZWhvc3QgdHJ1ZQorCisJdHJhY2UgImNsZWFyIGxvY2FsIGZvcndhcmQgcHJvdG8gJHAiCisJJHtTU0h9IC0kcCAtZiAtRiAkT0JKL3NzaF9jb25maWcgLUwgJHtiYXNlfTAxOjEyNy4wLjAuMTokUE9SVCBcCisJICAgIC1vQ2xlYXJBbGxGb3J3YXJkaW5ncz15ZXMgc29tZWhvc3Qgc2xlZXAgMTAKKwlpZiBbICQ/ICE9IDAgXTsgdGhlbgorCQlmYWlsICJjb25uZWN0aW9uIGZhaWxlZCB3aXRoIGNsZWFyZWQgbG9jYWwgZm9yd2FyZGluZyIKKwllbHNlCisJCSMgdGhpcyBvbmUgc2hvdWxkIGZhaWwKKwkJJHtTU0h9IC0kcCAtRiAkT0JKL3NzaF9jb25maWcgLXAgJHtiYXNlfTAxIHRydWUgXAorCQkgICAgIDI+JHtURVNUX1NTSF9MT0dGSUxFfSAmJiBcCisJCQlmYWlsICJsb2NhbCBmb3J3YXJkaW5nIG5vdCBjbGVhcmVkIgorCWZpCisJc2xlZXAgMTAKKwkKKwl0cmFjZSAiY2xlYXIgcmVtb3RlIGZvcndhcmQgcHJvdG8gJHAiCisJJHtTU0h9IC0kcCAtZiAtRiAkT0JKL3NzaF9jb25maWcgLVIgJHtiYXNlfTAxOjEyNy4wLjAuMTokUE9SVCBcCisJICAgIC1vQ2xlYXJBbGxGb3J3YXJkaW5ncz15ZXMgc29tZWhvc3Qgc2xlZXAgMTAKKwlpZiBbICQ/ICE9IDAgXTsgdGhlbgorCQlmYWlsICJjb25uZWN0aW9uIGZhaWxlZCB3aXRoIGNsZWFyZWQgcmVtb3RlIGZvcndhcmRpbmciCisJZWxzZQorCQkjIHRoaXMgb25lIHNob3VsZCBmYWlsCisJCSR7U1NIfSAtJHAgLUYgJE9CSi9zc2hfY29uZmlnIC1wICR7YmFzZX0wMSB0cnVlIFwKKwkJICAgICAyPiR7VEVTVF9TU0hfTE9HRklMRX0gJiYgXAorCQkJZmFpbCAicmVtb3RlIGZvcndhcmRpbmcgbm90IGNsZWFyZWQiCisJZmkKKwlzbGVlcCAxMAorZG9uZQorCitmb3IgcCBpbiAyOyBkbworCXRyYWNlICJzdGRpbyBmb3J3YXJkaW5nIHByb3RvICRwIgorCWNtZD0iJHtTU0h9IC0kcCAtRiAkT0JKL3NzaF9jb25maWciCisJJGNtZCAtbyAiUHJveHlDb21tYW5kICRjbWQgLXEgLVcgbG9jYWxob3N0OiRQT1JUIHNvbWVob3N0IiBcCisJCXNvbWVob3N0IHRydWUKKwlpZiBbICQ/ICE9IDAgXTsgdGhlbgorCQlmYWlsICJzdGRpbyBmb3J3YXJkaW5nIHByb3RvICRwIgorCWZpCitkb25lCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvaG9zdC1leHBhbmQuc2ggYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvaG9zdC1leHBhbmQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAxODgzNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9ob3N0LWV4cGFuZC5zaApAQCAtMCwwICsxLDE4IEBACisjCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KKwordGlkPSJleHBhbmQgJWggYW5kICVuIgorCitlY2hvICdQZXJtaXRMb2NhbENvbW1hbmQgeWVzJyA+PiAkT0JKL3NzaF9wcm94eQorcHJpbnRmICdMb2NhbENvbW1hbmQgcHJpbnRmICIlJSUlc1xcbiIgIiUlbiIgIiUlaCJcbicgPj4gJE9CSi9zc2hfcHJveHkKKworY2F0ID4kT0JKL2V4cGVjdCA8PEVPRQorc29tZWhvc3QKKzEyNy4wLjAuMQorRU9FCisKK2ZvciBwIGluIDEgMjsgZG8KKwl2ZXJib3NlICJ0ZXN0ICR0aWQ6IHByb3RvICRwIgorCSR7U1NIfSAtRiAkT0JKL3NzaF9wcm94eSAtJHAgc29tZWhvc3QgdHJ1ZSA+JE9CSi9hY3R1YWwKKwlkaWZmICRPQkovZXhwZWN0ICRPQkovYWN0dWFsIHx8IGZhaWwgIiR0aWQgcHJvdG8gJHAiCitkb25lCisKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy9rZXh0eXBlLnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2tleHR5cGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzljMDgxNwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9rZXh0eXBlLnNoCkBAIC0wLDAgKzEsMzAgQEAKKyMJJE9wZW5CU0Q6IGtleHR5cGUuc2gsdiAxLjEgMjAxMC8wOS8yMiAxMjoyNjowNSBkam0gRXhwICQKKyMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgorCit0aWQ9ImxvZ2luIHdpdGggZGlmZmVyZW50IGtleSBleGNoYW5nZSBhbGdvcml0aG1zIgorCitUSU1FPS91c3IvYmluL3RpbWUKK2NwICRPQkovc3NoZF9wcm94eSAkT0JKL3NzaGRfcHJveHlfYmFrCitjcCAkT0JKL3NzaF9wcm94eSAkT0JKL3NzaF9wcm94eV9iYWsKKworaWYgdGVzdCAiJFRFU1RfU1NIX0VDQyIgPSAieWVzIjsgdGhlbgorCWtleHR5cGVzPSJlY2RoLXNoYTItbmlzdHAyNTYgZWNkaC1zaGEyLW5pc3RwMzg0IGVjZGgtc2hhMi1uaXN0cDUyMSIKK2ZpCitpZiB0ZXN0ICIkVEVTVF9TU0hfU0hBMjU2IiA9ICJ5ZXMiOyB0aGVuCisJa2V4dHlwZXM9IiRrZXh0eXBlcyBkaWZmaWUtaGVsbG1hbi1ncm91cC1leGNoYW5nZS1zaGEyNTYiCitmaQora2V4dHlwZXM9IiRrZXh0eXBlcyBkaWZmaWUtaGVsbG1hbi1ncm91cC1leGNoYW5nZS1zaGExIgora2V4dHlwZXM9IiRrZXh0eXBlcyBkaWZmaWUtaGVsbG1hbi1ncm91cDE0LXNoYTEiCitrZXh0eXBlcz0iJGtleHR5cGVzIGRpZmZpZS1oZWxsbWFuLWdyb3VwMS1zaGExIgorCit0cmllcz0iMSAyIDMgNCIKK2ZvciBrIGluICRrZXh0eXBlczsgZG8gCisJdmVyYm9zZSAia2V4ICRrIgorCWZvciBpIGluICR0cmllczsgZG8KKwkJJHtTU0h9IC1GICRPQkovc3NoX3Byb3h5IC1vIEtleEFsZ29yaXRobXM9JGsgeCB0cnVlCisJCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCQkJZmFpbCAic3NoIGtleCAkayIKKwkJZmkKKwlkb25lCitkb25lCisKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy9rZXktb3B0aW9ucy5zaCBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9rZXktb3B0aW9ucy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOThkNzhiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2tleS1vcHRpb25zLnNoCkBAIC0wLDAgKzEsNzEgQEAKKyMJJE9wZW5CU0Q6IGtleS1vcHRpb25zLnNoLHYgMS4yIDIwMDgvMDYvMzAgMDg6MDc6MzQgZGptIEV4cCAkCisjCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KKwordGlkPSJrZXkgb3B0aW9ucyIKKworb3JpZ2tleXM9IiRPQkovYXV0aGtleXNfb3JpZyIKK2F1dGhrZXlzPSIkT0JKL2F1dGhvcml6ZWRfa2V5c18ke1VTRVJ9IgorY3AgJGF1dGhrZXlzICRvcmlna2V5cworCisjIFRlc3QgY29tbWFuZD0gZm9yY2VkIGNvbW1hbmQKK2ZvciBwIGluIDEgMjsgZG8KKyAgICBmb3IgYyBpbiAnY29tbWFuZD0iZWNobyBiYXIiJyAnbm8tcHR5LGNvbW1hbmQ9ImVjaG8gYmFyIic7IGRvCisJc2VkICJzLy4qLyRjICYvIiAkb3JpZ2tleXMgPiRhdXRoa2V5cworCXZlcmJvc2UgImtleSBvcHRpb24gcHJvdG8gJHAgJGMiCisJcj1gJHtTU0h9IC0kcCAtcSAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCBlY2hvIGZvb2AKKwlpZiBbICIkciIgPSAiZm9vIiBdOyB0aGVuCisJCWZhaWwgImtleSBvcHRpb24gZm9yY2VkIGNvbW1hbmQgbm90IHJlc3RyaWN0ZWQiCisJZmkKKwlpZiBbICIkciIgIT0gImJhciIgXTsgdGhlbgorCQlmYWlsICJrZXkgb3B0aW9uIGZvcmNlZCBjb21tYW5kIG5vdCBleGVjdXRlZCIKKwlmaQorICAgIGRvbmUKK2RvbmUKKworIyBUZXN0IG5vLXB0eQorc2VkICdzLy4qL25vLXB0eSAmLycgJG9yaWdrZXlzID4kYXV0aGtleXMKK2ZvciBwIGluIDEgMjsgZG8KKwl2ZXJib3NlICJrZXkgb3B0aW9uIHByb3RvICRwIG5vLXB0eSIKKwlyPWAke1NTSH0gLSRwIC1xIC1GICRPQkovc3NoX3Byb3h5IHNvbWVob3N0IHR0eWAKKwlpZiBbIC1mICIkciIgXTsgdGhlbgorCQlmYWlsICJrZXkgb3B0aW9uIGZhaWxlZCBwcm90byAkcCBuby1wdHkgKHB0eSAkcikiCisJZmkKK2RvbmUKKworIyBUZXN0IGVudmlyb25tZW50PQorZWNobyAnUGVybWl0VXNlckVudmlyb25tZW50IHllcycgPj4gJE9CSi9zc2hkX3Byb3h5CitzZWQgJ3MvLiovZW52aXJvbm1lbnQ9IkZPTz1iYXIiICYvJyAkb3JpZ2tleXMgPiRhdXRoa2V5cworZm9yIHAgaW4gMSAyOyBkbworCXZlcmJvc2UgImtleSBvcHRpb24gcHJvdG8gJHAgZW52aXJvbm1lbnQiCisJcj1gJHtTU0h9IC0kcCAtcSAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCAnZWNobyAkRk9PJ2AKKwlpZiBbICIkciIgIT0gImJhciIgXTsgdGhlbgorCQlmYWlsICJrZXkgb3B0aW9uIGVudmlyb25tZW50IG5vdCBzZXQiCisJZmkKK2RvbmUKKworIyBUZXN0IGZyb209IHJlc3RyaWN0aW9uCitzdGFydF9zc2hkCitmb3IgcCBpbiAxIDI7IGRvCisgICAgZm9yIGYgaW4gMTI3LjAuMC4xICcxMjcuMC4wLjBcLzgnOyBkbworCWNhdCAgJG9yaWdrZXlzID4kYXV0aGtleXMKKwkke1NTSH0gLSRwIC1xIC1GICRPQkovc3NoX3Byb3h5IHNvbWVob3N0IHRydWUKKwlpZiBbICQ/IC1uZSAwIF07IHRoZW4KKwkJZmFpbCAia2V5IG9wdGlvbiBwcm90byAkcCBmYWlsZWQgd2l0aG91dCByZXN0cmljdGlvbiIKKwlmaQorCisJc2VkICdzLy4qL2Zyb209IiciJGYiJyIgJi8nICRvcmlna2V5cyA+JGF1dGhrZXlzCisJZnJvbT1gaGVhZCAtMSAkYXV0aGtleXMgfCBjdXQgLWYxIC1kICcgJ2AKKwl2ZXJib3NlICJrZXkgb3B0aW9uIHByb3RvICRwICRmcm9tIgorCXI9YCR7U1NIfSAtJHAgLXEgLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgJ2VjaG8gdHJ1ZSdgCisJaWYgWyAiJHIiID0gInRydWUiIF07IHRoZW4KKwkJZmFpbCAia2V5IG9wdGlvbiBwcm90byAkcCAkZnJvbSBub3QgcmVzdHJpY3RlZCIKKwlmaQorCisJcj1gJHtTU0h9IC0kcCAtcSAtRiAkT0JKL3NzaF9jb25maWcgc29tZWhvc3QgJ2VjaG8gdHJ1ZSdgCisJaWYgWyAiJHIiICE9ICJ0cnVlIiBdOyB0aGVuCisJCWZhaWwgImtleSBvcHRpb24gcHJvdG8gJHAgJGZyb20gbm90IGFsbG93ZWQgYnV0IHNob3VsZCBiZSIKKwlmaQorICAgIGRvbmUKK2RvbmUKKworcm0gLWYgIiRvcmlna2V5cyIKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy9rZXlnZW4tY2hhbmdlLnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2tleWdlbi1jaGFuZ2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhkMzU5MAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9rZXlnZW4tY2hhbmdlLnNoCkBAIC0wLDAgKzEsMjMgQEAKKyMJJE9wZW5CU0Q6IGtleWdlbi1jaGFuZ2Uuc2gsdiAxLjIgMjAwMi8wNy8xNiAwOToxNTo1NSBtYXJrdXMgRXhwICQKKyMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgorCit0aWQ9ImNoYW5nZSBwYXNzcGhyYXNlIGZvciBrZXkiCisKK1MxPSJzZWNyZXQxIgorUzI9IjJzZWNyZXQiCisKK2ZvciB0IGluIHJzYSBkc2EgcnNhMTsgZG8KKwkjIGdlbmVyYXRlIHVzZXIga2V5IGZvciBhZ2VudAorCXRyYWNlICJnZW5lcmF0aW5nICR0IGtleSIKKwlybSAtZiAkT0JKLyR0LWtleQorCSR7U1NIS0VZR0VOfSAtcSAtTiAke1MxfSAtdCAkdCAtZiAkT0JKLyR0LWtleQorCWlmIFsgJD8gLWVxIDAgXTsgdGhlbgorCQkke1NTSEtFWUdFTn0gLXAgLVAgJHtTMX0gLU4gJHtTMn0gLWYgJE9CSi8kdC1rZXkgPiAvZGV2L251bGwKKwkJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJCQlmYWlsICJzc2gta2V5Z2VuIC1wIGZhaWxlZCBmb3IgJHQta2V5IgorCQlmaQorCWVsc2UKKwkJZmFpbCAic3NoLWtleWdlbiBmb3IgJHQta2V5IGZhaWxlZCIKKwlmaQorCXJtIC1mICRPQkovJHQta2V5ICRPQkovJHQta2V5LnB1YgorZG9uZQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2tleWdlbi1jb252ZXJ0LnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2tleWdlbi1jb252ZXJ0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMGU5YzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mva2V5Z2VuLWNvbnZlcnQuc2gKQEAgLTAsMCArMSwzMyBAQAorIwkkT3BlbkJTRDoga2V5Z2VuLWNvbnZlcnQuc2gsdiAxLjEgMjAwOS8xMS8wOSAwNDoyMDowNCBkdHVja2VyIEV4cCAkCisjCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KKwordGlkPSJjb252ZXJ0IGtleXMiCisKK2ZvciB0IGluIHJzYSBkc2E7IGRvCisJIyBnZW5lcmF0ZSB1c2VyIGtleSBmb3IgYWdlbnQKKwl0cmFjZSAiZ2VuZXJhdGluZyAkdCBrZXkiCisJcm0gLWYgJE9CSi8kdC1rZXkKKwkke1NTSEtFWUdFTn0gLXEgLU4gIiIgLXQgJHQgLWYgJE9CSi8kdC1rZXkKKworCXRyYWNlICJleHBvcnQgJHQgcHJpdmF0ZSB0byByZmM0NzE2IHB1YmxpYyIKKwkke1NTSEtFWUdFTn0gLXEgLWUgLWYgJE9CSi8kdC1rZXkgPiRPQkovJHQta2V5LXJmYyB8fCBcCisJICAgIGZhaWwgImV4cG9ydCAkdCBwcml2YXRlIHRvIHJmYzQ3MTYgcHVibGljIgorCisJdHJhY2UgImV4cG9ydCAkdCBwdWJsaWMgdG8gcmZjNDcxNiBwdWJsaWMiCisJJHtTU0hLRVlHRU59IC1xIC1lIC1mICRPQkovJHQta2V5LnB1YiA+JE9CSi8kdC1rZXktcmZjLnB1YiB8fCBcCisJICAgIGZhaWwgIiR0IHB1YmxpYyB0byByZmM0NzE2IHB1YmxpYyIKKworCWNtcCAkT0JKLyR0LWtleS1yZmMgJE9CSi8kdC1rZXktcmZjLnB1YiB8fCBcCisJICAgIGZhaWwgIiR0IHJmYzQ3MTYgZXhwb3J0cyBkaWZmZXIgYmV0d2VlbiBwdWJsaWMgYW5kIHByaXZhdGUiCisKKwl0cmFjZSAiaW1wb3J0ICR0IHJmYzQ3MTYgcHVibGljIgorCSR7U1NIS0VZR0VOfSAtcSAtaSAtZiAkT0JKLyR0LWtleS1yZmMgPiRPQkovJHQtcmZjLWltcG9ydGVkIHx8IFwKKwkgICAgZmFpbCAiJHQgaW1wb3J0IHJmYzQ3MTYgcHVibGljIgorCisJY3V0IC1mMSwyIC1kICIgIiAkT0JKLyR0LWtleS5wdWIgPiRPQkovJHQta2V5LW5vY29tbWVudC5wdWIKKwljbXAgJE9CSi8kdC1rZXktbm9jb21tZW50LnB1YiAkT0JKLyR0LXJmYy1pbXBvcnRlZCB8fCBcCisJICAgIGZhaWwgIiR0IGltcG9ydGVkIGRpZmZlcnMgZnJvbSBvcmlnaW5hbCIKKworCXJtIC1mICRPQkovJHQta2V5ICRPQkovJHQta2V5LnB1YiAkT0JKLyR0LWtleS1yZmMgJE9CSi8kdC1rZXktcmZjLnB1YiBcCisJICAgICRPQkovJHQtcmZjLWltcG9ydGVkICRPQkovJHQta2V5LW5vY29tbWVudC5wdWIKK2RvbmUKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy9rZXlzY2FuLnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2tleXNjYW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmMTRmMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9rZXlzY2FuLnNoCkBAIC0wLDAgKzEsMTkgQEAKKyMJJE9wZW5CU0Q6IGtleXNjYW4uc2gsdiAxLjMgMjAwMi8wMy8xNSAxMzowODo1NiBtYXJrdXMgRXhwICQKKyMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgorCit0aWQ9ImtleXNjYW4iCisKKyMgcmVtb3ZlIERTQSBob3N0a2V5CitybSAtZiAke09CSn0vaG9zdC5kc2EKKworc3RhcnRfc3NoZAorCitmb3IgdCBpbiByc2ExIHJzYSBkc2E7IGRvCisJdHJhY2UgImtleXNjYW4gdHlwZSAkdCIKKwkke1NTSEtFWVNDQU59IC10ICR0IC1wICRQT1JUIDEyNy4wLjAuMSAxMjcuMC4wLjEgMTI3LjAuMC4xIFwKKwkJPiAvZGV2L251bGwgMj4mMQorCXI9JD8KKwlpZiBbICRyIC1uZSAwIF07IHRoZW4KKwkJZmFpbCAic3NoLWtleXNjYW4gLXQgJHQgZmFpbGVkIHdpdGg6ICRyIgorCWZpCitkb25lCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mva2V5dHlwZS5zaCBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9rZXl0eXBlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNDBjNjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mva2V5dHlwZS5zaApAQCAtMCwwICsxLDU1IEBACisjCSRPcGVuQlNEOiBrZXl0eXBlLnNoLHYgMS4xIDIwMTAvMDkvMDIgMTY6MTI6NTUgbWFya3VzIEV4cCAkCisjCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KKwordGlkPSJsb2dpbiB3aXRoIGRpZmZlcmVudCBrZXkgdHlwZXMiCisKK1RJTUU9YHdoaWNoIHRpbWUgMj4vZGV2L251bGxgCitpZiB0ZXN0ICEgLXggIiRUSU1FIjsgdGhlbgorCVRJTUU9IiIKK2ZpCisKK2NwICRPQkovc3NoZF9wcm94eSAkT0JKL3NzaGRfcHJveHlfYmFrCitjcCAkT0JKL3NzaF9wcm94eSAkT0JKL3NzaF9wcm94eV9iYWsKKwora3R5cGVzPSJkc2EtMTAyNCByc2EtMjA0OCByc2EtMzA3MiIKK2lmIHRlc3QgIiRURVNUX1NTSF9FQ0MiID0gInllcyI7IHRoZW4KKwlrdHlwZXM9IiRrdHlwZXMgZWNkc2EtMjU2IGVjZHNhLTM4NCBlY2RzYS01MjEiCitmaQorCitmb3Iga3QgaW4gJGt0eXBlczsgZG8gCisJcm0gLWYgJE9CSi9rZXkuJGt0CisJYml0cz1gZWNobyAke2t0fSB8IGF3ayAtRi0gJ3twcmludCAkMn0nYAorCXR5cGU9YGVjaG8gJHtrdH0gIHwgYXdrIC1GLSAne3ByaW50ICQxfSdgCisJcHJpbnRmICJrZXlnZW4gJHR5cGUsICRiaXRzIGJpdHM6XHQiCisJJHtUSU1FfSAke1NTSEtFWUdFTn0gLWIgJGJpdHMgLXEgLU4gJycgLXQgJHR5cGUgIC1mICRPQkova2V5LiRrdCB8fFwKKwkJZmFpbCAic3NoLWtleWdlbiBmb3IgdHlwZSAkdHlwZSwgJGJpdHMgYml0cyBmYWlsZWQiCitkb25lCisKK3RyaWVzPSIxIDIgMyIKK2ZvciB1dCBpbiAka3R5cGVzOyBkbyAKKwlodHlwZXM9JHV0CisJI2h0eXBlcz0ka3R5cGVzCisJZm9yIGh0IGluICRodHlwZXM7IGRvIAorCQl0cmFjZSAic3NoIGNvbm5lY3QsIHVzZXJrZXkgJHV0LCBob3N0a2V5ICRodCIKKwkJKAorCQkJZ3JlcCAtdiBIb3N0S2V5ICRPQkovc3NoZF9wcm94eV9iYWsKKwkJCWVjaG8gSG9zdEtleSAkT0JKL2tleS4kaHQgCisJCSkgPiAkT0JKL3NzaGRfcHJveHkKKwkJKAorCQkJZ3JlcCAtdiBJZGVudGl0eUZpbGUgJE9CSi9zc2hfcHJveHlfYmFrCisJCQllY2hvIElkZW50aXR5RmlsZSAkT0JKL2tleS4kdXQgCisJCSkgPiAkT0JKL3NzaF9wcm94eQorCQkoCisJCQllY2hvbiAnbG9jYWxob3N0LXdpdGgtYWxpYXMsMTI3LjAuMC4xLDo6MSAnCisJCQljYXQgJE9CSi9rZXkuJGh0LnB1YgorCQkpID4gJE9CSi9rbm93bl9ob3N0cworCQljYXQgJE9CSi9rZXkuJHV0LnB1YiA+ICRPQkovYXV0aG9yaXplZF9rZXlzXyRVU0VSCisJCWZvciBpIGluICR0cmllczsgZG8KKwkJCXByaW50ZiAidXNlcmtleSAkdXQsIGhvc3RrZXkgJHtodH06XHQiCisJCQkke1RJTUV9ICR7U1NIfSAtRiAkT0JKL3NzaF9wcm94eSA5OTkuOTk5Ljk5OS45OTkgdHJ1ZQorCQkJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJCQkJZmFpbCAic3NoIHVzZXJrZXkgJHV0LCBob3N0a2V5ICRodCBmYWlsZWQiCisJCQlmaQorCQlkb25lCisJZG9uZQorZG9uZQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9yZWdyZXNzL2xvY2FsY29tbWFuZC5zaCBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9sb2NhbGNvbW1hbmQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVhZGU3YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9sb2NhbGNvbW1hbmQuc2gKQEAgLTAsMCArMSwxNSBAQAorIwkkT3BlbkJTRDogbG9jYWxjb21tYW5kLnNoLHYgMS4xIDIwMDcvMTAvMjkgMDY6NTc6MTMgZHR1Y2tlciBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKK3RpZD0ibG9jYWxjb21tYW5kIgorCitlY2hvICdQZXJtaXRMb2NhbENvbW1hbmQgeWVzJyA+PiAkT0JKL3NzaF9wcm94eQorZWNobyAnTG9jYWxDb21tYW5kIGVjaG8gZm9vJyA+PiAkT0JKL3NzaF9wcm94eQorCitmb3IgcCBpbiAxIDI7IGRvCisJdmVyYm9zZSAidGVzdCAkdGlkOiBwcm90byAkcCBsb2NhbGNvbW1hbmQiCisJYT1gJHtTU0h9IC1GICRPQkovc3NoX3Byb3h5IC0kcCBzb21laG9zdCB0cnVlYAorCWlmIFsgIiRhIiAhPSAiZm9vIiBdIDsgdGhlbgorCQlmYWlsICIkdGlkIHByb3RvICRwIgorCWZpCitkb25lCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvbG9naW4tdGltZW91dC5zaCBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9sb2dpbi10aW1lb3V0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZmJiMzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvbG9naW4tdGltZW91dC5zaApAQCAtMCwwICsxLDI5IEBACisjCSRPcGVuQlNEOiBsb2dpbi10aW1lb3V0LnNoLHYgMS40IDIwMDUvMDIvMjcgMjM6MTM6MzYgZGptIEV4cCAkCisjCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KKwordGlkPSJjb25uZWN0IGFmdGVyIGxvZ2luIGdyYWNlIHRpbWVvdXQiCisKK3RyYWNlICJ0ZXN0IGxvZ2luIGdyYWNlIHdpdGggcHJpdnNlcCIKK2VjaG8gIkxvZ2luR3JhY2VUaW1lIDEwcyIgPj4gJE9CSi9zc2hkX2NvbmZpZworZWNobyAiTWF4U3RhcnR1cHMgMSIgPj4gJE9CSi9zc2hkX2NvbmZpZworc3RhcnRfc3NoZAorCisoZWNobyBTU0gtMi4wLWZha2U7IHNsZWVwIDYwKSB8IHRlbG5ldCAxMjcuMC4wLjEgJHtQT1JUfSA+L2Rldi9udWxsIDI+JjEgJiAKK3NsZWVwIDE1Ciske1NTSH0gLUYgJE9CSi9zc2hfY29uZmlnIHNvbWVob3N0IHRydWUKK2lmIFsgJD8gLW5lIDAgXTsgdGhlbgorCWZhaWwgInNzaCBjb25uZWN0IGFmdGVyIGxvZ2luIGdyYWNlIHRpbWVvdXQgZmFpbGVkIHdpdGggcHJpdnNlcCIKK2ZpCisKKyRTVURPIGtpbGwgYCRTVURPIGNhdCAkUElERklMRWAKKwordHJhY2UgInRlc3QgbG9naW4gZ3JhY2Ugd2l0aG91dCBwcml2c2VwIgorZWNobyAiVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiBubyIgPj4gJE9CSi9zc2hkX2NvbmZpZworc3RhcnRfc3NoZAorCisoZWNobyBTU0gtMi4wLWZha2U7IHNsZWVwIDYwKSB8IHRlbG5ldCAxMjcuMC4wLjEgJHtQT1JUfSA+L2Rldi9udWxsIDI+JjEgJiAKK3NsZWVwIDE1Ciske1NTSH0gLUYgJE9CSi9zc2hfY29uZmlnIHNvbWVob3N0IHRydWUKK2lmIFsgJD8gLW5lIDAgXTsgdGhlbgorCWZhaWwgInNzaCBjb25uZWN0IGFmdGVyIGxvZ2luIGdyYWNlIHRpbWVvdXQgZmFpbGVkIHdpdGhvdXQgcHJpdnNlcCIKK2ZpCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvbXVsdGlwbGV4LnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL211bHRpcGxleC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTRjZGYwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL211bHRpcGxleC5zaApAQCAtMCwwICsxLDkxIEBACisjCSRPcGVuQlNEOiBtdWx0aXBsZXguc2gsdiAxLjEyIDIwMDkvMDUvMDUgMDc6NTE6MzYgZHR1Y2tlciBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKK0NUTD0vdG1wL29wZW5zc2gucmVncmVzcy5jdGwtc29jay4kJAorCit0aWQ9ImNvbm5lY3Rpb24gbXVsdGlwbGV4aW5nIgorCitpZiBjb25maWdfZGVmaW5lZCBESVNBQkxFX0ZEX1BBU1NJTkcgOyB0aGVuCisJZWNobyAic2tpcHBlZCAobm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtKSIKKwlleGl0IDAKK2ZpCisKK0RBVEE9L2Jpbi9scyR7RVhFRVhUfQorQ09QWT0kT0JKL2xzLmNvcHkKK0xPRz0kVEVTVF9TU0hfTE9HRklMRQorCitzdGFydF9zc2hkCisKK3RyYWNlICJzdGFydCBtYXN0ZXIsIGZvcmsgdG8gYmFja2dyb3VuZCIKKyR7U1NIfSAtTm4yIC1NUyRDVEwgLUYgJE9CSi9zc2hfY29uZmlnIC1vU2VuZEVudj0iX1hYWF9URVNUIiBzb21laG9zdCAmCitNQVNURVJfUElEPSQhCisKKyMgV2FpdCBmb3IgbWFzdGVyIHRvIHN0YXJ0IGFuZCBhdXRoZW50aWNhdGUKK3NsZWVwIDUKKwordmVyYm9zZSAidGVzdCAkdGlkOiBlbnZwYXNzIgordHJhY2UgImVudiBwYXNzaW5nIG92ZXIgbXVsdGlwbGV4ZWQgY29ubmVjdGlvbiIKK19YWFhfVEVTVD1ibGFoICR7U1NIfSAtRiAkT0JKL3NzaF9jb25maWcgLW9TZW5kRW52PSJfWFhYX1RFU1QiIC1TJENUTCBvdGhlcmhvc3Qgc2ggPDwgJ0VPRicKKwl0ZXN0IFgiJF9YWFhfVEVTVCIgPSBYImJsYWgiCitFT0YKK2lmIFsgJD8gLW5lIDAgXTsgdGhlbgorCWZhaWwgImVudmlyb25tZW50IG5vdCBmb3VuZCIKK2ZpCisKK3ZlcmJvc2UgInRlc3QgJHRpZDogdHJhbnNmZXIiCitybSAtZiAke0NPUFl9Cit0cmFjZSAic3NoIHRyYW5zZmVyIG92ZXIgbXVsdGlwbGV4ZWQgY29ubmVjdGlvbiBhbmQgY2hlY2sgcmVzdWx0IgorJHtTU0h9IC1GICRPQkovc3NoX2NvbmZpZyAtUyRDVEwgb3RoZXJob3N0IGNhdCAke0RBVEF9ID4gJHtDT1BZfQordGVzdCAtZiAke0NPUFl9CQkJfHwgZmFpbCAic3NoIC1TY3RsOiBmYWlsZWQgY29weSAke0RBVEF9IiAKK2NtcCAke0RBVEF9ICR7Q09QWX0JCXx8IGZhaWwgInNzaCAtU2N0bDogY29ycnVwdGVkIGNvcHkgb2YgJHtEQVRBfSIKKworcm0gLWYgJHtDT1BZfQordHJhY2UgInNzaCB0cmFuc2ZlciBvdmVyIG11bHRpcGxleGVkIGNvbm5lY3Rpb24gYW5kIGNoZWNrIHJlc3VsdCIKKyR7U1NIfSAtRiAkT0JKL3NzaF9jb25maWcgLVMgJENUTCBvdGhlcmhvc3QgY2F0ICR7REFUQX0gPiAke0NPUFl9Cit0ZXN0IC1mICR7Q09QWX0JCQl8fCBmYWlsICJzc2ggLVMgY3RsOiBmYWlsZWQgY29weSAke0RBVEF9IiAKK2NtcCAke0RBVEF9ICR7Q09QWX0JCXx8IGZhaWwgInNzaCAtUyBjdGw6IGNvcnJ1cHRlZCBjb3B5IG9mICR7REFUQX0iCisKK3JtIC1mICR7Q09QWX0KK3RyYWNlICJzZnRwIHRyYW5zZmVyIG92ZXIgbXVsdGlwbGV4ZWQgY29ubmVjdGlvbiBhbmQgY2hlY2sgcmVzdWx0IgorZWNobyAiZ2V0ICR7REFUQX0gJHtDT1BZfSIgfCBcCisJJHtTRlRQfSAtUyAke1NTSH0gLUYgJE9CSi9zc2hfY29uZmlnIC1vQ29udHJvbFBhdGg9JENUTCBvdGhlcmhvc3QgPiRMT0cgMj4mMQordGVzdCAtZiAke0NPUFl9CQkJfHwgZmFpbCAic2Z0cDogZmFpbGVkIGNvcHkgJHtEQVRBfSIgCitjbXAgJHtEQVRBfSAke0NPUFl9CQl8fCBmYWlsICJzZnRwOiBjb3JydXB0ZWQgY29weSBvZiAke0RBVEF9IgorCitybSAtZiAke0NPUFl9Cit0cmFjZSAic2NwIHRyYW5zZmVyIG92ZXIgbXVsdGlwbGV4ZWQgY29ubmVjdGlvbiBhbmQgY2hlY2sgcmVzdWx0IgorJHtTQ1B9IC1TICR7U1NIfSAtRiAkT0JKL3NzaF9jb25maWcgLW9Db250cm9sUGF0aD0kQ1RMIG90aGVyaG9zdDoke0RBVEF9ICR7Q09QWX0gPiRMT0cgMj4mMQordGVzdCAtZiAke0NPUFl9CQkJfHwgZmFpbCAic2NwOiBmYWlsZWQgY29weSAke0RBVEF9IiAKK2NtcCAke0RBVEF9ICR7Q09QWX0JCXx8IGZhaWwgInNjcDogY29ycnVwdGVkIGNvcHkgb2YgJHtEQVRBfSIKKworcm0gLWYgJHtDT1BZfQorCitmb3IgcyBpbiAwIDEgNCA1IDQ0OyBkbworCXRyYWNlICJleGl0IHN0YXR1cyAkcyBvdmVyIG11bHRpcGxleGVkIGNvbm5lY3Rpb24iCisJdmVyYm9zZSAidGVzdCAkdGlkOiBzdGF0dXMgJHMiCisJJHtTU0h9IC1GICRPQkovc3NoX2NvbmZpZyAtUyAkQ1RMIG90aGVyaG9zdCBleGl0ICRzCisJcj0kPworCWlmIFsgJHIgLW5lICRzIF07IHRoZW4KKwkJZmFpbCAiZXhpdCBjb2RlIG1pc21hdGNoIGZvciBwcm90b2NvbCAkcDogJHIgIT0gJHMiCisJZmkKKworCSMgc2FtZSB3aXRoIGVhcmx5IGNsb3NlIG9mIHN0ZG91dC9lcnIKKwl0cmFjZSAiZXhpdCBzdGF0dXMgJHMgd2l0aCBlYXJseSBjbG9zZSBvdmVyIG11bHRpcGxleGVkIGNvbm5lY3Rpb24iCisJJHtTU0h9IC1GICRPQkovc3NoX2NvbmZpZyAtUyAkQ1RMIC1uIG90aGVyaG9zdCBcCisgICAgICAgICAgICAgICAgZXhlYyBzaCAtYyBcJyJzbGVlcCAyOyBleGVjID4gL2Rldi9udWxsIDI+JjE7IHNsZWVwIDM7IGV4aXQgJHMiXCcKKwlyPSQ/CisJaWYgWyAkciAtbmUgJHMgXTsgdGhlbgorCQlmYWlsICJleGl0IGNvZGUgKHdpdGggc2xlZXApIG1pc21hdGNoIGZvciBwcm90b2NvbCAkcDogJHIgIT0gJHMiCisJZmkKK2RvbmUKKwordHJhY2UgInRlc3QgY2hlY2sgY29tbWFuZCIKKyR7U1NIfSAtRiAkT0JKL3NzaF9jb25maWcgLVMgJENUTCAtT2NoZWNrIG90aGVyaG9zdCB8fCBmYWlsICJjaGVjayBjb21tYW5kIGZhaWxlZCIgCisKK3RyYWNlICJ0ZXN0IGV4aXQgY29tbWFuZCIKKyR7U1NIfSAtRiAkT0JKL3NzaF9jb25maWcgLVMgJENUTCAtT2V4aXQgb3RoZXJob3N0IHx8IGZhaWwgInNlbmQgZXhpdCBjb21tYW5kIGZhaWxlZCIgCisKKyMgV2FpdCBmb3IgbWFzdGVyIHRvIGV4aXQKK3NsZWVwIDIKKwora2lsbCAtMCAkTUFTVEVSX1BJRCA+L2Rldi9udWxsIDI+JjEgJiYgZmFpbCAiZXhpdCBjb21tYW5kIGZhaWxlZCIgCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvcG9ydG51bS5zaCBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9wb3J0bnVtLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZTA2ODAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvcG9ydG51bS5zaApAQCAtMCwwICsxLDM0IEBACisjCSRPcGVuQlNEOiBwb3J0bnVtLnNoLHYgMS4xIDIwMDkvMDgvMTMgMDA6NTc6MTcgZGptIEV4cCAkCisjCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KKwordGlkPSJwb3J0IG51bWJlciBwYXJzaW5nIgorCitiYWRwb3J0KCkgeworCXBvcnQ9JDEKKwl2ZXJib3NlICIkdGlkOiBpbnZhbGlkIHBvcnQgJHBvcnQiCisJaWYgJHtTU0h9IC1GICRPQkovc3NoX3Byb3h5IC1wICRwb3J0IHNvbWVob3N0IHRydWUgMj4vZGV2L251bGwgOyB0aGVuCisJCWZhaWwgIiR0aWQgYWNjZXB0ZWQgaW52YWxpZCBwb3J0ICRwb3J0IgorCWZpCit9Citnb29kcG9ydCgpIHsKKwlwb3J0PSQxCisJdmVyYm9zZSAiJHRpZDogdmFsaWQgcG9ydCAkcG9ydCIKKwlpZiAke1NTSH0gLUYgJE9CSi9zc2hfcHJveHkgLXAgJHBvcnQgc29tZWhvc3QgdHJ1ZSAyPi9kZXYvbnVsbCA7IHRoZW4KKwkJOgorCWVsc2UKKwkJZmFpbCAiJHRpZCByZWplY3RlZCB2YWxpZCBwb3J0ICRwb3J0IgorCWZpCit9CisKK2JhZHBvcnQgMAorYmFkcG9ydCA2NTUzNgorYmFkcG9ydCAxMzEwNzMKK2JhZHBvcnQgMjAwMGJsYWgKK2JhZHBvcnQgYmxhaDIwMDAKKworZ29vZHBvcnQgMQorZ29vZHBvcnQgMjIKK2dvb2Rwb3J0IDIyMjIKK2dvb2Rwb3J0IDIyMjIyCitnb29kcG9ydCA2NTUzNQorCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvcHJvdG8tbWlzbWF0Y2guc2ggYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvcHJvdG8tbWlzbWF0Y2guc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1MjFmMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9wcm90by1taXNtYXRjaC5zaApAQCAtMCwwICsxLDE5IEBACisjCSRPcGVuQlNEOiBwcm90by1taXNtYXRjaC5zaCx2IDEuMyAyMDAyLzAzLzE1IDEzOjA4OjU2IG1hcmt1cyBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKK3RpZD0icHJvdG9jb2wgdmVyc2lvbiBtaXNtYXRjaCIKKworbWlzbWF0Y2ggKCkKK3sKKwlzZXJ2ZXI9JDEKKwljbGllbnQ9JDIKKwliYW5uZXI9YGVjaG8gJHtjbGllbnR9IHwgJHtTU0hEfSAtbyAiUHJvdG9jb2w9JHtzZXJ2ZXJ9IiAtaSAtZiAke09CSn0vc3NoZF9wcm94eWAKKwlyPSQ/CisJdHJhY2UgInNzaGQgcHJpbnRzICR7YmFubmVyfSIKKwlpZiBbICRyIC1uZSAyNTUgXTsgdGhlbgorCQlmYWlsICJzc2hkIHByaW50cyAke2Jhbm5lcn0gYW5kIGFjY2VwdHMgY29ubmVjdCB3aXRoIHZlcnNpb24gJHtjbGllbnR9IgorCWZpCit9CisKK21pc21hdGNoCTIJU1NILTEuNS1IQUxMTworbWlzbWF0Y2gJMQlTU0gtMi4wLUhBTExPCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvcHJvdG8tdmVyc2lvbi5zaCBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9wcm90by12ZXJzaW9uLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NTFhNjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvcHJvdG8tdmVyc2lvbi5zaApAQCAtMCwwICsxLDM0IEBACisjCSRPcGVuQlNEOiBwcm90by12ZXJzaW9uLnNoLHYgMS4zIDIwMDIvMDMvMTUgMTM6MDg6NTYgbWFya3VzIEV4cCAkCisjCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KKwordGlkPSJzc2hkIHZlcnNpb24gd2l0aCBkaWZmZXJlbnQgcHJvdG9jb2wgY29tYmluYXRpb25zIgorCisjIHdlIGp1c3Qgc3RhcnQgc3NoZCBpbiBpbmV0ZCBtb2RlIGFuZCBjaGVjayB0aGUgYmFubmVyCitjaGVja192ZXJzaW9uICgpCit7CisJdmVyc2lvbj0kMQorCWV4cGVjdD0kMgorCWJhbm5lcj1gZWNob24gfCAke1NTSER9IC1vICJQcm90b2NvbD0ke3ZlcnNpb259IiAtaSAtZiAke09CSn0vc3NoZF9wcm94eWAKKwljYXNlICR7YmFubmVyfSBpbgorCVNTSC0xLjk5LSopCisJCXByb3RvPTE5OQorCQk7OworCVNTSC0yLjAtKikKKwkJcHJvdG89MjAKKwkJOzsKKwlTU0gtMS41LSopCisJCXByb3RvPTE1CisJCTs7CisJKikKKwkJcHJvdG89MAorCQk7OworCWVzYWMKKwlpZiBbICR7ZXhwZWN0fSAtbmUgJHtwcm90b30gXTsgdGhlbgorCQlmYWlsICJ3cm9uZyBwcm90b2NvbCB2ZXJzaW9uICR7YmFubmVyfSBmb3IgJHt2ZXJzaW9ufSIKKwlmaQorfQorCitjaGVja192ZXJzaW9uCTIsMQkxOTkKK2NoZWNrX3ZlcnNpb24JMSwyCTE5OQorY2hlY2tfdmVyc2lvbgkyCTIwCitjaGVja192ZXJzaW9uCTEJMTUKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy9wcm94eS1jb25uZWN0LnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3Byb3h5LWNvbm5lY3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEzNmIyNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9wcm94eS1jb25uZWN0LnNoCkBAIC0wLDAgKzEsMTggQEAKKyMJJE9wZW5CU0Q6IHByb3h5LWNvbm5lY3Quc2gsdiAxLjUgMjAwMi8xMi8wOSAxNToyODo0NiBtYXJrdXMgRXhwICQKKyMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgorCit0aWQ9InByb3h5IGNvbm5lY3QiCisKK2ZvciBwIGluIDEgMjsgZG8KKwkke1NTSH0gLSRwIC1GICRPQkovc3NoX3Byb3h5IDk5OS45OTkuOTk5Ljk5OSB0cnVlCisJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJCWZhaWwgInNzaCBwcm94eWNvbm5lY3QgcHJvdG9jb2wgJHAgZmFpbGVkIgorCWZpCisJU1NIX0NPTk5FQ1RJT049YCR7U1NIfSAtJHAgLUYgJE9CSi9zc2hfcHJveHkgOTk5Ljk5OS45OTkuOTk5ICdlY2hvICRTU0hfQ09OTkVDVElPTidgCisJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJCWZhaWwgInNzaCBwcm94eWNvbm5lY3QgcHJvdG9jb2wgJHAgZmFpbGVkIgorCWZpCisJaWYgWyAiJFNTSF9DT05ORUNUSU9OIiAhPSAiVU5LTk9XTiA2NTUzNSBVTktOT1dOIDY1NTM1IiBdOyB0aGVuCisJCWZhaWwgImJhZCBTU0hfQ09OTkVDVElPTiIKKwlmaQorZG9uZQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3B1dHR5LWNpcGhlcnMuc2ggYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvcHV0dHktY2lwaGVycy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjhlYTYwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3B1dHR5LWNpcGhlcnMuc2gKQEAgLTAsMCArMSwyOSBAQAorIwkkT3BlbkJTRDogcHV0dHktY2lwaGVycy5zaCx2IDEuMyAyMDA4LzExLzEwIDAyOjA2OjM1IGRqbSBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKK3RpZD0icHV0dHkgY2lwaGVycyIKKworREFUQT0vYmluL2xzCitDT1BZPSR7T0JKfS9jb3B5CisKK2lmIHRlc3QgIngkUkVHUkVTU19JTlRFUk9QX1BVVFRZIiAhPSAieHllcyIgOyB0aGVuCisJZWNobyAicHV0dHkgaW50ZXJvcCB0ZXN0cyBub3QgZW5hYmxlZCIKKwlleGl0IDAKK2ZpCisKK2ZvciBjIGluIGFlcyBibG93ZmlzaCAzZGVzIGFyY2ZvdXIgYWVzMTI4LWN0ciBhZXMxOTItY3RyIGFlczI1Ni1jdHIgOyBkbworCXZlcmJvc2UgIiR0aWQ6IGNpcGhlciAkYyIKKwljcCAke09CSn0vLnB1dHR5L3Nlc3Npb25zL2xvY2FsaG9zdF9wcm94eSBcCisJICAgICR7T0JKfS8ucHV0dHkvc2Vzc2lvbnMvY2lwaGVyXyRjCisJZWNobyAiQ2lwaGVyPSRjIiA+PiAke09CSn0vLnB1dHR5L3Nlc3Npb25zL2NpcGhlcl8kYworCisJcm0gLWYgJHtDT1BZfQorCWVudiBIT01FPSRQV0QgJHtQTElOS30gLWxvYWQgY2lwaGVyXyRjIC1iYXRjaCAtaSBwdXR0eS5yc2EyIFwKKwkgICAgMTI3LjAuMC4xIGNhdCAke0RBVEF9ID4gJHtDT1BZfQorCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCQlmYWlsICJzc2ggY2F0ICREQVRBIGZhaWxlZCIKKwlmaQorCWNtcCAke0RBVEF9ICR7Q09QWX0JCXx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IgorZG9uZQorcm0gLWYgJHtDT1BZfQorCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvcHV0dHkta2V4LnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3B1dHR5LWtleC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTM4ODVhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3B1dHR5LWtleC5zaApAQCAtMCwwICsxLDI2IEBACisjCSRPcGVuQlNEOiBwdXR0eS1rZXguc2gsdiAxLjIgMjAwOC8wNi8zMCAxMDozMToxMSBkam0gRXhwICQKKyMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgorCit0aWQ9InB1dHR5IEtFWCIKKworREFUQT0vYmluL2xzCitDT1BZPSR7T0JKfS9jb3B5CisKK2lmIHRlc3QgIngkUkVHUkVTU19JTlRFUk9QX1BVVFRZIiAhPSAieHllcyIgOyB0aGVuCisJZWNobyAicHV0dHkgaW50ZXJvcCB0ZXN0cyBub3QgZW5hYmxlZCIKKwlleGl0IDAKK2ZpCisKK2ZvciBrIGluIGRoLWdleC1zaGExIGRoLWdyb3VwMS1zaGExIGRoLWdyb3VwMTQtc2hhMSA7IGRvCisJdmVyYm9zZSAiJHRpZDoga2V4ICRrIgorCWNwICR7T0JKfS8ucHV0dHkvc2Vzc2lvbnMvbG9jYWxob3N0X3Byb3h5IFwKKwkgICAgJHtPQkp9Ly5wdXR0eS9zZXNzaW9ucy9rZXhfJGsKKwllY2hvICJLRVg9JGsiID4+ICR7T0JKfS8ucHV0dHkvc2Vzc2lvbnMva2V4XyRrCisKKwllbnYgSE9NRT0kUFdEICR7UExJTkt9IC1sb2FkIGtleF8kayAtYmF0Y2ggLWkgcHV0dHkucnNhMiBcCisJICAgIDEyNy4wLjAuMSB0cnVlCisJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJCWZhaWwgIktFWCAkayBmYWlsZWQiCisJZmkKK2RvbmUKKwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3B1dHR5LXRyYW5zZmVyLnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3B1dHR5LXRyYW5zZmVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMWUxNTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvcHV0dHktdHJhbnNmZXIuc2gKQEAgLTAsMCArMSw0NCBAQAorIwkkT3BlbkJTRDogcHV0dHktdHJhbnNmZXIuc2gsdiAxLjIgMjAwOC8wNi8zMCAxMDozMToxMSBkam0gRXhwICQKKyMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgorCit0aWQ9InB1dHR5IHRyYW5zZmVyIGRhdGEiCisKK0RBVEE9L2Jpbi9scworQ09QWT0ke09CSn0vY29weQorCitpZiB0ZXN0ICJ4JFJFR1JFU1NfSU5URVJPUF9QVVRUWSIgIT0gInh5ZXMiIDsgdGhlbgorCWVjaG8gInB1dHR5IGludGVyb3AgdGVzdHMgbm90IGVuYWJsZWQiCisJZXhpdCAwCitmaQorCisjIFhYWCBzdXBwb3J0IHByb3RvY29sIDEgdG9vCitmb3IgcCBpbiAyOyBkbworCWZvciBjIGluIDAgMSA7IGRvIAorCXZlcmJvc2UgIiR0aWQ6IHByb3RvICRwIGNvbXByZXNzaW9uICRjIgorCQlybSAtZiAke0NPUFl9CisJCWNwICR7T0JKfS8ucHV0dHkvc2Vzc2lvbnMvbG9jYWxob3N0X3Byb3h5IFwKKwkJICAgICR7T0JKfS8ucHV0dHkvc2Vzc2lvbnMvY29tcHJlc3Npb25fJGMKKwkJZWNobyAiQ29tcHJlc3Npb249JGMiID4+ICR7T0JKfS8ucHV0dHkvc2Vzc2lvbnMva2V4XyRrCisJCWVudiBIT01FPSRQV0QgJHtQTElOS30gLWxvYWQgY29tcHJlc3Npb25fJGMgLWJhdGNoIFwKKwkJICAgIC1pIHB1dHR5LnJzYSRwIDEyNy4wLjAuMSBjYXQgJHtEQVRBfSA+ICR7Q09QWX0KKwkJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJCQlmYWlsICJzc2ggY2F0ICREQVRBIGZhaWxlZCIKKwkJZmkKKwkJY21wICR7REFUQX0gJHtDT1BZfQkJfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkiCisJCisJCWZvciBzIGluIDEwIDEwMCAxayAzMmsgNjRrIDEyOGsgMjU2azsgZG8KKwkJCXRyYWNlICJwcm90byAkcCBjb21wcmVzc2lvbiAkYyBkZC1zaXplICR7c30iCisJCQlybSAtZiAke0NPUFl9CisJCQlkZCBpZj0kREFUQSBvYnM9JHtzfSAyPiAvZGV2L251bGwgfCBcCisJCQkJZW52IEhPTUU9JFBXRCAke1BMSU5LfSAtbG9hZCBjb21wcmVzc2lvbl8kYyBcCisJCQkJICAgIC1iYXRjaCAtaSBwdXR0eS5yc2EkcCAxMjcuMC4wLjEgXAorCQkJCSAgICAiY2F0ID4gJHtDT1BZfSIKKwkJCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCQkJCWZhaWwgInNzaCBjYXQgJERBVEEgZmFpbGVkIgorCQkJZmkKKwkJCWNtcCAkREFUQSAke0NPUFl9CXx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IgorCQlkb25lCisJZG9uZQorZG9uZQorcm0gLWYgJHtDT1BZfQorCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvcmVjb25maWd1cmUuc2ggYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvcmVjb25maWd1cmUuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZkMjg5NQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9yZWNvbmZpZ3VyZS5zaApAQCAtMCwwICsxLDM2IEBACisjCSRPcGVuQlNEOiByZWNvbmZpZ3VyZS5zaCx2IDEuMiAyMDAzLzA2LzIxIDA5OjE0OjA1IG1hcmt1cyBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKK3RpZD0ic2ltcGxlIGNvbm5lY3QgYWZ0ZXIgcmVjb25maWd1cmUiCisKKyMgd2UgbmVlZCB0aGUgZnVsbCBwYXRoIHRvIHNzaGQgZm9yIC1IVVAKK2Nhc2UgJFNTSEQgaW4KKy8qKQorCSMgZnVsbCBwYXRoIGlzIE9LIAorCTs7CisqKQorCSMgb3RoZXJ3aXNlIG1ha2UgZnVsbHkgcXVhbGlmaWVkCisJU1NIRD0kT0JKLyRTU0hECitlc2FjCisKK3N0YXJ0X3NzaGQKKworUElEPWAkU1VETyBjYXQgJFBJREZJTEVgCitybSAtZiAkUElERklMRQorJFNVRE8ga2lsbCAtSFVQICRQSUQKKwordHJhY2UgIndhaXQgZm9yIHNzaGQgdG8gcmVzdGFydCIKK2k9MDsKK3doaWxlIFsgISAtZiAkUElERklMRSAtYSAkaSAtbHQgMTAgXTsgZG8KKwlpPWBleHByICRpICsgMWAKKwlzbGVlcCAkaQorZG9uZQorCit0ZXN0IC1mICRQSURGSUxFIHx8IGZhdGFsICJzc2hkIGRpZCBub3QgcmVzdGFydCIKKworZm9yIHAgaW4gMSAyOyBkbworCSR7U1NIfSAtbyAiUHJvdG9jb2w9JHAiIC1GICRPQkovc3NoX2NvbmZpZyBzb21laG9zdCB0cnVlCisJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJCWZhaWwgInNzaCBjb25uZWN0IHdpdGggcHJvdG9jb2wgJHAgZmFpbGVkIGFmdGVyIHJlY29uZmlndXJlIgorCWZpCitkb25lCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvcmVleGVjLnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3JlZXhlYy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWRmYzMxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3JlZXhlYy5zaApAQCAtMCwwICsxLDcyIEBACisjCSRPcGVuQlNEOiByZWV4ZWMuc2gsdiAxLjUgMjAwNC8xMC8wOCAwMjowMTo1MCBkam0gRXhwICQKKyMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgorCit0aWQ9InJlZXhlYyB0ZXN0cyIKKworREFUQT0vYmluL2xzJHtFWEVFWFR9CitDT1BZPSR7T0JKfS9jb3B5CitTU0hEX09SSUc9JFNTSEQke0VYRUVYVH0KK1NTSERfQ09QWT0kT0JKL3NzaGQke0VYRUVYVH0KKworIyBTdGFydCBhIHNzaGQgYW5kIHRoZW4gZGVsZXRlIGl0CitzdGFydF9zc2hkX2NvcHkgKCkKK3sKKwljcCAkU1NIRF9PUklHICRTU0hEX0NPUFkKKwlTU0hEPSRTU0hEX0NPUFkKKwlzdGFydF9zc2hkCisJU1NIRD0kU1NIRF9PUklHCit9CisKKyMgRG8gYmFzaWMgY29weSB0ZXN0cworY29weV90ZXN0cyAoKQoreworCXJtIC1mICR7Q09QWX0KKwlmb3IgcCBpbiAxIDI7IGRvCisJCXZlcmJvc2UgIiR0aWQ6IHByb3RvICRwIgorCQkke1NTSH0gLW5xbyAiUHJvdG9jb2w9JHAiIC1GICRPQkovc3NoX2NvbmZpZyBzb21laG9zdCBcCisJCSAgICBjYXQgJHtEQVRBfSA+ICR7Q09QWX0KKwkJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJCQlmYWlsICJzc2ggY2F0ICREQVRBIGZhaWxlZCIKKwkJZmkKKwkJY21wICR7REFUQX0gJHtDT1BZfQkJfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkiCisJCXJtIC1mICR7Q09QWX0KKwlkb25lCit9CisKK3ZlcmJvc2UgInRlc3QgY29uZmlnIHBhc3NpbmciCisKK2NwICRPQkovc3NoZF9jb25maWcgJE9CSi9zc2hkX2NvbmZpZy5vcmlnCitzdGFydF9zc2hkCitlY2hvICJJbnZhbGlkWFhYPW5vIiA+PiAkT0JKL3NzaGRfY29uZmlnCisKK2NvcHlfdGVzdHMKKworJFNVRE8ga2lsbCBgJFNVRE8gY2F0ICRQSURGSUxFYAorcm0gLWYgJFBJREZJTEUKKworY3AgJE9CSi9zc2hkX2NvbmZpZy5vcmlnICRPQkovc3NoZF9jb25maWcKKwordmVyYm9zZSAidGVzdCByZWV4ZWMgZmFsbGJhY2siCisKK3N0YXJ0X3NzaGRfY29weQorcm0gLWYgJFNTSERfQ09QWQorCitjb3B5X3Rlc3RzCisKKyRTVURPIGtpbGwgYCRTVURPIGNhdCAkUElERklMRWAKK3JtIC1mICRQSURGSUxFCisKK3ZlcmJvc2UgInRlc3QgcmVleGVjIGZhbGxiYWNrIHdpdGhvdXQgcHJpdnNlcCIKKworY3AgJE9CSi9zc2hkX2NvbmZpZy5vcmlnICRPQkovc3NoZF9jb25maWcKK2VjaG8gIlVzZVByaXZpbGVnZVNlcGFyYXRpb249bm8iID4+ICRPQkovc3NoZF9jb25maWcKKworc3RhcnRfc3NoZF9jb3B5CitybSAtZiAkU1NIRF9DT1BZCisKK2NvcHlfdGVzdHMKKworJFNVRE8ga2lsbCBgJFNVRE8gY2F0ICRQSURGSUxFYAorcm0gLWYgJFBJREZJTEUKKworCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvcmVrZXkuc2ggYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvcmVrZXkuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M1ZjI2NgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9yZWtleS5zaApAQCAtMCwwICsxLDMyIEBACisjCSRPcGVuQlNEOiByZWtleS5zaCx2IDEuMSAyMDAzLzAzLzI4IDEzOjU4OjI4IG1hcmt1cyBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKK3RpZD0icmVrZXkgZHVyaW5nIHRyYW5zZmVyIGRhdGEiCisKK0RBVEE9JHtPQkp9L2RhdGEKK0NPUFk9JHtPQkp9L2NvcHkKK0xPRz0ke09CSn0vbG9nCisKK3JtIC1mICR7Q09QWX0gJHtMT0d9ICR7REFUQX0KK3RvdWNoICR7REFUQX0KK2RkIGlmPS9iaW4vbHMke0VYRUVYVH0gb2Y9JHtEQVRBfSBicz0xayBzZWVrPTUxMSBjb3VudD0xID4gL2Rldi9udWxsIDI+JjEKKworZm9yIHMgaW4gMTYgMWsgMTI4ayAyNTZrOyBkbworCXRyYWNlICJyZWtleWxpbWl0ICR7c30iCisJcm0gLWYgJHtDT1BZfQorCWNhdCAkREFUQSB8IFwKKwkJJHtTU0h9IC1vQ29tcHJlc3Npb249bm8gLW9SZWtleUxpbWl0PSRzIFwKKwkJCS12IC1GICRPQkovc3NoX3Byb3h5IHNvbWVob3N0ICJjYXQgPiAke0NPUFl9IiBcCisJCTI+ICR7TE9HfQorCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCQlmYWlsICJzc2ggZmFpbGVkIgorCWZpCisJY21wICREQVRBICR7Q09QWX0JCXx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IgorCW49YGdyZXAgJ05FV0tFWVMgc2VudCcgJHtMT0d9IHwgd2MgLWxgCisJbj1gZXhwciAkbiAtIDFgCisJdHJhY2UgIiRuIHJla2V5aW5nKHMpIgorCWlmIFsgJG4gLWx0IDEgXTsgdGhlbgorCQlmYWlsICJubyByZWtleWluZyBvY2N1cmVkIgorCWZpCitkb25lCitybSAtZiAke0NPUFl9ICR7TE9HfSAke0RBVEF9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvcnNhX29wZW5zc2gucHJ2IGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3JzYV9vcGVuc3NoLnBydgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjc1NTU1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3JzYV9vcGVuc3NoLnBydgpAQCAtMCwwICsxLDE1IEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlDV2dJQkFBS0JnUURzaWx3S2NhS042d1NNTmQxV2dROStIUnFRRWtEMGtDVFZ0dHJhekd1ME9oQlUzVWtvCisrZEZEMUlwMEN4ZFhtTjI1SlFXeE9ZRjdoL09jdThQM2p6djNSVFg4N3hLUjBZemxYVExYK1NMdEYveVNlYlMzCit4V1BybGZSVURoaDAzaFI1Vis4eHh2dnk5d2lkUFlLdy9vSXR3R1N1ZU9zRXExTFRjekNEdjJkQWpRSURBUUFCCitBbjhuSDVWenZIa01iU3FKNmVPWURzVndvbVJ2WWJINUlFYVlsMXg2VkFUSVROdkF1OWtVZFE0TnNTcHVNYys3CitKajlnS1p2bU8xeTJZQ0tjMFAvaU8raS9lVjBMK3lRaDFSdzE4alFabGwrMTJUK0xacktSYXYwM1lOdk14MGdOCit3cVdZNDhLdDZodjIvTi9lYlF6S1JlNzkrRDB0MmNUaDkyaFQ3eEVORkxJQkFrRUJHbm9HS0ZqQVVrSkN3TzFWCittenBVcU1IcFJaVk9ycVA5aFVtUGp6Tko1b0JQRkdlNCtoMWhvU1JGT0F6YU51WnQ4c3NicWFMQ2t6QjhiZnpqCitxaFpxQVFKQkFOWmVrdVVwcDhpQkxlTFNhZ3c1RmtjUHdQenE2emZFeGJodnNaWGI4Qm8vNFNmbE5zNEpIWHdJCis3U0Q5WjhhSkx2TTR1US81TTcwbGJsRE1RNDBpM28wQ1FRRElKdkJZQkZMNXRsT2dha3EvTzd5aSt3dDBMNUJaCis5SDc5dzVyQ1NBQTBJSFJvSy9xSTF1ckhpSEMzZjN2YmJMazVVU3RmcnFFYU5EL21tMHNoeU5JQkFrQkxzWWRDCisvY3R0NUJjMHdVR0s0Vmw1YkJtajlMdHJyTUo0RnBCcEx3ai82OUJ3Q3VLb0s5WEtaMGg3M3A2WEh2ZUNFR1JnCitQSWxGWDRNdGFvTHJ3Z1U5QWtCVjJrNGRnSXdzK1g4WVg2NUVzeXlGam5sRHFYNHgwblNPalFCMW1zSUtmSEJyCitkaDVYTERCVFRDeG5LaE1KMFl4L29wZ092ZjA5WEhCRndhUW50UjVpCistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3JzYV9vcGVuc3NoLnB1YiBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9yc2Ffb3BlbnNzaC5wdWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwNDczMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9yc2Ffb3BlbnNzaC5wdWIKQEAgLTAsMCArMSBAQAorc3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFBZ1FEc2lsd0tjYUtONndTTU5kMVdnUTkrSFJxUUVrRDBrQ1RWdHRyYXpHdTBPaEJVM1VrbytkRkQxSXAwQ3hkWG1OMjVKUVd4T1lGN2gvT2N1OFAzanp2M1JUWDg3eEtSMFl6bFhUTFgrU0x0Ri95U2ViUzN4V1BybGZSVURoaDAzaFI1Vis4eHh2dnk5d2lkUFlLdy9vSXR3R1N1ZU9zRXExTFRjekNEdjJkQWpRPT0KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy9yc2Ffc3NoMi5wcnYgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvcnNhX3NzaDIucHJ2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlY2UzZDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvcnNhX3NzaDIucHJ2CkBAIC0wLDAgKzEsMTYgQEAKKy0tLS0gQkVHSU4gU1NIMiBFTkNSWVBURUQgUFJJVkFURSBLRVkgLS0tLQorU3ViamVjdDogc3NoLWtleWdlbiB0ZXN0CitDb21tZW50OiAiMTAyNC1iaXQgcnNhLCBTYXQgSnVuIDIzIDIwMDEgMTI6MjE6MjYgLTA0MDAiCitQMi81NndBQUFpNEFBQUEzYVdZdGJXOWtibnR6YVdkdWUzSnpZUzF3YTJOek1TMXphR0V4ZlN4bGJtTnllWEIwZTNKellTCisxd2EyTnpNWFl5TFc5aFpYQjlmUUFBQUFSdWIyNWxBQUFCM3dBQUFkc0FBQUFSQVFBQkFBQUQ5aWNmbFhPOGVReHRLb25wCis0NWdPeFhDaVpHOWhzZmtnUnBpWFhIcFVCTWhNMjhDNzJSUjFEZzJ4S200eHo3c21QMkFwbStZN1hMWmdJcHpRLytJNzZMCis5NVhRdjdKQ0hWSERYeU5CbVdYN1haUDR0bXNwRnEvVGRnMjh6SFNBM0NwWmpqd3EzcUcvYjgzOTV0RE1wRjd2MzRQUzNaCit4T0gzYUZQdkVRMFVzZ0VBQUFRQTdJcGNDbkdpamVzRWpEWGRWb0VQZmgwYWtCSkE5SkFrMWJiYTJzeHJ0RG9RVk4xSktQCituUlE5U0tkQXNYVjVqZHVTVUZzVG1CZTRmem5MdkQ5NDg3OTBVMS9POFNrZEdNNVYweTEva2k3UmY4a25tMHQ4Vmo2NVgwCitWQTRZZE40VWVWZnZNY2I3OHZjSW5UMkNzUDZDTGNCa3JuanJCS3RTMDNNd2c3OW5RSTBBQUFIL1ZkcE9IWUNNTFBsL0dGCisrdVJMTXNoWTU1UTZsK01kSjBqbzBBZFpyQ0NueHdhM1llVnl3d1Uwd3NaeW9UQ2RHTWY2S1lEcjM5UFZ4d1JjR2tKN1VlCitZZ0FBQWdEV1hwTGxLYWZJZ1MzaTBtb01PUlpIRDhEODZ1czN4TVc0YjdHVjIvQWFQK0VuNVRiT0NSMThDTzBnL1dmR2lTCis3ek9Ma1ArVE85Slc1UXpFT05JdDZOQUFBQ0FRRWFlZ1lvV01CU1FrTEE3VldiT2xTb3dlbEZsVTZ1by8yRlNZK1BNMG5tCitnRThVWjdqNkhXR2hKRVU0RE5vMjVtM3l5eHVwb3NLVE1IeHQvT09xRm1vQgorLS0tLSBFTkQgU1NIMiBFTkNSWVBURUQgUFJJVkFURSBLRVkgLS0tLQorLS0tCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvcnVudGVzdHMuc2ggYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvcnVudGVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTgwOGViOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9ydW50ZXN0cy5zaApAQCAtMCwwICsxLDEzIEBACisjIS9iaW4vc2gKKworVEVTVF9TU0hfU1NIPS4uL3NzaAorVEVTVF9TU0hfU1NIRD0uLi9zc2hkCitURVNUX1NTSF9TU0hBR0VOVD0uLi9zc2gtYWdlbnQKK1RFU1RfU1NIX1NTSEFERD0uLi9zc2gtYWRkCitURVNUX1NTSF9TU0hLRVlHRU49Li4vc3NoLWtleWdlbgorVEVTVF9TU0hfU1NIS0VZU0NBTj0uLi9zc2gta2V5c2NhbgorVEVTVF9TU0hfU0ZUUD0uLi9zZnRwCitURVNUX1NTSF9TRlRQU0VSVkVSPS4uL3NmdHAtc2VydmVyCisKK3BtYWtlCisKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy9zY3Atc3NoLXdyYXBwZXIuc2ggYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mvc2NwLXNzaC13cmFwcGVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMDA1YTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mvc2NwLXNzaC13cmFwcGVyLnNoCkBAIC0wLDAgKzEsNTcgQEAKKyMhL2Jpbi9zaAorIyAgICAgICAkT3BlbkJTRDogc2NwLXNzaC13cmFwcGVyLnNoLHYgMS4yIDIwMDUvMTIvMTQgMDQ6MzY6MzkgZHR1Y2tlciBFeHAgJAorIyAgICAgICBQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKK3ByaW50bmFtZSAoKSB7CisJTkFNRT0kMQorCXNhdmVfSUZTPSRJRlMKKwlJRlM9LworCXNldCAtLSBgZWNobyAiJE5BTUUiYAorCUlGUz0iJHNhdmVfSUZTIgorCXdoaWxlIFsgJCMgLWdlIDEgXSA7IGRvCisJCWlmIFsgIngkMSIgIT0gIngiIF07IHRoZW4KKwkJCWVjaG8gIkQwNzU1IDAgJDEiCisJCWZpCisJCXNoaWZ0OworCWRvbmUKK30KKworIyBEaXNjYXJkIGFsbCBidXQgbGFzdCBhcmd1bWVudC4gIFdlIHVzZSBhcmcgbGF0ZXIuCit3aGlsZSB0ZXN0ICIkMSIgIT0gIiI7IGRvCisJYXJnPSIkMSIKKwlzaGlmdAorZG9uZQorCitCQUQ9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLyR7RElSfS9kb3RwYXRoZGlyIgorCitjYXNlICIkU0NQVEVTVE1PREUiIGluCitiYWRzZXJ2ZXJfMCkKKwllY2hvICJEMDc1NSAwIC8ke0RJUn0vcm9vdHBhdGhkaXIiCisJZWNobyAiQzc1NSAyIHJvb3RwYXRoZmlsZSIKKwllY2hvICJYIgorCTs7CitiYWRzZXJ2ZXJfMSkKKwllY2hvICJEMDc1NSAwICRCQUQiCisJZWNobyAiQzc1NSAyIGZpbGUiCisJZWNobyAiWCIKKwk7OworYmFkc2VydmVyXzIpCisJZWNobyAiRDA3NTUgMCAkQkFEIgorCWVjaG8gIkM3NTUgMiBmaWxlIgorCWVjaG8gIlgiCisJOzsKK2JhZHNlcnZlcl8zKQorCXByaW50bmFtZSAkQkFECisJZWNobyAiQzc1NSAyIGZpbGUiCisJZWNobyAiWCIKKwk7OworYmFkc2VydmVyXzQpCisJcHJpbnRuYW1lICRCQUQKKwllY2hvICJEMDc1NSAwIC4uIgorCWVjaG8gIkM3NTUgMiBmaWxlIgorCWVjaG8gIlgiCisJOzsKKyopCisJZXhlYyAkYXJnCisJOzsKK2VzYWMKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy9zY3Auc2ggYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mvc2NwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZDQxMmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mvc2NwLnNoCkBAIC0wLDAgKzEsMTI3IEBACisjCSRPcGVuQlNEOiBzY3Auc2gsdiAxLjcgMjAwNi8wMS8zMSAxMDozNjozMyBkam0gRXhwICQKKyMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgorCit0aWQ9InNjcCIKKworI3NldCAteAorCisjIEZpZ3VyZSBvdXQgaWYgZGlmZiB1bmRlcnN0YW5kcyAiLU4iCitpZiBkaWZmIC1OICR7U1JDfS9zY3Auc2ggJHtTUkN9L3NjcC5zaCAyPi9kZXYvbnVsbDsgdGhlbgorCURJRkZPUFQ9Ii1yTiIKK2Vsc2UKKwlESUZGT1BUPSItciIKK2ZpCisKK0RBVEE9L2Jpbi9scyR7RVhFRVhUfQorQ09QWT0ke09CSn0vY29weQorQ09QWTI9JHtPQkp9L2NvcHkyCitESVI9JHtDT1BZfS5kZAorRElSMj0ke0NPUFl9LmRkMgorCitTUkM9YGRpcm5hbWUgJHtTQ1JJUFR9YAorY3AgJHtTUkN9L3NjcC1zc2gtd3JhcHBlci5zaCAke09CSn0vc2NwLXNzaC13cmFwcGVyLnNjcAorY2htb2QgNzU1ICR7T0JKfS9zY3Atc3NoLXdyYXBwZXIuc2NwCitzY3BvcHRzPSItcSAtUyAke09CSn0vc2NwLXNzaC13cmFwcGVyLnNjcCIKKworc2NwY2xlYW4oKSB7CisJcm0gLXJmICR7Q09QWX0gJHtDT1BZMn0gJHtESVJ9ICR7RElSMn0KKwlta2RpciAke0RJUn0gJHtESVIyfQorfQorCit2ZXJib3NlICIkdGlkOiBzaW1wbGUgY29weSBsb2NhbCBmaWxlIHRvIGxvY2FsIGZpbGUiCitzY3BjbGVhbgorJFNDUCAkc2Nwb3B0cyAke0RBVEF9ICR7Q09QWX0gfHwgZmFpbCAiY29weSBmYWlsZWQiCitjbXAgJHtEQVRBfSAke0NPUFl9IHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IgorCit2ZXJib3NlICIkdGlkOiBzaW1wbGUgY29weSBsb2NhbCBmaWxlIHRvIHJlbW90ZSBmaWxlIgorc2NwY2xlYW4KKyRTQ1AgJHNjcG9wdHMgJHtEQVRBfSBzb21laG9zdDoke0NPUFl9IHx8IGZhaWwgImNvcHkgZmFpbGVkIgorY21wICR7REFUQX0gJHtDT1BZfSB8fCBmYWlsICJjb3JydXB0ZWQgY29weSIKKwordmVyYm9zZSAiJHRpZDogc2ltcGxlIGNvcHkgcmVtb3RlIGZpbGUgdG8gbG9jYWwgZmlsZSIKK3NjcGNsZWFuCiskU0NQICRzY3BvcHRzIHNvbWVob3N0OiR7REFUQX0gJHtDT1BZfSB8fCBmYWlsICJjb3B5IGZhaWxlZCIKK2NtcCAke0RBVEF9ICR7Q09QWX0gfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkiCisKK3ZlcmJvc2UgIiR0aWQ6IHNpbXBsZSBjb3B5IGxvY2FsIGZpbGUgdG8gcmVtb3RlIGRpciIKK3NjcGNsZWFuCitjcCAke0RBVEF9ICR7Q09QWX0KKyRTQ1AgJHNjcG9wdHMgJHtDT1BZfSBzb21laG9zdDoke0RJUn0gfHwgZmFpbCAiY29weSBmYWlsZWQiCitjbXAgJHtDT1BZfSAke0RJUn0vY29weSB8fCBmYWlsICJjb3JydXB0ZWQgY29weSIKKwordmVyYm9zZSAiJHRpZDogc2ltcGxlIGNvcHkgbG9jYWwgZmlsZSB0byBsb2NhbCBkaXIiCitzY3BjbGVhbgorY3AgJHtEQVRBfSAke0NPUFl9CiskU0NQICRzY3BvcHRzICR7Q09QWX0gJHtESVJ9IHx8IGZhaWwgImNvcHkgZmFpbGVkIgorY21wICR7Q09QWX0gJHtESVJ9L2NvcHkgfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkiCisKK3ZlcmJvc2UgIiR0aWQ6IHNpbXBsZSBjb3B5IHJlbW90ZSBmaWxlIHRvIGxvY2FsIGRpciIKK3NjcGNsZWFuCitjcCAke0RBVEF9ICR7Q09QWX0KKyRTQ1AgJHNjcG9wdHMgc29tZWhvc3Q6JHtDT1BZfSAke0RJUn0gfHwgZmFpbCAiY29weSBmYWlsZWQiCitjbXAgJHtDT1BZfSAke0RJUn0vY29weSB8fCBmYWlsICJjb3JydXB0ZWQgY29weSIKKwordmVyYm9zZSAiJHRpZDogcmVjdXJzaXZlIGxvY2FsIGRpciB0byByZW1vdGUgZGlyIgorc2NwY2xlYW4KK3JtIC1yZiAke0RJUjJ9CitjcCAke0RBVEF9ICR7RElSfS9jb3B5CiskU0NQICRzY3BvcHRzIC1yICR7RElSfSBzb21laG9zdDoke0RJUjJ9IHx8IGZhaWwgImNvcHkgZmFpbGVkIgorZGlmZiAke0RJRkZPUFR9ICR7RElSfSAke0RJUjJ9IHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IgorCit2ZXJib3NlICIkdGlkOiByZWN1cnNpdmUgbG9jYWwgZGlyIHRvIGxvY2FsIGRpciIKK3NjcGNsZWFuCitybSAtcmYgJHtESVIyfQorY3AgJHtEQVRBfSAke0RJUn0vY29weQorJFNDUCAkc2Nwb3B0cyAtciAke0RJUn0gJHtESVIyfSB8fCBmYWlsICJjb3B5IGZhaWxlZCIKK2RpZmYgJHtESUZGT1BUfSAke0RJUn0gJHtESVIyfSB8fCBmYWlsICJjb3JydXB0ZWQgY29weSIKKwordmVyYm9zZSAiJHRpZDogcmVjdXJzaXZlIHJlbW90ZSBkaXIgdG8gbG9jYWwgZGlyIgorc2NwY2xlYW4KK3JtIC1yZiAke0RJUjJ9CitjcCAke0RBVEF9ICR7RElSfS9jb3B5CiskU0NQICRzY3BvcHRzIC1yIHNvbWVob3N0OiR7RElSfSAke0RJUjJ9IHx8IGZhaWwgImNvcHkgZmFpbGVkIgorZGlmZiAke0RJRkZPUFR9ICR7RElSfSAke0RJUjJ9IHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IgorCit2ZXJib3NlICIkdGlkOiBzaGVsbCBtZXRhY2hhcmFjdGVycyIKK3NjcGNsZWFuCisoY2QgJHtESVJ9ICYmIFwKK3RvdWNoICdgdG91Y2ggbWV0YWNoYXJ0ZXN0YCcgJiYgXAorJFNDUCAkc2Nwb3B0cyAqbWV0YWNoYXIqICR7RElSMn0gMj4vZGV2L251bGw7IFwKK1sgISAtZiBtZXRhY2hhcnRlc3QgXSApIHx8IGZhaWwgInNoZWxsIG1ldGFjaGFyYWN0ZXJzIgorCitpZiBbICEgLXogIiRTVURPIiBdOyB0aGVuCisJdmVyYm9zZSAiJHRpZDogc2tpcHBlZCBmaWxlIGFmdGVyIHNjcCAtcCB3aXRoIGZhaWxlZCBjaG93bit1dGltZXMiCisJc2NwY2xlYW4KKwljcCAtcCAke0RBVEF9ICR7RElSfS9jb3B5CisJY3AgLXAgJHtEQVRBfSAke0RJUn0vY29weTIKKwljcCAke0RBVEF9ICR7RElSMn0vY29weQorCWNobW9kIDY2MCAke0RJUjJ9L2NvcHkKKwkkU1VETyBjaG93biByb290ICR7RElSMn0vY29weQorCSRTQ1AgLXAgJHNjcG9wdHMgc29tZWhvc3Q6JHtESVJ9L1wqICR7RElSMn0gPi9kZXYvbnVsbCAyPiYxCisJJFNVRE8gZGlmZiAke0RJRkZPUFR9ICR7RElSfSAke0RJUjJ9IHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IgorCSRTVURPIHJtICR7RElSMn0vY29weQorZmkKKworZm9yIGkgaW4gMCAxIDIgMyA0OyBkbworCXZlcmJvc2UgIiR0aWQ6IGRpc2FsbG93IGJhZCBzZXJ2ZXIgIyRpIgorCVNDUFRFU1RNT0RFPWJhZHNlcnZlcl8kaQorCWV4cG9ydCBESVIgU0NQVEVTVE1PREUKKwlzY3BjbGVhbgorCSRTQ1AgJHNjcG9wdHMgc29tZWhvc3Q6JHtEQVRBfSAke0RJUn0gPi9kZXYvbnVsbCAyPi9kZXYvbnVsbAorCVsgLWQgeyRESVJ9L3Jvb3RwYXRoZGlyIF0gJiYgZmFpbCAiYWxsb3dzIGRpciByZWxhdGl2ZSB0byByb290IGRpciIKKwlbIC1kICR7RElSfS9kb3RwYXRoZGlyIF0gJiYgZmFpbCAiYWxsb3dzIGRpciBjcmVhdGlvbiBpbiBub24tcmVjdXJzaXZlIG1vZGUiCisKKwlzY3BjbGVhbgorCSRTQ1AgLXIgJHNjcG9wdHMgc29tZWhvc3Q6JHtEQVRBfSAke0RJUjJ9ID4vZGV2L251bGwgMj4vZGV2L251bGwKKwlbIC1kICR7RElSfS9kb3RwYXRoZGlyIF0gJiYgZmFpbCAiYWxsb3dzIGRpciBjcmVhdGlvbiBvdXRzaWRlIG9mIHN1YmRpciIKK2RvbmUKKwordmVyYm9zZSAiJHRpZDogZGV0ZWN0IG5vbi1kaXJlY3RvcnkgdGFyZ2V0Igorc2NwY2xlYW4KK2VjaG8gYSA+ICR7Q09QWX0KK2VjaG8gYiA+ICR7Q09QWTJ9CiskU0NQICRzY3BvcHRzICR7REFUQX0gJHtDT1BZfSAke0NPUFkyfQorY21wICR7Q09QWX0gJHtDT1BZMn0gPi9kZXYvbnVsbCAmJiBmYWlsICJjb3JydXB0IHRhcmdldCIKKworc2NwY2xlYW4KK3JtIC1mICR7T0JKfS9zY3Atc3NoLXdyYXBwZXIuc2NwCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mvc2Z0cC1iYWRjbWRzLnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3NmdHAtYmFkY21kcy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODAwOWYyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3NmdHAtYmFkY21kcy5zaApAQCAtMCwwICsxLDY3IEBACisjCSRPcGVuQlNEOiBzZnRwLWJhZGNtZHMuc2gsdiAxLjQgMjAwOS8wOC8xMyAwMToxMTo1NSBkam0gRXhwICQKKyMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgorCit0aWQ9InNmdHAgaW52YWxpZCBjb21tYW5kcyIKKworREFUQT0vYmluL2xzJHtFWEVFWFR9CitEQVRBMj0vYmluL3NoJHtFWEVFWFR9CitOT05FWElTVD0vTk9ORVhJU1QuJCQKK0NPUFk9JHtPQkp9L2NvcHkKK0dMT0JGSUxFUz1gKGNkIC9iaW47ZWNobyBsKilgCisKK3JtIC1yZiAke0NPUFl9ICR7Q09QWX0uMSAke0NPUFl9LjIgJHtDT1BZfS5kZAorCitybSAtZiAke0NPUFl9Cit2ZXJib3NlICIkdGlkOiBnZXQgbm9uZXhpc3RlbnQiCitlY2hvICJnZXQgJE5PTkVYSVNUICRDT1BZIiB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgXAorCXx8IGZhaWwgImdldCBub25leGlzdGVudCBmYWlsZWQiCit0ZXN0IC1mICR7Q09QWX0gJiYgZmFpbCAiZXhpc3RpbmcgY29weSBhZnRlciBnZXQgbm9uZXhpc3RlbnQiCisKK3JtIC1mICR7Q09QWX0uZGQvKgordmVyYm9zZSAiJHRpZDogZ2xvYiBnZXQgdG8gbm9uZXhpc3RlbnQgZGlyZWN0b3J5IgorZWNobyAiZ2V0IC9iaW4vbCogJE5PTkVYSVNUIiB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgXAorICAgICAgICB8fCBmYWlsICJnZXQgbm9uZXhpc3RlbnQgZmFpbGVkIgorZm9yIHggaW4gJEdMT0JGSUxFUzsgZG8KKyAgICAgICAgdGVzdCAtZiAke0NPUFl9LmRkLyR4ICYmIGZhaWwgImV4aXN0aW5nIGNvcHkgYWZ0ZXIgZ2V0IG5vbmV4aXN0ZW50IgorZG9uZQorCitybSAtZiAke0NPUFl9Cit2ZXJib3NlICIkdGlkOiBwdXQgbm9uZXhpc3RlbnQiCitlY2hvICJwdXQgJE5PTkVYSVNUICRDT1BZIiB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgXAorCXx8IGZhaWwgInB1dCBub25leGlzdGVudCBmYWlsZWQiCit0ZXN0IC1mICR7Q09QWX0gJiYgZmFpbCAiZXhpc3RpbmcgY29weSBhZnRlciBwdXQgbm9uZXhpc3RlbnQiCisKK3JtIC1mICR7Q09QWX0uZGQvKgordmVyYm9zZSAiJHRpZDogZ2xvYiBwdXQgdG8gbm9uZXhpc3RlbnQgZGlyZWN0b3J5IgorZWNobyAicHV0IC9iaW4vbCogJHtDT1BZfS5kZCIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKKyAgICAgICAgfHwgZmFpbCAicHV0IG5vbmV4aXN0ZW50IGZhaWxlZCIKK2ZvciB4IGluICRHTE9CRklMRVM7IGRvCisgICAgICAgIHRlc3QgLWYgJHtDT1BZfS5kZC8keCAmJiBmYWlsICJleGlzdGluZyBjb3B5IGFmdGVyIG5vbmV4aXN0ZW50IgorZG9uZQorCitybSAtZiAke0NPUFl9Cit2ZXJib3NlICIkdGlkOiByZW5hbWUgbm9uZXhpc3RlbnQiCitlY2hvICJyZW5hbWUgJE5PTkVYSVNUICR7Q09QWX0uMSIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKKwl8fCBmYWlsICJyZW5hbWUgbm9uZXhpc3QgZmFpbGVkIgordGVzdCAtZiAke0NPUFl9LjEgJiYgZmFpbCAiZmlsZSBleGlzdHMgYWZ0ZXIgcmVuYW1lIG5vbmV4aXN0ZW50IgorCitybSAtcmYgJHtDT1BZfSAke0NPUFl9LmRkCitjcCAkREFUQSAkQ09QWQorbWtkaXIgJHtDT1BZfS5kZAordmVyYm9zZSAiJHRpZDogcmVuYW1lIHRhcmdldCBleGlzdHMgKGRpcmVjdG9yeSkiCitlY2hvICJyZW5hbWUgJENPUFkgJHtDT1BZfS5kZCIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKKwl8fCBmYWlsICJyZW5hbWUgdGFyZ2V0IGV4aXN0cyAoZGlyZWN0b3J5KSBmYWlsZWQiCit0ZXN0IC1mICR7Q09QWX0gfHwgZmFpbCAib2xkbmFtZSBtaXNzaW5nIGFmdGVyIHJlbmFtZSB0YXJnZXQgZXhpc3RzIChkaXJlY3RvcnkpIgordGVzdCAtZCAke0NPUFl9LmRkIHx8IGZhaWwgIm5ld25hbWUgbWlzc2luZyBhZnRlciByZW5hbWUgdGFyZ2V0IGV4aXN0cyAoZGlyZWN0b3J5KSIKK2NtcCAkREFUQSAke0NPUFl9ID4vZGV2L251bGwgMj4mMSB8fCBmYWlsICJjb3JydXB0ZWQgb2xkbmFtZSBhZnRlciByZW5hbWUgdGFyZ2V0IGV4aXN0cyAoZGlyZWN0b3J5KSIKKworcm0gLWYgJHtDT1BZfS5kZC8qCitybSAtcmYgJHtDT1BZfQorY3AgJHtEQVRBMn0gJHtDT1BZfQordmVyYm9zZSAiJHRpZDogZ2xvYiBwdXQgZmlsZXMgdG8gbG9jYWwgZmlsZSIKK2VjaG8gInB1dCAvYmluL2wqICRDT1BZIiB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgCitjbXAgJHtEQVRBMn0gJHtDT1BZfSB8fCBmYWlsICJwdXQgc3VjY2Vzc2VkIHdoZW4gaXQgc2hvdWxkIGhhdmUgZmFpbGVkIgorCitybSAtcmYgJHtDT1BZfSAke0NPUFl9LjEgJHtDT1BZfS4yICR7Q09QWX0uZGQKKworCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mvc2Z0cC1iYXRjaC5zaCBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9zZnRwLWJhdGNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MWVmMDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mvc2Z0cC1iYXRjaC5zaApAQCAtMCwwICsxLDU3IEBACisjCSRPcGVuQlNEOiBzZnRwLWJhdGNoLnNoLHYgMS40IDIwMDkvMDgvMTMgMDE6MTE6NTUgZGptIEV4cCAkCisjCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KKwordGlkPSJzZnRwIGJhdGNoZmlsZSIKKworREFUQT0vYmluL2xzJHtFWEVFWFR9CitDT1BZPSR7T0JKfS9jb3B5CitCQVRDSD0ke09CSn0vc2Z0cC5iYgorCitybSAtcmYgJHtDT1BZfSAke0NPUFl9LjEgJHtDT1BZfS4yICR7Q09QWX0uZGQgJHtCQVRDSH0uKgorCitjYXQgPDwgRU9GID4gJHtCQVRDSH0ucGFzcy4xCisJZ2V0ICREQVRBICRDT1BZCisJcHV0ICR7Q09QWX0gJHtDT1BZfS4xCisJcm0gJHtDT1BZfQorCS1wdXQgJHtDT1BZfSAke0NPUFl9LjIKK0VPRgorCitjYXQgPDwgRU9GID4gJHtCQVRDSH0ucGFzcy4yCisJIyBUaGlzIGlzIGEgY29tbWVudAorCisJIyBUaGF0IHdhcyBhIGJsYW5rIGxpbmUKKwlscworRU9GCisKK2NhdCA8PCBFT0YgPiAke0JBVENIfS5mYWlsLjEKKwlnZXQgJERBVEEgJENPUFkKKwlwdXQgJHtDT1BZfSAke0NPUFl9LjMKKwlybSAke0NPUFl9LioKKwkjIFRoZSBuZXh0IGNvbW1hbmQgc2hvdWxkIGZhaWwKKwlwdXQgJHtDT1BZfS4zICR7Q09QWX0uNAorRU9GCisKK2NhdCA8PCBFT0YgPiAke0JBVENIfS5mYWlsLjIKKwkjIFRoZSBuZXh0IGNvbW1hbmQgc2hvdWxkIGZhaWwKKwlqYWphamFqYWphCitFT0YKKwordmVyYm9zZSAiJHRpZDogZ29vZCBjb21tYW5kcyIKKyR7U0ZUUH0gLWIgJHtCQVRDSH0ucGFzcy4xIC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKKwl8fCBmYWlsICJnb29kIGNvbW1hbmRzIGZhaWxlZCIKKwordmVyYm9zZSAiJHRpZDogYmFkIGNvbW1hbmRzIgorJHtTRlRQfSAtYiAke0JBVENIfS5mYWlsLjEgLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgXAorCSYmIGZhaWwgImJhZCBjb21tYW5kcyBzdWNjZWVkZWQiCisKK3ZlcmJvc2UgIiR0aWQ6IGNvbW1lbnRzIGFuZCBibGFua3MiCiske1NGVFB9IC1iICR7QkFUQ0h9LnBhc3MuMiAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSBcCisJfHwgZmFpbCAiY29tbWVudHMgJiBibGFua3MgZmFpbGVkIgorCit2ZXJib3NlICIkdGlkOiBqdW5rIGNvbW1hbmQiCiske1NGVFB9IC1iICR7QkFUQ0h9LmZhaWwuMiAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSBcCisJJiYgZmFpbCAianVuayBjb21tYW5kIHN1Y2NlZWRlZCIKKworcm0gLXJmICR7Q09QWX0gJHtDT1BZfS4xICR7Q09QWX0uMiAke0NPUFl9LmRkICR7QkFUQ0h9LioKKworCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mvc2Z0cC1jbWRzLnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3NmdHAtY21kcy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzY3YjY0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3NmdHAtY21kcy5zaApAQCAtMCwwICsxLDI0OCBAQAorIwkkT3BlbkJTRDogc2Z0cC1jbWRzLnNoLHYgMS4xMSAyMDEwLzEyLzA0IDAwOjIxOjE5IGRqbSBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKKyMgWFhYIC0gVE9ETzogCisjIC0gY2htb2QgLyBjaG93biAvIGNoZ3JwCisjIC0gLXAgZmxhZyBmb3IgZ2V0ICYgcHV0CisKK3RpZD0ic2Z0cCBjb21tYW5kcyIKKworREFUQT0vYmluL2xzJHtFWEVFWFR9CitDT1BZPSR7T0JKfS9jb3B5CisjIHRlc3QgdGhhdCB0aGVzZSBmaWxlcyBhcmUgcmVhZGFibGUhCitmb3IgaSBpbiBgKGNkIC9iaW47ZWNobyBsKilgCitkbworCWlmIFsgLXIgJGkgXTsgdGhlbgorCQlHTE9CRklMRVM9IiRHTE9CRklMRVMgJGkiCisJZmkKK2RvbmUKKworaWYgaGF2ZV9wcm9nIHVuYW1lCit0aGVuCisJY2FzZSBgdW5hbWVgIGluCisJQ1lHV0lOKikKKwkJb3M9Y3lnd2luCisJCTs7CisJKikKKwkJb3M9YHVuYW1lYAorCQk7OworCWVzYWMKK2Vsc2UKKwlvcz0idW5rbm93biIKK2ZpCisKKyMgUGF0aCB3aXRoIGVtYmVkZGVkIHF1b3RlCitRVU9URUNPUFk9JHtDT1BZfSIuXCJibGFoXCIiCitRVU9URUNPUFlfQVJHPSR7Q09QWX0nLlwiYmxhaFwiJworIyBGaWxlIHdpdGggc3BhY2VzCitTUEFDRUNPUFk9IiR7Q09QWX0gdGhpcyBoYXMgc3BhY2VzLnR4dCIKK1NQQUNFQ09QWV9BUkc9IiR7Q09QWX1cIHRoaXNcIGhhc1wgc3BhY2VzLnR4dCIKKyMgRmlsZSB3aXRoIGdsb2IgbWV0YWNoYXJhY3RlcnMKK0dMT0JNRVRBQ09QWT0iJHtDT1BZfSBbbWV0YWNoYXJdLnR4dCIKKworcm0gLXJmICR7Q09QWX0gJHtDT1BZfS4xICR7Q09QWX0uMiAke0NPUFl9LmRkICR7Q09QWX0uZGQyICR7QkFUQ0h9LioKK21rZGlyICR7Q09QWX0uZGQKKwordmVyYm9zZSAiJHRpZDogbGxzIgorKGVjaG8gImxjZCAke09CSn0iIDsgZWNobyAibGxzIikgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gMj4mMSB8IFwKKwlncmVwIGNvcHkuZGQgPi9kZXYvbnVsbCAyPiYxIHx8IGZhaWwgImxscyBmYWlsZWQiCisKK3ZlcmJvc2UgIiR0aWQ6IGxscyB3L3BhdGgiCitlY2hvICJsbHMgJHtPQkp9IiB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSAyPiYxIHwgXAorCWdyZXAgY29weS5kZCA+L2Rldi9udWxsIDI+JjEgfHwgZmFpbCAibGxzIHcvcGF0aCBmYWlsZWQiCisKK3ZlcmJvc2UgIiR0aWQ6IGxzIgorZWNobyAibHMgJHtPQkp9IiB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgXAorCXx8IGZhaWwgImxzIGZhaWxlZCIKKyMgWFhYIGFsd2F5cyBzdWNjZXNzZnVsCisKK3ZlcmJvc2UgIiR0aWQ6IHNoZWxsIgorZWNobyAiIWVjaG8gaGkgdGhlcmUiIHwgJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSBcCisJfHwgZmFpbCAic2hlbGwgZmFpbGVkIgorIyBYWFggYWx3YXlzIHN1Y2Nlc3NmdWwKKwordmVyYm9zZSAiJHRpZDogcHdkIgorZWNobyAicHdkIiB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgXAorCXx8IGZhaWwgInB3ZCBmYWlsZWQiCisjIFhYWCBhbHdheXMgc3VjY2Vzc2Z1bAorCit2ZXJib3NlICIkdGlkOiBscHdkIgorZWNobyAibHB3ZCIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKKwl8fCBmYWlsICJscHdkIGZhaWxlZCIKKyMgWFhYIGFsd2F5cyBzdWNjZXNzZnVsCisKK3ZlcmJvc2UgIiR0aWQ6IHF1aXQiCitlY2hvICJxdWl0IiB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgXAorCXx8IGZhaWwgInF1aXQgZmFpbGVkIgorIyBYWFggYWx3YXlzIHN1Y2Nlc3NmdWwKKwordmVyYm9zZSAiJHRpZDogaGVscCIKK2VjaG8gImhlbHAiIHwgJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSBcCisJfHwgZmFpbCAiaGVscCBmYWlsZWQiCisjIFhYWCBhbHdheXMgc3VjY2Vzc2Z1bAorCitybSAtZiAke0NPUFl9Cit2ZXJib3NlICIkdGlkOiBnZXQiCitlY2hvICJnZXQgJERBVEEgJENPUFkiIHwgJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSBcCisJfHwgZmFpbCAiZ2V0IGZhaWxlZCIKK2NtcCAkREFUQSAke0NPUFl9IHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IGFmdGVyIGdldCIKKworcm0gLWYgJHtDT1BZfQordmVyYm9zZSAiJHRpZDogZ2V0IHF1b3RlZCIKK2VjaG8gImdldCBcIiREQVRBXCIgJENPUFkiIHwgJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSBcCisJfHwgZmFpbCAiZ2V0IGZhaWxlZCIKK2NtcCAkREFUQSAke0NPUFl9IHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IGFmdGVyIGdldCIKKworaWYgWyAiJG9zIiAhPSAiY3lnd2luIiBdOyB0aGVuCitybSAtZiAke1FVT1RFQ09QWX0KK2NwICREQVRBICR7UVVPVEVDT1BZfQordmVyYm9zZSAiJHRpZDogZ2V0IGZpbGVuYW1lIHdpdGggcXVvdGVzIgorZWNobyAiZ2V0IFwiJFFVT1RFQ09QWV9BUkdcIiAke0NPUFl9IiB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgXAorCXx8IGZhaWwgImdldCBmYWlsZWQiCitjbXAgJHtDT1BZfSAke1FVT1RFQ09QWX0gfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkgYWZ0ZXIgZ2V0IHdpdGggcXVvdGVzIgorcm0gLWYgJHtRVU9URUNPUFl9ICR7Q09QWX0KK2ZpCisKK3JtIC1mICIkU1BBQ0VDT1BZIiAke0NPUFl9CitjcCAkREFUQSAiJFNQQUNFQ09QWSIKK3ZlcmJvc2UgIiR0aWQ6IGdldCBmaWxlbmFtZSB3aXRoIHNwYWNlcyIKK2VjaG8gImdldCAke1NQQUNFQ09QWV9BUkd9ICR7Q09QWX0iIHwgJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSBcCisgICAgICAgIHx8IGZhaWwgImdldCBmYWlsZWQiCitjbXAgJHtDT1BZfSAiJFNQQUNFQ09QWSIgfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkgYWZ0ZXIgZ2V0IHdpdGggc3BhY2VzIgorCitybSAtZiAiJEdMT0JNRVRBQ09QWSIgJHtDT1BZfQorY3AgJERBVEEgIiRHTE9CTUVUQUNPUFkiCit2ZXJib3NlICIkdGlkOiBnZXQgZmlsZW5hbWUgd2l0aCBnbG9iIG1ldGFjaGFyYWN0ZXJzIgorZWNobyAiZ2V0IFwiJHtHTE9CTUVUQUNPUFl9XCIgJHtDT1BZfSIgfCBcCisJJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSB8fCBmYWlsICJnZXQgZmFpbGVkIgorY21wICR7Q09QWX0gIiRHTE9CTUVUQUNPUFkiIHx8IFwKKwlmYWlsICJjb3JydXB0ZWQgY29weSBhZnRlciBnZXQgd2l0aCBnbG9iIG1ldGFjaGFyYWN0ZXJzIgorCitybSAtZiAke0NPUFl9LmRkLyoKK3ZlcmJvc2UgIiR0aWQ6IGdldCB0byBkaXJlY3RvcnkiCitlY2hvICJnZXQgJERBVEEgJHtDT1BZfS5kZCIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKKyAgICAgICAgfHwgZmFpbCAiZ2V0IGZhaWxlZCIKK2NtcCAkREFUQSAke0NPUFl9LmRkL2BiYXNlbmFtZSAkREFUQWAgfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkgYWZ0ZXIgZ2V0IgorCitybSAtZiAke0NPUFl9LmRkLyoKK3ZlcmJvc2UgIiR0aWQ6IGdsb2IgZ2V0IHRvIGRpcmVjdG9yeSIKK2VjaG8gImdldCAvYmluL2wqICR7Q09QWX0uZGQiIHwgJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSBcCisgICAgICAgIHx8IGZhaWwgImdldCBmYWlsZWQiCitmb3IgeCBpbiAkR0xPQkZJTEVTOyBkbworICAgICAgICBjbXAgL2Jpbi8keCAke0NPUFl9LmRkLyR4IHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IGFmdGVyIGdldCIKK2RvbmUKKworcm0gLWYgJHtDT1BZfS5kZC8qCit2ZXJib3NlICIkdGlkOiBnZXQgdG8gbG9jYWwgZGlyIgorKGVjaG8gImxjZCAke0NPUFl9LmRkIjsgZWNobyAiZ2V0ICREQVRBIiApIHwgJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSBcCisgICAgICAgIHx8IGZhaWwgImdldCBmYWlsZWQiCitjbXAgJERBVEEgJHtDT1BZfS5kZC9gYmFzZW5hbWUgJERBVEFgIHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IGFmdGVyIGdldCIKKworcm0gLWYgJHtDT1BZfS5kZC8qCit2ZXJib3NlICIkdGlkOiBnbG9iIGdldCB0byBsb2NhbCBkaXIiCisoZWNobyAibGNkICR7Q09QWX0uZGQiOyBlY2hvICJnZXQgL2Jpbi9sKiIpIHwgJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSBcCisgICAgICAgIHx8IGZhaWwgImdldCBmYWlsZWQiCitmb3IgeCBpbiAkR0xPQkZJTEVTOyBkbworICAgICAgICBjbXAgL2Jpbi8keCAke0NPUFl9LmRkLyR4IHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IGFmdGVyIGdldCIKK2RvbmUKKworcm0gLWYgJHtDT1BZfQordmVyYm9zZSAiJHRpZDogcHV0IgorZWNobyAicHV0ICREQVRBICRDT1BZIiB8IFwKKwkke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIHx8IGZhaWwgInB1dCBmYWlsZWQiCitjbXAgJERBVEEgJHtDT1BZfSB8fCBmYWlsICJjb3JydXB0ZWQgY29weSBhZnRlciBwdXQiCisKK2lmIFsgIiRvcyIgIT0gImN5Z3dpbiIgXTsgdGhlbgorcm0gLWYgJHtRVU9URUNPUFl9Cit2ZXJib3NlICIkdGlkOiBwdXQgZmlsZW5hbWUgd2l0aCBxdW90ZXMiCitlY2hvICJwdXQgJERBVEEgXCIkUVVPVEVDT1BZX0FSR1wiIiB8IFwKKwkke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIHx8IGZhaWwgInB1dCBmYWlsZWQiCitjbXAgJERBVEEgJHtRVU9URUNPUFl9IHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IGFmdGVyIHB1dCB3aXRoIHF1b3RlcyIKK2ZpCisKK3JtIC1mICIkU1BBQ0VDT1BZIgordmVyYm9zZSAiJHRpZDogcHV0IGZpbGVuYW1lIHdpdGggc3BhY2VzIgorZWNobyAicHV0ICREQVRBICR7U1BBQ0VDT1BZX0FSR30iIHwgXAorCSR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgfHwgZmFpbCAicHV0IGZhaWxlZCIKK2NtcCAkREFUQSAiJFNQQUNFQ09QWSIgfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkgYWZ0ZXIgcHV0IHdpdGggc3BhY2VzIgorCitybSAtZiAke0NPUFl9LmRkLyoKK3ZlcmJvc2UgIiR0aWQ6IHB1dCB0byBkaXJlY3RvcnkiCitlY2hvICJwdXQgJERBVEEgJHtDT1BZfS5kZCIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKKwl8fCBmYWlsICJwdXQgZmFpbGVkIgorY21wICREQVRBICR7Q09QWX0uZGQvYGJhc2VuYW1lICREQVRBYCB8fCBmYWlsICJjb3JydXB0ZWQgY29weSBhZnRlciBwdXQiCisKK3JtIC1mICR7Q09QWX0uZGQvKgordmVyYm9zZSAiJHRpZDogZ2xvYiBwdXQgdG8gZGlyZWN0b3J5IgorZWNobyAicHV0IC9iaW4vbD8gJHtDT1BZfS5kZCIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKKwl8fCBmYWlsICJwdXQgZmFpbGVkIgorZm9yIHggaW4gJEdMT0JGSUxFUzsgZG8KKwljbXAgL2Jpbi8keCAke0NPUFl9LmRkLyR4IHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IGFmdGVyIHB1dCIKK2RvbmUKKworcm0gLWYgJHtDT1BZfS5kZC8qCit2ZXJib3NlICIkdGlkOiBwdXQgdG8gbG9jYWwgZGlyIgorKGVjaG8gImNkICR7Q09QWX0uZGQiOyBlY2hvICJwdXQgJERBVEEiKSB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgXAorCXx8IGZhaWwgInB1dCBmYWlsZWQiCitjbXAgJERBVEEgJHtDT1BZfS5kZC9gYmFzZW5hbWUgJERBVEFgIHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IGFmdGVyIHB1dCIKKworcm0gLWYgJHtDT1BZfS5kZC8qCit2ZXJib3NlICIkdGlkOiBnbG9iIHB1dCB0byBsb2NhbCBkaXIiCisoZWNobyAiY2QgJHtDT1BZfS5kZCI7IGVjaG8gInB1dCAvYmluL2w/IikgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKKwl8fCBmYWlsICJwdXQgZmFpbGVkIgorZm9yIHggaW4gJEdMT0JGSUxFUzsgZG8KKyAgICAgICAgY21wIC9iaW4vJHggJHtDT1BZfS5kZC8keCB8fCBmYWlsICJjb3JydXB0ZWQgY29weSBhZnRlciBwdXQiCitkb25lCisKK3ZlcmJvc2UgIiR0aWQ6IHJlbmFtZSIKK2VjaG8gInJlbmFtZSAkQ09QWSAke0NPUFl9LjEiIHwgJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSBcCisJfHwgZmFpbCAicmVuYW1lIGZhaWxlZCIKK3Rlc3QgLWYgJHtDT1BZfS4xIHx8IGZhaWwgIm1pc3NpbmcgZmlsZSBhZnRlciByZW5hbWUiCitjbXAgJERBVEEgJHtDT1BZfS4xID4vZGV2L251bGwgMj4mMSB8fCBmYWlsICJjb3JydXB0ZWQgY29weSBhZnRlciByZW5hbWUiCisKK3ZlcmJvc2UgIiR0aWQ6IHJlbmFtZSBkaXJlY3RvcnkiCitlY2hvICJyZW5hbWUgJHtDT1BZfS5kZCAke0NPUFl9LmRkMiIgfCBcCisJJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSB8fCBcCisJZmFpbCAicmVuYW1lIGRpcmVjdG9yeSBmYWlsZWQiCit0ZXN0IC1kICR7Q09QWX0uZGQgJiYgZmFpbCAib2xkbmFtZSBleGlzdHMgYWZ0ZXIgcmVuYW1lIGRpcmVjdG9yeSIKK3Rlc3QgLWQgJHtDT1BZfS5kZDIgfHwgZmFpbCAibWlzc2luZyBuZXduYW1lIGFmdGVyIHJlbmFtZSBkaXJlY3RvcnkiCisKK3ZlcmJvc2UgIiR0aWQ6IGxuIgorZWNobyAibG4gJHtDT1BZfS4xICR7Q09QWX0uMiIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIHx8IGZhaWwgImxuIGZhaWxlZCIKK3Rlc3QgLWYgJHtDT1BZfS4yIHx8IGZhaWwgIm1pc3NpbmcgZmlsZSBhZnRlciBsbiIKK2NtcCAke0NPUFl9LjEgJHtDT1BZfS4yIHx8IGZhaWwgImNyZWF0ZWQgZmlsZSBpcyBub3QgZXF1YWwgYWZ0ZXIgbG4iCisKK3ZlcmJvc2UgIiR0aWQ6IGxuIC1zIgorcm0gLWYgJHtDT1BZfS4yCitlY2hvICJsbiAtcyAke0NPUFl9LjEgJHtDT1BZfS4yIiB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgfHwgZmFpbCAibG4gLXMgZmFpbGVkIgordGVzdCAtaCAke0NPUFl9LjIgfHwgZmFpbCAibWlzc2luZyBmaWxlIGFmdGVyIGxuIC1zIgorCit2ZXJib3NlICIkdGlkOiBta2RpciIKK2VjaG8gIm1rZGlyICR7Q09QWX0uZGQiIHwgJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSBcCisJfHwgZmFpbCAibWtkaXIgZmFpbGVkIgordGVzdCAtZCAke0NPUFl9LmRkIHx8IGZhaWwgIm1pc3NpbmcgZGlyZWN0b3J5IGFmdGVyIG1rZGlyIgorCisjIFhYWCBkbyBtb3JlIGhlcmUKK3ZlcmJvc2UgIiR0aWQ6IGNoZGlyIgorZWNobyAiY2hkaXIgJHtDT1BZfS5kZCIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKKwl8fCBmYWlsICJjaGRpciBmYWlsZWQiCisKK3ZlcmJvc2UgIiR0aWQ6IHJtZGlyIgorZWNobyAicm1kaXIgJHtDT1BZfS5kZCIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKKwl8fCBmYWlsICJybWRpciBmYWlsZWQiCit0ZXN0IC1kICR7Q09QWX0uMSAmJiBmYWlsICJwcmVzZW50IGRpcmVjdG9yeSBhZnRlciBybWRpciIKKwordmVyYm9zZSAiJHRpZDogbG1rZGlyIgorZWNobyAibG1rZGlyICR7Q09QWX0uZGQiIHwgJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSBcCisJfHwgZmFpbCAibG1rZGlyIGZhaWxlZCIKK3Rlc3QgLWQgJHtDT1BZfS5kZCB8fCBmYWlsICJtaXNzaW5nIGRpcmVjdG9yeSBhZnRlciBsbWtkaXIiCisKKyMgWFhYIGRvIG1vcmUgaGVyZQordmVyYm9zZSAiJHRpZDogbGNoZGlyIgorZWNobyAibGNoZGlyICR7Q09QWX0uZGQiIHwgJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSBcCisJfHwgZmFpbCAibGNoZGlyIGZhaWxlZCIKKworcm0gLXJmICR7Q09QWX0gJHtDT1BZfS4xICR7Q09QWX0uMiAke0NPUFl9LmRkICR7Q09QWX0uZGQyICR7QkFUQ0h9LioKK3JtIC1yZiAke1FVT1RFQ09QWX0gIiRTUEFDRUNPUFkiICIkR0xPQk1FVEFDT1BZIgorCisKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy9zZnRwLWdsb2Iuc2ggYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mvc2Z0cC1nbG9iLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNGRmMmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mvc2Z0cC1nbG9iLnNoCkBAIC0wLDAgKzEsNzUgQEAKKyMJJE9wZW5CU0Q6IHNmdHAtZ2xvYi5zaCx2IDEuNCAyMDA5LzA4LzEzIDAxOjExOjU1IGRqbSBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKK3RpZD0ic2Z0cCBnbG9iIgorCitjb25maWdfZGVmaW5lZCBGSUxFU1lTVEVNX05PX0JBQ0tTTEFTSCAmJiBub2JzPSJub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iCisKK3NmdHBfbHMoKSB7CisJdGFyZ2V0PSQxCisJZXJydGFnPSQyCisJZXhwZWN0ZWQ9JDMKKwl1bmV4cGVjdGVkPSQ0CisJc2tpcD0kNQorCWlmIHRlc3QgIngkc2tpcCIgIT0gIngiIDsgdGhlbgorCQl2ZXJib3NlICIkdGlkOiAkZXJydGFnIChza2lwcGVkOiAkc2tpcCkiCisJCXJldHVybgorCWZpCisJdmVyYm9zZSAiJHRpZDogJGVycnRhZyIKKwlwcmludGYgImxzIC1sICVzIiAiJHt0YXJnZXR9IiB8IFwKKwkJJHtTRlRQfSAtYiAtIC1EICR7U0ZUUFNFUlZFUn0gMj4vZGV2L251bGwgfCBcCisJCWdyZXAgLXYgIl5zZnRwPiIgPiAke1JFU1VMVFN9CisJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJCWZhaWwgIiRlcnJ0YWcgZmFpbGVkIgorCWZpCisJaWYgdGVzdCAieCRleHBlY3RlZCIgIT0gIngiIDsgdGhlbgorCSAgICBpZiBmZ3JlcCAiJGV4cGVjdGVkIiAke1JFU1VMVFN9ID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwkJOgorCSAgICBlbHNlCisJCWZhaWwgIiRleHBlY3RlZCBtaXNzaW5nIGZyb20gJGVycnRhZyByZXN1bHRzIgorCSAgICBmaQorCWZpCisJaWYgdGVzdCAieCR1bmV4cGVjdGVkIiAhPSAieCIgJiYgXAorCSAgIGZncmVwICIkdW5leHBlY3RlZCIgJHtSRVNVTFRTfSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJCWZhaWwgIiR1bmV4cGVjdGVkIHByZXNlbnQgaW4gJGVycnRhZyByZXN1bHRzIgorCWZpCisJcm0gLWYgJHtSRVNVTFRTfQorfQorCitCQVNFPSR7T0JKfS9nbG9iCitSRVNVTFRTPSR7T0JKfS9yZXN1bHRzCitESVI9JHtCQVNFfS9kaXIKK0RBVEE9JHtESVJ9L2ZpbGUKKworR0xPQjE9IiR7RElSfS9nLXdpbGQqIgorR0xPQjI9IiR7RElSfS9nLXdpbGR4IgorUVVPVEU9IiR7RElSfS9nLXF1b3RlXCIiCitTTEFTSD0iJHtESVJ9L2ctc2xcXGFzaCIKK0VTTEFTSD0iJHtESVJ9L2ctc2xhc2hcXCIKK1FTTEFTSD0iJHtESVJ9L2ctcXNcXFwiIgorU1BBQ0U9IiR7RElSfS9nLXEgc3BhY2UiCisKK3JtIC1yZiAke0JBU0V9Citta2RpciAtcCAke0RJUn0KK3RvdWNoICIke0RBVEF9IiAiJHtHTE9CMX0iICIke0dMT0IyfSIgIiR7UVVPVEV9IiAiJHtTUEFDRX0iCit0ZXN0ICJ4JG5vYnMiID0gIngiICYmIHRvdWNoICIke1FTTEFTSH0iICIke0VTTEFTSH0iICIke1NMQVNIfSIKKworIyAgICAgICB0YXJnZXQgICAgICAgICAgICAgICAgICAgbWVzc2FnZSAgICAgICAgICAgICAgICBleHBlY3RlZCAgICAgdW5leHBlY3RlZAorc2Z0cF9scyAiJHtESVJ9L2ZpbCoiICAgICAgICAgICAgImZpbGUgZ2xvYiIgICAgICAgICAgICAiJHtEQVRBfSIgICAgIiIKK3NmdHBfbHMgIiR7QkFTRX0vZCoiICAgICAgICAgICAgICJkaXIgZ2xvYiIgICAgICAgICAgICAgImBiYXNlbmFtZSAke0RBVEF9YCIgIiIKK3NmdHBfbHMgIiR7RElSfS9nLXdpbGRcIipcIiIgICAgICJxdW90ZWQgZ2xvYiIgICAgICAgICAgImctd2lsZCoiICAgICJnLXdpbGR4Igorc2Z0cF9scyAiJHtESVJ9L2ctd2lsZFwqIiAgICAgICAgImVzY2FwZWQgZ2xvYiIgICAgICAgICAiZy13aWxkKiIgICAgImctd2lsZHgiCitzZnRwX2xzICIke0RJUn0vZy1xdW90ZVxcXCIiICAgICAiZXNjYXBlZCBxdW90ZSIgICAgICAgICJnLXF1b3RlXCIiICAiIgorc2Z0cF9scyAiXCIke0RJUn0vZy1xdW90ZVxcXCJcIiIgInF1b3RlZCBxdW90ZSIgICAgICAgICAiZy1xdW90ZVwiIiAgIiIKK3NmdHBfbHMgIicke0RJUn0vZy1xdW90ZVwiJyIgICAgICJzaW5nbGUtcXVvdGVkIHF1b3RlIiAgImctcXVvdGVcIiIgICIiCitzZnRwX2xzICIke0RJUn0vZy1xXFwgc3BhY2UiICAgICAiZXNjYXBlZCBzcGFjZSIgICAgICAgICJnLXEgc3BhY2UiICAiIgorc2Z0cF9scyAiJyR7RElSfS9nLXEgc3BhY2UnIiAgICAgInF1b3RlZCBzcGFjZSIgICAgICAgICAiZy1xIHNwYWNlIiAgIiIKK3NmdHBfbHMgIiR7RElSfS9nLXNsXFxcXGFzaCIgICAgICJlc2NhcGVkIHNsYXNoIiAgICAgICAgImctc2xcXGFzaCIgICIiICIkbm9icyIKK3NmdHBfbHMgIicke0RJUn0vZy1zbFxcXFxhc2gnIiAgICJxdW90ZWQgc2xhc2giICAgICAgICAgImctc2xcXGFzaCIgICIiICIkbm9icyIKK3NmdHBfbHMgIiR7RElSfS9nLXNsYXNoXFxcXCIgICAgICJlc2NhcGVkIHNsYXNoIGF0IEVPTCIgImctc2xhc2hcXCIgICIiICIkbm9icyIKK3NmdHBfbHMgIicke0RJUn0vZy1zbGFzaFxcXFwnIiAgICJxdW90ZWQgc2xhc2ggYXQgRU9MIiAgImctc2xhc2hcXCIgICIiICIkbm9icyIKK3NmdHBfbHMgIiR7RElSfS9nLXFzXFxcXFxcXCIiICAgICJlc2NhcGVkIHNsYXNoK3F1b3RlIiAgImctcXNcXFwiIiAgICIiICIkbm9icyIKK3NmdHBfbHMgIicke0RJUn0vZy1xc1xcXFxcIiciICAgICJxdW90ZWQgc2xhc2grcXVvdGUiICAgImctcXNcXFwiIiAgICIiICIkbm9icyIKKworcm0gLXJmICR7QkFTRX0KKwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3NmdHAuc2ggYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mvc2Z0cC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODRmYTZmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3NmdHAuc2gKQEAgLTAsMCArMSwzNSBAQAorIwkkT3BlbkJTRDogc2Z0cC5zaCx2IDEuMyAyMDA5LzA4LzEzIDAxOjExOjU1IGRqbSBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKK3RpZD0iYmFzaWMgc2Z0cCBwdXQvZ2V0IgorCitEQVRBPS9iaW4vbHMke0VYRUVYVH0KK0NPUFk9JHtPQkp9L2NvcHkKKworU0ZUUENNREZJTEU9JHtPQkp9L2JhdGNoCitjYXQgPiRTRlRQQ01ERklMRSA8PEVPRgordmVyc2lvbgorZ2V0ICREQVRBICR7Q09QWX0uMQorcHV0ICREQVRBICR7Q09QWX0uMgorRU9GCisKK0JVRkZFUlNJWkU9IjUgMTAwMCAzMjAwMCA2NDAwMCIKK1JFUVVFU1RTPSIxIDIgMTAiCisKK2ZvciBCIGluICR7QlVGRkVSU0laRX07IGRvCisJZm9yIFIgaW4gJHtSRVFVRVNUU307IGRvCisgICAgICAgICAgICAgICAgdmVyYm9zZSAidGVzdCAkdGlkOiBidWZmZXJfc2l6ZSAkQiBudW1fcmVxdWVzdHMgJFIiCisJCXJtIC1mICR7Q09QWX0uMSAke0NPUFl9LjIKKwkJJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9IC1CICRCIC1SICRSIC1iICRTRlRQQ01ERklMRSBcCisJCT4gL2Rldi9udWxsIDI+JjEKKwkJcj0kPworCQlpZiBbICRyIC1uZSAwIF07IHRoZW4KKwkJCWZhaWwgInNmdHAgZmFpbGVkIHdpdGggJHIiCisJCWVsc2UgCisJCQljbXAgJERBVEEgJHtDT1BZfS4xIHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IGFmdGVyIGdldCIKKwkJCWNtcCAkREFUQSAke0NPUFl9LjIgfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkgYWZ0ZXIgcHV0IgorCQlmaQorCWRvbmUKK2RvbmUKK3JtIC1mICR7Q09QWX0uMSAke0NPUFl9LjIgICAgICAgICAgICAgICAgCitybSAtZiAkU0ZUUENNREZJTEUKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy9zc2gtY29tLWNsaWVudC5zaCBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9zc2gtY29tLWNsaWVudC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjRhMGE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3NzaC1jb20tY2xpZW50LnNoCkBAIC0wLDAgKzEsMTM0IEBACisjCSRPcGVuQlNEOiBzc2gtY29tLWNsaWVudC5zaCx2IDEuNiAyMDA0LzAyLzI0IDE3OjA2OjUyIG1hcmt1cyBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKK3RpZD0iY29ubmVjdCB3aXRoIHNzaC5jb20gY2xpZW50IgorCisjVEVTVF9DT01CQVNFPS9wYXRoL3RvL3NzaC9jb20vYmluYXJpZXMKK2lmIFsgIlgke1RFU1RfQ09NQkFTRX0iID0gIlgiIF07IHRoZW4KKwlmYXRhbCAnJFRFU1RfQ09NQkFTRSBpcyBub3Qgc2V0JworZmkKKworVkVSU0lPTlM9IgorCTIuMS4wCisJMi4yLjAKKwkyLjMuMAorCTIuMy4xCisJMi40LjAKKwkzLjAuMAorCTMuMS4wCisJMy4yLjAKKwkzLjIuMgorCTMuMi4zCisJMy4yLjUKKwkzLjIuOQorCTMuMi45LjEKKwkzLjMuMCIKKworIyAyLjAuMTAgMi4wLjEyIDIuMC4xMyBkb24ndCBsaWtlIHRoZSB0ZXN0IHNldHVwCisKKyMgc2V0dXAgYXV0aG9yaXplZCBrZXlzCitTUkM9YGRpcm5hbWUgJHtTQ1JJUFR9YAorY3AgJHtTUkN9L2RzYV9zc2gyLnBydiAke09CSn0vaWQuY29tCitjaG1vZCA2MDAgJHtPQkp9L2lkLmNvbQorJHtTU0hLRVlHRU59IC1pIC1mICR7T0JKfS9pZC5jb20JPiAkT0JKL2lkLm9wZW5zc2gKK2NobW9kIDYwMCAke09CSn0vaWQub3BlbnNzaAorJHtTU0hLRVlHRU59IC15IC1mICR7T0JKfS9pZC5vcGVuc3NoCT4gJE9CSi9hdXRob3JpemVkX2tleXNfJFVTRVIKKyR7U1NIS0VZR0VOfSAtZSAtZiAke09CSn0vaWQub3BlbnNzaAk+ICRPQkovaWQuY29tLnB1YgorZWNobyBJZEtleSAke09CSn0vaWQuY29tID4gJHtPQkp9L2lkLmxpc3QKKworIyB3ZSBuZWVkIGEgRFNBIGhvc3Qga2V5Cit0PWRzYQorcm0gLWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7T0JKfS8kdCAke09CSn0vJHQucHViCiske1NTSEtFWUdFTn0gLXEgLU4gJycgLXQgJHQgLWYJICAke09CSn0vJHQKKyRTVURPIGNwICRPQkovJHQgJE9CSi9ob3N0LiR0CitlY2hvIEhvc3RLZXkgJE9CSi9ob3N0LiR0ID4+ICRPQkovc3NoZF9jb25maWcKKworIyBhZGQgaG9zdGtleXMgdG8ga25vd24gaG9zdHMKK21rZGlyIC1wICR7T0JKfS8ke1VTRVJ9L2hvc3RrZXlzCitISz0ke09CSn0vJHtVU0VSfS9ob3N0a2V5cy9rZXlfJHtQT1JUfV8xMjcuMC4wLjEKKyR7U1NIS0VZR0VOfSAtZSAtZiAke09CSn0vcnNhLnB1YiA+ICR7SEt9LnNzaC1yc2EucHViCiske1NTSEtFWUdFTn0gLWUgLWYgJHtPQkp9L2RzYS5wdWIgPiAke0hLfS5zc2gtZHNzLnB1YgorCitjYXQgPiAke09CSn0vc3NoMl9jb25maWcgPDwgRU9GCisqOgorCVF1aWV0TW9kZQkJCXllcworCVN0cmljdEhvc3RLZXlDaGVja2luZwkJeWVzCisJUG9ydAkJCQkke1BPUlR9CisJVXNlcgkJCQkke1VTRVJ9CisJSG9zdAkJCQkxMjcuMC4wLjEKKwlJZGVudGl0eUZpbGUJCQkke09CSn0vaWQubGlzdAorCVJhbmRvbVNlZWRGaWxlCQkJJHtPQkp9L3JhbmRvbV9zZWVkCisgICAgICAgIFVzZXJDb25maWdEaXJlY3RvcnkgICAgICAgICAgICAgJHtPQkp9LyVVCisJQXV0aGVudGljYXRpb25TdWNjZXNzTXNnCW5vCisJQmF0Y2hNb2RlCQkJeWVzCisJRm9yd2FyZFgxMQkJCW5vCitFT0YKKworIyB3ZSBuZWVkIGEgcmVhbCBzZXJ2ZXIgKG5vIFByb3h5Q29ubmVjdCBvcHRpb24pCitzdGFydF9zc2hkCisKK0RBVEE9L2Jpbi9scyR7RVhFRVhUfQorQ09QWT0ke09CSn0vY29weQorcm0gLWYgJHtDT1BZfQorCisjIGdvIGZvciBpdAorZm9yIHYgaW4gJHtWRVJTSU9OU307IGRvCisJc3NoMj0ke1RFU1RfQ09NQkFTRX0vJHt2fS9zc2gyCisJaWYgWyAhIC14ICR7c3NoMn0gXTsgdGhlbgorCQljb250aW51ZQorCWZpCisJdmVyYm9zZSAic3NoMiAke3Z9IgorCWtleT1zc2gtZHNzCisJc2tpcGNhdD0wCisgICAgICAgIGNhc2UgJHYgaW4KKyAgICAgICAgMi4xLip8Mi4zLjApCisgICAgICAgICAgICAgICAgc2tpcGNhdD0xCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgMy4wLiopCisgICAgICAgICAgICAgICAga2V5PXNzaC1yc2EKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisJY3AgJHtIS30uJGtleS5wdWIgJHtIS30ucHViCisKKwkjIGNoZWNrIGV4aXQgc3RhdHVzCisJJHtzc2gyfSAtcSAtRiAke09CSn0vc3NoMl9jb25maWcgc29tZWhvc3QgZXhpdCA0MgorCXI9JD8KKyAgICAgICAgaWYgWyAkciAtbmUgNDIgXTsgdGhlbgorICAgICAgICAgICAgICAgIGZhaWwgInNzaDIgJHt2fSBleGl0IGNvZGUgdGVzdCBmYWlsZWQgKGdvdCAkciwgZXhwZWN0ZWQgNDIpIgorICAgICAgICBmaQorCisJIyBkYXRhIHRyYW5zZmVyCisJcm0gLWYgJHtDT1BZfQorCSR7c3NoMn0gLUYgJHtPQkp9L3NzaDJfY29uZmlnIHNvbWVob3N0IGNhdCAke0RBVEF9ID4gJHtDT1BZfQorICAgICAgICBpZiBbICQ/IC1uZSAwIF07IHRoZW4KKyAgICAgICAgICAgICAgICBmYWlsICJzc2gyICR7dn0gY2F0IHRlc3QgKHJlY2VpdmUpIGZhaWxlZCIKKyAgICAgICAgZmkKKwljbXAgJHtEQVRBfSAke0NPUFl9CXx8IGZhaWwgInNzaDIgJHt2fSBjYXQgdGVzdCAocmVjZWl2ZSkgZGF0YSBtaXNtYXRjaCIKKworCSMgZGF0YSB0cmFuc2ZlciwgYWdhaW4KKwlpZiBbICRza2lwY2F0IC1lcSAwIF07IHRoZW4KKwkJcm0gLWYgJHtDT1BZfQorCQljYXQgJHtEQVRBfSB8IFwKKwkJCSR7c3NoMn0gLUYgJHtPQkp9L3NzaDJfY29uZmlnIGhvc3QgImNhdCA+ICR7Q09QWX0iCisJCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCQkJZmFpbCAic3NoMiAke3Z9IGNhdCB0ZXN0IChzZW5kKSBmYWlsZWQiCisJCWZpCisJCWNtcCAke0RBVEF9ICR7Q09QWX0JfHwgXAorCQkJZmFpbCAic3NoMiAke3Z9IGNhdCB0ZXN0IChzZW5kKSBkYXRhIG1pc21hdGNoIgorCWZpCisKKwkjIG5vIHN0ZGVyciBhZnRlciBlb2YKKwlybSAtZiAke0NPUFl9CisJJHtzc2gyfSAtRiAke09CSn0vc3NoMl9jb25maWcgc29tZWhvc3QgXAorCQlleGVjIHNoIC1jIFwnImV4ZWMgPiAvZGV2L251bGw7IHNsZWVwIDE7IGVjaG8gYmxhIDE+JjI7IGV4aXQgMCJcJyBcCisJCTI+IC9kZXYvbnVsbAorICAgICAgICBpZiBbICQ/IC1uZSAwIF07IHRoZW4KKyAgICAgICAgICAgICAgICBmYWlsICJzc2gyICR7dn0gc3RkZXJyIHRlc3QgZmFpbGVkIgorICAgICAgICBmaQorZG9uZQorCitybSAtcmYgJHtPQkp9LyR7VVNFUn0KK2ZvciBpIGluIHNzaDJfY29uZmlnIHJhbmRvbV9zZWVkIGRzYS5wdWIgZHNhIGhvc3QuZHNhIFwKKyAgICBpZC5saXN0IGlkLmNvbSBpZC5jb20ucHViIGlkLm9wZW5zc2g7IGRvCisJcm0gLWYgJHtPQkp9LyRpCitkb25lCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mvc3NoLWNvbS1rZXlnZW4uc2ggYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mvc3NoLWNvbS1rZXlnZW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjliMDJkOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9zc2gtY29tLWtleWdlbi5zaApAQCAtMCwwICsxLDc0IEBACisjCSRPcGVuQlNEOiBzc2gtY29tLWtleWdlbi5zaCx2IDEuNCAyMDA0LzAyLzI0IDE3OjA2OjUyIG1hcmt1cyBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKK3RpZD0ic3NoLmNvbSBrZXkgaW1wb3J0IgorCisjVEVTVF9DT01CQVNFPS9wYXRoL3RvL3NzaC9jb20vYmluYXJpZXMKK2lmIFsgIlgke1RFU1RfQ09NQkFTRX0iID0gIlgiIF07IHRoZW4KKwlmYXRhbCAnJFRFU1RfQ09NQkFTRSBpcyBub3Qgc2V0JworZmkKKworVkVSU0lPTlM9IgorCTIuMC4xMAorCTIuMC4xMgorCTIuMC4xMworCTIuMS4wCisJMi4yLjAKKwkyLjMuMAorCTIuMy4xCisJMi40LjAKKwkzLjAuMAorCTMuMS4wCisJMy4yLjAKKwkzLjIuMgorCTMuMi4zCisJMy4yLjUKKwkzLjIuOQorCTMuMi45LjEKKwkzLjMuMCIKKworQ09NUFJWPSR7T0JKfS9jb21rZXkKK0NPTVBVQj0ke0NPTVBSVn0ucHViCitPUEVOU1NIUFJWPSR7T0JKfS9vcGVuc3Noa2V5CitPUEVOU1NIUFVCPSR7T1BFTlNTSFBSVn0ucHViCisKKyMgZ28gZm9yIGl0Citmb3IgdiBpbiAke1ZFUlNJT05TfTsgZG8KKwlrZXlnZW49JHtURVNUX0NPTUJBU0V9LyR7dn0vc3NoLWtleWdlbjIKKwlpZiBbICEgLXggJHtrZXlnZW59IF07IHRoZW4KKwkJY29udGludWUKKwlmaQorCXR5cGVzPSJkc3MiCisgICAgICAgIGNhc2UgJHYgaW4KKyAgICAgICAgMi4zLjF8My4qKQorICAgICAgICAgICAgICAgIHR5cGVzPSIkdHlwZXMgcnNhIgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKwlmb3IgdCBpbiAkdHlwZXM7IGRvCisJCXZlcmJvc2UgInNzaC1rZXlnZW4gJHYvJHQiCisJCXJtIC1mICRDT01QUlYgJENPTVBVQiAkT1BFTlNTSFBSViAkT1BFTlNTSFBVQgorCQkke2tleWdlbn0gLXEgLVAgLXQgJHQgJHtDT01QUlZ9ID4gL2Rldi9udWxsIDI+JjEKKwkJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJCQlmYWlsICIke2tleWdlbn0gLXQgJHQgZmFpbGVkIgorCQkJY29udGludWUKKwkJZmkKKwkJJHtTU0hLRVlHRU59IC1pZiAke0NPTVBVQn0gPiAke09QRU5TU0hQVUJ9CisJCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCQkJZmFpbCAiaW1wb3J0IHB1YmxpYyBrZXkgKCR2LyR0KSBmYWlsZWQiCisJCQljb250aW51ZQorCQlmaQorCQkke1NTSEtFWUdFTn0gLWlmICR7Q09NUFJWfSA+ICR7T1BFTlNTSFBSVn0KKwkJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJCQlmYWlsICJpbXBvcnQgcHJpdmF0ZSBrZXkgKCR2LyR0KSBmYWlsZWQiCisJCQljb250aW51ZQorCQlmaQorCQljaG1vZCA2MDAgJHtPUEVOU1NIUFJWfQorCQkke1NTSEtFWUdFTn0gLXlmICR7T1BFTlNTSFBSVn0gfFwKKwkJCWRpZmYgLSAke09QRU5TU0hQVUJ9CisJCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCQkJZmFpbCAicHVibGljIGtleXMgKCR2LyR0KSBkaWZmZXIiCisJCWZpCisJZG9uZQorZG9uZQorCitybSAtZiAkQ09NUFJWICRDT01QVUIgJE9QRU5TU0hQUlYgJE9QRU5TU0hQVUIKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy9zc2gtY29tLXNmdHAuc2ggYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mvc3NoLWNvbS1zZnRwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNmY0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mvc3NoLWNvbS1zZnRwLnNoCkBAIC0wLDAgKzEsNjcgQEAKKyMJJE9wZW5CU0Q6IHNzaC1jb20tc2Z0cC5zaCx2IDEuNiAyMDA5LzA4LzIwIDE4OjQzOjA3IGRqbSBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKK3RpZD0iYmFzaWMgc2Z0cCBwdXQvZ2V0IHdpdGggc3NoLmNvbSBzZXJ2ZXIiCisKK0RBVEE9L2Jpbi9scyR7RVhFRVhUfQorQ09QWT0ke09CSn0vY29weQorU0ZUUENNREZJTEU9JHtPQkp9L2JhdGNoCisKK2NhdCA+JFNGVFBDTURGSUxFIDw8RU9GCit2ZXJzaW9uCitnZXQgJERBVEEgJHtDT1BZfS4xCitwdXQgJERBVEEgJHtDT1BZfS4yCitFT0YKKworQlVGRkVSU0laRT0iNSAxMDAwIDMyMDAwIDY0MDAwIgorUkVRVUVTVFM9IjEgMiAxMCIKKworI1RFU1RfQ09NQkFTRT0vcGF0aC90by9zc2gvY29tL2JpbmFyaWVzCitpZiBbICJYJHtURVNUX0NPTUJBU0V9IiA9ICJYIiBdOyB0aGVuCisJZmF0YWwgJyRURVNUX0NPTUJBU0UgaXMgbm90IHNldCcKK2ZpCisKK1ZFUlNJT05TPSIKKwkyLjAuMTAKKwkyLjAuMTIKKwkyLjAuMTMKKwkyLjEuMAorCTIuMi4wCisJMi4zLjAKKwkyLjMuMQorCTIuNC4wCisJMy4wLjAKKwkzLjEuMAorCTMuMi4wCisJMy4yLjIKKwkzLjIuMworCTMuMi41CisJMy4yLjkKKwkzLjIuOS4xCisJMy4zLjAiCisKKyMgZ28gZm9yIGl0Citmb3IgdiBpbiAke1ZFUlNJT05TfTsgZG8KKwlzZXJ2ZXI9JHtURVNUX0NPTUJBU0V9LyR7dn0vc2Z0cC1zZXJ2ZXIyCisJaWYgWyAhIC14ICR7c2VydmVyfSBdOyB0aGVuCisJCWNvbnRpbnVlCisJZmkKKwl2ZXJib3NlICJzZnRwLXNlcnZlciAkdiIKKwlmb3IgQiBpbiAke0JVRkZFUlNJWkV9OyBkbworCQlmb3IgUiBpbiAke1JFUVVFU1RTfTsgZG8KKwkJCXZlcmJvc2UgInRlc3QgJHRpZDogYnVmZmVyX3NpemUgJEIgbnVtX3JlcXVlc3RzICRSIgorCQkJcm0gLWYgJHtDT1BZfS4xICR7Q09QWX0uMgorCQkJJHtTRlRQfSAtRCAke3NlcnZlcn0gLUIgJEIgLVIgJFIgLWIgJFNGVFBDTURGSUxFIFwKKwkJCT4gL2Rldi9udWxsIDI+JjEKKwkJCXI9JD8KKwkJCWlmIFsgJHIgLW5lIDAgXTsgdGhlbgorCQkJCWZhaWwgInNmdHAgZmFpbGVkIHdpdGggJHIiCisJCQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQljbXAgJERBVEEgJHtDT1BZfS4xIHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IGFmdGVyIGdldCIKKwkJCQljbXAgJERBVEEgJHtDT1BZfS4yIHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IGFmdGVyIHB1dCIKKwkJCWZpCisJCWRvbmUKKwlkb25lCitkb25lCitybSAtZiAke0NPUFl9LjEgJHtDT1BZfS4yICAgICAgICAgICAgICAgIAorcm0gLWYgJFNGVFBDTURGSUxFCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mvc3NoLWNvbS5zaCBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9zc2gtY29tLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiY2Q4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mvc3NoLWNvbS5zaApAQCAtMCwwICsxLDExOSBAQAorIwkkT3BlbkJTRDogc3NoLWNvbS5zaCx2IDEuNyAyMDA0LzAyLzI0IDE3OjA2OjUyIG1hcmt1cyBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKK3RpZD0iY29ubmVjdCB0byBzc2guY29tIHNlcnZlciIKKworI1RFU1RfQ09NQkFTRT0vcGF0aC90by9zc2gvY29tL2JpbmFyaWVzCitpZiBbICJYJHtURVNUX0NPTUJBU0V9IiA9ICJYIiBdOyB0aGVuCisJZmF0YWwgJyRURVNUX0NPTUJBU0UgaXMgbm90IHNldCcKK2ZpCisKK1ZFUlNJT05TPSIKKwkyLjAuMTIKKwkyLjAuMTMKKwkyLjEuMAorCTIuMi4wCisJMi4zLjAKKwkyLjQuMAorCTMuMC4wCisJMy4xLjAKKwkzLjIuMAorCTMuMi4yCisJMy4yLjMKKwkzLjIuNQorCTMuMi45CisJMy4yLjkuMQorCTMuMy4wIgorIyAyLjAuMTAgZG9lcyBub3Qgc3VwcG9ydCBVc2VyQ29uZmlnRGlyZWN0b3J5CisjIDIuMy4xIHJlcXVpcmVzIGEgY29uZmlnIGluICRIT01FLy5zc2gyCisKK1NSQz1gZGlybmFtZSAke1NDUklQVH1gCisKKyMgc3NoLmNvbQorY2F0IDw8IEVPRiA+ICRPQkovc3NoZDJfY29uZmlnCisjKjoKKwkjIFBvcnQgYW5kIExpc3RlbkFkZHJlc3MgYXJlIG5vdCB1c2VkLgorCVF1aWV0TW9kZQkJCXllcworCVBvcnQJCQkJNDM0MworCUxpc3RlbkFkZHJlc3MJCQkxMjcuMC4wLjEKKwlVc2VyQ29uZmlnRGlyZWN0b3J5CQkke09CSn0vJVUKKwlDaXBoZXJzCQkJCUFueUNpcGhlcgorCVB1YktleUF1dGhlbnRpY2F0aW9uCQl5ZXMKKwkjQWxsb3dlZEF1dGhlbnRpY2F0aW9ucwkJcHVibGlja2V5CisJQXV0aG9yaXphdGlvbkZpbGUJCWF1dGhvcml6YXRpb24KKwlIb3N0S2V5RmlsZQkJCSR7U1JDfS9kc2Ffc3NoMi5wcnYKKwlQdWJsaWNIb3N0S2V5RmlsZQkJJHtTUkN9L2RzYV9zc2gyLnB1YgorCVJhbmRvbVNlZWRGaWxlCQkJJHtPQkp9L3JhbmRvbV9zZWVkCisJTWF4Q29ubmVjdGlvbnMJCQkwIAorCVBlcm1pdFJvb3RMb2dpbgkJCXllcworCVZlcmJvc2VNb2RlCQkJbm8KKwlDaGVja01haWwJCQlubworCVNzaDFDb21wYXRpYmlsaXR5CQlubworRU9GCisKKyMgY3JlYXRlIGNsaWVudCBjb25maWcgCitzZWQgInMvSG9zdEtleUFsaWFzLiovSG9zdEtleUFsaWFzIHNzaDItbG9jYWxob3N0LXdpdGgtYWxpYXMvIiBcCisJPCAkT0JKL3NzaF9jb25maWcgPiAkT0JKL3NzaF9jb25maWdfY29tCisKKyMgd2UgbmVlZCBhIERTQSBrZXkgZm9yCitybSAtZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtPQkp9L2RzYSAke09CSn0vZHNhLnB1YgorJHtTU0hLRVlHRU59IC1xIC1OICcnIC10IGRzYSAtZgkgICR7T0JKfS9kc2EKKworIyBzZXR1cCB1c2VyZGlyLCB0cnkgcnNhIGZpcnN0Citta2RpciAtcCAke09CSn0vJHtVU0VSfQorY3AgL2Rldi9udWxsICR7T0JKfS8ke1VTRVJ9L2F1dGhvcml6YXRpb24KK2ZvciB0IGluIHJzYSBkc2E7IGRvCisJJHtTU0hLRVlHRU59IC1lIC1mICR7T0JKfS8kdC5wdWIJPiAgJHtPQkp9LyR7VVNFUn0vJHQuY29tCisJZWNobyBLZXkgJHQuY29tCQkJPj4gJHtPQkp9LyR7VVNFUn0vYXV0aG9yaXphdGlvbgorCWVjaG8gSWRlbnRpdHlGaWxlICR7T0JKfS8kdAk+PiAke09CSn0vc3NoX2NvbmZpZ19jb20KK2RvbmUKKworIyBjb252ZXJ0IGFuZCBhcHBlbmQgRFNBIGhvc3RrZXkKKygKKwllY2hvbiAnc3NoMi1sb2NhbGhvc3Qtd2l0aC1hbGlhcywxMjcuMC4wLjEsOjoxICcKKwkke1NTSEtFWUdFTn0gLWlmICR7U1JDfS9kc2Ffc3NoMi5wdWIKKykgPj4gJE9CSi9rbm93bl9ob3N0cworCisjIGdvIGZvciBpdAorZm9yIHYgaW4gJHtWRVJTSU9OU307IGRvCisJc3NoZDI9JHtURVNUX0NPTUJBU0V9LyR7dn0vc3NoZDIKKwlpZiBbICEgLXggJHtzc2hkMn0gXTsgdGhlbgorCQljb250aW51ZQorCWZpCisJdHJhY2UgInNzaGQyICR7dn0iCisJUFJPWFk9InByb3h5Y29tbWFuZCAke3NzaGQyfSAtcWlmICR7T0JKfS9zc2hkMl9jb25maWcgMj4gL2Rldi9udWxsIgorCSR7U1NIfSAtcUYgJHtPQkp9L3NzaF9jb25maWdfY29tIC1vICIke1BST1hZfSIgZHVtbXkgZXhpdCAwCisgICAgICAgIGlmIFsgJD8gLW5lIDAgXTsgdGhlbgorICAgICAgICAgICAgICAgIGZhaWwgInNzaCBjb25uZWN0IHRvIHNzaGQyICR7dn0gZmFpbGVkIgorICAgICAgICBmaQorCisJY2lwaGVycz0iM2Rlcy1jYmMgYmxvd2Zpc2gtY2JjIGFyY2ZvdXIiCisJbWFjcz0iaG1hYy1tZDUiCisJY2FzZSAkdiBpbgorCTIuNC4qKQorCQljaXBoZXJzPSIkY2lwaGVycyBjYXN0MTI4LWNiYyIKKwkJbWFjcz0iJG1hY3MgaG1hYy1zaGExIGhtYWMtc2hhMS05NiBobWFjLW1kNS05NiIKKwkJOzsKKwkzLiopCisJCWNpcGhlcnM9IiRjaXBoZXJzIGFlczEyOC1jYmMgY2FzdDEyOC1jYmMiCisJCW1hY3M9IiRtYWNzIGhtYWMtc2hhMSBobWFjLXNoYTEtOTYgaG1hYy1tZDUtOTYiCisJCTs7CisJZXNhYworCSNjaXBoZXJzPSIzZGVzLWNiYyIKKwlmb3IgbSBpbiAkbWFjczsgZG8KKwlmb3IgYyBpbiAkY2lwaGVyczsgZG8KKwkJdHJhY2UgInNzaGQyICR7dn0gY2lwaGVyICRjIG1hYyAkbSIKKwkJdmVyYm9zZSAidGVzdCAke3RpZH06IHNzaGQyICR7dn0gY2lwaGVyICRjIG1hYyAkbSIKKwkJJHtTU0h9IC1jICRjIC1tICRtIC1xRiAke09CSn0vc3NoX2NvbmZpZ19jb20gLW8gIiR7UFJPWFl9IiBkdW1teSBleGl0IDAKKwkJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJCQlmYWlsICJzc2ggY29ubmVjdCB0byBzc2hkMiAke3Z9IHdpdGggJGMvJG0gZmFpbGVkIgorCQlmaQorCWRvbmUKKwlkb25lCitkb25lCisKK3JtIC1yZiAke09CSn0vJHtVU0VSfQorZm9yIGkgaW4gc3NoZF9jb25maWdfcHJveHkgc3NoX2NvbmZpZ19wcm94eSByYW5kb21fc2VlZCBcCisJc3NoZDJfY29uZmlnIGRzYS5wdWIgZHNhIHNzaF9jb25maWdfY29tOyBkbworCXJtIC1mICR7T0JKfS8kaQorZG9uZQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3NzaDJwdXR0eS5zaCBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9zc2gycHV0dHkuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjkxZGIxNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9zc2gycHV0dHkuc2gKQEAgLTAsMCArMSwzNCBAQAorIyEvYmluL3NoCisjCSRPcGVuQlNEOiBzc2gycHV0dHkuc2gsdiAxLjIgMjAwOS8xMC8wNiAyMzo1MTo0OSBkdHVja2VyIEV4cCAkCisKK2lmIHRlc3QgIngkMSIgPSAieCIgLW8gIngkMiIgPSAieCIgLW8gIngkMyIgPSAieCIgOyB0aGVuCisJZWNobyAiVXNhZ2U6IHNzaDJwdXR0eSBob3N0bmFtZSBwb3J0IHNzaC1wcml2YXRlLWtleSIKKwlleGl0IDEKK2ZpCisKK0hPU1Q9JDEKK1BPUlQ9JDIKK0tFWUZJTEU9JDMKKworIyBYWFggLSBzdXBwb3J0IERTQSBrZXlzIHRvbworaWYgZ3JlcCAiQkVHSU4gUlNBIFBSSVZBVEUgS0VZIiAkS0VZRklMRSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJOgorZWxzZQorCWVjaG8gIlVuc3VwcG9ydGVkIHByaXZhdGUga2V5IGZvcm1hdCIKKwlleGl0IDEKK2ZpCisKK3B1YmxpY19leHBvbmVudD1gCisJb3BlbnNzbCByc2EgLW5vb3V0IC10ZXh0IC1pbiAkS0VZRklMRSB8IGdyZXAgXnB1YmxpY0V4cG9uZW50IHwgCisJc2VkICdzLy4qKC8vO3MvKS4qLy8nCitgCit0ZXN0ICQ/IC1uZSAwICYmIGV4aXQgMQorCittb2R1bHVzPWAKKwlvcGVuc3NsIHJzYSAtbm9vdXQgLW1vZHVsdXMgLWluICRLRVlGSUxFIHwgZ3JlcCBeTW9kdWx1cz0gfCAKKwlzZWQgJ3MvXk1vZHVsdXM9LzB4LycgfCB0ciBBLVogYS16CitgCit0ZXN0ICQ/IC1uZSAwICYmIGV4aXQgMQorCitlY2hvICJyc2EyQCRQT1JUOiRIT1NUICRwdWJsaWNfZXhwb25lbnQsJG1vZHVsdXMiCisKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy9zc2hkLWxvZy13cmFwcGVyLnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3NzaGQtbG9nLXdyYXBwZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdhNWVmMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9zc2hkLWxvZy13cmFwcGVyLnNoCkBAIC0wLDAgKzEsMTMgQEAKKyMhL2Jpbi9zaAorIyAgICAgICAkT3BlbkJTRDogc3NoZC1sb2ctd3JhcHBlci5zaCx2IDEuMiAyMDA1LzAyLzI3IDExOjQwOjMwIGR0dWNrZXIgRXhwICQKKyMgICAgICAgUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgorIworIyBzaW1wbGUgd3JhcHBlciBmb3Igc3NoZCBwcm94eSBtb2RlIHRvIGNhdGNoIHN0ZGVyciBvdXRwdXQKKyMgc2ggc3NoZC1sb2ctd3JhcHBlci5zaCAvcGF0aC90by9zc2hkIC9wYXRoL3RvL2xvZ2ZpbGUKKworc3NoZD0kMQorbG9nPSQyCitzaGlmdAorc2hpZnQKKworZXhlYyAkc3NoZCAkQCAtZSAyPj4kbG9nCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mvc3RkZXJyLWFmdGVyLWVvZi5zaCBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9zdGRlcnItYWZ0ZXItZW9mLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YTVlYTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mvc3RkZXJyLWFmdGVyLWVvZi5zaApAQCAtMCwwICsxLDQwIEBACisjCSRPcGVuQlNEOiBzdGRlcnItYWZ0ZXItZW9mLnNoLHYgMS4xIDIwMDIvMDMvMjMgMTY6Mzg6MDkgbWFya3VzIEV4cCAkCisjCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KKwordGlkPSJzdGRlcnIgZGF0YSBhZnRlciBlb2YiCisKK0RBVEE9L2V0Yy9tb3RkCitEQVRBPSR7T0JKfS9kYXRhCitDT1BZPSR7T0JKfS9jb3B5CisKK2lmIGhhdmVfcHJvZyBtZDVzdW07IHRoZW4KKwlDSEVDS1NVTT1tZDVzdW0KK2VsaWYgaGF2ZV9wcm9nIG9wZW5zc2w7IHRoZW4KKwlDSEVDS1NVTT0ib3BlbnNzbCBtZDUiCitlbGlmIGhhdmVfcHJvZyBja3N1bTsgdGhlbgorCUNIRUNLU1VNPWNrc3VtCitlbGlmIGhhdmVfcHJvZyBzdW07IHRoZW4KKwlDSEVDS1NVTT1zdW0KK2Vsc2UKKwlmYXRhbCAiTm8gY2hlY2tzdW0gcHJvZ3JhbSBhdmFpbGFibGUsIGFib3J0aW5nICR0aWQgdGVzdCIKK2ZpCisKKyMgc2V0dXAgZGF0YQorcm0gLWYgJHtEQVRBfSAke0NPUFl9CitjcCAvZGV2L251bGwgJHtEQVRBfQorZm9yIGkgaW4gMSAyIDMgNCA1IDY7IGRvCisJKGRhdGU7ZWNobyAkaSkgfCAkQ0hFQ0tTVU0gPj4gJHtEQVRBfQorZG9uZQorCiske1NTSH0gLTIgLUYgJE9CSi9zc2hfcHJveHkgb3RoZXJob3N0IFwKKwlleGVjIHNoIC1jIFwnImV4ZWMgPiAvZGV2L251bGw7IHNsZWVwIDI7IGNhdCAke0RBVEF9IDE+JjIgJHMiXCcgXAorCTI+ICR7Q09QWX0KK3I9JD8KK2lmIFsgJHIgLW5lIDAgXTsgdGhlbgorCWZhaWwgInNzaCBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJHIiCitmaQorZWdyZXAgJ0Rpc2Nvbm5lY3Rpbmc6IFJlY2VpdmVkIGV4dGVuZGVkX2RhdGEgYWZ0ZXIgRU9GJyAke0NPUFl9ICYmCisJZmFpbCAiZXh0IGRhdGEgcmVjZWl2ZWQgYWZ0ZXIgZW9mIgorY21wICR7REFUQX0gJHtDT1BZfQl8fCBmYWlsICJzdGRlcnIgY29ycnVwdCIKKworcm0gLWYgJHtEQVRBfSAke0NPUFl9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mvc3RkZXJyLWRhdGEuc2ggYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3Mvc3RkZXJyLWRhdGEuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRhZjc5YgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy9zdGRlcnItZGF0YS5zaApAQCAtMCwwICsxLDMzIEBACisjCSRPcGVuQlNEOiBzdGRlcnItZGF0YS5zaCx2IDEuMiAyMDAyLzAzLzI3IDIyOjM5OjUyIG1hcmt1cyBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKK3RpZD0ic3RkZXJyIGRhdGEgdHJhbnNmZXIiCisKK0RBVEE9L2Jpbi9scyR7RVhFRVhUfQorQ09QWT0ke09CSn0vY29weQorcm0gLWYgJHtDT1BZfQorCitmb3IgbiBpbiAnJyAtbjsgZG8KK2ZvciBwIGluIDEgMjsgZG8KKwl2ZXJib3NlICJ0ZXN0ICR0aWQ6IHByb3RvICRwICgkbikiCisJJHtTU0h9ICRuIC0kcCAtRiAkT0JKL3NzaF9wcm94eSBvdGhlcmhvc3QgXAorCQlleGVjIHNoIC1jIFwnImV4ZWMgPiAvZGV2L251bGw7IHNsZWVwIDM7IGNhdCAke0RBVEF9IDE+JjIgJHMiXCcgXAorCQkyPiAke0NPUFl9CisJcj0kPworCWlmIFsgJHIgLW5lIDAgXTsgdGhlbgorCQlmYWlsICJzc2ggZmFpbGVkIHdpdGggZXhpdCBjb2RlICRyIgorCWZpCisJY21wICR7REFUQX0gJHtDT1BZfQl8fCBmYWlsICJzdGRlcnIgY29ycnVwdCIKKwlybSAtZiAke0NPUFl9CisKKwkke1NTSH0gJG4gLSRwIC1GICRPQkovc3NoX3Byb3h5IG90aGVyaG9zdCBcCisJCWV4ZWMgc2ggLWMgXCciZWNobyBhOyBleGVjID4gL2Rldi9udWxsOyBzbGVlcCAzOyBjYXQgJHtEQVRBfSAxPiYyICRzIlwnIFwKKwkJPiAvZGV2L251bGwgMj4gJHtDT1BZfQorCXI9JD8KKwlpZiBbICRyIC1uZSAwIF07IHRoZW4KKwkJZmFpbCAic3NoIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAkciIKKwlmaQorCWNtcCAke0RBVEF9ICR7Q09QWX0JfHwgZmFpbCAic3RkZXJyIGNvcnJ1cHQiCisJcm0gLWYgJHtDT1BZfQorZG9uZQorZG9uZQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3Q0Lm9rIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3Q0Lm9rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNDk0MmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvdDQub2sKQEAgLTAsMCArMSBAQAorM2I6ZGQ6NDQ6ZTk6NDk6MTg6ODQ6OTU6ZjE6ZTc6MzM6NmI6OWQ6OTM6YjE6MzYKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy90NS5vayBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy90NS5vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDYyMmYzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3Q1Lm9rCkBAIC0wLDAgKzEgQEAKK3hva2VzLWx5bGlzLWJ5bGVoLXplYmliLWthbHVzLWJpaGFzLXRldmFoLWhhcm96LXN1aGFyLWZvdmVkLW5veGV4CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvdGVzdC1leGVjLnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3Rlc3QtZXhlYy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTJjZmVkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3Rlc3QtZXhlYy5zaApAQCAtMCwwICsxLDQwMiBAQAorIwkkT3BlbkJTRDogdGVzdC1leGVjLnNoLHYgMS4zNyAyMDEwLzAyLzI0IDA2OjIxOjU2IGRqbSBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKKyNTVURPPXN1ZG8KKworIyBVbmJyZWFrIEdOVSBoZWFkKDEpCitfUE9TSVgyX1ZFUlNJT049MTk5MjA5CitleHBvcnQgX1BPU0lYMl9WRVJTSU9OCisKK2Nhc2UgYHVuYW1lIC1zIDI+L2Rldi9udWxsYCBpbgorT1NGMSopCisJQklOX1NIPXhwZzQKKwlleHBvcnQgQklOX1NICisJOzsKK2VzYWMKKworaWYgWyAhIC16ICIkVEVTVF9TU0hfUE9SVCIgXTsgdGhlbgorCVBPUlQ9IiRURVNUX1NTSF9QT1JUIgorZWxzZQorCVBPUlQ9NDI0MgorZmkKKworaWYgWyAteCAvdXNyL3VjYi93aG9hbWkgXTsgdGhlbgorCVVTRVI9YC91c3IvdWNiL3dob2FtaWAKK2VsaWYgd2hvYW1pID4vZGV2L251bGwgMj4mMTsgdGhlbgorCVVTRVI9YHdob2FtaWAKK2VsaWYgbG9nbmFtZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwlVU0VSPWBsb2duYW1lYAorZWxzZQorCVVTRVI9YGlkIC11bmAKK2ZpCisKK09CSj0kMQoraWYgWyAieCRPQkoiID0gIngiIF07IHRoZW4KKwllY2hvICckT0JKIG5vdCBkZWZpbmVkJworCWV4aXQgMgorZmkKK2lmIFsgISAtZCAkT0JKIF07IHRoZW4KKwllY2hvICJub3QgYSBkaXJlY3Rvcnk6ICRPQkoiCisJZXhpdCAyCitmaQorU0NSSVBUPSQyCitpZiBbICJ4JFNDUklQVCIgPSAieCIgXTsgdGhlbgorCWVjaG8gJyRTQ1JJUFQgbm90IGRlZmluZWQnCisJZXhpdCAyCitmaQoraWYgWyAhIC1mICRTQ1JJUFQgXTsgdGhlbgorCWVjaG8gIm5vdCBhIGZpbGU6ICRTQ1JJUFQiCisJZXhpdCAyCitmaQoraWYgJFRFU1RfU0hFTEwgLW4gJFNDUklQVDsgdGhlbgorCXRydWUKK2Vsc2UKKwllY2hvICJzeW50YXggZXJyb3IgaW4gJFNDUklQVCIKKwlleGl0IDIKK2ZpCit1bnNldCBTU0hfQVVUSF9TT0NLCisKK1NSQz1gZGlybmFtZSAke1NDUklQVH1gCisKKyMgZGVmYXVsdHMKK1NTSD1zc2gKK1NTSEQ9c3NoZAorU1NIQUdFTlQ9c3NoLWFnZW50CitTU0hBREQ9c3NoLWFkZAorU1NIS0VZR0VOPXNzaC1rZXlnZW4KK1NTSEtFWVNDQU49c3NoLWtleXNjYW4KK1NGVFA9c2Z0cAorU0ZUUFNFUlZFUj0vdXNyL2xpYmV4ZWMvb3BlbnNzaC9zZnRwLXNlcnZlcgorU0NQPXNjcAorCisjIEludGVyb3AgdGVzdGluZworUExJTks9cGxpbmsKK1BVVFRZR0VOPXB1dHR5Z2VuCitDT05DSD1jb25jaAorCitpZiBbICJ4JFRFU1RfU1NIX1NTSCIgIT0gIngiIF07IHRoZW4KKwlTU0g9IiR7VEVTVF9TU0hfU1NIfSIKK2ZpCitpZiBbICJ4JFRFU1RfU1NIX1NTSEQiICE9ICJ4IiBdOyB0aGVuCisJU1NIRD0iJHtURVNUX1NTSF9TU0hEfSIKK2ZpCitpZiBbICJ4JFRFU1RfU1NIX1NTSEFHRU5UIiAhPSAieCIgXTsgdGhlbgorCVNTSEFHRU5UPSIke1RFU1RfU1NIX1NTSEFHRU5UfSIKK2ZpCitpZiBbICJ4JFRFU1RfU1NIX1NTSEFERCIgIT0gIngiIF07IHRoZW4KKwlTU0hBREQ9IiR7VEVTVF9TU0hfU1NIQUREfSIKK2ZpCitpZiBbICJ4JFRFU1RfU1NIX1NTSEtFWUdFTiIgIT0gIngiIF07IHRoZW4KKwlTU0hLRVlHRU49IiR7VEVTVF9TU0hfU1NIS0VZR0VOfSIKK2ZpCitpZiBbICJ4JFRFU1RfU1NIX1NTSEtFWVNDQU4iICE9ICJ4IiBdOyB0aGVuCisJU1NIS0VZU0NBTj0iJHtURVNUX1NTSF9TU0hLRVlTQ0FOfSIKK2ZpCitpZiBbICJ4JFRFU1RfU1NIX1NGVFAiICE9ICJ4IiBdOyB0aGVuCisJU0ZUUD0iJHtURVNUX1NTSF9TRlRQfSIKK2ZpCitpZiBbICJ4JFRFU1RfU1NIX1NGVFBTRVJWRVIiICE9ICJ4IiBdOyB0aGVuCisJU0ZUUFNFUlZFUj0iJHtURVNUX1NTSF9TRlRQU0VSVkVSfSIKK2ZpCitpZiBbICJ4JFRFU1RfU1NIX1NDUCIgIT0gIngiIF07IHRoZW4KKwlTQ1A9IiR7VEVTVF9TU0hfU0NQfSIKK2ZpCitpZiBbICJ4JFRFU1RfU1NIX1BMSU5LIiAhPSAieCIgXTsgdGhlbgorCSMgRmluZCByZWFsIGJpbmFyeSwgaWYgaXQgZXhpc3RzCisJY2FzZSAiJHtURVNUX1NTSF9QTElOS30iIGluCisJLyopIFBMSU5LPSIke1RFU1RfU1NIX1BMSU5LfSIgOzsKKwkqKSBQTElOSz1gd2hpY2ggJHtURVNUX1NTSF9QTElOS30gMj4vZGV2L251bGxgIDs7CisJZXNhYworZmkKK2lmIFsgIngkVEVTVF9TU0hfUFVUVFlHRU4iICE9ICJ4IiBdOyB0aGVuCisJIyBGaW5kIHJlYWwgYmluYXJ5LCBpZiBpdCBleGlzdHMKKwljYXNlICIke1RFU1RfU1NIX1BVVFRZR0VOfSIgaW4KKwkvKikgUFVUVFlHRU49IiR7VEVTVF9TU0hfUFVUVFlHRU59IiA7OworCSopIFBVVFRZR0VOPWB3aGljaCAke1RFU1RfU1NIX1BVVFRZR0VOfSAyPi9kZXYvbnVsbGAgOzsKKwllc2FjCitmaQoraWYgWyAieCRURVNUX1NTSF9DT05DSCIgIT0gIngiIF07IHRoZW4KKwkjIEZpbmQgcmVhbCBiaW5hcnksIGlmIGl0IGV4aXN0cworCWNhc2UgIiR7VEVTVF9TU0hfQ09OQ0h9IiBpbgorCS8qKSBDT05DSD0iJHtURVNUX1NTSF9DT05DSH0iIDs7CisJKikgQ09OQ0g9YHdoaWNoICR7VEVTVF9TU0hfQ09OQ0h9IDI+L2Rldi9udWxsYCA7OworCWVzYWMKK2ZpCisKKyMgUGF0aCB0byBzc2hkIG11c3QgYmUgYWJzb2x1dGUgZm9yIHJleGVjCitjYXNlICIkU1NIRCIgaW4KKy8qKSA7OworKikgU1NIRD1gd2hpY2ggc3NoZGAgOzsKK2VzYWMKKworaWYgWyAieCRURVNUX1NTSF9MT0dGSUxFIiA9ICJ4IiBdOyB0aGVuCisJVEVTVF9TU0hfTE9HRklMRT0vZGV2L251bGwKK2ZpCisKKyMgdGhlc2Ugc2hvdWxkIGJlIHVzZWQgaW4gdGVzdHMKK2V4cG9ydCBTU0ggU1NIRCBTU0hBR0VOVCBTU0hBREQgU1NIS0VZR0VOIFNTSEtFWVNDQU4gU0ZUUCBTRlRQU0VSVkVSIFNDUAorI2VjaG8gJFNTSCAkU1NIRCAkU1NIQUdFTlQgJFNTSEFERCAkU1NIS0VZR0VOICRTU0hLRVlTQ0FOICRTRlRQICRTRlRQU0VSVkVSICRTQ1AKKworIyBoZWxwZXIKK2VjaG9uKCkKK3sKKyAgICAgICBpZiBbICJ4YGVjaG8gLW5gIiA9ICJ4IiBdOyB0aGVuCisgICAgICAgICAgICAgICBlY2hvIC1uICIkQCIKKyAgICAgICBlbGlmIFsgInhgZWNobyAnXGMnYCIgPSAieCIgXTsgdGhlbgorICAgICAgICAgICAgICAgZWNobyAiJEBcYyIKKyAgICAgICBlbHNlCisgICAgICAgICAgICAgICBmYXRhbCAiRG9uJ3Qga25vdyBob3cgdG8gZWNobyB3aXRob3V0IG5ld2xpbmUuIgorICAgICAgIGZpCit9CisKK2hhdmVfcHJvZygpCit7CisJc2F2ZWRfSUZTPSIkSUZTIgorCUlGUz0iOiIKKwlmb3IgaSBpbiAkUEFUSAorCWRvCisJCWlmIFsgLXggJGkvJDEgXTsgdGhlbgorCQkJSUZTPSIkc2F2ZWRfSUZTIgorCQkJcmV0dXJuIDAKKwkJZmkKKwlkb25lCisJSUZTPSIkc2F2ZWRfSUZTIgorCXJldHVybiAxCit9CisKK2NsZWFudXAgKCkKK3sKKwlpZiBbIC1mICRQSURGSUxFIF07IHRoZW4KKwkJcGlkPWAkU1VETyBjYXQgJFBJREZJTEVgCisJCWlmIFsgIlgkcGlkIiA9ICJYIiBdOyB0aGVuCisJCQllY2hvIG5vIHNzaGQgcnVubmluZworCQllbHNlCisJCQlpZiBbICRwaWQgLWx0IDIgXTsgdGhlbgorCQkJCWVjaG8gYmFkIHBpZCBmb3Igc3NoOiAkcGlkCisJCQllbHNlCisJCQkJJFNVRE8ga2lsbCAkcGlkCisJCQkJdHJhY2UgIndhaXQgZm9yIHNzaGQgdG8gZXhpdCIKKwkJCQlpPTA7CisJCQkJd2hpbGUgWyAtZiAkUElERklMRSAtYSAkaSAtbHQgNSBdOyBkbworCQkJCQlpPWBleHByICRpICsgMWAKKwkJCQkJc2xlZXAgJGkKKwkJCQlkb25lCisJCQkJdGVzdCAtZiAkUElERklMRSAmJiBcCisJCQkJICAgIGZhdGFsICJzc2hkIGRpZG4ndCBleGl0IHBvcnQgJFBPUlQgcGlkICRwaWQiCisJCQlmaQorCQlmaQorCWZpCit9CisKK3RyYWNlICgpCit7CisJZWNobyAidHJhY2U6ICRAIiA+PiRURVNUX1NTSF9MT0dGSUxFCisJaWYgWyAiWCRURVNUX1NTSF9UUkFDRSIgPSAiWHllcyIgXTsgdGhlbgorCQllY2hvICIkQCIKKwlmaQorfQorCit2ZXJib3NlICgpCit7CisJZWNobyAidmVyYm9zZTogJEAiID4+JFRFU1RfU1NIX0xPR0ZJTEUKKwlpZiBbICJYJFRFU1RfU1NIX1FVSUVUIiAhPSAiWHllcyIgXTsgdGhlbgorCQllY2hvICIkQCIKKwlmaQorfQorCit3YXJuICgpCit7CisJZWNobyAiV0FSTklORzogJEAiID4+JFRFU1RfU1NIX0xPR0ZJTEUKKwllY2hvICJXQVJOSU5HOiAkQCIKK30KKworZmFpbCAoKQoreworCWVjaG8gIkZBSUw6ICRAIiA+PiRURVNUX1NTSF9MT0dGSUxFCisJUkVTVUxUPTEKKwllY2hvICIkQCIKK30KKworZmF0YWwgKCkKK3sKKwllY2hvICJGQVRBTDogJEAiID4+JFRFU1RfU1NIX0xPR0ZJTEUKKwllY2hvbiAiRkFUQUw6ICIKKwlmYWlsICIkQCIKKwljbGVhbnVwCisJZXhpdCAkUkVTVUxUCit9CisKKyMgQ2hlY2sgd2hldGhlciBwcmVwcm9jZXNzb3Igc3ltYm9scyBhcmUgZGVmaW5lZCBpbiBjb25maWcuaC4KK2NvbmZpZ19kZWZpbmVkICgpCit7CisJc3RyPSQxCisJd2hpbGUgdGVzdCAieCQyIiAhPSAieCIgOyBkbworCQlzdHI9IiRzdHJ8JDIiCisJCXNoaWZ0CisJZG9uZQorCWVncmVwICJeI2RlZmluZS4qKCRzdHIpIiAke0JVSUxERElSfS9jb25maWcuaCA+L2Rldi9udWxsIDI+JjEKK30KKworUkVTVUxUPTAKK1BJREZJTEU9JE9CSi9waWRmaWxlCisKK3RyYXAgZmF0YWwgMyAyCisKKyMgY3JlYXRlIHNlcnZlciBjb25maWcKK2NhdCA8PCBFT0YgPiAkT0JKL3NzaGRfY29uZmlnCisJU3RyaWN0TW9kZXMJCW5vCisJUG9ydAkJCSRQT1JUCisJUHJvdG9jb2wJCTIsMQorCUFkZHJlc3NGYW1pbHkJCWluZXQKKwlMaXN0ZW5BZGRyZXNzCQkxMjcuMC4wLjEKKwkjTGlzdGVuQWRkcmVzcwkJOjoxCisJUGlkRmlsZQkJCSRQSURGSUxFCisJQXV0aG9yaXplZEtleXNGaWxlCSRPQkovYXV0aG9yaXplZF9rZXlzXyV1CisJTG9nTGV2ZWwJCVZFUkJPU0UKKwlBY2NlcHRFbnYJCV9YWFhfVEVTVF8qCisJQWNjZXB0RW52CQlfWFhYX1RFU1QKKwlTdWJzeXN0ZW0Jc2Z0cAkkU0ZUUFNFUlZFUgorRU9GCisKK2lmIFsgISAteiAiJFRFU1RfU1NIX1NTSERfQ09ORk9QVFMiIF07IHRoZW4KKwl0cmFjZSAiYWRkaW5nIHNzaGRfY29uZmlnIG9wdGlvbiAkVEVTVF9TU0hfU1NIRF9DT05GT1BUUyIKKwllY2hvICIkVEVTVF9TU0hfU1NIRF9DT05GT1BUUyIgPj4gJE9CSi9zc2hkX2NvbmZpZworZmkKKworIyBzZXJ2ZXIgY29uZmlnIGZvciBwcm94eSBjb25uZWN0cworY3AgJE9CSi9zc2hkX2NvbmZpZyAkT0JKL3NzaGRfcHJveHkKKworIyBhbGxvdyBncm91cC13cml0YWJsZSBkaXJlY3RvcmllcyBpbiBwcm94eS1tb2RlCitlY2hvICdTdHJpY3RNb2RlcyBubycgPj4gJE9CSi9zc2hkX3Byb3h5CisKKyMgY3JlYXRlIGNsaWVudCBjb25maWcKK2NhdCA8PCBFT0YgPiAkT0JKL3NzaF9jb25maWcKK0hvc3QgKgorCVByb3RvY29sCQkyLDEKKwlIb3N0bmFtZQkJMTI3LjAuMC4xCisJSG9zdEtleUFsaWFzCQlsb2NhbGhvc3Qtd2l0aC1hbGlhcworCVBvcnQJCQkkUE9SVAorCVVzZXIJCQkkVVNFUgorCUdsb2JhbEtub3duSG9zdHNGaWxlCSRPQkova25vd25faG9zdHMKKwlVc2VyS25vd25Ib3N0c0ZpbGUJJE9CSi9rbm93bl9ob3N0cworCVJTQUF1dGhlbnRpY2F0aW9uCXllcworCVB1YmtleUF1dGhlbnRpY2F0aW9uCXllcworCUNoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24Jbm8KKwlIb3N0YmFzZWRBdXRoZW50aWNhdGlvbglubworCVBhc3N3b3JkQXV0aGVudGljYXRpb24Jbm8KKwlCYXRjaE1vZGUJCXllcworCVN0cmljdEhvc3RLZXlDaGVja2luZwl5ZXMKK0VPRgorCitpZiBbICEgLXogIiRURVNUX1NTSF9TU0hfQ09ORk9QVFMiIF07IHRoZW4KKwl0cmFjZSAiYWRkaW5nIHNzaF9jb25maWcgb3B0aW9uICRURVNUX1NTSF9TU0hEX0NPTkZPUFRTIgorCWVjaG8gIiRURVNUX1NTSF9TU0hfQ09ORk9QVFMiID4+ICRPQkovc3NoX2NvbmZpZworZmkKKworcm0gLWYgJE9CSi9rbm93bl9ob3N0cyAkT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgorCit0cmFjZSAiZ2VuZXJhdGUga2V5cyIKK2ZvciB0IGluIHJzYSByc2ExOyBkbworCSMgZ2VuZXJhdGUgdXNlciBrZXkKKwlybSAtZiAkT0JKLyR0CisJJHtTU0hLRVlHRU59IC1iIDEwMjQgLXEgLU4gJycgLXQgJHQgIC1mICRPQkovJHQgfHxcCisJCWZhaWwgInNzaC1rZXlnZW4gZm9yICR0IGZhaWxlZCIKKworCSMga25vd24gaG9zdHMgZmlsZSBmb3IgY2xpZW50CisJKAorCQllY2hvbiAnbG9jYWxob3N0LXdpdGgtYWxpYXMsMTI3LjAuMC4xLDo6MSAnCisJCWNhdCAkT0JKLyR0LnB1YgorCSkgPj4gJE9CSi9rbm93bl9ob3N0cworCisJIyBzZXR1cCBhdXRob3JpemVkIGtleXMKKwljYXQgJE9CSi8kdC5wdWIgPj4gJE9CSi9hdXRob3JpemVkX2tleXNfJFVTRVIKKwllY2hvIElkZW50aXR5RmlsZSAkT0JKLyR0ID4+ICRPQkovc3NoX2NvbmZpZworCisJIyB1c2Uga2V5IGFzIGhvc3Qga2V5LCB0b28KKwkkU1VETyBjcCAkT0JKLyR0ICRPQkovaG9zdC4kdAorCWVjaG8gSG9zdEtleSAkT0JKL2hvc3QuJHQgPj4gJE9CSi9zc2hkX2NvbmZpZworCisJIyBkb24ndCB1c2UgU1VETyBmb3IgcHJveHkgY29ubmVjdAorCWVjaG8gSG9zdEtleSAkT0JKLyR0ID4+ICRPQkovc3NoZF9wcm94eQorZG9uZQorY2htb2QgNjQ0ICRPQkovYXV0aG9yaXplZF9rZXlzXyRVU0VSCisKKyMgQWN0aXZhdGUgVHdpc3RlZCBDb25jaCB0ZXN0cyBpZiB0aGUgYmluYXJ5IGlzIHByZXNlbnQKK1JFR1JFU1NfSU5URVJPUF9DT05DSD1ubworaWYgdGVzdCAteCAiJENPTkNIIiA7IHRoZW4KKwlSRUdSRVNTX0lOVEVST1BfQ09OQ0g9eWVzCitmaQorCisjIElmIFB1VFRZIGlzIHByZXNlbnQgYW5kIHdlIGFyZSBydW5uaW5nIGEgUHVUVFkgdGVzdCwgcHJlcGFyZSBrZXlzIGFuZAorIyBjb25maWd1cmF0aW9uCitSRUdSRVNTX0lOVEVST1BfUFVUVFk9bm8KK2lmIHRlc3QgLXggIiRQVVRUWUdFTiIgLWEgLXggIiRQTElOSyIgOyB0aGVuCisJUkVHUkVTU19JTlRFUk9QX1BVVFRZPXllcworZmkKK2Nhc2UgIiRTQ1JJUFQiIGluCisqcHV0dHkqKQk7OworKikJCVJFR1JFU1NfSU5URVJPUF9QVVRUWT1ubyA7OworZXNhYworCitpZiB0ZXN0ICIkUkVHUkVTU19JTlRFUk9QX1BVVFRZIiA9ICJ5ZXMiIDsgdGhlbgorCW1rZGlyIC1wICR7T0JKfS8ucHV0dHkKKworCSMgQWRkIGEgUHVUVFkga2V5IHRvIGF1dGhvcml6ZWRfa2V5cworCXJtIC1mICR7T0JKfS9wdXR0eS5yc2EyCisJcHV0dHlnZW4gLXQgcnNhIC1vICR7T0JKfS9wdXR0eS5yc2EyIDwgL2Rldi9udWxsID4gL2Rldi9udWxsCisJcHV0dHlnZW4gLU8gcHVibGljLW9wZW5zc2ggJHtPQkp9L3B1dHR5LnJzYTIgXAorCSAgICA+PiAkT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgorCisJIyBDb252ZXJ0IHJzYTIgaG9zdCBrZXkgdG8gUHVUVFkgZm9ybWF0CisJJHtTUkN9L3NzaDJwdXR0eS5zaCAxMjcuMC4wLjEgJFBPUlQgJE9CSi9yc2EgPiBcCisJICAgICR7T0JKfS8ucHV0dHkvc3NoaG9zdGtleXMKKwkke1NSQ30vc3NoMnB1dHR5LnNoIDEyNy4wLjAuMSAyMiAkT0JKL3JzYSA+PiBcCisJICAgICR7T0JKfS8ucHV0dHkvc3NoaG9zdGtleXMKKworCSMgU2V0dXAgcHJveGllZCBzZXNzaW9uCisJbWtkaXIgLXAgJHtPQkp9Ly5wdXR0eS9zZXNzaW9ucworCXJtIC1mICR7T0JKfS8ucHV0dHkvc2Vzc2lvbnMvbG9jYWxob3N0X3Byb3h5CisJZWNobyAiSG9zdG5hbWU9MTI3LjAuMC4xIiA+PiAke09CSn0vLnB1dHR5L3Nlc3Npb25zL2xvY2FsaG9zdF9wcm94eQorCWVjaG8gIlBvcnROdW1iZXI9JFBPUlQiID4+ICR7T0JKfS8ucHV0dHkvc2Vzc2lvbnMvbG9jYWxob3N0X3Byb3h5CisJZWNobyAiUHJveHlNZXRob2Q9NSIgPj4gJHtPQkp9Ly5wdXR0eS9zZXNzaW9ucy9sb2NhbGhvc3RfcHJveHkKKwllY2hvICJQcm94eVRlbG5ldENvbW1hbmQ9c2ggJHtTUkN9L3NzaGQtbG9nLXdyYXBwZXIuc2ggJHtTU0hEfSAke1RFU1RfU1NIX0xPR0ZJTEV9IC1pIC1mICRPQkovc3NoZF9wcm94eSIgPj4gJHtPQkp9Ly5wdXR0eS9zZXNzaW9ucy9sb2NhbGhvc3RfcHJveHkgCisKKwlSRUdSRVNTX0lOVEVST1BfUFVUVFk9eWVzCitmaQorCisjIGNyZWF0ZSBhIHByb3h5IHZlcnNpb24gb2YgdGhlIGNsaWVudCBjb25maWcKKygKKwljYXQgJE9CSi9zc2hfY29uZmlnCisJZWNobyBwcm94eWNvbW1hbmQgJHtTVURPfSBzaCAke1NSQ30vc3NoZC1sb2ctd3JhcHBlci5zaCAke1NTSER9ICR7VEVTVF9TU0hfTE9HRklMRX0gLWkgLWYgJE9CSi9zc2hkX3Byb3h5CispID4gJE9CSi9zc2hfcHJveHkKKworIyBjaGVjayBwcm94eSBjb25maWcKKyR7U1NIRH0gLXQgLWYgJE9CSi9zc2hkX3Byb3h5CXx8IGZhdGFsICJzc2hkX3Byb3h5IGJyb2tlbiIKKworc3RhcnRfc3NoZCAoKQoreworCSMgc3RhcnQgc3NoZAorCSRTVURPICR7U1NIRH0gLWYgJE9CSi9zc2hkX2NvbmZpZyAiJEAiIC10IHx8IGZhdGFsICJzc2hkX2NvbmZpZyBicm9rZW4iCisJJFNVRE8gJHtTU0hEfSAtZiAkT0JKL3NzaGRfY29uZmlnIC1lICIkQCIgPj4kVEVTVF9TU0hfTE9HRklMRSAyPiYxCisKKwl0cmFjZSAid2FpdCBmb3Igc3NoZCIKKwlpPTA7CisJd2hpbGUgWyAhIC1mICRQSURGSUxFIC1hICRpIC1sdCAxMCBdOyBkbworCQlpPWBleHByICRpICsgMWAKKwkJc2xlZXAgJGkKKwlkb25lCisKKwl0ZXN0IC1mICRQSURGSUxFIHx8IGZhdGFsICJubyBzc2hkIHJ1bm5pbmcgb24gcG9ydCAkUE9SVCIKK30KKworIyBzb3VyY2UgdGVzdCBib2R5CisuICRTQ1JJUFQKKworIyBraWxsIHNzaGQKK2NsZWFudXAKK2lmIFsgJFJFU1VMVCAtZXEgMCBdOyB0aGVuCisJdmVyYm9zZSBvayAkdGlkCitlbHNlCisJZWNobyBmYWlsZWQgJHRpZAorZmkKK2V4aXQgJFJFU1VMVApkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3RyYW5zZmVyLnNoIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3RyYW5zZmVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZWEzNjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JlZ3Jlc3MvdHJhbnNmZXIuc2gKQEAgLTAsMCArMSwyOSBAQAorIwkkT3BlbkJTRDogdHJhbnNmZXIuc2gsdiAxLjEgMjAwMi8wMy8yNyAwMDowMzozNyBtYXJrdXMgRXhwICQKKyMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgorCit0aWQ9InRyYW5zZmVyIGRhdGEiCisKK0RBVEE9L2Jpbi9scyR7RVhFRVhUfQorQ09QWT0ke09CSn0vY29weQorCitmb3IgcCBpbiAxIDI7IGRvCisJdmVyYm9zZSAiJHRpZDogcHJvdG8gJHAiCisJcm0gLWYgJHtDT1BZfQorCSR7U1NIfSAtbiAtcSAtJHAgLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgY2F0ICR7REFUQX0gPiAke0NPUFl9CisJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJCWZhaWwgInNzaCBjYXQgJERBVEEgZmFpbGVkIgorCWZpCisJY21wICR7REFUQX0gJHtDT1BZfQkJfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkiCisKKwlmb3IgcyBpbiAxMCAxMDAgMWsgMzJrIDY0ayAxMjhrIDI1Nms7IGRvCisJCXRyYWNlICJwcm90byAkcCBkZC1zaXplICR7c30iCisJCXJtIC1mICR7Q09QWX0KKwkJZGQgaWY9JERBVEEgb2JzPSR7c30gMj4gL2Rldi9udWxsIHwgXAorCQkJJHtTU0h9IC1xIC0kcCAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCAiY2F0ID4gJHtDT1BZfSIKKwkJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJCQlmYWlsICJzc2ggY2F0ICREQVRBIGZhaWxlZCIKKwkJZmkKKwkJY21wICREQVRBICR7Q09QWX0JCXx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IgorCWRvbmUKK2RvbmUKK3JtIC1mICR7Q09QWX0KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy90cnktY2lwaGVycy5zaCBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy90cnktY2lwaGVycy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTE4ZDIyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3RyeS1jaXBoZXJzLnNoCkBAIC0wLDAgKzEsNTEgQEAKKyMJJE9wZW5CU0Q6IHRyeS1jaXBoZXJzLnNoLHYgMS4xMiAyMDExLzA4LzAyIDAxOjIzOjQxIGRqbSBFeHAgJAorIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCisKK3RpZD0idHJ5IGNpcGhlcnMiCisKK2NpcGhlcnM9ImFlczEyOC1jYmMgM2Rlcy1jYmMgYmxvd2Zpc2gtY2JjIGNhc3QxMjgtY2JjIAorCWFyY2ZvdXIxMjggYXJjZm91cjI1NiBhcmNmb3VyIAorCWFlczE5Mi1jYmMgYWVzMjU2LWNiYyByaWpuZGFlbC1jYmNAbHlzYXRvci5saXUuc2UKKwlhZXMxMjgtY3RyIGFlczE5Mi1jdHIgYWVzMjU2LWN0ciIKK21hY3M9ImhtYWMtc2hhMSBobWFjLW1kNSB1bWFjLTY0QG9wZW5zc2guY29tIGhtYWMtc2hhMS05NiBobWFjLW1kNS05NiIKK2NvbmZpZ19kZWZpbmVkIEhBVkVfRVZQX1NIQTI1NiAmJgorICAgIG1hY3M9IiRtYWNzIGhtYWMtc2hhMi0yNTYgaG1hYy1zaGEyLTI1Ni05NiBobWFjLXNoYTItNTEyIGhtYWMtc2hhMi01MTItOTYiCisKK2ZvciBjIGluICRjaXBoZXJzOyBkbworCWZvciBtIGluICRtYWNzOyBkbworCQl0cmFjZSAicHJvdG8gMiBjaXBoZXIgJGMgbWFjICRtIgorCQl2ZXJib3NlICJ0ZXN0ICR0aWQ6IHByb3RvIDIgY2lwaGVyICRjIG1hYyAkbSIKKwkJJHtTU0h9IC1GICRPQkovc3NoX3Byb3h5IC0yIC1tICRtIC1jICRjIHNvbWVob3N0IHRydWUKKwkJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJCQlmYWlsICJzc2ggLTIgZmFpbGVkIHdpdGggbWFjICRtIGNpcGhlciAkYyIKKwkJZmkKKwlkb25lCitkb25lCisKK2NpcGhlcnM9IjNkZXMgYmxvd2Zpc2giCitmb3IgYyBpbiAkY2lwaGVyczsgZG8KKwl0cmFjZSAicHJvdG8gMSBjaXBoZXIgJGMiCisJdmVyYm9zZSAidGVzdCAkdGlkOiBwcm90byAxIGNpcGhlciAkYyIKKwkke1NTSH0gLUYgJE9CSi9zc2hfcHJveHkgLTEgLWMgJGMgc29tZWhvc3QgdHJ1ZQorCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCQlmYWlsICJzc2ggLTEgZmFpbGVkIHdpdGggY2lwaGVyICRjIgorCWZpCitkb25lCisKK2lmICR7U1NIfSAtb0NpcGhlcnM9YWNzc0BvcGVuc3NoLm9yZyAyPiYxIHwgZ3JlcCAiQmFkIFNTSDIgY2lwaGVyIiA+L2Rldi9udWxsCit0aGVuCisJOgorZWxzZQorCitlY2hvICJDaXBoZXJzIGFjc3NAb3BlbnNzaC5vcmciID4+ICRPQkovc3NoZF9wcm94eQorYz1hY3NzQG9wZW5zc2gub3JnCitmb3IgbSBpbiAkbWFjczsgZG8KKwl0cmFjZSAicHJvdG8gMiAkYyBtYWMgJG0iCisJdmVyYm9zZSAidGVzdCAkdGlkOiBwcm90byAyIGNpcGhlciAkYyBtYWMgJG0iCisJJHtTU0h9IC1GICRPQkovc3NoX3Byb3h5IC0yIC1tICRtIC1jICRjIHNvbWVob3N0IHRydWUKKwlpZiBbICQ/IC1uZSAwIF07IHRoZW4KKwkJZmFpbCAic3NoIC0yIGZhaWxlZCB3aXRoIG1hYyAkbSBjaXBoZXIgJGMiCisJZmkKK2RvbmUKKworZmkKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmVncmVzcy95ZXMtaGVhZC5zaCBiL29wZW5zc2gtNi4wcDEvcmVncmVzcy95ZXMtaGVhZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGU2YmM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yZWdyZXNzL3llcy1oZWFkLnNoCkBAIC0wLDAgKzEsMTUgQEAKKyMJJE9wZW5CU0Q6IHllcy1oZWFkLnNoLHYgMS40IDIwMDIvMDMvMTUgMTM6MDg6NTYgbWFya3VzIEV4cCAkCisjCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KKwordGlkPSJ5ZXMgcGlwZSBoZWFkIgorCitmb3IgcCBpbiAxIDI7IGRvCisJbGluZXM9YCR7U1NIfSAtJHAgLUYgJE9CSi9zc2hfcHJveHkgdGhpc2hvc3QgJ3NoIC1jICJ3aGlsZSB0cnVlO2RvIGVjaG8geWVzO2RvbmUgfCBfUE9TSVgyX1ZFUlNJT049MTk5MjA5IGhlYWQgLTIwMDAiJyB8IChzbGVlcCAzIDsgd2MgLWwpYAorCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCQlmYWlsICJ5ZXN8aGVhZCB0ZXN0IGZhaWxlZCIKKwkJbGluZXMgPSAwOworCWZpCisJaWYgWyAkbGluZXMgLW5lIDIwMDAgXTsgdGhlbgorCQlmYWlsICJ5ZXN8aGVhZCByZXR1cm5zICRsaW5lcyBsaW5lcyBpbnN0ZWFkIG9mIDIwMDAiCisJZmkKK2RvbmUKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmlqbmRhZWwuYyBiL29wZW5zc2gtNi4wcDEvcmlqbmRhZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDMyZWEyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yaWpuZGFlbC5jCkBAIC0wLDAgKzEsMTI0NCBAQAorLyoJJE9wZW5CU0Q6IHJpam5kYWVsLmMsdiAxLjE2IDIwMDQvMDYvMjMgMDA6Mzk6MzggbW91cmluZyBFeHAgJCAqLworCisvKioKKyAqIHJpam5kYWVsLWFsZy1mc3QuYworICoKKyAqIEB2ZXJzaW9uIDMuMCAoRGVjZW1iZXIgMjAwMCkKKyAqCisgKiBPcHRpbWlzZWQgQU5TSSBDIGNvZGUgZm9yIHRoZSBSaWpuZGFlbCBjaXBoZXIgKG5vdyBBRVMpCisgKgorICogQGF1dGhvciBWaW5jZW50IFJpam1lbiA8dmluY2VudC5yaWptZW5AZXNhdC5rdWxldXZlbi5hYy5iZT4KKyAqIEBhdXRob3IgQW50b29uIEJvc3NlbGFlcnMgPGFudG9vbi5ib3NzZWxhZXJzQGVzYXQua3VsZXV2ZW4uYWMuYmU+CisgKiBAYXV0aG9yIFBhdWxvIEJhcnJldG8gPHBhdWxvLmJhcnJldG9AdGVycmEuY29tLmJyPgorICoKKyAqIFRoaXMgY29kZSBpcyBoZXJlYnkgcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9tYWluLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUlMgJydBUyBJUycnIEFORCBBTlkgRVhQUkVTUworICogT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsCisgKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAicmlqbmRhZWwuaCIKKworI2RlZmluZSBGVUxMX1VOUk9MTAorCisvKgorVGUwW3hdID0gUyBbeF0uWzAyLCAwMSwgMDEsIDAzXTsKK1RlMVt4XSA9IFMgW3hdLlswMywgMDIsIDAxLCAwMV07CitUZTJbeF0gPSBTIFt4XS5bMDEsIDAzLCAwMiwgMDFdOworVGUzW3hdID0gUyBbeF0uWzAxLCAwMSwgMDMsIDAyXTsKK1RlNFt4XSA9IFMgW3hdLlswMSwgMDEsIDAxLCAwMV07CisKK1RkMFt4XSA9IFNpW3hdLlswZSwgMDksIDBkLCAwYl07CitUZDFbeF0gPSBTaVt4XS5bMGIsIDBlLCAwOSwgMGRdOworVGQyW3hdID0gU2lbeF0uWzBkLCAwYiwgMGUsIDA5XTsKK1RkM1t4XSA9IFNpW3hdLlswOSwgMGQsIDBiLCAwZV07CitUZDRbeF0gPSBTaVt4XS5bMDEsIDAxLCAwMSwgMDFdOworKi8KKworc3RhdGljIGNvbnN0IHUzMiBUZTBbMjU2XSA9IHsKKyAgICAweGM2NjM2M2E1VSwgMHhmODdjN2M4NFUsIDB4ZWU3Nzc3OTlVLCAweGY2N2I3YjhkVSwKKyAgICAweGZmZjJmMjBkVSwgMHhkNjZiNmJiZFUsIDB4ZGU2ZjZmYjFVLCAweDkxYzVjNTU0VSwKKyAgICAweDYwMzAzMDUwVSwgMHgwMjAxMDEwM1UsIDB4Y2U2NzY3YTlVLCAweDU2MmIyYjdkVSwKKyAgICAweGU3ZmVmZTE5VSwgMHhiNWQ3ZDc2MlUsIDB4NGRhYmFiZTZVLCAweGVjNzY3NjlhVSwKKyAgICAweDhmY2FjYTQ1VSwgMHgxZjgyODI5ZFUsIDB4ODljOWM5NDBVLCAweGZhN2Q3ZDg3VSwKKyAgICAweGVmZmFmYTE1VSwgMHhiMjU5NTllYlUsIDB4OGU0NzQ3YzlVLCAweGZiZjBmMDBiVSwKKyAgICAweDQxYWRhZGVjVSwgMHhiM2Q0ZDQ2N1UsIDB4NWZhMmEyZmRVLCAweDQ1YWZhZmVhVSwKKyAgICAweDIzOWM5Y2JmVSwgMHg1M2E0YTRmN1UsIDB4ZTQ3MjcyOTZVLCAweDliYzBjMDViVSwKKyAgICAweDc1YjdiN2MyVSwgMHhlMWZkZmQxY1UsIDB4M2Q5MzkzYWVVLCAweDRjMjYyNjZhVSwKKyAgICAweDZjMzYzNjVhVSwgMHg3ZTNmM2Y0MVUsIDB4ZjVmN2Y3MDJVLCAweDgzY2NjYzRmVSwKKyAgICAweDY4MzQzNDVjVSwgMHg1MWE1YTVmNFUsIDB4ZDFlNWU1MzRVLCAweGY5ZjFmMTA4VSwKKyAgICAweGUyNzE3MTkzVSwgMHhhYmQ4ZDg3M1UsIDB4NjIzMTMxNTNVLCAweDJhMTUxNTNmVSwKKyAgICAweDA4MDQwNDBjVSwgMHg5NWM3Yzc1MlUsIDB4NDYyMzIzNjVVLCAweDlkYzNjMzVlVSwKKyAgICAweDMwMTgxODI4VSwgMHgzNzk2OTZhMVUsIDB4MGEwNTA1MGZVLCAweDJmOWE5YWI1VSwKKyAgICAweDBlMDcwNzA5VSwgMHgyNDEyMTIzNlUsIDB4MWI4MDgwOWJVLCAweGRmZTJlMjNkVSwKKyAgICAweGNkZWJlYjI2VSwgMHg0ZTI3Mjc2OVUsIDB4N2ZiMmIyY2RVLCAweGVhNzU3NTlmVSwKKyAgICAweDEyMDkwOTFiVSwgMHgxZDgzODM5ZVUsIDB4NTgyYzJjNzRVLCAweDM0MWExYTJlVSwKKyAgICAweDM2MWIxYjJkVSwgMHhkYzZlNmViMlUsIDB4YjQ1YTVhZWVVLCAweDViYTBhMGZiVSwKKyAgICAweGE0NTI1MmY2VSwgMHg3NjNiM2I0ZFUsIDB4YjdkNmQ2NjFVLCAweDdkYjNiM2NlVSwKKyAgICAweDUyMjkyOTdiVSwgMHhkZGUzZTMzZVUsIDB4NWUyZjJmNzFVLCAweDEzODQ4NDk3VSwKKyAgICAweGE2NTM1M2Y1VSwgMHhiOWQxZDE2OFUsIDB4MDAwMDAwMDBVLCAweGMxZWRlZDJjVSwKKyAgICAweDQwMjAyMDYwVSwgMHhlM2ZjZmMxZlUsIDB4NzliMWIxYzhVLCAweGI2NWI1YmVkVSwKKyAgICAweGQ0NmE2YWJlVSwgMHg4ZGNiY2I0NlUsIDB4NjdiZWJlZDlVLCAweDcyMzkzOTRiVSwKKyAgICAweDk0NGE0YWRlVSwgMHg5ODRjNGNkNFUsIDB4YjA1ODU4ZThVLCAweDg1Y2ZjZjRhVSwKKyAgICAweGJiZDBkMDZiVSwgMHhjNWVmZWYyYVUsIDB4NGZhYWFhZTVVLCAweGVkZmJmYjE2VSwKKyAgICAweDg2NDM0M2M1VSwgMHg5YTRkNGRkN1UsIDB4NjYzMzMzNTVVLCAweDExODU4NTk0VSwKKyAgICAweDhhNDU0NWNmVSwgMHhlOWY5ZjkxMFUsIDB4MDQwMjAyMDZVLCAweGZlN2Y3ZjgxVSwKKyAgICAweGEwNTA1MGYwVSwgMHg3ODNjM2M0NFUsIDB4MjU5ZjlmYmFVLCAweDRiYThhOGUzVSwKKyAgICAweGEyNTE1MWYzVSwgMHg1ZGEzYTNmZVUsIDB4ODA0MDQwYzBVLCAweDA1OGY4ZjhhVSwKKyAgICAweDNmOTI5MmFkVSwgMHgyMTlkOWRiY1UsIDB4NzAzODM4NDhVLCAweGYxZjVmNTA0VSwKKyAgICAweDYzYmNiY2RmVSwgMHg3N2I2YjZjMVUsIDB4YWZkYWRhNzVVLCAweDQyMjEyMTYzVSwKKyAgICAweDIwMTAxMDMwVSwgMHhlNWZmZmYxYVUsIDB4ZmRmM2YzMGVVLCAweGJmZDJkMjZkVSwKKyAgICAweDgxY2RjZDRjVSwgMHgxODBjMGMxNFUsIDB4MjYxMzEzMzVVLCAweGMzZWNlYzJmVSwKKyAgICAweGJlNWY1ZmUxVSwgMHgzNTk3OTdhMlUsIDB4ODg0NDQ0Y2NVLCAweDJlMTcxNzM5VSwKKyAgICAweDkzYzRjNDU3VSwgMHg1NWE3YTdmMlUsIDB4ZmM3ZTdlODJVLCAweDdhM2QzZDQ3VSwKKyAgICAweGM4NjQ2NGFjVSwgMHhiYTVkNWRlN1UsIDB4MzIxOTE5MmJVLCAweGU2NzM3Mzk1VSwKKyAgICAweGMwNjA2MGEwVSwgMHgxOTgxODE5OFUsIDB4OWU0ZjRmZDFVLCAweGEzZGNkYzdmVSwKKyAgICAweDQ0MjIyMjY2VSwgMHg1NDJhMmE3ZVUsIDB4M2I5MDkwYWJVLCAweDBiODg4ODgzVSwKKyAgICAweDhjNDY0NmNhVSwgMHhjN2VlZWUyOVUsIDB4NmJiOGI4ZDNVLCAweDI4MTQxNDNjVSwKKyAgICAweGE3ZGVkZTc5VSwgMHhiYzVlNWVlMlUsIDB4MTYwYjBiMWRVLCAweGFkZGJkYjc2VSwKKyAgICAweGRiZTBlMDNiVSwgMHg2NDMyMzI1NlUsIDB4NzQzYTNhNGVVLCAweDE0MGEwYTFlVSwKKyAgICAweDkyNDk0OWRiVSwgMHgwYzA2MDYwYVUsIDB4NDgyNDI0NmNVLCAweGI4NWM1Y2U0VSwKKyAgICAweDlmYzJjMjVkVSwgMHhiZGQzZDM2ZVUsIDB4NDNhY2FjZWZVLCAweGM0NjI2MmE2VSwKKyAgICAweDM5OTE5MWE4VSwgMHgzMTk1OTVhNFUsIDB4ZDNlNGU0MzdVLCAweGYyNzk3OThiVSwKKyAgICAweGQ1ZTdlNzMyVSwgMHg4YmM4Yzg0M1UsIDB4NmUzNzM3NTlVLCAweGRhNmQ2ZGI3VSwKKyAgICAweDAxOGQ4ZDhjVSwgMHhiMWQ1ZDU2NFUsIDB4OWM0ZTRlZDJVLCAweDQ5YTlhOWUwVSwKKyAgICAweGQ4NmM2Y2I0VSwgMHhhYzU2NTZmYVUsIDB4ZjNmNGY0MDdVLCAweGNmZWFlYTI1VSwKKyAgICAweGNhNjU2NWFmVSwgMHhmNDdhN2E4ZVUsIDB4NDdhZWFlZTlVLCAweDEwMDgwODE4VSwKKyAgICAweDZmYmFiYWQ1VSwgMHhmMDc4Nzg4OFUsIDB4NGEyNTI1NmZVLCAweDVjMmUyZTcyVSwKKyAgICAweDM4MWMxYzI0VSwgMHg1N2E2YTZmMVUsIDB4NzNiNGI0YzdVLCAweDk3YzZjNjUxVSwKKyAgICAweGNiZThlODIzVSwgMHhhMWRkZGQ3Y1UsIDB4ZTg3NDc0OWNVLCAweDNlMWYxZjIxVSwKKyAgICAweDk2NGI0YmRkVSwgMHg2MWJkYmRkY1UsIDB4MGQ4YjhiODZVLCAweDBmOGE4YTg1VSwKKyAgICAweGUwNzA3MDkwVSwgMHg3YzNlM2U0MlUsIDB4NzFiNWI1YzRVLCAweGNjNjY2NmFhVSwKKyAgICAweDkwNDg0OGQ4VSwgMHgwNjAzMDMwNVUsIDB4ZjdmNmY2MDFVLCAweDFjMGUwZTEyVSwKKyAgICAweGMyNjE2MWEzVSwgMHg2YTM1MzU1ZlUsIDB4YWU1NzU3ZjlVLCAweDY5YjliOWQwVSwKKyAgICAweDE3ODY4NjkxVSwgMHg5OWMxYzE1OFUsIDB4M2ExZDFkMjdVLCAweDI3OWU5ZWI5VSwKKyAgICAweGQ5ZTFlMTM4VSwgMHhlYmY4ZjgxM1UsIDB4MmI5ODk4YjNVLCAweDIyMTExMTMzVSwKKyAgICAweGQyNjk2OWJiVSwgMHhhOWQ5ZDk3MFUsIDB4MDc4ZThlODlVLCAweDMzOTQ5NGE3VSwKKyAgICAweDJkOWI5YmI2VSwgMHgzYzFlMWUyMlUsIDB4MTU4Nzg3OTJVLCAweGM5ZTllOTIwVSwKKyAgICAweDg3Y2VjZTQ5VSwgMHhhYTU1NTVmZlUsIDB4NTAyODI4NzhVLCAweGE1ZGZkZjdhVSwKKyAgICAweDAzOGM4YzhmVSwgMHg1OWExYTFmOFUsIDB4MDk4OTg5ODBVLCAweDFhMGQwZDE3VSwKKyAgICAweDY1YmZiZmRhVSwgMHhkN2U2ZTYzMVUsIDB4ODQ0MjQyYzZVLCAweGQwNjg2OGI4VSwKKyAgICAweDgyNDE0MWMzVSwgMHgyOTk5OTliMFUsIDB4NWEyZDJkNzdVLCAweDFlMGYwZjExVSwKKyAgICAweDdiYjBiMGNiVSwgMHhhODU0NTRmY1UsIDB4NmRiYmJiZDZVLCAweDJjMTYxNjNhVSwKK307CitzdGF0aWMgY29uc3QgdTMyIFRlMVsyNTZdID0geworICAgIDB4YTVjNjYzNjNVLCAweDg0Zjg3YzdjVSwgMHg5OWVlNzc3N1UsIDB4OGRmNjdiN2JVLAorICAgIDB4MGRmZmYyZjJVLCAweGJkZDY2YjZiVSwgMHhiMWRlNmY2ZlUsIDB4NTQ5MWM1YzVVLAorICAgIDB4NTA2MDMwMzBVLCAweDAzMDIwMTAxVSwgMHhhOWNlNjc2N1UsIDB4N2Q1NjJiMmJVLAorICAgIDB4MTllN2ZlZmVVLCAweDYyYjVkN2Q3VSwgMHhlNjRkYWJhYlUsIDB4OWFlYzc2NzZVLAorICAgIDB4NDU4ZmNhY2FVLCAweDlkMWY4MjgyVSwgMHg0MDg5YzljOVUsIDB4ODdmYTdkN2RVLAorICAgIDB4MTVlZmZhZmFVLCAweGViYjI1OTU5VSwgMHhjOThlNDc0N1UsIDB4MGJmYmYwZjBVLAorICAgIDB4ZWM0MWFkYWRVLCAweDY3YjNkNGQ0VSwgMHhmZDVmYTJhMlUsIDB4ZWE0NWFmYWZVLAorICAgIDB4YmYyMzljOWNVLCAweGY3NTNhNGE0VSwgMHg5NmU0NzI3MlUsIDB4NWI5YmMwYzBVLAorICAgIDB4YzI3NWI3YjdVLCAweDFjZTFmZGZkVSwgMHhhZTNkOTM5M1UsIDB4NmE0YzI2MjZVLAorICAgIDB4NWE2YzM2MzZVLCAweDQxN2UzZjNmVSwgMHgwMmY1ZjdmN1UsIDB4NGY4M2NjY2NVLAorICAgIDB4NWM2ODM0MzRVLCAweGY0NTFhNWE1VSwgMHgzNGQxZTVlNVUsIDB4MDhmOWYxZjFVLAorICAgIDB4OTNlMjcxNzFVLCAweDczYWJkOGQ4VSwgMHg1MzYyMzEzMVUsIDB4M2YyYTE1MTVVLAorICAgIDB4MGMwODA0MDRVLCAweDUyOTVjN2M3VSwgMHg2NTQ2MjMyM1UsIDB4NWU5ZGMzYzNVLAorICAgIDB4MjgzMDE4MThVLCAweGExMzc5Njk2VSwgMHgwZjBhMDUwNVUsIDB4YjUyZjlhOWFVLAorICAgIDB4MDkwZTA3MDdVLCAweDM2MjQxMjEyVSwgMHg5YjFiODA4MFUsIDB4M2RkZmUyZTJVLAorICAgIDB4MjZjZGViZWJVLCAweDY5NGUyNzI3VSwgMHhjZDdmYjJiMlUsIDB4OWZlYTc1NzVVLAorICAgIDB4MWIxMjA5MDlVLCAweDllMWQ4MzgzVSwgMHg3NDU4MmMyY1UsIDB4MmUzNDFhMWFVLAorICAgIDB4MmQzNjFiMWJVLCAweGIyZGM2ZTZlVSwgMHhlZWI0NWE1YVUsIDB4ZmI1YmEwYTBVLAorICAgIDB4ZjZhNDUyNTJVLCAweDRkNzYzYjNiVSwgMHg2MWI3ZDZkNlUsIDB4Y2U3ZGIzYjNVLAorICAgIDB4N2I1MjI5MjlVLCAweDNlZGRlM2UzVSwgMHg3MTVlMmYyZlUsIDB4OTcxMzg0ODRVLAorICAgIDB4ZjVhNjUzNTNVLCAweDY4YjlkMWQxVSwgMHgwMDAwMDAwMFUsIDB4MmNjMWVkZWRVLAorICAgIDB4NjA0MDIwMjBVLCAweDFmZTNmY2ZjVSwgMHhjODc5YjFiMVUsIDB4ZWRiNjViNWJVLAorICAgIDB4YmVkNDZhNmFVLCAweDQ2OGRjYmNiVSwgMHhkOTY3YmViZVUsIDB4NGI3MjM5MzlVLAorICAgIDB4ZGU5NDRhNGFVLCAweGQ0OTg0YzRjVSwgMHhlOGIwNTg1OFUsIDB4NGE4NWNmY2ZVLAorICAgIDB4NmJiYmQwZDBVLCAweDJhYzVlZmVmVSwgMHhlNTRmYWFhYVUsIDB4MTZlZGZiZmJVLAorICAgIDB4YzU4NjQzNDNVLCAweGQ3OWE0ZDRkVSwgMHg1NTY2MzMzM1UsIDB4OTQxMTg1ODVVLAorICAgIDB4Y2Y4YTQ1NDVVLCAweDEwZTlmOWY5VSwgMHgwNjA0MDIwMlUsIDB4ODFmZTdmN2ZVLAorICAgIDB4ZjBhMDUwNTBVLCAweDQ0NzgzYzNjVSwgMHhiYTI1OWY5ZlUsIDB4ZTM0YmE4YThVLAorICAgIDB4ZjNhMjUxNTFVLCAweGZlNWRhM2EzVSwgMHhjMDgwNDA0MFUsIDB4OGEwNThmOGZVLAorICAgIDB4YWQzZjkyOTJVLCAweGJjMjE5ZDlkVSwgMHg0ODcwMzgzOFUsIDB4MDRmMWY1ZjVVLAorICAgIDB4ZGY2M2JjYmNVLCAweGMxNzdiNmI2VSwgMHg3NWFmZGFkYVUsIDB4NjM0MjIxMjFVLAorICAgIDB4MzAyMDEwMTBVLCAweDFhZTVmZmZmVSwgMHgwZWZkZjNmM1UsIDB4NmRiZmQyZDJVLAorICAgIDB4NGM4MWNkY2RVLCAweDE0MTgwYzBjVSwgMHgzNTI2MTMxM1UsIDB4MmZjM2VjZWNVLAorICAgIDB4ZTFiZTVmNWZVLCAweGEyMzU5Nzk3VSwgMHhjYzg4NDQ0NFUsIDB4MzkyZTE3MTdVLAorICAgIDB4NTc5M2M0YzRVLCAweGYyNTVhN2E3VSwgMHg4MmZjN2U3ZVUsIDB4NDc3YTNkM2RVLAorICAgIDB4YWNjODY0NjRVLCAweGU3YmE1ZDVkVSwgMHgyYjMyMTkxOVUsIDB4OTVlNjczNzNVLAorICAgIDB4YTBjMDYwNjBVLCAweDk4MTk4MTgxVSwgMHhkMTllNGY0ZlUsIDB4N2ZhM2RjZGNVLAorICAgIDB4NjY0NDIyMjJVLCAweDdlNTQyYTJhVSwgMHhhYjNiOTA5MFUsIDB4ODMwYjg4ODhVLAorICAgIDB4Y2E4YzQ2NDZVLCAweDI5YzdlZWVlVSwgMHhkMzZiYjhiOFUsIDB4M2MyODE0MTRVLAorICAgIDB4NzlhN2RlZGVVLCAweGUyYmM1ZTVlVSwgMHgxZDE2MGIwYlUsIDB4NzZhZGRiZGJVLAorICAgIDB4M2JkYmUwZTBVLCAweDU2NjQzMjMyVSwgMHg0ZTc0M2EzYVUsIDB4MWUxNDBhMGFVLAorICAgIDB4ZGI5MjQ5NDlVLCAweDBhMGMwNjA2VSwgMHg2YzQ4MjQyNFUsIDB4ZTRiODVjNWNVLAorICAgIDB4NWQ5ZmMyYzJVLCAweDZlYmRkM2QzVSwgMHhlZjQzYWNhY1UsIDB4YTZjNDYyNjJVLAorICAgIDB4YTgzOTkxOTFVLCAweGE0MzE5NTk1VSwgMHgzN2QzZTRlNFUsIDB4OGJmMjc5NzlVLAorICAgIDB4MzJkNWU3ZTdVLCAweDQzOGJjOGM4VSwgMHg1OTZlMzczN1UsIDB4YjdkYTZkNmRVLAorICAgIDB4OGMwMThkOGRVLCAweDY0YjFkNWQ1VSwgMHhkMjljNGU0ZVUsIDB4ZTA0OWE5YTlVLAorICAgIDB4YjRkODZjNmNVLCAweGZhYWM1NjU2VSwgMHgwN2YzZjRmNFUsIDB4MjVjZmVhZWFVLAorICAgIDB4YWZjYTY1NjVVLCAweDhlZjQ3YTdhVSwgMHhlOTQ3YWVhZVUsIDB4MTgxMDA4MDhVLAorICAgIDB4ZDU2ZmJhYmFVLCAweDg4ZjA3ODc4VSwgMHg2ZjRhMjUyNVUsIDB4NzI1YzJlMmVVLAorICAgIDB4MjQzODFjMWNVLCAweGYxNTdhNmE2VSwgMHhjNzczYjRiNFUsIDB4NTE5N2M2YzZVLAorICAgIDB4MjNjYmU4ZThVLCAweDdjYTFkZGRkVSwgMHg5Y2U4NzQ3NFUsIDB4MjEzZTFmMWZVLAorICAgIDB4ZGQ5NjRiNGJVLCAweGRjNjFiZGJkVSwgMHg4NjBkOGI4YlUsIDB4ODUwZjhhOGFVLAorICAgIDB4OTBlMDcwNzBVLCAweDQyN2MzZTNlVSwgMHhjNDcxYjViNVUsIDB4YWFjYzY2NjZVLAorICAgIDB4ZDg5MDQ4NDhVLCAweDA1MDYwMzAzVSwgMHgwMWY3ZjZmNlUsIDB4MTIxYzBlMGVVLAorICAgIDB4YTNjMjYxNjFVLCAweDVmNmEzNTM1VSwgMHhmOWFlNTc1N1UsIDB4ZDA2OWI5YjlVLAorICAgIDB4OTExNzg2ODZVLCAweDU4OTljMWMxVSwgMHgyNzNhMWQxZFUsIDB4YjkyNzllOWVVLAorICAgIDB4MzhkOWUxZTFVLCAweDEzZWJmOGY4VSwgMHhiMzJiOTg5OFUsIDB4MzMyMjExMTFVLAorICAgIDB4YmJkMjY5NjlVLCAweDcwYTlkOWQ5VSwgMHg4OTA3OGU4ZVUsIDB4YTczMzk0OTRVLAorICAgIDB4YjYyZDliOWJVLCAweDIyM2MxZTFlVSwgMHg5MjE1ODc4N1UsIDB4MjBjOWU5ZTlVLAorICAgIDB4NDk4N2NlY2VVLCAweGZmYWE1NTU1VSwgMHg3ODUwMjgyOFUsIDB4N2FhNWRmZGZVLAorICAgIDB4OGYwMzhjOGNVLCAweGY4NTlhMWExVSwgMHg4MDA5ODk4OVUsIDB4MTcxYTBkMGRVLAorICAgIDB4ZGE2NWJmYmZVLCAweDMxZDdlNmU2VSwgMHhjNjg0NDI0MlUsIDB4YjhkMDY4NjhVLAorICAgIDB4YzM4MjQxNDFVLCAweGIwMjk5OTk5VSwgMHg3NzVhMmQyZFUsIDB4MTExZTBmMGZVLAorICAgIDB4Y2I3YmIwYjBVLCAweGZjYTg1NDU0VSwgMHhkNjZkYmJiYlUsIDB4M2EyYzE2MTZVLAorfTsKK3N0YXRpYyBjb25zdCB1MzIgVGUyWzI1Nl0gPSB7CisgICAgMHg2M2E1YzY2M1UsIDB4N2M4NGY4N2NVLCAweDc3OTllZTc3VSwgMHg3YjhkZjY3YlUsCisgICAgMHhmMjBkZmZmMlUsIDB4NmJiZGQ2NmJVLCAweDZmYjFkZTZmVSwgMHhjNTU0OTFjNVUsCisgICAgMHgzMDUwNjAzMFUsIDB4MDEwMzAyMDFVLCAweDY3YTljZTY3VSwgMHgyYjdkNTYyYlUsCisgICAgMHhmZTE5ZTdmZVUsIDB4ZDc2MmI1ZDdVLCAweGFiZTY0ZGFiVSwgMHg3NjlhZWM3NlUsCisgICAgMHhjYTQ1OGZjYVUsIDB4ODI5ZDFmODJVLCAweGM5NDA4OWM5VSwgMHg3ZDg3ZmE3ZFUsCisgICAgMHhmYTE1ZWZmYVUsIDB4NTllYmIyNTlVLCAweDQ3Yzk4ZTQ3VSwgMHhmMDBiZmJmMFUsCisgICAgMHhhZGVjNDFhZFUsIDB4ZDQ2N2IzZDRVLCAweGEyZmQ1ZmEyVSwgMHhhZmVhNDVhZlUsCisgICAgMHg5Y2JmMjM5Y1UsIDB4YTRmNzUzYTRVLCAweDcyOTZlNDcyVSwgMHhjMDViOWJjMFUsCisgICAgMHhiN2MyNzViN1UsIDB4ZmQxY2UxZmRVLCAweDkzYWUzZDkzVSwgMHgyNjZhNGMyNlUsCisgICAgMHgzNjVhNmMzNlUsIDB4M2Y0MTdlM2ZVLCAweGY3MDJmNWY3VSwgMHhjYzRmODNjY1UsCisgICAgMHgzNDVjNjgzNFUsIDB4YTVmNDUxYTVVLCAweGU1MzRkMWU1VSwgMHhmMTA4ZjlmMVUsCisgICAgMHg3MTkzZTI3MVUsIDB4ZDg3M2FiZDhVLCAweDMxNTM2MjMxVSwgMHgxNTNmMmExNVUsCisgICAgMHgwNDBjMDgwNFUsIDB4Yzc1Mjk1YzdVLCAweDIzNjU0NjIzVSwgMHhjMzVlOWRjM1UsCisgICAgMHgxODI4MzAxOFUsIDB4OTZhMTM3OTZVLCAweDA1MGYwYTA1VSwgMHg5YWI1MmY5YVUsCisgICAgMHgwNzA5MGUwN1UsIDB4MTIzNjI0MTJVLCAweDgwOWIxYjgwVSwgMHhlMjNkZGZlMlUsCisgICAgMHhlYjI2Y2RlYlUsIDB4Mjc2OTRlMjdVLCAweGIyY2Q3ZmIyVSwgMHg3NTlmZWE3NVUsCisgICAgMHgwOTFiMTIwOVUsIDB4ODM5ZTFkODNVLCAweDJjNzQ1ODJjVSwgMHgxYTJlMzQxYVUsCisgICAgMHgxYjJkMzYxYlUsIDB4NmViMmRjNmVVLCAweDVhZWViNDVhVSwgMHhhMGZiNWJhMFUsCisgICAgMHg1MmY2YTQ1MlUsIDB4M2I0ZDc2M2JVLCAweGQ2NjFiN2Q2VSwgMHhiM2NlN2RiM1UsCisgICAgMHgyOTdiNTIyOVUsIDB4ZTMzZWRkZTNVLCAweDJmNzE1ZTJmVSwgMHg4NDk3MTM4NFUsCisgICAgMHg1M2Y1YTY1M1UsIDB4ZDE2OGI5ZDFVLCAweDAwMDAwMDAwVSwgMHhlZDJjYzFlZFUsCisgICAgMHgyMDYwNDAyMFUsIDB4ZmMxZmUzZmNVLCAweGIxYzg3OWIxVSwgMHg1YmVkYjY1YlUsCisgICAgMHg2YWJlZDQ2YVUsIDB4Y2I0NjhkY2JVLCAweGJlZDk2N2JlVSwgMHgzOTRiNzIzOVUsCisgICAgMHg0YWRlOTQ0YVUsIDB4NGNkNDk4NGNVLCAweDU4ZThiMDU4VSwgMHhjZjRhODVjZlUsCisgICAgMHhkMDZiYmJkMFUsIDB4ZWYyYWM1ZWZVLCAweGFhZTU0ZmFhVSwgMHhmYjE2ZWRmYlUsCisgICAgMHg0M2M1ODY0M1UsIDB4NGRkNzlhNGRVLCAweDMzNTU2NjMzVSwgMHg4NTk0MTE4NVUsCisgICAgMHg0NWNmOGE0NVUsIDB4ZjkxMGU5ZjlVLCAweDAyMDYwNDAyVSwgMHg3ZjgxZmU3ZlUsCisgICAgMHg1MGYwYTA1MFUsIDB4M2M0NDc4M2NVLCAweDlmYmEyNTlmVSwgMHhhOGUzNGJhOFUsCisgICAgMHg1MWYzYTI1MVUsIDB4YTNmZTVkYTNVLCAweDQwYzA4MDQwVSwgMHg4ZjhhMDU4ZlUsCisgICAgMHg5MmFkM2Y5MlUsIDB4OWRiYzIxOWRVLCAweDM4NDg3MDM4VSwgMHhmNTA0ZjFmNVUsCisgICAgMHhiY2RmNjNiY1UsIDB4YjZjMTc3YjZVLCAweGRhNzVhZmRhVSwgMHgyMTYzNDIyMVUsCisgICAgMHgxMDMwMjAxMFUsIDB4ZmYxYWU1ZmZVLCAweGYzMGVmZGYzVSwgMHhkMjZkYmZkMlUsCisgICAgMHhjZDRjODFjZFUsIDB4MGMxNDE4MGNVLCAweDEzMzUyNjEzVSwgMHhlYzJmYzNlY1UsCisgICAgMHg1ZmUxYmU1ZlUsIDB4OTdhMjM1OTdVLCAweDQ0Y2M4ODQ0VSwgMHgxNzM5MmUxN1UsCisgICAgMHhjNDU3OTNjNFUsIDB4YTdmMjU1YTdVLCAweDdlODJmYzdlVSwgMHgzZDQ3N2EzZFUsCisgICAgMHg2NGFjYzg2NFUsIDB4NWRlN2JhNWRVLCAweDE5MmIzMjE5VSwgMHg3Mzk1ZTY3M1UsCisgICAgMHg2MGEwYzA2MFUsIDB4ODE5ODE5ODFVLCAweDRmZDE5ZTRmVSwgMHhkYzdmYTNkY1UsCisgICAgMHgyMjY2NDQyMlUsIDB4MmE3ZTU0MmFVLCAweDkwYWIzYjkwVSwgMHg4ODgzMGI4OFUsCisgICAgMHg0NmNhOGM0NlUsIDB4ZWUyOWM3ZWVVLCAweGI4ZDM2YmI4VSwgMHgxNDNjMjgxNFUsCisgICAgMHhkZTc5YTdkZVUsIDB4NWVlMmJjNWVVLCAweDBiMWQxNjBiVSwgMHhkYjc2YWRkYlUsCisgICAgMHhlMDNiZGJlMFUsIDB4MzI1NjY0MzJVLCAweDNhNGU3NDNhVSwgMHgwYTFlMTQwYVUsCisgICAgMHg0OWRiOTI0OVUsIDB4MDYwYTBjMDZVLCAweDI0NmM0ODI0VSwgMHg1Y2U0Yjg1Y1UsCisgICAgMHhjMjVkOWZjMlUsIDB4ZDM2ZWJkZDNVLCAweGFjZWY0M2FjVSwgMHg2MmE2YzQ2MlUsCisgICAgMHg5MWE4Mzk5MVUsIDB4OTVhNDMxOTVVLCAweGU0MzdkM2U0VSwgMHg3OThiZjI3OVUsCisgICAgMHhlNzMyZDVlN1UsIDB4Yzg0MzhiYzhVLCAweDM3NTk2ZTM3VSwgMHg2ZGI3ZGE2ZFUsCisgICAgMHg4ZDhjMDE4ZFUsIDB4ZDU2NGIxZDVVLCAweDRlZDI5YzRlVSwgMHhhOWUwNDlhOVUsCisgICAgMHg2Y2I0ZDg2Y1UsIDB4NTZmYWFjNTZVLCAweGY0MDdmM2Y0VSwgMHhlYTI1Y2ZlYVUsCisgICAgMHg2NWFmY2E2NVUsIDB4N2E4ZWY0N2FVLCAweGFlZTk0N2FlVSwgMHgwODE4MTAwOFUsCisgICAgMHhiYWQ1NmZiYVUsIDB4Nzg4OGYwNzhVLCAweDI1NmY0YTI1VSwgMHgyZTcyNWMyZVUsCisgICAgMHgxYzI0MzgxY1UsIDB4YTZmMTU3YTZVLCAweGI0Yzc3M2I0VSwgMHhjNjUxOTdjNlUsCisgICAgMHhlODIzY2JlOFUsIDB4ZGQ3Y2ExZGRVLCAweDc0OWNlODc0VSwgMHgxZjIxM2UxZlUsCisgICAgMHg0YmRkOTY0YlUsIDB4YmRkYzYxYmRVLCAweDhiODYwZDhiVSwgMHg4YTg1MGY4YVUsCisgICAgMHg3MDkwZTA3MFUsIDB4M2U0MjdjM2VVLCAweGI1YzQ3MWI1VSwgMHg2NmFhY2M2NlUsCisgICAgMHg0OGQ4OTA0OFUsIDB4MDMwNTA2MDNVLCAweGY2MDFmN2Y2VSwgMHgwZTEyMWMwZVUsCisgICAgMHg2MWEzYzI2MVUsIDB4MzU1ZjZhMzVVLCAweDU3ZjlhZTU3VSwgMHhiOWQwNjliOVUsCisgICAgMHg4NjkxMTc4NlUsIDB4YzE1ODk5YzFVLCAweDFkMjczYTFkVSwgMHg5ZWI5Mjc5ZVUsCisgICAgMHhlMTM4ZDllMVUsIDB4ZjgxM2ViZjhVLCAweDk4YjMyYjk4VSwgMHgxMTMzMjIxMVUsCisgICAgMHg2OWJiZDI2OVUsIDB4ZDk3MGE5ZDlVLCAweDhlODkwNzhlVSwgMHg5NGE3MzM5NFUsCisgICAgMHg5YmI2MmQ5YlUsIDB4MWUyMjNjMWVVLCAweDg3OTIxNTg3VSwgMHhlOTIwYzllOVUsCisgICAgMHhjZTQ5ODdjZVUsIDB4NTVmZmFhNTVVLCAweDI4Nzg1MDI4VSwgMHhkZjdhYTVkZlUsCisgICAgMHg4YzhmMDM4Y1UsIDB4YTFmODU5YTFVLCAweDg5ODAwOTg5VSwgMHgwZDE3MWEwZFUsCisgICAgMHhiZmRhNjViZlUsIDB4ZTYzMWQ3ZTZVLCAweDQyYzY4NDQyVSwgMHg2OGI4ZDA2OFUsCisgICAgMHg0MWMzODI0MVUsIDB4OTliMDI5OTlVLCAweDJkNzc1YTJkVSwgMHgwZjExMWUwZlUsCisgICAgMHhiMGNiN2JiMFUsIDB4NTRmY2E4NTRVLCAweGJiZDY2ZGJiVSwgMHgxNjNhMmMxNlUsCit9Oworc3RhdGljIGNvbnN0IHUzMiBUZTNbMjU2XSA9IHsKKworICAgIDB4NjM2M2E1YzZVLCAweDdjN2M4NGY4VSwgMHg3Nzc3OTllZVUsIDB4N2I3YjhkZjZVLAorICAgIDB4ZjJmMjBkZmZVLCAweDZiNmJiZGQ2VSwgMHg2ZjZmYjFkZVUsIDB4YzVjNTU0OTFVLAorICAgIDB4MzAzMDUwNjBVLCAweDAxMDEwMzAyVSwgMHg2NzY3YTljZVUsIDB4MmIyYjdkNTZVLAorICAgIDB4ZmVmZTE5ZTdVLCAweGQ3ZDc2MmI1VSwgMHhhYmFiZTY0ZFUsIDB4NzY3NjlhZWNVLAorICAgIDB4Y2FjYTQ1OGZVLCAweDgyODI5ZDFmVSwgMHhjOWM5NDA4OVUsIDB4N2Q3ZDg3ZmFVLAorICAgIDB4ZmFmYTE1ZWZVLCAweDU5NTllYmIyVSwgMHg0NzQ3Yzk4ZVUsIDB4ZjBmMDBiZmJVLAorICAgIDB4YWRhZGVjNDFVLCAweGQ0ZDQ2N2IzVSwgMHhhMmEyZmQ1ZlUsIDB4YWZhZmVhNDVVLAorICAgIDB4OWM5Y2JmMjNVLCAweGE0YTRmNzUzVSwgMHg3MjcyOTZlNFUsIDB4YzBjMDViOWJVLAorICAgIDB4YjdiN2MyNzVVLCAweGZkZmQxY2UxVSwgMHg5MzkzYWUzZFUsIDB4MjYyNjZhNGNVLAorICAgIDB4MzYzNjVhNmNVLCAweDNmM2Y0MTdlVSwgMHhmN2Y3MDJmNVUsIDB4Y2NjYzRmODNVLAorICAgIDB4MzQzNDVjNjhVLCAweGE1YTVmNDUxVSwgMHhlNWU1MzRkMVUsIDB4ZjFmMTA4ZjlVLAorICAgIDB4NzE3MTkzZTJVLCAweGQ4ZDg3M2FiVSwgMHgzMTMxNTM2MlUsIDB4MTUxNTNmMmFVLAorICAgIDB4MDQwNDBjMDhVLCAweGM3Yzc1Mjk1VSwgMHgyMzIzNjU0NlUsIDB4YzNjMzVlOWRVLAorICAgIDB4MTgxODI4MzBVLCAweDk2OTZhMTM3VSwgMHgwNTA1MGYwYVUsIDB4OWE5YWI1MmZVLAorICAgIDB4MDcwNzA5MGVVLCAweDEyMTIzNjI0VSwgMHg4MDgwOWIxYlUsIDB4ZTJlMjNkZGZVLAorICAgIDB4ZWJlYjI2Y2RVLCAweDI3Mjc2OTRlVSwgMHhiMmIyY2Q3ZlUsIDB4NzU3NTlmZWFVLAorICAgIDB4MDkwOTFiMTJVLCAweDgzODM5ZTFkVSwgMHgyYzJjNzQ1OFUsIDB4MWExYTJlMzRVLAorICAgIDB4MWIxYjJkMzZVLCAweDZlNmViMmRjVSwgMHg1YTVhZWViNFUsIDB4YTBhMGZiNWJVLAorICAgIDB4NTI1MmY2YTRVLCAweDNiM2I0ZDc2VSwgMHhkNmQ2NjFiN1UsIDB4YjNiM2NlN2RVLAorICAgIDB4MjkyOTdiNTJVLCAweGUzZTMzZWRkVSwgMHgyZjJmNzE1ZVUsIDB4ODQ4NDk3MTNVLAorICAgIDB4NTM1M2Y1YTZVLCAweGQxZDE2OGI5VSwgMHgwMDAwMDAwMFUsIDB4ZWRlZDJjYzFVLAorICAgIDB4MjAyMDYwNDBVLCAweGZjZmMxZmUzVSwgMHhiMWIxYzg3OVUsIDB4NWI1YmVkYjZVLAorICAgIDB4NmE2YWJlZDRVLCAweGNiY2I0NjhkVSwgMHhiZWJlZDk2N1UsIDB4MzkzOTRiNzJVLAorICAgIDB4NGE0YWRlOTRVLCAweDRjNGNkNDk4VSwgMHg1ODU4ZThiMFUsIDB4Y2ZjZjRhODVVLAorICAgIDB4ZDBkMDZiYmJVLCAweGVmZWYyYWM1VSwgMHhhYWFhZTU0ZlUsIDB4ZmJmYjE2ZWRVLAorICAgIDB4NDM0M2M1ODZVLCAweDRkNGRkNzlhVSwgMHgzMzMzNTU2NlUsIDB4ODU4NTk0MTFVLAorICAgIDB4NDU0NWNmOGFVLCAweGY5ZjkxMGU5VSwgMHgwMjAyMDYwNFUsIDB4N2Y3ZjgxZmVVLAorICAgIDB4NTA1MGYwYTBVLCAweDNjM2M0NDc4VSwgMHg5ZjlmYmEyNVUsIDB4YThhOGUzNGJVLAorICAgIDB4NTE1MWYzYTJVLCAweGEzYTNmZTVkVSwgMHg0MDQwYzA4MFUsIDB4OGY4ZjhhMDVVLAorICAgIDB4OTI5MmFkM2ZVLCAweDlkOWRiYzIxVSwgMHgzODM4NDg3MFUsIDB4ZjVmNTA0ZjFVLAorICAgIDB4YmNiY2RmNjNVLCAweGI2YjZjMTc3VSwgMHhkYWRhNzVhZlUsIDB4MjEyMTYzNDJVLAorICAgIDB4MTAxMDMwMjBVLCAweGZmZmYxYWU1VSwgMHhmM2YzMGVmZFUsIDB4ZDJkMjZkYmZVLAorICAgIDB4Y2RjZDRjODFVLCAweDBjMGMxNDE4VSwgMHgxMzEzMzUyNlUsIDB4ZWNlYzJmYzNVLAorICAgIDB4NWY1ZmUxYmVVLCAweDk3OTdhMjM1VSwgMHg0NDQ0Y2M4OFUsIDB4MTcxNzM5MmVVLAorICAgIDB4YzRjNDU3OTNVLCAweGE3YTdmMjU1VSwgMHg3ZTdlODJmY1UsIDB4M2QzZDQ3N2FVLAorICAgIDB4NjQ2NGFjYzhVLCAweDVkNWRlN2JhVSwgMHgxOTE5MmIzMlUsIDB4NzM3Mzk1ZTZVLAorICAgIDB4NjA2MGEwYzBVLCAweDgxODE5ODE5VSwgMHg0ZjRmZDE5ZVUsIDB4ZGNkYzdmYTNVLAorICAgIDB4MjIyMjY2NDRVLCAweDJhMmE3ZTU0VSwgMHg5MDkwYWIzYlUsIDB4ODg4ODgzMGJVLAorICAgIDB4NDY0NmNhOGNVLCAweGVlZWUyOWM3VSwgMHhiOGI4ZDM2YlUsIDB4MTQxNDNjMjhVLAorICAgIDB4ZGVkZTc5YTdVLCAweDVlNWVlMmJjVSwgMHgwYjBiMWQxNlUsIDB4ZGJkYjc2YWRVLAorICAgIDB4ZTBlMDNiZGJVLCAweDMyMzI1NjY0VSwgMHgzYTNhNGU3NFUsIDB4MGEwYTFlMTRVLAorICAgIDB4NDk0OWRiOTJVLCAweDA2MDYwYTBjVSwgMHgyNDI0NmM0OFUsIDB4NWM1Y2U0YjhVLAorICAgIDB4YzJjMjVkOWZVLCAweGQzZDM2ZWJkVSwgMHhhY2FjZWY0M1UsIDB4NjI2MmE2YzRVLAorICAgIDB4OTE5MWE4MzlVLCAweDk1OTVhNDMxVSwgMHhlNGU0MzdkM1UsIDB4Nzk3OThiZjJVLAorICAgIDB4ZTdlNzMyZDVVLCAweGM4Yzg0MzhiVSwgMHgzNzM3NTk2ZVUsIDB4NmQ2ZGI3ZGFVLAorICAgIDB4OGQ4ZDhjMDFVLCAweGQ1ZDU2NGIxVSwgMHg0ZTRlZDI5Y1UsIDB4YTlhOWUwNDlVLAorICAgIDB4NmM2Y2I0ZDhVLCAweDU2NTZmYWFjVSwgMHhmNGY0MDdmM1UsIDB4ZWFlYTI1Y2ZVLAorICAgIDB4NjU2NWFmY2FVLCAweDdhN2E4ZWY0VSwgMHhhZWFlZTk0N1UsIDB4MDgwODE4MTBVLAorICAgIDB4YmFiYWQ1NmZVLCAweDc4Nzg4OGYwVSwgMHgyNTI1NmY0YVUsIDB4MmUyZTcyNWNVLAorICAgIDB4MWMxYzI0MzhVLCAweGE2YTZmMTU3VSwgMHhiNGI0Yzc3M1UsIDB4YzZjNjUxOTdVLAorICAgIDB4ZThlODIzY2JVLCAweGRkZGQ3Y2ExVSwgMHg3NDc0OWNlOFUsIDB4MWYxZjIxM2VVLAorICAgIDB4NGI0YmRkOTZVLCAweGJkYmRkYzYxVSwgMHg4YjhiODYwZFUsIDB4OGE4YTg1MGZVLAorICAgIDB4NzA3MDkwZTBVLCAweDNlM2U0MjdjVSwgMHhiNWI1YzQ3MVUsIDB4NjY2NmFhY2NVLAorICAgIDB4NDg0OGQ4OTBVLCAweDAzMDMwNTA2VSwgMHhmNmY2MDFmN1UsIDB4MGUwZTEyMWNVLAorICAgIDB4NjE2MWEzYzJVLCAweDM1MzU1ZjZhVSwgMHg1NzU3ZjlhZVUsIDB4YjliOWQwNjlVLAorICAgIDB4ODY4NjkxMTdVLCAweGMxYzE1ODk5VSwgMHgxZDFkMjczYVUsIDB4OWU5ZWI5MjdVLAorICAgIDB4ZTFlMTM4ZDlVLCAweGY4ZjgxM2ViVSwgMHg5ODk4YjMyYlUsIDB4MTExMTMzMjJVLAorICAgIDB4Njk2OWJiZDJVLCAweGQ5ZDk3MGE5VSwgMHg4ZThlODkwN1UsIDB4OTQ5NGE3MzNVLAorICAgIDB4OWI5YmI2MmRVLCAweDFlMWUyMjNjVSwgMHg4Nzg3OTIxNVUsIDB4ZTllOTIwYzlVLAorICAgIDB4Y2VjZTQ5ODdVLCAweDU1NTVmZmFhVSwgMHgyODI4Nzg1MFUsIDB4ZGZkZjdhYTVVLAorICAgIDB4OGM4YzhmMDNVLCAweGExYTFmODU5VSwgMHg4OTg5ODAwOVUsIDB4MGQwZDE3MWFVLAorICAgIDB4YmZiZmRhNjVVLCAweGU2ZTYzMWQ3VSwgMHg0MjQyYzY4NFUsIDB4Njg2OGI4ZDBVLAorICAgIDB4NDE0MWMzODJVLCAweDk5OTliMDI5VSwgMHgyZDJkNzc1YVUsIDB4MGYwZjExMWVVLAorICAgIDB4YjBiMGNiN2JVLCAweDU0NTRmY2E4VSwgMHhiYmJiZDY2ZFUsIDB4MTYxNjNhMmNVLAorfTsKK3N0YXRpYyBjb25zdCB1MzIgVGU0WzI1Nl0gPSB7CisgICAgMHg2MzYzNjM2M1UsIDB4N2M3YzdjN2NVLCAweDc3Nzc3Nzc3VSwgMHg3YjdiN2I3YlUsCisgICAgMHhmMmYyZjJmMlUsIDB4NmI2YjZiNmJVLCAweDZmNmY2ZjZmVSwgMHhjNWM1YzVjNVUsCisgICAgMHgzMDMwMzAzMFUsIDB4MDEwMTAxMDFVLCAweDY3Njc2NzY3VSwgMHgyYjJiMmIyYlUsCisgICAgMHhmZWZlZmVmZVUsIDB4ZDdkN2Q3ZDdVLCAweGFiYWJhYmFiVSwgMHg3Njc2NzY3NlUsCisgICAgMHhjYWNhY2FjYVUsIDB4ODI4MjgyODJVLCAweGM5YzljOWM5VSwgMHg3ZDdkN2Q3ZFUsCisgICAgMHhmYWZhZmFmYVUsIDB4NTk1OTU5NTlVLCAweDQ3NDc0NzQ3VSwgMHhmMGYwZjBmMFUsCisgICAgMHhhZGFkYWRhZFUsIDB4ZDRkNGQ0ZDRVLCAweGEyYTJhMmEyVSwgMHhhZmFmYWZhZlUsCisgICAgMHg5YzljOWM5Y1UsIDB4YTRhNGE0YTRVLCAweDcyNzI3MjcyVSwgMHhjMGMwYzBjMFUsCisgICAgMHhiN2I3YjdiN1UsIDB4ZmRmZGZkZmRVLCAweDkzOTM5MzkzVSwgMHgyNjI2MjYyNlUsCisgICAgMHgzNjM2MzYzNlUsIDB4M2YzZjNmM2ZVLCAweGY3ZjdmN2Y3VSwgMHhjY2NjY2NjY1UsCisgICAgMHgzNDM0MzQzNFUsIDB4YTVhNWE1YTVVLCAweGU1ZTVlNWU1VSwgMHhmMWYxZjFmMVUsCisgICAgMHg3MTcxNzE3MVUsIDB4ZDhkOGQ4ZDhVLCAweDMxMzEzMTMxVSwgMHgxNTE1MTUxNVUsCisgICAgMHgwNDA0MDQwNFUsIDB4YzdjN2M3YzdVLCAweDIzMjMyMzIzVSwgMHhjM2MzYzNjM1UsCisgICAgMHgxODE4MTgxOFUsIDB4OTY5Njk2OTZVLCAweDA1MDUwNTA1VSwgMHg5YTlhOWE5YVUsCisgICAgMHgwNzA3MDcwN1UsIDB4MTIxMjEyMTJVLCAweDgwODA4MDgwVSwgMHhlMmUyZTJlMlUsCisgICAgMHhlYmViZWJlYlUsIDB4MjcyNzI3MjdVLCAweGIyYjJiMmIyVSwgMHg3NTc1NzU3NVUsCisgICAgMHgwOTA5MDkwOVUsIDB4ODM4MzgzODNVLCAweDJjMmMyYzJjVSwgMHgxYTFhMWExYVUsCisgICAgMHgxYjFiMWIxYlUsIDB4NmU2ZTZlNmVVLCAweDVhNWE1YTVhVSwgMHhhMGEwYTBhMFUsCisgICAgMHg1MjUyNTI1MlUsIDB4M2IzYjNiM2JVLCAweGQ2ZDZkNmQ2VSwgMHhiM2IzYjNiM1UsCisgICAgMHgyOTI5MjkyOVUsIDB4ZTNlM2UzZTNVLCAweDJmMmYyZjJmVSwgMHg4NDg0ODQ4NFUsCisgICAgMHg1MzUzNTM1M1UsIDB4ZDFkMWQxZDFVLCAweDAwMDAwMDAwVSwgMHhlZGVkZWRlZFUsCisgICAgMHgyMDIwMjAyMFUsIDB4ZmNmY2ZjZmNVLCAweGIxYjFiMWIxVSwgMHg1YjViNWI1YlUsCisgICAgMHg2YTZhNmE2YVUsIDB4Y2JjYmNiY2JVLCAweGJlYmViZWJlVSwgMHgzOTM5MzkzOVUsCisgICAgMHg0YTRhNGE0YVUsIDB4NGM0YzRjNGNVLCAweDU4NTg1ODU4VSwgMHhjZmNmY2ZjZlUsCisgICAgMHhkMGQwZDBkMFUsIDB4ZWZlZmVmZWZVLCAweGFhYWFhYWFhVSwgMHhmYmZiZmJmYlUsCisgICAgMHg0MzQzNDM0M1UsIDB4NGQ0ZDRkNGRVLCAweDMzMzMzMzMzVSwgMHg4NTg1ODU4NVUsCisgICAgMHg0NTQ1NDU0NVUsIDB4ZjlmOWY5ZjlVLCAweDAyMDIwMjAyVSwgMHg3ZjdmN2Y3ZlUsCisgICAgMHg1MDUwNTA1MFUsIDB4M2MzYzNjM2NVLCAweDlmOWY5ZjlmVSwgMHhhOGE4YThhOFUsCisgICAgMHg1MTUxNTE1MVUsIDB4YTNhM2EzYTNVLCAweDQwNDA0MDQwVSwgMHg4ZjhmOGY4ZlUsCisgICAgMHg5MjkyOTI5MlUsIDB4OWQ5ZDlkOWRVLCAweDM4MzgzODM4VSwgMHhmNWY1ZjVmNVUsCisgICAgMHhiY2JjYmNiY1UsIDB4YjZiNmI2YjZVLCAweGRhZGFkYWRhVSwgMHgyMTIxMjEyMVUsCisgICAgMHgxMDEwMTAxMFUsIDB4ZmZmZmZmZmZVLCAweGYzZjNmM2YzVSwgMHhkMmQyZDJkMlUsCisgICAgMHhjZGNkY2RjZFUsIDB4MGMwYzBjMGNVLCAweDEzMTMxMzEzVSwgMHhlY2VjZWNlY1UsCisgICAgMHg1ZjVmNWY1ZlUsIDB4OTc5Nzk3OTdVLCAweDQ0NDQ0NDQ0VSwgMHgxNzE3MTcxN1UsCisgICAgMHhjNGM0YzRjNFUsIDB4YTdhN2E3YTdVLCAweDdlN2U3ZTdlVSwgMHgzZDNkM2QzZFUsCisgICAgMHg2NDY0NjQ2NFUsIDB4NWQ1ZDVkNWRVLCAweDE5MTkxOTE5VSwgMHg3MzczNzM3M1UsCisgICAgMHg2MDYwNjA2MFUsIDB4ODE4MTgxODFVLCAweDRmNGY0ZjRmVSwgMHhkY2RjZGNkY1UsCisgICAgMHgyMjIyMjIyMlUsIDB4MmEyYTJhMmFVLCAweDkwOTA5MDkwVSwgMHg4ODg4ODg4OFUsCisgICAgMHg0NjQ2NDY0NlUsIDB4ZWVlZWVlZWVVLCAweGI4YjhiOGI4VSwgMHgxNDE0MTQxNFUsCisgICAgMHhkZWRlZGVkZVUsIDB4NWU1ZTVlNWVVLCAweDBiMGIwYjBiVSwgMHhkYmRiZGJkYlUsCisgICAgMHhlMGUwZTBlMFUsIDB4MzIzMjMyMzJVLCAweDNhM2EzYTNhVSwgMHgwYTBhMGEwYVUsCisgICAgMHg0OTQ5NDk0OVUsIDB4MDYwNjA2MDZVLCAweDI0MjQyNDI0VSwgMHg1YzVjNWM1Y1UsCisgICAgMHhjMmMyYzJjMlUsIDB4ZDNkM2QzZDNVLCAweGFjYWNhY2FjVSwgMHg2MjYyNjI2MlUsCisgICAgMHg5MTkxOTE5MVUsIDB4OTU5NTk1OTVVLCAweGU0ZTRlNGU0VSwgMHg3OTc5Nzk3OVUsCisgICAgMHhlN2U3ZTdlN1UsIDB4YzhjOGM4YzhVLCAweDM3MzczNzM3VSwgMHg2ZDZkNmQ2ZFUsCisgICAgMHg4ZDhkOGQ4ZFUsIDB4ZDVkNWQ1ZDVVLCAweDRlNGU0ZTRlVSwgMHhhOWE5YTlhOVUsCisgICAgMHg2YzZjNmM2Y1UsIDB4NTY1NjU2NTZVLCAweGY0ZjRmNGY0VSwgMHhlYWVhZWFlYVUsCisgICAgMHg2NTY1NjU2NVUsIDB4N2E3YTdhN2FVLCAweGFlYWVhZWFlVSwgMHgwODA4MDgwOFUsCisgICAgMHhiYWJhYmFiYVUsIDB4Nzg3ODc4NzhVLCAweDI1MjUyNTI1VSwgMHgyZTJlMmUyZVUsCisgICAgMHgxYzFjMWMxY1UsIDB4YTZhNmE2YTZVLCAweGI0YjRiNGI0VSwgMHhjNmM2YzZjNlUsCisgICAgMHhlOGU4ZThlOFUsIDB4ZGRkZGRkZGRVLCAweDc0NzQ3NDc0VSwgMHgxZjFmMWYxZlUsCisgICAgMHg0YjRiNGI0YlUsIDB4YmRiZGJkYmRVLCAweDhiOGI4YjhiVSwgMHg4YThhOGE4YVUsCisgICAgMHg3MDcwNzA3MFUsIDB4M2UzZTNlM2VVLCAweGI1YjViNWI1VSwgMHg2NjY2NjY2NlUsCisgICAgMHg0ODQ4NDg0OFUsIDB4MDMwMzAzMDNVLCAweGY2ZjZmNmY2VSwgMHgwZTBlMGUwZVUsCisgICAgMHg2MTYxNjE2MVUsIDB4MzUzNTM1MzVVLCAweDU3NTc1NzU3VSwgMHhiOWI5YjliOVUsCisgICAgMHg4Njg2ODY4NlUsIDB4YzFjMWMxYzFVLCAweDFkMWQxZDFkVSwgMHg5ZTllOWU5ZVUsCisgICAgMHhlMWUxZTFlMVUsIDB4ZjhmOGY4ZjhVLCAweDk4OTg5ODk4VSwgMHgxMTExMTExMVUsCisgICAgMHg2OTY5Njk2OVUsIDB4ZDlkOWQ5ZDlVLCAweDhlOGU4ZThlVSwgMHg5NDk0OTQ5NFUsCisgICAgMHg5YjliOWI5YlUsIDB4MWUxZTFlMWVVLCAweDg3ODc4Nzg3VSwgMHhlOWU5ZTllOVUsCisgICAgMHhjZWNlY2VjZVUsIDB4NTU1NTU1NTVVLCAweDI4MjgyODI4VSwgMHhkZmRmZGZkZlUsCisgICAgMHg4YzhjOGM4Y1UsIDB4YTFhMWExYTFVLCAweDg5ODk4OTg5VSwgMHgwZDBkMGQwZFUsCisgICAgMHhiZmJmYmZiZlUsIDB4ZTZlNmU2ZTZVLCAweDQyNDI0MjQyVSwgMHg2ODY4Njg2OFUsCisgICAgMHg0MTQxNDE0MVUsIDB4OTk5OTk5OTlVLCAweDJkMmQyZDJkVSwgMHgwZjBmMGYwZlUsCisgICAgMHhiMGIwYjBiMFUsIDB4NTQ1NDU0NTRVLCAweGJiYmJiYmJiVSwgMHgxNjE2MTYxNlUsCit9Oworc3RhdGljIGNvbnN0IHUzMiBUZDBbMjU2XSA9IHsKKyAgICAweDUxZjRhNzUwVSwgMHg3ZTQxNjU1M1UsIDB4MWExN2E0YzNVLCAweDNhMjc1ZTk2VSwKKyAgICAweDNiYWI2YmNiVSwgMHgxZjlkNDVmMVUsIDB4YWNmYTU4YWJVLCAweDRiZTMwMzkzVSwKKyAgICAweDIwMzBmYTU1VSwgMHhhZDc2NmRmNlUsIDB4ODhjYzc2OTFVLCAweGY1MDI0YzI1VSwKKyAgICAweDRmZTVkN2ZjVSwgMHhjNTJhY2JkN1UsIDB4MjYzNTQ0ODBVLCAweGI1NjJhMzhmVSwKKyAgICAweGRlYjE1YTQ5VSwgMHgyNWJhMWI2N1UsIDB4NDVlYTBlOThVLCAweDVkZmVjMGUxVSwKKyAgICAweGMzMmY3NTAyVSwgMHg4MTRjZjAxMlUsIDB4OGQ0Njk3YTNVLCAweDZiZDNmOWM2VSwKKyAgICAweDAzOGY1ZmU3VSwgMHgxNTkyOWM5NVUsIDB4YmY2ZDdhZWJVLCAweDk1NTI1OWRhVSwKKyAgICAweGQ0YmU4MzJkVSwgMHg1ODc0MjFkM1UsIDB4NDllMDY5MjlVLCAweDhlYzljODQ0VSwKKyAgICAweDc1YzI4OTZhVSwgMHhmNDhlNzk3OFUsIDB4OTk1ODNlNmJVLCAweDI3Yjk3MWRkVSwKKyAgICAweGJlZTE0ZmI2VSwgMHhmMDg4YWQxN1UsIDB4YzkyMGFjNjZVLCAweDdkY2UzYWI0VSwKKyAgICAweDYzZGY0YTE4VSwgMHhlNTFhMzE4MlUsIDB4OTc1MTMzNjBVLCAweDYyNTM3ZjQ1VSwKKyAgICAweGIxNjQ3N2UwVSwgMHhiYjZiYWU4NFUsIDB4ZmU4MWEwMWNVLCAweGY5MDgyYjk0VSwKKyAgICAweDcwNDg2ODU4VSwgMHg4ZjQ1ZmQxOVUsIDB4OTRkZTZjODdVLCAweDUyN2JmOGI3VSwKKyAgICAweGFiNzNkMzIzVSwgMHg3MjRiMDJlMlUsIDB4ZTMxZjhmNTdVLCAweDY2NTVhYjJhVSwKKyAgICAweGIyZWIyODA3VSwgMHgyZmI1YzIwM1UsIDB4ODZjNTdiOWFVLCAweGQzMzcwOGE1VSwKKyAgICAweDMwMjg4N2YyVSwgMHgyM2JmYTViMlUsIDB4MDIwMzZhYmFVLCAweGVkMTY4MjVjVSwKKyAgICAweDhhY2YxYzJiVSwgMHhhNzc5YjQ5MlUsIDB4ZjMwN2YyZjBVLCAweDRlNjllMmExVSwKKyAgICAweDY1ZGFmNGNkVSwgMHgwNjA1YmVkNVUsIDB4ZDEzNDYyMWZVLCAweGM0YTZmZThhVSwKKyAgICAweDM0MmU1MzlkVSwgMHhhMmYzNTVhMFUsIDB4MDU4YWUxMzJVLCAweGE0ZjZlYjc1VSwKKyAgICAweDBiODNlYzM5VSwgMHg0MDYwZWZhYVUsIDB4NWU3MTlmMDZVLCAweGJkNmUxMDUxVSwKKyAgICAweDNlMjE4YWY5VSwgMHg5NmRkMDYzZFUsIDB4ZGQzZTA1YWVVLCAweDRkZTZiZDQ2VSwKKyAgICAweDkxNTQ4ZGI1VSwgMHg3MWM0NWQwNVUsIDB4MDQwNmQ0NmZVLCAweDYwNTAxNWZmVSwKKyAgICAweDE5OThmYjI0VSwgMHhkNmJkZTk5N1UsIDB4ODk0MDQzY2NVLCAweDY3ZDk5ZTc3VSwKKyAgICAweGIwZTg0MmJkVSwgMHgwNzg5OGI4OFUsIDB4ZTcxOTViMzhVLCAweDc5YzhlZWRiVSwKKyAgICAweGExN2MwYTQ3VSwgMHg3YzQyMGZlOVUsIDB4Zjg4NDFlYzlVLCAweDAwMDAwMDAwVSwKKyAgICAweDA5ODA4NjgzVSwgMHgzMjJiZWQ0OFUsIDB4MWUxMTcwYWNVLCAweDZjNWE3MjRlVSwKKyAgICAweGZkMGVmZmZiVSwgMHgwZjg1Mzg1NlUsIDB4M2RhZWQ1MWVVLCAweDM2MmQzOTI3VSwKKyAgICAweDBhMGZkOTY0VSwgMHg2ODVjYTYyMVUsIDB4OWI1YjU0ZDFVLCAweDI0MzYyZTNhVSwKKyAgICAweDBjMGE2N2IxVSwgMHg5MzU3ZTcwZlUsIDB4YjRlZTk2ZDJVLCAweDFiOWI5MTllVSwKKyAgICAweDgwYzBjNTRmVSwgMHg2MWRjMjBhMlUsIDB4NWE3NzRiNjlVLCAweDFjMTIxYTE2VSwKKyAgICAweGUyOTNiYTBhVSwgMHhjMGEwMmFlNVUsIDB4M2MyMmUwNDNVLCAweDEyMWIxNzFkVSwKKyAgICAweDBlMDkwZDBiVSwgMHhmMjhiYzdhZFUsIDB4MmRiNmE4YjlVLCAweDE0MWVhOWM4VSwKKyAgICAweDU3ZjExOTg1VSwgMHhhZjc1MDc0Y1UsIDB4ZWU5OWRkYmJVLCAweGEzN2Y2MGZkVSwKKyAgICAweGY3MDEyNjlmVSwgMHg1YzcyZjViY1UsIDB4NDQ2NjNiYzVVLCAweDViZmI3ZTM0VSwKKyAgICAweDhiNDMyOTc2VSwgMHhjYjIzYzZkY1UsIDB4YjZlZGZjNjhVLCAweGI4ZTRmMTYzVSwKKyAgICAweGQ3MzFkY2NhVSwgMHg0MjYzODUxMFUsIDB4MTM5NzIyNDBVLCAweDg0YzYxMTIwVSwKKyAgICAweDg1NGEyNDdkVSwgMHhkMmJiM2RmOFUsIDB4YWVmOTMyMTFVLCAweGM3MjlhMTZkVSwKKyAgICAweDFkOWUyZjRiVSwgMHhkY2IyMzBmM1UsIDB4MGQ4NjUyZWNVLCAweDc3YzFlM2QwVSwKKyAgICAweDJiYjMxNjZjVSwgMHhhOTcwYjk5OVUsIDB4MTE5NDQ4ZmFVLCAweDQ3ZTk2NDIyVSwKKyAgICAweGE4ZmM4Y2M0VSwgMHhhMGYwM2YxYVUsIDB4NTY3ZDJjZDhVLCAweDIyMzM5MGVmVSwKKyAgICAweDg3NDk0ZWM3VSwgMHhkOTM4ZDFjMVUsIDB4OGNjYWEyZmVVLCAweDk4ZDQwYjM2VSwKKyAgICAweGE2ZjU4MWNmVSwgMHhhNTdhZGUyOFUsIDB4ZGFiNzhlMjZVLCAweDNmYWRiZmE0VSwKKyAgICAweDJjM2E5ZGU0VSwgMHg1MDc4OTIwZFUsIDB4NmE1ZmNjOWJVLCAweDU0N2U0NjYyVSwKKyAgICAweGY2OGQxM2MyVSwgMHg5MGQ4YjhlOFUsIDB4MmUzOWY3NWVVLCAweDgyYzNhZmY1VSwKKyAgICAweDlmNWQ4MGJlVSwgMHg2OWQwOTM3Y1UsIDB4NmZkNTJkYTlVLCAweGNmMjUxMmIzVSwKKyAgICAweGM4YWM5OTNiVSwgMHgxMDE4N2RhN1UsIDB4ZTg5YzYzNmVVLCAweGRiM2JiYjdiVSwKKyAgICAweGNkMjY3ODA5VSwgMHg2ZTU5MThmNFUsIDB4ZWM5YWI3MDFVLCAweDgzNGY5YWE4VSwKKyAgICAweGU2OTU2ZTY1VSwgMHhhYWZmZTY3ZVUsIDB4MjFiY2NmMDhVLCAweGVmMTVlOGU2VSwKKyAgICAweGJhZTc5YmQ5VSwgMHg0YTZmMzZjZVUsIDB4ZWE5ZjA5ZDRVLCAweDI5YjA3Y2Q2VSwKKyAgICAweDMxYTRiMmFmVSwgMHgyYTNmMjMzMVUsIDB4YzZhNTk0MzBVLCAweDM1YTI2NmMwVSwKKyAgICAweDc0NGViYzM3VSwgMHhmYzgyY2FhNlUsIDB4ZTA5MGQwYjBVLCAweDMzYTdkODE1VSwKKyAgICAweGYxMDQ5ODRhVSwgMHg0MWVjZGFmN1UsIDB4N2ZjZDUwMGVVLCAweDE3OTFmNjJmVSwKKyAgICAweDc2NGRkNjhkVSwgMHg0M2VmYjA0ZFUsIDB4Y2NhYTRkNTRVLCAweGU0OTYwNGRmVSwKKyAgICAweDllZDFiNWUzVSwgMHg0YzZhODgxYlUsIDB4YzEyYzFmYjhVLCAweDQ2NjU1MTdmVSwKKyAgICAweDlkNWVlYTA0VSwgMHgwMThjMzU1ZFUsIDB4ZmE4Nzc0NzNVLCAweGZiMGI0MTJlVSwKKyAgICAweGIzNjcxZDVhVSwgMHg5MmRiZDI1MlUsIDB4ZTkxMDU2MzNVLCAweDZkZDY0NzEzVSwKKyAgICAweDlhZDc2MThjVSwgMHgzN2ExMGM3YVUsIDB4NTlmODE0OGVVLCAweGViMTMzYzg5VSwKKyAgICAweGNlYTkyN2VlVSwgMHhiNzYxYzkzNVUsIDB4ZTExY2U1ZWRVLCAweDdhNDdiMTNjVSwKKyAgICAweDljZDJkZjU5VSwgMHg1NWYyNzMzZlUsIDB4MTgxNGNlNzlVLCAweDczYzczN2JmVSwKKyAgICAweDUzZjdjZGVhVSwgMHg1ZmZkYWE1YlUsIDB4ZGYzZDZmMTRVLCAweDc4NDRkYjg2VSwKKyAgICAweGNhYWZmMzgxVSwgMHhiOTY4YzQzZVUsIDB4MzgyNDM0MmNVLCAweGMyYTM0MDVmVSwKKyAgICAweDE2MWRjMzcyVSwgMHhiY2UyMjUwY1UsIDB4MjgzYzQ5OGJVLCAweGZmMGQ5NTQxVSwKKyAgICAweDM5YTgwMTcxVSwgMHgwODBjYjNkZVUsIDB4ZDhiNGU0OWNVLCAweDY0NTZjMTkwVSwKKyAgICAweDdiY2I4NDYxVSwgMHhkNTMyYjY3MFUsIDB4NDg2YzVjNzRVLCAweGQwYjg1NzQyVSwKK307CitzdGF0aWMgY29uc3QgdTMyIFRkMVsyNTZdID0geworICAgIDB4NTA1MWY0YTdVLCAweDUzN2U0MTY1VSwgMHhjMzFhMTdhNFUsIDB4OTYzYTI3NWVVLAorICAgIDB4Y2IzYmFiNmJVLCAweGYxMWY5ZDQ1VSwgMHhhYmFjZmE1OFUsIDB4OTM0YmUzMDNVLAorICAgIDB4NTUyMDMwZmFVLCAweGY2YWQ3NjZkVSwgMHg5MTg4Y2M3NlUsIDB4MjVmNTAyNGNVLAorICAgIDB4ZmM0ZmU1ZDdVLCAweGQ3YzUyYWNiVSwgMHg4MDI2MzU0NFUsIDB4OGZiNTYyYTNVLAorICAgIDB4NDlkZWIxNWFVLCAweDY3MjViYTFiVSwgMHg5ODQ1ZWEwZVUsIDB4ZTE1ZGZlYzBVLAorICAgIDB4MDJjMzJmNzVVLCAweDEyODE0Y2YwVSwgMHhhMzhkNDY5N1UsIDB4YzY2YmQzZjlVLAorICAgIDB4ZTcwMzhmNWZVLCAweDk1MTU5MjljVSwgMHhlYmJmNmQ3YVUsIDB4ZGE5NTUyNTlVLAorICAgIDB4MmRkNGJlODNVLCAweGQzNTg3NDIxVSwgMHgyOTQ5ZTA2OVUsIDB4NDQ4ZWM5YzhVLAorICAgIDB4NmE3NWMyODlVLCAweDc4ZjQ4ZTc5VSwgMHg2Yjk5NTgzZVUsIDB4ZGQyN2I5NzFVLAorICAgIDB4YjZiZWUxNGZVLCAweDE3ZjA4OGFkVSwgMHg2NmM5MjBhY1UsIDB4YjQ3ZGNlM2FVLAorICAgIDB4MTg2M2RmNGFVLCAweDgyZTUxYTMxVSwgMHg2MDk3NTEzM1UsIDB4NDU2MjUzN2ZVLAorICAgIDB4ZTBiMTY0NzdVLCAweDg0YmI2YmFlVSwgMHgxY2ZlODFhMFUsIDB4OTRmOTA4MmJVLAorICAgIDB4NTg3MDQ4NjhVLCAweDE5OGY0NWZkVSwgMHg4Nzk0ZGU2Y1UsIDB4Yjc1MjdiZjhVLAorICAgIDB4MjNhYjczZDNVLCAweGUyNzI0YjAyVSwgMHg1N2UzMWY4ZlUsIDB4MmE2NjU1YWJVLAorICAgIDB4MDdiMmViMjhVLCAweDAzMmZiNWMyVSwgMHg5YTg2YzU3YlUsIDB4YTVkMzM3MDhVLAorICAgIDB4ZjIzMDI4ODdVLCAweGIyMjNiZmE1VSwgMHhiYTAyMDM2YVUsIDB4NWNlZDE2ODJVLAorICAgIDB4MmI4YWNmMWNVLCAweDkyYTc3OWI0VSwgMHhmMGYzMDdmMlUsIDB4YTE0ZTY5ZTJVLAorICAgIDB4Y2Q2NWRhZjRVLCAweGQ1MDYwNWJlVSwgMHgxZmQxMzQ2MlUsIDB4OGFjNGE2ZmVVLAorICAgIDB4OWQzNDJlNTNVLCAweGEwYTJmMzU1VSwgMHgzMjA1OGFlMVUsIDB4NzVhNGY2ZWJVLAorICAgIDB4MzkwYjgzZWNVLCAweGFhNDA2MGVmVSwgMHgwNjVlNzE5ZlUsIDB4NTFiZDZlMTBVLAorICAgIDB4ZjkzZTIxOGFVLCAweDNkOTZkZDA2VSwgMHhhZWRkM2UwNVUsIDB4NDY0ZGU2YmRVLAorICAgIDB4YjU5MTU0OGRVLCAweDA1NzFjNDVkVSwgMHg2ZjA0MDZkNFUsIDB4ZmY2MDUwMTVVLAorICAgIDB4MjQxOTk4ZmJVLCAweDk3ZDZiZGU5VSwgMHhjYzg5NDA0M1UsIDB4Nzc2N2Q5OWVVLAorICAgIDB4YmRiMGU4NDJVLCAweDg4MDc4OThiVSwgMHgzOGU3MTk1YlUsIDB4ZGI3OWM4ZWVVLAorICAgIDB4NDdhMTdjMGFVLCAweGU5N2M0MjBmVSwgMHhjOWY4ODQxZVUsIDB4MDAwMDAwMDBVLAorICAgIDB4ODMwOTgwODZVLCAweDQ4MzIyYmVkVSwgMHhhYzFlMTE3MFUsIDB4NGU2YzVhNzJVLAorICAgIDB4ZmJmZDBlZmZVLCAweDU2MGY4NTM4VSwgMHgxZTNkYWVkNVUsIDB4MjczNjJkMzlVLAorICAgIDB4NjQwYTBmZDlVLCAweDIxNjg1Y2E2VSwgMHhkMTliNWI1NFUsIDB4M2EyNDM2MmVVLAorICAgIDB4YjEwYzBhNjdVLCAweDBmOTM1N2U3VSwgMHhkMmI0ZWU5NlUsIDB4OWUxYjliOTFVLAorICAgIDB4NGY4MGMwYzVVLCAweGEyNjFkYzIwVSwgMHg2OTVhNzc0YlUsIDB4MTYxYzEyMWFVLAorICAgIDB4MGFlMjkzYmFVLCAweGU1YzBhMDJhVSwgMHg0MzNjMjJlMFUsIDB4MWQxMjFiMTdVLAorICAgIDB4MGIwZTA5MGRVLCAweGFkZjI4YmM3VSwgMHhiOTJkYjZhOFUsIDB4YzgxNDFlYTlVLAorICAgIDB4ODU1N2YxMTlVLCAweDRjYWY3NTA3VSwgMHhiYmVlOTlkZFUsIDB4ZmRhMzdmNjBVLAorICAgIDB4OWZmNzAxMjZVLCAweGJjNWM3MmY1VSwgMHhjNTQ0NjYzYlUsIDB4MzQ1YmZiN2VVLAorICAgIDB4NzY4YjQzMjlVLCAweGRjY2IyM2M2VSwgMHg2OGI2ZWRmY1UsIDB4NjNiOGU0ZjFVLAorICAgIDB4Y2FkNzMxZGNVLCAweDEwNDI2Mzg1VSwgMHg0MDEzOTcyMlUsIDB4MjA4NGM2MTFVLAorICAgIDB4N2Q4NTRhMjRVLCAweGY4ZDJiYjNkVSwgMHgxMWFlZjkzMlUsIDB4NmRjNzI5YTFVLAorICAgIDB4NGIxZDllMmZVLCAweGYzZGNiMjMwVSwgMHhlYzBkODY1MlUsIDB4ZDA3N2MxZTNVLAorICAgIDB4NmMyYmIzMTZVLCAweDk5YTk3MGI5VSwgMHhmYTExOTQ0OFUsIDB4MjI0N2U5NjRVLAorICAgIDB4YzRhOGZjOGNVLCAweDFhYTBmMDNmVSwgMHhkODU2N2QyY1UsIDB4ZWYyMjMzOTBVLAorICAgIDB4Yzc4NzQ5NGVVLCAweGMxZDkzOGQxVSwgMHhmZThjY2FhMlUsIDB4MzY5OGQ0MGJVLAorICAgIDB4Y2ZhNmY1ODFVLCAweDI4YTU3YWRlVSwgMHgyNmRhYjc4ZVUsIDB4YTQzZmFkYmZVLAorICAgIDB4ZTQyYzNhOWRVLCAweDBkNTA3ODkyVSwgMHg5YjZhNWZjY1UsIDB4NjI1NDdlNDZVLAorICAgIDB4YzJmNjhkMTNVLCAweGU4OTBkOGI4VSwgMHg1ZTJlMzlmN1UsIDB4ZjU4MmMzYWZVLAorICAgIDB4YmU5ZjVkODBVLCAweDdjNjlkMDkzVSwgMHhhOTZmZDUyZFUsIDB4YjNjZjI1MTJVLAorICAgIDB4M2JjOGFjOTlVLCAweGE3MTAxODdkVSwgMHg2ZWU4OWM2M1UsIDB4N2JkYjNiYmJVLAorICAgIDB4MDljZDI2NzhVLCAweGY0NmU1OTE4VSwgMHgwMWVjOWFiN1UsIDB4YTg4MzRmOWFVLAorICAgIDB4NjVlNjk1NmVVLCAweDdlYWFmZmU2VSwgMHgwODIxYmNjZlUsIDB4ZTZlZjE1ZThVLAorICAgIDB4ZDliYWU3OWJVLCAweGNlNGE2ZjM2VSwgMHhkNGVhOWYwOVUsIDB4ZDYyOWIwN2NVLAorICAgIDB4YWYzMWE0YjJVLCAweDMxMmEzZjIzVSwgMHgzMGM2YTU5NFUsIDB4YzAzNWEyNjZVLAorICAgIDB4Mzc3NDRlYmNVLCAweGE2ZmM4MmNhVSwgMHhiMGUwOTBkMFUsIDB4MTUzM2E3ZDhVLAorICAgIDB4NGFmMTA0OThVLCAweGY3NDFlY2RhVSwgMHgwZTdmY2Q1MFUsIDB4MmYxNzkxZjZVLAorICAgIDB4OGQ3NjRkZDZVLCAweDRkNDNlZmIwVSwgMHg1NGNjYWE0ZFUsIDB4ZGZlNDk2MDRVLAorICAgIDB4ZTM5ZWQxYjVVLCAweDFiNGM2YTg4VSwgMHhiOGMxMmMxZlUsIDB4N2Y0NjY1NTFVLAorICAgIDB4MDQ5ZDVlZWFVLCAweDVkMDE4YzM1VSwgMHg3M2ZhODc3NFUsIDB4MmVmYjBiNDFVLAorICAgIDB4NWFiMzY3MWRVLCAweDUyOTJkYmQyVSwgMHgzM2U5MTA1NlUsIDB4MTM2ZGQ2NDdVLAorICAgIDB4OGM5YWQ3NjFVLCAweDdhMzdhMTBjVSwgMHg4ZTU5ZjgxNFUsIDB4ODllYjEzM2NVLAorICAgIDB4ZWVjZWE5MjdVLCAweDM1Yjc2MWM5VSwgMHhlZGUxMWNlNVUsIDB4M2M3YTQ3YjFVLAorICAgIDB4NTk5Y2QyZGZVLCAweDNmNTVmMjczVSwgMHg3OTE4MTRjZVUsIDB4YmY3M2M3MzdVLAorICAgIDB4ZWE1M2Y3Y2RVLCAweDViNWZmZGFhVSwgMHgxNGRmM2Q2ZlUsIDB4ODY3ODQ0ZGJVLAorICAgIDB4ODFjYWFmZjNVLCAweDNlYjk2OGM0VSwgMHgyYzM4MjQzNFUsIDB4NWZjMmEzNDBVLAorICAgIDB4NzIxNjFkYzNVLCAweDBjYmNlMjI1VSwgMHg4YjI4M2M0OVUsIDB4NDFmZjBkOTVVLAorICAgIDB4NzEzOWE4MDFVLCAweGRlMDgwY2IzVSwgMHg5Y2Q4YjRlNFUsIDB4OTA2NDU2YzFVLAorICAgIDB4NjE3YmNiODRVLCAweDcwZDUzMmI2VSwgMHg3NDQ4NmM1Y1UsIDB4NDJkMGI4NTdVLAorfTsKK3N0YXRpYyBjb25zdCB1MzIgVGQyWzI1Nl0gPSB7CisgICAgMHhhNzUwNTFmNFUsIDB4NjU1MzdlNDFVLCAweGE0YzMxYTE3VSwgMHg1ZTk2M2EyN1UsCisgICAgMHg2YmNiM2JhYlUsIDB4NDVmMTFmOWRVLCAweDU4YWJhY2ZhVSwgMHgwMzkzNGJlM1UsCisgICAgMHhmYTU1MjAzMFUsIDB4NmRmNmFkNzZVLCAweDc2OTE4OGNjVSwgMHg0YzI1ZjUwMlUsCisgICAgMHhkN2ZjNGZlNVUsIDB4Y2JkN2M1MmFVLCAweDQ0ODAyNjM1VSwgMHhhMzhmYjU2MlUsCisgICAgMHg1YTQ5ZGViMVUsIDB4MWI2NzI1YmFVLCAweDBlOTg0NWVhVSwgMHhjMGUxNWRmZVUsCisgICAgMHg3NTAyYzMyZlUsIDB4ZjAxMjgxNGNVLCAweDk3YTM4ZDQ2VSwgMHhmOWM2NmJkM1UsCisgICAgMHg1ZmU3MDM4ZlUsIDB4OWM5NTE1OTJVLCAweDdhZWJiZjZkVSwgMHg1OWRhOTU1MlUsCisgICAgMHg4MzJkZDRiZVUsIDB4MjFkMzU4NzRVLCAweDY5Mjk0OWUwVSwgMHhjODQ0OGVjOVUsCisgICAgMHg4OTZhNzVjMlUsIDB4Nzk3OGY0OGVVLCAweDNlNmI5OTU4VSwgMHg3MWRkMjdiOVUsCisgICAgMHg0ZmI2YmVlMVUsIDB4YWQxN2YwODhVLCAweGFjNjZjOTIwVSwgMHgzYWI0N2RjZVUsCisgICAgMHg0YTE4NjNkZlUsIDB4MzE4MmU1MWFVLCAweDMzNjA5NzUxVSwgMHg3ZjQ1NjI1M1UsCisgICAgMHg3N2UwYjE2NFUsIDB4YWU4NGJiNmJVLCAweGEwMWNmZTgxVSwgMHgyYjk0ZjkwOFUsCisgICAgMHg2ODU4NzA0OFUsIDB4ZmQxOThmNDVVLCAweDZjODc5NGRlVSwgMHhmOGI3NTI3YlUsCisgICAgMHhkMzIzYWI3M1UsIDB4MDJlMjcyNGJVLCAweDhmNTdlMzFmVSwgMHhhYjJhNjY1NVUsCisgICAgMHgyODA3YjJlYlUsIDB4YzIwMzJmYjVVLCAweDdiOWE4NmM1VSwgMHgwOGE1ZDMzN1UsCisgICAgMHg4N2YyMzAyOFUsIDB4YTViMjIzYmZVLCAweDZhYmEwMjAzVSwgMHg4MjVjZWQxNlUsCisgICAgMHgxYzJiOGFjZlUsIDB4YjQ5MmE3NzlVLCAweGYyZjBmMzA3VSwgMHhlMmExNGU2OVUsCisgICAgMHhmNGNkNjVkYVUsIDB4YmVkNTA2MDVVLCAweDYyMWZkMTM0VSwgMHhmZThhYzRhNlUsCisgICAgMHg1MzlkMzQyZVUsIDB4NTVhMGEyZjNVLCAweGUxMzIwNThhVSwgMHhlYjc1YTRmNlUsCisgICAgMHhlYzM5MGI4M1UsIDB4ZWZhYTQwNjBVLCAweDlmMDY1ZTcxVSwgMHgxMDUxYmQ2ZVUsCisKKyAgICAweDhhZjkzZTIxVSwgMHgwNjNkOTZkZFUsIDB4MDVhZWRkM2VVLCAweGJkNDY0ZGU2VSwKKyAgICAweDhkYjU5MTU0VSwgMHg1ZDA1NzFjNFUsIDB4ZDQ2ZjA0MDZVLCAweDE1ZmY2MDUwVSwKKyAgICAweGZiMjQxOTk4VSwgMHhlOTk3ZDZiZFUsIDB4NDNjYzg5NDBVLCAweDllNzc2N2Q5VSwKKyAgICAweDQyYmRiMGU4VSwgMHg4Yjg4MDc4OVUsIDB4NWIzOGU3MTlVLCAweGVlZGI3OWM4VSwKKyAgICAweDBhNDdhMTdjVSwgMHgwZmU5N2M0MlUsIDB4MWVjOWY4ODRVLCAweDAwMDAwMDAwVSwKKyAgICAweDg2ODMwOTgwVSwgMHhlZDQ4MzIyYlUsIDB4NzBhYzFlMTFVLCAweDcyNGU2YzVhVSwKKyAgICAweGZmZmJmZDBlVSwgMHgzODU2MGY4NVUsIDB4ZDUxZTNkYWVVLCAweDM5MjczNjJkVSwKKyAgICAweGQ5NjQwYTBmVSwgMHhhNjIxNjg1Y1UsIDB4NTRkMTliNWJVLCAweDJlM2EyNDM2VSwKKyAgICAweDY3YjEwYzBhVSwgMHhlNzBmOTM1N1UsIDB4OTZkMmI0ZWVVLCAweDkxOWUxYjliVSwKKyAgICAweGM1NGY4MGMwVSwgMHgyMGEyNjFkY1UsIDB4NGI2OTVhNzdVLCAweDFhMTYxYzEyVSwKKyAgICAweGJhMGFlMjkzVSwgMHgyYWU1YzBhMFUsIDB4ZTA0MzNjMjJVLCAweDE3MWQxMjFiVSwKKyAgICAweDBkMGIwZTA5VSwgMHhjN2FkZjI4YlUsIDB4YThiOTJkYjZVLCAweGE5YzgxNDFlVSwKKyAgICAweDE5ODU1N2YxVSwgMHgwNzRjYWY3NVUsIDB4ZGRiYmVlOTlVLCAweDYwZmRhMzdmVSwKKyAgICAweDI2OWZmNzAxVSwgMHhmNWJjNWM3MlUsIDB4M2JjNTQ0NjZVLCAweDdlMzQ1YmZiVSwKKyAgICAweDI5NzY4YjQzVSwgMHhjNmRjY2IyM1UsIDB4ZmM2OGI2ZWRVLCAweGYxNjNiOGU0VSwKKyAgICAweGRjY2FkNzMxVSwgMHg4NTEwNDI2M1UsIDB4MjI0MDEzOTdVLCAweDExMjA4NGM2VSwKKyAgICAweDI0N2Q4NTRhVSwgMHgzZGY4ZDJiYlUsIDB4MzIxMWFlZjlVLCAweGExNmRjNzI5VSwKKyAgICAweDJmNGIxZDllVSwgMHgzMGYzZGNiMlUsIDB4NTJlYzBkODZVLCAweGUzZDA3N2MxVSwKKyAgICAweDE2NmMyYmIzVSwgMHhiOTk5YTk3MFUsIDB4NDhmYTExOTRVLCAweDY0MjI0N2U5VSwKKyAgICAweDhjYzRhOGZjVSwgMHgzZjFhYTBmMFUsIDB4MmNkODU2N2RVLCAweDkwZWYyMjMzVSwKKyAgICAweDRlYzc4NzQ5VSwgMHhkMWMxZDkzOFUsIDB4YTJmZThjY2FVLCAweDBiMzY5OGQ0VSwKKyAgICAweDgxY2ZhNmY1VSwgMHhkZTI4YTU3YVUsIDB4OGUyNmRhYjdVLCAweGJmYTQzZmFkVSwKKyAgICAweDlkZTQyYzNhVSwgMHg5MjBkNTA3OFUsIDB4Y2M5YjZhNWZVLCAweDQ2NjI1NDdlVSwKKyAgICAweDEzYzJmNjhkVSwgMHhiOGU4OTBkOFUsIDB4Zjc1ZTJlMzlVLCAweGFmZjU4MmMzVSwKKyAgICAweDgwYmU5ZjVkVSwgMHg5MzdjNjlkMFUsIDB4MmRhOTZmZDVVLCAweDEyYjNjZjI1VSwKKyAgICAweDk5M2JjOGFjVSwgMHg3ZGE3MTAxOFUsIDB4NjM2ZWU4OWNVLCAweGJiN2JkYjNiVSwKKyAgICAweDc4MDljZDI2VSwgMHgxOGY0NmU1OVUsIDB4YjcwMWVjOWFVLCAweDlhYTg4MzRmVSwKKyAgICAweDZlNjVlNjk1VSwgMHhlNjdlYWFmZlUsIDB4Y2YwODIxYmNVLCAweGU4ZTZlZjE1VSwKKyAgICAweDliZDliYWU3VSwgMHgzNmNlNGE2ZlUsIDB4MDlkNGVhOWZVLCAweDdjZDYyOWIwVSwKKyAgICAweGIyYWYzMWE0VSwgMHgyMzMxMmEzZlUsIDB4OTQzMGM2YTVVLCAweDY2YzAzNWEyVSwKKyAgICAweGJjMzc3NDRlVSwgMHhjYWE2ZmM4MlUsIDB4ZDBiMGUwOTBVLCAweGQ4MTUzM2E3VSwKKyAgICAweDk4NGFmMTA0VSwgMHhkYWY3NDFlY1UsIDB4NTAwZTdmY2RVLCAweGY2MmYxNzkxVSwKKyAgICAweGQ2OGQ3NjRkVSwgMHhiMDRkNDNlZlUsIDB4NGQ1NGNjYWFVLCAweDA0ZGZlNDk2VSwKKyAgICAweGI1ZTM5ZWQxVSwgMHg4ODFiNGM2YVUsIDB4MWZiOGMxMmNVLCAweDUxN2Y0NjY1VSwKKyAgICAweGVhMDQ5ZDVlVSwgMHgzNTVkMDE4Y1UsIDB4NzQ3M2ZhODdVLCAweDQxMmVmYjBiVSwKKyAgICAweDFkNWFiMzY3VSwgMHhkMjUyOTJkYlUsIDB4NTYzM2U5MTBVLCAweDQ3MTM2ZGQ2VSwKKyAgICAweDYxOGM5YWQ3VSwgMHgwYzdhMzdhMVUsIDB4MTQ4ZTU5ZjhVLCAweDNjODllYjEzVSwKKyAgICAweDI3ZWVjZWE5VSwgMHhjOTM1Yjc2MVUsIDB4ZTVlZGUxMWNVLCAweGIxM2M3YTQ3VSwKKyAgICAweGRmNTk5Y2QyVSwgMHg3MzNmNTVmMlUsIDB4Y2U3OTE4MTRVLCAweDM3YmY3M2M3VSwKKyAgICAweGNkZWE1M2Y3VSwgMHhhYTViNWZmZFUsIDB4NmYxNGRmM2RVLCAweGRiODY3ODQ0VSwKKyAgICAweGYzODFjYWFmVSwgMHhjNDNlYjk2OFUsIDB4MzQyYzM4MjRVLCAweDQwNWZjMmEzVSwKKyAgICAweGMzNzIxNjFkVSwgMHgyNTBjYmNlMlUsIDB4NDk4YjI4M2NVLCAweDk1NDFmZjBkVSwKKyAgICAweDAxNzEzOWE4VSwgMHhiM2RlMDgwY1UsIDB4ZTQ5Y2Q4YjRVLCAweGMxOTA2NDU2VSwKKyAgICAweDg0NjE3YmNiVSwgMHhiNjcwZDUzMlUsIDB4NWM3NDQ4NmNVLCAweDU3NDJkMGI4VSwKK307CitzdGF0aWMgY29uc3QgdTMyIFRkM1syNTZdID0geworICAgIDB4ZjRhNzUwNTFVLCAweDQxNjU1MzdlVSwgMHgxN2E0YzMxYVUsIDB4Mjc1ZTk2M2FVLAorICAgIDB4YWI2YmNiM2JVLCAweDlkNDVmMTFmVSwgMHhmYTU4YWJhY1UsIDB4ZTMwMzkzNGJVLAorICAgIDB4MzBmYTU1MjBVLCAweDc2NmRmNmFkVSwgMHhjYzc2OTE4OFUsIDB4MDI0YzI1ZjVVLAorICAgIDB4ZTVkN2ZjNGZVLCAweDJhY2JkN2M1VSwgMHgzNTQ0ODAyNlUsIDB4NjJhMzhmYjVVLAorICAgIDB4YjE1YTQ5ZGVVLCAweGJhMWI2NzI1VSwgMHhlYTBlOTg0NVUsIDB4ZmVjMGUxNWRVLAorICAgIDB4MmY3NTAyYzNVLCAweDRjZjAxMjgxVSwgMHg0Njk3YTM4ZFUsIDB4ZDNmOWM2NmJVLAorICAgIDB4OGY1ZmU3MDNVLCAweDkyOWM5NTE1VSwgMHg2ZDdhZWJiZlUsIDB4NTI1OWRhOTVVLAorICAgIDB4YmU4MzJkZDRVLCAweDc0MjFkMzU4VSwgMHhlMDY5Mjk0OVUsIDB4YzljODQ0OGVVLAorICAgIDB4YzI4OTZhNzVVLCAweDhlNzk3OGY0VSwgMHg1ODNlNmI5OVUsIDB4Yjk3MWRkMjdVLAorICAgIDB4ZTE0ZmI2YmVVLCAweDg4YWQxN2YwVSwgMHgyMGFjNjZjOVUsIDB4Y2UzYWI0N2RVLAorICAgIDB4ZGY0YTE4NjNVLCAweDFhMzE4MmU1VSwgMHg1MTMzNjA5N1UsIDB4NTM3ZjQ1NjJVLAorICAgIDB4NjQ3N2UwYjFVLCAweDZiYWU4NGJiVSwgMHg4MWEwMWNmZVUsIDB4MDgyYjk0ZjlVLAorICAgIDB4NDg2ODU4NzBVLCAweDQ1ZmQxOThmVSwgMHhkZTZjODc5NFUsIDB4N2JmOGI3NTJVLAorICAgIDB4NzNkMzIzYWJVLCAweDRiMDJlMjcyVSwgMHgxZjhmNTdlM1UsIDB4NTVhYjJhNjZVLAorICAgIDB4ZWIyODA3YjJVLCAweGI1YzIwMzJmVSwgMHhjNTdiOWE4NlUsIDB4MzcwOGE1ZDNVLAorICAgIDB4Mjg4N2YyMzBVLCAweGJmYTViMjIzVSwgMHgwMzZhYmEwMlUsIDB4MTY4MjVjZWRVLAorICAgIDB4Y2YxYzJiOGFVLCAweDc5YjQ5MmE3VSwgMHgwN2YyZjBmM1UsIDB4NjllMmExNGVVLAorICAgIDB4ZGFmNGNkNjVVLCAweDA1YmVkNTA2VSwgMHgzNDYyMWZkMVUsIDB4YTZmZThhYzRVLAorICAgIDB4MmU1MzlkMzRVLCAweGYzNTVhMGEyVSwgMHg4YWUxMzIwNVUsIDB4ZjZlYjc1YTRVLAorICAgIDB4ODNlYzM5MGJVLCAweDYwZWZhYTQwVSwgMHg3MTlmMDY1ZVUsIDB4NmUxMDUxYmRVLAorICAgIDB4MjE4YWY5M2VVLCAweGRkMDYzZDk2VSwgMHgzZTA1YWVkZFUsIDB4ZTZiZDQ2NGRVLAorICAgIDB4NTQ4ZGI1OTFVLCAweGM0NWQwNTcxVSwgMHgwNmQ0NmYwNFUsIDB4NTAxNWZmNjBVLAorICAgIDB4OThmYjI0MTlVLCAweGJkZTk5N2Q2VSwgMHg0MDQzY2M4OVUsIDB4ZDk5ZTc3NjdVLAorICAgIDB4ZTg0MmJkYjBVLCAweDg5OGI4ODA3VSwgMHgxOTViMzhlN1UsIDB4YzhlZWRiNzlVLAorICAgIDB4N2MwYTQ3YTFVLCAweDQyMGZlOTdjVSwgMHg4NDFlYzlmOFUsIDB4MDAwMDAwMDBVLAorICAgIDB4ODA4NjgzMDlVLCAweDJiZWQ0ODMyVSwgMHgxMTcwYWMxZVUsIDB4NWE3MjRlNmNVLAorICAgIDB4MGVmZmZiZmRVLCAweDg1Mzg1NjBmVSwgMHhhZWQ1MWUzZFUsIDB4MmQzOTI3MzZVLAorICAgIDB4MGZkOTY0MGFVLCAweDVjYTYyMTY4VSwgMHg1YjU0ZDE5YlUsIDB4MzYyZTNhMjRVLAorICAgIDB4MGE2N2IxMGNVLCAweDU3ZTcwZjkzVSwgMHhlZTk2ZDJiNFUsIDB4OWI5MTllMWJVLAorICAgIDB4YzBjNTRmODBVLCAweGRjMjBhMjYxVSwgMHg3NzRiNjk1YVUsIDB4MTIxYTE2MWNVLAorICAgIDB4OTNiYTBhZTJVLCAweGEwMmFlNWMwVSwgMHgyMmUwNDMzY1UsIDB4MWIxNzFkMTJVLAorICAgIDB4MDkwZDBiMGVVLCAweDhiYzdhZGYyVSwgMHhiNmE4YjkyZFUsIDB4MWVhOWM4MTRVLAorICAgIDB4ZjExOTg1NTdVLCAweDc1MDc0Y2FmVSwgMHg5OWRkYmJlZVUsIDB4N2Y2MGZkYTNVLAorICAgIDB4MDEyNjlmZjdVLCAweDcyZjViYzVjVSwgMHg2NjNiYzU0NFUsIDB4ZmI3ZTM0NWJVLAorICAgIDB4NDMyOTc2OGJVLCAweDIzYzZkY2NiVSwgMHhlZGZjNjhiNlUsIDB4ZTRmMTYzYjhVLAorICAgIDB4MzFkY2NhZDdVLCAweDYzODUxMDQyVSwgMHg5NzIyNDAxM1UsIDB4YzYxMTIwODRVLAorICAgIDB4NGEyNDdkODVVLCAweGJiM2RmOGQyVSwgMHhmOTMyMTFhZVUsIDB4MjlhMTZkYzdVLAorICAgIDB4OWUyZjRiMWRVLCAweGIyMzBmM2RjVSwgMHg4NjUyZWMwZFUsIDB4YzFlM2QwNzdVLAorICAgIDB4YjMxNjZjMmJVLCAweDcwYjk5OWE5VSwgMHg5NDQ4ZmExMVUsIDB4ZTk2NDIyNDdVLAorICAgIDB4ZmM4Y2M0YThVLCAweGYwM2YxYWEwVSwgMHg3ZDJjZDg1NlUsIDB4MzM5MGVmMjJVLAorICAgIDB4NDk0ZWM3ODdVLCAweDM4ZDFjMWQ5VSwgMHhjYWEyZmU4Y1UsIDB4ZDQwYjM2OThVLAorICAgIDB4ZjU4MWNmYTZVLCAweDdhZGUyOGE1VSwgMHhiNzhlMjZkYVUsIDB4YWRiZmE0M2ZVLAorICAgIDB4M2E5ZGU0MmNVLCAweDc4OTIwZDUwVSwgMHg1ZmNjOWI2YVUsIDB4N2U0NjYyNTRVLAorICAgIDB4OGQxM2MyZjZVLCAweGQ4YjhlODkwVSwgMHgzOWY3NWUyZVUsIDB4YzNhZmY1ODJVLAorICAgIDB4NWQ4MGJlOWZVLCAweGQwOTM3YzY5VSwgMHhkNTJkYTk2ZlUsIDB4MjUxMmIzY2ZVLAorICAgIDB4YWM5OTNiYzhVLCAweDE4N2RhNzEwVSwgMHg5YzYzNmVlOFUsIDB4M2JiYjdiZGJVLAorICAgIDB4MjY3ODA5Y2RVLCAweDU5MThmNDZlVSwgMHg5YWI3MDFlY1UsIDB4NGY5YWE4ODNVLAorICAgIDB4OTU2ZTY1ZTZVLCAweGZmZTY3ZWFhVSwgMHhiY2NmMDgyMVUsIDB4MTVlOGU2ZWZVLAorICAgIDB4ZTc5YmQ5YmFVLCAweDZmMzZjZTRhVSwgMHg5ZjA5ZDRlYVUsIDB4YjA3Y2Q2MjlVLAorICAgIDB4YTRiMmFmMzFVLCAweDNmMjMzMTJhVSwgMHhhNTk0MzBjNlUsIDB4YTI2NmMwMzVVLAorICAgIDB4NGViYzM3NzRVLCAweDgyY2FhNmZjVSwgMHg5MGQwYjBlMFUsIDB4YTdkODE1MzNVLAorICAgIDB4MDQ5ODRhZjFVLCAweGVjZGFmNzQxVSwgMHhjZDUwMGU3ZlUsIDB4OTFmNjJmMTdVLAorICAgIDB4NGRkNjhkNzZVLCAweGVmYjA0ZDQzVSwgMHhhYTRkNTRjY1UsIDB4OTYwNGRmZTRVLAorICAgIDB4ZDFiNWUzOWVVLCAweDZhODgxYjRjVSwgMHgyYzFmYjhjMVUsIDB4NjU1MTdmNDZVLAorICAgIDB4NWVlYTA0OWRVLCAweDhjMzU1ZDAxVSwgMHg4Nzc0NzNmYVUsIDB4MGI0MTJlZmJVLAorICAgIDB4NjcxZDVhYjNVLCAweGRiZDI1MjkyVSwgMHgxMDU2MzNlOVUsIDB4ZDY0NzEzNmRVLAorICAgIDB4ZDc2MThjOWFVLCAweGExMGM3YTM3VSwgMHhmODE0OGU1OVUsIDB4MTMzYzg5ZWJVLAorICAgIDB4YTkyN2VlY2VVLCAweDYxYzkzNWI3VSwgMHgxY2U1ZWRlMVUsIDB4NDdiMTNjN2FVLAorICAgIDB4ZDJkZjU5OWNVLCAweGYyNzMzZjU1VSwgMHgxNGNlNzkxOFUsIDB4YzczN2JmNzNVLAorICAgIDB4ZjdjZGVhNTNVLCAweGZkYWE1YjVmVSwgMHgzZDZmMTRkZlUsIDB4NDRkYjg2NzhVLAorICAgIDB4YWZmMzgxY2FVLCAweDY4YzQzZWI5VSwgMHgyNDM0MmMzOFUsIDB4YTM0MDVmYzJVLAorICAgIDB4MWRjMzcyMTZVLCAweGUyMjUwY2JjVSwgMHgzYzQ5OGIyOFUsIDB4MGQ5NTQxZmZVLAorICAgIDB4YTgwMTcxMzlVLCAweDBjYjNkZTA4VSwgMHhiNGU0OWNkOFUsIDB4NTZjMTkwNjRVLAorICAgIDB4Y2I4NDYxN2JVLCAweDMyYjY3MGQ1VSwgMHg2YzVjNzQ0OFUsIDB4Yjg1NzQyZDBVLAorfTsKK3N0YXRpYyBjb25zdCB1MzIgVGQ0WzI1Nl0gPSB7CisgICAgMHg1MjUyNTI1MlUsIDB4MDkwOTA5MDlVLCAweDZhNmE2YTZhVSwgMHhkNWQ1ZDVkNVUsCisgICAgMHgzMDMwMzAzMFUsIDB4MzYzNjM2MzZVLCAweGE1YTVhNWE1VSwgMHgzODM4MzgzOFUsCisgICAgMHhiZmJmYmZiZlUsIDB4NDA0MDQwNDBVLCAweGEzYTNhM2EzVSwgMHg5ZTllOWU5ZVUsCisgICAgMHg4MTgxODE4MVUsIDB4ZjNmM2YzZjNVLCAweGQ3ZDdkN2Q3VSwgMHhmYmZiZmJmYlUsCisgICAgMHg3YzdjN2M3Y1UsIDB4ZTNlM2UzZTNVLCAweDM5MzkzOTM5VSwgMHg4MjgyODI4MlUsCisgICAgMHg5YjliOWI5YlUsIDB4MmYyZjJmMmZVLCAweGZmZmZmZmZmVSwgMHg4Nzg3ODc4N1UsCisgICAgMHgzNDM0MzQzNFUsIDB4OGU4ZThlOGVVLCAweDQzNDM0MzQzVSwgMHg0NDQ0NDQ0NFUsCisgICAgMHhjNGM0YzRjNFUsIDB4ZGVkZWRlZGVVLCAweGU5ZTllOWU5VSwgMHhjYmNiY2JjYlUsCisgICAgMHg1NDU0NTQ1NFUsIDB4N2I3YjdiN2JVLCAweDk0OTQ5NDk0VSwgMHgzMjMyMzIzMlUsCisgICAgMHhhNmE2YTZhNlUsIDB4YzJjMmMyYzJVLCAweDIzMjMyMzIzVSwgMHgzZDNkM2QzZFUsCisgICAgMHhlZWVlZWVlZVUsIDB4NGM0YzRjNGNVLCAweDk1OTU5NTk1VSwgMHgwYjBiMGIwYlUsCisgICAgMHg0MjQyNDI0MlUsIDB4ZmFmYWZhZmFVLCAweGMzYzNjM2MzVSwgMHg0ZTRlNGU0ZVUsCisgICAgMHgwODA4MDgwOFUsIDB4MmUyZTJlMmVVLCAweGExYTFhMWExVSwgMHg2NjY2NjY2NlUsCisgICAgMHgyODI4MjgyOFUsIDB4ZDlkOWQ5ZDlVLCAweDI0MjQyNDI0VSwgMHhiMmIyYjJiMlUsCisgICAgMHg3Njc2NzY3NlUsIDB4NWI1YjViNWJVLCAweGEyYTJhMmEyVSwgMHg0OTQ5NDk0OVUsCisgICAgMHg2ZDZkNmQ2ZFUsIDB4OGI4YjhiOGJVLCAweGQxZDFkMWQxVSwgMHgyNTI1MjUyNVUsCisgICAgMHg3MjcyNzI3MlUsIDB4ZjhmOGY4ZjhVLCAweGY2ZjZmNmY2VSwgMHg2NDY0NjQ2NFUsCisgICAgMHg4Njg2ODY4NlUsIDB4Njg2ODY4NjhVLCAweDk4OTg5ODk4VSwgMHgxNjE2MTYxNlUsCisgICAgMHhkNGQ0ZDRkNFUsIDB4YTRhNGE0YTRVLCAweDVjNWM1YzVjVSwgMHhjY2NjY2NjY1UsCisgICAgMHg1ZDVkNWQ1ZFUsIDB4NjU2NTY1NjVVLCAweGI2YjZiNmI2VSwgMHg5MjkyOTI5MlUsCisgICAgMHg2YzZjNmM2Y1UsIDB4NzA3MDcwNzBVLCAweDQ4NDg0ODQ4VSwgMHg1MDUwNTA1MFUsCisgICAgMHhmZGZkZmRmZFUsIDB4ZWRlZGVkZWRVLCAweGI5YjliOWI5VSwgMHhkYWRhZGFkYVUsCisgICAgMHg1ZTVlNWU1ZVUsIDB4MTUxNTE1MTVVLCAweDQ2NDY0NjQ2VSwgMHg1NzU3NTc1N1UsCisgICAgMHhhN2E3YTdhN1UsIDB4OGQ4ZDhkOGRVLCAweDlkOWQ5ZDlkVSwgMHg4NDg0ODQ4NFUsCisgICAgMHg5MDkwOTA5MFUsIDB4ZDhkOGQ4ZDhVLCAweGFiYWJhYmFiVSwgMHgwMDAwMDAwMFUsCisgICAgMHg4YzhjOGM4Y1UsIDB4YmNiY2JjYmNVLCAweGQzZDNkM2QzVSwgMHgwYTBhMGEwYVUsCisgICAgMHhmN2Y3ZjdmN1UsIDB4ZTRlNGU0ZTRVLCAweDU4NTg1ODU4VSwgMHgwNTA1MDUwNVUsCisgICAgMHhiOGI4YjhiOFUsIDB4YjNiM2IzYjNVLCAweDQ1NDU0NTQ1VSwgMHgwNjA2MDYwNlUsCisgICAgMHhkMGQwZDBkMFUsIDB4MmMyYzJjMmNVLCAweDFlMWUxZTFlVSwgMHg4ZjhmOGY4ZlUsCisgICAgMHhjYWNhY2FjYVUsIDB4M2YzZjNmM2ZVLCAweDBmMGYwZjBmVSwgMHgwMjAyMDIwMlUsCisgICAgMHhjMWMxYzFjMVUsIDB4YWZhZmFmYWZVLCAweGJkYmRiZGJkVSwgMHgwMzAzMDMwM1UsCisgICAgMHgwMTAxMDEwMVUsIDB4MTMxMzEzMTNVLCAweDhhOGE4YThhVSwgMHg2YjZiNmI2YlUsCisgICAgMHgzYTNhM2EzYVUsIDB4OTE5MTkxOTFVLCAweDExMTExMTExVSwgMHg0MTQxNDE0MVUsCisgICAgMHg0ZjRmNGY0ZlUsIDB4Njc2NzY3NjdVLCAweGRjZGNkY2RjVSwgMHhlYWVhZWFlYVUsCisgICAgMHg5Nzk3OTc5N1UsIDB4ZjJmMmYyZjJVLCAweGNmY2ZjZmNmVSwgMHhjZWNlY2VjZVUsCisgICAgMHhmMGYwZjBmMFUsIDB4YjRiNGI0YjRVLCAweGU2ZTZlNmU2VSwgMHg3MzczNzM3M1UsCisgICAgMHg5Njk2OTY5NlUsIDB4YWNhY2FjYWNVLCAweDc0NzQ3NDc0VSwgMHgyMjIyMjIyMlUsCisgICAgMHhlN2U3ZTdlN1UsIDB4YWRhZGFkYWRVLCAweDM1MzUzNTM1VSwgMHg4NTg1ODU4NVUsCisgICAgMHhlMmUyZTJlMlUsIDB4ZjlmOWY5ZjlVLCAweDM3MzczNzM3VSwgMHhlOGU4ZThlOFUsCisgICAgMHgxYzFjMWMxY1UsIDB4NzU3NTc1NzVVLCAweGRmZGZkZmRmVSwgMHg2ZTZlNmU2ZVUsCisgICAgMHg0NzQ3NDc0N1UsIDB4ZjFmMWYxZjFVLCAweDFhMWExYTFhVSwgMHg3MTcxNzE3MVUsCisgICAgMHgxZDFkMWQxZFUsIDB4MjkyOTI5MjlVLCAweGM1YzVjNWM1VSwgMHg4OTg5ODk4OVUsCisgICAgMHg2ZjZmNmY2ZlUsIDB4YjdiN2I3YjdVLCAweDYyNjI2MjYyVSwgMHgwZTBlMGUwZVUsCisgICAgMHhhYWFhYWFhYVUsIDB4MTgxODE4MThVLCAweGJlYmViZWJlVSwgMHgxYjFiMWIxYlUsCisgICAgMHhmY2ZjZmNmY1UsIDB4NTY1NjU2NTZVLCAweDNlM2UzZTNlVSwgMHg0YjRiNGI0YlUsCisgICAgMHhjNmM2YzZjNlUsIDB4ZDJkMmQyZDJVLCAweDc5Nzk3OTc5VSwgMHgyMDIwMjAyMFUsCisgICAgMHg5YTlhOWE5YVUsIDB4ZGJkYmRiZGJVLCAweGMwYzBjMGMwVSwgMHhmZWZlZmVmZVUsCisgICAgMHg3ODc4Nzg3OFUsIDB4Y2RjZGNkY2RVLCAweDVhNWE1YTVhVSwgMHhmNGY0ZjRmNFUsCisgICAgMHgxZjFmMWYxZlUsIDB4ZGRkZGRkZGRVLCAweGE4YThhOGE4VSwgMHgzMzMzMzMzM1UsCisgICAgMHg4ODg4ODg4OFUsIDB4MDcwNzA3MDdVLCAweGM3YzdjN2M3VSwgMHgzMTMxMzEzMVUsCisgICAgMHhiMWIxYjFiMVUsIDB4MTIxMjEyMTJVLCAweDEwMTAxMDEwVSwgMHg1OTU5NTk1OVUsCisgICAgMHgyNzI3MjcyN1UsIDB4ODA4MDgwODBVLCAweGVjZWNlY2VjVSwgMHg1ZjVmNWY1ZlUsCisgICAgMHg2MDYwNjA2MFUsIDB4NTE1MTUxNTFVLCAweDdmN2Y3ZjdmVSwgMHhhOWE5YTlhOVUsCisgICAgMHgxOTE5MTkxOVUsIDB4YjViNWI1YjVVLCAweDRhNGE0YTRhVSwgMHgwZDBkMGQwZFUsCisgICAgMHgyZDJkMmQyZFUsIDB4ZTVlNWU1ZTVVLCAweDdhN2E3YTdhVSwgMHg5ZjlmOWY5ZlUsCisgICAgMHg5MzkzOTM5M1UsIDB4YzljOWM5YzlVLCAweDljOWM5YzljVSwgMHhlZmVmZWZlZlUsCisgICAgMHhhMGEwYTBhMFUsIDB4ZTBlMGUwZTBVLCAweDNiM2IzYjNiVSwgMHg0ZDRkNGQ0ZFUsCisgICAgMHhhZWFlYWVhZVUsIDB4MmEyYTJhMmFVLCAweGY1ZjVmNWY1VSwgMHhiMGIwYjBiMFUsCisgICAgMHhjOGM4YzhjOFUsIDB4ZWJlYmViZWJVLCAweGJiYmJiYmJiVSwgMHgzYzNjM2MzY1UsCisgICAgMHg4MzgzODM4M1UsIDB4NTM1MzUzNTNVLCAweDk5OTk5OTk5VSwgMHg2MTYxNjE2MVUsCisgICAgMHgxNzE3MTcxN1UsIDB4MmIyYjJiMmJVLCAweDA0MDQwNDA0VSwgMHg3ZTdlN2U3ZVUsCisgICAgMHhiYWJhYmFiYVUsIDB4Nzc3Nzc3NzdVLCAweGQ2ZDZkNmQ2VSwgMHgyNjI2MjYyNlUsCisgICAgMHhlMWUxZTFlMVUsIDB4Njk2OTY5NjlVLCAweDE0MTQxNDE0VSwgMHg2MzYzNjM2M1UsCisgICAgMHg1NTU1NTU1NVUsIDB4MjEyMTIxMjFVLCAweDBjMGMwYzBjVSwgMHg3ZDdkN2Q3ZFUsCit9Oworc3RhdGljIGNvbnN0IHUzMiByY29uW10gPSB7CisJMHgwMTAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwNDAwMDAwMCwgMHgwODAwMDAwMCwKKwkweDEwMDAwMDAwLCAweDIwMDAwMDAwLCAweDQwMDAwMDAwLCAweDgwMDAwMDAwLAorCTB4MUIwMDAwMDAsIDB4MzYwMDAwMDAsIC8qIGZvciAxMjgtYml0IGJsb2NrcywgUmlqbmRhZWwgbmV2ZXIgdXNlcyBtb3JlIHRoYW4gMTAgcmNvbiB2YWx1ZXMgKi8KK307CisKKyNkZWZpbmUgR0VUVTMyKHB0KSAoKCh1MzIpKHB0KVswXSA8PCAyNCkgXiAoKHUzMikocHQpWzFdIDw8IDE2KSBeICgodTMyKShwdClbMl0gPDwgIDgpIF4gKCh1MzIpKHB0KVszXSkpCisjZGVmaW5lIFBVVFUzMihjdCwgc3QpIHsgKGN0KVswXSA9ICh1OCkoKHN0KSA+PiAyNCk7IChjdClbMV0gPSAodTgpKChzdCkgPj4gMTYpOyAoY3QpWzJdID0gKHU4KSgoc3QpID4+ICA4KTsgKGN0KVszXSA9ICh1OCkoc3QpOyB9CisKKy8qKgorICogRXhwYW5kIHRoZSBjaXBoZXIga2V5IGludG8gdGhlIGVuY3J5cHRpb24ga2V5IHNjaGVkdWxlLgorICoKKyAqIEByZXR1cm4JdGhlIG51bWJlciBvZiByb3VuZHMgZm9yIHRoZSBnaXZlbiBjaXBoZXIga2V5IHNpemUuCisgKi8KK3N0YXRpYyBpbnQgcmlqbmRhZWxLZXlTZXR1cEVuYyh1MzIgcmtbLyo0KihOciArIDEpKi9dLCBjb25zdCB1OCBjaXBoZXJLZXlbXSwgaW50IGtleUJpdHMpIHsKKwlpbnQgaSA9IDA7CisJdTMyIHRlbXA7CisKKwlya1swXSA9IEdFVFUzMihjaXBoZXJLZXkgICAgICk7CisJcmtbMV0gPSBHRVRVMzIoY2lwaGVyS2V5ICsgIDQpOworCXJrWzJdID0gR0VUVTMyKGNpcGhlcktleSArICA4KTsKKwlya1szXSA9IEdFVFUzMihjaXBoZXJLZXkgKyAxMik7CisJaWYgKGtleUJpdHMgPT0gMTI4KSB7CisJCWZvciAoOzspIHsKKwkJCXRlbXAgID0gcmtbM107CisJCQlya1s0XSA9IHJrWzBdIF4KKwkJCQkoVGU0Wyh0ZW1wID4+IDE2KSAmIDB4ZmZdICYgMHhmZjAwMDAwMCkgXgorCQkJCShUZTRbKHRlbXAgPj4gIDgpICYgMHhmZl0gJiAweDAwZmYwMDAwKSBeCisJCQkJKFRlNFsodGVtcCAgICAgICkgJiAweGZmXSAmIDB4MDAwMGZmMDApIF4KKwkJCQkoVGU0Wyh0ZW1wID4+IDI0KSAgICAgICBdICYgMHgwMDAwMDBmZikgXgorCQkJCXJjb25baV07CisJCQlya1s1XSA9IHJrWzFdIF4gcmtbNF07CisJCQlya1s2XSA9IHJrWzJdIF4gcmtbNV07CisJCQlya1s3XSA9IHJrWzNdIF4gcmtbNl07CisJCQlpZiAoKytpID09IDEwKSB7CisJCQkJcmV0dXJuIDEwOworCQkJfQorCQkJcmsgKz0gNDsKKwkJfQorCX0KKwlya1s0XSA9IEdFVFUzMihjaXBoZXJLZXkgKyAxNik7CisJcmtbNV0gPSBHRVRVMzIoY2lwaGVyS2V5ICsgMjApOworCWlmIChrZXlCaXRzID09IDE5MikgeworCQlmb3IgKDs7KSB7CisJCQl0ZW1wID0gcmtbIDVdOworCQkJcmtbIDZdID0gcmtbIDBdIF4KKwkJCQkoVGU0Wyh0ZW1wID4+IDE2KSAmIDB4ZmZdICYgMHhmZjAwMDAwMCkgXgorCQkJCShUZTRbKHRlbXAgPj4gIDgpICYgMHhmZl0gJiAweDAwZmYwMDAwKSBeCisJCQkJKFRlNFsodGVtcCAgICAgICkgJiAweGZmXSAmIDB4MDAwMGZmMDApIF4KKwkJCQkoVGU0Wyh0ZW1wID4+IDI0KSAgICAgICBdICYgMHgwMDAwMDBmZikgXgorCQkJCXJjb25baV07CisJCQlya1sgN10gPSBya1sgMV0gXiBya1sgNl07CisJCQlya1sgOF0gPSBya1sgMl0gXiBya1sgN107CisJCQlya1sgOV0gPSBya1sgM10gXiBya1sgOF07CisJCQlpZiAoKytpID09IDgpIHsKKwkJCQlyZXR1cm4gMTI7CisJCQl9CisJCQlya1sxMF0gPSBya1sgNF0gXiBya1sgOV07CisJCQlya1sxMV0gPSBya1sgNV0gXiBya1sxMF07CisJCQlyayArPSA2OworCQl9CisJfQorCXJrWzZdID0gR0VUVTMyKGNpcGhlcktleSArIDI0KTsKKwlya1s3XSA9IEdFVFUzMihjaXBoZXJLZXkgKyAyOCk7CisJaWYgKGtleUJpdHMgPT0gMjU2KSB7CisJCWZvciAoOzspIHsKKwkJCXRlbXAgPSBya1sgN107CisJCQlya1sgOF0gPSBya1sgMF0gXgorCQkJCShUZTRbKHRlbXAgPj4gMTYpICYgMHhmZl0gJiAweGZmMDAwMDAwKSBeCisJCQkJKFRlNFsodGVtcCA+PiAgOCkgJiAweGZmXSAmIDB4MDBmZjAwMDApIF4KKwkJCQkoVGU0Wyh0ZW1wICAgICAgKSAmIDB4ZmZdICYgMHgwMDAwZmYwMCkgXgorCQkJCShUZTRbKHRlbXAgPj4gMjQpICAgICAgIF0gJiAweDAwMDAwMGZmKSBeCisJCQkJcmNvbltpXTsKKwkJCXJrWyA5XSA9IHJrWyAxXSBeIHJrWyA4XTsKKwkJCXJrWzEwXSA9IHJrWyAyXSBeIHJrWyA5XTsKKwkJCXJrWzExXSA9IHJrWyAzXSBeIHJrWzEwXTsKKwkJCQlpZiAoKytpID09IDcpIHsKKwkJCQkJcmV0dXJuIDE0OworCQkJCX0KKwkJCXRlbXAgPSBya1sxMV07CisJCQlya1sxMl0gPSBya1sgNF0gXgorCQkJCShUZTRbKHRlbXAgPj4gMjQpICAgICAgIF0gJiAweGZmMDAwMDAwKSBeCisJCQkJKFRlNFsodGVtcCA+PiAxNikgJiAweGZmXSAmIDB4MDBmZjAwMDApIF4KKwkJCQkoVGU0Wyh0ZW1wID4+ICA4KSAmIDB4ZmZdICYgMHgwMDAwZmYwMCkgXgorCQkJCShUZTRbKHRlbXAgICAgICApICYgMHhmZl0gJiAweDAwMDAwMGZmKTsKKwkJCXJrWzEzXSA9IHJrWyA1XSBeIHJrWzEyXTsKKwkJCXJrWzE0XSA9IHJrWyA2XSBeIHJrWzEzXTsKKwkJCXJrWzE1XSA9IHJrWyA3XSBeIHJrWzE0XTsKKwkJCXJrICs9IDg7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogRXhwYW5kIHRoZSBjaXBoZXIga2V5IGludG8gdGhlIGRlY3J5cHRpb24ga2V5IHNjaGVkdWxlLgorICoKKyAqIEByZXR1cm4JdGhlIG51bWJlciBvZiByb3VuZHMgZm9yIHRoZSBnaXZlbiBjaXBoZXIga2V5IHNpemUuCisgKi8KK3N0YXRpYyBpbnQKK3Jpam5kYWVsS2V5U2V0dXBEZWModTMyIHJrWy8qNCooTnIgKyAxKSovXSwgY29uc3QgdTggY2lwaGVyS2V5W10sIGludCBrZXlCaXRzLAorICAgIGludCBoYXZlX2VuY3J5cHQpIHsKKwlpbnQgTnIsIGksIGo7CisJdTMyIHRlbXA7CisKKwlpZiAoaGF2ZV9lbmNyeXB0KSB7CisJCU5yID0gaGF2ZV9lbmNyeXB0OworCX0gZWxzZSB7CisJCS8qIGV4cGFuZCB0aGUgY2lwaGVyIGtleTogKi8KKwkJTnIgPSByaWpuZGFlbEtleVNldHVwRW5jKHJrLCBjaXBoZXJLZXksIGtleUJpdHMpOworCX0KKwkvKiBpbnZlcnQgdGhlIG9yZGVyIG9mIHRoZSByb3VuZCBrZXlzOiAqLworCWZvciAoaSA9IDAsIGogPSA0Kk5yOyBpIDwgajsgaSArPSA0LCBqIC09IDQpIHsKKwkJdGVtcCA9IHJrW2kgICAgXTsgcmtbaSAgICBdID0gcmtbaiAgICBdOyBya1tqICAgIF0gPSB0ZW1wOworCQl0ZW1wID0gcmtbaSArIDFdOyBya1tpICsgMV0gPSBya1tqICsgMV07IHJrW2ogKyAxXSA9IHRlbXA7CisJCXRlbXAgPSBya1tpICsgMl07IHJrW2kgKyAyXSA9IHJrW2ogKyAyXTsgcmtbaiArIDJdID0gdGVtcDsKKwkJdGVtcCA9IHJrW2kgKyAzXTsgcmtbaSArIDNdID0gcmtbaiArIDNdOyBya1tqICsgM10gPSB0ZW1wOworCX0KKwkvKiBhcHBseSB0aGUgaW52ZXJzZSBNaXhDb2x1bW4gdHJhbnNmb3JtIHRvIGFsbCByb3VuZCBrZXlzIGJ1dCB0aGUgZmlyc3QgYW5kIHRoZSBsYXN0OiAqLworCWZvciAoaSA9IDE7IGkgPCBOcjsgaSsrKSB7CisJCXJrICs9IDQ7CisJCXJrWzBdID0KKwkJCVRkMFtUZTRbKHJrWzBdID4+IDI0KSAgICAgICBdICYgMHhmZl0gXgorCQkJVGQxW1RlNFsocmtbMF0gPj4gMTYpICYgMHhmZl0gJiAweGZmXSBeCisJCQlUZDJbVGU0Wyhya1swXSA+PiAgOCkgJiAweGZmXSAmIDB4ZmZdIF4KKwkJCVRkM1tUZTRbKHJrWzBdICAgICAgKSAmIDB4ZmZdICYgMHhmZl07CisJCXJrWzFdID0KKwkJCVRkMFtUZTRbKHJrWzFdID4+IDI0KSAgICAgICBdICYgMHhmZl0gXgorCQkJVGQxW1RlNFsocmtbMV0gPj4gMTYpICYgMHhmZl0gJiAweGZmXSBeCisJCQlUZDJbVGU0Wyhya1sxXSA+PiAgOCkgJiAweGZmXSAmIDB4ZmZdIF4KKwkJCVRkM1tUZTRbKHJrWzFdICAgICAgKSAmIDB4ZmZdICYgMHhmZl07CisJCXJrWzJdID0KKwkJCVRkMFtUZTRbKHJrWzJdID4+IDI0KSAgICAgICBdICYgMHhmZl0gXgorCQkJVGQxW1RlNFsocmtbMl0gPj4gMTYpICYgMHhmZl0gJiAweGZmXSBeCisJCQlUZDJbVGU0Wyhya1syXSA+PiAgOCkgJiAweGZmXSAmIDB4ZmZdIF4KKwkJCVRkM1tUZTRbKHJrWzJdICAgICAgKSAmIDB4ZmZdICYgMHhmZl07CisJCXJrWzNdID0KKwkJCVRkMFtUZTRbKHJrWzNdID4+IDI0KSAgICAgICBdICYgMHhmZl0gXgorCQkJVGQxW1RlNFsocmtbM10gPj4gMTYpICYgMHhmZl0gJiAweGZmXSBeCisJCQlUZDJbVGU0Wyhya1szXSA+PiAgOCkgJiAweGZmXSAmIDB4ZmZdIF4KKwkJCVRkM1tUZTRbKHJrWzNdICAgICAgKSAmIDB4ZmZdICYgMHhmZl07CisJfQorCXJldHVybiBOcjsKK30KKworc3RhdGljIHZvaWQgcmlqbmRhZWxFbmNyeXB0KGNvbnN0IHUzMiBya1svKjQqKE5yICsgMSkqL10sIGludCBOciwgY29uc3QgdTggcHRbMTZdLCB1OCBjdFsxNl0pIHsKKwl1MzIgczAsIHMxLCBzMiwgczMsIHQwLCB0MSwgdDIsIHQzOworI2lmbmRlZiBGVUxMX1VOUk9MTAorICAgIGludCByOworI2VuZGlmIC8qID9GVUxMX1VOUk9MTCAqLworCisgICAgLyoKKwkgKiBtYXAgYnl0ZSBhcnJheSBibG9jayB0byBjaXBoZXIgc3RhdGUKKwkgKiBhbmQgYWRkIGluaXRpYWwgcm91bmQga2V5OgorCSAqLworCXMwID0gR0VUVTMyKHB0ICAgICApIF4gcmtbMF07CisJczEgPSBHRVRVMzIocHQgKyAgNCkgXiBya1sxXTsKKwlzMiA9IEdFVFUzMihwdCArICA4KSBeIHJrWzJdOworCXMzID0gR0VUVTMyKHB0ICsgMTIpIF4gcmtbM107CisjaWZkZWYgRlVMTF9VTlJPTEwKKyAgICAvKiByb3VuZCAxOiAqLworCXQwID0gVGUwW3MwID4+IDI0XSBeIFRlMVsoczEgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMyID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MzICYgMHhmZl0gXiBya1sgNF07CisJdDEgPSBUZTBbczEgPj4gMjRdIF4gVGUxWyhzMiA+PiAxNikgJiAweGZmXSBeIFRlMlsoczMgPj4gIDgpICYgMHhmZl0gXiBUZTNbczAgJiAweGZmXSBeIHJrWyA1XTsKKwl0MiA9IFRlMFtzMiA+PiAyNF0gXiBUZTFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMCA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMSAmIDB4ZmZdIF4gcmtbIDZdOworCXQzID0gVGUwW3MzID4+IDI0XSBeIFRlMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMxID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MyICYgMHhmZl0gXiBya1sgN107CisJLyogcm91bmQgMjogKi8KKwlzMCA9IFRlMFt0MCA+PiAyNF0gXiBUZTFbKHQxID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MiA+PiAgOCkgJiAweGZmXSBeIFRlM1t0MyAmIDB4ZmZdIF4gcmtbIDhdOworCXMxID0gVGUwW3QxID4+IDI0XSBeIFRlMVsodDIgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQzID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QwICYgMHhmZl0gXiBya1sgOV07CisJczIgPSBUZTBbdDIgPj4gMjRdIF4gVGUxWyh0MyA+PiAxNikgJiAweGZmXSBeIFRlMlsodDAgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDEgJiAweGZmXSBeIHJrWzEwXTsKKwlzMyA9IFRlMFt0MyA+PiAyNF0gXiBUZTFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MSA+PiAgOCkgJiAweGZmXSBeIFRlM1t0MiAmIDB4ZmZdIF4gcmtbMTFdOworICAgIC8qIHJvdW5kIDM6ICovCisJdDAgPSBUZTBbczAgPj4gMjRdIF4gVGUxWyhzMSA+PiAxNikgJiAweGZmXSBeIFRlMlsoczIgPj4gIDgpICYgMHhmZl0gXiBUZTNbczMgJiAweGZmXSBeIHJrWzEyXTsKKwl0MSA9IFRlMFtzMSA+PiAyNF0gXiBUZTFbKHMyID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMyA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMCAmIDB4ZmZdIF4gcmtbMTNdOworCXQyID0gVGUwW3MyID4+IDI0XSBeIFRlMVsoczMgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMwID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MxICYgMHhmZl0gXiBya1sxNF07CisJdDMgPSBUZTBbczMgPj4gMjRdIF4gVGUxWyhzMCA+PiAxNikgJiAweGZmXSBeIFRlMlsoczEgPj4gIDgpICYgMHhmZl0gXiBUZTNbczIgJiAweGZmXSBeIHJrWzE1XTsKKwkvKiByb3VuZCA0OiAqLworCXMwID0gVGUwW3QwID4+IDI0XSBeIFRlMVsodDEgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQyID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QzICYgMHhmZl0gXiBya1sxNl07CisJczEgPSBUZTBbdDEgPj4gMjRdIF4gVGUxWyh0MiA+PiAxNikgJiAweGZmXSBeIFRlMlsodDMgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDAgJiAweGZmXSBeIHJrWzE3XTsKKwlzMiA9IFRlMFt0MiA+PiAyNF0gXiBUZTFbKHQzID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MCA+PiAgOCkgJiAweGZmXSBeIFRlM1t0MSAmIDB4ZmZdIF4gcmtbMThdOworCXMzID0gVGUwW3QzID4+IDI0XSBeIFRlMVsodDAgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQxID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QyICYgMHhmZl0gXiBya1sxOV07CisgICAgLyogcm91bmQgNTogKi8KKwl0MCA9IFRlMFtzMCA+PiAyNF0gXiBUZTFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMiA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMyAmIDB4ZmZdIF4gcmtbMjBdOworCXQxID0gVGUwW3MxID4+IDI0XSBeIFRlMVsoczIgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMzID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MwICYgMHhmZl0gXiBya1syMV07CisJdDIgPSBUZTBbczIgPj4gMjRdIF4gVGUxWyhzMyA+PiAxNikgJiAweGZmXSBeIFRlMlsoczAgPj4gIDgpICYgMHhmZl0gXiBUZTNbczEgJiAweGZmXSBeIHJrWzIyXTsKKwl0MyA9IFRlMFtzMyA+PiAyNF0gXiBUZTFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMSA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMiAmIDB4ZmZdIF4gcmtbMjNdOworCS8qIHJvdW5kIDY6ICovCisJczAgPSBUZTBbdDAgPj4gMjRdIF4gVGUxWyh0MSA+PiAxNikgJiAweGZmXSBeIFRlMlsodDIgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDMgJiAweGZmXSBeIHJrWzI0XTsKKwlzMSA9IFRlMFt0MSA+PiAyNF0gXiBUZTFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MyA+PiAgOCkgJiAweGZmXSBeIFRlM1t0MCAmIDB4ZmZdIF4gcmtbMjVdOworCXMyID0gVGUwW3QyID4+IDI0XSBeIFRlMVsodDMgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQwID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QxICYgMHhmZl0gXiBya1syNl07CisJczMgPSBUZTBbdDMgPj4gMjRdIF4gVGUxWyh0MCA+PiAxNikgJiAweGZmXSBeIFRlMlsodDEgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDIgJiAweGZmXSBeIHJrWzI3XTsKKyAgICAvKiByb3VuZCA3OiAqLworCXQwID0gVGUwW3MwID4+IDI0XSBeIFRlMVsoczEgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMyID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MzICYgMHhmZl0gXiBya1syOF07CisJdDEgPSBUZTBbczEgPj4gMjRdIF4gVGUxWyhzMiA+PiAxNikgJiAweGZmXSBeIFRlMlsoczMgPj4gIDgpICYgMHhmZl0gXiBUZTNbczAgJiAweGZmXSBeIHJrWzI5XTsKKwl0MiA9IFRlMFtzMiA+PiAyNF0gXiBUZTFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMCA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMSAmIDB4ZmZdIF4gcmtbMzBdOworCXQzID0gVGUwW3MzID4+IDI0XSBeIFRlMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMxID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MyICYgMHhmZl0gXiBya1szMV07CisJLyogcm91bmQgODogKi8KKwlzMCA9IFRlMFt0MCA+PiAyNF0gXiBUZTFbKHQxID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MiA+PiAgOCkgJiAweGZmXSBeIFRlM1t0MyAmIDB4ZmZdIF4gcmtbMzJdOworCXMxID0gVGUwW3QxID4+IDI0XSBeIFRlMVsodDIgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQzID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QwICYgMHhmZl0gXiBya1szM107CisJczIgPSBUZTBbdDIgPj4gMjRdIF4gVGUxWyh0MyA+PiAxNikgJiAweGZmXSBeIFRlMlsodDAgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDEgJiAweGZmXSBeIHJrWzM0XTsKKwlzMyA9IFRlMFt0MyA+PiAyNF0gXiBUZTFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MSA+PiAgOCkgJiAweGZmXSBeIFRlM1t0MiAmIDB4ZmZdIF4gcmtbMzVdOworICAgIC8qIHJvdW5kIDk6ICovCisJdDAgPSBUZTBbczAgPj4gMjRdIF4gVGUxWyhzMSA+PiAxNikgJiAweGZmXSBeIFRlMlsoczIgPj4gIDgpICYgMHhmZl0gXiBUZTNbczMgJiAweGZmXSBeIHJrWzM2XTsKKwl0MSA9IFRlMFtzMSA+PiAyNF0gXiBUZTFbKHMyID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMyA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMCAmIDB4ZmZdIF4gcmtbMzddOworCXQyID0gVGUwW3MyID4+IDI0XSBeIFRlMVsoczMgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMwID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MxICYgMHhmZl0gXiBya1szOF07CisJdDMgPSBUZTBbczMgPj4gMjRdIF4gVGUxWyhzMCA+PiAxNikgJiAweGZmXSBeIFRlMlsoczEgPj4gIDgpICYgMHhmZl0gXiBUZTNbczIgJiAweGZmXSBeIHJrWzM5XTsKKyAgICBpZiAoTnIgPiAxMCkgeworCS8qIHJvdW5kIDEwOiAqLworCXMwID0gVGUwW3QwID4+IDI0XSBeIFRlMVsodDEgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQyID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QzICYgMHhmZl0gXiBya1s0MF07CisJczEgPSBUZTBbdDEgPj4gMjRdIF4gVGUxWyh0MiA+PiAxNikgJiAweGZmXSBeIFRlMlsodDMgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDAgJiAweGZmXSBeIHJrWzQxXTsKKwlzMiA9IFRlMFt0MiA+PiAyNF0gXiBUZTFbKHQzID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MCA+PiAgOCkgJiAweGZmXSBeIFRlM1t0MSAmIDB4ZmZdIF4gcmtbNDJdOworCXMzID0gVGUwW3QzID4+IDI0XSBeIFRlMVsodDAgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQxID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QyICYgMHhmZl0gXiBya1s0M107CisJLyogcm91bmQgMTE6ICovCisJdDAgPSBUZTBbczAgPj4gMjRdIF4gVGUxWyhzMSA+PiAxNikgJiAweGZmXSBeIFRlMlsoczIgPj4gIDgpICYgMHhmZl0gXiBUZTNbczMgJiAweGZmXSBeIHJrWzQ0XTsKKwl0MSA9IFRlMFtzMSA+PiAyNF0gXiBUZTFbKHMyID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMyA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMCAmIDB4ZmZdIF4gcmtbNDVdOworCXQyID0gVGUwW3MyID4+IDI0XSBeIFRlMVsoczMgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMwID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MxICYgMHhmZl0gXiBya1s0Nl07CisJdDMgPSBUZTBbczMgPj4gMjRdIF4gVGUxWyhzMCA+PiAxNikgJiAweGZmXSBeIFRlMlsoczEgPj4gIDgpICYgMHhmZl0gXiBUZTNbczIgJiAweGZmXSBeIHJrWzQ3XTsKKwlpZiAoTnIgPiAxMikgeworCSAgICAvKiByb3VuZCAxMjogKi8KKwkgICAgczAgPSBUZTBbdDAgPj4gMjRdIF4gVGUxWyh0MSA+PiAxNikgJiAweGZmXSBeIFRlMlsodDIgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDMgJiAweGZmXSBeIHJrWzQ4XTsKKwkgICAgczEgPSBUZTBbdDEgPj4gMjRdIF4gVGUxWyh0MiA+PiAxNikgJiAweGZmXSBeIFRlMlsodDMgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDAgJiAweGZmXSBeIHJrWzQ5XTsKKwkgICAgczIgPSBUZTBbdDIgPj4gMjRdIF4gVGUxWyh0MyA+PiAxNikgJiAweGZmXSBeIFRlMlsodDAgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDEgJiAweGZmXSBeIHJrWzUwXTsKKwkgICAgczMgPSBUZTBbdDMgPj4gMjRdIF4gVGUxWyh0MCA+PiAxNikgJiAweGZmXSBeIFRlMlsodDEgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDIgJiAweGZmXSBeIHJrWzUxXTsKKwkgICAgLyogcm91bmQgMTM6ICovCisJICAgIHQwID0gVGUwW3MwID4+IDI0XSBeIFRlMVsoczEgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMyID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MzICYgMHhmZl0gXiBya1s1Ml07CisJICAgIHQxID0gVGUwW3MxID4+IDI0XSBeIFRlMVsoczIgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMzID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MwICYgMHhmZl0gXiBya1s1M107CisJICAgIHQyID0gVGUwW3MyID4+IDI0XSBeIFRlMVsoczMgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMwID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MxICYgMHhmZl0gXiBya1s1NF07CisJICAgIHQzID0gVGUwW3MzID4+IDI0XSBeIFRlMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMxID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MyICYgMHhmZl0gXiBya1s1NV07CisJfQorICAgIH0KKyAgICByayArPSBOciA8PCAyOworI2Vsc2UgIC8qICFGVUxMX1VOUk9MTCAqLworICAgIC8qCisJICogTnIgLSAxIGZ1bGwgcm91bmRzOgorCSAqLworICAgIHIgPSBOciA+PiAxOworICAgIGZvciAoOzspIHsKKwl0MCA9CisJICAgIFRlMFsoczAgPj4gMjQpICAgICAgIF0gXgorCSAgICBUZTFbKHMxID4+IDE2KSAmIDB4ZmZdIF4KKwkgICAgVGUyWyhzMiA+PiAgOCkgJiAweGZmXSBeCisJICAgIFRlM1soczMgICAgICApICYgMHhmZl0gXgorCSAgICBya1s0XTsKKwl0MSA9CisJICAgIFRlMFsoczEgPj4gMjQpICAgICAgIF0gXgorCSAgICBUZTFbKHMyID4+IDE2KSAmIDB4ZmZdIF4KKwkgICAgVGUyWyhzMyA+PiAgOCkgJiAweGZmXSBeCisJICAgIFRlM1soczAgICAgICApICYgMHhmZl0gXgorCSAgICBya1s1XTsKKwl0MiA9CisJICAgIFRlMFsoczIgPj4gMjQpICAgICAgIF0gXgorCSAgICBUZTFbKHMzID4+IDE2KSAmIDB4ZmZdIF4KKwkgICAgVGUyWyhzMCA+PiAgOCkgJiAweGZmXSBeCisJICAgIFRlM1soczEgICAgICApICYgMHhmZl0gXgorCSAgICBya1s2XTsKKwl0MyA9CisJICAgIFRlMFsoczMgPj4gMjQpICAgICAgIF0gXgorCSAgICBUZTFbKHMwID4+IDE2KSAmIDB4ZmZdIF4KKwkgICAgVGUyWyhzMSA+PiAgOCkgJiAweGZmXSBeCisJICAgIFRlM1soczIgICAgICApICYgMHhmZl0gXgorCSAgICBya1s3XTsKKworCXJrICs9IDg7CisJaWYgKC0tciA9PSAwKSB7CisJICAgIGJyZWFrOworCX0KKworCXMwID0KKwkgICAgVGUwWyh0MCA+PiAyNCkgICAgICAgXSBeCisJICAgIFRlMVsodDEgPj4gMTYpICYgMHhmZl0gXgorCSAgICBUZTJbKHQyID4+ICA4KSAmIDB4ZmZdIF4KKwkgICAgVGUzWyh0MyAgICAgICkgJiAweGZmXSBeCisJICAgIHJrWzBdOworCXMxID0KKwkgICAgVGUwWyh0MSA+PiAyNCkgICAgICAgXSBeCisJICAgIFRlMVsodDIgPj4gMTYpICYgMHhmZl0gXgorCSAgICBUZTJbKHQzID4+ICA4KSAmIDB4ZmZdIF4KKwkgICAgVGUzWyh0MCAgICAgICkgJiAweGZmXSBeCisJICAgIHJrWzFdOworCXMyID0KKwkgICAgVGUwWyh0MiA+PiAyNCkgICAgICAgXSBeCisJICAgIFRlMVsodDMgPj4gMTYpICYgMHhmZl0gXgorCSAgICBUZTJbKHQwID4+ICA4KSAmIDB4ZmZdIF4KKwkgICAgVGUzWyh0MSAgICAgICkgJiAweGZmXSBeCisJICAgIHJrWzJdOworCXMzID0KKwkgICAgVGUwWyh0MyA+PiAyNCkgICAgICAgXSBeCisJICAgIFRlMVsodDAgPj4gMTYpICYgMHhmZl0gXgorCSAgICBUZTJbKHQxID4+ICA4KSAmIDB4ZmZdIF4KKwkgICAgVGUzWyh0MiAgICAgICkgJiAweGZmXSBeCisJICAgIHJrWzNdOworICAgIH0KKyNlbmRpZiAvKiA/RlVMTF9VTlJPTEwgKi8KKyAgICAvKgorCSAqIGFwcGx5IGxhc3Qgcm91bmQgYW5kCisJICogbWFwIGNpcGhlciBzdGF0ZSB0byBieXRlIGFycmF5IGJsb2NrOgorCSAqLworCXMwID0KKwkJKFRlNFsodDAgPj4gMjQpICAgICAgIF0gJiAweGZmMDAwMDAwKSBeCisJCShUZTRbKHQxID4+IDE2KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkgXgorCQkoVGU0Wyh0MiA+PiAgOCkgJiAweGZmXSAmIDB4MDAwMGZmMDApIF4KKwkJKFRlNFsodDMgICAgICApICYgMHhmZl0gJiAweDAwMDAwMGZmKSBeCisJCXJrWzBdOworCVBVVFUzMihjdCAgICAgLCBzMCk7CisJczEgPQorCQkoVGU0Wyh0MSA+PiAyNCkgICAgICAgXSAmIDB4ZmYwMDAwMDApIF4KKwkJKFRlNFsodDIgPj4gMTYpICYgMHhmZl0gJiAweDAwZmYwMDAwKSBeCisJCShUZTRbKHQzID4+ICA4KSAmIDB4ZmZdICYgMHgwMDAwZmYwMCkgXgorCQkoVGU0Wyh0MCAgICAgICkgJiAweGZmXSAmIDB4MDAwMDAwZmYpIF4KKwkJcmtbMV07CisJUFVUVTMyKGN0ICsgIDQsIHMxKTsKKwlzMiA9CisJCShUZTRbKHQyID4+IDI0KSAgICAgICBdICYgMHhmZjAwMDAwMCkgXgorCQkoVGU0Wyh0MyA+PiAxNikgJiAweGZmXSAmIDB4MDBmZjAwMDApIF4KKwkJKFRlNFsodDAgPj4gIDgpICYgMHhmZl0gJiAweDAwMDBmZjAwKSBeCisJCShUZTRbKHQxICAgICAgKSAmIDB4ZmZdICYgMHgwMDAwMDBmZikgXgorCQlya1syXTsKKwlQVVRVMzIoY3QgKyAgOCwgczIpOworCXMzID0KKwkJKFRlNFsodDMgPj4gMjQpICAgICAgIF0gJiAweGZmMDAwMDAwKSBeCisJCShUZTRbKHQwID4+IDE2KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkgXgorCQkoVGU0Wyh0MSA+PiAgOCkgJiAweGZmXSAmIDB4MDAwMGZmMDApIF4KKwkJKFRlNFsodDIgICAgICApICYgMHhmZl0gJiAweDAwMDAwMGZmKSBeCisJCXJrWzNdOworCVBVVFUzMihjdCArIDEyLCBzMyk7Cit9CisKK3N0YXRpYyB2b2lkIHJpam5kYWVsRGVjcnlwdChjb25zdCB1MzIgcmtbLyo0KihOciArIDEpKi9dLCBpbnQgTnIsIGNvbnN0IHU4IGN0WzE2XSwgdTggcHRbMTZdKSB7CisJdTMyIHMwLCBzMSwgczIsIHMzLCB0MCwgdDEsIHQyLCB0MzsKKyNpZm5kZWYgRlVMTF9VTlJPTEwKKyAgICBpbnQgcjsKKyNlbmRpZiAvKiA/RlVMTF9VTlJPTEwgKi8KKworICAgIC8qCisJICogbWFwIGJ5dGUgYXJyYXkgYmxvY2sgdG8gY2lwaGVyIHN0YXRlCisJICogYW5kIGFkZCBpbml0aWFsIHJvdW5kIGtleToKKwkgKi8KKyAgICBzMCA9IEdFVFUzMihjdCAgICAgKSBeIHJrWzBdOworICAgIHMxID0gR0VUVTMyKGN0ICsgIDQpIF4gcmtbMV07CisgICAgczIgPSBHRVRVMzIoY3QgKyAgOCkgXiBya1syXTsKKyAgICBzMyA9IEdFVFUzMihjdCArIDEyKSBeIHJrWzNdOworI2lmZGVmIEZVTExfVU5ST0xMCisgICAgLyogcm91bmQgMTogKi8KKyAgICB0MCA9IFRkMFtzMCA+PiAyNF0gXiBUZDFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMiA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMSAmIDB4ZmZdIF4gcmtbIDRdOworICAgIHQxID0gVGQwW3MxID4+IDI0XSBeIFRkMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMzID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MyICYgMHhmZl0gXiBya1sgNV07CisgICAgdDIgPSBUZDBbczIgPj4gMjRdIF4gVGQxWyhzMSA+PiAxNikgJiAweGZmXSBeIFRkMlsoczAgPj4gIDgpICYgMHhmZl0gXiBUZDNbczMgJiAweGZmXSBeIHJrWyA2XTsKKyAgICB0MyA9IFRkMFtzMyA+PiAyNF0gXiBUZDFbKHMyID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMSA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMCAmIDB4ZmZdIF4gcmtbIDddOworICAgIC8qIHJvdW5kIDI6ICovCisgICAgczAgPSBUZDBbdDAgPj4gMjRdIF4gVGQxWyh0MyA+PiAxNikgJiAweGZmXSBeIFRkMlsodDIgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDEgJiAweGZmXSBeIHJrWyA4XTsKKyAgICBzMSA9IFRkMFt0MSA+PiAyNF0gXiBUZDFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MyA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MiAmIDB4ZmZdIF4gcmtbIDldOworICAgIHMyID0gVGQwW3QyID4+IDI0XSBeIFRkMVsodDEgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQwID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QzICYgMHhmZl0gXiBya1sxMF07CisgICAgczMgPSBUZDBbdDMgPj4gMjRdIF4gVGQxWyh0MiA+PiAxNikgJiAweGZmXSBeIFRkMlsodDEgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDAgJiAweGZmXSBeIHJrWzExXTsKKyAgICAvKiByb3VuZCAzOiAqLworICAgIHQwID0gVGQwW3MwID4+IDI0XSBeIFRkMVsoczMgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMyID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MxICYgMHhmZl0gXiBya1sxMl07CisgICAgdDEgPSBUZDBbczEgPj4gMjRdIF4gVGQxWyhzMCA+PiAxNikgJiAweGZmXSBeIFRkMlsoczMgPj4gIDgpICYgMHhmZl0gXiBUZDNbczIgJiAweGZmXSBeIHJrWzEzXTsKKyAgICB0MiA9IFRkMFtzMiA+PiAyNF0gXiBUZDFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMCA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMyAmIDB4ZmZdIF4gcmtbMTRdOworICAgIHQzID0gVGQwW3MzID4+IDI0XSBeIFRkMVsoczIgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMxID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MwICYgMHhmZl0gXiBya1sxNV07CisgICAgLyogcm91bmQgNDogKi8KKyAgICBzMCA9IFRkMFt0MCA+PiAyNF0gXiBUZDFbKHQzID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MiA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MSAmIDB4ZmZdIF4gcmtbMTZdOworICAgIHMxID0gVGQwW3QxID4+IDI0XSBeIFRkMVsodDAgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQzID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QyICYgMHhmZl0gXiBya1sxN107CisgICAgczIgPSBUZDBbdDIgPj4gMjRdIF4gVGQxWyh0MSA+PiAxNikgJiAweGZmXSBeIFRkMlsodDAgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDMgJiAweGZmXSBeIHJrWzE4XTsKKyAgICBzMyA9IFRkMFt0MyA+PiAyNF0gXiBUZDFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MSA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MCAmIDB4ZmZdIF4gcmtbMTldOworICAgIC8qIHJvdW5kIDU6ICovCisgICAgdDAgPSBUZDBbczAgPj4gMjRdIF4gVGQxWyhzMyA+PiAxNikgJiAweGZmXSBeIFRkMlsoczIgPj4gIDgpICYgMHhmZl0gXiBUZDNbczEgJiAweGZmXSBeIHJrWzIwXTsKKyAgICB0MSA9IFRkMFtzMSA+PiAyNF0gXiBUZDFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMyA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMiAmIDB4ZmZdIF4gcmtbMjFdOworICAgIHQyID0gVGQwW3MyID4+IDI0XSBeIFRkMVsoczEgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMwID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MzICYgMHhmZl0gXiBya1syMl07CisgICAgdDMgPSBUZDBbczMgPj4gMjRdIF4gVGQxWyhzMiA+PiAxNikgJiAweGZmXSBeIFRkMlsoczEgPj4gIDgpICYgMHhmZl0gXiBUZDNbczAgJiAweGZmXSBeIHJrWzIzXTsKKyAgICAvKiByb3VuZCA2OiAqLworICAgIHMwID0gVGQwW3QwID4+IDI0XSBeIFRkMVsodDMgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQyID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QxICYgMHhmZl0gXiBya1syNF07CisgICAgczEgPSBUZDBbdDEgPj4gMjRdIF4gVGQxWyh0MCA+PiAxNikgJiAweGZmXSBeIFRkMlsodDMgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDIgJiAweGZmXSBeIHJrWzI1XTsKKyAgICBzMiA9IFRkMFt0MiA+PiAyNF0gXiBUZDFbKHQxID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MCA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MyAmIDB4ZmZdIF4gcmtbMjZdOworICAgIHMzID0gVGQwW3QzID4+IDI0XSBeIFRkMVsodDIgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQxID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QwICYgMHhmZl0gXiBya1syN107CisgICAgLyogcm91bmQgNzogKi8KKyAgICB0MCA9IFRkMFtzMCA+PiAyNF0gXiBUZDFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMiA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMSAmIDB4ZmZdIF4gcmtbMjhdOworICAgIHQxID0gVGQwW3MxID4+IDI0XSBeIFRkMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMzID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MyICYgMHhmZl0gXiBya1syOV07CisgICAgdDIgPSBUZDBbczIgPj4gMjRdIF4gVGQxWyhzMSA+PiAxNikgJiAweGZmXSBeIFRkMlsoczAgPj4gIDgpICYgMHhmZl0gXiBUZDNbczMgJiAweGZmXSBeIHJrWzMwXTsKKyAgICB0MyA9IFRkMFtzMyA+PiAyNF0gXiBUZDFbKHMyID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMSA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMCAmIDB4ZmZdIF4gcmtbMzFdOworICAgIC8qIHJvdW5kIDg6ICovCisgICAgczAgPSBUZDBbdDAgPj4gMjRdIF4gVGQxWyh0MyA+PiAxNikgJiAweGZmXSBeIFRkMlsodDIgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDEgJiAweGZmXSBeIHJrWzMyXTsKKyAgICBzMSA9IFRkMFt0MSA+PiAyNF0gXiBUZDFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MyA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MiAmIDB4ZmZdIF4gcmtbMzNdOworICAgIHMyID0gVGQwW3QyID4+IDI0XSBeIFRkMVsodDEgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQwID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QzICYgMHhmZl0gXiBya1szNF07CisgICAgczMgPSBUZDBbdDMgPj4gMjRdIF4gVGQxWyh0MiA+PiAxNikgJiAweGZmXSBeIFRkMlsodDEgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDAgJiAweGZmXSBeIHJrWzM1XTsKKyAgICAvKiByb3VuZCA5OiAqLworICAgIHQwID0gVGQwW3MwID4+IDI0XSBeIFRkMVsoczMgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMyID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MxICYgMHhmZl0gXiBya1szNl07CisgICAgdDEgPSBUZDBbczEgPj4gMjRdIF4gVGQxWyhzMCA+PiAxNikgJiAweGZmXSBeIFRkMlsoczMgPj4gIDgpICYgMHhmZl0gXiBUZDNbczIgJiAweGZmXSBeIHJrWzM3XTsKKyAgICB0MiA9IFRkMFtzMiA+PiAyNF0gXiBUZDFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMCA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMyAmIDB4ZmZdIF4gcmtbMzhdOworICAgIHQzID0gVGQwW3MzID4+IDI0XSBeIFRkMVsoczIgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMxID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MwICYgMHhmZl0gXiBya1szOV07CisgICAgaWYgKE5yID4gMTApIHsKKwkvKiByb3VuZCAxMDogKi8KKwlzMCA9IFRkMFt0MCA+PiAyNF0gXiBUZDFbKHQzID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MiA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MSAmIDB4ZmZdIF4gcmtbNDBdOworCXMxID0gVGQwW3QxID4+IDI0XSBeIFRkMVsodDAgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQzID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QyICYgMHhmZl0gXiBya1s0MV07CisJczIgPSBUZDBbdDIgPj4gMjRdIF4gVGQxWyh0MSA+PiAxNikgJiAweGZmXSBeIFRkMlsodDAgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDMgJiAweGZmXSBeIHJrWzQyXTsKKwlzMyA9IFRkMFt0MyA+PiAyNF0gXiBUZDFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MSA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MCAmIDB4ZmZdIF4gcmtbNDNdOworCS8qIHJvdW5kIDExOiAqLworCXQwID0gVGQwW3MwID4+IDI0XSBeIFRkMVsoczMgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMyID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MxICYgMHhmZl0gXiBya1s0NF07CisJdDEgPSBUZDBbczEgPj4gMjRdIF4gVGQxWyhzMCA+PiAxNikgJiAweGZmXSBeIFRkMlsoczMgPj4gIDgpICYgMHhmZl0gXiBUZDNbczIgJiAweGZmXSBeIHJrWzQ1XTsKKwl0MiA9IFRkMFtzMiA+PiAyNF0gXiBUZDFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMCA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMyAmIDB4ZmZdIF4gcmtbNDZdOworCXQzID0gVGQwW3MzID4+IDI0XSBeIFRkMVsoczIgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMxID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MwICYgMHhmZl0gXiBya1s0N107CisJaWYgKE5yID4gMTIpIHsKKwkgICAgLyogcm91bmQgMTI6ICovCisJICAgIHMwID0gVGQwW3QwID4+IDI0XSBeIFRkMVsodDMgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQyID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QxICYgMHhmZl0gXiBya1s0OF07CisJICAgIHMxID0gVGQwW3QxID4+IDI0XSBeIFRkMVsodDAgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQzID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QyICYgMHhmZl0gXiBya1s0OV07CisJICAgIHMyID0gVGQwW3QyID4+IDI0XSBeIFRkMVsodDEgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQwID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QzICYgMHhmZl0gXiBya1s1MF07CisJICAgIHMzID0gVGQwW3QzID4+IDI0XSBeIFRkMVsodDIgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQxID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QwICYgMHhmZl0gXiBya1s1MV07CisJICAgIC8qIHJvdW5kIDEzOiAqLworCSAgICB0MCA9IFRkMFtzMCA+PiAyNF0gXiBUZDFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMiA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMSAmIDB4ZmZdIF4gcmtbNTJdOworCSAgICB0MSA9IFRkMFtzMSA+PiAyNF0gXiBUZDFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMyA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMiAmIDB4ZmZdIF4gcmtbNTNdOworCSAgICB0MiA9IFRkMFtzMiA+PiAyNF0gXiBUZDFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMCA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMyAmIDB4ZmZdIF4gcmtbNTRdOworCSAgICB0MyA9IFRkMFtzMyA+PiAyNF0gXiBUZDFbKHMyID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMSA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMCAmIDB4ZmZdIF4gcmtbNTVdOworCX0KKyAgICB9CisJcmsgKz0gTnIgPDwgMjsKKyNlbHNlICAvKiAhRlVMTF9VTlJPTEwgKi8KKyAgICAvKgorICAgICAqIE5yIC0gMSBmdWxsIHJvdW5kczoKKyAgICAgKi8KKyAgICByID0gTnIgPj4gMTsKKyAgICBmb3IgKDs7KSB7CisJdDAgPQorCSAgICBUZDBbKHMwID4+IDI0KSAgICAgICBdIF4KKwkgICAgVGQxWyhzMyA+PiAxNikgJiAweGZmXSBeCisJICAgIFRkMlsoczIgPj4gIDgpICYgMHhmZl0gXgorCSAgICBUZDNbKHMxICAgICAgKSAmIDB4ZmZdIF4KKwkgICAgcmtbNF07CisJdDEgPQorCSAgICBUZDBbKHMxID4+IDI0KSAgICAgICBdIF4KKwkgICAgVGQxWyhzMCA+PiAxNikgJiAweGZmXSBeCisJICAgIFRkMlsoczMgPj4gIDgpICYgMHhmZl0gXgorCSAgICBUZDNbKHMyICAgICAgKSAmIDB4ZmZdIF4KKwkgICAgcmtbNV07CisJdDIgPQorCSAgICBUZDBbKHMyID4+IDI0KSAgICAgICBdIF4KKwkgICAgVGQxWyhzMSA+PiAxNikgJiAweGZmXSBeCisJICAgIFRkMlsoczAgPj4gIDgpICYgMHhmZl0gXgorCSAgICBUZDNbKHMzICAgICAgKSAmIDB4ZmZdIF4KKwkgICAgcmtbNl07CisJdDMgPQorCSAgICBUZDBbKHMzID4+IDI0KSAgICAgICBdIF4KKwkgICAgVGQxWyhzMiA+PiAxNikgJiAweGZmXSBeCisJICAgIFRkMlsoczEgPj4gIDgpICYgMHhmZl0gXgorCSAgICBUZDNbKHMwICAgICAgKSAmIDB4ZmZdIF4KKwkgICAgcmtbN107CisKKwlyayArPSA4OworCWlmICgtLXIgPT0gMCkgeworCSAgICBicmVhazsKKwl9CisKKwlzMCA9CisJICAgIFRkMFsodDAgPj4gMjQpICAgICAgIF0gXgorCSAgICBUZDFbKHQzID4+IDE2KSAmIDB4ZmZdIF4KKwkgICAgVGQyWyh0MiA+PiAgOCkgJiAweGZmXSBeCisJICAgIFRkM1sodDEgICAgICApICYgMHhmZl0gXgorCSAgICBya1swXTsKKwlzMSA9CisJICAgIFRkMFsodDEgPj4gMjQpICAgICAgIF0gXgorCSAgICBUZDFbKHQwID4+IDE2KSAmIDB4ZmZdIF4KKwkgICAgVGQyWyh0MyA+PiAgOCkgJiAweGZmXSBeCisJICAgIFRkM1sodDIgICAgICApICYgMHhmZl0gXgorCSAgICBya1sxXTsKKwlzMiA9CisJICAgIFRkMFsodDIgPj4gMjQpICAgICAgIF0gXgorCSAgICBUZDFbKHQxID4+IDE2KSAmIDB4ZmZdIF4KKwkgICAgVGQyWyh0MCA+PiAgOCkgJiAweGZmXSBeCisJICAgIFRkM1sodDMgICAgICApICYgMHhmZl0gXgorCSAgICBya1syXTsKKwlzMyA9CisJICAgIFRkMFsodDMgPj4gMjQpICAgICAgIF0gXgorCSAgICBUZDFbKHQyID4+IDE2KSAmIDB4ZmZdIF4KKwkgICAgVGQyWyh0MSA+PiAgOCkgJiAweGZmXSBeCisJICAgIFRkM1sodDAgICAgICApICYgMHhmZl0gXgorCSAgICBya1szXTsKKyAgICB9CisjZW5kaWYgLyogP0ZVTExfVU5ST0xMICovCisgICAgLyoKKwkgKiBhcHBseSBsYXN0IHJvdW5kIGFuZAorCSAqIG1hcCBjaXBoZXIgc3RhdGUgdG8gYnl0ZSBhcnJheSBibG9jazoKKwkgKi8KKwlzMCA9CisJCShUZDRbKHQwID4+IDI0KSAgICAgICBdICYgMHhmZjAwMDAwMCkgXgorCQkoVGQ0Wyh0MyA+PiAxNikgJiAweGZmXSAmIDB4MDBmZjAwMDApIF4KKwkJKFRkNFsodDIgPj4gIDgpICYgMHhmZl0gJiAweDAwMDBmZjAwKSBeCisJCShUZDRbKHQxICAgICAgKSAmIDB4ZmZdICYgMHgwMDAwMDBmZikgXgorCQlya1swXTsKKwlQVVRVMzIocHQgICAgICwgczApOworCXMxID0KKwkJKFRkNFsodDEgPj4gMjQpICAgICAgIF0gJiAweGZmMDAwMDAwKSBeCisJCShUZDRbKHQwID4+IDE2KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkgXgorCQkoVGQ0Wyh0MyA+PiAgOCkgJiAweGZmXSAmIDB4MDAwMGZmMDApIF4KKwkJKFRkNFsodDIgICAgICApICYgMHhmZl0gJiAweDAwMDAwMGZmKSBeCisJCXJrWzFdOworCVBVVFUzMihwdCArICA0LCBzMSk7CisJczIgPQorCQkoVGQ0Wyh0MiA+PiAyNCkgICAgICAgXSAmIDB4ZmYwMDAwMDApIF4KKwkJKFRkNFsodDEgPj4gMTYpICYgMHhmZl0gJiAweDAwZmYwMDAwKSBeCisJCShUZDRbKHQwID4+ICA4KSAmIDB4ZmZdICYgMHgwMDAwZmYwMCkgXgorCQkoVGQ0Wyh0MyAgICAgICkgJiAweGZmXSAmIDB4MDAwMDAwZmYpIF4KKwkJcmtbMl07CisJUFVUVTMyKHB0ICsgIDgsIHMyKTsKKwlzMyA9CisJCShUZDRbKHQzID4+IDI0KSAgICAgICBdICYgMHhmZjAwMDAwMCkgXgorCQkoVGQ0Wyh0MiA+PiAxNikgJiAweGZmXSAmIDB4MDBmZjAwMDApIF4KKwkJKFRkNFsodDEgPj4gIDgpICYgMHhmZl0gJiAweDAwMDBmZjAwKSBeCisJCShUZDRbKHQwICAgICAgKSAmIDB4ZmZdICYgMHgwMDAwMDBmZikgXgorCQlya1szXTsKKwlQVVRVMzIocHQgKyAxMiwgczMpOworfQorCit2b2lkCityaWpuZGFlbF9zZXRfa2V5KHJpam5kYWVsX2N0eCAqY3R4LCB1X2NoYXIgKmtleSwgaW50IGJpdHMsIGludCBkb19lbmNyeXB0KQoreworCWN0eC0+TnIgPSByaWpuZGFlbEtleVNldHVwRW5jKGN0eC0+ZWssIGtleSwgYml0cyk7CisJaWYgKGRvX2VuY3J5cHQpIHsKKwkJY3R4LT5kZWNyeXB0ID0gMDsKKwkJbWVtc2V0KGN0eC0+ZGssIDAsIHNpemVvZihjdHgtPmRrKSk7CisJfSBlbHNlIHsKKwkJY3R4LT5kZWNyeXB0ID0gMTsKKwkJbWVtY3B5KGN0eC0+ZGssIGN0eC0+ZWssIHNpemVvZihjdHgtPmRrKSk7CisJCXJpam5kYWVsS2V5U2V0dXBEZWMoY3R4LT5kaywga2V5LCBiaXRzLCBjdHgtPk5yKTsKKwl9Cit9CisKK3ZvaWQKK3Jpam5kYWVsX2RlY3J5cHQocmlqbmRhZWxfY3R4ICpjdHgsIHVfY2hhciAqc3JjLCB1X2NoYXIgKmRzdCkKK3sKKwlyaWpuZGFlbERlY3J5cHQoY3R4LT5kaywgY3R4LT5Ociwgc3JjLCBkc3QpOworfQorCit2b2lkCityaWpuZGFlbF9lbmNyeXB0KHJpam5kYWVsX2N0eCAqY3R4LCB1X2NoYXIgKnNyYywgdV9jaGFyICpkc3QpCit7CisJcmlqbmRhZWxFbmNyeXB0KGN0eC0+ZWssIGN0eC0+TnIsIHNyYywgZHN0KTsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcmlqbmRhZWwuaCBiL29wZW5zc2gtNi4wcDEvcmlqbmRhZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjE0YmIxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yaWpuZGFlbC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCSRPcGVuQlNEOiByaWpuZGFlbC5oLHYgMS4xMiAyMDAxLzEyLzE5IDA3OjE4OjU2IGRlcmFhZHQgRXhwICQgKi8KKworLyoqCisgKiByaWpuZGFlbC1hbGctZnN0LmgKKyAqCisgKiBAdmVyc2lvbiAzLjAgKERlY2VtYmVyIDIwMDApCisgKgorICogT3B0aW1pc2VkIEFOU0kgQyBjb2RlIGZvciB0aGUgUmlqbmRhZWwgY2lwaGVyIChub3cgQUVTKQorICoKKyAqIEBhdXRob3IgVmluY2VudCBSaWptZW4gPHZpbmNlbnQucmlqbWVuQGVzYXQua3VsZXV2ZW4uYWMuYmU+CisgKiBAYXV0aG9yIEFudG9vbiBCb3NzZWxhZXJzIDxhbnRvb24uYm9zc2VsYWVyc0Blc2F0Lmt1bGV1dmVuLmFjLmJlPgorICogQGF1dGhvciBQYXVsbyBCYXJyZXRvIDxwYXVsby5iYXJyZXRvQHRlcnJhLmNvbS5icj4KKyAqCisgKiBUaGlzIGNvZGUgaXMgaGVyZWJ5IHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1JTICcnQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MKKyAqIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAorICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfX1JJSk5EQUVMX0gKKyNkZWZpbmUgX19SSUpOREFFTF9ICisKKyNkZWZpbmUgTUFYS0MJKDI1Ni8zMikKKyNkZWZpbmUgTUFYS0IJKDI1Ni84KQorI2RlZmluZSBNQVhOUgkxNAorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJdTg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CXUxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50CXUzMjsKKworLyogIFRoZSBzdHJ1Y3R1cmUgZm9yIGtleSBpbmZvcm1hdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWludAlkZWNyeXB0OworCWludAlOcjsJCQkvKiBrZXktbGVuZ3RoLWRlcGVuZGVudCBudW1iZXIgb2Ygcm91bmRzICovCisJdTMyCWVrWzQqKE1BWE5SICsgMSldOwkvKiBlbmNyeXB0IGtleSBzY2hlZHVsZSAqLworCXUzMglka1s0KihNQVhOUiArIDEpXTsJLyogZGVjcnlwdCBrZXkgc2NoZWR1bGUgKi8KK30gcmlqbmRhZWxfY3R4OworCit2b2lkCSByaWpuZGFlbF9zZXRfa2V5KHJpam5kYWVsX2N0eCAqLCB1X2NoYXIgKiwgaW50LCBpbnQpOwordm9pZAkgcmlqbmRhZWxfZGVjcnlwdChyaWpuZGFlbF9jdHggKiwgdV9jaGFyICosIHVfY2hhciAqKTsKK3ZvaWQJIHJpam5kYWVsX2VuY3J5cHQocmlqbmRhZWxfY3R4ICosIHVfY2hhciAqLCB1X2NoYXIgKik7CisKKyNlbmRpZiAvKiBfX1JJSk5EQUVMX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcm9hbWluZy5oIGIvb3BlbnNzaC02LjBwMS9yb2FtaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwNjlmOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcm9hbWluZy5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qICRPcGVuQlNEOiByb2FtaW5nLmgsdiAxLjYgMjAxMS8xMi8wNyAwNTo0NDozOCBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwOSBBcHBHYXRlIE5ldHdvcmsgU2VjdXJpdHkgQUIKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFJPQU1JTkdfSAorI2RlZmluZSBST0FNSU5HX0gKKworI2RlZmluZSBERUZBVUxUX1JPQU1CVUYJNjU1MzYKKyNkZWZpbmUgTUFYX1JPQU1CVUYJKDIqMTAyNCoxMDI0KSAvKiBYWFggYXJiaXRyYXJ5ICovCisjZGVmaW5lIFJPQU1JTkdfUkVRVUVTVAkicm9hbWluZ0BhcHBnYXRlLmNvbSIKKworZXh0ZXJuIGludCByb2FtaW5nX2VuYWJsZWQ7CitleHRlcm4gaW50IHJlc3VtZV9pbl9wcm9ncmVzczsKKwordm9pZAlyZXF1ZXN0X3JvYW1pbmcodm9pZCk7CitpbnQJZ2V0X3NuZF9idWZfc2l6ZSh2b2lkKTsKK2ludAlnZXRfcmVjdl9idWZfc2l6ZSh2b2lkKTsKK3ZvaWQJYWRkX3JlY3ZfYnl0ZXModV9pbnQ2NF90KTsKK2ludAl3YWl0X2Zvcl9yb2FtaW5nX3JlY29ubmVjdCh2b2lkKTsKK3ZvaWQJcm9hbWluZ19yZXBseShpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKK3ZvaWQJc2V0X291dF9idWZmZXJfc2l6ZShzaXplX3QpOworc3NpemVfdAlyb2FtaW5nX3dyaXRlKGludCwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCAqKTsKK3NzaXplX3QJcm9hbWluZ19yZWFkKGludCwgdm9pZCAqLCBzaXplX3QsIGludCAqKTsKK3NpemVfdAlyb2FtaW5nX2F0b21pY2lvKHNzaXplX3QgKCopKGludCwgdm9pZCAqLCBzaXplX3QpLCBpbnQsIHZvaWQgKiwgc2l6ZV90KTsKK3VfaW50NjRfdAlnZXRfcmVjdl9ieXRlcyh2b2lkKTsKK3VfaW50NjRfdAlnZXRfc2VudF9ieXRlcyh2b2lkKTsKK3ZvaWQJcm9hbV9zZXRfYnl0ZXModV9pbnQ2NF90LCB1X2ludDY0X3QpOwordm9pZAlyZXNlbmRfYnl0ZXMoaW50LCB1X2ludDY0X3QgKik7Cit2b2lkCWNhbGN1bGF0ZV9uZXdfa2V5KHVfaW50NjRfdCAqLCB1X2ludDY0X3QsIHVfaW50NjRfdCk7CitpbnQJcmVzdW1lX2tleCh2b2lkKTsKKworI2VuZGlmIC8qIFJPQU1JTkcgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvcm9hbWluZ19jbGllbnQuYyBiL29wZW5zc2gtNi4wcDEvcm9hbWluZ19jbGllbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODAwOWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yb2FtaW5nX2NsaWVudC5jCkBAIC0wLDAgKzEsMjgwIEBACisvKiAkT3BlbkJTRDogcm9hbWluZ19jbGllbnQuYyx2IDEuNCAyMDExLzEyLzA3IDA1OjQ0OjM4IGRqbSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA5IEFwcEdhdGUgTmV0d29yayBTZWN1cml0eSBBQgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvc3lzLXF1ZXVlLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NoYS5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImNoYW5uZWxzLmgiCisjaW5jbHVkZSAiY2lwaGVyLmgiCisjaW5jbHVkZSAiZGlzcGF0Y2guaCIKKyNpbmNsdWRlICJjbGllbnRsb29wLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAibWF0Y2guaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAicGFja2V0LmgiCisjaW5jbHVkZSAic3NoLmgiCisjaW5jbHVkZSAia2V5LmgiCisjaW5jbHVkZSAia2V4LmgiCisjaW5jbHVkZSAicmVhZGNvbmYuaCIKKyNpbmNsdWRlICJyb2FtaW5nLmgiCisjaW5jbHVkZSAic3NoMi5oIgorI2luY2x1ZGUgInNzaGNvbm5lY3QuaCIKKworLyogaW1wb3J0ICovCitleHRlcm4gT3B0aW9ucyBvcHRpb25zOworZXh0ZXJuIGNoYXIgKmhvc3Q7CitleHRlcm4gc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgaG9zdGFkZHI7CitleHRlcm4gaW50IHNlc3Npb25fcmVzdW1lZDsKKworc3RhdGljIHVfaW50MzJfdCByb2FtaW5nX2lkOworc3RhdGljIHVfaW50NjRfdCBjb29raWU7CitzdGF0aWMgdV9pbnQ2NF90IGxhc3RzZWVuY2hhbGw7CitzdGF0aWMgdV9pbnQ2NF90IGtleTEsIGtleTIsIG9sZGtleTEsIG9sZGtleTI7CisKK3ZvaWQKK3JvYW1pbmdfcmVwbHkoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCit7CisJaWYgKHR5cGUgPT0gU1NIMl9NU0dfUkVRVUVTVF9GQUlMVVJFKSB7CisJCWxvZ2l0KCJTZXJ2ZXIgZGVuaWVkIHJvYW1pbmciKTsKKwkJcmV0dXJuOworCX0KKwl2ZXJib3NlKCJSb2FtaW5nIGVuYWJsZWQiKTsKKwlyb2FtaW5nX2lkID0gcGFja2V0X2dldF9pbnQoKTsKKwljb29raWUgPSBwYWNrZXRfZ2V0X2ludDY0KCk7CisJa2V5MSA9IG9sZGtleTEgPSBwYWNrZXRfZ2V0X2ludDY0KCk7CisJa2V5MiA9IG9sZGtleTIgPSBwYWNrZXRfZ2V0X2ludDY0KCk7CisJc2V0X291dF9idWZmZXJfc2l6ZShwYWNrZXRfZ2V0X2ludCgpICsgZ2V0X3NuZF9idWZfc2l6ZSgpKTsKKwlyb2FtaW5nX2VuYWJsZWQgPSAxOworfQorCit2b2lkCityZXF1ZXN0X3JvYW1pbmcodm9pZCkKK3sKKwlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfR0xPQkFMX1JFUVVFU1QpOworCXBhY2tldF9wdXRfY3N0cmluZyhST0FNSU5HX1JFUVVFU1QpOworCXBhY2tldF9wdXRfY2hhcigxKTsKKwlwYWNrZXRfcHV0X2ludChnZXRfcmVjdl9idWZfc2l6ZSgpKTsKKwlwYWNrZXRfc2VuZCgpOworCWNsaWVudF9yZWdpc3Rlcl9nbG9iYWxfY29uZmlybShyb2FtaW5nX3JlcGx5LCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK3JvYW1pbmdfYXV0aF9yZXF1aXJlZCh2b2lkKQoreworCXVfY2hhciBkaWdlc3RbU0hBX0RJR0VTVF9MRU5HVEhdOworCUVWUF9NRF9DVFggbWQ7CisJQnVmZmVyIGI7CisJY29uc3QgRVZQX01EICpldnBfbWQgPSBFVlBfc2hhMSgpOworCXVfaW50NjRfdCBjaGFsbCwgb2xkY2hhbGw7CisKKwljaGFsbCA9IHBhY2tldF9nZXRfaW50NjQoKTsKKwlvbGRjaGFsbCA9IHBhY2tldF9nZXRfaW50NjQoKTsKKwlpZiAob2xkY2hhbGwgIT0gbGFzdHNlZW5jaGFsbCkgeworCQlrZXkxID0gb2xka2V5MTsKKwkJa2V5MiA9IG9sZGtleTI7CisJfQorCWxhc3RzZWVuY2hhbGwgPSBjaGFsbDsKKworCWJ1ZmZlcl9pbml0KCZiKTsKKwlidWZmZXJfcHV0X2ludDY0KCZiLCBjb29raWUpOworCWJ1ZmZlcl9wdXRfaW50NjQoJmIsIGNoYWxsKTsKKwlFVlBfRGlnZXN0SW5pdCgmbWQsIGV2cF9tZCk7CisJRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIGJ1ZmZlcl9wdHIoJmIpLCBidWZmZXJfbGVuKCZiKSk7CisJRVZQX0RpZ2VzdEZpbmFsKCZtZCwgZGlnZXN0LCBOVUxMKTsKKwlidWZmZXJfZnJlZSgmYik7CisKKwlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfS0VYX1JPQU1JTkdfQVVUSCk7CisJcGFja2V0X3B1dF9pbnQ2NChrZXkxIF4gZ2V0X3JlY3ZfYnl0ZXMoKSk7CisJcGFja2V0X3B1dF9yYXcoZGlnZXN0LCBzaXplb2YoZGlnZXN0KSk7CisJcGFja2V0X3NlbmQoKTsKKworCW9sZGtleTEgPSBrZXkxOworCW9sZGtleTIgPSBrZXkyOworCWNhbGN1bGF0ZV9uZXdfa2V5KCZrZXkxLCBjb29raWUsIGNoYWxsKTsKKwljYWxjdWxhdGVfbmV3X2tleSgma2V5MiwgY29va2llLCBjaGFsbCk7CisKKwlkZWJ1ZygiUmVjZWl2ZWQgJWxsdSBieXRlcyIsICh1bnNpZ25lZCBsb25nIGxvbmcpZ2V0X3JlY3ZfYnl0ZXMoKSk7CisJZGVidWcoIlNlbnQgcm9hbWluZ19hdXRoIHBhY2tldCIpOworfQorCitpbnQKK3Jlc3VtZV9rZXgodm9pZCkKK3sKKwkvKgorCSAqIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gLSBpZiB0aGUgY2xpZW50IHNlbmRzIHRoZSBrZXggbWV0aG9kCisJICogcmVzdW1lQGFwcGdhdGUuY29tIHRoZW4gdGhlIGtleCBpcyBkb25lIGluIHJvYW1pbmdfcmVzdW1lKCkuCisJICovCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK3JvYW1pbmdfcmVzdW1lKHZvaWQpCit7CisJdV9pbnQ2NF90IHJlY3ZfYnl0ZXM7CisJY2hhciAqc3RyID0gTlVMTCwgKmtleGxpc3QgPSBOVUxMLCAqYzsKKwlpbnQgaSwgdHlwZTsKKwlpbnQgdGltZW91dF9tcyA9IG9wdGlvbnMuY29ubmVjdGlvbl90aW1lb3V0ICogMTAwMDsKKwl1X2ludCBsZW47CisJdV9pbnQzMl90IHJuZCA9IDA7CisKKwlyZXN1bWVfaW5fcHJvZ3Jlc3MgPSAxOworCisJLyogRXhjaGFuZ2UgYmFubmVycyAqLworCXNzaF9leGNoYW5nZV9pZGVudGlmaWNhdGlvbih0aW1lb3V0X21zKTsKKwlwYWNrZXRfc2V0X25vbmJsb2NraW5nKCk7CisKKwkvKiBTZW5kIGEga2V4aW5pdCBtZXNzYWdlIHdpdGggcmVzdW1lQGFwcGdhdGUuY29tIGFzIG9ubHkga2V4IGFsZ28gKi8KKwlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfS0VYSU5JVCk7CisJZm9yIChpID0gMDsgaSA8IEtFWF9DT09LSUVfTEVOOyBpKyspIHsKKwkJaWYgKGkgJSA0ID09IDApCisJCQlybmQgPSBhcmM0cmFuZG9tKCk7CisJCXBhY2tldF9wdXRfY2hhcihybmQgJiAweGZmKTsKKwkJcm5kID4+PSA4OworCX0KKwlwYWNrZXRfcHV0X2NzdHJpbmcoS0VYX1JFU1VNRSk7CisJZm9yIChpID0gMTsgaSA8IFBST1BPU0FMX01BWDsgaSsrKSB7CisJCS8qIGtleCBhbGdvcml0aG0gYWRkZWQgc28gc3RhcnQgd2l0aCBpPTEgYW5kIG5vdCAwICovCisJCXBhY2tldF9wdXRfY3N0cmluZygiIik7IC8qIE5vdCB1c2VkIHdoZW4gd2UgcmVzdW1lICovCisJfQorCXBhY2tldF9wdXRfY2hhcigxKTsgLyogZmlyc3Qga2V4X3BhY2tldCBmb2xsb3dzICovCisJcGFja2V0X3B1dF9pbnQoMCk7IC8qIHJlc2VydmVkICovCisJcGFja2V0X3NlbmQoKTsKKworCS8qIEFzc3VtZSB0aGF0IHJlc3VtZUBhcHBnYXRlLmNvbSB3aWxsIGJlIGFjY2VwdGVkICovCisJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0tFWF9ST0FNSU5HX1JFU1VNRSk7CisJcGFja2V0X3B1dF9pbnQocm9hbWluZ19pZCk7CisJcGFja2V0X3NlbmQoKTsKKworCS8qIFJlYWQgdGhlIHNlcnZlcidzIGtleGluaXQgYW5kIGNoZWNrIGZvciByZXN1bWVAYXBwZ2F0ZS5jb20gKi8KKwlpZiAoKHR5cGUgPSBwYWNrZXRfcmVhZCgpKSAhPSBTU0gyX01TR19LRVhJTklUKSB7CisJCWRlYnVnKCJleHBlY3RlZCBrZXhpbml0IG9uIHJlc3VtZSwgZ290ICVkIiwgdHlwZSk7CisJCWdvdG8gZmFpbDsKKwl9CisJZm9yIChpID0gMDsgaSA8IEtFWF9DT09LSUVfTEVOOyBpKyspCisJCSh2b2lkKXBhY2tldF9nZXRfY2hhcigpOworCWtleGxpc3QgPSBwYWNrZXRfZ2V0X3N0cmluZygmbGVuKTsKKwlpZiAoIWtleGxpc3QKKwkgICAgfHwgKHN0ciA9IG1hdGNoX2xpc3QoS0VYX1JFU1VNRSwga2V4bGlzdCwgTlVMTCkpID09IE5VTEwpIHsKKwkJZGVidWcoInNlcnZlciBkb2Vzbid0IGFsbG93IHJlc3VtZSIpOworCQlnb3RvIGZhaWw7CisJfQorCXhmcmVlKHN0cik7CisJZm9yIChpID0gMTsgaSA8IFBST1BPU0FMX01BWDsgaSsrKSB7CisJCS8qIGtleCBhbGdvcml0aG0gdGFrZW4gY2FyZSBvZiBzbyBzdGFydCB3aXRoIGk9MSBhbmQgbm90IDAgKi8KKwkJeGZyZWUocGFja2V0X2dldF9zdHJpbmcoJmxlbikpOworCX0KKwlpID0gcGFja2V0X2dldF9jaGFyKCk7IC8qIGZpcnN0X2tleF9wYWNrZXRfZm9sbG93cyAqLworCWlmIChpICYmIChjID0gc3RyY2hyKGtleGxpc3QsICcsJykpKQorCQkqYyA9IDA7CisJaWYgKGkgJiYgc3RyY21wKGtleGxpc3QsIEtFWF9SRVNVTUUpKSB7CisJCWRlYnVnKCJzZXJ2ZXIncyBrZXggZ3Vlc3MgKCVzKSB3YXMgd3JvbmcsIHNraXBwaW5nIiwga2V4bGlzdCk7CisJCSh2b2lkKXBhY2tldF9yZWFkKCk7IC8qIFdyb25nIGd1ZXNzIC0gZGlzY2FyZCBwYWNrZXQgKi8KKwl9CisKKwkvKgorCSAqIFJlYWQgdGhlIFJPQU1JTkdfQVVUSF9SRVFVSVJFRCBjaGFsbGVuZ2UgZnJvbSB0aGUgc2VydmVyIGFuZAorCSAqIHNlbmQgUk9BTUlOR19BVVRICisJICovCisJaWYgKCh0eXBlID0gcGFja2V0X3JlYWQoKSkgIT0gU1NIMl9NU0dfS0VYX1JPQU1JTkdfQVVUSF9SRVFVSVJFRCkgeworCQlkZWJ1ZygiZXhwZWN0ZWQgcm9hbWluZ19hdXRoX3JlcXVpcmVkLCBnb3QgJWQiLCB0eXBlKTsKKwkJZ290byBmYWlsOworCX0KKwlyb2FtaW5nX2F1dGhfcmVxdWlyZWQoKTsKKworCS8qIFJlYWQgUk9BTUlOR19BVVRIX09LIGZyb20gdGhlIHNlcnZlciAqLworCWlmICgodHlwZSA9IHBhY2tldF9yZWFkKCkpICE9IFNTSDJfTVNHX0tFWF9ST0FNSU5HX0FVVEhfT0spIHsKKwkJZGVidWcoImV4cGVjdGVkIHJvYW1pbmdfYXV0aF9vaywgZ290ICVkIiwgdHlwZSk7CisJCWdvdG8gZmFpbDsKKwl9CisJcmVjdl9ieXRlcyA9IHBhY2tldF9nZXRfaW50NjQoKSBeIG9sZGtleTI7CisJZGVidWcoIlBlZXIgcmVjZWl2ZWQgJWxsdSBieXRlcyIsICh1bnNpZ25lZCBsb25nIGxvbmcpcmVjdl9ieXRlcyk7CisJcmVzZW5kX2J5dGVzKHBhY2tldF9nZXRfY29ubmVjdGlvbl9vdXQoKSwgJnJlY3ZfYnl0ZXMpOworCisJcmVzdW1lX2luX3Byb2dyZXNzID0gMDsKKworCXNlc3Npb25fcmVzdW1lZCA9IDE7IC8qIFRlbGwgY2xpZW50bG9vcCAqLworCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJaWYgKGtleGxpc3QpCisJCXhmcmVlKGtleGxpc3QpOworCWlmIChwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25faW4oKSA9PSBwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25fb3V0KCkpCisJCWNsb3NlKHBhY2tldF9nZXRfY29ubmVjdGlvbl9pbigpKTsKKwllbHNlIHsKKwkJY2xvc2UocGFja2V0X2dldF9jb25uZWN0aW9uX2luKCkpOworCQljbG9zZShwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25fb3V0KCkpOworCX0KKwlyZXR1cm4gMTsKK30KKworaW50Cit3YWl0X2Zvcl9yb2FtaW5nX3JlY29ubmVjdCh2b2lkKQoreworCXN0YXRpYyBpbnQgcmVlbnRlcl9ndWFyZCA9IDA7CisJaW50IHRpbWVvdXRfbXMgPSBvcHRpb25zLmNvbm5lY3Rpb25fdGltZW91dCAqIDEwMDA7CisJaW50IGM7CisKKwlpZiAocmVlbnRlcl9ndWFyZCAhPSAwKQorCQlmYXRhbCgiU2VydmVyIHJlZnVzZWQgcmVzdW1lLCByb2FtaW5nIHRpbWVvdXQgbWF5IGJlIGV4Y2VlZGVkIik7CisJcmVlbnRlcl9ndWFyZCA9IDE7CisKKwlmcHJpbnRmKHN0ZGVyciwgIltjb25uZWN0aW9uIHN1c3BlbmRlZCwgcHJlc3MgcmV0dXJuIHRvIHJlc3VtZV0iKTsKKwlmZmx1c2goc3RkZXJyKTsKKwlwYWNrZXRfYmFja3VwX3N0YXRlKCk7CisJLyogVE9ETyBQZXJoYXBzIHdlIHNob3VsZCByZWFkIGZyb20gdHR5IGhlcmUgKi8KKwl3aGlsZSAoKGMgPSBmZ2V0YyhzdGRpbikpICE9IEVPRikgeworCQlpZiAoYyA9PSAnWicgLSA2NCkgeworCQkJa2lsbChnZXRwaWQoKSwgU0lHVFNUUCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyAhPSAnXG4nICYmIGMgIT0gJ1xyJykKKwkJCWNvbnRpbnVlOworCisJCWlmIChzc2hfY29ubmVjdChob3N0LCAmaG9zdGFkZHIsIG9wdGlvbnMucG9ydCwKKwkJICAgIG9wdGlvbnMuYWRkcmVzc19mYW1pbHksIDEsICZ0aW1lb3V0X21zLAorCQkgICAgb3B0aW9ucy50Y3Bfa2VlcF9hbGl2ZSwgb3B0aW9ucy51c2VfcHJpdmlsZWdlZF9wb3J0LAorCQkgICAgb3B0aW9ucy5wcm94eV9jb21tYW5kKSA9PSAwICYmIHJvYW1pbmdfcmVzdW1lKCkgPT0gMCkgeworCQkJcGFja2V0X3Jlc3RvcmVfc3RhdGUoKTsKKwkJCXJlZW50ZXJfZ3VhcmQgPSAwOworCQkJZnByaW50ZihzdGRlcnIsICJbY29ubmVjdGlvbiByZXN1bWVkXVxuIik7CisJCQlmZmx1c2goc3RkZXJyKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJZnByaW50ZihzdGRlcnIsICJbcmVjb25uZWN0IGZhaWxlZCwgcHJlc3MgcmV0dXJuIHRvIHJldHJ5XSIpOworCQlmZmx1c2goc3RkZXJyKTsKKwl9CisJZnByaW50ZihzdGRlcnIsICJbZXhpdGluZ11cbiIpOworCWZmbHVzaChzdGRlcnIpOworCWV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JvYW1pbmdfY29tbW9uLmMgYi9vcGVuc3NoLTYuMHAxL3JvYW1pbmdfY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwYjYwNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcm9hbWluZ19jb21tb24uYwpAQCAtMCwwICsxLDI0NiBAQAorLyogJE9wZW5CU0Q6IHJvYW1pbmdfY29tbW9uLmMsdiAxLjkgMjAxMS8xMi8wNyAwNTo0NDozOCBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwOSBBcHBHYXRlIE5ldHdvcmsgU2VjdXJpdHkgQUIKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImF0b21pY2lvLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAicGFja2V0LmgiCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImNpcGhlci5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgInJvYW1pbmcuaCIKKworc3RhdGljIHNpemVfdCBvdXRfYnVmX3NpemUgPSAwOworc3RhdGljIGNoYXIgKm91dF9idWYgPSBOVUxMOworc3RhdGljIHNpemVfdCBvdXRfc3RhcnQ7CitzdGF0aWMgc2l6ZV90IG91dF9sYXN0OworCitzdGF0aWMgdV9pbnQ2NF90IHdyaXRlX2J5dGVzID0gMDsKK3N0YXRpYyB1X2ludDY0X3QgcmVhZF9ieXRlcyA9IDA7CisKK2ludCByb2FtaW5nX2VuYWJsZWQgPSAwOworaW50IHJlc3VtZV9pbl9wcm9ncmVzcyA9IDA7CisKK2ludAorZ2V0X3NuZF9idWZfc2l6ZSgpCit7CisJaW50IGZkID0gcGFja2V0X2dldF9jb25uZWN0aW9uX291dCgpOworCWludCBvcHR2YWw7CisJc29ja2xlbl90IG9wdHZhbGxlbiA9IHNpemVvZihvcHR2YWwpOworCisJaWYgKGdldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgJm9wdHZhbCwgJm9wdHZhbGxlbikgIT0gMCkKKwkJb3B0dmFsID0gREVGQVVMVF9ST0FNQlVGOworCXJldHVybiBvcHR2YWw7Cit9CisKK2ludAorZ2V0X3JlY3ZfYnVmX3NpemUoKQoreworCWludCBmZCA9IHBhY2tldF9nZXRfY29ubmVjdGlvbl9pbigpOworCWludCBvcHR2YWw7CisJc29ja2xlbl90IG9wdHZhbGxlbiA9IHNpemVvZihvcHR2YWwpOworCisJaWYgKGdldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgJm9wdHZhbCwgJm9wdHZhbGxlbikgIT0gMCkKKwkJb3B0dmFsID0gREVGQVVMVF9ST0FNQlVGOworCXJldHVybiBvcHR2YWw7Cit9CisKK3ZvaWQKK3NldF9vdXRfYnVmZmVyX3NpemUoc2l6ZV90IHNpemUpCit7CisJaWYgKHNpemUgPT0gMCB8fCBzaXplID4gTUFYX1JPQU1CVUYpCisJCWZhdGFsKCIlczogYmFkIGJ1ZmZlciBzaXplICVsdSIsIF9fZnVuY19fLCAodV9sb25nKXNpemUpOworCS8qCisJICogVGhlIGJ1ZmZlciBzaXplIGNhbiBvbmx5IGJlIHNldCBvbmNlIGFuZCB0aGUgYnVmZmVyIHdpbGwgbGl2ZQorCSAqIGFzIGxvbmcgYXMgdGhlIHNlc3Npb24gbGl2ZXMuCisJICovCisJaWYgKG91dF9idWYgPT0gTlVMTCkgeworCQlvdXRfYnVmX3NpemUgPSBzaXplOworCQlvdXRfYnVmID0geG1hbGxvYyhzaXplKTsKKwkJb3V0X3N0YXJ0ID0gMDsKKwkJb3V0X2xhc3QgPSAwOworCX0KK30KKwordV9pbnQ2NF90CitnZXRfcmVjdl9ieXRlcyh2b2lkKQoreworCXJldHVybiByZWFkX2J5dGVzOworfQorCit2b2lkCithZGRfcmVjdl9ieXRlcyh1X2ludDY0X3QgbnVtKQoreworCXJlYWRfYnl0ZXMgKz0gbnVtOworfQorCit1X2ludDY0X3QKK2dldF9zZW50X2J5dGVzKHZvaWQpCit7CisJcmV0dXJuIHdyaXRlX2J5dGVzOworfQorCit2b2lkCityb2FtX3NldF9ieXRlcyh1X2ludDY0X3Qgc2VudCwgdV9pbnQ2NF90IHJlY3ZkKQoreworCXJlYWRfYnl0ZXMgPSByZWN2ZDsKKwl3cml0ZV9ieXRlcyA9IHNlbnQ7Cit9CisKK3N0YXRpYyB2b2lkCitidWZfYXBwZW5kKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWlmIChjb3VudCA+IG91dF9idWZfc2l6ZSkgeworCQlidWYgKz0gY291bnQgLSBvdXRfYnVmX3NpemU7CisJCWNvdW50ID0gb3V0X2J1Zl9zaXplOworCX0KKwlpZiAoY291bnQgPCBvdXRfYnVmX3NpemUgLSBvdXRfbGFzdCkgeworCQltZW1jcHkob3V0X2J1ZiArIG91dF9sYXN0LCBidWYsIGNvdW50KTsKKwkJaWYgKG91dF9zdGFydCA+IG91dF9sYXN0KQorCQkJb3V0X3N0YXJ0ICs9IGNvdW50OworCQlvdXRfbGFzdCArPSBjb3VudDsKKwl9IGVsc2UgeworCQkvKiBkYXRhIHdpbGwgd3JhcCAqLworCQlzaXplX3QgY2h1bmsgPSBvdXRfYnVmX3NpemUgLSBvdXRfbGFzdDsKKwkJbWVtY3B5KG91dF9idWYgKyBvdXRfbGFzdCwgYnVmLCBjaHVuayk7CisJCW1lbWNweShvdXRfYnVmLCBidWYgKyBjaHVuaywgY291bnQgLSBjaHVuayk7CisJCW91dF9sYXN0ID0gY291bnQgLSBjaHVuazsKKwkJb3V0X3N0YXJ0ID0gb3V0X2xhc3QgKyAxOworCX0KK30KKworc3NpemVfdAorcm9hbWluZ193cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgKmNvbnQpCit7CisJc3NpemVfdCByZXQ7CisKKwlyZXQgPSB3cml0ZShmZCwgYnVmLCBjb3VudCk7CisJaWYgKHJldCA+IDAgJiYgIXJlc3VtZV9pbl9wcm9ncmVzcykgeworCQl3cml0ZV9ieXRlcyArPSByZXQ7CisJCWlmIChvdXRfYnVmX3NpemUgPiAwKQorCQkJYnVmX2FwcGVuZChidWYsIHJldCk7CisJfQorCWlmIChvdXRfYnVmX3NpemUgPiAwICYmCisJICAgIChyZXQgPT0gMCB8fCAocmV0ID09IC0xICYmIGVycm5vID09IEVQSVBFKSkpIHsKKwkJaWYgKHdhaXRfZm9yX3JvYW1pbmdfcmVjb25uZWN0KCkgIT0gMCkgeworCQkJcmV0ID0gMDsKKwkJCSpjb250ID0gMTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IC0xOworCQkJZXJybm8gPSBFQUdBSU47CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3NpemVfdAorcm9hbWluZ19yZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIGludCAqY29udCkKK3sKKwlzc2l6ZV90IHJldCA9IHJlYWQoZmQsIGJ1ZiwgY291bnQpOworCWlmIChyZXQgPiAwKSB7CisJCWlmICghcmVzdW1lX2luX3Byb2dyZXNzKSB7CisJCQlyZWFkX2J5dGVzICs9IHJldDsKKwkJfQorCX0gZWxzZSBpZiAob3V0X2J1Zl9zaXplID4gMCAmJgorCSAgICAocmV0ID09IDAgfHwgKHJldCA9PSAtMSAmJiAoZXJybm8gPT0gRUNPTk5SRVNFVAorCSAgICB8fCBlcnJubyA9PSBFQ09OTkFCT1JURUQgfHwgZXJybm8gPT0gRVRJTUVET1VUCisJICAgIHx8IGVycm5vID09IEVIT1NUVU5SRUFDSCkpKSkgeworCQlkZWJ1Zygicm9hbWluZ19yZWFkIGZhaWxlZCBmb3IgJWQgIHJldD0lbGQgIGVycm5vPSVkIiwKKwkJICAgIGZkLCAobG9uZylyZXQsIGVycm5vKTsKKwkJcmV0ID0gMDsKKwkJaWYgKHdhaXRfZm9yX3JvYW1pbmdfcmVjb25uZWN0KCkgPT0gMCkKKwkJCSpjb250ID0gMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc2l6ZV90Cityb2FtaW5nX2F0b21pY2lvKHNzaXplX3QoKmYpKGludCwgdm9pZCosIHNpemVfdCksIGludCBmZCwgdm9pZCAqYnVmLAorICAgIHNpemVfdCBjb3VudCkKK3sKKwlzaXplX3QgcmV0ID0gYXRvbWljaW8oZiwgZmQsIGJ1ZiwgY291bnQpOworCisJaWYgKGYgPT0gdndyaXRlICYmIHJldCA+IDAgJiYgIXJlc3VtZV9pbl9wcm9ncmVzcykgeworCQl3cml0ZV9ieXRlcyArPSByZXQ7CisJfSBlbHNlIGlmIChmID09IHJlYWQgJiYgcmV0ID4gMCAmJiAhcmVzdW1lX2luX3Byb2dyZXNzKSB7CisJCXJlYWRfYnl0ZXMgKz0gcmV0OworCX0KKwlyZXR1cm4gcmV0OworfQorCit2b2lkCityZXNlbmRfYnl0ZXMoaW50IGZkLCB1X2ludDY0X3QgKm9mZnNldCkKK3sKKwlzaXplX3QgYXZhaWxhYmxlLCBuZWVkZWQ7CisKKwlpZiAob3V0X3N0YXJ0IDwgb3V0X2xhc3QpCisJCWF2YWlsYWJsZSA9IG91dF9sYXN0IC0gb3V0X3N0YXJ0OworCWVsc2UKKwkJYXZhaWxhYmxlID0gb3V0X2J1Zl9zaXplOworCW5lZWRlZCA9IHdyaXRlX2J5dGVzIC0gKm9mZnNldDsKKwlkZWJ1ZzMoInJlc2VuZF9ieXRlczogcmVzZW5kICVsdSBieXRlcyBmcm9tICVsbHUiLAorCSAgICAodW5zaWduZWQgbG9uZyluZWVkZWQsICh1bnNpZ25lZCBsb25nIGxvbmcpKm9mZnNldCk7CisJaWYgKG5lZWRlZCA+IGF2YWlsYWJsZSkKKwkJZmF0YWwoIk5lZWRlZCB0byByZXNlbmQgbW9yZSBkYXRhIHRoYW4gaW4gdGhlIGNhY2hlIik7CisJaWYgKG91dF9sYXN0IDwgbmVlZGVkKSB7CisJCWludCBjaHVua2VuZCA9IG5lZWRlZCAtIG91dF9sYXN0OworCQlhdG9taWNpbyh2d3JpdGUsIGZkLCBvdXRfYnVmICsgb3V0X2J1Zl9zaXplIC0gY2h1bmtlbmQsCisJCSAgICBjaHVua2VuZCk7CisJCWF0b21pY2lvKHZ3cml0ZSwgZmQsIG91dF9idWYsIG91dF9sYXN0KTsKKwl9IGVsc2UgeworCQlhdG9taWNpbyh2d3JpdGUsIGZkLCBvdXRfYnVmICsgKG91dF9sYXN0IC0gbmVlZGVkKSwgbmVlZGVkKTsKKwl9Cit9CisKKy8qCisgKiBDYWNsdWxhdGUgYSBuZXcga2V5IGFmdGVyIGEgcmVjb25uZWN0CisgKi8KK3ZvaWQKK2NhbGN1bGF0ZV9uZXdfa2V5KHVfaW50NjRfdCAqa2V5LCB1X2ludDY0X3QgY29va2llLCB1X2ludDY0X3QgY2hhbGxlbmdlKQoreworCWNvbnN0IEVWUF9NRCAqbWQgPSBFVlBfc2hhMSgpOworCUVWUF9NRF9DVFggY3R4OworCWNoYXIgaGFzaFtFVlBfTUFYX01EX1NJWkVdOworCUJ1ZmZlciBiOworCisJYnVmZmVyX2luaXQoJmIpOworCWJ1ZmZlcl9wdXRfaW50NjQoJmIsICprZXkpOworCWJ1ZmZlcl9wdXRfaW50NjQoJmIsIGNvb2tpZSk7CisJYnVmZmVyX3B1dF9pbnQ2NCgmYiwgY2hhbGxlbmdlKTsKKworCUVWUF9EaWdlc3RJbml0KCZjdHgsIG1kKTsKKwlFVlBfRGlnZXN0VXBkYXRlKCZjdHgsIGJ1ZmZlcl9wdHIoJmIpLCBidWZmZXJfbGVuKCZiKSk7CisJRVZQX0RpZ2VzdEZpbmFsKCZjdHgsIGhhc2gsIE5VTEwpOworCisJYnVmZmVyX2NsZWFyKCZiKTsKKwlidWZmZXJfYXBwZW5kKCZiLCBoYXNoLCBFVlBfTURfc2l6ZShtZCkpOworCSprZXkgPSBidWZmZXJfZ2V0X2ludDY0KCZiKTsKKwlidWZmZXJfZnJlZSgmYik7Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JvYW1pbmdfZHVtbXkuYyBiL29wZW5zc2gtNi4wcDEvcm9hbWluZ19kdW1teS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YzQwMDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3JvYW1pbmdfZHVtbXkuYwpAQCAtMCwwICsxLDYxIEBACisvKiAkT3BlbkJTRDogcm9hbWluZ19kdW1teS5jLHYgMS4zIDIwMDkvMDYvMjEgMDk6MDQ6MDMgZHR1Y2tlciBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA5IEFwcEdhdGUgTmV0d29yayBTZWN1cml0eSBBQgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgaW4gdGhlIGNsaWVudCBwcm9ncmFtcyB3aGljaCBzaG91bGQgbm90CisgKiBzdXBwb3J0IHJvYW1pbmcuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgInJvYW1pbmcuaCIKKworaW50IHJlc3VtZV9pbl9wcm9ncmVzcyA9IDA7CisKK3VfaW50NjRfdAorZ2V0X3JlY3ZfYnl0ZXModm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3NpemVfdAorcm9hbWluZ193cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgKmNvbnQpCit7CisJcmV0dXJuIHdyaXRlKGZkLCBidWYsIGNvdW50KTsKK30KKworc3NpemVfdAorcm9hbWluZ19yZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIGludCAqY29udCkKK3sKKwlpZiAoY29udCkKKwkJKmNvbnQgPSAwOworCXJldHVybiByZWFkKGZkLCBidWYsIGNvdW50KTsKK30KKwordm9pZAorYWRkX3JlY3ZfYnl0ZXModV9pbnQ2NF90IG51bSkKK3sKK30KKworaW50CityZXN1bWVfa2V4KHZvaWQpCit7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3JvYW1pbmdfc2Vydi5jIGIvb3BlbnNzaC02LjBwMS9yb2FtaW5nX3NlcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTFjYTg0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9yb2FtaW5nX3NlcnYuYwpAQCAtMCwwICsxLDMxIEBACisvKiAkT3BlbkJTRDogcm9hbWluZ19zZXJ2LmMsdiAxLjEgMjAwOS8xMC8yNCAxMToxODoyMyBhbmRyZWFzIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDkgQXBwR2F0ZSBOZXR3b3JrIFNlY3VyaXR5IEFCCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgInJvYW1pbmcuaCIKKworLyoKKyAqIFdhaXQgZm9yIHRoZSByb2FtaW5nIGNsaWVudCB0byByZWNvbm5lY3QuIFJldHVybnMgMCBpZiBhIGNvbm5lY3Qgb2N1cnJlZC4KKyAqLworaW50Cit3YWl0X2Zvcl9yb2FtaW5nX3JlY29ubmVjdCh2b2lkKQoreworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9yc2EuYyBiL29wZW5zc2gtNi4wcDEvcnNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVjMWQxOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcnNhLmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qICRPcGVuQlNEOiByc2EuYyx2IDEuMjkgMjAwNi8xMS8wNiAyMToyNToyOCBtYXJrdXMgRXhwICQgKi8KKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5IE5pZWxzIFByb3Zvcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBEZXNjcmlwdGlvbiBvZiB0aGUgUlNBIGFsZ29yaXRobSBjYW4gYmUgZm91bmQgZS5nLiBmcm9tIHRoZSBmb2xsb3dpbmcKKyAqIHNvdXJjZXM6CisgKgorICogICBCcnVjZSBTY2huZWllcjogQXBwbGllZCBDcnlwdG9ncmFwaHkuICBKb2huIFdpbGV5ICYgU29ucywgMTk5NC4KKyAqCisgKiAgIEplbm5pZmVyIFNlYmVycnkgYW5kIEpvc2VkIFBpZXByenlrOiBDcnlwdG9ncmFwaHk6IEFuIEludHJvZHVjdGlvbiB0bworICogICBDb21wdXRlciBTZWN1cml0eS4gIFByZW50aWNlLUhhbGwsIDE5ODkuCisgKgorICogICBNYW4gWW91bmcgUmhlZTogQ3J5cHRvZ3JhcGh5IGFuZCBTZWN1cmUgRGF0YSBDb21tdW5pY2F0aW9ucy4gIE1jR3Jhdy1IaWxsLAorICogICAxOTk0LgorICoKKyAqICAgUi4gUml2ZXN0LCBBLiBTaGFtaXIsIGFuZCBMLiBNLiBBZGxlbWFuOiBDcnlwdG9ncmFwaGljIENvbW11bmljYXRpb25zCisgKiAgIFN5c3RlbSBhbmQgTWV0aG9kLiAgVVMgUGF0ZW50IDQsNDA1LDgyOSwgMTk4My4KKyAqCisgKiAgIEhhbnMgUmllc2VsOiBQcmltZSBOdW1iZXJzIGFuZCBDb21wdXRlciBNZXRob2RzIGZvciBGYWN0b3JpemF0aW9uLgorICogICBCaXJraGF1c2VyLCAxOTk0LgorICoKKyAqICAgVGhlIFJTQSBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyBkb2N1bWVudCBieSBSU0EgRGF0YSBTZWN1cml0eSwKKyAqICAgSW5jLiwgMTk5NS4KKyAqCisgKiAgIFJTQSBpbiAzIGxpbmVzIG9mIHBlcmwgYnkgQWRhbSBCYWNrIDxhYmFAYXRsYXguZXguYWMudWs+LCAxOTk1LCBhcworICogaW5jbHVkZWQgYmVsb3c6CisgKgorICogICAgIFtnb25lIC0gaGFkIHRvIGJlIGRlbGV0ZWQgLSB3aGF0IGEgcGl0eV0KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAicnNhLmgiCisjaW5jbHVkZSAibG9nLmgiCisKK3ZvaWQKK3JzYV9wdWJsaWNfZW5jcnlwdChCSUdOVU0gKm91dCwgQklHTlVNICppbiwgUlNBICprZXkpCit7CisJdV9jaGFyICppbmJ1ZiwgKm91dGJ1ZjsKKwlpbnQgbGVuLCBpbGVuLCBvbGVuOworCisJaWYgKEJOX251bV9iaXRzKGtleS0+ZSkgPCAyIHx8ICFCTl9pc19vZGQoa2V5LT5lKSkKKwkJZmF0YWwoInJzYV9wdWJsaWNfZW5jcnlwdCgpIGV4cG9uZW50IHRvbyBzbWFsbCBvciBub3Qgb2RkIik7CisKKwlvbGVuID0gQk5fbnVtX2J5dGVzKGtleS0+bik7CisJb3V0YnVmID0geG1hbGxvYyhvbGVuKTsKKworCWlsZW4gPSBCTl9udW1fYnl0ZXMoaW4pOworCWluYnVmID0geG1hbGxvYyhpbGVuKTsKKwlCTl9ibjJiaW4oaW4sIGluYnVmKTsKKworCWlmICgobGVuID0gUlNBX3B1YmxpY19lbmNyeXB0KGlsZW4sIGluYnVmLCBvdXRidWYsIGtleSwKKwkgICAgUlNBX1BLQ1MxX1BBRERJTkcpKSA8PSAwKQorCQlmYXRhbCgicnNhX3B1YmxpY19lbmNyeXB0KCkgZmFpbGVkIik7CisKKwlpZiAoQk5fYmluMmJuKG91dGJ1ZiwgbGVuLCBvdXQpID09IE5VTEwpCisJCWZhdGFsKCJyc2FfcHVibGljX2VuY3J5cHQ6IEJOX2JpbjJibiBmYWlsZWQiKTsKKworCW1lbXNldChvdXRidWYsIDAsIG9sZW4pOworCW1lbXNldChpbmJ1ZiwgMCwgaWxlbik7CisJeGZyZWUob3V0YnVmKTsKKwl4ZnJlZShpbmJ1Zik7Cit9CisKK2ludAorcnNhX3ByaXZhdGVfZGVjcnlwdChCSUdOVU0gKm91dCwgQklHTlVNICppbiwgUlNBICprZXkpCit7CisJdV9jaGFyICppbmJ1ZiwgKm91dGJ1ZjsKKwlpbnQgbGVuLCBpbGVuLCBvbGVuOworCisJb2xlbiA9IEJOX251bV9ieXRlcyhrZXktPm4pOworCW91dGJ1ZiA9IHhtYWxsb2Mob2xlbik7CisKKwlpbGVuID0gQk5fbnVtX2J5dGVzKGluKTsKKwlpbmJ1ZiA9IHhtYWxsb2MoaWxlbik7CisJQk5fYm4yYmluKGluLCBpbmJ1Zik7CisKKwlpZiAoKGxlbiA9IFJTQV9wcml2YXRlX2RlY3J5cHQoaWxlbiwgaW5idWYsIG91dGJ1Ziwga2V5LAorCSAgICBSU0FfUEtDUzFfUEFERElORykpIDw9IDApIHsKKwkJZXJyb3IoInJzYV9wcml2YXRlX2RlY3J5cHQoKSBmYWlsZWQiKTsKKwl9IGVsc2UgeworCQlpZiAoQk5fYmluMmJuKG91dGJ1ZiwgbGVuLCBvdXQpID09IE5VTEwpCisJCQlmYXRhbCgicnNhX3ByaXZhdGVfZGVjcnlwdDogQk5fYmluMmJuIGZhaWxlZCIpOworCX0KKwltZW1zZXQob3V0YnVmLCAwLCBvbGVuKTsKKwltZW1zZXQoaW5idWYsIDAsIGlsZW4pOworCXhmcmVlKG91dGJ1Zik7CisJeGZyZWUoaW5idWYpOworCXJldHVybiBsZW47Cit9CisKKy8qIGNhbGN1bGF0ZSBwLTEgYW5kIHEtMSAqLwordm9pZAorcnNhX2dlbmVyYXRlX2FkZGl0aW9uYWxfcGFyYW1ldGVycyhSU0EgKnJzYSkKK3sKKwlCSUdOVU0gKmF1eDsKKwlCTl9DVFggKmN0eDsKKworCWlmICgoYXV4ID0gQk5fbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCJyc2FfZ2VuZXJhdGVfYWRkaXRpb25hbF9wYXJhbWV0ZXJzOiBCTl9uZXcgZmFpbGVkIik7CisJaWYgKChjdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCJyc2FfZ2VuZXJhdGVfYWRkaXRpb25hbF9wYXJhbWV0ZXJzOiBCTl9DVFhfbmV3IGZhaWxlZCIpOworCisJaWYgKChCTl9zdWIoYXV4LCByc2EtPnEsIEJOX3ZhbHVlX29uZSgpKSA9PSAwKSB8fAorCSAgICAoQk5fbW9kKHJzYS0+ZG1xMSwgcnNhLT5kLCBhdXgsIGN0eCkgPT0gMCkgfHwKKwkgICAgKEJOX3N1YihhdXgsIHJzYS0+cCwgQk5fdmFsdWVfb25lKCkpID09IDApIHx8CisJICAgIChCTl9tb2QocnNhLT5kbXAxLCByc2EtPmQsIGF1eCwgY3R4KSA9PSAwKSkKKwkJZmF0YWwoInJzYV9nZW5lcmF0ZV9hZGRpdGlvbmFsX3BhcmFtZXRlcnM6IEJOX3N1Yi9tb2QgZmFpbGVkIik7CisKKwlCTl9jbGVhcl9mcmVlKGF1eCk7CisJQk5fQ1RYX2ZyZWUoY3R4KTsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9yc2EuaCBiL29wZW5zc2gtNi4wcDEvcnNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg0MWVhNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvcnNhLmgKQEAgLTAsMCArMSwyNiBAQAorLyogJE9wZW5CU0Q6IHJzYS5oLHYgMS4xNiAyMDA2LzAzLzI1IDIyOjIyOjQzIGRqbSBFeHAgJCAqLworCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICogUlNBIGtleSBnZW5lcmF0aW9uLCBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uLgorICoKKyAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKKyAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCisgKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCisgKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCisgKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCisgKi8KKworI2lmbmRlZiBSU0FfSAorI2RlZmluZSBSU0FfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisKK3ZvaWQJIHJzYV9wdWJsaWNfZW5jcnlwdChCSUdOVU0gKiwgQklHTlVNICosIFJTQSAqKTsKK2ludAkgcnNhX3ByaXZhdGVfZGVjcnlwdChCSUdOVU0gKiwgQklHTlVNICosIFJTQSAqKTsKK3ZvaWQJIHJzYV9nZW5lcmF0ZV9hZGRpdGlvbmFsX3BhcmFtZXRlcnMoUlNBICopOworCisjZW5kaWYJCQkJLyogUlNBX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc2FuZGJveC1kYXJ3aW4uYyBiL29wZW5zc2gtNi4wcDEvc2FuZGJveC1kYXJ3aW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTkwMWVmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zYW5kYm94LWRhcndpbi5jCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaWZkZWYgU0FOREJPWF9EQVJXSU4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c2FuZGJveC5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAic2FuZGJveC5oIgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKworLyogRGFyd2luL09TIFggc2FuZGJveCAqLworCitzdHJ1Y3Qgc3NoX3NhbmRib3ggeworCXBpZF90IGNoaWxkX3BpZDsKK307CisKK3N0cnVjdCBzc2hfc2FuZGJveCAqCitzc2hfc2FuZGJveF9pbml0KHZvaWQpCit7CisJc3RydWN0IHNzaF9zYW5kYm94ICpib3g7CisKKwkvKgorCSAqIFN0cmljdGx5LCB3ZSBkb24ndCBuZWVkIHRvIG1haW50YWluIGFueSBzdGF0ZSBoZXJlIGJ1dCB3ZSBuZWVkCisJICogdG8gcmV0dXJuIG5vbi1OVUxMIHRvIHNhdGlzZnkgdGhlIEFQSS4KKwkgKi8KKwlkZWJ1ZzMoIiVzOiBwcmVwYXJpbmcgRGFyd2luIHNhbmRib3giLCBfX2Z1bmNfXyk7CisJYm94ID0geGNhbGxvYygxLCBzaXplb2YoKmJveCkpOworCWJveC0+Y2hpbGRfcGlkID0gMDsKKworCXJldHVybiBib3g7Cit9CisKK3ZvaWQKK3NzaF9zYW5kYm94X2NoaWxkKHN0cnVjdCBzc2hfc2FuZGJveCAqYm94KQoreworCWNoYXIgKmVycm1zZzsKKwlzdHJ1Y3QgcmxpbWl0IHJsX3plcm87CisKKwlkZWJ1ZzMoIiVzOiBzdGFydGluZyBEYXJ3aW4gc2FuZGJveCIsIF9fZnVuY19fKTsKKwlpZiAoc2FuZGJveF9pbml0KGtTQlhQcm9maWxlUHVyZUNvbXB1dGF0aW9uLCBTQU5EQk9YX05BTUVELAorCSAgICAmZXJybXNnKSA9PSAtMSkKKwkJZmF0YWwoIiVzOiBzYW5kYm94X2luaXQ6ICVzIiwgX19mdW5jX18sIGVycm1zZyk7CisKKwkvKgorCSAqIFRoZSBrU0JYUHJvZmlsZVB1cmVDb21wdXRhdGlvbiBzdGlsbCBhbGxvd3Mgc29ja2V0cywgc28KKwkgKiB3ZSBtdXN0IGRpc2FibGUgdGhlc2UgdXNpbmcgcmxpbWl0LgorCSAqLworCXJsX3plcm8ucmxpbV9jdXIgPSBybF96ZXJvLnJsaW1fbWF4ID0gMDsKKwlpZiAoc2V0cmxpbWl0KFJMSU1JVF9GU0laRSwgJnJsX3plcm8pID09IC0xKQorCQlmYXRhbCgiJXM6IHNldHJsaW1pdChSTElNSVRfRlNJWkUsIHsgMCwgMCB9KTogJXMiLAorCQkJX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCAmcmxfemVybykgPT0gLTEpCisJCWZhdGFsKCIlczogc2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUsIHsgMCwgMCB9KTogJXMiLAorCQkJX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKHNldHJsaW1pdChSTElNSVRfTlBST0MsICZybF96ZXJvKSA9PSAtMSkKKwkJZmF0YWwoIiVzOiBzZXRybGltaXQoUkxJTUlUX05QUk9DLCB7IDAsIDAgfSk6ICVzIiwKKwkJCV9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworfQorCit2b2lkCitzc2hfc2FuZGJveF9wYXJlbnRfZmluaXNoKHN0cnVjdCBzc2hfc2FuZGJveCAqYm94KQoreworCWZyZWUoYm94KTsKKwlkZWJ1ZzMoIiVzOiBmaW5pc2hlZCIsIF9fZnVuY19fKTsKK30KKwordm9pZAorc3NoX3NhbmRib3hfcGFyZW50X3ByZWF1dGgoc3RydWN0IHNzaF9zYW5kYm94ICpib3gsIHBpZF90IGNoaWxkX3BpZCkKK3sKKwlib3gtPmNoaWxkX3BpZCA9IGNoaWxkX3BpZDsKK30KKworI2VuZGlmIC8qIFNBTkRCT1hfREFSV0lOICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NhbmRib3gtbnVsbC5jIGIvb3BlbnNzaC02LjBwMS9zYW5kYm94LW51bGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWZhOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zYW5kYm94LW51bGwuYwpAQCAtMCwwICsxLDcyIEBACisvKiAkT3BlbkJTRCQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaWZkZWYgU0FOREJPWF9OVUxMCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInNzaC1zYW5kYm94LmgiCisjaW5jbHVkZSAieG1hbGxvYy5oIgorCisvKiBkdW1teSBzYW5kYm94ICovCisKK3N0cnVjdCBzc2hfc2FuZGJveCB7CisJaW50IGp1bms7Cit9OworCitzdHJ1Y3Qgc3NoX3NhbmRib3ggKgorc3NoX3NhbmRib3hfaW5pdCh2b2lkKQoreworCXN0cnVjdCBzc2hfc2FuZGJveCAqYm94OworCisJLyoKKwkgKiBTdHJpY3RseSwgd2UgZG9uJ3QgbmVlZCB0byBtYWludGFpbiBhbnkgc3RhdGUgaGVyZSBidXQgd2UgbmVlZAorCSAqIHRvIHJldHVybiBub24tTlVMTCB0byBzYXRpc2Z5IHRoZSBBUEkuCisJICovCisJYm94ID0geGNhbGxvYygxLCBzaXplb2YoKmJveCkpOworCXJldHVybiBib3g7Cit9CisKK3ZvaWQKK3NzaF9zYW5kYm94X2NoaWxkKHN0cnVjdCBzc2hfc2FuZGJveCAqYm94KQoreworCS8qIE5vdGhpbmcgdG8gZG8gaGVyZSAqLworfQorCit2b2lkCitzc2hfc2FuZGJveF9wYXJlbnRfZmluaXNoKHN0cnVjdCBzc2hfc2FuZGJveCAqYm94KQoreworCWZyZWUoYm94KTsKK30KKwordm9pZAorc3NoX3NhbmRib3hfcGFyZW50X3ByZWF1dGgoc3RydWN0IHNzaF9zYW5kYm94ICpib3gsIHBpZF90IGNoaWxkX3BpZCkKK3sKKwkvKiBOb3RoaW5nIHRvIGRvIGhlcmUgKi8KK30KKworI2VuZGlmIC8qIFNBTkRCT1hfTlVMTCAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zYW5kYm94LXJsaW1pdC5jIGIvb3BlbnNzaC02LjBwMS9zYW5kYm94LXJsaW1pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MWU5MjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NhbmRib3gtcmxpbWl0LmMKQEAgLTAsMCArMSw5MyBAQAorLyogJE9wZW5CU0Q6IHNhbmRib3gtcmxpbWl0LmMsdiAxLjMgMjAxMS8wNi8yMyAwOTozNDoxMyBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaWZkZWYgU0FOREJPWF9STElNSVQKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJzc2gtc2FuZGJveC5oIgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKworLyogTWluaW1hbCBzYW5kYm94IHRoYXQgc2V0cyB6ZXJvIG5maWxlcywgbnByb2NzIGFuZCBmaWxlc2l6ZSBybGltaXRzICovCisKK3N0cnVjdCBzc2hfc2FuZGJveCB7CisJcGlkX3QgY2hpbGRfcGlkOworfTsKKworc3RydWN0IHNzaF9zYW5kYm94ICoKK3NzaF9zYW5kYm94X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc3NoX3NhbmRib3ggKmJveDsKKworCS8qCisJICogU3RyaWN0bHksIHdlIGRvbid0IG5lZWQgdG8gbWFpbnRhaW4gYW55IHN0YXRlIGhlcmUgYnV0IHdlIG5lZWQKKwkgKiB0byByZXR1cm4gbm9uLU5VTEwgdG8gc2F0aXNmeSB0aGUgQVBJLgorCSAqLworCWRlYnVnMygiJXM6IHByZXBhcmluZyBybGltaXQgc2FuZGJveCIsIF9fZnVuY19fKTsKKwlib3ggPSB4Y2FsbG9jKDEsIHNpemVvZigqYm94KSk7CisJYm94LT5jaGlsZF9waWQgPSAwOworCisJcmV0dXJuIGJveDsKK30KKwordm9pZAorc3NoX3NhbmRib3hfY2hpbGQoc3RydWN0IHNzaF9zYW5kYm94ICpib3gpCit7CisJc3RydWN0IHJsaW1pdCBybF96ZXJvOworCisJcmxfemVyby5ybGltX2N1ciA9IHJsX3plcm8ucmxpbV9tYXggPSAwOworCisJaWYgKHNldHJsaW1pdChSTElNSVRfRlNJWkUsICZybF96ZXJvKSA9PSAtMSkKKwkJZmF0YWwoIiVzOiBzZXRybGltaXQoUkxJTUlUX0ZTSVpFLCB7IDAsIDAgfSk6ICVzIiwKKwkJCV9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCWlmIChzZXRybGltaXQoUkxJTUlUX05PRklMRSwgJnJsX3plcm8pID09IC0xKQorCQlmYXRhbCgiJXM6IHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCB7IDAsIDAgfSk6ICVzIiwKKwkJCV9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworI2lmZGVmIEhBVkVfUkxJTUlUX05QUk9DCisJaWYgKHNldHJsaW1pdChSTElNSVRfTlBST0MsICZybF96ZXJvKSA9PSAtMSkKKwkJZmF0YWwoIiVzOiBzZXRybGltaXQoUkxJTUlUX05QUk9DLCB7IDAsIDAgfSk6ICVzIiwKKwkJCV9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworI2VuZGlmCit9CisKK3ZvaWQKK3NzaF9zYW5kYm94X3BhcmVudF9maW5pc2goc3RydWN0IHNzaF9zYW5kYm94ICpib3gpCit7CisJZnJlZShib3gpOworCWRlYnVnMygiJXM6IGZpbmlzaGVkIiwgX19mdW5jX18pOworfQorCit2b2lkCitzc2hfc2FuZGJveF9wYXJlbnRfcHJlYXV0aChzdHJ1Y3Qgc3NoX3NhbmRib3ggKmJveCwgcGlkX3QgY2hpbGRfcGlkKQoreworCWJveC0+Y2hpbGRfcGlkID0gY2hpbGRfcGlkOworfQorCisjZW5kaWYgLyogU0FOREJPWF9STElNSVQgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc2FuZGJveC1zZWNjb21wLWZpbHRlci5jIGIvb3BlbnNzaC02LjBwMS9zYW5kYm94LXNlY2NvbXAtZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg2ODEyOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc2FuZGJveC1zZWNjb21wLWZpbHRlci5jCkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIFdpbGwgRHJld3J5IDx3YWRAZGF0YXNwaWxsLm9yZz4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVW5jb21tZW50IHRoZSBTQU5EQk9YX1NFQ0NPTVBfRklMVEVSX0RFQlVHIG1hY3JvIGJlbG93IHRvIGhlbHAgZGlhZ25vc2UKKyAqIGZpbHRlciBicmVha2FnZSBkdXJpbmcgZGV2ZWxvcG1lbnQuICpEbyBub3QqIHVzZSB0aGlzIGluIHByb2R1Y3Rpb24sCisgKiBhcyBpdCByZWxpZXMgb24gbWFraW5nIGxpYnJhcnkgY2FsbHMgdGhhdCBhcmUgdW5zYWZlIGluIHNpZ25hbCBjb250ZXh0LgorICoKKyAqIEluc3RlYWQsIGxpdmUgc3lzdGVtcyB0aGUgYXVkaXRjdGwoOCkgbWF5IGJlIHVzZWQgdG8gbW9uaXRvciBmYWlsdXJlcy4KKyAqIEUuZy4KKyAqICAgYXVkaXRjdGwgLWEgdGFzayxhbHdheXMgLUYgdWlkPTxwcml2c2VwIHVpZD4KKyAqLworLyogI2RlZmluZSBTQU5EQk9YX1NFQ0NPTVBfRklMVEVSX0RFQlVHIDEgKi8KKworI2lmZGVmIFNBTkRCT1hfU0VDQ09NUF9GSUxURVJfREVCVUcKKy8qIFVzZSB0aGUga2VybmVsIGhlYWRlcnMgaW4gY2FzZSBvZiBhbiBvbGRlciB0b29sY2hhaW4uICovCisjIGluY2x1ZGUgPGFzbS9zaWdpbmZvLmg+CisjIGRlZmluZSBfX2hhdmVfc2lnaW5mb190IDEKKyMgZGVmaW5lIF9faGF2ZV9zaWd2YWxfdCAxCisjIGRlZmluZSBfX2hhdmVfc2lnZXZlbnRfdCAxCisjZW5kaWYgLyogU0FOREJPWF9TRUNDT01QX0ZJTFRFUl9ERUJVRyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2lmZGVmIFNBTkRCT1hfU0VDQ09NUF9GSUxURVIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorCisjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWNjb21wLmg+CisKKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPiAgLyogZm9yIG9mZnNldG9mICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInNzaC1zYW5kYm94LmgiCisjaW5jbHVkZSAieG1hbGxvYy5oIgorCisvKiBMaW51eCBzZWNjb21wX2ZpbHRlciBzYW5kYm94ICovCisjZGVmaW5lIFNFQ0NPTVBfRklMVEVSX0ZBSUwgU0VDQ09NUF9SRVRfS0lMTAorCisvKiBVc2UgYSBzaWduYWwgaGFuZGxlciB0byBlbWl0IHZpb2xhdGlvbnMgd2hlbiBkZWJ1Z2dpbmcgKi8KKyNpZmRlZiBTQU5EQk9YX1NFQ0NPTVBfRklMVEVSX0RFQlVHCisjIHVuZGVmIFNFQ0NPTVBfRklMVEVSX0ZBSUwKKyMgZGVmaW5lIFNFQ0NPTVBfRklMVEVSX0ZBSUwgU0VDQ09NUF9SRVRfVFJBUAorI2VuZGlmIC8qIFNBTkRCT1hfU0VDQ09NUF9GSUxURVJfREVCVUcgKi8KKworLyogU2ltcGxlIGhlbHBlcnMgdG8gYXZvaWQgbWFudWFsIGVycm9ycyAoYnV0IGxhcmdlciBCUEYgcHJvZ3JhbXMpLiAqLworI2RlZmluZSBTQ19ERU5ZKF9uciwgX2Vycm5vKSBcCisJQlBGX0pVTVAoQlBGX0pNUCtCUEZfSkVRK0JQRl9LLCBfX05SXyAjIyBfbnIsIDAsIDEpLCBcCisJQlBGX1NUTVQoQlBGX1JFVCtCUEZfSywgU0VDQ09NUF9SRVRfRVJSTk98KF9lcnJubykpCisjZGVmaW5lIFNDX0FMTE9XKF9ucikgXAorCUJQRl9KVU1QKEJQRl9KTVArQlBGX0pFUStCUEZfSywgX19OUl8gIyMgX25yLCAwLCAxKSwgXAorCUJQRl9TVE1UKEJQRl9SRVQrQlBGX0ssIFNFQ0NPTVBfUkVUX0FMTE9XKQorCisvKiBTeXNjYWxsIGZpbHRlcmluZyBzZXQgZm9yIHByZWF1dGguICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY2tfZmlsdGVyIHByZWF1dGhfaW5zbnNbXSA9IHsKKwkvKiBFbnN1cmUgdGhlIHN5c2NhbGwgYXJjaCBjb252ZW50aW9uIGlzIGFzIGV4cGVjdGVkLiAqLworCUJQRl9TVE1UKEJQRl9MRCtCUEZfVytCUEZfQUJTLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc2VjY29tcF9kYXRhLCBhcmNoKSksCisJQlBGX0pVTVAoQlBGX0pNUCtCUEZfSkVRK0JQRl9LLCBTRUNDT01QX0FVRElUX0FSQ0gsIDEsIDApLAorCUJQRl9TVE1UKEJQRl9SRVQrQlBGX0ssIFNFQ0NPTVBfRklMVEVSX0ZBSUwpLAorCS8qIExvYWQgdGhlIHN5c2NhbGwgbnVtYmVyIGZvciBjaGVja2luZy4gKi8KKwlCUEZfU1RNVChCUEZfTEQrQlBGX1crQlBGX0FCUywKKwkJb2Zmc2V0b2Yoc3RydWN0IHNlY2NvbXBfZGF0YSwgbnIpKSwKKwlTQ19ERU5ZKG9wZW4sIEVBQ0NFUyksCisJU0NfQUxMT1coZ2V0cGlkKSwKKwlTQ19BTExPVyhnZXR0aW1lb2ZkYXkpLAorCVNDX0FMTE9XKHRpbWUpLAorCVNDX0FMTE9XKHJlYWQpLAorCVNDX0FMTE9XKHdyaXRlKSwKKwlTQ19BTExPVyhjbG9zZSksCisJU0NfQUxMT1coYnJrKSwKKwlTQ19BTExPVyhwb2xsKSwKKyNpZmRlZiBfX05SX19uZXdzZWxlY3QKKwlTQ19BTExPVyhfbmV3c2VsZWN0KSwKKyNlbHNlCisJU0NfQUxMT1coc2VsZWN0KSwKKyNlbmRpZgorCVNDX0FMTE9XKG1hZHZpc2UpLAorCVNDX0FMTE9XKG1tYXApLAorCVNDX0FMTE9XKG11bm1hcCksCisJU0NfQUxMT1coZXhpdF9ncm91cCksCisjaWZkZWYgX19OUl9ydF9zaWdwcm9jbWFzaworCVNDX0FMTE9XKHJ0X3NpZ3Byb2NtYXNrKSwKKyNlbHNlCisJU0NfQUxMT1coc2lncHJvY21hc2spLAorI2VuZGlmCisJQlBGX1NUTVQoQlBGX1JFVCtCUEZfSywgU0VDQ09NUF9GSUxURVJfRkFJTCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY2tfZnByb2cgcHJlYXV0aF9wcm9ncmFtID0geworCS5sZW4gPSAodW5zaWduZWQgc2hvcnQpKHNpemVvZihwcmVhdXRoX2luc25zKS9zaXplb2YocHJlYXV0aF9pbnNuc1swXSkpLAorCS5maWx0ZXIgPSAoc3RydWN0IHNvY2tfZmlsdGVyICopcHJlYXV0aF9pbnNucywKK307CisKK3N0cnVjdCBzc2hfc2FuZGJveCB7CisJcGlkX3QgY2hpbGRfcGlkOworfTsKKworc3RydWN0IHNzaF9zYW5kYm94ICoKK3NzaF9zYW5kYm94X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc3NoX3NhbmRib3ggKmJveDsKKworCS8qCisJICogU3RyaWN0bHksIHdlIGRvbid0IG5lZWQgdG8gbWFpbnRhaW4gYW55IHN0YXRlIGhlcmUgYnV0IHdlIG5lZWQKKwkgKiB0byByZXR1cm4gbm9uLU5VTEwgdG8gc2F0aXNmeSB0aGUgQVBJLgorCSAqLworCWRlYnVnMygiJXM6IHByZXBhcmluZyBzZWNjb21wIGZpbHRlciBzYW5kYm94IiwgX19mdW5jX18pOworCWJveCA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpib3gpKTsKKwlib3gtPmNoaWxkX3BpZCA9IDA7CisKKwlyZXR1cm4gYm94OworfQorCisjaWZkZWYgU0FOREJPWF9TRUNDT01QX0ZJTFRFUl9ERUJVRworZXh0ZXJuIHN0cnVjdCBtb25pdG9yICpwbW9uaXRvcjsKK3ZvaWQgbW1fbG9nX2hhbmRsZXIoTG9nTGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIgKm1zZywgdm9pZCAqY3R4KTsKKworc3RhdGljIHZvaWQKK3NzaF9zYW5kYm94X3Zpb2xhdGlvbihpbnQgc2lnbnVtLCBzaWdpbmZvX3QgKmluZm8sIHZvaWQgKnZvaWRfY29udGV4dCkKK3sKKwljaGFyIG1zZ1syNTZdOworCisJc25wcmludGYobXNnLCBzaXplb2YobXNnKSwKKwkgICAgIiVzOiB1bmV4cGVjdGVkIHN5c3RlbSBjYWxsIChhcmNoOjB4JXgsc3lzY2FsbDolZCBAICVwKSIsCisJICAgIF9fZnVuY19fLCBpbmZvLT5zaV9hcmNoLCBpbmZvLT5zaV9zeXNjYWxsLCBpbmZvLT5zaV9jYWxsX2FkZHIpOworCW1tX2xvZ19oYW5kbGVyKFNZU0xPR19MRVZFTF9GQVRBTCwgbXNnLCBwbW9uaXRvcik7CisJX2V4aXQoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitzc2hfc2FuZGJveF9jaGlsZF9kZWJ1Z2dpbmcodm9pZCkKK3sKKwlzdHJ1Y3Qgc2lnYWN0aW9uIGFjdDsKKwlzaWdzZXRfdCBtYXNrOworCisJZGVidWczKCIlczogaW5zdGFsbGluZyBTSUdTWVMgaGFuZGxlciIsIF9fZnVuY19fKTsKKwltZW1zZXQoJmFjdCwgMCwgc2l6ZW9mKGFjdCkpOworCXNpZ2VtcHR5c2V0KCZtYXNrKTsKKwlzaWdhZGRzZXQoJm1hc2ssIFNJR1NZUyk7CisKKwlhY3Quc2Ffc2lnYWN0aW9uID0gJnNzaF9zYW5kYm94X3Zpb2xhdGlvbjsKKwlhY3Quc2FfZmxhZ3MgPSBTQV9TSUdJTkZPOworCWlmIChzaWdhY3Rpb24oU0lHU1lTLCAmYWN0LCBOVUxMKSA9PSAtMSkKKwkJZmF0YWwoIiVzOiBzaWdhY3Rpb24oU0lHU1lTKTogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwlpZiAoc2lncHJvY21hc2soU0lHX1VOQkxPQ0ssICZtYXNrLCBOVUxMKSA9PSAtMSkKKwkJZmF0YWwoIiVzOiBzaWdwcm9jbWFzayhTSUdTWVMpOiAlcyIsCisJCSAgICAgIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworfQorI2VuZGlmIC8qIFNBTkRCT1hfU0VDQ09NUF9GSUxURVJfREVCVUcgKi8KKwordm9pZAorc3NoX3NhbmRib3hfY2hpbGQoc3RydWN0IHNzaF9zYW5kYm94ICpib3gpCit7CisJc3RydWN0IHJsaW1pdCBybF96ZXJvOworCisJLyogU2V0IHJsaW1pdHMgZm9yIGNvbXBsZXRlbmVzcyBpZiBwb3NzaWJsZS4gKi8KKwlybF96ZXJvLnJsaW1fY3VyID0gcmxfemVyby5ybGltX21heCA9IDA7CisJaWYgKHNldHJsaW1pdChSTElNSVRfRlNJWkUsICZybF96ZXJvKSA9PSAtMSkKKwkJZmF0YWwoIiVzOiBzZXRybGltaXQoUkxJTUlUX0ZTSVpFLCB7IDAsIDAgfSk6ICVzIiwKKwkJCV9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCWlmIChzZXRybGltaXQoUkxJTUlUX05PRklMRSwgJnJsX3plcm8pID09IC0xKQorCQlmYXRhbCgiJXM6IHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCB7IDAsIDAgfSk6ICVzIiwKKwkJCV9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCWlmIChzZXRybGltaXQoUkxJTUlUX05QUk9DLCAmcmxfemVybykgPT0gLTEpCisJCWZhdGFsKCIlczogc2V0cmxpbWl0KFJMSU1JVF9OUFJPQywgeyAwLCAwIH0pOiAlcyIsCisJCQlfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKworI2lmZGVmIFNBTkRCT1hfU0VDQ09NUF9GSUxURVJfREVCVUcKKwlzc2hfc2FuZGJveF9jaGlsZF9kZWJ1Z2dpbmcoKTsKKyNlbmRpZiAvKiBTQU5EQk9YX1NFQ0NPTVBfRklMVEVSX0RFQlVHICovCisKKwlkZWJ1ZzMoIiVzOiBzZXR0aW5nIFBSX1NFVF9OT19ORVdfUFJJVlMiLCBfX2Z1bmNfXyk7CisJaWYgKHByY3RsKFBSX1NFVF9OT19ORVdfUFJJVlMsIDEsIDAsIDAsIDApID09IC0xKQorCQlmYXRhbCgiJXM6IHByY3RsKFBSX1NFVF9OT19ORVdfUFJJVlMpOiAlcyIsCisJCSAgICAgIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCWRlYnVnMygiJXM6IGF0dGFjaGluZyBzZWNjb21wIGZpbHRlciBwcm9ncmFtIiwgX19mdW5jX18pOworCWlmIChwcmN0bChQUl9TRVRfU0VDQ09NUCwgU0VDQ09NUF9NT0RFX0ZJTFRFUiwgJnByZWF1dGhfcHJvZ3JhbSkgPT0gLTEpCisJCWZhdGFsKCIlczogcHJjdGwoUFJfU0VUX1NFQ0NPTVApOiAlcyIsCisJCSAgICAgIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworfQorCit2b2lkCitzc2hfc2FuZGJveF9wYXJlbnRfZmluaXNoKHN0cnVjdCBzc2hfc2FuZGJveCAqYm94KQoreworCWZyZWUoYm94KTsKKwlkZWJ1ZzMoIiVzOiBmaW5pc2hlZCIsIF9fZnVuY19fKTsKK30KKwordm9pZAorc3NoX3NhbmRib3hfcGFyZW50X3ByZWF1dGgoc3RydWN0IHNzaF9zYW5kYm94ICpib3gsIHBpZF90IGNoaWxkX3BpZCkKK3sKKwlib3gtPmNoaWxkX3BpZCA9IGNoaWxkX3BpZDsKK30KKworI2VuZGlmIC8qIFNBTkRCT1hfU0VDQ09NUF9GSUxURVIgKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc2FuZGJveC1zeXN0cmFjZS5jIGIvb3BlbnNzaC02LjBwMS9zYW5kYm94LXN5c3RyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEzOWY0ZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc2FuZGJveC1zeXN0cmFjZS5jCkBAIC0wLDAgKzEsMTk4IEBACisvKiAkT3BlbkJTRDogc2FuZGJveC1zeXN0cmFjZS5jLHYgMS40IDIwMTEvMDcvMjkgMTQ6NDI6NDUgZGptIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIERhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2lmZGVmIFNBTkRCT1hfU1lTVFJBQ0UKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaW5jbHVkZSA8ZGV2L3N5c3RyYWNlLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImF0b21pY2lvLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAic3NoLXNhbmRib3guaCIKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisKK3N0cnVjdCBzYW5kYm94X3BvbGljeSB7CisJaW50IHN5c2NhbGw7CisJaW50IGFjdGlvbjsKK307CisKKy8qIFBlcm1pdHRlZCBzeXNjYWxscyBpbiBwcmVhdXRoLiBVbmxpc3RlZCBzeXNjYWxscyBnZXQgU1lTVFJfUE9MSUNZX0tJTEwgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2FuZGJveF9wb2xpY3kgcHJlYXV0aF9wb2xpY3lbXSA9IHsKKwl7IFNZU19vcGVuLCBTWVNUUl9QT0xJQ1lfTkVWRVIgfSwKKworCXsgU1lTX19fc3lzY3RsLCBTWVNUUl9QT0xJQ1lfUEVSTUlUIH0sCisJeyBTWVNfY2xvc2UsIFNZU1RSX1BPTElDWV9QRVJNSVQgfSwKKwl7IFNZU19leGl0LCBTWVNUUl9QT0xJQ1lfUEVSTUlUIH0sCisJeyBTWVNfZ2V0cGlkLCBTWVNUUl9QT0xJQ1lfUEVSTUlUIH0sCisJeyBTWVNfZ2V0dGltZW9mZGF5LCBTWVNUUl9QT0xJQ1lfUEVSTUlUIH0sCisJeyBTWVNfbWFkdmlzZSwgU1lTVFJfUE9MSUNZX1BFUk1JVCB9LAorCXsgU1lTX21tYXAsIFNZU1RSX1BPTElDWV9QRVJNSVQgfSwKKwl7IFNZU19tcHJvdGVjdCwgU1lTVFJfUE9MSUNZX1BFUk1JVCB9LAorCXsgU1lTX3BvbGwsIFNZU1RSX1BPTElDWV9QRVJNSVQgfSwKKwl7IFNZU19tdW5tYXAsIFNZU1RSX1BPTElDWV9QRVJNSVQgfSwKKwl7IFNZU19yZWFkLCBTWVNUUl9QT0xJQ1lfUEVSTUlUIH0sCisJeyBTWVNfc2VsZWN0LCBTWVNUUl9QT0xJQ1lfUEVSTUlUIH0sCisJeyBTWVNfc2lncHJvY21hc2ssIFNZU1RSX1BPTElDWV9QRVJNSVQgfSwKKwl7IFNZU193cml0ZSwgU1lTVFJfUE9MSUNZX1BFUk1JVCB9LAorCXsgLTEsIC0xIH0KK307CisKK3N0cnVjdCBzc2hfc2FuZGJveCB7CisJaW50IGNoaWxkX3NvY2s7CisJaW50IHBhcmVudF9zb2NrOworCWludCBzeXN0cmFjZV9mZDsKKwlwaWRfdCBjaGlsZF9waWQ7Cit9OworCitzdHJ1Y3Qgc3NoX3NhbmRib3ggKgorc3NoX3NhbmRib3hfaW5pdCh2b2lkKQoreworCXN0cnVjdCBzc2hfc2FuZGJveCAqYm94OworCWludCBzWzJdOworCisJZGVidWczKCIlczogcHJlcGFyaW5nIHN5c3RyYWNlIHNhbmRib3giLCBfX2Z1bmNfXyk7CisJYm94ID0geGNhbGxvYygxLCBzaXplb2YoKmJveCkpOworCWlmIChzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBzKSA9PSAtMSkKKwkJZmF0YWwoIiVzOiBzb2NrZXRwYWlyOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCWJveC0+Y2hpbGRfc29jayA9IHNbMF07CisJYm94LT5wYXJlbnRfc29jayA9IHNbMV07CisJYm94LT5zeXN0cmFjZV9mZCA9IC0xOworCWJveC0+Y2hpbGRfcGlkID0gMDsKKworCXJldHVybiBib3g7Cit9CisKK3ZvaWQKK3NzaF9zYW5kYm94X2NoaWxkKHN0cnVjdCBzc2hfc2FuZGJveCAqYm94KQoreworCWNoYXIgd2hhdGV2ZXIgPSAwOworCisJY2xvc2UoYm94LT5wYXJlbnRfc29jayk7CisJLyogU2lnbmFsIHBhcmVudCB0aGF0IHdlIGFyZSByZWFkeSAqLworCWRlYnVnMygiJXM6IHJlYWR5IiwgX19mdW5jX18pOworCWlmIChhdG9taWNpbyh2d3JpdGUsIGJveC0+Y2hpbGRfc29jaywgJndoYXRldmVyLCAxKSAhPSAxKQorCQlmYXRhbCgiJXM6IHdyaXRlOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCS8qIFdhaXQgZm9yIHBhcmVudCB0byBzaWduYWwgZm9yIHVzIHRvIGdvICovCisJaWYgKGF0b21pY2lvKHJlYWQsIGJveC0+Y2hpbGRfc29jaywgJndoYXRldmVyLCAxKSAhPSAxKQorCQlmYXRhbCgiJXM6IHJlYWQ6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJZGVidWczKCIlczogc3RhcnRlZCIsIF9fZnVuY19fKTsKKwljbG9zZShib3gtPmNoaWxkX3NvY2spOworfQorCitzdGF0aWMgdm9pZAorc3NoX3NhbmRib3hfcGFyZW50KHN0cnVjdCBzc2hfc2FuZGJveCAqYm94LCBwaWRfdCBjaGlsZF9waWQsCisgICAgY29uc3Qgc3RydWN0IHNhbmRib3hfcG9saWN5ICphbGxvd2VkX3N5c2NhbGxzKQoreworCWludCBkZXZfc3lzdHJhY2UsIGksIGosIGZvdW5kOworCWNoYXIgd2hhdGV2ZXIgPSAwOworCXN0cnVjdCBzeXN0cmFjZV9wb2xpY3kgcG9saWN5OworCisJZGVidWczKCIlczogd2FpdCBmb3IgY2hpbGQgJWxkIiwgX19mdW5jX18sIChsb25nKWNoaWxkX3BpZCk7CisJYm94LT5jaGlsZF9waWQgPSBjaGlsZF9waWQ7CisJY2xvc2UoYm94LT5jaGlsZF9zb2NrKTsKKwkvKiBXYWl0IGZvciBjaGlsZCB0byBzaWduYWwgdGhhdCBpdCBpcyByZWFkeSAqLworCWlmIChhdG9taWNpbyhyZWFkLCBib3gtPnBhcmVudF9zb2NrLCAmd2hhdGV2ZXIsIDEpICE9IDEpCisJCWZhdGFsKCIlczogcmVhZDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwlkZWJ1ZzMoIiVzOiBjaGlsZCAlbGQgcmVhZHkiLCBfX2Z1bmNfXywgKGxvbmcpY2hpbGRfcGlkKTsKKworCS8qIFNldCB1cCBzeXN0cmFjaW5nIG9mIGNoaWxkICovCisJaWYgKChkZXZfc3lzdHJhY2UgPSBvcGVuKCIvZGV2L3N5c3RyYWNlIiwgT19SRE9OTFkpKSA9PSAtMSkKKwkJZmF0YWwoIiVzOiBvcGVuKFwiL2Rldi9zeXN0cmFjZVwiKTogJXMiLCBfX2Z1bmNfXywKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKGlvY3RsKGRldl9zeXN0cmFjZSwgU1RSSU9DQ0xPTkUsICZib3gtPnN5c3RyYWNlX2ZkKSA9PSAtMSkKKwkJZmF0YWwoIiVzOiBpb2N0bChTVFJJT0NDTE9ORSwgJWQpOiAlcyIsIF9fZnVuY19fLAorCQkgICAgZGV2X3N5c3RyYWNlLCBzdHJlcnJvcihlcnJubykpOworCWNsb3NlKGRldl9zeXN0cmFjZSk7CisJZGVidWczKCIlczogc3lzdHJhY2UgYXR0YWNoLCBmZD0lZCIsIF9fZnVuY19fLCBib3gtPnN5c3RyYWNlX2ZkKTsKKwlpZiAoaW9jdGwoYm94LT5zeXN0cmFjZV9mZCwgU1RSSU9DQVRUQUNILCAmY2hpbGRfcGlkKSA9PSAtMSkKKwkJZmF0YWwoIiVzOiBpb2N0bCglZCwgU1RSSU9DQVRUQUNILCAlZCk6ICVzIiwgX19mdW5jX18sCisJCSAgICBib3gtPnN5c3RyYWNlX2ZkLCBjaGlsZF9waWQsIHN0cmVycm9yKGVycm5vKSk7CisKKwkvKiBBbGxvY2F0ZSBhbmQgYXNzaWduIHBvbGljeSAqLworCWJ6ZXJvKCZwb2xpY3ksIHNpemVvZihwb2xpY3kpKTsKKwlwb2xpY3kuc3RycF9vcCA9IFNZU1RSX1BPTElDWV9ORVc7CisJcG9saWN5LnN0cnBfbWF4ZW50cyA9IFNZU19NQVhTWVNDQUxMOworCWlmIChpb2N0bChib3gtPnN5c3RyYWNlX2ZkLCBTVFJJT0NQT0xJQ1ksICZwb2xpY3kpID09IC0xKQorCQlmYXRhbCgiJXM6IGlvY3RsKCVkLCBTVFJJT0NQT0xJQ1kgKG5ldykpOiAlcyIsIF9fZnVuY19fLAorCQkgICAgYm94LT5zeXN0cmFjZV9mZCwgc3RyZXJyb3IoZXJybm8pKTsKKworCXBvbGljeS5zdHJwX29wID0gU1lTVFJfUE9MSUNZX0FTU0lHTjsKKwlwb2xpY3kuc3RycF9waWQgPSBib3gtPmNoaWxkX3BpZDsKKwlpZiAoaW9jdGwoYm94LT5zeXN0cmFjZV9mZCwgU1RSSU9DUE9MSUNZLCAmcG9saWN5KSA9PSAtMSkKKwkJZmF0YWwoIiVzOiBpb2N0bCglZCwgU1RSSU9DUE9MSUNZIChhc3NpZ24pKTogJXMiLAorCQkgICAgX19mdW5jX18sIGJveC0+c3lzdHJhY2VfZmQsIHN0cmVycm9yKGVycm5vKSk7CisKKwkvKiBTZXQgcGVyLXN5c2NhbGwgcG9saWN5ICovCisJZm9yIChpID0gMDsgaSA8IFNZU19NQVhTWVNDQUxMOyBpKyspIHsKKwkJZm91bmQgPSAwOworCQlmb3IgKGogPSAwOyBhbGxvd2VkX3N5c2NhbGxzW2pdLnN5c2NhbGwgIT0gLTE7IGorKykgeworCQkJaWYgKGFsbG93ZWRfc3lzY2FsbHNbal0uc3lzY2FsbCA9PSBpKSB7CisJCQkJZm91bmQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXBvbGljeS5zdHJwX29wID0gU1lTVFJfUE9MSUNZX01PRElGWTsKKwkJcG9saWN5LnN0cnBfY29kZSA9IGk7CisJCXBvbGljeS5zdHJwX3BvbGljeSA9IGZvdW5kID8KKwkJICAgIGFsbG93ZWRfc3lzY2FsbHNbal0uYWN0aW9uIDogU1lTVFJfUE9MSUNZX0tJTEw7CisJCWlmIChmb3VuZCkKKwkJCWRlYnVnMygiJXM6IHBvbGljeTogZW5hYmxlIHN5c2NhbGwgJWQiLCBfX2Z1bmNfXywgaSk7CisJCWlmIChpb2N0bChib3gtPnN5c3RyYWNlX2ZkLCBTVFJJT0NQT0xJQ1ksICZwb2xpY3kpID09IC0xKQorCQkJZmF0YWwoIiVzOiBpb2N0bCglZCwgU1RSSU9DUE9MSUNZIChtb2RpZnkpKTogJXMiLAorCQkJICAgIF9fZnVuY19fLCBib3gtPnN5c3RyYWNlX2ZkLCBzdHJlcnJvcihlcnJubykpOworCX0KKworCS8qIFNpZ25hbCB0aGUgY2hpbGQgdG8gc3RhcnQgcnVubmluZyAqLworCWRlYnVnMygiJXM6IHN0YXJ0IGNoaWxkICVsZCIsIF9fZnVuY19fLCAobG9uZyljaGlsZF9waWQpOworCWlmIChhdG9taWNpbyh2d3JpdGUsIGJveC0+cGFyZW50X3NvY2ssICZ3aGF0ZXZlciwgMSkgIT0gMSkKKwkJZmF0YWwoIiVzOiB3cml0ZTogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwljbG9zZShib3gtPnBhcmVudF9zb2NrKTsKK30KKwordm9pZAorc3NoX3NhbmRib3hfcGFyZW50X2ZpbmlzaChzdHJ1Y3Qgc3NoX3NhbmRib3ggKmJveCkKK3sKKwkvKiBDbG9zaW5nIHRoaXMgYmVmb3JlIHRoZSBjaGlsZCBleGl0cyB3aWxsIHRlcm1pbmF0ZSBpdCAqLworCWNsb3NlKGJveC0+c3lzdHJhY2VfZmQpOworCisJZnJlZShib3gpOworCWRlYnVnMygiJXM6IGZpbmlzaGVkIiwgX19mdW5jX18pOworfQorCit2b2lkCitzc2hfc2FuZGJveF9wYXJlbnRfcHJlYXV0aChzdHJ1Y3Qgc3NoX3NhbmRib3ggKmJveCwgcGlkX3QgY2hpbGRfcGlkKQoreworCXNzaF9zYW5kYm94X3BhcmVudChib3gsIGNoaWxkX3BpZCwgcHJlYXV0aF9wb2xpY3kpOworfQorCisjZW5kaWYgLyogU0FOREJPWF9TWVNUUkFDRSAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zY2hub3JyLmMgYi9vcGVuc3NoLTYuMHAxL3NjaG5vcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDU0ZDY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zY2hub3JyLmMKQEAgLTAsMCArMSw2NzUgQEAKKy8qICRPcGVuQlNEOiBzY2hub3JyLmMsdiAxLjUgMjAxMC8xMi8wMyAyMzo0OToyNiBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggRGFtaWVuIE1pbGxlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mIFNjaG5vcnIgc2lnbmF0dXJlcyAvIHplcm8ta25vd2xlZGdlIHByb29mcywgYmFzZWQgb24KKyAqIGRlc2NyaXB0aW9uIGluOgorICogCQorICogRi4gSGFvLCBQLiBSeWFuLCAiUGFzc3dvcmQgQXV0aGVudGljYXRlZCBLZXkgRXhjaGFuZ2UgYnkgSnVnZ2xpbmciLAorICogMTZ0aCBXb3Jrc2hvcCBvbiBTZWN1cml0eSBQcm90b2NvbHMsIENhbWJyaWRnZSwgQXByaWwgMjAwOAorICoKKyAqIGh0dHA6Ly9ncm91cGVyLmllZWUub3JnL2dyb3Vwcy8xMzYzL1Jlc2VhcmNoL2NvbnRyaWJ1dGlvbnMvaGFvLXJ5YW4tMjAwOC5wZGYKKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImxvZy5oIgorCisjaW5jbHVkZSAic2Nobm9yci5oIgorCisjaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQuaCIKKworLyogI2RlZmluZSBTQ0hOT1JSX0RFQlVHICovCQkvKiBQcml2YWN5LXZpb2xhdGluZyBkZWJ1Z2dpbmcgKi8KKy8qICNkZWZpbmUgU0NITk9SUl9NQUlOICovCQkvKiBJbmNsdWRlIG1haW4oKSBzZWxmdGVzdCAqLworCisjaWZuZGVmIFNDSE5PUlJfREVCVUcKKyMgZGVmaW5lIFNDSE5PUlJfREVCVUdfQk4oYSkKKyMgZGVmaW5lIFNDSE5PUlJfREVCVUdfQlVGKGEpCisjZWxzZQorIyBkZWZpbmUgU0NITk9SUl9ERUJVR19CTihhKQlkZWJ1ZzNfYm4gYQorIyBkZWZpbmUgU0NITk9SUl9ERUJVR19CVUYoYSkJZGVidWczX2J1ZiBhCisjZW5kaWYgLyogU0NITk9SUl9ERUJVRyAqLworCisvKgorICogQ2FsY3VsYXRlIGhhc2ggY29tcG9uZW50IG9mIFNjaG5vcnIgc2lnbmF0dXJlIEgoZyB8fCBnXnYgfHwgZ154IHx8IGlkKQorICogdXNpbmcgdGhlIGhhc2ggZnVuY3Rpb24gZGVmaW5lZCBieSAiZXZwX21kIi4gUmV0dXJucyBzaWduYXR1cmUgYXMKKyAqIGJpZ251bSBvciBOVUxMIG9uIGVycm9yLgorICovCitzdGF0aWMgQklHTlVNICoKK3NjaG5vcnJfaGFzaChjb25zdCBCSUdOVU0gKnAsIGNvbnN0IEJJR05VTSAqcSwgY29uc3QgQklHTlVNICpnLAorICAgIGNvbnN0IEVWUF9NRCAqZXZwX21kLCBjb25zdCBCSUdOVU0gKmdfdiwgY29uc3QgQklHTlVNICpnX3gsCisgICAgY29uc3QgdV9jaGFyICppZCwgdV9pbnQgaWRsZW4pCit7CisJdV9jaGFyICpkaWdlc3Q7CisJdV9pbnQgZGlnZXN0X2xlbjsKKwlCSUdOVU0gKmg7CisJQnVmZmVyIGI7CisJaW50IHN1Y2Nlc3MgPSAtMTsKKworCWlmICgoaCA9IEJOX25ldygpKSA9PSBOVUxMKSB7CisJCWVycm9yKCIlczogQk5fbmV3IiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlidWZmZXJfaW5pdCgmYik7CisKKwkvKiBoID0gSChnIHx8IHAgfHwgcSB8fCBnXnYgfHwgZ154IHx8IGlkKSAqLworCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYiwgZyk7CisJYnVmZmVyX3B1dF9iaWdudW0yKCZiLCBwKTsKKwlidWZmZXJfcHV0X2JpZ251bTIoJmIsIHEpOworCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYiwgZ192KTsKKwlidWZmZXJfcHV0X2JpZ251bTIoJmIsIGdfeCk7CisJYnVmZmVyX3B1dF9zdHJpbmcoJmIsIGlkLCBpZGxlbik7CisKKwlTQ0hOT1JSX0RFQlVHX0JVRigoYnVmZmVyX3B0cigmYiksIGJ1ZmZlcl9sZW4oJmIpLAorCSAgICAiJXM6IGhhc2hibG9iIiwgX19mdW5jX18pKTsKKwlpZiAoaGFzaF9idWZmZXIoYnVmZmVyX3B0cigmYiksIGJ1ZmZlcl9sZW4oJmIpLCBldnBfbWQsCisJICAgICZkaWdlc3QsICZkaWdlc3RfbGVuKSAhPSAwKSB7CisJCWVycm9yKCIlczogaGFzaF9idWZmZXIiLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoQk5fYmluMmJuKGRpZ2VzdCwgKGludClkaWdlc3RfbGVuLCBoKSA9PSBOVUxMKSB7CisJCWVycm9yKCIlczogQk5fYmluMmJuIiwgX19mdW5jX18pOworCQlnb3RvIG91dDsKKwl9CisJc3VjY2VzcyA9IDA7CisJU0NITk9SUl9ERUJVR19CTigoaCwgIiVzOiBoID0gIiwgX19mdW5jX18pKTsKKyBvdXQ6CisJYnVmZmVyX2ZyZWUoJmIpOworCWJ6ZXJvKGRpZ2VzdCwgZGlnZXN0X2xlbik7CisJeGZyZWUoZGlnZXN0KTsKKwlkaWdlc3RfbGVuID0gMDsKKwlpZiAoc3VjY2VzcyA9PSAwKQorCQlyZXR1cm4gaDsKKwlCTl9jbGVhcl9mcmVlKGgpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogR2VuZXJhdGUgU2Nobm9yciBzaWduYXR1cmUgdG8gcHJvdmUga25vd2xlZGdlIG9mIHByaXZhdGUgdmFsdWUgJ3gnIHVzZWQKKyAqIGluIHB1YmxpYyBleHBvbmVudCBnXngsIHVuZGVyIGdyb3VwIGRlZmluZWQgYnkgJ2dycF9wJywgJ2dycF9xJyBhbmQgJ2dycF9nJworICogdXNpbmcgdGhlIGhhc2ggZnVuY3Rpb24gImV2cF9tZCIuCisgKiAnaWRsZW4nIGJ5dGVzIGZyb20gJ2lkJyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBzaWduYXR1cmUgaGFzaCBhcyBhbiBhbnRpLQorICogcmVwbGF5IHNhbHQuCisgKiAKKyAqIE9uIHN1Y2Nlc3MsIDAgaXMgcmV0dXJuZWQuIFRoZSBzaWduYXR1cmUgdmFsdWVzIGFyZSByZXR1cm5lZCBhcyAqZV9wCisgKiAoZ152IG1vZCBwKSBhbmQgKnJfcCAodiAtIHhoIG1vZCBxKS4gVGhlIGNhbGxlciBtdXN0IGZyZWUgdGhlc2UgdmFsdWVzLgorICogT24gZmFpbHVyZSwgLTEgaXMgcmV0dXJuZWQuCisgKi8KK2ludAorc2Nobm9ycl9zaWduKGNvbnN0IEJJR05VTSAqZ3JwX3AsIGNvbnN0IEJJR05VTSAqZ3JwX3EsIGNvbnN0IEJJR05VTSAqZ3JwX2csCisgICAgY29uc3QgRVZQX01EICpldnBfbWQsIGNvbnN0IEJJR05VTSAqeCwgY29uc3QgQklHTlVNICpnX3gsCisgICAgY29uc3QgdV9jaGFyICppZCwgdV9pbnQgaWRsZW4sIEJJR05VTSAqKnJfcCwgQklHTlVNICoqZV9wKQoreworCWludCBzdWNjZXNzID0gLTE7CisJQklHTlVNICpoLCAqdG1wLCAqdiwgKmdfdiwgKnI7CisJQk5fQ1RYICpibl9jdHg7CisKKwlTQ0hOT1JSX0RFQlVHX0JOKCh4LCAiJXM6IHggPSAiLCBfX2Z1bmNfXykpOworCVNDSE5PUlJfREVCVUdfQk4oKGdfeCwgIiVzOiBnX3ggPSAiLCBfX2Z1bmNfXykpOworCisJLyogQXZvaWQgZGVnZW5lcmF0ZSBjYXNlczogZ14wIHlpZWxkcyBhIHNwb29mYWJsZSBzaWduYXR1cmUgKi8KKwlpZiAoQk5fY21wKGdfeCwgQk5fdmFsdWVfb25lKCkpIDw9IDApIHsKKwkJZXJyb3IoIiVzOiBnX3ggPCAxIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChCTl9jbXAoZ194LCBncnBfcCkgPj0gMCkgeworCQllcnJvcigiJXM6IGdfeCA+IGciLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtMTsKKwl9CisKKwloID0gZ192ID0gciA9IHRtcCA9IHYgPSBOVUxMOworCWlmICgoYm5fY3R4ID0gQk5fQ1RYX25ldygpKSA9PSBOVUxMKSB7CisJCWVycm9yKCIlczogQk5fQ1RYX25ldyIsIF9fZnVuY19fKTsKKwkJZ290byBvdXQ7CisJfQorCWlmICgoZ192ID0gQk5fbmV3KCkpID09IE5VTEwgfHwKKwkgICAgKHIgPSBCTl9uZXcoKSkgPT0gTlVMTCB8fAorCSAgICAodG1wID0gQk5fbmV3KCkpID09IE5VTEwpIHsKKwkJZXJyb3IoIiVzOiBCTl9uZXciLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogdiBtdXN0IGJlIGEgcmFuZG9tIGVsZW1lbnQgb2YgWnEsIHNvIDEgPD0gdiA8IHEKKwkgKiB3ZSBhbHNvIGV4Y2x1ZGUgdiA9IDEsIHNpbmNlIGdeMSBsb29rcyBkYW5nZXJvdXMKKwkgKi8KKwlpZiAoKHYgPSBibl9yYW5kX3JhbmdlX2d0X29uZShncnBfcCkpID09IE5VTEwpIHsKKwkJZXJyb3IoIiVzOiBibl9yYW5kX3JhbmdlMiIsIF9fZnVuY19fKTsKKwkJZ290byBvdXQ7CisJfQorCVNDSE5PUlJfREVCVUdfQk4oKHYsICIlczogdiA9ICIsIF9fZnVuY19fKSk7CisKKwkvKiBnX3YgPSBnXnYgbW9kIHAgKi8KKwlpZiAoQk5fbW9kX2V4cChnX3YsIGdycF9nLCB2LCBncnBfcCwgYm5fY3R4KSA9PSAtMSkgeworCQllcnJvcigiJXM6IEJOX21vZF9leHAgKGdediBtb2QgcCkiLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0OworCX0KKwlTQ0hOT1JSX0RFQlVHX0JOKChnX3YsICIlczogZ192ID0gIiwgX19mdW5jX18pKTsKKworCS8qIGggPSBIKGcgfHwgZ152IHx8IGdeeCB8fCBpZCkgKi8KKwlpZiAoKGggPSBzY2hub3JyX2hhc2goZ3JwX3AsIGdycF9xLCBncnBfZywgZXZwX21kLCBnX3YsIGdfeCwKKwkgICAgaWQsIGlkbGVuKSkgPT0gTlVMTCkgeworCQllcnJvcigiJXM6IHNjaG5vcnJfaGFzaCBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIHIgPSB2IC0geGggbW9kIHEgKi8KKwlpZiAoQk5fbW9kX211bCh0bXAsIHgsIGgsIGdycF9xLCBibl9jdHgpID09IC0xKSB7CisJCWVycm9yKCIlczogQk5fbW9kX211bCAodG1wID0geHYgbW9kIHEpIiwgX19mdW5jX18pOworCQlnb3RvIG91dDsKKwl9CisJaWYgKEJOX21vZF9zdWIociwgdiwgdG1wLCBncnBfcSwgYm5fY3R4KSA9PSAtMSkgeworCQllcnJvcigiJXM6IEJOX21vZF9tdWwgKHIgPSB2IC0gdG1wKSIsIF9fZnVuY19fKTsKKwkJZ290byBvdXQ7CisJfQorCVNDSE5PUlJfREVCVUdfQk4oKGdfdiwgIiVzOiBlID0gIiwgX19mdW5jX18pKTsKKwlTQ0hOT1JSX0RFQlVHX0JOKChyLCAiJXM6IHIgPSAiLCBfX2Z1bmNfXykpOworCisJKmVfcCA9IGdfdjsKKwkqcl9wID0gcjsKKworCXN1Y2Nlc3MgPSAwOworIG91dDoKKwlCTl9DVFhfZnJlZShibl9jdHgpOworCWlmIChoICE9IE5VTEwpCisJCUJOX2NsZWFyX2ZyZWUoaCk7CisJaWYgKHYgIT0gTlVMTCkKKwkJQk5fY2xlYXJfZnJlZSh2KTsKKwlCTl9jbGVhcl9mcmVlKHRtcCk7CisKKwlyZXR1cm4gc3VjY2VzczsKK30KKworLyoKKyAqIEdlbmVyYXRlIFNjaG5vcnIgc2lnbmF0dXJlIHRvIHByb3ZlIGtub3dsZWRnZSBvZiBwcml2YXRlIHZhbHVlICd4JyB1c2VkCisgKiBpbiBwdWJsaWMgZXhwb25lbnQgZ154LCB1bmRlciBncm91cCBkZWZpbmVkIGJ5ICdncnBfcCcsICdncnBfcScgYW5kICdncnBfZycKKyAqIHVzaW5nIGEgU0hBMjU2IGhhc2guCisgKiAnaWRsZW4nIGJ5dGVzIGZyb20gJ2lkJyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBzaWduYXR1cmUgaGFzaCBhcyBhbiBhbnRpLQorICogcmVwbGF5IHNhbHQuCisgKiBPbiBzdWNjZXNzLCAwIGlzIHJldHVybmVkIGFuZCAqc2lnbGVuIGJ5dGVzIG9mIHNpZ25hdHVyZSBhcmUgcmV0dXJuZWQgaW4KKyAqICpzaWcgKGNhbGxlciB0byBmcmVlKS4gUmV0dXJucyAtMSBvbiBmYWlsdXJlLgorICovCitpbnQKK3NjaG5vcnJfc2lnbl9idWYoY29uc3QgQklHTlVNICpncnBfcCwgY29uc3QgQklHTlVNICpncnBfcSwgY29uc3QgQklHTlVNICpncnBfZywKKyAgICBjb25zdCBCSUdOVU0gKngsIGNvbnN0IEJJR05VTSAqZ194LCBjb25zdCB1X2NoYXIgKmlkLCB1X2ludCBpZGxlbiwKKyAgICB1X2NoYXIgKipzaWcsIHVfaW50ICpzaWdsZW4pCit7CisJQnVmZmVyIGI7CisJQklHTlVNICpyLCAqZTsKKworCWlmIChzY2hub3JyX3NpZ24oZ3JwX3AsIGdycF9xLCBncnBfZywgRVZQX3NoYTI1NigpLAorCSAgICB4LCBnX3gsIGlkLCBpZGxlbiwgJnIsICZlKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBTaWduYXR1cmUgaXMgKGUsIHIpICovCisJYnVmZmVyX2luaXQoJmIpOworCS8qIFhYWCBzaWd0eXBlLWhhc2ggYXMgc3RyaW5nPyAqLworCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYiwgZSk7CisJYnVmZmVyX3B1dF9iaWdudW0yKCZiLCByKTsKKwkqc2lnbGVuID0gYnVmZmVyX2xlbigmYik7CisJKnNpZyA9IHhtYWxsb2MoKnNpZ2xlbik7CisJbWVtY3B5KCpzaWcsIGJ1ZmZlcl9wdHIoJmIpLCAqc2lnbGVuKTsKKwlTQ0hOT1JSX0RFQlVHX0JVRigoYnVmZmVyX3B0cigmYiksIGJ1ZmZlcl9sZW4oJmIpLAorCSAgICAiJXM6IHNpZ2Jsb2IiLCBfX2Z1bmNfXykpOworCWJ1ZmZlcl9mcmVlKCZiKTsKKworCUJOX2NsZWFyX2ZyZWUocik7CisJQk5fY2xlYXJfZnJlZShlKTsKKworCXJldHVybiAwOworfQorCisvKgorICogVmVyaWZ5IFNjaG5vcnIgc2lnbmF0dXJlIHsgciAodiAtIHhoIG1vZCBxKSwgZSAoZ152IG1vZCBwKSB9IGFnYWluc3QKKyAqIHB1YmxpYyBleHBvbmVudCBnX3ggKGdeeCkgdW5kZXIgZ3JvdXAgZGVmaW5lZCBieSAnZ3JwX3AnLCAnZ3JwX3EnIGFuZAorICogJ2dycF9nJyB1c2luZyBoYXNoICJldnBfbWQiLgorICogU2lnbmF0dXJlIGhhc2ggd2lsbCBiZSBzYWx0ZWQgd2l0aCAnaWRsZW4nIGJ5dGVzIGZyb20gJ2lkJy4KKyAqIFJldHVybnMgLTEgb24gZmFpbHVyZSwgMCBvbiBpbmNvcnJlY3Qgc2lnbmF0dXJlIG9yIDEgb24gbWF0Y2hpbmcgc2lnbmF0dXJlLgorICovCitpbnQKK3NjaG5vcnJfdmVyaWZ5KGNvbnN0IEJJR05VTSAqZ3JwX3AsIGNvbnN0IEJJR05VTSAqZ3JwX3EsIGNvbnN0IEJJR05VTSAqZ3JwX2csCisgICAgY29uc3QgRVZQX01EICpldnBfbWQsIGNvbnN0IEJJR05VTSAqZ194LCBjb25zdCB1X2NoYXIgKmlkLCB1X2ludCBpZGxlbiwKKyAgICBjb25zdCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqZSkKK3sKKwlpbnQgc3VjY2VzcyA9IC0xOworCUJJR05VTSAqaCA9IE5VTEwsICpnX3hoID0gTlVMTCwgKmdfciA9IE5VTEwsICpneF9xID0gTlVMTDsKKwlCSUdOVU0gKmV4cGVjdGVkID0gTlVMTDsKKwlCTl9DVFggKmJuX2N0eDsKKworCVNDSE5PUlJfREVCVUdfQk4oKGdfeCwgIiVzOiBnX3ggPSAiLCBfX2Z1bmNfXykpOworCisJLyogQXZvaWQgZGVnZW5lcmF0ZSBjYXNlczogZ14wIHlpZWxkcyBhIHNwb29mYWJsZSBzaWduYXR1cmUgKi8KKwlpZiAoQk5fY21wKGdfeCwgQk5fdmFsdWVfb25lKCkpIDw9IDApIHsKKwkJZXJyb3IoIiVzOiBnX3ggPD0gMSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoQk5fY21wKGdfeCwgZ3JwX3ApID49IDApIHsKKwkJZXJyb3IoIiVzOiBnX3ggPj0gcCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWggPSBnX3hoID0gZ19yID0gZXhwZWN0ZWQgPSBOVUxMOworCWlmICgoYm5fY3R4ID0gQk5fQ1RYX25ldygpKSA9PSBOVUxMKSB7CisJCWVycm9yKCIlczogQk5fQ1RYX25ldyIsIF9fZnVuY19fKTsKKwkJZ290byBvdXQ7CisJfQorCWlmICgoZ194aCA9IEJOX25ldygpKSA9PSBOVUxMIHx8CisJICAgIChnX3IgPSBCTl9uZXcoKSkgPT0gTlVMTCB8fAorCSAgICAoZ3hfcSA9IEJOX25ldygpKSA9PSBOVUxMIHx8CisJICAgIChleHBlY3RlZCA9IEJOX25ldygpKSA9PSBOVUxMKSB7CisJCWVycm9yKCIlczogQk5fbmV3IiwgX19mdW5jX18pOworCQlnb3RvIG91dDsKKwl9CisKKwlTQ0hOT1JSX0RFQlVHX0JOKChlLCAiJXM6IGUgPSAiLCBfX2Z1bmNfXykpOworCVNDSE5PUlJfREVCVUdfQk4oKHIsICIlczogciA9ICIsIF9fZnVuY19fKSk7CisKKwkvKiBneF9xID0gKGdeeClecSBtdXN0ID09PSAxIG1vZCBwICovCisJaWYgKEJOX21vZF9leHAoZ3hfcSwgZ194LCBncnBfcSwgZ3JwX3AsIGJuX2N0eCkgPT0gLTEpIHsKKwkJZXJyb3IoIiVzOiBCTl9tb2RfZXhwIChnX3hecSBtb2QgcCkiLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoQk5fY21wKGd4X3EsIEJOX3ZhbHVlX29uZSgpKSAhPSAwKSB7CisJCWVycm9yKCIlczogSW52YWxpZCBzaWduYXR1cmUgKGdeeClecSAhPSAxIG1vZCBwIiwgX19mdW5jX18pOworCQlnb3RvIG91dDsKKwl9CisKKwlTQ0hOT1JSX0RFQlVHX0JOKChnX3hoLCAiJXM6IGdfeGggPSAiLCBfX2Z1bmNfXykpOworCS8qIGggPSBIKGcgfHwgZ152IHx8IGdeeCB8fCBpZCkgKi8KKwlpZiAoKGggPSBzY2hub3JyX2hhc2goZ3JwX3AsIGdycF9xLCBncnBfZywgZXZwX21kLCBlLCBnX3gsCisJICAgIGlkLCBpZGxlbikpID09IE5VTEwpIHsKKwkJZXJyb3IoIiVzOiBzY2hub3JyX2hhc2ggZmFpbGVkIiwgX19mdW5jX18pOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBnX3hoID0gKGdeeCleaCAqLworCWlmIChCTl9tb2RfZXhwKGdfeGgsIGdfeCwgaCwgZ3JwX3AsIGJuX2N0eCkgPT0gLTEpIHsKKwkJZXJyb3IoIiVzOiBCTl9tb2RfZXhwIChnX3heaCBtb2QgcCkiLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0OworCX0KKwlTQ0hOT1JSX0RFQlVHX0JOKChnX3hoLCAiJXM6IGdfeGggPSAiLCBfX2Z1bmNfXykpOworCisJLyogZ19yID0gZ15yICovCisJaWYgKEJOX21vZF9leHAoZ19yLCBncnBfZywgciwgZ3JwX3AsIGJuX2N0eCkgPT0gLTEpIHsKKwkJZXJyb3IoIiVzOiBCTl9tb2RfZXhwIChnX3heaCBtb2QgcCkiLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0OworCX0KKwlTQ0hOT1JSX0RFQlVHX0JOKChnX3IsICIlczogZ19yID0gIiwgX19mdW5jX18pKTsKKworCS8qIGV4cGVjdGVkID0gZ15yICogZ194aCAqLworCWlmIChCTl9tb2RfbXVsKGV4cGVjdGVkLCBnX3IsIGdfeGgsIGdycF9wLCBibl9jdHgpID09IC0xKSB7CisJCWVycm9yKCIlczogQk5fbW9kX211bCAoZXhwZWN0ZWQgPSBnX3IgbW9kIHApIiwgX19mdW5jX18pOworCQlnb3RvIG91dDsKKwl9CisJU0NITk9SUl9ERUJVR19CTigoZXhwZWN0ZWQsICIlczogZXhwZWN0ZWQgPSAiLCBfX2Z1bmNfXykpOworCisJLyogQ2hlY2sgZSA9PSBleHBlY3RlZCAqLworCXN1Y2Nlc3MgPSBCTl9jbXAoZXhwZWN0ZWQsIGUpID09IDA7Cisgb3V0OgorCUJOX0NUWF9mcmVlKGJuX2N0eCk7CisJaWYgKGggIT0gTlVMTCkKKwkJQk5fY2xlYXJfZnJlZShoKTsKKwlpZiAoZ3hfcSAhPSBOVUxMKQorCQlCTl9jbGVhcl9mcmVlKGd4X3EpOworCWlmIChnX3hoICE9IE5VTEwpCisJCUJOX2NsZWFyX2ZyZWUoZ194aCk7CisJaWYgKGdfciAhPSBOVUxMKQorCQlCTl9jbGVhcl9mcmVlKGdfcik7CisJaWYgKGV4cGVjdGVkICE9IE5VTEwpCisJCUJOX2NsZWFyX2ZyZWUoZXhwZWN0ZWQpOworCXJldHVybiBzdWNjZXNzOworfQorCisvKgorICogVmVyaWZ5IFNjaG5vcnIgc2lnbmF0dXJlICdzaWcnIG9mIGxlbmd0aCAnc2lnbGVuJyBhZ2FpbnN0IHB1YmxpYyBleHBvbmVudAorICogZ194IChnXngpIHVuZGVyIGdyb3VwIGRlZmluZWQgYnkgJ2dycF9wJywgJ2dycF9xJyBhbmQgJ2dycF9nJyB1c2luZyBhCisgKiBTSEEyNTYgaGFzaC4KKyAqIFNpZ25hdHVyZSBoYXNoIHdpbGwgYmUgc2FsdGVkIHdpdGggJ2lkbGVuJyBieXRlcyBmcm9tICdpZCcuCisgKiBSZXR1cm5zIC0xIG9uIGZhaWx1cmUsIDAgb24gaW5jb3JyZWN0IHNpZ25hdHVyZSBvciAxIG9uIG1hdGNoaW5nIHNpZ25hdHVyZS4KKyAqLworaW50CitzY2hub3JyX3ZlcmlmeV9idWYoY29uc3QgQklHTlVNICpncnBfcCwgY29uc3QgQklHTlVNICpncnBfcSwKKyAgICBjb25zdCBCSUdOVU0gKmdycF9nLAorICAgIGNvbnN0IEJJR05VTSAqZ194LCBjb25zdCB1X2NoYXIgKmlkLCB1X2ludCBpZGxlbiwKKyAgICBjb25zdCB1X2NoYXIgKnNpZywgdV9pbnQgc2lnbGVuKQoreworCUJ1ZmZlciBiOworCWludCByZXQgPSAtMTsKKwl1X2ludCBybGVuOworCUJJR05VTSAqciwgKmU7CisKKwllID0gciA9IE5VTEw7CisJaWYgKChlID0gQk5fbmV3KCkpID09IE5VTEwgfHwKKwkgICAgKHIgPSBCTl9uZXcoKSkgPT0gTlVMTCkgeworCQllcnJvcigiJXM6IEJOX25ldyIsIF9fZnVuY19fKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRXh0cmFjdCBnXnYgYW5kIHIgZnJvbSBzaWduYXR1cmUgYmxvYiAqLworCWJ1ZmZlcl9pbml0KCZiKTsKKwlidWZmZXJfYXBwZW5kKCZiLCBzaWcsIHNpZ2xlbik7CisJU0NITk9SUl9ERUJVR19CVUYoKGJ1ZmZlcl9wdHIoJmIpLCBidWZmZXJfbGVuKCZiKSwKKwkgICAgIiVzOiBzaWdibG9iIiwgX19mdW5jX18pKTsKKwlidWZmZXJfZ2V0X2JpZ251bTIoJmIsIGUpOworCWJ1ZmZlcl9nZXRfYmlnbnVtMigmYiwgcik7CisJcmxlbiA9IGJ1ZmZlcl9sZW4oJmIpOworCWJ1ZmZlcl9mcmVlKCZiKTsKKwlpZiAocmxlbiAhPSAwKSB7CisJCWVycm9yKCIlczogcmVtYWluaW5nIGJ5dGVzIGluIHNpZ25hdHVyZSAlZCIsIF9fZnVuY19fLCBybGVuKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gc2Nobm9ycl92ZXJpZnkoZ3JwX3AsIGdycF9xLCBncnBfZywgRVZQX3NoYTI1NigpLAorCSAgICBnX3gsIGlkLCBpZGxlbiwgciwgZSk7Cisgb3V0OgorCUJOX2NsZWFyX2ZyZWUoZSk7CisJQk5fY2xlYXJfZnJlZShyKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIEhlbHBlciBmdW5jdGlvbnMgKi8KKworLyoKKyAqIEdlbmVyYXRlIHVuaWZvcm1seSBkaXN0cmlidXRlZCByYW5kb20gbnVtYmVyIGluIHJhbmdlICgxLCBoaWdoKS4KKyAqIFJldHVybiBudW1iZXIgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgorICovCitCSUdOVU0gKgorYm5fcmFuZF9yYW5nZV9ndF9vbmUoY29uc3QgQklHTlVNICpoaWdoKQoreworCUJJR05VTSAqciwgKnRtcDsKKwlpbnQgc3VjY2VzcyA9IC0xOworCisJaWYgKCh0bXAgPSBCTl9uZXcoKSkgPT0gTlVMTCkgeworCQllcnJvcigiJXM6IEJOX25ldyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICgociA9IEJOX25ldygpKSA9PSBOVUxMKSB7CisJCWVycm9yKCIlczogQk5fbmV3IGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChCTl9zZXRfd29yZCh0bXAsIDIpICE9IDEpIHsKKwkJZXJyb3IoIiVzOiBCTl9zZXRfd29yZCh0bXAsIDIpIiwgX19mdW5jX18pOworCQlnb3RvIG91dDsKKwl9CisJaWYgKEJOX3N1Yih0bXAsIGhpZ2gsIHRtcCkgPT0gLTEpIHsKKwkJZXJyb3IoIiVzOiBCTl9zdWIgZmFpbGVkICh0bXAgPSBoaWdoIC0gMikiLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoQk5fcmFuZF9yYW5nZShyLCB0bXApID09IC0xKSB7CisJCWVycm9yKCIlczogQk5fcmFuZF9yYW5nZSBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoQk5fc2V0X3dvcmQodG1wLCAyKSAhPSAxKSB7CisJCWVycm9yKCIlczogQk5fc2V0X3dvcmQodG1wLCAyKSIsIF9fZnVuY19fKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChCTl9hZGQociwgciwgdG1wKSA9PSAtMSkgeworCQllcnJvcigiJXM6IEJOX2FkZCBmYWlsZWQgKHIgPSByICsgMikiLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0OworCX0KKwlzdWNjZXNzID0gMDsKKyBvdXQ6CisJQk5fY2xlYXJfZnJlZSh0bXApOworCWlmIChzdWNjZXNzID09IDApCisJCXJldHVybiByOworCUJOX2NsZWFyX2ZyZWUocik7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBIYXNoIGNvbnRlbnRzIG9mIGJ1ZmZlciAnYicgd2l0aCBoYXNoICdtZCcuIFJldHVybnMgMCBvbiBzdWNjZXNzLAorICogd2l0aCBkaWdlc3QgdmlhICdkaWdlc3RwJyAoY2FsbGVyIHRvIGZyZWUpIGFuZCBsZW5ndGggdmlhICdsZW5wJy4KKyAqIFJldHVybnMgLTEgb24gZmFpbHVyZS4KKyAqLworaW50CitoYXNoX2J1ZmZlcihjb25zdCB1X2NoYXIgKmJ1ZiwgdV9pbnQgbGVuLCBjb25zdCBFVlBfTUQgKm1kLAorICAgIHVfY2hhciAqKmRpZ2VzdHAsIHVfaW50ICpsZW5wKQoreworCXVfY2hhciBkaWdlc3RbRVZQX01BWF9NRF9TSVpFXTsKKwl1X2ludCBkaWdlc3RfbGVuOworCUVWUF9NRF9DVFggZXZwX21kX2N0eDsKKwlpbnQgc3VjY2VzcyA9IC0xOworCisJRVZQX01EX0NUWF9pbml0KCZldnBfbWRfY3R4KTsKKworCWlmIChFVlBfRGlnZXN0SW5pdF9leCgmZXZwX21kX2N0eCwgbWQsIE5VTEwpICE9IDEpIHsKKwkJZXJyb3IoIiVzOiBFVlBfRGlnZXN0SW5pdF9leCIsIF9fZnVuY19fKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChFVlBfRGlnZXN0VXBkYXRlKCZldnBfbWRfY3R4LCBidWYsIGxlbikgIT0gMSkgeworCQllcnJvcigiJXM6IEVWUF9EaWdlc3RVcGRhdGUiLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoRVZQX0RpZ2VzdEZpbmFsX2V4KCZldnBfbWRfY3R4LCBkaWdlc3QsICZkaWdlc3RfbGVuKSAhPSAxKSB7CisJCWVycm9yKCIlczogRVZQX0RpZ2VzdEZpbmFsX2V4IiwgX19mdW5jX18pOworCQlnb3RvIG91dDsKKwl9CisJKmRpZ2VzdHAgPSB4bWFsbG9jKGRpZ2VzdF9sZW4pOworCSpsZW5wID0gZGlnZXN0X2xlbjsKKwltZW1jcHkoKmRpZ2VzdHAsIGRpZ2VzdCwgKmxlbnApOworCXN1Y2Nlc3MgPSAwOworIG91dDoKKwlFVlBfTURfQ1RYX2NsZWFudXAoJmV2cF9tZF9jdHgpOworCWJ6ZXJvKGRpZ2VzdCwgc2l6ZW9mKGRpZ2VzdCkpOworCWRpZ2VzdF9sZW4gPSAwOworCXJldHVybiBzdWNjZXNzOworfQorCisvKiBwcmludCBmb3JtYXR0ZWQgc3RyaW5nIGZvbGxvd2VkIGJ5IGJpZ251bSAqLwordm9pZAorZGVidWczX2JuKGNvbnN0IEJJR05VTSAqbiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJY2hhciAqb3V0LCAqaDsKKwl2YV9saXN0IGFyZ3M7CisKKwlvdXQgPSBOVUxMOworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdmFzcHJpbnRmKCZvdXQsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCWlmIChvdXQgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiB2YXNwcmludGYgZmFpbGVkIiwgX19mdW5jX18pOworCisJaWYgKG4gPT0gTlVMTCkKKwkJZGVidWczKCIlcyhudWxsKSIsIG91dCk7CisJZWxzZSB7CisJCWggPSBCTl9ibjJoZXgobik7CisJCWRlYnVnMygiJXMweCVzIiwgb3V0LCBoKTsKKwkJZnJlZShoKTsKKwl9CisJZnJlZShvdXQpOworfQorCisvKiBwcmludCBmb3JtYXR0ZWQgc3RyaW5nIGZvbGxvd2VkIGJ5IGJ1ZmZlciBjb250ZW50cyBpbiBoZXggKi8KK3ZvaWQKK2RlYnVnM19idWYoY29uc3QgdV9jaGFyICpidWYsIHVfaW50IGxlbiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJY2hhciAqb3V0LCBoWzY1XTsKKwl1X2ludCBpLCBqOworCXZhX2xpc3QgYXJnczsKKworCW91dCA9IE5VTEw7CisJdmFfc3RhcnQoYXJncywgZm10KTsKKwl2YXNwcmludGYoJm91dCwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJaWYgKG91dCA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IHZhc3ByaW50ZiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisKKwlkZWJ1ZzMoIiVzIGxlbmd0aCAldSVzIiwgb3V0LCBsZW4sIGJ1ZiA9PSBOVUxMID8gIiAobnVsbCkiIDogIiIpOworCWZyZWUob3V0KTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybjsKKworCSpoID0gJ1wwJzsKKwlmb3IgKGkgPSBqID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCXNucHJpbnRmKGggKyBqLCBzaXplb2YoaCkgLSBqLCAiJTAyeCIsIGJ1ZltpXSk7CisJCWogKz0gMjsKKwkJaWYgKGogPj0gc2l6ZW9mKGgpIC0gMSB8fCBpID09IGxlbiAtIDEpIHsKKwkJCWRlYnVnMygiICAgICVzIiwgaCk7CisJCQkqaCA9ICdcMCc7CisJCQlqID0gMDsKKwkJfQorCX0KK30KKworLyoKKyAqIENvbnN0cnVjdCBhIE1PRFAgZ3JvdXAgZnJvbSBoZXggc3RyaW5ncyBwICh3aGljaCBtdXN0IGJlIGEgc2FmZQorICogcHJpbWUpIGFuZCBnLCBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0aW5nIHN1Ymdyb3VwIHEgYXMgKHAgLyAyKQorICovCitzdHJ1Y3QgbW9kcF9ncm91cCAqCittb2RwX2dyb3VwX2Zyb21fZ19hbmRfc2FmZV9wKGNvbnN0IGNoYXIgKmdycF9nLCBjb25zdCBjaGFyICpncnBfcCkKK3sKKwlzdHJ1Y3QgbW9kcF9ncm91cCAqcmV0OworCisJcmV0ID0geG1hbGxvYyhzaXplb2YoKnJldCkpOworCXJldC0+cCA9IHJldC0+cSA9IHJldC0+ZyA9IE5VTEw7CisJaWYgKEJOX2hleDJibigmcmV0LT5wLCBncnBfcCkgPT0gMCB8fAorCSAgICBCTl9oZXgyYm4oJnJldC0+ZywgZ3JwX2cpID09IDApCisJCWZhdGFsKCIlczogQk5faGV4MmJuIiwgX19mdW5jX18pOworCS8qIFN1Ymdyb3VwIG9yZGVyIGlzIHAvMiAocCBpcyBhIHNhZmUgcHJpbWUpICovCisJaWYgKChyZXQtPnEgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBCTl9uZXciLCBfX2Z1bmNfXyk7CisJaWYgKEJOX3JzaGlmdDEocmV0LT5xLCByZXQtPnApICE9IDEpCisJCWZhdGFsKCIlczogQk5fcnNoaWZ0MSIsIF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK21vZHBfZ3JvdXBfZnJlZShzdHJ1Y3QgbW9kcF9ncm91cCAqZ3JwKQoreworCWlmIChncnAtPmcgIT0gTlVMTCkKKwkJQk5fY2xlYXJfZnJlZShncnAtPmcpOworCWlmIChncnAtPnAgIT0gTlVMTCkKKwkJQk5fY2xlYXJfZnJlZShncnAtPnApOworCWlmIChncnAtPnEgIT0gTlVMTCkKKwkJQk5fY2xlYXJfZnJlZShncnAtPnEpOworCWJ6ZXJvKGdycCwgc2l6ZW9mKCpncnApKTsKKwl4ZnJlZShncnApOworfQorCisvKiBtYWluKCkgZnVuY3Rpb24gZm9yIHNlbGYtdGVzdCAqLworCisjaWZkZWYgU0NITk9SUl9NQUlOCitzdGF0aWMgdm9pZAorc2Nobm9ycl9zZWxmdGVzdF9vbmUoY29uc3QgQklHTlVNICpncnBfcCwgY29uc3QgQklHTlVNICpncnBfcSwKKyAgICBjb25zdCBCSUdOVU0gKmdycF9nLCBjb25zdCBCSUdOVU0gKngpCit7CisJQklHTlVNICpnX3g7CisJdV9jaGFyICpzaWc7CisJdV9pbnQgc2lnbGVuOworCUJOX0NUWCAqYm5fY3R4OworCisJaWYgKChibl9jdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCIlczogQk5fQ1RYX25ldyIsIF9fZnVuY19fKTsKKwlpZiAoKGdfeCA9IEJOX25ldygpKSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IEJOX25ldyIsIF9fZnVuY19fKTsKKworCWlmIChCTl9tb2RfZXhwKGdfeCwgZ3JwX2csIHgsIGdycF9wLCBibl9jdHgpID09IC0xKQorCQlmYXRhbCgiJXM6IGdfeCIsIF9fZnVuY19fKTsKKwlpZiAoc2Nobm9ycl9zaWduX2J1ZihncnBfcCwgZ3JwX3EsIGdycF9nLCB4LCBnX3gsICJqdW5rIiwgNCwKKwkgICAgJnNpZywgJnNpZ2xlbikpCisJCWZhdGFsKCIlczogc2Nobm9ycl9zaWduIiwgX19mdW5jX18pOworCWlmIChzY2hub3JyX3ZlcmlmeV9idWYoZ3JwX3AsIGdycF9xLCBncnBfZywgZ194LCAianVuayIsIDQsCisJICAgIHNpZywgc2lnbGVuKSAhPSAxKQorCQlmYXRhbCgiJXM6IHZlcmlmeSBmYWlsIiwgX19mdW5jX18pOworCWlmIChzY2hub3JyX3ZlcmlmeV9idWYoZ3JwX3AsIGdycF9xLCBncnBfZywgZ194LCAiSlVOSyIsIDQsCisJICAgIHNpZywgc2lnbGVuKSAhPSAwKQorCQlmYXRhbCgiJXM6IHZlcmlmeSBzaG91bGQgaGF2ZSBmYWlsZWQgKGJhZCBJRCkiLCBfX2Z1bmNfXyk7CisJc2lnWzRdIF49IDE7CisJaWYgKHNjaG5vcnJfdmVyaWZ5X2J1ZihncnBfcCwgZ3JwX3EsIGdycF9nLCBnX3gsICJqdW5rIiwgNCwKKwkgICAgc2lnLCBzaWdsZW4pICE9IDApCisJCWZhdGFsKCIlczogdmVyaWZ5IHNob3VsZCBoYXZlIGZhaWxlZCAoYml0IGVycm9yKSIsIF9fZnVuY19fKTsKKwl4ZnJlZShzaWcpOworCUJOX2ZyZWUoZ194KTsKKwlCTl9DVFhfZnJlZShibl9jdHgpOworfQorCitzdGF0aWMgdm9pZAorc2Nobm9ycl9zZWxmdGVzdCh2b2lkKQoreworCUJJR05VTSAqeDsKKwlzdHJ1Y3QgbW9kcF9ncm91cCAqZ3JwOworCXVfaW50IGk7CisJY2hhciAqaGg7CisKKwlncnAgPSBqcGFrZV9kZWZhdWx0X2dyb3VwKCk7CisJaWYgKCh4ID0gQk5fbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCIlczogQk5fbmV3IiwgX19mdW5jX18pOworCVNDSE5PUlJfREVCVUdfQk4oKGdycC0+cCwgIiVzOiBncnAtPnAgPSAiLCBfX2Z1bmNfXykpOworCVNDSE5PUlJfREVCVUdfQk4oKGdycC0+cSwgIiVzOiBncnAtPnEgPSAiLCBfX2Z1bmNfXykpOworCVNDSE5PUlJfREVCVUdfQk4oKGdycC0+ZywgIiVzOiBncnAtPmcgPSAiLCBfX2Z1bmNfXykpOworCisJLyogWzEsIDIwKSAqLworCWZvciAoaSA9IDE7IGkgPCAyMDsgaSsrKSB7CisJCXByaW50ZigieCA9ICV1XG4iLCBpKTsKKwkJZmZsdXNoKHN0ZG91dCk7CisJCWlmIChCTl9zZXRfd29yZCh4LCBpKSAhPSAxKQorCQkJZmF0YWwoIiVzOiBzZXQgeCB3b3JkIiwgX19mdW5jX18pOworCQlzY2hub3JyX3NlbGZ0ZXN0X29uZShncnAtPnAsIGdycC0+cSwgZ3JwLT5nLCB4KTsKKwl9CisKKwkvKiAxMDAgeCByYW5kb20gWzAsIHApICovCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCWlmIChCTl9yYW5kX3JhbmdlKHgsIGdycC0+cCkgIT0gMSkKKwkJCWZhdGFsKCIlczogQk5fcmFuZF9yYW5nZSIsIF9fZnVuY19fKTsKKwkJaGggPSBCTl9ibjJoZXgoeCk7CisJCXByaW50ZigieCA9IChyYW5kb20pIDB4JXNcbiIsIGhoKTsKKwkJZnJlZShoaCk7CisJCWZmbHVzaChzdGRvdXQpOworCQlzY2hub3JyX3NlbGZ0ZXN0X29uZShncnAtPnAsIGdycC0+cSwgZ3JwLT5nLCB4KTsKKwl9CisKKwkvKiBbcS0yMCwgcSkgKi8KKwlpZiAoQk5fc2V0X3dvcmQoeCwgMjApICE9IDEpCisJCWZhdGFsKCIlczogQk5fc2V0X3dvcmQgKHggPSAyMCkiLCBfX2Z1bmNfXyk7CisJaWYgKEJOX3N1Yih4LCBncnAtPnEsIHgpICE9IDEpCisJCWZhdGFsKCIlczogQk5fc3ViIChxIC0geCkiLCBfX2Z1bmNfXyk7CisJZm9yIChpID0gMDsgaSA8IDE5OyBpKyspIHsKKwkJaGggPSBCTl9ibjJoZXgoeCk7CisJCXByaW50ZigieCA9IChxIC0gJWQpIDB4JXNcbiIsIDIwIC0gaSwgaGgpOworCQlmcmVlKGhoKTsKKwkJZmZsdXNoKHN0ZG91dCk7CisJCXNjaG5vcnJfc2VsZnRlc3Rfb25lKGdycC0+cCwgZ3JwLT5xLCBncnAtPmcsIHgpOworCQlpZiAoQk5fYWRkKHgsIHgsIEJOX3ZhbHVlX29uZSgpKSAhPSAxKQorCQkJZmF0YWwoIiVzOiBCTl9hZGQgKHggKyAxKSIsIF9fZnVuY19fKTsKKwl9CisJQk5fZnJlZSh4KTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlsb2dfaW5pdChhcmd2WzBdLCBTWVNMT0dfTEVWRUxfREVCVUczLCBTWVNMT0dfRkFDSUxJVFlfVVNFUiwgMSk7CisKKwlzY2hub3JyX3NlbGZ0ZXN0KCk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zY2hub3JyLmggYi9vcGVuc3NoLTYuMHAxL3NjaG5vcnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzMwYjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zY2hub3JyLmgKQEAgLTAsMCArMSw2MCBAQAorLyogJE9wZW5CU0Q6IHNjaG5vcnIuaCx2IDEuMSAyMDA5LzAzLzA1IDA3OjE4OjE5IGRqbSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBEYW1pZW4gTWlsbGVyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFNDSE5PUlJfSAorI2RlZmluZSBTQ0hOT1JSX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorCitzdHJ1Y3QgbW9kcF9ncm91cCB7CisJQklHTlVNICpwLCAqcSwgKmc7Cit9OworCitCSUdOVU0gKmJuX3JhbmRfcmFuZ2VfZ3Rfb25lKGNvbnN0IEJJR05VTSAqaGlnaCk7CitpbnQgaGFzaF9idWZmZXIoY29uc3QgdV9jaGFyICosIHVfaW50LCBjb25zdCBFVlBfTUQgKiwgdV9jaGFyICoqLCB1X2ludCAqKTsKK3ZvaWQgZGVidWczX2JuKGNvbnN0IEJJR05VTSAqLCBjb25zdCBjaGFyICosIC4uLikKKyAgICBfX2F0dHJpYnV0ZV9fKChfX25vbm51bGxfXyAoMikpKQorICAgIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSk7Cit2b2lkIGRlYnVnM19idWYoY29uc3QgdV9jaGFyICosIHVfaW50LCBjb25zdCBjaGFyICosIC4uLikKKyAgICBfX2F0dHJpYnV0ZV9fKChfX25vbm51bGxfXyAoMykpKQorICAgIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDMsIDQpKSk7CitzdHJ1Y3QgbW9kcF9ncm91cCAqbW9kcF9ncm91cF9mcm9tX2dfYW5kX3NhZmVfcChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Cit2b2lkIG1vZHBfZ3JvdXBfZnJlZShzdHJ1Y3QgbW9kcF9ncm91cCAqKTsKKworLyogU2lnbmF0dXJlIGFuZCB2ZXJpZmljYXRpb24gZnVuY3Rpb25zICovCitpbnQKK3NjaG5vcnJfc2lnbihjb25zdCBCSUdOVU0gKmdycF9wLCBjb25zdCBCSUdOVU0gKmdycF9xLCBjb25zdCBCSUdOVU0gKmdycF9nLAorICAgIGNvbnN0IEVWUF9NRCAqZXZwX21kLCBjb25zdCBCSUdOVU0gKngsIGNvbnN0IEJJR05VTSAqZ194LAorICAgIGNvbnN0IHVfY2hhciAqaWQsIHVfaW50IGlkbGVuLCBCSUdOVU0gKipyX3AsIEJJR05VTSAqKmVfcCk7CitpbnQKK3NjaG5vcnJfc2lnbl9idWYoY29uc3QgQklHTlVNICpncnBfcCwgY29uc3QgQklHTlVNICpncnBfcSwgY29uc3QgQklHTlVNICpncnBfZywKKyAgICBjb25zdCBCSUdOVU0gKngsIGNvbnN0IEJJR05VTSAqZ194LCBjb25zdCB1X2NoYXIgKmlkLCB1X2ludCBpZGxlbiwKKyAgICB1X2NoYXIgKipzaWcsIHVfaW50ICpzaWdsZW4pOworaW50CitzY2hub3JyX3ZlcmlmeShjb25zdCBCSUdOVU0gKmdycF9wLCBjb25zdCBCSUdOVU0gKmdycF9xLCBjb25zdCBCSUdOVU0gKmdycF9nLAorICAgIGNvbnN0IEVWUF9NRCAqZXZwX21kLCBjb25zdCBCSUdOVU0gKmdfeCwgY29uc3QgdV9jaGFyICppZCwgdV9pbnQgaWRsZW4sCisgICAgY29uc3QgQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmUpOworaW50CitzY2hub3JyX3ZlcmlmeV9idWYoY29uc3QgQklHTlVNICpncnBfcCwgY29uc3QgQklHTlVNICpncnBfcSwKKyAgICBjb25zdCBCSUdOVU0gKmdycF9nLAorICAgIGNvbnN0IEJJR05VTSAqZ194LCBjb25zdCB1X2NoYXIgKmlkLCB1X2ludCBpZGxlbiwKKyAgICBjb25zdCB1X2NoYXIgKnNpZywgdV9pbnQgc2lnbGVuKTsKKworI2VuZGlmIC8qIEpQQUtFX0ggKi8KKwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zY3AuMCBiL29wZW5zc2gtNi4wcDEvc2NwLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk0NWM4YwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc2NwLjAKQEAgLTAsMCArMSwxNTggQEAKK1NDUCgxKSAgICAgICAgICAgICAgICAgICAgIE9wZW5CU0QgUmVmZXJlbmNlIE1hbnVhbCAgICAgICAgICAgICAgICAgICAgIFNDUCgxKQorCitOQU1FCisgICAgIHNjcCAtIHNlY3VyZSBjb3B5IChyZW1vdGUgZmlsZSBjb3B5IHByb2dyYW0pCisKK1NZTk9QU0lTCisgICAgIHNjcCBbLTEyMzQ2QkNwcXJ2XSBbLWMgY2lwaGVyXSBbLUYgc3NoX2NvbmZpZ10gWy1pIGlkZW50aXR5X2ZpbGVdCisgICAgICAgICBbLWwgbGltaXRdIFstbyBzc2hfb3B0aW9uXSBbLVAgcG9ydF0gWy1TIHByb2dyYW1dCisgICAgICAgICBbW3VzZXJAXWhvc3QxOl1maWxlMSAuLi4gW1t1c2VyQF1ob3N0MjpdZmlsZTIKKworREVTQ1JJUFRJT04KKyAgICAgc2NwIGNvcGllcyBmaWxlcyBiZXR3ZWVuIGhvc3RzIG9uIGEgbmV0d29yay4gIEl0IHVzZXMgc3NoKDEpIGZvciBkYXRhCisgICAgIHRyYW5zZmVyLCBhbmQgdXNlcyB0aGUgc2FtZSBhdXRoZW50aWNhdGlvbiBhbmQgcHJvdmlkZXMgdGhlIHNhbWUgc2VjdXJpdHkKKyAgICAgYXMgc3NoKDEpLiAgVW5saWtlIHJjcCgxKSwgc2NwIHdpbGwgYXNrIGZvciBwYXNzd29yZHMgb3IgcGFzc3BocmFzZXMgaWYKKyAgICAgdGhleSBhcmUgbmVlZGVkIGZvciBhdXRoZW50aWNhdGlvbi4KKworICAgICBGaWxlIG5hbWVzIG1heSBjb250YWluIGEgdXNlciBhbmQgaG9zdCBzcGVjaWZpY2F0aW9uIHRvIGluZGljYXRlIHRoYXQgdGhlCisgICAgIGZpbGUgaXMgdG8gYmUgY29waWVkIHRvL2Zyb20gdGhhdCBob3N0LiAgTG9jYWwgZmlsZSBuYW1lcyBjYW4gYmUgbWFkZQorICAgICBleHBsaWNpdCB1c2luZyBhYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRobmFtZXMgdG8gYXZvaWQgc2NwIHRyZWF0aW5nIGZpbGUKKyAgICAgbmFtZXMgY29udGFpbmluZyBgOicgYXMgaG9zdCBzcGVjaWZpZXJzLiAgQ29waWVzIGJldHdlZW4gdHdvIHJlbW90ZSBob3N0cworICAgICBhcmUgYWxzbyBwZXJtaXR0ZWQuCisKKyAgICAgVGhlIG9wdGlvbnMgYXJlIGFzIGZvbGxvd3M6CisKKyAgICAgLTEgICAgICBGb3JjZXMgc2NwIHRvIHVzZSBwcm90b2NvbCAxLgorCisgICAgIC0yICAgICAgRm9yY2VzIHNjcCB0byB1c2UgcHJvdG9jb2wgMi4KKworICAgICAtMyAgICAgIENvcGllcyBiZXR3ZWVuIHR3byByZW1vdGUgaG9zdHMgYXJlIHRyYW5zZmVycmVkIHRocm91Z2ggdGhlIGxvY2FsCisgICAgICAgICAgICAgaG9zdC4gIFdpdGhvdXQgdGhpcyBvcHRpb24gdGhlIGRhdGEgaXMgY29waWVkIGRpcmVjdGx5IGJldHdlZW4KKyAgICAgICAgICAgICB0aGUgdHdvIHJlbW90ZSBob3N0cy4gIE5vdGUgdGhhdCB0aGlzIG9wdGlvbiBkaXNhYmxlcyB0aGUKKyAgICAgICAgICAgICBwcm9ncmVzcyBtZXRlci4KKworICAgICAtNCAgICAgIEZvcmNlcyBzY3AgdG8gdXNlIElQdjQgYWRkcmVzc2VzIG9ubHkuCisKKyAgICAgLTYgICAgICBGb3JjZXMgc2NwIHRvIHVzZSBJUHY2IGFkZHJlc3NlcyBvbmx5LgorCisgICAgIC1CICAgICAgU2VsZWN0cyBiYXRjaCBtb2RlIChwcmV2ZW50cyBhc2tpbmcgZm9yIHBhc3N3b3JkcyBvcgorICAgICAgICAgICAgIHBhc3NwaHJhc2VzKS4KKworICAgICAtQyAgICAgIENvbXByZXNzaW9uIGVuYWJsZS4gIFBhc3NlcyB0aGUgLUMgZmxhZyB0byBzc2goMSkgdG8gZW5hYmxlCisgICAgICAgICAgICAgY29tcHJlc3Npb24uCisKKyAgICAgLWMgY2lwaGVyCisgICAgICAgICAgICAgU2VsZWN0cyB0aGUgY2lwaGVyIHRvIHVzZSBmb3IgZW5jcnlwdGluZyB0aGUgZGF0YSB0cmFuc2Zlci4gIFRoaXMKKyAgICAgICAgICAgICBvcHRpb24gaXMgZGlyZWN0bHkgcGFzc2VkIHRvIHNzaCgxKS4KKworICAgICAtRiBzc2hfY29uZmlnCisgICAgICAgICAgICAgU3BlY2lmaWVzIGFuIGFsdGVybmF0aXZlIHBlci11c2VyIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3Igc3NoLgorICAgICAgICAgICAgIFRoaXMgb3B0aW9uIGlzIGRpcmVjdGx5IHBhc3NlZCB0byBzc2goMSkuCisKKyAgICAgLWkgaWRlbnRpdHlfZmlsZQorICAgICAgICAgICAgIFNlbGVjdHMgdGhlIGZpbGUgZnJvbSB3aGljaCB0aGUgaWRlbnRpdHkgKHByaXZhdGUga2V5KSBmb3IgcHVibGljCisgICAgICAgICAgICAga2V5IGF1dGhlbnRpY2F0aW9uIGlzIHJlYWQuICBUaGlzIG9wdGlvbiBpcyBkaXJlY3RseSBwYXNzZWQgdG8KKyAgICAgICAgICAgICBzc2goMSkuCisKKyAgICAgLWwgbGltaXQKKyAgICAgICAgICAgICBMaW1pdHMgdGhlIHVzZWQgYmFuZHdpZHRoLCBzcGVjaWZpZWQgaW4gS2JpdC9zLgorCisgICAgIC1vIHNzaF9vcHRpb24KKyAgICAgICAgICAgICBDYW4gYmUgdXNlZCB0byBwYXNzIG9wdGlvbnMgdG8gc3NoIGluIHRoZSBmb3JtYXQgdXNlZCBpbgorICAgICAgICAgICAgIHNzaF9jb25maWcoNSkuICBUaGlzIGlzIHVzZWZ1bCBmb3Igc3BlY2lmeWluZyBvcHRpb25zIGZvciB3aGljaAorICAgICAgICAgICAgIHRoZXJlIGlzIG5vIHNlcGFyYXRlIHNjcCBjb21tYW5kLWxpbmUgZmxhZy4gIEZvciBmdWxsIGRldGFpbHMgb2YKKyAgICAgICAgICAgICB0aGUgb3B0aW9ucyBsaXN0ZWQgYmVsb3csIGFuZCB0aGVpciBwb3NzaWJsZSB2YWx1ZXMsIHNlZQorICAgICAgICAgICAgIHNzaF9jb25maWcoNSkuCisKKyAgICAgICAgICAgICAgICAgICBBZGRyZXNzRmFtaWx5CisgICAgICAgICAgICAgICAgICAgQmF0Y2hNb2RlCisgICAgICAgICAgICAgICAgICAgQmluZEFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgQ2hlY2tIb3N0SVAKKyAgICAgICAgICAgICAgICAgICBDaXBoZXIKKyAgICAgICAgICAgICAgICAgICBDaXBoZXJzCisgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbkxldmVsCisgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbkF0dGVtcHRzCisgICAgICAgICAgICAgICAgICAgQ29ubmVjdFRpbWVvdXQKKyAgICAgICAgICAgICAgICAgICBDb250cm9sTWFzdGVyCisgICAgICAgICAgICAgICAgICAgQ29udHJvbFBhdGgKKyAgICAgICAgICAgICAgICAgICBDb250cm9sUGVyc2lzdAorICAgICAgICAgICAgICAgICAgIEdsb2JhbEtub3duSG9zdHNGaWxlCisgICAgICAgICAgICAgICAgICAgR1NTQVBJQXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICAgICAgICBHU1NBUElEZWxlZ2F0ZUNyZWRlbnRpYWxzCisgICAgICAgICAgICAgICAgICAgSGFzaEtub3duSG9zdHMKKyAgICAgICAgICAgICAgICAgICBIb3N0CisgICAgICAgICAgICAgICAgICAgSG9zdGJhc2VkQXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICAgICAgICBIb3N0S2V5QWxnb3JpdGhtcworICAgICAgICAgICAgICAgICAgIEhvc3RLZXlBbGlhcworICAgICAgICAgICAgICAgICAgIEhvc3ROYW1lCisgICAgICAgICAgICAgICAgICAgSWRlbnRpdHlGaWxlCisgICAgICAgICAgICAgICAgICAgSWRlbnRpdGllc09ubHkKKyAgICAgICAgICAgICAgICAgICBJUFFvUworICAgICAgICAgICAgICAgICAgIEtiZEludGVyYWN0aXZlQXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICAgICAgICBLYmRJbnRlcmFjdGl2ZURldmljZXMKKyAgICAgICAgICAgICAgICAgICBLZXhBbGdvcml0aG1zCisgICAgICAgICAgICAgICAgICAgTG9nTGV2ZWwKKyAgICAgICAgICAgICAgICAgICBNQUNzCisgICAgICAgICAgICAgICAgICAgTm9Ib3N0QXV0aGVudGljYXRpb25Gb3JMb2NhbGhvc3QKKyAgICAgICAgICAgICAgICAgICBOdW1iZXJPZlBhc3N3b3JkUHJvbXB0cworICAgICAgICAgICAgICAgICAgIFBhc3N3b3JkQXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICAgICAgICBQS0NTMTFQcm92aWRlcgorICAgICAgICAgICAgICAgICAgIFBvcnQKKyAgICAgICAgICAgICAgICAgICBQcmVmZXJyZWRBdXRoZW50aWNhdGlvbnMKKyAgICAgICAgICAgICAgICAgICBQcm90b2NvbAorICAgICAgICAgICAgICAgICAgIFByb3h5Q29tbWFuZAorICAgICAgICAgICAgICAgICAgIFB1YmtleUF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgUmVrZXlMaW1pdAorICAgICAgICAgICAgICAgICAgIFJob3N0c1JTQUF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgUlNBQXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICAgICAgICBTZW5kRW52CisgICAgICAgICAgICAgICAgICAgU2VydmVyQWxpdmVJbnRlcnZhbAorICAgICAgICAgICAgICAgICAgIFNlcnZlckFsaXZlQ291bnRNYXgKKyAgICAgICAgICAgICAgICAgICBTdHJpY3RIb3N0S2V5Q2hlY2tpbmcKKyAgICAgICAgICAgICAgICAgICBUQ1BLZWVwQWxpdmUKKyAgICAgICAgICAgICAgICAgICBVc2VQcml2aWxlZ2VkUG9ydAorICAgICAgICAgICAgICAgICAgIFVzZXIKKyAgICAgICAgICAgICAgICAgICBVc2VyS25vd25Ib3N0c0ZpbGUKKyAgICAgICAgICAgICAgICAgICBWZXJpZnlIb3N0S2V5RE5TCisKKyAgICAgLVAgcG9ydAorICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcG9ydCB0byBjb25uZWN0IHRvIG9uIHRoZSByZW1vdGUgaG9zdC4gIE5vdGUgdGhhdAorICAgICAgICAgICAgIHRoaXMgb3B0aW9uIGlzIHdyaXR0ZW4gd2l0aCBhIGNhcGl0YWwgYFAnLCBiZWNhdXNlIC1wIGlzIGFscmVhZHkKKyAgICAgICAgICAgICByZXNlcnZlZCBmb3IgcHJlc2VydmluZyB0aGUgdGltZXMgYW5kIG1vZGVzIG9mIHRoZSBmaWxlIGluCisgICAgICAgICAgICAgcmNwKDEpLgorCisgICAgIC1wICAgICAgUHJlc2VydmVzIG1vZGlmaWNhdGlvbiB0aW1lcywgYWNjZXNzIHRpbWVzLCBhbmQgbW9kZXMgZnJvbSB0aGUKKyAgICAgICAgICAgICBvcmlnaW5hbCBmaWxlLgorCisgICAgIC1xICAgICAgUXVpZXQgbW9kZTogZGlzYWJsZXMgdGhlIHByb2dyZXNzIG1ldGVyIGFzIHdlbGwgYXMgd2FybmluZyBhbmQKKyAgICAgICAgICAgICBkaWFnbm9zdGljIG1lc3NhZ2VzIGZyb20gc3NoKDEpLgorCisgICAgIC1yICAgICAgUmVjdXJzaXZlbHkgY29weSBlbnRpcmUgZGlyZWN0b3JpZXMuICBOb3RlIHRoYXQgc2NwIGZvbGxvd3MKKyAgICAgICAgICAgICBzeW1ib2xpYyBsaW5rcyBlbmNvdW50ZXJlZCBpbiB0aGUgdHJlZSB0cmF2ZXJzYWwuCisKKyAgICAgLVMgcHJvZ3JhbQorICAgICAgICAgICAgIE5hbWUgb2YgcHJvZ3JhbSB0byB1c2UgZm9yIHRoZSBlbmNyeXB0ZWQgY29ubmVjdGlvbi4gIFRoZSBwcm9ncmFtCisgICAgICAgICAgICAgbXVzdCB1bmRlcnN0YW5kIHNzaCgxKSBvcHRpb25zLgorCisgICAgIC12ICAgICAgVmVyYm9zZSBtb2RlLiAgQ2F1c2VzIHNjcCBhbmQgc3NoKDEpIHRvIHByaW50IGRlYnVnZ2luZyBtZXNzYWdlcworICAgICAgICAgICAgIGFib3V0IHRoZWlyIHByb2dyZXNzLiAgVGhpcyBpcyBoZWxwZnVsIGluIGRlYnVnZ2luZyBjb25uZWN0aW9uLAorICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uLCBhbmQgY29uZmlndXJhdGlvbiBwcm9ibGVtcy4KKworRVhJVCBTVEFUVVMKKyAgICAgVGhlIHNjcCB1dGlsaXR5IGV4aXRzIDAgb24gc3VjY2VzcywgYW5kID4wIGlmIGFuIGVycm9yIG9jY3Vycy4KKworU0VFIEFMU08KKyAgICAgcmNwKDEpLCBzZnRwKDEpLCBzc2goMSksIHNzaC1hZGQoMSksIHNzaC1hZ2VudCgxKSwgc3NoLWtleWdlbigxKSwKKyAgICAgc3NoX2NvbmZpZyg1KSwgc3NoZCg4KQorCitISVNUT1JZCisgICAgIHNjcCBpcyBiYXNlZCBvbiB0aGUgcmNwKDEpIHByb2dyYW0gaW4gQlNEIHNvdXJjZSBjb2RlIGZyb20gdGhlIFJlZ2VudHMgb2YKKyAgICAgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKworQVVUSE9SUworICAgICBUaW1vIFJpbm5lIDx0cmlAaWtpLmZpPgorICAgICBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKworT3BlbkJTRCA1LjAgICAgICAgICAgICAgICAgICAgIFNlcHRlbWJlciA1LCAyMDExICAgICAgICAgICAgICAgICAgIE9wZW5CU0QgNS4wCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NjcC4xIGIvb3BlbnNzaC02LjBwMS9zY3AuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzRiOTdiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zY3AuMQpAQCAtMCwwICsxLDIzOSBAQAorLlwiCisuXCIgc2NwLjEKKy5cIgorLlwiIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+CisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAorLlwiICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisuXCIKKy5cIiBDcmVhdGVkOiBTdW4gTWF5ICA3IDAwOjE0OjM3IDE5OTUgeWxvCisuXCIKKy5cIiAkT3BlbkJTRDogc2NwLjEsdiAxLjU4IDIwMTEvMDkvMDUgMDc6MDE6NDQgam1jIEV4cCAkCisuXCIKKy5EZCAkTWRvY2RhdGU6IFNlcHRlbWJlciA1IDIwMTEgJAorLkR0IFNDUCAxCisuT3MKKy5TaCBOQU1FCisuTm0gc2NwCisuTmQgc2VjdXJlIGNvcHkgKHJlbW90ZSBmaWxlIGNvcHkgcHJvZ3JhbSkKKy5TaCBTWU5PUFNJUworLk5tIHNjcAorLkJrIC13b3JkcworLk9wIEZsIDEyMzQ2QkNwcXJ2CisuT3AgRmwgYyBBciBjaXBoZXIKKy5PcCBGbCBGIEFyIHNzaF9jb25maWcKKy5PcCBGbCBpIEFyIGlkZW50aXR5X2ZpbGUKKy5PcCBGbCBsIEFyIGxpbWl0CisuT3AgRmwgbyBBciBzc2hfb3B0aW9uCisuT3AgRmwgUCBBciBwb3J0CisuT3AgRmwgUyBBciBwcm9ncmFtCisuU20gb2ZmCisuT28KKy5PcCBBciB1c2VyIE5vIEAKKy5BciBob3N0MSBObyA6CisuT2MgQXIgZmlsZTEKKy5TbSBvbgorLkFyIC4uLgorLlNtIG9mZgorLk9vCisuT3AgQXIgdXNlciBObyBACisuQXIgaG9zdDIgTm8gOgorLk9jIEFyIGZpbGUyCisuU20gb24KKy5FaworLlNoIERFU0NSSVBUSU9OCisuTm0KK2NvcGllcyBmaWxlcyBiZXR3ZWVuIGhvc3RzIG9uIGEgbmV0d29yay4KK0l0IHVzZXMKKy5YciBzc2ggMQorZm9yIGRhdGEgdHJhbnNmZXIsIGFuZCB1c2VzIHRoZSBzYW1lIGF1dGhlbnRpY2F0aW9uIGFuZCBwcm92aWRlcyB0aGUKK3NhbWUgc2VjdXJpdHkgYXMKKy5YciBzc2ggMSAuCitVbmxpa2UKKy5YciByY3AgMSAsCisuTm0KK3dpbGwgYXNrIGZvciBwYXNzd29yZHMgb3IgcGFzc3BocmFzZXMgaWYgdGhleSBhcmUgbmVlZGVkIGZvcgorYXV0aGVudGljYXRpb24uCisuUHAKK0ZpbGUgbmFtZXMgbWF5IGNvbnRhaW4gYSB1c2VyIGFuZCBob3N0IHNwZWNpZmljYXRpb24gdG8gaW5kaWNhdGUKK3RoYXQgdGhlIGZpbGUgaXMgdG8gYmUgY29waWVkIHRvL2Zyb20gdGhhdCBob3N0LgorTG9jYWwgZmlsZSBuYW1lcyBjYW4gYmUgbWFkZSBleHBsaWNpdCB1c2luZyBhYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRobmFtZXMKK3RvIGF2b2lkCisuTm0KK3RyZWF0aW5nIGZpbGUgbmFtZXMgY29udGFpbmluZworLlNxIDpcJgorYXMgaG9zdCBzcGVjaWZpZXJzLgorQ29waWVzIGJldHdlZW4gdHdvIHJlbW90ZSBob3N0cyBhcmUgYWxzbyBwZXJtaXR0ZWQuCisuUHAKK1RoZSBvcHRpb25zIGFyZSBhcyBmb2xsb3dzOgorLkJsIC10YWcgLXdpZHRoIERzCisuSXQgRmwgMQorRm9yY2VzCisuTm0KK3RvIHVzZSBwcm90b2NvbCAxLgorLkl0IEZsIDIKK0ZvcmNlcworLk5tCit0byB1c2UgcHJvdG9jb2wgMi4KKy5JdCBGbCAzCitDb3BpZXMgYmV0d2VlbiB0d28gcmVtb3RlIGhvc3RzIGFyZSB0cmFuc2ZlcnJlZCB0aHJvdWdoIHRoZSBsb2NhbCBob3N0LgorV2l0aG91dCB0aGlzIG9wdGlvbiB0aGUgZGF0YSBpcyBjb3BpZWQgZGlyZWN0bHkgYmV0d2VlbiB0aGUgdHdvIHJlbW90ZQoraG9zdHMuCitOb3RlIHRoYXQgdGhpcyBvcHRpb24gZGlzYWJsZXMgdGhlIHByb2dyZXNzIG1ldGVyLgorLkl0IEZsIDQKK0ZvcmNlcworLk5tCit0byB1c2UgSVB2NCBhZGRyZXNzZXMgb25seS4KKy5JdCBGbCA2CitGb3JjZXMKKy5ObQordG8gdXNlIElQdjYgYWRkcmVzc2VzIG9ubHkuCisuSXQgRmwgQgorU2VsZWN0cyBiYXRjaCBtb2RlIChwcmV2ZW50cyBhc2tpbmcgZm9yIHBhc3N3b3JkcyBvciBwYXNzcGhyYXNlcykuCisuSXQgRmwgQworQ29tcHJlc3Npb24gZW5hYmxlLgorUGFzc2VzIHRoZQorLkZsIEMKK2ZsYWcgdG8KKy5YciBzc2ggMQordG8gZW5hYmxlIGNvbXByZXNzaW9uLgorLkl0IEZsIGMgQXIgY2lwaGVyCitTZWxlY3RzIHRoZSBjaXBoZXIgdG8gdXNlIGZvciBlbmNyeXB0aW5nIHRoZSBkYXRhIHRyYW5zZmVyLgorVGhpcyBvcHRpb24gaXMgZGlyZWN0bHkgcGFzc2VkIHRvCisuWHIgc3NoIDEgLgorLkl0IEZsIEYgQXIgc3NoX2NvbmZpZworU3BlY2lmaWVzIGFuIGFsdGVybmF0aXZlCitwZXItdXNlciBjb25maWd1cmF0aW9uIGZpbGUgZm9yCisuTm0gc3NoIC4KK1RoaXMgb3B0aW9uIGlzIGRpcmVjdGx5IHBhc3NlZCB0bworLlhyIHNzaCAxIC4KKy5JdCBGbCBpIEFyIGlkZW50aXR5X2ZpbGUKK1NlbGVjdHMgdGhlIGZpbGUgZnJvbSB3aGljaCB0aGUgaWRlbnRpdHkgKHByaXZhdGUga2V5KSBmb3IgcHVibGljIGtleQorYXV0aGVudGljYXRpb24gaXMgcmVhZC4KK1RoaXMgb3B0aW9uIGlzIGRpcmVjdGx5IHBhc3NlZCB0bworLlhyIHNzaCAxIC4KKy5JdCBGbCBsIEFyIGxpbWl0CitMaW1pdHMgdGhlIHVzZWQgYmFuZHdpZHRoLCBzcGVjaWZpZWQgaW4gS2JpdC9zLgorLkl0IEZsIG8gQXIgc3NoX29wdGlvbgorQ2FuIGJlIHVzZWQgdG8gcGFzcyBvcHRpb25zIHRvCisuTm0gc3NoCitpbiB0aGUgZm9ybWF0IHVzZWQgaW4KKy5YciBzc2hfY29uZmlnIDUgLgorVGhpcyBpcyB1c2VmdWwgZm9yIHNwZWNpZnlpbmcgb3B0aW9ucworZm9yIHdoaWNoIHRoZXJlIGlzIG5vIHNlcGFyYXRlCisuTm0gc2NwCitjb21tYW5kLWxpbmUgZmxhZy4KK0ZvciBmdWxsIGRldGFpbHMgb2YgdGhlIG9wdGlvbnMgbGlzdGVkIGJlbG93LCBhbmQgdGhlaXIgcG9zc2libGUgdmFsdWVzLCBzZWUKKy5YciBzc2hfY29uZmlnIDUgLgorLlBwCisuQmwgLXRhZyAtd2lkdGggRHMgLW9mZnNldCBpbmRlbnQgLWNvbXBhY3QKKy5JdCBBZGRyZXNzRmFtaWx5CisuSXQgQmF0Y2hNb2RlCisuSXQgQmluZEFkZHJlc3MKKy5JdCBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uCisuSXQgQ2hlY2tIb3N0SVAKKy5JdCBDaXBoZXIKKy5JdCBDaXBoZXJzCisuSXQgQ29tcHJlc3Npb24KKy5JdCBDb21wcmVzc2lvbkxldmVsCisuSXQgQ29ubmVjdGlvbkF0dGVtcHRzCisuSXQgQ29ubmVjdFRpbWVvdXQKKy5JdCBDb250cm9sTWFzdGVyCisuSXQgQ29udHJvbFBhdGgKKy5JdCBDb250cm9sUGVyc2lzdAorLkl0IEdsb2JhbEtub3duSG9zdHNGaWxlCisuSXQgR1NTQVBJQXV0aGVudGljYXRpb24KKy5JdCBHU1NBUElEZWxlZ2F0ZUNyZWRlbnRpYWxzCisuSXQgSGFzaEtub3duSG9zdHMKKy5JdCBIb3N0CisuSXQgSG9zdGJhc2VkQXV0aGVudGljYXRpb24KKy5JdCBIb3N0S2V5QWxnb3JpdGhtcworLkl0IEhvc3RLZXlBbGlhcworLkl0IEhvc3ROYW1lCisuSXQgSWRlbnRpdHlGaWxlCisuSXQgSWRlbnRpdGllc09ubHkKKy5JdCBJUFFvUworLkl0IEtiZEludGVyYWN0aXZlQXV0aGVudGljYXRpb24KKy5JdCBLYmRJbnRlcmFjdGl2ZURldmljZXMKKy5JdCBLZXhBbGdvcml0aG1zCisuSXQgTG9nTGV2ZWwKKy5JdCBNQUNzCisuSXQgTm9Ib3N0QXV0aGVudGljYXRpb25Gb3JMb2NhbGhvc3QKKy5JdCBOdW1iZXJPZlBhc3N3b3JkUHJvbXB0cworLkl0IFBhc3N3b3JkQXV0aGVudGljYXRpb24KKy5JdCBQS0NTMTFQcm92aWRlcgorLkl0IFBvcnQKKy5JdCBQcmVmZXJyZWRBdXRoZW50aWNhdGlvbnMKKy5JdCBQcm90b2NvbAorLkl0IFByb3h5Q29tbWFuZAorLkl0IFB1YmtleUF1dGhlbnRpY2F0aW9uCisuSXQgUmVrZXlMaW1pdAorLkl0IFJob3N0c1JTQUF1dGhlbnRpY2F0aW9uCisuSXQgUlNBQXV0aGVudGljYXRpb24KKy5JdCBTZW5kRW52CisuSXQgU2VydmVyQWxpdmVJbnRlcnZhbAorLkl0IFNlcnZlckFsaXZlQ291bnRNYXgKKy5JdCBTdHJpY3RIb3N0S2V5Q2hlY2tpbmcKKy5JdCBUQ1BLZWVwQWxpdmUKKy5JdCBVc2VQcml2aWxlZ2VkUG9ydAorLkl0IFVzZXIKKy5JdCBVc2VyS25vd25Ib3N0c0ZpbGUKKy5JdCBWZXJpZnlIb3N0S2V5RE5TCisuRWwKKy5JdCBGbCBQIEFyIHBvcnQKK1NwZWNpZmllcyB0aGUgcG9ydCB0byBjb25uZWN0IHRvIG9uIHRoZSByZW1vdGUgaG9zdC4KK05vdGUgdGhhdCB0aGlzIG9wdGlvbiBpcyB3cml0dGVuIHdpdGggYSBjYXBpdGFsCisuU3EgUCAsCitiZWNhdXNlCisuRmwgcAoraXMgYWxyZWFkeSByZXNlcnZlZCBmb3IgcHJlc2VydmluZyB0aGUgdGltZXMgYW5kIG1vZGVzIG9mIHRoZSBmaWxlIGluCisuWHIgcmNwIDEgLgorLkl0IEZsIHAKK1ByZXNlcnZlcyBtb2RpZmljYXRpb24gdGltZXMsIGFjY2VzcyB0aW1lcywgYW5kIG1vZGVzIGZyb20gdGhlCitvcmlnaW5hbCBmaWxlLgorLkl0IEZsIHEKK1F1aWV0IG1vZGU6IGRpc2FibGVzIHRoZSBwcm9ncmVzcyBtZXRlciBhcyB3ZWxsIGFzIHdhcm5pbmcgYW5kIGRpYWdub3N0aWMKK21lc3NhZ2VzIGZyb20KKy5YciBzc2ggMSAuCisuSXQgRmwgcgorUmVjdXJzaXZlbHkgY29weSBlbnRpcmUgZGlyZWN0b3JpZXMuCitOb3RlIHRoYXQKKy5ObQorZm9sbG93cyBzeW1ib2xpYyBsaW5rcyBlbmNvdW50ZXJlZCBpbiB0aGUgdHJlZSB0cmF2ZXJzYWwuCisuSXQgRmwgUyBBciBwcm9ncmFtCitOYW1lIG9mCisuQXIgcHJvZ3JhbQordG8gdXNlIGZvciB0aGUgZW5jcnlwdGVkIGNvbm5lY3Rpb24uCitUaGUgcHJvZ3JhbSBtdXN0IHVuZGVyc3RhbmQKKy5YciBzc2ggMQorb3B0aW9ucy4KKy5JdCBGbCB2CitWZXJib3NlIG1vZGUuCitDYXVzZXMKKy5ObQorYW5kCisuWHIgc3NoIDEKK3RvIHByaW50IGRlYnVnZ2luZyBtZXNzYWdlcyBhYm91dCB0aGVpciBwcm9ncmVzcy4KK1RoaXMgaXMgaGVscGZ1bCBpbgorZGVidWdnaW5nIGNvbm5lY3Rpb24sIGF1dGhlbnRpY2F0aW9uLCBhbmQgY29uZmlndXJhdGlvbiBwcm9ibGVtcy4KKy5FbAorLlNoIEVYSVQgU1RBVFVTCisuRXggLXN0ZCBzY3AKKy5TaCBTRUUgQUxTTworLlhyIHJjcCAxICwKKy5YciBzZnRwIDEgLAorLlhyIHNzaCAxICwKKy5YciBzc2gtYWRkIDEgLAorLlhyIHNzaC1hZ2VudCAxICwKKy5YciBzc2gta2V5Z2VuIDEgLAorLlhyIHNzaF9jb25maWcgNSAsCisuWHIgc3NoZCA4CisuU2ggSElTVE9SWQorLk5tCitpcyBiYXNlZCBvbiB0aGUKKy5YciByY3AgMQorcHJvZ3JhbSBpbiBCU0Qgc291cmNlIGNvZGUgZnJvbSB0aGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZgorQ2FsaWZvcm5pYS4KKy5TaCBBVVRIT1JTCisuQW4gVGltbyBSaW5uZSBBcSB0cmlAaWtpLmZpCisuQW4gVGF0dSBZbG9uZW4gQXEgeWxvQGNzLmh1dC5maQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zY3AuYyBiL29wZW5zc2gtNi4wcDEvc2NwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg1ODdiNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc2NwLmMKQEAgLTAsMCArMSwxMzMzIEBACisvKiAkT3BlbkJTRDogc2NwLmMsdiAxLjE3MSAyMDExLzA5LzA5IDIyOjM3OjAxIGRqbSBFeHAgJCAqLworLyoKKyAqIHNjcCAtIHNlY3VyZSByZW1vdGUgY29weS4gIFRoaXMgaXMgYmFzaWNhbGx5IHBhdGNoZWQgQlNEIHJjcCB3aGljaAorICogdXNlcyBzc2ggdG8gZG8gdGhlIGRhdGEgdHJhbnNmZXIgKGluc3RlYWQgb2YgdXNpbmcgcmNtZCkuCisgKgorICogTk9URTogVGhpcyB2ZXJzaW9uIHNob3VsZCBOT1QgYmUgc3VpZCByb290LiAgKFRoaXMgdXNlcyBzc2ggdG8KKyAqIGRvIHRoZSB0cmFuc2ZlciBhbmQgc3NoIGhhcyB0aGUgbmVjZXNzYXJ5IHByaXZpbGVnZXMuKQorICoKKyAqIDE5OTUgVGltbyBSaW5uZSA8dHJpQGlraS5maT4sIFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICoKKyAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKKyAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCisgKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCisgKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCisgKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCisgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlbyBkZSBSYWFkdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgQWFyb24gQ2FtcGJlbGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogUGFydHMgZnJvbToKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTAsIDE5OTIsIDE5OTMsIDE5OTUKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfUE9MTF9ICisjaW5jbHVkZSA8cG9sbC5oPgorI2Vsc2UKKyMgaWZkZWYgSEFWRV9TWVNfUE9MTF9ICisjICBpbmNsdWRlIDxzeXMvcG9sbC5oPgorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfVElNRV9ICisjIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2lmIGRlZmluZWQoSEFWRV9TVFJOVklTKSAmJiBkZWZpbmVkKEhBVkVfVklTX0gpCisjaW5jbHVkZSA8dmlzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJhdG9taWNpby5oIgorI2luY2x1ZGUgInBhdGhuYW1lcy5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJwcm9ncmVzc21ldGVyLmgiCisKK2V4dGVybiBjaGFyICpfX3Byb2duYW1lOworCisjZGVmaW5lIENPUFlfQlVGTEVOCTE2Mzg0CisKK2ludCBkb19jbWQoY2hhciAqaG9zdCwgY2hhciAqcmVtdXNlciwgY2hhciAqY21kLCBpbnQgKmZkaW4sIGludCAqZmRvdXQpOworaW50IGRvX2NtZDIoY2hhciAqaG9zdCwgY2hhciAqcmVtdXNlciwgY2hhciAqY21kLCBpbnQgZmRpbiwgaW50IGZkb3V0KTsKKworLyogU3RydWN0IGZvciBhZGRhcmdzICovCithcmdsaXN0IGFyZ3M7CithcmdsaXN0IHJlbW90ZV9yZW1vdGVfYXJnczsKKworLyogQmFuZHdpZHRoIGxpbWl0ICovCitsb25nIGxvbmcgbGltaXRfa2JwcyA9IDA7CitzdHJ1Y3QgYndsaW1pdCBid2xpbWl0OworCisvKiBOYW1lIG9mIGN1cnJlbnQgZmlsZSBiZWluZyB0cmFuc2ZlcnJlZC4gKi8KK2NoYXIgKmN1cmZpbGU7CisKKy8qIFRoaXMgaXMgc2V0IHRvIG5vbi16ZXJvIHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUuICovCitpbnQgdmVyYm9zZV9tb2RlID0gMDsKKworLyogVGhpcyBpcyBzZXQgdG8gemVybyBpZiB0aGUgcHJvZ3Jlc3NtZXRlciBpcyBub3QgZGVzaXJlZC4gKi8KK2ludCBzaG93cHJvZ3Jlc3MgPSAxOworCisvKgorICogVGhpcyBpcyBzZXQgdG8gbm9uLXplcm8gaWYgcmVtb3RlLXJlbW90ZSBjb3B5IHNob3VsZCBiZSBwaXBlZAorICogdGhyb3VnaCB0aGlzIHByb2Nlc3MuCisgKi8KK2ludCB0aHJvdWdobG9jYWwgPSAwOworCisvKiBUaGlzIGlzIHRoZSBwcm9ncmFtIHRvIGV4ZWN1dGUgZm9yIHRoZSBzZWN1cmVkIGNvbm5lY3Rpb24uICgic3NoIiBvciAtUykgKi8KK2NoYXIgKnNzaF9wcm9ncmFtID0gX1BBVEhfU1NIX1BST0dSQU07CisKKy8qIFRoaXMgaXMgdXNlZCB0byBzdG9yZSB0aGUgcGlkIG9mIHNzaF9wcm9ncmFtICovCitwaWRfdCBkb19jbWRfcGlkID0gLTE7CisKK3N0YXRpYyB2b2lkCitraWxsY2hpbGQoaW50IHNpZ25vKQoreworCWlmIChkb19jbWRfcGlkID4gMSkgeworCQlraWxsKGRvX2NtZF9waWQsIHNpZ25vID8gc2lnbm8gOiBTSUdURVJNKTsKKwkJd2FpdHBpZChkb19jbWRfcGlkLCBOVUxMLCAwKTsKKwl9CisKKwlpZiAoc2lnbm8pCisJCV9leGl0KDEpOworCWV4aXQoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitzdXNwY2hpbGQoaW50IHNpZ25vKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoZG9fY21kX3BpZCA+IDEpIHsKKwkJa2lsbChkb19jbWRfcGlkLCBzaWdubyk7CisJCXdoaWxlICh3YWl0cGlkKGRvX2NtZF9waWQsICZzdGF0dXMsIFdVTlRSQUNFRCkgPT0gLTEgJiYKKwkJICAgIGVycm5vID09IEVJTlRSKQorCQkJOworCQlraWxsKGdldHBpZCgpLCBTSUdTVE9QKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2RvX2xvY2FsX2NtZChhcmdsaXN0ICphKQoreworCXVfaW50IGk7CisJaW50IHN0YXR1czsKKwlwaWRfdCBwaWQ7CisKKwlpZiAoYS0+bnVtID09IDApCisJCWZhdGFsKCJkb19sb2NhbF9jbWQ6IG5vIGFyZ3VtZW50cyIpOworCisJaWYgKHZlcmJvc2VfbW9kZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkV4ZWN1dGluZzoiKTsKKwkJZm9yIChpID0gMDsgaSA8IGEtPm51bTsgaSsrKQorCQkJZnByaW50ZihzdGRlcnIsICIgJXMiLCBhLT5saXN0W2ldKTsKKwkJZnByaW50ZihzdGRlcnIsICJcbiIpOworCX0KKwlpZiAoKHBpZCA9IGZvcmsoKSkgPT0gLTEpCisJCWZhdGFsKCJkb19sb2NhbF9jbWQ6IGZvcms6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKworCWlmIChwaWQgPT0gMCkgeworCQlleGVjdnAoYS0+bGlzdFswXSwgYS0+bGlzdCk7CisJCXBlcnJvcihhLT5saXN0WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlkb19jbWRfcGlkID0gcGlkOworCXNpZ25hbChTSUdURVJNLCBraWxsY2hpbGQpOworCXNpZ25hbChTSUdJTlQsIGtpbGxjaGlsZCk7CisJc2lnbmFsKFNJR0hVUCwga2lsbGNoaWxkKTsKKworCXdoaWxlICh3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCkgPT0gLTEpCisJCWlmIChlcnJubyAhPSBFSU5UUikKKwkJCWZhdGFsKCJkb19sb2NhbF9jbWQ6IHdhaXRwaWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKworCWRvX2NtZF9waWQgPSAtMTsKKworCWlmICghV0lGRVhJVEVEKHN0YXR1cykgfHwgV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSAwKQorCQlyZXR1cm4gKC0xKTsKKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIHRoZSBnaXZlbiBjb21tYW5kIGFzIHRoZSBzcGVjaWZpZWQgdXNlciBvbiB0aGUKKyAqIGdpdmVuIGhvc3QuICBUaGlzIHJldHVybnMgPCAwIGlmIGV4ZWN1dGlvbiBmYWlscywgYW5kID49IDAgb3RoZXJ3aXNlLiBUaGlzCisgKiBhc3NpZ25zIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGUgZGVzY3JpcHRvcnMgb24gc3VjY2Vzcy4KKyAqLworCitpbnQKK2RvX2NtZChjaGFyICpob3N0LCBjaGFyICpyZW11c2VyLCBjaGFyICpjbWQsIGludCAqZmRpbiwgaW50ICpmZG91dCkKK3sKKwlpbnQgcGluWzJdLCBwb3V0WzJdLCByZXNlcnZlZFsyXTsKKworCWlmICh2ZXJib3NlX21vZGUpCisJCWZwcmludGYoc3RkZXJyLAorCQkgICAgIkV4ZWN1dGluZzogcHJvZ3JhbSAlcyBob3N0ICVzLCB1c2VyICVzLCBjb21tYW5kICVzXG4iLAorCQkgICAgc3NoX3Byb2dyYW0sIGhvc3QsCisJCSAgICByZW11c2VyID8gcmVtdXNlciA6ICIodW5zcGVjaWZpZWQpIiwgY21kKTsKKworCS8qCisJICogUmVzZXJ2ZSB0d28gZGVzY3JpcHRvcnMgc28gdGhhdCB0aGUgcmVhbCBwaXBlcyB3b24ndCBnZXQKKwkgKiBkZXNjcmlwdG9ycyAwIGFuZCAxIGJlY2F1c2UgdGhhdCB3aWxsIHNjcmV3IHVwIGR1cDIgYmVsb3cuCisJICovCisJaWYgKHBpcGUocmVzZXJ2ZWQpIDwgMCkKKwkJZmF0YWwoInBpcGU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKworCS8qIENyZWF0ZSBhIHNvY2tldCBwYWlyIGZvciBjb21tdW5pY2F0aW5nIHdpdGggc3NoLiAqLworCWlmIChwaXBlKHBpbikgPCAwKQorCQlmYXRhbCgicGlwZTogJXMiLCBzdHJlcnJvcihlcnJubykpOworCWlmIChwaXBlKHBvdXQpIDwgMCkKKwkJZmF0YWwoInBpcGU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKworCS8qIEZyZWUgdGhlIHJlc2VydmVkIGRlc2NyaXB0b3JzLiAqLworCWNsb3NlKHJlc2VydmVkWzBdKTsKKwljbG9zZShyZXNlcnZlZFsxXSk7CisKKwlzaWduYWwoU0lHVFNUUCwgc3VzcGNoaWxkKTsKKwlzaWduYWwoU0lHVFRJTiwgc3VzcGNoaWxkKTsKKwlzaWduYWwoU0lHVFRPVSwgc3VzcGNoaWxkKTsKKworCS8qIEZvcmsgYSBjaGlsZCB0byBleGVjdXRlIHRoZSBjb21tYW5kIG9uIHRoZSByZW1vdGUgaG9zdCB1c2luZyBzc2guICovCisJZG9fY21kX3BpZCA9IGZvcmsoKTsKKwlpZiAoZG9fY21kX3BpZCA9PSAwKSB7CisJCS8qIENoaWxkLiAqLworCQljbG9zZShwaW5bMV0pOworCQljbG9zZShwb3V0WzBdKTsKKwkJZHVwMihwaW5bMF0sIDApOworCQlkdXAyKHBvdXRbMV0sIDEpOworCQljbG9zZShwaW5bMF0pOworCQljbG9zZShwb3V0WzFdKTsKKworCQlyZXBsYWNlYXJnKCZhcmdzLCAwLCAiJXMiLCBzc2hfcHJvZ3JhbSk7CisJCWlmIChyZW11c2VyICE9IE5VTEwpIHsKKwkJCWFkZGFyZ3MoJmFyZ3MsICItbCIpOworCQkJYWRkYXJncygmYXJncywgIiVzIiwgcmVtdXNlcik7CisJCX0KKwkJYWRkYXJncygmYXJncywgIi0tIik7CisJCWFkZGFyZ3MoJmFyZ3MsICIlcyIsIGhvc3QpOworCQlhZGRhcmdzKCZhcmdzLCAiJXMiLCBjbWQpOworCisJCWV4ZWN2cChzc2hfcHJvZ3JhbSwgYXJncy5saXN0KTsKKwkJcGVycm9yKHNzaF9wcm9ncmFtKTsKKwkJZXhpdCgxKTsKKwl9IGVsc2UgaWYgKGRvX2NtZF9waWQgPT0gLTEpIHsKKwkJZmF0YWwoImZvcms6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisJLyogUGFyZW50LiAgQ2xvc2UgdGhlIG90aGVyIHNpZGUsIGFuZCByZXR1cm4gdGhlIGxvY2FsIHNpZGUuICovCisJY2xvc2UocGluWzBdKTsKKwkqZmRvdXQgPSBwaW5bMV07CisJY2xvc2UocG91dFsxXSk7CisJKmZkaW4gPSBwb3V0WzBdOworCXNpZ25hbChTSUdURVJNLCBraWxsY2hpbGQpOworCXNpZ25hbChTSUdJTlQsIGtpbGxjaGlsZCk7CisJc2lnbmFsKFNJR0hVUCwga2lsbGNoaWxkKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb25zIGV4ZWN1dGVzIGEgY29tbWFuZCBzaW1sYXIgdG8gZG9fY21kKCksIGJ1dCBleHBlY3RzIHRoZQorICogaW5wdXQgYW5kIG91dHB1dCBkZXNjcmlwdG9ycyB0byBiZSBzZXR1cCBieSBhIHByZXZpb3VzIGNhbGwgdG8gZG9fY21kKCkuCisgKiBUaGlzIHdheSB0aGUgaW5wdXQgYW5kIG91dHB1dCBvZiB0d28gY29tbWFuZHMgY2FuIGJlIGNvbm5lY3RlZC4KKyAqLworaW50Citkb19jbWQyKGNoYXIgKmhvc3QsIGNoYXIgKnJlbXVzZXIsIGNoYXIgKmNtZCwgaW50IGZkaW4sIGludCBmZG91dCkKK3sKKwlwaWRfdCBwaWQ7CisJaW50IHN0YXR1czsKKworCWlmICh2ZXJib3NlX21vZGUpCisJCWZwcmludGYoc3RkZXJyLAorCQkgICAgIkV4ZWN1dGluZzogMm5kIHByb2dyYW0gJXMgaG9zdCAlcywgdXNlciAlcywgY29tbWFuZCAlc1xuIiwKKwkJICAgIHNzaF9wcm9ncmFtLCBob3N0LAorCQkgICAgcmVtdXNlciA/IHJlbXVzZXIgOiAiKHVuc3BlY2lmaWVkKSIsIGNtZCk7CisKKwkvKiBGb3JrIGEgY2hpbGQgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCBvbiB0aGUgcmVtb3RlIGhvc3QgdXNpbmcgc3NoLiAqLworCXBpZCA9IGZvcmsoKTsKKwlpZiAocGlkID09IDApIHsKKwkJZHVwMihmZGluLCAwKTsKKwkJZHVwMihmZG91dCwgMSk7CisKKwkJcmVwbGFjZWFyZygmYXJncywgMCwgIiVzIiwgc3NoX3Byb2dyYW0pOworCQlpZiAocmVtdXNlciAhPSBOVUxMKSB7CisJCQlhZGRhcmdzKCZhcmdzLCAiLWwiKTsKKwkJCWFkZGFyZ3MoJmFyZ3MsICIlcyIsIHJlbXVzZXIpOworCQl9CisJCWFkZGFyZ3MoJmFyZ3MsICItLSIpOworCQlhZGRhcmdzKCZhcmdzLCAiJXMiLCBob3N0KTsKKwkJYWRkYXJncygmYXJncywgIiVzIiwgY21kKTsKKworCQlleGVjdnAoc3NoX3Byb2dyYW0sIGFyZ3MubGlzdCk7CisJCXBlcnJvcihzc2hfcHJvZ3JhbSk7CisJCWV4aXQoMSk7CisJfSBlbHNlIGlmIChwaWQgPT0gLTEpIHsKKwkJZmF0YWwoImZvcms6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisJd2hpbGUgKHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKSA9PSAtMSkKKwkJaWYgKGVycm5vICE9IEVJTlRSKQorCQkJZmF0YWwoImRvX2NtZDI6IHdhaXRwaWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gMDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworCXNpemVfdCBjbnQ7CisJY2hhciAqYnVmOworfSBCVUY7CisKK0JVRiAqYWxsb2NidWYoQlVGICosIGludCwgaW50KTsKK3ZvaWQgbG9zdGNvbm4oaW50KTsKK2ludCBva25hbWUoY2hhciAqKTsKK3ZvaWQgcnVuX2Vycihjb25zdCBjaGFyICosLi4uKTsKK3ZvaWQgdmVyaWZ5ZGlyKGNoYXIgKik7CisKK3N0cnVjdCBwYXNzd2QgKnB3ZDsKK3VpZF90IHVzZXJpZDsKK2ludCBlcnJzLCByZW1pbiwgcmVtb3V0OworaW50IHBmbGFnLCBpYW1yZW1vdGUsIGlhbXJlY3Vyc2l2ZSwgdGFyZ2V0c2hvdWxkYmVkaXJlY3Rvcnk7CisKKyNkZWZpbmUJQ01ETkVFRFMJNjQKK2NoYXIgY21kW0NNRE5FRURTXTsJCS8qIG11c3QgaG9sZCAicmNwIC1yIC1wIC1kXDAiICovCisKK2ludCByZXNwb25zZSh2b2lkKTsKK3ZvaWQgcnNvdXJjZShjaGFyICosIHN0cnVjdCBzdGF0ICopOwordm9pZCBzaW5rKGludCwgY2hhciAqW10pOwordm9pZCBzb3VyY2UoaW50LCBjaGFyICpbXSk7Cit2b2lkIHRvbG9jYWwoaW50LCBjaGFyICpbXSk7Cit2b2lkIHRvcmVtb3RlKGNoYXIgKiwgaW50LCBjaGFyICpbXSk7Cit2b2lkIHVzYWdlKHZvaWQpOworCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBjaCwgZmZsYWcsIHRmbGFnLCBzdGF0dXMsIG47CisJY2hhciAqdGFyZywgKipuZXdhcmd2OworCWNvbnN0IGNoYXIgKmVycnN0cjsKKwlleHRlcm4gY2hhciAqb3B0YXJnOworCWV4dGVybiBpbnQgb3B0aW5kOworCisJLyogRW5zdXJlIHRoYXQgZmRzIDAsIDEgYW5kIDIgYXJlIG9wZW4gb3IgZGlyZWN0ZWQgdG8gL2Rldi9udWxsICovCisJc2FuaXRpc2Vfc3RkZmQoKTsKKworCS8qIENvcHkgYXJndiwgYmVjYXVzZSB3ZSBtb2RpZnkgaXQgKi8KKwluZXdhcmd2ID0geGNhbGxvYyhNQVgoYXJnYyArIDEsIDEpLCBzaXplb2YoKm5ld2FyZ3YpKTsKKwlmb3IgKG4gPSAwOyBuIDwgYXJnYzsgbisrKQorCQluZXdhcmd2W25dID0geHN0cmR1cChhcmd2W25dKTsKKwlhcmd2ID0gbmV3YXJndjsKKworCV9fcHJvZ25hbWUgPSBzc2hfZ2V0X3Byb2duYW1lKGFyZ3ZbMF0pOworCisJbWVtc2V0KCZhcmdzLCAnXDAnLCBzaXplb2YoYXJncykpOworCW1lbXNldCgmcmVtb3RlX3JlbW90ZV9hcmdzLCAnXDAnLCBzaXplb2YocmVtb3RlX3JlbW90ZV9hcmdzKSk7CisJYXJncy5saXN0ID0gcmVtb3RlX3JlbW90ZV9hcmdzLmxpc3QgPSBOVUxMOworCWFkZGFyZ3MoJmFyZ3MsICIlcyIsIHNzaF9wcm9ncmFtKTsKKwlhZGRhcmdzKCZhcmdzLCAiLXgiKTsKKwlhZGRhcmdzKCZhcmdzLCAiLW9Gb3J3YXJkQWdlbnQ9bm8iKTsKKwlhZGRhcmdzKCZhcmdzLCAiLW9QZXJtaXRMb2NhbENvbW1hbmQ9bm8iKTsKKwlhZGRhcmdzKCZhcmdzLCAiLW9DbGVhckFsbEZvcndhcmRpbmdzPXllcyIpOworCisJZmZsYWcgPSB0ZmxhZyA9IDA7CisJd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiZGZsOnBydHZCQ2M6aTpQOnExMjM0NlM6bzpGOiIpKSAhPSAtMSkKKwkJc3dpdGNoIChjaCkgeworCQkvKiBVc2VyLXZpc2libGUgZmxhZ3MuICovCisJCWNhc2UgJzEnOgorCQljYXNlICcyJzoKKwkJY2FzZSAnNCc6CisJCWNhc2UgJzYnOgorCQljYXNlICdDJzoKKwkJCWFkZGFyZ3MoJmFyZ3MsICItJWMiLCBjaCk7CisJCQlhZGRhcmdzKCZyZW1vdGVfcmVtb3RlX2FyZ3MsICItJWMiLCBjaCk7CisJCQlicmVhazsKKwkJY2FzZSAnMyc6CisJCQl0aHJvdWdobG9jYWwgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ28nOgorCQljYXNlICdjJzoKKwkJY2FzZSAnaSc6CisJCWNhc2UgJ0YnOgorCQkJYWRkYXJncygmcmVtb3RlX3JlbW90ZV9hcmdzLCAiLSVjIiwgY2gpOworCQkJYWRkYXJncygmcmVtb3RlX3JlbW90ZV9hcmdzLCAiJXMiLCBvcHRhcmcpOworCQkJYWRkYXJncygmYXJncywgIi0lYyIsIGNoKTsKKwkJCWFkZGFyZ3MoJmFyZ3MsICIlcyIsIG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnUCc6CisJCQlhZGRhcmdzKCZyZW1vdGVfcmVtb3RlX2FyZ3MsICItcCIpOworCQkJYWRkYXJncygmcmVtb3RlX3JlbW90ZV9hcmdzLCAiJXMiLCBvcHRhcmcpOworCQkJYWRkYXJncygmYXJncywgIi1wIik7CisJCQlhZGRhcmdzKCZhcmdzLCAiJXMiLCBvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ0InOgorCQkJYWRkYXJncygmcmVtb3RlX3JlbW90ZV9hcmdzLCAiLW9CYXRjaG1vZGU9eWVzIik7CisJCQlhZGRhcmdzKCZhcmdzLCAiLW9CYXRjaG1vZGU9eWVzIik7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQlsaW1pdF9rYnBzID0gc3RydG9udW0ob3B0YXJnLCAxLCAxMDAgKiAxMDI0ICogMTAyNCwKKwkJCSAgICAmZXJyc3RyKTsKKwkJCWlmIChlcnJzdHIgIT0gTlVMTCkKKwkJCQl1c2FnZSgpOworCQkJbGltaXRfa2JwcyAqPSAxMDI0OyAvKiBrYnBzICovCisJCQliYW5kd2lkdGhfbGltaXRfaW5pdCgmYndsaW1pdCwgbGltaXRfa2JwcywgQ09QWV9CVUZMRU4pOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJcGZsYWcgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJaWFtcmVjdXJzaXZlID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdTJzoKKwkJCXNzaF9wcm9ncmFtID0geHN0cmR1cChvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ3YnOgorCQkJYWRkYXJncygmYXJncywgIi12Iik7CisJCQlhZGRhcmdzKCZyZW1vdGVfcmVtb3RlX2FyZ3MsICItdiIpOworCQkJdmVyYm9zZV9tb2RlID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdxJzoKKwkJCWFkZGFyZ3MoJmFyZ3MsICItcSIpOworCQkJYWRkYXJncygmcmVtb3RlX3JlbW90ZV9hcmdzLCAiLXEiKTsKKwkJCXNob3dwcm9ncmVzcyA9IDA7CisJCQlicmVhazsKKworCQkvKiBTZXJ2ZXIgb3B0aW9ucy4gKi8KKwkJY2FzZSAnZCc6CisJCQl0YXJnZXRzaG91bGRiZWRpcmVjdG9yeSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnZic6CS8qICJmcm9tIiAqLworCQkJaWFtcmVtb3RlID0gMTsKKwkJCWZmbGFnID0gMTsKKwkJCWJyZWFrOworCQljYXNlICd0JzoJLyogInRvIiAqLworCQkJaWFtcmVtb3RlID0gMTsKKwkJCXRmbGFnID0gMTsKKyNpZmRlZiBIQVZFX0NZR1dJTgorCQkJc2V0bW9kZSgwLCBPX0JJTkFSWSk7CisjZW5kaWYKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdXNhZ2UoKTsKKwkJfQorCWFyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKChwd2QgPSBnZXRwd3VpZCh1c2VyaWQgPSBnZXR1aWQoKSkpID09IE5VTEwpCisJCWZhdGFsKCJ1bmtub3duIHVzZXIgJXUiLCAodV9pbnQpIHVzZXJpZCk7CisKKwlpZiAoIWlzYXR0eShTVERPVVRfRklMRU5PKSkKKwkJc2hvd3Byb2dyZXNzID0gMDsKKworCXJlbWluID0gU1RESU5fRklMRU5POworCXJlbW91dCA9IFNURE9VVF9GSUxFTk87CisKKwlpZiAoZmZsYWcpIHsKKwkJLyogRm9sbG93ICJwcm90b2NvbCIsIHNlbmQgZGF0YS4gKi8KKwkJKHZvaWQpIHJlc3BvbnNlKCk7CisJCXNvdXJjZShhcmdjLCBhcmd2KTsKKwkJZXhpdChlcnJzICE9IDApOworCX0KKwlpZiAodGZsYWcpIHsKKwkJLyogUmVjZWl2ZSBkYXRhLiAqLworCQlzaW5rKGFyZ2MsIGFyZ3YpOworCQlleGl0KGVycnMgIT0gMCk7CisJfQorCWlmIChhcmdjIDwgMikKKwkJdXNhZ2UoKTsKKwlpZiAoYXJnYyA+IDIpCisJCXRhcmdldHNob3VsZGJlZGlyZWN0b3J5ID0gMTsKKworCXJlbWluID0gcmVtb3V0ID0gLTE7CisJZG9fY21kX3BpZCA9IC0xOworCS8qIENvbW1hbmQgdG8gYmUgZXhlY3V0ZWQgb24gcmVtb3RlIHN5c3RlbSB1c2luZyAic3NoIi4gKi8KKwkodm9pZCkgc25wcmludGYoY21kLCBzaXplb2YgY21kLCAic2NwJXMlcyVzJXMiLAorCSAgICB2ZXJib3NlX21vZGUgPyAiIC12IiA6ICIiLAorCSAgICBpYW1yZWN1cnNpdmUgPyAiIC1yIiA6ICIiLCBwZmxhZyA/ICIgLXAiIDogIiIsCisJICAgIHRhcmdldHNob3VsZGJlZGlyZWN0b3J5ID8gIiAtZCIgOiAiIik7CisKKwkodm9pZCkgc2lnbmFsKFNJR1BJUEUsIGxvc3Rjb25uKTsKKworCWlmICgodGFyZyA9IGNvbG9uKGFyZ3ZbYXJnYyAtIDFdKSkpCS8qIERlc3QgaXMgcmVtb3RlIGhvc3QuICovCisJCXRvcmVtb3RlKHRhcmcsIGFyZ2MsIGFyZ3YpOworCWVsc2UgeworCQlpZiAodGFyZ2V0c2hvdWxkYmVkaXJlY3RvcnkpCisJCQl2ZXJpZnlkaXIoYXJndlthcmdjIC0gMV0pOworCQl0b2xvY2FsKGFyZ2MsIGFyZ3YpOwkvKiBEZXN0IGlzIGxvY2FsIGhvc3QuICovCisJfQorCS8qCisJICogRmluYWxseSBjaGVjayB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIHNzaCBwcm9jZXNzLCBpZiBvbmUgd2FzIGZvcmtlZAorCSAqIGFuZCBubyBlcnJvciBoYXMgb2NjdXJyZWQgeWV0CisJICovCisJaWYgKGRvX2NtZF9waWQgIT0gLTEgJiYgZXJycyA9PSAwKSB7CisJCWlmIChyZW1pbiAhPSAtMSkKKwkJICAgICh2b2lkKSBjbG9zZShyZW1pbik7CisJCWlmIChyZW1vdXQgIT0gLTEpCisJCSAgICAodm9pZCkgY2xvc2UocmVtb3V0KTsKKwkJaWYgKHdhaXRwaWQoZG9fY21kX3BpZCwgJnN0YXR1cywgMCkgPT0gLTEpCisJCQllcnJzID0gMTsKKwkJZWxzZSB7CisJCQlpZiAoIVdJRkVYSVRFRChzdGF0dXMpIHx8IFdFWElUU1RBVFVTKHN0YXR1cykgIT0gMCkKKwkJCQllcnJzID0gMTsKKwkJfQorCX0KKwlleGl0KGVycnMgIT0gMCk7Cit9CisKKy8qIENhbGxiYWNrIGZyb20gYXRvbWljaW82IHRvIHVwZGF0ZSBwcm9ncmVzcyBtZXRlciBhbmQgbGltaXQgYmFuZHdpZHRoICovCitzdGF0aWMgaW50CitzY3Bpbyh2b2lkICpfY250LCBzaXplX3QgcykKK3sKKwlvZmZfdCAqY250ID0gKG9mZl90ICopX2NudDsKKworCSpjbnQgKz0gczsKKwlpZiAobGltaXRfa2JwcyA+IDApCisJCWJhbmR3aWR0aF9saW1pdCgmYndsaW1pdCwgcyk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK3RvcmVtb3RlKGNoYXIgKnRhcmcsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpicCwgKmhvc3QsICpzcmMsICpzdXNlciwgKnRob3N0LCAqdHVzZXIsICphcmc7CisJYXJnbGlzdCBhbGlzdDsKKwlpbnQgaTsKKwl1X2ludCBqOworCisJbWVtc2V0KCZhbGlzdCwgJ1wwJywgc2l6ZW9mKGFsaXN0KSk7CisJYWxpc3QubGlzdCA9IE5VTEw7CisKKwkqdGFyZysrID0gMDsKKwlpZiAoKnRhcmcgPT0gMCkKKwkJdGFyZyA9ICIuIjsKKworCWFyZyA9IHhzdHJkdXAoYXJndlthcmdjIC0gMV0pOworCWlmICgodGhvc3QgPSBzdHJyY2hyKGFyZywgJ0AnKSkpIHsKKwkJLyogdXNlckBob3N0ICovCisJCSp0aG9zdCsrID0gMDsKKwkJdHVzZXIgPSBhcmc7CisJCWlmICgqdHVzZXIgPT0gJ1wwJykKKwkJCXR1c2VyID0gTlVMTDsKKwl9IGVsc2UgeworCQl0aG9zdCA9IGFyZzsKKwkJdHVzZXIgPSBOVUxMOworCX0KKworCWlmICh0dXNlciAhPSBOVUxMICYmICFva25hbWUodHVzZXIpKSB7CisJCXhmcmVlKGFyZyk7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgYXJnYyAtIDE7IGkrKykgeworCQlzcmMgPSBjb2xvbihhcmd2W2ldKTsKKwkJaWYgKHNyYyAmJiB0aHJvdWdobG9jYWwpIHsJLyogZXh0ZW5kZWQgcmVtb3RlIHRvIHJlbW90ZSAqLworCQkJKnNyYysrID0gMDsKKwkJCWlmICgqc3JjID09IDApCisJCQkJc3JjID0gIi4iOworCQkJaG9zdCA9IHN0cnJjaHIoYXJndltpXSwgJ0AnKTsKKwkJCWlmIChob3N0KSB7CisJCQkJKmhvc3QrKyA9IDA7CisJCQkJaG9zdCA9IGNsZWFuaG9zdG5hbWUoaG9zdCk7CisJCQkJc3VzZXIgPSBhcmd2W2ldOworCQkJCWlmICgqc3VzZXIgPT0gJ1wwJykKKwkJCQkJc3VzZXIgPSBwd2QtPnB3X25hbWU7CisJCQkJZWxzZSBpZiAoIW9rbmFtZShzdXNlcikpCisJCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQlob3N0ID0gY2xlYW5ob3N0bmFtZShhcmd2W2ldKTsKKwkJCQlzdXNlciA9IE5VTEw7CisJCQl9CisJCQl4YXNwcmludGYoJmJwLCAiJXMgLWYgJXMlcyIsIGNtZCwKKwkJCSAgICAqc3JjID09ICctJyA/ICItLSAiIDogIiIsIHNyYyk7CisJCQlpZiAoZG9fY21kKGhvc3QsIHN1c2VyLCBicCwgJnJlbWluLCAmcmVtb3V0KSA8IDApCisJCQkJZXhpdCgxKTsKKwkJCSh2b2lkKSB4ZnJlZShicCk7CisJCQlob3N0ID0gY2xlYW5ob3N0bmFtZSh0aG9zdCk7CisJCQl4YXNwcmludGYoJmJwLCAiJXMgLXQgJXMlcyIsIGNtZCwKKwkJCSAgICAqdGFyZyA9PSAnLScgPyAiLS0gIiA6ICIiLCB0YXJnKTsKKwkJCWlmIChkb19jbWQyKGhvc3QsIHR1c2VyLCBicCwgcmVtaW4sIHJlbW91dCkgPCAwKQorCQkJCWV4aXQoMSk7CisJCQkodm9pZCkgeGZyZWUoYnApOworCQkJKHZvaWQpIGNsb3NlKHJlbWluKTsKKwkJCSh2b2lkKSBjbG9zZShyZW1vdXQpOworCQkJcmVtaW4gPSByZW1vdXQgPSAtMTsKKwkJfSBlbHNlIGlmIChzcmMpIHsJLyogc3RhbmRhcmQgcmVtb3RlIHRvIHJlbW90ZSAqLworCQkJZnJlZWFyZ3MoJmFsaXN0KTsKKwkJCWFkZGFyZ3MoJmFsaXN0LCAiJXMiLCBzc2hfcHJvZ3JhbSk7CisJCQlhZGRhcmdzKCZhbGlzdCwgIi14Iik7CisJCQlhZGRhcmdzKCZhbGlzdCwgIi1vQ2xlYXJBbGxGb3J3YXJkaW5ncz15ZXMiKTsKKwkJCWFkZGFyZ3MoJmFsaXN0LCAiLW4iKTsKKwkJCWZvciAoaiA9IDA7IGogPCByZW1vdGVfcmVtb3RlX2FyZ3MubnVtOyBqKyspIHsKKwkJCQlhZGRhcmdzKCZhbGlzdCwgIiVzIiwKKwkJCQkgICAgcmVtb3RlX3JlbW90ZV9hcmdzLmxpc3Rbal0pOworCQkJfQorCQkJKnNyYysrID0gMDsKKwkJCWlmICgqc3JjID09IDApCisJCQkJc3JjID0gIi4iOworCQkJaG9zdCA9IHN0cnJjaHIoYXJndltpXSwgJ0AnKTsKKworCQkJaWYgKGhvc3QpIHsKKwkJCQkqaG9zdCsrID0gMDsKKwkJCQlob3N0ID0gY2xlYW5ob3N0bmFtZShob3N0KTsKKwkJCQlzdXNlciA9IGFyZ3ZbaV07CisJCQkJaWYgKCpzdXNlciA9PSAnXDAnKQorCQkJCQlzdXNlciA9IHB3ZC0+cHdfbmFtZTsKKwkJCQllbHNlIGlmICghb2tuYW1lKHN1c2VyKSkKKwkJCQkJY29udGludWU7CisJCQkJYWRkYXJncygmYWxpc3QsICItbCIpOworCQkJCWFkZGFyZ3MoJmFsaXN0LCAiJXMiLCBzdXNlcik7CisJCQl9IGVsc2UgeworCQkJCWhvc3QgPSBjbGVhbmhvc3RuYW1lKGFyZ3ZbaV0pOworCQkJfQorCQkJYWRkYXJncygmYWxpc3QsICItLSIpOworCQkJYWRkYXJncygmYWxpc3QsICIlcyIsIGhvc3QpOworCQkJYWRkYXJncygmYWxpc3QsICIlcyIsIGNtZCk7CisJCQlhZGRhcmdzKCZhbGlzdCwgIiVzIiwgc3JjKTsKKwkJCWFkZGFyZ3MoJmFsaXN0LCAiJXMlcyVzOiVzIiwKKwkJCSAgICB0dXNlciA/IHR1c2VyIDogIiIsIHR1c2VyID8gIkAiIDogIiIsCisJCQkgICAgdGhvc3QsIHRhcmcpOworCQkJaWYgKGRvX2xvY2FsX2NtZCgmYWxpc3QpICE9IDApCisJCQkJZXJycyA9IDE7CisJCX0gZWxzZSB7CS8qIGxvY2FsIHRvIHJlbW90ZSAqLworCQkJaWYgKHJlbWluID09IC0xKSB7CisJCQkJeGFzcHJpbnRmKCZicCwgIiVzIC10ICVzJXMiLCBjbWQsCisJCQkJICAgICp0YXJnID09ICctJyA/ICItLSAiIDogIiIsIHRhcmcpOworCQkJCWhvc3QgPSBjbGVhbmhvc3RuYW1lKHRob3N0KTsKKwkJCQlpZiAoZG9fY21kKGhvc3QsIHR1c2VyLCBicCwgJnJlbWluLAorCQkJCSAgICAmcmVtb3V0KSA8IDApCisJCQkJCWV4aXQoMSk7CisJCQkJaWYgKHJlc3BvbnNlKCkgPCAwKQorCQkJCQlleGl0KDEpOworCQkJCSh2b2lkKSB4ZnJlZShicCk7CisJCQl9CisJCQlzb3VyY2UoMSwgYXJndiArIGkpOworCQl9CisJfQorCXhmcmVlKGFyZyk7Cit9CisKK3ZvaWQKK3RvbG9jYWwoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKmJwLCAqaG9zdCwgKnNyYywgKnN1c2VyOworCWFyZ2xpc3QgYWxpc3Q7CisJaW50IGk7CisKKwltZW1zZXQoJmFsaXN0LCAnXDAnLCBzaXplb2YoYWxpc3QpKTsKKwlhbGlzdC5saXN0ID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBhcmdjIC0gMTsgaSsrKSB7CisJCWlmICghKHNyYyA9IGNvbG9uKGFyZ3ZbaV0pKSkgewkvKiBMb2NhbCB0byBsb2NhbC4gKi8KKwkJCWZyZWVhcmdzKCZhbGlzdCk7CisJCQlhZGRhcmdzKCZhbGlzdCwgIiVzIiwgX1BBVEhfQ1ApOworCQkJaWYgKGlhbXJlY3Vyc2l2ZSkKKwkJCQlhZGRhcmdzKCZhbGlzdCwgIi1yIik7CisJCQlpZiAocGZsYWcpCisJCQkJYWRkYXJncygmYWxpc3QsICItcCIpOworCQkJYWRkYXJncygmYWxpc3QsICItLSIpOworCQkJYWRkYXJncygmYWxpc3QsICIlcyIsIGFyZ3ZbaV0pOworCQkJYWRkYXJncygmYWxpc3QsICIlcyIsIGFyZ3ZbYXJnYy0xXSk7CisJCQlpZiAoZG9fbG9jYWxfY21kKCZhbGlzdCkpCisJCQkJKytlcnJzOworCQkJY29udGludWU7CisJCX0KKwkJKnNyYysrID0gMDsKKwkJaWYgKCpzcmMgPT0gMCkKKwkJCXNyYyA9ICIuIjsKKwkJaWYgKChob3N0ID0gc3RycmNocihhcmd2W2ldLCAnQCcpKSA9PSBOVUxMKSB7CisJCQlob3N0ID0gYXJndltpXTsKKwkJCXN1c2VyID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCSpob3N0KysgPSAwOworCQkJc3VzZXIgPSBhcmd2W2ldOworCQkJaWYgKCpzdXNlciA9PSAnXDAnKQorCQkJCXN1c2VyID0gcHdkLT5wd19uYW1lOworCQl9CisJCWhvc3QgPSBjbGVhbmhvc3RuYW1lKGhvc3QpOworCQl4YXNwcmludGYoJmJwLCAiJXMgLWYgJXMlcyIsCisJCSAgICBjbWQsICpzcmMgPT0gJy0nID8gIi0tICIgOiAiIiwgc3JjKTsKKwkJaWYgKGRvX2NtZChob3N0LCBzdXNlciwgYnAsICZyZW1pbiwgJnJlbW91dCkgPCAwKSB7CisJCQkodm9pZCkgeGZyZWUoYnApOworCQkJKytlcnJzOworCQkJY29udGludWU7CisJCX0KKwkJeGZyZWUoYnApOworCQlzaW5rKDEsIGFyZ3YgKyBhcmdjIC0gMSk7CisJCSh2b2lkKSBjbG9zZShyZW1pbik7CisJCXJlbWluID0gcmVtb3V0ID0gLTE7CisJfQorfQorCit2b2lkCitzb3VyY2UoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBzdGF0IHN0YjsKKwlzdGF0aWMgQlVGIGJ1ZmZlcjsKKwlCVUYgKmJwOworCW9mZl90IGksIHN0YXRieXRlczsKKwlzaXplX3QgYW10OworCWludCBmZCA9IC0xLCBoYWRlcnIsIGluZHg7CisJY2hhciAqbGFzdCwgKm5hbWUsIGJ1ZlsyMDQ4XSwgZW5jbmFtZVtNQVhQQVRITEVOXTsKKwlpbnQgbGVuOworCisJZm9yIChpbmR4ID0gMDsgaW5keCA8IGFyZ2M7ICsraW5keCkgeworCQluYW1lID0gYXJndltpbmR4XTsKKwkJc3RhdGJ5dGVzID0gMDsKKwkJbGVuID0gc3RybGVuKG5hbWUpOworCQl3aGlsZSAobGVuID4gMSAmJiBuYW1lW2xlbi0xXSA9PSAnLycpCisJCQluYW1lWy0tbGVuXSA9ICdcMCc7CisJCWlmICgoZmQgPSBvcGVuKG5hbWUsIE9fUkRPTkxZfE9fTk9OQkxPQ0ssIDApKSA8IDApCisJCQlnb3RvIHN5c2VycjsKKwkJaWYgKHN0cmNocihuYW1lLCAnXG4nKSAhPSBOVUxMKSB7CisJCQlzdHJudmlzKGVuY25hbWUsIG5hbWUsIHNpemVvZihlbmNuYW1lKSwgVklTX05MKTsKKwkJCW5hbWUgPSBlbmNuYW1lOworCQl9CisJCWlmIChmc3RhdChmZCwgJnN0YikgPCAwKSB7CitzeXNlcnI6CQkJcnVuX2VycigiJXM6ICVzIiwgbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCQlpZiAoc3RiLnN0X3NpemUgPCAwKSB7CisJCQlydW5fZXJyKCIlczogJXMiLCBuYW1lLCAiTmVnYXRpdmUgZmlsZSBzaXplIik7CisJCQlnb3RvIG5leHQ7CisJCX0KKwkJdW5zZXRfbm9uYmxvY2soZmQpOworCQlzd2l0Y2ggKHN0Yi5zdF9tb2RlICYgU19JRk1UKSB7CisJCWNhc2UgU19JRlJFRzoKKwkJCWJyZWFrOworCQljYXNlIFNfSUZESVI6CisJCQlpZiAoaWFtcmVjdXJzaXZlKSB7CisJCQkJcnNvdXJjZShuYW1lLCAmc3RiKTsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCQkvKiBGQUxMVEhST1VHSCAqLworCQlkZWZhdWx0OgorCQkJcnVuX2VycigiJXM6IG5vdCBhIHJlZ3VsYXIgZmlsZSIsIG5hbWUpOworCQkJZ290byBuZXh0OworCQl9CisJCWlmICgobGFzdCA9IHN0cnJjaHIobmFtZSwgJy8nKSkgPT0gTlVMTCkKKwkJCWxhc3QgPSBuYW1lOworCQllbHNlCisJCQkrK2xhc3Q7CisJCWN1cmZpbGUgPSBsYXN0OworCQlpZiAocGZsYWcpIHsKKwkJCS8qCisJCQkgKiBNYWtlIGl0IGNvbXBhdGlibGUgd2l0aCBwb3NzaWJsZSBmdXR1cmUKKwkJCSAqIHZlcnNpb25zIGV4cGVjdGluZyBtaWNyb3NlY29uZHMuCisJCQkgKi8KKwkJCSh2b2lkKSBzbnByaW50ZihidWYsIHNpemVvZiBidWYsICJUJWx1IDAgJWx1IDBcbiIsCisJCQkgICAgKHVfbG9uZykgKHN0Yi5zdF9tdGltZSA8IDAgPyAwIDogc3RiLnN0X210aW1lKSwKKwkJCSAgICAodV9sb25nKSAoc3RiLnN0X2F0aW1lIDwgMCA/IDAgOiBzdGIuc3RfYXRpbWUpKTsKKwkJCWlmICh2ZXJib3NlX21vZGUpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkZpbGUgbXRpbWUgJWxkIGF0aW1lICVsZFxuIiwKKwkJCQkgICAgKGxvbmcpc3RiLnN0X210aW1lLCAobG9uZylzdGIuc3RfYXRpbWUpOworCQkJCWZwcmludGYoc3RkZXJyLCAiU2VuZGluZyBmaWxlIHRpbWVzdGFtcHM6ICVzIiwKKwkJCQkgICAgYnVmKTsKKwkJCX0KKwkJCSh2b2lkKSBhdG9taWNpbyh2d3JpdGUsIHJlbW91dCwgYnVmLCBzdHJsZW4oYnVmKSk7CisJCQlpZiAocmVzcG9uc2UoKSA8IDApCisJCQkJZ290byBuZXh0OworCQl9CisjZGVmaW5lCUZJTEVNT0RFTUFTSwkoU19JU1VJRHxTX0lTR0lEfFNfSVJXWFV8U19JUldYR3xTX0lSV1hPKQorCQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsICJDJTA0byAlbGxkICVzXG4iLAorCQkgICAgKHVfaW50KSAoc3RiLnN0X21vZGUgJiBGSUxFTU9ERU1BU0spLAorCQkgICAgKGxvbmcgbG9uZylzdGIuc3Rfc2l6ZSwgbGFzdCk7CisJCWlmICh2ZXJib3NlX21vZGUpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiU2VuZGluZyBmaWxlIG1vZGVzOiAlcyIsIGJ1Zik7CisJCX0KKwkJKHZvaWQpIGF0b21pY2lvKHZ3cml0ZSwgcmVtb3V0LCBidWYsIHN0cmxlbihidWYpKTsKKwkJaWYgKHJlc3BvbnNlKCkgPCAwKQorCQkJZ290byBuZXh0OworCQlpZiAoKGJwID0gYWxsb2NidWYoJmJ1ZmZlciwgZmQsIENPUFlfQlVGTEVOKSkgPT0gTlVMTCkgeworbmV4dDoJCQlpZiAoZmQgIT0gLTEpIHsKKwkJCQkodm9pZCkgY2xvc2UoZmQpOworCQkJCWZkID0gLTE7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc2hvd3Byb2dyZXNzKQorCQkJc3RhcnRfcHJvZ3Jlc3NfbWV0ZXIoY3VyZmlsZSwgc3RiLnN0X3NpemUsICZzdGF0Ynl0ZXMpOworCQlzZXRfbm9uYmxvY2socmVtb3V0KTsKKwkJZm9yIChoYWRlcnIgPSBpID0gMDsgaSA8IHN0Yi5zdF9zaXplOyBpICs9IGJwLT5jbnQpIHsKKwkJCWFtdCA9IGJwLT5jbnQ7CisJCQlpZiAoaSArIChvZmZfdClhbXQgPiBzdGIuc3Rfc2l6ZSkKKwkJCQlhbXQgPSBzdGIuc3Rfc2l6ZSAtIGk7CisJCQlpZiAoIWhhZGVycikgeworCQkJCWlmIChhdG9taWNpbyhyZWFkLCBmZCwgYnAtPmJ1ZiwgYW10KSAhPSBhbXQpCisJCQkJCWhhZGVyciA9IGVycm5vOworCQkJfQorCQkJLyogS2VlcCB3cml0aW5nIGFmdGVyIGVycm9yIHRvIHJldGFpbiBzeW5jICovCisJCQlpZiAoaGFkZXJyKSB7CisJCQkJKHZvaWQpYXRvbWljaW8odndyaXRlLCByZW1vdXQsIGJwLT5idWYsIGFtdCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoYXRvbWljaW82KHZ3cml0ZSwgcmVtb3V0LCBicC0+YnVmLCBhbXQsIHNjcGlvLAorCQkJICAgICZzdGF0Ynl0ZXMpICE9IGFtdCkKKwkJCQloYWRlcnIgPSBlcnJubzsKKwkJfQorCQl1bnNldF9ub25ibG9jayhyZW1vdXQpOworCQlpZiAoc2hvd3Byb2dyZXNzKQorCQkJc3RvcF9wcm9ncmVzc19tZXRlcigpOworCisJCWlmIChmZCAhPSAtMSkgeworCQkJaWYgKGNsb3NlKGZkKSA8IDAgJiYgIWhhZGVycikKKwkJCQloYWRlcnIgPSBlcnJubzsKKwkJCWZkID0gLTE7CisJCX0KKwkJaWYgKCFoYWRlcnIpCisJCQkodm9pZCkgYXRvbWljaW8odndyaXRlLCByZW1vdXQsICIiLCAxKTsKKwkJZWxzZQorCQkJcnVuX2VycigiJXM6ICVzIiwgbmFtZSwgc3RyZXJyb3IoaGFkZXJyKSk7CisJCSh2b2lkKSByZXNwb25zZSgpOworCX0KK30KKwordm9pZAorcnNvdXJjZShjaGFyICpuYW1lLCBzdHJ1Y3Qgc3RhdCAqc3RhdHApCit7CisJRElSICpkaXJwOworCXN0cnVjdCBkaXJlbnQgKmRwOworCWNoYXIgKmxhc3QsICp2ZWN0WzFdLCBwYXRoWzExMDBdOworCisJaWYgKCEoZGlycCA9IG9wZW5kaXIobmFtZSkpKSB7CisJCXJ1bl9lcnIoIiVzOiAlcyIsIG5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybjsKKwl9CisJbGFzdCA9IHN0cnJjaHIobmFtZSwgJy8nKTsKKwlpZiAobGFzdCA9PSAwKQorCQlsYXN0ID0gbmFtZTsKKwllbHNlCisJCWxhc3QrKzsKKwlpZiAocGZsYWcpIHsKKwkJKHZvaWQpIHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIlQlbHUgMCAlbHUgMFxuIiwKKwkJICAgICh1X2xvbmcpIHN0YXRwLT5zdF9tdGltZSwKKwkJICAgICh1X2xvbmcpIHN0YXRwLT5zdF9hdGltZSk7CisJCSh2b2lkKSBhdG9taWNpbyh2d3JpdGUsIHJlbW91dCwgcGF0aCwgc3RybGVuKHBhdGgpKTsKKwkJaWYgKHJlc3BvbnNlKCkgPCAwKSB7CisJCQljbG9zZWRpcihkaXJwKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkodm9pZCkgc25wcmludGYocGF0aCwgc2l6ZW9mIHBhdGgsICJEJTA0byAlZCAlLjEwMjRzXG4iLAorCSAgICAodV9pbnQpIChzdGF0cC0+c3RfbW9kZSAmIEZJTEVNT0RFTUFTSyksIDAsIGxhc3QpOworCWlmICh2ZXJib3NlX21vZGUpCisJCWZwcmludGYoc3RkZXJyLCAiRW50ZXJpbmcgZGlyZWN0b3J5OiAlcyIsIHBhdGgpOworCSh2b2lkKSBhdG9taWNpbyh2d3JpdGUsIHJlbW91dCwgcGF0aCwgc3RybGVuKHBhdGgpKTsKKwlpZiAocmVzcG9uc2UoKSA8IDApIHsKKwkJY2xvc2VkaXIoZGlycCk7CisJCXJldHVybjsKKwl9CisJd2hpbGUgKChkcCA9IHJlYWRkaXIoZGlycCkpICE9IE5VTEwpIHsKKwkJaWYgKGRwLT5kX2lubyA9PSAwKQorCQkJY29udGludWU7CisJCWlmICghc3RyY21wKGRwLT5kX25hbWUsICIuIikgfHwgIXN0cmNtcChkcC0+ZF9uYW1lLCAiLi4iKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoc3RybGVuKG5hbWUpICsgMSArIHN0cmxlbihkcC0+ZF9uYW1lKSA+PSBzaXplb2YocGF0aCkgLSAxKSB7CisJCQlydW5fZXJyKCIlcy8lczogbmFtZSB0b28gbG9uZyIsIG5hbWUsIGRwLT5kX25hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJKHZvaWQpIHNucHJpbnRmKHBhdGgsIHNpemVvZiBwYXRoLCAiJXMvJXMiLCBuYW1lLCBkcC0+ZF9uYW1lKTsKKwkJdmVjdFswXSA9IHBhdGg7CisJCXNvdXJjZSgxLCB2ZWN0KTsKKwl9CisJKHZvaWQpIGNsb3NlZGlyKGRpcnApOworCSh2b2lkKSBhdG9taWNpbyh2d3JpdGUsIHJlbW91dCwgIkVcbiIsIDIpOworCSh2b2lkKSByZXNwb25zZSgpOworfQorCit2b2lkCitzaW5rKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgQlVGIGJ1ZmZlcjsKKwlzdHJ1Y3Qgc3RhdCBzdGI7CisJZW51bSB7CisJCVlFUywgTk8sIERJU1BMQVlFRAorCX0gd3JlcnI7CisJQlVGICpicDsKKwlvZmZfdCBpOworCXNpemVfdCBqLCBjb3VudDsKKwlpbnQgYW10LCBleGlzdHMsIGZpcnN0LCBvZmQ7CisJbW9kZV90IG1vZGUsIG9tb2RlLCBtYXNrOworCW9mZl90IHNpemUsIHN0YXRieXRlczsKKwlpbnQgc2V0aW1lcywgdGFyZ2lzZGlyLCB3cmVycm5vID0gMDsKKwljaGFyIGNoLCAqY3AsICpucCwgKnRhcmcsICp3aHksICp2ZWN0WzFdLCBidWZbMjA0OF07CisJc3RydWN0IHRpbWV2YWwgdHZbMl07CisKKyNkZWZpbmUJYXRpbWUJdHZbMF0KKyNkZWZpbmUJbXRpbWUJdHZbMV0KKyNkZWZpbmUJU0NSRVdVUChzdHIpCXsgd2h5ID0gc3RyOyBnb3RvIHNjcmV3dXA7IH0KKworCXNldGltZXMgPSB0YXJnaXNkaXIgPSAwOworCW1hc2sgPSB1bWFzaygwKTsKKwlpZiAoIXBmbGFnKQorCQkodm9pZCkgdW1hc2sobWFzayk7CisJaWYgKGFyZ2MgIT0gMSkgeworCQlydW5fZXJyKCJhbWJpZ3VvdXMgdGFyZ2V0Iik7CisJCWV4aXQoMSk7CisJfQorCXRhcmcgPSAqYXJndjsKKwlpZiAodGFyZ2V0c2hvdWxkYmVkaXJlY3RvcnkpCisJCXZlcmlmeWRpcih0YXJnKTsKKworCSh2b2lkKSBhdG9taWNpbyh2d3JpdGUsIHJlbW91dCwgIiIsIDEpOworCWlmIChzdGF0KHRhcmcsICZzdGIpID09IDAgJiYgU19JU0RJUihzdGIuc3RfbW9kZSkpCisJCXRhcmdpc2RpciA9IDE7CisJZm9yIChmaXJzdCA9IDE7OyBmaXJzdCA9IDApIHsKKwkJY3AgPSBidWY7CisJCWlmIChhdG9taWNpbyhyZWFkLCByZW1pbiwgY3AsIDEpICE9IDEpCisJCQlyZXR1cm47CisJCWlmICgqY3ArKyA9PSAnXG4nKQorCQkJU0NSRVdVUCgidW5leHBlY3RlZCA8bmV3bGluZT4iKTsKKwkJZG8geworCQkJaWYgKGF0b21pY2lvKHJlYWQsIHJlbWluLCAmY2gsIHNpemVvZihjaCkpICE9IHNpemVvZihjaCkpCisJCQkJU0NSRVdVUCgibG9zdCBjb25uZWN0aW9uIik7CisJCQkqY3ArKyA9IGNoOworCQl9IHdoaWxlIChjcCA8ICZidWZbc2l6ZW9mKGJ1ZikgLSAxXSAmJiBjaCAhPSAnXG4nKTsKKwkJKmNwID0gMDsKKwkJaWYgKHZlcmJvc2VfbW9kZSkKKwkJCWZwcmludGYoc3RkZXJyLCAiU2luazogJXMiLCBidWYpOworCisJCWlmIChidWZbMF0gPT0gJ1wwMScgfHwgYnVmWzBdID09ICdcMDInKSB7CisJCQlpZiAoaWFtcmVtb3RlID09IDApCisJCQkJKHZvaWQpIGF0b21pY2lvKHZ3cml0ZSwgU1RERVJSX0ZJTEVOTywKKwkJCQkgICAgYnVmICsgMSwgc3RybGVuKGJ1ZiArIDEpKTsKKwkJCWlmIChidWZbMF0gPT0gJ1wwMicpCisJCQkJZXhpdCgxKTsKKwkJCSsrZXJyczsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChidWZbMF0gPT0gJ0UnKSB7CisJCQkodm9pZCkgYXRvbWljaW8odndyaXRlLCByZW1vdXQsICIiLCAxKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoY2ggPT0gJ1xuJykKKwkJCSotLWNwID0gMDsKKworCQljcCA9IGJ1ZjsKKwkJaWYgKCpjcCA9PSAnVCcpIHsKKwkJCXNldGltZXMrKzsKKwkJCWNwKys7CisJCQltdGltZS50dl9zZWMgPSBzdHJ0b2woY3AsICZjcCwgMTApOworCQkJaWYgKCFjcCB8fCAqY3ArKyAhPSAnICcpCisJCQkJU0NSRVdVUCgibXRpbWUuc2VjIG5vdCBkZWxpbWl0ZWQiKTsKKwkJCW10aW1lLnR2X3VzZWMgPSBzdHJ0b2woY3AsICZjcCwgMTApOworCQkJaWYgKCFjcCB8fCAqY3ArKyAhPSAnICcpCisJCQkJU0NSRVdVUCgibXRpbWUudXNlYyBub3QgZGVsaW1pdGVkIik7CisJCQlhdGltZS50dl9zZWMgPSBzdHJ0b2woY3AsICZjcCwgMTApOworCQkJaWYgKCFjcCB8fCAqY3ArKyAhPSAnICcpCisJCQkJU0NSRVdVUCgiYXRpbWUuc2VjIG5vdCBkZWxpbWl0ZWQiKTsKKwkJCWF0aW1lLnR2X3VzZWMgPSBzdHJ0b2woY3AsICZjcCwgMTApOworCQkJaWYgKCFjcCB8fCAqY3ArKyAhPSAnXDAnKQorCQkJCVNDUkVXVVAoImF0aW1lLnVzZWMgbm90IGRlbGltaXRlZCIpOworCQkJKHZvaWQpIGF0b21pY2lvKHZ3cml0ZSwgcmVtb3V0LCAiIiwgMSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKmNwICE9ICdDJyAmJiAqY3AgIT0gJ0QnKSB7CisJCQkvKgorCQkJICogQ2hlY2sgZm9yIHRoZSBjYXNlICJyY3AgcmVtb3RlOmZvb1wqIGxvY2FsOmJhciIuCisJCQkgKiBJbiB0aGlzIGNhc2UsIHRoZSBsaW5lICJObyBtYXRjaC4iIGNhbiBiZSByZXR1cm5lZAorCQkJICogYnkgdGhlIHNoZWxsIGJlZm9yZSB0aGUgcmNwIGNvbW1hbmQgb24gdGhlIHJlbW90ZSBpcworCQkJICogZXhlY3V0ZWQgc28gdGhlIF5BZXJyb3JfbWVzc2FnZSBjb252ZW50aW9uIGlzbid0CisJCQkgKiBmb2xsb3dlZC4KKwkJCSAqLworCQkJaWYgKGZpcnN0KSB7CisJCQkJcnVuX2VycigiJXMiLCBjcCk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCVNDUkVXVVAoImV4cGVjdGVkIGNvbnRyb2wgcmVjb3JkIik7CisJCX0KKwkJbW9kZSA9IDA7CisJCWZvciAoKytjcDsgY3AgPCBidWYgKyA1OyBjcCsrKSB7CisJCQlpZiAoKmNwIDwgJzAnIHx8ICpjcCA+ICc3JykKKwkJCQlTQ1JFV1VQKCJiYWQgbW9kZSIpOworCQkJbW9kZSA9IChtb2RlIDw8IDMpIHwgKCpjcCAtICcwJyk7CisJCX0KKwkJaWYgKCpjcCsrICE9ICcgJykKKwkJCVNDUkVXVVAoIm1vZGUgbm90IGRlbGltaXRlZCIpOworCisJCWZvciAoc2l6ZSA9IDA7IGlzZGlnaXQoKmNwKTspCisJCQlzaXplID0gc2l6ZSAqIDEwICsgKCpjcCsrIC0gJzAnKTsKKwkJaWYgKCpjcCsrICE9ICcgJykKKwkJCVNDUkVXVVAoInNpemUgbm90IGRlbGltaXRlZCIpOworCQlpZiAoKHN0cmNocihjcCwgJy8nKSAhPSBOVUxMKSB8fCAoc3RyY21wKGNwLCAiLi4iKSA9PSAwKSkgeworCQkJcnVuX2VycigiZXJyb3I6IHVuZXhwZWN0ZWQgZmlsZW5hbWU6ICVzIiwgY3ApOworCQkJZXhpdCgxKTsKKwkJfQorCQlpZiAodGFyZ2lzZGlyKSB7CisJCQlzdGF0aWMgY2hhciAqbmFtZWJ1ZjsKKwkJCXN0YXRpYyBzaXplX3QgY3Vyc2l6ZTsKKwkJCXNpemVfdCBuZWVkOworCisJCQluZWVkID0gc3RybGVuKHRhcmcpICsgc3RybGVuKGNwKSArIDI1MDsKKwkJCWlmIChuZWVkID4gY3Vyc2l6ZSkgeworCQkJCWlmIChuYW1lYnVmKQorCQkJCQl4ZnJlZShuYW1lYnVmKTsKKwkJCQluYW1lYnVmID0geG1hbGxvYyhuZWVkKTsKKwkJCQljdXJzaXplID0gbmVlZDsKKwkJCX0KKwkJCSh2b2lkKSBzbnByaW50ZihuYW1lYnVmLCBuZWVkLCAiJXMlcyVzIiwgdGFyZywKKwkJCSAgICBzdHJjbXAodGFyZywgIi8iKSA/ICIvIiA6ICIiLCBjcCk7CisJCQlucCA9IG5hbWVidWY7CisJCX0gZWxzZQorCQkJbnAgPSB0YXJnOworCQljdXJmaWxlID0gY3A7CisJCWV4aXN0cyA9IHN0YXQobnAsICZzdGIpID09IDA7CisJCWlmIChidWZbMF0gPT0gJ0QnKSB7CisJCQlpbnQgbW9kX2ZsYWcgPSBwZmxhZzsKKwkJCWlmICghaWFtcmVjdXJzaXZlKQorCQkJCVNDUkVXVVAoInJlY2VpdmVkIGRpcmVjdG9yeSB3aXRob3V0IC1yIik7CisJCQlpZiAoZXhpc3RzKSB7CisJCQkJaWYgKCFTX0lTRElSKHN0Yi5zdF9tb2RlKSkgeworCQkJCQllcnJubyA9IEVOT1RESVI7CisJCQkJCWdvdG8gYmFkOworCQkJCX0KKwkJCQlpZiAocGZsYWcpCisJCQkJCSh2b2lkKSBjaG1vZChucCwgbW9kZSk7CisJCQl9IGVsc2UgeworCQkJCS8qIEhhbmRsZSBjb3B5aW5nIGZyb20gYSByZWFkLW9ubHkKKwkJCQkgICBkaXJlY3RvcnkgKi8KKwkJCQltb2RfZmxhZyA9IDE7CisJCQkJaWYgKG1rZGlyKG5wLCBtb2RlIHwgU19JUldYVSkgPCAwKQorCQkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCXZlY3RbMF0gPSB4c3RyZHVwKG5wKTsKKwkJCXNpbmsoMSwgdmVjdCk7CisJCQlpZiAoc2V0aW1lcykgeworCQkJCXNldGltZXMgPSAwOworCQkJCWlmICh1dGltZXModmVjdFswXSwgdHYpIDwgMCkKKwkJCQkJcnVuX2VycigiJXM6IHNldCB0aW1lczogJXMiLAorCQkJCQkgICAgdmVjdFswXSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0KKwkJCWlmIChtb2RfZmxhZykKKwkJCQkodm9pZCkgY2htb2QodmVjdFswXSwgbW9kZSk7CisJCQlpZiAodmVjdFswXSkKKwkJCQl4ZnJlZSh2ZWN0WzBdKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCW9tb2RlID0gbW9kZTsKKwkJbW9kZSB8PSBTX0lXUklURTsKKwkJaWYgKChvZmQgPSBvcGVuKG5wLCBPX1dST05MWXxPX0NSRUFULCBtb2RlKSkgPCAwKSB7CitiYWQ6CQkJcnVuX2VycigiJXM6ICVzIiwgbnAsIHN0cmVycm9yKGVycm5vKSk7CisJCQljb250aW51ZTsKKwkJfQorCQkodm9pZCkgYXRvbWljaW8odndyaXRlLCByZW1vdXQsICIiLCAxKTsKKwkJaWYgKChicCA9IGFsbG9jYnVmKCZidWZmZXIsIG9mZCwgQ09QWV9CVUZMRU4pKSA9PSBOVUxMKSB7CisJCQkodm9pZCkgY2xvc2Uob2ZkKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNwID0gYnAtPmJ1ZjsKKwkJd3JlcnIgPSBOTzsKKworCQlzdGF0Ynl0ZXMgPSAwOworCQlpZiAoc2hvd3Byb2dyZXNzKQorCQkJc3RhcnRfcHJvZ3Jlc3NfbWV0ZXIoY3VyZmlsZSwgc2l6ZSwgJnN0YXRieXRlcyk7CisJCXNldF9ub25ibG9jayhyZW1pbik7CisJCWZvciAoY291bnQgPSBpID0gMDsgaSA8IHNpemU7IGkgKz0gYnAtPmNudCkgeworCQkJYW10ID0gYnAtPmNudDsKKwkJCWlmIChpICsgYW10ID4gc2l6ZSkKKwkJCQlhbXQgPSBzaXplIC0gaTsKKwkJCWNvdW50ICs9IGFtdDsKKwkJCWRvIHsKKwkJCQlqID0gYXRvbWljaW82KHJlYWQsIHJlbWluLCBjcCwgYW10LAorCQkJCSAgICBzY3BpbywgJnN0YXRieXRlcyk7CisJCQkJaWYgKGogPT0gMCkgeworCQkJCQlydW5fZXJyKCIlcyIsIGogIT0gRVBJUEUgPworCQkJCQkgICAgc3RyZXJyb3IoZXJybm8pIDoKKwkJCQkJICAgICJkcm9wcGVkIGNvbm5lY3Rpb24iKTsKKwkJCQkJZXhpdCgxKTsKKwkJCQl9CisJCQkJYW10IC09IGo7CisJCQkJY3AgKz0gajsKKwkJCX0gd2hpbGUgKGFtdCA+IDApOworCisJCQlpZiAoY291bnQgPT0gYnAtPmNudCkgeworCQkJCS8qIEtlZXAgcmVhZGluZyBzbyB3ZSBzdGF5IHN5bmMnZCB1cC4gKi8KKwkJCQlpZiAod3JlcnIgPT0gTk8pIHsKKwkJCQkJaWYgKGF0b21pY2lvKHZ3cml0ZSwgb2ZkLCBicC0+YnVmLAorCQkJCQkgICAgY291bnQpICE9IGNvdW50KSB7CisJCQkJCQl3cmVyciA9IFlFUzsKKwkJCQkJCXdyZXJybm8gPSBlcnJubzsKKwkJCQkJfQorCQkJCX0KKwkJCQljb3VudCA9IDA7CisJCQkJY3AgPSBicC0+YnVmOworCQkJfQorCQl9CisJCXVuc2V0X25vbmJsb2NrKHJlbWluKTsKKwkJaWYgKHNob3dwcm9ncmVzcykKKwkJCXN0b3BfcHJvZ3Jlc3NfbWV0ZXIoKTsKKwkJaWYgKGNvdW50ICE9IDAgJiYgd3JlcnIgPT0gTk8gJiYKKwkJICAgIGF0b21pY2lvKHZ3cml0ZSwgb2ZkLCBicC0+YnVmLCBjb3VudCkgIT0gY291bnQpIHsKKwkJCXdyZXJyID0gWUVTOworCQkJd3JlcnJubyA9IGVycm5vOworCQl9CisJCWlmICh3cmVyciA9PSBOTyAmJiAoIWV4aXN0cyB8fCBTX0lTUkVHKHN0Yi5zdF9tb2RlKSkgJiYKKwkJICAgIGZ0cnVuY2F0ZShvZmQsIHNpemUpICE9IDApIHsKKwkJCXJ1bl9lcnIoIiVzOiB0cnVuY2F0ZTogJXMiLCBucCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXdyZXJyID0gRElTUExBWUVEOworCQl9CisJCWlmIChwZmxhZykgeworCQkJaWYgKGV4aXN0cyB8fCBvbW9kZSAhPSBtb2RlKQorI2lmZGVmIEhBVkVfRkNITU9ECisJCQkJaWYgKGZjaG1vZChvZmQsIG9tb2RlKSkgeworI2Vsc2UgLyogSEFWRV9GQ0hNT0QgKi8KKwkJCQlpZiAoY2htb2QobnAsIG9tb2RlKSkgeworI2VuZGlmIC8qIEhBVkVfRkNITU9EICovCisJCQkJCXJ1bl9lcnIoIiVzOiBzZXQgbW9kZTogJXMiLAorCQkJCQkgICAgbnAsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCXdyZXJyID0gRElTUExBWUVEOworCQkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghZXhpc3RzICYmIG9tb2RlICE9IG1vZGUpCisjaWZkZWYgSEFWRV9GQ0hNT0QKKwkJCQlpZiAoZmNobW9kKG9mZCwgb21vZGUgJiB+bWFzaykpIHsKKyNlbHNlIC8qIEhBVkVfRkNITU9EICovCisJCQkJaWYgKGNobW9kKG5wLCBvbW9kZSAmIH5tYXNrKSkgeworI2VuZGlmIC8qIEhBVkVfRkNITU9EICovCisJCQkJCXJ1bl9lcnIoIiVzOiBzZXQgbW9kZTogJXMiLAorCQkJCQkgICAgbnAsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCXdyZXJyID0gRElTUExBWUVEOworCQkJCX0KKwkJfQorCQlpZiAoY2xvc2Uob2ZkKSA9PSAtMSkgeworCQkJd3JlcnIgPSBZRVM7CisJCQl3cmVycm5vID0gZXJybm87CisJCX0KKwkJKHZvaWQpIHJlc3BvbnNlKCk7CisJCWlmIChzZXRpbWVzICYmIHdyZXJyID09IE5PKSB7CisJCQlzZXRpbWVzID0gMDsKKwkJCWlmICh1dGltZXMobnAsIHR2KSA8IDApIHsKKwkJCQlydW5fZXJyKCIlczogc2V0IHRpbWVzOiAlcyIsCisJCQkJICAgIG5wLCBzdHJlcnJvcihlcnJubykpOworCQkJCXdyZXJyID0gRElTUExBWUVEOworCQkJfQorCQl9CisJCXN3aXRjaCAod3JlcnIpIHsKKwkJY2FzZSBZRVM6CisJCQlydW5fZXJyKCIlczogJXMiLCBucCwgc3RyZXJyb3Iod3JlcnJubykpOworCQkJYnJlYWs7CisJCWNhc2UgTk86CisJCQkodm9pZCkgYXRvbWljaW8odndyaXRlLCByZW1vdXQsICIiLCAxKTsKKwkJCWJyZWFrOworCQljYXNlIERJU1BMQVlFRDoKKwkJCWJyZWFrOworCQl9CisJfQorc2NyZXd1cDoKKwlydW5fZXJyKCJwcm90b2NvbCBlcnJvcjogJXMiLCB3aHkpOworCWV4aXQoMSk7Cit9CisKK2ludAorcmVzcG9uc2Uodm9pZCkKK3sKKwljaGFyIGNoLCAqY3AsIHJlc3AsIHJidWZbMjA0OF07CisKKwlpZiAoYXRvbWljaW8ocmVhZCwgcmVtaW4sICZyZXNwLCBzaXplb2YocmVzcCkpICE9IHNpemVvZihyZXNwKSkKKwkJbG9zdGNvbm4oMCk7CisKKwljcCA9IHJidWY7CisJc3dpdGNoIChyZXNwKSB7CisJY2FzZSAwOgkJLyogb2sgKi8KKwkJcmV0dXJuICgwKTsKKwlkZWZhdWx0OgorCQkqY3ArKyA9IHJlc3A7CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSAxOgkJLyogZXJyb3IsIGZvbGxvd2VkIGJ5IGVycm9yIG1zZyAqLworCWNhc2UgMjoJCS8qIGZhdGFsIGVycm9yLCAiIiAqLworCQlkbyB7CisJCQlpZiAoYXRvbWljaW8ocmVhZCwgcmVtaW4sICZjaCwgc2l6ZW9mKGNoKSkgIT0gc2l6ZW9mKGNoKSkKKwkJCQlsb3N0Y29ubigwKTsKKwkJCSpjcCsrID0gY2g7CisJCX0gd2hpbGUgKGNwIDwgJnJidWZbc2l6ZW9mKHJidWYpIC0gMV0gJiYgY2ggIT0gJ1xuJyk7CisKKwkJaWYgKCFpYW1yZW1vdGUpCisJCQkodm9pZCkgYXRvbWljaW8odndyaXRlLCBTVERFUlJfRklMRU5PLCByYnVmLCBjcCAtIHJidWYpOworCQkrK2VycnM7CisJCWlmIChyZXNwID09IDEpCisJCQlyZXR1cm4gKC0xKTsKKwkJZXhpdCgxKTsKKwl9CisJLyogTk9UUkVBQ0hFRCAqLworfQorCit2b2lkCit1c2FnZSh2b2lkKQoreworCSh2b2lkKSBmcHJpbnRmKHN0ZGVyciwKKwkgICAgInVzYWdlOiBzY3AgWy0xMjM0NkJDcHFydl0gWy1jIGNpcGhlcl0gWy1GIHNzaF9jb25maWddIFstaSBpZGVudGl0eV9maWxlXVxuIgorCSAgICAiICAgICAgICAgICBbLWwgbGltaXRdIFstbyBzc2hfb3B0aW9uXSBbLVAgcG9ydF0gWy1TIHByb2dyYW1dXG4iCisJICAgICIgICAgICAgICAgIFtbdXNlckBdaG9zdDE6XWZpbGUxIC4uLiBbW3VzZXJAXWhvc3QyOl1maWxlMlxuIik7CisJZXhpdCgxKTsKK30KKwordm9pZAorcnVuX2Vycihjb25zdCBjaGFyICpmbXQsLi4uKQoreworCXN0YXRpYyBGSUxFICpmcDsKKwl2YV9saXN0IGFwOworCisJKytlcnJzOworCWlmIChmcCAhPSBOVUxMIHx8IChyZW1vdXQgIT0gLTEgJiYgKGZwID0gZmRvcGVuKHJlbW91dCwgInciKSkpKSB7CisJCSh2b2lkKSBmcHJpbnRmKGZwLCAiJWMiLCAweDAxKTsKKwkJKHZvaWQpIGZwcmludGYoZnAsICJzY3A6ICIpOworCQl2YV9zdGFydChhcCwgZm10KTsKKwkJKHZvaWQpIHZmcHJpbnRmKGZwLCBmbXQsIGFwKTsKKwkJdmFfZW5kKGFwKTsKKwkJKHZvaWQpIGZwcmludGYoZnAsICJcbiIpOworCQkodm9pZCkgZmZsdXNoKGZwKTsKKwl9CisKKwlpZiAoIWlhbXJlbW90ZSkgeworCQl2YV9zdGFydChhcCwgZm10KTsKKwkJdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKwkJdmFfZW5kKGFwKTsKKwkJZnByaW50ZihzdGRlcnIsICJcbiIpOworCX0KK30KKwordm9pZAordmVyaWZ5ZGlyKGNoYXIgKmNwKQoreworCXN0cnVjdCBzdGF0IHN0YjsKKworCWlmICghc3RhdChjcCwgJnN0YikpIHsKKwkJaWYgKFNfSVNESVIoc3RiLnN0X21vZGUpKQorCQkJcmV0dXJuOworCQllcnJubyA9IEVOT1RESVI7CisJfQorCXJ1bl9lcnIoIiVzOiAlcyIsIGNwLCBzdHJlcnJvcihlcnJubykpOworCWtpbGxjaGlsZCgwKTsKK30KKworaW50Citva25hbWUoY2hhciAqY3AwKQoreworCWludCBjOworCWNoYXIgKmNwOworCisJY3AgPSBjcDA7CisJZG8geworCQljID0gKGludCkqY3A7CisJCWlmIChjICYgMDIwMCkKKwkJCWdvdG8gYmFkOworCQlpZiAoIWlzYWxwaGEoYykgJiYgIWlzZGlnaXQoYykpIHsKKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSAnXCcnOgorCQkJY2FzZSAnIic6CisJCQljYXNlICdgJzoKKwkJCWNhc2UgJyAnOgorCQkJY2FzZSAnIyc6CisJCQkJZ290byBiYWQ7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSB3aGlsZSAoKisrY3ApOworCXJldHVybiAoMSk7CisKK2JhZDoJZnByaW50ZihzdGRlcnIsICIlczogaW52YWxpZCB1c2VyIG5hbWVcbiIsIGNwMCk7CisJcmV0dXJuICgwKTsKK30KKworQlVGICoKK2FsbG9jYnVmKEJVRiAqYnAsIGludCBmZCwgaW50IGJsa3NpemUpCit7CisJc2l6ZV90IHNpemU7CisjaWZkZWYgSEFWRV9TVFJVQ1RfU1RBVF9TVF9CTEtTSVpFCisJc3RydWN0IHN0YXQgc3RiOworCisJaWYgKGZzdGF0KGZkLCAmc3RiKSA8IDApIHsKKwkJcnVuX2VycigiZnN0YXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJc2l6ZSA9IHJvdW5kdXAoc3RiLnN0X2Jsa3NpemUsIGJsa3NpemUpOworCWlmIChzaXplID09IDApCisJCXNpemUgPSBibGtzaXplOworI2Vsc2UgLyogSEFWRV9TVFJVQ1RfU1RBVF9TVF9CTEtTSVpFICovCisJc2l6ZSA9IGJsa3NpemU7CisjZW5kaWYgLyogSEFWRV9TVFJVQ1RfU1RBVF9TVF9CTEtTSVpFICovCisJaWYgKGJwLT5jbnQgPj0gc2l6ZSkKKwkJcmV0dXJuIChicCk7CisJaWYgKGJwLT5idWYgPT0gTlVMTCkKKwkJYnAtPmJ1ZiA9IHhtYWxsb2Moc2l6ZSk7CisJZWxzZQorCQlicC0+YnVmID0geHJlYWxsb2MoYnAtPmJ1ZiwgMSwgc2l6ZSk7CisJbWVtc2V0KGJwLT5idWYsIDAsIHNpemUpOworCWJwLT5jbnQgPSBzaXplOworCXJldHVybiAoYnApOworfQorCit2b2lkCitsb3N0Y29ubihpbnQgc2lnbm8pCit7CisJaWYgKCFpYW1yZW1vdGUpCisJCXdyaXRlKFNUREVSUl9GSUxFTk8sICJsb3N0IGNvbm5lY3Rpb25cbiIsIDE2KTsKKwlpZiAoc2lnbm8pCisJCV9leGl0KDEpOworCWVsc2UKKwkJZXhpdCgxKTsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc2VydmNvbmYuYyBiL29wZW5zc2gtNi4wcDEvc2VydmNvbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWM1Y2EwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zZXJ2Y29uZi5jCkBAIC0wLDAgKzEsMTc5OCBAQAorLyogJE9wZW5CU0Q6IHNlcnZjb25mLmMsdiAxLjIyMyAyMDExLzA5LzIzIDAwOjIyOjA0IGR0dWNrZXIgRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAorICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW5fc3lzdG0uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L3N5cy1xdWV1ZS5oIgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJzc2guaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJzZXJ2Y29uZi5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorI2luY2x1ZGUgInBhdGhuYW1lcy5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJjaXBoZXIuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJrZXguaCIKKyNpbmNsdWRlICJtYWMuaCIKKyNpbmNsdWRlICJtYXRjaC5oIgorI2luY2x1ZGUgImNoYW5uZWxzLmgiCisjaW5jbHVkZSAiZ3JvdXBhY2Nlc3MuaCIKKworc3RhdGljIHZvaWQgYWRkX2xpc3Rlbl9hZGRyKFNlcnZlck9wdGlvbnMgKiwgY2hhciAqLCBpbnQpOworc3RhdGljIHZvaWQgYWRkX29uZV9saXN0ZW5fYWRkcihTZXJ2ZXJPcHRpb25zICosIGNoYXIgKiwgaW50KTsKKworLyogVXNlIG9mIHByaXZpbGVnZSBzZXBhcmF0aW9uIG9yIG5vdCAqLworZXh0ZXJuIGludCB1c2VfcHJpdnNlcDsKK2V4dGVybiBCdWZmZXIgY2ZnOworCisvKiBJbml0aWFsaXplcyB0aGUgc2VydmVyIG9wdGlvbnMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuICovCisKK3ZvaWQKK2luaXRpYWxpemVfc2VydmVyX29wdGlvbnMoU2VydmVyT3B0aW9ucyAqb3B0aW9ucykKK3sKKwltZW1zZXQob3B0aW9ucywgMCwgc2l6ZW9mKCpvcHRpb25zKSk7CisKKwkvKiBQb3J0YWJsZS1zcGVjaWZpYyBvcHRpb25zICovCisJb3B0aW9ucy0+dXNlX3BhbSA9IC0xOworCisJLyogU3RhbmRhcmQgT3B0aW9ucyAqLworCW9wdGlvbnMtPm51bV9wb3J0cyA9IDA7CisJb3B0aW9ucy0+cG9ydHNfZnJvbV9jbWRsaW5lID0gMDsKKwlvcHRpb25zLT5saXN0ZW5fYWRkcnMgPSBOVUxMOworCW9wdGlvbnMtPmFkZHJlc3NfZmFtaWx5ID0gLTE7CisJb3B0aW9ucy0+bnVtX2hvc3Rfa2V5X2ZpbGVzID0gMDsKKwlvcHRpb25zLT5udW1faG9zdF9jZXJ0X2ZpbGVzID0gMDsKKwlvcHRpb25zLT5waWRfZmlsZSA9IE5VTEw7CisJb3B0aW9ucy0+c2VydmVyX2tleV9iaXRzID0gLTE7CisJb3B0aW9ucy0+bG9naW5fZ3JhY2VfdGltZSA9IC0xOworCW9wdGlvbnMtPmtleV9yZWdlbmVyYXRpb25fdGltZSA9IC0xOworCW9wdGlvbnMtPnBlcm1pdF9yb290X2xvZ2luID0gUEVSTUlUX05PVF9TRVQ7CisJb3B0aW9ucy0+aWdub3JlX3Job3N0cyA9IC0xOworCW9wdGlvbnMtPmlnbm9yZV91c2VyX2tub3duX2hvc3RzID0gLTE7CisJb3B0aW9ucy0+cHJpbnRfbW90ZCA9IC0xOworCW9wdGlvbnMtPnByaW50X2xhc3Rsb2cgPSAtMTsKKwlvcHRpb25zLT54MTFfZm9yd2FyZGluZyA9IC0xOworCW9wdGlvbnMtPngxMV9kaXNwbGF5X29mZnNldCA9IC0xOworCW9wdGlvbnMtPngxMV91c2VfbG9jYWxob3N0ID0gLTE7CisJb3B0aW9ucy0+eGF1dGhfbG9jYXRpb24gPSBOVUxMOworCW9wdGlvbnMtPnN0cmljdF9tb2RlcyA9IC0xOworCW9wdGlvbnMtPnRjcF9rZWVwX2FsaXZlID0gLTE7CisJb3B0aW9ucy0+bG9nX2ZhY2lsaXR5ID0gU1lTTE9HX0ZBQ0lMSVRZX05PVF9TRVQ7CisJb3B0aW9ucy0+bG9nX2xldmVsID0gU1lTTE9HX0xFVkVMX05PVF9TRVQ7CisJb3B0aW9ucy0+cmhvc3RzX3JzYV9hdXRoZW50aWNhdGlvbiA9IC0xOworCW9wdGlvbnMtPmhvc3RiYXNlZF9hdXRoZW50aWNhdGlvbiA9IC0xOworCW9wdGlvbnMtPmhvc3RiYXNlZF91c2VzX25hbWVfZnJvbV9wYWNrZXRfb25seSA9IC0xOworCW9wdGlvbnMtPnJzYV9hdXRoZW50aWNhdGlvbiA9IC0xOworCW9wdGlvbnMtPnB1YmtleV9hdXRoZW50aWNhdGlvbiA9IC0xOworCW9wdGlvbnMtPmtlcmJlcm9zX2F1dGhlbnRpY2F0aW9uID0gLTE7CisJb3B0aW9ucy0+a2VyYmVyb3Nfb3JfbG9jYWxfcGFzc3dkID0gLTE7CisJb3B0aW9ucy0+a2VyYmVyb3NfdGlja2V0X2NsZWFudXAgPSAtMTsKKwlvcHRpb25zLT5rZXJiZXJvc19nZXRfYWZzX3Rva2VuID0gLTE7CisJb3B0aW9ucy0+Z3NzX2F1dGhlbnRpY2F0aW9uPS0xOworCW9wdGlvbnMtPmdzc19jbGVhbnVwX2NyZWRzID0gLTE7CisJb3B0aW9ucy0+cGFzc3dvcmRfYXV0aGVudGljYXRpb24gPSAtMTsKKwlvcHRpb25zLT5rYmRfaW50ZXJhY3RpdmVfYXV0aGVudGljYXRpb24gPSAtMTsKKwlvcHRpb25zLT5jaGFsbGVuZ2VfcmVzcG9uc2VfYXV0aGVudGljYXRpb24gPSAtMTsKKwlvcHRpb25zLT5wZXJtaXRfZW1wdHlfcGFzc3dkID0gLTE7CisJb3B0aW9ucy0+cGVybWl0X3VzZXJfZW52ID0gLTE7CisJb3B0aW9ucy0+dXNlX2xvZ2luID0gLTE7CisJb3B0aW9ucy0+Y29tcHJlc3Npb24gPSAtMTsKKwlvcHRpb25zLT5hbGxvd190Y3BfZm9yd2FyZGluZyA9IC0xOworCW9wdGlvbnMtPmFsbG93X2FnZW50X2ZvcndhcmRpbmcgPSAtMTsKKwlvcHRpb25zLT5udW1fYWxsb3dfdXNlcnMgPSAwOworCW9wdGlvbnMtPm51bV9kZW55X3VzZXJzID0gMDsKKwlvcHRpb25zLT5udW1fYWxsb3dfZ3JvdXBzID0gMDsKKwlvcHRpb25zLT5udW1fZGVueV9ncm91cHMgPSAwOworCW9wdGlvbnMtPmNpcGhlcnMgPSBOVUxMOworCW9wdGlvbnMtPm1hY3MgPSBOVUxMOworCW9wdGlvbnMtPmtleF9hbGdvcml0aG1zID0gTlVMTDsKKwlvcHRpb25zLT5wcm90b2NvbCA9IFNTSF9QUk9UT19VTktOT1dOOworCW9wdGlvbnMtPmdhdGV3YXlfcG9ydHMgPSAtMTsKKwlvcHRpb25zLT5udW1fc3Vic3lzdGVtcyA9IDA7CisJb3B0aW9ucy0+bWF4X3N0YXJ0dXBzX2JlZ2luID0gLTE7CisJb3B0aW9ucy0+bWF4X3N0YXJ0dXBzX3JhdGUgPSAtMTsKKwlvcHRpb25zLT5tYXhfc3RhcnR1cHMgPSAtMTsKKwlvcHRpb25zLT5tYXhfYXV0aHRyaWVzID0gLTE7CisJb3B0aW9ucy0+bWF4X3Nlc3Npb25zID0gLTE7CisJb3B0aW9ucy0+YmFubmVyID0gTlVMTDsKKwlvcHRpb25zLT51c2VfZG5zID0gLTE7CisJb3B0aW9ucy0+Y2xpZW50X2FsaXZlX2ludGVydmFsID0gLTE7CisJb3B0aW9ucy0+Y2xpZW50X2FsaXZlX2NvdW50X21heCA9IC0xOworCW9wdGlvbnMtPm51bV9hdXRoa2V5c19maWxlcyA9IDA7CisJb3B0aW9ucy0+bnVtX2FjY2VwdF9lbnYgPSAwOworCW9wdGlvbnMtPnBlcm1pdF90dW4gPSAtMTsKKwlvcHRpb25zLT5udW1fcGVybWl0dGVkX29wZW5zID0gLTE7CisJb3B0aW9ucy0+YWRtX2ZvcmNlZF9jb21tYW5kID0gTlVMTDsKKwlvcHRpb25zLT5jaHJvb3RfZGlyZWN0b3J5ID0gTlVMTDsKKwlvcHRpb25zLT56ZXJvX2tub3dsZWRnZV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbiA9IC0xOworCW9wdGlvbnMtPnJldm9rZWRfa2V5c19maWxlID0gTlVMTDsKKwlvcHRpb25zLT50cnVzdGVkX3VzZXJfY2Ffa2V5cyA9IE5VTEw7CisJb3B0aW9ucy0+YXV0aG9yaXplZF9wcmluY2lwYWxzX2ZpbGUgPSBOVUxMOworCW9wdGlvbnMtPmlwX3Fvc19pbnRlcmFjdGl2ZSA9IC0xOworCW9wdGlvbnMtPmlwX3Fvc19idWxrID0gLTE7Cit9CisKK3ZvaWQKK2ZpbGxfZGVmYXVsdF9zZXJ2ZXJfb3B0aW9ucyhTZXJ2ZXJPcHRpb25zICpvcHRpb25zKQoreworCS8qIFBvcnRhYmxlLXNwZWNpZmljIG9wdGlvbnMgKi8KKwlpZiAob3B0aW9ucy0+dXNlX3BhbSA9PSAtMSkKKwkJb3B0aW9ucy0+dXNlX3BhbSA9IDA7CisKKwkvKiBTdGFuZGFyZCBPcHRpb25zICovCisJaWYgKG9wdGlvbnMtPnByb3RvY29sID09IFNTSF9QUk9UT19VTktOT1dOKQorCQlvcHRpb25zLT5wcm90b2NvbCA9IFNTSF9QUk9UT18yOworCWlmIChvcHRpb25zLT5udW1faG9zdF9rZXlfZmlsZXMgPT0gMCkgeworCQkvKiBmaWxsIGRlZmF1bHQgaG9zdGtleXMgZm9yIHByb3RvY29scyAqLworCQlpZiAob3B0aW9ucy0+cHJvdG9jb2wgJiBTU0hfUFJPVE9fMSkKKwkJCW9wdGlvbnMtPmhvc3Rfa2V5X2ZpbGVzW29wdGlvbnMtPm51bV9ob3N0X2tleV9maWxlcysrXSA9CisJCQkgICAgX1BBVEhfSE9TVF9LRVlfRklMRTsKKwkJaWYgKG9wdGlvbnMtPnByb3RvY29sICYgU1NIX1BST1RPXzIpIHsKKwkJCW9wdGlvbnMtPmhvc3Rfa2V5X2ZpbGVzW29wdGlvbnMtPm51bV9ob3N0X2tleV9maWxlcysrXSA9CisJCQkgICAgX1BBVEhfSE9TVF9SU0FfS0VZX0ZJTEU7CisJCQlvcHRpb25zLT5ob3N0X2tleV9maWxlc1tvcHRpb25zLT5udW1faG9zdF9rZXlfZmlsZXMrK10gPQorCQkJICAgIF9QQVRIX0hPU1RfRFNBX0tFWV9GSUxFOworI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworCQkJb3B0aW9ucy0+aG9zdF9rZXlfZmlsZXNbb3B0aW9ucy0+bnVtX2hvc3Rfa2V5X2ZpbGVzKytdID0KKwkJCSAgICBfUEFUSF9IT1NUX0VDRFNBX0tFWV9GSUxFOworI2VuZGlmCisJCX0KKwl9CisJLyogTm8gY2VydGlmaWNhdGVzIGJ5IGRlZmF1bHQgKi8KKwlpZiAob3B0aW9ucy0+bnVtX3BvcnRzID09IDApCisJCW9wdGlvbnMtPnBvcnRzW29wdGlvbnMtPm51bV9wb3J0cysrXSA9IFNTSF9ERUZBVUxUX1BPUlQ7CisJaWYgKG9wdGlvbnMtPmxpc3Rlbl9hZGRycyA9PSBOVUxMKQorCQlhZGRfbGlzdGVuX2FkZHIob3B0aW9ucywgTlVMTCwgMCk7CisJaWYgKG9wdGlvbnMtPnBpZF9maWxlID09IE5VTEwpCisJCW9wdGlvbnMtPnBpZF9maWxlID0gX1BBVEhfU1NIX0RBRU1PTl9QSURfRklMRTsKKwlpZiAob3B0aW9ucy0+c2VydmVyX2tleV9iaXRzID09IC0xKQorCQlvcHRpb25zLT5zZXJ2ZXJfa2V5X2JpdHMgPSAxMDI0OworCWlmIChvcHRpb25zLT5sb2dpbl9ncmFjZV90aW1lID09IC0xKQorCQlvcHRpb25zLT5sb2dpbl9ncmFjZV90aW1lID0gMTIwOworCWlmIChvcHRpb25zLT5rZXlfcmVnZW5lcmF0aW9uX3RpbWUgPT0gLTEpCisJCW9wdGlvbnMtPmtleV9yZWdlbmVyYXRpb25fdGltZSA9IDM2MDA7CisJaWYgKG9wdGlvbnMtPnBlcm1pdF9yb290X2xvZ2luID09IFBFUk1JVF9OT1RfU0VUKQorCQlvcHRpb25zLT5wZXJtaXRfcm9vdF9sb2dpbiA9IFBFUk1JVF9ZRVM7CisJaWYgKG9wdGlvbnMtPmlnbm9yZV9yaG9zdHMgPT0gLTEpCisJCW9wdGlvbnMtPmlnbm9yZV9yaG9zdHMgPSAxOworCWlmIChvcHRpb25zLT5pZ25vcmVfdXNlcl9rbm93bl9ob3N0cyA9PSAtMSkKKwkJb3B0aW9ucy0+aWdub3JlX3VzZXJfa25vd25faG9zdHMgPSAwOworCWlmIChvcHRpb25zLT5wcmludF9tb3RkID09IC0xKQorCQlvcHRpb25zLT5wcmludF9tb3RkID0gMTsKKwlpZiAob3B0aW9ucy0+cHJpbnRfbGFzdGxvZyA9PSAtMSkKKwkJb3B0aW9ucy0+cHJpbnRfbGFzdGxvZyA9IDE7CisJaWYgKG9wdGlvbnMtPngxMV9mb3J3YXJkaW5nID09IC0xKQorCQlvcHRpb25zLT54MTFfZm9yd2FyZGluZyA9IDA7CisJaWYgKG9wdGlvbnMtPngxMV9kaXNwbGF5X29mZnNldCA9PSAtMSkKKwkJb3B0aW9ucy0+eDExX2Rpc3BsYXlfb2Zmc2V0ID0gMTA7CisJaWYgKG9wdGlvbnMtPngxMV91c2VfbG9jYWxob3N0ID09IC0xKQorCQlvcHRpb25zLT54MTFfdXNlX2xvY2FsaG9zdCA9IDE7CisJaWYgKG9wdGlvbnMtPnhhdXRoX2xvY2F0aW9uID09IE5VTEwpCisJCW9wdGlvbnMtPnhhdXRoX2xvY2F0aW9uID0gX1BBVEhfWEFVVEg7CisJaWYgKG9wdGlvbnMtPnN0cmljdF9tb2RlcyA9PSAtMSkKKwkJb3B0aW9ucy0+c3RyaWN0X21vZGVzID0gMTsKKwlpZiAob3B0aW9ucy0+dGNwX2tlZXBfYWxpdmUgPT0gLTEpCisJCW9wdGlvbnMtPnRjcF9rZWVwX2FsaXZlID0gMTsKKwlpZiAob3B0aW9ucy0+bG9nX2ZhY2lsaXR5ID09IFNZU0xPR19GQUNJTElUWV9OT1RfU0VUKQorCQlvcHRpb25zLT5sb2dfZmFjaWxpdHkgPSBTWVNMT0dfRkFDSUxJVFlfQVVUSDsKKwlpZiAob3B0aW9ucy0+bG9nX2xldmVsID09IFNZU0xPR19MRVZFTF9OT1RfU0VUKQorCQlvcHRpb25zLT5sb2dfbGV2ZWwgPSBTWVNMT0dfTEVWRUxfSU5GTzsKKwlpZiAob3B0aW9ucy0+cmhvc3RzX3JzYV9hdXRoZW50aWNhdGlvbiA9PSAtMSkKKwkJb3B0aW9ucy0+cmhvc3RzX3JzYV9hdXRoZW50aWNhdGlvbiA9IDA7CisJaWYgKG9wdGlvbnMtPmhvc3RiYXNlZF9hdXRoZW50aWNhdGlvbiA9PSAtMSkKKwkJb3B0aW9ucy0+aG9zdGJhc2VkX2F1dGhlbnRpY2F0aW9uID0gMDsKKwlpZiAob3B0aW9ucy0+aG9zdGJhc2VkX3VzZXNfbmFtZV9mcm9tX3BhY2tldF9vbmx5ID09IC0xKQorCQlvcHRpb25zLT5ob3N0YmFzZWRfdXNlc19uYW1lX2Zyb21fcGFja2V0X29ubHkgPSAwOworCWlmIChvcHRpb25zLT5yc2FfYXV0aGVudGljYXRpb24gPT0gLTEpCisJCW9wdGlvbnMtPnJzYV9hdXRoZW50aWNhdGlvbiA9IDE7CisJaWYgKG9wdGlvbnMtPnB1YmtleV9hdXRoZW50aWNhdGlvbiA9PSAtMSkKKwkJb3B0aW9ucy0+cHVia2V5X2F1dGhlbnRpY2F0aW9uID0gMTsKKwlpZiAob3B0aW9ucy0+a2VyYmVyb3NfYXV0aGVudGljYXRpb24gPT0gLTEpCisJCW9wdGlvbnMtPmtlcmJlcm9zX2F1dGhlbnRpY2F0aW9uID0gMDsKKwlpZiAob3B0aW9ucy0+a2VyYmVyb3Nfb3JfbG9jYWxfcGFzc3dkID09IC0xKQorCQlvcHRpb25zLT5rZXJiZXJvc19vcl9sb2NhbF9wYXNzd2QgPSAxOworCWlmIChvcHRpb25zLT5rZXJiZXJvc190aWNrZXRfY2xlYW51cCA9PSAtMSkKKwkJb3B0aW9ucy0+a2VyYmVyb3NfdGlja2V0X2NsZWFudXAgPSAxOworCWlmIChvcHRpb25zLT5rZXJiZXJvc19nZXRfYWZzX3Rva2VuID09IC0xKQorCQlvcHRpb25zLT5rZXJiZXJvc19nZXRfYWZzX3Rva2VuID0gMDsKKwlpZiAob3B0aW9ucy0+Z3NzX2F1dGhlbnRpY2F0aW9uID09IC0xKQorCQlvcHRpb25zLT5nc3NfYXV0aGVudGljYXRpb24gPSAwOworCWlmIChvcHRpb25zLT5nc3NfY2xlYW51cF9jcmVkcyA9PSAtMSkKKwkJb3B0aW9ucy0+Z3NzX2NsZWFudXBfY3JlZHMgPSAxOworCWlmIChvcHRpb25zLT5wYXNzd29yZF9hdXRoZW50aWNhdGlvbiA9PSAtMSkKKwkJb3B0aW9ucy0+cGFzc3dvcmRfYXV0aGVudGljYXRpb24gPSAxOworCWlmIChvcHRpb25zLT5rYmRfaW50ZXJhY3RpdmVfYXV0aGVudGljYXRpb24gPT0gLTEpCisJCW9wdGlvbnMtPmtiZF9pbnRlcmFjdGl2ZV9hdXRoZW50aWNhdGlvbiA9IDA7CisJaWYgKG9wdGlvbnMtPmNoYWxsZW5nZV9yZXNwb25zZV9hdXRoZW50aWNhdGlvbiA9PSAtMSkKKwkJb3B0aW9ucy0+Y2hhbGxlbmdlX3Jlc3BvbnNlX2F1dGhlbnRpY2F0aW9uID0gMTsKKwlpZiAob3B0aW9ucy0+cGVybWl0X2VtcHR5X3Bhc3N3ZCA9PSAtMSkKKwkJb3B0aW9ucy0+cGVybWl0X2VtcHR5X3Bhc3N3ZCA9IDA7CisJaWYgKG9wdGlvbnMtPnBlcm1pdF91c2VyX2VudiA9PSAtMSkKKwkJb3B0aW9ucy0+cGVybWl0X3VzZXJfZW52ID0gMDsKKwlpZiAob3B0aW9ucy0+dXNlX2xvZ2luID09IC0xKQorCQlvcHRpb25zLT51c2VfbG9naW4gPSAwOworCWlmIChvcHRpb25zLT5jb21wcmVzc2lvbiA9PSAtMSkKKwkJb3B0aW9ucy0+Y29tcHJlc3Npb24gPSBDT01QX0RFTEFZRUQ7CisJaWYgKG9wdGlvbnMtPmFsbG93X3RjcF9mb3J3YXJkaW5nID09IC0xKQorCQlvcHRpb25zLT5hbGxvd190Y3BfZm9yd2FyZGluZyA9IDE7CisJaWYgKG9wdGlvbnMtPmFsbG93X2FnZW50X2ZvcndhcmRpbmcgPT0gLTEpCisJCW9wdGlvbnMtPmFsbG93X2FnZW50X2ZvcndhcmRpbmcgPSAxOworCWlmIChvcHRpb25zLT5nYXRld2F5X3BvcnRzID09IC0xKQorCQlvcHRpb25zLT5nYXRld2F5X3BvcnRzID0gMDsKKwlpZiAob3B0aW9ucy0+bWF4X3N0YXJ0dXBzID09IC0xKQorCQlvcHRpb25zLT5tYXhfc3RhcnR1cHMgPSAxMDsKKwlpZiAob3B0aW9ucy0+bWF4X3N0YXJ0dXBzX3JhdGUgPT0gLTEpCisJCW9wdGlvbnMtPm1heF9zdGFydHVwc19yYXRlID0gMTAwOwkJLyogMTAwJSAqLworCWlmIChvcHRpb25zLT5tYXhfc3RhcnR1cHNfYmVnaW4gPT0gLTEpCisJCW9wdGlvbnMtPm1heF9zdGFydHVwc19iZWdpbiA9IG9wdGlvbnMtPm1heF9zdGFydHVwczsKKwlpZiAob3B0aW9ucy0+bWF4X2F1dGh0cmllcyA9PSAtMSkKKwkJb3B0aW9ucy0+bWF4X2F1dGh0cmllcyA9IERFRkFVTFRfQVVUSF9GQUlMX01BWDsKKwlpZiAob3B0aW9ucy0+bWF4X3Nlc3Npb25zID09IC0xKQorCQlvcHRpb25zLT5tYXhfc2Vzc2lvbnMgPSBERUZBVUxUX1NFU1NJT05TX01BWDsKKwlpZiAob3B0aW9ucy0+dXNlX2RucyA9PSAtMSkKKwkJb3B0aW9ucy0+dXNlX2RucyA9IDE7CisJaWYgKG9wdGlvbnMtPmNsaWVudF9hbGl2ZV9pbnRlcnZhbCA9PSAtMSkKKwkJb3B0aW9ucy0+Y2xpZW50X2FsaXZlX2ludGVydmFsID0gMDsKKwlpZiAob3B0aW9ucy0+Y2xpZW50X2FsaXZlX2NvdW50X21heCA9PSAtMSkKKwkJb3B0aW9ucy0+Y2xpZW50X2FsaXZlX2NvdW50X21heCA9IDM7CisJaWYgKG9wdGlvbnMtPm51bV9hdXRoa2V5c19maWxlcyA9PSAwKSB7CisJCW9wdGlvbnMtPmF1dGhvcml6ZWRfa2V5c19maWxlc1tvcHRpb25zLT5udW1fYXV0aGtleXNfZmlsZXMrK10gPQorCQkgICAgeHN0cmR1cChfUEFUSF9TU0hfVVNFUl9QRVJNSVRURURfS0VZUyk7CisJCW9wdGlvbnMtPmF1dGhvcml6ZWRfa2V5c19maWxlc1tvcHRpb25zLT5udW1fYXV0aGtleXNfZmlsZXMrK10gPQorCQkgICAgeHN0cmR1cChfUEFUSF9TU0hfVVNFUl9QRVJNSVRURURfS0VZUzIpOworCX0KKwlpZiAob3B0aW9ucy0+cGVybWl0X3R1biA9PSAtMSkKKwkJb3B0aW9ucy0+cGVybWl0X3R1biA9IFNTSF9UVU5NT0RFX05POworCWlmIChvcHRpb25zLT56ZXJvX2tub3dsZWRnZV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbiA9PSAtMSkKKwkJb3B0aW9ucy0+emVyb19rbm93bGVkZ2VfcGFzc3dvcmRfYXV0aGVudGljYXRpb24gPSAwOworCWlmIChvcHRpb25zLT5pcF9xb3NfaW50ZXJhY3RpdmUgPT0gLTEpCisJCW9wdGlvbnMtPmlwX3Fvc19pbnRlcmFjdGl2ZSA9IElQVE9TX0xPV0RFTEFZOworCWlmIChvcHRpb25zLT5pcF9xb3NfYnVsayA9PSAtMSkKKwkJb3B0aW9ucy0+aXBfcW9zX2J1bGsgPSBJUFRPU19USFJPVUdIUFVUOworCisJLyogVHVybiBwcml2aWxlZ2Ugc2VwYXJhdGlvbiBvbiBieSBkZWZhdWx0ICovCisJaWYgKHVzZV9wcml2c2VwID09IC0xKQorCQl1c2VfcHJpdnNlcCA9IFBSSVZTRVBfT047CisKKyNpZm5kZWYgSEFWRV9NTUFQCisJaWYgKHVzZV9wcml2c2VwICYmIG9wdGlvbnMtPmNvbXByZXNzaW9uID09IDEpIHsKKwkJZXJyb3IoIlRoaXMgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBib3RoIHByaXZpbGVnZSAiCisJCSAgICAic2VwYXJhdGlvbiBhbmQgY29tcHJlc3Npb24iKTsKKwkJZXJyb3IoIkNvbXByZXNzaW9uIGRpc2FibGVkIik7CisJCW9wdGlvbnMtPmNvbXByZXNzaW9uID0gMDsKKwl9CisjZW5kaWYKKworfQorCisvKiBLZXl3b3JkIHRva2Vucy4gKi8KK3R5cGVkZWYgZW51bSB7CisJc0JhZE9wdGlvbiwJCS8qID09IHVua25vd24gb3B0aW9uICovCisJLyogUG9ydGFibGUtc3BlY2lmaWMgb3B0aW9ucyAqLworCXNVc2VQQU0sCisJLyogU3RhbmRhcmQgT3B0aW9ucyAqLworCXNQb3J0LCBzSG9zdEtleUZpbGUsIHNTZXJ2ZXJLZXlCaXRzLCBzTG9naW5HcmFjZVRpbWUsIHNLZXlSZWdlbmVyYXRpb25UaW1lLAorCXNQZXJtaXRSb290TG9naW4sIHNMb2dGYWNpbGl0eSwgc0xvZ0xldmVsLAorCXNSaG9zdHNSU0FBdXRoZW50aWNhdGlvbiwgc1JTQUF1dGhlbnRpY2F0aW9uLAorCXNLZXJiZXJvc0F1dGhlbnRpY2F0aW9uLCBzS2VyYmVyb3NPckxvY2FsUGFzc3dkLCBzS2VyYmVyb3NUaWNrZXRDbGVhbnVwLAorCXNLZXJiZXJvc0dldEFGU1Rva2VuLAorCXNLZXJiZXJvc1RndFBhc3NpbmcsIHNDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uLAorCXNQYXNzd29yZEF1dGhlbnRpY2F0aW9uLCBzS2JkSW50ZXJhY3RpdmVBdXRoZW50aWNhdGlvbiwKKwlzTGlzdGVuQWRkcmVzcywgc0FkZHJlc3NGYW1pbHksCisJc1ByaW50TW90ZCwgc1ByaW50TGFzdExvZywgc0lnbm9yZVJob3N0cywKKwlzWDExRm9yd2FyZGluZywgc1gxMURpc3BsYXlPZmZzZXQsIHNYMTFVc2VMb2NhbGhvc3QsCisJc1N0cmljdE1vZGVzLCBzRW1wdHlQYXNzd2QsIHNUQ1BLZWVwQWxpdmUsCisJc1Blcm1pdFVzZXJFbnZpcm9ubWVudCwgc1VzZUxvZ2luLCBzQWxsb3dUY3BGb3J3YXJkaW5nLCBzQ29tcHJlc3Npb24sCisJc0FsbG93VXNlcnMsIHNEZW55VXNlcnMsIHNBbGxvd0dyb3Vwcywgc0RlbnlHcm91cHMsCisJc0lnbm9yZVVzZXJLbm93bkhvc3RzLCBzQ2lwaGVycywgc01hY3MsIHNQcm90b2NvbCwgc1BpZEZpbGUsCisJc0dhdGV3YXlQb3J0cywgc1B1YmtleUF1dGhlbnRpY2F0aW9uLCBzWEF1dGhMb2NhdGlvbiwgc1N1YnN5c3RlbSwKKwlzTWF4U3RhcnR1cHMsIHNNYXhBdXRoVHJpZXMsIHNNYXhTZXNzaW9ucywKKwlzQmFubmVyLCBzVXNlRE5TLCBzSG9zdGJhc2VkQXV0aGVudGljYXRpb24sCisJc0hvc3RiYXNlZFVzZXNOYW1lRnJvbVBhY2tldE9ubHksIHNDbGllbnRBbGl2ZUludGVydmFsLAorCXNDbGllbnRBbGl2ZUNvdW50TWF4LCBzQXV0aG9yaXplZEtleXNGaWxlLAorCXNHc3NBdXRoZW50aWNhdGlvbiwgc0dzc0NsZWFudXBDcmVkcywgc0FjY2VwdEVudiwgc1Blcm1pdFR1bm5lbCwKKwlzTWF0Y2gsIHNQZXJtaXRPcGVuLCBzRm9yY2VDb21tYW5kLCBzQ2hyb290RGlyZWN0b3J5LAorCXNVc2VQcml2aWxlZ2VTZXBhcmF0aW9uLCBzQWxsb3dBZ2VudEZvcndhcmRpbmcsCisJc1plcm9Lbm93bGVkZ2VQYXNzd29yZEF1dGhlbnRpY2F0aW9uLCBzSG9zdENlcnRpZmljYXRlLAorCXNSZXZva2VkS2V5cywgc1RydXN0ZWRVc2VyQ0FLZXlzLCBzQXV0aG9yaXplZFByaW5jaXBhbHNGaWxlLAorCXNLZXhBbGdvcml0aG1zLCBzSVBRb1MsCisJc0RlcHJlY2F0ZWQsIHNVbnN1cHBvcnRlZAorfSBTZXJ2ZXJPcENvZGVzOworCisjZGVmaW5lIFNTSENGR19HTE9CQUwJMHgwMQkvKiBhbGxvd2VkIGluIG1haW4gc2VjdGlvbiBvZiBzc2hkX2NvbmZpZyAqLworI2RlZmluZSBTU0hDRkdfTUFUQ0gJMHgwMgkvKiBhbGxvd2VkIGluc2lkZSBhIE1hdGNoIHNlY3Rpb24gKi8KKyNkZWZpbmUgU1NIQ0ZHX0FMTAkoU1NIQ0ZHX0dMT0JBTHxTU0hDRkdfTUFUQ0gpCisKKy8qIFRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRva2Vucy4gKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJU2VydmVyT3BDb2RlcyBvcGNvZGU7CisJdV9pbnQgZmxhZ3M7Cit9IGtleXdvcmRzW10gPSB7CisJLyogUG9ydGFibGUtc3BlY2lmaWMgb3B0aW9ucyAqLworI2lmZGVmIFVTRV9QQU0KKwl7ICJ1c2VwYW0iLCBzVXNlUEFNLCBTU0hDRkdfR0xPQkFMIH0sCisjZWxzZQorCXsgInVzZXBhbSIsIHNVbnN1cHBvcnRlZCwgU1NIQ0ZHX0dMT0JBTCB9LAorI2VuZGlmCisJeyAicGFtYXV0aGVudGljYXRpb252aWFrYmRpbnQiLCBzRGVwcmVjYXRlZCwgU1NIQ0ZHX0dMT0JBTCB9LAorCS8qIFN0YW5kYXJkIE9wdGlvbnMgKi8KKwl7ICJwb3J0Iiwgc1BvcnQsIFNTSENGR19HTE9CQUwgfSwKKwl7ICJob3N0a2V5Iiwgc0hvc3RLZXlGaWxlLCBTU0hDRkdfR0xPQkFMIH0sCisJeyAiaG9zdGRzYWtleSIsIHNIb3N0S2V5RmlsZSwgU1NIQ0ZHX0dMT0JBTCB9LAkJLyogYWxpYXMgKi8KKwl7ICJwaWRmaWxlIiwgc1BpZEZpbGUsIFNTSENGR19HTE9CQUwgfSwKKwl7ICJzZXJ2ZXJrZXliaXRzIiwgc1NlcnZlcktleUJpdHMsIFNTSENGR19HTE9CQUwgfSwKKwl7ICJsb2dpbmdyYWNldGltZSIsIHNMb2dpbkdyYWNlVGltZSwgU1NIQ0ZHX0dMT0JBTCB9LAorCXsgImtleXJlZ2VuZXJhdGlvbmludGVydmFsIiwgc0tleVJlZ2VuZXJhdGlvblRpbWUsIFNTSENGR19HTE9CQUwgfSwKKwl7ICJwZXJtaXRyb290bG9naW4iLCBzUGVybWl0Um9vdExvZ2luLCBTU0hDRkdfQUxMIH0sCisJeyAic3lzbG9nZmFjaWxpdHkiLCBzTG9nRmFjaWxpdHksIFNTSENGR19HTE9CQUwgfSwKKwl7ICJsb2dsZXZlbCIsIHNMb2dMZXZlbCwgU1NIQ0ZHX0dMT0JBTCB9LAorCXsgInJob3N0c2F1dGhlbnRpY2F0aW9uIiwgc0RlcHJlY2F0ZWQsIFNTSENGR19HTE9CQUwgfSwKKwl7ICJyaG9zdHNyc2FhdXRoZW50aWNhdGlvbiIsIHNSaG9zdHNSU0FBdXRoZW50aWNhdGlvbiwgU1NIQ0ZHX0FMTCB9LAorCXsgImhvc3RiYXNlZGF1dGhlbnRpY2F0aW9uIiwgc0hvc3RiYXNlZEF1dGhlbnRpY2F0aW9uLCBTU0hDRkdfQUxMIH0sCisJeyAiaG9zdGJhc2VkdXNlc25hbWVmcm9tcGFja2V0b25seSIsIHNIb3N0YmFzZWRVc2VzTmFtZUZyb21QYWNrZXRPbmx5LCBTU0hDRkdfQUxMIH0sCisJeyAicnNhYXV0aGVudGljYXRpb24iLCBzUlNBQXV0aGVudGljYXRpb24sIFNTSENGR19BTEwgfSwKKwl7ICJwdWJrZXlhdXRoZW50aWNhdGlvbiIsIHNQdWJrZXlBdXRoZW50aWNhdGlvbiwgU1NIQ0ZHX0FMTCB9LAorCXsgImRzYWF1dGhlbnRpY2F0aW9uIiwgc1B1YmtleUF1dGhlbnRpY2F0aW9uLCBTU0hDRkdfR0xPQkFMIH0sIC8qIGFsaWFzICovCisjaWZkZWYgS1JCNQorCXsgImtlcmJlcm9zYXV0aGVudGljYXRpb24iLCBzS2VyYmVyb3NBdXRoZW50aWNhdGlvbiwgU1NIQ0ZHX0FMTCB9LAorCXsgImtlcmJlcm9zb3Jsb2NhbHBhc3N3ZCIsIHNLZXJiZXJvc09yTG9jYWxQYXNzd2QsIFNTSENGR19HTE9CQUwgfSwKKwl7ICJrZXJiZXJvc3RpY2tldGNsZWFudXAiLCBzS2VyYmVyb3NUaWNrZXRDbGVhbnVwLCBTU0hDRkdfR0xPQkFMIH0sCisjaWZkZWYgVVNFX0FGUworCXsgImtlcmJlcm9zZ2V0YWZzdG9rZW4iLCBzS2VyYmVyb3NHZXRBRlNUb2tlbiwgU1NIQ0ZHX0dMT0JBTCB9LAorI2Vsc2UKKwl7ICJrZXJiZXJvc2dldGFmc3Rva2VuIiwgc1Vuc3VwcG9ydGVkLCBTU0hDRkdfR0xPQkFMIH0sCisjZW5kaWYKKyNlbHNlCisJeyAia2VyYmVyb3NhdXRoZW50aWNhdGlvbiIsIHNVbnN1cHBvcnRlZCwgU1NIQ0ZHX0FMTCB9LAorCXsgImtlcmJlcm9zb3Jsb2NhbHBhc3N3ZCIsIHNVbnN1cHBvcnRlZCwgU1NIQ0ZHX0dMT0JBTCB9LAorCXsgImtlcmJlcm9zdGlja2V0Y2xlYW51cCIsIHNVbnN1cHBvcnRlZCwgU1NIQ0ZHX0dMT0JBTCB9LAorCXsgImtlcmJlcm9zZ2V0YWZzdG9rZW4iLCBzVW5zdXBwb3J0ZWQsIFNTSENGR19HTE9CQUwgfSwKKyNlbmRpZgorCXsgImtlcmJlcm9zdGd0cGFzc2luZyIsIHNVbnN1cHBvcnRlZCwgU1NIQ0ZHX0dMT0JBTCB9LAorCXsgImFmc3Rva2VucGFzc2luZyIsIHNVbnN1cHBvcnRlZCwgU1NIQ0ZHX0dMT0JBTCB9LAorI2lmZGVmIEdTU0FQSQorCXsgImdzc2FwaWF1dGhlbnRpY2F0aW9uIiwgc0dzc0F1dGhlbnRpY2F0aW9uLCBTU0hDRkdfQUxMIH0sCisJeyAiZ3NzYXBpY2xlYW51cGNyZWRlbnRpYWxzIiwgc0dzc0NsZWFudXBDcmVkcywgU1NIQ0ZHX0dMT0JBTCB9LAorI2Vsc2UKKwl7ICJnc3NhcGlhdXRoZW50aWNhdGlvbiIsIHNVbnN1cHBvcnRlZCwgU1NIQ0ZHX0FMTCB9LAorCXsgImdzc2FwaWNsZWFudXBjcmVkZW50aWFscyIsIHNVbnN1cHBvcnRlZCwgU1NIQ0ZHX0dMT0JBTCB9LAorI2VuZGlmCisJeyAicGFzc3dvcmRhdXRoZW50aWNhdGlvbiIsIHNQYXNzd29yZEF1dGhlbnRpY2F0aW9uLCBTU0hDRkdfQUxMIH0sCisJeyAia2JkaW50ZXJhY3RpdmVhdXRoZW50aWNhdGlvbiIsIHNLYmRJbnRlcmFjdGl2ZUF1dGhlbnRpY2F0aW9uLCBTU0hDRkdfQUxMIH0sCisJeyAiY2hhbGxlbmdlcmVzcG9uc2VhdXRoZW50aWNhdGlvbiIsIHNDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uLCBTU0hDRkdfR0xPQkFMIH0sCisJeyAic2tleWF1dGhlbnRpY2F0aW9uIiwgc0NoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24sIFNTSENGR19HTE9CQUwgfSwgLyogYWxpYXMgKi8KKyNpZmRlZiBKUEFLRQorCXsgInplcm9rbm93bGVkZ2VwYXNzd29yZGF1dGhlbnRpY2F0aW9uIiwgc1plcm9Lbm93bGVkZ2VQYXNzd29yZEF1dGhlbnRpY2F0aW9uLCBTU0hDRkdfQUxMIH0sCisjZWxzZQorCXsgInplcm9rbm93bGVkZ2VwYXNzd29yZGF1dGhlbnRpY2F0aW9uIiwgc1Vuc3VwcG9ydGVkLCBTU0hDRkdfQUxMIH0sCisjZW5kaWYKKwl7ICJjaGVja21haWwiLCBzRGVwcmVjYXRlZCwgU1NIQ0ZHX0dMT0JBTCB9LAorCXsgImxpc3RlbmFkZHJlc3MiLCBzTGlzdGVuQWRkcmVzcywgU1NIQ0ZHX0dMT0JBTCB9LAorCXsgImFkZHJlc3NmYW1pbHkiLCBzQWRkcmVzc0ZhbWlseSwgU1NIQ0ZHX0dMT0JBTCB9LAorCXsgInByaW50bW90ZCIsIHNQcmludE1vdGQsIFNTSENGR19HTE9CQUwgfSwKKwl7ICJwcmludGxhc3Rsb2ciLCBzUHJpbnRMYXN0TG9nLCBTU0hDRkdfR0xPQkFMIH0sCisJeyAiaWdub3Jlcmhvc3RzIiwgc0lnbm9yZVJob3N0cywgU1NIQ0ZHX0dMT0JBTCB9LAorCXsgImlnbm9yZXVzZXJrbm93bmhvc3RzIiwgc0lnbm9yZVVzZXJLbm93bkhvc3RzLCBTU0hDRkdfR0xPQkFMIH0sCisJeyAieDExZm9yd2FyZGluZyIsIHNYMTFGb3J3YXJkaW5nLCBTU0hDRkdfQUxMIH0sCisJeyAieDExZGlzcGxheW9mZnNldCIsIHNYMTFEaXNwbGF5T2Zmc2V0LCBTU0hDRkdfQUxMIH0sCisJeyAieDExdXNlbG9jYWxob3N0Iiwgc1gxMVVzZUxvY2FsaG9zdCwgU1NIQ0ZHX0FMTCB9LAorCXsgInhhdXRobG9jYXRpb24iLCBzWEF1dGhMb2NhdGlvbiwgU1NIQ0ZHX0dMT0JBTCB9LAorCXsgInN0cmljdG1vZGVzIiwgc1N0cmljdE1vZGVzLCBTU0hDRkdfR0xPQkFMIH0sCisJeyAicGVybWl0ZW1wdHlwYXNzd29yZHMiLCBzRW1wdHlQYXNzd2QsIFNTSENGR19BTEwgfSwKKwl7ICJwZXJtaXR1c2VyZW52aXJvbm1lbnQiLCBzUGVybWl0VXNlckVudmlyb25tZW50LCBTU0hDRkdfR0xPQkFMIH0sCisJeyAidXNlbG9naW4iLCBzVXNlTG9naW4sIFNTSENGR19HTE9CQUwgfSwKKwl7ICJjb21wcmVzc2lvbiIsIHNDb21wcmVzc2lvbiwgU1NIQ0ZHX0dMT0JBTCB9LAorCXsgInRjcGtlZXBhbGl2ZSIsIHNUQ1BLZWVwQWxpdmUsIFNTSENGR19HTE9CQUwgfSwKKwl7ICJrZWVwYWxpdmUiLCBzVENQS2VlcEFsaXZlLCBTU0hDRkdfR0xPQkFMIH0sCS8qIG9ic29sZXRlIGFsaWFzICovCisJeyAiYWxsb3d0Y3Bmb3J3YXJkaW5nIiwgc0FsbG93VGNwRm9yd2FyZGluZywgU1NIQ0ZHX0FMTCB9LAorCXsgImFsbG93YWdlbnRmb3J3YXJkaW5nIiwgc0FsbG93QWdlbnRGb3J3YXJkaW5nLCBTU0hDRkdfQUxMIH0sCisJeyAiYWxsb3d1c2VycyIsIHNBbGxvd1VzZXJzLCBTU0hDRkdfR0xPQkFMIH0sCisJeyAiZGVueXVzZXJzIiwgc0RlbnlVc2VycywgU1NIQ0ZHX0dMT0JBTCB9LAorCXsgImFsbG93Z3JvdXBzIiwgc0FsbG93R3JvdXBzLCBTU0hDRkdfR0xPQkFMIH0sCisJeyAiZGVueWdyb3VwcyIsIHNEZW55R3JvdXBzLCBTU0hDRkdfR0xPQkFMIH0sCisJeyAiY2lwaGVycyIsIHNDaXBoZXJzLCBTU0hDRkdfR0xPQkFMIH0sCisJeyAibWFjcyIsIHNNYWNzLCBTU0hDRkdfR0xPQkFMIH0sCisJeyAicHJvdG9jb2wiLCBzUHJvdG9jb2wsIFNTSENGR19HTE9CQUwgfSwKKwl7ICJnYXRld2F5cG9ydHMiLCBzR2F0ZXdheVBvcnRzLCBTU0hDRkdfQUxMIH0sCisJeyAic3Vic3lzdGVtIiwgc1N1YnN5c3RlbSwgU1NIQ0ZHX0dMT0JBTCB9LAorCXsgIm1heHN0YXJ0dXBzIiwgc01heFN0YXJ0dXBzLCBTU0hDRkdfR0xPQkFMIH0sCisJeyAibWF4YXV0aHRyaWVzIiwgc01heEF1dGhUcmllcywgU1NIQ0ZHX0FMTCB9LAorCXsgIm1heHNlc3Npb25zIiwgc01heFNlc3Npb25zLCBTU0hDRkdfQUxMIH0sCisJeyAiYmFubmVyIiwgc0Jhbm5lciwgU1NIQ0ZHX0FMTCB9LAorCXsgInVzZWRucyIsIHNVc2VETlMsIFNTSENGR19HTE9CQUwgfSwKKwl7ICJ2ZXJpZnlyZXZlcnNlbWFwcGluZyIsIHNEZXByZWNhdGVkLCBTU0hDRkdfR0xPQkFMIH0sCisJeyAicmV2ZXJzZW1hcHBpbmdjaGVjayIsIHNEZXByZWNhdGVkLCBTU0hDRkdfR0xPQkFMIH0sCisJeyAiY2xpZW50YWxpdmVpbnRlcnZhbCIsIHNDbGllbnRBbGl2ZUludGVydmFsLCBTU0hDRkdfR0xPQkFMIH0sCisJeyAiY2xpZW50YWxpdmVjb3VudG1heCIsIHNDbGllbnRBbGl2ZUNvdW50TWF4LCBTU0hDRkdfR0xPQkFMIH0sCisJeyAiYXV0aG9yaXplZGtleXNmaWxlIiwgc0F1dGhvcml6ZWRLZXlzRmlsZSwgU1NIQ0ZHX0FMTCB9LAorCXsgImF1dGhvcml6ZWRrZXlzZmlsZTIiLCBzRGVwcmVjYXRlZCwgU1NIQ0ZHX0FMTCB9LAorCXsgInVzZXByaXZpbGVnZXNlcGFyYXRpb24iLCBzVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiwgU1NIQ0ZHX0dMT0JBTH0sCisJeyAiYWNjZXB0ZW52Iiwgc0FjY2VwdEVudiwgU1NIQ0ZHX0dMT0JBTCB9LAorCXsgInBlcm1pdHR1bm5lbCIsIHNQZXJtaXRUdW5uZWwsIFNTSENGR19BTEwgfSwKKwl7ICJtYXRjaCIsIHNNYXRjaCwgU1NIQ0ZHX0FMTCB9LAorCXsgInBlcm1pdG9wZW4iLCBzUGVybWl0T3BlbiwgU1NIQ0ZHX0FMTCB9LAorCXsgImZvcmNlY29tbWFuZCIsIHNGb3JjZUNvbW1hbmQsIFNTSENGR19BTEwgfSwKKwl7ICJjaHJvb3RkaXJlY3RvcnkiLCBzQ2hyb290RGlyZWN0b3J5LCBTU0hDRkdfQUxMIH0sCisJeyAiaG9zdGNlcnRpZmljYXRlIiwgc0hvc3RDZXJ0aWZpY2F0ZSwgU1NIQ0ZHX0dMT0JBTCB9LAorCXsgInJldm9rZWRrZXlzIiwgc1Jldm9rZWRLZXlzLCBTU0hDRkdfQUxMIH0sCisJeyAidHJ1c3RlZHVzZXJjYWtleXMiLCBzVHJ1c3RlZFVzZXJDQUtleXMsIFNTSENGR19BTEwgfSwKKwl7ICJhdXRob3JpemVkcHJpbmNpcGFsc2ZpbGUiLCBzQXV0aG9yaXplZFByaW5jaXBhbHNGaWxlLCBTU0hDRkdfQUxMIH0sCisJeyAia2V4YWxnb3JpdGhtcyIsIHNLZXhBbGdvcml0aG1zLCBTU0hDRkdfR0xPQkFMIH0sCisJeyAiaXBxb3MiLCBzSVBRb1MsIFNTSENGR19BTEwgfSwKKwl7IE5VTEwsIHNCYWRPcHRpb24sIDAgfQorfTsKKworc3RhdGljIHN0cnVjdCB7CisJaW50IHZhbDsKKwljaGFyICp0ZXh0OworfSB0dW5tb2RlX2Rlc2NbXSA9IHsKKwl7IFNTSF9UVU5NT0RFX05PLCAibm8iIH0sCisJeyBTU0hfVFVOTU9ERV9QT0lOVE9QT0lOVCwgInBvaW50LXRvLXBvaW50IiB9LAorCXsgU1NIX1RVTk1PREVfRVRIRVJORVQsICJldGhlcm5ldCIgfSwKKwl7IFNTSF9UVU5NT0RFX1lFUywgInllcyIgfSwKKwl7IC0xLCBOVUxMIH0KK307CisKKy8qCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIHRva2VuIHBvaW50ZWQgdG8gYnkgY3Agb3Igc0JhZE9wdGlvbi4KKyAqLworCitzdGF0aWMgU2VydmVyT3BDb2RlcworcGFyc2VfdG9rZW4oY29uc3QgY2hhciAqY3AsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCSAgICBpbnQgbGluZW51bSwgdV9pbnQgKmZsYWdzKQoreworCXVfaW50IGk7CisKKwlmb3IgKGkgPSAwOyBrZXl3b3Jkc1tpXS5uYW1lOyBpKyspCisJCWlmIChzdHJjYXNlY21wKGNwLCBrZXl3b3Jkc1tpXS5uYW1lKSA9PSAwKSB7CisJCQkqZmxhZ3MgPSBrZXl3b3Jkc1tpXS5mbGFnczsKKwkJCXJldHVybiBrZXl3b3Jkc1tpXS5vcGNvZGU7CisJCX0KKworCWVycm9yKCIlczogbGluZSAlZDogQmFkIGNvbmZpZ3VyYXRpb24gb3B0aW9uOiAlcyIsCisJICAgIGZpbGVuYW1lLCBsaW5lbnVtLCBjcCk7CisJcmV0dXJuIHNCYWRPcHRpb247Cit9CisKK2NoYXIgKgorZGVyZWxhdGl2aXNlX3BhdGgoY29uc3QgY2hhciAqcGF0aCkKK3sKKwljaGFyICpleHBhbmRlZCwgKnJldCwgY3dkW01BWFBBVEhMRU5dOworCisJZXhwYW5kZWQgPSB0aWxkZV9leHBhbmRfZmlsZW5hbWUocGF0aCwgZ2V0dWlkKCkpOworCWlmICgqZXhwYW5kZWQgPT0gJy8nKQorCQlyZXR1cm4gZXhwYW5kZWQ7CisJaWYgKGdldGN3ZChjd2QsIHNpemVvZihjd2QpKSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IGdldGN3ZDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwl4YXNwcmludGYoJnJldCwgIiVzLyVzIiwgY3dkLCBleHBhbmRlZCk7CisJeGZyZWUoZXhwYW5kZWQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCithZGRfbGlzdGVuX2FkZHIoU2VydmVyT3B0aW9ucyAqb3B0aW9ucywgY2hhciAqYWRkciwgaW50IHBvcnQpCit7CisJdV9pbnQgaTsKKworCWlmIChvcHRpb25zLT5udW1fcG9ydHMgPT0gMCkKKwkJb3B0aW9ucy0+cG9ydHNbb3B0aW9ucy0+bnVtX3BvcnRzKytdID0gU1NIX0RFRkFVTFRfUE9SVDsKKwlpZiAob3B0aW9ucy0+YWRkcmVzc19mYW1pbHkgPT0gLTEpCisJCW9wdGlvbnMtPmFkZHJlc3NfZmFtaWx5ID0gQUZfVU5TUEVDOworCWlmIChwb3J0ID09IDApCisJCWZvciAoaSA9IDA7IGkgPCBvcHRpb25zLT5udW1fcG9ydHM7IGkrKykKKwkJCWFkZF9vbmVfbGlzdGVuX2FkZHIob3B0aW9ucywgYWRkciwgb3B0aW9ucy0+cG9ydHNbaV0pOworCWVsc2UKKwkJYWRkX29uZV9saXN0ZW5fYWRkcihvcHRpb25zLCBhZGRyLCBwb3J0KTsKK30KKworc3RhdGljIHZvaWQKK2FkZF9vbmVfbGlzdGVuX2FkZHIoU2VydmVyT3B0aW9ucyAqb3B0aW9ucywgY2hhciAqYWRkciwgaW50IHBvcnQpCit7CisJc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWksICphaXRvcDsKKwljaGFyIHN0cnBvcnRbTklfTUFYU0VSVl07CisJaW50IGdhaWVycjsKKworCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworCWhpbnRzLmFpX2ZhbWlseSA9IG9wdGlvbnMtPmFkZHJlc3NfZmFtaWx5OworCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisJaGludHMuYWlfZmxhZ3MgPSAoYWRkciA9PSBOVUxMKSA/IEFJX1BBU1NJVkUgOiAwOworCXNucHJpbnRmKHN0cnBvcnQsIHNpemVvZiBzdHJwb3J0LCAiJWQiLCBwb3J0KTsKKwlpZiAoKGdhaWVyciA9IGdldGFkZHJpbmZvKGFkZHIsIHN0cnBvcnQsICZoaW50cywgJmFpdG9wKSkgIT0gMCkKKwkJZmF0YWwoImJhZCBhZGRyIG9yIGhvc3Q6ICVzICglcykiLAorCQkgICAgYWRkciA/IGFkZHIgOiAiPE5VTEw+IiwKKwkJICAgIHNzaF9nYWlfc3RyZXJyb3IoZ2FpZXJyKSk7CisJZm9yIChhaSA9IGFpdG9wOyBhaS0+YWlfbmV4dDsgYWkgPSBhaS0+YWlfbmV4dCkKKwkJOworCWFpLT5haV9uZXh0ID0gb3B0aW9ucy0+bGlzdGVuX2FkZHJzOworCW9wdGlvbnMtPmxpc3Rlbl9hZGRycyA9IGFpdG9wOworfQorCisvKgorICogVGhlIHN0cmF0ZWd5IGZvciB0aGUgTWF0Y2ggYmxvY2tzIGlzIHRoYXQgdGhlIGNvbmZpZyBmaWxlIGlzIHBhcnNlZCB0d2ljZS4KKyAqCisgKiBUaGUgZmlyc3QgdGltZSBpcyBhdCBzdGFydHVwLiAgYWN0aXZlcCBpcyBpbml0aWFsaXplZCB0byAxIGFuZCB0aGUKKyAqIGRpcmVjdGl2ZXMgaW4gdGhlIGdsb2JhbCBjb250ZXh0IGFyZSBwcm9jZXNzZWQgYW5kIGFjdGVkIG9uLiAgSGl0dGluZyBhCisgKiBNYXRjaCBkaXJlY3RpdmUgdW5zZXRzIGFjdGl2ZXAgYW5kIHRoZSBkaXJlY3RpdmVzIGluc2lkZSB0aGUgYmxvY2sgYXJlCisgKiBjaGVja2VkIGZvciBzeW50YXggb25seS4KKyAqCisgKiBUaGUgc2Vjb25kIHRpbWUgaXMgYWZ0ZXIgYSBjb25uZWN0aW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkIGJ1dCBiZWZvcmUKKyAqIGF1dGhlbnRpY2F0aW9uLiAgYWN0aXZlcCBpcyBpbml0aWFsaXplZCB0byAyIGFuZCBnbG9iYWwgY29uZmlnIGRpcmVjdGl2ZXMKKyAqIGFyZSBpZ25vcmVkIHNpbmNlIHRoZXkgaGF2ZSBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkLiAgSWYgdGhlIGNyaXRlcmlhIGluIGEKKyAqIE1hdGNoIGJsb2NrIGlzIG1ldCwgYWN0aXZlcCBpcyBzZXQgYW5kIHRoZSBzdWJzZXF1ZW50IGRpcmVjdGl2ZXMKKyAqIHByb2Nlc3NlZCBhbmQgYWN0aW9uZWQgdW50aWwgRU9GIG9yIGFub3RoZXIgTWF0Y2ggYmxvY2sgdW5zZXRzIGl0LiAgQW55CisgKiBvcHRpb25zIHNldCBhcmUgY29waWVkIGludG8gdGhlIG1haW4gc2VydmVyIGNvbmZpZy4KKyAqCisgKiBQb3RlbnRpYWwgYWRkaXRpb25zL2ltcHJvdmVtZW50czoKKyAqICAtIEFkZCBNYXRjaCBzdXBwb3J0IGZvciBwcmUta2V4IGRpcmVjdGl2ZXMsIGVnIFByb3RvY29sLCBDaXBoZXJzLgorICoKKyAqICAtIEFkZCBhIFRhZyBkaXJlY3RpdmUgKGlkZWEgZnJvbSBEYXZpZCBMZW9uYXJkKSBhbGEgcGYsIGVnOgorICoJTWF0Y2ggQWRkcmVzcyAxOTIuMTY4LjAuKgorICoJCVRhZyB0cnVzdGVkCisgKglNYXRjaCBHcm91cCB3aGVlbAorICoJCVRhZyB0cnVzdGVkCisgKglNYXRjaCBUYWcgdHJ1c3RlZAorICoJCUFsbG93VGNwRm9yd2FyZGluZyB5ZXMKKyAqCQlHYXRld2F5UG9ydHMgY2xpZW50c3BlY2lmaWVkCisgKgkJWy4uLl0KKyAqCisgKiAgLSBBZGQgYSBQZXJtaXR0ZWRDaGFubmVsUmVxdWVzdHMgZGlyZWN0aXZlCisgKglNYXRjaCBHcm91cCBzaGVsbAorICoJCVBlcm1pdHRlZENoYW5uZWxSZXF1ZXN0cyBzZXNzaW9uLGZvcndhcmRlZC10Y3BpcAorICovCisKK3N0YXRpYyBpbnQKK21hdGNoX2NmZ19saW5lX2dyb3VwKGNvbnN0IGNoYXIgKmdycHMsIGludCBsaW5lLCBjb25zdCBjaGFyICp1c2VyKQoreworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBwYXNzd2QgKnB3OworCisJaWYgKHVzZXIgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlpZiAoKHB3ID0gZ2V0cHduYW0odXNlcikpID09IE5VTEwpIHsKKwkJZGVidWcoIkNhbid0IG1hdGNoIGdyb3VwIGF0IGxpbmUgJWQgYmVjYXVzZSB1c2VyICUuMTAwcyBkb2VzICIKKwkJICAgICJub3QgZXhpc3QiLCBsaW5lLCB1c2VyKTsKKwl9IGVsc2UgaWYgKGdhX2luaXQocHctPnB3X25hbWUsIHB3LT5wd19naWQpID09IDApIHsKKwkJZGVidWcoIkNhbid0IE1hdGNoIGdyb3VwIGJlY2F1c2UgdXNlciAlLjEwMHMgbm90IGluIGFueSBncm91cCAiCisJCSAgICAiYXQgbGluZSAlZCIsIHVzZXIsIGxpbmUpOworCX0gZWxzZSBpZiAoZ2FfbWF0Y2hfcGF0dGVybl9saXN0KGdycHMpICE9IDEpIHsKKwkJZGVidWcoInVzZXIgJS4xMDBzIGRvZXMgbm90IG1hdGNoIGdyb3VwIGxpc3QgJS4xMDBzIGF0IGxpbmUgJWQiLAorCQkgICAgdXNlciwgZ3JwcywgbGluZSk7CisJfSBlbHNlIHsKKwkJZGVidWcoInVzZXIgJS4xMDBzIG1hdGNoZWQgZ3JvdXAgbGlzdCAlLjEwMHMgYXQgbGluZSAlZCIsIHVzZXIsCisJCSAgICBncnBzLCBsaW5lKTsKKwkJcmVzdWx0ID0gMTsKKwl9CitvdXQ6CisJZ2FfZnJlZSgpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQKK21hdGNoX2NmZ19saW5lKGNoYXIgKipjb25kaXRpb24sIGludCBsaW5lLCBjb25zdCBjaGFyICp1c2VyLCBjb25zdCBjaGFyICpob3N0LAorICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MpCit7CisJaW50IHJlc3VsdCA9IDE7CisJY2hhciAqYXJnLCAqYXR0cmliLCAqY3AgPSAqY29uZGl0aW9uOworCXNpemVfdCBsZW47CisKKwlpZiAodXNlciA9PSBOVUxMKQorCQlkZWJ1ZzMoImNoZWNraW5nIHN5bnRheCBmb3IgJ01hdGNoICVzJyIsIGNwKTsKKwllbHNlCisJCWRlYnVnMygiY2hlY2tpbmcgbWF0Y2ggZm9yICclcycgdXNlciAlcyBob3N0ICVzIGFkZHIgJXMiLCBjcCwKKwkJICAgIHVzZXIgPyB1c2VyIDogIihudWxsKSIsIGhvc3QgPyBob3N0IDogIihudWxsKSIsCisJCSAgICBhZGRyZXNzID8gYWRkcmVzcyA6ICIobnVsbCkiKTsKKworCXdoaWxlICgoYXR0cmliID0gc3RyZGVsaW0oJmNwKSkgJiYgKmF0dHJpYiAhPSAnXDAnKSB7CisJCWlmICgoYXJnID0gc3RyZGVsaW0oJmNwKSkgPT0gTlVMTCB8fCAqYXJnID09ICdcMCcpIHsKKwkJCWVycm9yKCJNaXNzaW5nIE1hdGNoIGNyaXRlcmlhIGZvciAlcyIsIGF0dHJpYik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbGVuID0gc3RybGVuKGFyZyk7CisJCWlmIChzdHJjYXNlY21wKGF0dHJpYiwgInVzZXIiKSA9PSAwKSB7CisJCQlpZiAoIXVzZXIpIHsKKwkJCQlyZXN1bHQgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKG1hdGNoX3BhdHRlcm5fbGlzdCh1c2VyLCBhcmcsIGxlbiwgMCkgIT0gMSkKKwkJCQlyZXN1bHQgPSAwOworCQkJZWxzZQorCQkJCWRlYnVnKCJ1c2VyICUuMTAwcyBtYXRjaGVkICdVc2VyICUuMTAwcycgYXQgIgorCQkJCSAgICAibGluZSAlZCIsIHVzZXIsIGFyZywgbGluZSk7CisJCX0gZWxzZSBpZiAoc3RyY2FzZWNtcChhdHRyaWIsICJncm91cCIpID09IDApIHsKKwkJCXN3aXRjaCAobWF0Y2hfY2ZnX2xpbmVfZ3JvdXAoYXJnLCBsaW5lLCB1c2VyKSkgeworCQkJY2FzZSAtMToKKwkJCQlyZXR1cm4gLTE7CisJCQljYXNlIDA6CisJCQkJcmVzdWx0ID0gMDsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjYXNlY21wKGF0dHJpYiwgImhvc3QiKSA9PSAwKSB7CisJCQlpZiAoIWhvc3QpIHsKKwkJCQlyZXN1bHQgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKG1hdGNoX2hvc3RuYW1lKGhvc3QsIGFyZywgbGVuKSAhPSAxKQorCQkJCXJlc3VsdCA9IDA7CisJCQllbHNlCisJCQkJZGVidWcoImNvbm5lY3Rpb24gZnJvbSAlLjEwMHMgbWF0Y2hlZCAnSG9zdCAiCisJCQkJICAgICIlLjEwMHMnIGF0IGxpbmUgJWQiLCBob3N0LCBhcmcsIGxpbmUpOworCQl9IGVsc2UgaWYgKHN0cmNhc2VjbXAoYXR0cmliLCAiYWRkcmVzcyIpID09IDApIHsKKwkJCXN3aXRjaCAoYWRkcl9tYXRjaF9saXN0KGFkZHJlc3MsIGFyZykpIHsKKwkJCWNhc2UgMToKKwkJCQlkZWJ1ZygiY29ubmVjdGlvbiBmcm9tICUuMTAwcyBtYXRjaGVkICdBZGRyZXNzICIKKwkJCQkgICAgIiUuMTAwcycgYXQgbGluZSAlZCIsIGFkZHJlc3MsIGFyZywgbGluZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDA6CisJCQljYXNlIC0xOgorCQkJCXJlc3VsdCA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIC0yOgorCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWVycm9yKCJVbnN1cHBvcnRlZCBNYXRjaCBhdHRyaWJ1dGUgJXMiLCBhdHRyaWIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCWlmICh1c2VyICE9IE5VTEwpCisJCWRlYnVnMygibWF0Y2ggJXNmb3VuZCIsIHJlc3VsdCA/ICIiIDogIm5vdCAiKTsKKwkqY29uZGl0aW9uID0gY3A7CisJcmV0dXJuIHJlc3VsdDsKK30KKworI2RlZmluZSBXSElURVNQQUNFICIgXHRcclxuIgorCisvKiBNdWx0aXN0YXRlIG9wdGlvbiBwYXJzaW5nICovCitzdHJ1Y3QgbXVsdGlzdGF0ZSB7CisJY2hhciAqa2V5OworCWludCB2YWx1ZTsKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IG11bHRpc3RhdGUgbXVsdGlzdGF0ZV9hZGRyZXNzZmFtaWx5W10gPSB7CisJeyAiaW5ldCIsCQkJQUZfSU5FVCB9LAorCXsgImluZXQ2IiwJCQlBRl9JTkVUNiB9LAorCXsgImFueSIsCQkJQUZfVU5TUEVDIH0sCisJeyBOVUxMLCAtMSB9Cit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBtdWx0aXN0YXRlIG11bHRpc3RhdGVfcGVybWl0cm9vdGxvZ2luW10gPSB7CisJeyAid2l0aG91dC1wYXNzd29yZCIsCQlQRVJNSVRfTk9fUEFTU1dEIH0sCisJeyAiZm9yY2VkLWNvbW1hbmRzLW9ubHkiLAlQRVJNSVRfRk9SQ0VEX09OTFkgfSwKKwl7ICJ5ZXMiLAkJCVBFUk1JVF9ZRVMgfSwKKwl7ICJubyIsCQkJCVBFUk1JVF9OTyB9LAorCXsgTlVMTCwgLTEgfQorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXVsdGlzdGF0ZSBtdWx0aXN0YXRlX2NvbXByZXNzaW9uW10gPSB7CisJeyAiZGVsYXllZCIsCQkJQ09NUF9ERUxBWUVEIH0sCisJeyAieWVzIiwJCQlDT01QX1pMSUIgfSwKKwl7ICJubyIsCQkJCUNPTVBfTk9ORSB9LAorCXsgTlVMTCwgLTEgfQorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXVsdGlzdGF0ZSBtdWx0aXN0YXRlX2dhdGV3YXlwb3J0c1tdID0geworCXsgImNsaWVudHNwZWNpZmllZCIsCQkyIH0sCisJeyAieWVzIiwJCQkxIH0sCisJeyAibm8iLAkJCQkwIH0sCisJeyBOVUxMLCAtMSB9Cit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBtdWx0aXN0YXRlIG11bHRpc3RhdGVfcHJpdnNlcFtdID0geworCXsgInNhbmRib3giLAkJCVBSSVZTRVBfU0FOREJPWCB9LAorCXsgInllcyIsCQkJUFJJVlNFUF9PTiB9LAorCXsgIm5vIiwJCQkJUFJJVlNFUF9PRkYgfSwKKwl7IE5VTEwsIC0xIH0KK307CisKK2ludAorcHJvY2Vzc19zZXJ2ZXJfY29uZmlnX2xpbmUoU2VydmVyT3B0aW9ucyAqb3B0aW9ucywgY2hhciAqbGluZSwKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVudW0sIGludCAqYWN0aXZlcCwgY29uc3QgY2hhciAqdXNlciwKKyAgICBjb25zdCBjaGFyICpob3N0LCBjb25zdCBjaGFyICphZGRyZXNzKQoreworCWNoYXIgKmNwLCAqKmNoYXJwdHIsICphcmcsICpwOworCWludCBjbWRsaW5lID0gMCwgKmludHB0ciwgdmFsdWUsIHZhbHVlMiwgbjsKKwlTeXNsb2dGYWNpbGl0eSAqbG9nX2ZhY2lsaXR5X3B0cjsKKwlMb2dMZXZlbCAqbG9nX2xldmVsX3B0cjsKKwlTZXJ2ZXJPcENvZGVzIG9wY29kZTsKKwlpbnQgcG9ydDsKKwl1X2ludCBpLCBmbGFncyA9IDA7CisJc2l6ZV90IGxlbjsKKwljb25zdCBzdHJ1Y3QgbXVsdGlzdGF0ZSAqbXVsdGlzdGF0ZV9wdHI7CisKKwljcCA9IGxpbmU7CisJaWYgKChhcmcgPSBzdHJkZWxpbSgmY3ApKSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwkvKiBJZ25vcmUgbGVhZGluZyB3aGl0ZXNwYWNlICovCisJaWYgKCphcmcgPT0gJ1wwJykKKwkJYXJnID0gc3RyZGVsaW0oJmNwKTsKKwlpZiAoIWFyZyB8fCAhKmFyZyB8fCAqYXJnID09ICcjJykKKwkJcmV0dXJuIDA7CisJaW50cHRyID0gTlVMTDsKKwljaGFycHRyID0gTlVMTDsKKwlvcGNvZGUgPSBwYXJzZV90b2tlbihhcmcsIGZpbGVuYW1lLCBsaW5lbnVtLCAmZmxhZ3MpOworCisJaWYgKGFjdGl2ZXAgPT0gTlVMTCkgeyAvKiBXZSBhcmUgcHJvY2Vzc2luZyBhIGNvbW1hbmQgbGluZSBkaXJlY3RpdmUgKi8KKwkJY21kbGluZSA9IDE7CisJCWFjdGl2ZXAgPSAmY21kbGluZTsKKwl9CisJaWYgKCphY3RpdmVwICYmIG9wY29kZSAhPSBzTWF0Y2gpCisJCWRlYnVnMygiJXM6JWQgc2V0dGluZyAlcyAlcyIsIGZpbGVuYW1lLCBsaW5lbnVtLCBhcmcsIGNwKTsKKwlpZiAoKmFjdGl2ZXAgPT0gMCAmJiAhKGZsYWdzICYgU1NIQ0ZHX01BVENIKSkgeworCQlpZiAodXNlciA9PSBOVUxMKSB7CisJCQlmYXRhbCgiJXMgbGluZSAlZDogRGlyZWN0aXZlICclcycgaXMgbm90IGFsbG93ZWQgIgorCQkJICAgICJ3aXRoaW4gYSBNYXRjaCBibG9jayIsIGZpbGVuYW1lLCBsaW5lbnVtLCBhcmcpOworCQl9IGVsc2UgeyAvKiB0aGlzIGlzIGEgZGlyZWN0aXZlIHdlIGhhdmUgYWxyZWFkeSBwcm9jZXNzZWQgKi8KKwkJCXdoaWxlIChhcmcpCisJCQkJYXJnID0gc3RyZGVsaW0oJmNwKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJc3dpdGNoIChvcGNvZGUpIHsKKwkvKiBQb3J0YWJsZS1zcGVjaWZpYyBvcHRpb25zICovCisJY2FzZSBzVXNlUEFNOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+dXNlX3BhbTsKKwkJZ290byBwYXJzZV9mbGFnOworCisJLyogU3RhbmRhcmQgT3B0aW9ucyAqLworCWNhc2Ugc0JhZE9wdGlvbjoKKwkJcmV0dXJuIC0xOworCWNhc2Ugc1BvcnQ6CisJCS8qIGlnbm9yZSBwb3J0cyBmcm9tIGNvbmZpZ2ZpbGUgaWYgY21kbGluZSBzcGVjaWZpZXMgcG9ydHMgKi8KKwkJaWYgKG9wdGlvbnMtPnBvcnRzX2Zyb21fY21kbGluZSkKKwkJCXJldHVybiAwOworCQlpZiAob3B0aW9ucy0+bGlzdGVuX2FkZHJzICE9IE5VTEwpCisJCQlmYXRhbCgiJXMgbGluZSAlZDogcG9ydHMgbXVzdCBiZSBzcGVjaWZpZWQgYmVmb3JlICIKKwkJCSAgICAiTGlzdGVuQWRkcmVzcy4iLCBmaWxlbmFtZSwgbGluZW51bSk7CisJCWlmIChvcHRpb25zLT5udW1fcG9ydHMgPj0gTUFYX1BPUlRTKQorCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IHRvbyBtYW55IHBvcnRzLiIsCisJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOworCQlhcmcgPSBzdHJkZWxpbSgmY3ApOworCQlpZiAoIWFyZyB8fCAqYXJnID09ICdcMCcpCisJCQlmYXRhbCgiJXMgbGluZSAlZDogbWlzc2luZyBwb3J0IG51bWJlci4iLAorCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJb3B0aW9ucy0+cG9ydHNbb3B0aW9ucy0+bnVtX3BvcnRzKytdID0gYTJwb3J0KGFyZyk7CisJCWlmIChvcHRpb25zLT5wb3J0c1tvcHRpb25zLT5udW1fcG9ydHMtMV0gPD0gMCkKKwkJCWZhdGFsKCIlcyBsaW5lICVkOiBCYWRseSBmb3JtYXR0ZWQgcG9ydCBudW1iZXIuIiwKKwkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7CisJCWJyZWFrOworCisJY2FzZSBzU2VydmVyS2V5Qml0czoKKwkJaW50cHRyID0gJm9wdGlvbnMtPnNlcnZlcl9rZXlfYml0czsKKyBwYXJzZV9pbnQ6CisJCWFyZyA9IHN0cmRlbGltKCZjcCk7CisJCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKKwkJCWZhdGFsKCIlcyBsaW5lICVkOiBtaXNzaW5nIGludGVnZXIgdmFsdWUuIiwKKwkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7CisJCXZhbHVlID0gYXRvaShhcmcpOworCQlpZiAoKmFjdGl2ZXAgJiYgKmludHB0ciA9PSAtMSkKKwkJCSppbnRwdHIgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIHNMb2dpbkdyYWNlVGltZToKKwkJaW50cHRyID0gJm9wdGlvbnMtPmxvZ2luX2dyYWNlX3RpbWU7CisgcGFyc2VfdGltZToKKwkJYXJnID0gc3RyZGVsaW0oJmNwKTsKKwkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQorCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IG1pc3NpbmcgdGltZSB2YWx1ZS4iLAorCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJaWYgKCh2YWx1ZSA9IGNvbnZ0aW1lKGFyZykpID09IC0xKQorCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IGludmFsaWQgdGltZSB2YWx1ZS4iLAorCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJaWYgKCppbnRwdHIgPT0gLTEpCisJCQkqaW50cHRyID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBzS2V5UmVnZW5lcmF0aW9uVGltZToKKwkJaW50cHRyID0gJm9wdGlvbnMtPmtleV9yZWdlbmVyYXRpb25fdGltZTsKKwkJZ290byBwYXJzZV90aW1lOworCisJY2FzZSBzTGlzdGVuQWRkcmVzczoKKwkJYXJnID0gc3RyZGVsaW0oJmNwKTsKKwkJaWYgKGFyZyA9PSBOVUxMIHx8ICphcmcgPT0gJ1wwJykKKwkJCWZhdGFsKCIlcyBsaW5lICVkOiBtaXNzaW5nIGFkZHJlc3MiLAorCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJLyogY2hlY2sgZm9yIGJhcmUgSVB2NiBhZGRyZXNzOiBubyAiW10iIGFuZCAyIG9yIG1vcmUgIjoiICovCisJCWlmIChzdHJjaHIoYXJnLCAnWycpID09IE5VTEwgJiYgKHAgPSBzdHJjaHIoYXJnLCAnOicpKSAhPSBOVUxMCisJCSAgICAmJiBzdHJjaHIocCsxLCAnOicpICE9IE5VTEwpIHsKKwkJCWFkZF9saXN0ZW5fYWRkcihvcHRpb25zLCBhcmcsIDApOworCQkJYnJlYWs7CisJCX0KKwkJcCA9IGhwZGVsaW0oJmFyZyk7CisJCWlmIChwID09IE5VTEwpCisJCQlmYXRhbCgiJXMgbGluZSAlZDogYmFkIGFkZHJlc3M6cG9ydCB1c2FnZSIsCisJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOworCQlwID0gY2xlYW5ob3N0bmFtZShwKTsKKwkJaWYgKGFyZyA9PSBOVUxMKQorCQkJcG9ydCA9IDA7CisJCWVsc2UgaWYgKChwb3J0ID0gYTJwb3J0KGFyZykpIDw9IDApCisJCQlmYXRhbCgiJXMgbGluZSAlZDogYmFkIHBvcnQgbnVtYmVyIiwgZmlsZW5hbWUsIGxpbmVudW0pOworCisJCWFkZF9saXN0ZW5fYWRkcihvcHRpb25zLCBwLCBwb3J0KTsKKworCQlicmVhazsKKworCWNhc2Ugc0FkZHJlc3NGYW1pbHk6CisJCWludHB0ciA9ICZvcHRpb25zLT5hZGRyZXNzX2ZhbWlseTsKKwkJbXVsdGlzdGF0ZV9wdHIgPSBtdWx0aXN0YXRlX2FkZHJlc3NmYW1pbHk7CisJCWlmIChvcHRpb25zLT5saXN0ZW5fYWRkcnMgIT0gTlVMTCkKKwkJCWZhdGFsKCIlcyBsaW5lICVkOiBhZGRyZXNzIGZhbWlseSBtdXN0IGJlIHNwZWNpZmllZCAiCisJCQkgICAgImJlZm9yZSBMaXN0ZW5BZGRyZXNzLiIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKKyBwYXJzZV9tdWx0aXN0YXRlOgorCQlhcmcgPSBzdHJkZWxpbSgmY3ApOworCQlpZiAoIWFyZyB8fCAqYXJnID09ICdcMCcpCisJCQlmYXRhbCgiJXMgbGluZSAlZDogbWlzc2luZyBhcmd1bWVudC4iLAorCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJdmFsdWUgPSAtMTsKKwkJZm9yIChpID0gMDsgbXVsdGlzdGF0ZV9wdHJbaV0ua2V5ICE9IE5VTEw7IGkrKykgeworCQkJaWYgKHN0cmNhc2VjbXAoYXJnLCBtdWx0aXN0YXRlX3B0cltpXS5rZXkpID09IDApIHsKKwkJCQl2YWx1ZSA9IG11bHRpc3RhdGVfcHRyW2ldLnZhbHVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICh2YWx1ZSA9PSAtMSkKKwkJCWZhdGFsKCIlcyBsaW5lICVkOiB1bnN1cHBvcnRlZCBvcHRpb24gXCIlc1wiLiIsCisJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGFyZyk7CisJCWlmICgqYWN0aXZlcCAmJiAqaW50cHRyID09IC0xKQorCQkJKmludHB0ciA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2Ugc0hvc3RLZXlGaWxlOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+bnVtX2hvc3Rfa2V5X2ZpbGVzOworCQlpZiAoKmludHB0ciA+PSBNQVhfSE9TVEtFWVMpCisJCQlmYXRhbCgiJXMgbGluZSAlZDogdG9vIG1hbnkgaG9zdCBrZXlzIHNwZWNpZmllZCAobWF4ICVkKS4iLAorCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtLCBNQVhfSE9TVEtFWVMpOworCQljaGFycHRyID0gJm9wdGlvbnMtPmhvc3Rfa2V5X2ZpbGVzWyppbnRwdHJdOworIHBhcnNlX2ZpbGVuYW1lOgorCQlhcmcgPSBzdHJkZWxpbSgmY3ApOworCQlpZiAoIWFyZyB8fCAqYXJnID09ICdcMCcpCisJCQlmYXRhbCgiJXMgbGluZSAlZDogbWlzc2luZyBmaWxlIG5hbWUuIiwKKwkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7CisJCWlmICgqYWN0aXZlcCAmJiAqY2hhcnB0ciA9PSBOVUxMKSB7CisJCQkqY2hhcnB0ciA9IGRlcmVsYXRpdmlzZV9wYXRoKGFyZyk7CisJCQkvKiBpbmNyZWFzZSBvcHRpb25hbCBjb3VudGVyICovCisJCQlpZiAoaW50cHRyICE9IE5VTEwpCisJCQkJKmludHB0ciA9ICppbnRwdHIgKyAxOworCQl9CisJCWJyZWFrOworCisJY2FzZSBzSG9zdENlcnRpZmljYXRlOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+bnVtX2hvc3RfY2VydF9maWxlczsKKwkJaWYgKCppbnRwdHIgPj0gTUFYX0hPU1RLRVlTKQorCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IHRvbyBtYW55IGhvc3QgY2VydGlmaWNhdGVzICIKKwkJCSAgICAic3BlY2lmaWVkIChtYXggJWQpLiIsIGZpbGVuYW1lLCBsaW5lbnVtLAorCQkJICAgIE1BWF9IT1NUQ0VSVFMpOworCQljaGFycHRyID0gJm9wdGlvbnMtPmhvc3RfY2VydF9maWxlc1sqaW50cHRyXTsKKwkJZ290byBwYXJzZV9maWxlbmFtZTsKKwkJYnJlYWs7CisKKwljYXNlIHNQaWRGaWxlOgorCQljaGFycHRyID0gJm9wdGlvbnMtPnBpZF9maWxlOworCQlnb3RvIHBhcnNlX2ZpbGVuYW1lOworCisJY2FzZSBzUGVybWl0Um9vdExvZ2luOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+cGVybWl0X3Jvb3RfbG9naW47CisJCW11bHRpc3RhdGVfcHRyID0gbXVsdGlzdGF0ZV9wZXJtaXRyb290bG9naW47CisJCWdvdG8gcGFyc2VfbXVsdGlzdGF0ZTsKKworCWNhc2Ugc0lnbm9yZVJob3N0czoKKwkJaW50cHRyID0gJm9wdGlvbnMtPmlnbm9yZV9yaG9zdHM7CisgcGFyc2VfZmxhZzoKKwkJYXJnID0gc3RyZGVsaW0oJmNwKTsKKwkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQorCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IG1pc3NpbmcgeWVzL25vIGFyZ3VtZW50LiIsCisJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOworCQl2YWx1ZSA9IDA7CS8qIHNpbGVuY2UgY29tcGlsZXIgKi8KKwkJaWYgKHN0cmNtcChhcmcsICJ5ZXMiKSA9PSAwKQorCQkJdmFsdWUgPSAxOworCQllbHNlIGlmIChzdHJjbXAoYXJnLCAibm8iKSA9PSAwKQorCQkJdmFsdWUgPSAwOworCQllbHNlCisJCQlmYXRhbCgiJXMgbGluZSAlZDogQmFkIHllcy9ubyBhcmd1bWVudDogJXMiLAorCQkJCWZpbGVuYW1lLCBsaW5lbnVtLCBhcmcpOworCQlpZiAoKmFjdGl2ZXAgJiYgKmludHB0ciA9PSAtMSkKKwkJCSppbnRwdHIgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIHNJZ25vcmVVc2VyS25vd25Ib3N0czoKKwkJaW50cHRyID0gJm9wdGlvbnMtPmlnbm9yZV91c2VyX2tub3duX2hvc3RzOworCQlnb3RvIHBhcnNlX2ZsYWc7CisKKwljYXNlIHNSaG9zdHNSU0FBdXRoZW50aWNhdGlvbjoKKwkJaW50cHRyID0gJm9wdGlvbnMtPnJob3N0c19yc2FfYXV0aGVudGljYXRpb247CisJCWdvdG8gcGFyc2VfZmxhZzsKKworCWNhc2Ugc0hvc3RiYXNlZEF1dGhlbnRpY2F0aW9uOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+aG9zdGJhc2VkX2F1dGhlbnRpY2F0aW9uOworCQlnb3RvIHBhcnNlX2ZsYWc7CisKKwljYXNlIHNIb3N0YmFzZWRVc2VzTmFtZUZyb21QYWNrZXRPbmx5OgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+aG9zdGJhc2VkX3VzZXNfbmFtZV9mcm9tX3BhY2tldF9vbmx5OworCQlnb3RvIHBhcnNlX2ZsYWc7CisKKwljYXNlIHNSU0FBdXRoZW50aWNhdGlvbjoKKwkJaW50cHRyID0gJm9wdGlvbnMtPnJzYV9hdXRoZW50aWNhdGlvbjsKKwkJZ290byBwYXJzZV9mbGFnOworCisJY2FzZSBzUHVia2V5QXV0aGVudGljYXRpb246CisJCWludHB0ciA9ICZvcHRpb25zLT5wdWJrZXlfYXV0aGVudGljYXRpb247CisJCWdvdG8gcGFyc2VfZmxhZzsKKworCWNhc2Ugc0tlcmJlcm9zQXV0aGVudGljYXRpb246CisJCWludHB0ciA9ICZvcHRpb25zLT5rZXJiZXJvc19hdXRoZW50aWNhdGlvbjsKKwkJZ290byBwYXJzZV9mbGFnOworCisJY2FzZSBzS2VyYmVyb3NPckxvY2FsUGFzc3dkOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+a2VyYmVyb3Nfb3JfbG9jYWxfcGFzc3dkOworCQlnb3RvIHBhcnNlX2ZsYWc7CisKKwljYXNlIHNLZXJiZXJvc1RpY2tldENsZWFudXA6CisJCWludHB0ciA9ICZvcHRpb25zLT5rZXJiZXJvc190aWNrZXRfY2xlYW51cDsKKwkJZ290byBwYXJzZV9mbGFnOworCisJY2FzZSBzS2VyYmVyb3NHZXRBRlNUb2tlbjoKKwkJaW50cHRyID0gJm9wdGlvbnMtPmtlcmJlcm9zX2dldF9hZnNfdG9rZW47CisJCWdvdG8gcGFyc2VfZmxhZzsKKworCWNhc2Ugc0dzc0F1dGhlbnRpY2F0aW9uOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+Z3NzX2F1dGhlbnRpY2F0aW9uOworCQlnb3RvIHBhcnNlX2ZsYWc7CisKKwljYXNlIHNHc3NDbGVhbnVwQ3JlZHM6CisJCWludHB0ciA9ICZvcHRpb25zLT5nc3NfY2xlYW51cF9jcmVkczsKKwkJZ290byBwYXJzZV9mbGFnOworCisJY2FzZSBzUGFzc3dvcmRBdXRoZW50aWNhdGlvbjoKKwkJaW50cHRyID0gJm9wdGlvbnMtPnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uOworCQlnb3RvIHBhcnNlX2ZsYWc7CisKKwljYXNlIHNaZXJvS25vd2xlZGdlUGFzc3dvcmRBdXRoZW50aWNhdGlvbjoKKwkJaW50cHRyID0gJm9wdGlvbnMtPnplcm9fa25vd2xlZGdlX3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uOworCQlnb3RvIHBhcnNlX2ZsYWc7CisKKwljYXNlIHNLYmRJbnRlcmFjdGl2ZUF1dGhlbnRpY2F0aW9uOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+a2JkX2ludGVyYWN0aXZlX2F1dGhlbnRpY2F0aW9uOworCQlnb3RvIHBhcnNlX2ZsYWc7CisKKwljYXNlIHNDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+Y2hhbGxlbmdlX3Jlc3BvbnNlX2F1dGhlbnRpY2F0aW9uOworCQlnb3RvIHBhcnNlX2ZsYWc7CisKKwljYXNlIHNQcmludE1vdGQ6CisJCWludHB0ciA9ICZvcHRpb25zLT5wcmludF9tb3RkOworCQlnb3RvIHBhcnNlX2ZsYWc7CisKKwljYXNlIHNQcmludExhc3RMb2c6CisJCWludHB0ciA9ICZvcHRpb25zLT5wcmludF9sYXN0bG9nOworCQlnb3RvIHBhcnNlX2ZsYWc7CisKKwljYXNlIHNYMTFGb3J3YXJkaW5nOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+eDExX2ZvcndhcmRpbmc7CisJCWdvdG8gcGFyc2VfZmxhZzsKKworCWNhc2Ugc1gxMURpc3BsYXlPZmZzZXQ6CisJCWludHB0ciA9ICZvcHRpb25zLT54MTFfZGlzcGxheV9vZmZzZXQ7CisJCWdvdG8gcGFyc2VfaW50OworCisJY2FzZSBzWDExVXNlTG9jYWxob3N0OgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+eDExX3VzZV9sb2NhbGhvc3Q7CisJCWdvdG8gcGFyc2VfZmxhZzsKKworCWNhc2Ugc1hBdXRoTG9jYXRpb246CisJCWNoYXJwdHIgPSAmb3B0aW9ucy0+eGF1dGhfbG9jYXRpb247CisJCWdvdG8gcGFyc2VfZmlsZW5hbWU7CisKKwljYXNlIHNTdHJpY3RNb2RlczoKKwkJaW50cHRyID0gJm9wdGlvbnMtPnN0cmljdF9tb2RlczsKKwkJZ290byBwYXJzZV9mbGFnOworCisJY2FzZSBzVENQS2VlcEFsaXZlOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+dGNwX2tlZXBfYWxpdmU7CisJCWdvdG8gcGFyc2VfZmxhZzsKKworCWNhc2Ugc0VtcHR5UGFzc3dkOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+cGVybWl0X2VtcHR5X3Bhc3N3ZDsKKwkJZ290byBwYXJzZV9mbGFnOworCisJY2FzZSBzUGVybWl0VXNlckVudmlyb25tZW50OgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+cGVybWl0X3VzZXJfZW52OworCQlnb3RvIHBhcnNlX2ZsYWc7CisKKwljYXNlIHNVc2VMb2dpbjoKKwkJaW50cHRyID0gJm9wdGlvbnMtPnVzZV9sb2dpbjsKKwkJZ290byBwYXJzZV9mbGFnOworCisJY2FzZSBzQ29tcHJlc3Npb246CisJCWludHB0ciA9ICZvcHRpb25zLT5jb21wcmVzc2lvbjsKKwkJbXVsdGlzdGF0ZV9wdHIgPSBtdWx0aXN0YXRlX2NvbXByZXNzaW9uOworCQlnb3RvIHBhcnNlX211bHRpc3RhdGU7CisKKwljYXNlIHNHYXRld2F5UG9ydHM6CisJCWludHB0ciA9ICZvcHRpb25zLT5nYXRld2F5X3BvcnRzOworCQltdWx0aXN0YXRlX3B0ciA9IG11bHRpc3RhdGVfZ2F0ZXdheXBvcnRzOworCQlnb3RvIHBhcnNlX211bHRpc3RhdGU7CisKKwljYXNlIHNVc2VETlM6CisJCWludHB0ciA9ICZvcHRpb25zLT51c2VfZG5zOworCQlnb3RvIHBhcnNlX2ZsYWc7CisKKwljYXNlIHNMb2dGYWNpbGl0eToKKwkJbG9nX2ZhY2lsaXR5X3B0ciA9ICZvcHRpb25zLT5sb2dfZmFjaWxpdHk7CisJCWFyZyA9IHN0cmRlbGltKCZjcCk7CisJCXZhbHVlID0gbG9nX2ZhY2lsaXR5X251bWJlcihhcmcpOworCQlpZiAodmFsdWUgPT0gU1lTTE9HX0ZBQ0lMSVRZX05PVF9TRVQpCisJCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IHVuc3VwcG9ydGVkIGxvZyBmYWNpbGl0eSAnJXMnIiwKKwkJCSAgICBmaWxlbmFtZSwgbGluZW51bSwgYXJnID8gYXJnIDogIjxOT05FPiIpOworCQlpZiAoKmxvZ19mYWNpbGl0eV9wdHIgPT0gLTEpCisJCQkqbG9nX2ZhY2lsaXR5X3B0ciA9IChTeXNsb2dGYWNpbGl0eSkgdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBzTG9nTGV2ZWw6CisJCWxvZ19sZXZlbF9wdHIgPSAmb3B0aW9ucy0+bG9nX2xldmVsOworCQlhcmcgPSBzdHJkZWxpbSgmY3ApOworCQl2YWx1ZSA9IGxvZ19sZXZlbF9udW1iZXIoYXJnKTsKKwkJaWYgKHZhbHVlID09IFNZU0xPR19MRVZFTF9OT1RfU0VUKQorCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiB1bnN1cHBvcnRlZCBsb2cgbGV2ZWwgJyVzJyIsCisJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGFyZyA/IGFyZyA6ICI8Tk9ORT4iKTsKKwkJaWYgKCpsb2dfbGV2ZWxfcHRyID09IC0xKQorCQkJKmxvZ19sZXZlbF9wdHIgPSAoTG9nTGV2ZWwpIHZhbHVlOworCQlicmVhazsKKworCWNhc2Ugc0FsbG93VGNwRm9yd2FyZGluZzoKKwkJaW50cHRyID0gJm9wdGlvbnMtPmFsbG93X3RjcF9mb3J3YXJkaW5nOworCQlnb3RvIHBhcnNlX2ZsYWc7CisKKwljYXNlIHNBbGxvd0FnZW50Rm9yd2FyZGluZzoKKwkJaW50cHRyID0gJm9wdGlvbnMtPmFsbG93X2FnZW50X2ZvcndhcmRpbmc7CisJCWdvdG8gcGFyc2VfZmxhZzsKKworCWNhc2Ugc1VzZVByaXZpbGVnZVNlcGFyYXRpb246CisJCWludHB0ciA9ICZ1c2VfcHJpdnNlcDsKKwkJbXVsdGlzdGF0ZV9wdHIgPSBtdWx0aXN0YXRlX3ByaXZzZXA7CisJCWdvdG8gcGFyc2VfbXVsdGlzdGF0ZTsKKworCWNhc2Ugc0FsbG93VXNlcnM6CisJCXdoaWxlICgoYXJnID0gc3RyZGVsaW0oJmNwKSkgJiYgKmFyZyAhPSAnXDAnKSB7CisJCQlpZiAob3B0aW9ucy0+bnVtX2FsbG93X3VzZXJzID49IE1BWF9BTExPV19VU0VSUykKKwkJCQlmYXRhbCgiJXMgbGluZSAlZDogdG9vIG1hbnkgYWxsb3cgdXNlcnMuIiwKKwkJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOworCQkJb3B0aW9ucy0+YWxsb3dfdXNlcnNbb3B0aW9ucy0+bnVtX2FsbG93X3VzZXJzKytdID0KKwkJCSAgICB4c3RyZHVwKGFyZyk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIHNEZW55VXNlcnM6CisJCXdoaWxlICgoYXJnID0gc3RyZGVsaW0oJmNwKSkgJiYgKmFyZyAhPSAnXDAnKSB7CisJCQlpZiAob3B0aW9ucy0+bnVtX2RlbnlfdXNlcnMgPj0gTUFYX0RFTllfVVNFUlMpCisJCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IHRvbyBtYW55IGRlbnkgdXNlcnMuIiwKKwkJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOworCQkJb3B0aW9ucy0+ZGVueV91c2Vyc1tvcHRpb25zLT5udW1fZGVueV91c2VycysrXSA9CisJCQkgICAgeHN0cmR1cChhcmcpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBzQWxsb3dHcm91cHM6CisJCXdoaWxlICgoYXJnID0gc3RyZGVsaW0oJmNwKSkgJiYgKmFyZyAhPSAnXDAnKSB7CisJCQlpZiAob3B0aW9ucy0+bnVtX2FsbG93X2dyb3VwcyA+PSBNQVhfQUxMT1dfR1JPVVBTKQorCQkJCWZhdGFsKCIlcyBsaW5lICVkOiB0b28gbWFueSBhbGxvdyBncm91cHMuIiwKKwkJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOworCQkJb3B0aW9ucy0+YWxsb3dfZ3JvdXBzW29wdGlvbnMtPm51bV9hbGxvd19ncm91cHMrK10gPQorCQkJICAgIHhzdHJkdXAoYXJnKTsKKwkJfQorCQlicmVhazsKKworCWNhc2Ugc0RlbnlHcm91cHM6CisJCXdoaWxlICgoYXJnID0gc3RyZGVsaW0oJmNwKSkgJiYgKmFyZyAhPSAnXDAnKSB7CisJCQlpZiAob3B0aW9ucy0+bnVtX2RlbnlfZ3JvdXBzID49IE1BWF9ERU5ZX0dST1VQUykKKwkJCQlmYXRhbCgiJXMgbGluZSAlZDogdG9vIG1hbnkgZGVueSBncm91cHMuIiwKKwkJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOworCQkJb3B0aW9ucy0+ZGVueV9ncm91cHNbb3B0aW9ucy0+bnVtX2RlbnlfZ3JvdXBzKytdID0geHN0cmR1cChhcmcpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBzQ2lwaGVyczoKKwkJYXJnID0gc3RyZGVsaW0oJmNwKTsKKwkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQorCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IE1pc3NpbmcgYXJndW1lbnQuIiwgZmlsZW5hbWUsIGxpbmVudW0pOworCQlpZiAoIWNpcGhlcnNfdmFsaWQoYXJnKSkKKwkJCWZhdGFsKCIlcyBsaW5lICVkOiBCYWQgU1NIMiBjaXBoZXIgc3BlYyAnJXMnLiIsCisJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGFyZyA/IGFyZyA6ICI8Tk9ORT4iKTsKKwkJaWYgKG9wdGlvbnMtPmNpcGhlcnMgPT0gTlVMTCkKKwkJCW9wdGlvbnMtPmNpcGhlcnMgPSB4c3RyZHVwKGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBzTWFjczoKKwkJYXJnID0gc3RyZGVsaW0oJmNwKTsKKwkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQorCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IE1pc3NpbmcgYXJndW1lbnQuIiwgZmlsZW5hbWUsIGxpbmVudW0pOworCQlpZiAoIW1hY192YWxpZChhcmcpKQorCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IEJhZCBTU0gyIG1hYyBzcGVjICclcycuIiwKKwkJCSAgICBmaWxlbmFtZSwgbGluZW51bSwgYXJnID8gYXJnIDogIjxOT05FPiIpOworCQlpZiAob3B0aW9ucy0+bWFjcyA9PSBOVUxMKQorCQkJb3B0aW9ucy0+bWFjcyA9IHhzdHJkdXAoYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIHNLZXhBbGdvcml0aG1zOgorCQlhcmcgPSBzdHJkZWxpbSgmY3ApOworCQlpZiAoIWFyZyB8fCAqYXJnID09ICdcMCcpCisJCQlmYXRhbCgiJXMgbGluZSAlZDogTWlzc2luZyBhcmd1bWVudC4iLAorCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJaWYgKCFrZXhfbmFtZXNfdmFsaWQoYXJnKSkKKwkJCWZhdGFsKCIlcyBsaW5lICVkOiBCYWQgU1NIMiBLZXhBbGdvcml0aG1zICclcycuIiwKKwkJCSAgICBmaWxlbmFtZSwgbGluZW51bSwgYXJnID8gYXJnIDogIjxOT05FPiIpOworCQlpZiAob3B0aW9ucy0+a2V4X2FsZ29yaXRobXMgPT0gTlVMTCkKKwkJCW9wdGlvbnMtPmtleF9hbGdvcml0aG1zID0geHN0cmR1cChhcmcpOworCQlicmVhazsKKworCWNhc2Ugc1Byb3RvY29sOgorCQlpbnRwdHIgPSAmb3B0aW9ucy0+cHJvdG9jb2w7CisJCWFyZyA9IHN0cmRlbGltKCZjcCk7CisJCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKKwkJCWZhdGFsKCIlcyBsaW5lICVkOiBNaXNzaW5nIGFyZ3VtZW50LiIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJdmFsdWUgPSBwcm90b19zcGVjKGFyZyk7CisJCWlmICh2YWx1ZSA9PSBTU0hfUFJPVE9fVU5LTk9XTikKKwkJCWZhdGFsKCIlcyBsaW5lICVkOiBCYWQgcHJvdG9jb2wgc3BlYyAnJXMnLiIsCisJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGFyZyA/IGFyZyA6ICI8Tk9ORT4iKTsKKwkJaWYgKCppbnRwdHIgPT0gU1NIX1BST1RPX1VOS05PV04pCisJCQkqaW50cHRyID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBzU3Vic3lzdGVtOgorCQlpZiAob3B0aW9ucy0+bnVtX3N1YnN5c3RlbXMgPj0gTUFYX1NVQlNZU1RFTVMpIHsKKwkJCWZhdGFsKCIlcyBsaW5lICVkOiB0b28gbWFueSBzdWJzeXN0ZW1zIGRlZmluZWQuIiwKKwkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7CisJCX0KKwkJYXJnID0gc3RyZGVsaW0oJmNwKTsKKwkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQorCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IE1pc3Npbmcgc3Vic3lzdGVtIG5hbWUuIiwKKwkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7CisJCWlmICghKmFjdGl2ZXApIHsKKwkJCWFyZyA9IHN0cmRlbGltKCZjcCk7CisJCQlicmVhazsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy0+bnVtX3N1YnN5c3RlbXM7IGkrKykKKwkJCWlmIChzdHJjbXAoYXJnLCBvcHRpb25zLT5zdWJzeXN0ZW1fbmFtZVtpXSkgPT0gMCkKKwkJCQlmYXRhbCgiJXMgbGluZSAlZDogU3Vic3lzdGVtICclcycgYWxyZWFkeSBkZWZpbmVkLiIsCisJCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtLCBhcmcpOworCQlvcHRpb25zLT5zdWJzeXN0ZW1fbmFtZVtvcHRpb25zLT5udW1fc3Vic3lzdGVtc10gPSB4c3RyZHVwKGFyZyk7CisJCWFyZyA9IHN0cmRlbGltKCZjcCk7CisJCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKKwkJCWZhdGFsKCIlcyBsaW5lICVkOiBNaXNzaW5nIHN1YnN5c3RlbSBjb21tYW5kLiIsCisJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOworCQlvcHRpb25zLT5zdWJzeXN0ZW1fY29tbWFuZFtvcHRpb25zLT5udW1fc3Vic3lzdGVtc10gPSB4c3RyZHVwKGFyZyk7CisKKwkJLyogQ29sbGVjdCBhcmd1bWVudHMgKHNlcGFyYXRlIHRvIGV4ZWN1dGFibGUpICovCisJCXAgPSB4c3RyZHVwKGFyZyk7CisJCWxlbiA9IHN0cmxlbihwKSArIDE7CisJCXdoaWxlICgoYXJnID0gc3RyZGVsaW0oJmNwKSkgIT0gTlVMTCAmJiAqYXJnICE9ICdcMCcpIHsKKwkJCWxlbiArPSAxICsgc3RybGVuKGFyZyk7CisJCQlwID0geHJlYWxsb2MocCwgMSwgbGVuKTsKKwkJCXN0cmxjYXQocCwgIiAiLCBsZW4pOworCQkJc3RybGNhdChwLCBhcmcsIGxlbik7CisJCX0KKwkJb3B0aW9ucy0+c3Vic3lzdGVtX2FyZ3Nbb3B0aW9ucy0+bnVtX3N1YnN5c3RlbXNdID0gcDsKKwkJb3B0aW9ucy0+bnVtX3N1YnN5c3RlbXMrKzsKKwkJYnJlYWs7CisKKwljYXNlIHNNYXhTdGFydHVwczoKKwkJYXJnID0gc3RyZGVsaW0oJmNwKTsKKwkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQorCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IE1pc3NpbmcgTWF4U3RhcnR1cHMgc3BlYy4iLAorCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJaWYgKChuID0gc3NjYW5mKGFyZywgIiVkOiVkOiVkIiwKKwkJICAgICZvcHRpb25zLT5tYXhfc3RhcnR1cHNfYmVnaW4sCisJCSAgICAmb3B0aW9ucy0+bWF4X3N0YXJ0dXBzX3JhdGUsCisJCSAgICAmb3B0aW9ucy0+bWF4X3N0YXJ0dXBzKSkgPT0gMykgeworCQkJaWYgKG9wdGlvbnMtPm1heF9zdGFydHVwc19iZWdpbiA+CisJCQkgICAgb3B0aW9ucy0+bWF4X3N0YXJ0dXBzIHx8CisJCQkgICAgb3B0aW9ucy0+bWF4X3N0YXJ0dXBzX3JhdGUgPiAxMDAgfHwKKwkJCSAgICBvcHRpb25zLT5tYXhfc3RhcnR1cHNfcmF0ZSA8IDEpCisJCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IElsbGVnYWwgTWF4U3RhcnR1cHMgc3BlYy4iLAorCQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7CisJCX0gZWxzZSBpZiAobiAhPSAxKQorCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IElsbGVnYWwgTWF4U3RhcnR1cHMgc3BlYy4iLAorCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJZWxzZQorCQkJb3B0aW9ucy0+bWF4X3N0YXJ0dXBzID0gb3B0aW9ucy0+bWF4X3N0YXJ0dXBzX2JlZ2luOworCQlicmVhazsKKworCWNhc2Ugc01heEF1dGhUcmllczoKKwkJaW50cHRyID0gJm9wdGlvbnMtPm1heF9hdXRodHJpZXM7CisJCWdvdG8gcGFyc2VfaW50OworCisJY2FzZSBzTWF4U2Vzc2lvbnM6CisJCWludHB0ciA9ICZvcHRpb25zLT5tYXhfc2Vzc2lvbnM7CisJCWdvdG8gcGFyc2VfaW50OworCisJY2FzZSBzQmFubmVyOgorCQljaGFycHRyID0gJm9wdGlvbnMtPmJhbm5lcjsKKwkJZ290byBwYXJzZV9maWxlbmFtZTsKKworCS8qCisJICogVGhlc2Ugb3B0aW9ucyBjYW4gY29udGFpbiAlWCBvcHRpb25zIGV4cGFuZGVkIGF0CisJICogY29ubmVjdCB0aW1lLCBzbyB0aGF0IHlvdSBjYW4gc3BlY2lmeSBwYXRocyBsaWtlOgorCSAqCisJICogQXV0aG9yaXplZEtleXNGaWxlCS9ldGMvc3NoX2tleXMvJXUKKwkgKi8KKwljYXNlIHNBdXRob3JpemVkS2V5c0ZpbGU6CisJCWlmICgqYWN0aXZlcCAmJiBvcHRpb25zLT5udW1fYXV0aGtleXNfZmlsZXMgPT0gMCkgeworCQkJd2hpbGUgKChhcmcgPSBzdHJkZWxpbSgmY3ApKSAmJiAqYXJnICE9ICdcMCcpIHsKKwkJCQlpZiAob3B0aW9ucy0+bnVtX2F1dGhrZXlzX2ZpbGVzID49CisJCQkJICAgIE1BWF9BVVRIS0VZU19GSUxFUykKKwkJCQkJZmF0YWwoIiVzIGxpbmUgJWQ6ICIKKwkJCQkJICAgICJ0b28gbWFueSBhdXRob3JpemVkIGtleXMgZmlsZXMuIiwKKwkJCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJCQlvcHRpb25zLT5hdXRob3JpemVkX2tleXNfZmlsZXNbCisJCQkJICAgIG9wdGlvbnMtPm51bV9hdXRoa2V5c19maWxlcysrXSA9CisJCQkJICAgIHRpbGRlX2V4cGFuZF9maWxlbmFtZShhcmcsIGdldHVpZCgpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2Ugc0F1dGhvcml6ZWRQcmluY2lwYWxzRmlsZToKKwkJY2hhcnB0ciA9ICZvcHRpb25zLT5hdXRob3JpemVkX3ByaW5jaXBhbHNfZmlsZTsKKwkJYXJnID0gc3RyZGVsaW0oJmNwKTsKKwkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQorCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IG1pc3NpbmcgZmlsZSBuYW1lLiIsCisJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOworCQlpZiAoKmFjdGl2ZXAgJiYgKmNoYXJwdHIgPT0gTlVMTCkgeworCQkJKmNoYXJwdHIgPSB0aWxkZV9leHBhbmRfZmlsZW5hbWUoYXJnLCBnZXR1aWQoKSk7CisJCQkvKiBpbmNyZWFzZSBvcHRpb25hbCBjb3VudGVyICovCisJCQlpZiAoaW50cHRyICE9IE5VTEwpCisJCQkJKmludHB0ciA9ICppbnRwdHIgKyAxOworCQl9CisJCWJyZWFrOworCisJY2FzZSBzQ2xpZW50QWxpdmVJbnRlcnZhbDoKKwkJaW50cHRyID0gJm9wdGlvbnMtPmNsaWVudF9hbGl2ZV9pbnRlcnZhbDsKKwkJZ290byBwYXJzZV90aW1lOworCisJY2FzZSBzQ2xpZW50QWxpdmVDb3VudE1heDoKKwkJaW50cHRyID0gJm9wdGlvbnMtPmNsaWVudF9hbGl2ZV9jb3VudF9tYXg7CisJCWdvdG8gcGFyc2VfaW50OworCisJY2FzZSBzQWNjZXB0RW52OgorCQl3aGlsZSAoKGFyZyA9IHN0cmRlbGltKCZjcCkpICYmICphcmcgIT0gJ1wwJykgeworCQkJaWYgKHN0cmNocihhcmcsICc9JykgIT0gTlVMTCkKKwkJCQlmYXRhbCgiJXMgbGluZSAlZDogSW52YWxpZCBlbnZpcm9ubWVudCBuYW1lLiIsCisJCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJCWlmIChvcHRpb25zLT5udW1fYWNjZXB0X2VudiA+PSBNQVhfQUNDRVBUX0VOVikKKwkJCQlmYXRhbCgiJXMgbGluZSAlZDogdG9vIG1hbnkgYWxsb3cgZW52LiIsCisJCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJCWlmICghKmFjdGl2ZXApCisJCQkJYnJlYWs7CisJCQlvcHRpb25zLT5hY2NlcHRfZW52W29wdGlvbnMtPm51bV9hY2NlcHRfZW52KytdID0KKwkJCSAgICB4c3RyZHVwKGFyZyk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIHNQZXJtaXRUdW5uZWw6CisJCWludHB0ciA9ICZvcHRpb25zLT5wZXJtaXRfdHVuOworCQlhcmcgPSBzdHJkZWxpbSgmY3ApOworCQlpZiAoIWFyZyB8fCAqYXJnID09ICdcMCcpCisJCQlmYXRhbCgiJXMgbGluZSAlZDogTWlzc2luZyB5ZXMvcG9pbnQtdG8tcG9pbnQvIgorCQkJICAgICJldGhlcm5ldC9ubyBhcmd1bWVudC4iLCBmaWxlbmFtZSwgbGluZW51bSk7CisJCXZhbHVlID0gLTE7CisJCWZvciAoaSA9IDA7IHR1bm1vZGVfZGVzY1tpXS52YWwgIT0gLTE7IGkrKykKKwkJCWlmIChzdHJjbXAodHVubW9kZV9kZXNjW2ldLnRleHQsIGFyZykgPT0gMCkgeworCQkJCXZhbHVlID0gdHVubW9kZV9kZXNjW2ldLnZhbDsKKwkJCQlicmVhazsKKwkJCX0KKwkJaWYgKHZhbHVlID09IC0xKQorCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IEJhZCB5ZXMvcG9pbnQtdG8tcG9pbnQvZXRoZXJuZXQvIgorCQkJICAgICJubyBhcmd1bWVudDogJXMiLCBmaWxlbmFtZSwgbGluZW51bSwgYXJnKTsKKwkJaWYgKCppbnRwdHIgPT0gLTEpCisJCQkqaW50cHRyID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBzTWF0Y2g6CisJCWlmIChjbWRsaW5lKQorCQkJZmF0YWwoIk1hdGNoIGRpcmVjdGl2ZSBub3Qgc3VwcG9ydGVkIGFzIGEgY29tbWFuZC1saW5lICIKKwkJCSAgICJvcHRpb24iKTsKKwkJdmFsdWUgPSBtYXRjaF9jZmdfbGluZSgmY3AsIGxpbmVudW0sIHVzZXIsIGhvc3QsIGFkZHJlc3MpOworCQlpZiAodmFsdWUgPCAwKQorCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IEJhZCBNYXRjaCBjb25kaXRpb24iLCBmaWxlbmFtZSwKKwkJCSAgICBsaW5lbnVtKTsKKwkJKmFjdGl2ZXAgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIHNQZXJtaXRPcGVuOgorCQlhcmcgPSBzdHJkZWxpbSgmY3ApOworCQlpZiAoIWFyZyB8fCAqYXJnID09ICdcMCcpCisJCQlmYXRhbCgiJXMgbGluZSAlZDogbWlzc2luZyBQZXJtaXRPcGVuIHNwZWNpZmljYXRpb24iLAorCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJbiA9IG9wdGlvbnMtPm51bV9wZXJtaXR0ZWRfb3BlbnM7CS8qIG1vZGlmaWVkIGxhdGVyICovCisJCWlmIChzdHJjbXAoYXJnLCAiYW55IikgPT0gMCkgeworCQkJaWYgKCphY3RpdmVwICYmIG4gPT0gLTEpIHsKKwkJCQljaGFubmVsX2NsZWFyX2FkbV9wZXJtaXR0ZWRfb3BlbnMoKTsKKwkJCQlvcHRpb25zLT5udW1fcGVybWl0dGVkX29wZW5zID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWlmICgqYWN0aXZlcCAmJiBuID09IC0xKQorCQkJY2hhbm5lbF9jbGVhcl9hZG1fcGVybWl0dGVkX29wZW5zKCk7CisJCWZvciAoOyBhcmcgIT0gTlVMTCAmJiAqYXJnICE9ICdcMCc7IGFyZyA9IHN0cmRlbGltKCZjcCkpIHsKKwkJCXAgPSBocGRlbGltKCZhcmcpOworCQkJaWYgKHAgPT0gTlVMTCkKKwkJCQlmYXRhbCgiJXMgbGluZSAlZDogbWlzc2luZyBob3N0IGluIFBlcm1pdE9wZW4iLAorCQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7CisJCQlwID0gY2xlYW5ob3N0bmFtZShwKTsKKwkJCWlmIChhcmcgPT0gTlVMTCB8fCAoKHBvcnQgPSBwZXJtaXRvcGVuX3BvcnQoYXJnKSkgPCAwKSkKKwkJCQlmYXRhbCgiJXMgbGluZSAlZDogYmFkIHBvcnQgbnVtYmVyIGluICIKKwkJCQkgICAgIlBlcm1pdE9wZW4iLCBmaWxlbmFtZSwgbGluZW51bSk7CisJCQlpZiAoKmFjdGl2ZXAgJiYgbiA9PSAtMSkKKwkJCQlvcHRpb25zLT5udW1fcGVybWl0dGVkX29wZW5zID0KKwkJCQkgICAgY2hhbm5lbF9hZGRfYWRtX3Blcm1pdHRlZF9vcGVucyhwLCBwb3J0KTsKKwkJfQorCQlicmVhazsKKworCWNhc2Ugc0ZvcmNlQ29tbWFuZDoKKwkJaWYgKGNwID09IE5VTEwpCisJCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IE1pc3NpbmcgYXJndW1lbnQuIiwgZmlsZW5hbWUsCisJCQkgICAgbGluZW51bSk7CisJCWxlbiA9IHN0cnNwbihjcCwgV0hJVEVTUEFDRSk7CisJCWlmICgqYWN0aXZlcCAmJiBvcHRpb25zLT5hZG1fZm9yY2VkX2NvbW1hbmQgPT0gTlVMTCkKKwkJCW9wdGlvbnMtPmFkbV9mb3JjZWRfY29tbWFuZCA9IHhzdHJkdXAoY3AgKyBsZW4pOworCQlyZXR1cm4gMDsKKworCWNhc2Ugc0Nocm9vdERpcmVjdG9yeToKKwkJY2hhcnB0ciA9ICZvcHRpb25zLT5jaHJvb3RfZGlyZWN0b3J5OworCisJCWFyZyA9IHN0cmRlbGltKCZjcCk7CisJCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKKwkJCWZhdGFsKCIlcyBsaW5lICVkOiBtaXNzaW5nIGZpbGUgbmFtZS4iLAorCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKKwkJaWYgKCphY3RpdmVwICYmICpjaGFycHRyID09IE5VTEwpCisJCQkqY2hhcnB0ciA9IHhzdHJkdXAoYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIHNUcnVzdGVkVXNlckNBS2V5czoKKwkJY2hhcnB0ciA9ICZvcHRpb25zLT50cnVzdGVkX3VzZXJfY2Ffa2V5czsKKwkJZ290byBwYXJzZV9maWxlbmFtZTsKKworCWNhc2Ugc1Jldm9rZWRLZXlzOgorCQljaGFycHRyID0gJm9wdGlvbnMtPnJldm9rZWRfa2V5c19maWxlOworCQlnb3RvIHBhcnNlX2ZpbGVuYW1lOworCisJY2FzZSBzSVBRb1M6CisJCWFyZyA9IHN0cmRlbGltKCZjcCk7CisJCWlmICgodmFsdWUgPSBwYXJzZV9pcHFvcyhhcmcpKSA9PSAtMSkKKwkJCWZhdGFsKCIlcyBsaW5lICVkOiBCYWQgSVBRb1MgdmFsdWU6ICVzIiwKKwkJCSAgICBmaWxlbmFtZSwgbGluZW51bSwgYXJnKTsKKwkJYXJnID0gc3RyZGVsaW0oJmNwKTsKKwkJaWYgKGFyZyA9PSBOVUxMKQorCQkJdmFsdWUyID0gdmFsdWU7CisJCWVsc2UgaWYgKCh2YWx1ZTIgPSBwYXJzZV9pcHFvcyhhcmcpKSA9PSAtMSkKKwkJCWZhdGFsKCIlcyBsaW5lICVkOiBCYWQgSVBRb1MgdmFsdWU6ICVzIiwKKwkJCSAgICBmaWxlbmFtZSwgbGluZW51bSwgYXJnKTsKKwkJaWYgKCphY3RpdmVwKSB7CisJCQlvcHRpb25zLT5pcF9xb3NfaW50ZXJhY3RpdmUgPSB2YWx1ZTsKKwkJCW9wdGlvbnMtPmlwX3Fvc19idWxrID0gdmFsdWUyOworCQl9CisJCWJyZWFrOworCisJY2FzZSBzRGVwcmVjYXRlZDoKKwkJbG9naXQoIiVzIGxpbmUgJWQ6IERlcHJlY2F0ZWQgb3B0aW9uICVzIiwKKwkJICAgIGZpbGVuYW1lLCBsaW5lbnVtLCBhcmcpOworCQl3aGlsZSAoYXJnKQorCQkgICAgYXJnID0gc3RyZGVsaW0oJmNwKTsKKwkJYnJlYWs7CisKKwljYXNlIHNVbnN1cHBvcnRlZDoKKwkJbG9naXQoIiVzIGxpbmUgJWQ6IFVuc3VwcG9ydGVkIG9wdGlvbiAlcyIsCisJCSAgICBmaWxlbmFtZSwgbGluZW51bSwgYXJnKTsKKwkJd2hpbGUgKGFyZykKKwkJICAgIGFyZyA9IHN0cmRlbGltKCZjcCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZmF0YWwoIiVzIGxpbmUgJWQ6IE1pc3NpbmcgaGFuZGxlciBmb3Igb3Bjb2RlICVzICglZCkiLAorCQkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGFyZywgb3Bjb2RlKTsKKwl9CisJaWYgKChhcmcgPSBzdHJkZWxpbSgmY3ApKSAhPSBOVUxMICYmICphcmcgIT0gJ1wwJykKKwkJZmF0YWwoIiVzIGxpbmUgJWQ6IGdhcmJhZ2UgYXQgZW5kIG9mIGxpbmU7IFwiJS4yMDBzXCIuIiwKKwkJICAgIGZpbGVuYW1lLCBsaW5lbnVtLCBhcmcpOworCXJldHVybiAwOworfQorCisvKiBSZWFkcyB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gZmlsZS4gKi8KKwordm9pZAorbG9hZF9zZXJ2ZXJfY29uZmlnKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBCdWZmZXIgKmNvbmYpCit7CisJY2hhciBsaW5lWzEwMjRdLCAqY3A7CisJRklMRSAqZjsKKworCWRlYnVnMigiJXM6IGZpbGVuYW1lICVzIiwgX19mdW5jX18sIGZpbGVuYW1lKTsKKwlpZiAoKGYgPSBmb3BlbihmaWxlbmFtZSwgInIiKSkgPT0gTlVMTCkgeworCQlwZXJyb3IoZmlsZW5hbWUpOworCQlleGl0KDEpOworCX0KKwlidWZmZXJfY2xlYXIoY29uZik7CisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHsKKwkJLyoKKwkJICogVHJpbSBvdXQgY29tbWVudHMgYW5kIHN0cmlwIHdoaXRlc3BhY2UKKwkJICogTkIgLSBwcmVzZXJ2ZSBuZXdsaW5lcywgdGhleSBhcmUgbmVlZGVkIHRvIHJlcHJvZHVjZQorCQkgKiBsaW5lIG51bWJlcnMgbGF0ZXIgZm9yIGVycm9yIG1lc3NhZ2VzCisJCSAqLworCQlpZiAoKGNwID0gc3RyY2hyKGxpbmUsICcjJykpICE9IE5VTEwpCisJCQltZW1jcHkoY3AsICJcbiIsIDIpOworCQljcCA9IGxpbmUgKyBzdHJzcG4obGluZSwgIiBcdFxyIik7CisKKwkJYnVmZmVyX2FwcGVuZChjb25mLCBjcCwgc3RybGVuKGNwKSk7CisJfQorCWJ1ZmZlcl9hcHBlbmQoY29uZiwgIlwwIiwgMSk7CisJZmNsb3NlKGYpOworCWRlYnVnMigiJXM6IGRvbmUgY29uZmlnIGxlbiA9ICVkIiwgX19mdW5jX18sIGJ1ZmZlcl9sZW4oY29uZikpOworfQorCit2b2lkCitwYXJzZV9zZXJ2ZXJfbWF0Y2hfY29uZmlnKFNlcnZlck9wdGlvbnMgKm9wdGlvbnMsIGNvbnN0IGNoYXIgKnVzZXIsCisgICAgY29uc3QgY2hhciAqaG9zdCwgY29uc3QgY2hhciAqYWRkcmVzcykKK3sKKwlTZXJ2ZXJPcHRpb25zIG1vOworCisJaW5pdGlhbGl6ZV9zZXJ2ZXJfb3B0aW9ucygmbW8pOworCXBhcnNlX3NlcnZlcl9jb25maWcoJm1vLCAicmVwcm9jZXNzIGNvbmZpZyIsICZjZmcsIHVzZXIsIGhvc3QsIGFkZHJlc3MpOworCWNvcHlfc2V0X3NlcnZlcl9vcHRpb25zKG9wdGlvbnMsICZtbywgMCk7Cit9CisKKy8qIEhlbHBlciBtYWNyb3MgKi8KKyNkZWZpbmUgTV9DUF9JTlRPUFQobikgZG8ge1wKKwlpZiAoc3JjLT5uICE9IC0xKSBcCisJCWRzdC0+biA9IHNyYy0+bjsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgTV9DUF9TVFJPUFQobikgZG8ge1wKKwlpZiAoc3JjLT5uICE9IE5VTEwpIHsgXAorCQlpZiAoZHN0LT5uICE9IE5VTEwpIFwKKwkJCXhmcmVlKGRzdC0+bik7IFwKKwkJZHN0LT5uID0gc3JjLT5uOyBcCisJfSBcCit9IHdoaWxlKDApCisjZGVmaW5lIE1fQ1BfU1RSQVJSQVlPUFQobiwgbnVtX24pIGRvIHtcCisJaWYgKHNyYy0+bnVtX24gIT0gMCkgeyBcCisJCWZvciAoZHN0LT5udW1fbiA9IDA7IGRzdC0+bnVtX24gPCBzcmMtPm51bV9uOyBkc3QtPm51bV9uKyspIFwKKwkJCWRzdC0+bltkc3QtPm51bV9uXSA9IHhzdHJkdXAoc3JjLT5uW2RzdC0+bnVtX25dKTsgXAorCX0gXAorfSB3aGlsZSgwKQorCisvKgorICogQ29weSBhbnkgc3VwcG9ydGVkIHZhbHVlcyB0aGF0IGFyZSBzZXQuCisgKgorICogSWYgdGhlIHByZWF1dGggZmxhZyBpcyBzZXQsIHdlIGRvIG5vdCBib3RoZXIgY29weWluZyB0aGUgc3RyaW5nIG9yCisgKiBhcnJheSB2YWx1ZXMgdGhhdCBhcmUgbm90IHVzZWQgcHJlLWF1dGhlbnRpY2F0aW9uLCBiZWNhdXNlIGFueSB0aGF0IHdlCisgKiBkbyB1c2UgbXVzdCBiZSBleHBsaWN0bHkgc2VudCBpbiBtbV9nZXRwd25hbWFsbG93KCkuCisgKi8KK3ZvaWQKK2NvcHlfc2V0X3NlcnZlcl9vcHRpb25zKFNlcnZlck9wdGlvbnMgKmRzdCwgU2VydmVyT3B0aW9ucyAqc3JjLCBpbnQgcHJlYXV0aCkKK3sKKwlNX0NQX0lOVE9QVChwYXNzd29yZF9hdXRoZW50aWNhdGlvbik7CisJTV9DUF9JTlRPUFQoZ3NzX2F1dGhlbnRpY2F0aW9uKTsKKwlNX0NQX0lOVE9QVChyc2FfYXV0aGVudGljYXRpb24pOworCU1fQ1BfSU5UT1BUKHB1YmtleV9hdXRoZW50aWNhdGlvbik7CisJTV9DUF9JTlRPUFQoa2VyYmVyb3NfYXV0aGVudGljYXRpb24pOworCU1fQ1BfSU5UT1BUKGhvc3RiYXNlZF9hdXRoZW50aWNhdGlvbik7CisJTV9DUF9JTlRPUFQoaG9zdGJhc2VkX3VzZXNfbmFtZV9mcm9tX3BhY2tldF9vbmx5KTsKKwlNX0NQX0lOVE9QVChrYmRfaW50ZXJhY3RpdmVfYXV0aGVudGljYXRpb24pOworCU1fQ1BfSU5UT1BUKHplcm9fa25vd2xlZGdlX3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uKTsKKwlNX0NQX0lOVE9QVChwZXJtaXRfcm9vdF9sb2dpbik7CisJTV9DUF9JTlRPUFQocGVybWl0X2VtcHR5X3Bhc3N3ZCk7CisKKwlNX0NQX0lOVE9QVChhbGxvd190Y3BfZm9yd2FyZGluZyk7CisJTV9DUF9JTlRPUFQoYWxsb3dfYWdlbnRfZm9yd2FyZGluZyk7CisJTV9DUF9JTlRPUFQocGVybWl0X3R1bik7CisJTV9DUF9JTlRPUFQoZ2F0ZXdheV9wb3J0cyk7CisJTV9DUF9JTlRPUFQoeDExX2Rpc3BsYXlfb2Zmc2V0KTsKKwlNX0NQX0lOVE9QVCh4MTFfZm9yd2FyZGluZyk7CisJTV9DUF9JTlRPUFQoeDExX3VzZV9sb2NhbGhvc3QpOworCU1fQ1BfSU5UT1BUKG1heF9zZXNzaW9ucyk7CisJTV9DUF9JTlRPUFQobWF4X2F1dGh0cmllcyk7CisJTV9DUF9JTlRPUFQoaXBfcW9zX2ludGVyYWN0aXZlKTsKKwlNX0NQX0lOVE9QVChpcF9xb3NfYnVsayk7CisKKwkvKiBTZWUgY29tbWVudCBpbiBzZXJ2Y29uZi5oICovCisJQ09QWV9NQVRDSF9TVFJJTkdfT1BUUygpOworCisJLyoKKwkgKiBUaGUgb25seSB0aGluZ3MgdGhhdCBzaG91bGQgYmUgYmVsb3cgdGhpcyBwb2ludCBhcmUgc3RyaW5nIG9wdGlvbnMKKwkgKiB3aGljaCBhcmUgb25seSB1c2VkIGFmdGVyIGF1dGhlbnRpY2F0aW9uLgorCSAqLworCWlmIChwcmVhdXRoKQorCQlyZXR1cm47CisKKwlNX0NQX1NUUk9QVChhZG1fZm9yY2VkX2NvbW1hbmQpOworCU1fQ1BfU1RST1BUKGNocm9vdF9kaXJlY3RvcnkpOworfQorCisjdW5kZWYgTV9DUF9JTlRPUFQKKyN1bmRlZiBNX0NQX1NUUk9QVAorI3VuZGVmIE1fQ1BfU1RSQVJSQVlPUFQKKwordm9pZAorcGFyc2Vfc2VydmVyX2NvbmZpZyhTZXJ2ZXJPcHRpb25zICpvcHRpb25zLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgQnVmZmVyICpjb25mLAorICAgIGNvbnN0IGNoYXIgKnVzZXIsIGNvbnN0IGNoYXIgKmhvc3QsIGNvbnN0IGNoYXIgKmFkZHJlc3MpCit7CisJaW50IGFjdGl2ZSwgbGluZW51bSwgYmFkX29wdGlvbnMgPSAwOworCWNoYXIgKmNwLCAqb2J1ZiwgKmNidWY7CisKKwlkZWJ1ZzIoIiVzOiBjb25maWcgJXMgbGVuICVkIiwgX19mdW5jX18sIGZpbGVuYW1lLCBidWZmZXJfbGVuKGNvbmYpKTsKKworCW9idWYgPSBjYnVmID0geHN0cmR1cChidWZmZXJfcHRyKGNvbmYpKTsKKwlhY3RpdmUgPSB1c2VyID8gMCA6IDE7CisJbGluZW51bSA9IDE7CisJd2hpbGUgKChjcCA9IHN0cnNlcCgmY2J1ZiwgIlxuIikpICE9IE5VTEwpIHsKKwkJaWYgKHByb2Nlc3Nfc2VydmVyX2NvbmZpZ19saW5lKG9wdGlvbnMsIGNwLCBmaWxlbmFtZSwKKwkJICAgIGxpbmVudW0rKywgJmFjdGl2ZSwgdXNlciwgaG9zdCwgYWRkcmVzcykgIT0gMCkKKwkJCWJhZF9vcHRpb25zKys7CisJfQorCXhmcmVlKG9idWYpOworCWlmIChiYWRfb3B0aW9ucyA+IDApCisJCWZhdGFsKCIlczogdGVybWluYXRpbmcsICVkIGJhZCBjb25maWd1cmF0aW9uIG9wdGlvbnMiLAorCQkgICAgZmlsZW5hbWUsIGJhZF9vcHRpb25zKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorZm10X211bHRpc3RhdGVfaW50KGludCB2YWwsIGNvbnN0IHN0cnVjdCBtdWx0aXN0YXRlICptKQoreworCXVfaW50IGk7CisKKwlmb3IgKGkgPSAwOyBtW2ldLmtleSAhPSBOVUxMOyBpKyspIHsKKwkJaWYgKG1baV0udmFsdWUgPT0gdmFsKQorCQkJcmV0dXJuIG1baV0ua2V5OworCX0KKwlyZXR1cm4gIlVOS05PV04iOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitmbXRfaW50YXJnKFNlcnZlck9wQ29kZXMgY29kZSwgaW50IHZhbCkKK3sKKwlpZiAodmFsID09IC0xKQorCQlyZXR1cm4gInVuc2V0IjsKKwlzd2l0Y2ggKGNvZGUpIHsKKwljYXNlIHNBZGRyZXNzRmFtaWx5OgorCQlyZXR1cm4gZm10X211bHRpc3RhdGVfaW50KHZhbCwgbXVsdGlzdGF0ZV9hZGRyZXNzZmFtaWx5KTsKKwljYXNlIHNQZXJtaXRSb290TG9naW46CisJCXJldHVybiBmbXRfbXVsdGlzdGF0ZV9pbnQodmFsLCBtdWx0aXN0YXRlX3Blcm1pdHJvb3Rsb2dpbik7CisJY2FzZSBzR2F0ZXdheVBvcnRzOgorCQlyZXR1cm4gZm10X211bHRpc3RhdGVfaW50KHZhbCwgbXVsdGlzdGF0ZV9nYXRld2F5cG9ydHMpOworCWNhc2Ugc0NvbXByZXNzaW9uOgorCQlyZXR1cm4gZm10X211bHRpc3RhdGVfaW50KHZhbCwgbXVsdGlzdGF0ZV9jb21wcmVzc2lvbik7CisJY2FzZSBzVXNlUHJpdmlsZWdlU2VwYXJhdGlvbjoKKwkJcmV0dXJuIGZtdF9tdWx0aXN0YXRlX2ludCh2YWwsIG11bHRpc3RhdGVfcHJpdnNlcCk7CisJY2FzZSBzUHJvdG9jb2w6CisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2UgU1NIX1BST1RPXzE6CisJCQlyZXR1cm4gIjEiOworCQljYXNlIFNTSF9QUk9UT18yOgorCQkJcmV0dXJuICIyIjsKKwkJY2FzZSAoU1NIX1BST1RPXzF8U1NIX1BST1RPXzIpOgorCQkJcmV0dXJuICIyLDEiOworCQlkZWZhdWx0OgorCQkJcmV0dXJuICJVTktOT1dOIjsKKwkJfQorCWRlZmF1bHQ6CisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2UgMDoKKwkJCXJldHVybiAibm8iOworCQljYXNlIDE6CisJCQlyZXR1cm4gInllcyI7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gIlVOS05PV04iOworCQl9CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitsb29rdXBfb3Bjb2RlX25hbWUoU2VydmVyT3BDb2RlcyBjb2RlKQoreworCXVfaW50IGk7CisKKwlmb3IgKGkgPSAwOyBrZXl3b3Jkc1tpXS5uYW1lICE9IE5VTEw7IGkrKykKKwkJaWYgKGtleXdvcmRzW2ldLm9wY29kZSA9PSBjb2RlKQorCQkJcmV0dXJuKGtleXdvcmRzW2ldLm5hbWUpOworCXJldHVybiAiVU5LTk9XTiI7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX2NmZ19pbnQoU2VydmVyT3BDb2RlcyBjb2RlLCBpbnQgdmFsKQoreworCXByaW50ZigiJXMgJWRcbiIsIGxvb2t1cF9vcGNvZGVfbmFtZShjb2RlKSwgdmFsKTsKK30KKworc3RhdGljIHZvaWQKK2R1bXBfY2ZnX2ZtdGludChTZXJ2ZXJPcENvZGVzIGNvZGUsIGludCB2YWwpCit7CisJcHJpbnRmKCIlcyAlc1xuIiwgbG9va3VwX29wY29kZV9uYW1lKGNvZGUpLCBmbXRfaW50YXJnKGNvZGUsIHZhbCkpOworfQorCitzdGF0aWMgdm9pZAorZHVtcF9jZmdfc3RyaW5nKFNlcnZlck9wQ29kZXMgY29kZSwgY29uc3QgY2hhciAqdmFsKQoreworCWlmICh2YWwgPT0gTlVMTCkKKwkJcmV0dXJuOworCXByaW50ZigiJXMgJXNcbiIsIGxvb2t1cF9vcGNvZGVfbmFtZShjb2RlKSwgdmFsKTsKK30KKworc3RhdGljIHZvaWQKK2R1bXBfY2ZnX3N0cmFycmF5KFNlcnZlck9wQ29kZXMgY29kZSwgdV9pbnQgY291bnQsIGNoYXIgKip2YWxzKQoreworCXVfaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJcHJpbnRmKCIlcyAlc1xuIiwgbG9va3VwX29wY29kZV9uYW1lKGNvZGUpLCB2YWxzW2ldKTsKK30KKworc3RhdGljIHZvaWQKK2R1bXBfY2ZnX3N0cmFycmF5X29uZWxpbmUoU2VydmVyT3BDb2RlcyBjb2RlLCB1X2ludCBjb3VudCwgY2hhciAqKnZhbHMpCit7CisJdV9pbnQgaTsKKworCXByaW50ZigiJXMiLCBsb29rdXBfb3Bjb2RlX25hbWUoY29kZSkpOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQlwcmludGYoIiAlcyIsICB2YWxzW2ldKTsKKwlwcmludGYoIlxuIik7Cit9CisKK3ZvaWQKK2R1bXBfY29uZmlnKFNlcnZlck9wdGlvbnMgKm8pCit7CisJdV9pbnQgaTsKKwlpbnQgcmV0OworCXN0cnVjdCBhZGRyaW5mbyAqYWk7CisJY2hhciBhZGRyW05JX01BWEhPU1RdLCBwb3J0W05JX01BWFNFUlZdLCAqcyA9IE5VTEw7CisKKwkvKiB0aGVzZSBhcmUgdXN1YWxseSBhdCB0aGUgdG9wIG9mIHRoZSBjb25maWcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgby0+bnVtX3BvcnRzOyBpKyspCisJCXByaW50ZigicG9ydCAlZFxuIiwgby0+cG9ydHNbaV0pOworCWR1bXBfY2ZnX2ZtdGludChzUHJvdG9jb2wsIG8tPnByb3RvY29sKTsKKwlkdW1wX2NmZ19mbXRpbnQoc0FkZHJlc3NGYW1pbHksIG8tPmFkZHJlc3NfZmFtaWx5KTsKKworCS8qIExpc3RlbkFkZHJlc3MgbXVzdCBiZSBhZnRlciBQb3J0ICovCisJZm9yIChhaSA9IG8tPmxpc3Rlbl9hZGRyczsgYWk7IGFpID0gYWktPmFpX25leHQpIHsKKwkJaWYgKChyZXQgPSBnZXRuYW1laW5mbyhhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4sIGFkZHIsCisJCSAgICBzaXplb2YoYWRkciksIHBvcnQsIHNpemVvZihwb3J0KSwKKwkJICAgIE5JX05VTUVSSUNIT1NUfE5JX05VTUVSSUNTRVJWKSkgIT0gMCkgeworCQkJZXJyb3IoImdldG5hbWVpbmZvIGZhaWxlZDogJS4xMDBzIiwKKwkJCSAgICAocmV0ICE9IEVBSV9TWVNURU0pID8gZ2FpX3N0cmVycm9yKHJldCkgOgorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCX0gZWxzZSB7CisJCQlpZiAoYWktPmFpX2ZhbWlseSA9PSBBRl9JTkVUNikKKwkJCQlwcmludGYoImxpc3RlbmFkZHJlc3MgWyVzXTolc1xuIiwgYWRkciwgcG9ydCk7CisJCQllbHNlCisJCQkJcHJpbnRmKCJsaXN0ZW5hZGRyZXNzICVzOiVzXG4iLCBhZGRyLCBwb3J0KTsKKwkJfQorCX0KKworCS8qIGludGVnZXIgYXJndW1lbnRzICovCisjaWZkZWYgVVNFX1BBTQorCWR1bXBfY2ZnX2ludChzVXNlUEFNLCBvLT51c2VfcGFtKTsKKyNlbmRpZgorCWR1bXBfY2ZnX2ludChzU2VydmVyS2V5Qml0cywgby0+c2VydmVyX2tleV9iaXRzKTsKKwlkdW1wX2NmZ19pbnQoc0xvZ2luR3JhY2VUaW1lLCBvLT5sb2dpbl9ncmFjZV90aW1lKTsKKwlkdW1wX2NmZ19pbnQoc0tleVJlZ2VuZXJhdGlvblRpbWUsIG8tPmtleV9yZWdlbmVyYXRpb25fdGltZSk7CisJZHVtcF9jZmdfaW50KHNYMTFEaXNwbGF5T2Zmc2V0LCBvLT54MTFfZGlzcGxheV9vZmZzZXQpOworCWR1bXBfY2ZnX2ludChzTWF4QXV0aFRyaWVzLCBvLT5tYXhfYXV0aHRyaWVzKTsKKwlkdW1wX2NmZ19pbnQoc01heFNlc3Npb25zLCBvLT5tYXhfc2Vzc2lvbnMpOworCWR1bXBfY2ZnX2ludChzQ2xpZW50QWxpdmVJbnRlcnZhbCwgby0+Y2xpZW50X2FsaXZlX2ludGVydmFsKTsKKwlkdW1wX2NmZ19pbnQoc0NsaWVudEFsaXZlQ291bnRNYXgsIG8tPmNsaWVudF9hbGl2ZV9jb3VudF9tYXgpOworCisJLyogZm9ybWF0dGVkIGludGVnZXIgYXJndW1lbnRzICovCisJZHVtcF9jZmdfZm10aW50KHNQZXJtaXRSb290TG9naW4sIG8tPnBlcm1pdF9yb290X2xvZ2luKTsKKwlkdW1wX2NmZ19mbXRpbnQoc0lnbm9yZVJob3N0cywgby0+aWdub3JlX3Job3N0cyk7CisJZHVtcF9jZmdfZm10aW50KHNJZ25vcmVVc2VyS25vd25Ib3N0cywgby0+aWdub3JlX3VzZXJfa25vd25faG9zdHMpOworCWR1bXBfY2ZnX2ZtdGludChzUmhvc3RzUlNBQXV0aGVudGljYXRpb24sIG8tPnJob3N0c19yc2FfYXV0aGVudGljYXRpb24pOworCWR1bXBfY2ZnX2ZtdGludChzSG9zdGJhc2VkQXV0aGVudGljYXRpb24sIG8tPmhvc3RiYXNlZF9hdXRoZW50aWNhdGlvbik7CisJZHVtcF9jZmdfZm10aW50KHNIb3N0YmFzZWRVc2VzTmFtZUZyb21QYWNrZXRPbmx5LAorCSAgICBvLT5ob3N0YmFzZWRfdXNlc19uYW1lX2Zyb21fcGFja2V0X29ubHkpOworCWR1bXBfY2ZnX2ZtdGludChzUlNBQXV0aGVudGljYXRpb24sIG8tPnJzYV9hdXRoZW50aWNhdGlvbik7CisJZHVtcF9jZmdfZm10aW50KHNQdWJrZXlBdXRoZW50aWNhdGlvbiwgby0+cHVia2V5X2F1dGhlbnRpY2F0aW9uKTsKKyNpZmRlZiBLUkI1CisJZHVtcF9jZmdfZm10aW50KHNLZXJiZXJvc0F1dGhlbnRpY2F0aW9uLCBvLT5rZXJiZXJvc19hdXRoZW50aWNhdGlvbik7CisJZHVtcF9jZmdfZm10aW50KHNLZXJiZXJvc09yTG9jYWxQYXNzd2QsIG8tPmtlcmJlcm9zX29yX2xvY2FsX3Bhc3N3ZCk7CisJZHVtcF9jZmdfZm10aW50KHNLZXJiZXJvc1RpY2tldENsZWFudXAsIG8tPmtlcmJlcm9zX3RpY2tldF9jbGVhbnVwKTsKKyMgaWZkZWYgVVNFX0FGUworCWR1bXBfY2ZnX2ZtdGludChzS2VyYmVyb3NHZXRBRlNUb2tlbiwgby0+a2VyYmVyb3NfZ2V0X2Fmc190b2tlbik7CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBHU1NBUEkKKwlkdW1wX2NmZ19mbXRpbnQoc0dzc0F1dGhlbnRpY2F0aW9uLCBvLT5nc3NfYXV0aGVudGljYXRpb24pOworCWR1bXBfY2ZnX2ZtdGludChzR3NzQ2xlYW51cENyZWRzLCBvLT5nc3NfY2xlYW51cF9jcmVkcyk7CisjZW5kaWYKKyNpZmRlZiBKUEFLRQorCWR1bXBfY2ZnX2ZtdGludChzWmVyb0tub3dsZWRnZVBhc3N3b3JkQXV0aGVudGljYXRpb24sCisJICAgIG8tPnplcm9fa25vd2xlZGdlX3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uKTsKKyNlbmRpZgorCWR1bXBfY2ZnX2ZtdGludChzUGFzc3dvcmRBdXRoZW50aWNhdGlvbiwgby0+cGFzc3dvcmRfYXV0aGVudGljYXRpb24pOworCWR1bXBfY2ZnX2ZtdGludChzS2JkSW50ZXJhY3RpdmVBdXRoZW50aWNhdGlvbiwKKwkgICAgby0+a2JkX2ludGVyYWN0aXZlX2F1dGhlbnRpY2F0aW9uKTsKKwlkdW1wX2NmZ19mbXRpbnQoc0NoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24sCisJICAgIG8tPmNoYWxsZW5nZV9yZXNwb25zZV9hdXRoZW50aWNhdGlvbik7CisJZHVtcF9jZmdfZm10aW50KHNQcmludE1vdGQsIG8tPnByaW50X21vdGQpOworCWR1bXBfY2ZnX2ZtdGludChzUHJpbnRMYXN0TG9nLCBvLT5wcmludF9sYXN0bG9nKTsKKwlkdW1wX2NmZ19mbXRpbnQoc1gxMUZvcndhcmRpbmcsIG8tPngxMV9mb3J3YXJkaW5nKTsKKwlkdW1wX2NmZ19mbXRpbnQoc1gxMVVzZUxvY2FsaG9zdCwgby0+eDExX3VzZV9sb2NhbGhvc3QpOworCWR1bXBfY2ZnX2ZtdGludChzU3RyaWN0TW9kZXMsIG8tPnN0cmljdF9tb2Rlcyk7CisJZHVtcF9jZmdfZm10aW50KHNUQ1BLZWVwQWxpdmUsIG8tPnRjcF9rZWVwX2FsaXZlKTsKKwlkdW1wX2NmZ19mbXRpbnQoc0VtcHR5UGFzc3dkLCBvLT5wZXJtaXRfZW1wdHlfcGFzc3dkKTsKKwlkdW1wX2NmZ19mbXRpbnQoc1Blcm1pdFVzZXJFbnZpcm9ubWVudCwgby0+cGVybWl0X3VzZXJfZW52KTsKKwlkdW1wX2NmZ19mbXRpbnQoc1VzZUxvZ2luLCBvLT51c2VfbG9naW4pOworCWR1bXBfY2ZnX2ZtdGludChzQ29tcHJlc3Npb24sIG8tPmNvbXByZXNzaW9uKTsKKwlkdW1wX2NmZ19mbXRpbnQoc0dhdGV3YXlQb3J0cywgby0+Z2F0ZXdheV9wb3J0cyk7CisJZHVtcF9jZmdfZm10aW50KHNVc2VETlMsIG8tPnVzZV9kbnMpOworCWR1bXBfY2ZnX2ZtdGludChzQWxsb3dUY3BGb3J3YXJkaW5nLCBvLT5hbGxvd190Y3BfZm9yd2FyZGluZyk7CisJZHVtcF9jZmdfZm10aW50KHNVc2VQcml2aWxlZ2VTZXBhcmF0aW9uLCB1c2VfcHJpdnNlcCk7CisKKwkvKiBzdHJpbmcgYXJndW1lbnRzICovCisJZHVtcF9jZmdfc3RyaW5nKHNQaWRGaWxlLCBvLT5waWRfZmlsZSk7CisJZHVtcF9jZmdfc3RyaW5nKHNYQXV0aExvY2F0aW9uLCBvLT54YXV0aF9sb2NhdGlvbik7CisJZHVtcF9jZmdfc3RyaW5nKHNDaXBoZXJzLCBvLT5jaXBoZXJzKTsKKwlkdW1wX2NmZ19zdHJpbmcoc01hY3MsIG8tPm1hY3MpOworCWR1bXBfY2ZnX3N0cmluZyhzQmFubmVyLCBvLT5iYW5uZXIpOworCWR1bXBfY2ZnX3N0cmluZyhzRm9yY2VDb21tYW5kLCBvLT5hZG1fZm9yY2VkX2NvbW1hbmQpOworCWR1bXBfY2ZnX3N0cmluZyhzQ2hyb290RGlyZWN0b3J5LCBvLT5jaHJvb3RfZGlyZWN0b3J5KTsKKwlkdW1wX2NmZ19zdHJpbmcoc1RydXN0ZWRVc2VyQ0FLZXlzLCBvLT50cnVzdGVkX3VzZXJfY2Ffa2V5cyk7CisJZHVtcF9jZmdfc3RyaW5nKHNSZXZva2VkS2V5cywgby0+cmV2b2tlZF9rZXlzX2ZpbGUpOworCWR1bXBfY2ZnX3N0cmluZyhzQXV0aG9yaXplZFByaW5jaXBhbHNGaWxlLAorCSAgICBvLT5hdXRob3JpemVkX3ByaW5jaXBhbHNfZmlsZSk7CisKKwkvKiBzdHJpbmcgYXJndW1lbnRzIHJlcXVpcmluZyBhIGxvb2t1cCAqLworCWR1bXBfY2ZnX3N0cmluZyhzTG9nTGV2ZWwsIGxvZ19sZXZlbF9uYW1lKG8tPmxvZ19sZXZlbCkpOworCWR1bXBfY2ZnX3N0cmluZyhzTG9nRmFjaWxpdHksIGxvZ19mYWNpbGl0eV9uYW1lKG8tPmxvZ19mYWNpbGl0eSkpOworCisJLyogc3RyaW5nIGFycmF5IGFyZ3VtZW50cyAqLworCWR1bXBfY2ZnX3N0cmFycmF5X29uZWxpbmUoc0F1dGhvcml6ZWRLZXlzRmlsZSwgby0+bnVtX2F1dGhrZXlzX2ZpbGVzLAorCSAgICBvLT5hdXRob3JpemVkX2tleXNfZmlsZXMpOworCWR1bXBfY2ZnX3N0cmFycmF5KHNIb3N0S2V5RmlsZSwgby0+bnVtX2hvc3Rfa2V5X2ZpbGVzLAorCSAgICAgby0+aG9zdF9rZXlfZmlsZXMpOworCWR1bXBfY2ZnX3N0cmFycmF5KHNIb3N0S2V5RmlsZSwgby0+bnVtX2hvc3RfY2VydF9maWxlcywKKwkgICAgIG8tPmhvc3RfY2VydF9maWxlcyk7CisJZHVtcF9jZmdfc3RyYXJyYXkoc0FsbG93VXNlcnMsIG8tPm51bV9hbGxvd191c2Vycywgby0+YWxsb3dfdXNlcnMpOworCWR1bXBfY2ZnX3N0cmFycmF5KHNEZW55VXNlcnMsIG8tPm51bV9kZW55X3VzZXJzLCBvLT5kZW55X3VzZXJzKTsKKwlkdW1wX2NmZ19zdHJhcnJheShzQWxsb3dHcm91cHMsIG8tPm51bV9hbGxvd19ncm91cHMsIG8tPmFsbG93X2dyb3Vwcyk7CisJZHVtcF9jZmdfc3RyYXJyYXkoc0RlbnlHcm91cHMsIG8tPm51bV9kZW55X2dyb3Vwcywgby0+ZGVueV9ncm91cHMpOworCWR1bXBfY2ZnX3N0cmFycmF5KHNBY2NlcHRFbnYsIG8tPm51bV9hY2NlcHRfZW52LCBvLT5hY2NlcHRfZW52KTsKKworCS8qIG90aGVyIGFyZ3VtZW50cyAqLworCWZvciAoaSA9IDA7IGkgPCBvLT5udW1fc3Vic3lzdGVtczsgaSsrKQorCQlwcmludGYoInN1YnN5c3RlbSAlcyAlc1xuIiwgby0+c3Vic3lzdGVtX25hbWVbaV0sCisJCSAgICBvLT5zdWJzeXN0ZW1fYXJnc1tpXSk7CisKKwlwcmludGYoIm1heHN0YXJ0dXBzICVkOiVkOiVkXG4iLCBvLT5tYXhfc3RhcnR1cHNfYmVnaW4sCisJICAgIG8tPm1heF9zdGFydHVwc19yYXRlLCBvLT5tYXhfc3RhcnR1cHMpOworCisJZm9yIChpID0gMDsgdHVubW9kZV9kZXNjW2ldLnZhbCAhPSAtMTsgaSsrKQorCQlpZiAodHVubW9kZV9kZXNjW2ldLnZhbCA9PSBvLT5wZXJtaXRfdHVuKSB7CisJCQlzID0gdHVubW9kZV9kZXNjW2ldLnRleHQ7CisJCQlicmVhazsKKwkJfQorCWR1bXBfY2ZnX3N0cmluZyhzUGVybWl0VHVubmVsLCBzKTsKKworCXByaW50ZigiaXBxb3MgJXMgIiwgaXB0b3Myc3RyKG8tPmlwX3Fvc19pbnRlcmFjdGl2ZSkpOworCXByaW50ZigiJXNcbiIsIGlwdG9zMnN0cihvLT5pcF9xb3NfYnVsaykpOworCisJY2hhbm5lbF9wcmludF9hZG1fcGVybWl0dGVkX29wZW5zKCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NlcnZjb25mLmggYi9vcGVuc3NoLTYuMHAxL3NlcnZjb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlmMzhlMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc2VydmNvbmYuaApAQCAtMCwwICsxLDE5OCBAQAorLyogJE9wZW5CU0Q6IHNlcnZjb25mLmgsdiAxLjk5IDIwMTEvMDYvMjIgMjE6NTc6MDEgZGptIEV4cCAkICovCisKKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiBEZWZpbml0aW9ucyBmb3Igc2VydmVyIGNvbmZpZ3VyYXRpb24gZGF0YSBhbmQgZm9yIHRoZSBmdW5jdGlvbnMgcmVhZGluZyBpdC4KKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICovCisKKyNpZm5kZWYgU0VSVkNPTkZfSAorI2RlZmluZSBTRVJWQ09ORl9ICisKKyNkZWZpbmUgTUFYX1BPUlRTCQkyNTYJLyogTWF4ICMgcG9ydHMuICovCisKKyNkZWZpbmUgTUFYX0FMTE9XX1VTRVJTCQkyNTYJLyogTWF4ICMgdXNlcnMgb24gYWxsb3cgbGlzdC4gKi8KKyNkZWZpbmUgTUFYX0RFTllfVVNFUlMJCTI1NgkvKiBNYXggIyB1c2VycyBvbiBkZW55IGxpc3QuICovCisjZGVmaW5lIE1BWF9BTExPV19HUk9VUFMJMjU2CS8qIE1heCAjIGdyb3VwcyBvbiBhbGxvdyBsaXN0LiAqLworI2RlZmluZSBNQVhfREVOWV9HUk9VUFMJCTI1NgkvKiBNYXggIyBncm91cHMgb24gZGVueSBsaXN0LiAqLworI2RlZmluZSBNQVhfU1VCU1lTVEVNUwkJMjU2CS8qIE1heCAjIHN1YnN5c3RlbXMuICovCisjZGVmaW5lIE1BWF9IT1NUS0VZUwkJMjU2CS8qIE1heCAjIGhvc3RrZXlzLiAqLworI2RlZmluZSBNQVhfSE9TVENFUlRTCQkyNTYJLyogTWF4ICMgaG9zdCBjZXJ0aWZpY2F0ZXMuICovCisjZGVmaW5lIE1BWF9BQ0NFUFRfRU5WCQkyNTYJLyogTWF4ICMgb2YgZW52IHZhcnMuICovCisjZGVmaW5lIE1BWF9NQVRDSF9HUk9VUFMJMjU2CS8qIE1heCAjIG9mIGdyb3VwcyBmb3IgTWF0Y2guICovCisjZGVmaW5lIE1BWF9BVVRIS0VZU19GSUxFUwkyNTYJLyogTWF4ICMgb2YgYXV0aG9yaXplZF9rZXlzIGZpbGVzLiAqLworCisvKiBwZXJtaXRfcm9vdF9sb2dpbiAqLworI2RlZmluZQlQRVJNSVRfTk9UX1NFVAkJLTEKKyNkZWZpbmUJUEVSTUlUX05PCQkwCisjZGVmaW5lCVBFUk1JVF9GT1JDRURfT05MWQkxCisjZGVmaW5lCVBFUk1JVF9OT19QQVNTV0QJMgorI2RlZmluZQlQRVJNSVRfWUVTCQkzCisKKy8qIHVzZV9wcml2c2VwICovCisjZGVmaW5lIFBSSVZTRVBfT0ZGCQkwCisjZGVmaW5lIFBSSVZTRVBfT04JCTEKKyNkZWZpbmUgUFJJVlNFUF9TQU5EQk9YCQkyCisKKyNkZWZpbmUgREVGQVVMVF9BVVRIX0ZBSUxfTUFYCTYJLyogRGVmYXVsdCBmb3IgTWF4QXV0aFRyaWVzICovCisjZGVmaW5lIERFRkFVTFRfU0VTU0lPTlNfTUFYCTEwCS8qIERlZmF1bHQgZm9yIE1heFNlc3Npb25zICovCisKKy8qIE1hZ2ljIG5hbWUgZm9yIGludGVybmFsIHNmdHAtc2VydmVyICovCisjZGVmaW5lIElOVEVSTkFMX1NGVFBfTkFNRQkiaW50ZXJuYWwtc2Z0cCIKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVfaW50CW51bV9wb3J0czsKKwl1X2ludAlwb3J0c19mcm9tX2NtZGxpbmU7CisJaW50CXBvcnRzW01BWF9QT1JUU107CS8qIFBvcnQgbnVtYmVyIHRvIGxpc3RlbiBvbi4gKi8KKwljaGFyICAgKmxpc3Rlbl9hZGRyOwkJLyogQWRkcmVzcyBvbiB3aGljaCB0aGUgc2VydmVyIGxpc3RlbnMuICovCisJc3RydWN0IGFkZHJpbmZvICpsaXN0ZW5fYWRkcnM7CS8qIEFkZHJlc3NlcyBvbiB3aGljaCB0aGUgc2VydmVyIGxpc3RlbnMuICovCisJaW50ICAgICBhZGRyZXNzX2ZhbWlseTsJCS8qIEFkZHJlc3MgZmFtaWx5IHVzZWQgYnkgdGhlIHNlcnZlci4gKi8KKwljaGFyICAgKmhvc3Rfa2V5X2ZpbGVzW01BWF9IT1NUS0VZU107CS8qIEZpbGVzIGNvbnRhaW5pbmcgaG9zdCBrZXlzLiAqLworCWludCAgICAgbnVtX2hvc3Rfa2V5X2ZpbGVzOyAgICAgLyogTnVtYmVyIG9mIGZpbGVzIGZvciBob3N0IGtleXMuICovCisJY2hhciAgICpob3N0X2NlcnRfZmlsZXNbTUFYX0hPU1RDRVJUU107CS8qIEZpbGVzIGNvbnRhaW5pbmcgaG9zdCBjZXJ0cy4gKi8KKwlpbnQgICAgIG51bV9ob3N0X2NlcnRfZmlsZXM7ICAgICAvKiBOdW1iZXIgb2YgZmlsZXMgZm9yIGhvc3QgY2VydHMuICovCisJY2hhciAgICpwaWRfZmlsZTsJLyogV2hlcmUgdG8gcHV0IG91ciBwaWQgKi8KKwlpbnQgICAgIHNlcnZlcl9rZXlfYml0czsvKiBTaXplIG9mIHRoZSBzZXJ2ZXIga2V5LiAqLworCWludCAgICAgbG9naW5fZ3JhY2VfdGltZTsJLyogRGlzY29ubmVjdCBpZiBubyBhdXRoIGluIHRoaXMgdGltZQorCQkJCQkgKiAoc2VjKS4gKi8KKwlpbnQgICAgIGtleV9yZWdlbmVyYXRpb25fdGltZTsJLyogU2VydmVyIGtleSBsaWZldGltZSAoc2Vjb25kcykuICovCisJaW50ICAgICBwZXJtaXRfcm9vdF9sb2dpbjsJLyogUEVSTUlUXyosIHNlZSBhYm92ZSAqLworCWludCAgICAgaWdub3JlX3Job3N0czsJLyogSWdub3JlIC5yaG9zdHMgYW5kIC5zaG9zdHMuICovCisJaW50ICAgICBpZ25vcmVfdXNlcl9rbm93bl9ob3N0czsJLyogSWdub3JlIH4vLnNzaC9rbm93bl9ob3N0cworCQkJCQkJICogZm9yIFJob3N0c1JzYUF1dGggKi8KKwlpbnQgICAgIHByaW50X21vdGQ7CS8qIElmIHRydWUsIHByaW50IC9ldGMvbW90ZC4gKi8KKwlpbnQJcHJpbnRfbGFzdGxvZzsJLyogSWYgdHJ1ZSwgcHJpbnQgbGFzdGxvZyAqLworCWludCAgICAgeDExX2ZvcndhcmRpbmc7CS8qIElmIHRydWUsIHBlcm1pdCBpbmV0IChzcG9vZmluZykgWDExIGZ3ZC4gKi8KKwlpbnQgICAgIHgxMV9kaXNwbGF5X29mZnNldDsJLyogV2hhdCBESVNQTEFZIG51bWJlciB0byBzdGFydAorCQkJCQkgKiBzZWFyY2hpbmcgYXQgKi8KKwlpbnQgICAgIHgxMV91c2VfbG9jYWxob3N0OwkvKiBJZiB0cnVlLCB1c2UgbG9jYWxob3N0IGZvciBmYWtlIFgxMSBzZXJ2ZXIuICovCisJY2hhciAgICp4YXV0aF9sb2NhdGlvbjsJLyogTG9jYXRpb24gb2YgeGF1dGggcHJvZ3JhbSAqLworCWludCAgICAgc3RyaWN0X21vZGVzOwkvKiBJZiB0cnVlLCByZXF1aXJlIHN0cmluZyBob21lIGRpciBtb2Rlcy4gKi8KKwlpbnQgICAgIHRjcF9rZWVwX2FsaXZlOwkvKiBJZiB0cnVlLCBzZXQgU09fS0VFUEFMSVZFLiAqLworCWludAlpcF9xb3NfaW50ZXJhY3RpdmU7CS8qIElQIFRvUy9EU0NQL2NsYXNzIGZvciBpbnRlcmFjdGl2ZSAqLworCWludAlpcF9xb3NfYnVsazsJCS8qIElQIFRvUy9EU0NQL2NsYXNzIGZvciBidWxrIHRyYWZmaWMgKi8KKwljaGFyICAgKmNpcGhlcnM7CS8qIFN1cHBvcnRlZCBTU0gyIGNpcGhlcnMuICovCisJY2hhciAgICptYWNzOwkJLyogU3VwcG9ydGVkIFNTSDIgbWFjcy4gKi8KKwljaGFyICAgKmtleF9hbGdvcml0aG1zOwkvKiBTU0gyIGtleCBtZXRob2RzIGluIG9yZGVyIG9mIHByZWZlcmVuY2UuICovCisJaW50CXByb3RvY29sOwkvKiBTdXBwb3J0ZWQgcHJvdG9jb2wgdmVyc2lvbnMuICovCisJaW50ICAgICBnYXRld2F5X3BvcnRzOwkvKiBJZiB0cnVlLCBhbGxvdyByZW1vdGUgY29ubmVjdHMgdG8gZm9yd2FyZGVkIHBvcnRzLiAqLworCVN5c2xvZ0ZhY2lsaXR5IGxvZ19mYWNpbGl0eTsJLyogRmFjaWxpdHkgZm9yIHN5c3RlbSBsb2dnaW5nLiAqLworCUxvZ0xldmVsIGxvZ19sZXZlbDsJLyogTGV2ZWwgZm9yIHN5c3RlbSBsb2dnaW5nLiAqLworCWludCAgICAgcmhvc3RzX3JzYV9hdXRoZW50aWNhdGlvbjsJLyogSWYgdHJ1ZSwgcGVybWl0IHJob3N0cyBSU0EKKwkJCQkJCSAqIGF1dGhlbnRpY2F0aW9uLiAqLworCWludCAgICAgaG9zdGJhc2VkX2F1dGhlbnRpY2F0aW9uOwkvKiBJZiB0cnVlLCBwZXJtaXQgc3NoMiBob3N0YmFzZWQgYXV0aCAqLworCWludCAgICAgaG9zdGJhc2VkX3VzZXNfbmFtZV9mcm9tX3BhY2tldF9vbmx5OyAvKiBleHBlcmltZW50YWwgKi8KKwlpbnQgICAgIHJzYV9hdXRoZW50aWNhdGlvbjsJLyogSWYgdHJ1ZSwgcGVybWl0IFJTQSBhdXRoZW50aWNhdGlvbi4gKi8KKwlpbnQgICAgIHB1YmtleV9hdXRoZW50aWNhdGlvbjsJLyogSWYgdHJ1ZSwgcGVybWl0IHNzaDIgcHVia2V5IGF1dGhlbnRpY2F0aW9uLiAqLworCWludCAgICAga2VyYmVyb3NfYXV0aGVudGljYXRpb247CS8qIElmIHRydWUsIHBlcm1pdCBLZXJiZXJvcworCQkJCQkJICogYXV0aGVudGljYXRpb24uICovCisJaW50ICAgICBrZXJiZXJvc19vcl9sb2NhbF9wYXNzd2Q7CS8qIElmIHRydWUsIHBlcm1pdCBrZXJiZXJvcworCQkJCQkJICogYW5kIGFueSBvdGhlciBwYXNzd29yZAorCQkJCQkJICogYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLAorCQkJCQkJICogc3VjaCBhcyBTZWN1cklEIG9yCisJCQkJCQkgKiAvZXRjL3Bhc3N3ZCAqLworCWludCAgICAga2VyYmVyb3NfdGlja2V0X2NsZWFudXA7CS8qIElmIHRydWUsIGRlc3Ryb3kgdGlja2V0CisJCQkJCQkgKiBmaWxlIG9uIGxvZ291dC4gKi8KKwlpbnQgICAgIGtlcmJlcm9zX2dldF9hZnNfdG9rZW47CQkvKiBJZiB0cnVlLCB0cnkgdG8gZ2V0IEFGUyB0b2tlbiBpZgorCQkJCQkJICogYXV0aGVudGljYXRlZCB3aXRoIEtlcmJlcm9zLiAqLworCWludCAgICAgZ3NzX2F1dGhlbnRpY2F0aW9uOwkvKiBJZiB0cnVlLCBwZXJtaXQgR1NTQVBJIGF1dGhlbnRpY2F0aW9uICovCisJaW50ICAgICBnc3NfY2xlYW51cF9jcmVkczsJLyogSWYgdHJ1ZSwgZGVzdHJveSBjcmVkIGNhY2hlIG9uIGxvZ291dCAqLworCWludCAgICAgcGFzc3dvcmRfYXV0aGVudGljYXRpb247CS8qIElmIHRydWUsIHBlcm1pdCBwYXNzd29yZAorCQkJCQkJICogYXV0aGVudGljYXRpb24uICovCisJaW50ICAgICBrYmRfaW50ZXJhY3RpdmVfYXV0aGVudGljYXRpb247CS8qIElmIHRydWUsIHBlcm1pdCAqLworCWludCAgICAgY2hhbGxlbmdlX3Jlc3BvbnNlX2F1dGhlbnRpY2F0aW9uOworCWludCAgICAgemVyb19rbm93bGVkZ2VfcGFzc3dvcmRfYXV0aGVudGljYXRpb247CisJCQkJCS8qIElmIHRydWUsIHBlcm1pdCBqcGFrZSBhdXRoICovCisJaW50ICAgICBwZXJtaXRfZW1wdHlfcGFzc3dkOwkvKiBJZiBmYWxzZSwgZG8gbm90IHBlcm1pdCBlbXB0eQorCQkJCQkgKiBwYXNzd29yZHMuICovCisJaW50ICAgICBwZXJtaXRfdXNlcl9lbnY7CS8qIElmIHRydWUsIHJlYWQgfi8uc3NoL2Vudmlyb25tZW50ICovCisJaW50ICAgICB1c2VfbG9naW47CS8qIElmIHRydWUsIGxvZ2luKDEpIGlzIHVzZWQgKi8KKwlpbnQgICAgIGNvbXByZXNzaW9uOwkvKiBJZiB0cnVlLCBjb21wcmVzc2lvbiBpcyBhbGxvd2VkICovCisJaW50CWFsbG93X3RjcF9mb3J3YXJkaW5nOworCWludAlhbGxvd19hZ2VudF9mb3J3YXJkaW5nOworCXVfaW50IG51bV9hbGxvd191c2VyczsKKwljaGFyICAgKmFsbG93X3VzZXJzW01BWF9BTExPV19VU0VSU107CisJdV9pbnQgbnVtX2RlbnlfdXNlcnM7CisJY2hhciAgICpkZW55X3VzZXJzW01BWF9ERU5ZX1VTRVJTXTsKKwl1X2ludCBudW1fYWxsb3dfZ3JvdXBzOworCWNoYXIgICAqYWxsb3dfZ3JvdXBzW01BWF9BTExPV19HUk9VUFNdOworCXVfaW50IG51bV9kZW55X2dyb3VwczsKKwljaGFyICAgKmRlbnlfZ3JvdXBzW01BWF9ERU5ZX0dST1VQU107CisKKwl1X2ludCBudW1fc3Vic3lzdGVtczsKKwljaGFyICAgKnN1YnN5c3RlbV9uYW1lW01BWF9TVUJTWVNURU1TXTsKKwljaGFyICAgKnN1YnN5c3RlbV9jb21tYW5kW01BWF9TVUJTWVNURU1TXTsKKwljaGFyICAgKnN1YnN5c3RlbV9hcmdzW01BWF9TVUJTWVNURU1TXTsKKworCXVfaW50IG51bV9hY2NlcHRfZW52OworCWNoYXIgICAqYWNjZXB0X2VudltNQVhfQUNDRVBUX0VOVl07CisKKwlpbnQJbWF4X3N0YXJ0dXBzX2JlZ2luOworCWludAltYXhfc3RhcnR1cHNfcmF0ZTsKKwlpbnQJbWF4X3N0YXJ0dXBzOworCWludAltYXhfYXV0aHRyaWVzOworCWludAltYXhfc2Vzc2lvbnM7CisJY2hhciAgICpiYW5uZXI7CQkJLyogU1NILTIgYmFubmVyIG1lc3NhZ2UgKi8KKwlpbnQJdXNlX2RuczsKKwlpbnQJY2xpZW50X2FsaXZlX2ludGVydmFsOwkvKgorCQkJCQkgKiBwb2tlIHRoZSBjbGllbnQgdGhpcyBvZnRlbiB0bworCQkJCQkgKiBzZWUgaWYgaXQncyBzdGlsbCB0aGVyZQorCQkJCQkgKi8KKwlpbnQJY2xpZW50X2FsaXZlX2NvdW50X21heDsJLyoKKwkJCQkJICogSWYgdGhlIGNsaWVudCBpcyB1bnJlc3BvbnNpdmUKKwkJCQkJICogZm9yIHRoaXMgbWFueSBpbnRlcnZhbHMgYWJvdmUsCisJCQkJCSAqIGRpc2Nvbm5lY3QgdGhlIHNlc3Npb24KKwkJCQkJICovCisKKwl1X2ludCBudW1fYXV0aGtleXNfZmlsZXM7CS8qIEZpbGVzIGNvbnRhaW5pbmcgcHVibGljIGtleXMgKi8KKwljaGFyICAgKmF1dGhvcml6ZWRfa2V5c19maWxlc1tNQVhfQVVUSEtFWVNfRklMRVNdOworCisJY2hhciAgICphZG1fZm9yY2VkX2NvbW1hbmQ7CisKKwlpbnQJdXNlX3BhbTsJCS8qIEVuYWJsZSBhdXRoIHZpYSBQQU0gKi8KKworCWludAlwZXJtaXRfdHVuOworCisJaW50CW51bV9wZXJtaXR0ZWRfb3BlbnM7CisKKwljaGFyICAgKmNocm9vdF9kaXJlY3Rvcnk7CisJY2hhciAgICpyZXZva2VkX2tleXNfZmlsZTsKKwljaGFyICAgKnRydXN0ZWRfdXNlcl9jYV9rZXlzOworCWNoYXIgICAqYXV0aG9yaXplZF9wcmluY2lwYWxzX2ZpbGU7Cit9ICAgICAgIFNlcnZlck9wdGlvbnM7CisKKy8qCisgKiBUaGVzZSBhcmUgc3RyaW5nIGNvbmZpZyBvcHRpb25zIHRoYXQgbXVzdCBiZSBjb3BpZWQgYmV0d2VlbiB0aGUKKyAqIE1hdGNoIHN1Yi1jb25maWcgYW5kIHRoZSBtYWluIGNvbmZpZywgYW5kIG11c3QgYmUgc2VudCBmcm9tIHRoZQorICogcHJpdnNlcCBzbGF2ZSB0byB0aGUgcHJpdnNlcCBtYXN0ZXIuIFdlIHVzZSBhIG1hY3JvIHRvIGVuc3VyZSBhbGwKKyAqIHRoZSBvcHRpb25zIGFyZSBjb3BpZWQgYW5kIHRoZSBjb3BpZXMgYXJlIGRvbmUgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuCisgKi8KKyNkZWZpbmUgQ09QWV9NQVRDSF9TVFJJTkdfT1BUUygpIGRvIHsgXAorCQlNX0NQX1NUUk9QVChiYW5uZXIpOyBcCisJCU1fQ1BfU1RST1BUKHRydXN0ZWRfdXNlcl9jYV9rZXlzKTsgXAorCQlNX0NQX1NUUk9QVChyZXZva2VkX2tleXNfZmlsZSk7IFwKKwkJTV9DUF9TVFJPUFQoYXV0aG9yaXplZF9wcmluY2lwYWxzX2ZpbGUpOyBcCisJCU1fQ1BfU1RSQVJSQVlPUFQoYXV0aG9yaXplZF9rZXlzX2ZpbGVzLCBudW1fYXV0aGtleXNfZmlsZXMpOyBcCisJfSB3aGlsZSAoMCkKKwordm9pZAkgaW5pdGlhbGl6ZV9zZXJ2ZXJfb3B0aW9ucyhTZXJ2ZXJPcHRpb25zICopOwordm9pZAkgZmlsbF9kZWZhdWx0X3NlcnZlcl9vcHRpb25zKFNlcnZlck9wdGlvbnMgKik7CitpbnQJIHByb2Nlc3Nfc2VydmVyX2NvbmZpZ19saW5lKFNlcnZlck9wdGlvbnMgKiwgY2hhciAqLCBjb25zdCBjaGFyICosIGludCwKKwkgICAgIGludCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK3ZvaWQJIGxvYWRfc2VydmVyX2NvbmZpZyhjb25zdCBjaGFyICosIEJ1ZmZlciAqKTsKK3ZvaWQJIHBhcnNlX3NlcnZlcl9jb25maWcoU2VydmVyT3B0aW9ucyAqLCBjb25zdCBjaGFyICosIEJ1ZmZlciAqLAorCSAgICAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Cit2b2lkCSBwYXJzZV9zZXJ2ZXJfbWF0Y2hfY29uZmlnKFNlcnZlck9wdGlvbnMgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCisJICAgICBjb25zdCBjaGFyICopOwordm9pZAkgY29weV9zZXRfc2VydmVyX29wdGlvbnMoU2VydmVyT3B0aW9ucyAqLCBTZXJ2ZXJPcHRpb25zICosIGludCk7Cit2b2lkCSBkdW1wX2NvbmZpZyhTZXJ2ZXJPcHRpb25zICopOworY2hhcgkqZGVyZWxhdGl2aXNlX3BhdGgoY29uc3QgY2hhciAqKTsKKworI2VuZGlmCQkJCS8qIFNFUlZDT05GX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc2VydmVybG9vcC5jIGIvb3BlbnNzaC02LjBwMS9zZXJ2ZXJsb29wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliODRmZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc2VydmVybG9vcC5jCkBAIC0wLDAgKzEsMTI1NCBAQAorLyogJE9wZW5CU0Q6IHNlcnZlcmxvb3AuYyx2IDEuMTYwIDIwMTEvMDUvMTUgMDg6MDk6MDEgZGptIEV4cCAkICovCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICogU2VydmVyIG1haW4gbG9vcCBmb3IgaGFuZGxpbmcgdGhlIGludGVyYWN0aXZlIHNlc3Npb24uCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqCisgKiBTU0gyIHN1cHBvcnQgYnkgTWFya3VzIEZyaWVkbC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpZmRlZiBIQVZFX1NZU19USU1FX0gKKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L3N5cy1xdWV1ZS5oIgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJwYWNrZXQuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJzZXJ2Y29uZi5oIgorI2luY2x1ZGUgImNhbm9ob3N0LmgiCisjaW5jbHVkZSAic3NocHR5LmgiCisjaW5jbHVkZSAiY2hhbm5lbHMuaCIKKyNpbmNsdWRlICJjb21wYXQuaCIKKyNpbmNsdWRlICJzc2gxLmgiCisjaW5jbHVkZSAic3NoMi5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgImNpcGhlci5oIgorI2luY2x1ZGUgImtleC5oIgorI2luY2x1ZGUgImhvc3RmaWxlLmgiCisjaW5jbHVkZSAiYXV0aC5oIgorI2luY2x1ZGUgInNlc3Npb24uaCIKKyNpbmNsdWRlICJkaXNwYXRjaC5oIgorI2luY2x1ZGUgImF1dGgtb3B0aW9ucy5oIgorI2luY2x1ZGUgInNlcnZlcmxvb3AuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAicm9hbWluZy5oIgorCitleHRlcm4gU2VydmVyT3B0aW9ucyBvcHRpb25zOworCisvKiBYWFggKi8KK2V4dGVybiBLZXggKnh4eF9rZXg7CitleHRlcm4gQXV0aGN0eHQgKnRoZV9hdXRoY3R4dDsKK2V4dGVybiBpbnQgdXNlX3ByaXZzZXA7CisKK3N0YXRpYyBCdWZmZXIgc3RkaW5fYnVmZmVyOwkvKiBCdWZmZXIgZm9yIHN0ZGluIGRhdGEuICovCitzdGF0aWMgQnVmZmVyIHN0ZG91dF9idWZmZXI7CS8qIEJ1ZmZlciBmb3Igc3Rkb3V0IGRhdGEuICovCitzdGF0aWMgQnVmZmVyIHN0ZGVycl9idWZmZXI7CS8qIEJ1ZmZlciBmb3Igc3RkZXJyIGRhdGEuICovCitzdGF0aWMgaW50IGZkaW47CQkvKiBEZXNjcmlwdG9yIGZvciBzdGRpbiAoZm9yIHdyaXRpbmcpICovCitzdGF0aWMgaW50IGZkb3V0OwkJLyogRGVzY3JpcHRvciBmb3Igc3Rkb3V0IChmb3IgcmVhZGluZyk7CisJCQkJICAgTWF5IGJlIHNhbWUgbnVtYmVyIGFzIGZkaW4uICovCitzdGF0aWMgaW50IGZkZXJyOwkJLyogRGVzY3JpcHRvciBmb3Igc3RkZXJyLiAgTWF5IGJlIC0xLiAqLworc3RhdGljIGxvbmcgc3RkaW5fYnl0ZXMgPSAwOwkvKiBOdW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byBzdGRpbi4gKi8KK3N0YXRpYyBsb25nIHN0ZG91dF9ieXRlcyA9IDA7CS8qIE51bWJlciBvZiBzdGRvdXQgYnl0ZXMgc2VudCB0byBjbGllbnQuICovCitzdGF0aWMgbG9uZyBzdGRlcnJfYnl0ZXMgPSAwOwkvKiBOdW1iZXIgb2Ygc3RkZXJyIGJ5dGVzIHNlbnQgdG8gY2xpZW50LiAqLworc3RhdGljIGxvbmcgZmRvdXRfYnl0ZXMgPSAwOwkvKiBOdW1iZXIgb2Ygc3Rkb3V0IGJ5dGVzIHJlYWQgZnJvbSBwcm9ncmFtLiAqLworc3RhdGljIGludCBzdGRpbl9lb2YgPSAwOwkvKiBFT0YgbWVzc2FnZSByZWNlaXZlZCBmcm9tIGNsaWVudC4gKi8KK3N0YXRpYyBpbnQgZmRvdXRfZW9mID0gMDsJLyogRU9GIGVuY291bnRlcmVkIHJlYWRpbmcgZnJvbSBmZG91dC4gKi8KK3N0YXRpYyBpbnQgZmRlcnJfZW9mID0gMDsJLyogRU9GIGVuY291bnRlcmVkIHJlYWR1bmcgZnJvbSBmZGVyci4gKi8KK3N0YXRpYyBpbnQgZmRpbl9pc190dHkgPSAwOwkvKiBmZGluIHBvaW50cyB0byBhIHR0eS4gKi8KK3N0YXRpYyBpbnQgY29ubmVjdGlvbl9pbjsJLyogQ29ubmVjdGlvbiB0byBjbGllbnQgKGlucHV0KS4gKi8KK3N0YXRpYyBpbnQgY29ubmVjdGlvbl9vdXQ7CS8qIENvbm5lY3Rpb24gdG8gY2xpZW50IChvdXRwdXQpLiAqLworc3RhdGljIGludCBjb25uZWN0aW9uX2Nsb3NlZCA9IDA7CS8qIENvbm5lY3Rpb24gdG8gY2xpZW50IGNsb3NlZC4gKi8KK3N0YXRpYyB1X2ludCBidWZmZXJfaGlnaDsJLyogIlNvZnQiIG1heCBidWZmZXIgc2l6ZS4gKi8KK3N0YXRpYyBpbnQgbm9fbW9yZV9zZXNzaW9ucyA9IDA7IC8qIERpc2FsbG93IGZ1cnRoZXIgc2Vzc2lvbnMuICovCisKKy8qCisgKiBUaGlzIFNJR0NITEQga2x1ZGdlIGlzIHVzZWQgdG8gZGV0ZWN0IHdoZW4gdGhlIGNoaWxkIGV4aXRzLiAgVGhlIHNlcnZlcgorICogd2lsbCBleGl0IGFmdGVyIHRoYXQsIGFzIHNvb24gYXMgZm9yd2FyZGVkIGNvbm5lY3Rpb25zIGhhdmUgdGVybWluYXRlZC4KKyAqLworCitzdGF0aWMgdm9sYXRpbGUgc2lnX2F0b21pY190IGNoaWxkX3Rlcm1pbmF0ZWQgPSAwOwkvKiBUaGUgY2hpbGQgaGFzIHRlcm1pbmF0ZWQuICovCisKKy8qIENsZWFudXAgb24gc2lnbmFscyAoIXVzZV9wcml2c2VwIGNhc2Ugb25seSkgKi8KK3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3QgcmVjZWl2ZWRfc2lndGVybSA9IDA7CisKKy8qIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB2b2lkIHNlcnZlcl9pbml0X2Rpc3BhdGNoKHZvaWQpOworCisvKgorICogd2Ugd3JpdGUgdG8gdGhpcyBwaXBlIGlmIGEgU0lHQ0hMRCBpcyBjYXVnaHQgaW4gb3JkZXIgdG8gYXZvaWQKKyAqIHRoZSByYWNlIGJldHdlZW4gc2VsZWN0KCkgYW5kIGNoaWxkX3Rlcm1pbmF0ZWQKKyAqLworc3RhdGljIGludCBub3RpZnlfcGlwZVsyXTsKK3N0YXRpYyB2b2lkCitub3RpZnlfc2V0dXAodm9pZCkKK3sKKwlpZiAocGlwZShub3RpZnlfcGlwZSkgPCAwKSB7CisJCWVycm9yKCJwaXBlKG5vdGlmeV9waXBlKSBmYWlsZWQgJXMiLCBzdHJlcnJvcihlcnJubykpOworCX0gZWxzZSBpZiAoKGZjbnRsKG5vdGlmeV9waXBlWzBdLCBGX1NFVEZELCBGRF9DTE9FWEVDKSA9PSAtMSkgfHwKKwkgICAgKGZjbnRsKG5vdGlmeV9waXBlWzFdLCBGX1NFVEZELCBGRF9DTE9FWEVDKSA9PSAtMSkpIHsKKwkJZXJyb3IoImZjbnRsKG5vdGlmeV9waXBlLCBGX1NFVEZEKSBmYWlsZWQgJXMiLCBzdHJlcnJvcihlcnJubykpOworCQljbG9zZShub3RpZnlfcGlwZVswXSk7CisJCWNsb3NlKG5vdGlmeV9waXBlWzFdKTsKKwl9IGVsc2UgeworCQlzZXRfbm9uYmxvY2sobm90aWZ5X3BpcGVbMF0pOworCQlzZXRfbm9uYmxvY2sobm90aWZ5X3BpcGVbMV0pOworCQlyZXR1cm47CisJfQorCW5vdGlmeV9waXBlWzBdID0gLTE7CS8qIHJlYWQgZW5kICovCisJbm90aWZ5X3BpcGVbMV0gPSAtMTsJLyogd3JpdGUgZW5kICovCit9CitzdGF0aWMgdm9pZAorbm90aWZ5X3BhcmVudCh2b2lkKQoreworCWlmIChub3RpZnlfcGlwZVsxXSAhPSAtMSkKKwkJd3JpdGUobm90aWZ5X3BpcGVbMV0sICIiLCAxKTsKK30KK3N0YXRpYyB2b2lkCitub3RpZnlfcHJlcGFyZShmZF9zZXQgKnJlYWRzZXQpCit7CisJaWYgKG5vdGlmeV9waXBlWzBdICE9IC0xKQorCQlGRF9TRVQobm90aWZ5X3BpcGVbMF0sIHJlYWRzZXQpOworfQorc3RhdGljIHZvaWQKK25vdGlmeV9kb25lKGZkX3NldCAqcmVhZHNldCkKK3sKKwljaGFyIGM7CisKKwlpZiAobm90aWZ5X3BpcGVbMF0gIT0gLTEgJiYgRkRfSVNTRVQobm90aWZ5X3BpcGVbMF0sIHJlYWRzZXQpKQorCQl3aGlsZSAocmVhZChub3RpZnlfcGlwZVswXSwgJmMsIDEpICE9IC0xKQorCQkJZGVidWcyKCJub3RpZnlfZG9uZTogcmVhZGluZyIpOworfQorCisvKkFSR1NVU0VEKi8KK3N0YXRpYyB2b2lkCitzaWdjaGxkX2hhbmRsZXIoaW50IHNpZykKK3sKKwlpbnQgc2F2ZV9lcnJubyA9IGVycm5vOworCWNoaWxkX3Rlcm1pbmF0ZWQgPSAxOworI2lmbmRlZiBfVU5JQ09TCisJbXlzaWduYWwoU0lHQ0hMRCwgc2lnY2hsZF9oYW5kbGVyKTsKKyNlbmRpZgorCW5vdGlmeV9wYXJlbnQoKTsKKwllcnJubyA9IHNhdmVfZXJybm87Cit9CisKKy8qQVJHU1VTRUQqLworc3RhdGljIHZvaWQKK3NpZ3Rlcm1faGFuZGxlcihpbnQgc2lnKQoreworCXJlY2VpdmVkX3NpZ3Rlcm0gPSBzaWc7Cit9CisKKy8qCisgKiBNYWtlIHBhY2tldHMgZnJvbSBidWZmZXJlZCBzdGRlcnIgZGF0YSwgYW5kIGJ1ZmZlciBpdCBmb3Igc2VuZGluZworICogdG8gdGhlIGNsaWVudC4KKyAqLworc3RhdGljIHZvaWQKK21ha2VfcGFja2V0c19mcm9tX3N0ZGVycl9kYXRhKHZvaWQpCit7CisJdV9pbnQgbGVuOworCisJLyogU2VuZCBidWZmZXJlZCBzdGRlcnIgZGF0YSB0byB0aGUgY2xpZW50LiAqLworCXdoaWxlIChidWZmZXJfbGVuKCZzdGRlcnJfYnVmZmVyKSA+IDAgJiYKKwkgICAgcGFja2V0X25vdF92ZXJ5X211Y2hfZGF0YV90b193cml0ZSgpKSB7CisJCWxlbiA9IGJ1ZmZlcl9sZW4oJnN0ZGVycl9idWZmZXIpOworCQlpZiAocGFja2V0X2lzX2ludGVyYWN0aXZlKCkpIHsKKwkJCWlmIChsZW4gPiA1MTIpCisJCQkJbGVuID0gNTEyOworCQl9IGVsc2UgeworCQkJLyogS2VlcCB0aGUgcGFja2V0cyBhdCByZWFzb25hYmxlIHNpemUuICovCisJCQlpZiAobGVuID4gcGFja2V0X2dldF9tYXhzaXplKCkpCisJCQkJbGVuID0gcGFja2V0X2dldF9tYXhzaXplKCk7CisJCX0KKwkJcGFja2V0X3N0YXJ0KFNTSF9TTVNHX1NUREVSUl9EQVRBKTsKKwkJcGFja2V0X3B1dF9zdHJpbmcoYnVmZmVyX3B0cigmc3RkZXJyX2J1ZmZlciksIGxlbik7CisJCXBhY2tldF9zZW5kKCk7CisJCWJ1ZmZlcl9jb25zdW1lKCZzdGRlcnJfYnVmZmVyLCBsZW4pOworCQlzdGRlcnJfYnl0ZXMgKz0gbGVuOworCX0KK30KKworLyoKKyAqIE1ha2UgcGFja2V0cyBmcm9tIGJ1ZmZlcmVkIHN0ZG91dCBkYXRhLCBhbmQgYnVmZmVyIGl0IGZvciBzZW5kaW5nIHRvIHRoZQorICogY2xpZW50LgorICovCitzdGF0aWMgdm9pZAorbWFrZV9wYWNrZXRzX2Zyb21fc3Rkb3V0X2RhdGEodm9pZCkKK3sKKwl1X2ludCBsZW47CisKKwkvKiBTZW5kIGJ1ZmZlcmVkIHN0ZG91dCBkYXRhIHRvIHRoZSBjbGllbnQuICovCisJd2hpbGUgKGJ1ZmZlcl9sZW4oJnN0ZG91dF9idWZmZXIpID4gMCAmJgorCSAgICBwYWNrZXRfbm90X3ZlcnlfbXVjaF9kYXRhX3RvX3dyaXRlKCkpIHsKKwkJbGVuID0gYnVmZmVyX2xlbigmc3Rkb3V0X2J1ZmZlcik7CisJCWlmIChwYWNrZXRfaXNfaW50ZXJhY3RpdmUoKSkgeworCQkJaWYgKGxlbiA+IDUxMikKKwkJCQlsZW4gPSA1MTI7CisJCX0gZWxzZSB7CisJCQkvKiBLZWVwIHRoZSBwYWNrZXRzIGF0IHJlYXNvbmFibGUgc2l6ZS4gKi8KKwkJCWlmIChsZW4gPiBwYWNrZXRfZ2V0X21heHNpemUoKSkKKwkJCQlsZW4gPSBwYWNrZXRfZ2V0X21heHNpemUoKTsKKwkJfQorCQlwYWNrZXRfc3RhcnQoU1NIX1NNU0dfU1RET1VUX0RBVEEpOworCQlwYWNrZXRfcHV0X3N0cmluZyhidWZmZXJfcHRyKCZzdGRvdXRfYnVmZmVyKSwgbGVuKTsKKwkJcGFja2V0X3NlbmQoKTsKKwkJYnVmZmVyX2NvbnN1bWUoJnN0ZG91dF9idWZmZXIsIGxlbik7CisJCXN0ZG91dF9ieXRlcyArPSBsZW47CisJfQorfQorCitzdGF0aWMgdm9pZAorY2xpZW50X2FsaXZlX2NoZWNrKHZvaWQpCit7CisJaW50IGNoYW5uZWxfaWQ7CisKKwkvKiB0aW1lb3V0LCBjaGVjayB0byBzZWUgaG93IG1hbnkgd2UgaGF2ZSBoYWQgKi8KKwlpZiAocGFja2V0X2luY19hbGl2ZV90aW1lb3V0cygpID4gb3B0aW9ucy5jbGllbnRfYWxpdmVfY291bnRfbWF4KSB7CisJCWxvZ2l0KCJUaW1lb3V0LCBjbGllbnQgbm90IHJlc3BvbmRpbmcuIik7CisJCWNsZWFudXBfZXhpdCgyNTUpOworCX0KKworCS8qCisJICogc2VuZCBhIGJvZ3VzIGdsb2JhbC9jaGFubmVsIHJlcXVlc3Qgd2l0aCAid2FudHJlcGx5IiwKKwkgKiB3ZSBzaG91bGQgZ2V0IGJhY2sgYSBmYWlsdXJlCisJICovCisJaWYgKChjaGFubmVsX2lkID0gY2hhbm5lbF9maW5kX29wZW4oKSkgPT0gLTEpIHsKKwkJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0dMT0JBTF9SRVFVRVNUKTsKKwkJcGFja2V0X3B1dF9jc3RyaW5nKCJrZWVwYWxpdmVAb3BlbnNzaC5jb20iKTsKKwkJcGFja2V0X3B1dF9jaGFyKDEpOwkvKiBib29sZWFuOiB3YW50IHJlcGx5ICovCisJfSBlbHNlIHsKKwkJY2hhbm5lbF9yZXF1ZXN0X3N0YXJ0KGNoYW5uZWxfaWQsICJrZWVwYWxpdmVAb3BlbnNzaC5jb20iLCAxKTsKKwl9CisJcGFja2V0X3NlbmQoKTsKK30KKworLyoKKyAqIFNsZWVwIGluIHNlbGVjdCgpIHVudGlsIHdlIGNhbiBkbyBzb21ldGhpbmcuICBUaGlzIHdpbGwgaW5pdGlhbGl6ZSB0aGUKKyAqIHNlbGVjdCBtYXNrcy4gIFVwb24gcmV0dXJuLCB0aGUgbWFza3Mgd2lsbCBpbmRpY2F0ZSB3aGljaCBkZXNjcmlwdG9ycworICogaGF2ZSBkYXRhIG9yIGNhbiBhY2NlcHQgZGF0YS4gIE9wdGlvbmFsbHksIGEgbWF4aW11bSB0aW1lIGNhbiBiZSBzcGVjaWZpZWQKKyAqIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHdhaXQgKDAgPSBpbmZpbml0ZSkuCisgKi8KK3N0YXRpYyB2b2lkCit3YWl0X3VudGlsX2Nhbl9kb19zb21ldGhpbmcoZmRfc2V0ICoqcmVhZHNldHAsIGZkX3NldCAqKndyaXRlc2V0cCwgaW50ICptYXhmZHAsCisgICAgdV9pbnQgKm5hbGxvY3AsIHVfaW50IG1heF90aW1lX21pbGxpc2Vjb25kcykKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0diwgKnR2cDsKKwlpbnQgcmV0OworCWludCBjbGllbnRfYWxpdmVfc2NoZWR1bGVkID0gMDsKKwlpbnQgcHJvZ3JhbV9hbGl2ZV9zY2hlZHVsZWQgPSAwOworCisJLyoKKwkgKiBpZiB1c2luZyBjbGllbnRfYWxpdmUsIHNldCB0aGUgbWF4IHRpbWVvdXQgYWNjb3JkaW5nbHksCisJICogYW5kIGluZGljYXRlIHRoYXQgdGhpcyBwYXJ0aWN1bGFyIHRpbWVvdXQgd2FzIGZvciBjbGllbnQKKwkgKiBhbGl2ZSBieSBzZXR0aW5nIHRoZSBjbGllbnRfYWxpdmVfc2NoZWR1bGVkIGZsYWcuCisJICoKKwkgKiB0aGlzIGNvdWxkIGJlIHJhbmRvbWl6ZWQgc29tZXdoYXQgdG8gbWFrZSB0cmFmZmljCisJICogYW5hbHlzaXMgbW9yZSBkaWZmaWN1bHQsIGJ1dCB3ZSdyZSBub3QgZG9pbmcgaXQgeWV0LgorCSAqLworCWlmIChjb21wYXQyMCAmJgorCSAgICBtYXhfdGltZV9taWxsaXNlY29uZHMgPT0gMCAmJiBvcHRpb25zLmNsaWVudF9hbGl2ZV9pbnRlcnZhbCkgeworCQljbGllbnRfYWxpdmVfc2NoZWR1bGVkID0gMTsKKwkJbWF4X3RpbWVfbWlsbGlzZWNvbmRzID0gb3B0aW9ucy5jbGllbnRfYWxpdmVfaW50ZXJ2YWwgKiAxMDAwOworCX0KKworCS8qIEFsbG9jYXRlIGFuZCB1cGRhdGUgc2VsZWN0KCkgbWFza3MgZm9yIGNoYW5uZWwgZGVzY3JpcHRvcnMuICovCisJY2hhbm5lbF9wcmVwYXJlX3NlbGVjdChyZWFkc2V0cCwgd3JpdGVzZXRwLCBtYXhmZHAsIG5hbGxvY3AsIDApOworCisJaWYgKGNvbXBhdDIwKSB7CisjaWYgMAorCQkvKiB3cm9uZzogYmFkIGNvbmRpdGlvbiBYWFggKi8KKwkJaWYgKGNoYW5uZWxfbm90X3ZlcnlfbXVjaF9idWZmZXJlZF9kYXRhKCkpCisjZW5kaWYKKwkJRkRfU0VUKGNvbm5lY3Rpb25faW4sICpyZWFkc2V0cCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogUmVhZCBwYWNrZXRzIGZyb20gdGhlIGNsaWVudCB1bmxlc3Mgd2UgaGF2ZSB0b28gbXVjaAorCQkgKiBidWZmZXJlZCBzdGRpbiBvciBjaGFubmVsIGRhdGEuCisJCSAqLworCQlpZiAoYnVmZmVyX2xlbigmc3RkaW5fYnVmZmVyKSA8IGJ1ZmZlcl9oaWdoICYmCisJCSAgICBjaGFubmVsX25vdF92ZXJ5X211Y2hfYnVmZmVyZWRfZGF0YSgpKQorCQkJRkRfU0VUKGNvbm5lY3Rpb25faW4sICpyZWFkc2V0cCk7CisJCS8qCisJCSAqIElmIHRoZXJlIGlzIG5vdCB0b28gbXVjaCBkYXRhIGFscmVhZHkgYnVmZmVyZWQgZ29pbmcgdG8KKwkJICogdGhlIGNsaWVudCwgdHJ5IHRvIGdldCBzb21lIG1vcmUgZGF0YSBmcm9tIHRoZSBwcm9ncmFtLgorCQkgKi8KKwkJaWYgKHBhY2tldF9ub3RfdmVyeV9tdWNoX2RhdGFfdG9fd3JpdGUoKSkgeworCQkJcHJvZ3JhbV9hbGl2ZV9zY2hlZHVsZWQgPSBjaGlsZF90ZXJtaW5hdGVkOworCQkJaWYgKCFmZG91dF9lb2YpCisJCQkJRkRfU0VUKGZkb3V0LCAqcmVhZHNldHApOworCQkJaWYgKCFmZGVycl9lb2YpCisJCQkJRkRfU0VUKGZkZXJyLCAqcmVhZHNldHApOworCQl9CisJCS8qCisJCSAqIElmIHdlIGhhdmUgYnVmZmVyZWQgZGF0YSwgdHJ5IHRvIHdyaXRlIHNvbWUgb2YgdGhhdCBkYXRhCisJCSAqIHRvIHRoZSBwcm9ncmFtLgorCQkgKi8KKwkJaWYgKGZkaW4gIT0gLTEgJiYgYnVmZmVyX2xlbigmc3RkaW5fYnVmZmVyKSA+IDApCisJCQlGRF9TRVQoZmRpbiwgKndyaXRlc2V0cCk7CisJfQorCW5vdGlmeV9wcmVwYXJlKCpyZWFkc2V0cCk7CisKKwkvKgorCSAqIElmIHdlIGhhdmUgYnVmZmVyZWQgcGFja2V0IGRhdGEgZ29pbmcgdG8gdGhlIGNsaWVudCwgbWFyayB0aGF0CisJICogZGVzY3JpcHRvci4KKwkgKi8KKwlpZiAocGFja2V0X2hhdmVfZGF0YV90b193cml0ZSgpKQorCQlGRF9TRVQoY29ubmVjdGlvbl9vdXQsICp3cml0ZXNldHApOworCisJLyoKKwkgKiBJZiBjaGlsZCBoYXMgdGVybWluYXRlZCBhbmQgdGhlcmUgaXMgZW5vdWdoIGJ1ZmZlciBzcGFjZSB0byByZWFkCisJICogZnJvbSBpdCwgdGhlbiByZWFkIGFzIG11Y2ggYXMgaXMgYXZhaWxhYmxlIGFuZCBleGl0LgorCSAqLworCWlmIChjaGlsZF90ZXJtaW5hdGVkICYmIHBhY2tldF9ub3RfdmVyeV9tdWNoX2RhdGFfdG9fd3JpdGUoKSkKKwkJaWYgKG1heF90aW1lX21pbGxpc2Vjb25kcyA9PSAwIHx8IGNsaWVudF9hbGl2ZV9zY2hlZHVsZWQpCisJCQltYXhfdGltZV9taWxsaXNlY29uZHMgPSAxMDA7CisKKwlpZiAobWF4X3RpbWVfbWlsbGlzZWNvbmRzID09IDApCisJCXR2cCA9IE5VTEw7CisJZWxzZSB7CisJCXR2LnR2X3NlYyA9IG1heF90aW1lX21pbGxpc2Vjb25kcyAvIDEwMDA7CisJCXR2LnR2X3VzZWMgPSAxMDAwICogKG1heF90aW1lX21pbGxpc2Vjb25kcyAlIDEwMDApOworCQl0dnAgPSAmdHY7CisJfQorCisJLyogV2FpdCBmb3Igc29tZXRoaW5nIHRvIGhhcHBlbiwgb3IgdGhlIHRpbWVvdXQgdG8gZXhwaXJlLiAqLworCXJldCA9IHNlbGVjdCgoKm1heGZkcCkrMSwgKnJlYWRzZXRwLCAqd3JpdGVzZXRwLCBOVUxMLCB0dnApOworCisJaWYgKHJldCA9PSAtMSkgeworCQltZW1zZXQoKnJlYWRzZXRwLCAwLCAqbmFsbG9jcCk7CisJCW1lbXNldCgqd3JpdGVzZXRwLCAwLCAqbmFsbG9jcCk7CisJCWlmIChlcnJubyAhPSBFSU5UUikKKwkJCWVycm9yKCJzZWxlY3Q6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7CisJfSBlbHNlIHsKKwkJaWYgKHJldCA9PSAwICYmIGNsaWVudF9hbGl2ZV9zY2hlZHVsZWQpCisJCQljbGllbnRfYWxpdmVfY2hlY2soKTsKKwkJaWYgKCFjb21wYXQyMCAmJiBwcm9ncmFtX2FsaXZlX3NjaGVkdWxlZCAmJiBmZGluX2lzX3R0eSkgeworCQkJaWYgKCFmZG91dF9lb2YpCisJCQkJRkRfU0VUKGZkb3V0LCAqcmVhZHNldHApOworCQkJaWYgKCFmZGVycl9lb2YpCisJCQkJRkRfU0VUKGZkZXJyLCAqcmVhZHNldHApOworCQl9CisJfQorCisJbm90aWZ5X2RvbmUoKnJlYWRzZXRwKTsKK30KKworLyoKKyAqIFByb2Nlc3NlcyBpbnB1dCBmcm9tIHRoZSBjbGllbnQgYW5kIHRoZSBwcm9ncmFtLiAgSW5wdXQgZGF0YSBpcyBzdG9yZWQKKyAqIGluIGJ1ZmZlcnMgYW5kIHByb2Nlc3NlZCBsYXRlci4KKyAqLworc3RhdGljIHZvaWQKK3Byb2Nlc3NfaW5wdXQoZmRfc2V0ICpyZWFkc2V0KQoreworCWludCBsZW47CisJY2hhciBidWZbMTYzODRdOworCisJLyogUmVhZCBhbmQgYnVmZmVyIGFueSBpbnB1dCBkYXRhIGZyb20gdGhlIGNsaWVudC4gKi8KKwlpZiAoRkRfSVNTRVQoY29ubmVjdGlvbl9pbiwgcmVhZHNldCkpIHsKKwkJaW50IGNvbnQgPSAwOworCQlsZW4gPSByb2FtaW5nX3JlYWQoY29ubmVjdGlvbl9pbiwgYnVmLCBzaXplb2YoYnVmKSwgJmNvbnQpOworCQlpZiAobGVuID09IDApIHsKKwkJCWlmIChjb250KQorCQkJCXJldHVybjsKKwkJCXZlcmJvc2UoIkNvbm5lY3Rpb24gY2xvc2VkIGJ5ICUuMTAwcyIsCisJCQkgICAgZ2V0X3JlbW90ZV9pcGFkZHIoKSk7CisJCQljb25uZWN0aW9uX2Nsb3NlZCA9IDE7CisJCQlpZiAoY29tcGF0MjApCisJCQkJcmV0dXJuOworCQkJY2xlYW51cF9leGl0KDI1NSk7CisJCX0gZWxzZSBpZiAobGVuIDwgMCkgeworCQkJaWYgKGVycm5vICE9IEVJTlRSICYmIGVycm5vICE9IEVBR0FJTiAmJgorCQkJICAgIGVycm5vICE9IEVXT1VMREJMT0NLKSB7CisJCQkJdmVyYm9zZSgiUmVhZCBlcnJvciBmcm9tIHJlbW90ZSBob3N0ICIKKwkJCQkgICAgIiUuMTAwczogJS4xMDBzIiwKKwkJCQkgICAgZ2V0X3JlbW90ZV9pcGFkZHIoKSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQljbGVhbnVwX2V4aXQoMjU1KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIEJ1ZmZlciBhbnkgcmVjZWl2ZWQgZGF0YS4gKi8KKwkJCXBhY2tldF9wcm9jZXNzX2luY29taW5nKGJ1ZiwgbGVuKTsKKwkJfQorCX0KKwlpZiAoY29tcGF0MjApCisJCXJldHVybjsKKworCS8qIFJlYWQgYW5kIGJ1ZmZlciBhbnkgYXZhaWxhYmxlIHN0ZG91dCBkYXRhIGZyb20gdGhlIHByb2dyYW0uICovCisJaWYgKCFmZG91dF9lb2YgJiYgRkRfSVNTRVQoZmRvdXQsIHJlYWRzZXQpKSB7CisJCWVycm5vID0gMDsKKwkJbGVuID0gcmVhZChmZG91dCwgYnVmLCBzaXplb2YoYnVmKSk7CisJCWlmIChsZW4gPCAwICYmIChlcnJubyA9PSBFSU5UUiB8fCAoKGVycm5vID09IEVBR0FJTiB8fAorCQkgICAgZXJybm8gPT0gRVdPVUxEQkxPQ0spICYmICFjaGlsZF90ZXJtaW5hdGVkKSkpIHsKKwkJCS8qIGRvIG5vdGhpbmcgKi8KKyNpZm5kZWYgUFRZX1pFUk9SRUFECisJCX0gZWxzZSBpZiAobGVuIDw9IDApIHsKKyNlbHNlCisJCX0gZWxzZSBpZiAoKCFpc2F0dHkoZmRvdXQpICYmIGxlbiA8PSAwKSB8fAorCQkgICAgKGlzYXR0eShmZG91dCkgJiYgKGxlbiA8IDAgfHwgKGxlbiA9PSAwICYmIGVycm5vICE9IDApKSkpIHsKKyNlbmRpZgorCQkJZmRvdXRfZW9mID0gMTsKKwkJfSBlbHNlIHsKKwkJCWJ1ZmZlcl9hcHBlbmQoJnN0ZG91dF9idWZmZXIsIGJ1ZiwgbGVuKTsKKwkJCWZkb3V0X2J5dGVzICs9IGxlbjsKKwkJfQorCX0KKwkvKiBSZWFkIGFuZCBidWZmZXIgYW55IGF2YWlsYWJsZSBzdGRlcnIgZGF0YSBmcm9tIHRoZSBwcm9ncmFtLiAqLworCWlmICghZmRlcnJfZW9mICYmIEZEX0lTU0VUKGZkZXJyLCByZWFkc2V0KSkgeworCQllcnJubyA9IDA7CisJCWxlbiA9IHJlYWQoZmRlcnIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQlpZiAobGVuIDwgMCAmJiAoZXJybm8gPT0gRUlOVFIgfHwgKChlcnJubyA9PSBFQUdBSU4gfHwKKwkJICAgIGVycm5vID09IEVXT1VMREJMT0NLKSAmJiAhY2hpbGRfdGVybWluYXRlZCkpKSB7CisJCQkvKiBkbyBub3RoaW5nICovCisjaWZuZGVmIFBUWV9aRVJPUkVBRAorCQl9IGVsc2UgaWYgKGxlbiA8PSAwKSB7CisjZWxzZQorCQl9IGVsc2UgaWYgKCghaXNhdHR5KGZkZXJyKSAmJiBsZW4gPD0gMCkgfHwKKwkJICAgIChpc2F0dHkoZmRlcnIpICYmIChsZW4gPCAwIHx8IChsZW4gPT0gMCAmJiBlcnJubyAhPSAwKSkpKSB7CisjZW5kaWYKKwkJCWZkZXJyX2VvZiA9IDE7CisJCX0gZWxzZSB7CisJCQlidWZmZXJfYXBwZW5kKCZzdGRlcnJfYnVmZmVyLCBidWYsIGxlbik7CisJCX0KKwl9Cit9CisKKy8qCisgKiBTZW5kcyBkYXRhIGZyb20gaW50ZXJuYWwgYnVmZmVycyB0byBjbGllbnQgcHJvZ3JhbSBzdGRpbi4KKyAqLworc3RhdGljIHZvaWQKK3Byb2Nlc3Nfb3V0cHV0KGZkX3NldCAqd3JpdGVzZXQpCit7CisJc3RydWN0IHRlcm1pb3MgdGlvOworCXVfY2hhciAqZGF0YTsKKwl1X2ludCBkbGVuOworCWludCBsZW47CisKKwkvKiBXcml0ZSBidWZmZXJlZCBkYXRhIHRvIHByb2dyYW0gc3RkaW4uICovCisJaWYgKCFjb21wYXQyMCAmJiBmZGluICE9IC0xICYmIEZEX0lTU0VUKGZkaW4sIHdyaXRlc2V0KSkgeworCQlkYXRhID0gYnVmZmVyX3B0cigmc3RkaW5fYnVmZmVyKTsKKwkJZGxlbiA9IGJ1ZmZlcl9sZW4oJnN0ZGluX2J1ZmZlcik7CisJCWxlbiA9IHdyaXRlKGZkaW4sIGRhdGEsIGRsZW4pOworCQlpZiAobGVuIDwgMCAmJgorCQkgICAgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykpIHsKKwkJCS8qIGRvIG5vdGhpbmcgKi8KKwkJfSBlbHNlIGlmIChsZW4gPD0gMCkgeworCQkJaWYgKGZkaW4gIT0gZmRvdXQpCisJCQkJY2xvc2UoZmRpbik7CisJCQllbHNlCisJCQkJc2h1dGRvd24oZmRpbiwgU0hVVF9XUik7IC8qIFdlIHdpbGwgbm8gbG9uZ2VyIHNlbmQuICovCisJCQlmZGluID0gLTE7CisJCX0gZWxzZSB7CisJCQkvKiBTdWNjZXNzZnVsIHdyaXRlLiAqLworCQkJaWYgKGZkaW5faXNfdHR5ICYmIGRsZW4gPj0gMSAmJiBkYXRhWzBdICE9ICdccicgJiYKKwkJCSAgICB0Y2dldGF0dHIoZmRpbiwgJnRpbykgPT0gMCAmJgorCQkJICAgICEodGlvLmNfbGZsYWcgJiBFQ0hPKSAmJiAodGlvLmNfbGZsYWcgJiBJQ0FOT04pKSB7CisJCQkJLyoKKwkJCQkgKiBTaW11bGF0ZSBlY2hvIHRvIHJlZHVjZSB0aGUgaW1wYWN0IG9mCisJCQkJICogdHJhZmZpYyBhbmFseXNpcworCQkJCSAqLworCQkJCXBhY2tldF9zZW5kX2lnbm9yZShsZW4pOworCQkJCXBhY2tldF9zZW5kKCk7CisJCQl9CisJCQkvKiBDb25zdW1lIHRoZSBkYXRhIGZyb20gdGhlIGJ1ZmZlci4gKi8KKwkJCWJ1ZmZlcl9jb25zdW1lKCZzdGRpbl9idWZmZXIsIGxlbik7CisJCQkvKiBVcGRhdGUgdGhlIGNvdW50IG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIHByb2dyYW0uICovCisJCQlzdGRpbl9ieXRlcyArPSBsZW47CisJCX0KKwl9CisJLyogU2VuZCBhbnkgYnVmZmVyZWQgcGFja2V0IGRhdGEgdG8gdGhlIGNsaWVudC4gKi8KKwlpZiAoRkRfSVNTRVQoY29ubmVjdGlvbl9vdXQsIHdyaXRlc2V0KSkKKwkJcGFja2V0X3dyaXRlX3BvbGwoKTsKK30KKworLyoKKyAqIFdhaXQgdW50aWwgYWxsIGJ1ZmZlcmVkIG91dHB1dCBoYXMgYmVlbiBzZW50IHRvIHRoZSBjbGllbnQuCisgKiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgcHJvZ3JhbSB0ZXJtaW5hdGVzLgorICovCitzdGF0aWMgdm9pZAorZHJhaW5fb3V0cHV0KHZvaWQpCit7CisJLyogU2VuZCBhbnkgYnVmZmVyZWQgc3Rkb3V0IGRhdGEgdG8gdGhlIGNsaWVudC4gKi8KKwlpZiAoYnVmZmVyX2xlbigmc3Rkb3V0X2J1ZmZlcikgPiAwKSB7CisJCXBhY2tldF9zdGFydChTU0hfU01TR19TVERPVVRfREFUQSk7CisJCXBhY2tldF9wdXRfc3RyaW5nKGJ1ZmZlcl9wdHIoJnN0ZG91dF9idWZmZXIpLAorCQkJCSAgYnVmZmVyX2xlbigmc3Rkb3V0X2J1ZmZlcikpOworCQlwYWNrZXRfc2VuZCgpOworCQkvKiBVcGRhdGUgdGhlIGNvdW50IG9mIHNlbnQgYnl0ZXMuICovCisJCXN0ZG91dF9ieXRlcyArPSBidWZmZXJfbGVuKCZzdGRvdXRfYnVmZmVyKTsKKwl9CisJLyogU2VuZCBhbnkgYnVmZmVyZWQgc3RkZXJyIGRhdGEgdG8gdGhlIGNsaWVudC4gKi8KKwlpZiAoYnVmZmVyX2xlbigmc3RkZXJyX2J1ZmZlcikgPiAwKSB7CisJCXBhY2tldF9zdGFydChTU0hfU01TR19TVERFUlJfREFUQSk7CisJCXBhY2tldF9wdXRfc3RyaW5nKGJ1ZmZlcl9wdHIoJnN0ZGVycl9idWZmZXIpLAorCQkJCSAgYnVmZmVyX2xlbigmc3RkZXJyX2J1ZmZlcikpOworCQlwYWNrZXRfc2VuZCgpOworCQkvKiBVcGRhdGUgdGhlIGNvdW50IG9mIHNlbnQgYnl0ZXMuICovCisJCXN0ZGVycl9ieXRlcyArPSBidWZmZXJfbGVuKCZzdGRlcnJfYnVmZmVyKTsKKwl9CisJLyogV2FpdCB1bnRpbCBhbGwgYnVmZmVyZWQgZGF0YSBoYXMgYmVlbiB3cml0dGVuIHRvIHRoZSBjbGllbnQuICovCisJcGFja2V0X3dyaXRlX3dhaXQoKTsKK30KKworc3RhdGljIHZvaWQKK3Byb2Nlc3NfYnVmZmVyZWRfaW5wdXRfcGFja2V0cyh2b2lkKQoreworCWRpc3BhdGNoX3J1bihESVNQQVRDSF9OT05CTE9DSywgTlVMTCwgY29tcGF0MjAgPyB4eHhfa2V4IDogTlVMTCk7Cit9CisKKy8qCisgKiBQZXJmb3JtcyB0aGUgaW50ZXJhY3RpdmUgc2Vzc2lvbi4gIFRoaXMgaGFuZGxlcyBkYXRhIHRyYW5zbWlzc2lvbiBiZXR3ZWVuCisgKiB0aGUgY2xpZW50IGFuZCB0aGUgcHJvZ3JhbS4gIE5vdGUgdGhhdCB0aGUgbm90aW9uIG9mIHN0ZGluLCBzdGRvdXQsIGFuZAorICogc3RkZXJyIGluIHRoaXMgZnVuY3Rpb24gaXMgc29ydCBvZiByZXZlcnNlZDogdGhpcyBmdW5jdGlvbiB3cml0ZXMgdG8KKyAqIHN0ZGluIChvZiB0aGUgY2hpbGQgcHJvZ3JhbSksIGFuZCByZWFkcyBmcm9tIHN0ZG91dCBhbmQgc3RkZXJyIChvZiB0aGUKKyAqIGNoaWxkIHByb2dyYW0pLgorICovCit2b2lkCitzZXJ2ZXJfbG9vcChwaWRfdCBwaWQsIGludCBmZGluX2FyZywgaW50IGZkb3V0X2FyZywgaW50IGZkZXJyX2FyZykKK3sKKwlmZF9zZXQgKnJlYWRzZXQgPSBOVUxMLCAqd3JpdGVzZXQgPSBOVUxMOworCWludCBtYXhfZmQgPSAwOworCXVfaW50IG5hbGxvYyA9IDA7CisJaW50IHdhaXRfc3RhdHVzOwkvKiBTdGF0dXMgcmV0dXJuZWQgYnkgd2FpdCgpLiAqLworCXBpZF90IHdhaXRfcGlkOwkJLyogcGlkIHJldHVybmVkIGJ5IHdhaXQoKS4gKi8KKwlpbnQgd2FpdGluZ190ZXJtaW5hdGlvbiA9IDA7CS8qIEhhdmUgZGlzcGxheWVkIHdhaXRpbmcgY2xvc2UgbWVzc2FnZS4gKi8KKwl1X2ludCBtYXhfdGltZV9taWxsaXNlY29uZHM7CisJdV9pbnQgcHJldmlvdXNfc3Rkb3V0X2J1ZmZlcl9ieXRlczsKKwl1X2ludCBzdGRvdXRfYnVmZmVyX2J5dGVzOworCWludCB0eXBlOworCisJZGVidWcoIkVudGVyaW5nIGludGVyYWN0aXZlIHNlc3Npb24uIik7CisKKwkvKiBJbml0aWFsaXplIHRoZSBTSUdDSExEIGtsdWRnZS4gKi8KKwljaGlsZF90ZXJtaW5hdGVkID0gMDsKKwlteXNpZ25hbChTSUdDSExELCBzaWdjaGxkX2hhbmRsZXIpOworCisJaWYgKCF1c2VfcHJpdnNlcCkgeworCQlzaWduYWwoU0lHVEVSTSwgc2lndGVybV9oYW5kbGVyKTsKKwkJc2lnbmFsKFNJR0lOVCwgc2lndGVybV9oYW5kbGVyKTsKKwkJc2lnbmFsKFNJR1FVSVQsIHNpZ3Rlcm1faGFuZGxlcik7CisJfQorCisJLyogSW5pdGlhbGl6ZSBvdXIgZ2xvYmFsIHZhcmlhYmxlcy4gKi8KKwlmZGluID0gZmRpbl9hcmc7CisJZmRvdXQgPSBmZG91dF9hcmc7CisJZmRlcnIgPSBmZGVycl9hcmc7CisKKwkvKiBub25ibG9ja2luZyBJTyAqLworCXNldF9ub25ibG9jayhmZGluKTsKKwlzZXRfbm9uYmxvY2soZmRvdXQpOworCS8qIHdlIGRvbid0IGhhdmUgc3RkZXJyIGZvciBpbnRlcmFjdGl2ZSB0ZXJtaW5hbCBzZXNzaW9ucywgc2VlIGJlbG93ICovCisJaWYgKGZkZXJyICE9IC0xKQorCQlzZXRfbm9uYmxvY2soZmRlcnIpOworCisJaWYgKCEoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX0lHTk9SRU1TRykgJiYgaXNhdHR5KGZkaW4pKQorCQlmZGluX2lzX3R0eSA9IDE7CisKKwljb25uZWN0aW9uX2luID0gcGFja2V0X2dldF9jb25uZWN0aW9uX2luKCk7CisJY29ubmVjdGlvbl9vdXQgPSBwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25fb3V0KCk7CisKKwlub3RpZnlfc2V0dXAoKTsKKworCXByZXZpb3VzX3N0ZG91dF9idWZmZXJfYnl0ZXMgPSAwOworCisJLyogU2V0IGFwcHJveGltYXRlIEkvTyBidWZmZXIgc2l6ZS4gKi8KKwlpZiAocGFja2V0X2lzX2ludGVyYWN0aXZlKCkpCisJCWJ1ZmZlcl9oaWdoID0gNDA5NjsKKwllbHNlCisJCWJ1ZmZlcl9oaWdoID0gNjQgKiAxMDI0OworCisjaWYgMAorCS8qIEluaXRpYWxpemUgbWF4X2ZkIHRvIHRoZSBtYXhpbXVtIG9mIHRoZSBrbm93biBmaWxlIGRlc2NyaXB0b3JzLiAqLworCW1heF9mZCA9IE1BWChjb25uZWN0aW9uX2luLCBjb25uZWN0aW9uX291dCk7CisJbWF4X2ZkID0gTUFYKG1heF9mZCwgZmRpbik7CisJbWF4X2ZkID0gTUFYKG1heF9mZCwgZmRvdXQpOworCWlmIChmZGVyciAhPSAtMSkKKwkJbWF4X2ZkID0gTUFYKG1heF9mZCwgZmRlcnIpOworI2VuZGlmCisKKwkvKiBJbml0aWFsaXplIEluaXRpYWxpemUgYnVmZmVycy4gKi8KKwlidWZmZXJfaW5pdCgmc3RkaW5fYnVmZmVyKTsKKwlidWZmZXJfaW5pdCgmc3Rkb3V0X2J1ZmZlcik7CisJYnVmZmVyX2luaXQoJnN0ZGVycl9idWZmZXIpOworCisJLyoKKwkgKiBJZiB3ZSBoYXZlIG5vIHNlcGFyYXRlIGZkZXJyICh3aGljaCBpcyB0aGUgY2FzZSB3aGVuIHdlIGhhdmUgYSBwdHkKKwkgKiAtIHRoZXJlIHdlIGNhbm5vdCBtYWtlIGRpZmZlcmVuY2UgYmV0d2VlbiBkYXRhIHNlbnQgdG8gc3Rkb3V0IGFuZAorCSAqIHN0ZGVyciksIGluZGljYXRlIHRoYXQgd2UgaGF2ZSBzZWVuIGFuIEVPRiBmcm9tIHN0ZGVyci4gIFRoaXMgd2F5CisJICogd2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgZGVzY3JpcHRvciBldmVyeXdoZXJlLgorCSAqLworCWlmIChmZGVyciA9PSAtMSkKKwkJZmRlcnJfZW9mID0gMTsKKworCXNlcnZlcl9pbml0X2Rpc3BhdGNoKCk7CisKKwkvKiBNYWluIGxvb3Agb2YgdGhlIHNlcnZlciBmb3IgdGhlIGludGVyYWN0aXZlIHNlc3Npb24gbW9kZS4gKi8KKwlmb3IgKDs7KSB7CisKKwkJLyogUHJvY2VzcyBidWZmZXJlZCBwYWNrZXRzIGZyb20gdGhlIGNsaWVudC4gKi8KKwkJcHJvY2Vzc19idWZmZXJlZF9pbnB1dF9wYWNrZXRzKCk7CisKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSByZWNlaXZlZCBlb2YsIGFuZCB0aGVyZSBpcyBubyBtb3JlIHBlbmRpbmcKKwkJICogaW5wdXQgZGF0YSwgY2F1c2UgYSByZWFsIGVvZiBieSBjbG9zaW5nIGZkaW4uCisJCSAqLworCQlpZiAoc3RkaW5fZW9mICYmIGZkaW4gIT0gLTEgJiYgYnVmZmVyX2xlbigmc3RkaW5fYnVmZmVyKSA9PSAwKSB7CisJCQlpZiAoZmRpbiAhPSBmZG91dCkKKwkJCQljbG9zZShmZGluKTsKKwkJCWVsc2UKKwkJCQlzaHV0ZG93bihmZGluLCBTSFVUX1dSKTsgLyogV2Ugd2lsbCBubyBsb25nZXIgc2VuZC4gKi8KKwkJCWZkaW4gPSAtMTsKKwkJfQorCQkvKiBNYWtlIHBhY2tldHMgZnJvbSBidWZmZXJlZCBzdGRlcnIgZGF0YSB0byBzZW5kIHRvIHRoZSBjbGllbnQuICovCisJCW1ha2VfcGFja2V0c19mcm9tX3N0ZGVycl9kYXRhKCk7CisKKwkJLyoKKwkJICogTWFrZSBwYWNrZXRzIGZyb20gYnVmZmVyZWQgc3Rkb3V0IGRhdGEgdG8gc2VuZCB0byB0aGUKKwkJICogY2xpZW50LiBJZiB0aGVyZSBpcyB2ZXJ5IGxpdHRsZSB0byBzZW5kLCB0aGlzIGFycmFuZ2VzIHRvCisJCSAqIG5vdCBzZW5kIHRoZW0gbm93LCBidXQgdG8gd2FpdCBhIHNob3J0IHdoaWxlIHRvIHNlZSBpZiB3ZQorCQkgKiBhcmUgZ2V0dGluZyBtb3JlIGRhdGEuIFRoaXMgaXMgbmVjZXNzYXJ5LCBhcyBzb21lIHN5c3RlbXMKKwkJICogd2FrZSB1cCByZWFkZXJzIGZyb20gYSBwdHkgYWZ0ZXIgZWFjaCBzZXBhcmF0ZSBjaGFyYWN0ZXIuCisJCSAqLworCQltYXhfdGltZV9taWxsaXNlY29uZHMgPSAwOworCQlzdGRvdXRfYnVmZmVyX2J5dGVzID0gYnVmZmVyX2xlbigmc3Rkb3V0X2J1ZmZlcik7CisJCWlmIChzdGRvdXRfYnVmZmVyX2J5dGVzICE9IDAgJiYgc3Rkb3V0X2J1ZmZlcl9ieXRlcyA8IDI1NiAmJgorCQkgICAgc3Rkb3V0X2J1ZmZlcl9ieXRlcyAhPSBwcmV2aW91c19zdGRvdXRfYnVmZmVyX2J5dGVzKSB7CisJCQkvKiB0cnkgYWdhaW4gYWZ0ZXIgYSB3aGlsZSAqLworCQkJbWF4X3RpbWVfbWlsbGlzZWNvbmRzID0gMTA7CisJCX0gZWxzZSB7CisJCQkvKiBTZW5kIGl0IG5vdy4gKi8KKwkJCW1ha2VfcGFja2V0c19mcm9tX3N0ZG91dF9kYXRhKCk7CisJCX0KKwkJcHJldmlvdXNfc3Rkb3V0X2J1ZmZlcl9ieXRlcyA9IGJ1ZmZlcl9sZW4oJnN0ZG91dF9idWZmZXIpOworCisJCS8qIFNlbmQgY2hhbm5lbCBkYXRhIHRvIHRoZSBjbGllbnQuICovCisJCWlmIChwYWNrZXRfbm90X3ZlcnlfbXVjaF9kYXRhX3RvX3dyaXRlKCkpCisJCQljaGFubmVsX291dHB1dF9wb2xsKCk7CisKKwkJLyoKKwkJICogQmFpbCBvdXQgb2YgdGhlIGxvb3AgaWYgdGhlIHByb2dyYW0gaGFzIGNsb3NlZCBpdHMgb3V0cHV0CisJCSAqIGRlc2NyaXB0b3JzLCBhbmQgd2UgaGF2ZSBubyBtb3JlIGRhdGEgdG8gc2VuZCB0byB0aGUKKwkJICogY2xpZW50LCBhbmQgdGhlcmUgaXMgbm8gcGVuZGluZyBidWZmZXJlZCBkYXRhLgorCQkgKi8KKwkJaWYgKGZkb3V0X2VvZiAmJiBmZGVycl9lb2YgJiYgIXBhY2tldF9oYXZlX2RhdGFfdG9fd3JpdGUoKSAmJgorCQkgICAgYnVmZmVyX2xlbigmc3Rkb3V0X2J1ZmZlcikgPT0gMCAmJiBidWZmZXJfbGVuKCZzdGRlcnJfYnVmZmVyKSA9PSAwKSB7CisJCQlpZiAoIWNoYW5uZWxfc3RpbGxfb3BlbigpKQorCQkJCWJyZWFrOworCQkJaWYgKCF3YWl0aW5nX3Rlcm1pbmF0aW9uKSB7CisJCQkJY29uc3QgY2hhciAqcyA9ICJXYWl0aW5nIGZvciBmb3J3YXJkZWQgY29ubmVjdGlvbnMgdG8gdGVybWluYXRlLi4uXHJcbiI7CisJCQkJY2hhciAqY3A7CisJCQkJd2FpdGluZ190ZXJtaW5hdGlvbiA9IDE7CisJCQkJYnVmZmVyX2FwcGVuZCgmc3RkZXJyX2J1ZmZlciwgcywgc3RybGVuKHMpKTsKKworCQkJCS8qIERpc3BsYXkgbGlzdCBvZiBvcGVuIGNoYW5uZWxzLiAqLworCQkJCWNwID0gY2hhbm5lbF9vcGVuX21lc3NhZ2UoKTsKKwkJCQlidWZmZXJfYXBwZW5kKCZzdGRlcnJfYnVmZmVyLCBjcCwgc3RybGVuKGNwKSk7CisJCQkJeGZyZWUoY3ApOworCQkJfQorCQl9CisJCW1heF9mZCA9IE1BWChjb25uZWN0aW9uX2luLCBjb25uZWN0aW9uX291dCk7CisJCW1heF9mZCA9IE1BWChtYXhfZmQsIGZkaW4pOworCQltYXhfZmQgPSBNQVgobWF4X2ZkLCBmZG91dCk7CisJCW1heF9mZCA9IE1BWChtYXhfZmQsIGZkZXJyKTsKKwkJbWF4X2ZkID0gTUFYKG1heF9mZCwgbm90aWZ5X3BpcGVbMF0pOworCisJCS8qIFNsZWVwIGluIHNlbGVjdCgpIHVudGlsIHdlIGNhbiBkbyBzb21ldGhpbmcuICovCisJCXdhaXRfdW50aWxfY2FuX2RvX3NvbWV0aGluZygmcmVhZHNldCwgJndyaXRlc2V0LCAmbWF4X2ZkLAorCQkgICAgJm5hbGxvYywgbWF4X3RpbWVfbWlsbGlzZWNvbmRzKTsKKworCQlpZiAocmVjZWl2ZWRfc2lndGVybSkgeworCQkJbG9naXQoIkV4aXRpbmcgb24gc2lnbmFsICVkIiwgcmVjZWl2ZWRfc2lndGVybSk7CisJCQkvKiBDbGVhbiB1cCBzZXNzaW9ucywgdXRtcCwgZXRjLiAqLworCQkJY2xlYW51cF9leGl0KDI1NSk7CisJCX0KKworCQkvKiBQcm9jZXNzIGFueSBjaGFubmVsIGV2ZW50cy4gKi8KKwkJY2hhbm5lbF9hZnRlcl9zZWxlY3QocmVhZHNldCwgd3JpdGVzZXQpOworCisJCS8qIFByb2Nlc3MgaW5wdXQgZnJvbSB0aGUgY2xpZW50IGFuZCBmcm9tIHByb2dyYW0gc3Rkb3V0L3N0ZGVyci4gKi8KKwkJcHJvY2Vzc19pbnB1dChyZWFkc2V0KTsKKworCQkvKiBQcm9jZXNzIG91dHB1dCB0byB0aGUgY2xpZW50IGFuZCB0byBwcm9ncmFtIHN0ZGluLiAqLworCQlwcm9jZXNzX291dHB1dCh3cml0ZXNldCk7CisJfQorCWlmIChyZWFkc2V0KQorCQl4ZnJlZShyZWFkc2V0KTsKKwlpZiAod3JpdGVzZXQpCisJCXhmcmVlKHdyaXRlc2V0KTsKKworCS8qIENsZWFudXAgYW5kIHRlcm1pbmF0aW9uIGNvZGUuICovCisKKwkvKiBXYWl0IHVudGlsIGFsbCBvdXRwdXQgaGFzIGJlZW4gc2VudCB0byB0aGUgY2xpZW50LiAqLworCWRyYWluX291dHB1dCgpOworCisJZGVidWcoIkVuZCBvZiBpbnRlcmFjdGl2ZSBzZXNzaW9uOyBzdGRpbiAlbGQsIHN0ZG91dCAocmVhZCAlbGQsIHNlbnQgJWxkKSwgc3RkZXJyICVsZCBieXRlcy4iLAorCSAgICBzdGRpbl9ieXRlcywgZmRvdXRfYnl0ZXMsIHN0ZG91dF9ieXRlcywgc3RkZXJyX2J5dGVzKTsKKworCS8qIEZyZWUgYW5kIGNsZWFyIHRoZSBidWZmZXJzLiAqLworCWJ1ZmZlcl9mcmVlKCZzdGRpbl9idWZmZXIpOworCWJ1ZmZlcl9mcmVlKCZzdGRvdXRfYnVmZmVyKTsKKwlidWZmZXJfZnJlZSgmc3RkZXJyX2J1ZmZlcik7CisKKwkvKiBDbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9ycy4gKi8KKwlpZiAoZmRvdXQgIT0gLTEpCisJCWNsb3NlKGZkb3V0KTsKKwlmZG91dCA9IC0xOworCWZkb3V0X2VvZiA9IDE7CisJaWYgKGZkZXJyICE9IC0xKQorCQljbG9zZShmZGVycik7CisJZmRlcnIgPSAtMTsKKwlmZGVycl9lb2YgPSAxOworCWlmIChmZGluICE9IC0xKQorCQljbG9zZShmZGluKTsKKwlmZGluID0gLTE7CisKKwljaGFubmVsX2ZyZWVfYWxsKCk7CisKKwkvKiBXZSBubyBsb25nZXIgd2FudCBvdXIgU0lHQ0hMRCBoYW5kbGVyIHRvIGJlIGNhbGxlZC4gKi8KKwlteXNpZ25hbChTSUdDSExELCBTSUdfREZMKTsKKworCXdoaWxlICgod2FpdF9waWQgPSB3YWl0cGlkKC0xLCAmd2FpdF9zdGF0dXMsIDApKSA8IDApCisJCWlmIChlcnJubyAhPSBFSU5UUikKKwkJCXBhY2tldF9kaXNjb25uZWN0KCJ3YWl0OiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCWlmICh3YWl0X3BpZCAhPSBwaWQpCisJCWVycm9yKCJTdHJhbmdlLCB3YWl0IHJldHVybmVkIHBpZCAlbGQsIGV4cGVjdGVkICVsZCIsCisJCSAgICAobG9uZyl3YWl0X3BpZCwgKGxvbmcpcGlkKTsKKworCS8qIENoZWNrIGlmIGl0IGV4aXRlZCBub3JtYWxseS4gKi8KKwlpZiAoV0lGRVhJVEVEKHdhaXRfc3RhdHVzKSkgeworCQkvKiBZZXMsIG5vcm1hbCBleGl0LiAgR2V0IGV4aXQgc3RhdHVzIGFuZCBzZW5kIGl0IHRvIHRoZSBjbGllbnQuICovCisJCWRlYnVnKCJDb21tYW5kIGV4aXRlZCB3aXRoIHN0YXR1cyAlZC4iLCBXRVhJVFNUQVRVUyh3YWl0X3N0YXR1cykpOworCQlwYWNrZXRfc3RhcnQoU1NIX1NNU0dfRVhJVFNUQVRVUyk7CisJCXBhY2tldF9wdXRfaW50KFdFWElUU1RBVFVTKHdhaXRfc3RhdHVzKSk7CisJCXBhY2tldF9zZW5kKCk7CisJCXBhY2tldF93cml0ZV93YWl0KCk7CisKKwkJLyoKKwkJICogV2FpdCBmb3IgZXhpdCBjb25maXJtYXRpb24uICBOb3RlIHRoYXQgdGhlcmUgbWlnaHQgYmUKKwkJICogb3RoZXIgcGFja2V0cyBjb21pbmcgYmVmb3JlIGl0OyBob3dldmVyLCB0aGUgcHJvZ3JhbSBoYXMKKwkJICogYWxyZWFkeSBkaWVkIHNvIHdlIGp1c3QgaWdub3JlIHRoZW0uICBUaGUgY2xpZW50IGlzCisJCSAqIHN1cHBvc2VkIHRvIHJlc3BvbmQgd2l0aCB0aGUgY29uZmlybWF0aW9uIHdoZW4gaXQgcmVjZWl2ZXMKKwkJICogdGhlIGV4aXQgc3RhdHVzLgorCQkgKi8KKwkJZG8geworCQkJdHlwZSA9IHBhY2tldF9yZWFkKCk7CisJCX0KKwkJd2hpbGUgKHR5cGUgIT0gU1NIX0NNU0dfRVhJVF9DT05GSVJNQVRJT04pOworCisJCWRlYnVnKCJSZWNlaXZlZCBleGl0IGNvbmZpcm1hdGlvbi4iKTsKKwkJcmV0dXJuOworCX0KKwkvKiBDaGVjayBpZiB0aGUgcHJvZ3JhbSB0ZXJtaW5hdGVkIGR1ZSB0byBhIHNpZ25hbC4gKi8KKwlpZiAoV0lGU0lHTkFMRUQod2FpdF9zdGF0dXMpKQorCQlwYWNrZXRfZGlzY29ubmVjdCgiQ29tbWFuZCB0ZXJtaW5hdGVkIG9uIHNpZ25hbCAlZC4iLAorCQkJCSAgV1RFUk1TSUcod2FpdF9zdGF0dXMpKTsKKworCS8qIFNvbWUgd2VpcmQgZXhpdCBjYXVzZS4gIEp1c3QgZXhpdC4gKi8KKwlwYWNrZXRfZGlzY29ubmVjdCgid2FpdCByZXR1cm5lZCBzdGF0dXMgJTA0eC4iLCB3YWl0X3N0YXR1cyk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCitzdGF0aWMgdm9pZAorY29sbGVjdF9jaGlsZHJlbih2b2lkKQoreworCXBpZF90IHBpZDsKKwlzaWdzZXRfdCBvc2V0LCBuc2V0OworCWludCBzdGF0dXM7CisKKwkvKiBibG9jayBTSUdDSExEIHdoaWxlIHdlIGNoZWNrIGZvciBkZWFkIGNoaWxkcmVuICovCisJc2lnZW1wdHlzZXQoJm5zZXQpOworCXNpZ2FkZHNldCgmbnNldCwgU0lHQ0hMRCk7CisJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmbnNldCwgJm9zZXQpOworCWlmIChjaGlsZF90ZXJtaW5hdGVkKSB7CisJCWRlYnVnKCJSZWNlaXZlZCBTSUdDSExELiIpOworCQl3aGlsZSAoKHBpZCA9IHdhaXRwaWQoLTEsICZzdGF0dXMsIFdOT0hBTkcpKSA+IDAgfHwKKwkJICAgIChwaWQgPCAwICYmIGVycm5vID09IEVJTlRSKSkKKwkJCWlmIChwaWQgPiAwKQorCQkJCXNlc3Npb25fY2xvc2VfYnlfcGlkKHBpZCwgc3RhdHVzKTsKKwkJY2hpbGRfdGVybWluYXRlZCA9IDA7CisJfQorCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb3NldCwgTlVMTCk7Cit9CisKK3ZvaWQKK3NlcnZlcl9sb29wMihBdXRoY3R4dCAqYXV0aGN0eHQpCit7CisJZmRfc2V0ICpyZWFkc2V0ID0gTlVMTCwgKndyaXRlc2V0ID0gTlVMTDsKKwlpbnQgcmVrZXlpbmcgPSAwLCBtYXhfZmQsIG5hbGxvYyA9IDA7CisKKwlkZWJ1ZygiRW50ZXJpbmcgaW50ZXJhY3RpdmUgc2Vzc2lvbiBmb3IgU1NIMi4iKTsKKworCW15c2lnbmFsKFNJR0NITEQsIHNpZ2NobGRfaGFuZGxlcik7CisJY2hpbGRfdGVybWluYXRlZCA9IDA7CisJY29ubmVjdGlvbl9pbiA9IHBhY2tldF9nZXRfY29ubmVjdGlvbl9pbigpOworCWNvbm5lY3Rpb25fb3V0ID0gcGFja2V0X2dldF9jb25uZWN0aW9uX291dCgpOworCisJaWYgKCF1c2VfcHJpdnNlcCkgeworCQlzaWduYWwoU0lHVEVSTSwgc2lndGVybV9oYW5kbGVyKTsKKwkJc2lnbmFsKFNJR0lOVCwgc2lndGVybV9oYW5kbGVyKTsKKwkJc2lnbmFsKFNJR1FVSVQsIHNpZ3Rlcm1faGFuZGxlcik7CisJfQorCisJbm90aWZ5X3NldHVwKCk7CisKKwltYXhfZmQgPSBNQVgoY29ubmVjdGlvbl9pbiwgY29ubmVjdGlvbl9vdXQpOworCW1heF9mZCA9IE1BWChtYXhfZmQsIG5vdGlmeV9waXBlWzBdKTsKKworCXNlcnZlcl9pbml0X2Rpc3BhdGNoKCk7CisKKwlmb3IgKDs7KSB7CisJCXByb2Nlc3NfYnVmZmVyZWRfaW5wdXRfcGFja2V0cygpOworCisJCXJla2V5aW5nID0gKHh4eF9rZXggIT0gTlVMTCAmJiAheHh4X2tleC0+ZG9uZSk7CisKKwkJaWYgKCFyZWtleWluZyAmJiBwYWNrZXRfbm90X3ZlcnlfbXVjaF9kYXRhX3RvX3dyaXRlKCkpCisJCQljaGFubmVsX291dHB1dF9wb2xsKCk7CisJCXdhaXRfdW50aWxfY2FuX2RvX3NvbWV0aGluZygmcmVhZHNldCwgJndyaXRlc2V0LCAmbWF4X2ZkLAorCQkgICAgJm5hbGxvYywgMCk7CisKKwkJaWYgKHJlY2VpdmVkX3NpZ3Rlcm0pIHsKKwkJCWxvZ2l0KCJFeGl0aW5nIG9uIHNpZ25hbCAlZCIsIHJlY2VpdmVkX3NpZ3Rlcm0pOworCQkJLyogQ2xlYW4gdXAgc2Vzc2lvbnMsIHV0bXAsIGV0Yy4gKi8KKwkJCWNsZWFudXBfZXhpdCgyNTUpOworCQl9CisKKwkJY29sbGVjdF9jaGlsZHJlbigpOworCQlpZiAoIXJla2V5aW5nKSB7CisJCQljaGFubmVsX2FmdGVyX3NlbGVjdChyZWFkc2V0LCB3cml0ZXNldCk7CisJCQlpZiAocGFja2V0X25lZWRfcmVrZXlpbmcoKSkgeworCQkJCWRlYnVnKCJuZWVkIHJla2V5aW5nIik7CisJCQkJeHh4X2tleC0+ZG9uZSA9IDA7CisJCQkJa2V4X3NlbmRfa2V4aW5pdCh4eHhfa2V4KTsKKwkJCX0KKwkJfQorCQlwcm9jZXNzX2lucHV0KHJlYWRzZXQpOworCQlpZiAoY29ubmVjdGlvbl9jbG9zZWQpCisJCQlicmVhazsKKwkJcHJvY2Vzc19vdXRwdXQod3JpdGVzZXQpOworCX0KKwljb2xsZWN0X2NoaWxkcmVuKCk7CisKKwlpZiAocmVhZHNldCkKKwkJeGZyZWUocmVhZHNldCk7CisJaWYgKHdyaXRlc2V0KQorCQl4ZnJlZSh3cml0ZXNldCk7CisKKwkvKiBmcmVlIGFsbCBjaGFubmVscywgbm8gbW9yZSByZWFkcyBhbmQgd3JpdGVzICovCisJY2hhbm5lbF9mcmVlX2FsbCgpOworCisJLyogZnJlZSByZW1haW5pbmcgc2Vzc2lvbnMsIGUuZy4gcmVtb3ZlIHd0bXAgZW50cmllcyAqLworCXNlc3Npb25fZGVzdHJveV9hbGwoTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXJ2ZXJfaW5wdXRfa2VlcF9hbGl2ZShpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKK3sKKwlkZWJ1ZygiR290ICVkLyV1IGZvciBrZWVwYWxpdmUiLCB0eXBlLCBzZXEpOworCS8qCisJICogcmVzZXQgdGltZW91dCwgc2luY2Ugd2UgZ290IGEgc2FuZSBhbnN3ZXIgZnJvbSB0aGUgY2xpZW50LgorCSAqIGV2ZW4gaWYgdGhpcyB3YXMgZ2VuZXJhdGVkIGJ5IHNvbWV0aGluZyBvdGhlciB0aGFuCisJICogdGhlIGJvZ3VzIENIQU5ORUxfUkVRVUVTVCB3ZSBzZW5kIGZvciBrZWVwYWxpdmVzLgorCSAqLworCXBhY2tldF9zZXRfYWxpdmVfdGltZW91dHMoMCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXJ2ZXJfaW5wdXRfc3RkaW5fZGF0YShpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKK3sKKwljaGFyICpkYXRhOworCXVfaW50IGRhdGFfbGVuOworCisJLyogU3RkaW4gZGF0YSBmcm9tIHRoZSBjbGllbnQuICBBcHBlbmQgaXQgdG8gdGhlIGJ1ZmZlci4gKi8KKwkvKiBJZ25vcmUgYW55IGRhdGEgaWYgdGhlIGNsaWVudCBoYXMgY2xvc2VkIHN0ZGluLiAqLworCWlmIChmZGluID09IC0xKQorCQlyZXR1cm47CisJZGF0YSA9IHBhY2tldF9nZXRfc3RyaW5nKCZkYXRhX2xlbik7CisJcGFja2V0X2NoZWNrX2VvbSgpOworCWJ1ZmZlcl9hcHBlbmQoJnN0ZGluX2J1ZmZlciwgZGF0YSwgZGF0YV9sZW4pOworCW1lbXNldChkYXRhLCAwLCBkYXRhX2xlbik7CisJeGZyZWUoZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXJ2ZXJfaW5wdXRfZW9mKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQoreworCS8qCisJICogRW9mIGZyb20gdGhlIGNsaWVudC4gIFRoZSBzdGRpbiBkZXNjcmlwdG9yIHRvIHRoZQorCSAqIHByb2dyYW0gd2lsbCBiZSBjbG9zZWQgd2hlbiBhbGwgYnVmZmVyZWQgZGF0YSBoYXMKKwkgKiBkcmFpbmVkLgorCSAqLworCWRlYnVnKCJFT0YgcmVjZWl2ZWQgZm9yIHN0ZGluLiIpOworCXBhY2tldF9jaGVja19lb20oKTsKKwlzdGRpbl9lb2YgPSAxOworfQorCitzdGF0aWMgdm9pZAorc2VydmVyX2lucHV0X3dpbmRvd19zaXplKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQoreworCXVfaW50IHJvdyA9IHBhY2tldF9nZXRfaW50KCk7CisJdV9pbnQgY29sID0gcGFja2V0X2dldF9pbnQoKTsKKwl1X2ludCB4cGl4ZWwgPSBwYWNrZXRfZ2V0X2ludCgpOworCXVfaW50IHlwaXhlbCA9IHBhY2tldF9nZXRfaW50KCk7CisKKwlkZWJ1ZygiV2luZG93IGNoYW5nZSByZWNlaXZlZC4iKTsKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisJaWYgKGZkaW4gIT0gLTEpCisJCXB0eV9jaGFuZ2Vfd2luZG93X3NpemUoZmRpbiwgcm93LCBjb2wsIHhwaXhlbCwgeXBpeGVsKTsKK30KKworc3RhdGljIENoYW5uZWwgKgorc2VydmVyX3JlcXVlc3RfZGlyZWN0X3RjcGlwKHZvaWQpCit7CisJQ2hhbm5lbCAqYzsKKwljaGFyICp0YXJnZXQsICpvcmlnaW5hdG9yOworCXVfc2hvcnQgdGFyZ2V0X3BvcnQsIG9yaWdpbmF0b3JfcG9ydDsKKworCXRhcmdldCA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOworCXRhcmdldF9wb3J0ID0gcGFja2V0X2dldF9pbnQoKTsKKwlvcmlnaW5hdG9yID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7CisJb3JpZ2luYXRvcl9wb3J0ID0gcGFja2V0X2dldF9pbnQoKTsKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisKKwlkZWJ1Zygic2VydmVyX3JlcXVlc3RfZGlyZWN0X3RjcGlwOiBvcmlnaW5hdG9yICVzIHBvcnQgJWQsIHRhcmdldCAlcyAiCisJICAgICJwb3J0ICVkIiwgb3JpZ2luYXRvciwgb3JpZ2luYXRvcl9wb3J0LCB0YXJnZXQsIHRhcmdldF9wb3J0KTsKKworCS8qIFhYWCBjaGVjayBwZXJtaXNzaW9uICovCisJYyA9IGNoYW5uZWxfY29ubmVjdF90byh0YXJnZXQsIHRhcmdldF9wb3J0LAorCSAgICAiZGlyZWN0LXRjcGlwIiwgImRpcmVjdC10Y3BpcCIpOworCisJeGZyZWUob3JpZ2luYXRvcik7CisJeGZyZWUodGFyZ2V0KTsKKworCXJldHVybiBjOworfQorCitzdGF0aWMgQ2hhbm5lbCAqCitzZXJ2ZXJfcmVxdWVzdF90dW4odm9pZCkKK3sKKwlDaGFubmVsICpjID0gTlVMTDsKKwlpbnQgbW9kZSwgdHVuOworCWludCBzb2NrOworCisJbW9kZSA9IHBhY2tldF9nZXRfaW50KCk7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBTU0hfVFVOTU9ERV9QT0lOVE9QT0lOVDoKKwljYXNlIFNTSF9UVU5NT0RFX0VUSEVSTkVUOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwYWNrZXRfc2VuZF9kZWJ1ZygiVW5zdXBwb3J0ZWQgdHVubmVsIGRldmljZSBtb2RlLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKChvcHRpb25zLnBlcm1pdF90dW4gJiBtb2RlKSA9PSAwKSB7CisJCXBhY2tldF9zZW5kX2RlYnVnKCJTZXJ2ZXIgaGFzIHJlamVjdGVkIHR1bm5lbCBkZXZpY2UgIgorCQkgICAgImZvcndhcmRpbmciKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdHVuID0gcGFja2V0X2dldF9pbnQoKTsKKwlpZiAoZm9yY2VkX3R1bl9kZXZpY2UgIT0gLTEpIHsKKwkJaWYgKHR1biAhPSBTU0hfVFVOSURfQU5ZICYmIGZvcmNlZF90dW5fZGV2aWNlICE9IHR1bikKKwkJCWdvdG8gZG9uZTsKKwkJdHVuID0gZm9yY2VkX3R1bl9kZXZpY2U7CisJfQorCXNvY2sgPSB0dW5fb3Blbih0dW4sIG1vZGUpOworCWlmIChzb2NrIDwgMCkKKwkJZ290byBkb25lOworCWMgPSBjaGFubmVsX25ldygidHVuIiwgU1NIX0NIQU5ORUxfT1BFTiwgc29jaywgc29jaywgLTEsCisJICAgIENIQU5fVENQX1dJTkRPV19ERUZBVUxULCBDSEFOX1RDUF9QQUNLRVRfREVGQVVMVCwgMCwgInR1biIsIDEpOworCWMtPmRhdGFncmFtID0gMTsKKyNpZiBkZWZpbmVkKFNTSF9UVU5fRklMVEVSKQorCWlmIChtb2RlID09IFNTSF9UVU5NT0RFX1BPSU5UT1BPSU5UKQorCQljaGFubmVsX3JlZ2lzdGVyX2ZpbHRlcihjLT5zZWxmLCBzeXNfdHVuX2luZmlsdGVyLAorCQkgICAgc3lzX3R1bl9vdXRmaWx0ZXIsIE5VTEwsIE5VTEwpOworI2VuZGlmCisKKyBkb25lOgorCWlmIChjID09IE5VTEwpCisJCXBhY2tldF9zZW5kX2RlYnVnKCJGYWlsZWQgdG8gb3BlbiB0aGUgdHVubmVsIGRldmljZS4iKTsKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIENoYW5uZWwgKgorc2VydmVyX3JlcXVlc3Rfc2Vzc2lvbih2b2lkKQoreworCUNoYW5uZWwgKmM7CisKKwlkZWJ1ZygiaW5wdXRfc2Vzc2lvbl9yZXF1ZXN0Iik7CisJcGFja2V0X2NoZWNrX2VvbSgpOworCisJaWYgKG5vX21vcmVfc2Vzc2lvbnMpIHsKKwkJcGFja2V0X2Rpc2Nvbm5lY3QoIlBvc3NpYmxlIGF0dGFjazogYXR0ZW1wdCB0byBvcGVuIGEgc2Vzc2lvbiAiCisJCSAgICAiYWZ0ZXIgYWRkaXRpb25hbCBzZXNzaW9ucyBkaXNhYmxlZCIpOworCX0KKworCS8qCisJICogQSBzZXJ2ZXIgc2Vzc2lvbiBoYXMgbm8gZmQgdG8gcmVhZCBvciB3cml0ZSB1bnRpbCBhCisJICogQ0hBTk5FTF9SRVFVRVNUIGZvciBhIHNoZWxsIGlzIG1hZGUsIHNvIHdlIHNldCB0aGUgdHlwZSB0bworCSAqIFNTSF9DSEFOTkVMX0xBUlZBTC4gIEFkZGl0aW9uYWxseSwgYSBjYWxsYmFjayBmb3IgaGFuZGxpbmcgYWxsCisJICogQ0hBTk5FTF9SRVFVRVNUIG1lc3NhZ2VzIGlzIHJlZ2lzdGVyZWQuCisJICovCisJYyA9IGNoYW5uZWxfbmV3KCJzZXNzaW9uIiwgU1NIX0NIQU5ORUxfTEFSVkFMLAorCSAgICAtMSwgLTEsIC0xLCAvKndpbmRvdyBzaXplKi8wLCBDSEFOX1NFU19QQUNLRVRfREVGQVVMVCwKKwkgICAgMCwgInNlcnZlci1zZXNzaW9uIiwgMSk7CisJaWYgKHNlc3Npb25fb3Blbih0aGVfYXV0aGN0eHQsIGMtPnNlbGYpICE9IDEpIHsKKwkJZGVidWcoInNlc3Npb24gb3BlbiBmYWlsZWQsIGZyZWUgY2hhbm5lbCAlZCIsIGMtPnNlbGYpOworCQljaGFubmVsX2ZyZWUoYyk7CisJCXJldHVybiBOVUxMOworCX0KKwljaGFubmVsX3JlZ2lzdGVyX2NsZWFudXAoYy0+c2VsZiwgc2Vzc2lvbl9jbG9zZV9ieV9jaGFubmVsLCAwKTsKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIHZvaWQKK3NlcnZlcl9pbnB1dF9jaGFubmVsX29wZW4oaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCit7CisJQ2hhbm5lbCAqYyA9IE5VTEw7CisJY2hhciAqY3R5cGU7CisJaW50IHJjaGFuOworCXVfaW50IHJtYXhwYWNrLCByd2luZG93LCBsZW47CisKKwljdHlwZSA9IHBhY2tldF9nZXRfc3RyaW5nKCZsZW4pOworCXJjaGFuID0gcGFja2V0X2dldF9pbnQoKTsKKwlyd2luZG93ID0gcGFja2V0X2dldF9pbnQoKTsKKwlybWF4cGFjayA9IHBhY2tldF9nZXRfaW50KCk7CisKKwlkZWJ1Zygic2VydmVyX2lucHV0X2NoYW5uZWxfb3BlbjogY3R5cGUgJXMgcmNoYW4gJWQgd2luICVkIG1heCAlZCIsCisJICAgIGN0eXBlLCByY2hhbiwgcndpbmRvdywgcm1heHBhY2spOworCisJaWYgKHN0cmNtcChjdHlwZSwgInNlc3Npb24iKSA9PSAwKSB7CisJCWMgPSBzZXJ2ZXJfcmVxdWVzdF9zZXNzaW9uKCk7CisJfSBlbHNlIGlmIChzdHJjbXAoY3R5cGUsICJkaXJlY3QtdGNwaXAiKSA9PSAwKSB7CisJCWMgPSBzZXJ2ZXJfcmVxdWVzdF9kaXJlY3RfdGNwaXAoKTsKKwl9IGVsc2UgaWYgKHN0cmNtcChjdHlwZSwgInR1bkBvcGVuc3NoLmNvbSIpID09IDApIHsKKwkJYyA9IHNlcnZlcl9yZXF1ZXN0X3R1bigpOworCX0KKwlpZiAoYyAhPSBOVUxMKSB7CisJCWRlYnVnKCJzZXJ2ZXJfaW5wdXRfY2hhbm5lbF9vcGVuOiBjb25maXJtICVzIiwgY3R5cGUpOworCQljLT5yZW1vdGVfaWQgPSByY2hhbjsKKwkJYy0+cmVtb3RlX3dpbmRvdyA9IHJ3aW5kb3c7CisJCWMtPnJlbW90ZV9tYXhwYWNrZXQgPSBybWF4cGFjazsKKwkJaWYgKGMtPnR5cGUgIT0gU1NIX0NIQU5ORUxfQ09OTkVDVElORykgeworCQkJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0NIQU5ORUxfT1BFTl9DT05GSVJNQVRJT04pOworCQkJcGFja2V0X3B1dF9pbnQoYy0+cmVtb3RlX2lkKTsKKwkJCXBhY2tldF9wdXRfaW50KGMtPnNlbGYpOworCQkJcGFja2V0X3B1dF9pbnQoYy0+bG9jYWxfd2luZG93KTsKKwkJCXBhY2tldF9wdXRfaW50KGMtPmxvY2FsX21heHBhY2tldCk7CisJCQlwYWNrZXRfc2VuZCgpOworCQl9CisJfSBlbHNlIHsKKwkJZGVidWcoInNlcnZlcl9pbnB1dF9jaGFubmVsX29wZW46IGZhaWx1cmUgJXMiLCBjdHlwZSk7CisJCXBhY2tldF9zdGFydChTU0gyX01TR19DSEFOTkVMX09QRU5fRkFJTFVSRSk7CisJCXBhY2tldF9wdXRfaW50KHJjaGFuKTsKKwkJcGFja2V0X3B1dF9pbnQoU1NIMl9PUEVOX0FETUlOSVNUUkFUSVZFTFlfUFJPSElCSVRFRCk7CisJCWlmICghKGRhdGFmZWxsb3dzICYgU1NIX0JVR19PUEVORkFJTFVSRSkpIHsKKwkJCXBhY2tldF9wdXRfY3N0cmluZygib3BlbiBmYWlsZWQiKTsKKwkJCXBhY2tldF9wdXRfY3N0cmluZygiIik7CisJCX0KKwkJcGFja2V0X3NlbmQoKTsKKwl9CisJeGZyZWUoY3R5cGUpOworfQorCitzdGF0aWMgdm9pZAorc2VydmVyX2lucHV0X2dsb2JhbF9yZXF1ZXN0KGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQoreworCWNoYXIgKnJ0eXBlOworCWludCB3YW50X3JlcGx5OworCWludCBzdWNjZXNzID0gMCwgYWxsb2NhdGVkX2xpc3Rlbl9wb3J0ID0gMDsKKworCXJ0eXBlID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7CisJd2FudF9yZXBseSA9IHBhY2tldF9nZXRfY2hhcigpOworCWRlYnVnKCJzZXJ2ZXJfaW5wdXRfZ2xvYmFsX3JlcXVlc3Q6IHJ0eXBlICVzIHdhbnRfcmVwbHkgJWQiLCBydHlwZSwgd2FudF9yZXBseSk7CisKKwkvKiAtUiBzdHlsZSBmb3J3YXJkaW5nICovCisJaWYgKHN0cmNtcChydHlwZSwgInRjcGlwLWZvcndhcmQiKSA9PSAwKSB7CisJCXN0cnVjdCBwYXNzd2QgKnB3OworCQljaGFyICpsaXN0ZW5fYWRkcmVzczsKKwkJdV9zaG9ydCBsaXN0ZW5fcG9ydDsKKworCQlwdyA9IHRoZV9hdXRoY3R4dC0+cHc7CisJCWlmIChwdyA9PSBOVUxMIHx8ICF0aGVfYXV0aGN0eHQtPnZhbGlkKQorCQkJZmF0YWwoInNlcnZlcl9pbnB1dF9nbG9iYWxfcmVxdWVzdDogbm8vaW52YWxpZCB1c2VyIik7CisJCWxpc3Rlbl9hZGRyZXNzID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7CisJCWxpc3Rlbl9wb3J0ID0gKHVfc2hvcnQpcGFja2V0X2dldF9pbnQoKTsKKwkJZGVidWcoInNlcnZlcl9pbnB1dF9nbG9iYWxfcmVxdWVzdDogdGNwaXAtZm9yd2FyZCBsaXN0ZW4gJXMgcG9ydCAlZCIsCisJCSAgICBsaXN0ZW5fYWRkcmVzcywgbGlzdGVuX3BvcnQpOworCisJCS8qIGNoZWNrIHBlcm1pc3Npb25zICovCisJCWlmICghb3B0aW9ucy5hbGxvd190Y3BfZm9yd2FyZGluZyB8fAorCQkgICAgbm9fcG9ydF9mb3J3YXJkaW5nX2ZsYWcgfHwKKwkJICAgICghd2FudF9yZXBseSAmJiBsaXN0ZW5fcG9ydCA9PSAwKQorI2lmbmRlZiBOT19JUFBPUlRfUkVTRVJWRURfQ09OQ0VQVAorCQkgICAgfHwgKGxpc3Rlbl9wb3J0ICE9IDAgJiYgbGlzdGVuX3BvcnQgPCBJUFBPUlRfUkVTRVJWRUQgJiYKKyAgICAgICAgICAgICAgICAgICAgcHctPnB3X3VpZCAhPSAwKQorI2VuZGlmCisJCSAgICApIHsKKwkJCXN1Y2Nlc3MgPSAwOworCQkJcGFja2V0X3NlbmRfZGVidWcoIlNlcnZlciBoYXMgZGlzYWJsZWQgcG9ydCBmb3J3YXJkaW5nLiIpOworCQl9IGVsc2UgeworCQkJLyogU3RhcnQgbGlzdGVuaW5nIG9uIHRoZSBwb3J0ICovCisJCQlzdWNjZXNzID0gY2hhbm5lbF9zZXR1cF9yZW1vdGVfZndkX2xpc3RlbmVyKAorCQkJICAgIGxpc3Rlbl9hZGRyZXNzLCBsaXN0ZW5fcG9ydCwKKwkJCSAgICAmYWxsb2NhdGVkX2xpc3Rlbl9wb3J0LCBvcHRpb25zLmdhdGV3YXlfcG9ydHMpOworCQl9CisJCXhmcmVlKGxpc3Rlbl9hZGRyZXNzKTsKKwl9IGVsc2UgaWYgKHN0cmNtcChydHlwZSwgImNhbmNlbC10Y3BpcC1mb3J3YXJkIikgPT0gMCkgeworCQljaGFyICpjYW5jZWxfYWRkcmVzczsKKwkJdV9zaG9ydCBjYW5jZWxfcG9ydDsKKworCQljYW5jZWxfYWRkcmVzcyA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOworCQljYW5jZWxfcG9ydCA9ICh1X3Nob3J0KXBhY2tldF9nZXRfaW50KCk7CisJCWRlYnVnKCIlczogY2FuY2VsLXRjcGlwLWZvcndhcmQgYWRkciAlcyBwb3J0ICVkIiwgX19mdW5jX18sCisJCSAgICBjYW5jZWxfYWRkcmVzcywgY2FuY2VsX3BvcnQpOworCisJCXN1Y2Nlc3MgPSBjaGFubmVsX2NhbmNlbF9ycG9ydF9saXN0ZW5lcihjYW5jZWxfYWRkcmVzcywKKwkJICAgIGNhbmNlbF9wb3J0KTsKKwkJeGZyZWUoY2FuY2VsX2FkZHJlc3MpOworCX0gZWxzZSBpZiAoc3RyY21wKHJ0eXBlLCAibm8tbW9yZS1zZXNzaW9uc0BvcGVuc3NoLmNvbSIpID09IDApIHsKKwkJbm9fbW9yZV9zZXNzaW9ucyA9IDE7CisJCXN1Y2Nlc3MgPSAxOworCX0KKwlpZiAod2FudF9yZXBseSkgeworCQlwYWNrZXRfc3RhcnQoc3VjY2VzcyA/CisJCSAgICBTU0gyX01TR19SRVFVRVNUX1NVQ0NFU1MgOiBTU0gyX01TR19SRVFVRVNUX0ZBSUxVUkUpOworCQlpZiAoc3VjY2VzcyAmJiBhbGxvY2F0ZWRfbGlzdGVuX3BvcnQgPiAwKQorCQkJcGFja2V0X3B1dF9pbnQoYWxsb2NhdGVkX2xpc3Rlbl9wb3J0KTsKKwkJcGFja2V0X3NlbmQoKTsKKwkJcGFja2V0X3dyaXRlX3dhaXQoKTsKKwl9CisJeGZyZWUocnR5cGUpOworfQorCitzdGF0aWMgdm9pZAorc2VydmVyX2lucHV0X2NoYW5uZWxfcmVxKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQoreworCUNoYW5uZWwgKmM7CisJaW50IGlkLCByZXBseSwgc3VjY2VzcyA9IDA7CisJY2hhciAqcnR5cGU7CisKKwlpZCA9IHBhY2tldF9nZXRfaW50KCk7CisJcnR5cGUgPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKKwlyZXBseSA9IHBhY2tldF9nZXRfY2hhcigpOworCisJZGVidWcoInNlcnZlcl9pbnB1dF9jaGFubmVsX3JlcTogY2hhbm5lbCAlZCByZXF1ZXN0ICVzIHJlcGx5ICVkIiwKKwkgICAgaWQsIHJ0eXBlLCByZXBseSk7CisKKwlpZiAoKGMgPSBjaGFubmVsX2xvb2t1cChpZCkpID09IE5VTEwpCisJCXBhY2tldF9kaXNjb25uZWN0KCJzZXJ2ZXJfaW5wdXRfY2hhbm5lbF9yZXE6ICIKKwkJICAgICJ1bmtub3duIGNoYW5uZWwgJWQiLCBpZCk7CisJaWYgKCFzdHJjbXAocnR5cGUsICJlb3dAb3BlbnNzaC5jb20iKSkgeworCQlwYWNrZXRfY2hlY2tfZW9tKCk7CisJCWNoYW5fcmN2ZF9lb3coYyk7CisJfSBlbHNlIGlmICgoYy0+dHlwZSA9PSBTU0hfQ0hBTk5FTF9MQVJWQUwgfHwKKwkgICAgYy0+dHlwZSA9PSBTU0hfQ0hBTk5FTF9PUEVOKSAmJiBzdHJjbXAoYy0+Y3R5cGUsICJzZXNzaW9uIikgPT0gMCkKKwkJc3VjY2VzcyA9IHNlc3Npb25faW5wdXRfY2hhbm5lbF9yZXEoYywgcnR5cGUpOworCWlmIChyZXBseSkgeworCQlwYWNrZXRfc3RhcnQoc3VjY2VzcyA/CisJCSAgICBTU0gyX01TR19DSEFOTkVMX1NVQ0NFU1MgOiBTU0gyX01TR19DSEFOTkVMX0ZBSUxVUkUpOworCQlwYWNrZXRfcHV0X2ludChjLT5yZW1vdGVfaWQpOworCQlwYWNrZXRfc2VuZCgpOworCX0KKwl4ZnJlZShydHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXJ2ZXJfaW5pdF9kaXNwYXRjaF8yMCh2b2lkKQoreworCWRlYnVnKCJzZXJ2ZXJfaW5pdF9kaXNwYXRjaF8yMCIpOworCWRpc3BhdGNoX2luaXQoJmRpc3BhdGNoX3Byb3RvY29sX2Vycm9yKTsKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfQ0hBTk5FTF9DTE9TRSwgJmNoYW5uZWxfaW5wdXRfb2Nsb3NlKTsKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfQ0hBTk5FTF9EQVRBLCAmY2hhbm5lbF9pbnB1dF9kYXRhKTsKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfQ0hBTk5FTF9FT0YsICZjaGFubmVsX2lucHV0X2llb2YpOworCWRpc3BhdGNoX3NldChTU0gyX01TR19DSEFOTkVMX0VYVEVOREVEX0RBVEEsICZjaGFubmVsX2lucHV0X2V4dGVuZGVkX2RhdGEpOworCWRpc3BhdGNoX3NldChTU0gyX01TR19DSEFOTkVMX09QRU4sICZzZXJ2ZXJfaW5wdXRfY2hhbm5lbF9vcGVuKTsKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfQ0hBTk5FTF9PUEVOX0NPTkZJUk1BVElPTiwgJmNoYW5uZWxfaW5wdXRfb3Blbl9jb25maXJtYXRpb24pOworCWRpc3BhdGNoX3NldChTU0gyX01TR19DSEFOTkVMX09QRU5fRkFJTFVSRSwgJmNoYW5uZWxfaW5wdXRfb3Blbl9mYWlsdXJlKTsKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfQ0hBTk5FTF9SRVFVRVNULCAmc2VydmVyX2lucHV0X2NoYW5uZWxfcmVxKTsKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfQ0hBTk5FTF9XSU5ET1dfQURKVVNULCAmY2hhbm5lbF9pbnB1dF93aW5kb3dfYWRqdXN0KTsKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfR0xPQkFMX1JFUVVFU1QsICZzZXJ2ZXJfaW5wdXRfZ2xvYmFsX3JlcXVlc3QpOworCS8qIGNsaWVudF9hbGl2ZSAqLworCWRpc3BhdGNoX3NldChTU0gyX01TR19DSEFOTkVMX1NVQ0NFU1MsICZzZXJ2ZXJfaW5wdXRfa2VlcF9hbGl2ZSk7CisJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX0NIQU5ORUxfRkFJTFVSRSwgJnNlcnZlcl9pbnB1dF9rZWVwX2FsaXZlKTsKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfUkVRVUVTVF9TVUNDRVNTLCAmc2VydmVyX2lucHV0X2tlZXBfYWxpdmUpOworCWRpc3BhdGNoX3NldChTU0gyX01TR19SRVFVRVNUX0ZBSUxVUkUsICZzZXJ2ZXJfaW5wdXRfa2VlcF9hbGl2ZSk7CisJLyogcmVrZXlpbmcgKi8KKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfS0VYSU5JVCwgJmtleF9pbnB1dF9rZXhpbml0KTsKK30KK3N0YXRpYyB2b2lkCitzZXJ2ZXJfaW5pdF9kaXNwYXRjaF8xMyh2b2lkKQoreworCWRlYnVnKCJzZXJ2ZXJfaW5pdF9kaXNwYXRjaF8xMyIpOworCWRpc3BhdGNoX2luaXQoTlVMTCk7CisJZGlzcGF0Y2hfc2V0KFNTSF9DTVNHX0VPRiwgJnNlcnZlcl9pbnB1dF9lb2YpOworCWRpc3BhdGNoX3NldChTU0hfQ01TR19TVERJTl9EQVRBLCAmc2VydmVyX2lucHV0X3N0ZGluX2RhdGEpOworCWRpc3BhdGNoX3NldChTU0hfQ01TR19XSU5ET1dfU0laRSwgJnNlcnZlcl9pbnB1dF93aW5kb3dfc2l6ZSk7CisJZGlzcGF0Y2hfc2V0KFNTSF9NU0dfQ0hBTk5FTF9DTE9TRSwgJmNoYW5uZWxfaW5wdXRfY2xvc2UpOworCWRpc3BhdGNoX3NldChTU0hfTVNHX0NIQU5ORUxfQ0xPU0VfQ09ORklSTUFUSU9OLCAmY2hhbm5lbF9pbnB1dF9jbG9zZV9jb25maXJtYXRpb24pOworCWRpc3BhdGNoX3NldChTU0hfTVNHX0NIQU5ORUxfREFUQSwgJmNoYW5uZWxfaW5wdXRfZGF0YSk7CisJZGlzcGF0Y2hfc2V0KFNTSF9NU0dfQ0hBTk5FTF9PUEVOX0NPTkZJUk1BVElPTiwgJmNoYW5uZWxfaW5wdXRfb3Blbl9jb25maXJtYXRpb24pOworCWRpc3BhdGNoX3NldChTU0hfTVNHX0NIQU5ORUxfT1BFTl9GQUlMVVJFLCAmY2hhbm5lbF9pbnB1dF9vcGVuX2ZhaWx1cmUpOworCWRpc3BhdGNoX3NldChTU0hfTVNHX1BPUlRfT1BFTiwgJmNoYW5uZWxfaW5wdXRfcG9ydF9vcGVuKTsKK30KK3N0YXRpYyB2b2lkCitzZXJ2ZXJfaW5pdF9kaXNwYXRjaF8xNSh2b2lkKQoreworCXNlcnZlcl9pbml0X2Rpc3BhdGNoXzEzKCk7CisJZGVidWcoInNlcnZlcl9pbml0X2Rpc3BhdGNoXzE1Iik7CisJZGlzcGF0Y2hfc2V0KFNTSF9NU0dfQ0hBTk5FTF9DTE9TRSwgJmNoYW5uZWxfaW5wdXRfaWVvZik7CisJZGlzcGF0Y2hfc2V0KFNTSF9NU0dfQ0hBTk5FTF9DTE9TRV9DT05GSVJNQVRJT04sICZjaGFubmVsX2lucHV0X29jbG9zZSk7Cit9CitzdGF0aWMgdm9pZAorc2VydmVyX2luaXRfZGlzcGF0Y2godm9pZCkKK3sKKwlpZiAoY29tcGF0MjApCisJCXNlcnZlcl9pbml0X2Rpc3BhdGNoXzIwKCk7CisJZWxzZSBpZiAoY29tcGF0MTMpCisJCXNlcnZlcl9pbml0X2Rpc3BhdGNoXzEzKCk7CisJZWxzZQorCQlzZXJ2ZXJfaW5pdF9kaXNwYXRjaF8xNSgpOworfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zZXJ2ZXJsb29wLmggYi9vcGVuc3NoLTYuMHAxL3NlcnZlcmxvb3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzExNTU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zZXJ2ZXJsb29wLmgKQEAgLTAsMCArMSwyNyBAQAorLyogJE9wZW5CU0Q6IHNlcnZlcmxvb3AuaCx2IDEuNiAyMDA2LzAzLzI1IDIyOjIyOjQzIGRqbSBFeHAgJCAqLworCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKKyAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCisgKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCisgKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCisgKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCisgKi8KKy8qCisgKiBQZXJmb3JtcyB0aGUgaW50ZXJhY3RpdmUgc2Vzc2lvbi4gIFRoaXMgaGFuZGxlcyBkYXRhIHRyYW5zbWlzc2lvbiBiZXR3ZWVuCisgKiB0aGUgY2xpZW50IGFuZCB0aGUgcHJvZ3JhbS4gIE5vdGUgdGhhdCB0aGUgbm90aW9uIG9mIHN0ZGluLCBzdGRvdXQsIGFuZAorICogc3RkZXJyIGluIHRoaXMgZnVuY3Rpb24gaXMgc29ydCBvZiByZXZlcnNlZDogdGhpcyBmdW5jdGlvbiB3cml0ZXMgdG8gc3RkaW4KKyAqIChvZiB0aGUgY2hpbGQgcHJvZ3JhbSksIGFuZCByZWFkcyBmcm9tIHN0ZG91dCBhbmQgc3RkZXJyIChvZiB0aGUgY2hpbGQKKyAqIHByb2dyYW0pLgorICovCisjaWZuZGVmIFNFUlZFUkxPT1BfSAorI2RlZmluZSBTRVJWRVJMT09QX0gKKwordm9pZCAgICBzZXJ2ZXJfbG9vcChwaWRfdCwgaW50LCBpbnQsIGludCk7Cit2b2lkICAgIHNlcnZlcl9sb29wMihBdXRoY3R4dCAqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3Nlc3Npb24uYyBiL29wZW5zc2gtNi4wcDEvc2Vzc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYWQyNjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3Nlc3Npb24uYwpAQCAtMCwwICsxLDI3MzQgQEAKKy8qICRPcGVuQlNEOiBzZXNzaW9uLmMsdiAxLjI1OSAyMDExLzEwLzI0IDAyOjEzOjEzIGRqbSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKKyAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCisgKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCisgKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCisgKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCisgKgorICogU1NIMiBzdXBwb3J0IGJ5IE1hcmt1cyBGcmllZGwuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGdycC5oPgorI2lmZGVmIEhBVkVfUEFUSFNfSAorI2luY2x1ZGUgPHBhdGhzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvc3lzLXF1ZXVlLmgiCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgInNzaC5oIgorI2luY2x1ZGUgInNzaDEuaCIKKyNpbmNsdWRlICJzc2gyLmgiCisjaW5jbHVkZSAic3NocHR5LmgiCisjaW5jbHVkZSAicGFja2V0LmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAibWF0Y2guaCIKKyNpbmNsdWRlICJ1aWRzd2FwLmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisjaW5jbHVkZSAiY2hhbm5lbHMuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJjaXBoZXIuaCIKKyNpZmRlZiBHU1NBUEkKKyNpbmNsdWRlICJzc2gtZ3NzLmgiCisjZW5kaWYKKyNpbmNsdWRlICJob3N0ZmlsZS5oIgorI2luY2x1ZGUgImF1dGguaCIKKyNpbmNsdWRlICJhdXRoLW9wdGlvbnMuaCIKKyNpbmNsdWRlICJwYXRobmFtZXMuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJzZXJ2Y29uZi5oIgorI2luY2x1ZGUgInNzaGxvZ2luLmgiCisjaW5jbHVkZSAic2VydmVybG9vcC5oIgorI2luY2x1ZGUgImNhbm9ob3N0LmgiCisjaW5jbHVkZSAibWlzYy5oIgorI2luY2x1ZGUgInNlc3Npb24uaCIKKyNpbmNsdWRlICJrZXguaCIKKyNpbmNsdWRlICJtb25pdG9yX3dyYXAuaCIKKyNpbmNsdWRlICJzZnRwLmgiCisKKyNpZiBkZWZpbmVkKEtSQjUpICYmIGRlZmluZWQoVVNFX0FGUykKKyNpbmNsdWRlIDxrYWZzLmg+CisjZW5kaWYKKworI2lmZGVmIFdJVEhfU0VMSU5VWAorI2luY2x1ZGUgPHNlbGludXgvc2VsaW51eC5oPgorI2VuZGlmCisKKyNkZWZpbmUgSVNfSU5URVJOQUxfU0ZUUChjKSBcCisJKCFzdHJuY21wKGMsIElOVEVSTkFMX1NGVFBfTkFNRSwgc2l6ZW9mKElOVEVSTkFMX1NGVFBfTkFNRSkgLSAxKSAmJiBcCisJIChjW3NpemVvZihJTlRFUk5BTF9TRlRQX05BTUUpIC0gMV0gPT0gJ1wwJyB8fCBcCisJICBjW3NpemVvZihJTlRFUk5BTF9TRlRQX05BTUUpIC0gMV0gPT0gJyAnIHx8IFwKKwkgIGNbc2l6ZW9mKElOVEVSTkFMX1NGVFBfTkFNRSkgLSAxXSA9PSAnXHQnKSkKKworLyogZnVuYyAqLworCitTZXNzaW9uICpzZXNzaW9uX25ldyh2b2lkKTsKK3ZvaWQJc2Vzc2lvbl9zZXRfZmRzKFNlc3Npb24gKiwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpOwordm9pZAlzZXNzaW9uX3B0eV9jbGVhbnVwKFNlc3Npb24gKik7Cit2b2lkCXNlc3Npb25fcHJvY3RpdGxlKFNlc3Npb24gKik7CitpbnQJc2Vzc2lvbl9zZXR1cF94MTFmd2QoU2Vzc2lvbiAqKTsKK2ludAlkb19leGVjX3B0eShTZXNzaW9uICosIGNvbnN0IGNoYXIgKik7CitpbnQJZG9fZXhlY19ub19wdHkoU2Vzc2lvbiAqLCBjb25zdCBjaGFyICopOworaW50CWRvX2V4ZWMoU2Vzc2lvbiAqLCBjb25zdCBjaGFyICopOwordm9pZAlkb19sb2dpbihTZXNzaW9uICosIGNvbnN0IGNoYXIgKik7CisjaWZkZWYgTE9HSU5fTkVFRFNfVVRNUFgKK3N0YXRpYyB2b2lkCWRvX3ByZV9sb2dpbihTZXNzaW9uICpzKTsKKyNlbmRpZgordm9pZAlkb19jaGlsZChTZXNzaW9uICosIGNvbnN0IGNoYXIgKik7Cit2b2lkCWRvX21vdGQodm9pZCk7CitpbnQJY2hlY2tfcXVpZXRsb2dpbihTZXNzaW9uICosIGNvbnN0IGNoYXIgKik7CisKK3N0YXRpYyB2b2lkIGRvX2F1dGhlbnRpY2F0ZWQxKEF1dGhjdHh0ICopOworc3RhdGljIHZvaWQgZG9fYXV0aGVudGljYXRlZDIoQXV0aGN0eHQgKik7CisKK3N0YXRpYyBpbnQgc2Vzc2lvbl9wdHlfcmVxKFNlc3Npb24gKik7CisKKy8qIGltcG9ydCAqLworZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKK2V4dGVybiBjaGFyICpfX3Byb2duYW1lOworZXh0ZXJuIGludCBsb2dfc3RkZXJyOworZXh0ZXJuIGludCBkZWJ1Z19mbGFnOworZXh0ZXJuIHVfaW50IHV0bXBfbGVuOworZXh0ZXJuIGludCBzdGFydHVwX3BpcGU7CitleHRlcm4gdm9pZCBkZXN0cm95X3NlbnNpdGl2ZV9kYXRhKHZvaWQpOworZXh0ZXJuIEJ1ZmZlciBsb2dpbm1zZzsKKworLyogb3JpZ2luYWwgY29tbWFuZCBmcm9tIHBlZXIuICovCitjb25zdCBjaGFyICpvcmlnaW5hbF9jb21tYW5kID0gTlVMTDsKKworLyogZGF0YSAqLworc3RhdGljIGludCBzZXNzaW9uc19maXJzdF91bnVzZWQgPSAtMTsKK3N0YXRpYyBpbnQgc2Vzc2lvbnNfbmFsbG9jID0gMDsKK3N0YXRpYyBTZXNzaW9uICpzZXNzaW9ucyA9IE5VTEw7CisKKyNkZWZpbmUgU1VCU1lTVEVNX05PTkUJCQkwCisjZGVmaW5lIFNVQlNZU1RFTV9FWFQJCQkxCisjZGVmaW5lIFNVQlNZU1RFTV9JTlRfU0ZUUAkJMgorI2RlZmluZSBTVUJTWVNURU1fSU5UX1NGVFBfRVJST1IJMworCisjaWZkZWYgSEFWRV9MT0dJTl9DQVAKK2xvZ2luX2NhcF90ICpsYzsKKyNlbmRpZgorCitzdGF0aWMgaW50IGlzX2NoaWxkID0gMDsKKworLyogTmFtZSBhbmQgZGlyZWN0b3J5IG9mIHNvY2tldCBmb3IgYXV0aGVudGljYXRpb24gYWdlbnQgZm9yd2FyZGluZy4gKi8KK3N0YXRpYyBjaGFyICphdXRoX3NvY2tfbmFtZSA9IE5VTEw7CitzdGF0aWMgY2hhciAqYXV0aF9zb2NrX2RpciA9IE5VTEw7CisKKy8qIHJlbW92ZXMgdGhlIGFnZW50IGZvcndhcmRpbmcgc29ja2V0ICovCisKK3N0YXRpYyB2b2lkCithdXRoX3NvY2tfY2xlYW51cF9wcm9jKHN0cnVjdCBwYXNzd2QgKnB3KQoreworCWlmIChhdXRoX3NvY2tfbmFtZSAhPSBOVUxMKSB7CisJCXRlbXBvcmFyaWx5X3VzZV91aWQocHcpOworCQl1bmxpbmsoYXV0aF9zb2NrX25hbWUpOworCQlybWRpcihhdXRoX3NvY2tfZGlyKTsKKwkJYXV0aF9zb2NrX25hbWUgPSBOVUxMOworCQlyZXN0b3JlX3VpZCgpOworCX0KK30KKworc3RhdGljIGludAorYXV0aF9pbnB1dF9yZXF1ZXN0X2ZvcndhcmRpbmcoc3RydWN0IHBhc3N3ZCAqIHB3KQoreworCUNoYW5uZWwgKm5jOworCWludCBzb2NrID0gLTE7CisJc3RydWN0IHNvY2thZGRyX3VuIHN1bmFkZHI7CisKKwlpZiAoYXV0aF9zb2NrX25hbWUgIT0gTlVMTCkgeworCQllcnJvcigiYXV0aGVudGljYXRpb24gZm9yd2FyZGluZyByZXF1ZXN0ZWQgdHdpY2UuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIFRlbXBvcmFyaWx5IGRyb3AgcHJpdmlsZWdlZCB1aWQgZm9yIG1rZGlyL2JpbmQuICovCisJdGVtcG9yYXJpbHlfdXNlX3VpZChwdyk7CisKKwkvKiBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIHNvY2tldCBuYW1lLCBhbmQgZm9ybWF0IHRoZSBuYW1lLiAqLworCWF1dGhfc29ja19kaXIgPSB4c3RyZHVwKCIvdG1wL3NzaC1YWFhYWFhYWFhYIik7CisKKwkvKiBDcmVhdGUgcHJpdmF0ZSBkaXJlY3RvcnkgZm9yIHNvY2tldCAqLworCWlmIChta2R0ZW1wKGF1dGhfc29ja19kaXIpID09IE5VTEwpIHsKKwkJcGFja2V0X3NlbmRfZGVidWcoIkFnZW50IGZvcndhcmRpbmcgZGlzYWJsZWQ6ICIKKwkJICAgICJta2R0ZW1wKCkgZmFpbGVkOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCQlyZXN0b3JlX3VpZCgpOworCQl4ZnJlZShhdXRoX3NvY2tfZGlyKTsKKwkJYXV0aF9zb2NrX2RpciA9IE5VTEw7CisJCWdvdG8gYXV0aHNvY2tfZXJyOworCX0KKworCXhhc3ByaW50ZigmYXV0aF9zb2NrX25hbWUsICIlcy9hZ2VudC4lbGQiLAorCSAgICBhdXRoX3NvY2tfZGlyLCAobG9uZykgZ2V0cGlkKCkpOworCisJLyogQ3JlYXRlIHRoZSBzb2NrZXQuICovCisJc29jayA9IHNvY2tldChBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCk7CisJaWYgKHNvY2sgPCAwKSB7CisJCWVycm9yKCJzb2NrZXQ6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJlc3RvcmVfdWlkKCk7CisJCWdvdG8gYXV0aHNvY2tfZXJyOworCX0KKworCS8qIEJpbmQgaXQgdG8gdGhlIG5hbWUuICovCisJbWVtc2V0KCZzdW5hZGRyLCAwLCBzaXplb2Yoc3VuYWRkcikpOworCXN1bmFkZHIuc3VuX2ZhbWlseSA9IEFGX1VOSVg7CisJc3RybGNweShzdW5hZGRyLnN1bl9wYXRoLCBhdXRoX3NvY2tfbmFtZSwgc2l6ZW9mKHN1bmFkZHIuc3VuX3BhdGgpKTsKKworCWlmIChiaW5kKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmc3VuYWRkciwgc2l6ZW9mKHN1bmFkZHIpKSA8IDApIHsKKwkJZXJyb3IoImJpbmQ6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJlc3RvcmVfdWlkKCk7CisJCWdvdG8gYXV0aHNvY2tfZXJyOworCX0KKworCS8qIFJlc3RvcmUgdGhlIHByaXZpbGVnZWQgdWlkLiAqLworCXJlc3RvcmVfdWlkKCk7CisKKwkvKiBTdGFydCBsaXN0ZW5pbmcgb24gdGhlIHNvY2tldC4gKi8KKwlpZiAobGlzdGVuKHNvY2ssIFNTSF9MSVNURU5fQkFDS0xPRykgPCAwKSB7CisJCWVycm9yKCJsaXN0ZW46ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gYXV0aHNvY2tfZXJyOworCX0KKworCS8qIEFsbG9jYXRlIGEgY2hhbm5lbCBmb3IgdGhlIGF1dGhlbnRpY2F0aW9uIGFnZW50IHNvY2tldC4gKi8KKwluYyA9IGNoYW5uZWxfbmV3KCJhdXRoIHNvY2tldCIsCisJICAgIFNTSF9DSEFOTkVMX0FVVEhfU09DS0VULCBzb2NrLCBzb2NrLCAtMSwKKwkgICAgQ0hBTl9YMTFfV0lORE9XX0RFRkFVTFQsIENIQU5fWDExX1BBQ0tFVF9ERUZBVUxULAorCSAgICAwLCAiYXV0aCBzb2NrZXQiLCAxKTsKKwluYy0+cGF0aCA9IHhzdHJkdXAoYXV0aF9zb2NrX25hbWUpOworCXJldHVybiAxOworCisgYXV0aHNvY2tfZXJyOgorCWlmIChhdXRoX3NvY2tfbmFtZSAhPSBOVUxMKQorCQl4ZnJlZShhdXRoX3NvY2tfbmFtZSk7CisJaWYgKGF1dGhfc29ja19kaXIgIT0gTlVMTCkgeworCQlybWRpcihhdXRoX3NvY2tfZGlyKTsKKwkJeGZyZWUoYXV0aF9zb2NrX2Rpcik7CisJfQorCWlmIChzb2NrICE9IC0xKQorCQljbG9zZShzb2NrKTsKKwlhdXRoX3NvY2tfbmFtZSA9IE5VTEw7CisJYXV0aF9zb2NrX2RpciA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitkaXNwbGF5X2xvZ2lubXNnKHZvaWQpCit7CisJaWYgKGJ1ZmZlcl9sZW4oJmxvZ2lubXNnKSA+IDApIHsKKwkJYnVmZmVyX2FwcGVuZCgmbG9naW5tc2csICJcMCIsIDEpOworCQlwcmludGYoIiVzIiwgKGNoYXIgKilidWZmZXJfcHRyKCZsb2dpbm1zZykpOworCQlidWZmZXJfY2xlYXIoJmxvZ2lubXNnKTsKKwl9Cit9CisKK3ZvaWQKK2RvX2F1dGhlbnRpY2F0ZWQoQXV0aGN0eHQgKmF1dGhjdHh0KQoreworCXNldHByb2N0aXRsZSgiJXMiLCBhdXRoY3R4dC0+cHctPnB3X25hbWUpOworCisJLyogc2V0dXAgdGhlIGNoYW5uZWwgbGF5ZXIgKi8KKwlpZiAoIW5vX3BvcnRfZm9yd2FyZGluZ19mbGFnICYmIG9wdGlvbnMuYWxsb3dfdGNwX2ZvcndhcmRpbmcpCisJCWNoYW5uZWxfcGVybWl0X2FsbF9vcGVucygpOworCisJYXV0aF9kZWJ1Z19zZW5kKCk7CisKKwlpZiAoY29tcGF0MjApCisJCWRvX2F1dGhlbnRpY2F0ZWQyKGF1dGhjdHh0KTsKKwllbHNlCisJCWRvX2F1dGhlbnRpY2F0ZWQxKGF1dGhjdHh0KTsKKworCWRvX2NsZWFudXAoYXV0aGN0eHQpOworfQorCisvKgorICogUHJlcGFyZXMgZm9yIGFuIGludGVyYWN0aXZlIHNlc3Npb24uICBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgdXNlciBoYXMKKyAqIGJlZW4gc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQuICBEdXJpbmcgdGhpcyBtZXNzYWdlIGV4Y2hhbmdlLCBwc2V1ZG8KKyAqIHRlcm1pbmFscyBhcmUgYWxsb2NhdGVkLCBYMTEsIFRDUC9JUCwgYW5kIGF1dGhlbnRpY2F0aW9uIGFnZW50IGZvcndhcmRpbmdzCisgKiBhcmUgcmVxdWVzdGVkLCBldGMuCisgKi8KK3N0YXRpYyB2b2lkCitkb19hdXRoZW50aWNhdGVkMShBdXRoY3R4dCAqYXV0aGN0eHQpCit7CisJU2Vzc2lvbiAqczsKKwljaGFyICpjb21tYW5kOworCWludCBzdWNjZXNzLCB0eXBlLCBzY3JlZW5fZmxhZzsKKwlpbnQgZW5hYmxlX2NvbXByZXNzaW9uX2FmdGVyX3JlcGx5ID0gMDsKKwl1X2ludCBwcm90b19sZW4sIGRhdGFfbGVuLCBkbGVuLCBjb21wcmVzc2lvbl9sZXZlbCA9IDA7CisKKwlzID0gc2Vzc2lvbl9uZXcoKTsKKwlpZiAocyA9PSBOVUxMKSB7CisJCWVycm9yKCJubyBtb3JlIHNlc3Npb25zIik7CisJCXJldHVybjsKKwl9CisJcy0+YXV0aGN0eHQgPSBhdXRoY3R4dDsKKwlzLT5wdyA9IGF1dGhjdHh0LT5wdzsKKworCS8qCisJICogV2Ugc3RheSBpbiB0aGlzIGxvb3AgdW50aWwgdGhlIGNsaWVudCByZXF1ZXN0cyB0byBleGVjdXRlIGEgc2hlbGwKKwkgKiBvciBhIGNvbW1hbmQuCisJICovCisJZm9yICg7OykgeworCQlzdWNjZXNzID0gMDsKKworCQkvKiBHZXQgYSBwYWNrZXQgZnJvbSB0aGUgY2xpZW50LiAqLworCQl0eXBlID0gcGFja2V0X3JlYWQoKTsKKworCQkvKiBQcm9jZXNzIHRoZSBwYWNrZXQuICovCisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFNTSF9DTVNHX1JFUVVFU1RfQ09NUFJFU1NJT046CisJCQljb21wcmVzc2lvbl9sZXZlbCA9IHBhY2tldF9nZXRfaW50KCk7CisJCQlwYWNrZXRfY2hlY2tfZW9tKCk7CisJCQlpZiAoY29tcHJlc3Npb25fbGV2ZWwgPCAxIHx8IGNvbXByZXNzaW9uX2xldmVsID4gOSkgeworCQkJCXBhY2tldF9zZW5kX2RlYnVnKCJSZWNlaXZlZCBpbnZhbGlkIGNvbXByZXNzaW9uIGxldmVsICVkLiIsCisJCQkJICAgIGNvbXByZXNzaW9uX2xldmVsKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChvcHRpb25zLmNvbXByZXNzaW9uID09IENPTVBfTk9ORSkgeworCQkJCWRlYnVnMigiY29tcHJlc3Npb24gZGlzYWJsZWQiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIEVuYWJsZSBjb21wcmVzc2lvbiBhZnRlciB3ZSBoYXZlIHJlc3BvbmRlZCB3aXRoIFNVQ0NFU1MuICovCisJCQllbmFibGVfY29tcHJlc3Npb25fYWZ0ZXJfcmVwbHkgPSAxOworCQkJc3VjY2VzcyA9IDE7CisJCQlicmVhazsKKworCQljYXNlIFNTSF9DTVNHX1JFUVVFU1RfUFRZOgorCQkJc3VjY2VzcyA9IHNlc3Npb25fcHR5X3JlcShzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1NIX0NNU0dfWDExX1JFUVVFU1RfRk9SV0FSRElORzoKKwkJCXMtPmF1dGhfcHJvdG8gPSBwYWNrZXRfZ2V0X3N0cmluZygmcHJvdG9fbGVuKTsKKwkJCXMtPmF1dGhfZGF0YSA9IHBhY2tldF9nZXRfc3RyaW5nKCZkYXRhX2xlbik7CisKKwkJCXNjcmVlbl9mbGFnID0gcGFja2V0X2dldF9wcm90b2NvbF9mbGFncygpICYKKwkJCSAgICBTU0hfUFJPVE9GTEFHX1NDUkVFTl9OVU1CRVI7CisJCQlkZWJ1ZzIoIlNTSF9QUk9UT0ZMQUdfU0NSRUVOX05VTUJFUjogJWQiLCBzY3JlZW5fZmxhZyk7CisKKwkJCWlmIChwYWNrZXRfcmVtYWluaW5nKCkgPT0gNCkgeworCQkJCWlmICghc2NyZWVuX2ZsYWcpCisJCQkJCWRlYnVnMigiQnVnZ3kgY2xpZW50OiAiCisJCQkJCSAgICAiWDExIHNjcmVlbiBmbGFnIG1pc3NpbmciKTsKKwkJCQlzLT5zY3JlZW4gPSBwYWNrZXRfZ2V0X2ludCgpOworCQkJfSBlbHNlIHsKKwkJCQlzLT5zY3JlZW4gPSAwOworCQkJfQorCQkJcGFja2V0X2NoZWNrX2VvbSgpOworCQkJc3VjY2VzcyA9IHNlc3Npb25fc2V0dXBfeDExZndkKHMpOworCQkJaWYgKCFzdWNjZXNzKSB7CisJCQkJeGZyZWUocy0+YXV0aF9wcm90byk7CisJCQkJeGZyZWUocy0+YXV0aF9kYXRhKTsKKwkJCQlzLT5hdXRoX3Byb3RvID0gTlVMTDsKKwkJCQlzLT5hdXRoX2RhdGEgPSBOVUxMOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTU0hfQ01TR19BR0VOVF9SRVFVRVNUX0ZPUldBUkRJTkc6CisJCQlpZiAoIW9wdGlvbnMuYWxsb3dfYWdlbnRfZm9yd2FyZGluZyB8fAorCQkJICAgIG5vX2FnZW50X2ZvcndhcmRpbmdfZmxhZyB8fCBjb21wYXQxMykgeworCQkJCWRlYnVnKCJBdXRoZW50aWNhdGlvbiBhZ2VudCBmb3J3YXJkaW5nIG5vdCBwZXJtaXR0ZWQgZm9yIHRoaXMgYXV0aGVudGljYXRpb24uIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkZWJ1ZygiUmVjZWl2ZWQgYXV0aGVudGljYXRpb24gYWdlbnQgZm9yd2FyZGluZyByZXF1ZXN0LiIpOworCQkJc3VjY2VzcyA9IGF1dGhfaW5wdXRfcmVxdWVzdF9mb3J3YXJkaW5nKHMtPnB3KTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1NIX0NNU0dfUE9SVF9GT1JXQVJEX1JFUVVFU1Q6CisJCQlpZiAobm9fcG9ydF9mb3J3YXJkaW5nX2ZsYWcpIHsKKwkJCQlkZWJ1ZygiUG9ydCBmb3J3YXJkaW5nIG5vdCBwZXJtaXR0ZWQgZm9yIHRoaXMgYXV0aGVudGljYXRpb24uIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIW9wdGlvbnMuYWxsb3dfdGNwX2ZvcndhcmRpbmcpIHsKKwkJCQlkZWJ1ZygiUG9ydCBmb3J3YXJkaW5nIG5vdCBwZXJtaXR0ZWQuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkZWJ1ZygiUmVjZWl2ZWQgVENQL0lQIHBvcnQgZm9yd2FyZGluZyByZXF1ZXN0LiIpOworCQkJaWYgKGNoYW5uZWxfaW5wdXRfcG9ydF9mb3J3YXJkX3JlcXVlc3Qocy0+cHctPnB3X3VpZCA9PSAwLAorCQkJICAgIG9wdGlvbnMuZ2F0ZXdheV9wb3J0cykgPCAwKSB7CisJCQkJZGVidWcoIlBvcnQgZm9yd2FyZGluZyBmYWlsZWQuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzdWNjZXNzID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1NIX0NNU0dfTUFYX1BBQ0tFVF9TSVpFOgorCQkJaWYgKHBhY2tldF9zZXRfbWF4c2l6ZShwYWNrZXRfZ2V0X2ludCgpKSA+IDApCisJCQkJc3VjY2VzcyA9IDE7CisJCQlicmVhazsKKworCQljYXNlIFNTSF9DTVNHX0VYRUNfU0hFTEw6CisJCWNhc2UgU1NIX0NNU0dfRVhFQ19DTUQ6CisJCQlpZiAodHlwZSA9PSBTU0hfQ01TR19FWEVDX0NNRCkgeworCQkJCWNvbW1hbmQgPSBwYWNrZXRfZ2V0X3N0cmluZygmZGxlbik7CisJCQkJZGVidWcoIkV4ZWMgY29tbWFuZCAnJS41MDBzJyIsIGNvbW1hbmQpOworCQkJCWlmIChkb19leGVjKHMsIGNvbW1hbmQpICE9IDApCisJCQkJCXBhY2tldF9kaXNjb25uZWN0KAorCQkJCQkgICAgImNvbW1hbmQgZXhlY3V0aW9uIGZhaWxlZCIpOworCQkJCXhmcmVlKGNvbW1hbmQpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZG9fZXhlYyhzLCBOVUxMKSAhPSAwKQorCQkJCQlwYWNrZXRfZGlzY29ubmVjdCgKKwkJCQkJICAgICJzaGVsbCBleGVjdXRpb24gZmFpbGVkIik7CisJCQl9CisJCQlwYWNrZXRfY2hlY2tfZW9tKCk7CisJCQlzZXNzaW9uX2Nsb3NlKHMpOworCQkJcmV0dXJuOworCisJCWRlZmF1bHQ6CisJCQkvKgorCQkJICogQW55IHVua25vd24gbWVzc2FnZXMgaW4gdGhpcyBwaGFzZSBhcmUgaWdub3JlZCwKKwkJCSAqIGFuZCBhIGZhaWx1cmUgbWVzc2FnZSBpcyByZXR1cm5lZC4KKwkJCSAqLworCQkJbG9naXQoIlVua25vd24gcGFja2V0IHR5cGUgcmVjZWl2ZWQgYWZ0ZXIgYXV0aGVudGljYXRpb246ICVkIiwgdHlwZSk7CisJCX0KKwkJcGFja2V0X3N0YXJ0KHN1Y2Nlc3MgPyBTU0hfU01TR19TVUNDRVNTIDogU1NIX1NNU0dfRkFJTFVSRSk7CisJCXBhY2tldF9zZW5kKCk7CisJCXBhY2tldF93cml0ZV93YWl0KCk7CisKKwkJLyogRW5hYmxlIGNvbXByZXNzaW9uIG5vdyB0aGF0IHdlIGhhdmUgcmVwbGllZCBpZiBhcHByb3ByaWF0ZS4gKi8KKwkJaWYgKGVuYWJsZV9jb21wcmVzc2lvbl9hZnRlcl9yZXBseSkgeworCQkJZW5hYmxlX2NvbXByZXNzaW9uX2FmdGVyX3JlcGx5ID0gMDsKKwkJCXBhY2tldF9zdGFydF9jb21wcmVzc2lvbihjb21wcmVzc2lvbl9sZXZlbCk7CisJCX0KKwl9Cit9CisKKyNkZWZpbmUgVVNFX1BJUEVTCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gZm9yayBhbmQgZXhlY3V0ZSBhIGNvbW1hbmQgd2hlbiB3ZSBoYXZlIG5vIHR0eS4gIFRoaXMKKyAqIHdpbGwgY2FsbCBkb19jaGlsZCBmcm9tIHRoZSBjaGlsZCwgYW5kIHNlcnZlcl9sb29wIGZyb20gdGhlIHBhcmVudCBhZnRlcgorICogc2V0dGluZyB1cCBmaWxlIGRlc2NyaXB0b3JzIGFuZCBzdWNoLgorICovCitpbnQKK2RvX2V4ZWNfbm9fcHR5KFNlc3Npb24gKnMsIGNvbnN0IGNoYXIgKmNvbW1hbmQpCit7CisJcGlkX3QgcGlkOworCisjaWZkZWYgVVNFX1BJUEVTCisJaW50IHBpblsyXSwgcG91dFsyXSwgcGVyclsyXTsKKworCWlmIChzID09IE5VTEwpCisJCWZhdGFsKCJkb19leGVjX25vX3B0eTogbm8gc2Vzc2lvbiIpOworCisJLyogQWxsb2NhdGUgcGlwZXMgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgcHJvZ3JhbS4gKi8KKwlpZiAocGlwZShwaW4pIDwgMCkgeworCQllcnJvcigiJXM6IHBpcGUgaW46ICUuMTAwcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChwaXBlKHBvdXQpIDwgMCkgeworCQllcnJvcigiJXM6IHBpcGUgb3V0OiAlLjEwMHMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UocGluWzBdKTsKKwkJY2xvc2UocGluWzFdKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAocGlwZShwZXJyKSA8IDApIHsKKwkJZXJyb3IoIiVzOiBwaXBlIGVycjogJS4xMDBzIiwgX19mdW5jX18sCisJCSAgICBzdHJlcnJvcihlcnJubykpOworCQljbG9zZShwaW5bMF0pOworCQljbG9zZShwaW5bMV0pOworCQljbG9zZShwb3V0WzBdKTsKKwkJY2xvc2UocG91dFsxXSk7CisJCXJldHVybiAtMTsKKwl9CisjZWxzZQorCWludCBpbm91dFsyXSwgZXJyWzJdOworCisJaWYgKHMgPT0gTlVMTCkKKwkJZmF0YWwoImRvX2V4ZWNfbm9fcHR5OiBubyBzZXNzaW9uIik7CisKKwkvKiBVc2VzIHNvY2tldCBwYWlycyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBwcm9ncmFtLiAqLworCWlmIChzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBpbm91dCkgPCAwKSB7CisJCWVycm9yKCIlczogc29ja2V0cGFpciAjMTogJS4xMDBzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsIGVycikgPCAwKSB7CisJCWVycm9yKCIlczogc29ja2V0cGFpciAjMjogJS4xMDBzIiwgX19mdW5jX18sCisJCSAgICBzdHJlcnJvcihlcnJubykpOworCQljbG9zZShpbm91dFswXSk7CisJCWNsb3NlKGlub3V0WzFdKTsKKwkJcmV0dXJuIC0xOworCX0KKyNlbmRpZgorCisJc2Vzc2lvbl9wcm9jdGl0bGUocyk7CisKKwkvKiBGb3JrIHRoZSBjaGlsZC4gKi8KKwlzd2l0Y2ggKChwaWQgPSBmb3JrKCkpKSB7CisJY2FzZSAtMToKKwkJZXJyb3IoIiVzOiBmb3JrOiAlLjEwMHMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKyNpZmRlZiBVU0VfUElQRVMKKwkJY2xvc2UocGluWzBdKTsKKwkJY2xvc2UocGluWzFdKTsKKwkJY2xvc2UocG91dFswXSk7CisJCWNsb3NlKHBvdXRbMV0pOworCQljbG9zZShwZXJyWzBdKTsKKwkJY2xvc2UocGVyclsxXSk7CisjZWxzZQorCQljbG9zZShpbm91dFswXSk7CisJCWNsb3NlKGlub3V0WzFdKTsKKwkJY2xvc2UoZXJyWzBdKTsKKwkJY2xvc2UoZXJyWzFdKTsKKyNlbmRpZgorCQlyZXR1cm4gLTE7CisJY2FzZSAwOgorCQlpc19jaGlsZCA9IDE7CisKKwkJLyogQ2hpbGQuICBSZWluaXRpYWxpemUgdGhlIGxvZyBzaW5jZSB0aGUgcGlkIGhhcyBjaGFuZ2VkLiAqLworCQlsb2dfaW5pdChfX3Byb2duYW1lLCBvcHRpb25zLmxvZ19sZXZlbCwKKwkJICAgIG9wdGlvbnMubG9nX2ZhY2lsaXR5LCBsb2dfc3RkZXJyKTsKKworCQkvKgorCQkgKiBDcmVhdGUgYSBuZXcgc2Vzc2lvbiBhbmQgcHJvY2VzcyBncm91cCBzaW5jZSB0aGUgNC40QlNECisJCSAqIHNldGxvZ2luKCkgYWZmZWN0cyB0aGUgZW50aXJlIHByb2Nlc3MgZ3JvdXAuCisJCSAqLworCQlpZiAoc2V0c2lkKCkgPCAwKQorCQkJZXJyb3IoInNldHNpZCBmYWlsZWQ6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7CisKKyNpZmRlZiBVU0VfUElQRVMKKwkJLyoKKwkJICogUmVkaXJlY3Qgc3RkaW4uICBXZSBjbG9zZSB0aGUgcGFyZW50IHNpZGUgb2YgdGhlIHNvY2tldAorCQkgKiBwYWlyLCBhbmQgbWFrZSB0aGUgY2hpbGQgc2lkZSB0aGUgc3RhbmRhcmQgaW5wdXQuCisJCSAqLworCQljbG9zZShwaW5bMV0pOworCQlpZiAoZHVwMihwaW5bMF0sIDApIDwgMCkKKwkJCXBlcnJvcigiZHVwMiBzdGRpbiIpOworCQljbG9zZShwaW5bMF0pOworCisJCS8qIFJlZGlyZWN0IHN0ZG91dC4gKi8KKwkJY2xvc2UocG91dFswXSk7CisJCWlmIChkdXAyKHBvdXRbMV0sIDEpIDwgMCkKKwkJCXBlcnJvcigiZHVwMiBzdGRvdXQiKTsKKwkJY2xvc2UocG91dFsxXSk7CisKKwkJLyogUmVkaXJlY3Qgc3RkZXJyLiAqLworCQljbG9zZShwZXJyWzBdKTsKKwkJaWYgKGR1cDIocGVyclsxXSwgMikgPCAwKQorCQkJcGVycm9yKCJkdXAyIHN0ZGVyciIpOworCQljbG9zZShwZXJyWzFdKTsKKyNlbHNlCisJCS8qCisJCSAqIFJlZGlyZWN0IHN0ZGluLCBzdGRvdXQsIGFuZCBzdGRlcnIuICBTdGRpbiBhbmQgc3Rkb3V0IHdpbGwKKwkJICogdXNlIHRoZSBzYW1lIHNvY2tldCwgYXMgc29tZSBwcm9ncmFtcyAocGFydGljdWxhcmx5IHJkaXN0KQorCQkgKiBzZWVtIHRvIGRlcGVuZCBvbiBpdC4KKwkJICovCisJCWNsb3NlKGlub3V0WzFdKTsKKwkJY2xvc2UoZXJyWzFdKTsKKwkJaWYgKGR1cDIoaW5vdXRbMF0sIDApIDwgMCkJLyogc3RkaW4gKi8KKwkJCXBlcnJvcigiZHVwMiBzdGRpbiIpOworCQlpZiAoZHVwMihpbm91dFswXSwgMSkgPCAwKQkvKiBzdGRvdXQgKHNhbWUgYXMgc3RkaW4pICovCisJCQlwZXJyb3IoImR1cDIgc3Rkb3V0Iik7CisJCWNsb3NlKGlub3V0WzBdKTsKKwkJaWYgKGR1cDIoZXJyWzBdLCAyKSA8IDApCS8qIHN0ZGVyciAqLworCQkJcGVycm9yKCJkdXAyIHN0ZGVyciIpOworCQljbG9zZShlcnJbMF0pOworI2VuZGlmCisKKworI2lmZGVmIF9VTklDT1MKKwkJY3JheV9pbml0X2pvYihzLT5wdyk7IC8qIHNldCB1cCBjcmF5IGppZCBhbmQgdG1wZGlyICovCisjZW5kaWYKKworCQkvKiBEbyBwcm9jZXNzaW5nIGZvciB0aGUgY2hpbGQgKGV4ZWMgY29tbWFuZCBldGMpLiAqLworCQlkb19jaGlsZChzLCBjb21tYW5kKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworI2lmZGVmIF9VTklDT1MKKwlzaWduYWwoV0pTSUdOQUwsIGNyYXlfam9iX3Rlcm1pbmF0aW9uX2hhbmRsZXIpOworI2VuZGlmIC8qIF9VTklDT1MgKi8KKyNpZmRlZiBIQVZFX0NZR1dJTgorCWN5Z3dpbl9zZXRfaW1wZXJzb25hdGlvbl90b2tlbihJTlZBTElEX0hBTkRMRV9WQUxVRSk7CisjZW5kaWYKKworCXMtPnBpZCA9IHBpZDsKKwkvKiBTZXQgaW50ZXJhY3RpdmUvbm9uLWludGVyYWN0aXZlIG1vZGUuICovCisJcGFja2V0X3NldF9pbnRlcmFjdGl2ZShzLT5kaXNwbGF5ICE9IE5VTEwsCisJICAgIG9wdGlvbnMuaXBfcW9zX2ludGVyYWN0aXZlLCBvcHRpb25zLmlwX3Fvc19idWxrKTsKKworCS8qCisJICogQ2xlYXIgbG9naW5tc2csIHNpbmNlIGl0J3MgdGhlIGNoaWxkJ3MgcmVzcG9uc2liaWxpdHkgdG8gZGlzcGxheQorCSAqIGl0IHRvIHRoZSB1c2VyLCBvdGhlcndpc2UgbXVsdGlwbGUgc2Vzc2lvbnMgbWF5IGFjY3VtdWxhdGUKKwkgKiBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIGxvZ2luIG1lc3NhZ2VzLgorCSAqLworCWJ1ZmZlcl9jbGVhcigmbG9naW5tc2cpOworCisjaWZkZWYgVVNFX1BJUEVTCisJLyogV2UgYXJlIHRoZSBwYXJlbnQuICBDbG9zZSB0aGUgY2hpbGQgc2lkZXMgb2YgdGhlIHBpcGVzLiAqLworCWNsb3NlKHBpblswXSk7CisJY2xvc2UocG91dFsxXSk7CisJY2xvc2UocGVyclsxXSk7CisKKwlpZiAoY29tcGF0MjApIHsKKwkJc2Vzc2lvbl9zZXRfZmRzKHMsIHBpblsxXSwgcG91dFswXSwgcGVyclswXSwKKwkJICAgIHMtPmlzX3N1YnN5c3RlbSwgMCk7CisJfSBlbHNlIHsKKwkJLyogRW50ZXIgdGhlIGludGVyYWN0aXZlIHNlc3Npb24uICovCisJCXNlcnZlcl9sb29wKHBpZCwgcGluWzFdLCBwb3V0WzBdLCBwZXJyWzBdKTsKKwkJLyogc2VydmVyX2xvb3AgaGFzIGNsb3NlZCBwaW5bMV0sIHBvdXRbMF0sIGFuZCBwZXJyWzBdLiAqLworCX0KKyNlbHNlCisJLyogV2UgYXJlIHRoZSBwYXJlbnQuICBDbG9zZSB0aGUgY2hpbGQgc2lkZXMgb2YgdGhlIHNvY2tldCBwYWlycy4gKi8KKwljbG9zZShpbm91dFswXSk7CisJY2xvc2UoZXJyWzBdKTsKKworCS8qCisJICogRW50ZXIgdGhlIGludGVyYWN0aXZlIHNlc3Npb24uICBOb3RlOiBzZXJ2ZXJfbG9vcCBtdXN0IGJlIGFibGUgdG8KKwkgKiBoYW5kbGUgdGhlIGNhc2UgdGhhdCBmZGluIGFuZCBmZG91dCBhcmUgdGhlIHNhbWUuCisJICovCisJaWYgKGNvbXBhdDIwKSB7CisJCXNlc3Npb25fc2V0X2ZkcyhzLCBpbm91dFsxXSwgaW5vdXRbMV0sIGVyclsxXSwKKwkJICAgIHMtPmlzX3N1YnN5c3RlbSwgMCk7CisJfSBlbHNlIHsKKwkJc2VydmVyX2xvb3AocGlkLCBpbm91dFsxXSwgaW5vdXRbMV0sIGVyclsxXSk7CisJCS8qIHNlcnZlcl9sb29wIGhhcyBjbG9zZWQgaW5vdXRbMV0gYW5kIGVyclsxXS4gKi8KKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIGZvcmsgYW5kIGV4ZWN1dGUgYSBjb21tYW5kIHdoZW4gd2UgaGF2ZSBhIHR0eS4gIFRoaXMKKyAqIHdpbGwgY2FsbCBkb19jaGlsZCBmcm9tIHRoZSBjaGlsZCwgYW5kIHNlcnZlcl9sb29wIGZyb20gdGhlIHBhcmVudCBhZnRlcgorICogc2V0dGluZyB1cCBmaWxlIGRlc2NyaXB0b3JzLCBjb250cm9sbGluZyB0dHksIHVwZGF0aW5nIHd0bXAsIHV0bXAsCisgKiBsYXN0bG9nLCBhbmQgb3RoZXIgc3VjaCBvcGVyYXRpb25zLgorICovCitpbnQKK2RvX2V4ZWNfcHR5KFNlc3Npb24gKnMsIGNvbnN0IGNoYXIgKmNvbW1hbmQpCit7CisJaW50IGZkb3V0LCBwdHlmZCwgdHR5ZmQsIHB0eW1hc3RlcjsKKwlwaWRfdCBwaWQ7CisKKwlpZiAocyA9PSBOVUxMKQorCQlmYXRhbCgiZG9fZXhlY19wdHk6IG5vIHNlc3Npb24iKTsKKwlwdHlmZCA9IHMtPnB0eWZkOworCXR0eWZkID0gcy0+dHR5ZmQ7CisKKwkvKgorCSAqIENyZWF0ZSBhbm90aGVyIGRlc2NyaXB0b3Igb2YgdGhlIHB0eSBtYXN0ZXIgc2lkZSBmb3IgdXNlIGFzIHRoZQorCSAqIHN0YW5kYXJkIGlucHV0LiAgV2UgY291bGQgdXNlIHRoZSBvcmlnaW5hbCBkZXNjcmlwdG9yLCBidXQgdGhpcworCSAqIHNpbXBsaWZpZXMgY29kZSBpbiBzZXJ2ZXJfbG9vcC4gIFRoZSBkZXNjcmlwdG9yIGlzIGJpZGlyZWN0aW9uYWwuCisJICogRG8gdGhpcyBiZWZvcmUgZm9ya2luZyAoYW5kIGNsZWFudXAgaW4gdGhlIGNoaWxkKSBzbyBhcyB0bworCSAqIGRldGVjdCBhbmQgZ3JhY2VmdWxseSBmYWlsIG91dC1vZi1mZCBjb25kaXRpb25zLgorCSAqLworCWlmICgoZmRvdXQgPSBkdXAocHR5ZmQpKSA8IDApIHsKKwkJZXJyb3IoIiVzOiBkdXAgIzE6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKHR0eWZkKTsKKwkJY2xvc2UocHR5ZmQpOworCQlyZXR1cm4gLTE7CisJfQorCS8qIHdlIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIHB0eSBtYXN0ZXIgKi8KKwlpZiAoKHB0eW1hc3RlciA9IGR1cChwdHlmZCkpIDwgMCkgeworCQllcnJvcigiJXM6IGR1cCAjMjogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UodHR5ZmQpOworCQljbG9zZShwdHlmZCk7CisJCWNsb3NlKGZkb3V0KTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIEZvcmsgdGhlIGNoaWxkLiAqLworCXN3aXRjaCAoKHBpZCA9IGZvcmsoKSkpIHsKKwljYXNlIC0xOgorCQllcnJvcigiJXM6IGZvcms6ICUuMTAwcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCQljbG9zZShmZG91dCk7CisJCWNsb3NlKHB0eW1hc3Rlcik7CisJCWNsb3NlKHR0eWZkKTsKKwkJY2xvc2UocHR5ZmQpOworCQlyZXR1cm4gLTE7CisJY2FzZSAwOgorCQlpc19jaGlsZCA9IDE7CisKKwkJY2xvc2UoZmRvdXQpOworCQljbG9zZShwdHltYXN0ZXIpOworCisJCS8qIENoaWxkLiAgUmVpbml0aWFsaXplIHRoZSBsb2cgYmVjYXVzZSB0aGUgcGlkIGhhcyBjaGFuZ2VkLiAqLworCQlsb2dfaW5pdChfX3Byb2duYW1lLCBvcHRpb25zLmxvZ19sZXZlbCwKKwkJICAgIG9wdGlvbnMubG9nX2ZhY2lsaXR5LCBsb2dfc3RkZXJyKTsKKwkJLyogQ2xvc2UgdGhlIG1hc3RlciBzaWRlIG9mIHRoZSBwc2V1ZG8gdHR5LiAqLworCQljbG9zZShwdHlmZCk7CisKKwkJLyogTWFrZSB0aGUgcHNldWRvIHR0eSBvdXIgY29udHJvbGxpbmcgdHR5LiAqLworCQlwdHlfbWFrZV9jb250cm9sbGluZ190dHkoJnR0eWZkLCBzLT50dHkpOworCisJCS8qIFJlZGlyZWN0IHN0ZGluL3N0ZG91dC9zdGRlcnIgZnJvbSB0aGUgcHNldWRvIHR0eS4gKi8KKwkJaWYgKGR1cDIodHR5ZmQsIDApIDwgMCkKKwkJCWVycm9yKCJkdXAyIHN0ZGluOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWlmIChkdXAyKHR0eWZkLCAxKSA8IDApCisJCQllcnJvcigiZHVwMiBzdGRvdXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJaWYgKGR1cDIodHR5ZmQsIDIpIDwgMCkKKwkJCWVycm9yKCJkdXAyIHN0ZGVycjogJXMiLCBzdHJlcnJvcihlcnJubykpOworCisJCS8qIENsb3NlIHRoZSBleHRyYSBkZXNjcmlwdG9yIGZvciB0aGUgcHNldWRvIHR0eS4gKi8KKwkJY2xvc2UodHR5ZmQpOworCisJCS8qIHJlY29yZCBsb2dpbiwgZXRjLiBzaW1pbGFyIHRvIGxvZ2luKDEpICovCisjaWZuZGVmIEhBVkVfT1NGX1NJQQorCQlpZiAoIShvcHRpb25zLnVzZV9sb2dpbiAmJiBjb21tYW5kID09IE5VTEwpKSB7CisjaWZkZWYgX1VOSUNPUworCQkJY3JheV9pbml0X2pvYihzLT5wdyk7IC8qIHNldCB1cCBjcmF5IGppZCBhbmQgdG1wZGlyICovCisjZW5kaWYgLyogX1VOSUNPUyAqLworCQkJZG9fbG9naW4ocywgY29tbWFuZCk7CisJCX0KKyMgaWZkZWYgTE9HSU5fTkVFRFNfVVRNUFgKKwkJZWxzZQorCQkJZG9fcHJlX2xvZ2luKHMpOworIyBlbmRpZgorI2VuZGlmCisJCS8qCisJCSAqIERvIGNvbW1vbiBwcm9jZXNzaW5nIGZvciB0aGUgY2hpbGQsIHN1Y2ggYXMgZXhlY2luZworCQkgKiB0aGUgY29tbWFuZC4KKwkJICovCisJCWRvX2NoaWxkKHMsIGNvbW1hbmQpOworCQkvKiBOT1RSRUFDSEVEICovCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisjaWZkZWYgX1VOSUNPUworCXNpZ25hbChXSlNJR05BTCwgY3JheV9qb2JfdGVybWluYXRpb25faGFuZGxlcik7CisjZW5kaWYgLyogX1VOSUNPUyAqLworI2lmZGVmIEhBVkVfQ1lHV0lOCisJY3lnd2luX3NldF9pbXBlcnNvbmF0aW9uX3Rva2VuKElOVkFMSURfSEFORExFX1ZBTFVFKTsKKyNlbmRpZgorCisJcy0+cGlkID0gcGlkOworCisJLyogUGFyZW50LiAgQ2xvc2UgdGhlIHNsYXZlIHNpZGUgb2YgdGhlIHBzZXVkbyB0dHkuICovCisJY2xvc2UodHR5ZmQpOworCisJLyogRW50ZXIgaW50ZXJhY3RpdmUgc2Vzc2lvbi4gKi8KKwlzLT5wdHltYXN0ZXIgPSBwdHltYXN0ZXI7CisJcGFja2V0X3NldF9pbnRlcmFjdGl2ZSgxLCAKKwkgICAgb3B0aW9ucy5pcF9xb3NfaW50ZXJhY3RpdmUsIG9wdGlvbnMuaXBfcW9zX2J1bGspOworCWlmIChjb21wYXQyMCkgeworCQlzZXNzaW9uX3NldF9mZHMocywgcHR5ZmQsIGZkb3V0LCAtMSwgMSwgMSk7CisJfSBlbHNlIHsKKwkJc2VydmVyX2xvb3AocGlkLCBwdHlmZCwgZmRvdXQsIC0xKTsKKwkJLyogc2VydmVyX2xvb3AgX2hhc18gY2xvc2VkIHB0eWZkIGFuZCBmZG91dC4gKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBMT0dJTl9ORUVEU19VVE1QWAorc3RhdGljIHZvaWQKK2RvX3ByZV9sb2dpbihTZXNzaW9uICpzKQoreworCXNvY2tsZW5fdCBmcm9tbGVuOworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGZyb207CisJcGlkX3QgcGlkID0gZ2V0cGlkKCk7CisKKwkvKgorCSAqIEdldCBJUCBhZGRyZXNzIG9mIGNsaWVudC4gSWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGEgc29ja2V0LCBsZXQKKwkgKiB0aGUgYWRkcmVzcyBiZSAwLjAuMC4wLgorCSAqLworCW1lbXNldCgmZnJvbSwgMCwgc2l6ZW9mKGZyb20pKTsKKwlmcm9tbGVuID0gc2l6ZW9mKGZyb20pOworCWlmIChwYWNrZXRfY29ubmVjdGlvbl9pc19vbl9zb2NrZXQoKSkgeworCQlpZiAoZ2V0cGVlcm5hbWUocGFja2V0X2dldF9jb25uZWN0aW9uX2luKCksCisJCSAgICAoc3RydWN0IHNvY2thZGRyICopJmZyb20sICZmcm9tbGVuKSA8IDApIHsKKwkJCWRlYnVnKCJnZXRwZWVybmFtZTogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWNsZWFudXBfZXhpdCgyNTUpOworCQl9CisJfQorCisJcmVjb3JkX3V0bXBfb25seShwaWQsIHMtPnR0eSwgcy0+cHctPnB3X25hbWUsCisJICAgIGdldF9yZW1vdGVfbmFtZV9vcl9pcCh1dG1wX2xlbiwgb3B0aW9ucy51c2VfZG5zKSwKKwkgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZmcm9tLCBmcm9tbGVuKTsKK30KKyNlbmRpZgorCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gZm9yayBhbmQgZXhlY3V0ZSBhIGNvbW1hbmQuICBJZiBhbm90aGVyIGNvbW1hbmQgaXMKKyAqIHRvIGJlIGZvcmNlZCwgZXhlY3V0ZSB0aGF0IGluc3RlYWQuCisgKi8KK2ludAorZG9fZXhlYyhTZXNzaW9uICpzLCBjb25zdCBjaGFyICpjb21tYW5kKQoreworCWludCByZXQ7CisKKwlpZiAob3B0aW9ucy5hZG1fZm9yY2VkX2NvbW1hbmQpIHsKKwkJb3JpZ2luYWxfY29tbWFuZCA9IGNvbW1hbmQ7CisJCWNvbW1hbmQgPSBvcHRpb25zLmFkbV9mb3JjZWRfY29tbWFuZDsKKwkJaWYgKElTX0lOVEVSTkFMX1NGVFAoY29tbWFuZCkpIHsKKwkJCXMtPmlzX3N1YnN5c3RlbSA9IHMtPmlzX3N1YnN5c3RlbSA/CisJCQkgICAgU1VCU1lTVEVNX0lOVF9TRlRQIDogU1VCU1lTVEVNX0lOVF9TRlRQX0VSUk9SOworCQl9IGVsc2UgaWYgKHMtPmlzX3N1YnN5c3RlbSkKKwkJCXMtPmlzX3N1YnN5c3RlbSA9IFNVQlNZU1RFTV9FWFQ7CisJCWRlYnVnKCJGb3JjZWQgY29tbWFuZCAoY29uZmlnKSAnJS45MDBzJyIsIGNvbW1hbmQpOworCX0gZWxzZSBpZiAoZm9yY2VkX2NvbW1hbmQpIHsKKwkJb3JpZ2luYWxfY29tbWFuZCA9IGNvbW1hbmQ7CisJCWNvbW1hbmQgPSBmb3JjZWRfY29tbWFuZDsKKwkJaWYgKElTX0lOVEVSTkFMX1NGVFAoY29tbWFuZCkpIHsKKwkJCXMtPmlzX3N1YnN5c3RlbSA9IHMtPmlzX3N1YnN5c3RlbSA/CisJCQkgICAgU1VCU1lTVEVNX0lOVF9TRlRQIDogU1VCU1lTVEVNX0lOVF9TRlRQX0VSUk9SOworCQl9IGVsc2UgaWYgKHMtPmlzX3N1YnN5c3RlbSkKKwkJCXMtPmlzX3N1YnN5c3RlbSA9IFNVQlNZU1RFTV9FWFQ7CisJCWRlYnVnKCJGb3JjZWQgY29tbWFuZCAoa2V5IG9wdGlvbikgJyUuOTAwcyciLCBjb21tYW5kKTsKKwl9CisKKyNpZmRlZiBTU0hfQVVESVRfRVZFTlRTCisJaWYgKGNvbW1hbmQgIT0gTlVMTCkKKwkJUFJJVlNFUChhdWRpdF9ydW5fY29tbWFuZChjb21tYW5kKSk7CisJZWxzZSBpZiAocy0+dHR5ZmQgPT0gLTEpIHsKKwkJY2hhciAqc2hlbGwgPSBzLT5wdy0+cHdfc2hlbGw7CisKKwkJaWYgKHNoZWxsWzBdID09ICdcMCcpCS8qIGVtcHR5IHNoZWxsIG1lYW5zIC9iaW4vc2ggKi8KKwkJCXNoZWxsID1fUEFUSF9CU0hFTEw7CisJCVBSSVZTRVAoYXVkaXRfcnVuX2NvbW1hbmQoc2hlbGwpKTsKKwl9CisjZW5kaWYKKwlpZiAocy0+dHR5ZmQgIT0gLTEpCisJCXJldCA9IGRvX2V4ZWNfcHR5KHMsIGNvbW1hbmQpOworCWVsc2UKKwkJcmV0ID0gZG9fZXhlY19ub19wdHkocywgY29tbWFuZCk7CisKKwlvcmlnaW5hbF9jb21tYW5kID0gTlVMTDsKKworCS8qCisJICogQ2xlYXIgbG9naW5tc2c6IGl0J3MgdGhlIGNoaWxkJ3MgcmVzcG9uc2liaWxpdHkgdG8gZGlzcGxheQorCSAqIGl0IHRvIHRoZSB1c2VyLCBvdGhlcndpc2UgbXVsdGlwbGUgc2Vzc2lvbnMgbWF5IGFjY3VtdWxhdGUKKwkgKiBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIGxvZ2luIG1lc3NhZ2VzLgorCSAqLworCWJ1ZmZlcl9jbGVhcigmbG9naW5tc2cpOworCisJcmV0dXJuIHJldDsKK30KKworLyogYWRtaW5pc3RyYXRpdmUsIGxvZ2luKDEpLWxpa2Ugd29yayAqLwordm9pZAorZG9fbG9naW4oU2Vzc2lvbiAqcywgY29uc3QgY2hhciAqY29tbWFuZCkKK3sKKwlzb2NrbGVuX3QgZnJvbWxlbjsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBmcm9tOworCXN0cnVjdCBwYXNzd2QgKiBwdyA9IHMtPnB3OworCXBpZF90IHBpZCA9IGdldHBpZCgpOworCisJLyoKKwkgKiBHZXQgSVAgYWRkcmVzcyBvZiBjbGllbnQuIElmIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBhIHNvY2tldCwgbGV0CisJICogdGhlIGFkZHJlc3MgYmUgMC4wLjAuMC4KKwkgKi8KKwltZW1zZXQoJmZyb20sIDAsIHNpemVvZihmcm9tKSk7CisJZnJvbWxlbiA9IHNpemVvZihmcm9tKTsKKwlpZiAocGFja2V0X2Nvbm5lY3Rpb25faXNfb25fc29ja2V0KCkpIHsKKwkJaWYgKGdldHBlZXJuYW1lKHBhY2tldF9nZXRfY29ubmVjdGlvbl9pbigpLAorCQkgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZmcm9tLCAmZnJvbWxlbikgPCAwKSB7CisJCQlkZWJ1ZygiZ2V0cGVlcm5hbWU6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQljbGVhbnVwX2V4aXQoMjU1KTsKKwkJfQorCX0KKworCS8qIFJlY29yZCB0aGF0IHRoZXJlIHdhcyBhIGxvZ2luIG9uIHRoYXQgdHR5IGZyb20gdGhlIHJlbW90ZSBob3N0LiAqLworCWlmICghdXNlX3ByaXZzZXApCisJCXJlY29yZF9sb2dpbihwaWQsIHMtPnR0eSwgcHctPnB3X25hbWUsIHB3LT5wd191aWQsCisJCSAgICBnZXRfcmVtb3RlX25hbWVfb3JfaXAodXRtcF9sZW4sCisJCSAgICBvcHRpb25zLnVzZV9kbnMpLAorCQkgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZmcm9tLCBmcm9tbGVuKTsKKworI2lmZGVmIFVTRV9QQU0KKwkvKgorCSAqIElmIHBhc3N3b3JkIGNoYW5nZSBpcyBuZWVkZWQsIGRvIGl0IG5vdy4KKwkgKiBUaGlzIG5lZWRzIHRvIG9jY3VyIGJlZm9yZSB0aGUgfi8uaHVzaGxvZ2luIGNoZWNrLgorCSAqLworCWlmIChvcHRpb25zLnVzZV9wYW0gJiYgIXVzZV9wcml2c2VwICYmIHMtPmF1dGhjdHh0LT5mb3JjZV9wd2NoYW5nZSkgeworCQlkaXNwbGF5X2xvZ2lubXNnKCk7CisJCWRvX3BhbV9jaGF1dGh0b2soKTsKKwkJcy0+YXV0aGN0eHQtPmZvcmNlX3B3Y2hhbmdlID0gMDsKKwkJLyogWFhYIC0gc2lnbmFsIFtuZXRdIHBhcmVudCB0byBlbmFibGUgZm9yd2FyZGluZ3MgKi8KKwl9CisjZW5kaWYKKworCWlmIChjaGVja19xdWlldGxvZ2luKHMsIGNvbW1hbmQpKQorCQlyZXR1cm47CisKKwlkaXNwbGF5X2xvZ2lubXNnKCk7CisKKwlkb19tb3RkKCk7Cit9CisKKy8qCisgKiBEaXNwbGF5IHRoZSBtZXNzYWdlIG9mIHRoZSBkYXkuCisgKi8KK3ZvaWQKK2RvX21vdGQodm9pZCkKK3sKKwlGSUxFICpmOworCWNoYXIgYnVmWzI1Nl07CisKKwlpZiAob3B0aW9ucy5wcmludF9tb3RkKSB7CisjaWZkZWYgSEFWRV9MT0dJTl9DQVAKKwkJZiA9IGZvcGVuKGxvZ2luX2dldGNhcHN0cihsYywgIndlbGNvbWUiLCAiL2V0Yy9tb3RkIiwKKwkJICAgICIvZXRjL21vdGQiKSwgInIiKTsKKyNlbHNlCisJCWYgPSBmb3BlbigiL2V0Yy9tb3RkIiwgInIiKTsKKyNlbmRpZgorCQlpZiAoZikgeworCQkJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGYpKQorCQkJCWZwdXRzKGJ1Ziwgc3Rkb3V0KTsKKwkJCWZjbG9zZShmKTsKKwkJfQorCX0KK30KKworCisvKgorICogQ2hlY2sgZm9yIHF1aWV0IGxvZ2luLCBlaXRoZXIgLmh1c2hsb2dpbiBvciBjb21tYW5kIGdpdmVuLgorICovCitpbnQKK2NoZWNrX3F1aWV0bG9naW4oU2Vzc2lvbiAqcywgY29uc3QgY2hhciAqY29tbWFuZCkKK3sKKwljaGFyIGJ1ZlsyNTZdOworCXN0cnVjdCBwYXNzd2QgKnB3ID0gcy0+cHc7CisJc3RydWN0IHN0YXQgc3Q7CisKKwkvKiBSZXR1cm4gMSBpZiAuaHVzaGxvZ2luIGV4aXN0cyBvciBhIGNvbW1hbmQgZ2l2ZW4uICovCisJaWYgKGNvbW1hbmQgIT0gTlVMTCkKKwkJcmV0dXJuIDE7CisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiUuMjAwcy8uaHVzaGxvZ2luIiwgcHctPnB3X2Rpcik7CisjaWZkZWYgSEFWRV9MT0dJTl9DQVAKKwlpZiAobG9naW5fZ2V0Y2FwYm9vbChsYywgImh1c2hsb2dpbiIsIDApIHx8IHN0YXQoYnVmLCAmc3QpID49IDApCisJCXJldHVybiAxOworI2Vsc2UKKwlpZiAoc3RhdChidWYsICZzdCkgPj0gMCkKKwkJcmV0dXJuIDE7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiB2YXJpYWJsZSBpbiB0aGUgZW52aXJvbm1lbnQuICBJZiB0aGUgdmFyaWFibGUKKyAqIGFscmVhZHkgZXhpc3RzLCBpdHMgdmFsdWUgaXMgb3ZlcnJpZGRlbi4KKyAqLwordm9pZAorY2hpbGRfc2V0X2VudihjaGFyICoqKmVudnAsIHVfaW50ICplbnZzaXplcCwgY29uc3QgY2hhciAqbmFtZSwKKwljb25zdCBjaGFyICp2YWx1ZSkKK3sKKwljaGFyICoqZW52OworCXVfaW50IGVudnNpemU7CisJdV9pbnQgaSwgbmFtZWxlbjsKKworCS8qCisJICogSWYgd2UncmUgcGFzc2VkIGFuIHVuaW5pdGlhbGl6ZWQgbGlzdCwgYWxsb2NhdGUgYSBzaW5nbGUgbnVsbAorCSAqIGVudHJ5IGJlZm9yZSBjb250aW51aW5nLgorCSAqLworCWlmICgqZW52cCA9PSBOVUxMICYmICplbnZzaXplcCA9PSAwKSB7CisJCSplbnZwID0geG1hbGxvYyhzaXplb2YoY2hhciAqKSk7CisJCSplbnZwWzBdID0gTlVMTDsKKwkJKmVudnNpemVwID0gMTsKKwl9CisKKwkvKgorCSAqIEZpbmQgdGhlIHNsb3Qgd2hlcmUgdGhlIHZhbHVlIHNob3VsZCBiZSBzdG9yZWQuICBJZiB0aGUgdmFyaWFibGUKKwkgKiBhbHJlYWR5IGV4aXN0cywgd2UgcmV1c2UgdGhlIHNsb3Q7IG90aGVyd2lzZSB3ZSBhcHBlbmQgYSBuZXcgc2xvdAorCSAqIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5LCBleHBhbmRpbmcgaWYgbmVjZXNzYXJ5LgorCSAqLworCWVudiA9ICplbnZwOworCW5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisJZm9yIChpID0gMDsgZW52W2ldOyBpKyspCisJCWlmIChzdHJuY21wKGVudltpXSwgbmFtZSwgbmFtZWxlbikgPT0gMCAmJiBlbnZbaV1bbmFtZWxlbl0gPT0gJz0nKQorCQkJYnJlYWs7CisJaWYgKGVudltpXSkgeworCQkvKiBSZXVzZSB0aGUgc2xvdC4gKi8KKwkJeGZyZWUoZW52W2ldKTsKKwl9IGVsc2UgeworCQkvKiBOZXcgdmFyaWFibGUuICBFeHBhbmQgaWYgbmVjZXNzYXJ5LiAqLworCQllbnZzaXplID0gKmVudnNpemVwOworCQlpZiAoaSA+PSBlbnZzaXplIC0gMSkgeworCQkJaWYgKGVudnNpemUgPj0gMTAwMCkKKwkJCQlmYXRhbCgiY2hpbGRfc2V0X2VudjogdG9vIG1hbnkgZW52IHZhcnMiKTsKKwkJCWVudnNpemUgKz0gNTA7CisJCQllbnYgPSAoKmVudnApID0geHJlYWxsb2MoZW52LCBlbnZzaXplLCBzaXplb2YoY2hhciAqKSk7CisJCQkqZW52c2l6ZXAgPSBlbnZzaXplOworCQl9CisJCS8qIE5lZWQgdG8gc2V0IHRoZSBOVUxMIHBvaW50ZXIgYXQgZW5kIG9mIGFycmF5IGJleW9uZCB0aGUgbmV3IHNsb3QuICovCisJCWVudltpICsgMV0gPSBOVUxMOworCX0KKworCS8qIEFsbG9jYXRlIHNwYWNlIGFuZCBmb3JtYXQgdGhlIHZhcmlhYmxlIGluIHRoZSBhcHByb3ByaWF0ZSBzbG90LiAqLworCWVudltpXSA9IHhtYWxsb2Moc3RybGVuKG5hbWUpICsgMSArIHN0cmxlbih2YWx1ZSkgKyAxKTsKKwlzbnByaW50ZihlbnZbaV0sIHN0cmxlbihuYW1lKSArIDEgKyBzdHJsZW4odmFsdWUpICsgMSwgIiVzPSVzIiwgbmFtZSwgdmFsdWUpOworfQorCisvKgorICogUmVhZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gdGhlIGdpdmVuIGZpbGUgYW5kIGFkZHMvb3ZlcnJpZGVzIHRoZW0KKyAqIGludG8gdGhlIGVudmlyb25tZW50LiAgSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoaXMgZG9lcyBub3RoaW5nLgorICogT3RoZXJ3aXNlLCBpdCBtdXN0IGNvbnNpc3Qgb2YgZW1wdHkgbGluZXMsIGNvbW1lbnRzIChsaW5lIHN0YXJ0cyB3aXRoICcjJykKKyAqIGFuZCBhc3NpZ25tZW50cyBvZiB0aGUgZm9ybSBuYW1lPXZhbHVlLiAgTm8gb3RoZXIgZm9ybXMgYXJlIGFsbG93ZWQuCisgKi8KK3N0YXRpYyB2b2lkCityZWFkX2Vudmlyb25tZW50X2ZpbGUoY2hhciAqKiplbnYsIHVfaW50ICplbnZzaXplLAorCWNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCUZJTEUgKmY7CisJY2hhciBidWZbNDA5Nl07CisJY2hhciAqY3AsICp2YWx1ZTsKKwl1X2ludCBsaW5lbm8gPSAwOworCisJZiA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworCWlmICghZikKKwkJcmV0dXJuOworCisJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGYpKSB7CisJCWlmICgrK2xpbmVubyA+IDEwMDApCisJCQlmYXRhbCgiVG9vIG1hbnkgbGluZXMgaW4gZW52aXJvbm1lbnQgZmlsZSAlcyIsIGZpbGVuYW1lKTsKKwkJZm9yIChjcCA9IGJ1ZjsgKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JzsgY3ArKykKKwkJCTsKKwkJaWYgKCEqY3AgfHwgKmNwID09ICcjJyB8fCAqY3AgPT0gJ1xuJykKKwkJCWNvbnRpbnVlOworCisJCWNwW3N0cmNzcG4oY3AsICJcbiIpXSA9ICdcMCc7CisKKwkJdmFsdWUgPSBzdHJjaHIoY3AsICc9Jyk7CisJCWlmICh2YWx1ZSA9PSBOVUxMKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkJhZCBsaW5lICV1IGluICUuMTAwc1xuIiwgbGluZW5vLAorCQkJICAgIGZpbGVuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIFJlcGxhY2UgdGhlIGVxdWFscyBzaWduIGJ5IG51bCwgYW5kIGFkdmFuY2UgdmFsdWUgdG8KKwkJICogdGhlIHZhbHVlIHN0cmluZy4KKwkJICovCisJCSp2YWx1ZSA9ICdcMCc7CisJCXZhbHVlKys7CisJCWNoaWxkX3NldF9lbnYoZW52LCBlbnZzaXplLCBjcCwgdmFsdWUpOworCX0KKwlmY2xvc2UoZik7Cit9CisKKyNpZmRlZiBIQVZFX0VUQ19ERUZBVUxUX0xPR0lOCisvKgorICogUmV0dXJuIG5hbWVkIHZhcmlhYmxlIGZyb20gc3BlY2lmaWVkIGVudmlyb25tZW50LCBvciBOVUxMIGlmIG5vdCBwcmVzZW50LgorICovCitzdGF0aWMgY2hhciAqCitjaGlsZF9nZXRfZW52KGNoYXIgKiplbnYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisJc2l6ZV90IGxlbjsKKworCWxlbiA9IHN0cmxlbihuYW1lKTsKKwlmb3IgKGk9MDsgZW52W2ldICE9IE5VTEw7IGkrKykKKwkJaWYgKHN0cm5jbXAobmFtZSwgZW52W2ldLCBsZW4pID09IDAgJiYgZW52W2ldW2xlbl0gPT0gJz0nKQorCQkJcmV0dXJuKGVudltpXSArIGxlbiArIDEpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogUmVhZCAvZXRjL2RlZmF1bHQvbG9naW4uCisgKiBXZSBwaWNrIHVwIHRoZSBQQVRIIChvciBTVVBBVEggZm9yIHJvb3QpIGFuZCBVTUFTSy4KKyAqLworc3RhdGljIHZvaWQKK3JlYWRfZXRjX2RlZmF1bHRfbG9naW4oY2hhciAqKiplbnYsIHVfaW50ICplbnZzaXplLCB1aWRfdCB1aWQpCit7CisJY2hhciAqKnRtcGVudiA9IE5VTEwsICp2YXI7CisJdV9pbnQgaSwgdG1wZW52c2l6ZSA9IDA7CisJdV9sb25nIG1hc2s7CisKKwkvKgorCSAqIFdlIGRvbid0IHdhbnQgdG8gY29weSB0aGUgd2hvbGUgZmlsZSB0byB0aGUgY2hpbGQncyBlbnZpcm9ubWVudCwKKwkgKiBzbyB3ZSB1c2UgYSB0ZW1wb3JhcnkgZW52aXJvbm1lbnQgYW5kIGNvcHkgdGhlIHZhcmlhYmxlcyB3ZSdyZQorCSAqIGludGVyZXN0ZWQgaW4uCisJICovCisJcmVhZF9lbnZpcm9ubWVudF9maWxlKCZ0bXBlbnYsICZ0bXBlbnZzaXplLCAiL2V0Yy9kZWZhdWx0L2xvZ2luIik7CisKKwlpZiAodG1wZW52ID09IE5VTEwpCisJCXJldHVybjsKKworCWlmICh1aWQgPT0gMCkKKwkJdmFyID0gY2hpbGRfZ2V0X2Vudih0bXBlbnYsICJTVVBBVEgiKTsKKwllbHNlCisJCXZhciA9IGNoaWxkX2dldF9lbnYodG1wZW52LCAiUEFUSCIpOworCWlmICh2YXIgIT0gTlVMTCkKKwkJY2hpbGRfc2V0X2VudihlbnYsIGVudnNpemUsICJQQVRIIiwgdmFyKTsKKworCWlmICgodmFyID0gY2hpbGRfZ2V0X2Vudih0bXBlbnYsICJVTUFTSyIpKSAhPSBOVUxMKQorCQlpZiAoc3NjYW5mKHZhciwgIiU1bG8iLCAmbWFzaykgPT0gMSkKKwkJCXVtYXNrKChtb2RlX3QpbWFzayk7CisKKwlmb3IgKGkgPSAwOyB0bXBlbnZbaV0gIT0gTlVMTDsgaSsrKQorCQl4ZnJlZSh0bXBlbnZbaV0pOworCXhmcmVlKHRtcGVudik7Cit9CisjZW5kaWYgLyogSEFWRV9FVENfREVGQVVMVF9MT0dJTiAqLworCit2b2lkCitjb3B5X2Vudmlyb25tZW50KGNoYXIgKipzb3VyY2UsIGNoYXIgKioqZW52LCB1X2ludCAqZW52c2l6ZSkKK3sKKwljaGFyICp2YXJfbmFtZSwgKnZhcl92YWw7CisJaW50IGk7CisKKwlpZiAoc291cmNlID09IE5VTEwpCisJCXJldHVybjsKKworCWZvcihpID0gMDsgc291cmNlW2ldICE9IE5VTEw7IGkrKykgeworCQl2YXJfbmFtZSA9IHhzdHJkdXAoc291cmNlW2ldKTsKKwkJaWYgKCh2YXJfdmFsID0gc3Ryc3RyKHZhcl9uYW1lLCAiPSIpKSA9PSBOVUxMKSB7CisJCQl4ZnJlZSh2YXJfbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQkqdmFyX3ZhbCsrID0gJ1wwJzsKKworCQlkZWJ1ZzMoIkNvcHkgZW52aXJvbm1lbnQ6ICVzPSVzIiwgdmFyX25hbWUsIHZhcl92YWwpOworCQljaGlsZF9zZXRfZW52KGVudiwgZW52c2l6ZSwgdmFyX25hbWUsIHZhcl92YWwpOworCisJCXhmcmVlKHZhcl9uYW1lKTsKKwl9Cit9CisKK3N0YXRpYyBjaGFyICoqCitkb19zZXR1cF9lbnYoU2Vzc2lvbiAqcywgY29uc3QgY2hhciAqc2hlbGwpCit7CisJY2hhciBidWZbMjU2XTsKKwl1X2ludCBpLCBlbnZzaXplOworCWNoYXIgKiplbnYsICpsYWRkcjsKKwlzdHJ1Y3QgcGFzc3dkICpwdyA9IHMtPnB3OworI2lmICFkZWZpbmVkIChIQVZFX0xPR0lOX0NBUCkgJiYgIWRlZmluZWQgKEhBVkVfQ1lHV0lOKQorCWNoYXIgKnBhdGggPSBOVUxMOworI2VuZGlmCisKKwkvKiBJbml0aWFsaXplIHRoZSBlbnZpcm9ubWVudC4gKi8KKwllbnZzaXplID0gMTAwOworCWVudiA9IHhjYWxsb2MoZW52c2l6ZSwgc2l6ZW9mKGNoYXIgKikpOworCWVudlswXSA9IE5VTEw7CisKKyNpZmRlZiBIQVZFX0NZR1dJTgorCS8qCisJICogVGhlIFdpbmRvd3MgZW52aXJvbm1lbnQgY29udGFpbnMgc29tZSBzZXR0aW5nIHdoaWNoIGFyZQorCSAqIGltcG9ydGFudCBmb3IgYSBydW5uaW5nIHN5c3RlbS4gVGhleSBtdXN0IG5vdCBiZSBkcm9wcGVkLgorCSAqLworCXsKKwkJY2hhciAqKnA7CisKKwkJcCA9IGZldGNoX3dpbmRvd3NfZW52aXJvbm1lbnQoKTsKKwkJY29weV9lbnZpcm9ubWVudChwLCAmZW52LCAmZW52c2l6ZSk7CisJCWZyZWVfd2luZG93c19lbnZpcm9ubWVudChwKTsKKwl9CisjZW5kaWYKKworI2lmZGVmIEdTU0FQSQorCS8qIEFsbG93IGFueSBHU1NBUEkgbWV0aG9kcyB0aGF0IHdlJ3ZlIHVzZWQgdG8gYWx0ZXIKKwkgKiB0aGUgY2hpbGRzIGVudmlyb25tZW50IGFzIHRoZXkgc2VlIGZpdAorCSAqLworCXNzaF9nc3NhcGlfZG9fY2hpbGQoJmVudiwgJmVudnNpemUpOworI2VuZGlmCisKKwlpZiAoIW9wdGlvbnMudXNlX2xvZ2luKSB7CisJCS8qIFNldCBiYXNpYyBlbnZpcm9ubWVudC4gKi8KKwkJZm9yIChpID0gMDsgaSA8IHMtPm51bV9lbnY7IGkrKykKKwkJCWNoaWxkX3NldF9lbnYoJmVudiwgJmVudnNpemUsIHMtPmVudltpXS5uYW1lLAorCQkJICAgIHMtPmVudltpXS52YWwpOworCisJCWNoaWxkX3NldF9lbnYoJmVudiwgJmVudnNpemUsICJVU0VSIiwgcHctPnB3X25hbWUpOworCQljaGlsZF9zZXRfZW52KCZlbnYsICZlbnZzaXplLCAiTE9HTkFNRSIsIHB3LT5wd19uYW1lKTsKKyNpZmRlZiBfQUlYCisJCWNoaWxkX3NldF9lbnYoJmVudiwgJmVudnNpemUsICJMT0dJTiIsIHB3LT5wd19uYW1lKTsKKyNlbmRpZgorCQljaGlsZF9zZXRfZW52KCZlbnYsICZlbnZzaXplLCAiSE9NRSIsIHB3LT5wd19kaXIpOworI2lmZGVmIEhBVkVfTE9HSU5fQ0FQCisJCWlmIChzZXR1c2VyY29udGV4dChsYywgcHcsIHB3LT5wd191aWQsIExPR0lOX1NFVFBBVEgpIDwgMCkKKwkJCWNoaWxkX3NldF9lbnYoJmVudiwgJmVudnNpemUsICJQQVRIIiwgX1BBVEhfU1REUEFUSCk7CisJCWVsc2UKKwkJCWNoaWxkX3NldF9lbnYoJmVudiwgJmVudnNpemUsICJQQVRIIiwgZ2V0ZW52KCJQQVRIIikpOworI2Vsc2UgLyogSEFWRV9MT0dJTl9DQVAgKi8KKyMgaWZuZGVmIEhBVkVfQ1lHV0lOCisJCS8qCisJCSAqIFRoZXJlJ3Mgbm8gc3RhbmRhcmQgcGF0aCBvbiBXaW5kb3dzLiBUaGUgcGF0aCBjb250YWlucworCQkgKiBpbXBvcnRhbnQgY29tcG9uZW50cyBwb2ludGluZyB0byB0aGUgc3lzdGVtIGRpcmVjdG9yaWVzLAorCQkgKiBuZWVkZWQgZm9yIGxvYWRpbmcgc2hhcmVkIGxpYnJhcmllcy4gU28gdGhlIHBhdGggYmV0dGVyCisJCSAqIHJlbWFpbnMgaW50YWN0IGhlcmUuCisJCSAqLworIyAgaWZkZWYgSEFWRV9FVENfREVGQVVMVF9MT0dJTgorCQlyZWFkX2V0Y19kZWZhdWx0X2xvZ2luKCZlbnYsICZlbnZzaXplLCBwdy0+cHdfdWlkKTsKKwkJcGF0aCA9IGNoaWxkX2dldF9lbnYoZW52LCAiUEFUSCIpOworIyAgZW5kaWYgLyogSEFWRV9FVENfREVGQVVMVF9MT0dJTiAqLworCQlpZiAocGF0aCA9PSBOVUxMIHx8ICpwYXRoID09ICdcMCcpIHsKKwkJCWNoaWxkX3NldF9lbnYoJmVudiwgJmVudnNpemUsICJQQVRIIiwKKwkJCSAgICBzLT5wdy0+cHdfdWlkID09IDAgPworCQkJCVNVUEVSVVNFUl9QQVRIIDogX1BBVEhfU1REUEFUSCk7CisJCX0KKyMgZW5kaWYgLyogSEFWRV9DWUdXSU4gKi8KKyNlbmRpZiAvKiBIQVZFX0xPR0lOX0NBUCAqLworCisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIiUuMjAwcy8lLjUwcyIsCisJCQkgX1BBVEhfTUFJTERJUiwgcHctPnB3X25hbWUpOworCQljaGlsZF9zZXRfZW52KCZlbnYsICZlbnZzaXplLCAiTUFJTCIsIGJ1Zik7CisKKwkJLyogTm9ybWFsIHN5c3RlbXMgc2V0IFNIRUxMIGJ5IGRlZmF1bHQuICovCisJCWNoaWxkX3NldF9lbnYoJmVudiwgJmVudnNpemUsICJTSEVMTCIsIHNoZWxsKTsKKwl9CisJaWYgKGdldGVudigiVFoiKSkKKwkJY2hpbGRfc2V0X2VudigmZW52LCAmZW52c2l6ZSwgIlRaIiwgZ2V0ZW52KCJUWiIpKTsKKworCS8qIFNldCBjdXN0b20gZW52aXJvbm1lbnQgb3B0aW9ucyBmcm9tIFJTQSBhdXRoZW50aWNhdGlvbi4gKi8KKwlpZiAoIW9wdGlvbnMudXNlX2xvZ2luKSB7CisJCXdoaWxlIChjdXN0b21fZW52aXJvbm1lbnQpIHsKKwkJCXN0cnVjdCBlbnZzdHJpbmcgKmNlID0gY3VzdG9tX2Vudmlyb25tZW50OworCQkJY2hhciAqc3RyID0gY2UtPnM7CisKKwkJCWZvciAoaSA9IDA7IHN0cltpXSAhPSAnPScgJiYgc3RyW2ldOyBpKyspCisJCQkJOworCQkJaWYgKHN0cltpXSA9PSAnPScpIHsKKwkJCQlzdHJbaV0gPSAwOworCQkJCWNoaWxkX3NldF9lbnYoJmVudiwgJmVudnNpemUsIHN0ciwgc3RyICsgaSArIDEpOworCQkJfQorCQkJY3VzdG9tX2Vudmlyb25tZW50ID0gY2UtPm5leHQ7CisJCQl4ZnJlZShjZS0+cyk7CisJCQl4ZnJlZShjZSk7CisJCX0KKwl9CisKKwkvKiBTU0hfQ0xJRU5UIGRlcHJlY2F0ZWQgKi8KKwlzbnByaW50ZihidWYsIHNpemVvZiBidWYsICIlLjUwcyAlZCAlZCIsCisJICAgIGdldF9yZW1vdGVfaXBhZGRyKCksIGdldF9yZW1vdGVfcG9ydCgpLCBnZXRfbG9jYWxfcG9ydCgpKTsKKwljaGlsZF9zZXRfZW52KCZlbnYsICZlbnZzaXplLCAiU1NIX0NMSUVOVCIsIGJ1Zik7CisKKwlsYWRkciA9IGdldF9sb2NhbF9pcGFkZHIocGFja2V0X2dldF9jb25uZWN0aW9uX2luKCkpOworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIiUuNTBzICVkICUuNTBzICVkIiwKKwkgICAgZ2V0X3JlbW90ZV9pcGFkZHIoKSwgZ2V0X3JlbW90ZV9wb3J0KCksIGxhZGRyLCBnZXRfbG9jYWxfcG9ydCgpKTsKKwl4ZnJlZShsYWRkcik7CisJY2hpbGRfc2V0X2VudigmZW52LCAmZW52c2l6ZSwgIlNTSF9DT05ORUNUSU9OIiwgYnVmKTsKKworCWlmIChzLT50dHlmZCAhPSAtMSkKKwkJY2hpbGRfc2V0X2VudigmZW52LCAmZW52c2l6ZSwgIlNTSF9UVFkiLCBzLT50dHkpOworCWlmIChzLT50ZXJtKQorCQljaGlsZF9zZXRfZW52KCZlbnYsICZlbnZzaXplLCAiVEVSTSIsIHMtPnRlcm0pOworCWlmIChzLT5kaXNwbGF5KQorCQljaGlsZF9zZXRfZW52KCZlbnYsICZlbnZzaXplLCAiRElTUExBWSIsIHMtPmRpc3BsYXkpOworCWlmIChvcmlnaW5hbF9jb21tYW5kKQorCQljaGlsZF9zZXRfZW52KCZlbnYsICZlbnZzaXplLCAiU1NIX09SSUdJTkFMX0NPTU1BTkQiLAorCQkgICAgb3JpZ2luYWxfY29tbWFuZCk7CisKKyNpZmRlZiBfVU5JQ09TCisJaWYgKGNyYXlfdG1wZGlyWzBdICE9ICdcMCcpCisJCWNoaWxkX3NldF9lbnYoJmVudiwgJmVudnNpemUsICJUTVBESVIiLCBjcmF5X3RtcGRpcik7CisjZW5kaWYgLyogX1VOSUNPUyAqLworCisJLyoKKwkgKiBTaW5jZSB3ZSBjbGVhciBLUkI1Q0NOQU1FIGF0IHN0YXJ0dXAsIGlmIGl0J3Mgc2V0IG5vdyB0aGVuIGl0CisJICogbXVzdCBoYXZlIGJlZW4gc2V0IGJ5IGEgbmF0aXZlIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCAoZWcgQUlYIG9yCisJICogU0lBKSwgc28gY29weSBpdCB0byB0aGUgY2hpbGQuCisJICovCisJeworCQljaGFyICpjcDsKKworCQlpZiAoKGNwID0gZ2V0ZW52KCJLUkI1Q0NOQU1FIikpICE9IE5VTEwpCisJCQljaGlsZF9zZXRfZW52KCZlbnYsICZlbnZzaXplLCAiS1JCNUNDTkFNRSIsIGNwKTsKKwl9CisKKyNpZmRlZiBfQUlYCisJeworCQljaGFyICpjcDsKKworCQlpZiAoKGNwID0gZ2V0ZW52KCJBVVRIU1RBVEUiKSkgIT0gTlVMTCkKKwkJCWNoaWxkX3NldF9lbnYoJmVudiwgJmVudnNpemUsICJBVVRIU1RBVEUiLCBjcCk7CisJCXJlYWRfZW52aXJvbm1lbnRfZmlsZSgmZW52LCAmZW52c2l6ZSwgIi9ldGMvZW52aXJvbm1lbnQiKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBLUkI1CisJaWYgKHMtPmF1dGhjdHh0LT5rcmI1X2NjbmFtZSkKKwkJY2hpbGRfc2V0X2VudigmZW52LCAmZW52c2l6ZSwgIktSQjVDQ05BTUUiLAorCQkgICAgcy0+YXV0aGN0eHQtPmtyYjVfY2NuYW1lKTsKKyNlbmRpZgorI2lmZGVmIFVTRV9QQU0KKwkvKgorCSAqIFB1bGwgaW4gYW55IGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IG1heSBoYXZlCisJICogYmVlbiBzZXQgYnkgUEFNLgorCSAqLworCWlmIChvcHRpb25zLnVzZV9wYW0pIHsKKwkJY2hhciAqKnA7CisKKwkJcCA9IGZldGNoX3BhbV9jaGlsZF9lbnZpcm9ubWVudCgpOworCQljb3B5X2Vudmlyb25tZW50KHAsICZlbnYsICZlbnZzaXplKTsKKwkJZnJlZV9wYW1fZW52aXJvbm1lbnQocCk7CisKKwkJcCA9IGZldGNoX3BhbV9lbnZpcm9ubWVudCgpOworCQljb3B5X2Vudmlyb25tZW50KHAsICZlbnYsICZlbnZzaXplKTsKKwkJZnJlZV9wYW1fZW52aXJvbm1lbnQocCk7CisJfQorI2VuZGlmIC8qIFVTRV9QQU0gKi8KKworCWlmIChhdXRoX3NvY2tfbmFtZSAhPSBOVUxMKQorCQljaGlsZF9zZXRfZW52KCZlbnYsICZlbnZzaXplLCBTU0hfQVVUSFNPQ0tFVF9FTlZfTkFNRSwKKwkJICAgIGF1dGhfc29ja19uYW1lKTsKKworCS8qIHJlYWQgJEhPTUUvLnNzaC9lbnZpcm9ubWVudC4gKi8KKwlpZiAob3B0aW9ucy5wZXJtaXRfdXNlcl9lbnYgJiYgIW9wdGlvbnMudXNlX2xvZ2luKSB7CisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIiUuMjAwcy8uc3NoL2Vudmlyb25tZW50IiwKKwkJICAgIHN0cmNtcChwdy0+cHdfZGlyLCAiLyIpID8gcHctPnB3X2RpciA6ICIiKTsKKwkJcmVhZF9lbnZpcm9ubWVudF9maWxlKCZlbnYsICZlbnZzaXplLCBidWYpOworCX0KKwlpZiAoZGVidWdfZmxhZykgeworCQkvKiBkdW1wIHRoZSBlbnZpcm9ubWVudCAqLworCQlmcHJpbnRmKHN0ZGVyciwgIkVudmlyb25tZW50OlxuIik7CisJCWZvciAoaSA9IDA7IGVudltpXTsgaSsrKQorCQkJZnByaW50ZihzdGRlcnIsICIgICUuMjAwc1xuIiwgZW52W2ldKTsKKwl9CisJcmV0dXJuIGVudjsKK30KKworLyoKKyAqIFJ1biAkSE9NRS8uc3NoL3JjLCAvZXRjL3NzaC9zc2hyYywgb3IgeGF1dGggKHdoaWNoZXZlciBpcyBmb3VuZAorICogZmlyc3QgaW4gdGhpcyBvcmRlcikuCisgKi8KK3N0YXRpYyB2b2lkCitkb19yY19maWxlcyhTZXNzaW9uICpzLCBjb25zdCBjaGFyICpzaGVsbCkKK3sKKwlGSUxFICpmID0gTlVMTDsKKwljaGFyIGNtZFsxMDI0XTsKKwlpbnQgZG9feGF1dGg7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlkb194YXV0aCA9CisJICAgIHMtPmRpc3BsYXkgIT0gTlVMTCAmJiBzLT5hdXRoX3Byb3RvICE9IE5VTEwgJiYgcy0+YXV0aF9kYXRhICE9IE5VTEw7CisKKwkvKiBpZ25vcmUgX1BBVEhfU1NIX1VTRVJfUkMgZm9yIHN1YnN5c3RlbXMgYW5kIGFkbWluIGZvcmNlZCBjb21tYW5kcyAqLworCWlmICghcy0+aXNfc3Vic3lzdGVtICYmIG9wdGlvbnMuYWRtX2ZvcmNlZF9jb21tYW5kID09IE5VTEwgJiYKKwkgICAgIW5vX3VzZXJfcmMgJiYgc3RhdChfUEFUSF9TU0hfVVNFUl9SQywgJnN0KSA+PSAwKSB7CisJCXNucHJpbnRmKGNtZCwgc2l6ZW9mIGNtZCwgIiVzIC1jICclcyAlcyciLAorCQkgICAgc2hlbGwsIF9QQVRIX0JTSEVMTCwgX1BBVEhfU1NIX1VTRVJfUkMpOworCQlpZiAoZGVidWdfZmxhZykKKwkJCWZwcmludGYoc3RkZXJyLCAiUnVubmluZyAlc1xuIiwgY21kKTsKKwkJZiA9IHBvcGVuKGNtZCwgInciKTsKKwkJaWYgKGYpIHsKKwkJCWlmIChkb194YXV0aCkKKwkJCQlmcHJpbnRmKGYsICIlcyAlc1xuIiwgcy0+YXV0aF9wcm90bywKKwkJCQkgICAgcy0+YXV0aF9kYXRhKTsKKwkJCXBjbG9zZShmKTsKKwkJfSBlbHNlCisJCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBydW4gJXNcbiIsCisJCQkgICAgX1BBVEhfU1NIX1VTRVJfUkMpOworCX0gZWxzZSBpZiAoc3RhdChfUEFUSF9TU0hfU1lTVEVNX1JDLCAmc3QpID49IDApIHsKKwkJaWYgKGRlYnVnX2ZsYWcpCisJCQlmcHJpbnRmKHN0ZGVyciwgIlJ1bm5pbmcgJXMgJXNcbiIsIF9QQVRIX0JTSEVMTCwKKwkJCSAgICBfUEFUSF9TU0hfU1lTVEVNX1JDKTsKKwkJZiA9IHBvcGVuKF9QQVRIX0JTSEVMTCAiICIgX1BBVEhfU1NIX1NZU1RFTV9SQywgInciKTsKKwkJaWYgKGYpIHsKKwkJCWlmIChkb194YXV0aCkKKwkJCQlmcHJpbnRmKGYsICIlcyAlc1xuIiwgcy0+YXV0aF9wcm90bywKKwkJCQkgICAgcy0+YXV0aF9kYXRhKTsKKwkJCXBjbG9zZShmKTsKKwkJfSBlbHNlCisJCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBydW4gJXNcbiIsCisJCQkgICAgX1BBVEhfU1NIX1NZU1RFTV9SQyk7CisJfSBlbHNlIGlmIChkb194YXV0aCAmJiBvcHRpb25zLnhhdXRoX2xvY2F0aW9uICE9IE5VTEwpIHsKKwkJLyogQWRkIGF1dGhvcml0eSBkYXRhIHRvIC5YYXV0aG9yaXR5IGlmIGFwcHJvcHJpYXRlLiAqLworCQlpZiAoZGVidWdfZmxhZykgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkgICAgIlJ1bm5pbmcgJS41MDBzIHJlbW92ZSAlLjEwMHNcbiIsCisJCQkgICAgb3B0aW9ucy54YXV0aF9sb2NhdGlvbiwgcy0+YXV0aF9kaXNwbGF5KTsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJICAgICIlLjUwMHMgYWRkICUuMTAwcyAlLjEwMHMgJS4xMDBzXG4iLAorCQkJICAgIG9wdGlvbnMueGF1dGhfbG9jYXRpb24sIHMtPmF1dGhfZGlzcGxheSwKKwkJCSAgICBzLT5hdXRoX3Byb3RvLCBzLT5hdXRoX2RhdGEpOworCQl9CisJCXNucHJpbnRmKGNtZCwgc2l6ZW9mIGNtZCwgIiVzIC1xIC0iLAorCQkgICAgb3B0aW9ucy54YXV0aF9sb2NhdGlvbik7CisJCWYgPSBwb3BlbihjbWQsICJ3Iik7CisJCWlmIChmKSB7CisJCQlmcHJpbnRmKGYsICJyZW1vdmUgJXNcbiIsCisJCQkgICAgcy0+YXV0aF9kaXNwbGF5KTsKKwkJCWZwcmludGYoZiwgImFkZCAlcyAlcyAlc1xuIiwKKwkJCSAgICBzLT5hdXRoX2Rpc3BsYXksIHMtPmF1dGhfcHJvdG8sCisJCQkgICAgcy0+YXV0aF9kYXRhKTsKKwkJCXBjbG9zZShmKTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHJ1biAlc1xuIiwKKwkJCSAgICBjbWQpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorZG9fbm9sb2dpbihzdHJ1Y3QgcGFzc3dkICpwdykKK3sKKwlGSUxFICpmID0gTlVMTDsKKwljaGFyIGJ1ZlsxMDI0XSwgKm5sLCAqZGVmX25sID0gX1BBVEhfTk9MT0dJTjsKKwlzdHJ1Y3Qgc3RhdCBzYjsKKworI2lmZGVmIEhBVkVfTE9HSU5fQ0FQCisJaWYgKGxvZ2luX2dldGNhcGJvb2wobGMsICJpZ25vcmVub2xvZ2luIiwgMCkgJiYgcHctPnB3X3VpZCkKKwkJcmV0dXJuOworCW5sID0gbG9naW5fZ2V0Y2Fwc3RyKGxjLCAibm9sb2dpbiIsIGRlZl9ubCwgZGVmX25sKTsKKyNlbHNlCisJaWYgKHB3LT5wd191aWQgPT0gMCkKKwkJcmV0dXJuOworCW5sID0gZGVmX25sOworI2VuZGlmCisJaWYgKHN0YXQobmwsICZzYikgPT0gLTEpIHsKKwkJaWYgKG5sICE9IGRlZl9ubCkKKwkJCXhmcmVlKG5sKTsKKwkJcmV0dXJuOworCX0KKworCS8qIC9ldGMvbm9sb2dpbiBleGlzdHMuICBQcmludCBpdHMgY29udGVudHMgaWYgd2UgY2FuIGFuZCBleGl0LiAqLworCWxvZ2l0KCJVc2VyICUuMTAwcyBub3QgYWxsb3dlZCBiZWNhdXNlICVzIGV4aXN0cyIsIHB3LT5wd19uYW1lLCBubCk7CisJaWYgKChmID0gZm9wZW4obmwsICJyIikpICE9IE5VTEwpIHsKKyAJCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKSkKKyAJCQlmcHV0cyhidWYsIHN0ZGVycik7CisgCQlmY2xvc2UoZik7CisgCX0KKwlleGl0KDI1NCk7Cit9CisKKy8qCisgKiBDaHJvb3QgaW50byBhIGRpcmVjdG9yeSBhZnRlciBjaGVja2luZyBpdCBmb3Igc2FmZXR5OiBhbGwgcGF0aCBjb21wb25lbnRzCisgKiBtdXN0IGJlIHJvb3Qtb3duZWQgZGlyZWN0b3JpZXMgd2l0aCBzdHJpY3QgcGVybWlzc2lvbnMuCisgKi8KK3N0YXRpYyB2b2lkCitzYWZlbHlfY2hyb290KGNvbnN0IGNoYXIgKnBhdGgsIHVpZF90IHVpZCkKK3sKKwljb25zdCBjaGFyICpjcDsKKwljaGFyIGNvbXBvbmVudFtNQVhQQVRITEVOXTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmICgqcGF0aCAhPSAnLycpCisJCWZhdGFsKCJjaHJvb3QgcGF0aCBkb2VzIG5vdCBiZWdpbiBhdCByb290Iik7CisJaWYgKHN0cmxlbihwYXRoKSA+PSBzaXplb2YoY29tcG9uZW50KSkKKwkJZmF0YWwoImNocm9vdCBwYXRoIHRvbyBsb25nIik7CisKKwkvKgorCSAqIERlc2NlbmQgdGhlIHBhdGgsIGNoZWNraW5nIHRoYXQgZWFjaCBjb21wb25lbnQgaXMgYQorCSAqIHJvb3Qtb3duZWQgZGlyZWN0b3J5IHdpdGggc3RyaWN0IHBlcm1pc3Npb25zLgorCSAqLworCWZvciAoY3AgPSBwYXRoOyBjcCAhPSBOVUxMOykgeworCQlpZiAoKGNwID0gc3RyY2hyKGNwLCAnLycpKSA9PSBOVUxMKQorCQkJc3RybGNweShjb21wb25lbnQsIHBhdGgsIHNpemVvZihjb21wb25lbnQpKTsKKwkJZWxzZSB7CisJCQljcCsrOworCQkJbWVtY3B5KGNvbXBvbmVudCwgcGF0aCwgY3AgLSBwYXRoKTsKKwkJCWNvbXBvbmVudFtjcCAtIHBhdGhdID0gJ1wwJzsKKwkJfQorCQorCQlkZWJ1ZzMoIiVzOiBjaGVja2luZyAnJXMnIiwgX19mdW5jX18sIGNvbXBvbmVudCk7CisKKwkJaWYgKHN0YXQoY29tcG9uZW50LCAmc3QpICE9IDApCisJCQlmYXRhbCgiJXM6IHN0YXQoXCIlc1wiKTogJXMiLCBfX2Z1bmNfXywKKwkJCSAgICBjb21wb25lbnQsIHN0cmVycm9yKGVycm5vKSk7CisJCWlmIChzdC5zdF91aWQgIT0gMCB8fCAoc3Quc3RfbW9kZSAmIDAyMikgIT0gMCkKKwkJCWZhdGFsKCJiYWQgb3duZXJzaGlwIG9yIG1vZGVzIGZvciBjaHJvb3QgIgorCQkJICAgICJkaXJlY3RvcnkgJXNcIiVzXCIiLCAKKwkJCSAgICBjcCA9PSBOVUxMID8gIiIgOiAiY29tcG9uZW50ICIsIGNvbXBvbmVudCk7CisJCWlmICghU19JU0RJUihzdC5zdF9tb2RlKSkKKwkJCWZhdGFsKCJjaHJvb3QgcGF0aCAlc1wiJXNcIiBpcyBub3QgYSBkaXJlY3RvcnkiLAorCQkJICAgIGNwID09IE5VTEwgPyAiIiA6ICJjb21wb25lbnQgIiwgY29tcG9uZW50KTsKKworCX0KKworCWlmIChjaGRpcihwYXRoKSA9PSAtMSkKKwkJZmF0YWwoIlVuYWJsZSB0byBjaGRpciB0byBjaHJvb3QgcGF0aCBcIiVzXCI6ICIKKwkJICAgICIlcyIsIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKGNocm9vdChwYXRoKSA9PSAtMSkKKwkJZmF0YWwoImNocm9vdChcIiVzXCIpOiAlcyIsIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKGNoZGlyKCIvIikgPT0gLTEpCisJCWZhdGFsKCIlczogY2hkaXIoLykgYWZ0ZXIgY2hyb290OiAlcyIsCisJCSAgICBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwl2ZXJib3NlKCJDaGFuZ2VkIHJvb3QgZGlyZWN0b3J5IHRvIFwiJXNcIiIsIHBhdGgpOworfQorCisvKiBTZXQgbG9naW4gbmFtZSwgdWlkLCBnaWQsIGFuZCBncm91cHMuICovCit2b2lkCitkb19zZXR1c2VyY29udGV4dChzdHJ1Y3QgcGFzc3dkICpwdykKK3sKKwljaGFyICpjaHJvb3RfcGF0aCwgKnRtcDsKKworCXBsYXRmb3JtX3NldHVzZXJjb250ZXh0KHB3KTsKKworCWlmIChwbGF0Zm9ybV9wcml2aWxlZ2VkX3VpZHN3YXAoKSkgeworI2lmZGVmIEhBVkVfTE9HSU5fQ0FQCisJCWlmIChzZXR1c2VyY29udGV4dChsYywgcHcsIHB3LT5wd191aWQsCisJCSAgICAoTE9HSU5fU0VUQUxMICYgfihMT0dJTl9TRVRQQVRIfExPR0lOX1NFVFVTRVIpKSkgPCAwKSB7CisJCQlwZXJyb3IoInVuYWJsZSB0byBzZXQgdXNlciBjb250ZXh0Iik7CisJCQlleGl0KDEpOworCQl9CisjZWxzZQorCQlpZiAoc2V0bG9naW4ocHctPnB3X25hbWUpIDwgMCkKKwkJCWVycm9yKCJzZXRsb2dpbiBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJaWYgKHNldGdpZChwdy0+cHdfZ2lkKSA8IDApIHsKKwkJCXBlcnJvcigic2V0Z2lkIik7CisJCQlleGl0KDEpOworCQl9CisJCS8qIEluaXRpYWxpemUgdGhlIGdyb3VwIGxpc3QuICovCisJCWlmIChpbml0Z3JvdXBzKHB3LT5wd19uYW1lLCBwdy0+cHdfZ2lkKSA8IDApIHsKKwkJCXBlcnJvcigiaW5pdGdyb3VwcyIpOworCQkJZXhpdCgxKTsKKwkJfQorCQllbmRncmVudCgpOworI2VuZGlmCisKKwkJcGxhdGZvcm1fc2V0dXNlcmNvbnRleHRfcG9zdF9ncm91cHMocHcpOworCisJCWlmIChvcHRpb25zLmNocm9vdF9kaXJlY3RvcnkgIT0gTlVMTCAmJgorCQkgICAgc3RyY2FzZWNtcChvcHRpb25zLmNocm9vdF9kaXJlY3RvcnksICJub25lIikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdGlsZGVfZXhwYW5kX2ZpbGVuYW1lKG9wdGlvbnMuY2hyb290X2RpcmVjdG9yeSwKKwkJCSAgICBwdy0+cHdfdWlkKTsKKwkJCWNocm9vdF9wYXRoID0gcGVyY2VudF9leHBhbmQodG1wLCAiaCIsIHB3LT5wd19kaXIsCisJCQkgICAgInUiLCBwdy0+cHdfbmFtZSwgKGNoYXIgKilOVUxMKTsKKwkJCXNhZmVseV9jaHJvb3QoY2hyb290X3BhdGgsIHB3LT5wd191aWQpOworCQkJZnJlZSh0bXApOworCQkJZnJlZShjaHJvb3RfcGF0aCk7CisJCX0KKworI2lmZGVmIEhBVkVfTE9HSU5fQ0FQCisJCWlmIChzZXR1c2VyY29udGV4dChsYywgcHcsIHB3LT5wd191aWQsIExPR0lOX1NFVFVTRVIpIDwgMCkgeworCQkJcGVycm9yKCJ1bmFibGUgdG8gc2V0IHVzZXIgY29udGV4dCAoc2V0dXNlcikiKTsKKwkJCWV4aXQoMSk7CisJCX0KKyNlbHNlCisJCS8qIFBlcm1hbmVudGx5IHN3aXRjaCB0byB0aGUgZGVzaXJlZCB1aWQuICovCisJCXBlcm1hbmVudGx5X3NldF91aWQocHcpOworI2VuZGlmCisJfQorCisJaWYgKGdldHVpZCgpICE9IHB3LT5wd191aWQgfHwgZ2V0ZXVpZCgpICE9IHB3LT5wd191aWQpCisJCWZhdGFsKCJGYWlsZWQgdG8gc2V0IHVpZHMgdG8gJXUuIiwgKHVfaW50KSBwdy0+cHdfdWlkKTsKK30KKworc3RhdGljIHZvaWQKK2RvX3B3Y2hhbmdlKFNlc3Npb24gKnMpCit7CisJZmZsdXNoKE5VTEwpOworCWZwcmludGYoc3RkZXJyLCAiV0FSTklORzogWW91ciBwYXNzd29yZCBoYXMgZXhwaXJlZC5cbiIpOworCWlmIChzLT50dHlmZCAhPSAtMSkgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJICAgICJZb3UgbXVzdCBjaGFuZ2UgeW91ciBwYXNzd29yZCBub3cgYW5kIGxvZ2luIGFnYWluIVxuIik7CisjaWZkZWYgV0lUSF9TRUxJTlVYCisJCXNldGV4ZWNjb24oTlVMTCk7CisjZW5kaWYKKyNpZmRlZiBQQVNTV0RfTkVFRFNfVVNFUk5BTUUKKwkJZXhlY2woX1BBVEhfUEFTU1dEX1BST0csICJwYXNzd2QiLCBzLT5wdy0+cHdfbmFtZSwKKwkJICAgIChjaGFyICopTlVMTCk7CisjZWxzZQorCQlleGVjbChfUEFUSF9QQVNTV0RfUFJPRywgInBhc3N3ZCIsIChjaGFyICopTlVMTCk7CisjZW5kaWYKKwkJcGVycm9yKCJwYXNzd2QiKTsKKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJICAgICJQYXNzd29yZCBjaGFuZ2UgcmVxdWlyZWQgYnV0IG5vIFRUWSBhdmFpbGFibGUuXG4iKTsKKwl9CisJZXhpdCgxKTsKK30KKworc3RhdGljIHZvaWQKK2xhdW5jaF9sb2dpbihzdHJ1Y3QgcGFzc3dkICpwdywgY29uc3QgY2hhciAqaG9zdG5hbWUpCit7CisJLyogTGF1bmNoIGxvZ2luKDEpLiAqLworCisJZXhlY2woTE9HSU5fUFJPR1JBTSwgImxvZ2luIiwgIi1oIiwgaG9zdG5hbWUsCisjaWZkZWYgeHh4TE9HSU5fTkVFRFNfVEVSTQorCQkgICAgKHMtPnRlcm0gPyBzLT50ZXJtIDogInVua25vd24iKSwKKyNlbmRpZiAvKiBMT0dJTl9ORUVEU19URVJNICovCisjaWZkZWYgTE9HSU5fTk9fRU5ET1BUCisJICAgICItcCIsICItZiIsIHB3LT5wd19uYW1lLCAoY2hhciAqKU5VTEwpOworI2Vsc2UKKwkgICAgIi1wIiwgIi1mIiwgIi0tIiwgcHctPnB3X25hbWUsIChjaGFyICopTlVMTCk7CisjZW5kaWYKKworCS8qIExvZ2luIGNvdWxkbid0IGJlIGV4ZWN1dGVkLCBkaWUuICovCisKKwlwZXJyb3IoImxvZ2luIik7CisJZXhpdCgxKTsKK30KKworc3RhdGljIHZvaWQKK2NoaWxkX2Nsb3NlX2Zkcyh2b2lkKQoreworCWlmIChwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25faW4oKSA9PSBwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25fb3V0KCkpCisJCWNsb3NlKHBhY2tldF9nZXRfY29ubmVjdGlvbl9pbigpKTsKKwllbHNlIHsKKwkJY2xvc2UocGFja2V0X2dldF9jb25uZWN0aW9uX2luKCkpOworCQljbG9zZShwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25fb3V0KCkpOworCX0KKwkvKgorCSAqIENsb3NlIGFsbCBkZXNjcmlwdG9ycyByZWxhdGVkIHRvIGNoYW5uZWxzLiAgVGhleSB3aWxsIHN0aWxsIHJlbWFpbgorCSAqIG9wZW4gaW4gdGhlIHBhcmVudC4KKwkgKi8KKwkvKiBYWFggYmV0dGVyIHVzZSBjbG9zZS1vbi1leGVjPyAtbWFya3VzICovCisJY2hhbm5lbF9jbG9zZV9hbGwoKTsKKworCS8qCisJICogQ2xvc2UgYW55IGV4dHJhIGZpbGUgZGVzY3JpcHRvcnMuICBOb3RlIHRoYXQgdGhlcmUgbWF5IHN0aWxsIGJlCisJICogZGVzY3JpcHRvcnMgbGVmdCBieSBzeXN0ZW0gZnVuY3Rpb25zLiAgVGhleSB3aWxsIGJlIGNsb3NlZCBsYXRlci4KKwkgKi8KKwllbmRwd2VudCgpOworCisJLyoKKwkgKiBDbG9zZSBhbnkgZXh0cmEgb3BlbiBmaWxlIGRlc2NyaXB0b3JzIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0aGVtCisJICogaGFuZ2luZyBhcm91bmQgaW4gY2xpZW50cy4gIE5vdGUgdGhhdCB3ZSB3YW50IHRvIGRvIHRoaXMgYWZ0ZXIKKwkgKiBpbml0Z3JvdXBzLCBiZWNhdXNlIGF0IGxlYXN0IG9uIFNvbGFyaXMgMi4zIGl0IGxlYXZlcyBmaWxlCisJICogZGVzY3JpcHRvcnMgb3Blbi4KKwkgKi8KKwljbG9zZWZyb20oU1RERVJSX0ZJTEVOTyArIDEpOworfQorCisvKgorICogUGVyZm9ybXMgY29tbW9uIHByb2Nlc3NpbmcgZm9yIHRoZSBjaGlsZCwgc3VjaCBhcyBzZXR0aW5nIHVwIHRoZQorICogZW52aXJvbm1lbnQsIGNsb3NpbmcgZXh0cmEgZmlsZSBkZXNjcmlwdG9ycywgc2V0dGluZyB0aGUgdXNlciBhbmQgZ3JvdXAKKyAqIGlkcywgYW5kIGV4ZWN1dGluZyB0aGUgY29tbWFuZCBvciBzaGVsbC4KKyAqLworI2RlZmluZSBBUkdWX01BWCAxMAordm9pZAorZG9fY2hpbGQoU2Vzc2lvbiAqcywgY29uc3QgY2hhciAqY29tbWFuZCkKK3sKKwlleHRlcm4gY2hhciAqKmVudmlyb247CisJY2hhciAqKmVudjsKKwljaGFyICphcmd2W0FSR1ZfTUFYXTsKKwljb25zdCBjaGFyICpzaGVsbCwgKnNoZWxsMCwgKmhvc3RuYW1lID0gTlVMTDsKKwlzdHJ1Y3QgcGFzc3dkICpwdyA9IHMtPnB3OworCWludCByID0gMDsKKworCS8qIHJlbW92ZSBob3N0a2V5IGZyb20gdGhlIGNoaWxkJ3MgbWVtb3J5ICovCisJZGVzdHJveV9zZW5zaXRpdmVfZGF0YSgpOworCisJLyogRm9yY2UgYSBwYXNzd29yZCBjaGFuZ2UgKi8KKwlpZiAocy0+YXV0aGN0eHQtPmZvcmNlX3B3Y2hhbmdlKSB7CisJCWRvX3NldHVzZXJjb250ZXh0KHB3KTsKKwkJY2hpbGRfY2xvc2VfZmRzKCk7CisJCWRvX3B3Y2hhbmdlKHMpOworCQlleGl0KDEpOworCX0KKworCS8qIGxvZ2luKDEpIGlzIG9ubHkgY2FsbGVkIGlmIHdlIGV4ZWN1dGUgdGhlIGxvZ2luIHNoZWxsICovCisJaWYgKG9wdGlvbnMudXNlX2xvZ2luICYmIGNvbW1hbmQgIT0gTlVMTCkKKwkJb3B0aW9ucy51c2VfbG9naW4gPSAwOworCisjaWZkZWYgX1VOSUNPUworCWNyYXlfc2V0dXAocHctPnB3X3VpZCwgcHctPnB3X25hbWUsIGNvbW1hbmQpOworI2VuZGlmIC8qIF9VTklDT1MgKi8KKworCS8qCisJICogTG9naW4oMSkgZG9lcyB0aGlzIGFzIHdlbGwsIGFuZCBpdCBuZWVkcyB1aWQgMCBmb3IgdGhlICItaCIKKwkgKiBzd2l0Y2gsIHNvIHdlIGxldCBsb2dpbigxKSB0byB0aGlzIGZvciB1cy4KKwkgKi8KKwlpZiAoIW9wdGlvbnMudXNlX2xvZ2luKSB7CisjaWZkZWYgSEFWRV9PU0ZfU0lBCisJCXNlc3Npb25fc2V0dXBfc2lhKHB3LCBzLT50dHlmZCA9PSAtMSA/IE5VTEwgOiBzLT50dHkpOworCQlpZiAoIWNoZWNrX3F1aWV0bG9naW4ocywgY29tbWFuZCkpCisJCQlkb19tb3RkKCk7CisjZWxzZSAvKiBIQVZFX09TRl9TSUEgKi8KKwkJLyogV2hlbiBQQU0gaXMgZW5hYmxlZCB3ZSByZWx5IG9uIGl0IHRvIGRvIHRoZSBub2xvZ2luIGNoZWNrICovCisJCWlmICghb3B0aW9ucy51c2VfcGFtKQorCQkJZG9fbm9sb2dpbihwdyk7CisJCWRvX3NldHVzZXJjb250ZXh0KHB3KTsKKwkJLyoKKwkJICogUEFNIHNlc3Npb24gbW9kdWxlcyBpbiBkb19zZXR1c2VyY29udGV4dCBtYXkgaGF2ZQorCQkgKiBnZW5lcmF0ZWQgbWVzc2FnZXMsIHNvIGlmIHRoaXMgaW4gYW4gaW50ZXJhY3RpdmUKKwkJICogbG9naW4gdGhlbiBkaXNwbGF5IHRoZW0gdG9vLgorCQkgKi8KKwkJaWYgKCFjaGVja19xdWlldGxvZ2luKHMsIGNvbW1hbmQpKQorCQkJZGlzcGxheV9sb2dpbm1zZygpOworI2VuZGlmIC8qIEhBVkVfT1NGX1NJQSAqLworCX0KKworI2lmZGVmIFVTRV9QQU0KKwlpZiAob3B0aW9ucy51c2VfcGFtICYmICFvcHRpb25zLnVzZV9sb2dpbiAmJiAhaXNfcGFtX3Nlc3Npb25fb3BlbigpKSB7CisJCWRlYnVnMygiUEFNIHNlc3Npb24gbm90IG9wZW5lZCwgZXhpdGluZyIpOworCQlkaXNwbGF5X2xvZ2lubXNnKCk7CisJCWV4aXQoMjU0KTsKKwl9CisjZW5kaWYKKworCS8qCisJICogR2V0IHRoZSBzaGVsbCBmcm9tIHRoZSBwYXNzd29yZCBkYXRhLiAgQW4gZW1wdHkgc2hlbGwgZmllbGQgaXMKKwkgKiBsZWdhbCwgYW5kIG1lYW5zIC9iaW4vc2guCisJICovCisJc2hlbGwgPSAocHctPnB3X3NoZWxsWzBdID09ICdcMCcpID8gX1BBVEhfQlNIRUxMIDogcHctPnB3X3NoZWxsOworCisJLyoKKwkgKiBNYWtlIHN1cmUgJFNIRUxMIHBvaW50cyB0byB0aGUgc2hlbGwgZnJvbSB0aGUgcGFzc3dvcmQgZmlsZSwKKwkgKiBldmVuIGlmIHNoZWxsIGlzIG92ZXJyaWRkZW4gZnJvbSBsb2dpbi5jb25mCisJICovCisJZW52ID0gZG9fc2V0dXBfZW52KHMsIHNoZWxsKTsKKworI2lmZGVmIEhBVkVfTE9HSU5fQ0FQCisJc2hlbGwgPSBsb2dpbl9nZXRjYXBzdHIobGMsICJzaGVsbCIsIChjaGFyICopc2hlbGwsIChjaGFyICopc2hlbGwpOworI2VuZGlmCisKKwkvKiB3ZSBoYXZlIHRvIHN0YXNoIHRoZSBob3N0bmFtZSBiZWZvcmUgd2UgY2xvc2Ugb3VyIHNvY2tldC4gKi8KKwlpZiAob3B0aW9ucy51c2VfbG9naW4pCisJCWhvc3RuYW1lID0gZ2V0X3JlbW90ZV9uYW1lX29yX2lwKHV0bXBfbGVuLAorCQkgICAgb3B0aW9ucy51c2VfZG5zKTsKKwkvKgorCSAqIENsb3NlIHRoZSBjb25uZWN0aW9uIGRlc2NyaXB0b3JzOyBub3RlIHRoYXQgdGhpcyBpcyB0aGUgY2hpbGQsIGFuZAorCSAqIHRoZSBzZXJ2ZXIgd2lsbCBzdGlsbCBoYXZlIHRoZSBzb2NrZXQgb3BlbiwgYW5kIGl0IGlzIGltcG9ydGFudAorCSAqIHRoYXQgd2UgZG8gbm90IHNodXRkb3duIGl0LiAgTm90ZSB0aGF0IHRoZSBkZXNjcmlwdG9ycyBjYW5ub3QgYmUKKwkgKiBjbG9zZWQgYmVmb3JlIGJ1aWxkaW5nIHRoZSBlbnZpcm9ubWVudCwgYXMgd2UgY2FsbAorCSAqIGdldF9yZW1vdGVfaXBhZGRyIHRoZXJlLgorCSAqLworCWNoaWxkX2Nsb3NlX2ZkcygpOworCisJLyoKKwkgKiBNdXN0IHRha2UgbmV3IGVudmlyb25tZW50IGludG8gdXNlIHNvIHRoYXQgLnNzaC9yYywKKwkgKiAvZXRjL3NzaC9zc2hyYyBhbmQgeGF1dGggYXJlIHJ1biBpbiB0aGUgcHJvcGVyIGVudmlyb25tZW50LgorCSAqLworCWVudmlyb24gPSBlbnY7CisKKyNpZiBkZWZpbmVkKEtSQjUpICYmIGRlZmluZWQoVVNFX0FGUykKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQsIHdlIGNoZWNrIHRvIHNlZSBpZiBBRlMgaXMgYWN0aXZlIGFuZCBpZiB3ZSBoYXZlCisJICogYSB2YWxpZCBLZXJiZXJvcyA1IFRHVC4gSWYgc28sIGl0IHNlZW1zIGxpa2UgYSBnb29kIGlkZWEgdG8gc2VlCisJICogaWYgd2UgY2FuIChhbmQgbmVlZCB0bykgZXh0ZW5kIHRoZSB0aWNrZXQgaW50byBhbiBBRlMgdG9rZW4uIElmCisJICogd2UgZG9uJ3QgZG8gdGhpcywgd2UgcnVuIGludG8gcG90ZW50aWFsIHByb2JsZW1zIGlmIHRoZSB1c2VyJ3MKKwkgKiBob21lIGRpcmVjdG9yeSBpcyBpbiBBRlMgYW5kIGl0J3Mgbm90IHdvcmxkLXJlYWRhYmxlLgorCSAqLworCisJaWYgKG9wdGlvbnMua2VyYmVyb3NfZ2V0X2Fmc190b2tlbiAmJiBrX2hhc2FmcygpICYmCisJICAgIChzLT5hdXRoY3R4dC0+a3JiNV9jdHggIT0gTlVMTCkpIHsKKwkJY2hhciBjZWxsWzY0XTsKKworCQlkZWJ1ZygiR2V0dGluZyBBRlMgdG9rZW4iKTsKKworCQlrX3NldHBhZygpOworCisJCWlmIChrX2Fmc19jZWxsX29mX2ZpbGUocHctPnB3X2RpciwgY2VsbCwgc2l6ZW9mKGNlbGwpKSA9PSAwKQorCQkJa3JiNV9hZnNsb2cocy0+YXV0aGN0eHQtPmtyYjVfY3R4LAorCQkJICAgIHMtPmF1dGhjdHh0LT5rcmI1X2Z3ZF9jY2FjaGUsIGNlbGwsIE5VTEwpOworCisJCWtyYjVfYWZzbG9nX2hvbWUocy0+YXV0aGN0eHQtPmtyYjVfY3R4LAorCQkgICAgcy0+YXV0aGN0eHQtPmtyYjVfZndkX2NjYWNoZSwgTlVMTCwgTlVMTCwgcHctPnB3X2Rpcik7CisJfQorI2VuZGlmCisKKwkvKiBDaGFuZ2UgY3VycmVudCBkaXJlY3RvcnkgdG8gdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeS4gKi8KKwlpZiAoY2hkaXIocHctPnB3X2RpcikgPCAwKSB7CisJCS8qIFN1cHByZXNzIG1pc3NpbmcgaG9tZWRpciB3YXJuaW5nIGZvciBjaHJvb3QgY2FzZSAqLworI2lmZGVmIEhBVkVfTE9HSU5fQ0FQCisJCXIgPSBsb2dpbl9nZXRjYXBib29sKGxjLCAicmVxdWlyZWhvbWUiLCAwKTsKKyNlbmRpZgorCQlpZiAociB8fCBvcHRpb25zLmNocm9vdF9kaXJlY3RvcnkgPT0gTlVMTCB8fAorCQkgICAgc3RyY2FzZWNtcChvcHRpb25zLmNocm9vdF9kaXJlY3RvcnksICJub25lIikgPT0gMCkKKwkJCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGNoZGlyIHRvIGhvbWUgIgorCQkJICAgICJkaXJlY3RvcnkgJXM6ICVzXG4iLCBwdy0+cHdfZGlyLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCWlmIChyKQorCQkJZXhpdCgxKTsKKwl9CisKKwljbG9zZWZyb20oU1RERVJSX0ZJTEVOTyArIDEpOworCisJaWYgKCFvcHRpb25zLnVzZV9sb2dpbikKKwkJZG9fcmNfZmlsZXMocywgc2hlbGwpOworCisJLyogcmVzdG9yZSBTSUdQSVBFIGZvciBjaGlsZCAqLworCXNpZ25hbChTSUdQSVBFLCBTSUdfREZMKTsKKworCWlmIChzLT5pc19zdWJzeXN0ZW0gPT0gU1VCU1lTVEVNX0lOVF9TRlRQX0VSUk9SKSB7CisJCXByaW50ZigiVGhpcyBzZXJ2aWNlIGFsbG93cyBzZnRwIGNvbm5lY3Rpb25zIG9ubHkuXG4iKTsKKwkJZmZsdXNoKE5VTEwpOworCQlleGl0KDEpOworCX0gZWxzZSBpZiAocy0+aXNfc3Vic3lzdGVtID09IFNVQlNZU1RFTV9JTlRfU0ZUUCkgeworCQlleHRlcm4gaW50IG9wdGluZCwgb3B0cmVzZXQ7CisJCWludCBpOworCQljaGFyICpwLCAqYXJnczsKKworCQlzZXRwcm9jdGl0bGUoIiVzQCVzIiwgcy0+cHctPnB3X25hbWUsIElOVEVSTkFMX1NGVFBfTkFNRSk7CisJCWFyZ3MgPSB4c3RyZHVwKGNvbW1hbmQgPyBjb21tYW5kIDogInNmdHAtc2VydmVyIik7CisJCWZvciAoaSA9IDAsIChwID0gc3RydG9rKGFyZ3MsICIgIikpOyBwOyAocCA9IHN0cnRvayhOVUxMLCAiICIpKSkKKwkJCWlmIChpIDwgQVJHVl9NQVggLSAxKQorCQkJCWFyZ3ZbaSsrXSA9IHA7CisJCWFyZ3ZbaV0gPSBOVUxMOworCQlvcHRpbmQgPSBvcHRyZXNldCA9IDE7CisJCV9fcHJvZ25hbWUgPSBhcmd2WzBdOworI2lmZGVmIFdJVEhfU0VMSU5VWAorCQlzc2hfc2VsaW51eF9jaGFuZ2VfY29udGV4dCgic2Z0cGRfdCIpOworI2VuZGlmCisJCWV4aXQoc2Z0cF9zZXJ2ZXJfbWFpbihpLCBhcmd2LCBzLT5wdykpOworCX0KKworCWZmbHVzaChOVUxMKTsKKworCWlmIChvcHRpb25zLnVzZV9sb2dpbikgeworCQlsYXVuY2hfbG9naW4ocHcsIGhvc3RuYW1lKTsKKwkJLyogTkVWRVJSRUFDSEVEICovCisJfQorCisJLyogR2V0IHRoZSBsYXN0IGNvbXBvbmVudCBvZiB0aGUgc2hlbGwgbmFtZS4gKi8KKwlpZiAoKHNoZWxsMCA9IHN0cnJjaHIoc2hlbGwsICcvJykpICE9IE5VTEwpCisJCXNoZWxsMCsrOworCWVsc2UKKwkJc2hlbGwwID0gc2hlbGw7CisKKwkvKgorCSAqIElmIHdlIGhhdmUgbm8gY29tbWFuZCwgZXhlY3V0ZSB0aGUgc2hlbGwuICBJbiB0aGlzIGNhc2UsIHRoZSBzaGVsbAorCSAqIG5hbWUgdG8gYmUgcGFzc2VkIGluIGFyZ3ZbMF0gaXMgcHJlY2VkZWQgYnkgJy0nIHRvIGluZGljYXRlIHRoYXQKKwkgKiB0aGlzIGlzIGEgbG9naW4gc2hlbGwuCisJICovCisJaWYgKCFjb21tYW5kKSB7CisJCWNoYXIgYXJndjBbMjU2XTsKKworCQkvKiBTdGFydCB0aGUgc2hlbGwuICBTZXQgaW5pdGlhbCBjaGFyYWN0ZXIgdG8gJy0nLiAqLworCQlhcmd2MFswXSA9ICctJzsKKworCQlpZiAoc3RybGNweShhcmd2MCArIDEsIHNoZWxsMCwgc2l6ZW9mKGFyZ3YwKSAtIDEpCisJCSAgICA+PSBzaXplb2YoYXJndjApIC0gMSkgeworCQkJZXJybm8gPSBFSU5WQUw7CisJCQlwZXJyb3Ioc2hlbGwpOworCQkJZXhpdCgxKTsKKwkJfQorCisJCS8qIEV4ZWN1dGUgdGhlIHNoZWxsLiAqLworCQlhcmd2WzBdID0gYXJndjA7CisJCWFyZ3ZbMV0gPSBOVUxMOworCQlleGVjdmUoc2hlbGwsIGFyZ3YsIGVudik7CisKKwkJLyogRXhlY3V0aW5nIHRoZSBzaGVsbCBmYWlsZWQuICovCisJCXBlcnJvcihzaGVsbCk7CisJCWV4aXQoMSk7CisJfQorCS8qCisJICogRXhlY3V0ZSB0aGUgY29tbWFuZCB1c2luZyB0aGUgdXNlcidzIHNoZWxsLiAgVGhpcyB1c2VzIHRoZSAtYworCSAqIG9wdGlvbiB0byBleGVjdXRlIHRoZSBjb21tYW5kLgorCSAqLworCWFyZ3ZbMF0gPSAoY2hhciAqKSBzaGVsbDA7CisJYXJndlsxXSA9ICItYyI7CisJYXJndlsyXSA9IChjaGFyICopIGNvbW1hbmQ7CisJYXJndlszXSA9IE5VTEw7CisJZXhlY3ZlKHNoZWxsLCBhcmd2LCBlbnYpOworCXBlcnJvcihzaGVsbCk7CisJZXhpdCgxKTsKK30KKwordm9pZAorc2Vzc2lvbl91bnVzZWQoaW50IGlkKQoreworCWRlYnVnMygiJXM6IHNlc3Npb24gaWQgJWQgdW51c2VkIiwgX19mdW5jX18sIGlkKTsKKwlpZiAoaWQgPj0gb3B0aW9ucy5tYXhfc2Vzc2lvbnMgfHwKKwkgICAgaWQgPj0gc2Vzc2lvbnNfbmFsbG9jKSB7CisJCWZhdGFsKCIlczogaW5zYW5lIHNlc3Npb24gaWQgJWQgKG1heCAlZCBuYWxsb2MgJWQpIiwKKwkJICAgIF9fZnVuY19fLCBpZCwgb3B0aW9ucy5tYXhfc2Vzc2lvbnMsIHNlc3Npb25zX25hbGxvYyk7CisJfQorCWJ6ZXJvKCZzZXNzaW9uc1tpZF0sIHNpemVvZigqc2Vzc2lvbnMpKTsKKwlzZXNzaW9uc1tpZF0uc2VsZiA9IGlkOworCXNlc3Npb25zW2lkXS51c2VkID0gMDsKKwlzZXNzaW9uc1tpZF0uY2hhbmlkID0gLTE7CisJc2Vzc2lvbnNbaWRdLnB0eWZkID0gLTE7CisJc2Vzc2lvbnNbaWRdLnR0eWZkID0gLTE7CisJc2Vzc2lvbnNbaWRdLnB0eW1hc3RlciA9IC0xOworCXNlc3Npb25zW2lkXS54MTFfY2hhbmlkcyA9IE5VTEw7CisJc2Vzc2lvbnNbaWRdLm5leHRfdW51c2VkID0gc2Vzc2lvbnNfZmlyc3RfdW51c2VkOworCXNlc3Npb25zX2ZpcnN0X3VudXNlZCA9IGlkOworfQorCitTZXNzaW9uICoKK3Nlc3Npb25fbmV3KHZvaWQpCit7CisJU2Vzc2lvbiAqcywgKnRtcDsKKworCWlmIChzZXNzaW9uc19maXJzdF91bnVzZWQgPT0gLTEpIHsKKwkJaWYgKHNlc3Npb25zX25hbGxvYyA+PSBvcHRpb25zLm1heF9zZXNzaW9ucykKKwkJCXJldHVybiBOVUxMOworCQlkZWJ1ZzIoIiVzOiBhbGxvY2F0ZSAoYWxsb2NhdGVkICVkIG1heCAlZCkiLAorCQkgICAgX19mdW5jX18sIHNlc3Npb25zX25hbGxvYywgb3B0aW9ucy5tYXhfc2Vzc2lvbnMpOworCQl0bXAgPSB4cmVhbGxvYyhzZXNzaW9ucywgc2Vzc2lvbnNfbmFsbG9jICsgMSwKKwkJICAgIHNpemVvZigqc2Vzc2lvbnMpKTsKKwkJaWYgKHRtcCA9PSBOVUxMKSB7CisJCQllcnJvcigiJXM6IGNhbm5vdCBhbGxvY2F0ZSAlZCBzZXNzaW9ucyIsCisJCQkgICAgX19mdW5jX18sIHNlc3Npb25zX25hbGxvYyArIDEpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJc2Vzc2lvbnMgPSB0bXA7CisJCXNlc3Npb25fdW51c2VkKHNlc3Npb25zX25hbGxvYysrKTsKKwl9CisKKwlpZiAoc2Vzc2lvbnNfZmlyc3RfdW51c2VkID49IHNlc3Npb25zX25hbGxvYyB8fAorCSAgICBzZXNzaW9uc19maXJzdF91bnVzZWQgPCAwKSB7CisJCWZhdGFsKCIlczogaW5zYW5lIGZpcnN0X3VudXNlZCAlZCBtYXggJWQgbmFsbG9jICVkIiwKKwkJICAgIF9fZnVuY19fLCBzZXNzaW9uc19maXJzdF91bnVzZWQsIG9wdGlvbnMubWF4X3Nlc3Npb25zLAorCQkgICAgc2Vzc2lvbnNfbmFsbG9jKTsKKwl9CisKKwlzID0gJnNlc3Npb25zW3Nlc3Npb25zX2ZpcnN0X3VudXNlZF07CisJaWYgKHMtPnVzZWQpIHsKKwkJZmF0YWwoIiVzOiBzZXNzaW9uICVkIGFscmVhZHkgdXNlZCIsCisJCSAgICBfX2Z1bmNfXywgc2Vzc2lvbnNfZmlyc3RfdW51c2VkKTsKKwl9CisJc2Vzc2lvbnNfZmlyc3RfdW51c2VkID0gcy0+bmV4dF91bnVzZWQ7CisJcy0+dXNlZCA9IDE7CisJcy0+bmV4dF91bnVzZWQgPSAtMTsKKwlkZWJ1Zygic2Vzc2lvbl9uZXc6IHNlc3Npb24gJWQiLCBzLT5zZWxmKTsKKworCXJldHVybiBzOworfQorCitzdGF0aWMgdm9pZAorc2Vzc2lvbl9kdW1wKHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHNlc3Npb25zX25hbGxvYzsgaSsrKSB7CisJCVNlc3Npb24gKnMgPSAmc2Vzc2lvbnNbaV07CisKKwkJZGVidWcoImR1bXA6IHVzZWQgJWQgbmV4dF91bnVzZWQgJWQgc2Vzc2lvbiAlZCAlcCAiCisJCSAgICAiY2hhbm5lbCAlZCBwaWQgJWxkIiwKKwkJICAgIHMtPnVzZWQsCisJCSAgICBzLT5uZXh0X3VudXNlZCwKKwkJICAgIHMtPnNlbGYsCisJCSAgICBzLAorCQkgICAgcy0+Y2hhbmlkLAorCQkgICAgKGxvbmcpcy0+cGlkKTsKKwl9Cit9CisKK2ludAorc2Vzc2lvbl9vcGVuKEF1dGhjdHh0ICphdXRoY3R4dCwgaW50IGNoYW5pZCkKK3sKKwlTZXNzaW9uICpzID0gc2Vzc2lvbl9uZXcoKTsKKwlkZWJ1Zygic2Vzc2lvbl9vcGVuOiBjaGFubmVsICVkIiwgY2hhbmlkKTsKKwlpZiAocyA9PSBOVUxMKSB7CisJCWVycm9yKCJubyBtb3JlIHNlc3Npb25zIik7CisJCXJldHVybiAwOworCX0KKwlzLT5hdXRoY3R4dCA9IGF1dGhjdHh0OworCXMtPnB3ID0gYXV0aGN0eHQtPnB3OworCWlmIChzLT5wdyA9PSBOVUxMIHx8ICFhdXRoY3R4dC0+dmFsaWQpCisJCWZhdGFsKCJubyB1c2VyIGZvciBzZXNzaW9uICVkIiwgcy0+c2VsZik7CisJZGVidWcoInNlc3Npb25fb3Blbjogc2Vzc2lvbiAlZDogbGluayB3aXRoIGNoYW5uZWwgJWQiLCBzLT5zZWxmLCBjaGFuaWQpOworCXMtPmNoYW5pZCA9IGNoYW5pZDsKKwlyZXR1cm4gMTsKK30KKworU2Vzc2lvbiAqCitzZXNzaW9uX2J5X3R0eShjaGFyICp0dHkpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHNlc3Npb25zX25hbGxvYzsgaSsrKSB7CisJCVNlc3Npb24gKnMgPSAmc2Vzc2lvbnNbaV07CisJCWlmIChzLT51c2VkICYmIHMtPnR0eWZkICE9IC0xICYmIHN0cmNtcChzLT50dHksIHR0eSkgPT0gMCkgeworCQkJZGVidWcoInNlc3Npb25fYnlfdHR5OiBzZXNzaW9uICVkIHR0eSAlcyIsIGksIHR0eSk7CisJCQlyZXR1cm4gczsKKwkJfQorCX0KKwlkZWJ1Zygic2Vzc2lvbl9ieV90dHk6IHVua25vd24gdHR5ICUuMTAwcyIsIHR0eSk7CisJc2Vzc2lvbl9kdW1wKCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBTZXNzaW9uICoKK3Nlc3Npb25fYnlfY2hhbm5lbChpbnQgaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHNlc3Npb25zX25hbGxvYzsgaSsrKSB7CisJCVNlc3Npb24gKnMgPSAmc2Vzc2lvbnNbaV07CisJCWlmIChzLT51c2VkICYmIHMtPmNoYW5pZCA9PSBpZCkgeworCQkJZGVidWcoInNlc3Npb25fYnlfY2hhbm5lbDogc2Vzc2lvbiAlZCBjaGFubmVsICVkIiwKKwkJCSAgICBpLCBpZCk7CisJCQlyZXR1cm4gczsKKwkJfQorCX0KKwlkZWJ1Zygic2Vzc2lvbl9ieV9jaGFubmVsOiB1bmtub3duIGNoYW5uZWwgJWQiLCBpZCk7CisJc2Vzc2lvbl9kdW1wKCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBTZXNzaW9uICoKK3Nlc3Npb25fYnlfeDExX2NoYW5uZWwoaW50IGlkKQoreworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IHNlc3Npb25zX25hbGxvYzsgaSsrKSB7CisJCVNlc3Npb24gKnMgPSAmc2Vzc2lvbnNbaV07CisKKwkJaWYgKHMtPngxMV9jaGFuaWRzID09IE5VTEwgfHwgIXMtPnVzZWQpCisJCQljb250aW51ZTsKKwkJZm9yIChqID0gMDsgcy0+eDExX2NoYW5pZHNbal0gIT0gLTE7IGorKykgeworCQkJaWYgKHMtPngxMV9jaGFuaWRzW2pdID09IGlkKSB7CisJCQkJZGVidWcoInNlc3Npb25fYnlfeDExX2NoYW5uZWw6IHNlc3Npb24gJWQgIgorCQkJCSAgICAiY2hhbm5lbCAlZCIsIHMtPnNlbGYsIGlkKTsKKwkJCQlyZXR1cm4gczsKKwkJCX0KKwkJfQorCX0KKwlkZWJ1Zygic2Vzc2lvbl9ieV94MTFfY2hhbm5lbDogdW5rbm93biBjaGFubmVsICVkIiwgaWQpOworCXNlc3Npb25fZHVtcCgpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgU2Vzc2lvbiAqCitzZXNzaW9uX2J5X3BpZChwaWRfdCBwaWQpCit7CisJaW50IGk7CisJZGVidWcoInNlc3Npb25fYnlfcGlkOiBwaWQgJWxkIiwgKGxvbmcpcGlkKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2Vzc2lvbnNfbmFsbG9jOyBpKyspIHsKKwkJU2Vzc2lvbiAqcyA9ICZzZXNzaW9uc1tpXTsKKwkJaWYgKHMtPnVzZWQgJiYgcy0+cGlkID09IHBpZCkKKwkJCXJldHVybiBzOworCX0KKwllcnJvcigic2Vzc2lvbl9ieV9waWQ6IHVua25vd24gcGlkICVsZCIsIChsb25nKXBpZCk7CisJc2Vzc2lvbl9kdW1wKCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK3Nlc3Npb25fd2luZG93X2NoYW5nZV9yZXEoU2Vzc2lvbiAqcykKK3sKKwlzLT5jb2wgPSBwYWNrZXRfZ2V0X2ludCgpOworCXMtPnJvdyA9IHBhY2tldF9nZXRfaW50KCk7CisJcy0+eHBpeGVsID0gcGFja2V0X2dldF9pbnQoKTsKKwlzLT55cGl4ZWwgPSBwYWNrZXRfZ2V0X2ludCgpOworCXBhY2tldF9jaGVja19lb20oKTsKKwlwdHlfY2hhbmdlX3dpbmRvd19zaXplKHMtPnB0eWZkLCBzLT5yb3csIHMtPmNvbCwgcy0+eHBpeGVsLCBzLT55cGl4ZWwpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitzZXNzaW9uX3B0eV9yZXEoU2Vzc2lvbiAqcykKK3sKKwl1X2ludCBsZW47CisJaW50IG5fYnl0ZXM7CisKKwlpZiAobm9fcHR5X2ZsYWcpIHsKKwkJZGVidWcoIkFsbG9jYXRpbmcgYSBwdHkgbm90IHBlcm1pdHRlZCBmb3IgdGhpcyBhdXRoZW50aWNhdGlvbi4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChzLT50dHlmZCAhPSAtMSkgeworCQlwYWNrZXRfZGlzY29ubmVjdCgiUHJvdG9jb2wgZXJyb3I6IHlvdSBhbHJlYWR5IGhhdmUgYSBwdHkuIik7CisJCXJldHVybiAwOworCX0KKworCXMtPnRlcm0gPSBwYWNrZXRfZ2V0X3N0cmluZygmbGVuKTsKKworCWlmIChjb21wYXQyMCkgeworCQlzLT5jb2wgPSBwYWNrZXRfZ2V0X2ludCgpOworCQlzLT5yb3cgPSBwYWNrZXRfZ2V0X2ludCgpOworCX0gZWxzZSB7CisJCXMtPnJvdyA9IHBhY2tldF9nZXRfaW50KCk7CisJCXMtPmNvbCA9IHBhY2tldF9nZXRfaW50KCk7CisJfQorCXMtPnhwaXhlbCA9IHBhY2tldF9nZXRfaW50KCk7CisJcy0+eXBpeGVsID0gcGFja2V0X2dldF9pbnQoKTsKKworCWlmIChzdHJjbXAocy0+dGVybSwgIiIpID09IDApIHsKKwkJeGZyZWUocy0+dGVybSk7CisJCXMtPnRlcm0gPSBOVUxMOworCX0KKworCS8qIEFsbG9jYXRlIGEgcHR5IGFuZCBvcGVuIGl0LiAqLworCWRlYnVnKCJBbGxvY2F0aW5nIHB0eS4iKTsKKwlpZiAoIVBSSVZTRVAocHR5X2FsbG9jYXRlKCZzLT5wdHlmZCwgJnMtPnR0eWZkLCBzLT50dHksCisJICAgIHNpemVvZihzLT50dHkpKSkpIHsKKwkJaWYgKHMtPnRlcm0pCisJCQl4ZnJlZShzLT50ZXJtKTsKKwkJcy0+dGVybSA9IE5VTEw7CisJCXMtPnB0eWZkID0gLTE7CisJCXMtPnR0eWZkID0gLTE7CisJCWVycm9yKCJzZXNzaW9uX3B0eV9yZXE6IHNlc3Npb24gJWQgYWxsb2MgZmFpbGVkIiwgcy0+c2VsZik7CisJCXJldHVybiAwOworCX0KKwlkZWJ1Zygic2Vzc2lvbl9wdHlfcmVxOiBzZXNzaW9uICVkIGFsbG9jICVzIiwgcy0+c2VsZiwgcy0+dHR5KTsKKworCS8qIGZvciBTU0gxIHRoZSB0dHkgbW9kZXMgbGVuZ3RoIGlzIG5vdCBnaXZlbiAqLworCWlmICghY29tcGF0MjApCisJCW5fYnl0ZXMgPSBwYWNrZXRfcmVtYWluaW5nKCk7CisJdHR5X3BhcnNlX21vZGVzKHMtPnR0eWZkLCAmbl9ieXRlcyk7CisKKwlpZiAoIXVzZV9wcml2c2VwKQorCQlwdHlfc2V0b3duZXIocy0+cHcsIHMtPnR0eSk7CisKKwkvKiBTZXQgd2luZG93IHNpemUgZnJvbSB0aGUgcGFja2V0LiAqLworCXB0eV9jaGFuZ2Vfd2luZG93X3NpemUocy0+cHR5ZmQsIHMtPnJvdywgcy0+Y29sLCBzLT54cGl4ZWwsIHMtPnlwaXhlbCk7CisKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisJc2Vzc2lvbl9wcm9jdGl0bGUocyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK3Nlc3Npb25fc3Vic3lzdGVtX3JlcShTZXNzaW9uICpzKQoreworCXN0cnVjdCBzdGF0IHN0OworCXVfaW50IGxlbjsKKwlpbnQgc3VjY2VzcyA9IDA7CisJY2hhciAqcHJvZywgKmNtZCwgKnN1YnN5cyA9IHBhY2tldF9nZXRfc3RyaW5nKCZsZW4pOworCXVfaW50IGk7CisKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisJbG9naXQoInN1YnN5c3RlbSByZXF1ZXN0IGZvciAlLjEwMHMgYnkgdXNlciAlcyIsIHN1YnN5cywKKwkgICAgcy0+cHctPnB3X25hbWUpOworCisJZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubnVtX3N1YnN5c3RlbXM7IGkrKykgeworCQlpZiAoc3RyY21wKHN1YnN5cywgb3B0aW9ucy5zdWJzeXN0ZW1fbmFtZVtpXSkgPT0gMCkgeworCQkJcHJvZyA9IG9wdGlvbnMuc3Vic3lzdGVtX2NvbW1hbmRbaV07CisJCQljbWQgPSBvcHRpb25zLnN1YnN5c3RlbV9hcmdzW2ldOworCQkJaWYgKHN0cmNtcChJTlRFUk5BTF9TRlRQX05BTUUsIHByb2cpID09IDApIHsKKwkJCQlzLT5pc19zdWJzeXN0ZW0gPSBTVUJTWVNURU1fSU5UX1NGVFA7CisJCQkJZGVidWcoInN1YnN5c3RlbTogJXMiLCBwcm9nKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHN0YXQocHJvZywgJnN0KSA8IDApCisJCQkJCWRlYnVnKCJzdWJzeXN0ZW06IGNhbm5vdCBzdGF0ICVzOiAlcyIsCisJCQkJCSAgICBwcm9nLCBzdHJlcnJvcihlcnJubykpOworCQkJCXMtPmlzX3N1YnN5c3RlbSA9IFNVQlNZU1RFTV9FWFQ7CisJCQkJZGVidWcoInN1YnN5c3RlbTogZXhlYygpICVzIiwgY21kKTsKKwkJCX0KKwkJCXN1Y2Nlc3MgPSBkb19leGVjKHMsIGNtZCkgPT0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFzdWNjZXNzKQorCQlsb2dpdCgic3Vic3lzdGVtIHJlcXVlc3QgZm9yICUuMTAwcyBmYWlsZWQsIHN1YnN5c3RlbSBub3QgZm91bmQiLAorCQkgICAgc3Vic3lzKTsKKworCXhmcmVlKHN1YnN5cyk7CisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK3N0YXRpYyBpbnQKK3Nlc3Npb25feDExX3JlcShTZXNzaW9uICpzKQoreworCWludCBzdWNjZXNzOworCisJaWYgKHMtPmF1dGhfcHJvdG8gIT0gTlVMTCB8fCBzLT5hdXRoX2RhdGEgIT0gTlVMTCkgeworCQllcnJvcigic2Vzc2lvbl94MTFfcmVxOiBzZXNzaW9uICVkOiAiCisJCSAgICAieDExIGZvcndhcmRpbmcgYWxyZWFkeSBhY3RpdmUiLCBzLT5zZWxmKTsKKwkJcmV0dXJuIDA7CisJfQorCXMtPnNpbmdsZV9jb25uZWN0aW9uID0gcGFja2V0X2dldF9jaGFyKCk7CisJcy0+YXV0aF9wcm90byA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOworCXMtPmF1dGhfZGF0YSA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOworCXMtPnNjcmVlbiA9IHBhY2tldF9nZXRfaW50KCk7CisJcGFja2V0X2NoZWNrX2VvbSgpOworCisJc3VjY2VzcyA9IHNlc3Npb25fc2V0dXBfeDExZndkKHMpOworCWlmICghc3VjY2VzcykgeworCQl4ZnJlZShzLT5hdXRoX3Byb3RvKTsKKwkJeGZyZWUocy0+YXV0aF9kYXRhKTsKKwkJcy0+YXV0aF9wcm90byA9IE5VTEw7CisJCXMtPmF1dGhfZGF0YSA9IE5VTEw7CisJfQorCXJldHVybiBzdWNjZXNzOworfQorCitzdGF0aWMgaW50CitzZXNzaW9uX3NoZWxsX3JlcShTZXNzaW9uICpzKQoreworCXBhY2tldF9jaGVja19lb20oKTsKKwlyZXR1cm4gZG9fZXhlYyhzLCBOVUxMKSA9PSAwOworfQorCitzdGF0aWMgaW50CitzZXNzaW9uX2V4ZWNfcmVxKFNlc3Npb24gKnMpCit7CisJdV9pbnQgbGVuLCBzdWNjZXNzOworCisJY2hhciAqY29tbWFuZCA9IHBhY2tldF9nZXRfc3RyaW5nKCZsZW4pOworCXBhY2tldF9jaGVja19lb20oKTsKKwlzdWNjZXNzID0gZG9fZXhlYyhzLCBjb21tYW5kKSA9PSAwOworCXhmcmVlKGNvbW1hbmQpOworCXJldHVybiBzdWNjZXNzOworfQorCitzdGF0aWMgaW50CitzZXNzaW9uX2JyZWFrX3JlcShTZXNzaW9uICpzKQoreworCisJcGFja2V0X2dldF9pbnQoKTsJLyogaWdub3JlZCAqLworCXBhY2tldF9jaGVja19lb20oKTsKKworCWlmIChzLT5wdHltYXN0ZXIgPT0gLTEgfHwgdGNzZW5kYnJlYWsocy0+cHR5bWFzdGVyLCAwKSA8IDApCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitzZXNzaW9uX2Vudl9yZXEoU2Vzc2lvbiAqcykKK3sKKwljaGFyICpuYW1lLCAqdmFsOworCXVfaW50IG5hbWVfbGVuLCB2YWxfbGVuLCBpOworCisJbmFtZSA9IHBhY2tldF9nZXRfc3RyaW5nKCZuYW1lX2xlbik7CisJdmFsID0gcGFja2V0X2dldF9zdHJpbmcoJnZhbF9sZW4pOworCXBhY2tldF9jaGVja19lb20oKTsKKworCS8qIERvbid0IHNldCB0b28gbWFueSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKi8KKwlpZiAocy0+bnVtX2VudiA+IDEyOCkgeworCQlkZWJ1ZzIoIklnbm9yaW5nIGVudiByZXF1ZXN0ICVzOiB0b28gbWFueSBlbnYgdmFycyIsIG5hbWUpOworCQlnb3RvIGZhaWw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubnVtX2FjY2VwdF9lbnY7IGkrKykgeworCQlpZiAobWF0Y2hfcGF0dGVybihuYW1lLCBvcHRpb25zLmFjY2VwdF9lbnZbaV0pKSB7CisJCQlkZWJ1ZzIoIlNldHRpbmcgZW52ICVkOiAlcz0lcyIsIHMtPm51bV9lbnYsIG5hbWUsIHZhbCk7CisJCQlzLT5lbnYgPSB4cmVhbGxvYyhzLT5lbnYsIHMtPm51bV9lbnYgKyAxLAorCQkJICAgIHNpemVvZigqcy0+ZW52KSk7CisJCQlzLT5lbnZbcy0+bnVtX2Vudl0ubmFtZSA9IG5hbWU7CisJCQlzLT5lbnZbcy0+bnVtX2Vudl0udmFsID0gdmFsOworCQkJcy0+bnVtX2VudisrOworCQkJcmV0dXJuICgxKTsKKwkJfQorCX0KKwlkZWJ1ZzIoIklnbm9yaW5nIGVudiByZXF1ZXN0ICVzOiBkaXNhbGxvd2VkIG5hbWUiLCBuYW1lKTsKKworIGZhaWw6CisJeGZyZWUobmFtZSk7CisJeGZyZWUodmFsKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitzZXNzaW9uX2F1dGhfYWdlbnRfcmVxKFNlc3Npb24gKnMpCit7CisJc3RhdGljIGludCBjYWxsZWQgPSAwOworCXBhY2tldF9jaGVja19lb20oKTsKKwlpZiAobm9fYWdlbnRfZm9yd2FyZGluZ19mbGFnIHx8ICFvcHRpb25zLmFsbG93X2FnZW50X2ZvcndhcmRpbmcpIHsKKwkJZGVidWcoInNlc3Npb25fYXV0aF9hZ2VudF9yZXE6IG5vX2FnZW50X2ZvcndhcmRpbmdfZmxhZyIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGNhbGxlZCkgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQljYWxsZWQgPSAxOworCQlyZXR1cm4gYXV0aF9pbnB1dF9yZXF1ZXN0X2ZvcndhcmRpbmcocy0+cHcpOworCX0KK30KKworaW50CitzZXNzaW9uX2lucHV0X2NoYW5uZWxfcmVxKENoYW5uZWwgKmMsIGNvbnN0IGNoYXIgKnJ0eXBlKQoreworCWludCBzdWNjZXNzID0gMDsKKwlTZXNzaW9uICpzOworCisJaWYgKChzID0gc2Vzc2lvbl9ieV9jaGFubmVsKGMtPnNlbGYpKSA9PSBOVUxMKSB7CisJCWxvZ2l0KCJzZXNzaW9uX2lucHV0X2NoYW5uZWxfcmVxOiBubyBzZXNzaW9uICVkIHJlcSAlLjEwMHMiLAorCQkgICAgYy0+c2VsZiwgcnR5cGUpOworCQlyZXR1cm4gMDsKKwl9CisJZGVidWcoInNlc3Npb25faW5wdXRfY2hhbm5lbF9yZXE6IHNlc3Npb24gJWQgcmVxICVzIiwgcy0+c2VsZiwgcnR5cGUpOworCisJLyoKKwkgKiBhIHNlc3Npb24gaXMgaW4gTEFSVkFMIHN0YXRlIHVudGlsIGEgc2hlbGwsIGEgY29tbWFuZAorCSAqIG9yIGEgc3Vic3lzdGVtIGlzIGV4ZWN1dGVkCisJICovCisJaWYgKGMtPnR5cGUgPT0gU1NIX0NIQU5ORUxfTEFSVkFMKSB7CisJCWlmIChzdHJjbXAocnR5cGUsICJzaGVsbCIpID09IDApIHsKKwkJCXN1Y2Nlc3MgPSBzZXNzaW9uX3NoZWxsX3JlcShzKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAocnR5cGUsICJleGVjIikgPT0gMCkgeworCQkJc3VjY2VzcyA9IHNlc3Npb25fZXhlY19yZXEocyk7CisJCX0gZWxzZSBpZiAoc3RyY21wKHJ0eXBlLCAicHR5LXJlcSIpID09IDApIHsKKwkJCXN1Y2Nlc3MgPSBzZXNzaW9uX3B0eV9yZXEocyk7CisJCX0gZWxzZSBpZiAoc3RyY21wKHJ0eXBlLCAieDExLXJlcSIpID09IDApIHsKKwkJCXN1Y2Nlc3MgPSBzZXNzaW9uX3gxMV9yZXEocyk7CisJCX0gZWxzZSBpZiAoc3RyY21wKHJ0eXBlLCAiYXV0aC1hZ2VudC1yZXFAb3BlbnNzaC5jb20iKSA9PSAwKSB7CisJCQlzdWNjZXNzID0gc2Vzc2lvbl9hdXRoX2FnZW50X3JlcShzKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAocnR5cGUsICJzdWJzeXN0ZW0iKSA9PSAwKSB7CisJCQlzdWNjZXNzID0gc2Vzc2lvbl9zdWJzeXN0ZW1fcmVxKHMpOworCQl9IGVsc2UgaWYgKHN0cmNtcChydHlwZSwgImVudiIpID09IDApIHsKKwkJCXN1Y2Nlc3MgPSBzZXNzaW9uX2Vudl9yZXEocyk7CisJCX0KKwl9CisJaWYgKHN0cmNtcChydHlwZSwgIndpbmRvdy1jaGFuZ2UiKSA9PSAwKSB7CisJCXN1Y2Nlc3MgPSBzZXNzaW9uX3dpbmRvd19jaGFuZ2VfcmVxKHMpOworCX0gZWxzZSBpZiAoc3RyY21wKHJ0eXBlLCAiYnJlYWsiKSA9PSAwKSB7CisJCXN1Y2Nlc3MgPSBzZXNzaW9uX2JyZWFrX3JlcShzKTsKKwl9CisKKwlyZXR1cm4gc3VjY2VzczsKK30KKwordm9pZAorc2Vzc2lvbl9zZXRfZmRzKFNlc3Npb24gKnMsIGludCBmZGluLCBpbnQgZmRvdXQsIGludCBmZGVyciwgaW50IGlnbm9yZV9mZGVyciwKKyAgICBpbnQgaXNfdHR5KQoreworCWlmICghY29tcGF0MjApCisJCWZhdGFsKCJzZXNzaW9uX3NldF9mZHM6IGNhbGxlZCBmb3IgcHJvdG8gIT0gMi4wIik7CisJLyoKKwkgKiBub3cgdGhhdCBoYXZlIGEgY2hpbGQgYW5kIGEgcGlwZSB0byB0aGUgY2hpbGQsCisJICogd2UgY2FuIGFjdGl2YXRlIG91ciBjaGFubmVsIGFuZCByZWdpc3RlciB0aGUgZmQncworCSAqLworCWlmIChzLT5jaGFuaWQgPT0gLTEpCisJCWZhdGFsKCJubyBjaGFubmVsIGZvciBzZXNzaW9uICVkIiwgcy0+c2VsZik7CisJY2hhbm5lbF9zZXRfZmRzKHMtPmNoYW5pZCwKKwkgICAgZmRvdXQsIGZkaW4sIGZkZXJyLAorCSAgICBpZ25vcmVfZmRlcnIgPyBDSEFOX0VYVEVOREVEX0lHTk9SRSA6IENIQU5fRVhURU5ERURfUkVBRCwKKwkgICAgMSwgaXNfdHR5LCBDSEFOX1NFU19XSU5ET1dfREVGQVVMVCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB0byBwZXJmb3JtIHB0eSBjbGVhbnVwLiBBbHNvIGNhbGxlZCBpZiB3ZSBnZXQgYWJvcnRlZCBhYm5vcm1hbGx5CisgKiAoZS5nLiwgZHVlIHRvIGEgZHJvcHBlZCBjb25uZWN0aW9uKS4KKyAqLwordm9pZAorc2Vzc2lvbl9wdHlfY2xlYW51cDIoU2Vzc2lvbiAqcykKK3sKKwlpZiAocyA9PSBOVUxMKSB7CisJCWVycm9yKCJzZXNzaW9uX3B0eV9jbGVhbnVwOiBubyBzZXNzaW9uIik7CisJCXJldHVybjsKKwl9CisJaWYgKHMtPnR0eWZkID09IC0xKQorCQlyZXR1cm47CisKKwlkZWJ1Zygic2Vzc2lvbl9wdHlfY2xlYW51cDogc2Vzc2lvbiAlZCByZWxlYXNlICVzIiwgcy0+c2VsZiwgcy0+dHR5KTsKKworCS8qIFJlY29yZCB0aGF0IHRoZSB1c2VyIGhhcyBsb2dnZWQgb3V0LiAqLworCWlmIChzLT5waWQgIT0gMCkKKwkJcmVjb3JkX2xvZ291dChzLT5waWQsIHMtPnR0eSwgcy0+cHctPnB3X25hbWUpOworCisJLyogUmVsZWFzZSB0aGUgcHNldWRvLXR0eS4gKi8KKwlpZiAoZ2V0dWlkKCkgPT0gMCkKKwkJcHR5X3JlbGVhc2Uocy0+dHR5KTsKKworCS8qCisJICogQ2xvc2UgdGhlIHNlcnZlciBzaWRlIG9mIHRoZSBzb2NrZXQgcGFpcnMuICBXZSBtdXN0IGRvIHRoaXMgYWZ0ZXIKKwkgKiB0aGUgcHR5IGNsZWFudXAsIHNvIHRoYXQgYW5vdGhlciBwcm9jZXNzIGRvZXNuJ3QgZ2V0IHRoaXMgcHR5CisJICogd2hpbGUgd2UncmUgc3RpbGwgY2xlYW5pbmcgdXAuCisJICovCisJaWYgKHMtPnB0eW1hc3RlciAhPSAtMSAmJiBjbG9zZShzLT5wdHltYXN0ZXIpIDwgMCkKKwkJZXJyb3IoImNsb3NlKHMtPnB0eW1hc3Rlci8lZCk6ICVzIiwKKwkJICAgIHMtPnB0eW1hc3Rlciwgc3RyZXJyb3IoZXJybm8pKTsKKworCS8qIHVubGluayBwdHkgZnJvbSBzZXNzaW9uICovCisJcy0+dHR5ZmQgPSAtMTsKK30KKwordm9pZAorc2Vzc2lvbl9wdHlfY2xlYW51cChTZXNzaW9uICpzKQoreworCVBSSVZTRVAoc2Vzc2lvbl9wdHlfY2xlYW51cDIocykpOworfQorCitzdGF0aWMgY2hhciAqCitzaWcybmFtZShpbnQgc2lnKQoreworI2RlZmluZSBTU0hfU0lHKHgpIGlmIChzaWcgPT0gU0lHICMjIHgpIHJldHVybiAjeAorCVNTSF9TSUcoQUJSVCk7CisJU1NIX1NJRyhBTFJNKTsKKwlTU0hfU0lHKEZQRSk7CisJU1NIX1NJRyhIVVApOworCVNTSF9TSUcoSUxMKTsKKwlTU0hfU0lHKElOVCk7CisJU1NIX1NJRyhLSUxMKTsKKwlTU0hfU0lHKFBJUEUpOworCVNTSF9TSUcoUVVJVCk7CisJU1NIX1NJRyhTRUdWKTsKKwlTU0hfU0lHKFRFUk0pOworCVNTSF9TSUcoVVNSMSk7CisJU1NIX1NJRyhVU1IyKTsKKyN1bmRlZglTU0hfU0lHCisJcmV0dXJuICJTSUdAb3BlbnNzaC5jb20iOworfQorCitzdGF0aWMgdm9pZAorc2Vzc2lvbl9jbG9zZV94MTEoaW50IGlkKQoreworCUNoYW5uZWwgKmM7CisKKwlpZiAoKGMgPSBjaGFubmVsX2J5X2lkKGlkKSkgPT0gTlVMTCkgeworCQlkZWJ1Zygic2Vzc2lvbl9jbG9zZV94MTE6IHgxMSBjaGFubmVsICVkIG1pc3NpbmciLCBpZCk7CisJfSBlbHNlIHsKKwkJLyogRGV0YWNoIFgxMSBsaXN0ZW5lciAqLworCQlkZWJ1Zygic2Vzc2lvbl9jbG9zZV94MTE6IGRldGFjaCB4MTEgY2hhbm5lbCAlZCIsIGlkKTsKKwkJY2hhbm5lbF9jYW5jZWxfY2xlYW51cChpZCk7CisJCWlmIChjLT5vc3RhdGUgIT0gQ0hBTl9PVVRQVVRfQ0xPU0VEKQorCQkJY2hhbl9tYXJrX2RlYWQoYyk7CisJfQorfQorCitzdGF0aWMgdm9pZAorc2Vzc2lvbl9jbG9zZV9zaW5nbGVfeDExKGludCBpZCwgdm9pZCAqYXJnKQoreworCVNlc3Npb24gKnM7CisJdV9pbnQgaTsKKworCWRlYnVnMygic2Vzc2lvbl9jbG9zZV9zaW5nbGVfeDExOiBjaGFubmVsICVkIiwgaWQpOworCWNoYW5uZWxfY2FuY2VsX2NsZWFudXAoaWQpOworCWlmICgocyA9IHNlc3Npb25fYnlfeDExX2NoYW5uZWwoaWQpKSA9PSBOVUxMKQorCQlmYXRhbCgic2Vzc2lvbl9jbG9zZV9zaW5nbGVfeDExOiBubyB4MTEgY2hhbm5lbCAlZCIsIGlkKTsKKwlmb3IgKGkgPSAwOyBzLT54MTFfY2hhbmlkc1tpXSAhPSAtMTsgaSsrKSB7CisJCWRlYnVnKCJzZXNzaW9uX2Nsb3NlX3NpbmdsZV94MTE6IHNlc3Npb24gJWQ6ICIKKwkJICAgICJjbG9zaW5nIGNoYW5uZWwgJWQiLCBzLT5zZWxmLCBzLT54MTFfY2hhbmlkc1tpXSk7CisJCS8qCisJCSAqIFRoZSBjaGFubmVsICJpZCIgaXMgYWxyZWFkeSBjbG9zaW5nLCBidXQgbWFrZSBzdXJlIHdlCisJCSAqIGNsb3NlIGFsbCBvZiBpdHMgc2libGluZ3MuCisJCSAqLworCQlpZiAocy0+eDExX2NoYW5pZHNbaV0gIT0gaWQpCisJCQlzZXNzaW9uX2Nsb3NlX3gxMShzLT54MTFfY2hhbmlkc1tpXSk7CisJfQorCXhmcmVlKHMtPngxMV9jaGFuaWRzKTsKKwlzLT54MTFfY2hhbmlkcyA9IE5VTEw7CisJaWYgKHMtPmRpc3BsYXkpIHsKKwkJeGZyZWUocy0+ZGlzcGxheSk7CisJCXMtPmRpc3BsYXkgPSBOVUxMOworCX0KKwlpZiAocy0+YXV0aF9wcm90bykgeworCQl4ZnJlZShzLT5hdXRoX3Byb3RvKTsKKwkJcy0+YXV0aF9wcm90byA9IE5VTEw7CisJfQorCWlmIChzLT5hdXRoX2RhdGEpIHsKKwkJeGZyZWUocy0+YXV0aF9kYXRhKTsKKwkJcy0+YXV0aF9kYXRhID0gTlVMTDsKKwl9CisJaWYgKHMtPmF1dGhfZGlzcGxheSkgeworCQl4ZnJlZShzLT5hdXRoX2Rpc3BsYXkpOworCQlzLT5hdXRoX2Rpc3BsYXkgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQKK3Nlc3Npb25fZXhpdF9tZXNzYWdlKFNlc3Npb24gKnMsIGludCBzdGF0dXMpCit7CisJQ2hhbm5lbCAqYzsKKworCWlmICgoYyA9IGNoYW5uZWxfbG9va3VwKHMtPmNoYW5pZCkpID09IE5VTEwpCisJCWZhdGFsKCJzZXNzaW9uX2V4aXRfbWVzc2FnZTogc2Vzc2lvbiAlZDogbm8gY2hhbm5lbCAlZCIsCisJCSAgICBzLT5zZWxmLCBzLT5jaGFuaWQpOworCWRlYnVnKCJzZXNzaW9uX2V4aXRfbWVzc2FnZTogc2Vzc2lvbiAlZCBjaGFubmVsICVkIHBpZCAlbGQiLAorCSAgICBzLT5zZWxmLCBzLT5jaGFuaWQsIChsb25nKXMtPnBpZCk7CisKKwlpZiAoV0lGRVhJVEVEKHN0YXR1cykpIHsKKwkJY2hhbm5lbF9yZXF1ZXN0X3N0YXJ0KHMtPmNoYW5pZCwgImV4aXQtc3RhdHVzIiwgMCk7CisJCXBhY2tldF9wdXRfaW50KFdFWElUU1RBVFVTKHN0YXR1cykpOworCQlwYWNrZXRfc2VuZCgpOworCX0gZWxzZSBpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkgeworCQljaGFubmVsX3JlcXVlc3Rfc3RhcnQocy0+Y2hhbmlkLCAiZXhpdC1zaWduYWwiLCAwKTsKKwkJcGFja2V0X3B1dF9jc3RyaW5nKHNpZzJuYW1lKFdURVJNU0lHKHN0YXR1cykpKTsKKyNpZmRlZiBXQ09SRURVTVAKKwkJcGFja2V0X3B1dF9jaGFyKFdDT1JFRFVNUChzdGF0dXMpPyAxIDogMCk7CisjZWxzZSAvKiBXQ09SRURVTVAgKi8KKwkJcGFja2V0X3B1dF9jaGFyKDApOworI2VuZGlmIC8qIFdDT1JFRFVNUCAqLworCQlwYWNrZXRfcHV0X2NzdHJpbmcoIiIpOworCQlwYWNrZXRfcHV0X2NzdHJpbmcoIiIpOworCQlwYWNrZXRfc2VuZCgpOworCX0gZWxzZSB7CisJCS8qIFNvbWUgd2VpcmQgZXhpdCBjYXVzZS4gIEp1c3QgZXhpdC4gKi8KKwkJcGFja2V0X2Rpc2Nvbm5lY3QoIndhaXQgcmV0dXJuZWQgc3RhdHVzICUwNHguIiwgc3RhdHVzKTsKKwl9CisKKwkvKiBkaXNjb25uZWN0IGNoYW5uZWwgKi8KKwlkZWJ1Zygic2Vzc2lvbl9leGl0X21lc3NhZ2U6IHJlbGVhc2UgY2hhbm5lbCAlZCIsIHMtPmNoYW5pZCk7CisKKwkvKgorCSAqIEFkanVzdCBjbGVhbnVwIGNhbGxiYWNrIGF0dGFjaG1lbnQgdG8gc2VuZCBjbG9zZSBtZXNzYWdlcyB3aGVuCisJICogdGhlIGNoYW5uZWwgZ2V0cyBFT0YuIFRoZSBzZXNzaW9uIHdpbGwgYmUgdGhlbiBiZSBjbG9zZWQKKwkgKiBieSBzZXNzaW9uX2Nsb3NlX2J5X2NoYW5uZWwgd2hlbiB0aGUgY2hpbGRzIGNsb3NlIHRoZWlyIGZkcy4KKwkgKi8KKwljaGFubmVsX3JlZ2lzdGVyX2NsZWFudXAoYy0+c2VsZiwgc2Vzc2lvbl9jbG9zZV9ieV9jaGFubmVsLCAxKTsKKworCS8qCisJICogZW11bGF0ZSBhIHdyaXRlIGZhaWx1cmUgd2l0aCAnY2hhbl93cml0ZV9mYWlsZWQnLCBub2JvZHkgd2lsbCBiZQorCSAqIGludGVyZXN0ZWQgaW4gZGF0YSB3ZSB3cml0ZS4KKwkgKiBOb3RlIHRoYXQgd2UgbXVzdCBub3QgY2FsbCAnY2hhbl9yZWFkX2ZhaWxlZCcsIHNpbmNlIHRoZXJlIGNvdWxkCisJICogYmUgc29tZSBtb3JlIGRhdGEgd2FpdGluZyBpbiB0aGUgcGlwZS4KKwkgKi8KKwlpZiAoYy0+b3N0YXRlICE9IENIQU5fT1VUUFVUX0NMT1NFRCkKKwkJY2hhbl93cml0ZV9mYWlsZWQoYyk7Cit9CisKK3ZvaWQKK3Nlc3Npb25fY2xvc2UoU2Vzc2lvbiAqcykKK3sKKwl1X2ludCBpOworCisJZGVidWcoInNlc3Npb25fY2xvc2U6IHNlc3Npb24gJWQgcGlkICVsZCIsIHMtPnNlbGYsIChsb25nKXMtPnBpZCk7CisJaWYgKHMtPnR0eWZkICE9IC0xKQorCQlzZXNzaW9uX3B0eV9jbGVhbnVwKHMpOworCWlmIChzLT50ZXJtKQorCQl4ZnJlZShzLT50ZXJtKTsKKwlpZiAocy0+ZGlzcGxheSkKKwkJeGZyZWUocy0+ZGlzcGxheSk7CisJaWYgKHMtPngxMV9jaGFuaWRzKQorCQl4ZnJlZShzLT54MTFfY2hhbmlkcyk7CisJaWYgKHMtPmF1dGhfZGlzcGxheSkKKwkJeGZyZWUocy0+YXV0aF9kaXNwbGF5KTsKKwlpZiAocy0+YXV0aF9kYXRhKQorCQl4ZnJlZShzLT5hdXRoX2RhdGEpOworCWlmIChzLT5hdXRoX3Byb3RvKQorCQl4ZnJlZShzLT5hdXRoX3Byb3RvKTsKKwlpZiAocy0+ZW52ICE9IE5VTEwpIHsKKwkJZm9yIChpID0gMDsgaSA8IHMtPm51bV9lbnY7IGkrKykgeworCQkJeGZyZWUocy0+ZW52W2ldLm5hbWUpOworCQkJeGZyZWUocy0+ZW52W2ldLnZhbCk7CisJCX0KKwkJeGZyZWUocy0+ZW52KTsKKwl9CisJc2Vzc2lvbl9wcm9jdGl0bGUocyk7CisJc2Vzc2lvbl91bnVzZWQocy0+c2VsZik7Cit9CisKK3ZvaWQKK3Nlc3Npb25fY2xvc2VfYnlfcGlkKHBpZF90IHBpZCwgaW50IHN0YXR1cykKK3sKKwlTZXNzaW9uICpzID0gc2Vzc2lvbl9ieV9waWQocGlkKTsKKwlpZiAocyA9PSBOVUxMKSB7CisJCWRlYnVnKCJzZXNzaW9uX2Nsb3NlX2J5X3BpZDogbm8gc2Vzc2lvbiBmb3IgcGlkICVsZCIsCisJCSAgICAobG9uZylwaWQpOworCQlyZXR1cm47CisJfQorCWlmIChzLT5jaGFuaWQgIT0gLTEpCisJCXNlc3Npb25fZXhpdF9tZXNzYWdlKHMsIHN0YXR1cyk7CisJaWYgKHMtPnR0eWZkICE9IC0xKQorCQlzZXNzaW9uX3B0eV9jbGVhbnVwKHMpOworCXMtPnBpZCA9IDA7Cit9CisKKy8qCisgKiB0aGlzIGlzIGNhbGxlZCB3aGVuIGEgY2hhbm5lbCBkaWVzIGJlZm9yZQorICogdGhlIHNlc3Npb24gJ2NoaWxkJyBpdHNlbGYgZGllcworICovCit2b2lkCitzZXNzaW9uX2Nsb3NlX2J5X2NoYW5uZWwoaW50IGlkLCB2b2lkICphcmcpCit7CisJU2Vzc2lvbiAqcyA9IHNlc3Npb25fYnlfY2hhbm5lbChpZCk7CisJdV9pbnQgaTsKKworCWlmIChzID09IE5VTEwpIHsKKwkJZGVidWcoInNlc3Npb25fY2xvc2VfYnlfY2hhbm5lbDogbm8gc2Vzc2lvbiBmb3IgaWQgJWQiLCBpZCk7CisJCXJldHVybjsKKwl9CisJZGVidWcoInNlc3Npb25fY2xvc2VfYnlfY2hhbm5lbDogY2hhbm5lbCAlZCBjaGlsZCAlbGQiLAorCSAgICBpZCwgKGxvbmcpcy0+cGlkKTsKKwlpZiAocy0+cGlkICE9IDApIHsKKwkJZGVidWcoInNlc3Npb25fY2xvc2VfYnlfY2hhbm5lbDogY2hhbm5lbCAlZDogaGFzIGNoaWxkIiwgaWQpOworCQkvKgorCQkgKiBkZWxheSBkZXRhY2ggb2Ygc2Vzc2lvbiwgYnV0IHJlbGVhc2UgcHR5LCBzaW5jZQorCQkgKiB0aGUgZmQncyB0byB0aGUgY2hpbGQgYXJlIGFscmVhZHkgY2xvc2VkCisJCSAqLworCQlpZiAocy0+dHR5ZmQgIT0gLTEpCisJCQlzZXNzaW9uX3B0eV9jbGVhbnVwKHMpOworCQlyZXR1cm47CisJfQorCS8qIGRldGFjaCBieSByZW1vdmluZyBjYWxsYmFjayAqLworCWNoYW5uZWxfY2FuY2VsX2NsZWFudXAocy0+Y2hhbmlkKTsKKworCS8qIENsb3NlIGFueSBYMTEgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlc3Npb24gKi8KKwlpZiAocy0+eDExX2NoYW5pZHMgIT0gTlVMTCkgeworCQlmb3IgKGkgPSAwOyBzLT54MTFfY2hhbmlkc1tpXSAhPSAtMTsgaSsrKSB7CisJCQlzZXNzaW9uX2Nsb3NlX3gxMShzLT54MTFfY2hhbmlkc1tpXSk7CisJCQlzLT54MTFfY2hhbmlkc1tpXSA9IC0xOworCQl9CisJfQorCisJcy0+Y2hhbmlkID0gLTE7CisJc2Vzc2lvbl9jbG9zZShzKTsKK30KKwordm9pZAorc2Vzc2lvbl9kZXN0cm95X2FsbCh2b2lkICgqY2xvc2VmdW5jKShTZXNzaW9uICopKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBzZXNzaW9uc19uYWxsb2M7IGkrKykgeworCQlTZXNzaW9uICpzID0gJnNlc3Npb25zW2ldOworCQlpZiAocy0+dXNlZCkgeworCQkJaWYgKGNsb3NlZnVuYyAhPSBOVUxMKQorCQkJCWNsb3NlZnVuYyhzKTsKKwkJCWVsc2UKKwkJCQlzZXNzaW9uX2Nsb3NlKHMpOworCQl9CisJfQorfQorCitzdGF0aWMgY2hhciAqCitzZXNzaW9uX3R0eV9saXN0KHZvaWQpCit7CisJc3RhdGljIGNoYXIgYnVmWzEwMjRdOworCWludCBpOworCWNoYXIgKmNwOworCisJYnVmWzBdID0gJ1wwJzsKKwlmb3IgKGkgPSAwOyBpIDwgc2Vzc2lvbnNfbmFsbG9jOyBpKyspIHsKKwkJU2Vzc2lvbiAqcyA9ICZzZXNzaW9uc1tpXTsKKwkJaWYgKHMtPnVzZWQgJiYgcy0+dHR5ZmQgIT0gLTEpIHsKKworCQkJaWYgKHN0cm5jbXAocy0+dHR5LCAiL2Rldi8iLCA1KSAhPSAwKSB7CisJCQkJY3AgPSBzdHJyY2hyKHMtPnR0eSwgJy8nKTsKKwkJCQljcCA9IChjcCA9PSBOVUxMKSA/IHMtPnR0eSA6IGNwICsgMTsKKwkJCX0gZWxzZQorCQkJCWNwID0gcy0+dHR5ICsgNTsKKworCQkJaWYgKGJ1ZlswXSAhPSAnXDAnKQorCQkJCXN0cmxjYXQoYnVmLCAiLCIsIHNpemVvZiBidWYpOworCQkJc3RybGNhdChidWYsIGNwLCBzaXplb2YgYnVmKTsKKwkJfQorCX0KKwlpZiAoYnVmWzBdID09ICdcMCcpCisJCXN0cmxjcHkoYnVmLCAibm90dHkiLCBzaXplb2YgYnVmKTsKKwlyZXR1cm4gYnVmOworfQorCit2b2lkCitzZXNzaW9uX3Byb2N0aXRsZShTZXNzaW9uICpzKQoreworCWlmIChzLT5wdyA9PSBOVUxMKQorCQllcnJvcigibm8gdXNlciBmb3Igc2Vzc2lvbiAlZCIsIHMtPnNlbGYpOworCWVsc2UKKwkJc2V0cHJvY3RpdGxlKCIlc0AlcyIsIHMtPnB3LT5wd19uYW1lLCBzZXNzaW9uX3R0eV9saXN0KCkpOworfQorCitpbnQKK3Nlc3Npb25fc2V0dXBfeDExZndkKFNlc3Npb24gKnMpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJY2hhciBkaXNwbGF5WzUxMl0sIGF1dGhfZGlzcGxheVs1MTJdOworCWNoYXIgaG9zdG5hbWVbTUFYSE9TVE5BTUVMRU5dOworCXVfaW50IGk7CisKKwlpZiAobm9feDExX2ZvcndhcmRpbmdfZmxhZykgeworCQlwYWNrZXRfc2VuZF9kZWJ1ZygiWDExIGZvcndhcmRpbmcgZGlzYWJsZWQgaW4gdXNlciBjb25maWd1cmF0aW9uIGZpbGUuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoIW9wdGlvbnMueDExX2ZvcndhcmRpbmcpIHsKKwkJZGVidWcoIlgxMSBmb3J3YXJkaW5nIGRpc2FibGVkIGluIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGUuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoIW9wdGlvbnMueGF1dGhfbG9jYXRpb24gfHwKKwkgICAgKHN0YXQob3B0aW9ucy54YXV0aF9sb2NhdGlvbiwgJnN0KSA9PSAtMSkpIHsKKwkJcGFja2V0X3NlbmRfZGVidWcoIk5vIHhhdXRoIHByb2dyYW07IGNhbm5vdCBmb3J3YXJkIHdpdGggc3Bvb2ZpbmcuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAob3B0aW9ucy51c2VfbG9naW4pIHsKKwkJcGFja2V0X3NlbmRfZGVidWcoIlgxMSBmb3J3YXJkaW5nIGRpc2FibGVkOyAiCisJCSAgICAibm90IGNvbXBhdGlibGUgd2l0aCBVc2VMb2dpbj15ZXMuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAocy0+ZGlzcGxheSAhPSBOVUxMKSB7CisJCWRlYnVnKCJYMTEgZGlzcGxheSBhbHJlYWR5IHNldC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICh4MTFfY3JlYXRlX2Rpc3BsYXlfaW5ldChvcHRpb25zLngxMV9kaXNwbGF5X29mZnNldCwKKwkgICAgb3B0aW9ucy54MTFfdXNlX2xvY2FsaG9zdCwgcy0+c2luZ2xlX2Nvbm5lY3Rpb24sCisJICAgICZzLT5kaXNwbGF5X251bWJlciwgJnMtPngxMV9jaGFuaWRzKSA9PSAtMSkgeworCQlkZWJ1ZygieDExX2NyZWF0ZV9kaXNwbGF5X2luZXQgZmFpbGVkLiIpOworCQlyZXR1cm4gMDsKKwl9CisJZm9yIChpID0gMDsgcy0+eDExX2NoYW5pZHNbaV0gIT0gLTE7IGkrKykgeworCQljaGFubmVsX3JlZ2lzdGVyX2NsZWFudXAocy0+eDExX2NoYW5pZHNbaV0sCisJCSAgICBzZXNzaW9uX2Nsb3NlX3NpbmdsZV94MTEsIDApOworCX0KKworCS8qIFNldCB1cCBhIHN1aXRhYmxlIHZhbHVlIGZvciB0aGUgRElTUExBWSB2YXJpYWJsZS4gKi8KKwlpZiAoZ2V0aG9zdG5hbWUoaG9zdG5hbWUsIHNpemVvZihob3N0bmFtZSkpIDwgMCkKKwkJZmF0YWwoImdldGhvc3RuYW1lOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCS8qCisJICogYXV0aF9kaXNwbGF5IG11c3QgYmUgdXNlZCBhcyB0aGUgZGlzcGxheW5hbWUgd2hlbiB0aGUKKwkgKiBhdXRob3JpemF0aW9uIGVudHJ5IGlzIGFkZGVkIHdpdGggeGF1dGgoMSkuICBUaGlzIHdpbGwgYmUKKwkgKiBkaWZmZXJlbnQgdGhhbiB0aGUgRElTUExBWSBzdHJpbmcgZm9yIGxvY2FsaG9zdCBkaXNwbGF5cy4KKwkgKi8KKwlpZiAob3B0aW9ucy54MTFfdXNlX2xvY2FsaG9zdCkgeworCQlzbnByaW50ZihkaXNwbGF5LCBzaXplb2YgZGlzcGxheSwgImxvY2FsaG9zdDoldS4ldSIsCisJCSAgICBzLT5kaXNwbGF5X251bWJlciwgcy0+c2NyZWVuKTsKKwkJc25wcmludGYoYXV0aF9kaXNwbGF5LCBzaXplb2YgYXV0aF9kaXNwbGF5LCAidW5peDoldS4ldSIsCisJCSAgICBzLT5kaXNwbGF5X251bWJlciwgcy0+c2NyZWVuKTsKKwkJcy0+ZGlzcGxheSA9IHhzdHJkdXAoZGlzcGxheSk7CisJCXMtPmF1dGhfZGlzcGxheSA9IHhzdHJkdXAoYXV0aF9kaXNwbGF5KTsKKwl9IGVsc2UgeworI2lmZGVmIElQQUREUl9JTl9ESVNQTEFZCisJCXN0cnVjdCBob3N0ZW50ICpoZTsKKwkJc3RydWN0IGluX2FkZHIgbXlfYWRkcjsKKworCQloZSA9IGdldGhvc3RieW5hbWUoaG9zdG5hbWUpOworCQlpZiAoaGUgPT0gTlVMTCkgeworCQkJZXJyb3IoIkNhbid0IGdldCBJUCBhZGRyZXNzIGZvciBYMTEgRElTUExBWS4iKTsKKwkJCXBhY2tldF9zZW5kX2RlYnVnKCJDYW4ndCBnZXQgSVAgYWRkcmVzcyBmb3IgWDExIERJU1BMQVkuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQltZW1jcHkoJm15X2FkZHIsIGhlLT5oX2FkZHJfbGlzdFswXSwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisJCXNucHJpbnRmKGRpc3BsYXksIHNpemVvZiBkaXNwbGF5LCAiJS41MHM6JXUuJXUiLCBpbmV0X250b2EobXlfYWRkciksCisJCSAgICBzLT5kaXNwbGF5X251bWJlciwgcy0+c2NyZWVuKTsKKyNlbHNlCisJCXNucHJpbnRmKGRpc3BsYXksIHNpemVvZiBkaXNwbGF5LCAiJS40MDBzOiV1LiV1IiwgaG9zdG5hbWUsCisJCSAgICBzLT5kaXNwbGF5X251bWJlciwgcy0+c2NyZWVuKTsKKyNlbmRpZgorCQlzLT5kaXNwbGF5ID0geHN0cmR1cChkaXNwbGF5KTsKKwkJcy0+YXV0aF9kaXNwbGF5ID0geHN0cmR1cChkaXNwbGF5KTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK2RvX2F1dGhlbnRpY2F0ZWQyKEF1dGhjdHh0ICphdXRoY3R4dCkKK3sKKwlzZXJ2ZXJfbG9vcDIoYXV0aGN0eHQpOworfQorCit2b2lkCitkb19jbGVhbnVwKEF1dGhjdHh0ICphdXRoY3R4dCkKK3sKKwlzdGF0aWMgaW50IGNhbGxlZCA9IDA7CisKKwlkZWJ1ZygiZG9fY2xlYW51cCIpOworCisJLyogbm8gY2xlYW51cCBpZiB3ZSdyZSBpbiB0aGUgY2hpbGQgZm9yIGxvZ2luIHNoZWxsICovCisJaWYgKGlzX2NoaWxkKQorCQlyZXR1cm47CisKKwkvKiBhdm9pZCBkb3VibGUgY2xlYW51cCAqLworCWlmIChjYWxsZWQpCisJCXJldHVybjsKKwljYWxsZWQgPSAxOworCisJaWYgKGF1dGhjdHh0ID09IE5VTEwpCisJCXJldHVybjsKKworI2lmZGVmIFVTRV9QQU0KKwlpZiAob3B0aW9ucy51c2VfcGFtKSB7CisJCXNzaHBhbV9jbGVhbnVwKCk7CisJCXNzaHBhbV90aHJlYWRfY2xlYW51cCgpOworCX0KKyNlbmRpZgorCisJaWYgKCFhdXRoY3R4dC0+YXV0aGVudGljYXRlZCkKKwkJcmV0dXJuOworCisjaWZkZWYgS1JCNQorCWlmIChvcHRpb25zLmtlcmJlcm9zX3RpY2tldF9jbGVhbnVwICYmCisJICAgIGF1dGhjdHh0LT5rcmI1X2N0eCkKKwkJa3JiNV9jbGVhbnVwX3Byb2MoYXV0aGN0eHQpOworI2VuZGlmCisKKyNpZmRlZiBHU1NBUEkKKwlpZiAoY29tcGF0MjAgJiYgb3B0aW9ucy5nc3NfY2xlYW51cF9jcmVkcykKKwkJc3NoX2dzc2FwaV9jbGVhbnVwX2NyZWRzKCk7CisjZW5kaWYKKworCS8qIHJlbW92ZSBhZ2VudCBzb2NrZXQgKi8KKwlhdXRoX3NvY2tfY2xlYW51cF9wcm9jKGF1dGhjdHh0LT5wdyk7CisKKwkvKgorCSAqIENsZWFudXAgcHR5cy91dG1wIG9ubHkgaWYgcHJpdnNlcCBpcyBkaXNhYmxlZCwKKwkgKiBvciBpZiBydW5uaW5nIGluIG1vbml0b3IuCisJICovCisJaWYgKCF1c2VfcHJpdnNlcCB8fCBtbV9pc19tb25pdG9yKCkpCisJCXNlc3Npb25fZGVzdHJveV9hbGwoc2Vzc2lvbl9wdHlfY2xlYW51cDIpOworfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zZXNzaW9uLmggYi9vcGVuc3NoLTYuMHAxL3Nlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmI4ZTNhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zZXNzaW9uLmgKQEAgLTAsMCArMSw4MyBAQAorLyogJE9wZW5CU0Q6IHNlc3Npb24uaCx2IDEuMzAgMjAwOC8wNS8wOCAxMjoyMToxNiBkam0gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgU0VTU0lPTl9ICisjZGVmaW5lIFNFU1NJT05fSAorCisjZGVmaW5lIFRUWVNaIDY0Cit0eXBlZGVmIHN0cnVjdCBTZXNzaW9uIFNlc3Npb247CitzdHJ1Y3QgU2Vzc2lvbiB7CisJaW50CXVzZWQ7CisJaW50CXNlbGY7CisJaW50CW5leHRfdW51c2VkOworCXN0cnVjdCBwYXNzd2QgKnB3OworCUF1dGhjdHh0ICphdXRoY3R4dDsKKwlwaWRfdAlwaWQ7CisKKwkvKiB0dHkgKi8KKwljaGFyCSp0ZXJtOworCWludAlwdHlmZCwgdHR5ZmQsIHB0eW1hc3RlcjsKKwl1X2ludAlyb3csIGNvbCwgeHBpeGVsLCB5cGl4ZWw7CisJY2hhcgl0dHlbVFRZU1pdOworCisJLyogWDExICovCisJdV9pbnQJZGlzcGxheV9udW1iZXI7CisJY2hhcgkqZGlzcGxheTsKKwl1X2ludAlzY3JlZW47CisJY2hhcgkqYXV0aF9kaXNwbGF5OworCWNoYXIJKmF1dGhfcHJvdG87CisJY2hhcgkqYXV0aF9kYXRhOworCWludAlzaW5nbGVfY29ubmVjdGlvbjsKKworCS8qIHByb3RvIDIgKi8KKwlpbnQJY2hhbmlkOworCWludAkqeDExX2NoYW5pZHM7CisJaW50CWlzX3N1YnN5c3RlbTsKKwl1X2ludAludW1fZW52OworCXN0cnVjdCB7CisJCWNoYXIJKm5hbWU7CisJCWNoYXIJKnZhbDsKKwl9ICplbnY7Cit9OworCit2b2lkCSBkb19hdXRoZW50aWNhdGVkKEF1dGhjdHh0ICopOwordm9pZAkgZG9fY2xlYW51cChBdXRoY3R4dCAqKTsKKworaW50CSBzZXNzaW9uX29wZW4oQXV0aGN0eHQgKiwgaW50KTsKK3ZvaWQJIHNlc3Npb25fdW51c2VkKGludCk7CitpbnQJIHNlc3Npb25faW5wdXRfY2hhbm5lbF9yZXEoQ2hhbm5lbCAqLCBjb25zdCBjaGFyICopOwordm9pZAkgc2Vzc2lvbl9jbG9zZV9ieV9waWQocGlkX3QsIGludCk7Cit2b2lkCSBzZXNzaW9uX2Nsb3NlX2J5X2NoYW5uZWwoaW50LCB2b2lkICopOwordm9pZAkgc2Vzc2lvbl9kZXN0cm95X2FsbCh2b2lkICgqKShTZXNzaW9uICopKTsKK3ZvaWQJIHNlc3Npb25fcHR5X2NsZWFudXAyKFNlc3Npb24gKik7CisKK1Nlc3Npb24JKnNlc3Npb25fbmV3KHZvaWQpOworU2Vzc2lvbgkqc2Vzc2lvbl9ieV90dHkoY2hhciAqKTsKK3ZvaWQJIHNlc3Npb25fY2xvc2UoU2Vzc2lvbiAqKTsKK3ZvaWQJIGRvX3NldHVzZXJjb250ZXh0KHN0cnVjdCBwYXNzd2QgKik7Cit2b2lkCSBjaGlsZF9zZXRfZW52KGNoYXIgKioqZW52cCwgdV9pbnQgKmVudnNpemVwLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICAgY29uc3QgY2hhciAqdmFsdWUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc2Z0cC1jbGllbnQuYyBiL29wZW5zc2gtNi4wcDEvc2Z0cC1jbGllbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2VmZjcwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zZnRwLWNsaWVudC5jCkBAIC0wLDAgKzEsMTY0MCBAQAorLyogJE9wZW5CU0Q6IHNmdHAtY2xpZW50LmMsdiAxLjk2IDIwMTEvMDkvMTIgMDg6NDY6MTUgbWFya3VzIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgRGFtaWVuIE1pbGxlciA8ZGptQG9wZW5ic2Qub3JnPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qIFhYWDogbWVtbGVha3MgKi8KKy8qIFhYWDogc2lnbmVkIHZzIHVuc2lnbmVkICovCisvKiBYWFg6IHJlbW92ZSBhbGwgbG9nZ2luZywgb25seSByZXR1cm4gc3RhdHVzIGNvZGVzICovCisvKiBYWFg6IGNvcHkgYmV0d2VlbiB0d28gcmVtb3RlIHNpdGVzICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaWZkZWYgSEFWRV9TWVNfU1RBVFZGU19ICisjaW5jbHVkZSA8c3lzL3N0YXR2ZnMuaD4KKyNlbmRpZgorI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L3N5cy1xdWV1ZS5oIgorI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfVElNRV9ICisjIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJhdG9taWNpby5oIgorI2luY2x1ZGUgInByb2dyZXNzbWV0ZXIuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisKKyNpbmNsdWRlICJzZnRwLmgiCisjaW5jbHVkZSAic2Z0cC1jb21tb24uaCIKKyNpbmNsdWRlICJzZnRwLWNsaWVudC5oIgorCitleHRlcm4gdm9sYXRpbGUgc2lnX2F0b21pY190IGludGVycnVwdGVkOworZXh0ZXJuIGludCBzaG93cHJvZ3Jlc3M7CisKKy8qIE1pbmltdW0gYW1vdW50IG9mIGRhdGEgdG8gcmVhZCBhdCBhIHRpbWUgKi8KKyNkZWZpbmUgTUlOX1JFQURfU0laRQk1MTIKKworLyogTWF4aW11bSBkZXB0aCB0byBkZXNjZW5kIGluIGRpcmVjdG9yeSB0cmVlcyAqLworI2RlZmluZSBNQVhfRElSX0RFUFRIIDY0CisKK3N0cnVjdCBzZnRwX2Nvbm4geworCWludCBmZF9pbjsKKwlpbnQgZmRfb3V0OworCXVfaW50IHRyYW5zZmVyX2J1ZmxlbjsKKwl1X2ludCBudW1fcmVxdWVzdHM7CisJdV9pbnQgdmVyc2lvbjsKKwl1X2ludCBtc2dfaWQ7CisjZGVmaW5lIFNGVFBfRVhUX1BPU0lYX1JFTkFNRQkweDAwMDAwMDAxCisjZGVmaW5lIFNGVFBfRVhUX1NUQVRWRlMJMHgwMDAwMDAwMgorI2RlZmluZSBTRlRQX0VYVF9GU1RBVFZGUwkweDAwMDAwMDA0CisjZGVmaW5lIFNGVFBfRVhUX0hBUkRMSU5LCTB4MDAwMDAwMDgKKwl1X2ludCBleHRzOworCXVfaW50NjRfdCBsaW1pdF9rYnBzOworCXN0cnVjdCBid2xpbWl0IGJ3bGltaXRfaW4sIGJ3bGltaXRfb3V0OworfTsKKworc3RhdGljIGNoYXIgKgorZ2V0X2hhbmRsZShzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCB1X2ludCBleHBlY3RlZF9pZCwgdV9pbnQgKmxlbiwKKyAgICBjb25zdCBjaGFyICplcnJmbXQsIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgNCwgNSkpKTsKKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyBpbnQKK3NmdHBpbyh2b2lkICpfYndsaW1pdCwgc2l6ZV90IGFtb3VudCkKK3sKKwlzdHJ1Y3QgYndsaW1pdCAqYndsaW1pdCA9IChzdHJ1Y3QgYndsaW1pdCAqKV9id2xpbWl0OworCisJYmFuZHdpZHRoX2xpbWl0KGJ3bGltaXQsIGFtb3VudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitzZW5kX21zZyhzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBCdWZmZXIgKm0pCit7CisJdV9jaGFyIG1sZW5bNF07CisJc3RydWN0IGlvdmVjIGlvdlsyXTsKKworCWlmIChidWZmZXJfbGVuKG0pID4gU0ZUUF9NQVhfTVNHX0xFTkdUSCkKKwkJZmF0YWwoIk91dGJvdW5kIG1lc3NhZ2UgdG9vIGxvbmcgJXUiLCBidWZmZXJfbGVuKG0pKTsKKworCS8qIFNlbmQgbGVuZ3RoIGZpcnN0ICovCisJcHV0X3UzMihtbGVuLCBidWZmZXJfbGVuKG0pKTsKKwlpb3ZbMF0uaW92X2Jhc2UgPSBtbGVuOworCWlvdlswXS5pb3ZfbGVuID0gc2l6ZW9mKG1sZW4pOworCWlvdlsxXS5pb3ZfYmFzZSA9IGJ1ZmZlcl9wdHIobSk7CisJaW92WzFdLmlvdl9sZW4gPSBidWZmZXJfbGVuKG0pOworCisJaWYgKGF0b21pY2lvdjYod3JpdGV2LCBjb25uLT5mZF9vdXQsIGlvdiwgMiwKKwkgICAgY29ubi0+bGltaXRfa2JwcyA+IDAgPyBzZnRwaW8gOiBOVUxMLCAmY29ubi0+YndsaW1pdF9vdXQpICE9IAorCSAgICBidWZmZXJfbGVuKG0pICsgc2l6ZW9mKG1sZW4pKQorCQlmYXRhbCgiQ291bGRuJ3Qgc2VuZCBwYWNrZXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKworCWJ1ZmZlcl9jbGVhcihtKTsKK30KKworc3RhdGljIHZvaWQKK2dldF9tc2coc3RydWN0IHNmdHBfY29ubiAqY29ubiwgQnVmZmVyICptKQoreworCXVfaW50IG1zZ19sZW47CisKKwlidWZmZXJfYXBwZW5kX3NwYWNlKG0sIDQpOworCWlmIChhdG9taWNpbzYocmVhZCwgY29ubi0+ZmRfaW4sIGJ1ZmZlcl9wdHIobSksIDQsCisJICAgIGNvbm4tPmxpbWl0X2ticHMgPiAwID8gc2Z0cGlvIDogTlVMTCwgJmNvbm4tPmJ3bGltaXRfaW4pICE9IDQpIHsKKwkJaWYgKGVycm5vID09IEVQSVBFKQorCQkJZmF0YWwoIkNvbm5lY3Rpb24gY2xvc2VkIik7CisJCWVsc2UKKwkJCWZhdGFsKCJDb3VsZG4ndCByZWFkIHBhY2tldDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCX0KKworCW1zZ19sZW4gPSBidWZmZXJfZ2V0X2ludChtKTsKKwlpZiAobXNnX2xlbiA+IFNGVFBfTUFYX01TR19MRU5HVEgpCisJCWZhdGFsKCJSZWNlaXZlZCBtZXNzYWdlIHRvbyBsb25nICV1IiwgbXNnX2xlbik7CisKKwlidWZmZXJfYXBwZW5kX3NwYWNlKG0sIG1zZ19sZW4pOworCWlmIChhdG9taWNpbzYocmVhZCwgY29ubi0+ZmRfaW4sIGJ1ZmZlcl9wdHIobSksIG1zZ19sZW4sCisJICAgIGNvbm4tPmxpbWl0X2ticHMgPiAwID8gc2Z0cGlvIDogTlVMTCwgJmNvbm4tPmJ3bGltaXRfaW4pCisJICAgICE9IG1zZ19sZW4pIHsKKwkJaWYgKGVycm5vID09IEVQSVBFKQorCQkJZmF0YWwoIkNvbm5lY3Rpb24gY2xvc2VkIik7CisJCWVsc2UKKwkJCWZhdGFsKCJSZWFkIHBhY2tldDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCX0KK30KKworc3RhdGljIHZvaWQKK3NlbmRfc3RyaW5nX3JlcXVlc3Qoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgdV9pbnQgaWQsIHVfaW50IGNvZGUsIGNoYXIgKnMsCisgICAgdV9pbnQgbGVuKQoreworCUJ1ZmZlciBtc2c7CisKKwlidWZmZXJfaW5pdCgmbXNnKTsKKwlidWZmZXJfcHV0X2NoYXIoJm1zZywgY29kZSk7CisJYnVmZmVyX3B1dF9pbnQoJm1zZywgaWQpOworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtc2csIHMsIGxlbik7CisJc2VuZF9tc2coY29ubiwgJm1zZyk7CisJZGVidWczKCJTZW50IG1lc3NhZ2UgZmQgJWQgVDoldSBJOiV1IiwgY29ubi0+ZmRfb3V0LCBjb2RlLCBpZCk7CisJYnVmZmVyX2ZyZWUoJm1zZyk7Cit9CisKK3N0YXRpYyB2b2lkCitzZW5kX3N0cmluZ19hdHRyc19yZXF1ZXN0KHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIHVfaW50IGlkLCB1X2ludCBjb2RlLAorICAgIGNoYXIgKnMsIHVfaW50IGxlbiwgQXR0cmliICphKQoreworCUJ1ZmZlciBtc2c7CisKKwlidWZmZXJfaW5pdCgmbXNnKTsKKwlidWZmZXJfcHV0X2NoYXIoJm1zZywgY29kZSk7CisJYnVmZmVyX3B1dF9pbnQoJm1zZywgaWQpOworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtc2csIHMsIGxlbik7CisJZW5jb2RlX2F0dHJpYigmbXNnLCBhKTsKKwlzZW5kX21zZyhjb25uLCAmbXNnKTsKKwlkZWJ1ZzMoIlNlbnQgbWVzc2FnZSBmZCAlZCBUOiV1IEk6JXUiLCBjb25uLT5mZF9vdXQsIGNvZGUsIGlkKTsKKwlidWZmZXJfZnJlZSgmbXNnKTsKK30KKworc3RhdGljIHVfaW50CitnZXRfc3RhdHVzKHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIHVfaW50IGV4cGVjdGVkX2lkKQoreworCUJ1ZmZlciBtc2c7CisJdV9pbnQgdHlwZSwgaWQsIHN0YXR1czsKKworCWJ1ZmZlcl9pbml0KCZtc2cpOworCWdldF9tc2coY29ubiwgJm1zZyk7CisJdHlwZSA9IGJ1ZmZlcl9nZXRfY2hhcigmbXNnKTsKKwlpZCA9IGJ1ZmZlcl9nZXRfaW50KCZtc2cpOworCisJaWYgKGlkICE9IGV4cGVjdGVkX2lkKQorCQlmYXRhbCgiSUQgbWlzbWF0Y2ggKCV1ICE9ICV1KSIsIGlkLCBleHBlY3RlZF9pZCk7CisJaWYgKHR5cGUgIT0gU1NIMl9GWFBfU1RBVFVTKQorCQlmYXRhbCgiRXhwZWN0ZWQgU1NIMl9GWFBfU1RBVFVTKCV1KSBwYWNrZXQsIGdvdCAldSIsCisJCSAgICBTU0gyX0ZYUF9TVEFUVVMsIHR5cGUpOworCisJc3RhdHVzID0gYnVmZmVyX2dldF9pbnQoJm1zZyk7CisJYnVmZmVyX2ZyZWUoJm1zZyk7CisKKwlkZWJ1ZzMoIlNTSDJfRlhQX1NUQVRVUyAldSIsIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgY2hhciAqCitnZXRfaGFuZGxlKHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIHVfaW50IGV4cGVjdGVkX2lkLCB1X2ludCAqbGVuLAorICAgIGNvbnN0IGNoYXIgKmVycmZtdCwgLi4uKQoreworCUJ1ZmZlciBtc2c7CisJdV9pbnQgdHlwZSwgaWQ7CisJY2hhciAqaGFuZGxlLCBlcnJtc2dbMjU2XTsKKwl2YV9saXN0IGFyZ3M7CisJaW50IHN0YXR1czsKKworCXZhX3N0YXJ0KGFyZ3MsIGVycmZtdCk7CisJaWYgKGVycmZtdCAhPSBOVUxMKQorCQl2c25wcmludGYoZXJybXNnLCBzaXplb2YoZXJybXNnKSwgZXJyZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwlidWZmZXJfaW5pdCgmbXNnKTsKKwlnZXRfbXNnKGNvbm4sICZtc2cpOworCXR5cGUgPSBidWZmZXJfZ2V0X2NoYXIoJm1zZyk7CisJaWQgPSBidWZmZXJfZ2V0X2ludCgmbXNnKTsKKworCWlmIChpZCAhPSBleHBlY3RlZF9pZCkKKwkJZmF0YWwoIiVzOiBJRCBtaXNtYXRjaCAoJXUgIT0gJXUpIiwKKwkJICAgIGVycmZtdCA9PSBOVUxMID8gX19mdW5jX18gOiBlcnJtc2csIGlkLCBleHBlY3RlZF9pZCk7CisJaWYgKHR5cGUgPT0gU1NIMl9GWFBfU1RBVFVTKSB7CisJCXN0YXR1cyA9IGJ1ZmZlcl9nZXRfaW50KCZtc2cpOworCQlpZiAoZXJyZm10ICE9IE5VTEwpCisJCQllcnJvcigiJXM6ICVzIiwgZXJybXNnLCBmeDJ0eHQoc3RhdHVzKSk7CisJCWJ1ZmZlcl9mcmVlKCZtc2cpOworCQlyZXR1cm4oTlVMTCk7CisJfSBlbHNlIGlmICh0eXBlICE9IFNTSDJfRlhQX0hBTkRMRSkKKwkJZmF0YWwoIiVzOiBFeHBlY3RlZCBTU0gyX0ZYUF9IQU5ETEUoJXUpIHBhY2tldCwgZ290ICV1IiwKKwkJICAgIGVycmZtdCA9PSBOVUxMID8gX19mdW5jX18gOiBlcnJtc2csIFNTSDJfRlhQX0hBTkRMRSwgdHlwZSk7CisKKwloYW5kbGUgPSBidWZmZXJfZ2V0X3N0cmluZygmbXNnLCBsZW4pOworCWJ1ZmZlcl9mcmVlKCZtc2cpOworCisJcmV0dXJuKGhhbmRsZSk7Cit9CisKK3N0YXRpYyBBdHRyaWIgKgorZ2V0X2RlY29kZV9zdGF0KHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIHVfaW50IGV4cGVjdGVkX2lkLCBpbnQgcXVpZXQpCit7CisJQnVmZmVyIG1zZzsKKwl1X2ludCB0eXBlLCBpZDsKKwlBdHRyaWIgKmE7CisKKwlidWZmZXJfaW5pdCgmbXNnKTsKKwlnZXRfbXNnKGNvbm4sICZtc2cpOworCisJdHlwZSA9IGJ1ZmZlcl9nZXRfY2hhcigmbXNnKTsKKwlpZCA9IGJ1ZmZlcl9nZXRfaW50KCZtc2cpOworCisJZGVidWczKCJSZWNlaXZlZCBzdGF0IHJlcGx5IFQ6JXUgSToldSIsIHR5cGUsIGlkKTsKKwlpZiAoaWQgIT0gZXhwZWN0ZWRfaWQpCisJCWZhdGFsKCJJRCBtaXNtYXRjaCAoJXUgIT0gJXUpIiwgaWQsIGV4cGVjdGVkX2lkKTsKKwlpZiAodHlwZSA9PSBTU0gyX0ZYUF9TVEFUVVMpIHsKKwkJaW50IHN0YXR1cyA9IGJ1ZmZlcl9nZXRfaW50KCZtc2cpOworCisJCWlmIChxdWlldCkKKwkJCWRlYnVnKCJDb3VsZG4ndCBzdGF0IHJlbW90ZSBmaWxlOiAlcyIsIGZ4MnR4dChzdGF0dXMpKTsKKwkJZWxzZQorCQkJZXJyb3IoIkNvdWxkbid0IHN0YXQgcmVtb3RlIGZpbGU6ICVzIiwgZngydHh0KHN0YXR1cykpOworCQlidWZmZXJfZnJlZSgmbXNnKTsKKwkJcmV0dXJuKE5VTEwpOworCX0gZWxzZSBpZiAodHlwZSAhPSBTU0gyX0ZYUF9BVFRSUykgeworCQlmYXRhbCgiRXhwZWN0ZWQgU1NIMl9GWFBfQVRUUlMoJXUpIHBhY2tldCwgZ290ICV1IiwKKwkJICAgIFNTSDJfRlhQX0FUVFJTLCB0eXBlKTsKKwl9CisJYSA9IGRlY29kZV9hdHRyaWIoJm1zZyk7CisJYnVmZmVyX2ZyZWUoJm1zZyk7CisKKwlyZXR1cm4oYSk7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9kZWNvZGVfc3RhdHZmcyhzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBzdHJ1Y3Qgc2Z0cF9zdGF0dmZzICpzdCwKKyAgICB1X2ludCBleHBlY3RlZF9pZCwgaW50IHF1aWV0KQoreworCUJ1ZmZlciBtc2c7CisJdV9pbnQgdHlwZSwgaWQsIGZsYWc7CisKKwlidWZmZXJfaW5pdCgmbXNnKTsKKwlnZXRfbXNnKGNvbm4sICZtc2cpOworCisJdHlwZSA9IGJ1ZmZlcl9nZXRfY2hhcigmbXNnKTsKKwlpZCA9IGJ1ZmZlcl9nZXRfaW50KCZtc2cpOworCisJZGVidWczKCJSZWNlaXZlZCBzdGF0dmZzIHJlcGx5IFQ6JXUgSToldSIsIHR5cGUsIGlkKTsKKwlpZiAoaWQgIT0gZXhwZWN0ZWRfaWQpCisJCWZhdGFsKCJJRCBtaXNtYXRjaCAoJXUgIT0gJXUpIiwgaWQsIGV4cGVjdGVkX2lkKTsKKwlpZiAodHlwZSA9PSBTU0gyX0ZYUF9TVEFUVVMpIHsKKwkJaW50IHN0YXR1cyA9IGJ1ZmZlcl9nZXRfaW50KCZtc2cpOworCisJCWlmIChxdWlldCkKKwkJCWRlYnVnKCJDb3VsZG4ndCBzdGF0dmZzOiAlcyIsIGZ4MnR4dChzdGF0dXMpKTsKKwkJZWxzZQorCQkJZXJyb3IoIkNvdWxkbid0IHN0YXR2ZnM6ICVzIiwgZngydHh0KHN0YXR1cykpOworCQlidWZmZXJfZnJlZSgmbXNnKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSBpZiAodHlwZSAhPSBTU0gyX0ZYUF9FWFRFTkRFRF9SRVBMWSkgeworCQlmYXRhbCgiRXhwZWN0ZWQgU1NIMl9GWFBfRVhURU5ERURfUkVQTFkoJXUpIHBhY2tldCwgZ290ICV1IiwKKwkJICAgIFNTSDJfRlhQX0VYVEVOREVEX1JFUExZLCB0eXBlKTsKKwl9CisKKwliemVybyhzdCwgc2l6ZW9mKCpzdCkpOworCXN0LT5mX2JzaXplID0gYnVmZmVyX2dldF9pbnQ2NCgmbXNnKTsKKwlzdC0+Zl9mcnNpemUgPSBidWZmZXJfZ2V0X2ludDY0KCZtc2cpOworCXN0LT5mX2Jsb2NrcyA9IGJ1ZmZlcl9nZXRfaW50NjQoJm1zZyk7CisJc3QtPmZfYmZyZWUgPSBidWZmZXJfZ2V0X2ludDY0KCZtc2cpOworCXN0LT5mX2JhdmFpbCA9IGJ1ZmZlcl9nZXRfaW50NjQoJm1zZyk7CisJc3QtPmZfZmlsZXMgPSBidWZmZXJfZ2V0X2ludDY0KCZtc2cpOworCXN0LT5mX2ZmcmVlID0gYnVmZmVyX2dldF9pbnQ2NCgmbXNnKTsKKwlzdC0+Zl9mYXZhaWwgPSBidWZmZXJfZ2V0X2ludDY0KCZtc2cpOworCXN0LT5mX2ZzaWQgPSBidWZmZXJfZ2V0X2ludDY0KCZtc2cpOworCWZsYWcgPSBidWZmZXJfZ2V0X2ludDY0KCZtc2cpOworCXN0LT5mX25hbWVtYXggPSBidWZmZXJfZ2V0X2ludDY0KCZtc2cpOworCisJc3QtPmZfZmxhZyA9IChmbGFnICYgU1NIMl9GWEVfU1RBVFZGU19TVF9SRE9OTFkpID8gU1RfUkRPTkxZIDogMDsKKwlzdC0+Zl9mbGFnIHw9IChmbGFnICYgU1NIMl9GWEVfU1RBVFZGU19TVF9OT1NVSUQpID8gU1RfTk9TVUlEIDogMDsKKworCWJ1ZmZlcl9mcmVlKCZtc2cpOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzZnRwX2Nvbm4gKgorZG9faW5pdChpbnQgZmRfaW4sIGludCBmZF9vdXQsIHVfaW50IHRyYW5zZmVyX2J1ZmxlbiwgdV9pbnQgbnVtX3JlcXVlc3RzLAorICAgIHVfaW50NjRfdCBsaW1pdF9rYnBzKQoreworCXVfaW50IHR5cGU7CisJQnVmZmVyIG1zZzsKKwlzdHJ1Y3Qgc2Z0cF9jb25uICpyZXQ7CisKKwlyZXQgPSB4bWFsbG9jKHNpemVvZigqcmV0KSk7CisJcmV0LT5mZF9pbiA9IGZkX2luOworCXJldC0+ZmRfb3V0ID0gZmRfb3V0OworCXJldC0+dHJhbnNmZXJfYnVmbGVuID0gdHJhbnNmZXJfYnVmbGVuOworCXJldC0+bnVtX3JlcXVlc3RzID0gbnVtX3JlcXVlc3RzOworCXJldC0+ZXh0cyA9IDA7CisJcmV0LT5saW1pdF9rYnBzID0gMDsKKworCWJ1ZmZlcl9pbml0KCZtc2cpOworCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0gyX0ZYUF9JTklUKTsKKwlidWZmZXJfcHV0X2ludCgmbXNnLCBTU0gyX0ZJTEVYRkVSX1ZFUlNJT04pOworCXNlbmRfbXNnKHJldCwgJm1zZyk7CisKKwlidWZmZXJfY2xlYXIoJm1zZyk7CisKKwlnZXRfbXNnKHJldCwgJm1zZyk7CisKKwkvKiBFeHBlY3RpbmcgYSBWRVJTSU9OIHJlcGx5ICovCisJaWYgKCh0eXBlID0gYnVmZmVyX2dldF9jaGFyKCZtc2cpKSAhPSBTU0gyX0ZYUF9WRVJTSU9OKSB7CisJCWVycm9yKCJJbnZhbGlkIHBhY2tldCBiYWNrIGZyb20gU1NIMl9GWFBfSU5JVCAodHlwZSAldSkiLAorCQkgICAgdHlwZSk7CisJCWJ1ZmZlcl9mcmVlKCZtc2cpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCXJldC0+dmVyc2lvbiA9IGJ1ZmZlcl9nZXRfaW50KCZtc2cpOworCisJZGVidWcyKCJSZW1vdGUgdmVyc2lvbjogJXUiLCByZXQtPnZlcnNpb24pOworCisJLyogQ2hlY2sgZm9yIGV4dGVuc2lvbnMgKi8KKwl3aGlsZSAoYnVmZmVyX2xlbigmbXNnKSA+IDApIHsKKwkJY2hhciAqbmFtZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtc2csIE5VTEwpOworCQljaGFyICp2YWx1ZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtc2csIE5VTEwpOworCQlpbnQga25vd24gPSAwOworCisJCWlmIChzdHJjbXAobmFtZSwgInBvc2l4LXJlbmFtZUBvcGVuc3NoLmNvbSIpID09IDAgJiYKKwkJICAgIHN0cmNtcCh2YWx1ZSwgIjEiKSA9PSAwKSB7CisJCQlyZXQtPmV4dHMgfD0gU0ZUUF9FWFRfUE9TSVhfUkVOQU1FOworCQkJa25vd24gPSAxOworCQl9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAic3RhdHZmc0BvcGVuc3NoLmNvbSIpID09IDAgJiYKKwkJICAgIHN0cmNtcCh2YWx1ZSwgIjIiKSA9PSAwKSB7CisJCQlyZXQtPmV4dHMgfD0gU0ZUUF9FWFRfU1RBVFZGUzsKKwkJCWtub3duID0gMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgImZzdGF0dmZzQG9wZW5zc2guY29tIikgPT0gMCAmJgorCQkgICAgc3RyY21wKHZhbHVlLCAiMiIpID09IDApIHsKKwkJCXJldC0+ZXh0cyB8PSBTRlRQX0VYVF9GU1RBVFZGUzsKKwkJCWtub3duID0gMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgImhhcmRsaW5rQG9wZW5zc2guY29tIikgPT0gMCAmJgorCQkgICAgc3RyY21wKHZhbHVlLCAiMSIpID09IDApIHsKKwkJCXJldC0+ZXh0cyB8PSBTRlRQX0VYVF9IQVJETElOSzsKKwkJCWtub3duID0gMTsKKwkJfQorCQlpZiAoa25vd24pIHsKKwkJCWRlYnVnMigiU2VydmVyIHN1cHBvcnRzIGV4dGVuc2lvbiBcIiVzXCIgcmV2aXNpb24gJXMiLAorCQkJICAgIG5hbWUsIHZhbHVlKTsKKwkJfSBlbHNlIHsKKwkJCWRlYnVnMigiVW5yZWNvZ25pc2VkIHNlcnZlciBleHRlbnNpb24gXCIlc1wiIiwgbmFtZSk7CisJCX0KKwkJeGZyZWUobmFtZSk7CisJCXhmcmVlKHZhbHVlKTsKKwl9CisKKwlidWZmZXJfZnJlZSgmbXNnKTsKKworCS8qIFNvbWUgZmlsZXhmZXIgdi4wIHNlcnZlcnMgZG9uJ3Qgc3VwcG9ydCBsYXJnZSBwYWNrZXRzICovCisJaWYgKHJldC0+dmVyc2lvbiA9PSAwKQorCQlyZXQtPnRyYW5zZmVyX2J1ZmxlbiA9IE1JTihyZXQtPnRyYW5zZmVyX2J1ZmxlbiwgMjA0ODApOworCisJcmV0LT5saW1pdF9rYnBzID0gbGltaXRfa2JwczsKKwlpZiAocmV0LT5saW1pdF9rYnBzID4gMCkgeworCQliYW5kd2lkdGhfbGltaXRfaW5pdCgmcmV0LT5id2xpbWl0X2luLCByZXQtPmxpbWl0X2ticHMsCisJCSAgICByZXQtPnRyYW5zZmVyX2J1Zmxlbik7CisJCWJhbmR3aWR0aF9saW1pdF9pbml0KCZyZXQtPmJ3bGltaXRfb3V0LCByZXQtPmxpbWl0X2ticHMsCisJCSAgICByZXQtPnRyYW5zZmVyX2J1Zmxlbik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwordV9pbnQKK3NmdHBfcHJvdG9fdmVyc2lvbihzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uKQoreworCXJldHVybiBjb25uLT52ZXJzaW9uOworfQorCitpbnQKK2RvX2Nsb3NlKHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIGNoYXIgKmhhbmRsZSwgdV9pbnQgaGFuZGxlX2xlbikKK3sKKwl1X2ludCBpZCwgc3RhdHVzOworCUJ1ZmZlciBtc2c7CisKKwlidWZmZXJfaW5pdCgmbXNnKTsKKworCWlkID0gY29ubi0+bXNnX2lkKys7CisJYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSDJfRlhQX0NMT1NFKTsKKwlidWZmZXJfcHV0X2ludCgmbXNnLCBpZCk7CisJYnVmZmVyX3B1dF9zdHJpbmcoJm1zZywgaGFuZGxlLCBoYW5kbGVfbGVuKTsKKwlzZW5kX21zZyhjb25uLCAmbXNnKTsKKwlkZWJ1ZzMoIlNlbnQgbWVzc2FnZSBTU0gyX0ZYUF9DTE9TRSBJOiV1IiwgaWQpOworCisJc3RhdHVzID0gZ2V0X3N0YXR1cyhjb25uLCBpZCk7CisJaWYgKHN0YXR1cyAhPSBTU0gyX0ZYX09LKQorCQllcnJvcigiQ291bGRuJ3QgY2xvc2UgZmlsZTogJXMiLCBmeDJ0eHQoc3RhdHVzKSk7CisKKwlidWZmZXJfZnJlZSgmbXNnKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdGljIGludAorZG9fbHNyZWFkZGlyKHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIGNoYXIgKnBhdGgsIGludCBwcmludGZsYWcsCisgICAgU0ZUUF9ESVJFTlQgKioqZGlyKQoreworCUJ1ZmZlciBtc2c7CisJdV9pbnQgY291bnQsIHR5cGUsIGlkLCBoYW5kbGVfbGVuLCBpLCBleHBlY3RlZF9pZCwgZW50cyA9IDA7CisJY2hhciAqaGFuZGxlOworCisJaWQgPSBjb25uLT5tc2dfaWQrKzsKKworCWJ1ZmZlcl9pbml0KCZtc2cpOworCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0gyX0ZYUF9PUEVORElSKTsKKwlidWZmZXJfcHV0X2ludCgmbXNnLCBpZCk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csIHBhdGgpOworCXNlbmRfbXNnKGNvbm4sICZtc2cpOworCisJaGFuZGxlID0gZ2V0X2hhbmRsZShjb25uLCBpZCwgJmhhbmRsZV9sZW4sCisJICAgICJyZW1vdGUgcmVhZGRpcihcIiVzXCIpIiwgcGF0aCk7CisJaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisJCWJ1ZmZlcl9mcmVlKCZtc2cpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGRpcikgeworCQllbnRzID0gMDsKKwkJKmRpciA9IHhtYWxsb2Moc2l6ZW9mKCoqZGlyKSk7CisJCSgqZGlyKVswXSA9IE5VTEw7CisJfQorCisJZm9yICg7ICFpbnRlcnJ1cHRlZDspIHsKKwkJaWQgPSBleHBlY3RlZF9pZCA9IGNvbm4tPm1zZ19pZCsrOworCisJCWRlYnVnMygiU2VuZGluZyBTU0gyX0ZYUF9SRUFERElSIEk6JXUiLCBpZCk7CisKKwkJYnVmZmVyX2NsZWFyKCZtc2cpOworCQlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIMl9GWFBfUkVBRERJUik7CisJCWJ1ZmZlcl9wdXRfaW50KCZtc2csIGlkKTsKKwkJYnVmZmVyX3B1dF9zdHJpbmcoJm1zZywgaGFuZGxlLCBoYW5kbGVfbGVuKTsKKwkJc2VuZF9tc2coY29ubiwgJm1zZyk7CisKKwkJYnVmZmVyX2NsZWFyKCZtc2cpOworCisJCWdldF9tc2coY29ubiwgJm1zZyk7CisKKwkJdHlwZSA9IGJ1ZmZlcl9nZXRfY2hhcigmbXNnKTsKKwkJaWQgPSBidWZmZXJfZ2V0X2ludCgmbXNnKTsKKworCQlkZWJ1ZzMoIlJlY2VpdmVkIHJlcGx5IFQ6JXUgSToldSIsIHR5cGUsIGlkKTsKKworCQlpZiAoaWQgIT0gZXhwZWN0ZWRfaWQpCisJCQlmYXRhbCgiSUQgbWlzbWF0Y2ggKCV1ICE9ICV1KSIsIGlkLCBleHBlY3RlZF9pZCk7CisKKwkJaWYgKHR5cGUgPT0gU1NIMl9GWFBfU1RBVFVTKSB7CisJCQlpbnQgc3RhdHVzID0gYnVmZmVyX2dldF9pbnQoJm1zZyk7CisKKwkJCWRlYnVnMygiUmVjZWl2ZWQgU1NIMl9GWFBfU1RBVFVTICVkIiwgc3RhdHVzKTsKKworCQkJaWYgKHN0YXR1cyA9PSBTU0gyX0ZYX0VPRikgeworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQllcnJvcigiQ291bGRuJ3QgcmVhZCBkaXJlY3Rvcnk6ICVzIiwKKwkJCQkgICAgZngydHh0KHN0YXR1cykpOworCQkJCWRvX2Nsb3NlKGNvbm4sIGhhbmRsZSwgaGFuZGxlX2xlbik7CisJCQkJeGZyZWUoaGFuZGxlKTsKKwkJCQlidWZmZXJfZnJlZSgmbXNnKTsKKwkJCQlyZXR1cm4oc3RhdHVzKTsKKwkJCX0KKwkJfSBlbHNlIGlmICh0eXBlICE9IFNTSDJfRlhQX05BTUUpCisJCQlmYXRhbCgiRXhwZWN0ZWQgU1NIMl9GWFBfTkFNRSgldSkgcGFja2V0LCBnb3QgJXUiLAorCQkJICAgIFNTSDJfRlhQX05BTUUsIHR5cGUpOworCisJCWNvdW50ID0gYnVmZmVyX2dldF9pbnQoJm1zZyk7CisJCWlmIChjb3VudCA9PSAwKQorCQkJYnJlYWs7CisJCWRlYnVnMygiUmVjZWl2ZWQgJWQgU1NIMl9GWFBfTkFNRSByZXNwb25zZXMiLCBjb3VudCk7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQljaGFyICpmaWxlbmFtZSwgKmxvbmduYW1lOworCQkJQXR0cmliICphOworCisJCQlmaWxlbmFtZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtc2csIE5VTEwpOworCQkJbG9uZ25hbWUgPSBidWZmZXJfZ2V0X3N0cmluZygmbXNnLCBOVUxMKTsKKwkJCWEgPSBkZWNvZGVfYXR0cmliKCZtc2cpOworCisJCQlpZiAocHJpbnRmbGFnKQorCQkJCXByaW50ZigiJXNcbiIsIGxvbmduYW1lKTsKKworCQkJLyoKKwkJCSAqIERpcmVjdG9yeSBlbnRyaWVzIHNob3VsZCBuZXZlciBjb250YWluICcvJworCQkJICogVGhlc2UgY2FuIGJlIHVzZWQgdG8gYXR0YWNrIHJlY3Vyc2l2ZSBvcHMKKwkJCSAqIChlLmcuIHNlbmQgJy4uLy4uLy4uLy4uL2V0Yy9wYXNzd2QnKQorCQkJICovCisJCQlpZiAoc3RyY2hyKGZpbGVuYW1lLCAnLycpICE9IE5VTEwpIHsKKwkJCQllcnJvcigiU2VydmVyIHNlbnQgc3VzcGVjdCBwYXRoIFwiJXNcIiAiCisJCQkJICAgICJkdXJpbmcgcmVhZGRpciBvZiBcIiVzXCIiLCBmaWxlbmFtZSwgcGF0aCk7CisJCQkJZ290byBuZXh0OworCQkJfQorCisJCQlpZiAoZGlyKSB7CisJCQkJKmRpciA9IHhyZWFsbG9jKCpkaXIsIGVudHMgKyAyLCBzaXplb2YoKipkaXIpKTsKKwkJCQkoKmRpcilbZW50c10gPSB4bWFsbG9jKHNpemVvZigqKipkaXIpKTsKKwkJCQkoKmRpcilbZW50c10tPmZpbGVuYW1lID0geHN0cmR1cChmaWxlbmFtZSk7CisJCQkJKCpkaXIpW2VudHNdLT5sb25nbmFtZSA9IHhzdHJkdXAobG9uZ25hbWUpOworCQkJCW1lbWNweSgmKCpkaXIpW2VudHNdLT5hLCBhLCBzaXplb2YoKmEpKTsKKwkJCQkoKmRpcilbKytlbnRzXSA9IE5VTEw7CisJCQl9CisgbmV4dDoKKwkJCXhmcmVlKGZpbGVuYW1lKTsKKwkJCXhmcmVlKGxvbmduYW1lKTsKKwkJfQorCX0KKworCWJ1ZmZlcl9mcmVlKCZtc2cpOworCWRvX2Nsb3NlKGNvbm4sIGhhbmRsZSwgaGFuZGxlX2xlbik7CisJeGZyZWUoaGFuZGxlKTsKKworCS8qIERvbid0IHJldHVybiBwYXJ0aWFsIG1hdGNoZXMgb24gaW50ZXJydXB0ICovCisJaWYgKGludGVycnVwdGVkICYmIGRpciAhPSBOVUxMICYmICpkaXIgIT0gTlVMTCkgeworCQlmcmVlX3NmdHBfZGlyZW50cygqZGlyKTsKKwkJKmRpciA9IHhtYWxsb2Moc2l6ZW9mKCoqZGlyKSk7CisJCSoqZGlyID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50Citkb19yZWFkZGlyKHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIGNoYXIgKnBhdGgsIFNGVFBfRElSRU5UICoqKmRpcikKK3sKKwlyZXR1cm4oZG9fbHNyZWFkZGlyKGNvbm4sIHBhdGgsIDAsIGRpcikpOworfQorCit2b2lkIGZyZWVfc2Z0cF9kaXJlbnRzKFNGVFBfRElSRU5UICoqcykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IHNbaV07IGkrKykgeworCQl4ZnJlZShzW2ldLT5maWxlbmFtZSk7CisJCXhmcmVlKHNbaV0tPmxvbmduYW1lKTsKKwkJeGZyZWUoc1tpXSk7CisJfQorCXhmcmVlKHMpOworfQorCitpbnQKK2RvX3JtKHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIGNoYXIgKnBhdGgpCit7CisJdV9pbnQgc3RhdHVzLCBpZDsKKworCWRlYnVnMigiU2VuZGluZyBTU0gyX0ZYUF9SRU1PVkUgXCIlc1wiIiwgcGF0aCk7CisKKwlpZCA9IGNvbm4tPm1zZ19pZCsrOworCXNlbmRfc3RyaW5nX3JlcXVlc3QoY29ubiwgaWQsIFNTSDJfRlhQX1JFTU9WRSwgcGF0aCwgc3RybGVuKHBhdGgpKTsKKwlzdGF0dXMgPSBnZXRfc3RhdHVzKGNvbm4sIGlkKTsKKwlpZiAoc3RhdHVzICE9IFNTSDJfRlhfT0spCisJCWVycm9yKCJDb3VsZG4ndCBkZWxldGUgZmlsZTogJXMiLCBmeDJ0eHQoc3RhdHVzKSk7CisJcmV0dXJuKHN0YXR1cyk7Cit9CisKK2ludAorZG9fbWtkaXIoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgY2hhciAqcGF0aCwgQXR0cmliICphLCBpbnQgcHJpbnRmbGFnKQoreworCXVfaW50IHN0YXR1cywgaWQ7CisKKwlpZCA9IGNvbm4tPm1zZ19pZCsrOworCXNlbmRfc3RyaW5nX2F0dHJzX3JlcXVlc3QoY29ubiwgaWQsIFNTSDJfRlhQX01LRElSLCBwYXRoLAorCSAgICBzdHJsZW4ocGF0aCksIGEpOworCisJc3RhdHVzID0gZ2V0X3N0YXR1cyhjb25uLCBpZCk7CisJaWYgKHN0YXR1cyAhPSBTU0gyX0ZYX09LICYmIHByaW50ZmxhZykKKwkJZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBkaXJlY3Rvcnk6ICVzIiwgZngydHh0KHN0YXR1cykpOworCisJcmV0dXJuKHN0YXR1cyk7Cit9CisKK2ludAorZG9fcm1kaXIoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgY2hhciAqcGF0aCkKK3sKKwl1X2ludCBzdGF0dXMsIGlkOworCisJaWQgPSBjb25uLT5tc2dfaWQrKzsKKwlzZW5kX3N0cmluZ19yZXF1ZXN0KGNvbm4sIGlkLCBTU0gyX0ZYUF9STURJUiwgcGF0aCwKKwkgICAgc3RybGVuKHBhdGgpKTsKKworCXN0YXR1cyA9IGdldF9zdGF0dXMoY29ubiwgaWQpOworCWlmIChzdGF0dXMgIT0gU1NIMl9GWF9PSykKKwkJZXJyb3IoIkNvdWxkbid0IHJlbW92ZSBkaXJlY3Rvcnk6ICVzIiwgZngydHh0KHN0YXR1cykpOworCisJcmV0dXJuKHN0YXR1cyk7Cit9CisKK0F0dHJpYiAqCitkb19zdGF0KHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIGNoYXIgKnBhdGgsIGludCBxdWlldCkKK3sKKwl1X2ludCBpZDsKKworCWlkID0gY29ubi0+bXNnX2lkKys7CisKKwlzZW5kX3N0cmluZ19yZXF1ZXN0KGNvbm4sIGlkLAorCSAgICBjb25uLT52ZXJzaW9uID09IDAgPyBTU0gyX0ZYUF9TVEFUX1ZFUlNJT05fMCA6IFNTSDJfRlhQX1NUQVQsCisJICAgIHBhdGgsIHN0cmxlbihwYXRoKSk7CisKKwlyZXR1cm4oZ2V0X2RlY29kZV9zdGF0KGNvbm4sIGlkLCBxdWlldCkpOworfQorCitBdHRyaWIgKgorZG9fbHN0YXQoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgY2hhciAqcGF0aCwgaW50IHF1aWV0KQoreworCXVfaW50IGlkOworCisJaWYgKGNvbm4tPnZlcnNpb24gPT0gMCkgeworCQlpZiAocXVpZXQpCisJCQlkZWJ1ZygiU2VydmVyIHZlcnNpb24gZG9lcyBub3Qgc3VwcG9ydCBsc3RhdCBvcGVyYXRpb24iKTsKKwkJZWxzZQorCQkJbG9naXQoIlNlcnZlciB2ZXJzaW9uIGRvZXMgbm90IHN1cHBvcnQgbHN0YXQgb3BlcmF0aW9uIik7CisJCXJldHVybihkb19zdGF0KGNvbm4sIHBhdGgsIHF1aWV0KSk7CisJfQorCisJaWQgPSBjb25uLT5tc2dfaWQrKzsKKwlzZW5kX3N0cmluZ19yZXF1ZXN0KGNvbm4sIGlkLCBTU0gyX0ZYUF9MU1RBVCwgcGF0aCwKKwkgICAgc3RybGVuKHBhdGgpKTsKKworCXJldHVybihnZXRfZGVjb2RlX3N0YXQoY29ubiwgaWQsIHF1aWV0KSk7Cit9CisKKyNpZmRlZiBub3R5ZXQKK0F0dHJpYiAqCitkb19mc3RhdChzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpoYW5kbGUsIHVfaW50IGhhbmRsZV9sZW4sIGludCBxdWlldCkKK3sKKwl1X2ludCBpZDsKKworCWlkID0gY29ubi0+bXNnX2lkKys7CisJc2VuZF9zdHJpbmdfcmVxdWVzdChjb25uLCBpZCwgU1NIMl9GWFBfRlNUQVQsIGhhbmRsZSwKKwkgICAgaGFuZGxlX2xlbik7CisKKwlyZXR1cm4oZ2V0X2RlY29kZV9zdGF0KGNvbm4sIGlkLCBxdWlldCkpOworfQorI2VuZGlmCisKK2ludAorZG9fc2V0c3RhdChzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpwYXRoLCBBdHRyaWIgKmEpCit7CisJdV9pbnQgc3RhdHVzLCBpZDsKKworCWlkID0gY29ubi0+bXNnX2lkKys7CisJc2VuZF9zdHJpbmdfYXR0cnNfcmVxdWVzdChjb25uLCBpZCwgU1NIMl9GWFBfU0VUU1RBVCwgcGF0aCwKKwkgICAgc3RybGVuKHBhdGgpLCBhKTsKKworCXN0YXR1cyA9IGdldF9zdGF0dXMoY29ubiwgaWQpOworCWlmIChzdGF0dXMgIT0gU1NIMl9GWF9PSykKKwkJZXJyb3IoIkNvdWxkbid0IHNldHN0YXQgb24gXCIlc1wiOiAlcyIsIHBhdGgsCisJCSAgICBmeDJ0eHQoc3RhdHVzKSk7CisKKwlyZXR1cm4oc3RhdHVzKTsKK30KKworaW50Citkb19mc2V0c3RhdChzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpoYW5kbGUsIHVfaW50IGhhbmRsZV9sZW4sCisgICAgQXR0cmliICphKQoreworCXVfaW50IHN0YXR1cywgaWQ7CisKKwlpZCA9IGNvbm4tPm1zZ19pZCsrOworCXNlbmRfc3RyaW5nX2F0dHJzX3JlcXVlc3QoY29ubiwgaWQsIFNTSDJfRlhQX0ZTRVRTVEFULCBoYW5kbGUsCisJICAgIGhhbmRsZV9sZW4sIGEpOworCisJc3RhdHVzID0gZ2V0X3N0YXR1cyhjb25uLCBpZCk7CisJaWYgKHN0YXR1cyAhPSBTU0gyX0ZYX09LKQorCQllcnJvcigiQ291bGRuJ3QgZnNldHN0YXQ6ICVzIiwgZngydHh0KHN0YXR1cykpOworCisJcmV0dXJuKHN0YXR1cyk7Cit9CisKK2NoYXIgKgorZG9fcmVhbHBhdGgoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgY2hhciAqcGF0aCkKK3sKKwlCdWZmZXIgbXNnOworCXVfaW50IHR5cGUsIGV4cGVjdGVkX2lkLCBjb3VudCwgaWQ7CisJY2hhciAqZmlsZW5hbWUsICpsb25nbmFtZTsKKwlBdHRyaWIgKmE7CisKKwlleHBlY3RlZF9pZCA9IGlkID0gY29ubi0+bXNnX2lkKys7CisJc2VuZF9zdHJpbmdfcmVxdWVzdChjb25uLCBpZCwgU1NIMl9GWFBfUkVBTFBBVEgsIHBhdGgsCisJICAgIHN0cmxlbihwYXRoKSk7CisKKwlidWZmZXJfaW5pdCgmbXNnKTsKKworCWdldF9tc2coY29ubiwgJm1zZyk7CisJdHlwZSA9IGJ1ZmZlcl9nZXRfY2hhcigmbXNnKTsKKwlpZCA9IGJ1ZmZlcl9nZXRfaW50KCZtc2cpOworCisJaWYgKGlkICE9IGV4cGVjdGVkX2lkKQorCQlmYXRhbCgiSUQgbWlzbWF0Y2ggKCV1ICE9ICV1KSIsIGlkLCBleHBlY3RlZF9pZCk7CisKKwlpZiAodHlwZSA9PSBTU0gyX0ZYUF9TVEFUVVMpIHsKKwkJdV9pbnQgc3RhdHVzID0gYnVmZmVyX2dldF9pbnQoJm1zZyk7CisKKwkJZXJyb3IoIkNvdWxkbid0IGNhbm9uaWNhbGlzZTogJXMiLCBmeDJ0eHQoc3RhdHVzKSk7CisJCWJ1ZmZlcl9mcmVlKCZtc2cpOworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgaWYgKHR5cGUgIT0gU1NIMl9GWFBfTkFNRSkKKwkJZmF0YWwoIkV4cGVjdGVkIFNTSDJfRlhQX05BTUUoJXUpIHBhY2tldCwgZ290ICV1IiwKKwkJICAgIFNTSDJfRlhQX05BTUUsIHR5cGUpOworCisJY291bnQgPSBidWZmZXJfZ2V0X2ludCgmbXNnKTsKKwlpZiAoY291bnQgIT0gMSkKKwkJZmF0YWwoIkdvdCBtdWx0aXBsZSBuYW1lcyAoJWQpIGZyb20gU1NIX0ZYUF9SRUFMUEFUSCIsIGNvdW50KTsKKworCWZpbGVuYW1lID0gYnVmZmVyX2dldF9zdHJpbmcoJm1zZywgTlVMTCk7CisJbG9uZ25hbWUgPSBidWZmZXJfZ2V0X3N0cmluZygmbXNnLCBOVUxMKTsKKwlhID0gZGVjb2RlX2F0dHJpYigmbXNnKTsKKworCWRlYnVnMygiU1NIX0ZYUF9SRUFMUEFUSCAlcyAtPiAlcyIsIHBhdGgsIGZpbGVuYW1lKTsKKworCXhmcmVlKGxvbmduYW1lKTsKKworCWJ1ZmZlcl9mcmVlKCZtc2cpOworCisJcmV0dXJuKGZpbGVuYW1lKTsKK30KKworaW50Citkb19yZW5hbWUoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgY2hhciAqb2xkcGF0aCwgY2hhciAqbmV3cGF0aCkKK3sKKwlCdWZmZXIgbXNnOworCXVfaW50IHN0YXR1cywgaWQ7CisKKwlidWZmZXJfaW5pdCgmbXNnKTsKKworCS8qIFNlbmQgcmVuYW1lIHJlcXVlc3QgKi8KKwlpZCA9IGNvbm4tPm1zZ19pZCsrOworCWlmICgoY29ubi0+ZXh0cyAmIFNGVFBfRVhUX1BPU0lYX1JFTkFNRSkpIHsKKwkJYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSDJfRlhQX0VYVEVOREVEKTsKKwkJYnVmZmVyX3B1dF9pbnQoJm1zZywgaWQpOworCQlidWZmZXJfcHV0X2NzdHJpbmcoJm1zZywgInBvc2l4LXJlbmFtZUBvcGVuc3NoLmNvbSIpOworCX0gZWxzZSB7CisJCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0gyX0ZYUF9SRU5BTUUpOworCQlidWZmZXJfcHV0X2ludCgmbXNnLCBpZCk7CisJfQorCWJ1ZmZlcl9wdXRfY3N0cmluZygmbXNnLCBvbGRwYXRoKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcoJm1zZywgbmV3cGF0aCk7CisJc2VuZF9tc2coY29ubiwgJm1zZyk7CisJZGVidWczKCJTZW50IG1lc3NhZ2UgJXMgXCIlc1wiIC0+IFwiJXNcIiIsCisJICAgIChjb25uLT5leHRzICYgU0ZUUF9FWFRfUE9TSVhfUkVOQU1FKSA/ICJwb3NpeC1yZW5hbWVAb3BlbnNzaC5jb20iIDoKKwkgICAgIlNTSDJfRlhQX1JFTkFNRSIsIG9sZHBhdGgsIG5ld3BhdGgpOworCWJ1ZmZlcl9mcmVlKCZtc2cpOworCisJc3RhdHVzID0gZ2V0X3N0YXR1cyhjb25uLCBpZCk7CisJaWYgKHN0YXR1cyAhPSBTU0gyX0ZYX09LKQorCQllcnJvcigiQ291bGRuJ3QgcmVuYW1lIGZpbGUgXCIlc1wiIHRvIFwiJXNcIjogJXMiLCBvbGRwYXRoLAorCQkgICAgbmV3cGF0aCwgZngydHh0KHN0YXR1cykpOworCisJcmV0dXJuKHN0YXR1cyk7Cit9CisKK2ludAorZG9faGFyZGxpbmsoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgY2hhciAqb2xkcGF0aCwgY2hhciAqbmV3cGF0aCkKK3sKKwlCdWZmZXIgbXNnOworCXVfaW50IHN0YXR1cywgaWQ7CisKKwlpZiAoKGNvbm4tPmV4dHMgJiBTRlRQX0VYVF9IQVJETElOSykgPT0gMCkgeworCQllcnJvcigiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgaGFyZGxpbmtAb3BlbnNzaC5jb20gZXh0ZW5zaW9uIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlidWZmZXJfaW5pdCgmbXNnKTsKKworCS8qIFNlbmQgbGluayByZXF1ZXN0ICovCisJaWQgPSBjb25uLT5tc2dfaWQrKzsKKwlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIMl9GWFBfRVhURU5ERUQpOworCWJ1ZmZlcl9wdXRfaW50KCZtc2csIGlkKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcoJm1zZywgImhhcmRsaW5rQG9wZW5zc2guY29tIik7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csIG9sZHBhdGgpOworCWJ1ZmZlcl9wdXRfY3N0cmluZygmbXNnLCBuZXdwYXRoKTsKKwlzZW5kX21zZyhjb25uLCAmbXNnKTsKKwlkZWJ1ZzMoIlNlbnQgbWVzc2FnZSBoYXJkbGlua0BvcGVuc3NoLmNvbSBcIiVzXCIgLT4gXCIlc1wiIiwKKwkgICAgICAgb2xkcGF0aCwgbmV3cGF0aCk7CisJYnVmZmVyX2ZyZWUoJm1zZyk7CisKKwlzdGF0dXMgPSBnZXRfc3RhdHVzKGNvbm4sIGlkKTsKKwlpZiAoc3RhdHVzICE9IFNTSDJfRlhfT0spCisJCWVycm9yKCJDb3VsZG4ndCBsaW5rIGZpbGUgXCIlc1wiIHRvIFwiJXNcIjogJXMiLCBvbGRwYXRoLAorCQkgICAgbmV3cGF0aCwgZngydHh0KHN0YXR1cykpOworCisJcmV0dXJuKHN0YXR1cyk7Cit9CisKK2ludAorZG9fc3ltbGluayhzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpvbGRwYXRoLCBjaGFyICpuZXdwYXRoKQoreworCUJ1ZmZlciBtc2c7CisJdV9pbnQgc3RhdHVzLCBpZDsKKworCWlmIChjb25uLT52ZXJzaW9uIDwgMykgeworCQllcnJvcigiVGhpcyBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3ltbGluayBvcGVyYXRpb24iKTsKKwkJcmV0dXJuKFNTSDJfRlhfT1BfVU5TVVBQT1JURUQpOworCX0KKworCWJ1ZmZlcl9pbml0KCZtc2cpOworCisJLyogU2VuZCBzeW1saW5rIHJlcXVlc3QgKi8KKwlpZCA9IGNvbm4tPm1zZ19pZCsrOworCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0gyX0ZYUF9TWU1MSU5LKTsKKwlidWZmZXJfcHV0X2ludCgmbXNnLCBpZCk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csIG9sZHBhdGgpOworCWJ1ZmZlcl9wdXRfY3N0cmluZygmbXNnLCBuZXdwYXRoKTsKKwlzZW5kX21zZyhjb25uLCAmbXNnKTsKKwlkZWJ1ZzMoIlNlbnQgbWVzc2FnZSBTU0gyX0ZYUF9TWU1MSU5LIFwiJXNcIiAtPiBcIiVzXCIiLCBvbGRwYXRoLAorCSAgICBuZXdwYXRoKTsKKwlidWZmZXJfZnJlZSgmbXNnKTsKKworCXN0YXR1cyA9IGdldF9zdGF0dXMoY29ubiwgaWQpOworCWlmIChzdGF0dXMgIT0gU1NIMl9GWF9PSykKKwkJZXJyb3IoIkNvdWxkbid0IHN5bWxpbmsgZmlsZSBcIiVzXCIgdG8gXCIlc1wiOiAlcyIsIG9sZHBhdGgsCisJCSAgICBuZXdwYXRoLCBmeDJ0eHQoc3RhdHVzKSk7CisKKwlyZXR1cm4oc3RhdHVzKTsKK30KKworI2lmZGVmIG5vdHlldAorY2hhciAqCitkb19yZWFkbGluayhzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpwYXRoKQoreworCUJ1ZmZlciBtc2c7CisJdV9pbnQgdHlwZSwgZXhwZWN0ZWRfaWQsIGNvdW50LCBpZDsKKwljaGFyICpmaWxlbmFtZSwgKmxvbmduYW1lOworCUF0dHJpYiAqYTsKKworCWV4cGVjdGVkX2lkID0gaWQgPSBjb25uLT5tc2dfaWQrKzsKKwlzZW5kX3N0cmluZ19yZXF1ZXN0KGNvbm4sIGlkLCBTU0gyX0ZYUF9SRUFETElOSywgcGF0aCwgc3RybGVuKHBhdGgpKTsKKworCWJ1ZmZlcl9pbml0KCZtc2cpOworCisJZ2V0X21zZyhjb25uLCAmbXNnKTsKKwl0eXBlID0gYnVmZmVyX2dldF9jaGFyKCZtc2cpOworCWlkID0gYnVmZmVyX2dldF9pbnQoJm1zZyk7CisKKwlpZiAoaWQgIT0gZXhwZWN0ZWRfaWQpCisJCWZhdGFsKCJJRCBtaXNtYXRjaCAoJXUgIT0gJXUpIiwgaWQsIGV4cGVjdGVkX2lkKTsKKworCWlmICh0eXBlID09IFNTSDJfRlhQX1NUQVRVUykgeworCQl1X2ludCBzdGF0dXMgPSBidWZmZXJfZ2V0X2ludCgmbXNnKTsKKworCQllcnJvcigiQ291bGRuJ3QgcmVhZGxpbms6ICVzIiwgZngydHh0KHN0YXR1cykpOworCQlidWZmZXJfZnJlZSgmbXNnKTsKKwkJcmV0dXJuKE5VTEwpOworCX0gZWxzZSBpZiAodHlwZSAhPSBTU0gyX0ZYUF9OQU1FKQorCQlmYXRhbCgiRXhwZWN0ZWQgU1NIMl9GWFBfTkFNRSgldSkgcGFja2V0LCBnb3QgJXUiLAorCQkgICAgU1NIMl9GWFBfTkFNRSwgdHlwZSk7CisKKwljb3VudCA9IGJ1ZmZlcl9nZXRfaW50KCZtc2cpOworCWlmIChjb3VudCAhPSAxKQorCQlmYXRhbCgiR290IG11bHRpcGxlIG5hbWVzICglZCkgZnJvbSBTU0hfRlhQX1JFQURMSU5LIiwgY291bnQpOworCisJZmlsZW5hbWUgPSBidWZmZXJfZ2V0X3N0cmluZygmbXNnLCBOVUxMKTsKKwlsb25nbmFtZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtc2csIE5VTEwpOworCWEgPSBkZWNvZGVfYXR0cmliKCZtc2cpOworCisJZGVidWczKCJTU0hfRlhQX1JFQURMSU5LICVzIC0+ICVzIiwgcGF0aCwgZmlsZW5hbWUpOworCisJeGZyZWUobG9uZ25hbWUpOworCisJYnVmZmVyX2ZyZWUoJm1zZyk7CisKKwlyZXR1cm4oZmlsZW5hbWUpOworfQorI2VuZGlmCisKK2ludAorZG9fc3RhdHZmcyhzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3Qgc2Z0cF9zdGF0dmZzICpzdCwKKyAgICBpbnQgcXVpZXQpCit7CisJQnVmZmVyIG1zZzsKKwl1X2ludCBpZDsKKworCWlmICgoY29ubi0+ZXh0cyAmIFNGVFBfRVhUX1NUQVRWRlMpID09IDApIHsKKwkJZXJyb3IoIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHN0YXR2ZnNAb3BlbnNzaC5jb20gZXh0ZW5zaW9uIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZCA9IGNvbm4tPm1zZ19pZCsrOworCisJYnVmZmVyX2luaXQoJm1zZyk7CisJYnVmZmVyX2NsZWFyKCZtc2cpOworCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0gyX0ZYUF9FWFRFTkRFRCk7CisJYnVmZmVyX3B1dF9pbnQoJm1zZywgaWQpOworCWJ1ZmZlcl9wdXRfY3N0cmluZygmbXNnLCAic3RhdHZmc0BvcGVuc3NoLmNvbSIpOworCWJ1ZmZlcl9wdXRfY3N0cmluZygmbXNnLCBwYXRoKTsKKwlzZW5kX21zZyhjb25uLCAmbXNnKTsKKwlidWZmZXJfZnJlZSgmbXNnKTsKKworCXJldHVybiBnZXRfZGVjb2RlX3N0YXR2ZnMoY29ubiwgc3QsIGlkLCBxdWlldCk7Cit9CisKKyNpZmRlZiBub3R5ZXQKK2ludAorZG9fZnN0YXR2ZnMoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgY29uc3QgY2hhciAqaGFuZGxlLCB1X2ludCBoYW5kbGVfbGVuLAorICAgIHN0cnVjdCBzZnRwX3N0YXR2ZnMgKnN0LCBpbnQgcXVpZXQpCit7CisJQnVmZmVyIG1zZzsKKwl1X2ludCBpZDsKKworCWlmICgoY29ubi0+ZXh0cyAmIFNGVFBfRVhUX0ZTVEFUVkZTKSA9PSAwKSB7CisJCWVycm9yKCJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBmc3RhdHZmc0BvcGVuc3NoLmNvbSBleHRlbnNpb24iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlkID0gY29ubi0+bXNnX2lkKys7CisKKwlidWZmZXJfaW5pdCgmbXNnKTsKKwlidWZmZXJfY2xlYXIoJm1zZyk7CisJYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSDJfRlhQX0VYVEVOREVEKTsKKwlidWZmZXJfcHV0X2ludCgmbXNnLCBpZCk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csICJmc3RhdHZmc0BvcGVuc3NoLmNvbSIpOworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtc2csIGhhbmRsZSwgaGFuZGxlX2xlbik7CisJc2VuZF9tc2coY29ubiwgJm1zZyk7CisJYnVmZmVyX2ZyZWUoJm1zZyk7CisKKwlyZXR1cm4gZ2V0X2RlY29kZV9zdGF0dmZzKGNvbm4sIHN0LCBpZCwgcXVpZXQpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitzZW5kX3JlYWRfcmVxdWVzdChzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCB1X2ludCBpZCwgdV9pbnQ2NF90IG9mZnNldCwKKyAgICB1X2ludCBsZW4sIGNoYXIgKmhhbmRsZSwgdV9pbnQgaGFuZGxlX2xlbikKK3sKKwlCdWZmZXIgbXNnOworCisJYnVmZmVyX2luaXQoJm1zZyk7CisJYnVmZmVyX2NsZWFyKCZtc2cpOworCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0gyX0ZYUF9SRUFEKTsKKwlidWZmZXJfcHV0X2ludCgmbXNnLCBpZCk7CisJYnVmZmVyX3B1dF9zdHJpbmcoJm1zZywgaGFuZGxlLCBoYW5kbGVfbGVuKTsKKwlidWZmZXJfcHV0X2ludDY0KCZtc2csIG9mZnNldCk7CisJYnVmZmVyX3B1dF9pbnQoJm1zZywgbGVuKTsKKwlzZW5kX21zZyhjb25uLCAmbXNnKTsKKwlidWZmZXJfZnJlZSgmbXNnKTsKK30KKworaW50Citkb19kb3dubG9hZChzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpyZW1vdGVfcGF0aCwgY2hhciAqbG9jYWxfcGF0aCwKKyAgICBBdHRyaWIgKmEsIGludCBwZmxhZykKK3sKKwlBdHRyaWIganVuazsKKwlCdWZmZXIgbXNnOworCWNoYXIgKmhhbmRsZTsKKwlpbnQgbG9jYWxfZmQsIHN0YXR1cyA9IDAsIHdyaXRlX2Vycm9yOworCWludCByZWFkX2Vycm9yLCB3cml0ZV9lcnJubzsKKwl1X2ludDY0X3Qgb2Zmc2V0LCBzaXplOworCXVfaW50IGhhbmRsZV9sZW4sIG1vZGUsIHR5cGUsIGlkLCBidWZsZW4sIG51bV9yZXEsIG1heF9yZXE7CisJb2ZmX3QgcHJvZ3Jlc3NfY291bnRlcjsKKwlzdHJ1Y3QgcmVxdWVzdCB7CisJCXVfaW50IGlkOworCQl1X2ludCBsZW47CisJCXVfaW50NjRfdCBvZmZzZXQ7CisJCVRBSUxRX0VOVFJZKHJlcXVlc3QpIHRxOworCX07CisJVEFJTFFfSEVBRChyZXFoZWFkLCByZXF1ZXN0KSByZXF1ZXN0czsKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxOworCisJVEFJTFFfSU5JVCgmcmVxdWVzdHMpOworCisJaWYgKGEgPT0gTlVMTCAmJiAoYSA9IGRvX3N0YXQoY29ubiwgcmVtb3RlX3BhdGgsIDApKSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwkvKiBEbyBub3QgcHJlc2VydmUgc2V0W3VnXWlkIGhlcmUsIGFzIHdlIGRvIG5vdCBwcmVzZXJ2ZSBvd25lcnNoaXAgKi8KKwlpZiAoYS0+ZmxhZ3MgJiBTU0gyX0ZJTEVYRkVSX0FUVFJfUEVSTUlTU0lPTlMpCisJCW1vZGUgPSBhLT5wZXJtICYgMDc3NzsKKwllbHNlCisJCW1vZGUgPSAwNjY2OworCisJaWYgKChhLT5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9QRVJNSVNTSU9OUykgJiYKKwkgICAgKCFTX0lTUkVHKGEtPnBlcm0pKSkgeworCQllcnJvcigiQ2Fubm90IGRvd25sb2FkIG5vbi1yZWd1bGFyIGZpbGU6ICVzIiwgcmVtb3RlX3BhdGgpOworCQlyZXR1cm4oLTEpOworCX0KKworCWlmIChhLT5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9TSVpFKQorCQlzaXplID0gYS0+c2l6ZTsKKwllbHNlCisJCXNpemUgPSAwOworCisJYnVmbGVuID0gY29ubi0+dHJhbnNmZXJfYnVmbGVuOworCWJ1ZmZlcl9pbml0KCZtc2cpOworCisJLyogU2VuZCBvcGVuIHJlcXVlc3QgKi8KKwlpZCA9IGNvbm4tPm1zZ19pZCsrOworCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0gyX0ZYUF9PUEVOKTsKKwlidWZmZXJfcHV0X2ludCgmbXNnLCBpZCk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csIHJlbW90ZV9wYXRoKTsKKwlidWZmZXJfcHV0X2ludCgmbXNnLCBTU0gyX0ZYRl9SRUFEKTsKKwlhdHRyaWJfY2xlYXIoJmp1bmspOyAvKiBTZW5kIGVtcHR5IGF0dHJpYnV0ZXMgKi8KKwllbmNvZGVfYXR0cmliKCZtc2csICZqdW5rKTsKKwlzZW5kX21zZyhjb25uLCAmbXNnKTsKKwlkZWJ1ZzMoIlNlbnQgbWVzc2FnZSBTU0gyX0ZYUF9PUEVOIEk6JXUgUDolcyIsIGlkLCByZW1vdGVfcGF0aCk7CisKKwloYW5kbGUgPSBnZXRfaGFuZGxlKGNvbm4sIGlkLCAmaGFuZGxlX2xlbiwKKwkgICAgInJlbW90ZSBvcGVuKFwiJXNcIikiLCByZW1vdGVfcGF0aCk7CisJaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisJCWJ1ZmZlcl9mcmVlKCZtc2cpOworCQlyZXR1cm4oLTEpOworCX0KKworCWxvY2FsX2ZkID0gb3Blbihsb2NhbF9wYXRoLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLAorCSAgICBtb2RlIHwgU19JV1JJVEUpOworCWlmIChsb2NhbF9mZCA9PSAtMSkgeworCQllcnJvcigiQ291bGRuJ3Qgb3BlbiBsb2NhbCBmaWxlIFwiJXNcIiBmb3Igd3JpdGluZzogJXMiLAorCQkgICAgbG9jYWxfcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZG9fY2xvc2UoY29ubiwgaGFuZGxlLCBoYW5kbGVfbGVuKTsKKwkJYnVmZmVyX2ZyZWUoJm1zZyk7CisJCXhmcmVlKGhhbmRsZSk7CisJCXJldHVybigtMSk7CisJfQorCisJLyogUmVhZCBmcm9tIHJlbW90ZSBhbmQgd3JpdGUgdG8gbG9jYWwgKi8KKwl3cml0ZV9lcnJvciA9IHJlYWRfZXJyb3IgPSB3cml0ZV9lcnJubyA9IG51bV9yZXEgPSBvZmZzZXQgPSAwOworCW1heF9yZXEgPSAxOworCXByb2dyZXNzX2NvdW50ZXIgPSAwOworCisJaWYgKHNob3dwcm9ncmVzcyAmJiBzaXplICE9IDApCisJCXN0YXJ0X3Byb2dyZXNzX21ldGVyKHJlbW90ZV9wYXRoLCBzaXplLCAmcHJvZ3Jlc3NfY291bnRlcik7CisKKwl3aGlsZSAobnVtX3JlcSA+IDAgfHwgbWF4X3JlcSA+IDApIHsKKwkJY2hhciAqZGF0YTsKKwkJdV9pbnQgbGVuOworCisJCS8qCisJCSAqIFNpbXVsYXRlIEVPRiBvbiBpbnRlcnJ1cHQ6IHN0b3Agc2VuZGluZyBuZXcgcmVxdWVzdHMgYW5kCisJCSAqIGFsbG93IG91dHN0YW5kaW5nIHJlcXVlc3RzIHRvIGRyYWluIGdyYWNlZnVsbHkKKwkJICovCisJCWlmIChpbnRlcnJ1cHRlZCkgeworCQkJaWYgKG51bV9yZXEgPT0gMCkgLyogSWYgd2UgaGF2ZW4ndCBzdGFydGVkIHlldC4uLiAqLworCQkJCWJyZWFrOworCQkJbWF4X3JlcSA9IDA7CisJCX0KKworCQkvKiBTZW5kIHNvbWUgbW9yZSByZXF1ZXN0cyAqLworCQl3aGlsZSAobnVtX3JlcSA8IG1heF9yZXEpIHsKKwkJCWRlYnVnMygiUmVxdWVzdCByYW5nZSAlbGx1IC0+ICVsbHUgKCVkLyVkKSIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvZmZzZXQsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvZmZzZXQgKyBidWZsZW4gLSAxLAorCQkJICAgIG51bV9yZXEsIG1heF9yZXEpOworCQkJcmVxID0geG1hbGxvYyhzaXplb2YoKnJlcSkpOworCQkJcmVxLT5pZCA9IGNvbm4tPm1zZ19pZCsrOworCQkJcmVxLT5sZW4gPSBidWZsZW47CisJCQlyZXEtPm9mZnNldCA9IG9mZnNldDsKKwkJCW9mZnNldCArPSBidWZsZW47CisJCQludW1fcmVxKys7CisJCQlUQUlMUV9JTlNFUlRfVEFJTCgmcmVxdWVzdHMsIHJlcSwgdHEpOworCQkJc2VuZF9yZWFkX3JlcXVlc3QoY29ubiwgcmVxLT5pZCwgcmVxLT5vZmZzZXQsCisJCQkgICAgcmVxLT5sZW4sIGhhbmRsZSwgaGFuZGxlX2xlbik7CisJCX0KKworCQlidWZmZXJfY2xlYXIoJm1zZyk7CisJCWdldF9tc2coY29ubiwgJm1zZyk7CisJCXR5cGUgPSBidWZmZXJfZ2V0X2NoYXIoJm1zZyk7CisJCWlkID0gYnVmZmVyX2dldF9pbnQoJm1zZyk7CisJCWRlYnVnMygiUmVjZWl2ZWQgcmVwbHkgVDoldSBJOiV1IFI6JWQiLCB0eXBlLCBpZCwgbWF4X3JlcSk7CisKKwkJLyogRmluZCB0aGUgcmVxdWVzdCBpbiBvdXIgcXVldWUgKi8KKwkJZm9yIChyZXEgPSBUQUlMUV9GSVJTVCgmcmVxdWVzdHMpOworCQkgICAgcmVxICE9IE5VTEwgJiYgcmVxLT5pZCAhPSBpZDsKKwkJICAgIHJlcSA9IFRBSUxRX05FWFQocmVxLCB0cSkpCisJCQk7CisJCWlmIChyZXEgPT0gTlVMTCkKKwkJCWZhdGFsKCJVbmV4cGVjdGVkIHJlcGx5ICV1IiwgaWQpOworCisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFNTSDJfRlhQX1NUQVRVUzoKKwkJCXN0YXR1cyA9IGJ1ZmZlcl9nZXRfaW50KCZtc2cpOworCQkJaWYgKHN0YXR1cyAhPSBTU0gyX0ZYX0VPRikKKwkJCQlyZWFkX2Vycm9yID0gMTsKKwkJCW1heF9yZXEgPSAwOworCQkJVEFJTFFfUkVNT1ZFKCZyZXF1ZXN0cywgcmVxLCB0cSk7CisJCQl4ZnJlZShyZXEpOworCQkJbnVtX3JlcS0tOworCQkJYnJlYWs7CisJCWNhc2UgU1NIMl9GWFBfREFUQToKKwkJCWRhdGEgPSBidWZmZXJfZ2V0X3N0cmluZygmbXNnLCAmbGVuKTsKKwkJCWRlYnVnMygiUmVjZWl2ZWQgZGF0YSAlbGx1IC0+ICVsbHUiLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmVxLT5vZmZzZXQsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXEtPm9mZnNldCArIGxlbiAtIDEpOworCQkJaWYgKGxlbiA+IHJlcS0+bGVuKQorCQkJCWZhdGFsKCJSZWNlaXZlZCBtb3JlIGRhdGEgdGhhbiBhc2tlZCBmb3IgIgorCQkJCSAgICAiJXUgPiAldSIsIGxlbiwgcmVxLT5sZW4pOworCQkJaWYgKChsc2Vlayhsb2NhbF9mZCwgcmVxLT5vZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSB8fAorCQkJICAgIGF0b21pY2lvKHZ3cml0ZSwgbG9jYWxfZmQsIGRhdGEsIGxlbikgIT0gbGVuKSAmJgorCQkJICAgICF3cml0ZV9lcnJvcikgeworCQkJCXdyaXRlX2Vycm5vID0gZXJybm87CisJCQkJd3JpdGVfZXJyb3IgPSAxOworCQkJCW1heF9yZXEgPSAwOworCQkJfQorCQkJcHJvZ3Jlc3NfY291bnRlciArPSBsZW47CisJCQl4ZnJlZShkYXRhKTsKKworCQkJaWYgKGxlbiA9PSByZXEtPmxlbikgeworCQkJCVRBSUxRX1JFTU9WRSgmcmVxdWVzdHMsIHJlcSwgdHEpOworCQkJCXhmcmVlKHJlcSk7CisJCQkJbnVtX3JlcS0tOworCQkJfSBlbHNlIHsKKwkJCQkvKiBSZXNlbmQgdGhlIHJlcXVlc3QgZm9yIHRoZSBtaXNzaW5nIGRhdGEgKi8KKwkJCQlkZWJ1ZzMoIlNob3J0IGRhdGEgYmxvY2ssIHJlLXJlcXVlc3RpbmcgIgorCQkJCSAgICAiJWxsdSAtPiAlbGx1ICglMmQpIiwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXEtPm9mZnNldCArIGxlbiwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXEtPm9mZnNldCArCisJCQkJICAgIHJlcS0+bGVuIC0gMSwgbnVtX3JlcSk7CisJCQkJcmVxLT5pZCA9IGNvbm4tPm1zZ19pZCsrOworCQkJCXJlcS0+bGVuIC09IGxlbjsKKwkJCQlyZXEtPm9mZnNldCArPSBsZW47CisJCQkJc2VuZF9yZWFkX3JlcXVlc3QoY29ubiwgcmVxLT5pZCwKKwkJCQkgICAgcmVxLT5vZmZzZXQsIHJlcS0+bGVuLCBoYW5kbGUsIGhhbmRsZV9sZW4pOworCQkJCS8qIFJlZHVjZSB0aGUgcmVxdWVzdCBzaXplICovCisJCQkJaWYgKGxlbiA8IGJ1ZmxlbikKKwkJCQkJYnVmbGVuID0gTUFYKE1JTl9SRUFEX1NJWkUsIGxlbik7CisJCQl9CisJCQlpZiAobWF4X3JlcSA+IDApIHsgLyogbWF4X3JlcSA9IDAgaWZmIEVPRiByZWNlaXZlZCAqLworCQkJCWlmIChzaXplID4gMCAmJiBvZmZzZXQgPiBzaXplKSB7CisJCQkJCS8qIE9ubHkgb25lIHJlcXVlc3QgYXQgYSB0aW1lCisJCQkJCSAqIGFmdGVyIHRoZSBleHBlY3RlZCBFT0YgKi8KKwkJCQkJZGVidWczKCJGaW5pc2ggYXQgJWxsdSAoJTJkKSIsCisJCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKW9mZnNldCwKKwkJCQkJICAgIG51bV9yZXEpOworCQkJCQltYXhfcmVxID0gMTsKKwkJCQl9IGVsc2UgaWYgKG1heF9yZXEgPD0gY29ubi0+bnVtX3JlcXVlc3RzKSB7CisJCQkJCSsrbWF4X3JlcTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZhdGFsKCJFeHBlY3RlZCBTU0gyX0ZYUF9EQVRBKCV1KSBwYWNrZXQsIGdvdCAldSIsCisJCQkgICAgU1NIMl9GWFBfREFUQSwgdHlwZSk7CisJCX0KKwl9CisKKwlpZiAoc2hvd3Byb2dyZXNzICYmIHNpemUpCisJCXN0b3BfcHJvZ3Jlc3NfbWV0ZXIoKTsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmIChUQUlMUV9GSVJTVCgmcmVxdWVzdHMpICE9IE5VTEwpCisJCWZhdGFsKCJUcmFuc2ZlciBjb21wbGV0ZSwgYnV0IHJlcXVlc3RzIHN0aWxsIGluIHF1ZXVlIik7CisKKwlpZiAocmVhZF9lcnJvcikgeworCQllcnJvcigiQ291bGRuJ3QgcmVhZCBmcm9tIHJlbW90ZSBmaWxlIFwiJXNcIiA6ICVzIiwKKwkJICAgIHJlbW90ZV9wYXRoLCBmeDJ0eHQoc3RhdHVzKSk7CisJCWRvX2Nsb3NlKGNvbm4sIGhhbmRsZSwgaGFuZGxlX2xlbik7CisJfSBlbHNlIGlmICh3cml0ZV9lcnJvcikgeworCQllcnJvcigiQ291bGRuJ3Qgd3JpdGUgdG8gXCIlc1wiOiAlcyIsIGxvY2FsX3BhdGgsCisJCSAgICBzdHJlcnJvcih3cml0ZV9lcnJubykpOworCQlzdGF0dXMgPSAtMTsKKwkJZG9fY2xvc2UoY29ubiwgaGFuZGxlLCBoYW5kbGVfbGVuKTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSBkb19jbG9zZShjb25uLCBoYW5kbGUsIGhhbmRsZV9sZW4pOworCisJCS8qIE92ZXJyaWRlIHVtYXNrIGFuZCB1dGltZXMgaWYgYXNrZWQgKi8KKyNpZmRlZiBIQVZFX0ZDSE1PRAorCQlpZiAocGZsYWcgJiYgZmNobW9kKGxvY2FsX2ZkLCBtb2RlKSA9PSAtMSkKKyNlbHNlCisJCWlmIChwZmxhZyAmJiBjaG1vZChsb2NhbF9wYXRoLCBtb2RlKSA9PSAtMSkKKyNlbmRpZiAvKiBIQVZFX0ZDSE1PRCAqLworCQkJZXJyb3IoIkNvdWxkbid0IHNldCBtb2RlIG9uIFwiJXNcIjogJXMiLCBsb2NhbF9wYXRoLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCWlmIChwZmxhZyAmJiAoYS0+ZmxhZ3MgJiBTU0gyX0ZJTEVYRkVSX0FUVFJfQUNNT0RUSU1FKSkgeworCQkJc3RydWN0IHRpbWV2YWwgdHZbMl07CisJCQl0dlswXS50dl9zZWMgPSBhLT5hdGltZTsKKwkJCXR2WzFdLnR2X3NlYyA9IGEtPm10aW1lOworCQkJdHZbMF0udHZfdXNlYyA9IHR2WzFdLnR2X3VzZWMgPSAwOworCQkJaWYgKHV0aW1lcyhsb2NhbF9wYXRoLCB0dikgPT0gLTEpCisJCQkJZXJyb3IoIkNhbid0IHNldCB0aW1lcyBvbiBcIiVzXCI6ICVzIiwKKwkJCQkgICAgbG9jYWxfcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCX0KKwljbG9zZShsb2NhbF9mZCk7CisJYnVmZmVyX2ZyZWUoJm1zZyk7CisJeGZyZWUoaGFuZGxlKTsKKworCXJldHVybihzdGF0dXMpOworfQorCitzdGF0aWMgaW50Citkb3dubG9hZF9kaXJfaW50ZXJuYWwoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgY2hhciAqc3JjLCBjaGFyICpkc3QsCisgICAgQXR0cmliICpkaXJhdHRyaWIsIGludCBwZmxhZywgaW50IHByaW50ZmxhZywgaW50IGRlcHRoKQoreworCWludCBpLCByZXQgPSAwOworCVNGVFBfRElSRU5UICoqZGlyX2VudHJpZXM7CisJY2hhciAqZmlsZW5hbWUsICpuZXdfc3JjLCAqbmV3X2RzdDsKKwltb2RlX3QgbW9kZSA9IDA3Nzc7CisKKwlpZiAoZGVwdGggPj0gTUFYX0RJUl9ERVBUSCkgeworCQllcnJvcigiTWF4aW11bSBkaXJlY3RvcnkgZGVwdGggZXhjZWVkZWQ6ICVkIGxldmVscyIsIGRlcHRoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChkaXJhdHRyaWIgPT0gTlVMTCAmJgorCSAgICAoZGlyYXR0cmliID0gZG9fc3RhdChjb25uLCBzcmMsIDEpKSA9PSBOVUxMKSB7CisJCWVycm9yKCJVbmFibGUgdG8gc3RhdCByZW1vdGUgZGlyZWN0b3J5IFwiJXNcIiIsIHNyYyk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKCFTX0lTRElSKGRpcmF0dHJpYi0+cGVybSkpIHsKKwkJZXJyb3IoIlwiJXNcIiBpcyBub3QgYSBkaXJlY3RvcnkiLCBzcmMpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChwcmludGZsYWcpCisJCXByaW50ZigiUmV0cmlldmluZyAlc1xuIiwgc3JjKTsKKworCWlmIChkaXJhdHRyaWItPmZsYWdzICYgU1NIMl9GSUxFWEZFUl9BVFRSX1BFUk1JU1NJT05TKQorCQltb2RlID0gZGlyYXR0cmliLT5wZXJtICYgMDE3Nzc7CisJZWxzZSB7CisJCWRlYnVnKCJTZXJ2ZXIgZGlkIG5vdCBzZW5kIHBlcm1pc3Npb25zIGZvciAiCisJCSAgICAiZGlyZWN0b3J5IFwiJXNcIiIsIGRzdCk7CisJfQorCisJaWYgKG1rZGlyKGRzdCwgbW9kZSkgPT0gLTEgJiYgZXJybm8gIT0gRUVYSVNUKSB7CisJCWVycm9yKCJta2RpciAlczogJXMiLCBkc3QsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZG9fcmVhZGRpcihjb25uLCBzcmMsICZkaXJfZW50cmllcykgPT0gLTEpIHsKKwkJZXJyb3IoIiVzOiBGYWlsZWQgdG8gZ2V0IGRpcmVjdG9yeSBjb250ZW50cyIsIHNyYyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlmb3IgKGkgPSAwOyBkaXJfZW50cmllc1tpXSAhPSBOVUxMICYmICFpbnRlcnJ1cHRlZDsgaSsrKSB7CisJCWZpbGVuYW1lID0gZGlyX2VudHJpZXNbaV0tPmZpbGVuYW1lOworCisJCW5ld19kc3QgPSBwYXRoX2FwcGVuZChkc3QsIGZpbGVuYW1lKTsKKwkJbmV3X3NyYyA9IHBhdGhfYXBwZW5kKHNyYywgZmlsZW5hbWUpOworCisJCWlmIChTX0lTRElSKGRpcl9lbnRyaWVzW2ldLT5hLnBlcm0pKSB7CisJCQlpZiAoc3RyY21wKGZpbGVuYW1lLCAiLiIpID09IDAgfHwKKwkJCSAgICBzdHJjbXAoZmlsZW5hbWUsICIuLiIpID09IDApCisJCQkJY29udGludWU7CisJCQlpZiAoZG93bmxvYWRfZGlyX2ludGVybmFsKGNvbm4sIG5ld19zcmMsIG5ld19kc3QsCisJCQkgICAgJihkaXJfZW50cmllc1tpXS0+YSksIHBmbGFnLCBwcmludGZsYWcsCisJCQkgICAgZGVwdGggKyAxKSA9PSAtMSkKKwkJCQlyZXQgPSAtMTsKKwkJfSBlbHNlIGlmIChTX0lTUkVHKGRpcl9lbnRyaWVzW2ldLT5hLnBlcm0pICkgeworCQkJaWYgKGRvX2Rvd25sb2FkKGNvbm4sIG5ld19zcmMsIG5ld19kc3QsCisJCQkgICAgJihkaXJfZW50cmllc1tpXS0+YSksIHBmbGFnKSA9PSAtMSkgeworCQkJCWVycm9yKCJEb3dubG9hZCBvZiBmaWxlICVzIHRvICVzIGZhaWxlZCIsCisJCQkJICAgIG5ld19zcmMsIG5ld19kc3QpOworCQkJCXJldCA9IC0xOworCQkJfQorCQl9IGVsc2UKKwkJCWxvZ2l0KCIlczogbm90IGEgcmVndWxhciBmaWxlXG4iLCBuZXdfc3JjKTsKKworCQl4ZnJlZShuZXdfZHN0KTsKKwkJeGZyZWUobmV3X3NyYyk7CisJfQorCisJaWYgKHBmbGFnKSB7CisJCWlmIChkaXJhdHRyaWItPmZsYWdzICYgU1NIMl9GSUxFWEZFUl9BVFRSX0FDTU9EVElNRSkgeworCQkJc3RydWN0IHRpbWV2YWwgdHZbMl07CisJCQl0dlswXS50dl9zZWMgPSBkaXJhdHRyaWItPmF0aW1lOworCQkJdHZbMV0udHZfc2VjID0gZGlyYXR0cmliLT5tdGltZTsKKwkJCXR2WzBdLnR2X3VzZWMgPSB0dlsxXS50dl91c2VjID0gMDsKKwkJCWlmICh1dGltZXMoZHN0LCB0dikgPT0gLTEpCisJCQkJZXJyb3IoIkNhbid0IHNldCB0aW1lcyBvbiBcIiVzXCI6ICVzIiwKKwkJCQkgICAgZHN0LCBzdHJlcnJvcihlcnJubykpOworCQl9IGVsc2UKKwkJCWRlYnVnKCJTZXJ2ZXIgZGlkIG5vdCBzZW5kIHRpbWVzIGZvciBkaXJlY3RvcnkgIgorCQkJICAgICJcIiVzXCIiLCBkc3QpOworCX0KKworCWZyZWVfc2Z0cF9kaXJlbnRzKGRpcl9lbnRyaWVzKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludAorZG93bmxvYWRfZGlyKHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIGNoYXIgKnNyYywgY2hhciAqZHN0LAorICAgIEF0dHJpYiAqZGlyYXR0cmliLCBpbnQgcGZsYWcsIGludCBwcmludGZsYWcpCit7CisJY2hhciAqc3JjX2Nhbm9uOworCWludCByZXQ7CisKKwlpZiAoKHNyY19jYW5vbiA9IGRvX3JlYWxwYXRoKGNvbm4sIHNyYykpID09IE5VTEwpIHsKKwkJZXJyb3IoIlVuYWJsZSB0byBjYW5vbmljYWxpc2UgcGF0aCBcIiVzXCIiLCBzcmMpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0ID0gZG93bmxvYWRfZGlyX2ludGVybmFsKGNvbm4sIHNyY19jYW5vbiwgZHN0LAorCSAgICBkaXJhdHRyaWIsIHBmbGFnLCBwcmludGZsYWcsIDApOworCXhmcmVlKHNyY19jYW5vbik7CisJcmV0dXJuIHJldDsKK30KKworaW50Citkb191cGxvYWQoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgY2hhciAqbG9jYWxfcGF0aCwgY2hhciAqcmVtb3RlX3BhdGgsCisgICAgaW50IHBmbGFnKQoreworCWludCBsb2NhbF9mZDsKKwlpbnQgc3RhdHVzID0gU1NIMl9GWF9PSzsKKwl1X2ludCBoYW5kbGVfbGVuLCBpZCwgdHlwZTsKKwlvZmZfdCBvZmZzZXQ7CisJY2hhciAqaGFuZGxlLCAqZGF0YTsKKwlCdWZmZXIgbXNnOworCXN0cnVjdCBzdGF0IHNiOworCUF0dHJpYiBhOworCXVfaW50MzJfdCBzdGFydGlkOworCXVfaW50MzJfdCBhY2tpZDsKKwlzdHJ1Y3Qgb3V0c3RhbmRpbmdfYWNrIHsKKwkJdV9pbnQgaWQ7CisJCXVfaW50IGxlbjsKKwkJb2ZmX3Qgb2Zmc2V0OworCQlUQUlMUV9FTlRSWShvdXRzdGFuZGluZ19hY2spIHRxOworCX07CisJVEFJTFFfSEVBRChhY2toZWFkLCBvdXRzdGFuZGluZ19hY2spIGFja3M7CisJc3RydWN0IG91dHN0YW5kaW5nX2FjayAqYWNrID0gTlVMTDsKKworCVRBSUxRX0lOSVQoJmFja3MpOworCisJaWYgKChsb2NhbF9mZCA9IG9wZW4obG9jYWxfcGF0aCwgT19SRE9OTFksIDApKSA9PSAtMSkgeworCQllcnJvcigiQ291bGRuJ3Qgb3BlbiBsb2NhbCBmaWxlIFwiJXNcIiBmb3IgcmVhZGluZzogJXMiLAorCQkgICAgbG9jYWxfcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJaWYgKGZzdGF0KGxvY2FsX2ZkLCAmc2IpID09IC0xKSB7CisJCWVycm9yKCJDb3VsZG4ndCBmc3RhdCBsb2NhbCBmaWxlIFwiJXNcIjogJXMiLAorCQkgICAgbG9jYWxfcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UobG9jYWxfZmQpOworCQlyZXR1cm4oLTEpOworCX0KKwlpZiAoIVNfSVNSRUcoc2Iuc3RfbW9kZSkpIHsKKwkJZXJyb3IoIiVzIGlzIG5vdCBhIHJlZ3VsYXIgZmlsZSIsIGxvY2FsX3BhdGgpOworCQljbG9zZShsb2NhbF9mZCk7CisJCXJldHVybigtMSk7CisJfQorCXN0YXRfdG9fYXR0cmliKCZzYiwgJmEpOworCisJYS5mbGFncyAmPSB+U1NIMl9GSUxFWEZFUl9BVFRSX1NJWkU7CisJYS5mbGFncyAmPSB+U1NIMl9GSUxFWEZFUl9BVFRSX1VJREdJRDsKKwlhLnBlcm0gJj0gMDc3NzsKKwlpZiAoIXBmbGFnKQorCQlhLmZsYWdzICY9IH5TU0gyX0ZJTEVYRkVSX0FUVFJfQUNNT0RUSU1FOworCisJYnVmZmVyX2luaXQoJm1zZyk7CisKKwkvKiBTZW5kIG9wZW4gcmVxdWVzdCAqLworCWlkID0gY29ubi0+bXNnX2lkKys7CisJYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSDJfRlhQX09QRU4pOworCWJ1ZmZlcl9wdXRfaW50KCZtc2csIGlkKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcoJm1zZywgcmVtb3RlX3BhdGgpOworCWJ1ZmZlcl9wdXRfaW50KCZtc2csIFNTSDJfRlhGX1dSSVRFfFNTSDJfRlhGX0NSRUFUfFNTSDJfRlhGX1RSVU5DKTsKKwllbmNvZGVfYXR0cmliKCZtc2csICZhKTsKKwlzZW5kX21zZyhjb25uLCAmbXNnKTsKKwlkZWJ1ZzMoIlNlbnQgbWVzc2FnZSBTU0gyX0ZYUF9PUEVOIEk6JXUgUDolcyIsIGlkLCByZW1vdGVfcGF0aCk7CisKKwlidWZmZXJfY2xlYXIoJm1zZyk7CisKKwloYW5kbGUgPSBnZXRfaGFuZGxlKGNvbm4sIGlkLCAmaGFuZGxlX2xlbiwKKwkgICAgInJlbW90ZSBvcGVuKFwiJXNcIikiLCByZW1vdGVfcGF0aCk7CisJaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisJCWNsb3NlKGxvY2FsX2ZkKTsKKwkJYnVmZmVyX2ZyZWUoJm1zZyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlzdGFydGlkID0gYWNraWQgPSBpZCArIDE7CisJZGF0YSA9IHhtYWxsb2MoY29ubi0+dHJhbnNmZXJfYnVmbGVuKTsKKworCS8qIFJlYWQgZnJvbSBsb2NhbCBhbmQgd3JpdGUgdG8gcmVtb3RlICovCisJb2Zmc2V0ID0gMDsKKwlpZiAoc2hvd3Byb2dyZXNzKQorCQlzdGFydF9wcm9ncmVzc19tZXRlcihsb2NhbF9wYXRoLCBzYi5zdF9zaXplLCAmb2Zmc2V0KTsKKworCWZvciAoOzspIHsKKwkJaW50IGxlbjsKKworCQkvKgorCQkgKiBDYW4ndCB1c2UgYXRvbWljaW8gaGVyZSBiZWNhdXNlIGl0IHJldHVybnMgMCBvbiBFT0YsCisJCSAqIHRodXMgbG9zaW5nIHRoZSBsYXN0IGJsb2NrIG9mIHRoZSBmaWxlLgorCQkgKiBTaW11bGF0ZSBhbiBFT0Ygb24gaW50ZXJydXB0LCBhbGxvd2luZyBBQ0tzIGZyb20gdGhlCisJCSAqIHNlcnZlciB0byBkcmFpbi4KKwkJICovCisJCWlmIChpbnRlcnJ1cHRlZCB8fCBzdGF0dXMgIT0gU1NIMl9GWF9PSykKKwkJCWxlbiA9IDA7CisJCWVsc2UgZG8KKwkJCWxlbiA9IHJlYWQobG9jYWxfZmQsIGRhdGEsIGNvbm4tPnRyYW5zZmVyX2J1Zmxlbik7CisJCXdoaWxlICgobGVuID09IC0xKSAmJgorCQkgICAgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykpOworCisJCWlmIChsZW4gPT0gLTEpCisJCQlmYXRhbCgiQ291bGRuJ3QgcmVhZCBmcm9tIFwiJXNcIjogJXMiLCBsb2NhbF9wYXRoLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisKKwkJaWYgKGxlbiAhPSAwKSB7CisJCQlhY2sgPSB4bWFsbG9jKHNpemVvZigqYWNrKSk7CisJCQlhY2stPmlkID0gKytpZDsKKwkJCWFjay0+b2Zmc2V0ID0gb2Zmc2V0OworCQkJYWNrLT5sZW4gPSBsZW47CisJCQlUQUlMUV9JTlNFUlRfVEFJTCgmYWNrcywgYWNrLCB0cSk7CisKKwkJCWJ1ZmZlcl9jbGVhcigmbXNnKTsKKwkJCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0gyX0ZYUF9XUklURSk7CisJCQlidWZmZXJfcHV0X2ludCgmbXNnLCBhY2stPmlkKTsKKwkJCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtc2csIGhhbmRsZSwgaGFuZGxlX2xlbik7CisJCQlidWZmZXJfcHV0X2ludDY0KCZtc2csIG9mZnNldCk7CisJCQlidWZmZXJfcHV0X3N0cmluZygmbXNnLCBkYXRhLCBsZW4pOworCQkJc2VuZF9tc2coY29ubiwgJm1zZyk7CisJCQlkZWJ1ZzMoIlNlbnQgbWVzc2FnZSBTU0gyX0ZYUF9XUklURSBJOiV1IE86JWxsdSBTOiV1IiwKKwkJCSAgICBpZCwgKHVuc2lnbmVkIGxvbmcgbG9uZylvZmZzZXQsIGxlbik7CisJCX0gZWxzZSBpZiAoVEFJTFFfRklSU1QoJmFja3MpID09IE5VTEwpCisJCQlicmVhazsKKworCQlpZiAoYWNrID09IE5VTEwpCisJCQlmYXRhbCgiVW5leHBlY3RlZCBBQ0sgJXUiLCBpZCk7CisKKwkJaWYgKGlkID09IHN0YXJ0aWQgfHwgbGVuID09IDAgfHwKKwkJICAgIGlkIC0gYWNraWQgPj0gY29ubi0+bnVtX3JlcXVlc3RzKSB7CisJCQl1X2ludCByX2lkOworCisJCQlidWZmZXJfY2xlYXIoJm1zZyk7CisJCQlnZXRfbXNnKGNvbm4sICZtc2cpOworCQkJdHlwZSA9IGJ1ZmZlcl9nZXRfY2hhcigmbXNnKTsKKwkJCXJfaWQgPSBidWZmZXJfZ2V0X2ludCgmbXNnKTsKKworCQkJaWYgKHR5cGUgIT0gU1NIMl9GWFBfU1RBVFVTKQorCQkJCWZhdGFsKCJFeHBlY3RlZCBTU0gyX0ZYUF9TVEFUVVMoJWQpIHBhY2tldCwgIgorCQkJCSAgICAiZ290ICVkIiwgU1NIMl9GWFBfU1RBVFVTLCB0eXBlKTsKKworCQkJc3RhdHVzID0gYnVmZmVyX2dldF9pbnQoJm1zZyk7CisJCQlkZWJ1ZzMoIlNTSDJfRlhQX1NUQVRVUyAlZCIsIHN0YXR1cyk7CisKKwkJCS8qIEZpbmQgdGhlIHJlcXVlc3QgaW4gb3VyIHF1ZXVlICovCisJCQlmb3IgKGFjayA9IFRBSUxRX0ZJUlNUKCZhY2tzKTsKKwkJCSAgICBhY2sgIT0gTlVMTCAmJiBhY2stPmlkICE9IHJfaWQ7CisJCQkgICAgYWNrID0gVEFJTFFfTkVYVChhY2ssIHRxKSkKKwkJCQk7CisJCQlpZiAoYWNrID09IE5VTEwpCisJCQkJZmF0YWwoIkNhbid0IGZpbmQgcmVxdWVzdCBmb3IgSUQgJXUiLCByX2lkKTsKKwkJCVRBSUxRX1JFTU9WRSgmYWNrcywgYWNrLCB0cSk7CisJCQlkZWJ1ZzMoIkluIHdyaXRlIGxvb3AsIGFjayBmb3IgJXUgJXUgYnl0ZXMgYXQgJWxsZCIsCisJCQkgICAgYWNrLT5pZCwgYWNrLT5sZW4sIChsb25nIGxvbmcpYWNrLT5vZmZzZXQpOworCQkJKythY2tpZDsKKwkJCXhmcmVlKGFjayk7CisJCX0KKwkJb2Zmc2V0ICs9IGxlbjsKKwkJaWYgKG9mZnNldCA8IDApCisJCQlmYXRhbCgiJXM6IG9mZnNldCA8IDAiLCBfX2Z1bmNfXyk7CisJfQorCWJ1ZmZlcl9mcmVlKCZtc2cpOworCisJaWYgKHNob3dwcm9ncmVzcykKKwkJc3RvcF9wcm9ncmVzc19tZXRlcigpOworCXhmcmVlKGRhdGEpOworCisJaWYgKHN0YXR1cyAhPSBTU0gyX0ZYX09LKSB7CisJCWVycm9yKCJDb3VsZG4ndCB3cml0ZSB0byByZW1vdGUgZmlsZSBcIiVzXCI6ICVzIiwKKwkJICAgIHJlbW90ZV9wYXRoLCBmeDJ0eHQoc3RhdHVzKSk7CisJCXN0YXR1cyA9IC0xOworCX0KKworCWlmIChjbG9zZShsb2NhbF9mZCkgPT0gLTEpIHsKKwkJZXJyb3IoIkNvdWxkbid0IGNsb3NlIGxvY2FsIGZpbGUgXCIlc1wiOiAlcyIsIGxvY2FsX3BhdGgsCisJCSAgICBzdHJlcnJvcihlcnJubykpOworCQlzdGF0dXMgPSAtMTsKKwl9CisKKwkvKiBPdmVycmlkZSB1bWFzayBhbmQgdXRpbWVzIGlmIGFza2VkICovCisJaWYgKHBmbGFnKQorCQlkb19mc2V0c3RhdChjb25uLCBoYW5kbGUsIGhhbmRsZV9sZW4sICZhKTsKKworCWlmIChkb19jbG9zZShjb25uLCBoYW5kbGUsIGhhbmRsZV9sZW4pICE9IFNTSDJfRlhfT0spCisJCXN0YXR1cyA9IC0xOworCXhmcmVlKGhhbmRsZSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50Cit1cGxvYWRfZGlyX2ludGVybmFsKHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIGNoYXIgKnNyYywgY2hhciAqZHN0LAorICAgIGludCBwZmxhZywgaW50IHByaW50ZmxhZywgaW50IGRlcHRoKQoreworCWludCByZXQgPSAwLCBzdGF0dXM7CisJRElSICpkaXJwOworCXN0cnVjdCBkaXJlbnQgKmRwOworCWNoYXIgKmZpbGVuYW1lLCAqbmV3X3NyYywgKm5ld19kc3Q7CisJc3RydWN0IHN0YXQgc2I7CisJQXR0cmliIGE7CisKKwlpZiAoZGVwdGggPj0gTUFYX0RJUl9ERVBUSCkgeworCQllcnJvcigiTWF4aW11bSBkaXJlY3RvcnkgZGVwdGggZXhjZWVkZWQ6ICVkIGxldmVscyIsIGRlcHRoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChzdGF0KHNyYywgJnNiKSA9PSAtMSkgeworCQllcnJvcigiQ291bGRuJ3Qgc3RhdCBkaXJlY3RvcnkgXCIlc1wiOiAlcyIsCisJCSAgICBzcmMsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKCFTX0lTRElSKHNiLnN0X21vZGUpKSB7CisJCWVycm9yKCJcIiVzXCIgaXMgbm90IGEgZGlyZWN0b3J5Iiwgc3JjKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAocHJpbnRmbGFnKQorCQlwcmludGYoIkVudGVyaW5nICVzXG4iLCBzcmMpOworCisJYXR0cmliX2NsZWFyKCZhKTsKKwlzdGF0X3RvX2F0dHJpYigmc2IsICZhKTsKKwlhLmZsYWdzICY9IH5TU0gyX0ZJTEVYRkVSX0FUVFJfU0laRTsKKwlhLmZsYWdzICY9IH5TU0gyX0ZJTEVYRkVSX0FUVFJfVUlER0lEOworCWEucGVybSAmPSAwMTc3NzsKKwlpZiAoIXBmbGFnKQorCQlhLmZsYWdzICY9IH5TU0gyX0ZJTEVYRkVSX0FUVFJfQUNNT0RUSU1FOworCQorCXN0YXR1cyA9IGRvX21rZGlyKGNvbm4sIGRzdCwgJmEsIDApOworCS8qCisJICogd2UgbGFjayBhIHBvcnRhYmxlIHN0YXR1cyBmb3IgZXJybm8gRUVYSVNULAorCSAqIHNvIGlmIHdlIGdldCBhIFNTSDJfRlhfRkFJTFVSRSBiYWNrIHdlIG11c3QgY2hlY2sKKwkgKiBpZiBpdCB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisJICovCisJaWYgKHN0YXR1cyAhPSBTU0gyX0ZYX09LKSB7CisJCWlmIChzdGF0dXMgIT0gU1NIMl9GWF9GQUlMVVJFKQorCQkJcmV0dXJuIC0xOworCQlpZiAoZG9fc3RhdChjb25uLCBkc3QsIDApID09IE5VTEwpIAorCQkJcmV0dXJuIC0xOworCX0KKworCWlmICgoZGlycCA9IG9wZW5kaXIoc3JjKSkgPT0gTlVMTCkgeworCQllcnJvcigiRmFpbGVkIHRvIG9wZW4gZGlyIFwiJXNcIjogJXMiLCBzcmMsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisJCisJd2hpbGUgKCgoZHAgPSByZWFkZGlyKGRpcnApKSAhPSBOVUxMKSAmJiAhaW50ZXJydXB0ZWQpIHsKKwkJaWYgKGRwLT5kX2lubyA9PSAwKQorCQkJY29udGludWU7CisJCWZpbGVuYW1lID0gZHAtPmRfbmFtZTsKKwkJbmV3X2RzdCA9IHBhdGhfYXBwZW5kKGRzdCwgZmlsZW5hbWUpOworCQluZXdfc3JjID0gcGF0aF9hcHBlbmQoc3JjLCBmaWxlbmFtZSk7CisKKwkJaWYgKGxzdGF0KG5ld19zcmMsICZzYikgPT0gLTEpIHsKKwkJCWxvZ2l0KCIlczogbHN0YXQgZmFpbGVkOiAlcyIsIGZpbGVuYW1lLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXQgPSAtMTsKKwkJfSBlbHNlIGlmIChTX0lTRElSKHNiLnN0X21vZGUpKSB7CisJCQlpZiAoc3RyY21wKGZpbGVuYW1lLCAiLiIpID09IDAgfHwKKwkJCSAgICBzdHJjbXAoZmlsZW5hbWUsICIuLiIpID09IDApCisJCQkJY29udGludWU7CisKKwkJCWlmICh1cGxvYWRfZGlyX2ludGVybmFsKGNvbm4sIG5ld19zcmMsIG5ld19kc3QsCisJCQkgICAgcGZsYWcsIHByaW50ZmxhZywgZGVwdGggKyAxKSA9PSAtMSkKKwkJCQlyZXQgPSAtMTsKKwkJfSBlbHNlIGlmIChTX0lTUkVHKHNiLnN0X21vZGUpKSB7CisJCQlpZiAoZG9fdXBsb2FkKGNvbm4sIG5ld19zcmMsIG5ld19kc3QsIHBmbGFnKSA9PSAtMSkgeworCQkJCWVycm9yKCJVcGxvYWRpbmcgb2YgZmlsZSAlcyB0byAlcyBmYWlsZWQhIiwKKwkJCQkgICAgbmV3X3NyYywgbmV3X2RzdCk7CisJCQkJcmV0ID0gLTE7CisJCQl9CisJCX0gZWxzZQorCQkJbG9naXQoIiVzOiBub3QgYSByZWd1bGFyIGZpbGVcbiIsIGZpbGVuYW1lKTsKKwkJeGZyZWUobmV3X2RzdCk7CisJCXhmcmVlKG5ld19zcmMpOworCX0KKworCWRvX3NldHN0YXQoY29ubiwgZHN0LCAmYSk7CisKKwkodm9pZCkgY2xvc2VkaXIoZGlycCk7CisJcmV0dXJuIHJldDsKK30KKworaW50Cit1cGxvYWRfZGlyKHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIGNoYXIgKnNyYywgY2hhciAqZHN0LCBpbnQgcHJpbnRmbGFnLAorICAgIGludCBwZmxhZykKK3sKKwljaGFyICpkc3RfY2Fub247CisJaW50IHJldDsKKworCWlmICgoZHN0X2Nhbm9uID0gZG9fcmVhbHBhdGgoY29ubiwgZHN0KSkgPT0gTlVMTCkgeworCQllcnJvcigiVW5hYmxlIHRvIGNhbm9uaWNhbGlzZSBwYXRoIFwiJXNcIiIsIGRzdCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXQgPSB1cGxvYWRfZGlyX2ludGVybmFsKGNvbm4sIHNyYywgZHN0X2Nhbm9uLCBwZmxhZywgcHJpbnRmbGFnLCAwKTsKKwl4ZnJlZShkc3RfY2Fub24pOworCXJldHVybiByZXQ7Cit9CisKK2NoYXIgKgorcGF0aF9hcHBlbmQoY2hhciAqcDEsIGNoYXIgKnAyKQoreworCWNoYXIgKnJldDsKKwlzaXplX3QgbGVuID0gc3RybGVuKHAxKSArIHN0cmxlbihwMikgKyAyOworCisJcmV0ID0geG1hbGxvYyhsZW4pOworCXN0cmxjcHkocmV0LCBwMSwgbGVuKTsKKwlpZiAocDFbMF0gIT0gJ1wwJyAmJiBwMVtzdHJsZW4ocDEpIC0gMV0gIT0gJy8nKQorCQlzdHJsY2F0KHJldCwgIi8iLCBsZW4pOworCXN0cmxjYXQocmV0LCBwMiwgbGVuKTsKKworCXJldHVybihyZXQpOworfQorCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NmdHAtY2xpZW50LmggYi9vcGVuc3NoLTYuMHAxL3NmdHAtY2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmNTRlZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc2Z0cC1jbGllbnQuaApAQCAtMCwwICsxLDEzMiBAQAorLyogJE9wZW5CU0Q6IHNmdHAtY2xpZW50LmgsdiAxLjIwIDIwMTAvMTIvMDQgMDA6MTg6MDEgZGptIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBEYW1pZW4gTWlsbGVyIDxkam1Ab3BlbmJzZC5vcmc+CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyogQ2xpZW50IHNpZGUgb2YgU1NIMiBmaWxleGZlciBwcm90b2NvbCAqLworCisjaWZuZGVmIF9TRlRQX0NMSUVOVF9ICisjZGVmaW5lIF9TRlRQX0NMSUVOVF9ICisKK3R5cGVkZWYgc3RydWN0IFNGVFBfRElSRU5UIFNGVFBfRElSRU5UOworCitzdHJ1Y3QgU0ZUUF9ESVJFTlQgeworCWNoYXIgKmZpbGVuYW1lOworCWNoYXIgKmxvbmduYW1lOworCUF0dHJpYiBhOworfTsKKworLyoKKyAqIFVzZWQgZm9yIHN0YXR2ZnMgcmVzcG9uc2VzIG9uIHRoZSB3aXJlIGZyb20gdGhlIHNlcnZlciwgYmVjYXVzZSB0aGUKKyAqIHNlcnZlcidzIG5hdGl2ZSBmb3JtYXQgbWF5IGJlIGxhcmdlciB0aGFuIHRoZSBjbGllbnQncy4KKyAqLworc3RydWN0IHNmdHBfc3RhdHZmcyB7CisJdV9pbnQ2NF90IGZfYnNpemU7CisJdV9pbnQ2NF90IGZfZnJzaXplOworCXVfaW50NjRfdCBmX2Jsb2NrczsKKwl1X2ludDY0X3QgZl9iZnJlZTsKKwl1X2ludDY0X3QgZl9iYXZhaWw7CisJdV9pbnQ2NF90IGZfZmlsZXM7CisJdV9pbnQ2NF90IGZfZmZyZWU7CisJdV9pbnQ2NF90IGZfZmF2YWlsOworCXVfaW50NjRfdCBmX2ZzaWQ7CisJdV9pbnQ2NF90IGZfZmxhZzsKKwl1X2ludDY0X3QgZl9uYW1lbWF4OworfTsKKworLyoKKyAqIEluaXRpYWxpc2UgYSBTU0ggZmlsZXhmZXIgY29ubmVjdGlvbi4gUmV0dXJucyBOVUxMIG9uIGVycm9yIG9yCisgKiBhIHBvaW50ZXIgdG8gYSBpbml0aWFsaXplZCBzZnRwX2Nvbm4gc3RydWN0IG9uIHN1Y2Nlc3MuCisgKi8KK3N0cnVjdCBzZnRwX2Nvbm4gKmRvX2luaXQoaW50LCBpbnQsIHVfaW50LCB1X2ludCwgdV9pbnQ2NF90KTsKKwordV9pbnQgc2Z0cF9wcm90b192ZXJzaW9uKHN0cnVjdCBzZnRwX2Nvbm4gKik7CisKKy8qIENsb3NlIGZpbGUgcmVmZXJyZWQgdG8gYnkgJ2hhbmRsZScgKi8KK2ludCBkb19jbG9zZShzdHJ1Y3Qgc2Z0cF9jb25uICosIGNoYXIgKiwgdV9pbnQpOworCisvKiBSZWFkIGNvbnRlbnRzIG9mICdwYXRoJyB0byBOVUxMLXRlcm1pbmF0ZWQgYXJyYXkgJ2RpcicgKi8KK2ludCBkb19yZWFkZGlyKHN0cnVjdCBzZnRwX2Nvbm4gKiwgY2hhciAqLCBTRlRQX0RJUkVOVCAqKiopOworCisvKiBGcmVlcyBhIE5VTEwtdGVybWluYXRlZCBhcnJheSBvZiBTRlRQX0RJUkVOVHMgKGVnLiBmcm9tIGRvX3JlYWRkaXIpICovCit2b2lkIGZyZWVfc2Z0cF9kaXJlbnRzKFNGVFBfRElSRU5UICoqKTsKKworLyogRGVsZXRlIGZpbGUgJ3BhdGgnICovCitpbnQgZG9fcm0oc3RydWN0IHNmdHBfY29ubiAqLCBjaGFyICopOworCisvKiBDcmVhdGUgZGlyZWN0b3J5ICdwYXRoJyAqLworaW50IGRvX21rZGlyKHN0cnVjdCBzZnRwX2Nvbm4gKiwgY2hhciAqLCBBdHRyaWIgKiwgaW50KTsKKworLyogUmVtb3ZlIGRpcmVjdG9yeSAncGF0aCcgKi8KK2ludCBkb19ybWRpcihzdHJ1Y3Qgc2Z0cF9jb25uICosIGNoYXIgKik7CisKKy8qIEdldCBmaWxlIGF0dHJpYnV0ZXMgb2YgJ3BhdGgnIChmb2xsb3dzIHN5bWxpbmtzKSAqLworQXR0cmliICpkb19zdGF0KHN0cnVjdCBzZnRwX2Nvbm4gKiwgY2hhciAqLCBpbnQpOworCisvKiBHZXQgZmlsZSBhdHRyaWJ1dGVzIG9mICdwYXRoJyAoZG9lcyBub3QgZm9sbG93IHN5bWxpbmtzKSAqLworQXR0cmliICpkb19sc3RhdChzdHJ1Y3Qgc2Z0cF9jb25uICosIGNoYXIgKiwgaW50KTsKKworLyogU2V0IGZpbGUgYXR0cmlidXRlcyBvZiAncGF0aCcgKi8KK2ludCBkb19zZXRzdGF0KHN0cnVjdCBzZnRwX2Nvbm4gKiwgY2hhciAqLCBBdHRyaWIgKik7CisKKy8qIFNldCBmaWxlIGF0dHJpYnV0ZXMgb2Ygb3BlbiBmaWxlICdoYW5kbGUnICovCitpbnQgZG9fZnNldHN0YXQoc3RydWN0IHNmdHBfY29ubiAqLCBjaGFyICosIHVfaW50LCBBdHRyaWIgKik7CisKKy8qIENhbm9uaWNhbGlzZSAncGF0aCcgLSBjYWxsZXIgbXVzdCBmcmVlIHJlc3VsdCAqLworY2hhciAqZG9fcmVhbHBhdGgoc3RydWN0IHNmdHBfY29ubiAqLCBjaGFyICopOworCisvKiBHZXQgc3RhdGlzdGljcyBmb3IgZmlsZXN5c3RlbSBob3N0aW5nIGZpbGUgYXQgInBhdGgiICovCitpbnQgZG9fc3RhdHZmcyhzdHJ1Y3Qgc2Z0cF9jb25uICosIGNvbnN0IGNoYXIgKiwgc3RydWN0IHNmdHBfc3RhdHZmcyAqLCBpbnQpOworCisvKiBSZW5hbWUgJ29sZHBhdGgnIHRvICduZXdwYXRoJyAqLworaW50IGRvX3JlbmFtZShzdHJ1Y3Qgc2Z0cF9jb25uICosIGNoYXIgKiwgY2hhciAqKTsKKworLyogTGluayAnb2xkcGF0aCcgdG8gJ25ld3BhdGgnICovCitpbnQgZG9faGFyZGxpbmsoc3RydWN0IHNmdHBfY29ubiAqLCBjaGFyICosIGNoYXIgKik7CisKKy8qIFJlbmFtZSAnb2xkcGF0aCcgdG8gJ25ld3BhdGgnICovCitpbnQgZG9fc3ltbGluayhzdHJ1Y3Qgc2Z0cF9jb25uICosIGNoYXIgKiwgY2hhciAqKTsKKworLyogWFhYOiBhZGQgY2FsbGJhY2tzIHRvIGRvX2Rvd25sb2FkL2RvX3VwbG9hZCBzbyB3ZSBjYW4gZG8gcHJvZ3Jlc3MgbWV0ZXIgKi8KKworLyoKKyAqIERvd25sb2FkICdyZW1vdGVfcGF0aCcgdG8gJ2xvY2FsX3BhdGgnLiBQcmVzZXJ2ZSBwZXJtaXNzaW9ucyBhbmQgdGltZXMKKyAqIGlmICdwZmxhZycgaXMgc2V0CisgKi8KK2ludCBkb19kb3dubG9hZChzdHJ1Y3Qgc2Z0cF9jb25uICosIGNoYXIgKiwgY2hhciAqLCBBdHRyaWIgKiwgaW50KTsKKworLyoKKyAqIFJlY3Vyc2l2ZWx5IGRvd25sb2FkICdyZW1vdGVfZGlyZWN0b3J5JyB0byAnbG9jYWxfZGlyZWN0b3J5Jy4gUHJlc2VydmUgCisgKiB0aW1lcyBpZiAncGZsYWcnIGlzIHNldAorICovCitpbnQgZG93bmxvYWRfZGlyKHN0cnVjdCBzZnRwX2Nvbm4gKiwgY2hhciAqLCBjaGFyICosIEF0dHJpYiAqLCBpbnQsIGludCk7CisKKy8qCisgKiBVcGxvYWQgJ2xvY2FsX3BhdGgnIHRvICdyZW1vdGVfcGF0aCcuIFByZXNlcnZlIHBlcm1pc3Npb25zIGFuZCB0aW1lcworICogaWYgJ3BmbGFnJyBpcyBzZXQKKyAqLworaW50IGRvX3VwbG9hZChzdHJ1Y3Qgc2Z0cF9jb25uICosIGNoYXIgKiwgY2hhciAqLCBpbnQpOworCisvKgorICogUmVjdXJzaXZlbHkgdXBsb2FkICdsb2NhbF9kaXJlY3RvcnknIHRvICdyZW1vdGVfZGlyZWN0b3J5Jy4gUHJlc2VydmUgCisgKiB0aW1lcyBpZiAncGZsYWcnIGlzIHNldAorICovCitpbnQgdXBsb2FkX2RpcihzdHJ1Y3Qgc2Z0cF9jb25uICosIGNoYXIgKiwgY2hhciAqLCBpbnQsIGludCk7CisKKy8qIENvbmNhdGVuYXRlIHBhdGhzLCB0YWtpbmcgY2FyZSBvZiBzbGFzaGVzLiBDYWxsZXIgbXVzdCBmcmVlIHJlc3VsdC4gKi8KK2NoYXIgKnBhdGhfYXBwZW5kKGNoYXIgKiwgY2hhciAqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NmdHAtY29tbW9uLmMgYi9vcGVuc3NoLTYuMHAxL3NmdHAtY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0Mjg3NQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc2Z0cC1jb21tb24uYwpAQCAtMCwwICsxLDIzMiBAQAorLyogJE9wZW5CU0Q6IHNmdHAtY29tbW9uLmMsdiAxLjIzIDIwMTAvMDEvMTUgMDk6MjQ6MjMgbWFya3VzIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAxIERhbWllbiBNaWxsZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKKyNpbmNsdWRlIDxncnAuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpZmRlZiBIQVZFX1VUSUxfSAorI2luY2x1ZGUgPHV0aWwuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImxvZy5oIgorCisjaW5jbHVkZSAic2Z0cC5oIgorI2luY2x1ZGUgInNmdHAtY29tbW9uLmgiCisKKy8qIENsZWFyIGNvbnRlbnRzIG9mIGF0dHJpYnV0ZXMgc3RydWN0dXJlICovCit2b2lkCithdHRyaWJfY2xlYXIoQXR0cmliICphKQoreworCWEtPmZsYWdzID0gMDsKKwlhLT5zaXplID0gMDsKKwlhLT51aWQgPSAwOworCWEtPmdpZCA9IDA7CisJYS0+cGVybSA9IDA7CisJYS0+YXRpbWUgPSAwOworCWEtPm10aW1lID0gMDsKK30KKworLyogQ29udmVydCBmcm9tIHN0cnVjdCBzdGF0IHRvIGZpbGV4ZmVyIGF0dHJpYnMgKi8KK3ZvaWQKK3N0YXRfdG9fYXR0cmliKGNvbnN0IHN0cnVjdCBzdGF0ICpzdCwgQXR0cmliICphKQoreworCWF0dHJpYl9jbGVhcihhKTsKKwlhLT5mbGFncyA9IDA7CisJYS0+ZmxhZ3MgfD0gU1NIMl9GSUxFWEZFUl9BVFRSX1NJWkU7CisJYS0+c2l6ZSA9IHN0LT5zdF9zaXplOworCWEtPmZsYWdzIHw9IFNTSDJfRklMRVhGRVJfQVRUUl9VSURHSUQ7CisJYS0+dWlkID0gc3QtPnN0X3VpZDsKKwlhLT5naWQgPSBzdC0+c3RfZ2lkOworCWEtPmZsYWdzIHw9IFNTSDJfRklMRVhGRVJfQVRUUl9QRVJNSVNTSU9OUzsKKwlhLT5wZXJtID0gc3QtPnN0X21vZGU7CisJYS0+ZmxhZ3MgfD0gU1NIMl9GSUxFWEZFUl9BVFRSX0FDTU9EVElNRTsKKwlhLT5hdGltZSA9IHN0LT5zdF9hdGltZTsKKwlhLT5tdGltZSA9IHN0LT5zdF9tdGltZTsKK30KKworLyogQ29udmVydCBmcm9tIGZpbGV4ZmVyIGF0dHJpYnMgdG8gc3RydWN0IHN0YXQgKi8KK3ZvaWQKK2F0dHJpYl90b19zdGF0KGNvbnN0IEF0dHJpYiAqYSwgc3RydWN0IHN0YXQgKnN0KQoreworCW1lbXNldChzdCwgMCwgc2l6ZW9mKCpzdCkpOworCisJaWYgKGEtPmZsYWdzICYgU1NIMl9GSUxFWEZFUl9BVFRSX1NJWkUpCisJCXN0LT5zdF9zaXplID0gYS0+c2l6ZTsKKwlpZiAoYS0+ZmxhZ3MgJiBTU0gyX0ZJTEVYRkVSX0FUVFJfVUlER0lEKSB7CisJCXN0LT5zdF91aWQgPSBhLT51aWQ7CisJCXN0LT5zdF9naWQgPSBhLT5naWQ7CisJfQorCWlmIChhLT5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9QRVJNSVNTSU9OUykKKwkJc3QtPnN0X21vZGUgPSBhLT5wZXJtOworCWlmIChhLT5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9BQ01PRFRJTUUpIHsKKwkJc3QtPnN0X2F0aW1lID0gYS0+YXRpbWU7CisJCXN0LT5zdF9tdGltZSA9IGEtPm10aW1lOworCX0KK30KKworLyogRGVjb2RlIGF0dHJpYnV0ZXMgaW4gYnVmZmVyICovCitBdHRyaWIgKgorZGVjb2RlX2F0dHJpYihCdWZmZXIgKmIpCit7CisJc3RhdGljIEF0dHJpYiBhOworCisJYXR0cmliX2NsZWFyKCZhKTsKKwlhLmZsYWdzID0gYnVmZmVyX2dldF9pbnQoYik7CisJaWYgKGEuZmxhZ3MgJiBTU0gyX0ZJTEVYRkVSX0FUVFJfU0laRSkKKwkJYS5zaXplID0gYnVmZmVyX2dldF9pbnQ2NChiKTsKKwlpZiAoYS5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9VSURHSUQpIHsKKwkJYS51aWQgPSBidWZmZXJfZ2V0X2ludChiKTsKKwkJYS5naWQgPSBidWZmZXJfZ2V0X2ludChiKTsKKwl9CisJaWYgKGEuZmxhZ3MgJiBTU0gyX0ZJTEVYRkVSX0FUVFJfUEVSTUlTU0lPTlMpCisJCWEucGVybSA9IGJ1ZmZlcl9nZXRfaW50KGIpOworCWlmIChhLmZsYWdzICYgU1NIMl9GSUxFWEZFUl9BVFRSX0FDTU9EVElNRSkgeworCQlhLmF0aW1lID0gYnVmZmVyX2dldF9pbnQoYik7CisJCWEubXRpbWUgPSBidWZmZXJfZ2V0X2ludChiKTsKKwl9CisJLyogdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMgKi8KKwlpZiAoYS5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9FWFRFTkRFRCkgeworCQljaGFyICp0eXBlLCAqZGF0YTsKKwkJaW50IGksIGNvdW50OworCisJCWNvdW50ID0gYnVmZmVyX2dldF9pbnQoYik7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQl0eXBlID0gYnVmZmVyX2dldF9zdHJpbmcoYiwgTlVMTCk7CisJCQlkYXRhID0gYnVmZmVyX2dldF9zdHJpbmcoYiwgTlVMTCk7CisJCQlkZWJ1ZzMoIkdvdCBmaWxlIGF0dHJpYnV0ZSBcIiVzXCIiLCB0eXBlKTsKKwkJCXhmcmVlKHR5cGUpOworCQkJeGZyZWUoZGF0YSk7CisJCX0KKwl9CisJcmV0dXJuICZhOworfQorCisvKiBFbmNvZGUgYXR0cmlidXRlcyB0byBidWZmZXIgKi8KK3ZvaWQKK2VuY29kZV9hdHRyaWIoQnVmZmVyICpiLCBjb25zdCBBdHRyaWIgKmEpCit7CisJYnVmZmVyX3B1dF9pbnQoYiwgYS0+ZmxhZ3MpOworCWlmIChhLT5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9TSVpFKQorCQlidWZmZXJfcHV0X2ludDY0KGIsIGEtPnNpemUpOworCWlmIChhLT5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9VSURHSUQpIHsKKwkJYnVmZmVyX3B1dF9pbnQoYiwgYS0+dWlkKTsKKwkJYnVmZmVyX3B1dF9pbnQoYiwgYS0+Z2lkKTsKKwl9CisJaWYgKGEtPmZsYWdzICYgU1NIMl9GSUxFWEZFUl9BVFRSX1BFUk1JU1NJT05TKQorCQlidWZmZXJfcHV0X2ludChiLCBhLT5wZXJtKTsKKwlpZiAoYS0+ZmxhZ3MgJiBTU0gyX0ZJTEVYRkVSX0FUVFJfQUNNT0RUSU1FKSB7CisJCWJ1ZmZlcl9wdXRfaW50KGIsIGEtPmF0aW1lKTsKKwkJYnVmZmVyX3B1dF9pbnQoYiwgYS0+bXRpbWUpOworCX0KK30KKworLyogQ29udmVydCBmcm9tIFNTSDJfRlhfIHN0YXR1cyB0byB0ZXh0IGVycm9yIG1lc3NhZ2UgKi8KK2NvbnN0IGNoYXIgKgorZngydHh0KGludCBzdGF0dXMpCit7CisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIFNTSDJfRlhfT0s6CisJCXJldHVybigiTm8gZXJyb3IiKTsKKwljYXNlIFNTSDJfRlhfRU9GOgorCQlyZXR1cm4oIkVuZCBvZiBmaWxlIik7CisJY2FzZSBTU0gyX0ZYX05PX1NVQ0hfRklMRToKKwkJcmV0dXJuKCJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5Iik7CisJY2FzZSBTU0gyX0ZYX1BFUk1JU1NJT05fREVOSUVEOgorCQlyZXR1cm4oIlBlcm1pc3Npb24gZGVuaWVkIik7CisJY2FzZSBTU0gyX0ZYX0ZBSUxVUkU6CisJCXJldHVybigiRmFpbHVyZSIpOworCWNhc2UgU1NIMl9GWF9CQURfTUVTU0FHRToKKwkJcmV0dXJuKCJCYWQgbWVzc2FnZSIpOworCWNhc2UgU1NIMl9GWF9OT19DT05ORUNUSU9OOgorCQlyZXR1cm4oIk5vIGNvbm5lY3Rpb24iKTsKKwljYXNlIFNTSDJfRlhfQ09OTkVDVElPTl9MT1NUOgorCQlyZXR1cm4oIkNvbm5lY3Rpb24gbG9zdCIpOworCWNhc2UgU1NIMl9GWF9PUF9VTlNVUFBPUlRFRDoKKwkJcmV0dXJuKCJPcGVyYXRpb24gdW5zdXBwb3J0ZWQiKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4oIlVua25vd24gc3RhdHVzIik7CisJfQorCS8qIE5PVFJFQUNIRUQgKi8KK30KKworLyoKKyAqIGRyd3hyLXhyLXggICAgNSBtYXJrdXMgICBtYXJrdXMgICAgICAgMTAyNCBKYW4gMTMgMTg6MzkgLnNzaAorICovCitjaGFyICoKK2xzX2ZpbGUoY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3RydWN0IHN0YXQgKnN0LCBpbnQgcmVtb3RlLCBpbnQgc2lfdW5pdHMpCit7CisJaW50IHVsZW4sIGdsZW4sIHN6ID0gMDsKKwlzdHJ1Y3QgdG0gKmx0aW1lID0gbG9jYWx0aW1lKCZzdC0+c3RfbXRpbWUpOworCWNoYXIgKnVzZXIsICpncm91cDsKKwljaGFyIGJ1ZlsxMDI0XSwgbW9kZVsxMSsxXSwgdGJ1ZlsxMisxXSwgdWJ1ZlsxMSsxXSwgZ2J1ZlsxMSsxXTsKKwljaGFyIHNidWZbRk1UX1NDQUxFRF9TVFJTSVpFXTsKKworCXN0cm1vZGUoc3QtPnN0X21vZGUsIG1vZGUpOworCWlmICghcmVtb3RlKSB7CisJCXVzZXIgPSB1c2VyX2Zyb21fdWlkKHN0LT5zdF91aWQsIDApOworCX0gZWxzZSB7CisJCXNucHJpbnRmKHVidWYsIHNpemVvZiB1YnVmLCAiJXUiLCAodV9pbnQpc3QtPnN0X3VpZCk7CisJCXVzZXIgPSB1YnVmOworCX0KKwlpZiAoIXJlbW90ZSkgeworCQlncm91cCA9IGdyb3VwX2Zyb21fZ2lkKHN0LT5zdF9naWQsIDApOworCX0gZWxzZSB7CisJCXNucHJpbnRmKGdidWYsIHNpemVvZiBnYnVmLCAiJXUiLCAodV9pbnQpc3QtPnN0X2dpZCk7CisJCWdyb3VwID0gZ2J1ZjsKKwl9CisJaWYgKGx0aW1lICE9IE5VTEwpIHsKKwkJaWYgKHRpbWUoTlVMTCkgLSBzdC0+c3RfbXRpbWUgPCAoMzY1KjI0KjYwKjYwKS8yKQorCQkJc3ogPSBzdHJmdGltZSh0YnVmLCBzaXplb2YgdGJ1ZiwgIiViICVlICVIOiVNIiwgbHRpbWUpOworCQllbHNlCisJCQlzeiA9IHN0cmZ0aW1lKHRidWYsIHNpemVvZiB0YnVmLCAiJWIgJWUgICVZIiwgbHRpbWUpOworCX0KKwlpZiAoc3ogPT0gMCkKKwkJdGJ1ZlswXSA9ICdcMCc7CisJdWxlbiA9IE1BWChzdHJsZW4odXNlciksIDgpOworCWdsZW4gPSBNQVgoc3RybGVuKGdyb3VwKSwgOCk7CisJaWYgKHNpX3VuaXRzKSB7CisJCWZtdF9zY2FsZWQoKGxvbmcgbG9uZylzdC0+c3Rfc2l6ZSwgc2J1Zik7CisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIiVzICUzdSAlLSpzICUtKnMgJThzICVzICVzIiwgbW9kZSwKKwkJICAgICh1X2ludClzdC0+c3RfbmxpbmssIHVsZW4sIHVzZXIsIGdsZW4sIGdyb3VwLAorCQkgICAgc2J1ZiwgdGJ1ZiwgbmFtZSk7CisJfSBlbHNlIHsKKwkJc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiJXMgJTN1ICUtKnMgJS0qcyAlOGxsdSAlcyAlcyIsIG1vZGUsCisJCSAgICAodV9pbnQpc3QtPnN0X25saW5rLCB1bGVuLCB1c2VyLCBnbGVuLCBncm91cCwKKwkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc3QtPnN0X3NpemUsIHRidWYsIG5hbWUpOworCX0KKwlyZXR1cm4geHN0cmR1cChidWYpOworfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zZnRwLWNvbW1vbi5oIGIvb3BlbnNzaC02LjBwMS9zZnRwLWNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZDg2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NmdHAtY29tbW9uLmgKQEAgLTAsMCArMSw1MSBAQAorLyogJE9wZW5CU0Q6IHNmdHAtY29tbW9uLmgsdiAxLjExIDIwMTAvMDEvMTMgMDE6NDA6MTYgZGptIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgRGFtaWVuIE1pbGxlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qIE1heGltdW0gcGFja2V0IHRoYXQgd2UgYXJlIHdpbGxpbmcgdG8gc2VuZC9hY2NlcHQgKi8KKyNkZWZpbmUgU0ZUUF9NQVhfTVNHX0xFTkdUSAkoMjU2ICogMTAyNCkKKwordHlwZWRlZiBzdHJ1Y3QgQXR0cmliIEF0dHJpYjsKKworLyogRmlsZSBhdHRyaWJ1dGVzICovCitzdHJ1Y3QgQXR0cmliIHsKKwl1X2ludDMyX3QJZmxhZ3M7CisJdV9pbnQ2NF90CXNpemU7CisJdV9pbnQzMl90CXVpZDsKKwl1X2ludDMyX3QJZ2lkOworCXVfaW50MzJfdAlwZXJtOworCXVfaW50MzJfdAlhdGltZTsKKwl1X2ludDMyX3QJbXRpbWU7Cit9OworCit2b2lkCSBhdHRyaWJfY2xlYXIoQXR0cmliICopOwordm9pZAkgc3RhdF90b19hdHRyaWIoY29uc3Qgc3RydWN0IHN0YXQgKiwgQXR0cmliICopOwordm9pZAkgYXR0cmliX3RvX3N0YXQoY29uc3QgQXR0cmliICosIHN0cnVjdCBzdGF0ICopOworQXR0cmliCSpkZWNvZGVfYXR0cmliKEJ1ZmZlciAqKTsKK3ZvaWQJIGVuY29kZV9hdHRyaWIoQnVmZmVyICosIGNvbnN0IEF0dHJpYiAqKTsKK2NoYXIJKmxzX2ZpbGUoY29uc3QgY2hhciAqLCBjb25zdCBzdHJ1Y3Qgc3RhdCAqLCBpbnQsIGludCk7CisKK2NvbnN0IGNoYXIgKmZ4MnR4dChpbnQpOwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zZnRwLWdsb2IuYyBiL29wZW5zc2gtNi4wcDEvc2Z0cC1nbG9iLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZiZjE1NwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc2Z0cC1nbG9iLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qICRPcGVuQlNEOiBzZnRwLWdsb2IuYyx2IDEuMjMgMjAxMS8xMC8wNCAxNDoxNzozMiBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBEYW1pZW4gTWlsbGVyIDxkam1Ab3BlbmJzZC5vcmc+CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAic2Z0cC5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgInNmdHAtY29tbW9uLmgiCisjaW5jbHVkZSAic2Z0cC1jbGllbnQuaCIKKworaW50IHJlbW90ZV9nbG9iKHN0cnVjdCBzZnRwX2Nvbm4gKiwgY29uc3QgY2hhciAqLCBpbnQsCisgICAgaW50ICgqKShjb25zdCBjaGFyICosIGludCksIGdsb2JfdCAqKTsKKworc3RydWN0IFNGVFBfT1BFTkRJUiB7CisJU0ZUUF9ESVJFTlQgKipkaXI7CisJaW50IG9mZnNldDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgeworCXN0cnVjdCBzZnRwX2Nvbm4gKmNvbm47Cit9IGN1cjsKKworc3RhdGljIHZvaWQgKgorZnVkZ2Vfb3BlbmRpcihjb25zdCBjaGFyICpwYXRoKQoreworCXN0cnVjdCBTRlRQX09QRU5ESVIgKnI7CisKKwlyID0geG1hbGxvYyhzaXplb2YoKnIpKTsKKworCWlmIChkb19yZWFkZGlyKGN1ci5jb25uLCAoY2hhciAqKXBhdGgsICZyLT5kaXIpKSB7CisJCXhmcmVlKHIpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJci0+b2Zmc2V0ID0gMDsKKworCXJldHVybigodm9pZCAqKXIpOworfQorCitzdGF0aWMgc3RydWN0IGRpcmVudCAqCitmdWRnZV9yZWFkZGlyKHN0cnVjdCBTRlRQX09QRU5ESVIgKm9kKQoreworCS8qIFNvbGFyaXMgbmVlZHMgc2l6ZW9mKGRpcmVudCkgKyBwYXRoIGxlbmd0aCAoc2VlIGJlbG93KSAqLworCXN0YXRpYyBjaGFyIGJ1ZltzaXplb2Yoc3RydWN0IGRpcmVudCkgKyBNQVhQQVRITEVOXTsKKwlzdHJ1Y3QgZGlyZW50ICpyZXQgPSAoc3RydWN0IGRpcmVudCAqKWJ1ZjsKKyNpZmRlZiBfX0dOVV9MSUJSQVJZX18KKwlzdGF0aWMgaW50IGludW0gPSAxOworI2VuZGlmIC8qIF9fR05VX0xJQlJBUllfXyAqLworCisJaWYgKG9kLT5kaXJbb2QtPm9mZnNldF0gPT0gTlVMTCkKKwkJcmV0dXJuKE5VTEwpOworCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCisJLyoKKwkgKiBTb2xhcmlzIGRlZmluZXMgZGlyZW50LT5kX25hbWUgYXMgYSBvbmUgYnl0ZSBhcnJheSBhbmQgZXhwZWN0cworCSAqIHlvdSB0byBoYWNrIGFyb3VuZCBpdC4KKwkgKi8KKyNpZmRlZiBCUk9LRU5fT05FX0JZVEVfRElSRU5UX0RfTkFNRQorCXN0cmxjcHkocmV0LT5kX25hbWUsIG9kLT5kaXJbb2QtPm9mZnNldCsrXS0+ZmlsZW5hbWUsIE1BWFBBVEhMRU4pOworI2Vsc2UKKwlzdHJsY3B5KHJldC0+ZF9uYW1lLCBvZC0+ZGlyW29kLT5vZmZzZXQrK10tPmZpbGVuYW1lLAorCSAgICBzaXplb2YocmV0LT5kX25hbWUpKTsKKyNlbmRpZgorI2lmZGVmIF9fR05VX0xJQlJBUllfXworCS8qCisJICogSWRpb3QgZ2xpYmMgdXNlcyBleHRlbnNpb25zIHRvIHN0cnVjdCBkaXJlbnQgZm9yIHJlYWRkaXIgd2l0aAorCSAqIEFMVERJUkZVTkNzLiBOb3QgdGhhdCB0aGlzIGlzIGRvY3VtZW50ZWQgYW55d2hlcmUgYnV0IHRoZQorCSAqIHNvdXJjZS4uLiBGYWtlIGFuIGlub2RlIG51bWJlciB0byBhcHBlYXNlIGl0LgorCSAqLworCXJldC0+ZF9pbm8gPSBpbnVtKys7CisJaWYgKCFpbnVtKQorCQlpbnVtID0gMTsKKyNlbmRpZiAvKiBfX0dOVV9MSUJSQVJZX18gKi8KKworCXJldHVybihyZXQpOworfQorCitzdGF0aWMgdm9pZAorZnVkZ2VfY2xvc2VkaXIoc3RydWN0IFNGVFBfT1BFTkRJUiAqb2QpCit7CisJZnJlZV9zZnRwX2RpcmVudHMob2QtPmRpcik7CisJeGZyZWUob2QpOworfQorCitzdGF0aWMgaW50CitmdWRnZV9sc3RhdChjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3Qgc3RhdCAqc3QpCit7CisJQXR0cmliICphOworCisJaWYgKCEoYSA9IGRvX2xzdGF0KGN1ci5jb25uLCAoY2hhciAqKXBhdGgsIDEpKSkKKwkJcmV0dXJuKC0xKTsKKworCWF0dHJpYl90b19zdGF0KGEsIHN0KTsKKworCXJldHVybigwKTsKK30KKworc3RhdGljIGludAorZnVkZ2Vfc3RhdChjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3Qgc3RhdCAqc3QpCit7CisJQXR0cmliICphOworCisJaWYgKCEoYSA9IGRvX3N0YXQoY3VyLmNvbm4sIChjaGFyICopcGF0aCwgMSkpKQorCQlyZXR1cm4oLTEpOworCisJYXR0cmliX3RvX3N0YXQoYSwgc3QpOworCisJcmV0dXJuKDApOworfQorCitpbnQKK3JlbW90ZV9nbG9iKHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIGNvbnN0IGNoYXIgKnBhdHRlcm4sIGludCBmbGFncywKKyAgICBpbnQgKCplcnJmdW5jKShjb25zdCBjaGFyICosIGludCksIGdsb2JfdCAqcGdsb2IpCit7CisJcGdsb2ItPmdsX29wZW5kaXIgPSBmdWRnZV9vcGVuZGlyOworCXBnbG9iLT5nbF9yZWFkZGlyID0gKHN0cnVjdCBkaXJlbnQgKigqKSh2b2lkICopKWZ1ZGdlX3JlYWRkaXI7CisJcGdsb2ItPmdsX2Nsb3NlZGlyID0gKHZvaWQgKCopKHZvaWQgKikpZnVkZ2VfY2xvc2VkaXI7CisJcGdsb2ItPmdsX2xzdGF0ID0gZnVkZ2VfbHN0YXQ7CisJcGdsb2ItPmdsX3N0YXQgPSBmdWRnZV9zdGF0OworCisJbWVtc2V0KCZjdXIsIDAsIHNpemVvZihjdXIpKTsKKwljdXIuY29ubiA9IGNvbm47CisKKwlyZXR1cm4oZ2xvYihwYXR0ZXJuLCBmbGFncyB8IEdMT0JfQUxURElSRlVOQywgZXJyZnVuYywgcGdsb2IpKTsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc2Z0cC1zZXJ2ZXItbWFpbi5jIGIvb3BlbnNzaC02LjBwMS9zZnRwLXNlcnZlci1tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U2NDRhYgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc2Z0cC1zZXJ2ZXItbWFpbi5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qICRPcGVuQlNEOiBzZnRwLXNlcnZlci1tYWluLmMsdiAxLjQgMjAwOS8wMi8yMSAxOTozMjowNCB0b2JpYXMgRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAic2Z0cC5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKwordm9pZAorY2xlYW51cF9leGl0KGludCBpKQoreworCXNmdHBfc2VydmVyX2NsZWFudXBfZXhpdChpKTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgcGFzc3dkICp1c2VyX3B3OworCisJLyogRW5zdXJlIHRoYXQgZmRzIDAsIDEgYW5kIDIgYXJlIG9wZW4gb3IgZGlyZWN0ZWQgdG8gL2Rldi9udWxsICovCisJc2FuaXRpc2Vfc3RkZmQoKTsKKworCWlmICgodXNlcl9wdyA9IGdldHB3dWlkKGdldHVpZCgpKSkgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHVzZXIgZm91bmQgZm9yIHVpZCAlbHVcbiIsCisJCSAgICAodV9sb25nKWdldHVpZCgpKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIChzZnRwX3NlcnZlcl9tYWluKGFyZ2MsIGFyZ3YsIHVzZXJfcHcpKTsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc2Z0cC1zZXJ2ZXIuMCBiL29wZW5zc2gtNi4wcDEvc2Z0cC1zZXJ2ZXIuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODY5NWEwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zZnRwLXNlcnZlci4wCkBAIC0wLDAgKzEsNjQgQEAKK1NGVFAtU0VSVkVSKDgpICAgICAgICAgIE9wZW5CU0QgU3lzdGVtIE1hbmFnZXIncyBNYW51YWwgICAgICAgICBTRlRQLVNFUlZFUig4KQorCitOQU1FCisgICAgIHNmdHAtc2VydmVyIC0gU0ZUUCBzZXJ2ZXIgc3Vic3lzdGVtCisKK1NZTk9QU0lTCisgICAgIHNmdHAtc2VydmVyIFstZWhSXSBbLWYgbG9nX2ZhY2lsaXR5XSBbLWwgbG9nX2xldmVsXSBbLXUgdW1hc2tdCisKK0RFU0NSSVBUSU9OCisgICAgIHNmdHAtc2VydmVyIGlzIGEgcHJvZ3JhbSB0aGF0IHNwZWFrcyB0aGUgc2VydmVyIHNpZGUgb2YgU0ZUUCBwcm90b2NvbCB0bworICAgICBzdGRvdXQgYW5kIGV4cGVjdHMgY2xpZW50IHJlcXVlc3RzIGZyb20gc3RkaW4uICBzZnRwLXNlcnZlciBpcyBub3QKKyAgICAgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LCBidXQgZnJvbSBzc2hkKDgpIHVzaW5nIHRoZSBTdWJzeXN0ZW0KKyAgICAgb3B0aW9uLgorCisgICAgIENvbW1hbmQtbGluZSBmbGFncyB0byBzZnRwLXNlcnZlciBzaG91bGQgYmUgc3BlY2lmaWVkIGluIHRoZSBTdWJzeXN0ZW0KKyAgICAgZGVjbGFyYXRpb24uICBTZWUgc3NoZF9jb25maWcoNSkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKyAgICAgVmFsaWQgb3B0aW9ucyBhcmU6CisKKyAgICAgLWUgICAgICBDYXVzZXMgc2Z0cC1zZXJ2ZXIgdG8gcHJpbnQgbG9nZ2luZyBpbmZvcm1hdGlvbiB0byBzdGRlcnIgaW5zdGVhZAorICAgICAgICAgICAgIG9mIHN5c2xvZyBmb3IgZGVidWdnaW5nLgorCisgICAgIC1mIGxvZ19mYWNpbGl0eQorICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgZmFjaWxpdHkgY29kZSB0aGF0IGlzIHVzZWQgd2hlbiBsb2dnaW5nIG1lc3NhZ2VzCisgICAgICAgICAgICAgZnJvbSBzZnRwLXNlcnZlci4gIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOiBEQUVNT04sIFVTRVIsIEFVVEgsCisgICAgICAgICAgICAgTE9DQUwwLCBMT0NBTDEsIExPQ0FMMiwgTE9DQUwzLCBMT0NBTDQsIExPQ0FMNSwgTE9DQUw2LCBMT0NBTDcuCisgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgQVVUSC4KKworICAgICAtaCAgICAgIERpc3BsYXlzIHNmdHAtc2VydmVyIHVzYWdlIGluZm9ybWF0aW9uLgorCisgICAgIC1sIGxvZ19sZXZlbAorICAgICAgICAgICAgIFNwZWNpZmllcyB3aGljaCBtZXNzYWdlcyB3aWxsIGJlIGxvZ2dlZCBieSBzZnRwLXNlcnZlci4gIFRoZQorICAgICAgICAgICAgIHBvc3NpYmxlIHZhbHVlcyBhcmU6IFFVSUVULCBGQVRBTCwgRVJST1IsIElORk8sIFZFUkJPU0UsIERFQlVHLAorICAgICAgICAgICAgIERFQlVHMSwgREVCVUcyLCBhbmQgREVCVUczLiAgSU5GTyBhbmQgVkVSQk9TRSBsb2cgdHJhbnNhY3Rpb25zCisgICAgICAgICAgICAgdGhhdCBzZnRwLXNlcnZlciBwZXJmb3JtcyBvbiBiZWhhbGYgb2YgdGhlIGNsaWVudC4gIERFQlVHIGFuZAorICAgICAgICAgICAgIERFQlVHMSBhcmUgZXF1aXZhbGVudC4gIERFQlVHMiBhbmQgREVCVUczIGVhY2ggc3BlY2lmeSBoaWdoZXIKKyAgICAgICAgICAgICBsZXZlbHMgb2YgZGVidWdnaW5nIG91dHB1dC4gIFRoZSBkZWZhdWx0IGlzIEVSUk9SLgorCisgICAgIC1SICAgICAgUGxhY2VzIHRoaXMgaW5zdGFuY2Ugb2Ygc2Z0cC1zZXJ2ZXIgaW50byBhIHJlYWQtb25seSBtb2RlLgorICAgICAgICAgICAgIEF0dGVtcHRzIHRvIG9wZW4gZmlsZXMgZm9yIHdyaXRpbmcsIGFzIHdlbGwgYXMgb3RoZXIgb3BlcmF0aW9ucworICAgICAgICAgICAgIHRoYXQgY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgZmlsZXN5c3RlbSwgd2lsbCBiZSBkZW5pZWQuCisKKyAgICAgLXUgdW1hc2sKKyAgICAgICAgICAgICBTZXRzIGFuIGV4cGxpY2l0IHVtYXNrKDIpIHRvIGJlIGFwcGxpZWQgdG8gbmV3bHktY3JlYXRlZCBmaWxlcworICAgICAgICAgICAgIGFuZCBkaXJlY3RvcmllcywgaW5zdGVhZCBvZiB0aGUgdXNlcidzIGRlZmF1bHQgbWFzay4KKworICAgICBGb3IgbG9nZ2luZyB0byB3b3JrLCBzZnRwLXNlcnZlciBtdXN0IGJlIGFibGUgdG8gYWNjZXNzIC9kZXYvbG9nLiAgVXNlIG9mCisgICAgIHNmdHAtc2VydmVyIGluIGEgY2hyb290IGNvbmZpZ3VyYXRpb24gdGhlcmVmb3JlIHJlcXVpcmVzIHRoYXQgc3lzbG9nZCg4KQorICAgICBlc3RhYmxpc2ggYSBsb2dnaW5nIHNvY2tldCBpbnNpZGUgdGhlIGNocm9vdCBkaXJlY3RvcnkuCisKK1NFRSBBTFNPCisgICAgIHNmdHAoMSksIHNzaCgxKSwgc3NoZF9jb25maWcoNSksIHNzaGQoOCkKKworICAgICBULiBZbG9uZW4gYW5kIFMuIExlaHRpbmVuLCBTU0ggRmlsZSBUcmFuc2ZlciBQcm90b2NvbCwKKyAgICAgZHJhZnQtaWV0Zi1zZWNzaC1maWxleGZlci0wMC50eHQsIEphbnVhcnkgMjAwMSwgd29yayBpbiBwcm9ncmVzcworICAgICBtYXRlcmlhbC4KKworSElTVE9SWQorICAgICBzZnRwLXNlcnZlciBmaXJzdCBhcHBlYXJlZCBpbiBPcGVuQlNEIDIuOC4KKworQVVUSE9SUworICAgICBNYXJrdXMgRnJpZWRsIDxtYXJrdXNAb3BlbmJzZC5vcmc+CisKK09wZW5CU0QgNS4wICAgICAgICAgICAgICAgICAgICAgSmFudWFyeSA5LCAyMDEwICAgICAgICAgICAgICAgICAgICBPcGVuQlNEIDUuMApkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zZnRwLXNlcnZlci44IGIvb3BlbnNzaC02LjBwMS9zZnRwLXNlcnZlci44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMTljMTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NmdHAtc2VydmVyLjgKQEAgLTAsMCArMSwxMjQgQEAKKy5cIiAkT3BlbkJTRDogc2Z0cC1zZXJ2ZXIuOCx2IDEuMTkgMjAxMC8wMS8wOSAwMzozNjowMCBqbWMgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisuXCIgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLlwiIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisuXCIgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLlwiIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLlwiIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy5cIiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy5cIiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisuXCIgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisuXCIgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy5cIgorLkRkICRNZG9jZGF0ZTogSmFudWFyeSA5IDIwMTAgJAorLkR0IFNGVFAtU0VSVkVSIDgKKy5PcworLlNoIE5BTUUKKy5ObSBzZnRwLXNlcnZlcgorLk5kIFNGVFAgc2VydmVyIHN1YnN5c3RlbQorLlNoIFNZTk9QU0lTCisuTm0gc2Z0cC1zZXJ2ZXIKKy5PcCBGbCBlaFIKKy5PcCBGbCBmIEFyIGxvZ19mYWNpbGl0eQorLk9wIEZsIGwgQXIgbG9nX2xldmVsCisuT3AgRmwgdSBBciB1bWFzaworLlNoIERFU0NSSVBUSU9OCisuTm0KK2lzIGEgcHJvZ3JhbSB0aGF0IHNwZWFrcyB0aGUgc2VydmVyIHNpZGUgb2YgU0ZUUCBwcm90b2NvbAordG8gc3Rkb3V0IGFuZCBleHBlY3RzIGNsaWVudCByZXF1ZXN0cyBmcm9tIHN0ZGluLgorLk5tCitpcyBub3QgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LCBidXQgZnJvbQorLlhyIHNzaGQgOAordXNpbmcgdGhlCisuQ20gU3Vic3lzdGVtCitvcHRpb24uCisuUHAKK0NvbW1hbmQtbGluZSBmbGFncyB0bworLk5tCitzaG91bGQgYmUgc3BlY2lmaWVkIGluIHRoZQorLkNtIFN1YnN5c3RlbQorZGVjbGFyYXRpb24uCitTZWUKKy5YciBzc2hkX2NvbmZpZyA1Citmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKy5QcAorVmFsaWQgb3B0aW9ucyBhcmU6CisuQmwgLXRhZyAtd2lkdGggRHMKKy5JdCBGbCBlCitDYXVzZXMKKy5ObQordG8gcHJpbnQgbG9nZ2luZyBpbmZvcm1hdGlvbiB0byBzdGRlcnIgaW5zdGVhZCBvZiBzeXNsb2cgZm9yIGRlYnVnZ2luZy4KKy5JdCBGbCBmIEFyIGxvZ19mYWNpbGl0eQorU3BlY2lmaWVzIHRoZSBmYWNpbGl0eSBjb2RlIHRoYXQgaXMgdXNlZCB3aGVuIGxvZ2dpbmcgbWVzc2FnZXMgZnJvbQorLk5tIC4KK1RoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOiBEQUVNT04sIFVTRVIsIEFVVEgsIExPQ0FMMCwgTE9DQUwxLCBMT0NBTDIsCitMT0NBTDMsIExPQ0FMNCwgTE9DQUw1LCBMT0NBTDYsIExPQ0FMNy4KK1RoZSBkZWZhdWx0IGlzIEFVVEguCisuSXQgRmwgaAorRGlzcGxheXMKKy5ObQordXNhZ2UgaW5mb3JtYXRpb24uCisuSXQgRmwgbCBBciBsb2dfbGV2ZWwKK1NwZWNpZmllcyB3aGljaCBtZXNzYWdlcyB3aWxsIGJlIGxvZ2dlZCBieQorLk5tIC4KK1RoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOgorUVVJRVQsIEZBVEFMLCBFUlJPUiwgSU5GTywgVkVSQk9TRSwgREVCVUcsIERFQlVHMSwgREVCVUcyLCBhbmQgREVCVUczLgorSU5GTyBhbmQgVkVSQk9TRSBsb2cgdHJhbnNhY3Rpb25zIHRoYXQKKy5ObQorcGVyZm9ybXMgb24gYmVoYWxmIG9mIHRoZSBjbGllbnQuCitERUJVRyBhbmQgREVCVUcxIGFyZSBlcXVpdmFsZW50LgorREVCVUcyIGFuZCBERUJVRzMgZWFjaCBzcGVjaWZ5IGhpZ2hlciBsZXZlbHMgb2YgZGVidWdnaW5nIG91dHB1dC4KK1RoZSBkZWZhdWx0IGlzIEVSUk9SLgorLkl0IEZsIFIKK1BsYWNlcyB0aGlzIGluc3RhbmNlIG9mCisuTm0KK2ludG8gYSByZWFkLW9ubHkgbW9kZS4KK0F0dGVtcHRzIHRvIG9wZW4gZmlsZXMgZm9yIHdyaXRpbmcsIGFzIHdlbGwgYXMgb3RoZXIgb3BlcmF0aW9ucyB0aGF0IGNoYW5nZQordGhlIHN0YXRlIG9mIHRoZSBmaWxlc3lzdGVtLCB3aWxsIGJlIGRlbmllZC4KKy5JdCBGbCB1IEFyIHVtYXNrCitTZXRzIGFuIGV4cGxpY2l0CisuWHIgdW1hc2sgMgordG8gYmUgYXBwbGllZCB0byBuZXdseS1jcmVhdGVkIGZpbGVzIGFuZCBkaXJlY3RvcmllcywgaW5zdGVhZCBvZiB0aGUKK3VzZXIncyBkZWZhdWx0IG1hc2suCisuRWwKKy5QcAorRm9yIGxvZ2dpbmcgdG8gd29yaywKKy5ObQorbXVzdCBiZSBhYmxlIHRvIGFjY2VzcworLlBhIC9kZXYvbG9nIC4KK1VzZSBvZgorLk5tCitpbiBhIGNocm9vdCBjb25maWd1cmF0aW9uIHRoZXJlZm9yZSByZXF1aXJlcyB0aGF0CisuWHIgc3lzbG9nZCA4Citlc3RhYmxpc2ggYSBsb2dnaW5nIHNvY2tldCBpbnNpZGUgdGhlIGNocm9vdCBkaXJlY3RvcnkuCisuU2ggU0VFIEFMU08KKy5YciBzZnRwIDEgLAorLlhyIHNzaCAxICwKKy5YciBzc2hkX2NvbmZpZyA1ICwKKy5YciBzc2hkIDgKKy5ScworLiVBIFQuIFlsb25lbgorLiVBIFMuIExlaHRpbmVuCisuJVQgIlNTSCBGaWxlIFRyYW5zZmVyIFByb3RvY29sIgorLiVOIGRyYWZ0LWlldGYtc2Vjc2gtZmlsZXhmZXItMDAudHh0CisuJUQgSmFudWFyeSAyMDAxCisuJU8gd29yayBpbiBwcm9ncmVzcyBtYXRlcmlhbAorLlJlCisuU2ggSElTVE9SWQorLk5tCitmaXJzdCBhcHBlYXJlZCBpbgorLk94IDIuOCAuCisuU2ggQVVUSE9SUworLkFuIE1hcmt1cyBGcmllZGwgQXEgbWFya3VzQG9wZW5ic2Qub3JnCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NmdHAtc2VydmVyLmMgYi9vcGVuc3NoLTYuMHAxL3NmdHAtc2VydmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwMWM3ZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc2Z0cC1zZXJ2ZXIuYwpAQCAtMCwwICsxLDE1NDggQEAKKy8qICRPcGVuQlNEOiBzZnRwLXNlcnZlci5jLHYgMS45NCAyMDExLzA2LzE3IDIxOjQ2OjE2IGRqbSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpZmRlZiBIQVZFX1NZU19USU1FX0gKKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX01PVU5UX0gKKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1NUQVRWRlNfSAorI2luY2x1ZGUgPHN5cy9zdGF0dmZzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAidWlkc3dhcC5oIgorCisjaW5jbHVkZSAic2Z0cC5oIgorI2luY2x1ZGUgInNmdHAtY29tbW9uLmgiCisKKy8qIGhlbHBlciAqLworI2RlZmluZSBnZXRfaW50NjQoKQkJCWJ1ZmZlcl9nZXRfaW50NjQoJmlxdWV1ZSk7CisjZGVmaW5lIGdldF9pbnQoKQkJCWJ1ZmZlcl9nZXRfaW50KCZpcXVldWUpOworI2RlZmluZSBnZXRfc3RyaW5nKGxlbnApCQlidWZmZXJfZ2V0X3N0cmluZygmaXF1ZXVlLCBsZW5wKTsKKworLyogT3VyIHZlcmJvc2l0eSAqLworTG9nTGV2ZWwgbG9nX2xldmVsID0gU1lTTE9HX0xFVkVMX0VSUk9SOworCisvKiBPdXIgY2xpZW50ICovCitzdHJ1Y3QgcGFzc3dkICpwdyA9IE5VTEw7CitjaGFyICpjbGllbnRfYWRkciA9IE5VTEw7CisKKy8qIGlucHV0IGFuZCBvdXRwdXQgcXVldWUgKi8KK0J1ZmZlciBpcXVldWU7CitCdWZmZXIgb3F1ZXVlOworCisvKiBWZXJzaW9uIG9mIGNsaWVudCAqLwordV9pbnQgdmVyc2lvbjsKKworLyogRGlzYWJsZSB3cml0ZXMgKi8KK2ludCByZWFkb25seTsKKworLyogcG9ydGFibGUgYXR0cmlidXRlcywgZXRjLiAqLworCit0eXBlZGVmIHN0cnVjdCBTdGF0IFN0YXQ7CisKK3N0cnVjdCBTdGF0IHsKKwljaGFyICpuYW1lOworCWNoYXIgKmxvbmdfbmFtZTsKKwlBdHRyaWIgYXR0cmliOworfTsKKworc3RhdGljIGludAorZXJybm9fdG9fcG9ydGFibGUoaW50IHVuaXhlcnJubykKK3sKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAodW5peGVycm5vKSB7CisJY2FzZSAwOgorCQlyZXQgPSBTU0gyX0ZYX09LOworCQlicmVhazsKKwljYXNlIEVOT0VOVDoKKwljYXNlIEVOT1RESVI6CisJY2FzZSBFQkFERjoKKwljYXNlIEVMT09QOgorCQlyZXQgPSBTU0gyX0ZYX05PX1NVQ0hfRklMRTsKKwkJYnJlYWs7CisJY2FzZSBFUEVSTToKKwljYXNlIEVBQ0NFUzoKKwljYXNlIEVGQVVMVDoKKwkJcmV0ID0gU1NIMl9GWF9QRVJNSVNTSU9OX0RFTklFRDsKKwkJYnJlYWs7CisJY2FzZSBFTkFNRVRPT0xPTkc6CisJY2FzZSBFSU5WQUw6CisJCXJldCA9IFNTSDJfRlhfQkFEX01FU1NBR0U7CisJCWJyZWFrOworCWNhc2UgRU5PU1lTOgorCQlyZXQgPSBTU0gyX0ZYX09QX1VOU1VQUE9SVEVEOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSBTU0gyX0ZYX0ZBSUxVUkU7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitmbGFnc19mcm9tX3BvcnRhYmxlKGludCBwZmxhZ3MpCit7CisJaW50IGZsYWdzID0gMDsKKworCWlmICgocGZsYWdzICYgU1NIMl9GWEZfUkVBRCkgJiYKKwkgICAgKHBmbGFncyAmIFNTSDJfRlhGX1dSSVRFKSkgeworCQlmbGFncyA9IE9fUkRXUjsKKwl9IGVsc2UgaWYgKHBmbGFncyAmIFNTSDJfRlhGX1JFQUQpIHsKKwkJZmxhZ3MgPSBPX1JET05MWTsKKwl9IGVsc2UgaWYgKHBmbGFncyAmIFNTSDJfRlhGX1dSSVRFKSB7CisJCWZsYWdzID0gT19XUk9OTFk7CisJfQorCWlmIChwZmxhZ3MgJiBTU0gyX0ZYRl9DUkVBVCkKKwkJZmxhZ3MgfD0gT19DUkVBVDsKKwlpZiAocGZsYWdzICYgU1NIMl9GWEZfVFJVTkMpCisJCWZsYWdzIHw9IE9fVFJVTkM7CisJaWYgKHBmbGFncyAmIFNTSDJfRlhGX0VYQ0wpCisJCWZsYWdzIHw9IE9fRVhDTDsKKwlyZXR1cm4gZmxhZ3M7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3N0cmluZ19mcm9tX3BvcnRhYmxlKGludCBwZmxhZ3MpCit7CisJc3RhdGljIGNoYXIgcmV0WzEyOF07CisKKwkqcmV0ID0gJ1wwJzsKKworI2RlZmluZSBQQVBQRU5EKHN0cikJewkJCQlcCisJCWlmICgqcmV0ICE9ICdcMCcpCQkJXAorCQkJc3RybGNhdChyZXQsICIsIiwgc2l6ZW9mKHJldCkpOwlcCisJCXN0cmxjYXQocmV0LCBzdHIsIHNpemVvZihyZXQpKTsJCVwKKwl9CisKKwlpZiAocGZsYWdzICYgU1NIMl9GWEZfUkVBRCkKKwkJUEFQUEVORCgiUkVBRCIpCisJaWYgKHBmbGFncyAmIFNTSDJfRlhGX1dSSVRFKQorCQlQQVBQRU5EKCJXUklURSIpCisJaWYgKHBmbGFncyAmIFNTSDJfRlhGX0NSRUFUKQorCQlQQVBQRU5EKCJDUkVBVEUiKQorCWlmIChwZmxhZ3MgJiBTU0gyX0ZYRl9UUlVOQykKKwkJUEFQUEVORCgiVFJVTkNBVEUiKQorCWlmIChwZmxhZ3MgJiBTU0gyX0ZYRl9FWENMKQorCQlQQVBQRU5EKCJFWENMIikKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBBdHRyaWIgKgorZ2V0X2F0dHJpYih2b2lkKQoreworCXJldHVybiBkZWNvZGVfYXR0cmliKCZpcXVldWUpOworfQorCisvKiBoYW5kbGUgaGFuZGxlcyAqLworCit0eXBlZGVmIHN0cnVjdCBIYW5kbGUgSGFuZGxlOworc3RydWN0IEhhbmRsZSB7CisJaW50IHVzZTsKKwlESVIgKmRpcnA7CisJaW50IGZkOworCWNoYXIgKm5hbWU7CisJdV9pbnQ2NF90IGJ5dGVzX3JlYWQsIGJ5dGVzX3dyaXRlOworCWludCBuZXh0X3VudXNlZDsKK307CisKK2VudW0geworCUhBTkRMRV9VTlVTRUQsCisJSEFORExFX0RJUiwKKwlIQU5ETEVfRklMRQorfTsKKworSGFuZGxlICpoYW5kbGVzID0gTlVMTDsKK3VfaW50IG51bV9oYW5kbGVzID0gMDsKK2ludCBmaXJzdF91bnVzZWRfaGFuZGxlID0gLTE7CisKK3N0YXRpYyB2b2lkIGhhbmRsZV91bnVzZWQoaW50IGkpCit7CisJaGFuZGxlc1tpXS51c2UgPSBIQU5ETEVfVU5VU0VEOworCWhhbmRsZXNbaV0ubmV4dF91bnVzZWQgPSBmaXJzdF91bnVzZWRfaGFuZGxlOworCWZpcnN0X3VudXNlZF9oYW5kbGUgPSBpOworfQorCitzdGF0aWMgaW50CitoYW5kbGVfbmV3KGludCB1c2UsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBmZCwgRElSICpkaXJwKQoreworCWludCBpOworCisJaWYgKGZpcnN0X3VudXNlZF9oYW5kbGUgPT0gLTEpIHsKKwkJaWYgKG51bV9oYW5kbGVzICsgMSA8PSBudW1faGFuZGxlcykKKwkJCXJldHVybiAtMTsKKwkJbnVtX2hhbmRsZXMrKzsKKwkJaGFuZGxlcyA9IHhyZWFsbG9jKGhhbmRsZXMsIG51bV9oYW5kbGVzLCBzaXplb2YoSGFuZGxlKSk7CisJCWhhbmRsZV91bnVzZWQobnVtX2hhbmRsZXMgLSAxKTsKKwl9CisKKwlpID0gZmlyc3RfdW51c2VkX2hhbmRsZTsKKwlmaXJzdF91bnVzZWRfaGFuZGxlID0gaGFuZGxlc1tpXS5uZXh0X3VudXNlZDsKKworCWhhbmRsZXNbaV0udXNlID0gdXNlOworCWhhbmRsZXNbaV0uZGlycCA9IGRpcnA7CisJaGFuZGxlc1tpXS5mZCA9IGZkOworCWhhbmRsZXNbaV0ubmFtZSA9IHhzdHJkdXAobmFtZSk7CisJaGFuZGxlc1tpXS5ieXRlc19yZWFkID0gaGFuZGxlc1tpXS5ieXRlc193cml0ZSA9IDA7CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludAoraGFuZGxlX2lzX29rKGludCBpLCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gaSA+PSAwICYmICh1X2ludClpIDwgbnVtX2hhbmRsZXMgJiYgaGFuZGxlc1tpXS51c2UgPT0gdHlwZTsKK30KKworc3RhdGljIGludAoraGFuZGxlX3RvX3N0cmluZyhpbnQgaGFuZGxlLCBjaGFyICoqc3RyaW5ncCwgaW50ICpobGVucCkKK3sKKwlpZiAoc3RyaW5ncCA9PSBOVUxMIHx8IGhsZW5wID09IE5VTEwpCisJCXJldHVybiAtMTsKKwkqc3RyaW5ncCA9IHhtYWxsb2Moc2l6ZW9mKGludDMyX3QpKTsKKwlwdXRfdTMyKCpzdHJpbmdwLCBoYW5kbGUpOworCSpobGVucCA9IHNpemVvZihpbnQzMl90KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraGFuZGxlX2Zyb21fc3RyaW5nKGNvbnN0IGNoYXIgKmhhbmRsZSwgdV9pbnQgaGxlbikKK3sKKwlpbnQgdmFsOworCisJaWYgKGhsZW4gIT0gc2l6ZW9mKGludDMyX3QpKQorCQlyZXR1cm4gLTE7CisJdmFsID0gZ2V0X3UzMihoYW5kbGUpOworCWlmIChoYW5kbGVfaXNfb2sodmFsLCBIQU5ETEVfRklMRSkgfHwKKwkgICAgaGFuZGxlX2lzX29rKHZhbCwgSEFORExFX0RJUikpCisJCXJldHVybiB2YWw7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgY2hhciAqCitoYW5kbGVfdG9fbmFtZShpbnQgaGFuZGxlKQoreworCWlmIChoYW5kbGVfaXNfb2soaGFuZGxlLCBIQU5ETEVfRElSKXx8CisJICAgIGhhbmRsZV9pc19vayhoYW5kbGUsIEhBTkRMRV9GSUxFKSkKKwkJcmV0dXJuIGhhbmRsZXNbaGFuZGxlXS5uYW1lOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgRElSICoKK2hhbmRsZV90b19kaXIoaW50IGhhbmRsZSkKK3sKKwlpZiAoaGFuZGxlX2lzX29rKGhhbmRsZSwgSEFORExFX0RJUikpCisJCXJldHVybiBoYW5kbGVzW2hhbmRsZV0uZGlycDsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludAoraGFuZGxlX3RvX2ZkKGludCBoYW5kbGUpCit7CisJaWYgKGhhbmRsZV9pc19vayhoYW5kbGUsIEhBTkRMRV9GSUxFKSkKKwkJcmV0dXJuIGhhbmRsZXNbaGFuZGxlXS5mZDsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfdXBkYXRlX3JlYWQoaW50IGhhbmRsZSwgc3NpemVfdCBieXRlcykKK3sKKwlpZiAoaGFuZGxlX2lzX29rKGhhbmRsZSwgSEFORExFX0ZJTEUpICYmIGJ5dGVzID4gMCkKKwkJaGFuZGxlc1toYW5kbGVdLmJ5dGVzX3JlYWQgKz0gYnl0ZXM7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfdXBkYXRlX3dyaXRlKGludCBoYW5kbGUsIHNzaXplX3QgYnl0ZXMpCit7CisJaWYgKGhhbmRsZV9pc19vayhoYW5kbGUsIEhBTkRMRV9GSUxFKSAmJiBieXRlcyA+IDApCisJCWhhbmRsZXNbaGFuZGxlXS5ieXRlc193cml0ZSArPSBieXRlczsKK30KKworc3RhdGljIHVfaW50NjRfdAoraGFuZGxlX2J5dGVzX3JlYWQoaW50IGhhbmRsZSkKK3sKKwlpZiAoaGFuZGxlX2lzX29rKGhhbmRsZSwgSEFORExFX0ZJTEUpKQorCQlyZXR1cm4gKGhhbmRsZXNbaGFuZGxlXS5ieXRlc19yZWFkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVfaW50NjRfdAoraGFuZGxlX2J5dGVzX3dyaXRlKGludCBoYW5kbGUpCit7CisJaWYgKGhhbmRsZV9pc19vayhoYW5kbGUsIEhBTkRMRV9GSUxFKSkKKwkJcmV0dXJuIChoYW5kbGVzW2hhbmRsZV0uYnl0ZXNfd3JpdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitoYW5kbGVfY2xvc2UoaW50IGhhbmRsZSkKK3sKKwlpbnQgcmV0ID0gLTE7CisKKwlpZiAoaGFuZGxlX2lzX29rKGhhbmRsZSwgSEFORExFX0ZJTEUpKSB7CisJCXJldCA9IGNsb3NlKGhhbmRsZXNbaGFuZGxlXS5mZCk7CisJCXhmcmVlKGhhbmRsZXNbaGFuZGxlXS5uYW1lKTsKKwkJaGFuZGxlX3VudXNlZChoYW5kbGUpOworCX0gZWxzZSBpZiAoaGFuZGxlX2lzX29rKGhhbmRsZSwgSEFORExFX0RJUikpIHsKKwkJcmV0ID0gY2xvc2VkaXIoaGFuZGxlc1toYW5kbGVdLmRpcnApOworCQl4ZnJlZShoYW5kbGVzW2hhbmRsZV0ubmFtZSk7CisJCWhhbmRsZV91bnVzZWQoaGFuZGxlKTsKKwl9IGVsc2UgeworCQllcnJubyA9IEVOT0VOVDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9sb2dfY2xvc2UoaW50IGhhbmRsZSwgY2hhciAqZW1zZykKK3sKKwlpZiAoaGFuZGxlX2lzX29rKGhhbmRsZSwgSEFORExFX0ZJTEUpKSB7CisJCWxvZ2l0KCIlcyVzY2xvc2UgXCIlc1wiIGJ5dGVzIHJlYWQgJWxsdSB3cml0dGVuICVsbHUiLAorCQkgICAgZW1zZyA9PSBOVUxMID8gIiIgOiBlbXNnLCBlbXNnID09IE5VTEwgPyAiIiA6ICIgIiwKKwkJICAgIGhhbmRsZV90b19uYW1lKGhhbmRsZSksCisJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWhhbmRsZV9ieXRlc19yZWFkKGhhbmRsZSksCisJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWhhbmRsZV9ieXRlc193cml0ZShoYW5kbGUpKTsKKwl9IGVsc2UgeworCQlsb2dpdCgiJXMlc2Nsb3NlZGlyIFwiJXNcIiIsCisJCSAgICBlbXNnID09IE5VTEwgPyAiIiA6IGVtc2csIGVtc2cgPT0gTlVMTCA/ICIiIDogIiAiLAorCQkgICAgaGFuZGxlX3RvX25hbWUoaGFuZGxlKSk7CisJfQorfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX2xvZ19leGl0KHZvaWQpCit7CisJdV9pbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1faGFuZGxlczsgaSsrKQorCQlpZiAoaGFuZGxlc1tpXS51c2UgIT0gSEFORExFX1VOVVNFRCkKKwkJCWhhbmRsZV9sb2dfY2xvc2UoaSwgImZvcmNlZCIpOworfQorCitzdGF0aWMgaW50CitnZXRfaGFuZGxlKHZvaWQpCit7CisJY2hhciAqaGFuZGxlOworCWludCB2YWwgPSAtMTsKKwl1X2ludCBobGVuOworCisJaGFuZGxlID0gZ2V0X3N0cmluZygmaGxlbik7CisJaWYgKGhsZW4gPCAyNTYpCisJCXZhbCA9IGhhbmRsZV9mcm9tX3N0cmluZyhoYW5kbGUsIGhsZW4pOworCXhmcmVlKGhhbmRsZSk7CisJcmV0dXJuIHZhbDsKK30KKworLyogc2VuZCByZXBsaWVzICovCisKK3N0YXRpYyB2b2lkCitzZW5kX21zZyhCdWZmZXIgKm0pCit7CisJaW50IG1sZW4gPSBidWZmZXJfbGVuKG0pOworCisJYnVmZmVyX3B1dF9pbnQoJm9xdWV1ZSwgbWxlbik7CisJYnVmZmVyX2FwcGVuZCgmb3F1ZXVlLCBidWZmZXJfcHRyKG0pLCBtbGVuKTsKKwlidWZmZXJfY29uc3VtZShtLCBtbGVuKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorc3RhdHVzX3RvX21lc3NhZ2UodV9pbnQzMl90IHN0YXR1cykKK3sKKwljb25zdCBjaGFyICpzdGF0dXNfbWVzc2FnZXNbXSA9IHsKKwkJIlN1Y2Nlc3MiLAkJCS8qIFNTSF9GWF9PSyAqLworCQkiRW5kIG9mIGZpbGUiLAkJCS8qIFNTSF9GWF9FT0YgKi8KKwkJIk5vIHN1Y2ggZmlsZSIsCQkJLyogU1NIX0ZYX05PX1NVQ0hfRklMRSAqLworCQkiUGVybWlzc2lvbiBkZW5pZWQiLAkJLyogU1NIX0ZYX1BFUk1JU1NJT05fREVOSUVEICovCisJCSJGYWlsdXJlIiwJCQkvKiBTU0hfRlhfRkFJTFVSRSAqLworCQkiQmFkIG1lc3NhZ2UiLAkJCS8qIFNTSF9GWF9CQURfTUVTU0FHRSAqLworCQkiTm8gY29ubmVjdGlvbiIsCQkvKiBTU0hfRlhfTk9fQ09OTkVDVElPTiAqLworCQkiQ29ubmVjdGlvbiBsb3N0IiwJCS8qIFNTSF9GWF9DT05ORUNUSU9OX0xPU1QgKi8KKwkJIk9wZXJhdGlvbiB1bnN1cHBvcnRlZCIsCS8qIFNTSF9GWF9PUF9VTlNVUFBPUlRFRCAqLworCQkiVW5rbm93biBlcnJvciIJCQkvKiBPdGhlcnMgKi8KKwl9OworCXJldHVybiAoc3RhdHVzX21lc3NhZ2VzW01JTihzdGF0dXMsU1NIMl9GWF9NQVgpXSk7Cit9CisKK3N0YXRpYyB2b2lkCitzZW5kX3N0YXR1cyh1X2ludDMyX3QgaWQsIHVfaW50MzJfdCBzdGF0dXMpCit7CisJQnVmZmVyIG1zZzsKKworCWRlYnVnMygicmVxdWVzdCAldTogc2VudCBzdGF0dXMgJXUiLCBpZCwgc3RhdHVzKTsKKwlpZiAobG9nX2xldmVsID4gU1lTTE9HX0xFVkVMX1ZFUkJPU0UgfHwKKwkgICAgKHN0YXR1cyAhPSBTU0gyX0ZYX09LICYmIHN0YXR1cyAhPSBTU0gyX0ZYX0VPRikpCisJCWxvZ2l0KCJzZW50IHN0YXR1cyAlcyIsIHN0YXR1c190b19tZXNzYWdlKHN0YXR1cykpOworCWJ1ZmZlcl9pbml0KCZtc2cpOworCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0gyX0ZYUF9TVEFUVVMpOworCWJ1ZmZlcl9wdXRfaW50KCZtc2csIGlkKTsKKwlidWZmZXJfcHV0X2ludCgmbXNnLCBzdGF0dXMpOworCWlmICh2ZXJzaW9uID49IDMpIHsKKwkJYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csIHN0YXR1c190b19tZXNzYWdlKHN0YXR1cykpOworCQlidWZmZXJfcHV0X2NzdHJpbmcoJm1zZywgIiIpOworCX0KKwlzZW5kX21zZygmbXNnKTsKKwlidWZmZXJfZnJlZSgmbXNnKTsKK30KK3N0YXRpYyB2b2lkCitzZW5kX2RhdGFfb3JfaGFuZGxlKGNoYXIgdHlwZSwgdV9pbnQzMl90IGlkLCBjb25zdCBjaGFyICpkYXRhLCBpbnQgZGxlbikKK3sKKwlCdWZmZXIgbXNnOworCisJYnVmZmVyX2luaXQoJm1zZyk7CisJYnVmZmVyX3B1dF9jaGFyKCZtc2csIHR5cGUpOworCWJ1ZmZlcl9wdXRfaW50KCZtc2csIGlkKTsKKwlidWZmZXJfcHV0X3N0cmluZygmbXNnLCBkYXRhLCBkbGVuKTsKKwlzZW5kX21zZygmbXNnKTsKKwlidWZmZXJfZnJlZSgmbXNnKTsKK30KKworc3RhdGljIHZvaWQKK3NlbmRfZGF0YSh1X2ludDMyX3QgaWQsIGNvbnN0IGNoYXIgKmRhdGEsIGludCBkbGVuKQoreworCWRlYnVnKCJyZXF1ZXN0ICV1OiBzZW50IGRhdGEgbGVuICVkIiwgaWQsIGRsZW4pOworCXNlbmRfZGF0YV9vcl9oYW5kbGUoU1NIMl9GWFBfREFUQSwgaWQsIGRhdGEsIGRsZW4pOworfQorCitzdGF0aWMgdm9pZAorc2VuZF9oYW5kbGUodV9pbnQzMl90IGlkLCBpbnQgaGFuZGxlKQoreworCWNoYXIgKnN0cmluZzsKKwlpbnQgaGxlbjsKKworCWhhbmRsZV90b19zdHJpbmcoaGFuZGxlLCAmc3RyaW5nLCAmaGxlbik7CisJZGVidWcoInJlcXVlc3QgJXU6IHNlbnQgaGFuZGxlIGhhbmRsZSAlZCIsIGlkLCBoYW5kbGUpOworCXNlbmRfZGF0YV9vcl9oYW5kbGUoU1NIMl9GWFBfSEFORExFLCBpZCwgc3RyaW5nLCBobGVuKTsKKwl4ZnJlZShzdHJpbmcpOworfQorCitzdGF0aWMgdm9pZAorc2VuZF9uYW1lcyh1X2ludDMyX3QgaWQsIGludCBjb3VudCwgY29uc3QgU3RhdCAqc3RhdHMpCit7CisJQnVmZmVyIG1zZzsKKwlpbnQgaTsKKworCWJ1ZmZlcl9pbml0KCZtc2cpOworCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0gyX0ZYUF9OQU1FKTsKKwlidWZmZXJfcHV0X2ludCgmbXNnLCBpZCk7CisJYnVmZmVyX3B1dF9pbnQoJm1zZywgY291bnQpOworCWRlYnVnKCJyZXF1ZXN0ICV1OiBzZW50IG5hbWVzIGNvdW50ICVkIiwgaWQsIGNvdW50KTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlidWZmZXJfcHV0X2NzdHJpbmcoJm1zZywgc3RhdHNbaV0ubmFtZSk7CisJCWJ1ZmZlcl9wdXRfY3N0cmluZygmbXNnLCBzdGF0c1tpXS5sb25nX25hbWUpOworCQllbmNvZGVfYXR0cmliKCZtc2csICZzdGF0c1tpXS5hdHRyaWIpOworCX0KKwlzZW5kX21zZygmbXNnKTsKKwlidWZmZXJfZnJlZSgmbXNnKTsKK30KKworc3RhdGljIHZvaWQKK3NlbmRfYXR0cmliKHVfaW50MzJfdCBpZCwgY29uc3QgQXR0cmliICphKQoreworCUJ1ZmZlciBtc2c7CisKKwlkZWJ1ZygicmVxdWVzdCAldTogc2VudCBhdHRyaWIgaGF2ZSAweCV4IiwgaWQsIGEtPmZsYWdzKTsKKwlidWZmZXJfaW5pdCgmbXNnKTsKKwlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIMl9GWFBfQVRUUlMpOworCWJ1ZmZlcl9wdXRfaW50KCZtc2csIGlkKTsKKwllbmNvZGVfYXR0cmliKCZtc2csIGEpOworCXNlbmRfbXNnKCZtc2cpOworCWJ1ZmZlcl9mcmVlKCZtc2cpOworfQorCitzdGF0aWMgdm9pZAorc2VuZF9zdGF0dmZzKHVfaW50MzJfdCBpZCwgc3RydWN0IHN0YXR2ZnMgKnN0KQoreworCUJ1ZmZlciBtc2c7CisJdV9pbnQ2NF90IGZsYWc7CisKKwlmbGFnID0gKHN0LT5mX2ZsYWcgJiBTVF9SRE9OTFkpID8gU1NIMl9GWEVfU1RBVFZGU19TVF9SRE9OTFkgOiAwOworCWZsYWcgfD0gKHN0LT5mX2ZsYWcgJiBTVF9OT1NVSUQpID8gU1NIMl9GWEVfU1RBVFZGU19TVF9OT1NVSUQgOiAwOworCisJYnVmZmVyX2luaXQoJm1zZyk7CisJYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSDJfRlhQX0VYVEVOREVEX1JFUExZKTsKKwlidWZmZXJfcHV0X2ludCgmbXNnLCBpZCk7CisJYnVmZmVyX3B1dF9pbnQ2NCgmbXNnLCBzdC0+Zl9ic2l6ZSk7CisJYnVmZmVyX3B1dF9pbnQ2NCgmbXNnLCBzdC0+Zl9mcnNpemUpOworCWJ1ZmZlcl9wdXRfaW50NjQoJm1zZywgc3QtPmZfYmxvY2tzKTsKKwlidWZmZXJfcHV0X2ludDY0KCZtc2csIHN0LT5mX2JmcmVlKTsKKwlidWZmZXJfcHV0X2ludDY0KCZtc2csIHN0LT5mX2JhdmFpbCk7CisJYnVmZmVyX3B1dF9pbnQ2NCgmbXNnLCBzdC0+Zl9maWxlcyk7CisJYnVmZmVyX3B1dF9pbnQ2NCgmbXNnLCBzdC0+Zl9mZnJlZSk7CisJYnVmZmVyX3B1dF9pbnQ2NCgmbXNnLCBzdC0+Zl9mYXZhaWwpOworCWJ1ZmZlcl9wdXRfaW50NjQoJm1zZywgRlNJRF9UT19VTE9ORyhzdC0+Zl9mc2lkKSk7CisJYnVmZmVyX3B1dF9pbnQ2NCgmbXNnLCBmbGFnKTsKKwlidWZmZXJfcHV0X2ludDY0KCZtc2csIHN0LT5mX25hbWVtYXgpOworCXNlbmRfbXNnKCZtc2cpOworCWJ1ZmZlcl9mcmVlKCZtc2cpOworfQorCisvKiBwYXJzZSBpbmNvbWluZyAqLworCitzdGF0aWMgdm9pZAorcHJvY2Vzc19pbml0KHZvaWQpCit7CisJQnVmZmVyIG1zZzsKKworCXZlcnNpb24gPSBnZXRfaW50KCk7CisJdmVyYm9zZSgicmVjZWl2ZWQgY2xpZW50IHZlcnNpb24gJXUiLCB2ZXJzaW9uKTsKKwlidWZmZXJfaW5pdCgmbXNnKTsKKwlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIMl9GWFBfVkVSU0lPTik7CisJYnVmZmVyX3B1dF9pbnQoJm1zZywgU1NIMl9GSUxFWEZFUl9WRVJTSU9OKTsKKwkvKiBQT1NJWCByZW5hbWUgZXh0ZW5zaW9uICovCisJYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csICJwb3NpeC1yZW5hbWVAb3BlbnNzaC5jb20iKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcoJm1zZywgIjEiKTsgLyogdmVyc2lvbiAqLworCS8qIHN0YXR2ZnMgZXh0ZW5zaW9uICovCisJYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csICJzdGF0dmZzQG9wZW5zc2guY29tIik7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csICIyIik7IC8qIHZlcnNpb24gKi8KKwkvKiBmc3RhdHZmcyBleHRlbnNpb24gKi8KKwlidWZmZXJfcHV0X2NzdHJpbmcoJm1zZywgImZzdGF0dmZzQG9wZW5zc2guY29tIik7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csICIyIik7IC8qIHZlcnNpb24gKi8KKwkvKiBoYXJkbGluayBleHRlbnNpb24gKi8KKwlidWZmZXJfcHV0X2NzdHJpbmcoJm1zZywgImhhcmRsaW5rQG9wZW5zc2guY29tIik7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csICIxIik7IC8qIHZlcnNpb24gKi8KKwlzZW5kX21zZygmbXNnKTsKKwlidWZmZXJfZnJlZSgmbXNnKTsKK30KKworc3RhdGljIHZvaWQKK3Byb2Nlc3Nfb3Blbih2b2lkKQoreworCXVfaW50MzJfdCBpZCwgcGZsYWdzOworCUF0dHJpYiAqYTsKKwljaGFyICpuYW1lOworCWludCBoYW5kbGUsIGZkLCBmbGFncywgbW9kZSwgc3RhdHVzID0gU1NIMl9GWF9GQUlMVVJFOworCisJaWQgPSBnZXRfaW50KCk7CisJbmFtZSA9IGdldF9zdHJpbmcoTlVMTCk7CisJcGZsYWdzID0gZ2V0X2ludCgpOwkJLyogcG9ydGFibGUgZmxhZ3MgKi8KKwlkZWJ1ZzMoInJlcXVlc3QgJXU6IG9wZW4gZmxhZ3MgJWQiLCBpZCwgcGZsYWdzKTsKKwlhID0gZ2V0X2F0dHJpYigpOworCWZsYWdzID0gZmxhZ3NfZnJvbV9wb3J0YWJsZShwZmxhZ3MpOworCW1vZGUgPSAoYS0+ZmxhZ3MgJiBTU0gyX0ZJTEVYRkVSX0FUVFJfUEVSTUlTU0lPTlMpID8gYS0+cGVybSA6IDA2NjY7CisJbG9naXQoIm9wZW4gXCIlc1wiIGZsYWdzICVzIG1vZGUgMCVvIiwKKwkgICAgbmFtZSwgc3RyaW5nX2Zyb21fcG9ydGFibGUocGZsYWdzKSwgbW9kZSk7CisJaWYgKHJlYWRvbmx5ICYmCisJICAgICgoZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fV1JPTkxZIHx8IChmbGFncyAmIE9fQUNDTU9ERSkgPT0gT19SRFdSKSkKKwkJc3RhdHVzID0gU1NIMl9GWF9QRVJNSVNTSU9OX0RFTklFRDsKKwllbHNlIHsKKwkJZmQgPSBvcGVuKG5hbWUsIGZsYWdzLCBtb2RlKTsKKwkJaWYgKGZkIDwgMCkgeworCQkJc3RhdHVzID0gZXJybm9fdG9fcG9ydGFibGUoZXJybm8pOworCQl9IGVsc2UgeworCQkJaGFuZGxlID0gaGFuZGxlX25ldyhIQU5ETEVfRklMRSwgbmFtZSwgZmQsIE5VTEwpOworCQkJaWYgKGhhbmRsZSA8IDApIHsKKwkJCQljbG9zZShmZCk7CisJCQl9IGVsc2UgeworCQkJCXNlbmRfaGFuZGxlKGlkLCBoYW5kbGUpOworCQkJCXN0YXR1cyA9IFNTSDJfRlhfT0s7CisJCQl9CisJCX0KKwl9CisJaWYgKHN0YXR1cyAhPSBTU0gyX0ZYX09LKQorCQlzZW5kX3N0YXR1cyhpZCwgc3RhdHVzKTsKKwl4ZnJlZShuYW1lKTsKK30KKworc3RhdGljIHZvaWQKK3Byb2Nlc3NfY2xvc2Uodm9pZCkKK3sKKwl1X2ludDMyX3QgaWQ7CisJaW50IGhhbmRsZSwgcmV0LCBzdGF0dXMgPSBTU0gyX0ZYX0ZBSUxVUkU7CisKKwlpZCA9IGdldF9pbnQoKTsKKwloYW5kbGUgPSBnZXRfaGFuZGxlKCk7CisJZGVidWczKCJyZXF1ZXN0ICV1OiBjbG9zZSBoYW5kbGUgJXUiLCBpZCwgaGFuZGxlKTsKKwloYW5kbGVfbG9nX2Nsb3NlKGhhbmRsZSwgTlVMTCk7CisJcmV0ID0gaGFuZGxlX2Nsb3NlKGhhbmRsZSk7CisJc3RhdHVzID0gKHJldCA9PSAtMSkgPyBlcnJub190b19wb3J0YWJsZShlcnJubykgOiBTU0gyX0ZYX09LOworCXNlbmRfc3RhdHVzKGlkLCBzdGF0dXMpOworfQorCitzdGF0aWMgdm9pZAorcHJvY2Vzc19yZWFkKHZvaWQpCit7CisJY2hhciBidWZbNjQqMTAyNF07CisJdV9pbnQzMl90IGlkLCBsZW47CisJaW50IGhhbmRsZSwgZmQsIHJldCwgc3RhdHVzID0gU1NIMl9GWF9GQUlMVVJFOworCXVfaW50NjRfdCBvZmY7CisKKwlpZCA9IGdldF9pbnQoKTsKKwloYW5kbGUgPSBnZXRfaGFuZGxlKCk7CisJb2ZmID0gZ2V0X2ludDY0KCk7CisJbGVuID0gZ2V0X2ludCgpOworCisJZGVidWcoInJlcXVlc3QgJXU6IHJlYWQgXCIlc1wiIChoYW5kbGUgJWQpIG9mZiAlbGx1IGxlbiAlZCIsCisJICAgIGlkLCBoYW5kbGVfdG9fbmFtZShoYW5kbGUpLCBoYW5kbGUsICh1bnNpZ25lZCBsb25nIGxvbmcpb2ZmLCBsZW4pOworCWlmIChsZW4gPiBzaXplb2YgYnVmKSB7CisJCWxlbiA9IHNpemVvZiBidWY7CisJCWRlYnVnMigicmVhZCBjaGFuZ2UgbGVuICVkIiwgbGVuKTsKKwl9CisJZmQgPSBoYW5kbGVfdG9fZmQoaGFuZGxlKTsKKwlpZiAoZmQgPj0gMCkgeworCQlpZiAobHNlZWsoZmQsIG9mZiwgU0VFS19TRVQpIDwgMCkgeworCQkJZXJyb3IoInByb2Nlc3NfcmVhZDogc2VlayBmYWlsZWQiKTsKKwkJCXN0YXR1cyA9IGVycm5vX3RvX3BvcnRhYmxlKGVycm5vKTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IHJlYWQoZmQsIGJ1ZiwgbGVuKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJc3RhdHVzID0gZXJybm9fdG9fcG9ydGFibGUoZXJybm8pOworCQkJfSBlbHNlIGlmIChyZXQgPT0gMCkgeworCQkJCXN0YXR1cyA9IFNTSDJfRlhfRU9GOworCQkJfSBlbHNlIHsKKwkJCQlzZW5kX2RhdGEoaWQsIGJ1ZiwgcmV0KTsKKwkJCQlzdGF0dXMgPSBTU0gyX0ZYX09LOworCQkJCWhhbmRsZV91cGRhdGVfcmVhZChoYW5kbGUsIHJldCk7CisJCQl9CisJCX0KKwl9CisJaWYgKHN0YXR1cyAhPSBTU0gyX0ZYX09LKQorCQlzZW5kX3N0YXR1cyhpZCwgc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQKK3Byb2Nlc3Nfd3JpdGUodm9pZCkKK3sKKwl1X2ludDMyX3QgaWQ7CisJdV9pbnQ2NF90IG9mZjsKKwl1X2ludCBsZW47CisJaW50IGhhbmRsZSwgZmQsIHJldCwgc3RhdHVzOworCWNoYXIgKmRhdGE7CisKKwlpZCA9IGdldF9pbnQoKTsKKwloYW5kbGUgPSBnZXRfaGFuZGxlKCk7CisJb2ZmID0gZ2V0X2ludDY0KCk7CisJZGF0YSA9IGdldF9zdHJpbmcoJmxlbik7CisKKwlkZWJ1ZygicmVxdWVzdCAldTogd3JpdGUgXCIlc1wiIChoYW5kbGUgJWQpIG9mZiAlbGx1IGxlbiAlZCIsCisJICAgIGlkLCBoYW5kbGVfdG9fbmFtZShoYW5kbGUpLCBoYW5kbGUsICh1bnNpZ25lZCBsb25nIGxvbmcpb2ZmLCBsZW4pOworCWZkID0gaGFuZGxlX3RvX2ZkKGhhbmRsZSk7CisJCisJaWYgKGZkIDwgMCkKKwkJc3RhdHVzID0gU1NIMl9GWF9GQUlMVVJFOworCWVsc2UgaWYgKHJlYWRvbmx5KQorCQlzdGF0dXMgPSBTU0gyX0ZYX1BFUk1JU1NJT05fREVOSUVEOworCWVsc2UgeworCQlpZiAobHNlZWsoZmQsIG9mZiwgU0VFS19TRVQpIDwgMCkgeworCQkJc3RhdHVzID0gZXJybm9fdG9fcG9ydGFibGUoZXJybm8pOworCQkJZXJyb3IoInByb2Nlc3Nfd3JpdGU6IHNlZWsgZmFpbGVkIik7CisJCX0gZWxzZSB7CisvKiBYWFggQVRPTUlDSU8gPyAqLworCQkJcmV0ID0gd3JpdGUoZmQsIGRhdGEsIGxlbik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWVycm9yKCJwcm9jZXNzX3dyaXRlOiB3cml0ZSBmYWlsZWQiKTsKKwkJCQlzdGF0dXMgPSBlcnJub190b19wb3J0YWJsZShlcnJubyk7CisJCQl9IGVsc2UgaWYgKChzaXplX3QpcmV0ID09IGxlbikgeworCQkJCXN0YXR1cyA9IFNTSDJfRlhfT0s7CisJCQkJaGFuZGxlX3VwZGF0ZV93cml0ZShoYW5kbGUsIHJldCk7CisJCQl9IGVsc2UgeworCQkJCWRlYnVnMigibm90aGluZyBhdCBhbGwgd3JpdHRlbiIpOworCQkJCXN0YXR1cyA9IFNTSDJfRlhfRkFJTFVSRTsKKwkJCX0KKwkJfQorCX0KKwlzZW5kX3N0YXR1cyhpZCwgc3RhdHVzKTsKKwl4ZnJlZShkYXRhKTsKK30KKworc3RhdGljIHZvaWQKK3Byb2Nlc3NfZG9fc3RhdChpbnQgZG9fbHN0YXQpCit7CisJQXR0cmliIGE7CisJc3RydWN0IHN0YXQgc3Q7CisJdV9pbnQzMl90IGlkOworCWNoYXIgKm5hbWU7CisJaW50IHJldCwgc3RhdHVzID0gU1NIMl9GWF9GQUlMVVJFOworCisJaWQgPSBnZXRfaW50KCk7CisJbmFtZSA9IGdldF9zdHJpbmcoTlVMTCk7CisJZGVidWczKCJyZXF1ZXN0ICV1OiAlc3N0YXQiLCBpZCwgZG9fbHN0YXQgPyAibCIgOiAiIik7CisJdmVyYm9zZSgiJXNzdGF0IG5hbWUgXCIlc1wiIiwgZG9fbHN0YXQgPyAibCIgOiAiIiwgbmFtZSk7CisJcmV0ID0gZG9fbHN0YXQgPyBsc3RhdChuYW1lLCAmc3QpIDogc3RhdChuYW1lLCAmc3QpOworCWlmIChyZXQgPCAwKSB7CisJCXN0YXR1cyA9IGVycm5vX3RvX3BvcnRhYmxlKGVycm5vKTsKKwl9IGVsc2UgeworCQlzdGF0X3RvX2F0dHJpYigmc3QsICZhKTsKKwkJc2VuZF9hdHRyaWIoaWQsICZhKTsKKwkJc3RhdHVzID0gU1NIMl9GWF9PSzsKKwl9CisJaWYgKHN0YXR1cyAhPSBTU0gyX0ZYX09LKQorCQlzZW5kX3N0YXR1cyhpZCwgc3RhdHVzKTsKKwl4ZnJlZShuYW1lKTsKK30KKworc3RhdGljIHZvaWQKK3Byb2Nlc3Nfc3RhdCh2b2lkKQoreworCXByb2Nlc3NfZG9fc3RhdCgwKTsKK30KKworc3RhdGljIHZvaWQKK3Byb2Nlc3NfbHN0YXQodm9pZCkKK3sKKwlwcm9jZXNzX2RvX3N0YXQoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX2ZzdGF0KHZvaWQpCit7CisJQXR0cmliIGE7CisJc3RydWN0IHN0YXQgc3Q7CisJdV9pbnQzMl90IGlkOworCWludCBmZCwgcmV0LCBoYW5kbGUsIHN0YXR1cyA9IFNTSDJfRlhfRkFJTFVSRTsKKworCWlkID0gZ2V0X2ludCgpOworCWhhbmRsZSA9IGdldF9oYW5kbGUoKTsKKwlkZWJ1ZygicmVxdWVzdCAldTogZnN0YXQgXCIlc1wiIChoYW5kbGUgJXUpIiwKKwkgICAgaWQsIGhhbmRsZV90b19uYW1lKGhhbmRsZSksIGhhbmRsZSk7CisJZmQgPSBoYW5kbGVfdG9fZmQoaGFuZGxlKTsKKwlpZiAoZmQgPj0gMCkgeworCQlyZXQgPSBmc3RhdChmZCwgJnN0KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXN0YXR1cyA9IGVycm5vX3RvX3BvcnRhYmxlKGVycm5vKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXRfdG9fYXR0cmliKCZzdCwgJmEpOworCQkJc2VuZF9hdHRyaWIoaWQsICZhKTsKKwkJCXN0YXR1cyA9IFNTSDJfRlhfT0s7CisJCX0KKwl9CisJaWYgKHN0YXR1cyAhPSBTU0gyX0ZYX09LKQorCQlzZW5kX3N0YXR1cyhpZCwgc3RhdHVzKTsKK30KKworc3RhdGljIHN0cnVjdCB0aW1ldmFsICoKK2F0dHJpYl90b190dihjb25zdCBBdHRyaWIgKmEpCit7CisJc3RhdGljIHN0cnVjdCB0aW1ldmFsIHR2WzJdOworCisJdHZbMF0udHZfc2VjID0gYS0+YXRpbWU7CisJdHZbMF0udHZfdXNlYyA9IDA7CisJdHZbMV0udHZfc2VjID0gYS0+bXRpbWU7CisJdHZbMV0udHZfdXNlYyA9IDA7CisJcmV0dXJuIHR2OworfQorCitzdGF0aWMgdm9pZAorcHJvY2Vzc19zZXRzdGF0KHZvaWQpCit7CisJQXR0cmliICphOworCXVfaW50MzJfdCBpZDsKKwljaGFyICpuYW1lOworCWludCBzdGF0dXMgPSBTU0gyX0ZYX09LLCByZXQ7CisKKwlpZCA9IGdldF9pbnQoKTsKKwluYW1lID0gZ2V0X3N0cmluZyhOVUxMKTsKKwlhID0gZ2V0X2F0dHJpYigpOworCWRlYnVnKCJyZXF1ZXN0ICV1OiBzZXRzdGF0IG5hbWUgXCIlc1wiIiwgaWQsIG5hbWUpOworCWlmIChyZWFkb25seSkgeworCQlzdGF0dXMgPSBTU0gyX0ZYX1BFUk1JU1NJT05fREVOSUVEOworCQlhLT5mbGFncyA9IDA7CisJfQorCWlmIChhLT5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9TSVpFKSB7CisJCWxvZ2l0KCJzZXQgXCIlc1wiIHNpemUgJWxsdSIsCisJCSAgICBuYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKWEtPnNpemUpOworCQlyZXQgPSB0cnVuY2F0ZShuYW1lLCBhLT5zaXplKTsKKwkJaWYgKHJldCA9PSAtMSkKKwkJCXN0YXR1cyA9IGVycm5vX3RvX3BvcnRhYmxlKGVycm5vKTsKKwl9CisJaWYgKGEtPmZsYWdzICYgU1NIMl9GSUxFWEZFUl9BVFRSX1BFUk1JU1NJT05TKSB7CisJCWxvZ2l0KCJzZXQgXCIlc1wiIG1vZGUgJTA0byIsIG5hbWUsIGEtPnBlcm0pOworCQlyZXQgPSBjaG1vZChuYW1lLCBhLT5wZXJtICYgMDc3NzcpOworCQlpZiAocmV0ID09IC0xKQorCQkJc3RhdHVzID0gZXJybm9fdG9fcG9ydGFibGUoZXJybm8pOworCX0KKwlpZiAoYS0+ZmxhZ3MgJiBTU0gyX0ZJTEVYRkVSX0FUVFJfQUNNT0RUSU1FKSB7CisJCWNoYXIgYnVmWzY0XTsKKwkJdGltZV90IHQgPSBhLT5tdGltZTsKKworCQlzdHJmdGltZShidWYsIHNpemVvZihidWYpLCAiJVklbSVkLSVIOiVNOiVTIiwKKwkJICAgIGxvY2FsdGltZSgmdCkpOworCQlsb2dpdCgic2V0IFwiJXNcIiBtb2R0aW1lICVzIiwgbmFtZSwgYnVmKTsKKwkJcmV0ID0gdXRpbWVzKG5hbWUsIGF0dHJpYl90b190dihhKSk7CisJCWlmIChyZXQgPT0gLTEpCisJCQlzdGF0dXMgPSBlcnJub190b19wb3J0YWJsZShlcnJubyk7CisJfQorCWlmIChhLT5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9VSURHSUQpIHsKKwkJbG9naXQoInNldCBcIiVzXCIgb3duZXIgJWx1IGdyb3VwICVsdSIsIG5hbWUsCisJCSAgICAodV9sb25nKWEtPnVpZCwgKHVfbG9uZylhLT5naWQpOworCQlyZXQgPSBjaG93bihuYW1lLCBhLT51aWQsIGEtPmdpZCk7CisJCWlmIChyZXQgPT0gLTEpCisJCQlzdGF0dXMgPSBlcnJub190b19wb3J0YWJsZShlcnJubyk7CisJfQorCXNlbmRfc3RhdHVzKGlkLCBzdGF0dXMpOworCXhmcmVlKG5hbWUpOworfQorCitzdGF0aWMgdm9pZAorcHJvY2Vzc19mc2V0c3RhdCh2b2lkKQoreworCUF0dHJpYiAqYTsKKwl1X2ludDMyX3QgaWQ7CisJaW50IGhhbmRsZSwgZmQsIHJldDsKKwlpbnQgc3RhdHVzID0gU1NIMl9GWF9PSzsKKworCWlkID0gZ2V0X2ludCgpOworCWhhbmRsZSA9IGdldF9oYW5kbGUoKTsKKwlhID0gZ2V0X2F0dHJpYigpOworCWRlYnVnKCJyZXF1ZXN0ICV1OiBmc2V0c3RhdCBoYW5kbGUgJWQiLCBpZCwgaGFuZGxlKTsKKwlmZCA9IGhhbmRsZV90b19mZChoYW5kbGUpOworCWlmIChmZCA8IDApCisJCXN0YXR1cyA9IFNTSDJfRlhfRkFJTFVSRTsKKwllbHNlIGlmIChyZWFkb25seSkKKwkJc3RhdHVzID0gU1NIMl9GWF9QRVJNSVNTSU9OX0RFTklFRDsKKwllbHNlIHsKKwkJY2hhciAqbmFtZSA9IGhhbmRsZV90b19uYW1lKGhhbmRsZSk7CisKKwkJaWYgKGEtPmZsYWdzICYgU1NIMl9GSUxFWEZFUl9BVFRSX1NJWkUpIHsKKwkJCWxvZ2l0KCJzZXQgXCIlc1wiIHNpemUgJWxsdSIsCisJCQkgICAgbmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylhLT5zaXplKTsKKwkJCXJldCA9IGZ0cnVuY2F0ZShmZCwgYS0+c2l6ZSk7CisJCQlpZiAocmV0ID09IC0xKQorCQkJCXN0YXR1cyA9IGVycm5vX3RvX3BvcnRhYmxlKGVycm5vKTsKKwkJfQorCQlpZiAoYS0+ZmxhZ3MgJiBTU0gyX0ZJTEVYRkVSX0FUVFJfUEVSTUlTU0lPTlMpIHsKKwkJCWxvZ2l0KCJzZXQgXCIlc1wiIG1vZGUgJTA0byIsIG5hbWUsIGEtPnBlcm0pOworI2lmZGVmIEhBVkVfRkNITU9ECisJCQlyZXQgPSBmY2htb2QoZmQsIGEtPnBlcm0gJiAwNzc3Nyk7CisjZWxzZQorCQkJcmV0ID0gY2htb2QobmFtZSwgYS0+cGVybSAmIDA3Nzc3KTsKKyNlbmRpZgorCQkJaWYgKHJldCA9PSAtMSkKKwkJCQlzdGF0dXMgPSBlcnJub190b19wb3J0YWJsZShlcnJubyk7CisJCX0KKwkJaWYgKGEtPmZsYWdzICYgU1NIMl9GSUxFWEZFUl9BVFRSX0FDTU9EVElNRSkgeworCQkJY2hhciBidWZbNjRdOworCQkJdGltZV90IHQgPSBhLT5tdGltZTsKKworCQkJc3RyZnRpbWUoYnVmLCBzaXplb2YoYnVmKSwgIiVZJW0lZC0lSDolTTolUyIsCisJCQkgICAgbG9jYWx0aW1lKCZ0KSk7CisJCQlsb2dpdCgic2V0IFwiJXNcIiBtb2R0aW1lICVzIiwgbmFtZSwgYnVmKTsKKyNpZmRlZiBIQVZFX0ZVVElNRVMKKwkJCXJldCA9IGZ1dGltZXMoZmQsIGF0dHJpYl90b190dihhKSk7CisjZWxzZQorCQkJcmV0ID0gdXRpbWVzKG5hbWUsIGF0dHJpYl90b190dihhKSk7CisjZW5kaWYKKwkJCWlmIChyZXQgPT0gLTEpCisJCQkJc3RhdHVzID0gZXJybm9fdG9fcG9ydGFibGUoZXJybm8pOworCQl9CisJCWlmIChhLT5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9VSURHSUQpIHsKKwkJCWxvZ2l0KCJzZXQgXCIlc1wiIG93bmVyICVsdSBncm91cCAlbHUiLCBuYW1lLAorCQkJICAgICh1X2xvbmcpYS0+dWlkLCAodV9sb25nKWEtPmdpZCk7CisjaWZkZWYgSEFWRV9GQ0hPV04KKwkJCXJldCA9IGZjaG93bihmZCwgYS0+dWlkLCBhLT5naWQpOworI2Vsc2UKKwkJCXJldCA9IGNob3duKG5hbWUsIGEtPnVpZCwgYS0+Z2lkKTsKKyNlbmRpZgorCQkJaWYgKHJldCA9PSAtMSkKKwkJCQlzdGF0dXMgPSBlcnJub190b19wb3J0YWJsZShlcnJubyk7CisJCX0KKwl9CisJc2VuZF9zdGF0dXMoaWQsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX29wZW5kaXIodm9pZCkKK3sKKwlESVIgKmRpcnAgPSBOVUxMOworCWNoYXIgKnBhdGg7CisJaW50IGhhbmRsZSwgc3RhdHVzID0gU1NIMl9GWF9GQUlMVVJFOworCXVfaW50MzJfdCBpZDsKKworCWlkID0gZ2V0X2ludCgpOworCXBhdGggPSBnZXRfc3RyaW5nKE5VTEwpOworCWRlYnVnMygicmVxdWVzdCAldTogb3BlbmRpciIsIGlkKTsKKwlsb2dpdCgib3BlbmRpciBcIiVzXCIiLCBwYXRoKTsKKwlkaXJwID0gb3BlbmRpcihwYXRoKTsKKwlpZiAoZGlycCA9PSBOVUxMKSB7CisJCXN0YXR1cyA9IGVycm5vX3RvX3BvcnRhYmxlKGVycm5vKTsKKwl9IGVsc2UgeworCQloYW5kbGUgPSBoYW5kbGVfbmV3KEhBTkRMRV9ESVIsIHBhdGgsIDAsIGRpcnApOworCQlpZiAoaGFuZGxlIDwgMCkgeworCQkJY2xvc2VkaXIoZGlycCk7CisJCX0gZWxzZSB7CisJCQlzZW5kX2hhbmRsZShpZCwgaGFuZGxlKTsKKwkJCXN0YXR1cyA9IFNTSDJfRlhfT0s7CisJCX0KKworCX0KKwlpZiAoc3RhdHVzICE9IFNTSDJfRlhfT0spCisJCXNlbmRfc3RhdHVzKGlkLCBzdGF0dXMpOworCXhmcmVlKHBhdGgpOworfQorCitzdGF0aWMgdm9pZAorcHJvY2Vzc19yZWFkZGlyKHZvaWQpCit7CisJRElSICpkaXJwOworCXN0cnVjdCBkaXJlbnQgKmRwOworCWNoYXIgKnBhdGg7CisJaW50IGhhbmRsZTsKKwl1X2ludDMyX3QgaWQ7CisKKwlpZCA9IGdldF9pbnQoKTsKKwloYW5kbGUgPSBnZXRfaGFuZGxlKCk7CisJZGVidWcoInJlcXVlc3QgJXU6IHJlYWRkaXIgXCIlc1wiIChoYW5kbGUgJWQpIiwgaWQsCisJICAgIGhhbmRsZV90b19uYW1lKGhhbmRsZSksIGhhbmRsZSk7CisJZGlycCA9IGhhbmRsZV90b19kaXIoaGFuZGxlKTsKKwlwYXRoID0gaGFuZGxlX3RvX25hbWUoaGFuZGxlKTsKKwlpZiAoZGlycCA9PSBOVUxMIHx8IHBhdGggPT0gTlVMTCkgeworCQlzZW5kX3N0YXR1cyhpZCwgU1NIMl9GWF9GQUlMVVJFKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJY2hhciBwYXRobmFtZVtNQVhQQVRITEVOXTsKKwkJU3RhdCAqc3RhdHM7CisJCWludCBuc3RhdHMgPSAxMCwgY291bnQgPSAwLCBpOworCisJCXN0YXRzID0geGNhbGxvYyhuc3RhdHMsIHNpemVvZihTdGF0KSk7CisJCXdoaWxlICgoZHAgPSByZWFkZGlyKGRpcnApKSAhPSBOVUxMKSB7CisJCQlpZiAoY291bnQgPj0gbnN0YXRzKSB7CisJCQkJbnN0YXRzICo9IDI7CisJCQkJc3RhdHMgPSB4cmVhbGxvYyhzdGF0cywgbnN0YXRzLCBzaXplb2YoU3RhdCkpOworCQkJfQorLyogWFhYIE9WRVJGTE9XID8gKi8KKwkJCXNucHJpbnRmKHBhdGhuYW1lLCBzaXplb2YgcGF0aG5hbWUsICIlcyVzJXMiLCBwYXRoLAorCQkJICAgIHN0cmNtcChwYXRoLCAiLyIpID8gIi8iIDogIiIsIGRwLT5kX25hbWUpOworCQkJaWYgKGxzdGF0KHBhdGhuYW1lLCAmc3QpIDwgMCkKKwkJCQljb250aW51ZTsKKwkJCXN0YXRfdG9fYXR0cmliKCZzdCwgJihzdGF0c1tjb3VudF0uYXR0cmliKSk7CisJCQlzdGF0c1tjb3VudF0ubmFtZSA9IHhzdHJkdXAoZHAtPmRfbmFtZSk7CisJCQlzdGF0c1tjb3VudF0ubG9uZ19uYW1lID0gbHNfZmlsZShkcC0+ZF9uYW1lLCAmc3QsIDAsIDApOworCQkJY291bnQrKzsKKwkJCS8qIHNlbmQgdXAgdG8gMTAwIGVudHJpZXMgaW4gb25lIG1lc3NhZ2UgKi8KKwkJCS8qIFhYWCBjaGVjayBwYWNrZXQgc2l6ZSBpbnN0ZWFkICovCisJCQlpZiAoY291bnQgPT0gMTAwKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChjb3VudCA+IDApIHsKKwkJCXNlbmRfbmFtZXMoaWQsIGNvdW50LCBzdGF0cyk7CisJCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJCXhmcmVlKHN0YXRzW2ldLm5hbWUpOworCQkJCXhmcmVlKHN0YXRzW2ldLmxvbmdfbmFtZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzZW5kX3N0YXR1cyhpZCwgU1NIMl9GWF9FT0YpOworCQl9CisJCXhmcmVlKHN0YXRzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX3JlbW92ZSh2b2lkKQoreworCWNoYXIgKm5hbWU7CisJdV9pbnQzMl90IGlkOworCWludCBzdGF0dXMgPSBTU0gyX0ZYX0ZBSUxVUkU7CisJaW50IHJldDsKKworCWlkID0gZ2V0X2ludCgpOworCW5hbWUgPSBnZXRfc3RyaW5nKE5VTEwpOworCWRlYnVnMygicmVxdWVzdCAldTogcmVtb3ZlIiwgaWQpOworCWxvZ2l0KCJyZW1vdmUgbmFtZSBcIiVzXCIiLCBuYW1lKTsKKwlpZiAocmVhZG9ubHkpCisJCXN0YXR1cyA9IFNTSDJfRlhfUEVSTUlTU0lPTl9ERU5JRUQ7CisJZWxzZSB7CisJCXJldCA9IHVubGluayhuYW1lKTsKKwkJc3RhdHVzID0gKHJldCA9PSAtMSkgPyBlcnJub190b19wb3J0YWJsZShlcnJubykgOiBTU0gyX0ZYX09LOworCX0KKwlzZW5kX3N0YXR1cyhpZCwgc3RhdHVzKTsKKwl4ZnJlZShuYW1lKTsKK30KKworc3RhdGljIHZvaWQKK3Byb2Nlc3NfbWtkaXIodm9pZCkKK3sKKwlBdHRyaWIgKmE7CisJdV9pbnQzMl90IGlkOworCWNoYXIgKm5hbWU7CisJaW50IHJldCwgbW9kZSwgc3RhdHVzID0gU1NIMl9GWF9GQUlMVVJFOworCisJaWQgPSBnZXRfaW50KCk7CisJbmFtZSA9IGdldF9zdHJpbmcoTlVMTCk7CisJYSA9IGdldF9hdHRyaWIoKTsKKwltb2RlID0gKGEtPmZsYWdzICYgU1NIMl9GSUxFWEZFUl9BVFRSX1BFUk1JU1NJT05TKSA/CisJICAgIGEtPnBlcm0gJiAwNzc3NyA6IDA3Nzc7CisJZGVidWczKCJyZXF1ZXN0ICV1OiBta2RpciIsIGlkKTsKKwlsb2dpdCgibWtkaXIgbmFtZSBcIiVzXCIgbW9kZSAwJW8iLCBuYW1lLCBtb2RlKTsKKwlpZiAocmVhZG9ubHkpCisJCXN0YXR1cyA9IFNTSDJfRlhfUEVSTUlTU0lPTl9ERU5JRUQ7CisJZWxzZSB7CisJCXJldCA9IG1rZGlyKG5hbWUsIG1vZGUpOworCQlzdGF0dXMgPSAocmV0ID09IC0xKSA/IGVycm5vX3RvX3BvcnRhYmxlKGVycm5vKSA6IFNTSDJfRlhfT0s7CisJfQorCXNlbmRfc3RhdHVzKGlkLCBzdGF0dXMpOworCXhmcmVlKG5hbWUpOworfQorCitzdGF0aWMgdm9pZAorcHJvY2Vzc19ybWRpcih2b2lkKQoreworCXVfaW50MzJfdCBpZDsKKwljaGFyICpuYW1lOworCWludCByZXQsIHN0YXR1czsKKworCWlkID0gZ2V0X2ludCgpOworCW5hbWUgPSBnZXRfc3RyaW5nKE5VTEwpOworCWRlYnVnMygicmVxdWVzdCAldTogcm1kaXIiLCBpZCk7CisJbG9naXQoInJtZGlyIG5hbWUgXCIlc1wiIiwgbmFtZSk7CisJaWYgKHJlYWRvbmx5KQorCQlzdGF0dXMgPSBTU0gyX0ZYX1BFUk1JU1NJT05fREVOSUVEOworCWVsc2UgeworCQlyZXQgPSBybWRpcihuYW1lKTsKKwkJc3RhdHVzID0gKHJldCA9PSAtMSkgPyBlcnJub190b19wb3J0YWJsZShlcnJubykgOiBTU0gyX0ZYX09LOworCX0KKwlzZW5kX3N0YXR1cyhpZCwgc3RhdHVzKTsKKwl4ZnJlZShuYW1lKTsKK30KKworc3RhdGljIHZvaWQKK3Byb2Nlc3NfcmVhbHBhdGgodm9pZCkKK3sKKwljaGFyIHJlc29sdmVkbmFtZVtNQVhQQVRITEVOXTsKKwl1X2ludDMyX3QgaWQ7CisJY2hhciAqcGF0aDsKKworCWlkID0gZ2V0X2ludCgpOworCXBhdGggPSBnZXRfc3RyaW5nKE5VTEwpOworCWlmIChwYXRoWzBdID09ICdcMCcpIHsKKwkJeGZyZWUocGF0aCk7CisJCXBhdGggPSB4c3RyZHVwKCIuIik7CisJfQorCWRlYnVnMygicmVxdWVzdCAldTogcmVhbHBhdGgiLCBpZCk7CisJdmVyYm9zZSgicmVhbHBhdGggXCIlc1wiIiwgcGF0aCk7CisJaWYgKHJlYWxwYXRoKHBhdGgsIHJlc29sdmVkbmFtZSkgPT0gTlVMTCkgeworCQlzZW5kX3N0YXR1cyhpZCwgZXJybm9fdG9fcG9ydGFibGUoZXJybm8pKTsKKwl9IGVsc2UgeworCQlTdGF0IHM7CisJCWF0dHJpYl9jbGVhcigmcy5hdHRyaWIpOworCQlzLm5hbWUgPSBzLmxvbmdfbmFtZSA9IHJlc29sdmVkbmFtZTsKKwkJc2VuZF9uYW1lcyhpZCwgMSwgJnMpOworCX0KKwl4ZnJlZShwYXRoKTsKK30KKworc3RhdGljIHZvaWQKK3Byb2Nlc3NfcmVuYW1lKHZvaWQpCit7CisJdV9pbnQzMl90IGlkOworCWNoYXIgKm9sZHBhdGgsICpuZXdwYXRoOworCWludCBzdGF0dXM7CisJc3RydWN0IHN0YXQgc2I7CisKKwlpZCA9IGdldF9pbnQoKTsKKwlvbGRwYXRoID0gZ2V0X3N0cmluZyhOVUxMKTsKKwluZXdwYXRoID0gZ2V0X3N0cmluZyhOVUxMKTsKKwlkZWJ1ZzMoInJlcXVlc3QgJXU6IHJlbmFtZSIsIGlkKTsKKwlsb2dpdCgicmVuYW1lIG9sZCBcIiVzXCIgbmV3IFwiJXNcIiIsIG9sZHBhdGgsIG5ld3BhdGgpOworCXN0YXR1cyA9IFNTSDJfRlhfRkFJTFVSRTsKKwlpZiAocmVhZG9ubHkpCisJCXN0YXR1cyA9IFNTSDJfRlhfUEVSTUlTU0lPTl9ERU5JRUQ7CisJZWxzZSBpZiAobHN0YXQob2xkcGF0aCwgJnNiKSA9PSAtMSkKKwkJc3RhdHVzID0gZXJybm9fdG9fcG9ydGFibGUoZXJybm8pOworCWVsc2UgaWYgKFNfSVNSRUcoc2Iuc3RfbW9kZSkpIHsKKwkJLyogUmFjZS1mcmVlIHJlbmFtZSBvZiByZWd1bGFyIGZpbGVzICovCisJCWlmIChsaW5rKG9sZHBhdGgsIG5ld3BhdGgpID09IC0xKSB7CisJCQlpZiAoZXJybm8gPT0gRU9QTk9UU1VQUCB8fCBlcnJubyA9PSBFTk9TWVMKKyNpZmRlZiBFWERFVgorCQkJICAgIHx8IGVycm5vID09IEVYREVWCisjZW5kaWYKKyNpZmRlZiBMSU5LX09QTk9UU1VQUF9FUlJOTworCQkJICAgIHx8IGVycm5vID09IExJTktfT1BOT1RTVVBQX0VSUk5PCisjZW5kaWYKKwkJCSAgICApIHsKKwkJCQlzdHJ1Y3Qgc3RhdCBzdDsKKworCQkJCS8qCisJCQkJICogZnMgZG9lc24ndCBzdXBwb3J0IGxpbmtzLCBzbyBmYWxsIGJhY2sgdG8KKwkJCQkgKiBzdGF0K3JlbmFtZS4gIFRoaXMgaXMgcmFjeS4KKwkJCQkgKi8KKwkJCQlpZiAoc3RhdChuZXdwYXRoLCAmc3QpID09IC0xKSB7CisJCQkJCWlmIChyZW5hbWUob2xkcGF0aCwgbmV3cGF0aCkgPT0gLTEpCisJCQkJCQlzdGF0dXMgPQorCQkJCQkJICAgIGVycm5vX3RvX3BvcnRhYmxlKGVycm5vKTsKKwkJCQkJZWxzZQorCQkJCQkJc3RhdHVzID0gU1NIMl9GWF9PSzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXN0YXR1cyA9IGVycm5vX3RvX3BvcnRhYmxlKGVycm5vKTsKKwkJCX0KKwkJfSBlbHNlIGlmICh1bmxpbmsob2xkcGF0aCkgPT0gLTEpIHsKKwkJCXN0YXR1cyA9IGVycm5vX3RvX3BvcnRhYmxlKGVycm5vKTsKKwkJCS8qIGNsZWFuIHNwYXJlIGxpbmsgKi8KKwkJCXVubGluayhuZXdwYXRoKTsKKwkJfSBlbHNlCisJCQlzdGF0dXMgPSBTU0gyX0ZYX09LOworCX0gZWxzZSBpZiAoc3RhdChuZXdwYXRoLCAmc2IpID09IC0xKSB7CisJCWlmIChyZW5hbWUob2xkcGF0aCwgbmV3cGF0aCkgPT0gLTEpCisJCQlzdGF0dXMgPSBlcnJub190b19wb3J0YWJsZShlcnJubyk7CisJCWVsc2UKKwkJCXN0YXR1cyA9IFNTSDJfRlhfT0s7CisJfQorCXNlbmRfc3RhdHVzKGlkLCBzdGF0dXMpOworCXhmcmVlKG9sZHBhdGgpOworCXhmcmVlKG5ld3BhdGgpOworfQorCitzdGF0aWMgdm9pZAorcHJvY2Vzc19yZWFkbGluayh2b2lkKQoreworCXVfaW50MzJfdCBpZDsKKwlpbnQgbGVuOworCWNoYXIgYnVmW01BWFBBVEhMRU5dOworCWNoYXIgKnBhdGg7CisKKwlpZCA9IGdldF9pbnQoKTsKKwlwYXRoID0gZ2V0X3N0cmluZyhOVUxMKTsKKwlkZWJ1ZzMoInJlcXVlc3QgJXU6IHJlYWRsaW5rIiwgaWQpOworCXZlcmJvc2UoInJlYWRsaW5rIFwiJXNcIiIsIHBhdGgpOworCWlmICgobGVuID0gcmVhZGxpbmsocGF0aCwgYnVmLCBzaXplb2YoYnVmKSAtIDEpKSA9PSAtMSkKKwkJc2VuZF9zdGF0dXMoaWQsIGVycm5vX3RvX3BvcnRhYmxlKGVycm5vKSk7CisJZWxzZSB7CisJCVN0YXQgczsKKworCQlidWZbbGVuXSA9ICdcMCc7CisJCWF0dHJpYl9jbGVhcigmcy5hdHRyaWIpOworCQlzLm5hbWUgPSBzLmxvbmdfbmFtZSA9IGJ1ZjsKKwkJc2VuZF9uYW1lcyhpZCwgMSwgJnMpOworCX0KKwl4ZnJlZShwYXRoKTsKK30KKworc3RhdGljIHZvaWQKK3Byb2Nlc3Nfc3ltbGluayh2b2lkKQoreworCXVfaW50MzJfdCBpZDsKKwljaGFyICpvbGRwYXRoLCAqbmV3cGF0aDsKKwlpbnQgcmV0LCBzdGF0dXM7CisKKwlpZCA9IGdldF9pbnQoKTsKKwlvbGRwYXRoID0gZ2V0X3N0cmluZyhOVUxMKTsKKwluZXdwYXRoID0gZ2V0X3N0cmluZyhOVUxMKTsKKwlkZWJ1ZzMoInJlcXVlc3QgJXU6IHN5bWxpbmsiLCBpZCk7CisJbG9naXQoInN5bWxpbmsgb2xkIFwiJXNcIiBuZXcgXCIlc1wiIiwgb2xkcGF0aCwgbmV3cGF0aCk7CisJLyogdGhpcyB3aWxsIGZhaWwgaWYgJ25ld3BhdGgnIGV4aXN0cyAqLworCWlmIChyZWFkb25seSkKKwkJc3RhdHVzID0gU1NIMl9GWF9QRVJNSVNTSU9OX0RFTklFRDsKKwllbHNlIHsKKwkJcmV0ID0gc3ltbGluayhvbGRwYXRoLCBuZXdwYXRoKTsKKwkJc3RhdHVzID0gKHJldCA9PSAtMSkgPyBlcnJub190b19wb3J0YWJsZShlcnJubykgOiBTU0gyX0ZYX09LOworCX0KKwlzZW5kX3N0YXR1cyhpZCwgc3RhdHVzKTsKKwl4ZnJlZShvbGRwYXRoKTsKKwl4ZnJlZShuZXdwYXRoKTsKK30KKworc3RhdGljIHZvaWQKK3Byb2Nlc3NfZXh0ZW5kZWRfcG9zaXhfcmVuYW1lKHVfaW50MzJfdCBpZCkKK3sKKwljaGFyICpvbGRwYXRoLCAqbmV3cGF0aDsKKwlpbnQgcmV0LCBzdGF0dXM7CisKKwlvbGRwYXRoID0gZ2V0X3N0cmluZyhOVUxMKTsKKwluZXdwYXRoID0gZ2V0X3N0cmluZyhOVUxMKTsKKwlkZWJ1ZzMoInJlcXVlc3QgJXU6IHBvc2l4LXJlbmFtZSIsIGlkKTsKKwlsb2dpdCgicG9zaXgtcmVuYW1lIG9sZCBcIiVzXCIgbmV3IFwiJXNcIiIsIG9sZHBhdGgsIG5ld3BhdGgpOworCWlmIChyZWFkb25seSkKKwkJc3RhdHVzID0gU1NIMl9GWF9QRVJNSVNTSU9OX0RFTklFRDsKKwllbHNlIHsKKwkJcmV0ID0gcmVuYW1lKG9sZHBhdGgsIG5ld3BhdGgpOworCQlzdGF0dXMgPSAocmV0ID09IC0xKSA/IGVycm5vX3RvX3BvcnRhYmxlKGVycm5vKSA6IFNTSDJfRlhfT0s7CisJfQorCXNlbmRfc3RhdHVzKGlkLCBzdGF0dXMpOworCXhmcmVlKG9sZHBhdGgpOworCXhmcmVlKG5ld3BhdGgpOworfQorCitzdGF0aWMgdm9pZAorcHJvY2Vzc19leHRlbmRlZF9zdGF0dmZzKHVfaW50MzJfdCBpZCkKK3sKKwljaGFyICpwYXRoOworCXN0cnVjdCBzdGF0dmZzIHN0OworCisJcGF0aCA9IGdldF9zdHJpbmcoTlVMTCk7CisJZGVidWczKCJyZXF1ZXN0ICV1OiBzdGF0ZnMiLCBpZCk7CisJbG9naXQoInN0YXRmcyBcIiVzXCIiLCBwYXRoKTsKKworCWlmIChzdGF0dmZzKHBhdGgsICZzdCkgIT0gMCkKKwkJc2VuZF9zdGF0dXMoaWQsIGVycm5vX3RvX3BvcnRhYmxlKGVycm5vKSk7CisJZWxzZQorCQlzZW5kX3N0YXR2ZnMoaWQsICZzdCk7CisgICAgICAgIHhmcmVlKHBhdGgpOworfQorCitzdGF0aWMgdm9pZAorcHJvY2Vzc19leHRlbmRlZF9mc3RhdHZmcyh1X2ludDMyX3QgaWQpCit7CisJaW50IGhhbmRsZSwgZmQ7CisJc3RydWN0IHN0YXR2ZnMgc3Q7CisKKwloYW5kbGUgPSBnZXRfaGFuZGxlKCk7CisJZGVidWcoInJlcXVlc3QgJXU6IGZzdGF0dmZzIFwiJXNcIiAoaGFuZGxlICV1KSIsCisJICAgIGlkLCBoYW5kbGVfdG9fbmFtZShoYW5kbGUpLCBoYW5kbGUpOworCWlmICgoZmQgPSBoYW5kbGVfdG9fZmQoaGFuZGxlKSkgPCAwKSB7CisJCXNlbmRfc3RhdHVzKGlkLCBTU0gyX0ZYX0ZBSUxVUkUpOworCQlyZXR1cm47CisJfQorCWlmIChmc3RhdHZmcyhmZCwgJnN0KSAhPSAwKQorCQlzZW5kX3N0YXR1cyhpZCwgZXJybm9fdG9fcG9ydGFibGUoZXJybm8pKTsKKwllbHNlCisJCXNlbmRfc3RhdHZmcyhpZCwgJnN0KTsKK30KKworc3RhdGljIHZvaWQKK3Byb2Nlc3NfZXh0ZW5kZWRfaGFyZGxpbmsodV9pbnQzMl90IGlkKQoreworCWNoYXIgKm9sZHBhdGgsICpuZXdwYXRoOworCWludCByZXQsIHN0YXR1czsKKworCW9sZHBhdGggPSBnZXRfc3RyaW5nKE5VTEwpOworCW5ld3BhdGggPSBnZXRfc3RyaW5nKE5VTEwpOworCWRlYnVnMygicmVxdWVzdCAldTogaGFyZGxpbmsiLCBpZCk7CisJbG9naXQoImhhcmRsaW5rIG9sZCBcIiVzXCIgbmV3IFwiJXNcIiIsIG9sZHBhdGgsIG5ld3BhdGgpOworCWlmIChyZWFkb25seSkKKwkJc3RhdHVzID0gU1NIMl9GWF9QRVJNSVNTSU9OX0RFTklFRDsKKwllbHNlIHsKKwkJcmV0ID0gbGluayhvbGRwYXRoLCBuZXdwYXRoKTsKKwkJc3RhdHVzID0gKHJldCA9PSAtMSkgPyBlcnJub190b19wb3J0YWJsZShlcnJubykgOiBTU0gyX0ZYX09LOworCX0KKwlzZW5kX3N0YXR1cyhpZCwgc3RhdHVzKTsKKwl4ZnJlZShvbGRwYXRoKTsKKwl4ZnJlZShuZXdwYXRoKTsKK30KKworc3RhdGljIHZvaWQKK3Byb2Nlc3NfZXh0ZW5kZWQodm9pZCkKK3sKKwl1X2ludDMyX3QgaWQ7CisJY2hhciAqcmVxdWVzdDsKKworCWlkID0gZ2V0X2ludCgpOworCXJlcXVlc3QgPSBnZXRfc3RyaW5nKE5VTEwpOworCWlmIChzdHJjbXAocmVxdWVzdCwgInBvc2l4LXJlbmFtZUBvcGVuc3NoLmNvbSIpID09IDApCisJCXByb2Nlc3NfZXh0ZW5kZWRfcG9zaXhfcmVuYW1lKGlkKTsKKwllbHNlIGlmIChzdHJjbXAocmVxdWVzdCwgInN0YXR2ZnNAb3BlbnNzaC5jb20iKSA9PSAwKQorCQlwcm9jZXNzX2V4dGVuZGVkX3N0YXR2ZnMoaWQpOworCWVsc2UgaWYgKHN0cmNtcChyZXF1ZXN0LCAiZnN0YXR2ZnNAb3BlbnNzaC5jb20iKSA9PSAwKQorCQlwcm9jZXNzX2V4dGVuZGVkX2ZzdGF0dmZzKGlkKTsKKwllbHNlIGlmIChzdHJjbXAocmVxdWVzdCwgImhhcmRsaW5rQG9wZW5zc2guY29tIikgPT0gMCkKKwkJcHJvY2Vzc19leHRlbmRlZF9oYXJkbGluayhpZCk7CisJZWxzZQorCQlzZW5kX3N0YXR1cyhpZCwgU1NIMl9GWF9PUF9VTlNVUFBPUlRFRCk7CS8qIE1VU1QgKi8KKwl4ZnJlZShyZXF1ZXN0KTsKK30KKworLyogc3RvbGVuIGZyb20gc3NoLWFnZW50ICovCisKK3N0YXRpYyB2b2lkCitwcm9jZXNzKHZvaWQpCit7CisJdV9pbnQgbXNnX2xlbjsKKwl1X2ludCBidWZfbGVuOworCXVfaW50IGNvbnN1bWVkOworCXVfaW50IHR5cGU7CisJdV9jaGFyICpjcDsKKworCWJ1Zl9sZW4gPSBidWZmZXJfbGVuKCZpcXVldWUpOworCWlmIChidWZfbGVuIDwgNSkKKwkJcmV0dXJuOwkJLyogSW5jb21wbGV0ZSBtZXNzYWdlLiAqLworCWNwID0gYnVmZmVyX3B0cigmaXF1ZXVlKTsKKwltc2dfbGVuID0gZ2V0X3UzMihjcCk7CisJaWYgKG1zZ19sZW4gPiBTRlRQX01BWF9NU0dfTEVOR1RIKSB7CisJCWVycm9yKCJiYWQgbWVzc2FnZSBmcm9tICVzIGxvY2FsIHVzZXIgJXMiLAorCQkgICAgY2xpZW50X2FkZHIsIHB3LT5wd19uYW1lKTsKKwkJc2Z0cF9zZXJ2ZXJfY2xlYW51cF9leGl0KDExKTsKKwl9CisJaWYgKGJ1Zl9sZW4gPCBtc2dfbGVuICsgNCkKKwkJcmV0dXJuOworCWJ1ZmZlcl9jb25zdW1lKCZpcXVldWUsIDQpOworCWJ1Zl9sZW4gLT0gNDsKKwl0eXBlID0gYnVmZmVyX2dldF9jaGFyKCZpcXVldWUpOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU1NIMl9GWFBfSU5JVDoKKwkJcHJvY2Vzc19pbml0KCk7CisJCWJyZWFrOworCWNhc2UgU1NIMl9GWFBfT1BFTjoKKwkJcHJvY2Vzc19vcGVuKCk7CisJCWJyZWFrOworCWNhc2UgU1NIMl9GWFBfQ0xPU0U6CisJCXByb2Nlc3NfY2xvc2UoKTsKKwkJYnJlYWs7CisJY2FzZSBTU0gyX0ZYUF9SRUFEOgorCQlwcm9jZXNzX3JlYWQoKTsKKwkJYnJlYWs7CisJY2FzZSBTU0gyX0ZYUF9XUklURToKKwkJcHJvY2Vzc193cml0ZSgpOworCQlicmVhazsKKwljYXNlIFNTSDJfRlhQX0xTVEFUOgorCQlwcm9jZXNzX2xzdGF0KCk7CisJCWJyZWFrOworCWNhc2UgU1NIMl9GWFBfRlNUQVQ6CisJCXByb2Nlc3NfZnN0YXQoKTsKKwkJYnJlYWs7CisJY2FzZSBTU0gyX0ZYUF9TRVRTVEFUOgorCQlwcm9jZXNzX3NldHN0YXQoKTsKKwkJYnJlYWs7CisJY2FzZSBTU0gyX0ZYUF9GU0VUU1RBVDoKKwkJcHJvY2Vzc19mc2V0c3RhdCgpOworCQlicmVhazsKKwljYXNlIFNTSDJfRlhQX09QRU5ESVI6CisJCXByb2Nlc3Nfb3BlbmRpcigpOworCQlicmVhazsKKwljYXNlIFNTSDJfRlhQX1JFQURESVI6CisJCXByb2Nlc3NfcmVhZGRpcigpOworCQlicmVhazsKKwljYXNlIFNTSDJfRlhQX1JFTU9WRToKKwkJcHJvY2Vzc19yZW1vdmUoKTsKKwkJYnJlYWs7CisJY2FzZSBTU0gyX0ZYUF9NS0RJUjoKKwkJcHJvY2Vzc19ta2RpcigpOworCQlicmVhazsKKwljYXNlIFNTSDJfRlhQX1JNRElSOgorCQlwcm9jZXNzX3JtZGlyKCk7CisJCWJyZWFrOworCWNhc2UgU1NIMl9GWFBfUkVBTFBBVEg6CisJCXByb2Nlc3NfcmVhbHBhdGgoKTsKKwkJYnJlYWs7CisJY2FzZSBTU0gyX0ZYUF9TVEFUOgorCQlwcm9jZXNzX3N0YXQoKTsKKwkJYnJlYWs7CisJY2FzZSBTU0gyX0ZYUF9SRU5BTUU6CisJCXByb2Nlc3NfcmVuYW1lKCk7CisJCWJyZWFrOworCWNhc2UgU1NIMl9GWFBfUkVBRExJTks6CisJCXByb2Nlc3NfcmVhZGxpbmsoKTsKKwkJYnJlYWs7CisJY2FzZSBTU0gyX0ZYUF9TWU1MSU5LOgorCQlwcm9jZXNzX3N5bWxpbmsoKTsKKwkJYnJlYWs7CisJY2FzZSBTU0gyX0ZYUF9FWFRFTkRFRDoKKwkJcHJvY2Vzc19leHRlbmRlZCgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJvcigiVW5rbm93biBtZXNzYWdlICVkIiwgdHlwZSk7CisJCWJyZWFrOworCX0KKwkvKiBkaXNjYXJkIHRoZSByZW1haW5pbmcgYnl0ZXMgZnJvbSB0aGUgY3VycmVudCBwYWNrZXQgKi8KKwlpZiAoYnVmX2xlbiA8IGJ1ZmZlcl9sZW4oJmlxdWV1ZSkpIHsKKwkJZXJyb3IoImlxdWV1ZSBncmV3IHVuZXhwZWN0ZWRseSIpOworCQlzZnRwX3NlcnZlcl9jbGVhbnVwX2V4aXQoMjU1KTsKKwl9CisJY29uc3VtZWQgPSBidWZfbGVuIC0gYnVmZmVyX2xlbigmaXF1ZXVlKTsKKwlpZiAobXNnX2xlbiA8IGNvbnN1bWVkKSB7CisJCWVycm9yKCJtc2dfbGVuICVkIDwgY29uc3VtZWQgJWQiLCBtc2dfbGVuLCBjb25zdW1lZCk7CisJCXNmdHBfc2VydmVyX2NsZWFudXBfZXhpdCgyNTUpOworCX0KKwlpZiAobXNnX2xlbiA+IGNvbnN1bWVkKQorCQlidWZmZXJfY29uc3VtZSgmaXF1ZXVlLCBtc2dfbGVuIC0gY29uc3VtZWQpOworfQorCisvKiBDbGVhbnVwIGhhbmRsZXIgdGhhdCBsb2dzIGFjdGl2ZSBoYW5kbGVzIHVwb24gbm9ybWFsIGV4aXQgKi8KK3ZvaWQKK3NmdHBfc2VydmVyX2NsZWFudXBfZXhpdChpbnQgaSkKK3sKKwlpZiAocHcgIT0gTlVMTCAmJiBjbGllbnRfYWRkciAhPSBOVUxMKSB7CisJCWhhbmRsZV9sb2dfZXhpdCgpOworCQlsb2dpdCgic2Vzc2lvbiBjbG9zZWQgZm9yIGxvY2FsIHVzZXIgJXMgZnJvbSBbJXNdIiwKKwkJICAgIHB3LT5wd19uYW1lLCBjbGllbnRfYWRkcik7CisJfQorCV9leGl0KGkpOworfQorCitzdGF0aWMgdm9pZAorc2Z0cF9zZXJ2ZXJfdXNhZ2Uodm9pZCkKK3sKKwlleHRlcm4gY2hhciAqX19wcm9nbmFtZTsKKworCWZwcmludGYoc3RkZXJyLAorCSAgICAidXNhZ2U6ICVzIFstZWhSXSBbLWYgbG9nX2ZhY2lsaXR5XSBbLWwgbG9nX2xldmVsXSBbLXUgdW1hc2tdXG4iLAorCSAgICBfX3Byb2duYW1lKTsKKwlleGl0KDEpOworfQorCitpbnQKK3NmdHBfc2VydmVyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3QgcGFzc3dkICp1c2VyX3B3KQoreworCWZkX3NldCAqcnNldCwgKndzZXQ7CisJaW50IGluLCBvdXQsIG1heCwgY2gsIHNraXBhcmdzID0gMCwgbG9nX3N0ZGVyciA9IDA7CisJc3NpemVfdCBsZW4sIG9sZW4sIHNldF9zaXplOworCVN5c2xvZ0ZhY2lsaXR5IGxvZ19mYWNpbGl0eSA9IFNZU0xPR19GQUNJTElUWV9BVVRIOworCWNoYXIgKmNwLCBidWZbNCo0MDk2XTsKKwlsb25nIG1hc2s7CisKKwlleHRlcm4gY2hhciAqb3B0YXJnOworCWV4dGVybiBjaGFyICpfX3Byb2duYW1lOworCisJX19wcm9nbmFtZSA9IHNzaF9nZXRfcHJvZ25hbWUoYXJndlswXSk7CisJbG9nX2luaXQoX19wcm9nbmFtZSwgbG9nX2xldmVsLCBsb2dfZmFjaWxpdHksIGxvZ19zdGRlcnIpOworCisJd2hpbGUgKCFza2lwYXJncyAmJiAoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgImY6bDp1OmNlaFIiKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChjaCkgeworCQljYXNlICdSJzoKKwkJCXJlYWRvbmx5ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCS8qCisJCQkgKiBJZ25vcmUgYWxsIGFyZ3VtZW50cyBpZiB3ZSBhcmUgaW52b2tlZCBhcyBhCisJCQkgKiBzaGVsbCB1c2luZyAic2Z0cC1zZXJ2ZXIgLWMgY29tbWFuZCIKKwkJCSAqLworCQkJc2tpcGFyZ3MgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2UnOgorCQkJbG9nX3N0ZGVyciA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQlsb2dfbGV2ZWwgPSBsb2dfbGV2ZWxfbnVtYmVyKG9wdGFyZyk7CisJCQlpZiAobG9nX2xldmVsID09IFNZU0xPR19MRVZFTF9OT1RfU0VUKQorCQkJCWVycm9yKCJJbnZhbGlkIGxvZyBsZXZlbCBcIiVzXCIiLCBvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJbG9nX2ZhY2lsaXR5ID0gbG9nX2ZhY2lsaXR5X251bWJlcihvcHRhcmcpOworCQkJaWYgKGxvZ19mYWNpbGl0eSA9PSBTWVNMT0dfRkFDSUxJVFlfTk9UX1NFVCkKKwkJCQllcnJvcigiSW52YWxpZCBsb2cgZmFjaWxpdHkgXCIlc1wiIiwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICd1JzoKKwkJCWVycm5vID0gMDsKKwkJCW1hc2sgPSBzdHJ0b2wob3B0YXJnLCAmY3AsIDgpOworCQkJaWYgKG1hc2sgPCAwIHx8IG1hc2sgPiAwNzc3IHx8ICpjcCAhPSAnXDAnIHx8CisJCQkgICAgY3AgPT0gb3B0YXJnIHx8IChtYXNrID09IDAgJiYgZXJybm8gIT0gMCkpCisJCQkJZmF0YWwoIkludmFsaWQgdW1hc2sgXCIlc1wiIiwgb3B0YXJnKTsKKwkJCSh2b2lkKXVtYXNrKChtb2RlX3QpbWFzayk7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCWRlZmF1bHQ6CisJCQlzZnRwX3NlcnZlcl91c2FnZSgpOworCQl9CisJfQorCisJbG9nX2luaXQoX19wcm9nbmFtZSwgbG9nX2xldmVsLCBsb2dfZmFjaWxpdHksIGxvZ19zdGRlcnIpOworCisJaWYgKChjcCA9IGdldGVudigiU1NIX0NPTk5FQ1RJT04iKSkgIT0gTlVMTCkgeworCQljbGllbnRfYWRkciA9IHhzdHJkdXAoY3ApOworCQlpZiAoKGNwID0gc3RyY2hyKGNsaWVudF9hZGRyLCAnICcpKSA9PSBOVUxMKSB7CisJCQllcnJvcigiTWFsZm9ybWVkIFNTSF9DT05ORUNUSU9OIHZhcmlhYmxlOiBcIiVzXCIiLAorCQkJICAgIGdldGVudigiU1NIX0NPTk5FQ1RJT04iKSk7CisJCQlzZnRwX3NlcnZlcl9jbGVhbnVwX2V4aXQoMjU1KTsKKwkJfQorCQkqY3AgPSAnXDAnOworCX0gZWxzZQorCQljbGllbnRfYWRkciA9IHhzdHJkdXAoIlVOS05PV04iKTsKKworCXB3ID0gcHdjb3B5KHVzZXJfcHcpOworCisJbG9naXQoInNlc3Npb24gb3BlbmVkIGZvciBsb2NhbCB1c2VyICVzIGZyb20gWyVzXSIsCisJICAgIHB3LT5wd19uYW1lLCBjbGllbnRfYWRkcik7CisKKwlpbiA9IFNURElOX0ZJTEVOTzsKKwlvdXQgPSBTVERPVVRfRklMRU5POworCisjaWZkZWYgSEFWRV9DWUdXSU4KKwlzZXRtb2RlKGluLCBPX0JJTkFSWSk7CisJc2V0bW9kZShvdXQsIE9fQklOQVJZKTsKKyNlbmRpZgorCisJbWF4ID0gMDsKKwlpZiAoaW4gPiBtYXgpCisJCW1heCA9IGluOworCWlmIChvdXQgPiBtYXgpCisJCW1heCA9IG91dDsKKworCWJ1ZmZlcl9pbml0KCZpcXVldWUpOworCWJ1ZmZlcl9pbml0KCZvcXVldWUpOworCisJc2V0X3NpemUgPSBob3dtYW55KG1heCArIDEsIE5GREJJVFMpICogc2l6ZW9mKGZkX21hc2spOworCXJzZXQgPSAoZmRfc2V0ICopeG1hbGxvYyhzZXRfc2l6ZSk7CisJd3NldCA9IChmZF9zZXQgKil4bWFsbG9jKHNldF9zaXplKTsKKworCWZvciAoOzspIHsKKwkJbWVtc2V0KHJzZXQsIDAsIHNldF9zaXplKTsKKwkJbWVtc2V0KHdzZXQsIDAsIHNldF9zaXplKTsKKworCQkvKgorCQkgKiBFbnN1cmUgdGhhdCB3ZSBjYW4gcmVhZCBhIGZ1bGwgYnVmZmVyIGFuZCBoYW5kbGUKKwkJICogdGhlIHdvcnN0LWNhc2UgbGVuZ3RoIHBhY2tldCBpdCBjYW4gZ2VuZXJhdGUsCisJCSAqIG90aGVyd2lzZSBhcHBseSBiYWNrcHJlc3N1cmUgYnkgc3RvcHBpbmcgcmVhZHMuCisJCSAqLworCQlpZiAoYnVmZmVyX2NoZWNrX2FsbG9jKCZpcXVldWUsIHNpemVvZihidWYpKSAmJgorCQkgICAgYnVmZmVyX2NoZWNrX2FsbG9jKCZvcXVldWUsIFNGVFBfTUFYX01TR19MRU5HVEgpKQorCQkJRkRfU0VUKGluLCByc2V0KTsKKworCQlvbGVuID0gYnVmZmVyX2xlbigmb3F1ZXVlKTsKKwkJaWYgKG9sZW4gPiAwKQorCQkJRkRfU0VUKG91dCwgd3NldCk7CisKKwkJaWYgKHNlbGVjdChtYXgrMSwgcnNldCwgd3NldCwgTlVMTCwgTlVMTCkgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CisJCQllcnJvcigic2VsZWN0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQlzZnRwX3NlcnZlcl9jbGVhbnVwX2V4aXQoMik7CisJCX0KKworCQkvKiBjb3B5IHN0ZGluIHRvIGlxdWV1ZSAqLworCQlpZiAoRkRfSVNTRVQoaW4sIHJzZXQpKSB7CisJCQlsZW4gPSByZWFkKGluLCBidWYsIHNpemVvZiBidWYpOworCQkJaWYgKGxlbiA9PSAwKSB7CisJCQkJZGVidWcoInJlYWQgZW9mIik7CisJCQkJc2Z0cF9zZXJ2ZXJfY2xlYW51cF9leGl0KDApOworCQkJfSBlbHNlIGlmIChsZW4gPCAwKSB7CisJCQkJZXJyb3IoInJlYWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlzZnRwX3NlcnZlcl9jbGVhbnVwX2V4aXQoMSk7CisJCQl9IGVsc2UgeworCQkJCWJ1ZmZlcl9hcHBlbmQoJmlxdWV1ZSwgYnVmLCBsZW4pOworCQkJfQorCQl9CisJCS8qIHNlbmQgb3F1ZXVlIHRvIHN0ZG91dCAqLworCQlpZiAoRkRfSVNTRVQob3V0LCB3c2V0KSkgeworCQkJbGVuID0gd3JpdGUob3V0LCBidWZmZXJfcHRyKCZvcXVldWUpLCBvbGVuKTsKKwkJCWlmIChsZW4gPCAwKSB7CisJCQkJZXJyb3IoIndyaXRlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJc2Z0cF9zZXJ2ZXJfY2xlYW51cF9leGl0KDEpOworCQkJfSBlbHNlIHsKKwkJCQlidWZmZXJfY29uc3VtZSgmb3F1ZXVlLCBsZW4pOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogUHJvY2VzcyByZXF1ZXN0cyBmcm9tIGNsaWVudCBpZiB3ZSBjYW4gZml0IHRoZSByZXN1bHRzCisJCSAqIGludG8gdGhlIG91dHB1dCBidWZmZXIsIG90aGVyd2lzZSBzdG9wIHByb2Nlc3NpbmcgaW5wdXQKKwkJICogYW5kIGxldCB0aGUgb3V0cHV0IHF1ZXVlIGRyYWluLgorCQkgKi8KKwkJaWYgKGJ1ZmZlcl9jaGVja19hbGxvYygmb3F1ZXVlLCBTRlRQX01BWF9NU0dfTEVOR1RIKSkKKwkJCXByb2Nlc3MoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NmdHAuMCBiL29wZW5zc2gtNi4wcDEvc2Z0cC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNTA3MzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NmdHAuMApAQCAtMCwwICsxLDMzOSBAQAorU0ZUUCgxKSAgICAgICAgICAgICAgICAgICAgT3BlbkJTRCBSZWZlcmVuY2UgTWFudWFsICAgICAgICAgICAgICAgICAgICBTRlRQKDEpCisKK05BTUUKKyAgICAgc2Z0cCAtIHNlY3VyZSBmaWxlIHRyYW5zZmVyIHByb2dyYW0KKworU1lOT1BTSVMKKyAgICAgc2Z0cCBbLTEyNDZDcHFydl0gWy1CIGJ1ZmZlcl9zaXplXSBbLWIgYmF0Y2hmaWxlXSBbLWMgY2lwaGVyXQorICAgICAgICAgIFstRCBzZnRwX3NlcnZlcl9wYXRoXSBbLUYgc3NoX2NvbmZpZ10gWy1pIGlkZW50aXR5X2ZpbGVdIFstbCBsaW1pdF0KKyAgICAgICAgICBbLW8gc3NoX29wdGlvbl0gWy1QIHBvcnRdIFstUiBudW1fcmVxdWVzdHNdIFstUyBwcm9ncmFtXQorICAgICAgICAgIFstcyBzdWJzeXN0ZW0gfCBzZnRwX3NlcnZlcl0gaG9zdAorICAgICBzZnRwIFt1c2VyQF1ob3N0WzpmaWxlIC4uLl0KKyAgICAgc2Z0cCBbdXNlckBdaG9zdFs6ZGlyWy9dXQorICAgICBzZnRwIC1iIGJhdGNoZmlsZSBbdXNlckBdaG9zdAorCitERVNDUklQVElPTgorICAgICBzZnRwIGlzIGFuIGludGVyYWN0aXZlIGZpbGUgdHJhbnNmZXIgcHJvZ3JhbSwgc2ltaWxhciB0byBmdHAoMSksIHdoaWNoCisgICAgIHBlcmZvcm1zIGFsbCBvcGVyYXRpb25zIG92ZXIgYW4gZW5jcnlwdGVkIHNzaCgxKSB0cmFuc3BvcnQuICBJdCBtYXkgYWxzbworICAgICB1c2UgbWFueSBmZWF0dXJlcyBvZiBzc2gsIHN1Y2ggYXMgcHVibGljIGtleSBhdXRoZW50aWNhdGlvbiBhbmQKKyAgICAgY29tcHJlc3Npb24uICBzZnRwIGNvbm5lY3RzIGFuZCBsb2dzIGludG8gdGhlIHNwZWNpZmllZCBob3N0LCB0aGVuIGVudGVycworICAgICBhbiBpbnRlcmFjdGl2ZSBjb21tYW5kIG1vZGUuCisKKyAgICAgVGhlIHNlY29uZCB1c2FnZSBmb3JtYXQgd2lsbCByZXRyaWV2ZSBmaWxlcyBhdXRvbWF0aWNhbGx5IGlmIGEgbm9uLQorICAgICBpbnRlcmFjdGl2ZSBhdXRoZW50aWNhdGlvbiBtZXRob2QgaXMgdXNlZDsgb3RoZXJ3aXNlIGl0IHdpbGwgZG8gc28gYWZ0ZXIKKyAgICAgc3VjY2Vzc2Z1bCBpbnRlcmFjdGl2ZSBhdXRoZW50aWNhdGlvbi4KKworICAgICBUaGUgdGhpcmQgdXNhZ2UgZm9ybWF0IGFsbG93cyBzZnRwIHRvIHN0YXJ0IGluIGEgcmVtb3RlIGRpcmVjdG9yeS4KKworICAgICBUaGUgZmluYWwgdXNhZ2UgZm9ybWF0IGFsbG93cyBmb3IgYXV0b21hdGVkIHNlc3Npb25zIHVzaW5nIHRoZSAtYiBvcHRpb24uCisgICAgIEluIHN1Y2ggY2FzZXMsIGl0IGlzIG5lY2Vzc2FyeSB0byBjb25maWd1cmUgbm9uLWludGVyYWN0aXZlCisgICAgIGF1dGhlbnRpY2F0aW9uIHRvIG9idmlhdGUgdGhlIG5lZWQgdG8gZW50ZXIgYSBwYXNzd29yZCBhdCBjb25uZWN0aW9uIHRpbWUKKyAgICAgKHNlZSBzc2hkKDgpIGFuZCBzc2gta2V5Z2VuKDEpIGZvciBkZXRhaWxzKS4KKworICAgICBTaW5jZSBzb21lIHVzYWdlIGZvcm1hdHMgdXNlIGNvbG9uIGNoYXJhY3RlcnMgdG8gZGVsaW1pdCBob3N0IG5hbWVzIGZyb20KKyAgICAgcGF0aCBuYW1lcywgSVB2NiBhZGRyZXNzZXMgbXVzdCBiZSBlbmNsb3NlZCBpbiBzcXVhcmUgYnJhY2tldHMgdG8gYXZvaWQKKyAgICAgYW1iaWd1aXR5LgorCisgICAgIFRoZSBvcHRpb25zIGFyZSBhcyBmb2xsb3dzOgorCisgICAgIC0xICAgICAgU3BlY2lmeSB0aGUgdXNlIG9mIHByb3RvY29sIHZlcnNpb24gMS4KKworICAgICAtMiAgICAgIFNwZWNpZnkgdGhlIHVzZSBvZiBwcm90b2NvbCB2ZXJzaW9uIDIuCisKKyAgICAgLTQgICAgICBGb3JjZXMgc2Z0cCB0byB1c2UgSVB2NCBhZGRyZXNzZXMgb25seS4KKworICAgICAtNiAgICAgIEZvcmNlcyBzZnRwIHRvIHVzZSBJUHY2IGFkZHJlc3NlcyBvbmx5LgorCisgICAgIC1CIGJ1ZmZlcl9zaXplCisgICAgICAgICAgICAgU3BlY2lmeSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHRoYXQgc2Z0cCB1c2VzIHdoZW4gdHJhbnNmZXJyaW5nCisgICAgICAgICAgICAgZmlsZXMuICBMYXJnZXIgYnVmZmVycyByZXF1aXJlIGZld2VyIHJvdW5kIHRyaXBzIGF0IHRoZSBjb3N0IG9mCisgICAgICAgICAgICAgaGlnaGVyIG1lbW9yeSBjb25zdW1wdGlvbi4gIFRoZSBkZWZhdWx0IGlzIDMyNzY4IGJ5dGVzLgorCisgICAgIC1iIGJhdGNoZmlsZQorICAgICAgICAgICAgIEJhdGNoIG1vZGUgcmVhZHMgYSBzZXJpZXMgb2YgY29tbWFuZHMgZnJvbSBhbiBpbnB1dCBiYXRjaGZpbGUKKyAgICAgICAgICAgICBpbnN0ZWFkIG9mIHN0ZGluLiAgU2luY2UgaXQgbGFja3MgdXNlciBpbnRlcmFjdGlvbiBpdCBzaG91bGQgYmUKKyAgICAgICAgICAgICB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggbm9uLWludGVyYWN0aXZlIGF1dGhlbnRpY2F0aW9uLiAgQQorICAgICAgICAgICAgIGJhdGNoZmlsZSBvZiBgLScgbWF5IGJlIHVzZWQgdG8gaW5kaWNhdGUgc3RhbmRhcmQgaW5wdXQuICBzZnRwCisgICAgICAgICAgICAgd2lsbCBhYm9ydCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb21tYW5kcyBmYWlsOiBnZXQsIHB1dCwKKyAgICAgICAgICAgICByZW5hbWUsIGxuLCBybSwgbWtkaXIsIGNoZGlyLCBscywgbGNoZGlyLCBjaG1vZCwgY2hvd24sIGNoZ3JwLAorICAgICAgICAgICAgIGxwd2QsIGRmLCBzeW1saW5rLCBhbmQgbG1rZGlyLiAgVGVybWluYXRpb24gb24gZXJyb3IgY2FuIGJlCisgICAgICAgICAgICAgc3VwcHJlc3NlZCBvbiBhIGNvbW1hbmQgYnkgY29tbWFuZCBiYXNpcyBieSBwcmVmaXhpbmcgdGhlIGNvbW1hbmQKKyAgICAgICAgICAgICB3aXRoIGEgYC0nIGNoYXJhY3RlciAoZm9yIGV4YW1wbGUsIC1ybSAvdG1wL2JsYWgqKS4KKworICAgICAtQyAgICAgIEVuYWJsZXMgY29tcHJlc3Npb24gKHZpYSBzc2gncyAtQyBmbGFnKS4KKworICAgICAtYyBjaXBoZXIKKyAgICAgICAgICAgICBTZWxlY3RzIHRoZSBjaXBoZXIgdG8gdXNlIGZvciBlbmNyeXB0aW5nIHRoZSBkYXRhIHRyYW5zZmVycy4KKyAgICAgICAgICAgICBUaGlzIG9wdGlvbiBpcyBkaXJlY3RseSBwYXNzZWQgdG8gc3NoKDEpLgorCisgICAgIC1EIHNmdHBfc2VydmVyX3BhdGgKKyAgICAgICAgICAgICBDb25uZWN0IGRpcmVjdGx5IHRvIGEgbG9jYWwgc2Z0cCBzZXJ2ZXIgKHJhdGhlciB0aGFuIHZpYSBzc2goMSkpLgorICAgICAgICAgICAgIFRoaXMgb3B0aW9uIG1heSBiZSB1c2VmdWwgaW4gZGVidWdnaW5nIHRoZSBjbGllbnQgYW5kIHNlcnZlci4KKworICAgICAtRiBzc2hfY29uZmlnCisgICAgICAgICAgICAgU3BlY2lmaWVzIGFuIGFsdGVybmF0aXZlIHBlci11c2VyIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3Igc3NoKDEpLgorICAgICAgICAgICAgIFRoaXMgb3B0aW9uIGlzIGRpcmVjdGx5IHBhc3NlZCB0byBzc2goMSkuCisKKyAgICAgLWkgaWRlbnRpdHlfZmlsZQorICAgICAgICAgICAgIFNlbGVjdHMgdGhlIGZpbGUgZnJvbSB3aGljaCB0aGUgaWRlbnRpdHkgKHByaXZhdGUga2V5KSBmb3IgcHVibGljCisgICAgICAgICAgICAga2V5IGF1dGhlbnRpY2F0aW9uIGlzIHJlYWQuICBUaGlzIG9wdGlvbiBpcyBkaXJlY3RseSBwYXNzZWQgdG8KKyAgICAgICAgICAgICBzc2goMSkuCisKKyAgICAgLWwgbGltaXQKKyAgICAgICAgICAgICBMaW1pdHMgdGhlIHVzZWQgYmFuZHdpZHRoLCBzcGVjaWZpZWQgaW4gS2JpdC9zLgorCisgICAgIC1vIHNzaF9vcHRpb24KKyAgICAgICAgICAgICBDYW4gYmUgdXNlZCB0byBwYXNzIG9wdGlvbnMgdG8gc3NoIGluIHRoZSBmb3JtYXQgdXNlZCBpbgorICAgICAgICAgICAgIHNzaF9jb25maWcoNSkuICBUaGlzIGlzIHVzZWZ1bCBmb3Igc3BlY2lmeWluZyBvcHRpb25zIGZvciB3aGljaAorICAgICAgICAgICAgIHRoZXJlIGlzIG5vIHNlcGFyYXRlIHNmdHAgY29tbWFuZC1saW5lIGZsYWcuICBGb3IgZXhhbXBsZSwgdG8KKyAgICAgICAgICAgICBzcGVjaWZ5IGFuIGFsdGVybmF0ZSBwb3J0IHVzZTogc2Z0cCAtb1BvcnQ9MjQuICBGb3IgZnVsbCBkZXRhaWxzCisgICAgICAgICAgICAgb2YgdGhlIG9wdGlvbnMgbGlzdGVkIGJlbG93LCBhbmQgdGhlaXIgcG9zc2libGUgdmFsdWVzLCBzZWUKKyAgICAgICAgICAgICBzc2hfY29uZmlnKDUpLgorCisgICAgICAgICAgICAgICAgICAgQWRkcmVzc0ZhbWlseQorICAgICAgICAgICAgICAgICAgIEJhdGNoTW9kZQorICAgICAgICAgICAgICAgICAgIEJpbmRBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgICAgICAgIENoZWNrSG9zdElQCisgICAgICAgICAgICAgICAgICAgQ2lwaGVyCisgICAgICAgICAgICAgICAgICAgQ2lwaGVycworICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb25MZXZlbAorICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25BdHRlbXB0cworICAgICAgICAgICAgICAgICAgIENvbm5lY3RUaW1lb3V0CisgICAgICAgICAgICAgICAgICAgQ29udHJvbE1hc3RlcgorICAgICAgICAgICAgICAgICAgIENvbnRyb2xQYXRoCisgICAgICAgICAgICAgICAgICAgQ29udHJvbFBlcnNpc3QKKyAgICAgICAgICAgICAgICAgICBHbG9iYWxLbm93bkhvc3RzRmlsZQorICAgICAgICAgICAgICAgICAgIEdTU0FQSUF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgR1NTQVBJRGVsZWdhdGVDcmVkZW50aWFscworICAgICAgICAgICAgICAgICAgIEhhc2hLbm93bkhvc3RzCisgICAgICAgICAgICAgICAgICAgSG9zdAorICAgICAgICAgICAgICAgICAgIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgSG9zdEtleUFsZ29yaXRobXMKKyAgICAgICAgICAgICAgICAgICBIb3N0S2V5QWxpYXMKKyAgICAgICAgICAgICAgICAgICBIb3N0TmFtZQorICAgICAgICAgICAgICAgICAgIElkZW50aXR5RmlsZQorICAgICAgICAgICAgICAgICAgIElkZW50aXRpZXNPbmx5CisgICAgICAgICAgICAgICAgICAgSVBRb1MKKyAgICAgICAgICAgICAgICAgICBLYmRJbnRlcmFjdGl2ZUF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgS2JkSW50ZXJhY3RpdmVEZXZpY2VzCisgICAgICAgICAgICAgICAgICAgS2V4QWxnb3JpdGhtcworICAgICAgICAgICAgICAgICAgIExvZ0xldmVsCisgICAgICAgICAgICAgICAgICAgTUFDcworICAgICAgICAgICAgICAgICAgIE5vSG9zdEF1dGhlbnRpY2F0aW9uRm9yTG9jYWxob3N0CisgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZQYXNzd29yZFByb21wdHMKKyAgICAgICAgICAgICAgICAgICBQYXNzd29yZEF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgUEtDUzExUHJvdmlkZXIKKyAgICAgICAgICAgICAgICAgICBQb3J0CisgICAgICAgICAgICAgICAgICAgUHJlZmVycmVkQXV0aGVudGljYXRpb25zCisgICAgICAgICAgICAgICAgICAgUHJvdG9jb2wKKyAgICAgICAgICAgICAgICAgICBQcm94eUNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICBQdWJrZXlBdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgICAgICAgIFJla2V5TGltaXQKKyAgICAgICAgICAgICAgICAgICBSaG9zdHNSU0FBdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgICAgICAgIFJTQUF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgU2VuZEVudgorICAgICAgICAgICAgICAgICAgIFNlcnZlckFsaXZlSW50ZXJ2YWwKKyAgICAgICAgICAgICAgICAgICBTZXJ2ZXJBbGl2ZUNvdW50TWF4CisgICAgICAgICAgICAgICAgICAgU3RyaWN0SG9zdEtleUNoZWNraW5nCisgICAgICAgICAgICAgICAgICAgVENQS2VlcEFsaXZlCisgICAgICAgICAgICAgICAgICAgVXNlUHJpdmlsZWdlZFBvcnQKKyAgICAgICAgICAgICAgICAgICBVc2VyCisgICAgICAgICAgICAgICAgICAgVXNlcktub3duSG9zdHNGaWxlCisgICAgICAgICAgICAgICAgICAgVmVyaWZ5SG9zdEtleUROUworCisgICAgIC1QIHBvcnQKKyAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHBvcnQgdG8gY29ubmVjdCB0byBvbiB0aGUgcmVtb3RlIGhvc3QuCisKKyAgICAgLXAgICAgICBQcmVzZXJ2ZXMgbW9kaWZpY2F0aW9uIHRpbWVzLCBhY2Nlc3MgdGltZXMsIGFuZCBtb2RlcyBmcm9tIHRoZQorICAgICAgICAgICAgIG9yaWdpbmFsIGZpbGVzIHRyYW5zZmVycmVkLgorCisgICAgIC1xICAgICAgUXVpZXQgbW9kZTogZGlzYWJsZXMgdGhlIHByb2dyZXNzIG1ldGVyIGFzIHdlbGwgYXMgd2FybmluZyBhbmQKKyAgICAgICAgICAgICBkaWFnbm9zdGljIG1lc3NhZ2VzIGZyb20gc3NoKDEpLgorCisgICAgIC1SIG51bV9yZXF1ZXN0cworICAgICAgICAgICAgIFNwZWNpZnkgaG93IG1hbnkgcmVxdWVzdHMgbWF5IGJlIG91dHN0YW5kaW5nIGF0IGFueSBvbmUgdGltZS4KKyAgICAgICAgICAgICBJbmNyZWFzaW5nIHRoaXMgbWF5IHNsaWdodGx5IGltcHJvdmUgZmlsZSB0cmFuc2ZlciBzcGVlZCBidXQgd2lsbAorICAgICAgICAgICAgIGluY3JlYXNlIG1lbW9yeSB1c2FnZS4gIFRoZSBkZWZhdWx0IGlzIDY0IG91dHN0YW5kaW5nIHJlcXVlc3RzLgorCisgICAgIC1yICAgICAgUmVjdXJzaXZlbHkgY29weSBlbnRpcmUgZGlyZWN0b3JpZXMgd2hlbiB1cGxvYWRpbmcgYW5kCisgICAgICAgICAgICAgZG93bmxvYWRpbmcuICBOb3RlIHRoYXQgc2Z0cCBkb2VzIG5vdCBmb2xsb3cgc3ltYm9saWMgbGlua3MKKyAgICAgICAgICAgICBlbmNvdW50ZXJlZCBpbiB0aGUgdHJlZSB0cmF2ZXJzYWwuCisKKyAgICAgLVMgcHJvZ3JhbQorICAgICAgICAgICAgIE5hbWUgb2YgdGhlIHByb2dyYW0gdG8gdXNlIGZvciB0aGUgZW5jcnlwdGVkIGNvbm5lY3Rpb24uICBUaGUKKyAgICAgICAgICAgICBwcm9ncmFtIG11c3QgdW5kZXJzdGFuZCBzc2goMSkgb3B0aW9ucy4KKworICAgICAtcyBzdWJzeXN0ZW0gfCBzZnRwX3NlcnZlcgorICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgU1NIMiBzdWJzeXN0ZW0gb3IgdGhlIHBhdGggZm9yIGFuIHNmdHAgc2VydmVyIG9uCisgICAgICAgICAgICAgdGhlIHJlbW90ZSBob3N0LiAgQSBwYXRoIGlzIHVzZWZ1bCBmb3IgdXNpbmcgc2Z0cCBvdmVyIHByb3RvY29sCisgICAgICAgICAgICAgdmVyc2lvbiAxLCBvciB3aGVuIHRoZSByZW1vdGUgc3NoZCg4KSBkb2VzIG5vdCBoYXZlIGFuIHNmdHAKKyAgICAgICAgICAgICBzdWJzeXN0ZW0gY29uZmlndXJlZC4KKworICAgICAtdiAgICAgIFJhaXNlIGxvZ2dpbmcgbGV2ZWwuICBUaGlzIG9wdGlvbiBpcyBhbHNvIHBhc3NlZCB0byBzc2guCisKK0lOVEVSQUNUSVZFIENPTU1BTkRTCisgICAgIE9uY2UgaW4gaW50ZXJhY3RpdmUgbW9kZSwgc2Z0cCB1bmRlcnN0YW5kcyBhIHNldCBvZiBjb21tYW5kcyBzaW1pbGFyIHRvCisgICAgIHRob3NlIG9mIGZ0cCgxKS4gIENvbW1hbmRzIGFyZSBjYXNlIGluc2Vuc2l0aXZlLiAgUGF0aG5hbWVzIHRoYXQgY29udGFpbgorICAgICBzcGFjZXMgbXVzdCBiZSBlbmNsb3NlZCBpbiBxdW90ZXMuICBBbnkgc3BlY2lhbCBjaGFyYWN0ZXJzIGNvbnRhaW5lZAorICAgICB3aXRoaW4gcGF0aG5hbWVzIHRoYXQgYXJlIHJlY29nbml6ZWQgYnkgZ2xvYigzKSBtdXN0IGJlIGVzY2FwZWQgd2l0aAorICAgICBiYWNrc2xhc2hlcyAoYFwnKS4KKworICAgICBieWUgICAgIFF1aXQgc2Z0cC4KKworICAgICBjZCBwYXRoCisgICAgICAgICAgICAgQ2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkgdG8gcGF0aC4KKworICAgICBjaGdycCBncnAgcGF0aAorICAgICAgICAgICAgIENoYW5nZSBncm91cCBvZiBmaWxlIHBhdGggdG8gZ3JwLiAgcGF0aCBtYXkgY29udGFpbiBnbG9iKDMpCisgICAgICAgICAgICAgY2hhcmFjdGVycyBhbmQgbWF5IG1hdGNoIG11bHRpcGxlIGZpbGVzLiAgZ3JwIG11c3QgYmUgYSBudW1lcmljCisgICAgICAgICAgICAgR0lELgorCisgICAgIGNobW9kIG1vZGUgcGF0aAorICAgICAgICAgICAgIENoYW5nZSBwZXJtaXNzaW9ucyBvZiBmaWxlIHBhdGggdG8gbW9kZS4gIHBhdGggbWF5IGNvbnRhaW4KKyAgICAgICAgICAgICBnbG9iKDMpIGNoYXJhY3RlcnMgYW5kIG1heSBtYXRjaCBtdWx0aXBsZSBmaWxlcy4KKworICAgICBjaG93biBvd24gcGF0aAorICAgICAgICAgICAgIENoYW5nZSBvd25lciBvZiBmaWxlIHBhdGggdG8gb3duLiAgcGF0aCBtYXkgY29udGFpbiBnbG9iKDMpCisgICAgICAgICAgICAgY2hhcmFjdGVycyBhbmQgbWF5IG1hdGNoIG11bHRpcGxlIGZpbGVzLiAgb3duIG11c3QgYmUgYSBudW1lcmljCisgICAgICAgICAgICAgVUlELgorCisgICAgIGRmIFstaGldIFtwYXRoXQorICAgICAgICAgICAgIERpc3BsYXkgdXNhZ2UgaW5mb3JtYXRpb24gZm9yIHRoZSBmaWxlc3lzdGVtIGhvbGRpbmcgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICBkaXJlY3RvcnkgKG9yIHBhdGggaWYgc3BlY2lmaWVkKS4gIElmIHRoZSAtaCBmbGFnIGlzIHNwZWNpZmllZCwKKyAgICAgICAgICAgICB0aGUgY2FwYWNpdHkgaW5mb3JtYXRpb24gd2lsbCBiZSBkaXNwbGF5ZWQgdXNpbmcgImh1bWFuLXJlYWRhYmxlIgorICAgICAgICAgICAgIHN1ZmZpeGVzLiAgVGhlIC1pIGZsYWcgcmVxdWVzdHMgZGlzcGxheSBvZiBpbm9kZSBpbmZvcm1hdGlvbiBpbgorICAgICAgICAgICAgIGFkZGl0aW9uIHRvIGNhcGFjaXR5IGluZm9ybWF0aW9uLiAgVGhpcyBjb21tYW5kIGlzIG9ubHkgc3VwcG9ydGVkCisgICAgICAgICAgICAgb24gc2VydmVycyB0aGF0IGltcGxlbWVudCB0aGUgYGBzdGF0dmZzQG9wZW5zc2guY29tJycgZXh0ZW5zaW9uLgorCisgICAgIGV4aXQgICAgUXVpdCBzZnRwLgorCisgICAgIGdldCBbLVBwcl0gcmVtb3RlLXBhdGggW2xvY2FsLXBhdGhdCisgICAgICAgICAgICAgUmV0cmlldmUgdGhlIHJlbW90ZS1wYXRoIGFuZCBzdG9yZSBpdCBvbiB0aGUgbG9jYWwgbWFjaGluZS4gIElmCisgICAgICAgICAgICAgdGhlIGxvY2FsIHBhdGggbmFtZSBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcyBnaXZlbiB0aGUgc2FtZSBuYW1lCisgICAgICAgICAgICAgaXQgaGFzIG9uIHRoZSByZW1vdGUgbWFjaGluZS4gIHJlbW90ZS1wYXRoIG1heSBjb250YWluIGdsb2IoMykKKyAgICAgICAgICAgICBjaGFyYWN0ZXJzIGFuZCBtYXkgbWF0Y2ggbXVsdGlwbGUgZmlsZXMuICBJZiBpdCBkb2VzIGFuZAorICAgICAgICAgICAgIGxvY2FsLXBhdGggaXMgc3BlY2lmaWVkLCB0aGVuIGxvY2FsLXBhdGggbXVzdCBzcGVjaWZ5IGEKKyAgICAgICAgICAgICBkaXJlY3RvcnkuCisKKyAgICAgICAgICAgICBJZiBlaXRoZXIgdGhlIC1QIG9yIC1wIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGVuIGZ1bGwgZmlsZQorICAgICAgICAgICAgIHBlcm1pc3Npb25zIGFuZCBhY2Nlc3MgdGltZXMgYXJlIGNvcGllZCB0b28uCisKKyAgICAgICAgICAgICBJZiB0aGUgLXIgZmxhZyBpcyBzcGVjaWZpZWQgdGhlbiBkaXJlY3RvcmllcyB3aWxsIGJlIGNvcGllZAorICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5LiAgTm90ZSB0aGF0IHNmdHAgZG9lcyBub3QgZm9sbG93IHN5bWJvbGljIGxpbmtzIHdoZW4KKyAgICAgICAgICAgICBwZXJmb3JtaW5nIHJlY3Vyc2l2ZSB0cmFuc2ZlcnMuCisKKyAgICAgaGVscCAgICBEaXNwbGF5IGhlbHAgdGV4dC4KKworICAgICBsY2QgcGF0aAorICAgICAgICAgICAgIENoYW5nZSBsb2NhbCBkaXJlY3RvcnkgdG8gcGF0aC4KKworICAgICBsbHMgW2xzLW9wdGlvbnMgW3BhdGhdXQorICAgICAgICAgICAgIERpc3BsYXkgbG9jYWwgZGlyZWN0b3J5IGxpc3Rpbmcgb2YgZWl0aGVyIHBhdGggb3IgY3VycmVudAorICAgICAgICAgICAgIGRpcmVjdG9yeSBpZiBwYXRoIGlzIG5vdCBzcGVjaWZpZWQuICBscy1vcHRpb25zIG1heSBjb250YWluIGFueQorICAgICAgICAgICAgIGZsYWdzIHN1cHBvcnRlZCBieSB0aGUgbG9jYWwgc3lzdGVtJ3MgbHMoMSkgY29tbWFuZC4gIHBhdGggbWF5CisgICAgICAgICAgICAgY29udGFpbiBnbG9iKDMpIGNoYXJhY3RlcnMgYW5kIG1heSBtYXRjaCBtdWx0aXBsZSBmaWxlcy4KKworICAgICBsbWtkaXIgcGF0aAorICAgICAgICAgICAgIENyZWF0ZSBsb2NhbCBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5IHBhdGguCisKKyAgICAgbG4gWy1zXSBvbGRwYXRoIG5ld3BhdGgKKyAgICAgICAgICAgICBDcmVhdGUgYSBsaW5rIGZyb20gb2xkcGF0aCB0byBuZXdwYXRoLiAgSWYgdGhlIC1zIGZsYWcgaXMKKyAgICAgICAgICAgICBzcGVjaWZpZWQgdGhlIGNyZWF0ZWQgbGluayBpcyBhIHN5bWJvbGljIGxpbmssIG90aGVyd2lzZSBpdCBpcyBhCisgICAgICAgICAgICAgaGFyZCBsaW5rLgorCisgICAgIGxwd2QgICAgUHJpbnQgbG9jYWwgd29ya2luZyBkaXJlY3RvcnkuCisKKyAgICAgbHMgWy0xYWZobG5yU3RdIFtwYXRoXQorICAgICAgICAgICAgIERpc3BsYXkgYSByZW1vdGUgZGlyZWN0b3J5IGxpc3Rpbmcgb2YgZWl0aGVyIHBhdGggb3IgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICBkaXJlY3RvcnkgaWYgcGF0aCBpcyBub3Qgc3BlY2lmaWVkLiAgcGF0aCBtYXkgY29udGFpbiBnbG9iKDMpCisgICAgICAgICAgICAgY2hhcmFjdGVycyBhbmQgbWF5IG1hdGNoIG11bHRpcGxlIGZpbGVzLgorCisgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBmbGFncyBhcmUgcmVjb2duaXplZCBhbmQgYWx0ZXIgdGhlIGJlaGF2aW91ciBvZiBscworICAgICAgICAgICAgIGFjY29yZGluZ2x5OgorCisgICAgICAgICAgICAgLTEgICAgICBQcm9kdWNlIHNpbmdsZSBjb2x1bW5hciBvdXRwdXQuCisKKyAgICAgICAgICAgICAtYSAgICAgIExpc3QgZmlsZXMgYmVnaW5uaW5nIHdpdGggYSBkb3QgKGAuJykuCisKKyAgICAgICAgICAgICAtZiAgICAgIERvIG5vdCBzb3J0IHRoZSBsaXN0aW5nLiAgVGhlIGRlZmF1bHQgc29ydCBvcmRlciBpcworICAgICAgICAgICAgICAgICAgICAgbGV4aWNvZ3JhcGhpY2FsLgorCisgICAgICAgICAgICAgLWggICAgICBXaGVuIHVzZWQgd2l0aCBhIGxvbmcgZm9ybWF0IG9wdGlvbiwgdXNlIHVuaXQgc3VmZml4ZXM6CisgICAgICAgICAgICAgICAgICAgICBCeXRlLCBLaWxvYnl0ZSwgTWVnYWJ5dGUsIEdpZ2FieXRlLCBUZXJhYnl0ZSwgUGV0YWJ5dGUsCisgICAgICAgICAgICAgICAgICAgICBhbmQgRXhhYnl0ZSBpbiBvcmRlciB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBkaWdpdHMgdG8KKyAgICAgICAgICAgICAgICAgICAgIGZvdXIgb3IgZmV3ZXIgdXNpbmcgcG93ZXJzIG9mIDIgZm9yIHNpemVzIChLPTEwMjQsCisgICAgICAgICAgICAgICAgICAgICBNPTEwNDg1NzYsIGV0Yy4pLgorCisgICAgICAgICAgICAgLWwgICAgICBEaXNwbGF5IGFkZGl0aW9uYWwgZGV0YWlscyBpbmNsdWRpbmcgcGVybWlzc2lvbnMgYW5kCisgICAgICAgICAgICAgICAgICAgICBvd25lcnNoaXAgaW5mb3JtYXRpb24uCisKKyAgICAgICAgICAgICAtbiAgICAgIFByb2R1Y2UgYSBsb25nIGxpc3Rpbmcgd2l0aCB1c2VyIGFuZCBncm91cCBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGVkIG51bWVyaWNhbGx5LgorCisgICAgICAgICAgICAgLXIgICAgICBSZXZlcnNlIHRoZSBzb3J0IG9yZGVyIG9mIHRoZSBsaXN0aW5nLgorCisgICAgICAgICAgICAgLVMgICAgICBTb3J0IHRoZSBsaXN0aW5nIGJ5IGZpbGUgc2l6ZS4KKworICAgICAgICAgICAgIC10ICAgICAgU29ydCB0aGUgbGlzdGluZyBieSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lLgorCisgICAgIGx1bWFzayB1bWFzaworICAgICAgICAgICAgIFNldCBsb2NhbCB1bWFzayB0byB1bWFzay4KKworICAgICBta2RpciBwYXRoCisgICAgICAgICAgICAgQ3JlYXRlIHJlbW90ZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5IHBhdGguCisKKyAgICAgcHJvZ3Jlc3MKKyAgICAgICAgICAgICBUb2dnbGUgZGlzcGxheSBvZiBwcm9ncmVzcyBtZXRlci4KKworICAgICBwdXQgWy1QcHJdIGxvY2FsLXBhdGggW3JlbW90ZS1wYXRoXQorICAgICAgICAgICAgIFVwbG9hZCBsb2NhbC1wYXRoIGFuZCBzdG9yZSBpdCBvbiB0aGUgcmVtb3RlIG1hY2hpbmUuICBJZiB0aGUKKyAgICAgICAgICAgICByZW1vdGUgcGF0aCBuYW1lIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGlzIGdpdmVuIHRoZSBzYW1lIG5hbWUgaXQKKyAgICAgICAgICAgICBoYXMgb24gdGhlIGxvY2FsIG1hY2hpbmUuICBsb2NhbC1wYXRoIG1heSBjb250YWluIGdsb2IoMykKKyAgICAgICAgICAgICBjaGFyYWN0ZXJzIGFuZCBtYXkgbWF0Y2ggbXVsdGlwbGUgZmlsZXMuICBJZiBpdCBkb2VzIGFuZAorICAgICAgICAgICAgIHJlbW90ZS1wYXRoIGlzIHNwZWNpZmllZCwgdGhlbiByZW1vdGUtcGF0aCBtdXN0IHNwZWNpZnkgYQorICAgICAgICAgICAgIGRpcmVjdG9yeS4KKworICAgICAgICAgICAgIElmIGVpdGhlciB0aGUgLVAgb3IgLXAgZmxhZyBpcyBzcGVjaWZpZWQsIHRoZW4gZnVsbCBmaWxlCisgICAgICAgICAgICAgcGVybWlzc2lvbnMgYW5kIGFjY2VzcyB0aW1lcyBhcmUgY29waWVkIHRvby4KKworICAgICAgICAgICAgIElmIHRoZSAtciBmbGFnIGlzIHNwZWNpZmllZCB0aGVuIGRpcmVjdG9yaWVzIHdpbGwgYmUgY29waWVkCisgICAgICAgICAgICAgcmVjdXJzaXZlbHkuICBOb3RlIHRoYXQgc2Z0cCBkb2VzIG5vdCBmb2xsb3cgc3ltYm9saWMgbGlua3Mgd2hlbgorICAgICAgICAgICAgIHBlcmZvcm1pbmcgcmVjdXJzaXZlIHRyYW5zZmVycy4KKworICAgICBwd2QgICAgIERpc3BsYXkgcmVtb3RlIHdvcmtpbmcgZGlyZWN0b3J5LgorCisgICAgIHF1aXQgICAgUXVpdCBzZnRwLgorCisgICAgIHJlbmFtZSBvbGRwYXRoIG5ld3BhdGgKKyAgICAgICAgICAgICBSZW5hbWUgcmVtb3RlIGZpbGUgZnJvbSBvbGRwYXRoIHRvIG5ld3BhdGguCisKKyAgICAgcm0gcGF0aAorICAgICAgICAgICAgIERlbGV0ZSByZW1vdGUgZmlsZSBzcGVjaWZpZWQgYnkgcGF0aC4KKworICAgICBybWRpciBwYXRoCisgICAgICAgICAgICAgUmVtb3ZlIHJlbW90ZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5IHBhdGguCisKKyAgICAgc3ltbGluayBvbGRwYXRoIG5ld3BhdGgKKyAgICAgICAgICAgICBDcmVhdGUgYSBzeW1ib2xpYyBsaW5rIGZyb20gb2xkcGF0aCB0byBuZXdwYXRoLgorCisgICAgIHZlcnNpb24KKyAgICAgICAgICAgICBEaXNwbGF5IHRoZSBzZnRwIHByb3RvY29sIHZlcnNpb24uCisKKyAgICAgIWNvbW1hbmQKKyAgICAgICAgICAgICBFeGVjdXRlIGNvbW1hbmQgaW4gbG9jYWwgc2hlbGwuCisKKyAgICAgISAgICAgICBFc2NhcGUgdG8gbG9jYWwgc2hlbGwuCisKKyAgICAgPyAgICAgICBTeW5vbnltIGZvciBoZWxwLgorCitTRUUgQUxTTworICAgICBmdHAoMSksIGxzKDEpLCBzY3AoMSksIHNzaCgxKSwgc3NoLWFkZCgxKSwgc3NoLWtleWdlbigxKSwgZ2xvYigzKSwKKyAgICAgc3NoX2NvbmZpZyg1KSwgc2Z0cC1zZXJ2ZXIoOCksIHNzaGQoOCkKKworICAgICBULiBZbG9uZW4gYW5kIFMuIExlaHRpbmVuLCBTU0ggRmlsZSBUcmFuc2ZlciBQcm90b2NvbCwKKyAgICAgZHJhZnQtaWV0Zi1zZWNzaC1maWxleGZlci0wMC50eHQsIEphbnVhcnkgMjAwMSwgd29yayBpbiBwcm9ncmVzcworICAgICBtYXRlcmlhbC4KKworT3BlbkJTRCA1LjAgICAgICAgICAgICAgICAgICAgIFNlcHRlbWJlciA1LCAyMDExICAgICAgICAgICAgICAgICAgIE9wZW5CU0QgNS4wCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NmdHAuMSBiL29wZW5zc2gtNi4wcDEvc2Z0cC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYjQ3MjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NmdHAuMQpAQCAtMCwwICsxLDU1MyBAQAorLlwiICRPcGVuQlNEOiBzZnRwLjEsdiAxLjkxIDIwMTEvMDkvMDUgMDU6NTY6MTMgZGptIEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDIwMDEgRGFtaWVuIE1pbGxlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLlwiIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy5cIiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLlwiIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy5cIiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy5cIiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisuXCIgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisuXCIgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLlwiIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLlwiIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisuXCIKKy5EZCAkTWRvY2RhdGU6IFNlcHRlbWJlciA1IDIwMTEgJAorLkR0IFNGVFAgMQorLk9zCisuU2ggTkFNRQorLk5tIHNmdHAKKy5OZCBzZWN1cmUgZmlsZSB0cmFuc2ZlciBwcm9ncmFtCisuU2ggU1lOT1BTSVMKKy5ObSBzZnRwCisuQmsgLXdvcmRzCisuT3AgRmwgMTI0NkNwcXJ2CisuT3AgRmwgQiBBciBidWZmZXJfc2l6ZQorLk9wIEZsIGIgQXIgYmF0Y2hmaWxlCisuT3AgRmwgYyBBciBjaXBoZXIKKy5PcCBGbCBEIEFyIHNmdHBfc2VydmVyX3BhdGgKKy5PcCBGbCBGIEFyIHNzaF9jb25maWcKKy5PcCBGbCBpIEFyIGlkZW50aXR5X2ZpbGUKKy5PcCBGbCBsIEFyIGxpbWl0CisuT3AgRmwgbyBBciBzc2hfb3B0aW9uCisuT3AgRmwgUCBBciBwb3J0CisuT3AgRmwgUiBBciBudW1fcmVxdWVzdHMKKy5PcCBGbCBTIEFyIHByb2dyYW0KKy5PcCBGbCBzIEFyIHN1YnN5c3RlbSB8IHNmdHBfc2VydmVyCisuQXIgaG9zdAorLkVrCisuTm0gc2Z0cAorLk9vIEFyIHVzZXIgTnMgQCBPYyBOcworLkFyIGhvc3QgTnMgT3AgOiBOcyBBcgorLk5tIHNmdHAKKy5PbworLkFyIHVzZXIgTnMgQCBPYyBOcworLkFyIGhvc3QgTnMgT28gOiBOcyBBciBkaXIgTnMKKy5PcCBBciAvCisuT2MKKy5ObSBzZnRwCisuRmwgYiBBciBiYXRjaGZpbGUKKy5PbyBBciB1c2VyIE5zIEAgT2MgTnMgQXIgaG9zdAorLlNoIERFU0NSSVBUSU9OCisuTm0KK2lzIGFuIGludGVyYWN0aXZlIGZpbGUgdHJhbnNmZXIgcHJvZ3JhbSwgc2ltaWxhciB0bworLlhyIGZ0cCAxICwKK3doaWNoIHBlcmZvcm1zIGFsbCBvcGVyYXRpb25zIG92ZXIgYW4gZW5jcnlwdGVkCisuWHIgc3NoIDEKK3RyYW5zcG9ydC4KK0l0IG1heSBhbHNvIHVzZSBtYW55IGZlYXR1cmVzIG9mIHNzaCwgc3VjaCBhcyBwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uIGFuZAorY29tcHJlc3Npb24uCisuTm0KK2Nvbm5lY3RzIGFuZCBsb2dzIGludG8gdGhlIHNwZWNpZmllZAorLkFyIGhvc3QgLAordGhlbiBlbnRlcnMgYW4gaW50ZXJhY3RpdmUgY29tbWFuZCBtb2RlLgorLlBwCitUaGUgc2Vjb25kIHVzYWdlIGZvcm1hdCB3aWxsIHJldHJpZXZlIGZpbGVzIGF1dG9tYXRpY2FsbHkgaWYgYSBub24taW50ZXJhY3RpdmUKK2F1dGhlbnRpY2F0aW9uIG1ldGhvZCBpcyB1c2VkOyBvdGhlcndpc2UgaXQgd2lsbCBkbyBzbyBhZnRlcgorc3VjY2Vzc2Z1bCBpbnRlcmFjdGl2ZSBhdXRoZW50aWNhdGlvbi4KKy5QcAorVGhlIHRoaXJkIHVzYWdlIGZvcm1hdCBhbGxvd3MKKy5ObQordG8gc3RhcnQgaW4gYSByZW1vdGUgZGlyZWN0b3J5LgorLlBwCitUaGUgZmluYWwgdXNhZ2UgZm9ybWF0IGFsbG93cyBmb3IgYXV0b21hdGVkIHNlc3Npb25zIHVzaW5nIHRoZQorLkZsIGIKK29wdGlvbi4KK0luIHN1Y2ggY2FzZXMsIGl0IGlzIG5lY2Vzc2FyeSB0byBjb25maWd1cmUgbm9uLWludGVyYWN0aXZlIGF1dGhlbnRpY2F0aW9uCit0byBvYnZpYXRlIHRoZSBuZWVkIHRvIGVudGVyIGEgcGFzc3dvcmQgYXQgY29ubmVjdGlvbiB0aW1lIChzZWUKKy5YciBzc2hkIDgKK2FuZAorLlhyIHNzaC1rZXlnZW4gMQorZm9yIGRldGFpbHMpLgorLlBwCitTaW5jZSBzb21lIHVzYWdlIGZvcm1hdHMgdXNlIGNvbG9uIGNoYXJhY3RlcnMgdG8gZGVsaW1pdCBob3N0IG5hbWVzIGZyb20gcGF0aAorbmFtZXMsIElQdjYgYWRkcmVzc2VzIG11c3QgYmUgZW5jbG9zZWQgaW4gc3F1YXJlIGJyYWNrZXRzIHRvIGF2b2lkIGFtYmlndWl0eS4KKy5QcAorVGhlIG9wdGlvbnMgYXJlIGFzIGZvbGxvd3M6CisuQmwgLXRhZyAtd2lkdGggRHMKKy5JdCBGbCAxCitTcGVjaWZ5IHRoZSB1c2Ugb2YgcHJvdG9jb2wgdmVyc2lvbiAxLgorLkl0IEZsIDIKK1NwZWNpZnkgdGhlIHVzZSBvZiBwcm90b2NvbCB2ZXJzaW9uIDIuCisuSXQgRmwgNAorRm9yY2VzCisuTm0KK3RvIHVzZSBJUHY0IGFkZHJlc3NlcyBvbmx5LgorLkl0IEZsIDYKK0ZvcmNlcworLk5tCit0byB1c2UgSVB2NiBhZGRyZXNzZXMgb25seS4KKy5JdCBGbCBCIEFyIGJ1ZmZlcl9zaXplCitTcGVjaWZ5IHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdGhhdAorLk5tCit1c2VzIHdoZW4gdHJhbnNmZXJyaW5nIGZpbGVzLgorTGFyZ2VyIGJ1ZmZlcnMgcmVxdWlyZSBmZXdlciByb3VuZCB0cmlwcyBhdCB0aGUgY29zdCBvZiBoaWdoZXIKK21lbW9yeSBjb25zdW1wdGlvbi4KK1RoZSBkZWZhdWx0IGlzIDMyNzY4IGJ5dGVzLgorLkl0IEZsIGIgQXIgYmF0Y2hmaWxlCitCYXRjaCBtb2RlIHJlYWRzIGEgc2VyaWVzIG9mIGNvbW1hbmRzIGZyb20gYW4gaW5wdXQKKy5BciBiYXRjaGZpbGUKK2luc3RlYWQgb2YKKy5FbSBzdGRpbiAuCitTaW5jZSBpdCBsYWNrcyB1c2VyIGludGVyYWN0aW9uIGl0IHNob3VsZCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgKK25vbi1pbnRlcmFjdGl2ZSBhdXRoZW50aWNhdGlvbi4KK0EKKy5BciBiYXRjaGZpbGUKK29mCisuU3EgXC0KK21heSBiZSB1c2VkIHRvIGluZGljYXRlIHN0YW5kYXJkIGlucHV0LgorLk5tCit3aWxsIGFib3J0IGlmIGFueSBvZiB0aGUgZm9sbG93aW5nCitjb21tYW5kcyBmYWlsOgorLkljIGdldCAsIHB1dCAsIHJlbmFtZSAsIGxuICwKKy5JYyBybSAsIG1rZGlyICwgY2hkaXIgLCBscyAsCisuSWMgbGNoZGlyICwgY2htb2QgLCBjaG93biAsCisuSWMgY2hncnAgLCBscHdkICwgZGYgLCBzeW1saW5rICwKK2FuZAorLkljIGxta2RpciAuCitUZXJtaW5hdGlvbiBvbiBlcnJvciBjYW4gYmUgc3VwcHJlc3NlZCBvbiBhIGNvbW1hbmQgYnkgY29tbWFuZCBiYXNpcyBieQorcHJlZml4aW5nIHRoZSBjb21tYW5kIHdpdGggYQorLlNxIFwtCitjaGFyYWN0ZXIgKGZvciBleGFtcGxlLAorLkljIC1ybSAvdG1wL2JsYWgqICkgLgorLkl0IEZsIEMKK0VuYWJsZXMgY29tcHJlc3Npb24gKHZpYSBzc2gncworLkZsIEMKK2ZsYWcpLgorLkl0IEZsIGMgQXIgY2lwaGVyCitTZWxlY3RzIHRoZSBjaXBoZXIgdG8gdXNlIGZvciBlbmNyeXB0aW5nIHRoZSBkYXRhIHRyYW5zZmVycy4KK1RoaXMgb3B0aW9uIGlzIGRpcmVjdGx5IHBhc3NlZCB0bworLlhyIHNzaCAxIC4KKy5JdCBGbCBEIEFyIHNmdHBfc2VydmVyX3BhdGgKK0Nvbm5lY3QgZGlyZWN0bHkgdG8gYSBsb2NhbCBzZnRwIHNlcnZlcgorKHJhdGhlciB0aGFuIHZpYQorLlhyIHNzaCAxICkgLgorVGhpcyBvcHRpb24gbWF5IGJlIHVzZWZ1bCBpbiBkZWJ1Z2dpbmcgdGhlIGNsaWVudCBhbmQgc2VydmVyLgorLkl0IEZsIEYgQXIgc3NoX2NvbmZpZworU3BlY2lmaWVzIGFuIGFsdGVybmF0aXZlCitwZXItdXNlciBjb25maWd1cmF0aW9uIGZpbGUgZm9yCisuWHIgc3NoIDEgLgorVGhpcyBvcHRpb24gaXMgZGlyZWN0bHkgcGFzc2VkIHRvCisuWHIgc3NoIDEgLgorLkl0IEZsIGkgQXIgaWRlbnRpdHlfZmlsZQorU2VsZWN0cyB0aGUgZmlsZSBmcm9tIHdoaWNoIHRoZSBpZGVudGl0eSAocHJpdmF0ZSBrZXkpIGZvciBwdWJsaWMga2V5CithdXRoZW50aWNhdGlvbiBpcyByZWFkLgorVGhpcyBvcHRpb24gaXMgZGlyZWN0bHkgcGFzc2VkIHRvCisuWHIgc3NoIDEgLgorLkl0IEZsIGwgQXIgbGltaXQKK0xpbWl0cyB0aGUgdXNlZCBiYW5kd2lkdGgsIHNwZWNpZmllZCBpbiBLYml0L3MuCisuSXQgRmwgbyBBciBzc2hfb3B0aW9uCitDYW4gYmUgdXNlZCB0byBwYXNzIG9wdGlvbnMgdG8KKy5ObSBzc2gKK2luIHRoZSBmb3JtYXQgdXNlZCBpbgorLlhyIHNzaF9jb25maWcgNSAuCitUaGlzIGlzIHVzZWZ1bCBmb3Igc3BlY2lmeWluZyBvcHRpb25zCitmb3Igd2hpY2ggdGhlcmUgaXMgbm8gc2VwYXJhdGUKKy5ObSBzZnRwCitjb21tYW5kLWxpbmUgZmxhZy4KK0ZvciBleGFtcGxlLCB0byBzcGVjaWZ5IGFuIGFsdGVybmF0ZSBwb3J0IHVzZToKKy5JYyBzZnRwIC1vUG9ydD0yNCAuCitGb3IgZnVsbCBkZXRhaWxzIG9mIHRoZSBvcHRpb25zIGxpc3RlZCBiZWxvdywgYW5kIHRoZWlyIHBvc3NpYmxlIHZhbHVlcywgc2VlCisuWHIgc3NoX2NvbmZpZyA1IC4KKy5QcAorLkJsIC10YWcgLXdpZHRoIERzIC1vZmZzZXQgaW5kZW50IC1jb21wYWN0CisuSXQgQWRkcmVzc0ZhbWlseQorLkl0IEJhdGNoTW9kZQorLkl0IEJpbmRBZGRyZXNzCisuSXQgQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbgorLkl0IENoZWNrSG9zdElQCisuSXQgQ2lwaGVyCisuSXQgQ2lwaGVycworLkl0IENvbXByZXNzaW9uCisuSXQgQ29tcHJlc3Npb25MZXZlbAorLkl0IENvbm5lY3Rpb25BdHRlbXB0cworLkl0IENvbm5lY3RUaW1lb3V0CisuSXQgQ29udHJvbE1hc3RlcgorLkl0IENvbnRyb2xQYXRoCisuSXQgQ29udHJvbFBlcnNpc3QKKy5JdCBHbG9iYWxLbm93bkhvc3RzRmlsZQorLkl0IEdTU0FQSUF1dGhlbnRpY2F0aW9uCisuSXQgR1NTQVBJRGVsZWdhdGVDcmVkZW50aWFscworLkl0IEhhc2hLbm93bkhvc3RzCisuSXQgSG9zdAorLkl0IEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uCisuSXQgSG9zdEtleUFsZ29yaXRobXMKKy5JdCBIb3N0S2V5QWxpYXMKKy5JdCBIb3N0TmFtZQorLkl0IElkZW50aXR5RmlsZQorLkl0IElkZW50aXRpZXNPbmx5CisuSXQgSVBRb1MKKy5JdCBLYmRJbnRlcmFjdGl2ZUF1dGhlbnRpY2F0aW9uCisuSXQgS2JkSW50ZXJhY3RpdmVEZXZpY2VzCisuSXQgS2V4QWxnb3JpdGhtcworLkl0IExvZ0xldmVsCisuSXQgTUFDcworLkl0IE5vSG9zdEF1dGhlbnRpY2F0aW9uRm9yTG9jYWxob3N0CisuSXQgTnVtYmVyT2ZQYXNzd29yZFByb21wdHMKKy5JdCBQYXNzd29yZEF1dGhlbnRpY2F0aW9uCisuSXQgUEtDUzExUHJvdmlkZXIKKy5JdCBQb3J0CisuSXQgUHJlZmVycmVkQXV0aGVudGljYXRpb25zCisuSXQgUHJvdG9jb2wKKy5JdCBQcm94eUNvbW1hbmQKKy5JdCBQdWJrZXlBdXRoZW50aWNhdGlvbgorLkl0IFJla2V5TGltaXQKKy5JdCBSaG9zdHNSU0FBdXRoZW50aWNhdGlvbgorLkl0IFJTQUF1dGhlbnRpY2F0aW9uCisuSXQgU2VuZEVudgorLkl0IFNlcnZlckFsaXZlSW50ZXJ2YWwKKy5JdCBTZXJ2ZXJBbGl2ZUNvdW50TWF4CisuSXQgU3RyaWN0SG9zdEtleUNoZWNraW5nCisuSXQgVENQS2VlcEFsaXZlCisuSXQgVXNlUHJpdmlsZWdlZFBvcnQKKy5JdCBVc2VyCisuSXQgVXNlcktub3duSG9zdHNGaWxlCisuSXQgVmVyaWZ5SG9zdEtleUROUworLkVsCisuSXQgRmwgUCBBciBwb3J0CitTcGVjaWZpZXMgdGhlIHBvcnQgdG8gY29ubmVjdCB0byBvbiB0aGUgcmVtb3RlIGhvc3QuCisuSXQgRmwgcAorUHJlc2VydmVzIG1vZGlmaWNhdGlvbiB0aW1lcywgYWNjZXNzIHRpbWVzLCBhbmQgbW9kZXMgZnJvbSB0aGUKK29yaWdpbmFsIGZpbGVzIHRyYW5zZmVycmVkLgorLkl0IEZsIHEKK1F1aWV0IG1vZGU6IGRpc2FibGVzIHRoZSBwcm9ncmVzcyBtZXRlciBhcyB3ZWxsIGFzIHdhcm5pbmcgYW5kCitkaWFnbm9zdGljIG1lc3NhZ2VzIGZyb20KKy5YciBzc2ggMSAuCisuSXQgRmwgUiBBciBudW1fcmVxdWVzdHMKK1NwZWNpZnkgaG93IG1hbnkgcmVxdWVzdHMgbWF5IGJlIG91dHN0YW5kaW5nIGF0IGFueSBvbmUgdGltZS4KK0luY3JlYXNpbmcgdGhpcyBtYXkgc2xpZ2h0bHkgaW1wcm92ZSBmaWxlIHRyYW5zZmVyIHNwZWVkCitidXQgd2lsbCBpbmNyZWFzZSBtZW1vcnkgdXNhZ2UuCitUaGUgZGVmYXVsdCBpcyA2NCBvdXRzdGFuZGluZyByZXF1ZXN0cy4KKy5JdCBGbCByCitSZWN1cnNpdmVseSBjb3B5IGVudGlyZSBkaXJlY3RvcmllcyB3aGVuIHVwbG9hZGluZyBhbmQgZG93bmxvYWRpbmcuCitOb3RlIHRoYXQKKy5ObQorZG9lcyBub3QgZm9sbG93IHN5bWJvbGljIGxpbmtzIGVuY291bnRlcmVkIGluIHRoZSB0cmVlIHRyYXZlcnNhbC4KKy5JdCBGbCBTIEFyIHByb2dyYW0KK05hbWUgb2YgdGhlCisuQXIgcHJvZ3JhbQordG8gdXNlIGZvciB0aGUgZW5jcnlwdGVkIGNvbm5lY3Rpb24uCitUaGUgcHJvZ3JhbSBtdXN0IHVuZGVyc3RhbmQKKy5YciBzc2ggMQorb3B0aW9ucy4KKy5JdCBGbCBzIEFyIHN1YnN5c3RlbSB8IHNmdHBfc2VydmVyCitTcGVjaWZpZXMgdGhlIFNTSDIgc3Vic3lzdGVtIG9yIHRoZSBwYXRoIGZvciBhbiBzZnRwIHNlcnZlcgorb24gdGhlIHJlbW90ZSBob3N0LgorQSBwYXRoIGlzIHVzZWZ1bCBmb3IgdXNpbmcKKy5ObQorb3ZlciBwcm90b2NvbCB2ZXJzaW9uIDEsIG9yIHdoZW4gdGhlIHJlbW90ZQorLlhyIHNzaGQgOAorZG9lcyBub3QgaGF2ZSBhbiBzZnRwIHN1YnN5c3RlbSBjb25maWd1cmVkLgorLkl0IEZsIHYKK1JhaXNlIGxvZ2dpbmcgbGV2ZWwuCitUaGlzIG9wdGlvbiBpcyBhbHNvIHBhc3NlZCB0byBzc2guCisuRWwKKy5TaCBJTlRFUkFDVElWRSBDT01NQU5EUworT25jZSBpbiBpbnRlcmFjdGl2ZSBtb2RlLAorLk5tCit1bmRlcnN0YW5kcyBhIHNldCBvZiBjb21tYW5kcyBzaW1pbGFyIHRvIHRob3NlIG9mCisuWHIgZnRwIDEgLgorQ29tbWFuZHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUuCitQYXRobmFtZXMgdGhhdCBjb250YWluIHNwYWNlcyBtdXN0IGJlIGVuY2xvc2VkIGluIHF1b3Rlcy4KK0FueSBzcGVjaWFsIGNoYXJhY3RlcnMgY29udGFpbmVkIHdpdGhpbiBwYXRobmFtZXMgdGhhdCBhcmUgcmVjb2duaXplZCBieQorLlhyIGdsb2IgMworbXVzdCBiZSBlc2NhcGVkIHdpdGggYmFja3NsYXNoZXMKKy5QcSBTcSBcZSAuCisuQmwgLXRhZyAtd2lkdGggRHMKKy5JdCBJYyBieWUKK1F1aXQKKy5ObSBzZnRwIC4KKy5JdCBJYyBjZCBBciBwYXRoCitDaGFuZ2UgcmVtb3RlIGRpcmVjdG9yeSB0bworLkFyIHBhdGggLgorLkl0IEljIGNoZ3JwIEFyIGdycCBBciBwYXRoCitDaGFuZ2UgZ3JvdXAgb2YgZmlsZQorLkFyIHBhdGgKK3RvCisuQXIgZ3JwIC4KKy5BciBwYXRoCittYXkgY29udGFpbgorLlhyIGdsb2IgMworY2hhcmFjdGVycyBhbmQgbWF5IG1hdGNoIG11bHRpcGxlIGZpbGVzLgorLkFyIGdycAorbXVzdCBiZSBhIG51bWVyaWMgR0lELgorLkl0IEljIGNobW9kIEFyIG1vZGUgQXIgcGF0aAorQ2hhbmdlIHBlcm1pc3Npb25zIG9mIGZpbGUKKy5BciBwYXRoCit0bworLkFyIG1vZGUgLgorLkFyIHBhdGgKK21heSBjb250YWluCisuWHIgZ2xvYiAzCitjaGFyYWN0ZXJzIGFuZCBtYXkgbWF0Y2ggbXVsdGlwbGUgZmlsZXMuCisuSXQgSWMgY2hvd24gQXIgb3duIEFyIHBhdGgKK0NoYW5nZSBvd25lciBvZiBmaWxlCisuQXIgcGF0aAordG8KKy5BciBvd24gLgorLkFyIHBhdGgKK21heSBjb250YWluCisuWHIgZ2xvYiAzCitjaGFyYWN0ZXJzIGFuZCBtYXkgbWF0Y2ggbXVsdGlwbGUgZmlsZXMuCisuQXIgb3duCittdXN0IGJlIGEgbnVtZXJpYyBVSUQuCisuSXQgWG8gSWMgZGYKKy5PcCBGbCBoaQorLk9wIEFyIHBhdGgKKy5YYworRGlzcGxheSB1c2FnZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGZpbGVzeXN0ZW0gaG9sZGluZyB0aGUgY3VycmVudCBkaXJlY3RvcnkKKyhvcgorLkFyIHBhdGgKK2lmIHNwZWNpZmllZCkuCitJZiB0aGUKKy5GbCBoCitmbGFnIGlzIHNwZWNpZmllZCwgdGhlIGNhcGFjaXR5IGluZm9ybWF0aW9uIHdpbGwgYmUgZGlzcGxheWVkIHVzaW5nCisiaHVtYW4tcmVhZGFibGUiIHN1ZmZpeGVzLgorVGhlCisuRmwgaQorZmxhZyByZXF1ZXN0cyBkaXNwbGF5IG9mIGlub2RlIGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIGNhcGFjaXR5IGluZm9ybWF0aW9uLgorVGhpcyBjb21tYW5kIGlzIG9ubHkgc3VwcG9ydGVkIG9uIHNlcnZlcnMgdGhhdCBpbXBsZW1lbnQgdGhlCisuRHEgc3RhdHZmc0BvcGVuc3NoLmNvbQorZXh0ZW5zaW9uLgorLkl0IEljIGV4aXQKK1F1aXQKKy5ObSBzZnRwIC4KKy5JdCBYbyBJYyBnZXQKKy5PcCBGbCBQcHIKKy5BciByZW1vdGUtcGF0aAorLk9wIEFyIGxvY2FsLXBhdGgKKy5YYworUmV0cmlldmUgdGhlCisuQXIgcmVtb3RlLXBhdGgKK2FuZCBzdG9yZSBpdCBvbiB0aGUgbG9jYWwgbWFjaGluZS4KK0lmIHRoZSBsb2NhbAorcGF0aCBuYW1lIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGlzIGdpdmVuIHRoZSBzYW1lIG5hbWUgaXQgaGFzIG9uIHRoZQorcmVtb3RlIG1hY2hpbmUuCisuQXIgcmVtb3RlLXBhdGgKK21heSBjb250YWluCisuWHIgZ2xvYiAzCitjaGFyYWN0ZXJzIGFuZCBtYXkgbWF0Y2ggbXVsdGlwbGUgZmlsZXMuCitJZiBpdCBkb2VzIGFuZAorLkFyIGxvY2FsLXBhdGgKK2lzIHNwZWNpZmllZCwgdGhlbgorLkFyIGxvY2FsLXBhdGgKK211c3Qgc3BlY2lmeSBhIGRpcmVjdG9yeS4KKy5QcAorSWYgZWl0aGVyIHRoZQorLkZsIFAKK29yCisuRmwgcAorZmxhZyBpcyBzcGVjaWZpZWQsIHRoZW4gZnVsbCBmaWxlIHBlcm1pc3Npb25zIGFuZCBhY2Nlc3MgdGltZXMgYXJlCitjb3BpZWQgdG9vLgorLlBwCitJZiB0aGUKKy5GbCByCitmbGFnIGlzIHNwZWNpZmllZCB0aGVuIGRpcmVjdG9yaWVzIHdpbGwgYmUgY29waWVkIHJlY3Vyc2l2ZWx5LgorTm90ZSB0aGF0CisuTm0KK2RvZXMgbm90IGZvbGxvdyBzeW1ib2xpYyBsaW5rcyB3aGVuIHBlcmZvcm1pbmcgcmVjdXJzaXZlIHRyYW5zZmVycy4KKy5JdCBJYyBoZWxwCitEaXNwbGF5IGhlbHAgdGV4dC4KKy5JdCBJYyBsY2QgQXIgcGF0aAorQ2hhbmdlIGxvY2FsIGRpcmVjdG9yeSB0bworLkFyIHBhdGggLgorLkl0IEljIGxscyBPcCBBciBscy1vcHRpb25zIE9wIEFyIHBhdGgKK0Rpc3BsYXkgbG9jYWwgZGlyZWN0b3J5IGxpc3Rpbmcgb2YgZWl0aGVyCisuQXIgcGF0aAorb3IgY3VycmVudCBkaXJlY3RvcnkgaWYKKy5BciBwYXRoCitpcyBub3Qgc3BlY2lmaWVkLgorLkFyIGxzLW9wdGlvbnMKK21heSBjb250YWluIGFueSBmbGFncyBzdXBwb3J0ZWQgYnkgdGhlIGxvY2FsIHN5c3RlbSdzCisuWHIgbHMgMQorY29tbWFuZC4KKy5BciBwYXRoCittYXkgY29udGFpbgorLlhyIGdsb2IgMworY2hhcmFjdGVycyBhbmQgbWF5IG1hdGNoIG11bHRpcGxlIGZpbGVzLgorLkl0IEljIGxta2RpciBBciBwYXRoCitDcmVhdGUgbG9jYWwgZGlyZWN0b3J5IHNwZWNpZmllZCBieQorLkFyIHBhdGggLgorLkl0IFhvIEljIGxuCisuT3AgRmwgcworLkFyIG9sZHBhdGgKKy5BciBuZXdwYXRoCisuWGMKK0NyZWF0ZSBhIGxpbmsgZnJvbQorLkFyIG9sZHBhdGgKK3RvCisuQXIgbmV3cGF0aCAuCitJZiB0aGUKKy5GbCBzCitmbGFnIGlzIHNwZWNpZmllZCB0aGUgY3JlYXRlZCBsaW5rIGlzIGEgc3ltYm9saWMgbGluaywgb3RoZXJ3aXNlIGl0IGlzCithIGhhcmQgbGluay4KKy5JdCBJYyBscHdkCitQcmludCBsb2NhbCB3b3JraW5nIGRpcmVjdG9yeS4KKy5JdCBYbyBJYyBscworLk9wIEZsIDFhZmhsbnJTdAorLk9wIEFyIHBhdGgKKy5YYworRGlzcGxheSBhIHJlbW90ZSBkaXJlY3RvcnkgbGlzdGluZyBvZiBlaXRoZXIKKy5BciBwYXRoCitvciB0aGUgY3VycmVudCBkaXJlY3RvcnkgaWYKKy5BciBwYXRoCitpcyBub3Qgc3BlY2lmaWVkLgorLkFyIHBhdGgKK21heSBjb250YWluCisuWHIgZ2xvYiAzCitjaGFyYWN0ZXJzIGFuZCBtYXkgbWF0Y2ggbXVsdGlwbGUgZmlsZXMuCisuUHAKK1RoZSBmb2xsb3dpbmcgZmxhZ3MgYXJlIHJlY29nbml6ZWQgYW5kIGFsdGVyIHRoZSBiZWhhdmlvdXIgb2YKKy5JYyBscworYWNjb3JkaW5nbHk6CisuQmwgLXRhZyAtd2lkdGggRHMKKy5JdCBGbCAxCitQcm9kdWNlIHNpbmdsZSBjb2x1bW5hciBvdXRwdXQuCisuSXQgRmwgYQorTGlzdCBmaWxlcyBiZWdpbm5pbmcgd2l0aCBhIGRvdAorLlBxIFNxIFwmLiAuCisuSXQgRmwgZgorRG8gbm90IHNvcnQgdGhlIGxpc3RpbmcuCitUaGUgZGVmYXVsdCBzb3J0IG9yZGVyIGlzIGxleGljb2dyYXBoaWNhbC4KKy5JdCBGbCBoCitXaGVuIHVzZWQgd2l0aCBhIGxvbmcgZm9ybWF0IG9wdGlvbiwgdXNlIHVuaXQgc3VmZml4ZXM6IEJ5dGUsIEtpbG9ieXRlLAorTWVnYWJ5dGUsIEdpZ2FieXRlLCBUZXJhYnl0ZSwgUGV0YWJ5dGUsIGFuZCBFeGFieXRlIGluIG9yZGVyIHRvIHJlZHVjZQordGhlIG51bWJlciBvZiBkaWdpdHMgdG8gZm91ciBvciBmZXdlciB1c2luZyBwb3dlcnMgb2YgMiBmb3Igc2l6ZXMgKEs9MTAyNCwKK009MTA0ODU3NiwgZXRjLikuCisuSXQgRmwgbAorRGlzcGxheSBhZGRpdGlvbmFsIGRldGFpbHMgaW5jbHVkaW5nIHBlcm1pc3Npb25zCithbmQgb3duZXJzaGlwIGluZm9ybWF0aW9uLgorLkl0IEZsIG4KK1Byb2R1Y2UgYSBsb25nIGxpc3Rpbmcgd2l0aCB1c2VyIGFuZCBncm91cCBpbmZvcm1hdGlvbiBwcmVzZW50ZWQKK251bWVyaWNhbGx5LgorLkl0IEZsIHIKK1JldmVyc2UgdGhlIHNvcnQgb3JkZXIgb2YgdGhlIGxpc3RpbmcuCisuSXQgRmwgUworU29ydCB0aGUgbGlzdGluZyBieSBmaWxlIHNpemUuCisuSXQgRmwgdAorU29ydCB0aGUgbGlzdGluZyBieSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lLgorLkVsCisuSXQgSWMgbHVtYXNrIEFyIHVtYXNrCitTZXQgbG9jYWwgdW1hc2sgdG8KKy5BciB1bWFzayAuCisuSXQgSWMgbWtkaXIgQXIgcGF0aAorQ3JlYXRlIHJlbW90ZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5CisuQXIgcGF0aCAuCisuSXQgSWMgcHJvZ3Jlc3MKK1RvZ2dsZSBkaXNwbGF5IG9mIHByb2dyZXNzIG1ldGVyLgorLkl0IFhvIEljIHB1dAorLk9wIEZsIFBwcgorLkFyIGxvY2FsLXBhdGgKKy5PcCBBciByZW1vdGUtcGF0aAorLlhjCitVcGxvYWQKKy5BciBsb2NhbC1wYXRoCithbmQgc3RvcmUgaXQgb24gdGhlIHJlbW90ZSBtYWNoaW5lLgorSWYgdGhlIHJlbW90ZSBwYXRoIG5hbWUgaXMgbm90IHNwZWNpZmllZCwgaXQgaXMgZ2l2ZW4gdGhlIHNhbWUgbmFtZSBpdCBoYXMKK29uIHRoZSBsb2NhbCBtYWNoaW5lLgorLkFyIGxvY2FsLXBhdGgKK21heSBjb250YWluCisuWHIgZ2xvYiAzCitjaGFyYWN0ZXJzIGFuZCBtYXkgbWF0Y2ggbXVsdGlwbGUgZmlsZXMuCitJZiBpdCBkb2VzIGFuZAorLkFyIHJlbW90ZS1wYXRoCitpcyBzcGVjaWZpZWQsIHRoZW4KKy5BciByZW1vdGUtcGF0aAorbXVzdCBzcGVjaWZ5IGEgZGlyZWN0b3J5LgorLlBwCitJZiBlaXRoZXIgdGhlCisuRmwgUAorb3IKKy5GbCBwCitmbGFnIGlzIHNwZWNpZmllZCwgdGhlbiBmdWxsIGZpbGUgcGVybWlzc2lvbnMgYW5kIGFjY2VzcyB0aW1lcyBhcmUKK2NvcGllZCB0b28uCisuUHAKK0lmIHRoZQorLkZsIHIKK2ZsYWcgaXMgc3BlY2lmaWVkIHRoZW4gZGlyZWN0b3JpZXMgd2lsbCBiZSBjb3BpZWQgcmVjdXJzaXZlbHkuCitOb3RlIHRoYXQKKy5ObQorZG9lcyBub3QgZm9sbG93IHN5bWJvbGljIGxpbmtzIHdoZW4gcGVyZm9ybWluZyByZWN1cnNpdmUgdHJhbnNmZXJzLgorLkl0IEljIHB3ZAorRGlzcGxheSByZW1vdGUgd29ya2luZyBkaXJlY3RvcnkuCisuSXQgSWMgcXVpdAorUXVpdAorLk5tIHNmdHAgLgorLkl0IEljIHJlbmFtZSBBciBvbGRwYXRoIEFyIG5ld3BhdGgKK1JlbmFtZSByZW1vdGUgZmlsZSBmcm9tCisuQXIgb2xkcGF0aAordG8KKy5BciBuZXdwYXRoIC4KKy5JdCBJYyBybSBBciBwYXRoCitEZWxldGUgcmVtb3RlIGZpbGUgc3BlY2lmaWVkIGJ5CisuQXIgcGF0aCAuCisuSXQgSWMgcm1kaXIgQXIgcGF0aAorUmVtb3ZlIHJlbW90ZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5CisuQXIgcGF0aCAuCisuSXQgSWMgc3ltbGluayBBciBvbGRwYXRoIEFyIG5ld3BhdGgKK0NyZWF0ZSBhIHN5bWJvbGljIGxpbmsgZnJvbQorLkFyIG9sZHBhdGgKK3RvCisuQXIgbmV3cGF0aCAuCisuSXQgSWMgdmVyc2lvbgorRGlzcGxheSB0aGUKKy5ObQorcHJvdG9jb2wgdmVyc2lvbi4KKy5JdCBJYyBcJiEgTnMgQXIgY29tbWFuZAorRXhlY3V0ZQorLkFyIGNvbW1hbmQKK2luIGxvY2FsIHNoZWxsLgorLkl0IEljIFwmIQorRXNjYXBlIHRvIGxvY2FsIHNoZWxsLgorLkl0IEljIFwmPworU3lub255bSBmb3IgaGVscC4KKy5FbAorLlNoIFNFRSBBTFNPCisuWHIgZnRwIDEgLAorLlhyIGxzIDEgLAorLlhyIHNjcCAxICwKKy5YciBzc2ggMSAsCisuWHIgc3NoLWFkZCAxICwKKy5YciBzc2gta2V5Z2VuIDEgLAorLlhyIGdsb2IgMyAsCisuWHIgc3NoX2NvbmZpZyA1ICwKKy5YciBzZnRwLXNlcnZlciA4ICwKKy5YciBzc2hkIDgKKy5ScworLiVBIFQuIFlsb25lbgorLiVBIFMuIExlaHRpbmVuCisuJVQgIlNTSCBGaWxlIFRyYW5zZmVyIFByb3RvY29sIgorLiVOIGRyYWZ0LWlldGYtc2Vjc2gtZmlsZXhmZXItMDAudHh0CisuJUQgSmFudWFyeSAyMDAxCisuJU8gd29yayBpbiBwcm9ncmVzcyBtYXRlcmlhbAorLlJlCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NmdHAuYyBiL29wZW5zc2gtNi4wcDEvc2Z0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhN2ZiYWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NmdHAuYwpAQCAtMCwwICsxLDIyOTMgQEAKKy8qICRPcGVuQlNEOiBzZnRwLmMsdiAxLjEzNCAyMDExLzExLzE2IDEyOjI0OjI4IG9nYSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IERhbWllbiBNaWxsZXIgPGRqbUBvcGVuYnNkLm9yZz4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaWZkZWYgSEFWRV9TWVNfU1RBVFZGU19ICisjaW5jbHVkZSA8c3lzL3N0YXR2ZnMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaWZkZWYgSEFWRV9QQVRIU19ICisjIGluY2x1ZGUgPHBhdGhzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0xJQkdFTl9ICisjaW5jbHVkZSA8bGliZ2VuLmg+CisjZW5kaWYKKyNpZmRlZiBVU0VfTElCRURJVAorI2luY2x1ZGUgPGhpc3RlZGl0Lmg+CisjZWxzZQordHlwZWRlZiB2b2lkIEVkaXRMaW5lOworI2VuZGlmCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2lmZGVmIEhBVkVfVVRJTF9ICisjIGluY2x1ZGUgPHV0aWwuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9MSUJVVElMX0gKKyMgaW5jbHVkZSA8bGlidXRpbC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAicGF0aG5hbWVzLmgiCisjaW5jbHVkZSAibWlzYy5oIgorCisjaW5jbHVkZSAic2Z0cC5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgInNmdHAtY29tbW9uLmgiCisjaW5jbHVkZSAic2Z0cC1jbGllbnQuaCIKKworI2RlZmluZSBERUZBVUxUX0NPUFlfQlVGTEVOCTMyNzY4CS8qIFNpemUgb2YgYnVmZmVyIGZvciB1cC9kb3dubG9hZCAqLworI2RlZmluZSBERUZBVUxUX05VTV9SRVFVRVNUUwk2NAkvKiAjIGNvbmN1cnJlbnQgb3V0c3RhbmRpbmcgcmVxdWVzdHMgKi8KKworLyogRmlsZSB0byByZWFkIGNvbW1hbmRzIGZyb20gKi8KK0ZJTEUqIGluZmlsZTsKKworLyogQXJlIHdlIGluIGJhdGNoZmlsZSBtb2RlPyAqLworaW50IGJhdGNobW9kZSA9IDA7CisKKy8qIFBJRCBvZiBzc2ggdHJhbnNwb3J0IHByb2Nlc3MgKi8KK3N0YXRpYyBwaWRfdCBzc2hwaWQgPSAtMTsKKworLyogVGhpcyBpcyBzZXQgdG8gMCBpZiB0aGUgcHJvZ3Jlc3NtZXRlciBpcyBub3QgZGVzaXJlZC4gKi8KK2ludCBzaG93cHJvZ3Jlc3MgPSAxOworCisvKiBXaGVuIHRoaXMgb3B0aW9uIGlzIHNldCwgd2UgYWx3YXlzIHJlY3Vyc2l2ZWx5IGRvd25sb2FkL3VwbG9hZCBkaXJlY3RvcmllcyAqLworaW50IGdsb2JhbF9yZmxhZyA9IDA7CisKKy8qIFdoZW4gdGhpcyBvcHRpb24gaXMgc2V0LCB0aGUgZmlsZSB0cmFuc2ZlcnMgd2lsbCBhbHdheXMgcHJlc2VydmUgdGltZXMgKi8KK2ludCBnbG9iYWxfcGZsYWcgPSAwOworCisvKiBTSUdJTlQgcmVjZWl2ZWQgZHVyaW5nIGNvbW1hbmQgcHJvY2Vzc2luZyAqLwordm9sYXRpbGUgc2lnX2F0b21pY190IGludGVycnVwdGVkID0gMDsKKworLyogSSB3aXNoIHFzb3J0KCkgdG9vayBhIHNlcGFyYXRlIGN0eCBmb3IgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24uLi4qLworaW50IHNvcnRfZmxhZzsKKworLyogQ29udGV4dCB1c2VkIGZvciBjb21tYW5kbGluZSBjb21wbGV0aW9uICovCitzdHJ1Y3QgY29tcGxldGVfY3R4IHsKKwlzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uOworCWNoYXIgKipyZW1vdGVfcGF0aHA7Cit9OworCitpbnQgcmVtb3RlX2dsb2Ioc3RydWN0IHNmdHBfY29ubiAqLCBjb25zdCBjaGFyICosIGludCwKKyAgICBpbnQgKCopKGNvbnN0IGNoYXIgKiwgaW50KSwgZ2xvYl90ICopOyAvKiBwcm90byBmb3Igc2Z0cC1nbG9iLmMgKi8KKworZXh0ZXJuIGNoYXIgKl9fcHJvZ25hbWU7CisKKy8qIFNlcGFyYXRvcnMgZm9yIGludGVyYWN0aXZlIGNvbW1hbmRzICovCisjZGVmaW5lIFdISVRFU1BBQ0UgIiBcdFxyXG4iCisKKy8qIGxzIGZsYWdzICovCisjZGVmaW5lIExTX0xPTkdfVklFVwkweDAwMDEJLyogRnVsbCB2aWV3IGFsYSBscyAtbCAqLworI2RlZmluZSBMU19TSE9SVF9WSUVXCTB4MDAwMgkvKiBTaW5nbGUgcm93IHZpZXcgYWxhIGxzIC0xICovCisjZGVmaW5lIExTX05VTUVSSUNfVklFVwkweDAwMDQJLyogTG9uZyB2aWV3IHdpdGggbnVtZXJpYyB1aWQvZ2lkICovCisjZGVmaW5lIExTX05BTUVfU09SVAkweDAwMDgJLyogU29ydCBieSBuYW1lIChkZWZhdWx0KSAqLworI2RlZmluZSBMU19USU1FX1NPUlQJMHgwMDEwCS8qIFNvcnQgYnkgbXRpbWUgKi8KKyNkZWZpbmUgTFNfU0laRV9TT1JUCTB4MDAyMAkvKiBTb3J0IGJ5IGZpbGUgc2l6ZSAqLworI2RlZmluZSBMU19SRVZFUlNFX1NPUlQJMHgwMDQwCS8qIFJldmVyc2Ugc29ydCBvcmRlciAqLworI2RlZmluZSBMU19TSE9XX0FMTAkweDAwODAJLyogRG9uJ3Qgc2tpcCBmaWxlbmFtZXMgc3RhcnRpbmcgd2l0aCAnLicgKi8KKyNkZWZpbmUgTFNfU0lfVU5JVFMJMHgwMTAwCS8qIERpc3BsYXkgc2l6ZXMgYXMgSywgTSwgRywgZXRjLiAqLworCisjZGVmaW5lIFZJRVdfRkxBR1MJKExTX0xPTkdfVklFV3xMU19TSE9SVF9WSUVXfExTX05VTUVSSUNfVklFV3xMU19TSV9VTklUUykKKyNkZWZpbmUgU09SVF9GTEFHUwkoTFNfTkFNRV9TT1JUfExTX1RJTUVfU09SVHxMU19TSVpFX1NPUlQpCisKKy8qIENvbW1hbmRzIGZvciBpbnRlcmFjdGl2ZSBtb2RlICovCisjZGVmaW5lIElfQ0hESVIJCTEKKyNkZWZpbmUgSV9DSEdSUAkJMgorI2RlZmluZSBJX0NITU9ECQkzCisjZGVmaW5lIElfQ0hPV04JCTQKKyNkZWZpbmUgSV9ERgkJMjQKKyNkZWZpbmUgSV9HRVQJCTUKKyNkZWZpbmUgSV9IRUxQCQk2CisjZGVmaW5lIElfTENIRElSCTcKKyNkZWZpbmUgSV9MSU5LCQkyNQorI2RlZmluZSBJX0xMUwkJOAorI2RlZmluZSBJX0xNS0RJUgk5CisjZGVmaW5lIElfTFBXRAkJMTAKKyNkZWZpbmUgSV9MUwkJMTEKKyNkZWZpbmUgSV9MVU1BU0sJMTIKKyNkZWZpbmUgSV9NS0RJUgkJMTMKKyNkZWZpbmUgSV9QVVQJCTE0CisjZGVmaW5lIElfUFdECQkxNQorI2RlZmluZSBJX1FVSVQJCTE2CisjZGVmaW5lIElfUkVOQU1FCTE3CisjZGVmaW5lIElfUk0JCTE4CisjZGVmaW5lIElfUk1ESVIJCTE5CisjZGVmaW5lIElfU0hFTEwJCTIwCisjZGVmaW5lIElfU1lNTElOSwkyMQorI2RlZmluZSBJX1ZFUlNJT04JMjIKKyNkZWZpbmUgSV9QUk9HUkVTUwkyMworCitzdHJ1Y3QgQ01EIHsKKwljb25zdCBjaGFyICpjOworCWNvbnN0IGludCBuOworCWNvbnN0IGludCB0OworfTsKKworLyogVHlwZSBvZiBjb21wbGV0aW9uICovCisjZGVmaW5lIE5PQVJHUwkwCisjZGVmaW5lIFJFTU9URQkxCisjZGVmaW5lIExPQ0FMCTIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBDTUQgY21kc1tdID0geworCXsgImJ5ZSIsCUlfUVVJVCwJCU5PQVJHUwl9LAorCXsgImNkIiwJCUlfQ0hESVIsCVJFTU9URQl9LAorCXsgImNoZGlyIiwJSV9DSERJUiwJUkVNT1RFCX0sCisJeyAiY2hncnAiLAlJX0NIR1JQLAlSRU1PVEUJfSwKKwl7ICJjaG1vZCIsCUlfQ0hNT0QsCVJFTU9URQl9LAorCXsgImNob3duIiwJSV9DSE9XTiwJUkVNT1RFCX0sCisJeyAiZGYiLAkJSV9ERiwJCVJFTU9URQl9LAorCXsgImRpciIsCUlfTFMsCQlSRU1PVEUJfSwKKwl7ICJleGl0IiwJSV9RVUlULAkJTk9BUkdTCX0sCisJeyAiZ2V0IiwJSV9HRVQsCQlSRU1PVEUJfSwKKwl7ICJoZWxwIiwJSV9IRUxQLAkJTk9BUkdTCX0sCisJeyAibGNkIiwJSV9MQ0hESVIsCUxPQ0FMCX0sCisJeyAibGNoZGlyIiwJSV9MQ0hESVIsCUxPQ0FMCX0sCisJeyAibGxzIiwJSV9MTFMsCQlMT0NBTAl9LAorCXsgImxta2RpciIsCUlfTE1LRElSLAlMT0NBTAl9LAorCXsgImxuIiwJCUlfTElOSywJCVJFTU9URQl9LAorCXsgImxwd2QiLAlJX0xQV0QsCQlMT0NBTAl9LAorCXsgImxzIiwJCUlfTFMsCQlSRU1PVEUJfSwKKwl7ICJsdW1hc2siLAlJX0xVTUFTSywJTk9BUkdTCX0sCisJeyAibWtkaXIiLAlJX01LRElSLAlSRU1PVEUJfSwKKwl7ICJtZ2V0IiwJSV9HRVQsCQlSRU1PVEUJfSwKKwl7ICJtcHV0IiwJSV9QVVQsCQlMT0NBTAl9LAorCXsgInByb2dyZXNzIiwJSV9QUk9HUkVTUywJTk9BUkdTCX0sCisJeyAicHV0IiwJSV9QVVQsCQlMT0NBTAl9LAorCXsgInB3ZCIsCUlfUFdELAkJUkVNT1RFCX0sCisJeyAicXVpdCIsCUlfUVVJVCwJCU5PQVJHUwl9LAorCXsgInJlbmFtZSIsCUlfUkVOQU1FLAlSRU1PVEUJfSwKKwl7ICJybSIsCQlJX1JNLAkJUkVNT1RFCX0sCisJeyAicm1kaXIiLAlJX1JNRElSLAlSRU1PVEUJfSwKKwl7ICJzeW1saW5rIiwJSV9TWU1MSU5LLAlSRU1PVEUJfSwKKwl7ICJ2ZXJzaW9uIiwJSV9WRVJTSU9OLAlOT0FSR1MJfSwKKwl7ICIhIiwJCUlfU0hFTEwsCU5PQVJHUwl9LAorCXsgIj8iLAkJSV9IRUxQLAkJTk9BUkdTCX0sCisJeyBOVUxMLAkJLTEsCQktMQl9Cit9OworCitpbnQgaW50ZXJhY3RpdmVfbG9vcChzdHJ1Y3Qgc2Z0cF9jb25uICosIGNoYXIgKmZpbGUxLCBjaGFyICpmaWxlMik7CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAora2lsbGNoaWxkKGludCBzaWdubykKK3sKKwlpZiAoc3NocGlkID4gMSkgeworCQlraWxsKHNzaHBpZCwgU0lHVEVSTSk7CisJCXdhaXRwaWQoc3NocGlkLCBOVUxMLCAwKTsKKwl9CisKKwlfZXhpdCgxKTsKK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitjbWRfaW50ZXJydXB0KGludCBzaWdubykKK3sKKwljb25zdCBjaGFyIG1zZ1tdID0gIlxySW50ZXJydXB0ICBcbiI7CisJaW50IG9sZGVycm5vID0gZXJybm87CisKKwl3cml0ZShTVERFUlJfRklMRU5PLCBtc2csIHNpemVvZihtc2cpIC0gMSk7CisJaW50ZXJydXB0ZWQgPSAxOworCWVycm5vID0gb2xkZXJybm87Cit9CisKK3N0YXRpYyB2b2lkCitoZWxwKHZvaWQpCit7CisJcHJpbnRmKCJBdmFpbGFibGUgY29tbWFuZHM6XG4iCisJICAgICJieWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1aXQgc2Z0cFxuIgorCSAgICAiY2QgcGF0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2UgcmVtb3RlIGRpcmVjdG9yeSB0byAncGF0aCdcbiIKKwkgICAgImNoZ3JwIGdycCBwYXRoICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlIGdyb3VwIG9mIGZpbGUgJ3BhdGgnIHRvICdncnAnXG4iCisJICAgICJjaG1vZCBtb2RlIHBhdGggICAgICAgICAgICAgICAgICAgIENoYW5nZSBwZXJtaXNzaW9ucyBvZiBmaWxlICdwYXRoJyB0byAnbW9kZSdcbiIKKwkgICAgImNob3duIG93biBwYXRoICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlIG93bmVyIG9mIGZpbGUgJ3BhdGgnIHRvICdvd24nXG4iCisJICAgICJkZiBbLWhpXSBbcGF0aF0gICAgICAgICAgICAgICAgICAgIERpc3BsYXkgc3RhdGlzdGljcyBmb3IgY3VycmVudCBkaXJlY3Rvcnkgb3JcbiIKKwkgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXN5c3RlbSBjb250YWluaW5nICdwYXRoJ1xuIgorCSAgICAiZXhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWl0IHNmdHBcbiIKKwkgICAgImdldCBbLVBwcl0gcmVtb3RlIFtsb2NhbF0gICAgICAgICAgRG93bmxvYWQgZmlsZVxuIgorCSAgICAiaGVscCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgaGVscCB0ZXh0XG4iCisJICAgICJsY2QgcGF0aCAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZSBsb2NhbCBkaXJlY3RvcnkgdG8gJ3BhdGgnXG4iCisJICAgICJsbHMgW2xzLW9wdGlvbnMgW3BhdGhdXSAgICAgICAgICAgIERpc3BsYXkgbG9jYWwgZGlyZWN0b3J5IGxpc3RpbmdcbiIKKwkgICAgImxta2RpciBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlIGxvY2FsIGRpcmVjdG9yeVxuIgorCSAgICAibG4gWy1zXSBvbGRwYXRoIG5ld3BhdGggICAgICAgICAgICBMaW5rIHJlbW90ZSBmaWxlICgtcyBmb3Igc3ltbGluaylcbiIKKwkgICAgImxwd2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnQgbG9jYWwgd29ya2luZyBkaXJlY3RvcnlcbiIKKwkgICAgImxzIFstMWFmaGxuclN0XSBbcGF0aF0gICAgICAgICAgICAgRGlzcGxheSByZW1vdGUgZGlyZWN0b3J5IGxpc3RpbmdcbiIKKwkgICAgImx1bWFzayB1bWFzayAgICAgICAgICAgICAgICAgICAgICAgU2V0IGxvY2FsIHVtYXNrIHRvICd1bWFzaydcbiIKKwkgICAgIm1rZGlyIHBhdGggICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlIHJlbW90ZSBkaXJlY3RvcnlcbiIKKwkgICAgInByb2dyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9nZ2xlIGRpc3BsYXkgb2YgcHJvZ3Jlc3MgbWV0ZXJcbiIKKwkgICAgInB1dCBbLVBwcl0gbG9jYWwgW3JlbW90ZV0gICAgICAgICAgVXBsb2FkIGZpbGVcbiIKKwkgICAgInB3ZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSByZW1vdGUgd29ya2luZyBkaXJlY3RvcnlcbiIKKwkgICAgInF1aXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVpdCBzZnRwXG4iCisJICAgICJyZW5hbWUgb2xkcGF0aCBuZXdwYXRoICAgICAgICAgICAgIFJlbmFtZSByZW1vdGUgZmlsZVxuIgorCSAgICAicm0gcGF0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGUgcmVtb3RlIGZpbGVcbiIKKwkgICAgInJtZGlyIHBhdGggICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIHJlbW90ZSBkaXJlY3RvcnlcbiIKKwkgICAgInN5bWxpbmsgb2xkcGF0aCBuZXdwYXRoICAgICAgICAgICAgU3ltbGluayByZW1vdGUgZmlsZVxuIgorCSAgICAidmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93IFNGVFAgdmVyc2lvblxuIgorCSAgICAiIWNvbW1hbmQgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRlICdjb21tYW5kJyBpbiBsb2NhbCBzaGVsbFxuIgorCSAgICAiISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFc2NhcGUgdG8gbG9jYWwgc2hlbGxcbiIKKwkgICAgIj8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lub255bSBmb3IgaGVscFxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitsb2NhbF9kb19zaGVsbChjb25zdCBjaGFyICphcmdzKQoreworCWludCBzdGF0dXM7CisJY2hhciAqc2hlbGw7CisJcGlkX3QgcGlkOworCisJaWYgKCEqYXJncykKKwkJYXJncyA9IE5VTEw7CisKKwlpZiAoKHNoZWxsID0gZ2V0ZW52KCJTSEVMTCIpKSA9PSBOVUxMIHx8ICpzaGVsbCA9PSAnXDAnKQorCQlzaGVsbCA9IF9QQVRIX0JTSEVMTDsKKworCWlmICgocGlkID0gZm9yaygpKSA9PSAtMSkKKwkJZmF0YWwoIkNvdWxkbid0IGZvcms6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKworCWlmIChwaWQgPT0gMCkgeworCQkvKiBYWFg6IGNoaWxkIGhhcyBwaXBlIGZkcyB0byBzc2ggc3VicHJvYyBvcGVuIC0gaXNzdWU/ICovCisJCWlmIChhcmdzKSB7CisJCQlkZWJ1ZzMoIkV4ZWN1dGluZyAlcyAtYyBcIiVzXCIiLCBzaGVsbCwgYXJncyk7CisJCQlleGVjbChzaGVsbCwgc2hlbGwsICItYyIsIGFyZ3MsIChjaGFyICopTlVMTCk7CisJCX0gZWxzZSB7CisJCQlkZWJ1ZzMoIkV4ZWN1dGluZyAlcyIsIHNoZWxsKTsKKwkJCWV4ZWNsKHNoZWxsLCBzaGVsbCwgKGNoYXIgKilOVUxMKTsKKwkJfQorCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGV4ZWN1dGUgXCIlc1wiOiAlc1xuIiwgc2hlbGwsCisJCSAgICBzdHJlcnJvcihlcnJubykpOworCQlfZXhpdCgxKTsKKwl9CisJd2hpbGUgKHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKSA9PSAtMSkKKwkJaWYgKGVycm5vICE9IEVJTlRSKQorCQkJZmF0YWwoIkNvdWxkbid0IHdhaXQgZm9yIGNoaWxkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKCFXSUZFWElURUQoc3RhdHVzKSkKKwkJZXJyb3IoIlNoZWxsIGV4aXRlZCBhYm5vcm1hbGx5Iik7CisJZWxzZSBpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSkKKwkJZXJyb3IoIlNoZWxsIGV4aXRlZCB3aXRoIHN0YXR1cyAlZCIsIFdFWElUU1RBVFVTKHN0YXR1cykpOworfQorCitzdGF0aWMgdm9pZAorbG9jYWxfZG9fbHMoY29uc3QgY2hhciAqYXJncykKK3sKKwlpZiAoIWFyZ3MgfHwgISphcmdzKQorCQlsb2NhbF9kb19zaGVsbChfUEFUSF9MUyk7CisJZWxzZSB7CisJCWludCBsZW4gPSBzdHJsZW4oX1BBVEhfTFMgIiAiKSArIHN0cmxlbihhcmdzKSArIDE7CisJCWNoYXIgKmJ1ZiA9IHhtYWxsb2MobGVuKTsKKworCQkvKiBYWFg6IHF1b3RpbmcgLSByaXAgcXVvdGluZyBjb2RlIGZyb20gZnRwPyAqLworCQlzbnByaW50ZihidWYsIGxlbiwgX1BBVEhfTFMgIiAlcyIsIGFyZ3MpOworCQlsb2NhbF9kb19zaGVsbChidWYpOworCQl4ZnJlZShidWYpOworCX0KK30KKworLyogU3RyaXAgb25lIHBhdGggKHVzdWFsbHkgdGhlIHB3ZCkgZnJvbSB0aGUgc3RhcnQgb2YgYW5vdGhlciAqLworc3RhdGljIGNoYXIgKgorcGF0aF9zdHJpcChjaGFyICpwYXRoLCBjaGFyICpzdHJpcCkKK3sKKwlzaXplX3QgbGVuOworCisJaWYgKHN0cmlwID09IE5VTEwpCisJCXJldHVybiAoeHN0cmR1cChwYXRoKSk7CisKKwlsZW4gPSBzdHJsZW4oc3RyaXApOworCWlmIChzdHJuY21wKHBhdGgsIHN0cmlwLCBsZW4pID09IDApIHsKKwkJaWYgKHN0cmlwW2xlbiAtIDFdICE9ICcvJyAmJiBwYXRoW2xlbl0gPT0gJy8nKQorCQkJbGVuKys7CisJCXJldHVybiAoeHN0cmR1cChwYXRoICsgbGVuKSk7CisJfQorCisJcmV0dXJuICh4c3RyZHVwKHBhdGgpKTsKK30KKworc3RhdGljIGNoYXIgKgorbWFrZV9hYnNvbHV0ZShjaGFyICpwLCBjaGFyICpwd2QpCit7CisJY2hhciAqYWJzX3N0cjsKKworCS8qIERlcmVsYXRpdmlzZSAqLworCWlmIChwICYmIHBbMF0gIT0gJy8nKSB7CisJCWFic19zdHIgPSBwYXRoX2FwcGVuZChwd2QsIHApOworCQl4ZnJlZShwKTsKKwkJcmV0dXJuKGFic19zdHIpOworCX0gZWxzZQorCQlyZXR1cm4ocCk7Cit9CisKK3N0YXRpYyBpbnQKK3BhcnNlX2dldHB1dF9mbGFncyhjb25zdCBjaGFyICpjbWQsIGNoYXIgKiphcmd2LCBpbnQgYXJnYywgaW50ICpwZmxhZywKKyAgICBpbnQgKnJmbGFnKQoreworCWV4dGVybiBpbnQgb3B0ZXJyLCBvcHRpbmQsIG9wdG9wdCwgb3B0cmVzZXQ7CisJaW50IGNoOworCisJb3B0aW5kID0gb3B0cmVzZXQgPSAxOworCW9wdGVyciA9IDA7CisKKwkqcmZsYWcgPSAqcGZsYWcgPSAwOworCXdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgIlBwUnIiKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChjaCkgeworCQljYXNlICdwJzoKKwkJY2FzZSAnUCc6CisJCQkqcGZsYWcgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQljYXNlICdSJzoKKwkJCSpyZmxhZyA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVycm9yKCIlczogSW52YWxpZCBmbGFnIC0lYyIsIGNtZCwgb3B0b3B0KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJldHVybiBvcHRpbmQ7Cit9CisKK3N0YXRpYyBpbnQKK3BhcnNlX2xpbmtfZmxhZ3MoY29uc3QgY2hhciAqY21kLCBjaGFyICoqYXJndiwgaW50IGFyZ2MsIGludCAqc2ZsYWcpCit7CisJZXh0ZXJuIGludCBvcHRlcnIsIG9wdGluZCwgb3B0b3B0LCBvcHRyZXNldDsKKwlpbnQgY2g7CisKKwlvcHRpbmQgPSBvcHRyZXNldCA9IDE7CisJb3B0ZXJyID0gMDsKKworCSpzZmxhZyA9IDA7CisJd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAicyIpKSAhPSAtMSkgeworCQlzd2l0Y2ggKGNoKSB7CisJCWNhc2UgJ3MnOgorCQkJKnNmbGFnID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyb3IoIiVzOiBJbnZhbGlkIGZsYWcgLSVjIiwgY21kLCBvcHRvcHQpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJcmV0dXJuIG9wdGluZDsKK30KKworc3RhdGljIGludAorcGFyc2VfbHNfZmxhZ3MoY2hhciAqKmFyZ3YsIGludCBhcmdjLCBpbnQgKmxmbGFnKQoreworCWV4dGVybiBpbnQgb3B0ZXJyLCBvcHRpbmQsIG9wdG9wdCwgb3B0cmVzZXQ7CisJaW50IGNoOworCisJb3B0aW5kID0gb3B0cmVzZXQgPSAxOworCW9wdGVyciA9IDA7CisKKwkqbGZsYWcgPSBMU19OQU1FX1NPUlQ7CisJd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiMVNhZmhsbnJ0IikpICE9IC0xKSB7CisJCXN3aXRjaCAoY2gpIHsKKwkJY2FzZSAnMSc6CisJCQkqbGZsYWcgJj0gflZJRVdfRkxBR1M7CisJCQkqbGZsYWcgfD0gTFNfU0hPUlRfVklFVzsKKwkJCWJyZWFrOworCQljYXNlICdTJzoKKwkJCSpsZmxhZyAmPSB+U09SVF9GTEFHUzsKKwkJCSpsZmxhZyB8PSBMU19TSVpFX1NPUlQ7CisJCQlicmVhazsKKwkJY2FzZSAnYSc6CisJCQkqbGZsYWcgfD0gTFNfU0hPV19BTEw7CisJCQlicmVhazsKKwkJY2FzZSAnZic6CisJCQkqbGZsYWcgJj0gflNPUlRfRkxBR1M7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCQkqbGZsYWcgfD0gTFNfU0lfVU5JVFM7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQkqbGZsYWcgJj0gfkxTX1NIT1JUX1ZJRVc7CisJCQkqbGZsYWcgfD0gTFNfTE9OR19WSUVXOworCQkJYnJlYWs7CisJCWNhc2UgJ24nOgorCQkJKmxmbGFnICY9IH5MU19TSE9SVF9WSUVXOworCQkJKmxmbGFnIHw9IExTX05VTUVSSUNfVklFV3xMU19MT05HX1ZJRVc7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQkqbGZsYWcgfD0gTFNfUkVWRVJTRV9TT1JUOworCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJKmxmbGFnICY9IH5TT1JUX0ZMQUdTOworCQkJKmxmbGFnIHw9IExTX1RJTUVfU09SVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyb3IoImxzOiBJbnZhbGlkIGZsYWcgLSVjIiwgb3B0b3B0KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJldHVybiBvcHRpbmQ7Cit9CisKK3N0YXRpYyBpbnQKK3BhcnNlX2RmX2ZsYWdzKGNvbnN0IGNoYXIgKmNtZCwgY2hhciAqKmFyZ3YsIGludCBhcmdjLCBpbnQgKmhmbGFnLCBpbnQgKmlmbGFnKQoreworCWV4dGVybiBpbnQgb3B0ZXJyLCBvcHRpbmQsIG9wdG9wdCwgb3B0cmVzZXQ7CisJaW50IGNoOworCisJb3B0aW5kID0gb3B0cmVzZXQgPSAxOworCW9wdGVyciA9IDA7CisKKwkqaGZsYWcgPSAqaWZsYWcgPSAwOworCXdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgImhpIikpICE9IC0xKSB7CisJCXN3aXRjaCAoY2gpIHsKKwkJY2FzZSAnaCc6CisJCQkqaGZsYWcgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2knOgorCQkJKmlmbGFnID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyb3IoIiVzOiBJbnZhbGlkIGZsYWcgLSVjIiwgY21kLCBvcHRvcHQpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJcmV0dXJuIG9wdGluZDsKK30KKworc3RhdGljIGludAoraXNfZGlyKGNoYXIgKnBhdGgpCit7CisJc3RydWN0IHN0YXQgc2I7CisKKwkvKiBYWFg6IHJlcG9ydCBlcnJvcnM/ICovCisJaWYgKHN0YXQocGF0aCwgJnNiKSA9PSAtMSkKKwkJcmV0dXJuKDApOworCisJcmV0dXJuKFNfSVNESVIoc2Iuc3RfbW9kZSkpOworfQorCitzdGF0aWMgaW50CityZW1vdGVfaXNfZGlyKHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIGNoYXIgKnBhdGgpCit7CisJQXR0cmliICphOworCisJLyogWFhYOiByZXBvcnQgZXJyb3JzPyAqLworCWlmICgoYSA9IGRvX3N0YXQoY29ubiwgcGF0aCwgMSkpID09IE5VTEwpCisJCXJldHVybigwKTsKKwlpZiAoIShhLT5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9QRVJNSVNTSU9OUykpCisJCXJldHVybigwKTsKKwlyZXR1cm4oU19JU0RJUihhLT5wZXJtKSk7Cit9CisKKy8qIENoZWNrIHdoZXRoZXIgcGF0aCByZXR1cm5lZCBmcm9tIGdsb2IoLi4uLCBHTE9CX01BUkssIC4uLikgaXMgYSBkaXJlY3RvcnkgKi8KK3N0YXRpYyBpbnQKK3BhdGhuYW1lX2lzX2RpcihjaGFyICpwYXRobmFtZSkKK3sKKwlzaXplX3QgbCA9IHN0cmxlbihwYXRobmFtZSk7CisKKwlyZXR1cm4gbCA+IDAgJiYgcGF0aG5hbWVbbCAtIDFdID09ICcvJzsKK30KKworc3RhdGljIGludAorcHJvY2Vzc19nZXQoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgY2hhciAqc3JjLCBjaGFyICpkc3QsIGNoYXIgKnB3ZCwKKyAgICBpbnQgcGZsYWcsIGludCByZmxhZykKK3sKKwljaGFyICphYnNfc3JjID0gTlVMTDsKKwljaGFyICphYnNfZHN0ID0gTlVMTDsKKwlnbG9iX3QgZzsKKwljaGFyICpmaWxlbmFtZSwgKnRtcD1OVUxMOworCWludCBpLCBlcnIgPSAwOworCisJYWJzX3NyYyA9IHhzdHJkdXAoc3JjKTsKKwlhYnNfc3JjID0gbWFrZV9hYnNvbHV0ZShhYnNfc3JjLCBwd2QpOworCW1lbXNldCgmZywgMCwgc2l6ZW9mKGcpKTsKKworCWRlYnVnMygiTG9va2luZyB1cCAlcyIsIGFic19zcmMpOworCWlmIChyZW1vdGVfZ2xvYihjb25uLCBhYnNfc3JjLCBHTE9CX01BUkssIE5VTEwsICZnKSkgeworCQllcnJvcigiRmlsZSBcIiVzXCIgbm90IGZvdW5kLiIsIGFic19zcmMpOworCQllcnIgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBJZiBtdWx0aXBsZSBtYXRjaGVzIHRoZW4gZHN0IG11c3QgYmUgYSBkaXJlY3Rvcnkgb3IKKwkgKiB1bnNwZWNpZmllZC4KKwkgKi8KKwlpZiAoZy5nbF9tYXRjaGMgPiAxICYmIGRzdCAhPSBOVUxMICYmICFpc19kaXIoZHN0KSkgeworCQllcnJvcigiTXVsdGlwbGUgc291cmNlIHBhdGhzLCBidXQgZGVzdGluYXRpb24gIgorCQkgICAgIlwiJXNcIiBpcyBub3QgYSBkaXJlY3RvcnkiLCBkc3QpOworCQllcnIgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgZy5nbF9wYXRodltpXSAmJiAhaW50ZXJydXB0ZWQ7IGkrKykgeworCQl0bXAgPSB4c3RyZHVwKGcuZ2xfcGF0aHZbaV0pOworCQlpZiAoKGZpbGVuYW1lID0gYmFzZW5hbWUodG1wKSkgPT0gTlVMTCkgeworCQkJZXJyb3IoImJhc2VuYW1lICVzOiAlcyIsIHRtcCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXhmcmVlKHRtcCk7CisJCQllcnIgPSAtMTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGcuZ2xfbWF0Y2hjID09IDEgJiYgZHN0KSB7CisJCQlpZiAoaXNfZGlyKGRzdCkpIHsKKwkJCQlhYnNfZHN0ID0gcGF0aF9hcHBlbmQoZHN0LCBmaWxlbmFtZSk7CisJCQl9IGVsc2UgeworCQkJCWFic19kc3QgPSB4c3RyZHVwKGRzdCk7CisJCQl9CisJCX0gZWxzZSBpZiAoZHN0KSB7CisJCQlhYnNfZHN0ID0gcGF0aF9hcHBlbmQoZHN0LCBmaWxlbmFtZSk7CisJCX0gZWxzZSB7CisJCQlhYnNfZHN0ID0geHN0cmR1cChmaWxlbmFtZSk7CisJCX0KKwkJeGZyZWUodG1wKTsKKworCQlwcmludGYoIkZldGNoaW5nICVzIHRvICVzXG4iLCBnLmdsX3BhdGh2W2ldLCBhYnNfZHN0KTsKKwkJaWYgKHBhdGhuYW1lX2lzX2RpcihnLmdsX3BhdGh2W2ldKSAmJiAocmZsYWcgfHwgZ2xvYmFsX3JmbGFnKSkgeworCQkJaWYgKGRvd25sb2FkX2Rpcihjb25uLCBnLmdsX3BhdGh2W2ldLCBhYnNfZHN0LCBOVUxMLCAKKwkJCSAgICBwZmxhZyB8fCBnbG9iYWxfcGZsYWcsIDEpID09IC0xKQorCQkJCWVyciA9IC0xOworCQl9IGVsc2UgeworCQkJaWYgKGRvX2Rvd25sb2FkKGNvbm4sIGcuZ2xfcGF0aHZbaV0sIGFic19kc3QsIE5VTEwsCisJCQkgICAgcGZsYWcgfHwgZ2xvYmFsX3BmbGFnKSA9PSAtMSkKKwkJCQllcnIgPSAtMTsKKwkJfQorCQl4ZnJlZShhYnNfZHN0KTsKKwkJYWJzX2RzdCA9IE5VTEw7CisJfQorCitvdXQ6CisJeGZyZWUoYWJzX3NyYyk7CisJZ2xvYmZyZWUoJmcpOworCXJldHVybihlcnIpOworfQorCitzdGF0aWMgaW50Citwcm9jZXNzX3B1dChzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpzcmMsIGNoYXIgKmRzdCwgY2hhciAqcHdkLAorICAgIGludCBwZmxhZywgaW50IHJmbGFnKQoreworCWNoYXIgKnRtcF9kc3QgPSBOVUxMOworCWNoYXIgKmFic19kc3QgPSBOVUxMOworCWNoYXIgKnRtcCA9IE5VTEwsICpmaWxlbmFtZSA9IE5VTEw7CisJZ2xvYl90IGc7CisJaW50IGVyciA9IDA7CisJaW50IGksIGRzdF9pc19kaXIgPSAxOworCXN0cnVjdCBzdGF0IHNiOworCisJaWYgKGRzdCkgeworCQl0bXBfZHN0ID0geHN0cmR1cChkc3QpOworCQl0bXBfZHN0ID0gbWFrZV9hYnNvbHV0ZSh0bXBfZHN0LCBwd2QpOworCX0KKworCW1lbXNldCgmZywgMCwgc2l6ZW9mKGcpKTsKKwlkZWJ1ZzMoIkxvb2tpbmcgdXAgJXMiLCBzcmMpOworCWlmIChnbG9iKHNyYywgR0xPQl9OT0NIRUNLIHwgR0xPQl9NQVJLLCBOVUxMLCAmZykpIHsKKwkJZXJyb3IoIkZpbGUgXCIlc1wiIG5vdCBmb3VuZC4iLCBzcmMpOworCQllcnIgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogSWYgd2UgYXJlbid0IGZldGNoaW5nIHRvIHB3ZCB0aGVuIHN0YXNoIHRoaXMgc3RhdHVzIGZvciBsYXRlciAqLworCWlmICh0bXBfZHN0ICE9IE5VTEwpCisJCWRzdF9pc19kaXIgPSByZW1vdGVfaXNfZGlyKGNvbm4sIHRtcF9kc3QpOworCisJLyogSWYgbXVsdGlwbGUgbWF0Y2hlcywgZHN0IG1heSBiZSBkaXJlY3Rvcnkgb3IgdW5zcGVjaWZpZWQgKi8KKwlpZiAoZy5nbF9tYXRjaGMgPiAxICYmIHRtcF9kc3QgJiYgIWRzdF9pc19kaXIpIHsKKwkJZXJyb3IoIk11bHRpcGxlIHBhdGhzIG1hdGNoLCBidXQgZGVzdGluYXRpb24gIgorCQkgICAgIlwiJXNcIiBpcyBub3QgYSBkaXJlY3RvcnkiLCB0bXBfZHN0KTsKKwkJZXJyID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCWZvciAoaSA9IDA7IGcuZ2xfcGF0aHZbaV0gJiYgIWludGVycnVwdGVkOyBpKyspIHsKKwkJaWYgKHN0YXQoZy5nbF9wYXRodltpXSwgJnNiKSA9PSAtMSkgeworCQkJZXJyID0gLTE7CisJCQllcnJvcigic3RhdCAlczogJXMiLCBnLmdsX3BhdGh2W2ldLCBzdHJlcnJvcihlcnJubykpOworCQkJY29udGludWU7CisJCX0KKwkJCisJCXRtcCA9IHhzdHJkdXAoZy5nbF9wYXRodltpXSk7CisJCWlmICgoZmlsZW5hbWUgPSBiYXNlbmFtZSh0bXApKSA9PSBOVUxMKSB7CisJCQllcnJvcigiYmFzZW5hbWUgJXM6ICVzIiwgdG1wLCBzdHJlcnJvcihlcnJubykpOworCQkJeGZyZWUodG1wKTsKKwkJCWVyciA9IC0xOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoZy5nbF9tYXRjaGMgPT0gMSAmJiB0bXBfZHN0KSB7CisJCQkvKiBJZiBkaXJlY3Rvcnkgc3BlY2lmaWVkLCBhcHBlbmQgZmlsZW5hbWUgKi8KKwkJCWlmIChkc3RfaXNfZGlyKQorCQkJCWFic19kc3QgPSBwYXRoX2FwcGVuZCh0bXBfZHN0LCBmaWxlbmFtZSk7CisJCQllbHNlCisJCQkJYWJzX2RzdCA9IHhzdHJkdXAodG1wX2RzdCk7CisJCX0gZWxzZSBpZiAodG1wX2RzdCkgeworCQkJYWJzX2RzdCA9IHBhdGhfYXBwZW5kKHRtcF9kc3QsIGZpbGVuYW1lKTsKKwkJfSBlbHNlIHsKKwkJCWFic19kc3QgPSBtYWtlX2Fic29sdXRlKHhzdHJkdXAoZmlsZW5hbWUpLCBwd2QpOworCQl9CisJCXhmcmVlKHRtcCk7CisKKwkJcHJpbnRmKCJVcGxvYWRpbmcgJXMgdG8gJXNcbiIsIGcuZ2xfcGF0aHZbaV0sIGFic19kc3QpOworCQlpZiAocGF0aG5hbWVfaXNfZGlyKGcuZ2xfcGF0aHZbaV0pICYmIChyZmxhZyB8fCBnbG9iYWxfcmZsYWcpKSB7CisJCQlpZiAodXBsb2FkX2Rpcihjb25uLCBnLmdsX3BhdGh2W2ldLCBhYnNfZHN0LAorCQkJICAgIHBmbGFnIHx8IGdsb2JhbF9wZmxhZywgMSkgPT0gLTEpCisJCQkJZXJyID0gLTE7CisJCX0gZWxzZSB7CisJCQlpZiAoZG9fdXBsb2FkKGNvbm4sIGcuZ2xfcGF0aHZbaV0sIGFic19kc3QsCisJCQkgICAgcGZsYWcgfHwgZ2xvYmFsX3BmbGFnKSA9PSAtMSkKKwkJCQllcnIgPSAtMTsKKwkJfQorCX0KKworb3V0OgorCWlmIChhYnNfZHN0KQorCQl4ZnJlZShhYnNfZHN0KTsKKwlpZiAodG1wX2RzdCkKKwkJeGZyZWUodG1wX2RzdCk7CisJZ2xvYmZyZWUoJmcpOworCXJldHVybihlcnIpOworfQorCitzdGF0aWMgaW50CitzZGlyZW50X2NvbXAoY29uc3Qgdm9pZCAqYWEsIGNvbnN0IHZvaWQgKmJiKQoreworCVNGVFBfRElSRU5UICphID0gKihTRlRQX0RJUkVOVCAqKilhYTsKKwlTRlRQX0RJUkVOVCAqYiA9ICooU0ZUUF9ESVJFTlQgKiopYmI7CisJaW50IHJtdWwgPSBzb3J0X2ZsYWcgJiBMU19SRVZFUlNFX1NPUlQgPyAtMSA6IDE7CisKKyNkZWZpbmUgTkNNUChhLGIpIChhID09IGIgPyAwIDogKGEgPCBiID8gMSA6IC0xKSkKKwlpZiAoc29ydF9mbGFnICYgTFNfTkFNRV9TT1JUKQorCQlyZXR1cm4gKHJtdWwgKiBzdHJjbXAoYS0+ZmlsZW5hbWUsIGItPmZpbGVuYW1lKSk7CisJZWxzZSBpZiAoc29ydF9mbGFnICYgTFNfVElNRV9TT1JUKQorCQlyZXR1cm4gKHJtdWwgKiBOQ01QKGEtPmEubXRpbWUsIGItPmEubXRpbWUpKTsKKwllbHNlIGlmIChzb3J0X2ZsYWcgJiBMU19TSVpFX1NPUlQpCisJCXJldHVybiAocm11bCAqIE5DTVAoYS0+YS5zaXplLCBiLT5hLnNpemUpKTsKKworCWZhdGFsKCJVbmtub3duIGxzIHNvcnQgdHlwZSIpOworfQorCisvKiBzZnRwIGxzLjEgcmVwbGFjZW1lbnQgZm9yIGRpcmVjdG9yaWVzICovCitzdGF0aWMgaW50Citkb19sc19kaXIoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgY2hhciAqcGF0aCwgY2hhciAqc3RyaXBfcGF0aCwgaW50IGxmbGFnKQoreworCWludCBuOworCXVfaW50IGMgPSAxLCBjb2xzcGFjZSA9IDAsIGNvbHVtbnMgPSAxOworCVNGVFBfRElSRU5UICoqZDsKKworCWlmICgobiA9IGRvX3JlYWRkaXIoY29ubiwgcGF0aCwgJmQpKSAhPSAwKQorCQlyZXR1cm4gKG4pOworCisJaWYgKCEobGZsYWcgJiBMU19TSE9SVF9WSUVXKSkgeworCQl1X2ludCBtID0gMCwgd2lkdGggPSA4MDsKKwkJc3RydWN0IHdpbnNpemUgd3M7CisJCWNoYXIgKnRtcDsKKworCQkvKiBDb3VudCBlbnRyaWVzIGZvciBzb3J0IGFuZCBmaW5kIGxvbmdlc3QgZmlsZW5hbWUgKi8KKwkJZm9yIChuID0gMDsgZFtuXSAhPSBOVUxMOyBuKyspIHsKKwkJCWlmIChkW25dLT5maWxlbmFtZVswXSAhPSAnLicgfHwgKGxmbGFnICYgTFNfU0hPV19BTEwpKQorCQkJCW0gPSBNQVgobSwgc3RybGVuKGRbbl0tPmZpbGVuYW1lKSk7CisJCX0KKworCQkvKiBBZGQgYW55IHN1YnBhdGggdGhhdCBhbHNvIG5lZWRzIHRvIGJlIGNvdW50ZWQgKi8KKwkJdG1wID0gcGF0aF9zdHJpcChwYXRoLCBzdHJpcF9wYXRoKTsKKwkJbSArPSBzdHJsZW4odG1wKTsKKwkJeGZyZWUodG1wKTsKKworCQlpZiAoaW9jdGwoZmlsZW5vKHN0ZGluKSwgVElPQ0dXSU5TWiwgJndzKSAhPSAtMSkKKwkJCXdpZHRoID0gd3Mud3NfY29sOworCisJCWNvbHVtbnMgPSB3aWR0aCAvIChtICsgMik7CisJCWNvbHVtbnMgPSBNQVgoY29sdW1ucywgMSk7CisJCWNvbHNwYWNlID0gd2lkdGggLyBjb2x1bW5zOworCQljb2xzcGFjZSA9IE1JTihjb2xzcGFjZSwgd2lkdGgpOworCX0KKworCWlmIChsZmxhZyAmIFNPUlRfRkxBR1MpIHsKKwkJZm9yIChuID0gMDsgZFtuXSAhPSBOVUxMOyBuKyspCisJCQk7CS8qIGNvdW50IGVudHJpZXMgKi8KKwkJc29ydF9mbGFnID0gbGZsYWcgJiAoU09SVF9GTEFHU3xMU19SRVZFUlNFX1NPUlQpOworCQlxc29ydChkLCBuLCBzaXplb2YoKmQpLCBzZGlyZW50X2NvbXApOworCX0KKworCWZvciAobiA9IDA7IGRbbl0gIT0gTlVMTCAmJiAhaW50ZXJydXB0ZWQ7IG4rKykgeworCQljaGFyICp0bXAsICpmbmFtZTsKKworCQlpZiAoZFtuXS0+ZmlsZW5hbWVbMF0gPT0gJy4nICYmICEobGZsYWcgJiBMU19TSE9XX0FMTCkpCisJCQljb250aW51ZTsKKworCQl0bXAgPSBwYXRoX2FwcGVuZChwYXRoLCBkW25dLT5maWxlbmFtZSk7CisJCWZuYW1lID0gcGF0aF9zdHJpcCh0bXAsIHN0cmlwX3BhdGgpOworCQl4ZnJlZSh0bXApOworCisJCWlmIChsZmxhZyAmIExTX0xPTkdfVklFVykgeworCQkJaWYgKGxmbGFnICYgKExTX05VTUVSSUNfVklFV3xMU19TSV9VTklUUykpIHsKKwkJCQljaGFyICpsbmFtZTsKKwkJCQlzdHJ1Y3Qgc3RhdCBzYjsKKworCQkJCW1lbXNldCgmc2IsIDAsIHNpemVvZihzYikpOworCQkJCWF0dHJpYl90b19zdGF0KCZkW25dLT5hLCAmc2IpOworCQkJCWxuYW1lID0gbHNfZmlsZShmbmFtZSwgJnNiLCAxLAorCQkJCSAgICAobGZsYWcgJiBMU19TSV9VTklUUykpOworCQkJCXByaW50ZigiJXNcbiIsIGxuYW1lKTsKKwkJCQl4ZnJlZShsbmFtZSk7CisJCQl9IGVsc2UKKwkJCQlwcmludGYoIiVzXG4iLCBkW25dLT5sb25nbmFtZSk7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIiUtKnMiLCBjb2xzcGFjZSwgZm5hbWUpOworCQkJaWYgKGMgPj0gY29sdW1ucykgeworCQkJCXByaW50ZigiXG4iKTsKKwkJCQljID0gMTsKKwkJCX0gZWxzZQorCQkJCWMrKzsKKwkJfQorCisJCXhmcmVlKGZuYW1lKTsKKwl9CisKKwlpZiAoIShsZmxhZyAmIExTX0xPTkdfVklFVykgJiYgKGMgIT0gMSkpCisJCXByaW50ZigiXG4iKTsKKworCWZyZWVfc2Z0cF9kaXJlbnRzKGQpOworCXJldHVybiAoMCk7Cit9CisKKy8qIHNmdHAgbHMuMSByZXBsYWNlbWVudCB3aGljaCBoYW5kbGVzIHBhdGggZ2xvYnMgKi8KK3N0YXRpYyBpbnQKK2RvX2dsb2JiZWRfbHMoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgY2hhciAqcGF0aCwgY2hhciAqc3RyaXBfcGF0aCwKKyAgICBpbnQgbGZsYWcpCit7CisJQXR0cmliICphID0gTlVMTDsKKwljaGFyICpmbmFtZSwgKmxuYW1lOworCWdsb2JfdCBnOworCWludCBlcnI7CisJc3RydWN0IHdpbnNpemUgd3M7CisJdV9pbnQgaSwgYyA9IDEsIGNvbHNwYWNlID0gMCwgY29sdW1ucyA9IDEsIG0gPSAwLCB3aWR0aCA9IDgwOworCisJbWVtc2V0KCZnLCAwLCBzaXplb2YoZykpOworCisJaWYgKHJlbW90ZV9nbG9iKGNvbm4sIHBhdGgsCisJICAgIEdMT0JfTUFSS3xHTE9CX05PQ0hFQ0t8R0xPQl9CUkFDRXxHTE9CX0tFRVBTVEFUfEdMT0JfTk9TT1JULAorCSAgICBOVUxMLCAmZykgfHwKKwkgICAgKGcuZ2xfcGF0aGMgJiYgIWcuZ2xfbWF0Y2hjKSkgeworCQlpZiAoZy5nbF9wYXRoYykKKwkJCWdsb2JmcmVlKCZnKTsKKwkJZXJyb3IoIkNhbid0IGxzOiBcIiVzXCIgbm90IGZvdW5kIiwgcGF0aCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoaW50ZXJydXB0ZWQpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBJZiB0aGUgZ2xvYiByZXR1cm5zIGEgc2luZ2xlIG1hdGNoIGFuZCBpdCBpcyBhIGRpcmVjdG9yeSwKKwkgKiB0aGVuIGp1c3QgbGlzdCBpdHMgY29udGVudHMuCisJICovCisJaWYgKGcuZ2xfbWF0Y2hjID09IDEgJiYgZy5nbF9zdGF0dlswXSAhPSBOVUxMICYmCisJICAgIFNfSVNESVIoZy5nbF9zdGF0dlswXS0+c3RfbW9kZSkpIHsKKwkJZXJyID0gZG9fbHNfZGlyKGNvbm4sIGcuZ2xfcGF0aHZbMF0sIHN0cmlwX3BhdGgsIGxmbGFnKTsKKwkJZ2xvYmZyZWUoJmcpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChpb2N0bChmaWxlbm8oc3RkaW4pLCBUSU9DR1dJTlNaLCAmd3MpICE9IC0xKQorCQl3aWR0aCA9IHdzLndzX2NvbDsKKworCWlmICghKGxmbGFnICYgTFNfU0hPUlRfVklFVykpIHsKKwkJLyogQ291bnQgZW50cmllcyBmb3Igc29ydCBhbmQgZmluZCBsb25nZXN0IGZpbGVuYW1lICovCisJCWZvciAoaSA9IDA7IGcuZ2xfcGF0aHZbaV07IGkrKykKKwkJCW0gPSBNQVgobSwgc3RybGVuKGcuZ2xfcGF0aHZbaV0pKTsKKworCQljb2x1bW5zID0gd2lkdGggLyAobSArIDIpOworCQljb2x1bW5zID0gTUFYKGNvbHVtbnMsIDEpOworCQljb2xzcGFjZSA9IHdpZHRoIC8gY29sdW1uczsKKwl9CisKKwlmb3IgKGkgPSAwOyBnLmdsX3BhdGh2W2ldICYmICFpbnRlcnJ1cHRlZDsgaSsrLCBhID0gTlVMTCkgeworCQlmbmFtZSA9IHBhdGhfc3RyaXAoZy5nbF9wYXRodltpXSwgc3RyaXBfcGF0aCk7CisJCWlmIChsZmxhZyAmIExTX0xPTkdfVklFVykgeworCQkJaWYgKGcuZ2xfc3RhdHZbaV0gPT0gTlVMTCkgeworCQkJCWVycm9yKCJubyBzdGF0IGluZm9ybWF0aW9uIGZvciAlcyIsIGZuYW1lKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWxuYW1lID0gbHNfZmlsZShmbmFtZSwgZy5nbF9zdGF0dltpXSwgMSwKKwkJCSAgICAobGZsYWcgJiBMU19TSV9VTklUUykpOworCQkJcHJpbnRmKCIlc1xuIiwgbG5hbWUpOworCQkJeGZyZWUobG5hbWUpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCIlLSpzIiwgY29sc3BhY2UsIGZuYW1lKTsKKwkJCWlmIChjID49IGNvbHVtbnMpIHsKKwkJCQlwcmludGYoIlxuIik7CisJCQkJYyA9IDE7CisJCQl9IGVsc2UKKwkJCQljKys7CisJCX0KKwkJeGZyZWUoZm5hbWUpOworCX0KKworCWlmICghKGxmbGFnICYgTFNfTE9OR19WSUVXKSAmJiAoYyAhPSAxKSkKKwkJcHJpbnRmKCJcbiIpOworCisgb3V0OgorCWlmIChnLmdsX3BhdGhjKQorCQlnbG9iZnJlZSgmZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZG9fZGYoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgY2hhciAqcGF0aCwgaW50IGhmbGFnLCBpbnQgaWZsYWcpCit7CisJc3RydWN0IHNmdHBfc3RhdHZmcyBzdDsKKwljaGFyIHNfdXNlZFtGTVRfU0NBTEVEX1NUUlNJWkVdOworCWNoYXIgc19hdmFpbFtGTVRfU0NBTEVEX1NUUlNJWkVdOworCWNoYXIgc19yb290W0ZNVF9TQ0FMRURfU1RSU0laRV07CisJY2hhciBzX3RvdGFsW0ZNVF9TQ0FMRURfU1RSU0laRV07CisJdW5zaWduZWQgbG9uZyBsb25nIGZmcmVlOworCisJaWYgKGRvX3N0YXR2ZnMoY29ubiwgcGF0aCwgJnN0LCAxKSA9PSAtMSkKKwkJcmV0dXJuIC0xOworCWlmIChpZmxhZykgeworCQlmZnJlZSA9IHN0LmZfZmlsZXMgPyAoMTAwICogKHN0LmZfZmlsZXMgLSBzdC5mX2ZmcmVlKSAvIHN0LmZfZmlsZXMpIDogMDsKKwkJcHJpbnRmKCIgICAgIElub2RlcyAgICAgICAgVXNlZCAgICAgICBBdmFpbCAgICAgICIKKwkJICAgICIocm9vdCkgICAgJSVDYXBhY2l0eVxuIik7CisJCXByaW50ZigiJTExbGx1ICUxMWxsdSAlMTFsbHUgJTExbGx1ICAgICAgICAgJTNsbHUlJVxuIiwKKwkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc3QuZl9maWxlcywKKwkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKHN0LmZfZmlsZXMgLSBzdC5mX2ZmcmVlKSwKKwkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc3QuZl9mYXZhaWwsCisJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXN0LmZfZmZyZWUsIGZmcmVlKTsKKwl9IGVsc2UgaWYgKGhmbGFnKSB7CisJCXN0cmxjcHkoc191c2VkLCAiZXJyb3IiLCBzaXplb2Yoc191c2VkKSk7CisJCXN0cmxjcHkoc19hdmFpbCwgImVycm9yIiwgc2l6ZW9mKHNfYXZhaWwpKTsKKwkJc3RybGNweShzX3Jvb3QsICJlcnJvciIsIHNpemVvZihzX3Jvb3QpKTsKKwkJc3RybGNweShzX3RvdGFsLCAiZXJyb3IiLCBzaXplb2Yoc190b3RhbCkpOworCQlmbXRfc2NhbGVkKChzdC5mX2Jsb2NrcyAtIHN0LmZfYmZyZWUpICogc3QuZl9mcnNpemUsIHNfdXNlZCk7CisJCWZtdF9zY2FsZWQoc3QuZl9iYXZhaWwgKiBzdC5mX2Zyc2l6ZSwgc19hdmFpbCk7CisJCWZtdF9zY2FsZWQoc3QuZl9iZnJlZSAqIHN0LmZfZnJzaXplLCBzX3Jvb3QpOworCQlmbXRfc2NhbGVkKHN0LmZfYmxvY2tzICogc3QuZl9mcnNpemUsIHNfdG90YWwpOworCQlwcmludGYoIiAgICBTaXplICAgICBVc2VkICAgIEF2YWlsICAgKHJvb3QpICAgICUlQ2FwYWNpdHlcbiIpOworCQlwcmludGYoIiU3c0IgJTdzQiAlN3NCICU3c0IgICAgICAgICAlM2xsdSUlXG4iLAorCQkgICAgc190b3RhbCwgc191c2VkLCBzX2F2YWlsLCBzX3Jvb3QsCisJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKSgxMDAgKiAoc3QuZl9ibG9ja3MgLSBzdC5mX2JmcmVlKSAvCisJCSAgICBzdC5mX2Jsb2NrcykpOworCX0gZWxzZSB7CisJCXByaW50ZigiICAgICAgICBTaXplICAgICAgICAgVXNlZCAgICAgICAgQXZhaWwgICAgICAgIgorCQkgICAgIihyb290KSAgICAlJUNhcGFjaXR5XG4iKTsKKwkJcHJpbnRmKCIlMTJsbHUgJTEybGx1ICUxMmxsdSAlMTJsbHUgICAgICAgICAlM2xsdSUlXG4iLAorCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykoc3QuZl9mcnNpemUgKiBzdC5mX2Jsb2NrcyAvIDEwMjQpLAorCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykoc3QuZl9mcnNpemUgKgorCQkgICAgKHN0LmZfYmxvY2tzIC0gc3QuZl9iZnJlZSkgLyAxMDI0KSwKKwkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKHN0LmZfZnJzaXplICogc3QuZl9iYXZhaWwgLyAxMDI0KSwKKwkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKHN0LmZfZnJzaXplICogc3QuZl9iZnJlZSAvIDEwMjQpLAorCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykoMTAwICogKHN0LmZfYmxvY2tzIC0gc3QuZl9iZnJlZSkgLworCQkgICAgc3QuZl9ibG9ja3MpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBVbmRvIGVzY2FwaW5nIG9mIGdsb2Igc2VxdWVuY2VzIGluIHBsYWNlLiBVc2VkIHRvIHVuZG8gZXh0cmEgZXNjYXBpbmcKKyAqIGFwcGxpZWQgaW4gbWFrZWFyZ3YoKSB3aGVuIHRoZSBzdHJpbmcgaXMgZGVzdGluZWQgZm9yIGEgZnVuY3Rpb24gdGhhdAorICogZG9lcyBub3QgZ2xvYiBpdC4KKyAqLworc3RhdGljIHZvaWQKK3VuZG9fZ2xvYl9lc2NhcGUoY2hhciAqcykKK3sKKwlzaXplX3QgaSwgajsKKworCWZvciAoaSA9IGogPSAwOzspIHsKKwkJaWYgKHNbaV0gPT0gJ1wwJykgeworCQkJc1tqXSA9ICdcMCc7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHNbaV0gIT0gJ1xcJykgeworCQkJc1tqKytdID0gc1tpKytdOworCQkJY29udGludWU7CisJCX0KKwkJLyogc1tpXSA9PSAnXFwnICovCisJCSsraTsKKwkJc3dpdGNoIChzW2ldKSB7CisJCWNhc2UgJz8nOgorCQljYXNlICdbJzoKKwkJY2FzZSAnKic6CisJCWNhc2UgJ1xcJzoKKwkJCXNbaisrXSA9IHNbaSsrXTsKKwkJCWJyZWFrOworCQljYXNlICdcMCc6CisJCQlzW2orK10gPSAnXFwnOworCQkJc1tqXSA9ICdcMCc7CisJCQlyZXR1cm47CisJCWRlZmF1bHQ6CisJCQlzW2orK10gPSAnXFwnOworCQkJc1tqKytdID0gc1tpKytdOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qCisgKiBTcGxpdCBhIHN0cmluZyBpbnRvIGFuIGFyZ3VtZW50IHZlY3RvciB1c2luZyBzaCgxKS1zdHlsZSBxdW90aW5nLAorICogY29tbWVudCBhbmQgZXNjYXBpbmcgcnVsZXMsIGJ1dCB3aXRoIHNvbWUgdHdlYWtzIHRvIGhhbmRsZSBnbG9iKDMpCisgKiB3aWxkY2FyZHMuCisgKiBUaGUgInNsb3BweSIgZmxhZyBhbGxvd3MgZm9yIHJlY292ZXJ5IGZyb20gbWlzc2luZyB0ZXJtaW5hdGluZyBxdW90ZSwgZm9yCisgKiB1c2UgaW4gcGFyc2luZyBpbmNvbXBsZXRlIGNvbW1hbmRsaW5lcyBkdXJpbmcgdGFiIGF1dG9jb21wbGV0aW9uLgorICoKKyAqIFJldHVybnMgTlVMTCBvbiBlcnJvciBvciBhIE5VTEwtdGVybWluYXRlZCBhcnJheSBvZiBhcmd1bWVudHMuCisgKgorICogSWYgImxhc3RxdW90ZSIgaXMgbm90IE5VTEwsIHRoZSBxdW90aW5nIGNoYXJhY3RlciB1c2VkIGZvciB0aGUgbGFzdAorICogYXJndW1lbnQgaXMgcGxhY2VkIGluICpsYXN0cXVvdGUgKCJcMCIsICInIiBvciAiXCIiKS4KKyAqIAorICogSWYgInRlcm1pbmF0ZWQiIGlzIG5vdCBOVUxMLCAqdGVybWluYXRlZCB3aWxsIGJlIHNldCB0byAxIHdoZW4gdGhlCisgKiBsYXN0IGFyZ3VtZW50J3MgcXVvdGUgaGFzIGJlZW4gcHJvcGVybHkgdGVybWluYXRlZCBvciAwIG90aGVyd2lzZS4KKyAqIFRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgb2YgdXNlIGlmICJzbG9wcHkiIGlzIHNldC4KKyAqLworI2RlZmluZSBNQVhBUkdTIAkxMjgKKyNkZWZpbmUgTUFYQVJHTEVOCTgxOTIKK3N0YXRpYyBjaGFyICoqCittYWtlYXJndihjb25zdCBjaGFyICphcmcsIGludCAqYXJnY3AsIGludCBzbG9wcHksIGNoYXIgKmxhc3RxdW90ZSwKKyAgICB1X2ludCAqdGVybWluYXRlZCkKK3sKKwlpbnQgYXJnYywgcXVvdDsKKwlzaXplX3QgaSwgajsKKwlzdGF0aWMgY2hhciBhcmd2c1tNQVhBUkdMRU5dOworCXN0YXRpYyBjaGFyICphcmd2W01BWEFSR1MgKyAxXTsKKwllbnVtIHsgTUFfU1RBUlQsIE1BX1NRVU9URSwgTUFfRFFVT1RFLCBNQV9VTlFVT1RFRCB9IHN0YXRlLCBxOworCisJKmFyZ2NwID0gYXJnYyA9IDA7CisJaWYgKHN0cmxlbihhcmcpID4gc2l6ZW9mKGFyZ3ZzKSAtIDEpIHsKKyBhcmdzX3Rvb19sb25nczoKKwkJZXJyb3IoInN0cmluZyB0b28gbG9uZyIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHRlcm1pbmF0ZWQgIT0gTlVMTCkKKwkJKnRlcm1pbmF0ZWQgPSAxOworCWlmIChsYXN0cXVvdGUgIT0gTlVMTCkKKwkJKmxhc3RxdW90ZSA9ICdcMCc7CisJc3RhdGUgPSBNQV9TVEFSVDsKKwlpID0gaiA9IDA7CisJZm9yICg7OykgeworCQlpZiAoaXNzcGFjZShhcmdbaV0pKSB7CisJCQlpZiAoc3RhdGUgPT0gTUFfVU5RVU9URUQpIHsKKwkJCQkvKiBUZXJtaW5hdGUgY3VycmVudCBhcmd1bWVudCAqLworCQkJCWFyZ3ZzW2orK10gPSAnXDAnOworCQkJCWFyZ2MrKzsKKwkJCQlzdGF0ZSA9IE1BX1NUQVJUOworCQkJfSBlbHNlIGlmIChzdGF0ZSAhPSBNQV9TVEFSVCkKKwkJCQlhcmd2c1tqKytdID0gYXJnW2ldOworCQl9IGVsc2UgaWYgKGFyZ1tpXSA9PSAnIicgfHwgYXJnW2ldID09ICdcJycpIHsKKwkJCXEgPSBhcmdbaV0gPT0gJyInID8gTUFfRFFVT1RFIDogTUFfU1FVT1RFOworCQkJaWYgKHN0YXRlID09IE1BX1NUQVJUKSB7CisJCQkJYXJndlthcmdjXSA9IGFyZ3ZzICsgajsKKwkJCQlzdGF0ZSA9IHE7CisJCQkJaWYgKGxhc3RxdW90ZSAhPSBOVUxMKQorCQkJCQkqbGFzdHF1b3RlID0gYXJnW2ldOworCQkJfSBlbHNlIGlmIChzdGF0ZSA9PSBNQV9VTlFVT1RFRCkgCisJCQkJc3RhdGUgPSBxOworCQkJZWxzZSBpZiAoc3RhdGUgPT0gcSkKKwkJCQlzdGF0ZSA9IE1BX1VOUVVPVEVEOworCQkJZWxzZQorCQkJCWFyZ3ZzW2orK10gPSBhcmdbaV07CisJCX0gZWxzZSBpZiAoYXJnW2ldID09ICdcXCcpIHsKKwkJCWlmIChzdGF0ZSA9PSBNQV9TUVVPVEUgfHwgc3RhdGUgPT0gTUFfRFFVT1RFKSB7CisJCQkJcXVvdCA9IHN0YXRlID09IE1BX1NRVU9URSA/ICdcJycgOiAnIic7CisJCQkJLyogVW5lc2NhcGUgcXVvdGUgd2UgYXJlIGluICovCisJCQkJLyogWFhYIHN1cHBvcnQgXG4gYW5kIGZyaWVuZHM/ICovCisJCQkJaWYgKGFyZ1tpICsgMV0gPT0gcXVvdCkgeworCQkJCQlpKys7CisJCQkJCWFyZ3ZzW2orK10gPSBhcmdbaV07CisJCQkJfSBlbHNlIGlmIChhcmdbaSArIDFdID09ICc/JyB8fAorCQkJCSAgICBhcmdbaSArIDFdID09ICdbJyB8fCBhcmdbaSArIDFdID09ICcqJykgeworCQkJCQkvKgorCQkJCQkgKiBTcGVjaWFsIGNhc2UgZm9yIHNmdHA6IGFwcGVuZAorCQkJCQkgKiBkb3VibGUtZXNjYXBlZCBnbG9iIHNlcXVlbmNlIC0KKwkJCQkJICogZ2xvYiB3aWxsIHVuZG8gb25lIGxldmVsIG9mCisJCQkJCSAqIGVzY2FwaW5nLiBOQi4gc3RyaW5nIGNhbiBncm93IGhlcmUuCisJCQkJCSAqLworCQkJCQlpZiAoaiA+PSBzaXplb2YoYXJndnMpIC0gNSkKKwkJCQkJCWdvdG8gYXJnc190b29fbG9uZ3M7CisJCQkJCWFyZ3ZzW2orK10gPSAnXFwnOworCQkJCQlhcmd2c1tqKytdID0gYXJnW2krK107CisJCQkJCWFyZ3ZzW2orK10gPSAnXFwnOworCQkJCQlhcmd2c1tqKytdID0gYXJnW2ldOworCQkJCX0gZWxzZSB7CisJCQkJCWFyZ3ZzW2orK10gPSBhcmdbaSsrXTsKKwkJCQkJYXJndnNbaisrXSA9IGFyZ1tpXTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChzdGF0ZSA9PSBNQV9TVEFSVCkgeworCQkJCQlhcmd2W2FyZ2NdID0gYXJndnMgKyBqOworCQkJCQlzdGF0ZSA9IE1BX1VOUVVPVEVEOworCQkJCQlpZiAobGFzdHF1b3RlICE9IE5VTEwpCisJCQkJCQkqbGFzdHF1b3RlID0gJ1wwJzsKKwkJCQl9CisJCQkJaWYgKGFyZ1tpICsgMV0gPT0gJz8nIHx8IGFyZ1tpICsgMV0gPT0gJ1snIHx8CisJCQkJICAgIGFyZ1tpICsgMV0gPT0gJyonIHx8IGFyZ1tpICsgMV0gPT0gJ1xcJykgeworCQkJCQkvKgorCQkJCQkgKiBTcGVjaWFsIGNhc2UgZm9yIHNmdHA6IGFwcGVuZAorCQkJCQkgKiBlc2NhcGVkIGdsb2Igc2VxdWVuY2UgLQorCQkJCQkgKiBnbG9iIHdpbGwgdW5kbyBvbmUgbGV2ZWwgb2YKKwkJCQkJICogZXNjYXBpbmcuCisJCQkJCSAqLworCQkJCQlhcmd2c1tqKytdID0gYXJnW2krK107CisJCQkJCWFyZ3ZzW2orK10gPSBhcmdbaV07CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogVW5lc2NhcGUgZXZlcnl0aGluZyAqLworCQkJCQkvKiBYWFggc3VwcG9ydCBcbiBhbmQgZnJpZW5kcz8gKi8KKwkJCQkJaSsrOworCQkJCQlhcmd2c1tqKytdID0gYXJnW2ldOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChhcmdbaV0gPT0gJyMnKSB7CisJCQlpZiAoc3RhdGUgPT0gTUFfU1FVT1RFIHx8IHN0YXRlID09IE1BX0RRVU9URSkKKwkJCQlhcmd2c1tqKytdID0gYXJnW2ldOworCQkJZWxzZQorCQkJCWdvdG8gc3RyaW5nX2RvbmU7CisJCX0gZWxzZSBpZiAoYXJnW2ldID09ICdcMCcpIHsKKwkJCWlmIChzdGF0ZSA9PSBNQV9TUVVPVEUgfHwgc3RhdGUgPT0gTUFfRFFVT1RFKSB7CisJCQkJaWYgKHNsb3BweSkgeworCQkJCQlzdGF0ZSA9IE1BX1VOUVVPVEVEOworCQkJCQlpZiAodGVybWluYXRlZCAhPSBOVUxMKQorCQkJCQkJKnRlcm1pbmF0ZWQgPSAwOworCQkJCQlnb3RvIHN0cmluZ19kb25lOworCQkJCX0KKwkJCQllcnJvcigiVW50ZXJtaW5hdGVkIHF1b3RlZCBhcmd1bWVudCIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorIHN0cmluZ19kb25lOgorCQkJaWYgKHN0YXRlID09IE1BX1VOUVVPVEVEKSB7CisJCQkJYXJndnNbaisrXSA9ICdcMCc7CisJCQkJYXJnYysrOworCQkJfQorCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlpZiAoc3RhdGUgPT0gTUFfU1RBUlQpIHsKKwkJCQlhcmd2W2FyZ2NdID0gYXJndnMgKyBqOworCQkJCXN0YXRlID0gTUFfVU5RVU9URUQ7CisJCQkJaWYgKGxhc3RxdW90ZSAhPSBOVUxMKQorCQkJCQkqbGFzdHF1b3RlID0gJ1wwJzsKKwkJCX0KKwkJCWlmICgoc3RhdGUgPT0gTUFfU1FVT1RFIHx8IHN0YXRlID09IE1BX0RRVU9URSkgJiYKKwkJCSAgICAoYXJnW2ldID09ICc/JyB8fCBhcmdbaV0gPT0gJ1snIHx8IGFyZ1tpXSA9PSAnKicpKSB7CisJCQkJLyoKKwkJCQkgKiBTcGVjaWFsIGNhc2UgZm9yIHNmdHA6IGVzY2FwZSBxdW90ZWQKKwkJCQkgKiBnbG9iKDMpIHdpbGRjYXJkcy4gTkIuIHN0cmluZyBjYW4gZ3JvdworCQkJCSAqIGhlcmUuCisJCQkJICovCisJCQkJaWYgKGogPj0gc2l6ZW9mKGFyZ3ZzKSAtIDMpCisJCQkJCWdvdG8gYXJnc190b29fbG9uZ3M7CisJCQkJYXJndnNbaisrXSA9ICdcXCc7CisJCQkJYXJndnNbaisrXSA9IGFyZ1tpXTsKKwkJCX0gZWxzZQorCQkJCWFyZ3ZzW2orK10gPSBhcmdbaV07CisJCX0KKwkJaSsrOworCX0KKwkqYXJnY3AgPSBhcmdjOworCXJldHVybiBhcmd2OworfQorCitzdGF0aWMgaW50CitwYXJzZV9hcmdzKGNvbnN0IGNoYXIgKipjcHAsIGludCAqcGZsYWcsIGludCAqcmZsYWcsIGludCAqbGZsYWcsIGludCAqaWZsYWcsCisgICAgaW50ICpoZmxhZywgaW50ICpzZmxhZywgdW5zaWduZWQgbG9uZyAqbl9hcmcsIGNoYXIgKipwYXRoMSwgY2hhciAqKnBhdGgyKQoreworCWNvbnN0IGNoYXIgKmNtZCwgKmNwID0gKmNwcDsKKwljaGFyICpjcDIsICoqYXJndjsKKwlpbnQgYmFzZSA9IDA7CisJbG9uZyBsOworCWludCBpLCBjbWRudW0sIG9wdGlkeCwgYXJnYzsKKworCS8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlICovCisJY3AgPSBjcCArIHN0cnNwbihjcCwgV0hJVEVTUEFDRSk7CisKKwkvKiBDaGVjayBmb3IgbGVhZGluZyAnLScgKGRpc2FibGUgZXJyb3IgcHJvY2Vzc2luZykgKi8KKwkqaWZsYWcgPSAwOworCWlmICgqY3AgPT0gJy0nKSB7CisJCSppZmxhZyA9IDE7CisJCWNwKys7CisJCWNwID0gY3AgKyBzdHJzcG4oY3AsIFdISVRFU1BBQ0UpOworCX0KKworCS8qIElnbm9yZSBibGFuayBsaW5lcyBhbmQgbGluZXMgd2hpY2ggYmVnaW4gd2l0aCBjb21tZW50ICcjJyBjaGFyICovCisJaWYgKCpjcCA9PSAnXDAnIHx8ICpjcCA9PSAnIycpCisJCXJldHVybiAoMCk7CisKKwlpZiAoKGFyZ3YgPSBtYWtlYXJndihjcCwgJmFyZ2MsIDAsIE5VTEwsIE5VTEwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwkvKiBGaWd1cmUgb3V0IHdoaWNoIGNvbW1hbmQgd2UgaGF2ZSAqLworCWZvciAoaSA9IDA7IGNtZHNbaV0uYyAhPSBOVUxMOyBpKyspIHsKKwkJaWYgKHN0cmNhc2VjbXAoY21kc1tpXS5jLCBhcmd2WzBdKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCWNtZG51bSA9IGNtZHNbaV0ubjsKKwljbWQgPSBjbWRzW2ldLmM7CisKKwkvKiBTcGVjaWFsIGNhc2UgKi8KKwlpZiAoKmNwID09ICchJykgeworCQljcCsrOworCQljbWRudW0gPSBJX1NIRUxMOworCX0gZWxzZSBpZiAoY21kbnVtID09IC0xKSB7CisJCWVycm9yKCJJbnZhbGlkIGNvbW1hbmQuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBHZXQgYXJndW1lbnRzIGFuZCBwYXJzZSBmbGFncyAqLworCSpsZmxhZyA9ICpwZmxhZyA9ICpyZmxhZyA9ICpoZmxhZyA9ICpuX2FyZyA9IDA7CisJKnBhdGgxID0gKnBhdGgyID0gTlVMTDsKKwlvcHRpZHggPSAxOworCXN3aXRjaCAoY21kbnVtKSB7CisJY2FzZSBJX0dFVDoKKwljYXNlIElfUFVUOgorCQlpZiAoKG9wdGlkeCA9IHBhcnNlX2dldHB1dF9mbGFncyhjbWQsIGFyZ3YsIGFyZ2MsCisJCSAgICBwZmxhZywgcmZsYWcpKSA9PSAtMSkKKwkJCXJldHVybiAtMTsKKwkJLyogR2V0IGZpcnN0IHBhdGhuYW1lIChtYW5kYXRvcnkpICovCisJCWlmIChhcmdjIC0gb3B0aWR4IDwgMSkgeworCQkJZXJyb3IoIllvdSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIHBhdGggYWZ0ZXIgYSAiCisJCQkgICAgIiVzIGNvbW1hbmQuIiwgY21kKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkqcGF0aDEgPSB4c3RyZHVwKGFyZ3Zbb3B0aWR4XSk7CisJCS8qIEdldCBzZWNvbmQgcGF0aG5hbWUgKG9wdGlvbmFsKSAqLworCQlpZiAoYXJnYyAtIG9wdGlkeCA+IDEpIHsKKwkJCSpwYXRoMiA9IHhzdHJkdXAoYXJndltvcHRpZHggKyAxXSk7CisJCQkvKiBEZXN0aW5hdGlvbiBpcyBub3QgZ2xvYmJlZCAqLworCQkJdW5kb19nbG9iX2VzY2FwZSgqcGF0aDIpOworCQl9CisJCWJyZWFrOworCWNhc2UgSV9MSU5LOgorCQlpZiAoKG9wdGlkeCA9IHBhcnNlX2xpbmtfZmxhZ3MoY21kLCBhcmd2LCBhcmdjLCBzZmxhZykpID09IC0xKQorCQkJcmV0dXJuIC0xOworCWNhc2UgSV9TWU1MSU5LOgorCWNhc2UgSV9SRU5BTUU6CisJCWlmIChhcmdjIC0gb3B0aWR4IDwgMikgeworCQkJZXJyb3IoIllvdSBtdXN0IHNwZWNpZnkgdHdvIHBhdGhzIGFmdGVyIGEgJXMgIgorCQkJICAgICJjb21tYW5kLiIsIGNtZCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJKnBhdGgxID0geHN0cmR1cChhcmd2W29wdGlkeF0pOworCQkqcGF0aDIgPSB4c3RyZHVwKGFyZ3Zbb3B0aWR4ICsgMV0pOworCQkvKiBQYXRocyBhcmUgbm90IGdsb2JiZWQgKi8KKwkJdW5kb19nbG9iX2VzY2FwZSgqcGF0aDEpOworCQl1bmRvX2dsb2JfZXNjYXBlKCpwYXRoMik7CisJCWJyZWFrOworCWNhc2UgSV9STToKKwljYXNlIElfTUtESVI6CisJY2FzZSBJX1JNRElSOgorCWNhc2UgSV9DSERJUjoKKwljYXNlIElfTENIRElSOgorCWNhc2UgSV9MTUtESVI6CisJCS8qIEdldCBwYXRobmFtZSAobWFuZGF0b3J5KSAqLworCQlpZiAoYXJnYyAtIG9wdGlkeCA8IDEpIHsKKwkJCWVycm9yKCJZb3UgbXVzdCBzcGVjaWZ5IGEgcGF0aCBhZnRlciBhICVzIGNvbW1hbmQuIiwKKwkJCSAgICBjbWQpOworCQkJcmV0dXJuIC0xOworCQl9CisJCSpwYXRoMSA9IHhzdHJkdXAoYXJndltvcHRpZHhdKTsKKwkJLyogT25seSAicm0iIGdsb2JzICovCisJCWlmIChjbWRudW0gIT0gSV9STSkKKwkJCXVuZG9fZ2xvYl9lc2NhcGUoKnBhdGgxKTsKKwkJYnJlYWs7CisJY2FzZSBJX0RGOgorCQlpZiAoKG9wdGlkeCA9IHBhcnNlX2RmX2ZsYWdzKGNtZCwgYXJndiwgYXJnYywgaGZsYWcsCisJCSAgICBpZmxhZykpID09IC0xKQorCQkJcmV0dXJuIC0xOworCQkvKiBEZWZhdWx0IHRvIGN1cnJlbnQgZGlyZWN0b3J5IGlmIG5vIHBhdGggc3BlY2lmaWVkICovCisJCWlmIChhcmdjIC0gb3B0aWR4IDwgMSkKKwkJCSpwYXRoMSA9IE5VTEw7CisJCWVsc2UgeworCQkJKnBhdGgxID0geHN0cmR1cChhcmd2W29wdGlkeF0pOworCQkJdW5kb19nbG9iX2VzY2FwZSgqcGF0aDEpOworCQl9CisJCWJyZWFrOworCWNhc2UgSV9MUzoKKwkJaWYgKChvcHRpZHggPSBwYXJzZV9sc19mbGFncyhhcmd2LCBhcmdjLCBsZmxhZykpID09IC0xKQorCQkJcmV0dXJuKC0xKTsKKwkJLyogUGF0aCBpcyBvcHRpb25hbCAqLworCQlpZiAoYXJnYyAtIG9wdGlkeCA+IDApCisJCQkqcGF0aDEgPSB4c3RyZHVwKGFyZ3Zbb3B0aWR4XSk7CisJCWJyZWFrOworCWNhc2UgSV9MTFM6CisJCS8qIFNraXAgbHMgY29tbWFuZCBhbmQgZm9sbG93aW5nIHdoaXRlc3BhY2UgKi8KKwkJY3AgPSBjcCArIHN0cmxlbihjbWQpICsgc3Ryc3BuKGNwLCBXSElURVNQQUNFKTsKKwljYXNlIElfU0hFTEw6CisJCS8qIFVzZXMgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgKi8KKwkJYnJlYWs7CisJY2FzZSBJX0xVTUFTSzoKKwljYXNlIElfQ0hNT0Q6CisJCWJhc2UgPSA4OworCWNhc2UgSV9DSE9XTjoKKwljYXNlIElfQ0hHUlA6CisJCS8qIEdldCBudW1lcmljIGFyZyAobWFuZGF0b3J5KSAqLworCQlpZiAoYXJnYyAtIG9wdGlkeCA8IDEpCisJCQlnb3RvIG5lZWRfbnVtX2FyZzsKKwkJZXJybm8gPSAwOworCQlsID0gc3RydG9sKGFyZ3Zbb3B0aWR4XSwgJmNwMiwgYmFzZSk7CisJCWlmIChjcDIgPT0gYXJndltvcHRpZHhdIHx8ICpjcDIgIT0gJ1wwJyB8fAorCQkgICAgKChsID09IExPTkdfTUlOIHx8IGwgPT0gTE9OR19NQVgpICYmIGVycm5vID09IEVSQU5HRSkgfHwKKwkJICAgIGwgPCAwKSB7CisgbmVlZF9udW1fYXJnOgorCQkJZXJyb3IoIllvdSBtdXN0IHN1cHBseSBhIG51bWVyaWMgYXJndW1lbnQgIgorCQkJICAgICJ0byB0aGUgJXMgY29tbWFuZC4iLCBjbWQpOworCQkJcmV0dXJuIC0xOworCQl9CisJCSpuX2FyZyA9IGw7CisJCWlmIChjbWRudW0gPT0gSV9MVU1BU0spCisJCQlicmVhazsKKwkJLyogR2V0IHBhdGhuYW1lIChtYW5kYXRvcnkpICovCisJCWlmIChhcmdjIC0gb3B0aWR4IDwgMikgeworCQkJZXJyb3IoIllvdSBtdXN0IHNwZWNpZnkgYSBwYXRoIGFmdGVyIGEgJXMgY29tbWFuZC4iLAorCQkJICAgIGNtZCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJKnBhdGgxID0geHN0cmR1cChhcmd2W29wdGlkeCArIDFdKTsKKwkJYnJlYWs7CisJY2FzZSBJX1FVSVQ6CisJY2FzZSBJX1BXRDoKKwljYXNlIElfTFBXRDoKKwljYXNlIElfSEVMUDoKKwljYXNlIElfVkVSU0lPTjoKKwljYXNlIElfUFJPR1JFU1M6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZhdGFsKCJDb21tYW5kIG5vdCBpbXBsZW1lbnRlZCIpOworCX0KKworCSpjcHAgPSBjcDsKKwlyZXR1cm4oY21kbnVtKTsKK30KKworc3RhdGljIGludAorcGFyc2VfZGlzcGF0Y2hfY29tbWFuZChzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjb25zdCBjaGFyICpjbWQsIGNoYXIgKipwd2QsCisgICAgaW50IGVycl9hYm9ydCkKK3sKKwljaGFyICpwYXRoMSwgKnBhdGgyLCAqdG1wOworCWludCBwZmxhZyA9IDAsIHJmbGFnID0gMCwgbGZsYWcgPSAwLCBpZmxhZyA9IDAsIGhmbGFnID0gMCwgc2ZsYWcgPSAwOworCWludCBjbWRudW0sIGk7CisJdW5zaWduZWQgbG9uZyBuX2FyZyA9IDA7CisJQXR0cmliIGEsICphYTsKKwljaGFyIHBhdGhfYnVmW01BWFBBVEhMRU5dOworCWludCBlcnIgPSAwOworCWdsb2JfdCBnOworCisJcGF0aDEgPSBwYXRoMiA9IE5VTEw7CisJY21kbnVtID0gcGFyc2VfYXJncygmY21kLCAmcGZsYWcsICZyZmxhZywgJmxmbGFnLCAmaWZsYWcsICZoZmxhZywKKwkgICAgJnNmbGFnLCAmbl9hcmcsICZwYXRoMSwgJnBhdGgyKTsKKworCWlmIChpZmxhZyAhPSAwKQorCQllcnJfYWJvcnQgPSAwOworCisJbWVtc2V0KCZnLCAwLCBzaXplb2YoZykpOworCisJLyogUGVyZm9ybSBjb21tYW5kICovCisJc3dpdGNoIChjbWRudW0pIHsKKwljYXNlIDA6CisJCS8qIEJsYW5rIGxpbmUgKi8KKwkJYnJlYWs7CisJY2FzZSAtMToKKwkJLyogVW5yZWNvZ25pemVkIGNvbW1hbmQgKi8KKwkJZXJyID0gLTE7CisJCWJyZWFrOworCWNhc2UgSV9HRVQ6CisJCWVyciA9IHByb2Nlc3NfZ2V0KGNvbm4sIHBhdGgxLCBwYXRoMiwgKnB3ZCwgcGZsYWcsIHJmbGFnKTsKKwkJYnJlYWs7CisJY2FzZSBJX1BVVDoKKwkJZXJyID0gcHJvY2Vzc19wdXQoY29ubiwgcGF0aDEsIHBhdGgyLCAqcHdkLCBwZmxhZywgcmZsYWcpOworCQlicmVhazsKKwljYXNlIElfUkVOQU1FOgorCQlwYXRoMSA9IG1ha2VfYWJzb2x1dGUocGF0aDEsICpwd2QpOworCQlwYXRoMiA9IG1ha2VfYWJzb2x1dGUocGF0aDIsICpwd2QpOworCQllcnIgPSBkb19yZW5hbWUoY29ubiwgcGF0aDEsIHBhdGgyKTsKKwkJYnJlYWs7CisJY2FzZSBJX1NZTUxJTks6CisJCXNmbGFnID0gMTsKKwljYXNlIElfTElOSzoKKwkJcGF0aDEgPSBtYWtlX2Fic29sdXRlKHBhdGgxLCAqcHdkKTsKKwkJcGF0aDIgPSBtYWtlX2Fic29sdXRlKHBhdGgyLCAqcHdkKTsKKwkJZXJyID0gKHNmbGFnID8gZG9fc3ltbGluayA6IGRvX2hhcmRsaW5rKShjb25uLCBwYXRoMSwgcGF0aDIpOworCQlicmVhazsKKwljYXNlIElfUk06CisJCXBhdGgxID0gbWFrZV9hYnNvbHV0ZShwYXRoMSwgKnB3ZCk7CisJCXJlbW90ZV9nbG9iKGNvbm4sIHBhdGgxLCBHTE9CX05PQ0hFQ0ssIE5VTEwsICZnKTsKKwkJZm9yIChpID0gMDsgZy5nbF9wYXRodltpXSAmJiAhaW50ZXJydXB0ZWQ7IGkrKykgeworCQkJcHJpbnRmKCJSZW1vdmluZyAlc1xuIiwgZy5nbF9wYXRodltpXSk7CisJCQllcnIgPSBkb19ybShjb25uLCBnLmdsX3BhdGh2W2ldKTsKKwkJCWlmIChlcnIgIT0gMCAmJiBlcnJfYWJvcnQpCisJCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJX01LRElSOgorCQlwYXRoMSA9IG1ha2VfYWJzb2x1dGUocGF0aDEsICpwd2QpOworCQlhdHRyaWJfY2xlYXIoJmEpOworCQlhLmZsYWdzIHw9IFNTSDJfRklMRVhGRVJfQVRUUl9QRVJNSVNTSU9OUzsKKwkJYS5wZXJtID0gMDc3NzsKKwkJZXJyID0gZG9fbWtkaXIoY29ubiwgcGF0aDEsICZhLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBJX1JNRElSOgorCQlwYXRoMSA9IG1ha2VfYWJzb2x1dGUocGF0aDEsICpwd2QpOworCQllcnIgPSBkb19ybWRpcihjb25uLCBwYXRoMSk7CisJCWJyZWFrOworCWNhc2UgSV9DSERJUjoKKwkJcGF0aDEgPSBtYWtlX2Fic29sdXRlKHBhdGgxLCAqcHdkKTsKKwkJaWYgKCh0bXAgPSBkb19yZWFscGF0aChjb25uLCBwYXRoMSkpID09IE5VTEwpIHsKKwkJCWVyciA9IDE7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKGFhID0gZG9fc3RhdChjb25uLCB0bXAsIDApKSA9PSBOVUxMKSB7CisJCQl4ZnJlZSh0bXApOworCQkJZXJyID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWlmICghKGFhLT5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9QRVJNSVNTSU9OUykpIHsKKwkJCWVycm9yKCJDYW4ndCBjaGFuZ2UgZGlyZWN0b3J5OiBDYW4ndCBjaGVjayB0YXJnZXQiKTsKKwkJCXhmcmVlKHRtcCk7CisJCQllcnIgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFTX0lTRElSKGFhLT5wZXJtKSkgeworCQkJZXJyb3IoIkNhbid0IGNoYW5nZSBkaXJlY3Rvcnk6IFwiJXNcIiBpcyBub3QgIgorCQkJICAgICJhIGRpcmVjdG9yeSIsIHRtcCk7CisJCQl4ZnJlZSh0bXApOworCQkJZXJyID0gMTsKKwkJCWJyZWFrOworCQl9CisJCXhmcmVlKCpwd2QpOworCQkqcHdkID0gdG1wOworCQlicmVhazsKKwljYXNlIElfTFM6CisJCWlmICghcGF0aDEpIHsKKwkJCWRvX2xzX2Rpcihjb25uLCAqcHdkLCAqcHdkLCBsZmxhZyk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFN0cmlwIHB3ZCBvZmYgYmVnaW5uaW5nIG9mIG5vbi1hYnNvbHV0ZSBwYXRocyAqLworCQl0bXAgPSBOVUxMOworCQlpZiAoKnBhdGgxICE9ICcvJykKKwkJCXRtcCA9ICpwd2Q7CisKKwkJcGF0aDEgPSBtYWtlX2Fic29sdXRlKHBhdGgxLCAqcHdkKTsKKwkJZXJyID0gZG9fZ2xvYmJlZF9scyhjb25uLCBwYXRoMSwgdG1wLCBsZmxhZyk7CisJCWJyZWFrOworCWNhc2UgSV9ERjoKKwkJLyogRGVmYXVsdCB0byBjdXJyZW50IGRpcmVjdG9yeSBpZiBubyBwYXRoIHNwZWNpZmllZCAqLworCQlpZiAocGF0aDEgPT0gTlVMTCkKKwkJCXBhdGgxID0geHN0cmR1cCgqcHdkKTsKKwkJcGF0aDEgPSBtYWtlX2Fic29sdXRlKHBhdGgxLCAqcHdkKTsKKwkJZXJyID0gZG9fZGYoY29ubiwgcGF0aDEsIGhmbGFnLCBpZmxhZyk7CisJCWJyZWFrOworCWNhc2UgSV9MQ0hESVI6CisJCWlmIChjaGRpcihwYXRoMSkgPT0gLTEpIHsKKwkJCWVycm9yKCJDb3VsZG4ndCBjaGFuZ2UgbG9jYWwgZGlyZWN0b3J5IHRvICIKKwkJCSAgICAiXCIlc1wiOiAlcyIsIHBhdGgxLCBzdHJlcnJvcihlcnJubykpOworCQkJZXJyID0gMTsKKwkJfQorCQlicmVhazsKKwljYXNlIElfTE1LRElSOgorCQlpZiAobWtkaXIocGF0aDEsIDA3NzcpID09IC0xKSB7CisJCQllcnJvcigiQ291bGRuJ3QgY3JlYXRlIGxvY2FsIGRpcmVjdG9yeSAiCisJCQkgICAgIlwiJXNcIjogJXMiLCBwYXRoMSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWVyciA9IDE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJX0xMUzoKKwkJbG9jYWxfZG9fbHMoY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJX1NIRUxMOgorCQlsb2NhbF9kb19zaGVsbChjbWQpOworCQlicmVhazsKKwljYXNlIElfTFVNQVNLOgorCQl1bWFzayhuX2FyZyk7CisJCXByaW50ZigiTG9jYWwgdW1hc2s6ICUwM2xvXG4iLCBuX2FyZyk7CisJCWJyZWFrOworCWNhc2UgSV9DSE1PRDoKKwkJcGF0aDEgPSBtYWtlX2Fic29sdXRlKHBhdGgxLCAqcHdkKTsKKwkJYXR0cmliX2NsZWFyKCZhKTsKKwkJYS5mbGFncyB8PSBTU0gyX0ZJTEVYRkVSX0FUVFJfUEVSTUlTU0lPTlM7CisJCWEucGVybSA9IG5fYXJnOworCQlyZW1vdGVfZ2xvYihjb25uLCBwYXRoMSwgR0xPQl9OT0NIRUNLLCBOVUxMLCAmZyk7CisJCWZvciAoaSA9IDA7IGcuZ2xfcGF0aHZbaV0gJiYgIWludGVycnVwdGVkOyBpKyspIHsKKwkJCXByaW50ZigiQ2hhbmdpbmcgbW9kZSBvbiAlc1xuIiwgZy5nbF9wYXRodltpXSk7CisJCQllcnIgPSBkb19zZXRzdGF0KGNvbm4sIGcuZ2xfcGF0aHZbaV0sICZhKTsKKwkJCWlmIChlcnIgIT0gMCAmJiBlcnJfYWJvcnQpCisJCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJX0NIT1dOOgorCWNhc2UgSV9DSEdSUDoKKwkJcGF0aDEgPSBtYWtlX2Fic29sdXRlKHBhdGgxLCAqcHdkKTsKKwkJcmVtb3RlX2dsb2IoY29ubiwgcGF0aDEsIEdMT0JfTk9DSEVDSywgTlVMTCwgJmcpOworCQlmb3IgKGkgPSAwOyBnLmdsX3BhdGh2W2ldICYmICFpbnRlcnJ1cHRlZDsgaSsrKSB7CisJCQlpZiAoIShhYSA9IGRvX3N0YXQoY29ubiwgZy5nbF9wYXRodltpXSwgMCkpKSB7CisJCQkJaWYgKGVycl9hYm9ydCkgeworCQkJCQllcnIgPSAtMTsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCEoYWEtPmZsYWdzICYgU1NIMl9GSUxFWEZFUl9BVFRSX1VJREdJRCkpIHsKKwkJCQllcnJvcigiQ2FuJ3QgZ2V0IGN1cnJlbnQgb3duZXJzaGlwIG9mICIKKwkJCQkgICAgInJlbW90ZSBmaWxlIFwiJXNcIiIsIGcuZ2xfcGF0aHZbaV0pOworCQkJCWlmIChlcnJfYWJvcnQpIHsKKwkJCQkJZXJyID0gLTE7CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZQorCQkJCQljb250aW51ZTsKKwkJCX0KKwkJCWFhLT5mbGFncyAmPSBTU0gyX0ZJTEVYRkVSX0FUVFJfVUlER0lEOworCQkJaWYgKGNtZG51bSA9PSBJX0NIT1dOKSB7CisJCQkJcHJpbnRmKCJDaGFuZ2luZyBvd25lciBvbiAlc1xuIiwgZy5nbF9wYXRodltpXSk7CisJCQkJYWEtPnVpZCA9IG5fYXJnOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGYoIkNoYW5naW5nIGdyb3VwIG9uICVzXG4iLCBnLmdsX3BhdGh2W2ldKTsKKwkJCQlhYS0+Z2lkID0gbl9hcmc7CisJCQl9CisJCQllcnIgPSBkb19zZXRzdGF0KGNvbm4sIGcuZ2xfcGF0aHZbaV0sIGFhKTsKKwkJCWlmIChlcnIgIT0gMCAmJiBlcnJfYWJvcnQpCisJCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJX1BXRDoKKwkJcHJpbnRmKCJSZW1vdGUgd29ya2luZyBkaXJlY3Rvcnk6ICVzXG4iLCAqcHdkKTsKKwkJYnJlYWs7CisJY2FzZSBJX0xQV0Q6CisJCWlmICghZ2V0Y3dkKHBhdGhfYnVmLCBzaXplb2YocGF0aF9idWYpKSkgeworCQkJZXJyb3IoIkNvdWxkbid0IGdldCBsb2NhbCBjd2Q6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWVyciA9IC0xOworCQkJYnJlYWs7CisJCX0KKwkJcHJpbnRmKCJMb2NhbCB3b3JraW5nIGRpcmVjdG9yeTogJXNcbiIsIHBhdGhfYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBJX1FVSVQ6CisJCS8qIFByb2Nlc3NlZCBiZWxvdyAqLworCQlicmVhazsKKwljYXNlIElfSEVMUDoKKwkJaGVscCgpOworCQlicmVhazsKKwljYXNlIElfVkVSU0lPTjoKKwkJcHJpbnRmKCJTRlRQIHByb3RvY29sIHZlcnNpb24gJXVcbiIsIHNmdHBfcHJvdG9fdmVyc2lvbihjb25uKSk7CisJCWJyZWFrOworCWNhc2UgSV9QUk9HUkVTUzoKKwkJc2hvd3Byb2dyZXNzID0gIXNob3dwcm9ncmVzczsKKwkJaWYgKHNob3dwcm9ncmVzcykKKwkJCXByaW50ZigiUHJvZ3Jlc3MgbWV0ZXIgZW5hYmxlZFxuIik7CisJCWVsc2UKKwkJCXByaW50ZigiUHJvZ3Jlc3MgbWV0ZXIgZGlzYWJsZWRcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmYXRhbCgiJWQgaXMgbm90IGltcGxlbWVudGVkIiwgY21kbnVtKTsKKwl9CisKKwlpZiAoZy5nbF9wYXRoYykKKwkJZ2xvYmZyZWUoJmcpOworCWlmIChwYXRoMSkKKwkJeGZyZWUocGF0aDEpOworCWlmIChwYXRoMikKKwkJeGZyZWUocGF0aDIpOworCisJLyogSWYgYW4gdW5pZ25vcmVkIGVycm9yIG9jY3VycyBpbiBiYXRjaCBtb2RlIHdlIHNob3VsZCBhYm9ydC4gKi8KKwlpZiAoZXJyX2Fib3J0ICYmIGVyciAhPSAwKQorCQlyZXR1cm4gKC0xKTsKKwllbHNlIGlmIChjbWRudW0gPT0gSV9RVUlUKQorCQlyZXR1cm4gKDEpOworCisJcmV0dXJuICgwKTsKK30KKworI2lmZGVmIFVTRV9MSUJFRElUCitzdGF0aWMgY2hhciAqCitwcm9tcHQoRWRpdExpbmUgKmVsKQoreworCXJldHVybiAoInNmdHA+ICIpOworfQorCisvKiBEaXNwbGF5IGVudHJpZXMgaW4gJ2xpc3QnIGFmdGVyIHNraXBwaW5nIHRoZSBmaXJzdCAnbGVuJyBjaGFycyAqLworc3RhdGljIHZvaWQKK2NvbXBsZXRlX2Rpc3BsYXkoY2hhciAqKmxpc3QsIHVfaW50IGxlbikKK3sKKwl1X2ludCB5LCBtID0gMCwgd2lkdGggPSA4MCwgY29sdW1ucyA9IDEsIGNvbHNwYWNlID0gMCwgbGxlbjsKKwlzdHJ1Y3Qgd2luc2l6ZSB3czsKKwljaGFyICp0bXA7CisKKwkvKiBDb3VudCBlbnRyaWVzIGZvciBzb3J0IGFuZCBmaW5kIGxvbmdlc3QgKi8KKwlmb3IgKHkgPSAwOyBsaXN0W3ldOyB5KyspIAorCQltID0gTUFYKG0sIHN0cmxlbihsaXN0W3ldKSk7CisKKwlpZiAoaW9jdGwoZmlsZW5vKHN0ZGluKSwgVElPQ0dXSU5TWiwgJndzKSAhPSAtMSkKKwkJd2lkdGggPSB3cy53c19jb2w7CisKKwltID0gbSA+IGxlbiA/IG0gLSBsZW4gOiAwOworCWNvbHVtbnMgPSB3aWR0aCAvIChtICsgMik7CisJY29sdW1ucyA9IE1BWChjb2x1bW5zLCAxKTsKKwljb2xzcGFjZSA9IHdpZHRoIC8gY29sdW1uczsKKwljb2xzcGFjZSA9IE1JTihjb2xzcGFjZSwgd2lkdGgpOworCisJcHJpbnRmKCJcbiIpOworCW0gPSAxOworCWZvciAoeSA9IDA7IGxpc3RbeV07IHkrKykgeworCQlsbGVuID0gc3RybGVuKGxpc3RbeV0pOworCQl0bXAgPSBsbGVuID4gbGVuID8gbGlzdFt5XSArIGxlbiA6ICIiOworCQlwcmludGYoIiUtKnMiLCBjb2xzcGFjZSwgdG1wKTsKKwkJaWYgKG0gPj0gY29sdW1ucykgeworCQkJcHJpbnRmKCJcbiIpOworCQkJbSA9IDE7CisJCX0gZWxzZQorCQkJbSsrOworCX0KKwlwcmludGYoIlxuIik7Cit9CisKKy8qCisgKiBHaXZlbiBhICJsaXN0IiBvZiB3b3JkcyB0aGF0IGJlZ2luIHdpdGggYSBjb21tb24gcHJlZml4IG9mICJ3b3JkIiwKKyAqIGF0dGVtcHQgdG8gZmluZCBhbiBhdXRvY29tcGxldGlvbiB0byBleHRlbmRzICJ3b3JkIiBieSB0aGUgbmV4dAorICogY2hhcmFjdGVycyBjb21tb24gdG8gYWxsIGVudHJpZXMgaW4gImxpc3QiLgorICovCitzdGF0aWMgY2hhciAqCitjb21wbGV0ZV9hbWJpZ3VvdXMoY29uc3QgY2hhciAqd29yZCwgY2hhciAqKmxpc3QsIHNpemVfdCBjb3VudCkKK3sKKwlpZiAod29yZCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChjb3VudCA+IDApIHsKKwkJdV9pbnQgeSwgbWF0Y2hsZW4gPSBzdHJsZW4obGlzdFswXSk7CisKKwkJLyogRmluZCBsZW5ndGggb2YgY29tbW9uIHN0ZW0gKi8KKwkJZm9yICh5ID0gMTsgbGlzdFt5XTsgeSsrKSB7CisJCQl1X2ludCB4OworCisJCQlmb3IgKHggPSAwOyB4IDwgbWF0Y2hsZW47IHgrKykgCisJCQkJaWYgKGxpc3RbMF1beF0gIT0gbGlzdFt5XVt4XSkgCisJCQkJCWJyZWFrOworCisJCQltYXRjaGxlbiA9IHg7CisJCX0KKworCQlpZiAobWF0Y2hsZW4gPiBzdHJsZW4od29yZCkpIHsKKwkJCWNoYXIgKnRtcCA9IHhzdHJkdXAobGlzdFswXSk7CisKKwkJCXRtcFttYXRjaGxlbl0gPSAnXDAnOworCQkJcmV0dXJuIHRtcDsKKwkJfQorCX0gCisKKwlyZXR1cm4geHN0cmR1cCh3b3JkKTsKK30KKworLyogQXV0b2NvbXBsZXRlIGEgc2Z0cCBjb21tYW5kICovCitzdGF0aWMgaW50Citjb21wbGV0ZV9jbWRfcGFyc2UoRWRpdExpbmUgKmVsLCBjaGFyICpjbWQsIGludCBsYXN0YXJnLCBjaGFyIHF1b3RlLAorICAgIGludCB0ZXJtaW5hdGVkKQoreworCXVfaW50IHksIGNvdW50ID0gMCwgY21kbGVuLCB0bXBsZW47CisJY2hhciAqdG1wLCAqKmxpc3QsIGFyZ3Rlcm1bM107CisJY29uc3QgTGluZUluZm8gKmxmOworCisJbGlzdCA9IHhjYWxsb2MoKHNpemVvZihjbWRzKSAvIHNpemVvZigqY21kcykpICsgMSwgc2l6ZW9mKGNoYXIgKikpOworCisJLyogTm8gY29tbWFuZCBzcGVjaWZpZWQ6IGRpc3BsYXkgYWxsIGF2YWlsYWJsZSBjb21tYW5kcyAqLworCWlmIChjbWQgPT0gTlVMTCkgeworCQlmb3IgKHkgPSAwOyBjbWRzW3ldLmM7IHkrKykKKwkJCWxpc3RbY291bnQrK10gPSB4c3RyZHVwKGNtZHNbeV0uYyk7CisJCQorCQlsaXN0W2NvdW50XSA9IE5VTEw7CisJCWNvbXBsZXRlX2Rpc3BsYXkobGlzdCwgMCk7CisKKwkJZm9yICh5ID0gMDsgbGlzdFt5XSAhPSBOVUxMOyB5KyspICAKKwkJCXhmcmVlKGxpc3RbeV0pOwkKKwkJeGZyZWUobGlzdCk7CisJCXJldHVybiBjb3VudDsKKwl9CisKKwkvKiBQcmVwYXJlIHN1YnNldCBvZiBjb21tYW5kcyB0aGF0IHN0YXJ0IHdpdGggImNtZCIgKi8KKwljbWRsZW4gPSBzdHJsZW4oY21kKTsKKwlmb3IgKHkgPSAwOyBjbWRzW3ldLmM7IHkrKykgIHsKKwkJaWYgKCFzdHJuY2FzZWNtcChjbWQsIGNtZHNbeV0uYywgY21kbGVuKSkgCisJCQlsaXN0W2NvdW50KytdID0geHN0cmR1cChjbWRzW3ldLmMpOworCX0KKwlsaXN0W2NvdW50XSA9IE5VTEw7CisKKwlpZiAoY291bnQgPT0gMCkgeworCQl4ZnJlZShsaXN0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ29tcGxldGUgYW1iaWdpb3VzIGNvbW1hbmQgKi8KKwl0bXAgPSBjb21wbGV0ZV9hbWJpZ3VvdXMoY21kLCBsaXN0LCBjb3VudCk7CisJaWYgKGNvdW50ID4gMSkKKwkJY29tcGxldGVfZGlzcGxheShsaXN0LCAwKTsKKworCWZvciAoeSA9IDA7IGxpc3RbeV07IHkrKykgIAorCQl4ZnJlZShsaXN0W3ldKTsJCisJeGZyZWUobGlzdCk7CisKKwlpZiAodG1wICE9IE5VTEwpIHsKKwkJdG1wbGVuID0gc3RybGVuKHRtcCk7CisJCWNtZGxlbiA9IHN0cmxlbihjbWQpOworCQkvKiBJZiBjbWQgbWF5IGJlIGV4dGVuZGVkIHRoZW4gZG8gc28gKi8KKwkJaWYgKHRtcGxlbiA+IGNtZGxlbikKKwkJCWlmIChlbF9pbnNlcnRzdHIoZWwsIHRtcCArIGNtZGxlbikgPT0gLTEpCisJCQkJZmF0YWwoImVsX2luc2VydHN0ciBmYWlsZWQuIik7CisJCWxmID0gZWxfbGluZShlbCk7CisJCS8qIFRlcm1pbmF0ZSBhcmd1bWVudCBjbGVhbmx5ICovCisJCWlmIChjb3VudCA9PSAxKSB7CisJCQl5ID0gMDsKKwkJCWlmICghdGVybWluYXRlZCkKKwkJCQlhcmd0ZXJtW3krK10gPSBxdW90ZTsKKwkJCWlmIChsYXN0YXJnIHx8ICoobGYtPmN1cnNvcikgIT0gJyAnKQorCQkJCWFyZ3Rlcm1beSsrXSA9ICcgJzsKKwkJCWFyZ3Rlcm1beV0gPSAnXDAnOworCQkJaWYgKHkgPiAwICYmIGVsX2luc2VydHN0cihlbCwgYXJndGVybSkgPT0gLTEpCisJCQkJZmF0YWwoImVsX2luc2VydHN0ciBmYWlsZWQuIik7CisJCX0KKwkJeGZyZWUodG1wKTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qCisgKiBEZXRlcm1pbmUgd2hldGhlciBhIHBhcnRpY3VsYXIgc2Z0cCBjb21tYW5kJ3MgYXJndW1lbnRzIChpZiBhbnkpCisgKiByZXByZXNlbnQgbG9jYWwgb3IgcmVtb3RlIGZpbGVzLgorICovCitzdGF0aWMgaW50Citjb21wbGV0ZV9pc19yZW1vdGUoY2hhciAqY21kKSB7CisJaW50IGk7CisKKwlpZiAoY21kID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWZvciAoaSA9IDA7IGNtZHNbaV0uYzsgaSsrKSB7CisJCWlmICghc3RybmNhc2VjbXAoY21kLCBjbWRzW2ldLmMsIHN0cmxlbihjbWRzW2ldLmMpKSkgCisJCQlyZXR1cm4gY21kc1tpXS50OworCX0KKworCXJldHVybiAtMTsKK30KKworLyogQXV0b2NvbXBsZXRlIGEgZmlsZW5hbWUgImZpbGUiICovCitzdGF0aWMgaW50Citjb21wbGV0ZV9tYXRjaChFZGl0TGluZSAqZWwsIHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIGNoYXIgKnJlbW90ZV9wYXRoLAorICAgIGNoYXIgKmZpbGUsIGludCByZW1vdGUsIGludCBsYXN0YXJnLCBjaGFyIHF1b3RlLCBpbnQgdGVybWluYXRlZCkKK3sKKwlnbG9iX3QgZzsKKwljaGFyICp0bXAsICp0bXAyLCBpbnNbM107CisJdV9pbnQgaSwgaGFkZ2xvYiwgcHdkbGVuLCBsZW4sIHRtcGxlbiwgZmlsZWxlbjsKKwljb25zdCBMaW5lSW5mbyAqbGY7CisJCisJLyogR2xvYiBmcm9tICJmaWxlIiBsb2NhdGlvbiAqLworCWlmIChmaWxlID09IE5VTEwpCisJCXRtcCA9IHhzdHJkdXAoIioiKTsKKwllbHNlCisJCXhhc3ByaW50ZigmdG1wLCAiJXMqIiwgZmlsZSk7CisKKwltZW1zZXQoJmcsIDAsIHNpemVvZihnKSk7CisJaWYgKHJlbW90ZSAhPSBMT0NBTCkgeworCQl0bXAgPSBtYWtlX2Fic29sdXRlKHRtcCwgcmVtb3RlX3BhdGgpOworCQlyZW1vdGVfZ2xvYihjb25uLCB0bXAsIEdMT0JfRE9PRkZTfEdMT0JfTUFSSywgTlVMTCwgJmcpOworCX0gZWxzZSAKKwkJZ2xvYih0bXAsIEdMT0JfRE9PRkZTfEdMT0JfTUFSSywgTlVMTCwgJmcpOworCQorCS8qIERldGVybWluZSBsZW5ndGggb2YgcHdkIHNvIHdlIGNhbiB0cmltIGNvbXBsZXRpb24gZGlzcGxheSAqLworCWZvciAoaGFkZ2xvYiA9IHRtcGxlbiA9IHB3ZGxlbiA9IDA7IHRtcFt0bXBsZW5dICE9IDA7IHRtcGxlbisrKSB7CisJCS8qIFRlcm1pbmF0ZSBjb3VudGluZyBvbiBmaXJzdCB1bmVzY2FwZWQgZ2xvYiBtZXRhY2hhcmFjdGVyICovCisJCWlmICh0bXBbdG1wbGVuXSA9PSAnKicgfHwgdG1wW3RtcGxlbl0gPT0gJz8nKSB7CisJCQlpZiAodG1wW3RtcGxlbl0gIT0gJyonIHx8IHRtcFt0bXBsZW4gKyAxXSAhPSAnXDAnKQorCQkJCWhhZGdsb2IgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHRtcFt0bXBsZW5dID09ICdcXCcgJiYgdG1wW3RtcGxlbiArIDFdICE9ICdcMCcpCisJCQl0bXBsZW4rKzsKKwkJaWYgKHRtcFt0bXBsZW5dID09ICcvJykKKwkJCXB3ZGxlbiA9IHRtcGxlbiArIDE7CS8qIHRyYWNrIGxhc3Qgc2VlbiAnLycgKi8KKwl9CisJeGZyZWUodG1wKTsKKworCWlmIChnLmdsX21hdGNoYyA9PSAwKSAKKwkJZ290byBvdXQ7CisKKwlpZiAoZy5nbF9tYXRjaGMgPiAxKQorCQljb21wbGV0ZV9kaXNwbGF5KGcuZ2xfcGF0aHYsIHB3ZGxlbik7CisKKwl0bXAgPSBOVUxMOworCS8qIERvbid0IHRyeSB0byBleHRlbmQgZ2xvYnMgKi8KKwlpZiAoZmlsZSA9PSBOVUxMIHx8IGhhZGdsb2IpCisJCWdvdG8gb3V0OworCisJdG1wMiA9IGNvbXBsZXRlX2FtYmlndW91cyhmaWxlLCBnLmdsX3BhdGh2LCBnLmdsX21hdGNoYyk7CisJdG1wID0gcGF0aF9zdHJpcCh0bXAyLCByZW1vdGVfcGF0aCk7CisJeGZyZWUodG1wMik7CisKKwlpZiAodG1wID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJdG1wbGVuID0gc3RybGVuKHRtcCk7CisJZmlsZWxlbiA9IHN0cmxlbihmaWxlKTsKKworCWlmICh0bXBsZW4gPiBmaWxlbGVuKSAgeworCQl0bXAyID0gdG1wICsgZmlsZWxlbjsKKwkJbGVuID0gc3RybGVuKHRtcDIpOyAKKwkJLyogcXVvdGUgYXJndW1lbnQgb24gd2F5IG91dCAqLworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJCWluc1swXSA9ICdcXCc7CisJCQlpbnNbMV0gPSB0bXAyW2ldOworCQkJaW5zWzJdID0gJ1wwJzsKKwkJCXN3aXRjaCAodG1wMltpXSkgeworCQkJY2FzZSAnXCcnOgorCQkJY2FzZSAnIic6CisJCQljYXNlICdcXCc6CisJCQljYXNlICdcdCc6CisJCQljYXNlICdbJzoKKwkJCWNhc2UgJyAnOgorCQkJCWlmIChxdW90ZSA9PSAnXDAnIHx8IHRtcDJbaV0gPT0gcXVvdGUpIHsKKwkJCQkJaWYgKGVsX2luc2VydHN0cihlbCwgaW5zKSA9PSAtMSkKKwkJCQkJCWZhdGFsKCJlbF9pbnNlcnRzdHIgIgorCQkJCQkJICAgICJmYWlsZWQuIik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKiBGQUxMVEhST1VHSCAqLworCQkJZGVmYXVsdDoKKwkJCQlpZiAoZWxfaW5zZXJ0c3RyKGVsLCBpbnMgKyAxKSA9PSAtMSkKKwkJCQkJZmF0YWwoImVsX2luc2VydHN0ciBmYWlsZWQuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlsZiA9IGVsX2xpbmUoZWwpOworCWlmIChnLmdsX21hdGNoYyA9PSAxKSB7CisJCWkgPSAwOworCQlpZiAoIXRlcm1pbmF0ZWQpCisJCQlpbnNbaSsrXSA9IHF1b3RlOworCQlpZiAoKihsZi0+Y3Vyc29yIC0gMSkgIT0gJy8nICYmCisJCSAgICAobGFzdGFyZyB8fCAqKGxmLT5jdXJzb3IpICE9ICcgJykpCisJCQlpbnNbaSsrXSA9ICcgJzsKKwkJaW5zW2ldID0gJ1wwJzsKKwkJaWYgKGkgPiAwICYmIGVsX2luc2VydHN0cihlbCwgaW5zKSA9PSAtMSkKKwkJCWZhdGFsKCJlbF9pbnNlcnRzdHIgZmFpbGVkLiIpOworCX0KKwl4ZnJlZSh0bXApOworCisgb3V0OgorCWdsb2JmcmVlKCZnKTsKKwlyZXR1cm4gZy5nbF9tYXRjaGM7Cit9CisKKy8qIHRhYi1jb21wbGV0aW9uIGhvb2sgZnVuY3Rpb24sIGNhbGxlZCB2aWEgbGliZWRpdCAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIKK2NvbXBsZXRlKEVkaXRMaW5lICplbCwgaW50IGNoKQoreworCWNoYXIgKiphcmd2LCAqbGluZSwgcXVvdGU7IAorCXVfaW50IGFyZ2MsIGNhcmcsIGN1cnNvciwgbGVuLCB0ZXJtaW5hdGVkLCByZXQgPSBDQ19FUlJPUjsKKwljb25zdCBMaW5lSW5mbyAqbGY7CisJc3RydWN0IGNvbXBsZXRlX2N0eCAqY29tcGxldGVfY3R4OworCisJbGYgPSBlbF9saW5lKGVsKTsKKwlpZiAoZWxfZ2V0KGVsLCBFTF9DTElFTlREQVRBLCAodm9pZCoqKSZjb21wbGV0ZV9jdHgpICE9IDApCisJCWZhdGFsKCIlczogZWxfZ2V0IGZhaWxlZCIsIF9fZnVuY19fKTsKKworCS8qIEZpZ3VyZSBvdXQgd2hpY2ggYXJndW1lbnQgdGhlIGN1cnNvciBwb2ludHMgdG8gKi8KKwljdXJzb3IgPSBsZi0+Y3Vyc29yIC0gbGYtPmJ1ZmZlcjsKKwlsaW5lID0gKGNoYXIgKil4bWFsbG9jKGN1cnNvciArIDEpOworCW1lbWNweShsaW5lLCBsZi0+YnVmZmVyLCBjdXJzb3IpOworCWxpbmVbY3Vyc29yXSA9ICdcMCc7CisJYXJndiA9IG1ha2Vhcmd2KGxpbmUsICZjYXJnLCAxLCAmcXVvdGUsICZ0ZXJtaW5hdGVkKTsKKwl4ZnJlZShsaW5lKTsKKworCS8qIEdldCBhbGwgdGhlIGFyZ3VtZW50cyBvbiB0aGUgbGluZSAqLworCWxlbiA9IGxmLT5sYXN0Y2hhciAtIGxmLT5idWZmZXI7CisJbGluZSA9IChjaGFyICopeG1hbGxvYyhsZW4gKyAxKTsKKwltZW1jcHkobGluZSwgbGYtPmJ1ZmZlciwgbGVuKTsKKwlsaW5lW2xlbl0gPSAnXDAnOworCWFyZ3YgPSBtYWtlYXJndihsaW5lLCAmYXJnYywgMSwgTlVMTCwgTlVMTCk7CisKKwkvKiBFbnN1cmUgY3Vyc29yIGlzIGF0IEVPTCBvciBhIGFyZ3VtZW50IGJvdW5kYXJ5ICovCisJaWYgKGxpbmVbY3Vyc29yXSAhPSAnICcgJiYgbGluZVtjdXJzb3JdICE9ICdcMCcgJiYKKwkgICAgbGluZVtjdXJzb3JdICE9ICdcbicpIHsKKwkJeGZyZWUobGluZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGNhcmcgPT0gMCkgeworCQkvKiBTaG93IGFsbCBhdmFpbGFibGUgY29tbWFuZHMgKi8KKwkJY29tcGxldGVfY21kX3BhcnNlKGVsLCBOVUxMLCBhcmdjID09IGNhcmcsICdcMCcsIDEpOworCQlyZXQgPSBDQ19SRURJU1BMQVk7CisJfSBlbHNlIGlmIChjYXJnID09IDEgJiYgY3Vyc29yID4gMCAmJiBsaW5lW2N1cnNvciAtIDFdICE9ICcgJykgIHsKKwkJLyogSGFuZGxlIHRoZSBjb21tYW5kIHBhcnNpbmcgKi8KKwkJaWYgKGNvbXBsZXRlX2NtZF9wYXJzZShlbCwgYXJndlswXSwgYXJnYyA9PSBjYXJnLAorCQkgICAgcXVvdGUsIHRlcm1pbmF0ZWQpICE9IDApIAorCQkJcmV0ID0gQ0NfUkVESVNQTEFZOworCX0gZWxzZSBpZiAoY2FyZyA+PSAxKSB7CisJCS8qIEhhbmRsZSBmaWxlIHBhcnNpbmcgKi8KKwkJaW50IHJlbW90ZSA9IGNvbXBsZXRlX2lzX3JlbW90ZShhcmd2WzBdKTsKKwkJY2hhciAqZmlsZW1hdGNoID0gTlVMTDsKKworCQlpZiAoY2FyZyA+IDEgJiYgbGluZVtjdXJzb3ItMV0gIT0gJyAnKQorCQkJZmlsZW1hdGNoID0gYXJndltjYXJnIC0gMV07CisKKwkJaWYgKHJlbW90ZSAhPSAwICYmCisJCSAgICBjb21wbGV0ZV9tYXRjaChlbCwgY29tcGxldGVfY3R4LT5jb25uLAorCQkgICAgKmNvbXBsZXRlX2N0eC0+cmVtb3RlX3BhdGhwLCBmaWxlbWF0Y2gsCisJCSAgICByZW1vdGUsIGNhcmcgPT0gYXJnYywgcXVvdGUsIHRlcm1pbmF0ZWQpICE9IDApIAorCQkJcmV0ID0gQ0NfUkVESVNQTEFZOworCX0KKworCXhmcmVlKGxpbmUpOwkKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmIC8qIFVTRV9MSUJFRElUICovCisKK2ludAoraW50ZXJhY3RpdmVfbG9vcChzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpmaWxlMSwgY2hhciAqZmlsZTIpCit7CisJY2hhciAqcmVtb3RlX3BhdGg7CisJY2hhciAqZGlyID0gTlVMTDsKKwljaGFyIGNtZFsyMDQ4XTsKKwlpbnQgZXJyLCBpbnRlcmFjdGl2ZTsKKwlFZGl0TGluZSAqZWwgPSBOVUxMOworI2lmZGVmIFVTRV9MSUJFRElUCisJSGlzdG9yeSAqaGwgPSBOVUxMOworCUhpc3RFdmVudCBoZXY7CisJZXh0ZXJuIGNoYXIgKl9fcHJvZ25hbWU7CisJc3RydWN0IGNvbXBsZXRlX2N0eCBjb21wbGV0ZV9jdHg7CisKKwlpZiAoIWJhdGNobW9kZSAmJiBpc2F0dHkoU1RESU5fRklMRU5PKSkgeworCQlpZiAoKGVsID0gZWxfaW5pdChfX3Byb2duYW1lLCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIpKSA9PSBOVUxMKQorCQkJZmF0YWwoIkNvdWxkbid0IGluaXRpYWxpc2UgZWRpdGxpbmUiKTsKKwkJaWYgKChobCA9IGhpc3RvcnlfaW5pdCgpKSA9PSBOVUxMKQorCQkJZmF0YWwoIkNvdWxkbid0IGluaXRpYWxpc2UgZWRpdGxpbmUgaGlzdG9yeSIpOworCQloaXN0b3J5KGhsLCAmaGV2LCBIX1NFVFNJWkUsIDEwMCk7CisJCWVsX3NldChlbCwgRUxfSElTVCwgaGlzdG9yeSwgaGwpOworCisJCWVsX3NldChlbCwgRUxfUFJPTVBULCBwcm9tcHQpOworCQllbF9zZXQoZWwsIEVMX0VESVRPUiwgImVtYWNzIik7CisJCWVsX3NldChlbCwgRUxfVEVSTUlOQUwsIE5VTEwpOworCQllbF9zZXQoZWwsIEVMX1NJR05BTCwgMSk7CisJCWVsX3NvdXJjZShlbCwgTlVMTCk7CisKKwkJLyogVGFiIENvbXBsZXRpb24gKi8KKwkJZWxfc2V0KGVsLCBFTF9BRERGTiwgImZ0cC1jb21wbGV0ZSIsIAorCQkgICAgIkNvbnRleHQgc2Vuc2l0aXZlIGFyZ3VtZW50IGNvbXBsZXRpb24iLCBjb21wbGV0ZSk7CisJCWNvbXBsZXRlX2N0eC5jb25uID0gY29ubjsKKwkJY29tcGxldGVfY3R4LnJlbW90ZV9wYXRocCA9ICZyZW1vdGVfcGF0aDsKKwkJZWxfc2V0KGVsLCBFTF9DTElFTlREQVRBLCAodm9pZCopJmNvbXBsZXRlX2N0eCk7CisJCWVsX3NldChlbCwgRUxfQklORCwgIl5JIiwgImZ0cC1jb21wbGV0ZSIsIE5VTEwpOworCX0KKyNlbmRpZiAvKiBVU0VfTElCRURJVCAqLworCisJcmVtb3RlX3BhdGggPSBkb19yZWFscGF0aChjb25uLCAiLiIpOworCWlmIChyZW1vdGVfcGF0aCA9PSBOVUxMKQorCQlmYXRhbCgiTmVlZCBjd2QiKTsKKworCWlmIChmaWxlMSAhPSBOVUxMKSB7CisJCWRpciA9IHhzdHJkdXAoZmlsZTEpOworCQlkaXIgPSBtYWtlX2Fic29sdXRlKGRpciwgcmVtb3RlX3BhdGgpOworCisJCWlmIChyZW1vdGVfaXNfZGlyKGNvbm4sIGRpcikgJiYgZmlsZTIgPT0gTlVMTCkgeworCQkJcHJpbnRmKCJDaGFuZ2luZyB0bzogJXNcbiIsIGRpcik7CisJCQlzbnByaW50ZihjbWQsIHNpemVvZiBjbWQsICJjZCBcIiVzXCIiLCBkaXIpOworCQkJaWYgKHBhcnNlX2Rpc3BhdGNoX2NvbW1hbmQoY29ubiwgY21kLAorCQkJICAgICZyZW1vdGVfcGF0aCwgMSkgIT0gMCkgeworCQkJCXhmcmVlKGRpcik7CisJCQkJeGZyZWUocmVtb3RlX3BhdGgpOworCQkJCXhmcmVlKGNvbm4pOworCQkJCXJldHVybiAoLTEpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGZpbGUyID09IE5VTEwpCisJCQkJc25wcmludGYoY21kLCBzaXplb2YgY21kLCAiZ2V0ICVzIiwgZGlyKTsKKwkJCWVsc2UKKwkJCQlzbnByaW50ZihjbWQsIHNpemVvZiBjbWQsICJnZXQgJXMgJXMiLCBkaXIsCisJCQkJICAgIGZpbGUyKTsKKworCQkJZXJyID0gcGFyc2VfZGlzcGF0Y2hfY29tbWFuZChjb25uLCBjbWQsCisJCQkgICAgJnJlbW90ZV9wYXRoLCAxKTsKKwkJCXhmcmVlKGRpcik7CisJCQl4ZnJlZShyZW1vdGVfcGF0aCk7CisJCQl4ZnJlZShjb25uKTsKKwkJCXJldHVybiAoZXJyKTsKKwkJfQorCQl4ZnJlZShkaXIpOworCX0KKworI2lmIGRlZmluZWQoSEFWRV9TRVRWQlVGKSAmJiAhZGVmaW5lZChCUk9LRU5fU0VUVkJVRikKKwlzZXR2YnVmKHN0ZG91dCwgTlVMTCwgX0lPTEJGLCAwKTsKKwlzZXR2YnVmKGluZmlsZSwgTlVMTCwgX0lPTEJGLCAwKTsKKyNlbHNlCisJc2V0bGluZWJ1ZihzdGRvdXQpOworCXNldGxpbmVidWYoaW5maWxlKTsKKyNlbmRpZgorCisJaW50ZXJhY3RpdmUgPSAhYmF0Y2htb2RlICYmIGlzYXR0eShTVERJTl9GSUxFTk8pOworCWVyciA9IDA7CisJZm9yICg7OykgeworCQljaGFyICpjcDsKKworCQlzaWduYWwoU0lHSU5ULCBTSUdfSUdOKTsKKworCQlpZiAoZWwgPT0gTlVMTCkgeworCQkJaWYgKGludGVyYWN0aXZlKQorCQkJCXByaW50Zigic2Z0cD4gIik7CisJCQlpZiAoZmdldHMoY21kLCBzaXplb2YoY21kKSwgaW5maWxlKSA9PSBOVUxMKSB7CisJCQkJaWYgKGludGVyYWN0aXZlKQorCQkJCQlwcmludGYoIlxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIWludGVyYWN0aXZlKSB7IC8qIEVjaG8gY29tbWFuZCAqLworCQkJCXByaW50Zigic2Z0cD4gJXMiLCBjbWQpOworCQkJCWlmIChzdHJsZW4oY21kKSA+IDAgJiYKKwkJCQkgICAgY21kW3N0cmxlbihjbWQpIC0gMV0gIT0gJ1xuJykKKwkJCQkJcHJpbnRmKCJcbiIpOworCQkJfQorCQl9IGVsc2UgeworI2lmZGVmIFVTRV9MSUJFRElUCisJCQljb25zdCBjaGFyICpsaW5lOworCQkJaW50IGNvdW50ID0gMDsKKworCQkJaWYgKChsaW5lID0gZWxfZ2V0cyhlbCwgJmNvdW50KSkgPT0gTlVMTCB8fAorCQkJICAgIGNvdW50IDw9IDApIHsKKwkJCQlwcmludGYoIlxuIik7CisgCQkJCWJyZWFrOworCQkJfQorCQkJaGlzdG9yeShobCwgJmhldiwgSF9FTlRFUiwgbGluZSk7CisJCQlpZiAoc3RybGNweShjbWQsIGxpbmUsIHNpemVvZihjbWQpKSA+PSBzaXplb2YoY21kKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IGlucHV0IGxpbmUgdG9vIGxvbmdcbiIpOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmIC8qIFVTRV9MSUJFRElUICovCisJCX0KKworCQljcCA9IHN0cnJjaHIoY21kLCAnXG4nKTsKKwkJaWYgKGNwKQorCQkJKmNwID0gJ1wwJzsKKworCQkvKiBIYW5kbGUgdXNlciBpbnRlcnJ1cHRzIGdyYWNlZnVsbHkgZHVyaW5nIGNvbW1hbmRzICovCisJCWludGVycnVwdGVkID0gMDsKKwkJc2lnbmFsKFNJR0lOVCwgY21kX2ludGVycnVwdCk7CisKKwkJZXJyID0gcGFyc2VfZGlzcGF0Y2hfY29tbWFuZChjb25uLCBjbWQsICZyZW1vdGVfcGF0aCwKKwkJICAgIGJhdGNobW9kZSk7CisJCWlmIChlcnIgIT0gMCkKKwkJCWJyZWFrOworCX0KKwl4ZnJlZShyZW1vdGVfcGF0aCk7CisJeGZyZWUoY29ubik7CisKKyNpZmRlZiBVU0VfTElCRURJVAorCWlmIChlbCAhPSBOVUxMKQorCQllbF9lbmQoZWwpOworI2VuZGlmIC8qIFVTRV9MSUJFRElUICovCisKKwkvKiBlcnIgPT0gMSBzaWduaWZpZXMgbm9ybWFsICJxdWl0IiBleGl0ICovCisJcmV0dXJuIChlcnIgPj0gMCA/IDAgOiAtMSk7Cit9CisKK3N0YXRpYyB2b2lkCitjb25uZWN0X3RvX3NlcnZlcihjaGFyICpwYXRoLCBjaGFyICoqYXJncywgaW50ICppbiwgaW50ICpvdXQpCit7CisJaW50IGNfaW4sIGNfb3V0OworCisjaWZkZWYgVVNFX1BJUEVTCisJaW50IHBpblsyXSwgcG91dFsyXTsKKworCWlmICgocGlwZShwaW4pID09IC0xKSB8fCAocGlwZShwb3V0KSA9PSAtMSkpCisJCWZhdGFsKCJwaXBlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJKmluID0gcGluWzBdOworCSpvdXQgPSBwb3V0WzFdOworCWNfaW4gPSBwb3V0WzBdOworCWNfb3V0ID0gcGluWzFdOworI2Vsc2UgLyogVVNFX1BJUEVTICovCisJaW50IGlub3V0WzJdOworCisJaWYgKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsIGlub3V0KSA9PSAtMSkKKwkJZmF0YWwoInNvY2tldHBhaXI6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkqaW4gPSAqb3V0ID0gaW5vdXRbMF07CisJY19pbiA9IGNfb3V0ID0gaW5vdXRbMV07CisjZW5kaWYgLyogVVNFX1BJUEVTICovCisKKwlpZiAoKHNzaHBpZCA9IGZvcmsoKSkgPT0gLTEpCisJCWZhdGFsKCJmb3JrOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJZWxzZSBpZiAoc3NocGlkID09IDApIHsKKwkJaWYgKChkdXAyKGNfaW4sIFNURElOX0ZJTEVOTykgPT0gLTEpIHx8CisJCSAgICAoZHVwMihjX291dCwgU1RET1VUX0ZJTEVOTykgPT0gLTEpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImR1cDI6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQkJX2V4aXQoMSk7CisJCX0KKwkJY2xvc2UoKmluKTsKKwkJY2xvc2UoKm91dCk7CisJCWNsb3NlKGNfaW4pOworCQljbG9zZShjX291dCk7CisKKwkJLyoKKwkJICogVGhlIHVuZGVybHlpbmcgc3NoIGlzIGluIHRoZSBzYW1lIHByb2Nlc3MgZ3JvdXAsIHNvIHdlIG11c3QKKwkJICogaWdub3JlIFNJR0lOVCBpZiB3ZSB3YW50IHRvIGdyYWNlZnVsbHkgYWJvcnQgY29tbWFuZHMsCisJCSAqIG90aGVyd2lzZSB0aGUgc2lnbmFsIHdpbGwgbWFrZSBpdCB0byB0aGUgc3NoIHByb2Nlc3MgYW5kCisJCSAqIGtpbGwgaXQgdG9vLiAgQ29udHJhd2lzZSwgc2luY2Ugc2Z0cCBzZW5kcyBTSUdURVJNcyB0byB0aGUKKwkJICogdW5kZXJseWluZyBzc2gsIGl0IG11c3QgKm5vdCogaWdub3JlIHRoYXQgc2lnbmFsLgorCQkgKi8KKwkJc2lnbmFsKFNJR0lOVCwgU0lHX0lHTik7CisJCXNpZ25hbChTSUdURVJNLCBTSUdfREZMKTsKKwkJZXhlY3ZwKHBhdGgsIGFyZ3MpOworCQlmcHJpbnRmKHN0ZGVyciwgImV4ZWM6ICVzOiAlc1xuIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJX2V4aXQoMSk7CisJfQorCisJc2lnbmFsKFNJR1RFUk0sIGtpbGxjaGlsZCk7CisJc2lnbmFsKFNJR0lOVCwga2lsbGNoaWxkKTsKKwlzaWduYWwoU0lHSFVQLCBraWxsY2hpbGQpOworCWNsb3NlKGNfaW4pOworCWNsb3NlKGNfb3V0KTsKK30KKworc3RhdGljIHZvaWQKK3VzYWdlKHZvaWQpCit7CisJZXh0ZXJuIGNoYXIgKl9fcHJvZ25hbWU7CisKKwlmcHJpbnRmKHN0ZGVyciwKKwkgICAgInVzYWdlOiAlcyBbLTEyNDZDcHFydl0gWy1CIGJ1ZmZlcl9zaXplXSBbLWIgYmF0Y2hmaWxlXSBbLWMgY2lwaGVyXVxuIgorCSAgICAiICAgICAgICAgIFstRCBzZnRwX3NlcnZlcl9wYXRoXSBbLUYgc3NoX2NvbmZpZ10gIgorCSAgICAiWy1pIGlkZW50aXR5X2ZpbGVdIFstbCBsaW1pdF1cbiIKKwkgICAgIiAgICAgICAgICBbLW8gc3NoX29wdGlvbl0gWy1QIHBvcnRdIFstUiBudW1fcmVxdWVzdHNdICIKKwkgICAgIlstUyBwcm9ncmFtXVxuIgorCSAgICAiICAgICAgICAgIFstcyBzdWJzeXN0ZW0gfCBzZnRwX3NlcnZlcl0gaG9zdFxuIgorCSAgICAiICAgICAgICVzIFt1c2VyQF1ob3N0WzpmaWxlIC4uLl1cbiIKKwkgICAgIiAgICAgICAlcyBbdXNlckBdaG9zdFs6ZGlyWy9dXVxuIgorCSAgICAiICAgICAgICVzIC1iIGJhdGNoZmlsZSBbdXNlckBdaG9zdFxuIiwKKwkgICAgX19wcm9nbmFtZSwgX19wcm9nbmFtZSwgX19wcm9nbmFtZSwgX19wcm9nbmFtZSk7CisJZXhpdCgxKTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaW4sIG91dCwgY2gsIGVycjsKKwljaGFyICpob3N0ID0gTlVMTCwgKnVzZXJob3N0LCAqY3AsICpmaWxlMiA9IE5VTEw7CisJaW50IGRlYnVnX2xldmVsID0gMCwgc3NodmVyID0gMjsKKwljaGFyICpmaWxlMSA9IE5VTEwsICpzZnRwX3NlcnZlciA9IE5VTEw7CisJY2hhciAqc3NoX3Byb2dyYW0gPSBfUEFUSF9TU0hfUFJPR1JBTSwgKnNmdHBfZGlyZWN0ID0gTlVMTDsKKwljb25zdCBjaGFyICplcnJzdHI7CisJTG9nTGV2ZWwgbGwgPSBTWVNMT0dfTEVWRUxfSU5GTzsKKwlhcmdsaXN0IGFyZ3M7CisJZXh0ZXJuIGludCBvcHRpbmQ7CisJZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKwlzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uOworCXNpemVfdCBjb3B5X2J1ZmZlcl9sZW4gPSBERUZBVUxUX0NPUFlfQlVGTEVOOworCXNpemVfdCBudW1fcmVxdWVzdHMgPSBERUZBVUxUX05VTV9SRVFVRVNUUzsKKwlsb25nIGxvbmcgbGltaXRfa2JwcyA9IDA7CisKKwkvKiBFbnN1cmUgdGhhdCBmZHMgMCwgMSBhbmQgMiBhcmUgb3BlbiBvciBkaXJlY3RlZCB0byAvZGV2L251bGwgKi8KKwlzYW5pdGlzZV9zdGRmZCgpOworCisJX19wcm9nbmFtZSA9IHNzaF9nZXRfcHJvZ25hbWUoYXJndlswXSk7CisJbWVtc2V0KCZhcmdzLCAnXDAnLCBzaXplb2YoYXJncykpOworCWFyZ3MubGlzdCA9IE5VTEw7CisJYWRkYXJncygmYXJncywgIiVzIiwgc3NoX3Byb2dyYW0pOworCWFkZGFyZ3MoJmFyZ3MsICItb0ZvcndhcmRYMTEgbm8iKTsKKwlhZGRhcmdzKCZhcmdzLCAiLW9Gb3J3YXJkQWdlbnQgbm8iKTsKKwlhZGRhcmdzKCZhcmdzLCAiLW9QZXJtaXRMb2NhbENvbW1hbmQgbm8iKTsKKwlhZGRhcmdzKCZhcmdzLCAiLW9DbGVhckFsbEZvcndhcmRpbmdzIHllcyIpOworCisJbGwgPSBTWVNMT0dfTEVWRUxfSU5GTzsKKwlpbmZpbGUgPSBzdGRpbjsKKworCXdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwKKwkgICAgIjEyNDZocHFydkNjOkQ6aTpsOm86czpTOmI6QjpGOlA6UjoiKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChjaCkgeworCQkvKiBQYXNzZWQgdGhyb3VnaCB0byBzc2goMSkgKi8KKwkJY2FzZSAnNCc6CisJCWNhc2UgJzYnOgorCQljYXNlICdDJzoKKwkJCWFkZGFyZ3MoJmFyZ3MsICItJWMiLCBjaCk7CisJCQlicmVhazsKKwkJLyogUGFzc2VkIHRocm91Z2ggdG8gc3NoKDEpIHdpdGggYXJndW1lbnQgKi8KKwkJY2FzZSAnRic6CisJCWNhc2UgJ2MnOgorCQljYXNlICdpJzoKKwkJY2FzZSAnbyc6CisJCQlhZGRhcmdzKCZhcmdzLCAiLSVjIiwgY2gpOworCQkJYWRkYXJncygmYXJncywgIiVzIiwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdxJzoKKwkJCXNob3dwcm9ncmVzcyA9IDA7CisJCQlhZGRhcmdzKCZhcmdzLCAiLSVjIiwgY2gpOworCQkJYnJlYWs7CisJCWNhc2UgJ1AnOgorCQkJYWRkYXJncygmYXJncywgIi1vUG9ydCAlcyIsIG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQlpZiAoZGVidWdfbGV2ZWwgPCAzKSB7CisJCQkJYWRkYXJncygmYXJncywgIi12Iik7CisJCQkJbGwgPSBTWVNMT0dfTEVWRUxfREVCVUcxICsgZGVidWdfbGV2ZWw7CisJCQl9CisJCQlkZWJ1Z19sZXZlbCsrOworCQkJYnJlYWs7CisJCWNhc2UgJzEnOgorCQkJc3NodmVyID0gMTsKKwkJCWlmIChzZnRwX3NlcnZlciA9PSBOVUxMKQorCQkJCXNmdHBfc2VydmVyID0gX1BBVEhfU0ZUUF9TRVJWRVI7CisJCQlicmVhazsKKwkJY2FzZSAnMic6CisJCQlzc2h2ZXIgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgJ0InOgorCQkJY29weV9idWZmZXJfbGVuID0gc3RydG9sKG9wdGFyZywgJmNwLCAxMCk7CisJCQlpZiAoY29weV9idWZmZXJfbGVuID09IDAgfHwgKmNwICE9ICdcMCcpCisJCQkJZmF0YWwoIkludmFsaWQgYnVmZmVyIHNpemUgXCIlc1wiIiwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdiJzoKKwkJCWlmIChiYXRjaG1vZGUpCisJCQkJZmF0YWwoIkJhdGNoIGZpbGUgYWxyZWFkeSBzcGVjaWZpZWQuIik7CisKKwkJCS8qIEFsbG93ICItIiBhcyBzdGRpbiAqLworCQkJaWYgKHN0cmNtcChvcHRhcmcsICItIikgIT0gMCAmJgorCQkJICAgIChpbmZpbGUgPSBmb3BlbihvcHRhcmcsICJyIikpID09IE5VTEwpCisJCQkJZmF0YWwoIiVzICglcykuIiwgc3RyZXJyb3IoZXJybm8pLCBvcHRhcmcpOworCQkJc2hvd3Byb2dyZXNzID0gMDsKKwkJCWJhdGNobW9kZSA9IDE7CisJCQlhZGRhcmdzKCZhcmdzLCAiLW9iYXRjaG1vZGUgeWVzIik7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlnbG9iYWxfcGZsYWcgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ0QnOgorCQkJc2Z0cF9kaXJlY3QgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQlsaW1pdF9rYnBzID0gc3RydG9udW0ob3B0YXJnLCAxLCAxMDAgKiAxMDI0ICogMTAyNCwKKwkJCSAgICAmZXJyc3RyKTsKKwkJCWlmIChlcnJzdHIgIT0gTlVMTCkKKwkJCQl1c2FnZSgpOworCQkJbGltaXRfa2JwcyAqPSAxMDI0OyAvKiBrYnBzICovCisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlnbG9iYWxfcmZsYWcgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ1InOgorCQkJbnVtX3JlcXVlc3RzID0gc3RydG9sKG9wdGFyZywgJmNwLCAxMCk7CisJCQlpZiAobnVtX3JlcXVlc3RzID09IDAgfHwgKmNwICE9ICdcMCcpCisJCQkJZmF0YWwoIkludmFsaWQgbnVtYmVyIG9mIHJlcXVlc3RzIFwiJXNcIiIsCisJCQkJICAgIG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlzZnRwX3NlcnZlciA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdTJzoKKwkJCXNzaF9wcm9ncmFtID0gb3B0YXJnOworCQkJcmVwbGFjZWFyZygmYXJncywgMCwgIiVzIiwgc3NoX3Byb2dyYW0pOworCQkJYnJlYWs7CisJCWNhc2UgJ2gnOgorCQlkZWZhdWx0OgorCQkJdXNhZ2UoKTsKKwkJfQorCX0KKworCWlmICghaXNhdHR5KFNUREVSUl9GSUxFTk8pKQorCQlzaG93cHJvZ3Jlc3MgPSAwOworCisJbG9nX2luaXQoYXJndlswXSwgbGwsIFNZU0xPR19GQUNJTElUWV9VU0VSLCAxKTsKKworCWlmIChzZnRwX2RpcmVjdCA9PSBOVUxMKSB7CisJCWlmIChvcHRpbmQgPT0gYXJnYyB8fCBhcmdjID4gKG9wdGluZCArIDIpKQorCQkJdXNhZ2UoKTsKKworCQl1c2VyaG9zdCA9IHhzdHJkdXAoYXJndltvcHRpbmRdKTsKKwkJZmlsZTIgPSBhcmd2W29wdGluZCsxXTsKKworCQlpZiAoKGhvc3QgPSBzdHJyY2hyKHVzZXJob3N0LCAnQCcpKSA9PSBOVUxMKQorCQkJaG9zdCA9IHVzZXJob3N0OworCQllbHNlIHsKKwkJCSpob3N0KysgPSAnXDAnOworCQkJaWYgKCF1c2VyaG9zdFswXSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiTWlzc2luZyB1c2VybmFtZVxuIik7CisJCQkJdXNhZ2UoKTsKKwkJCX0KKwkJCWFkZGFyZ3MoJmFyZ3MsICItbCIpOworCQkJYWRkYXJncygmYXJncywgIiVzIiwgdXNlcmhvc3QpOworCQl9CisKKwkJaWYgKChjcCA9IGNvbG9uKGhvc3QpKSAhPSBOVUxMKSB7CisJCQkqY3ArKyA9ICdcMCc7CisJCQlmaWxlMSA9IGNwOworCQl9CisKKwkJaG9zdCA9IGNsZWFuaG9zdG5hbWUoaG9zdCk7CisJCWlmICghKmhvc3QpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBob3N0bmFtZVxuIik7CisJCQl1c2FnZSgpOworCQl9CisKKwkJYWRkYXJncygmYXJncywgIi1vUHJvdG9jb2wgJWQiLCBzc2h2ZXIpOworCisJCS8qIG5vIHN1YnN5c3RlbSBpZiB0aGUgc2VydmVyLXNwZWMgY29udGFpbnMgYSAnLycgKi8KKwkJaWYgKHNmdHBfc2VydmVyID09IE5VTEwgfHwgc3RyY2hyKHNmdHBfc2VydmVyLCAnLycpID09IE5VTEwpCisJCQlhZGRhcmdzKCZhcmdzLCAiLXMiKTsKKworCQlhZGRhcmdzKCZhcmdzLCAiLS0iKTsKKwkJYWRkYXJncygmYXJncywgIiVzIiwgaG9zdCk7CisJCWFkZGFyZ3MoJmFyZ3MsICIlcyIsIChzZnRwX3NlcnZlciAhPSBOVUxMID8KKwkJICAgIHNmdHBfc2VydmVyIDogInNmdHAiKSk7CisKKwkJY29ubmVjdF90b19zZXJ2ZXIoc3NoX3Byb2dyYW0sIGFyZ3MubGlzdCwgJmluLCAmb3V0KTsKKwl9IGVsc2UgeworCQlhcmdzLmxpc3QgPSBOVUxMOworCQlhZGRhcmdzKCZhcmdzLCAic2Z0cC1zZXJ2ZXIiKTsKKworCQljb25uZWN0X3RvX3NlcnZlcihzZnRwX2RpcmVjdCwgYXJncy5saXN0LCAmaW4sICZvdXQpOworCX0KKwlmcmVlYXJncygmYXJncyk7CisKKwljb25uID0gZG9faW5pdChpbiwgb3V0LCBjb3B5X2J1ZmZlcl9sZW4sIG51bV9yZXF1ZXN0cywgbGltaXRfa2Jwcyk7CisJaWYgKGNvbm4gPT0gTlVMTCkKKwkJZmF0YWwoIkNvdWxkbid0IGluaXRpYWxpc2UgY29ubmVjdGlvbiB0byBzZXJ2ZXIiKTsKKworCWlmICghYmF0Y2htb2RlKSB7CisJCWlmIChzZnRwX2RpcmVjdCA9PSBOVUxMKQorCQkJZnByaW50ZihzdGRlcnIsICJDb25uZWN0ZWQgdG8gJXMuXG4iLCBob3N0KTsKKwkJZWxzZQorCQkJZnByaW50ZihzdGRlcnIsICJBdHRhY2hlZCB0byAlcy5cbiIsIHNmdHBfZGlyZWN0KTsKKwl9CisKKwllcnIgPSBpbnRlcmFjdGl2ZV9sb29wKGNvbm4sIGZpbGUxLCBmaWxlMik7CisKKyNpZiAhZGVmaW5lZChVU0VfUElQRVMpCisJc2h1dGRvd24oaW4sIFNIVVRfUkRXUik7CisJc2h1dGRvd24ob3V0LCBTSFVUX1JEV1IpOworI2VuZGlmCisKKwljbG9zZShpbik7CisJY2xvc2Uob3V0KTsKKwlpZiAoYmF0Y2htb2RlKQorCQlmY2xvc2UoaW5maWxlKTsKKworCXdoaWxlICh3YWl0cGlkKHNzaHBpZCwgTlVMTCwgMCkgPT0gLTEpCisJCWlmIChlcnJubyAhPSBFSU5UUikKKwkJCWZhdGFsKCJDb3VsZG4ndCB3YWl0IGZvciBzc2ggcHJvY2VzczogJXMiLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisKKwlleGl0KGVyciA9PSAwID8gMCA6IDEpOworfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zZnRwLmggYi9vcGVuc3NoLTYuMHAxL3NmdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmRlOGJiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zZnRwLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qICRPcGVuQlNEOiBzZnRwLmgsdiAxLjkgMjAwOC8wNi8xMyAwMDoxMjowMiBkdHVja2VyIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBkcmFmdC1pZXRmLXNlY3NoLWZpbGV4ZmVyLTAxLnR4dAorICovCisKKy8qIHZlcnNpb24gKi8KKyNkZWZpbmUJU1NIMl9GSUxFWEZFUl9WRVJTSU9OCQkzCisKKy8qIGNsaWVudCB0byBzZXJ2ZXIgKi8KKyNkZWZpbmUgU1NIMl9GWFBfSU5JVAkJCTEKKyNkZWZpbmUgU1NIMl9GWFBfT1BFTgkJCTMKKyNkZWZpbmUgU1NIMl9GWFBfQ0xPU0UJCQk0CisjZGVmaW5lIFNTSDJfRlhQX1JFQUQJCQk1CisjZGVmaW5lIFNTSDJfRlhQX1dSSVRFCQkJNgorI2RlZmluZSBTU0gyX0ZYUF9MU1RBVAkJCTcKKyNkZWZpbmUgU1NIMl9GWFBfU1RBVF9WRVJTSU9OXzAJCTcKKyNkZWZpbmUgU1NIMl9GWFBfRlNUQVQJCQk4CisjZGVmaW5lIFNTSDJfRlhQX1NFVFNUQVQJCTkKKyNkZWZpbmUgU1NIMl9GWFBfRlNFVFNUQVQJCTEwCisjZGVmaW5lIFNTSDJfRlhQX09QRU5ESVIJCTExCisjZGVmaW5lIFNTSDJfRlhQX1JFQURESVIJCTEyCisjZGVmaW5lIFNTSDJfRlhQX1JFTU9WRQkJCTEzCisjZGVmaW5lIFNTSDJfRlhQX01LRElSCQkJMTQKKyNkZWZpbmUgU1NIMl9GWFBfUk1ESVIJCQkxNQorI2RlZmluZSBTU0gyX0ZYUF9SRUFMUEFUSAkJMTYKKyNkZWZpbmUgU1NIMl9GWFBfU1RBVAkJCTE3CisjZGVmaW5lIFNTSDJfRlhQX1JFTkFNRQkJCTE4CisjZGVmaW5lIFNTSDJfRlhQX1JFQURMSU5LCQkxOQorI2RlZmluZSBTU0gyX0ZYUF9TWU1MSU5LCQkyMAorCisvKiBzZXJ2ZXIgdG8gY2xpZW50ICovCisjZGVmaW5lIFNTSDJfRlhQX1ZFUlNJT04JCTIKKyNkZWZpbmUgU1NIMl9GWFBfU1RBVFVTCQkJMTAxCisjZGVmaW5lIFNTSDJfRlhQX0hBTkRMRQkJCTEwMgorI2RlZmluZSBTU0gyX0ZYUF9EQVRBCQkJMTAzCisjZGVmaW5lIFNTSDJfRlhQX05BTUUJCQkxMDQKKyNkZWZpbmUgU1NIMl9GWFBfQVRUUlMJCQkxMDUKKworI2RlZmluZSBTU0gyX0ZYUF9FWFRFTkRFRAkJMjAwCisjZGVmaW5lIFNTSDJfRlhQX0VYVEVOREVEX1JFUExZCQkyMDEKKworLyogYXR0cmlidXRlcyAqLworI2RlZmluZSBTU0gyX0ZJTEVYRkVSX0FUVFJfU0laRQkJMHgwMDAwMDAwMQorI2RlZmluZSBTU0gyX0ZJTEVYRkVSX0FUVFJfVUlER0lECTB4MDAwMDAwMDIKKyNkZWZpbmUgU1NIMl9GSUxFWEZFUl9BVFRSX1BFUk1JU1NJT05TCTB4MDAwMDAwMDQKKyNkZWZpbmUgU1NIMl9GSUxFWEZFUl9BVFRSX0FDTU9EVElNRQkweDAwMDAwMDA4CisjZGVmaW5lIFNTSDJfRklMRVhGRVJfQVRUUl9FWFRFTkRFRAkweDgwMDAwMDAwCisKKy8qIHBvcnRhYmxlIG9wZW4gbW9kZXMgKi8KKyNkZWZpbmUgU1NIMl9GWEZfUkVBRAkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgU1NIMl9GWEZfV1JJVEUJCQkweDAwMDAwMDAyCisjZGVmaW5lIFNTSDJfRlhGX0FQUEVORAkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgU1NIMl9GWEZfQ1JFQVQJCQkweDAwMDAwMDA4CisjZGVmaW5lIFNTSDJfRlhGX1RSVU5DCQkJMHgwMDAwMDAxMAorI2RlZmluZSBTU0gyX0ZYRl9FWENMCQkJMHgwMDAwMDAyMAorCisvKiBzdGF0dmZzQG9wZW5zc2guY29tIGZfZmxhZyBmbGFncyAqLworI2RlZmluZSBTU0gyX0ZYRV9TVEFUVkZTX1NUX1JET05MWQkweDAwMDAwMDAxCisjZGVmaW5lIFNTSDJfRlhFX1NUQVRWRlNfU1RfTk9TVUlECTB4MDAwMDAwMDIKKworLyogc3RhdHVzIG1lc3NhZ2VzICovCisjZGVmaW5lIFNTSDJfRlhfT0sJCQkwCisjZGVmaW5lIFNTSDJfRlhfRU9GCQkJMQorI2RlZmluZSBTU0gyX0ZYX05PX1NVQ0hfRklMRQkJMgorI2RlZmluZSBTU0gyX0ZYX1BFUk1JU1NJT05fREVOSUVECTMKKyNkZWZpbmUgU1NIMl9GWF9GQUlMVVJFCQkJNAorI2RlZmluZSBTU0gyX0ZYX0JBRF9NRVNTQUdFCQk1CisjZGVmaW5lIFNTSDJfRlhfTk9fQ09OTkVDVElPTgkJNgorI2RlZmluZSBTU0gyX0ZYX0NPTk5FQ1RJT05fTE9TVAkJNworI2RlZmluZSBTU0gyX0ZYX09QX1VOU1VQUE9SVEVECQk4CisjZGVmaW5lIFNTSDJfRlhfTUFYCQkJOAorCitzdHJ1Y3QgcGFzc3dkOworCitpbnQJc2Z0cF9zZXJ2ZXJfbWFpbihpbnQsIGNoYXIgKiosIHN0cnVjdCBwYXNzd2QgKik7Cit2b2lkCXNmdHBfc2VydmVyX2NsZWFudXBfZXhpdChpbnQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NzaC1hZGQuMCBiL29wZW5zc2gtNi4wcDEvc3NoLWFkZC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NDI0MGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NzaC1hZGQuMApAQCAtMCwwICsxLDExOCBAQAorU1NILUFERCgxKSAgICAgICAgICAgICAgICAgT3BlbkJTRCBSZWZlcmVuY2UgTWFudWFsICAgICAgICAgICAgICAgICBTU0gtQUREKDEpCisKK05BTUUKKyAgICAgc3NoLWFkZCAtIGFkZHMgcHJpdmF0ZSBrZXkgaWRlbnRpdGllcyB0byB0aGUgYXV0aGVudGljYXRpb24gYWdlbnQKKworU1lOT1BTSVMKKyAgICAgc3NoLWFkZCBbLWNEZGtMbFh4XSBbLXQgbGlmZV0gW2ZpbGUgLi4uXQorICAgICBzc2gtYWRkIC1zIHBrY3MxMQorICAgICBzc2gtYWRkIC1lIHBrY3MxMQorCitERVNDUklQVElPTgorICAgICBzc2gtYWRkIGFkZHMgcHJpdmF0ZSBrZXkgaWRlbnRpdGllcyB0byB0aGUgYXV0aGVudGljYXRpb24gYWdlbnQsCisgICAgIHNzaC1hZ2VudCgxKS4gIFdoZW4gcnVuIHdpdGhvdXQgYXJndW1lbnRzLCBpdCBhZGRzIHRoZSBmaWxlcworICAgICB+Ly5zc2gvaWRfcnNhLCB+Ly5zc2gvaWRfZHNhLCB+Ly5zc2gvaWRfZWNkc2EgYW5kIH4vLnNzaC9pZGVudGl0eS4gIEFmdGVyCisgICAgIGxvYWRpbmcgYSBwcml2YXRlIGtleSwgc3NoLWFkZCB3aWxsIHRyeSB0byBsb2FkIGNvcnJlc3BvbmRpbmcgY2VydGlmaWNhdGUKKyAgICAgaW5mb3JtYXRpb24gZnJvbSB0aGUgZmlsZW5hbWUgb2J0YWluZWQgYnkgYXBwZW5kaW5nIC1jZXJ0LnB1YiB0byB0aGUgbmFtZQorICAgICBvZiB0aGUgcHJpdmF0ZSBrZXkgZmlsZS4gIEFsdGVybmF0aXZlIGZpbGUgbmFtZXMgY2FuIGJlIGdpdmVuIG9uIHRoZQorICAgICBjb21tYW5kIGxpbmUuCisKKyAgICAgSWYgYW55IGZpbGUgcmVxdWlyZXMgYSBwYXNzcGhyYXNlLCBzc2gtYWRkIGFza3MgZm9yIHRoZSBwYXNzcGhyYXNlIGZyb20KKyAgICAgdGhlIHVzZXIuICBUaGUgcGFzc3BocmFzZSBpcyByZWFkIGZyb20gdGhlIHVzZXIncyB0dHkuICBzc2gtYWRkIHJldHJpZXMKKyAgICAgdGhlIGxhc3QgcGFzc3BocmFzZSBpZiBtdWx0aXBsZSBpZGVudGl0eSBmaWxlcyBhcmUgZ2l2ZW4uCisKKyAgICAgVGhlIGF1dGhlbnRpY2F0aW9uIGFnZW50IG11c3QgYmUgcnVubmluZyBhbmQgdGhlIFNTSF9BVVRIX1NPQ0sKKyAgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgbXVzdCBjb250YWluIHRoZSBuYW1lIG9mIGl0cyBzb2NrZXQgZm9yIHNzaC1hZGQgdG8KKyAgICAgd29yay4KKworICAgICBUaGUgb3B0aW9ucyBhcmUgYXMgZm9sbG93czoKKworICAgICAtYyAgICAgIEluZGljYXRlcyB0aGF0IGFkZGVkIGlkZW50aXRpZXMgc2hvdWxkIGJlIHN1YmplY3QgdG8gY29uZmlybWF0aW9uCisgICAgICAgICAgICAgYmVmb3JlIGJlaW5nIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLiAgQ29uZmlybWF0aW9uIGlzIHBlcmZvcm1lZAorICAgICAgICAgICAgIGJ5IHRoZSBTU0hfQVNLUEFTUyBwcm9ncmFtIG1lbnRpb25lZCBiZWxvdy4gIFN1Y2Nlc3NmdWwKKyAgICAgICAgICAgICBjb25maXJtYXRpb24gaXMgc2lnbmFsZWQgYnkgYSB6ZXJvIGV4aXQgc3RhdHVzIGZyb20gdGhlCisgICAgICAgICAgICAgU1NIX0FTS1BBU1MgcHJvZ3JhbSwgcmF0aGVyIHRoYW4gdGV4dCBlbnRlcmVkIGludG8gdGhlIHJlcXVlc3Rlci4KKworICAgICAtRCAgICAgIERlbGV0ZXMgYWxsIGlkZW50aXRpZXMgZnJvbSB0aGUgYWdlbnQuCisKKyAgICAgLWQgICAgICBJbnN0ZWFkIG9mIGFkZGluZyBpZGVudGl0aWVzLCByZW1vdmVzIGlkZW50aXRpZXMgZnJvbSB0aGUgYWdlbnQuCisgICAgICAgICAgICAgSWYgc3NoLWFkZCBoYXMgYmVlbiBydW4gd2l0aG91dCBhcmd1bWVudHMsIHRoZSBrZXlzIGZvciB0aGUKKyAgICAgICAgICAgICBkZWZhdWx0IGlkZW50aXRpZXMgd2lsbCBiZSByZW1vdmVkLiAgT3RoZXJ3aXNlLCB0aGUgYXJndW1lbnQgbGlzdAorICAgICAgICAgICAgIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYSBsaXN0IG9mIHBhdGhzIHRvIHB1YmxpYyBrZXkgZmlsZXMgYW5kCisgICAgICAgICAgICAgbWF0Y2hpbmcga2V5cyB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgYWdlbnQuICBJZiBubyBwdWJsaWMga2V5CisgICAgICAgICAgICAgaXMgZm91bmQgYXQgYSBnaXZlbiBwYXRoLCBzc2gtYWRkIHdpbGwgYXBwZW5kIC5wdWIgYW5kIHJldHJ5LgorCisgICAgIC1lIHBrY3MxMQorICAgICAgICAgICAgIFJlbW92ZSBrZXlzIHByb3ZpZGVkIGJ5IHRoZSBQS0NTIzExIHNoYXJlZCBsaWJyYXJ5IHBrY3MxMS4KKworICAgICAtayAgICAgIFdoZW4gbG9hZGluZyBrZXlzIGludG8gdGhlIGFnZW50LCBsb2FkIHBsYWluIHByaXZhdGUga2V5cyBvbmx5CisgICAgICAgICAgICAgYW5kIHNraXAgY2VydGlmaWNhdGVzLgorCisgICAgIC1MICAgICAgTGlzdHMgcHVibGljIGtleSBwYXJhbWV0ZXJzIG9mIGFsbCBpZGVudGl0aWVzIGN1cnJlbnRseQorICAgICAgICAgICAgIHJlcHJlc2VudGVkIGJ5IHRoZSBhZ2VudC4KKworICAgICAtbCAgICAgIExpc3RzIGZpbmdlcnByaW50cyBvZiBhbGwgaWRlbnRpdGllcyBjdXJyZW50bHkgcmVwcmVzZW50ZWQgYnkgdGhlCisgICAgICAgICAgICAgYWdlbnQuCisKKyAgICAgLXMgcGtjczExCisgICAgICAgICAgICAgQWRkIGtleXMgcHJvdmlkZWQgYnkgdGhlIFBLQ1MjMTEgc2hhcmVkIGxpYnJhcnkgcGtjczExLgorCisgICAgIC10IGxpZmUKKyAgICAgICAgICAgICBTZXQgYSBtYXhpbXVtIGxpZmV0aW1lIHdoZW4gYWRkaW5nIGlkZW50aXRpZXMgdG8gYW4gYWdlbnQuICBUaGUKKyAgICAgICAgICAgICBsaWZldGltZSBtYXkgYmUgc3BlY2lmaWVkIGluIHNlY29uZHMgb3IgaW4gYSB0aW1lIGZvcm1hdAorICAgICAgICAgICAgIHNwZWNpZmllZCBpbiBzc2hkX2NvbmZpZyg1KS4KKworICAgICAtWCAgICAgIFVubG9jayB0aGUgYWdlbnQuCisKKyAgICAgLXggICAgICBMb2NrIHRoZSBhZ2VudCB3aXRoIGEgcGFzc3dvcmQuCisKK0VOVklST05NRU5UCisgICAgIERJU1BMQVkgYW5kIFNTSF9BU0tQQVNTCisgICAgICAgICAgICAgSWYgc3NoLWFkZCBuZWVkcyBhIHBhc3NwaHJhc2UsIGl0IHdpbGwgcmVhZCB0aGUgcGFzc3BocmFzZSBmcm9tCisgICAgICAgICAgICAgdGhlIGN1cnJlbnQgdGVybWluYWwgaWYgaXQgd2FzIHJ1biBmcm9tIGEgdGVybWluYWwuICBJZiBzc2gtYWRkCisgICAgICAgICAgICAgZG9lcyBub3QgaGF2ZSBhIHRlcm1pbmFsIGFzc29jaWF0ZWQgd2l0aCBpdCBidXQgRElTUExBWSBhbmQKKyAgICAgICAgICAgICBTU0hfQVNLUEFTUyBhcmUgc2V0LCBpdCB3aWxsIGV4ZWN1dGUgdGhlIHByb2dyYW0gc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgU1NIX0FTS1BBU1MgYW5kIG9wZW4gYW4gWDExIHdpbmRvdyB0byByZWFkIHRoZSBwYXNzcGhyYXNlLiAgVGhpcworICAgICAgICAgICAgIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbiBjYWxsaW5nIHNzaC1hZGQgZnJvbSBhIC54c2Vzc2lvbiBvcgorICAgICAgICAgICAgIHJlbGF0ZWQgc2NyaXB0LiAgKE5vdGUgdGhhdCBvbiBzb21lIG1hY2hpbmVzIGl0IG1heSBiZSBuZWNlc3NhcnkKKyAgICAgICAgICAgICB0byByZWRpcmVjdCB0aGUgaW5wdXQgZnJvbSAvZGV2L251bGwgdG8gbWFrZSB0aGlzIHdvcmsuKQorCisgICAgIFNTSF9BVVRIX1NPQ0sKKyAgICAgICAgICAgICBJZGVudGlmaWVzIHRoZSBwYXRoIG9mIGEgVU5JWC1kb21haW4gc29ja2V0IHVzZWQgdG8gY29tbXVuaWNhdGUKKyAgICAgICAgICAgICB3aXRoIHRoZSBhZ2VudC4KKworRklMRVMKKyAgICAgfi8uc3NoL2lkZW50aXR5CisgICAgICAgICAgICAgQ29udGFpbnMgdGhlIHByb3RvY29sIHZlcnNpb24gMSBSU0EgYXV0aGVudGljYXRpb24gaWRlbnRpdHkgb2YKKyAgICAgICAgICAgICB0aGUgdXNlci4KKworICAgICB+Ly5zc2gvaWRfZHNhCisgICAgICAgICAgICAgQ29udGFpbnMgdGhlIHByb3RvY29sIHZlcnNpb24gMiBEU0EgYXV0aGVudGljYXRpb24gaWRlbnRpdHkgb2YKKyAgICAgICAgICAgICB0aGUgdXNlci4KKworICAgICB+Ly5zc2gvaWRfZWNkc2EKKyAgICAgICAgICAgICBDb250YWlucyB0aGUgcHJvdG9jb2wgdmVyc2lvbiAyIEVDRFNBIGF1dGhlbnRpY2F0aW9uIGlkZW50aXR5IG9mCisgICAgICAgICAgICAgdGhlIHVzZXIuCisKKyAgICAgfi8uc3NoL2lkX3JzYQorICAgICAgICAgICAgIENvbnRhaW5zIHRoZSBwcm90b2NvbCB2ZXJzaW9uIDIgUlNBIGF1dGhlbnRpY2F0aW9uIGlkZW50aXR5IG9mCisgICAgICAgICAgICAgdGhlIHVzZXIuCisKKyAgICAgSWRlbnRpdHkgZmlsZXMgc2hvdWxkIG5vdCBiZSByZWFkYWJsZSBieSBhbnlvbmUgYnV0IHRoZSB1c2VyLiAgTm90ZSB0aGF0CisgICAgIHNzaC1hZGQgaWdub3JlcyBpZGVudGl0eSBmaWxlcyBpZiB0aGV5IGFyZSBhY2Nlc3NpYmxlIGJ5IG90aGVycy4KKworRVhJVCBTVEFUVVMKKyAgICAgRXhpdCBzdGF0dXMgaXMgMCBvbiBzdWNjZXNzLCAxIGlmIHRoZSBzcGVjaWZpZWQgY29tbWFuZCBmYWlscywgYW5kIDIgaWYKKyAgICAgc3NoLWFkZCBpcyB1bmFibGUgdG8gY29udGFjdCB0aGUgYXV0aGVudGljYXRpb24gYWdlbnQuCisKK1NFRSBBTFNPCisgICAgIHNzaCgxKSwgc3NoLWFnZW50KDEpLCBzc2gta2V5Z2VuKDEpLCBzc2hkKDgpCisKK0FVVEhPUlMKKyAgICAgT3BlblNTSCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGFuZCBmcmVlIHNzaCAxLjIuMTIgcmVsZWFzZSBieQorICAgICBUYXR1IFlsb25lbi4gIEFhcm9uIENhbXBiZWxsLCBCb2IgQmVjaywgTWFya3VzIEZyaWVkbCwgTmllbHMgUHJvdm9zLCBUaGVvCisgICAgIGRlIFJhYWR0IGFuZCBEdWcgU29uZyByZW1vdmVkIG1hbnkgYnVncywgcmUtYWRkZWQgbmV3ZXIgZmVhdHVyZXMgYW5kCisgICAgIGNyZWF0ZWQgT3BlblNTSC4gIE1hcmt1cyBGcmllZGwgY29udHJpYnV0ZWQgdGhlIHN1cHBvcnQgZm9yIFNTSCBwcm90b2NvbAorICAgICB2ZXJzaW9ucyAxLjUgYW5kIDIuMC4KKworT3BlbkJTRCA1LjAgICAgICAgICAgICAgICAgICAgIE9jdG9iZXIgMTgsIDIwMTEgICAgICAgICAgICAgICAgICAgIE9wZW5CU0QgNS4wCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NzaC1hZGQuMSBiL29wZW5zc2gtNi4wcDEvc3NoLWFkZC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYzYyMGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NzaC1hZGQuMQpAQCAtMCwwICsxLDE5OCBAQAorLlwiCSRPcGVuQlNEOiBzc2gtYWRkLjEsdiAxLjU2IDIwMTEvMTAvMTggMDU6MDA6NDggZGptIEV4cCAkCisuXCIKKy5cIiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorLlwiIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisuXCIgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKKy5cIgorLlwiIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKKy5cIiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworLlwiIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKy5cIiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCisuXCIgY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorLlwiCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTkgQWFyb24gQ2FtcGJlbGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiIENvcHlyaWdodCAoYykgMTk5OSBUaGVvIGRlIFJhYWR0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisuXCIgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLlwiIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisuXCIgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLlwiIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLlwiIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy5cIiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy5cIiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisuXCIgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisuXCIgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy5cIgorLkRkICRNZG9jZGF0ZTogT2N0b2JlciAxOCAyMDExICQKKy5EdCBTU0gtQUREIDEKKy5PcworLlNoIE5BTUUKKy5ObSBzc2gtYWRkCisuTmQgYWRkcyBwcml2YXRlIGtleSBpZGVudGl0aWVzIHRvIHRoZSBhdXRoZW50aWNhdGlvbiBhZ2VudAorLlNoIFNZTk9QU0lTCisuTm0gc3NoLWFkZAorLk9wIEZsIGNEZGtMbFh4CisuT3AgRmwgdCBBciBsaWZlCisuT3AgQXIKKy5ObSBzc2gtYWRkCisuRmwgcyBBciBwa2NzMTEKKy5ObSBzc2gtYWRkCisuRmwgZSBBciBwa2NzMTEKKy5TaCBERVNDUklQVElPTgorLk5tCithZGRzIHByaXZhdGUga2V5IGlkZW50aXRpZXMgdG8gdGhlIGF1dGhlbnRpY2F0aW9uIGFnZW50LAorLlhyIHNzaC1hZ2VudCAxIC4KK1doZW4gcnVuIHdpdGhvdXQgYXJndW1lbnRzLCBpdCBhZGRzIHRoZSBmaWxlcworLlBhIH4vLnNzaC9pZF9yc2EgLAorLlBhIH4vLnNzaC9pZF9kc2EgLAorLlBhIH4vLnNzaC9pZF9lY2RzYQorYW5kCisuUGEgfi8uc3NoL2lkZW50aXR5IC4KK0FmdGVyIGxvYWRpbmcgYSBwcml2YXRlIGtleSwKKy5ObQord2lsbCB0cnkgdG8gbG9hZCBjb3JyZXNwb25kaW5nIGNlcnRpZmljYXRlIGluZm9ybWF0aW9uIGZyb20gdGhlCitmaWxlbmFtZSBvYnRhaW5lZCBieSBhcHBlbmRpbmcKKy5QYSAtY2VydC5wdWIKK3RvIHRoZSBuYW1lIG9mIHRoZSBwcml2YXRlIGtleSBmaWxlLgorQWx0ZXJuYXRpdmUgZmlsZSBuYW1lcyBjYW4gYmUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KKy5QcAorSWYgYW55IGZpbGUgcmVxdWlyZXMgYSBwYXNzcGhyYXNlLAorLk5tCithc2tzIGZvciB0aGUgcGFzc3BocmFzZSBmcm9tIHRoZSB1c2VyLgorVGhlIHBhc3NwaHJhc2UgaXMgcmVhZCBmcm9tIHRoZSB1c2VyJ3MgdHR5LgorLk5tCityZXRyaWVzIHRoZSBsYXN0IHBhc3NwaHJhc2UgaWYgbXVsdGlwbGUgaWRlbnRpdHkgZmlsZXMgYXJlIGdpdmVuLgorLlBwCitUaGUgYXV0aGVudGljYXRpb24gYWdlbnQgbXVzdCBiZSBydW5uaW5nIGFuZCB0aGUKKy5FdiBTU0hfQVVUSF9TT0NLCitlbnZpcm9ubWVudCB2YXJpYWJsZSBtdXN0IGNvbnRhaW4gdGhlIG5hbWUgb2YgaXRzIHNvY2tldCBmb3IKKy5ObQordG8gd29yay4KKy5QcAorVGhlIG9wdGlvbnMgYXJlIGFzIGZvbGxvd3M6CisuQmwgLXRhZyAtd2lkdGggRHMKKy5JdCBGbCBjCitJbmRpY2F0ZXMgdGhhdCBhZGRlZCBpZGVudGl0aWVzIHNob3VsZCBiZSBzdWJqZWN0IHRvIGNvbmZpcm1hdGlvbiBiZWZvcmUKK2JlaW5nIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLgorQ29uZmlybWF0aW9uIGlzIHBlcmZvcm1lZCBieSB0aGUKKy5FdiBTU0hfQVNLUEFTUworcHJvZ3JhbSBtZW50aW9uZWQgYmVsb3cuCitTdWNjZXNzZnVsIGNvbmZpcm1hdGlvbiBpcyBzaWduYWxlZCBieSBhIHplcm8gZXhpdCBzdGF0dXMgZnJvbSB0aGUKKy5FdiBTU0hfQVNLUEFTUworcHJvZ3JhbSwgcmF0aGVyIHRoYW4gdGV4dCBlbnRlcmVkIGludG8gdGhlIHJlcXVlc3Rlci4KKy5JdCBGbCBECitEZWxldGVzIGFsbCBpZGVudGl0aWVzIGZyb20gdGhlIGFnZW50LgorLkl0IEZsIGQKK0luc3RlYWQgb2YgYWRkaW5nIGlkZW50aXRpZXMsIHJlbW92ZXMgaWRlbnRpdGllcyBmcm9tIHRoZSBhZ2VudC4KK0lmCisuTm0KK2hhcyBiZWVuIHJ1biB3aXRob3V0IGFyZ3VtZW50cywgdGhlIGtleXMgZm9yIHRoZSBkZWZhdWx0IGlkZW50aXRpZXMgd2lsbAorYmUgcmVtb3ZlZC4KK090aGVyd2lzZSwgdGhlIGFyZ3VtZW50IGxpc3Qgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBhIGxpc3Qgb2YgcGF0aHMgdG8KK3B1YmxpYyBrZXkgZmlsZXMgYW5kIG1hdGNoaW5nIGtleXMgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGFnZW50LgorSWYgbm8gcHVibGljIGtleSBpcyBmb3VuZCBhdCBhIGdpdmVuIHBhdGgsCisuTm0KK3dpbGwgYXBwZW5kCisuUGEgLnB1YgorYW5kIHJldHJ5LgorLkl0IEZsIGUgQXIgcGtjczExCitSZW1vdmUga2V5cyBwcm92aWRlZCBieSB0aGUgUEtDUyMxMSBzaGFyZWQgbGlicmFyeQorLkFyIHBrY3MxMSAuCisuSXQgRmwgaworV2hlbiBsb2FkaW5nIGtleXMgaW50byB0aGUgYWdlbnQsIGxvYWQgcGxhaW4gcHJpdmF0ZSBrZXlzIG9ubHkgYW5kIHNraXAKK2NlcnRpZmljYXRlcy4KKy5JdCBGbCBMCitMaXN0cyBwdWJsaWMga2V5IHBhcmFtZXRlcnMgb2YgYWxsIGlkZW50aXRpZXMgY3VycmVudGx5IHJlcHJlc2VudGVkCitieSB0aGUgYWdlbnQuCisuSXQgRmwgbAorTGlzdHMgZmluZ2VycHJpbnRzIG9mIGFsbCBpZGVudGl0aWVzIGN1cnJlbnRseSByZXByZXNlbnRlZCBieSB0aGUgYWdlbnQuCisuSXQgRmwgcyBBciBwa2NzMTEKK0FkZCBrZXlzIHByb3ZpZGVkIGJ5IHRoZSBQS0NTIzExIHNoYXJlZCBsaWJyYXJ5CisuQXIgcGtjczExIC4KKy5JdCBGbCB0IEFyIGxpZmUKK1NldCBhIG1heGltdW0gbGlmZXRpbWUgd2hlbiBhZGRpbmcgaWRlbnRpdGllcyB0byBhbiBhZ2VudC4KK1RoZSBsaWZldGltZSBtYXkgYmUgc3BlY2lmaWVkIGluIHNlY29uZHMgb3IgaW4gYSB0aW1lIGZvcm1hdAorc3BlY2lmaWVkIGluCisuWHIgc3NoZF9jb25maWcgNSAuCisuSXQgRmwgWAorVW5sb2NrIHRoZSBhZ2VudC4KKy5JdCBGbCB4CitMb2NrIHRoZSBhZ2VudCB3aXRoIGEgcGFzc3dvcmQuCisuRWwKKy5TaCBFTlZJUk9OTUVOVAorLkJsIC10YWcgLXdpZHRoIERzCisuSXQgRXYgIkRJU1BMQVkiIGFuZCAiU1NIX0FTS1BBU1MiCitJZgorLk5tCituZWVkcyBhIHBhc3NwaHJhc2UsIGl0IHdpbGwgcmVhZCB0aGUgcGFzc3BocmFzZSBmcm9tIHRoZSBjdXJyZW50Cit0ZXJtaW5hbCBpZiBpdCB3YXMgcnVuIGZyb20gYSB0ZXJtaW5hbC4KK0lmCisuTm0KK2RvZXMgbm90IGhhdmUgYSB0ZXJtaW5hbCBhc3NvY2lhdGVkIHdpdGggaXQgYnV0CisuRXYgRElTUExBWQorYW5kCisuRXYgU1NIX0FTS1BBU1MKK2FyZSBzZXQsIGl0IHdpbGwgZXhlY3V0ZSB0aGUgcHJvZ3JhbSBzcGVjaWZpZWQgYnkKKy5FdiBTU0hfQVNLUEFTUworYW5kIG9wZW4gYW4gWDExIHdpbmRvdyB0byByZWFkIHRoZSBwYXNzcGhyYXNlLgorVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4gY2FsbGluZworLk5tCitmcm9tIGEKKy5QYSAueHNlc3Npb24KK29yIHJlbGF0ZWQgc2NyaXB0LgorKE5vdGUgdGhhdCBvbiBzb21lIG1hY2hpbmVzIGl0CittYXkgYmUgbmVjZXNzYXJ5IHRvIHJlZGlyZWN0IHRoZSBpbnB1dCBmcm9tCisuUGEgL2Rldi9udWxsCit0byBtYWtlIHRoaXMgd29yay4pCisuSXQgRXYgU1NIX0FVVEhfU09DSworSWRlbnRpZmllcyB0aGUgcGF0aCBvZiBhCisuVXggTnMgLWRvbWFpbgorc29ja2V0IHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgYWdlbnQuCisuRWwKKy5TaCBGSUxFUworLkJsIC10YWcgLXdpZHRoIERzCisuSXQgUGEgfi8uc3NoL2lkZW50aXR5CitDb250YWlucyB0aGUgcHJvdG9jb2wgdmVyc2lvbiAxIFJTQSBhdXRoZW50aWNhdGlvbiBpZGVudGl0eSBvZiB0aGUgdXNlci4KKy5JdCBQYSB+Ly5zc2gvaWRfZHNhCitDb250YWlucyB0aGUgcHJvdG9jb2wgdmVyc2lvbiAyIERTQSBhdXRoZW50aWNhdGlvbiBpZGVudGl0eSBvZiB0aGUgdXNlci4KKy5JdCBQYSB+Ly5zc2gvaWRfZWNkc2EKK0NvbnRhaW5zIHRoZSBwcm90b2NvbCB2ZXJzaW9uIDIgRUNEU0EgYXV0aGVudGljYXRpb24gaWRlbnRpdHkgb2YgdGhlIHVzZXIuCisuSXQgUGEgfi8uc3NoL2lkX3JzYQorQ29udGFpbnMgdGhlIHByb3RvY29sIHZlcnNpb24gMiBSU0EgYXV0aGVudGljYXRpb24gaWRlbnRpdHkgb2YgdGhlIHVzZXIuCisuRWwKKy5QcAorSWRlbnRpdHkgZmlsZXMgc2hvdWxkIG5vdCBiZSByZWFkYWJsZSBieSBhbnlvbmUgYnV0IHRoZSB1c2VyLgorTm90ZSB0aGF0CisuTm0KK2lnbm9yZXMgaWRlbnRpdHkgZmlsZXMgaWYgdGhleSBhcmUgYWNjZXNzaWJsZSBieSBvdGhlcnMuCisuU2ggRVhJVCBTVEFUVVMKK0V4aXQgc3RhdHVzIGlzIDAgb24gc3VjY2VzcywgMSBpZiB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgZmFpbHMsCithbmQgMiBpZgorLk5tCitpcyB1bmFibGUgdG8gY29udGFjdCB0aGUgYXV0aGVudGljYXRpb24gYWdlbnQuCisuU2ggU0VFIEFMU08KKy5YciBzc2ggMSAsCisuWHIgc3NoLWFnZW50IDEgLAorLlhyIHNzaC1rZXlnZW4gMSAsCisuWHIgc3NoZCA4CisuU2ggQVVUSE9SUworT3BlblNTSCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGFuZCBmcmVlCitzc2ggMS4yLjEyIHJlbGVhc2UgYnkgVGF0dSBZbG9uZW4uCitBYXJvbiBDYW1wYmVsbCwgQm9iIEJlY2ssIE1hcmt1cyBGcmllZGwsIE5pZWxzIFByb3ZvcywKK1RoZW8gZGUgUmFhZHQgYW5kIER1ZyBTb25nCityZW1vdmVkIG1hbnkgYnVncywgcmUtYWRkZWQgbmV3ZXIgZmVhdHVyZXMgYW5kCitjcmVhdGVkIE9wZW5TU0guCitNYXJrdXMgRnJpZWRsIGNvbnRyaWJ1dGVkIHRoZSBzdXBwb3J0IGZvciBTU0gKK3Byb3RvY29sIHZlcnNpb25zIDEuNSBhbmQgMi4wLgpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zc2gtYWRkLmMgYi9vcGVuc3NoLTYuMHAxL3NzaC1hZGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mzg2NDRkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zc2gtYWRkLmMKQEAgLTAsMCArMSw0OTYgQEAKKy8qICRPcGVuQlNEOiBzc2gtYWRkLmMsdiAxLjEwMyAyMDExLzEwLzE4IDIzOjM3OjQyIGRqbSBFeHAgJCAqLworLyoKKyAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAorICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIEFkZHMgYW4gaWRlbnRpdHkgdG8gdGhlIGF1dGhlbnRpY2F0aW9uIHNlcnZlciwgb3IgcmVtb3ZlcyBhbiBpZGVudGl0eS4KKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICoKKyAqIFNTSDIgaW1wbGVtZW50YXRpb24sCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQuaCIKKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJzc2guaCIKKyNpbmNsdWRlICJyc2EuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJhdXRoZmQuaCIKKyNpbmNsdWRlICJhdXRoZmlsZS5oIgorI2luY2x1ZGUgInBhdGhuYW1lcy5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKworLyogYXJndjAgKi8KK2V4dGVybiBjaGFyICpfX3Byb2duYW1lOworCisvKiBEZWZhdWx0IGZpbGVzIHRvIGFkZCAqLworc3RhdGljIGNoYXIgKmRlZmF1bHRfZmlsZXNbXSA9IHsKKwlfUEFUSF9TU0hfQ0xJRU5UX0lEX1JTQSwKKwlfUEFUSF9TU0hfQ0xJRU5UX0lEX0RTQSwKKyNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKKwlfUEFUSF9TU0hfQ0xJRU5UX0lEX0VDRFNBLAorI2VuZGlmCisJX1BBVEhfU1NIX0NMSUVOVF9JREVOVElUWSwKKwlOVUxMCit9OworCisvKiBEZWZhdWx0IGxpZmV0aW1lICgwID09IGZvcmV2ZXIpICovCitzdGF0aWMgaW50IGxpZmV0aW1lID0gMDsKKworLyogVXNlciBoYXMgdG8gY29uZmlybSBrZXkgdXNlICovCitzdGF0aWMgaW50IGNvbmZpcm0gPSAwOworCisvKiB3ZSBrZWVwIGEgY2FjaGUgb2Ygb25lIHBhc3NwaHJhc2VzICovCitzdGF0aWMgY2hhciAqcGFzcyA9IE5VTEw7CitzdGF0aWMgdm9pZAorY2xlYXJfcGFzcyh2b2lkKQoreworCWlmIChwYXNzKSB7CisJCW1lbXNldChwYXNzLCAwLCBzdHJsZW4ocGFzcykpOworCQl4ZnJlZShwYXNzKTsKKwkJcGFzcyA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50CitkZWxldGVfZmlsZShBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKmFjLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlLZXkgKnB1YmxpYzsKKwljaGFyICpjb21tZW50ID0gTlVMTDsKKwlpbnQgcmV0ID0gLTE7CisKKwlwdWJsaWMgPSBrZXlfbG9hZF9wdWJsaWMoZmlsZW5hbWUsICZjb21tZW50KTsKKwlpZiAocHVibGljID09IE5VTEwpIHsKKwkJcHJpbnRmKCJCYWQga2V5IGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoc3NoX3JlbW92ZV9pZGVudGl0eShhYywgcHVibGljKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIklkZW50aXR5IHJlbW92ZWQ6ICVzICglcylcbiIsIGZpbGVuYW1lLCBjb21tZW50KTsKKwkJcmV0ID0gMDsKKwl9IGVsc2UKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgcmVtb3ZlIGlkZW50aXR5OiAlc1xuIiwgZmlsZW5hbWUpOworCisJa2V5X2ZyZWUocHVibGljKTsKKwl4ZnJlZShjb21tZW50KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFNlbmQgYSByZXF1ZXN0IHRvIHJlbW92ZSBhbGwgaWRlbnRpdGllcy4gKi8KK3N0YXRpYyBpbnQKK2RlbGV0ZV9hbGwoQXV0aGVudGljYXRpb25Db25uZWN0aW9uICphYykKK3sKKwlpbnQgcmV0ID0gLTE7CisKKwlpZiAoc3NoX3JlbW92ZV9hbGxfaWRlbnRpdGllcyhhYywgMSkpCisJCXJldCA9IDA7CisJLyogaWdub3JlIGVycm9yLWNvZGUgZm9yIHNzaDIgKi8KKwlzc2hfcmVtb3ZlX2FsbF9pZGVudGl0aWVzKGFjLCAyKTsKKworCWlmIChyZXQgPT0gMCkKKwkJZnByaW50ZihzdGRlcnIsICJBbGwgaWRlbnRpdGllcyByZW1vdmVkLlxuIik7CisJZWxzZQorCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byByZW1vdmUgYWxsIGlkZW50aXRpZXMuXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2FkZF9maWxlKEF1dGhlbnRpY2F0aW9uQ29ubmVjdGlvbiAqYWMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQga2V5X29ubHkpCit7CisJS2V5ICpwcml2YXRlLCAqY2VydDsKKwljaGFyICpjb21tZW50ID0gTlVMTDsKKwljaGFyIG1zZ1sxMDI0XSwgKmNlcnRwYXRoID0gTlVMTDsKKwlpbnQgZmQsIHBlcm1zX29rLCByZXQgPSAtMTsKKwlCdWZmZXIga2V5YmxvYjsKKworCWlmIChzdHJjbXAoZmlsZW5hbWUsICItIikgPT0gMCkgeworCQlmZCA9IFNURElOX0ZJTEVOTzsKKwkJZmlsZW5hbWUgPSAiKHN0ZGluKSI7CisJfSBlbHNlIGlmICgoZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSkpIDwgMCkgeworCQlwZXJyb3IoZmlsZW5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBTaW5jZSB3ZSdsbCB0cnkgdG8gbG9hZCBhIGtleWZpbGUgbXVsdGlwbGUgdGltZXMsIHBlcm1pc3Npb24gZXJyb3JzCisJICogd2lsbCBvY2N1ciBtdWx0aXBsZSB0aW1lcywgc28gY2hlY2sgcGVybXMgZmlyc3QgYW5kIGJhaWwgaWYgd3JvbmcuCisJICovCisJaWYgKGZkICE9IFNURElOX0ZJTEVOTykgeworCQlwZXJtc19vayA9IGtleV9wZXJtX29rKGZkLCBmaWxlbmFtZSk7CisJCWlmICghcGVybXNfb2spIHsKKwkJCWNsb3NlKGZkKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlidWZmZXJfaW5pdCgma2V5YmxvYik7CisJaWYgKCFrZXlfbG9hZF9maWxlKGZkLCBmaWxlbmFtZSwgJmtleWJsb2IpKSB7CisJCWJ1ZmZlcl9mcmVlKCZrZXlibG9iKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gLTE7CisJfQorCWNsb3NlKGZkKTsKKworCS8qIEF0IGZpcnN0LCB0cnkgZW1wdHkgcGFzc3BocmFzZSAqLworCXByaXZhdGUgPSBrZXlfcGFyc2VfcHJpdmF0ZSgma2V5YmxvYiwgZmlsZW5hbWUsICIiLCAmY29tbWVudCk7CisJaWYgKGNvbW1lbnQgPT0gTlVMTCkKKwkJY29tbWVudCA9IHhzdHJkdXAoZmlsZW5hbWUpOworCS8qIHRyeSBsYXN0ICovCisJaWYgKHByaXZhdGUgPT0gTlVMTCAmJiBwYXNzICE9IE5VTEwpCisJCXByaXZhdGUgPSBrZXlfcGFyc2VfcHJpdmF0ZSgma2V5YmxvYiwgZmlsZW5hbWUsIHBhc3MsIE5VTEwpOworCWlmIChwcml2YXRlID09IE5VTEwpIHsKKwkJLyogY2xlYXIgcGFzc3BocmFzZSBzaW5jZSBpdCBkaWQgbm90IHdvcmsgKi8KKwkJY2xlYXJfcGFzcygpOworCQlzbnByaW50Zihtc2csIHNpemVvZiBtc2csICJFbnRlciBwYXNzcGhyYXNlIGZvciAlLjIwMHM6ICIsCisJCSAgICBjb21tZW50KTsKKwkJZm9yICg7OykgeworCQkJcGFzcyA9IHJlYWRfcGFzc3BocmFzZShtc2csIFJQX0FMTE9XX1NURElOKTsKKwkJCWlmIChzdHJjbXAocGFzcywgIiIpID09IDApIHsKKwkJCQljbGVhcl9wYXNzKCk7CisJCQkJeGZyZWUoY29tbWVudCk7CisJCQkJYnVmZmVyX2ZyZWUoJmtleWJsb2IpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXByaXZhdGUgPSBrZXlfcGFyc2VfcHJpdmF0ZSgma2V5YmxvYiwgZmlsZW5hbWUsIHBhc3MsCisJCQkgICAgJmNvbW1lbnQpOworCQkJaWYgKHByaXZhdGUgIT0gTlVMTCkKKwkJCQlicmVhazsKKwkJCWNsZWFyX3Bhc3MoKTsKKwkJCXNucHJpbnRmKG1zZywgc2l6ZW9mIG1zZywKKwkJCSAgICAiQmFkIHBhc3NwaHJhc2UsIHRyeSBhZ2FpbiBmb3IgJS4yMDBzOiAiLCBjb21tZW50KTsKKwkJfQorCX0KKwlidWZmZXJfZnJlZSgma2V5YmxvYik7CisKKwlpZiAoc3NoX2FkZF9pZGVudGl0eV9jb25zdHJhaW5lZChhYywgcHJpdmF0ZSwgY29tbWVudCwgbGlmZXRpbWUsCisJICAgIGNvbmZpcm0pKSB7CisJCWZwcmludGYoc3RkZXJyLCAiSWRlbnRpdHkgYWRkZWQ6ICVzICglcylcbiIsIGZpbGVuYW1lLCBjb21tZW50KTsKKwkJcmV0ID0gMDsKKwkJaWYgKGxpZmV0aW1lICE9IDApCisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSAgICAiTGlmZXRpbWUgc2V0IHRvICVkIHNlY29uZHNcbiIsIGxpZmV0aW1lKTsKKwkJaWYgKGNvbmZpcm0gIT0gMCkKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJICAgICJUaGUgdXNlciBtdXN0IGNvbmZpcm0gZWFjaCB1c2Ugb2YgdGhlIGtleVxuIik7CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWRkIGlkZW50aXR5OiAlc1xuIiwgZmlsZW5hbWUpOworCX0KKworCS8qIFNraXAgdHJ5aW5nIHRvIGxvYWQgdGhlIGNlcnQgaWYgcmVxdWVzdGVkICovCisJaWYgKGtleV9vbmx5KQorCQlnb3RvIG91dDsKKworCS8qIE5vdyB0cnkgdG8gYWRkIHRoZSBjZXJ0aWZpY2F0ZSBmbGF2b3VyIHRvbyAqLworCXhhc3ByaW50ZigmY2VydHBhdGgsICIlcy1jZXJ0LnB1YiIsIGZpbGVuYW1lKTsKKwlpZiAoKGNlcnQgPSBrZXlfbG9hZF9wdWJsaWMoY2VydHBhdGgsIE5VTEwpKSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWlmICgha2V5X2VxdWFsX3B1YmxpYyhjZXJ0LCBwcml2YXRlKSkgeworCQllcnJvcigiQ2VydGlmaWNhdGUgJXMgZG9lcyBub3QgbWF0Y2ggcHJpdmF0ZSBrZXkgJXMiLAorCQkgICAgY2VydHBhdGgsIGZpbGVuYW1lKTsKKwkJa2V5X2ZyZWUoY2VydCk7CisJCWdvdG8gb3V0OworCX0gCisKKwkvKiBHcmFmdCB3aXRoIHByaXZhdGUgYml0cyAqLworCWlmIChrZXlfdG9fY2VydGlmaWVkKHByaXZhdGUsIGtleV9jZXJ0X2lzX2xlZ2FjeShjZXJ0KSkgIT0gMCkgeworCQllcnJvcigiJXM6IGtleV90b19jZXJ0aWZpZWQgZmFpbGVkIiwgX19mdW5jX18pOworCQlrZXlfZnJlZShjZXJ0KTsKKwkJZ290byBvdXQ7CisJfQorCWtleV9jZXJ0X2NvcHkoY2VydCwgcHJpdmF0ZSk7CisJa2V5X2ZyZWUoY2VydCk7CisKKwlpZiAoIXNzaF9hZGRfaWRlbnRpdHlfY29uc3RyYWluZWQoYWMsIHByaXZhdGUsIGNvbW1lbnQsCisJICAgIGxpZmV0aW1lLCBjb25maXJtKSkgeworCQllcnJvcigiQ2VydGlmaWNhdGUgJXMgKCVzKSBhZGQgZmFpbGVkIiwgY2VydHBhdGgsCisJCSAgICBwcml2YXRlLT5jZXJ0LT5rZXlfaWQpOworCX0KKwlmcHJpbnRmKHN0ZGVyciwgIkNlcnRpZmljYXRlIGFkZGVkOiAlcyAoJXMpXG4iLCBjZXJ0cGF0aCwKKwkgICAgcHJpdmF0ZS0+Y2VydC0+a2V5X2lkKTsKKwlpZiAobGlmZXRpbWUgIT0gMCkKKwkJZnByaW50ZihzdGRlcnIsICJMaWZldGltZSBzZXQgdG8gJWQgc2Vjb25kc1xuIiwgbGlmZXRpbWUpOworCWlmIChjb25maXJtICE9IDApCisJCWZwcmludGYoc3RkZXJyLCAiVGhlIHVzZXIgbXVzdCBjb25maXJtIGVhY2ggdXNlIG9mIHRoZSBrZXlcbiIpOworIG91dDoKKwlpZiAoY2VydHBhdGggIT0gTlVMTCkKKwkJeGZyZWUoY2VydHBhdGgpOworCXhmcmVlKGNvbW1lbnQpOworCWtleV9mcmVlKHByaXZhdGUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAordXBkYXRlX2NhcmQoQXV0aGVudGljYXRpb25Db25uZWN0aW9uICphYywgaW50IGFkZCwgY29uc3QgY2hhciAqaWQpCit7CisJY2hhciAqcGluOworCWludCByZXQgPSAtMTsKKworCXBpbiA9IHJlYWRfcGFzc3BocmFzZSgiRW50ZXIgcGFzc3BocmFzZSBmb3IgUEtDUyMxMTogIiwgUlBfQUxMT1dfU1RESU4pOworCWlmIChwaW4gPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHNzaF91cGRhdGVfY2FyZChhYywgYWRkLCBpZCwgcGluLCBsaWZldGltZSwgY29uZmlybSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJDYXJkICVzOiAlc1xuIiwKKwkJICAgIGFkZCA/ICJhZGRlZCIgOiAicmVtb3ZlZCIsIGlkKTsKKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCAlcyBjYXJkOiAlc1xuIiwKKwkJICAgIGFkZCA/ICJhZGQiIDogInJlbW92ZSIsIGlkKTsKKwkJcmV0ID0gLTE7CisJfQorCXhmcmVlKHBpbik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorbGlzdF9pZGVudGl0aWVzKEF1dGhlbnRpY2F0aW9uQ29ubmVjdGlvbiAqYWMsIGludCBkb19mcCkKK3sKKwlLZXkgKmtleTsKKwljaGFyICpjb21tZW50LCAqZnA7CisJaW50IGhhZF9pZGVudGl0aWVzID0gMDsKKwlpbnQgdmVyc2lvbjsKKworCWZvciAodmVyc2lvbiA9IDE7IHZlcnNpb24gPD0gMjsgdmVyc2lvbisrKSB7CisJCWZvciAoa2V5ID0gc3NoX2dldF9maXJzdF9pZGVudGl0eShhYywgJmNvbW1lbnQsIHZlcnNpb24pOworCQkgICAga2V5ICE9IE5VTEw7CisJCSAgICBrZXkgPSBzc2hfZ2V0X25leHRfaWRlbnRpdHkoYWMsICZjb21tZW50LCB2ZXJzaW9uKSkgeworCQkJaGFkX2lkZW50aXRpZXMgPSAxOworCQkJaWYgKGRvX2ZwKSB7CisJCQkJZnAgPSBrZXlfZmluZ2VycHJpbnQoa2V5LCBTU0hfRlBfTUQ1LAorCQkJCSAgICBTU0hfRlBfSEVYKTsKKwkJCQlwcmludGYoIiVkICVzICVzICglcylcbiIsCisJCQkJICAgIGtleV9zaXplKGtleSksIGZwLCBjb21tZW50LCBrZXlfdHlwZShrZXkpKTsKKwkJCQl4ZnJlZShmcCk7CisJCQl9IGVsc2UgeworCQkJCWlmICgha2V5X3dyaXRlKGtleSwgc3Rkb3V0KSkKKwkJCQkJZnByaW50ZihzdGRlcnIsICJrZXlfd3JpdGUgZmFpbGVkIik7CisJCQkJZnByaW50ZihzdGRvdXQsICIgJXNcbiIsIGNvbW1lbnQpOworCQkJfQorCQkJa2V5X2ZyZWUoa2V5KTsKKwkJCXhmcmVlKGNvbW1lbnQpOworCQl9CisJfQorCWlmICghaGFkX2lkZW50aXRpZXMpIHsKKwkJcHJpbnRmKCJUaGUgYWdlbnQgaGFzIG5vIGlkZW50aXRpZXMuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbG9ja19hZ2VudChBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKmFjLCBpbnQgbG9jaykKK3sKKwljaGFyIHByb21wdFsxMDBdLCAqcDEsICpwMjsKKwlpbnQgcGFzc29rID0gMSwgcmV0ID0gLTE7CisKKwlzdHJsY3B5KHByb21wdCwgIkVudGVyIGxvY2sgcGFzc3dvcmQ6ICIsIHNpemVvZihwcm9tcHQpKTsKKwlwMSA9IHJlYWRfcGFzc3BocmFzZShwcm9tcHQsIFJQX0FMTE9XX1NURElOKTsKKwlpZiAobG9jaykgeworCQlzdHJsY3B5KHByb21wdCwgIkFnYWluOiAiLCBzaXplb2YgcHJvbXB0KTsKKwkJcDIgPSByZWFkX3Bhc3NwaHJhc2UocHJvbXB0LCBSUF9BTExPV19TVERJTik7CisJCWlmIChzdHJjbXAocDEsIHAyKSAhPSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlBhc3N3b3JkcyBkbyBub3QgbWF0Y2guXG4iKTsKKwkJCXBhc3NvayA9IDA7CisJCX0KKwkJbWVtc2V0KHAyLCAwLCBzdHJsZW4ocDIpKTsKKwkJeGZyZWUocDIpOworCX0KKwlpZiAocGFzc29rICYmIHNzaF9sb2NrX2FnZW50KGFjLCBsb2NrLCBwMSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJBZ2VudCAlc2xvY2tlZC5cbiIsIGxvY2sgPyAiIiA6ICJ1biIpOworCQlyZXQgPSAwOworCX0gZWxzZQorCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byAlc2xvY2sgYWdlbnQuXG4iLCBsb2NrID8gIiIgOiAidW4iKTsKKwltZW1zZXQocDEsIDAsIHN0cmxlbihwMSkpOworCXhmcmVlKHAxKTsKKwlyZXR1cm4gKHJldCk7Cit9CisKK3N0YXRpYyBpbnQKK2RvX2ZpbGUoQXV0aGVudGljYXRpb25Db25uZWN0aW9uICphYywgaW50IGRlbGV0aW5nLCBpbnQga2V5X29ubHksIGNoYXIgKmZpbGUpCit7CisJaWYgKGRlbGV0aW5nKSB7CisJCWlmIChkZWxldGVfZmlsZShhYywgZmlsZSkgPT0gLTEpCisJCQlyZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkJaWYgKGFkZF9maWxlKGFjLCBmaWxlLCBrZXlfb25seSkgPT0gLTEpCisJCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAordXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBbb3B0aW9uc10gW2ZpbGUgLi4uXVxuIiwgX19wcm9nbmFtZSk7CisJZnByaW50ZihzdGRlcnIsICJPcHRpb25zOlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC1sICAgICAgICAgIExpc3QgZmluZ2VycHJpbnRzIG9mIGFsbCBpZGVudGl0aWVzLlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC1MICAgICAgICAgIExpc3QgcHVibGljIGtleSBwYXJhbWV0ZXJzIG9mIGFsbCBpZGVudGl0aWVzLlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC1rICAgICAgICAgIExvYWQgb25seSBrZXlzIGFuZCBub3QgY2VydGlmaWNhdGVzLlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC1jICAgICAgICAgIFJlcXVpcmUgY29uZmlybWF0aW9uIHRvIHNpZ24gdXNpbmcgaWRlbnRpdGllc1xuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC10IGxpZmUgICAgIFNldCBsaWZldGltZSAoaW4gc2Vjb25kcykgd2hlbiBhZGRpbmcgaWRlbnRpdGllcy5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAtZCAgICAgICAgICBEZWxldGUgaWRlbnRpdHkuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgLUQgICAgICAgICAgRGVsZXRlIGFsbCBpZGVudGl0aWVzLlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC14ICAgICAgICAgIExvY2sgYWdlbnQuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgLVggICAgICAgICAgVW5sb2NrIGFnZW50LlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC1zIHBrY3MxMSAgIEFkZCBrZXlzIGZyb20gUEtDUyMxMSBwcm92aWRlci5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAtZSBwa2NzMTEgICBSZW1vdmUga2V5cyBwcm92aWRlZCBieSBQS0NTIzExIHByb3ZpZGVyLlxuIik7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKwlleHRlcm4gaW50IG9wdGluZDsKKwlBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKmFjID0gTlVMTDsKKwljaGFyICpwa2NzMTFwcm92aWRlciA9IE5VTEw7CisJaW50IGksIGNoLCBkZWxldGluZyA9IDAsIHJldCA9IDAsIGtleV9vbmx5ID0gMDsKKworCS8qIEVuc3VyZSB0aGF0IGZkcyAwLCAxIGFuZCAyIGFyZSBvcGVuIG9yIGRpcmVjdGVkIHRvIC9kZXYvbnVsbCAqLworCXNhbml0aXNlX3N0ZGZkKCk7CisKKwlfX3Byb2duYW1lID0gc3NoX2dldF9wcm9nbmFtZShhcmd2WzBdKTsKKwlzZWVkX3JuZygpOworCisJT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKTsKKworCS8qIEF0IGZpcnN0LCBnZXQgYSBjb25uZWN0aW9uIHRvIHRoZSBhdXRoZW50aWNhdGlvbiBhZ2VudC4gKi8KKwlhYyA9IHNzaF9nZXRfYXV0aGVudGljYXRpb25fY29ubmVjdGlvbigpOworCWlmIChhYyA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkgICAgIkNvdWxkIG5vdCBvcGVuIGEgY29ubmVjdGlvbiB0byB5b3VyIGF1dGhlbnRpY2F0aW9uIGFnZW50LlxuIik7CisJCWV4aXQoMik7CisJfQorCXdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgImtsTGNkRHhYZTpzOnQ6IikpICE9IC0xKSB7CisJCXN3aXRjaCAoY2gpIHsKKwkJY2FzZSAnayc6CisJCQlrZXlfb25seSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCWNhc2UgJ0wnOgorCQkJaWYgKGxpc3RfaWRlbnRpdGllcyhhYywgY2ggPT0gJ2wnID8gMSA6IDApID09IC0xKQorCQkJCXJldCA9IDE7CisJCQlnb3RvIGRvbmU7CisJCWNhc2UgJ3gnOgorCQljYXNlICdYJzoKKwkJCWlmIChsb2NrX2FnZW50KGFjLCBjaCA9PSAneCcgPyAxIDogMCkgPT0gLTEpCisJCQkJcmV0ID0gMTsKKwkJCWdvdG8gZG9uZTsKKwkJY2FzZSAnYyc6CisJCQljb25maXJtID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWRlbGV0aW5nID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdEJzoKKwkJCWlmIChkZWxldGVfYWxsKGFjKSA9PSAtMSkKKwkJCQlyZXQgPSAxOworCQkJZ290byBkb25lOworCQljYXNlICdzJzoKKwkJCXBrY3MxMXByb3ZpZGVyID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ2UnOgorCQkJZGVsZXRpbmcgPSAxOworCQkJcGtjczExcHJvdmlkZXIgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQlpZiAoKGxpZmV0aW1lID0gY29udnRpbWUob3B0YXJnKSkgPT0gLTEpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgbGlmZXRpbWVcbiIpOworCQkJCXJldCA9IDE7CisJCQkJZ290byBkb25lOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl1c2FnZSgpOworCQkJcmV0ID0gMTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKwlhcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAocGtjczExcHJvdmlkZXIgIT0gTlVMTCkgeworCQlpZiAodXBkYXRlX2NhcmQoYWMsICFkZWxldGluZywgcGtjczExcHJvdmlkZXIpID09IC0xKQorCQkJcmV0ID0gMTsKKwkJZ290byBkb25lOworCX0KKwlpZiAoYXJnYyA9PSAwKSB7CisJCWNoYXIgYnVmW01BWFBBVEhMRU5dOworCQlzdHJ1Y3QgcGFzc3dkICpwdzsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWludCBjb3VudCA9IDA7CisKKwkJaWYgKChwdyA9IGdldHB3dWlkKGdldHVpZCgpKSkgPT0gTlVMTCkgeworCQkJZnByaW50ZihzdGRlcnIsICJObyB1c2VyIGZvdW5kIHdpdGggdWlkICV1XG4iLAorCQkJICAgICh1X2ludClnZXR1aWQoKSk7CisJCQlyZXQgPSAxOworCQkJZ290byBkb25lOworCQl9CisKKwkJZm9yIChpID0gMDsgZGVmYXVsdF9maWxlc1tpXTsgaSsrKSB7CisJCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMvJXMiLCBwdy0+cHdfZGlyLAorCQkJICAgIGRlZmF1bHRfZmlsZXNbaV0pOworCQkJaWYgKHN0YXQoYnVmLCAmc3QpIDwgMCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChkb19maWxlKGFjLCBkZWxldGluZywga2V5X29ubHksIGJ1ZikgPT0gLTEpCisJCQkJcmV0ID0gMTsKKwkJCWVsc2UKKwkJCQljb3VudCsrOworCQl9CisJCWlmIChjb3VudCA9PSAwKQorCQkJcmV0ID0gMTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisJCQlpZiAoZG9fZmlsZShhYywgZGVsZXRpbmcsIGtleV9vbmx5LCBhcmd2W2ldKSA9PSAtMSkKKwkJCQlyZXQgPSAxOworCQl9CisJfQorCWNsZWFyX3Bhc3MoKTsKKworZG9uZToKKwlzc2hfY2xvc2VfYXV0aGVudGljYXRpb25fY29ubmVjdGlvbihhYyk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc3NoLWFnZW50LjAgYi9vcGVuc3NoLTYuMHAxL3NzaC1hZ2VudC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MWY0OTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NzaC1hZ2VudC4wCkBAIC0wLDAgKzEsMTIzIEBACitTU0gtQUdFTlQoMSkgICAgICAgICAgICAgICBPcGVuQlNEIFJlZmVyZW5jZSBNYW51YWwgICAgICAgICAgICAgICBTU0gtQUdFTlQoMSkKKworTkFNRQorICAgICBzc2gtYWdlbnQgLSBhdXRoZW50aWNhdGlvbiBhZ2VudAorCitTWU5PUFNJUworICAgICBzc2gtYWdlbnQgWy1jIHwgLXNdIFstZF0gWy1hIGJpbmRfYWRkcmVzc10gWy10IGxpZmVdIFtjb21tYW5kIFthcmcgLi4uXV0KKyAgICAgc3NoLWFnZW50IFstYyB8IC1zXSAtaworCitERVNDUklQVElPTgorICAgICBzc2gtYWdlbnQgaXMgYSBwcm9ncmFtIHRvIGhvbGQgcHJpdmF0ZSBrZXlzIHVzZWQgZm9yIHB1YmxpYyBrZXkKKyAgICAgYXV0aGVudGljYXRpb24gKFJTQSwgRFNBLCBFQ0RTQSkuICBUaGUgaWRlYSBpcyB0aGF0IHNzaC1hZ2VudCBpcyBzdGFydGVkCisgICAgIGluIHRoZSBiZWdpbm5pbmcgb2YgYW4gWC1zZXNzaW9uIG9yIGEgbG9naW4gc2Vzc2lvbiwgYW5kIGFsbCBvdGhlcgorICAgICB3aW5kb3dzIG9yIHByb2dyYW1zIGFyZSBzdGFydGVkIGFzIGNsaWVudHMgdG8gdGhlIHNzaC1hZ2VudCBwcm9ncmFtLgorICAgICBUaHJvdWdoIHVzZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhlIGFnZW50IGNhbiBiZSBsb2NhdGVkIGFuZAorICAgICBhdXRvbWF0aWNhbGx5IHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uIHdoZW4gbG9nZ2luZyBpbiB0byBvdGhlciBtYWNoaW5lcworICAgICB1c2luZyBzc2goMSkuCisKKyAgICAgVGhlIG9wdGlvbnMgYXJlIGFzIGZvbGxvd3M6CisKKyAgICAgLWEgYmluZF9hZGRyZXNzCisgICAgICAgICAgICAgQmluZCB0aGUgYWdlbnQgdG8gdGhlIFVOSVgtZG9tYWluIHNvY2tldCBiaW5kX2FkZHJlc3MuICBUaGUKKyAgICAgICAgICAgICBkZWZhdWx0IGlzICRUTVBESVIvc3NoLVhYWFhYWFhYWFgvYWdlbnQuPHBwaWQ+LgorCisgICAgIC1jICAgICAgR2VuZXJhdGUgQy1zaGVsbCBjb21tYW5kcyBvbiBzdGRvdXQuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGlmCisgICAgICAgICAgICAgU0hFTEwgbG9va3MgbGlrZSBpdCdzIGEgY3NoIHN0eWxlIG9mIHNoZWxsLgorCisgICAgIC1kICAgICAgRGVidWcgbW9kZS4gIFdoZW4gdGhpcyBvcHRpb24gaXMgc3BlY2lmaWVkIHNzaC1hZ2VudCB3aWxsIG5vdAorICAgICAgICAgICAgIGZvcmsuCisKKyAgICAgLWsgICAgICBLaWxsIHRoZSBjdXJyZW50IGFnZW50IChnaXZlbiBieSB0aGUgU1NIX0FHRU5UX1BJRCBlbnZpcm9ubWVudAorICAgICAgICAgICAgIHZhcmlhYmxlKS4KKworICAgICAtcyAgICAgIEdlbmVyYXRlIEJvdXJuZSBzaGVsbCBjb21tYW5kcyBvbiBzdGRvdXQuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGlmCisgICAgICAgICAgICAgU0hFTEwgZG9lcyBub3QgbG9vayBsaWtlIGl0J3MgYSBjc2ggc3R5bGUgb2Ygc2hlbGwuCisKKyAgICAgLXQgbGlmZQorICAgICAgICAgICAgIFNldCBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBtYXhpbXVtIGxpZmV0aW1lIG9mIGlkZW50aXRpZXMgYWRkZWQKKyAgICAgICAgICAgICB0byB0aGUgYWdlbnQuICBUaGUgbGlmZXRpbWUgbWF5IGJlIHNwZWNpZmllZCBpbiBzZWNvbmRzIG9yIGluIGEKKyAgICAgICAgICAgICB0aW1lIGZvcm1hdCBzcGVjaWZpZWQgaW4gc3NoZF9jb25maWcoNSkuICBBIGxpZmV0aW1lIHNwZWNpZmllZAorICAgICAgICAgICAgIGZvciBhbiBpZGVudGl0eSB3aXRoIHNzaC1hZGQoMSkgb3ZlcnJpZGVzIHRoaXMgdmFsdWUuICBXaXRob3V0CisgICAgICAgICAgICAgdGhpcyBvcHRpb24gdGhlIGRlZmF1bHQgbWF4aW11bSBsaWZldGltZSBpcyBmb3JldmVyLgorCisgICAgIElmIGEgY29tbWFuZGxpbmUgaXMgZ2l2ZW4sIHRoaXMgaXMgZXhlY3V0ZWQgYXMgYSBzdWJwcm9jZXNzIG9mIHRoZSBhZ2VudC4KKyAgICAgV2hlbiB0aGUgY29tbWFuZCBkaWVzLCBzbyBkb2VzIHRoZSBhZ2VudC4KKworICAgICBUaGUgYWdlbnQgaW5pdGlhbGx5IGRvZXMgbm90IGhhdmUgYW55IHByaXZhdGUga2V5cy4gIEtleXMgYXJlIGFkZGVkIHVzaW5nCisgICAgIHNzaC1hZGQoMSkuICBXaGVuIGV4ZWN1dGVkIHdpdGhvdXQgYXJndW1lbnRzLCBzc2gtYWRkKDEpIGFkZHMgdGhlIGZpbGVzCisgICAgIH4vLnNzaC9pZF9yc2EsIH4vLnNzaC9pZF9kc2EsIH4vLnNzaC9pZF9lY2RzYSBhbmQgfi8uc3NoL2lkZW50aXR5LiAgSWYKKyAgICAgdGhlIGlkZW50aXR5IGhhcyBhIHBhc3NwaHJhc2UsIHNzaC1hZGQoMSkgYXNrcyBmb3IgdGhlIHBhc3NwaHJhc2Ugb24gdGhlCisgICAgIHRlcm1pbmFsIGlmIGl0IGhhcyBvbmUgb3IgZnJvbSBhIHNtYWxsIFgxMSBwcm9ncmFtIGlmIHJ1bm5pbmcgdW5kZXIgWDExLgorICAgICBJZiBuZWl0aGVyIG9mIHRoZXNlIGlzIHRoZSBjYXNlIHRoZW4gdGhlIGF1dGhlbnRpY2F0aW9uIHdpbGwgZmFpbC4gIEl0CisgICAgIHRoZW4gc2VuZHMgdGhlIGlkZW50aXR5IHRvIHRoZSBhZ2VudC4gIFNldmVyYWwgaWRlbnRpdGllcyBjYW4gYmUgc3RvcmVkCisgICAgIGluIHRoZSBhZ2VudDsgdGhlIGFnZW50IGNhbiBhdXRvbWF0aWNhbGx5IHVzZSBhbnkgb2YgdGhlc2UgaWRlbnRpdGllcy4KKyAgICAgc3NoLWFkZCAtbCBkaXNwbGF5cyB0aGUgaWRlbnRpdGllcyBjdXJyZW50bHkgaGVsZCBieSB0aGUgYWdlbnQuCisKKyAgICAgVGhlIGlkZWEgaXMgdGhhdCB0aGUgYWdlbnQgaXMgcnVuIGluIHRoZSB1c2VyJ3MgbG9jYWwgUEMsIGxhcHRvcCwgb3IKKyAgICAgdGVybWluYWwuICBBdXRoZW50aWNhdGlvbiBkYXRhIG5lZWQgbm90IGJlIHN0b3JlZCBvbiBhbnkgb3RoZXIgbWFjaGluZSwKKyAgICAgYW5kIGF1dGhlbnRpY2F0aW9uIHBhc3NwaHJhc2VzIG5ldmVyIGdvIG92ZXIgdGhlIG5ldHdvcmsuICBIb3dldmVyLCB0aGUKKyAgICAgY29ubmVjdGlvbiB0byB0aGUgYWdlbnQgaXMgZm9yd2FyZGVkIG92ZXIgU1NIIHJlbW90ZSBsb2dpbnMsIGFuZCB0aGUgdXNlcgorICAgICBjYW4gdGh1cyB1c2UgdGhlIHByaXZpbGVnZXMgZ2l2ZW4gYnkgdGhlIGlkZW50aXRpZXMgYW55d2hlcmUgaW4gdGhlCisgICAgIG5ldHdvcmsgaW4gYSBzZWN1cmUgd2F5LgorCisgICAgIFRoZXJlIGFyZSB0d28gbWFpbiB3YXlzIHRvIGdldCBhbiBhZ2VudCBzZXQgdXA6IFRoZSBmaXJzdCBpcyB0aGF0IHRoZQorICAgICBhZ2VudCBzdGFydHMgYSBuZXcgc3ViY29tbWFuZCBpbnRvIHdoaWNoIHNvbWUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZQorICAgICBleHBvcnRlZCwgZWcgc3NoLWFnZW50IHh0ZXJtICYuICBUaGUgc2Vjb25kIGlzIHRoYXQgdGhlIGFnZW50IHByaW50cyB0aGUKKyAgICAgbmVlZGVkIHNoZWxsIGNvbW1hbmRzIChlaXRoZXIgc2goMSkgb3IgY3NoKDEpIHN5bnRheCBjYW4gYmUgZ2VuZXJhdGVkKQorICAgICB3aGljaCBjYW4gYmUgZXZhbHVhdGVkIGluIHRoZSBjYWxsaW5nIHNoZWxsLCBlZyBldmFsIGBzc2gtYWdlbnQgLXNgIGZvcgorICAgICBCb3VybmUtdHlwZSBzaGVsbHMgc3VjaCBhcyBzaCgxKSBvciBrc2goMSkgYW5kIGV2YWwgYHNzaC1hZ2VudCAtY2AgZm9yCisgICAgIGNzaCgxKSBhbmQgZGVyaXZhdGl2ZXMuCisKKyAgICAgTGF0ZXIgc3NoKDEpIGxvb2tzIGF0IHRoZXNlIHZhcmlhYmxlcyBhbmQgdXNlcyB0aGVtIHRvIGVzdGFibGlzaCBhCisgICAgIGNvbm5lY3Rpb24gdG8gdGhlIGFnZW50LgorCisgICAgIFRoZSBhZ2VudCB3aWxsIG5ldmVyIHNlbmQgYSBwcml2YXRlIGtleSBvdmVyIGl0cyByZXF1ZXN0IGNoYW5uZWwuCisgICAgIEluc3RlYWQsIG9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIGEgcHJpdmF0ZSBrZXkgd2lsbCBiZSBwZXJmb3JtZWQgYnkgdGhlCisgICAgIGFnZW50LCBhbmQgdGhlIHJlc3VsdCB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSByZXF1ZXN0ZXIuICBUaGlzIHdheSwKKyAgICAgcHJpdmF0ZSBrZXlzIGFyZSBub3QgZXhwb3NlZCB0byBjbGllbnRzIHVzaW5nIHRoZSBhZ2VudC4KKworICAgICBBIFVOSVgtZG9tYWluIHNvY2tldCBpcyBjcmVhdGVkIGFuZCB0aGUgbmFtZSBvZiB0aGlzIHNvY2tldCBpcyBzdG9yZWQgaW4KKyAgICAgdGhlIFNTSF9BVVRIX1NPQ0sgZW52aXJvbm1lbnQgdmFyaWFibGUuICBUaGUgc29ja2V0IGlzIG1hZGUgYWNjZXNzaWJsZQorICAgICBvbmx5IHRvIHRoZSBjdXJyZW50IHVzZXIuICBUaGlzIG1ldGhvZCBpcyBlYXNpbHkgYWJ1c2VkIGJ5IHJvb3Qgb3IKKyAgICAgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgc2FtZSB1c2VyLgorCisgICAgIFRoZSBTU0hfQUdFTlRfUElEIGVudmlyb25tZW50IHZhcmlhYmxlIGhvbGRzIHRoZSBhZ2VudCdzIHByb2Nlc3MgSUQuCisKKyAgICAgVGhlIGFnZW50IGV4aXRzIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgY29tbWFuZCBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lCisgICAgIHRlcm1pbmF0ZXMuCisKK0ZJTEVTCisgICAgIH4vLnNzaC9pZGVudGl0eQorICAgICAgICAgICAgIENvbnRhaW5zIHRoZSBwcm90b2NvbCB2ZXJzaW9uIDEgUlNBIGF1dGhlbnRpY2F0aW9uIGlkZW50aXR5IG9mCisgICAgICAgICAgICAgdGhlIHVzZXIuCisKKyAgICAgfi8uc3NoL2lkX2RzYQorICAgICAgICAgICAgIENvbnRhaW5zIHRoZSBwcm90b2NvbCB2ZXJzaW9uIDIgRFNBIGF1dGhlbnRpY2F0aW9uIGlkZW50aXR5IG9mCisgICAgICAgICAgICAgdGhlIHVzZXIuCisKKyAgICAgfi8uc3NoL2lkX2VjZHNhCisgICAgICAgICAgICAgQ29udGFpbnMgdGhlIHByb3RvY29sIHZlcnNpb24gMiBFQ0RTQSBhdXRoZW50aWNhdGlvbiBpZGVudGl0eSBvZgorICAgICAgICAgICAgIHRoZSB1c2VyLgorCisgICAgIH4vLnNzaC9pZF9yc2EKKyAgICAgICAgICAgICBDb250YWlucyB0aGUgcHJvdG9jb2wgdmVyc2lvbiAyIFJTQSBhdXRoZW50aWNhdGlvbiBpZGVudGl0eSBvZgorICAgICAgICAgICAgIHRoZSB1c2VyLgorCisgICAgICRUTVBESVIvc3NoLVhYWFhYWFhYWFgvYWdlbnQuPHBwaWQ+CisgICAgICAgICAgICAgVU5JWC1kb21haW4gc29ja2V0cyB1c2VkIHRvIGNvbnRhaW4gdGhlIGNvbm5lY3Rpb24gdG8gdGhlCisgICAgICAgICAgICAgYXV0aGVudGljYXRpb24gYWdlbnQuICBUaGVzZSBzb2NrZXRzIHNob3VsZCBvbmx5IGJlIHJlYWRhYmxlIGJ5CisgICAgICAgICAgICAgdGhlIG93bmVyLiAgVGhlIHNvY2tldHMgc2hvdWxkIGdldCBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgd2hlbiB0aGUKKyAgICAgICAgICAgICBhZ2VudCBleGl0cy4KKworU0VFIEFMU08KKyAgICAgc3NoKDEpLCBzc2gtYWRkKDEpLCBzc2gta2V5Z2VuKDEpLCBzc2hkKDgpCisKK0FVVEhPUlMKKyAgICAgT3BlblNTSCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGFuZCBmcmVlIHNzaCAxLjIuMTIgcmVsZWFzZSBieQorICAgICBUYXR1IFlsb25lbi4gIEFhcm9uIENhbXBiZWxsLCBCb2IgQmVjaywgTWFya3VzIEZyaWVkbCwgTmllbHMgUHJvdm9zLCBUaGVvCisgICAgIGRlIFJhYWR0IGFuZCBEdWcgU29uZyByZW1vdmVkIG1hbnkgYnVncywgcmUtYWRkZWQgbmV3ZXIgZmVhdHVyZXMgYW5kCisgICAgIGNyZWF0ZWQgT3BlblNTSC4gIE1hcmt1cyBGcmllZGwgY29udHJpYnV0ZWQgdGhlIHN1cHBvcnQgZm9yIFNTSCBwcm90b2NvbAorICAgICB2ZXJzaW9ucyAxLjUgYW5kIDIuMC4KKworT3BlbkJTRCA1LjAgICAgICAgICAgICAgICAgICAgIE5vdmVtYmVyIDIxLCAyMDEwICAgICAgICAgICAgICAgICAgIE9wZW5CU0QgNS4wCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NzaC1hZ2VudC4xIGIvb3BlbnNzaC02LjBwMS9zc2gtYWdlbnQuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjgwMWM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zc2gtYWdlbnQuMQpAQCAtMCwwICsxLDIxNCBAQAorLlwiICRPcGVuQlNEOiBzc2gtYWdlbnQuMSx2IDEuNTMgMjAxMC8xMS8yMSAwMTowMToxMyBkam0gRXhwICQKKy5cIgorLlwiIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+CisuXCIgQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKy5cIiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorLlwiCisuXCIgQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorLlwiIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCisuXCIgc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworLlwiIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKy5cIiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTkgQWFyb24gQ2FtcGJlbGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiIENvcHlyaWdodCAoYykgMTk5OSBUaGVvIGRlIFJhYWR0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisuXCIgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLlwiIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisuXCIgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLlwiIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLlwiIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy5cIiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy5cIiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisuXCIgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisuXCIgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy5cIgorLkRkICRNZG9jZGF0ZTogTm92ZW1iZXIgMjEgMjAxMCAkCisuRHQgU1NILUFHRU5UIDEKKy5PcworLlNoIE5BTUUKKy5ObSBzc2gtYWdlbnQKKy5OZCBhdXRoZW50aWNhdGlvbiBhZ2VudAorLlNoIFNZTk9QU0lTCisuTm0gc3NoLWFnZW50CisuT3AgRmwgYyB8IHMKKy5PcCBGbCBkCisuT3AgRmwgYSBBciBiaW5kX2FkZHJlc3MKKy5PcCBGbCB0IEFyIGxpZmUKKy5PcCBBciBjb21tYW5kIE9wIEFyIGFyZyAuLi4KKy5ObSBzc2gtYWdlbnQKKy5PcCBGbCBjIHwgcworLkZsIGsKKy5TaCBERVNDUklQVElPTgorLk5tCitpcyBhIHByb2dyYW0gdG8gaG9sZCBwcml2YXRlIGtleXMgdXNlZCBmb3IgcHVibGljIGtleSBhdXRoZW50aWNhdGlvbgorKFJTQSwgRFNBLCBFQ0RTQSkuCitUaGUgaWRlYSBpcyB0aGF0CisuTm0KK2lzIHN0YXJ0ZWQgaW4gdGhlIGJlZ2lubmluZyBvZiBhbiBYLXNlc3Npb24gb3IgYSBsb2dpbiBzZXNzaW9uLCBhbmQKK2FsbCBvdGhlciB3aW5kb3dzIG9yIHByb2dyYW1zIGFyZSBzdGFydGVkIGFzIGNsaWVudHMgdG8gdGhlIHNzaC1hZ2VudAorcHJvZ3JhbS4KK1Rocm91Z2ggdXNlIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGUgYWdlbnQgY2FuIGJlIGxvY2F0ZWQKK2FuZCBhdXRvbWF0aWNhbGx5IHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uIHdoZW4gbG9nZ2luZyBpbiB0byBvdGhlcgorbWFjaGluZXMgdXNpbmcKKy5YciBzc2ggMSAuCisuUHAKK1RoZSBvcHRpb25zIGFyZSBhcyBmb2xsb3dzOgorLkJsIC10YWcgLXdpZHRoIERzCisuSXQgRmwgYSBBciBiaW5kX2FkZHJlc3MKK0JpbmQgdGhlIGFnZW50IHRvIHRoZQorLlV4IE5zIC1kb21haW4KK3NvY2tldAorLkFyIGJpbmRfYWRkcmVzcyAuCitUaGUgZGVmYXVsdCBpcworLlBhICRUTVBESVIvc3NoLVhYWFhYWFhYWFgvYWdlbnQuXCooTHRwcGlkXCooR3QgLgorLkl0IEZsIGMKK0dlbmVyYXRlIEMtc2hlbGwgY29tbWFuZHMgb24KKy5EdiBzdGRvdXQgLgorVGhpcyBpcyB0aGUgZGVmYXVsdCBpZgorLkV2IFNIRUxMCitsb29rcyBsaWtlIGl0J3MgYSBjc2ggc3R5bGUgb2Ygc2hlbGwuCisuSXQgRmwgZAorRGVidWcgbW9kZS4KK1doZW4gdGhpcyBvcHRpb24gaXMgc3BlY2lmaWVkCisuTm0KK3dpbGwgbm90IGZvcmsuCisuSXQgRmwgaworS2lsbCB0aGUgY3VycmVudCBhZ2VudCAoZ2l2ZW4gYnkgdGhlCisuRXYgU1NIX0FHRU5UX1BJRAorZW52aXJvbm1lbnQgdmFyaWFibGUpLgorLkl0IEZsIHMKK0dlbmVyYXRlIEJvdXJuZSBzaGVsbCBjb21tYW5kcyBvbgorLkR2IHN0ZG91dCAuCitUaGlzIGlzIHRoZSBkZWZhdWx0IGlmCisuRXYgU0hFTEwKK2RvZXMgbm90IGxvb2sgbGlrZSBpdCdzIGEgY3NoIHN0eWxlIG9mIHNoZWxsLgorLkl0IEZsIHQgQXIgbGlmZQorU2V0IGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIG1heGltdW0gbGlmZXRpbWUgb2YgaWRlbnRpdGllcyBhZGRlZCB0byB0aGUgYWdlbnQuCitUaGUgbGlmZXRpbWUgbWF5IGJlIHNwZWNpZmllZCBpbiBzZWNvbmRzIG9yIGluIGEgdGltZSBmb3JtYXQgc3BlY2lmaWVkIGluCisuWHIgc3NoZF9jb25maWcgNSAuCitBIGxpZmV0aW1lIHNwZWNpZmllZCBmb3IgYW4gaWRlbnRpdHkgd2l0aAorLlhyIHNzaC1hZGQgMQorb3ZlcnJpZGVzIHRoaXMgdmFsdWUuCitXaXRob3V0IHRoaXMgb3B0aW9uIHRoZSBkZWZhdWx0IG1heGltdW0gbGlmZXRpbWUgaXMgZm9yZXZlci4KKy5FbAorLlBwCitJZiBhIGNvbW1hbmRsaW5lIGlzIGdpdmVuLCB0aGlzIGlzIGV4ZWN1dGVkIGFzIGEgc3VicHJvY2VzcyBvZiB0aGUgYWdlbnQuCitXaGVuIHRoZSBjb21tYW5kIGRpZXMsIHNvIGRvZXMgdGhlIGFnZW50LgorLlBwCitUaGUgYWdlbnQgaW5pdGlhbGx5IGRvZXMgbm90IGhhdmUgYW55IHByaXZhdGUga2V5cy4KK0tleXMgYXJlIGFkZGVkIHVzaW5nCisuWHIgc3NoLWFkZCAxIC4KK1doZW4gZXhlY3V0ZWQgd2l0aG91dCBhcmd1bWVudHMsCisuWHIgc3NoLWFkZCAxCithZGRzIHRoZSBmaWxlcworLlBhIH4vLnNzaC9pZF9yc2EgLAorLlBhIH4vLnNzaC9pZF9kc2EgLAorLlBhIH4vLnNzaC9pZF9lY2RzYQorYW5kCisuUGEgfi8uc3NoL2lkZW50aXR5IC4KK0lmIHRoZSBpZGVudGl0eSBoYXMgYSBwYXNzcGhyYXNlLAorLlhyIHNzaC1hZGQgMQorYXNrcyBmb3IgdGhlIHBhc3NwaHJhc2Ugb24gdGhlIHRlcm1pbmFsIGlmIGl0IGhhcyBvbmUgb3IgZnJvbSBhIHNtYWxsIFgxMQorcHJvZ3JhbSBpZiBydW5uaW5nIHVuZGVyIFgxMS4KK0lmIG5laXRoZXIgb2YgdGhlc2UgaXMgdGhlIGNhc2UgdGhlbiB0aGUgYXV0aGVudGljYXRpb24gd2lsbCBmYWlsLgorSXQgdGhlbiBzZW5kcyB0aGUgaWRlbnRpdHkgdG8gdGhlIGFnZW50LgorU2V2ZXJhbCBpZGVudGl0aWVzIGNhbiBiZSBzdG9yZWQgaW4gdGhlCithZ2VudDsgdGhlIGFnZW50IGNhbiBhdXRvbWF0aWNhbGx5IHVzZSBhbnkgb2YgdGhlc2UgaWRlbnRpdGllcy4KKy5JYyBzc2gtYWRkIC1sCitkaXNwbGF5cyB0aGUgaWRlbnRpdGllcyBjdXJyZW50bHkgaGVsZCBieSB0aGUgYWdlbnQuCisuUHAKK1RoZSBpZGVhIGlzIHRoYXQgdGhlIGFnZW50IGlzIHJ1biBpbiB0aGUgdXNlcidzIGxvY2FsIFBDLCBsYXB0b3AsIG9yCit0ZXJtaW5hbC4KK0F1dGhlbnRpY2F0aW9uIGRhdGEgbmVlZCBub3QgYmUgc3RvcmVkIG9uIGFueSBvdGhlcgorbWFjaGluZSwgYW5kIGF1dGhlbnRpY2F0aW9uIHBhc3NwaHJhc2VzIG5ldmVyIGdvIG92ZXIgdGhlIG5ldHdvcmsuCitIb3dldmVyLCB0aGUgY29ubmVjdGlvbiB0byB0aGUgYWdlbnQgaXMgZm9yd2FyZGVkIG92ZXIgU1NICityZW1vdGUgbG9naW5zLCBhbmQgdGhlIHVzZXIgY2FuIHRodXMgdXNlIHRoZSBwcml2aWxlZ2VzIGdpdmVuIGJ5IHRoZQoraWRlbnRpdGllcyBhbnl3aGVyZSBpbiB0aGUgbmV0d29yayBpbiBhIHNlY3VyZSB3YXkuCisuUHAKK1RoZXJlIGFyZSB0d28gbWFpbiB3YXlzIHRvIGdldCBhbiBhZ2VudCBzZXQgdXA6CitUaGUgZmlyc3QgaXMgdGhhdCB0aGUgYWdlbnQgc3RhcnRzIGEgbmV3IHN1YmNvbW1hbmQgaW50byB3aGljaCBzb21lIGVudmlyb25tZW50Cit2YXJpYWJsZXMgYXJlIGV4cG9ydGVkLCBlZworLkNtIHNzaC1hZ2VudCB4dGVybSAmIC4KK1RoZSBzZWNvbmQgaXMgdGhhdCB0aGUgYWdlbnQgcHJpbnRzIHRoZSBuZWVkZWQgc2hlbGwgY29tbWFuZHMgKGVpdGhlcgorLlhyIHNoIDEKK29yCisuWHIgY3NoIDEKK3N5bnRheCBjYW4gYmUgZ2VuZXJhdGVkKSB3aGljaCBjYW4gYmUgZXZhbHVhdGVkIGluIHRoZSBjYWxsaW5nIHNoZWxsLCBlZworLkNtIGV2YWwgYHNzaC1hZ2VudCAtc2AKK2ZvciBCb3VybmUtdHlwZSBzaGVsbHMgc3VjaCBhcworLlhyIHNoIDEKK29yCisuWHIga3NoIDEKK2FuZAorLkNtIGV2YWwgYHNzaC1hZ2VudCAtY2AKK2ZvcgorLlhyIGNzaCAxCithbmQgZGVyaXZhdGl2ZXMuCisuUHAKK0xhdGVyCisuWHIgc3NoIDEKK2xvb2tzIGF0IHRoZXNlIHZhcmlhYmxlcyBhbmQgdXNlcyB0aGVtIHRvIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gdGhlIGFnZW50LgorLlBwCitUaGUgYWdlbnQgd2lsbCBuZXZlciBzZW5kIGEgcHJpdmF0ZSBrZXkgb3ZlciBpdHMgcmVxdWVzdCBjaGFubmVsLgorSW5zdGVhZCwgb3BlcmF0aW9ucyB0aGF0IHJlcXVpcmUgYSBwcml2YXRlIGtleSB3aWxsIGJlIHBlcmZvcm1lZAorYnkgdGhlIGFnZW50LCBhbmQgdGhlIHJlc3VsdCB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSByZXF1ZXN0ZXIuCitUaGlzIHdheSwgcHJpdmF0ZSBrZXlzIGFyZSBub3QgZXhwb3NlZCB0byBjbGllbnRzIHVzaW5nIHRoZSBhZ2VudC4KKy5QcAorQQorLlV4IE5zIC1kb21haW4KK3NvY2tldCBpcyBjcmVhdGVkIGFuZCB0aGUgbmFtZSBvZiB0aGlzIHNvY2tldCBpcyBzdG9yZWQgaW4gdGhlCisuRXYgU1NIX0FVVEhfU09DSworZW52aXJvbm1lbnQKK3ZhcmlhYmxlLgorVGhlIHNvY2tldCBpcyBtYWRlIGFjY2Vzc2libGUgb25seSB0byB0aGUgY3VycmVudCB1c2VyLgorVGhpcyBtZXRob2QgaXMgZWFzaWx5IGFidXNlZCBieSByb290IG9yIGFub3RoZXIgaW5zdGFuY2Ugb2YgdGhlIHNhbWUKK3VzZXIuCisuUHAKK1RoZQorLkV2IFNTSF9BR0VOVF9QSUQKK2Vudmlyb25tZW50IHZhcmlhYmxlIGhvbGRzIHRoZSBhZ2VudCdzIHByb2Nlc3MgSUQuCisuUHAKK1RoZSBhZ2VudCBleGl0cyBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGNvbW1hbmQgZ2l2ZW4gb24gdGhlIGNvbW1hbmQKK2xpbmUgdGVybWluYXRlcy4KKy5TaCBGSUxFUworLkJsIC10YWcgLXdpZHRoIERzCisuSXQgUGEgfi8uc3NoL2lkZW50aXR5CitDb250YWlucyB0aGUgcHJvdG9jb2wgdmVyc2lvbiAxIFJTQSBhdXRoZW50aWNhdGlvbiBpZGVudGl0eSBvZiB0aGUgdXNlci4KKy5JdCBQYSB+Ly5zc2gvaWRfZHNhCitDb250YWlucyB0aGUgcHJvdG9jb2wgdmVyc2lvbiAyIERTQSBhdXRoZW50aWNhdGlvbiBpZGVudGl0eSBvZiB0aGUgdXNlci4KKy5JdCBQYSB+Ly5zc2gvaWRfZWNkc2EKK0NvbnRhaW5zIHRoZSBwcm90b2NvbCB2ZXJzaW9uIDIgRUNEU0EgYXV0aGVudGljYXRpb24gaWRlbnRpdHkgb2YgdGhlIHVzZXIuCisuSXQgUGEgfi8uc3NoL2lkX3JzYQorQ29udGFpbnMgdGhlIHByb3RvY29sIHZlcnNpb24gMiBSU0EgYXV0aGVudGljYXRpb24gaWRlbnRpdHkgb2YgdGhlIHVzZXIuCisuSXQgUGEgJFRNUERJUi9zc2gtWFhYWFhYWFhYWC9hZ2VudC5cKihMdHBwaWRcKihHdAorLlV4IE5zIC1kb21haW4KK3NvY2tldHMgdXNlZCB0byBjb250YWluIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBhdXRoZW50aWNhdGlvbiBhZ2VudC4KK1RoZXNlIHNvY2tldHMgc2hvdWxkIG9ubHkgYmUgcmVhZGFibGUgYnkgdGhlIG93bmVyLgorVGhlIHNvY2tldHMgc2hvdWxkIGdldCBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgd2hlbiB0aGUgYWdlbnQgZXhpdHMuCisuRWwKKy5TaCBTRUUgQUxTTworLlhyIHNzaCAxICwKKy5YciBzc2gtYWRkIDEgLAorLlhyIHNzaC1rZXlnZW4gMSAsCisuWHIgc3NoZCA4CisuU2ggQVVUSE9SUworT3BlblNTSCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGFuZCBmcmVlCitzc2ggMS4yLjEyIHJlbGVhc2UgYnkgVGF0dSBZbG9uZW4uCitBYXJvbiBDYW1wYmVsbCwgQm9iIEJlY2ssIE1hcmt1cyBGcmllZGwsIE5pZWxzIFByb3ZvcywKK1RoZW8gZGUgUmFhZHQgYW5kIER1ZyBTb25nCityZW1vdmVkIG1hbnkgYnVncywgcmUtYWRkZWQgbmV3ZXIgZmVhdHVyZXMgYW5kCitjcmVhdGVkIE9wZW5TU0guCitNYXJrdXMgRnJpZWRsIGNvbnRyaWJ1dGVkIHRoZSBzdXBwb3J0IGZvciBTU0gKK3Byb3RvY29sIHZlcnNpb25zIDEuNSBhbmQgMi4wLgpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zc2gtYWdlbnQuYyBiL29wZW5zc2gtNi4wcDEvc3NoLWFnZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk0OThlNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc3NoLWFnZW50LmMKQEAgLTAsMCArMSwxMzczIEBACisvKiAkT3BlbkJTRDogc3NoLWFnZW50LmMsdiAxLjE3MiAyMDExLzA2LzAzIDAxOjM3OjQwIGR0dWNrZXIgRXhwICQgKi8KKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiBUaGUgYXV0aGVudGljYXRpb24gYWdlbnQgcHJvZ3JhbS4KKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpZmRlZiBIQVZFX1NZU19USU1FX0gKKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1VOX0gKKyMgaW5jbHVkZSA8c3lzL3VuLmg+CisjZW5kaWYKKyNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9zeXMtcXVldWUuaCIKKworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KKyNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9vcGVuc3NsLWNvbXBhdC5oIgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2lmZGVmIEhBVkVfUEFUSFNfSAorIyBpbmNsdWRlIDxwYXRocy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAic3NoLmgiCisjaW5jbHVkZSAicnNhLmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAia2V5LmgiCisjaW5jbHVkZSAiYXV0aGZkLmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAibWlzYy5oIgorCisjaWZkZWYgRU5BQkxFX1BLQ1MxMQorI2luY2x1ZGUgInNzaC1wa2NzMTEuaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX1NZU19QUkNUTF9IKQorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgkvKiBGb3IgcHJjdGwoKSBhbmQgUFJfU0VUX0RVTVBBQkxFICovCisjZW5kaWYKKwordHlwZWRlZiBlbnVtIHsKKwlBVVRIX1VOVVNFRCwKKwlBVVRIX1NPQ0tFVCwKKwlBVVRIX0NPTk5FQ1RJT04KK30gc29ja190eXBlOworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGZkOworCXNvY2tfdHlwZSB0eXBlOworCUJ1ZmZlciBpbnB1dDsKKwlCdWZmZXIgb3V0cHV0OworCUJ1ZmZlciByZXF1ZXN0OworfSBTb2NrZXRFbnRyeTsKKwordV9pbnQgc29ja2V0c19hbGxvYyA9IDA7CitTb2NrZXRFbnRyeSAqc29ja2V0cyA9IE5VTEw7CisKK3R5cGVkZWYgc3RydWN0IGlkZW50aXR5IHsKKwlUQUlMUV9FTlRSWShpZGVudGl0eSkgbmV4dDsKKwlLZXkgKmtleTsKKwljaGFyICpjb21tZW50OworCWNoYXIgKnByb3ZpZGVyOworCXVfaW50IGRlYXRoOworCXVfaW50IGNvbmZpcm07Cit9IElkZW50aXR5OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IG5lbnRyaWVzOworCVRBSUxRX0hFQUQoaWRxdWV1ZSwgaWRlbnRpdHkpIGlkbGlzdDsKK30gSWR0YWI7CisKKy8qIHByaXZhdGUga2V5IHRhYmxlLCBvbmUgcGVyIHByb3RvY29sIHZlcnNpb24gKi8KK0lkdGFiIGlkdGFibGVbM107CisKK2ludCBtYXhfZmQgPSAwOworCisvKiBwaWQgb2Ygc2hlbGwgPT0gcGFyZW50IG9mIGFnZW50ICovCitwaWRfdCBwYXJlbnRfcGlkID0gLTE7Cit1X2ludCBwYXJlbnRfYWxpdmVfaW50ZXJ2YWwgPSAwOworCisvKiBwYXRobmFtZSBhbmQgZGlyZWN0b3J5IGZvciBBVVRIX1NPQ0tFVCAqLworY2hhciBzb2NrZXRfbmFtZVtNQVhQQVRITEVOXTsKK2NoYXIgc29ja2V0X2RpcltNQVhQQVRITEVOXTsKKworLyogbG9ja2luZyAqLworaW50IGxvY2tlZCA9IDA7CitjaGFyICpsb2NrX3Bhc3N3ZCA9IE5VTEw7CisKK2V4dGVybiBjaGFyICpfX3Byb2duYW1lOworCisvKiBEZWZhdWx0IGxpZmV0aW1lICgwID09IGZvcmV2ZXIpICovCitzdGF0aWMgaW50IGxpZmV0aW1lID0gMDsKKworc3RhdGljIHZvaWQKK2Nsb3NlX3NvY2tldChTb2NrZXRFbnRyeSAqZSkKK3sKKwljbG9zZShlLT5mZCk7CisJZS0+ZmQgPSAtMTsKKwllLT50eXBlID0gQVVUSF9VTlVTRUQ7CisJYnVmZmVyX2ZyZWUoJmUtPmlucHV0KTsKKwlidWZmZXJfZnJlZSgmZS0+b3V0cHV0KTsKKwlidWZmZXJfZnJlZSgmZS0+cmVxdWVzdCk7Cit9CisKK3N0YXRpYyB2b2lkCitpZHRhYl9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDw9MjsgaSsrKSB7CisJCVRBSUxRX0lOSVQoJmlkdGFibGVbaV0uaWRsaXN0KTsKKwkJaWR0YWJsZVtpXS5uZW50cmllcyA9IDA7CisJfQorfQorCisvKiByZXR1cm4gcHJpdmF0ZSBrZXkgdGFibGUgZm9yIHJlcXVlc3RlZCBwcm90b2NvbCB2ZXJzaW9uICovCitzdGF0aWMgSWR0YWIgKgoraWR0YWJfbG9va3VwKGludCB2ZXJzaW9uKQoreworCWlmICh2ZXJzaW9uIDwgMSB8fCB2ZXJzaW9uID4gMikKKwkJZmF0YWwoImludGVybmFsIGVycm9yLCBiYWQgcHJvdG9jb2wgdmVyc2lvbiAlZCIsIHZlcnNpb24pOworCXJldHVybiAmaWR0YWJsZVt2ZXJzaW9uXTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfaWRlbnRpdHkoSWRlbnRpdHkgKmlkKQoreworCWtleV9mcmVlKGlkLT5rZXkpOworCWlmIChpZC0+cHJvdmlkZXIgIT0gTlVMTCkKKwkJeGZyZWUoaWQtPnByb3ZpZGVyKTsKKwl4ZnJlZShpZC0+Y29tbWVudCk7CisJeGZyZWUoaWQpOworfQorCisvKiByZXR1cm4gbWF0Y2hpbmcgcHJpdmF0ZSBrZXkgZm9yIGdpdmVuIHB1YmxpYyBrZXkgKi8KK3N0YXRpYyBJZGVudGl0eSAqCitsb29rdXBfaWRlbnRpdHkoS2V5ICprZXksIGludCB2ZXJzaW9uKQoreworCUlkZW50aXR5ICppZDsKKworCUlkdGFiICp0YWIgPSBpZHRhYl9sb29rdXAodmVyc2lvbik7CisJVEFJTFFfRk9SRUFDSChpZCwgJnRhYi0+aWRsaXN0LCBuZXh0KSB7CisJCWlmIChrZXlfZXF1YWwoa2V5LCBpZC0+a2V5KSkKKwkJCXJldHVybiAoaWQpOworCX0KKwlyZXR1cm4gKE5VTEwpOworfQorCisvKiBDaGVjayBjb25maXJtYXRpb24gb2Yga2V5c2lnbiByZXF1ZXN0ICovCitzdGF0aWMgaW50Citjb25maXJtX2tleShJZGVudGl0eSAqaWQpCit7CisJY2hhciAqcDsKKwlpbnQgcmV0ID0gLTE7CisKKwlwID0ga2V5X2ZpbmdlcnByaW50KGlkLT5rZXksIFNTSF9GUF9NRDUsIFNTSF9GUF9IRVgpOworCWlmIChhc2tfcGVybWlzc2lvbigiQWxsb3cgdXNlIG9mIGtleSAlcz9cbktleSBmaW5nZXJwcmludCAlcy4iLAorCSAgICBpZC0+Y29tbWVudCwgcCkpCisJCXJldCA9IDA7CisJeGZyZWUocCk7CisKKwlyZXR1cm4gKHJldCk7Cit9CisKKy8qIHNlbmQgbGlzdCBvZiBzdXBwb3J0ZWQgcHVibGljIGtleXMgdG8gJ2NsaWVudCcgKi8KK3N0YXRpYyB2b2lkCitwcm9jZXNzX3JlcXVlc3RfaWRlbnRpdGllcyhTb2NrZXRFbnRyeSAqZSwgaW50IHZlcnNpb24pCit7CisJSWR0YWIgKnRhYiA9IGlkdGFiX2xvb2t1cCh2ZXJzaW9uKTsKKwlJZGVudGl0eSAqaWQ7CisJQnVmZmVyIG1zZzsKKworCWJ1ZmZlcl9pbml0KCZtc2cpOworCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCAodmVyc2lvbiA9PSAxKSA/CisJICAgIFNTSF9BR0VOVF9SU0FfSURFTlRJVElFU19BTlNXRVIgOiBTU0gyX0FHRU5UX0lERU5USVRJRVNfQU5TV0VSKTsKKwlidWZmZXJfcHV0X2ludCgmbXNnLCB0YWItPm5lbnRyaWVzKTsKKwlUQUlMUV9GT1JFQUNIKGlkLCAmdGFiLT5pZGxpc3QsIG5leHQpIHsKKwkJaWYgKGlkLT5rZXktPnR5cGUgPT0gS0VZX1JTQTEpIHsKKwkJCWJ1ZmZlcl9wdXRfaW50KCZtc2csIEJOX251bV9iaXRzKGlkLT5rZXktPnJzYS0+bikpOworCQkJYnVmZmVyX3B1dF9iaWdudW0oJm1zZywgaWQtPmtleS0+cnNhLT5lKTsKKwkJCWJ1ZmZlcl9wdXRfYmlnbnVtKCZtc2csIGlkLT5rZXktPnJzYS0+bik7CisJCX0gZWxzZSB7CisJCQl1X2NoYXIgKmJsb2I7CisJCQl1X2ludCBibGVuOworCQkJa2V5X3RvX2Jsb2IoaWQtPmtleSwgJmJsb2IsICZibGVuKTsKKwkJCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtc2csIGJsb2IsIGJsZW4pOworCQkJeGZyZWUoYmxvYik7CisJCX0KKwkJYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csIGlkLT5jb21tZW50KTsKKwl9CisJYnVmZmVyX3B1dF9pbnQoJmUtPm91dHB1dCwgYnVmZmVyX2xlbigmbXNnKSk7CisJYnVmZmVyX2FwcGVuZCgmZS0+b3V0cHV0LCBidWZmZXJfcHRyKCZtc2cpLCBidWZmZXJfbGVuKCZtc2cpKTsKKwlidWZmZXJfZnJlZSgmbXNnKTsKK30KKworLyogc3NoMSBvbmx5ICovCitzdGF0aWMgdm9pZAorcHJvY2Vzc19hdXRoZW50aWNhdGlvbl9jaGFsbGVuZ2UxKFNvY2tldEVudHJ5ICplKQoreworCXVfY2hhciBidWZbMzJdLCBtZGJ1ZlsxNl0sIHNlc3Npb25faWRbMTZdOworCXVfaW50IHJlc3BvbnNlX3R5cGU7CisJQklHTlVNICpjaGFsbGVuZ2U7CisJSWRlbnRpdHkgKmlkOworCWludCBpLCBsZW47CisJQnVmZmVyIG1zZzsKKwlNRDVfQ1RYIG1kOworCUtleSAqa2V5OworCisJYnVmZmVyX2luaXQoJm1zZyk7CisJa2V5ID0ga2V5X25ldyhLRVlfUlNBMSk7CisJaWYgKChjaGFsbGVuZ2UgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoInByb2Nlc3NfYXV0aGVudGljYXRpb25fY2hhbGxlbmdlMTogQk5fbmV3IGZhaWxlZCIpOworCisJKHZvaWQpIGJ1ZmZlcl9nZXRfaW50KCZlLT5yZXF1ZXN0KTsJCQkvKiBpZ25vcmVkICovCisJYnVmZmVyX2dldF9iaWdudW0oJmUtPnJlcXVlc3QsIGtleS0+cnNhLT5lKTsKKwlidWZmZXJfZ2V0X2JpZ251bSgmZS0+cmVxdWVzdCwga2V5LT5yc2EtPm4pOworCWJ1ZmZlcl9nZXRfYmlnbnVtKCZlLT5yZXF1ZXN0LCBjaGFsbGVuZ2UpOworCisJLyogT25seSBwcm90b2NvbCAxLjEgaXMgc3VwcG9ydGVkICovCisJaWYgKGJ1ZmZlcl9sZW4oJmUtPnJlcXVlc3QpID09IDApCisJCWdvdG8gZmFpbHVyZTsKKwlidWZmZXJfZ2V0KCZlLT5yZXF1ZXN0LCBzZXNzaW9uX2lkLCAxNik7CisJcmVzcG9uc2VfdHlwZSA9IGJ1ZmZlcl9nZXRfaW50KCZlLT5yZXF1ZXN0KTsKKwlpZiAocmVzcG9uc2VfdHlwZSAhPSAxKQorCQlnb3RvIGZhaWx1cmU7CisKKwlpZCA9IGxvb2t1cF9pZGVudGl0eShrZXksIDEpOworCWlmIChpZCAhPSBOVUxMICYmICghaWQtPmNvbmZpcm0gfHwgY29uZmlybV9rZXkoaWQpID09IDApKSB7CisJCUtleSAqcHJpdmF0ZSA9IGlkLT5rZXk7CisJCS8qIERlY3J5cHQgdGhlIGNoYWxsZW5nZSB1c2luZyB0aGUgcHJpdmF0ZSBrZXkuICovCisJCWlmIChyc2FfcHJpdmF0ZV9kZWNyeXB0KGNoYWxsZW5nZSwgY2hhbGxlbmdlLCBwcml2YXRlLT5yc2EpIDw9IDApCisJCQlnb3RvIGZhaWx1cmU7CisKKwkJLyogVGhlIHJlc3BvbnNlIGlzIE1ENSBvZiBkZWNyeXB0ZWQgY2hhbGxlbmdlIHBsdXMgc2Vzc2lvbiBpZC4gKi8KKwkJbGVuID0gQk5fbnVtX2J5dGVzKGNoYWxsZW5nZSk7CisJCWlmIChsZW4gPD0gMCB8fCBsZW4gPiAzMikgeworCQkJbG9naXQoInByb2Nlc3NfYXV0aGVudGljYXRpb25fY2hhbGxlbmdlOiBiYWQgY2hhbGxlbmdlIGxlbmd0aCAlZCIsIGxlbik7CisJCQlnb3RvIGZhaWx1cmU7CisJCX0KKwkJbWVtc2V0KGJ1ZiwgMCwgMzIpOworCQlCTl9ibjJiaW4oY2hhbGxlbmdlLCBidWYgKyAzMiAtIGxlbik7CisJCU1ENV9Jbml0KCZtZCk7CisJCU1ENV9VcGRhdGUoJm1kLCBidWYsIDMyKTsKKwkJTUQ1X1VwZGF0ZSgmbWQsIHNlc3Npb25faWQsIDE2KTsKKwkJTUQ1X0ZpbmFsKG1kYnVmLCAmbWQpOworCisJCS8qIFNlbmQgdGhlIHJlc3BvbnNlLiAqLworCQlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIX0FHRU5UX1JTQV9SRVNQT05TRSk7CisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQkJYnVmZmVyX3B1dF9jaGFyKCZtc2csIG1kYnVmW2ldKTsKKwkJZ290byBzZW5kOworCX0KKworZmFpbHVyZToKKwkvKiBVbmtub3duIGlkZW50aXR5IG9yIHByb3RvY29sIGVycm9yLiAgU2VuZCBmYWlsdXJlLiAqLworCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0hfQUdFTlRfRkFJTFVSRSk7CitzZW5kOgorCWJ1ZmZlcl9wdXRfaW50KCZlLT5vdXRwdXQsIGJ1ZmZlcl9sZW4oJm1zZykpOworCWJ1ZmZlcl9hcHBlbmQoJmUtPm91dHB1dCwgYnVmZmVyX3B0cigmbXNnKSwgYnVmZmVyX2xlbigmbXNnKSk7CisJa2V5X2ZyZWUoa2V5KTsKKwlCTl9jbGVhcl9mcmVlKGNoYWxsZW5nZSk7CisJYnVmZmVyX2ZyZWUoJm1zZyk7Cit9CisKKy8qIHNzaDIgb25seSAqLworc3RhdGljIHZvaWQKK3Byb2Nlc3Nfc2lnbl9yZXF1ZXN0MihTb2NrZXRFbnRyeSAqZSkKK3sKKwl1X2NoYXIgKmJsb2IsICpkYXRhLCAqc2lnbmF0dXJlID0gTlVMTDsKKwl1X2ludCBibGVuLCBkbGVuLCBzbGVuID0gMDsKKwlleHRlcm4gaW50IGRhdGFmZWxsb3dzOworCWludCBvZGF0YWZlbGxvd3M7CisJaW50IG9rID0gLTEsIGZsYWdzOworCUJ1ZmZlciBtc2c7CisJS2V5ICprZXk7CisKKwlkYXRhZmVsbG93cyA9IDA7CisKKwlibG9iID0gYnVmZmVyX2dldF9zdHJpbmcoJmUtPnJlcXVlc3QsICZibGVuKTsKKwlkYXRhID0gYnVmZmVyX2dldF9zdHJpbmcoJmUtPnJlcXVlc3QsICZkbGVuKTsKKworCWZsYWdzID0gYnVmZmVyX2dldF9pbnQoJmUtPnJlcXVlc3QpOworCW9kYXRhZmVsbG93cyA9IGRhdGFmZWxsb3dzOworCWlmIChmbGFncyAmIFNTSF9BR0VOVF9PTERfU0lHTkFUVVJFKQorCQlkYXRhZmVsbG93cyA9IFNTSF9CVUdfU0lHQkxPQjsKKworCWtleSA9IGtleV9mcm9tX2Jsb2IoYmxvYiwgYmxlbik7CisJaWYgKGtleSAhPSBOVUxMKSB7CisJCUlkZW50aXR5ICppZCA9IGxvb2t1cF9pZGVudGl0eShrZXksIDIpOworCQlpZiAoaWQgIT0gTlVMTCAmJiAoIWlkLT5jb25maXJtIHx8IGNvbmZpcm1fa2V5KGlkKSA9PSAwKSkKKwkJCW9rID0ga2V5X3NpZ24oaWQtPmtleSwgJnNpZ25hdHVyZSwgJnNsZW4sIGRhdGEsIGRsZW4pOworCQlrZXlfZnJlZShrZXkpOworCX0KKwlidWZmZXJfaW5pdCgmbXNnKTsKKwlpZiAob2sgPT0gMCkgeworCQlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIMl9BR0VOVF9TSUdOX1JFU1BPTlNFKTsKKwkJYnVmZmVyX3B1dF9zdHJpbmcoJm1zZywgc2lnbmF0dXJlLCBzbGVuKTsKKwl9IGVsc2UgeworCQlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIX0FHRU5UX0ZBSUxVUkUpOworCX0KKwlidWZmZXJfcHV0X2ludCgmZS0+b3V0cHV0LCBidWZmZXJfbGVuKCZtc2cpKTsKKwlidWZmZXJfYXBwZW5kKCZlLT5vdXRwdXQsIGJ1ZmZlcl9wdHIoJm1zZyksCisJICAgIGJ1ZmZlcl9sZW4oJm1zZykpOworCWJ1ZmZlcl9mcmVlKCZtc2cpOworCXhmcmVlKGRhdGEpOworCXhmcmVlKGJsb2IpOworCWlmIChzaWduYXR1cmUgIT0gTlVMTCkKKwkJeGZyZWUoc2lnbmF0dXJlKTsKKwlkYXRhZmVsbG93cyA9IG9kYXRhZmVsbG93czsKK30KKworLyogc2hhcmVkICovCitzdGF0aWMgdm9pZAorcHJvY2Vzc19yZW1vdmVfaWRlbnRpdHkoU29ja2V0RW50cnkgKmUsIGludCB2ZXJzaW9uKQoreworCXVfaW50IGJsZW4sIGJpdHM7CisJaW50IHN1Y2Nlc3MgPSAwOworCUtleSAqa2V5ID0gTlVMTDsKKwl1X2NoYXIgKmJsb2I7CisKKwlzd2l0Y2ggKHZlcnNpb24pIHsKKwljYXNlIDE6CisJCWtleSA9IGtleV9uZXcoS0VZX1JTQTEpOworCQliaXRzID0gYnVmZmVyX2dldF9pbnQoJmUtPnJlcXVlc3QpOworCQlidWZmZXJfZ2V0X2JpZ251bSgmZS0+cmVxdWVzdCwga2V5LT5yc2EtPmUpOworCQlidWZmZXJfZ2V0X2JpZ251bSgmZS0+cmVxdWVzdCwga2V5LT5yc2EtPm4pOworCisJCWlmIChiaXRzICE9IGtleV9zaXplKGtleSkpCisJCQlsb2dpdCgiV2FybmluZzogaWRlbnRpdHkga2V5c2l6ZSBtaXNtYXRjaDogYWN0dWFsICV1LCBhbm5vdW5jZWQgJXUiLAorCQkJICAgIGtleV9zaXplKGtleSksIGJpdHMpOworCQlicmVhazsKKwljYXNlIDI6CisJCWJsb2IgPSBidWZmZXJfZ2V0X3N0cmluZygmZS0+cmVxdWVzdCwgJmJsZW4pOworCQlrZXkgPSBrZXlfZnJvbV9ibG9iKGJsb2IsIGJsZW4pOworCQl4ZnJlZShibG9iKTsKKwkJYnJlYWs7CisJfQorCWlmIChrZXkgIT0gTlVMTCkgeworCQlJZGVudGl0eSAqaWQgPSBsb29rdXBfaWRlbnRpdHkoa2V5LCB2ZXJzaW9uKTsKKwkJaWYgKGlkICE9IE5VTEwpIHsKKwkJCS8qCisJCQkgKiBXZSBoYXZlIHRoaXMga2V5LiAgRnJlZSB0aGUgb2xkIGtleS4gIFNpbmNlIHdlCisJCQkgKiBkb24ndCB3YW50IHRvIGxlYXZlIGVtcHR5IHNsb3RzIGluIHRoZSBtaWRkbGUgb2YKKwkJCSAqIHRoZSBhcnJheSwgd2UgYWN0dWFsbHkgZnJlZSB0aGUga2V5IHRoZXJlIGFuZCBtb3ZlCisJCQkgKiBhbGwgdGhlIGVudHJpZXMgYmV0d2VlbiB0aGUgZW1wdHkgc2xvdCBhbmQgdGhlIGVuZAorCQkJICogb2YgdGhlIGFycmF5LgorCQkJICovCisJCQlJZHRhYiAqdGFiID0gaWR0YWJfbG9va3VwKHZlcnNpb24pOworCQkJaWYgKHRhYi0+bmVudHJpZXMgPCAxKQorCQkJCWZhdGFsKCJwcm9jZXNzX3JlbW92ZV9pZGVudGl0eTogIgorCQkJCSAgICAiaW50ZXJuYWwgZXJyb3I6IHRhYi0+bmVudHJpZXMgJWQiLAorCQkJCSAgICB0YWItPm5lbnRyaWVzKTsKKwkJCVRBSUxRX1JFTU9WRSgmdGFiLT5pZGxpc3QsIGlkLCBuZXh0KTsKKwkJCWZyZWVfaWRlbnRpdHkoaWQpOworCQkJdGFiLT5uZW50cmllcy0tOworCQkJc3VjY2VzcyA9IDE7CisJCX0KKwkJa2V5X2ZyZWUoa2V5KTsKKwl9CisJYnVmZmVyX3B1dF9pbnQoJmUtPm91dHB1dCwgMSk7CisJYnVmZmVyX3B1dF9jaGFyKCZlLT5vdXRwdXQsCisJICAgIHN1Y2Nlc3MgPyBTU0hfQUdFTlRfU1VDQ0VTUyA6IFNTSF9BR0VOVF9GQUlMVVJFKTsKK30KKworc3RhdGljIHZvaWQKK3Byb2Nlc3NfcmVtb3ZlX2FsbF9pZGVudGl0aWVzKFNvY2tldEVudHJ5ICplLCBpbnQgdmVyc2lvbikKK3sKKwlJZHRhYiAqdGFiID0gaWR0YWJfbG9va3VwKHZlcnNpb24pOworCUlkZW50aXR5ICppZDsKKworCS8qIExvb3Agb3ZlciBhbGwgaWRlbnRpdGllcyBhbmQgY2xlYXIgdGhlIGtleXMuICovCisJZm9yIChpZCA9IFRBSUxRX0ZJUlNUKCZ0YWItPmlkbGlzdCk7IGlkOworCSAgICBpZCA9IFRBSUxRX0ZJUlNUKCZ0YWItPmlkbGlzdCkpIHsKKwkJVEFJTFFfUkVNT1ZFKCZ0YWItPmlkbGlzdCwgaWQsIG5leHQpOworCQlmcmVlX2lkZW50aXR5KGlkKTsKKwl9CisKKwkvKiBNYXJrIHRoYXQgdGhlcmUgYXJlIG5vIGlkZW50aXRpZXMuICovCisJdGFiLT5uZW50cmllcyA9IDA7CisKKwkvKiBTZW5kIHN1Y2Nlc3MuICovCisJYnVmZmVyX3B1dF9pbnQoJmUtPm91dHB1dCwgMSk7CisJYnVmZmVyX3B1dF9jaGFyKCZlLT5vdXRwdXQsIFNTSF9BR0VOVF9TVUNDRVNTKTsKK30KKworLyogcmVtb3ZlcyBleHBpcmVkIGtleXMgYW5kIHJldHVybnMgbnVtYmVyIG9mIHNlY29uZHMgdW50aWwgdGhlIG5leHQgZXhwaXJ5ICovCitzdGF0aWMgdV9pbnQKK3JlYXBlcih2b2lkKQoreworCXVfaW50IGRlYWRsaW5lID0gMCwgbm93ID0gdGltZShOVUxMKTsKKwlJZGVudGl0eSAqaWQsICpueHQ7CisJaW50IHZlcnNpb247CisJSWR0YWIgKnRhYjsKKworCWZvciAodmVyc2lvbiA9IDE7IHZlcnNpb24gPCAzOyB2ZXJzaW9uKyspIHsKKwkJdGFiID0gaWR0YWJfbG9va3VwKHZlcnNpb24pOworCQlmb3IgKGlkID0gVEFJTFFfRklSU1QoJnRhYi0+aWRsaXN0KTsgaWQ7IGlkID0gbnh0KSB7CisJCQlueHQgPSBUQUlMUV9ORVhUKGlkLCBuZXh0KTsKKwkJCWlmIChpZC0+ZGVhdGggPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChub3cgPj0gaWQtPmRlYXRoKSB7CisJCQkJZGVidWcoImV4cGlyaW5nIGtleSAnJXMnIiwgaWQtPmNvbW1lbnQpOworCQkJCVRBSUxRX1JFTU9WRSgmdGFiLT5pZGxpc3QsIGlkLCBuZXh0KTsKKwkJCQlmcmVlX2lkZW50aXR5KGlkKTsKKwkJCQl0YWItPm5lbnRyaWVzLS07CisJCQl9IGVsc2UKKwkJCQlkZWFkbGluZSA9IChkZWFkbGluZSA9PSAwKSA/IGlkLT5kZWF0aCA6CisJCQkJICAgIE1JTihkZWFkbGluZSwgaWQtPmRlYXRoKTsKKwkJfQorCX0KKwlpZiAoZGVhZGxpbmUgPT0gMCB8fCBkZWFkbGluZSA8PSBub3cpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIChkZWFkbGluZSAtIG5vdyk7Cit9CisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX2FkZF9pZGVudGl0eShTb2NrZXRFbnRyeSAqZSwgaW50IHZlcnNpb24pCit7CisJSWR0YWIgKnRhYiA9IGlkdGFiX2xvb2t1cCh2ZXJzaW9uKTsKKwlJZGVudGl0eSAqaWQ7CisJaW50IHR5cGUsIHN1Y2Nlc3MgPSAwLCBkZWF0aCA9IDAsIGNvbmZpcm0gPSAwOworCWNoYXIgKnR5cGVfbmFtZSwgKmNvbW1lbnQ7CisJS2V5ICprID0gTlVMTDsKKyNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKKwlCSUdOVU0gKmV4cG9uZW50OworCUVDX1BPSU5UICpxOworCWNoYXIgKmN1cnZlOworI2VuZGlmCisJdV9jaGFyICpjZXJ0OworCXVfaW50IGxlbjsKKworCXN3aXRjaCAodmVyc2lvbikgeworCWNhc2UgMToKKwkJayA9IGtleV9uZXdfcHJpdmF0ZShLRVlfUlNBMSk7CisJCSh2b2lkKSBidWZmZXJfZ2V0X2ludCgmZS0+cmVxdWVzdCk7CQkvKiBpZ25vcmVkICovCisJCWJ1ZmZlcl9nZXRfYmlnbnVtKCZlLT5yZXF1ZXN0LCBrLT5yc2EtPm4pOworCQlidWZmZXJfZ2V0X2JpZ251bSgmZS0+cmVxdWVzdCwgay0+cnNhLT5lKTsKKwkJYnVmZmVyX2dldF9iaWdudW0oJmUtPnJlcXVlc3QsIGstPnJzYS0+ZCk7CisJCWJ1ZmZlcl9nZXRfYmlnbnVtKCZlLT5yZXF1ZXN0LCBrLT5yc2EtPmlxbXApOworCisJCS8qIFNTSCBhbmQgU1NMIGhhdmUgcCBhbmQgcSBzd2FwcGVkICovCisJCWJ1ZmZlcl9nZXRfYmlnbnVtKCZlLT5yZXF1ZXN0LCBrLT5yc2EtPnEpOwkvKiBwICovCisJCWJ1ZmZlcl9nZXRfYmlnbnVtKCZlLT5yZXF1ZXN0LCBrLT5yc2EtPnApOwkvKiBxICovCisKKwkJLyogR2VuZXJhdGUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzICovCisJCXJzYV9nZW5lcmF0ZV9hZGRpdGlvbmFsX3BhcmFtZXRlcnMoay0+cnNhKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl0eXBlX25hbWUgPSBidWZmZXJfZ2V0X3N0cmluZygmZS0+cmVxdWVzdCwgTlVMTCk7CisJCXR5cGUgPSBrZXlfdHlwZV9mcm9tX25hbWUodHlwZV9uYW1lKTsKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgS0VZX0RTQToKKwkJCWsgPSBrZXlfbmV3X3ByaXZhdGUodHlwZSk7CisJCQlidWZmZXJfZ2V0X2JpZ251bTIoJmUtPnJlcXVlc3QsIGstPmRzYS0+cCk7CisJCQlidWZmZXJfZ2V0X2JpZ251bTIoJmUtPnJlcXVlc3QsIGstPmRzYS0+cSk7CisJCQlidWZmZXJfZ2V0X2JpZ251bTIoJmUtPnJlcXVlc3QsIGstPmRzYS0+Zyk7CisJCQlidWZmZXJfZ2V0X2JpZ251bTIoJmUtPnJlcXVlc3QsIGstPmRzYS0+cHViX2tleSk7CisJCQlidWZmZXJfZ2V0X2JpZ251bTIoJmUtPnJlcXVlc3QsIGstPmRzYS0+cHJpdl9rZXkpOworCQkJYnJlYWs7CisJCWNhc2UgS0VZX0RTQV9DRVJUX1YwMDoKKwkJY2FzZSBLRVlfRFNBX0NFUlQ6CisJCQljZXJ0ID0gYnVmZmVyX2dldF9zdHJpbmcoJmUtPnJlcXVlc3QsICZsZW4pOworCQkJaWYgKChrID0ga2V5X2Zyb21fYmxvYihjZXJ0LCBsZW4pKSA9PSBOVUxMKQorCQkJCWZhdGFsKCJDZXJ0aWZpY2F0ZSBwYXJzZSBmYWlsZWQiKTsKKwkJCXhmcmVlKGNlcnQpOworCQkJa2V5X2FkZF9wcml2YXRlKGspOworCQkJYnVmZmVyX2dldF9iaWdudW0yKCZlLT5yZXF1ZXN0LCBrLT5kc2EtPnByaXZfa2V5KTsKKwkJCWJyZWFrOworI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworCQljYXNlIEtFWV9FQ0RTQToKKwkJCWsgPSBrZXlfbmV3X3ByaXZhdGUodHlwZSk7CisJCQlrLT5lY2RzYV9uaWQgPSBrZXlfZWNkc2FfbmlkX2Zyb21fbmFtZSh0eXBlX25hbWUpOworCQkJY3VydmUgPSBidWZmZXJfZ2V0X3N0cmluZygmZS0+cmVxdWVzdCwgTlVMTCk7CisJCQlpZiAoay0+ZWNkc2FfbmlkICE9IGtleV9jdXJ2ZV9uYW1lX3RvX25pZChjdXJ2ZSkpCisJCQkJZmF0YWwoIiVzOiBjdXJ2ZSBuYW1lcyBtaXNtYXRjaCIsIF9fZnVuY19fKTsKKwkJCXhmcmVlKGN1cnZlKTsKKwkJCWstPmVjZHNhID0gRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lKGstPmVjZHNhX25pZCk7CisJCQlpZiAoay0+ZWNkc2EgPT0gTlVMTCkKKwkJCQlmYXRhbCgiJXM6IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZSBmYWlsZWQiLAorCQkJCSAgICBfX2Z1bmNfXyk7CisJCQlxID0gRUNfUE9JTlRfbmV3KEVDX0tFWV9nZXQwX2dyb3VwKGstPmVjZHNhKSk7CisJCQlpZiAocSA9PSBOVUxMKQorCQkJCWZhdGFsKCIlczogQk5fbmV3IGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJCWlmICgoZXhwb25lbnQgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJCQlmYXRhbCgiJXM6IEJOX25ldyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCQlidWZmZXJfZ2V0X2VjcG9pbnQoJmUtPnJlcXVlc3QsCisJCQkJRUNfS0VZX2dldDBfZ3JvdXAoay0+ZWNkc2EpLCBxKTsKKwkJCWJ1ZmZlcl9nZXRfYmlnbnVtMigmZS0+cmVxdWVzdCwgZXhwb25lbnQpOworCQkJaWYgKEVDX0tFWV9zZXRfcHVibGljX2tleShrLT5lY2RzYSwgcSkgIT0gMSkKKwkJCQlmYXRhbCgiJXM6IEVDX0tFWV9zZXRfcHVibGljX2tleSBmYWlsZWQiLAorCQkJCSAgICBfX2Z1bmNfXyk7CisJCQlpZiAoRUNfS0VZX3NldF9wcml2YXRlX2tleShrLT5lY2RzYSwgZXhwb25lbnQpICE9IDEpCisJCQkJZmF0YWwoIiVzOiBFQ19LRVlfc2V0X3ByaXZhdGVfa2V5IGZhaWxlZCIsCisJCQkJICAgIF9fZnVuY19fKTsKKwkJCWlmIChrZXlfZWNfdmFsaWRhdGVfcHVibGljKEVDX0tFWV9nZXQwX2dyb3VwKGstPmVjZHNhKSwKKwkJCSAgICBFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KGstPmVjZHNhKSkgIT0gMCkKKwkJCQlmYXRhbCgiJXM6IGJhZCBFQ0RTQSBwdWJsaWMga2V5IiwgX19mdW5jX18pOworCQkJaWYgKGtleV9lY192YWxpZGF0ZV9wcml2YXRlKGstPmVjZHNhKSAhPSAwKQorCQkJCWZhdGFsKCIlczogYmFkIEVDRFNBIHByaXZhdGUga2V5IiwgX19mdW5jX18pOworCQkJQk5fY2xlYXJfZnJlZShleHBvbmVudCk7CisJCQlFQ19QT0lOVF9mcmVlKHEpOworCQkJYnJlYWs7CisJCWNhc2UgS0VZX0VDRFNBX0NFUlQ6CisJCQljZXJ0ID0gYnVmZmVyX2dldF9zdHJpbmcoJmUtPnJlcXVlc3QsICZsZW4pOworCQkJaWYgKChrID0ga2V5X2Zyb21fYmxvYihjZXJ0LCBsZW4pKSA9PSBOVUxMKQorCQkJCWZhdGFsKCJDZXJ0aWZpY2F0ZSBwYXJzZSBmYWlsZWQiKTsKKwkJCXhmcmVlKGNlcnQpOworCQkJa2V5X2FkZF9wcml2YXRlKGspOworCQkJaWYgKChleHBvbmVudCA9IEJOX25ldygpKSA9PSBOVUxMKQorCQkJCWZhdGFsKCIlczogQk5fbmV3IGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJCWJ1ZmZlcl9nZXRfYmlnbnVtMigmZS0+cmVxdWVzdCwgZXhwb25lbnQpOworCQkJaWYgKEVDX0tFWV9zZXRfcHJpdmF0ZV9rZXkoay0+ZWNkc2EsIGV4cG9uZW50KSAhPSAxKQorCQkJCWZhdGFsKCIlczogRUNfS0VZX3NldF9wcml2YXRlX2tleSBmYWlsZWQiLAorCQkJCSAgICBfX2Z1bmNfXyk7CisJCQlpZiAoa2V5X2VjX3ZhbGlkYXRlX3B1YmxpYyhFQ19LRVlfZ2V0MF9ncm91cChrLT5lY2RzYSksCisJCQkgICAgRUNfS0VZX2dldDBfcHVibGljX2tleShrLT5lY2RzYSkpICE9IDAgfHwKKwkJCSAgICBrZXlfZWNfdmFsaWRhdGVfcHJpdmF0ZShrLT5lY2RzYSkgIT0gMCkKKwkJCQlmYXRhbCgiJXM6IGJhZCBFQ0RTQSBrZXkiLCBfX2Z1bmNfXyk7CisJCQlCTl9jbGVhcl9mcmVlKGV4cG9uZW50KTsKKwkJCWJyZWFrOworI2VuZGlmIC8qIE9QRU5TU0xfSEFTX0VDQyAqLworCQljYXNlIEtFWV9SU0E6CisJCQlrID0ga2V5X25ld19wcml2YXRlKHR5cGUpOworCQkJYnVmZmVyX2dldF9iaWdudW0yKCZlLT5yZXF1ZXN0LCBrLT5yc2EtPm4pOworCQkJYnVmZmVyX2dldF9iaWdudW0yKCZlLT5yZXF1ZXN0LCBrLT5yc2EtPmUpOworCQkJYnVmZmVyX2dldF9iaWdudW0yKCZlLT5yZXF1ZXN0LCBrLT5yc2EtPmQpOworCQkJYnVmZmVyX2dldF9iaWdudW0yKCZlLT5yZXF1ZXN0LCBrLT5yc2EtPmlxbXApOworCQkJYnVmZmVyX2dldF9iaWdudW0yKCZlLT5yZXF1ZXN0LCBrLT5yc2EtPnApOworCQkJYnVmZmVyX2dldF9iaWdudW0yKCZlLT5yZXF1ZXN0LCBrLT5yc2EtPnEpOworCisJCQkvKiBHZW5lcmF0ZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgKi8KKwkJCXJzYV9nZW5lcmF0ZV9hZGRpdGlvbmFsX3BhcmFtZXRlcnMoay0+cnNhKTsKKwkJCWJyZWFrOworCQljYXNlIEtFWV9SU0FfQ0VSVF9WMDA6CisJCWNhc2UgS0VZX1JTQV9DRVJUOgorCQkJY2VydCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZlLT5yZXF1ZXN0LCAmbGVuKTsKKwkJCWlmICgoayA9IGtleV9mcm9tX2Jsb2IoY2VydCwgbGVuKSkgPT0gTlVMTCkKKwkJCQlmYXRhbCgiQ2VydGlmaWNhdGUgcGFyc2UgZmFpbGVkIik7CisJCQl4ZnJlZShjZXJ0KTsKKwkJCWtleV9hZGRfcHJpdmF0ZShrKTsKKwkJCWJ1ZmZlcl9nZXRfYmlnbnVtMigmZS0+cmVxdWVzdCwgay0+cnNhLT5kKTsKKwkJCWJ1ZmZlcl9nZXRfYmlnbnVtMigmZS0+cmVxdWVzdCwgay0+cnNhLT5pcW1wKTsKKwkJCWJ1ZmZlcl9nZXRfYmlnbnVtMigmZS0+cmVxdWVzdCwgay0+cnNhLT5wKTsKKwkJCWJ1ZmZlcl9nZXRfYmlnbnVtMigmZS0+cmVxdWVzdCwgay0+cnNhLT5xKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJeGZyZWUodHlwZV9uYW1lKTsKKwkJCWJ1ZmZlcl9jbGVhcigmZS0+cmVxdWVzdCk7CisJCQlnb3RvIHNlbmQ7CisJCX0KKwkJeGZyZWUodHlwZV9uYW1lKTsKKwkJYnJlYWs7CisJfQorCS8qIGVuYWJsZSBibGluZGluZyAqLworCXN3aXRjaCAoay0+dHlwZSkgeworCWNhc2UgS0VZX1JTQToKKwljYXNlIEtFWV9SU0FfQ0VSVF9WMDA6CisJY2FzZSBLRVlfUlNBX0NFUlQ6CisJY2FzZSBLRVlfUlNBMToKKwkJaWYgKFJTQV9ibGluZGluZ19vbihrLT5yc2EsIE5VTEwpICE9IDEpIHsKKwkJCWVycm9yKCJwcm9jZXNzX2FkZF9pZGVudGl0eTogUlNBX2JsaW5kaW5nX29uIGZhaWxlZCIpOworCQkJa2V5X2ZyZWUoayk7CisJCQlnb3RvIHNlbmQ7CisJCX0KKwkJYnJlYWs7CisJfQorCWNvbW1lbnQgPSBidWZmZXJfZ2V0X3N0cmluZygmZS0+cmVxdWVzdCwgTlVMTCk7CisJaWYgKGsgPT0gTlVMTCkgeworCQl4ZnJlZShjb21tZW50KTsKKwkJZ290byBzZW5kOworCX0KKwl3aGlsZSAoYnVmZmVyX2xlbigmZS0+cmVxdWVzdCkpIHsKKwkJc3dpdGNoICgodHlwZSA9IGJ1ZmZlcl9nZXRfY2hhcigmZS0+cmVxdWVzdCkpKSB7CisJCWNhc2UgU1NIX0FHRU5UX0NPTlNUUkFJTl9MSUZFVElNRToKKwkJCWRlYXRoID0gdGltZShOVUxMKSArIGJ1ZmZlcl9nZXRfaW50KCZlLT5yZXF1ZXN0KTsKKwkJCWJyZWFrOworCQljYXNlIFNTSF9BR0VOVF9DT05TVFJBSU5fQ09ORklSTToKKwkJCWNvbmZpcm0gPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnJvcigicHJvY2Vzc19hZGRfaWRlbnRpdHk6ICIKKwkJCSAgICAiVW5rbm93biBjb25zdHJhaW50IHR5cGUgJWQiLCB0eXBlKTsKKwkJCXhmcmVlKGNvbW1lbnQpOworCQkJa2V5X2ZyZWUoayk7CisJCQlnb3RvIHNlbmQ7CisJCX0KKwl9CisJc3VjY2VzcyA9IDE7CisJaWYgKGxpZmV0aW1lICYmICFkZWF0aCkKKwkJZGVhdGggPSB0aW1lKE5VTEwpICsgbGlmZXRpbWU7CisJaWYgKChpZCA9IGxvb2t1cF9pZGVudGl0eShrLCB2ZXJzaW9uKSkgPT0gTlVMTCkgeworCQlpZCA9IHhjYWxsb2MoMSwgc2l6ZW9mKElkZW50aXR5KSk7CisJCWlkLT5rZXkgPSBrOworCQlUQUlMUV9JTlNFUlRfVEFJTCgmdGFiLT5pZGxpc3QsIGlkLCBuZXh0KTsKKwkJLyogSW5jcmVtZW50IHRoZSBudW1iZXIgb2YgaWRlbnRpdGllcy4gKi8KKwkJdGFiLT5uZW50cmllcysrOworCX0gZWxzZSB7CisJCWtleV9mcmVlKGspOworCQl4ZnJlZShpZC0+Y29tbWVudCk7CisJfQorCWlkLT5jb21tZW50ID0gY29tbWVudDsKKwlpZC0+ZGVhdGggPSBkZWF0aDsKKwlpZC0+Y29uZmlybSA9IGNvbmZpcm07CitzZW5kOgorCWJ1ZmZlcl9wdXRfaW50KCZlLT5vdXRwdXQsIDEpOworCWJ1ZmZlcl9wdXRfY2hhcigmZS0+b3V0cHV0LAorCSAgICBzdWNjZXNzID8gU1NIX0FHRU5UX1NVQ0NFU1MgOiBTU0hfQUdFTlRfRkFJTFVSRSk7Cit9CisKKy8qIFhYWCB0b2RvOiBlbmNyeXB0IHNlbnNpdGl2ZSBkYXRhIHdpdGggcGFzc3BocmFzZSAqLworc3RhdGljIHZvaWQKK3Byb2Nlc3NfbG9ja19hZ2VudChTb2NrZXRFbnRyeSAqZSwgaW50IGxvY2spCit7CisJaW50IHN1Y2Nlc3MgPSAwOworCWNoYXIgKnBhc3N3ZDsKKworCXBhc3N3ZCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZlLT5yZXF1ZXN0LCBOVUxMKTsKKwlpZiAobG9ja2VkICYmICFsb2NrICYmIHN0cmNtcChwYXNzd2QsIGxvY2tfcGFzc3dkKSA9PSAwKSB7CisJCWxvY2tlZCA9IDA7CisJCW1lbXNldChsb2NrX3Bhc3N3ZCwgMCwgc3RybGVuKGxvY2tfcGFzc3dkKSk7CisJCXhmcmVlKGxvY2tfcGFzc3dkKTsKKwkJbG9ja19wYXNzd2QgPSBOVUxMOworCQlzdWNjZXNzID0gMTsKKwl9IGVsc2UgaWYgKCFsb2NrZWQgJiYgbG9jaykgeworCQlsb2NrZWQgPSAxOworCQlsb2NrX3Bhc3N3ZCA9IHhzdHJkdXAocGFzc3dkKTsKKwkJc3VjY2VzcyA9IDE7CisJfQorCW1lbXNldChwYXNzd2QsIDAsIHN0cmxlbihwYXNzd2QpKTsKKwl4ZnJlZShwYXNzd2QpOworCisJYnVmZmVyX3B1dF9pbnQoJmUtPm91dHB1dCwgMSk7CisJYnVmZmVyX3B1dF9jaGFyKCZlLT5vdXRwdXQsCisJICAgIHN1Y2Nlc3MgPyBTU0hfQUdFTlRfU1VDQ0VTUyA6IFNTSF9BR0VOVF9GQUlMVVJFKTsKK30KKworc3RhdGljIHZvaWQKK25vX2lkZW50aXRpZXMoU29ja2V0RW50cnkgKmUsIHVfaW50IHR5cGUpCit7CisJQnVmZmVyIG1zZzsKKworCWJ1ZmZlcl9pbml0KCZtc2cpOworCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLAorCSAgICAodHlwZSA9PSBTU0hfQUdFTlRDX1JFUVVFU1RfUlNBX0lERU5USVRJRVMpID8KKwkgICAgU1NIX0FHRU5UX1JTQV9JREVOVElUSUVTX0FOU1dFUiA6IFNTSDJfQUdFTlRfSURFTlRJVElFU19BTlNXRVIpOworCWJ1ZmZlcl9wdXRfaW50KCZtc2csIDApOworCWJ1ZmZlcl9wdXRfaW50KCZlLT5vdXRwdXQsIGJ1ZmZlcl9sZW4oJm1zZykpOworCWJ1ZmZlcl9hcHBlbmQoJmUtPm91dHB1dCwgYnVmZmVyX3B0cigmbXNnKSwgYnVmZmVyX2xlbigmbXNnKSk7CisJYnVmZmVyX2ZyZWUoJm1zZyk7Cit9CisKKyNpZmRlZiBFTkFCTEVfUEtDUzExCitzdGF0aWMgdm9pZAorcHJvY2Vzc19hZGRfc21hcnRjYXJkX2tleShTb2NrZXRFbnRyeSAqZSkKK3sKKwljaGFyICpwcm92aWRlciA9IE5VTEwsICpwaW47CisJaW50IGksIHR5cGUsIHZlcnNpb24sIGNvdW50ID0gMCwgc3VjY2VzcyA9IDAsIGRlYXRoID0gMCwgY29uZmlybSA9IDA7CisJS2V5ICoqa2V5cyA9IE5VTEwsICprOworCUlkZW50aXR5ICppZDsKKwlJZHRhYiAqdGFiOworCisJcHJvdmlkZXIgPSBidWZmZXJfZ2V0X3N0cmluZygmZS0+cmVxdWVzdCwgTlVMTCk7CisJcGluID0gYnVmZmVyX2dldF9zdHJpbmcoJmUtPnJlcXVlc3QsIE5VTEwpOworCisJd2hpbGUgKGJ1ZmZlcl9sZW4oJmUtPnJlcXVlc3QpKSB7CisJCXN3aXRjaCAoKHR5cGUgPSBidWZmZXJfZ2V0X2NoYXIoJmUtPnJlcXVlc3QpKSkgeworCQljYXNlIFNTSF9BR0VOVF9DT05TVFJBSU5fTElGRVRJTUU6CisJCQlkZWF0aCA9IHRpbWUoTlVMTCkgKyBidWZmZXJfZ2V0X2ludCgmZS0+cmVxdWVzdCk7CisJCQlicmVhazsKKwkJY2FzZSBTU0hfQUdFTlRfQ09OU1RSQUlOX0NPTkZJUk06CisJCQljb25maXJtID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyb3IoInByb2Nlc3NfYWRkX3NtYXJ0Y2FyZF9rZXk6ICIKKwkJCSAgICAiVW5rbm93biBjb25zdHJhaW50IHR5cGUgJWQiLCB0eXBlKTsKKwkJCWdvdG8gc2VuZDsKKwkJfQorCX0KKwlpZiAobGlmZXRpbWUgJiYgIWRlYXRoKQorCQlkZWF0aCA9IHRpbWUoTlVMTCkgKyBsaWZldGltZTsKKworCWNvdW50ID0gcGtjczExX2FkZF9wcm92aWRlcihwcm92aWRlciwgcGluLCAma2V5cyk7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJayA9IGtleXNbaV07CisJCXZlcnNpb24gPSBrLT50eXBlID09IEtFWV9SU0ExID8gMSA6IDI7CisJCXRhYiA9IGlkdGFiX2xvb2t1cCh2ZXJzaW9uKTsKKwkJaWYgKGxvb2t1cF9pZGVudGl0eShrLCB2ZXJzaW9uKSA9PSBOVUxMKSB7CisJCQlpZCA9IHhjYWxsb2MoMSwgc2l6ZW9mKElkZW50aXR5KSk7CisJCQlpZC0+a2V5ID0gazsKKwkJCWlkLT5wcm92aWRlciA9IHhzdHJkdXAocHJvdmlkZXIpOworCQkJaWQtPmNvbW1lbnQgPSB4c3RyZHVwKHByb3ZpZGVyKTsgLyogWFhYICovCisJCQlpZC0+ZGVhdGggPSBkZWF0aDsKKwkJCWlkLT5jb25maXJtID0gY29uZmlybTsKKwkJCVRBSUxRX0lOU0VSVF9UQUlMKCZ0YWItPmlkbGlzdCwgaWQsIG5leHQpOworCQkJdGFiLT5uZW50cmllcysrOworCQkJc3VjY2VzcyA9IDE7CisJCX0gZWxzZSB7CisJCQlrZXlfZnJlZShrKTsKKwkJfQorCQlrZXlzW2ldID0gTlVMTDsKKwl9CitzZW5kOgorCWlmIChwaW4pCisJCXhmcmVlKHBpbik7CisJaWYgKHByb3ZpZGVyKQorCQl4ZnJlZShwcm92aWRlcik7CisJaWYgKGtleXMpCisJCXhmcmVlKGtleXMpOworCWJ1ZmZlcl9wdXRfaW50KCZlLT5vdXRwdXQsIDEpOworCWJ1ZmZlcl9wdXRfY2hhcigmZS0+b3V0cHV0LAorCSAgICBzdWNjZXNzID8gU1NIX0FHRU5UX1NVQ0NFU1MgOiBTU0hfQUdFTlRfRkFJTFVSRSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX3JlbW92ZV9zbWFydGNhcmRfa2V5KFNvY2tldEVudHJ5ICplKQoreworCWNoYXIgKnByb3ZpZGVyID0gTlVMTCwgKnBpbiA9IE5VTEw7CisJaW50IHZlcnNpb24sIHN1Y2Nlc3MgPSAwOworCUlkZW50aXR5ICppZCwgKm54dDsKKwlJZHRhYiAqdGFiOworCisJcHJvdmlkZXIgPSBidWZmZXJfZ2V0X3N0cmluZygmZS0+cmVxdWVzdCwgTlVMTCk7CisJcGluID0gYnVmZmVyX2dldF9zdHJpbmcoJmUtPnJlcXVlc3QsIE5VTEwpOworCXhmcmVlKHBpbik7CisKKwlmb3IgKHZlcnNpb24gPSAxOyB2ZXJzaW9uIDwgMzsgdmVyc2lvbisrKSB7CisJCXRhYiA9IGlkdGFiX2xvb2t1cCh2ZXJzaW9uKTsKKwkJZm9yIChpZCA9IFRBSUxRX0ZJUlNUKCZ0YWItPmlkbGlzdCk7IGlkOyBpZCA9IG54dCkgeworCQkJbnh0ID0gVEFJTFFfTkVYVChpZCwgbmV4dCk7CisJCQlpZiAoIXN0cmNtcChwcm92aWRlciwgaWQtPnByb3ZpZGVyKSkgeworCQkJCVRBSUxRX1JFTU9WRSgmdGFiLT5pZGxpc3QsIGlkLCBuZXh0KTsKKwkJCQlmcmVlX2lkZW50aXR5KGlkKTsKKwkJCQl0YWItPm5lbnRyaWVzLS07CisJCQl9CisJCX0KKwl9CisJaWYgKHBrY3MxMV9kZWxfcHJvdmlkZXIocHJvdmlkZXIpID09IDApCisJCXN1Y2Nlc3MgPSAxOworCWVsc2UKKwkJZXJyb3IoInByb2Nlc3NfcmVtb3ZlX3NtYXJ0Y2FyZF9rZXk6IgorCQkgICAgIiBwa2NzMTFfZGVsX3Byb3ZpZGVyIGZhaWxlZCIpOworCXhmcmVlKHByb3ZpZGVyKTsKKwlidWZmZXJfcHV0X2ludCgmZS0+b3V0cHV0LCAxKTsKKwlidWZmZXJfcHV0X2NoYXIoJmUtPm91dHB1dCwKKwkgICAgc3VjY2VzcyA/IFNTSF9BR0VOVF9TVUNDRVNTIDogU1NIX0FHRU5UX0ZBSUxVUkUpOworfQorI2VuZGlmIC8qIEVOQUJMRV9QS0NTMTEgKi8KKworLyogZGlzcGF0Y2ggaW5jb21pbmcgbWVzc2FnZXMgKi8KKworc3RhdGljIHZvaWQKK3Byb2Nlc3NfbWVzc2FnZShTb2NrZXRFbnRyeSAqZSkKK3sKKwl1X2ludCBtc2dfbGVuLCB0eXBlOworCXVfY2hhciAqY3A7CisKKwlpZiAoYnVmZmVyX2xlbigmZS0+aW5wdXQpIDwgNSkKKwkJcmV0dXJuOwkJLyogSW5jb21wbGV0ZSBtZXNzYWdlLiAqLworCWNwID0gYnVmZmVyX3B0cigmZS0+aW5wdXQpOworCW1zZ19sZW4gPSBnZXRfdTMyKGNwKTsKKwlpZiAobXNnX2xlbiA+IDI1NiAqIDEwMjQpIHsKKwkJY2xvc2Vfc29ja2V0KGUpOworCQlyZXR1cm47CisJfQorCWlmIChidWZmZXJfbGVuKCZlLT5pbnB1dCkgPCBtc2dfbGVuICsgNCkKKwkJcmV0dXJuOworCisJLyogbW92ZSB0aGUgY3VycmVudCBpbnB1dCB0byBlLT5yZXF1ZXN0ICovCisJYnVmZmVyX2NvbnN1bWUoJmUtPmlucHV0LCA0KTsKKwlidWZmZXJfY2xlYXIoJmUtPnJlcXVlc3QpOworCWJ1ZmZlcl9hcHBlbmQoJmUtPnJlcXVlc3QsIGJ1ZmZlcl9wdHIoJmUtPmlucHV0KSwgbXNnX2xlbik7CisJYnVmZmVyX2NvbnN1bWUoJmUtPmlucHV0LCBtc2dfbGVuKTsKKwl0eXBlID0gYnVmZmVyX2dldF9jaGFyKCZlLT5yZXF1ZXN0KTsKKworCS8qIGNoZWNrIHdoZXRlciBhZ2VudCBpcyBsb2NrZWQgKi8KKwlpZiAobG9ja2VkICYmIHR5cGUgIT0gU1NIX0FHRU5UQ19VTkxPQ0spIHsKKwkJYnVmZmVyX2NsZWFyKCZlLT5yZXF1ZXN0KTsKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgU1NIX0FHRU5UQ19SRVFVRVNUX1JTQV9JREVOVElUSUVTOgorCQljYXNlIFNTSDJfQUdFTlRDX1JFUVVFU1RfSURFTlRJVElFUzoKKwkJCS8qIHNlbmQgZW1wdHkgbGlzdHMgKi8KKwkJCW5vX2lkZW50aXRpZXMoZSwgdHlwZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIHNlbmQgYSBmYWlsIG1lc3NhZ2UgZm9yIGFsbCBvdGhlciByZXF1ZXN0IHR5cGVzICovCisJCQlidWZmZXJfcHV0X2ludCgmZS0+b3V0cHV0LCAxKTsKKwkJCWJ1ZmZlcl9wdXRfY2hhcigmZS0+b3V0cHV0LCBTU0hfQUdFTlRfRkFJTFVSRSk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCWRlYnVnKCJ0eXBlICVkIiwgdHlwZSk7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTU0hfQUdFTlRDX0xPQ0s6CisJY2FzZSBTU0hfQUdFTlRDX1VOTE9DSzoKKwkJcHJvY2Vzc19sb2NrX2FnZW50KGUsIHR5cGUgPT0gU1NIX0FHRU5UQ19MT0NLKTsKKwkJYnJlYWs7CisJLyogc3NoMSAqLworCWNhc2UgU1NIX0FHRU5UQ19SU0FfQ0hBTExFTkdFOgorCQlwcm9jZXNzX2F1dGhlbnRpY2F0aW9uX2NoYWxsZW5nZTEoZSk7CisJCWJyZWFrOworCWNhc2UgU1NIX0FHRU5UQ19SRVFVRVNUX1JTQV9JREVOVElUSUVTOgorCQlwcm9jZXNzX3JlcXVlc3RfaWRlbnRpdGllcyhlLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBTU0hfQUdFTlRDX0FERF9SU0FfSURFTlRJVFk6CisJY2FzZSBTU0hfQUdFTlRDX0FERF9SU0FfSURfQ09OU1RSQUlORUQ6CisJCXByb2Nlc3NfYWRkX2lkZW50aXR5KGUsIDEpOworCQlicmVhazsKKwljYXNlIFNTSF9BR0VOVENfUkVNT1ZFX1JTQV9JREVOVElUWToKKwkJcHJvY2Vzc19yZW1vdmVfaWRlbnRpdHkoZSwgMSk7CisJCWJyZWFrOworCWNhc2UgU1NIX0FHRU5UQ19SRU1PVkVfQUxMX1JTQV9JREVOVElUSUVTOgorCQlwcm9jZXNzX3JlbW92ZV9hbGxfaWRlbnRpdGllcyhlLCAxKTsKKwkJYnJlYWs7CisJLyogc3NoMiAqLworCWNhc2UgU1NIMl9BR0VOVENfU0lHTl9SRVFVRVNUOgorCQlwcm9jZXNzX3NpZ25fcmVxdWVzdDIoZSk7CisJCWJyZWFrOworCWNhc2UgU1NIMl9BR0VOVENfUkVRVUVTVF9JREVOVElUSUVTOgorCQlwcm9jZXNzX3JlcXVlc3RfaWRlbnRpdGllcyhlLCAyKTsKKwkJYnJlYWs7CisJY2FzZSBTU0gyX0FHRU5UQ19BRERfSURFTlRJVFk6CisJY2FzZSBTU0gyX0FHRU5UQ19BRERfSURfQ09OU1RSQUlORUQ6CisJCXByb2Nlc3NfYWRkX2lkZW50aXR5KGUsIDIpOworCQlicmVhazsKKwljYXNlIFNTSDJfQUdFTlRDX1JFTU9WRV9JREVOVElUWToKKwkJcHJvY2Vzc19yZW1vdmVfaWRlbnRpdHkoZSwgMik7CisJCWJyZWFrOworCWNhc2UgU1NIMl9BR0VOVENfUkVNT1ZFX0FMTF9JREVOVElUSUVTOgorCQlwcm9jZXNzX3JlbW92ZV9hbGxfaWRlbnRpdGllcyhlLCAyKTsKKwkJYnJlYWs7CisjaWZkZWYgRU5BQkxFX1BLQ1MxMQorCWNhc2UgU1NIX0FHRU5UQ19BRERfU01BUlRDQVJEX0tFWToKKwljYXNlIFNTSF9BR0VOVENfQUREX1NNQVJUQ0FSRF9LRVlfQ09OU1RSQUlORUQ6CisJCXByb2Nlc3NfYWRkX3NtYXJ0Y2FyZF9rZXkoZSk7CisJCWJyZWFrOworCWNhc2UgU1NIX0FHRU5UQ19SRU1PVkVfU01BUlRDQVJEX0tFWToKKwkJcHJvY2Vzc19yZW1vdmVfc21hcnRjYXJkX2tleShlKTsKKwkJYnJlYWs7CisjZW5kaWYgLyogRU5BQkxFX1BLQ1MxMSAqLworCWRlZmF1bHQ6CisJCS8qIFVua25vd24gbWVzc2FnZS4gIFJlc3BvbmQgd2l0aCBmYWlsdXJlLiAqLworCQllcnJvcigiVW5rbm93biBtZXNzYWdlICVkIiwgdHlwZSk7CisJCWJ1ZmZlcl9jbGVhcigmZS0+cmVxdWVzdCk7CisJCWJ1ZmZlcl9wdXRfaW50KCZlLT5vdXRwdXQsIDEpOworCQlidWZmZXJfcHV0X2NoYXIoJmUtPm91dHB1dCwgU1NIX0FHRU5UX0ZBSUxVUkUpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCituZXdfc29ja2V0KHNvY2tfdHlwZSB0eXBlLCBpbnQgZmQpCit7CisJdV9pbnQgaSwgb2xkX2FsbG9jLCBuZXdfYWxsb2M7CisKKwlzZXRfbm9uYmxvY2soZmQpOworCisJaWYgKGZkID4gbWF4X2ZkKQorCQltYXhfZmQgPSBmZDsKKworCWZvciAoaSA9IDA7IGkgPCBzb2NrZXRzX2FsbG9jOyBpKyspCisJCWlmIChzb2NrZXRzW2ldLnR5cGUgPT0gQVVUSF9VTlVTRUQpIHsKKwkJCXNvY2tldHNbaV0uZmQgPSBmZDsKKwkJCWJ1ZmZlcl9pbml0KCZzb2NrZXRzW2ldLmlucHV0KTsKKwkJCWJ1ZmZlcl9pbml0KCZzb2NrZXRzW2ldLm91dHB1dCk7CisJCQlidWZmZXJfaW5pdCgmc29ja2V0c1tpXS5yZXF1ZXN0KTsKKwkJCXNvY2tldHNbaV0udHlwZSA9IHR5cGU7CisJCQlyZXR1cm47CisJCX0KKwlvbGRfYWxsb2MgPSBzb2NrZXRzX2FsbG9jOworCW5ld19hbGxvYyA9IHNvY2tldHNfYWxsb2MgKyAxMDsKKwlzb2NrZXRzID0geHJlYWxsb2Moc29ja2V0cywgbmV3X2FsbG9jLCBzaXplb2Yoc29ja2V0c1swXSkpOworCWZvciAoaSA9IG9sZF9hbGxvYzsgaSA8IG5ld19hbGxvYzsgaSsrKQorCQlzb2NrZXRzW2ldLnR5cGUgPSBBVVRIX1VOVVNFRDsKKwlzb2NrZXRzX2FsbG9jID0gbmV3X2FsbG9jOworCXNvY2tldHNbb2xkX2FsbG9jXS5mZCA9IGZkOworCWJ1ZmZlcl9pbml0KCZzb2NrZXRzW29sZF9hbGxvY10uaW5wdXQpOworCWJ1ZmZlcl9pbml0KCZzb2NrZXRzW29sZF9hbGxvY10ub3V0cHV0KTsKKwlidWZmZXJfaW5pdCgmc29ja2V0c1tvbGRfYWxsb2NdLnJlcXVlc3QpOworCXNvY2tldHNbb2xkX2FsbG9jXS50eXBlID0gdHlwZTsKK30KKworc3RhdGljIGludAorcHJlcGFyZV9zZWxlY3QoZmRfc2V0ICoqZmRycCwgZmRfc2V0ICoqZmR3cCwgaW50ICpmZGwsIHVfaW50ICpuYWxsb2NwLAorICAgIHN0cnVjdCB0aW1ldmFsICoqdHZwcCkKK3sKKwl1X2ludCBpLCBzeiwgZGVhZGxpbmU7CisJaW50IG4gPSAwOworCXN0YXRpYyBzdHJ1Y3QgdGltZXZhbCB0djsKKworCWZvciAoaSA9IDA7IGkgPCBzb2NrZXRzX2FsbG9jOyBpKyspIHsKKwkJc3dpdGNoIChzb2NrZXRzW2ldLnR5cGUpIHsKKwkJY2FzZSBBVVRIX1NPQ0tFVDoKKwkJY2FzZSBBVVRIX0NPTk5FQ1RJT046CisJCQluID0gTUFYKG4sIHNvY2tldHNbaV0uZmQpOworCQkJYnJlYWs7CisJCWNhc2UgQVVUSF9VTlVTRUQ6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZhdGFsKCJVbmtub3duIHNvY2tldCB0eXBlICVkIiwgc29ja2V0c1tpXS50eXBlKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJc3ogPSBob3dtYW55KG4rMSwgTkZEQklUUykgKiBzaXplb2YoZmRfbWFzayk7CisJaWYgKCpmZHJwID09IE5VTEwgfHwgc3ogPiAqbmFsbG9jcCkgeworCQlpZiAoKmZkcnApCisJCQl4ZnJlZSgqZmRycCk7CisJCWlmICgqZmR3cCkKKwkJCXhmcmVlKCpmZHdwKTsKKwkJKmZkcnAgPSB4bWFsbG9jKHN6KTsKKwkJKmZkd3AgPSB4bWFsbG9jKHN6KTsKKwkJKm5hbGxvY3AgPSBzejsKKwl9CisJaWYgKG4gPCAqZmRsKQorCQlkZWJ1ZygiWFhYIHNocmluazogJWQgPCAlZCIsIG4sICpmZGwpOworCSpmZGwgPSBuOworCW1lbXNldCgqZmRycCwgMCwgc3opOworCW1lbXNldCgqZmR3cCwgMCwgc3opOworCisJZm9yIChpID0gMDsgaSA8IHNvY2tldHNfYWxsb2M7IGkrKykgeworCQlzd2l0Y2ggKHNvY2tldHNbaV0udHlwZSkgeworCQljYXNlIEFVVEhfU09DS0VUOgorCQljYXNlIEFVVEhfQ09OTkVDVElPTjoKKwkJCUZEX1NFVChzb2NrZXRzW2ldLmZkLCAqZmRycCk7CisJCQlpZiAoYnVmZmVyX2xlbigmc29ja2V0c1tpXS5vdXRwdXQpID4gMCkKKwkJCQlGRF9TRVQoc29ja2V0c1tpXS5mZCwgKmZkd3ApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlkZWFkbGluZSA9IHJlYXBlcigpOworCWlmIChwYXJlbnRfYWxpdmVfaW50ZXJ2YWwgIT0gMCkKKwkJZGVhZGxpbmUgPSAoZGVhZGxpbmUgPT0gMCkgPyBwYXJlbnRfYWxpdmVfaW50ZXJ2YWwgOgorCQkgICAgTUlOKGRlYWRsaW5lLCBwYXJlbnRfYWxpdmVfaW50ZXJ2YWwpOworCWlmIChkZWFkbGluZSA9PSAwKSB7CisJCSp0dnBwID0gTlVMTDsKKwl9IGVsc2UgeworCQl0di50dl9zZWMgPSBkZWFkbGluZTsKKwkJdHYudHZfdXNlYyA9IDA7CisJCSp0dnBwID0gJnR2OworCX0KKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgdm9pZAorYWZ0ZXJfc2VsZWN0KGZkX3NldCAqcmVhZHNldCwgZmRfc2V0ICp3cml0ZXNldCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gc3VuYWRkcjsKKwlzb2NrbGVuX3Qgc2xlbjsKKwljaGFyIGJ1ZlsxMDI0XTsKKwlpbnQgbGVuLCBzb2NrOworCXVfaW50IGksIG9yaWdfYWxsb2M7CisJdWlkX3QgZXVpZDsKKwlnaWRfdCBlZ2lkOworCisJZm9yIChpID0gMCwgb3JpZ19hbGxvYyA9IHNvY2tldHNfYWxsb2M7IGkgPCBvcmlnX2FsbG9jOyBpKyspCisJCXN3aXRjaCAoc29ja2V0c1tpXS50eXBlKSB7CisJCWNhc2UgQVVUSF9VTlVTRUQ6CisJCQlicmVhazsKKwkJY2FzZSBBVVRIX1NPQ0tFVDoKKwkJCWlmIChGRF9JU1NFVChzb2NrZXRzW2ldLmZkLCByZWFkc2V0KSkgeworCQkJCXNsZW4gPSBzaXplb2Yoc3VuYWRkcik7CisJCQkJc29jayA9IGFjY2VwdChzb2NrZXRzW2ldLmZkLAorCQkJCSAgICAoc3RydWN0IHNvY2thZGRyICopJnN1bmFkZHIsICZzbGVuKTsKKwkJCQlpZiAoc29jayA8IDApIHsKKwkJCQkJZXJyb3IoImFjY2VwdCBmcm9tIEFVVEhfU09DS0VUOiAlcyIsCisJCQkJCSAgICBzdHJlcnJvcihlcnJubykpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKGdldHBlZXJlaWQoc29jaywgJmV1aWQsICZlZ2lkKSA8IDApIHsKKwkJCQkJZXJyb3IoImdldHBlZXJlaWQgJWQgZmFpbGVkOiAlcyIsCisJCQkJCSAgICBzb2NrLCBzdHJlcnJvcihlcnJubykpOworCQkJCQljbG9zZShzb2NrKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmICgoZXVpZCAhPSAwKSAmJiAoZ2V0dWlkKCkgIT0gZXVpZCkpIHsKKwkJCQkJZXJyb3IoInVpZCBtaXNtYXRjaDogIgorCQkJCQkgICAgInBlZXIgZXVpZCAldSAhPSB1aWQgJXUiLAorCQkJCQkgICAgKHVfaW50KSBldWlkLCAodV9pbnQpIGdldHVpZCgpKTsKKwkJCQkJY2xvc2Uoc29jayk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQluZXdfc29ja2V0KEFVVEhfQ09OTkVDVElPTiwgc29jayk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBBVVRIX0NPTk5FQ1RJT046CisJCQlpZiAoYnVmZmVyX2xlbigmc29ja2V0c1tpXS5vdXRwdXQpID4gMCAmJgorCQkJICAgIEZEX0lTU0VUKHNvY2tldHNbaV0uZmQsIHdyaXRlc2V0KSkgeworCQkJCWxlbiA9IHdyaXRlKHNvY2tldHNbaV0uZmQsCisJCQkJICAgIGJ1ZmZlcl9wdHIoJnNvY2tldHNbaV0ub3V0cHV0KSwKKwkJCQkgICAgYnVmZmVyX2xlbigmc29ja2V0c1tpXS5vdXRwdXQpKTsKKwkJCQlpZiAobGVuID09IC0xICYmIChlcnJubyA9PSBFQUdBSU4gfHwKKwkJCQkgICAgZXJybm8gPT0gRVdPVUxEQkxPQ0sgfHwKKwkJCQkgICAgZXJybm8gPT0gRUlOVFIpKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAobGVuIDw9IDApIHsKKwkJCQkJY2xvc2Vfc29ja2V0KCZzb2NrZXRzW2ldKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWJ1ZmZlcl9jb25zdW1lKCZzb2NrZXRzW2ldLm91dHB1dCwgbGVuKTsKKwkJCX0KKwkJCWlmIChGRF9JU1NFVChzb2NrZXRzW2ldLmZkLCByZWFkc2V0KSkgeworCQkJCWxlbiA9IHJlYWQoc29ja2V0c1tpXS5mZCwgYnVmLCBzaXplb2YoYnVmKSk7CisJCQkJaWYgKGxlbiA9PSAtMSAmJiAoZXJybm8gPT0gRUFHQUlOIHx8CisJCQkJICAgIGVycm5vID09IEVXT1VMREJMT0NLIHx8CisJCQkJICAgIGVycm5vID09IEVJTlRSKSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKGxlbiA8PSAwKSB7CisJCQkJCWNsb3NlX3NvY2tldCgmc29ja2V0c1tpXSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlidWZmZXJfYXBwZW5kKCZzb2NrZXRzW2ldLmlucHV0LCBidWYsIGxlbik7CisJCQkJcHJvY2Vzc19tZXNzYWdlKCZzb2NrZXRzW2ldKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZmF0YWwoIlVua25vd24gdHlwZSAlZCIsIHNvY2tldHNbaV0udHlwZSk7CisJCX0KK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfc29ja2V0KHZvaWQpCit7CisJaWYgKHNvY2tldF9uYW1lWzBdKQorCQl1bmxpbmsoc29ja2V0X25hbWUpOworCWlmIChzb2NrZXRfZGlyWzBdKQorCQlybWRpcihzb2NrZXRfZGlyKTsKK30KKwordm9pZAorY2xlYW51cF9leGl0KGludCBpKQoreworCWNsZWFudXBfc29ja2V0KCk7CisJX2V4aXQoaSk7Cit9CisKKy8qQVJHU1VTRUQqLworc3RhdGljIHZvaWQKK2NsZWFudXBfaGFuZGxlcihpbnQgc2lnKQoreworCWNsZWFudXBfc29ja2V0KCk7CisjaWZkZWYgRU5BQkxFX1BLQ1MxMQorCXBrY3MxMV90ZXJtaW5hdGUoKTsKKyNlbmRpZgorCV9leGl0KDIpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfcGFyZW50X2V4aXN0cyh2b2lkKQoreworCS8qCisJICogSWYgb3VyIHBhcmVudCBoYXMgZXhpdGVkIHRoZW4gZ2V0cHBpZCgpIHdpbGwgcmV0dXJuIChwaWRfdCkxLAorCSAqIHNvIHRlc3RpbmcgZm9yIHRoYXQgc2hvdWxkIGJlIHNhZmUuCisJICovCisJaWYgKHBhcmVudF9waWQgIT0gLTEgJiYgZ2V0cHBpZCgpICE9IHBhcmVudF9waWQpIHsKKwkJLyogcHJpbnRmKCJQYXJlbnQgaGFzIGRpZWQgLSBBdXRoZW50aWNhdGlvbiBhZ2VudCBleGl0aW5nLlxuIik7ICovCisJCWNsZWFudXBfc29ja2V0KCk7CisJCV9leGl0KDIpOworCX0KK30KKworc3RhdGljIHZvaWQKK3VzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgW29wdGlvbnNdIFtjb21tYW5kIFthcmcgLi4uXV1cbiIsCisJICAgIF9fcHJvZ25hbWUpOworCWZwcmludGYoc3RkZXJyLCAiT3B0aW9uczpcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAtYyAgICAgICAgICBHZW5lcmF0ZSBDLXNoZWxsIGNvbW1hbmRzIG9uIHN0ZG91dC5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAtcyAgICAgICAgICBHZW5lcmF0ZSBCb3VybmUgc2hlbGwgY29tbWFuZHMgb24gc3Rkb3V0LlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC1rICAgICAgICAgIEtpbGwgdGhlIGN1cnJlbnQgYWdlbnQuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgLWQgICAgICAgICAgRGVidWcgbW9kZS5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAtYSBzb2NrZXQgICBCaW5kIGFnZW50IHNvY2tldCB0byBnaXZlbiBuYW1lLlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC10IGxpZmUgICAgIERlZmF1bHQgaWRlbnRpdHkgbGlmZXRpbWUgKHNlY29uZHMpLlxuIik7CisJZXhpdCgxKTsKK30KKworaW50CittYWluKGludCBhYywgY2hhciAqKmF2KQoreworCWludCBjX2ZsYWcgPSAwLCBkX2ZsYWcgPSAwLCBrX2ZsYWcgPSAwLCBzX2ZsYWcgPSAwOworCWludCBzb2NrLCBmZCwgY2gsIHJlc3VsdCwgc2F2ZWRfZXJybm87CisJdV9pbnQgbmFsbG9jOworCWNoYXIgKnNoZWxsLCAqZm9ybWF0LCAqcGlkc3RyLCAqYWdlbnRzb2NrZXQgPSBOVUxMOworCWZkX3NldCAqcmVhZHNldHAgPSBOVUxMLCAqd3JpdGVzZXRwID0gTlVMTDsKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gc3VuYWRkcjsKKyNpZmRlZiBIQVZFX1NFVFJMSU1JVAorCXN0cnVjdCBybGltaXQgcmxpbTsKKyNlbmRpZgorCWludCBwcmV2X21hc2s7CisJZXh0ZXJuIGludCBvcHRpbmQ7CisJZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKwlwaWRfdCBwaWQ7CisJY2hhciBwaWRzdHJidWZbMSArIDMgKiBzaXplb2YgcGlkXTsKKwlzdHJ1Y3QgdGltZXZhbCAqdHZwID0gTlVMTDsKKwlzaXplX3QgbGVuOworCisJLyogRW5zdXJlIHRoYXQgZmRzIDAsIDEgYW5kIDIgYXJlIG9wZW4gb3IgZGlyZWN0ZWQgdG8gL2Rldi9udWxsICovCisJc2FuaXRpc2Vfc3RkZmQoKTsKKworCS8qIGRyb3AgKi8KKwlzZXRlZ2lkKGdldGdpZCgpKTsKKwlzZXRnaWQoZ2V0Z2lkKCkpOworCisjaWYgZGVmaW5lZChIQVZFX1BSQ1RMKSAmJiBkZWZpbmVkKFBSX1NFVF9EVU1QQUJMRSkKKwkvKiBEaXNhYmxlIHB0cmFjZSBvbiBMaW51eCB3aXRob3V0IHNnaWQgYml0ICovCisJcHJjdGwoUFJfU0VUX0RVTVBBQkxFLCAwKTsKKyNlbmRpZgorCisJT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKTsKKworCV9fcHJvZ25hbWUgPSBzc2hfZ2V0X3Byb2duYW1lKGF2WzBdKTsKKwlzZWVkX3JuZygpOworCisJd2hpbGUgKChjaCA9IGdldG9wdChhYywgYXYsICJjZGtzYTp0OiIpKSAhPSAtMSkgeworCQlzd2l0Y2ggKGNoKSB7CisJCWNhc2UgJ2MnOgorCQkJaWYgKHNfZmxhZykKKwkJCQl1c2FnZSgpOworCQkJY19mbGFnKys7CisJCQlicmVhazsKKwkJY2FzZSAnayc6CisJCQlrX2ZsYWcrKzsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCWlmIChjX2ZsYWcpCisJCQkJdXNhZ2UoKTsKKwkJCXNfZmxhZysrOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJaWYgKGRfZmxhZykKKwkJCQl1c2FnZSgpOworCQkJZF9mbGFnKys7CisJCQlicmVhazsKKwkJY2FzZSAnYSc6CisJCQlhZ2VudHNvY2tldCA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCWlmICgobGlmZXRpbWUgPSBjb252dGltZShvcHRhcmcpKSA9PSAtMSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBsaWZldGltZVxuIik7CisJCQkJdXNhZ2UoKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdXNhZ2UoKTsKKwkJfQorCX0KKwlhYyAtPSBvcHRpbmQ7CisJYXYgKz0gb3B0aW5kOworCisJaWYgKGFjID4gMCAmJiAoY19mbGFnIHx8IGtfZmxhZyB8fCBzX2ZsYWcgfHwgZF9mbGFnKSkKKwkJdXNhZ2UoKTsKKworCWlmIChhYyA9PSAwICYmICFjX2ZsYWcgJiYgIXNfZmxhZykgeworCQlzaGVsbCA9IGdldGVudigiU0hFTEwiKTsKKwkJaWYgKHNoZWxsICE9IE5VTEwgJiYgKGxlbiA9IHN0cmxlbihzaGVsbCkpID4gMiAmJgorCQkgICAgc3RybmNtcChzaGVsbCArIGxlbiAtIDMsICJjc2giLCAzKSA9PSAwKQorCQkJY19mbGFnID0gMTsKKwl9CisJaWYgKGtfZmxhZykgeworCQljb25zdCBjaGFyICplcnJzdHIgPSBOVUxMOworCisJCXBpZHN0ciA9IGdldGVudihTU0hfQUdFTlRQSURfRU5WX05BTUUpOworCQlpZiAocGlkc3RyID09IE5VTEwpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXMgbm90IHNldCwgY2Fubm90IGtpbGwgYWdlbnRcbiIsCisJCQkgICAgU1NIX0FHRU5UUElEX0VOVl9OQU1FKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJcGlkID0gKGludClzdHJ0b251bShwaWRzdHIsIDIsIElOVF9NQVgsICZlcnJzdHIpOworCQlpZiAoZXJyc3RyKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSAgICAiJXM9XCIlc1wiLCB3aGljaCBpcyBub3QgYSBnb29kIFBJRDogJXNcbiIsCisJCQkgICAgU1NIX0FHRU5UUElEX0VOVl9OQU1FLCBwaWRzdHIsIGVycnN0cik7CisJCQlleGl0KDEpOworCQl9CisJCWlmIChraWxsKHBpZCwgU0lHVEVSTSkgPT0gLTEpIHsKKwkJCXBlcnJvcigia2lsbCIpOworCQkJZXhpdCgxKTsKKwkJfQorCQlmb3JtYXQgPSBjX2ZsYWcgPyAidW5zZXRlbnYgJXM7XG4iIDogInVuc2V0ICVzO1xuIjsKKwkJcHJpbnRmKGZvcm1hdCwgU1NIX0FVVEhTT0NLRVRfRU5WX05BTUUpOworCQlwcmludGYoZm9ybWF0LCBTU0hfQUdFTlRQSURfRU5WX05BTUUpOworCQlwcmludGYoImVjaG8gQWdlbnQgcGlkICVsZCBraWxsZWQ7XG4iLCAobG9uZylwaWQpOworCQlleGl0KDApOworCX0KKwlwYXJlbnRfcGlkID0gZ2V0cGlkKCk7CisKKwlpZiAoYWdlbnRzb2NrZXQgPT0gTlVMTCkgeworCQkvKiBDcmVhdGUgcHJpdmF0ZSBkaXJlY3RvcnkgZm9yIGFnZW50IHNvY2tldCAqLworCQlta3RlbXBfcHJvdG8oc29ja2V0X2Rpciwgc2l6ZW9mKHNvY2tldF9kaXIpKTsKKwkJaWYgKG1rZHRlbXAoc29ja2V0X2RpcikgPT0gTlVMTCkgeworCQkJcGVycm9yKCJta2R0ZW1wOiBwcml2YXRlIHNvY2tldCBkaXIiKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJc25wcmludGYoc29ja2V0X25hbWUsIHNpemVvZiBzb2NrZXRfbmFtZSwgIiVzL2FnZW50LiVsZCIsIHNvY2tldF9kaXIsCisJCSAgICAobG9uZylwYXJlbnRfcGlkKTsKKwl9IGVsc2UgeworCQkvKiBUcnkgdG8gdXNlIHNwZWNpZmllZCBhZ2VudCBzb2NrZXQgKi8KKwkJc29ja2V0X2RpclswXSA9ICdcMCc7CisJCXN0cmxjcHkoc29ja2V0X25hbWUsIGFnZW50c29ja2V0LCBzaXplb2Ygc29ja2V0X25hbWUpOworCX0KKworCS8qCisJICogQ3JlYXRlIHNvY2tldCBlYXJseSBzbyBpdCB3aWxsIGV4aXN0IGJlZm9yZSBjb21tYW5kIGdldHMgcnVuIGZyb20KKwkgKiB0aGUgcGFyZW50LgorCSAqLworCXNvY2sgPSBzb2NrZXQoQUZfVU5JWCwgU09DS19TVFJFQU0sIDApOworCWlmIChzb2NrIDwgMCkgeworCQlwZXJyb3IoInNvY2tldCIpOworCQkqc29ja2V0X25hbWUgPSAnXDAnOyAvKiBEb24ndCB1bmxpbmsgYW55IGV4aXN0aW5nIGZpbGUgKi8KKwkJY2xlYW51cF9leGl0KDEpOworCX0KKwltZW1zZXQoJnN1bmFkZHIsIDAsIHNpemVvZihzdW5hZGRyKSk7CisJc3VuYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKwlzdHJsY3B5KHN1bmFkZHIuc3VuX3BhdGgsIHNvY2tldF9uYW1lLCBzaXplb2Yoc3VuYWRkci5zdW5fcGF0aCkpOworCXByZXZfbWFzayA9IHVtYXNrKDAxNzcpOworCWlmIChiaW5kKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnN1bmFkZHIsIHNpemVvZihzdW5hZGRyKSkgPCAwKSB7CisJCXBlcnJvcigiYmluZCIpOworCQkqc29ja2V0X25hbWUgPSAnXDAnOyAvKiBEb24ndCB1bmxpbmsgYW55IGV4aXN0aW5nIGZpbGUgKi8KKwkJdW1hc2socHJldl9tYXNrKTsKKwkJY2xlYW51cF9leGl0KDEpOworCX0KKwl1bWFzayhwcmV2X21hc2spOworCWlmIChsaXN0ZW4oc29jaywgU1NIX0xJU1RFTl9CQUNLTE9HKSA8IDApIHsKKwkJcGVycm9yKCJsaXN0ZW4iKTsKKwkJY2xlYW51cF9leGl0KDEpOworCX0KKworCS8qCisJICogRm9yaywgYW5kIGhhdmUgdGhlIHBhcmVudCBleGVjdXRlIHRoZSBjb21tYW5kLCBpZiBhbnksIG9yIHByZXNlbnQKKwkgKiB0aGUgc29ja2V0IGRhdGEuICBUaGUgY2hpbGQgY29udGludWVzIGFzIHRoZSBhdXRoZW50aWNhdGlvbiBhZ2VudC4KKwkgKi8KKwlpZiAoZF9mbGFnKSB7CisJCWxvZ19pbml0KF9fcHJvZ25hbWUsIFNZU0xPR19MRVZFTF9ERUJVRzEsIFNZU0xPR19GQUNJTElUWV9BVVRILCAxKTsKKwkJZm9ybWF0ID0gY19mbGFnID8gInNldGVudiAlcyAlcztcbiIgOiAiJXM9JXM7IGV4cG9ydCAlcztcbiI7CisJCXByaW50Zihmb3JtYXQsIFNTSF9BVVRIU09DS0VUX0VOVl9OQU1FLCBzb2NrZXRfbmFtZSwKKwkJICAgIFNTSF9BVVRIU09DS0VUX0VOVl9OQU1FKTsKKwkJcHJpbnRmKCJlY2hvIEFnZW50IHBpZCAlbGQ7XG4iLCAobG9uZylwYXJlbnRfcGlkKTsKKwkJZ290byBza2lwOworCX0KKwlwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA9PSAtMSkgeworCQlwZXJyb3IoImZvcmsiKTsKKwkJY2xlYW51cF9leGl0KDEpOworCX0KKwlpZiAocGlkICE9IDApIHsJCS8qIFBhcmVudCAtIGV4ZWN1dGUgdGhlIGdpdmVuIGNvbW1hbmQuICovCisJCWNsb3NlKHNvY2spOworCQlzbnByaW50ZihwaWRzdHJidWYsIHNpemVvZiBwaWRzdHJidWYsICIlbGQiLCAobG9uZylwaWQpOworCQlpZiAoYWMgPT0gMCkgeworCQkJZm9ybWF0ID0gY19mbGFnID8gInNldGVudiAlcyAlcztcbiIgOiAiJXM9JXM7IGV4cG9ydCAlcztcbiI7CisJCQlwcmludGYoZm9ybWF0LCBTU0hfQVVUSFNPQ0tFVF9FTlZfTkFNRSwgc29ja2V0X25hbWUsCisJCQkgICAgU1NIX0FVVEhTT0NLRVRfRU5WX05BTUUpOworCQkJcHJpbnRmKGZvcm1hdCwgU1NIX0FHRU5UUElEX0VOVl9OQU1FLCBwaWRzdHJidWYsCisJCQkgICAgU1NIX0FHRU5UUElEX0VOVl9OQU1FKTsKKwkJCXByaW50ZigiZWNobyBBZ2VudCBwaWQgJWxkO1xuIiwgKGxvbmcpcGlkKTsKKwkJCWV4aXQoMCk7CisJCX0KKwkJaWYgKHNldGVudihTU0hfQVVUSFNPQ0tFVF9FTlZfTkFNRSwgc29ja2V0X25hbWUsIDEpID09IC0xIHx8CisJCSAgICBzZXRlbnYoU1NIX0FHRU5UUElEX0VOVl9OQU1FLCBwaWRzdHJidWYsIDEpID09IC0xKSB7CisJCQlwZXJyb3IoInNldGVudiIpOworCQkJZXhpdCgxKTsKKwkJfQorCQlleGVjdnAoYXZbMF0sIGF2KTsKKwkJcGVycm9yKGF2WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisJLyogY2hpbGQgKi8KKwlsb2dfaW5pdChfX3Byb2duYW1lLCBTWVNMT0dfTEVWRUxfSU5GTywgU1lTTE9HX0ZBQ0lMSVRZX0FVVEgsIDApOworCisJaWYgKHNldHNpZCgpID09IC0xKSB7CisJCWVycm9yKCJzZXRzaWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xlYW51cF9leGl0KDEpOworCX0KKworCSh2b2lkKWNoZGlyKCIvIik7CisJaWYgKChmZCA9IG9wZW4oX1BBVEhfREVWTlVMTCwgT19SRFdSLCAwKSkgIT0gLTEpIHsKKwkJLyogWFhYIG1pZ2h0IGNsb3NlIGxpc3RlbiBzb2NrZXQgKi8KKwkJKHZvaWQpZHVwMihmZCwgU1RESU5fRklMRU5PKTsKKwkJKHZvaWQpZHVwMihmZCwgU1RET1VUX0ZJTEVOTyk7CisJCSh2b2lkKWR1cDIoZmQsIFNUREVSUl9GSUxFTk8pOworCQlpZiAoZmQgPiAyKQorCQkJY2xvc2UoZmQpOworCX0KKworI2lmZGVmIEhBVkVfU0VUUkxJTUlUCisJLyogZGVueSBjb3JlIGR1bXBzLCBzaW5jZSBtZW1vcnkgY29udGFpbnMgdW5lbmNyeXB0ZWQgcHJpdmF0ZSBrZXlzICovCisJcmxpbS5ybGltX2N1ciA9IHJsaW0ucmxpbV9tYXggPSAwOworCWlmIChzZXRybGltaXQoUkxJTUlUX0NPUkUsICZybGltKSA8IDApIHsKKwkJZXJyb3IoInNldHJsaW1pdCBSTElNSVRfQ09SRTogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQljbGVhbnVwX2V4aXQoMSk7CisJfQorI2VuZGlmCisKK3NraXA6CisKKyNpZmRlZiBFTkFCTEVfUEtDUzExCisJcGtjczExX2luaXQoMCk7CisjZW5kaWYKKwluZXdfc29ja2V0KEFVVEhfU09DS0VULCBzb2NrKTsKKwlpZiAoYWMgPiAwKQorCQlwYXJlbnRfYWxpdmVfaW50ZXJ2YWwgPSAxMDsKKwlpZHRhYl9pbml0KCk7CisJaWYgKCFkX2ZsYWcpCisJCXNpZ25hbChTSUdJTlQsIFNJR19JR04pOworCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKwlzaWduYWwoU0lHSFVQLCBjbGVhbnVwX2hhbmRsZXIpOworCXNpZ25hbChTSUdURVJNLCBjbGVhbnVwX2hhbmRsZXIpOworCW5hbGxvYyA9IDA7CisKKwl3aGlsZSAoMSkgeworCQlwcmVwYXJlX3NlbGVjdCgmcmVhZHNldHAsICZ3cml0ZXNldHAsICZtYXhfZmQsICZuYWxsb2MsICZ0dnApOworCQlyZXN1bHQgPSBzZWxlY3QobWF4X2ZkICsgMSwgcmVhZHNldHAsIHdyaXRlc2V0cCwgTlVMTCwgdHZwKTsKKwkJc2F2ZWRfZXJybm8gPSBlcnJubzsKKwkJaWYgKHBhcmVudF9hbGl2ZV9pbnRlcnZhbCAhPSAwKQorCQkJY2hlY2tfcGFyZW50X2V4aXN0cygpOworCQkodm9pZCkgcmVhcGVyKCk7CS8qIHJlbW92ZSBleHBpcmVkIGtleXMgKi8KKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCWlmIChzYXZlZF9lcnJubyA9PSBFSU5UUikKKwkJCQljb250aW51ZTsKKwkJCWZhdGFsKCJzZWxlY3Q6ICVzIiwgc3RyZXJyb3Ioc2F2ZWRfZXJybm8pKTsKKwkJfSBlbHNlIGlmIChyZXN1bHQgPiAwKQorCQkJYWZ0ZXJfc2VsZWN0KHJlYWRzZXRwLCB3cml0ZXNldHApOworCX0KKwkvKiBOT1RSRUFDSEVEICovCit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NzaC1kc3MuYyBiL29wZW5zc2gtNi4wcDEvc3NoLWRzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZTVlMjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NzaC1kc3MuYwpAQCAtMCwwICsxLDE4NyBAQAorLyogJE9wZW5CU0Q6IHNzaC1kc3MuYyx2IDEuMjcgMjAxMC8wOC8zMSAwOTo1ODozNyBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgImtleS5oIgorCisjZGVmaW5lIElOVEJMT0JfTEVOCTIwCisjZGVmaW5lIFNJR0JMT0JfTEVOCSgyKklOVEJMT0JfTEVOKQorCitpbnQKK3NzaF9kc3Nfc2lnbihjb25zdCBLZXkgKmtleSwgdV9jaGFyICoqc2lncCwgdV9pbnQgKmxlbnAsCisgICAgY29uc3QgdV9jaGFyICpkYXRhLCB1X2ludCBkYXRhbGVuKQoreworCURTQV9TSUcgKnNpZzsKKwljb25zdCBFVlBfTUQgKmV2cF9tZCA9IEVWUF9zaGExKCk7CisJRVZQX01EX0NUWCBtZDsKKwl1X2NoYXIgZGlnZXN0W0VWUF9NQVhfTURfU0laRV0sIHNpZ2Jsb2JbU0lHQkxPQl9MRU5dOworCXVfaW50IHJsZW4sIHNsZW4sIGxlbiwgZGxlbjsKKwlCdWZmZXIgYjsKKworCWlmIChrZXkgPT0gTlVMTCB8fCBrZXktPmRzYSA9PSBOVUxMIHx8IChrZXktPnR5cGUgIT0gS0VZX0RTQSAmJgorCSAgICBrZXktPnR5cGUgIT0gS0VZX0RTQV9DRVJUICYmIGtleS0+dHlwZSAhPSBLRVlfRFNBX0NFUlRfVjAwKSkgeworCQllcnJvcigic3NoX2Rzc19zaWduOiBubyBEU0Ega2V5Iik7CisJCXJldHVybiAtMTsKKwl9CisJRVZQX0RpZ2VzdEluaXQoJm1kLCBldnBfbWQpOworCUVWUF9EaWdlc3RVcGRhdGUoJm1kLCBkYXRhLCBkYXRhbGVuKTsKKwlFVlBfRGlnZXN0RmluYWwoJm1kLCBkaWdlc3QsICZkbGVuKTsKKworCXNpZyA9IERTQV9kb19zaWduKGRpZ2VzdCwgZGxlbiwga2V5LT5kc2EpOworCW1lbXNldChkaWdlc3QsICdkJywgc2l6ZW9mKGRpZ2VzdCkpOworCisJaWYgKHNpZyA9PSBOVUxMKSB7CisJCWVycm9yKCJzc2hfZHNzX3NpZ246IHNpZ24gZmFpbGVkIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlybGVuID0gQk5fbnVtX2J5dGVzKHNpZy0+cik7CisJc2xlbiA9IEJOX251bV9ieXRlcyhzaWctPnMpOworCWlmIChybGVuID4gSU5UQkxPQl9MRU4gfHwgc2xlbiA+IElOVEJMT0JfTEVOKSB7CisJCWVycm9yKCJiYWQgc2lnIHNpemUgJXUgJXUiLCBybGVuLCBzbGVuKTsKKwkJRFNBX1NJR19mcmVlKHNpZyk7CisJCXJldHVybiAtMTsKKwl9CisJbWVtc2V0KHNpZ2Jsb2IsIDAsIFNJR0JMT0JfTEVOKTsKKwlCTl9ibjJiaW4oc2lnLT5yLCBzaWdibG9iKyBTSUdCTE9CX0xFTiAtIElOVEJMT0JfTEVOIC0gcmxlbik7CisJQk5fYm4yYmluKHNpZy0+cywgc2lnYmxvYisgU0lHQkxPQl9MRU4gLSBzbGVuKTsKKwlEU0FfU0lHX2ZyZWUoc2lnKTsKKworCWlmIChkYXRhZmVsbG93cyAmIFNTSF9CVUdfU0lHQkxPQikgeworCQlpZiAobGVucCAhPSBOVUxMKQorCQkJKmxlbnAgPSBTSUdCTE9CX0xFTjsKKwkJaWYgKHNpZ3AgIT0gTlVMTCkgeworCQkJKnNpZ3AgPSB4bWFsbG9jKFNJR0JMT0JfTEVOKTsKKwkJCW1lbWNweSgqc2lncCwgc2lnYmxvYiwgU0lHQkxPQl9MRU4pOworCQl9CisJfSBlbHNlIHsKKwkJLyogaWV0Zi1kcmFmdHMgKi8KKwkJYnVmZmVyX2luaXQoJmIpOworCQlidWZmZXJfcHV0X2NzdHJpbmcoJmIsICJzc2gtZHNzIik7CisJCWJ1ZmZlcl9wdXRfc3RyaW5nKCZiLCBzaWdibG9iLCBTSUdCTE9CX0xFTik7CisJCWxlbiA9IGJ1ZmZlcl9sZW4oJmIpOworCQlpZiAobGVucCAhPSBOVUxMKQorCQkJKmxlbnAgPSBsZW47CisJCWlmIChzaWdwICE9IE5VTEwpIHsKKwkJCSpzaWdwID0geG1hbGxvYyhsZW4pOworCQkJbWVtY3B5KCpzaWdwLCBidWZmZXJfcHRyKCZiKSwgbGVuKTsKKwkJfQorCQlidWZmZXJfZnJlZSgmYik7CisJfQorCXJldHVybiAwOworfQoraW50Citzc2hfZHNzX3ZlcmlmeShjb25zdCBLZXkgKmtleSwgY29uc3QgdV9jaGFyICpzaWduYXR1cmUsIHVfaW50IHNpZ25hdHVyZWxlbiwKKyAgICBjb25zdCB1X2NoYXIgKmRhdGEsIHVfaW50IGRhdGFsZW4pCit7CisJRFNBX1NJRyAqc2lnOworCWNvbnN0IEVWUF9NRCAqZXZwX21kID0gRVZQX3NoYTEoKTsKKwlFVlBfTURfQ1RYIG1kOworCXVfY2hhciBkaWdlc3RbRVZQX01BWF9NRF9TSVpFXSwgKnNpZ2Jsb2I7CisJdV9pbnQgbGVuLCBkbGVuOworCWludCBybGVuLCByZXQ7CisJQnVmZmVyIGI7CisKKwlpZiAoa2V5ID09IE5VTEwgfHwga2V5LT5kc2EgPT0gTlVMTCB8fCAoa2V5LT50eXBlICE9IEtFWV9EU0EgJiYKKwkgICAga2V5LT50eXBlICE9IEtFWV9EU0FfQ0VSVCAmJiBrZXktPnR5cGUgIT0gS0VZX0RTQV9DRVJUX1YwMCkpIHsKKwkJZXJyb3IoInNzaF9kc3NfdmVyaWZ5OiBubyBEU0Ega2V5Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBmZXRjaCBzaWduYXR1cmUgKi8KKwlpZiAoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX1NJR0JMT0IpIHsKKwkJc2lnYmxvYiA9IHhtYWxsb2Moc2lnbmF0dXJlbGVuKTsKKwkJbWVtY3B5KHNpZ2Jsb2IsIHNpZ25hdHVyZSwgc2lnbmF0dXJlbGVuKTsKKwkJbGVuID0gc2lnbmF0dXJlbGVuOworCX0gZWxzZSB7CisJCS8qIGlldGYtZHJhZnRzICovCisJCWNoYXIgKmt0eXBlOworCQlidWZmZXJfaW5pdCgmYik7CisJCWJ1ZmZlcl9hcHBlbmQoJmIsIHNpZ25hdHVyZSwgc2lnbmF0dXJlbGVuKTsKKwkJa3R5cGUgPSBidWZmZXJfZ2V0X2NzdHJpbmcoJmIsIE5VTEwpOworCQlpZiAoc3RyY21wKCJzc2gtZHNzIiwga3R5cGUpICE9IDApIHsKKwkJCWVycm9yKCJzc2hfZHNzX3ZlcmlmeTogY2Fubm90IGhhbmRsZSB0eXBlICVzIiwga3R5cGUpOworCQkJYnVmZmVyX2ZyZWUoJmIpOworCQkJeGZyZWUoa3R5cGUpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXhmcmVlKGt0eXBlKTsKKwkJc2lnYmxvYiA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZiLCAmbGVuKTsKKwkJcmxlbiA9IGJ1ZmZlcl9sZW4oJmIpOworCQlidWZmZXJfZnJlZSgmYik7CisJCWlmIChybGVuICE9IDApIHsKKwkJCWVycm9yKCJzc2hfZHNzX3ZlcmlmeTogIgorCQkJICAgICJyZW1haW5pbmcgYnl0ZXMgaW4gc2lnbmF0dXJlICVkIiwgcmxlbik7CisJCQl4ZnJlZShzaWdibG9iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChsZW4gIT0gU0lHQkxPQl9MRU4pIHsKKwkJZmF0YWwoImJhZCBzaWdibG9ibGVuICV1ICE9IFNJR0JMT0JfTEVOIiwgbGVuKTsKKwl9CisKKwkvKiBwYXJzZSBzaWduYXR1cmUgKi8KKwlpZiAoKHNpZyA9IERTQV9TSUdfbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCJzc2hfZHNzX3ZlcmlmeTogRFNBX1NJR19uZXcgZmFpbGVkIik7CisJaWYgKChzaWctPnIgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoInNzaF9kc3NfdmVyaWZ5OiBCTl9uZXcgZmFpbGVkIik7CisJaWYgKChzaWctPnMgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoInNzaF9kc3NfdmVyaWZ5OiBCTl9uZXcgZmFpbGVkIik7CisJaWYgKChCTl9iaW4yYm4oc2lnYmxvYiwgSU5UQkxPQl9MRU4sIHNpZy0+cikgPT0gTlVMTCkgfHwKKwkgICAgKEJOX2JpbjJibihzaWdibG9iKyBJTlRCTE9CX0xFTiwgSU5UQkxPQl9MRU4sIHNpZy0+cykgPT0gTlVMTCkpCisJCWZhdGFsKCJzc2hfZHNzX3ZlcmlmeTogQk5fYmluMmJuIGZhaWxlZCIpOworCisJLyogY2xlYW4gdXAgKi8KKwltZW1zZXQoc2lnYmxvYiwgMCwgbGVuKTsKKwl4ZnJlZShzaWdibG9iKTsKKworCS8qIHNoYTEgdGhlIGRhdGEgKi8KKwlFVlBfRGlnZXN0SW5pdCgmbWQsIGV2cF9tZCk7CisJRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIGRhdGEsIGRhdGFsZW4pOworCUVWUF9EaWdlc3RGaW5hbCgmbWQsIGRpZ2VzdCwgJmRsZW4pOworCisJcmV0ID0gRFNBX2RvX3ZlcmlmeShkaWdlc3QsIGRsZW4sIHNpZywga2V5LT5kc2EpOworCW1lbXNldChkaWdlc3QsICdkJywgc2l6ZW9mKGRpZ2VzdCkpOworCisJRFNBX1NJR19mcmVlKHNpZyk7CisKKwlkZWJ1Zygic3NoX2Rzc192ZXJpZnk6IHNpZ25hdHVyZSAlcyIsCisJICAgIHJldCA9PSAxID8gImNvcnJlY3QiIDogcmV0ID09IDAgPyAiaW5jb3JyZWN0IiA6ICJlcnJvciIpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NzaC1lY2RzYS5jIGIvb3BlbnNzaC02LjBwMS9zc2gtZWNkc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODU0NjhlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zc2gtZWNkc2EuYwpAQCAtMCwwICsxLDE2OSBAQAorLyogJE9wZW5CU0Q6IHNzaC1lY2RzYS5jLHYgMS41IDIwMTIvMDEvMDggMTM6MTc6MTEgbWlvZCBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMCBEYW1pZW4gTWlsbGVyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZWMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2VjZHNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgImtleS5oIgorCitpbnQKK3NzaF9lY2RzYV9zaWduKGNvbnN0IEtleSAqa2V5LCB1X2NoYXIgKipzaWdwLCB1X2ludCAqbGVucCwKKyAgICBjb25zdCB1X2NoYXIgKmRhdGEsIHVfaW50IGRhdGFsZW4pCit7CisJRUNEU0FfU0lHICpzaWc7CisJY29uc3QgRVZQX01EICpldnBfbWQ7CisJRVZQX01EX0NUWCBtZDsKKwl1X2NoYXIgZGlnZXN0W0VWUF9NQVhfTURfU0laRV07CisJdV9pbnQgbGVuLCBkbGVuOworCUJ1ZmZlciBiLCBiYjsKKworCWlmIChrZXkgPT0gTlVMTCB8fCBrZXktPmVjZHNhID09IE5VTEwgfHwKKwkgICAgKGtleS0+dHlwZSAhPSBLRVlfRUNEU0EgJiYga2V5LT50eXBlICE9IEtFWV9FQ0RTQV9DRVJUKSkgeworCQllcnJvcigiJXM6IG5vIEVDRFNBIGtleSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKwlldnBfbWQgPSBrZXlfZWNfbmlkX3RvX2V2cG1kKGtleS0+ZWNkc2FfbmlkKTsKKwlFVlBfRGlnZXN0SW5pdCgmbWQsIGV2cF9tZCk7CisJRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIGRhdGEsIGRhdGFsZW4pOworCUVWUF9EaWdlc3RGaW5hbCgmbWQsIGRpZ2VzdCwgJmRsZW4pOworCisJc2lnID0gRUNEU0FfZG9fc2lnbihkaWdlc3QsIGRsZW4sIGtleS0+ZWNkc2EpOworCW1lbXNldChkaWdlc3QsICdkJywgc2l6ZW9mKGRpZ2VzdCkpOworCisJaWYgKHNpZyA9PSBOVUxMKSB7CisJCWVycm9yKCIlczogc2lnbiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlidWZmZXJfaW5pdCgmYmIpOworCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYmIsIHNpZy0+cik7CisJYnVmZmVyX3B1dF9iaWdudW0yKCZiYiwgc2lnLT5zKTsKKwlFQ0RTQV9TSUdfZnJlZShzaWcpOworCisJYnVmZmVyX2luaXQoJmIpOworCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwga2V5X3NzaF9uYW1lX3BsYWluKGtleSkpOworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZiLCBidWZmZXJfcHRyKCZiYiksIGJ1ZmZlcl9sZW4oJmJiKSk7CisJYnVmZmVyX2ZyZWUoJmJiKTsKKwlsZW4gPSBidWZmZXJfbGVuKCZiKTsKKwlpZiAobGVucCAhPSBOVUxMKQorCQkqbGVucCA9IGxlbjsKKwlpZiAoc2lncCAhPSBOVUxMKSB7CisJCSpzaWdwID0geG1hbGxvYyhsZW4pOworCQltZW1jcHkoKnNpZ3AsIGJ1ZmZlcl9wdHIoJmIpLCBsZW4pOworCX0KKwlidWZmZXJfZnJlZSgmYik7CisKKwlyZXR1cm4gMDsKK30KK2ludAorc3NoX2VjZHNhX3ZlcmlmeShjb25zdCBLZXkgKmtleSwgY29uc3QgdV9jaGFyICpzaWduYXR1cmUsIHVfaW50IHNpZ25hdHVyZWxlbiwKKyAgICBjb25zdCB1X2NoYXIgKmRhdGEsIHVfaW50IGRhdGFsZW4pCit7CisJRUNEU0FfU0lHICpzaWc7CisJY29uc3QgRVZQX01EICpldnBfbWQ7CisJRVZQX01EX0NUWCBtZDsKKwl1X2NoYXIgZGlnZXN0W0VWUF9NQVhfTURfU0laRV0sICpzaWdibG9iOworCXVfaW50IGxlbiwgZGxlbjsKKwlpbnQgcmxlbiwgcmV0OworCUJ1ZmZlciBiLCBiYjsKKwljaGFyICprdHlwZTsKKworCWlmIChrZXkgPT0gTlVMTCB8fCBrZXktPmVjZHNhID09IE5VTEwgfHwKKwkgICAgKGtleS0+dHlwZSAhPSBLRVlfRUNEU0EgJiYga2V5LT50eXBlICE9IEtFWV9FQ0RTQV9DRVJUKSkgeworCQllcnJvcigiJXM6IG5vIEVDRFNBIGtleSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKwlldnBfbWQgPSBrZXlfZWNfbmlkX3RvX2V2cG1kKGtleS0+ZWNkc2FfbmlkKTsKKworCS8qIGZldGNoIHNpZ25hdHVyZSAqLworCWJ1ZmZlcl9pbml0KCZiKTsKKwlidWZmZXJfYXBwZW5kKCZiLCBzaWduYXR1cmUsIHNpZ25hdHVyZWxlbik7CisJa3R5cGUgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgTlVMTCk7CisJaWYgKHN0cmNtcChrZXlfc3NoX25hbWVfcGxhaW4oa2V5KSwga3R5cGUpICE9IDApIHsKKwkJZXJyb3IoIiVzOiBjYW5ub3QgaGFuZGxlIHR5cGUgJXMiLCBfX2Z1bmNfXywga3R5cGUpOworCQlidWZmZXJfZnJlZSgmYik7CisJCXhmcmVlKGt0eXBlKTsKKwkJcmV0dXJuIC0xOworCX0KKwl4ZnJlZShrdHlwZSk7CisJc2lnYmxvYiA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZiLCAmbGVuKTsKKwlybGVuID0gYnVmZmVyX2xlbigmYik7CisJYnVmZmVyX2ZyZWUoJmIpOworCWlmIChybGVuICE9IDApIHsKKwkJZXJyb3IoIiVzOiByZW1haW5pbmcgYnl0ZXMgaW4gc2lnbmF0dXJlICVkIiwgX19mdW5jX18sIHJsZW4pOworCQl4ZnJlZShzaWdibG9iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHBhcnNlIHNpZ25hdHVyZSAqLworCWlmICgoc2lnID0gRUNEU0FfU0lHX25ldygpKSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IEVDRFNBX1NJR19uZXcgZmFpbGVkIiwgX19mdW5jX18pOworCWlmICgoc2lnLT5yID0gQk5fbmV3KCkpID09IE5VTEwgfHwKKwkgICAgKHNpZy0+cyA9IEJOX25ldygpKSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IEJOX25ldyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisKKwlidWZmZXJfaW5pdCgmYmIpOworCWJ1ZmZlcl9hcHBlbmQoJmJiLCBzaWdibG9iLCBsZW4pOworCWJ1ZmZlcl9nZXRfYmlnbnVtMigmYmIsIHNpZy0+cik7CisJYnVmZmVyX2dldF9iaWdudW0yKCZiYiwgc2lnLT5zKTsKKwlpZiAoYnVmZmVyX2xlbigmYmIpICE9IDApCisJCWZhdGFsKCIlczogcmVtYWluaW5nIGJ5dGVzIGluIGlubmVyIHNpZ2Jsb2IiLCBfX2Z1bmNfXyk7CisJYnVmZmVyX2ZyZWUoJmJiKTsKKworCS8qIGNsZWFuIHVwICovCisJbWVtc2V0KHNpZ2Jsb2IsIDAsIGxlbik7CisJeGZyZWUoc2lnYmxvYik7CisKKwkvKiBoYXNoIHRoZSBkYXRhICovCisJRVZQX0RpZ2VzdEluaXQoJm1kLCBldnBfbWQpOworCUVWUF9EaWdlc3RVcGRhdGUoJm1kLCBkYXRhLCBkYXRhbGVuKTsKKwlFVlBfRGlnZXN0RmluYWwoJm1kLCBkaWdlc3QsICZkbGVuKTsKKworCXJldCA9IEVDRFNBX2RvX3ZlcmlmeShkaWdlc3QsIGRsZW4sIHNpZywga2V5LT5lY2RzYSk7CisJbWVtc2V0KGRpZ2VzdCwgJ2QnLCBzaXplb2YoZGlnZXN0KSk7CisKKwlFQ0RTQV9TSUdfZnJlZShzaWcpOworCisJZGVidWcoIiVzOiBzaWduYXR1cmUgJXMiLCBfX2Z1bmNfXywKKwkgICAgcmV0ID09IDEgPyAiY29ycmVjdCIgOiByZXQgPT0gMCA/ICJpbmNvcnJlY3QiIDogImVycm9yIik7CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmIC8qIE9QRU5TU0xfSEFTX0VDQyAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zc2gtZ3NzLmggYi9vcGVuc3NoLTYuMHAxL3NzaC1nc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjlhMWI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zc2gtZ3NzLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qICRPcGVuQlNEOiBzc2gtZ3NzLmgsdiAxLjEwIDIwMDcvMDYvMTIgMDg6MjA6MDAgZGptIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMgU2ltb24gV2lsa2luc29uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1NTSF9HU1NfSAorI2RlZmluZSBfU1NIX0dTU19ICisKKyNpZmRlZiBHU1NBUEkKKworI2lmZGVmIEhBVkVfR1NTQVBJX0gKKyNpbmNsdWRlIDxnc3NhcGkuaD4KKyNlbGlmIGRlZmluZWQoSEFWRV9HU1NBUElfR1NTQVBJX0gpCisjaW5jbHVkZSA8Z3NzYXBpL2dzc2FwaS5oPgorI2VuZGlmCisKKyNpZmRlZiBLUkI1CisjIGlmbmRlZiBIRUlNREFMCisjICBpZmRlZiBIQVZFX0dTU0FQSV9HRU5FUklDX0gKKyMgICBpbmNsdWRlIDxnc3NhcGlfZ2VuZXJpYy5oPgorIyAgZWxpZiBkZWZpbmVkKEhBVkVfR1NTQVBJX0dTU0FQSV9HRU5FUklDX0gpCisjICAgaW5jbHVkZSA8Z3NzYXBpL2dzc2FwaV9nZW5lcmljLmg+CisjICBlbmRpZgorCisvKiBNSVQgS2VyYmVyb3MgZG9lc24ndCBzZWVtIHRvIGRlZmluZSBHU1NfTlRfSE9TVEJBU0VEX1NFUlZJQ0UgKi8KKworI2lmbmRlZiBHU1NfQ19OVF9IT1NUQkFTRURfU0VSVklDRQorI2RlZmluZSBHU1NfQ19OVF9IT1NUQkFTRURfU0VSVklDRSBnc3NfbnRfc2VydmljZV9uYW1lCisjZW5kaWYgLyogR1NTX0NfTlRfLi4uICovCisjZW5kaWYgLyogIUhFSU1EQUwgKi8KKyNlbmRpZiAvKiBLUkI1ICovCisKKy8qIGRyYWZ0LWlldGYtc2Vjc2gtZ3Nza2V5ZXgtMDYgKi8KKyNkZWZpbmUgU1NIMl9NU0dfVVNFUkFVVEhfR1NTQVBJX1JFU1BPTlNFCQk2MAorI2RlZmluZSBTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfVE9LRU4JCQk2MQorI2RlZmluZSBTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfRVhDSEFOR0VfQ09NUExFVEUJNjMKKyNkZWZpbmUgU1NIMl9NU0dfVVNFUkFVVEhfR1NTQVBJX0VSUk9SCQkJNjQKKyNkZWZpbmUgU1NIMl9NU0dfVVNFUkFVVEhfR1NTQVBJX0VSUlRPSwkJCTY1CisjZGVmaW5lIFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9NSUMJCQk2NgorCisjZGVmaW5lIFNTSF9HU1NfT0lEVFlQRSAweDA2CisKK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyICpmaWxlbmFtZTsKKwljaGFyICplbnZ2YXI7CisJY2hhciAqZW52dmFsOworCXZvaWQgKmRhdGE7Cit9IHNzaF9nc3NhcGlfY2NhY2hlOworCit0eXBlZGVmIHN0cnVjdCB7CisJZ3NzX2J1ZmZlcl9kZXNjIGRpc3BsYXluYW1lOworCWdzc19idWZmZXJfZGVzYyBleHBvcnRlZG5hbWU7CisJZ3NzX2NyZWRfaWRfdCBjcmVkczsKKwlzdHJ1Y3Qgc3NoX2dzc2FwaV9tZWNoX3N0cnVjdCAqbWVjaDsKKwlzc2hfZ3NzYXBpX2NjYWNoZSBzdG9yZTsKK30gc3NoX2dzc2FwaV9jbGllbnQ7CisKK3R5cGVkZWYgc3RydWN0IHNzaF9nc3NhcGlfbWVjaF9zdHJ1Y3QgeworCWNoYXIgKmVuY19uYW1lOworCWNoYXIgKm5hbWU7CisJZ3NzX09JRF9kZXNjIG9pZDsKKwlpbnQgKCpkb2NoaWxkKSAoc3NoX2dzc2FwaV9jbGllbnQgKik7CisJaW50ICgqdXNlcm9rKSAoc3NoX2dzc2FwaV9jbGllbnQgKiwgY2hhciAqKTsKKwlpbnQgKCpsb2NhbG5hbWUpIChzc2hfZ3NzYXBpX2NsaWVudCAqLCBjaGFyICoqKTsKKwl2b2lkICgqc3RvcmVjcmVkcykgKHNzaF9nc3NhcGlfY2xpZW50ICopOworfSBzc2hfZ3NzYXBpX21lY2g7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlPTV91aW50MzIJbWFqb3I7IC8qIGJvdGggKi8KKwlPTV91aW50MzIJbWlub3I7IC8qIGJvdGggKi8KKwlnc3NfY3R4X2lkX3QJY29udGV4dDsgLyogYm90aCAqLworCWdzc19uYW1lX3QJbmFtZTsgLyogYm90aCAqLworCWdzc19PSUQJCW9pZDsgLyogY2xpZW50ICovCisJZ3NzX2NyZWRfaWRfdAljcmVkczsgLyogc2VydmVyICovCisJZ3NzX25hbWVfdAljbGllbnQ7IC8qIHNlcnZlciAqLworCWdzc19jcmVkX2lkX3QJY2xpZW50X2NyZWRzOyAvKiBzZXJ2ZXIgKi8KK30gR3NzY3R4dDsKKworZXh0ZXJuIHNzaF9nc3NhcGlfbWVjaCAqc3VwcG9ydGVkX21lY2hzW107CisKK2ludCAgc3NoX2dzc2FwaV9jaGVja19vaWQoR3NzY3R4dCAqLCB2b2lkICosIHNpemVfdCk7Cit2b2lkIHNzaF9nc3NhcGlfc2V0X29pZF9kYXRhKEdzc2N0eHQgKiwgdm9pZCAqLCBzaXplX3QpOwordm9pZCBzc2hfZ3NzYXBpX3NldF9vaWQoR3NzY3R4dCAqLCBnc3NfT0lEKTsKK3ZvaWQgc3NoX2dzc2FwaV9zdXBwb3J0ZWRfb2lkcyhnc3NfT0lEX3NldCAqKTsKK3NzaF9nc3NhcGlfbWVjaCAqc3NoX2dzc2FwaV9nZXRfY3R5cGUoR3NzY3R4dCAqKTsKKworT01fdWludDMyIHNzaF9nc3NhcGlfaW1wb3J0X25hbWUoR3NzY3R4dCAqLCBjb25zdCBjaGFyICopOworT01fdWludDMyIHNzaF9nc3NhcGlfaW5pdF9jdHgoR3NzY3R4dCAqLCBpbnQsCisgICAgZ3NzX2J1ZmZlcl9kZXNjICosIGdzc19idWZmZXJfZGVzYyAqLCBPTV91aW50MzIgKik7CitPTV91aW50MzIgc3NoX2dzc2FwaV9hY2NlcHRfY3R4KEdzc2N0eHQgKiwKKyAgICBnc3NfYnVmZmVyX2Rlc2MgKiwgZ3NzX2J1ZmZlcl9kZXNjICosIE9NX3VpbnQzMiAqKTsKK09NX3VpbnQzMiBzc2hfZ3NzYXBpX2dldGNsaWVudChHc3NjdHh0ICosIHNzaF9nc3NhcGlfY2xpZW50ICopOwordm9pZCBzc2hfZ3NzYXBpX2Vycm9yKEdzc2N0eHQgKik7CitjaGFyICpzc2hfZ3NzYXBpX2xhc3RfZXJyb3IoR3NzY3R4dCAqLCBPTV91aW50MzIgKiwgT01fdWludDMyICopOwordm9pZCBzc2hfZ3NzYXBpX2J1aWxkX2N0eChHc3NjdHh0ICoqKTsKK3ZvaWQgc3NoX2dzc2FwaV9kZWxldGVfY3R4KEdzc2N0eHQgKiopOworT01fdWludDMyIHNzaF9nc3NhcGlfc2lnbihHc3NjdHh0ICosIGdzc19idWZmZXJfdCwgZ3NzX2J1ZmZlcl90KTsKK3ZvaWQgc3NoX2dzc2FwaV9idWlsZG1pYyhCdWZmZXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitpbnQgc3NoX2dzc2FwaV9jaGVja19tZWNoYW5pc20oR3NzY3R4dCAqKiwgZ3NzX09JRCwgY29uc3QgY2hhciAqKTsKKworLyogSW4gdGhlIHNlcnZlciAqLworT01fdWludDMyIHNzaF9nc3NhcGlfc2VydmVyX2N0eChHc3NjdHh0ICoqLCBnc3NfT0lEKTsKK2ludCBzc2hfZ3NzYXBpX3VzZXJvayhjaGFyICpuYW1lKTsKK09NX3VpbnQzMiBzc2hfZ3NzYXBpX2NoZWNrbWljKEdzc2N0eHQgKiwgZ3NzX2J1ZmZlcl90LCBnc3NfYnVmZmVyX3QpOwordm9pZCBzc2hfZ3NzYXBpX2RvX2NoaWxkKGNoYXIgKioqLCB1X2ludCAqKTsKK3ZvaWQgc3NoX2dzc2FwaV9jbGVhbnVwX2NyZWRzKHZvaWQpOwordm9pZCBzc2hfZ3NzYXBpX3N0b3JlY3JlZHModm9pZCk7CisKKyNlbmRpZiAvKiBHU1NBUEkgKi8KKworI2VuZGlmIC8qIF9TU0hfR1NTX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc3NoLWtleWdlbi4wIGIvb3BlbnNzaC02LjBwMS9zc2gta2V5Z2VuLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlZGQ0MQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc3NoLWtleWdlbi4wCkBAIC0wLDAgKzEsNDYwIEBACitTU0gtS0VZR0VOKDEpICAgICAgICAgICAgICBPcGVuQlNEIFJlZmVyZW5jZSBNYW51YWwgICAgICAgICAgICAgIFNTSC1LRVlHRU4oMSkKKworTkFNRQorICAgICBzc2gta2V5Z2VuIC0gYXV0aGVudGljYXRpb24ga2V5IGdlbmVyYXRpb24sIG1hbmFnZW1lbnQgYW5kIGNvbnZlcnNpb24KKworU1lOT1BTSVMKKyAgICAgc3NoLWtleWdlbiBbLXFdIFstYiBiaXRzXSAtdCB0eXBlIFstTiBuZXdfcGFzc3BocmFzZV0gWy1DIGNvbW1lbnRdCisgICAgICAgICAgICAgICAgWy1mIG91dHB1dF9rZXlmaWxlXQorICAgICBzc2gta2V5Z2VuIC1wIFstUCBvbGRfcGFzc3BocmFzZV0gWy1OIG5ld19wYXNzcGhyYXNlXSBbLWYga2V5ZmlsZV0KKyAgICAgc3NoLWtleWdlbiAtaSBbLW0ga2V5X2Zvcm1hdF0gWy1mIGlucHV0X2tleWZpbGVdCisgICAgIHNzaC1rZXlnZW4gLWUgWy1tIGtleV9mb3JtYXRdIFstZiBpbnB1dF9rZXlmaWxlXQorICAgICBzc2gta2V5Z2VuIC15IFstZiBpbnB1dF9rZXlmaWxlXQorICAgICBzc2gta2V5Z2VuIC1jIFstUCBwYXNzcGhyYXNlXSBbLUMgY29tbWVudF0gWy1mIGtleWZpbGVdCisgICAgIHNzaC1rZXlnZW4gLWwgWy1mIGlucHV0X2tleWZpbGVdCisgICAgIHNzaC1rZXlnZW4gLUIgWy1mIGlucHV0X2tleWZpbGVdCisgICAgIHNzaC1rZXlnZW4gLUQgcGtjczExCisgICAgIHNzaC1rZXlnZW4gLUYgaG9zdG5hbWUgWy1mIGtub3duX2hvc3RzX2ZpbGVdIFstbF0KKyAgICAgc3NoLWtleWdlbiAtSCBbLWYga25vd25faG9zdHNfZmlsZV0KKyAgICAgc3NoLWtleWdlbiAtUiBob3N0bmFtZSBbLWYga25vd25faG9zdHNfZmlsZV0KKyAgICAgc3NoLWtleWdlbiAtciBob3N0bmFtZSBbLWYgaW5wdXRfa2V5ZmlsZV0gWy1nXQorICAgICBzc2gta2V5Z2VuIC1HIG91dHB1dF9maWxlIFstdl0gWy1iIGJpdHNdIFstTSBtZW1vcnldIFstUyBzdGFydF9wb2ludF0KKyAgICAgc3NoLWtleWdlbiAtVCBvdXRwdXRfZmlsZSAtZiBpbnB1dF9maWxlIFstdl0gWy1hIG51bV90cmlhbHNdIFstSyBjaGVja3B0XQorICAgICAgICAgICAgICAgIFstVyBnZW5lcmF0b3JdCisgICAgIHNzaC1rZXlnZW4gLXMgY2Ffa2V5IC1JIGNlcnRpZmljYXRlX2lkZW50aXR5IFstaF0gWy1uIHByaW5jaXBhbHNdCisgICAgICAgICAgICAgICAgWy1PIG9wdGlvbl0gWy1WIHZhbGlkaXR5X2ludGVydmFsXSBbLXogc2VyaWFsX251bWJlcl0gZmlsZSAuLi4KKyAgICAgc3NoLWtleWdlbiAtTCBbLWYgaW5wdXRfa2V5ZmlsZV0KKyAgICAgc3NoLWtleWdlbiAtQQorCitERVNDUklQVElPTgorICAgICBzc2gta2V5Z2VuIGdlbmVyYXRlcywgbWFuYWdlcyBhbmQgY29udmVydHMgYXV0aGVudGljYXRpb24ga2V5cyBmb3IKKyAgICAgc3NoKDEpLiAgc3NoLWtleWdlbiBjYW4gY3JlYXRlIFJTQSBrZXlzIGZvciB1c2UgYnkgU1NIIHByb3RvY29sIHZlcnNpb24gMQorICAgICBhbmQgRFNBLCBFQ0RTQSBvciBSU0Ega2V5cyBmb3IgdXNlIGJ5IFNTSCBwcm90b2NvbCB2ZXJzaW9uIDIuICBUaGUgdHlwZQorICAgICBvZiBrZXkgdG8gYmUgZ2VuZXJhdGVkIGlzIHNwZWNpZmllZCB3aXRoIHRoZSAtdCBvcHRpb24uICBJZiBpbnZva2VkCisgICAgIHdpdGhvdXQgYW55IGFyZ3VtZW50cywgc3NoLWtleWdlbiB3aWxsIGdlbmVyYXRlIGFuIFJTQSBrZXkgZm9yIHVzZSBpbiBTU0gKKyAgICAgcHJvdG9jb2wgMiBjb25uZWN0aW9ucy4KKworICAgICBzc2gta2V5Z2VuIGlzIGFsc28gdXNlZCB0byBnZW5lcmF0ZSBncm91cHMgZm9yIHVzZSBpbiBEaWZmaWUtSGVsbG1hbgorICAgICBncm91cCBleGNoYW5nZSAoREgtR0VYKS4gIFNlZSB0aGUgTU9EVUxJIEdFTkVSQVRJT04gc2VjdGlvbiBmb3IgZGV0YWlscy4KKworICAgICBOb3JtYWxseSBlYWNoIHVzZXIgd2lzaGluZyB0byB1c2UgU1NIIHdpdGggcHVibGljIGtleSBhdXRoZW50aWNhdGlvbiBydW5zCisgICAgIHRoaXMgb25jZSB0byBjcmVhdGUgdGhlIGF1dGhlbnRpY2F0aW9uIGtleSBpbiB+Ly5zc2gvaWRlbnRpdHksCisgICAgIH4vLnNzaC9pZF9lY2RzYSwgfi8uc3NoL2lkX2RzYSBvciB+Ly5zc2gvaWRfcnNhLiAgQWRkaXRpb25hbGx5LCB0aGUKKyAgICAgc3lzdGVtIGFkbWluaXN0cmF0b3IgbWF5IHVzZSB0aGlzIHRvIGdlbmVyYXRlIGhvc3Qga2V5cywgYXMgc2VlbiBpbgorICAgICAvZXRjL3JjLgorCisgICAgIE5vcm1hbGx5IHRoaXMgcHJvZ3JhbSBnZW5lcmF0ZXMgdGhlIGtleSBhbmQgYXNrcyBmb3IgYSBmaWxlIGluIHdoaWNoIHRvCisgICAgIHN0b3JlIHRoZSBwcml2YXRlIGtleS4gIFRoZSBwdWJsaWMga2V5IGlzIHN0b3JlZCBpbiBhIGZpbGUgd2l0aCB0aGUgc2FtZQorICAgICBuYW1lIGJ1dCBgYC5wdWInJyBhcHBlbmRlZC4gIFRoZSBwcm9ncmFtIGFsc28gYXNrcyBmb3IgYSBwYXNzcGhyYXNlLiAgVGhlCisgICAgIHBhc3NwaHJhc2UgbWF5IGJlIGVtcHR5IHRvIGluZGljYXRlIG5vIHBhc3NwaHJhc2UgKGhvc3Qga2V5cyBtdXN0IGhhdmUgYW4KKyAgICAgZW1wdHkgcGFzc3BocmFzZSksIG9yIGl0IG1heSBiZSBhIHN0cmluZyBvZiBhcmJpdHJhcnkgbGVuZ3RoLiAgQQorICAgICBwYXNzcGhyYXNlIGlzIHNpbWlsYXIgdG8gYSBwYXNzd29yZCwgZXhjZXB0IGl0IGNhbiBiZSBhIHBocmFzZSB3aXRoIGEKKyAgICAgc2VyaWVzIG9mIHdvcmRzLCBwdW5jdHVhdGlvbiwgbnVtYmVycywgd2hpdGVzcGFjZSwgb3IgYW55IHN0cmluZyBvZgorICAgICBjaGFyYWN0ZXJzIHlvdSB3YW50LiAgR29vZCBwYXNzcGhyYXNlcyBhcmUgMTAtMzAgY2hhcmFjdGVycyBsb25nLCBhcmUgbm90CisgICAgIHNpbXBsZSBzZW50ZW5jZXMgb3Igb3RoZXJ3aXNlIGVhc2lseSBndWVzc2FibGUgKEVuZ2xpc2ggcHJvc2UgaGFzIG9ubHkKKyAgICAgMS0yIGJpdHMgb2YgZW50cm9weSBwZXIgY2hhcmFjdGVyLCBhbmQgcHJvdmlkZXMgdmVyeSBiYWQgcGFzc3BocmFzZXMpLAorICAgICBhbmQgY29udGFpbiBhIG1peCBvZiB1cHBlciBhbmQgbG93ZXJjYXNlIGxldHRlcnMsIG51bWJlcnMsIGFuZCBub24tCisgICAgIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiAgVGhlIHBhc3NwaHJhc2UgY2FuIGJlIGNoYW5nZWQgbGF0ZXIgYnkgdXNpbmcKKyAgICAgdGhlIC1wIG9wdGlvbi4KKworICAgICBUaGVyZSBpcyBubyB3YXkgdG8gcmVjb3ZlciBhIGxvc3QgcGFzc3BocmFzZS4gIElmIHRoZSBwYXNzcGhyYXNlIGlzIGxvc3QKKyAgICAgb3IgZm9yZ290dGVuLCBhIG5ldyBrZXkgbXVzdCBiZSBnZW5lcmF0ZWQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHB1YmxpYworICAgICBrZXkgY29waWVkIHRvIG90aGVyIG1hY2hpbmVzLgorCisgICAgIEZvciBSU0ExIGtleXMsIHRoZXJlIGlzIGFsc28gYSBjb21tZW50IGZpZWxkIGluIHRoZSBrZXkgZmlsZSB0aGF0IGlzIG9ubHkKKyAgICAgZm9yIGNvbnZlbmllbmNlIHRvIHRoZSB1c2VyIHRvIGhlbHAgaWRlbnRpZnkgdGhlIGtleS4gIFRoZSBjb21tZW50IGNhbgorICAgICB0ZWxsIHdoYXQgdGhlIGtleSBpcyBmb3IsIG9yIHdoYXRldmVyIGlzIHVzZWZ1bC4gIFRoZSBjb21tZW50IGlzCisgICAgIGluaXRpYWxpemVkIHRvIGBgdXNlckBob3N0Jycgd2hlbiB0aGUga2V5IGlzIGNyZWF0ZWQsIGJ1dCBjYW4gYmUgY2hhbmdlZAorICAgICB1c2luZyB0aGUgLWMgb3B0aW9uLgorCisgICAgIEFmdGVyIGEga2V5IGlzIGdlbmVyYXRlZCwgaW5zdHJ1Y3Rpb25zIGJlbG93IGRldGFpbCB3aGVyZSB0aGUga2V5cyBzaG91bGQKKyAgICAgYmUgcGxhY2VkIHRvIGJlIGFjdGl2YXRlZC4KKworICAgICBUaGUgb3B0aW9ucyBhcmUgYXMgZm9sbG93czoKKworICAgICAtQSAgICAgIEZvciBlYWNoIG9mIHRoZSBrZXkgdHlwZXMgKHJzYTEsIHJzYSwgZHNhIGFuZCBlY2RzYSkgZm9yIHdoaWNoCisgICAgICAgICAgICAgaG9zdCBrZXlzIGRvIG5vdCBleGlzdCwgZ2VuZXJhdGUgdGhlIGhvc3Qga2V5cyB3aXRoIHRoZSBkZWZhdWx0CisgICAgICAgICAgICAga2V5IGZpbGUgcGF0aCwgYW4gZW1wdHkgcGFzc3BocmFzZSwgZGVmYXVsdCBiaXRzIGZvciB0aGUga2V5CisgICAgICAgICAgICAgdHlwZSwgYW5kIGRlZmF1bHQgY29tbWVudC4gIFRoaXMgaXMgdXNlZCBieSAvZXRjL3JjIHRvIGdlbmVyYXRlCisgICAgICAgICAgICAgbmV3IGhvc3Qga2V5cy4KKworICAgICAtYSB0cmlhbHMKKyAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBwcmltYWxpdHkgdGVzdHMgdG8gcGVyZm9ybSB3aGVuIHNjcmVlbmluZworICAgICAgICAgICAgIERILUdFWCBjYW5kaWRhdGVzIHVzaW5nIHRoZSAtVCBjb21tYW5kLgorCisgICAgIC1CICAgICAgU2hvdyB0aGUgYnViYmxlYmFiYmxlIGRpZ2VzdCBvZiBzcGVjaWZpZWQgcHJpdmF0ZSBvciBwdWJsaWMga2V5CisgICAgICAgICAgICAgZmlsZS4KKworICAgICAtYiBiaXRzCisgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUga2V5IHRvIGNyZWF0ZS4gIEZvciBSU0Ega2V5cywKKyAgICAgICAgICAgICB0aGUgbWluaW11bSBzaXplIGlzIDc2OCBiaXRzIGFuZCB0aGUgZGVmYXVsdCBpcyAyMDQ4IGJpdHMuCisgICAgICAgICAgICAgR2VuZXJhbGx5LCAyMDQ4IGJpdHMgaXMgY29uc2lkZXJlZCBzdWZmaWNpZW50LiAgRFNBIGtleXMgbXVzdCBiZQorICAgICAgICAgICAgIGV4YWN0bHkgMTAyNCBiaXRzIGFzIHNwZWNpZmllZCBieSBGSVBTIDE4Ni0yLiAgRm9yIEVDRFNBIGtleXMsCisgICAgICAgICAgICAgdGhlIC1iIGZsYWcgZGV0ZXJtaW5lcyB0aGUga2V5IGxlbmd0aCBieSBzZWxlY3RpbmcgZnJvbSBvbmUgb2YKKyAgICAgICAgICAgICB0aHJlZSBlbGxpcHRpYyBjdXJ2ZSBzaXplczogMjU2LCAzODQgb3IgNTIxIGJpdHMuICBBdHRlbXB0aW5nIHRvCisgICAgICAgICAgICAgdXNlIGJpdCBsZW5ndGhzIG90aGVyIHRoYW4gdGhlc2UgdGhyZWUgdmFsdWVzIGZvciBFQ0RTQSBrZXlzIHdpbGwKKyAgICAgICAgICAgICBmYWlsLgorCisgICAgIC1DIGNvbW1lbnQKKyAgICAgICAgICAgICBQcm92aWRlcyBhIG5ldyBjb21tZW50LgorCisgICAgIC1jICAgICAgUmVxdWVzdHMgY2hhbmdpbmcgdGhlIGNvbW1lbnQgaW4gdGhlIHByaXZhdGUgYW5kIHB1YmxpYyBrZXkKKyAgICAgICAgICAgICBmaWxlcy4gIFRoaXMgb3BlcmF0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBSU0ExIGtleXMuICBUaGUKKyAgICAgICAgICAgICBwcm9ncmFtIHdpbGwgcHJvbXB0IGZvciB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBwcml2YXRlIGtleXMsIGZvcgorICAgICAgICAgICAgIHRoZSBwYXNzcGhyYXNlIGlmIHRoZSBrZXkgaGFzIG9uZSwgYW5kIGZvciB0aGUgbmV3IGNvbW1lbnQuCisKKyAgICAgLUQgcGtjczExCisgICAgICAgICAgICAgRG93bmxvYWQgdGhlIFJTQSBwdWJsaWMga2V5cyBwcm92aWRlZCBieSB0aGUgUEtDUyMxMSBzaGFyZWQKKyAgICAgICAgICAgICBsaWJyYXJ5IHBrY3MxMS4gIFdoZW4gdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIC1zLCB0aGlzIG9wdGlvbgorICAgICAgICAgICAgIGluZGljYXRlcyB0aGF0IGEgQ0Ega2V5IHJlc2lkZXMgaW4gYSBQS0NTIzExIHRva2VuIChzZWUgdGhlCisgICAgICAgICAgICAgQ0VSVElGSUNBVEVTIHNlY3Rpb24gZm9yIGRldGFpbHMpLgorCisgICAgIC1lICAgICAgVGhpcyBvcHRpb24gd2lsbCByZWFkIGEgcHJpdmF0ZSBvciBwdWJsaWMgT3BlblNTSCBrZXkgZmlsZSBhbmQKKyAgICAgICAgICAgICBwcmludCB0byBzdGRvdXQgdGhlIGtleSBpbiBvbmUgb2YgdGhlIGZvcm1hdHMgc3BlY2lmaWVkIGJ5IHRoZSAtbQorICAgICAgICAgICAgIG9wdGlvbi4gIFRoZSBkZWZhdWx0IGV4cG9ydCBmb3JtYXQgaXMgYGBSRkM0NzE2JycuICBUaGlzIG9wdGlvbgorICAgICAgICAgICAgIGFsbG93cyBleHBvcnRpbmcgT3BlblNTSCBrZXlzIGZvciB1c2UgYnkgb3RoZXIgcHJvZ3JhbXMsCisgICAgICAgICAgICAgaW5jbHVkaW5nIHNldmVyYWwgY29tbWVyY2lhbCBTU0ggaW1wbGVtZW50YXRpb25zLgorCisgICAgIC1GIGhvc3RuYW1lCisgICAgICAgICAgICAgU2VhcmNoIGZvciB0aGUgc3BlY2lmaWVkIGhvc3RuYW1lIGluIGEga25vd25faG9zdHMgZmlsZSwgbGlzdGluZworICAgICAgICAgICAgIGFueSBvY2N1cnJlbmNlcyBmb3VuZC4gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB0byBmaW5kIGhhc2hlZCBob3N0CisgICAgICAgICAgICAgbmFtZXMgb3IgYWRkcmVzc2VzIGFuZCBtYXkgYWxzbyBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCisgICAgICAgICAgICAgLUggb3B0aW9uIHRvIHByaW50IGZvdW5kIGtleXMgaW4gYSBoYXNoZWQgZm9ybWF0LgorCisgICAgIC1mIGZpbGVuYW1lCisgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBmaWxlbmFtZSBvZiB0aGUga2V5IGZpbGUuCisKKyAgICAgLUcgb3V0cHV0X2ZpbGUKKyAgICAgICAgICAgICBHZW5lcmF0ZSBjYW5kaWRhdGUgcHJpbWVzIGZvciBESC1HRVguICBUaGVzZSBwcmltZXMgbXVzdCBiZQorICAgICAgICAgICAgIHNjcmVlbmVkIGZvciBzYWZldHkgKHVzaW5nIHRoZSAtVCBvcHRpb24pIGJlZm9yZSB1c2UuCisKKyAgICAgLWcgICAgICBVc2UgZ2VuZXJpYyBETlMgZm9ybWF0IHdoZW4gcHJpbnRpbmcgZmluZ2VycHJpbnQgcmVzb3VyY2UgcmVjb3JkcworICAgICAgICAgICAgIHVzaW5nIHRoZSAtciBjb21tYW5kLgorCisgICAgIC1IICAgICAgSGFzaCBhIGtub3duX2hvc3RzIGZpbGUuICBUaGlzIHJlcGxhY2VzIGFsbCBob3N0bmFtZXMgYW5kCisgICAgICAgICAgICAgYWRkcmVzc2VzIHdpdGggaGFzaGVkIHJlcHJlc2VudGF0aW9ucyB3aXRoaW4gdGhlIHNwZWNpZmllZCBmaWxlOworICAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBjb250ZW50IGlzIG1vdmVkIHRvIGEgZmlsZSB3aXRoIGEgLm9sZCBzdWZmaXguCisgICAgICAgICAgICAgVGhlc2UgaGFzaGVzIG1heSBiZSB1c2VkIG5vcm1hbGx5IGJ5IHNzaCBhbmQgc3NoZCwgYnV0IHRoZXkgZG8KKyAgICAgICAgICAgICBub3QgcmV2ZWFsIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uIHNob3VsZCB0aGUgZmlsZSdzIGNvbnRlbnRzIGJlCisgICAgICAgICAgICAgZGlzY2xvc2VkLiAgVGhpcyBvcHRpb24gd2lsbCBub3QgbW9kaWZ5IGV4aXN0aW5nIGhhc2hlZCBob3N0bmFtZXMKKyAgICAgICAgICAgICBhbmQgaXMgdGhlcmVmb3JlIHNhZmUgdG8gdXNlIG9uIGZpbGVzIHRoYXQgbWl4IGhhc2hlZCBhbmQgbm9uLQorICAgICAgICAgICAgIGhhc2hlZCBuYW1lcy4KKworICAgICAtaCAgICAgIFdoZW4gc2lnbmluZyBhIGtleSwgY3JlYXRlIGEgaG9zdCBjZXJ0aWZpY2F0ZSBpbnN0ZWFkIG9mIGEgdXNlcgorICAgICAgICAgICAgIGNlcnRpZmljYXRlLiAgUGxlYXNlIHNlZSB0aGUgQ0VSVElGSUNBVEVTIHNlY3Rpb24gZm9yIGRldGFpbHMuCisKKyAgICAgLUkgY2VydGlmaWNhdGVfaWRlbnRpdHkKKyAgICAgICAgICAgICBTcGVjaWZ5IHRoZSBrZXkgaWRlbnRpdHkgd2hlbiBzaWduaW5nIGEgcHVibGljIGtleS4gIFBsZWFzZSBzZWUKKyAgICAgICAgICAgICB0aGUgQ0VSVElGSUNBVEVTIHNlY3Rpb24gZm9yIGRldGFpbHMuCisKKyAgICAgLWkgICAgICBUaGlzIG9wdGlvbiB3aWxsIHJlYWQgYW4gdW5lbmNyeXB0ZWQgcHJpdmF0ZSAob3IgcHVibGljKSBrZXkgZmlsZQorICAgICAgICAgICAgIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGJ5IHRoZSAtbSBvcHRpb24gYW5kIHByaW50IGFuIE9wZW5TU0gKKyAgICAgICAgICAgICBjb21wYXRpYmxlIHByaXZhdGUgKG9yIHB1YmxpYykga2V5IHRvIHN0ZG91dC4KKworICAgICAtSyBjaGVja3B0CisgICAgICAgICAgICAgV3JpdGUgdGhlIGxhc3QgbGluZSBwcm9jZXNzZWQgdG8gdGhlIGZpbGUgY2hlY2twdCB3aGlsZQorICAgICAgICAgICAgIHBlcmZvcm1pbmcgREggY2FuZGlkYXRlIHNjcmVlbmluZyB1c2luZyB0aGUgLVQgb3B0aW9uLiAgVGhpcyB3aWxsCisgICAgICAgICAgICAgYmUgdXNlZCB0byBza2lwIGxpbmVzIGluIHRoZSBpbnB1dCBmaWxlIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4KKyAgICAgICAgICAgICBwcm9jZXNzZWQgaWYgdGhlIGpvYiBpcyByZXN0YXJ0ZWQuICBUaGlzIG9wdGlvbiBhbGxvd3MgaW1wb3J0aW5nCisgICAgICAgICAgICAga2V5cyBmcm9tIG90aGVyIHNvZnR3YXJlLCBpbmNsdWRpbmcgc2V2ZXJhbCBjb21tZXJjaWFsIFNTSAorICAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucy4gIFRoZSBkZWZhdWx0IGltcG9ydCBmb3JtYXQgaXMgYGBSRkM0NzE2JycuCisKKyAgICAgLUwgICAgICBQcmludHMgdGhlIGNvbnRlbnRzIG9mIGEgY2VydGlmaWNhdGUuCisKKyAgICAgLWwgICAgICBTaG93IGZpbmdlcnByaW50IG9mIHNwZWNpZmllZCBwdWJsaWMga2V5IGZpbGUuICBQcml2YXRlIFJTQTEga2V5cworICAgICAgICAgICAgIGFyZSBhbHNvIHN1cHBvcnRlZC4gIEZvciBSU0EgYW5kIERTQSBrZXlzIHNzaC1rZXlnZW4gdHJpZXMgdG8KKyAgICAgICAgICAgICBmaW5kIHRoZSBtYXRjaGluZyBwdWJsaWMga2V5IGZpbGUgYW5kIHByaW50cyBpdHMgZmluZ2VycHJpbnQuICBJZgorICAgICAgICAgICAgIGNvbWJpbmVkIHdpdGggLXYsIGFuIEFTQ0lJIGFydCByZXByZXNlbnRhdGlvbiBvZiB0aGUga2V5IGlzCisgICAgICAgICAgICAgc3VwcGxpZWQgd2l0aCB0aGUgZmluZ2VycHJpbnQuCisKKyAgICAgLU0gbWVtb3J5CisgICAgICAgICAgICAgU3BlY2lmeSB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byB1c2UgKGluIG1lZ2FieXRlcykgd2hlbgorICAgICAgICAgICAgIGdlbmVyYXRpbmcgY2FuZGlkYXRlIG1vZHVsaSBmb3IgREgtR0VYLgorCisgICAgIC1tIGtleV9mb3JtYXQKKyAgICAgICAgICAgICBTcGVjaWZ5IGEga2V5IGZvcm1hdCBmb3IgdGhlIC1pIChpbXBvcnQpIG9yIC1lIChleHBvcnQpCisgICAgICAgICAgICAgY29udmVyc2lvbiBvcHRpb25zLiAgVGhlIHN1cHBvcnRlZCBrZXkgZm9ybWF0cyBhcmU6IGBgUkZDNDcxNicnCisgICAgICAgICAgICAgKFJGQyA0NzE2L1NTSDIgcHVibGljIG9yIHByaXZhdGUga2V5KSwgYGBQS0NTOCcnIChQRU0gUEtDUzgKKyAgICAgICAgICAgICBwdWJsaWMga2V5KSBvciBgYFBFTScnIChQRU0gcHVibGljIGtleSkuICBUaGUgZGVmYXVsdCBjb252ZXJzaW9uCisgICAgICAgICAgICAgZm9ybWF0IGlzIGBgUkZDNDcxNicnLgorCisgICAgIC1OIG5ld19wYXNzcGhyYXNlCisgICAgICAgICAgICAgUHJvdmlkZXMgdGhlIG5ldyBwYXNzcGhyYXNlLgorCisgICAgIC1uIHByaW5jaXBhbHMKKyAgICAgICAgICAgICBTcGVjaWZ5IG9uZSBvciBtb3JlIHByaW5jaXBhbHMgKHVzZXIgb3IgaG9zdCBuYW1lcykgdG8gYmUKKyAgICAgICAgICAgICBpbmNsdWRlZCBpbiBhIGNlcnRpZmljYXRlIHdoZW4gc2lnbmluZyBhIGtleS4gIE11bHRpcGxlCisgICAgICAgICAgICAgcHJpbmNpcGFscyBtYXkgYmUgc3BlY2lmaWVkLCBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgUGxlYXNlIHNlZSB0aGUKKyAgICAgICAgICAgICBDRVJUSUZJQ0FURVMgc2VjdGlvbiBmb3IgZGV0YWlscy4KKworICAgICAtTyBvcHRpb24KKyAgICAgICAgICAgICBTcGVjaWZ5IGEgY2VydGlmaWNhdGUgb3B0aW9uIHdoZW4gc2lnbmluZyBhIGtleS4gIFRoaXMgb3B0aW9uIG1heQorICAgICAgICAgICAgIGJlIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcy4gIFBsZWFzZSBzZWUgdGhlIENFUlRJRklDQVRFUyBzZWN0aW9uCisgICAgICAgICAgICAgZm9yIGRldGFpbHMuICBUaGUgb3B0aW9ucyB0aGF0IGFyZSB2YWxpZCBmb3IgdXNlciBjZXJ0aWZpY2F0ZXMKKyAgICAgICAgICAgICBhcmU6CisKKyAgICAgICAgICAgICBjbGVhciAgIENsZWFyIGFsbCBlbmFibGVkIHBlcm1pc3Npb25zLiAgVGhpcyBpcyB1c2VmdWwgZm9yCisgICAgICAgICAgICAgICAgICAgICBjbGVhcmluZyB0aGUgZGVmYXVsdCBzZXQgb2YgcGVybWlzc2lvbnMgc28gcGVybWlzc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgIG1heSBiZSBhZGRlZCBpbmRpdmlkdWFsbHkuCisKKyAgICAgICAgICAgICBmb3JjZS1jb21tYW5kPWNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgIEZvcmNlcyB0aGUgZXhlY3V0aW9uIG9mIGNvbW1hbmQgaW5zdGVhZCBvZiBhbnkgc2hlbGwgb3IKKyAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIHdoZW4gdGhlIGNlcnRpZmljYXRlIGlzCisgICAgICAgICAgICAgICAgICAgICB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi4KKworICAgICAgICAgICAgIG5vLWFnZW50LWZvcndhcmRpbmcKKyAgICAgICAgICAgICAgICAgICAgIERpc2FibGUgc3NoLWFnZW50KDEpIGZvcndhcmRpbmcgKHBlcm1pdHRlZCBieSBkZWZhdWx0KS4KKworICAgICAgICAgICAgIG5vLXBvcnQtZm9yd2FyZGluZworICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZSBwb3J0IGZvcndhcmRpbmcgKHBlcm1pdHRlZCBieSBkZWZhdWx0KS4KKworICAgICAgICAgICAgIG5vLXB0eSAgRGlzYWJsZSBQVFkgYWxsb2NhdGlvbiAocGVybWl0dGVkIGJ5IGRlZmF1bHQpLgorCisgICAgICAgICAgICAgbm8tdXNlci1yYworICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZSBleGVjdXRpb24gb2Ygfi8uc3NoL3JjIGJ5IHNzaGQoOCkgKHBlcm1pdHRlZCBieQorICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCkuCisKKyAgICAgICAgICAgICBuby14MTEtZm9yd2FyZGluZworICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZSBYMTEgZm9yd2FyZGluZyAocGVybWl0dGVkIGJ5IGRlZmF1bHQpLgorCisgICAgICAgICAgICAgcGVybWl0LWFnZW50LWZvcndhcmRpbmcKKyAgICAgICAgICAgICAgICAgICAgIEFsbG93cyBzc2gtYWdlbnQoMSkgZm9yd2FyZGluZy4KKworICAgICAgICAgICAgIHBlcm1pdC1wb3J0LWZvcndhcmRpbmcKKyAgICAgICAgICAgICAgICAgICAgIEFsbG93cyBwb3J0IGZvcndhcmRpbmcuCisKKyAgICAgICAgICAgICBwZXJtaXQtcHR5CisgICAgICAgICAgICAgICAgICAgICBBbGxvd3MgUFRZIGFsbG9jYXRpb24uCisKKyAgICAgICAgICAgICBwZXJtaXQtdXNlci1yYworICAgICAgICAgICAgICAgICAgICAgQWxsb3dzIGV4ZWN1dGlvbiBvZiB+Ly5zc2gvcmMgYnkgc3NoZCg4KS4KKworICAgICAgICAgICAgIHBlcm1pdC14MTEtZm9yd2FyZGluZworICAgICAgICAgICAgICAgICAgICAgQWxsb3dzIFgxMSBmb3J3YXJkaW5nLgorCisgICAgICAgICAgICAgc291cmNlLWFkZHJlc3M9YWRkcmVzc19saXN0CisgICAgICAgICAgICAgICAgICAgICBSZXN0cmljdCB0aGUgc291cmNlIGFkZHJlc3NlcyBmcm9tIHdoaWNoIHRoZSBjZXJ0aWZpY2F0ZQorICAgICAgICAgICAgICAgICAgICAgaXMgY29uc2lkZXJlZCB2YWxpZC4gIFRoZSBhZGRyZXNzX2xpc3QgaXMgYSBjb21tYS0KKyAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRlZCBsaXN0IG9mIG9uZSBvciBtb3JlIGFkZHJlc3MvbmV0bWFzayBwYWlycyBpbgorICAgICAgICAgICAgICAgICAgICAgQ0lEUiBmb3JtYXQuCisKKyAgICAgICAgICAgICBBdCBwcmVzZW50LCBubyBvcHRpb25zIGFyZSB2YWxpZCBmb3IgaG9zdCBrZXlzLgorCisgICAgIC1QIHBhc3NwaHJhc2UKKyAgICAgICAgICAgICBQcm92aWRlcyB0aGUgKG9sZCkgcGFzc3BocmFzZS4KKworICAgICAtcCAgICAgIFJlcXVlc3RzIGNoYW5naW5nIHRoZSBwYXNzcGhyYXNlIG9mIGEgcHJpdmF0ZSBrZXkgZmlsZSBpbnN0ZWFkIG9mCisgICAgICAgICAgICAgY3JlYXRpbmcgYSBuZXcgcHJpdmF0ZSBrZXkuICBUaGUgcHJvZ3JhbSB3aWxsIHByb21wdCBmb3IgdGhlIGZpbGUKKyAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBwcml2YXRlIGtleSwgZm9yIHRoZSBvbGQgcGFzc3BocmFzZSwgYW5kIHR3aWNlIGZvcgorICAgICAgICAgICAgIHRoZSBuZXcgcGFzc3BocmFzZS4KKworICAgICAtcSAgICAgIFNpbGVuY2Ugc3NoLWtleWdlbi4KKworICAgICAtUiBob3N0bmFtZQorICAgICAgICAgICAgIFJlbW92ZXMgYWxsIGtleXMgYmVsb25naW5nIHRvIGhvc3RuYW1lIGZyb20gYSBrbm93bl9ob3N0cyBmaWxlLgorICAgICAgICAgICAgIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB0byBkZWxldGUgaGFzaGVkIGhvc3RzIChzZWUgdGhlIC1IIG9wdGlvbgorICAgICAgICAgICAgIGFib3ZlKS4KKworICAgICAtciBob3N0bmFtZQorICAgICAgICAgICAgIFByaW50IHRoZSBTU0hGUCBmaW5nZXJwcmludCByZXNvdXJjZSByZWNvcmQgbmFtZWQgaG9zdG5hbWUgZm9yCisgICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBwdWJsaWMga2V5IGZpbGUuCisKKyAgICAgLVMgc3RhcnQKKyAgICAgICAgICAgICBTcGVjaWZ5IHN0YXJ0IHBvaW50IChpbiBoZXgpIHdoZW4gZ2VuZXJhdGluZyBjYW5kaWRhdGUgbW9kdWxpIGZvcgorICAgICAgICAgICAgIERILUdFWC4KKworICAgICAtcyBjYV9rZXkKKyAgICAgICAgICAgICBDZXJ0aWZ5IChzaWduKSBhIHB1YmxpYyBrZXkgdXNpbmcgdGhlIHNwZWNpZmllZCBDQSBrZXkuICBQbGVhc2UKKyAgICAgICAgICAgICBzZWUgdGhlIENFUlRJRklDQVRFUyBzZWN0aW9uIGZvciBkZXRhaWxzLgorCisgICAgIC1UIG91dHB1dF9maWxlCisgICAgICAgICAgICAgVGVzdCBESCBncm91cCBleGNoYW5nZSBjYW5kaWRhdGUgcHJpbWVzIChnZW5lcmF0ZWQgdXNpbmcgdGhlIC1HCisgICAgICAgICAgICAgb3B0aW9uKSBmb3Igc2FmZXR5LgorCisgICAgIC10IHR5cGUKKyAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHR5cGUgb2Yga2V5IHRvIGNyZWF0ZS4gIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlCisgICAgICAgICAgICAgYGByc2ExJycgZm9yIHByb3RvY29sIHZlcnNpb24gMSBhbmQgYGBkc2EnJywgYGBlY2RzYScnIG9yIGBgcnNhJycKKyAgICAgICAgICAgICBmb3IgcHJvdG9jb2wgdmVyc2lvbiAyLgorCisgICAgIC1WIHZhbGlkaXR5X2ludGVydmFsCisgICAgICAgICAgICAgU3BlY2lmeSBhIHZhbGlkaXR5IGludGVydmFsIHdoZW4gc2lnbmluZyBhIGNlcnRpZmljYXRlLiAgQQorICAgICAgICAgICAgIHZhbGlkaXR5IGludGVydmFsIG1heSBjb25zaXN0IG9mIGEgc2luZ2xlIHRpbWUsIGluZGljYXRpbmcgdGhhdAorICAgICAgICAgICAgIHRoZSBjZXJ0aWZpY2F0ZSBpcyB2YWxpZCBiZWdpbm5pbmcgbm93IGFuZCBleHBpcmluZyBhdCB0aGF0IHRpbWUsCisgICAgICAgICAgICAgb3IgbWF5IGNvbnNpc3Qgb2YgdHdvIHRpbWVzIHNlcGFyYXRlZCBieSBhIGNvbG9uIHRvIGluZGljYXRlIGFuCisgICAgICAgICAgICAgZXhwbGljaXQgdGltZSBpbnRlcnZhbC4gIFRoZSBzdGFydCB0aW1lIG1heSBiZSBzcGVjaWZpZWQgYXMgYQorICAgICAgICAgICAgIGRhdGUgaW4gWVlZWU1NREQgZm9ybWF0LCBhIHRpbWUgaW4gWVlZWU1NRERISE1NU1MgZm9ybWF0IG9yIGEKKyAgICAgICAgICAgICByZWxhdGl2ZSB0aW1lICh0byB0aGUgY3VycmVudCB0aW1lKSBjb25zaXN0aW5nIG9mIGEgbWludXMgc2lnbgorICAgICAgICAgICAgIGZvbGxvd2VkIGJ5IGEgcmVsYXRpdmUgdGltZSBpbiB0aGUgZm9ybWF0IGRlc2NyaWJlZCBpbiB0aGUgVElNRQorICAgICAgICAgICAgIEZPUk1BVFMgc2VjdGlvbiBvZiBzc2hkX2NvbmZpZyg1KS4gIFRoZSBlbmQgdGltZSBtYXkgYmUgc3BlY2lmaWVkCisgICAgICAgICAgICAgYXMgYSBZWVlZTU1ERCBkYXRlLCBhIFlZWVlNTURESEhNTVNTIHRpbWUgb3IgYSByZWxhdGl2ZSB0aW1lCisgICAgICAgICAgICAgc3RhcnRpbmcgd2l0aCBhIHBsdXMgY2hhcmFjdGVyLgorCisgICAgICAgICAgICAgRm9yIGV4YW1wbGU6IGBgKzUydzFkJycgKHZhbGlkIGZyb20gbm93IHRvIDUyIHdlZWtzIGFuZCBvbmUgZGF5CisgICAgICAgICAgICAgZnJvbSBub3cpLCBgYC00dzorNHcnJyAodmFsaWQgZnJvbSBmb3VyIHdlZWtzIGFnbyB0byBmb3VyIHdlZWtzCisgICAgICAgICAgICAgZnJvbSBub3cpLCBgYDIwMTAwMTAxMTIzMDAwOjIwMTEwMTAxMTIzMDAwJycgKHZhbGlkIGZyb20gMTI6MzAKKyAgICAgICAgICAgICBQTSwgSmFudWFyeSAxc3QsIDIwMTAgdG8gMTI6MzAgUE0sIEphbnVhcnkgMXN0LCAyMDExKSwKKyAgICAgICAgICAgICBgYC0xZDoyMDExMDEwMScnICh2YWxpZCBmcm9tIHllc3RlcmRheSB0byBtaWRuaWdodCwgSmFudWFyeSAxc3QsCisgICAgICAgICAgICAgMjAxMSkuCisKKyAgICAgLXYgICAgICBWZXJib3NlIG1vZGUuICBDYXVzZXMgc3NoLWtleWdlbiB0byBwcmludCBkZWJ1Z2dpbmcgbWVzc2FnZXMKKyAgICAgICAgICAgICBhYm91dCBpdHMgcHJvZ3Jlc3MuICBUaGlzIGlzIGhlbHBmdWwgZm9yIGRlYnVnZ2luZyBtb2R1bGkKKyAgICAgICAgICAgICBnZW5lcmF0aW9uLiAgTXVsdGlwbGUgLXYgb3B0aW9ucyBpbmNyZWFzZSB0aGUgdmVyYm9zaXR5LiAgVGhlCisgICAgICAgICAgICAgbWF4aW11bSBpcyAzLgorCisgICAgIC1XIGdlbmVyYXRvcgorICAgICAgICAgICAgIFNwZWNpZnkgZGVzaXJlZCBnZW5lcmF0b3Igd2hlbiB0ZXN0aW5nIGNhbmRpZGF0ZSBtb2R1bGkgZm9yIERILQorICAgICAgICAgICAgIEdFWC4KKworICAgICAteSAgICAgIFRoaXMgb3B0aW9uIHdpbGwgcmVhZCBhIHByaXZhdGUgT3BlblNTSCBmb3JtYXQgZmlsZSBhbmQgcHJpbnQgYW4KKyAgICAgICAgICAgICBPcGVuU1NIIHB1YmxpYyBrZXkgdG8gc3Rkb3V0LgorCisgICAgIC16IHNlcmlhbF9udW1iZXIKKyAgICAgICAgICAgICBTcGVjaWZpZXMgYSBzZXJpYWwgbnVtYmVyIHRvIGJlIGVtYmVkZGVkIGluIHRoZSBjZXJ0aWZpY2F0ZSB0bworICAgICAgICAgICAgIGRpc3Rpbmd1aXNoIHRoaXMgY2VydGlmaWNhdGUgZnJvbSBvdGhlcnMgZnJvbSB0aGUgc2FtZSBDQS4gIFRoZQorICAgICAgICAgICAgIGRlZmF1bHQgc2VyaWFsIG51bWJlciBpcyB6ZXJvLgorCitNT0RVTEkgR0VORVJBVElPTgorICAgICBzc2gta2V5Z2VuIG1heSBiZSB1c2VkIHRvIGdlbmVyYXRlIGdyb3VwcyBmb3IgdGhlIERpZmZpZS1IZWxsbWFuIEdyb3VwCisgICAgIEV4Y2hhbmdlIChESC1HRVgpIHByb3RvY29sLiAgR2VuZXJhdGluZyB0aGVzZSBncm91cHMgaXMgYSB0d28tc3RlcAorICAgICBwcm9jZXNzOiBmaXJzdCwgY2FuZGlkYXRlIHByaW1lcyBhcmUgZ2VuZXJhdGVkIHVzaW5nIGEgZmFzdCwgYnV0IG1lbW9yeQorICAgICBpbnRlbnNpdmUgcHJvY2Vzcy4gIFRoZXNlIGNhbmRpZGF0ZSBwcmltZXMgYXJlIHRoZW4gdGVzdGVkIGZvcgorICAgICBzdWl0YWJpbGl0eSAoYSBDUFUtaW50ZW5zaXZlIHByb2Nlc3MpLgorCisgICAgIEdlbmVyYXRpb24gb2YgcHJpbWVzIGlzIHBlcmZvcm1lZCB1c2luZyB0aGUgLUcgb3B0aW9uLiAgVGhlIGRlc2lyZWQKKyAgICAgbGVuZ3RoIG9mIHRoZSBwcmltZXMgbWF5IGJlIHNwZWNpZmllZCBieSB0aGUgLWIgb3B0aW9uLiAgRm9yIGV4YW1wbGU6CisKKyAgICAgICAgICAgIyBzc2gta2V5Z2VuIC1HIG1vZHVsaS0yMDQ4LmNhbmRpZGF0ZXMgLWIgMjA0OAorCisgICAgIEJ5IGRlZmF1bHQsIHRoZSBzZWFyY2ggZm9yIHByaW1lcyBiZWdpbnMgYXQgYSByYW5kb20gcG9pbnQgaW4gdGhlIGRlc2lyZWQKKyAgICAgbGVuZ3RoIHJhbmdlLiAgVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB1c2luZyB0aGUgLVMgb3B0aW9uLCB3aGljaAorICAgICBzcGVjaWZpZXMgYSBkaWZmZXJlbnQgc3RhcnQgcG9pbnQgKGluIGhleCkuCisKKyAgICAgT25jZSBhIHNldCBvZiBjYW5kaWRhdGVzIGhhdmUgYmVlbiBnZW5lcmF0ZWQsIHRoZXkgbXVzdCBiZSB0ZXN0ZWQgZm9yCisgICAgIHN1aXRhYmlsaXR5LiAgVGhpcyBtYXkgYmUgcGVyZm9ybWVkIHVzaW5nIHRoZSAtVCBvcHRpb24uICBJbiB0aGlzIG1vZGUKKyAgICAgc3NoLWtleWdlbiB3aWxsIHJlYWQgY2FuZGlkYXRlcyBmcm9tIHN0YW5kYXJkIGlucHV0IChvciBhIGZpbGUgc3BlY2lmaWVkCisgICAgIHVzaW5nIHRoZSAtZiBvcHRpb24pLiAgRm9yIGV4YW1wbGU6CisKKyAgICAgICAgICAgIyBzc2gta2V5Z2VuIC1UIG1vZHVsaS0yMDQ4IC1mIG1vZHVsaS0yMDQ4LmNhbmRpZGF0ZXMKKworICAgICBCeSBkZWZhdWx0LCBlYWNoIGNhbmRpZGF0ZSB3aWxsIGJlIHN1YmplY3RlZCB0byAxMDAgcHJpbWFsaXR5IHRlc3RzLgorICAgICBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHVzaW5nIHRoZSAtYSBvcHRpb24uICBUaGUgREggZ2VuZXJhdG9yIHZhbHVlIHdpbGwKKyAgICAgYmUgY2hvc2VuIGF1dG9tYXRpY2FsbHkgZm9yIHRoZSBwcmltZSB1bmRlciBjb25zaWRlcmF0aW9uLiAgSWYgYSBzcGVjaWZpYworICAgICBnZW5lcmF0b3IgaXMgZGVzaXJlZCwgaXQgbWF5IGJlIHJlcXVlc3RlZCB1c2luZyB0aGUgLVcgb3B0aW9uLiAgVmFsaWQKKyAgICAgZ2VuZXJhdG9yIHZhbHVlcyBhcmUgMiwgMywgYW5kIDUuCisKKyAgICAgU2NyZWVuZWQgREggZ3JvdXBzIG1heSBiZSBpbnN0YWxsZWQgaW4gL2V0Yy9tb2R1bGkuICBJdCBpcyBpbXBvcnRhbnQgdGhhdAorICAgICB0aGlzIGZpbGUgY29udGFpbnMgbW9kdWxpIG9mIGEgcmFuZ2Ugb2YgYml0IGxlbmd0aHMgYW5kIHRoYXQgYm90aCBlbmRzIG9mCisgICAgIGEgY29ubmVjdGlvbiBzaGFyZSBjb21tb24gbW9kdWxpLgorCitDRVJUSUZJQ0FURVMKKyAgICAgc3NoLWtleWdlbiBzdXBwb3J0cyBzaWduaW5nIG9mIGtleXMgdG8gcHJvZHVjZSBjZXJ0aWZpY2F0ZXMgdGhhdCBtYXkgYmUKKyAgICAgdXNlZCBmb3IgdXNlciBvciBob3N0IGF1dGhlbnRpY2F0aW9uLiAgQ2VydGlmaWNhdGVzIGNvbnNpc3Qgb2YgYSBwdWJsaWMKKyAgICAga2V5LCBzb21lIGlkZW50aXR5IGluZm9ybWF0aW9uLCB6ZXJvIG9yIG1vcmUgcHJpbmNpcGFsICh1c2VyIG9yIGhvc3QpCisgICAgIG5hbWVzIGFuZCBhIHNldCBvZiBvcHRpb25zIHRoYXQgYXJlIHNpZ25lZCBieSBhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CisgICAgIChDQSkga2V5LiAgQ2xpZW50cyBvciBzZXJ2ZXJzIG1heSB0aGVuIHRydXN0IG9ubHkgdGhlIENBIGtleSBhbmQgdmVyaWZ5CisgICAgIGl0cyBzaWduYXR1cmUgb24gYSBjZXJ0aWZpY2F0ZSByYXRoZXIgdGhhbiB0cnVzdGluZyBtYW55IHVzZXIvaG9zdCBrZXlzLgorICAgICBOb3RlIHRoYXQgT3BlblNTSCBjZXJ0aWZpY2F0ZXMgYXJlIGEgZGlmZmVyZW50LCBhbmQgbXVjaCBzaW1wbGVyLCBmb3JtYXQKKyAgICAgdG8gdGhlIFguNTA5IGNlcnRpZmljYXRlcyB1c2VkIGluIHNzbCg4KS4KKworICAgICBzc2gta2V5Z2VuIHN1cHBvcnRzIHR3byB0eXBlcyBvZiBjZXJ0aWZpY2F0ZXM6IHVzZXIgYW5kIGhvc3QuICBVc2VyCisgICAgIGNlcnRpZmljYXRlcyBhdXRoZW50aWNhdGUgdXNlcnMgdG8gc2VydmVycywgd2hlcmVhcyBob3N0IGNlcnRpZmljYXRlcworICAgICBhdXRoZW50aWNhdGUgc2VydmVyIGhvc3RzIHRvIHVzZXJzLiAgVG8gZ2VuZXJhdGUgYSB1c2VyIGNlcnRpZmljYXRlOgorCisgICAgICAgICAgICQgc3NoLWtleWdlbiAtcyAvcGF0aC90by9jYV9rZXkgLUkga2V5X2lkIC9wYXRoL3RvL3VzZXJfa2V5LnB1YgorCisgICAgIFRoZSByZXN1bHRhbnQgY2VydGlmaWNhdGUgd2lsbCBiZSBwbGFjZWQgaW4gL3BhdGgvdG8vdXNlcl9rZXktY2VydC5wdWIuCisgICAgIEEgaG9zdCBjZXJ0aWZpY2F0ZSByZXF1aXJlcyB0aGUgLWggb3B0aW9uOgorCisgICAgICAgICAgICQgc3NoLWtleWdlbiAtcyAvcGF0aC90by9jYV9rZXkgLUkga2V5X2lkIC1oIC9wYXRoL3RvL2hvc3Rfa2V5LnB1YgorCisgICAgIFRoZSBob3N0IGNlcnRpZmljYXRlIHdpbGwgYmUgb3V0cHV0IHRvIC9wYXRoL3RvL2hvc3Rfa2V5LWNlcnQucHViLgorCisgICAgIEl0IGlzIHBvc3NpYmxlIHRvIHNpZ24gdXNpbmcgYSBDQSBrZXkgc3RvcmVkIGluIGEgUEtDUyMxMSB0b2tlbiBieQorICAgICBwcm92aWRpbmcgdGhlIHRva2VuIGxpYnJhcnkgdXNpbmcgLUQgYW5kIGlkZW50aWZ5aW5nIHRoZSBDQSBrZXkgYnkKKyAgICAgcHJvdmlkaW5nIGl0cyBwdWJsaWMgaGFsZiBhcyBhbiBhcmd1bWVudCB0byAtczoKKworICAgICAgICAgICAkIHNzaC1rZXlnZW4gLXMgY2Ffa2V5LnB1YiAtRCBsaWJwa2NzMTEuc28gLUkga2V5X2lkIGhvc3Rfa2V5LnB1YgorCisgICAgIEluIGFsbCBjYXNlcywga2V5X2lkIGlzIGEgImtleSBpZGVudGlmaWVyIiB0aGF0IGlzIGxvZ2dlZCBieSB0aGUgc2VydmVyCisgICAgIHdoZW4gdGhlIGNlcnRpZmljYXRlIGlzIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLgorCisgICAgIENlcnRpZmljYXRlcyBtYXkgYmUgbGltaXRlZCB0byBiZSB2YWxpZCBmb3IgYSBzZXQgb2YgcHJpbmNpcGFsCisgICAgICh1c2VyL2hvc3QpIG5hbWVzLiAgQnkgZGVmYXVsdCwgZ2VuZXJhdGVkIGNlcnRpZmljYXRlcyBhcmUgdmFsaWQgZm9yIGFsbAorICAgICB1c2VycyBvciBob3N0cy4gIFRvIGdlbmVyYXRlIGEgY2VydGlmaWNhdGUgZm9yIGEgc3BlY2lmaWVkIHNldCBvZgorICAgICBwcmluY2lwYWxzOgorCisgICAgICAgICAgICQgc3NoLWtleWdlbiAtcyBjYV9rZXkgLUkga2V5X2lkIC1uIHVzZXIxLHVzZXIyIHVzZXJfa2V5LnB1YgorICAgICAgICAgICAkIHNzaC1rZXlnZW4gLXMgY2Ffa2V5IC1JIGtleV9pZCAtaCAtbiBob3N0LmRvbWFpbiB1c2VyX2tleS5wdWIKKworICAgICBBZGRpdGlvbmFsIGxpbWl0YXRpb25zIG9uIHRoZSB2YWxpZGl0eSBhbmQgdXNlIG9mIHVzZXIgY2VydGlmaWNhdGVzIG1heQorICAgICBiZSBzcGVjaWZpZWQgdGhyb3VnaCBjZXJ0aWZpY2F0ZSBvcHRpb25zLiAgQSBjZXJ0aWZpY2F0ZSBvcHRpb24gbWF5CisgICAgIGRpc2FibGUgZmVhdHVyZXMgb2YgdGhlIFNTSCBzZXNzaW9uLCBtYXkgYmUgdmFsaWQgb25seSB3aGVuIHByZXNlbnRlZAorICAgICBmcm9tIHBhcnRpY3VsYXIgc291cmNlIGFkZHJlc3NlcyBvciBtYXkgZm9yY2UgdGhlIHVzZSBvZiBhIHNwZWNpZmljCisgICAgIGNvbW1hbmQuICBGb3IgYSBsaXN0IG9mIHZhbGlkIGNlcnRpZmljYXRlIG9wdGlvbnMsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbgorICAgICBmb3IgdGhlIC1PIG9wdGlvbiBhYm92ZS4KKworICAgICBGaW5hbGx5LCBjZXJ0aWZpY2F0ZXMgbWF5IGJlIGRlZmluZWQgd2l0aCBhIHZhbGlkaXR5IGxpZmV0aW1lLiAgVGhlIC1WCisgICAgIG9wdGlvbiBhbGxvd3Mgc3BlY2lmaWNhdGlvbiBvZiBjZXJ0aWZpY2F0ZSBzdGFydCBhbmQgZW5kIHRpbWVzLiAgQQorICAgICBjZXJ0aWZpY2F0ZSB0aGF0IGlzIHByZXNlbnRlZCBhdCBhIHRpbWUgb3V0c2lkZSB0aGlzIHJhbmdlIHdpbGwgbm90IGJlCisgICAgIGNvbnNpZGVyZWQgdmFsaWQuICBCeSBkZWZhdWx0LCBjZXJ0aWZpY2F0ZXMgaGF2ZSBhIG1heGltdW0gdmFsaWRpdHkKKyAgICAgaW50ZXJ2YWwuCisKKyAgICAgRm9yIGNlcnRpZmljYXRlcyB0byBiZSB1c2VkIGZvciB1c2VyIG9yIGhvc3QgYXV0aGVudGljYXRpb24sIHRoZSBDQQorICAgICBwdWJsaWMga2V5IG11c3QgYmUgdHJ1c3RlZCBieSBzc2hkKDgpIG9yIHNzaCgxKS4gIFBsZWFzZSByZWZlciB0byB0aG9zZQorICAgICBtYW51YWwgcGFnZXMgZm9yIGRldGFpbHMuCisKK0ZJTEVTCisgICAgIH4vLnNzaC9pZGVudGl0eQorICAgICAgICAgICAgIENvbnRhaW5zIHRoZSBwcm90b2NvbCB2ZXJzaW9uIDEgUlNBIGF1dGhlbnRpY2F0aW9uIGlkZW50aXR5IG9mCisgICAgICAgICAgICAgdGhlIHVzZXIuICBUaGlzIGZpbGUgc2hvdWxkIG5vdCBiZSByZWFkYWJsZSBieSBhbnlvbmUgYnV0IHRoZQorICAgICAgICAgICAgIHVzZXIuICBJdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5IGEgcGFzc3BocmFzZSB3aGVuIGdlbmVyYXRpbmcgdGhlCisgICAgICAgICAgICAga2V5OyB0aGF0IHBhc3NwaHJhc2Ugd2lsbCBiZSB1c2VkIHRvIGVuY3J5cHQgdGhlIHByaXZhdGUgcGFydCBvZgorICAgICAgICAgICAgIHRoaXMgZmlsZSB1c2luZyAzREVTLiAgVGhpcyBmaWxlIGlzIG5vdCBhdXRvbWF0aWNhbGx5IGFjY2Vzc2VkIGJ5CisgICAgICAgICAgICAgc3NoLWtleWdlbiBidXQgaXQgaXMgb2ZmZXJlZCBhcyB0aGUgZGVmYXVsdCBmaWxlIGZvciB0aGUgcHJpdmF0ZQorICAgICAgICAgICAgIGtleS4gIHNzaCgxKSB3aWxsIHJlYWQgdGhpcyBmaWxlIHdoZW4gYSBsb2dpbiBhdHRlbXB0IGlzIG1hZGUuCisKKyAgICAgfi8uc3NoL2lkZW50aXR5LnB1YgorICAgICAgICAgICAgIENvbnRhaW5zIHRoZSBwcm90b2NvbCB2ZXJzaW9uIDEgUlNBIHB1YmxpYyBrZXkgZm9yCisgICAgICAgICAgICAgYXV0aGVudGljYXRpb24uICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIHNob3VsZCBiZSBhZGRlZCB0bworICAgICAgICAgICAgIH4vLnNzaC9hdXRob3JpemVkX2tleXMgb24gYWxsIG1hY2hpbmVzIHdoZXJlIHRoZSB1c2VyIHdpc2hlcyB0bworICAgICAgICAgICAgIGxvZyBpbiB1c2luZyBSU0EgYXV0aGVudGljYXRpb24uICBUaGVyZSBpcyBubyBuZWVkIHRvIGtlZXAgdGhlCisgICAgICAgICAgICAgY29udGVudHMgb2YgdGhpcyBmaWxlIHNlY3JldC4KKworICAgICB+Ly5zc2gvaWRfZHNhCisgICAgIH4vLnNzaC9pZF9lY2RzYQorICAgICB+Ly5zc2gvaWRfcnNhCisgICAgICAgICAgICAgQ29udGFpbnMgdGhlIHByb3RvY29sIHZlcnNpb24gMiBEU0EsIEVDRFNBIG9yIFJTQSBhdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgIGlkZW50aXR5IG9mIHRoZSB1c2VyLiAgVGhpcyBmaWxlIHNob3VsZCBub3QgYmUgcmVhZGFibGUgYnkgYW55b25lCisgICAgICAgICAgICAgYnV0IHRoZSB1c2VyLiAgSXQgaXMgcG9zc2libGUgdG8gc3BlY2lmeSBhIHBhc3NwaHJhc2Ugd2hlbgorICAgICAgICAgICAgIGdlbmVyYXRpbmcgdGhlIGtleTsgdGhhdCBwYXNzcGhyYXNlIHdpbGwgYmUgdXNlZCB0byBlbmNyeXB0IHRoZQorICAgICAgICAgICAgIHByaXZhdGUgcGFydCBvZiB0aGlzIGZpbGUgdXNpbmcgMTI4LWJpdCBBRVMuICBUaGlzIGZpbGUgaXMgbm90CisgICAgICAgICAgICAgYXV0b21hdGljYWxseSBhY2Nlc3NlZCBieSBzc2gta2V5Z2VuIGJ1dCBpdCBpcyBvZmZlcmVkIGFzIHRoZQorICAgICAgICAgICAgIGRlZmF1bHQgZmlsZSBmb3IgdGhlIHByaXZhdGUga2V5LiAgc3NoKDEpIHdpbGwgcmVhZCB0aGlzIGZpbGUKKyAgICAgICAgICAgICB3aGVuIGEgbG9naW4gYXR0ZW1wdCBpcyBtYWRlLgorCisgICAgIH4vLnNzaC9pZF9kc2EucHViCisgICAgIH4vLnNzaC9pZF9lY2RzYS5wdWIKKyAgICAgfi8uc3NoL2lkX3JzYS5wdWIKKyAgICAgICAgICAgICBDb250YWlucyB0aGUgcHJvdG9jb2wgdmVyc2lvbiAyIERTQSwgRUNEU0Egb3IgUlNBIHB1YmxpYyBrZXkgZm9yCisgICAgICAgICAgICAgYXV0aGVudGljYXRpb24uICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIHNob3VsZCBiZSBhZGRlZCB0bworICAgICAgICAgICAgIH4vLnNzaC9hdXRob3JpemVkX2tleXMgb24gYWxsIG1hY2hpbmVzIHdoZXJlIHRoZSB1c2VyIHdpc2hlcyB0bworICAgICAgICAgICAgIGxvZyBpbiB1c2luZyBwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uLiAgVGhlcmUgaXMgbm8gbmVlZCB0byBrZWVwCisgICAgICAgICAgICAgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBzZWNyZXQuCisKKyAgICAgL2V0Yy9tb2R1bGkKKyAgICAgICAgICAgICBDb250YWlucyBEaWZmaWUtSGVsbG1hbiBncm91cHMgdXNlZCBmb3IgREgtR0VYLiAgVGhlIGZpbGUgZm9ybWF0CisgICAgICAgICAgICAgaXMgZGVzY3JpYmVkIGluIG1vZHVsaSg1KS4KKworU0VFIEFMU08KKyAgICAgc3NoKDEpLCBzc2gtYWRkKDEpLCBzc2gtYWdlbnQoMSksIG1vZHVsaSg1KSwgc3NoZCg4KQorCisgICAgIFRoZSBTZWN1cmUgU2hlbGwgKFNTSCkgUHVibGljIEtleSBGaWxlIEZvcm1hdCwgUkZDIDQ3MTYsIDIwMDYuCisKK0FVVEhPUlMKKyAgICAgT3BlblNTSCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGFuZCBmcmVlIHNzaCAxLjIuMTIgcmVsZWFzZSBieQorICAgICBUYXR1IFlsb25lbi4gIEFhcm9uIENhbXBiZWxsLCBCb2IgQmVjaywgTWFya3VzIEZyaWVkbCwgTmllbHMgUHJvdm9zLCBUaGVvCisgICAgIGRlIFJhYWR0IGFuZCBEdWcgU29uZyByZW1vdmVkIG1hbnkgYnVncywgcmUtYWRkZWQgbmV3ZXIgZmVhdHVyZXMgYW5kCisgICAgIGNyZWF0ZWQgT3BlblNTSC4gIE1hcmt1cyBGcmllZGwgY29udHJpYnV0ZWQgdGhlIHN1cHBvcnQgZm9yIFNTSCBwcm90b2NvbAorICAgICB2ZXJzaW9ucyAxLjUgYW5kIDIuMC4KKworT3BlbkJTRCA1LjAgICAgICAgICAgICAgICAgICAgIE9jdG9iZXIgMTYsIDIwMTEgICAgICAgICAgICAgICAgICAgIE9wZW5CU0QgNS4wCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NzaC1rZXlnZW4uMSBiL29wZW5zc2gtNi4wcDEvc3NoLWtleWdlbi4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZGEyMDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NzaC1rZXlnZW4uMQpAQCAtMCwwICsxLDY5NyBAQAorLlwiCSRPcGVuQlNEOiBzc2gta2V5Z2VuLjEsdiAxLjEwOCAyMDExLzEwLzE2IDExOjAyOjQ2IGR0dWNrZXIgRXhwICQKKy5cIgorLlwiIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+CisuXCIgQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKy5cIiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorLlwiCisuXCIgQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorLlwiIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCisuXCIgc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworLlwiIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKy5cIiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCisuXCIKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5OSwyMDAwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiIENvcHlyaWdodCAoYykgMTk5OSBBYXJvbiBDYW1wYmVsbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIgQ29weXJpZ2h0IChjKSAxOTk5IFRoZW8gZGUgUmFhZHQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisuXCIgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy5cIiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisuXCIgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisuXCIgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLlwiIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLlwiIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy5cIiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy5cIiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLlwiCisuRGQgJE1kb2NkYXRlOiBPY3RvYmVyIDE2IDIwMTEgJAorLkR0IFNTSC1LRVlHRU4gMQorLk9zCisuU2ggTkFNRQorLk5tIHNzaC1rZXlnZW4KKy5OZCBhdXRoZW50aWNhdGlvbiBrZXkgZ2VuZXJhdGlvbiwgbWFuYWdlbWVudCBhbmQgY29udmVyc2lvbgorLlNoIFNZTk9QU0lTCisuQmsgLXdvcmRzCisuTm0gc3NoLWtleWdlbgorLk9wIEZsIHEKKy5PcCBGbCBiIEFyIGJpdHMKKy5GbCB0IEFyIHR5cGUKKy5PcCBGbCBOIEFyIG5ld19wYXNzcGhyYXNlCisuT3AgRmwgQyBBciBjb21tZW50CisuT3AgRmwgZiBBciBvdXRwdXRfa2V5ZmlsZQorLk5tIHNzaC1rZXlnZW4KKy5GbCBwCisuT3AgRmwgUCBBciBvbGRfcGFzc3BocmFzZQorLk9wIEZsIE4gQXIgbmV3X3Bhc3NwaHJhc2UKKy5PcCBGbCBmIEFyIGtleWZpbGUKKy5ObSBzc2gta2V5Z2VuCisuRmwgaQorLk9wIEZsIG0gQXIga2V5X2Zvcm1hdAorLk9wIEZsIGYgQXIgaW5wdXRfa2V5ZmlsZQorLk5tIHNzaC1rZXlnZW4KKy5GbCBlCisuT3AgRmwgbSBBciBrZXlfZm9ybWF0CisuT3AgRmwgZiBBciBpbnB1dF9rZXlmaWxlCisuTm0gc3NoLWtleWdlbgorLkZsIHkKKy5PcCBGbCBmIEFyIGlucHV0X2tleWZpbGUKKy5ObSBzc2gta2V5Z2VuCisuRmwgYworLk9wIEZsIFAgQXIgcGFzc3BocmFzZQorLk9wIEZsIEMgQXIgY29tbWVudAorLk9wIEZsIGYgQXIga2V5ZmlsZQorLk5tIHNzaC1rZXlnZW4KKy5GbCBsCisuT3AgRmwgZiBBciBpbnB1dF9rZXlmaWxlCisuTm0gc3NoLWtleWdlbgorLkZsIEIKKy5PcCBGbCBmIEFyIGlucHV0X2tleWZpbGUKKy5ObSBzc2gta2V5Z2VuCisuRmwgRCBBciBwa2NzMTEKKy5ObSBzc2gta2V5Z2VuCisuRmwgRiBBciBob3N0bmFtZQorLk9wIEZsIGYgQXIga25vd25faG9zdHNfZmlsZQorLk9wIEZsIGwKKy5ObSBzc2gta2V5Z2VuCisuRmwgSAorLk9wIEZsIGYgQXIga25vd25faG9zdHNfZmlsZQorLk5tIHNzaC1rZXlnZW4KKy5GbCBSIEFyIGhvc3RuYW1lCisuT3AgRmwgZiBBciBrbm93bl9ob3N0c19maWxlCisuTm0gc3NoLWtleWdlbgorLkZsIHIgQXIgaG9zdG5hbWUKKy5PcCBGbCBmIEFyIGlucHV0X2tleWZpbGUKKy5PcCBGbCBnCisuTm0gc3NoLWtleWdlbgorLkZsIEcgQXIgb3V0cHV0X2ZpbGUKKy5PcCBGbCB2CisuT3AgRmwgYiBBciBiaXRzCisuT3AgRmwgTSBBciBtZW1vcnkKKy5PcCBGbCBTIEFyIHN0YXJ0X3BvaW50CisuTm0gc3NoLWtleWdlbgorLkZsIFQgQXIgb3V0cHV0X2ZpbGUKKy5GbCBmIEFyIGlucHV0X2ZpbGUKKy5PcCBGbCB2CisuT3AgRmwgYSBBciBudW1fdHJpYWxzCisuT3AgRmwgSyBBciBjaGVja3B0CisuT3AgRmwgVyBBciBnZW5lcmF0b3IKKy5ObSBzc2gta2V5Z2VuCisuRmwgcyBBciBjYV9rZXkKKy5GbCBJIEFyIGNlcnRpZmljYXRlX2lkZW50aXR5CisuT3AgRmwgaAorLk9wIEZsIG4gQXIgcHJpbmNpcGFscworLk9wIEZsIE8gQXIgb3B0aW9uCisuT3AgRmwgViBBciB2YWxpZGl0eV9pbnRlcnZhbAorLk9wIEZsIHogQXIgc2VyaWFsX251bWJlcgorLkFyCisuTm0gc3NoLWtleWdlbgorLkZsIEwKKy5PcCBGbCBmIEFyIGlucHV0X2tleWZpbGUKKy5ObSBzc2gta2V5Z2VuCisuRmwgQQorLkVrCisuU2ggREVTQ1JJUFRJT04KKy5ObQorZ2VuZXJhdGVzLCBtYW5hZ2VzIGFuZCBjb252ZXJ0cyBhdXRoZW50aWNhdGlvbiBrZXlzIGZvcgorLlhyIHNzaCAxIC4KKy5ObQorY2FuIGNyZWF0ZSBSU0Ega2V5cyBmb3IgdXNlIGJ5IFNTSCBwcm90b2NvbCB2ZXJzaW9uIDEgYW5kIERTQSwgRUNEU0Egb3IgUlNBCitrZXlzIGZvciB1c2UgYnkgU1NIIHByb3RvY29sIHZlcnNpb24gMi4KK1RoZSB0eXBlIG9mIGtleSB0byBiZSBnZW5lcmF0ZWQgaXMgc3BlY2lmaWVkIHdpdGggdGhlCisuRmwgdAorb3B0aW9uLgorSWYgaW52b2tlZCB3aXRob3V0IGFueSBhcmd1bWVudHMsCisuTm0KK3dpbGwgZ2VuZXJhdGUgYW4gUlNBIGtleSBmb3IgdXNlIGluIFNTSCBwcm90b2NvbCAyIGNvbm5lY3Rpb25zLgorLlBwCisuTm0KK2lzIGFsc28gdXNlZCB0byBnZW5lcmF0ZSBncm91cHMgZm9yIHVzZSBpbiBEaWZmaWUtSGVsbG1hbiBncm91cAorZXhjaGFuZ2UgKERILUdFWCkuCitTZWUgdGhlCisuU3ggTU9EVUxJIEdFTkVSQVRJT04KK3NlY3Rpb24gZm9yIGRldGFpbHMuCisuUHAKK05vcm1hbGx5IGVhY2ggdXNlciB3aXNoaW5nIHRvIHVzZSBTU0gKK3dpdGggcHVibGljIGtleSBhdXRoZW50aWNhdGlvbiBydW5zIHRoaXMgb25jZSB0byBjcmVhdGUgdGhlIGF1dGhlbnRpY2F0aW9uCitrZXkgaW4KKy5QYSB+Ly5zc2gvaWRlbnRpdHkgLAorLlBhIH4vLnNzaC9pZF9lY2RzYSAsCisuUGEgfi8uc3NoL2lkX2RzYQorb3IKKy5QYSB+Ly5zc2gvaWRfcnNhIC4KK0FkZGl0aW9uYWxseSwgdGhlIHN5c3RlbSBhZG1pbmlzdHJhdG9yIG1heSB1c2UgdGhpcyB0byBnZW5lcmF0ZSBob3N0IGtleXMsCithcyBzZWVuIGluCisuUGEgL2V0Yy9yYyAuCisuUHAKK05vcm1hbGx5IHRoaXMgcHJvZ3JhbSBnZW5lcmF0ZXMgdGhlIGtleSBhbmQgYXNrcyBmb3IgYSBmaWxlIGluIHdoaWNoCit0byBzdG9yZSB0aGUgcHJpdmF0ZSBrZXkuCitUaGUgcHVibGljIGtleSBpcyBzdG9yZWQgaW4gYSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSBidXQKKy5EcSAucHViCithcHBlbmRlZC4KK1RoZSBwcm9ncmFtIGFsc28gYXNrcyBmb3IgYSBwYXNzcGhyYXNlLgorVGhlIHBhc3NwaHJhc2UgbWF5IGJlIGVtcHR5IHRvIGluZGljYXRlIG5vIHBhc3NwaHJhc2UKKyhob3N0IGtleXMgbXVzdCBoYXZlIGFuIGVtcHR5IHBhc3NwaHJhc2UpLCBvciBpdCBtYXkgYmUgYSBzdHJpbmcgb2YKK2FyYml0cmFyeSBsZW5ndGguCitBIHBhc3NwaHJhc2UgaXMgc2ltaWxhciB0byBhIHBhc3N3b3JkLCBleGNlcHQgaXQgY2FuIGJlIGEgcGhyYXNlIHdpdGggYQorc2VyaWVzIG9mIHdvcmRzLCBwdW5jdHVhdGlvbiwgbnVtYmVycywgd2hpdGVzcGFjZSwgb3IgYW55IHN0cmluZyBvZgorY2hhcmFjdGVycyB5b3Ugd2FudC4KK0dvb2QgcGFzc3BocmFzZXMgYXJlIDEwLTMwIGNoYXJhY3RlcnMgbG9uZywgYXJlCitub3Qgc2ltcGxlIHNlbnRlbmNlcyBvciBvdGhlcndpc2UgZWFzaWx5IGd1ZXNzYWJsZSAoRW5nbGlzaAorcHJvc2UgaGFzIG9ubHkgMS0yIGJpdHMgb2YgZW50cm9weSBwZXIgY2hhcmFjdGVyLCBhbmQgcHJvdmlkZXMgdmVyeSBiYWQKK3Bhc3NwaHJhc2VzKSwgYW5kIGNvbnRhaW4gYSBtaXggb2YgdXBwZXIgYW5kIGxvd2VyY2FzZSBsZXR0ZXJzLAorbnVtYmVycywgYW5kIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycy4KK1RoZSBwYXNzcGhyYXNlIGNhbiBiZSBjaGFuZ2VkIGxhdGVyIGJ5IHVzaW5nIHRoZQorLkZsIHAKK29wdGlvbi4KKy5QcAorVGhlcmUgaXMgbm8gd2F5IHRvIHJlY292ZXIgYSBsb3N0IHBhc3NwaHJhc2UuCitJZiB0aGUgcGFzc3BocmFzZSBpcyBsb3N0IG9yIGZvcmdvdHRlbiwgYSBuZXcga2V5IG11c3QgYmUgZ2VuZXJhdGVkCithbmQgdGhlIGNvcnJlc3BvbmRpbmcgcHVibGljIGtleSBjb3BpZWQgdG8gb3RoZXIgbWFjaGluZXMuCisuUHAKK0ZvciBSU0ExIGtleXMsCit0aGVyZSBpcyBhbHNvIGEgY29tbWVudCBmaWVsZCBpbiB0aGUga2V5IGZpbGUgdGhhdCBpcyBvbmx5IGZvcgorY29udmVuaWVuY2UgdG8gdGhlIHVzZXIgdG8gaGVscCBpZGVudGlmeSB0aGUga2V5LgorVGhlIGNvbW1lbnQgY2FuIHRlbGwgd2hhdCB0aGUga2V5IGlzIGZvciwgb3Igd2hhdGV2ZXIgaXMgdXNlZnVsLgorVGhlIGNvbW1lbnQgaXMgaW5pdGlhbGl6ZWQgdG8KKy5EcSB1c2VyQGhvc3QKK3doZW4gdGhlIGtleSBpcyBjcmVhdGVkLCBidXQgY2FuIGJlIGNoYW5nZWQgdXNpbmcgdGhlCisuRmwgYworb3B0aW9uLgorLlBwCitBZnRlciBhIGtleSBpcyBnZW5lcmF0ZWQsIGluc3RydWN0aW9ucyBiZWxvdyBkZXRhaWwgd2hlcmUgdGhlIGtleXMKK3Nob3VsZCBiZSBwbGFjZWQgdG8gYmUgYWN0aXZhdGVkLgorLlBwCitUaGUgb3B0aW9ucyBhcmUgYXMgZm9sbG93czoKKy5CbCAtdGFnIC13aWR0aCBEcworLkl0IEZsIEEKK0ZvciBlYWNoIG9mIHRoZSBrZXkgdHlwZXMgKHJzYTEsIHJzYSwgZHNhIGFuZCBlY2RzYSkgZm9yIHdoaWNoIGhvc3Qga2V5cworZG8gbm90IGV4aXN0LCBnZW5lcmF0ZSB0aGUgaG9zdCBrZXlzIHdpdGggdGhlIGRlZmF1bHQga2V5IGZpbGUgcGF0aCwKK2FuIGVtcHR5IHBhc3NwaHJhc2UsIGRlZmF1bHQgYml0cyBmb3IgdGhlIGtleSB0eXBlLCBhbmQgZGVmYXVsdCBjb21tZW50LgorVGhpcyBpcyB1c2VkIGJ5CisuUGEgL2V0Yy9yYwordG8gZ2VuZXJhdGUgbmV3IGhvc3Qga2V5cy4KKy5JdCBGbCBhIEFyIHRyaWFscworU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcHJpbWFsaXR5IHRlc3RzIHRvIHBlcmZvcm0gd2hlbiBzY3JlZW5pbmcgREgtR0VYCitjYW5kaWRhdGVzIHVzaW5nIHRoZQorLkZsIFQKK2NvbW1hbmQuCisuSXQgRmwgQgorU2hvdyB0aGUgYnViYmxlYmFiYmxlIGRpZ2VzdCBvZiBzcGVjaWZpZWQgcHJpdmF0ZSBvciBwdWJsaWMga2V5IGZpbGUuCisuSXQgRmwgYiBBciBiaXRzCitTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBrZXkgdG8gY3JlYXRlLgorRm9yIFJTQSBrZXlzLCB0aGUgbWluaW11bSBzaXplIGlzIDc2OCBiaXRzIGFuZCB0aGUgZGVmYXVsdCBpcyAyMDQ4IGJpdHMuCitHZW5lcmFsbHksIDIwNDggYml0cyBpcyBjb25zaWRlcmVkIHN1ZmZpY2llbnQuCitEU0Ega2V5cyBtdXN0IGJlIGV4YWN0bHkgMTAyNCBiaXRzIGFzIHNwZWNpZmllZCBieSBGSVBTIDE4Ni0yLgorRm9yIEVDRFNBIGtleXMsIHRoZQorLkZsIGIKK2ZsYWcgZGV0ZXJtaW5lcyB0aGUga2V5IGxlbmd0aCBieSBzZWxlY3RpbmcgZnJvbSBvbmUgb2YgdGhyZWUgZWxsaXB0aWMKK2N1cnZlIHNpemVzOiAyNTYsIDM4NCBvciA1MjEgYml0cy4KK0F0dGVtcHRpbmcgdG8gdXNlIGJpdCBsZW5ndGhzIG90aGVyIHRoYW4gdGhlc2UgdGhyZWUgdmFsdWVzIGZvciBFQ0RTQSBrZXlzCit3aWxsIGZhaWwuCisuSXQgRmwgQyBBciBjb21tZW50CitQcm92aWRlcyBhIG5ldyBjb21tZW50LgorLkl0IEZsIGMKK1JlcXVlc3RzIGNoYW5naW5nIHRoZSBjb21tZW50IGluIHRoZSBwcml2YXRlIGFuZCBwdWJsaWMga2V5IGZpbGVzLgorVGhpcyBvcGVyYXRpb24gaXMgb25seSBzdXBwb3J0ZWQgZm9yIFJTQTEga2V5cy4KK1RoZSBwcm9ncmFtIHdpbGwgcHJvbXB0IGZvciB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBwcml2YXRlIGtleXMsIGZvcgordGhlIHBhc3NwaHJhc2UgaWYgdGhlIGtleSBoYXMgb25lLCBhbmQgZm9yIHRoZSBuZXcgY29tbWVudC4KKy5JdCBGbCBEIEFyIHBrY3MxMQorRG93bmxvYWQgdGhlIFJTQSBwdWJsaWMga2V5cyBwcm92aWRlZCBieSB0aGUgUEtDUyMxMSBzaGFyZWQgbGlicmFyeQorLkFyIHBrY3MxMSAuCitXaGVuIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aAorLkZsIHMgLAordGhpcyBvcHRpb24gaW5kaWNhdGVzIHRoYXQgYSBDQSBrZXkgcmVzaWRlcyBpbiBhIFBLQ1MjMTEgdG9rZW4gKHNlZSB0aGUKKy5TeCBDRVJUSUZJQ0FURVMKK3NlY3Rpb24gZm9yIGRldGFpbHMpLgorLkl0IEZsIGUKK1RoaXMgb3B0aW9uIHdpbGwgcmVhZCBhIHByaXZhdGUgb3IgcHVibGljIE9wZW5TU0gga2V5IGZpbGUgYW5kCitwcmludCB0byBzdGRvdXQgdGhlIGtleSBpbiBvbmUgb2YgdGhlIGZvcm1hdHMgc3BlY2lmaWVkIGJ5IHRoZQorLkZsIG0KK29wdGlvbi4KK1RoZSBkZWZhdWx0IGV4cG9ydCBmb3JtYXQgaXMKKy5EcSBSRkM0NzE2IC4KK1RoaXMgb3B0aW9uIGFsbG93cyBleHBvcnRpbmcgT3BlblNTSCBrZXlzIGZvciB1c2UgYnkgb3RoZXIgcHJvZ3JhbXMsIGluY2x1ZGluZworc2V2ZXJhbCBjb21tZXJjaWFsIFNTSCBpbXBsZW1lbnRhdGlvbnMuCisuSXQgRmwgRiBBciBob3N0bmFtZQorU2VhcmNoIGZvciB0aGUgc3BlY2lmaWVkCisuQXIgaG9zdG5hbWUKK2luIGEKKy5QYSBrbm93bl9ob3N0cworZmlsZSwgbGlzdGluZyBhbnkgb2NjdXJyZW5jZXMgZm91bmQuCitUaGlzIG9wdGlvbiBpcyB1c2VmdWwgdG8gZmluZCBoYXNoZWQgaG9zdCBuYW1lcyBvciBhZGRyZXNzZXMgYW5kIG1heSBhbHNvIGJlCit1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCisuRmwgSAorb3B0aW9uIHRvIHByaW50IGZvdW5kIGtleXMgaW4gYSBoYXNoZWQgZm9ybWF0LgorLkl0IEZsIGYgQXIgZmlsZW5hbWUKK1NwZWNpZmllcyB0aGUgZmlsZW5hbWUgb2YgdGhlIGtleSBmaWxlLgorLkl0IEZsIEcgQXIgb3V0cHV0X2ZpbGUKK0dlbmVyYXRlIGNhbmRpZGF0ZSBwcmltZXMgZm9yIERILUdFWC4KK1RoZXNlIHByaW1lcyBtdXN0IGJlIHNjcmVlbmVkIGZvcgorc2FmZXR5ICh1c2luZyB0aGUKKy5GbCBUCitvcHRpb24pIGJlZm9yZSB1c2UuCisuSXQgRmwgZworVXNlIGdlbmVyaWMgRE5TIGZvcm1hdCB3aGVuIHByaW50aW5nIGZpbmdlcnByaW50IHJlc291cmNlIHJlY29yZHMgdXNpbmcgdGhlCisuRmwgcgorY29tbWFuZC4KKy5JdCBGbCBICitIYXNoIGEKKy5QYSBrbm93bl9ob3N0cworZmlsZS4KK1RoaXMgcmVwbGFjZXMgYWxsIGhvc3RuYW1lcyBhbmQgYWRkcmVzc2VzIHdpdGggaGFzaGVkIHJlcHJlc2VudGF0aW9ucword2l0aGluIHRoZSBzcGVjaWZpZWQgZmlsZTsgdGhlIG9yaWdpbmFsIGNvbnRlbnQgaXMgbW92ZWQgdG8gYSBmaWxlIHdpdGgKK2EgLm9sZCBzdWZmaXguCitUaGVzZSBoYXNoZXMgbWF5IGJlIHVzZWQgbm9ybWFsbHkgYnkKKy5ObSBzc2gKK2FuZAorLk5tIHNzaGQgLAorYnV0IHRoZXkgZG8gbm90IHJldmVhbCBpZGVudGlmeWluZyBpbmZvcm1hdGlvbiBzaG91bGQgdGhlIGZpbGUncyBjb250ZW50cworYmUgZGlzY2xvc2VkLgorVGhpcyBvcHRpb24gd2lsbCBub3QgbW9kaWZ5IGV4aXN0aW5nIGhhc2hlZCBob3N0bmFtZXMgYW5kIGlzIHRoZXJlZm9yZSBzYWZlCit0byB1c2Ugb24gZmlsZXMgdGhhdCBtaXggaGFzaGVkIGFuZCBub24taGFzaGVkIG5hbWVzLgorLkl0IEZsIGgKK1doZW4gc2lnbmluZyBhIGtleSwgY3JlYXRlIGEgaG9zdCBjZXJ0aWZpY2F0ZSBpbnN0ZWFkIG9mIGEgdXNlcgorY2VydGlmaWNhdGUuCitQbGVhc2Ugc2VlIHRoZQorLlN4IENFUlRJRklDQVRFUworc2VjdGlvbiBmb3IgZGV0YWlscy4KKy5JdCBGbCBJIEFyIGNlcnRpZmljYXRlX2lkZW50aXR5CitTcGVjaWZ5IHRoZSBrZXkgaWRlbnRpdHkgd2hlbiBzaWduaW5nIGEgcHVibGljIGtleS4KK1BsZWFzZSBzZWUgdGhlCisuU3ggQ0VSVElGSUNBVEVTCitzZWN0aW9uIGZvciBkZXRhaWxzLgorLkl0IEZsIGkKK1RoaXMgb3B0aW9uIHdpbGwgcmVhZCBhbiB1bmVuY3J5cHRlZCBwcml2YXRlIChvciBwdWJsaWMpIGtleSBmaWxlCitpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBieSB0aGUKKy5GbCBtCitvcHRpb24gYW5kIHByaW50IGFuIE9wZW5TU0ggY29tcGF0aWJsZSBwcml2YXRlCisob3IgcHVibGljKSBrZXkgdG8gc3Rkb3V0LgorLkl0IEZsIEsgQXIgY2hlY2twdAorV3JpdGUgdGhlIGxhc3QgbGluZSBwcm9jZXNzZWQgdG8gdGhlIGZpbGUKKy5BciBjaGVja3B0Cit3aGlsZSBwZXJmb3JtaW5nIERIIGNhbmRpZGF0ZSBzY3JlZW5pbmcgdXNpbmcgdGhlCisuRmwgVAorb3B0aW9uLgorVGhpcyB3aWxsIGJlIHVzZWQgdG8gc2tpcCBsaW5lcyBpbiB0aGUgaW5wdXQgZmlsZSB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuCitwcm9jZXNzZWQgaWYgdGhlIGpvYiBpcyByZXN0YXJ0ZWQuCitUaGlzIG9wdGlvbiBhbGxvd3MgaW1wb3J0aW5nIGtleXMgZnJvbSBvdGhlciBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNldmVyYWwKK2NvbW1lcmNpYWwgU1NIIGltcGxlbWVudGF0aW9ucy4KK1RoZSBkZWZhdWx0IGltcG9ydCBmb3JtYXQgaXMKKy5EcSBSRkM0NzE2IC4KKy5JdCBGbCBMCitQcmludHMgdGhlIGNvbnRlbnRzIG9mIGEgY2VydGlmaWNhdGUuCisuSXQgRmwgbAorU2hvdyBmaW5nZXJwcmludCBvZiBzcGVjaWZpZWQgcHVibGljIGtleSBmaWxlLgorUHJpdmF0ZSBSU0ExIGtleXMgYXJlIGFsc28gc3VwcG9ydGVkLgorRm9yIFJTQSBhbmQgRFNBIGtleXMKKy5ObQordHJpZXMgdG8gZmluZCB0aGUgbWF0Y2hpbmcgcHVibGljIGtleSBmaWxlIGFuZCBwcmludHMgaXRzIGZpbmdlcnByaW50LgorSWYgY29tYmluZWQgd2l0aAorLkZsIHYgLAorYW4gQVNDSUkgYXJ0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBrZXkgaXMgc3VwcGxpZWQgd2l0aCB0aGUgZmluZ2VycHJpbnQuCisuSXQgRmwgTSBBciBtZW1vcnkKK1NwZWNpZnkgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gdXNlIChpbiBtZWdhYnl0ZXMpIHdoZW4gZ2VuZXJhdGluZworY2FuZGlkYXRlIG1vZHVsaSBmb3IgREgtR0VYLgorLkl0IEZsIG0gQXIga2V5X2Zvcm1hdAorU3BlY2lmeSBhIGtleSBmb3JtYXQgZm9yIHRoZQorLkZsIGkKKyhpbXBvcnQpIG9yCisuRmwgZQorKGV4cG9ydCkgY29udmVyc2lvbiBvcHRpb25zLgorVGhlIHN1cHBvcnRlZCBrZXkgZm9ybWF0cyBhcmU6CisuRHEgUkZDNDcxNgorKFJGQyA0NzE2L1NTSDIgcHVibGljIG9yIHByaXZhdGUga2V5KSwKKy5EcSBQS0NTOAorKFBFTSBQS0NTOCBwdWJsaWMga2V5KQorb3IKKy5EcSBQRU0KKyhQRU0gcHVibGljIGtleSkuCitUaGUgZGVmYXVsdCBjb252ZXJzaW9uIGZvcm1hdCBpcworLkRxIFJGQzQ3MTYgLgorLkl0IEZsIE4gQXIgbmV3X3Bhc3NwaHJhc2UKK1Byb3ZpZGVzIHRoZSBuZXcgcGFzc3BocmFzZS4KKy5JdCBGbCBuIEFyIHByaW5jaXBhbHMKK1NwZWNpZnkgb25lIG9yIG1vcmUgcHJpbmNpcGFscyAodXNlciBvciBob3N0IG5hbWVzKSB0byBiZSBpbmNsdWRlZCBpbgorYSBjZXJ0aWZpY2F0ZSB3aGVuIHNpZ25pbmcgYSBrZXkuCitNdWx0aXBsZSBwcmluY2lwYWxzIG1heSBiZSBzcGVjaWZpZWQsIHNlcGFyYXRlZCBieSBjb21tYXMuCitQbGVhc2Ugc2VlIHRoZQorLlN4IENFUlRJRklDQVRFUworc2VjdGlvbiBmb3IgZGV0YWlscy4KKy5JdCBGbCBPIEFyIG9wdGlvbgorU3BlY2lmeSBhIGNlcnRpZmljYXRlIG9wdGlvbiB3aGVuIHNpZ25pbmcgYSBrZXkuCitUaGlzIG9wdGlvbiBtYXkgYmUgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLgorUGxlYXNlIHNlZSB0aGUKKy5TeCBDRVJUSUZJQ0FURVMKK3NlY3Rpb24gZm9yIGRldGFpbHMuCitUaGUgb3B0aW9ucyB0aGF0IGFyZSB2YWxpZCBmb3IgdXNlciBjZXJ0aWZpY2F0ZXMgYXJlOgorLkJsIC10YWcgLXdpZHRoIERzCisuSXQgSWMgY2xlYXIKK0NsZWFyIGFsbCBlbmFibGVkIHBlcm1pc3Npb25zLgorVGhpcyBpcyB1c2VmdWwgZm9yIGNsZWFyaW5nIHRoZSBkZWZhdWx0IHNldCBvZiBwZXJtaXNzaW9ucyBzbyBwZXJtaXNzaW9ucyBtYXkKK2JlIGFkZGVkIGluZGl2aWR1YWxseS4KKy5JdCBJYyBmb3JjZS1jb21tYW5kIE5zID0gTnMgQXIgY29tbWFuZAorRm9yY2VzIHRoZSBleGVjdXRpb24gb2YKKy5BciBjb21tYW5kCitpbnN0ZWFkIG9mIGFueSBzaGVsbCBvciBjb21tYW5kIHNwZWNpZmllZCBieSB0aGUgdXNlciB3aGVuCit0aGUgY2VydGlmaWNhdGUgaXMgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uCisuSXQgSWMgbm8tYWdlbnQtZm9yd2FyZGluZworRGlzYWJsZQorLlhyIHNzaC1hZ2VudCAxCitmb3J3YXJkaW5nIChwZXJtaXR0ZWQgYnkgZGVmYXVsdCkuCisuSXQgSWMgbm8tcG9ydC1mb3J3YXJkaW5nCitEaXNhYmxlIHBvcnQgZm9yd2FyZGluZyAocGVybWl0dGVkIGJ5IGRlZmF1bHQpLgorLkl0IEljIG5vLXB0eQorRGlzYWJsZSBQVFkgYWxsb2NhdGlvbiAocGVybWl0dGVkIGJ5IGRlZmF1bHQpLgorLkl0IEljIG5vLXVzZXItcmMKK0Rpc2FibGUgZXhlY3V0aW9uIG9mCisuUGEgfi8uc3NoL3JjCitieQorLlhyIHNzaGQgOAorKHBlcm1pdHRlZCBieSBkZWZhdWx0KS4KKy5JdCBJYyBuby14MTEtZm9yd2FyZGluZworRGlzYWJsZSBYMTEgZm9yd2FyZGluZyAocGVybWl0dGVkIGJ5IGRlZmF1bHQpLgorLkl0IEljIHBlcm1pdC1hZ2VudC1mb3J3YXJkaW5nCitBbGxvd3MKKy5YciBzc2gtYWdlbnQgMQorZm9yd2FyZGluZy4KKy5JdCBJYyBwZXJtaXQtcG9ydC1mb3J3YXJkaW5nCitBbGxvd3MgcG9ydCBmb3J3YXJkaW5nLgorLkl0IEljIHBlcm1pdC1wdHkKK0FsbG93cyBQVFkgYWxsb2NhdGlvbi4KKy5JdCBJYyBwZXJtaXQtdXNlci1yYworQWxsb3dzIGV4ZWN1dGlvbiBvZgorLlBhIH4vLnNzaC9yYworYnkKKy5YciBzc2hkIDggLgorLkl0IEljIHBlcm1pdC14MTEtZm9yd2FyZGluZworQWxsb3dzIFgxMSBmb3J3YXJkaW5nLgorLkl0IEljIHNvdXJjZS1hZGRyZXNzIE5zID0gTnMgQXIgYWRkcmVzc19saXN0CitSZXN0cmljdCB0aGUgc291cmNlIGFkZHJlc3NlcyBmcm9tIHdoaWNoIHRoZSBjZXJ0aWZpY2F0ZSBpcyBjb25zaWRlcmVkIHZhbGlkLgorVGhlCisuQXIgYWRkcmVzc19saXN0CitpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG9uZSBvciBtb3JlIGFkZHJlc3MvbmV0bWFzayBwYWlycyBpbiBDSURSCitmb3JtYXQuCisuRWwKKy5QcAorQXQgcHJlc2VudCwgbm8gb3B0aW9ucyBhcmUgdmFsaWQgZm9yIGhvc3Qga2V5cy4KKy5JdCBGbCBQIEFyIHBhc3NwaHJhc2UKK1Byb3ZpZGVzIHRoZSAob2xkKSBwYXNzcGhyYXNlLgorLkl0IEZsIHAKK1JlcXVlc3RzIGNoYW5naW5nIHRoZSBwYXNzcGhyYXNlIG9mIGEgcHJpdmF0ZSBrZXkgZmlsZSBpbnN0ZWFkIG9mCitjcmVhdGluZyBhIG5ldyBwcml2YXRlIGtleS4KK1RoZSBwcm9ncmFtIHdpbGwgcHJvbXB0IGZvciB0aGUgZmlsZQorY29udGFpbmluZyB0aGUgcHJpdmF0ZSBrZXksIGZvciB0aGUgb2xkIHBhc3NwaHJhc2UsIGFuZCB0d2ljZSBmb3IgdGhlCituZXcgcGFzc3BocmFzZS4KKy5JdCBGbCBxCitTaWxlbmNlCisuTm0gc3NoLWtleWdlbiAuCisuSXQgRmwgUiBBciBob3N0bmFtZQorUmVtb3ZlcyBhbGwga2V5cyBiZWxvbmdpbmcgdG8KKy5BciBob3N0bmFtZQorZnJvbSBhCisuUGEga25vd25faG9zdHMKK2ZpbGUuCitUaGlzIG9wdGlvbiBpcyB1c2VmdWwgdG8gZGVsZXRlIGhhc2hlZCBob3N0cyAoc2VlIHRoZQorLkZsIEgKK29wdGlvbiBhYm92ZSkuCisuSXQgRmwgciBBciBob3N0bmFtZQorUHJpbnQgdGhlIFNTSEZQIGZpbmdlcnByaW50IHJlc291cmNlIHJlY29yZCBuYW1lZAorLkFyIGhvc3RuYW1lCitmb3IgdGhlIHNwZWNpZmllZCBwdWJsaWMga2V5IGZpbGUuCisuSXQgRmwgUyBBciBzdGFydAorU3BlY2lmeSBzdGFydCBwb2ludCAoaW4gaGV4KSB3aGVuIGdlbmVyYXRpbmcgY2FuZGlkYXRlIG1vZHVsaSBmb3IgREgtR0VYLgorLkl0IEZsIHMgQXIgY2Ffa2V5CitDZXJ0aWZ5IChzaWduKSBhIHB1YmxpYyBrZXkgdXNpbmcgdGhlIHNwZWNpZmllZCBDQSBrZXkuCitQbGVhc2Ugc2VlIHRoZQorLlN4IENFUlRJRklDQVRFUworc2VjdGlvbiBmb3IgZGV0YWlscy4KKy5JdCBGbCBUIEFyIG91dHB1dF9maWxlCitUZXN0IERIIGdyb3VwIGV4Y2hhbmdlIGNhbmRpZGF0ZSBwcmltZXMgKGdlbmVyYXRlZCB1c2luZyB0aGUKKy5GbCBHCitvcHRpb24pIGZvciBzYWZldHkuCisuSXQgRmwgdCBBciB0eXBlCitTcGVjaWZpZXMgdGhlIHR5cGUgb2Yga2V5IHRvIGNyZWF0ZS4KK1RoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlCisuRHEgcnNhMQorZm9yIHByb3RvY29sIHZlcnNpb24gMSBhbmQKKy5EcSBkc2EgLAorLkRxIGVjZHNhCitvcgorLkRxIHJzYQorZm9yIHByb3RvY29sIHZlcnNpb24gMi4KKy5JdCBGbCBWIEFyIHZhbGlkaXR5X2ludGVydmFsCitTcGVjaWZ5IGEgdmFsaWRpdHkgaW50ZXJ2YWwgd2hlbiBzaWduaW5nIGEgY2VydGlmaWNhdGUuCitBIHZhbGlkaXR5IGludGVydmFsIG1heSBjb25zaXN0IG9mIGEgc2luZ2xlIHRpbWUsIGluZGljYXRpbmcgdGhhdCB0aGUKK2NlcnRpZmljYXRlIGlzIHZhbGlkIGJlZ2lubmluZyBub3cgYW5kIGV4cGlyaW5nIGF0IHRoYXQgdGltZSwgb3IgbWF5IGNvbnNpc3QKK29mIHR3byB0aW1lcyBzZXBhcmF0ZWQgYnkgYSBjb2xvbiB0byBpbmRpY2F0ZSBhbiBleHBsaWNpdCB0aW1lIGludGVydmFsLgorVGhlIHN0YXJ0IHRpbWUgbWF5IGJlIHNwZWNpZmllZCBhcyBhIGRhdGUgaW4gWVlZWU1NREQgZm9ybWF0LCBhIHRpbWUKK2luIFlZWVlNTURESEhNTVNTIGZvcm1hdCBvciBhIHJlbGF0aXZlIHRpbWUgKHRvIHRoZSBjdXJyZW50IHRpbWUpIGNvbnNpc3RpbmcKK29mIGEgbWludXMgc2lnbiBmb2xsb3dlZCBieSBhIHJlbGF0aXZlIHRpbWUgaW4gdGhlIGZvcm1hdCBkZXNjcmliZWQgaW4gdGhlCisuU3ggVElNRSBGT1JNQVRTCitzZWN0aW9uIG9mCisuWHIgc3NoZF9jb25maWcgNSAuCitUaGUgZW5kIHRpbWUgbWF5IGJlIHNwZWNpZmllZCBhcyBhIFlZWVlNTUREIGRhdGUsIGEgWVlZWU1NRERISE1NU1MgdGltZSBvcgorYSByZWxhdGl2ZSB0aW1lIHN0YXJ0aW5nIHdpdGggYSBwbHVzIGNoYXJhY3Rlci4KKy5QcAorRm9yIGV4YW1wbGU6CisuRHEgKzUydzFkCisodmFsaWQgZnJvbSBub3cgdG8gNTIgd2Vla3MgYW5kIG9uZSBkYXkgZnJvbSBub3cpLAorLkRxIC00dzorNHcKKyh2YWxpZCBmcm9tIGZvdXIgd2Vla3MgYWdvIHRvIGZvdXIgd2Vla3MgZnJvbSBub3cpLAorLkRxIDIwMTAwMTAxMTIzMDAwOjIwMTEwMTAxMTIzMDAwCisodmFsaWQgZnJvbSAxMjozMCBQTSwgSmFudWFyeSAxc3QsIDIwMTAgdG8gMTI6MzAgUE0sIEphbnVhcnkgMXN0LCAyMDExKSwKKy5EcSAtMWQ6MjAxMTAxMDEKKyh2YWxpZCBmcm9tIHllc3RlcmRheSB0byBtaWRuaWdodCwgSmFudWFyeSAxc3QsIDIwMTEpLgorLkl0IEZsIHYKK1ZlcmJvc2UgbW9kZS4KK0NhdXNlcworLk5tCit0byBwcmludCBkZWJ1Z2dpbmcgbWVzc2FnZXMgYWJvdXQgaXRzIHByb2dyZXNzLgorVGhpcyBpcyBoZWxwZnVsIGZvciBkZWJ1Z2dpbmcgbW9kdWxpIGdlbmVyYXRpb24uCitNdWx0aXBsZQorLkZsIHYKK29wdGlvbnMgaW5jcmVhc2UgdGhlIHZlcmJvc2l0eS4KK1RoZSBtYXhpbXVtIGlzIDMuCisuSXQgRmwgVyBBciBnZW5lcmF0b3IKK1NwZWNpZnkgZGVzaXJlZCBnZW5lcmF0b3Igd2hlbiB0ZXN0aW5nIGNhbmRpZGF0ZSBtb2R1bGkgZm9yIERILUdFWC4KKy5JdCBGbCB5CitUaGlzIG9wdGlvbiB3aWxsIHJlYWQgYSBwcml2YXRlCitPcGVuU1NIIGZvcm1hdCBmaWxlIGFuZCBwcmludCBhbiBPcGVuU1NIIHB1YmxpYyBrZXkgdG8gc3Rkb3V0LgorLkl0IEZsIHogQXIgc2VyaWFsX251bWJlcgorU3BlY2lmaWVzIGEgc2VyaWFsIG51bWJlciB0byBiZSBlbWJlZGRlZCBpbiB0aGUgY2VydGlmaWNhdGUgdG8gZGlzdGluZ3Vpc2gKK3RoaXMgY2VydGlmaWNhdGUgZnJvbSBvdGhlcnMgZnJvbSB0aGUgc2FtZSBDQS4KK1RoZSBkZWZhdWx0IHNlcmlhbCBudW1iZXIgaXMgemVyby4KKy5FbAorLlNoIE1PRFVMSSBHRU5FUkFUSU9OCisuTm0KK21heSBiZSB1c2VkIHRvIGdlbmVyYXRlIGdyb3VwcyBmb3IgdGhlIERpZmZpZS1IZWxsbWFuIEdyb3VwIEV4Y2hhbmdlCisoREgtR0VYKSBwcm90b2NvbC4KK0dlbmVyYXRpbmcgdGhlc2UgZ3JvdXBzIGlzIGEgdHdvLXN0ZXAgcHJvY2VzczogZmlyc3QsIGNhbmRpZGF0ZQorcHJpbWVzIGFyZSBnZW5lcmF0ZWQgdXNpbmcgYSBmYXN0LCBidXQgbWVtb3J5IGludGVuc2l2ZSBwcm9jZXNzLgorVGhlc2UgY2FuZGlkYXRlIHByaW1lcyBhcmUgdGhlbiB0ZXN0ZWQgZm9yIHN1aXRhYmlsaXR5IChhIENQVS1pbnRlbnNpdmUKK3Byb2Nlc3MpLgorLlBwCitHZW5lcmF0aW9uIG9mIHByaW1lcyBpcyBwZXJmb3JtZWQgdXNpbmcgdGhlCisuRmwgRworb3B0aW9uLgorVGhlIGRlc2lyZWQgbGVuZ3RoIG9mIHRoZSBwcmltZXMgbWF5IGJlIHNwZWNpZmllZCBieSB0aGUKKy5GbCBiCitvcHRpb24uCitGb3IgZXhhbXBsZToKKy5QcAorLkRsICMgc3NoLWtleWdlbiAtRyBtb2R1bGktMjA0OC5jYW5kaWRhdGVzIC1iIDIwNDgKKy5QcAorQnkgZGVmYXVsdCwgdGhlIHNlYXJjaCBmb3IgcHJpbWVzIGJlZ2lucyBhdCBhIHJhbmRvbSBwb2ludCBpbiB0aGUKK2Rlc2lyZWQgbGVuZ3RoIHJhbmdlLgorVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB1c2luZyB0aGUKKy5GbCBTCitvcHRpb24sIHdoaWNoIHNwZWNpZmllcyBhIGRpZmZlcmVudCBzdGFydCBwb2ludCAoaW4gaGV4KS4KKy5QcAorT25jZSBhIHNldCBvZiBjYW5kaWRhdGVzIGhhdmUgYmVlbiBnZW5lcmF0ZWQsIHRoZXkgbXVzdCBiZSB0ZXN0ZWQgZm9yCitzdWl0YWJpbGl0eS4KK1RoaXMgbWF5IGJlIHBlcmZvcm1lZCB1c2luZyB0aGUKKy5GbCBUCitvcHRpb24uCitJbiB0aGlzIG1vZGUKKy5ObQord2lsbCByZWFkIGNhbmRpZGF0ZXMgZnJvbSBzdGFuZGFyZCBpbnB1dCAob3IgYSBmaWxlIHNwZWNpZmllZCB1c2luZyB0aGUKKy5GbCBmCitvcHRpb24pLgorRm9yIGV4YW1wbGU6CisuUHAKKy5EbCAjIHNzaC1rZXlnZW4gLVQgbW9kdWxpLTIwNDggLWYgbW9kdWxpLTIwNDguY2FuZGlkYXRlcworLlBwCitCeSBkZWZhdWx0LCBlYWNoIGNhbmRpZGF0ZSB3aWxsIGJlIHN1YmplY3RlZCB0byAxMDAgcHJpbWFsaXR5IHRlc3RzLgorVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB1c2luZyB0aGUKKy5GbCBhCitvcHRpb24uCitUaGUgREggZ2VuZXJhdG9yIHZhbHVlIHdpbGwgYmUgY2hvc2VuIGF1dG9tYXRpY2FsbHkgZm9yIHRoZQorcHJpbWUgdW5kZXIgY29uc2lkZXJhdGlvbi4KK0lmIGEgc3BlY2lmaWMgZ2VuZXJhdG9yIGlzIGRlc2lyZWQsIGl0IG1heSBiZSByZXF1ZXN0ZWQgdXNpbmcgdGhlCisuRmwgVworb3B0aW9uLgorVmFsaWQgZ2VuZXJhdG9yIHZhbHVlcyBhcmUgMiwgMywgYW5kIDUuCisuUHAKK1NjcmVlbmVkIERIIGdyb3VwcyBtYXkgYmUgaW5zdGFsbGVkIGluCisuUGEgL2V0Yy9tb2R1bGkgLgorSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhpcyBmaWxlIGNvbnRhaW5zIG1vZHVsaSBvZiBhIHJhbmdlIG9mIGJpdCBsZW5ndGhzIGFuZAordGhhdCBib3RoIGVuZHMgb2YgYSBjb25uZWN0aW9uIHNoYXJlIGNvbW1vbiBtb2R1bGkuCisuU2ggQ0VSVElGSUNBVEVTCisuTm0KK3N1cHBvcnRzIHNpZ25pbmcgb2Yga2V5cyB0byBwcm9kdWNlIGNlcnRpZmljYXRlcyB0aGF0IG1heSBiZSB1c2VkIGZvcgordXNlciBvciBob3N0IGF1dGhlbnRpY2F0aW9uLgorQ2VydGlmaWNhdGVzIGNvbnNpc3Qgb2YgYSBwdWJsaWMga2V5LCBzb21lIGlkZW50aXR5IGluZm9ybWF0aW9uLCB6ZXJvIG9yCittb3JlIHByaW5jaXBhbCAodXNlciBvciBob3N0KSBuYW1lcyBhbmQgYSBzZXQgb2Ygb3B0aW9ucyB0aGF0CithcmUgc2lnbmVkIGJ5IGEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKENBKSBrZXkuCitDbGllbnRzIG9yIHNlcnZlcnMgbWF5IHRoZW4gdHJ1c3Qgb25seSB0aGUgQ0Ega2V5IGFuZCB2ZXJpZnkgaXRzIHNpZ25hdHVyZQorb24gYSBjZXJ0aWZpY2F0ZSByYXRoZXIgdGhhbiB0cnVzdGluZyBtYW55IHVzZXIvaG9zdCBrZXlzLgorTm90ZSB0aGF0IE9wZW5TU0ggY2VydGlmaWNhdGVzIGFyZSBhIGRpZmZlcmVudCwgYW5kIG11Y2ggc2ltcGxlciwgZm9ybWF0IHRvCit0aGUgWC41MDkgY2VydGlmaWNhdGVzIHVzZWQgaW4KKy5YciBzc2wgOCAuCisuUHAKKy5ObQorc3VwcG9ydHMgdHdvIHR5cGVzIG9mIGNlcnRpZmljYXRlczogdXNlciBhbmQgaG9zdC4KK1VzZXIgY2VydGlmaWNhdGVzIGF1dGhlbnRpY2F0ZSB1c2VycyB0byBzZXJ2ZXJzLCB3aGVyZWFzIGhvc3QgY2VydGlmaWNhdGVzCithdXRoZW50aWNhdGUgc2VydmVyIGhvc3RzIHRvIHVzZXJzLgorVG8gZ2VuZXJhdGUgYSB1c2VyIGNlcnRpZmljYXRlOgorLlBwCisuRGwgJCBzc2gta2V5Z2VuIC1zIC9wYXRoL3RvL2NhX2tleSAtSSBrZXlfaWQgL3BhdGgvdG8vdXNlcl9rZXkucHViCisuUHAKK1RoZSByZXN1bHRhbnQgY2VydGlmaWNhdGUgd2lsbCBiZSBwbGFjZWQgaW4KKy5QYSAvcGF0aC90by91c2VyX2tleS1jZXJ0LnB1YiAuCitBIGhvc3QgY2VydGlmaWNhdGUgcmVxdWlyZXMgdGhlCisuRmwgaAorb3B0aW9uOgorLlBwCisuRGwgJCBzc2gta2V5Z2VuIC1zIC9wYXRoL3RvL2NhX2tleSAtSSBrZXlfaWQgLWggL3BhdGgvdG8vaG9zdF9rZXkucHViCisuUHAKK1RoZSBob3N0IGNlcnRpZmljYXRlIHdpbGwgYmUgb3V0cHV0IHRvCisuUGEgL3BhdGgvdG8vaG9zdF9rZXktY2VydC5wdWIgLgorLlBwCitJdCBpcyBwb3NzaWJsZSB0byBzaWduIHVzaW5nIGEgQ0Ega2V5IHN0b3JlZCBpbiBhIFBLQ1MjMTEgdG9rZW4gYnkKK3Byb3ZpZGluZyB0aGUgdG9rZW4gbGlicmFyeSB1c2luZworLkZsIEQKK2FuZCBpZGVudGlmeWluZyB0aGUgQ0Ega2V5IGJ5IHByb3ZpZGluZyBpdHMgcHVibGljIGhhbGYgYXMgYW4gYXJndW1lbnQKK3RvCisuRmwgcyA6CisuUHAKKy5EbCAkIHNzaC1rZXlnZW4gLXMgY2Ffa2V5LnB1YiAtRCBsaWJwa2NzMTEuc28gLUkga2V5X2lkIGhvc3Rfa2V5LnB1YgorLlBwCitJbiBhbGwgY2FzZXMsCisuQXIga2V5X2lkCitpcyBhICJrZXkgaWRlbnRpZmllciIgdGhhdCBpcyBsb2dnZWQgYnkgdGhlIHNlcnZlciB3aGVuIHRoZSBjZXJ0aWZpY2F0ZQoraXMgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uCisuUHAKK0NlcnRpZmljYXRlcyBtYXkgYmUgbGltaXRlZCB0byBiZSB2YWxpZCBmb3IgYSBzZXQgb2YgcHJpbmNpcGFsICh1c2VyL2hvc3QpCituYW1lcy4KK0J5IGRlZmF1bHQsIGdlbmVyYXRlZCBjZXJ0aWZpY2F0ZXMgYXJlIHZhbGlkIGZvciBhbGwgdXNlcnMgb3IgaG9zdHMuCitUbyBnZW5lcmF0ZSBhIGNlcnRpZmljYXRlIGZvciBhIHNwZWNpZmllZCBzZXQgb2YgcHJpbmNpcGFsczoKKy5QcAorLkRsICQgc3NoLWtleWdlbiAtcyBjYV9rZXkgLUkga2V5X2lkIC1uIHVzZXIxLHVzZXIyIHVzZXJfa2V5LnB1YgorLkRsICIkIHNzaC1rZXlnZW4gLXMgY2Ffa2V5IC1JIGtleV9pZCAtaCAtbiBob3N0LmRvbWFpbiB1c2VyX2tleS5wdWIiCisuUHAKK0FkZGl0aW9uYWwgbGltaXRhdGlvbnMgb24gdGhlIHZhbGlkaXR5IGFuZCB1c2Ugb2YgdXNlciBjZXJ0aWZpY2F0ZXMgbWF5CitiZSBzcGVjaWZpZWQgdGhyb3VnaCBjZXJ0aWZpY2F0ZSBvcHRpb25zLgorQSBjZXJ0aWZpY2F0ZSBvcHRpb24gbWF5IGRpc2FibGUgZmVhdHVyZXMgb2YgdGhlIFNTSCBzZXNzaW9uLCBtYXkgYmUKK3ZhbGlkIG9ubHkgd2hlbiBwcmVzZW50ZWQgZnJvbSBwYXJ0aWN1bGFyIHNvdXJjZSBhZGRyZXNzZXMgb3IgbWF5Citmb3JjZSB0aGUgdXNlIG9mIGEgc3BlY2lmaWMgY29tbWFuZC4KK0ZvciBhIGxpc3Qgb2YgdmFsaWQgY2VydGlmaWNhdGUgb3B0aW9ucywgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUKKy5GbCBPCitvcHRpb24gYWJvdmUuCisuUHAKK0ZpbmFsbHksIGNlcnRpZmljYXRlcyBtYXkgYmUgZGVmaW5lZCB3aXRoIGEgdmFsaWRpdHkgbGlmZXRpbWUuCitUaGUKKy5GbCBWCitvcHRpb24gYWxsb3dzIHNwZWNpZmljYXRpb24gb2YgY2VydGlmaWNhdGUgc3RhcnQgYW5kIGVuZCB0aW1lcy4KK0EgY2VydGlmaWNhdGUgdGhhdCBpcyBwcmVzZW50ZWQgYXQgYSB0aW1lIG91dHNpZGUgdGhpcyByYW5nZSB3aWxsIG5vdCBiZQorY29uc2lkZXJlZCB2YWxpZC4KK0J5IGRlZmF1bHQsIGNlcnRpZmljYXRlcyBoYXZlIGEgbWF4aW11bSB2YWxpZGl0eSBpbnRlcnZhbC4KKy5QcAorRm9yIGNlcnRpZmljYXRlcyB0byBiZSB1c2VkIGZvciB1c2VyIG9yIGhvc3QgYXV0aGVudGljYXRpb24sIHRoZSBDQQorcHVibGljIGtleSBtdXN0IGJlIHRydXN0ZWQgYnkKKy5YciBzc2hkIDgKK29yCisuWHIgc3NoIDEgLgorUGxlYXNlIHJlZmVyIHRvIHRob3NlIG1hbnVhbCBwYWdlcyBmb3IgZGV0YWlscy4KKy5TaCBGSUxFUworLkJsIC10YWcgLXdpZHRoIERzIC1jb21wYWN0CisuSXQgUGEgfi8uc3NoL2lkZW50aXR5CitDb250YWlucyB0aGUgcHJvdG9jb2wgdmVyc2lvbiAxIFJTQSBhdXRoZW50aWNhdGlvbiBpZGVudGl0eSBvZiB0aGUgdXNlci4KK1RoaXMgZmlsZSBzaG91bGQgbm90IGJlIHJlYWRhYmxlIGJ5IGFueW9uZSBidXQgdGhlIHVzZXIuCitJdCBpcyBwb3NzaWJsZSB0bworc3BlY2lmeSBhIHBhc3NwaHJhc2Ugd2hlbiBnZW5lcmF0aW5nIHRoZSBrZXk7IHRoYXQgcGFzc3BocmFzZSB3aWxsIGJlCit1c2VkIHRvIGVuY3J5cHQgdGhlIHByaXZhdGUgcGFydCBvZiB0aGlzIGZpbGUgdXNpbmcgM0RFUy4KK1RoaXMgZmlsZSBpcyBub3QgYXV0b21hdGljYWxseSBhY2Nlc3NlZCBieQorLk5tCitidXQgaXQgaXMgb2ZmZXJlZCBhcyB0aGUgZGVmYXVsdCBmaWxlIGZvciB0aGUgcHJpdmF0ZSBrZXkuCisuWHIgc3NoIDEKK3dpbGwgcmVhZCB0aGlzIGZpbGUgd2hlbiBhIGxvZ2luIGF0dGVtcHQgaXMgbWFkZS4KKy5QcAorLkl0IFBhIH4vLnNzaC9pZGVudGl0eS5wdWIKK0NvbnRhaW5zIHRoZSBwcm90b2NvbCB2ZXJzaW9uIDEgUlNBIHB1YmxpYyBrZXkgZm9yIGF1dGhlbnRpY2F0aW9uLgorVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBzaG91bGQgYmUgYWRkZWQgdG8KKy5QYSB+Ly5zc2gvYXV0aG9yaXplZF9rZXlzCitvbiBhbGwgbWFjaGluZXMKK3doZXJlIHRoZSB1c2VyIHdpc2hlcyB0byBsb2cgaW4gdXNpbmcgUlNBIGF1dGhlbnRpY2F0aW9uLgorVGhlcmUgaXMgbm8gbmVlZCB0byBrZWVwIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgc2VjcmV0LgorLlBwCisuSXQgUGEgfi8uc3NoL2lkX2RzYQorLkl0IFBhIH4vLnNzaC9pZF9lY2RzYQorLkl0IFBhIH4vLnNzaC9pZF9yc2EKK0NvbnRhaW5zIHRoZSBwcm90b2NvbCB2ZXJzaW9uIDIgRFNBLCBFQ0RTQSBvciBSU0EgYXV0aGVudGljYXRpb24gaWRlbnRpdHkgb2YgdGhlIHVzZXIuCitUaGlzIGZpbGUgc2hvdWxkIG5vdCBiZSByZWFkYWJsZSBieSBhbnlvbmUgYnV0IHRoZSB1c2VyLgorSXQgaXMgcG9zc2libGUgdG8KK3NwZWNpZnkgYSBwYXNzcGhyYXNlIHdoZW4gZ2VuZXJhdGluZyB0aGUga2V5OyB0aGF0IHBhc3NwaHJhc2Ugd2lsbCBiZQordXNlZCB0byBlbmNyeXB0IHRoZSBwcml2YXRlIHBhcnQgb2YgdGhpcyBmaWxlIHVzaW5nIDEyOC1iaXQgQUVTLgorVGhpcyBmaWxlIGlzIG5vdCBhdXRvbWF0aWNhbGx5IGFjY2Vzc2VkIGJ5CisuTm0KK2J1dCBpdCBpcyBvZmZlcmVkIGFzIHRoZSBkZWZhdWx0IGZpbGUgZm9yIHRoZSBwcml2YXRlIGtleS4KKy5YciBzc2ggMQord2lsbCByZWFkIHRoaXMgZmlsZSB3aGVuIGEgbG9naW4gYXR0ZW1wdCBpcyBtYWRlLgorLlBwCisuSXQgUGEgfi8uc3NoL2lkX2RzYS5wdWIKKy5JdCBQYSB+Ly5zc2gvaWRfZWNkc2EucHViCisuSXQgUGEgfi8uc3NoL2lkX3JzYS5wdWIKK0NvbnRhaW5zIHRoZSBwcm90b2NvbCB2ZXJzaW9uIDIgRFNBLCBFQ0RTQSBvciBSU0EgcHVibGljIGtleSBmb3IgYXV0aGVudGljYXRpb24uCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIHNob3VsZCBiZSBhZGRlZCB0bworLlBhIH4vLnNzaC9hdXRob3JpemVkX2tleXMKK29uIGFsbCBtYWNoaW5lcword2hlcmUgdGhlIHVzZXIgd2lzaGVzIHRvIGxvZyBpbiB1c2luZyBwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uLgorVGhlcmUgaXMgbm8gbmVlZCB0byBrZWVwIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgc2VjcmV0LgorLlBwCisuSXQgUGEgL2V0Yy9tb2R1bGkKK0NvbnRhaW5zIERpZmZpZS1IZWxsbWFuIGdyb3VwcyB1c2VkIGZvciBESC1HRVguCitUaGUgZmlsZSBmb3JtYXQgaXMgZGVzY3JpYmVkIGluCisuWHIgbW9kdWxpIDUgLgorLkVsCisuU2ggU0VFIEFMU08KKy5YciBzc2ggMSAsCisuWHIgc3NoLWFkZCAxICwKKy5YciBzc2gtYWdlbnQgMSAsCisuWHIgbW9kdWxpIDUgLAorLlhyIHNzaGQgOAorLlJzCisuJVIgUkZDIDQ3MTYKKy4lVCAiVGhlIFNlY3VyZSBTaGVsbCAoU1NIKSBQdWJsaWMgS2V5IEZpbGUgRm9ybWF0IgorLiVEIDIwMDYKKy5SZQorLlNoIEFVVEhPUlMKK09wZW5TU0ggaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBhbmQgZnJlZQorc3NoIDEuMi4xMiByZWxlYXNlIGJ5IFRhdHUgWWxvbmVuLgorQWFyb24gQ2FtcGJlbGwsIEJvYiBCZWNrLCBNYXJrdXMgRnJpZWRsLCBOaWVscyBQcm92b3MsCitUaGVvIGRlIFJhYWR0IGFuZCBEdWcgU29uZworcmVtb3ZlZCBtYW55IGJ1Z3MsIHJlLWFkZGVkIG5ld2VyIGZlYXR1cmVzIGFuZAorY3JlYXRlZCBPcGVuU1NILgorTWFya3VzIEZyaWVkbCBjb250cmlidXRlZCB0aGUgc3VwcG9ydCBmb3IgU1NICitwcm90b2NvbCB2ZXJzaW9ucyAxLjUgYW5kIDIuMC4KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc3NoLWtleWdlbi5jIGIvb3BlbnNzaC02LjBwMS9zc2gta2V5Z2VuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjZDNhMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc3NoLWtleWdlbi5jCkBAIC0wLDAgKzEsMjM4MCBAQAorLyogJE9wZW5CU0Q6IHNzaC1rZXlnZW4uYyx2IDEuMjEyIDIwMTEvMTAvMTYgMTU6MDI6NDEgam1jIEV4cCAkICovCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NCBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICogSWRlbnRpdHkgYW5kIGhvc3Qga2V5IGdlbmVyYXRpb24gYW5kIG1haW50ZW5hbmNlLgorICoKKyAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKKyAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCisgKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCisgKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCisgKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKyNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9vcGVuc3NsLWNvbXBhdC5oIgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaWZkZWYgSEFWRV9QQVRIU19ICisjIGluY2x1ZGUgPHBhdGhzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgInJzYS5oIgorI2luY2x1ZGUgImF1dGhmaWxlLmgiCisjaW5jbHVkZSAidXVlbmNvZGUuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJwYXRobmFtZXMuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAibWF0Y2guaCIKKyNpbmNsdWRlICJob3N0ZmlsZS5oIgorI2luY2x1ZGUgImRucy5oIgorI2luY2x1ZGUgInNzaDIuaCIKKyNpbmNsdWRlICJzc2gtcGtjczExLmgiCisKKy8qIE51bWJlciBvZiBiaXRzIGluIHRoZSBSU0EvRFNBIGtleS4gIFRoaXMgdmFsdWUgY2FuIGJlIHNldCBvbiB0aGUgY29tbWFuZCBsaW5lLiAqLworI2RlZmluZSBERUZBVUxUX0JJVFMJCTIwNDgKKyNkZWZpbmUgREVGQVVMVF9CSVRTX0RTQQkxMDI0CisjZGVmaW5lIERFRkFVTFRfQklUU19FQ0RTQQkyNTYKK3VfaW50MzJfdCBiaXRzID0gMDsKKworLyoKKyAqIEZsYWcgaW5kaWNhdGluZyB0aGF0IHdlIGp1c3Qgd2FudCB0byBjaGFuZ2UgdGhlIHBhc3NwaHJhc2UuICBUaGlzIGNhbiBiZQorICogc2V0IG9uIHRoZSBjb21tYW5kIGxpbmUuCisgKi8KK2ludCBjaGFuZ2VfcGFzc3BocmFzZSA9IDA7CisKKy8qCisgKiBGbGFnIGluZGljYXRpbmcgdGhhdCB3ZSBqdXN0IHdhbnQgdG8gY2hhbmdlIHRoZSBjb21tZW50LiAgVGhpcyBjYW4gYmUgc2V0CisgKiBvbiB0aGUgY29tbWFuZCBsaW5lLgorICovCitpbnQgY2hhbmdlX2NvbW1lbnQgPSAwOworCitpbnQgcXVpZXQgPSAwOworCitpbnQgbG9nX2xldmVsID0gU1lTTE9HX0xFVkVMX0lORk87CisKKy8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IHdlIHdhbnQgdG8gaGFzaCBhIGtub3duX2hvc3RzIGZpbGUgKi8KK2ludCBoYXNoX2hvc3RzID0gMDsKKy8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IHdlIHdhbnQgbG9va3VwIGEgaG9zdCBpbiBrbm93bl9ob3N0cyBmaWxlICovCitpbnQgZmluZF9ob3N0ID0gMDsKKy8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IHdlIHdhbnQgdG8gZGVsZXRlIGEgaG9zdCBmcm9tIGEga25vd25faG9zdHMgZmlsZSAqLworaW50IGRlbGV0ZV9ob3N0ID0gMDsKKworLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgd2Ugd2FudCB0byBzaG93IHRoZSBjb250ZW50cyBvZiBhIGNlcnRpZmljYXRlICovCitpbnQgc2hvd19jZXJ0ID0gMDsKKworLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgd2UganVzdCB3YW50IHRvIHNlZSB0aGUga2V5IGZpbmdlcnByaW50ICovCitpbnQgcHJpbnRfZmluZ2VycHJpbnQgPSAwOworaW50IHByaW50X2J1YmJsZWJhYmJsZSA9IDA7CisKKy8qIFRoZSBpZGVudGl0eSBmaWxlIG5hbWUsIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUgb3IgZW50ZXJlZCBieSB0aGUgdXNlci4gKi8KK2NoYXIgaWRlbnRpdHlfZmlsZVsxMDI0XTsKK2ludCBoYXZlX2lkZW50aXR5ID0gMDsKKworLyogVGhpcyBpcyBzZXQgdG8gdGhlIHBhc3NwaHJhc2UgaWYgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4gKi8KK2NoYXIgKmlkZW50aXR5X3Bhc3NwaHJhc2UgPSBOVUxMOworCisvKiBUaGlzIGlzIHNldCB0byB0aGUgbmV3IHBhc3NwaHJhc2UgaWYgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4gKi8KK2NoYXIgKmlkZW50aXR5X25ld19wYXNzcGhyYXNlID0gTlVMTDsKKworLyogVGhpcyBpcyBzZXQgdG8gdGhlIG5ldyBjb21tZW50IGlmIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuICovCitjaGFyICppZGVudGl0eV9jb21tZW50ID0gTlVMTDsKKworLyogUGF0aCB0byBDQSBrZXkgd2hlbiBjZXJ0aWZ5aW5nIGtleXMuICovCitjaGFyICpjYV9rZXlfcGF0aCA9IE5VTEw7CisKKy8qIENlcnRpZmljYXRlIHNlcmlhbCBudW1iZXIgKi8KK2xvbmcgbG9uZyBjZXJ0X3NlcmlhbCA9IDA7CisKKy8qIEtleSB0eXBlIHdoZW4gY2VydGlmeWluZyAqLwordV9pbnQgY2VydF9rZXlfdHlwZSA9IFNTSDJfQ0VSVF9UWVBFX1VTRVI7CisKKy8qICJrZXkgSUQiIG9mIHNpZ25lZCBrZXkgKi8KK2NoYXIgKmNlcnRfa2V5X2lkID0gTlVMTDsKKworLyogQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcHJpbmNpcGFsIG5hbWVzIGZvciBjZXJ0aWZ5aW5nIGtleXMgKi8KK2NoYXIgKmNlcnRfcHJpbmNpcGFscyA9IE5VTEw7CisKKy8qIFZhbGlkaXR5IHBlcmlvZCBmb3IgY2VydGlmaWNhdGVzICovCit1X2ludDY0X3QgY2VydF92YWxpZF9mcm9tID0gMDsKK3VfaW50NjRfdCBjZXJ0X3ZhbGlkX3RvID0gfjBVTEw7CisKKy8qIENlcnRpZmljYXRlIG9wdGlvbnMgKi8KKyNkZWZpbmUgQ0VSVE9QVF9YX0ZXRAkoMSkKKyNkZWZpbmUgQ0VSVE9QVF9BR0VOVF9GV0QJKDE8PDEpCisjZGVmaW5lIENFUlRPUFRfUE9SVF9GV0QJKDE8PDIpCisjZGVmaW5lIENFUlRPUFRfUFRZCQkoMTw8MykKKyNkZWZpbmUgQ0VSVE9QVF9VU0VSX1JDCSgxPDw0KQorI2RlZmluZSBDRVJUT1BUX0RFRkFVTFQJKENFUlRPUFRfWF9GV0R8Q0VSVE9QVF9BR0VOVF9GV0R8IFwKKwkJCSBDRVJUT1BUX1BPUlRfRldEfENFUlRPUFRfUFRZfENFUlRPUFRfVVNFUl9SQykKK3VfaW50MzJfdCBjZXJ0ZmxhZ3NfZmxhZ3MgPSBDRVJUT1BUX0RFRkFVTFQ7CitjaGFyICpjZXJ0ZmxhZ3NfY29tbWFuZCA9IE5VTEw7CitjaGFyICpjZXJ0ZmxhZ3Nfc3JjX2FkZHIgPSBOVUxMOworCisvKiBDb252ZXJzaW9uIHRvL2Zyb20gdmFyaW91cyBmb3JtYXRzICovCitpbnQgY29udmVydF90byA9IDA7CitpbnQgY29udmVydF9mcm9tID0gMDsKK2VudW0geworCUZNVF9SRkM0NzE2LAorCUZNVF9QS0NTOCwKKwlGTVRfUEVNCit9IGNvbnZlcnRfZm9ybWF0ID0gRk1UX1JGQzQ3MTY7CitpbnQgcHJpbnRfcHVibGljID0gMDsKK2ludCBwcmludF9nZW5lcmljID0gMDsKKworY2hhciAqa2V5X3R5cGVfbmFtZSA9IE5VTEw7CisKKy8qIExvYWQga2V5IGZyb20gdGhpcyBQS0NTIzExIHByb3ZpZGVyICovCitjaGFyICpwa2NzMTFwcm92aWRlciA9IE5VTEw7CisKKy8qIGFyZ3YwICovCitleHRlcm4gY2hhciAqX19wcm9nbmFtZTsKKworY2hhciBob3N0bmFtZVtNQVhIT1NUTkFNRUxFTl07CisKKy8qIG1vZHVsaS5jICovCitpbnQgZ2VuX2NhbmRpZGF0ZXMoRklMRSAqLCB1X2ludDMyX3QsIHVfaW50MzJfdCwgQklHTlVNICopOworaW50IHByaW1lX3Rlc3QoRklMRSAqLCBGSUxFICosIHVfaW50MzJfdCwgdV9pbnQzMl90LCBjaGFyICopOworCitzdGF0aWMgdm9pZAordHlwZV9iaXRzX3ZhbGlkKGludCB0eXBlLCB1X2ludDMyX3QgKmJpdHNwKQoreworCXVfaW50IG1heGJpdHM7CisKKwlpZiAodHlwZSA9PSBLRVlfVU5TUEVDKSB7CisJCWZwcmludGYoc3RkZXJyLCAidW5rbm93biBrZXkgdHlwZSAlc1xuIiwga2V5X3R5cGVfbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCWlmICgqYml0c3AgPT0gMCkgeworCQlpZiAodHlwZSA9PSBLRVlfRFNBKQorCQkJKmJpdHNwID0gREVGQVVMVF9CSVRTX0RTQTsKKwkJZWxzZSBpZiAodHlwZSA9PSBLRVlfRUNEU0EpCisJCQkqYml0c3AgPSBERUZBVUxUX0JJVFNfRUNEU0E7CisJCWVsc2UKKwkJCSpiaXRzcCA9IERFRkFVTFRfQklUUzsKKwl9CisJbWF4Yml0cyA9ICh0eXBlID09IEtFWV9EU0EpID8KKwkgICAgT1BFTlNTTF9EU0FfTUFYX01PRFVMVVNfQklUUyA6IE9QRU5TU0xfUlNBX01BWF9NT0RVTFVTX0JJVFM7CisJaWYgKCpiaXRzcCA+IG1heGJpdHMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJrZXkgYml0cyBleGNlZWRzIG1heGltdW0gJWRcbiIsIG1heGJpdHMpOworCQlleGl0KDEpOworCX0KKwlpZiAodHlwZSA9PSBLRVlfRFNBICYmICpiaXRzcCAhPSAxMDI0KQorCQlmYXRhbCgiRFNBIGtleXMgbXVzdCBiZSAxMDI0IGJpdHMiKTsKKwllbHNlIGlmICh0eXBlICE9IEtFWV9FQ0RTQSAmJiAqYml0c3AgPCA3NjgpCisJCWZhdGFsKCJLZXkgbXVzdCBhdCBsZWFzdCBiZSA3NjggYml0cyIpOworCWVsc2UgaWYgKHR5cGUgPT0gS0VZX0VDRFNBICYmIGtleV9lY2RzYV9iaXRzX3RvX25pZCgqYml0c3ApID09IC0xKQorCQlmYXRhbCgiSW52YWxpZCBFQ0RTQSBrZXkgbGVuZ3RoIC0gdmFsaWQgbGVuZ3RocyBhcmUgIgorCQkgICAgIjI1NiwgMzg0IG9yIDUyMSBiaXRzIik7Cit9CisKK3N0YXRpYyB2b2lkCithc2tfZmlsZW5hbWUoc3RydWN0IHBhc3N3ZCAqcHcsIGNvbnN0IGNoYXIgKnByb21wdCkKK3sKKwljaGFyIGJ1ZlsxMDI0XTsKKwljaGFyICpuYW1lID0gTlVMTDsKKworCWlmIChrZXlfdHlwZV9uYW1lID09IE5VTEwpCisJCW5hbWUgPSBfUEFUSF9TU0hfQ0xJRU5UX0lEX1JTQTsKKwllbHNlIHsKKwkJc3dpdGNoIChrZXlfdHlwZV9mcm9tX25hbWUoa2V5X3R5cGVfbmFtZSkpIHsKKwkJY2FzZSBLRVlfUlNBMToKKwkJCW5hbWUgPSBfUEFUSF9TU0hfQ0xJRU5UX0lERU5USVRZOworCQkJYnJlYWs7CisJCWNhc2UgS0VZX0RTQV9DRVJUOgorCQljYXNlIEtFWV9EU0FfQ0VSVF9WMDA6CisJCWNhc2UgS0VZX0RTQToKKwkJCW5hbWUgPSBfUEFUSF9TU0hfQ0xJRU5UX0lEX0RTQTsKKwkJCWJyZWFrOworI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworCQljYXNlIEtFWV9FQ0RTQV9DRVJUOgorCQljYXNlIEtFWV9FQ0RTQToKKwkJCW5hbWUgPSBfUEFUSF9TU0hfQ0xJRU5UX0lEX0VDRFNBOworCQkJYnJlYWs7CisjZW5kaWYKKwkJY2FzZSBLRVlfUlNBX0NFUlQ6CisJCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKKwkJY2FzZSBLRVlfUlNBOgorCQkJbmFtZSA9IF9QQVRIX1NTSF9DTElFTlRfSURfUlNBOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKHN0ZGVyciwgImJhZCBrZXkgdHlwZVxuIik7CisJCQlleGl0KDEpOworCQkJYnJlYWs7CisJCX0KKwl9CisJc25wcmludGYoaWRlbnRpdHlfZmlsZSwgc2l6ZW9mKGlkZW50aXR5X2ZpbGUpLCAiJXMvJXMiLCBwdy0+cHdfZGlyLCBuYW1lKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzICglcyk6ICIsIHByb21wdCwgaWRlbnRpdHlfZmlsZSk7CisJaWYgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHN0ZGluKSA9PSBOVUxMKQorCQlleGl0KDEpOworCWJ1ZltzdHJjc3BuKGJ1ZiwgIlxuIildID0gJ1wwJzsKKwlpZiAoc3RyY21wKGJ1ZiwgIiIpICE9IDApCisJCXN0cmxjcHkoaWRlbnRpdHlfZmlsZSwgYnVmLCBzaXplb2YoaWRlbnRpdHlfZmlsZSkpOworCWhhdmVfaWRlbnRpdHkgPSAxOworfQorCitzdGF0aWMgS2V5ICoKK2xvYWRfaWRlbnRpdHkoY2hhciAqZmlsZW5hbWUpCit7CisJY2hhciAqcGFzczsKKwlLZXkgKnBydjsKKworCXBydiA9IGtleV9sb2FkX3ByaXZhdGUoZmlsZW5hbWUsICIiLCBOVUxMKTsKKwlpZiAocHJ2ID09IE5VTEwpIHsKKwkJaWYgKGlkZW50aXR5X3Bhc3NwaHJhc2UpCisJCQlwYXNzID0geHN0cmR1cChpZGVudGl0eV9wYXNzcGhyYXNlKTsKKwkJZWxzZQorCQkJcGFzcyA9IHJlYWRfcGFzc3BocmFzZSgiRW50ZXIgcGFzc3BocmFzZTogIiwKKwkJCSAgICBSUF9BTExPV19TVERJTik7CisJCXBydiA9IGtleV9sb2FkX3ByaXZhdGUoZmlsZW5hbWUsIHBhc3MsIE5VTEwpOworCQltZW1zZXQocGFzcywgMCwgc3RybGVuKHBhc3MpKTsKKwkJeGZyZWUocGFzcyk7CisJfQorCXJldHVybiBwcnY7Cit9CisKKyNkZWZpbmUgU1NIX0NPTV9QVUJMSUNfQkVHSU4JCSItLS0tIEJFR0lOIFNTSDIgUFVCTElDIEtFWSAtLS0tIgorI2RlZmluZSBTU0hfQ09NX1BVQkxJQ19FTkQJCSItLS0tIEVORCBTU0gyIFBVQkxJQyBLRVkgLS0tLSIKKyNkZWZpbmUgU1NIX0NPTV9QUklWQVRFX0JFR0lOCQkiLS0tLSBCRUdJTiBTU0gyIEVOQ1JZUFRFRCBQUklWQVRFIEtFWSAtLS0tIgorI2RlZmluZQlTU0hfQ09NX1BSSVZBVEVfS0VZX01BR0lDCTB4M2Y2ZmY5ZWIKKworc3RhdGljIHZvaWQKK2RvX2NvbnZlcnRfdG9fc3NoMihzdHJ1Y3QgcGFzc3dkICpwdywgS2V5ICprKQoreworCXVfaW50IGxlbjsKKwl1X2NoYXIgKmJsb2I7CisJY2hhciBjb21tZW50WzYxXTsKKworCWlmIChrZXlfdG9fYmxvYihrLCAmYmxvYiwgJmxlbikgPD0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImtleV90b19ibG9iIGZhaWxlZFxuIik7CisJCWV4aXQoMSk7CisJfQorCS8qIENvbW1lbnQgKyBzdXJyb3VuZHMgbXVzdCBmaXQgaW50byA3MiBjaGFycyAoUkZDIDQ3MTYgc2VjIDMuMykgKi8KKwlzbnByaW50Zihjb21tZW50LCBzaXplb2YoY29tbWVudCksCisJICAgICIldS1iaXQgJXMsIGNvbnZlcnRlZCBieSAlc0AlcyBmcm9tIE9wZW5TU0giLAorCSAgICBrZXlfc2l6ZShrKSwga2V5X3R5cGUoayksCisJICAgIHB3LT5wd19uYW1lLCBob3N0bmFtZSk7CisKKwlmcHJpbnRmKHN0ZG91dCwgIiVzXG4iLCBTU0hfQ09NX1BVQkxJQ19CRUdJTik7CisJZnByaW50ZihzdGRvdXQsICJDb21tZW50OiBcIiVzXCJcbiIsIGNvbW1lbnQpOworCWR1bXBfYmFzZTY0KHN0ZG91dCwgYmxvYiwgbGVuKTsKKwlmcHJpbnRmKHN0ZG91dCwgIiVzXG4iLCBTU0hfQ09NX1BVQkxJQ19FTkQpOworCWtleV9mcmVlKGspOworCXhmcmVlKGJsb2IpOworCWV4aXQoMCk7Cit9CisKK3N0YXRpYyB2b2lkCitkb19jb252ZXJ0X3RvX3BrY3M4KEtleSAqaykKK3sKKwlzd2l0Y2ggKGtleV90eXBlX3BsYWluKGstPnR5cGUpKSB7CisJY2FzZSBLRVlfUlNBOgorCQlpZiAoIVBFTV93cml0ZV9SU0FfUFVCS0VZKHN0ZG91dCwgay0+cnNhKSkKKwkJCWZhdGFsKCJQRU1fd3JpdGVfUlNBX1BVQktFWSBmYWlsZWQiKTsKKwkJYnJlYWs7CisJY2FzZSBLRVlfRFNBOgorCQlpZiAoIVBFTV93cml0ZV9EU0FfUFVCS0VZKHN0ZG91dCwgay0+ZHNhKSkKKwkJCWZhdGFsKCJQRU1fd3JpdGVfRFNBX1BVQktFWSBmYWlsZWQiKTsKKwkJYnJlYWs7CisjaWZkZWYgT1BFTlNTTF9IQVNfRUNDCisJY2FzZSBLRVlfRUNEU0E6CisJCWlmICghUEVNX3dyaXRlX0VDX1BVQktFWShzdGRvdXQsIGstPmVjZHNhKSkKKwkJCWZhdGFsKCJQRU1fd3JpdGVfRUNfUFVCS0VZIGZhaWxlZCIpOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCWZhdGFsKCIlczogdW5zdXBwb3J0ZWQga2V5IHR5cGUgJXMiLCBfX2Z1bmNfXywga2V5X3R5cGUoaykpOworCX0KKwlleGl0KDApOworfQorCitzdGF0aWMgdm9pZAorZG9fY29udmVydF90b19wZW0oS2V5ICprKQoreworCXN3aXRjaCAoa2V5X3R5cGVfcGxhaW4oay0+dHlwZSkpIHsKKwljYXNlIEtFWV9SU0E6CisJCWlmICghUEVNX3dyaXRlX1JTQVB1YmxpY0tleShzdGRvdXQsIGstPnJzYSkpCisJCQlmYXRhbCgiUEVNX3dyaXRlX1JTQVB1YmxpY0tleSBmYWlsZWQiKTsKKwkJYnJlYWs7CisjaWYgbm90eWV0IC8qIE9wZW5TU0ggMC45LjggbGFja3MgdGhpcyBmdW5jdGlvbiAqLworCWNhc2UgS0VZX0RTQToKKwkJaWYgKCFQRU1fd3JpdGVfRFNBUHVibGljS2V5KHN0ZG91dCwgay0+ZHNhKSkKKwkJCWZhdGFsKCJQRU1fd3JpdGVfRFNBUHVibGljS2V5IGZhaWxlZCIpOworCQlicmVhazsKKyNlbmRpZgorCS8qIFhYWCBFQ0RTQT8gKi8KKwlkZWZhdWx0OgorCQlmYXRhbCgiJXM6IHVuc3VwcG9ydGVkIGtleSB0eXBlICVzIiwgX19mdW5jX18sIGtleV90eXBlKGspKTsKKwl9CisJZXhpdCgwKTsKK30KKworc3RhdGljIHZvaWQKK2RvX2NvbnZlcnRfdG8oc3RydWN0IHBhc3N3ZCAqcHcpCit7CisJS2V5ICprOworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKCFoYXZlX2lkZW50aXR5KQorCQlhc2tfZmlsZW5hbWUocHcsICJFbnRlciBmaWxlIGluIHdoaWNoIHRoZSBrZXkgaXMiKTsKKwlpZiAoc3RhdChpZGVudGl0eV9maWxlLCAmc3QpIDwgMCkKKwkJZmF0YWwoIiVzOiAlczogJXMiLCBfX3Byb2duYW1lLCBpZGVudGl0eV9maWxlLCBzdHJlcnJvcihlcnJubykpOworCWlmICgoayA9IGtleV9sb2FkX3B1YmxpYyhpZGVudGl0eV9maWxlLCBOVUxMKSkgPT0gTlVMTCkgeworCQlpZiAoKGsgPSBsb2FkX2lkZW50aXR5KGlkZW50aXR5X2ZpbGUpKSA9PSBOVUxMKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImxvYWQgZmFpbGVkXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisJaWYgKGstPnR5cGUgPT0gS0VZX1JTQTEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJ2ZXJzaW9uIDEga2V5cyBhcmUgbm90IHN1cHBvcnRlZFxuIik7CisJCWV4aXQoMSk7CisJfQorCisJc3dpdGNoIChjb252ZXJ0X2Zvcm1hdCkgeworCWNhc2UgRk1UX1JGQzQ3MTY6CisJCWRvX2NvbnZlcnRfdG9fc3NoMihwdywgayk7CisJCWJyZWFrOworCWNhc2UgRk1UX1BLQ1M4OgorCQlkb19jb252ZXJ0X3RvX3BrY3M4KGspOworCQlicmVhazsKKwljYXNlIEZNVF9QRU06CisJCWRvX2NvbnZlcnRfdG9fcGVtKGspOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmYXRhbCgiJXM6IHVua25vd24ga2V5IGZvcm1hdCAlZCIsIF9fZnVuY19fLCBjb252ZXJ0X2Zvcm1hdCk7CisJfQorCWV4aXQoMCk7Cit9CisKK3N0YXRpYyB2b2lkCitidWZmZXJfZ2V0X2JpZ251bV9iaXRzKEJ1ZmZlciAqYiwgQklHTlVNICp2YWx1ZSkKK3sKKwl1X2ludCBiaWdudW1fYml0cyA9IGJ1ZmZlcl9nZXRfaW50KGIpOworCXVfaW50IGJ5dGVzID0gKGJpZ251bV9iaXRzICsgNykgLyA4OworCisJaWYgKGJ1ZmZlcl9sZW4oYikgPCBieXRlcykKKwkJZmF0YWwoImJ1ZmZlcl9nZXRfYmlnbnVtX2JpdHM6IGlucHV0IGJ1ZmZlciB0b28gc21hbGw6ICIKKwkJICAgICJuZWVkICVkIGhhdmUgJWQiLCBieXRlcywgYnVmZmVyX2xlbihiKSk7CisJaWYgKEJOX2JpbjJibihidWZmZXJfcHRyKGIpLCBieXRlcywgdmFsdWUpID09IE5VTEwpCisJCWZhdGFsKCJidWZmZXJfZ2V0X2JpZ251bV9iaXRzOiBCTl9iaW4yYm4gZmFpbGVkIik7CisJYnVmZmVyX2NvbnN1bWUoYiwgYnl0ZXMpOworfQorCitzdGF0aWMgS2V5ICoKK2RvX2NvbnZlcnRfcHJpdmF0ZV9zc2gyX2Zyb21fYmxvYih1X2NoYXIgKmJsb2IsIHVfaW50IGJsZW4pCit7CisJQnVmZmVyIGI7CisJS2V5ICprZXkgPSBOVUxMOworCWNoYXIgKnR5cGUsICpjaXBoZXI7CisJdV9jaGFyICpzaWcsIGRhdGFbXSA9ICJhYmNkZTEyMzQ1IjsKKwlpbnQgbWFnaWMsIHJsZW4sIGt0eXBlLCBpMSwgaTIsIGkzLCBpNDsKKwl1X2ludCBzbGVuOworCXVfbG9uZyBlOworCisJYnVmZmVyX2luaXQoJmIpOworCWJ1ZmZlcl9hcHBlbmQoJmIsIGJsb2IsIGJsZW4pOworCisJbWFnaWMgPSBidWZmZXJfZ2V0X2ludCgmYik7CisJaWYgKG1hZ2ljICE9IFNTSF9DT01fUFJJVkFURV9LRVlfTUFHSUMpIHsKKwkJZXJyb3IoImJhZCBtYWdpYyAweCV4ICE9IDB4JXgiLCBtYWdpYywgU1NIX0NPTV9QUklWQVRFX0tFWV9NQUdJQyk7CisJCWJ1ZmZlcl9mcmVlKCZiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWkxID0gYnVmZmVyX2dldF9pbnQoJmIpOworCXR5cGUgICA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZiLCBOVUxMKTsKKwljaXBoZXIgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgTlVMTCk7CisJaTIgPSBidWZmZXJfZ2V0X2ludCgmYik7CisJaTMgPSBidWZmZXJfZ2V0X2ludCgmYik7CisJaTQgPSBidWZmZXJfZ2V0X2ludCgmYik7CisJZGVidWcoImlnbm9yZSAoJWQgJWQgJWQgJWQpIiwgaTEsIGkyLCBpMywgaTQpOworCWlmIChzdHJjbXAoY2lwaGVyLCAibm9uZSIpICE9IDApIHsKKwkJZXJyb3IoInVuc3VwcG9ydGVkIGNpcGhlciAlcyIsIGNpcGhlcik7CisJCXhmcmVlKGNpcGhlcik7CisJCWJ1ZmZlcl9mcmVlKCZiKTsKKwkJeGZyZWUodHlwZSk7CisJCXJldHVybiBOVUxMOworCX0KKwl4ZnJlZShjaXBoZXIpOworCisJaWYgKHN0cnN0cih0eXBlLCAiZHNhIikpIHsKKwkJa3R5cGUgPSBLRVlfRFNBOworCX0gZWxzZSBpZiAoc3Ryc3RyKHR5cGUsICJyc2EiKSkgeworCQlrdHlwZSA9IEtFWV9SU0E7CisJfSBlbHNlIHsKKwkJYnVmZmVyX2ZyZWUoJmIpOworCQl4ZnJlZSh0eXBlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWtleSA9IGtleV9uZXdfcHJpdmF0ZShrdHlwZSk7CisJeGZyZWUodHlwZSk7CisKKwlzd2l0Y2ggKGtleS0+dHlwZSkgeworCWNhc2UgS0VZX0RTQToKKwkJYnVmZmVyX2dldF9iaWdudW1fYml0cygmYiwga2V5LT5kc2EtPnApOworCQlidWZmZXJfZ2V0X2JpZ251bV9iaXRzKCZiLCBrZXktPmRzYS0+Zyk7CisJCWJ1ZmZlcl9nZXRfYmlnbnVtX2JpdHMoJmIsIGtleS0+ZHNhLT5xKTsKKwkJYnVmZmVyX2dldF9iaWdudW1fYml0cygmYiwga2V5LT5kc2EtPnB1Yl9rZXkpOworCQlidWZmZXJfZ2V0X2JpZ251bV9iaXRzKCZiLCBrZXktPmRzYS0+cHJpdl9rZXkpOworCQlicmVhazsKKwljYXNlIEtFWV9SU0E6CisJCWUgPSBidWZmZXJfZ2V0X2NoYXIoJmIpOworCQlkZWJ1ZygiZSAlbHgiLCBlKTsKKwkJaWYgKGUgPCAzMCkgeworCQkJZSA8PD0gODsKKwkJCWUgKz0gYnVmZmVyX2dldF9jaGFyKCZiKTsKKwkJCWRlYnVnKCJlICVseCIsIGUpOworCQkJZSA8PD0gODsKKwkJCWUgKz0gYnVmZmVyX2dldF9jaGFyKCZiKTsKKwkJCWRlYnVnKCJlICVseCIsIGUpOworCQl9CisJCWlmICghQk5fc2V0X3dvcmQoa2V5LT5yc2EtPmUsIGUpKSB7CisJCQlidWZmZXJfZnJlZSgmYik7CisJCQlrZXlfZnJlZShrZXkpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJYnVmZmVyX2dldF9iaWdudW1fYml0cygmYiwga2V5LT5yc2EtPmQpOworCQlidWZmZXJfZ2V0X2JpZ251bV9iaXRzKCZiLCBrZXktPnJzYS0+bik7CisJCWJ1ZmZlcl9nZXRfYmlnbnVtX2JpdHMoJmIsIGtleS0+cnNhLT5pcW1wKTsKKwkJYnVmZmVyX2dldF9iaWdudW1fYml0cygmYiwga2V5LT5yc2EtPnEpOworCQlidWZmZXJfZ2V0X2JpZ251bV9iaXRzKCZiLCBrZXktPnJzYS0+cCk7CisJCXJzYV9nZW5lcmF0ZV9hZGRpdGlvbmFsX3BhcmFtZXRlcnMoa2V5LT5yc2EpOworCQlicmVhazsKKwl9CisJcmxlbiA9IGJ1ZmZlcl9sZW4oJmIpOworCWlmIChybGVuICE9IDApCisJCWVycm9yKCJkb19jb252ZXJ0X3ByaXZhdGVfc3NoMl9mcm9tX2Jsb2I6ICIKKwkJICAgICJyZW1haW5pbmcgYnl0ZXMgaW4ga2V5IGJsb2IgJWQiLCBybGVuKTsKKwlidWZmZXJfZnJlZSgmYik7CisKKwkvKiB0cnkgdGhlIGtleSAqLworCWtleV9zaWduKGtleSwgJnNpZywgJnNsZW4sIGRhdGEsIHNpemVvZihkYXRhKSk7CisJa2V5X3ZlcmlmeShrZXksIHNpZywgc2xlbiwgZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKwl4ZnJlZShzaWcpOworCXJldHVybiBrZXk7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9saW5lKEZJTEUgKmZwLCBjaGFyICpsaW5lLCBzaXplX3QgbGVuKQoreworCWludCBjOworCXNpemVfdCBwb3MgPSAwOworCisJbGluZVswXSA9ICdcMCc7CisJd2hpbGUgKChjID0gZmdldGMoZnApKSAhPSBFT0YpIHsKKwkJaWYgKHBvcyA+PSBsZW4gLSAxKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImlucHV0IGxpbmUgdG9vIGxvbmcuXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ1xyJzoKKwkJCWMgPSBmZ2V0YyhmcCk7CisJCQlpZiAoYyAhPSBFT0YgJiYgYyAhPSAnXG4nICYmIHVuZ2V0YyhjLCBmcCkgPT0gRU9GKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJ1bmdldDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCXJldHVybiBwb3M7CisJCWNhc2UgJ1xuJzoKKwkJCXJldHVybiBwb3M7CisJCX0KKwkJbGluZVtwb3MrK10gPSBjOworCQlsaW5lW3Bvc10gPSAnXDAnOworCX0KKwkvKiBXZSByZWFjaGVkIEVPRiAqLworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQKK2RvX2NvbnZlcnRfZnJvbV9zc2gyKHN0cnVjdCBwYXNzd2QgKnB3LCBLZXkgKiprLCBpbnQgKnByaXZhdGUpCit7CisJaW50IGJsZW47CisJdV9pbnQgbGVuOworCWNoYXIgbGluZVsxMDI0XTsKKwl1X2NoYXIgYmxvYls4MDk2XTsKKwljaGFyIGVuY29kZWRbODA5Nl07CisJaW50IGVzY2FwZWQgPSAwOworCUZJTEUgKmZwOworCisJaWYgKChmcCA9IGZvcGVuKGlkZW50aXR5X2ZpbGUsICJyIikpID09IE5VTEwpCisJCWZhdGFsKCIlczogJXM6ICVzIiwgX19wcm9nbmFtZSwgaWRlbnRpdHlfZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKwllbmNvZGVkWzBdID0gJ1wwJzsKKwl3aGlsZSAoKGJsZW4gPSBnZXRfbGluZShmcCwgbGluZSwgc2l6ZW9mKGxpbmUpKSkgIT0gLTEpIHsKKwkJaWYgKGxpbmVbYmxlbiAtIDFdID09ICdcXCcpCisJCQllc2NhcGVkKys7CisJCWlmIChzdHJuY21wKGxpbmUsICItLS0tIiwgNCkgPT0gMCB8fAorCQkgICAgc3Ryc3RyKGxpbmUsICI6ICIpICE9IE5VTEwpIHsKKwkJCWlmIChzdHJzdHIobGluZSwgU1NIX0NPTV9QUklWQVRFX0JFR0lOKSAhPSBOVUxMKQorCQkJCSpwcml2YXRlID0gMTsKKwkJCWlmIChzdHJzdHIobGluZSwgIiBFTkQgIikgIT0gTlVMTCkgeworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZnByaW50ZihzdGRlcnIsICJpZ25vcmU6ICVzIiwgbGluZSk7ICovCisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoZXNjYXBlZCkgeworCQkJZXNjYXBlZC0tOworCQkJLyogZnByaW50ZihzdGRlcnIsICJlc2NhcGVkOiAlcyIsIGxpbmUpOyAqLworCQkJY29udGludWU7CisJCX0KKwkJc3RybGNhdChlbmNvZGVkLCBsaW5lLCBzaXplb2YoZW5jb2RlZCkpOworCX0KKwlsZW4gPSBzdHJsZW4oZW5jb2RlZCk7CisJaWYgKCgobGVuICUgNCkgPT0gMykgJiYKKwkgICAgKGVuY29kZWRbbGVuLTFdID09ICc9JykgJiYKKwkgICAgKGVuY29kZWRbbGVuLTJdID09ICc9JykgJiYKKwkgICAgKGVuY29kZWRbbGVuLTNdID09ICc9JykpCisJCWVuY29kZWRbbGVuLTNdID0gJ1wwJzsKKwlibGVuID0gdXVkZWNvZGUoZW5jb2RlZCwgYmxvYiwgc2l6ZW9mKGJsb2IpKTsKKwlpZiAoYmxlbiA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJ1dWRlY29kZSBmYWlsZWQuXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisJKmsgPSAqcHJpdmF0ZSA/CisJICAgIGRvX2NvbnZlcnRfcHJpdmF0ZV9zc2gyX2Zyb21fYmxvYihibG9iLCBibGVuKSA6CisJICAgIGtleV9mcm9tX2Jsb2IoYmxvYiwgYmxlbik7CisJaWYgKCprID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJkZWNvZGUgYmxvYiBmYWlsZWQuXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisJZmNsb3NlKGZwKTsKK30KKworc3RhdGljIHZvaWQKK2RvX2NvbnZlcnRfZnJvbV9wa2NzOChLZXkgKiprLCBpbnQgKnByaXZhdGUpCit7CisJRVZQX1BLRVkgKnB1YmtleTsKKwlGSUxFICpmcDsKKworCWlmICgoZnAgPSBmb3BlbihpZGVudGl0eV9maWxlLCAiciIpKSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6ICVzOiAlcyIsIF9fcHJvZ25hbWUsIGlkZW50aXR5X2ZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKChwdWJrZXkgPSBQRU1fcmVhZF9QVUJLRVkoZnAsIE5VTEwsIE5VTEwsIE5VTEwpKSA9PSBOVUxMKSB7CisJCWZhdGFsKCIlczogJXMgaXMgbm90IGEgcmVjb2duaXNlZCBwdWJsaWMga2V5IGZvcm1hdCIsIF9fZnVuY19fLAorCQkgICAgaWRlbnRpdHlfZmlsZSk7CisJfQorCWZjbG9zZShmcCk7CisJc3dpdGNoIChFVlBfUEtFWV90eXBlKHB1YmtleS0+dHlwZSkpIHsKKwljYXNlIEVWUF9QS0VZX1JTQToKKwkJKmsgPSBrZXlfbmV3KEtFWV9VTlNQRUMpOworCQkoKmspLT50eXBlID0gS0VZX1JTQTsKKwkJKCprKS0+cnNhID0gRVZQX1BLRVlfZ2V0MV9SU0EocHVia2V5KTsKKwkJYnJlYWs7CisJY2FzZSBFVlBfUEtFWV9EU0E6CisJCSprID0ga2V5X25ldyhLRVlfVU5TUEVDKTsKKwkJKCprKS0+dHlwZSA9IEtFWV9EU0E7CisJCSgqayktPmRzYSA9IEVWUF9QS0VZX2dldDFfRFNBKHB1YmtleSk7CisJCWJyZWFrOworI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworCWNhc2UgRVZQX1BLRVlfRUM6CisJCSprID0ga2V5X25ldyhLRVlfVU5TUEVDKTsKKwkJKCprKS0+dHlwZSA9IEtFWV9FQ0RTQTsKKwkJKCprKS0+ZWNkc2EgPSBFVlBfUEtFWV9nZXQxX0VDX0tFWShwdWJrZXkpOworCQkoKmspLT5lY2RzYV9uaWQgPSBrZXlfZWNkc2Ffa2V5X3RvX25pZCgoKmspLT5lY2RzYSk7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJZmF0YWwoIiVzOiB1bnN1cHBvcnRlZCBwdWJrZXkgdHlwZSAlZCIsIF9fZnVuY19fLAorCQkgICAgRVZQX1BLRVlfdHlwZShwdWJrZXktPnR5cGUpKTsKKwl9CisJRVZQX1BLRVlfZnJlZShwdWJrZXkpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2RvX2NvbnZlcnRfZnJvbV9wZW0oS2V5ICoqaywgaW50ICpwcml2YXRlKQoreworCUZJTEUgKmZwOworCVJTQSAqcnNhOworI2lmZGVmIG5vdHlldAorCURTQSAqZHNhOworI2VuZGlmCisKKwlpZiAoKGZwID0gZm9wZW4oaWRlbnRpdHlfZmlsZSwgInIiKSkgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiAlczogJXMiLCBfX3Byb2duYW1lLCBpZGVudGl0eV9maWxlLCBzdHJlcnJvcihlcnJubykpOworCWlmICgocnNhID0gUEVNX3JlYWRfUlNBUHVibGljS2V5KGZwLCBOVUxMLCBOVUxMLCBOVUxMKSkgIT0gTlVMTCkgeworCQkqayA9IGtleV9uZXcoS0VZX1VOU1BFQyk7CisJCSgqayktPnR5cGUgPSBLRVlfUlNBOworCQkoKmspLT5yc2EgPSByc2E7CisJCWZjbG9zZShmcCk7CisJCXJldHVybjsKKwl9CisjaWYgbm90eWV0IC8qIE9wZW5TU0ggMC45LjggbGFja3MgdGhpcyBmdW5jdGlvbiAqLworCXJld2luZChmcCk7CisJaWYgKChkc2EgPSBQRU1fcmVhZF9EU0FQdWJsaWNLZXkoZnAsIE5VTEwsIE5VTEwsIE5VTEwpKSAhPSBOVUxMKSB7CisJCSprID0ga2V5X25ldyhLRVlfVU5TUEVDKTsKKwkJKCprKS0+dHlwZSA9IEtFWV9EU0E7CisJCSgqayktPmRzYSA9IGRzYTsKKwkJZmNsb3NlKGZwKTsKKwkJcmV0dXJuOworCX0KKwkvKiBYWFggRUNEU0EgKi8KKyNlbmRpZgorCWZhdGFsKCIlczogdW5yZWNvZ25pc2VkIHJhdyBwcml2YXRlIGtleSBmb3JtYXQiLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyB2b2lkCitkb19jb252ZXJ0X2Zyb20oc3RydWN0IHBhc3N3ZCAqcHcpCit7CisJS2V5ICprID0gTlVMTDsKKwlpbnQgcHJpdmF0ZSA9IDAsIG9rID0gMDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmICghaGF2ZV9pZGVudGl0eSkKKwkJYXNrX2ZpbGVuYW1lKHB3LCAiRW50ZXIgZmlsZSBpbiB3aGljaCB0aGUga2V5IGlzIik7CisJaWYgKHN0YXQoaWRlbnRpdHlfZmlsZSwgJnN0KSA8IDApCisJCWZhdGFsKCIlczogJXM6ICVzIiwgX19wcm9nbmFtZSwgaWRlbnRpdHlfZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKworCXN3aXRjaCAoY29udmVydF9mb3JtYXQpIHsKKwljYXNlIEZNVF9SRkM0NzE2OgorCQlkb19jb252ZXJ0X2Zyb21fc3NoMihwdywgJmssICZwcml2YXRlKTsKKwkJYnJlYWs7CisJY2FzZSBGTVRfUEtDUzg6CisJCWRvX2NvbnZlcnRfZnJvbV9wa2NzOCgmaywgJnByaXZhdGUpOworCQlicmVhazsKKwljYXNlIEZNVF9QRU06CisJCWRvX2NvbnZlcnRfZnJvbV9wZW0oJmssICZwcml2YXRlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZmF0YWwoIiVzOiB1bmtub3duIGtleSBmb3JtYXQgJWQiLCBfX2Z1bmNfXywgY29udmVydF9mb3JtYXQpOworCX0KKworCWlmICghcHJpdmF0ZSkKKwkJb2sgPSBrZXlfd3JpdGUoaywgc3Rkb3V0KTsKKwkJaWYgKG9rKQorCQkJZnByaW50ZihzdGRvdXQsICJcbiIpOworCWVsc2UgeworCQlzd2l0Y2ggKGstPnR5cGUpIHsKKwkJY2FzZSBLRVlfRFNBOgorCQkJb2sgPSBQRU1fd3JpdGVfRFNBUHJpdmF0ZUtleShzdGRvdXQsIGstPmRzYSwgTlVMTCwKKwkJCSAgICBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKwkJCWJyZWFrOworI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworCQljYXNlIEtFWV9FQ0RTQToKKwkJCW9rID0gUEVNX3dyaXRlX0VDUHJpdmF0ZUtleShzdGRvdXQsIGstPmVjZHNhLCBOVUxMLAorCQkJICAgIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJY2FzZSBLRVlfUlNBOgorCQkJb2sgPSBQRU1fd3JpdGVfUlNBUHJpdmF0ZUtleShzdGRvdXQsIGstPnJzYSwgTlVMTCwKKwkJCSAgICBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZmF0YWwoIiVzOiB1bnN1cHBvcnRlZCBrZXkgdHlwZSAlcyIsIF9fZnVuY19fLAorCQkJICAgIGtleV90eXBlKGspKTsKKwkJfQorCX0KKworCWlmICghb2spIHsKKwkJZnByaW50ZihzdGRlcnIsICJrZXkgd3JpdGUgZmFpbGVkXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisJa2V5X2ZyZWUoayk7CisJZXhpdCgwKTsKK30KKworc3RhdGljIHZvaWQKK2RvX3ByaW50X3B1YmxpYyhzdHJ1Y3QgcGFzc3dkICpwdykKK3sKKwlLZXkgKnBydjsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmICghaGF2ZV9pZGVudGl0eSkKKwkJYXNrX2ZpbGVuYW1lKHB3LCAiRW50ZXIgZmlsZSBpbiB3aGljaCB0aGUga2V5IGlzIik7CisJaWYgKHN0YXQoaWRlbnRpdHlfZmlsZSwgJnN0KSA8IDApIHsKKwkJcGVycm9yKGlkZW50aXR5X2ZpbGUpOworCQlleGl0KDEpOworCX0KKwlwcnYgPSBsb2FkX2lkZW50aXR5KGlkZW50aXR5X2ZpbGUpOworCWlmIChwcnYgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImxvYWQgZmFpbGVkXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKCFrZXlfd3JpdGUocHJ2LCBzdGRvdXQpKQorCQlmcHJpbnRmKHN0ZGVyciwgImtleV93cml0ZSBmYWlsZWQiKTsKKwlrZXlfZnJlZShwcnYpOworCWZwcmludGYoc3Rkb3V0LCAiXG4iKTsKKwlleGl0KDApOworfQorCitzdGF0aWMgdm9pZAorZG9fZG93bmxvYWQoc3RydWN0IHBhc3N3ZCAqcHcpCit7CisjaWZkZWYgRU5BQkxFX1BLQ1MxMQorCUtleSAqKmtleXMgPSBOVUxMOworCWludCBpLCBua2V5czsKKworCXBrY3MxMV9pbml0KDApOworCW5rZXlzID0gcGtjczExX2FkZF9wcm92aWRlcihwa2NzMTFwcm92aWRlciwgTlVMTCwgJmtleXMpOworCWlmIChua2V5cyA8PSAwKQorCQlmYXRhbCgiY2Fubm90IHJlYWQgcHVibGljIGtleSBmcm9tIHBrY3MxMSIpOworCWZvciAoaSA9IDA7IGkgPCBua2V5czsgaSsrKSB7CisJCWtleV93cml0ZShrZXlzW2ldLCBzdGRvdXQpOworCQlrZXlfZnJlZShrZXlzW2ldKTsKKwkJZnByaW50ZihzdGRvdXQsICJcbiIpOworCX0KKwl4ZnJlZShrZXlzKTsKKwlwa2NzMTFfdGVybWluYXRlKCk7CisJZXhpdCgwKTsKKyNlbHNlCisJZmF0YWwoIm5vIHBrY3MxMSBzdXBwb3J0Iik7CisjZW5kaWYgLyogRU5BQkxFX1BLQ1MxMSAqLworfQorCitzdGF0aWMgdm9pZAorZG9fZmluZ2VycHJpbnQoc3RydWN0IHBhc3N3ZCAqcHcpCit7CisJRklMRSAqZjsKKwlLZXkgKnB1YmxpYzsKKwljaGFyICpjb21tZW50ID0gTlVMTCwgKmNwLCAqZXAsIGxpbmVbMTYqMTAyNF0sICpmcCwgKnJhOworCWludCBpLCBza2lwID0gMCwgbnVtID0gMCwgaW52YWxpZCA9IDE7CisJZW51bSBmcF9yZXAgcmVwOworCWVudW0gZnBfdHlwZSBmcHR5cGU7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlmcHR5cGUgPSBwcmludF9idWJibGViYWJibGUgPyBTU0hfRlBfU0hBMSA6IFNTSF9GUF9NRDU7CisJcmVwID0gICAgcHJpbnRfYnViYmxlYmFiYmxlID8gU1NIX0ZQX0JVQkJMRUJBQkJMRSA6IFNTSF9GUF9IRVg7CisKKwlpZiAoIWhhdmVfaWRlbnRpdHkpCisJCWFza19maWxlbmFtZShwdywgIkVudGVyIGZpbGUgaW4gd2hpY2ggdGhlIGtleSBpcyIpOworCWlmIChzdGF0KGlkZW50aXR5X2ZpbGUsICZzdCkgPCAwKSB7CisJCXBlcnJvcihpZGVudGl0eV9maWxlKTsKKwkJZXhpdCgxKTsKKwl9CisJcHVibGljID0ga2V5X2xvYWRfcHVibGljKGlkZW50aXR5X2ZpbGUsICZjb21tZW50KTsKKwlpZiAocHVibGljICE9IE5VTEwpIHsKKwkJZnAgPSBrZXlfZmluZ2VycHJpbnQocHVibGljLCBmcHR5cGUsIHJlcCk7CisJCXJhID0ga2V5X2ZpbmdlcnByaW50KHB1YmxpYywgU1NIX0ZQX01ENSwgU1NIX0ZQX1JBTkRPTUFSVCk7CisJCXByaW50ZigiJXUgJXMgJXMgKCVzKVxuIiwga2V5X3NpemUocHVibGljKSwgZnAsIGNvbW1lbnQsCisJCSAgICBrZXlfdHlwZShwdWJsaWMpKTsKKwkJaWYgKGxvZ19sZXZlbCA+PSBTWVNMT0dfTEVWRUxfVkVSQk9TRSkKKwkJCXByaW50ZigiJXNcbiIsIHJhKTsKKwkJa2V5X2ZyZWUocHVibGljKTsKKwkJeGZyZWUoY29tbWVudCk7CisJCXhmcmVlKHJhKTsKKwkJeGZyZWUoZnApOworCQlleGl0KDApOworCX0KKwlpZiAoY29tbWVudCkgeworCQl4ZnJlZShjb21tZW50KTsKKwkJY29tbWVudCA9IE5VTEw7CisJfQorCisJaWYgKChmID0gZm9wZW4oaWRlbnRpdHlfZmlsZSwgInIiKSkgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiAlczogJXMiLCBfX3Byb2duYW1lLCBpZGVudGl0eV9maWxlLCBzdHJlcnJvcihlcnJubykpOworCisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHsKKwkJaWYgKChjcCA9IHN0cmNocihsaW5lLCAnXG4nKSkgPT0gTlVMTCkgeworCQkJZXJyb3IoImxpbmUgJWQgdG9vIGxvbmc6ICUuNDBzLi4uIiwKKwkJCSAgICBudW0gKyAxLCBsaW5lKTsKKwkJCXNraXAgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJbnVtKys7CisJCWlmIChza2lwKSB7CisJCQlza2lwID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCSpjcCA9ICdcMCc7CisKKwkJLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UsIGVtcHR5IGFuZCBjb21tZW50IGxpbmVzLiAqLworCQlmb3IgKGNwID0gbGluZTsgKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JzsgY3ArKykKKwkJCTsKKwkJaWYgKCEqY3AgfHwgKmNwID09ICdcbicgfHwgKmNwID09ICcjJykKKwkJCWNvbnRpbnVlOworCQlpID0gc3RydG9sKGNwLCAmZXAsIDEwKTsKKwkJaWYgKGkgPT0gMCB8fCBlcCA9PSBOVUxMIHx8ICgqZXAgIT0gJyAnICYmICplcCAhPSAnXHQnKSkgeworCQkJaW50IHF1b3RlZCA9IDA7CisJCQljb21tZW50ID0gY3A7CisJCQlmb3IgKDsgKmNwICYmIChxdW90ZWQgfHwgKCpjcCAhPSAnICcgJiYKKwkJCSAgICAqY3AgIT0gJ1x0JykpOyBjcCsrKSB7CisJCQkJaWYgKCpjcCA9PSAnXFwnICYmIGNwWzFdID09ICciJykKKwkJCQkJY3ArKzsJLyogU2tpcCBib3RoICovCisJCQkJZWxzZSBpZiAoKmNwID09ICciJykKKwkJCQkJcXVvdGVkID0gIXF1b3RlZDsKKwkJCX0KKwkJCWlmICghKmNwKQorCQkJCWNvbnRpbnVlOworCQkJKmNwKysgPSAnXDAnOworCQl9CisJCWVwID0gY3A7CisJCXB1YmxpYyA9IGtleV9uZXcoS0VZX1JTQTEpOworCQlpZiAoa2V5X3JlYWQocHVibGljLCAmY3ApICE9IDEpIHsKKwkJCWNwID0gZXA7CisJCQlrZXlfZnJlZShwdWJsaWMpOworCQkJcHVibGljID0ga2V5X25ldyhLRVlfVU5TUEVDKTsKKwkJCWlmIChrZXlfcmVhZChwdWJsaWMsICZjcCkgIT0gMSkgeworCQkJCWtleV9mcmVlKHB1YmxpYyk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJY29tbWVudCA9ICpjcCA/IGNwIDogY29tbWVudDsKKwkJZnAgPSBrZXlfZmluZ2VycHJpbnQocHVibGljLCBmcHR5cGUsIHJlcCk7CisJCXJhID0ga2V5X2ZpbmdlcnByaW50KHB1YmxpYywgU1NIX0ZQX01ENSwgU1NIX0ZQX1JBTkRPTUFSVCk7CisJCXByaW50ZigiJXUgJXMgJXMgKCVzKVxuIiwga2V5X3NpemUocHVibGljKSwgZnAsCisJCSAgICBjb21tZW50ID8gY29tbWVudCA6ICJubyBjb21tZW50Iiwga2V5X3R5cGUocHVibGljKSk7CisJCWlmIChsb2dfbGV2ZWwgPj0gU1lTTE9HX0xFVkVMX1ZFUkJPU0UpCisJCQlwcmludGYoIiVzXG4iLCByYSk7CisJCXhmcmVlKHJhKTsKKwkJeGZyZWUoZnApOworCQlrZXlfZnJlZShwdWJsaWMpOworCQlpbnZhbGlkID0gMDsKKwl9CisJZmNsb3NlKGYpOworCisJaWYgKGludmFsaWQpIHsKKwkJcHJpbnRmKCIlcyBpcyBub3QgYSBwdWJsaWMga2V5IGZpbGUuXG4iLCBpZGVudGl0eV9maWxlKTsKKwkJZXhpdCgxKTsKKwl9CisJZXhpdCgwKTsKK30KKworc3RhdGljIHZvaWQKK2RvX2dlbl9hbGxfaG9zdGtleXMoc3RydWN0IHBhc3N3ZCAqcHcpCit7CisJc3RydWN0IHsKKwkJY2hhciAqa2V5X3R5cGU7CisJCWNoYXIgKmtleV90eXBlX2Rpc3BsYXk7CisJCWNoYXIgKnBhdGg7CisJfSBrZXlfdHlwZXNbXSA9IHsKKwkJeyAicnNhMSIsICJSU0ExIiwgX1BBVEhfSE9TVF9LRVlfRklMRSB9LAorCQl7ICJyc2EiLCAiUlNBIiAsX1BBVEhfSE9TVF9SU0FfS0VZX0ZJTEUgfSwKKwkJeyAiZHNhIiwgIkRTQSIsIF9QQVRIX0hPU1RfRFNBX0tFWV9GSUxFIH0sCisjaWZkZWYgT1BFTlNTTF9IQVNfRUNDCisJCXsgImVjZHNhIiwgIkVDRFNBIixfUEFUSF9IT1NUX0VDRFNBX0tFWV9GSUxFIH0sCisjZW5kaWYKKwkJeyBOVUxMLCBOVUxMLCBOVUxMIH0KKwl9OworCisJaW50IGZpcnN0ID0gMDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlLZXkgKnByaXZhdGUsICpwdWJsaWM7CisJY2hhciBjb21tZW50WzEwMjRdOworCWludCBpLCB0eXBlLCBmZDsKKwlGSUxFICpmOworCisJZm9yIChpID0gMDsga2V5X3R5cGVzW2ldLmtleV90eXBlOyBpKyspIHsKKwkJaWYgKHN0YXQoa2V5X3R5cGVzW2ldLnBhdGgsICZzdCkgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisJCQlwcmludGYoIkNvdWxkIG5vdCBzdGF0ICVzOiAlcyIsIGtleV90eXBlc1tpXS5wYXRoLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCQlmaXJzdCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChmaXJzdCA9PSAwKSB7CisJCQlmaXJzdCA9IDE7CisJCQlwcmludGYoIiVzOiBnZW5lcmF0aW5nIG5ldyBob3N0IGtleXM6ICIsIF9fcHJvZ25hbWUpOworCQl9CisJCXByaW50ZigiJXMgIiwga2V5X3R5cGVzW2ldLmtleV90eXBlX2Rpc3BsYXkpOworCQlmZmx1c2goc3Rkb3V0KTsKKwkJYXJjNHJhbmRvbV9zdGlyKCk7CisJCXR5cGUgPSBrZXlfdHlwZV9mcm9tX25hbWUoa2V5X3R5cGVzW2ldLmtleV90eXBlKTsKKwkJc3RybGNweShpZGVudGl0eV9maWxlLCBrZXlfdHlwZXNbaV0ucGF0aCwgc2l6ZW9mKGlkZW50aXR5X2ZpbGUpKTsKKwkJYml0cyA9IDA7CisJCXR5cGVfYml0c192YWxpZCh0eXBlLCAmYml0cyk7CisJCXByaXZhdGUgPSBrZXlfZ2VuZXJhdGUodHlwZSwgYml0cyk7CisJCWlmIChwcml2YXRlID09IE5VTEwpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAia2V5X2dlbmVyYXRlIGZhaWxlZFxuIik7CisJCQlmaXJzdCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlwdWJsaWMgID0ga2V5X2Zyb21fcHJpdmF0ZShwcml2YXRlKTsKKwkJc25wcmludGYoY29tbWVudCwgc2l6ZW9mIGNvbW1lbnQsICIlc0AlcyIsIHB3LT5wd19uYW1lLAorCQkgICAgaG9zdG5hbWUpOworCQlpZiAoIWtleV9zYXZlX3ByaXZhdGUocHJpdmF0ZSwgaWRlbnRpdHlfZmlsZSwgIiIsIGNvbW1lbnQpKSB7CisJCQlwcmludGYoIlNhdmluZyB0aGUga2V5IGZhaWxlZDogJXMuXG4iLCBpZGVudGl0eV9maWxlKTsKKwkJCWtleV9mcmVlKHByaXZhdGUpOworCQkJa2V5X2ZyZWUocHVibGljKTsKKwkJCWZpcnN0ID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWtleV9mcmVlKHByaXZhdGUpOworCQlhcmM0cmFuZG9tX3N0aXIoKTsKKwkJc3RybGNhdChpZGVudGl0eV9maWxlLCAiLnB1YiIsIHNpemVvZihpZGVudGl0eV9maWxlKSk7CisJCWZkID0gb3BlbihpZGVudGl0eV9maWxlLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjQ0KTsKKwkJaWYgKGZkID09IC0xKSB7CisJCQlwcmludGYoIkNvdWxkIG5vdCBzYXZlIHlvdXIgcHVibGljIGtleSBpbiAlc1xuIiwKKwkJCSAgICBpZGVudGl0eV9maWxlKTsKKwkJCWtleV9mcmVlKHB1YmxpYyk7CisJCQlmaXJzdCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlmID0gZmRvcGVuKGZkLCAidyIpOworCQlpZiAoZiA9PSBOVUxMKSB7CisJCQlwcmludGYoImZkb3BlbiAlcyBmYWlsZWRcbiIsIGlkZW50aXR5X2ZpbGUpOworCQkJa2V5X2ZyZWUocHVibGljKTsKKwkJCWZpcnN0ID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgha2V5X3dyaXRlKHB1YmxpYywgZikpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAid3JpdGUga2V5IGZhaWxlZFxuIik7CisJCQlrZXlfZnJlZShwdWJsaWMpOworCQkJZmlyc3QgPSAwOworCQkJY29udGludWU7CisJCX0KKwkJZnByaW50ZihmLCAiICVzXG4iLCBjb21tZW50KTsKKwkJZmNsb3NlKGYpOworCQlrZXlfZnJlZShwdWJsaWMpOworCisJfQorCWlmIChmaXJzdCAhPSAwKQorCQlwcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludGhvc3QoRklMRSAqZiwgY29uc3QgY2hhciAqbmFtZSwgS2V5ICpwdWJsaWMsIGludCBjYSwgaW50IGhhc2gpCit7CisJaWYgKHByaW50X2ZpbmdlcnByaW50KSB7CisJCWVudW0gZnBfcmVwIHJlcDsKKwkJZW51bSBmcF90eXBlIGZwdHlwZTsKKwkJY2hhciAqZnAsICpyYTsKKworCQlmcHR5cGUgPSBwcmludF9idWJibGViYWJibGUgPyBTU0hfRlBfU0hBMSA6IFNTSF9GUF9NRDU7CisJCXJlcCA9ICAgIHByaW50X2J1YmJsZWJhYmJsZSA/IFNTSF9GUF9CVUJCTEVCQUJCTEUgOiBTU0hfRlBfSEVYOworCQlmcCA9IGtleV9maW5nZXJwcmludChwdWJsaWMsIGZwdHlwZSwgcmVwKTsKKwkJcmEgPSBrZXlfZmluZ2VycHJpbnQocHVibGljLCBTU0hfRlBfTUQ1LCBTU0hfRlBfUkFORE9NQVJUKTsKKwkJcHJpbnRmKCIldSAlcyAlcyAoJXMpXG4iLCBrZXlfc2l6ZShwdWJsaWMpLCBmcCwgbmFtZSwKKwkJICAgIGtleV90eXBlKHB1YmxpYykpOworCQlpZiAobG9nX2xldmVsID49IFNZU0xPR19MRVZFTF9WRVJCT1NFKQorCQkJcHJpbnRmKCIlc1xuIiwgcmEpOworCQl4ZnJlZShyYSk7CisJCXhmcmVlKGZwKTsKKwl9IGVsc2UgeworCQlpZiAoaGFzaCAmJiAobmFtZSA9IGhvc3RfaGFzaChuYW1lLCBOVUxMLCAwKSkgPT0gTlVMTCkKKwkJCWZhdGFsKCJoYXNoX2hvc3QgZmFpbGVkIik7CisJCWZwcmludGYoZiwgIiVzJXMlcyAiLCBjYSA/IENBX01BUktFUiA6ICIiLCBjYSA/ICIgIiA6ICIiLCBuYW1lKTsKKwkJaWYgKCFrZXlfd3JpdGUocHVibGljLCBmKSkKKwkJCWZhdGFsKCJrZXlfd3JpdGUgZmFpbGVkIik7CisJCWZwcmludGYoZiwgIlxuIik7CisJfQorfQorCitzdGF0aWMgdm9pZAorZG9fa25vd25faG9zdHMoc3RydWN0IHBhc3N3ZCAqcHcsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJRklMRSAqaW4sICpvdXQgPSBzdGRvdXQ7CisJS2V5ICpwdWI7CisJY2hhciAqY3AsICpjcDIsICprcCwgKmtwMjsKKwljaGFyIGxpbmVbMTYqMTAyNF0sIHRtcFtNQVhQQVRITEVOXSwgb2xkW01BWFBBVEhMRU5dOworCWludCBjLCBza2lwID0gMCwgaW5wbGFjZSA9IDAsIG51bSA9IDAsIGludmFsaWQgPSAwLCBoYXNfdW5oYXNoZWQgPSAwOworCWludCBjYTsKKworCWlmICghaGF2ZV9pZGVudGl0eSkgeworCQljcCA9IHRpbGRlX2V4cGFuZF9maWxlbmFtZShfUEFUSF9TU0hfVVNFUl9IT1NURklMRSwgcHctPnB3X3VpZCk7CisJCWlmIChzdHJsY3B5KGlkZW50aXR5X2ZpbGUsIGNwLCBzaXplb2YoaWRlbnRpdHlfZmlsZSkpID49CisJCSAgICBzaXplb2YoaWRlbnRpdHlfZmlsZSkpCisJCQlmYXRhbCgiU3BlY2lmaWVkIGtub3duIGhvc3RzIHBhdGggdG9vIGxvbmciKTsKKwkJeGZyZWUoY3ApOworCQloYXZlX2lkZW50aXR5ID0gMTsKKwl9CisJaWYgKChpbiA9IGZvcGVuKGlkZW50aXR5X2ZpbGUsICJyIikpID09IE5VTEwpCisJCWZhdGFsKCIlczogJXM6ICVzIiwgX19wcm9nbmFtZSwgaWRlbnRpdHlfZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKworCS8qCisJICogRmluZCBob3N0cyBnb2VzIHRvIHN0ZG91dCwgaGFzaCBhbmQgZGVsZXRpb25zIGhhcHBlbiBpbi1wbGFjZQorCSAqIEEgY29ybmVyIGNhc2UgaXMgc3NoLWtleWdlbiAtSEYgZm9vLCB3aGljaCBzaG91bGQgZ28gdG8gc3Rkb3V0CisJICovCisJaWYgKCFmaW5kX2hvc3QgJiYgKGhhc2hfaG9zdHMgfHwgZGVsZXRlX2hvc3QpKSB7CisJCWlmIChzdHJsY3B5KHRtcCwgaWRlbnRpdHlfZmlsZSwgc2l6ZW9mKHRtcCkpID49IHNpemVvZih0bXApIHx8CisJCSAgICBzdHJsY2F0KHRtcCwgIi5YWFhYWFhYWFhYIiwgc2l6ZW9mKHRtcCkpID49IHNpemVvZih0bXApIHx8CisJCSAgICBzdHJsY3B5KG9sZCwgaWRlbnRpdHlfZmlsZSwgc2l6ZW9mKG9sZCkpID49IHNpemVvZihvbGQpIHx8CisJCSAgICBzdHJsY2F0KG9sZCwgIi5vbGQiLCBzaXplb2Yob2xkKSkgPj0gc2l6ZW9mKG9sZCkpCisJCQlmYXRhbCgia25vd25faG9zdHMgcGF0aCB0b28gbG9uZyIpOworCQl1bWFzaygwNzcpOworCQlpZiAoKGMgPSBta3N0ZW1wKHRtcCkpID09IC0xKQorCQkJZmF0YWwoIm1rc3RlbXA6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJaWYgKChvdXQgPSBmZG9wZW4oYywgInciKSkgPT0gTlVMTCkgeworCQkJYyA9IGVycm5vOworCQkJdW5saW5rKHRtcCk7CisJCQlmYXRhbCgiZmRvcGVuOiAlcyIsIHN0cmVycm9yKGMpKTsKKwkJfQorCQlpbnBsYWNlID0gMTsKKwl9CisKKwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBpbikpIHsKKwkJaWYgKChjcCA9IHN0cmNocihsaW5lLCAnXG4nKSkgPT0gTlVMTCkgeworCQkJZXJyb3IoImxpbmUgJWQgdG9vIGxvbmc6ICUuNDBzLi4uIiwgbnVtICsgMSwgbGluZSk7CisJCQlza2lwID0gMTsKKwkJCWludmFsaWQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJbnVtKys7CisJCWlmIChza2lwKSB7CisJCQlza2lwID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCSpjcCA9ICdcMCc7CisKKwkJLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UsIGVtcHR5IGFuZCBjb21tZW50IGxpbmVzLiAqLworCQlmb3IgKGNwID0gbGluZTsgKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JzsgY3ArKykKKwkJCTsKKwkJaWYgKCEqY3AgfHwgKmNwID09ICdcbicgfHwgKmNwID09ICcjJykgeworCQkJaWYgKGlucGxhY2UpCisJCQkJZnByaW50ZihvdXQsICIlc1xuIiwgY3ApOworCQkJY29udGludWU7CisJCX0KKwkJLyogQ2hlY2sgd2hldGhlciB0aGlzIGlzIGEgQ0Ega2V5ICovCisJCWlmIChzdHJuY2FzZWNtcChjcCwgQ0FfTUFSS0VSLCBzaXplb2YoQ0FfTUFSS0VSKSAtIDEpID09IDAgJiYKKwkJICAgIChjcFtzaXplb2YoQ0FfTUFSS0VSKSAtIDFdID09ICcgJyB8fAorCQkgICAgY3Bbc2l6ZW9mKENBX01BUktFUikgLSAxXSA9PSAnXHQnKSkgeworCQkJY2EgPSAxOworCQkJY3AgKz0gc2l6ZW9mKENBX01BUktFUik7CisJCX0gZWxzZQorCQkJY2EgPSAwOworCisJCS8qIEZpbmQgdGhlIGVuZCBvZiB0aGUgaG9zdCBuYW1lIHBvcnRpb24uICovCisJCWZvciAoa3AgPSBjcDsgKmtwICYmICprcCAhPSAnICcgJiYgKmtwICE9ICdcdCc7IGtwKyspCisJCQk7CisKKwkJaWYgKCprcCA9PSAnXDAnIHx8ICooa3AgKyAxKSA9PSAnXDAnKSB7CisJCQllcnJvcigibGluZSAlZCBtaXNzaW5nIGtleTogJS40MHMuLi4iLAorCQkJICAgIG51bSwgbGluZSk7CisJCQlpbnZhbGlkID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCSprcCsrID0gJ1wwJzsKKwkJa3AyID0ga3A7CisKKwkJcHViID0ga2V5X25ldyhLRVlfUlNBMSk7CisJCWlmIChrZXlfcmVhZChwdWIsICZrcCkgIT0gMSkgeworCQkJa3AgPSBrcDI7CisJCQlrZXlfZnJlZShwdWIpOworCQkJcHViID0ga2V5X25ldyhLRVlfVU5TUEVDKTsKKwkJCWlmIChrZXlfcmVhZChwdWIsICZrcCkgIT0gMSkgeworCQkJCWVycm9yKCJsaW5lICVkIGludmFsaWQga2V5OiAlLjQwcy4uLiIsCisJCQkJICAgIG51bSwgbGluZSk7CisJCQkJa2V5X2ZyZWUocHViKTsKKwkJCQlpbnZhbGlkID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCWlmICgqY3AgPT0gSEFTSF9ERUxJTSkgeworCQkJaWYgKGZpbmRfaG9zdCB8fCBkZWxldGVfaG9zdCkgeworCQkJCWNwMiA9IGhvc3RfaGFzaChuYW1lLCBjcCwgc3RybGVuKGNwKSk7CisJCQkJaWYgKGNwMiA9PSBOVUxMKSB7CisJCQkJCWVycm9yKCJsaW5lICVkOiBpbnZhbGlkIGhhc2hlZCAiCisJCQkJCSAgICAibmFtZTogJS42NHMuLi4iLCBudW0sIGxpbmUpOworCQkJCQlpbnZhbGlkID0gMTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWMgPSAoc3RyY21wKGNwMiwgY3ApID09IDApOworCQkJCWlmIChmaW5kX2hvc3QgJiYgYykgeworCQkJCQlwcmludGYoIiMgSG9zdCAlcyBmb3VuZDogIgorCQkJCQkgICAgImxpbmUgJWQgdHlwZSAlcyVzXG4iLCBuYW1lLAorCQkJCQkgICAgbnVtLCBrZXlfdHlwZShwdWIpLAorCQkJCQkgICAgY2EgPyAiIChDQSBrZXkpIiA6ICIiKTsKKwkJCQkJcHJpbnRob3N0KG91dCwgY3AsIHB1YiwgY2EsIDApOworCQkJCX0KKwkJCQlpZiAoZGVsZXRlX2hvc3QgJiYgIWMgJiYgIWNhKQorCQkJCQlwcmludGhvc3Qob3V0LCBjcCwgcHViLCBjYSwgMCk7CisJCQl9IGVsc2UgaWYgKGhhc2hfaG9zdHMpCisJCQkJcHJpbnRob3N0KG91dCwgY3AsIHB1YiwgY2EsIDApOworCQl9IGVsc2UgeworCQkJaWYgKGZpbmRfaG9zdCB8fCBkZWxldGVfaG9zdCkgeworCQkJCWMgPSAobWF0Y2hfaG9zdG5hbWUobmFtZSwgY3AsCisJCQkJICAgIHN0cmxlbihjcCkpID09IDEpOworCQkJCWlmIChmaW5kX2hvc3QgJiYgYykgeworCQkJCQlwcmludGYoIiMgSG9zdCAlcyBmb3VuZDogIgorCQkJCQkgICAgImxpbmUgJWQgdHlwZSAlcyVzXG4iLCBuYW1lLAorCQkJCQkgICAgbnVtLCBrZXlfdHlwZShwdWIpLAorCQkJCQkgICAgY2EgPyAiIChDQSBrZXkpIiA6ICIiKTsKKwkJCQkJcHJpbnRob3N0KG91dCwgbmFtZSwgcHViLAorCQkJCQkgICAgY2EsIGhhc2hfaG9zdHMgJiYgIWNhKTsKKwkJCQl9CisJCQkJaWYgKGRlbGV0ZV9ob3N0ICYmICFjICYmICFjYSkKKwkJCQkJcHJpbnRob3N0KG91dCwgY3AsIHB1YiwgY2EsIDApOworCQkJfSBlbHNlIGlmIChoYXNoX2hvc3RzKSB7CisJCQkJZm9yIChjcDIgPSBzdHJzZXAoJmNwLCAiLCIpOworCQkJCSAgICBjcDIgIT0gTlVMTCAmJiAqY3AyICE9ICdcMCc7CisJCQkJICAgIGNwMiA9IHN0cnNlcCgmY3AsICIsIikpIHsKKwkJCQkJaWYgKGNhKSB7CisJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6ICIKKwkJCQkJCSAgICAiaWdub3JpbmcgQ0Ega2V5IGZvciBob3N0OiAiCisJCQkJCQkgICAgIiUuNjRzXG4iLCBjcDIpOworCQkJCQkJcHJpbnRob3N0KG91dCwgY3AyLCBwdWIsIGNhLCAwKTsKKwkJCQkJfSBlbHNlIGlmIChzdHJjc3BuKGNwMiwgIio/ISIpICE9CisJCQkJCSAgICBzdHJsZW4oY3AyKSkgeworCQkJCQkJZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiAiCisJCQkJCQkgICAgImlnbm9yaW5nIGhvc3QgbmFtZSB3aXRoICIKKwkJCQkJCSAgICAibWV0YWNoYXJhY3RlcnM6ICUuNjRzXG4iLAorCQkJCQkJICAgIGNwMik7CisJCQkJCQlwcmludGhvc3Qob3V0LCBjcDIsIHB1YiwgY2EsIDApOworCQkJCQl9IGVsc2UKKwkJCQkJCXByaW50aG9zdChvdXQsIGNwMiwgcHViLCBjYSwgMSk7CisJCQkJfQorCQkJCWhhc191bmhhc2hlZCA9IDE7CisJCQl9CisJCX0KKwkJa2V5X2ZyZWUocHViKTsKKwl9CisJZmNsb3NlKGluKTsKKworCWlmIChpbnZhbGlkKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXMgaXMgbm90IGEgdmFsaWQga25vd25faG9zdHMgZmlsZS5cbiIsCisJCSAgICBpZGVudGl0eV9maWxlKTsKKwkJaWYgKGlucGxhY2UpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiTm90IHJlcGxhY2luZyBleGlzdGluZyBrbm93bl9ob3N0cyAiCisJCQkgICAgImZpbGUgYmVjYXVzZSBvZiBlcnJvcnNcbiIpOworCQkJZmNsb3NlKG91dCk7CisJCQl1bmxpbmsodG1wKTsKKwkJfQorCQlleGl0KDEpOworCX0KKworCWlmIChpbnBsYWNlKSB7CisJCWZjbG9zZShvdXQpOworCisJCS8qIEJhY2t1cCBleGlzdGluZyBmaWxlICovCisJCWlmICh1bmxpbmsob2xkKSA9PSAtMSAmJiBlcnJubyAhPSBFTk9FTlQpCisJCQlmYXRhbCgidW5saW5rICUuMTAwczogJXMiLCBvbGQsIHN0cmVycm9yKGVycm5vKSk7CisJCWlmIChsaW5rKGlkZW50aXR5X2ZpbGUsIG9sZCkgPT0gLTEpCisJCQlmYXRhbCgibGluayAlLjEwMHMgdG8gJS4xMDBzOiAlcyIsIGlkZW50aXR5X2ZpbGUsIG9sZCwKKwkJCSAgICBzdHJlcnJvcihlcnJubykpOworCQkvKiBNb3ZlIG5ldyBvbmUgaW50byBwbGFjZSAqLworCQlpZiAocmVuYW1lKHRtcCwgaWRlbnRpdHlfZmlsZSkgPT0gLTEpIHsKKwkJCWVycm9yKCJyZW5hbWVcIiVzXCIgdG8gXCIlc1wiOiAlcyIsIHRtcCwgaWRlbnRpdHlfZmlsZSwKKwkJCSAgICBzdHJlcnJvcihlcnJubykpOworCQkJdW5saW5rKHRtcCk7CisJCQl1bmxpbmsob2xkKTsKKwkJCWV4aXQoMSk7CisJCX0KKworCQlmcHJpbnRmKHN0ZGVyciwgIiVzIHVwZGF0ZWQuXG4iLCBpZGVudGl0eV9maWxlKTsKKwkJZnByaW50ZihzdGRlcnIsICJPcmlnaW5hbCBjb250ZW50cyByZXRhaW5lZCBhcyAlc1xuIiwgb2xkKTsKKwkJaWYgKGhhc191bmhhc2hlZCkgeworCQkJZnByaW50ZihzdGRlcnIsICJXQVJOSU5HOiAlcyBjb250YWlucyB1bmhhc2hlZCAiCisJCQkgICAgImVudHJpZXNcbiIsIG9sZCk7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkRlbGV0ZSB0aGlzIGZpbGUgdG8gZW5zdXJlIHByaXZhY3kgIgorCQkJICAgICJvZiBob3N0bmFtZXNcbiIpOworCQl9CisJfQorCisJZXhpdCgwKTsKK30KKworLyoKKyAqIFBlcmZvcm0gY2hhbmdpbmcgYSBwYXNzcGhyYXNlLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSBwYXNzd2Qgc3RydWN0dXJlCisgKiBmb3IgdGhlIGN1cnJlbnQgdXNlci4KKyAqLworc3RhdGljIHZvaWQKK2RvX2NoYW5nZV9wYXNzcGhyYXNlKHN0cnVjdCBwYXNzd2QgKnB3KQoreworCWNoYXIgKmNvbW1lbnQ7CisJY2hhciAqb2xkX3Bhc3NwaHJhc2UsICpwYXNzcGhyYXNlMSwgKnBhc3NwaHJhc2UyOworCXN0cnVjdCBzdGF0IHN0OworCUtleSAqcHJpdmF0ZTsKKworCWlmICghaGF2ZV9pZGVudGl0eSkKKwkJYXNrX2ZpbGVuYW1lKHB3LCAiRW50ZXIgZmlsZSBpbiB3aGljaCB0aGUga2V5IGlzIik7CisJaWYgKHN0YXQoaWRlbnRpdHlfZmlsZSwgJnN0KSA8IDApIHsKKwkJcGVycm9yKGlkZW50aXR5X2ZpbGUpOworCQlleGl0KDEpOworCX0KKwkvKiBUcnkgdG8gbG9hZCB0aGUgZmlsZSB3aXRoIGVtcHR5IHBhc3NwaHJhc2UuICovCisJcHJpdmF0ZSA9IGtleV9sb2FkX3ByaXZhdGUoaWRlbnRpdHlfZmlsZSwgIiIsICZjb21tZW50KTsKKwlpZiAocHJpdmF0ZSA9PSBOVUxMKSB7CisJCWlmIChpZGVudGl0eV9wYXNzcGhyYXNlKQorCQkJb2xkX3Bhc3NwaHJhc2UgPSB4c3RyZHVwKGlkZW50aXR5X3Bhc3NwaHJhc2UpOworCQllbHNlCisJCQlvbGRfcGFzc3BocmFzZSA9CisJCQkgICAgcmVhZF9wYXNzcGhyYXNlKCJFbnRlciBvbGQgcGFzc3BocmFzZTogIiwKKwkJCSAgICBSUF9BTExPV19TVERJTik7CisJCXByaXZhdGUgPSBrZXlfbG9hZF9wcml2YXRlKGlkZW50aXR5X2ZpbGUsIG9sZF9wYXNzcGhyYXNlLAorCQkgICAgJmNvbW1lbnQpOworCQltZW1zZXQob2xkX3Bhc3NwaHJhc2UsIDAsIHN0cmxlbihvbGRfcGFzc3BocmFzZSkpOworCQl4ZnJlZShvbGRfcGFzc3BocmFzZSk7CisJCWlmIChwcml2YXRlID09IE5VTEwpIHsKKwkJCXByaW50ZigiQmFkIHBhc3NwaHJhc2UuXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisJcHJpbnRmKCJLZXkgaGFzIGNvbW1lbnQgJyVzJ1xuIiwgY29tbWVudCk7CisKKwkvKiBBc2sgdGhlIG5ldyBwYXNzcGhyYXNlICh0d2ljZSkuICovCisJaWYgKGlkZW50aXR5X25ld19wYXNzcGhyYXNlKSB7CisJCXBhc3NwaHJhc2UxID0geHN0cmR1cChpZGVudGl0eV9uZXdfcGFzc3BocmFzZSk7CisJCXBhc3NwaHJhc2UyID0gTlVMTDsKKwl9IGVsc2UgeworCQlwYXNzcGhyYXNlMSA9CisJCQlyZWFkX3Bhc3NwaHJhc2UoIkVudGVyIG5ldyBwYXNzcGhyYXNlIChlbXB0eSBmb3Igbm8gIgorCQkJICAgICJwYXNzcGhyYXNlKTogIiwgUlBfQUxMT1dfU1RESU4pOworCQlwYXNzcGhyYXNlMiA9IHJlYWRfcGFzc3BocmFzZSgiRW50ZXIgc2FtZSBwYXNzcGhyYXNlIGFnYWluOiAiLAorCQkgICAgUlBfQUxMT1dfU1RESU4pOworCisJCS8qIFZlcmlmeSB0aGF0IHRoZXkgYXJlIHRoZSBzYW1lLiAqLworCQlpZiAoc3RyY21wKHBhc3NwaHJhc2UxLCBwYXNzcGhyYXNlMikgIT0gMCkgeworCQkJbWVtc2V0KHBhc3NwaHJhc2UxLCAwLCBzdHJsZW4ocGFzc3BocmFzZTEpKTsKKwkJCW1lbXNldChwYXNzcGhyYXNlMiwgMCwgc3RybGVuKHBhc3NwaHJhc2UyKSk7CisJCQl4ZnJlZShwYXNzcGhyYXNlMSk7CisJCQl4ZnJlZShwYXNzcGhyYXNlMik7CisJCQlwcmludGYoIlBhc3MgcGhyYXNlcyBkbyBub3QgbWF0Y2guICBUcnkgYWdhaW4uXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJLyogRGVzdHJveSB0aGUgb3RoZXIgY29weS4gKi8KKwkJbWVtc2V0KHBhc3NwaHJhc2UyLCAwLCBzdHJsZW4ocGFzc3BocmFzZTIpKTsKKwkJeGZyZWUocGFzc3BocmFzZTIpOworCX0KKworCS8qIFNhdmUgdGhlIGZpbGUgdXNpbmcgdGhlIG5ldyBwYXNzcGhyYXNlLiAqLworCWlmICgha2V5X3NhdmVfcHJpdmF0ZShwcml2YXRlLCBpZGVudGl0eV9maWxlLCBwYXNzcGhyYXNlMSwgY29tbWVudCkpIHsKKwkJcHJpbnRmKCJTYXZpbmcgdGhlIGtleSBmYWlsZWQ6ICVzLlxuIiwgaWRlbnRpdHlfZmlsZSk7CisJCW1lbXNldChwYXNzcGhyYXNlMSwgMCwgc3RybGVuKHBhc3NwaHJhc2UxKSk7CisJCXhmcmVlKHBhc3NwaHJhc2UxKTsKKwkJa2V5X2ZyZWUocHJpdmF0ZSk7CisJCXhmcmVlKGNvbW1lbnQpOworCQlleGl0KDEpOworCX0KKwkvKiBEZXN0cm95IHRoZSBwYXNzcGhyYXNlIGFuZCB0aGUgY29weSBvZiB0aGUga2V5IGluIG1lbW9yeS4gKi8KKwltZW1zZXQocGFzc3BocmFzZTEsIDAsIHN0cmxlbihwYXNzcGhyYXNlMSkpOworCXhmcmVlKHBhc3NwaHJhc2UxKTsKKwlrZXlfZnJlZShwcml2YXRlKTsJCSAvKiBEZXN0cm95cyBjb250ZW50cyAqLworCXhmcmVlKGNvbW1lbnQpOworCisJcHJpbnRmKCJZb3VyIGlkZW50aWZpY2F0aW9uIGhhcyBiZWVuIHNhdmVkIHdpdGggdGhlIG5ldyBwYXNzcGhyYXNlLlxuIik7CisJZXhpdCgwKTsKK30KKworLyoKKyAqIFByaW50IHRoZSBTU0hGUCBSUi4KKyAqLworc3RhdGljIGludAorZG9fcHJpbnRfcmVzb3VyY2VfcmVjb3JkKHN0cnVjdCBwYXNzd2QgKnB3LCBjaGFyICpmbmFtZSwgY2hhciAqaG5hbWUpCit7CisJS2V5ICpwdWJsaWM7CisJY2hhciAqY29tbWVudCA9IE5VTEw7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAoZm5hbWUgPT0gTlVMTCkKKwkJYXNrX2ZpbGVuYW1lKHB3LCAiRW50ZXIgZmlsZSBpbiB3aGljaCB0aGUga2V5IGlzIik7CisJaWYgKHN0YXQoZm5hbWUsICZzdCkgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFTk9FTlQpCisJCQlyZXR1cm4gMDsKKwkJcGVycm9yKGZuYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisJcHVibGljID0ga2V5X2xvYWRfcHVibGljKGZuYW1lLCAmY29tbWVudCk7CisJaWYgKHB1YmxpYyAhPSBOVUxMKSB7CisJCWV4cG9ydF9kbnNfcnIoaG5hbWUsIHB1YmxpYywgc3Rkb3V0LCBwcmludF9nZW5lcmljKTsKKwkJa2V5X2ZyZWUocHVibGljKTsKKwkJeGZyZWUoY29tbWVudCk7CisJCXJldHVybiAxOworCX0KKwlpZiAoY29tbWVudCkKKwkJeGZyZWUoY29tbWVudCk7CisKKwlwcmludGYoImZhaWxlZCB0byByZWFkIHYyIHB1YmxpYyBrZXkgZnJvbSAlcy5cbiIsIGZuYW1lKTsKKwlleGl0KDEpOworfQorCisvKgorICogQ2hhbmdlIHRoZSBjb21tZW50IG9mIGEgcHJpdmF0ZSBrZXkgZmlsZS4KKyAqLworc3RhdGljIHZvaWQKK2RvX2NoYW5nZV9jb21tZW50KHN0cnVjdCBwYXNzd2QgKnB3KQoreworCWNoYXIgbmV3X2NvbW1lbnRbMTAyNF0sICpjb21tZW50LCAqcGFzc3BocmFzZTsKKwlLZXkgKnByaXZhdGU7CisJS2V5ICpwdWJsaWM7CisJc3RydWN0IHN0YXQgc3Q7CisJRklMRSAqZjsKKwlpbnQgZmQ7CisKKwlpZiAoIWhhdmVfaWRlbnRpdHkpCisJCWFza19maWxlbmFtZShwdywgIkVudGVyIGZpbGUgaW4gd2hpY2ggdGhlIGtleSBpcyIpOworCWlmIChzdGF0KGlkZW50aXR5X2ZpbGUsICZzdCkgPCAwKSB7CisJCXBlcnJvcihpZGVudGl0eV9maWxlKTsKKwkJZXhpdCgxKTsKKwl9CisJcHJpdmF0ZSA9IGtleV9sb2FkX3ByaXZhdGUoaWRlbnRpdHlfZmlsZSwgIiIsICZjb21tZW50KTsKKwlpZiAocHJpdmF0ZSA9PSBOVUxMKSB7CisJCWlmIChpZGVudGl0eV9wYXNzcGhyYXNlKQorCQkJcGFzc3BocmFzZSA9IHhzdHJkdXAoaWRlbnRpdHlfcGFzc3BocmFzZSk7CisJCWVsc2UgaWYgKGlkZW50aXR5X25ld19wYXNzcGhyYXNlKQorCQkJcGFzc3BocmFzZSA9IHhzdHJkdXAoaWRlbnRpdHlfbmV3X3Bhc3NwaHJhc2UpOworCQllbHNlCisJCQlwYXNzcGhyYXNlID0gcmVhZF9wYXNzcGhyYXNlKCJFbnRlciBwYXNzcGhyYXNlOiAiLAorCQkJICAgIFJQX0FMTE9XX1NURElOKTsKKwkJLyogVHJ5IHRvIGxvYWQgdXNpbmcgdGhlIHBhc3NwaHJhc2UuICovCisJCXByaXZhdGUgPSBrZXlfbG9hZF9wcml2YXRlKGlkZW50aXR5X2ZpbGUsIHBhc3NwaHJhc2UsICZjb21tZW50KTsKKwkJaWYgKHByaXZhdGUgPT0gTlVMTCkgeworCQkJbWVtc2V0KHBhc3NwaHJhc2UsIDAsIHN0cmxlbihwYXNzcGhyYXNlKSk7CisJCQl4ZnJlZShwYXNzcGhyYXNlKTsKKwkJCXByaW50ZigiQmFkIHBhc3NwaHJhc2UuXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9IGVsc2UgeworCQlwYXNzcGhyYXNlID0geHN0cmR1cCgiIik7CisJfQorCWlmIChwcml2YXRlLT50eXBlICE9IEtFWV9SU0ExKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ29tbWVudHMgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciBSU0ExIGtleXMuXG4iKTsKKwkJa2V5X2ZyZWUocHJpdmF0ZSk7CisJCWV4aXQoMSk7CisJfQorCXByaW50ZigiS2V5IG5vdyBoYXMgY29tbWVudCAnJXMnXG4iLCBjb21tZW50KTsKKworCWlmIChpZGVudGl0eV9jb21tZW50KSB7CisJCXN0cmxjcHkobmV3X2NvbW1lbnQsIGlkZW50aXR5X2NvbW1lbnQsIHNpemVvZihuZXdfY29tbWVudCkpOworCX0gZWxzZSB7CisJCXByaW50ZigiRW50ZXIgbmV3IGNvbW1lbnQ6ICIpOworCQlmZmx1c2goc3Rkb3V0KTsKKwkJaWYgKCFmZ2V0cyhuZXdfY29tbWVudCwgc2l6ZW9mKG5ld19jb21tZW50KSwgc3RkaW4pKSB7CisJCQltZW1zZXQocGFzc3BocmFzZSwgMCwgc3RybGVuKHBhc3NwaHJhc2UpKTsKKwkJCWtleV9mcmVlKHByaXZhdGUpOworCQkJZXhpdCgxKTsKKwkJfQorCQluZXdfY29tbWVudFtzdHJjc3BuKG5ld19jb21tZW50LCAiXG4iKV0gPSAnXDAnOworCX0KKworCS8qIFNhdmUgdGhlIGZpbGUgdXNpbmcgdGhlIG5ldyBwYXNzcGhyYXNlLiAqLworCWlmICgha2V5X3NhdmVfcHJpdmF0ZShwcml2YXRlLCBpZGVudGl0eV9maWxlLCBwYXNzcGhyYXNlLCBuZXdfY29tbWVudCkpIHsKKwkJcHJpbnRmKCJTYXZpbmcgdGhlIGtleSBmYWlsZWQ6ICVzLlxuIiwgaWRlbnRpdHlfZmlsZSk7CisJCW1lbXNldChwYXNzcGhyYXNlLCAwLCBzdHJsZW4ocGFzc3BocmFzZSkpOworCQl4ZnJlZShwYXNzcGhyYXNlKTsKKwkJa2V5X2ZyZWUocHJpdmF0ZSk7CisJCXhmcmVlKGNvbW1lbnQpOworCQlleGl0KDEpOworCX0KKwltZW1zZXQocGFzc3BocmFzZSwgMCwgc3RybGVuKHBhc3NwaHJhc2UpKTsKKwl4ZnJlZShwYXNzcGhyYXNlKTsKKwlwdWJsaWMgPSBrZXlfZnJvbV9wcml2YXRlKHByaXZhdGUpOworCWtleV9mcmVlKHByaXZhdGUpOworCisJc3RybGNhdChpZGVudGl0eV9maWxlLCAiLnB1YiIsIHNpemVvZihpZGVudGl0eV9maWxlKSk7CisJZmQgPSBvcGVuKGlkZW50aXR5X2ZpbGUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA2NDQpOworCWlmIChmZCA9PSAtMSkgeworCQlwcmludGYoIkNvdWxkIG5vdCBzYXZlIHlvdXIgcHVibGljIGtleSBpbiAlc1xuIiwgaWRlbnRpdHlfZmlsZSk7CisJCWV4aXQoMSk7CisJfQorCWYgPSBmZG9wZW4oZmQsICJ3Iik7CisJaWYgKGYgPT0gTlVMTCkgeworCQlwcmludGYoImZkb3BlbiAlcyBmYWlsZWRcbiIsIGlkZW50aXR5X2ZpbGUpOworCQlleGl0KDEpOworCX0KKwlpZiAoIWtleV93cml0ZShwdWJsaWMsIGYpKQorCQlmcHJpbnRmKHN0ZGVyciwgIndyaXRlIGtleSBmYWlsZWRcbiIpOworCWtleV9mcmVlKHB1YmxpYyk7CisJZnByaW50ZihmLCAiICVzXG4iLCBuZXdfY29tbWVudCk7CisJZmNsb3NlKGYpOworCisJeGZyZWUoY29tbWVudCk7CisKKwlwcmludGYoIlRoZSBjb21tZW50IGluIHlvdXIga2V5IGZpbGUgaGFzIGJlZW4gY2hhbmdlZC5cbiIpOworCWV4aXQoMCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2ZtdF92YWxpZGl0eSh1X2ludDY0X3QgdmFsaWRfZnJvbSwgdV9pbnQ2NF90IHZhbGlkX3RvKQoreworCWNoYXIgZnJvbVszMl0sIHRvWzMyXTsKKwlzdGF0aWMgY2hhciByZXRbNjRdOworCXRpbWVfdCB0dDsKKwlzdHJ1Y3QgdG0gKnRtOworCisJKmZyb20gPSAqdG8gPSAnXDAnOworCWlmICh2YWxpZF9mcm9tID09IDAgJiYgdmFsaWRfdG8gPT0gMHhmZmZmZmZmZmZmZmZmZmZmVUxMKQorCQlyZXR1cm4gImZvcmV2ZXIiOworCisJaWYgKHZhbGlkX2Zyb20gIT0gMCkgeworCQkvKiBYWFggcmV2aXNpdCBJTlRfTUFYIGluIDIwMzggOikgKi8KKwkJdHQgPSB2YWxpZF9mcm9tID4gSU5UX01BWCA/IElOVF9NQVggOiB2YWxpZF9mcm9tOworCQl0bSA9IGxvY2FsdGltZSgmdHQpOworCQlzdHJmdGltZShmcm9tLCBzaXplb2YoZnJvbSksICIlWS0lbS0lZFQlSDolTTolUyIsIHRtKTsKKwl9CisJaWYgKHZhbGlkX3RvICE9IDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCkgeworCQkvKiBYWFggcmV2aXNpdCBJTlRfTUFYIGluIDIwMzggOikgKi8KKwkJdHQgPSB2YWxpZF90byA+IElOVF9NQVggPyBJTlRfTUFYIDogdmFsaWRfdG87CisJCXRtID0gbG9jYWx0aW1lKCZ0dCk7CisJCXN0cmZ0aW1lKHRvLCBzaXplb2YodG8pLCAiJVktJW0tJWRUJUg6JU06JVMiLCB0bSk7CisJfQorCisJaWYgKHZhbGlkX2Zyb20gPT0gMCkgeworCQlzbnByaW50ZihyZXQsIHNpemVvZihyZXQpLCAiYmVmb3JlICVzIiwgdG8pOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAodmFsaWRfdG8gPT0gMHhmZmZmZmZmZmZmZmZmZmZmVUxMKSB7CisJCXNucHJpbnRmKHJldCwgc2l6ZW9mKHJldCksICJhZnRlciAlcyIsIGZyb20pOworCQlyZXR1cm4gcmV0OworCX0KKworCXNucHJpbnRmKHJldCwgc2l6ZW9mKHJldCksICJmcm9tICVzIHRvICVzIiwgZnJvbSwgdG8pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCithZGRfZmxhZ19vcHRpb24oQnVmZmVyICpjLCBjb25zdCBjaGFyICpuYW1lKQoreworCWRlYnVnMygiJXM6ICVzIiwgX19mdW5jX18sIG5hbWUpOworCWJ1ZmZlcl9wdXRfY3N0cmluZyhjLCBuYW1lKTsKKwlidWZmZXJfcHV0X3N0cmluZyhjLCBOVUxMLCAwKTsKK30KKworc3RhdGljIHZvaWQKK2FkZF9zdHJpbmdfb3B0aW9uKEJ1ZmZlciAqYywgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJQnVmZmVyIGI7CisKKwlkZWJ1ZzMoIiVzOiAlcz0lcyIsIF9fZnVuY19fLCBuYW1lLCB2YWx1ZSk7CisJYnVmZmVyX2luaXQoJmIpOworCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwgdmFsdWUpOworCisJYnVmZmVyX3B1dF9jc3RyaW5nKGMsIG5hbWUpOworCWJ1ZmZlcl9wdXRfc3RyaW5nKGMsIGJ1ZmZlcl9wdHIoJmIpLCBidWZmZXJfbGVuKCZiKSk7CisKKwlidWZmZXJfZnJlZSgmYik7Cit9CisKKyNkZWZpbmUgT1BUSU9OU19DUklUSUNBTAkxCisjZGVmaW5lIE9QVElPTlNfRVhURU5TSU9OUwkyCitzdGF0aWMgdm9pZAorcHJlcGFyZV9vcHRpb25zX2J1ZihCdWZmZXIgKmMsIGludCB3aGljaCkKK3sKKwlidWZmZXJfY2xlYXIoYyk7CisJaWYgKCh3aGljaCAmIE9QVElPTlNfQ1JJVElDQUwpICE9IDAgJiYKKwkgICAgY2VydGZsYWdzX2NvbW1hbmQgIT0gTlVMTCkKKwkJYWRkX3N0cmluZ19vcHRpb24oYywgImZvcmNlLWNvbW1hbmQiLCBjZXJ0ZmxhZ3NfY29tbWFuZCk7CisJaWYgKCh3aGljaCAmIE9QVElPTlNfRVhURU5TSU9OUykgIT0gMCAmJgorCSAgICAoY2VydGZsYWdzX2ZsYWdzICYgQ0VSVE9QVF9YX0ZXRCkgIT0gMCkKKwkJYWRkX2ZsYWdfb3B0aW9uKGMsICJwZXJtaXQtWDExLWZvcndhcmRpbmciKTsKKwlpZiAoKHdoaWNoICYgT1BUSU9OU19FWFRFTlNJT05TKSAhPSAwICYmCisJICAgIChjZXJ0ZmxhZ3NfZmxhZ3MgJiBDRVJUT1BUX0FHRU5UX0ZXRCkgIT0gMCkKKwkJYWRkX2ZsYWdfb3B0aW9uKGMsICJwZXJtaXQtYWdlbnQtZm9yd2FyZGluZyIpOworCWlmICgod2hpY2ggJiBPUFRJT05TX0VYVEVOU0lPTlMpICE9IDAgJiYKKwkgICAgKGNlcnRmbGFnc19mbGFncyAmIENFUlRPUFRfUE9SVF9GV0QpICE9IDApCisJCWFkZF9mbGFnX29wdGlvbihjLCAicGVybWl0LXBvcnQtZm9yd2FyZGluZyIpOworCWlmICgod2hpY2ggJiBPUFRJT05TX0VYVEVOU0lPTlMpICE9IDAgJiYKKwkgICAgKGNlcnRmbGFnc19mbGFncyAmIENFUlRPUFRfUFRZKSAhPSAwKQorCQlhZGRfZmxhZ19vcHRpb24oYywgInBlcm1pdC1wdHkiKTsKKwlpZiAoKHdoaWNoICYgT1BUSU9OU19FWFRFTlNJT05TKSAhPSAwICYmCisJICAgIChjZXJ0ZmxhZ3NfZmxhZ3MgJiBDRVJUT1BUX1VTRVJfUkMpICE9IDApCisJCWFkZF9mbGFnX29wdGlvbihjLCAicGVybWl0LXVzZXItcmMiKTsKKwlpZiAoKHdoaWNoICYgT1BUSU9OU19DUklUSUNBTCkgIT0gMCAmJgorCSAgICBjZXJ0ZmxhZ3Nfc3JjX2FkZHIgIT0gTlVMTCkKKwkJYWRkX3N0cmluZ19vcHRpb24oYywgInNvdXJjZS1hZGRyZXNzIiwgY2VydGZsYWdzX3NyY19hZGRyKTsKK30KKworc3RhdGljIEtleSAqCitsb2FkX3BrY3MxMV9rZXkoY2hhciAqcGF0aCkKK3sKKyNpZmRlZiBFTkFCTEVfUEtDUzExCisJS2V5ICoqa2V5cyA9IE5VTEwsICpwdWJsaWMsICpwcml2YXRlID0gTlVMTDsKKwlpbnQgaSwgbmtleXM7CisKKwlpZiAoKHB1YmxpYyA9IGtleV9sb2FkX3B1YmxpYyhwYXRoLCBOVUxMKSkgPT0gTlVMTCkKKwkJZmF0YWwoIkNvdWxkbid0IGxvYWQgQ0EgcHVibGljIGtleSBcIiVzXCIiLCBwYXRoKTsKKworCW5rZXlzID0gcGtjczExX2FkZF9wcm92aWRlcihwa2NzMTFwcm92aWRlciwgaWRlbnRpdHlfcGFzc3BocmFzZSwgJmtleXMpOworCWRlYnVnMygiJXM6ICVkIGtleXMiLCBfX2Z1bmNfXywgbmtleXMpOworCWlmIChua2V5cyA8PSAwKQorCQlmYXRhbCgiY2Fubm90IHJlYWQgcHVibGljIGtleSBmcm9tIHBrY3MxMSIpOworCWZvciAoaSA9IDA7IGkgPCBua2V5czsgaSsrKSB7CisJCWlmIChrZXlfZXF1YWxfcHVibGljKHB1YmxpYywga2V5c1tpXSkpIHsKKwkJCXByaXZhdGUgPSBrZXlzW2ldOworCQkJY29udGludWU7CisJCX0KKwkJa2V5X2ZyZWUoa2V5c1tpXSk7CisJfQorCXhmcmVlKGtleXMpOworCWtleV9mcmVlKHB1YmxpYyk7CisJcmV0dXJuIHByaXZhdGU7CisjZWxzZQorCWZhdGFsKCJubyBwa2NzMTEgc3VwcG9ydCIpOworI2VuZGlmIC8qIEVOQUJMRV9QS0NTMTEgKi8KK30KKworc3RhdGljIHZvaWQKK2RvX2NhX3NpZ24oc3RydWN0IHBhc3N3ZCAqcHcsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSwgZmQ7CisJdV9pbnQgbjsKKwlLZXkgKmNhLCAqcHVibGljOworCWNoYXIgKm90bXAsICp0bXAsICpjcCwgKm91dCwgKmNvbW1lbnQsICoqcGxpc3QgPSBOVUxMOworCUZJTEUgKmY7CisJaW50IHYwMCA9IDA7IC8qIGxlZ2FjeSBrZXlzICovCisKKwlpZiAoa2V5X3R5cGVfbmFtZSAhPSBOVUxMKSB7CisJCXN3aXRjaCAoa2V5X3R5cGVfZnJvbV9uYW1lKGtleV90eXBlX25hbWUpKSB7CisJCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKKwkJY2FzZSBLRVlfRFNBX0NFUlRfVjAwOgorCQkJdjAwID0gMTsKKwkJCWJyZWFrOworCQljYXNlIEtFWV9VTlNQRUM6CisJCQlpZiAoc3RyY2FzZWNtcChrZXlfdHlwZV9uYW1lLCAidjAwIikgPT0gMCkgeworCQkJCXYwMCA9IDE7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKHN0cmNhc2VjbXAoa2V5X3R5cGVfbmFtZSwgInYwMSIpID09IDApCisJCQkJYnJlYWs7CisJCQkvKiBGQUxMVEhST1VHSCAqLworCQlkZWZhdWx0OgorCQkJZnByaW50ZihzdGRlcnIsICJ1bmtub3duIGtleSB0eXBlICVzXG4iLCBrZXlfdHlwZV9uYW1lKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisKKwlwa2NzMTFfaW5pdCgxKTsKKwl0bXAgPSB0aWxkZV9leHBhbmRfZmlsZW5hbWUoY2Ffa2V5X3BhdGgsIHB3LT5wd191aWQpOworCWlmIChwa2NzMTFwcm92aWRlciAhPSBOVUxMKSB7CisJCWlmICgoY2EgPSBsb2FkX3BrY3MxMV9rZXkodG1wKSkgPT0gTlVMTCkKKwkJCWZhdGFsKCJObyBQS0NTIzExIGtleSBtYXRjaGluZyAlcyBmb3VuZCIsIGNhX2tleV9wYXRoKTsKKwl9IGVsc2UgaWYgKChjYSA9IGxvYWRfaWRlbnRpdHkodG1wKSkgPT0gTlVMTCkKKwkJZmF0YWwoIkNvdWxkbid0IGxvYWQgQ0Ega2V5IFwiJXNcIiIsIHRtcCk7CisJeGZyZWUodG1wKTsKKworCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKwkJLyogU3BsaXQgbGlzdCBvZiBwcmluY2lwYWxzICovCisJCW4gPSAwOworCQlpZiAoY2VydF9wcmluY2lwYWxzICE9IE5VTEwpIHsKKwkJCW90bXAgPSB0bXAgPSB4c3RyZHVwKGNlcnRfcHJpbmNpcGFscyk7CisJCQlwbGlzdCA9IE5VTEw7CisJCQlmb3IgKDsgKGNwID0gc3Ryc2VwKCZ0bXAsICIsIikpICE9IE5VTEw7IG4rKykgeworCQkJCXBsaXN0ID0geHJlYWxsb2MocGxpc3QsIG4gKyAxLCBzaXplb2YoKnBsaXN0KSk7CisJCQkJaWYgKCoocGxpc3Rbbl0gPSB4c3RyZHVwKGNwKSkgPT0gJ1wwJykKKwkJCQkJZmF0YWwoIkVtcHR5IHByaW5jaXBhbCBuYW1lIik7CisJCQl9CisJCQl4ZnJlZShvdG1wKTsKKwkJfQorCQorCQl0bXAgPSB0aWxkZV9leHBhbmRfZmlsZW5hbWUoYXJndltpXSwgcHctPnB3X3VpZCk7CisJCWlmICgocHVibGljID0ga2V5X2xvYWRfcHVibGljKHRtcCwgJmNvbW1lbnQpKSA9PSBOVUxMKQorCQkJZmF0YWwoIiVzOiB1bmFibGUgdG8gb3BlbiBcIiVzXCIiLCBfX2Z1bmNfXywgdG1wKTsKKwkJaWYgKHB1YmxpYy0+dHlwZSAhPSBLRVlfUlNBICYmIHB1YmxpYy0+dHlwZSAhPSBLRVlfRFNBICYmCisJCSAgICBwdWJsaWMtPnR5cGUgIT0gS0VZX0VDRFNBKQorCQkJZmF0YWwoIiVzOiBrZXkgXCIlc1wiIHR5cGUgJXMgY2Fubm90IGJlIGNlcnRpZmllZCIsCisJCQkgICAgX19mdW5jX18sIHRtcCwga2V5X3R5cGUocHVibGljKSk7CisKKwkJLyogUHJlcGFyZSBjZXJ0aWZpY2F0ZSB0byBzaWduICovCisJCWlmIChrZXlfdG9fY2VydGlmaWVkKHB1YmxpYywgdjAwKSAhPSAwKQorCQkJZmF0YWwoIkNvdWxkIG5vdCB1cGdyYWRlIGtleSAlcyB0byBjZXJ0aWZpY2F0ZSIsIHRtcCk7CisJCXB1YmxpYy0+Y2VydC0+dHlwZSA9IGNlcnRfa2V5X3R5cGU7CisJCXB1YmxpYy0+Y2VydC0+c2VyaWFsID0gKHVfaW50NjRfdCljZXJ0X3NlcmlhbDsKKwkJcHVibGljLT5jZXJ0LT5rZXlfaWQgPSB4c3RyZHVwKGNlcnRfa2V5X2lkKTsKKwkJcHVibGljLT5jZXJ0LT5ucHJpbmNpcGFscyA9IG47CisJCXB1YmxpYy0+Y2VydC0+cHJpbmNpcGFscyA9IHBsaXN0OworCQlwdWJsaWMtPmNlcnQtPnZhbGlkX2FmdGVyID0gY2VydF92YWxpZF9mcm9tOworCQlwdWJsaWMtPmNlcnQtPnZhbGlkX2JlZm9yZSA9IGNlcnRfdmFsaWRfdG87CisJCWlmICh2MDApIHsKKwkJCXByZXBhcmVfb3B0aW9uc19idWYoJnB1YmxpYy0+Y2VydC0+Y3JpdGljYWwsCisJCQkgICAgT1BUSU9OU19DUklUSUNBTHxPUFRJT05TX0VYVEVOU0lPTlMpOworCQl9IGVsc2UgeworCQkJcHJlcGFyZV9vcHRpb25zX2J1ZigmcHVibGljLT5jZXJ0LT5jcml0aWNhbCwKKwkJCSAgICBPUFRJT05TX0NSSVRJQ0FMKTsKKwkJCXByZXBhcmVfb3B0aW9uc19idWYoJnB1YmxpYy0+Y2VydC0+ZXh0ZW5zaW9ucywKKwkJCSAgICBPUFRJT05TX0VYVEVOU0lPTlMpOworCQl9CisJCXB1YmxpYy0+Y2VydC0+c2lnbmF0dXJlX2tleSA9IGtleV9mcm9tX3ByaXZhdGUoY2EpOworCisJCWlmIChrZXlfY2VydGlmeShwdWJsaWMsIGNhKSAhPSAwKQorCQkJZmF0YWwoIkNvdWxkbid0IG5vdCBjZXJ0aWZ5IGtleSAlcyIsIHRtcCk7CisKKwkJaWYgKChjcCA9IHN0cnJjaHIodG1wLCAnLicpKSAhPSBOVUxMICYmIHN0cmNtcChjcCwgIi5wdWIiKSA9PSAwKQorCQkJKmNwID0gJ1wwJzsKKwkJeGFzcHJpbnRmKCZvdXQsICIlcy1jZXJ0LnB1YiIsIHRtcCk7CisJCXhmcmVlKHRtcCk7CisKKwkJaWYgKChmZCA9IG9wZW4ob3V0LCBPX1dST05MWXxPX0NSRUFUfE9fVFJVTkMsIDA2NDQpKSA9PSAtMSkKKwkJCWZhdGFsKCJDb3VsZCBub3Qgb3BlbiBcIiVzXCIgZm9yIHdyaXRpbmc6ICVzIiwgb3V0LAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCWlmICgoZiA9IGZkb3BlbihmZCwgInciKSkgPT0gTlVMTCkKKwkJCWZhdGFsKCIlczogZmRvcGVuOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCQlpZiAoIWtleV93cml0ZShwdWJsaWMsIGYpKQorCQkJZmF0YWwoIkNvdWxkIG5vdCB3cml0ZSBjZXJ0aWZpZWQga2V5IHRvICVzIiwgb3V0KTsKKwkJZnByaW50ZihmLCAiICVzXG4iLCBjb21tZW50KTsKKwkJZmNsb3NlKGYpOworCisJCWlmICghcXVpZXQpIHsKKwkJCWxvZ2l0KCJTaWduZWQgJXMga2V5ICVzOiBpZCBcIiVzXCIgc2VyaWFsICVsbHUlcyVzICIKKwkJCSAgICAidmFsaWQgJXMiLCBrZXlfY2VydF90eXBlKHB1YmxpYyksIAorCQkJICAgIG91dCwgcHVibGljLT5jZXJ0LT5rZXlfaWQsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwdWJsaWMtPmNlcnQtPnNlcmlhbCwKKwkJCSAgICBjZXJ0X3ByaW5jaXBhbHMgIT0gTlVMTCA/ICIgZm9yICIgOiAiIiwKKwkJCSAgICBjZXJ0X3ByaW5jaXBhbHMgIT0gTlVMTCA/IGNlcnRfcHJpbmNpcGFscyA6ICIiLAorCQkJICAgIGZtdF92YWxpZGl0eShjZXJ0X3ZhbGlkX2Zyb20sIGNlcnRfdmFsaWRfdG8pKTsKKwkJfQorCisJCWtleV9mcmVlKHB1YmxpYyk7CisJCXhmcmVlKG91dCk7CisJfQorCXBrY3MxMV90ZXJtaW5hdGUoKTsKKwlleGl0KDApOworfQorCitzdGF0aWMgdV9pbnQ2NF90CitwYXJzZV9yZWxhdGl2ZV90aW1lKGNvbnN0IGNoYXIgKnMsIHRpbWVfdCBub3cpCit7CisJaW50NjRfdCBtdWwsIHNlY3M7CisKKwltdWwgPSAqcyA9PSAnLScgPyAtMSA6IDE7CisKKwlpZiAoKHNlY3MgPSBjb252dGltZShzICsgMSkpID09IC0xKQorCQlmYXRhbCgiSW52YWxpZCByZWxhdGl2ZSBjZXJ0aWZpY2F0ZSB0aW1lICVzIiwgcyk7CisJaWYgKG11bCA9PSAtMSAmJiBzZWNzID4gbm93KQorCQlmYXRhbCgiQ2VydGlmaWNhdGUgdGltZSAlcyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQiLCBzKTsKKwlyZXR1cm4gbm93ICsgKHVfaW50NjRfdCkoc2VjcyAqIG11bCk7Cit9CisKK3N0YXRpYyB1X2ludDY0X3QKK3BhcnNlX2Fic29sdXRlX3RpbWUoY29uc3QgY2hhciAqcykKK3sKKwlzdHJ1Y3QgdG0gdG07CisJdGltZV90IHR0OworCWNoYXIgYnVmWzMyXSwgKmZtdDsKKworCS8qCisJICogUE9TSVggc3RycHRpbWUgc2F5cyAiVGhlIGFwcGxpY2F0aW9uIHNoYWxsIGVuc3VyZSB0aGF0IHRoZXJlIAorCSAqIGlzIHdoaXRlLXNwYWNlIG9yIG90aGVyIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyBiZXR3ZWVuCisJICogYW55IHR3byBjb252ZXJzaW9uIHNwZWNpZmljYXRpb25zIiBzbyBhcnJhbmdlIHRoaW5ncyB0aGlzIHdheS4KKwkgKi8KKwlzd2l0Y2ggKHN0cmxlbihzKSkgeworCWNhc2UgODoKKwkJZm10ID0gIiVZLSVtLSVkIjsKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiUuNHMtJS4ycy0lLjJzIiwgcywgcyArIDQsIHMgKyA2KTsKKwkJYnJlYWs7CisJY2FzZSAxNDoKKwkJZm10ID0gIiVZLSVtLSVkVCVIOiVNOiVTIjsKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiUuNHMtJS4ycy0lLjJzVCUuMnM6JS4yczolLjJzIiwKKwkJICAgIHMsIHMgKyA0LCBzICsgNiwgcyArIDgsIHMgKyAxMCwgcyArIDEyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZmF0YWwoIkludmFsaWQgY2VydGlmaWNhdGUgdGltZSBmb3JtYXQgJXMiLCBzKTsKKwl9CisKKwliemVybygmdG0sIHNpemVvZih0bSkpOworCWlmIChzdHJwdGltZShidWYsIGZtdCwgJnRtKSA9PSBOVUxMKQorCQlmYXRhbCgiSW52YWxpZCBjZXJ0aWZpY2F0ZSB0aW1lICVzIiwgcyk7CisJaWYgKCh0dCA9IG1rdGltZSgmdG0pKSA8IDApCisJCWZhdGFsKCJDZXJ0aWZpY2F0ZSB0aW1lICVzIGNhbm5vdCBiZSByZXByZXNlbnRlZCIsIHMpOworCXJldHVybiAodV9pbnQ2NF90KXR0OworfQorCitzdGF0aWMgdm9pZAorcGFyc2VfY2VydF90aW1lcyhjaGFyICp0aW1lc3BlYykKK3sKKwljaGFyICpmcm9tLCAqdG87CisJdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisJaW50NjRfdCBzZWNzOworCisJLyogK3RpbWVzcGVjIHJlbGF0aXZlIHRvIG5vdyAqLworCWlmICgqdGltZXNwZWMgPT0gJysnICYmIHN0cmNocih0aW1lc3BlYywgJzonKSA9PSBOVUxMKSB7CisJCWlmICgoc2VjcyA9IGNvbnZ0aW1lKHRpbWVzcGVjICsgMSkpID09IC0xKQorCQkJZmF0YWwoIkludmFsaWQgcmVsYXRpdmUgY2VydGlmaWNhdGUgbGlmZSAlcyIsIHRpbWVzcGVjKTsKKwkJY2VydF92YWxpZF90byA9IG5vdyArIHNlY3M7CisJCS8qCisJCSAqIEJhY2tkYXRlIGNlcnRpZmljYXRlIG9uZSBtaW51dGUgdG8gYXZvaWQgcHJvYmxlbXMgb24gaG9zdHMKKwkJICogd2l0aCBwb29ybHktc3luY2hyb25pc2VkIGNsb2Nrcy4KKwkJICovCisJCWNlcnRfdmFsaWRfZnJvbSA9ICgobm93IC0gNTkpLyA2MCkgKiA2MDsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogZnJvbTp0bywgd2hlcmUKKwkgKiBmcm9tIDo9IFsrLV10aW1lc3BlYyB8IFlZWVlNTUREIHwgWVlZWU1NRERISE1NU1MKKwkgKiAgIHRvIDo9IFsrLV10aW1lc3BlYyB8IFlZWVlNTUREIHwgWVlZWU1NRERISE1NU1MKKwkgKi8KKwlmcm9tID0geHN0cmR1cCh0aW1lc3BlYyk7CisJdG8gPSBzdHJjaHIoZnJvbSwgJzonKTsKKwlpZiAodG8gPT0gTlVMTCB8fCBmcm9tID09IHRvIHx8ICoodG8gKyAxKSA9PSAnXDAnKQorCQlmYXRhbCgiSW52YWxpZCBjZXJ0aWZpY2F0ZSBsaWZlIHNwZWNpZmljYXRpb24gJXMiLCB0aW1lc3BlYyk7CisJKnRvKysgPSAnXDAnOworCisJaWYgKCpmcm9tID09ICctJyB8fCAqZnJvbSA9PSAnKycpCisJCWNlcnRfdmFsaWRfZnJvbSA9IHBhcnNlX3JlbGF0aXZlX3RpbWUoZnJvbSwgbm93KTsKKwllbHNlCisJCWNlcnRfdmFsaWRfZnJvbSA9IHBhcnNlX2Fic29sdXRlX3RpbWUoZnJvbSk7CisKKwlpZiAoKnRvID09ICctJyB8fCAqdG8gPT0gJysnKQorCQljZXJ0X3ZhbGlkX3RvID0gcGFyc2VfcmVsYXRpdmVfdGltZSh0bywgY2VydF92YWxpZF9mcm9tKTsKKwllbHNlCisJCWNlcnRfdmFsaWRfdG8gPSBwYXJzZV9hYnNvbHV0ZV90aW1lKHRvKTsKKworCWlmIChjZXJ0X3ZhbGlkX3RvIDw9IGNlcnRfdmFsaWRfZnJvbSkKKwkJZmF0YWwoIkVtcHR5IGNlcnRpZmljYXRlIHZhbGlkaXR5IGludGVydmFsIik7CisJeGZyZWUoZnJvbSk7Cit9CisKK3N0YXRpYyB2b2lkCithZGRfY2VydF9vcHRpb24oY2hhciAqb3B0KQoreworCWNoYXIgKnZhbDsKKworCWlmIChzdHJjYXNlY21wKG9wdCwgImNsZWFyIikgPT0gMCkKKwkJY2VydGZsYWdzX2ZsYWdzID0gMDsKKwllbHNlIGlmIChzdHJjYXNlY21wKG9wdCwgIm5vLXgxMS1mb3J3YXJkaW5nIikgPT0gMCkKKwkJY2VydGZsYWdzX2ZsYWdzICY9IH5DRVJUT1BUX1hfRldEOworCWVsc2UgaWYgKHN0cmNhc2VjbXAob3B0LCAicGVybWl0LXgxMS1mb3J3YXJkaW5nIikgPT0gMCkKKwkJY2VydGZsYWdzX2ZsYWdzIHw9IENFUlRPUFRfWF9GV0Q7CisJZWxzZSBpZiAoc3RyY2FzZWNtcChvcHQsICJuby1hZ2VudC1mb3J3YXJkaW5nIikgPT0gMCkKKwkJY2VydGZsYWdzX2ZsYWdzICY9IH5DRVJUT1BUX0FHRU5UX0ZXRDsKKwllbHNlIGlmIChzdHJjYXNlY21wKG9wdCwgInBlcm1pdC1hZ2VudC1mb3J3YXJkaW5nIikgPT0gMCkKKwkJY2VydGZsYWdzX2ZsYWdzIHw9IENFUlRPUFRfQUdFTlRfRldEOworCWVsc2UgaWYgKHN0cmNhc2VjbXAob3B0LCAibm8tcG9ydC1mb3J3YXJkaW5nIikgPT0gMCkKKwkJY2VydGZsYWdzX2ZsYWdzICY9IH5DRVJUT1BUX1BPUlRfRldEOworCWVsc2UgaWYgKHN0cmNhc2VjbXAob3B0LCAicGVybWl0LXBvcnQtZm9yd2FyZGluZyIpID09IDApCisJCWNlcnRmbGFnc19mbGFncyB8PSBDRVJUT1BUX1BPUlRfRldEOworCWVsc2UgaWYgKHN0cmNhc2VjbXAob3B0LCAibm8tcHR5IikgPT0gMCkKKwkJY2VydGZsYWdzX2ZsYWdzICY9IH5DRVJUT1BUX1BUWTsKKwllbHNlIGlmIChzdHJjYXNlY21wKG9wdCwgInBlcm1pdC1wdHkiKSA9PSAwKQorCQljZXJ0ZmxhZ3NfZmxhZ3MgfD0gQ0VSVE9QVF9QVFk7CisJZWxzZSBpZiAoc3RyY2FzZWNtcChvcHQsICJuby11c2VyLXJjIikgPT0gMCkKKwkJY2VydGZsYWdzX2ZsYWdzICY9IH5DRVJUT1BUX1VTRVJfUkM7CisJZWxzZSBpZiAoc3RyY2FzZWNtcChvcHQsICJwZXJtaXQtdXNlci1yYyIpID09IDApCisJCWNlcnRmbGFnc19mbGFncyB8PSBDRVJUT1BUX1VTRVJfUkM7CisJZWxzZSBpZiAoc3RybmNhc2VjbXAob3B0LCAiZm9yY2UtY29tbWFuZD0iLCAxNCkgPT0gMCkgeworCQl2YWwgPSBvcHQgKyAxNDsKKwkJaWYgKCp2YWwgPT0gJ1wwJykKKwkJCWZhdGFsKCJFbXB0eSBmb3JjZS1jb21tYW5kIG9wdGlvbiIpOworCQlpZiAoY2VydGZsYWdzX2NvbW1hbmQgIT0gTlVMTCkKKwkJCWZhdGFsKCJmb3JjZS1jb21tYW5kIGFscmVhZHkgc3BlY2lmaWVkIik7CisJCWNlcnRmbGFnc19jb21tYW5kID0geHN0cmR1cCh2YWwpOworCX0gZWxzZSBpZiAoc3RybmNhc2VjbXAob3B0LCAic291cmNlLWFkZHJlc3M9IiwgMTUpID09IDApIHsKKwkJdmFsID0gb3B0ICsgMTU7CisJCWlmICgqdmFsID09ICdcMCcpCisJCQlmYXRhbCgiRW1wdHkgc291cmNlLWFkZHJlc3Mgb3B0aW9uIik7CisJCWlmIChjZXJ0ZmxhZ3Nfc3JjX2FkZHIgIT0gTlVMTCkKKwkJCWZhdGFsKCJzb3VyY2UtYWRkcmVzcyBhbHJlYWR5IHNwZWNpZmllZCIpOworCQlpZiAoYWRkcl9tYXRjaF9jaWRyX2xpc3QoTlVMTCwgdmFsKSAhPSAwKQorCQkJZmF0YWwoIkludmFsaWQgc291cmNlLWFkZHJlc3MgbGlzdCIpOworCQljZXJ0ZmxhZ3Nfc3JjX2FkZHIgPSB4c3RyZHVwKHZhbCk7CisJfSBlbHNlCisJCWZhdGFsKCJVbnN1cHBvcnRlZCBjZXJ0aWZpY2F0ZSBvcHRpb24gXCIlc1wiIiwgb3B0KTsKK30KKworc3RhdGljIHZvaWQKK3Nob3dfb3B0aW9ucyhjb25zdCBCdWZmZXIgKm9wdGJ1ZiwgaW50IHYwMCwgaW50IGluX2NyaXRpY2FsKQoreworCXVfY2hhciAqbmFtZSwgKmRhdGE7CisJdV9pbnQgZGxlbjsKKwlCdWZmZXIgb3B0aW9ucywgb3B0aW9uOworCisJYnVmZmVyX2luaXQoJm9wdGlvbnMpOworCWJ1ZmZlcl9hcHBlbmQoJm9wdGlvbnMsIGJ1ZmZlcl9wdHIob3B0YnVmKSwgYnVmZmVyX2xlbihvcHRidWYpKTsKKworCWJ1ZmZlcl9pbml0KCZvcHRpb24pOworCXdoaWxlIChidWZmZXJfbGVuKCZvcHRpb25zKSAhPSAwKSB7CisJCW5hbWUgPSBidWZmZXJfZ2V0X3N0cmluZygmb3B0aW9ucywgTlVMTCk7CisJCWRhdGEgPSBidWZmZXJfZ2V0X3N0cmluZ19wdHIoJm9wdGlvbnMsICZkbGVuKTsKKwkJYnVmZmVyX2FwcGVuZCgmb3B0aW9uLCBkYXRhLCBkbGVuKTsKKwkJcHJpbnRmKCIgICAgICAgICAgICAgICAgJXMiLCBuYW1lKTsKKwkJaWYgKCh2MDAgfHwgIWluX2NyaXRpY2FsKSAmJiAKKwkJICAgIChzdHJjbXAobmFtZSwgInBlcm1pdC1YMTEtZm9yd2FyZGluZyIpID09IDAgfHwKKwkJICAgIHN0cmNtcChuYW1lLCAicGVybWl0LWFnZW50LWZvcndhcmRpbmciKSA9PSAwIHx8CisJCSAgICBzdHJjbXAobmFtZSwgInBlcm1pdC1wb3J0LWZvcndhcmRpbmciKSA9PSAwIHx8CisJCSAgICBzdHJjbXAobmFtZSwgInBlcm1pdC1wdHkiKSA9PSAwIHx8CisJCSAgICBzdHJjbXAobmFtZSwgInBlcm1pdC11c2VyLXJjIikgPT0gMCkpCisJCQlwcmludGYoIlxuIik7CisJCWVsc2UgaWYgKCh2MDAgfHwgaW5fY3JpdGljYWwpICYmCisJCSAgICAoc3RyY21wKG5hbWUsICJmb3JjZS1jb21tYW5kIikgPT0gMCB8fAorCQkgICAgc3RyY21wKG5hbWUsICJzb3VyY2UtYWRkcmVzcyIpID09IDApKSB7CisJCQlkYXRhID0gYnVmZmVyX2dldF9zdHJpbmcoJm9wdGlvbiwgTlVMTCk7CisJCQlwcmludGYoIiAlc1xuIiwgZGF0YSk7CisJCQl4ZnJlZShkYXRhKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiIFVOS05PV04gT1BUSU9OIChsZW4gJXUpXG4iLAorCQkJICAgIGJ1ZmZlcl9sZW4oJm9wdGlvbikpOworCQkJYnVmZmVyX2NsZWFyKCZvcHRpb24pOworCQl9CisJCXhmcmVlKG5hbWUpOworCQlpZiAoYnVmZmVyX2xlbigmb3B0aW9uKSAhPSAwKQorCQkJZmF0YWwoIk9wdGlvbiBjb3JydXB0OiBleHRyYSBkYXRhIGF0IGVuZCIpOworCX0KKwlidWZmZXJfZnJlZSgmb3B0aW9uKTsKKwlidWZmZXJfZnJlZSgmb3B0aW9ucyk7Cit9CisKK3N0YXRpYyB2b2lkCitkb19zaG93X2NlcnQoc3RydWN0IHBhc3N3ZCAqcHcpCit7CisJS2V5ICprZXk7CisJc3RydWN0IHN0YXQgc3Q7CisJY2hhciAqa2V5X2ZwLCAqY2FfZnA7CisJdV9pbnQgaSwgdjAwOworCisJaWYgKCFoYXZlX2lkZW50aXR5KQorCQlhc2tfZmlsZW5hbWUocHcsICJFbnRlciBmaWxlIGluIHdoaWNoIHRoZSBrZXkgaXMiKTsKKwlpZiAoc3RhdChpZGVudGl0eV9maWxlLCAmc3QpIDwgMCkKKwkJZmF0YWwoIiVzOiAlczogJXMiLCBfX3Byb2duYW1lLCBpZGVudGl0eV9maWxlLCBzdHJlcnJvcihlcnJubykpOworCWlmICgoa2V5ID0ga2V5X2xvYWRfcHVibGljKGlkZW50aXR5X2ZpbGUsIE5VTEwpKSA9PSBOVUxMKQorCQlmYXRhbCgiJXMgaXMgbm90IGEgcHVibGljIGtleSIsIGlkZW50aXR5X2ZpbGUpOworCWlmICgha2V5X2lzX2NlcnQoa2V5KSkKKwkJZmF0YWwoIiVzIGlzIG5vdCBhIGNlcnRpZmljYXRlIiwgaWRlbnRpdHlfZmlsZSk7CisJdjAwID0ga2V5LT50eXBlID09IEtFWV9SU0FfQ0VSVF9WMDAgfHwga2V5LT50eXBlID09IEtFWV9EU0FfQ0VSVF9WMDA7CisKKwlrZXlfZnAgPSBrZXlfZmluZ2VycHJpbnQoa2V5LCBTU0hfRlBfTUQ1LCBTU0hfRlBfSEVYKTsKKwljYV9mcCA9IGtleV9maW5nZXJwcmludChrZXktPmNlcnQtPnNpZ25hdHVyZV9rZXksCisJICAgIFNTSF9GUF9NRDUsIFNTSF9GUF9IRVgpOworCisJcHJpbnRmKCIlczpcbiIsIGlkZW50aXR5X2ZpbGUpOworCXByaW50ZigiICAgICAgICBUeXBlOiAlcyAlcyBjZXJ0aWZpY2F0ZVxuIiwga2V5X3NzaF9uYW1lKGtleSksCisJICAgIGtleV9jZXJ0X3R5cGUoa2V5KSk7CisJcHJpbnRmKCIgICAgICAgIFB1YmxpYyBrZXk6ICVzICVzXG4iLCBrZXlfdHlwZShrZXkpLCBrZXlfZnApOworCXByaW50ZigiICAgICAgICBTaWduaW5nIENBOiAlcyAlc1xuIiwKKwkgICAga2V5X3R5cGUoa2V5LT5jZXJ0LT5zaWduYXR1cmVfa2V5KSwgY2FfZnApOworCXByaW50ZigiICAgICAgICBLZXkgSUQ6IFwiJXNcIlxuIiwga2V5LT5jZXJ0LT5rZXlfaWQpOworCWlmICghdjAwKSB7CisJCXByaW50ZigiICAgICAgICBTZXJpYWw6ICVsbHVcbiIsCisJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWtleS0+Y2VydC0+c2VyaWFsKTsKKwl9CisJcHJpbnRmKCIgICAgICAgIFZhbGlkOiAlc1xuIiwKKwkgICAgZm10X3ZhbGlkaXR5KGtleS0+Y2VydC0+dmFsaWRfYWZ0ZXIsIGtleS0+Y2VydC0+dmFsaWRfYmVmb3JlKSk7CisJcHJpbnRmKCIgICAgICAgIFByaW5jaXBhbHM6ICIpOworCWlmIChrZXktPmNlcnQtPm5wcmluY2lwYWxzID09IDApCisJCXByaW50ZigiKG5vbmUpXG4iKTsKKwllbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IGtleS0+Y2VydC0+bnByaW5jaXBhbHM7IGkrKykKKwkJCXByaW50ZigiXG4gICAgICAgICAgICAgICAgJXMiLAorCQkJICAgIGtleS0+Y2VydC0+cHJpbmNpcGFsc1tpXSk7CisJCXByaW50ZigiXG4iKTsKKwl9CisJcHJpbnRmKCIgICAgICAgIENyaXRpY2FsIE9wdGlvbnM6ICIpOworCWlmIChidWZmZXJfbGVuKCZrZXktPmNlcnQtPmNyaXRpY2FsKSA9PSAwKQorCQlwcmludGYoIihub25lKVxuIik7CisJZWxzZSB7CisJCXByaW50ZigiXG4iKTsKKwkJc2hvd19vcHRpb25zKCZrZXktPmNlcnQtPmNyaXRpY2FsLCB2MDAsIDEpOworCX0KKwlpZiAoIXYwMCkgeworCQlwcmludGYoIiAgICAgICAgRXh0ZW5zaW9uczogIik7CisJCWlmIChidWZmZXJfbGVuKCZrZXktPmNlcnQtPmV4dGVuc2lvbnMpID09IDApCisJCQlwcmludGYoIihub25lKVxuIik7CisJCWVsc2UgeworCQkJcHJpbnRmKCJcbiIpOworCQkJc2hvd19vcHRpb25zKCZrZXktPmNlcnQtPmV4dGVuc2lvbnMsIHYwMCwgMCk7CisJCX0KKwl9CisJZXhpdCgwKTsKK30KKworc3RhdGljIHZvaWQKK3VzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgW29wdGlvbnNdXG4iLCBfX3Byb2duYW1lKTsKKwlmcHJpbnRmKHN0ZGVyciwgIk9wdGlvbnM6XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgLUEgICAgICAgICAgR2VuZXJhdGUgbm9uLWV4aXN0ZW50IGhvc3Qga2V5cyBmb3IgYWxsIGtleSB0eXBlcy5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAtYSB0cmlhbHMgICBOdW1iZXIgb2YgdHJpYWxzIGZvciBzY3JlZW5pbmcgREgtR0VYIG1vZHVsaS5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAtQiAgICAgICAgICBTaG93IGJ1YmJsZWJhYmJsZSBkaWdlc3Qgb2Yga2V5IGZpbGUuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgLWIgYml0cyAgICAgTnVtYmVyIG9mIGJpdHMgaW4gdGhlIGtleSB0byBjcmVhdGUuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgLUMgY29tbWVudCAgUHJvdmlkZSBuZXcgY29tbWVudC5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAtYyAgICAgICAgICBDaGFuZ2UgY29tbWVudCBpbiBwcml2YXRlIGFuZCBwdWJsaWMga2V5IGZpbGVzLlxuIik7CisjaWZkZWYgRU5BQkxFX1BLQ1MxMQorCWZwcmludGYoc3RkZXJyLCAiICAtRCBwa2NzMTEgICBEb3dubG9hZCBwdWJsaWMga2V5IGZyb20gcGtjczExIHRva2VuLlxuIik7CisjZW5kaWYKKwlmcHJpbnRmKHN0ZGVyciwgIiAgLWUgICAgICAgICAgRXhwb3J0IE9wZW5TU0ggdG8gZm9yZWlnbiBmb3JtYXQga2V5IGZpbGUuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgLUYgaG9zdG5hbWUgRmluZCBob3N0bmFtZSBpbiBrbm93biBob3N0cyBmaWxlLlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC1mIGZpbGVuYW1lIEZpbGVuYW1lIG9mIHRoZSBrZXkgZmlsZS5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAtRyBmaWxlICAgICBHZW5lcmF0ZSBjYW5kaWRhdGVzIGZvciBESC1HRVggbW9kdWxpLlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC1nICAgICAgICAgIFVzZSBnZW5lcmljIEROUyByZXNvdXJjZSByZWNvcmQgZm9ybWF0LlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC1IICAgICAgICAgIEhhc2ggbmFtZXMgaW4ga25vd25faG9zdHMgZmlsZS5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAtaCAgICAgICAgICBHZW5lcmF0ZSBob3N0IGNlcnRpZmljYXRlIGluc3RlYWQgb2YgYSB1c2VyIGNlcnRpZmljYXRlLlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC1JIGtleV9pZCAgIEtleSBpZGVudGlmaWVyIHRvIGluY2x1ZGUgaW4gY2VydGlmaWNhdGUuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgLWkgICAgICAgICAgSW1wb3J0IGZvcmVpZ24gZm9ybWF0IHRvIE9wZW5TU0gga2V5IGZpbGUuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgLUsgY2hlY2twdCAgV3JpdGUgY2hlY2twb2ludHMgdG8gdGhpcyBmaWxlLlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC1MICAgICAgICAgIFByaW50IHRoZSBjb250ZW50cyBvZiBhIGNlcnRpZmljYXRlLlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC1sICAgICAgICAgIFNob3cgZmluZ2VycHJpbnQgb2Yga2V5IGZpbGUuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgLU0gbWVtb3J5ICAgQW1vdW50IG9mIG1lbW9yeSAoTUIpIHRvIHVzZSBmb3IgZ2VuZXJhdGluZyBESC1HRVggbW9kdWxpLlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC1tIGtleV9mbXQgIENvbnZlcnNpb24gZm9ybWF0IGZvciAtZS8taSAoUEVNfFBLQ1M4fFJGQzQ3MTYpLlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC1OIHBocmFzZSAgIFByb3ZpZGUgbmV3IHBhc3NwaHJhc2UuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgLW4gbmFtZSwuLi4gVXNlci9ob3N0IHByaW5jaXBhbCBuYW1lcyB0byBpbmNsdWRlIGluIGNlcnRpZmljYXRlXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgLU8gb3B0aW9uICAgU3BlY2lmeSBhIGNlcnRpZmljYXRlIG9wdGlvbi5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAtUCBwaHJhc2UgICBQcm92aWRlIG9sZCBwYXNzcGhyYXNlLlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC1wICAgICAgICAgIENoYW5nZSBwYXNzcGhyYXNlIG9mIHByaXZhdGUga2V5IGZpbGUuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgLXEgICAgICAgICAgUXVpZXQuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgLVIgaG9zdG5hbWUgUmVtb3ZlIGhvc3QgZnJvbSBrbm93bl9ob3N0cyBmaWxlLlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC1yIGhvc3RuYW1lIFByaW50IEROUyByZXNvdXJjZSByZWNvcmQuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgLVMgc3RhcnQgICAgU3RhcnQgcG9pbnQgKGhleCkgZm9yIGdlbmVyYXRpbmcgREgtR0VYIG1vZHVsaS5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAtcyBjYV9rZXkgICBDZXJ0aWZ5IGtleXMgd2l0aCBDQSBrZXkuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgLVQgZmlsZSAgICAgU2NyZWVuIGNhbmRpZGF0ZXMgZm9yIERILUdFWCBtb2R1bGkuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgLXQgdHlwZSAgICAgU3BlY2lmeSB0eXBlIG9mIGtleSB0byBjcmVhdGUuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgLVYgZnJvbTp0byAgU3BlY2lmeSBjZXJ0aWZpY2F0ZSB2YWxpZGl0eSBpbnRlcnZhbC5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAtdiAgICAgICAgICBWZXJib3NlLlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC1XIGdlbiAgICAgIEdlbmVyYXRvciB0byB1c2UgZm9yIGdlbmVyYXRpbmcgREgtR0VYIG1vZHVsaS5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAteSAgICAgICAgICBSZWFkIHByaXZhdGUga2V5IGZpbGUgYW5kIHByaW50IHB1YmxpYyBrZXkuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgLXogc2VyaWFsICAgU3BlY2lmeSBhIHNlcmlhbCBudW1iZXIuXG4iKTsKKworCWV4aXQoMSk7Cit9CisKKy8qCisgKiBNYWluIHByb2dyYW0gZm9yIGtleSBtYW5hZ2VtZW50LgorICovCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgZG90c3NoZGlyW01BWFBBVEhMRU5dLCBjb21tZW50WzEwMjRdLCAqcGFzc3BocmFzZTEsICpwYXNzcGhyYXNlMjsKKwljaGFyICpjaGVja3BvaW50ID0gTlVMTDsKKwljaGFyIG91dF9maWxlW01BWFBBVEhMRU5dLCAqcnJfaG9zdG5hbWUgPSBOVUxMOworCUtleSAqcHJpdmF0ZSwgKnB1YmxpYzsKKwlzdHJ1Y3QgcGFzc3dkICpwdzsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlpbnQgb3B0LCB0eXBlLCBmZDsKKwl1X2ludDMyX3QgbWVtb3J5ID0gMCwgZ2VuZXJhdG9yX3dhbnRlZCA9IDAsIHRyaWFscyA9IDEwMDsKKwlpbnQgZG9fZ2VuX2NhbmRpZGF0ZXMgPSAwLCBkb19zY3JlZW5fY2FuZGlkYXRlcyA9IDA7CisJaW50IGdlbl9hbGxfaG9zdGtleXMgPSAwOworCUJJR05VTSAqc3RhcnQgPSBOVUxMOworCUZJTEUgKmY7CisJY29uc3QgY2hhciAqZXJyc3RyOworCisJZXh0ZXJuIGludCBvcHRpbmQ7CisJZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKworCS8qIEVuc3VyZSB0aGF0IGZkcyAwLCAxIGFuZCAyIGFyZSBvcGVuIG9yIGRpcmVjdGVkIHRvIC9kZXYvbnVsbCAqLworCXNhbml0aXNlX3N0ZGZkKCk7CisKKwlfX3Byb2duYW1lID0gc3NoX2dldF9wcm9nbmFtZShhcmd2WzBdKTsKKworCU9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCk7CisJbG9nX2luaXQoYXJndlswXSwgU1lTTE9HX0xFVkVMX0lORk8sIFNZU0xPR19GQUNJTElUWV9VU0VSLCAxKTsKKworCXNlZWRfcm5nKCk7CisKKwkvKiB3ZSBuZWVkIHRoaXMgZm9yIHRoZSBob21lICogZGlyZWN0b3J5LiAgKi8KKwlwdyA9IGdldHB3dWlkKGdldHVpZCgpKTsKKwlpZiAoIXB3KSB7CisJCXByaW50ZigiWW91IGRvbid0IGV4aXN0LCBnbyBhd2F5IVxuIik7CisJCWV4aXQoMSk7CisJfQorCWlmIChnZXRob3N0bmFtZShob3N0bmFtZSwgc2l6ZW9mKGhvc3RuYW1lKSkgPCAwKSB7CisJCXBlcnJvcigiZ2V0aG9zdG5hbWUiKTsKKwkJZXhpdCgxKTsKKwl9CisKKwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiQWVnaXFwY2xCSExodnhYeUY6YjpmOnQ6RDpJOks6UDptOk46bjoiCisJICAgICJPOkM6cjpnOlI6VDpHOk06UzpzOmE6VjpXOno6IikpICE9IC0xKSB7CisJCXN3aXRjaCAob3B0KSB7CisJCWNhc2UgJ0EnOgorCQkJZ2VuX2FsbF9ob3N0a2V5cyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnYic6CisJCQliaXRzID0gKHVfaW50MzJfdClzdHJ0b251bShvcHRhcmcsIDI1NiwgMzI3NjgsICZlcnJzdHIpOworCQkJaWYgKGVycnN0cikKKwkJCQlmYXRhbCgiQml0cyBoYXMgYmFkIHZhbHVlICVzICglcykiLAorCQkJCQlvcHRhcmcsIGVycnN0cik7CisJCQlicmVhazsKKwkJY2FzZSAnRic6CisJCQlmaW5kX2hvc3QgPSAxOworCQkJcnJfaG9zdG5hbWUgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnSCc6CisJCQloYXNoX2hvc3RzID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdJJzoKKwkJCWNlcnRfa2V5X2lkID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ1InOgorCQkJZGVsZXRlX2hvc3QgPSAxOworCQkJcnJfaG9zdG5hbWUgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnTCc6CisJCQlzaG93X2NlcnQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2wnOgorCQkJcHJpbnRfZmluZ2VycHJpbnQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ0InOgorCQkJcHJpbnRfYnViYmxlYmFiYmxlID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJCWlmIChzdHJjYXNlY21wKG9wdGFyZywgIlJGQzQ3MTYiKSA9PSAwIHx8CisJCQkgICAgc3RyY2FzZWNtcChvcHRhcmcsICJzc2gyIikgPT0gMCkgeworCQkJCWNvbnZlcnRfZm9ybWF0ID0gRk1UX1JGQzQ3MTY7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc3RyY2FzZWNtcChvcHRhcmcsICJQS0NTOCIpID09IDApIHsKKwkJCQljb252ZXJ0X2Zvcm1hdCA9IEZNVF9QS0NTODsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzdHJjYXNlY21wKG9wdGFyZywgIlBFTSIpID09IDApIHsKKwkJCQljb252ZXJ0X2Zvcm1hdCA9IEZNVF9QRU07CisJCQkJYnJlYWs7CisJCQl9CisJCQlmYXRhbCgiVW5zdXBwb3J0ZWQgY29udmVyc2lvbiBmb3JtYXQgXCIlc1wiIiwgb3B0YXJnKTsKKwkJY2FzZSAnbic6CisJCQljZXJ0X3ByaW5jaXBhbHMgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQljaGFuZ2VfcGFzc3BocmFzZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQljaGFuZ2VfY29tbWVudCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnZic6CisJCQlpZiAoc3RybGNweShpZGVudGl0eV9maWxlLCBvcHRhcmcsIHNpemVvZihpZGVudGl0eV9maWxlKSkgPj0KKwkJCSAgICBzaXplb2YoaWRlbnRpdHlfZmlsZSkpCisJCQkJZmF0YWwoIklkZW50aXR5IGZpbGVuYW1lIHRvbyBsb25nIik7CisJCQloYXZlX2lkZW50aXR5ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdnJzoKKwkJCXByaW50X2dlbmVyaWMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ1AnOgorCQkJaWRlbnRpdHlfcGFzc3BocmFzZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdOJzoKKwkJCWlkZW50aXR5X25ld19wYXNzcGhyYXNlID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ08nOgorCQkJYWRkX2NlcnRfb3B0aW9uKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnQyc6CisJCQlpZGVudGl0eV9jb21tZW50ID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ3EnOgorCQkJcXVpZXQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2UnOgorCQljYXNlICd4JzoKKwkJCS8qIGV4cG9ydCBrZXkgKi8KKwkJCWNvbnZlcnRfdG8gPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2gnOgorCQkJY2VydF9rZXlfdHlwZSA9IFNTSDJfQ0VSVF9UWVBFX0hPU1Q7CisJCQljZXJ0ZmxhZ3NfZmxhZ3MgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ2knOgorCQljYXNlICdYJzoKKwkJCS8qIGltcG9ydCBrZXkgKi8KKwkJCWNvbnZlcnRfZnJvbSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAneSc6CisJCQlwcmludF9wdWJsaWMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJY2Ffa2V5X3BhdGggPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQlrZXlfdHlwZV9uYW1lID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ0QnOgorCQkJcGtjczExcHJvdmlkZXIgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQlpZiAobG9nX2xldmVsID09IFNZU0xPR19MRVZFTF9JTkZPKQorCQkJCWxvZ19sZXZlbCA9IFNZU0xPR19MRVZFTF9ERUJVRzE7CisJCQllbHNlIHsKKwkJCQlpZiAobG9nX2xldmVsID49IFNZU0xPR19MRVZFTF9ERUJVRzEgJiYKKwkJCQkgICAgbG9nX2xldmVsIDwgU1lTTE9HX0xFVkVMX0RFQlVHMykKKwkJCQkJbG9nX2xldmVsKys7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlycl9ob3N0bmFtZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdXJzoKKwkJCWdlbmVyYXRvcl93YW50ZWQgPSAodV9pbnQzMl90KXN0cnRvbnVtKG9wdGFyZywgMSwKKwkJCSAgICBVSU5UX01BWCwgJmVycnN0cik7CisJCQlpZiAoZXJyc3RyKQorCQkJCWZhdGFsKCJEZXNpcmVkIGdlbmVyYXRvciBoYXMgYmFkIHZhbHVlOiAlcyAoJXMpIiwKKwkJCQkJb3B0YXJnLCBlcnJzdHIpOworCQkJYnJlYWs7CisJCWNhc2UgJ2EnOgorCQkJdHJpYWxzID0gKHVfaW50MzJfdClzdHJ0b251bShvcHRhcmcsIDEsIFVJTlRfTUFYLCAmZXJyc3RyKTsKKwkJCWlmIChlcnJzdHIpCisJCQkJZmF0YWwoIkludmFsaWQgbnVtYmVyIG9mIHRyaWFsczogJXMgKCVzKSIsCisJCQkJCW9wdGFyZywgZXJyc3RyKTsKKwkJCWJyZWFrOworCQljYXNlICdNJzoKKwkJCW1lbW9yeSA9ICh1X2ludDMyX3Qpc3RydG9udW0ob3B0YXJnLCAxLCBVSU5UX01BWCwgJmVycnN0cik7CisJCQlpZiAoZXJyc3RyKQorCQkJCWZhdGFsKCJNZW1vcnkgbGltaXQgaXMgJXM6ICVzIiwgZXJyc3RyLCBvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ0cnOgorCQkJZG9fZ2VuX2NhbmRpZGF0ZXMgPSAxOworCQkJaWYgKHN0cmxjcHkob3V0X2ZpbGUsIG9wdGFyZywgc2l6ZW9mKG91dF9maWxlKSkgPj0KKwkJCSAgICBzaXplb2Yob3V0X2ZpbGUpKQorCQkJCWZhdGFsKCJPdXRwdXQgZmlsZW5hbWUgdG9vIGxvbmciKTsKKwkJCWJyZWFrOworCQljYXNlICdUJzoKKwkJCWRvX3NjcmVlbl9jYW5kaWRhdGVzID0gMTsKKwkJCWlmIChzdHJsY3B5KG91dF9maWxlLCBvcHRhcmcsIHNpemVvZihvdXRfZmlsZSkpID49CisJCQkgICAgc2l6ZW9mKG91dF9maWxlKSkKKwkJCQlmYXRhbCgiT3V0cHV0IGZpbGVuYW1lIHRvbyBsb25nIik7CisJCQlicmVhazsKKwkJY2FzZSAnSyc6CisJCQlpZiAoc3RybGVuKG9wdGFyZykgPj0gTUFYUEFUSExFTikKKwkJCQlmYXRhbCgiQ2hlY2twb2ludCBmaWxlbmFtZSB0b28gbG9uZyIpOworCQkJY2hlY2twb2ludCA9IHhzdHJkdXAob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdTJzoKKwkJCS8qIFhYWCAtIGFsc28gY29tcGFyZSBsZW5ndGggYWdhaW5zdCBiaXRzICovCisJCQlpZiAoQk5faGV4MmJuKCZzdGFydCwgb3B0YXJnKSA9PSAwKQorCQkJCWZhdGFsKCJJbnZhbGlkIHN0YXJ0IHBvaW50LiIpOworCQkJYnJlYWs7CisJCWNhc2UgJ1YnOgorCQkJcGFyc2VfY2VydF90aW1lcyhvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ3onOgorCQkJY2VydF9zZXJpYWwgPSBzdHJ0b251bShvcHRhcmcsIDAsIExMT05HX01BWCwgJmVycnN0cik7CisJCQlpZiAoZXJyc3RyKQorCQkJCWZhdGFsKCJJbnZhbGlkIHNlcmlhbCBudW1iZXI6ICVzIiwgZXJyc3RyKTsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKCk7CisJCX0KKwl9CisKKwkvKiByZWluaXQgKi8KKwlsb2dfaW5pdChhcmd2WzBdLCBsb2dfbGV2ZWwsIFNZU0xPR19GQUNJTElUWV9VU0VSLCAxKTsKKworCWFyZ3YgKz0gb3B0aW5kOworCWFyZ2MgLT0gb3B0aW5kOworCisJaWYgKGNhX2tleV9wYXRoICE9IE5VTEwpIHsKKwkJaWYgKGFyZ2MgPCAxKSB7CisJCQlwcmludGYoIlRvbyBmZXcgYXJndW1lbnRzLlxuIik7CisJCQl1c2FnZSgpOworCQl9CisJfSBlbHNlIGlmIChhcmdjID4gMCkgeworCQlwcmludGYoIlRvbyBtYW55IGFyZ3VtZW50cy5cbiIpOworCQl1c2FnZSgpOworCX0KKwlpZiAoY2hhbmdlX3Bhc3NwaHJhc2UgJiYgY2hhbmdlX2NvbW1lbnQpIHsKKwkJcHJpbnRmKCJDYW4gb25seSBoYXZlIG9uZSBvZiAtcCBhbmQgLWMuXG4iKTsKKwkJdXNhZ2UoKTsKKwl9CisJaWYgKHByaW50X2ZpbmdlcnByaW50ICYmIChkZWxldGVfaG9zdCB8fCBoYXNoX2hvc3RzKSkgeworCQlwcmludGYoIkNhbm5vdCB1c2UgLWwgd2l0aCAtRCBvciAtUi5cbiIpOworCQl1c2FnZSgpOworCX0KKwlpZiAoY2Ffa2V5X3BhdGggIT0gTlVMTCkgeworCQlpZiAoY2VydF9rZXlfaWQgPT0gTlVMTCkKKwkJCWZhdGFsKCJNdXN0IHNwZWNpZnkga2V5IGlkICgtSSkgd2hlbiBjZXJ0aWZ5aW5nIik7CisJCWRvX2NhX3NpZ24ocHcsIGFyZ2MsIGFyZ3YpOworCX0KKwlpZiAoc2hvd19jZXJ0KQorCQlkb19zaG93X2NlcnQocHcpOworCWlmIChkZWxldGVfaG9zdCB8fCBoYXNoX2hvc3RzIHx8IGZpbmRfaG9zdCkKKwkJZG9fa25vd25faG9zdHMocHcsIHJyX2hvc3RuYW1lKTsKKwlpZiAocHJpbnRfZmluZ2VycHJpbnQgfHwgcHJpbnRfYnViYmxlYmFiYmxlKQorCQlkb19maW5nZXJwcmludChwdyk7CisJaWYgKGNoYW5nZV9wYXNzcGhyYXNlKQorCQlkb19jaGFuZ2VfcGFzc3BocmFzZShwdyk7CisJaWYgKGNoYW5nZV9jb21tZW50KQorCQlkb19jaGFuZ2VfY29tbWVudChwdyk7CisJaWYgKGNvbnZlcnRfdG8pCisJCWRvX2NvbnZlcnRfdG8ocHcpOworCWlmIChjb252ZXJ0X2Zyb20pCisJCWRvX2NvbnZlcnRfZnJvbShwdyk7CisJaWYgKHByaW50X3B1YmxpYykKKwkJZG9fcHJpbnRfcHVibGljKHB3KTsKKwlpZiAocnJfaG9zdG5hbWUgIT0gTlVMTCkgeworCQl1bnNpZ25lZCBpbnQgbiA9IDA7CisKKwkJaWYgKGhhdmVfaWRlbnRpdHkpIHsKKwkJCW4gPSBkb19wcmludF9yZXNvdXJjZV9yZWNvcmQocHcsCisJCQkgICAgaWRlbnRpdHlfZmlsZSwgcnJfaG9zdG5hbWUpOworCQkJaWYgKG4gPT0gMCkgeworCQkJCXBlcnJvcihpZGVudGl0eV9maWxlKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJZXhpdCgwKTsKKwkJfSBlbHNlIHsKKworCQkJbiArPSBkb19wcmludF9yZXNvdXJjZV9yZWNvcmQocHcsCisJCQkgICAgX1BBVEhfSE9TVF9SU0FfS0VZX0ZJTEUsIHJyX2hvc3RuYW1lKTsKKwkJCW4gKz0gZG9fcHJpbnRfcmVzb3VyY2VfcmVjb3JkKHB3LAorCQkJICAgIF9QQVRIX0hPU1RfRFNBX0tFWV9GSUxFLCBycl9ob3N0bmFtZSk7CisKKwkJCWlmIChuID09IDApCisJCQkJZmF0YWwoIm5vIGtleXMgZm91bmQuIik7CisJCQlleGl0KDApOworCQl9CisJfQorCWlmIChwa2NzMTFwcm92aWRlciAhPSBOVUxMKQorCQlkb19kb3dubG9hZChwdyk7CisKKwlpZiAoZG9fZ2VuX2NhbmRpZGF0ZXMpIHsKKwkJRklMRSAqb3V0ID0gZm9wZW4ob3V0X2ZpbGUsICJ3Iik7CisKKwkJaWYgKG91dCA9PSBOVUxMKSB7CisJCQllcnJvcigiQ291bGRuJ3Qgb3BlbiBtb2R1bHVzIGNhbmRpZGF0ZSBmaWxlIFwiJXNcIjogJXMiLAorCQkJICAgIG91dF9maWxlLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuICgxKTsKKwkJfQorCQlpZiAoYml0cyA9PSAwKQorCQkJYml0cyA9IERFRkFVTFRfQklUUzsKKwkJaWYgKGdlbl9jYW5kaWRhdGVzKG91dCwgbWVtb3J5LCBiaXRzLCBzdGFydCkgIT0gMCkKKwkJCWZhdGFsKCJtb2R1bHVzIGNhbmRpZGF0ZSBnZW5lcmF0aW9uIGZhaWxlZCIpOworCisJCXJldHVybiAoMCk7CisJfQorCisJaWYgKGRvX3NjcmVlbl9jYW5kaWRhdGVzKSB7CisJCUZJTEUgKmluOworCQlGSUxFICpvdXQgPSBmb3BlbihvdXRfZmlsZSwgInciKTsKKworCQlpZiAoaGF2ZV9pZGVudGl0eSAmJiBzdHJjbXAoaWRlbnRpdHlfZmlsZSwgIi0iKSAhPSAwKSB7CisJCQlpZiAoKGluID0gZm9wZW4oaWRlbnRpdHlfZmlsZSwgInIiKSkgPT0gTlVMTCkgeworCQkJCWZhdGFsKCJDb3VsZG4ndCBvcGVuIG1vZHVsdXMgY2FuZGlkYXRlICIKKwkJCQkgICAgImZpbGUgXCIlc1wiOiAlcyIsIGlkZW50aXR5X2ZpbGUsCisJCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCQl9CisJCX0gZWxzZQorCQkJaW4gPSBzdGRpbjsKKworCQlpZiAob3V0ID09IE5VTEwpIHsKKwkJCWZhdGFsKCJDb3VsZG4ndCBvcGVuIG1vZHVsaSBmaWxlIFwiJXNcIjogJXMiLAorCQkJICAgIG91dF9maWxlLCBzdHJlcnJvcihlcnJubykpOworCQl9CisJCWlmIChwcmltZV90ZXN0KGluLCBvdXQsIHRyaWFscywgZ2VuZXJhdG9yX3dhbnRlZCwgY2hlY2twb2ludCkKKwkJICAgICE9IDApCisJCQlmYXRhbCgibW9kdWx1cyBzY3JlZW5pbmcgZmFpbGVkIik7CisJCXJldHVybiAoMCk7CisJfQorCisJaWYgKGdlbl9hbGxfaG9zdGtleXMpIHsKKwkJZG9fZ2VuX2FsbF9ob3N0a2V5cyhwdyk7CisJCXJldHVybiAoMCk7CisJfQorCisJYXJjNHJhbmRvbV9zdGlyKCk7CisKKwlpZiAoa2V5X3R5cGVfbmFtZSA9PSBOVUxMKQorCQlrZXlfdHlwZV9uYW1lID0gInJzYSI7CisKKwl0eXBlID0ga2V5X3R5cGVfZnJvbV9uYW1lKGtleV90eXBlX25hbWUpOworCXR5cGVfYml0c192YWxpZCh0eXBlLCAmYml0cyk7CisKKwlpZiAoIXF1aWV0KQorCQlwcmludGYoIkdlbmVyYXRpbmcgcHVibGljL3ByaXZhdGUgJXMga2V5IHBhaXIuXG4iLCBrZXlfdHlwZV9uYW1lKTsKKwlwcml2YXRlID0ga2V5X2dlbmVyYXRlKHR5cGUsIGJpdHMpOworCWlmIChwcml2YXRlID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJrZXlfZ2VuZXJhdGUgZmFpbGVkXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisJcHVibGljICA9IGtleV9mcm9tX3ByaXZhdGUocHJpdmF0ZSk7CisKKwlpZiAoIWhhdmVfaWRlbnRpdHkpCisJCWFza19maWxlbmFtZShwdywgIkVudGVyIGZpbGUgaW4gd2hpY2ggdG8gc2F2ZSB0aGUga2V5Iik7CisKKwkvKiBDcmVhdGUgfi8uc3NoIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuICovCisJc25wcmludGYoZG90c3NoZGlyLCBzaXplb2YgZG90c3NoZGlyLCAiJXMvJXMiLAorCSAgICBwdy0+cHdfZGlyLCBfUEFUSF9TU0hfVVNFUl9ESVIpOworCWlmIChzdHJzdHIoaWRlbnRpdHlfZmlsZSwgZG90c3NoZGlyKSAhPSBOVUxMKSB7CisJCWlmIChzdGF0KGRvdHNzaGRpciwgJnN0KSA8IDApIHsKKwkJCWlmIChlcnJubyAhPSBFTk9FTlQpIHsKKwkJCQllcnJvcigiQ291bGQgbm90IHN0YXQgJXM6ICVzIiwgZG90c3NoZGlyLAorCQkJCSAgICBzdHJlcnJvcihlcnJubykpOworCQkJfSBlbHNlIGlmIChta2Rpcihkb3Rzc2hkaXIsIDA3MDApIDwgMCkgeworCQkJCWVycm9yKCJDb3VsZCBub3QgY3JlYXRlIGRpcmVjdG9yeSAnJXMnOiAlcyIsCisJCQkJICAgIGRvdHNzaGRpciwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0gZWxzZSBpZiAoIXF1aWV0KQorCQkJCXByaW50ZigiQ3JlYXRlZCBkaXJlY3RvcnkgJyVzJy5cbiIsIGRvdHNzaGRpcik7CisJCX0KKwl9CisJLyogSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMsIGFzayB0aGUgdXNlciB0byBjb25maXJtLiAqLworCWlmIChzdGF0KGlkZW50aXR5X2ZpbGUsICZzdCkgPj0gMCkgeworCQljaGFyIHllc25vWzNdOworCQlwcmludGYoIiVzIGFscmVhZHkgZXhpc3RzLlxuIiwgaWRlbnRpdHlfZmlsZSk7CisJCXByaW50ZigiT3ZlcndyaXRlICh5L24pPyAiKTsKKwkJZmZsdXNoKHN0ZG91dCk7CisJCWlmIChmZ2V0cyh5ZXNubywgc2l6ZW9mKHllc25vKSwgc3RkaW4pID09IE5VTEwpCisJCQlleGl0KDEpOworCQlpZiAoeWVzbm9bMF0gIT0gJ3knICYmIHllc25vWzBdICE9ICdZJykKKwkJCWV4aXQoMSk7CisJfQorCS8qIEFzayBmb3IgYSBwYXNzcGhyYXNlICh0d2ljZSkuICovCisJaWYgKGlkZW50aXR5X3Bhc3NwaHJhc2UpCisJCXBhc3NwaHJhc2UxID0geHN0cmR1cChpZGVudGl0eV9wYXNzcGhyYXNlKTsKKwllbHNlIGlmIChpZGVudGl0eV9uZXdfcGFzc3BocmFzZSkKKwkJcGFzc3BocmFzZTEgPSB4c3RyZHVwKGlkZW50aXR5X25ld19wYXNzcGhyYXNlKTsKKwllbHNlIHsKK3Bhc3NwaHJhc2VfYWdhaW46CisJCXBhc3NwaHJhc2UxID0KKwkJCXJlYWRfcGFzc3BocmFzZSgiRW50ZXIgcGFzc3BocmFzZSAoZW1wdHkgZm9yIG5vICIKKwkJCSAgICAicGFzc3BocmFzZSk6ICIsIFJQX0FMTE9XX1NURElOKTsKKwkJcGFzc3BocmFzZTIgPSByZWFkX3Bhc3NwaHJhc2UoIkVudGVyIHNhbWUgcGFzc3BocmFzZSBhZ2FpbjogIiwKKwkJICAgIFJQX0FMTE9XX1NURElOKTsKKwkJaWYgKHN0cmNtcChwYXNzcGhyYXNlMSwgcGFzc3BocmFzZTIpICE9IDApIHsKKwkJCS8qCisJCQkgKiBUaGUgcGFzc3BocmFzZXMgZG8gbm90IG1hdGNoLiAgQ2xlYXIgdGhlbSBhbmQKKwkJCSAqIHJldHJ5LgorCQkJICovCisJCQltZW1zZXQocGFzc3BocmFzZTEsIDAsIHN0cmxlbihwYXNzcGhyYXNlMSkpOworCQkJbWVtc2V0KHBhc3NwaHJhc2UyLCAwLCBzdHJsZW4ocGFzc3BocmFzZTIpKTsKKwkJCXhmcmVlKHBhc3NwaHJhc2UxKTsKKwkJCXhmcmVlKHBhc3NwaHJhc2UyKTsKKwkJCXByaW50ZigiUGFzc3BocmFzZXMgZG8gbm90IG1hdGNoLiAgVHJ5IGFnYWluLlxuIik7CisJCQlnb3RvIHBhc3NwaHJhc2VfYWdhaW47CisJCX0KKwkJLyogQ2xlYXIgdGhlIG90aGVyIGNvcHkgb2YgdGhlIHBhc3NwaHJhc2UuICovCisJCW1lbXNldChwYXNzcGhyYXNlMiwgMCwgc3RybGVuKHBhc3NwaHJhc2UyKSk7CisJCXhmcmVlKHBhc3NwaHJhc2UyKTsKKwl9CisKKwlpZiAoaWRlbnRpdHlfY29tbWVudCkgeworCQlzdHJsY3B5KGNvbW1lbnQsIGlkZW50aXR5X2NvbW1lbnQsIHNpemVvZihjb21tZW50KSk7CisJfSBlbHNlIHsKKwkJLyogQ3JlYXRlIGRlZmF1bHQgY29tbWVudCBmaWVsZCBmb3IgdGhlIHBhc3NwaHJhc2UuICovCisJCXNucHJpbnRmKGNvbW1lbnQsIHNpemVvZiBjb21tZW50LCAiJXNAJXMiLCBwdy0+cHdfbmFtZSwgaG9zdG5hbWUpOworCX0KKworCS8qIFNhdmUgdGhlIGtleSB3aXRoIHRoZSBnaXZlbiBwYXNzcGhyYXNlIGFuZCBjb21tZW50LiAqLworCWlmICgha2V5X3NhdmVfcHJpdmF0ZShwcml2YXRlLCBpZGVudGl0eV9maWxlLCBwYXNzcGhyYXNlMSwgY29tbWVudCkpIHsKKwkJcHJpbnRmKCJTYXZpbmcgdGhlIGtleSBmYWlsZWQ6ICVzLlxuIiwgaWRlbnRpdHlfZmlsZSk7CisJCW1lbXNldChwYXNzcGhyYXNlMSwgMCwgc3RybGVuKHBhc3NwaHJhc2UxKSk7CisJCXhmcmVlKHBhc3NwaHJhc2UxKTsKKwkJZXhpdCgxKTsKKwl9CisJLyogQ2xlYXIgdGhlIHBhc3NwaHJhc2UuICovCisJbWVtc2V0KHBhc3NwaHJhc2UxLCAwLCBzdHJsZW4ocGFzc3BocmFzZTEpKTsKKwl4ZnJlZShwYXNzcGhyYXNlMSk7CisKKwkvKiBDbGVhciB0aGUgcHJpdmF0ZSBrZXkgYW5kIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4gKi8KKwlrZXlfZnJlZShwcml2YXRlKTsKKwlhcmM0cmFuZG9tX3N0aXIoKTsKKworCWlmICghcXVpZXQpCisJCXByaW50ZigiWW91ciBpZGVudGlmaWNhdGlvbiBoYXMgYmVlbiBzYXZlZCBpbiAlcy5cbiIsIGlkZW50aXR5X2ZpbGUpOworCisJc3RybGNhdChpZGVudGl0eV9maWxlLCAiLnB1YiIsIHNpemVvZihpZGVudGl0eV9maWxlKSk7CisJZmQgPSBvcGVuKGlkZW50aXR5X2ZpbGUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA2NDQpOworCWlmIChmZCA9PSAtMSkgeworCQlwcmludGYoIkNvdWxkIG5vdCBzYXZlIHlvdXIgcHVibGljIGtleSBpbiAlc1xuIiwgaWRlbnRpdHlfZmlsZSk7CisJCWV4aXQoMSk7CisJfQorCWYgPSBmZG9wZW4oZmQsICJ3Iik7CisJaWYgKGYgPT0gTlVMTCkgeworCQlwcmludGYoImZkb3BlbiAlcyBmYWlsZWRcbiIsIGlkZW50aXR5X2ZpbGUpOworCQlleGl0KDEpOworCX0KKwlpZiAoIWtleV93cml0ZShwdWJsaWMsIGYpKQorCQlmcHJpbnRmKHN0ZGVyciwgIndyaXRlIGtleSBmYWlsZWRcbiIpOworCWZwcmludGYoZiwgIiAlc1xuIiwgY29tbWVudCk7CisJZmNsb3NlKGYpOworCisJaWYgKCFxdWlldCkgeworCQljaGFyICpmcCA9IGtleV9maW5nZXJwcmludChwdWJsaWMsIFNTSF9GUF9NRDUsIFNTSF9GUF9IRVgpOworCQljaGFyICpyYSA9IGtleV9maW5nZXJwcmludChwdWJsaWMsIFNTSF9GUF9NRDUsCisJCSAgICBTU0hfRlBfUkFORE9NQVJUKTsKKwkJcHJpbnRmKCJZb3VyIHB1YmxpYyBrZXkgaGFzIGJlZW4gc2F2ZWQgaW4gJXMuXG4iLAorCQkgICAgaWRlbnRpdHlfZmlsZSk7CisJCXByaW50ZigiVGhlIGtleSBmaW5nZXJwcmludCBpczpcbiIpOworCQlwcmludGYoIiVzICVzXG4iLCBmcCwgY29tbWVudCk7CisJCXByaW50ZigiVGhlIGtleSdzIHJhbmRvbWFydCBpbWFnZSBpczpcbiIpOworCQlwcmludGYoIiVzXG4iLCByYSk7CisJCXhmcmVlKHJhKTsKKwkJeGZyZWUoZnApOworCX0KKworCWtleV9mcmVlKHB1YmxpYyk7CisJZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc3NoLWtleXNjYW4uMCBiL29wZW5zc2gtNi4wcDEvc3NoLWtleXNjYW4uMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWRiMGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zc2gta2V5c2Nhbi4wCkBAIC0wLDAgKzEsMTA5IEBACitTU0gtS0VZU0NBTigxKSAgICAgICAgICAgICBPcGVuQlNEIFJlZmVyZW5jZSBNYW51YWwgICAgICAgICAgICAgU1NILUtFWVNDQU4oMSkKKworTkFNRQorICAgICBzc2gta2V5c2NhbiAtIGdhdGhlciBzc2ggcHVibGljIGtleXMKKworU1lOT1BTSVMKKyAgICAgc3NoLWtleXNjYW4gWy00Nkh2XSBbLWYgZmlsZV0gWy1wIHBvcnRdIFstVCB0aW1lb3V0XSBbLXQgdHlwZV0KKyAgICAgICAgICAgICAgICAgW2hvc3QgfCBhZGRybGlzdCBuYW1lbGlzdF0gLi4uCisKK0RFU0NSSVBUSU9OCisgICAgIHNzaC1rZXlzY2FuIGlzIGEgdXRpbGl0eSBmb3IgZ2F0aGVyaW5nIHRoZSBwdWJsaWMgc3NoIGhvc3Qga2V5cyBvZiBhCisgICAgIG51bWJlciBvZiBob3N0cy4gIEl0IHdhcyBkZXNpZ25lZCB0byBhaWQgaW4gYnVpbGRpbmcgYW5kIHZlcmlmeWluZworICAgICBzc2hfa25vd25faG9zdHMgZmlsZXMuICBzc2gta2V5c2NhbiBwcm92aWRlcyBhIG1pbmltYWwgaW50ZXJmYWNlIHN1aXRhYmxlCisgICAgIGZvciB1c2UgYnkgc2hlbGwgYW5kIHBlcmwgc2NyaXB0cy4KKworICAgICBzc2gta2V5c2NhbiB1c2VzIG5vbi1ibG9ja2luZyBzb2NrZXQgSS9PIHRvIGNvbnRhY3QgYXMgbWFueSBob3N0cyBhcworICAgICBwb3NzaWJsZSBpbiBwYXJhbGxlbCwgc28gaXQgaXMgdmVyeSBlZmZpY2llbnQuICBUaGUga2V5cyBmcm9tIGEgZG9tYWluIG9mCisgICAgIDEsMDAwIGhvc3RzIGNhbiBiZSBjb2xsZWN0ZWQgaW4gdGVucyBvZiBzZWNvbmRzLCBldmVuIHdoZW4gc29tZSBvZiB0aG9zZQorICAgICBob3N0cyBhcmUgZG93biBvciBkbyBub3QgcnVuIHNzaC4gIEZvciBzY2FubmluZywgb25lIGRvZXMgbm90IG5lZWQgbG9naW4KKyAgICAgYWNjZXNzIHRvIHRoZSBtYWNoaW5lcyB0aGF0IGFyZSBiZWluZyBzY2FubmVkLCBub3IgZG9lcyB0aGUgc2Nhbm5pbmcKKyAgICAgcHJvY2VzcyBpbnZvbHZlIGFueSBlbmNyeXB0aW9uLgorCisgICAgIFRoZSBvcHRpb25zIGFyZSBhcyBmb2xsb3dzOgorCisgICAgIC00ICAgICAgRm9yY2VzIHNzaC1rZXlzY2FuIHRvIHVzZSBJUHY0IGFkZHJlc3NlcyBvbmx5LgorCisgICAgIC02ICAgICAgRm9yY2VzIHNzaC1rZXlzY2FuIHRvIHVzZSBJUHY2IGFkZHJlc3NlcyBvbmx5LgorCisgICAgIC1mIGZpbGUKKyAgICAgICAgICAgICBSZWFkIGhvc3RzIG9yIGFkZHJsaXN0IG5hbWVsaXN0IHBhaXJzIGZyb20gdGhpcyBmaWxlLCBvbmUgcGVyCisgICAgICAgICAgICAgbGluZS4gIElmIC0gaXMgc3VwcGxpZWQgaW5zdGVhZCBvZiBhIGZpbGVuYW1lLCBzc2gta2V5c2NhbiB3aWxsCisgICAgICAgICAgICAgcmVhZCBob3N0cyBvciBhZGRybGlzdCBuYW1lbGlzdCBwYWlycyBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dC4KKworICAgICAtSCAgICAgIEhhc2ggYWxsIGhvc3RuYW1lcyBhbmQgYWRkcmVzc2VzIGluIHRoZSBvdXRwdXQuICBIYXNoZWQgbmFtZXMgbWF5CisgICAgICAgICAgICAgYmUgdXNlZCBub3JtYWxseSBieSBzc2ggYW5kIHNzaGQsIGJ1dCB0aGV5IGRvIG5vdCByZXZlYWwKKyAgICAgICAgICAgICBpZGVudGlmeWluZyBpbmZvcm1hdGlvbiBzaG91bGQgdGhlIGZpbGUncyBjb250ZW50cyBiZSBkaXNjbG9zZWQuCisKKyAgICAgLXAgcG9ydAorICAgICAgICAgICAgIFBvcnQgdG8gY29ubmVjdCB0byBvbiB0aGUgcmVtb3RlIGhvc3QuCisKKyAgICAgLVQgdGltZW91dAorICAgICAgICAgICAgIFNldCB0aGUgdGltZW91dCBmb3IgY29ubmVjdGlvbiBhdHRlbXB0cy4gIElmIHRpbWVvdXQgc2Vjb25kcyBoYXZlCisgICAgICAgICAgICAgZWxhcHNlZCBzaW5jZSBhIGNvbm5lY3Rpb24gd2FzIGluaXRpYXRlZCB0byBhIGhvc3Qgb3Igc2luY2UgdGhlCisgICAgICAgICAgICAgbGFzdCB0aW1lIGFueXRoaW5nIHdhcyByZWFkIGZyb20gdGhhdCBob3N0LCB0aGVuIHRoZSBjb25uZWN0aW9uCisgICAgICAgICAgICAgaXMgY2xvc2VkIGFuZCB0aGUgaG9zdCBpbiBxdWVzdGlvbiBjb25zaWRlcmVkIHVuYXZhaWxhYmxlLgorICAgICAgICAgICAgIERlZmF1bHQgaXMgNSBzZWNvbmRzLgorCisgICAgIC10IHR5cGUKKyAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGtleSB0byBmZXRjaCBmcm9tIHRoZSBzY2FubmVkIGhvc3RzLgorICAgICAgICAgICAgIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBgcnNhMScnIGZvciBwcm90b2NvbCB2ZXJzaW9uIDEgYW5kCisgICAgICAgICAgICAgYGBkc2EnJywgYGBlY2RzYScnIG9yIGBgcnNhJycgZm9yIHByb3RvY29sIHZlcnNpb24gMi4gIE11bHRpcGxlCisgICAgICAgICAgICAgdmFsdWVzIG1heSBiZSBzcGVjaWZpZWQgYnkgc2VwYXJhdGluZyB0aGVtIHdpdGggY29tbWFzLiAgVGhlCisgICAgICAgICAgICAgZGVmYXVsdCBpcyBgYHJzYScnLgorCisgICAgIC12ICAgICAgVmVyYm9zZSBtb2RlLiAgQ2F1c2VzIHNzaC1rZXlzY2FuIHRvIHByaW50IGRlYnVnZ2luZyBtZXNzYWdlcworICAgICAgICAgICAgIGFib3V0IGl0cyBwcm9ncmVzcy4KKworU0VDVVJJVFkKKyAgICAgSWYgYW4gc3NoX2tub3duX2hvc3RzIGZpbGUgaXMgY29uc3RydWN0ZWQgdXNpbmcgc3NoLWtleXNjYW4gd2l0aG91dAorICAgICB2ZXJpZnlpbmcgdGhlIGtleXMsIHVzZXJzIHdpbGwgYmUgdnVsbmVyYWJsZSB0byBtYW4gaW4gdGhlIG1pZGRsZQorICAgICBhdHRhY2tzLiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZSBzZWN1cml0eSBtb2RlbCBhbGxvd3Mgc3VjaCBhIHJpc2ssCisgICAgIHNzaC1rZXlzY2FuIGNhbiBoZWxwIGluIHRoZSBkZXRlY3Rpb24gb2YgdGFtcGVyZWQga2V5ZmlsZXMgb3IgbWFuIGluIHRoZQorICAgICBtaWRkbGUgYXR0YWNrcyB3aGljaCBoYXZlIGJlZ3VuIGFmdGVyIHRoZSBzc2hfa25vd25faG9zdHMgZmlsZSB3YXMKKyAgICAgY3JlYXRlZC4KKworRklMRVMKKyAgICAgSW5wdXQgZm9ybWF0OgorCisgICAgIDEuMi4zLjQsMS4yLjQuNCBuYW1lLm15LmRvbWFpbixuYW1lLG4ubXkuZG9tYWluLG4sMS4yLjMuNCwxLjIuNC40CisKKyAgICAgT3V0cHV0IGZvcm1hdCBmb3IgcnNhMSBrZXlzOgorCisgICAgIGhvc3Qtb3ItbmFtZWxpc3QgYml0cyBleHBvbmVudCBtb2R1bHVzCisKKyAgICAgT3V0cHV0IGZvcm1hdCBmb3IgcnNhLCBkc2EgYW5kIGVjZHNhIGtleXM6CisKKyAgICAgaG9zdC1vci1uYW1lbGlzdCBrZXl0eXBlIGJhc2U2NC1lbmNvZGVkLWtleQorCisgICAgIFdoZXJlIGtleXR5cGUgaXMgZWl0aGVyIGBgZWNkc2Etc2hhMi1uaXN0cDI1NicnLCBgYGVjZHNhLXNoYTItbmlzdHAzODQnJywKKyAgICAgYGBlY2RzYS1zaGEyLW5pc3RwNTIxJycsIGBgc3NoLWRzcycnIG9yIGBgc3NoLXJzYScnLgorCisgICAgIC9ldGMvc3NoL3NzaF9rbm93bl9ob3N0cworCitFWEFNUExFUworICAgICBQcmludCB0aGUgcnNhIGhvc3Qga2V5IGZvciBtYWNoaW5lIGhvc3RuYW1lOgorCisgICAgICQgc3NoLWtleXNjYW4gaG9zdG5hbWUKKworICAgICBGaW5kIGFsbCBob3N0cyBmcm9tIHRoZSBmaWxlIHNzaF9ob3N0cyB3aGljaCBoYXZlIG5ldyBvciBkaWZmZXJlbnQga2V5cworICAgICBmcm9tIHRob3NlIGluIHRoZSBzb3J0ZWQgZmlsZSBzc2hfa25vd25faG9zdHM6CisKKyAgICAgJCBzc2gta2V5c2NhbiAtdCByc2EsZHNhLGVjZHNhIC1mIHNzaF9ob3N0cyB8IFwKKyAgICAgICAgICAgICBzb3J0IC11IC0gc3NoX2tub3duX2hvc3RzIHwgZGlmZiBzc2hfa25vd25faG9zdHMgLQorCitTRUUgQUxTTworICAgICBzc2goMSksIHNzaGQoOCkKKworQVVUSE9SUworICAgICBEYXZpZCBNYXppZXJlcyA8ZG1AbGNzLm1pdC5lZHU+IHdyb3RlIHRoZSBpbml0aWFsIHZlcnNpb24sIGFuZCBXYXluZQorICAgICBEYXZpc29uIDx3YXluZWRAdXNlcnMuc291cmNlZm9yZ2UubmV0PiBhZGRlZCBzdXBwb3J0IGZvciBwcm90b2NvbCB2ZXJzaW9uCisgICAgIDIuCisKK0JVR1MKKyAgICAgSXQgZ2VuZXJhdGVzICJDb25uZWN0aW9uIGNsb3NlZCBieSByZW1vdGUgaG9zdCIgbWVzc2FnZXMgb24gdGhlIGNvbnNvbGVzCisgICAgIG9mIGFsbCB0aGUgbWFjaGluZXMgaXQgc2NhbnMgaWYgdGhlIHNlcnZlciBpcyBvbGRlciB0aGFuIHZlcnNpb24gMi45LgorICAgICBUaGlzIGlzIGJlY2F1c2UgaXQgb3BlbnMgYSBjb25uZWN0aW9uIHRvIHRoZSBzc2ggcG9ydCwgcmVhZHMgdGhlIHB1YmxpYworICAgICBrZXksIGFuZCBkcm9wcyB0aGUgY29ubmVjdGlvbiBhcyBzb29uIGFzIGl0IGdldHMgdGhlIGtleS4KKworT3BlbkJTRCA1LjAgICAgICAgICAgICAgICAgICAgICBBdWd1c3QgMzEsIDIwMTAgICAgICAgICAgICAgICAgICAgIE9wZW5CU0QgNS4wCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NzaC1rZXlzY2FuLjEgYi9vcGVuc3NoLTYuMHAxL3NzaC1rZXlzY2FuLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU5YmI2ZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc3NoLWtleXNjYW4uMQpAQCAtMCwwICsxLDE3MiBAQAorLlwiCSRPcGVuQlNEOiBzc2gta2V5c2Nhbi4xLHYgMS4yOSAyMDEwLzA4LzMxIDExOjU0OjQ1IGRqbSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IDE5OTUsIDE5OTYgYnkgRGF2aWQgTWF6aWVyZXMgPGRtQGxjcy5taXQuZWR1Pi4KKy5cIgorLlwiIE1vZGlmaWNhdGlvbiBhbmQgcmVkaXN0cmlidXRpb24gaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgaXMKKy5cIiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCBkdWUgY3JlZGl0IGlzIGdpdmVuIHRvIHRoZSBhdXRob3IgYW5kIHRoZQorLlwiIE9wZW5CU0QgcHJvamVjdCBieSBsZWF2aW5nIHRoaXMgY29weXJpZ2h0IG5vdGljZSBpbnRhY3QuCisuXCIKKy5EZCAkTWRvY2RhdGU6IEF1Z3VzdCAzMSAyMDEwICQKKy5EdCBTU0gtS0VZU0NBTiAxCisuT3MKKy5TaCBOQU1FCisuTm0gc3NoLWtleXNjYW4KKy5OZCBnYXRoZXIgc3NoIHB1YmxpYyBrZXlzCisuU2ggU1lOT1BTSVMKKy5ObSBzc2gta2V5c2NhbgorLkJrIC13b3JkcworLk9wIEZsIDQ2SHYKKy5PcCBGbCBmIEFyIGZpbGUKKy5PcCBGbCBwIEFyIHBvcnQKKy5PcCBGbCBUIEFyIHRpbWVvdXQKKy5PcCBGbCB0IEFyIHR5cGUKKy5PcCBBciBob3N0IHwgYWRkcmxpc3QgbmFtZWxpc3QKKy5BciAuLi4KKy5FaworLlNoIERFU0NSSVBUSU9OCisuTm0KK2lzIGEgdXRpbGl0eSBmb3IgZ2F0aGVyaW5nIHRoZSBwdWJsaWMgc3NoIGhvc3Qga2V5cyBvZiBhIG51bWJlciBvZgoraG9zdHMuCitJdCB3YXMgZGVzaWduZWQgdG8gYWlkIGluIGJ1aWxkaW5nIGFuZCB2ZXJpZnlpbmcKKy5QYSBzc2hfa25vd25faG9zdHMKK2ZpbGVzLgorLk5tCitwcm92aWRlcyBhIG1pbmltYWwgaW50ZXJmYWNlIHN1aXRhYmxlIGZvciB1c2UgYnkgc2hlbGwgYW5kIHBlcmwKK3NjcmlwdHMuCisuUHAKKy5ObQordXNlcyBub24tYmxvY2tpbmcgc29ja2V0IEkvTyB0byBjb250YWN0IGFzIG1hbnkgaG9zdHMgYXMgcG9zc2libGUgaW4KK3BhcmFsbGVsLCBzbyBpdCBpcyB2ZXJ5IGVmZmljaWVudC4KK1RoZSBrZXlzIGZyb20gYSBkb21haW4gb2YgMSwwMDAKK2hvc3RzIGNhbiBiZSBjb2xsZWN0ZWQgaW4gdGVucyBvZiBzZWNvbmRzLCBldmVuIHdoZW4gc29tZSBvZiB0aG9zZQoraG9zdHMgYXJlIGRvd24gb3IgZG8gbm90IHJ1biBzc2guCitGb3Igc2Nhbm5pbmcsIG9uZSBkb2VzIG5vdCBuZWVkCitsb2dpbiBhY2Nlc3MgdG8gdGhlIG1hY2hpbmVzIHRoYXQgYXJlIGJlaW5nIHNjYW5uZWQsIG5vciBkb2VzIHRoZQorc2Nhbm5pbmcgcHJvY2VzcyBpbnZvbHZlIGFueSBlbmNyeXB0aW9uLgorLlBwCitUaGUgb3B0aW9ucyBhcmUgYXMgZm9sbG93czoKKy5CbCAtdGFnIC13aWR0aCBEcworLkl0IEZsIDQKK0ZvcmNlcworLk5tCit0byB1c2UgSVB2NCBhZGRyZXNzZXMgb25seS4KKy5JdCBGbCA2CitGb3JjZXMKKy5ObQordG8gdXNlIElQdjYgYWRkcmVzc2VzIG9ubHkuCisuSXQgRmwgZiBBciBmaWxlCitSZWFkIGhvc3RzIG9yCisuUGEgYWRkcmxpc3QgbmFtZWxpc3QKK3BhaXJzIGZyb20gdGhpcyBmaWxlLCBvbmUgcGVyIGxpbmUuCitJZgorLlBhIC0KK2lzIHN1cHBsaWVkIGluc3RlYWQgb2YgYSBmaWxlbmFtZSwKKy5ObQord2lsbCByZWFkIGhvc3RzIG9yCisuUGEgYWRkcmxpc3QgbmFtZWxpc3QKK3BhaXJzIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0LgorLkl0IEZsIEgKK0hhc2ggYWxsIGhvc3RuYW1lcyBhbmQgYWRkcmVzc2VzIGluIHRoZSBvdXRwdXQuCitIYXNoZWQgbmFtZXMgbWF5IGJlIHVzZWQgbm9ybWFsbHkgYnkKKy5ObSBzc2gKK2FuZAorLk5tIHNzaGQgLAorYnV0IHRoZXkgZG8gbm90IHJldmVhbCBpZGVudGlmeWluZyBpbmZvcm1hdGlvbiBzaG91bGQgdGhlIGZpbGUncyBjb250ZW50cworYmUgZGlzY2xvc2VkLgorLkl0IEZsIHAgQXIgcG9ydAorUG9ydCB0byBjb25uZWN0IHRvIG9uIHRoZSByZW1vdGUgaG9zdC4KKy5JdCBGbCBUIEFyIHRpbWVvdXQKK1NldCB0aGUgdGltZW91dCBmb3IgY29ubmVjdGlvbiBhdHRlbXB0cy4KK0lmCisuUGEgdGltZW91dAorc2Vjb25kcyBoYXZlIGVsYXBzZWQgc2luY2UgYSBjb25uZWN0aW9uIHdhcyBpbml0aWF0ZWQgdG8gYSBob3N0IG9yIHNpbmNlIHRoZQorbGFzdCB0aW1lIGFueXRoaW5nIHdhcyByZWFkIGZyb20gdGhhdCBob3N0LCB0aGVuIHRoZSBjb25uZWN0aW9uIGlzCitjbG9zZWQgYW5kIHRoZSBob3N0IGluIHF1ZXN0aW9uIGNvbnNpZGVyZWQgdW5hdmFpbGFibGUuCitEZWZhdWx0IGlzIDUgc2Vjb25kcy4KKy5JdCBGbCB0IEFyIHR5cGUKK1NwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUga2V5IHRvIGZldGNoIGZyb20gdGhlIHNjYW5uZWQgaG9zdHMuCitUaGUgcG9zc2libGUgdmFsdWVzIGFyZQorLkRxIHJzYTEKK2ZvciBwcm90b2NvbCB2ZXJzaW9uIDEgYW5kCisuRHEgZHNhICwKKy5EcSBlY2RzYQorb3IKKy5EcSByc2EKK2ZvciBwcm90b2NvbCB2ZXJzaW9uIDIuCitNdWx0aXBsZSB2YWx1ZXMgbWF5IGJlIHNwZWNpZmllZCBieSBzZXBhcmF0aW5nIHRoZW0gd2l0aCBjb21tYXMuCitUaGUgZGVmYXVsdCBpcworLkRxIHJzYSAuCisuSXQgRmwgdgorVmVyYm9zZSBtb2RlLgorQ2F1c2VzCisuTm0KK3RvIHByaW50IGRlYnVnZ2luZyBtZXNzYWdlcyBhYm91dCBpdHMgcHJvZ3Jlc3MuCisuRWwKKy5TaCBTRUNVUklUWQorSWYgYW4gc3NoX2tub3duX2hvc3RzIGZpbGUgaXMgY29uc3RydWN0ZWQgdXNpbmcKKy5ObQord2l0aG91dCB2ZXJpZnlpbmcgdGhlIGtleXMsIHVzZXJzIHdpbGwgYmUgdnVsbmVyYWJsZSB0bworLkVtIG1hbiBpbiB0aGUgbWlkZGxlCithdHRhY2tzLgorT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZSBzZWN1cml0eSBtb2RlbCBhbGxvd3Mgc3VjaCBhIHJpc2ssCisuTm0KK2NhbiBoZWxwIGluIHRoZSBkZXRlY3Rpb24gb2YgdGFtcGVyZWQga2V5ZmlsZXMgb3IgbWFuIGluIHRoZSBtaWRkbGUKK2F0dGFja3Mgd2hpY2ggaGF2ZSBiZWd1biBhZnRlciB0aGUgc3NoX2tub3duX2hvc3RzIGZpbGUgd2FzIGNyZWF0ZWQuCisuU2ggRklMRVMKKy5QYSBJbnB1dCBmb3JtYXQ6CisuQmQgLWxpdGVyYWwKKzEuMi4zLjQsMS4yLjQuNCBuYW1lLm15LmRvbWFpbixuYW1lLG4ubXkuZG9tYWluLG4sMS4yLjMuNCwxLjIuNC40CisuRWQKKy5QcAorLlBhIE91dHB1dCBmb3JtYXQgZm9yIHJzYTEga2V5czoKKy5CZCAtbGl0ZXJhbAoraG9zdC1vci1uYW1lbGlzdCBiaXRzIGV4cG9uZW50IG1vZHVsdXMKKy5FZAorLlBwCisuUGEgT3V0cHV0IGZvcm1hdCBmb3IgcnNhLCBkc2EgYW5kIGVjZHNhIGtleXM6CisuQmQgLWxpdGVyYWwKK2hvc3Qtb3ItbmFtZWxpc3Qga2V5dHlwZSBiYXNlNjQtZW5jb2RlZC1rZXkKKy5FZAorLlBwCitXaGVyZQorLlBhIGtleXR5cGUKK2lzIGVpdGhlcgorLkRxIGVjZHNhLXNoYTItbmlzdHAyNTYgLAorLkRxIGVjZHNhLXNoYTItbmlzdHAzODQgLAorLkRxIGVjZHNhLXNoYTItbmlzdHA1MjEgLAorLkRxIHNzaC1kc3MKK29yCisuRHEgc3NoLXJzYSAuCisuUHAKKy5QYSAvZXRjL3NzaC9zc2hfa25vd25faG9zdHMKKy5TaCBFWEFNUExFUworUHJpbnQgdGhlCisuUGEgcnNhCitob3N0IGtleSBmb3IgbWFjaGluZQorLlBhIGhvc3RuYW1lIDoKKy5CZCAtbGl0ZXJhbAorJCBzc2gta2V5c2NhbiBob3N0bmFtZQorLkVkCisuUHAKK0ZpbmQgYWxsIGhvc3RzIGZyb20gdGhlIGZpbGUKKy5QYSBzc2hfaG9zdHMKK3doaWNoIGhhdmUgbmV3IG9yIGRpZmZlcmVudCBrZXlzIGZyb20gdGhvc2UgaW4gdGhlIHNvcnRlZCBmaWxlCisuUGEgc3NoX2tub3duX2hvc3RzIDoKKy5CZCAtbGl0ZXJhbAorJCBzc2gta2V5c2NhbiAtdCByc2EsZHNhLGVjZHNhIC1mIHNzaF9ob3N0cyB8IFxlCisJc29ydCAtdSAtIHNzaF9rbm93bl9ob3N0cyB8IGRpZmYgc3NoX2tub3duX2hvc3RzIC0KKy5FZAorLlNoIFNFRSBBTFNPCisuWHIgc3NoIDEgLAorLlhyIHNzaGQgOAorLlNoIEFVVEhPUlMKKy5BbiAtbm9zcGxpdAorLkFuIERhdmlkIE1hemllcmVzIEFxIGRtQGxjcy5taXQuZWR1Cit3cm90ZSB0aGUgaW5pdGlhbCB2ZXJzaW9uLCBhbmQKKy5BbiBXYXluZSBEYXZpc29uIEFxIHdheW5lZEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKK2FkZGVkIHN1cHBvcnQgZm9yIHByb3RvY29sIHZlcnNpb24gMi4KKy5TaCBCVUdTCitJdCBnZW5lcmF0ZXMgIkNvbm5lY3Rpb24gY2xvc2VkIGJ5IHJlbW90ZSBob3N0IiBtZXNzYWdlcyBvbiB0aGUgY29uc29sZXMKK29mIGFsbCB0aGUgbWFjaGluZXMgaXQgc2NhbnMgaWYgdGhlIHNlcnZlciBpcyBvbGRlciB0aGFuIHZlcnNpb24gMi45LgorVGhpcyBpcyBiZWNhdXNlIGl0IG9wZW5zIGEgY29ubmVjdGlvbiB0byB0aGUgc3NoIHBvcnQsIHJlYWRzIHRoZSBwdWJsaWMKK2tleSwgYW5kIGRyb3BzIHRoZSBjb25uZWN0aW9uIGFzIHNvb24gYXMgaXQgZ2V0cyB0aGUga2V5LgpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zc2gta2V5c2Nhbi5jIGIvb3BlbnNzaC02LjBwMS9zc2gta2V5c2Nhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwODVkZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NzaC1rZXlzY2FuLmMKQEAgLTAsMCArMSw3NjMgQEAKKy8qICRPcGVuQlNEOiBzc2gta2V5c2Nhbi5jLHYgMS44NSAyMDExLzAzLzE1IDEwOjM2OjAyIG9rYW4gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgMTk5NSwgMTk5NiBieSBEYXZpZCBNYXppZXJlcyA8ZG1AbGNzLm1pdC5lZHU+LgorICoKKyAqIE1vZGlmaWNhdGlvbiBhbmQgcmVkaXN0cmlidXRpb24gaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgaXMKKyAqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IGR1ZSBjcmVkaXQgaXMgZ2l2ZW4gdG8gdGhlIGF1dGhvciBhbmQgdGhlCisgKiBPcGVuQlNEIHByb2plY3QgYnkgbGVhdmluZyB0aGlzIGNvcHlyaWdodCBub3RpY2UgaW50YWN0LgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorIAorI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L3N5cy1xdWV1ZS5oIgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorIyBpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJzc2guaCIKKyNpbmNsdWRlICJzc2gxLmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAia2V5LmgiCisjaW5jbHVkZSAiY2lwaGVyLmgiCisjaW5jbHVkZSAia2V4LmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisjaW5jbHVkZSAibXlwcm9wb3NhbC5oIgorI2luY2x1ZGUgInBhY2tldC5oIgorI2luY2x1ZGUgImRpc3BhdGNoLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAiYXRvbWljaW8uaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAiaG9zdGZpbGUuaCIKKworLyogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgSVB2NCBvciBJUHY2LiAgVGhpcyBjYW4gYmUgc2V0IG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICBEZWZhdWx0IHZhbHVlIGlzIEFGX1VOU1BFQyBtZWFucyBib3RoIElQdjQgYW5kIElQdjYuICovCitpbnQgSVB2NG9yNiA9IEFGX1VOU1BFQzsKKworaW50IHNzaF9wb3J0ID0gU1NIX0RFRkFVTFRfUE9SVDsKKworI2RlZmluZSBLVF9SU0ExCQkxCisjZGVmaW5lIEtUX0RTQQkJMgorI2RlZmluZSBLVF9SU0EJCTQKKyNkZWZpbmUgS1RfRUNEU0EJOAorCitpbnQgZ2V0X2tleXR5cGVzID0gS1RfUlNBOwkvKiBHZXQgb25seSBSU0Ega2V5cyBieSBkZWZhdWx0ICovCisKK2ludCBoYXNoX2hvc3RzID0gMDsJCS8qIEhhc2ggaG9zdG5hbWUgb24gb3V0cHV0ICovCisKKyNkZWZpbmUgTUFYTUFYRkQgMjU2CisKKy8qIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyBhZnRlciB3aGljaCB0byBnaXZlIHVwIG9uIGEgVENQIGNvbm5lY3Rpb24gKi8KK2ludCB0aW1lb3V0ID0gNTsKKworaW50IG1heGZkOworI2RlZmluZSBNQVhDT04gKG1heGZkIC0gMTApCisKK2V4dGVybiBjaGFyICpfX3Byb2duYW1lOworZmRfc2V0ICpyZWFkX3dhaXQ7CitzaXplX3QgcmVhZF93YWl0X25mZHNldDsKK2ludCBuY29uOworaW50IG5vbmZhdGFsX2ZhdGFsID0gMDsKK2ptcF9idWYga2V4am1wOworS2V5ICprZXhqbXBfa2V5OworCisvKgorICogS2VlcCBhIGNvbm5lY3Rpb24gc3RydWN0dXJlIGZvciBlYWNoIGZpbGUgZGVzY3JpcHRvci4gIFRoZSBzdGF0ZQorICogYXNzb2NpYXRlZCB3aXRoIGZpbGUgZGVzY3JpcHRvciBuIGlzIGhlbGQgaW4gZmRjb25bbl0uCisgKi8KK3R5cGVkZWYgc3RydWN0IENvbm5lY3Rpb24geworCXVfY2hhciBjX3N0YXR1czsJLyogU3RhdGUgb2YgY29ubmVjdGlvbiBvbiB0aGlzIGZpbGUgZGVzYy4gKi8KKyNkZWZpbmUgQ1NfVU5VU0VEIDAJCS8qIEZpbGUgZGVzY3JpcHRvciB1bnVzZWQgKi8KKyNkZWZpbmUgQ1NfQ09OIDEJCS8qIFdhaXRpbmcgdG8gY29ubmVjdC9yZWFkIGdyZWV0aW5nICovCisjZGVmaW5lIENTX1NJWkUgMgkJLyogV2FpdGluZyB0byByZWFkIGluaXRpYWwgcGFja2V0IHNpemUgKi8KKyNkZWZpbmUgQ1NfS0VZUyAzCQkvKiBXYWl0aW5nIHRvIHJlYWQgcHVibGljIGtleSBwYWNrZXQgKi8KKwlpbnQgY19mZDsJCS8qIFF1aWNrIGxvb2t1cDogYy0+Y19mZCA9PSBjIC0gZmRjb24gKi8KKwlpbnQgY19wbGVuOwkJLyogUGFja2V0IGxlbmd0aCBmaWVsZCBmb3Igc3NoIHBhY2tldCAqLworCWludCBjX2xlbjsJCS8qIFRvdGFsIGJ5dGVzIHdoaWNoIG11c3QgYmUgcmVhZC4gKi8KKwlpbnQgY19vZmY7CQkvKiBMZW5ndGggb2YgZGF0YSByZWFkIHNvIGZhci4gKi8KKwlpbnQgY19rZXl0eXBlOwkJLyogT25seSBvbmUgb2YgS1RfUlNBMSwgS1RfRFNBLCBvciBLVF9SU0EgKi8KKwljaGFyICpjX25hbWViYXNlOwkvKiBBZGRyZXNzIHRvIGZyZWUgZm9yIGNfbmFtZSBhbmQgY19uYW1lbGlzdCAqLworCWNoYXIgKmNfbmFtZTsJCS8qIEhvc3RuYW1lIG9mIGNvbm5lY3Rpb24gZm9yIGVycm9ycyAqLworCWNoYXIgKmNfbmFtZWxpc3Q7CS8qIFBvaW50ZXIgdG8gb3RoZXIgcG9zc2libGUgYWRkcmVzc2VzICovCisJY2hhciAqY19vdXRwdXRfbmFtZTsJLyogSG9zdG5hbWUgb2YgY29ubmVjdGlvbiBmb3Igb3V0cHV0ICovCisJY2hhciAqY19kYXRhOwkJLyogRGF0YSByZWFkIGZyb20gdGhpcyBmZCAqLworCUtleCAqY19rZXg7CQkvKiBUaGUga2V5LWV4Y2hhbmdlIHN0cnVjdCBmb3Igc3NoMiAqLworCXN0cnVjdCB0aW1ldmFsIGNfdHY7CS8qIFRpbWUgYXQgd2hpY2ggY29ubmVjdGlvbiBnZXRzIGFib3J0ZWQgKi8KKwlUQUlMUV9FTlRSWShDb25uZWN0aW9uKSBjX2xpbms7CS8qIExpc3Qgb2YgY29ubmVjdGlvbnMgaW4gdGltZW91dCBvcmRlci4gKi8KK30gY29uOworCitUQUlMUV9IRUFEKGNvbmxpc3QsIENvbm5lY3Rpb24pIHRxOwkvKiBUaW1lb3V0IFF1ZXVlICovCitjb24gKmZkY29uOworCitzdGF0aWMgaW50CitmZGxpbV9nZXQoaW50IGhhcmQpCit7CisjaWYgZGVmaW5lZChIQVZFX0dFVFJMSU1JVCkgJiYgZGVmaW5lZChSTElNSVRfTk9GSUxFKQorCXN0cnVjdCBybGltaXQgcmxmZDsKKworCWlmIChnZXRybGltaXQoUkxJTUlUX05PRklMRSwgJnJsZmQpIDwgMCkKKwkJcmV0dXJuICgtMSk7CisJaWYgKChoYXJkID8gcmxmZC5ybGltX21heCA6IHJsZmQucmxpbV9jdXIpID09IFJMSU1fSU5GSU5JVFkpCisJCXJldHVybiBTU0hfU1lTRkRNQVg7CisJZWxzZQorCQlyZXR1cm4gaGFyZCA/IHJsZmQucmxpbV9tYXggOiBybGZkLnJsaW1fY3VyOworI2Vsc2UKKwlyZXR1cm4gU1NIX1NZU0ZETUFYOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQKK2ZkbGltX3NldChpbnQgbGltKQoreworI2lmIGRlZmluZWQoSEFWRV9TRVRSTElNSVQpICYmIGRlZmluZWQoUkxJTUlUX05PRklMRSkKKwlzdHJ1Y3QgcmxpbWl0IHJsZmQ7CisjZW5kaWYKKworCWlmIChsaW0gPD0gMCkKKwkJcmV0dXJuICgtMSk7CisjaWYgZGVmaW5lZChIQVZFX1NFVFJMSU1JVCkgJiYgZGVmaW5lZChSTElNSVRfTk9GSUxFKQorCWlmIChnZXRybGltaXQoUkxJTUlUX05PRklMRSwgJnJsZmQpIDwgMCkKKwkJcmV0dXJuICgtMSk7CisJcmxmZC5ybGltX2N1ciA9IGxpbTsKKwlpZiAoc2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUsICZybGZkKSA8IDApCisJCXJldHVybiAoLTEpOworI2VsaWYgZGVmaW5lZCAoSEFWRV9TRVREVEFCTEVTSVpFKQorCXNldGR0YWJsZXNpemUobGltKTsKKyNlbmRpZgorCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIGFuIHN0cnNlcCBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBudWxsIGZpZWxkIGZvciBhZGphY2VudAorICogc2VwYXJhdG9ycy4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIDQuNEJTRCBzdHJzZXAsIGJ1dCBkaWZmZXJlbnQgZnJvbSB0aGUKKyAqIG9uZSBpbiB0aGUgR05VIGxpYmMuCisgKi8KK3N0YXRpYyBjaGFyICoKK3hzdHJzZXAoY2hhciAqKnN0ciwgY29uc3QgY2hhciAqZGVsaW0pCit7CisJY2hhciAqcywgKmU7CisKKwlpZiAoISoqc3RyKQorCQlyZXR1cm4gKE5VTEwpOworCisJcyA9ICpzdHI7CisJZSA9IHMgKyBzdHJjc3BuKHMsIGRlbGltKTsKKworCWlmICgqZSAhPSAnXDAnKQorCQkqZSsrID0gJ1wwJzsKKwkqc3RyID0gZTsKKworCXJldHVybiAocyk7Cit9CisKKy8qCisgKiBHZXQgdGhlIG5leHQgbm9uLW51bGwgdG9rZW4gKGxpa2UgR05VIHN0cnNlcCkuICBTdHJzZXAoKSB3aWxsIHJldHVybiBhCisgKiBudWxsIHRva2VuIGZvciB0d28gYWRqYWNlbnQgc2VwYXJhdG9ycywgc28gd2UgbWF5IGhhdmUgdG8gbG9vcC4KKyAqLworc3RhdGljIGNoYXIgKgorc3Rybm5zZXAoY2hhciAqKnN0cmluZ3AsIGNoYXIgKmRlbGltKQoreworCWNoYXIgKnRvazsKKworCWRvIHsKKwkJdG9rID0geHN0cnNlcChzdHJpbmdwLCBkZWxpbSk7CisJfSB3aGlsZSAodG9rICYmICp0b2sgPT0gJ1wwJyk7CisJcmV0dXJuICh0b2spOworfQorCitzdGF0aWMgS2V5ICoKK2tleWdyYWJfc3NoMShjb24gKmMpCit7CisJc3RhdGljIEtleSAqcnNhOworCXN0YXRpYyBCdWZmZXIgbXNnOworCisJaWYgKHJzYSA9PSBOVUxMKSB7CisJCWJ1ZmZlcl9pbml0KCZtc2cpOworCQlyc2EgPSBrZXlfbmV3KEtFWV9SU0ExKTsKKwl9CisJYnVmZmVyX2FwcGVuZCgmbXNnLCBjLT5jX2RhdGEsIGMtPmNfcGxlbik7CisJYnVmZmVyX2NvbnN1bWUoJm1zZywgOCAtIChjLT5jX3BsZW4gJiA3KSk7CS8qIHBhZGRpbmcgKi8KKwlpZiAoYnVmZmVyX2dldF9jaGFyKCZtc2cpICE9IChpbnQpIFNTSF9TTVNHX1BVQkxJQ19LRVkpIHsKKwkJZXJyb3IoIiVzOiBpbnZhbGlkIHBhY2tldCB0eXBlIiwgYy0+Y19uYW1lKTsKKwkJYnVmZmVyX2NsZWFyKCZtc2cpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYnVmZmVyX2NvbnN1bWUoJm1zZywgOCk7CQkvKiBjb29raWUgKi8KKworCS8qIHNlcnZlciBrZXkgKi8KKwkodm9pZCkgYnVmZmVyX2dldF9pbnQoJm1zZyk7CisJYnVmZmVyX2dldF9iaWdudW0oJm1zZywgcnNhLT5yc2EtPmUpOworCWJ1ZmZlcl9nZXRfYmlnbnVtKCZtc2csIHJzYS0+cnNhLT5uKTsKKworCS8qIGhvc3Qga2V5ICovCisJKHZvaWQpIGJ1ZmZlcl9nZXRfaW50KCZtc2cpOworCWJ1ZmZlcl9nZXRfYmlnbnVtKCZtc2csIHJzYS0+cnNhLT5lKTsKKwlidWZmZXJfZ2V0X2JpZ251bSgmbXNnLCByc2EtPnJzYS0+bik7CisKKwlidWZmZXJfY2xlYXIoJm1zZyk7CisKKwlyZXR1cm4gKHJzYSk7Cit9CisKK3N0YXRpYyBpbnQKK2hvc3RqdW1wKEtleSAqaG9zdGtleSkKK3sKKwlrZXhqbXBfa2V5ID0gaG9zdGtleTsKKwlsb25nam1wKGtleGptcCwgMSk7Cit9CisKK3N0YXRpYyBpbnQKK3NzaDJfY2FwYWJsZShpbnQgcmVtb3RlX21ham9yLCBpbnQgcmVtb3RlX21pbm9yKQoreworCXN3aXRjaCAocmVtb3RlX21ham9yKSB7CisJY2FzZSAxOgorCQlpZiAocmVtb3RlX21pbm9yID09IDk5KQorCQkJcmV0dXJuIDE7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgS2V5ICoKK2tleWdyYWJfc3NoMihjb24gKmMpCit7CisJaW50IGo7CisKKwlwYWNrZXRfc2V0X2Nvbm5lY3Rpb24oYy0+Y19mZCwgYy0+Y19mZCk7CisJZW5hYmxlX2NvbXBhdDIwKCk7CisJbXlwcm9wb3NhbFtQUk9QT1NBTF9TRVJWRVJfSE9TVF9LRVlfQUxHU10gPSBjLT5jX2tleXR5cGUgPT0gS1RfRFNBPworCSAgICAic3NoLWRzcyIgOiAoYy0+Y19rZXl0eXBlID09IEtUX1JTQSA/ICJzc2gtcnNhIiA6CisJICAgICJlY2RzYS1zaGEyLW5pc3RwMjU2LGVjZHNhLXNoYTItbmlzdHAzODQsZWNkc2Etc2hhMi1uaXN0cDUyMSIpOworCWMtPmNfa2V4ID0ga2V4X3NldHVwKG15cHJvcG9zYWwpOworCWMtPmNfa2V4LT5rZXhbS0VYX0RIX0dSUDFfU0hBMV0gPSBrZXhkaF9jbGllbnQ7CisJYy0+Y19rZXgtPmtleFtLRVhfREhfR1JQMTRfU0hBMV0gPSBrZXhkaF9jbGllbnQ7CisJYy0+Y19rZXgtPmtleFtLRVhfREhfR0VYX1NIQTFdID0ga2V4Z2V4X2NsaWVudDsKKwljLT5jX2tleC0+a2V4W0tFWF9ESF9HRVhfU0hBMjU2XSA9IGtleGdleF9jbGllbnQ7CisJYy0+Y19rZXgtPmtleFtLRVhfRUNESF9TSEEyXSA9IGtleGVjZGhfY2xpZW50OworCWMtPmNfa2V4LT52ZXJpZnlfaG9zdF9rZXkgPSBob3N0anVtcDsKKworCWlmICghKGogPSBzZXRqbXAoa2V4am1wKSkpIHsKKwkJbm9uZmF0YWxfZmF0YWwgPSAxOworCQlkaXNwYXRjaF9ydW4oRElTUEFUQ0hfQkxPQ0ssICZjLT5jX2tleC0+ZG9uZSwgYy0+Y19rZXgpOworCQlmcHJpbnRmKHN0ZGVyciwgIkltcG9zc2libGUhIGRpc3BhdGNoX3J1bigpIHJldHVybmVkIVxuIik7CisJCWV4aXQoMSk7CisJfQorCW5vbmZhdGFsX2ZhdGFsID0gMDsKKwl4ZnJlZShjLT5jX2tleCk7CisJYy0+Y19rZXggPSBOVUxMOworCXBhY2tldF9jbG9zZSgpOworCisJcmV0dXJuIGogPCAwPyBOVUxMIDoga2V4am1wX2tleTsKK30KKworc3RhdGljIHZvaWQKK2tleXByaW50KGNvbiAqYywgS2V5ICprZXkpCit7CisJY2hhciAqaG9zdCA9IGMtPmNfb3V0cHV0X25hbWUgPyBjLT5jX291dHB1dF9uYW1lIDogYy0+Y19uYW1lOworCisJaWYgKCFrZXkpCisJCXJldHVybjsKKwlpZiAoaGFzaF9ob3N0cyAmJiAoaG9zdCA9IGhvc3RfaGFzaChob3N0LCBOVUxMLCAwKSkgPT0gTlVMTCkKKwkJZmF0YWwoImhvc3RfaGFzaCBmYWlsZWQiKTsKKworCWZwcmludGYoc3Rkb3V0LCAiJXMgIiwgaG9zdCk7CisJa2V5X3dyaXRlKGtleSwgc3Rkb3V0KTsKKwlmcHV0cygiXG4iLCBzdGRvdXQpOworfQorCitzdGF0aWMgaW50Cit0Y3Bjb25uZWN0KGNoYXIgKmhvc3QpCit7CisJc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWksICphaXRvcDsKKwljaGFyIHN0cnBvcnRbTklfTUFYU0VSVl07CisJaW50IGdhaWVyciwgcyA9IC0xOworCisJc25wcmludGYoc3RycG9ydCwgc2l6ZW9mIHN0cnBvcnQsICIlZCIsIHNzaF9wb3J0KTsKKwltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKwloaW50cy5haV9mYW1pbHkgPSBJUHY0b3I2OworCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisJaWYgKChnYWllcnIgPSBnZXRhZGRyaW5mbyhob3N0LCBzdHJwb3J0LCAmaGludHMsICZhaXRvcCkpICE9IDApCisJCWZhdGFsKCJnZXRhZGRyaW5mbyAlczogJXMiLCBob3N0LCBzc2hfZ2FpX3N0cmVycm9yKGdhaWVycikpOworCWZvciAoYWkgPSBhaXRvcDsgYWk7IGFpID0gYWktPmFpX25leHQpIHsKKwkJcyA9IHNvY2tldChhaS0+YWlfZmFtaWx5LCBhaS0+YWlfc29ja3R5cGUsIGFpLT5haV9wcm90b2NvbCk7CisJCWlmIChzIDwgMCkgeworCQkJZXJyb3IoInNvY2tldDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHNldF9ub25ibG9jayhzKSA9PSAtMSkKKwkJCWZhdGFsKCIlczogc2V0X25vbmJsb2NrKCVkKSIsIF9fZnVuY19fLCBzKTsKKwkJaWYgKGNvbm5lY3QocywgYWktPmFpX2FkZHIsIGFpLT5haV9hZGRybGVuKSA8IDAgJiYKKwkJICAgIGVycm5vICE9IEVJTlBST0dSRVNTKQorCQkJZXJyb3IoImNvbm5lY3QgKGAlcycpOiAlcyIsIGhvc3QsIHN0cmVycm9yKGVycm5vKSk7CisJCWVsc2UKKwkJCWJyZWFrOworCQljbG9zZShzKTsKKwkJcyA9IC0xOworCX0KKwlmcmVlYWRkcmluZm8oYWl0b3ApOworCXJldHVybiBzOworfQorCitzdGF0aWMgaW50Citjb25hbGxvYyhjaGFyICppbmFtZSwgY2hhciAqb25hbWUsIGludCBrZXl0eXBlKQoreworCWNoYXIgKm5hbWViYXNlLCAqbmFtZSwgKm5hbWVsaXN0OworCWludCBzOworCisJbmFtZWJhc2UgPSBuYW1lbGlzdCA9IHhzdHJkdXAoaW5hbWUpOworCisJZG8geworCQluYW1lID0geHN0cnNlcCgmbmFtZWxpc3QsICIsIik7CisJCWlmICghbmFtZSkgeworCQkJeGZyZWUobmFtZWJhc2UpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwl9IHdoaWxlICgocyA9IHRjcGNvbm5lY3QobmFtZSkpIDwgMCk7CisKKwlpZiAocyA+PSBtYXhmZCkKKwkJZmF0YWwoImNvbmFsbG9jOiBmZG5vICVkIHRvbyBoaWdoIiwgcyk7CisJaWYgKGZkY29uW3NdLmNfc3RhdHVzKQorCQlmYXRhbCgiY29uYWxsb2M6IGF0dGVtcHQgdG8gcmV1c2UgZmRubyAlZCIsIHMpOworCisJZmRjb25bc10uY19mZCA9IHM7CisJZmRjb25bc10uY19zdGF0dXMgPSBDU19DT047CisJZmRjb25bc10uY19uYW1lYmFzZSA9IG5hbWViYXNlOworCWZkY29uW3NdLmNfbmFtZSA9IG5hbWU7CisJZmRjb25bc10uY19uYW1lbGlzdCA9IG5hbWVsaXN0OworCWZkY29uW3NdLmNfb3V0cHV0X25hbWUgPSB4c3RyZHVwKG9uYW1lKTsKKwlmZGNvbltzXS5jX2RhdGEgPSAoY2hhciAqKSAmZmRjb25bc10uY19wbGVuOworCWZkY29uW3NdLmNfbGVuID0gNDsKKwlmZGNvbltzXS5jX29mZiA9IDA7CisJZmRjb25bc10uY19rZXl0eXBlID0ga2V5dHlwZTsKKwlnZXR0aW1lb2ZkYXkoJmZkY29uW3NdLmNfdHYsIE5VTEwpOworCWZkY29uW3NdLmNfdHYudHZfc2VjICs9IHRpbWVvdXQ7CisJVEFJTFFfSU5TRVJUX1RBSUwoJnRxLCAmZmRjb25bc10sIGNfbGluayk7CisJRkRfU0VUKHMsIHJlYWRfd2FpdCk7CisJbmNvbisrOworCXJldHVybiAocyk7Cit9CisKK3N0YXRpYyB2b2lkCitjb25mcmVlKGludCBzKQoreworCWlmIChzID49IG1heGZkIHx8IGZkY29uW3NdLmNfc3RhdHVzID09IENTX1VOVVNFRCkKKwkJZmF0YWwoImNvbmZyZWU6IGF0dGVtcHQgdG8gZnJlZSBiYWQgZmRubyAlZCIsIHMpOworCWNsb3NlKHMpOworCXhmcmVlKGZkY29uW3NdLmNfbmFtZWJhc2UpOworCXhmcmVlKGZkY29uW3NdLmNfb3V0cHV0X25hbWUpOworCWlmIChmZGNvbltzXS5jX3N0YXR1cyA9PSBDU19LRVlTKQorCQl4ZnJlZShmZGNvbltzXS5jX2RhdGEpOworCWZkY29uW3NdLmNfc3RhdHVzID0gQ1NfVU5VU0VEOworCWZkY29uW3NdLmNfa2V5dHlwZSA9IDA7CisJVEFJTFFfUkVNT1ZFKCZ0cSwgJmZkY29uW3NdLCBjX2xpbmspOworCUZEX0NMUihzLCByZWFkX3dhaXQpOworCW5jb24tLTsKK30KKworc3RhdGljIHZvaWQKK2NvbnRvdWNoKGludCBzKQoreworCVRBSUxRX1JFTU9WRSgmdHEsICZmZGNvbltzXSwgY19saW5rKTsKKwlnZXR0aW1lb2ZkYXkoJmZkY29uW3NdLmNfdHYsIE5VTEwpOworCWZkY29uW3NdLmNfdHYudHZfc2VjICs9IHRpbWVvdXQ7CisJVEFJTFFfSU5TRVJUX1RBSUwoJnRxLCAmZmRjb25bc10sIGNfbGluayk7Cit9CisKK3N0YXRpYyBpbnQKK2NvbnJlY3ljbGUoaW50IHMpCit7CisJY29uICpjID0gJmZkY29uW3NdOworCWludCByZXQ7CisKKwlyZXQgPSBjb25hbGxvYyhjLT5jX25hbWVsaXN0LCBjLT5jX291dHB1dF9uYW1lLCBjLT5jX2tleXR5cGUpOworCWNvbmZyZWUocyk7CisJcmV0dXJuIChyZXQpOworfQorCitzdGF0aWMgdm9pZAorY29uZ3JlZXQoaW50IHMpCit7CisJaW50IG4gPSAwLCByZW1vdGVfbWFqb3IgPSAwLCByZW1vdGVfbWlub3IgPSAwOworCWNoYXIgYnVmWzI1Nl0sICpjcDsKKwljaGFyIHJlbW90ZV92ZXJzaW9uW3NpemVvZiBidWZdOworCXNpemVfdCBidWZzaXo7CisJY29uICpjID0gJmZkY29uW3NdOworCisJZm9yICg7OykgeworCQltZW1zZXQoYnVmLCAnXDAnLCBzaXplb2YoYnVmKSk7CisJCWJ1ZnNpeiA9IHNpemVvZihidWYpOworCQljcCA9IGJ1ZjsKKwkJd2hpbGUgKGJ1ZnNpei0tICYmCisJCSAgICAobiA9IGF0b21pY2lvKHJlYWQsIHMsIGNwLCAxKSkgPT0gMSAmJiAqY3AgIT0gJ1xuJykgeworCQkJaWYgKCpjcCA9PSAnXHInKQorCQkJCSpjcCA9ICdcbic7CisJCQljcCsrOworCQl9CisJCWlmIChuICE9IDEgfHwgc3RybmNtcChidWYsICJTU0gtIiwgNCkgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAobiA9PSAwKSB7CisJCXN3aXRjaCAoZXJybm8pIHsKKwkJY2FzZSBFUElQRToKKwkJCWVycm9yKCIlczogQ29ubmVjdGlvbiBjbG9zZWQgYnkgcmVtb3RlIGhvc3QiLCBjLT5jX25hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgRUNPTk5SRUZVU0VEOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnJvcigicmVhZCAoJXMpOiAlcyIsIGMtPmNfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWJyZWFrOworCQl9CisJCWNvbnJlY3ljbGUocyk7CisJCXJldHVybjsKKwl9CisJaWYgKCpjcCAhPSAnXG4nICYmICpjcCAhPSAnXHInKSB7CisJCWVycm9yKCIlczogYmFkIGdyZWV0aW5nIiwgYy0+Y19uYW1lKTsKKwkJY29uZnJlZShzKTsKKwkJcmV0dXJuOworCX0KKwkqY3AgPSAnXDAnOworCWlmIChzc2NhbmYoYnVmLCAiU1NILSVkLiVkLSVbXlxuXVxuIiwKKwkgICAgJnJlbW90ZV9tYWpvciwgJnJlbW90ZV9taW5vciwgcmVtb3RlX3ZlcnNpb24pID09IDMpCisJCWNvbXBhdF9kYXRhZmVsbG93cyhyZW1vdGVfdmVyc2lvbik7CisJZWxzZQorCQlkYXRhZmVsbG93cyA9IDA7CisJaWYgKGMtPmNfa2V5dHlwZSAhPSBLVF9SU0ExKSB7CisJCWlmICghc3NoMl9jYXBhYmxlKHJlbW90ZV9tYWpvciwgcmVtb3RlX21pbm9yKSkgeworCQkJZGVidWcoIiVzIGRvZXNuJ3Qgc3VwcG9ydCBzc2gyIiwgYy0+Y19uYW1lKTsKKwkJCWNvbmZyZWUocyk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgaWYgKHJlbW90ZV9tYWpvciAhPSAxKSB7CisJCWRlYnVnKCIlcyBkb2Vzbid0IHN1cHBvcnQgc3NoMSIsIGMtPmNfbmFtZSk7CisJCWNvbmZyZWUocyk7CisJCXJldHVybjsKKwl9CisJZnByaW50ZihzdGRlcnIsICIjICVzICVzXG4iLCBjLT5jX25hbWUsIGNob3AoYnVmKSk7CisJbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIlNTSC0lZC4lZC1PcGVuU1NILWtleXNjYW5cclxuIiwKKwkgICAgYy0+Y19rZXl0eXBlID09IEtUX1JTQTE/IFBST1RPQ09MX01BSk9SXzEgOiBQUk9UT0NPTF9NQUpPUl8yLAorCSAgICBjLT5jX2tleXR5cGUgPT0gS1RfUlNBMT8gUFJPVE9DT0xfTUlOT1JfMSA6IFBST1RPQ09MX01JTk9SXzIpOworCWlmIChuIDwgMCB8fCAoc2l6ZV90KW4gPj0gc2l6ZW9mKGJ1ZikpIHsKKwkJZXJyb3IoInNucHJpbnRmOiBidWZmZXIgdG9vIHNtYWxsIik7CisJCWNvbmZyZWUocyk7CisJCXJldHVybjsKKwl9CisJaWYgKGF0b21pY2lvKHZ3cml0ZSwgcywgYnVmLCBuKSAhPSAoc2l6ZV90KW4pIHsKKwkJZXJyb3IoIndyaXRlICglcyk6ICVzIiwgYy0+Y19uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQljb25mcmVlKHMpOworCQlyZXR1cm47CisJfQorCWlmIChjLT5jX2tleXR5cGUgIT0gS1RfUlNBMSkgeworCQlrZXlwcmludChjLCBrZXlncmFiX3NzaDIoYykpOworCQljb25mcmVlKHMpOworCQlyZXR1cm47CisJfQorCWMtPmNfc3RhdHVzID0gQ1NfU0laRTsKKwljb250b3VjaChzKTsKK30KKworc3RhdGljIHZvaWQKK2NvbnJlYWQoaW50IHMpCit7CisJY29uICpjID0gJmZkY29uW3NdOworCXNpemVfdCBuOworCisJaWYgKGMtPmNfc3RhdHVzID09IENTX0NPTikgeworCQljb25ncmVldChzKTsKKwkJcmV0dXJuOworCX0KKwluID0gYXRvbWljaW8ocmVhZCwgcywgYy0+Y19kYXRhICsgYy0+Y19vZmYsIGMtPmNfbGVuIC0gYy0+Y19vZmYpOworCWlmIChuID09IDApIHsKKwkJZXJyb3IoInJlYWQgKCVzKTogJXMiLCBjLT5jX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCWNvbmZyZWUocyk7CisJCXJldHVybjsKKwl9CisJYy0+Y19vZmYgKz0gbjsKKworCWlmIChjLT5jX29mZiA9PSBjLT5jX2xlbikKKwkJc3dpdGNoIChjLT5jX3N0YXR1cykgeworCQljYXNlIENTX1NJWkU6CisJCQljLT5jX3BsZW4gPSBodG9ubChjLT5jX3BsZW4pOworCQkJYy0+Y19sZW4gPSBjLT5jX3BsZW4gKyA4IC0gKGMtPmNfcGxlbiAmIDcpOworCQkJYy0+Y19vZmYgPSAwOworCQkJYy0+Y19kYXRhID0geG1hbGxvYyhjLT5jX2xlbik7CisJCQljLT5jX3N0YXR1cyA9IENTX0tFWVM7CisJCQlicmVhazsKKwkJY2FzZSBDU19LRVlTOgorCQkJa2V5cHJpbnQoYywga2V5Z3JhYl9zc2gxKGMpKTsKKwkJCWNvbmZyZWUocyk7CisJCQlyZXR1cm47CisJCWRlZmF1bHQ6CisJCQlmYXRhbCgiY29ucmVhZDogaW52YWxpZCBzdGF0dXMgJWQiLCBjLT5jX3N0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCisJY29udG91Y2gocyk7Cit9CisKK3N0YXRpYyB2b2lkCitjb25sb29wKHZvaWQpCit7CisJc3RydWN0IHRpbWV2YWwgc2VsdGltZSwgbm93OworCWZkX3NldCAqciwgKmU7CisJY29uICpjOworCWludCBpOworCisJZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOworCWMgPSBUQUlMUV9GSVJTVCgmdHEpOworCisJaWYgKGMgJiYgKGMtPmNfdHYudHZfc2VjID4gbm93LnR2X3NlYyB8fAorCSAgICAoYy0+Y190di50dl9zZWMgPT0gbm93LnR2X3NlYyAmJiBjLT5jX3R2LnR2X3VzZWMgPiBub3cudHZfdXNlYykpKSB7CisJCXNlbHRpbWUgPSBjLT5jX3R2OworCQlzZWx0aW1lLnR2X3NlYyAtPSBub3cudHZfc2VjOworCQlzZWx0aW1lLnR2X3VzZWMgLT0gbm93LnR2X3VzZWM7CisJCWlmIChzZWx0aW1lLnR2X3VzZWMgPCAwKSB7CisJCQlzZWx0aW1lLnR2X3VzZWMgKz0gMTAwMDAwMDsKKwkJCXNlbHRpbWUudHZfc2VjLS07CisJCX0KKwl9IGVsc2UKKwkJdGltZXJjbGVhcigmc2VsdGltZSk7CisKKwlyID0geGNhbGxvYyhyZWFkX3dhaXRfbmZkc2V0LCBzaXplb2YoZmRfbWFzaykpOworCWUgPSB4Y2FsbG9jKHJlYWRfd2FpdF9uZmRzZXQsIHNpemVvZihmZF9tYXNrKSk7CisJbWVtY3B5KHIsIHJlYWRfd2FpdCwgcmVhZF93YWl0X25mZHNldCAqIHNpemVvZihmZF9tYXNrKSk7CisJbWVtY3B5KGUsIHJlYWRfd2FpdCwgcmVhZF93YWl0X25mZHNldCAqIHNpemVvZihmZF9tYXNrKSk7CisKKwl3aGlsZSAoc2VsZWN0KG1heGZkLCByLCBOVUxMLCBlLCAmc2VsdGltZSkgPT0gLTEgJiYKKwkgICAgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykpCisJCTsKKworCWZvciAoaSA9IDA7IGkgPCBtYXhmZDsgaSsrKSB7CisJCWlmIChGRF9JU1NFVChpLCBlKSkgeworCQkJZXJyb3IoIiVzOiBleGNlcHRpb24hIiwgZmRjb25baV0uY19uYW1lKTsKKwkJCWNvbmZyZWUoaSk7CisJCX0gZWxzZSBpZiAoRkRfSVNTRVQoaSwgcikpCisJCQljb25yZWFkKGkpOworCX0KKwl4ZnJlZShyKTsKKwl4ZnJlZShlKTsKKworCWMgPSBUQUlMUV9GSVJTVCgmdHEpOworCXdoaWxlIChjICYmIChjLT5jX3R2LnR2X3NlYyA8IG5vdy50dl9zZWMgfHwKKwkgICAgKGMtPmNfdHYudHZfc2VjID09IG5vdy50dl9zZWMgJiYgYy0+Y190di50dl91c2VjIDwgbm93LnR2X3VzZWMpKSkgeworCQlpbnQgcyA9IGMtPmNfZmQ7CisKKwkJYyA9IFRBSUxRX05FWFQoYywgY19saW5rKTsKKwkJY29ucmVjeWNsZShzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitkb19ob3N0KGNoYXIgKmhvc3QpCit7CisJY2hhciAqbmFtZSA9IHN0cm5uc2VwKCZob3N0LCAiIFx0XG4iKTsKKwlpbnQgajsKKworCWlmIChuYW1lID09IE5VTEwpCisJCXJldHVybjsKKwlmb3IgKGogPSBLVF9SU0ExOyBqIDw9IEtUX0VDRFNBOyBqICo9IDIpIHsKKwkJaWYgKGdldF9rZXl0eXBlcyAmIGopIHsKKwkJCXdoaWxlIChuY29uID49IE1BWENPTikKKwkJCQljb25sb29wKCk7CisJCQljb25hbGxvYyhuYW1lLCAqaG9zdCA/IGhvc3QgOiBuYW1lLCBqKTsKKwkJfQorCX0KK30KKwordm9pZAorZmF0YWwoY29uc3QgY2hhciAqZm10LC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWRvX2xvZyhTWVNMT0dfTEVWRUxfRkFUQUwsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCWlmIChub25mYXRhbF9mYXRhbCkKKwkJbG9uZ2ptcChrZXhqbXAsIC0xKTsKKwllbHNlCisJCWV4aXQoMjU1KTsKK30KKworc3RhdGljIHZvaWQKK3VzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsCisJICAgICJ1c2FnZTogJXMgWy00Nkh2XSBbLWYgZmlsZV0gWy1wIHBvcnRdIFstVCB0aW1lb3V0XSBbLXQgdHlwZV1cbiIKKwkgICAgIlx0XHQgICBbaG9zdCB8IGFkZHJsaXN0IG5hbWVsaXN0XSAuLi5cbiIsCisJICAgIF9fcHJvZ25hbWUpOworCWV4aXQoMSk7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGRlYnVnX2ZsYWcgPSAwLCBsb2dfbGV2ZWwgPSBTWVNMT0dfTEVWRUxfSU5GTzsKKwlpbnQgb3B0LCBmb3B0X2NvdW50ID0gMCwgajsKKwljaGFyICp0bmFtZSwgKmNwLCBsaW5lW05JX01BWEhPU1RdOworCUZJTEUgKmZwOworCXVfbG9uZyBsaW5lbnVtOworCisJZXh0ZXJuIGludCBvcHRpbmQ7CisJZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKworCV9fcHJvZ25hbWUgPSBzc2hfZ2V0X3Byb2duYW1lKGFyZ3ZbMF0pOworCXNlZWRfcm5nKCk7CisJVEFJTFFfSU5JVCgmdHEpOworCisJLyogRW5zdXJlIHRoYXQgZmRzIDAsIDEgYW5kIDIgYXJlIG9wZW4gb3IgZGlyZWN0ZWQgdG8gL2Rldi9udWxsICovCisJc2FuaXRpc2Vfc3RkZmQoKTsKKworCWlmIChhcmdjIDw9IDEpCisJCXVzYWdlKCk7CisKKwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiSHY0NnA6VDp0OmY6IikpICE9IC0xKSB7CisJCXN3aXRjaCAob3B0KSB7CisJCWNhc2UgJ0gnOgorCQkJaGFzaF9ob3N0cyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlzc2hfcG9ydCA9IGEycG9ydChvcHRhcmcpOworCQkJaWYgKHNzaF9wb3J0IDw9IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkJhZCBwb3J0ICclcydcbiIsIG9wdGFyZyk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdUJzoKKwkJCXRpbWVvdXQgPSBjb252dGltZShvcHRhcmcpOworCQkJaWYgKHRpbWVvdXQgPT0gLTEgfHwgdGltZW91dCA9PSAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJCYWQgdGltZW91dCAnJXMnXG4iLCBvcHRhcmcpOworCQkJCXVzYWdlKCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQlpZiAoIWRlYnVnX2ZsYWcpIHsKKwkJCQlkZWJ1Z19mbGFnID0gMTsKKwkJCQlsb2dfbGV2ZWwgPSBTWVNMT0dfTEVWRUxfREVCVUcxOworCQkJfQorCQkJZWxzZSBpZiAobG9nX2xldmVsIDwgU1lTTE9HX0xFVkVMX0RFQlVHMykKKwkJCQlsb2dfbGV2ZWwrKzsKKwkJCWVsc2UKKwkJCQlmYXRhbCgiVG9vIGhpZ2ggZGVidWdnaW5nIGxldmVsLiIpOworCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJaWYgKHN0cmNtcChvcHRhcmcsICItIikgPT0gMCkKKwkJCQlvcHRhcmcgPSBOVUxMOworCQkJYXJndltmb3B0X2NvdW50KytdID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJZ2V0X2tleXR5cGVzID0gMDsKKwkJCXRuYW1lID0gc3RydG9rKG9wdGFyZywgIiwiKTsKKwkJCXdoaWxlICh0bmFtZSkgeworCQkJCWludCB0eXBlID0ga2V5X3R5cGVfZnJvbV9uYW1lKHRuYW1lKTsKKwkJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCQljYXNlIEtFWV9SU0ExOgorCQkJCQlnZXRfa2V5dHlwZXMgfD0gS1RfUlNBMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBLRVlfRFNBOgorCQkJCQlnZXRfa2V5dHlwZXMgfD0gS1RfRFNBOworCQkJCQlicmVhazsKKwkJCQljYXNlIEtFWV9FQ0RTQToKKwkJCQkJZ2V0X2tleXR5cGVzIHw9IEtUX0VDRFNBOworCQkJCQlicmVhazsKKwkJCQljYXNlIEtFWV9SU0E6CisJCQkJCWdldF9rZXl0eXBlcyB8PSBLVF9SU0E7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgS0VZX1VOU1BFQzoKKwkJCQkJZmF0YWwoInVua25vd24ga2V5IHR5cGUgJXMiLCB0bmFtZSk7CisJCQkJfQorCQkJCXRuYW1lID0gc3RydG9rKE5VTEwsICIsIik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnNCc6CisJCQlJUHY0b3I2ID0gQUZfSU5FVDsKKwkJCWJyZWFrOworCQljYXNlICc2JzoKKwkJCUlQdjRvcjYgPSBBRl9JTkVUNjsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKCk7CisJCX0KKwl9CisJaWYgKG9wdGluZCA9PSBhcmdjICYmICFmb3B0X2NvdW50KQorCQl1c2FnZSgpOworCisJbG9nX2luaXQoInNzaC1rZXlzY2FuIiwgbG9nX2xldmVsLCBTWVNMT0dfRkFDSUxJVFlfVVNFUiwgMSk7CisKKwltYXhmZCA9IGZkbGltX2dldCgxKTsKKwlpZiAobWF4ZmQgPCAwKQorCQlmYXRhbCgiJXM6IGZkbGltX2dldDogYmFkIHZhbHVlIiwgX19wcm9nbmFtZSk7CisJaWYgKG1heGZkID4gTUFYTUFYRkQpCisJCW1heGZkID0gTUFYTUFYRkQ7CisJaWYgKE1BWENPTiA8PSAwKQorCQlmYXRhbCgiJXM6IG5vdCBlbm91Z2ggZmlsZSBkZXNjcmlwdG9ycyIsIF9fcHJvZ25hbWUpOworCWlmIChtYXhmZCA+IGZkbGltX2dldCgwKSkKKwkJZmRsaW1fc2V0KG1heGZkKTsKKwlmZGNvbiA9IHhjYWxsb2MobWF4ZmQsIHNpemVvZihjb24pKTsKKworCXJlYWRfd2FpdF9uZmRzZXQgPSBob3dtYW55KG1heGZkLCBORkRCSVRTKTsKKwlyZWFkX3dhaXQgPSB4Y2FsbG9jKHJlYWRfd2FpdF9uZmRzZXQsIHNpemVvZihmZF9tYXNrKSk7CisKKwlmb3IgKGogPSAwOyBqIDwgZm9wdF9jb3VudDsgaisrKSB7CisJCWlmIChhcmd2W2pdID09IE5VTEwpCisJCQlmcCA9IHN0ZGluOworCQllbHNlIGlmICgoZnAgPSBmb3Blbihhcmd2W2pdLCAiciIpKSA9PSBOVUxMKQorCQkJZmF0YWwoIiVzOiAlczogJXMiLCBfX3Byb2duYW1lLCBhcmd2W2pdLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCWxpbmVudW0gPSAwOworCisJCXdoaWxlIChyZWFkX2tleWZpbGVfbGluZShmcCwKKwkJICAgIGFyZ3Zbal0gPT0gTlVMTCA/ICIoc3RkaW4pIiA6IGFyZ3Zbal0sIGxpbmUsIHNpemVvZihsaW5lKSwKKwkJICAgICZsaW5lbnVtKSAhPSAtMSkgeworCQkJLyogQ2hvbXAgb2ZmIHRyYWlsaW5nIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzICovCisJCQlpZiAoKGNwID0gc3RyY2hyKGxpbmUsICcjJykpID09IE5VTEwpCisJCQkJY3AgPSBsaW5lICsgc3RybGVuKGxpbmUpIC0gMTsKKwkJCXdoaWxlIChjcCA+PSBsaW5lKSB7CisJCQkJaWYgKCpjcCA9PSAnICcgfHwgKmNwID09ICdcdCcgfHwKKwkJCQkgICAgKmNwID09ICdcbicgfHwgKmNwID09ICcjJykKKwkJCQkJKmNwLS0gPSAnXDAnOworCQkJCWVsc2UKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIFNraXAgZW1wdHkgbGluZXMgKi8KKwkJCWlmICgqbGluZSA9PSAnXDAnKQorCQkJCWNvbnRpbnVlOworCisJCQlkb19ob3N0KGxpbmUpOworCQl9CisKKwkJaWYgKGZlcnJvcihmcCkpCisJCQlmYXRhbCgiJXM6ICVzOiAlcyIsIF9fcHJvZ25hbWUsIGFyZ3Zbal0sCisJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKworCQlmY2xvc2UoZnApOworCX0KKworCXdoaWxlIChvcHRpbmQgPCBhcmdjKQorCQlkb19ob3N0KGFyZ3Zbb3B0aW5kKytdKTsKKworCXdoaWxlIChuY29uID4gMCkKKwkJY29ubG9vcCgpOworCisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc3NoLWtleXNpZ24uMCBiL29wZW5zc2gtNi4wcDEvc3NoLWtleXNpZ24uMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjUyMDg0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zc2gta2V5c2lnbi4wCkBAIC0wLDAgKzEsNTEgQEAKK1NTSC1LRVlTSUdOKDgpICAgICAgICAgIE9wZW5CU0QgU3lzdGVtIE1hbmFnZXIncyBNYW51YWwgICAgICAgICBTU0gtS0VZU0lHTig4KQorCitOQU1FCisgICAgIHNzaC1rZXlzaWduIC0gc3NoIGhlbHBlciBwcm9ncmFtIGZvciBob3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uCisKK1NZTk9QU0lTCisgICAgIHNzaC1rZXlzaWduCisKK0RFU0NSSVBUSU9OCisgICAgIHNzaC1rZXlzaWduIGlzIHVzZWQgYnkgc3NoKDEpIHRvIGFjY2VzcyB0aGUgbG9jYWwgaG9zdCBrZXlzIGFuZCBnZW5lcmF0ZQorICAgICB0aGUgZGlnaXRhbCBzaWduYXR1cmUgcmVxdWlyZWQgZHVyaW5nIGhvc3QtYmFzZWQgYXV0aGVudGljYXRpb24gd2l0aCBTU0gKKyAgICAgcHJvdG9jb2wgdmVyc2lvbiAyLgorCisgICAgIHNzaC1rZXlzaWduIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYW5kIGNhbiBvbmx5IGJlIGVuYWJsZWQgaW4gdGhlIGdsb2JhbAorICAgICBjbGllbnQgY29uZmlndXJhdGlvbiBmaWxlIC9ldGMvc3NoL3NzaF9jb25maWcgYnkgc2V0dGluZyBFbmFibGVTU0hLZXlzaWduCisgICAgIHRvIGBgeWVzJycuCisKKyAgICAgc3NoLWtleXNpZ24gaXMgbm90IGludGVuZGVkIHRvIGJlIGludm9rZWQgYnkgdGhlIHVzZXIsIGJ1dCBmcm9tIHNzaCgxKS4KKyAgICAgU2VlIHNzaCgxKSBhbmQgc3NoZCg4KSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3N0LWJhc2VkCisgICAgIGF1dGhlbnRpY2F0aW9uLgorCitGSUxFUworICAgICAvZXRjL3NzaC9zc2hfY29uZmlnCisgICAgICAgICAgICAgQ29udHJvbHMgd2hldGhlciBzc2gta2V5c2lnbiBpcyBlbmFibGVkLgorCisgICAgIC9ldGMvc3NoL3NzaF9ob3N0X2RzYV9rZXkKKyAgICAgL2V0Yy9zc2gvc3NoX2hvc3RfZWNkc2Ffa2V5CisgICAgIC9ldGMvc3NoL3NzaF9ob3N0X3JzYV9rZXkKKyAgICAgICAgICAgICBUaGVzZSBmaWxlcyBjb250YWluIHRoZSBwcml2YXRlIHBhcnRzIG9mIHRoZSBob3N0IGtleXMgdXNlZCB0bworICAgICAgICAgICAgIGdlbmVyYXRlIHRoZSBkaWdpdGFsIHNpZ25hdHVyZS4gIFRoZXkgc2hvdWxkIGJlIG93bmVkIGJ5IHJvb3QsCisgICAgICAgICAgICAgcmVhZGFibGUgb25seSBieSByb290LCBhbmQgbm90IGFjY2Vzc2libGUgdG8gb3RoZXJzLiAgU2luY2UgdGhleQorICAgICAgICAgICAgIGFyZSByZWFkYWJsZSBvbmx5IGJ5IHJvb3QsIHNzaC1rZXlzaWduIG11c3QgYmUgc2V0LXVpZCByb290IGlmCisgICAgICAgICAgICAgaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbiBpcyB1c2VkLgorCisgICAgIC9ldGMvc3NoL3NzaF9ob3N0X2RzYV9rZXktY2VydC5wdWIKKyAgICAgL2V0Yy9zc2gvc3NoX2hvc3RfZWNkc2Ffa2V5LWNlcnQucHViCisgICAgIC9ldGMvc3NoL3NzaF9ob3N0X3JzYV9rZXktY2VydC5wdWIKKyAgICAgICAgICAgICBJZiB0aGVzZSBmaWxlcyBleGlzdCB0aGV5IGFyZSBhc3N1bWVkIHRvIGNvbnRhaW4gcHVibGljCisgICAgICAgICAgICAgY2VydGlmaWNhdGUgaW5mb3JtYXRpb24gY29ycmVzcG9uZGluZyB3aXRoIHRoZSBwcml2YXRlIGtleXMKKyAgICAgICAgICAgICBhYm92ZS4KKworU0VFIEFMU08KKyAgICAgc3NoKDEpLCBzc2gta2V5Z2VuKDEpLCBzc2hfY29uZmlnKDUpLCBzc2hkKDgpCisKK0hJU1RPUlkKKyAgICAgc3NoLWtleXNpZ24gZmlyc3QgYXBwZWFyZWQgaW4gT3BlbkJTRCAzLjIuCisKK0FVVEhPUlMKKyAgICAgTWFya3VzIEZyaWVkbCA8bWFya3VzQG9wZW5ic2Qub3JnPgorCitPcGVuQlNEIDUuMCAgICAgICAgICAgICAgICAgICAgIEF1Z3VzdCAzMSwgMjAxMCAgICAgICAgICAgICAgICAgICAgT3BlbkJTRCA1LjAKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc3NoLWtleXNpZ24uOCBiL29wZW5zc2gtNi4wcDEvc3NoLWtleXNpZ24uOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTA5ZTAyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zc2gta2V5c2lnbi44CkBAIC0wLDAgKzEsOTEgQEAKKy5cIiAkT3BlbkJTRDogc3NoLWtleXNpZ24uOCx2IDEuMTIgMjAxMC8wOC8zMSAxMTo1NDo0NSBkam0gRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMjAwMiBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisuXCIgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLlwiIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisuXCIgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLlwiIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLlwiIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy5cIiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy5cIiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisuXCIgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisuXCIgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy5cIgorLkRkICRNZG9jZGF0ZTogQXVndXN0IDMxIDIwMTAgJAorLkR0IFNTSC1LRVlTSUdOIDgKKy5PcworLlNoIE5BTUUKKy5ObSBzc2gta2V5c2lnbgorLk5kIHNzaCBoZWxwZXIgcHJvZ3JhbSBmb3IgaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbgorLlNoIFNZTk9QU0lTCisuTm0KKy5TaCBERVNDUklQVElPTgorLk5tCitpcyB1c2VkIGJ5CisuWHIgc3NoIDEKK3RvIGFjY2VzcyB0aGUgbG9jYWwgaG9zdCBrZXlzIGFuZCBnZW5lcmF0ZSB0aGUgZGlnaXRhbCBzaWduYXR1cmUKK3JlcXVpcmVkIGR1cmluZyBob3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uIHdpdGggU1NIIHByb3RvY29sIHZlcnNpb24gMi4KKy5QcAorLk5tCitpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGFuZCBjYW4gb25seSBiZSBlbmFibGVkIGluIHRoZQorZ2xvYmFsIGNsaWVudCBjb25maWd1cmF0aW9uIGZpbGUKKy5QYSAvZXRjL3NzaC9zc2hfY29uZmlnCitieSBzZXR0aW5nCisuQ20gRW5hYmxlU1NIS2V5c2lnbgordG8KKy5EcSB5ZXMgLgorLlBwCisuTm0KK2lzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnZva2VkIGJ5IHRoZSB1c2VyLCBidXQgZnJvbQorLlhyIHNzaCAxIC4KK1NlZQorLlhyIHNzaCAxCithbmQKKy5YciBzc2hkIDgKK2ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGhvc3QtYmFzZWQgYXV0aGVudGljYXRpb24uCisuU2ggRklMRVMKKy5CbCAtdGFnIC13aWR0aCBEcyAtY29tcGFjdAorLkl0IFBhIC9ldGMvc3NoL3NzaF9jb25maWcKK0NvbnRyb2xzIHdoZXRoZXIKKy5ObQoraXMgZW5hYmxlZC4KKy5QcAorLkl0IFBhIC9ldGMvc3NoL3NzaF9ob3N0X2RzYV9rZXkKKy5JdCBQYSAvZXRjL3NzaC9zc2hfaG9zdF9lY2RzYV9rZXkKKy5JdCBQYSAvZXRjL3NzaC9zc2hfaG9zdF9yc2Ffa2V5CitUaGVzZSBmaWxlcyBjb250YWluIHRoZSBwcml2YXRlIHBhcnRzIG9mIHRoZSBob3N0IGtleXMgdXNlZCB0bworZ2VuZXJhdGUgdGhlIGRpZ2l0YWwgc2lnbmF0dXJlLgorVGhleSBzaG91bGQgYmUgb3duZWQgYnkgcm9vdCwgcmVhZGFibGUgb25seSBieSByb290LCBhbmQgbm90CithY2Nlc3NpYmxlIHRvIG90aGVycy4KK1NpbmNlIHRoZXkgYXJlIHJlYWRhYmxlIG9ubHkgYnkgcm9vdCwKKy5ObQorbXVzdCBiZSBzZXQtdWlkIHJvb3QgaWYgaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbiBpcyB1c2VkLgorLlBwCisuSXQgUGEgL2V0Yy9zc2gvc3NoX2hvc3RfZHNhX2tleS1jZXJ0LnB1YgorLkl0IFBhIC9ldGMvc3NoL3NzaF9ob3N0X2VjZHNhX2tleS1jZXJ0LnB1YgorLkl0IFBhIC9ldGMvc3NoL3NzaF9ob3N0X3JzYV9rZXktY2VydC5wdWIKK0lmIHRoZXNlIGZpbGVzIGV4aXN0IHRoZXkgYXJlIGFzc3VtZWQgdG8gY29udGFpbiBwdWJsaWMgY2VydGlmaWNhdGUKK2luZm9ybWF0aW9uIGNvcnJlc3BvbmRpbmcgd2l0aCB0aGUgcHJpdmF0ZSBrZXlzIGFib3ZlLgorLkVsCisuU2ggU0VFIEFMU08KKy5YciBzc2ggMSAsCisuWHIgc3NoLWtleWdlbiAxICwKKy5YciBzc2hfY29uZmlnIDUgLAorLlhyIHNzaGQgOAorLlNoIEhJU1RPUlkKKy5ObQorZmlyc3QgYXBwZWFyZWQgaW4KKy5PeCAzLjIgLgorLlNoIEFVVEhPUlMKKy5BbiBNYXJrdXMgRnJpZWRsIEFxIG1hcmt1c0BvcGVuYnNkLm9yZwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zc2gta2V5c2lnbi5jIGIvb3BlbnNzaC02LjBwMS9zc2gta2V5c2lnbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZWI3ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NzaC1rZXlzaWduLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qICRPcGVuQlNEOiBzc2gta2V5c2lnbi5jLHYgMS4zNiAyMDExLzAyLzE2IDAwOjMxOjE0IGRqbSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2lmZGVmIEhBVkVfUEFUSFNfSAorI2luY2x1ZGUgPHBhdGhzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKworI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJzc2guaCIKKyNpbmNsdWRlICJzc2gyLmgiCisjaW5jbHVkZSAibWlzYy5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImF1dGhmaWxlLmgiCisjaW5jbHVkZSAibXNnLmgiCisjaW5jbHVkZSAiY2Fub2hvc3QuaCIKKyNpbmNsdWRlICJwYXRobmFtZXMuaCIKKyNpbmNsdWRlICJyZWFkY29uZi5oIgorI2luY2x1ZGUgInVpZHN3YXAuaCIKKworLyogWFhYIHJlYWRjb25mLmMgbmVlZHMgdGhlc2UgKi8KK3VpZF90IG9yaWdpbmFsX3JlYWxfdWlkOworCitleHRlcm4gY2hhciAqX19wcm9nbmFtZTsKKworc3RhdGljIGludAordmFsaWRfcmVxdWVzdChzdHJ1Y3QgcGFzc3dkICpwdywgY2hhciAqaG9zdCwgS2V5ICoqcmV0LCB1X2NoYXIgKmRhdGEsCisgICAgdV9pbnQgZGF0YWxlbikKK3sKKwlCdWZmZXIgYjsKKwlLZXkgKmtleSA9IE5VTEw7CisJdV9jaGFyICpwa2Jsb2I7CisJdV9pbnQgYmxlbiwgbGVuOworCWNoYXIgKnBrYWxnLCAqcDsKKwlpbnQgcGt0eXBlLCBmYWlsOworCisJZmFpbCA9IDA7CisKKwlidWZmZXJfaW5pdCgmYik7CisJYnVmZmVyX2FwcGVuZCgmYiwgZGF0YSwgZGF0YWxlbik7CisKKwkvKiBzZXNzaW9uIGlkLCBjdXJyZW50bHkgbGltaXRlZCB0byBTSEExICgyMCBieXRlcykgb3IgU0hBMjU2ICgzMikgKi8KKwlwID0gYnVmZmVyX2dldF9zdHJpbmcoJmIsICZsZW4pOworCWlmIChsZW4gIT0gMjAgJiYgbGVuICE9IDMyKQorCQlmYWlsKys7CisJeGZyZWUocCk7CisKKwlpZiAoYnVmZmVyX2dldF9jaGFyKCZiKSAhPSBTU0gyX01TR19VU0VSQVVUSF9SRVFVRVNUKQorCQlmYWlsKys7CisKKwkvKiBzZXJ2ZXIgdXNlciAqLworCWJ1ZmZlcl9za2lwX3N0cmluZygmYik7CisKKwkvKiBzZXJ2aWNlICovCisJcCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZiLCBOVUxMKTsKKwlpZiAoc3RyY21wKCJzc2gtY29ubmVjdGlvbiIsIHApICE9IDApCisJCWZhaWwrKzsKKwl4ZnJlZShwKTsKKworCS8qIG1ldGhvZCAqLworCXAgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgTlVMTCk7CisJaWYgKHN0cmNtcCgiaG9zdGJhc2VkIiwgcCkgIT0gMCkKKwkJZmFpbCsrOworCXhmcmVlKHApOworCisJLyogcHVia2V5ICovCisJcGthbGcgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgTlVMTCk7CisJcGtibG9iID0gYnVmZmVyX2dldF9zdHJpbmcoJmIsICZibGVuKTsKKworCXBrdHlwZSA9IGtleV90eXBlX2Zyb21fbmFtZShwa2FsZyk7CisJaWYgKHBrdHlwZSA9PSBLRVlfVU5TUEVDKQorCQlmYWlsKys7CisJZWxzZSBpZiAoKGtleSA9IGtleV9mcm9tX2Jsb2IocGtibG9iLCBibGVuKSkgPT0gTlVMTCkKKwkJZmFpbCsrOworCWVsc2UgaWYgKGtleS0+dHlwZSAhPSBwa3R5cGUpCisJCWZhaWwrKzsKKwl4ZnJlZShwa2FsZyk7CisJeGZyZWUocGtibG9iKTsKKworCS8qIGNsaWVudCBob3N0IG5hbWUsIGhhbmRsZSB0cmFpbGluZyBkb3QgKi8KKwlwID0gYnVmZmVyX2dldF9zdHJpbmcoJmIsICZsZW4pOworCWRlYnVnMigidmFsaWRfcmVxdWVzdDogY2hlY2sgZXhwZWN0IGNob3N0ICVzIGdvdCAlcyIsIGhvc3QsIHApOworCWlmIChzdHJsZW4oaG9zdCkgIT0gbGVuIC0gMSkKKwkJZmFpbCsrOworCWVsc2UgaWYgKHBbbGVuIC0gMV0gIT0gJy4nKQorCQlmYWlsKys7CisJZWxzZSBpZiAoc3RybmNhc2VjbXAoaG9zdCwgcCwgbGVuIC0gMSkgIT0gMCkKKwkJZmFpbCsrOworCXhmcmVlKHApOworCisJLyogbG9jYWwgdXNlciAqLworCXAgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgTlVMTCk7CisKKwlpZiAoc3RyY21wKHB3LT5wd19uYW1lLCBwKSAhPSAwKQorCQlmYWlsKys7CisJeGZyZWUocCk7CisKKwkvKiBlbmQgb2YgbWVzc2FnZSAqLworCWlmIChidWZmZXJfbGVuKCZiKSAhPSAwKQorCQlmYWlsKys7CisJYnVmZmVyX2ZyZWUoJmIpOworCisJZGVidWczKCJ2YWxpZF9yZXF1ZXN0OiBmYWlsICVkIiwgZmFpbCk7CisKKwlpZiAoZmFpbCAmJiBrZXkgIT0gTlVMTCkKKwkJa2V5X2ZyZWUoa2V5KTsKKwllbHNlCisJCSpyZXQgPSBrZXk7CisKKwlyZXR1cm4gKGZhaWwgPyAtMSA6IDApOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCUJ1ZmZlciBiOworCU9wdGlvbnMgb3B0aW9uczsKKyNkZWZpbmUgTlVNX0tFWVRZUEVTIDMKKwlLZXkgKmtleXNbTlVNX0tFWVRZUEVTXSwgKmtleSA9IE5VTEw7CisJc3RydWN0IHBhc3N3ZCAqcHc7CisJaW50IGtleV9mZFtOVU1fS0VZVFlQRVNdLCBpLCBmb3VuZCwgdmVyc2lvbiA9IDIsIGZkOworCXVfY2hhciAqc2lnbmF0dXJlLCAqZGF0YTsKKwljaGFyICpob3N0OworCXVfaW50IHNsZW4sIGRsZW47CisJdV9pbnQzMl90IHJuZFsyNTZdOworCisJLyogRW5zdXJlIHRoYXQgc3RkaW4gYW5kIHN0ZG91dCBhcmUgY29ubmVjdGVkICovCisJaWYgKChmZCA9IG9wZW4oX1BBVEhfREVWTlVMTCwgT19SRFdSKSkgPCAyKQorCQlleGl0KDEpOworCS8qIExlYXZlIC9kZXYvbnVsbCBmZCBpZmYgaXQgaXMgYXR0YWNoZWQgdG8gc3RkZXJyICovCisJaWYgKGZkID4gMikKKwkJY2xvc2UoZmQpOworCisJaSA9IDA7CisJa2V5X2ZkW2krK10gPSBvcGVuKF9QQVRIX0hPU1RfRFNBX0tFWV9GSUxFLCBPX1JET05MWSk7CisJa2V5X2ZkW2krK10gPSBvcGVuKF9QQVRIX0hPU1RfRUNEU0FfS0VZX0ZJTEUsIE9fUkRPTkxZKTsKKwlrZXlfZmRbaSsrXSA9IG9wZW4oX1BBVEhfSE9TVF9SU0FfS0VZX0ZJTEUsIE9fUkRPTkxZKTsKKworCW9yaWdpbmFsX3JlYWxfdWlkID0gZ2V0dWlkKCk7CS8qIFhYWCByZWFkY29uZi5jIG5lZWRzIHRoaXMgKi8KKwlpZiAoKHB3ID0gZ2V0cHd1aWQob3JpZ2luYWxfcmVhbF91aWQpKSA9PSBOVUxMKQorCQlmYXRhbCgiZ2V0cHd1aWQgZmFpbGVkIik7CisJcHcgPSBwd2NvcHkocHcpOworCisJcGVybWFuZW50bHlfc2V0X3VpZChwdyk7CisKKwlzZWVkX3JuZygpOworCWFyYzRyYW5kb21fc3RpcigpOworCisjaWZkZWYgREVCVUdfU1NIX0tFWVNJR04KKwlsb2dfaW5pdCgic3NoLWtleXNpZ24iLCBTWVNMT0dfTEVWRUxfREVCVUczLCBTWVNMT0dfRkFDSUxJVFlfQVVUSCwgMCk7CisjZW5kaWYKKworCS8qIHZlcmlmeSB0aGF0IHNzaC1rZXlzaWduIGlzIGVuYWJsZWQgYnkgdGhlIGFkbWluICovCisJaW5pdGlhbGl6ZV9vcHRpb25zKCZvcHRpb25zKTsKKwkodm9pZClyZWFkX2NvbmZpZ19maWxlKF9QQVRIX0hPU1RfQ09ORklHX0ZJTEUsICIiLCAmb3B0aW9ucywgMCk7CisJZmlsbF9kZWZhdWx0X29wdGlvbnMoJm9wdGlvbnMpOworCWlmIChvcHRpb25zLmVuYWJsZV9zc2hfa2V5c2lnbiAhPSAxKQorCQlmYXRhbCgic3NoLWtleXNpZ24gbm90IGVuYWJsZWQgaW4gJXMiLAorCQkgICAgX1BBVEhfSE9TVF9DT05GSUdfRklMRSk7CisKKwlmb3IgKGkgPSBmb3VuZCA9IDA7IGkgPCBOVU1fS0VZVFlQRVM7IGkrKykgeworCQlpZiAoa2V5X2ZkW2ldICE9IC0xKQorCQkJZm91bmQgPSAxOworCX0KKwlpZiAoZm91bmQgPT0gMCkKKwkJZmF0YWwoImNvdWxkIG5vdCBvcGVuIGFueSBob3N0IGtleSIpOworCisJT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCXJuZFtpXSA9IGFyYzRyYW5kb20oKTsKKwlSQU5EX3NlZWQocm5kLCBzaXplb2Yocm5kKSk7CisKKwlmb3VuZCA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5VTV9LRVlUWVBFUzsgaSsrKSB7CisJCWtleXNbaV0gPSBOVUxMOworCQlpZiAoa2V5X2ZkW2ldID09IC0xKQorCQkJY29udGludWU7CisJCWtleXNbaV0gPSBrZXlfbG9hZF9wcml2YXRlX3BlbShrZXlfZmRbaV0sIEtFWV9VTlNQRUMsCisJCSAgICBOVUxMLCBOVUxMKTsKKwkJY2xvc2Uoa2V5X2ZkW2ldKTsKKwkJaWYgKGtleXNbaV0gIT0gTlVMTCkKKwkJCWZvdW5kID0gMTsKKwl9CisJaWYgKCFmb3VuZCkKKwkJZmF0YWwoIm5vIGhvc3RrZXkgZm91bmQiKTsKKworCWJ1ZmZlcl9pbml0KCZiKTsKKwlpZiAoc3NoX21zZ19yZWN2KFNURElOX0ZJTEVOTywgJmIpIDwgMCkKKwkJZmF0YWwoInNzaF9tc2dfcmVjdiBmYWlsZWQiKTsKKwlpZiAoYnVmZmVyX2dldF9jaGFyKCZiKSAhPSB2ZXJzaW9uKQorCQlmYXRhbCgiYmFkIHZlcnNpb24iKTsKKwlmZCA9IGJ1ZmZlcl9nZXRfaW50KCZiKTsKKwlpZiAoKGZkID09IFNURElOX0ZJTEVOTykgfHwgKGZkID09IFNURE9VVF9GSUxFTk8pKQorCQlmYXRhbCgiYmFkIGZkIik7CisJaWYgKChob3N0ID0gZ2V0X2xvY2FsX25hbWUoZmQpKSA9PSBOVUxMKQorCQlmYXRhbCgiY2Fubm90IGdldCBsb2NhbCBuYW1lIGZvciBmZCIpOworCisJZGF0YSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZiLCAmZGxlbik7CisJaWYgKHZhbGlkX3JlcXVlc3QocHcsIGhvc3QsICZrZXksIGRhdGEsIGRsZW4pIDwgMCkKKwkJZmF0YWwoIm5vdCBhIHZhbGlkIHJlcXVlc3QiKTsKKwl4ZnJlZShob3N0KTsKKworCWZvdW5kID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0tFWVRZUEVTOyBpKyspIHsKKwkJaWYgKGtleXNbaV0gIT0gTlVMTCAmJgorCQkgICAga2V5X2VxdWFsX3B1YmxpYyhrZXksIGtleXNbaV0pKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIWZvdW5kKQorCQlmYXRhbCgibm8gbWF0Y2hpbmcgaG9zdGtleSBmb3VuZCIpOworCisJaWYgKGtleV9zaWduKGtleXNbaV0sICZzaWduYXR1cmUsICZzbGVuLCBkYXRhLCBkbGVuKSAhPSAwKQorCQlmYXRhbCgia2V5X3NpZ24gZmFpbGVkIik7CisJeGZyZWUoZGF0YSk7CisKKwkvKiBzZW5kIHJlcGx5ICovCisJYnVmZmVyX2NsZWFyKCZiKTsKKwlidWZmZXJfcHV0X3N0cmluZygmYiwgc2lnbmF0dXJlLCBzbGVuKTsKKwlpZiAoc3NoX21zZ19zZW5kKFNURE9VVF9GSUxFTk8sIHZlcnNpb24sICZiKSA9PSAtMSkKKwkJZmF0YWwoInNzaF9tc2dfc2VuZCBmYWlsZWQiKTsKKworCXJldHVybiAoMCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NzaC1wa2NzMTEtY2xpZW50LmMgYi9vcGVuc3NoLTYuMHAxL3NzaC1wa2NzMTEtY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiMTFkYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc3NoLXBrY3MxMS1jbGllbnQuYwpAQCAtMCwwICsxLDI0MCBAQAorLyogJE9wZW5CU0Q6IHNzaC1wa2NzMTEtY2xpZW50LmMsdiAxLjMgMjAxMi8wMS8xNiAyMDozNDowOSBtaW9kIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaWZkZWYgRU5BQkxFX1BLQ1MxMQorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9TWVNfVElNRV9ICisjIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAicGF0aG5hbWVzLmgiCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJhdXRoZmQuaCIKKyNpbmNsdWRlICJhdG9taWNpby5oIgorI2luY2x1ZGUgInNzaC1wa2NzMTEuaCIKKworLyogYm9ycm93cyBjb2RlIGZyb20gc2Z0cC1zZXJ2ZXIgYW5kIHNzaC1hZ2VudCAqLworCitpbnQgZmQgPSAtMTsKK3BpZF90IHBpZCA9IC0xOworCitzdGF0aWMgdm9pZAorc2VuZF9tc2coQnVmZmVyICptKQoreworCXVfY2hhciBidWZbNF07CisJaW50IG1sZW4gPSBidWZmZXJfbGVuKG0pOworCisJcHV0X3UzMihidWYsIG1sZW4pOworCWlmIChhdG9taWNpbyh2d3JpdGUsIGZkLCBidWYsIDQpICE9IDQgfHwKKwkgICAgYXRvbWljaW8odndyaXRlLCBmZCwgYnVmZmVyX3B0cihtKSwKKwkgICAgYnVmZmVyX2xlbihtKSkgIT0gYnVmZmVyX2xlbihtKSkKKwkJZXJyb3IoIndyaXRlIHRvIGhlbHBlciBmYWlsZWQiKTsKKwlidWZmZXJfY29uc3VtZShtLCBtbGVuKTsKK30KKworc3RhdGljIGludAorcmVjdl9tc2coQnVmZmVyICptKQoreworCXVfaW50IGwsIGxlbjsKKwl1X2NoYXIgYnVmWzEwMjRdOworCisJaWYgKChsZW4gPSBhdG9taWNpbyhyZWFkLCBmZCwgYnVmLCA0KSkgIT0gNCkgeworCQllcnJvcigicmVhZCBmcm9tIGhlbHBlciBmYWlsZWQ6ICV1IiwgbGVuKTsKKwkJcmV0dXJuICgwKTsgLyogWFhYICovCisJfQorCWxlbiA9IGdldF91MzIoYnVmKTsKKwlpZiAobGVuID4gMjU2ICogMTAyNCkKKwkJZmF0YWwoInJlc3BvbnNlIHRvbyBsb25nOiAldSIsIGxlbik7CisJLyogcmVhZCBsZW4gYnl0ZXMgaW50byBtICovCisJYnVmZmVyX2NsZWFyKG0pOworCXdoaWxlIChsZW4gPiAwKSB7CisJCWwgPSBsZW47CisJCWlmIChsID4gc2l6ZW9mKGJ1ZikpCisJCQlsID0gc2l6ZW9mKGJ1Zik7CisJCWlmIChhdG9taWNpbyhyZWFkLCBmZCwgYnVmLCBsKSAhPSBsKSB7CisJCQllcnJvcigicmVzcG9uc2UgZnJvbSBoZWxwZXIgZmFpbGVkLiIpOworCQkJcmV0dXJuICgwKTsgLyogWFhYICovCisJCX0KKwkJYnVmZmVyX2FwcGVuZChtLCBidWYsIGwpOworCQlsZW4gLT0gbDsKKwl9CisJcmV0dXJuIChidWZmZXJfZ2V0X2NoYXIobSkpOworfQorCitpbnQKK3BrY3MxMV9pbml0KGludCBpbnRlcmFjdGl2ZSkKK3sKKwlyZXR1cm4gKDApOworfQorCit2b2lkCitwa2NzMTFfdGVybWluYXRlKHZvaWQpCit7CisJY2xvc2UoZmQpOworfQorCitzdGF0aWMgaW50Citwa2NzMTFfcnNhX3ByaXZhdGVfZW5jcnlwdChpbnQgZmxlbiwgY29uc3QgdV9jaGFyICpmcm9tLCB1X2NoYXIgKnRvLCBSU0EgKnJzYSwKKyAgICBpbnQgcGFkZGluZykKK3sKKwlLZXkga2V5OworCXVfY2hhciAqYmxvYiwgKnNpZ25hdHVyZSA9IE5VTEw7CisJdV9pbnQgYmxlbiwgc2xlbiA9IDA7CisJaW50IHJldCA9IC0xOworCUJ1ZmZlciBtc2c7CisKKwlpZiAocGFkZGluZyAhPSBSU0FfUEtDUzFfUEFERElORykKKwkJcmV0dXJuICgtMSk7CisJa2V5LnR5cGUgPSBLRVlfUlNBOworCWtleS5yc2EgPSByc2E7CisJaWYgKGtleV90b19ibG9iKCZrZXksICZibG9iLCAmYmxlbikgPT0gMCkKKwkJcmV0dXJuIC0xOworCWJ1ZmZlcl9pbml0KCZtc2cpOworCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0gyX0FHRU5UQ19TSUdOX1JFUVVFU1QpOworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtc2csIGJsb2IsIGJsZW4pOworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtc2csIGZyb20sIGZsZW4pOworCWJ1ZmZlcl9wdXRfaW50KCZtc2csIDApOworCXhmcmVlKGJsb2IpOworCXNlbmRfbXNnKCZtc2cpOworCWJ1ZmZlcl9jbGVhcigmbXNnKTsKKworCWlmIChyZWN2X21zZygmbXNnKSA9PSBTU0gyX0FHRU5UX1NJR05fUkVTUE9OU0UpIHsKKwkJc2lnbmF0dXJlID0gYnVmZmVyX2dldF9zdHJpbmcoJm1zZywgJnNsZW4pOworCQlpZiAoc2xlbiA8PSAodV9pbnQpUlNBX3NpemUocnNhKSkgeworCQkJbWVtY3B5KHRvLCBzaWduYXR1cmUsIHNsZW4pOworCQkJcmV0ID0gc2xlbjsKKwkJfQorCQl4ZnJlZShzaWduYXR1cmUpOworCX0KKwlidWZmZXJfZnJlZSgmbXNnKTsKKwlyZXR1cm4gKHJldCk7Cit9CisKKy8qIHJlZGlyZWN0IHRoZSBwcml2YXRlIGtleSBlbmNyeXB0IG9wZXJhdGlvbiB0byB0aGUgc3NoLXBrY3MxMS1oZWxwZXIgKi8KK3N0YXRpYyBpbnQKK3dyYXBfa2V5KFJTQSAqcnNhKQoreworCXN0YXRpYyBSU0FfTUVUSE9EIGhlbHBlcl9yc2E7CisKKwltZW1jcHkoJmhlbHBlcl9yc2EsIFJTQV9nZXRfZGVmYXVsdF9tZXRob2QoKSwgc2l6ZW9mKGhlbHBlcl9yc2EpKTsKKwloZWxwZXJfcnNhLm5hbWUgPSAic3NoLXBrY3MxMS1oZWxwZXIiOworCWhlbHBlcl9yc2EucnNhX3ByaXZfZW5jID0gcGtjczExX3JzYV9wcml2YXRlX2VuY3J5cHQ7CisJUlNBX3NldF9tZXRob2QocnNhLCAmaGVscGVyX3JzYSk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorcGtjczExX3N0YXJ0X2hlbHBlcih2b2lkKQoreworCWludCBwYWlyWzJdOworCisJaWYgKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsIHBhaXIpID09IC0xKSB7CisJCWVycm9yKCJzb2NrZXRwYWlyOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoLTEpOworCX0KKwlpZiAoKHBpZCA9IGZvcmsoKSkgPT0gLTEpIHsKKwkJZXJyb3IoImZvcms6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgtMSk7CisJfSBlbHNlIGlmIChwaWQgPT0gMCkgeworCQlpZiAoKGR1cDIocGFpclsxXSwgU1RESU5fRklMRU5PKSA9PSAtMSkgfHwKKwkJICAgIChkdXAyKHBhaXJbMV0sIFNURE9VVF9GSUxFTk8pID09IC0xKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJkdXAyOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCV9leGl0KDEpOworCQl9CisJCWNsb3NlKHBhaXJbMF0pOworCQljbG9zZShwYWlyWzFdKTsKKwkJZXhlY2xwKF9QQVRIX1NTSF9QS0NTMTFfSEVMUEVSLCBfUEFUSF9TU0hfUEtDUzExX0hFTFBFUiwKKwkJICAgIChjaGFyICopIDApOworCQlmcHJpbnRmKHN0ZGVyciwgImV4ZWM6ICVzOiAlc1xuIiwgX1BBVEhfU1NIX1BLQ1MxMV9IRUxQRVIsCisJCSAgICBzdHJlcnJvcihlcnJubykpOworCQlfZXhpdCgxKTsKKwl9CisJY2xvc2UocGFpclsxXSk7CisJZmQgPSBwYWlyWzBdOworCXJldHVybiAoMCk7Cit9CisKK2ludAorcGtjczExX2FkZF9wcm92aWRlcihjaGFyICpuYW1lLCBjaGFyICpwaW4sIEtleSAqKiprZXlzcCkKK3sKKwlLZXkgKms7CisJaW50IGksIG5rZXlzOworCXVfY2hhciAqYmxvYjsKKwl1X2ludCBibGVuOworCUJ1ZmZlciBtc2c7CisKKwlpZiAoZmQgPCAwICYmIHBrY3MxMV9zdGFydF9oZWxwZXIoKSA8IDApCisJCXJldHVybiAoLTEpOworCisJYnVmZmVyX2luaXQoJm1zZyk7CisJYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSF9BR0VOVENfQUREX1NNQVJUQ0FSRF9LRVkpOworCWJ1ZmZlcl9wdXRfY3N0cmluZygmbXNnLCBuYW1lKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcoJm1zZywgcGluKTsKKwlzZW5kX21zZygmbXNnKTsKKwlidWZmZXJfY2xlYXIoJm1zZyk7CisKKwlpZiAocmVjdl9tc2coJm1zZykgPT0gU1NIMl9BR0VOVF9JREVOVElUSUVTX0FOU1dFUikgeworCQlua2V5cyA9IGJ1ZmZlcl9nZXRfaW50KCZtc2cpOworCQkqa2V5c3AgPSB4Y2FsbG9jKG5rZXlzLCBzaXplb2YoS2V5ICopKTsKKwkJZm9yIChpID0gMDsgaSA8IG5rZXlzOyBpKyspIHsKKwkJCWJsb2IgPSBidWZmZXJfZ2V0X3N0cmluZygmbXNnLCAmYmxlbik7CisJCQl4ZnJlZShidWZmZXJfZ2V0X3N0cmluZygmbXNnLCBOVUxMKSk7CisJCQlrID0ga2V5X2Zyb21fYmxvYihibG9iLCBibGVuKTsKKwkJCXdyYXBfa2V5KGstPnJzYSk7CisJCQkoKmtleXNwKVtpXSA9IGs7CisJCQl4ZnJlZShibG9iKTsKKwkJfQorCX0gZWxzZSB7CisJCW5rZXlzID0gLTE7CisJfQorCWJ1ZmZlcl9mcmVlKCZtc2cpOworCXJldHVybiAobmtleXMpOworfQorCitpbnQKK3BrY3MxMV9kZWxfcHJvdmlkZXIoY2hhciAqbmFtZSkKK3sKKwlpbnQgcmV0ID0gLTE7CisJQnVmZmVyIG1zZzsKKworCWJ1ZmZlcl9pbml0KCZtc2cpOworCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0hfQUdFTlRDX1JFTU9WRV9TTUFSVENBUkRfS0VZKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcoJm1zZywgbmFtZSk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csICIiKTsKKwlzZW5kX21zZygmbXNnKTsKKwlidWZmZXJfY2xlYXIoJm1zZyk7CisKKwlpZiAocmVjdl9tc2coJm1zZykgPT0gU1NIX0FHRU5UX1NVQ0NFU1MpCisJCXJldCA9IDA7CisJYnVmZmVyX2ZyZWUoJm1zZyk7CisJcmV0dXJuIChyZXQpOworfQorCisjZW5kaWYgLyogRU5BQkxFX1BLQ1MxMSAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zc2gtcGtjczExLWhlbHBlci4wIGIvb3BlbnNzaC02LjBwMS9zc2gtcGtjczExLWhlbHBlci4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNzExN2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NzaC1wa2NzMTEtaGVscGVyLjAKQEAgLTAsMCArMSwyNSBAQAorU1NILVBLQ1MxMS1IRUxQRVIoOCkgICAgT3BlbkJTRCBTeXN0ZW0gTWFuYWdlcidzIE1hbnVhbCAgIFNTSC1QS0NTMTEtSEVMUEVSKDgpCisKK05BTUUKKyAgICAgc3NoLXBrY3MxMS1oZWxwZXIgLSBzc2gtYWdlbnQgaGVscGVyIHByb2dyYW0gZm9yIFBLQ1MjMTEgc3VwcG9ydAorCitTWU5PUFNJUworICAgICBzc2gtcGtjczExLWhlbHBlcgorCitERVNDUklQVElPTgorICAgICBzc2gtcGtjczExLWhlbHBlciBpcyB1c2VkIGJ5IHNzaC1hZ2VudCgxKSB0byBhY2Nlc3Mga2V5cyBwcm92aWRlZCBieSBhCisgICAgIFBLQ1MjMTEgdG9rZW4uCisKKyAgICAgc3NoLXBrY3MxMS1oZWxwZXIgaXMgbm90IGludGVuZGVkIHRvIGJlIGludm9rZWQgYnkgdGhlIHVzZXIsIGJ1dCBmcm9tCisgICAgIHNzaC1hZ2VudCgxKS4KKworU0VFIEFMU08KKyAgICAgc3NoKDEpLCBzc2gtYWRkKDEpLCBzc2gtYWdlbnQoMSkKKworSElTVE9SWQorICAgICBzc2gtcGtjczExLWhlbHBlciBmaXJzdCBhcHBlYXJlZCBpbiBPcGVuQlNEIDQuNy4KKworQVVUSE9SUworICAgICBNYXJrdXMgRnJpZWRsIDxtYXJrdXNAb3BlbmJzZC5vcmc+CisKK09wZW5CU0QgNS4wICAgICAgICAgICAgICAgICAgICBGZWJydWFyeSAxMCwgMjAxMCAgICAgICAgICAgICAgICAgICBPcGVuQlNEIDUuMApkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zc2gtcGtjczExLWhlbHBlci44IGIvb3BlbnNzaC02LjBwMS9zc2gtcGtjczExLWhlbHBlci44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZGFhZGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NzaC1wa2NzMTEtaGVscGVyLjgKQEAgLTAsMCArMSw0MyBAQAorLlwiICRPcGVuQlNEOiBzc2gtcGtjczExLWhlbHBlci44LHYgMS4zIDIwMTAvMDIvMTAgMjM6MjA6MzggbWFya3VzIEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDIwMTAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy5cIiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisuXCIgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKy5cIgorLlwiIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworLlwiIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorLlwiIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKy5cIiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKy5cIiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorLlwiIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisuXCIKKy5EZCAkTWRvY2RhdGU6IEZlYnJ1YXJ5IDEwIDIwMTAgJAorLkR0IFNTSC1QS0NTMTEtSEVMUEVSIDgKKy5PcworLlNoIE5BTUUKKy5ObSBzc2gtcGtjczExLWhlbHBlcgorLk5kIHNzaC1hZ2VudCBoZWxwZXIgcHJvZ3JhbSBmb3IgUEtDUyMxMSBzdXBwb3J0CisuU2ggU1lOT1BTSVMKKy5ObQorLlNoIERFU0NSSVBUSU9OCisuTm0KK2lzIHVzZWQgYnkKKy5YciBzc2gtYWdlbnQgMQordG8gYWNjZXNzIGtleXMgcHJvdmlkZWQgYnkgYSBQS0NTIzExIHRva2VuLgorLlBwCisuTm0KK2lzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnZva2VkIGJ5IHRoZSB1c2VyLCBidXQgZnJvbQorLlhyIHNzaC1hZ2VudCAxIC4KKy5TaCBTRUUgQUxTTworLlhyIHNzaCAxICwKKy5YciBzc2gtYWRkIDEgLAorLlhyIHNzaC1hZ2VudCAxCisuU2ggSElTVE9SWQorLk5tCitmaXJzdCBhcHBlYXJlZCBpbgorLk94IDQuNyAuCisuU2ggQVVUSE9SUworLkFuIE1hcmt1cyBGcmllZGwgQXEgbWFya3VzQG9wZW5ic2Qub3JnCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NzaC1wa2NzMTEtaGVscGVyLmMgYi9vcGVuc3NoLTYuMHAxL3NzaC1wa2NzMTEtaGVscGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzMzUxNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc3NoLXBrY3MxMS1oZWxwZXIuYwpAQCAtMCwwICsxLDM3MSBAQAorLyogJE9wZW5CU0Q6IHNzaC1wa2NzMTEtaGVscGVyLmMsdiAxLjMgMjAxMC8wMi8yNCAwNjoxMjo1MyBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBIQVZFX1NZU19USU1FX0gKKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvc3lzLXF1ZXVlLmgiCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJhdXRoZmQuaCIKKyNpbmNsdWRlICJzc2gtcGtjczExLmgiCisKKyNpZmRlZiBFTkFCTEVfUEtDUzExCisKKy8qIGJvcnJvd3MgY29kZSBmcm9tIHNmdHAtc2VydmVyIGFuZCBzc2gtYWdlbnQgKi8KKworc3RydWN0IHBrY3MxMV9rZXlpbmZvIHsKKwlLZXkJCSprZXk7CisJY2hhcgkJKnByb3ZpZGVybmFtZTsKKwlUQUlMUV9FTlRSWShwa2NzMTFfa2V5aW5mbykgbmV4dDsKK307CisKK1RBSUxRX0hFQUQoLCBwa2NzMTFfa2V5aW5mbykgcGtjczExX2tleWxpc3Q7CisKKyNkZWZpbmUgTUFYX01TR19MRU5HVEgJCTEwMjQwIC8qWFhYKi8KKworLyogaGVscGVyICovCisjZGVmaW5lIGdldF9pbnQoKQkJCWJ1ZmZlcl9nZXRfaW50KCZpcXVldWUpOworI2RlZmluZSBnZXRfc3RyaW5nKGxlbnApCQlidWZmZXJfZ2V0X3N0cmluZygmaXF1ZXVlLCBsZW5wKTsKKworLyogaW5wdXQgYW5kIG91dHB1dCBxdWV1ZSAqLworQnVmZmVyIGlxdWV1ZTsKK0J1ZmZlciBvcXVldWU7CisKK3N0YXRpYyB2b2lkCithZGRfa2V5KEtleSAqaywgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgcGtjczExX2tleWluZm8gKmtpOworCisJa2kgPSB4Y2FsbG9jKDEsIHNpemVvZigqa2kpKTsKKwlraS0+cHJvdmlkZXJuYW1lID0geHN0cmR1cChuYW1lKTsKKwlraS0+a2V5ID0gazsKKwlUQUlMUV9JTlNFUlRfVEFJTCgmcGtjczExX2tleWxpc3QsIGtpLCBuZXh0KTsKK30KKworc3RhdGljIHZvaWQKK2RlbF9rZXlzX2J5X25hbWUoY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgcGtjczExX2tleWluZm8gKmtpLCAqbnh0OworCisJZm9yIChraSA9IFRBSUxRX0ZJUlNUKCZwa2NzMTFfa2V5bGlzdCk7IGtpOyBraSA9IG54dCkgeworCQlueHQgPSBUQUlMUV9ORVhUKGtpLCBuZXh0KTsKKwkJaWYgKCFzdHJjbXAoa2ktPnByb3ZpZGVybmFtZSwgbmFtZSkpIHsKKwkJCVRBSUxRX1JFTU9WRSgmcGtjczExX2tleWxpc3QsIGtpLCBuZXh0KTsKKwkJCXhmcmVlKGtpLT5wcm92aWRlcm5hbWUpOworCQkJa2V5X2ZyZWUoa2ktPmtleSk7CisJCQlmcmVlKGtpKTsKKwkJfQorCX0KK30KKworLyogbG9va3VwIG1hdGNoaW5nICdwcml2YXRlJyBrZXkgKi8KK3N0YXRpYyBLZXkgKgorbG9va3VwX2tleShLZXkgKmspCit7CisJc3RydWN0IHBrY3MxMV9rZXlpbmZvICpraTsKKworCVRBSUxRX0ZPUkVBQ0goa2ksICZwa2NzMTFfa2V5bGlzdCwgbmV4dCkgeworCQlkZWJ1ZygiY2hlY2sgJXAgJXMiLCBraSwga2ktPnByb3ZpZGVybmFtZSk7CisJCWlmIChrZXlfZXF1YWwoaywga2ktPmtleSkpCisJCQlyZXR1cm4gKGtpLT5rZXkpOworCX0KKwlyZXR1cm4gKE5VTEwpOworfQorCitzdGF0aWMgdm9pZAorc2VuZF9tc2coQnVmZmVyICptKQoreworCWludCBtbGVuID0gYnVmZmVyX2xlbihtKTsKKworCWJ1ZmZlcl9wdXRfaW50KCZvcXVldWUsIG1sZW4pOworCWJ1ZmZlcl9hcHBlbmQoJm9xdWV1ZSwgYnVmZmVyX3B0cihtKSwgbWxlbik7CisJYnVmZmVyX2NvbnN1bWUobSwgbWxlbik7Cit9CisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX2FkZCh2b2lkKQoreworCWNoYXIgKm5hbWUsICpwaW47CisJS2V5ICoqa2V5czsKKwlpbnQgaSwgbmtleXM7CisJdV9jaGFyICpibG9iOworCXVfaW50IGJsZW47CisJQnVmZmVyIG1zZzsKKworCWJ1ZmZlcl9pbml0KCZtc2cpOworCW5hbWUgPSBnZXRfc3RyaW5nKE5VTEwpOworCXBpbiA9IGdldF9zdHJpbmcoTlVMTCk7CisJaWYgKChua2V5cyA9IHBrY3MxMV9hZGRfcHJvdmlkZXIobmFtZSwgcGluLCAma2V5cykpID4gMCkgeworCQlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIMl9BR0VOVF9JREVOVElUSUVTX0FOU1dFUik7CisJCWJ1ZmZlcl9wdXRfaW50KCZtc2csIG5rZXlzKTsKKwkJZm9yIChpID0gMDsgaSA8IG5rZXlzOyBpKyspIHsKKwkJCWtleV90b19ibG9iKGtleXNbaV0sICZibG9iLCAmYmxlbik7CisJCQlidWZmZXJfcHV0X3N0cmluZygmbXNnLCBibG9iLCBibGVuKTsKKwkJCWJ1ZmZlcl9wdXRfY3N0cmluZygmbXNnLCBuYW1lKTsKKwkJCXhmcmVlKGJsb2IpOworCQkJYWRkX2tleShrZXlzW2ldLCBuYW1lKTsKKwkJfQorCQl4ZnJlZShrZXlzKTsKKwl9IGVsc2UgeworCQlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIX0FHRU5UX0ZBSUxVUkUpOworCX0KKwl4ZnJlZShwaW4pOworCXhmcmVlKG5hbWUpOworCXNlbmRfbXNnKCZtc2cpOworCWJ1ZmZlcl9mcmVlKCZtc2cpOworfQorCitzdGF0aWMgdm9pZAorcHJvY2Vzc19kZWwodm9pZCkKK3sKKwljaGFyICpuYW1lLCAqcGluOworCUJ1ZmZlciBtc2c7CisKKwlidWZmZXJfaW5pdCgmbXNnKTsKKwluYW1lID0gZ2V0X3N0cmluZyhOVUxMKTsKKwlwaW4gPSBnZXRfc3RyaW5nKE5VTEwpOworCWRlbF9rZXlzX2J5X25hbWUobmFtZSk7CisJaWYgKHBrY3MxMV9kZWxfcHJvdmlkZXIobmFtZSkgPT0gMCkKKwkJIGJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0hfQUdFTlRfU1VDQ0VTUyk7CisJZWxzZQorCQkgYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSF9BR0VOVF9GQUlMVVJFKTsKKwl4ZnJlZShwaW4pOworCXhmcmVlKG5hbWUpOworCXNlbmRfbXNnKCZtc2cpOworCWJ1ZmZlcl9mcmVlKCZtc2cpOworfQorCitzdGF0aWMgdm9pZAorcHJvY2Vzc19zaWduKHZvaWQpCit7CisJdV9jaGFyICpibG9iLCAqZGF0YSwgKnNpZ25hdHVyZSA9IE5VTEw7CisJdV9pbnQgYmxlbiwgZGxlbiwgc2xlbiA9IDA7CisJaW50IG9rID0gLTEsIGZsYWdzLCByZXQ7CisJS2V5ICprZXksICpmb3VuZDsKKwlCdWZmZXIgbXNnOworCisJYmxvYiA9IGdldF9zdHJpbmcoJmJsZW4pOworCWRhdGEgPSBnZXRfc3RyaW5nKCZkbGVuKTsKKwlmbGFncyA9IGdldF9pbnQoKTsgLyogWFhYIGlnbm9yZSAqLworCisJaWYgKChrZXkgPSBrZXlfZnJvbV9ibG9iKGJsb2IsIGJsZW4pKSAhPSBOVUxMKSB7CisJCWlmICgoZm91bmQgPSBsb29rdXBfa2V5KGtleSkpICE9IE5VTEwpIHsKKwkJCXNsZW4gPSBSU0Ffc2l6ZShrZXktPnJzYSk7CisJCQlzaWduYXR1cmUgPSB4bWFsbG9jKHNsZW4pOworCQkJaWYgKChyZXQgPSBSU0FfcHJpdmF0ZV9lbmNyeXB0KGRsZW4sIGRhdGEsIHNpZ25hdHVyZSwKKwkJCSAgICBmb3VuZC0+cnNhLCBSU0FfUEtDUzFfUEFERElORykpICE9IC0xKSB7CisJCQkJc2xlbiA9IHJldDsKKwkJCQlvayA9IDA7CisJCQl9CisJCX0KKwkJa2V5X2ZyZWUoa2V5KTsKKwl9CisJYnVmZmVyX2luaXQoJm1zZyk7CisJaWYgKG9rID09IDApIHsKKwkJYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSDJfQUdFTlRfU0lHTl9SRVNQT05TRSk7CisJCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtc2csIHNpZ25hdHVyZSwgc2xlbik7CisJfSBlbHNlIHsKKwkJYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSF9BR0VOVF9GQUlMVVJFKTsKKwl9CisJeGZyZWUoZGF0YSk7CisJeGZyZWUoYmxvYik7CisJaWYgKHNpZ25hdHVyZSAhPSBOVUxMKQorCQl4ZnJlZShzaWduYXR1cmUpOworCXNlbmRfbXNnKCZtc2cpOworCWJ1ZmZlcl9mcmVlKCZtc2cpOworfQorCitzdGF0aWMgdm9pZAorcHJvY2Vzcyh2b2lkKQoreworCXVfaW50IG1zZ19sZW47CisJdV9pbnQgYnVmX2xlbjsKKwl1X2ludCBjb25zdW1lZDsKKwl1X2ludCB0eXBlOworCXVfY2hhciAqY3A7CisKKwlidWZfbGVuID0gYnVmZmVyX2xlbigmaXF1ZXVlKTsKKwlpZiAoYnVmX2xlbiA8IDUpCisJCXJldHVybjsJCS8qIEluY29tcGxldGUgbWVzc2FnZS4gKi8KKwljcCA9IGJ1ZmZlcl9wdHIoJmlxdWV1ZSk7CisJbXNnX2xlbiA9IGdldF91MzIoY3ApOworCWlmIChtc2dfbGVuID4gTUFYX01TR19MRU5HVEgpIHsKKwkJZXJyb3IoImJhZCBtZXNzYWdlIGxlbiAlZCIsIG1zZ19sZW4pOworCQljbGVhbnVwX2V4aXQoMTEpOworCX0KKwlpZiAoYnVmX2xlbiA8IG1zZ19sZW4gKyA0KQorCQlyZXR1cm47CisJYnVmZmVyX2NvbnN1bWUoJmlxdWV1ZSwgNCk7CisJYnVmX2xlbiAtPSA0OworCXR5cGUgPSBidWZmZXJfZ2V0X2NoYXIoJmlxdWV1ZSk7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTU0hfQUdFTlRDX0FERF9TTUFSVENBUkRfS0VZOgorCQlkZWJ1ZygicHJvY2Vzc19hZGQiKTsKKwkJcHJvY2Vzc19hZGQoKTsKKwkJYnJlYWs7CisJY2FzZSBTU0hfQUdFTlRDX1JFTU9WRV9TTUFSVENBUkRfS0VZOgorCQlkZWJ1ZygicHJvY2Vzc19kZWwiKTsKKwkJcHJvY2Vzc19kZWwoKTsKKwkJYnJlYWs7CisJY2FzZSBTU0gyX0FHRU5UQ19TSUdOX1JFUVVFU1Q6CisJCWRlYnVnKCJwcm9jZXNzX3NpZ24iKTsKKwkJcHJvY2Vzc19zaWduKCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycm9yKCJVbmtub3duIG1lc3NhZ2UgJWQiLCB0eXBlKTsKKwkJYnJlYWs7CisJfQorCS8qIGRpc2NhcmQgdGhlIHJlbWFpbmluZyBieXRlcyBmcm9tIHRoZSBjdXJyZW50IHBhY2tldCAqLworCWlmIChidWZfbGVuIDwgYnVmZmVyX2xlbigmaXF1ZXVlKSkgeworCQllcnJvcigiaXF1ZXVlIGdyZXcgdW5leHBlY3RlZGx5Iik7CisJCWNsZWFudXBfZXhpdCgyNTUpOworCX0KKwljb25zdW1lZCA9IGJ1Zl9sZW4gLSBidWZmZXJfbGVuKCZpcXVldWUpOworCWlmIChtc2dfbGVuIDwgY29uc3VtZWQpIHsKKwkJZXJyb3IoIm1zZ19sZW4gJWQgPCBjb25zdW1lZCAlZCIsIG1zZ19sZW4sIGNvbnN1bWVkKTsKKwkJY2xlYW51cF9leGl0KDI1NSk7CisJfQorCWlmIChtc2dfbGVuID4gY29uc3VtZWQpCisJCWJ1ZmZlcl9jb25zdW1lKCZpcXVldWUsIG1zZ19sZW4gLSBjb25zdW1lZCk7Cit9CisKK3ZvaWQKK2NsZWFudXBfZXhpdChpbnQgaSkKK3sKKwkvKiBYWFggKi8KKwlfZXhpdChpKTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlmZF9zZXQgKnJzZXQsICp3c2V0OworCWludCBpbiwgb3V0LCBtYXgsIGxvZ19zdGRlcnIgPSAwOworCXNzaXplX3QgbGVuLCBvbGVuLCBzZXRfc2l6ZTsKKwlTeXNsb2dGYWNpbGl0eSBsb2dfZmFjaWxpdHkgPSBTWVNMT0dfRkFDSUxJVFlfQVVUSDsKKwlMb2dMZXZlbCBsb2dfbGV2ZWwgPSBTWVNMT0dfTEVWRUxfRVJST1I7CisJY2hhciBidWZbNCo0MDk2XTsKKworCWV4dGVybiBjaGFyICpvcHRhcmc7CisJZXh0ZXJuIGNoYXIgKl9fcHJvZ25hbWU7CisKKwlUQUlMUV9JTklUKCZwa2NzMTFfa2V5bGlzdCk7CisJcGtjczExX2luaXQoMCk7CisKKwlzZWVkX3JuZygpOworCV9fcHJvZ25hbWUgPSBzc2hfZ2V0X3Byb2duYW1lKGFyZ3ZbMF0pOworCisJbG9nX2luaXQoX19wcm9nbmFtZSwgbG9nX2xldmVsLCBsb2dfZmFjaWxpdHksIGxvZ19zdGRlcnIpOworCisJaW4gPSBTVERJTl9GSUxFTk87CisJb3V0ID0gU1RET1VUX0ZJTEVOTzsKKworCW1heCA9IDA7CisJaWYgKGluID4gbWF4KQorCQltYXggPSBpbjsKKwlpZiAob3V0ID4gbWF4KQorCQltYXggPSBvdXQ7CisKKwlidWZmZXJfaW5pdCgmaXF1ZXVlKTsKKwlidWZmZXJfaW5pdCgmb3F1ZXVlKTsKKworCXNldF9zaXplID0gaG93bWFueShtYXggKyAxLCBORkRCSVRTKSAqIHNpemVvZihmZF9tYXNrKTsKKwlyc2V0ID0gKGZkX3NldCAqKXhtYWxsb2Moc2V0X3NpemUpOworCXdzZXQgPSAoZmRfc2V0ICopeG1hbGxvYyhzZXRfc2l6ZSk7CisKKwlmb3IgKDs7KSB7CisJCW1lbXNldChyc2V0LCAwLCBzZXRfc2l6ZSk7CisJCW1lbXNldCh3c2V0LCAwLCBzZXRfc2l6ZSk7CisKKwkJLyoKKwkJICogRW5zdXJlIHRoYXQgd2UgY2FuIHJlYWQgYSBmdWxsIGJ1ZmZlciBhbmQgaGFuZGxlCisJCSAqIHRoZSB3b3JzdC1jYXNlIGxlbmd0aCBwYWNrZXQgaXQgY2FuIGdlbmVyYXRlLAorCQkgKiBvdGhlcndpc2UgYXBwbHkgYmFja3ByZXNzdXJlIGJ5IHN0b3BwaW5nIHJlYWRzLgorCQkgKi8KKwkJaWYgKGJ1ZmZlcl9jaGVja19hbGxvYygmaXF1ZXVlLCBzaXplb2YoYnVmKSkgJiYKKwkJICAgIGJ1ZmZlcl9jaGVja19hbGxvYygmb3F1ZXVlLCBNQVhfTVNHX0xFTkdUSCkpCisJCQlGRF9TRVQoaW4sIHJzZXQpOworCisJCW9sZW4gPSBidWZmZXJfbGVuKCZvcXVldWUpOworCQlpZiAob2xlbiA+IDApCisJCQlGRF9TRVQob3V0LCB3c2V0KTsKKworCQlpZiAoc2VsZWN0KG1heCsxLCByc2V0LCB3c2V0LCBOVUxMLCBOVUxMKSA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCQljb250aW51ZTsKKwkJCWVycm9yKCJzZWxlY3Q6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWNsZWFudXBfZXhpdCgyKTsKKwkJfQorCisJCS8qIGNvcHkgc3RkaW4gdG8gaXF1ZXVlICovCisJCWlmIChGRF9JU1NFVChpbiwgcnNldCkpIHsKKwkJCWxlbiA9IHJlYWQoaW4sIGJ1Ziwgc2l6ZW9mIGJ1Zik7CisJCQlpZiAobGVuID09IDApIHsKKwkJCQlkZWJ1ZygicmVhZCBlb2YiKTsKKwkJCQljbGVhbnVwX2V4aXQoMCk7CisJCQl9IGVsc2UgaWYgKGxlbiA8IDApIHsKKwkJCQllcnJvcigicmVhZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkJCWNsZWFudXBfZXhpdCgxKTsKKwkJCX0gZWxzZSB7CisJCQkJYnVmZmVyX2FwcGVuZCgmaXF1ZXVlLCBidWYsIGxlbik7CisJCQl9CisJCX0KKwkJLyogc2VuZCBvcXVldWUgdG8gc3Rkb3V0ICovCisJCWlmIChGRF9JU1NFVChvdXQsIHdzZXQpKSB7CisJCQlsZW4gPSB3cml0ZShvdXQsIGJ1ZmZlcl9wdHIoJm9xdWV1ZSksIG9sZW4pOworCQkJaWYgKGxlbiA8IDApIHsKKwkJCQllcnJvcigid3JpdGU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQljbGVhbnVwX2V4aXQoMSk7CisJCQl9IGVsc2UgeworCQkJCWJ1ZmZlcl9jb25zdW1lKCZvcXVldWUsIGxlbik7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBQcm9jZXNzIHJlcXVlc3RzIGZyb20gY2xpZW50IGlmIHdlIGNhbiBmaXQgdGhlIHJlc3VsdHMKKwkJICogaW50byB0aGUgb3V0cHV0IGJ1ZmZlciwgb3RoZXJ3aXNlIHN0b3AgcHJvY2Vzc2luZyBpbnB1dAorCQkgKiBhbmQgbGV0IHRoZSBvdXRwdXQgcXVldWUgZHJhaW4uCisJCSAqLworCQlpZiAoYnVmZmVyX2NoZWNrX2FsbG9jKCZvcXVldWUsIE1BWF9NU0dfTEVOR1RIKSkKKwkJCXByb2Nlc3MoKTsKKwl9Cit9CisjZWxzZSAvKiBFTkFCTEVfUEtDUzExICovCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWV4dGVybiBjaGFyICpfX3Byb2duYW1lOworCisJX19wcm9nbmFtZSA9IHNzaF9nZXRfcHJvZ25hbWUoYXJndlswXSk7CisJbG9nX2luaXQoX19wcm9nbmFtZSwgU1lTTE9HX0xFVkVMX0VSUk9SLCBTWVNMT0dfRkFDSUxJVFlfQVVUSCwgMCk7CisJZmF0YWwoIlBLQ1MjMTEgc3VwcG9ydCBkaXNhYmxlZCBhdCBjb21waWxlIHRpbWUiKTsKK30KKyNlbmRpZiAvKiBFTkFCTEVfUEtDUzExICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NzaC1wa2NzMTEuYyBiL29wZW5zc2gtNi4wcDEvc3NoLXBrY3MxMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNGMxYzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NzaC1wa2NzMTEuYwpAQCAtMCwwICsxLDYwNyBAQAorLyogJE9wZW5CU0Q6IHNzaC1wa2NzMTEuYyx2IDEuNiAyMDEwLzA2LzA4IDIxOjMyOjE5IG1hcmt1cyBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2lmZGVmIEVOQUJMRV9QS0NTMTEKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorIyBpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisKKyNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9zeXMtcXVldWUuaCIKKworI2RlZmluZSBDUllQVE9LSV9DT01QQVQKKyNpbmNsdWRlICJwa2NzMTEuaCIKKworI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJzc2gtcGtjczExLmgiCisjaW5jbHVkZSAieG1hbGxvYy5oIgorCitzdHJ1Y3QgcGtjczExX3Nsb3RpbmZvIHsKKwlDS19UT0tFTl9JTkZPCQl0b2tlbjsKKwlDS19TRVNTSU9OX0hBTkRMRQlzZXNzaW9uOworCWludAkJCWxvZ2dlZF9pbjsKK307CisKK3N0cnVjdCBwa2NzMTFfcHJvdmlkZXIgeworCWNoYXIJCQkqbmFtZTsKKwl2b2lkCQkJKmhhbmRsZTsKKwlDS19GVU5DVElPTl9MSVNUCSpmdW5jdGlvbl9saXN0OworCUNLX0lORk8JCQlpbmZvOworCUNLX1VMT05HCQluc2xvdHM7CisJQ0tfU0xPVF9JRAkJKnNsb3RsaXN0OworCXN0cnVjdCBwa2NzMTFfc2xvdGluZm8JKnNsb3RpbmZvOworCWludAkJCXZhbGlkOworCWludAkJCXJlZmNvdW50OworCVRBSUxRX0VOVFJZKHBrY3MxMV9wcm92aWRlcikgbmV4dDsKK307CisKK1RBSUxRX0hFQUQoLCBwa2NzMTFfcHJvdmlkZXIpIHBrY3MxMV9wcm92aWRlcnM7CisKK3N0cnVjdCBwa2NzMTFfa2V5IHsKKwlzdHJ1Y3QgcGtjczExX3Byb3ZpZGVyCSpwcm92aWRlcjsKKwlDS19VTE9ORwkJc2xvdGlkeDsKKwlpbnQJCQkoKm9yaWdfZmluaXNoKShSU0EgKnJzYSk7CisJUlNBX01FVEhPRAkJcnNhX21ldGhvZDsKKwljaGFyCQkJKmtleWlkOworCWludAkJCWtleWlkX2xlbjsKK307CisKK2ludCBwa2NzMTFfaW50ZXJhY3RpdmUgPSAwOworCitpbnQKK3BrY3MxMV9pbml0KGludCBpbnRlcmFjdGl2ZSkKK3sKKwlwa2NzMTFfaW50ZXJhY3RpdmUgPSBpbnRlcmFjdGl2ZTsKKwlUQUlMUV9JTklUKCZwa2NzMTFfcHJvdmlkZXJzKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogZmluYWxpemUgYSBwcm92aWRlciBzaGFyZWQgbGliYXJhcnksIGl0J3Mgbm8gbG9uZ2VyIHVzYWJsZS4KKyAqIGhvd2V2ZXIsIHRoZXJlIG1pZ2h0IHN0aWxsIGJlIGtleXMgcmVmZXJlbmNpbmcgdGhpcyBwcm92aWRlciwKKyAqIHNvIHRoZSBhY3R1YWxsIGZyZWVpbmcgb2YgbWVtb3J5IGlzIGhhbmRsZWQgYnkgcGtjczExX3Byb3ZpZGVyX3VucmVmKCkuCisgKiB0aGlzIGlzIGNhbGxlZCB3aGVuIGEgcHJvdmlkZXIgZ2V0cyB1bnJlZ2lzdGVyZWQuCisgKi8KK3N0YXRpYyB2b2lkCitwa2NzMTFfcHJvdmlkZXJfZmluYWxpemUoc3RydWN0IHBrY3MxMV9wcm92aWRlciAqcCkKK3sKKwlDS19SViBydjsKKwlDS19VTE9ORyBpOworCisJZGVidWcoInBrY3MxMV9wcm92aWRlcl9maW5hbGl6ZTogJXAgcmVmY291bnQgJWQgdmFsaWQgJWQiLAorCSAgICBwLCBwLT5yZWZjb3VudCwgcC0+dmFsaWQpOworCWlmICghcC0+dmFsaWQpCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgcC0+bnNsb3RzOyBpKyspIHsKKwkJaWYgKHAtPnNsb3RpbmZvW2ldLnNlc3Npb24gJiYKKwkJICAgIChydiA9IHAtPmZ1bmN0aW9uX2xpc3QtPkNfQ2xvc2VTZXNzaW9uKAorCQkgICAgcC0+c2xvdGluZm9baV0uc2Vzc2lvbikpICE9IENLUl9PSykKKwkJCWVycm9yKCJDX0Nsb3NlU2Vzc2lvbiBmYWlsZWQ6ICVsdSIsIHJ2KTsKKwl9CisJaWYgKChydiA9IHAtPmZ1bmN0aW9uX2xpc3QtPkNfRmluYWxpemUoTlVMTCkpICE9IENLUl9PSykKKwkJZXJyb3IoIkNfRmluYWxpemUgZmFpbGVkOiAlbHUiLCBydik7CisJcC0+dmFsaWQgPSAwOworCXAtPmZ1bmN0aW9uX2xpc3QgPSBOVUxMOworCWRsY2xvc2UocC0+aGFuZGxlKTsKK30KKworLyoKKyAqIHJlbW92ZSBhIHJlZmVyZW5jZSB0byB0aGUgcHJvdmlkZXIuCisgKiBjYWxsZWQgd2hlbiBhIGtleSBnZXRzIGRlc3Ryb3llZCBvciB3aGVuIHRoZSBwcm92aWRlciBpcyB1bnJlZ2lzdGVyZWQuCisgKi8KK3N0YXRpYyB2b2lkCitwa2NzMTFfcHJvdmlkZXJfdW5yZWYoc3RydWN0IHBrY3MxMV9wcm92aWRlciAqcCkKK3sKKwlkZWJ1ZygicGtjczExX3Byb3ZpZGVyX3VucmVmOiAlcCByZWZjb3VudCAlZCIsIHAsIHAtPnJlZmNvdW50KTsKKwlpZiAoLS1wLT5yZWZjb3VudCA8PSAwKSB7CisJCWlmIChwLT52YWxpZCkKKwkJCWVycm9yKCJwa2NzMTFfcHJvdmlkZXJfdW5yZWY6ICVwIHN0aWxsIHZhbGlkIiwgcCk7CisJCXhmcmVlKHAtPnNsb3RsaXN0KTsKKwkJeGZyZWUocC0+c2xvdGluZm8pOworCQl4ZnJlZShwKTsKKwl9Cit9CisKKy8qIHVucmVnaXN0ZXIgYWxsIHByb3ZpZGVycywga2V5cyBtaWdodCBzdGlsbCBwb2ludCB0byB0aGUgcHJvdmlkZXJzICovCit2b2lkCitwa2NzMTFfdGVybWluYXRlKHZvaWQpCit7CisJc3RydWN0IHBrY3MxMV9wcm92aWRlciAqcDsKKworCXdoaWxlICgocCA9IFRBSUxRX0ZJUlNUKCZwa2NzMTFfcHJvdmlkZXJzKSkgIT0gTlVMTCkgeworCQlUQUlMUV9SRU1PVkUoJnBrY3MxMV9wcm92aWRlcnMsIHAsIG5leHQpOworCQlwa2NzMTFfcHJvdmlkZXJfZmluYWxpemUocCk7CisJCXBrY3MxMV9wcm92aWRlcl91bnJlZihwKTsKKwl9Cit9CisKKy8qIGxvb2t1cCBwcm92aWRlciBieSBuYW1lICovCitzdGF0aWMgc3RydWN0IHBrY3MxMV9wcm92aWRlciAqCitwa2NzMTFfcHJvdmlkZXJfbG9va3VwKGNoYXIgKnByb3ZpZGVyX2lkKQoreworCXN0cnVjdCBwa2NzMTFfcHJvdmlkZXIgKnA7CisKKwlUQUlMUV9GT1JFQUNIKHAsICZwa2NzMTFfcHJvdmlkZXJzLCBuZXh0KSB7CisJCWRlYnVnKCJjaGVjayAlcCAlcyIsIHAsIHAtPm5hbWUpOworCQlpZiAoIXN0cmNtcChwcm92aWRlcl9pZCwgcC0+bmFtZSkpCisJCQlyZXR1cm4gKHApOworCX0KKwlyZXR1cm4gKE5VTEwpOworfQorCisvKiB1bnJlZ2lzdGVyIHByb3ZpZGVyIGJ5IG5hbWUgKi8KK2ludAorcGtjczExX2RlbF9wcm92aWRlcihjaGFyICpwcm92aWRlcl9pZCkKK3sKKwlzdHJ1Y3QgcGtjczExX3Byb3ZpZGVyICpwOworCisJaWYgKChwID0gcGtjczExX3Byb3ZpZGVyX2xvb2t1cChwcm92aWRlcl9pZCkpICE9IE5VTEwpIHsKKwkJVEFJTFFfUkVNT1ZFKCZwa2NzMTFfcHJvdmlkZXJzLCBwLCBuZXh0KTsKKwkJcGtjczExX3Byb3ZpZGVyX2ZpbmFsaXplKHApOworCQlwa2NzMTFfcHJvdmlkZXJfdW5yZWYocCk7CisJCXJldHVybiAoMCk7CisJfQorCXJldHVybiAoLTEpOworfQorCisvKiBvcGVuc3NsIGNhbGxiYWNrIGZvciBmcmVlaW5nIGFuIFJTQSBrZXkgKi8KK3N0YXRpYyBpbnQKK3BrY3MxMV9yc2FfZmluaXNoKFJTQSAqcnNhKQoreworCXN0cnVjdCBwa2NzMTFfa2V5CSprMTE7CisJaW50IHJ2ID0gLTE7CisKKwlpZiAoKGsxMSA9IFJTQV9nZXRfYXBwX2RhdGEocnNhKSkgIT0gTlVMTCkgeworCQlpZiAoazExLT5vcmlnX2ZpbmlzaCkKKwkJCXJ2ID0gazExLT5vcmlnX2ZpbmlzaChyc2EpOworCQlpZiAoazExLT5wcm92aWRlcikKKwkJCXBrY3MxMV9wcm92aWRlcl91bnJlZihrMTEtPnByb3ZpZGVyKTsKKwkJaWYgKGsxMS0+a2V5aWQpCisJCQl4ZnJlZShrMTEtPmtleWlkKTsKKwkJeGZyZWUoazExKTsKKwl9CisJcmV0dXJuIChydik7Cit9CisKKy8qIGZpbmQgYSBzaW5nbGUgJ29iaicgZm9yIGdpdmVuIGF0dHJpYnV0ZXMgKi8KK3N0YXRpYyBpbnQKK3BrY3MxMV9maW5kKHN0cnVjdCBwa2NzMTFfcHJvdmlkZXIgKnAsIENLX1VMT05HIHNsb3RpZHgsIENLX0FUVFJJQlVURSAqYXR0ciwKKyAgICBDS19VTE9ORyBuYXR0ciwgQ0tfT0JKRUNUX0hBTkRMRSAqb2JqKQoreworCUNLX0ZVTkNUSU9OX0xJU1QJKmY7CisJQ0tfU0VTU0lPTl9IQU5ETEUJc2Vzc2lvbjsKKwlDS19VTE9ORwkJbmZvdW5kID0gMDsKKwlDS19SVgkJCXJ2OworCWludAkJCXJldCA9IC0xOworCisJZiA9IHAtPmZ1bmN0aW9uX2xpc3Q7CisJc2Vzc2lvbiA9IHAtPnNsb3RpbmZvW3Nsb3RpZHhdLnNlc3Npb247CisJaWYgKChydiA9IGYtPkNfRmluZE9iamVjdHNJbml0KHNlc3Npb24sIGF0dHIsIG5hdHRyKSkgIT0gQ0tSX09LKSB7CisJCWVycm9yKCJDX0ZpbmRPYmplY3RzSW5pdCBmYWlsZWQgKG5hdHRyICVsdSk6ICVsdSIsIG5hdHRyLCBydik7CisJCXJldHVybiAoLTEpOworCX0KKwlpZiAoKHJ2ID0gZi0+Q19GaW5kT2JqZWN0cyhzZXNzaW9uLCBvYmosIDEsICZuZm91bmQpKSAhPSBDS1JfT0sgfHwKKwkgICAgbmZvdW5kICE9IDEpIHsKKwkJZGVidWcoIkNfRmluZE9iamVjdHMgZmFpbGVkIChuZm91bmQgJWx1IG5hdHRyICVsdSk6ICVsdSIsCisJCSAgICBuZm91bmQsIG5hdHRyLCBydik7CisJfSBlbHNlCisJCXJldCA9IDA7CisJaWYgKChydiA9IGYtPkNfRmluZE9iamVjdHNGaW5hbChzZXNzaW9uKSkgIT0gQ0tSX09LKQorCQllcnJvcigiQ19GaW5kT2JqZWN0c0ZpbmFsIGZhaWxlZDogJWx1IiwgcnYpOworCXJldHVybiAocmV0KTsKK30KKworLyogb3BlbnNzbCBjYWxsYmFjayBkb2luZyB0aGUgYWN0dWFsIHNpZ25pbmcgb3BlcmF0aW9uICovCitzdGF0aWMgaW50Citwa2NzMTFfcnNhX3ByaXZhdGVfZW5jcnlwdChpbnQgZmxlbiwgY29uc3QgdV9jaGFyICpmcm9tLCB1X2NoYXIgKnRvLCBSU0EgKnJzYSwKKyAgICBpbnQgcGFkZGluZykKK3sKKwlzdHJ1Y3QgcGtjczExX2tleQkqazExOworCXN0cnVjdCBwa2NzMTFfc2xvdGluZm8JKnNpOworCUNLX0ZVTkNUSU9OX0xJU1QJKmY7CisJQ0tfT0JKRUNUX0hBTkRMRQlvYmo7CisJQ0tfVUxPTkcJCXRsZW4gPSAwOworCUNLX1JWCQkJcnY7CisJQ0tfT0JKRUNUX0NMQVNTCQlwcml2YXRlX2tleV9jbGFzcyA9IENLT19QUklWQVRFX0tFWTsKKwlDS19CQk9PTAkJdHJ1ZV92YWwgPSBDS19UUlVFOworCUNLX01FQ0hBTklTTQkJbWVjaCA9IHsKKwkJQ0tNX1JTQV9QS0NTLCBOVUxMX1BUUiwgMAorCX07CisJQ0tfQVRUUklCVVRFCQlrZXlfZmlsdGVyW10gPSB7CisJCXtDS0FfQ0xBU1MsIE5VTEwsIHNpemVvZihwcml2YXRlX2tleV9jbGFzcykgfSwKKwkJe0NLQV9JRCwgTlVMTCwgMH0sCisJCXtDS0FfU0lHTiwgTlVMTCwgc2l6ZW9mKHRydWVfdmFsKSB9CisJfTsKKwljaGFyCQkJKnBpbiwgcHJvbXB0WzEwMjRdOworCWludAkJCXJ2YWwgPSAtMTsKKworCS8qIHNvbWUgY29tcGlsZXJzIGNvbXBsYWluIGFib3V0IG5vbi1jb25zdGFudCBpbml0aWFsaXplciBzbyB3ZQorCSAgIHVzZSBOVUxMIGluIENLX0FUVFJJQlVURSBhYm92ZSBhbmQgc2V0IHRoZSB2YWx1ZXMgaGVyZSAqLworCWtleV9maWx0ZXJbMF0ucFZhbHVlID0gJnByaXZhdGVfa2V5X2NsYXNzOworCWtleV9maWx0ZXJbMl0ucFZhbHVlID0gJnRydWVfdmFsOworCisJaWYgKChrMTEgPSBSU0FfZ2V0X2FwcF9kYXRhKHJzYSkpID09IE5VTEwpIHsKKwkJZXJyb3IoIlJTQV9nZXRfYXBwX2RhdGEgZmFpbGVkIGZvciByc2EgJXAiLCByc2EpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJaWYgKCFrMTEtPnByb3ZpZGVyIHx8ICFrMTEtPnByb3ZpZGVyLT52YWxpZCkgeworCQllcnJvcigibm8gcGtjczExICh2YWxpZCkgcHJvdmlkZXIgZm9yIHJzYSAlcCIsIHJzYSk7CisJCXJldHVybiAoLTEpOworCX0KKwlmID0gazExLT5wcm92aWRlci0+ZnVuY3Rpb25fbGlzdDsKKwlzaSA9ICZrMTEtPnByb3ZpZGVyLT5zbG90aW5mb1trMTEtPnNsb3RpZHhdOworCWlmICgoc2ktPnRva2VuLmZsYWdzICYgQ0tGX0xPR0lOX1JFUVVJUkVEKSAmJiAhc2ktPmxvZ2dlZF9pbikgeworCQlpZiAoIXBrY3MxMV9pbnRlcmFjdGl2ZSkgeworCQkJZXJyb3IoIm5lZWQgcGluIik7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlzbnByaW50Zihwcm9tcHQsIHNpemVvZihwcm9tcHQpLCAiRW50ZXIgUElOIGZvciAnJXMnOiAiLAorCQkgICAgc2ktPnRva2VuLmxhYmVsKTsKKwkJcGluID0gcmVhZF9wYXNzcGhyYXNlKHByb21wdCwgUlBfQUxMT1dfRU9GKTsKKwkJaWYgKHBpbiA9PSBOVUxMKQorCQkJcmV0dXJuICgtMSk7CS8qIGJhaWwgb3V0ICovCisJCWlmICgocnYgPSBmLT5DX0xvZ2luKHNpLT5zZXNzaW9uLCBDS1VfVVNFUiwgcGluLCBzdHJsZW4ocGluKSkpCisJCSAgICAhPSBDS1JfT0spIHsKKwkJCXhmcmVlKHBpbik7CisJCQllcnJvcigiQ19Mb2dpbiBmYWlsZWQ6ICVsdSIsIHJ2KTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJCXhmcmVlKHBpbik7CisJCXNpLT5sb2dnZWRfaW4gPSAxOworCX0KKwlrZXlfZmlsdGVyWzFdLnBWYWx1ZSA9IGsxMS0+a2V5aWQ7CisJa2V5X2ZpbHRlclsxXS51bFZhbHVlTGVuID0gazExLT5rZXlpZF9sZW47CisJLyogdHJ5IHRvIGZpbmQgb2JqZWN0IHcvQ0tBX1NJR04gZmlyc3QsIHJldHJ5IHcvbyAqLworCWlmIChwa2NzMTFfZmluZChrMTEtPnByb3ZpZGVyLCBrMTEtPnNsb3RpZHgsIGtleV9maWx0ZXIsIDMsICZvYmopIDwgMCAmJgorCSAgICBwa2NzMTFfZmluZChrMTEtPnByb3ZpZGVyLCBrMTEtPnNsb3RpZHgsIGtleV9maWx0ZXIsIDIsICZvYmopIDwgMCkgeworCQllcnJvcigiY2Fubm90IGZpbmQgcHJpdmF0ZSBrZXkiKTsKKwl9IGVsc2UgaWYgKChydiA9IGYtPkNfU2lnbkluaXQoc2ktPnNlc3Npb24sICZtZWNoLCBvYmopKSAhPSBDS1JfT0spIHsKKwkJZXJyb3IoIkNfU2lnbkluaXQgZmFpbGVkOiAlbHUiLCBydik7CisJfSBlbHNlIHsKKwkJLyogWFhYIGhhbmRsZSBDS1JfQlVGRkVSX1RPT19TTUFMTCAqLworCQl0bGVuID0gUlNBX3NpemUocnNhKTsKKwkJcnYgPSBmLT5DX1NpZ24oc2ktPnNlc3Npb24sIChDS19CWVRFICopZnJvbSwgZmxlbiwgdG8sICZ0bGVuKTsKKwkJaWYgKHJ2ID09IENLUl9PSykgCisJCQlydmFsID0gdGxlbjsKKwkJZWxzZSAKKwkJCWVycm9yKCJDX1NpZ24gZmFpbGVkOiAlbHUiLCBydik7CisJfQorCXJldHVybiAocnZhbCk7Cit9CisKK3N0YXRpYyBpbnQKK3BrY3MxMV9yc2FfcHJpdmF0ZV9kZWNyeXB0KGludCBmbGVuLCBjb25zdCB1X2NoYXIgKmZyb20sIHVfY2hhciAqdG8sIFJTQSAqcnNhLAorICAgIGludCBwYWRkaW5nKQoreworCXJldHVybiAoLTEpOworfQorCisvKiByZWRpcmVjdCBwcml2YXRlIGtleSBvcGVyYXRpb25zIGZvciByc2Ega2V5IHRvIHBrY3MxMSB0b2tlbiAqLworc3RhdGljIGludAorcGtjczExX3JzYV93cmFwKHN0cnVjdCBwa2NzMTFfcHJvdmlkZXIgKnByb3ZpZGVyLCBDS19VTE9ORyBzbG90aWR4LAorICAgIENLX0FUVFJJQlVURSAqa2V5aWRfYXR0cmliLCBSU0EgKnJzYSkKK3sKKwlzdHJ1Y3QgcGtjczExX2tleQkqazExOworCWNvbnN0IFJTQV9NRVRIT0QJKmRlZiA9IFJTQV9nZXRfZGVmYXVsdF9tZXRob2QoKTsKKworCWsxMSA9IHhjYWxsb2MoMSwgc2l6ZW9mKCprMTEpKTsKKwlrMTEtPnByb3ZpZGVyID0gcHJvdmlkZXI7CisJcHJvdmlkZXItPnJlZmNvdW50Kys7CS8qIHByb3ZpZGVyIHJlZmVyZW5jZWQgYnkgUlNBIGtleSAqLworCWsxMS0+c2xvdGlkeCA9IHNsb3RpZHg7CisJLyogaWRlbnRpZnkga2V5IG9iamVjdCBvbiBzbWFydGNhcmQgKi8KKwlrMTEtPmtleWlkX2xlbiA9IGtleWlkX2F0dHJpYi0+dWxWYWx1ZUxlbjsKKwlrMTEtPmtleWlkID0geG1hbGxvYyhrMTEtPmtleWlkX2xlbik7CisJbWVtY3B5KGsxMS0+a2V5aWQsIGtleWlkX2F0dHJpYi0+cFZhbHVlLCBrMTEtPmtleWlkX2xlbik7CisJazExLT5vcmlnX2ZpbmlzaCA9IGRlZi0+ZmluaXNoOworCW1lbWNweSgmazExLT5yc2FfbWV0aG9kLCBkZWYsIHNpemVvZihrMTEtPnJzYV9tZXRob2QpKTsKKwlrMTEtPnJzYV9tZXRob2QubmFtZSA9ICJwa2NzMTEiOworCWsxMS0+cnNhX21ldGhvZC5yc2FfcHJpdl9lbmMgPSBwa2NzMTFfcnNhX3ByaXZhdGVfZW5jcnlwdDsKKwlrMTEtPnJzYV9tZXRob2QucnNhX3ByaXZfZGVjID0gcGtjczExX3JzYV9wcml2YXRlX2RlY3J5cHQ7CisJazExLT5yc2FfbWV0aG9kLmZpbmlzaCA9IHBrY3MxMV9yc2FfZmluaXNoOworCVJTQV9zZXRfbWV0aG9kKHJzYSwgJmsxMS0+cnNhX21ldGhvZCk7CisJUlNBX3NldF9hcHBfZGF0YShyc2EsIGsxMSk7CisJcmV0dXJuICgwKTsKK30KKworLyogcmVtb3ZlIHRyYWlsaW5nIHNwYWNlcyAqLworc3RhdGljIHZvaWQKK3Jtc3BhY2UoY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXNpemVfdCBpOworCisJaWYgKCFsZW4pCisJCXJldHVybjsKKwlmb3IgKGkgPSBsZW4gLSAxOyAgaSA+IDA7IGktLSkKKwkJaWYgKGkgPT0gbGVuIC0gMSB8fCBidWZbaV0gPT0gJyAnKQorCQkJYnVmW2ldID0gJ1wwJzsKKwkJZWxzZQorCQkJYnJlYWs7Cit9CisKKy8qCisgKiBvcGVuIGEgcGtjczExIHNlc3Npb24gYW5kIGxvZ2luIGlmIHJlcXVpcmVkLgorICogaWYgcGluID09IE5VTEwgd2UgZGVsYXkgbG9naW4gdW50aWwga2V5IHVzZQorICovCitzdGF0aWMgaW50Citwa2NzMTFfb3Blbl9zZXNzaW9uKHN0cnVjdCBwa2NzMTFfcHJvdmlkZXIgKnAsIENLX1VMT05HIHNsb3RpZHgsIGNoYXIgKnBpbikKK3sKKwlDS19SVgkJCXJ2OworCUNLX0ZVTkNUSU9OX0xJU1QJKmY7CisJQ0tfU0VTU0lPTl9IQU5ETEUJc2Vzc2lvbjsKKwlpbnQJCQlsb2dpbl9yZXF1aXJlZDsKKworCWYgPSBwLT5mdW5jdGlvbl9saXN0OworCWxvZ2luX3JlcXVpcmVkID0gcC0+c2xvdGluZm9bc2xvdGlkeF0udG9rZW4uZmxhZ3MgJiBDS0ZfTE9HSU5fUkVRVUlSRUQ7CisJaWYgKHBpbiAmJiBsb2dpbl9yZXF1aXJlZCAmJiAhc3RybGVuKHBpbikpIHsKKwkJZXJyb3IoInBpbiByZXF1aXJlZCIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJaWYgKChydiA9IGYtPkNfT3BlblNlc3Npb24ocC0+c2xvdGxpc3Rbc2xvdGlkeF0sIENLRl9SV19TRVNTSU9OfAorCSAgICBDS0ZfU0VSSUFMX1NFU1NJT04sIE5VTEwsIE5VTEwsICZzZXNzaW9uKSkKKwkgICAgIT0gQ0tSX09LKSB7CisJCWVycm9yKCJDX09wZW5TZXNzaW9uIGZhaWxlZDogJWx1IiwgcnYpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJaWYgKGxvZ2luX3JlcXVpcmVkICYmIHBpbikgeworCQlpZiAoKHJ2ID0gZi0+Q19Mb2dpbihzZXNzaW9uLCBDS1VfVVNFUiwgcGluLCBzdHJsZW4ocGluKSkpCisJCSAgICAhPSBDS1JfT0spIHsKKwkJCWVycm9yKCJDX0xvZ2luIGZhaWxlZDogJWx1IiwgcnYpOworCQkJaWYgKChydiA9IGYtPkNfQ2xvc2VTZXNzaW9uKHNlc3Npb24pKSAhPSBDS1JfT0spCisJCQkJZXJyb3IoIkNfQ2xvc2VTZXNzaW9uIGZhaWxlZDogJWx1IiwgcnYpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJcC0+c2xvdGluZm9bc2xvdGlkeF0ubG9nZ2VkX2luID0gMTsKKwl9CisJcC0+c2xvdGluZm9bc2xvdGlkeF0uc2Vzc2lvbiA9IHNlc3Npb247CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIGxvb2t1cCBwdWJsaWMga2V5cyBmb3IgdG9rZW4gaW4gc2xvdCBpZGVudGlmaWVkIGJ5IHNsb3RpZHgsCisgKiBhZGQgJ3dyYXBwZWQnIHB1YmxpYyBrZXlzIHRvIHRoZSAna2V5c3AnIGFycmF5IGFuZCBpbmNyZW1lbnQgbmtleXMuCisgKiBrZXlzcCBwb2ludHMgdG8gYW4gKHBvc3NpYmx5IGVtcHR5KSBhcnJheSB3aXRoICpua2V5cyBrZXlzLgorICovCitzdGF0aWMgaW50Citwa2NzMTFfZmV0Y2hfa2V5cyhzdHJ1Y3QgcGtjczExX3Byb3ZpZGVyICpwLCBDS19VTE9ORyBzbG90aWR4LCBLZXkgKioqa2V5c3AsCisgICAgaW50ICpua2V5cykKK3sKKwlLZXkJCQkqa2V5OworCVJTQQkJCSpyc2E7CisJaW50CQkJaTsKKwlDS19SVgkJCXJ2OworCUNLX09CSkVDVF9IQU5ETEUJb2JqOworCUNLX1VMT05HCQluZm91bmQ7CisJQ0tfU0VTU0lPTl9IQU5ETEUJc2Vzc2lvbjsKKwlDS19GVU5DVElPTl9MSVNUCSpmOworCUNLX09CSkVDVF9DTEFTUwkJcHVia2V5X2NsYXNzID0gQ0tPX1BVQkxJQ19LRVk7CisJQ0tfQVRUUklCVVRFCQlwdWJrZXlfZmlsdGVyW10gPSB7CisJCXsgQ0tBX0NMQVNTLCBOVUxMLCBzaXplb2YocHVia2V5X2NsYXNzKSB9CisJfTsKKwlDS19BVFRSSUJVVEUJCWF0dHJpYnNbXSA9IHsKKwkJeyBDS0FfSUQsIE5VTEwsIDAgfSwKKwkJeyBDS0FfTU9EVUxVUywgTlVMTCwgMCB9LAorCQl7IENLQV9QVUJMSUNfRVhQT05FTlQsIE5VTEwsIDAgfQorCX07CisKKwkvKiBzb21lIGNvbXBpbGVycyBjb21wbGFpbiBhYm91dCBub24tY29uc3RhbnQgaW5pdGlhbGl6ZXIgc28gd2UKKwkgICB1c2UgTlVMTCBpbiBDS19BVFRSSUJVVEUgYWJvdmUgYW5kIHNldCB0aGUgdmFsdWUgaGVyZSAqLworCXB1YmtleV9maWx0ZXJbMF0ucFZhbHVlID0gJnB1YmtleV9jbGFzczsKKworCWYgPSBwLT5mdW5jdGlvbl9saXN0OworCXNlc3Npb24gPSBwLT5zbG90aW5mb1tzbG90aWR4XS5zZXNzaW9uOworCS8qIHNldHVwIGEgZmlsdGVyIHRoZSBsb29rcyBmb3IgcHVibGljIGtleXMgKi8KKwlpZiAoKHJ2ID0gZi0+Q19GaW5kT2JqZWN0c0luaXQoc2Vzc2lvbiwgcHVia2V5X2ZpbHRlciwgMSkpICE9IENLUl9PSykgeworCQllcnJvcigiQ19GaW5kT2JqZWN0c0luaXQgZmFpbGVkOiAlbHUiLCBydik7CisJCXJldHVybiAoLTEpOworCX0KKwl3aGlsZSAoMSkgeworCQkvKiBYWFggMyBhdHRyaWJ1dGVzIGluIGF0dHJpYnNbXSAqLworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlhdHRyaWJzW2ldLnBWYWx1ZSA9IE5VTEw7CisJCQlhdHRyaWJzW2ldLnVsVmFsdWVMZW4gPSAwOworCQl9CisJCWlmICgocnYgPSBmLT5DX0ZpbmRPYmplY3RzKHNlc3Npb24sICZvYmosIDEsICZuZm91bmQpKSAhPSBDS1JfT0sKKwkJICAgIHx8IG5mb3VuZCA9PSAwKQorCQkJYnJlYWs7CisJCS8qIGZvdW5kIGEga2V5LCBzbyBmaWd1cmUgb3V0IHNpemUgb2YgdGhlIGF0dHJpYnV0ZXMgKi8KKwkJaWYgKChydiA9IGYtPkNfR2V0QXR0cmlidXRlVmFsdWUoc2Vzc2lvbiwgb2JqLCBhdHRyaWJzLCAzKSkKKwkJICAgICE9IENLUl9PSykgeworCQkJZXJyb3IoIkNfR2V0QXR0cmlidXRlVmFsdWUgZmFpbGVkOiAlbHUiLCBydik7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBjaGVjayB0aGF0IG5vbmUgb2YgdGhlIGF0dHJpYnV0ZXMgYXJlIHplcm8gbGVuZ3RoICovCisJCWlmIChhdHRyaWJzWzBdLnVsVmFsdWVMZW4gPT0gMCB8fAorCQkgICAgYXR0cmlic1sxXS51bFZhbHVlTGVuID09IDAgfHwKKwkJICAgIGF0dHJpYnNbMl0udWxWYWx1ZUxlbiA9PSAwKSB7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBhbGxvY2F0ZSBidWZmZXJzIGZvciBhdHRyaWJ1dGVzICovCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQlhdHRyaWJzW2ldLnBWYWx1ZSA9IHhtYWxsb2MoYXR0cmlic1tpXS51bFZhbHVlTGVuKTsKKwkJLyogcmV0cmlldmUgSUQsIG1vZHVsdXMgYW5kIHB1YmxpYyBleHBvbmVudCBvZiBSU0Ega2V5ICovCisJCWlmICgocnYgPSBmLT5DX0dldEF0dHJpYnV0ZVZhbHVlKHNlc3Npb24sIG9iaiwgYXR0cmlicywgMykpCisJCSAgICAhPSBDS1JfT0spIHsKKwkJCWVycm9yKCJDX0dldEF0dHJpYnV0ZVZhbHVlIGZhaWxlZDogJWx1IiwgcnYpOworCQl9IGVsc2UgaWYgKChyc2EgPSBSU0FfbmV3KCkpID09IE5VTEwpIHsKKwkJCWVycm9yKCJSU0FfbmV3IGZhaWxlZCIpOworCQl9IGVsc2UgeworCQkJcnNhLT5uID0gQk5fYmluMmJuKGF0dHJpYnNbMV0ucFZhbHVlLAorCQkJICAgIGF0dHJpYnNbMV0udWxWYWx1ZUxlbiwgTlVMTCk7CisJCQlyc2EtPmUgPSBCTl9iaW4yYm4oYXR0cmlic1syXS5wVmFsdWUsCisJCQkgICAgYXR0cmlic1syXS51bFZhbHVlTGVuLCBOVUxMKTsKKwkJCWlmIChyc2EtPm4gJiYgcnNhLT5lICYmCisJCQkgICAgcGtjczExX3JzYV93cmFwKHAsIHNsb3RpZHgsICZhdHRyaWJzWzBdLCByc2EpID09IDApIHsKKwkJCQlrZXkgPSBrZXlfbmV3KEtFWV9VTlNQRUMpOworCQkJCWtleS0+cnNhID0gcnNhOworCQkJCWtleS0+dHlwZSA9IEtFWV9SU0E7CisJCQkJa2V5LT5mbGFncyB8PSBLRVlfRkxBR19FWFQ7CisJCQkJLyogZXhwYW5kIGtleSBhcnJheSBhbmQgYWRkIGtleSAqLworCQkJCSprZXlzcCA9IHhyZWFsbG9jKCprZXlzcCwgKm5rZXlzICsgMSwKKwkJCQkgICAgc2l6ZW9mKEtleSAqKSk7CisJCQkJKCprZXlzcClbKm5rZXlzXSA9IGtleTsKKwkJCQkqbmtleXMgPSAqbmtleXMgKyAxOworCQkJCWRlYnVnKCJoYXZlICVkIGtleXMiLCAqbmtleXMpOworCQkJfSBlbHNlIHsKKwkJCQlSU0FfZnJlZShyc2EpOworCQkJfQorCQl9CisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQl4ZnJlZShhdHRyaWJzW2ldLnBWYWx1ZSk7CisJfQorCWlmICgocnYgPSBmLT5DX0ZpbmRPYmplY3RzRmluYWwoc2Vzc2lvbikpICE9IENLUl9PSykKKwkJZXJyb3IoIkNfRmluZE9iamVjdHNGaW5hbCBmYWlsZWQ6ICVsdSIsIHJ2KTsKKwlyZXR1cm4gKDApOworfQorCisvKiByZWdpc3RlciBhIG5ldyBwcm92aWRlciwgZmFpbHMgaWYgcHJvdmlkZXIgYWxyZWFkeSBleGlzdHMgKi8KK2ludAorcGtjczExX2FkZF9wcm92aWRlcihjaGFyICpwcm92aWRlcl9pZCwgY2hhciAqcGluLCBLZXkgKioqa2V5cCkKK3sKKwlpbnQgbmtleXMsIG5lZWRfZmluYWxpemUgPSAwOworCXN0cnVjdCBwa2NzMTFfcHJvdmlkZXIgKnAgPSBOVUxMOworCXZvaWQgKmhhbmRsZSA9IE5VTEw7CisJQ0tfUlYgKCpnZXRmdW5jdGlvbmxpc3QpKENLX0ZVTkNUSU9OX0xJU1QgKiopOworCUNLX1JWIHJ2OworCUNLX0ZVTkNUSU9OX0xJU1QgKmYgPSBOVUxMOworCUNLX1RPS0VOX0lORk8gKnRva2VuOworCUNLX1VMT05HIGk7CisKKwkqa2V5cCA9IE5VTEw7CisJaWYgKHBrY3MxMV9wcm92aWRlcl9sb29rdXAocHJvdmlkZXJfaWQpICE9IE5VTEwpIHsKKwkJZXJyb3IoInByb3ZpZGVyIGFscmVhZHkgcmVnaXN0ZXJlZDogJXMiLCBwcm92aWRlcl9pZCk7CisJCWdvdG8gZmFpbDsKKwl9CisJLyogb3BlbiBzaGFyZWQgcGtjczExLWxpYmFyYXJ5ICovCisJaWYgKChoYW5kbGUgPSBkbG9wZW4ocHJvdmlkZXJfaWQsIFJUTERfTk9XKSkgPT0gTlVMTCkgeworCQllcnJvcigiZGxvcGVuICVzIGZhaWxlZDogJXMiLCBwcm92aWRlcl9pZCwgZGxlcnJvcigpKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAoKGdldGZ1bmN0aW9ubGlzdCA9IGRsc3ltKGhhbmRsZSwgIkNfR2V0RnVuY3Rpb25MaXN0IikpID09IE5VTEwpIHsKKwkJZXJyb3IoImRsc3ltKENfR2V0RnVuY3Rpb25MaXN0KSBmYWlsZWQ6ICVzIiwgZGxlcnJvcigpKTsKKwkJZ290byBmYWlsOworCX0KKwlwID0geGNhbGxvYygxLCBzaXplb2YoKnApKTsKKwlwLT5uYW1lID0geHN0cmR1cChwcm92aWRlcl9pZCk7CisJcC0+aGFuZGxlID0gaGFuZGxlOworCS8qIHNldHVwIHRoZSBwa2NzMTEgY2FsbGJhY2tzICovCisJaWYgKChydiA9ICgqZ2V0ZnVuY3Rpb25saXN0KSgmZikpICE9IENLUl9PSykgeworCQllcnJvcigiQ19HZXRGdW5jdGlvbkxpc3QgZmFpbGVkOiAlbHUiLCBydik7CisJCWdvdG8gZmFpbDsKKwl9CisJcC0+ZnVuY3Rpb25fbGlzdCA9IGY7CisJaWYgKChydiA9IGYtPkNfSW5pdGlhbGl6ZShOVUxMKSkgIT0gQ0tSX09LKSB7CisJCWVycm9yKCJDX0luaXRpYWxpemUgZmFpbGVkOiAlbHUiLCBydik7CisJCWdvdG8gZmFpbDsKKwl9CisJbmVlZF9maW5hbGl6ZSA9IDE7CisJaWYgKChydiA9IGYtPkNfR2V0SW5mbygmcC0+aW5mbykpICE9IENLUl9PSykgeworCQllcnJvcigiQ19HZXRJbmZvIGZhaWxlZDogJWx1IiwgcnYpOworCQlnb3RvIGZhaWw7CisJfQorCXJtc3BhY2UocC0+aW5mby5tYW51ZmFjdHVyZXJJRCwgc2l6ZW9mKHAtPmluZm8ubWFudWZhY3R1cmVySUQpKTsKKwlybXNwYWNlKHAtPmluZm8ubGlicmFyeURlc2NyaXB0aW9uLCBzaXplb2YocC0+aW5mby5saWJyYXJ5RGVzY3JpcHRpb24pKTsKKwlkZWJ1ZygibWFudWZhY3R1cmVySUQgPCVzPiBjcnlwdG9raVZlcnNpb24gJWQuJWQiCisJICAgICIgbGlicmFyeURlc2NyaXB0aW9uIDwlcz4gbGlicmFyeVZlcnNpb24gJWQuJWQiLAorCSAgICBwLT5pbmZvLm1hbnVmYWN0dXJlcklELAorCSAgICBwLT5pbmZvLmNyeXB0b2tpVmVyc2lvbi5tYWpvciwKKwkgICAgcC0+aW5mby5jcnlwdG9raVZlcnNpb24ubWlub3IsCisJICAgIHAtPmluZm8ubGlicmFyeURlc2NyaXB0aW9uLAorCSAgICBwLT5pbmZvLmxpYnJhcnlWZXJzaW9uLm1ham9yLAorCSAgICBwLT5pbmZvLmxpYnJhcnlWZXJzaW9uLm1pbm9yKTsKKwlpZiAoKHJ2ID0gZi0+Q19HZXRTbG90TGlzdChDS19UUlVFLCBOVUxMLCAmcC0+bnNsb3RzKSkgIT0gQ0tSX09LKSB7CisJCWVycm9yKCJDX0dldFNsb3RMaXN0IGZhaWxlZDogJWx1IiwgcnYpOworCQlnb3RvIGZhaWw7CisJfQorCWlmIChwLT5uc2xvdHMgPT0gMCkgeworCQllcnJvcigibm8gc2xvdHMiKTsKKwkJZ290byBmYWlsOworCX0KKwlwLT5zbG90bGlzdCA9IHhjYWxsb2MocC0+bnNsb3RzLCBzaXplb2YoQ0tfU0xPVF9JRCkpOworCWlmICgocnYgPSBmLT5DX0dldFNsb3RMaXN0KENLX1RSVUUsIHAtPnNsb3RsaXN0LCAmcC0+bnNsb3RzKSkKKwkgICAgIT0gQ0tSX09LKSB7CisJCWVycm9yKCJDX0dldFNsb3RMaXN0IGZhaWxlZDogJWx1IiwgcnYpOworCQlnb3RvIGZhaWw7CisJfQorCXAtPnNsb3RpbmZvID0geGNhbGxvYyhwLT5uc2xvdHMsIHNpemVvZihzdHJ1Y3QgcGtjczExX3Nsb3RpbmZvKSk7CisJcC0+dmFsaWQgPSAxOworCW5rZXlzID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgcC0+bnNsb3RzOyBpKyspIHsKKwkJdG9rZW4gPSAmcC0+c2xvdGluZm9baV0udG9rZW47CisJCWlmICgocnYgPSBmLT5DX0dldFRva2VuSW5mbyhwLT5zbG90bGlzdFtpXSwgdG9rZW4pKQorCQkgICAgIT0gQ0tSX09LKSB7CisJCQllcnJvcigiQ19HZXRUb2tlbkluZm8gZmFpbGVkOiAlbHUiLCBydik7CisJCQljb250aW51ZTsKKwkJfQorCQlybXNwYWNlKHRva2VuLT5sYWJlbCwgc2l6ZW9mKHRva2VuLT5sYWJlbCkpOworCQlybXNwYWNlKHRva2VuLT5tYW51ZmFjdHVyZXJJRCwgc2l6ZW9mKHRva2VuLT5tYW51ZmFjdHVyZXJJRCkpOworCQlybXNwYWNlKHRva2VuLT5tb2RlbCwgc2l6ZW9mKHRva2VuLT5tb2RlbCkpOworCQlybXNwYWNlKHRva2VuLT5zZXJpYWxOdW1iZXIsIHNpemVvZih0b2tlbi0+c2VyaWFsTnVtYmVyKSk7CisJCWRlYnVnKCJsYWJlbCA8JXM+IG1hbnVmYWN0dXJlcklEIDwlcz4gbW9kZWwgPCVzPiBzZXJpYWwgPCVzPiIKKwkJICAgICIgZmxhZ3MgMHglbHgiLAorCQkgICAgdG9rZW4tPmxhYmVsLCB0b2tlbi0+bWFudWZhY3R1cmVySUQsIHRva2VuLT5tb2RlbCwKKwkJICAgIHRva2VuLT5zZXJpYWxOdW1iZXIsIHRva2VuLT5mbGFncyk7CisJCS8qIG9wZW4gc2Vzc2lvbiwgbG9naW4gd2l0aCBwaW4gYW5kIHJldHJpZXZlIHB1YmxpYyBrZXlzICovCisJCWlmIChwa2NzMTFfb3Blbl9zZXNzaW9uKHAsIGksIHBpbikgPT0gMCkKKwkJCXBrY3MxMV9mZXRjaF9rZXlzKHAsIGksIGtleXAsICZua2V5cyk7CisJfQorCWlmIChua2V5cyA+IDApIHsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJnBrY3MxMV9wcm92aWRlcnMsIHAsIG5leHQpOworCQlwLT5yZWZjb3VudCsrOwkvKiBhZGQgdG8gcHJvdmlkZXIgbGlzdCAqLworCQlyZXR1cm4gKG5rZXlzKTsKKwl9CisJZXJyb3IoIm5vIGtleXMiKTsKKwkvKiBkb24ndCBhZGQgdGhlIHByb3ZpZGVyLCBzaW5jZSBpdCBkb2VzIG5vdCBoYXZlIGFueSBrZXlzICovCitmYWlsOgorCWlmIChuZWVkX2ZpbmFsaXplICYmIChydiA9IGYtPkNfRmluYWxpemUoTlVMTCkpICE9IENLUl9PSykKKwkJZXJyb3IoIkNfRmluYWxpemUgZmFpbGVkOiAlbHUiLCBydik7CisJaWYgKHApIHsKKwkJaWYgKHAtPnNsb3RsaXN0KQorCQkJeGZyZWUocC0+c2xvdGxpc3QpOworCQlpZiAocC0+c2xvdGluZm8pCisJCQl4ZnJlZShwLT5zbG90aW5mbyk7CisJCXhmcmVlKHApOworCX0KKwlpZiAoaGFuZGxlKQorCQlkbGNsb3NlKGhhbmRsZSk7CisJcmV0dXJuICgtMSk7Cit9CisKKyNlbHNlCisKK2ludAorcGtjczExX2luaXQoaW50IGludGVyYWN0aXZlKQoreworCXJldHVybiAoMCk7Cit9CisKK3ZvaWQKK3BrY3MxMV90ZXJtaW5hdGUodm9pZCkKK3sKKwlyZXR1cm47Cit9CisKKyNlbmRpZiAvKiBFTkFCTEVfUEtDUzExICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NzaC1wa2NzMTEuaCBiL29wZW5zc2gtNi4wcDEvc3NoLXBrY3MxMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZjQ1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NzaC1wa2NzMTEuaApAQCAtMCwwICsxLDIwIEBACisvKiAkT3BlbkJTRDogc3NoLXBrY3MxMS5oLHYgMS4yIDIwMTAvMDIvMjQgMDY6MTI6NTMgZGptIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCitpbnQJcGtjczExX2luaXQoaW50KTsKK3ZvaWQJcGtjczExX3Rlcm1pbmF0ZSh2b2lkKTsKK2ludAlwa2NzMTFfYWRkX3Byb3ZpZGVyKGNoYXIgKiwgY2hhciAqLCBLZXkgKioqKTsKK2ludAlwa2NzMTFfZGVsX3Byb3ZpZGVyKGNoYXIgKik7CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NzaC1yc2EuYyBiL29wZW5zc2gtNi4wcDEvc3NoLXJzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MzU1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NzaC1yc2EuYwpAQCAtMCwwICsxLDI2OCBAQAorLyogJE9wZW5CU0Q6IHNzaC1yc2EuYyx2IDEuNDUgMjAxMC8wOC8zMSAwOTo1ODozNyBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgTWFya3VzIEZyaWVkbCA8bWFya3VzQG9wZW5ic2Qub3JnPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJjb21wYXQuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAic3NoLmgiCisKK3N0YXRpYyBpbnQgb3BlbnNzaF9SU0FfdmVyaWZ5KGludCwgdV9jaGFyICosIHVfaW50LCB1X2NoYXIgKiwgdV9pbnQsIFJTQSAqKTsKKworLyogUlNBU1NBLVBLQ1MxLXYxXzUgKFBLQ1MgIzEgdjIuMCBzaWduYXR1cmUpIHdpdGggU0hBMSAqLworaW50Citzc2hfcnNhX3NpZ24oY29uc3QgS2V5ICprZXksIHVfY2hhciAqKnNpZ3AsIHVfaW50ICpsZW5wLAorICAgIGNvbnN0IHVfY2hhciAqZGF0YSwgdV9pbnQgZGF0YWxlbikKK3sKKwljb25zdCBFVlBfTUQgKmV2cF9tZDsKKwlFVlBfTURfQ1RYIG1kOworCXVfY2hhciBkaWdlc3RbRVZQX01BWF9NRF9TSVpFXSwgKnNpZzsKKwl1X2ludCBzbGVuLCBkbGVuLCBsZW47CisJaW50IG9rLCBuaWQ7CisJQnVmZmVyIGI7CisKKwlpZiAoa2V5ID09IE5VTEwgfHwga2V5LT5yc2EgPT0gTlVMTCB8fCAoa2V5LT50eXBlICE9IEtFWV9SU0EgJiYKKwkgICAga2V5LT50eXBlICE9IEtFWV9SU0FfQ0VSVCAmJiBrZXktPnR5cGUgIT0gS0VZX1JTQV9DRVJUX1YwMCkpIHsKKwkJZXJyb3IoInNzaF9yc2Ffc2lnbjogbm8gUlNBIGtleSIpOworCQlyZXR1cm4gLTE7CisJfQorCW5pZCA9IChkYXRhZmVsbG93cyAmIFNTSF9CVUdfUlNBU0lHTUQ1KSA/IE5JRF9tZDUgOiBOSURfc2hhMTsKKwlpZiAoKGV2cF9tZCA9IEVWUF9nZXRfZGlnZXN0YnluaWQobmlkKSkgPT0gTlVMTCkgeworCQllcnJvcigic3NoX3JzYV9zaWduOiBFVlBfZ2V0X2RpZ2VzdGJ5bmlkICVkIGZhaWxlZCIsIG5pZCk7CisJCXJldHVybiAtMTsKKwl9CisJRVZQX0RpZ2VzdEluaXQoJm1kLCBldnBfbWQpOworCUVWUF9EaWdlc3RVcGRhdGUoJm1kLCBkYXRhLCBkYXRhbGVuKTsKKwlFVlBfRGlnZXN0RmluYWwoJm1kLCBkaWdlc3QsICZkbGVuKTsKKworCXNsZW4gPSBSU0Ffc2l6ZShrZXktPnJzYSk7CisJc2lnID0geG1hbGxvYyhzbGVuKTsKKworCW9rID0gUlNBX3NpZ24obmlkLCBkaWdlc3QsIGRsZW4sIHNpZywgJmxlbiwga2V5LT5yc2EpOworCW1lbXNldChkaWdlc3QsICdkJywgc2l6ZW9mKGRpZ2VzdCkpOworCisJaWYgKG9rICE9IDEpIHsKKwkJaW50IGVjb2RlID0gRVJSX2dldF9lcnJvcigpOworCisJCWVycm9yKCJzc2hfcnNhX3NpZ246IFJTQV9zaWduIGZhaWxlZDogJXMiLAorCQkgICAgRVJSX2Vycm9yX3N0cmluZyhlY29kZSwgTlVMTCkpOworCQl4ZnJlZShzaWcpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChsZW4gPCBzbGVuKSB7CisJCXVfaW50IGRpZmYgPSBzbGVuIC0gbGVuOworCQlkZWJ1Zygic2xlbiAldSA+IGxlbiAldSIsIHNsZW4sIGxlbik7CisJCW1lbW1vdmUoc2lnICsgZGlmZiwgc2lnLCBsZW4pOworCQltZW1zZXQoc2lnLCAwLCBkaWZmKTsKKwl9IGVsc2UgaWYgKGxlbiA+IHNsZW4pIHsKKwkJZXJyb3IoInNzaF9yc2Ffc2lnbjogc2xlbiAldSBzbGVuMiAldSIsIHNsZW4sIGxlbik7CisJCXhmcmVlKHNpZyk7CisJCXJldHVybiAtMTsKKwl9CisJLyogZW5jb2RlIHNpZ25hdHVyZSAqLworCWJ1ZmZlcl9pbml0KCZiKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcoJmIsICJzc2gtcnNhIik7CisJYnVmZmVyX3B1dF9zdHJpbmcoJmIsIHNpZywgc2xlbik7CisJbGVuID0gYnVmZmVyX2xlbigmYik7CisJaWYgKGxlbnAgIT0gTlVMTCkKKwkJKmxlbnAgPSBsZW47CisJaWYgKHNpZ3AgIT0gTlVMTCkgeworCQkqc2lncCA9IHhtYWxsb2MobGVuKTsKKwkJbWVtY3B5KCpzaWdwLCBidWZmZXJfcHRyKCZiKSwgbGVuKTsKKwl9CisJYnVmZmVyX2ZyZWUoJmIpOworCW1lbXNldChzaWcsICdzJywgc2xlbik7CisJeGZyZWUoc2lnKTsKKworCXJldHVybiAwOworfQorCitpbnQKK3NzaF9yc2FfdmVyaWZ5KGNvbnN0IEtleSAqa2V5LCBjb25zdCB1X2NoYXIgKnNpZ25hdHVyZSwgdV9pbnQgc2lnbmF0dXJlbGVuLAorICAgIGNvbnN0IHVfY2hhciAqZGF0YSwgdV9pbnQgZGF0YWxlbikKK3sKKwlCdWZmZXIgYjsKKwljb25zdCBFVlBfTUQgKmV2cF9tZDsKKwlFVlBfTURfQ1RYIG1kOworCWNoYXIgKmt0eXBlOworCXVfY2hhciBkaWdlc3RbRVZQX01BWF9NRF9TSVpFXSwgKnNpZ2Jsb2I7CisJdV9pbnQgbGVuLCBkbGVuLCBtb2RsZW47CisJaW50IHJsZW4sIHJldCwgbmlkOworCisJaWYgKGtleSA9PSBOVUxMIHx8IGtleS0+cnNhID09IE5VTEwgfHwgKGtleS0+dHlwZSAhPSBLRVlfUlNBICYmCisJICAgIGtleS0+dHlwZSAhPSBLRVlfUlNBX0NFUlQgJiYga2V5LT50eXBlICE9IEtFWV9SU0FfQ0VSVF9WMDApKSB7CisJCWVycm9yKCJzc2hfcnNhX3ZlcmlmeTogbm8gUlNBIGtleSIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChCTl9udW1fYml0cyhrZXktPnJzYS0+bikgPCBTU0hfUlNBX01JTklNVU1fTU9EVUxVU19TSVpFKSB7CisJCWVycm9yKCJzc2hfcnNhX3ZlcmlmeTogUlNBIG1vZHVsdXMgdG9vIHNtYWxsOiAlZCA8IG1pbmltdW0gJWQgYml0cyIsCisJCSAgICBCTl9udW1fYml0cyhrZXktPnJzYS0+biksIFNTSF9SU0FfTUlOSU1VTV9NT0RVTFVTX1NJWkUpOworCQlyZXR1cm4gLTE7CisJfQorCWJ1ZmZlcl9pbml0KCZiKTsKKwlidWZmZXJfYXBwZW5kKCZiLCBzaWduYXR1cmUsIHNpZ25hdHVyZWxlbik7CisJa3R5cGUgPSBidWZmZXJfZ2V0X2NzdHJpbmcoJmIsIE5VTEwpOworCWlmIChzdHJjbXAoInNzaC1yc2EiLCBrdHlwZSkgIT0gMCkgeworCQllcnJvcigic3NoX3JzYV92ZXJpZnk6IGNhbm5vdCBoYW5kbGUgdHlwZSAlcyIsIGt0eXBlKTsKKwkJYnVmZmVyX2ZyZWUoJmIpOworCQl4ZnJlZShrdHlwZSk7CisJCXJldHVybiAtMTsKKwl9CisJeGZyZWUoa3R5cGUpOworCXNpZ2Jsb2IgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgJmxlbik7CisJcmxlbiA9IGJ1ZmZlcl9sZW4oJmIpOworCWJ1ZmZlcl9mcmVlKCZiKTsKKwlpZiAocmxlbiAhPSAwKSB7CisJCWVycm9yKCJzc2hfcnNhX3ZlcmlmeTogcmVtYWluaW5nIGJ5dGVzIGluIHNpZ25hdHVyZSAlZCIsIHJsZW4pOworCQl4ZnJlZShzaWdibG9iKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvKiBSU0FfdmVyaWZ5IGV4cGVjdHMgYSBzaWduYXR1cmUgb2YgUlNBX3NpemUgKi8KKwltb2RsZW4gPSBSU0Ffc2l6ZShrZXktPnJzYSk7CisJaWYgKGxlbiA+IG1vZGxlbikgeworCQllcnJvcigic3NoX3JzYV92ZXJpZnk6IGxlbiAldSA+IG1vZGxlbiAldSIsIGxlbiwgbW9kbGVuKTsKKwkJeGZyZWUoc2lnYmxvYik7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgaWYgKGxlbiA8IG1vZGxlbikgeworCQl1X2ludCBkaWZmID0gbW9kbGVuIC0gbGVuOworCQlkZWJ1Zygic3NoX3JzYV92ZXJpZnk6IGFkZCBwYWRkaW5nOiBtb2RsZW4gJXUgPiBsZW4gJXUiLAorCQkgICAgbW9kbGVuLCBsZW4pOworCQlzaWdibG9iID0geHJlYWxsb2Moc2lnYmxvYiwgMSwgbW9kbGVuKTsKKwkJbWVtbW92ZShzaWdibG9iICsgZGlmZiwgc2lnYmxvYiwgbGVuKTsKKwkJbWVtc2V0KHNpZ2Jsb2IsIDAsIGRpZmYpOworCQlsZW4gPSBtb2RsZW47CisJfQorCW5pZCA9IChkYXRhZmVsbG93cyAmIFNTSF9CVUdfUlNBU0lHTUQ1KSA/IE5JRF9tZDUgOiBOSURfc2hhMTsKKwlpZiAoKGV2cF9tZCA9IEVWUF9nZXRfZGlnZXN0YnluaWQobmlkKSkgPT0gTlVMTCkgeworCQllcnJvcigic3NoX3JzYV92ZXJpZnk6IEVWUF9nZXRfZGlnZXN0YnluaWQgJWQgZmFpbGVkIiwgbmlkKTsKKwkJeGZyZWUoc2lnYmxvYik7CisJCXJldHVybiAtMTsKKwl9CisJRVZQX0RpZ2VzdEluaXQoJm1kLCBldnBfbWQpOworCUVWUF9EaWdlc3RVcGRhdGUoJm1kLCBkYXRhLCBkYXRhbGVuKTsKKwlFVlBfRGlnZXN0RmluYWwoJm1kLCBkaWdlc3QsICZkbGVuKTsKKworCXJldCA9IG9wZW5zc2hfUlNBX3ZlcmlmeShuaWQsIGRpZ2VzdCwgZGxlbiwgc2lnYmxvYiwgbGVuLCBrZXktPnJzYSk7CisJbWVtc2V0KGRpZ2VzdCwgJ2QnLCBzaXplb2YoZGlnZXN0KSk7CisJbWVtc2V0KHNpZ2Jsb2IsICdzJywgbGVuKTsKKwl4ZnJlZShzaWdibG9iKTsKKwlkZWJ1Zygic3NoX3JzYV92ZXJpZnk6IHNpZ25hdHVyZSAlc2NvcnJlY3QiLCAocmV0PT0wKSA/ICJpbiIgOiAiIik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFNlZToKKyAqIGh0dHA6Ly93d3cucnNhc2VjdXJpdHkuY29tL3JzYWxhYnMvcGtjcy9wa2NzLTEvCisgKiBmdHA6Ly9mdHAucnNhc2VjdXJpdHkuY29tL3B1Yi9wa2NzL3BrY3MtMS9wa2NzLTF2Mi0xLmFzbgorICovCisvKgorICogaWQtc2hhMSBPQkpFQ1QgSURFTlRJRklFUiA6Oj0geyBpc28oMSkgaWRlbnRpZmllZC1vcmdhbml6YXRpb24oMykKKyAqCW9pdygxNCkgc2Vjc2lnKDMpIGFsZ29yaXRobXMoMikgMjYgfQorICovCitzdGF0aWMgY29uc3QgdV9jaGFyIGlkX3NoYTFbXSA9IHsKKwkweDMwLCAweDIxLCAvKiB0eXBlIFNlcXVlbmNlLCBsZW5ndGggMHgyMSAoMzMpICovCisJMHgzMCwgMHgwOSwgLyogdHlwZSBTZXF1ZW5jZSwgbGVuZ3RoIDB4MDkgKi8KKwkweDA2LCAweDA1LCAvKiB0eXBlIE9JRCwgbGVuZ3RoIDB4MDUgKi8KKwkweDJiLCAweDBlLCAweDAzLCAweDAyLCAweDFhLCAvKiBpZC1zaGExIE9JRCAqLworCTB4MDUsIDB4MDAsIC8qIE5VTEwgKi8KKwkweDA0LCAweDE0ICAvKiBPY3RldCBzdHJpbmcsIGxlbmd0aCAweDE0ICgyMCksIGZvbGxvd2VkIGJ5IHNoYTEgaGFzaCAqLworfTsKKy8qCisgKiBpZC1tZDUgT0JKRUNUIElERU5USUZJRVIgOjo9IHsgaXNvKDEpIG1lbWJlci1ib2R5KDIpIHVzKDg0MCkKKyAqCXJzYWRzaSgxMTM1NDkpIGRpZ2VzdEFsZ29yaXRobSgyKSA1IH0KKyAqLworc3RhdGljIGNvbnN0IHVfY2hhciBpZF9tZDVbXSA9IHsKKwkweDMwLCAweDIwLCAvKiB0eXBlIFNlcXVlbmNlLCBsZW5ndGggMHgyMCAoMzIpICovCisJMHgzMCwgMHgwYywgLyogdHlwZSBTZXF1ZW5jZSwgbGVuZ3RoIDB4MDkgKi8KKwkweDA2LCAweDA4LCAvKiB0eXBlIE9JRCwgbGVuZ3RoIDB4MDUgKi8KKwkweDJhLCAweDg2LCAweDQ4LCAweDg2LCAweEY3LCAweDBELCAweDAyLCAweDA1LCAvKiBpZC1tZDUgKi8KKwkweDA1LCAweDAwLCAvKiBOVUxMICovCisJMHgwNCwgMHgxMCAgLyogT2N0ZXQgc3RyaW5nLCBsZW5ndGggMHgxMCAoMTYpLCBmb2xsb3dlZCBieSBtZDUgaGFzaCAqLworfTsKKworc3RhdGljIGludAorb3BlbnNzaF9SU0FfdmVyaWZ5KGludCB0eXBlLCB1X2NoYXIgKmhhc2gsIHVfaW50IGhhc2hsZW4sCisgICAgdV9jaGFyICpzaWdidWYsIHVfaW50IHNpZ2xlbiwgUlNBICpyc2EpCit7CisJdV9pbnQgcmV0LCByc2FzaXplLCBvaWRsZW4gPSAwLCBobGVuID0gMDsKKwlpbnQgbGVuLCBvaWRtYXRjaCwgaGFzaG1hdGNoOworCWNvbnN0IHVfY2hhciAqb2lkID0gTlVMTDsKKwl1X2NoYXIgKmRlY3J5cHRlZCA9IE5VTEw7CisKKwlyZXQgPSAwOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgTklEX3NoYTE6CisJCW9pZCA9IGlkX3NoYTE7CisJCW9pZGxlbiA9IHNpemVvZihpZF9zaGExKTsKKwkJaGxlbiA9IDIwOworCQlicmVhazsKKwljYXNlIE5JRF9tZDU6CisJCW9pZCA9IGlkX21kNTsKKwkJb2lkbGVuID0gc2l6ZW9mKGlkX21kNSk7CisJCWhsZW4gPSAxNjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBkb25lOworCX0KKwlpZiAoaGFzaGxlbiAhPSBobGVuKSB7CisJCWVycm9yKCJiYWQgaGFzaGxlbiIpOworCQlnb3RvIGRvbmU7CisJfQorCXJzYXNpemUgPSBSU0Ffc2l6ZShyc2EpOworCWlmIChzaWdsZW4gPT0gMCB8fCBzaWdsZW4gPiByc2FzaXplKSB7CisJCWVycm9yKCJiYWQgc2lnbGVuIik7CisJCWdvdG8gZG9uZTsKKwl9CisJZGVjcnlwdGVkID0geG1hbGxvYyhyc2FzaXplKTsKKwlpZiAoKGxlbiA9IFJTQV9wdWJsaWNfZGVjcnlwdChzaWdsZW4sIHNpZ2J1ZiwgZGVjcnlwdGVkLCByc2EsCisJICAgIFJTQV9QS0NTMV9QQURESU5HKSkgPCAwKSB7CisJCWVycm9yKCJSU0FfcHVibGljX2RlY3J5cHQgZmFpbGVkOiAlcyIsCisJCSAgICBFUlJfZXJyb3Jfc3RyaW5nKEVSUl9nZXRfZXJyb3IoKSwgTlVMTCkpOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChsZW4gPCAwIHx8ICh1X2ludClsZW4gIT0gaGxlbiArIG9pZGxlbikgeworCQllcnJvcigiYmFkIGRlY3J5cHRlZCBsZW46ICVkICE9ICVkICsgJWQiLCBsZW4sIGhsZW4sIG9pZGxlbik7CisJCWdvdG8gZG9uZTsKKwl9CisJb2lkbWF0Y2ggPSB0aW1pbmdzYWZlX2JjbXAoZGVjcnlwdGVkLCBvaWQsIG9pZGxlbikgPT0gMDsKKwloYXNobWF0Y2ggPSB0aW1pbmdzYWZlX2JjbXAoZGVjcnlwdGVkICsgb2lkbGVuLCBoYXNoLCBobGVuKSA9PSAwOworCWlmICghb2lkbWF0Y2gpIHsKKwkJZXJyb3IoIm9pZCBtaXNtYXRjaCIpOworCQlnb3RvIGRvbmU7CisJfQorCWlmICghaGFzaG1hdGNoKSB7CisJCWVycm9yKCJoYXNoIG1pc21hdGNoIik7CisJCWdvdG8gZG9uZTsKKwl9CisJcmV0ID0gMTsKK2RvbmU6CisJaWYgKGRlY3J5cHRlZCkKKwkJeGZyZWUoZGVjcnlwdGVkKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zc2gtc2FuZGJveC5oIGIvb3BlbnNzaC02LjBwMS9zc2gtc2FuZGJveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZWNkNWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NzaC1zYW5kYm94LmgKQEAgLTAsMCArMSwyMyBAQAorLyogJE9wZW5CU0Q6IHNzaC1zYW5kYm94LmgsdiAxLjEgMjAxMS8wNi8yMyAwOTozNDoxMyBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKK3N0cnVjdCBzc2hfc2FuZGJveDsKKworc3RydWN0IHNzaF9zYW5kYm94ICpzc2hfc2FuZGJveF9pbml0KHZvaWQpOwordm9pZCBzc2hfc2FuZGJveF9jaGlsZChzdHJ1Y3Qgc3NoX3NhbmRib3ggKik7Cit2b2lkIHNzaF9zYW5kYm94X3BhcmVudF9maW5pc2goc3RydWN0IHNzaF9zYW5kYm94ICopOwordm9pZCBzc2hfc2FuZGJveF9wYXJlbnRfcHJlYXV0aChzdHJ1Y3Qgc3NoX3NhbmRib3ggKiwgcGlkX3QpOwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zc2guMCBiL29wZW5zc2gtNi4wcDEvc3NoLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE4MGJlYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc3NoLjAKQEAgLTAsMCArMSw5MDcgQEAKK1NTSCgxKSAgICAgICAgICAgICAgICAgICAgIE9wZW5CU0QgUmVmZXJlbmNlIE1hbnVhbCAgICAgICAgICAgICAgICAgICAgIFNTSCgxKQorCitOQU1FCisgICAgIHNzaCAtIE9wZW5TU0ggU1NIIGNsaWVudCAocmVtb3RlIGxvZ2luIHByb2dyYW0pCisKK1NZTk9QU0lTCisgICAgIHNzaCBbLTEyNDZBYUNmZ0trTU5ucXNUdFZ2WHhZeV0gWy1iIGJpbmRfYWRkcmVzc10gWy1jIGNpcGhlcl9zcGVjXQorICAgICAgICAgWy1EIFtiaW5kX2FkZHJlc3M6XXBvcnRdIFstZSBlc2NhcGVfY2hhcl0gWy1GIGNvbmZpZ2ZpbGVdIFstSSBwa2NzMTFdCisgICAgICAgICBbLWkgaWRlbnRpdHlfZmlsZV0gWy1MIFtiaW5kX2FkZHJlc3M6XXBvcnQ6aG9zdDpob3N0cG9ydF0KKyAgICAgICAgIFstbCBsb2dpbl9uYW1lXSBbLW0gbWFjX3NwZWNdIFstTyBjdGxfY21kXSBbLW8gb3B0aW9uXSBbLXAgcG9ydF0KKyAgICAgICAgIFstUiBbYmluZF9hZGRyZXNzOl1wb3J0Omhvc3Q6aG9zdHBvcnRdIFstUyBjdGxfcGF0aF0gWy1XIGhvc3Q6cG9ydF0KKyAgICAgICAgIFstdyBsb2NhbF90dW5bOnJlbW90ZV90dW5dXSBbdXNlckBdaG9zdG5hbWUgW2NvbW1hbmRdCisKK0RFU0NSSVBUSU9OCisgICAgIHNzaCAoU1NIIGNsaWVudCkgaXMgYSBwcm9ncmFtIGZvciBsb2dnaW5nIGludG8gYSByZW1vdGUgbWFjaGluZSBhbmQgZm9yCisgICAgIGV4ZWN1dGluZyBjb21tYW5kcyBvbiBhIHJlbW90ZSBtYWNoaW5lLiAgSXQgaXMgaW50ZW5kZWQgdG8gcmVwbGFjZSBybG9naW4KKyAgICAgYW5kIHJzaCwgYW5kIHByb3ZpZGUgc2VjdXJlIGVuY3J5cHRlZCBjb21tdW5pY2F0aW9ucyBiZXR3ZWVuIHR3bworICAgICB1bnRydXN0ZWQgaG9zdHMgb3ZlciBhbiBpbnNlY3VyZSBuZXR3b3JrLiAgWDExIGNvbm5lY3Rpb25zIGFuZCBhcmJpdHJhcnkKKyAgICAgVENQIHBvcnRzIGNhbiBhbHNvIGJlIGZvcndhcmRlZCBvdmVyIHRoZSBzZWN1cmUgY2hhbm5lbC4KKworICAgICBzc2ggY29ubmVjdHMgYW5kIGxvZ3MgaW50byB0aGUgc3BlY2lmaWVkIGhvc3RuYW1lICh3aXRoIG9wdGlvbmFsIHVzZXIKKyAgICAgbmFtZSkuICBUaGUgdXNlciBtdXN0IHByb3ZlIGhpcy9oZXIgaWRlbnRpdHkgdG8gdGhlIHJlbW90ZSBtYWNoaW5lIHVzaW5nCisgICAgIG9uZSBvZiBzZXZlcmFsIG1ldGhvZHMgZGVwZW5kaW5nIG9uIHRoZSBwcm90b2NvbCB2ZXJzaW9uIHVzZWQgKHNlZQorICAgICBiZWxvdykuCisKKyAgICAgSWYgY29tbWFuZCBpcyBzcGVjaWZpZWQsIGl0IGlzIGV4ZWN1dGVkIG9uIHRoZSByZW1vdGUgaG9zdCBpbnN0ZWFkIG9mIGEKKyAgICAgbG9naW4gc2hlbGwuCisKKyAgICAgVGhlIG9wdGlvbnMgYXJlIGFzIGZvbGxvd3M6CisKKyAgICAgLTEgICAgICBGb3JjZXMgc3NoIHRvIHRyeSBwcm90b2NvbCB2ZXJzaW9uIDEgb25seS4KKworICAgICAtMiAgICAgIEZvcmNlcyBzc2ggdG8gdHJ5IHByb3RvY29sIHZlcnNpb24gMiBvbmx5LgorCisgICAgIC00ICAgICAgRm9yY2VzIHNzaCB0byB1c2UgSVB2NCBhZGRyZXNzZXMgb25seS4KKworICAgICAtNiAgICAgIEZvcmNlcyBzc2ggdG8gdXNlIElQdjYgYWRkcmVzc2VzIG9ubHkuCisKKyAgICAgLUEgICAgICBFbmFibGVzIGZvcndhcmRpbmcgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIGFnZW50IGNvbm5lY3Rpb24uICBUaGlzCisgICAgICAgICAgICAgY2FuIGFsc28gYmUgc3BlY2lmaWVkIG9uIGEgcGVyLWhvc3QgYmFzaXMgaW4gYSBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgZmlsZS4KKworICAgICAgICAgICAgIEFnZW50IGZvcndhcmRpbmcgc2hvdWxkIGJlIGVuYWJsZWQgd2l0aCBjYXV0aW9uLiAgVXNlcnMgd2l0aCB0aGUKKyAgICAgICAgICAgICBhYmlsaXR5IHRvIGJ5cGFzcyBmaWxlIHBlcm1pc3Npb25zIG9uIHRoZSByZW1vdGUgaG9zdCAoZm9yIHRoZQorICAgICAgICAgICAgIGFnZW50J3MgVU5JWC1kb21haW4gc29ja2V0KSBjYW4gYWNjZXNzIHRoZSBsb2NhbCBhZ2VudCB0aHJvdWdoCisgICAgICAgICAgICAgdGhlIGZvcndhcmRlZCBjb25uZWN0aW9uLiAgQW4gYXR0YWNrZXIgY2Fubm90IG9idGFpbiBrZXkgbWF0ZXJpYWwKKyAgICAgICAgICAgICBmcm9tIHRoZSBhZ2VudCwgaG93ZXZlciB0aGV5IGNhbiBwZXJmb3JtIG9wZXJhdGlvbnMgb24gdGhlIGtleXMKKyAgICAgICAgICAgICB0aGF0IGVuYWJsZSB0aGVtIHRvIGF1dGhlbnRpY2F0ZSB1c2luZyB0aGUgaWRlbnRpdGllcyBsb2FkZWQgaW50bworICAgICAgICAgICAgIHRoZSBhZ2VudC4KKworICAgICAtYSAgICAgIERpc2FibGVzIGZvcndhcmRpbmcgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIGFnZW50IGNvbm5lY3Rpb24uCisKKyAgICAgLWIgYmluZF9hZGRyZXNzCisgICAgICAgICAgICAgVXNlIGJpbmRfYWRkcmVzcyBvbiB0aGUgbG9jYWwgbWFjaGluZSBhcyB0aGUgc291cmNlIGFkZHJlc3Mgb2YKKyAgICAgICAgICAgICB0aGUgY29ubmVjdGlvbi4gIE9ubHkgdXNlZnVsIG9uIHN5c3RlbXMgd2l0aCBtb3JlIHRoYW4gb25lCisgICAgICAgICAgICAgYWRkcmVzcy4KKworICAgICAtQyAgICAgIFJlcXVlc3RzIGNvbXByZXNzaW9uIG9mIGFsbCBkYXRhIChpbmNsdWRpbmcgc3RkaW4sIHN0ZG91dCwKKyAgICAgICAgICAgICBzdGRlcnIsIGFuZCBkYXRhIGZvciBmb3J3YXJkZWQgWDExIGFuZCBUQ1AgY29ubmVjdGlvbnMpLiAgVGhlCisgICAgICAgICAgICAgY29tcHJlc3Npb24gYWxnb3JpdGhtIGlzIHRoZSBzYW1lIHVzZWQgYnkgZ3ppcCgxKSwgYW5kIHRoZQorICAgICAgICAgICAgIGBgbGV2ZWwnJyBjYW4gYmUgY29udHJvbGxlZCBieSB0aGUgQ29tcHJlc3Npb25MZXZlbCBvcHRpb24gZm9yCisgICAgICAgICAgICAgcHJvdG9jb2wgdmVyc2lvbiAxLiAgQ29tcHJlc3Npb24gaXMgZGVzaXJhYmxlIG9uIG1vZGVtIGxpbmVzIGFuZAorICAgICAgICAgICAgIG90aGVyIHNsb3cgY29ubmVjdGlvbnMsIGJ1dCB3aWxsIG9ubHkgc2xvdyBkb3duIHRoaW5ncyBvbiBmYXN0CisgICAgICAgICAgICAgbmV0d29ya3MuICBUaGUgZGVmYXVsdCB2YWx1ZSBjYW4gYmUgc2V0IG9uIGEgaG9zdC1ieS1ob3N0IGJhc2lzCisgICAgICAgICAgICAgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXM7IHNlZSB0aGUgQ29tcHJlc3Npb24gb3B0aW9uLgorCisgICAgIC1jIGNpcGhlcl9zcGVjCisgICAgICAgICAgICAgU2VsZWN0cyB0aGUgY2lwaGVyIHNwZWNpZmljYXRpb24gZm9yIGVuY3J5cHRpbmcgdGhlIHNlc3Npb24uCisKKyAgICAgICAgICAgICBQcm90b2NvbCB2ZXJzaW9uIDEgYWxsb3dzIHNwZWNpZmljYXRpb24gb2YgYSBzaW5nbGUgY2lwaGVyLiAgVGhlCisgICAgICAgICAgICAgc3VwcG9ydGVkIHZhbHVlcyBhcmUgYGAzZGVzJycsIGBgYmxvd2Zpc2gnJywgYW5kIGBgZGVzJycuICAzZGVzCisgICAgICAgICAgICAgKHRyaXBsZS1kZXMpIGlzIGFuIGVuY3J5cHQtZGVjcnlwdC1lbmNyeXB0IHRyaXBsZSB3aXRoIHRocmVlCisgICAgICAgICAgICAgZGlmZmVyZW50IGtleXMuICBJdCBpcyBiZWxpZXZlZCB0byBiZSBzZWN1cmUuICBibG93ZmlzaCBpcyBhIGZhc3QKKyAgICAgICAgICAgICBibG9jayBjaXBoZXI7IGl0IGFwcGVhcnMgdmVyeSBzZWN1cmUgYW5kIGlzIG11Y2ggZmFzdGVyIHRoYW4KKyAgICAgICAgICAgICAzZGVzLiAgZGVzIGlzIG9ubHkgc3VwcG9ydGVkIGluIHRoZSBzc2ggY2xpZW50IGZvcgorICAgICAgICAgICAgIGludGVyb3BlcmFiaWxpdHkgd2l0aCBsZWdhY3kgcHJvdG9jb2wgMSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBkbworICAgICAgICAgICAgIG5vdCBzdXBwb3J0IHRoZSAzZGVzIGNpcGhlci4gIEl0cyB1c2UgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQgZHVlCisgICAgICAgICAgICAgdG8gY3J5cHRvZ3JhcGhpYyB3ZWFrbmVzc2VzLiAgVGhlIGRlZmF1bHQgaXMgYGAzZGVzJycuCisKKyAgICAgICAgICAgICBGb3IgcHJvdG9jb2wgdmVyc2lvbiAyLCBjaXBoZXJfc3BlYyBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mCisgICAgICAgICAgICAgY2lwaGVycyBsaXN0ZWQgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4gIFNlZSB0aGUgQ2lwaGVycyBrZXl3b3JkCisgICAgICAgICAgICAgaW4gc3NoX2NvbmZpZyg1KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworICAgICAtRCBbYmluZF9hZGRyZXNzOl1wb3J0CisgICAgICAgICAgICAgU3BlY2lmaWVzIGEgbG9jYWwgYGBkeW5hbWljJycgYXBwbGljYXRpb24tbGV2ZWwgcG9ydCBmb3J3YXJkaW5nLgorICAgICAgICAgICAgIFRoaXMgd29ya3MgYnkgYWxsb2NhdGluZyBhIHNvY2tldCB0byBsaXN0ZW4gdG8gcG9ydCBvbiB0aGUgbG9jYWwKKyAgICAgICAgICAgICBzaWRlLCBvcHRpb25hbGx5IGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgYmluZF9hZGRyZXNzLiAgV2hlbmV2ZXIgYQorICAgICAgICAgICAgIGNvbm5lY3Rpb24gaXMgbWFkZSB0byB0aGlzIHBvcnQsIHRoZSBjb25uZWN0aW9uIGlzIGZvcndhcmRlZCBvdmVyCisgICAgICAgICAgICAgdGhlIHNlY3VyZSBjaGFubmVsLCBhbmQgdGhlIGFwcGxpY2F0aW9uIHByb3RvY29sIGlzIHRoZW4gdXNlZCB0bworICAgICAgICAgICAgIGRldGVybWluZSB3aGVyZSB0byBjb25uZWN0IHRvIGZyb20gdGhlIHJlbW90ZSBtYWNoaW5lLiAgQ3VycmVudGx5CisgICAgICAgICAgICAgdGhlIFNPQ0tTNCBhbmQgU09DS1M1IHByb3RvY29scyBhcmUgc3VwcG9ydGVkLCBhbmQgc3NoIHdpbGwgYWN0CisgICAgICAgICAgICAgYXMgYSBTT0NLUyBzZXJ2ZXIuICBPbmx5IHJvb3QgY2FuIGZvcndhcmQgcHJpdmlsZWdlZCBwb3J0cy4KKyAgICAgICAgICAgICBEeW5hbWljIHBvcnQgZm9yd2FyZGluZ3MgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGluIHRoZQorICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZS4KKworICAgICAgICAgICAgIElQdjYgYWRkcmVzc2VzIGNhbiBiZSBzcGVjaWZpZWQgYnkgZW5jbG9zaW5nIHRoZSBhZGRyZXNzIGluCisgICAgICAgICAgICAgc3F1YXJlIGJyYWNrZXRzLiAgT25seSB0aGUgc3VwZXJ1c2VyIGNhbiBmb3J3YXJkIHByaXZpbGVnZWQKKyAgICAgICAgICAgICBwb3J0cy4gIEJ5IGRlZmF1bHQsIHRoZSBsb2NhbCBwb3J0IGlzIGJvdW5kIGluIGFjY29yZGFuY2Ugd2l0aAorICAgICAgICAgICAgIHRoZSBHYXRld2F5UG9ydHMgc2V0dGluZy4gIEhvd2V2ZXIsIGFuIGV4cGxpY2l0IGJpbmRfYWRkcmVzcyBtYXkKKyAgICAgICAgICAgICBiZSB1c2VkIHRvIGJpbmQgdGhlIGNvbm5lY3Rpb24gdG8gYSBzcGVjaWZpYyBhZGRyZXNzLiAgVGhlCisgICAgICAgICAgICAgYmluZF9hZGRyZXNzIG9mIGBgbG9jYWxob3N0JycgaW5kaWNhdGVzIHRoYXQgdGhlIGxpc3RlbmluZyBwb3J0CisgICAgICAgICAgICAgYmUgYm91bmQgZm9yIGxvY2FsIHVzZSBvbmx5LCB3aGlsZSBhbiBlbXB0eSBhZGRyZXNzIG9yIGAqJworICAgICAgICAgICAgIGluZGljYXRlcyB0aGF0IHRoZSBwb3J0IHNob3VsZCBiZSBhdmFpbGFibGUgZnJvbSBhbGwgaW50ZXJmYWNlcy4KKworICAgICAtZSBlc2NhcGVfY2hhcgorICAgICAgICAgICAgIFNldHMgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgZm9yIHNlc3Npb25zIHdpdGggYSBwdHkgKGRlZmF1bHQ6IGB+JykuCisgICAgICAgICAgICAgVGhlIGVzY2FwZSBjaGFyYWN0ZXIgaXMgb25seSByZWNvZ25pemVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYQorICAgICAgICAgICAgIGxpbmUuICBUaGUgZXNjYXBlIGNoYXJhY3RlciBmb2xsb3dlZCBieSBhIGRvdCAoYC4nKSBjbG9zZXMgdGhlCisgICAgICAgICAgICAgY29ubmVjdGlvbjsgZm9sbG93ZWQgYnkgY29udHJvbC1aIHN1c3BlbmRzIHRoZSBjb25uZWN0aW9uOyBhbmQKKyAgICAgICAgICAgICBmb2xsb3dlZCBieSBpdHNlbGYgc2VuZHMgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgb25jZS4gIFNldHRpbmcgdGhlCisgICAgICAgICAgICAgY2hhcmFjdGVyIHRvIGBgbm9uZScnIGRpc2FibGVzIGFueSBlc2NhcGVzIGFuZCBtYWtlcyB0aGUgc2Vzc2lvbgorICAgICAgICAgICAgIGZ1bGx5IHRyYW5zcGFyZW50LgorCisgICAgIC1GIGNvbmZpZ2ZpbGUKKyAgICAgICAgICAgICBTcGVjaWZpZXMgYW4gYWx0ZXJuYXRpdmUgcGVyLXVzZXIgY29uZmlndXJhdGlvbiBmaWxlLiAgSWYgYQorICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGUgc3lzdGVtLXdpZGUKKyAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGZpbGUgKC9ldGMvc3NoL3NzaF9jb25maWcpIHdpbGwgYmUgaWdub3JlZC4gIFRoZQorICAgICAgICAgICAgIGRlZmF1bHQgZm9yIHRoZSBwZXItdXNlciBjb25maWd1cmF0aW9uIGZpbGUgaXMgfi8uc3NoL2NvbmZpZy4KKworICAgICAtZiAgICAgIFJlcXVlc3RzIHNzaCB0byBnbyB0byBiYWNrZ3JvdW5kIGp1c3QgYmVmb3JlIGNvbW1hbmQgZXhlY3V0aW9uLgorICAgICAgICAgICAgIFRoaXMgaXMgdXNlZnVsIGlmIHNzaCBpcyBnb2luZyB0byBhc2sgZm9yIHBhc3N3b3JkcyBvcgorICAgICAgICAgICAgIHBhc3NwaHJhc2VzLCBidXQgdGhlIHVzZXIgd2FudHMgaXQgaW4gdGhlIGJhY2tncm91bmQuICBUaGlzCisgICAgICAgICAgICAgaW1wbGllcyAtbi4gIFRoZSByZWNvbW1lbmRlZCB3YXkgdG8gc3RhcnQgWDExIHByb2dyYW1zIGF0IGEKKyAgICAgICAgICAgICByZW1vdGUgc2l0ZSBpcyB3aXRoIHNvbWV0aGluZyBsaWtlIHNzaCAtZiBob3N0IHh0ZXJtLgorCisgICAgICAgICAgICAgSWYgdGhlIEV4aXRPbkZvcndhcmRGYWlsdXJlIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGlzIHNldCB0bworICAgICAgICAgICAgIGBgeWVzJycsIHRoZW4gYSBjbGllbnQgc3RhcnRlZCB3aXRoIC1mIHdpbGwgd2FpdCBmb3IgYWxsIHJlbW90ZQorICAgICAgICAgICAgIHBvcnQgZm9yd2FyZHMgdG8gYmUgc3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkIGJlZm9yZSBwbGFjaW5nCisgICAgICAgICAgICAgaXRzZWxmIGluIHRoZSBiYWNrZ3JvdW5kLgorCisgICAgIC1nICAgICAgQWxsb3dzIHJlbW90ZSBob3N0cyB0byBjb25uZWN0IHRvIGxvY2FsIGZvcndhcmRlZCBwb3J0cy4KKworICAgICAtSSBwa2NzMTEKKyAgICAgICAgICAgICBTcGVjaWZ5IHRoZSBQS0NTIzExIHNoYXJlZCBsaWJyYXJ5IHNzaCBzaG91bGQgdXNlIHRvIGNvbW11bmljYXRlCisgICAgICAgICAgICAgd2l0aCBhIFBLQ1MjMTEgdG9rZW4gcHJvdmlkaW5nIHRoZSB1c2VyJ3MgcHJpdmF0ZSBSU0Ega2V5LgorCisgICAgIC1pIGlkZW50aXR5X2ZpbGUKKyAgICAgICAgICAgICBTZWxlY3RzIGEgZmlsZSBmcm9tIHdoaWNoIHRoZSBpZGVudGl0eSAocHJpdmF0ZSBrZXkpIGZvciBwdWJsaWMKKyAgICAgICAgICAgICBrZXkgYXV0aGVudGljYXRpb24gaXMgcmVhZC4gIFRoZSBkZWZhdWx0IGlzIH4vLnNzaC9pZGVudGl0eSBmb3IKKyAgICAgICAgICAgICBwcm90b2NvbCB2ZXJzaW9uIDEsIGFuZCB+Ly5zc2gvaWRfZHNhLCB+Ly5zc2gvaWRfZWNkc2EgYW5kCisgICAgICAgICAgICAgfi8uc3NoL2lkX3JzYSBmb3IgcHJvdG9jb2wgdmVyc2lvbiAyLiAgSWRlbnRpdHkgZmlsZXMgbWF5IGFsc28gYmUKKyAgICAgICAgICAgICBzcGVjaWZpZWQgb24gYSBwZXItaG9zdCBiYXNpcyBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiAgSXQgaXMKKyAgICAgICAgICAgICBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIC1pIG9wdGlvbnMgKGFuZCBtdWx0aXBsZSBpZGVudGl0aWVzCisgICAgICAgICAgICAgc3BlY2lmaWVkIGluIGNvbmZpZ3VyYXRpb24gZmlsZXMpLiAgc3NoIHdpbGwgYWxzbyB0cnkgdG8gbG9hZAorICAgICAgICAgICAgIGNlcnRpZmljYXRlIGluZm9ybWF0aW9uIGZyb20gdGhlIGZpbGVuYW1lIG9idGFpbmVkIGJ5IGFwcGVuZGluZworICAgICAgICAgICAgIC1jZXJ0LnB1YiB0byBpZGVudGl0eSBmaWxlbmFtZXMuCisKKyAgICAgLUsgICAgICBFbmFibGVzIEdTU0FQSS1iYXNlZCBhdXRoZW50aWNhdGlvbiBhbmQgZm9yd2FyZGluZyAoZGVsZWdhdGlvbikKKyAgICAgICAgICAgICBvZiBHU1NBUEkgY3JlZGVudGlhbHMgdG8gdGhlIHNlcnZlci4KKworICAgICAtayAgICAgIERpc2FibGVzIGZvcndhcmRpbmcgKGRlbGVnYXRpb24pIG9mIEdTU0FQSSBjcmVkZW50aWFscyB0byB0aGUKKyAgICAgICAgICAgICBzZXJ2ZXIuCisKKyAgICAgLUwgW2JpbmRfYWRkcmVzczpdcG9ydDpob3N0Omhvc3Rwb3J0CisgICAgICAgICAgICAgU3BlY2lmaWVzIHRoYXQgdGhlIGdpdmVuIHBvcnQgb24gdGhlIGxvY2FsIChjbGllbnQpIGhvc3QgaXMgdG8gYmUKKyAgICAgICAgICAgICBmb3J3YXJkZWQgdG8gdGhlIGdpdmVuIGhvc3QgYW5kIHBvcnQgb24gdGhlIHJlbW90ZSBzaWRlLiAgVGhpcworICAgICAgICAgICAgIHdvcmtzIGJ5IGFsbG9jYXRpbmcgYSBzb2NrZXQgdG8gbGlzdGVuIHRvIHBvcnQgb24gdGhlIGxvY2FsIHNpZGUsCisgICAgICAgICAgICAgb3B0aW9uYWxseSBib3VuZCB0byB0aGUgc3BlY2lmaWVkIGJpbmRfYWRkcmVzcy4gIFdoZW5ldmVyIGEKKyAgICAgICAgICAgICBjb25uZWN0aW9uIGlzIG1hZGUgdG8gdGhpcyBwb3J0LCB0aGUgY29ubmVjdGlvbiBpcyBmb3J3YXJkZWQgb3ZlcgorICAgICAgICAgICAgIHRoZSBzZWN1cmUgY2hhbm5lbCwgYW5kIGEgY29ubmVjdGlvbiBpcyBtYWRlIHRvIGhvc3QgcG9ydAorICAgICAgICAgICAgIGhvc3Rwb3J0IGZyb20gdGhlIHJlbW90ZSBtYWNoaW5lLiAgUG9ydCBmb3J3YXJkaW5ncyBjYW4gYWxzbyBiZQorICAgICAgICAgICAgIHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiAgSVB2NiBhZGRyZXNzZXMgY2FuIGJlCisgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IGVuY2xvc2luZyB0aGUgYWRkcmVzcyBpbiBzcXVhcmUgYnJhY2tldHMuICBPbmx5IHRoZQorICAgICAgICAgICAgIHN1cGVydXNlciBjYW4gZm9yd2FyZCBwcml2aWxlZ2VkIHBvcnRzLiAgQnkgZGVmYXVsdCwgdGhlIGxvY2FsCisgICAgICAgICAgICAgcG9ydCBpcyBib3VuZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIEdhdGV3YXlQb3J0cyBzZXR0aW5nLgorICAgICAgICAgICAgIEhvd2V2ZXIsIGFuIGV4cGxpY2l0IGJpbmRfYWRkcmVzcyBtYXkgYmUgdXNlZCB0byBiaW5kIHRoZQorICAgICAgICAgICAgIGNvbm5lY3Rpb24gdG8gYSBzcGVjaWZpYyBhZGRyZXNzLiAgVGhlIGJpbmRfYWRkcmVzcyBvZgorICAgICAgICAgICAgIGBgbG9jYWxob3N0JycgaW5kaWNhdGVzIHRoYXQgdGhlIGxpc3RlbmluZyBwb3J0IGJlIGJvdW5kIGZvcgorICAgICAgICAgICAgIGxvY2FsIHVzZSBvbmx5LCB3aGlsZSBhbiBlbXB0eSBhZGRyZXNzIG9yIGAqJyBpbmRpY2F0ZXMgdGhhdCB0aGUKKyAgICAgICAgICAgICBwb3J0IHNob3VsZCBiZSBhdmFpbGFibGUgZnJvbSBhbGwgaW50ZXJmYWNlcy4KKworICAgICAtbCBsb2dpbl9uYW1lCisgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSB1c2VyIHRvIGxvZyBpbiBhcyBvbiB0aGUgcmVtb3RlIG1hY2hpbmUuICBUaGlzIGFsc28KKyAgICAgICAgICAgICBtYXkgYmUgc3BlY2lmaWVkIG9uIGEgcGVyLWhvc3QgYmFzaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKworICAgICAtTSAgICAgIFBsYWNlcyB0aGUgc3NoIGNsaWVudCBpbnRvIGBgbWFzdGVyJycgbW9kZSBmb3IgY29ubmVjdGlvbgorICAgICAgICAgICAgIHNoYXJpbmcuICBNdWx0aXBsZSAtTSBvcHRpb25zIHBsYWNlcyBzc2ggaW50byBgYG1hc3RlcicnIG1vZGUKKyAgICAgICAgICAgICB3aXRoIGNvbmZpcm1hdGlvbiByZXF1aXJlZCBiZWZvcmUgc2xhdmUgY29ubmVjdGlvbnMgYXJlIGFjY2VwdGVkLgorICAgICAgICAgICAgIFJlZmVyIHRvIHRoZSBkZXNjcmlwdGlvbiBvZiBDb250cm9sTWFzdGVyIGluIHNzaF9jb25maWcoNSkgZm9yCisgICAgICAgICAgICAgZGV0YWlscy4KKworICAgICAtbSBtYWNfc3BlYworICAgICAgICAgICAgIEFkZGl0aW9uYWxseSwgZm9yIHByb3RvY29sIHZlcnNpb24gMiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mCisgICAgICAgICAgICAgTUFDIChtZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGNvZGUpIGFsZ29yaXRobXMgY2FuIGJlIHNwZWNpZmllZCBpbgorICAgICAgICAgICAgIG9yZGVyIG9mIHByZWZlcmVuY2UuICBTZWUgdGhlIE1BQ3Mga2V5d29yZCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworICAgICAtTiAgICAgIERvIG5vdCBleGVjdXRlIGEgcmVtb3RlIGNvbW1hbmQuICBUaGlzIGlzIHVzZWZ1bCBmb3IganVzdAorICAgICAgICAgICAgIGZvcndhcmRpbmcgcG9ydHMgKHByb3RvY29sIHZlcnNpb24gMiBvbmx5KS4KKworICAgICAtbiAgICAgIFJlZGlyZWN0cyBzdGRpbiBmcm9tIC9kZXYvbnVsbCAoYWN0dWFsbHksIHByZXZlbnRzIHJlYWRpbmcgZnJvbQorICAgICAgICAgICAgIHN0ZGluKS4gIFRoaXMgbXVzdCBiZSB1c2VkIHdoZW4gc3NoIGlzIHJ1biBpbiB0aGUgYmFja2dyb3VuZC4gIEEKKyAgICAgICAgICAgICBjb21tb24gdHJpY2sgaXMgdG8gdXNlIHRoaXMgdG8gcnVuIFgxMSBwcm9ncmFtcyBvbiBhIHJlbW90ZQorICAgICAgICAgICAgIG1hY2hpbmUuICBGb3IgZXhhbXBsZSwgc3NoIC1uIHNoYWRvd3MuY3MuaHV0LmZpIGVtYWNzICYgd2lsbAorICAgICAgICAgICAgIHN0YXJ0IGFuIGVtYWNzIG9uIHNoYWRvd3MuY3MuaHV0LmZpLCBhbmQgdGhlIFgxMSBjb25uZWN0aW9uIHdpbGwKKyAgICAgICAgICAgICBiZSBhdXRvbWF0aWNhbGx5IGZvcndhcmRlZCBvdmVyIGFuIGVuY3J5cHRlZCBjaGFubmVsLiAgVGhlIHNzaAorICAgICAgICAgICAgIHByb2dyYW0gd2lsbCBiZSBwdXQgaW4gdGhlIGJhY2tncm91bmQuICAoVGhpcyBkb2VzIG5vdCB3b3JrIGlmCisgICAgICAgICAgICAgc3NoIG5lZWRzIHRvIGFzayBmb3IgYSBwYXNzd29yZCBvciBwYXNzcGhyYXNlOyBzZWUgYWxzbyB0aGUgLWYKKyAgICAgICAgICAgICBvcHRpb24uKQorCisgICAgIC1PIGN0bF9jbWQKKyAgICAgICAgICAgICBDb250cm9sIGFuIGFjdGl2ZSBjb25uZWN0aW9uIG11bHRpcGxleGluZyBtYXN0ZXIgcHJvY2Vzcy4gIFdoZW4KKyAgICAgICAgICAgICB0aGUgLU8gb3B0aW9uIGlzIHNwZWNpZmllZCwgdGhlIGN0bF9jbWQgYXJndW1lbnQgaXMgaW50ZXJwcmV0ZWQKKyAgICAgICAgICAgICBhbmQgcGFzc2VkIHRvIHRoZSBtYXN0ZXIgcHJvY2Vzcy4gIFZhbGlkIGNvbW1hbmRzIGFyZTogYGBjaGVjaycnCisgICAgICAgICAgICAgKGNoZWNrIHRoYXQgdGhlIG1hc3RlciBwcm9jZXNzIGlzIHJ1bm5pbmcpLCBgYGZvcndhcmQnJyAocmVxdWVzdAorICAgICAgICAgICAgIGZvcndhcmRpbmdzIHdpdGhvdXQgY29tbWFuZCBleGVjdXRpb24pLCBgYGNhbmNlbCcnIChjYW5jZWwKKyAgICAgICAgICAgICBmb3J3YXJkaW5ncyksIGBgZXhpdCcnIChyZXF1ZXN0IHRoZSBtYXN0ZXIgdG8gZXhpdCksIGFuZCBgYHN0b3AnJworICAgICAgICAgICAgIChyZXF1ZXN0IHRoZSBtYXN0ZXIgdG8gc3RvcCBhY2NlcHRpbmcgZnVydGhlciBtdWx0aXBsZXhpbmcKKyAgICAgICAgICAgICByZXF1ZXN0cykuCisKKyAgICAgLW8gb3B0aW9uCisgICAgICAgICAgICAgQ2FuIGJlIHVzZWQgdG8gZ2l2ZSBvcHRpb25zIGluIHRoZSBmb3JtYXQgdXNlZCBpbiB0aGUKKyAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGZpbGUuICBUaGlzIGlzIHVzZWZ1bCBmb3Igc3BlY2lmeWluZyBvcHRpb25zIGZvcgorICAgICAgICAgICAgIHdoaWNoIHRoZXJlIGlzIG5vIHNlcGFyYXRlIGNvbW1hbmQtbGluZSBmbGFnLiAgRm9yIGZ1bGwgZGV0YWlscworICAgICAgICAgICAgIG9mIHRoZSBvcHRpb25zIGxpc3RlZCBiZWxvdywgYW5kIHRoZWlyIHBvc3NpYmxlIHZhbHVlcywgc2VlCisgICAgICAgICAgICAgc3NoX2NvbmZpZyg1KS4KKworICAgICAgICAgICAgICAgICAgIEFkZHJlc3NGYW1pbHkKKyAgICAgICAgICAgICAgICAgICBCYXRjaE1vZGUKKyAgICAgICAgICAgICAgICAgICBCaW5kQWRkcmVzcworICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICAgICAgICBDaGVja0hvc3RJUAorICAgICAgICAgICAgICAgICAgIENpcGhlcgorICAgICAgICAgICAgICAgICAgIENpcGhlcnMKKyAgICAgICAgICAgICAgICAgICBDbGVhckFsbEZvcndhcmRpbmdzCisgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbkxldmVsCisgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbkF0dGVtcHRzCisgICAgICAgICAgICAgICAgICAgQ29ubmVjdFRpbWVvdXQKKyAgICAgICAgICAgICAgICAgICBDb250cm9sTWFzdGVyCisgICAgICAgICAgICAgICAgICAgQ29udHJvbFBhdGgKKyAgICAgICAgICAgICAgICAgICBDb250cm9sUGVyc2lzdAorICAgICAgICAgICAgICAgICAgIER5bmFtaWNGb3J3YXJkCisgICAgICAgICAgICAgICAgICAgRXNjYXBlQ2hhcgorICAgICAgICAgICAgICAgICAgIEV4aXRPbkZvcndhcmRGYWlsdXJlCisgICAgICAgICAgICAgICAgICAgRm9yd2FyZEFnZW50CisgICAgICAgICAgICAgICAgICAgRm9yd2FyZFgxMQorICAgICAgICAgICAgICAgICAgIEZvcndhcmRYMTFUaW1lb3V0CisgICAgICAgICAgICAgICAgICAgRm9yd2FyZFgxMVRydXN0ZWQKKyAgICAgICAgICAgICAgICAgICBHYXRld2F5UG9ydHMKKyAgICAgICAgICAgICAgICAgICBHbG9iYWxLbm93bkhvc3RzRmlsZQorICAgICAgICAgICAgICAgICAgIEdTU0FQSUF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgR1NTQVBJRGVsZWdhdGVDcmVkZW50aWFscworICAgICAgICAgICAgICAgICAgIEhhc2hLbm93bkhvc3RzCisgICAgICAgICAgICAgICAgICAgSG9zdAorICAgICAgICAgICAgICAgICAgIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgSG9zdEtleUFsZ29yaXRobXMKKyAgICAgICAgICAgICAgICAgICBIb3N0S2V5QWxpYXMKKyAgICAgICAgICAgICAgICAgICBIb3N0TmFtZQorICAgICAgICAgICAgICAgICAgIElkZW50aXR5RmlsZQorICAgICAgICAgICAgICAgICAgIElkZW50aXRpZXNPbmx5CisgICAgICAgICAgICAgICAgICAgSVBRb1MKKyAgICAgICAgICAgICAgICAgICBLYmRJbnRlcmFjdGl2ZUF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgS2JkSW50ZXJhY3RpdmVEZXZpY2VzCisgICAgICAgICAgICAgICAgICAgS2V4QWxnb3JpdGhtcworICAgICAgICAgICAgICAgICAgIExvY2FsQ29tbWFuZAorICAgICAgICAgICAgICAgICAgIExvY2FsRm9yd2FyZAorICAgICAgICAgICAgICAgICAgIExvZ0xldmVsCisgICAgICAgICAgICAgICAgICAgTUFDcworICAgICAgICAgICAgICAgICAgIE5vSG9zdEF1dGhlbnRpY2F0aW9uRm9yTG9jYWxob3N0CisgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZQYXNzd29yZFByb21wdHMKKyAgICAgICAgICAgICAgICAgICBQYXNzd29yZEF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgUGVybWl0TG9jYWxDb21tYW5kCisgICAgICAgICAgICAgICAgICAgUEtDUzExUHJvdmlkZXIKKyAgICAgICAgICAgICAgICAgICBQb3J0CisgICAgICAgICAgICAgICAgICAgUHJlZmVycmVkQXV0aGVudGljYXRpb25zCisgICAgICAgICAgICAgICAgICAgUHJvdG9jb2wKKyAgICAgICAgICAgICAgICAgICBQcm94eUNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICBQdWJrZXlBdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgICAgICAgIFJla2V5TGltaXQKKyAgICAgICAgICAgICAgICAgICBSZW1vdGVGb3J3YXJkCisgICAgICAgICAgICAgICAgICAgUmVxdWVzdFRUWQorICAgICAgICAgICAgICAgICAgIFJob3N0c1JTQUF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgUlNBQXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICAgICAgICBTZW5kRW52CisgICAgICAgICAgICAgICAgICAgU2VydmVyQWxpdmVJbnRlcnZhbAorICAgICAgICAgICAgICAgICAgIFNlcnZlckFsaXZlQ291bnRNYXgKKyAgICAgICAgICAgICAgICAgICBTdHJpY3RIb3N0S2V5Q2hlY2tpbmcKKyAgICAgICAgICAgICAgICAgICBUQ1BLZWVwQWxpdmUKKyAgICAgICAgICAgICAgICAgICBUdW5uZWwKKyAgICAgICAgICAgICAgICAgICBUdW5uZWxEZXZpY2UKKyAgICAgICAgICAgICAgICAgICBVc2VQcml2aWxlZ2VkUG9ydAorICAgICAgICAgICAgICAgICAgIFVzZXIKKyAgICAgICAgICAgICAgICAgICBVc2VyS25vd25Ib3N0c0ZpbGUKKyAgICAgICAgICAgICAgICAgICBWZXJpZnlIb3N0S2V5RE5TCisgICAgICAgICAgICAgICAgICAgVmlzdWFsSG9zdEtleQorICAgICAgICAgICAgICAgICAgIFhBdXRoTG9jYXRpb24KKworICAgICAtcCBwb3J0CisgICAgICAgICAgICAgUG9ydCB0byBjb25uZWN0IHRvIG9uIHRoZSByZW1vdGUgaG9zdC4gIFRoaXMgY2FuIGJlIHNwZWNpZmllZCBvbgorICAgICAgICAgICAgIGEgcGVyLWhvc3QgYmFzaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKworICAgICAtcSAgICAgIFF1aWV0IG1vZGUuICBDYXVzZXMgbW9zdCB3YXJuaW5nIGFuZCBkaWFnbm9zdGljIG1lc3NhZ2VzIHRvIGJlCisgICAgICAgICAgICAgc3VwcHJlc3NlZC4KKworICAgICAtUiBbYmluZF9hZGRyZXNzOl1wb3J0Omhvc3Q6aG9zdHBvcnQKKyAgICAgICAgICAgICBTcGVjaWZpZXMgdGhhdCB0aGUgZ2l2ZW4gcG9ydCBvbiB0aGUgcmVtb3RlIChzZXJ2ZXIpIGhvc3QgaXMgdG8KKyAgICAgICAgICAgICBiZSBmb3J3YXJkZWQgdG8gdGhlIGdpdmVuIGhvc3QgYW5kIHBvcnQgb24gdGhlIGxvY2FsIHNpZGUuICBUaGlzCisgICAgICAgICAgICAgd29ya3MgYnkgYWxsb2NhdGluZyBhIHNvY2tldCB0byBsaXN0ZW4gdG8gcG9ydCBvbiB0aGUgcmVtb3RlCisgICAgICAgICAgICAgc2lkZSwgYW5kIHdoZW5ldmVyIGEgY29ubmVjdGlvbiBpcyBtYWRlIHRvIHRoaXMgcG9ydCwgdGhlCisgICAgICAgICAgICAgY29ubmVjdGlvbiBpcyBmb3J3YXJkZWQgb3ZlciB0aGUgc2VjdXJlIGNoYW5uZWwsIGFuZCBhIGNvbm5lY3Rpb24KKyAgICAgICAgICAgICBpcyBtYWRlIHRvIGhvc3QgcG9ydCBob3N0cG9ydCBmcm9tIHRoZSBsb2NhbCBtYWNoaW5lLgorCisgICAgICAgICAgICAgUG9ydCBmb3J3YXJkaW5ncyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgICAgICAgICBQcml2aWxlZ2VkIHBvcnRzIGNhbiBiZSBmb3J3YXJkZWQgb25seSB3aGVuIGxvZ2dpbmcgaW4gYXMgcm9vdCBvbgorICAgICAgICAgICAgIHRoZSByZW1vdGUgbWFjaGluZS4gIElQdjYgYWRkcmVzc2VzIGNhbiBiZSBzcGVjaWZpZWQgYnkgZW5jbG9zaW5nCisgICAgICAgICAgICAgdGhlIGFkZHJlc3MgaW4gc3F1YXJlIGJyYWNlcy4KKworICAgICAgICAgICAgIEJ5IGRlZmF1bHQsIHRoZSBsaXN0ZW5pbmcgc29ja2V0IG9uIHRoZSBzZXJ2ZXIgd2lsbCBiZSBib3VuZCB0bworICAgICAgICAgICAgIHRoZSBsb29wYmFjayBpbnRlcmZhY2Ugb25seS4gIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gYnkKKyAgICAgICAgICAgICBzcGVjaWZ5aW5nIGEgYmluZF9hZGRyZXNzLiAgQW4gZW1wdHkgYmluZF9hZGRyZXNzLCBvciB0aGUgYWRkcmVzcworICAgICAgICAgICAgIGAqJywgaW5kaWNhdGVzIHRoYXQgdGhlIHJlbW90ZSBzb2NrZXQgc2hvdWxkIGxpc3RlbiBvbiBhbGwKKyAgICAgICAgICAgICBpbnRlcmZhY2VzLiAgU3BlY2lmeWluZyBhIHJlbW90ZSBiaW5kX2FkZHJlc3Mgd2lsbCBvbmx5IHN1Y2NlZWQKKyAgICAgICAgICAgICBpZiB0aGUgc2VydmVyJ3MgR2F0ZXdheVBvcnRzIG9wdGlvbiBpcyBlbmFibGVkIChzZWUKKyAgICAgICAgICAgICBzc2hkX2NvbmZpZyg1KSkuCisKKyAgICAgICAgICAgICBJZiB0aGUgcG9ydCBhcmd1bWVudCBpcyBgMCcsIHRoZSBsaXN0ZW4gcG9ydCB3aWxsIGJlIGR5bmFtaWNhbGx5CisgICAgICAgICAgICAgYWxsb2NhdGVkIG9uIHRoZSBzZXJ2ZXIgYW5kIHJlcG9ydGVkIHRvIHRoZSBjbGllbnQgYXQgcnVuIHRpbWUuCisgICAgICAgICAgICAgV2hlbiB1c2VkIHRvZ2V0aGVyIHdpdGggLU8gZm9yd2FyZCB0aGUgYWxsb2NhdGVkIHBvcnQgd2lsbCBiZQorICAgICAgICAgICAgIHByaW50ZWQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4KKworICAgICAtUyBjdGxfcGF0aAorICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgYSBjb250cm9sIHNvY2tldCBmb3IgY29ubmVjdGlvbgorICAgICAgICAgICAgIHNoYXJpbmcsIG9yIHRoZSBzdHJpbmcgYGBub25lJycgdG8gZGlzYWJsZSBjb25uZWN0aW9uIHNoYXJpbmcuCisgICAgICAgICAgICAgUmVmZXIgdG8gdGhlIGRlc2NyaXB0aW9uIG9mIENvbnRyb2xQYXRoIGFuZCBDb250cm9sTWFzdGVyIGluCisgICAgICAgICAgICAgc3NoX2NvbmZpZyg1KSBmb3IgZGV0YWlscy4KKworICAgICAtcyAgICAgIE1heSBiZSB1c2VkIHRvIHJlcXVlc3QgaW52b2NhdGlvbiBvZiBhIHN1YnN5c3RlbSBvbiB0aGUgcmVtb3RlCisgICAgICAgICAgICAgc3lzdGVtLiAgU3Vic3lzdGVtcyBhcmUgYSBmZWF0dXJlIG9mIHRoZSBTU0gyIHByb3RvY29sIHdoaWNoCisgICAgICAgICAgICAgZmFjaWxpdGF0ZSB0aGUgdXNlIG9mIFNTSCBhcyBhIHNlY3VyZSB0cmFuc3BvcnQgZm9yIG90aGVyCisgICAgICAgICAgICAgYXBwbGljYXRpb25zIChlZy4gc2Z0cCgxKSkuICBUaGUgc3Vic3lzdGVtIGlzIHNwZWNpZmllZCBhcyB0aGUKKyAgICAgICAgICAgICByZW1vdGUgY29tbWFuZC4KKworICAgICAtVCAgICAgIERpc2FibGUgcHNldWRvLXR0eSBhbGxvY2F0aW9uLgorCisgICAgIC10ICAgICAgRm9yY2UgcHNldWRvLXR0eSBhbGxvY2F0aW9uLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBleGVjdXRlCisgICAgICAgICAgICAgYXJiaXRyYXJ5IHNjcmVlbi1iYXNlZCBwcm9ncmFtcyBvbiBhIHJlbW90ZSBtYWNoaW5lLCB3aGljaCBjYW4gYmUKKyAgICAgICAgICAgICB2ZXJ5IHVzZWZ1bCwgZS5nLiB3aGVuIGltcGxlbWVudGluZyBtZW51IHNlcnZpY2VzLiAgTXVsdGlwbGUgLXQKKyAgICAgICAgICAgICBvcHRpb25zIGZvcmNlIHR0eSBhbGxvY2F0aW9uLCBldmVuIGlmIHNzaCBoYXMgbm8gbG9jYWwgdHR5LgorCisgICAgIC1WICAgICAgRGlzcGxheSB0aGUgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQuCisKKyAgICAgLXYgICAgICBWZXJib3NlIG1vZGUuICBDYXVzZXMgc3NoIHRvIHByaW50IGRlYnVnZ2luZyBtZXNzYWdlcyBhYm91dCBpdHMKKyAgICAgICAgICAgICBwcm9ncmVzcy4gIFRoaXMgaXMgaGVscGZ1bCBpbiBkZWJ1Z2dpbmcgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbiwgYW5kIGNvbmZpZ3VyYXRpb24gcHJvYmxlbXMuICBNdWx0aXBsZSAtdiBvcHRpb25zCisgICAgICAgICAgICAgaW5jcmVhc2UgdGhlIHZlcmJvc2l0eS4gIFRoZSBtYXhpbXVtIGlzIDMuCisKKyAgICAgLVcgaG9zdDpwb3J0CisgICAgICAgICAgICAgUmVxdWVzdHMgdGhhdCBzdGFuZGFyZCBpbnB1dCBhbmQgb3V0cHV0IG9uIHRoZSBjbGllbnQgYmUKKyAgICAgICAgICAgICBmb3J3YXJkZWQgdG8gaG9zdCBvbiBwb3J0IG92ZXIgdGhlIHNlY3VyZSBjaGFubmVsLiAgSW1wbGllcyAtTiwKKyAgICAgICAgICAgICAtVCwgRXhpdE9uRm9yd2FyZEZhaWx1cmUgYW5kIENsZWFyQWxsRm9yd2FyZGluZ3MgYW5kIHdvcmtzIHdpdGgKKyAgICAgICAgICAgICBQcm90b2NvbCB2ZXJzaW9uIDIgb25seS4KKworICAgICAtdyBsb2NhbF90dW5bOnJlbW90ZV90dW5dCisgICAgICAgICAgICAgUmVxdWVzdHMgdHVubmVsIGRldmljZSBmb3J3YXJkaW5nIHdpdGggdGhlIHNwZWNpZmllZCB0dW4oNCkKKyAgICAgICAgICAgICBkZXZpY2VzIGJldHdlZW4gdGhlIGNsaWVudCAobG9jYWxfdHVuKSBhbmQgdGhlIHNlcnZlcgorICAgICAgICAgICAgIChyZW1vdGVfdHVuKS4KKworICAgICAgICAgICAgIFRoZSBkZXZpY2VzIG1heSBiZSBzcGVjaWZpZWQgYnkgbnVtZXJpY2FsIElEIG9yIHRoZSBrZXl3b3JkCisgICAgICAgICAgICAgYGBhbnknJywgd2hpY2ggdXNlcyB0aGUgbmV4dCBhdmFpbGFibGUgdHVubmVsIGRldmljZS4gIElmCisgICAgICAgICAgICAgcmVtb3RlX3R1biBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBgYGFueScnLiAgU2VlIGFsc28KKyAgICAgICAgICAgICB0aGUgVHVubmVsIGFuZCBUdW5uZWxEZXZpY2UgZGlyZWN0aXZlcyBpbiBzc2hfY29uZmlnKDUpLiAgSWYgdGhlCisgICAgICAgICAgICAgVHVubmVsIGRpcmVjdGl2ZSBpcyB1bnNldCwgaXQgaXMgc2V0IHRvIHRoZSBkZWZhdWx0IHR1bm5lbCBtb2RlLAorICAgICAgICAgICAgIHdoaWNoIGlzIGBgcG9pbnQtdG8tcG9pbnQnJy4KKworICAgICAtWCAgICAgIEVuYWJsZXMgWDExIGZvcndhcmRpbmcuICBUaGlzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBvbiBhIHBlci1ob3N0CisgICAgICAgICAgICAgYmFzaXMgaW4gYSBjb25maWd1cmF0aW9uIGZpbGUuCisKKyAgICAgICAgICAgICBYMTEgZm9yd2FyZGluZyBzaG91bGQgYmUgZW5hYmxlZCB3aXRoIGNhdXRpb24uICBVc2VycyB3aXRoIHRoZQorICAgICAgICAgICAgIGFiaWxpdHkgdG8gYnlwYXNzIGZpbGUgcGVybWlzc2lvbnMgb24gdGhlIHJlbW90ZSBob3N0IChmb3IgdGhlCisgICAgICAgICAgICAgdXNlcidzIFggYXV0aG9yaXphdGlvbiBkYXRhYmFzZSkgY2FuIGFjY2VzcyB0aGUgbG9jYWwgWDExIGRpc3BsYXkKKyAgICAgICAgICAgICB0aHJvdWdoIHRoZSBmb3J3YXJkZWQgY29ubmVjdGlvbi4gIEFuIGF0dGFja2VyIG1heSB0aGVuIGJlIGFibGUKKyAgICAgICAgICAgICB0byBwZXJmb3JtIGFjdGl2aXRpZXMgc3VjaCBhcyBrZXlzdHJva2UgbW9uaXRvcmluZy4KKworICAgICAgICAgICAgIEZvciB0aGlzIHJlYXNvbiwgWDExIGZvcndhcmRpbmcgaXMgc3ViamVjdGVkIHRvIFgxMSBTRUNVUklUWQorICAgICAgICAgICAgIGV4dGVuc2lvbiByZXN0cmljdGlvbnMgYnkgZGVmYXVsdC4gIFBsZWFzZSByZWZlciB0byB0aGUgc3NoIC1ZCisgICAgICAgICAgICAgb3B0aW9uIGFuZCB0aGUgRm9yd2FyZFgxMVRydXN0ZWQgZGlyZWN0aXZlIGluIHNzaF9jb25maWcoNSkgZm9yCisgICAgICAgICAgICAgbW9yZSBpbmZvcm1hdGlvbi4KKworICAgICAteCAgICAgIERpc2FibGVzIFgxMSBmb3J3YXJkaW5nLgorCisgICAgIC1ZICAgICAgRW5hYmxlcyB0cnVzdGVkIFgxMSBmb3J3YXJkaW5nLiAgVHJ1c3RlZCBYMTEgZm9yd2FyZGluZ3MgYXJlIG5vdAorICAgICAgICAgICAgIHN1YmplY3RlZCB0byB0aGUgWDExIFNFQ1VSSVRZIGV4dGVuc2lvbiBjb250cm9scy4KKworICAgICAteSAgICAgIFNlbmQgbG9nIGluZm9ybWF0aW9uIHVzaW5nIHRoZSBzeXNsb2coMykgc3lzdGVtIG1vZHVsZS4gIEJ5CisgICAgICAgICAgICAgZGVmYXVsdCB0aGlzIGluZm9ybWF0aW9uIGlzIHNlbnQgdG8gc3RkZXJyLgorCisgICAgIHNzaCBtYXkgYWRkaXRpb25hbGx5IG9idGFpbiBjb25maWd1cmF0aW9uIGRhdGEgZnJvbSBhIHBlci11c2VyCisgICAgIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgYSBzeXN0ZW0td2lkZSBjb25maWd1cmF0aW9uIGZpbGUuICBUaGUgZmlsZSBmb3JtYXQKKyAgICAgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgZGVzY3JpYmVkIGluIHNzaF9jb25maWcoNSkuCisKK0FVVEhFTlRJQ0FUSU9OCisgICAgIFRoZSBPcGVuU1NIIFNTSCBjbGllbnQgc3VwcG9ydHMgU1NIIHByb3RvY29scyAxIGFuZCAyLiAgVGhlIGRlZmF1bHQgaXMgdG8KKyAgICAgdXNlIHByb3RvY29sIDIgb25seSwgdGhvdWdoIHRoaXMgY2FuIGJlIGNoYW5nZWQgdmlhIHRoZSBQcm90b2NvbCBvcHRpb24KKyAgICAgaW4gc3NoX2NvbmZpZyg1KSBvciB0aGUgLTEgYW5kIC0yIG9wdGlvbnMgKHNlZSBhYm92ZSkuICBCb3RoIHByb3RvY29scworICAgICBzdXBwb3J0IHNpbWlsYXIgYXV0aGVudGljYXRpb24gbWV0aG9kcywgYnV0IHByb3RvY29sIDIgaXMgdGhlIGRlZmF1bHQKKyAgICAgc2luY2UgaXQgcHJvdmlkZXMgYWRkaXRpb25hbCBtZWNoYW5pc21zIGZvciBjb25maWRlbnRpYWxpdHkgKHRoZSB0cmFmZmljCisgICAgIGlzIGVuY3J5cHRlZCB1c2luZyBBRVMsIDNERVMsIEJsb3dmaXNoLCBDQVNUMTI4LCBvciBBcmNmb3VyKSBhbmQKKyAgICAgaW50ZWdyaXR5IChobWFjLW1kNSwgaG1hYy1zaGExLCBobWFjLXNoYTItMjU2LCBobWFjLXNoYTItNTEyLCB1bWFjLTY0LAorICAgICBobWFjLXJpcGVtZDE2MCkuICBQcm90b2NvbCAxIGxhY2tzIGEgc3Ryb25nIG1lY2hhbmlzbSBmb3IgZW5zdXJpbmcgdGhlCisgICAgIGludGVncml0eSBvZiB0aGUgY29ubmVjdGlvbi4KKworICAgICBUaGUgbWV0aG9kcyBhdmFpbGFibGUgZm9yIGF1dGhlbnRpY2F0aW9uIGFyZTogR1NTQVBJLWJhc2VkCisgICAgIGF1dGhlbnRpY2F0aW9uLCBob3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uLCBwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uLAorICAgICBjaGFsbGVuZ2UtcmVzcG9uc2UgYXV0aGVudGljYXRpb24sIGFuZCBwYXNzd29yZCBhdXRoZW50aWNhdGlvbi4KKyAgICAgQXV0aGVudGljYXRpb24gbWV0aG9kcyBhcmUgdHJpZWQgaW4gdGhlIG9yZGVyIHNwZWNpZmllZCBhYm92ZSwgdGhvdWdoCisgICAgIHByb3RvY29sIDIgaGFzIGEgY29uZmlndXJhdGlvbiBvcHRpb24gdG8gY2hhbmdlIHRoZSBkZWZhdWx0IG9yZGVyOgorICAgICBQcmVmZXJyZWRBdXRoZW50aWNhdGlvbnMuCisKKyAgICAgSG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbiB3b3JrcyBhcyBmb2xsb3dzOiBJZiB0aGUgbWFjaGluZSB0aGUgdXNlciBsb2dzCisgICAgIGluIGZyb20gaXMgbGlzdGVkIGluIC9ldGMvaG9zdHMuZXF1aXYgb3IgL2V0Yy9zaG9zdHMuZXF1aXYgb24gdGhlIHJlbW90ZQorICAgICBtYWNoaW5lLCBhbmQgdGhlIHVzZXIgbmFtZXMgYXJlIHRoZSBzYW1lIG9uIGJvdGggc2lkZXMsIG9yIGlmIHRoZSBmaWxlcworICAgICB+Ly5yaG9zdHMgb3Igfi8uc2hvc3RzIGV4aXN0IGluIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3Rvcnkgb24gdGhlIHJlbW90ZQorICAgICBtYWNoaW5lIGFuZCBjb250YWluIGEgbGluZSBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBjbGllbnQgbWFjaGluZSBhbmQKKyAgICAgdGhlIG5hbWUgb2YgdGhlIHVzZXIgb24gdGhhdCBtYWNoaW5lLCB0aGUgdXNlciBpcyBjb25zaWRlcmVkIGZvciBsb2dpbi4KKyAgICAgQWRkaXRpb25hbGx5LCB0aGUgc2VydmVyIG11c3QgYmUgYWJsZSB0byB2ZXJpZnkgdGhlIGNsaWVudCdzIGhvc3Qga2V5CisgICAgIChzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIC9ldGMvc3NoL3NzaF9rbm93bl9ob3N0cyBhbmQgfi8uc3NoL2tub3duX2hvc3RzLAorICAgICBiZWxvdykgZm9yIGxvZ2luIHRvIGJlIHBlcm1pdHRlZC4gIFRoaXMgYXV0aGVudGljYXRpb24gbWV0aG9kIGNsb3NlcworICAgICBzZWN1cml0eSBob2xlcyBkdWUgdG8gSVAgc3Bvb2ZpbmcsIEROUyBzcG9vZmluZywgYW5kIHJvdXRpbmcgc3Bvb2ZpbmcuCisgICAgIFtOb3RlIHRvIHRoZSBhZG1pbmlzdHJhdG9yOiAvZXRjL2hvc3RzLmVxdWl2LCB+Ly5yaG9zdHMsIGFuZCB0aGUKKyAgICAgcmxvZ2luL3JzaCBwcm90b2NvbCBpbiBnZW5lcmFsLCBhcmUgaW5oZXJlbnRseSBpbnNlY3VyZSBhbmQgc2hvdWxkIGJlCisgICAgIGRpc2FibGVkIGlmIHNlY3VyaXR5IGlzIGRlc2lyZWQuXQorCisgICAgIFB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24gd29ya3MgYXMgZm9sbG93czogVGhlIHNjaGVtZSBpcyBiYXNlZCBvbgorICAgICBwdWJsaWMta2V5IGNyeXB0b2dyYXBoeSwgdXNpbmcgY3J5cHRvc3lzdGVtcyB3aGVyZSBlbmNyeXB0aW9uIGFuZAorICAgICBkZWNyeXB0aW9uIGFyZSBkb25lIHVzaW5nIHNlcGFyYXRlIGtleXMsIGFuZCBpdCBpcyB1bmZlYXNpYmxlIHRvIGRlcml2ZQorICAgICB0aGUgZGVjcnlwdGlvbiBrZXkgZnJvbSB0aGUgZW5jcnlwdGlvbiBrZXkuICBUaGUgaWRlYSBpcyB0aGF0IGVhY2ggdXNlcgorICAgICBjcmVhdGVzIGEgcHVibGljL3ByaXZhdGUga2V5IHBhaXIgZm9yIGF1dGhlbnRpY2F0aW9uIHB1cnBvc2VzLiAgVGhlCisgICAgIHNlcnZlciBrbm93cyB0aGUgcHVibGljIGtleSwgYW5kIG9ubHkgdGhlIHVzZXIga25vd3MgdGhlIHByaXZhdGUga2V5LgorICAgICBzc2ggaW1wbGVtZW50cyBwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uIHByb3RvY29sIGF1dG9tYXRpY2FsbHksIHVzaW5nCisgICAgIG9uZSBvZiB0aGUgRFNBLCBFQ0RTQSBvciBSU0EgYWxnb3JpdGhtcy4gIFByb3RvY29sIDEgaXMgcmVzdHJpY3RlZCB0bworICAgICB1c2luZyBvbmx5IFJTQSBrZXlzLCBidXQgcHJvdG9jb2wgMiBtYXkgdXNlIGFueS4gIFRoZSBISVNUT1JZIHNlY3Rpb24gb2YKKyAgICAgc3NsKDgpIGNvbnRhaW5zIGEgYnJpZWYgZGlzY3Vzc2lvbiBvZiB0aGUgRFNBIGFuZCBSU0EgYWxnb3JpdGhtcy4KKworICAgICBUaGUgZmlsZSB+Ly5zc2gvYXV0aG9yaXplZF9rZXlzIGxpc3RzIHRoZSBwdWJsaWMga2V5cyB0aGF0IGFyZSBwZXJtaXR0ZWQKKyAgICAgZm9yIGxvZ2dpbmcgaW4uICBXaGVuIHRoZSB1c2VyIGxvZ3MgaW4sIHRoZSBzc2ggcHJvZ3JhbSB0ZWxscyB0aGUgc2VydmVyCisgICAgIHdoaWNoIGtleSBwYWlyIGl0IHdvdWxkIGxpa2UgdG8gdXNlIGZvciBhdXRoZW50aWNhdGlvbi4gIFRoZSBjbGllbnQKKyAgICAgcHJvdmVzIHRoYXQgaXQgaGFzIGFjY2VzcyB0byB0aGUgcHJpdmF0ZSBrZXkgYW5kIHRoZSBzZXJ2ZXIgY2hlY2tzIHRoYXQKKyAgICAgdGhlIGNvcnJlc3BvbmRpbmcgcHVibGljIGtleSBpcyBhdXRob3JpemVkIHRvIGFjY2VwdCB0aGUgYWNjb3VudC4KKworICAgICBUaGUgdXNlciBjcmVhdGVzIGhpcy9oZXIga2V5IHBhaXIgYnkgcnVubmluZyBzc2gta2V5Z2VuKDEpLiAgVGhpcyBzdG9yZXMKKyAgICAgdGhlIHByaXZhdGUga2V5IGluIH4vLnNzaC9pZGVudGl0eSAocHJvdG9jb2wgMSksIH4vLnNzaC9pZF9kc2EgKHByb3RvY29sCisgICAgIDIgRFNBKSwgfi8uc3NoL2lkX2VjZHNhIChwcm90b2NvbCAyIEVDRFNBKSwgb3Igfi8uc3NoL2lkX3JzYSAocHJvdG9jb2wgMgorICAgICBSU0EpIGFuZCBzdG9yZXMgdGhlIHB1YmxpYyBrZXkgaW4gfi8uc3NoL2lkZW50aXR5LnB1YiAocHJvdG9jb2wgMSksCisgICAgIH4vLnNzaC9pZF9kc2EucHViIChwcm90b2NvbCAyIERTQSksIH4vLnNzaC9pZF9lY2RzYS5wdWIgKHByb3RvY29sIDIKKyAgICAgRUNEU0EpLCBvciB+Ly5zc2gvaWRfcnNhLnB1YiAocHJvdG9jb2wgMiBSU0EpIGluIHRoZSB1c2VyJ3MgaG9tZQorICAgICBkaXJlY3RvcnkuICBUaGUgdXNlciBzaG91bGQgdGhlbiBjb3B5IHRoZSBwdWJsaWMga2V5IHRvCisgICAgIH4vLnNzaC9hdXRob3JpemVkX2tleXMgaW4gaGlzL2hlciBob21lIGRpcmVjdG9yeSBvbiB0aGUgcmVtb3RlIG1hY2hpbmUuCisgICAgIFRoZSBhdXRob3JpemVkX2tleXMgZmlsZSBjb3JyZXNwb25kcyB0byB0aGUgY29udmVudGlvbmFsIH4vLnJob3N0cyBmaWxlLAorICAgICBhbmQgaGFzIG9uZSBrZXkgcGVyIGxpbmUsIHRob3VnaCB0aGUgbGluZXMgY2FuIGJlIHZlcnkgbG9uZy4gIEFmdGVyIHRoaXMsCisgICAgIHRoZSB1c2VyIGNhbiBsb2cgaW4gd2l0aG91dCBnaXZpbmcgdGhlIHBhc3N3b3JkLgorCisgICAgIEEgdmFyaWF0aW9uIG9uIHB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24gaXMgYXZhaWxhYmxlIGluIHRoZSBmb3JtIG9mCisgICAgIGNlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uOiBpbnN0ZWFkIG9mIGEgc2V0IG9mIHB1YmxpYy9wcml2YXRlIGtleXMsCisgICAgIHNpZ25lZCBjZXJ0aWZpY2F0ZXMgYXJlIHVzZWQuICBUaGlzIGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgYSBzaW5nbGUKKyAgICAgdHJ1c3RlZCBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eSBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiBtYW55CisgICAgIHB1YmxpYy9wcml2YXRlIGtleXMuICBTZWUgdGhlIENFUlRJRklDQVRFUyBzZWN0aW9uIG9mIHNzaC1rZXlnZW4oMSkgZm9yCisgICAgIG1vcmUgaW5mb3JtYXRpb24uCisKKyAgICAgVGhlIG1vc3QgY29udmVuaWVudCB3YXkgdG8gdXNlIHB1YmxpYyBrZXkgb3IgY2VydGlmaWNhdGUgYXV0aGVudGljYXRpb24KKyAgICAgbWF5IGJlIHdpdGggYW4gYXV0aGVudGljYXRpb24gYWdlbnQuICBTZWUgc3NoLWFnZW50KDEpIGZvciBtb3JlCisgICAgIGluZm9ybWF0aW9uLgorCisgICAgIENoYWxsZW5nZS1yZXNwb25zZSBhdXRoZW50aWNhdGlvbiB3b3JrcyBhcyBmb2xsb3dzOiBUaGUgc2VydmVyIHNlbmRzIGFuCisgICAgIGFyYml0cmFyeSAiY2hhbGxlbmdlIiB0ZXh0LCBhbmQgcHJvbXB0cyBmb3IgYSByZXNwb25zZS4gIFByb3RvY29sIDIKKyAgICAgYWxsb3dzIG11bHRpcGxlIGNoYWxsZW5nZXMgYW5kIHJlc3BvbnNlczsgcHJvdG9jb2wgMSBpcyByZXN0cmljdGVkIHRvCisgICAgIGp1c3Qgb25lIGNoYWxsZW5nZS9yZXNwb25zZS4gIEV4YW1wbGVzIG9mIGNoYWxsZW5nZS1yZXNwb25zZQorICAgICBhdXRoZW50aWNhdGlvbiBpbmNsdWRlIEJTRCBBdXRoZW50aWNhdGlvbiAoc2VlIGxvZ2luLmNvbmYoNSkpIGFuZCBQQU0KKyAgICAgKHNvbWUgbm9uLU9wZW5CU0Qgc3lzdGVtcykuCisKKyAgICAgRmluYWxseSwgaWYgb3RoZXIgYXV0aGVudGljYXRpb24gbWV0aG9kcyBmYWlsLCBzc2ggcHJvbXB0cyB0aGUgdXNlciBmb3IgYQorICAgICBwYXNzd29yZC4gIFRoZSBwYXNzd29yZCBpcyBzZW50IHRvIHRoZSByZW1vdGUgaG9zdCBmb3IgY2hlY2tpbmc7IGhvd2V2ZXIsCisgICAgIHNpbmNlIGFsbCBjb21tdW5pY2F0aW9ucyBhcmUgZW5jcnlwdGVkLCB0aGUgcGFzc3dvcmQgY2Fubm90IGJlIHNlZW4gYnkKKyAgICAgc29tZW9uZSBsaXN0ZW5pbmcgb24gdGhlIG5ldHdvcmsuCisKKyAgICAgc3NoIGF1dG9tYXRpY2FsbHkgbWFpbnRhaW5zIGFuZCBjaGVja3MgYSBkYXRhYmFzZSBjb250YWluaW5nCisgICAgIGlkZW50aWZpY2F0aW9uIGZvciBhbGwgaG9zdHMgaXQgaGFzIGV2ZXIgYmVlbiB1c2VkIHdpdGguICBIb3N0IGtleXMgYXJlCisgICAgIHN0b3JlZCBpbiB+Ly5zc2gva25vd25faG9zdHMgaW4gdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeS4gIEFkZGl0aW9uYWxseSwKKyAgICAgdGhlIGZpbGUgL2V0Yy9zc2gvc3NoX2tub3duX2hvc3RzIGlzIGF1dG9tYXRpY2FsbHkgY2hlY2tlZCBmb3Iga25vd24KKyAgICAgaG9zdHMuICBBbnkgbmV3IGhvc3RzIGFyZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSB1c2VyJ3MgZmlsZS4gIElmIGEKKyAgICAgaG9zdCdzIGlkZW50aWZpY2F0aW9uIGV2ZXIgY2hhbmdlcywgc3NoIHdhcm5zIGFib3V0IHRoaXMgYW5kIGRpc2FibGVzCisgICAgIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIHRvIHByZXZlbnQgc2VydmVyIHNwb29maW5nIG9yIG1hbi1pbi10aGUtbWlkZGxlCisgICAgIGF0dGFja3MsIHdoaWNoIGNvdWxkIG90aGVyd2lzZSBiZSB1c2VkIHRvIGNpcmN1bXZlbnQgdGhlIGVuY3J5cHRpb24uICBUaGUKKyAgICAgU3RyaWN0SG9zdEtleUNoZWNraW5nIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBjb250cm9sIGxvZ2lucyB0byBtYWNoaW5lcworICAgICB3aG9zZSBob3N0IGtleSBpcyBub3Qga25vd24gb3IgaGFzIGNoYW5nZWQuCisKKyAgICAgV2hlbiB0aGUgdXNlcidzIGlkZW50aXR5IGhhcyBiZWVuIGFjY2VwdGVkIGJ5IHRoZSBzZXJ2ZXIsIHRoZSBzZXJ2ZXIKKyAgICAgZWl0aGVyIGV4ZWN1dGVzIHRoZSBnaXZlbiBjb21tYW5kLCBvciBsb2dzIGludG8gdGhlIG1hY2hpbmUgYW5kIGdpdmVzIHRoZQorICAgICB1c2VyIGEgbm9ybWFsIHNoZWxsIG9uIHRoZSByZW1vdGUgbWFjaGluZS4gIEFsbCBjb21tdW5pY2F0aW9uIHdpdGggdGhlCisgICAgIHJlbW90ZSBjb21tYW5kIG9yIHNoZWxsIHdpbGwgYmUgYXV0b21hdGljYWxseSBlbmNyeXB0ZWQuCisKKyAgICAgSWYgYSBwc2V1ZG8tdGVybWluYWwgaGFzIGJlZW4gYWxsb2NhdGVkIChub3JtYWwgbG9naW4gc2Vzc2lvbiksIHRoZSB1c2VyCisgICAgIG1heSB1c2UgdGhlIGVzY2FwZSBjaGFyYWN0ZXJzIG5vdGVkIGJlbG93LgorCisgICAgIElmIG5vIHBzZXVkby10dHkgaGFzIGJlZW4gYWxsb2NhdGVkLCB0aGUgc2Vzc2lvbiBpcyB0cmFuc3BhcmVudCBhbmQgY2FuCisgICAgIGJlIHVzZWQgdG8gcmVsaWFibHkgdHJhbnNmZXIgYmluYXJ5IGRhdGEuICBPbiBtb3N0IHN5c3RlbXMsIHNldHRpbmcgdGhlCisgICAgIGVzY2FwZSBjaGFyYWN0ZXIgdG8gYGBub25lJycgd2lsbCBhbHNvIG1ha2UgdGhlIHNlc3Npb24gdHJhbnNwYXJlbnQgZXZlbgorICAgICBpZiBhIHR0eSBpcyB1c2VkLgorCisgICAgIFRoZSBzZXNzaW9uIHRlcm1pbmF0ZXMgd2hlbiB0aGUgY29tbWFuZCBvciBzaGVsbCBvbiB0aGUgcmVtb3RlIG1hY2hpbmUKKyAgICAgZXhpdHMgYW5kIGFsbCBYMTEgYW5kIFRDUCBjb25uZWN0aW9ucyBoYXZlIGJlZW4gY2xvc2VkLgorCitFU0NBUEUgQ0hBUkFDVEVSUworICAgICBXaGVuIGEgcHNldWRvLXRlcm1pbmFsIGhhcyBiZWVuIHJlcXVlc3RlZCwgc3NoIHN1cHBvcnRzIGEgbnVtYmVyIG9mCisgICAgIGZ1bmN0aW9ucyB0aHJvdWdoIHRoZSB1c2Ugb2YgYW4gZXNjYXBlIGNoYXJhY3Rlci4KKworICAgICBBIHNpbmdsZSB0aWxkZSBjaGFyYWN0ZXIgY2FuIGJlIHNlbnQgYXMgfn4gb3IgYnkgZm9sbG93aW5nIHRoZSB0aWxkZSBieSBhCisgICAgIGNoYXJhY3RlciBvdGhlciB0aGFuIHRob3NlIGRlc2NyaWJlZCBiZWxvdy4gIFRoZSBlc2NhcGUgY2hhcmFjdGVyIG11c3QKKyAgICAgYWx3YXlzIGZvbGxvdyBhIG5ld2xpbmUgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgc3BlY2lhbC4gIFRoZSBlc2NhcGUKKyAgICAgY2hhcmFjdGVyIGNhbiBiZSBjaGFuZ2VkIGluIGNvbmZpZ3VyYXRpb24gZmlsZXMgdXNpbmcgdGhlIEVzY2FwZUNoYXIKKyAgICAgY29uZmlndXJhdGlvbiBkaXJlY3RpdmUgb3Igb24gdGhlIGNvbW1hbmQgbGluZSBieSB0aGUgLWUgb3B0aW9uLgorCisgICAgIFRoZSBzdXBwb3J0ZWQgZXNjYXBlcyAoYXNzdW1pbmcgdGhlIGRlZmF1bHQgYH4nKSBhcmU6CisKKyAgICAgfi4gICAgICBEaXNjb25uZWN0LgorCisgICAgIH5eWiAgICAgQmFja2dyb3VuZCBzc2guCisKKyAgICAgfiMgICAgICBMaXN0IGZvcndhcmRlZCBjb25uZWN0aW9ucy4KKworICAgICB+JiAgICAgIEJhY2tncm91bmQgc3NoIGF0IGxvZ291dCB3aGVuIHdhaXRpbmcgZm9yIGZvcndhcmRlZCBjb25uZWN0aW9uIC8KKyAgICAgICAgICAgICBYMTEgc2Vzc2lvbnMgdG8gdGVybWluYXRlLgorCisgICAgIH4/ICAgICAgRGlzcGxheSBhIGxpc3Qgb2YgZXNjYXBlIGNoYXJhY3RlcnMuCisKKyAgICAgfkIgICAgICBTZW5kIGEgQlJFQUsgdG8gdGhlIHJlbW90ZSBzeXN0ZW0gKG9ubHkgdXNlZnVsIGZvciBTU0ggcHJvdG9jb2wKKyAgICAgICAgICAgICB2ZXJzaW9uIDIgYW5kIGlmIHRoZSBwZWVyIHN1cHBvcnRzIGl0KS4KKworICAgICB+QyAgICAgIE9wZW4gY29tbWFuZCBsaW5lLiAgQ3VycmVudGx5IHRoaXMgYWxsb3dzIHRoZSBhZGRpdGlvbiBvZiBwb3J0CisgICAgICAgICAgICAgZm9yd2FyZGluZ3MgdXNpbmcgdGhlIC1MLCAtUiBhbmQgLUQgb3B0aW9ucyAoc2VlIGFib3ZlKS4gIEl0IGFsc28KKyAgICAgICAgICAgICBhbGxvd3MgdGhlIGNhbmNlbGxhdGlvbiBvZiBleGlzdGluZyBwb3J0LWZvcndhcmRpbmdzIHdpdGgKKyAgICAgICAgICAgICAtS0xbYmluZF9hZGRyZXNzOl1wb3J0IGZvciBsb2NhbCwgLUtSW2JpbmRfYWRkcmVzczpdcG9ydCBmb3IKKyAgICAgICAgICAgICByZW1vdGUgYW5kIC1LRFtiaW5kX2FkZHJlc3M6XXBvcnQgZm9yIGR5bmFtaWMgcG9ydC1mb3J3YXJkaW5ncy4KKyAgICAgICAgICAgICAhY29tbWFuZCBhbGxvd3MgdGhlIHVzZXIgdG8gZXhlY3V0ZSBhIGxvY2FsIGNvbW1hbmQgaWYgdGhlCisgICAgICAgICAgICAgUGVybWl0TG9jYWxDb21tYW5kIG9wdGlvbiBpcyBlbmFibGVkIGluIHNzaF9jb25maWcoNSkuICBCYXNpYworICAgICAgICAgICAgIGhlbHAgaXMgYXZhaWxhYmxlLCB1c2luZyB0aGUgLWggb3B0aW9uLgorCisgICAgIH5SICAgICAgUmVxdWVzdCByZWtleWluZyBvZiB0aGUgY29ubmVjdGlvbiAob25seSB1c2VmdWwgZm9yIFNTSCBwcm90b2NvbAorICAgICAgICAgICAgIHZlcnNpb24gMiBhbmQgaWYgdGhlIHBlZXIgc3VwcG9ydHMgaXQpLgorCitUQ1AgRk9SV0FSRElORworICAgICBGb3J3YXJkaW5nIG9mIGFyYml0cmFyeSBUQ1AgY29ubmVjdGlvbnMgb3ZlciB0aGUgc2VjdXJlIGNoYW5uZWwgY2FuIGJlCisgICAgIHNwZWNpZmllZCBlaXRoZXIgb24gdGhlIGNvbW1hbmQgbGluZSBvciBpbiBhIGNvbmZpZ3VyYXRpb24gZmlsZS4gIE9uZQorICAgICBwb3NzaWJsZSBhcHBsaWNhdGlvbiBvZiBUQ1AgZm9yd2FyZGluZyBpcyBhIHNlY3VyZSBjb25uZWN0aW9uIHRvIGEgbWFpbAorICAgICBzZXJ2ZXI7IGFub3RoZXIgaXMgZ29pbmcgdGhyb3VnaCBmaXJld2FsbHMuCisKKyAgICAgSW4gdGhlIGV4YW1wbGUgYmVsb3csIHdlIGxvb2sgYXQgZW5jcnlwdGluZyBjb21tdW5pY2F0aW9uIGJldHdlZW4gYW4gSVJDCisgICAgIGNsaWVudCBhbmQgc2VydmVyLCBldmVuIHRob3VnaCB0aGUgSVJDIHNlcnZlciBkb2VzIG5vdCBkaXJlY3RseSBzdXBwb3J0CisgICAgIGVuY3J5cHRlZCBjb21tdW5pY2F0aW9ucy4gIFRoaXMgd29ya3MgYXMgZm9sbG93czogdGhlIHVzZXIgY29ubmVjdHMgdG8KKyAgICAgdGhlIHJlbW90ZSBob3N0IHVzaW5nIHNzaCwgc3BlY2lmeWluZyBhIHBvcnQgdG8gYmUgdXNlZCB0byBmb3J3YXJkCisgICAgIGNvbm5lY3Rpb25zIHRvIHRoZSByZW1vdGUgc2VydmVyLiAgQWZ0ZXIgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBzdGFydCB0aGUKKyAgICAgc2VydmljZSB3aGljaCBpcyB0byBiZSBlbmNyeXB0ZWQgb24gdGhlIGNsaWVudCBtYWNoaW5lLCBjb25uZWN0aW5nIHRvIHRoZQorICAgICBzYW1lIGxvY2FsIHBvcnQsIGFuZCBzc2ggd2lsbCBlbmNyeXB0IGFuZCBmb3J3YXJkIHRoZSBjb25uZWN0aW9uLgorCisgICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSB0dW5uZWxzIGFuIElSQyBzZXNzaW9uIGZyb20gY2xpZW50IG1hY2hpbmUKKyAgICAgYGAxMjcuMC4wLjEnJyAobG9jYWxob3N0KSB0byByZW1vdGUgc2VydmVyIGBgc2VydmVyLmV4YW1wbGUuY29tJyc6CisKKyAgICAgICAgICQgc3NoIC1mIC1MIDEyMzQ6bG9jYWxob3N0OjY2Njcgc2VydmVyLmV4YW1wbGUuY29tIHNsZWVwIDEwCisgICAgICAgICAkIGlyYyAtYyAnI3VzZXJzJyAtcCAxMjM0IHBpbmt5IDEyNy4wLjAuMQorCisgICAgIFRoaXMgdHVubmVscyBhIGNvbm5lY3Rpb24gdG8gSVJDIHNlcnZlciBgYHNlcnZlci5leGFtcGxlLmNvbScnLCBqb2luaW5nCisgICAgIGNoYW5uZWwgYGAjdXNlcnMnJywgbmlja25hbWUgYGBwaW5reScnLCB1c2luZyBwb3J0IDEyMzQuICBJdCBkb2Vzbid0CisgICAgIG1hdHRlciB3aGljaCBwb3J0IGlzIHVzZWQsIGFzIGxvbmcgYXMgaXQncyBncmVhdGVyIHRoYW4gMTAyMyAocmVtZW1iZXIsCisgICAgIG9ubHkgcm9vdCBjYW4gb3BlbiBzb2NrZXRzIG9uIHByaXZpbGVnZWQgcG9ydHMpIGFuZCBkb2Vzbid0IGNvbmZsaWN0IHdpdGgKKyAgICAgYW55IHBvcnRzIGFscmVhZHkgaW4gdXNlLiAgVGhlIGNvbm5lY3Rpb24gaXMgZm9yd2FyZGVkIHRvIHBvcnQgNjY2NyBvbgorICAgICB0aGUgcmVtb3RlIHNlcnZlciwgc2luY2UgdGhhdCdzIHRoZSBzdGFuZGFyZCBwb3J0IGZvciBJUkMgc2VydmljZXMuCisKKyAgICAgVGhlIC1mIG9wdGlvbiBiYWNrZ3JvdW5kcyBzc2ggYW5kIHRoZSByZW1vdGUgY29tbWFuZCBgYHNsZWVwIDEwJycgaXMKKyAgICAgc3BlY2lmaWVkIHRvIGFsbG93IGFuIGFtb3VudCBvZiB0aW1lICgxMCBzZWNvbmRzLCBpbiB0aGUgZXhhbXBsZSkgdG8KKyAgICAgc3RhcnQgdGhlIHNlcnZpY2Ugd2hpY2ggaXMgdG8gYmUgdHVubmVsbGVkLiAgSWYgbm8gY29ubmVjdGlvbnMgYXJlIG1hZGUKKyAgICAgd2l0aGluIHRoZSB0aW1lIHNwZWNpZmllZCwgc3NoIHdpbGwgZXhpdC4KKworWDExIEZPUldBUkRJTkcKKyAgICAgSWYgdGhlIEZvcndhcmRYMTEgdmFyaWFibGUgaXMgc2V0IHRvIGBgeWVzJycgKG9yIHNlZSB0aGUgZGVzY3JpcHRpb24gb2YKKyAgICAgdGhlIC1YLCAteCwgYW5kIC1ZIG9wdGlvbnMgYWJvdmUpIGFuZCB0aGUgdXNlciBpcyB1c2luZyBYMTEgKHRoZSBESVNQTEFZCisgICAgIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCksIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBYMTEgZGlzcGxheSBpcworICAgICBhdXRvbWF0aWNhbGx5IGZvcndhcmRlZCB0byB0aGUgcmVtb3RlIHNpZGUgaW4gc3VjaCBhIHdheSB0aGF0IGFueSBYMTEKKyAgICAgcHJvZ3JhbXMgc3RhcnRlZCBmcm9tIHRoZSBzaGVsbCAob3IgY29tbWFuZCkgd2lsbCBnbyB0aHJvdWdoIHRoZQorICAgICBlbmNyeXB0ZWQgY2hhbm5lbCwgYW5kIHRoZSBjb25uZWN0aW9uIHRvIHRoZSByZWFsIFggc2VydmVyIHdpbGwgYmUgbWFkZQorICAgICBmcm9tIHRoZSBsb2NhbCBtYWNoaW5lLiAgVGhlIHVzZXIgc2hvdWxkIG5vdCBtYW51YWxseSBzZXQgRElTUExBWS4KKyAgICAgRm9yd2FyZGluZyBvZiBYMTEgY29ubmVjdGlvbnMgY2FuIGJlIGNvbmZpZ3VyZWQgb24gdGhlIGNvbW1hbmQgbGluZSBvciBpbgorICAgICBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgIFRoZSBESVNQTEFZIHZhbHVlIHNldCBieSBzc2ggd2lsbCBwb2ludCB0byB0aGUgc2VydmVyIG1hY2hpbmUsIGJ1dCB3aXRoIGEKKyAgICAgZGlzcGxheSBudW1iZXIgZ3JlYXRlciB0aGFuIHplcm8uICBUaGlzIGlzIG5vcm1hbCwgYW5kIGhhcHBlbnMgYmVjYXVzZQorICAgICBzc2ggY3JlYXRlcyBhIGBgcHJveHknJyBYIHNlcnZlciBvbiB0aGUgc2VydmVyIG1hY2hpbmUgZm9yIGZvcndhcmRpbmcgdGhlCisgICAgIGNvbm5lY3Rpb25zIG92ZXIgdGhlIGVuY3J5cHRlZCBjaGFubmVsLgorCisgICAgIHNzaCB3aWxsIGFsc28gYXV0b21hdGljYWxseSBzZXQgdXAgWGF1dGhvcml0eSBkYXRhIG9uIHRoZSBzZXJ2ZXIgbWFjaGluZS4KKyAgICAgRm9yIHRoaXMgcHVycG9zZSwgaXQgd2lsbCBnZW5lcmF0ZSBhIHJhbmRvbSBhdXRob3JpemF0aW9uIGNvb2tpZSwgc3RvcmUKKyAgICAgaXQgaW4gWGF1dGhvcml0eSBvbiB0aGUgc2VydmVyLCBhbmQgdmVyaWZ5IHRoYXQgYW55IGZvcndhcmRlZCBjb25uZWN0aW9ucworICAgICBjYXJyeSB0aGlzIGNvb2tpZSBhbmQgcmVwbGFjZSBpdCBieSB0aGUgcmVhbCBjb29raWUgd2hlbiB0aGUgY29ubmVjdGlvbgorICAgICBpcyBvcGVuZWQuICBUaGUgcmVhbCBhdXRoZW50aWNhdGlvbiBjb29raWUgaXMgbmV2ZXIgc2VudCB0byB0aGUgc2VydmVyCisgICAgIG1hY2hpbmUgKGFuZCBubyBjb29raWVzIGFyZSBzZW50IGluIHRoZSBwbGFpbikuCisKKyAgICAgSWYgdGhlIEZvcndhcmRBZ2VudCB2YXJpYWJsZSBpcyBzZXQgdG8gYGB5ZXMnJyAob3Igc2VlIHRoZSBkZXNjcmlwdGlvbiBvZgorICAgICB0aGUgLUEgYW5kIC1hIG9wdGlvbnMgYWJvdmUpIGFuZCB0aGUgdXNlciBpcyB1c2luZyBhbiBhdXRoZW50aWNhdGlvbgorICAgICBhZ2VudCwgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGFnZW50IGlzIGF1dG9tYXRpY2FsbHkgZm9yd2FyZGVkIHRvIHRoZQorICAgICByZW1vdGUgc2lkZS4KKworVkVSSUZZSU5HIEhPU1QgS0VZUworICAgICBXaGVuIGNvbm5lY3RpbmcgdG8gYSBzZXJ2ZXIgZm9yIHRoZSBmaXJzdCB0aW1lLCBhIGZpbmdlcnByaW50IG9mIHRoZQorICAgICBzZXJ2ZXIncyBwdWJsaWMga2V5IGlzIHByZXNlbnRlZCB0byB0aGUgdXNlciAodW5sZXNzIHRoZSBvcHRpb24KKyAgICAgU3RyaWN0SG9zdEtleUNoZWNraW5nIGhhcyBiZWVuIGRpc2FibGVkKS4gIEZpbmdlcnByaW50cyBjYW4gYmUgZGV0ZXJtaW5lZAorICAgICB1c2luZyBzc2gta2V5Z2VuKDEpOgorCisgICAgICAgICAgICQgc3NoLWtleWdlbiAtbCAtZiAvZXRjL3NzaC9zc2hfaG9zdF9yc2Ffa2V5CisKKyAgICAgSWYgdGhlIGZpbmdlcnByaW50IGlzIGFscmVhZHkga25vd24sIGl0IGNhbiBiZSBtYXRjaGVkIGFuZCB0aGUga2V5IGNhbiBiZQorICAgICBhY2NlcHRlZCBvciByZWplY3RlZC4gIEJlY2F1c2Ugb2YgdGhlIGRpZmZpY3VsdHkgb2YgY29tcGFyaW5nIGhvc3Qga2V5cworICAgICBqdXN0IGJ5IGxvb2tpbmcgYXQgaGV4IHN0cmluZ3MsIHRoZXJlIGlzIGFsc28gc3VwcG9ydCB0byBjb21wYXJlIGhvc3QKKyAgICAga2V5cyB2aXN1YWxseSwgdXNpbmcgcmFuZG9tIGFydC4gIEJ5IHNldHRpbmcgdGhlIFZpc3VhbEhvc3RLZXkgb3B0aW9uIHRvCisgICAgIGBgeWVzJycsIGEgc21hbGwgQVNDSUkgZ3JhcGhpYyBnZXRzIGRpc3BsYXllZCBvbiBldmVyeSBsb2dpbiB0byBhIHNlcnZlciwKKyAgICAgbm8gbWF0dGVyIGlmIHRoZSBzZXNzaW9uIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBvciBub3QuICBCeSBsZWFybmluZyB0aGUKKyAgICAgcGF0dGVybiBhIGtub3duIHNlcnZlciBwcm9kdWNlcywgYSB1c2VyIGNhbiBlYXNpbHkgZmluZCBvdXQgdGhhdCB0aGUgaG9zdAorICAgICBrZXkgaGFzIGNoYW5nZWQgd2hlbiBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHBhdHRlcm4gaXMgZGlzcGxheWVkLgorICAgICBCZWNhdXNlIHRoZXNlIHBhdHRlcm5zIGFyZSBub3QgdW5hbWJpZ3VvdXMgaG93ZXZlciwgYSBwYXR0ZXJuIHRoYXQgbG9va3MKKyAgICAgc2ltaWxhciB0byB0aGUgcGF0dGVybiByZW1lbWJlcmVkIG9ubHkgZ2l2ZXMgYSBnb29kIHByb2JhYmlsaXR5IHRoYXQgdGhlCisgICAgIGhvc3Qga2V5IGlzIHRoZSBzYW1lLCBub3QgZ3VhcmFudGVlZCBwcm9vZi4KKworICAgICBUbyBnZXQgYSBsaXN0aW5nIG9mIHRoZSBmaW5nZXJwcmludHMgYWxvbmcgd2l0aCB0aGVpciByYW5kb20gYXJ0IGZvciBhbGwKKyAgICAga25vd24gaG9zdHMsIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBsaW5lIGNhbiBiZSB1c2VkOgorCisgICAgICAgICAgICQgc3NoLWtleWdlbiAtbHYgLWYgfi8uc3NoL2tub3duX2hvc3RzCisKKyAgICAgSWYgdGhlIGZpbmdlcnByaW50IGlzIHVua25vd24sIGFuIGFsdGVybmF0aXZlIG1ldGhvZCBvZiB2ZXJpZmljYXRpb24gaXMKKyAgICAgYXZhaWxhYmxlOiBTU0ggZmluZ2VycHJpbnRzIHZlcmlmaWVkIGJ5IEROUy4gIEFuIGFkZGl0aW9uYWwgcmVzb3VyY2UKKyAgICAgcmVjb3JkIChSUiksIFNTSEZQLCBpcyBhZGRlZCB0byBhIHpvbmVmaWxlIGFuZCB0aGUgY29ubmVjdGluZyBjbGllbnQgaXMKKyAgICAgYWJsZSB0byBtYXRjaCB0aGUgZmluZ2VycHJpbnQgd2l0aCB0aGF0IG9mIHRoZSBrZXkgcHJlc2VudGVkLgorCisgICAgIEluIHRoaXMgZXhhbXBsZSwgd2UgYXJlIGNvbm5lY3RpbmcgYSBjbGllbnQgdG8gYSBzZXJ2ZXIsCisgICAgIGBgaG9zdC5leGFtcGxlLmNvbScnLiAgVGhlIFNTSEZQIHJlc291cmNlIHJlY29yZHMgc2hvdWxkIGZpcnN0IGJlIGFkZGVkCisgICAgIHRvIHRoZSB6b25lZmlsZSBmb3IgaG9zdC5leGFtcGxlLmNvbToKKworICAgICAgICAgICAkIHNzaC1rZXlnZW4gLXIgaG9zdC5leGFtcGxlLmNvbS4KKworICAgICBUaGUgb3V0cHV0IGxpbmVzIHdpbGwgaGF2ZSB0byBiZSBhZGRlZCB0byB0aGUgem9uZWZpbGUuICBUbyBjaGVjayB0aGF0CisgICAgIHRoZSB6b25lIGlzIGFuc3dlcmluZyBmaW5nZXJwcmludCBxdWVyaWVzOgorCisgICAgICAgICAgICQgZGlnIC10IFNTSEZQIGhvc3QuZXhhbXBsZS5jb20KKworICAgICBGaW5hbGx5IHRoZSBjbGllbnQgY29ubmVjdHM6CisKKyAgICAgICAgICAgJCBzc2ggLW8gIlZlcmlmeUhvc3RLZXlETlMgYXNrIiBob3N0LmV4YW1wbGUuY29tCisgICAgICAgICAgIFsuLi5dCisgICAgICAgICAgIE1hdGNoaW5nIGhvc3Qga2V5IGZpbmdlcnByaW50IGZvdW5kIGluIEROUy4KKyAgICAgICAgICAgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlIGNvbm5lY3RpbmcgKHllcy9ubyk/CisKKyAgICAgU2VlIHRoZSBWZXJpZnlIb3N0S2V5RE5TIG9wdGlvbiBpbiBzc2hfY29uZmlnKDUpIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitTU0gtQkFTRUQgVklSVFVBTCBQUklWQVRFIE5FVFdPUktTCisgICAgIHNzaCBjb250YWlucyBzdXBwb3J0IGZvciBWaXJ0dWFsIFByaXZhdGUgTmV0d29yayAoVlBOKSB0dW5uZWxsaW5nIHVzaW5nCisgICAgIHRoZSB0dW4oNCkgbmV0d29yayBwc2V1ZG8tZGV2aWNlLCBhbGxvd2luZyB0d28gbmV0d29ya3MgdG8gYmUgam9pbmVkCisgICAgIHNlY3VyZWx5LiAgVGhlIHNzaGRfY29uZmlnKDUpIGNvbmZpZ3VyYXRpb24gb3B0aW9uIFBlcm1pdFR1bm5lbCBjb250cm9scworICAgICB3aGV0aGVyIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgdGhpcywgYW5kIGF0IHdoYXQgbGV2ZWwgKGxheWVyIDIgb3IgMworICAgICB0cmFmZmljKS4KKworICAgICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgd291bGQgY29ubmVjdCBjbGllbnQgbmV0d29yayAxMC4wLjUwLjAvMjQgd2l0aAorICAgICByZW1vdGUgbmV0d29yayAxMC4wLjk5LjAvMjQgdXNpbmcgYSBwb2ludC10by1wb2ludCBjb25uZWN0aW9uIGZyb20KKyAgICAgMTAuMS4xLjEgdG8gMTAuMS4xLjIsIHByb3ZpZGVkIHRoYXQgdGhlIFNTSCBzZXJ2ZXIgcnVubmluZyBvbiB0aGUgZ2F0ZXdheQorICAgICB0byB0aGUgcmVtb3RlIG5ldHdvcmssIGF0IDE5Mi4xNjguMS4xNSwgYWxsb3dzIGl0LgorCisgICAgIE9uIHRoZSBjbGllbnQ6CisKKyAgICAgICAgICAgIyBzc2ggLWYgLXcgMDoxIDE5Mi4xNjguMS4xNSB0cnVlCisgICAgICAgICAgICMgaWZjb25maWcgdHVuMCAxMC4xLjEuMSAxMC4xLjEuMiBuZXRtYXNrIDI1NS4yNTUuMjU1LjI1MgorICAgICAgICAgICAjIHJvdXRlIGFkZCAxMC4wLjk5LjAvMjQgMTAuMS4xLjIKKworICAgICBPbiB0aGUgc2VydmVyOgorCisgICAgICAgICAgICMgaWZjb25maWcgdHVuMSAxMC4xLjEuMiAxMC4xLjEuMSBuZXRtYXNrIDI1NS4yNTUuMjU1LjI1MgorICAgICAgICAgICAjIHJvdXRlIGFkZCAxMC4wLjUwLjAvMjQgMTAuMS4xLjEKKworICAgICBDbGllbnQgYWNjZXNzIG1heSBiZSBtb3JlIGZpbmVseSB0dW5lZCB2aWEgdGhlIC9yb290Ly5zc2gvYXV0aG9yaXplZF9rZXlzCisgICAgIGZpbGUgKHNlZSBiZWxvdykgYW5kIHRoZSBQZXJtaXRSb290TG9naW4gc2VydmVyIG9wdGlvbi4gIFRoZSBmb2xsb3dpbmcKKyAgICAgZW50cnkgd291bGQgcGVybWl0IGNvbm5lY3Rpb25zIG9uIHR1big0KSBkZXZpY2UgMSBmcm9tIHVzZXIgYGBqYW5lJycgYW5kCisgICAgIG9uIHR1biBkZXZpY2UgMiBmcm9tIHVzZXIgYGBqb2huJycsIGlmIFBlcm1pdFJvb3RMb2dpbiBpcyBzZXQgdG8KKyAgICAgYGBmb3JjZWQtY29tbWFuZHMtb25seScnOgorCisgICAgICAgdHVubmVsPSIxIixjb21tYW5kPSJzaCAvZXRjL25ldHN0YXJ0IHR1bjEiIHNzaC1yc2EgLi4uIGphbmUKKyAgICAgICB0dW5uZWw9IjIiLGNvbW1hbmQ9InNoIC9ldGMvbmV0c3RhcnQgdHVuMiIgc3NoLXJzYSAuLi4gam9obgorCisgICAgIFNpbmNlIGFuIFNTSC1iYXNlZCBzZXR1cCBlbnRhaWxzIGEgZmFpciBhbW91bnQgb2Ygb3ZlcmhlYWQsIGl0IG1heSBiZQorICAgICBtb3JlIHN1aXRlZCB0byB0ZW1wb3Jhcnkgc2V0dXBzLCBzdWNoIGFzIGZvciB3aXJlbGVzcyBWUE5zLiAgTW9yZQorICAgICBwZXJtYW5lbnQgVlBOcyBhcmUgYmV0dGVyIHByb3ZpZGVkIGJ5IHRvb2xzIHN1Y2ggYXMgaXBzZWNjdGwoOCkgYW5kCisgICAgIGlzYWttcGQoOCkuCisKK0VOVklST05NRU5UCisgICAgIHNzaCB3aWxsIG5vcm1hbGx5IHNldCB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlczoKKworICAgICBESVNQTEFZICAgICAgICAgICAgICAgVGhlIERJU1BMQVkgdmFyaWFibGUgaW5kaWNhdGVzIHRoZSBsb2NhdGlvbiBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFgxMSBzZXJ2ZXIuICBJdCBpcyBhdXRvbWF0aWNhbGx5IHNldCBieSBzc2ggdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50IHRvIGEgdmFsdWUgb2YgdGhlIGZvcm0gYGBob3N0bmFtZTpuJycsIHdoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBgYGhvc3RuYW1lJycgaW5kaWNhdGVzIHRoZSBob3N0IHdoZXJlIHRoZSBzaGVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVucywgYW5kIGBuJyBpcyBhbiBpbnRlZ2VyID49IDEuICBzc2ggdXNlcyB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsIHZhbHVlIHRvIGZvcndhcmQgWDExIGNvbm5lY3Rpb25zIG92ZXIgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cmUgY2hhbm5lbC4gIFRoZSB1c2VyIHNob3VsZCBub3JtYWxseSBub3Qgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICBESVNQTEFZIGV4cGxpY2l0bHksIGFzIHRoYXQgd2lsbCByZW5kZXIgdGhlIFgxMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBpbnNlY3VyZSAoYW5kIHdpbGwgcmVxdWlyZSB0aGUgdXNlciB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFudWFsbHkgY29weSBhbnkgcmVxdWlyZWQgYXV0aG9yaXphdGlvbiBjb29raWVzKS4KKworICAgICBIT01FICAgICAgICAgICAgICAgICAgU2V0IHRvIHRoZSBwYXRoIG9mIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuCisKKyAgICAgTE9HTkFNRSAgICAgICAgICAgICAgIFN5bm9ueW0gZm9yIFVTRVI7IHNldCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1zIHRoYXQgdXNlIHRoaXMgdmFyaWFibGUuCisKKyAgICAgTUFJTCAgICAgICAgICAgICAgICAgIFNldCB0byB0aGUgcGF0aCBvZiB0aGUgdXNlcidzIG1haWxib3guCisKKyAgICAgUEFUSCAgICAgICAgICAgICAgICAgIFNldCB0byB0aGUgZGVmYXVsdCBQQVRILCBhcyBzcGVjaWZpZWQgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsaW5nIHNzaC4KKworICAgICBTU0hfQVNLUEFTUyAgICAgICAgICAgSWYgc3NoIG5lZWRzIGEgcGFzc3BocmFzZSwgaXQgd2lsbCByZWFkIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3BocmFzZSBmcm9tIHRoZSBjdXJyZW50IHRlcm1pbmFsIGlmIGl0IHdhcyBydW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gYSB0ZXJtaW5hbC4gIElmIHNzaCBkb2VzIG5vdCBoYXZlIGEgdGVybWluYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBpdCBidXQgRElTUExBWSBhbmQgU1NIX0FTS1BBU1MgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQsIGl0IHdpbGwgZXhlY3V0ZSB0aGUgcHJvZ3JhbSBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTSF9BU0tQQVNTIGFuZCBvcGVuIGFuIFgxMSB3aW5kb3cgdG8gcmVhZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NwaHJhc2UuICBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZyBzc2ggZnJvbSBhIC54c2Vzc2lvbiBvciByZWxhdGVkIHNjcmlwdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChOb3RlIHRoYXQgb24gc29tZSBtYWNoaW5lcyBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdCB0aGUgaW5wdXQgZnJvbSAvZGV2L251bGwgdG8gbWFrZSB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLikKKworICAgICBTU0hfQVVUSF9TT0NLICAgICAgICAgSWRlbnRpZmllcyB0aGUgcGF0aCBvZiBhIFVOSVgtZG9tYWluIHNvY2tldCB1c2VkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tdW5pY2F0ZSB3aXRoIHRoZSBhZ2VudC4KKworICAgICBTU0hfQ09OTkVDVElPTiAgICAgICAgSWRlbnRpZmllcyB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgZW5kcyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uICBUaGUgdmFyaWFibGUgY29udGFpbnMgZm91ciBzcGFjZS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRlZCB2YWx1ZXM6IGNsaWVudCBJUCBhZGRyZXNzLCBjbGllbnQgcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyLCBzZXJ2ZXIgSVAgYWRkcmVzcywgYW5kIHNlcnZlciBwb3J0IG51bWJlci4KKworICAgICBTU0hfT1JJR0lOQUxfQ09NTUFORCAgVGhpcyB2YXJpYWJsZSBjb250YWlucyB0aGUgb3JpZ2luYWwgY29tbWFuZCBsaW5lIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGZvcmNlZCBjb21tYW5kIGlzIGV4ZWN1dGVkLiAgSXQgY2FuIGJlIHVzZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3QgdGhlIG9yaWdpbmFsIGFyZ3VtZW50cy4KKworICAgICBTU0hfVFRZICAgICAgICAgICAgICAgVGhpcyBpcyBzZXQgdG8gdGhlIG5hbWUgb2YgdGhlIHR0eSAocGF0aCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSkgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IHNoZWxsIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLiAgSWYgdGhlIGN1cnJlbnQgc2Vzc2lvbiBoYXMgbm8gdHR5LCB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBpcyBub3Qgc2V0LgorCisgICAgIFRaICAgICAgICAgICAgICAgICAgICBUaGlzIHZhcmlhYmxlIGlzIHNldCB0byBpbmRpY2F0ZSB0aGUgcHJlc2VudCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICB6b25lIGlmIGl0IHdhcyBzZXQgd2hlbiB0aGUgZGFlbW9uIHdhcyBzdGFydGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiB0aGUgZGFlbW9uIHBhc3NlcyB0aGUgdmFsdWUgb24gdG8gbmV3CisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucykuCisKKyAgICAgVVNFUiAgICAgICAgICAgICAgICAgIFNldCB0byB0aGUgbmFtZSBvZiB0aGUgdXNlciBsb2dnaW5nIGluLgorCisgICAgIEFkZGl0aW9uYWxseSwgc3NoIHJlYWRzIH4vLnNzaC9lbnZpcm9ubWVudCwgYW5kIGFkZHMgbGluZXMgb2YgdGhlIGZvcm1hdAorICAgICBgYFZBUk5BTUU9dmFsdWUnJyB0byB0aGUgZW52aXJvbm1lbnQgaWYgdGhlIGZpbGUgZXhpc3RzIGFuZCB1c2VycyBhcmUKKyAgICAgYWxsb3dlZCB0byBjaGFuZ2UgdGhlaXIgZW52aXJvbm1lbnQuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZQorICAgICBQZXJtaXRVc2VyRW52aXJvbm1lbnQgb3B0aW9uIGluIHNzaGRfY29uZmlnKDUpLgorCitGSUxFUworICAgICB+Ly5yaG9zdHMKKyAgICAgICAgICAgICBUaGlzIGZpbGUgaXMgdXNlZCBmb3IgaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbiAoc2VlIGFib3ZlKS4gIE9uCisgICAgICAgICAgICAgc29tZSBtYWNoaW5lcyB0aGlzIGZpbGUgbWF5IG5lZWQgdG8gYmUgd29ybGQtcmVhZGFibGUgaWYgdGhlCisgICAgICAgICAgICAgdXNlcidzIGhvbWUgZGlyZWN0b3J5IGlzIG9uIGFuIE5GUyBwYXJ0aXRpb24sIGJlY2F1c2Ugc3NoZCg4KQorICAgICAgICAgICAgIHJlYWRzIGl0IGFzIHJvb3QuICBBZGRpdGlvbmFsbHksIHRoaXMgZmlsZSBtdXN0IGJlIG93bmVkIGJ5IHRoZQorICAgICAgICAgICAgIHVzZXIsIGFuZCBtdXN0IG5vdCBoYXZlIHdyaXRlIHBlcm1pc3Npb25zIGZvciBhbnlvbmUgZWxzZS4gIFRoZQorICAgICAgICAgICAgIHJlY29tbWVuZGVkIHBlcm1pc3Npb24gZm9yIG1vc3QgbWFjaGluZXMgaXMgcmVhZC93cml0ZSBmb3IgdGhlCisgICAgICAgICAgICAgdXNlciwgYW5kIG5vdCBhY2Nlc3NpYmxlIGJ5IG90aGVycy4KKworICAgICB+Ly5zaG9zdHMKKyAgICAgICAgICAgICBUaGlzIGZpbGUgaXMgdXNlZCBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSBhcyAucmhvc3RzLCBidXQgYWxsb3dzCisgICAgICAgICAgICAgaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbiB3aXRob3V0IHBlcm1pdHRpbmcgbG9naW4gd2l0aAorICAgICAgICAgICAgIHJsb2dpbi9yc2guCisKKyAgICAgfi8uc3NoLworICAgICAgICAgICAgIFRoaXMgZGlyZWN0b3J5IGlzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIGZvciBhbGwgdXNlci1zcGVjaWZpYworICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gYW5kIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uLiAgVGhlcmUgaXMgbm8KKyAgICAgICAgICAgICBnZW5lcmFsIHJlcXVpcmVtZW50IHRvIGtlZXAgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGlzIGRpcmVjdG9yeQorICAgICAgICAgICAgIHNlY3JldCwgYnV0IHRoZSByZWNvbW1lbmRlZCBwZXJtaXNzaW9ucyBhcmUgcmVhZC93cml0ZS9leGVjdXRlCisgICAgICAgICAgICAgZm9yIHRoZSB1c2VyLCBhbmQgbm90IGFjY2Vzc2libGUgYnkgb3RoZXJzLgorCisgICAgIH4vLnNzaC9hdXRob3JpemVkX2tleXMKKyAgICAgICAgICAgICBMaXN0cyB0aGUgcHVibGljIGtleXMgKERTQS9FQ0RTQS9SU0EpIHRoYXQgY2FuIGJlIHVzZWQgZm9yCisgICAgICAgICAgICAgbG9nZ2luZyBpbiBhcyB0aGlzIHVzZXIuICBUaGUgZm9ybWF0IG9mIHRoaXMgZmlsZSBpcyBkZXNjcmliZWQgaW4KKyAgICAgICAgICAgICB0aGUgc3NoZCg4KSBtYW51YWwgcGFnZS4gIFRoaXMgZmlsZSBpcyBub3QgaGlnaGx5IHNlbnNpdGl2ZSwgYnV0CisgICAgICAgICAgICAgdGhlIHJlY29tbWVuZGVkIHBlcm1pc3Npb25zIGFyZSByZWFkL3dyaXRlIGZvciB0aGUgdXNlciwgYW5kIG5vdAorICAgICAgICAgICAgIGFjY2Vzc2libGUgYnkgb3RoZXJzLgorCisgICAgIH4vLnNzaC9jb25maWcKKyAgICAgICAgICAgICBUaGlzIGlzIHRoZSBwZXItdXNlciBjb25maWd1cmF0aW9uIGZpbGUuICBUaGUgZmlsZSBmb3JtYXQgYW5kCisgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBkZXNjcmliZWQgaW4gc3NoX2NvbmZpZyg1KS4gIEJlY2F1c2Ugb2YKKyAgICAgICAgICAgICB0aGUgcG90ZW50aWFsIGZvciBhYnVzZSwgdGhpcyBmaWxlIG11c3QgaGF2ZSBzdHJpY3QgcGVybWlzc2lvbnM6CisgICAgICAgICAgICAgcmVhZC93cml0ZSBmb3IgdGhlIHVzZXIsIGFuZCBub3QgYWNjZXNzaWJsZSBieSBvdGhlcnMuCisKKyAgICAgfi8uc3NoL2Vudmlyb25tZW50CisgICAgICAgICAgICAgQ29udGFpbnMgYWRkaXRpb25hbCBkZWZpbml0aW9ucyBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzOyBzZWUKKyAgICAgICAgICAgICBFTlZJUk9OTUVOVCwgYWJvdmUuCisKKyAgICAgfi8uc3NoL2lkZW50aXR5CisgICAgIH4vLnNzaC9pZF9kc2EKKyAgICAgfi8uc3NoL2lkX2VjZHNhCisgICAgIH4vLnNzaC9pZF9yc2EKKyAgICAgICAgICAgICBDb250YWlucyB0aGUgcHJpdmF0ZSBrZXkgZm9yIGF1dGhlbnRpY2F0aW9uLiAgVGhlc2UgZmlsZXMgY29udGFpbgorICAgICAgICAgICAgIHNlbnNpdGl2ZSBkYXRhIGFuZCBzaG91bGQgYmUgcmVhZGFibGUgYnkgdGhlIHVzZXIgYnV0IG5vdAorICAgICAgICAgICAgIGFjY2Vzc2libGUgYnkgb3RoZXJzIChyZWFkL3dyaXRlL2V4ZWN1dGUpLiAgc3NoIHdpbGwgc2ltcGx5CisgICAgICAgICAgICAgaWdub3JlIGEgcHJpdmF0ZSBrZXkgZmlsZSBpZiBpdCBpcyBhY2Nlc3NpYmxlIGJ5IG90aGVycy4gIEl0IGlzCisgICAgICAgICAgICAgcG9zc2libGUgdG8gc3BlY2lmeSBhIHBhc3NwaHJhc2Ugd2hlbiBnZW5lcmF0aW5nIHRoZSBrZXkgd2hpY2gKKyAgICAgICAgICAgICB3aWxsIGJlIHVzZWQgdG8gZW5jcnlwdCB0aGUgc2Vuc2l0aXZlIHBhcnQgb2YgdGhpcyBmaWxlIHVzaW5nCisgICAgICAgICAgICAgM0RFUy4KKworICAgICB+Ly5zc2gvaWRlbnRpdHkucHViCisgICAgIH4vLnNzaC9pZF9kc2EucHViCisgICAgIH4vLnNzaC9pZF9lY2RzYS5wdWIKKyAgICAgfi8uc3NoL2lkX3JzYS5wdWIKKyAgICAgICAgICAgICBDb250YWlucyB0aGUgcHVibGljIGtleSBmb3IgYXV0aGVudGljYXRpb24uICBUaGVzZSBmaWxlcyBhcmUgbm90CisgICAgICAgICAgICAgc2Vuc2l0aXZlIGFuZCBjYW4gKGJ1dCBuZWVkIG5vdCkgYmUgcmVhZGFibGUgYnkgYW55b25lLgorCisgICAgIH4vLnNzaC9rbm93bl9ob3N0cworICAgICAgICAgICAgIENvbnRhaW5zIGEgbGlzdCBvZiBob3N0IGtleXMgZm9yIGFsbCBob3N0cyB0aGUgdXNlciBoYXMgbG9nZ2VkCisgICAgICAgICAgICAgaW50byB0aGF0IGFyZSBub3QgYWxyZWFkeSBpbiB0aGUgc3lzdGVtd2lkZSBsaXN0IG9mIGtub3duIGhvc3QKKyAgICAgICAgICAgICBrZXlzLiAgU2VlIHNzaGQoOCkgZm9yIGZ1cnRoZXIgZGV0YWlscyBvZiB0aGUgZm9ybWF0IG9mIHRoaXMKKyAgICAgICAgICAgICBmaWxlLgorCisgICAgIH4vLnNzaC9yYworICAgICAgICAgICAgIENvbW1hbmRzIGluIHRoaXMgZmlsZSBhcmUgZXhlY3V0ZWQgYnkgc3NoIHdoZW4gdGhlIHVzZXIgbG9ncyBpbiwKKyAgICAgICAgICAgICBqdXN0IGJlZm9yZSB0aGUgdXNlcidzIHNoZWxsIChvciBjb21tYW5kKSBpcyBzdGFydGVkLiAgU2VlIHRoZQorICAgICAgICAgICAgIHNzaGQoOCkgbWFudWFsIHBhZ2UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKyAgICAgL2V0Yy9ob3N0cy5lcXVpdgorICAgICAgICAgICAgIFRoaXMgZmlsZSBpcyBmb3IgaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbiAoc2VlIGFib3ZlKS4gIEl0CisgICAgICAgICAgICAgc2hvdWxkIG9ubHkgYmUgd3JpdGFibGUgYnkgcm9vdC4KKworICAgICAvZXRjL3Nob3N0cy5lcXVpdgorICAgICAgICAgICAgIFRoaXMgZmlsZSBpcyB1c2VkIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5IGFzIGhvc3RzLmVxdWl2LCBidXQKKyAgICAgICAgICAgICBhbGxvd3MgaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbiB3aXRob3V0IHBlcm1pdHRpbmcgbG9naW4gd2l0aAorICAgICAgICAgICAgIHJsb2dpbi9yc2guCisKKyAgICAgL2V0Yy9zc2gvc3NoX2NvbmZpZworICAgICAgICAgICAgIFN5c3RlbXdpZGUgY29uZmlndXJhdGlvbiBmaWxlLiAgVGhlIGZpbGUgZm9ybWF0IGFuZCBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgb3B0aW9ucyBhcmUgZGVzY3JpYmVkIGluIHNzaF9jb25maWcoNSkuCisKKyAgICAgL2V0Yy9zc2gvc3NoX2hvc3Rfa2V5CisgICAgIC9ldGMvc3NoL3NzaF9ob3N0X2RzYV9rZXkKKyAgICAgL2V0Yy9zc2gvc3NoX2hvc3RfZWNkc2Ffa2V5CisgICAgIC9ldGMvc3NoL3NzaF9ob3N0X3JzYV9rZXkKKyAgICAgICAgICAgICBUaGVzZSB0aHJlZSBmaWxlcyBjb250YWluIHRoZSBwcml2YXRlIHBhcnRzIG9mIHRoZSBob3N0IGtleXMgYW5kCisgICAgICAgICAgICAgYXJlIHVzZWQgZm9yIGhvc3QtYmFzZWQgYXV0aGVudGljYXRpb24uICBJZiBwcm90b2NvbCB2ZXJzaW9uIDEgaXMKKyAgICAgICAgICAgICB1c2VkLCBzc2ggbXVzdCBiZSBzZXR1aWQgcm9vdCwgc2luY2UgdGhlIGhvc3Qga2V5IGlzIHJlYWRhYmxlCisgICAgICAgICAgICAgb25seSBieSByb290LiAgRm9yIHByb3RvY29sIHZlcnNpb24gMiwgc3NoIHVzZXMgc3NoLWtleXNpZ24oOCkgdG8KKyAgICAgICAgICAgICBhY2Nlc3MgdGhlIGhvc3Qga2V5cywgZWxpbWluYXRpbmcgdGhlIHJlcXVpcmVtZW50IHRoYXQgc3NoIGJlCisgICAgICAgICAgICAgc2V0dWlkIHJvb3Qgd2hlbiBob3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uIGlzIHVzZWQuICBCeSBkZWZhdWx0CisgICAgICAgICAgICAgc3NoIGlzIG5vdCBzZXR1aWQgcm9vdC4KKworICAgICAvZXRjL3NzaC9zc2hfa25vd25faG9zdHMKKyAgICAgICAgICAgICBTeXN0ZW13aWRlIGxpc3Qgb2Yga25vd24gaG9zdCBrZXlzLiAgVGhpcyBmaWxlIHNob3VsZCBiZSBwcmVwYXJlZAorICAgICAgICAgICAgIGJ5IHRoZSBzeXN0ZW0gYWRtaW5pc3RyYXRvciB0byBjb250YWluIHRoZSBwdWJsaWMgaG9zdCBrZXlzIG9mCisgICAgICAgICAgICAgYWxsIG1hY2hpbmVzIGluIHRoZSBvcmdhbml6YXRpb24uICBJdCBzaG91bGQgYmUgd29ybGQtcmVhZGFibGUuCisgICAgICAgICAgICAgU2VlIHNzaGQoOCkgZm9yIGZ1cnRoZXIgZGV0YWlscyBvZiB0aGUgZm9ybWF0IG9mIHRoaXMgZmlsZS4KKworICAgICAvZXRjL3NzaC9zc2hyYworICAgICAgICAgICAgIENvbW1hbmRzIGluIHRoaXMgZmlsZSBhcmUgZXhlY3V0ZWQgYnkgc3NoIHdoZW4gdGhlIHVzZXIgbG9ncyBpbiwKKyAgICAgICAgICAgICBqdXN0IGJlZm9yZSB0aGUgdXNlcidzIHNoZWxsIChvciBjb21tYW5kKSBpcyBzdGFydGVkLiAgU2VlIHRoZQorICAgICAgICAgICAgIHNzaGQoOCkgbWFudWFsIHBhZ2UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK0VYSVQgU1RBVFVTCisgICAgIHNzaCBleGl0cyB3aXRoIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUgcmVtb3RlIGNvbW1hbmQgb3Igd2l0aCAyNTUgaWYgYW4KKyAgICAgZXJyb3Igb2NjdXJyZWQuCisKK1NFRSBBTFNPCisgICAgIHNjcCgxKSwgc2Z0cCgxKSwgc3NoLWFkZCgxKSwgc3NoLWFnZW50KDEpLCBzc2gta2V5Z2VuKDEpLCBzc2gta2V5c2NhbigxKSwKKyAgICAgdHVuKDQpLCBob3N0cy5lcXVpdig1KSwgc3NoX2NvbmZpZyg1KSwgc3NoLWtleXNpZ24oOCksIHNzaGQoOCkKKworICAgICBUaGUgU2VjdXJlIFNoZWxsIChTU0gpIFByb3RvY29sIEFzc2lnbmVkIE51bWJlcnMsIFJGQyA0MjUwLCAyMDA2LgorCisgICAgIFRoZSBTZWN1cmUgU2hlbGwgKFNTSCkgUHJvdG9jb2wgQXJjaGl0ZWN0dXJlLCBSRkMgNDI1MSwgMjAwNi4KKworICAgICBUaGUgU2VjdXJlIFNoZWxsIChTU0gpIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sLCBSRkMgNDI1MiwgMjAwNi4KKworICAgICBUaGUgU2VjdXJlIFNoZWxsIChTU0gpIFRyYW5zcG9ydCBMYXllciBQcm90b2NvbCwgUkZDIDQyNTMsIDIwMDYuCisKKyAgICAgVGhlIFNlY3VyZSBTaGVsbCAoU1NIKSBDb25uZWN0aW9uIFByb3RvY29sLCBSRkMgNDI1NCwgMjAwNi4KKworICAgICBVc2luZyBETlMgdG8gU2VjdXJlbHkgUHVibGlzaCBTZWN1cmUgU2hlbGwgKFNTSCkgS2V5IEZpbmdlcnByaW50cywgUkZDCisgICAgIDQyNTUsIDIwMDYuCisKKyAgICAgR2VuZXJpYyBNZXNzYWdlIEV4Y2hhbmdlIEF1dGhlbnRpY2F0aW9uIGZvciB0aGUgU2VjdXJlIFNoZWxsIFByb3RvY29sCisgICAgIChTU0gpLCBSRkMgNDI1NiwgMjAwNi4KKworICAgICBUaGUgU2VjdXJlIFNoZWxsIChTU0gpIFNlc3Npb24gQ2hhbm5lbCBCcmVhayBFeHRlbnNpb24sIFJGQyA0MzM1LCAyMDA2LgorCisgICAgIFRoZSBTZWN1cmUgU2hlbGwgKFNTSCkgVHJhbnNwb3J0IExheWVyIEVuY3J5cHRpb24gTW9kZXMsIFJGQyA0MzQ0LCAyMDA2LgorCisgICAgIEltcHJvdmVkIEFyY2ZvdXIgTW9kZXMgZm9yIHRoZSBTZWN1cmUgU2hlbGwgKFNTSCkgVHJhbnNwb3J0IExheWVyCisgICAgIFByb3RvY29sLCBSRkMgNDM0NSwgMjAwNi4KKworICAgICBEaWZmaWUtSGVsbG1hbiBHcm91cCBFeGNoYW5nZSBmb3IgdGhlIFNlY3VyZSBTaGVsbCAoU1NIKSBUcmFuc3BvcnQgTGF5ZXIKKyAgICAgUHJvdG9jb2wsIFJGQyA0NDE5LCAyMDA2LgorCisgICAgIFRoZSBTZWN1cmUgU2hlbGwgKFNTSCkgUHVibGljIEtleSBGaWxlIEZvcm1hdCwgUkZDIDQ3MTYsIDIwMDYuCisKKyAgICAgRWxsaXB0aWMgQ3VydmUgQWxnb3JpdGhtIEludGVncmF0aW9uIGluIHRoZSBTZWN1cmUgU2hlbGwgVHJhbnNwb3J0IExheWVyLAorICAgICBSRkMgNTY1NiwgMjAwOS4KKworICAgICBBLiBQZXJyaWcgYW5kIEQuIFNvbmcsIEhhc2ggVmlzdWFsaXphdGlvbjogYSBOZXcgVGVjaG5pcXVlIHRvIGltcHJvdmUKKyAgICAgUmVhbC1Xb3JsZCBTZWN1cml0eSwgMTk5OSwgSW50ZXJuYXRpb25hbCBXb3Jrc2hvcCBvbiBDcnlwdG9ncmFwaGljCisgICAgIFRlY2huaXF1ZXMgYW5kIEUtQ29tbWVyY2UgKENyeXBURUMgJzk5KS4KKworQVVUSE9SUworICAgICBPcGVuU1NIIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgYW5kIGZyZWUgc3NoIDEuMi4xMiByZWxlYXNlIGJ5CisgICAgIFRhdHUgWWxvbmVuLiAgQWFyb24gQ2FtcGJlbGwsIEJvYiBCZWNrLCBNYXJrdXMgRnJpZWRsLCBOaWVscyBQcm92b3MsIFRoZW8KKyAgICAgZGUgUmFhZHQgYW5kIER1ZyBTb25nIHJlbW92ZWQgbWFueSBidWdzLCByZS1hZGRlZCBuZXdlciBmZWF0dXJlcyBhbmQKKyAgICAgY3JlYXRlZCBPcGVuU1NILiAgTWFya3VzIEZyaWVkbCBjb250cmlidXRlZCB0aGUgc3VwcG9ydCBmb3IgU1NIIHByb3RvY29sCisgICAgIHZlcnNpb25zIDEuNSBhbmQgMi4wLgorCitPcGVuQlNEIDUuMCAgICAgICAgICAgICAgICAgICBTZXB0ZW1iZXIgMTEsIDIwMTEgICAgICAgICAgICAgICAgICAgT3BlbkJTRCA1LjAKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc3NoLjEgYi9vcGVuc3NoLTYuMHAxL3NzaC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNjEzMjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NzaC4xCkBAIC0wLDAgKzEsMTUwOSBAQAorLlwiCisuXCIgQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAorLlwiICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisuXCIKKy5cIiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisuXCIgY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKy5cIiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCisuXCIgaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorLlwiIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5OSwyMDAwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiIENvcHlyaWdodCAoYykgMTk5OSBBYXJvbiBDYW1wYmVsbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIgQ29weXJpZ2h0IChjKSAxOTk5IFRoZW8gZGUgUmFhZHQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisuXCIgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy5cIiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisuXCIgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisuXCIgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLlwiIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLlwiIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy5cIiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy5cIiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgJE9wZW5CU0Q6IHNzaC4xLHYgMS4zMjMgMjAxMS8wOS8xMSAwNjo1OTowNSBva2FuIEV4cCAkCisuRGQgJE1kb2NkYXRlOiBTZXB0ZW1iZXIgMTEgMjAxMSAkCisuRHQgU1NIIDEKKy5PcworLlNoIE5BTUUKKy5ObSBzc2gKKy5OZCBPcGVuU1NIIFNTSCBjbGllbnQgKHJlbW90ZSBsb2dpbiBwcm9ncmFtKQorLlNoIFNZTk9QU0lTCisuTm0gc3NoCisuQmsgLXdvcmRzCisuT3AgRmwgMTI0NkFhQ2ZnS2tNTm5xc1R0VnZYeFl5CisuT3AgRmwgYiBBciBiaW5kX2FkZHJlc3MKKy5PcCBGbCBjIEFyIGNpcGhlcl9zcGVjCisuT3AgRmwgRCBPbyBBciBiaW5kX2FkZHJlc3MgOiBPYyBOcyBBciBwb3J0CisuT3AgRmwgZSBBciBlc2NhcGVfY2hhcgorLk9wIEZsIEYgQXIgY29uZmlnZmlsZQorLk9wIEZsIEkgQXIgcGtjczExCisuT3AgRmwgaSBBciBpZGVudGl0eV9maWxlCisuT3AgRmwgTCBPbyBBciBiaW5kX2FkZHJlc3MgOiBPYyBOcyBBciBwb3J0IDogTnMgQXIgaG9zdCA6IE5zIEFyIGhvc3Rwb3J0CisuT3AgRmwgbCBBciBsb2dpbl9uYW1lCisuT3AgRmwgbSBBciBtYWNfc3BlYworLk9wIEZsIE8gQXIgY3RsX2NtZAorLk9wIEZsIG8gQXIgb3B0aW9uCisuT3AgRmwgcCBBciBwb3J0CisuT3AgRmwgUiBPbyBBciBiaW5kX2FkZHJlc3MgOiBPYyBOcyBBciBwb3J0IDogTnMgQXIgaG9zdCA6IE5zIEFyIGhvc3Rwb3J0CisuT3AgRmwgUyBBciBjdGxfcGF0aAorLk9wIEZsIFcgQXIgaG9zdCA6IE5zIEFyIHBvcnQKKy5PcCBGbCB3IEFyIGxvY2FsX3R1biBOcyBPcCA6IE5zIEFyIHJlbW90ZV90dW4KKy5PbyBBciB1c2VyIE5zIEAgT2MgTnMgQXIgaG9zdG5hbWUKKy5PcCBBciBjb21tYW5kCisuRWsKKy5TaCBERVNDUklQVElPTgorLk5tCisoU1NIIGNsaWVudCkgaXMgYSBwcm9ncmFtIGZvciBsb2dnaW5nIGludG8gYSByZW1vdGUgbWFjaGluZSBhbmQgZm9yCitleGVjdXRpbmcgY29tbWFuZHMgb24gYSByZW1vdGUgbWFjaGluZS4KK0l0IGlzIGludGVuZGVkIHRvIHJlcGxhY2UgcmxvZ2luIGFuZCByc2gsCithbmQgcHJvdmlkZSBzZWN1cmUgZW5jcnlwdGVkIGNvbW11bmljYXRpb25zIGJldHdlZW4KK3R3byB1bnRydXN0ZWQgaG9zdHMgb3ZlciBhbiBpbnNlY3VyZSBuZXR3b3JrLgorWDExIGNvbm5lY3Rpb25zIGFuZCBhcmJpdHJhcnkgVENQIHBvcnRzCitjYW4gYWxzbyBiZSBmb3J3YXJkZWQgb3ZlciB0aGUgc2VjdXJlIGNoYW5uZWwuCisuUHAKKy5ObQorY29ubmVjdHMgYW5kIGxvZ3MgaW50byB0aGUgc3BlY2lmaWVkCisuQXIgaG9zdG5hbWUKKyh3aXRoIG9wdGlvbmFsCisuQXIgdXNlcgorbmFtZSkuCitUaGUgdXNlciBtdXN0IHByb3ZlCitoaXMvaGVyIGlkZW50aXR5IHRvIHRoZSByZW1vdGUgbWFjaGluZSB1c2luZyBvbmUgb2Ygc2V2ZXJhbCBtZXRob2RzCitkZXBlbmRpbmcgb24gdGhlIHByb3RvY29sIHZlcnNpb24gdXNlZCAoc2VlIGJlbG93KS4KKy5QcAorSWYKKy5BciBjb21tYW5kCitpcyBzcGVjaWZpZWQsCitpdCBpcyBleGVjdXRlZCBvbiB0aGUgcmVtb3RlIGhvc3QgaW5zdGVhZCBvZiBhIGxvZ2luIHNoZWxsLgorLlBwCitUaGUgb3B0aW9ucyBhcmUgYXMgZm9sbG93czoKKy5CbCAtdGFnIC13aWR0aCBEcworLkl0IEZsIDEKK0ZvcmNlcworLk5tCit0byB0cnkgcHJvdG9jb2wgdmVyc2lvbiAxIG9ubHkuCisuSXQgRmwgMgorRm9yY2VzCisuTm0KK3RvIHRyeSBwcm90b2NvbCB2ZXJzaW9uIDIgb25seS4KKy5JdCBGbCA0CitGb3JjZXMKKy5ObQordG8gdXNlIElQdjQgYWRkcmVzc2VzIG9ubHkuCisuSXQgRmwgNgorRm9yY2VzCisuTm0KK3RvIHVzZSBJUHY2IGFkZHJlc3NlcyBvbmx5LgorLkl0IEZsIEEKK0VuYWJsZXMgZm9yd2FyZGluZyBvZiB0aGUgYXV0aGVudGljYXRpb24gYWdlbnQgY29ubmVjdGlvbi4KK1RoaXMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIG9uIGEgcGVyLWhvc3QgYmFzaXMgaW4gYSBjb25maWd1cmF0aW9uIGZpbGUuCisuUHAKK0FnZW50IGZvcndhcmRpbmcgc2hvdWxkIGJlIGVuYWJsZWQgd2l0aCBjYXV0aW9uLgorVXNlcnMgd2l0aCB0aGUgYWJpbGl0eSB0byBieXBhc3MgZmlsZSBwZXJtaXNzaW9ucyBvbiB0aGUgcmVtb3RlIGhvc3QKKyhmb3IgdGhlIGFnZW50J3MKKy5VeCBOcyAtZG9tYWluCitzb2NrZXQpIGNhbiBhY2Nlc3MgdGhlIGxvY2FsIGFnZW50IHRocm91Z2ggdGhlIGZvcndhcmRlZCBjb25uZWN0aW9uLgorQW4gYXR0YWNrZXIgY2Fubm90IG9idGFpbiBrZXkgbWF0ZXJpYWwgZnJvbSB0aGUgYWdlbnQsCitob3dldmVyIHRoZXkgY2FuIHBlcmZvcm0gb3BlcmF0aW9ucyBvbiB0aGUga2V5cyB0aGF0IGVuYWJsZSB0aGVtIHRvCithdXRoZW50aWNhdGUgdXNpbmcgdGhlIGlkZW50aXRpZXMgbG9hZGVkIGludG8gdGhlIGFnZW50LgorLkl0IEZsIGEKK0Rpc2FibGVzIGZvcndhcmRpbmcgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIGFnZW50IGNvbm5lY3Rpb24uCisuSXQgRmwgYiBBciBiaW5kX2FkZHJlc3MKK1VzZQorLkFyIGJpbmRfYWRkcmVzcworb24gdGhlIGxvY2FsIG1hY2hpbmUgYXMgdGhlIHNvdXJjZSBhZGRyZXNzCitvZiB0aGUgY29ubmVjdGlvbi4KK09ubHkgdXNlZnVsIG9uIHN5c3RlbXMgd2l0aCBtb3JlIHRoYW4gb25lIGFkZHJlc3MuCisuSXQgRmwgQworUmVxdWVzdHMgY29tcHJlc3Npb24gb2YgYWxsIGRhdGEgKGluY2x1ZGluZyBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIGFuZAorZGF0YSBmb3IgZm9yd2FyZGVkIFgxMSBhbmQgVENQIGNvbm5lY3Rpb25zKS4KK1RoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gaXMgdGhlIHNhbWUgdXNlZCBieQorLlhyIGd6aXAgMSAsCithbmQgdGhlCisuRHEgbGV2ZWwKK2NhbiBiZSBjb250cm9sbGVkIGJ5IHRoZQorLkNtIENvbXByZXNzaW9uTGV2ZWwKK29wdGlvbiBmb3IgcHJvdG9jb2wgdmVyc2lvbiAxLgorQ29tcHJlc3Npb24gaXMgZGVzaXJhYmxlIG9uIG1vZGVtIGxpbmVzIGFuZCBvdGhlcgorc2xvdyBjb25uZWN0aW9ucywgYnV0IHdpbGwgb25seSBzbG93IGRvd24gdGhpbmdzIG9uIGZhc3QgbmV0d29ya3MuCitUaGUgZGVmYXVsdCB2YWx1ZSBjYW4gYmUgc2V0IG9uIGEgaG9zdC1ieS1ob3N0IGJhc2lzIGluIHRoZQorY29uZmlndXJhdGlvbiBmaWxlczsgc2VlIHRoZQorLkNtIENvbXByZXNzaW9uCitvcHRpb24uCisuSXQgRmwgYyBBciBjaXBoZXJfc3BlYworU2VsZWN0cyB0aGUgY2lwaGVyIHNwZWNpZmljYXRpb24gZm9yIGVuY3J5cHRpbmcgdGhlIHNlc3Npb24uCisuUHAKK1Byb3RvY29sIHZlcnNpb24gMSBhbGxvd3Mgc3BlY2lmaWNhdGlvbiBvZiBhIHNpbmdsZSBjaXBoZXIuCitUaGUgc3VwcG9ydGVkIHZhbHVlcyBhcmUKKy5EcSAzZGVzICwKKy5EcSBibG93ZmlzaCAsCithbmQKKy5EcSBkZXMgLgorLkFyIDNkZXMKKyh0cmlwbGUtZGVzKSBpcyBhbiBlbmNyeXB0LWRlY3J5cHQtZW5jcnlwdCB0cmlwbGUgd2l0aCB0aHJlZSBkaWZmZXJlbnQga2V5cy4KK0l0IGlzIGJlbGlldmVkIHRvIGJlIHNlY3VyZS4KKy5BciBibG93ZmlzaAoraXMgYSBmYXN0IGJsb2NrIGNpcGhlcjsgaXQgYXBwZWFycyB2ZXJ5IHNlY3VyZSBhbmQgaXMgbXVjaCBmYXN0ZXIgdGhhbgorLkFyIDNkZXMgLgorLkFyIGRlcworaXMgb25seSBzdXBwb3J0ZWQgaW4gdGhlCisuTm0KK2NsaWVudCBmb3IgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIGxlZ2FjeSBwcm90b2NvbCAxIGltcGxlbWVudGF0aW9ucwordGhhdCBkbyBub3Qgc3VwcG9ydCB0aGUKKy5BciAzZGVzCitjaXBoZXIuCitJdHMgdXNlIGlzIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkIGR1ZSB0byBjcnlwdG9ncmFwaGljIHdlYWtuZXNzZXMuCitUaGUgZGVmYXVsdCBpcworLkRxIDNkZXMgLgorLlBwCitGb3IgcHJvdG9jb2wgdmVyc2lvbiAyLAorLkFyIGNpcGhlcl9zcGVjCitpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNpcGhlcnMKK2xpc3RlZCBpbiBvcmRlciBvZiBwcmVmZXJlbmNlLgorU2VlIHRoZQorLkNtIENpcGhlcnMKK2tleXdvcmQgaW4KKy5YciBzc2hfY29uZmlnIDUKK2ZvciBtb3JlIGluZm9ybWF0aW9uLgorLkl0IEZsIEQgWG8KKy5TbSBvZmYKKy5PbyBBciBiaW5kX2FkZHJlc3MgOiBPYworLkFyIHBvcnQKKy5TbSBvbgorLlhjCitTcGVjaWZpZXMgYSBsb2NhbAorLkRxIGR5bmFtaWMKK2FwcGxpY2F0aW9uLWxldmVsIHBvcnQgZm9yd2FyZGluZy4KK1RoaXMgd29ya3MgYnkgYWxsb2NhdGluZyBhIHNvY2tldCB0byBsaXN0ZW4gdG8KKy5BciBwb3J0CitvbiB0aGUgbG9jYWwgc2lkZSwgb3B0aW9uYWxseSBib3VuZCB0byB0aGUgc3BlY2lmaWVkCisuQXIgYmluZF9hZGRyZXNzIC4KK1doZW5ldmVyIGEgY29ubmVjdGlvbiBpcyBtYWRlIHRvIHRoaXMgcG9ydCwgdGhlCitjb25uZWN0aW9uIGlzIGZvcndhcmRlZCBvdmVyIHRoZSBzZWN1cmUgY2hhbm5lbCwgYW5kIHRoZSBhcHBsaWNhdGlvbgorcHJvdG9jb2wgaXMgdGhlbiB1c2VkIHRvIGRldGVybWluZSB3aGVyZSB0byBjb25uZWN0IHRvIGZyb20gdGhlCityZW1vdGUgbWFjaGluZS4KK0N1cnJlbnRseSB0aGUgU09DS1M0IGFuZCBTT0NLUzUgcHJvdG9jb2xzIGFyZSBzdXBwb3J0ZWQsIGFuZAorLk5tCit3aWxsIGFjdCBhcyBhIFNPQ0tTIHNlcnZlci4KK09ubHkgcm9vdCBjYW4gZm9yd2FyZCBwcml2aWxlZ2VkIHBvcnRzLgorRHluYW1pYyBwb3J0IGZvcndhcmRpbmdzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorLlBwCitJUHY2IGFkZHJlc3NlcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IGVuY2xvc2luZyB0aGUgYWRkcmVzcyBpbiBzcXVhcmUgYnJhY2tldHMuCitPbmx5IHRoZSBzdXBlcnVzZXIgY2FuIGZvcndhcmQgcHJpdmlsZWdlZCBwb3J0cy4KK0J5IGRlZmF1bHQsIHRoZSBsb2NhbCBwb3J0IGlzIGJvdW5kIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKKy5DbSBHYXRld2F5UG9ydHMKK3NldHRpbmcuCitIb3dldmVyLCBhbiBleHBsaWNpdAorLkFyIGJpbmRfYWRkcmVzcworbWF5IGJlIHVzZWQgdG8gYmluZCB0aGUgY29ubmVjdGlvbiB0byBhIHNwZWNpZmljIGFkZHJlc3MuCitUaGUKKy5BciBiaW5kX2FkZHJlc3MKK29mCisuRHEgbG9jYWxob3N0CitpbmRpY2F0ZXMgdGhhdCB0aGUgbGlzdGVuaW5nIHBvcnQgYmUgYm91bmQgZm9yIGxvY2FsIHVzZSBvbmx5LCB3aGlsZSBhbgorZW1wdHkgYWRkcmVzcyBvcgorLlNxICoKK2luZGljYXRlcyB0aGF0IHRoZSBwb3J0IHNob3VsZCBiZSBhdmFpbGFibGUgZnJvbSBhbGwgaW50ZXJmYWNlcy4KKy5JdCBGbCBlIEFyIGVzY2FwZV9jaGFyCitTZXRzIHRoZSBlc2NhcGUgY2hhcmFjdGVyIGZvciBzZXNzaW9ucyB3aXRoIGEgcHR5IChkZWZhdWx0OgorLlFsIH4gKSAuCitUaGUgZXNjYXBlIGNoYXJhY3RlciBpcyBvbmx5IHJlY29nbml6ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuCitUaGUgZXNjYXBlIGNoYXJhY3RlciBmb2xsb3dlZCBieSBhIGRvdAorLlBxIFFsIFwmLgorY2xvc2VzIHRoZSBjb25uZWN0aW9uOworZm9sbG93ZWQgYnkgY29udHJvbC1aIHN1c3BlbmRzIHRoZSBjb25uZWN0aW9uOworYW5kIGZvbGxvd2VkIGJ5IGl0c2VsZiBzZW5kcyB0aGUgZXNjYXBlIGNoYXJhY3RlciBvbmNlLgorU2V0dGluZyB0aGUgY2hhcmFjdGVyIHRvCisuRHEgbm9uZQorZGlzYWJsZXMgYW55IGVzY2FwZXMgYW5kIG1ha2VzIHRoZSBzZXNzaW9uIGZ1bGx5IHRyYW5zcGFyZW50LgorLkl0IEZsIEYgQXIgY29uZmlnZmlsZQorU3BlY2lmaWVzIGFuIGFsdGVybmF0aXZlIHBlci11c2VyIGNvbmZpZ3VyYXRpb24gZmlsZS4KK0lmIGEgY29uZmlndXJhdGlvbiBmaWxlIGlzIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUsCit0aGUgc3lzdGVtLXdpZGUgY29uZmlndXJhdGlvbiBmaWxlCisuUHEgUGEgL2V0Yy9zc2gvc3NoX2NvbmZpZword2lsbCBiZSBpZ25vcmVkLgorVGhlIGRlZmF1bHQgZm9yIHRoZSBwZXItdXNlciBjb25maWd1cmF0aW9uIGZpbGUgaXMKKy5QYSB+Ly5zc2gvY29uZmlnIC4KKy5JdCBGbCBmCitSZXF1ZXN0cworLk5tCit0byBnbyB0byBiYWNrZ3JvdW5kIGp1c3QgYmVmb3JlIGNvbW1hbmQgZXhlY3V0aW9uLgorVGhpcyBpcyB1c2VmdWwgaWYKKy5ObQoraXMgZ29pbmcgdG8gYXNrIGZvciBwYXNzd29yZHMgb3IgcGFzc3BocmFzZXMsIGJ1dCB0aGUgdXNlcgord2FudHMgaXQgaW4gdGhlIGJhY2tncm91bmQuCitUaGlzIGltcGxpZXMKKy5GbCBuIC4KK1RoZSByZWNvbW1lbmRlZCB3YXkgdG8gc3RhcnQgWDExIHByb2dyYW1zIGF0IGEgcmVtb3RlIHNpdGUgaXMgd2l0aAorc29tZXRoaW5nIGxpa2UKKy5JYyBzc2ggLWYgaG9zdCB4dGVybSAuCisuUHAKK0lmIHRoZQorLkNtIEV4aXRPbkZvcndhcmRGYWlsdXJlCitjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBzZXQgdG8KKy5EcSB5ZXMgLAordGhlbiBhIGNsaWVudCBzdGFydGVkIHdpdGgKKy5GbCBmCit3aWxsIHdhaXQgZm9yIGFsbCByZW1vdGUgcG9ydCBmb3J3YXJkcyB0byBiZSBzdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQKK2JlZm9yZSBwbGFjaW5nIGl0c2VsZiBpbiB0aGUgYmFja2dyb3VuZC4KKy5JdCBGbCBnCitBbGxvd3MgcmVtb3RlIGhvc3RzIHRvIGNvbm5lY3QgdG8gbG9jYWwgZm9yd2FyZGVkIHBvcnRzLgorLkl0IEZsIEkgQXIgcGtjczExCitTcGVjaWZ5IHRoZSBQS0NTIzExIHNoYXJlZCBsaWJyYXJ5CisuTm0KK3Nob3VsZCB1c2UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIFBLQ1MjMTEgdG9rZW4gcHJvdmlkaW5nIHRoZSB1c2VyJ3MKK3ByaXZhdGUgUlNBIGtleS4KKy5JdCBGbCBpIEFyIGlkZW50aXR5X2ZpbGUKK1NlbGVjdHMgYSBmaWxlIGZyb20gd2hpY2ggdGhlIGlkZW50aXR5IChwcml2YXRlIGtleSkgZm9yCitwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uIGlzIHJlYWQuCitUaGUgZGVmYXVsdCBpcworLlBhIH4vLnNzaC9pZGVudGl0eQorZm9yIHByb3RvY29sIHZlcnNpb24gMSwgYW5kCisuUGEgfi8uc3NoL2lkX2RzYSAsCisuUGEgfi8uc3NoL2lkX2VjZHNhCithbmQKKy5QYSB+Ly5zc2gvaWRfcnNhCitmb3IgcHJvdG9jb2wgdmVyc2lvbiAyLgorSWRlbnRpdHkgZmlsZXMgbWF5IGFsc28gYmUgc3BlY2lmaWVkIG9uCithIHBlci1ob3N0IGJhc2lzIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCitJdCBpcyBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlCisuRmwgaQorb3B0aW9ucyAoYW5kIG11bHRpcGxlIGlkZW50aXRpZXMgc3BlY2lmaWVkIGluCitjb25maWd1cmF0aW9uIGZpbGVzKS4KKy5ObQord2lsbCBhbHNvIHRyeSB0byBsb2FkIGNlcnRpZmljYXRlIGluZm9ybWF0aW9uIGZyb20gdGhlIGZpbGVuYW1lIG9idGFpbmVkCitieSBhcHBlbmRpbmcKKy5QYSAtY2VydC5wdWIKK3RvIGlkZW50aXR5IGZpbGVuYW1lcy4KKy5JdCBGbCBLCitFbmFibGVzIEdTU0FQSS1iYXNlZCBhdXRoZW50aWNhdGlvbiBhbmQgZm9yd2FyZGluZyAoZGVsZWdhdGlvbikgb2YgR1NTQVBJCitjcmVkZW50aWFscyB0byB0aGUgc2VydmVyLgorLkl0IEZsIGsKK0Rpc2FibGVzIGZvcndhcmRpbmcgKGRlbGVnYXRpb24pIG9mIEdTU0FQSSBjcmVkZW50aWFscyB0byB0aGUgc2VydmVyLgorLkl0IEZsIEwgWG8KKy5TbSBvZmYKKy5PbyBBciBiaW5kX2FkZHJlc3MgOiBPYworLkFyIHBvcnQgOiBob3N0IDogaG9zdHBvcnQKKy5TbSBvbgorLlhjCitTcGVjaWZpZXMgdGhhdCB0aGUgZ2l2ZW4gcG9ydCBvbiB0aGUgbG9jYWwgKGNsaWVudCkgaG9zdCBpcyB0byBiZQorZm9yd2FyZGVkIHRvIHRoZSBnaXZlbiBob3N0IGFuZCBwb3J0IG9uIHRoZSByZW1vdGUgc2lkZS4KK1RoaXMgd29ya3MgYnkgYWxsb2NhdGluZyBhIHNvY2tldCB0byBsaXN0ZW4gdG8KKy5BciBwb3J0CitvbiB0aGUgbG9jYWwgc2lkZSwgb3B0aW9uYWxseSBib3VuZCB0byB0aGUgc3BlY2lmaWVkCisuQXIgYmluZF9hZGRyZXNzIC4KK1doZW5ldmVyIGEgY29ubmVjdGlvbiBpcyBtYWRlIHRvIHRoaXMgcG9ydCwgdGhlCitjb25uZWN0aW9uIGlzIGZvcndhcmRlZCBvdmVyIHRoZSBzZWN1cmUgY2hhbm5lbCwgYW5kIGEgY29ubmVjdGlvbiBpcworbWFkZSB0bworLkFyIGhvc3QKK3BvcnQKKy5BciBob3N0cG9ydAorZnJvbSB0aGUgcmVtb3RlIG1hY2hpbmUuCitQb3J0IGZvcndhcmRpbmdzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorSVB2NiBhZGRyZXNzZXMgY2FuIGJlIHNwZWNpZmllZCBieSBlbmNsb3NpbmcgdGhlIGFkZHJlc3MgaW4gc3F1YXJlIGJyYWNrZXRzLgorT25seSB0aGUgc3VwZXJ1c2VyIGNhbiBmb3J3YXJkIHByaXZpbGVnZWQgcG9ydHMuCitCeSBkZWZhdWx0LCB0aGUgbG9jYWwgcG9ydCBpcyBib3VuZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCisuQ20gR2F0ZXdheVBvcnRzCitzZXR0aW5nLgorSG93ZXZlciwgYW4gZXhwbGljaXQKKy5BciBiaW5kX2FkZHJlc3MKK21heSBiZSB1c2VkIHRvIGJpbmQgdGhlIGNvbm5lY3Rpb24gdG8gYSBzcGVjaWZpYyBhZGRyZXNzLgorVGhlCisuQXIgYmluZF9hZGRyZXNzCitvZgorLkRxIGxvY2FsaG9zdAoraW5kaWNhdGVzIHRoYXQgdGhlIGxpc3RlbmluZyBwb3J0IGJlIGJvdW5kIGZvciBsb2NhbCB1c2Ugb25seSwgd2hpbGUgYW4KK2VtcHR5IGFkZHJlc3Mgb3IKKy5TcSAqCitpbmRpY2F0ZXMgdGhhdCB0aGUgcG9ydCBzaG91bGQgYmUgYXZhaWxhYmxlIGZyb20gYWxsIGludGVyZmFjZXMuCisuSXQgRmwgbCBBciBsb2dpbl9uYW1lCitTcGVjaWZpZXMgdGhlIHVzZXIgdG8gbG9nIGluIGFzIG9uIHRoZSByZW1vdGUgbWFjaGluZS4KK1RoaXMgYWxzbyBtYXkgYmUgc3BlY2lmaWVkIG9uIGEgcGVyLWhvc3QgYmFzaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKy5JdCBGbCBNCitQbGFjZXMgdGhlCisuTm0KK2NsaWVudCBpbnRvCisuRHEgbWFzdGVyCittb2RlIGZvciBjb25uZWN0aW9uIHNoYXJpbmcuCitNdWx0aXBsZQorLkZsIE0KK29wdGlvbnMgcGxhY2VzCisuTm0KK2ludG8KKy5EcSBtYXN0ZXIKK21vZGUgd2l0aCBjb25maXJtYXRpb24gcmVxdWlyZWQgYmVmb3JlIHNsYXZlIGNvbm5lY3Rpb25zIGFyZSBhY2NlcHRlZC4KK1JlZmVyIHRvIHRoZSBkZXNjcmlwdGlvbiBvZgorLkNtIENvbnRyb2xNYXN0ZXIKK2luCisuWHIgc3NoX2NvbmZpZyA1Citmb3IgZGV0YWlscy4KKy5JdCBGbCBtIEFyIG1hY19zcGVjCitBZGRpdGlvbmFsbHksIGZvciBwcm90b2NvbCB2ZXJzaW9uIDIgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBNQUMKKyhtZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGNvZGUpIGFsZ29yaXRobXMgY2FuCitiZSBzcGVjaWZpZWQgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4KK1NlZSB0aGUKKy5DbSBNQUNzCitrZXl3b3JkIGZvciBtb3JlIGluZm9ybWF0aW9uLgorLkl0IEZsIE4KK0RvIG5vdCBleGVjdXRlIGEgcmVtb3RlIGNvbW1hbmQuCitUaGlzIGlzIHVzZWZ1bCBmb3IganVzdCBmb3J3YXJkaW5nIHBvcnRzCisocHJvdG9jb2wgdmVyc2lvbiAyIG9ubHkpLgorLkl0IEZsIG4KK1JlZGlyZWN0cyBzdGRpbiBmcm9tCisuUGEgL2Rldi9udWxsCisoYWN0dWFsbHksIHByZXZlbnRzIHJlYWRpbmcgZnJvbSBzdGRpbikuCitUaGlzIG11c3QgYmUgdXNlZCB3aGVuCisuTm0KK2lzIHJ1biBpbiB0aGUgYmFja2dyb3VuZC4KK0EgY29tbW9uIHRyaWNrIGlzIHRvIHVzZSB0aGlzIHRvIHJ1biBYMTEgcHJvZ3JhbXMgb24gYSByZW1vdGUgbWFjaGluZS4KK0ZvciBleGFtcGxlLAorLkljIHNzaCAtbiBzaGFkb3dzLmNzLmh1dC5maSBlbWFjcyAmCit3aWxsIHN0YXJ0IGFuIGVtYWNzIG9uIHNoYWRvd3MuY3MuaHV0LmZpLCBhbmQgdGhlIFgxMQorY29ubmVjdGlvbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZm9yd2FyZGVkIG92ZXIgYW4gZW5jcnlwdGVkIGNoYW5uZWwuCitUaGUKKy5ObQorcHJvZ3JhbSB3aWxsIGJlIHB1dCBpbiB0aGUgYmFja2dyb3VuZC4KKyhUaGlzIGRvZXMgbm90IHdvcmsgaWYKKy5ObQorbmVlZHMgdG8gYXNrIGZvciBhIHBhc3N3b3JkIG9yIHBhc3NwaHJhc2U7IHNlZSBhbHNvIHRoZQorLkZsIGYKK29wdGlvbi4pCisuSXQgRmwgTyBBciBjdGxfY21kCitDb250cm9sIGFuIGFjdGl2ZSBjb25uZWN0aW9uIG11bHRpcGxleGluZyBtYXN0ZXIgcHJvY2Vzcy4KK1doZW4gdGhlCisuRmwgTworb3B0aW9uIGlzIHNwZWNpZmllZCwgdGhlCisuQXIgY3RsX2NtZAorYXJndW1lbnQgaXMgaW50ZXJwcmV0ZWQgYW5kIHBhc3NlZCB0byB0aGUgbWFzdGVyIHByb2Nlc3MuCitWYWxpZCBjb21tYW5kcyBhcmU6CisuRHEgY2hlY2sKKyhjaGVjayB0aGF0IHRoZSBtYXN0ZXIgcHJvY2VzcyBpcyBydW5uaW5nKSwKKy5EcSBmb3J3YXJkCisocmVxdWVzdCBmb3J3YXJkaW5ncyB3aXRob3V0IGNvbW1hbmQgZXhlY3V0aW9uKSwKKy5EcSBjYW5jZWwKKyhjYW5jZWwgZm9yd2FyZGluZ3MpLAorLkRxIGV4aXQKKyhyZXF1ZXN0IHRoZSBtYXN0ZXIgdG8gZXhpdCksIGFuZAorLkRxIHN0b3AKKyhyZXF1ZXN0IHRoZSBtYXN0ZXIgdG8gc3RvcCBhY2NlcHRpbmcgZnVydGhlciBtdWx0aXBsZXhpbmcgcmVxdWVzdHMpLgorLkl0IEZsIG8gQXIgb3B0aW9uCitDYW4gYmUgdXNlZCB0byBnaXZlIG9wdGlvbnMgaW4gdGhlIGZvcm1hdCB1c2VkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCitUaGlzIGlzIHVzZWZ1bCBmb3Igc3BlY2lmeWluZyBvcHRpb25zIGZvciB3aGljaCB0aGVyZSBpcyBubyBzZXBhcmF0ZQorY29tbWFuZC1saW5lIGZsYWcuCitGb3IgZnVsbCBkZXRhaWxzIG9mIHRoZSBvcHRpb25zIGxpc3RlZCBiZWxvdywgYW5kIHRoZWlyIHBvc3NpYmxlIHZhbHVlcywgc2VlCisuWHIgc3NoX2NvbmZpZyA1IC4KKy5QcAorLkJsIC10YWcgLXdpZHRoIERzIC1vZmZzZXQgaW5kZW50IC1jb21wYWN0CisuSXQgQWRkcmVzc0ZhbWlseQorLkl0IEJhdGNoTW9kZQorLkl0IEJpbmRBZGRyZXNzCisuSXQgQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbgorLkl0IENoZWNrSG9zdElQCisuSXQgQ2lwaGVyCisuSXQgQ2lwaGVycworLkl0IENsZWFyQWxsRm9yd2FyZGluZ3MKKy5JdCBDb21wcmVzc2lvbgorLkl0IENvbXByZXNzaW9uTGV2ZWwKKy5JdCBDb25uZWN0aW9uQXR0ZW1wdHMKKy5JdCBDb25uZWN0VGltZW91dAorLkl0IENvbnRyb2xNYXN0ZXIKKy5JdCBDb250cm9sUGF0aAorLkl0IENvbnRyb2xQZXJzaXN0CisuSXQgRHluYW1pY0ZvcndhcmQKKy5JdCBFc2NhcGVDaGFyCisuSXQgRXhpdE9uRm9yd2FyZEZhaWx1cmUKKy5JdCBGb3J3YXJkQWdlbnQKKy5JdCBGb3J3YXJkWDExCisuSXQgRm9yd2FyZFgxMVRpbWVvdXQKKy5JdCBGb3J3YXJkWDExVHJ1c3RlZAorLkl0IEdhdGV3YXlQb3J0cworLkl0IEdsb2JhbEtub3duSG9zdHNGaWxlCisuSXQgR1NTQVBJQXV0aGVudGljYXRpb24KKy5JdCBHU1NBUElEZWxlZ2F0ZUNyZWRlbnRpYWxzCisuSXQgSGFzaEtub3duSG9zdHMKKy5JdCBIb3N0CisuSXQgSG9zdGJhc2VkQXV0aGVudGljYXRpb24KKy5JdCBIb3N0S2V5QWxnb3JpdGhtcworLkl0IEhvc3RLZXlBbGlhcworLkl0IEhvc3ROYW1lCisuSXQgSWRlbnRpdHlGaWxlCisuSXQgSWRlbnRpdGllc09ubHkKKy5JdCBJUFFvUworLkl0IEtiZEludGVyYWN0aXZlQXV0aGVudGljYXRpb24KKy5JdCBLYmRJbnRlcmFjdGl2ZURldmljZXMKKy5JdCBLZXhBbGdvcml0aG1zCisuSXQgTG9jYWxDb21tYW5kCisuSXQgTG9jYWxGb3J3YXJkCisuSXQgTG9nTGV2ZWwKKy5JdCBNQUNzCisuSXQgTm9Ib3N0QXV0aGVudGljYXRpb25Gb3JMb2NhbGhvc3QKKy5JdCBOdW1iZXJPZlBhc3N3b3JkUHJvbXB0cworLkl0IFBhc3N3b3JkQXV0aGVudGljYXRpb24KKy5JdCBQZXJtaXRMb2NhbENvbW1hbmQKKy5JdCBQS0NTMTFQcm92aWRlcgorLkl0IFBvcnQKKy5JdCBQcmVmZXJyZWRBdXRoZW50aWNhdGlvbnMKKy5JdCBQcm90b2NvbAorLkl0IFByb3h5Q29tbWFuZAorLkl0IFB1YmtleUF1dGhlbnRpY2F0aW9uCisuSXQgUmVrZXlMaW1pdAorLkl0IFJlbW90ZUZvcndhcmQKKy5JdCBSZXF1ZXN0VFRZCisuSXQgUmhvc3RzUlNBQXV0aGVudGljYXRpb24KKy5JdCBSU0FBdXRoZW50aWNhdGlvbgorLkl0IFNlbmRFbnYKKy5JdCBTZXJ2ZXJBbGl2ZUludGVydmFsCisuSXQgU2VydmVyQWxpdmVDb3VudE1heAorLkl0IFN0cmljdEhvc3RLZXlDaGVja2luZworLkl0IFRDUEtlZXBBbGl2ZQorLkl0IFR1bm5lbAorLkl0IFR1bm5lbERldmljZQorLkl0IFVzZVByaXZpbGVnZWRQb3J0CisuSXQgVXNlcgorLkl0IFVzZXJLbm93bkhvc3RzRmlsZQorLkl0IFZlcmlmeUhvc3RLZXlETlMKKy5JdCBWaXN1YWxIb3N0S2V5CisuSXQgWEF1dGhMb2NhdGlvbgorLkVsCisuSXQgRmwgcCBBciBwb3J0CitQb3J0IHRvIGNvbm5lY3QgdG8gb24gdGhlIHJlbW90ZSBob3N0LgorVGhpcyBjYW4gYmUgc3BlY2lmaWVkIG9uIGEKK3Blci1ob3N0IGJhc2lzIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisuSXQgRmwgcQorUXVpZXQgbW9kZS4KK0NhdXNlcyBtb3N0IHdhcm5pbmcgYW5kIGRpYWdub3N0aWMgbWVzc2FnZXMgdG8gYmUgc3VwcHJlc3NlZC4KKy5JdCBGbCBSIFhvCisuU20gb2ZmCisuT28gQXIgYmluZF9hZGRyZXNzIDogT2MKKy5BciBwb3J0IDogaG9zdCA6IGhvc3Rwb3J0CisuU20gb24KKy5YYworU3BlY2lmaWVzIHRoYXQgdGhlIGdpdmVuIHBvcnQgb24gdGhlIHJlbW90ZSAoc2VydmVyKSBob3N0IGlzIHRvIGJlCitmb3J3YXJkZWQgdG8gdGhlIGdpdmVuIGhvc3QgYW5kIHBvcnQgb24gdGhlIGxvY2FsIHNpZGUuCitUaGlzIHdvcmtzIGJ5IGFsbG9jYXRpbmcgYSBzb2NrZXQgdG8gbGlzdGVuIHRvCisuQXIgcG9ydAorb24gdGhlIHJlbW90ZSBzaWRlLCBhbmQgd2hlbmV2ZXIgYSBjb25uZWN0aW9uIGlzIG1hZGUgdG8gdGhpcyBwb3J0LCB0aGUKK2Nvbm5lY3Rpb24gaXMgZm9yd2FyZGVkIG92ZXIgdGhlIHNlY3VyZSBjaGFubmVsLCBhbmQgYSBjb25uZWN0aW9uIGlzCittYWRlIHRvCisuQXIgaG9zdAorcG9ydAorLkFyIGhvc3Rwb3J0Citmcm9tIHRoZSBsb2NhbCBtYWNoaW5lLgorLlBwCitQb3J0IGZvcndhcmRpbmdzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorUHJpdmlsZWdlZCBwb3J0cyBjYW4gYmUgZm9yd2FyZGVkIG9ubHkgd2hlbgorbG9nZ2luZyBpbiBhcyByb290IG9uIHRoZSByZW1vdGUgbWFjaGluZS4KK0lQdjYgYWRkcmVzc2VzIGNhbiBiZSBzcGVjaWZpZWQgYnkgZW5jbG9zaW5nIHRoZSBhZGRyZXNzIGluIHNxdWFyZSBicmFjZXMuCisuUHAKK0J5IGRlZmF1bHQsIHRoZSBsaXN0ZW5pbmcgc29ja2V0IG9uIHRoZSBzZXJ2ZXIgd2lsbCBiZSBib3VuZCB0byB0aGUgbG9vcGJhY2sKK2ludGVyZmFjZSBvbmx5LgorVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSBzcGVjaWZ5aW5nIGEKKy5BciBiaW5kX2FkZHJlc3MgLgorQW4gZW1wdHkKKy5BciBiaW5kX2FkZHJlc3MgLAorb3IgdGhlIGFkZHJlc3MKKy5RbCAqICwKK2luZGljYXRlcyB0aGF0IHRoZSByZW1vdGUgc29ja2V0IHNob3VsZCBsaXN0ZW4gb24gYWxsIGludGVyZmFjZXMuCitTcGVjaWZ5aW5nIGEgcmVtb3RlCisuQXIgYmluZF9hZGRyZXNzCit3aWxsIG9ubHkgc3VjY2VlZCBpZiB0aGUgc2VydmVyJ3MKKy5DbSBHYXRld2F5UG9ydHMKK29wdGlvbiBpcyBlbmFibGVkIChzZWUKKy5YciBzc2hkX2NvbmZpZyA1ICkgLgorLlBwCitJZiB0aGUKKy5BciBwb3J0Cithcmd1bWVudCBpcworLlFsIDAgLAordGhlIGxpc3RlbiBwb3J0IHdpbGwgYmUgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG9uIHRoZSBzZXJ2ZXIgYW5kIHJlcG9ydGVkCit0byB0aGUgY2xpZW50IGF0IHJ1biB0aW1lLgorV2hlbiB1c2VkIHRvZ2V0aGVyIHdpdGgKKy5JYyAtTyBmb3J3YXJkCit0aGUgYWxsb2NhdGVkIHBvcnQgd2lsbCBiZSBwcmludGVkIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuCisuSXQgRmwgUyBBciBjdGxfcGF0aAorU3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiBhIGNvbnRyb2wgc29ja2V0IGZvciBjb25uZWN0aW9uIHNoYXJpbmcsCitvciB0aGUgc3RyaW5nCisuRHEgbm9uZQordG8gZGlzYWJsZSBjb25uZWN0aW9uIHNoYXJpbmcuCitSZWZlciB0byB0aGUgZGVzY3JpcHRpb24gb2YKKy5DbSBDb250cm9sUGF0aAorYW5kCisuQ20gQ29udHJvbE1hc3RlcgoraW4KKy5YciBzc2hfY29uZmlnIDUKK2ZvciBkZXRhaWxzLgorLkl0IEZsIHMKK01heSBiZSB1c2VkIHRvIHJlcXVlc3QgaW52b2NhdGlvbiBvZiBhIHN1YnN5c3RlbSBvbiB0aGUgcmVtb3RlIHN5c3RlbS4KK1N1YnN5c3RlbXMgYXJlIGEgZmVhdHVyZSBvZiB0aGUgU1NIMiBwcm90b2NvbCB3aGljaCBmYWNpbGl0YXRlIHRoZSB1c2UKK29mIFNTSCBhcyBhIHNlY3VyZSB0cmFuc3BvcnQgZm9yIG90aGVyIGFwcGxpY2F0aW9ucyAoZWcuXCYKKy5YciBzZnRwIDEgKSAuCitUaGUgc3Vic3lzdGVtIGlzIHNwZWNpZmllZCBhcyB0aGUgcmVtb3RlIGNvbW1hbmQuCisuSXQgRmwgVAorRGlzYWJsZSBwc2V1ZG8tdHR5IGFsbG9jYXRpb24uCisuSXQgRmwgdAorRm9yY2UgcHNldWRvLXR0eSBhbGxvY2F0aW9uLgorVGhpcyBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGFyYml0cmFyeQorc2NyZWVuLWJhc2VkIHByb2dyYW1zIG9uIGEgcmVtb3RlIG1hY2hpbmUsIHdoaWNoIGNhbiBiZSB2ZXJ5IHVzZWZ1bCwKK2UuZy4gd2hlbiBpbXBsZW1lbnRpbmcgbWVudSBzZXJ2aWNlcy4KK011bHRpcGxlCisuRmwgdAorb3B0aW9ucyBmb3JjZSB0dHkgYWxsb2NhdGlvbiwgZXZlbiBpZgorLk5tCitoYXMgbm8gbG9jYWwgdHR5LgorLkl0IEZsIFYKK0Rpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIGFuZCBleGl0LgorLkl0IEZsIHYKK1ZlcmJvc2UgbW9kZS4KK0NhdXNlcworLk5tCit0byBwcmludCBkZWJ1Z2dpbmcgbWVzc2FnZXMgYWJvdXQgaXRzIHByb2dyZXNzLgorVGhpcyBpcyBoZWxwZnVsIGluCitkZWJ1Z2dpbmcgY29ubmVjdGlvbiwgYXV0aGVudGljYXRpb24sIGFuZCBjb25maWd1cmF0aW9uIHByb2JsZW1zLgorTXVsdGlwbGUKKy5GbCB2CitvcHRpb25zIGluY3JlYXNlIHRoZSB2ZXJib3NpdHkuCitUaGUgbWF4aW11bSBpcyAzLgorLkl0IEZsIFcgQXIgaG9zdCA6IE5zIEFyIHBvcnQKK1JlcXVlc3RzIHRoYXQgc3RhbmRhcmQgaW5wdXQgYW5kIG91dHB1dCBvbiB0aGUgY2xpZW50IGJlIGZvcndhcmRlZCB0bworLkFyIGhvc3QKK29uCisuQXIgcG9ydAorb3ZlciB0aGUgc2VjdXJlIGNoYW5uZWwuCitJbXBsaWVzCisuRmwgTiAsCisuRmwgVCAsCisuQ20gRXhpdE9uRm9yd2FyZEZhaWx1cmUKK2FuZAorLkNtIENsZWFyQWxsRm9yd2FyZGluZ3MKK2FuZCB3b3JrcyB3aXRoIFByb3RvY29sIHZlcnNpb24gMiBvbmx5LgorLkl0IEZsIHcgWG8KKy5BciBsb2NhbF90dW4gTnMgT3AgOiBOcyBBciByZW1vdGVfdHVuCisuWGMKK1JlcXVlc3RzCit0dW5uZWwKK2RldmljZSBmb3J3YXJkaW5nIHdpdGggdGhlIHNwZWNpZmllZAorLlhyIHR1biA0CitkZXZpY2VzIGJldHdlZW4gdGhlIGNsaWVudAorLlBxIEFyIGxvY2FsX3R1bgorYW5kIHRoZSBzZXJ2ZXIKKy5QcSBBciByZW1vdGVfdHVuIC4KKy5QcAorVGhlIGRldmljZXMgbWF5IGJlIHNwZWNpZmllZCBieSBudW1lcmljYWwgSUQgb3IgdGhlIGtleXdvcmQKKy5EcSBhbnkgLAord2hpY2ggdXNlcyB0aGUgbmV4dCBhdmFpbGFibGUgdHVubmVsIGRldmljZS4KK0lmCisuQXIgcmVtb3RlX3R1bgoraXMgbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8KKy5EcSBhbnkgLgorU2VlIGFsc28gdGhlCisuQ20gVHVubmVsCithbmQKKy5DbSBUdW5uZWxEZXZpY2UKK2RpcmVjdGl2ZXMgaW4KKy5YciBzc2hfY29uZmlnIDUgLgorSWYgdGhlCisuQ20gVHVubmVsCitkaXJlY3RpdmUgaXMgdW5zZXQsIGl0IGlzIHNldCB0byB0aGUgZGVmYXVsdCB0dW5uZWwgbW9kZSwgd2hpY2ggaXMKKy5EcSBwb2ludC10by1wb2ludCAuCisuSXQgRmwgWAorRW5hYmxlcyBYMTEgZm9yd2FyZGluZy4KK1RoaXMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIG9uIGEgcGVyLWhvc3QgYmFzaXMgaW4gYSBjb25maWd1cmF0aW9uIGZpbGUuCisuUHAKK1gxMSBmb3J3YXJkaW5nIHNob3VsZCBiZSBlbmFibGVkIHdpdGggY2F1dGlvbi4KK1VzZXJzIHdpdGggdGhlIGFiaWxpdHkgdG8gYnlwYXNzIGZpbGUgcGVybWlzc2lvbnMgb24gdGhlIHJlbW90ZSBob3N0CisoZm9yIHRoZSB1c2VyJ3MgWCBhdXRob3JpemF0aW9uIGRhdGFiYXNlKQorY2FuIGFjY2VzcyB0aGUgbG9jYWwgWDExIGRpc3BsYXkgdGhyb3VnaCB0aGUgZm9yd2FyZGVkIGNvbm5lY3Rpb24uCitBbiBhdHRhY2tlciBtYXkgdGhlbiBiZSBhYmxlIHRvIHBlcmZvcm0gYWN0aXZpdGllcyBzdWNoIGFzIGtleXN0cm9rZSBtb25pdG9yaW5nLgorLlBwCitGb3IgdGhpcyByZWFzb24sIFgxMSBmb3J3YXJkaW5nIGlzIHN1YmplY3RlZCB0byBYMTEgU0VDVVJJVFkgZXh0ZW5zaW9uCityZXN0cmljdGlvbnMgYnkgZGVmYXVsdC4KK1BsZWFzZSByZWZlciB0byB0aGUKKy5ObQorLkZsIFkKK29wdGlvbiBhbmQgdGhlCisuQ20gRm9yd2FyZFgxMVRydXN0ZWQKK2RpcmVjdGl2ZSBpbgorLlhyIHNzaF9jb25maWcgNQorZm9yIG1vcmUgaW5mb3JtYXRpb24uCisuSXQgRmwgeAorRGlzYWJsZXMgWDExIGZvcndhcmRpbmcuCisuSXQgRmwgWQorRW5hYmxlcyB0cnVzdGVkIFgxMSBmb3J3YXJkaW5nLgorVHJ1c3RlZCBYMTEgZm9yd2FyZGluZ3MgYXJlIG5vdCBzdWJqZWN0ZWQgdG8gdGhlIFgxMSBTRUNVUklUWSBleHRlbnNpb24KK2NvbnRyb2xzLgorLkl0IEZsIHkKK1NlbmQgbG9nIGluZm9ybWF0aW9uIHVzaW5nIHRoZQorLlhyIHN5c2xvZyAzCitzeXN0ZW0gbW9kdWxlLgorQnkgZGVmYXVsdCB0aGlzIGluZm9ybWF0aW9uIGlzIHNlbnQgdG8gc3RkZXJyLgorLkVsCisuUHAKKy5ObQorbWF5IGFkZGl0aW9uYWxseSBvYnRhaW4gY29uZmlndXJhdGlvbiBkYXRhIGZyb20KK2EgcGVyLXVzZXIgY29uZmlndXJhdGlvbiBmaWxlIGFuZCBhIHN5c3RlbS13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZS4KK1RoZSBmaWxlIGZvcm1hdCBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBkZXNjcmliZWQgaW4KKy5YciBzc2hfY29uZmlnIDUgLgorLlNoIEFVVEhFTlRJQ0FUSU9OCitUaGUgT3BlblNTSCBTU0ggY2xpZW50IHN1cHBvcnRzIFNTSCBwcm90b2NvbHMgMSBhbmQgMi4KK1RoZSBkZWZhdWx0IGlzIHRvIHVzZSBwcm90b2NvbCAyIG9ubHksCit0aG91Z2ggdGhpcyBjYW4gYmUgY2hhbmdlZCB2aWEgdGhlCisuQ20gUHJvdG9jb2wKK29wdGlvbiBpbgorLlhyIHNzaF9jb25maWcgNQorb3IgdGhlCisuRmwgMQorYW5kCisuRmwgMgorb3B0aW9ucyAoc2VlIGFib3ZlKS4KK0JvdGggcHJvdG9jb2xzIHN1cHBvcnQgc2ltaWxhciBhdXRoZW50aWNhdGlvbiBtZXRob2RzLAorYnV0IHByb3RvY29sIDIgaXMgdGhlIGRlZmF1bHQgc2luY2UKK2l0IHByb3ZpZGVzIGFkZGl0aW9uYWwgbWVjaGFuaXNtcyBmb3IgY29uZmlkZW50aWFsaXR5CisodGhlIHRyYWZmaWMgaXMgZW5jcnlwdGVkIHVzaW5nIEFFUywgM0RFUywgQmxvd2Zpc2gsIENBU1QxMjgsIG9yIEFyY2ZvdXIpCithbmQgaW50ZWdyaXR5IChobWFjLW1kNSwgaG1hYy1zaGExLAoraG1hYy1zaGEyLTI1NiwgaG1hYy1zaGEyLTUxMiwKK3VtYWMtNjQsIGhtYWMtcmlwZW1kMTYwKS4KK1Byb3RvY29sIDEgbGFja3MgYSBzdHJvbmcgbWVjaGFuaXNtIGZvciBlbnN1cmluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgY29ubmVjdGlvbi4KKy5QcAorVGhlIG1ldGhvZHMgYXZhaWxhYmxlIGZvciBhdXRoZW50aWNhdGlvbiBhcmU6CitHU1NBUEktYmFzZWQgYXV0aGVudGljYXRpb24sCitob3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uLAorcHVibGljIGtleSBhdXRoZW50aWNhdGlvbiwKK2NoYWxsZW5nZS1yZXNwb25zZSBhdXRoZW50aWNhdGlvbiwKK2FuZCBwYXNzd29yZCBhdXRoZW50aWNhdGlvbi4KK0F1dGhlbnRpY2F0aW9uIG1ldGhvZHMgYXJlIHRyaWVkIGluIHRoZSBvcmRlciBzcGVjaWZpZWQgYWJvdmUsCit0aG91Z2ggcHJvdG9jb2wgMiBoYXMgYSBjb25maWd1cmF0aW9uIG9wdGlvbiB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgb3JkZXI6CisuQ20gUHJlZmVycmVkQXV0aGVudGljYXRpb25zIC4KKy5QcAorSG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbiB3b3JrcyBhcyBmb2xsb3dzOgorSWYgdGhlIG1hY2hpbmUgdGhlIHVzZXIgbG9ncyBpbiBmcm9tIGlzIGxpc3RlZCBpbgorLlBhIC9ldGMvaG9zdHMuZXF1aXYKK29yCisuUGEgL2V0Yy9zaG9zdHMuZXF1aXYKK29uIHRoZSByZW1vdGUgbWFjaGluZSwgYW5kIHRoZSB1c2VyIG5hbWVzIGFyZQordGhlIHNhbWUgb24gYm90aCBzaWRlcywgb3IgaWYgdGhlIGZpbGVzCisuUGEgfi8ucmhvc3RzCitvcgorLlBhIH4vLnNob3N0cworZXhpc3QgaW4gdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSBvbiB0aGUKK3JlbW90ZSBtYWNoaW5lIGFuZCBjb250YWluIGEgbGluZSBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBjbGllbnQKK21hY2hpbmUgYW5kIHRoZSBuYW1lIG9mIHRoZSB1c2VyIG9uIHRoYXQgbWFjaGluZSwgdGhlIHVzZXIgaXMKK2NvbnNpZGVyZWQgZm9yIGxvZ2luLgorQWRkaXRpb25hbGx5LCB0aGUgc2VydmVyCisuRW0gbXVzdAorYmUgYWJsZSB0byB2ZXJpZnkgdGhlIGNsaWVudCdzCitob3N0IGtleSAoc2VlIHRoZSBkZXNjcmlwdGlvbiBvZgorLlBhIC9ldGMvc3NoL3NzaF9rbm93bl9ob3N0cworYW5kCisuUGEgfi8uc3NoL2tub3duX2hvc3RzICwKK2JlbG93KQorZm9yIGxvZ2luIHRvIGJlIHBlcm1pdHRlZC4KK1RoaXMgYXV0aGVudGljYXRpb24gbWV0aG9kIGNsb3NlcyBzZWN1cml0eSBob2xlcyBkdWUgdG8gSVAKK3Nwb29maW5nLCBETlMgc3Bvb2ZpbmcsIGFuZCByb3V0aW5nIHNwb29maW5nLgorW05vdGUgdG8gdGhlIGFkbWluaXN0cmF0b3I6CisuUGEgL2V0Yy9ob3N0cy5lcXVpdiAsCisuUGEgfi8ucmhvc3RzICwKK2FuZCB0aGUgcmxvZ2luL3JzaCBwcm90b2NvbCBpbiBnZW5lcmFsLCBhcmUgaW5oZXJlbnRseSBpbnNlY3VyZSBhbmQgc2hvdWxkIGJlCitkaXNhYmxlZCBpZiBzZWN1cml0eSBpcyBkZXNpcmVkLl0KKy5QcAorUHVibGljIGtleSBhdXRoZW50aWNhdGlvbiB3b3JrcyBhcyBmb2xsb3dzOgorVGhlIHNjaGVtZSBpcyBiYXNlZCBvbiBwdWJsaWMta2V5IGNyeXB0b2dyYXBoeSwKK3VzaW5nIGNyeXB0b3N5c3RlbXMKK3doZXJlIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gYXJlIGRvbmUgdXNpbmcgc2VwYXJhdGUga2V5cywKK2FuZCBpdCBpcyB1bmZlYXNpYmxlIHRvIGRlcml2ZSB0aGUgZGVjcnlwdGlvbiBrZXkgZnJvbSB0aGUgZW5jcnlwdGlvbiBrZXkuCitUaGUgaWRlYSBpcyB0aGF0IGVhY2ggdXNlciBjcmVhdGVzIGEgcHVibGljL3ByaXZhdGUKK2tleSBwYWlyIGZvciBhdXRoZW50aWNhdGlvbiBwdXJwb3Nlcy4KK1RoZSBzZXJ2ZXIga25vd3MgdGhlIHB1YmxpYyBrZXksIGFuZCBvbmx5IHRoZSB1c2VyIGtub3dzIHRoZSBwcml2YXRlIGtleS4KKy5ObQoraW1wbGVtZW50cyBwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uIHByb3RvY29sIGF1dG9tYXRpY2FsbHksCit1c2luZyBvbmUgb2YgdGhlIERTQSwgRUNEU0Egb3IgUlNBIGFsZ29yaXRobXMuCitQcm90b2NvbCAxIGlzIHJlc3RyaWN0ZWQgdG8gdXNpbmcgb25seSBSU0Ega2V5cywKK2J1dCBwcm90b2NvbCAyIG1heSB1c2UgYW55LgorVGhlCisuU3ggSElTVE9SWQorc2VjdGlvbiBvZgorLlhyIHNzbCA4Citjb250YWlucyBhIGJyaWVmIGRpc2N1c3Npb24gb2YgdGhlIERTQSBhbmQgUlNBIGFsZ29yaXRobXMuCisuUHAKK1RoZSBmaWxlCisuUGEgfi8uc3NoL2F1dGhvcml6ZWRfa2V5cworbGlzdHMgdGhlIHB1YmxpYyBrZXlzIHRoYXQgYXJlIHBlcm1pdHRlZCBmb3IgbG9nZ2luZyBpbi4KK1doZW4gdGhlIHVzZXIgbG9ncyBpbiwgdGhlCisuTm0KK3Byb2dyYW0gdGVsbHMgdGhlIHNlcnZlciB3aGljaCBrZXkgcGFpciBpdCB3b3VsZCBsaWtlIHRvIHVzZSBmb3IKK2F1dGhlbnRpY2F0aW9uLgorVGhlIGNsaWVudCBwcm92ZXMgdGhhdCBpdCBoYXMgYWNjZXNzIHRvIHRoZSBwcml2YXRlIGtleQorYW5kIHRoZSBzZXJ2ZXIgY2hlY2tzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgcHVibGljIGtleQoraXMgYXV0aG9yaXplZCB0byBhY2NlcHQgdGhlIGFjY291bnQuCisuUHAKK1RoZSB1c2VyIGNyZWF0ZXMgaGlzL2hlciBrZXkgcGFpciBieSBydW5uaW5nCisuWHIgc3NoLWtleWdlbiAxIC4KK1RoaXMgc3RvcmVzIHRoZSBwcml2YXRlIGtleSBpbgorLlBhIH4vLnNzaC9pZGVudGl0eQorKHByb3RvY29sIDEpLAorLlBhIH4vLnNzaC9pZF9kc2EKKyhwcm90b2NvbCAyIERTQSksCisuUGEgfi8uc3NoL2lkX2VjZHNhCisocHJvdG9jb2wgMiBFQ0RTQSksCitvcgorLlBhIH4vLnNzaC9pZF9yc2EKKyhwcm90b2NvbCAyIFJTQSkKK2FuZCBzdG9yZXMgdGhlIHB1YmxpYyBrZXkgaW4KKy5QYSB+Ly5zc2gvaWRlbnRpdHkucHViCisocHJvdG9jb2wgMSksCisuUGEgfi8uc3NoL2lkX2RzYS5wdWIKKyhwcm90b2NvbCAyIERTQSksCisuUGEgfi8uc3NoL2lkX2VjZHNhLnB1YgorKHByb3RvY29sIDIgRUNEU0EpLAorb3IKKy5QYSB+Ly5zc2gvaWRfcnNhLnB1YgorKHByb3RvY29sIDIgUlNBKQoraW4gdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeS4KK1RoZSB1c2VyIHNob3VsZCB0aGVuIGNvcHkgdGhlIHB1YmxpYyBrZXkKK3RvCisuUGEgfi8uc3NoL2F1dGhvcml6ZWRfa2V5cworaW4gaGlzL2hlciBob21lIGRpcmVjdG9yeSBvbiB0aGUgcmVtb3RlIG1hY2hpbmUuCitUaGUKKy5QYSBhdXRob3JpemVkX2tleXMKK2ZpbGUgY29ycmVzcG9uZHMgdG8gdGhlIGNvbnZlbnRpb25hbAorLlBhIH4vLnJob3N0cworZmlsZSwgYW5kIGhhcyBvbmUga2V5CitwZXIgbGluZSwgdGhvdWdoIHRoZSBsaW5lcyBjYW4gYmUgdmVyeSBsb25nLgorQWZ0ZXIgdGhpcywgdGhlIHVzZXIgY2FuIGxvZyBpbiB3aXRob3V0IGdpdmluZyB0aGUgcGFzc3dvcmQuCisuUHAKK0EgdmFyaWF0aW9uIG9uIHB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24KK2lzIGF2YWlsYWJsZSBpbiB0aGUgZm9ybSBvZiBjZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbjoKK2luc3RlYWQgb2YgYSBzZXQgb2YgcHVibGljL3ByaXZhdGUga2V5cywKK3NpZ25lZCBjZXJ0aWZpY2F0ZXMgYXJlIHVzZWQuCitUaGlzIGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgYSBzaW5nbGUgdHJ1c3RlZCBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eQorY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgbWFueSBwdWJsaWMvcHJpdmF0ZSBrZXlzLgorU2VlIHRoZQorLlN4IENFUlRJRklDQVRFUworc2VjdGlvbiBvZgorLlhyIHNzaC1rZXlnZW4gMQorZm9yIG1vcmUgaW5mb3JtYXRpb24uCisuUHAKK1RoZSBtb3N0IGNvbnZlbmllbnQgd2F5IHRvIHVzZSBwdWJsaWMga2V5IG9yIGNlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uCittYXkgYmUgd2l0aCBhbiBhdXRoZW50aWNhdGlvbiBhZ2VudC4KK1NlZQorLlhyIHNzaC1hZ2VudCAxCitmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKy5QcAorQ2hhbGxlbmdlLXJlc3BvbnNlIGF1dGhlbnRpY2F0aW9uIHdvcmtzIGFzIGZvbGxvd3M6CitUaGUgc2VydmVyIHNlbmRzIGFuIGFyYml0cmFyeQorLlFxIGNoYWxsZW5nZQordGV4dCwgYW5kIHByb21wdHMgZm9yIGEgcmVzcG9uc2UuCitQcm90b2NvbCAyIGFsbG93cyBtdWx0aXBsZSBjaGFsbGVuZ2VzIGFuZCByZXNwb25zZXM7Citwcm90b2NvbCAxIGlzIHJlc3RyaWN0ZWQgdG8ganVzdCBvbmUgY2hhbGxlbmdlL3Jlc3BvbnNlLgorRXhhbXBsZXMgb2YgY2hhbGxlbmdlLXJlc3BvbnNlIGF1dGhlbnRpY2F0aW9uIGluY2x1ZGUKK0JTRCBBdXRoZW50aWNhdGlvbiAoc2VlCisuWHIgbG9naW4uY29uZiA1ICkKK2FuZCBQQU0gKHNvbWUgbm9uLU9wZW5CU0Qgc3lzdGVtcykuCisuUHAKK0ZpbmFsbHksIGlmIG90aGVyIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgZmFpbCwKKy5ObQorcHJvbXB0cyB0aGUgdXNlciBmb3IgYSBwYXNzd29yZC4KK1RoZSBwYXNzd29yZCBpcyBzZW50IHRvIHRoZSByZW1vdGUKK2hvc3QgZm9yIGNoZWNraW5nOyBob3dldmVyLCBzaW5jZSBhbGwgY29tbXVuaWNhdGlvbnMgYXJlIGVuY3J5cHRlZCwKK3RoZSBwYXNzd29yZCBjYW5ub3QgYmUgc2VlbiBieSBzb21lb25lIGxpc3RlbmluZyBvbiB0aGUgbmV0d29yay4KKy5QcAorLk5tCithdXRvbWF0aWNhbGx5IG1haW50YWlucyBhbmQgY2hlY2tzIGEgZGF0YWJhc2UgY29udGFpbmluZworaWRlbnRpZmljYXRpb24gZm9yIGFsbCBob3N0cyBpdCBoYXMgZXZlciBiZWVuIHVzZWQgd2l0aC4KK0hvc3Qga2V5cyBhcmUgc3RvcmVkIGluCisuUGEgfi8uc3NoL2tub3duX2hvc3RzCitpbiB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LgorQWRkaXRpb25hbGx5LCB0aGUgZmlsZQorLlBhIC9ldGMvc3NoL3NzaF9rbm93bl9ob3N0cworaXMgYXV0b21hdGljYWxseSBjaGVja2VkIGZvciBrbm93biBob3N0cy4KK0FueSBuZXcgaG9zdHMgYXJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIHVzZXIncyBmaWxlLgorSWYgYSBob3N0J3MgaWRlbnRpZmljYXRpb24gZXZlciBjaGFuZ2VzLAorLk5tCit3YXJucyBhYm91dCB0aGlzIGFuZCBkaXNhYmxlcyBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiB0byBwcmV2ZW50CitzZXJ2ZXIgc3Bvb2Zpbmcgb3IgbWFuLWluLXRoZS1taWRkbGUgYXR0YWNrcywKK3doaWNoIGNvdWxkIG90aGVyd2lzZSBiZSB1c2VkIHRvIGNpcmN1bXZlbnQgdGhlIGVuY3J5cHRpb24uCitUaGUKKy5DbSBTdHJpY3RIb3N0S2V5Q2hlY2tpbmcKK29wdGlvbiBjYW4gYmUgdXNlZCB0byBjb250cm9sIGxvZ2lucyB0byBtYWNoaW5lcyB3aG9zZQoraG9zdCBrZXkgaXMgbm90IGtub3duIG9yIGhhcyBjaGFuZ2VkLgorLlBwCitXaGVuIHRoZSB1c2VyJ3MgaWRlbnRpdHkgaGFzIGJlZW4gYWNjZXB0ZWQgYnkgdGhlIHNlcnZlciwgdGhlIHNlcnZlcgorZWl0aGVyIGV4ZWN1dGVzIHRoZSBnaXZlbiBjb21tYW5kLCBvciBsb2dzIGludG8gdGhlIG1hY2hpbmUgYW5kIGdpdmVzCit0aGUgdXNlciBhIG5vcm1hbCBzaGVsbCBvbiB0aGUgcmVtb3RlIG1hY2hpbmUuCitBbGwgY29tbXVuaWNhdGlvbiB3aXRoCit0aGUgcmVtb3RlIGNvbW1hbmQgb3Igc2hlbGwgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGVuY3J5cHRlZC4KKy5QcAorSWYgYSBwc2V1ZG8tdGVybWluYWwgaGFzIGJlZW4gYWxsb2NhdGVkIChub3JtYWwgbG9naW4gc2Vzc2lvbiksIHRoZQordXNlciBtYXkgdXNlIHRoZSBlc2NhcGUgY2hhcmFjdGVycyBub3RlZCBiZWxvdy4KKy5QcAorSWYgbm8gcHNldWRvLXR0eSBoYXMgYmVlbiBhbGxvY2F0ZWQsCit0aGUgc2Vzc2lvbiBpcyB0cmFuc3BhcmVudCBhbmQgY2FuIGJlIHVzZWQgdG8gcmVsaWFibHkgdHJhbnNmZXIgYmluYXJ5IGRhdGEuCitPbiBtb3N0IHN5c3RlbXMsIHNldHRpbmcgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgdG8KKy5EcSBub25lCit3aWxsIGFsc28gbWFrZSB0aGUgc2Vzc2lvbiB0cmFuc3BhcmVudCBldmVuIGlmIGEgdHR5IGlzIHVzZWQuCisuUHAKK1RoZSBzZXNzaW9uIHRlcm1pbmF0ZXMgd2hlbiB0aGUgY29tbWFuZCBvciBzaGVsbCBvbiB0aGUgcmVtb3RlCittYWNoaW5lIGV4aXRzIGFuZCBhbGwgWDExIGFuZCBUQ1AgY29ubmVjdGlvbnMgaGF2ZSBiZWVuIGNsb3NlZC4KKy5TaCBFU0NBUEUgQ0hBUkFDVEVSUworV2hlbiBhIHBzZXVkby10ZXJtaW5hbCBoYXMgYmVlbiByZXF1ZXN0ZWQsCisuTm0KK3N1cHBvcnRzIGEgbnVtYmVyIG9mIGZ1bmN0aW9ucyB0aHJvdWdoIHRoZSB1c2Ugb2YgYW4gZXNjYXBlIGNoYXJhY3Rlci4KKy5QcAorQSBzaW5nbGUgdGlsZGUgY2hhcmFjdGVyIGNhbiBiZSBzZW50IGFzCisuSWMgfn4KK29yIGJ5IGZvbGxvd2luZyB0aGUgdGlsZGUgYnkgYSBjaGFyYWN0ZXIgb3RoZXIgdGhhbiB0aG9zZSBkZXNjcmliZWQgYmVsb3cuCitUaGUgZXNjYXBlIGNoYXJhY3RlciBtdXN0IGFsd2F5cyBmb2xsb3cgYSBuZXdsaW5lIHRvIGJlIGludGVycHJldGVkIGFzCitzcGVjaWFsLgorVGhlIGVzY2FwZSBjaGFyYWN0ZXIgY2FuIGJlIGNoYW5nZWQgaW4gY29uZmlndXJhdGlvbiBmaWxlcyB1c2luZyB0aGUKKy5DbSBFc2NhcGVDaGFyCitjb25maWd1cmF0aW9uIGRpcmVjdGl2ZSBvciBvbiB0aGUgY29tbWFuZCBsaW5lIGJ5IHRoZQorLkZsIGUKK29wdGlvbi4KKy5QcAorVGhlIHN1cHBvcnRlZCBlc2NhcGVzIChhc3N1bWluZyB0aGUgZGVmYXVsdAorLlFsIH4gKQorYXJlOgorLkJsIC10YWcgLXdpZHRoIERzCisuSXQgQ20gfi4KK0Rpc2Nvbm5lY3QuCisuSXQgQ20gfl5aCitCYWNrZ3JvdW5kCisuTm0gLgorLkl0IENtIH4jCitMaXN0IGZvcndhcmRlZCBjb25uZWN0aW9ucy4KKy5JdCBDbSB+JgorQmFja2dyb3VuZAorLk5tCithdCBsb2dvdXQgd2hlbiB3YWl0aW5nIGZvciBmb3J3YXJkZWQgY29ubmVjdGlvbiAvIFgxMSBzZXNzaW9ucyB0byB0ZXJtaW5hdGUuCisuSXQgQ20gfj8KK0Rpc3BsYXkgYSBsaXN0IG9mIGVzY2FwZSBjaGFyYWN0ZXJzLgorLkl0IENtIH5CCitTZW5kIGEgQlJFQUsgdG8gdGhlIHJlbW90ZSBzeXN0ZW0KKyhvbmx5IHVzZWZ1bCBmb3IgU1NIIHByb3RvY29sIHZlcnNpb24gMiBhbmQgaWYgdGhlIHBlZXIgc3VwcG9ydHMgaXQpLgorLkl0IENtIH5DCitPcGVuIGNvbW1hbmQgbGluZS4KK0N1cnJlbnRseSB0aGlzIGFsbG93cyB0aGUgYWRkaXRpb24gb2YgcG9ydCBmb3J3YXJkaW5ncyB1c2luZyB0aGUKKy5GbCBMICwKKy5GbCBSCithbmQKKy5GbCBECitvcHRpb25zIChzZWUgYWJvdmUpLgorSXQgYWxzbyBhbGxvd3MgdGhlIGNhbmNlbGxhdGlvbiBvZiBleGlzdGluZyBwb3J0LWZvcndhcmRpbmdzCit3aXRoCisuU20gb2ZmCisuRmwgS0wgT28gQXIgYmluZF9hZGRyZXNzIDogT2MgQXIgcG9ydAorLlNtIG9uCitmb3IgbG9jYWwsCisuU20gb2ZmCisuRmwgS1IgT28gQXIgYmluZF9hZGRyZXNzIDogT2MgQXIgcG9ydAorLlNtIG9uCitmb3IgcmVtb3RlIGFuZAorLlNtIG9mZgorLkZsIEtEIE9vIEFyIGJpbmRfYWRkcmVzcyA6IE9jIEFyIHBvcnQKKy5TbSBvbgorZm9yIGR5bmFtaWMgcG9ydC1mb3J3YXJkaW5ncy4KKy5JYyAhXCYgTnMgQXIgY29tbWFuZAorYWxsb3dzIHRoZSB1c2VyIHRvIGV4ZWN1dGUgYSBsb2NhbCBjb21tYW5kIGlmIHRoZQorLkljIFBlcm1pdExvY2FsQ29tbWFuZAorb3B0aW9uIGlzIGVuYWJsZWQgaW4KKy5YciBzc2hfY29uZmlnIDUgLgorQmFzaWMgaGVscCBpcyBhdmFpbGFibGUsIHVzaW5nIHRoZQorLkZsIGgKK29wdGlvbi4KKy5JdCBDbSB+UgorUmVxdWVzdCByZWtleWluZyBvZiB0aGUgY29ubmVjdGlvbgorKG9ubHkgdXNlZnVsIGZvciBTU0ggcHJvdG9jb2wgdmVyc2lvbiAyIGFuZCBpZiB0aGUgcGVlciBzdXBwb3J0cyBpdCkuCisuRWwKKy5TaCBUQ1AgRk9SV0FSRElORworRm9yd2FyZGluZyBvZiBhcmJpdHJhcnkgVENQIGNvbm5lY3Rpb25zIG92ZXIgdGhlIHNlY3VyZSBjaGFubmVsIGNhbgorYmUgc3BlY2lmaWVkIGVpdGhlciBvbiB0aGUgY29tbWFuZCBsaW5lIG9yIGluIGEgY29uZmlndXJhdGlvbiBmaWxlLgorT25lIHBvc3NpYmxlIGFwcGxpY2F0aW9uIG9mIFRDUCBmb3J3YXJkaW5nIGlzIGEgc2VjdXJlIGNvbm5lY3Rpb24gdG8gYQorbWFpbCBzZXJ2ZXI7IGFub3RoZXIgaXMgZ29pbmcgdGhyb3VnaCBmaXJld2FsbHMuCisuUHAKK0luIHRoZSBleGFtcGxlIGJlbG93LCB3ZSBsb29rIGF0IGVuY3J5cHRpbmcgY29tbXVuaWNhdGlvbiBiZXR3ZWVuCithbiBJUkMgY2xpZW50IGFuZCBzZXJ2ZXIsIGV2ZW4gdGhvdWdoIHRoZSBJUkMgc2VydmVyIGRvZXMgbm90IGRpcmVjdGx5CitzdXBwb3J0IGVuY3J5cHRlZCBjb21tdW5pY2F0aW9ucy4KK1RoaXMgd29ya3MgYXMgZm9sbG93czoKK3RoZSB1c2VyIGNvbm5lY3RzIHRvIHRoZSByZW1vdGUgaG9zdCB1c2luZworLk5tICwKK3NwZWNpZnlpbmcgYSBwb3J0IHRvIGJlIHVzZWQgdG8gZm9yd2FyZCBjb25uZWN0aW9ucwordG8gdGhlIHJlbW90ZSBzZXJ2ZXIuCitBZnRlciB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIHN0YXJ0IHRoZSBzZXJ2aWNlIHdoaWNoIGlzIHRvIGJlIGVuY3J5cHRlZAorb24gdGhlIGNsaWVudCBtYWNoaW5lLAorY29ubmVjdGluZyB0byB0aGUgc2FtZSBsb2NhbCBwb3J0LAorYW5kCisuTm0KK3dpbGwgZW5jcnlwdCBhbmQgZm9yd2FyZCB0aGUgY29ubmVjdGlvbi4KKy5QcAorVGhlIGZvbGxvd2luZyBleGFtcGxlIHR1bm5lbHMgYW4gSVJDIHNlc3Npb24gZnJvbSBjbGllbnQgbWFjaGluZQorLkRxIDEyNy4wLjAuMQorKGxvY2FsaG9zdCkKK3RvIHJlbW90ZSBzZXJ2ZXIKKy5EcSBzZXJ2ZXIuZXhhbXBsZS5jb20gOgorLkJkIC1saXRlcmFsIC1vZmZzZXQgNG4KKyQgc3NoIC1mIC1MIDEyMzQ6bG9jYWxob3N0OjY2Njcgc2VydmVyLmV4YW1wbGUuY29tIHNsZWVwIDEwCiskIGlyYyAtYyAnI3VzZXJzJyAtcCAxMjM0IHBpbmt5IDEyNy4wLjAuMQorLkVkCisuUHAKK1RoaXMgdHVubmVscyBhIGNvbm5lY3Rpb24gdG8gSVJDIHNlcnZlcgorLkRxIHNlcnZlci5leGFtcGxlLmNvbSAsCitqb2luaW5nIGNoYW5uZWwKKy5EcSAjdXNlcnMgLAorbmlja25hbWUKKy5EcSBwaW5reSAsCit1c2luZyBwb3J0IDEyMzQuCitJdCBkb2Vzbid0IG1hdHRlciB3aGljaCBwb3J0IGlzIHVzZWQsCithcyBsb25nIGFzIGl0J3MgZ3JlYXRlciB0aGFuIDEwMjMKKyhyZW1lbWJlciwgb25seSByb290IGNhbiBvcGVuIHNvY2tldHMgb24gcHJpdmlsZWdlZCBwb3J0cykKK2FuZCBkb2Vzbid0IGNvbmZsaWN0IHdpdGggYW55IHBvcnRzIGFscmVhZHkgaW4gdXNlLgorVGhlIGNvbm5lY3Rpb24gaXMgZm9yd2FyZGVkIHRvIHBvcnQgNjY2NyBvbiB0aGUgcmVtb3RlIHNlcnZlciwKK3NpbmNlIHRoYXQncyB0aGUgc3RhbmRhcmQgcG9ydCBmb3IgSVJDIHNlcnZpY2VzLgorLlBwCitUaGUKKy5GbCBmCitvcHRpb24gYmFja2dyb3VuZHMKKy5ObQorYW5kIHRoZSByZW1vdGUgY29tbWFuZAorLkRxIHNsZWVwIDEwCitpcyBzcGVjaWZpZWQgdG8gYWxsb3cgYW4gYW1vdW50IG9mIHRpbWUKKygxMCBzZWNvbmRzLCBpbiB0aGUgZXhhbXBsZSkKK3RvIHN0YXJ0IHRoZSBzZXJ2aWNlIHdoaWNoIGlzIHRvIGJlIHR1bm5lbGxlZC4KK0lmIG5vIGNvbm5lY3Rpb25zIGFyZSBtYWRlIHdpdGhpbiB0aGUgdGltZSBzcGVjaWZpZWQsCisuTm0KK3dpbGwgZXhpdC4KKy5TaCBYMTEgRk9SV0FSRElORworSWYgdGhlCisuQ20gRm9yd2FyZFgxMQordmFyaWFibGUgaXMgc2V0IHRvCisuRHEgeWVzCisob3Igc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUKKy5GbCBYICwKKy5GbCB4ICwKK2FuZAorLkZsIFkKK29wdGlvbnMgYWJvdmUpCithbmQgdGhlIHVzZXIgaXMgdXNpbmcgWDExICh0aGUKKy5FdiBESVNQTEFZCitlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQpLCB0aGUgY29ubmVjdGlvbiB0byB0aGUgWDExIGRpc3BsYXkgaXMKK2F1dG9tYXRpY2FsbHkgZm9yd2FyZGVkIHRvIHRoZSByZW1vdGUgc2lkZSBpbiBzdWNoIGEgd2F5IHRoYXQgYW55IFgxMQorcHJvZ3JhbXMgc3RhcnRlZCBmcm9tIHRoZSBzaGVsbCAob3IgY29tbWFuZCkgd2lsbCBnbyB0aHJvdWdoIHRoZQorZW5jcnlwdGVkIGNoYW5uZWwsIGFuZCB0aGUgY29ubmVjdGlvbiB0byB0aGUgcmVhbCBYIHNlcnZlciB3aWxsIGJlIG1hZGUKK2Zyb20gdGhlIGxvY2FsIG1hY2hpbmUuCitUaGUgdXNlciBzaG91bGQgbm90IG1hbnVhbGx5IHNldAorLkV2IERJU1BMQVkgLgorRm9yd2FyZGluZyBvZiBYMTEgY29ubmVjdGlvbnMgY2FuIGJlCitjb25maWd1cmVkIG9uIHRoZSBjb21tYW5kIGxpbmUgb3IgaW4gY29uZmlndXJhdGlvbiBmaWxlcy4KKy5QcAorVGhlCisuRXYgRElTUExBWQordmFsdWUgc2V0IGJ5CisuTm0KK3dpbGwgcG9pbnQgdG8gdGhlIHNlcnZlciBtYWNoaW5lLCBidXQgd2l0aCBhIGRpc3BsYXkgbnVtYmVyIGdyZWF0ZXIgdGhhbiB6ZXJvLgorVGhpcyBpcyBub3JtYWwsIGFuZCBoYXBwZW5zIGJlY2F1c2UKKy5ObQorY3JlYXRlcyBhCisuRHEgcHJveHkKK1ggc2VydmVyIG9uIHRoZSBzZXJ2ZXIgbWFjaGluZSBmb3IgZm9yd2FyZGluZyB0aGUKK2Nvbm5lY3Rpb25zIG92ZXIgdGhlIGVuY3J5cHRlZCBjaGFubmVsLgorLlBwCisuTm0KK3dpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IHNldCB1cCBYYXV0aG9yaXR5IGRhdGEgb24gdGhlIHNlcnZlciBtYWNoaW5lLgorRm9yIHRoaXMgcHVycG9zZSwgaXQgd2lsbCBnZW5lcmF0ZSBhIHJhbmRvbSBhdXRob3JpemF0aW9uIGNvb2tpZSwKK3N0b3JlIGl0IGluIFhhdXRob3JpdHkgb24gdGhlIHNlcnZlciwgYW5kIHZlcmlmeSB0aGF0IGFueSBmb3J3YXJkZWQKK2Nvbm5lY3Rpb25zIGNhcnJ5IHRoaXMgY29va2llIGFuZCByZXBsYWNlIGl0IGJ5IHRoZSByZWFsIGNvb2tpZSB3aGVuCit0aGUgY29ubmVjdGlvbiBpcyBvcGVuZWQuCitUaGUgcmVhbCBhdXRoZW50aWNhdGlvbiBjb29raWUgaXMgbmV2ZXIKK3NlbnQgdG8gdGhlIHNlcnZlciBtYWNoaW5lIChhbmQgbm8gY29va2llcyBhcmUgc2VudCBpbiB0aGUgcGxhaW4pLgorLlBwCitJZiB0aGUKKy5DbSBGb3J3YXJkQWdlbnQKK3ZhcmlhYmxlIGlzIHNldCB0bworLkRxIHllcworKG9yIHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlCisuRmwgQQorYW5kCisuRmwgYQorb3B0aW9ucyBhYm92ZSkgYW5kCit0aGUgdXNlciBpcyB1c2luZyBhbiBhdXRoZW50aWNhdGlvbiBhZ2VudCwgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGFnZW50CitpcyBhdXRvbWF0aWNhbGx5IGZvcndhcmRlZCB0byB0aGUgcmVtb3RlIHNpZGUuCisuU2ggVkVSSUZZSU5HIEhPU1QgS0VZUworV2hlbiBjb25uZWN0aW5nIHRvIGEgc2VydmVyIGZvciB0aGUgZmlyc3QgdGltZSwKK2EgZmluZ2VycHJpbnQgb2YgdGhlIHNlcnZlcidzIHB1YmxpYyBrZXkgaXMgcHJlc2VudGVkIHRvIHRoZSB1c2VyCisodW5sZXNzIHRoZSBvcHRpb24KKy5DbSBTdHJpY3RIb3N0S2V5Q2hlY2tpbmcKK2hhcyBiZWVuIGRpc2FibGVkKS4KK0ZpbmdlcnByaW50cyBjYW4gYmUgZGV0ZXJtaW5lZCB1c2luZworLlhyIHNzaC1rZXlnZW4gMSA6CisuUHAKKy5EbCAkIHNzaC1rZXlnZW4gLWwgLWYgL2V0Yy9zc2gvc3NoX2hvc3RfcnNhX2tleQorLlBwCitJZiB0aGUgZmluZ2VycHJpbnQgaXMgYWxyZWFkeSBrbm93biwgaXQgY2FuIGJlIG1hdGNoZWQKK2FuZCB0aGUga2V5IGNhbiBiZSBhY2NlcHRlZCBvciByZWplY3RlZC4KK0JlY2F1c2Ugb2YgdGhlIGRpZmZpY3VsdHkgb2YgY29tcGFyaW5nIGhvc3Qga2V5cworanVzdCBieSBsb29raW5nIGF0IGhleCBzdHJpbmdzLAordGhlcmUgaXMgYWxzbyBzdXBwb3J0IHRvIGNvbXBhcmUgaG9zdCBrZXlzIHZpc3VhbGx5LAordXNpbmcKKy5FbSByYW5kb20gYXJ0IC4KK0J5IHNldHRpbmcgdGhlCisuQ20gVmlzdWFsSG9zdEtleQorb3B0aW9uIHRvCisuRHEgeWVzICwKK2Egc21hbGwgQVNDSUkgZ3JhcGhpYyBnZXRzIGRpc3BsYXllZCBvbiBldmVyeSBsb2dpbiB0byBhIHNlcnZlciwgbm8gbWF0dGVyCitpZiB0aGUgc2Vzc2lvbiBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgb3Igbm90LgorQnkgbGVhcm5pbmcgdGhlIHBhdHRlcm4gYSBrbm93biBzZXJ2ZXIgcHJvZHVjZXMsIGEgdXNlciBjYW4gZWFzaWx5CitmaW5kIG91dCB0aGF0IHRoZSBob3N0IGtleSBoYXMgY2hhbmdlZCB3aGVuIGEgY29tcGxldGVseSBkaWZmZXJlbnQgcGF0dGVybgoraXMgZGlzcGxheWVkLgorQmVjYXVzZSB0aGVzZSBwYXR0ZXJucyBhcmUgbm90IHVuYW1iaWd1b3VzIGhvd2V2ZXIsIGEgcGF0dGVybiB0aGF0IGxvb2tzCitzaW1pbGFyIHRvIHRoZSBwYXR0ZXJuIHJlbWVtYmVyZWQgb25seSBnaXZlcyBhIGdvb2QgcHJvYmFiaWxpdHkgdGhhdCB0aGUKK2hvc3Qga2V5IGlzIHRoZSBzYW1lLCBub3QgZ3VhcmFudGVlZCBwcm9vZi4KKy5QcAorVG8gZ2V0IGEgbGlzdGluZyBvZiB0aGUgZmluZ2VycHJpbnRzIGFsb25nIHdpdGggdGhlaXIgcmFuZG9tIGFydCBmb3IKK2FsbCBrbm93biBob3N0cywgdGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUgY2FuIGJlIHVzZWQ6CisuUHAKKy5EbCAkIHNzaC1rZXlnZW4gLWx2IC1mIH4vLnNzaC9rbm93bl9ob3N0cworLlBwCitJZiB0aGUgZmluZ2VycHJpbnQgaXMgdW5rbm93biwKK2FuIGFsdGVybmF0aXZlIG1ldGhvZCBvZiB2ZXJpZmljYXRpb24gaXMgYXZhaWxhYmxlOgorU1NIIGZpbmdlcnByaW50cyB2ZXJpZmllZCBieSBETlMuCitBbiBhZGRpdGlvbmFsIHJlc291cmNlIHJlY29yZCAoUlIpLAorU1NIRlAsCitpcyBhZGRlZCB0byBhIHpvbmVmaWxlCithbmQgdGhlIGNvbm5lY3RpbmcgY2xpZW50IGlzIGFibGUgdG8gbWF0Y2ggdGhlIGZpbmdlcnByaW50Cit3aXRoIHRoYXQgb2YgdGhlIGtleSBwcmVzZW50ZWQuCisuUHAKK0luIHRoaXMgZXhhbXBsZSwgd2UgYXJlIGNvbm5lY3RpbmcgYSBjbGllbnQgdG8gYSBzZXJ2ZXIsCisuRHEgaG9zdC5leGFtcGxlLmNvbSAuCitUaGUgU1NIRlAgcmVzb3VyY2UgcmVjb3JkcyBzaG91bGQgZmlyc3QgYmUgYWRkZWQgdG8gdGhlIHpvbmVmaWxlIGZvcgoraG9zdC5leGFtcGxlLmNvbToKKy5CZCAtbGl0ZXJhbCAtb2Zmc2V0IGluZGVudAorJCBzc2gta2V5Z2VuIC1yIGhvc3QuZXhhbXBsZS5jb20uCisuRWQKKy5QcAorVGhlIG91dHB1dCBsaW5lcyB3aWxsIGhhdmUgdG8gYmUgYWRkZWQgdG8gdGhlIHpvbmVmaWxlLgorVG8gY2hlY2sgdGhhdCB0aGUgem9uZSBpcyBhbnN3ZXJpbmcgZmluZ2VycHJpbnQgcXVlcmllczoKKy5QcAorLkRsICQgZGlnIC10IFNTSEZQIGhvc3QuZXhhbXBsZS5jb20KKy5QcAorRmluYWxseSB0aGUgY2xpZW50IGNvbm5lY3RzOgorLkJkIC1saXRlcmFsIC1vZmZzZXQgaW5kZW50CiskIHNzaCAtbyAiVmVyaWZ5SG9zdEtleUROUyBhc2siIGhvc3QuZXhhbXBsZS5jb20KK1suLi5dCitNYXRjaGluZyBob3N0IGtleSBmaW5nZXJwcmludCBmb3VuZCBpbiBETlMuCitBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWUgY29ubmVjdGluZyAoeWVzL25vKT8KKy5FZAorLlBwCitTZWUgdGhlCisuQ20gVmVyaWZ5SG9zdEtleUROUworb3B0aW9uIGluCisuWHIgc3NoX2NvbmZpZyA1Citmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKy5TaCBTU0gtQkFTRUQgVklSVFVBTCBQUklWQVRFIE5FVFdPUktTCisuTm0KK2NvbnRhaW5zIHN1cHBvcnQgZm9yIFZpcnR1YWwgUHJpdmF0ZSBOZXR3b3JrIChWUE4pIHR1bm5lbGxpbmcKK3VzaW5nIHRoZQorLlhyIHR1biA0CituZXR3b3JrIHBzZXVkby1kZXZpY2UsCithbGxvd2luZyB0d28gbmV0d29ya3MgdG8gYmUgam9pbmVkIHNlY3VyZWx5LgorVGhlCisuWHIgc3NoZF9jb25maWcgNQorY29uZmlndXJhdGlvbiBvcHRpb24KKy5DbSBQZXJtaXRUdW5uZWwKK2NvbnRyb2xzIHdoZXRoZXIgdGhlIHNlcnZlciBzdXBwb3J0cyB0aGlzLAorYW5kIGF0IHdoYXQgbGV2ZWwgKGxheWVyIDIgb3IgMyB0cmFmZmljKS4KKy5QcAorVGhlIGZvbGxvd2luZyBleGFtcGxlIHdvdWxkIGNvbm5lY3QgY2xpZW50IG5ldHdvcmsgMTAuMC41MC4wLzI0Cit3aXRoIHJlbW90ZSBuZXR3b3JrIDEwLjAuOTkuMC8yNCB1c2luZyBhIHBvaW50LXRvLXBvaW50IGNvbm5lY3Rpb24KK2Zyb20gMTAuMS4xLjEgdG8gMTAuMS4xLjIsCitwcm92aWRlZCB0aGF0IHRoZSBTU0ggc2VydmVyIHJ1bm5pbmcgb24gdGhlIGdhdGV3YXkgdG8gdGhlIHJlbW90ZSBuZXR3b3JrLAorYXQgMTkyLjE2OC4xLjE1LCBhbGxvd3MgaXQuCisuUHAKK09uIHRoZSBjbGllbnQ6CisuQmQgLWxpdGVyYWwgLW9mZnNldCBpbmRlbnQKKyMgc3NoIC1mIC13IDA6MSAxOTIuMTY4LjEuMTUgdHJ1ZQorIyBpZmNvbmZpZyB0dW4wIDEwLjEuMS4xIDEwLjEuMS4yIG5ldG1hc2sgMjU1LjI1NS4yNTUuMjUyCisjIHJvdXRlIGFkZCAxMC4wLjk5LjAvMjQgMTAuMS4xLjIKKy5FZAorLlBwCitPbiB0aGUgc2VydmVyOgorLkJkIC1saXRlcmFsIC1vZmZzZXQgaW5kZW50CisjIGlmY29uZmlnIHR1bjEgMTAuMS4xLjIgMTAuMS4xLjEgbmV0bWFzayAyNTUuMjU1LjI1NS4yNTIKKyMgcm91dGUgYWRkIDEwLjAuNTAuMC8yNCAxMC4xLjEuMQorLkVkCisuUHAKK0NsaWVudCBhY2Nlc3MgbWF5IGJlIG1vcmUgZmluZWx5IHR1bmVkIHZpYSB0aGUKKy5QYSAvcm9vdC8uc3NoL2F1dGhvcml6ZWRfa2V5cworZmlsZSAoc2VlIGJlbG93KSBhbmQgdGhlCisuQ20gUGVybWl0Um9vdExvZ2luCitzZXJ2ZXIgb3B0aW9uLgorVGhlIGZvbGxvd2luZyBlbnRyeSB3b3VsZCBwZXJtaXQgY29ubmVjdGlvbnMgb24KKy5YciB0dW4gNAorZGV2aWNlIDEgZnJvbSB1c2VyCisuRHEgamFuZQorYW5kIG9uIHR1biBkZXZpY2UgMiBmcm9tIHVzZXIKKy5EcSBqb2huICwKK2lmCisuQ20gUGVybWl0Um9vdExvZ2luCitpcyBzZXQgdG8KKy5EcSBmb3JjZWQtY29tbWFuZHMtb25seSA6CisuQmQgLWxpdGVyYWwgLW9mZnNldCAybgordHVubmVsPSIxIixjb21tYW5kPSJzaCAvZXRjL25ldHN0YXJ0IHR1bjEiIHNzaC1yc2EgLi4uIGphbmUKK3R1bm5lbD0iMiIsY29tbWFuZD0ic2ggL2V0Yy9uZXRzdGFydCB0dW4yIiBzc2gtcnNhIC4uLiBqb2huCisuRWQKKy5QcAorU2luY2UgYW4gU1NILWJhc2VkIHNldHVwIGVudGFpbHMgYSBmYWlyIGFtb3VudCBvZiBvdmVyaGVhZCwKK2l0IG1heSBiZSBtb3JlIHN1aXRlZCB0byB0ZW1wb3Jhcnkgc2V0dXBzLAorc3VjaCBhcyBmb3Igd2lyZWxlc3MgVlBOcy4KK01vcmUgcGVybWFuZW50IFZQTnMgYXJlIGJldHRlciBwcm92aWRlZCBieSB0b29scyBzdWNoIGFzCisuWHIgaXBzZWNjdGwgOAorYW5kCisuWHIgaXNha21wZCA4IC4KKy5TaCBFTlZJUk9OTUVOVAorLk5tCit3aWxsIG5vcm1hbGx5IHNldCB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlczoKKy5CbCAtdGFnIC13aWR0aCAiU1NIX09SSUdJTkFMX0NPTU1BTkQiCisuSXQgRXYgRElTUExBWQorVGhlCisuRXYgRElTUExBWQordmFyaWFibGUgaW5kaWNhdGVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgWDExIHNlcnZlci4KK0l0IGlzIGF1dG9tYXRpY2FsbHkgc2V0IGJ5CisuTm0KK3RvIHBvaW50IHRvIGEgdmFsdWUgb2YgdGhlIGZvcm0KKy5EcSBob3N0bmFtZTpuICwKK3doZXJlCisuRHEgaG9zdG5hbWUKK2luZGljYXRlcyB0aGUgaG9zdCB3aGVyZSB0aGUgc2hlbGwgcnVucywgYW5kCisuU3EgbgoraXMgYW4gaW50ZWdlciBcKihHZSAxLgorLk5tCit1c2VzIHRoaXMgc3BlY2lhbCB2YWx1ZSB0byBmb3J3YXJkIFgxMSBjb25uZWN0aW9ucyBvdmVyIHRoZSBzZWN1cmUKK2NoYW5uZWwuCitUaGUgdXNlciBzaG91bGQgbm9ybWFsbHkgbm90IHNldAorLkV2IERJU1BMQVkKK2V4cGxpY2l0bHksIGFzIHRoYXQKK3dpbGwgcmVuZGVyIHRoZSBYMTEgY29ubmVjdGlvbiBpbnNlY3VyZSAoYW5kIHdpbGwgcmVxdWlyZSB0aGUgdXNlciB0bworbWFudWFsbHkgY29weSBhbnkgcmVxdWlyZWQgYXV0aG9yaXphdGlvbiBjb29raWVzKS4KKy5JdCBFdiBIT01FCitTZXQgdG8gdGhlIHBhdGggb2YgdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeS4KKy5JdCBFdiBMT0dOQU1FCitTeW5vbnltIGZvcgorLkV2IFVTRVIgOworc2V0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggc3lzdGVtcyB0aGF0IHVzZSB0aGlzIHZhcmlhYmxlLgorLkl0IEV2IE1BSUwKK1NldCB0byB0aGUgcGF0aCBvZiB0aGUgdXNlcidzIG1haWxib3guCisuSXQgRXYgUEFUSAorU2V0IHRvIHRoZSBkZWZhdWx0CisuRXYgUEFUSCAsCithcyBzcGVjaWZpZWQgd2hlbiBjb21waWxpbmcKKy5ObSAuCisuSXQgRXYgU1NIX0FTS1BBU1MKK0lmCisuTm0KK25lZWRzIGEgcGFzc3BocmFzZSwgaXQgd2lsbCByZWFkIHRoZSBwYXNzcGhyYXNlIGZyb20gdGhlIGN1cnJlbnQKK3Rlcm1pbmFsIGlmIGl0IHdhcyBydW4gZnJvbSBhIHRlcm1pbmFsLgorSWYKKy5ObQorZG9lcyBub3QgaGF2ZSBhIHRlcm1pbmFsIGFzc29jaWF0ZWQgd2l0aCBpdCBidXQKKy5FdiBESVNQTEFZCithbmQKKy5FdiBTU0hfQVNLUEFTUworYXJlIHNldCwgaXQgd2lsbCBleGVjdXRlIHRoZSBwcm9ncmFtIHNwZWNpZmllZCBieQorLkV2IFNTSF9BU0tQQVNTCithbmQgb3BlbiBhbiBYMTEgd2luZG93IHRvIHJlYWQgdGhlIHBhc3NwaHJhc2UuCitUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbiBjYWxsaW5nCisuTm0KK2Zyb20gYQorLlBhIC54c2Vzc2lvbgorb3IgcmVsYXRlZCBzY3JpcHQuCisoTm90ZSB0aGF0IG9uIHNvbWUgbWFjaGluZXMgaXQKK21heSBiZSBuZWNlc3NhcnkgdG8gcmVkaXJlY3QgdGhlIGlucHV0IGZyb20KKy5QYSAvZGV2L251bGwKK3RvIG1ha2UgdGhpcyB3b3JrLikKKy5JdCBFdiBTU0hfQVVUSF9TT0NLCitJZGVudGlmaWVzIHRoZSBwYXRoIG9mIGEKKy5VeCBOcyAtZG9tYWluCitzb2NrZXQgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBhZ2VudC4KKy5JdCBFdiBTU0hfQ09OTkVDVElPTgorSWRlbnRpZmllcyB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgZW5kcyBvZiB0aGUgY29ubmVjdGlvbi4KK1RoZSB2YXJpYWJsZSBjb250YWlucworZm91ciBzcGFjZS1zZXBhcmF0ZWQgdmFsdWVzOiBjbGllbnQgSVAgYWRkcmVzcywgY2xpZW50IHBvcnQgbnVtYmVyLAorc2VydmVyIElQIGFkZHJlc3MsIGFuZCBzZXJ2ZXIgcG9ydCBudW1iZXIuCisuSXQgRXYgU1NIX09SSUdJTkFMX0NPTU1BTkQKK1RoaXMgdmFyaWFibGUgY29udGFpbnMgdGhlIG9yaWdpbmFsIGNvbW1hbmQgbGluZSBpZiBhIGZvcmNlZCBjb21tYW5kCitpcyBleGVjdXRlZC4KK0l0IGNhbiBiZSB1c2VkIHRvIGV4dHJhY3QgdGhlIG9yaWdpbmFsIGFyZ3VtZW50cy4KKy5JdCBFdiBTU0hfVFRZCitUaGlzIGlzIHNldCB0byB0aGUgbmFtZSBvZiB0aGUgdHR5IChwYXRoIHRvIHRoZSBkZXZpY2UpIGFzc29jaWF0ZWQKK3dpdGggdGhlIGN1cnJlbnQgc2hlbGwgb3IgY29tbWFuZC4KK0lmIHRoZSBjdXJyZW50IHNlc3Npb24gaGFzIG5vIHR0eSwKK3RoaXMgdmFyaWFibGUgaXMgbm90IHNldC4KKy5JdCBFdiBUWgorVGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gaW5kaWNhdGUgdGhlIHByZXNlbnQgdGltZSB6b25lIGlmIGl0Cit3YXMgc2V0IHdoZW4gdGhlIGRhZW1vbiB3YXMgc3RhcnRlZCAoaS5lLiB0aGUgZGFlbW9uIHBhc3NlcyB0aGUgdmFsdWUKK29uIHRvIG5ldyBjb25uZWN0aW9ucykuCisuSXQgRXYgVVNFUgorU2V0IHRvIHRoZSBuYW1lIG9mIHRoZSB1c2VyIGxvZ2dpbmcgaW4uCisuRWwKKy5QcAorQWRkaXRpb25hbGx5LAorLk5tCityZWFkcworLlBhIH4vLnNzaC9lbnZpcm9ubWVudCAsCithbmQgYWRkcyBsaW5lcyBvZiB0aGUgZm9ybWF0CisuRHEgVkFSTkFNRT12YWx1ZQordG8gdGhlIGVudmlyb25tZW50IGlmIHRoZSBmaWxlIGV4aXN0cyBhbmQgdXNlcnMgYXJlIGFsbG93ZWQgdG8KK2NoYW5nZSB0aGVpciBlbnZpcm9ubWVudC4KK0ZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlCisuQ20gUGVybWl0VXNlckVudmlyb25tZW50CitvcHRpb24gaW4KKy5YciBzc2hkX2NvbmZpZyA1IC4KKy5TaCBGSUxFUworLkJsIC10YWcgLXdpZHRoIERzIC1jb21wYWN0CisuSXQgUGEgfi8ucmhvc3RzCitUaGlzIGZpbGUgaXMgdXNlZCBmb3IgaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbiAoc2VlIGFib3ZlKS4KK09uIHNvbWUgbWFjaGluZXMgdGhpcyBmaWxlIG1heSBuZWVkIHRvIGJlCit3b3JsZC1yZWFkYWJsZSBpZiB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5IGlzIG9uIGFuIE5GUyBwYXJ0aXRpb24sCitiZWNhdXNlCisuWHIgc3NoZCA4CityZWFkcyBpdCBhcyByb290LgorQWRkaXRpb25hbGx5LCB0aGlzIGZpbGUgbXVzdCBiZSBvd25lZCBieSB0aGUgdXNlciwKK2FuZCBtdXN0IG5vdCBoYXZlIHdyaXRlIHBlcm1pc3Npb25zIGZvciBhbnlvbmUgZWxzZS4KK1RoZSByZWNvbW1lbmRlZAorcGVybWlzc2lvbiBmb3IgbW9zdCBtYWNoaW5lcyBpcyByZWFkL3dyaXRlIGZvciB0aGUgdXNlciwgYW5kIG5vdAorYWNjZXNzaWJsZSBieSBvdGhlcnMuCisuUHAKKy5JdCBQYSB+Ly5zaG9zdHMKK1RoaXMgZmlsZSBpcyB1c2VkIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5IGFzCisuUGEgLnJob3N0cyAsCitidXQgYWxsb3dzIGhvc3QtYmFzZWQgYXV0aGVudGljYXRpb24gd2l0aG91dCBwZXJtaXR0aW5nIGxvZ2luIHdpdGgKK3Jsb2dpbi9yc2guCisuUHAKKy5JdCBQYSB+Ly5zc2gvCitUaGlzIGRpcmVjdG9yeSBpcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBmb3IgYWxsIHVzZXItc3BlY2lmaWMgY29uZmlndXJhdGlvbgorYW5kIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uLgorVGhlcmUgaXMgbm8gZ2VuZXJhbCByZXF1aXJlbWVudCB0byBrZWVwIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhpcyBkaXJlY3RvcnkKK3NlY3JldCwgYnV0IHRoZSByZWNvbW1lbmRlZCBwZXJtaXNzaW9ucyBhcmUgcmVhZC93cml0ZS9leGVjdXRlIGZvciB0aGUgdXNlciwKK2FuZCBub3QgYWNjZXNzaWJsZSBieSBvdGhlcnMuCisuUHAKKy5JdCBQYSB+Ly5zc2gvYXV0aG9yaXplZF9rZXlzCitMaXN0cyB0aGUgcHVibGljIGtleXMgKERTQS9FQ0RTQS9SU0EpIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGxvZ2dpbmcgaW4gYXMKK3RoaXMgdXNlci4KK1RoZSBmb3JtYXQgb2YgdGhpcyBmaWxlIGlzIGRlc2NyaWJlZCBpbiB0aGUKKy5YciBzc2hkIDgKK21hbnVhbCBwYWdlLgorVGhpcyBmaWxlIGlzIG5vdCBoaWdobHkgc2Vuc2l0aXZlLCBidXQgdGhlIHJlY29tbWVuZGVkCitwZXJtaXNzaW9ucyBhcmUgcmVhZC93cml0ZSBmb3IgdGhlIHVzZXIsIGFuZCBub3QgYWNjZXNzaWJsZSBieSBvdGhlcnMuCisuUHAKKy5JdCBQYSB+Ly5zc2gvY29uZmlnCitUaGlzIGlzIHRoZSBwZXItdXNlciBjb25maWd1cmF0aW9uIGZpbGUuCitUaGUgZmlsZSBmb3JtYXQgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgZGVzY3JpYmVkIGluCisuWHIgc3NoX2NvbmZpZyA1IC4KK0JlY2F1c2Ugb2YgdGhlIHBvdGVudGlhbCBmb3IgYWJ1c2UsIHRoaXMgZmlsZSBtdXN0IGhhdmUgc3RyaWN0IHBlcm1pc3Npb25zOgorcmVhZC93cml0ZSBmb3IgdGhlIHVzZXIsIGFuZCBub3QgYWNjZXNzaWJsZSBieSBvdGhlcnMuCisuUHAKKy5JdCBQYSB+Ly5zc2gvZW52aXJvbm1lbnQKK0NvbnRhaW5zIGFkZGl0aW9uYWwgZGVmaW5pdGlvbnMgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlczsgc2VlCisuU3ggRU5WSVJPTk1FTlQgLAorYWJvdmUuCisuUHAKKy5JdCBQYSB+Ly5zc2gvaWRlbnRpdHkKKy5JdCBQYSB+Ly5zc2gvaWRfZHNhCisuSXQgUGEgfi8uc3NoL2lkX2VjZHNhCisuSXQgUGEgfi8uc3NoL2lkX3JzYQorQ29udGFpbnMgdGhlIHByaXZhdGUga2V5IGZvciBhdXRoZW50aWNhdGlvbi4KK1RoZXNlIGZpbGVzCitjb250YWluIHNlbnNpdGl2ZSBkYXRhIGFuZCBzaG91bGQgYmUgcmVhZGFibGUgYnkgdGhlIHVzZXIgYnV0IG5vdAorYWNjZXNzaWJsZSBieSBvdGhlcnMgKHJlYWQvd3JpdGUvZXhlY3V0ZSkuCisuTm0KK3dpbGwgc2ltcGx5IGlnbm9yZSBhIHByaXZhdGUga2V5IGZpbGUgaWYgaXQgaXMgYWNjZXNzaWJsZSBieSBvdGhlcnMuCitJdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5IGEgcGFzc3BocmFzZSB3aGVuCitnZW5lcmF0aW5nIHRoZSBrZXkgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGVuY3J5cHQgdGhlCitzZW5zaXRpdmUgcGFydCBvZiB0aGlzIGZpbGUgdXNpbmcgM0RFUy4KKy5QcAorLkl0IFBhIH4vLnNzaC9pZGVudGl0eS5wdWIKKy5JdCBQYSB+Ly5zc2gvaWRfZHNhLnB1YgorLkl0IFBhIH4vLnNzaC9pZF9lY2RzYS5wdWIKKy5JdCBQYSB+Ly5zc2gvaWRfcnNhLnB1YgorQ29udGFpbnMgdGhlIHB1YmxpYyBrZXkgZm9yIGF1dGhlbnRpY2F0aW9uLgorVGhlc2UgZmlsZXMgYXJlIG5vdAorc2Vuc2l0aXZlIGFuZCBjYW4gKGJ1dCBuZWVkIG5vdCkgYmUgcmVhZGFibGUgYnkgYW55b25lLgorLlBwCisuSXQgUGEgfi8uc3NoL2tub3duX2hvc3RzCitDb250YWlucyBhIGxpc3Qgb2YgaG9zdCBrZXlzIGZvciBhbGwgaG9zdHMgdGhlIHVzZXIgaGFzIGxvZ2dlZCBpbnRvCit0aGF0IGFyZSBub3QgYWxyZWFkeSBpbiB0aGUgc3lzdGVtd2lkZSBsaXN0IG9mIGtub3duIGhvc3Qga2V5cy4KK1NlZQorLlhyIHNzaGQgOAorZm9yIGZ1cnRoZXIgZGV0YWlscyBvZiB0aGUgZm9ybWF0IG9mIHRoaXMgZmlsZS4KKy5QcAorLkl0IFBhIH4vLnNzaC9yYworQ29tbWFuZHMgaW4gdGhpcyBmaWxlIGFyZSBleGVjdXRlZCBieQorLk5tCit3aGVuIHRoZSB1c2VyIGxvZ3MgaW4sIGp1c3QgYmVmb3JlIHRoZSB1c2VyJ3Mgc2hlbGwgKG9yIGNvbW1hbmQpIGlzCitzdGFydGVkLgorU2VlIHRoZQorLlhyIHNzaGQgOAorbWFudWFsIHBhZ2UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisuUHAKKy5JdCBQYSAvZXRjL2hvc3RzLmVxdWl2CitUaGlzIGZpbGUgaXMgZm9yIGhvc3QtYmFzZWQgYXV0aGVudGljYXRpb24gKHNlZSBhYm92ZSkuCitJdCBzaG91bGQgb25seSBiZSB3cml0YWJsZSBieSByb290LgorLlBwCisuSXQgUGEgL2V0Yy9zaG9zdHMuZXF1aXYKK1RoaXMgZmlsZSBpcyB1c2VkIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5IGFzCisuUGEgaG9zdHMuZXF1aXYgLAorYnV0IGFsbG93cyBob3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uIHdpdGhvdXQgcGVybWl0dGluZyBsb2dpbiB3aXRoCitybG9naW4vcnNoLgorLlBwCisuSXQgUGEgL2V0Yy9zc2gvc3NoX2NvbmZpZworU3lzdGVtd2lkZSBjb25maWd1cmF0aW9uIGZpbGUuCitUaGUgZmlsZSBmb3JtYXQgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgZGVzY3JpYmVkIGluCisuWHIgc3NoX2NvbmZpZyA1IC4KKy5QcAorLkl0IFBhIC9ldGMvc3NoL3NzaF9ob3N0X2tleQorLkl0IFBhIC9ldGMvc3NoL3NzaF9ob3N0X2RzYV9rZXkKKy5JdCBQYSAvZXRjL3NzaC9zc2hfaG9zdF9lY2RzYV9rZXkKKy5JdCBQYSAvZXRjL3NzaC9zc2hfaG9zdF9yc2Ffa2V5CitUaGVzZSB0aHJlZSBmaWxlcyBjb250YWluIHRoZSBwcml2YXRlIHBhcnRzIG9mIHRoZSBob3N0IGtleXMKK2FuZCBhcmUgdXNlZCBmb3IgaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbi4KK0lmIHByb3RvY29sIHZlcnNpb24gMSBpcyB1c2VkLAorLk5tCittdXN0IGJlIHNldHVpZCByb290LCBzaW5jZSB0aGUgaG9zdCBrZXkgaXMgcmVhZGFibGUgb25seSBieSByb290LgorRm9yIHByb3RvY29sIHZlcnNpb24gMiwKKy5ObQordXNlcworLlhyIHNzaC1rZXlzaWduIDgKK3RvIGFjY2VzcyB0aGUgaG9zdCBrZXlzLAorZWxpbWluYXRpbmcgdGhlIHJlcXVpcmVtZW50IHRoYXQKKy5ObQorYmUgc2V0dWlkIHJvb3Qgd2hlbiBob3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uIGlzIHVzZWQuCitCeSBkZWZhdWx0CisuTm0KK2lzIG5vdCBzZXR1aWQgcm9vdC4KKy5QcAorLkl0IFBhIC9ldGMvc3NoL3NzaF9rbm93bl9ob3N0cworU3lzdGVtd2lkZSBsaXN0IG9mIGtub3duIGhvc3Qga2V5cy4KK1RoaXMgZmlsZSBzaG91bGQgYmUgcHJlcGFyZWQgYnkgdGhlCitzeXN0ZW0gYWRtaW5pc3RyYXRvciB0byBjb250YWluIHRoZSBwdWJsaWMgaG9zdCBrZXlzIG9mIGFsbCBtYWNoaW5lcyBpbiB0aGUKK29yZ2FuaXphdGlvbi4KK0l0IHNob3VsZCBiZSB3b3JsZC1yZWFkYWJsZS4KK1NlZQorLlhyIHNzaGQgOAorZm9yIGZ1cnRoZXIgZGV0YWlscyBvZiB0aGUgZm9ybWF0IG9mIHRoaXMgZmlsZS4KKy5QcAorLkl0IFBhIC9ldGMvc3NoL3NzaHJjCitDb21tYW5kcyBpbiB0aGlzIGZpbGUgYXJlIGV4ZWN1dGVkIGJ5CisuTm0KK3doZW4gdGhlIHVzZXIgbG9ncyBpbiwganVzdCBiZWZvcmUgdGhlIHVzZXIncyBzaGVsbCAob3IgY29tbWFuZCkgaXMgc3RhcnRlZC4KK1NlZSB0aGUKKy5YciBzc2hkIDgKK21hbnVhbCBwYWdlIGZvciBtb3JlIGluZm9ybWF0aW9uLgorLkVsCisuU2ggRVhJVCBTVEFUVVMKKy5ObQorZXhpdHMgd2l0aCB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIHJlbW90ZSBjb21tYW5kIG9yIHdpdGggMjU1CitpZiBhbiBlcnJvciBvY2N1cnJlZC4KKy5TaCBTRUUgQUxTTworLlhyIHNjcCAxICwKKy5YciBzZnRwIDEgLAorLlhyIHNzaC1hZGQgMSAsCisuWHIgc3NoLWFnZW50IDEgLAorLlhyIHNzaC1rZXlnZW4gMSAsCisuWHIgc3NoLWtleXNjYW4gMSAsCisuWHIgdHVuIDQgLAorLlhyIGhvc3RzLmVxdWl2IDUgLAorLlhyIHNzaF9jb25maWcgNSAsCisuWHIgc3NoLWtleXNpZ24gOCAsCisuWHIgc3NoZCA4CisuUnMKKy4lUiBSRkMgNDI1MAorLiVUICJUaGUgU2VjdXJlIFNoZWxsIChTU0gpIFByb3RvY29sIEFzc2lnbmVkIE51bWJlcnMiCisuJUQgMjAwNgorLlJlCisuUnMKKy4lUiBSRkMgNDI1MQorLiVUICJUaGUgU2VjdXJlIFNoZWxsIChTU0gpIFByb3RvY29sIEFyY2hpdGVjdHVyZSIKKy4lRCAyMDA2CisuUmUKKy5ScworLiVSIFJGQyA0MjUyCisuJVQgIlRoZSBTZWN1cmUgU2hlbGwgKFNTSCkgQXV0aGVudGljYXRpb24gUHJvdG9jb2wiCisuJUQgMjAwNgorLlJlCisuUnMKKy4lUiBSRkMgNDI1MworLiVUICJUaGUgU2VjdXJlIFNoZWxsIChTU0gpIFRyYW5zcG9ydCBMYXllciBQcm90b2NvbCIKKy4lRCAyMDA2CisuUmUKKy5ScworLiVSIFJGQyA0MjU0CisuJVQgIlRoZSBTZWN1cmUgU2hlbGwgKFNTSCkgQ29ubmVjdGlvbiBQcm90b2NvbCIKKy4lRCAyMDA2CisuUmUKKy5ScworLiVSIFJGQyA0MjU1CisuJVQgIlVzaW5nIEROUyB0byBTZWN1cmVseSBQdWJsaXNoIFNlY3VyZSBTaGVsbCAoU1NIKSBLZXkgRmluZ2VycHJpbnRzIgorLiVEIDIwMDYKKy5SZQorLlJzCisuJVIgUkZDIDQyNTYKKy4lVCAiR2VuZXJpYyBNZXNzYWdlIEV4Y2hhbmdlIEF1dGhlbnRpY2F0aW9uIGZvciB0aGUgU2VjdXJlIFNoZWxsIFByb3RvY29sIChTU0gpIgorLiVEIDIwMDYKKy5SZQorLlJzCisuJVIgUkZDIDQzMzUKKy4lVCAiVGhlIFNlY3VyZSBTaGVsbCAoU1NIKSBTZXNzaW9uIENoYW5uZWwgQnJlYWsgRXh0ZW5zaW9uIgorLiVEIDIwMDYKKy5SZQorLlJzCisuJVIgUkZDIDQzNDQKKy4lVCAiVGhlIFNlY3VyZSBTaGVsbCAoU1NIKSBUcmFuc3BvcnQgTGF5ZXIgRW5jcnlwdGlvbiBNb2RlcyIKKy4lRCAyMDA2CisuUmUKKy5ScworLiVSIFJGQyA0MzQ1CisuJVQgIkltcHJvdmVkIEFyY2ZvdXIgTW9kZXMgZm9yIHRoZSBTZWN1cmUgU2hlbGwgKFNTSCkgVHJhbnNwb3J0IExheWVyIFByb3RvY29sIgorLiVEIDIwMDYKKy5SZQorLlJzCisuJVIgUkZDIDQ0MTkKKy4lVCAiRGlmZmllLUhlbGxtYW4gR3JvdXAgRXhjaGFuZ2UgZm9yIHRoZSBTZWN1cmUgU2hlbGwgKFNTSCkgVHJhbnNwb3J0IExheWVyIFByb3RvY29sIgorLiVEIDIwMDYKKy5SZQorLlJzCisuJVIgUkZDIDQ3MTYKKy4lVCAiVGhlIFNlY3VyZSBTaGVsbCAoU1NIKSBQdWJsaWMgS2V5IEZpbGUgRm9ybWF0IgorLiVEIDIwMDYKKy5SZQorLlJzCisuJVIgUkZDIDU2NTYKKy4lVCAiRWxsaXB0aWMgQ3VydmUgQWxnb3JpdGhtIEludGVncmF0aW9uIGluIHRoZSBTZWN1cmUgU2hlbGwgVHJhbnNwb3J0IExheWVyIgorLiVEIDIwMDkKKy5SZQorLlJzCisuJVQgIkhhc2ggVmlzdWFsaXphdGlvbjogYSBOZXcgVGVjaG5pcXVlIHRvIGltcHJvdmUgUmVhbC1Xb3JsZCBTZWN1cml0eSIKKy4lQSBBLiBQZXJyaWcKKy4lQSBELiBTb25nCisuJUQgMTk5OQorLiVPICJJbnRlcm5hdGlvbmFsIFdvcmtzaG9wIG9uIENyeXB0b2dyYXBoaWMgVGVjaG5pcXVlcyBhbmQgRS1Db21tZXJjZSAoQ3J5cFRFQyAnOTkpIgorLlJlCisuU2ggQVVUSE9SUworT3BlblNTSCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGFuZCBmcmVlCitzc2ggMS4yLjEyIHJlbGVhc2UgYnkgVGF0dSBZbG9uZW4uCitBYXJvbiBDYW1wYmVsbCwgQm9iIEJlY2ssIE1hcmt1cyBGcmllZGwsIE5pZWxzIFByb3ZvcywKK1RoZW8gZGUgUmFhZHQgYW5kIER1ZyBTb25nCityZW1vdmVkIG1hbnkgYnVncywgcmUtYWRkZWQgbmV3ZXIgZmVhdHVyZXMgYW5kCitjcmVhdGVkIE9wZW5TU0guCitNYXJrdXMgRnJpZWRsIGNvbnRyaWJ1dGVkIHRoZSBzdXBwb3J0IGZvciBTU0gKK3Byb3RvY29sIHZlcnNpb25zIDEuNSBhbmQgMi4wLgpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zc2guYyBiL29wZW5zc2gtNi4wcDEvc3NoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlMTMxNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc3NoLmMKQEAgLTAsMCArMSwxNjA0IEBACisvKiAkT3BlbkJTRDogc3NoLmMsdiAxLjM2OCAyMDExLzEwLzI0IDAyOjEwOjQ2IGRqbSBFeHAgJCAqLworLyoKKyAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAorICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIFNzaCBjbGllbnQgcHJvZ3JhbS4gIFRoaXMgcHJvZ3JhbSBjYW4gYmUgdXNlZCB0byBsb2cgaW50byBhIHJlbW90ZSBtYWNoaW5lLgorICogVGhlIHNvZnR3YXJlIHN1cHBvcnRzIHN0cm9uZyBhdXRoZW50aWNhdGlvbiwgZW5jcnlwdGlvbiwgYW5kIGZvcndhcmRpbmcKKyAqIG9mIFgxMSwgVENQL0lQLCBhbmQgYXV0aGVudGljYXRpb24gY29ubmVjdGlvbnMuCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgTmllbHMgUHJvdm9zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMyBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBNb2RpZmllZCB0byB3b3JrIHdpdGggU1NMIGJ5IE5pZWxzIFByb3ZvcyA8cHJvdm9zQGNpdGkudW1pY2guZWR1PgorICogaW4gQ2FuYWRhIChHZXJtYW4gY2l0aXplbikuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaWZkZWYgSEFWRV9QQVRIU19ICisjaW5jbHVkZSA8cGF0aHMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQuaCIKKyNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9zeXMtcXVldWUuaCIKKworI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJzc2guaCIKKyNpbmNsdWRlICJzc2gxLmgiCisjaW5jbHVkZSAic3NoMi5oIgorI2luY2x1ZGUgImNhbm9ob3N0LmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisjaW5jbHVkZSAiY2lwaGVyLmgiCisjaW5jbHVkZSAicGFja2V0LmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAiY2hhbm5lbHMuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJhdXRoZmQuaCIKKyNpbmNsdWRlICJhdXRoZmlsZS5oIgorI2luY2x1ZGUgInBhdGhuYW1lcy5oIgorI2luY2x1ZGUgImRpc3BhdGNoLmgiCisjaW5jbHVkZSAiY2xpZW50bG9vcC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInJlYWRjb25mLmgiCisjaW5jbHVkZSAic3NoY29ubmVjdC5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJrZXguaCIKKyNpbmNsdWRlICJtYWMuaCIKKyNpbmNsdWRlICJzc2hwdHkuaCIKKyNpbmNsdWRlICJtYXRjaC5oIgorI2luY2x1ZGUgIm1zZy5oIgorI2luY2x1ZGUgInVpZHN3YXAuaCIKKyNpbmNsdWRlICJyb2FtaW5nLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisjaWZkZWYgRU5BQkxFX1BLQ1MxMQorI2luY2x1ZGUgInNzaC1wa2NzMTEuaCIKKyNlbmRpZgorCitleHRlcm4gY2hhciAqX19wcm9nbmFtZTsKKworLyogU2F2ZXMgYSBjb3B5IG9mIGFyZ3YgZm9yIHNldHByb2N0aXRsZSBlbXVsYXRpb24gKi8KKyNpZm5kZWYgSEFWRV9TRVRQUk9DVElUTEUKK3N0YXRpYyBjaGFyICoqc2F2ZWRfYXY7CisjZW5kaWYKKworLyogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgZGVidWcgbW9kZSBpcyBvbi4gIE1heSBiZSBzZXQgb24gdGhlIGNvbW1hbmQgbGluZS4gKi8KK2ludCBkZWJ1Z19mbGFnID0gMDsKKworLyogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgYSB0dHkgc2hvdWxkIGJlIHJlcXVlc3RlZCAqLworaW50IHR0eV9mbGFnID0gMDsKKworLyogZG9uJ3QgZXhlYyBhIHNoZWxsICovCitpbnQgbm9fc2hlbGxfZmxhZyA9IDA7CisKKy8qCisgKiBGbGFnIGluZGljYXRpbmcgdGhhdCBub3RoaW5nIHNob3VsZCBiZSByZWFkIGZyb20gc3RkaW4uICBUaGlzIGNhbiBiZSBzZXQKKyAqIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgKi8KK2ludCBzdGRpbl9udWxsX2ZsYWcgPSAwOworCisvKgorICogRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIGN1cnJlbnQgcHJvY2VzcyBzaG91bGQgYmUgYmFja2dyb3VuZGVkIGFuZAorICogYSBuZXcgc2xhdmUgbGF1bmNoZWQgaW4gdGhlIGZvcmVncm91bmQgZm9yIENvbnRyb2xQZXJzaXN0LgorICovCitpbnQgbmVlZF9jb250cm9scGVyc2lzdF9kZXRhY2ggPSAwOworCisvKiBDb3BpZXMgb2YgZmxhZ3MgZm9yIENvbnRyb2xQZXJzaXN0IGZvcmVncm91bmQgc2xhdmUgKi8KK2ludCBvc3RkaW5fbnVsbF9mbGFnLCBvbm9fc2hlbGxfZmxhZywgb3R0eV9mbGFnLCBvcmVxdWVzdF90dHk7CisKKy8qCisgKiBGbGFnIGluZGljYXRpbmcgdGhhdCBzc2ggc2hvdWxkIGZvcmsgYWZ0ZXIgYXV0aGVudGljYXRpb24uICBUaGlzIGlzIHVzZWZ1bAorICogc28gdGhhdCB0aGUgcGFzc3BocmFzZSBjYW4gYmUgZW50ZXJlZCBtYW51YWxseSwgYW5kIHRoZW4gc3NoIGdvZXMgdG8gdGhlCisgKiBiYWNrZ3JvdW5kLgorICovCitpbnQgZm9ya19hZnRlcl9hdXRoZW50aWNhdGlvbl9mbGFnID0gMDsKKworLyogZm9yd2FyZCBzdGRpbyB0byByZW1vdGUgaG9zdCBhbmQgcG9ydCAqLworY2hhciAqc3RkaW9fZm9yd2FyZF9ob3N0ID0gTlVMTDsKK2ludCBzdGRpb19mb3J3YXJkX3BvcnQgPSAwOworCisvKgorICogR2VuZXJhbCBkYXRhIHN0cnVjdHVyZSBmb3IgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIG9wdGlvbnMgY29uZmlndXJhYmxlCisgKiBpbiBjb25maWd1cmF0aW9uIGZpbGVzLiAgU2VlIHJlYWRjb25mLmguCisgKi8KK09wdGlvbnMgb3B0aW9uczsKKworLyogb3B0aW9uYWwgdXNlciBjb25maWdmaWxlICovCitjaGFyICpjb25maWcgPSBOVUxMOworCisvKgorICogTmFtZSBvZiB0aGUgaG9zdCB3ZSBhcmUgY29ubmVjdGluZyB0by4gIFRoaXMgaXMgdGhlIG5hbWUgZ2l2ZW4gb24gdGhlCisgKiBjb21tYW5kIGxpbmUsIG9yIHRoZSBIb3N0TmFtZSBzcGVjaWZpZWQgZm9yIHRoZSB1c2VyLXN1cHBsaWVkIG5hbWUgaW4gYQorICogY29uZmlndXJhdGlvbiBmaWxlLgorICovCitjaGFyICpob3N0OworCisvKiBzb2NrZXQgYWRkcmVzcyB0aGUgaG9zdCByZXNvbHZlcyB0byAqLworc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgaG9zdGFkZHI7CisKKy8qIFByaXZhdGUgaG9zdCBrZXlzLiAqLworU2Vuc2l0aXZlIHNlbnNpdGl2ZV9kYXRhOworCisvKiBPcmlnaW5hbCByZWFsIFVJRC4gKi8KK3VpZF90IG9yaWdpbmFsX3JlYWxfdWlkOwordWlkX3Qgb3JpZ2luYWxfZWZmZWN0aXZlX3VpZDsKKworLyogY29tbWFuZCB0byBiZSBleGVjdXRlZCAqLworQnVmZmVyIGNvbW1hbmQ7CisKKy8qIFNob3VsZCB3ZSBleGVjdXRlIGEgY29tbWFuZCBvciBpbnZva2UgYSBzdWJzeXN0ZW0/ICovCitpbnQgc3Vic3lzdGVtX2ZsYWcgPSAwOworCisvKiAjIG9mIHJlcGxpZXMgcmVjZWl2ZWQgZm9yIGdsb2JhbCByZXF1ZXN0cyAqLworc3RhdGljIGludCByZW1vdGVfZm9yd2FyZF9jb25maXJtc19yZWNlaXZlZCA9IDA7CisKKy8qIG11eC5jICovCitleHRlcm4gaW50IG11eHNlcnZlcl9zb2NrOworZXh0ZXJuIHVfaW50IG11eGNsaWVudF9jb21tYW5kOworCisvKiBQcmludHMgYSBoZWxwIG1lc3NhZ2UgdG8gdGhlIHVzZXIuICBUaGlzIGZ1bmN0aW9uIG5ldmVyIHJldHVybnMuICovCisKK3N0YXRpYyB2b2lkCit1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLAorInVzYWdlOiBzc2ggWy0xMjQ2QWFDZmdLa01ObnFzVHRWdlh4WXldIFstYiBiaW5kX2FkZHJlc3NdIFstYyBjaXBoZXJfc3BlY11cbiIKKyIgICAgICAgICAgIFstRCBbYmluZF9hZGRyZXNzOl1wb3J0XSBbLWUgZXNjYXBlX2NoYXJdIFstRiBjb25maWdmaWxlXVxuIgorIiAgICAgICAgICAgWy1JIHBrY3MxMV0gWy1pIGlkZW50aXR5X2ZpbGVdXG4iCisiICAgICAgICAgICBbLUwgW2JpbmRfYWRkcmVzczpdcG9ydDpob3N0Omhvc3Rwb3J0XVxuIgorIiAgICAgICAgICAgWy1sIGxvZ2luX25hbWVdIFstbSBtYWNfc3BlY10gWy1PIGN0bF9jbWRdIFstbyBvcHRpb25dIFstcCBwb3J0XVxuIgorIiAgICAgICAgICAgWy1SIFtiaW5kX2FkZHJlc3M6XXBvcnQ6aG9zdDpob3N0cG9ydF0gWy1TIGN0bF9wYXRoXVxuIgorIiAgICAgICAgICAgWy1XIGhvc3Q6cG9ydF0gWy13IGxvY2FsX3R1bls6cmVtb3RlX3R1bl1dXG4iCisiICAgICAgICAgICBbdXNlckBdaG9zdG5hbWUgW2NvbW1hbmRdXG4iCisJKTsKKwlleGl0KDI1NSk7Cit9CisKK3N0YXRpYyBpbnQgc3NoX3Nlc3Npb24odm9pZCk7CitzdGF0aWMgaW50IHNzaF9zZXNzaW9uMih2b2lkKTsKK3N0YXRpYyB2b2lkIGxvYWRfcHVibGljX2lkZW50aXR5X2ZpbGVzKHZvaWQpOworc3RhdGljIHZvaWQgbWFpbl9zaWdjaGxkX2hhbmRsZXIoaW50KTsKKworLyogZnJvbSBtdXhjbGllbnQuYyAqLwordm9pZCBtdXhjbGllbnQoY29uc3QgY2hhciAqKTsKK3ZvaWQgbXV4c2VydmVyX2xpc3Rlbih2b2lkKTsKKworLyogfi8gZXhwYW5kIGEgbGlzdCBvZiBwYXRocy4gTkIuIGFzc3VtZXMgcGF0aFtuXSBpcyBoZWFwLWFsbG9jYXRlZC4gKi8KK3N0YXRpYyB2b2lkCit0aWxkZV9leHBhbmRfcGF0aHMoY2hhciAqKnBhdGhzLCB1X2ludCBudW1fcGF0aHMpCit7CisJdV9pbnQgaTsKKwljaGFyICpjcDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcGF0aHM7IGkrKykgeworCQljcCA9IHRpbGRlX2V4cGFuZF9maWxlbmFtZShwYXRoc1tpXSwgb3JpZ2luYWxfcmVhbF91aWQpOworCQl4ZnJlZShwYXRoc1tpXSk7CisJCXBhdGhzW2ldID0gY3A7CisJfQorfQorCisvKgorICogTWFpbiBwcm9ncmFtIGZvciB0aGUgc3NoIGNsaWVudC4KKyAqLworaW50CittYWluKGludCBhYywgY2hhciAqKmF2KQoreworCWludCBpLCByLCBvcHQsIGV4aXRfc3RhdHVzLCB1c2Vfc3lzbG9nOworCWNoYXIgKnAsICpjcCwgKmxpbmUsICphcmd2MCwgYnVmW01BWFBBVEhMRU5dLCAqaG9zdF9hcmc7CisJY2hhciB0aGlzaG9zdFtOSV9NQVhIT1NUXSwgc2hvcnRob3N0W05JX01BWEhPU1RdLCBwb3J0c3RyW05JX01BWFNFUlZdOworCXN0cnVjdCBzdGF0IHN0OworCXN0cnVjdCBwYXNzd2QgKnB3OworCWludCBkdW1teSwgdGltZW91dF9tczsKKwlleHRlcm4gaW50IG9wdGluZCwgb3B0cmVzZXQ7CisJZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKworCXN0cnVjdCBzZXJ2ZW50ICpzcDsKKwlGb3J3YXJkIGZ3ZDsKKworCS8qIEVuc3VyZSB0aGF0IGZkcyAwLCAxIGFuZCAyIGFyZSBvcGVuIG9yIGRpcmVjdGVkIHRvIC9kZXYvbnVsbCAqLworCXNhbml0aXNlX3N0ZGZkKCk7CisKKwlfX3Byb2duYW1lID0gc3NoX2dldF9wcm9nbmFtZShhdlswXSk7CisKKyNpZm5kZWYgSEFWRV9TRVRQUk9DVElUTEUKKwkvKiBQcmVwYXJlIGZvciBsYXRlciBzZXRwcm9jdGl0bGUgZW11bGF0aW9uICovCisJLyogU2F2ZSBhcmd2IHNvIGl0IGlzbid0IGNsb2JiZXJlZCBieSBzZXRwcm9jdGl0bGUoKSBlbXVsYXRpb24gKi8KKwlzYXZlZF9hdiA9IHhjYWxsb2MoYWMgKyAxLCBzaXplb2YoKnNhdmVkX2F2KSk7CisJZm9yIChpID0gMDsgaSA8IGFjOyBpKyspCisJCXNhdmVkX2F2W2ldID0geHN0cmR1cChhdltpXSk7CisJc2F2ZWRfYXZbaV0gPSBOVUxMOworCWNvbXBhdF9pbml0X3NldHByb2N0aXRsZShhYywgYXYpOworCWF2ID0gc2F2ZWRfYXY7CisjZW5kaWYKKworCS8qCisJICogRGlzY2FyZCBvdGhlciBmZHMgdGhhdCBhcmUgaGFuZ2luZyBhcm91bmQuIFRoZXNlIGNhbiBjYXVzZSBwcm9ibGVtCisJICogd2l0aCBiYWNrZ3JvdW5kZWQgc3NoIHByb2Nlc3NlcyBzdGFydGVkIGJ5IENvbnRyb2xQZXJzaXN0LgorCSAqLworCWNsb3NlZnJvbShTVERFUlJfRklMRU5PICsgMSk7CisKKwkvKgorCSAqIFNhdmUgdGhlIG9yaWdpbmFsIHJlYWwgdWlkLiAgSXQgd2lsbCBiZSBuZWVkZWQgbGF0ZXIgKHVpZC1zd2FwcGluZworCSAqIG1heSBjbG9iYmVyIHRoZSByZWFsIHVpZCkuCisJICovCisJb3JpZ2luYWxfcmVhbF91aWQgPSBnZXR1aWQoKTsKKwlvcmlnaW5hbF9lZmZlY3RpdmVfdWlkID0gZ2V0ZXVpZCgpOworCisJLyoKKwkgKiBVc2UgdWlkLXN3YXBwaW5nIHRvIGdpdmUgdXAgcm9vdCBwcml2aWxlZ2VzIGZvciB0aGUgZHVyYXRpb24gb2YKKwkgKiBvcHRpb24gcHJvY2Vzc2luZy4gIFdlIHdpbGwgcmUtaW5zdGFudGlhdGUgdGhlIHJpZ2h0cyB3aGVuIHdlIGFyZQorCSAqIHJlYWR5IHRvIGNyZWF0ZSB0aGUgcHJpdmlsZWdlZCBwb3J0LCBhbmQgd2lsbCBwZXJtYW5lbnRseSBkcm9wCisJICogdGhlbSB3aGVuIHRoZSBwb3J0IGhhcyBiZWVuIGNyZWF0ZWQgKGFjdHVhbGx5LCB3aGVuIHRoZSBjb25uZWN0aW9uCisJICogaGFzIGJlZW4gbWFkZSwgYXMgd2UgbWF5IG5lZWQgdG8gY3JlYXRlIHRoZSBwb3J0IHNldmVyYWwgdGltZXMpLgorCSAqLworCVBSSVZfRU5EOworCisjaWZkZWYgSEFWRV9TRVRSTElNSVQKKwkvKiBJZiB3ZSBhcmUgaW5zdGFsbGVkIHNldHVpZCByb290IGJlIGNhcmVmdWwgdG8gbm90IGRyb3AgY29yZS4gKi8KKwlpZiAob3JpZ2luYWxfcmVhbF91aWQgIT0gb3JpZ2luYWxfZWZmZWN0aXZlX3VpZCkgeworCQlzdHJ1Y3QgcmxpbWl0IHJsaW07CisJCXJsaW0ucmxpbV9jdXIgPSBybGltLnJsaW1fbWF4ID0gMDsKKwkJaWYgKHNldHJsaW1pdChSTElNSVRfQ09SRSwgJnJsaW0pIDwgMCkKKwkJCWZhdGFsKCJzZXRybGltaXQgZmFpbGVkOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCX0KKyNlbmRpZgorCS8qIEdldCB1c2VyIGRhdGEuICovCisJcHcgPSBnZXRwd3VpZChvcmlnaW5hbF9yZWFsX3VpZCk7CisJaWYgKCFwdykgeworCQlsb2dpdCgiWW91IGRvbid0IGV4aXN0LCBnbyBhd2F5ISIpOworCQlleGl0KDI1NSk7CisJfQorCS8qIFRha2UgYSBjb3B5IG9mIHRoZSByZXR1cm5lZCBzdHJ1Y3R1cmUuICovCisJcHcgPSBwd2NvcHkocHcpOworCisJLyoKKwkgKiBTZXQgb3VyIHVtYXNrIHRvIHNvbWV0aGluZyByZWFzb25hYmxlLCBhcyBzb21lIGZpbGVzIGFyZSBjcmVhdGVkCisJICogd2l0aCB0aGUgZGVmYXVsdCB1bWFzay4gIFRoaXMgd2lsbCBtYWtlIHRoZW0gd29ybGQtcmVhZGFibGUgYnV0CisJICogd3JpdGFibGUgb25seSBieSB0aGUgb3duZXIsIHdoaWNoIGlzIG9rIGZvciBhbGwgZmlsZXMgZm9yIHdoaWNoIHdlCisJICogZG9uJ3Qgc2V0IHRoZSBtb2RlcyBleHBsaWNpdGx5LgorCSAqLworCXVtYXNrKDAyMik7CisKKwkvKgorCSAqIEluaXRpYWxpemUgb3B0aW9uIHN0cnVjdHVyZSB0byBpbmRpY2F0ZSB0aGF0IG5vIHZhbHVlcyBoYXZlIGJlZW4KKwkgKiBzZXQuCisJICovCisJaW5pdGlhbGl6ZV9vcHRpb25zKCZvcHRpb25zKTsKKworCS8qIFBhcnNlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuICovCisJaG9zdCA9IE5VTEw7CisJdXNlX3N5c2xvZyA9IDA7CisJYXJndjAgPSBhdlswXTsKKworIGFnYWluOgorCXdoaWxlICgob3B0ID0gZ2V0b3B0KGFjLCBhdiwgIjEyNDZhYjpjOmU6ZmdpOmtsOm06bm86cDpxc3R2eCIKKwkgICAgIkFDRDpGOkk6S0w6TU5POlBSOlM6VFZ3Olc6WFl5IikpICE9IC0xKSB7CisJCXN3aXRjaCAob3B0KSB7CisJCWNhc2UgJzEnOgorCQkJb3B0aW9ucy5wcm90b2NvbCA9IFNTSF9QUk9UT18xOworCQkJYnJlYWs7CisJCWNhc2UgJzInOgorCQkJb3B0aW9ucy5wcm90b2NvbCA9IFNTSF9QUk9UT18yOworCQkJYnJlYWs7CisJCWNhc2UgJzQnOgorCQkJb3B0aW9ucy5hZGRyZXNzX2ZhbWlseSA9IEFGX0lORVQ7CisJCQlicmVhazsKKwkJY2FzZSAnNic6CisJCQlvcHRpb25zLmFkZHJlc3NfZmFtaWx5ID0gQUZfSU5FVDY7CisJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQlzdGRpbl9udWxsX2ZsYWcgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJZm9ya19hZnRlcl9hdXRoZW50aWNhdGlvbl9mbGFnID0gMTsKKwkJCXN0ZGluX251bGxfZmxhZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAneCc6CisJCQlvcHRpb25zLmZvcndhcmRfeDExID0gMDsKKwkJCWJyZWFrOworCQljYXNlICdYJzoKKwkJCW9wdGlvbnMuZm9yd2FyZF94MTEgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3knOgorCQkJdXNlX3N5c2xvZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnWSc6CisJCQlvcHRpb25zLmZvcndhcmRfeDExID0gMTsKKwkJCW9wdGlvbnMuZm9yd2FyZF94MTFfdHJ1c3RlZCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnZyc6CisJCQlvcHRpb25zLmdhdGV3YXlfcG9ydHMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ08nOgorCQkJaWYgKHN0ZGlvX2ZvcndhcmRfaG9zdCAhPSBOVUxMKQorCQkJCWZhdGFsKCJDYW5ub3Qgc3BlY2lmeSBtdWx0aXBsZXhpbmcgIgorCQkJCSAgICAiY29tbWFuZCB3aXRoIC1XIik7CisJCQllbHNlIGlmIChtdXhjbGllbnRfY29tbWFuZCAhPSAwKQorCQkJCWZhdGFsKCJNdWx0aXBsZXhpbmcgY29tbWFuZCBhbHJlYWR5IHNwZWNpZmllZCIpOworCQkJaWYgKHN0cmNtcChvcHRhcmcsICJjaGVjayIpID09IDApCisJCQkJbXV4Y2xpZW50X2NvbW1hbmQgPSBTU0hNVVhfQ09NTUFORF9BTElWRV9DSEVDSzsKKwkJCWVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJmb3J3YXJkIikgPT0gMCkKKwkJCQltdXhjbGllbnRfY29tbWFuZCA9IFNTSE1VWF9DT01NQU5EX0ZPUldBUkQ7CisJCQllbHNlIGlmIChzdHJjbXAob3B0YXJnLCAiZXhpdCIpID09IDApCisJCQkJbXV4Y2xpZW50X2NvbW1hbmQgPSBTU0hNVVhfQ09NTUFORF9URVJNSU5BVEU7CisJCQllbHNlIGlmIChzdHJjbXAob3B0YXJnLCAic3RvcCIpID09IDApCisJCQkJbXV4Y2xpZW50X2NvbW1hbmQgPSBTU0hNVVhfQ09NTUFORF9TVE9QOworCQkJZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgImNhbmNlbCIpID09IDApCisJCQkJbXV4Y2xpZW50X2NvbW1hbmQgPSBTU0hNVVhfQ09NTUFORF9DQU5DRUxfRldEOworCQkJZWxzZQorCQkJCWZhdGFsKCJJbnZhbGlkIG11bHRpcGxleCBjb21tYW5kLiIpOworCQkJYnJlYWs7CisJCWNhc2UgJ1AnOgkvKiBkZXByZWNhdGVkICovCisJCQlvcHRpb25zLnVzZV9wcml2aWxlZ2VkX3BvcnQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ2EnOgorCQkJb3B0aW9ucy5mb3J3YXJkX2FnZW50ID0gMDsKKwkJCWJyZWFrOworCQljYXNlICdBJzoKKwkJCW9wdGlvbnMuZm9yd2FyZF9hZ2VudCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnayc6CisJCQlvcHRpb25zLmdzc19kZWxlZ19jcmVkcyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAnSyc6CisJCQlvcHRpb25zLmdzc19hdXRoZW50aWNhdGlvbiA9IDE7CisJCQlvcHRpb25zLmdzc19kZWxlZ19jcmVkcyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnaSc6CisJCQlpZiAoc3RhdChvcHRhcmcsICZzdCkgPCAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBJZGVudGl0eSBmaWxlICVzICIKKwkJCQkgICAgIm5vdCBhY2Nlc3NpYmxlOiAlcy5cbiIsIG9wdGFyZywKKwkJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChvcHRpb25zLm51bV9pZGVudGl0eV9maWxlcyA+PQorCQkJICAgIFNTSF9NQVhfSURFTlRJVFlfRklMRVMpCisJCQkJZmF0YWwoIlRvbyBtYW55IGlkZW50aXR5IGZpbGVzIHNwZWNpZmllZCAiCisJCQkJICAgICIobWF4ICVkKSIsIFNTSF9NQVhfSURFTlRJVFlfRklMRVMpOworCQkJb3B0aW9ucy5pZGVudGl0eV9maWxlc1tvcHRpb25zLm51bV9pZGVudGl0eV9maWxlcysrXSA9CisJCQkgICAgeHN0cmR1cChvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ0knOgorI2lmZGVmIEVOQUJMRV9QS0NTMTEKKwkJCW9wdGlvbnMucGtjczExX3Byb3ZpZGVyID0geHN0cmR1cChvcHRhcmcpOworI2Vsc2UKKwkJCWZwcmludGYoc3RkZXJyLCAibm8gc3VwcG9ydCBmb3IgUEtDUyMxMS5cbiIpOworI2VuZGlmCisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQlpZiAob3B0aW9ucy5yZXF1ZXN0X3R0eSA9PSBSRVFVRVNUX1RUWV9ZRVMpCisJCQkJb3B0aW9ucy5yZXF1ZXN0X3R0eSA9IFJFUVVFU1RfVFRZX0ZPUkNFOworCQkJZWxzZQorCQkJCW9wdGlvbnMucmVxdWVzdF90dHkgPSBSRVFVRVNUX1RUWV9ZRVM7CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQlpZiAoZGVidWdfZmxhZyA9PSAwKSB7CisJCQkJZGVidWdfZmxhZyA9IDE7CisJCQkJb3B0aW9ucy5sb2dfbGV2ZWwgPSBTWVNMT0dfTEVWRUxfREVCVUcxOworCQkJfSBlbHNlIHsKKwkJCQlpZiAob3B0aW9ucy5sb2dfbGV2ZWwgPCBTWVNMT0dfTEVWRUxfREVCVUczKQorCQkJCQlvcHRpb25zLmxvZ19sZXZlbCsrOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJY2FzZSAnVic6CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzLCAlc1xuIiwKKwkJCSAgICBTU0hfUkVMRUFTRSwgU1NMZWF5X3ZlcnNpb24oU1NMRUFZX1ZFUlNJT04pKTsKKwkJCWlmIChvcHQgPT0gJ1YnKQorCQkJCWV4aXQoMCk7CisJCQlicmVhazsKKwkJY2FzZSAndyc6CisJCQlpZiAob3B0aW9ucy50dW5fb3BlbiA9PSAtMSkKKwkJCQlvcHRpb25zLnR1bl9vcGVuID0gU1NIX1RVTk1PREVfREVGQVVMVDsKKwkJCW9wdGlvbnMudHVuX2xvY2FsID0gYTJ0dW4ob3B0YXJnLCAmb3B0aW9ucy50dW5fcmVtb3RlKTsKKwkJCWlmIChvcHRpb25zLnR1bl9sb2NhbCA9PSBTU0hfVFVOSURfRVJSKSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJICAgICJCYWQgdHVuIGRldmljZSAnJXMnXG4iLCBvcHRhcmcpOworCQkJCWV4aXQoMjU1KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdXJzoKKwkJCWlmIChzdGRpb19mb3J3YXJkX2hvc3QgIT0gTlVMTCkKKwkJCQlmYXRhbCgic3RkaW8gZm9yd2FyZCBhbHJlYWR5IHNwZWNpZmllZCIpOworCQkJaWYgKG11eGNsaWVudF9jb21tYW5kICE9IDApCisJCQkJZmF0YWwoIkNhbm5vdCBzcGVjaWZ5IHN0ZGlvIGZvcndhcmQgd2l0aCAtTyIpOworCQkJaWYgKHBhcnNlX2ZvcndhcmQoJmZ3ZCwgb3B0YXJnLCAxLCAwKSkgeworCQkJCXN0ZGlvX2ZvcndhcmRfaG9zdCA9IGZ3ZC5saXN0ZW5faG9zdDsKKwkJCQlzdGRpb19mb3J3YXJkX3BvcnQgPSBmd2QubGlzdGVuX3BvcnQ7CisJCQkJeGZyZWUoZndkLmNvbm5lY3RfaG9zdCk7CisJCQl9IGVsc2UgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCSAgICAiQmFkIHN0ZGlvIGZvcndhcmRpbmcgc3BlY2lmaWNhdGlvbiAnJXMnXG4iLAorCQkJCSAgICBvcHRhcmcpOworCQkJCWV4aXQoMjU1KTsKKwkJCX0KKwkJCW9wdGlvbnMucmVxdWVzdF90dHkgPSBSRVFVRVNUX1RUWV9OTzsKKwkJCW5vX3NoZWxsX2ZsYWcgPSAxOworCQkJb3B0aW9ucy5jbGVhcl9mb3J3YXJkaW5ncyA9IDE7CisJCQlvcHRpb25zLmV4aXRfb25fZm9yd2FyZF9mYWlsdXJlID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdxJzoKKwkJCW9wdGlvbnMubG9nX2xldmVsID0gU1lTTE9HX0xFVkVMX1FVSUVUOworCQkJYnJlYWs7CisJCWNhc2UgJ2UnOgorCQkJaWYgKG9wdGFyZ1swXSA9PSAnXicgJiYgb3B0YXJnWzJdID09IDAgJiYKKwkJCSAgICAodV9jaGFyKSBvcHRhcmdbMV0gPj0gNjQgJiYKKwkJCSAgICAodV9jaGFyKSBvcHRhcmdbMV0gPCAxMjgpCisJCQkJb3B0aW9ucy5lc2NhcGVfY2hhciA9ICh1X2NoYXIpIG9wdGFyZ1sxXSAmIDMxOworCQkJZWxzZSBpZiAoc3RybGVuKG9wdGFyZykgPT0gMSkKKwkJCQlvcHRpb25zLmVzY2FwZV9jaGFyID0gKHVfY2hhcikgb3B0YXJnWzBdOworCQkJZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgIm5vbmUiKSA9PSAwKQorCQkJCW9wdGlvbnMuZXNjYXBlX2NoYXIgPSBTU0hfRVNDQVBFQ0hBUl9OT05FOworCQkJZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJCYWQgZXNjYXBlIGNoYXJhY3RlciAnJXMnLlxuIiwKKwkJCQkgICAgb3B0YXJnKTsKKwkJCQlleGl0KDI1NSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQlpZiAoY2lwaGVyc192YWxpZChvcHRhcmcpKSB7CisJCQkJLyogU1NIMiBvbmx5ICovCisJCQkJb3B0aW9ucy5jaXBoZXJzID0geHN0cmR1cChvcHRhcmcpOworCQkJCW9wdGlvbnMuY2lwaGVyID0gU1NIX0NJUEhFUl9JTlZBTElEOworCQkJfSBlbHNlIHsKKwkJCQkvKiBTU0gxIG9ubHkgKi8KKwkJCQlvcHRpb25zLmNpcGhlciA9IGNpcGhlcl9udW1iZXIob3B0YXJnKTsKKwkJCQlpZiAob3B0aW9ucy5jaXBoZXIgPT0gLTEpIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSAgICAiVW5rbm93biBjaXBoZXIgdHlwZSAnJXMnXG4iLAorCQkJCQkgICAgb3B0YXJnKTsKKwkJCQkJZXhpdCgyNTUpOworCQkJCX0KKwkJCQlpZiAob3B0aW9ucy5jaXBoZXIgPT0gU1NIX0NJUEhFUl8zREVTKQorCQkJCQlvcHRpb25zLmNpcGhlcnMgPSAiM2Rlcy1jYmMiOworCQkJCWVsc2UgaWYgKG9wdGlvbnMuY2lwaGVyID09IFNTSF9DSVBIRVJfQkxPV0ZJU0gpCisJCQkJCW9wdGlvbnMuY2lwaGVycyA9ICJibG93ZmlzaC1jYmMiOworCQkJCWVsc2UKKwkJCQkJb3B0aW9ucy5jaXBoZXJzID0gKGNoYXIgKiktMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJCWlmIChtYWNfdmFsaWQob3B0YXJnKSkKKwkJCQlvcHRpb25zLm1hY3MgPSB4c3RyZHVwKG9wdGFyZyk7CisJCQllbHNlIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gbWFjIHR5cGUgJyVzJ1xuIiwKKwkJCQkgICAgb3B0YXJnKTsKKwkJCQlleGl0KDI1NSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnTSc6CisJCQlpZiAob3B0aW9ucy5jb250cm9sX21hc3RlciA9PSBTU0hDVExfTUFTVEVSX1lFUykKKwkJCQlvcHRpb25zLmNvbnRyb2xfbWFzdGVyID0gU1NIQ1RMX01BU1RFUl9BU0s7CisJCQllbHNlCisJCQkJb3B0aW9ucy5jb250cm9sX21hc3RlciA9IFNTSENUTF9NQVNURVJfWUVTOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJb3B0aW9ucy5wb3J0ID0gYTJwb3J0KG9wdGFyZyk7CisJCQlpZiAob3B0aW9ucy5wb3J0IDw9IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkJhZCBwb3J0ICclcydcbiIsIG9wdGFyZyk7CisJCQkJZXhpdCgyNTUpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ2wnOgorCQkJb3B0aW9ucy51c2VyID0gb3B0YXJnOworCQkJYnJlYWs7CisKKwkJY2FzZSAnTCc6CisJCQlpZiAocGFyc2VfZm9yd2FyZCgmZndkLCBvcHRhcmcsIDAsIDApKQorCQkJCWFkZF9sb2NhbF9mb3J3YXJkKCZvcHRpb25zLCAmZndkKTsKKwkJCWVsc2UgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCSAgICAiQmFkIGxvY2FsIGZvcndhcmRpbmcgc3BlY2lmaWNhdGlvbiAnJXMnXG4iLAorCQkJCSAgICBvcHRhcmcpOworCQkJCWV4aXQoMjU1KTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgJ1InOgorCQkJaWYgKHBhcnNlX2ZvcndhcmQoJmZ3ZCwgb3B0YXJnLCAwLCAxKSkgeworCQkJCWFkZF9yZW1vdGVfZm9yd2FyZCgmb3B0aW9ucywgJmZ3ZCk7CisJCQl9IGVsc2UgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCSAgICAiQmFkIHJlbW90ZSBmb3J3YXJkaW5nIHNwZWNpZmljYXRpb24gIgorCQkJCSAgICAiJyVzJ1xuIiwgb3B0YXJnKTsKKwkJCQlleGl0KDI1NSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlICdEJzoKKwkJCWlmIChwYXJzZV9mb3J3YXJkKCZmd2QsIG9wdGFyZywgMSwgMCkpIHsKKwkJCQlhZGRfbG9jYWxfZm9yd2FyZCgmb3B0aW9ucywgJmZ3ZCk7CisJCQl9IGVsc2UgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCSAgICAiQmFkIGR5bmFtaWMgZm9yd2FyZGluZyBzcGVjaWZpY2F0aW9uICIKKwkJCQkgICAgIiclcydcbiIsIG9wdGFyZyk7CisJCQkJZXhpdCgyNTUpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAnQyc6CisJCQlvcHRpb25zLmNvbXByZXNzaW9uID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdOJzoKKwkJCW5vX3NoZWxsX2ZsYWcgPSAxOworCQkJb3B0aW9ucy5yZXF1ZXN0X3R0eSA9IFJFUVVFU1RfVFRZX05POworCQkJYnJlYWs7CisJCWNhc2UgJ1QnOgorCQkJb3B0aW9ucy5yZXF1ZXN0X3R0eSA9IFJFUVVFU1RfVFRZX05POworCQkJYnJlYWs7CisJCWNhc2UgJ28nOgorCQkJZHVtbXkgPSAxOworCQkJbGluZSA9IHhzdHJkdXAob3B0YXJnKTsKKwkJCWlmIChwcm9jZXNzX2NvbmZpZ19saW5lKCZvcHRpb25zLCBob3N0ID8gaG9zdCA6ICIiLAorCQkJICAgIGxpbmUsICJjb21tYW5kLWxpbmUiLCAwLCAmZHVtbXkpICE9IDApCisJCQkJZXhpdCgyNTUpOworCQkJeGZyZWUobGluZSk7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlzdWJzeXN0ZW1fZmxhZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnUyc6CisJCQlpZiAob3B0aW9ucy5jb250cm9sX3BhdGggIT0gTlVMTCkKKwkJCQlmcmVlKG9wdGlvbnMuY29udHJvbF9wYXRoKTsKKwkJCW9wdGlvbnMuY29udHJvbF9wYXRoID0geHN0cmR1cChvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ2InOgorCQkJb3B0aW9ucy5iaW5kX2FkZHJlc3MgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnRic6CisJCQljb25maWcgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKCk7CisJCX0KKwl9CisKKwlhYyAtPSBvcHRpbmQ7CisJYXYgKz0gb3B0aW5kOworCisJaWYgKGFjID4gMCAmJiAhaG9zdCkgeworCQlpZiAoc3RycmNocigqYXYsICdAJykpIHsKKwkJCXAgPSB4c3RyZHVwKCphdik7CisJCQljcCA9IHN0cnJjaHIocCwgJ0AnKTsKKwkJCWlmIChjcCA9PSBOVUxMIHx8IGNwID09IHApCisJCQkJdXNhZ2UoKTsKKwkJCW9wdGlvbnMudXNlciA9IHA7CisJCQkqY3AgPSAnXDAnOworCQkJaG9zdCA9ICsrY3A7CisJCX0gZWxzZQorCQkJaG9zdCA9ICphdjsKKwkJaWYgKGFjID4gMSkgeworCQkJb3B0aW5kID0gb3B0cmVzZXQgPSAxOworCQkJZ290byBhZ2FpbjsKKwkJfQorCQlhYy0tLCBhdisrOworCX0KKworCS8qIENoZWNrIHRoYXQgd2UgZ290IGEgaG9zdCBuYW1lLiAqLworCWlmICghaG9zdCkKKwkJdXNhZ2UoKTsKKworCU9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCk7CisJRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGNvbW1hbmQgdG8gZXhlY3V0ZSBvbiByZW1vdGUgaG9zdC4gKi8KKwlidWZmZXJfaW5pdCgmY29tbWFuZCk7CisKKwlpZiAob3B0aW9ucy5yZXF1ZXN0X3R0eSA9PSBSRVFVRVNUX1RUWV9ZRVMgfHwKKwkgICAgb3B0aW9ucy5yZXF1ZXN0X3R0eSA9PSBSRVFVRVNUX1RUWV9GT1JDRSkKKwkJdHR5X2ZsYWcgPSAxOworCisJLyoKKwkgKiBTYXZlIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUgb24gdGhlIHJlbW90ZSBob3N0IGluIGEgYnVmZmVyLiBUaGVyZQorCSAqIGlzIG5vIGxpbWl0IG9uIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1hbmQsIGV4Y2VwdCBieSB0aGUgbWF4aW11bQorCSAqIHBhY2tldCBzaXplLiAgQWxzbyBzZXRzIHRoZSB0dHkgZmxhZyBpZiB0aGVyZSBpcyBubyBjb21tYW5kLgorCSAqLworCWlmICghYWMpIHsKKwkJLyogTm8gY29tbWFuZCBzcGVjaWZpZWQgLSBleGVjdXRlIHNoZWxsIG9uIGEgdHR5LiAqLworCQl0dHlfZmxhZyA9IG9wdGlvbnMucmVxdWVzdF90dHkgIT0gUkVRVUVTVF9UVFlfTk87CisJCWlmIChzdWJzeXN0ZW1fZmxhZykgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkgICAgIllvdSBtdXN0IHNwZWNpZnkgYSBzdWJzeXN0ZW0gdG8gaW52b2tlLlxuIik7CisJCQl1c2FnZSgpOworCQl9CisJfSBlbHNlIHsKKwkJLyogQSBjb21tYW5kIGhhcyBiZWVuIHNwZWNpZmllZC4gIFN0b3JlIGl0IGludG8gdGhlIGJ1ZmZlci4gKi8KKwkJZm9yIChpID0gMDsgaSA8IGFjOyBpKyspIHsKKwkJCWlmIChpKQorCQkJCWJ1ZmZlcl9hcHBlbmQoJmNvbW1hbmQsICIgIiwgMSk7CisJCQlidWZmZXJfYXBwZW5kKCZjb21tYW5kLCBhdltpXSwgc3RybGVuKGF2W2ldKSk7CisJCX0KKwl9CisKKwkvKiBDYW5ub3QgZm9yayB0byBiYWNrZ3JvdW5kIGlmIG5vIGNvbW1hbmQuICovCisJaWYgKGZvcmtfYWZ0ZXJfYXV0aGVudGljYXRpb25fZmxhZyAmJiBidWZmZXJfbGVuKCZjb21tYW5kKSA9PSAwICYmCisJICAgICFub19zaGVsbF9mbGFnKQorCQlmYXRhbCgiQ2Fubm90IGZvcmsgaW50byBiYWNrZ3JvdW5kIHdpdGhvdXQgYSBjb21tYW5kICIKKwkJICAgICJ0byBleGVjdXRlLiIpOworCisJLyogQWxsb2NhdGUgYSB0dHkgYnkgZGVmYXVsdCBpZiBubyBjb21tYW5kIHNwZWNpZmllZC4gKi8KKwlpZiAoYnVmZmVyX2xlbigmY29tbWFuZCkgPT0gMCkKKwkJdHR5X2ZsYWcgPSBvcHRpb25zLnJlcXVlc3RfdHR5ICE9IFJFUVVFU1RfVFRZX05POworCisJLyogRm9yY2Ugbm8gdHR5ICovCisJaWYgKG9wdGlvbnMucmVxdWVzdF90dHkgPT0gUkVRVUVTVF9UVFlfTk8gfHwgbXV4Y2xpZW50X2NvbW1hbmQgIT0gMCkKKwkJdHR5X2ZsYWcgPSAwOworCS8qIERvIG5vdCBhbGxvY2F0ZSBhIHR0eSBpZiBzdGRpbiBpcyBub3QgYSB0dHkuICovCisJaWYgKCghaXNhdHR5KGZpbGVubyhzdGRpbikpIHx8IHN0ZGluX251bGxfZmxhZykgJiYKKwkgICAgb3B0aW9ucy5yZXF1ZXN0X3R0eSAhPSBSRVFVRVNUX1RUWV9GT1JDRSkgeworCQlpZiAodHR5X2ZsYWcpCisJCQlsb2dpdCgiUHNldWRvLXRlcm1pbmFsIHdpbGwgbm90IGJlIGFsbG9jYXRlZCBiZWNhdXNlICIKKwkJCSAgICAic3RkaW4gaXMgbm90IGEgdGVybWluYWwuIik7CisJCXR0eV9mbGFnID0gMDsKKwl9CisKKwkvKgorCSAqIEluaXRpYWxpemUgImxvZyIgb3V0cHV0LiAgU2luY2Ugd2UgYXJlIHRoZSBjbGllbnQgYWxsIG91dHB1dAorCSAqIGFjdHVhbGx5IGdvZXMgdG8gc3RkZXJyLgorCSAqLworCWxvZ19pbml0KGFyZ3YwLAorCSAgICBvcHRpb25zLmxvZ19sZXZlbCA9PSAtMSA/IFNZU0xPR19MRVZFTF9JTkZPIDogb3B0aW9ucy5sb2dfbGV2ZWwsCisJICAgIFNZU0xPR19GQUNJTElUWV9VU0VSLCAhdXNlX3N5c2xvZyk7CisKKwkvKgorCSAqIFJlYWQgcGVyLXVzZXIgY29uZmlndXJhdGlvbiBmaWxlLiAgSWdub3JlIHRoZSBzeXN0ZW0gd2lkZSBjb25maWcKKwkgKiBmaWxlIGlmIHRoZSB1c2VyIHNwZWNpZmllcyBhIGNvbmZpZyBmaWxlIG9uIHRoZSBjb21tYW5kIGxpbmUuCisJICovCisJaWYgKGNvbmZpZyAhPSBOVUxMKSB7CisJCWlmICghcmVhZF9jb25maWdfZmlsZShjb25maWcsIGhvc3QsICZvcHRpb25zLCAwKSkKKwkJCWZhdGFsKCJDYW4ndCBvcGVuIHVzZXIgY29uZmlnIGZpbGUgJS4xMDBzOiAiCisJCQkgICAgIiUuMTAwcyIsIGNvbmZpZywgc3RyZXJyb3IoZXJybm8pKTsKKwl9IGVsc2UgeworCQlyID0gc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiJXMvJXMiLCBwdy0+cHdfZGlyLAorCQkgICAgX1BBVEhfU1NIX1VTRVJfQ09ORkZJTEUpOworCQlpZiAociA+IDAgJiYgKHNpemVfdClyIDwgc2l6ZW9mKGJ1ZikpCisJCQkodm9pZClyZWFkX2NvbmZpZ19maWxlKGJ1ZiwgaG9zdCwgJm9wdGlvbnMsIDEpOworCisJCS8qIFJlYWQgc3lzdGVtd2lkZSBjb25maWd1cmF0aW9uIGZpbGUgYWZ0ZXIgdXNlciBjb25maWcuICovCisJCSh2b2lkKXJlYWRfY29uZmlnX2ZpbGUoX1BBVEhfSE9TVF9DT05GSUdfRklMRSwgaG9zdCwKKwkJICAgICZvcHRpb25zLCAwKTsKKwl9CisKKwkvKiBGaWxsIGNvbmZpZ3VyYXRpb24gZGVmYXVsdHMuICovCisJZmlsbF9kZWZhdWx0X29wdGlvbnMoJm9wdGlvbnMpOworCisJY2hhbm5lbF9zZXRfYWYob3B0aW9ucy5hZGRyZXNzX2ZhbWlseSk7CisKKwkvKiByZWluaXQgKi8KKwlsb2dfaW5pdChhcmd2MCwgb3B0aW9ucy5sb2dfbGV2ZWwsIFNZU0xPR19GQUNJTElUWV9VU0VSLCAhdXNlX3N5c2xvZyk7CisKKwlzZWVkX3JuZygpOworCisJaWYgKG9wdGlvbnMudXNlciA9PSBOVUxMKQorCQlvcHRpb25zLnVzZXIgPSB4c3RyZHVwKHB3LT5wd19uYW1lKTsKKworCS8qIEdldCBkZWZhdWx0IHBvcnQgaWYgcG9ydCBoYXMgbm90IGJlZW4gc2V0LiAqLworCWlmIChvcHRpb25zLnBvcnQgPT0gMCkgeworCQlzcCA9IGdldHNlcnZieW5hbWUoU1NIX1NFUlZJQ0VfTkFNRSwgInRjcCIpOworCQlvcHRpb25zLnBvcnQgPSBzcCA/IG50b2hzKHNwLT5zX3BvcnQpIDogU1NIX0RFRkFVTFRfUE9SVDsKKwl9CisKKwkvKiBwcmVzZXJ2ZSBob3N0IG5hbWUgZ2l2ZW4gb24gY29tbWFuZCBsaW5lIGZvciAlbiBleHBhbnNpb24gKi8KKwlob3N0X2FyZyA9IGhvc3Q7CisJaWYgKG9wdGlvbnMuaG9zdG5hbWUgIT0gTlVMTCkgeworCQlob3N0ID0gcGVyY2VudF9leHBhbmQob3B0aW9ucy5ob3N0bmFtZSwKKwkJICAgICJoIiwgaG9zdCwgKGNoYXIgKilOVUxMKTsKKwl9CisKKwlpZiAoZ2V0aG9zdG5hbWUodGhpc2hvc3QsIHNpemVvZih0aGlzaG9zdCkpID09IC0xKQorCQlmYXRhbCgiZ2V0aG9zdG5hbWU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlzdHJsY3B5KHNob3J0aG9zdCwgdGhpc2hvc3QsIHNpemVvZihzaG9ydGhvc3QpKTsKKwlzaG9ydGhvc3Rbc3RyY3Nwbih0aGlzaG9zdCwgIi4iKV0gPSAnXDAnOworCXNucHJpbnRmKHBvcnRzdHIsIHNpemVvZihwb3J0c3RyKSwgIiVkIiwgb3B0aW9ucy5wb3J0KTsKKworCWlmIChvcHRpb25zLmxvY2FsX2NvbW1hbmQgIT0gTlVMTCkgeworCQlkZWJ1ZzMoImV4cGFuZGluZyBMb2NhbENvbW1hbmQ6ICVzIiwgb3B0aW9ucy5sb2NhbF9jb21tYW5kKTsKKwkJY3AgPSBvcHRpb25zLmxvY2FsX2NvbW1hbmQ7CisJCW9wdGlvbnMubG9jYWxfY29tbWFuZCA9IHBlcmNlbnRfZXhwYW5kKGNwLCAiZCIsIHB3LT5wd19kaXIsCisJCSAgICAiaCIsIGhvc3QsICJsIiwgdGhpc2hvc3QsICJuIiwgaG9zdF9hcmcsICJyIiwgb3B0aW9ucy51c2VyLAorCQkgICAgInAiLCBwb3J0c3RyLCAidSIsIHB3LT5wd19uYW1lLCAiTCIsIHNob3J0aG9zdCwKKwkJICAgIChjaGFyICopTlVMTCk7CisJCWRlYnVnMygiZXhwYW5kZWQgTG9jYWxDb21tYW5kOiAlcyIsIG9wdGlvbnMubG9jYWxfY29tbWFuZCk7CisJCXhmcmVlKGNwKTsKKwl9CisKKwkvKiBmb3JjZSBsb3dlcmNhc2UgZm9yIGhvc3RrZXkgbWF0Y2hpbmcgKi8KKwlpZiAob3B0aW9ucy5ob3N0X2tleV9hbGlhcyAhPSBOVUxMKSB7CisJCWZvciAocCA9IG9wdGlvbnMuaG9zdF9rZXlfYWxpYXM7ICpwOyBwKyspCisJCQlpZiAoaXN1cHBlcigqcCkpCisJCQkJKnAgPSAoY2hhcil0b2xvd2VyKCpwKTsKKwl9CisKKwlpZiAob3B0aW9ucy5wcm94eV9jb21tYW5kICE9IE5VTEwgJiYKKwkgICAgc3RyY21wKG9wdGlvbnMucHJveHlfY29tbWFuZCwgIm5vbmUiKSA9PSAwKSB7CisJCXhmcmVlKG9wdGlvbnMucHJveHlfY29tbWFuZCk7CisJCW9wdGlvbnMucHJveHlfY29tbWFuZCA9IE5VTEw7CisJfQorCWlmIChvcHRpb25zLmNvbnRyb2xfcGF0aCAhPSBOVUxMICYmCisJICAgIHN0cmNtcChvcHRpb25zLmNvbnRyb2xfcGF0aCwgIm5vbmUiKSA9PSAwKSB7CisJCXhmcmVlKG9wdGlvbnMuY29udHJvbF9wYXRoKTsKKwkJb3B0aW9ucy5jb250cm9sX3BhdGggPSBOVUxMOworCX0KKworCWlmIChvcHRpb25zLmNvbnRyb2xfcGF0aCAhPSBOVUxMKSB7CisJCWNwID0gdGlsZGVfZXhwYW5kX2ZpbGVuYW1lKG9wdGlvbnMuY29udHJvbF9wYXRoLAorCQkgICAgb3JpZ2luYWxfcmVhbF91aWQpOworCQl4ZnJlZShvcHRpb25zLmNvbnRyb2xfcGF0aCk7CisJCW9wdGlvbnMuY29udHJvbF9wYXRoID0gcGVyY2VudF9leHBhbmQoY3AsICJoIiwgaG9zdCwKKwkJICAgICJsIiwgdGhpc2hvc3QsICJuIiwgaG9zdF9hcmcsICJyIiwgb3B0aW9ucy51c2VyLAorCQkgICAgInAiLCBwb3J0c3RyLCAidSIsIHB3LT5wd19uYW1lLCAiTCIsIHNob3J0aG9zdCwKKwkJICAgIChjaGFyICopTlVMTCk7CisJCXhmcmVlKGNwKTsKKwl9CisJaWYgKG11eGNsaWVudF9jb21tYW5kICE9IDAgJiYgb3B0aW9ucy5jb250cm9sX3BhdGggPT0gTlVMTCkKKwkJZmF0YWwoIk5vIENvbnRyb2xQYXRoIHNwZWNpZmllZCBmb3IgXCItT1wiIGNvbW1hbmQiKTsKKwlpZiAob3B0aW9ucy5jb250cm9sX3BhdGggIT0gTlVMTCkKKwkJbXV4Y2xpZW50KG9wdGlvbnMuY29udHJvbF9wYXRoKTsKKworCXRpbWVvdXRfbXMgPSBvcHRpb25zLmNvbm5lY3Rpb25fdGltZW91dCAqIDEwMDA7CisKKwkvKiBPcGVuIGEgY29ubmVjdGlvbiB0byB0aGUgcmVtb3RlIGhvc3QuICovCisJaWYgKHNzaF9jb25uZWN0KGhvc3QsICZob3N0YWRkciwgb3B0aW9ucy5wb3J0LAorCSAgICBvcHRpb25zLmFkZHJlc3NfZmFtaWx5LCBvcHRpb25zLmNvbm5lY3Rpb25fYXR0ZW1wdHMsICZ0aW1lb3V0X21zLAorCSAgICBvcHRpb25zLnRjcF9rZWVwX2FsaXZlLCAKKyNpZmRlZiBIQVZFX0NZR1dJTgorCSAgICBvcHRpb25zLnVzZV9wcml2aWxlZ2VkX3BvcnQsCisjZWxzZQorCSAgICBvcmlnaW5hbF9lZmZlY3RpdmVfdWlkID09IDAgJiYgb3B0aW9ucy51c2VfcHJpdmlsZWdlZF9wb3J0LAorI2VuZGlmCisJICAgIG9wdGlvbnMucHJveHlfY29tbWFuZCkgIT0gMCkKKwkJZXhpdCgyNTUpOworCisJaWYgKHRpbWVvdXRfbXMgPiAwKQorCQlkZWJ1ZzMoInRpbWVvdXQ6ICVkIG1zIHJlbWFpbiBhZnRlciBjb25uZWN0IiwgdGltZW91dF9tcyk7CisKKwkvKgorCSAqIElmIHdlIHN1Y2Nlc3NmdWxseSBtYWRlIHRoZSBjb25uZWN0aW9uLCBsb2FkIHRoZSBob3N0IHByaXZhdGUga2V5CisJICogaW4gY2FzZSB3ZSB3aWxsIG5lZWQgaXQgbGF0ZXIgZm9yIGNvbWJpbmVkIHJzYS1yaG9zdHMKKwkgKiBhdXRoZW50aWNhdGlvbi4gVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIHJlbGVhc2luZyBleHRyYQorCSAqIHByaXZpbGVnZXMsIGJlY2F1c2UgdGhlIGZpbGUgaXMgb25seSByZWFkYWJsZSBieSByb290LgorCSAqIElmIHdlIGNhbm5vdCBhY2Nlc3MgdGhlIHByaXZhdGUga2V5cywgbG9hZCB0aGUgcHVibGljIGtleXMKKwkgKiBpbnN0ZWFkIGFuZCB0cnkgdG8gZXhlY3V0ZSB0aGUgc3NoLWtleXNpZ24gaGVscGVyIGluc3RlYWQuCisJICovCisJc2Vuc2l0aXZlX2RhdGEubmtleXMgPSAwOworCXNlbnNpdGl2ZV9kYXRhLmtleXMgPSBOVUxMOworCXNlbnNpdGl2ZV9kYXRhLmV4dGVybmFsX2tleXNpZ24gPSAwOworCWlmIChvcHRpb25zLnJob3N0c19yc2FfYXV0aGVudGljYXRpb24gfHwKKwkgICAgb3B0aW9ucy5ob3N0YmFzZWRfYXV0aGVudGljYXRpb24pIHsKKwkJc2Vuc2l0aXZlX2RhdGEubmtleXMgPSA3OworCQlzZW5zaXRpdmVfZGF0YS5rZXlzID0geGNhbGxvYyhzZW5zaXRpdmVfZGF0YS5ua2V5cywKKwkJICAgIHNpemVvZihLZXkpKTsKKwkJZm9yIChpID0gMDsgaSA8IHNlbnNpdGl2ZV9kYXRhLm5rZXlzOyBpKyspCisJCQlzZW5zaXRpdmVfZGF0YS5rZXlzW2ldID0gTlVMTDsKKworCQlQUklWX1NUQVJUOworCQlzZW5zaXRpdmVfZGF0YS5rZXlzWzBdID0ga2V5X2xvYWRfcHJpdmF0ZV90eXBlKEtFWV9SU0ExLAorCQkgICAgX1BBVEhfSE9TVF9LRVlfRklMRSwgIiIsIE5VTEwsIE5VTEwpOworCQlzZW5zaXRpdmVfZGF0YS5rZXlzWzFdID0ga2V5X2xvYWRfcHJpdmF0ZV9jZXJ0KEtFWV9EU0EsCisJCSAgICBfUEFUSF9IT1NUX0RTQV9LRVlfRklMRSwgIiIsIE5VTEwpOworI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworCQlzZW5zaXRpdmVfZGF0YS5rZXlzWzJdID0ga2V5X2xvYWRfcHJpdmF0ZV9jZXJ0KEtFWV9FQ0RTQSwKKwkJICAgIF9QQVRIX0hPU1RfRUNEU0FfS0VZX0ZJTEUsICIiLCBOVUxMKTsKKyNlbmRpZgorCQlzZW5zaXRpdmVfZGF0YS5rZXlzWzNdID0ga2V5X2xvYWRfcHJpdmF0ZV9jZXJ0KEtFWV9SU0EsCisJCSAgICBfUEFUSF9IT1NUX1JTQV9LRVlfRklMRSwgIiIsIE5VTEwpOworCQlzZW5zaXRpdmVfZGF0YS5rZXlzWzRdID0ga2V5X2xvYWRfcHJpdmF0ZV90eXBlKEtFWV9EU0EsCisJCSAgICBfUEFUSF9IT1NUX0RTQV9LRVlfRklMRSwgIiIsIE5VTEwsIE5VTEwpOworI2lmZGVmIE9QRU5TU0xfSEFTX0VDQworCQlzZW5zaXRpdmVfZGF0YS5rZXlzWzVdID0ga2V5X2xvYWRfcHJpdmF0ZV90eXBlKEtFWV9FQ0RTQSwKKwkJICAgIF9QQVRIX0hPU1RfRUNEU0FfS0VZX0ZJTEUsICIiLCBOVUxMLCBOVUxMKTsKKyNlbmRpZgorCQlzZW5zaXRpdmVfZGF0YS5rZXlzWzZdID0ga2V5X2xvYWRfcHJpdmF0ZV90eXBlKEtFWV9SU0EsCisJCSAgICBfUEFUSF9IT1NUX1JTQV9LRVlfRklMRSwgIiIsIE5VTEwsIE5VTEwpOworCQlQUklWX0VORDsKKworCQlpZiAob3B0aW9ucy5ob3N0YmFzZWRfYXV0aGVudGljYXRpb24gPT0gMSAmJgorCQkgICAgc2Vuc2l0aXZlX2RhdGEua2V5c1swXSA9PSBOVUxMICYmCisJCSAgICBzZW5zaXRpdmVfZGF0YS5rZXlzWzRdID09IE5VTEwgJiYKKwkJICAgIHNlbnNpdGl2ZV9kYXRhLmtleXNbNV0gPT0gTlVMTCAmJgorCQkgICAgc2Vuc2l0aXZlX2RhdGEua2V5c1s2XSA9PSBOVUxMKSB7CisJCQlzZW5zaXRpdmVfZGF0YS5rZXlzWzFdID0ga2V5X2xvYWRfY2VydCgKKwkJCSAgICBfUEFUSF9IT1NUX0RTQV9LRVlfRklMRSk7CisjaWZkZWYgT1BFTlNTTF9IQVNfRUNDCisJCQlzZW5zaXRpdmVfZGF0YS5rZXlzWzJdID0ga2V5X2xvYWRfY2VydCgKKwkJCSAgICBfUEFUSF9IT1NUX0VDRFNBX0tFWV9GSUxFKTsKKyNlbmRpZgorCQkJc2Vuc2l0aXZlX2RhdGEua2V5c1szXSA9IGtleV9sb2FkX2NlcnQoCisJCQkgICAgX1BBVEhfSE9TVF9SU0FfS0VZX0ZJTEUpOworCQkJc2Vuc2l0aXZlX2RhdGEua2V5c1s0XSA9IGtleV9sb2FkX3B1YmxpYygKKwkJCSAgICBfUEFUSF9IT1NUX0RTQV9LRVlfRklMRSwgTlVMTCk7CisjaWZkZWYgT1BFTlNTTF9IQVNfRUNDCisJCQlzZW5zaXRpdmVfZGF0YS5rZXlzWzVdID0ga2V5X2xvYWRfcHVibGljKAorCQkJICAgIF9QQVRIX0hPU1RfRUNEU0FfS0VZX0ZJTEUsIE5VTEwpOworI2VuZGlmCisJCQlzZW5zaXRpdmVfZGF0YS5rZXlzWzZdID0ga2V5X2xvYWRfcHVibGljKAorCQkJICAgIF9QQVRIX0hPU1RfUlNBX0tFWV9GSUxFLCBOVUxMKTsKKwkJCXNlbnNpdGl2ZV9kYXRhLmV4dGVybmFsX2tleXNpZ24gPSAxOworCQl9CisJfQorCS8qCisJICogR2V0IHJpZCBvZiBhbnkgZXh0cmEgcHJpdmlsZWdlcyB0aGF0IHdlIG1heSBoYXZlLiAgV2Ugd2lsbCBubworCSAqIGxvbmdlciBuZWVkIHRoZW0uICBBbHNvLCBleHRyYSBwcml2aWxlZ2VzIGNvdWxkIG1ha2UgaXQgdmVyeSBoYXJkCisJICogdG8gcmVhZCBpZGVudGl0eSBmaWxlcyBhbmQgb3RoZXIgbm9uLXdvcmxkLXJlYWRhYmxlIGZpbGVzIGZyb20gdGhlCisJICogdXNlcidzIGhvbWUgZGlyZWN0b3J5IGlmIGl0IGhhcHBlbnMgdG8gYmUgb24gYSBORlMgdm9sdW1lIHdoZXJlCisJICogcm9vdCBpcyBtYXBwZWQgdG8gbm9ib2R5LgorCSAqLworCWlmIChvcmlnaW5hbF9lZmZlY3RpdmVfdWlkID09IDApIHsKKwkJUFJJVl9TVEFSVDsKKwkJcGVybWFuZW50bHlfc2V0X3VpZChwdyk7CisJfQorCisJLyoKKwkgKiBOb3cgdGhhdCB3ZSBhcmUgYmFjayB0byBvdXIgb3duIHBlcm1pc3Npb25zLCBjcmVhdGUgfi8uc3NoCisJICogZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4KKwkgKi8KKwlpZiAoY29uZmlnID09IE5VTEwpIHsKKwkJciA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIiVzJXMlcyIsIHB3LT5wd19kaXIsCisJCSAgICBzdHJjbXAocHctPnB3X2RpciwgIi8iKSA/ICIvIiA6ICIiLCBfUEFUSF9TU0hfVVNFUl9ESVIpOworCQlpZiAociA+IDAgJiYgKHNpemVfdClyIDwgc2l6ZW9mKGJ1ZikgJiYgc3RhdChidWYsICZzdCkgPCAwKSB7CisjaWZkZWYgV0lUSF9TRUxJTlVYCisJCQlzc2hfc2VsaW51eF9zZXRmc2NyZWF0ZWNvbihidWYpOworI2VuZGlmCisJCQlpZiAobWtkaXIoYnVmLCAwNzAwKSA8IDApCisJCQkJZXJyb3IoIkNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5ICclLjIwMHMnLiIsCisJCQkJICAgIGJ1Zik7CisjaWZkZWYgV0lUSF9TRUxJTlVYCisJCQlzc2hfc2VsaW51eF9zZXRmc2NyZWF0ZWNvbihOVUxMKTsKKyNlbmRpZgorCQl9CisJfQorCS8qIGxvYWQgb3B0aW9ucy5pZGVudGl0eV9maWxlcyAqLworCWxvYWRfcHVibGljX2lkZW50aXR5X2ZpbGVzKCk7CisKKwkvKiBFeHBhbmQgfiBpbiBrbm93biBob3N0IGZpbGUgbmFtZXMuICovCisJdGlsZGVfZXhwYW5kX3BhdGhzKG9wdGlvbnMuc3lzdGVtX2hvc3RmaWxlcywKKwkgICAgb3B0aW9ucy5udW1fc3lzdGVtX2hvc3RmaWxlcyk7CisJdGlsZGVfZXhwYW5kX3BhdGhzKG9wdGlvbnMudXNlcl9ob3N0ZmlsZXMsIG9wdGlvbnMubnVtX3VzZXJfaG9zdGZpbGVzKTsKKworCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsgLyogaWdub3JlIFNJR1BJUEUgZWFybHkgKi8KKwlzaWduYWwoU0lHQ0hMRCwgbWFpbl9zaWdjaGxkX2hhbmRsZXIpOworCisJLyogTG9nIGludG8gdGhlIHJlbW90ZSBzeXN0ZW0uICBOZXZlciByZXR1cm5zIGlmIHRoZSBsb2dpbiBmYWlscy4gKi8KKwlzc2hfbG9naW4oJnNlbnNpdGl2ZV9kYXRhLCBob3N0LCAoc3RydWN0IHNvY2thZGRyICopJmhvc3RhZGRyLAorCSAgICBvcHRpb25zLnBvcnQsIHB3LCB0aW1lb3V0X21zKTsKKworCWlmIChwYWNrZXRfY29ubmVjdGlvbl9pc19vbl9zb2NrZXQoKSkgeworCQl2ZXJib3NlKCJBdXRoZW50aWNhdGVkIHRvICVzIChbJXNdOiVkKS4iLCBob3N0LAorCQkgICAgZ2V0X3JlbW90ZV9pcGFkZHIoKSwgZ2V0X3JlbW90ZV9wb3J0KCkpOworCX0gZWxzZSB7CisJCXZlcmJvc2UoIkF1dGhlbnRpY2F0ZWQgdG8gJXMgKHZpYSBwcm94eSkuIiwgaG9zdCk7CisJfQorCisJLyogV2Ugbm8gbG9uZ2VyIG5lZWQgdGhlIHByaXZhdGUgaG9zdCBrZXlzLiAgQ2xlYXIgdGhlbSBub3cuICovCisJaWYgKHNlbnNpdGl2ZV9kYXRhLm5rZXlzICE9IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IHNlbnNpdGl2ZV9kYXRhLm5rZXlzOyBpKyspIHsKKwkJCWlmIChzZW5zaXRpdmVfZGF0YS5rZXlzW2ldICE9IE5VTEwpIHsKKwkJCQkvKiBEZXN0cm95cyBjb250ZW50cyBzYWZlbHkgKi8KKwkJCQlkZWJ1ZzMoImNsZWFyIGhvc3RrZXkgJWQiLCBpKTsKKwkJCQlrZXlfZnJlZShzZW5zaXRpdmVfZGF0YS5rZXlzW2ldKTsKKwkJCQlzZW5zaXRpdmVfZGF0YS5rZXlzW2ldID0gTlVMTDsKKwkJCX0KKwkJfQorCQl4ZnJlZShzZW5zaXRpdmVfZGF0YS5rZXlzKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubnVtX2lkZW50aXR5X2ZpbGVzOyBpKyspIHsKKwkJaWYgKG9wdGlvbnMuaWRlbnRpdHlfZmlsZXNbaV0pIHsKKwkJCXhmcmVlKG9wdGlvbnMuaWRlbnRpdHlfZmlsZXNbaV0pOworCQkJb3B0aW9ucy5pZGVudGl0eV9maWxlc1tpXSA9IE5VTEw7CisJCX0KKwkJaWYgKG9wdGlvbnMuaWRlbnRpdHlfa2V5c1tpXSkgeworCQkJa2V5X2ZyZWUob3B0aW9ucy5pZGVudGl0eV9rZXlzW2ldKTsKKwkJCW9wdGlvbnMuaWRlbnRpdHlfa2V5c1tpXSA9IE5VTEw7CisJCX0KKwl9CisKKwlleGl0X3N0YXR1cyA9IGNvbXBhdDIwID8gc3NoX3Nlc3Npb24yKCkgOiBzc2hfc2Vzc2lvbigpOworCXBhY2tldF9jbG9zZSgpOworCisJaWYgKG9wdGlvbnMuY29udHJvbF9wYXRoICE9IE5VTEwgJiYgbXV4c2VydmVyX3NvY2sgIT0gLTEpCisJCXVubGluayhvcHRpb25zLmNvbnRyb2xfcGF0aCk7CisKKwkvKiBLaWxsIFByb3h5Q29tbWFuZCBpZiBpdCBpcyBydW5uaW5nLiAqLworCXNzaF9raWxsX3Byb3h5X2NvbW1hbmQoKTsKKworCXJldHVybiBleGl0X3N0YXR1czsKK30KKworc3RhdGljIHZvaWQKK2NvbnRyb2xfcGVyc2lzdF9kZXRhY2godm9pZCkKK3sKKwlwaWRfdCBwaWQ7CisJaW50IGRldm51bGw7CisKKwlkZWJ1ZygiJXM6IGJhY2tncm91bmRpbmcgbWFzdGVyIHByb2Nlc3MiLCBfX2Z1bmNfXyk7CisKKyAJLyoKKyAJICogbWFzdGVyIChjdXJyZW50IHByb2Nlc3MpIGludG8gdGhlIGJhY2tncm91bmQsIGFuZCBtYWtlIHRoZQorIAkgKiBmb3JlZ3JvdW5kIHByb2Nlc3MgYSBjbGllbnQgb2YgdGhlIGJhY2tncm91bmRlZCBtYXN0ZXIuCisgCSAqLworCXN3aXRjaCAoKHBpZCA9IGZvcmsoKSkpIHsKKwljYXNlIC0xOgorCQlmYXRhbCgiJXM6IGZvcms6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJY2FzZSAwOgorCQkvKiBDaGlsZDogbWFzdGVyIHByb2Nlc3MgY29udGludWVzIG1haW5sb29wICovCisgCQlicmVhazsKKyAJZGVmYXVsdDoKKwkJLyogUGFyZW50OiBzZXQgdXAgbXV4IHNsYXZlIHRvIGNvbm5lY3QgdG8gYmFja2dyb3VuZGVkIG1hc3RlciAqLworCQlkZWJ1ZzIoIiVzOiBiYWNrZ3JvdW5kIHByb2Nlc3MgaXMgJWxkIiwgX19mdW5jX18sIChsb25nKXBpZCk7CisJCXN0ZGluX251bGxfZmxhZyA9IG9zdGRpbl9udWxsX2ZsYWc7CisJCW9wdGlvbnMucmVxdWVzdF90dHkgPSBvcmVxdWVzdF90dHk7CisJCXR0eV9mbGFnID0gb3R0eV9mbGFnOworIAkJY2xvc2UobXV4c2VydmVyX3NvY2spOworIAkJbXV4c2VydmVyX3NvY2sgPSAtMTsKKwkJb3B0aW9ucy5jb250cm9sX21hc3RlciA9IFNTSENUTF9NQVNURVJfTk87CisgCQltdXhjbGllbnQob3B0aW9ucy5jb250cm9sX3BhdGgpOworCQkvKiBtdXhjbGllbnQoKSBkb2Vzbid0IHJldHVybiBvbiBzdWNjZXNzLiAqLworIAkJZmF0YWwoIkZhaWxlZCB0byBjb25uZWN0IHRvIG5ldyBjb250cm9sIG1hc3RlciIpOworIAl9CisJaWYgKChkZXZudWxsID0gb3BlbihfUEFUSF9ERVZOVUxMLCBPX1JEV1IpKSA9PSAtMSkgeworCQllcnJvcigiJXM6IG9wZW4oXCIvZGV2L251bGxcIik6ICVzIiwgX19mdW5jX18sCisJCSAgICBzdHJlcnJvcihlcnJubykpOworCX0gZWxzZSB7CisJCWlmIChkdXAyKGRldm51bGwsIFNURElOX0ZJTEVOTykgPT0gLTEgfHwKKwkJICAgIGR1cDIoZGV2bnVsbCwgU1RET1VUX0ZJTEVOTykgPT0gLTEpCisJCQllcnJvcigiJXM6IGR1cDI6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJCWlmIChkZXZudWxsID4gU1RERVJSX0ZJTEVOTykKKwkJCWNsb3NlKGRldm51bGwpOworCX0KKwlzZXRwcm9jdGl0bGUoIiVzIFttdXhdIiwgb3B0aW9ucy5jb250cm9sX3BhdGgpOworfQorCisvKiBEbyBmb3JrKCkgYWZ0ZXIgYXV0aGVudGljYXRpb24uIFVzZWQgYnkgInNzaCAtZiIgKi8KK3N0YXRpYyB2b2lkCitmb3JrX3Bvc3RhdXRoKHZvaWQpCit7CisJaWYgKG5lZWRfY29udHJvbHBlcnNpc3RfZGV0YWNoKQorCQljb250cm9sX3BlcnNpc3RfZGV0YWNoKCk7CisJZGVidWcoImZvcmtpbmcgdG8gYmFja2dyb3VuZCIpOworCWZvcmtfYWZ0ZXJfYXV0aGVudGljYXRpb25fZmxhZyA9IDA7CisJaWYgKGRhZW1vbigxLCAxKSA8IDApCisJCWZhdGFsKCJkYWVtb24oKSBmYWlsZWQ6ICUuMjAwcyIsIHN0cmVycm9yKGVycm5vKSk7Cit9CisKKy8qIENhbGxiYWNrIGZvciByZW1vdGUgZm9yd2FyZCBnbG9iYWwgcmVxdWVzdHMgKi8KK3N0YXRpYyB2b2lkCitzc2hfY29uZmlybV9yZW1vdGVfZm9yd2FyZChpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKK3sKKwlGb3J3YXJkICpyZndkID0gKEZvcndhcmQgKiljdHh0OworCisJLyogWFhYIHZlcmJvc2UoKSBvbiBmYWlsdXJlPyAqLworCWRlYnVnKCJyZW1vdGUgZm9yd2FyZCAlcyBmb3I6IGxpc3RlbiAlZCwgY29ubmVjdCAlczolZCIsCisJICAgIHR5cGUgPT0gU1NIMl9NU0dfUkVRVUVTVF9TVUNDRVNTID8gInN1Y2Nlc3MiIDogImZhaWx1cmUiLAorCSAgICByZndkLT5saXN0ZW5fcG9ydCwgcmZ3ZC0+Y29ubmVjdF9ob3N0LCByZndkLT5jb25uZWN0X3BvcnQpOworCWlmIChyZndkLT5saXN0ZW5fcG9ydCA9PSAwKSB7CisJCWlmICh0eXBlID09IFNTSDJfTVNHX1JFUVVFU1RfU1VDQ0VTUykgeworCQkJcmZ3ZC0+YWxsb2NhdGVkX3BvcnQgPSBwYWNrZXRfZ2V0X2ludCgpOworCQkJbG9naXQoIkFsbG9jYXRlZCBwb3J0ICV1IGZvciByZW1vdGUgZm9yd2FyZCB0byAlczolZCIsCisJCQkgICAgcmZ3ZC0+YWxsb2NhdGVkX3BvcnQsCisJCQkgICAgcmZ3ZC0+Y29ubmVjdF9ob3N0LCByZndkLT5jb25uZWN0X3BvcnQpOworCQkJY2hhbm5lbF91cGRhdGVfcGVybWl0dGVkX29wZW5zKHJmd2QtPmhhbmRsZSwKKwkJCSAgICByZndkLT5hbGxvY2F0ZWRfcG9ydCk7CisJCX0gZWxzZSB7CisJCQljaGFubmVsX3VwZGF0ZV9wZXJtaXR0ZWRfb3BlbnMocmZ3ZC0+aGFuZGxlLCAtMSk7CisJCX0KKwl9CisJCisJaWYgKHR5cGUgPT0gU1NIMl9NU0dfUkVRVUVTVF9GQUlMVVJFKSB7CisJCWlmIChvcHRpb25zLmV4aXRfb25fZm9yd2FyZF9mYWlsdXJlKQorCQkJZmF0YWwoIkVycm9yOiByZW1vdGUgcG9ydCBmb3J3YXJkaW5nIGZhaWxlZCBmb3IgIgorCQkJICAgICJsaXN0ZW4gcG9ydCAlZCIsIHJmd2QtPmxpc3Rlbl9wb3J0KTsKKwkJZWxzZQorCQkJbG9naXQoIldhcm5pbmc6IHJlbW90ZSBwb3J0IGZvcndhcmRpbmcgZmFpbGVkIGZvciAiCisJCQkgICAgImxpc3RlbiBwb3J0ICVkIiwgcmZ3ZC0+bGlzdGVuX3BvcnQpOworCX0KKwlpZiAoKytyZW1vdGVfZm9yd2FyZF9jb25maXJtc19yZWNlaXZlZCA9PSBvcHRpb25zLm51bV9yZW1vdGVfZm9yd2FyZHMpIHsKKwkJZGVidWcoIkFsbCByZW1vdGUgZm9yd2FyZGluZyByZXF1ZXN0cyBwcm9jZXNzZWQiKTsKKwkJaWYgKGZvcmtfYWZ0ZXJfYXV0aGVudGljYXRpb25fZmxhZykKKwkJCWZvcmtfcG9zdGF1dGgoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjbGllbnRfY2xlYW51cF9zdGRpb19md2QoaW50IGlkLCB2b2lkICphcmcpCit7CisJZGVidWcoInN0ZGlvIGZvcndhcmRpbmc6IGRvbmUiKTsKKwljbGVhbnVwX2V4aXQoMCk7Cit9CisKK3N0YXRpYyB2b2lkCitzc2hfaW5pdF9zdGRpb19mb3J3YXJkaW5nKHZvaWQpCit7CisJQ2hhbm5lbCAqYzsKKwlpbnQgaW4sIG91dDsKKworCWlmIChzdGRpb19mb3J3YXJkX2hvc3QgPT0gTlVMTCkKKwkJcmV0dXJuOworCWlmICghY29tcGF0MjApIAorCQlmYXRhbCgic3RkaW8gZm9yd2FyZGluZyByZXF1aXJlIFByb3RvY29sIDIiKTsKKworCWRlYnVnMygiJXM6ICVzOiVkIiwgX19mdW5jX18sIHN0ZGlvX2ZvcndhcmRfaG9zdCwgc3RkaW9fZm9yd2FyZF9wb3J0KTsKKworCWlmICgoaW4gPSBkdXAoU1RESU5fRklMRU5PKSkgPCAwIHx8CisJICAgIChvdXQgPSBkdXAoU1RET1VUX0ZJTEVOTykpIDwgMCkKKwkJZmF0YWwoImNoYW5uZWxfY29ubmVjdF9zdGRpb19md2Q6IGR1cCgpIGluL291dCBmYWlsZWQiKTsKKwlpZiAoKGMgPSBjaGFubmVsX2Nvbm5lY3Rfc3RkaW9fZndkKHN0ZGlvX2ZvcndhcmRfaG9zdCwKKwkgICAgc3RkaW9fZm9yd2FyZF9wb3J0LCBpbiwgb3V0KSkgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBjaGFubmVsX2Nvbm5lY3Rfc3RkaW9fZndkIGZhaWxlZCIsIF9fZnVuY19fKTsKKwljaGFubmVsX3JlZ2lzdGVyX2NsZWFudXAoYy0+c2VsZiwgY2xpZW50X2NsZWFudXBfc3RkaW9fZndkLCAwKTsKK30KKworc3RhdGljIHZvaWQKK3NzaF9pbml0X2ZvcndhcmRpbmcodm9pZCkKK3sKKwlpbnQgc3VjY2VzcyA9IDA7CisJaW50IGk7CisKKwkvKiBJbml0aWF0ZSBsb2NhbCBUQ1AvSVAgcG9ydCBmb3J3YXJkaW5ncy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1fbG9jYWxfZm9yd2FyZHM7IGkrKykgeworCQlkZWJ1ZygiTG9jYWwgY29ubmVjdGlvbnMgdG8gJS4yMDBzOiVkIGZvcndhcmRlZCB0byByZW1vdGUgIgorCQkgICAgImFkZHJlc3MgJS4yMDBzOiVkIiwKKwkJICAgIChvcHRpb25zLmxvY2FsX2ZvcndhcmRzW2ldLmxpc3Rlbl9ob3N0ID09IE5VTEwpID8KKwkJICAgIChvcHRpb25zLmdhdGV3YXlfcG9ydHMgPyAiKiIgOiAiTE9DQUxIT1NUIikgOgorCQkgICAgb3B0aW9ucy5sb2NhbF9mb3J3YXJkc1tpXS5saXN0ZW5faG9zdCwKKwkJICAgIG9wdGlvbnMubG9jYWxfZm9yd2FyZHNbaV0ubGlzdGVuX3BvcnQsCisJCSAgICBvcHRpb25zLmxvY2FsX2ZvcndhcmRzW2ldLmNvbm5lY3RfaG9zdCwKKwkJICAgIG9wdGlvbnMubG9jYWxfZm9yd2FyZHNbaV0uY29ubmVjdF9wb3J0KTsKKwkJc3VjY2VzcyArPSBjaGFubmVsX3NldHVwX2xvY2FsX2Z3ZF9saXN0ZW5lcigKKwkJICAgIG9wdGlvbnMubG9jYWxfZm9yd2FyZHNbaV0ubGlzdGVuX2hvc3QsCisJCSAgICBvcHRpb25zLmxvY2FsX2ZvcndhcmRzW2ldLmxpc3Rlbl9wb3J0LAorCQkgICAgb3B0aW9ucy5sb2NhbF9mb3J3YXJkc1tpXS5jb25uZWN0X2hvc3QsCisJCSAgICBvcHRpb25zLmxvY2FsX2ZvcndhcmRzW2ldLmNvbm5lY3RfcG9ydCwKKwkJICAgIG9wdGlvbnMuZ2F0ZXdheV9wb3J0cyk7CisJfQorCWlmIChpID4gMCAmJiBzdWNjZXNzICE9IGkgJiYgb3B0aW9ucy5leGl0X29uX2ZvcndhcmRfZmFpbHVyZSkKKwkJZmF0YWwoIkNvdWxkIG5vdCByZXF1ZXN0IGxvY2FsIGZvcndhcmRpbmcuIik7CisJaWYgKGkgPiAwICYmIHN1Y2Nlc3MgPT0gMCkKKwkJZXJyb3IoIkNvdWxkIG5vdCByZXF1ZXN0IGxvY2FsIGZvcndhcmRpbmcuIik7CisKKwkvKiBJbml0aWF0ZSByZW1vdGUgVENQL0lQIHBvcnQgZm9yd2FyZGluZ3MuICovCisJZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubnVtX3JlbW90ZV9mb3J3YXJkczsgaSsrKSB7CisJCWRlYnVnKCJSZW1vdGUgY29ubmVjdGlvbnMgZnJvbSAlLjIwMHM6JWQgZm9yd2FyZGVkIHRvICIKKwkJICAgICJsb2NhbCBhZGRyZXNzICUuMjAwczolZCIsCisJCSAgICAob3B0aW9ucy5yZW1vdGVfZm9yd2FyZHNbaV0ubGlzdGVuX2hvc3QgPT0gTlVMTCkgPworCQkgICAgIkxPQ0FMSE9TVCIgOiBvcHRpb25zLnJlbW90ZV9mb3J3YXJkc1tpXS5saXN0ZW5faG9zdCwKKwkJICAgIG9wdGlvbnMucmVtb3RlX2ZvcndhcmRzW2ldLmxpc3Rlbl9wb3J0LAorCQkgICAgb3B0aW9ucy5yZW1vdGVfZm9yd2FyZHNbaV0uY29ubmVjdF9ob3N0LAorCQkgICAgb3B0aW9ucy5yZW1vdGVfZm9yd2FyZHNbaV0uY29ubmVjdF9wb3J0KTsKKwkJb3B0aW9ucy5yZW1vdGVfZm9yd2FyZHNbaV0uaGFuZGxlID0KKwkJICAgIGNoYW5uZWxfcmVxdWVzdF9yZW1vdGVfZm9yd2FyZGluZygKKwkJICAgIG9wdGlvbnMucmVtb3RlX2ZvcndhcmRzW2ldLmxpc3Rlbl9ob3N0LAorCQkgICAgb3B0aW9ucy5yZW1vdGVfZm9yd2FyZHNbaV0ubGlzdGVuX3BvcnQsCisJCSAgICBvcHRpb25zLnJlbW90ZV9mb3J3YXJkc1tpXS5jb25uZWN0X2hvc3QsCisJCSAgICBvcHRpb25zLnJlbW90ZV9mb3J3YXJkc1tpXS5jb25uZWN0X3BvcnQpOworCQlpZiAob3B0aW9ucy5yZW1vdGVfZm9yd2FyZHNbaV0uaGFuZGxlIDwgMCkgeworCQkJaWYgKG9wdGlvbnMuZXhpdF9vbl9mb3J3YXJkX2ZhaWx1cmUpCisJCQkJZmF0YWwoIkNvdWxkIG5vdCByZXF1ZXN0IHJlbW90ZSBmb3J3YXJkaW5nLiIpOworCQkJZWxzZQorCQkJCWxvZ2l0KCJXYXJuaW5nOiBDb3VsZCBub3QgcmVxdWVzdCByZW1vdGUgIgorCQkJCSAgICAiZm9yd2FyZGluZy4iKTsKKwkJfSBlbHNlIHsKKwkJCWNsaWVudF9yZWdpc3Rlcl9nbG9iYWxfY29uZmlybShzc2hfY29uZmlybV9yZW1vdGVfZm9yd2FyZCwKKwkJCSAgICAmb3B0aW9ucy5yZW1vdGVfZm9yd2FyZHNbaV0pOworCQl9CisJfQorCisJLyogSW5pdGlhdGUgdHVubmVsIGZvcndhcmRpbmcuICovCisJaWYgKG9wdGlvbnMudHVuX29wZW4gIT0gU1NIX1RVTk1PREVfTk8pIHsKKwkJaWYgKGNsaWVudF9yZXF1ZXN0X3R1bl9md2Qob3B0aW9ucy50dW5fb3BlbiwKKwkJICAgIG9wdGlvbnMudHVuX2xvY2FsLCBvcHRpb25zLnR1bl9yZW1vdGUpID09IC0xKSB7CisJCQlpZiAob3B0aW9ucy5leGl0X29uX2ZvcndhcmRfZmFpbHVyZSkKKwkJCQlmYXRhbCgiQ291bGQgbm90IHJlcXVlc3QgdHVubmVsIGZvcndhcmRpbmcuIik7CisJCQllbHNlCisJCQkJZXJyb3IoIkNvdWxkIG5vdCByZXF1ZXN0IHR1bm5lbCBmb3J3YXJkaW5nLiIpOworCQl9CisJfQkJCQorfQorCitzdGF0aWMgdm9pZAorY2hlY2tfYWdlbnRfcHJlc2VudCh2b2lkKQoreworCWlmIChvcHRpb25zLmZvcndhcmRfYWdlbnQpIHsKKwkJLyogQ2xlYXIgYWdlbnQgZm9yd2FyZGluZyBpZiB3ZSBkb24ndCBoYXZlIGFuIGFnZW50LiAqLworCQlpZiAoIXNzaF9hZ2VudF9wcmVzZW50KCkpCisJCQlvcHRpb25zLmZvcndhcmRfYWdlbnQgPSAwOworCX0KK30KKworc3RhdGljIGludAorc3NoX3Nlc3Npb24odm9pZCkKK3sKKwlpbnQgdHlwZTsKKwlpbnQgaW50ZXJhY3RpdmUgPSAwOworCWludCBoYXZlX3R0eSA9IDA7CisJc3RydWN0IHdpbnNpemUgd3M7CisJY2hhciAqY3A7CisJY29uc3QgY2hhciAqZGlzcGxheTsKKworCS8qIEVuYWJsZSBjb21wcmVzc2lvbiBpZiByZXF1ZXN0ZWQuICovCisJaWYgKG9wdGlvbnMuY29tcHJlc3Npb24pIHsKKwkJZGVidWcoIlJlcXVlc3RpbmcgY29tcHJlc3Npb24gYXQgbGV2ZWwgJWQuIiwKKwkJICAgIG9wdGlvbnMuY29tcHJlc3Npb25fbGV2ZWwpOworCisJCWlmIChvcHRpb25zLmNvbXByZXNzaW9uX2xldmVsIDwgMSB8fAorCQkgICAgb3B0aW9ucy5jb21wcmVzc2lvbl9sZXZlbCA+IDkpCisJCQlmYXRhbCgiQ29tcHJlc3Npb24gbGV2ZWwgbXVzdCBiZSBmcm9tIDEgKGZhc3QpIHRvICIKKwkJCSAgICAiOSAoc2xvdywgYmVzdCkuIik7CisKKwkJLyogU2VuZCB0aGUgcmVxdWVzdC4gKi8KKwkJcGFja2V0X3N0YXJ0KFNTSF9DTVNHX1JFUVVFU1RfQ09NUFJFU1NJT04pOworCQlwYWNrZXRfcHV0X2ludChvcHRpb25zLmNvbXByZXNzaW9uX2xldmVsKTsKKwkJcGFja2V0X3NlbmQoKTsKKwkJcGFja2V0X3dyaXRlX3dhaXQoKTsKKwkJdHlwZSA9IHBhY2tldF9yZWFkKCk7CisJCWlmICh0eXBlID09IFNTSF9TTVNHX1NVQ0NFU1MpCisJCQlwYWNrZXRfc3RhcnRfY29tcHJlc3Npb24ob3B0aW9ucy5jb21wcmVzc2lvbl9sZXZlbCk7CisJCWVsc2UgaWYgKHR5cGUgPT0gU1NIX1NNU0dfRkFJTFVSRSkKKwkJCWxvZ2l0KCJXYXJuaW5nOiBSZW1vdGUgaG9zdCByZWZ1c2VkIGNvbXByZXNzaW9uLiIpOworCQllbHNlCisJCQlwYWNrZXRfZGlzY29ubmVjdCgiUHJvdG9jb2wgZXJyb3Igd2FpdGluZyBmb3IgIgorCQkJICAgICJjb21wcmVzc2lvbiByZXNwb25zZS4iKTsKKwl9CisJLyogQWxsb2NhdGUgYSBwc2V1ZG8gdHR5IGlmIGFwcHJvcHJpYXRlLiAqLworCWlmICh0dHlfZmxhZykgeworCQlkZWJ1ZygiUmVxdWVzdGluZyBwdHkuIik7CisKKwkJLyogU3RhcnQgdGhlIHBhY2tldC4gKi8KKwkJcGFja2V0X3N0YXJ0KFNTSF9DTVNHX1JFUVVFU1RfUFRZKTsKKworCQkvKiBTdG9yZSBURVJNIGluIHRoZSBwYWNrZXQuICBUaGVyZSBpcyBubyBsaW1pdCBvbiB0aGUKKwkJICAgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuICovCisJCWNwID0gZ2V0ZW52KCJURVJNIik7CisJCWlmICghY3ApCisJCQljcCA9ICIiOworCQlwYWNrZXRfcHV0X2NzdHJpbmcoY3ApOworCisJCS8qIFN0b3JlIHdpbmRvdyBzaXplIGluIHRoZSBwYWNrZXQuICovCisJCWlmIChpb2N0bChmaWxlbm8oc3RkaW4pLCBUSU9DR1dJTlNaLCAmd3MpIDwgMCkKKwkJCW1lbXNldCgmd3MsIDAsIHNpemVvZih3cykpOworCQlwYWNrZXRfcHV0X2ludCgodV9pbnQpd3Mud3Nfcm93KTsKKwkJcGFja2V0X3B1dF9pbnQoKHVfaW50KXdzLndzX2NvbCk7CisJCXBhY2tldF9wdXRfaW50KCh1X2ludCl3cy53c194cGl4ZWwpOworCQlwYWNrZXRfcHV0X2ludCgodV9pbnQpd3Mud3NfeXBpeGVsKTsKKworCQkvKiBTdG9yZSB0dHkgbW9kZXMgaW4gdGhlIHBhY2tldC4gKi8KKwkJdHR5X21ha2VfbW9kZXMoZmlsZW5vKHN0ZGluKSwgTlVMTCk7CisKKwkJLyogU2VuZCB0aGUgcGFja2V0LCBhbmQgd2FpdCBmb3IgaXQgdG8gbGVhdmUuICovCisJCXBhY2tldF9zZW5kKCk7CisJCXBhY2tldF93cml0ZV93YWl0KCk7CisKKwkJLyogUmVhZCByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuICovCisJCXR5cGUgPSBwYWNrZXRfcmVhZCgpOworCQlpZiAodHlwZSA9PSBTU0hfU01TR19TVUNDRVNTKSB7CisJCQlpbnRlcmFjdGl2ZSA9IDE7CisJCQloYXZlX3R0eSA9IDE7CisJCX0gZWxzZSBpZiAodHlwZSA9PSBTU0hfU01TR19GQUlMVVJFKQorCQkJbG9naXQoIldhcm5pbmc6IFJlbW90ZSBob3N0IGZhaWxlZCBvciByZWZ1c2VkIHRvICIKKwkJCSAgICAiYWxsb2NhdGUgYSBwc2V1ZG8gdHR5LiIpOworCQllbHNlCisJCQlwYWNrZXRfZGlzY29ubmVjdCgiUHJvdG9jb2wgZXJyb3Igd2FpdGluZyBmb3IgcHR5ICIKKwkJCSAgICAicmVxdWVzdCByZXNwb25zZS4iKTsKKwl9CisJLyogUmVxdWVzdCBYMTEgZm9yd2FyZGluZyBpZiBlbmFibGVkIGFuZCBESVNQTEFZIGlzIHNldC4gKi8KKwlkaXNwbGF5ID0gZ2V0ZW52KCJESVNQTEFZIik7CisJaWYgKG9wdGlvbnMuZm9yd2FyZF94MTEgJiYgZGlzcGxheSAhPSBOVUxMKSB7CisJCWNoYXIgKnByb3RvLCAqZGF0YTsKKwkJLyogR2V0IHJlYXNvbmFibGUgbG9jYWwgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24uICovCisJCWNsaWVudF94MTFfZ2V0X3Byb3RvKGRpc3BsYXksIG9wdGlvbnMueGF1dGhfbG9jYXRpb24sCisJCSAgICBvcHRpb25zLmZvcndhcmRfeDExX3RydXN0ZWQsIAorCQkgICAgb3B0aW9ucy5mb3J3YXJkX3gxMV90aW1lb3V0LAorCQkgICAgJnByb3RvLCAmZGF0YSk7CisJCS8qIFJlcXVlc3QgZm9yd2FyZGluZyB3aXRoIGF1dGhlbnRpY2F0aW9uIHNwb29maW5nLiAqLworCQlkZWJ1ZygiUmVxdWVzdGluZyBYMTEgZm9yd2FyZGluZyB3aXRoIGF1dGhlbnRpY2F0aW9uICIKKwkJICAgICJzcG9vZmluZy4iKTsKKwkJeDExX3JlcXVlc3RfZm9yd2FyZGluZ193aXRoX3Nwb29maW5nKDAsIGRpc3BsYXksIHByb3RvLAorCQkgICAgZGF0YSwgMCk7CisJCS8qIFJlYWQgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiAqLworCQl0eXBlID0gcGFja2V0X3JlYWQoKTsKKwkJaWYgKHR5cGUgPT0gU1NIX1NNU0dfU1VDQ0VTUykgeworCQkJaW50ZXJhY3RpdmUgPSAxOworCQl9IGVsc2UgaWYgKHR5cGUgPT0gU1NIX1NNU0dfRkFJTFVSRSkgeworCQkJbG9naXQoIldhcm5pbmc6IFJlbW90ZSBob3N0IGRlbmllZCBYMTEgZm9yd2FyZGluZy4iKTsKKwkJfSBlbHNlIHsKKwkJCXBhY2tldF9kaXNjb25uZWN0KCJQcm90b2NvbCBlcnJvciB3YWl0aW5nIGZvciBYMTEgIgorCQkJICAgICJmb3J3YXJkaW5nIik7CisJCX0KKwl9CisJLyogVGVsbCB0aGUgcGFja2V0IG1vZHVsZSB3aGV0aGVyIHRoaXMgaXMgYW4gaW50ZXJhY3RpdmUgc2Vzc2lvbi4gKi8KKwlwYWNrZXRfc2V0X2ludGVyYWN0aXZlKGludGVyYWN0aXZlLAorCSAgICBvcHRpb25zLmlwX3Fvc19pbnRlcmFjdGl2ZSwgb3B0aW9ucy5pcF9xb3NfYnVsayk7CisKKwkvKiBSZXF1ZXN0IGF1dGhlbnRpY2F0aW9uIGFnZW50IGZvcndhcmRpbmcgaWYgYXBwcm9wcmlhdGUuICovCisJY2hlY2tfYWdlbnRfcHJlc2VudCgpOworCisJaWYgKG9wdGlvbnMuZm9yd2FyZF9hZ2VudCkgeworCQlkZWJ1ZygiUmVxdWVzdGluZyBhdXRoZW50aWNhdGlvbiBhZ2VudCBmb3J3YXJkaW5nLiIpOworCQlhdXRoX3JlcXVlc3RfZm9yd2FyZGluZygpOworCisJCS8qIFJlYWQgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiAqLworCQl0eXBlID0gcGFja2V0X3JlYWQoKTsKKwkJcGFja2V0X2NoZWNrX2VvbSgpOworCQlpZiAodHlwZSAhPSBTU0hfU01TR19TVUNDRVNTKQorCQkJbG9naXQoIldhcm5pbmc6IFJlbW90ZSBob3N0IGRlbmllZCBhdXRoZW50aWNhdGlvbiBhZ2VudCBmb3J3YXJkaW5nLiIpOworCX0KKworCS8qIEluaXRpYXRlIHBvcnQgZm9yd2FyZGluZ3MuICovCisJc3NoX2luaXRfc3RkaW9fZm9yd2FyZGluZygpOworCXNzaF9pbml0X2ZvcndhcmRpbmcoKTsKKworCS8qIEV4ZWN1dGUgYSBsb2NhbCBjb21tYW5kICovCisJaWYgKG9wdGlvbnMubG9jYWxfY29tbWFuZCAhPSBOVUxMICYmCisJICAgIG9wdGlvbnMucGVybWl0X2xvY2FsX2NvbW1hbmQpCisJCXNzaF9sb2NhbF9jbWQob3B0aW9ucy5sb2NhbF9jb21tYW5kKTsKKworCS8qCisJICogSWYgcmVxdWVzdGVkIGFuZCB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gcmVwbGllcyB0byByZW1vdGUKKwkgKiBmb3J3YXJkaW5nIHJlcXVlc3RzLCB0aGVuIGxldCBzc2ggY29udGludWUgaW4gdGhlIGJhY2tncm91bmQuCisJICovCisJaWYgKGZvcmtfYWZ0ZXJfYXV0aGVudGljYXRpb25fZmxhZykgeworCQlpZiAob3B0aW9ucy5leGl0X29uX2ZvcndhcmRfZmFpbHVyZSAmJgorCQkgICAgb3B0aW9ucy5udW1fcmVtb3RlX2ZvcndhcmRzID4gMCkgeworCQkJZGVidWcoImRlZmVycmluZyBwb3N0YXV0aCBmb3JrIHVudGlsIHJlbW90ZSBmb3J3YXJkICIKKwkJCSAgICAiY29uZmlybWF0aW9uIHJlY2VpdmVkIik7CisJCX0gZWxzZQorCQkJZm9ya19wb3N0YXV0aCgpOworCX0KKworCS8qCisJICogSWYgYSBjb21tYW5kIHdhcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgZXhlY3V0ZSB0aGUKKwkgKiBjb21tYW5kIG5vdy4gT3RoZXJ3aXNlIHJlcXVlc3QgdGhlIHNlcnZlciB0byBzdGFydCBhIHNoZWxsLgorCSAqLworCWlmIChidWZmZXJfbGVuKCZjb21tYW5kKSA+IDApIHsKKwkJaW50IGxlbiA9IGJ1ZmZlcl9sZW4oJmNvbW1hbmQpOworCQlpZiAobGVuID4gOTAwKQorCQkJbGVuID0gOTAwOworCQlkZWJ1ZygiU2VuZGluZyBjb21tYW5kOiAlLipzIiwgbGVuLAorCQkgICAgKHVfY2hhciAqKWJ1ZmZlcl9wdHIoJmNvbW1hbmQpKTsKKwkJcGFja2V0X3N0YXJ0KFNTSF9DTVNHX0VYRUNfQ01EKTsKKwkJcGFja2V0X3B1dF9zdHJpbmcoYnVmZmVyX3B0cigmY29tbWFuZCksIGJ1ZmZlcl9sZW4oJmNvbW1hbmQpKTsKKwkJcGFja2V0X3NlbmQoKTsKKwkJcGFja2V0X3dyaXRlX3dhaXQoKTsKKwl9IGVsc2UgeworCQlkZWJ1ZygiUmVxdWVzdGluZyBzaGVsbC4iKTsKKwkJcGFja2V0X3N0YXJ0KFNTSF9DTVNHX0VYRUNfU0hFTEwpOworCQlwYWNrZXRfc2VuZCgpOworCQlwYWNrZXRfd3JpdGVfd2FpdCgpOworCX0KKworCS8qIEVudGVyIHRoZSBpbnRlcmFjdGl2ZSBzZXNzaW9uLiAqLworCXJldHVybiBjbGllbnRfbG9vcChoYXZlX3R0eSwgdHR5X2ZsYWcgPworCSAgICBvcHRpb25zLmVzY2FwZV9jaGFyIDogU1NIX0VTQ0FQRUNIQVJfTk9ORSwgMCk7Cit9CisKKy8qIHJlcXVlc3QgcHR5L3gxMS9hZ2VudC90Y3Bmd2Qvc2hlbGwgZm9yIGNoYW5uZWwgKi8KK3N0YXRpYyB2b2lkCitzc2hfc2Vzc2lvbjJfc2V0dXAoaW50IGlkLCBpbnQgc3VjY2Vzcywgdm9pZCAqYXJnKQoreworCWV4dGVybiBjaGFyICoqZW52aXJvbjsKKwljb25zdCBjaGFyICpkaXNwbGF5OworCWludCBpbnRlcmFjdGl2ZSA9IHR0eV9mbGFnOworCisJaWYgKCFzdWNjZXNzKQorCQlyZXR1cm47IC8qIE5vIG5lZWQgZm9yIGVycm9yIG1lc3NhZ2UsIGNoYW5uZWxzIGNvZGUgc2VucyBvbmUgKi8KKworCWRpc3BsYXkgPSBnZXRlbnYoIkRJU1BMQVkiKTsKKwlpZiAob3B0aW9ucy5mb3J3YXJkX3gxMSAmJiBkaXNwbGF5ICE9IE5VTEwpIHsKKwkJY2hhciAqcHJvdG8sICpkYXRhOworCQkvKiBHZXQgcmVhc29uYWJsZSBsb2NhbCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbi4gKi8KKwkJY2xpZW50X3gxMV9nZXRfcHJvdG8oZGlzcGxheSwgb3B0aW9ucy54YXV0aF9sb2NhdGlvbiwKKwkJICAgIG9wdGlvbnMuZm9yd2FyZF94MTFfdHJ1c3RlZCwKKwkJICAgIG9wdGlvbnMuZm9yd2FyZF94MTFfdGltZW91dCwgJnByb3RvLCAmZGF0YSk7CisJCS8qIFJlcXVlc3QgZm9yd2FyZGluZyB3aXRoIGF1dGhlbnRpY2F0aW9uIHNwb29maW5nLiAqLworCQlkZWJ1ZygiUmVxdWVzdGluZyBYMTEgZm9yd2FyZGluZyB3aXRoIGF1dGhlbnRpY2F0aW9uICIKKwkJICAgICJzcG9vZmluZy4iKTsKKwkJeDExX3JlcXVlc3RfZm9yd2FyZGluZ193aXRoX3Nwb29maW5nKGlkLCBkaXNwbGF5LCBwcm90bywKKwkJICAgIGRhdGEsIDEpOworCQljbGllbnRfZXhwZWN0X2NvbmZpcm0oaWQsICJYMTEgZm9yd2FyZGluZyIsIENPTkZJUk1fV0FSTik7CisJCS8qIFhYWCBleGl0X29uX2ZvcndhcmRfZmFpbHVyZSAqLworCQlpbnRlcmFjdGl2ZSA9IDE7CisJfQorCisJY2hlY2tfYWdlbnRfcHJlc2VudCgpOworCWlmIChvcHRpb25zLmZvcndhcmRfYWdlbnQpIHsKKwkJZGVidWcoIlJlcXVlc3RpbmcgYXV0aGVudGljYXRpb24gYWdlbnQgZm9yd2FyZGluZy4iKTsKKwkJY2hhbm5lbF9yZXF1ZXN0X3N0YXJ0KGlkLCAiYXV0aC1hZ2VudC1yZXFAb3BlbnNzaC5jb20iLCAwKTsKKwkJcGFja2V0X3NlbmQoKTsKKwl9CisKKwljbGllbnRfc2Vzc2lvbjJfc2V0dXAoaWQsIHR0eV9mbGFnLCBzdWJzeXN0ZW1fZmxhZywgZ2V0ZW52KCJURVJNIiksCisJICAgIE5VTEwsIGZpbGVubyhzdGRpbiksICZjb21tYW5kLCBlbnZpcm9uKTsKK30KKworLyogb3BlbiBuZXcgY2hhbm5lbCBmb3IgYSBzZXNzaW9uICovCitzdGF0aWMgaW50Citzc2hfc2Vzc2lvbjJfb3Blbih2b2lkKQoreworCUNoYW5uZWwgKmM7CisJaW50IHdpbmRvdywgcGFja2V0bWF4LCBpbiwgb3V0LCBlcnI7CisKKwlpZiAoc3RkaW5fbnVsbF9mbGFnKSB7CisJCWluID0gb3BlbihfUEFUSF9ERVZOVUxMLCBPX1JET05MWSk7CisJfSBlbHNlIHsKKwkJaW4gPSBkdXAoU1RESU5fRklMRU5PKTsKKwl9CisJb3V0ID0gZHVwKFNURE9VVF9GSUxFTk8pOworCWVyciA9IGR1cChTVERFUlJfRklMRU5PKTsKKworCWlmIChpbiA8IDAgfHwgb3V0IDwgMCB8fCBlcnIgPCAwKQorCQlmYXRhbCgiZHVwKCkgaW4vb3V0L2VyciBmYWlsZWQiKTsKKworCS8qIGVuYWJsZSBub25ibG9ja2luZyB1bmxlc3MgdHR5ICovCisJaWYgKCFpc2F0dHkoaW4pKQorCQlzZXRfbm9uYmxvY2soaW4pOworCWlmICghaXNhdHR5KG91dCkpCisJCXNldF9ub25ibG9jayhvdXQpOworCWlmICghaXNhdHR5KGVycikpCisJCXNldF9ub25ibG9jayhlcnIpOworCisJd2luZG93ID0gQ0hBTl9TRVNfV0lORE9XX0RFRkFVTFQ7CisJcGFja2V0bWF4ID0gQ0hBTl9TRVNfUEFDS0VUX0RFRkFVTFQ7CisJaWYgKHR0eV9mbGFnKSB7CisJCXdpbmRvdyA+Pj0gMTsKKwkJcGFja2V0bWF4ID4+PSAxOworCX0KKwljID0gY2hhbm5lbF9uZXcoCisJICAgICJzZXNzaW9uIiwgU1NIX0NIQU5ORUxfT1BFTklORywgaW4sIG91dCwgZXJyLAorCSAgICB3aW5kb3csIHBhY2tldG1heCwgQ0hBTl9FWFRFTkRFRF9XUklURSwKKwkgICAgImNsaWVudC1zZXNzaW9uIiwgLypub25ibG9jayovMCk7CisKKwlkZWJ1ZzMoInNzaF9zZXNzaW9uMl9vcGVuOiBjaGFubmVsX25ldzogJWQiLCBjLT5zZWxmKTsKKworCWNoYW5uZWxfc2VuZF9vcGVuKGMtPnNlbGYpOworCWlmICghbm9fc2hlbGxfZmxhZykKKwkJY2hhbm5lbF9yZWdpc3Rlcl9vcGVuX2NvbmZpcm0oYy0+c2VsZiwKKwkJICAgIHNzaF9zZXNzaW9uMl9zZXR1cCwgTlVMTCk7CisKKwlyZXR1cm4gYy0+c2VsZjsKK30KKworc3RhdGljIGludAorc3NoX3Nlc3Npb24yKHZvaWQpCit7CisJaW50IGlkID0gLTE7CisKKwkvKiBYWFggc2hvdWxkIGJlIHByZS1zZXNzaW9uICovCisJaWYgKCFvcHRpb25zLmNvbnRyb2xfcGVyc2lzdCkKKwkJc3NoX2luaXRfc3RkaW9fZm9yd2FyZGluZygpOworCXNzaF9pbml0X2ZvcndhcmRpbmcoKTsKKworCS8qIFN0YXJ0IGxpc3RlbmluZyBmb3IgbXVsdGlwbGV4IGNsaWVudHMgKi8KKwltdXhzZXJ2ZXJfbGlzdGVuKCk7CisKKyAJLyoKKwkgKiBJZiB3ZSBhcmUgaW4gY29udHJvbCBwZXJzaXN0IG1vZGUgYW5kIGhhdmUgYSB3b3JraW5nIG11eCBsaXN0ZW4KKwkgKiBzb2NrZXQsIHRoZW4gcHJlcGFyZSB0byBiYWNrZ3JvdW5kIG91cnNlbHZlcyBhbmQgaGF2ZSBhIGZvcmVncm91bmQKKwkgKiBjbGllbnQgYXR0YWNoIGFzIGEgY29udHJvbCBzbGF2ZS4KKwkgKiBOQi4gd2UgbXVzdCBzYXZlIGNvcGllcyBvZiB0aGUgZmxhZ3MgdGhhdCB3ZSBvdmVycmlkZSBmb3IKKwkgKiB0aGUgYmFja2dyb3VuZGluZywgc2luY2Ugd2UgZGVmZXIgYXR0YWNobWVudCBvZiB0aGUgc2xhdmUgdW50aWwKKwkgKiBhZnRlciB0aGUgY29ubmVjdGlvbiBpcyBmdWxseSBlc3RhYmxpc2hlZCAoaW4gcGFydGljdWxhciwKKwkgKiBhc3luYyByZndkIHJlcGxpZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIGZvciBFeGl0T25Gb3J3YXJkRmFpbHVyZSkuCisJICovCisgCWlmIChvcHRpb25zLmNvbnRyb2xfcGVyc2lzdCAmJiBtdXhzZXJ2ZXJfc29jayAhPSAtMSkgeworCQlvc3RkaW5fbnVsbF9mbGFnID0gc3RkaW5fbnVsbF9mbGFnOworCQlvbm9fc2hlbGxfZmxhZyA9IG5vX3NoZWxsX2ZsYWc7CisJCW9yZXF1ZXN0X3R0eSA9IG9wdGlvbnMucmVxdWVzdF90dHk7CisJCW90dHlfZmxhZyA9IHR0eV9mbGFnOworIAkJc3RkaW5fbnVsbF9mbGFnID0gMTsKKyAJCW5vX3NoZWxsX2ZsYWcgPSAxOworIAkJdHR5X2ZsYWcgPSAwOworCQlpZiAoIWZvcmtfYWZ0ZXJfYXV0aGVudGljYXRpb25fZmxhZykKKwkJCW5lZWRfY29udHJvbHBlcnNpc3RfZGV0YWNoID0gMTsKKwkJZm9ya19hZnRlcl9hdXRoZW50aWNhdGlvbl9mbGFnID0gMTsKKyAJfQorCS8qCisJICogQ29udHJvbFBlcnNpc3QgbXV4IGxpc3RlbiBzb2NrZXQgc2V0dXAgZmFpbGVkLCBhdHRlbXB0IHRoZQorCSAqIHN0ZGlvIGZvcndhcmQgc2V0dXAgdGhhdCB3ZSBza2lwcGVkIGVhcmxpZXIuCisJICovCisJaWYgKG9wdGlvbnMuY29udHJvbF9wZXJzaXN0ICYmIG11eHNlcnZlcl9zb2NrID09IC0xKQorCQlzc2hfaW5pdF9zdGRpb19mb3J3YXJkaW5nKCk7CisKKwlpZiAoIW5vX3NoZWxsX2ZsYWcgfHwgKGRhdGFmZWxsb3dzICYgU1NIX0JVR19EVU1NWUNIQU4pKQorCQlpZCA9IHNzaF9zZXNzaW9uMl9vcGVuKCk7CisKKwkvKiBJZiB3ZSBkb24ndCBleHBlY3QgdG8gb3BlbiBhIG5ldyBzZXNzaW9uLCB0aGVuIGRpc2FsbG93IGl0ICovCisJaWYgKG9wdGlvbnMuY29udHJvbF9tYXN0ZXIgPT0gU1NIQ1RMX01BU1RFUl9OTyAmJgorCSAgICAoZGF0YWZlbGxvd3MgJiBTU0hfTkVXX09QRU5TU0gpKSB7CisJCWRlYnVnKCJSZXF1ZXN0aW5nIG5vLW1vcmUtc2Vzc2lvbnNAb3BlbnNzaC5jb20iKTsKKwkJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0dMT0JBTF9SRVFVRVNUKTsKKwkJcGFja2V0X3B1dF9jc3RyaW5nKCJuby1tb3JlLXNlc3Npb25zQG9wZW5zc2guY29tIik7CisJCXBhY2tldF9wdXRfY2hhcigwKTsKKwkJcGFja2V0X3NlbmQoKTsKKwl9CisKKwkvKiBFeGVjdXRlIGEgbG9jYWwgY29tbWFuZCAqLworCWlmIChvcHRpb25zLmxvY2FsX2NvbW1hbmQgIT0gTlVMTCAmJgorCSAgICBvcHRpb25zLnBlcm1pdF9sb2NhbF9jb21tYW5kKQorCQlzc2hfbG9jYWxfY21kKG9wdGlvbnMubG9jYWxfY29tbWFuZCk7CisKKwkvKgorCSAqIElmIHJlcXVlc3RlZCBhbmQgd2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHJlcGxpZXMgdG8gcmVtb3RlCisJICogZm9yd2FyZGluZyByZXF1ZXN0cywgdGhlbiBsZXQgc3NoIGNvbnRpbnVlIGluIHRoZSBiYWNrZ3JvdW5kLgorCSAqLworCWlmIChmb3JrX2FmdGVyX2F1dGhlbnRpY2F0aW9uX2ZsYWcpIHsKKwkJaWYgKG9wdGlvbnMuZXhpdF9vbl9mb3J3YXJkX2ZhaWx1cmUgJiYKKwkJICAgIG9wdGlvbnMubnVtX3JlbW90ZV9mb3J3YXJkcyA+IDApIHsKKwkJCWRlYnVnKCJkZWZlcnJpbmcgcG9zdGF1dGggZm9yayB1bnRpbCByZW1vdGUgZm9yd2FyZCAiCisJCQkgICAgImNvbmZpcm1hdGlvbiByZWNlaXZlZCIpOworCQl9IGVsc2UKKwkJCWZvcmtfcG9zdGF1dGgoKTsKKwl9CisKKwlpZiAob3B0aW9ucy51c2Vfcm9hbWluZykKKwkJcmVxdWVzdF9yb2FtaW5nKCk7CisKKwlyZXR1cm4gY2xpZW50X2xvb3AodHR5X2ZsYWcsIHR0eV9mbGFnID8KKwkgICAgb3B0aW9ucy5lc2NhcGVfY2hhciA6IFNTSF9FU0NBUEVDSEFSX05PTkUsIGlkKTsKK30KKworc3RhdGljIHZvaWQKK2xvYWRfcHVibGljX2lkZW50aXR5X2ZpbGVzKHZvaWQpCit7CisJY2hhciAqZmlsZW5hbWUsICpjcCwgdGhpc2hvc3RbTklfTUFYSE9TVF07CisJY2hhciAqcHdkaXIgPSBOVUxMLCAqcHduYW1lID0gTlVMTDsKKwlpbnQgaSA9IDA7CisJS2V5ICpwdWJsaWM7CisJc3RydWN0IHBhc3N3ZCAqcHc7CisJdV9pbnQgbl9pZHM7CisJY2hhciAqaWRlbnRpdHlfZmlsZXNbU1NIX01BWF9JREVOVElUWV9GSUxFU107CisJS2V5ICppZGVudGl0eV9rZXlzW1NTSF9NQVhfSURFTlRJVFlfRklMRVNdOworI2lmZGVmIEVOQUJMRV9QS0NTMTEKKwlLZXkgKiprZXlzOworCWludCBua2V5czsKKyNlbmRpZiAvKiBQS0NTMTEgKi8KKworCW5faWRzID0gMDsKKwliemVybyhpZGVudGl0eV9maWxlcywgc2l6ZW9mKGlkZW50aXR5X2ZpbGVzKSk7CisJYnplcm8oaWRlbnRpdHlfa2V5cywgc2l6ZW9mKGlkZW50aXR5X2tleXMpKTsKKworI2lmZGVmIEVOQUJMRV9QS0NTMTEKKwlpZiAob3B0aW9ucy5wa2NzMTFfcHJvdmlkZXIgIT0gTlVMTCAmJgorCSAgICBvcHRpb25zLm51bV9pZGVudGl0eV9maWxlcyA8IFNTSF9NQVhfSURFTlRJVFlfRklMRVMgJiYKKwkgICAgKHBrY3MxMV9pbml0KCFvcHRpb25zLmJhdGNoX21vZGUpID09IDApICYmCisJICAgIChua2V5cyA9IHBrY3MxMV9hZGRfcHJvdmlkZXIob3B0aW9ucy5wa2NzMTFfcHJvdmlkZXIsIE5VTEwsCisJICAgICZrZXlzKSkgPiAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBua2V5czsgaSsrKSB7CisJCQlpZiAobl9pZHMgPj0gU1NIX01BWF9JREVOVElUWV9GSUxFUykgeworCQkJCWtleV9mcmVlKGtleXNbaV0pOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWRlbnRpdHlfa2V5c1tuX2lkc10gPSBrZXlzW2ldOworCQkJaWRlbnRpdHlfZmlsZXNbbl9pZHNdID0KKwkJCSAgICB4c3RyZHVwKG9wdGlvbnMucGtjczExX3Byb3ZpZGVyKTsgLyogWFhYICovCisJCQluX2lkcysrOworCQl9CisJCXhmcmVlKGtleXMpOworCX0KKyNlbmRpZiAvKiBFTkFCTEVfUEtDUzExICovCisJaWYgKChwdyA9IGdldHB3dWlkKG9yaWdpbmFsX3JlYWxfdWlkKSkgPT0gTlVMTCkKKwkJZmF0YWwoImxvYWRfcHVibGljX2lkZW50aXR5X2ZpbGVzOiBnZXRwd3VpZCBmYWlsZWQiKTsKKwlwd25hbWUgPSB4c3RyZHVwKHB3LT5wd19uYW1lKTsKKwlwd2RpciA9IHhzdHJkdXAocHctPnB3X2Rpcik7CisJaWYgKGdldGhvc3RuYW1lKHRoaXNob3N0LCBzaXplb2YodGhpc2hvc3QpKSA9PSAtMSkKKwkJZmF0YWwoImxvYWRfcHVibGljX2lkZW50aXR5X2ZpbGVzOiBnZXRob3N0bmFtZTogJXMiLAorCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1faWRlbnRpdHlfZmlsZXM7IGkrKykgeworCQlpZiAobl9pZHMgPj0gU1NIX01BWF9JREVOVElUWV9GSUxFUykgeworCQkJeGZyZWUob3B0aW9ucy5pZGVudGl0eV9maWxlc1tpXSk7CisJCQljb250aW51ZTsKKwkJfQorCQljcCA9IHRpbGRlX2V4cGFuZF9maWxlbmFtZShvcHRpb25zLmlkZW50aXR5X2ZpbGVzW2ldLAorCQkgICAgb3JpZ2luYWxfcmVhbF91aWQpOworCQlmaWxlbmFtZSA9IHBlcmNlbnRfZXhwYW5kKGNwLCAiZCIsIHB3ZGlyLAorCQkgICAgInUiLCBwd25hbWUsICJsIiwgdGhpc2hvc3QsICJoIiwgaG9zdCwKKwkJICAgICJyIiwgb3B0aW9ucy51c2VyLCAoY2hhciAqKU5VTEwpOworCQl4ZnJlZShjcCk7CisJCXB1YmxpYyA9IGtleV9sb2FkX3B1YmxpYyhmaWxlbmFtZSwgTlVMTCk7CisJCWRlYnVnKCJpZGVudGl0eSBmaWxlICVzIHR5cGUgJWQiLCBmaWxlbmFtZSwKKwkJICAgIHB1YmxpYyA/IHB1YmxpYy0+dHlwZSA6IC0xKTsKKwkJeGZyZWUob3B0aW9ucy5pZGVudGl0eV9maWxlc1tpXSk7CisJCWlkZW50aXR5X2ZpbGVzW25faWRzXSA9IGZpbGVuYW1lOworCQlpZGVudGl0eV9rZXlzW25faWRzXSA9IHB1YmxpYzsKKworCQlpZiAoKytuX2lkcyA+PSBTU0hfTUFYX0lERU5USVRZX0ZJTEVTKQorCQkJY29udGludWU7CisKKwkJLyogVHJ5IHRvIGFkZCB0aGUgY2VydGlmaWNhdGUgdmFyaWFudCB0b28gKi8KKwkJeGFzcHJpbnRmKCZjcCwgIiVzLWNlcnQiLCBmaWxlbmFtZSk7CisJCXB1YmxpYyA9IGtleV9sb2FkX3B1YmxpYyhjcCwgTlVMTCk7CisJCWRlYnVnKCJpZGVudGl0eSBmaWxlICVzIHR5cGUgJWQiLCBjcCwKKwkJICAgIHB1YmxpYyA/IHB1YmxpYy0+dHlwZSA6IC0xKTsKKwkJaWYgKHB1YmxpYyA9PSBOVUxMKSB7CisJCQl4ZnJlZShjcCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIWtleV9pc19jZXJ0KHB1YmxpYykpIHsKKwkJCWRlYnVnKCIlczoga2V5ICVzIHR5cGUgJXMgaXMgbm90IGEgY2VydGlmaWNhdGUiLAorCQkJICAgIF9fZnVuY19fLCBjcCwga2V5X3R5cGUocHVibGljKSk7CisJCQlrZXlfZnJlZShwdWJsaWMpOworCQkJeGZyZWUoY3ApOworCQkJY29udGludWU7CisJCX0KKwkJaWRlbnRpdHlfa2V5c1tuX2lkc10gPSBwdWJsaWM7CisJCS8qIHBvaW50IHRvIHRoZSBvcmlnaW5hbCBwYXRoLCBtb3N0IGxpa2VseSB0aGUgcHJpdmF0ZSBrZXkgKi8KKwkJaWRlbnRpdHlfZmlsZXNbbl9pZHNdID0geHN0cmR1cChmaWxlbmFtZSk7CisJCW5faWRzKys7CisJfQorCW9wdGlvbnMubnVtX2lkZW50aXR5X2ZpbGVzID0gbl9pZHM7CisJbWVtY3B5KG9wdGlvbnMuaWRlbnRpdHlfZmlsZXMsIGlkZW50aXR5X2ZpbGVzLCBzaXplb2YoaWRlbnRpdHlfZmlsZXMpKTsKKwltZW1jcHkob3B0aW9ucy5pZGVudGl0eV9rZXlzLCBpZGVudGl0eV9rZXlzLCBzaXplb2YoaWRlbnRpdHlfa2V5cykpOworCisJYnplcm8ocHduYW1lLCBzdHJsZW4ocHduYW1lKSk7CisJeGZyZWUocHduYW1lKTsKKwliemVybyhwd2Rpciwgc3RybGVuKHB3ZGlyKSk7CisJeGZyZWUocHdkaXIpOworfQorCitzdGF0aWMgdm9pZAorbWFpbl9zaWdjaGxkX2hhbmRsZXIoaW50IHNpZykKK3sKKwlpbnQgc2F2ZV9lcnJubyA9IGVycm5vOworCXBpZF90IHBpZDsKKwlpbnQgc3RhdHVzOworCisJd2hpbGUgKChwaWQgPSB3YWl0cGlkKC0xLCAmc3RhdHVzLCBXTk9IQU5HKSkgPiAwIHx8CisJICAgIChwaWQgPCAwICYmIGVycm5vID09IEVJTlRSKSkKKwkJOworCisJc2lnbmFsKHNpZywgbWFpbl9zaWdjaGxkX2hhbmRsZXIpOworCWVycm5vID0gc2F2ZV9lcnJubzsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zc2guaCBiL29wZW5zc2gtNi4wcDEvc3NoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0NjMzYgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc3NoLmgKQEAgLTAsMCArMSw5OSBAQAorLyogJE9wZW5CU0Q6IHNzaC5oLHYgMS43OSAyMDEwLzA2LzI1IDA3OjE0OjQ2IGRqbSBFeHAgJCAqLworCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKKyAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCisgKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCisgKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCisgKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCisgKi8KKworLyogQ2lwaGVyIHVzZWQgZm9yIGVuY3J5cHRpbmcgYXV0aGVudGljYXRpb24gZmlsZXMuICovCisjZGVmaW5lIFNTSF9BVVRIRklMRV9DSVBIRVIJU1NIX0NJUEhFUl8zREVTCisKKy8qIERlZmF1bHQgcG9ydCBudW1iZXIuICovCisjZGVmaW5lIFNTSF9ERUZBVUxUX1BPUlQJMjIKKworLyoKKyAqIE1heGltdW0gbnVtYmVyIG9mIFJTQSBhdXRoZW50aWNhdGlvbiBpZGVudGl0eSBmaWxlcyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQKKyAqIGluIGNvbmZpZ3VyYXRpb24gZmlsZXMgb3Igb24gdGhlIGNvbW1hbmQgbGluZS4KKyAqLworI2RlZmluZSBTU0hfTUFYX0lERU5USVRZX0ZJTEVTCQkxMDAKKworLyoKKyAqIE1heGltdW0gbGVuZ3RoIG9mIGxpbmVzIGluIGF1dGhvcml6ZWRfa2V5cyBmaWxlLgorICogQ3VycmVudCB2YWx1ZSBwZXJtaXRzIDE2a2JpdCBSU0EgYW5kIFJTQTEga2V5cyBhbmQgOGtiaXQgRFNBIGtleXMsIHdpdGgKKyAqIHNvbWUgcm9vbSBmb3Igb3B0aW9ucyBhbmQgY29tbWVudHMuCisgKi8KKyNkZWZpbmUgU1NIX01BWF9QVUJLRVlfQllURVMJCTgxOTIKKworLyoKKyAqIE1ham9yIHByb3RvY29sIHZlcnNpb24uICBEaWZmZXJlbnQgdmVyc2lvbiBpbmRpY2F0ZXMgbWFqb3IgaW5jb21wYXRpYmlsaXR5CisgKiB0aGF0IHByZXZlbnRzIGNvbW11bmljYXRpb24uCisgKgorICogTWlub3IgcHJvdG9jb2wgdmVyc2lvbi4gIERpZmZlcmVudCB2ZXJzaW9uIGluZGljYXRlcyBtaW5vciBpbmNvbXBhdGliaWxpdHkKKyAqIHRoYXQgZG9lcyBub3QgcHJldmVudCBpbnRlcm9wZXJhdGlvbi4KKyAqLworI2RlZmluZSBQUk9UT0NPTF9NQUpPUl8xCTEKKyNkZWZpbmUgUFJPVE9DT0xfTUlOT1JfMQk1CisKKy8qIFdlIHN1cHBvcnQgYm90aCBTU0gxIGFuZCBTU0gyICovCisjZGVmaW5lIFBST1RPQ09MX01BSk9SXzIJMgorI2RlZmluZSBQUk9UT0NPTF9NSU5PUl8yCTAKKworLyoKKyAqIE5hbWUgZm9yIHRoZSBzZXJ2aWNlLiAgVGhlIHBvcnQgbmFtZWQgYnkgdGhpcyBzZXJ2aWNlIG92ZXJyaWRlcyB0aGUKKyAqIGRlZmF1bHQgcG9ydCBpZiBwcmVzZW50LgorICovCisjZGVmaW5lIFNTSF9TRVJWSUNFX05BTUUJInNzaCIKKworLyoKKyAqIE5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIHByb2Nlc3MgSUQgb2YgdGhlCisgKiBhdXRoZW50aWNhdGlvbiBhZ2VudC4KKyAqLworI2RlZmluZSBTU0hfQUdFTlRQSURfRU5WX05BTUUJIlNTSF9BR0VOVF9QSUQiCisKKy8qCisgKiBOYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb250YWluaW5nIHRoZSBwYXRobmFtZSBvZiB0aGUKKyAqIGF1dGhlbnRpY2F0aW9uIHNvY2tldC4KKyAqLworI2RlZmluZSBTU0hfQVVUSFNPQ0tFVF9FTlZfTkFNRSAiU1NIX0FVVEhfU09DSyIKKworLyoKKyAqIEVudmlyb25tZW50IHZhcmlhYmxlIGZvciBvdmVyd3JpdGluZyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiBhc2twYXNzCisgKi8KKyNkZWZpbmUgU1NIX0FTS1BBU1NfRU5WCQkiU1NIX0FTS1BBU1MiCisKKy8qCisgKiBGb3JjZSBob3N0IGtleSBsZW5ndGggYW5kIHNlcnZlciBrZXkgbGVuZ3RoIHRvIGRpZmZlciBieSBhdCBsZWFzdCB0aGlzCisgKiBtYW55IGJpdHMuICBUaGlzIGlzIHRvIG1ha2UgZG91YmxlIGVuY3J5cHRpb24gd2l0aCByc2FyZWYgd29yay4KKyAqLworI2RlZmluZSBTU0hfS0VZX0JJVFNfUkVTRVJWRUQJCTEyOAorCisvKgorICogTGVuZ3RoIG9mIHRoZSBzZXNzaW9uIGtleSBpbiBieXRlcy4gIChTcGVjaWZpZWQgYXMgMjU2IGJpdHMgaW4gdGhlCisgKiBwcm90b2NvbC4pCisgKi8KKyNkZWZpbmUgU1NIX1NFU1NJT05fS0VZX0xFTkdUSAkJMzIKKworLyogVXNlZCB0byBpZGVudGlmeSBgYEVzY2FwZUNoYXIgbm9uZScnICovCisjZGVmaW5lIFNTSF9FU0NBUEVDSEFSX05PTkUJCS0yCisKKy8qCisgKiB1bnByaXZpbGVnZWQgdXNlciB3aGVuIFVzZVByaXZpbGVnZVNlcGFyYXRpb249eWVzOworICogc3NoZCB3aWxsIGNoYW5nZSBpdHMgcHJpdmlsZWdlcyB0byB0aGlzIHVzZXIgYW5kIGl0cworICogcHJpbWFyeSBncm91cC4KKyAqLworI2lmbmRlZiBTU0hfUFJJVlNFUF9VU0VSCisjZGVmaW5lIFNTSF9QUklWU0VQX1VTRVIJCSJzc2hkIgorI2VuZGlmCisKKy8qIE1pbmltdW0gbW9kdWx1cyBzaXplIChuKSBmb3IgUlNBIGtleXMuICovCisjZGVmaW5lIFNTSF9SU0FfTUlOSU1VTV9NT0RVTFVTX1NJWkUJNzY4CisKKy8qIExpc3RlbiBiYWNrbG9nIGZvciBzc2hkLCBzc2gtYWdlbnQgYW5kIGZvcndhcmRpbmcgc29ja2V0cyAqLworI2RlZmluZSBTU0hfTElTVEVOX0JBQ0tMT0cJCTEyOApkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zc2gxLmggYi9vcGVuc3NoLTYuMHAxL3NzaDEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTNkOTMwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zc2gxLmgKQEAgLTAsMCArMSw5MiBAQAorLyogJE9wZW5CU0Q6IHNzaDEuaCx2IDEuNiAyMDA2LzAzLzI1IDIyOjIyOjQzIGRqbSBFeHAgJCAqLworCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKKyAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCisgKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCisgKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCisgKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCisgKi8KKworLyoKKyAqIERlZmluaXRpb24gb2YgbWVzc2FnZSB0eXBlcy4gIE5ldyB2YWx1ZXMgY2FuIGJlIGFkZGVkLCBidXQgb2xkIHZhbHVlcworICogc2hvdWxkIG5vdCBiZSByZW1vdmVkIG9yIHdpdGhvdXQgY2FyZWZ1bCBjb25zaWRlcmF0aW9uIG9mIHRoZSBjb25zZXF1ZW5jZXMKKyAqIGZvciBjb21wYXRpYmlsaXR5LiAgVGhlIG1heGltdW0gdmFsdWUgaXMgMjU0OyB2YWx1ZSAyNTUgaXMgcmVzZXJ2ZWQgZm9yCisgKiBmdXR1cmUgZXh0ZW5zaW9uLgorICovCisvKiBSYW5nZXMgKi8KKyNkZWZpbmUgU1NIX01TR19NSU4JCQkJMQorI2RlZmluZSBTU0hfTVNHX01BWAkJCQkyNTQKKy8qIE1lc3NhZ2UgbmFtZSAqLwkJCS8qIG1zZyBjb2RlICovCS8qIGFyZ3VtZW50cyAqLworI2RlZmluZSBTU0hfTVNHX05PTkUJCQkJMAkvKiBubyBtZXNzYWdlICovCisjZGVmaW5lIFNTSF9NU0dfRElTQ09OTkVDVAkJCTEJLyogY2F1c2UgKHN0cmluZykgKi8KKyNkZWZpbmUgU1NIX1NNU0dfUFVCTElDX0tFWQkJCTIJLyogY2ssbXNrLHNydmssaG9zdGsgKi8KKyNkZWZpbmUgU1NIX0NNU0dfU0VTU0lPTl9LRVkJCQkzCS8qIGtleSAoQklHTlVNKSAqLworI2RlZmluZSBTU0hfQ01TR19VU0VSCQkJCTQJLyogdXNlciAoc3RyaW5nKSAqLworI2RlZmluZSBTU0hfQ01TR19BVVRIX1JIT1NUUwkJCTUJLyogdXNlciAoc3RyaW5nKSAqLworI2RlZmluZSBTU0hfQ01TR19BVVRIX1JTQQkJCTYJLyogbW9kdWx1cyAoQklHTlVNKSAqLworI2RlZmluZSBTU0hfU01TR19BVVRIX1JTQV9DSEFMTEVOR0UJCTcJLyogaW50IChCSUdOVU0pICovCisjZGVmaW5lIFNTSF9DTVNHX0FVVEhfUlNBX1JFU1BPTlNFCQk4CS8qIGludCAoQklHTlVNKSAqLworI2RlZmluZSBTU0hfQ01TR19BVVRIX1BBU1NXT1JECQkJOQkvKiBwYXNzIChzdHJpbmcpICovCisjZGVmaW5lIFNTSF9DTVNHX1JFUVVFU1RfUFRZCQkJMTAJLyogVEVSTSwgdHR5IG1vZGVzICovCisjZGVmaW5lIFNTSF9DTVNHX1dJTkRPV19TSVpFCQkJMTEJLyogcm93LGNvbCx4cGl4LHlwaXggKi8KKyNkZWZpbmUgU1NIX0NNU0dfRVhFQ19TSEVMTAkJCTEyCS8qICovCisjZGVmaW5lIFNTSF9DTVNHX0VYRUNfQ01ECQkJMTMJLyogY21kIChzdHJpbmcpICovCisjZGVmaW5lIFNTSF9TTVNHX1NVQ0NFU1MJCQkxNAkvKiAqLworI2RlZmluZSBTU0hfU01TR19GQUlMVVJFCQkJMTUJLyogKi8KKyNkZWZpbmUgU1NIX0NNU0dfU1RESU5fREFUQQkJCTE2CS8qIGRhdGEgKHN0cmluZykgKi8KKyNkZWZpbmUgU1NIX1NNU0dfU1RET1VUX0RBVEEJCQkxNwkvKiBkYXRhIChzdHJpbmcpICovCisjZGVmaW5lIFNTSF9TTVNHX1NUREVSUl9EQVRBCQkJMTgJLyogZGF0YSAoc3RyaW5nKSAqLworI2RlZmluZSBTU0hfQ01TR19FT0YJCQkJMTkJLyogKi8KKyNkZWZpbmUgU1NIX1NNU0dfRVhJVFNUQVRVUwkJCTIwCS8qIHN0YXR1cyAoaW50KSAqLworI2RlZmluZSBTU0hfTVNHX0NIQU5ORUxfT1BFTl9DT05GSVJNQVRJT04JMjEJLyogY2hhbm5lbCAoaW50KSAqLworI2RlZmluZSBTU0hfTVNHX0NIQU5ORUxfT1BFTl9GQUlMVVJFCQkyMgkvKiBjaGFubmVsIChpbnQpICovCisjZGVmaW5lIFNTSF9NU0dfQ0hBTk5FTF9EQVRBCQkJMjMJLyogY2gsZGF0YSAoaW50LHN0cikgKi8KKyNkZWZpbmUgU1NIX01TR19DSEFOTkVMX0NMT1NFCQkJMjQJLyogY2hhbm5lbCAoaW50KSAqLworI2RlZmluZSBTU0hfTVNHX0NIQU5ORUxfQ0xPU0VfQ09ORklSTUFUSU9OCTI1CS8qIGNoYW5uZWwgKGludCkgKi8KKy8qICAgICAgU1NIX0NNU0dfWDExX1JFUVVFU1RfRk9SV0FSRElORwkJMjYJICAgT0JTT0xFVEUgKi8KKyNkZWZpbmUgU1NIX1NNU0dfWDExX09QRU4JCQkyNwkvKiBjaGFubmVsIChpbnQpICovCisjZGVmaW5lIFNTSF9DTVNHX1BPUlRfRk9SV0FSRF9SRVFVRVNUCQkyOAkvKiBwLGhvc3QsaHAgKGkscyxpKSAqLworI2RlZmluZSBTU0hfTVNHX1BPUlRfT1BFTgkJCTI5CS8qIGNoLGgscCAoaSxzLGkpICovCisjZGVmaW5lIFNTSF9DTVNHX0FHRU5UX1JFUVVFU1RfRk9SV0FSRElORwkzMAkvKiAqLworI2RlZmluZSBTU0hfU01TR19BR0VOVF9PUEVOCQkJMzEJLyogcG9ydCAoaW50KSAqLworI2RlZmluZSBTU0hfTVNHX0lHTk9SRQkJCQkzMgkvKiBzdHJpbmcgKi8KKyNkZWZpbmUgU1NIX0NNU0dfRVhJVF9DT05GSVJNQVRJT04JCTMzCS8qICovCisjZGVmaW5lIFNTSF9DTVNHX1gxMV9SRVFVRVNUX0ZPUldBUkRJTkcJCTM0CS8qIHByb3RvLGRhdGEgKHMscykgKi8KKyNkZWZpbmUgU1NIX0NNU0dfQVVUSF9SSE9TVFNfUlNBCQkzNQkvKiB1c2VyLG1vZCAocyxtcGkpICovCisjZGVmaW5lIFNTSF9NU0dfREVCVUcJCQkJMzYJLyogc3RyaW5nICovCisjZGVmaW5lIFNTSF9DTVNHX1JFUVVFU1RfQ09NUFJFU1NJT04JCTM3CS8qIGxldmVsIDEtOSAoaW50KSAqLworI2RlZmluZSBTU0hfQ01TR19NQVhfUEFDS0VUX1NJWkUJCTM4CS8qIHNpemUgNGstMTAyNGsgKGludCkgKi8KKyNkZWZpbmUgU1NIX0NNU0dfQVVUSF9USVMJCQkzOQkvKiB3ZSB1c2UgdGhpcyBmb3Igcy9rZXkgKi8KKyNkZWZpbmUgU1NIX1NNU0dfQVVUSF9USVNfQ0hBTExFTkdFCQk0MAkvKiBjaGFsbGVuZ2UgKHN0cmluZykgKi8KKyNkZWZpbmUgU1NIX0NNU0dfQVVUSF9USVNfUkVTUE9OU0UJCTQxCS8qIHJlc3BvbnNlIChzdHJpbmcpICovCisjZGVmaW5lIFNTSF9DTVNHX0FVVEhfS0VSQkVST1MJCQk0MgkvKiAoS1RFWFQpICovCisjZGVmaW5lIFNTSF9TTVNHX0FVVEhfS0VSQkVST1NfUkVTUE9OU0UJCTQzCS8qIChLVEVYVCkgKi8KKyNkZWZpbmUgU1NIX0NNU0dfSEFWRV9LRVJCRVJPU19UR1QJCTQ0CS8qIGNyZWRlbnRpYWxzIChzKSAqLworI2RlZmluZSBTU0hfQ01TR19IQVZFX0FGU19UT0tFTgkJCTY1CS8qIHRva2VuIChzKSAqLworCisvKiBwcm90b2NvbCB2ZXJzaW9uIDEuNSBvdmVybG9hZHMgc29tZSB2ZXJzaW9uIDEuMyBtZXNzYWdlIHR5cGVzICovCisjZGVmaW5lIFNTSF9NU0dfQ0hBTk5FTF9JTlBVVF9FT0YJU1NIX01TR19DSEFOTkVMX0NMT1NFCisjZGVmaW5lIFNTSF9NU0dfQ0hBTk5FTF9PVVRQVVRfQ0xPU0UJU1NIX01TR19DSEFOTkVMX0NMT1NFX0NPTkZJUk1BVElPTgorCisvKgorICogQXV0aGVudGljYXRpb24gbWV0aG9kcy4gIE5ldyB0eXBlcyBjYW4gYmUgYWRkZWQsIGJ1dCBvbGQgdHlwZXMgc2hvdWxkIG5vdAorICogYmUgcmVtb3ZlZCBmb3IgY29tcGF0aWJpbGl0eS4gIFRoZSBtYXhpbXVtIGFsbG93ZWQgdmFsdWUgaXMgMzEuCisgKi8KKyNkZWZpbmUgU1NIX0FVVEhfUkhPU1RTCQkxCisjZGVmaW5lIFNTSF9BVVRIX1JTQQkJMgorI2RlZmluZSBTU0hfQVVUSF9QQVNTV09SRAkzCisjZGVmaW5lIFNTSF9BVVRIX1JIT1NUU19SU0EJNAorI2RlZmluZSBTU0hfQVVUSF9USVMJCTUKKyNkZWZpbmUgU1NIX0FVVEhfS0VSQkVST1MJNgorI2RlZmluZSBTU0hfUEFTU19LRVJCRVJPU19UR1QJNworCQkJCS8qIDggdG8gMTUgYXJlIHJlc2VydmVkICovCisjZGVmaW5lIFNTSF9QQVNTX0FGU19UT0tFTgkyMQorCisvKiBQcm90b2NvbCBmbGFncy4gIFRoZXNlIGFyZSBiaXQgbWFza3MuICovCisjZGVmaW5lIFNTSF9QUk9UT0ZMQUdfU0NSRUVOX05VTUJFUgkxCS8qIFgxMSBmb3J3YXJkaW5nIGluY2x1ZGVzIHNjcmVlbiAqLworI2RlZmluZSBTU0hfUFJPVE9GTEFHX0hPU1RfSU5fRldEX09QRU4JMgkvKiBmb3J3YXJkaW5nIG9wZW5zIGNvbnRhaW4gaG9zdCAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zc2gyLmggYi9vcGVuc3NoLTYuMHAxL3NzaDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWE5NjNjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zc2gyLmgKQEAgLTAsMCArMSwxODIgQEAKKy8qICRPcGVuQlNEOiBzc2gyLmgsdiAxLjE0IDIwMTAvMDgvMzEgMTE6NTQ6NDUgZGptIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBkcmFmdC1pZXRmLXNlY3NoLWFyY2hpdGVjdHVyZS0wNS50eHQKKyAqCisgKiAgIFRyYW5zcG9ydCBsYXllciBwcm90b2NvbDoKKyAqCisgKiAgICAgMS0xOSAgICAgVHJhbnNwb3J0IGxheWVyIGdlbmVyaWMgKGUuZy4gZGlzY29ubmVjdCwgaWdub3JlLCBkZWJ1ZywKKyAqICAgICAgICAgICAgICBldGMpCisgKiAgICAgMjAtMjkgICAgQWxnb3JpdGhtIG5lZ290aWF0aW9uCisgKiAgICAgMzAtNDkgICAgS2V5IGV4Y2hhbmdlIG1ldGhvZCBzcGVjaWZpYyAobnVtYmVycyBjYW4gYmUgcmV1c2VkIGZvcgorICogICAgICAgICAgICAgIGRpZmZlcmVudCBhdXRoZW50aWNhdGlvbiBtZXRob2RzKQorICoKKyAqICAgVXNlciBhdXRoZW50aWNhdGlvbiBwcm90b2NvbDoKKyAqCisgKiAgICAgNTAtNTkgICAgVXNlciBhdXRoZW50aWNhdGlvbiBnZW5lcmljCisgKiAgICAgNjAtNzkgICAgVXNlciBhdXRoZW50aWNhdGlvbiBtZXRob2Qgc3BlY2lmaWMgKG51bWJlcnMgY2FuIGJlIHJldXNlZAorICogICAgICAgICAgICAgIGZvciBkaWZmZXJlbnQgYXV0aGVudGljYXRpb24gbWV0aG9kcykKKyAqCisgKiAgIENvbm5lY3Rpb24gcHJvdG9jb2w6CisgKgorICogICAgIDgwLTg5ICAgIENvbm5lY3Rpb24gcHJvdG9jb2wgZ2VuZXJpYworICogICAgIDkwLTEyNyAgIENoYW5uZWwgcmVsYXRlZCBtZXNzYWdlcworICoKKyAqICAgUmVzZXJ2ZWQgZm9yIGNsaWVudCBwcm90b2NvbHM6CisgKgorICogICAgIDEyOC0xOTEgIFJlc2VydmVkCisgKgorICogICBMb2NhbCBleHRlbnNpb25zOgorICoKKyAqICAgICAxOTItMjU1ICBMb2NhbCBleHRlbnNpb25zCisgKi8KKworLyogcmFuZ2VzICovCisKKyNkZWZpbmUgU1NIMl9NU0dfVFJBTlNQT1JUX01JTgkJCQkxCisjZGVmaW5lIFNTSDJfTVNHX1RSQU5TUE9SVF9NQVgJCQkJNDkKKyNkZWZpbmUgU1NIMl9NU0dfVVNFUkFVVEhfTUlOCQkJCTUwCisjZGVmaW5lIFNTSDJfTVNHX1VTRVJBVVRIX01BWAkJCQk3OQorI2RlZmluZSBTU0gyX01TR19VU0VSQVVUSF9QRVJfTUVUSE9EX01JTgkJNjAKKyNkZWZpbmUgU1NIMl9NU0dfVVNFUkFVVEhfUEVSX01FVEhPRF9NQVgJCVNTSDJfTVNHX1VTRVJBVVRIX01BWAorI2RlZmluZSBTU0gyX01TR19DT05ORUNUSU9OX01JTgkJCQk4MAorI2RlZmluZSBTU0gyX01TR19DT05ORUNUSU9OX01BWAkJCQkxMjcKKyNkZWZpbmUgU1NIMl9NU0dfUkVTRVJWRURfTUlOCQkJCTEyOAorI2RlZmluZSBTU0gyX01TR19SRVNFUlZFRF9NQVgJCQkJMTkxCisjZGVmaW5lIFNTSDJfTVNHX0xPQ0FMX01JTgkJCQkxOTIKKyNkZWZpbmUgU1NIMl9NU0dfTE9DQUxfTUFYCQkJCTI1NQorI2RlZmluZSBTU0gyX01TR19NSU4JCQkJCTEKKyNkZWZpbmUgU1NIMl9NU0dfTUFYCQkJCQkyNTUKKworLyogdHJhbnNwb3J0IGxheWVyOiBnZW5lcmljICovCisKKyNkZWZpbmUgU1NIMl9NU0dfRElTQ09OTkVDVAkJCQkxCisjZGVmaW5lIFNTSDJfTVNHX0lHTk9SRQkJCQkJMgorI2RlZmluZSBTU0gyX01TR19VTklNUExFTUVOVEVECQkJCTMKKyNkZWZpbmUgU1NIMl9NU0dfREVCVUcJCQkJCTQKKyNkZWZpbmUgU1NIMl9NU0dfU0VSVklDRV9SRVFVRVNUCQkJNQorI2RlZmluZSBTU0gyX01TR19TRVJWSUNFX0FDQ0VQVAkJCQk2CisKKy8qIHRyYW5zcG9ydCBsYXllcjogYWxnIG5lZ290aWF0aW9uICovCisKKyNkZWZpbmUgU1NIMl9NU0dfS0VYSU5JVAkJCQkyMAorI2RlZmluZSBTU0gyX01TR19ORVdLRVlTCQkJCTIxCisKKy8qIHRyYW5zcG9ydCBsYXllcjoga2V4IHNwZWNpZmljIG1lc3NhZ2VzLCBjYW4gYmUgcmV1c2VkICovCisKKyNkZWZpbmUgU1NIMl9NU0dfS0VYREhfSU5JVAkJCQkzMAorI2RlZmluZSBTU0gyX01TR19LRVhESF9SRVBMWQkJCQkzMQorCisvKiBkaC1ncm91cC1leGNoYW5nZSAqLworI2RlZmluZSBTU0gyX01TR19LRVhfREhfR0VYX1JFUVVFU1RfT0xECQkJMzAKKyNkZWZpbmUgU1NIMl9NU0dfS0VYX0RIX0dFWF9HUk9VUAkJCTMxCisjZGVmaW5lIFNTSDJfTVNHX0tFWF9ESF9HRVhfSU5JVAkJCTMyCisjZGVmaW5lIFNTSDJfTVNHX0tFWF9ESF9HRVhfUkVQTFkJCQkzMworI2RlZmluZSBTU0gyX01TR19LRVhfREhfR0VYX1JFUVVFU1QJCQkzNAorCisvKiBlY2RoICovCisjZGVmaW5lIFNTSDJfTVNHX0tFWF9FQ0RIX0lOSVQJCQkJMzAKKyNkZWZpbmUgU1NIMl9NU0dfS0VYX0VDREhfUkVQTFkJCQkJMzEKKworLyogdXNlciBhdXRoZW50aWNhdGlvbjogZ2VuZXJpYyAqLworCisjZGVmaW5lIFNTSDJfTVNHX1VTRVJBVVRIX1JFUVVFU1QJCQk1MAorI2RlZmluZSBTU0gyX01TR19VU0VSQVVUSF9GQUlMVVJFCQkJNTEKKyNkZWZpbmUgU1NIMl9NU0dfVVNFUkFVVEhfU1VDQ0VTUwkJCTUyCisjZGVmaW5lIFNTSDJfTVNHX1VTRVJBVVRIX0JBTk5FUgkJCTUzCisKKy8qIHVzZXIgYXV0aGVudGljYXRpb246IG1ldGhvZCBzcGVjaWZpYywgY2FuIGJlIHJldXNlZCAqLworCisjZGVmaW5lIFNTSDJfTVNHX1VTRVJBVVRIX1BLX09LCQkJCTYwCisjZGVmaW5lIFNTSDJfTVNHX1VTRVJBVVRIX1BBU1NXRF9DSEFOR0VSRVEJCTYwCisjZGVmaW5lIFNTSDJfTVNHX1VTRVJBVVRIX0lORk9fUkVRVUVTVAkJCTYwCisjZGVmaW5lIFNTSDJfTVNHX1VTRVJBVVRIX0lORk9fUkVTUE9OU0UJCQk2MQorI2RlZmluZSBTU0gyX01TR19VU0VSQVVUSF9KUEFLRV9DTElFTlRfU1RFUDEJCTYwCisjZGVmaW5lIFNTSDJfTVNHX1VTRVJBVVRIX0pQQUtFX1NFUlZFUl9TVEVQMQkJNjEKKyNkZWZpbmUgU1NIMl9NU0dfVVNFUkFVVEhfSlBBS0VfQ0xJRU5UX1NURVAyCQk2MgorI2RlZmluZSBTU0gyX01TR19VU0VSQVVUSF9KUEFLRV9TRVJWRVJfU1RFUDIJCTYzCisjZGVmaW5lIFNTSDJfTVNHX1VTRVJBVVRIX0pQQUtFX0NMSUVOVF9DT05GSVJNCQk2NAorI2RlZmluZSBTU0gyX01TR19VU0VSQVVUSF9KUEFLRV9TRVJWRVJfQ09ORklSTQkJNjUKKworLyogY29ubmVjdGlvbiBwcm90b2NvbDogZ2VuZXJpYyAqLworCisjZGVmaW5lIFNTSDJfTVNHX0dMT0JBTF9SRVFVRVNUCQkJCTgwCisjZGVmaW5lIFNTSDJfTVNHX1JFUVVFU1RfU1VDQ0VTUwkJCTgxCisjZGVmaW5lIFNTSDJfTVNHX1JFUVVFU1RfRkFJTFVSRQkJCTgyCisKKy8qIGNoYW5uZWwgcmVsYXRlZCBtZXNzYWdlcyAqLworCisjZGVmaW5lIFNTSDJfTVNHX0NIQU5ORUxfT1BFTgkJCQk5MAorI2RlZmluZSBTU0gyX01TR19DSEFOTkVMX09QRU5fQ09ORklSTUFUSU9OCQk5MQorI2RlZmluZSBTU0gyX01TR19DSEFOTkVMX09QRU5fRkFJTFVSRQkJCTkyCisjZGVmaW5lIFNTSDJfTVNHX0NIQU5ORUxfV0lORE9XX0FESlVTVAkJCTkzCisjZGVmaW5lIFNTSDJfTVNHX0NIQU5ORUxfREFUQQkJCQk5NAorI2RlZmluZSBTU0gyX01TR19DSEFOTkVMX0VYVEVOREVEX0RBVEEJCQk5NQorI2RlZmluZSBTU0gyX01TR19DSEFOTkVMX0VPRgkJCQk5NgorI2RlZmluZSBTU0gyX01TR19DSEFOTkVMX0NMT1NFCQkJCTk3CisjZGVmaW5lIFNTSDJfTVNHX0NIQU5ORUxfUkVRVUVTVAkJCTk4CisjZGVmaW5lIFNTSDJfTVNHX0NIQU5ORUxfU1VDQ0VTUwkJCTk5CisjZGVmaW5lIFNTSDJfTVNHX0NIQU5ORUxfRkFJTFVSRQkJCTEwMAorCisvKiBkaXNjb25uZWN0IHJlYXNvbiBjb2RlICovCisKKyNkZWZpbmUgU1NIMl9ESVNDT05ORUNUX0hPU1RfTk9UX0FMTE9XRURfVE9fQ09OTkVDVAkxCisjZGVmaW5lIFNTSDJfRElTQ09OTkVDVF9QUk9UT0NPTF9FUlJPUgkJCTIKKyNkZWZpbmUgU1NIMl9ESVNDT05ORUNUX0tFWV9FWENIQU5HRV9GQUlMRUQJCTMKKyNkZWZpbmUgU1NIMl9ESVNDT05ORUNUX0hPU1RfQVVUSEVOVElDQVRJT05fRkFJTEVECTQKKyNkZWZpbmUgU1NIMl9ESVNDT05ORUNUX1JFU0VSVkVECQkJNAorI2RlZmluZSBTU0gyX0RJU0NPTk5FQ1RfTUFDX0VSUk9SCQkJNQorI2RlZmluZSBTU0gyX0RJU0NPTk5FQ1RfQ09NUFJFU1NJT05fRVJST1IJCTYKKyNkZWZpbmUgU1NIMl9ESVNDT05ORUNUX1NFUlZJQ0VfTk9UX0FWQUlMQUJMRQkJNworI2RlZmluZSBTU0gyX0RJU0NPTk5FQ1RfUFJPVE9DT0xfVkVSU0lPTl9OT1RfU1VQUE9SVEVECTgKKyNkZWZpbmUgU1NIMl9ESVNDT05ORUNUX0hPU1RfS0VZX05PVF9WRVJJRklBQkxFCQk5CisjZGVmaW5lIFNTSDJfRElTQ09OTkVDVF9DT05ORUNUSU9OX0xPU1QJCQkxMAorI2RlZmluZSBTU0gyX0RJU0NPTk5FQ1RfQllfQVBQTElDQVRJT04JCQkxMQorI2RlZmluZSBTU0gyX0RJU0NPTk5FQ1RfVE9PX01BTllfQ09OTkVDVElPTlMJCTEyCisjZGVmaW5lIFNTSDJfRElTQ09OTkVDVF9BVVRIX0NBTkNFTExFRF9CWV9VU0VSCQkxMworI2RlZmluZSBTU0gyX0RJU0NPTk5FQ1RfTk9fTU9SRV9BVVRIX01FVEhPRFNfQVZBSUxBQkxFCTE0CisjZGVmaW5lIFNTSDJfRElTQ09OTkVDVF9JTExFR0FMX1VTRVJfTkFNRQkJMTUKKworLyogbWlzYyAqLworCisjZGVmaW5lIFNTSDJfT1BFTl9BRE1JTklTVFJBVElWRUxZX1BST0hJQklURUQJCTEKKyNkZWZpbmUgU1NIMl9PUEVOX0NPTk5FQ1RfRkFJTEVECQkJMgorI2RlZmluZSBTU0gyX09QRU5fVU5LTk9XTl9DSEFOTkVMX1RZUEUJCQkzCisjZGVmaW5lIFNTSDJfT1BFTl9SRVNPVVJDRV9TSE9SVEFHRQkJCTQKKworI2RlZmluZSBTU0gyX0VYVEVOREVEX0RBVEFfU1RERVJSCQkJMQorCisvKiBrZXggbWVzc2FnZXMgZm9yIHJlc3VtZUBhcHBnYXRlLmNvbSAqLworI2RlZmluZSBTU0gyX01TR19LRVhfUk9BTUlOR19SRVNVTUUJCQkzMAorI2RlZmluZSBTU0gyX01TR19LRVhfUk9BTUlOR19BVVRIX1JFUVVJUkVECQkzMQorI2RlZmluZSBTU0gyX01TR19LRVhfUk9BTUlOR19BVVRICQkJMzIKKyNkZWZpbmUgU1NIMl9NU0dfS0VYX1JPQU1JTkdfQVVUSF9PSwkJCTMzCisjZGVmaW5lIFNTSDJfTVNHX0tFWF9ST0FNSU5HX0FVVEhfRkFJTAkJCTM0CisKKy8qIENlcnRpZmljYXRlIHR5cGVzIGZvciBPcGVuU1NIIGNlcnRpZmljYXRlIGtleXMgZXh0ZW5zaW9uICovCisjZGVmaW5lIFNTSDJfQ0VSVF9UWVBFX1VTRVIJCQkJMQorI2RlZmluZSBTU0gyX0NFUlRfVFlQRV9IT1NUCQkJCTIKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc3NoX2NvbmZpZyBiL29wZW5zc2gtNi4wcDEvc3NoX2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODkzNjc0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zc2hfY29uZmlnCkBAIC0wLDAgKzEsNDcgQEAKKyMJJE9wZW5CU0Q6IHNzaF9jb25maWcsdiAxLjI2IDIwMTAvMDEvMTEgMDE6Mzk6NDYgZHR1Y2tlciBFeHAgJAorCisjIFRoaXMgaXMgdGhlIHNzaCBjbGllbnQgc3lzdGVtLXdpZGUgY29uZmlndXJhdGlvbiBmaWxlLiAgU2VlCisjIHNzaF9jb25maWcoNSkgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBUaGlzIGZpbGUgcHJvdmlkZXMgZGVmYXVsdHMgZm9yCisjIHVzZXJzLCBhbmQgdGhlIHZhbHVlcyBjYW4gYmUgY2hhbmdlZCBpbiBwZXItdXNlciBjb25maWd1cmF0aW9uIGZpbGVzCisjIG9yIG9uIHRoZSBjb21tYW5kIGxpbmUuCisKKyMgQ29uZmlndXJhdGlvbiBkYXRhIGlzIHBhcnNlZCBhcyBmb2xsb3dzOgorIyAgMS4gY29tbWFuZCBsaW5lIG9wdGlvbnMKKyMgIDIuIHVzZXItc3BlY2lmaWMgZmlsZQorIyAgMy4gc3lzdGVtLXdpZGUgZmlsZQorIyBBbnkgY29uZmlndXJhdGlvbiB2YWx1ZSBpcyBvbmx5IGNoYW5nZWQgdGhlIGZpcnN0IHRpbWUgaXQgaXMgc2V0LgorIyBUaHVzLCBob3N0LXNwZWNpZmljIGRlZmluaXRpb25zIHNob3VsZCBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQorIyBjb25maWd1cmF0aW9uIGZpbGUsIGFuZCBkZWZhdWx0cyBhdCB0aGUgZW5kLgorCisjIFNpdGUtd2lkZSBkZWZhdWx0cyBmb3Igc29tZSBjb21tb25seSB1c2VkIG9wdGlvbnMuICBGb3IgYSBjb21wcmVoZW5zaXZlCisjIGxpc3Qgb2YgYXZhaWxhYmxlIG9wdGlvbnMsIHRoZWlyIG1lYW5pbmdzIGFuZCBkZWZhdWx0cywgcGxlYXNlIHNlZSB0aGUKKyMgc3NoX2NvbmZpZyg1KSBtYW4gcGFnZS4KKworIyBIb3N0ICoKKyMgICBGb3J3YXJkQWdlbnQgbm8KKyMgICBGb3J3YXJkWDExIG5vCisjICAgUmhvc3RzUlNBQXV0aGVudGljYXRpb24gbm8KKyMgICBSU0FBdXRoZW50aWNhdGlvbiB5ZXMKKyMgICBQYXNzd29yZEF1dGhlbnRpY2F0aW9uIHllcworIyAgIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uIG5vCisjICAgR1NTQVBJQXV0aGVudGljYXRpb24gbm8KKyMgICBHU1NBUElEZWxlZ2F0ZUNyZWRlbnRpYWxzIG5vCisjICAgQmF0Y2hNb2RlIG5vCisjICAgQ2hlY2tIb3N0SVAgeWVzCisjICAgQWRkcmVzc0ZhbWlseSBhbnkKKyMgICBDb25uZWN0VGltZW91dCAwCisjICAgU3RyaWN0SG9zdEtleUNoZWNraW5nIGFzaworIyAgIElkZW50aXR5RmlsZSB+Ly5zc2gvaWRlbnRpdHkKKyMgICBJZGVudGl0eUZpbGUgfi8uc3NoL2lkX3JzYQorIyAgIElkZW50aXR5RmlsZSB+Ly5zc2gvaWRfZHNhCisjICAgUG9ydCAyMgorIyAgIFByb3RvY29sIDIsMQorIyAgIENpcGhlciAzZGVzCisjICAgQ2lwaGVycyBhZXMxMjgtY3RyLGFlczE5Mi1jdHIsYWVzMjU2LWN0cixhcmNmb3VyMjU2LGFyY2ZvdXIxMjgsYWVzMTI4LWNiYywzZGVzLWNiYworIyAgIE1BQ3MgaG1hYy1tZDUsaG1hYy1zaGExLHVtYWMtNjRAb3BlbnNzaC5jb20saG1hYy1yaXBlbWQxNjAKKyMgICBFc2NhcGVDaGFyIH4KKyMgICBUdW5uZWwgbm8KKyMgICBUdW5uZWxEZXZpY2UgYW55OmFueQorIyAgIFBlcm1pdExvY2FsQ29tbWFuZCBubworIyAgIFZpc3VhbEhvc3RLZXkgbm8KKyMgICBQcm94eUNvbW1hbmQgc3NoIC1xIC1XICVoOiVwIGdhdGV3YXkuZXhhbXBsZS5jb20KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc3NoX2NvbmZpZy4wIGIvb3BlbnNzaC02LjBwMS9zc2hfY29uZmlnLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFhNDUzYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc3NoX2NvbmZpZy4wCkBAIC0wLDAgKzEsNzY3IEBACitTU0hfQ09ORklHKDUpICAgICAgICAgICAgIE9wZW5CU0QgUHJvZ3JhbW1lcidzIE1hbnVhbCAgICAgICAgICAgIFNTSF9DT05GSUcoNSkKKworTkFNRQorICAgICBzc2hfY29uZmlnIC0gT3BlblNTSCBTU0ggY2xpZW50IGNvbmZpZ3VyYXRpb24gZmlsZXMKKworU1lOT1BTSVMKKyAgICAgfi8uc3NoL2NvbmZpZworICAgICAvZXRjL3NzaC9zc2hfY29uZmlnCisKK0RFU0NSSVBUSU9OCisgICAgIHNzaCgxKSBvYnRhaW5zIGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlcyBpbiB0aGUKKyAgICAgZm9sbG93aW5nIG9yZGVyOgorCisgICAgICAgICAgIDEuICAgY29tbWFuZC1saW5lIG9wdGlvbnMKKyAgICAgICAgICAgMi4gICB1c2VyJ3MgY29uZmlndXJhdGlvbiBmaWxlICh+Ly5zc2gvY29uZmlnKQorICAgICAgICAgICAzLiAgIHN5c3RlbS13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZSAoL2V0Yy9zc2gvc3NoX2NvbmZpZykKKworICAgICBGb3IgZWFjaCBwYXJhbWV0ZXIsIHRoZSBmaXJzdCBvYnRhaW5lZCB2YWx1ZSB3aWxsIGJlIHVzZWQuICBUaGUKKyAgICAgY29uZmlndXJhdGlvbiBmaWxlcyBjb250YWluIHNlY3Rpb25zIHNlcGFyYXRlZCBieSBgYEhvc3QnJworICAgICBzcGVjaWZpY2F0aW9ucywgYW5kIHRoYXQgc2VjdGlvbiBpcyBvbmx5IGFwcGxpZWQgZm9yIGhvc3RzIHRoYXQgbWF0Y2ggb25lCisgICAgIG9mIHRoZSBwYXR0ZXJucyBnaXZlbiBpbiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZSBtYXRjaGVkIGhvc3QgbmFtZSBpcyB0aGUKKyAgICAgb25lIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCisKKyAgICAgU2luY2UgdGhlIGZpcnN0IG9idGFpbmVkIHZhbHVlIGZvciBlYWNoIHBhcmFtZXRlciBpcyB1c2VkLCBtb3JlIGhvc3QtCisgICAgIHNwZWNpZmljIGRlY2xhcmF0aW9ucyBzaG91bGQgYmUgZ2l2ZW4gbmVhciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLCBhbmQKKyAgICAgZ2VuZXJhbCBkZWZhdWx0cyBhdCB0aGUgZW5kLgorCisgICAgIFRoZSBjb25maWd1cmF0aW9uIGZpbGUgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorCisgICAgIEVtcHR5IGxpbmVzIGFuZCBsaW5lcyBzdGFydGluZyB3aXRoIGAjJyBhcmUgY29tbWVudHMuICBPdGhlcndpc2UgYSBsaW5lCisgICAgIGlzIG9mIHRoZSBmb3JtYXQgYGBrZXl3b3JkIGFyZ3VtZW50cycnLiAgQ29uZmlndXJhdGlvbiBvcHRpb25zIG1heSBiZQorICAgICBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSBvciBvcHRpb25hbCB3aGl0ZXNwYWNlIGFuZCBleGFjdGx5IG9uZSBgPSc7IHRoZQorICAgICBsYXR0ZXIgZm9ybWF0IGlzIHVzZWZ1bCB0byBhdm9pZCB0aGUgbmVlZCB0byBxdW90ZSB3aGl0ZXNwYWNlIHdoZW4KKyAgICAgc3BlY2lmeWluZyBjb25maWd1cmF0aW9uIG9wdGlvbnMgdXNpbmcgdGhlIHNzaCwgc2NwLCBhbmQgc2Z0cCAtbyBvcHRpb24uCisgICAgIEFyZ3VtZW50cyBtYXkgb3B0aW9uYWxseSBiZSBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzICgiKSBpbiBvcmRlciB0bworICAgICByZXByZXNlbnQgYXJndW1lbnRzIGNvbnRhaW5pbmcgc3BhY2VzLgorCisgICAgIFRoZSBwb3NzaWJsZSBrZXl3b3JkcyBhbmQgdGhlaXIgbWVhbmluZ3MgYXJlIGFzIGZvbGxvd3MgKG5vdGUgdGhhdAorICAgICBrZXl3b3JkcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgYXJndW1lbnRzIGFyZSBjYXNlLXNlbnNpdGl2ZSk6CisKKyAgICAgSG9zdCAgICBSZXN0cmljdHMgdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbnMgKHVwIHRvIHRoZSBuZXh0IEhvc3QKKyAgICAgICAgICAgICBrZXl3b3JkKSB0byBiZSBvbmx5IGZvciB0aG9zZSBob3N0cyB0aGF0IG1hdGNoIG9uZSBvZiB0aGUKKyAgICAgICAgICAgICBwYXR0ZXJucyBnaXZlbiBhZnRlciB0aGUga2V5d29yZC4gIElmIG1vcmUgdGhhbiBvbmUgcGF0dGVybiBpcworICAgICAgICAgICAgIHByb3ZpZGVkLCB0aGV5IHNob3VsZCBiZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4gIEEgc2luZ2xlIGAqJworICAgICAgICAgICAgIGFzIGEgcGF0dGVybiBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGdsb2JhbCBkZWZhdWx0cyBmb3IgYWxsCisgICAgICAgICAgICAgaG9zdHMuICBUaGUgaG9zdCBpcyB0aGUgaG9zdG5hbWUgYXJndW1lbnQgZ2l2ZW4gb24gdGhlIGNvbW1hbmQKKyAgICAgICAgICAgICBsaW5lIChpLmUuIHRoZSBuYW1lIGlzIG5vdCBjb252ZXJ0ZWQgdG8gYSBjYW5vbmljYWxpemVkIGhvc3QgbmFtZQorICAgICAgICAgICAgIGJlZm9yZSBtYXRjaGluZykuCisKKyAgICAgICAgICAgICBBIHBhdHRlcm4gZW50cnkgbWF5IGJlIG5lZ2F0ZWQgYnkgcHJlZml4aW5nIGl0IHdpdGggYW4KKyAgICAgICAgICAgICBleGNsYW1hdGlvbiBtYXJrIChgIScpLiAgSWYgYSBuZWdhdGVkIGVudHJ5IGlzIG1hdGNoZWQsIHRoZW4gdGhlCisgICAgICAgICAgICAgSG9zdCBlbnRyeSBpcyBpZ25vcmVkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IG90aGVyIHBhdHRlcm5zCisgICAgICAgICAgICAgb24gdGhlIGxpbmUgbWF0Y2guICBOZWdhdGVkIG1hdGNoZXMgYXJlIHRoZXJlZm9yZSB1c2VmdWwgdG8KKyAgICAgICAgICAgICBwcm92aWRlIGV4Y2VwdGlvbnMgZm9yIHdpbGRjYXJkIG1hdGNoZXMuCisKKyAgICAgICAgICAgICBTZWUgUEFUVEVSTlMgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcGF0dGVybnMuCisKKyAgICAgQWRkcmVzc0ZhbWlseQorICAgICAgICAgICAgIFNwZWNpZmllcyB3aGljaCBhZGRyZXNzIGZhbWlseSB0byB1c2Ugd2hlbiBjb25uZWN0aW5nLiAgVmFsaWQKKyAgICAgICAgICAgICBhcmd1bWVudHMgYXJlIGBgYW55JycsIGBgaW5ldCcnICh1c2UgSVB2NCBvbmx5KSwgb3IgYGBpbmV0NicnCisgICAgICAgICAgICAgKHVzZSBJUHY2IG9ubHkpLgorCisgICAgIEJhdGNoTW9kZQorICAgICAgICAgICAgIElmIHNldCB0byBgYHllcycnLCBwYXNzcGhyYXNlL3Bhc3N3b3JkIHF1ZXJ5aW5nIHdpbGwgYmUgZGlzYWJsZWQuCisgICAgICAgICAgICAgVGhpcyBvcHRpb24gaXMgdXNlZnVsIGluIHNjcmlwdHMgYW5kIG90aGVyIGJhdGNoIGpvYnMgd2hlcmUgbm8KKyAgICAgICAgICAgICB1c2VyIGlzIHByZXNlbnQgdG8gc3VwcGx5IHRoZSBwYXNzd29yZC4gIFRoZSBhcmd1bWVudCBtdXN0IGJlCisgICAgICAgICAgICAgYGB5ZXMnJyBvciBgYG5vJycuICBUaGUgZGVmYXVsdCBpcyBgYG5vJycuCisKKyAgICAgQmluZEFkZHJlc3MKKyAgICAgICAgICAgICBVc2UgdGhlIHNwZWNpZmllZCBhZGRyZXNzIG9uIHRoZSBsb2NhbCBtYWNoaW5lIGFzIHRoZSBzb3VyY2UKKyAgICAgICAgICAgICBhZGRyZXNzIG9mIHRoZSBjb25uZWN0aW9uLiAgT25seSB1c2VmdWwgb24gc3lzdGVtcyB3aXRoIG1vcmUgdGhhbgorICAgICAgICAgICAgIG9uZSBhZGRyZXNzLiAgTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGRvZXMgbm90IHdvcmsgaWYKKyAgICAgICAgICAgICBVc2VQcml2aWxlZ2VkUG9ydCBpcyBzZXQgdG8gYGB5ZXMnJy4KKworICAgICBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIGNoYWxsZW5nZS1yZXNwb25zZSBhdXRoZW50aWNhdGlvbi4gIFRoZQorICAgICAgICAgICAgIGFyZ3VtZW50IHRvIHRoaXMga2V5d29yZCBtdXN0IGJlIGBgeWVzJycgb3IgYGBubycnLiAgVGhlIGRlZmF1bHQKKyAgICAgICAgICAgICBpcyBgYHllcycnLgorCisgICAgIENoZWNrSG9zdElQCisgICAgICAgICAgICAgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBgYHllcycnLCBzc2goMSkgd2lsbCBhZGRpdGlvbmFsbHkgY2hlY2sKKyAgICAgICAgICAgICB0aGUgaG9zdCBJUCBhZGRyZXNzIGluIHRoZSBrbm93bl9ob3N0cyBmaWxlLiAgVGhpcyBhbGxvd3Mgc3NoIHRvCisgICAgICAgICAgICAgZGV0ZWN0IGlmIGEgaG9zdCBrZXkgY2hhbmdlZCBkdWUgdG8gRE5TIHNwb29maW5nLiAgSWYgdGhlIG9wdGlvbgorICAgICAgICAgICAgIGlzIHNldCB0byBgYG5vJycsIHRoZSBjaGVjayB3aWxsIG5vdCBiZSBleGVjdXRlZC4gIFRoZSBkZWZhdWx0IGlzCisgICAgICAgICAgICAgYGB5ZXMnJy4KKworICAgICBDaXBoZXIgIFNwZWNpZmllcyB0aGUgY2lwaGVyIHRvIHVzZSBmb3IgZW5jcnlwdGluZyB0aGUgc2Vzc2lvbiBpbgorICAgICAgICAgICAgIHByb3RvY29sIHZlcnNpb24gMS4gIEN1cnJlbnRseSwgYGBibG93ZmlzaCcnLCBgYDNkZXMnJywgYW5kCisgICAgICAgICAgICAgYGBkZXMnJyBhcmUgc3VwcG9ydGVkLiAgZGVzIGlzIG9ubHkgc3VwcG9ydGVkIGluIHRoZSBzc2goMSkKKyAgICAgICAgICAgICBjbGllbnQgZm9yIGludGVyb3BlcmFiaWxpdHkgd2l0aCBsZWdhY3kgcHJvdG9jb2wgMQorICAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSAzZGVzIGNpcGhlci4gIEl0cyB1c2UgaXMKKyAgICAgICAgICAgICBzdHJvbmdseSBkaXNjb3VyYWdlZCBkdWUgdG8gY3J5cHRvZ3JhcGhpYyB3ZWFrbmVzc2VzLiAgVGhlCisgICAgICAgICAgICAgZGVmYXVsdCBpcyBgYDNkZXMnJy4KKworICAgICBDaXBoZXJzCisgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBjaXBoZXJzIGFsbG93ZWQgZm9yIHByb3RvY29sIHZlcnNpb24gMiBpbiBvcmRlciBvZgorICAgICAgICAgICAgIHByZWZlcmVuY2UuICBNdWx0aXBsZSBjaXBoZXJzIG11c3QgYmUgY29tbWEtc2VwYXJhdGVkLiAgVGhlCisgICAgICAgICAgICAgc3VwcG9ydGVkIGNpcGhlcnMgYXJlIGBgM2Rlcy1jYmMnJywgYGBhZXMxMjgtY2JjJycsCisgICAgICAgICAgICAgYGBhZXMxOTItY2JjJycsIGBgYWVzMjU2LWNiYycnLCBgYGFlczEyOC1jdHInJywgYGBhZXMxOTItY3RyJycsCisgICAgICAgICAgICAgYGBhZXMyNTYtY3RyJycsIGBgYXJjZm91cjEyOCcnLCBgYGFyY2ZvdXIyNTYnJywgYGBhcmNmb3VyJycsCisgICAgICAgICAgICAgYGBibG93ZmlzaC1jYmMnJywgYW5kIGBgY2FzdDEyOC1jYmMnJy4gIFRoZSBkZWZhdWx0IGlzOgorCisgICAgICAgICAgICAgICAgYWVzMTI4LWN0cixhZXMxOTItY3RyLGFlczI1Ni1jdHIsYXJjZm91cjI1NixhcmNmb3VyMTI4LAorICAgICAgICAgICAgICAgIGFlczEyOC1jYmMsM2Rlcy1jYmMsYmxvd2Zpc2gtY2JjLGNhc3QxMjgtY2JjLGFlczE5Mi1jYmMsCisgICAgICAgICAgICAgICAgYWVzMjU2LWNiYyxhcmNmb3VyCisKKyAgICAgQ2xlYXJBbGxGb3J3YXJkaW5ncworICAgICAgICAgICAgIFNwZWNpZmllcyB0aGF0IGFsbCBsb2NhbCwgcmVtb3RlLCBhbmQgZHluYW1pYyBwb3J0IGZvcndhcmRpbmdzCisgICAgICAgICAgICAgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIG9yIG9uIHRoZSBjb21tYW5kIGxpbmUgYmUKKyAgICAgICAgICAgICBjbGVhcmVkLiAgVGhpcyBvcHRpb24gaXMgcHJpbWFyaWx5IHVzZWZ1bCB3aGVuIHVzZWQgZnJvbSB0aGUKKyAgICAgICAgICAgICBzc2goMSkgY29tbWFuZCBsaW5lIHRvIGNsZWFyIHBvcnQgZm9yd2FyZGluZ3Mgc2V0IGluCisgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlcywgYW5kIGlzIGF1dG9tYXRpY2FsbHkgc2V0IGJ5IHNjcCgxKSBhbmQKKyAgICAgICAgICAgICBzZnRwKDEpLiAgVGhlIGFyZ3VtZW50IG11c3QgYmUgYGB5ZXMnJyBvciBgYG5vJycuICBUaGUgZGVmYXVsdCBpcworICAgICAgICAgICAgIGBgbm8nJy4KKworICAgICBDb21wcmVzc2lvbgorICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBjb21wcmVzc2lvbi4gIFRoZSBhcmd1bWVudCBtdXN0IGJlCisgICAgICAgICAgICAgYGB5ZXMnJyBvciBgYG5vJycuICBUaGUgZGVmYXVsdCBpcyBgYG5vJycuCisKKyAgICAgQ29tcHJlc3Npb25MZXZlbAorICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgY29tcHJlc3Npb24gbGV2ZWwgdG8gdXNlIGlmIGNvbXByZXNzaW9uIGlzIGVuYWJsZWQuCisgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IG11c3QgYmUgYW4gaW50ZWdlciBmcm9tIDEgKGZhc3QpIHRvIDkgKHNsb3csIGJlc3QpLgorICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGxldmVsIGlzIDYsIHdoaWNoIGlzIGdvb2QgZm9yIG1vc3QgYXBwbGljYXRpb25zLiAgVGhlCisgICAgICAgICAgICAgbWVhbmluZyBvZiB0aGUgdmFsdWVzIGlzIHRoZSBzYW1lIGFzIGluIGd6aXAoMSkuICBOb3RlIHRoYXQgdGhpcworICAgICAgICAgICAgIG9wdGlvbiBhcHBsaWVzIHRvIHByb3RvY29sIHZlcnNpb24gMSBvbmx5LgorCisgICAgIENvbm5lY3Rpb25BdHRlbXB0cworICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRyaWVzIChvbmUgcGVyIHNlY29uZCkgdG8gbWFrZSBiZWZvcmUKKyAgICAgICAgICAgICBleGl0aW5nLiAgVGhlIGFyZ3VtZW50IG11c3QgYmUgYW4gaW50ZWdlci4gIFRoaXMgbWF5IGJlIHVzZWZ1bCBpbgorICAgICAgICAgICAgIHNjcmlwdHMgaWYgdGhlIGNvbm5lY3Rpb24gc29tZXRpbWVzIGZhaWxzLiAgVGhlIGRlZmF1bHQgaXMgMS4KKworICAgICBDb25uZWN0VGltZW91dAorICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgdGltZW91dCAoaW4gc2Vjb25kcykgdXNlZCB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlCisgICAgICAgICAgICAgU1NIIHNlcnZlciwgaW5zdGVhZCBvZiB1c2luZyB0aGUgZGVmYXVsdCBzeXN0ZW0gVENQIHRpbWVvdXQuCisgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyB1c2VkIG9ubHkgd2hlbiB0aGUgdGFyZ2V0IGlzIGRvd24gb3IgcmVhbGx5CisgICAgICAgICAgICAgdW5yZWFjaGFibGUsIG5vdCB3aGVuIGl0IHJlZnVzZXMgdGhlIGNvbm5lY3Rpb24uCisKKyAgICAgQ29udHJvbE1hc3RlcgorICAgICAgICAgICAgIEVuYWJsZXMgdGhlIHNoYXJpbmcgb2YgbXVsdGlwbGUgc2Vzc2lvbnMgb3ZlciBhIHNpbmdsZSBuZXR3b3JrCisgICAgICAgICAgICAgY29ubmVjdGlvbi4gIFdoZW4gc2V0IHRvIGBgeWVzJycsIHNzaCgxKSB3aWxsIGxpc3RlbiBmb3IKKyAgICAgICAgICAgICBjb25uZWN0aW9ucyBvbiBhIGNvbnRyb2wgc29ja2V0IHNwZWNpZmllZCB1c2luZyB0aGUgQ29udHJvbFBhdGgKKyAgICAgICAgICAgICBhcmd1bWVudC4gIEFkZGl0aW9uYWwgc2Vzc2lvbnMgY2FuIGNvbm5lY3QgdG8gdGhpcyBzb2NrZXQgdXNpbmcKKyAgICAgICAgICAgICB0aGUgc2FtZSBDb250cm9sUGF0aCB3aXRoIENvbnRyb2xNYXN0ZXIgc2V0IHRvIGBgbm8nJyAodGhlCisgICAgICAgICAgICAgZGVmYXVsdCkuICBUaGVzZSBzZXNzaW9ucyB3aWxsIHRyeSB0byByZXVzZSB0aGUgbWFzdGVyIGluc3RhbmNlJ3MKKyAgICAgICAgICAgICBuZXR3b3JrIGNvbm5lY3Rpb24gcmF0aGVyIHRoYW4gaW5pdGlhdGluZyBuZXcgb25lcywgYnV0IHdpbGwgZmFsbAorICAgICAgICAgICAgIGJhY2sgdG8gY29ubmVjdGluZyBub3JtYWxseSBpZiB0aGUgY29udHJvbCBzb2NrZXQgZG9lcyBub3QgZXhpc3QsCisgICAgICAgICAgICAgb3IgaXMgbm90IGxpc3RlbmluZy4KKworICAgICAgICAgICAgIFNldHRpbmcgdGhpcyB0byBgYGFzaycnIHdpbGwgY2F1c2Ugc3NoIHRvIGxpc3RlbiBmb3IgY29udHJvbAorICAgICAgICAgICAgIGNvbm5lY3Rpb25zLCBidXQgcmVxdWlyZSBjb25maXJtYXRpb24gdXNpbmcgdGhlIFNTSF9BU0tQQVNTCisgICAgICAgICAgICAgcHJvZ3JhbSBiZWZvcmUgdGhleSBhcmUgYWNjZXB0ZWQgKHNlZSBzc2gtYWRkKDEpIGZvciBkZXRhaWxzKS4KKyAgICAgICAgICAgICBJZiB0aGUgQ29udHJvbFBhdGggY2Fubm90IGJlIG9wZW5lZCwgc3NoIHdpbGwgY29udGludWUgd2l0aG91dAorICAgICAgICAgICAgIGNvbm5lY3RpbmcgdG8gYSBtYXN0ZXIgaW5zdGFuY2UuCisKKyAgICAgICAgICAgICBYMTEgYW5kIHNzaC1hZ2VudCgxKSBmb3J3YXJkaW5nIGlzIHN1cHBvcnRlZCBvdmVyIHRoZXNlCisgICAgICAgICAgICAgbXVsdGlwbGV4ZWQgY29ubmVjdGlvbnMsIGhvd2V2ZXIgdGhlIGRpc3BsYXkgYW5kIGFnZW50IGZvcndhcmRlZAorICAgICAgICAgICAgIHdpbGwgYmUgdGhlIG9uZSBiZWxvbmdpbmcgdG8gdGhlIG1hc3RlciBjb25uZWN0aW9uIGkuZS4gaXQgaXMgbm90CisgICAgICAgICAgICAgcG9zc2libGUgdG8gZm9yd2FyZCBtdWx0aXBsZSBkaXNwbGF5cyBvciBhZ2VudHMuCisKKyAgICAgICAgICAgICBUd28gYWRkaXRpb25hbCBvcHRpb25zIGFsbG93IGZvciBvcHBvcnR1bmlzdGljIG11bHRpcGxleGluZzogdHJ5CisgICAgICAgICAgICAgdG8gdXNlIGEgbWFzdGVyIGNvbm5lY3Rpb24gYnV0IGZhbGwgYmFjayB0byBjcmVhdGluZyBhIG5ldyBvbmUgaWYKKyAgICAgICAgICAgICBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gIFRoZXNlIG9wdGlvbnMgYXJlOiBgYGF1dG8nJyBhbmQKKyAgICAgICAgICAgICBgYGF1dG9hc2snJy4gIFRoZSBsYXR0ZXIgcmVxdWlyZXMgY29uZmlybWF0aW9uIGxpa2UgdGhlIGBgYXNrJycKKyAgICAgICAgICAgICBvcHRpb24uCisKKyAgICAgQ29udHJvbFBhdGgKKyAgICAgICAgICAgICBTcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSBjb250cm9sIHNvY2tldCB1c2VkIGZvciBjb25uZWN0aW9uCisgICAgICAgICAgICAgc2hhcmluZyBhcyBkZXNjcmliZWQgaW4gdGhlIENvbnRyb2xNYXN0ZXIgc2VjdGlvbiBhYm92ZSBvciB0aGUKKyAgICAgICAgICAgICBzdHJpbmcgYGBub25lJycgdG8gZGlzYWJsZSBjb25uZWN0aW9uIHNoYXJpbmcuICBJbiB0aGUgcGF0aCwgYCVMJworICAgICAgICAgICAgIHdpbGwgYmUgc3Vic3RpdHV0ZWQgYnkgdGhlIGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgbG9jYWwgaG9zdAorICAgICAgICAgICAgIG5hbWUsIGAlbCcgd2lsbCBiZSBzdWJzdGl0dXRlZCBieSB0aGUgbG9jYWwgaG9zdCBuYW1lIChpbmNsdWRpbmcKKyAgICAgICAgICAgICBhbnkgZG9tYWluIG5hbWUpLCBgJWgnIHdpbGwgYmUgc3Vic3RpdHV0ZWQgYnkgdGhlIHRhcmdldCBob3N0CisgICAgICAgICAgICAgbmFtZSwgYCVuJyB3aWxsIGJlIHN1YnN0aXR1dGVkIGJ5IHRoZSBvcmlnaW5hbCB0YXJnZXQgaG9zdCBuYW1lCisgICAgICAgICAgICAgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIGAlcCcgdGhlIHBvcnQsIGAlcicgYnkgdGhlIHJlbW90ZQorICAgICAgICAgICAgIGxvZ2luIHVzZXJuYW1lLCBhbmQgYCV1JyBieSB0aGUgdXNlcm5hbWUgb2YgdGhlIHVzZXIgcnVubmluZworICAgICAgICAgICAgIHNzaCgxKS4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYW55IENvbnRyb2xQYXRoIHVzZWQgZm9yCisgICAgICAgICAgICAgb3Bwb3J0dW5pc3RpYyBjb25uZWN0aW9uIHNoYXJpbmcgaW5jbHVkZSBhdCBsZWFzdCAlaCwgJXAsIGFuZCAlci4KKyAgICAgICAgICAgICBUaGlzIGVuc3VyZXMgdGhhdCBzaGFyZWQgY29ubmVjdGlvbnMgYXJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCisKKyAgICAgQ29udHJvbFBlcnNpc3QKKyAgICAgICAgICAgICBXaGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBDb250cm9sTWFzdGVyLCBzcGVjaWZpZXMgdGhhdCB0aGUKKyAgICAgICAgICAgICBtYXN0ZXIgY29ubmVjdGlvbiBzaG91bGQgcmVtYWluIG9wZW4gaW4gdGhlIGJhY2tncm91bmQgKHdhaXRpbmcKKyAgICAgICAgICAgICBmb3IgZnV0dXJlIGNsaWVudCBjb25uZWN0aW9ucykgYWZ0ZXIgdGhlIGluaXRpYWwgY2xpZW50CisgICAgICAgICAgICAgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQuICBJZiBzZXQgdG8gYGBubycnLCB0aGVuIHRoZSBtYXN0ZXIKKyAgICAgICAgICAgICBjb25uZWN0aW9uIHdpbGwgbm90IGJlIHBsYWNlZCBpbnRvIHRoZSBiYWNrZ3JvdW5kLCBhbmQgd2lsbCBjbG9zZQorICAgICAgICAgICAgIGFzIHNvb24gYXMgdGhlIGluaXRpYWwgY2xpZW50IGNvbm5lY3Rpb24gaXMgY2xvc2VkLiAgSWYgc2V0IHRvCisgICAgICAgICAgICAgYGB5ZXMnJywgdGhlbiB0aGUgbWFzdGVyIGNvbm5lY3Rpb24gd2lsbCByZW1haW4gaW4gdGhlIGJhY2tncm91bmQKKyAgICAgICAgICAgICBpbmRlZmluaXRlbHkgKHVudGlsIGtpbGxlZCBvciBjbG9zZWQgdmlhIGEgbWVjaGFuaXNtIHN1Y2ggYXMgdGhlCisgICAgICAgICAgICAgc3NoKDEpIGBgLU8gZXhpdCcnIG9wdGlvbikuICBJZiBzZXQgdG8gYSB0aW1lIGluIHNlY29uZHMsIG9yIGEKKyAgICAgICAgICAgICB0aW1lIGluIGFueSBvZiB0aGUgZm9ybWF0cyBkb2N1bWVudGVkIGluIHNzaGRfY29uZmlnKDUpLCB0aGVuIHRoZQorICAgICAgICAgICAgIGJhY2tncm91bmRlZCBtYXN0ZXIgY29ubmVjdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIGFmdGVyCisgICAgICAgICAgICAgaXQgaGFzIHJlbWFpbmVkIGlkbGUgKHdpdGggbm8gY2xpZW50IGNvbm5lY3Rpb25zKSBmb3IgdGhlCisgICAgICAgICAgICAgc3BlY2lmaWVkIHRpbWUuCisKKyAgICAgRHluYW1pY0ZvcndhcmQKKyAgICAgICAgICAgICBTcGVjaWZpZXMgdGhhdCBhIFRDUCBwb3J0IG9uIHRoZSBsb2NhbCBtYWNoaW5lIGJlIGZvcndhcmRlZCBvdmVyCisgICAgICAgICAgICAgdGhlIHNlY3VyZSBjaGFubmVsLCBhbmQgdGhlIGFwcGxpY2F0aW9uIHByb3RvY29sIGlzIHRoZW4gdXNlZCB0bworICAgICAgICAgICAgIGRldGVybWluZSB3aGVyZSB0byBjb25uZWN0IHRvIGZyb20gdGhlIHJlbW90ZSBtYWNoaW5lLgorCisgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IG11c3QgYmUgW2JpbmRfYWRkcmVzczpdcG9ydC4gIElQdjYgYWRkcmVzc2VzIGNhbiBiZQorICAgICAgICAgICAgIHNwZWNpZmllZCBieSBlbmNsb3NpbmcgYWRkcmVzc2VzIGluIHNxdWFyZSBicmFja2V0cy4gIEJ5IGRlZmF1bHQsCisgICAgICAgICAgICAgdGhlIGxvY2FsIHBvcnQgaXMgYm91bmQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBHYXRld2F5UG9ydHMKKyAgICAgICAgICAgICBzZXR0aW5nLiAgSG93ZXZlciwgYW4gZXhwbGljaXQgYmluZF9hZGRyZXNzIG1heSBiZSB1c2VkIHRvIGJpbmQKKyAgICAgICAgICAgICB0aGUgY29ubmVjdGlvbiB0byBhIHNwZWNpZmljIGFkZHJlc3MuICBUaGUgYmluZF9hZGRyZXNzIG9mCisgICAgICAgICAgICAgYGBsb2NhbGhvc3QnJyBpbmRpY2F0ZXMgdGhhdCB0aGUgbGlzdGVuaW5nIHBvcnQgYmUgYm91bmQgZm9yCisgICAgICAgICAgICAgbG9jYWwgdXNlIG9ubHksIHdoaWxlIGFuIGVtcHR5IGFkZHJlc3Mgb3IgYConIGluZGljYXRlcyB0aGF0IHRoZQorICAgICAgICAgICAgIHBvcnQgc2hvdWxkIGJlIGF2YWlsYWJsZSBmcm9tIGFsbCBpbnRlcmZhY2VzLgorCisgICAgICAgICAgICAgQ3VycmVudGx5IHRoZSBTT0NLUzQgYW5kIFNPQ0tTNSBwcm90b2NvbHMgYXJlIHN1cHBvcnRlZCwgYW5kCisgICAgICAgICAgICAgc3NoKDEpIHdpbGwgYWN0IGFzIGEgU09DS1Mgc2VydmVyLiAgTXVsdGlwbGUgZm9yd2FyZGluZ3MgbWF5IGJlCisgICAgICAgICAgICAgc3BlY2lmaWVkLCBhbmQgYWRkaXRpb25hbCBmb3J3YXJkaW5ncyBjYW4gYmUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQKKyAgICAgICAgICAgICBsaW5lLiAgT25seSB0aGUgc3VwZXJ1c2VyIGNhbiBmb3J3YXJkIHByaXZpbGVnZWQgcG9ydHMuCisKKyAgICAgRW5hYmxlU1NIS2V5c2lnbgorICAgICAgICAgICAgIFNldHRpbmcgdGhpcyBvcHRpb24gdG8gYGB5ZXMnJyBpbiB0aGUgZ2xvYmFsIGNsaWVudCBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgZmlsZSAvZXRjL3NzaC9zc2hfY29uZmlnIGVuYWJsZXMgdGhlIHVzZSBvZiB0aGUgaGVscGVyIHByb2dyYW0KKyAgICAgICAgICAgICBzc2gta2V5c2lnbig4KSBkdXJpbmcgSG9zdGJhc2VkQXV0aGVudGljYXRpb24uICBUaGUgYXJndW1lbnQgbXVzdAorICAgICAgICAgICAgIGJlIGBgeWVzJycgb3IgYGBubycnLiAgVGhlIGRlZmF1bHQgaXMgYGBubycnLiAgVGhpcyBvcHRpb24gc2hvdWxkCisgICAgICAgICAgICAgYmUgcGxhY2VkIGluIHRoZSBub24taG9zdHNwZWNpZmljIHNlY3Rpb24uICBTZWUgc3NoLWtleXNpZ24oOCkKKyAgICAgICAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworICAgICBFc2NhcGVDaGFyCisgICAgICAgICAgICAgU2V0cyB0aGUgZXNjYXBlIGNoYXJhY3RlciAoZGVmYXVsdDogYH4nKS4gIFRoZSBlc2NhcGUgY2hhcmFjdGVyCisgICAgICAgICAgICAgY2FuIGFsc28gYmUgc2V0IG9uIHRoZSBjb21tYW5kIGxpbmUuICBUaGUgYXJndW1lbnQgc2hvdWxkIGJlIGEKKyAgICAgICAgICAgICBzaW5nbGUgY2hhcmFjdGVyLCBgXicgZm9sbG93ZWQgYnkgYSBsZXR0ZXIsIG9yIGBgbm9uZScnIHRvCisgICAgICAgICAgICAgZGlzYWJsZSB0aGUgZXNjYXBlIGNoYXJhY3RlciBlbnRpcmVseSAobWFraW5nIHRoZSBjb25uZWN0aW9uCisgICAgICAgICAgICAgdHJhbnNwYXJlbnQgZm9yIGJpbmFyeSBkYXRhKS4KKworICAgICBFeGl0T25Gb3J3YXJkRmFpbHVyZQorICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHNzaCgxKSBzaG91bGQgdGVybWluYXRlIHRoZSBjb25uZWN0aW9uIGlmIGl0CisgICAgICAgICAgICAgY2Fubm90IHNldCB1cCBhbGwgcmVxdWVzdGVkIGR5bmFtaWMsIHR1bm5lbCwgbG9jYWwsIGFuZCByZW1vdGUKKyAgICAgICAgICAgICBwb3J0IGZvcndhcmRpbmdzLiAgVGhlIGFyZ3VtZW50IG11c3QgYmUgYGB5ZXMnJyBvciBgYG5vJycuICBUaGUKKyAgICAgICAgICAgICBkZWZhdWx0IGlzIGBgbm8nJy4KKworICAgICBGb3J3YXJkQWdlbnQKKyAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciB0aGUgY29ubmVjdGlvbiB0byB0aGUgYXV0aGVudGljYXRpb24gYWdlbnQgKGlmCisgICAgICAgICAgICAgYW55KSB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgcmVtb3RlIG1hY2hpbmUuICBUaGUgYXJndW1lbnQgbXVzdAorICAgICAgICAgICAgIGJlIGBgeWVzJycgb3IgYGBubycnLiAgVGhlIGRlZmF1bHQgaXMgYGBubycnLgorCisgICAgICAgICAgICAgQWdlbnQgZm9yd2FyZGluZyBzaG91bGQgYmUgZW5hYmxlZCB3aXRoIGNhdXRpb24uICBVc2VycyB3aXRoIHRoZQorICAgICAgICAgICAgIGFiaWxpdHkgdG8gYnlwYXNzIGZpbGUgcGVybWlzc2lvbnMgb24gdGhlIHJlbW90ZSBob3N0IChmb3IgdGhlCisgICAgICAgICAgICAgYWdlbnQncyBVbml4LWRvbWFpbiBzb2NrZXQpIGNhbiBhY2Nlc3MgdGhlIGxvY2FsIGFnZW50IHRocm91Z2gKKyAgICAgICAgICAgICB0aGUgZm9yd2FyZGVkIGNvbm5lY3Rpb24uICBBbiBhdHRhY2tlciBjYW5ub3Qgb2J0YWluIGtleSBtYXRlcmlhbAorICAgICAgICAgICAgIGZyb20gdGhlIGFnZW50LCBob3dldmVyIHRoZXkgY2FuIHBlcmZvcm0gb3BlcmF0aW9ucyBvbiB0aGUga2V5cworICAgICAgICAgICAgIHRoYXQgZW5hYmxlIHRoZW0gdG8gYXV0aGVudGljYXRlIHVzaW5nIHRoZSBpZGVudGl0aWVzIGxvYWRlZCBpbnRvCisgICAgICAgICAgICAgdGhlIGFnZW50LgorCisgICAgIEZvcndhcmRYMTEKKyAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBYMTEgY29ubmVjdGlvbnMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5CisgICAgICAgICAgICAgcmVkaXJlY3RlZCBvdmVyIHRoZSBzZWN1cmUgY2hhbm5lbCBhbmQgRElTUExBWSBzZXQuICBUaGUgYXJndW1lbnQKKyAgICAgICAgICAgICBtdXN0IGJlIGBgeWVzJycgb3IgYGBubycnLiAgVGhlIGRlZmF1bHQgaXMgYGBubycnLgorCisgICAgICAgICAgICAgWDExIGZvcndhcmRpbmcgc2hvdWxkIGJlIGVuYWJsZWQgd2l0aCBjYXV0aW9uLiAgVXNlcnMgd2l0aCB0aGUKKyAgICAgICAgICAgICBhYmlsaXR5IHRvIGJ5cGFzcyBmaWxlIHBlcm1pc3Npb25zIG9uIHRoZSByZW1vdGUgaG9zdCAoZm9yIHRoZQorICAgICAgICAgICAgIHVzZXIncyBYMTEgYXV0aG9yaXphdGlvbiBkYXRhYmFzZSkgY2FuIGFjY2VzcyB0aGUgbG9jYWwgWDExCisgICAgICAgICAgICAgZGlzcGxheSB0aHJvdWdoIHRoZSBmb3J3YXJkZWQgY29ubmVjdGlvbi4gIEFuIGF0dGFja2VyIG1heSB0aGVuCisgICAgICAgICAgICAgYmUgYWJsZSB0byBwZXJmb3JtIGFjdGl2aXRpZXMgc3VjaCBhcyBrZXlzdHJva2UgbW9uaXRvcmluZyBpZiB0aGUKKyAgICAgICAgICAgICBGb3J3YXJkWDExVHJ1c3RlZCBvcHRpb24gaXMgYWxzbyBlbmFibGVkLgorCisgICAgIEZvcndhcmRYMTFUaW1lb3V0CisgICAgICAgICAgICAgU3BlY2lmeSBhIHRpbWVvdXQgZm9yIHVudHJ1c3RlZCBYMTEgZm9yd2FyZGluZyB1c2luZyB0aGUgZm9ybWF0CisgICAgICAgICAgICAgZGVzY3JpYmVkIGluIHRoZSBUSU1FIEZPUk1BVFMgc2VjdGlvbiBvZiBzc2hkX2NvbmZpZyg1KS4gIFgxMQorICAgICAgICAgICAgIGNvbm5lY3Rpb25zIHJlY2VpdmVkIGJ5IHNzaCgxKSBhZnRlciB0aGlzIHRpbWUgd2lsbCBiZSByZWZ1c2VkLgorICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIHRvIGRpc2FibGUgdW50cnVzdGVkIFgxMSBmb3J3YXJkaW5nIGFmdGVyIHR3ZW50eQorICAgICAgICAgICAgIG1pbnV0ZXMgaGFzIGVsYXBzZWQuCisKKyAgICAgRm9yd2FyZFgxMVRydXN0ZWQKKyAgICAgICAgICAgICBJZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gYGB5ZXMnJywgcmVtb3RlIFgxMSBjbGllbnRzIHdpbGwgaGF2ZQorICAgICAgICAgICAgIGZ1bGwgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBYMTEgZGlzcGxheS4KKworICAgICAgICAgICAgIElmIHRoaXMgb3B0aW9uIGlzIHNldCB0byBgYG5vJycsIHJlbW90ZSBYMTEgY2xpZW50cyB3aWxsIGJlCisgICAgICAgICAgICAgY29uc2lkZXJlZCB1bnRydXN0ZWQgYW5kIHByZXZlbnRlZCBmcm9tIHN0ZWFsaW5nIG9yIHRhbXBlcmluZworICAgICAgICAgICAgIHdpdGggZGF0YSBiZWxvbmdpbmcgdG8gdHJ1c3RlZCBYMTEgY2xpZW50cy4gIEZ1cnRoZXJtb3JlLCB0aGUKKyAgICAgICAgICAgICB4YXV0aCgxKSB0b2tlbiB1c2VkIGZvciB0aGUgc2Vzc2lvbiB3aWxsIGJlIHNldCB0byBleHBpcmUgYWZ0ZXIKKyAgICAgICAgICAgICAyMCBtaW51dGVzLiAgUmVtb3RlIGNsaWVudHMgd2lsbCBiZSByZWZ1c2VkIGFjY2VzcyBhZnRlciB0aGlzCisgICAgICAgICAgICAgdGltZS4KKworICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIGBgbm8nJy4KKworICAgICAgICAgICAgIFNlZSB0aGUgWDExIFNFQ1VSSVRZIGV4dGVuc2lvbiBzcGVjaWZpY2F0aW9uIGZvciBmdWxsIGRldGFpbHMgb24KKyAgICAgICAgICAgICB0aGUgcmVzdHJpY3Rpb25zIGltcG9zZWQgb24gdW50cnVzdGVkIGNsaWVudHMuCisKKyAgICAgR2F0ZXdheVBvcnRzCisgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgcmVtb3RlIGhvc3RzIGFyZSBhbGxvd2VkIHRvIGNvbm5lY3QgdG8gbG9jYWwKKyAgICAgICAgICAgICBmb3J3YXJkZWQgcG9ydHMuICBCeSBkZWZhdWx0LCBzc2goMSkgYmluZHMgbG9jYWwgcG9ydCBmb3J3YXJkaW5ncworICAgICAgICAgICAgIHRvIHRoZSBsb29wYmFjayBhZGRyZXNzLiAgVGhpcyBwcmV2ZW50cyBvdGhlciByZW1vdGUgaG9zdHMgZnJvbQorICAgICAgICAgICAgIGNvbm5lY3RpbmcgdG8gZm9yd2FyZGVkIHBvcnRzLiAgR2F0ZXdheVBvcnRzIGNhbiBiZSB1c2VkIHRvCisgICAgICAgICAgICAgc3BlY2lmeSB0aGF0IHNzaCBzaG91bGQgYmluZCBsb2NhbCBwb3J0IGZvcndhcmRpbmdzIHRvIHRoZQorICAgICAgICAgICAgIHdpbGRjYXJkIGFkZHJlc3MsIHRodXMgYWxsb3dpbmcgcmVtb3RlIGhvc3RzIHRvIGNvbm5lY3QgdG8KKyAgICAgICAgICAgICBmb3J3YXJkZWQgcG9ydHMuICBUaGUgYXJndW1lbnQgbXVzdCBiZSBgYHllcycnIG9yIGBgbm8nJy4gIFRoZQorICAgICAgICAgICAgIGRlZmF1bHQgaXMgYGBubycnLgorCisgICAgIEdsb2JhbEtub3duSG9zdHNGaWxlCisgICAgICAgICAgICAgU3BlY2lmaWVzIG9uZSBvciBtb3JlIGZpbGVzIHRvIHVzZSBmb3IgdGhlIGdsb2JhbCBob3N0IGtleQorICAgICAgICAgICAgIGRhdGFiYXNlLCBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4gIFRoZSBkZWZhdWx0IGlzCisgICAgICAgICAgICAgL2V0Yy9zc2gvc3NoX2tub3duX2hvc3RzLCAvZXRjL3NzaC9zc2hfa25vd25faG9zdHMyLgorCisgICAgIEdTU0FQSUF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgdXNlciBhdXRoZW50aWNhdGlvbiBiYXNlZCBvbiBHU1NBUEkgaXMgYWxsb3dlZC4KKyAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyBgYG5vJycuICBOb3RlIHRoYXQgdGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbAorICAgICAgICAgICAgIHZlcnNpb24gMiBvbmx5LgorCisgICAgIEdTU0FQSURlbGVnYXRlQ3JlZGVudGlhbHMKKyAgICAgICAgICAgICBGb3J3YXJkIChkZWxlZ2F0ZSkgY3JlZGVudGlhbHMgdG8gdGhlIHNlcnZlci4gIFRoZSBkZWZhdWx0IGlzCisgICAgICAgICAgICAgYGBubycnLiAgTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAyCisgICAgICAgICAgICAgb25seS4KKworICAgICBIYXNoS25vd25Ib3N0cworICAgICAgICAgICAgIEluZGljYXRlcyB0aGF0IHNzaCgxKSBzaG91bGQgaGFzaCBob3N0IG5hbWVzIGFuZCBhZGRyZXNzZXMgd2hlbgorICAgICAgICAgICAgIHRoZXkgYXJlIGFkZGVkIHRvIH4vLnNzaC9rbm93bl9ob3N0cy4gIFRoZXNlIGhhc2hlZCBuYW1lcyBtYXkgYmUKKyAgICAgICAgICAgICB1c2VkIG5vcm1hbGx5IGJ5IHNzaCgxKSBhbmQgc3NoZCg4KSwgYnV0IHRoZXkgZG8gbm90IHJldmVhbAorICAgICAgICAgICAgIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uIHNob3VsZCB0aGUgZmlsZSdzIGNvbnRlbnRzIGJlIGRpc2Nsb3NlZC4KKyAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyBgYG5vJycuICBOb3RlIHRoYXQgZXhpc3RpbmcgbmFtZXMgYW5kIGFkZHJlc3NlcyBpbgorICAgICAgICAgICAgIGtub3duIGhvc3RzIGZpbGVzIHdpbGwgbm90IGJlIGNvbnZlcnRlZCBhdXRvbWF0aWNhbGx5LCBidXQgbWF5IGJlCisgICAgICAgICAgICAgbWFudWFsbHkgaGFzaGVkIHVzaW5nIHNzaC1rZXlnZW4oMSkuCisKKyAgICAgSG9zdGJhc2VkQXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciB0byB0cnkgcmhvc3RzIGJhc2VkIGF1dGhlbnRpY2F0aW9uIHdpdGggcHVibGljCisgICAgICAgICAgICAga2V5IGF1dGhlbnRpY2F0aW9uLiAgVGhlIGFyZ3VtZW50IG11c3QgYmUgYGB5ZXMnJyBvciBgYG5vJycuICBUaGUKKyAgICAgICAgICAgICBkZWZhdWx0IGlzIGBgbm8nJy4gIFRoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAyCisgICAgICAgICAgICAgb25seSBhbmQgaXMgc2ltaWxhciB0byBSaG9zdHNSU0FBdXRoZW50aWNhdGlvbi4KKworICAgICBIb3N0S2V5QWxnb3JpdGhtcworICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcHJvdG9jb2wgdmVyc2lvbiAyIGhvc3Qga2V5IGFsZ29yaXRobXMgdGhhdCB0aGUKKyAgICAgICAgICAgICBjbGllbnQgd2FudHMgdG8gdXNlIGluIG9yZGVyIG9mIHByZWZlcmVuY2UuICBUaGUgZGVmYXVsdCBmb3IgdGhpcworICAgICAgICAgICAgIG9wdGlvbiBpczoKKworICAgICAgICAgICAgICAgIGVjZHNhLXNoYTItbmlzdHAyNTYtY2VydC12MDFAb3BlbnNzaC5jb20sCisgICAgICAgICAgICAgICAgZWNkc2Etc2hhMi1uaXN0cDM4NC1jZXJ0LXYwMUBvcGVuc3NoLmNvbSwKKyAgICAgICAgICAgICAgICBlY2RzYS1zaGEyLW5pc3RwNTIxLWNlcnQtdjAxQG9wZW5zc2guY29tLAorICAgICAgICAgICAgICAgIHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20sc3NoLWRzcy1jZXJ0LXYwMUBvcGVuc3NoLmNvbSwKKyAgICAgICAgICAgICAgICBzc2gtcnNhLWNlcnQtdjAwQG9wZW5zc2guY29tLHNzaC1kc3MtY2VydC12MDBAb3BlbnNzaC5jb20sCisgICAgICAgICAgICAgICAgZWNkc2Etc2hhMi1uaXN0cDI1NixlY2RzYS1zaGEyLW5pc3RwMzg0LGVjZHNhLXNoYTItbmlzdHA1MjEsCisgICAgICAgICAgICAgICAgc3NoLXJzYSxzc2gtZHNzCisKKyAgICAgICAgICAgICBJZiBob3N0a2V5cyBhcmUga25vd24gZm9yIHRoZSBkZXN0aW5hdGlvbiBob3N0IHRoZW4gdGhpcyBkZWZhdWx0CisgICAgICAgICAgICAgaXMgbW9kaWZpZWQgdG8gcHJlZmVyIHRoZWlyIGFsZ29yaXRobXMuCisKKyAgICAgSG9zdEtleUFsaWFzCisgICAgICAgICAgICAgU3BlY2lmaWVzIGFuIGFsaWFzIHRoYXQgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgcmVhbCBob3N0CisgICAgICAgICAgICAgbmFtZSB3aGVuIGxvb2tpbmcgdXAgb3Igc2F2aW5nIHRoZSBob3N0IGtleSBpbiB0aGUgaG9zdCBrZXkKKyAgICAgICAgICAgICBkYXRhYmFzZSBmaWxlcy4gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBmb3IgdHVubmVsaW5nIFNTSAorICAgICAgICAgICAgIGNvbm5lY3Rpb25zIG9yIGZvciBtdWx0aXBsZSBzZXJ2ZXJzIHJ1bm5pbmcgb24gYSBzaW5nbGUgaG9zdC4KKworICAgICBIb3N0TmFtZQorICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVhbCBob3N0IG5hbWUgdG8gbG9nIGludG8uICBUaGlzIGNhbiBiZSB1c2VkIHRvCisgICAgICAgICAgICAgc3BlY2lmeSBuaWNrbmFtZXMgb3IgYWJicmV2aWF0aW9ucyBmb3IgaG9zdHMuICBJZiB0aGUgaG9zdG5hbWUKKyAgICAgICAgICAgICBjb250YWlucyB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGAlaCcsIHRoZW4gdGhpcyB3aWxsIGJlIHJlcGxhY2VkCisgICAgICAgICAgICAgd2l0aCB0aGUgaG9zdCBuYW1lIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lICh0aGlzIGlzIHVzZWZ1bAorICAgICAgICAgICAgIGZvciBtYW5pcHVsYXRpbmcgdW5xdWFsaWZpZWQgbmFtZXMpLiAgVGhlIGRlZmF1bHQgaXMgdGhlIG5hbWUKKyAgICAgICAgICAgICBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgTnVtZXJpYyBJUCBhZGRyZXNzZXMgYXJlIGFsc28KKyAgICAgICAgICAgICBwZXJtaXR0ZWQgKGJvdGggb24gdGhlIGNvbW1hbmQgbGluZSBhbmQgaW4gSG9zdE5hbWUKKyAgICAgICAgICAgICBzcGVjaWZpY2F0aW9ucykuCisKKyAgICAgSWRlbnRpdGllc09ubHkKKyAgICAgICAgICAgICBTcGVjaWZpZXMgdGhhdCBzc2goMSkgc2hvdWxkIG9ubHkgdXNlIHRoZSBhdXRoZW50aWNhdGlvbiBpZGVudGl0eQorICAgICAgICAgICAgIGZpbGVzIGNvbmZpZ3VyZWQgaW4gdGhlIHNzaF9jb25maWcgZmlsZXMsIGV2ZW4gaWYgc3NoLWFnZW50KDEpCisgICAgICAgICAgICAgb2ZmZXJzIG1vcmUgaWRlbnRpdGllcy4gIFRoZSBhcmd1bWVudCB0byB0aGlzIGtleXdvcmQgbXVzdCBiZQorICAgICAgICAgICAgIGBgeWVzJycgb3IgYGBubycnLiAgVGhpcyBvcHRpb24gaXMgaW50ZW5kZWQgZm9yIHNpdHVhdGlvbnMgd2hlcmUKKyAgICAgICAgICAgICBzc2gtYWdlbnQgb2ZmZXJzIG1hbnkgZGlmZmVyZW50IGlkZW50aXRpZXMuICBUaGUgZGVmYXVsdCBpcworICAgICAgICAgICAgIGBgbm8nJy4KKworICAgICBJZGVudGl0eUZpbGUKKyAgICAgICAgICAgICBTcGVjaWZpZXMgYSBmaWxlIGZyb20gd2hpY2ggdGhlIHVzZXIncyBEU0EsIEVDRFNBIG9yIERTQQorICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uIGlkZW50aXR5IGlzIHJlYWQuICBUaGUgZGVmYXVsdCBpcyB+Ly5zc2gvaWRlbnRpdHkKKyAgICAgICAgICAgICBmb3IgcHJvdG9jb2wgdmVyc2lvbiAxLCBhbmQgfi8uc3NoL2lkX2RzYSwgfi8uc3NoL2lkX2VjZHNhIGFuZAorICAgICAgICAgICAgIH4vLnNzaC9pZF9yc2EgZm9yIHByb3RvY29sIHZlcnNpb24gMi4gIEFkZGl0aW9uYWxseSwgYW55CisgICAgICAgICAgICAgaWRlbnRpdGllcyByZXByZXNlbnRlZCBieSB0aGUgYXV0aGVudGljYXRpb24gYWdlbnQgd2lsbCBiZSB1c2VkCisgICAgICAgICAgICAgZm9yIGF1dGhlbnRpY2F0aW9uLiAgc3NoKDEpIHdpbGwgdHJ5IHRvIGxvYWQgY2VydGlmaWNhdGUKKyAgICAgICAgICAgICBpbmZvcm1hdGlvbiBmcm9tIHRoZSBmaWxlbmFtZSBvYnRhaW5lZCBieSBhcHBlbmRpbmcgLWNlcnQucHViIHRvCisgICAgICAgICAgICAgdGhlIHBhdGggb2YgYSBzcGVjaWZpZWQgSWRlbnRpdHlGaWxlLgorCisgICAgICAgICAgICAgVGhlIGZpbGUgbmFtZSBtYXkgdXNlIHRoZSB0aWxkZSBzeW50YXggdG8gcmVmZXIgdG8gYSB1c2VyJ3MgaG9tZQorICAgICAgICAgICAgIGRpcmVjdG9yeSBvciBvbmUgb2YgdGhlIGZvbGxvd2luZyBlc2NhcGUgY2hhcmFjdGVyczogYCVkJyAobG9jYWwKKyAgICAgICAgICAgICB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkpLCBgJXUnIChsb2NhbCB1c2VyIG5hbWUpLCBgJWwnIChsb2NhbCBob3N0CisgICAgICAgICAgICAgbmFtZSksIGAlaCcgKHJlbW90ZSBob3N0IG5hbWUpIG9yIGAlcicgKHJlbW90ZSB1c2VyIG5hbWUpLgorCisgICAgICAgICAgICAgSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBpZGVudGl0eSBmaWxlcyBzcGVjaWZpZWQgaW4KKyAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGZpbGVzOyBhbGwgdGhlc2UgaWRlbnRpdGllcyB3aWxsIGJlIHRyaWVkIGluCisgICAgICAgICAgICAgc2VxdWVuY2UuICBNdWx0aXBsZSBJZGVudGl0eUZpbGUgZGlyZWN0aXZlcyB3aWxsIGFkZCB0byB0aGUgbGlzdAorICAgICAgICAgICAgIG9mIGlkZW50aXRpZXMgdHJpZWQgKHRoaXMgYmVoYXZpb3VyIGRpZmZlcnMgZnJvbSB0aGF0IG9mIG90aGVyCisgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzKS4KKworICAgICBJUFFvUyAgIFNwZWNpZmllcyB0aGUgSVB2NCB0eXBlLW9mLXNlcnZpY2Ugb3IgRFNDUCBjbGFzcyBmb3IgY29ubmVjdGlvbnMuCisgICAgICAgICAgICAgQWNjZXB0ZWQgdmFsdWVzIGFyZSBgYGFmMTEnJywgYGBhZjEyJycsIGBgYWYxMycnLCBgYGFmMjEnJywKKyAgICAgICAgICAgICBgYGFmMjInJywgYGBhZjIzJycsIGBgYWYzMScnLCBgYGFmMzInJywgYGBhZjMzJycsIGBgYWY0MScnLAorICAgICAgICAgICAgIGBgYWY0MicnLCBgYGFmNDMnJywgYGBjczAnJywgYGBjczEnJywgYGBjczInJywgYGBjczMnJywgYGBjczQnJywKKyAgICAgICAgICAgICBgYGNzNScnLCBgYGNzNicnLCBgYGNzNycnLCBgYGVmJycsIGBgbG93ZGVsYXknJywgYGB0aHJvdWdocHV0JycsCisgICAgICAgICAgICAgYGByZWxpYWJpbGl0eScnLCBvciBhIG51bWVyaWMgdmFsdWUuICBUaGlzIG9wdGlvbiBtYXkgdGFrZSBvbmUgb3IKKyAgICAgICAgICAgICB0d28gYXJndW1lbnRzLCBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4gIElmIG9uZSBhcmd1bWVudCBpcworICAgICAgICAgICAgIHNwZWNpZmllZCwgaXQgaXMgdXNlZCBhcyB0aGUgcGFja2V0IGNsYXNzIHVuY29uZGl0aW9uYWxseS4gIElmCisgICAgICAgICAgICAgdHdvIHZhbHVlcyBhcmUgc3BlY2lmaWVkLCB0aGUgZmlyc3QgaXMgYXV0b21hdGljYWxseSBzZWxlY3RlZCBmb3IKKyAgICAgICAgICAgICBpbnRlcmFjdGl2ZSBzZXNzaW9ucyBhbmQgdGhlIHNlY29uZCBmb3Igbm9uLWludGVyYWN0aXZlIHNlc3Npb25zLgorICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIGBgbG93ZGVsYXknJyBmb3IgaW50ZXJhY3RpdmUgc2Vzc2lvbnMgYW5kCisgICAgICAgICAgICAgYGB0aHJvdWdocHV0JycgZm9yIG5vbi1pbnRlcmFjdGl2ZSBzZXNzaW9ucy4KKworICAgICBLYmRJbnRlcmFjdGl2ZUF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIGtleWJvYXJkLWludGVyYWN0aXZlIGF1dGhlbnRpY2F0aW9uLgorICAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0byB0aGlzIGtleXdvcmQgbXVzdCBiZSBgYHllcycnIG9yIGBgbm8nJy4gIFRoZQorICAgICAgICAgICAgIGRlZmF1bHQgaXMgYGB5ZXMnJy4KKworICAgICBLYmRJbnRlcmFjdGl2ZURldmljZXMKKyAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGxpc3Qgb2YgbWV0aG9kcyB0byB1c2UgaW4ga2V5Ym9hcmQtaW50ZXJhY3RpdmUKKyAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi4gIE11bHRpcGxlIG1ldGhvZCBuYW1lcyBtdXN0IGJlIGNvbW1hLXNlcGFyYXRlZC4KKyAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyB0byB1c2UgdGhlIHNlcnZlciBzcGVjaWZpZWQgbGlzdC4gIFRoZSBtZXRob2RzCisgICAgICAgICAgICAgYXZhaWxhYmxlIHZhcnkgZGVwZW5kaW5nIG9uIHdoYXQgdGhlIHNlcnZlciBzdXBwb3J0cy4gIEZvciBhbgorICAgICAgICAgICAgIE9wZW5TU0ggc2VydmVyLCBpdCBtYXkgYmUgemVybyBvciBtb3JlIG9mOiBgYGJzZGF1dGgnJywgYGBwYW0nJywKKyAgICAgICAgICAgICBhbmQgYGBza2V5JycuCisKKyAgICAgS2V4QWxnb3JpdGhtcworICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgYXZhaWxhYmxlIEtFWCAoS2V5IEV4Y2hhbmdlKSBhbGdvcml0aG1zLiAgTXVsdGlwbGUKKyAgICAgICAgICAgICBhbGdvcml0aG1zIG11c3QgYmUgY29tbWEtc2VwYXJhdGVkLiAgVGhlIGRlZmF1bHQgaXM6CisKKyAgICAgICAgICAgICAgICAgICBlY2RoLXNoYTItbmlzdHAyNTYsZWNkaC1zaGEyLW5pc3RwMzg0LGVjZGgtc2hhMi1uaXN0cDUyMSwKKyAgICAgICAgICAgICAgICAgICBkaWZmaWUtaGVsbG1hbi1ncm91cC1leGNoYW5nZS1zaGEyNTYsCisgICAgICAgICAgICAgICAgICAgZGlmZmllLWhlbGxtYW4tZ3JvdXAtZXhjaGFuZ2Utc2hhMSwKKyAgICAgICAgICAgICAgICAgICBkaWZmaWUtaGVsbG1hbi1ncm91cDE0LXNoYTEsCisgICAgICAgICAgICAgICAgICAgZGlmZmllLWhlbGxtYW4tZ3JvdXAxLXNoYTEKKworICAgICBMb2NhbENvbW1hbmQKKyAgICAgICAgICAgICBTcGVjaWZpZXMgYSBjb21tYW5kIHRvIGV4ZWN1dGUgb24gdGhlIGxvY2FsIG1hY2hpbmUgYWZ0ZXIKKyAgICAgICAgICAgICBzdWNjZXNzZnVsbHkgY29ubmVjdGluZyB0byB0aGUgc2VydmVyLiAgVGhlIGNvbW1hbmQgc3RyaW5nCisgICAgICAgICAgICAgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLCBhbmQgaXMgZXhlY3V0ZWQgd2l0aCB0aGUgdXNlcidzCisgICAgICAgICAgICAgc2hlbGwuICBUaGUgZm9sbG93aW5nIGVzY2FwZSBjaGFyYWN0ZXIgc3Vic3RpdHV0aW9ucyB3aWxsIGJlCisgICAgICAgICAgICAgcGVyZm9ybWVkOiBgJWQnIChsb2NhbCB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkpLCBgJWgnIChyZW1vdGUgaG9zdAorICAgICAgICAgICAgIG5hbWUpLCBgJWwnIChsb2NhbCBob3N0IG5hbWUpLCBgJW4nIChob3N0IG5hbWUgYXMgcHJvdmlkZWQgb24gdGhlCisgICAgICAgICAgICAgY29tbWFuZCBsaW5lKSwgYCVwJyAocmVtb3RlIHBvcnQpLCBgJXInIChyZW1vdGUgdXNlciBuYW1lKSBvcgorICAgICAgICAgICAgIGAldScgKGxvY2FsIHVzZXIgbmFtZSkuCisKKyAgICAgICAgICAgICBUaGUgY29tbWFuZCBpcyBydW4gc3luY2hyb25vdXNseSBhbmQgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlCisgICAgICAgICAgICAgc2Vzc2lvbiBvZiB0aGUgc3NoKDEpIHRoYXQgc3Bhd25lZCBpdC4gIEl0IHNob3VsZCBub3QgYmUgdXNlZCBmb3IKKyAgICAgICAgICAgICBpbnRlcmFjdGl2ZSBjb21tYW5kcy4KKworICAgICAgICAgICAgIFRoaXMgZGlyZWN0aXZlIGlzIGlnbm9yZWQgdW5sZXNzIFBlcm1pdExvY2FsQ29tbWFuZCBoYXMgYmVlbgorICAgICAgICAgICAgIGVuYWJsZWQuCisKKyAgICAgTG9jYWxGb3J3YXJkCisgICAgICAgICAgICAgU3BlY2lmaWVzIHRoYXQgYSBUQ1AgcG9ydCBvbiB0aGUgbG9jYWwgbWFjaGluZSBiZSBmb3J3YXJkZWQgb3ZlcgorICAgICAgICAgICAgIHRoZSBzZWN1cmUgY2hhbm5lbCB0byB0aGUgc3BlY2lmaWVkIGhvc3QgYW5kIHBvcnQgZnJvbSB0aGUgcmVtb3RlCisgICAgICAgICAgICAgbWFjaGluZS4gIFRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIFtiaW5kX2FkZHJlc3M6XXBvcnQgYW5kIHRoZQorICAgICAgICAgICAgIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGhvc3Q6aG9zdHBvcnQuICBJUHY2IGFkZHJlc3NlcyBjYW4gYmUKKyAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgZW5jbG9zaW5nIGFkZHJlc3NlcyBpbiBzcXVhcmUgYnJhY2tldHMuICBNdWx0aXBsZQorICAgICAgICAgICAgIGZvcndhcmRpbmdzIG1heSBiZSBzcGVjaWZpZWQsIGFuZCBhZGRpdGlvbmFsIGZvcndhcmRpbmdzIGNhbiBiZQorICAgICAgICAgICAgIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuICBPbmx5IHRoZSBzdXBlcnVzZXIgY2FuIGZvcndhcmQKKyAgICAgICAgICAgICBwcml2aWxlZ2VkIHBvcnRzLiAgQnkgZGVmYXVsdCwgdGhlIGxvY2FsIHBvcnQgaXMgYm91bmQgaW4KKyAgICAgICAgICAgICBhY2NvcmRhbmNlIHdpdGggdGhlIEdhdGV3YXlQb3J0cyBzZXR0aW5nLiAgSG93ZXZlciwgYW4gZXhwbGljaXQKKyAgICAgICAgICAgICBiaW5kX2FkZHJlc3MgbWF5IGJlIHVzZWQgdG8gYmluZCB0aGUgY29ubmVjdGlvbiB0byBhIHNwZWNpZmljCisgICAgICAgICAgICAgYWRkcmVzcy4gIFRoZSBiaW5kX2FkZHJlc3Mgb2YgYGBsb2NhbGhvc3QnJyBpbmRpY2F0ZXMgdGhhdCB0aGUKKyAgICAgICAgICAgICBsaXN0ZW5pbmcgcG9ydCBiZSBib3VuZCBmb3IgbG9jYWwgdXNlIG9ubHksIHdoaWxlIGFuIGVtcHR5CisgICAgICAgICAgICAgYWRkcmVzcyBvciBgKicgaW5kaWNhdGVzIHRoYXQgdGhlIHBvcnQgc2hvdWxkIGJlIGF2YWlsYWJsZSBmcm9tCisgICAgICAgICAgICAgYWxsIGludGVyZmFjZXMuCisKKyAgICAgTG9nTGV2ZWwKKyAgICAgICAgICAgICBHaXZlcyB0aGUgdmVyYm9zaXR5IGxldmVsIHRoYXQgaXMgdXNlZCB3aGVuIGxvZ2dpbmcgbWVzc2FnZXMgZnJvbQorICAgICAgICAgICAgIHNzaCgxKS4gIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOiBRVUlFVCwgRkFUQUwsIEVSUk9SLCBJTkZPLAorICAgICAgICAgICAgIFZFUkJPU0UsIERFQlVHLCBERUJVRzEsIERFQlVHMiwgYW5kIERFQlVHMy4gIFRoZSBkZWZhdWx0IGlzIElORk8uCisgICAgICAgICAgICAgREVCVUcgYW5kIERFQlVHMSBhcmUgZXF1aXZhbGVudC4gIERFQlVHMiBhbmQgREVCVUczIGVhY2ggc3BlY2lmeQorICAgICAgICAgICAgIGhpZ2hlciBsZXZlbHMgb2YgdmVyYm9zZSBvdXRwdXQuCisKKyAgICAgTUFDcyAgICBTcGVjaWZpZXMgdGhlIE1BQyAobWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlKSBhbGdvcml0aG1zIGluCisgICAgICAgICAgICAgb3JkZXIgb2YgcHJlZmVyZW5jZS4gIFRoZSBNQUMgYWxnb3JpdGhtIGlzIHVzZWQgaW4gcHJvdG9jb2wKKyAgICAgICAgICAgICB2ZXJzaW9uIDIgZm9yIGRhdGEgaW50ZWdyaXR5IHByb3RlY3Rpb24uICBNdWx0aXBsZSBhbGdvcml0aG1zCisgICAgICAgICAgICAgbXVzdCBiZSBjb21tYS1zZXBhcmF0ZWQuICBUaGUgZGVmYXVsdCBpczoKKworICAgICAgICAgICAgICAgICAgIGhtYWMtbWQ1LGhtYWMtc2hhMSx1bWFjLTY0QG9wZW5zc2guY29tLAorICAgICAgICAgICAgICAgICAgIGhtYWMtcmlwZW1kMTYwLGhtYWMtc2hhMS05NixobWFjLW1kNS05NiwKKyAgICAgICAgICAgICAgICAgICBobWFjLXNoYTItMjU2LGhtYWMtc2hhMi0yNTYtOTYsaG1hYy1zaGEyLTUxMiwKKyAgICAgICAgICAgICAgICAgICBobWFjLXNoYTItNTEyLTk2CisKKyAgICAgTm9Ib3N0QXV0aGVudGljYXRpb25Gb3JMb2NhbGhvc3QKKyAgICAgICAgICAgICBUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCBpZiB0aGUgaG9tZSBkaXJlY3RvcnkgaXMgc2hhcmVkIGFjcm9zcworICAgICAgICAgICAgIG1hY2hpbmVzLiAgSW4gdGhpcyBjYXNlIGxvY2FsaG9zdCB3aWxsIHJlZmVyIHRvIGEgZGlmZmVyZW50CisgICAgICAgICAgICAgbWFjaGluZSBvbiBlYWNoIG9mIHRoZSBtYWNoaW5lcyBhbmQgdGhlIHVzZXIgd2lsbCBnZXQgbWFueQorICAgICAgICAgICAgIHdhcm5pbmdzIGFib3V0IGNoYW5nZWQgaG9zdCBrZXlzLiAgSG93ZXZlciwgdGhpcyBvcHRpb24gZGlzYWJsZXMKKyAgICAgICAgICAgICBob3N0IGF1dGhlbnRpY2F0aW9uIGZvciBsb2NhbGhvc3QuICBUaGUgYXJndW1lbnQgdG8gdGhpcyBrZXl3b3JkCisgICAgICAgICAgICAgbXVzdCBiZSBgYHllcycnIG9yIGBgbm8nJy4gIFRoZSBkZWZhdWx0IGlzIHRvIGNoZWNrIHRoZSBob3N0IGtleQorICAgICAgICAgICAgIGZvciBsb2NhbGhvc3QuCisKKyAgICAgTnVtYmVyT2ZQYXNzd29yZFByb21wdHMKKyAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBwYXNzd29yZCBwcm9tcHRzIGJlZm9yZSBnaXZpbmcgdXAuICBUaGUKKyAgICAgICAgICAgICBhcmd1bWVudCB0byB0aGlzIGtleXdvcmQgbXVzdCBiZSBhbiBpbnRlZ2VyLiAgVGhlIGRlZmF1bHQgaXMgMy4KKworICAgICBQYXNzd29yZEF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uLiAgVGhlIGFyZ3VtZW50CisgICAgICAgICAgICAgdG8gdGhpcyBrZXl3b3JkIG11c3QgYmUgYGB5ZXMnJyBvciBgYG5vJycuICBUaGUgZGVmYXVsdCBpcworICAgICAgICAgICAgIGBgeWVzJycuCisKKyAgICAgUGVybWl0TG9jYWxDb21tYW5kCisgICAgICAgICAgICAgQWxsb3cgbG9jYWwgY29tbWFuZCBleGVjdXRpb24gdmlhIHRoZSBMb2NhbENvbW1hbmQgb3B0aW9uIG9yCisgICAgICAgICAgICAgdXNpbmcgdGhlICFjb21tYW5kIGVzY2FwZSBzZXF1ZW5jZSBpbiBzc2goMSkuICBUaGUgYXJndW1lbnQgbXVzdAorICAgICAgICAgICAgIGJlIGBgeWVzJycgb3IgYGBubycnLiAgVGhlIGRlZmF1bHQgaXMgYGBubycnLgorCisgICAgIFBLQ1MxMVByb3ZpZGVyCisgICAgICAgICAgICAgU3BlY2lmaWVzIHdoaWNoIFBLQ1MjMTEgcHJvdmlkZXIgdG8gdXNlLiAgVGhlIGFyZ3VtZW50IHRvIHRoaXMKKyAgICAgICAgICAgICBrZXl3b3JkIGlzIHRoZSBQS0NTIzExIHNoYXJlZCBsaWJyYXJ5IHNzaCgxKSBzaG91bGQgdXNlIHRvCisgICAgICAgICAgICAgY29tbXVuaWNhdGUgd2l0aCBhIFBLQ1MjMTEgdG9rZW4gcHJvdmlkaW5nIHRoZSB1c2VyJ3MgcHJpdmF0ZSBSU0EKKyAgICAgICAgICAgICBrZXkuCisKKyAgICAgUG9ydCAgICBTcGVjaWZpZXMgdGhlIHBvcnQgbnVtYmVyIHRvIGNvbm5lY3Qgb24gdGhlIHJlbW90ZSBob3N0LiAgVGhlCisgICAgICAgICAgICAgZGVmYXVsdCBpcyAyMi4KKworICAgICBQcmVmZXJyZWRBdXRoZW50aWNhdGlvbnMKKyAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBjbGllbnQgc2hvdWxkIHRyeSBwcm90b2NvbCAyCisgICAgICAgICAgICAgYXV0aGVudGljYXRpb24gbWV0aG9kcy4gIFRoaXMgYWxsb3dzIGEgY2xpZW50IHRvIHByZWZlciBvbmUKKyAgICAgICAgICAgICBtZXRob2QgKGUuZy4ga2V5Ym9hcmQtaW50ZXJhY3RpdmUpIG92ZXIgYW5vdGhlciBtZXRob2QgKGUuZy4KKyAgICAgICAgICAgICBwYXNzd29yZCkuICBUaGUgZGVmYXVsdCBpczoKKworICAgICAgICAgICAgICAgICAgIGdzc2FwaS13aXRoLW1pYyxob3N0YmFzZWQscHVibGlja2V5LAorICAgICAgICAgICAgICAgICAgIGtleWJvYXJkLWludGVyYWN0aXZlLHBhc3N3b3JkCisKKyAgICAgUHJvdG9jb2wKKyAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHByb3RvY29sIHZlcnNpb25zIHNzaCgxKSBzaG91bGQgc3VwcG9ydCBpbiBvcmRlciBvZgorICAgICAgICAgICAgIHByZWZlcmVuY2UuICBUaGUgcG9zc2libGUgdmFsdWVzIGFyZSBgMScgYW5kIGAyJy4gIE11bHRpcGxlCisgICAgICAgICAgICAgdmVyc2lvbnMgbXVzdCBiZSBjb21tYS1zZXBhcmF0ZWQuICBXaGVuIHRoaXMgb3B0aW9uIGlzIHNldCB0bworICAgICAgICAgICAgIGBgMiwxJycgc3NoIHdpbGwgdHJ5IHZlcnNpb24gMiBhbmQgZmFsbCBiYWNrIHRvIHZlcnNpb24gMSBpZgorICAgICAgICAgICAgIHZlcnNpb24gMiBpcyBub3QgYXZhaWxhYmxlLiAgVGhlIGRlZmF1bHQgaXMgYDInLgorCisgICAgIFByb3h5Q29tbWFuZAorICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgY29tbWFuZCB0byB1c2UgdG8gY29ubmVjdCB0byB0aGUgc2VydmVyLiAgVGhlCisgICAgICAgICAgICAgY29tbWFuZCBzdHJpbmcgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLCBhbmQgaXMgZXhlY3V0ZWQKKyAgICAgICAgICAgICB3aXRoIHRoZSB1c2VyJ3Mgc2hlbGwuICBJbiB0aGUgY29tbWFuZCBzdHJpbmcsIGFueSBvY2N1cnJlbmNlIG9mCisgICAgICAgICAgICAgYCVoJyB3aWxsIGJlIHN1YnN0aXR1dGVkIGJ5IHRoZSBob3N0IG5hbWUgdG8gY29ubmVjdCwgYCVwJyBieSB0aGUKKyAgICAgICAgICAgICBwb3J0LCBhbmQgYCVyJyBieSB0aGUgcmVtb3RlIHVzZXIgbmFtZS4gIFRoZSBjb21tYW5kIGNhbiBiZQorICAgICAgICAgICAgIGJhc2ljYWxseSBhbnl0aGluZywgYW5kIHNob3VsZCByZWFkIGZyb20gaXRzIHN0YW5kYXJkIGlucHV0IGFuZAorICAgICAgICAgICAgIHdyaXRlIHRvIGl0cyBzdGFuZGFyZCBvdXRwdXQuICBJdCBzaG91bGQgZXZlbnR1YWxseSBjb25uZWN0IGFuCisgICAgICAgICAgICAgc3NoZCg4KSBzZXJ2ZXIgcnVubmluZyBvbiBzb21lIG1hY2hpbmUsIG9yIGV4ZWN1dGUgc3NoZCAtaQorICAgICAgICAgICAgIHNvbWV3aGVyZS4gIEhvc3Qga2V5IG1hbmFnZW1lbnQgd2lsbCBiZSBkb25lIHVzaW5nIHRoZSBIb3N0TmFtZQorICAgICAgICAgICAgIG9mIHRoZSBob3N0IGJlaW5nIGNvbm5lY3RlZCAoZGVmYXVsdGluZyB0byB0aGUgbmFtZSB0eXBlZCBieSB0aGUKKyAgICAgICAgICAgICB1c2VyKS4gIFNldHRpbmcgdGhlIGNvbW1hbmQgdG8gYGBub25lJycgZGlzYWJsZXMgdGhpcyBvcHRpb24KKyAgICAgICAgICAgICBlbnRpcmVseS4gIE5vdGUgdGhhdCBDaGVja0hvc3RJUCBpcyBub3QgYXZhaWxhYmxlIGZvciBjb25uZWN0cworICAgICAgICAgICAgIHdpdGggYSBwcm94eSBjb21tYW5kLgorCisgICAgICAgICAgICAgVGhpcyBkaXJlY3RpdmUgaXMgdXNlZnVsIGluIGNvbmp1bmN0aW9uIHdpdGggbmMoMSkgYW5kIGl0cyBwcm94eQorICAgICAgICAgICAgIHN1cHBvcnQuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBkaXJlY3RpdmUgd291bGQgY29ubmVjdCB2aWEKKyAgICAgICAgICAgICBhbiBIVFRQIHByb3h5IGF0IDE5Mi4wLjIuMDoKKworICAgICAgICAgICAgICAgIFByb3h5Q29tbWFuZCAvdXNyL2Jpbi9uYyAtWCBjb25uZWN0IC14IDE5Mi4wLjIuMDo4MDgwICVoICVwCisKKyAgICAgUHVia2V5QXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciB0byB0cnkgcHVibGljIGtleSBhdXRoZW50aWNhdGlvbi4gIFRoZSBhcmd1bWVudAorICAgICAgICAgICAgIHRvIHRoaXMga2V5d29yZCBtdXN0IGJlIGBgeWVzJycgb3IgYGBubycnLiAgVGhlIGRlZmF1bHQgaXMKKyAgICAgICAgICAgICBgYHllcycnLiAgVGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDIgb25seS4KKworICAgICBSZWtleUxpbWl0CisgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBkYXRhIHRoYXQgbWF5IGJlIHRyYW5zbWl0dGVkCisgICAgICAgICAgICAgYmVmb3JlIHRoZSBzZXNzaW9uIGtleSBpcyByZW5lZ290aWF0ZWQuICBUaGUgYXJndW1lbnQgaXMgdGhlCisgICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzLCB3aXRoIGFuIG9wdGlvbmFsIHN1ZmZpeCBvZiBgSycsIGBNJywgb3IgYEcnIHRvCisgICAgICAgICAgICAgaW5kaWNhdGUgS2lsb2J5dGVzLCBNZWdhYnl0ZXMsIG9yIEdpZ2FieXRlcywgcmVzcGVjdGl2ZWx5LiAgVGhlCisgICAgICAgICAgICAgZGVmYXVsdCBpcyBiZXR3ZWVuIGAxRycgYW5kIGA0RycsIGRlcGVuZGluZyBvbiB0aGUgY2lwaGVyLiAgVGhpcworICAgICAgICAgICAgIG9wdGlvbiBhcHBsaWVzIHRvIHByb3RvY29sIHZlcnNpb24gMiBvbmx5LgorCisgICAgIFJlbW90ZUZvcndhcmQKKyAgICAgICAgICAgICBTcGVjaWZpZXMgdGhhdCBhIFRDUCBwb3J0IG9uIHRoZSByZW1vdGUgbWFjaGluZSBiZSBmb3J3YXJkZWQgb3ZlcgorICAgICAgICAgICAgIHRoZSBzZWN1cmUgY2hhbm5lbCB0byB0aGUgc3BlY2lmaWVkIGhvc3QgYW5kIHBvcnQgZnJvbSB0aGUgbG9jYWwKKyAgICAgICAgICAgICBtYWNoaW5lLiAgVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgW2JpbmRfYWRkcmVzczpdcG9ydCBhbmQgdGhlCisgICAgICAgICAgICAgc2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgaG9zdDpob3N0cG9ydC4gIElQdjYgYWRkcmVzc2VzIGNhbiBiZQorICAgICAgICAgICAgIHNwZWNpZmllZCBieSBlbmNsb3NpbmcgYWRkcmVzc2VzIGluIHNxdWFyZSBicmFja2V0cy4gIE11bHRpcGxlCisgICAgICAgICAgICAgZm9yd2FyZGluZ3MgbWF5IGJlIHNwZWNpZmllZCwgYW5kIGFkZGl0aW9uYWwgZm9yd2FyZGluZ3MgY2FuIGJlCisgICAgICAgICAgICAgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4gIFByaXZpbGVnZWQgcG9ydHMgY2FuIGJlIGZvcndhcmRlZAorICAgICAgICAgICAgIG9ubHkgd2hlbiBsb2dnaW5nIGluIGFzIHJvb3Qgb24gdGhlIHJlbW90ZSBtYWNoaW5lLgorCisgICAgICAgICAgICAgSWYgdGhlIHBvcnQgYXJndW1lbnQgaXMgYDAnLCB0aGUgbGlzdGVuIHBvcnQgd2lsbCBiZSBkeW5hbWljYWxseQorICAgICAgICAgICAgIGFsbG9jYXRlZCBvbiB0aGUgc2VydmVyIGFuZCByZXBvcnRlZCB0byB0aGUgY2xpZW50IGF0IHJ1biB0aW1lLgorCisgICAgICAgICAgICAgSWYgdGhlIGJpbmRfYWRkcmVzcyBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBpcyB0byBvbmx5IGJpbmQKKyAgICAgICAgICAgICB0byBsb29wYmFjayBhZGRyZXNzZXMuICBJZiB0aGUgYmluZF9hZGRyZXNzIGlzIGAqJyBvciBhbiBlbXB0eQorICAgICAgICAgICAgIHN0cmluZywgdGhlbiB0aGUgZm9yd2FyZGluZyBpcyByZXF1ZXN0ZWQgdG8gbGlzdGVuIG9uIGFsbAorICAgICAgICAgICAgIGludGVyZmFjZXMuICBTcGVjaWZ5aW5nIGEgcmVtb3RlIGJpbmRfYWRkcmVzcyB3aWxsIG9ubHkgc3VjY2VlZAorICAgICAgICAgICAgIGlmIHRoZSBzZXJ2ZXIncyBHYXRld2F5UG9ydHMgb3B0aW9uIGlzIGVuYWJsZWQgKHNlZQorICAgICAgICAgICAgIHNzaGRfY29uZmlnKDUpKS4KKworICAgICBSZXF1ZXN0VFRZCisgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmVxdWVzdCBhIHBzZXVkby10dHkgZm9yIHRoZSBzZXNzaW9uLiAgVGhlCisgICAgICAgICAgICAgYXJndW1lbnQgbWF5IGJlIG9uZSBvZjogYGBubycnIChuZXZlciByZXF1ZXN0IGEgVFRZKSwgYGB5ZXMnJworICAgICAgICAgICAgIChhbHdheXMgcmVxdWVzdCBhIFRUWSB3aGVuIHN0YW5kYXJkIGlucHV0IGlzIGEgVFRZKSwgYGBmb3JjZScnCisgICAgICAgICAgICAgKGFsd2F5cyByZXF1ZXN0IGEgVFRZKSBvciBgYGF1dG8nJyAocmVxdWVzdCBhIFRUWSB3aGVuIG9wZW5pbmcgYQorICAgICAgICAgICAgIGxvZ2luIHNlc3Npb24pLiAgVGhpcyBvcHRpb24gbWlycm9ycyB0aGUgLXQgYW5kIC1UIGZsYWdzIGZvcgorICAgICAgICAgICAgIHNzaCgxKS4KKworICAgICBSaG9zdHNSU0FBdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHRvIHRyeSByaG9zdHMgYmFzZWQgYXV0aGVudGljYXRpb24gd2l0aCBSU0EKKyAgICAgICAgICAgICBob3N0IGF1dGhlbnRpY2F0aW9uLiAgVGhlIGFyZ3VtZW50IG11c3QgYmUgYGB5ZXMnJyBvciBgYG5vJycuCisgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgYGBubycnLiAgVGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDEKKyAgICAgICAgICAgICBvbmx5IGFuZCByZXF1aXJlcyBzc2goMSkgdG8gYmUgc2V0dWlkIHJvb3QuCisKKyAgICAgUlNBQXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciB0byB0cnkgUlNBIGF1dGhlbnRpY2F0aW9uLiAgVGhlIGFyZ3VtZW50IHRvCisgICAgICAgICAgICAgdGhpcyBrZXl3b3JkIG11c3QgYmUgYGB5ZXMnJyBvciBgYG5vJycuICBSU0EgYXV0aGVudGljYXRpb24gd2lsbAorICAgICAgICAgICAgIG9ubHkgYmUgYXR0ZW1wdGVkIGlmIHRoZSBpZGVudGl0eSBmaWxlIGV4aXN0cywgb3IgYW4KKyAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbiBhZ2VudCBpcyBydW5uaW5nLiAgVGhlIGRlZmF1bHQgaXMgYGB5ZXMnJy4gIE5vdGUKKyAgICAgICAgICAgICB0aGF0IHRoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAxIG9ubHkuCisKKyAgICAgU2VuZEVudgorICAgICAgICAgICAgIFNwZWNpZmllcyB3aGF0IHZhcmlhYmxlcyBmcm9tIHRoZSBsb2NhbCBlbnZpcm9uKDcpIHNob3VsZCBiZSBzZW50CisgICAgICAgICAgICAgdG8gdGhlIHNlcnZlci4gIE5vdGUgdGhhdCBlbnZpcm9ubWVudCBwYXNzaW5nIGlzIG9ubHkgc3VwcG9ydGVkCisgICAgICAgICAgICAgZm9yIHByb3RvY29sIDIuICBUaGUgc2VydmVyIG11c3QgYWxzbyBzdXBwb3J0IGl0LCBhbmQgdGhlIHNlcnZlcgorICAgICAgICAgICAgIG11c3QgYmUgY29uZmlndXJlZCB0byBhY2NlcHQgdGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgUmVmZXIKKyAgICAgICAgICAgICB0byBBY2NlcHRFbnYgaW4gc3NoZF9jb25maWcoNSkgZm9yIGhvdyB0byBjb25maWd1cmUgdGhlIHNlcnZlci4KKyAgICAgICAgICAgICBWYXJpYWJsZXMgYXJlIHNwZWNpZmllZCBieSBuYW1lLCB3aGljaCBtYXkgY29udGFpbiB3aWxkY2FyZAorICAgICAgICAgICAgIGNoYXJhY3RlcnMuICBNdWx0aXBsZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbWF5IGJlIHNlcGFyYXRlZCBieQorICAgICAgICAgICAgIHdoaXRlc3BhY2Ugb3Igc3ByZWFkIGFjcm9zcyBtdWx0aXBsZSBTZW5kRW52IGRpcmVjdGl2ZXMuICBUaGUKKyAgICAgICAgICAgICBkZWZhdWx0IGlzIG5vdCB0byBzZW5kIGFueSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisKKyAgICAgICAgICAgICBTZWUgUEFUVEVSTlMgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcGF0dGVybnMuCisKKyAgICAgU2VydmVyQWxpdmVDb3VudE1heAorICAgICAgICAgICAgIFNldHMgdGhlIG51bWJlciBvZiBzZXJ2ZXIgYWxpdmUgbWVzc2FnZXMgKHNlZSBiZWxvdykgd2hpY2ggbWF5IGJlCisgICAgICAgICAgICAgc2VudCB3aXRob3V0IHNzaCgxKSByZWNlaXZpbmcgYW55IG1lc3NhZ2VzIGJhY2sgZnJvbSB0aGUgc2VydmVyLgorICAgICAgICAgICAgIElmIHRoaXMgdGhyZXNob2xkIGlzIHJlYWNoZWQgd2hpbGUgc2VydmVyIGFsaXZlIG1lc3NhZ2VzIGFyZQorICAgICAgICAgICAgIGJlaW5nIHNlbnQsIHNzaCB3aWxsIGRpc2Nvbm5lY3QgZnJvbSB0aGUgc2VydmVyLCB0ZXJtaW5hdGluZyB0aGUKKyAgICAgICAgICAgICBzZXNzaW9uLiAgSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgdXNlIG9mIHNlcnZlciBhbGl2ZQorICAgICAgICAgICAgIG1lc3NhZ2VzIGlzIHZlcnkgZGlmZmVyZW50IGZyb20gVENQS2VlcEFsaXZlIChiZWxvdykuICBUaGUgc2VydmVyCisgICAgICAgICAgICAgYWxpdmUgbWVzc2FnZXMgYXJlIHNlbnQgdGhyb3VnaCB0aGUgZW5jcnlwdGVkIGNoYW5uZWwgYW5kCisgICAgICAgICAgICAgdGhlcmVmb3JlIHdpbGwgbm90IGJlIHNwb29mYWJsZS4gIFRoZSBUQ1Aga2VlcGFsaXZlIG9wdGlvbgorICAgICAgICAgICAgIGVuYWJsZWQgYnkgVENQS2VlcEFsaXZlIGlzIHNwb29mYWJsZS4gIFRoZSBzZXJ2ZXIgYWxpdmUgbWVjaGFuaXNtCisgICAgICAgICAgICAgaXMgdmFsdWFibGUgd2hlbiB0aGUgY2xpZW50IG9yIHNlcnZlciBkZXBlbmQgb24ga25vd2luZyB3aGVuIGEKKyAgICAgICAgICAgICBjb25uZWN0aW9uIGhhcyBiZWNvbWUgaW5hY3RpdmUuCisKKyAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAzLiAgSWYsIGZvciBleGFtcGxlLCBTZXJ2ZXJBbGl2ZUludGVydmFsCisgICAgICAgICAgICAgKHNlZSBiZWxvdykgaXMgc2V0IHRvIDE1IGFuZCBTZXJ2ZXJBbGl2ZUNvdW50TWF4IGlzIGxlZnQgYXQgdGhlCisgICAgICAgICAgICAgZGVmYXVsdCwgaWYgdGhlIHNlcnZlciBiZWNvbWVzIHVucmVzcG9uc2l2ZSwgc3NoIHdpbGwgZGlzY29ubmVjdAorICAgICAgICAgICAgIGFmdGVyIGFwcHJveGltYXRlbHkgNDUgc2Vjb25kcy4gIFRoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wKKyAgICAgICAgICAgICB2ZXJzaW9uIDIgb25seS4KKworICAgICBTZXJ2ZXJBbGl2ZUludGVydmFsCisgICAgICAgICAgICAgU2V0cyBhIHRpbWVvdXQgaW50ZXJ2YWwgaW4gc2Vjb25kcyBhZnRlciB3aGljaCBpZiBubyBkYXRhIGhhcworICAgICAgICAgICAgIGJlZW4gcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyLCBzc2goMSkgd2lsbCBzZW5kIGEgbWVzc2FnZSB0aHJvdWdoCisgICAgICAgICAgICAgdGhlIGVuY3J5cHRlZCBjaGFubmVsIHRvIHJlcXVlc3QgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuICBUaGUKKyAgICAgICAgICAgICBkZWZhdWx0IGlzIDAsIGluZGljYXRpbmcgdGhhdCB0aGVzZSBtZXNzYWdlcyB3aWxsIG5vdCBiZSBzZW50IHRvCisgICAgICAgICAgICAgdGhlIHNlcnZlci4gIFRoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAyIG9ubHkuCisKKyAgICAgU3RyaWN0SG9zdEtleUNoZWNraW5nCisgICAgICAgICAgICAgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBgYHllcycnLCBzc2goMSkgd2lsbCBuZXZlciBhdXRvbWF0aWNhbGx5CisgICAgICAgICAgICAgYWRkIGhvc3Qga2V5cyB0byB0aGUgfi8uc3NoL2tub3duX2hvc3RzIGZpbGUsIGFuZCByZWZ1c2VzIHRvCisgICAgICAgICAgICAgY29ubmVjdCB0byBob3N0cyB3aG9zZSBob3N0IGtleSBoYXMgY2hhbmdlZC4gIFRoaXMgcHJvdmlkZXMKKyAgICAgICAgICAgICBtYXhpbXVtIHByb3RlY3Rpb24gYWdhaW5zdCB0cm9qYW4gaG9yc2UgYXR0YWNrcywgdGhvdWdoIGl0IGNhbiBiZQorICAgICAgICAgICAgIGFubm95aW5nIHdoZW4gdGhlIC9ldGMvc3NoL3NzaF9rbm93bl9ob3N0cyBmaWxlIGlzIHBvb3JseQorICAgICAgICAgICAgIG1haW50YWluZWQgb3Igd2hlbiBjb25uZWN0aW9ucyB0byBuZXcgaG9zdHMgYXJlIGZyZXF1ZW50bHkgbWFkZS4KKyAgICAgICAgICAgICBUaGlzIG9wdGlvbiBmb3JjZXMgdGhlIHVzZXIgdG8gbWFudWFsbHkgYWRkIGFsbCBuZXcgaG9zdHMuICBJZgorICAgICAgICAgICAgIHRoaXMgZmxhZyBpcyBzZXQgdG8gYGBubycnLCBzc2ggd2lsbCBhdXRvbWF0aWNhbGx5IGFkZCBuZXcgaG9zdAorICAgICAgICAgICAgIGtleXMgdG8gdGhlIHVzZXIga25vd24gaG9zdHMgZmlsZXMuICBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvCisgICAgICAgICAgICAgYGBhc2snJywgbmV3IGhvc3Qga2V5cyB3aWxsIGJlIGFkZGVkIHRvIHRoZSB1c2VyIGtub3duIGhvc3QgZmlsZXMKKyAgICAgICAgICAgICBvbmx5IGFmdGVyIHRoZSB1c2VyIGhhcyBjb25maXJtZWQgdGhhdCBpcyB3aGF0IHRoZXkgcmVhbGx5IHdhbnQKKyAgICAgICAgICAgICB0byBkbywgYW5kIHNzaCB3aWxsIHJlZnVzZSB0byBjb25uZWN0IHRvIGhvc3RzIHdob3NlIGhvc3Qga2V5IGhhcworICAgICAgICAgICAgIGNoYW5nZWQuICBUaGUgaG9zdCBrZXlzIG9mIGtub3duIGhvc3RzIHdpbGwgYmUgdmVyaWZpZWQKKyAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGluIGFsbCBjYXNlcy4gIFRoZSBhcmd1bWVudCBtdXN0IGJlIGBgeWVzJycsCisgICAgICAgICAgICAgYGBubycnLCBvciBgYGFzaycnLiAgVGhlIGRlZmF1bHQgaXMgYGBhc2snJy4KKworICAgICBUQ1BLZWVwQWxpdmUKKyAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciB0aGUgc3lzdGVtIHNob3VsZCBzZW5kIFRDUCBrZWVwYWxpdmUgbWVzc2FnZXMKKyAgICAgICAgICAgICB0byB0aGUgb3RoZXIgc2lkZS4gIElmIHRoZXkgYXJlIHNlbnQsIGRlYXRoIG9mIHRoZSBjb25uZWN0aW9uIG9yCisgICAgICAgICAgICAgY3Jhc2ggb2Ygb25lIG9mIHRoZSBtYWNoaW5lcyB3aWxsIGJlIHByb3Blcmx5IG5vdGljZWQuICBIb3dldmVyLAorICAgICAgICAgICAgIHRoaXMgbWVhbnMgdGhhdCBjb25uZWN0aW9ucyB3aWxsIGRpZSBpZiB0aGUgcm91dGUgaXMgZG93bgorICAgICAgICAgICAgIHRlbXBvcmFyaWx5LCBhbmQgc29tZSBwZW9wbGUgZmluZCBpdCBhbm5veWluZy4KKworICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIGBgeWVzJycgKHRvIHNlbmQgVENQIGtlZXBhbGl2ZSBtZXNzYWdlcyksIGFuZCB0aGUKKyAgICAgICAgICAgICBjbGllbnQgd2lsbCBub3RpY2UgaWYgdGhlIG5ldHdvcmsgZ29lcyBkb3duIG9yIHRoZSByZW1vdGUgaG9zdAorICAgICAgICAgICAgIGRpZXMuICBUaGlzIGlzIGltcG9ydGFudCBpbiBzY3JpcHRzLCBhbmQgbWFueSB1c2VycyB3YW50IGl0IHRvby4KKworICAgICAgICAgICAgIFRvIGRpc2FibGUgVENQIGtlZXBhbGl2ZSBtZXNzYWdlcywgdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8KKyAgICAgICAgICAgICBgYG5vJycuCisKKyAgICAgVHVubmVsICBSZXF1ZXN0IHR1big0KSBkZXZpY2UgZm9yd2FyZGluZyBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZQorICAgICAgICAgICAgIHNlcnZlci4gIFRoZSBhcmd1bWVudCBtdXN0IGJlIGBgeWVzJycsIGBgcG9pbnQtdG8tcG9pbnQnJyAobGF5ZXIKKyAgICAgICAgICAgICAzKSwgYGBldGhlcm5ldCcnIChsYXllciAyKSwgb3IgYGBubycnLiAgU3BlY2lmeWluZyBgYHllcycnCisgICAgICAgICAgICAgcmVxdWVzdHMgdGhlIGRlZmF1bHQgdHVubmVsIG1vZGUsIHdoaWNoIGlzIGBgcG9pbnQtdG8tcG9pbnQnJy4KKyAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyBgYG5vJycuCisKKyAgICAgVHVubmVsRGV2aWNlCisgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSB0dW4oNCkgZGV2aWNlcyB0byBvcGVuIG9uIHRoZSBjbGllbnQgKGxvY2FsX3R1bikKKyAgICAgICAgICAgICBhbmQgdGhlIHNlcnZlciAocmVtb3RlX3R1bikuCisKKyAgICAgICAgICAgICBUaGUgYXJndW1lbnQgbXVzdCBiZSBsb2NhbF90dW5bOnJlbW90ZV90dW5dLiAgVGhlIGRldmljZXMgbWF5IGJlCisgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IG51bWVyaWNhbCBJRCBvciB0aGUga2V5d29yZCBgYGFueScnLCB3aGljaCB1c2VzIHRoZQorICAgICAgICAgICAgIG5leHQgYXZhaWxhYmxlIHR1bm5lbCBkZXZpY2UuICBJZiByZW1vdGVfdHVuIGlzIG5vdCBzcGVjaWZpZWQsIGl0CisgICAgICAgICAgICAgZGVmYXVsdHMgdG8gYGBhbnknJy4gIFRoZSBkZWZhdWx0IGlzIGBgYW55OmFueScnLgorCisgICAgIFVzZVByaXZpbGVnZWRQb3J0CisgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIGEgcHJpdmlsZWdlZCBwb3J0IGZvciBvdXRnb2luZworICAgICAgICAgICAgIGNvbm5lY3Rpb25zLiAgVGhlIGFyZ3VtZW50IG11c3QgYmUgYGB5ZXMnJyBvciBgYG5vJycuICBUaGUKKyAgICAgICAgICAgICBkZWZhdWx0IGlzIGBgbm8nJy4gIElmIHNldCB0byBgYHllcycnLCBzc2goMSkgbXVzdCBiZSBzZXR1aWQKKyAgICAgICAgICAgICByb290LiAgTm90ZSB0aGF0IHRoaXMgb3B0aW9uIG11c3QgYmUgc2V0IHRvIGBgeWVzJycgZm9yCisgICAgICAgICAgICAgUmhvc3RzUlNBQXV0aGVudGljYXRpb24gd2l0aCBvbGRlciBzZXJ2ZXJzLgorCisgICAgIFVzZXIgICAgU3BlY2lmaWVzIHRoZSB1c2VyIHRvIGxvZyBpbiBhcy4gIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIGEKKyAgICAgICAgICAgICBkaWZmZXJlbnQgdXNlciBuYW1lIGlzIHVzZWQgb24gZGlmZmVyZW50IG1hY2hpbmVzLiAgVGhpcyBzYXZlcworICAgICAgICAgICAgIHRoZSB0cm91YmxlIG9mIGhhdmluZyB0byByZW1lbWJlciB0byBnaXZlIHRoZSB1c2VyIG5hbWUgb24gdGhlCisgICAgICAgICAgICAgY29tbWFuZCBsaW5lLgorCisgICAgIFVzZXJLbm93bkhvc3RzRmlsZQorICAgICAgICAgICAgIFNwZWNpZmllcyBvbmUgb3IgbW9yZSBmaWxlcyB0byB1c2UgZm9yIHRoZSB1c2VyIGhvc3Qga2V5CisgICAgICAgICAgICAgZGF0YWJhc2UsIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLiAgVGhlIGRlZmF1bHQgaXMKKyAgICAgICAgICAgICB+Ly5zc2gva25vd25faG9zdHMsIH4vLnNzaC9rbm93bl9ob3N0czIuCisKKyAgICAgVmVyaWZ5SG9zdEtleUROUworICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHRvIHZlcmlmeSB0aGUgcmVtb3RlIGtleSB1c2luZyBETlMgYW5kIFNTSEZQCisgICAgICAgICAgICAgcmVzb3VyY2UgcmVjb3Jkcy4gIElmIHRoaXMgb3B0aW9uIGlzIHNldCB0byBgYHllcycnLCB0aGUgY2xpZW50CisgICAgICAgICAgICAgd2lsbCBpbXBsaWNpdGx5IHRydXN0IGtleXMgdGhhdCBtYXRjaCBhIHNlY3VyZSBmaW5nZXJwcmludCBmcm9tCisgICAgICAgICAgICAgRE5TLiAgSW5zZWN1cmUgZmluZ2VycHJpbnRzIHdpbGwgYmUgaGFuZGxlZCBhcyBpZiB0aGlzIG9wdGlvbiB3YXMKKyAgICAgICAgICAgICBzZXQgdG8gYGBhc2snJy4gIElmIHRoaXMgb3B0aW9uIGlzIHNldCB0byBgYGFzaycnLCBpbmZvcm1hdGlvbiBvbgorICAgICAgICAgICAgIGZpbmdlcnByaW50IG1hdGNoIHdpbGwgYmUgZGlzcGxheWVkLCBidXQgdGhlIHVzZXIgd2lsbCBzdGlsbCBuZWVkCisgICAgICAgICAgICAgdG8gY29uZmlybSBuZXcgaG9zdCBrZXlzIGFjY29yZGluZyB0byB0aGUgU3RyaWN0SG9zdEtleUNoZWNraW5nCisgICAgICAgICAgICAgb3B0aW9uLiAgVGhlIGFyZ3VtZW50IG11c3QgYmUgYGB5ZXMnJywgYGBubycnLCBvciBgYGFzaycnLiAgVGhlCisgICAgICAgICAgICAgZGVmYXVsdCBpcyBgYG5vJycuICBOb3RlIHRoYXQgdGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbAorICAgICAgICAgICAgIHZlcnNpb24gMiBvbmx5LgorCisgICAgICAgICAgICAgU2VlIGFsc28gVkVSSUZZSU5HIEhPU1QgS0VZUyBpbiBzc2goMSkuCisKKyAgICAgVmlzdWFsSG9zdEtleQorICAgICAgICAgICAgIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gYGB5ZXMnJywgYW4gQVNDSUkgYXJ0IHJlcHJlc2VudGF0aW9uIG9mCisgICAgICAgICAgICAgdGhlIHJlbW90ZSBob3N0IGtleSBmaW5nZXJwcmludCBpcyBwcmludGVkIGluIGFkZGl0aW9uIHRvIHRoZSBoZXgKKyAgICAgICAgICAgICBmaW5nZXJwcmludCBzdHJpbmcgYXQgbG9naW4gYW5kIGZvciB1bmtub3duIGhvc3Qga2V5cy4gIElmIHRoaXMKKyAgICAgICAgICAgICBmbGFnIGlzIHNldCB0byBgYG5vJycsIG5vIGZpbmdlcnByaW50IHN0cmluZ3MgYXJlIHByaW50ZWQgYXQKKyAgICAgICAgICAgICBsb2dpbiBhbmQgb25seSB0aGUgaGV4IGZpbmdlcnByaW50IHN0cmluZyB3aWxsIGJlIHByaW50ZWQgZm9yCisgICAgICAgICAgICAgdW5rbm93biBob3N0IGtleXMuICBUaGUgZGVmYXVsdCBpcyBgYG5vJycuCisKKyAgICAgWEF1dGhMb2NhdGlvbgorICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgeGF1dGgoMSkgcHJvZ3JhbS4gIFRoZSBkZWZhdWx0CisgICAgICAgICAgICAgaXMgL3Vzci9YMTFSNi9iaW4veGF1dGguCisKK1BBVFRFUk5TCisgICAgIEEgcGF0dGVybiBjb25zaXN0cyBvZiB6ZXJvIG9yIG1vcmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycywgYConIChhCisgICAgIHdpbGRjYXJkIHRoYXQgbWF0Y2hlcyB6ZXJvIG9yIG1vcmUgY2hhcmFjdGVycyksIG9yIGA/JyAoYSB3aWxkY2FyZCB0aGF0CisgICAgIG1hdGNoZXMgZXhhY3RseSBvbmUgY2hhcmFjdGVyKS4gIEZvciBleGFtcGxlLCB0byBzcGVjaWZ5IGEgc2V0IG9mCisgICAgIGRlY2xhcmF0aW9ucyBmb3IgYW55IGhvc3QgaW4gdGhlIGBgLmNvLnVrJycgc2V0IG9mIGRvbWFpbnMsIHRoZSBmb2xsb3dpbmcKKyAgICAgcGF0dGVybiBjb3VsZCBiZSB1c2VkOgorCisgICAgICAgICAgIEhvc3QgKi5jby51aworCisgICAgIFRoZSBmb2xsb3dpbmcgcGF0dGVybiB3b3VsZCBtYXRjaCBhbnkgaG9zdCBpbiB0aGUgMTkyLjE2OC4wLlswLTldIG5ldHdvcmsKKyAgICAgcmFuZ2U6CisKKyAgICAgICAgICAgSG9zdCAxOTIuMTY4LjAuPworCisgICAgIEEgcGF0dGVybi1saXN0IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMuICBQYXR0ZXJucyB3aXRoaW4KKyAgICAgcGF0dGVybi1saXN0cyBtYXkgYmUgbmVnYXRlZCBieSBwcmVjZWRpbmcgdGhlbSB3aXRoIGFuIGV4Y2xhbWF0aW9uIG1hcmsKKyAgICAgKGAhJykuICBGb3IgZXhhbXBsZSwgdG8gYWxsb3cgYSBrZXkgdG8gYmUgdXNlZCBmcm9tIGFueXdoZXJlIHdpdGhpbiBhbgorICAgICBvcmdhbmlzYXRpb24gZXhjZXB0IGZyb20gdGhlIGBgZGlhbHVwJycgcG9vbCwgdGhlIGZvbGxvd2luZyBlbnRyeSAoaW4KKyAgICAgYXV0aG9yaXplZF9rZXlzKSBjb3VsZCBiZSB1c2VkOgorCisgICAgICAgICAgIGZyb209IiEqLmRpYWx1cC5leGFtcGxlLmNvbSwqLmV4YW1wbGUuY29tIgorCitGSUxFUworICAgICB+Ly5zc2gvY29uZmlnCisgICAgICAgICAgICAgVGhpcyBpcyB0aGUgcGVyLXVzZXIgY29uZmlndXJhdGlvbiBmaWxlLiAgVGhlIGZvcm1hdCBvZiB0aGlzIGZpbGUKKyAgICAgICAgICAgICBpcyBkZXNjcmliZWQgYWJvdmUuICBUaGlzIGZpbGUgaXMgdXNlZCBieSB0aGUgU1NIIGNsaWVudC4KKyAgICAgICAgICAgICBCZWNhdXNlIG9mIHRoZSBwb3RlbnRpYWwgZm9yIGFidXNlLCB0aGlzIGZpbGUgbXVzdCBoYXZlIHN0cmljdAorICAgICAgICAgICAgIHBlcm1pc3Npb25zOiByZWFkL3dyaXRlIGZvciB0aGUgdXNlciwgYW5kIG5vdCBhY2Nlc3NpYmxlIGJ5CisgICAgICAgICAgICAgb3RoZXJzLgorCisgICAgIC9ldGMvc3NoL3NzaF9jb25maWcKKyAgICAgICAgICAgICBTeXN0ZW13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFRoaXMgZmlsZSBwcm92aWRlcyBkZWZhdWx0cyBmb3IKKyAgICAgICAgICAgICB0aG9zZSB2YWx1ZXMgdGhhdCBhcmUgbm90IHNwZWNpZmllZCBpbiB0aGUgdXNlcidzIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICBmaWxlLCBhbmQgZm9yIHRob3NlIHVzZXJzIHdobyBkbyBub3QgaGF2ZSBhIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgICAgICAgICBUaGlzIGZpbGUgbXVzdCBiZSB3b3JsZC1yZWFkYWJsZS4KKworU0VFIEFMU08KKyAgICAgc3NoKDEpCisKK0FVVEhPUlMKKyAgICAgT3BlblNTSCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGFuZCBmcmVlIHNzaCAxLjIuMTIgcmVsZWFzZSBieQorICAgICBUYXR1IFlsb25lbi4gIEFhcm9uIENhbXBiZWxsLCBCb2IgQmVjaywgTWFya3VzIEZyaWVkbCwgTmllbHMgUHJvdm9zLCBUaGVvCisgICAgIGRlIFJhYWR0IGFuZCBEdWcgU29uZyByZW1vdmVkIG1hbnkgYnVncywgcmUtYWRkZWQgbmV3ZXIgZmVhdHVyZXMgYW5kCisgICAgIGNyZWF0ZWQgT3BlblNTSC4gIE1hcmt1cyBGcmllZGwgY29udHJpYnV0ZWQgdGhlIHN1cHBvcnQgZm9yIFNTSCBwcm90b2NvbAorICAgICB2ZXJzaW9ucyAxLjUgYW5kIDIuMC4KKworT3BlbkJTRCA1LjAgICAgICAgICAgICAgICAgICAgIFNlcHRlbWJlciA5LCAyMDExICAgICAgICAgICAgICAgICAgIE9wZW5CU0QgNS4wCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NzaF9jb25maWcuNSBiL29wZW5zc2gtNi4wcDEvc3NoX2NvbmZpZy41Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YTU0MmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NzaF9jb25maWcuNQpAQCAtMCwwICsxLDEyOTQgQEAKKy5cIgorLlwiIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+CisuXCIgQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKy5cIiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorLlwiCisuXCIgQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorLlwiIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCisuXCIgc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworLlwiIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKy5cIiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTkgQWFyb24gQ2FtcGJlbGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiIENvcHlyaWdodCAoYykgMTk5OSBUaGVvIGRlIFJhYWR0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisuXCIgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLlwiIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisuXCIgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLlwiIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLlwiIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy5cIiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy5cIiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisuXCIgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisuXCIgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICRPcGVuQlNEOiBzc2hfY29uZmlnLjUsdiAxLjE1NCAyMDExLzA5LzA5IDAwOjQzOjAwIGRqbSBFeHAgJAorLkRkICRNZG9jZGF0ZTogU2VwdGVtYmVyIDkgMjAxMSAkCisuRHQgU1NIX0NPTkZJRyA1CisuT3MKKy5TaCBOQU1FCisuTm0gc3NoX2NvbmZpZworLk5kIE9wZW5TU0ggU1NIIGNsaWVudCBjb25maWd1cmF0aW9uIGZpbGVzCisuU2ggU1lOT1BTSVMKKy5ObSB+Ly5zc2gvY29uZmlnCisuTm0gL2V0Yy9zc2gvc3NoX2NvbmZpZworLlNoIERFU0NSSVBUSU9OCisuWHIgc3NoIDEKK29idGFpbnMgY29uZmlndXJhdGlvbiBkYXRhIGZyb20gdGhlIGZvbGxvd2luZyBzb3VyY2VzIGluCit0aGUgZm9sbG93aW5nIG9yZGVyOgorLlBwCisuQmwgLWVudW0gLW9mZnNldCBpbmRlbnQgLWNvbXBhY3QKKy5JdAorY29tbWFuZC1saW5lIG9wdGlvbnMKKy5JdAordXNlcidzIGNvbmZpZ3VyYXRpb24gZmlsZQorLlBxIFBhIH4vLnNzaC9jb25maWcKKy5JdAorc3lzdGVtLXdpZGUgY29uZmlndXJhdGlvbiBmaWxlCisuUHEgUGEgL2V0Yy9zc2gvc3NoX2NvbmZpZworLkVsCisuUHAKK0ZvciBlYWNoIHBhcmFtZXRlciwgdGhlIGZpcnN0IG9idGFpbmVkIHZhbHVlCit3aWxsIGJlIHVzZWQuCitUaGUgY29uZmlndXJhdGlvbiBmaWxlcyBjb250YWluIHNlY3Rpb25zIHNlcGFyYXRlZCBieQorLkRxIEhvc3QKK3NwZWNpZmljYXRpb25zLCBhbmQgdGhhdCBzZWN0aW9uIGlzIG9ubHkgYXBwbGllZCBmb3IgaG9zdHMgdGhhdAorbWF0Y2ggb25lIG9mIHRoZSBwYXR0ZXJucyBnaXZlbiBpbiB0aGUgc3BlY2lmaWNhdGlvbi4KK1RoZSBtYXRjaGVkIGhvc3QgbmFtZSBpcyB0aGUgb25lIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCisuUHAKK1NpbmNlIHRoZSBmaXJzdCBvYnRhaW5lZCB2YWx1ZSBmb3IgZWFjaCBwYXJhbWV0ZXIgaXMgdXNlZCwgbW9yZQoraG9zdC1zcGVjaWZpYyBkZWNsYXJhdGlvbnMgc2hvdWxkIGJlIGdpdmVuIG5lYXIgdGhlIGJlZ2lubmluZyBvZiB0aGUKK2ZpbGUsIGFuZCBnZW5lcmFsIGRlZmF1bHRzIGF0IHRoZSBlbmQuCisuUHAKK1RoZSBjb25maWd1cmF0aW9uIGZpbGUgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorLlBwCitFbXB0eSBsaW5lcyBhbmQgbGluZXMgc3RhcnRpbmcgd2l0aAorLlFsICMKK2FyZSBjb21tZW50cy4KK090aGVyd2lzZSBhIGxpbmUgaXMgb2YgdGhlIGZvcm1hdAorLkRxIGtleXdvcmQgYXJndW1lbnRzIC4KK0NvbmZpZ3VyYXRpb24gb3B0aW9ucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2Ugb3IKK29wdGlvbmFsIHdoaXRlc3BhY2UgYW5kIGV4YWN0bHkgb25lCisuUWwgPSA7Cit0aGUgbGF0dGVyIGZvcm1hdCBpcyB1c2VmdWwgdG8gYXZvaWQgdGhlIG5lZWQgdG8gcXVvdGUgd2hpdGVzcGFjZQord2hlbiBzcGVjaWZ5aW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB1c2luZyB0aGUKKy5ObSBzc2ggLAorLk5tIHNjcCAsCithbmQKKy5ObSBzZnRwCisuRmwgbworb3B0aW9uLgorQXJndW1lbnRzIG1heSBvcHRpb25hbGx5IGJlIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMKKy5QcSBcJiIKK2luIG9yZGVyIHRvIHJlcHJlc2VudCBhcmd1bWVudHMgY29udGFpbmluZyBzcGFjZXMuCisuUHAKK1RoZSBwb3NzaWJsZQora2V5d29yZHMgYW5kIHRoZWlyIG1lYW5pbmdzIGFyZSBhcyBmb2xsb3dzIChub3RlIHRoYXQKK2tleXdvcmRzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCBhcmd1bWVudHMgYXJlIGNhc2Utc2Vuc2l0aXZlKToKKy5CbCAtdGFnIC13aWR0aCBEcworLkl0IENtIEhvc3QKK1Jlc3RyaWN0cyB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9ucyAodXAgdG8gdGhlIG5leHQKKy5DbSBIb3N0CitrZXl3b3JkKSB0byBiZSBvbmx5IGZvciB0aG9zZSBob3N0cyB0aGF0IG1hdGNoIG9uZSBvZiB0aGUgcGF0dGVybnMKK2dpdmVuIGFmdGVyIHRoZSBrZXl3b3JkLgorSWYgbW9yZSB0aGFuIG9uZSBwYXR0ZXJuIGlzIHByb3ZpZGVkLCB0aGV5IHNob3VsZCBiZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4KK0Egc2luZ2xlCisuUWwgKgorYXMgYSBwYXR0ZXJuIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgZ2xvYmFsCitkZWZhdWx0cyBmb3IgYWxsIGhvc3RzLgorVGhlIGhvc3QgaXMgdGhlCisuQXIgaG9zdG5hbWUKK2FyZ3VtZW50IGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUgKGkuZS4gdGhlIG5hbWUgaXMgbm90IGNvbnZlcnRlZCB0bworYSBjYW5vbmljYWxpemVkIGhvc3QgbmFtZSBiZWZvcmUgbWF0Y2hpbmcpLgorLlBwCitBIHBhdHRlcm4gZW50cnkgbWF5IGJlIG5lZ2F0ZWQgYnkgcHJlZml4aW5nIGl0IHdpdGggYW4gZXhjbGFtYXRpb24gbWFyaworLlBxIFNxICFcJiAuCitJZiBhIG5lZ2F0ZWQgZW50cnkgaXMgbWF0Y2hlZCwgdGhlbiB0aGUKKy5DbSBIb3N0CitlbnRyeSBpcyBpZ25vcmVkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IG90aGVyIHBhdHRlcm5zIG9uIHRoZSBsaW5lCittYXRjaC4KK05lZ2F0ZWQgbWF0Y2hlcyBhcmUgdGhlcmVmb3JlIHVzZWZ1bCB0byBwcm92aWRlIGV4Y2VwdGlvbnMgZm9yIHdpbGRjYXJkCittYXRjaGVzLgorLlBwCitTZWUKKy5TeCBQQVRURVJOUworZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcGF0dGVybnMuCisuSXQgQ20gQWRkcmVzc0ZhbWlseQorU3BlY2lmaWVzIHdoaWNoIGFkZHJlc3MgZmFtaWx5IHRvIHVzZSB3aGVuIGNvbm5lY3RpbmcuCitWYWxpZCBhcmd1bWVudHMgYXJlCisuRHEgYW55ICwKKy5EcSBpbmV0CisodXNlIElQdjQgb25seSksIG9yCisuRHEgaW5ldDYKKyh1c2UgSVB2NiBvbmx5KS4KKy5JdCBDbSBCYXRjaE1vZGUKK0lmIHNldCB0bworLkRxIHllcyAsCitwYXNzcGhyYXNlL3Bhc3N3b3JkIHF1ZXJ5aW5nIHdpbGwgYmUgZGlzYWJsZWQuCitUaGlzIG9wdGlvbiBpcyB1c2VmdWwgaW4gc2NyaXB0cyBhbmQgb3RoZXIgYmF0Y2ggam9icyB3aGVyZSBubyB1c2VyCitpcyBwcmVzZW50IHRvIHN1cHBseSB0aGUgcGFzc3dvcmQuCitUaGUgYXJndW1lbnQgbXVzdCBiZQorLkRxIHllcworb3IKKy5EcSBubyAuCitUaGUgZGVmYXVsdCBpcworLkRxIG5vIC4KKy5JdCBDbSBCaW5kQWRkcmVzcworVXNlIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBvbiB0aGUgbG9jYWwgbWFjaGluZSBhcyB0aGUgc291cmNlIGFkZHJlc3Mgb2YKK3RoZSBjb25uZWN0aW9uLgorT25seSB1c2VmdWwgb24gc3lzdGVtcyB3aXRoIG1vcmUgdGhhbiBvbmUgYWRkcmVzcy4KK05vdGUgdGhhdCB0aGlzIG9wdGlvbiBkb2VzIG5vdCB3b3JrIGlmCisuQ20gVXNlUHJpdmlsZWdlZFBvcnQKK2lzIHNldCB0bworLkRxIHllcyAuCisuSXQgQ20gQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbgorU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIGNoYWxsZW5nZS1yZXNwb25zZSBhdXRoZW50aWNhdGlvbi4KK1RoZSBhcmd1bWVudCB0byB0aGlzIGtleXdvcmQgbXVzdCBiZQorLkRxIHllcworb3IKKy5EcSBubyAuCitUaGUgZGVmYXVsdCBpcworLkRxIHllcyAuCisuSXQgQ20gQ2hlY2tIb3N0SVAKK0lmIHRoaXMgZmxhZyBpcyBzZXQgdG8KKy5EcSB5ZXMgLAorLlhyIHNzaCAxCit3aWxsIGFkZGl0aW9uYWxseSBjaGVjayB0aGUgaG9zdCBJUCBhZGRyZXNzIGluIHRoZQorLlBhIGtub3duX2hvc3RzCitmaWxlLgorVGhpcyBhbGxvd3Mgc3NoIHRvIGRldGVjdCBpZiBhIGhvc3Qga2V5IGNoYW5nZWQgZHVlIHRvIEROUyBzcG9vZmluZy4KK0lmIHRoZSBvcHRpb24gaXMgc2V0IHRvCisuRHEgbm8gLAordGhlIGNoZWNrIHdpbGwgbm90IGJlIGV4ZWN1dGVkLgorVGhlIGRlZmF1bHQgaXMKKy5EcSB5ZXMgLgorLkl0IENtIENpcGhlcgorU3BlY2lmaWVzIHRoZSBjaXBoZXIgdG8gdXNlIGZvciBlbmNyeXB0aW5nIHRoZSBzZXNzaW9uCitpbiBwcm90b2NvbCB2ZXJzaW9uIDEuCitDdXJyZW50bHksCisuRHEgYmxvd2Zpc2ggLAorLkRxIDNkZXMgLAorYW5kCisuRHEgZGVzCithcmUgc3VwcG9ydGVkLgorLkFyIGRlcworaXMgb25seSBzdXBwb3J0ZWQgaW4gdGhlCisuWHIgc3NoIDEKK2NsaWVudCBmb3IgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIGxlZ2FjeSBwcm90b2NvbCAxIGltcGxlbWVudGF0aW9ucwordGhhdCBkbyBub3Qgc3VwcG9ydCB0aGUKKy5BciAzZGVzCitjaXBoZXIuCitJdHMgdXNlIGlzIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkIGR1ZSB0byBjcnlwdG9ncmFwaGljIHdlYWtuZXNzZXMuCitUaGUgZGVmYXVsdCBpcworLkRxIDNkZXMgLgorLkl0IENtIENpcGhlcnMKK1NwZWNpZmllcyB0aGUgY2lwaGVycyBhbGxvd2VkIGZvciBwcm90b2NvbCB2ZXJzaW9uIDIKK2luIG9yZGVyIG9mIHByZWZlcmVuY2UuCitNdWx0aXBsZSBjaXBoZXJzIG11c3QgYmUgY29tbWEtc2VwYXJhdGVkLgorVGhlIHN1cHBvcnRlZCBjaXBoZXJzIGFyZQorLkRxIDNkZXMtY2JjICwKKy5EcSBhZXMxMjgtY2JjICwKKy5EcSBhZXMxOTItY2JjICwKKy5EcSBhZXMyNTYtY2JjICwKKy5EcSBhZXMxMjgtY3RyICwKKy5EcSBhZXMxOTItY3RyICwKKy5EcSBhZXMyNTYtY3RyICwKKy5EcSBhcmNmb3VyMTI4ICwKKy5EcSBhcmNmb3VyMjU2ICwKKy5EcSBhcmNmb3VyICwKKy5EcSBibG93ZmlzaC1jYmMgLAorYW5kCisuRHEgY2FzdDEyOC1jYmMgLgorVGhlIGRlZmF1bHQgaXM6CisuQmQgLWxpdGVyYWwgLW9mZnNldCAzbgorYWVzMTI4LWN0cixhZXMxOTItY3RyLGFlczI1Ni1jdHIsYXJjZm91cjI1NixhcmNmb3VyMTI4LAorYWVzMTI4LWNiYywzZGVzLWNiYyxibG93ZmlzaC1jYmMsY2FzdDEyOC1jYmMsYWVzMTkyLWNiYywKK2FlczI1Ni1jYmMsYXJjZm91cgorLkVkCisuSXQgQ20gQ2xlYXJBbGxGb3J3YXJkaW5ncworU3BlY2lmaWVzIHRoYXQgYWxsIGxvY2FsLCByZW1vdGUsIGFuZCBkeW5hbWljIHBvcnQgZm9yd2FyZGluZ3MKK3NwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBvciBvbiB0aGUgY29tbWFuZCBsaW5lIGJlCitjbGVhcmVkLgorVGhpcyBvcHRpb24gaXMgcHJpbWFyaWx5IHVzZWZ1bCB3aGVuIHVzZWQgZnJvbSB0aGUKKy5YciBzc2ggMQorY29tbWFuZCBsaW5lIHRvIGNsZWFyIHBvcnQgZm9yd2FyZGluZ3Mgc2V0IGluCitjb25maWd1cmF0aW9uIGZpbGVzLCBhbmQgaXMgYXV0b21hdGljYWxseSBzZXQgYnkKKy5YciBzY3AgMQorYW5kCisuWHIgc2Z0cCAxIC4KK1RoZSBhcmd1bWVudCBtdXN0IGJlCisuRHEgeWVzCitvcgorLkRxIG5vIC4KK1RoZSBkZWZhdWx0IGlzCisuRHEgbm8gLgorLkl0IENtIENvbXByZXNzaW9uCitTcGVjaWZpZXMgd2hldGhlciB0byB1c2UgY29tcHJlc3Npb24uCitUaGUgYXJndW1lbnQgbXVzdCBiZQorLkRxIHllcworb3IKKy5EcSBubyAuCitUaGUgZGVmYXVsdCBpcworLkRxIG5vIC4KKy5JdCBDbSBDb21wcmVzc2lvbkxldmVsCitTcGVjaWZpZXMgdGhlIGNvbXByZXNzaW9uIGxldmVsIHRvIHVzZSBpZiBjb21wcmVzc2lvbiBpcyBlbmFibGVkLgorVGhlIGFyZ3VtZW50IG11c3QgYmUgYW4gaW50ZWdlciBmcm9tIDEgKGZhc3QpIHRvIDkgKHNsb3csIGJlc3QpLgorVGhlIGRlZmF1bHQgbGV2ZWwgaXMgNiwgd2hpY2ggaXMgZ29vZCBmb3IgbW9zdCBhcHBsaWNhdGlvbnMuCitUaGUgbWVhbmluZyBvZiB0aGUgdmFsdWVzIGlzIHRoZSBzYW1lIGFzIGluCisuWHIgZ3ppcCAxIC4KK05vdGUgdGhhdCB0aGlzIG9wdGlvbiBhcHBsaWVzIHRvIHByb3RvY29sIHZlcnNpb24gMSBvbmx5LgorLkl0IENtIENvbm5lY3Rpb25BdHRlbXB0cworU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdHJpZXMgKG9uZSBwZXIgc2Vjb25kKSB0byBtYWtlIGJlZm9yZSBleGl0aW5nLgorVGhlIGFyZ3VtZW50IG11c3QgYmUgYW4gaW50ZWdlci4KK1RoaXMgbWF5IGJlIHVzZWZ1bCBpbiBzY3JpcHRzIGlmIHRoZSBjb25uZWN0aW9uIHNvbWV0aW1lcyBmYWlscy4KK1RoZSBkZWZhdWx0IGlzIDEuCisuSXQgQ20gQ29ubmVjdFRpbWVvdXQKK1NwZWNpZmllcyB0aGUgdGltZW91dCAoaW4gc2Vjb25kcykgdXNlZCB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlCitTU0ggc2VydmVyLCBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBkZWZhdWx0IHN5c3RlbSBUQ1AgdGltZW91dC4KK1RoaXMgdmFsdWUgaXMgdXNlZCBvbmx5IHdoZW4gdGhlIHRhcmdldCBpcyBkb3duIG9yIHJlYWxseSB1bnJlYWNoYWJsZSwKK25vdCB3aGVuIGl0IHJlZnVzZXMgdGhlIGNvbm5lY3Rpb24uCisuSXQgQ20gQ29udHJvbE1hc3RlcgorRW5hYmxlcyB0aGUgc2hhcmluZyBvZiBtdWx0aXBsZSBzZXNzaW9ucyBvdmVyIGEgc2luZ2xlIG5ldHdvcmsgY29ubmVjdGlvbi4KK1doZW4gc2V0IHRvCisuRHEgeWVzICwKKy5YciBzc2ggMQord2lsbCBsaXN0ZW4gZm9yIGNvbm5lY3Rpb25zIG9uIGEgY29udHJvbCBzb2NrZXQgc3BlY2lmaWVkIHVzaW5nIHRoZQorLkNtIENvbnRyb2xQYXRoCithcmd1bWVudC4KK0FkZGl0aW9uYWwgc2Vzc2lvbnMgY2FuIGNvbm5lY3QgdG8gdGhpcyBzb2NrZXQgdXNpbmcgdGhlIHNhbWUKKy5DbSBDb250cm9sUGF0aAord2l0aAorLkNtIENvbnRyb2xNYXN0ZXIKK3NldCB0bworLkRxIG5vCisodGhlIGRlZmF1bHQpLgorVGhlc2Ugc2Vzc2lvbnMgd2lsbCB0cnkgdG8gcmV1c2UgdGhlIG1hc3RlciBpbnN0YW5jZSdzIG5ldHdvcmsgY29ubmVjdGlvbgorcmF0aGVyIHRoYW4gaW5pdGlhdGluZyBuZXcgb25lcywgYnV0IHdpbGwgZmFsbCBiYWNrIHRvIGNvbm5lY3Rpbmcgbm9ybWFsbHkKK2lmIHRoZSBjb250cm9sIHNvY2tldCBkb2VzIG5vdCBleGlzdCwgb3IgaXMgbm90IGxpc3RlbmluZy4KKy5QcAorU2V0dGluZyB0aGlzIHRvCisuRHEgYXNrCit3aWxsIGNhdXNlIHNzaAordG8gbGlzdGVuIGZvciBjb250cm9sIGNvbm5lY3Rpb25zLCBidXQgcmVxdWlyZSBjb25maXJtYXRpb24gdXNpbmcgdGhlCisuRXYgU1NIX0FTS1BBU1MKK3Byb2dyYW0gYmVmb3JlIHRoZXkgYXJlIGFjY2VwdGVkIChzZWUKKy5YciBzc2gtYWRkIDEKK2ZvciBkZXRhaWxzKS4KK0lmIHRoZQorLkNtIENvbnRyb2xQYXRoCitjYW5ub3QgYmUgb3BlbmVkLAorc3NoIHdpbGwgY29udGludWUgd2l0aG91dCBjb25uZWN0aW5nIHRvIGEgbWFzdGVyIGluc3RhbmNlLgorLlBwCitYMTEgYW5kCisuWHIgc3NoLWFnZW50IDEKK2ZvcndhcmRpbmcgaXMgc3VwcG9ydGVkIG92ZXIgdGhlc2UgbXVsdGlwbGV4ZWQgY29ubmVjdGlvbnMsIGhvd2V2ZXIgdGhlCitkaXNwbGF5IGFuZCBhZ2VudCBmb3J3YXJkZWQgd2lsbCBiZSB0aGUgb25lIGJlbG9uZ2luZyB0byB0aGUgbWFzdGVyCitjb25uZWN0aW9uIGkuZS4gaXQgaXMgbm90IHBvc3NpYmxlIHRvIGZvcndhcmQgbXVsdGlwbGUgZGlzcGxheXMgb3IgYWdlbnRzLgorLlBwCitUd28gYWRkaXRpb25hbCBvcHRpb25zIGFsbG93IGZvciBvcHBvcnR1bmlzdGljIG11bHRpcGxleGluZzogdHJ5IHRvIHVzZSBhCittYXN0ZXIgY29ubmVjdGlvbiBidXQgZmFsbCBiYWNrIHRvIGNyZWF0aW5nIGEgbmV3IG9uZSBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeQorZXhpc3QuCitUaGVzZSBvcHRpb25zIGFyZToKKy5EcSBhdXRvCithbmQKKy5EcSBhdXRvYXNrIC4KK1RoZSBsYXR0ZXIgcmVxdWlyZXMgY29uZmlybWF0aW9uIGxpa2UgdGhlCisuRHEgYXNrCitvcHRpb24uCisuSXQgQ20gQ29udHJvbFBhdGgKK1NwZWNpZnkgdGhlIHBhdGggdG8gdGhlIGNvbnRyb2wgc29ja2V0IHVzZWQgZm9yIGNvbm5lY3Rpb24gc2hhcmluZyBhcyBkZXNjcmliZWQKK2luIHRoZQorLkNtIENvbnRyb2xNYXN0ZXIKK3NlY3Rpb24gYWJvdmUgb3IgdGhlIHN0cmluZworLkRxIG5vbmUKK3RvIGRpc2FibGUgY29ubmVjdGlvbiBzaGFyaW5nLgorSW4gdGhlIHBhdGgsCisuUWwgJUwKK3dpbGwgYmUgc3Vic3RpdHV0ZWQgYnkgdGhlIGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgbG9jYWwgaG9zdCBuYW1lLAorLlFsICVsCit3aWxsIGJlIHN1YnN0aXR1dGVkIGJ5IHRoZSBsb2NhbCBob3N0IG5hbWUgKGluY2x1ZGluZyBhbnkgZG9tYWluIG5hbWUpLAorLlFsICVoCit3aWxsIGJlIHN1YnN0aXR1dGVkIGJ5IHRoZSB0YXJnZXQgaG9zdCBuYW1lLAorLlFsICVuCit3aWxsIGJlIHN1YnN0aXR1dGVkIGJ5IHRoZSBvcmlnaW5hbCB0YXJnZXQgaG9zdCBuYW1lCitzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwKKy5RbCAlcAordGhlIHBvcnQsCisuUWwgJXIKK2J5IHRoZSByZW1vdGUgbG9naW4gdXNlcm5hbWUsIGFuZAorLlFsICV1CitieSB0aGUgdXNlcm5hbWUgb2YgdGhlIHVzZXIgcnVubmluZworLlhyIHNzaCAxIC4KK0l0IGlzIHJlY29tbWVuZGVkIHRoYXQgYW55CisuQ20gQ29udHJvbFBhdGgKK3VzZWQgZm9yIG9wcG9ydHVuaXN0aWMgY29ubmVjdGlvbiBzaGFyaW5nIGluY2x1ZGUKK2F0IGxlYXN0ICVoLCAlcCwgYW5kICVyLgorVGhpcyBlbnN1cmVzIHRoYXQgc2hhcmVkIGNvbm5lY3Rpb25zIGFyZSB1bmlxdWVseSBpZGVudGlmaWVkLgorLkl0IENtIENvbnRyb2xQZXJzaXN0CitXaGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aAorLkNtIENvbnRyb2xNYXN0ZXIgLAorc3BlY2lmaWVzIHRoYXQgdGhlIG1hc3RlciBjb25uZWN0aW9uIHNob3VsZCByZW1haW4gb3BlbgoraW4gdGhlIGJhY2tncm91bmQgKHdhaXRpbmcgZm9yIGZ1dHVyZSBjbGllbnQgY29ubmVjdGlvbnMpCithZnRlciB0aGUgaW5pdGlhbCBjbGllbnQgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQuCitJZiBzZXQgdG8KKy5EcSBubyAsCit0aGVuIHRoZSBtYXN0ZXIgY29ubmVjdGlvbiB3aWxsIG5vdCBiZSBwbGFjZWQgaW50byB0aGUgYmFja2dyb3VuZCwKK2FuZCB3aWxsIGNsb3NlIGFzIHNvb24gYXMgdGhlIGluaXRpYWwgY2xpZW50IGNvbm5lY3Rpb24gaXMgY2xvc2VkLgorSWYgc2V0IHRvCisuRHEgeWVzICwKK3RoZW4gdGhlIG1hc3RlciBjb25uZWN0aW9uIHdpbGwgcmVtYWluIGluIHRoZSBiYWNrZ3JvdW5kIGluZGVmaW5pdGVseQorKHVudGlsIGtpbGxlZCBvciBjbG9zZWQgdmlhIGEgbWVjaGFuaXNtIHN1Y2ggYXMgdGhlCisuWHIgc3NoIDEKKy5EcSBGbCBPIE5vIGV4aXQKK29wdGlvbikuCitJZiBzZXQgdG8gYSB0aW1lIGluIHNlY29uZHMsIG9yIGEgdGltZSBpbiBhbnkgb2YgdGhlIGZvcm1hdHMgZG9jdW1lbnRlZCBpbgorLlhyIHNzaGRfY29uZmlnIDUgLAordGhlbiB0aGUgYmFja2dyb3VuZGVkIG1hc3RlciBjb25uZWN0aW9uIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUKK2FmdGVyIGl0IGhhcyByZW1haW5lZCBpZGxlICh3aXRoIG5vIGNsaWVudCBjb25uZWN0aW9ucykgZm9yIHRoZQorc3BlY2lmaWVkIHRpbWUuCisuSXQgQ20gRHluYW1pY0ZvcndhcmQKK1NwZWNpZmllcyB0aGF0IGEgVENQIHBvcnQgb24gdGhlIGxvY2FsIG1hY2hpbmUgYmUgZm9yd2FyZGVkCitvdmVyIHRoZSBzZWN1cmUgY2hhbm5lbCwgYW5kIHRoZSBhcHBsaWNhdGlvbgorcHJvdG9jb2wgaXMgdGhlbiB1c2VkIHRvIGRldGVybWluZSB3aGVyZSB0byBjb25uZWN0IHRvIGZyb20gdGhlCityZW1vdGUgbWFjaGluZS4KKy5QcAorVGhlIGFyZ3VtZW50IG11c3QgYmUKKy5TbSBvZmYKKy5PbyBBciBiaW5kX2FkZHJlc3MgOiBPYyBBciBwb3J0IC4KKy5TbSBvbgorSVB2NiBhZGRyZXNzZXMgY2FuIGJlIHNwZWNpZmllZCBieSBlbmNsb3NpbmcgYWRkcmVzc2VzIGluIHNxdWFyZSBicmFja2V0cy4KK0J5IGRlZmF1bHQsIHRoZSBsb2NhbCBwb3J0IGlzIGJvdW5kIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKKy5DbSBHYXRld2F5UG9ydHMKK3NldHRpbmcuCitIb3dldmVyLCBhbiBleHBsaWNpdAorLkFyIGJpbmRfYWRkcmVzcworbWF5IGJlIHVzZWQgdG8gYmluZCB0aGUgY29ubmVjdGlvbiB0byBhIHNwZWNpZmljIGFkZHJlc3MuCitUaGUKKy5BciBiaW5kX2FkZHJlc3MKK29mCisuRHEgbG9jYWxob3N0CitpbmRpY2F0ZXMgdGhhdCB0aGUgbGlzdGVuaW5nIHBvcnQgYmUgYm91bmQgZm9yIGxvY2FsIHVzZSBvbmx5LCB3aGlsZSBhbgorZW1wdHkgYWRkcmVzcyBvcgorLlNxICoKK2luZGljYXRlcyB0aGF0IHRoZSBwb3J0IHNob3VsZCBiZSBhdmFpbGFibGUgZnJvbSBhbGwgaW50ZXJmYWNlcy4KKy5QcAorQ3VycmVudGx5IHRoZSBTT0NLUzQgYW5kIFNPQ0tTNSBwcm90b2NvbHMgYXJlIHN1cHBvcnRlZCwgYW5kCisuWHIgc3NoIDEKK3dpbGwgYWN0IGFzIGEgU09DS1Mgc2VydmVyLgorTXVsdGlwbGUgZm9yd2FyZGluZ3MgbWF5IGJlIHNwZWNpZmllZCwgYW5kCithZGRpdGlvbmFsIGZvcndhcmRpbmdzIGNhbiBiZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLgorT25seSB0aGUgc3VwZXJ1c2VyIGNhbiBmb3J3YXJkIHByaXZpbGVnZWQgcG9ydHMuCisuSXQgQ20gRW5hYmxlU1NIS2V5c2lnbgorU2V0dGluZyB0aGlzIG9wdGlvbiB0bworLkRxIHllcworaW4gdGhlIGdsb2JhbCBjbGllbnQgY29uZmlndXJhdGlvbiBmaWxlCisuUGEgL2V0Yy9zc2gvc3NoX2NvbmZpZworZW5hYmxlcyB0aGUgdXNlIG9mIHRoZSBoZWxwZXIgcHJvZ3JhbQorLlhyIHNzaC1rZXlzaWduIDgKK2R1cmluZworLkNtIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uIC4KK1RoZSBhcmd1bWVudCBtdXN0IGJlCisuRHEgeWVzCitvcgorLkRxIG5vIC4KK1RoZSBkZWZhdWx0IGlzCisuRHEgbm8gLgorVGhpcyBvcHRpb24gc2hvdWxkIGJlIHBsYWNlZCBpbiB0aGUgbm9uLWhvc3RzcGVjaWZpYyBzZWN0aW9uLgorU2VlCisuWHIgc3NoLWtleXNpZ24gOAorZm9yIG1vcmUgaW5mb3JtYXRpb24uCisuSXQgQ20gRXNjYXBlQ2hhcgorU2V0cyB0aGUgZXNjYXBlIGNoYXJhY3RlciAoZGVmYXVsdDoKKy5RbCB+ICkgLgorVGhlIGVzY2FwZSBjaGFyYWN0ZXIgY2FuIGFsc28KK2JlIHNldCBvbiB0aGUgY29tbWFuZCBsaW5lLgorVGhlIGFyZ3VtZW50IHNob3VsZCBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIsCisuUWwgXgorZm9sbG93ZWQgYnkgYSBsZXR0ZXIsIG9yCisuRHEgbm9uZQordG8gZGlzYWJsZSB0aGUgZXNjYXBlCitjaGFyYWN0ZXIgZW50aXJlbHkgKG1ha2luZyB0aGUgY29ubmVjdGlvbiB0cmFuc3BhcmVudCBmb3IgYmluYXJ5CitkYXRhKS4KKy5JdCBDbSBFeGl0T25Gb3J3YXJkRmFpbHVyZQorU3BlY2lmaWVzIHdoZXRoZXIKKy5YciBzc2ggMQorc2hvdWxkIHRlcm1pbmF0ZSB0aGUgY29ubmVjdGlvbiBpZiBpdCBjYW5ub3Qgc2V0IHVwIGFsbCByZXF1ZXN0ZWQKK2R5bmFtaWMsIHR1bm5lbCwgbG9jYWwsIGFuZCByZW1vdGUgcG9ydCBmb3J3YXJkaW5ncy4KK1RoZSBhcmd1bWVudCBtdXN0IGJlCisuRHEgeWVzCitvcgorLkRxIG5vIC4KK1RoZSBkZWZhdWx0IGlzCisuRHEgbm8gLgorLkl0IENtIEZvcndhcmRBZ2VudAorU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGF1dGhlbnRpY2F0aW9uIGFnZW50IChpZiBhbnkpCit3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgcmVtb3RlIG1hY2hpbmUuCitUaGUgYXJndW1lbnQgbXVzdCBiZQorLkRxIHllcworb3IKKy5EcSBubyAuCitUaGUgZGVmYXVsdCBpcworLkRxIG5vIC4KKy5QcAorQWdlbnQgZm9yd2FyZGluZyBzaG91bGQgYmUgZW5hYmxlZCB3aXRoIGNhdXRpb24uCitVc2VycyB3aXRoIHRoZSBhYmlsaXR5IHRvIGJ5cGFzcyBmaWxlIHBlcm1pc3Npb25zIG9uIHRoZSByZW1vdGUgaG9zdAorKGZvciB0aGUgYWdlbnQncyBVbml4LWRvbWFpbiBzb2NrZXQpCitjYW4gYWNjZXNzIHRoZSBsb2NhbCBhZ2VudCB0aHJvdWdoIHRoZSBmb3J3YXJkZWQgY29ubmVjdGlvbi4KK0FuIGF0dGFja2VyIGNhbm5vdCBvYnRhaW4ga2V5IG1hdGVyaWFsIGZyb20gdGhlIGFnZW50LAoraG93ZXZlciB0aGV5IGNhbiBwZXJmb3JtIG9wZXJhdGlvbnMgb24gdGhlIGtleXMgdGhhdCBlbmFibGUgdGhlbSB0bworYXV0aGVudGljYXRlIHVzaW5nIHRoZSBpZGVudGl0aWVzIGxvYWRlZCBpbnRvIHRoZSBhZ2VudC4KKy5JdCBDbSBGb3J3YXJkWDExCitTcGVjaWZpZXMgd2hldGhlciBYMTEgY29ubmVjdGlvbnMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZGlyZWN0ZWQKK292ZXIgdGhlIHNlY3VyZSBjaGFubmVsIGFuZAorLkV2IERJU1BMQVkKK3NldC4KK1RoZSBhcmd1bWVudCBtdXN0IGJlCisuRHEgeWVzCitvcgorLkRxIG5vIC4KK1RoZSBkZWZhdWx0IGlzCisuRHEgbm8gLgorLlBwCitYMTEgZm9yd2FyZGluZyBzaG91bGQgYmUgZW5hYmxlZCB3aXRoIGNhdXRpb24uCitVc2VycyB3aXRoIHRoZSBhYmlsaXR5IHRvIGJ5cGFzcyBmaWxlIHBlcm1pc3Npb25zIG9uIHRoZSByZW1vdGUgaG9zdAorKGZvciB0aGUgdXNlcidzIFgxMSBhdXRob3JpemF0aW9uIGRhdGFiYXNlKQorY2FuIGFjY2VzcyB0aGUgbG9jYWwgWDExIGRpc3BsYXkgdGhyb3VnaCB0aGUgZm9yd2FyZGVkIGNvbm5lY3Rpb24uCitBbiBhdHRhY2tlciBtYXkgdGhlbiBiZSBhYmxlIHRvIHBlcmZvcm0gYWN0aXZpdGllcyBzdWNoIGFzIGtleXN0cm9rZSBtb25pdG9yaW5nCitpZiB0aGUKKy5DbSBGb3J3YXJkWDExVHJ1c3RlZAorb3B0aW9uIGlzIGFsc28gZW5hYmxlZC4KKy5JdCBDbSBGb3J3YXJkWDExVGltZW91dAorU3BlY2lmeSBhIHRpbWVvdXQgZm9yIHVudHJ1c3RlZCBYMTEgZm9yd2FyZGluZwordXNpbmcgdGhlIGZvcm1hdCBkZXNjcmliZWQgaW4gdGhlCisuU3ggVElNRSBGT1JNQVRTCitzZWN0aW9uIG9mCisuWHIgc3NoZF9jb25maWcgNSAuCitYMTEgY29ubmVjdGlvbnMgcmVjZWl2ZWQgYnkKKy5YciBzc2ggMQorYWZ0ZXIgdGhpcyB0aW1lIHdpbGwgYmUgcmVmdXNlZC4KK1RoZSBkZWZhdWx0IGlzIHRvIGRpc2FibGUgdW50cnVzdGVkIFgxMSBmb3J3YXJkaW5nIGFmdGVyIHR3ZW50eSBtaW51dGVzIGhhcworZWxhcHNlZC4KKy5JdCBDbSBGb3J3YXJkWDExVHJ1c3RlZAorSWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvCisuRHEgeWVzICwKK3JlbW90ZSBYMTEgY2xpZW50cyB3aWxsIGhhdmUgZnVsbCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIFgxMSBkaXNwbGF5LgorLlBwCitJZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8KKy5EcSBubyAsCityZW1vdGUgWDExIGNsaWVudHMgd2lsbCBiZSBjb25zaWRlcmVkIHVudHJ1c3RlZCBhbmQgcHJldmVudGVkCitmcm9tIHN0ZWFsaW5nIG9yIHRhbXBlcmluZyB3aXRoIGRhdGEgYmVsb25naW5nIHRvIHRydXN0ZWQgWDExCitjbGllbnRzLgorRnVydGhlcm1vcmUsIHRoZQorLlhyIHhhdXRoIDEKK3Rva2VuIHVzZWQgZm9yIHRoZSBzZXNzaW9uIHdpbGwgYmUgc2V0IHRvIGV4cGlyZSBhZnRlciAyMCBtaW51dGVzLgorUmVtb3RlIGNsaWVudHMgd2lsbCBiZSByZWZ1c2VkIGFjY2VzcyBhZnRlciB0aGlzIHRpbWUuCisuUHAKK1RoZSBkZWZhdWx0IGlzCisuRHEgbm8gLgorLlBwCitTZWUgdGhlIFgxMSBTRUNVUklUWSBleHRlbnNpb24gc3BlY2lmaWNhdGlvbiBmb3IgZnVsbCBkZXRhaWxzIG9uCit0aGUgcmVzdHJpY3Rpb25zIGltcG9zZWQgb24gdW50cnVzdGVkIGNsaWVudHMuCisuSXQgQ20gR2F0ZXdheVBvcnRzCitTcGVjaWZpZXMgd2hldGhlciByZW1vdGUgaG9zdHMgYXJlIGFsbG93ZWQgdG8gY29ubmVjdCB0byBsb2NhbAorZm9yd2FyZGVkIHBvcnRzLgorQnkgZGVmYXVsdCwKKy5YciBzc2ggMQorYmluZHMgbG9jYWwgcG9ydCBmb3J3YXJkaW5ncyB0byB0aGUgbG9vcGJhY2sgYWRkcmVzcy4KK1RoaXMgcHJldmVudHMgb3RoZXIgcmVtb3RlIGhvc3RzIGZyb20gY29ubmVjdGluZyB0byBmb3J3YXJkZWQgcG9ydHMuCisuQ20gR2F0ZXdheVBvcnRzCitjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoYXQgc3NoCitzaG91bGQgYmluZCBsb2NhbCBwb3J0IGZvcndhcmRpbmdzIHRvIHRoZSB3aWxkY2FyZCBhZGRyZXNzLAordGh1cyBhbGxvd2luZyByZW1vdGUgaG9zdHMgdG8gY29ubmVjdCB0byBmb3J3YXJkZWQgcG9ydHMuCitUaGUgYXJndW1lbnQgbXVzdCBiZQorLkRxIHllcworb3IKKy5EcSBubyAuCitUaGUgZGVmYXVsdCBpcworLkRxIG5vIC4KKy5JdCBDbSBHbG9iYWxLbm93bkhvc3RzRmlsZQorU3BlY2lmaWVzIG9uZSBvciBtb3JlIGZpbGVzIHRvIHVzZSBmb3IgdGhlIGdsb2JhbAoraG9zdCBrZXkgZGF0YWJhc2UsIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLgorVGhlIGRlZmF1bHQgaXMKKy5QYSAvZXRjL3NzaC9zc2hfa25vd25faG9zdHMgLAorLlBhIC9ldGMvc3NoL3NzaF9rbm93bl9ob3N0czIgLgorLkl0IENtIEdTU0FQSUF1dGhlbnRpY2F0aW9uCitTcGVjaWZpZXMgd2hldGhlciB1c2VyIGF1dGhlbnRpY2F0aW9uIGJhc2VkIG9uIEdTU0FQSSBpcyBhbGxvd2VkLgorVGhlIGRlZmF1bHQgaXMKKy5EcSBubyAuCitOb3RlIHRoYXQgdGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDIgb25seS4KKy5JdCBDbSBHU1NBUElEZWxlZ2F0ZUNyZWRlbnRpYWxzCitGb3J3YXJkIChkZWxlZ2F0ZSkgY3JlZGVudGlhbHMgdG8gdGhlIHNlcnZlci4KK1RoZSBkZWZhdWx0IGlzCisuRHEgbm8gLgorTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAyIG9ubHkuCisuSXQgQ20gSGFzaEtub3duSG9zdHMKK0luZGljYXRlcyB0aGF0CisuWHIgc3NoIDEKK3Nob3VsZCBoYXNoIGhvc3QgbmFtZXMgYW5kIGFkZHJlc3NlcyB3aGVuIHRoZXkgYXJlIGFkZGVkIHRvCisuUGEgfi8uc3NoL2tub3duX2hvc3RzIC4KK1RoZXNlIGhhc2hlZCBuYW1lcyBtYXkgYmUgdXNlZCBub3JtYWxseSBieQorLlhyIHNzaCAxCithbmQKKy5YciBzc2hkIDggLAorYnV0IHRoZXkgZG8gbm90IHJldmVhbCBpZGVudGlmeWluZyBpbmZvcm1hdGlvbiBzaG91bGQgdGhlIGZpbGUncyBjb250ZW50cworYmUgZGlzY2xvc2VkLgorVGhlIGRlZmF1bHQgaXMKKy5EcSBubyAuCitOb3RlIHRoYXQgZXhpc3RpbmcgbmFtZXMgYW5kIGFkZHJlc3NlcyBpbiBrbm93biBob3N0cyBmaWxlcword2lsbCBub3QgYmUgY29udmVydGVkIGF1dG9tYXRpY2FsbHksCitidXQgbWF5IGJlIG1hbnVhbGx5IGhhc2hlZCB1c2luZworLlhyIHNzaC1rZXlnZW4gMSAuCisuSXQgQ20gSG9zdGJhc2VkQXV0aGVudGljYXRpb24KK1NwZWNpZmllcyB3aGV0aGVyIHRvIHRyeSByaG9zdHMgYmFzZWQgYXV0aGVudGljYXRpb24gd2l0aCBwdWJsaWMga2V5CithdXRoZW50aWNhdGlvbi4KK1RoZSBhcmd1bWVudCBtdXN0IGJlCisuRHEgeWVzCitvcgorLkRxIG5vIC4KK1RoZSBkZWZhdWx0IGlzCisuRHEgbm8gLgorVGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDIgb25seSBhbmQKK2lzIHNpbWlsYXIgdG8KKy5DbSBSaG9zdHNSU0FBdXRoZW50aWNhdGlvbiAuCisuSXQgQ20gSG9zdEtleUFsZ29yaXRobXMKK1NwZWNpZmllcyB0aGUgcHJvdG9jb2wgdmVyc2lvbiAyIGhvc3Qga2V5IGFsZ29yaXRobXMKK3RoYXQgdGhlIGNsaWVudCB3YW50cyB0byB1c2UgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4KK1RoZSBkZWZhdWx0IGZvciB0aGlzIG9wdGlvbiBpczoKKy5CZCAtbGl0ZXJhbCAtb2Zmc2V0IDNuCitlY2RzYS1zaGEyLW5pc3RwMjU2LWNlcnQtdjAxQG9wZW5zc2guY29tLAorZWNkc2Etc2hhMi1uaXN0cDM4NC1jZXJ0LXYwMUBvcGVuc3NoLmNvbSwKK2VjZHNhLXNoYTItbmlzdHA1MjEtY2VydC12MDFAb3BlbnNzaC5jb20sCitzc2gtcnNhLWNlcnQtdjAxQG9wZW5zc2guY29tLHNzaC1kc3MtY2VydC12MDFAb3BlbnNzaC5jb20sCitzc2gtcnNhLWNlcnQtdjAwQG9wZW5zc2guY29tLHNzaC1kc3MtY2VydC12MDBAb3BlbnNzaC5jb20sCitlY2RzYS1zaGEyLW5pc3RwMjU2LGVjZHNhLXNoYTItbmlzdHAzODQsZWNkc2Etc2hhMi1uaXN0cDUyMSwKK3NzaC1yc2Esc3NoLWRzcworLkVkCisuUHAKK0lmIGhvc3RrZXlzIGFyZSBrbm93biBmb3IgdGhlIGRlc3RpbmF0aW9uIGhvc3QgdGhlbiB0aGlzIGRlZmF1bHQgaXMgbW9kaWZpZWQKK3RvIHByZWZlciB0aGVpciBhbGdvcml0aG1zLgorLkl0IENtIEhvc3RLZXlBbGlhcworU3BlY2lmaWVzIGFuIGFsaWFzIHRoYXQgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUKK3JlYWwgaG9zdCBuYW1lIHdoZW4gbG9va2luZyB1cCBvciBzYXZpbmcgdGhlIGhvc3Qga2V5CitpbiB0aGUgaG9zdCBrZXkgZGF0YWJhc2UgZmlsZXMuCitUaGlzIG9wdGlvbiBpcyB1c2VmdWwgZm9yIHR1bm5lbGluZyBTU0ggY29ubmVjdGlvbnMKK29yIGZvciBtdWx0aXBsZSBzZXJ2ZXJzIHJ1bm5pbmcgb24gYSBzaW5nbGUgaG9zdC4KKy5JdCBDbSBIb3N0TmFtZQorU3BlY2lmaWVzIHRoZSByZWFsIGhvc3QgbmFtZSB0byBsb2cgaW50by4KK1RoaXMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBuaWNrbmFtZXMgb3IgYWJicmV2aWF0aW9ucyBmb3IgaG9zdHMuCitJZiB0aGUgaG9zdG5hbWUgY29udGFpbnMgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZQorLlFsICVoICwKK3RoZW4gdGhpcyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGhvc3QgbmFtZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZQorKHRoaXMgaXMgdXNlZnVsIGZvciBtYW5pcHVsYXRpbmcgdW5xdWFsaWZpZWQgbmFtZXMpLgorVGhlIGRlZmF1bHQgaXMgdGhlIG5hbWUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KK051bWVyaWMgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIHBlcm1pdHRlZCAoYm90aCBvbiB0aGUgY29tbWFuZCBsaW5lIGFuZCBpbgorLkNtIEhvc3ROYW1lCitzcGVjaWZpY2F0aW9ucykuCisuSXQgQ20gSWRlbnRpdGllc09ubHkKK1NwZWNpZmllcyB0aGF0CisuWHIgc3NoIDEKK3Nob3VsZCBvbmx5IHVzZSB0aGUgYXV0aGVudGljYXRpb24gaWRlbnRpdHkgZmlsZXMgY29uZmlndXJlZCBpbiB0aGUKKy5ObQorZmlsZXMsCitldmVuIGlmCisuWHIgc3NoLWFnZW50IDEKK29mZmVycyBtb3JlIGlkZW50aXRpZXMuCitUaGUgYXJndW1lbnQgdG8gdGhpcyBrZXl3b3JkIG11c3QgYmUKKy5EcSB5ZXMKK29yCisuRHEgbm8gLgorVGhpcyBvcHRpb24gaXMgaW50ZW5kZWQgZm9yIHNpdHVhdGlvbnMgd2hlcmUgc3NoLWFnZW50CitvZmZlcnMgbWFueSBkaWZmZXJlbnQgaWRlbnRpdGllcy4KK1RoZSBkZWZhdWx0IGlzCisuRHEgbm8gLgorLkl0IENtIElkZW50aXR5RmlsZQorU3BlY2lmaWVzIGEgZmlsZSBmcm9tIHdoaWNoIHRoZSB1c2VyJ3MgRFNBLCBFQ0RTQSBvciBEU0EgYXV0aGVudGljYXRpb24KK2lkZW50aXR5IGlzIHJlYWQuCitUaGUgZGVmYXVsdCBpcworLlBhIH4vLnNzaC9pZGVudGl0eQorZm9yIHByb3RvY29sIHZlcnNpb24gMSwgYW5kCisuUGEgfi8uc3NoL2lkX2RzYSAsCisuUGEgfi8uc3NoL2lkX2VjZHNhCithbmQKKy5QYSB+Ly5zc2gvaWRfcnNhCitmb3IgcHJvdG9jb2wgdmVyc2lvbiAyLgorQWRkaXRpb25hbGx5LCBhbnkgaWRlbnRpdGllcyByZXByZXNlbnRlZCBieSB0aGUgYXV0aGVudGljYXRpb24gYWdlbnQKK3dpbGwgYmUgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uCisuWHIgc3NoIDEKK3dpbGwgdHJ5IHRvIGxvYWQgY2VydGlmaWNhdGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgZmlsZW5hbWUgb2J0YWluZWQgYnkKK2FwcGVuZGluZworLlBhIC1jZXJ0LnB1YgordG8gdGhlIHBhdGggb2YgYSBzcGVjaWZpZWQKKy5DbSBJZGVudGl0eUZpbGUgLgorLlBwCitUaGUgZmlsZSBuYW1lIG1heSB1c2UgdGhlIHRpbGRlCitzeW50YXggdG8gcmVmZXIgdG8gYSB1c2VyJ3MgaG9tZSBkaXJlY3Rvcnkgb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcKK2VzY2FwZSBjaGFyYWN0ZXJzOgorLlFsICVkCisobG9jYWwgdXNlcidzIGhvbWUgZGlyZWN0b3J5KSwKKy5RbCAldQorKGxvY2FsIHVzZXIgbmFtZSksCisuUWwgJWwKKyhsb2NhbCBob3N0IG5hbWUpLAorLlFsICVoCisocmVtb3RlIGhvc3QgbmFtZSkgb3IKKy5RbCAlcgorKHJlbW90ZSB1c2VyIG5hbWUpLgorLlBwCitJdCBpcyBwb3NzaWJsZSB0byBoYXZlCittdWx0aXBsZSBpZGVudGl0eSBmaWxlcyBzcGVjaWZpZWQgaW4gY29uZmlndXJhdGlvbiBmaWxlczsgYWxsIHRoZXNlCitpZGVudGl0aWVzIHdpbGwgYmUgdHJpZWQgaW4gc2VxdWVuY2UuCitNdWx0aXBsZQorLkNtIElkZW50aXR5RmlsZQorZGlyZWN0aXZlcyB3aWxsIGFkZCB0byB0aGUgbGlzdCBvZiBpZGVudGl0aWVzIHRyaWVkICh0aGlzIGJlaGF2aW91cgorZGlmZmVycyBmcm9tIHRoYXQgb2Ygb3RoZXIgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzKS4KKy5JdCBDbSBJUFFvUworU3BlY2lmaWVzIHRoZSBJUHY0IHR5cGUtb2Ytc2VydmljZSBvciBEU0NQIGNsYXNzIGZvciBjb25uZWN0aW9ucy4KK0FjY2VwdGVkIHZhbHVlcyBhcmUKKy5EcSBhZjExICwKKy5EcSBhZjEyICwKKy5EcSBhZjEzICwKKy5EcSBhZjIxICwKKy5EcSBhZjIyICwKKy5EcSBhZjIzICwKKy5EcSBhZjMxICwKKy5EcSBhZjMyICwKKy5EcSBhZjMzICwKKy5EcSBhZjQxICwKKy5EcSBhZjQyICwKKy5EcSBhZjQzICwKKy5EcSBjczAgLAorLkRxIGNzMSAsCisuRHEgY3MyICwKKy5EcSBjczMgLAorLkRxIGNzNCAsCisuRHEgY3M1ICwKKy5EcSBjczYgLAorLkRxIGNzNyAsCisuRHEgZWYgLAorLkRxIGxvd2RlbGF5ICwKKy5EcSB0aHJvdWdocHV0ICwKKy5EcSByZWxpYWJpbGl0eSAsCitvciBhIG51bWVyaWMgdmFsdWUuCitUaGlzIG9wdGlvbiBtYXkgdGFrZSBvbmUgb3IgdHdvIGFyZ3VtZW50cywgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuCitJZiBvbmUgYXJndW1lbnQgaXMgc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGFzIHRoZSBwYWNrZXQgY2xhc3MgdW5jb25kaXRpb25hbGx5LgorSWYgdHdvIHZhbHVlcyBhcmUgc3BlY2lmaWVkLCB0aGUgZmlyc3QgaXMgYXV0b21hdGljYWxseSBzZWxlY3RlZCBmb3IKK2ludGVyYWN0aXZlIHNlc3Npb25zIGFuZCB0aGUgc2Vjb25kIGZvciBub24taW50ZXJhY3RpdmUgc2Vzc2lvbnMuCitUaGUgZGVmYXVsdCBpcworLkRxIGxvd2RlbGF5Citmb3IgaW50ZXJhY3RpdmUgc2Vzc2lvbnMgYW5kCisuRHEgdGhyb3VnaHB1dAorZm9yIG5vbi1pbnRlcmFjdGl2ZSBzZXNzaW9ucy4KKy5JdCBDbSBLYmRJbnRlcmFjdGl2ZUF1dGhlbnRpY2F0aW9uCitTcGVjaWZpZXMgd2hldGhlciB0byB1c2Uga2V5Ym9hcmQtaW50ZXJhY3RpdmUgYXV0aGVudGljYXRpb24uCitUaGUgYXJndW1lbnQgdG8gdGhpcyBrZXl3b3JkIG11c3QgYmUKKy5EcSB5ZXMKK29yCisuRHEgbm8gLgorVGhlIGRlZmF1bHQgaXMKKy5EcSB5ZXMgLgorLkl0IENtIEtiZEludGVyYWN0aXZlRGV2aWNlcworU3BlY2lmaWVzIHRoZSBsaXN0IG9mIG1ldGhvZHMgdG8gdXNlIGluIGtleWJvYXJkLWludGVyYWN0aXZlIGF1dGhlbnRpY2F0aW9uLgorTXVsdGlwbGUgbWV0aG9kIG5hbWVzIG11c3QgYmUgY29tbWEtc2VwYXJhdGVkLgorVGhlIGRlZmF1bHQgaXMgdG8gdXNlIHRoZSBzZXJ2ZXIgc3BlY2lmaWVkIGxpc3QuCitUaGUgbWV0aG9kcyBhdmFpbGFibGUgdmFyeSBkZXBlbmRpbmcgb24gd2hhdCB0aGUgc2VydmVyIHN1cHBvcnRzLgorRm9yIGFuIE9wZW5TU0ggc2VydmVyLAoraXQgbWF5IGJlIHplcm8gb3IgbW9yZSBvZjoKKy5EcSBic2RhdXRoICwKKy5EcSBwYW0gLAorYW5kCisuRHEgc2tleSAuCisuSXQgQ20gS2V4QWxnb3JpdGhtcworU3BlY2lmaWVzIHRoZSBhdmFpbGFibGUgS0VYIChLZXkgRXhjaGFuZ2UpIGFsZ29yaXRobXMuCitNdWx0aXBsZSBhbGdvcml0aG1zIG11c3QgYmUgY29tbWEtc2VwYXJhdGVkLgorVGhlIGRlZmF1bHQgaXM6CisuQmQgLWxpdGVyYWwgLW9mZnNldCBpbmRlbnQKK2VjZGgtc2hhMi1uaXN0cDI1NixlY2RoLXNoYTItbmlzdHAzODQsZWNkaC1zaGEyLW5pc3RwNTIxLAorZGlmZmllLWhlbGxtYW4tZ3JvdXAtZXhjaGFuZ2Utc2hhMjU2LAorZGlmZmllLWhlbGxtYW4tZ3JvdXAtZXhjaGFuZ2Utc2hhMSwKK2RpZmZpZS1oZWxsbWFuLWdyb3VwMTQtc2hhMSwKK2RpZmZpZS1oZWxsbWFuLWdyb3VwMS1zaGExCisuRWQKKy5JdCBDbSBMb2NhbENvbW1hbmQKK1NwZWNpZmllcyBhIGNvbW1hbmQgdG8gZXhlY3V0ZSBvbiB0aGUgbG9jYWwgbWFjaGluZSBhZnRlciBzdWNjZXNzZnVsbHkKK2Nvbm5lY3RpbmcgdG8gdGhlIHNlcnZlci4KK1RoZSBjb21tYW5kIHN0cmluZyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUsIGFuZCBpcyBleGVjdXRlZCB3aXRoCit0aGUgdXNlcidzIHNoZWxsLgorVGhlIGZvbGxvd2luZyBlc2NhcGUgY2hhcmFjdGVyIHN1YnN0aXR1dGlvbnMgd2lsbCBiZSBwZXJmb3JtZWQ6CisuUWwgJWQKKyhsb2NhbCB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkpLAorLlFsICVoCisocmVtb3RlIGhvc3QgbmFtZSksCisuUWwgJWwKKyhsb2NhbCBob3N0IG5hbWUpLAorLlFsICVuCisoaG9zdCBuYW1lIGFzIHByb3ZpZGVkIG9uIHRoZSBjb21tYW5kIGxpbmUpLAorLlFsICVwCisocmVtb3RlIHBvcnQpLAorLlFsICVyCisocmVtb3RlIHVzZXIgbmFtZSkgb3IKKy5RbCAldQorKGxvY2FsIHVzZXIgbmFtZSkuCisuUHAKK1RoZSBjb21tYW5kIGlzIHJ1biBzeW5jaHJvbm91c2x5IGFuZCBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUKK3Nlc3Npb24gb2YgdGhlCisuWHIgc3NoIDEKK3RoYXQgc3Bhd25lZCBpdC4KK0l0IHNob3VsZCBub3QgYmUgdXNlZCBmb3IgaW50ZXJhY3RpdmUgY29tbWFuZHMuCisuUHAKK1RoaXMgZGlyZWN0aXZlIGlzIGlnbm9yZWQgdW5sZXNzCisuQ20gUGVybWl0TG9jYWxDb21tYW5kCitoYXMgYmVlbiBlbmFibGVkLgorLkl0IENtIExvY2FsRm9yd2FyZAorU3BlY2lmaWVzIHRoYXQgYSBUQ1AgcG9ydCBvbiB0aGUgbG9jYWwgbWFjaGluZSBiZSBmb3J3YXJkZWQgb3ZlcgordGhlIHNlY3VyZSBjaGFubmVsIHRvIHRoZSBzcGVjaWZpZWQgaG9zdCBhbmQgcG9ydCBmcm9tIHRoZSByZW1vdGUgbWFjaGluZS4KK1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlCisuU20gb2ZmCisuT28gQXIgYmluZF9hZGRyZXNzIDogT2MgQXIgcG9ydAorLlNtIG9uCithbmQgdGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlCisuQXIgaG9zdCA6IE5zIEFyIGhvc3Rwb3J0IC4KK0lQdjYgYWRkcmVzc2VzIGNhbiBiZSBzcGVjaWZpZWQgYnkgZW5jbG9zaW5nIGFkZHJlc3NlcyBpbiBzcXVhcmUgYnJhY2tldHMuCitNdWx0aXBsZSBmb3J3YXJkaW5ncyBtYXkgYmUgc3BlY2lmaWVkLCBhbmQgYWRkaXRpb25hbCBmb3J3YXJkaW5ncyBjYW4gYmUKK2dpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCitPbmx5IHRoZSBzdXBlcnVzZXIgY2FuIGZvcndhcmQgcHJpdmlsZWdlZCBwb3J0cy4KK0J5IGRlZmF1bHQsIHRoZSBsb2NhbCBwb3J0IGlzIGJvdW5kIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKKy5DbSBHYXRld2F5UG9ydHMKK3NldHRpbmcuCitIb3dldmVyLCBhbiBleHBsaWNpdAorLkFyIGJpbmRfYWRkcmVzcworbWF5IGJlIHVzZWQgdG8gYmluZCB0aGUgY29ubmVjdGlvbiB0byBhIHNwZWNpZmljIGFkZHJlc3MuCitUaGUKKy5BciBiaW5kX2FkZHJlc3MKK29mCisuRHEgbG9jYWxob3N0CitpbmRpY2F0ZXMgdGhhdCB0aGUgbGlzdGVuaW5nIHBvcnQgYmUgYm91bmQgZm9yIGxvY2FsIHVzZSBvbmx5LCB3aGlsZSBhbgorZW1wdHkgYWRkcmVzcyBvcgorLlNxICoKK2luZGljYXRlcyB0aGF0IHRoZSBwb3J0IHNob3VsZCBiZSBhdmFpbGFibGUgZnJvbSBhbGwgaW50ZXJmYWNlcy4KKy5JdCBDbSBMb2dMZXZlbAorR2l2ZXMgdGhlIHZlcmJvc2l0eSBsZXZlbCB0aGF0IGlzIHVzZWQgd2hlbiBsb2dnaW5nIG1lc3NhZ2VzIGZyb20KKy5YciBzc2ggMSAuCitUaGUgcG9zc2libGUgdmFsdWVzIGFyZToKK1FVSUVULCBGQVRBTCwgRVJST1IsIElORk8sIFZFUkJPU0UsIERFQlVHLCBERUJVRzEsIERFQlVHMiwgYW5kIERFQlVHMy4KK1RoZSBkZWZhdWx0IGlzIElORk8uCitERUJVRyBhbmQgREVCVUcxIGFyZSBlcXVpdmFsZW50LgorREVCVUcyIGFuZCBERUJVRzMgZWFjaCBzcGVjaWZ5IGhpZ2hlciBsZXZlbHMgb2YgdmVyYm9zZSBvdXRwdXQuCisuSXQgQ20gTUFDcworU3BlY2lmaWVzIHRoZSBNQUMgKG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZSkgYWxnb3JpdGhtcworaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4KK1RoZSBNQUMgYWxnb3JpdGhtIGlzIHVzZWQgaW4gcHJvdG9jb2wgdmVyc2lvbiAyCitmb3IgZGF0YSBpbnRlZ3JpdHkgcHJvdGVjdGlvbi4KK011bHRpcGxlIGFsZ29yaXRobXMgbXVzdCBiZSBjb21tYS1zZXBhcmF0ZWQuCitUaGUgZGVmYXVsdCBpczoKKy5CZCAtbGl0ZXJhbCAtb2Zmc2V0IGluZGVudAoraG1hYy1tZDUsaG1hYy1zaGExLHVtYWMtNjRAb3BlbnNzaC5jb20sCitobWFjLXJpcGVtZDE2MCxobWFjLXNoYTEtOTYsaG1hYy1tZDUtOTYsCitobWFjLXNoYTItMjU2LGhtYWMtc2hhMi0yNTYtOTYsaG1hYy1zaGEyLTUxMiwKK2htYWMtc2hhMi01MTItOTYKKy5FZAorLkl0IENtIE5vSG9zdEF1dGhlbnRpY2F0aW9uRm9yTG9jYWxob3N0CitUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCBpZiB0aGUgaG9tZSBkaXJlY3RvcnkgaXMgc2hhcmVkIGFjcm9zcyBtYWNoaW5lcy4KK0luIHRoaXMgY2FzZSBsb2NhbGhvc3Qgd2lsbCByZWZlciB0byBhIGRpZmZlcmVudCBtYWNoaW5lIG9uIGVhY2ggb2YKK3RoZSBtYWNoaW5lcyBhbmQgdGhlIHVzZXIgd2lsbCBnZXQgbWFueSB3YXJuaW5ncyBhYm91dCBjaGFuZ2VkIGhvc3Qga2V5cy4KK0hvd2V2ZXIsIHRoaXMgb3B0aW9uIGRpc2FibGVzIGhvc3QgYXV0aGVudGljYXRpb24gZm9yIGxvY2FsaG9zdC4KK1RoZSBhcmd1bWVudCB0byB0aGlzIGtleXdvcmQgbXVzdCBiZQorLkRxIHllcworb3IKKy5EcSBubyAuCitUaGUgZGVmYXVsdCBpcyB0byBjaGVjayB0aGUgaG9zdCBrZXkgZm9yIGxvY2FsaG9zdC4KKy5JdCBDbSBOdW1iZXJPZlBhc3N3b3JkUHJvbXB0cworU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcGFzc3dvcmQgcHJvbXB0cyBiZWZvcmUgZ2l2aW5nIHVwLgorVGhlIGFyZ3VtZW50IHRvIHRoaXMga2V5d29yZCBtdXN0IGJlIGFuIGludGVnZXIuCitUaGUgZGVmYXVsdCBpcyAzLgorLkl0IENtIFBhc3N3b3JkQXV0aGVudGljYXRpb24KK1NwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBwYXNzd29yZCBhdXRoZW50aWNhdGlvbi4KK1RoZSBhcmd1bWVudCB0byB0aGlzIGtleXdvcmQgbXVzdCBiZQorLkRxIHllcworb3IKKy5EcSBubyAuCitUaGUgZGVmYXVsdCBpcworLkRxIHllcyAuCisuSXQgQ20gUGVybWl0TG9jYWxDb21tYW5kCitBbGxvdyBsb2NhbCBjb21tYW5kIGV4ZWN1dGlvbiB2aWEgdGhlCisuSWMgTG9jYWxDb21tYW5kCitvcHRpb24gb3IgdXNpbmcgdGhlCisuSWMgIVwmIE5zIEFyIGNvbW1hbmQKK2VzY2FwZSBzZXF1ZW5jZSBpbgorLlhyIHNzaCAxIC4KK1RoZSBhcmd1bWVudCBtdXN0IGJlCisuRHEgeWVzCitvcgorLkRxIG5vIC4KK1RoZSBkZWZhdWx0IGlzCisuRHEgbm8gLgorLkl0IENtIFBLQ1MxMVByb3ZpZGVyCitTcGVjaWZpZXMgd2hpY2ggUEtDUyMxMSBwcm92aWRlciB0byB1c2UuCitUaGUgYXJndW1lbnQgdG8gdGhpcyBrZXl3b3JkIGlzIHRoZSBQS0NTIzExIHNoYXJlZCBsaWJyYXJ5CisuWHIgc3NoIDEKK3Nob3VsZCB1c2UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIFBLQ1MjMTEgdG9rZW4gcHJvdmlkaW5nIHRoZSB1c2VyJ3MKK3ByaXZhdGUgUlNBIGtleS4KKy5JdCBDbSBQb3J0CitTcGVjaWZpZXMgdGhlIHBvcnQgbnVtYmVyIHRvIGNvbm5lY3Qgb24gdGhlIHJlbW90ZSBob3N0LgorVGhlIGRlZmF1bHQgaXMgMjIuCisuSXQgQ20gUHJlZmVycmVkQXV0aGVudGljYXRpb25zCitTcGVjaWZpZXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBjbGllbnQgc2hvdWxkIHRyeSBwcm90b2NvbCAyCithdXRoZW50aWNhdGlvbiBtZXRob2RzLgorVGhpcyBhbGxvd3MgYSBjbGllbnQgdG8gcHJlZmVyIG9uZSBtZXRob2QgKGUuZy5cJgorLkNtIGtleWJvYXJkLWludGVyYWN0aXZlICkKK292ZXIgYW5vdGhlciBtZXRob2QgKGUuZy5cJgorLkNtIHBhc3N3b3JkICkgLgorVGhlIGRlZmF1bHQgaXM6CisuQmQgLWxpdGVyYWwgLW9mZnNldCBpbmRlbnQKK2dzc2FwaS13aXRoLW1pYyxob3N0YmFzZWQscHVibGlja2V5LAora2V5Ym9hcmQtaW50ZXJhY3RpdmUscGFzc3dvcmQKKy5FZAorLkl0IENtIFByb3RvY29sCitTcGVjaWZpZXMgdGhlIHByb3RvY29sIHZlcnNpb25zCisuWHIgc3NoIDEKK3Nob3VsZCBzdXBwb3J0IGluIG9yZGVyIG9mIHByZWZlcmVuY2UuCitUaGUgcG9zc2libGUgdmFsdWVzIGFyZQorLlNxIDEKK2FuZAorLlNxIDIgLgorTXVsdGlwbGUgdmVyc2lvbnMgbXVzdCBiZSBjb21tYS1zZXBhcmF0ZWQuCitXaGVuIHRoaXMgb3B0aW9uIGlzIHNldCB0bworLkRxIDIsMQorLk5tIHNzaAord2lsbCB0cnkgdmVyc2lvbiAyIGFuZCBmYWxsIGJhY2sgdG8gdmVyc2lvbiAxCitpZiB2ZXJzaW9uIDIgaXMgbm90IGF2YWlsYWJsZS4KK1RoZSBkZWZhdWx0IGlzCisuU3EgMiAuCisuSXQgQ20gUHJveHlDb21tYW5kCitTcGVjaWZpZXMgdGhlIGNvbW1hbmQgdG8gdXNlIHRvIGNvbm5lY3QgdG8gdGhlIHNlcnZlci4KK1RoZSBjb21tYW5kCitzdHJpbmcgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLCBhbmQgaXMgZXhlY3V0ZWQgd2l0aAordGhlIHVzZXIncyBzaGVsbC4KK0luIHRoZSBjb21tYW5kIHN0cmluZywgYW55IG9jY3VycmVuY2Ugb2YKKy5RbCAlaAord2lsbCBiZSBzdWJzdGl0dXRlZCBieSB0aGUgaG9zdCBuYW1lIHRvCitjb25uZWN0LAorLlFsICVwCitieSB0aGUgcG9ydCwgYW5kCisuUWwgJXIKK2J5IHRoZSByZW1vdGUgdXNlciBuYW1lLgorVGhlIGNvbW1hbmQgY2FuIGJlIGJhc2ljYWxseSBhbnl0aGluZywKK2FuZCBzaG91bGQgcmVhZCBmcm9tIGl0cyBzdGFuZGFyZCBpbnB1dCBhbmQgd3JpdGUgdG8gaXRzIHN0YW5kYXJkIG91dHB1dC4KK0l0IHNob3VsZCBldmVudHVhbGx5IGNvbm5lY3QgYW4KKy5YciBzc2hkIDgKK3NlcnZlciBydW5uaW5nIG9uIHNvbWUgbWFjaGluZSwgb3IgZXhlY3V0ZQorLkljIHNzaGQgLWkKK3NvbWV3aGVyZS4KK0hvc3Qga2V5IG1hbmFnZW1lbnQgd2lsbCBiZSBkb25lIHVzaW5nIHRoZQorSG9zdE5hbWUgb2YgdGhlIGhvc3QgYmVpbmcgY29ubmVjdGVkIChkZWZhdWx0aW5nIHRvIHRoZSBuYW1lIHR5cGVkIGJ5Cit0aGUgdXNlcikuCitTZXR0aW5nIHRoZSBjb21tYW5kIHRvCisuRHEgbm9uZQorZGlzYWJsZXMgdGhpcyBvcHRpb24gZW50aXJlbHkuCitOb3RlIHRoYXQKKy5DbSBDaGVja0hvc3RJUAoraXMgbm90IGF2YWlsYWJsZSBmb3IgY29ubmVjdHMgd2l0aCBhIHByb3h5IGNvbW1hbmQuCisuUHAKK1RoaXMgZGlyZWN0aXZlIGlzIHVzZWZ1bCBpbiBjb25qdW5jdGlvbiB3aXRoCisuWHIgbmMgMQorYW5kIGl0cyBwcm94eSBzdXBwb3J0LgorRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlIHdvdWxkIGNvbm5lY3QgdmlhIGFuIEhUVFAgcHJveHkgYXQKKzE5Mi4wLjIuMDoKKy5CZCAtbGl0ZXJhbCAtb2Zmc2V0IDNuCitQcm94eUNvbW1hbmQgL3Vzci9iaW4vbmMgLVggY29ubmVjdCAteCAxOTIuMC4yLjA6ODA4MCAlaCAlcAorLkVkCisuSXQgQ20gUHVia2V5QXV0aGVudGljYXRpb24KK1NwZWNpZmllcyB3aGV0aGVyIHRvIHRyeSBwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uLgorVGhlIGFyZ3VtZW50IHRvIHRoaXMga2V5d29yZCBtdXN0IGJlCisuRHEgeWVzCitvcgorLkRxIG5vIC4KK1RoZSBkZWZhdWx0IGlzCisuRHEgeWVzIC4KK1RoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAyIG9ubHkuCisuSXQgQ20gUmVrZXlMaW1pdAorU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBkYXRhIHRoYXQgbWF5IGJlIHRyYW5zbWl0dGVkIGJlZm9yZSB0aGUKK3Nlc3Npb24ga2V5IGlzIHJlbmVnb3RpYXRlZC4KK1RoZSBhcmd1bWVudCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzLCB3aXRoIGFuIG9wdGlvbmFsIHN1ZmZpeCBvZgorLlNxIEsgLAorLlNxIE0gLAorb3IKKy5TcSBHCit0byBpbmRpY2F0ZSBLaWxvYnl0ZXMsIE1lZ2FieXRlcywgb3IgR2lnYWJ5dGVzLCByZXNwZWN0aXZlbHkuCitUaGUgZGVmYXVsdCBpcyBiZXR3ZWVuCisuU3EgMUcKK2FuZAorLlNxIDRHICwKK2RlcGVuZGluZyBvbiB0aGUgY2lwaGVyLgorVGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDIgb25seS4KKy5JdCBDbSBSZW1vdGVGb3J3YXJkCitTcGVjaWZpZXMgdGhhdCBhIFRDUCBwb3J0IG9uIHRoZSByZW1vdGUgbWFjaGluZSBiZSBmb3J3YXJkZWQgb3ZlcgordGhlIHNlY3VyZSBjaGFubmVsIHRvIHRoZSBzcGVjaWZpZWQgaG9zdCBhbmQgcG9ydCBmcm9tIHRoZSBsb2NhbCBtYWNoaW5lLgorVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUKKy5TbSBvZmYKKy5PbyBBciBiaW5kX2FkZHJlc3MgOiBPYyBBciBwb3J0CisuU20gb24KK2FuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IG11c3QgYmUKKy5BciBob3N0IDogTnMgQXIgaG9zdHBvcnQgLgorSVB2NiBhZGRyZXNzZXMgY2FuIGJlIHNwZWNpZmllZCBieSBlbmNsb3NpbmcgYWRkcmVzc2VzIGluIHNxdWFyZSBicmFja2V0cy4KK011bHRpcGxlIGZvcndhcmRpbmdzIG1heSBiZSBzcGVjaWZpZWQsIGFuZCBhZGRpdGlvbmFsCitmb3J3YXJkaW5ncyBjYW4gYmUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KK1ByaXZpbGVnZWQgcG9ydHMgY2FuIGJlIGZvcndhcmRlZCBvbmx5IHdoZW4KK2xvZ2dpbmcgaW4gYXMgcm9vdCBvbiB0aGUgcmVtb3RlIG1hY2hpbmUuCisuUHAKK0lmIHRoZQorLkFyIHBvcnQKK2FyZ3VtZW50IGlzCisuUWwgMCAsCit0aGUgbGlzdGVuIHBvcnQgd2lsbCBiZSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgb24gdGhlIHNlcnZlciBhbmQgcmVwb3J0ZWQKK3RvIHRoZSBjbGllbnQgYXQgcnVuIHRpbWUuCisuUHAKK0lmIHRoZQorLkFyIGJpbmRfYWRkcmVzcworaXMgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgaXMgdG8gb25seSBiaW5kIHRvIGxvb3BiYWNrIGFkZHJlc3Nlcy4KK0lmIHRoZQorLkFyIGJpbmRfYWRkcmVzcworaXMKKy5RbCAqCitvciBhbiBlbXB0eSBzdHJpbmcsIHRoZW4gdGhlIGZvcndhcmRpbmcgaXMgcmVxdWVzdGVkIHRvIGxpc3RlbiBvbiBhbGwKK2ludGVyZmFjZXMuCitTcGVjaWZ5aW5nIGEgcmVtb3RlCisuQXIgYmluZF9hZGRyZXNzCit3aWxsIG9ubHkgc3VjY2VlZCBpZiB0aGUgc2VydmVyJ3MKKy5DbSBHYXRld2F5UG9ydHMKK29wdGlvbiBpcyBlbmFibGVkIChzZWUKKy5YciBzc2hkX2NvbmZpZyA1ICkgLgorLkl0IENtIFJlcXVlc3RUVFkKK1NwZWNpZmllcyB3aGV0aGVyIHRvIHJlcXVlc3QgYSBwc2V1ZG8tdHR5IGZvciB0aGUgc2Vzc2lvbi4KK1RoZSBhcmd1bWVudCBtYXkgYmUgb25lIG9mOgorLkRxIG5vCisobmV2ZXIgcmVxdWVzdCBhIFRUWSksCisuRHEgeWVzCisoYWx3YXlzIHJlcXVlc3QgYSBUVFkgd2hlbiBzdGFuZGFyZCBpbnB1dCBpcyBhIFRUWSksCisuRHEgZm9yY2UKKyhhbHdheXMgcmVxdWVzdCBhIFRUWSkgb3IKKy5EcSBhdXRvCisocmVxdWVzdCBhIFRUWSB3aGVuIG9wZW5pbmcgYSBsb2dpbiBzZXNzaW9uKS4KK1RoaXMgb3B0aW9uIG1pcnJvcnMgdGhlCisuRmwgdAorYW5kCisuRmwgVAorZmxhZ3MgZm9yCisuWHIgc3NoIDEgLgorLkl0IENtIFJob3N0c1JTQUF1dGhlbnRpY2F0aW9uCitTcGVjaWZpZXMgd2hldGhlciB0byB0cnkgcmhvc3RzIGJhc2VkIGF1dGhlbnRpY2F0aW9uIHdpdGggUlNBIGhvc3QKK2F1dGhlbnRpY2F0aW9uLgorVGhlIGFyZ3VtZW50IG11c3QgYmUKKy5EcSB5ZXMKK29yCisuRHEgbm8gLgorVGhlIGRlZmF1bHQgaXMKKy5EcSBubyAuCitUaGlzIG9wdGlvbiBhcHBsaWVzIHRvIHByb3RvY29sIHZlcnNpb24gMSBvbmx5IGFuZCByZXF1aXJlcworLlhyIHNzaCAxCit0byBiZSBzZXR1aWQgcm9vdC4KKy5JdCBDbSBSU0FBdXRoZW50aWNhdGlvbgorU3BlY2lmaWVzIHdoZXRoZXIgdG8gdHJ5IFJTQSBhdXRoZW50aWNhdGlvbi4KK1RoZSBhcmd1bWVudCB0byB0aGlzIGtleXdvcmQgbXVzdCBiZQorLkRxIHllcworb3IKKy5EcSBubyAuCitSU0EgYXV0aGVudGljYXRpb24gd2lsbCBvbmx5IGJlCithdHRlbXB0ZWQgaWYgdGhlIGlkZW50aXR5IGZpbGUgZXhpc3RzLCBvciBhbiBhdXRoZW50aWNhdGlvbiBhZ2VudCBpcworcnVubmluZy4KK1RoZSBkZWZhdWx0IGlzCisuRHEgeWVzIC4KK05vdGUgdGhhdCB0aGlzIG9wdGlvbiBhcHBsaWVzIHRvIHByb3RvY29sIHZlcnNpb24gMSBvbmx5LgorLkl0IENtIFNlbmRFbnYKK1NwZWNpZmllcyB3aGF0IHZhcmlhYmxlcyBmcm9tIHRoZSBsb2NhbAorLlhyIGVudmlyb24gNworc2hvdWxkIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4KK05vdGUgdGhhdCBlbnZpcm9ubWVudCBwYXNzaW5nIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBwcm90b2NvbCAyLgorVGhlIHNlcnZlciBtdXN0IGFsc28gc3VwcG9ydCBpdCwgYW5kIHRoZSBzZXJ2ZXIgbXVzdCBiZSBjb25maWd1cmVkIHRvCithY2NlcHQgdGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorUmVmZXIgdG8KKy5DbSBBY2NlcHRFbnYKK2luCisuWHIgc3NoZF9jb25maWcgNQorZm9yIGhvdyB0byBjb25maWd1cmUgdGhlIHNlcnZlci4KK1ZhcmlhYmxlcyBhcmUgc3BlY2lmaWVkIGJ5IG5hbWUsIHdoaWNoIG1heSBjb250YWluIHdpbGRjYXJkIGNoYXJhY3RlcnMuCitNdWx0aXBsZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbWF5IGJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIG9yIHNwcmVhZAorYWNyb3NzIG11bHRpcGxlCisuQ20gU2VuZEVudgorZGlyZWN0aXZlcy4KK1RoZSBkZWZhdWx0IGlzIG5vdCB0byBzZW5kIGFueSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisuUHAKK1NlZQorLlN4IFBBVFRFUk5TCitmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwYXR0ZXJucy4KKy5JdCBDbSBTZXJ2ZXJBbGl2ZUNvdW50TWF4CitTZXRzIHRoZSBudW1iZXIgb2Ygc2VydmVyIGFsaXZlIG1lc3NhZ2VzIChzZWUgYmVsb3cpIHdoaWNoIG1heSBiZQorc2VudCB3aXRob3V0CisuWHIgc3NoIDEKK3JlY2VpdmluZyBhbnkgbWVzc2FnZXMgYmFjayBmcm9tIHRoZSBzZXJ2ZXIuCitJZiB0aGlzIHRocmVzaG9sZCBpcyByZWFjaGVkIHdoaWxlIHNlcnZlciBhbGl2ZSBtZXNzYWdlcyBhcmUgYmVpbmcgc2VudCwKK3NzaCB3aWxsIGRpc2Nvbm5lY3QgZnJvbSB0aGUgc2VydmVyLCB0ZXJtaW5hdGluZyB0aGUgc2Vzc2lvbi4KK0l0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIHVzZSBvZiBzZXJ2ZXIgYWxpdmUgbWVzc2FnZXMgaXMgdmVyeQorZGlmZmVyZW50IGZyb20KKy5DbSBUQ1BLZWVwQWxpdmUKKyhiZWxvdykuCitUaGUgc2VydmVyIGFsaXZlIG1lc3NhZ2VzIGFyZSBzZW50IHRocm91Z2ggdGhlIGVuY3J5cHRlZCBjaGFubmVsCithbmQgdGhlcmVmb3JlIHdpbGwgbm90IGJlIHNwb29mYWJsZS4KK1RoZSBUQ1Aga2VlcGFsaXZlIG9wdGlvbiBlbmFibGVkIGJ5CisuQ20gVENQS2VlcEFsaXZlCitpcyBzcG9vZmFibGUuCitUaGUgc2VydmVyIGFsaXZlIG1lY2hhbmlzbSBpcyB2YWx1YWJsZSB3aGVuIHRoZSBjbGllbnQgb3IKK3NlcnZlciBkZXBlbmQgb24ga25vd2luZyB3aGVuIGEgY29ubmVjdGlvbiBoYXMgYmVjb21lIGluYWN0aXZlLgorLlBwCitUaGUgZGVmYXVsdCB2YWx1ZSBpcyAzLgorSWYsIGZvciBleGFtcGxlLAorLkNtIFNlcnZlckFsaXZlSW50ZXJ2YWwKKyhzZWUgYmVsb3cpIGlzIHNldCB0byAxNSBhbmQKKy5DbSBTZXJ2ZXJBbGl2ZUNvdW50TWF4CitpcyBsZWZ0IGF0IHRoZSBkZWZhdWx0LCBpZiB0aGUgc2VydmVyIGJlY29tZXMgdW5yZXNwb25zaXZlLAorc3NoIHdpbGwgZGlzY29ubmVjdCBhZnRlciBhcHByb3hpbWF0ZWx5IDQ1IHNlY29uZHMuCitUaGlzIG9wdGlvbiBhcHBsaWVzIHRvIHByb3RvY29sIHZlcnNpb24gMiBvbmx5LgorLkl0IENtIFNlcnZlckFsaXZlSW50ZXJ2YWwKK1NldHMgYSB0aW1lb3V0IGludGVydmFsIGluIHNlY29uZHMgYWZ0ZXIgd2hpY2ggaWYgbm8gZGF0YSBoYXMgYmVlbiByZWNlaXZlZAorZnJvbSB0aGUgc2VydmVyLAorLlhyIHNzaCAxCit3aWxsIHNlbmQgYSBtZXNzYWdlIHRocm91Z2ggdGhlIGVuY3J5cHRlZAorY2hhbm5lbCB0byByZXF1ZXN0IGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLgorVGhlIGRlZmF1bHQKK2lzIDAsIGluZGljYXRpbmcgdGhhdCB0aGVzZSBtZXNzYWdlcyB3aWxsIG5vdCBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIuCitUaGlzIG9wdGlvbiBhcHBsaWVzIHRvIHByb3RvY29sIHZlcnNpb24gMiBvbmx5LgorLkl0IENtIFN0cmljdEhvc3RLZXlDaGVja2luZworSWYgdGhpcyBmbGFnIGlzIHNldCB0bworLkRxIHllcyAsCisuWHIgc3NoIDEKK3dpbGwgbmV2ZXIgYXV0b21hdGljYWxseSBhZGQgaG9zdCBrZXlzIHRvIHRoZQorLlBhIH4vLnNzaC9rbm93bl9ob3N0cworZmlsZSwgYW5kIHJlZnVzZXMgdG8gY29ubmVjdCB0byBob3N0cyB3aG9zZSBob3N0IGtleSBoYXMgY2hhbmdlZC4KK1RoaXMgcHJvdmlkZXMgbWF4aW11bSBwcm90ZWN0aW9uIGFnYWluc3QgdHJvamFuIGhvcnNlIGF0dGFja3MsCit0aG91Z2ggaXQgY2FuIGJlIGFubm95aW5nIHdoZW4gdGhlCisuUGEgL2V0Yy9zc2gvc3NoX2tub3duX2hvc3RzCitmaWxlIGlzIHBvb3JseSBtYWludGFpbmVkIG9yIHdoZW4gY29ubmVjdGlvbnMgdG8gbmV3IGhvc3RzIGFyZQorZnJlcXVlbnRseSBtYWRlLgorVGhpcyBvcHRpb24gZm9yY2VzIHRoZSB1c2VyIHRvIG1hbnVhbGx5CithZGQgYWxsIG5ldyBob3N0cy4KK0lmIHRoaXMgZmxhZyBpcyBzZXQgdG8KKy5EcSBubyAsCitzc2ggd2lsbCBhdXRvbWF0aWNhbGx5IGFkZCBuZXcgaG9zdCBrZXlzIHRvIHRoZQordXNlciBrbm93biBob3N0cyBmaWxlcy4KK0lmIHRoaXMgZmxhZyBpcyBzZXQgdG8KKy5EcSBhc2sgLAorbmV3IGhvc3Qga2V5cword2lsbCBiZSBhZGRlZCB0byB0aGUgdXNlciBrbm93biBob3N0IGZpbGVzIG9ubHkgYWZ0ZXIgdGhlIHVzZXIKK2hhcyBjb25maXJtZWQgdGhhdCBpcyB3aGF0IHRoZXkgcmVhbGx5IHdhbnQgdG8gZG8sIGFuZAorc3NoIHdpbGwgcmVmdXNlIHRvIGNvbm5lY3QgdG8gaG9zdHMgd2hvc2UgaG9zdCBrZXkgaGFzIGNoYW5nZWQuCitUaGUgaG9zdCBrZXlzIG9mCitrbm93biBob3N0cyB3aWxsIGJlIHZlcmlmaWVkIGF1dG9tYXRpY2FsbHkgaW4gYWxsIGNhc2VzLgorVGhlIGFyZ3VtZW50IG11c3QgYmUKKy5EcSB5ZXMgLAorLkRxIG5vICwKK29yCisuRHEgYXNrIC4KK1RoZSBkZWZhdWx0IGlzCisuRHEgYXNrIC4KKy5JdCBDbSBUQ1BLZWVwQWxpdmUKK1NwZWNpZmllcyB3aGV0aGVyIHRoZSBzeXN0ZW0gc2hvdWxkIHNlbmQgVENQIGtlZXBhbGl2ZSBtZXNzYWdlcyB0byB0aGUKK290aGVyIHNpZGUuCitJZiB0aGV5IGFyZSBzZW50LCBkZWF0aCBvZiB0aGUgY29ubmVjdGlvbiBvciBjcmFzaCBvZiBvbmUKK29mIHRoZSBtYWNoaW5lcyB3aWxsIGJlIHByb3Blcmx5IG5vdGljZWQuCitIb3dldmVyLCB0aGlzIG1lYW5zIHRoYXQKK2Nvbm5lY3Rpb25zIHdpbGwgZGllIGlmIHRoZSByb3V0ZSBpcyBkb3duIHRlbXBvcmFyaWx5LCBhbmQgc29tZSBwZW9wbGUKK2ZpbmQgaXQgYW5ub3lpbmcuCisuUHAKK1RoZSBkZWZhdWx0IGlzCisuRHEgeWVzCisodG8gc2VuZCBUQ1Aga2VlcGFsaXZlIG1lc3NhZ2VzKSwgYW5kIHRoZSBjbGllbnQgd2lsbCBub3RpY2UKK2lmIHRoZSBuZXR3b3JrIGdvZXMgZG93biBvciB0aGUgcmVtb3RlIGhvc3QgZGllcy4KK1RoaXMgaXMgaW1wb3J0YW50IGluIHNjcmlwdHMsIGFuZCBtYW55IHVzZXJzIHdhbnQgaXQgdG9vLgorLlBwCitUbyBkaXNhYmxlIFRDUCBrZWVwYWxpdmUgbWVzc2FnZXMsIHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvCisuRHEgbm8gLgorLkl0IENtIFR1bm5lbAorUmVxdWVzdAorLlhyIHR1biA0CitkZXZpY2UgZm9yd2FyZGluZyBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCitUaGUgYXJndW1lbnQgbXVzdCBiZQorLkRxIHllcyAsCisuRHEgcG9pbnQtdG8tcG9pbnQKKyhsYXllciAzKSwKKy5EcSBldGhlcm5ldAorKGxheWVyIDIpLAorb3IKKy5EcSBubyAuCitTcGVjaWZ5aW5nCisuRHEgeWVzCityZXF1ZXN0cyB0aGUgZGVmYXVsdCB0dW5uZWwgbW9kZSwgd2hpY2ggaXMKKy5EcSBwb2ludC10by1wb2ludCAuCitUaGUgZGVmYXVsdCBpcworLkRxIG5vIC4KKy5JdCBDbSBUdW5uZWxEZXZpY2UKK1NwZWNpZmllcyB0aGUKKy5YciB0dW4gNAorZGV2aWNlcyB0byBvcGVuIG9uIHRoZSBjbGllbnQKKy5QcSBBciBsb2NhbF90dW4KK2FuZCB0aGUgc2VydmVyCisuUHEgQXIgcmVtb3RlX3R1biAuCisuUHAKK1RoZSBhcmd1bWVudCBtdXN0IGJlCisuU20gb2ZmCisuQXIgbG9jYWxfdHVuIE9wIDogQXIgcmVtb3RlX3R1biAuCisuU20gb24KK1RoZSBkZXZpY2VzIG1heSBiZSBzcGVjaWZpZWQgYnkgbnVtZXJpY2FsIElEIG9yIHRoZSBrZXl3b3JkCisuRHEgYW55ICwKK3doaWNoIHVzZXMgdGhlIG5leHQgYXZhaWxhYmxlIHR1bm5lbCBkZXZpY2UuCitJZgorLkFyIHJlbW90ZV90dW4KK2lzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvCisuRHEgYW55IC4KK1RoZSBkZWZhdWx0IGlzCisuRHEgYW55OmFueSAuCisuSXQgQ20gVXNlUHJpdmlsZWdlZFBvcnQKK1NwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBhIHByaXZpbGVnZWQgcG9ydCBmb3Igb3V0Z29pbmcgY29ubmVjdGlvbnMuCitUaGUgYXJndW1lbnQgbXVzdCBiZQorLkRxIHllcworb3IKKy5EcSBubyAuCitUaGUgZGVmYXVsdCBpcworLkRxIG5vIC4KK0lmIHNldCB0bworLkRxIHllcyAsCisuWHIgc3NoIDEKK211c3QgYmUgc2V0dWlkIHJvb3QuCitOb3RlIHRoYXQgdGhpcyBvcHRpb24gbXVzdCBiZSBzZXQgdG8KKy5EcSB5ZXMKK2ZvcgorLkNtIFJob3N0c1JTQUF1dGhlbnRpY2F0aW9uCit3aXRoIG9sZGVyIHNlcnZlcnMuCisuSXQgQ20gVXNlcgorU3BlY2lmaWVzIHRoZSB1c2VyIHRvIGxvZyBpbiBhcy4KK1RoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIGEgZGlmZmVyZW50IHVzZXIgbmFtZSBpcyB1c2VkIG9uIGRpZmZlcmVudCBtYWNoaW5lcy4KK1RoaXMgc2F2ZXMgdGhlIHRyb3VibGUgb2YKK2hhdmluZyB0byByZW1lbWJlciB0byBnaXZlIHRoZSB1c2VyIG5hbWUgb24gdGhlIGNvbW1hbmQgbGluZS4KKy5JdCBDbSBVc2VyS25vd25Ib3N0c0ZpbGUKK1NwZWNpZmllcyBvbmUgb3IgbW9yZSBmaWxlcyB0byB1c2UgZm9yIHRoZSB1c2VyCitob3N0IGtleSBkYXRhYmFzZSwgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuCitUaGUgZGVmYXVsdCBpcworLlBhIH4vLnNzaC9rbm93bl9ob3N0cyAsCisuUGEgfi8uc3NoL2tub3duX2hvc3RzMiAuCisuSXQgQ20gVmVyaWZ5SG9zdEtleUROUworU3BlY2lmaWVzIHdoZXRoZXIgdG8gdmVyaWZ5IHRoZSByZW1vdGUga2V5IHVzaW5nIEROUyBhbmQgU1NIRlAgcmVzb3VyY2UKK3JlY29yZHMuCitJZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8KKy5EcSB5ZXMgLAordGhlIGNsaWVudCB3aWxsIGltcGxpY2l0bHkgdHJ1c3Qga2V5cyB0aGF0IG1hdGNoIGEgc2VjdXJlIGZpbmdlcnByaW50Citmcm9tIEROUy4KK0luc2VjdXJlIGZpbmdlcnByaW50cyB3aWxsIGJlIGhhbmRsZWQgYXMgaWYgdGhpcyBvcHRpb24gd2FzIHNldCB0bworLkRxIGFzayAuCitJZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8KKy5EcSBhc2sgLAoraW5mb3JtYXRpb24gb24gZmluZ2VycHJpbnQgbWF0Y2ggd2lsbCBiZSBkaXNwbGF5ZWQsIGJ1dCB0aGUgdXNlciB3aWxsIHN0aWxsCituZWVkIHRvIGNvbmZpcm0gbmV3IGhvc3Qga2V5cyBhY2NvcmRpbmcgdG8gdGhlCisuQ20gU3RyaWN0SG9zdEtleUNoZWNraW5nCitvcHRpb24uCitUaGUgYXJndW1lbnQgbXVzdCBiZQorLkRxIHllcyAsCisuRHEgbm8gLAorb3IKKy5EcSBhc2sgLgorVGhlIGRlZmF1bHQgaXMKKy5EcSBubyAuCitOb3RlIHRoYXQgdGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDIgb25seS4KKy5QcAorU2VlIGFsc28KKy5TeCBWRVJJRllJTkcgSE9TVCBLRVlTCitpbgorLlhyIHNzaCAxIC4KKy5JdCBDbSBWaXN1YWxIb3N0S2V5CitJZiB0aGlzIGZsYWcgaXMgc2V0IHRvCisuRHEgeWVzICwKK2FuIEFTQ0lJIGFydCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVtb3RlIGhvc3Qga2V5IGZpbmdlcnByaW50IGlzCitwcmludGVkIGluIGFkZGl0aW9uIHRvIHRoZSBoZXggZmluZ2VycHJpbnQgc3RyaW5nIGF0IGxvZ2luIGFuZAorZm9yIHVua25vd24gaG9zdCBrZXlzLgorSWYgdGhpcyBmbGFnIGlzIHNldCB0bworLkRxIG5vICwKK25vIGZpbmdlcnByaW50IHN0cmluZ3MgYXJlIHByaW50ZWQgYXQgbG9naW4gYW5kCitvbmx5IHRoZSBoZXggZmluZ2VycHJpbnQgc3RyaW5nIHdpbGwgYmUgcHJpbnRlZCBmb3IgdW5rbm93biBob3N0IGtleXMuCitUaGUgZGVmYXVsdCBpcworLkRxIG5vIC4KKy5JdCBDbSBYQXV0aExvY2F0aW9uCitTcGVjaWZpZXMgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlCisuWHIgeGF1dGggMQorcHJvZ3JhbS4KK1RoZSBkZWZhdWx0IGlzCisuUGEgL3Vzci9YMTFSNi9iaW4veGF1dGggLgorLkVsCisuU2ggUEFUVEVSTlMKK0EKKy5FbSBwYXR0ZXJuCitjb25zaXN0cyBvZiB6ZXJvIG9yIG1vcmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycywKKy5TcSAqCisoYSB3aWxkY2FyZCB0aGF0IG1hdGNoZXMgemVybyBvciBtb3JlIGNoYXJhY3RlcnMpLAorb3IKKy5TcSA/XCYKKyhhIHdpbGRjYXJkIHRoYXQgbWF0Y2hlcyBleGFjdGx5IG9uZSBjaGFyYWN0ZXIpLgorRm9yIGV4YW1wbGUsIHRvIHNwZWNpZnkgYSBzZXQgb2YgZGVjbGFyYXRpb25zIGZvciBhbnkgaG9zdCBpbiB0aGUKKy5EcSAuY28udWsKK3NldCBvZiBkb21haW5zLAordGhlIGZvbGxvd2luZyBwYXR0ZXJuIGNvdWxkIGJlIHVzZWQ6CisuUHAKKy5EbCBIb3N0ICouY28udWsKKy5QcAorVGhlIGZvbGxvd2luZyBwYXR0ZXJuCit3b3VsZCBtYXRjaCBhbnkgaG9zdCBpbiB0aGUgMTkyLjE2OC4wLlswLTldIG5ldHdvcmsgcmFuZ2U6CisuUHAKKy5EbCBIb3N0IDE5Mi4xNjguMC4/CisuUHAKK0EKKy5FbSBwYXR0ZXJuLWxpc3QKK2lzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMuCitQYXR0ZXJucyB3aXRoaW4gcGF0dGVybi1saXN0cyBtYXkgYmUgbmVnYXRlZAorYnkgcHJlY2VkaW5nIHRoZW0gd2l0aCBhbiBleGNsYW1hdGlvbiBtYXJrCisuUHEgU3EgIVwmIC4KK0ZvciBleGFtcGxlLAordG8gYWxsb3cgYSBrZXkgdG8gYmUgdXNlZCBmcm9tIGFueXdoZXJlIHdpdGhpbiBhbiBvcmdhbmlzYXRpb24KK2V4Y2VwdCBmcm9tIHRoZQorLkRxIGRpYWx1cAorcG9vbCwKK3RoZSBmb2xsb3dpbmcgZW50cnkgKGluIGF1dGhvcml6ZWRfa2V5cykgY291bGQgYmUgdXNlZDoKKy5QcAorLkRsIGZyb209XCYiISouZGlhbHVwLmV4YW1wbGUuY29tLCouZXhhbXBsZS5jb21cJiIKKy5TaCBGSUxFUworLkJsIC10YWcgLXdpZHRoIERzCisuSXQgUGEgfi8uc3NoL2NvbmZpZworVGhpcyBpcyB0aGUgcGVyLXVzZXIgY29uZmlndXJhdGlvbiBmaWxlLgorVGhlIGZvcm1hdCBvZiB0aGlzIGZpbGUgaXMgZGVzY3JpYmVkIGFib3ZlLgorVGhpcyBmaWxlIGlzIHVzZWQgYnkgdGhlIFNTSCBjbGllbnQuCitCZWNhdXNlIG9mIHRoZSBwb3RlbnRpYWwgZm9yIGFidXNlLCB0aGlzIGZpbGUgbXVzdCBoYXZlIHN0cmljdCBwZXJtaXNzaW9uczoKK3JlYWQvd3JpdGUgZm9yIHRoZSB1c2VyLCBhbmQgbm90IGFjY2Vzc2libGUgYnkgb3RoZXJzLgorLkl0IFBhIC9ldGMvc3NoL3NzaF9jb25maWcKK1N5c3RlbXdpZGUgY29uZmlndXJhdGlvbiBmaWxlLgorVGhpcyBmaWxlIHByb3ZpZGVzIGRlZmF1bHRzIGZvciB0aG9zZQordmFsdWVzIHRoYXQgYXJlIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHVzZXIncyBjb25maWd1cmF0aW9uIGZpbGUsIGFuZAorZm9yIHRob3NlIHVzZXJzIHdobyBkbyBub3QgaGF2ZSBhIGNvbmZpZ3VyYXRpb24gZmlsZS4KK1RoaXMgZmlsZSBtdXN0IGJlIHdvcmxkLXJlYWRhYmxlLgorLkVsCisuU2ggU0VFIEFMU08KKy5YciBzc2ggMQorLlNoIEFVVEhPUlMKK09wZW5TU0ggaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBhbmQgZnJlZQorc3NoIDEuMi4xMiByZWxlYXNlIGJ5IFRhdHUgWWxvbmVuLgorQWFyb24gQ2FtcGJlbGwsIEJvYiBCZWNrLCBNYXJrdXMgRnJpZWRsLCBOaWVscyBQcm92b3MsCitUaGVvIGRlIFJhYWR0IGFuZCBEdWcgU29uZworcmVtb3ZlZCBtYW55IGJ1Z3MsIHJlLWFkZGVkIG5ld2VyIGZlYXR1cmVzIGFuZAorY3JlYXRlZCBPcGVuU1NILgorTWFya3VzIEZyaWVkbCBjb250cmlidXRlZCB0aGUgc3VwcG9ydCBmb3IgU1NICitwcm90b2NvbCB2ZXJzaW9ucyAxLjUgYW5kIDIuMC4KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc3NoY29ubmVjdC5jIGIvb3BlbnNzaC02LjBwMS9zc2hjb25uZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlNzI2NgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc3NoY29ubmVjdC5jCkBAIC0wLDAgKzEsMTI5MSBAQAorLyogJE9wZW5CU0Q6IHNzaGNvbm5lY3QuYyx2IDEuMjM0IDIwMTEvMDUvMjQgMDc6MTU6NDcgZGptIEV4cCAkICovCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICogQ29kZSB0byBjb25uZWN0IHRvIGEgcmVtb3RlIGhvc3QsIGFuZCB0byBwZXJmb3JtIHRoZSBjbGllbnQgc2lkZSBvZiB0aGUKKyAqIGxvZ2luIChhdXRoZW50aWNhdGlvbikgZGlhbG9nLgorICoKKyAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKKyAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCisgKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCisgKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCisgKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorIyBpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2lmZGVmIEhBVkVfUEFUSFNfSAorI2luY2x1ZGUgPHBhdGhzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgImhvc3RmaWxlLmgiCisjaW5jbHVkZSAic3NoLmgiCisjaW5jbHVkZSAicnNhLmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAicGFja2V0LmgiCisjaW5jbHVkZSAidWlkc3dhcC5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgInNzaGNvbm5lY3QuaCIKKyNpbmNsdWRlICJob3N0ZmlsZS5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInJlYWRjb25mLmgiCisjaW5jbHVkZSAiYXRvbWljaW8uaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAiZG5zLmgiCisjaW5jbHVkZSAicm9hbWluZy5oIgorI2luY2x1ZGUgInNzaDIuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKK2NoYXIgKmNsaWVudF92ZXJzaW9uX3N0cmluZyA9IE5VTEw7CitjaGFyICpzZXJ2ZXJfdmVyc2lvbl9zdHJpbmcgPSBOVUxMOworCitzdGF0aWMgaW50IG1hdGNoaW5nX2hvc3Rfa2V5X2RucyA9IDA7CisKK3N0YXRpYyBwaWRfdCBwcm94eV9jb21tYW5kX3BpZCA9IDA7CisKKy8qIGltcG9ydCAqLworZXh0ZXJuIE9wdGlvbnMgb3B0aW9uczsKK2V4dGVybiBjaGFyICpfX3Byb2duYW1lOworZXh0ZXJuIHVpZF90IG9yaWdpbmFsX3JlYWxfdWlkOworZXh0ZXJuIHVpZF90IG9yaWdpbmFsX2VmZmVjdGl2ZV91aWQ7CisKK3N0YXRpYyBpbnQgc2hvd19vdGhlcl9rZXlzKHN0cnVjdCBob3N0a2V5cyAqLCBLZXkgKik7CitzdGF0aWMgdm9pZCB3YXJuX2NoYW5nZWRfa2V5KEtleSAqKTsKKworLyoKKyAqIENvbm5lY3QgdG8gdGhlIGdpdmVuIHNzaCBzZXJ2ZXIgdXNpbmcgYSBwcm94eSBjb21tYW5kLgorICovCitzdGF0aWMgaW50Citzc2hfcHJveHlfY29ubmVjdChjb25zdCBjaGFyICpob3N0LCB1X3Nob3J0IHBvcnQsIGNvbnN0IGNoYXIgKnByb3h5X2NvbW1hbmQpCit7CisJY2hhciAqY29tbWFuZF9zdHJpbmcsICp0bXA7CisJaW50IHBpblsyXSwgcG91dFsyXTsKKwlwaWRfdCBwaWQ7CisJY2hhciAqc2hlbGwsIHN0cnBvcnRbTklfTUFYU0VSVl07CisKKwlpZiAoKHNoZWxsID0gZ2V0ZW52KCJTSEVMTCIpKSA9PSBOVUxMIHx8ICpzaGVsbCA9PSAnXDAnKQorCQlzaGVsbCA9IF9QQVRIX0JTSEVMTDsKKworCS8qIENvbnZlcnQgdGhlIHBvcnQgbnVtYmVyIGludG8gYSBzdHJpbmcuICovCisJc25wcmludGYoc3RycG9ydCwgc2l6ZW9mIHN0cnBvcnQsICIlaHUiLCBwb3J0KTsKKworCS8qCisJICogQnVpbGQgdGhlIGZpbmFsIGNvbW1hbmQgc3RyaW5nIGluIHRoZSBidWZmZXIgYnkgbWFraW5nIHRoZQorCSAqIGFwcHJvcHJpYXRlIHN1YnN0aXR1dGlvbnMgdG8gdGhlIGdpdmVuIHByb3h5IGNvbW1hbmQuCisJICoKKwkgKiBVc2UgImV4ZWMiIHRvIGF2b2lkICJzaCAtYyIgcHJvY2Vzc2VzIG9uIHNvbWUgcGxhdGZvcm1zCisJICogKGUuZy4gU29sYXJpcykKKwkgKi8KKwl4YXNwcmludGYoJnRtcCwgImV4ZWMgJXMiLCBwcm94eV9jb21tYW5kKTsKKwljb21tYW5kX3N0cmluZyA9IHBlcmNlbnRfZXhwYW5kKHRtcCwgImgiLCBob3N0LCAicCIsIHN0cnBvcnQsCisJICAgICJyIiwgb3B0aW9ucy51c2VyLCAoY2hhciAqKU5VTEwpOworCXhmcmVlKHRtcCk7CisKKwkvKiBDcmVhdGUgcGlwZXMgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgcHJveHkuICovCisJaWYgKHBpcGUocGluKSA8IDAgfHwgcGlwZShwb3V0KSA8IDApCisJCWZhdGFsKCJDb3VsZCBub3QgY3JlYXRlIHBpcGVzIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHByb3h5OiAlLjEwMHMiLAorCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKworCWRlYnVnKCJFeGVjdXRpbmcgcHJveHkgY29tbWFuZDogJS41MDBzIiwgY29tbWFuZF9zdHJpbmcpOworCisJLyogRm9yayBhbmQgZXhlY3V0ZSB0aGUgcHJveHkgY29tbWFuZC4gKi8KKwlpZiAoKHBpZCA9IGZvcmsoKSkgPT0gMCkgeworCQljaGFyICphcmd2WzEwXTsKKworCQkvKiBDaGlsZC4gIFBlcm1hbmVudGx5IGdpdmUgdXAgc3VwZXJ1c2VyIHByaXZpbGVnZXMuICovCisJCXBlcm1hbmVudGx5X2Ryb3Bfc3VpZChvcmlnaW5hbF9yZWFsX3VpZCk7CisKKwkJLyogUmVkaXJlY3Qgc3RkaW4gYW5kIHN0ZG91dC4gKi8KKwkJY2xvc2UocGluWzFdKTsKKwkJaWYgKHBpblswXSAhPSAwKSB7CisJCQlpZiAoZHVwMihwaW5bMF0sIDApIDwgMCkKKwkJCQlwZXJyb3IoImR1cDIgc3RkaW4iKTsKKwkJCWNsb3NlKHBpblswXSk7CisJCX0KKwkJY2xvc2UocG91dFswXSk7CisJCWlmIChkdXAyKHBvdXRbMV0sIDEpIDwgMCkKKwkJCXBlcnJvcigiZHVwMiBzdGRvdXQiKTsKKwkJLyogQ2Fubm90IGJlIDEgYmVjYXVzZSBwaW4gYWxsb2NhdGVkIHR3byBkZXNjcmlwdG9ycy4gKi8KKwkJY2xvc2UocG91dFsxXSk7CisKKwkJLyogU3RkZXJyIGlzIGxlZnQgYXMgaXQgaXMgc28gdGhhdCBlcnJvciBtZXNzYWdlcyBnZXQKKwkJICAgcHJpbnRlZCBvbiB0aGUgdXNlcidzIHRlcm1pbmFsLiAqLworCQlhcmd2WzBdID0gc2hlbGw7CisJCWFyZ3ZbMV0gPSAiLWMiOworCQlhcmd2WzJdID0gY29tbWFuZF9zdHJpbmc7CisJCWFyZ3ZbM10gPSBOVUxMOworCisJCS8qIEV4ZWN1dGUgdGhlIHByb3h5IGNvbW1hbmQuICBOb3RlIHRoYXQgd2UgZ2F2ZSB1cCBhbnkKKwkJICAgZXh0cmEgcHJpdmlsZWdlcyBhYm92ZS4gKi8KKwkJc2lnbmFsKFNJR1BJUEUsIFNJR19ERkwpOworCQlleGVjdihhcmd2WzBdLCBhcmd2KTsKKwkJcGVycm9yKGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKwkvKiBQYXJlbnQuICovCisJaWYgKHBpZCA8IDApCisJCWZhdGFsKCJmb3JrIGZhaWxlZDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwllbHNlCisJCXByb3h5X2NvbW1hbmRfcGlkID0gcGlkOyAvKiBzYXZlIHBpZCB0byBjbGVhbiB1cCBsYXRlciAqLworCisJLyogQ2xvc2UgY2hpbGQgc2lkZSBvZiB0aGUgZGVzY3JpcHRvcnMuICovCisJY2xvc2UocGluWzBdKTsKKwljbG9zZShwb3V0WzFdKTsKKworCS8qIEZyZWUgdGhlIGNvbW1hbmQgbmFtZS4gKi8KKwl4ZnJlZShjb21tYW5kX3N0cmluZyk7CisKKwkvKiBTZXQgdGhlIGNvbm5lY3Rpb24gZmlsZSBkZXNjcmlwdG9ycy4gKi8KKwlwYWNrZXRfc2V0X2Nvbm5lY3Rpb24ocG91dFswXSwgcGluWzFdKTsKKwlwYWNrZXRfc2V0X3RpbWVvdXQob3B0aW9ucy5zZXJ2ZXJfYWxpdmVfaW50ZXJ2YWwsCisJICAgIG9wdGlvbnMuc2VydmVyX2FsaXZlX2NvdW50X21heCk7CisKKwkvKiBJbmRpY2F0ZSBPSyByZXR1cm4gKi8KKwlyZXR1cm4gMDsKK30KKwordm9pZAorc3NoX2tpbGxfcHJveHlfY29tbWFuZCh2b2lkKQoreworCS8qCisJICogU2VuZCBTSUdIVVAgdG8gcHJveHkgY29tbWFuZCBpZiB1c2VkLiBXZSBkb24ndCB3YWl0KCkgaW4KKwkgKiBjYXNlIGl0IGhhbmdzIGFuZCBpbnN0ZWFkIHJlbHkgb24gaW5pdCB0byByZWFwIHRoZSBjaGlsZAorCSAqLworCWlmIChwcm94eV9jb21tYW5kX3BpZCA+IDEpCisJCWtpbGwocHJveHlfY29tbWFuZF9waWQsIFNJR0hVUCk7Cit9CisKKy8qCisgKiBDcmVhdGVzIGEgKHBvc3NpYmx5IHByaXZpbGVnZWQpIHNvY2tldCBmb3IgdXNlIGFzIHRoZSBzc2ggY29ubmVjdGlvbi4KKyAqLworc3RhdGljIGludAorc3NoX2NyZWF0ZV9zb2NrZXQoaW50IHByaXZpbGVnZWQsIHN0cnVjdCBhZGRyaW5mbyAqYWkpCit7CisJaW50IHNvY2ssIGdhaWVycjsKKwlzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXM7CisKKwkvKgorCSAqIElmIHdlIGFyZSBydW5uaW5nIGFzIHJvb3QgYW5kIHdhbnQgdG8gY29ubmVjdCB0byBhIHByaXZpbGVnZWQKKwkgKiBwb3J0LCBiaW5kIG91ciBvd24gc29ja2V0IHRvIGEgcHJpdmlsZWdlZCBwb3J0LgorCSAqLworCWlmIChwcml2aWxlZ2VkKSB7CisJCWludCBwID0gSVBQT1JUX1JFU0VSVkVEIC0gMTsKKwkJUFJJVl9TVEFSVDsKKwkJc29jayA9IHJyZXN2cG9ydF9hZigmcCwgYWktPmFpX2ZhbWlseSk7CisJCVBSSVZfRU5EOworCQlpZiAoc29jayA8IDApCisJCQllcnJvcigicnJlc3Zwb3J0OiBhZj0lZCAlLjEwMHMiLCBhaS0+YWlfZmFtaWx5LAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCWVsc2UKKwkJCWRlYnVnKCJBbGxvY2F0ZWQgbG9jYWwgcG9ydCAlZC4iLCBwKTsKKwkJcmV0dXJuIHNvY2s7CisJfQorCXNvY2sgPSBzb2NrZXQoYWktPmFpX2ZhbWlseSwgYWktPmFpX3NvY2t0eXBlLCBhaS0+YWlfcHJvdG9jb2wpOworCWlmIChzb2NrIDwgMCkgeworCQllcnJvcigic29ja2V0OiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCWZjbnRsKHNvY2ssIEZfU0VURkQsIEZEX0NMT0VYRUMpOworCisJLyogQmluZCB0aGUgc29ja2V0IHRvIGFuIGFsdGVybmF0aXZlIGxvY2FsIElQIGFkZHJlc3MgKi8KKwlpZiAob3B0aW9ucy5iaW5kX2FkZHJlc3MgPT0gTlVMTCkKKwkJcmV0dXJuIHNvY2s7CisKKwltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKwloaW50cy5haV9mYW1pbHkgPSBhaS0+YWlfZmFtaWx5OworCWhpbnRzLmFpX3NvY2t0eXBlID0gYWktPmFpX3NvY2t0eXBlOworCWhpbnRzLmFpX3Byb3RvY29sID0gYWktPmFpX3Byb3RvY29sOworCWhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRTsKKwlnYWllcnIgPSBnZXRhZGRyaW5mbyhvcHRpb25zLmJpbmRfYWRkcmVzcywgTlVMTCwgJmhpbnRzLCAmcmVzKTsKKwlpZiAoZ2FpZXJyKSB7CisJCWVycm9yKCJnZXRhZGRyaW5mbzogJXM6ICVzIiwgb3B0aW9ucy5iaW5kX2FkZHJlc3MsCisJCSAgICBzc2hfZ2FpX3N0cmVycm9yKGdhaWVycikpOworCQljbG9zZShzb2NrKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoYmluZChzb2NrLCByZXMtPmFpX2FkZHIsIHJlcy0+YWlfYWRkcmxlbikgPCAwKSB7CisJCWVycm9yKCJiaW5kOiAlczogJXMiLCBvcHRpb25zLmJpbmRfYWRkcmVzcywgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2Uoc29jayk7CisJCWZyZWVhZGRyaW5mbyhyZXMpOworCQlyZXR1cm4gLTE7CisJfQorCWZyZWVhZGRyaW5mbyhyZXMpOworCXJldHVybiBzb2NrOworfQorCitzdGF0aWMgaW50Cit0aW1lb3V0X2Nvbm5lY3QoaW50IHNvY2tmZCwgY29uc3Qgc3RydWN0IHNvY2thZGRyICpzZXJ2X2FkZHIsCisgICAgc29ja2xlbl90IGFkZHJsZW4sIGludCAqdGltZW91dHApCit7CisJZmRfc2V0ICpmZHNldDsKKwlzdHJ1Y3QgdGltZXZhbCB0diwgdF9zdGFydDsKKwlzb2NrbGVuX3Qgb3B0bGVuOworCWludCBvcHR2YWwsIHJjLCByZXN1bHQgPSAtMTsKKworCWdldHRpbWVvZmRheSgmdF9zdGFydCwgTlVMTCk7CisKKwlpZiAoKnRpbWVvdXRwIDw9IDApIHsKKwkJcmVzdWx0ID0gY29ubmVjdChzb2NrZmQsIHNlcnZfYWRkciwgYWRkcmxlbik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzZXRfbm9uYmxvY2soc29ja2ZkKTsKKwlyYyA9IGNvbm5lY3Qoc29ja2ZkLCBzZXJ2X2FkZHIsIGFkZHJsZW4pOworCWlmIChyYyA9PSAwKSB7CisJCXVuc2V0X25vbmJsb2NrKHNvY2tmZCk7CisJCXJlc3VsdCA9IDA7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKGVycm5vICE9IEVJTlBST0dSRVNTKSB7CisJCXJlc3VsdCA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCisJZmRzZXQgPSAoZmRfc2V0ICopeGNhbGxvYyhob3dtYW55KHNvY2tmZCArIDEsIE5GREJJVFMpLAorCSAgICBzaXplb2YoZmRfbWFzaykpOworCUZEX1NFVChzb2NrZmQsIGZkc2V0KTsKKwltc190b190aW1ldmFsKCZ0diwgKnRpbWVvdXRwKTsKKworCWZvciAoOzspIHsKKwkJcmMgPSBzZWxlY3Qoc29ja2ZkICsgMSwgTlVMTCwgZmRzZXQsIE5VTEwsICZ0dik7CisJCWlmIChyYyAhPSAtMSB8fCBlcnJubyAhPSBFSU5UUikKKwkJCWJyZWFrOworCX0KKworCXN3aXRjaCAocmMpIHsKKwljYXNlIDA6CisJCS8qIFRpbWVkIG91dCAqLworCQllcnJubyA9IEVUSU1FRE9VVDsKKwkJYnJlYWs7CisJY2FzZSAtMToKKwkJLyogU2VsZWN0IGVycm9yICovCisJCWRlYnVnKCJzZWxlY3Q6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkvKiBDb21wbGV0ZWQgb3IgZmFpbGVkICovCisJCW9wdHZhbCA9IDA7CisJCW9wdGxlbiA9IHNpemVvZihvcHR2YWwpOworCQlpZiAoZ2V0c29ja29wdChzb2NrZmQsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAmb3B0dmFsLAorCQkgICAgJm9wdGxlbikgPT0gLTEpIHsKKwkJCWRlYnVnKCJnZXRzb2Nrb3B0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAob3B0dmFsICE9IDApIHsKKwkJCWVycm5vID0gb3B0dmFsOworCQkJYnJlYWs7CisJCX0KKwkJcmVzdWx0ID0gMDsKKwkJdW5zZXRfbm9uYmxvY2soc29ja2ZkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogU2hvdWxkIG5vdCBvY2N1ciAqLworCQlmYXRhbCgiQm9ndXMgcmV0dXJuICglZCkgZnJvbSBzZWxlY3QoKSIsIHJjKTsKKwl9CisKKwl4ZnJlZShmZHNldCk7CisKKyBkb25lOgorIAlpZiAocmVzdWx0ID09IDAgJiYgKnRpbWVvdXRwID4gMCkgeworCQltc19zdWJ0cmFjdF9kaWZmKCZ0X3N0YXJ0LCB0aW1lb3V0cCk7CisJCWlmICgqdGltZW91dHAgPD0gMCkgeworCQkJZXJybm8gPSBFVElNRURPVVQ7CisJCQlyZXN1bHQgPSAtMTsKKwkJfQorCX0KKworCXJldHVybiAocmVzdWx0KTsKK30KKworLyoKKyAqIE9wZW5zIGEgVENQL0lQIGNvbm5lY3Rpb24gdG8gdGhlIHJlbW90ZSBzZXJ2ZXIgb24gdGhlIGdpdmVuIGhvc3QuCisgKiBUaGUgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIGhvc3Qgd2lsbCBiZSByZXR1cm5lZCBpbiBob3N0YWRkci4KKyAqIElmIHBvcnQgaXMgMCwgdGhlIGRlZmF1bHQgcG9ydCB3aWxsIGJlIHVzZWQuICBJZiBuZWVkcHJpdiBpcyB0cnVlLAorICogYSBwcml2aWxlZ2VkIHBvcnQgd2lsbCBiZSBhbGxvY2F0ZWQgdG8gbWFrZSB0aGUgY29ubmVjdGlvbi4KKyAqIFRoaXMgcmVxdWlyZXMgc3VwZXItdXNlciBwcml2aWxlZ2VzIGlmIG5lZWRwcml2IGlzIHRydWUuCisgKiBDb25uZWN0aW9uX2F0dGVtcHRzIHNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdHJpZXMgKG9uZSBwZXIKKyAqIHNlY29uZCkuICBJZiBwcm94eV9jb21tYW5kIGlzIG5vbi1OVUxMLCBpdCBzcGVjaWZpZXMgdGhlIGNvbW1hbmQgKHdpdGggJWgKKyAqIGFuZCAlcCBzdWJzdGl0dXRlZCBmb3IgaG9zdCBhbmQgcG9ydCwgcmVzcGVjdGl2ZWx5KSB0byB1c2UgdG8gY29udGFjdAorICogdGhlIGRhZW1vbi4KKyAqLworaW50Citzc2hfY29ubmVjdChjb25zdCBjaGFyICpob3N0LCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqIGhvc3RhZGRyLAorICAgIHVfc2hvcnQgcG9ydCwgaW50IGZhbWlseSwgaW50IGNvbm5lY3Rpb25fYXR0ZW1wdHMsIGludCAqdGltZW91dF9tcywKKyAgICBpbnQgd2FudF9rZWVwYWxpdmUsIGludCBuZWVkcHJpdiwgY29uc3QgY2hhciAqcHJveHlfY29tbWFuZCkKK3sKKwlpbnQgZ2FpZXJyOworCWludCBvbiA9IDE7CisJaW50IHNvY2sgPSAtMSwgYXR0ZW1wdDsKKwljaGFyIG50b3BbTklfTUFYSE9TVF0sIHN0cnBvcnRbTklfTUFYU0VSVl07CisJc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWksICphaXRvcDsKKworCWRlYnVnMigic3NoX2Nvbm5lY3Q6IG5lZWRwcml2ICVkIiwgbmVlZHByaXYpOworCisJLyogSWYgYSBwcm94eSBjb21tYW5kIGlzIGdpdmVuLCBjb25uZWN0IHVzaW5nIGl0LiAqLworCWlmIChwcm94eV9jb21tYW5kICE9IE5VTEwpCisJCXJldHVybiBzc2hfcHJveHlfY29ubmVjdChob3N0LCBwb3J0LCBwcm94eV9jb21tYW5kKTsKKworCS8qIE5vIHByb3h5IGNvbW1hbmQuICovCisKKwltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKwloaW50cy5haV9mYW1pbHkgPSBmYW1pbHk7CisJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKwlzbnByaW50ZihzdHJwb3J0LCBzaXplb2Ygc3RycG9ydCwgIiV1IiwgcG9ydCk7CisJaWYgKChnYWllcnIgPSBnZXRhZGRyaW5mbyhob3N0LCBzdHJwb3J0LCAmaGludHMsICZhaXRvcCkpICE9IDApCisJCWZhdGFsKCIlczogQ291bGQgbm90IHJlc29sdmUgaG9zdG5hbWUgJS4xMDBzOiAlcyIsIF9fcHJvZ25hbWUsCisJCSAgICBob3N0LCBzc2hfZ2FpX3N0cmVycm9yKGdhaWVycikpOworCisJZm9yIChhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IGNvbm5lY3Rpb25fYXR0ZW1wdHM7IGF0dGVtcHQrKykgeworCQlpZiAoYXR0ZW1wdCA+IDApIHsKKwkJCS8qIFNsZWVwIGEgbW9tZW50IGJlZm9yZSByZXRyeWluZy4gKi8KKwkJCXNsZWVwKDEpOworCQkJZGVidWcoIlRyeWluZyBhZ2Fpbi4uLiIpOworCQl9CisJCS8qCisJCSAqIExvb3AgdGhyb3VnaCBhZGRyZXNzZXMgZm9yIHRoaXMgaG9zdCwgYW5kIHRyeSBlYWNoIG9uZSBpbgorCQkgKiBzZXF1ZW5jZSB1bnRpbCB0aGUgY29ubmVjdGlvbiBzdWNjZWVkcy4KKwkJICovCisJCWZvciAoYWkgPSBhaXRvcDsgYWk7IGFpID0gYWktPmFpX25leHQpIHsKKwkJCWlmIChhaS0+YWlfZmFtaWx5ICE9IEFGX0lORVQgJiYgYWktPmFpX2ZhbWlseSAhPSBBRl9JTkVUNikKKwkJCQljb250aW51ZTsKKwkJCWlmIChnZXRuYW1laW5mbyhhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4sCisJCQkgICAgbnRvcCwgc2l6ZW9mKG50b3ApLCBzdHJwb3J0LCBzaXplb2Yoc3RycG9ydCksCisJCQkgICAgTklfTlVNRVJJQ0hPU1R8TklfTlVNRVJJQ1NFUlYpICE9IDApIHsKKwkJCQllcnJvcigic3NoX2Nvbm5lY3Q6IGdldG5hbWVpbmZvIGZhaWxlZCIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZGVidWcoIkNvbm5lY3RpbmcgdG8gJS4yMDBzIFslLjEwMHNdIHBvcnQgJXMuIiwKKwkJCQlob3N0LCBudG9wLCBzdHJwb3J0KTsKKworCQkJLyogQ3JlYXRlIGEgc29ja2V0IGZvciBjb25uZWN0aW5nLiAqLworCQkJc29jayA9IHNzaF9jcmVhdGVfc29ja2V0KG5lZWRwcml2LCBhaSk7CisJCQlpZiAoc29jayA8IDApCisJCQkJLyogQW55IGVycm9yIGlzIGFscmVhZHkgb3V0cHV0ICovCisJCQkJY29udGludWU7CisKKwkJCWlmICh0aW1lb3V0X2Nvbm5lY3Qoc29jaywgYWktPmFpX2FkZHIsIGFpLT5haV9hZGRybGVuLAorCQkJICAgIHRpbWVvdXRfbXMpID49IDApIHsKKwkJCQkvKiBTdWNjZXNzZnVsIGNvbm5lY3Rpb24uICovCisJCQkJbWVtY3B5KGhvc3RhZGRyLCBhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4pOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlkZWJ1ZygiY29ubmVjdCB0byBhZGRyZXNzICVzIHBvcnQgJXM6ICVzIiwKKwkJCQkgICAgbnRvcCwgc3RycG9ydCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQljbG9zZShzb2NrKTsKKwkJCQlzb2NrID0gLTE7CisJCQl9CisJCX0KKwkJaWYgKHNvY2sgIT0gLTEpCisJCQlicmVhazsJLyogU3VjY2Vzc2Z1bCBjb25uZWN0aW9uLiAqLworCX0KKworCWZyZWVhZGRyaW5mbyhhaXRvcCk7CisKKwkvKiBSZXR1cm4gZmFpbHVyZSBpZiB3ZSBkaWRuJ3QgZ2V0IGEgc3VjY2Vzc2Z1bCBjb25uZWN0aW9uLiAqLworCWlmIChzb2NrID09IC0xKSB7CisJCWVycm9yKCJzc2g6IGNvbm5lY3QgdG8gaG9zdCAlcyBwb3J0ICVzOiAlcyIsCisJCSAgICBob3N0LCBzdHJwb3J0LCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlkZWJ1ZygiQ29ubmVjdGlvbiBlc3RhYmxpc2hlZC4iKTsKKworCS8qIFNldCBTT19LRUVQQUxJVkUgaWYgcmVxdWVzdGVkLiAqLworCWlmICh3YW50X2tlZXBhbGl2ZSAmJgorCSAgICBzZXRzb2Nrb3B0KHNvY2ssIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgKHZvaWQgKikmb24sCisJICAgIHNpemVvZihvbikpIDwgMCkKKwkJZXJyb3IoInNldHNvY2tvcHQgU09fS0VFUEFMSVZFOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCisJLyogU2V0IHRoZSBjb25uZWN0aW9uLiAqLworCXBhY2tldF9zZXRfY29ubmVjdGlvbihzb2NrLCBzb2NrKTsKKwlwYWNrZXRfc2V0X3RpbWVvdXQob3B0aW9ucy5zZXJ2ZXJfYWxpdmVfaW50ZXJ2YWwsCisJICAgIG9wdGlvbnMuc2VydmVyX2FsaXZlX2NvdW50X21heCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdhaXRzIGZvciB0aGUgc2VydmVyIGlkZW50aWZpY2F0aW9uIHN0cmluZywgYW5kIHNlbmRzIG91ciBvd24KKyAqIGlkZW50aWZpY2F0aW9uIHN0cmluZy4KKyAqLwordm9pZAorc3NoX2V4Y2hhbmdlX2lkZW50aWZpY2F0aW9uKGludCB0aW1lb3V0X21zKQoreworCWNoYXIgYnVmWzI1Nl0sIHJlbW90ZV92ZXJzaW9uWzI1Nl07CS8qIG11c3QgYmUgc2FtZSBzaXplISAqLworCWludCByZW1vdGVfbWFqb3IsIHJlbW90ZV9taW5vciwgbWlzbWF0Y2g7CisJaW50IGNvbm5lY3Rpb25faW4gPSBwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25faW4oKTsKKwlpbnQgY29ubmVjdGlvbl9vdXQgPSBwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25fb3V0KCk7CisJaW50IG1pbm9yMSA9IFBST1RPQ09MX01JTk9SXzE7CisJdV9pbnQgaSwgbjsKKwlzaXplX3QgbGVuOworCWludCBmZHNldHN6LCByZW1haW5pbmcsIHJjOworCXN0cnVjdCB0aW1ldmFsIHRfc3RhcnQsIHRfcmVtYWluaW5nOworCWZkX3NldCAqZmRzZXQ7CisKKwlmZHNldHN6ID0gaG93bWFueShjb25uZWN0aW9uX2luICsgMSwgTkZEQklUUykgKiBzaXplb2YoZmRfbWFzayk7CisJZmRzZXQgPSB4Y2FsbG9jKDEsIGZkc2V0c3opOworCisJLyogUmVhZCBvdGhlciBzaWRlJ3MgdmVyc2lvbiBpZGVudGlmaWNhdGlvbi4gKi8KKwlyZW1haW5pbmcgPSB0aW1lb3V0X21zOworCWZvciAobiA9IDA7OykgeworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGJ1ZikgLSAxOyBpKyspIHsKKwkJCWlmICh0aW1lb3V0X21zID4gMCkgeworCQkJCWdldHRpbWVvZmRheSgmdF9zdGFydCwgTlVMTCk7CisJCQkJbXNfdG9fdGltZXZhbCgmdF9yZW1haW5pbmcsIHJlbWFpbmluZyk7CisJCQkJRkRfU0VUKGNvbm5lY3Rpb25faW4sIGZkc2V0KTsKKwkJCQlyYyA9IHNlbGVjdChjb25uZWN0aW9uX2luICsgMSwgZmRzZXQsIE5VTEwsCisJCQkJICAgIGZkc2V0LCAmdF9yZW1haW5pbmcpOworCQkJCW1zX3N1YnRyYWN0X2RpZmYoJnRfc3RhcnQsICZyZW1haW5pbmcpOworCQkJCWlmIChyYyA9PSAwIHx8IHJlbWFpbmluZyA8PSAwKQorCQkJCQlmYXRhbCgiQ29ubmVjdGlvbiB0aW1lZCBvdXQgZHVyaW5nICIKKwkJCQkJICAgICJiYW5uZXIgZXhjaGFuZ2UiKTsKKwkJCQlpZiAocmMgPT0gLTEpIHsKKwkJCQkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJCQkJY29udGludWU7CisJCQkJCWZhdGFsKCJzc2hfZXhjaGFuZ2VfaWRlbnRpZmljYXRpb246ICIKKwkJCQkJICAgICJzZWxlY3Q6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQl9CisJCQl9CisKKwkJCWxlbiA9IHJvYW1pbmdfYXRvbWljaW8ocmVhZCwgY29ubmVjdGlvbl9pbiwgJmJ1ZltpXSwgMSk7CisKKwkJCWlmIChsZW4gIT0gMSAmJiBlcnJubyA9PSBFUElQRSkKKwkJCQlmYXRhbCgic3NoX2V4Y2hhbmdlX2lkZW50aWZpY2F0aW9uOiAiCisJCQkJICAgICJDb25uZWN0aW9uIGNsb3NlZCBieSByZW1vdGUgaG9zdCIpOworCQkJZWxzZSBpZiAobGVuICE9IDEpCisJCQkJZmF0YWwoInNzaF9leGNoYW5nZV9pZGVudGlmaWNhdGlvbjogIgorCQkJCSAgICAicmVhZDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWlmIChidWZbaV0gPT0gJ1xyJykgeworCQkJCWJ1ZltpXSA9ICdcbic7CisJCQkJYnVmW2kgKyAxXSA9IDA7CisJCQkJY29udGludWU7CQkvKipYWFggd2FpdCBmb3IgXG4gKi8KKwkJCX0KKwkJCWlmIChidWZbaV0gPT0gJ1xuJykgeworCQkJCWJ1ZltpICsgMV0gPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCsrbiA+IDY1NTM2KQorCQkJCWZhdGFsKCJzc2hfZXhjaGFuZ2VfaWRlbnRpZmljYXRpb246ICIKKwkJCQkgICAgIk5vIGJhbm5lciByZWNlaXZlZCIpOworCQl9CisJCWJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMDsKKwkJaWYgKHN0cm5jbXAoYnVmLCAiU1NILSIsIDQpID09IDApCisJCQlicmVhazsKKwkJZGVidWcoInNzaF9leGNoYW5nZV9pZGVudGlmaWNhdGlvbjogJXMiLCBidWYpOworCX0KKwlzZXJ2ZXJfdmVyc2lvbl9zdHJpbmcgPSB4c3RyZHVwKGJ1Zik7CisJeGZyZWUoZmRzZXQpOworCisJLyoKKwkgKiBDaGVjayB0aGF0IHRoZSB2ZXJzaW9ucyBtYXRjaC4gIEluIGZ1dHVyZSB0aGlzIG1pZ2h0IGFjY2VwdAorCSAqIHNldmVyYWwgdmVyc2lvbnMgYW5kIHNldCBhcHByb3ByaWF0ZSBmbGFncyB0byBoYW5kbGUgdGhlbS4KKwkgKi8KKwlpZiAoc3NjYW5mKHNlcnZlcl92ZXJzaW9uX3N0cmluZywgIlNTSC0lZC4lZC0lW15cbl1cbiIsCisJICAgICZyZW1vdGVfbWFqb3IsICZyZW1vdGVfbWlub3IsIHJlbW90ZV92ZXJzaW9uKSAhPSAzKQorCQlmYXRhbCgiQmFkIHJlbW90ZSBwcm90b2NvbCB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uOiAnJS4xMDBzJyIsIGJ1Zik7CisJZGVidWcoIlJlbW90ZSBwcm90b2NvbCB2ZXJzaW9uICVkLiVkLCByZW1vdGUgc29mdHdhcmUgdmVyc2lvbiAlLjEwMHMiLAorCSAgICByZW1vdGVfbWFqb3IsIHJlbW90ZV9taW5vciwgcmVtb3RlX3ZlcnNpb24pOworCisJY29tcGF0X2RhdGFmZWxsb3dzKHJlbW90ZV92ZXJzaW9uKTsKKwltaXNtYXRjaCA9IDA7CisKKwlzd2l0Y2ggKHJlbW90ZV9tYWpvcikgeworCWNhc2UgMToKKwkJaWYgKHJlbW90ZV9taW5vciA9PSA5OSAmJgorCQkgICAgKG9wdGlvbnMucHJvdG9jb2wgJiBTU0hfUFJPVE9fMikgJiYKKwkJICAgICEob3B0aW9ucy5wcm90b2NvbCAmIFNTSF9QUk9UT18xX1BSRUZFUlJFRCkpIHsKKwkJCWVuYWJsZV9jb21wYXQyMCgpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCEob3B0aW9ucy5wcm90b2NvbCAmIFNTSF9QUk9UT18xKSkgeworCQkJbWlzbWF0Y2ggPSAxOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJlbW90ZV9taW5vciA8IDMpIHsKKwkJCWZhdGFsKCJSZW1vdGUgbWFjaGluZSBoYXMgdG9vIG9sZCBTU0ggc29mdHdhcmUgdmVyc2lvbi4iKTsKKwkJfSBlbHNlIGlmIChyZW1vdGVfbWlub3IgPT0gMyB8fCByZW1vdGVfbWlub3IgPT0gNCkgeworCQkJLyogV2Ugc3BlYWsgMS4zLCB0b28uICovCisJCQllbmFibGVfY29tcGF0MTMoKTsKKwkJCW1pbm9yMSA9IDM7CisJCQlpZiAob3B0aW9ucy5mb3J3YXJkX2FnZW50KSB7CisJCQkJbG9naXQoIkFnZW50IGZvcndhcmRpbmcgZGlzYWJsZWQgZm9yIHByb3RvY29sIDEuMyIpOworCQkJCW9wdGlvbnMuZm9yd2FyZF9hZ2VudCA9IDA7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpZiAob3B0aW9ucy5wcm90b2NvbCAmIFNTSF9QUk9UT18yKSB7CisJCQllbmFibGVfY29tcGF0MjAoKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIEZBTExUSFJPVUdIICovCisJZGVmYXVsdDoKKwkJbWlzbWF0Y2ggPSAxOworCQlicmVhazsKKwl9CisJaWYgKG1pc21hdGNoKQorCQlmYXRhbCgiUHJvdG9jb2wgbWFqb3IgdmVyc2lvbnMgZGlmZmVyOiAlZCB2cy4gJWQiLAorCQkgICAgKG9wdGlvbnMucHJvdG9jb2wgJiBTU0hfUFJPVE9fMikgPyBQUk9UT0NPTF9NQUpPUl8yIDogUFJPVE9DT0xfTUFKT1JfMSwKKwkJICAgIHJlbW90ZV9tYWpvcik7CisJLyogU2VuZCBvdXIgb3duIHByb3RvY29sIHZlcnNpb24gaWRlbnRpZmljYXRpb24uICovCisJc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiU1NILSVkLiVkLSUuMTAwcyVzIiwKKwkgICAgY29tcGF0MjAgPyBQUk9UT0NPTF9NQUpPUl8yIDogUFJPVE9DT0xfTUFKT1JfMSwKKwkgICAgY29tcGF0MjAgPyBQUk9UT0NPTF9NSU5PUl8yIDogbWlub3IxLAorCSAgICBTU0hfVkVSU0lPTiwgY29tcGF0MjAgPyAiXHJcbiIgOiAiXG4iKTsKKwlpZiAocm9hbWluZ19hdG9taWNpbyh2d3JpdGUsIGNvbm5lY3Rpb25fb3V0LCBidWYsIHN0cmxlbihidWYpKQorCSAgICAhPSBzdHJsZW4oYnVmKSkKKwkJZmF0YWwoIndyaXRlOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCWNsaWVudF92ZXJzaW9uX3N0cmluZyA9IHhzdHJkdXAoYnVmKTsKKwljaG9wKGNsaWVudF92ZXJzaW9uX3N0cmluZyk7CisJY2hvcChzZXJ2ZXJfdmVyc2lvbl9zdHJpbmcpOworCWRlYnVnKCJMb2NhbCB2ZXJzaW9uIHN0cmluZyAlLjEwMHMiLCBjbGllbnRfdmVyc2lvbl9zdHJpbmcpOworfQorCisvKiBkZWZhdWx0cyB0byAnbm8nICovCitzdGF0aWMgaW50Citjb25maXJtKGNvbnN0IGNoYXIgKnByb21wdCkKK3sKKwljb25zdCBjaGFyICptc2csICphZ2FpbiA9ICJQbGVhc2UgdHlwZSAneWVzJyBvciAnbm8nOiAiOworCWNoYXIgKnA7CisJaW50IHJldCA9IC0xOworCisJaWYgKG9wdGlvbnMuYmF0Y2hfbW9kZSkKKwkJcmV0dXJuIDA7CisJZm9yIChtc2cgPSBwcm9tcHQ7O21zZyA9IGFnYWluKSB7CisJCXAgPSByZWFkX3Bhc3NwaHJhc2UobXNnLCBSUF9FQ0hPKTsKKwkJaWYgKHAgPT0gTlVMTCB8fAorCQkgICAgKHBbMF0gPT0gJ1wwJykgfHwgKHBbMF0gPT0gJ1xuJykgfHwKKwkJICAgIHN0cm5jYXNlY21wKHAsICJubyIsIDIpID09IDApCisJCQlyZXQgPSAwOworCQlpZiAocCAmJiBzdHJuY2FzZWNtcChwLCAieWVzIiwgMykgPT0gMCkKKwkJCXJldCA9IDE7CisJCWlmIChwKQorCQkJeGZyZWUocCk7CisJCWlmIChyZXQgIT0gLTEpCisJCQlyZXR1cm4gcmV0OworCX0KK30KKworc3RhdGljIGludAorY2hlY2tfaG9zdF9jZXJ0KGNvbnN0IGNoYXIgKmhvc3QsIGNvbnN0IEtleSAqaG9zdF9rZXkpCit7CisJY29uc3QgY2hhciAqcmVhc29uOworCisJaWYgKGtleV9jZXJ0X2NoZWNrX2F1dGhvcml0eShob3N0X2tleSwgMSwgMCwgaG9zdCwgJnJlYXNvbikgIT0gMCkgeworCQllcnJvcigiJXMiLCByZWFzb24pOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGJ1ZmZlcl9sZW4oJmhvc3Rfa2V5LT5jZXJ0LT5jcml0aWNhbCkgIT0gMCkgeworCQllcnJvcigiQ2VydGlmaWNhdGUgZm9yICVzIGNvbnRhaW5zIHVuc3VwcG9ydGVkICIKKwkJICAgICJjcml0aWNhbCBvcHRpb25zKHMpIiwgaG9zdCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorc29ja2FkZHJfaXNfbG9jYWwoc3RydWN0IHNvY2thZGRyICpob3N0YWRkcikKK3sKKwlzd2l0Y2ggKGhvc3RhZGRyLT5zYV9mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCXJldHVybiAobnRvaGwoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilob3N0YWRkciktPgorCQkgICAgc2luX2FkZHIuc19hZGRyKSA+PiAyNCkgPT0gSU5fTE9PUEJBQ0tORVQ7CisJY2FzZSBBRl9JTkVUNjoKKwkJcmV0dXJuIElONl9JU19BRERSX0xPT1BCQUNLKAorCQkgICAgJigoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilob3N0YWRkciktPnNpbjZfYWRkcikpOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworLyoKKyAqIFByZXBhcmUgdGhlIGhvc3RuYW1lIGFuZCBpcCBhZGRyZXNzIHN0cmluZ3MgdGhhdCBhcmUgdXNlZCB0byBsb29rdXAKKyAqIGhvc3Qga2V5cyBpbiBrbm93bl9ob3N0cyBmaWxlcy4gVGhlc2UgbWF5IGhhdmUgYSBwb3J0IG51bWJlciBhcHBlbmRlZC4KKyAqLwordm9pZAorZ2V0X2hvc3RmaWxlX2hvc3RuYW1lX2lwYWRkcihjaGFyICpob3N0bmFtZSwgc3RydWN0IHNvY2thZGRyICpob3N0YWRkciwKKyAgICB1X3Nob3J0IHBvcnQsIGNoYXIgKipob3N0ZmlsZV9ob3N0bmFtZSwgY2hhciAqKmhvc3RmaWxlX2lwYWRkcikKK3sKKwljaGFyIG50b3BbTklfTUFYSE9TVF07CisJc29ja2xlbl90IGFkZHJsZW47CisKKwlzd2l0Y2ggKGhvc3RhZGRyID09IE5VTEwgPyAtMSA6IGhvc3RhZGRyLT5zYV9mYW1pbHkpIHsKKwljYXNlIC0xOgorCQlhZGRybGVuID0gMDsKKwkJYnJlYWs7CisJY2FzZSBBRl9JTkVUOgorCQlhZGRybGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJCWJyZWFrOworCWNhc2UgQUZfSU5FVDY6CisJCWFkZHJsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWFkZHJsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyKTsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBXZSBkb24ndCBoYXZlIHRoZSByZW1vdGUgaXAtYWRkcmVzcyBmb3IgY29ubmVjdGlvbnMKKwkgKiB1c2luZyBhIHByb3h5IGNvbW1hbmQKKwkgKi8KKwlpZiAoaG9zdGZpbGVfaXBhZGRyICE9IE5VTEwpIHsKKwkJaWYgKG9wdGlvbnMucHJveHlfY29tbWFuZCA9PSBOVUxMKSB7CisJCQlpZiAoZ2V0bmFtZWluZm8oaG9zdGFkZHIsIGFkZHJsZW4sCisJCQkgICAgbnRvcCwgc2l6ZW9mKG50b3ApLCBOVUxMLCAwLCBOSV9OVU1FUklDSE9TVCkgIT0gMCkKKwkJCWZhdGFsKCJjaGVja19ob3N0X2tleTogZ2V0bmFtZWluZm8gZmFpbGVkIik7CisJCQkqaG9zdGZpbGVfaXBhZGRyID0gcHV0X2hvc3RfcG9ydChudG9wLCBwb3J0KTsKKwkJfSBlbHNlIHsKKwkJCSpob3N0ZmlsZV9pcGFkZHIgPSB4c3RyZHVwKCI8bm8gaG9zdGlwIGZvciBwcm94eSAiCisJCQkgICAgImNvbW1hbmQ+Iik7CisJCX0KKwl9CisKKwkvKgorCSAqIEFsbG93IHRoZSB1c2VyIHRvIHJlY29yZCB0aGUga2V5IHVuZGVyIGEgZGlmZmVyZW50IG5hbWUgb3IKKwkgKiBkaWZmZXJlbnRpYXRlIGEgbm9uLXN0YW5kYXJkIHBvcnQuICBUaGlzIGlzIHVzZWZ1bCBmb3Igc3NoCisJICogdHVubmVsaW5nIG92ZXIgZm9yd2FyZGVkIGNvbm5lY3Rpb25zIG9yIGlmIHlvdSBydW4gbXVsdGlwbGUKKwkgKiBzc2hkJ3Mgb24gZGlmZmVyZW50IHBvcnRzIG9uIHRoZSBzYW1lIG1hY2hpbmUuCisJICovCisJaWYgKGhvc3RmaWxlX2hvc3RuYW1lICE9IE5VTEwpIHsKKwkJaWYgKG9wdGlvbnMuaG9zdF9rZXlfYWxpYXMgIT0gTlVMTCkgeworCQkJKmhvc3RmaWxlX2hvc3RuYW1lID0geHN0cmR1cChvcHRpb25zLmhvc3Rfa2V5X2FsaWFzKTsKKwkJCWRlYnVnKCJ1c2luZyBob3N0a2V5YWxpYXM6ICVzIiwgKmhvc3RmaWxlX2hvc3RuYW1lKTsKKwkJfSBlbHNlIHsKKwkJCSpob3N0ZmlsZV9ob3N0bmFtZSA9IHB1dF9ob3N0X3BvcnQoaG9zdG5hbWUsIHBvcnQpOworCQl9CisJfQorfQorCisvKgorICogY2hlY2sgd2hldGhlciB0aGUgc3VwcGxpZWQgaG9zdCBrZXkgaXMgdmFsaWQsIHJldHVybiAtMSBpZiB0aGUga2V5CisgKiBpcyBub3QgdmFsaWQuIHVzZXJfaG9zdGZpbGVbMF0gd2lsbCBub3QgYmUgdXBkYXRlZCBpZiAncmVhZG9ubHknIGlzIHRydWUuCisgKi8KKyNkZWZpbmUgUkRSVwkwCisjZGVmaW5lIFJET05MWQkxCisjZGVmaW5lIFJPUVVJRVQJMgorc3RhdGljIGludAorY2hlY2tfaG9zdF9rZXkoY2hhciAqaG9zdG5hbWUsIHN0cnVjdCBzb2NrYWRkciAqaG9zdGFkZHIsIHVfc2hvcnQgcG9ydCwKKyAgICBLZXkgKmhvc3Rfa2V5LCBpbnQgcmVhZG9ubHksCisgICAgY2hhciAqKnVzZXJfaG9zdGZpbGVzLCB1X2ludCBudW1fdXNlcl9ob3N0ZmlsZXMsCisgICAgY2hhciAqKnN5c3RlbV9ob3N0ZmlsZXMsIHVfaW50IG51bV9zeXN0ZW1faG9zdGZpbGVzKQoreworCUhvc3RTdGF0dXMgaG9zdF9zdGF0dXM7CisJSG9zdFN0YXR1cyBpcF9zdGF0dXM7CisJS2V5ICpyYXdfa2V5ID0gTlVMTDsKKwljaGFyICppcCA9IE5VTEwsICpob3N0ID0gTlVMTDsKKwljaGFyIGhvc3RsaW5lWzEwMDBdLCAqaG9zdHAsICpmcCwgKnJhOworCWNoYXIgbXNnWzEwMjRdOworCWNvbnN0IGNoYXIgKnR5cGU7CisJY29uc3Qgc3RydWN0IGhvc3RrZXlfZW50cnkgKmhvc3RfZm91bmQsICppcF9mb3VuZDsKKwlpbnQgbGVuLCBjYW5jZWxsZWRfZm9yd2FyZGluZyA9IDA7CisJaW50IGxvY2FsID0gc29ja2FkZHJfaXNfbG9jYWwoaG9zdGFkZHIpOworCWludCByLCB3YW50X2NlcnQgPSBrZXlfaXNfY2VydChob3N0X2tleSksIGhvc3RfaXBfZGlmZmVyID0gMDsKKwlzdHJ1Y3QgaG9zdGtleXMgKmhvc3RfaG9zdGtleXMsICppcF9ob3N0a2V5czsKKwl1X2ludCBpOworCisJLyoKKwkgKiBGb3JjZSBhY2NlcHRpbmcgb2YgdGhlIGhvc3Qga2V5IGZvciBsb29wYmFjay9sb2NhbGhvc3QuIFRoZQorCSAqIHByb2JsZW0gaXMgdGhhdCBpZiB0aGUgaG9tZSBkaXJlY3RvcnkgaXMgTkZTLW1vdW50ZWQgdG8gbXVsdGlwbGUKKwkgKiBtYWNoaW5lcywgbG9jYWxob3N0IHdpbGwgcmVmZXIgdG8gYSBkaWZmZXJlbnQgbWFjaGluZSBpbiBlYWNoIG9mCisJICogdGhlbSwgYW5kIHRoZSB1c2VyIHdpbGwgZ2V0IGJvZ3VzIEhPU1RfQ0hBTkdFRCB3YXJuaW5ncy4gIFRoaXMKKwkgKiBlc3NlbnRpYWxseSBkaXNhYmxlcyBob3N0IGF1dGhlbnRpY2F0aW9uIGZvciBsb2NhbGhvc3Q7IGhvd2V2ZXIsCisJICogdGhpcyBpcyBwcm9iYWJseSBub3QgYSByZWFsIHByb2JsZW0uCisJICovCisJaWYgKG9wdGlvbnMubm9faG9zdF9hdXRoZW50aWNhdGlvbl9mb3JfbG9jYWxob3N0ID09IDEgJiYgbG9jYWwgJiYKKwkgICAgb3B0aW9ucy5ob3N0X2tleV9hbGlhcyA9PSBOVUxMKSB7CisJCWRlYnVnKCJGb3JjaW5nIGFjY2VwdGluZyBvZiBob3N0IGtleSBmb3IgIgorCQkgICAgImxvb3BiYWNrL2xvY2FsaG9zdC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBQcmVwYXJlIHRoZSBob3N0bmFtZSBhbmQgYWRkcmVzcyBzdHJpbmdzIHVzZWQgZm9yIGhvc3RrZXkgbG9va3VwLgorCSAqIEluIHNvbWUgY2FzZXMsIHRoZXNlIHdpbGwgaGF2ZSBhIHBvcnQgbnVtYmVyIGFwcGVuZGVkLgorCSAqLworCWdldF9ob3N0ZmlsZV9ob3N0bmFtZV9pcGFkZHIoaG9zdG5hbWUsIGhvc3RhZGRyLCBwb3J0LCAmaG9zdCwgJmlwKTsKKworCS8qCisJICogVHVybiBvZmYgY2hlY2tfaG9zdF9pcCBpZiB0aGUgY29ubmVjdGlvbiBpcyB0byBsb2NhbGhvc3QsIHZpYSBwcm94eQorCSAqIGNvbW1hbmQgb3IgaWYgd2UgZG9uJ3QgaGF2ZSBhIGhvc3RuYW1lIHRvIGNvbXBhcmUgd2l0aAorCSAqLworCWlmIChvcHRpb25zLmNoZWNrX2hvc3RfaXAgJiYgKGxvY2FsIHx8CisJICAgIHN0cmNtcChob3N0bmFtZSwgaXApID09IDAgfHwgb3B0aW9ucy5wcm94eV9jb21tYW5kICE9IE5VTEwpKQorCQlvcHRpb25zLmNoZWNrX2hvc3RfaXAgPSAwOworCisJaG9zdF9ob3N0a2V5cyA9IGluaXRfaG9zdGtleXMoKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3VzZXJfaG9zdGZpbGVzOyBpKyspCisJCWxvYWRfaG9zdGtleXMoaG9zdF9ob3N0a2V5cywgaG9zdCwgdXNlcl9ob3N0ZmlsZXNbaV0pOworCWZvciAoaSA9IDA7IGkgPCBudW1fc3lzdGVtX2hvc3RmaWxlczsgaSsrKQorCQlsb2FkX2hvc3RrZXlzKGhvc3RfaG9zdGtleXMsIGhvc3QsIHN5c3RlbV9ob3N0ZmlsZXNbaV0pOworCisJaXBfaG9zdGtleXMgPSBOVUxMOworCWlmICghd2FudF9jZXJ0ICYmIG9wdGlvbnMuY2hlY2tfaG9zdF9pcCkgeworCQlpcF9ob3N0a2V5cyA9IGluaXRfaG9zdGtleXMoKTsKKwkJZm9yIChpID0gMDsgaSA8IG51bV91c2VyX2hvc3RmaWxlczsgaSsrKQorCQkJbG9hZF9ob3N0a2V5cyhpcF9ob3N0a2V5cywgaXAsIHVzZXJfaG9zdGZpbGVzW2ldKTsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9zeXN0ZW1faG9zdGZpbGVzOyBpKyspCisJCQlsb2FkX2hvc3RrZXlzKGlwX2hvc3RrZXlzLCBpcCwgc3lzdGVtX2hvc3RmaWxlc1tpXSk7CisJfQorCisgcmV0cnk6CisJLyogUmVsb2FkIHRoZXNlIGFzIHRoZXkgbWF5IGhhdmUgY2hhbmdlZCBvbiBjZXJ0LT5rZXkgZG93bmdyYWRlICovCisJd2FudF9jZXJ0ID0ga2V5X2lzX2NlcnQoaG9zdF9rZXkpOworCXR5cGUgPSBrZXlfdHlwZShob3N0X2tleSk7CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBob3N0IGtleSBpcyBwcmVzZW50IGluIHRoZSB1c2VyJ3MgbGlzdCBvZiBrbm93bgorCSAqIGhvc3RzIG9yIGluIHRoZSBzeXN0ZW13aWRlIGxpc3QuCisJICovCisJaG9zdF9zdGF0dXMgPSBjaGVja19rZXlfaW5faG9zdGtleXMoaG9zdF9ob3N0a2V5cywgaG9zdF9rZXksCisJICAgICZob3N0X2ZvdW5kKTsKKworCS8qCisJICogQWxzbyBwZXJmb3JtIGNoZWNrIGZvciB0aGUgaXAgYWRkcmVzcywgc2tpcCB0aGUgY2hlY2sgaWYgd2UgYXJlCisJICogbG9jYWxob3N0LCBsb29raW5nIGZvciBhIGNlcnRpZmljYXRlLCBvciB0aGUgaG9zdG5hbWUgd2FzIGFuIGlwCisJICogYWRkcmVzcyB0byBiZWdpbiB3aXRoLgorCSAqLworCWlmICghd2FudF9jZXJ0ICYmIGlwX2hvc3RrZXlzICE9IE5VTEwpIHsKKwkJaXBfc3RhdHVzID0gY2hlY2tfa2V5X2luX2hvc3RrZXlzKGlwX2hvc3RrZXlzLCBob3N0X2tleSwKKwkJICAgICZpcF9mb3VuZCk7CisJCWlmIChob3N0X3N0YXR1cyA9PSBIT1NUX0NIQU5HRUQgJiYKKwkJICAgIChpcF9zdGF0dXMgIT0gSE9TVF9DSEFOR0VEIHx8IAorCQkgICAgKGlwX2ZvdW5kICE9IE5VTEwgJiYKKwkJICAgICFrZXlfZXF1YWwoaXBfZm91bmQtPmtleSwgaG9zdF9mb3VuZC0+a2V5KSkpKQorCQkJaG9zdF9pcF9kaWZmZXIgPSAxOworCX0gZWxzZQorCQlpcF9zdGF0dXMgPSBob3N0X3N0YXR1czsKKworCXN3aXRjaCAoaG9zdF9zdGF0dXMpIHsKKwljYXNlIEhPU1RfT0s6CisJCS8qIFRoZSBob3N0IGlzIGtub3duIGFuZCB0aGUga2V5IG1hdGNoZXMuICovCisJCWRlYnVnKCJIb3N0ICclLjIwMHMnIGlzIGtub3duIGFuZCBtYXRjaGVzIHRoZSAlcyBob3N0ICVzLiIsCisJCSAgICBob3N0LCB0eXBlLCB3YW50X2NlcnQgPyAiY2VydGlmaWNhdGUiIDogImtleSIpOworCQlkZWJ1ZygiRm91bmQgJXMgaW4gJXM6JWx1Iiwgd2FudF9jZXJ0ID8gIkNBIGtleSIgOiAia2V5IiwKKwkJICAgIGhvc3RfZm91bmQtPmZpbGUsIGhvc3RfZm91bmQtPmxpbmUpOworCQlpZiAod2FudF9jZXJ0ICYmICFjaGVja19ob3N0X2NlcnQoaG9zdG5hbWUsIGhvc3Rfa2V5KSkKKwkJCWdvdG8gZmFpbDsKKwkJaWYgKG9wdGlvbnMuY2hlY2tfaG9zdF9pcCAmJiBpcF9zdGF0dXMgPT0gSE9TVF9ORVcpIHsKKwkJCWlmIChyZWFkb25seSB8fCB3YW50X2NlcnQpCisJCQkJbG9naXQoIiVzIGhvc3Qga2V5IGZvciBJUCBhZGRyZXNzICIKKwkJCQkgICAgIiclLjEyOHMnIG5vdCBpbiBsaXN0IG9mIGtub3duIGhvc3RzLiIsCisJCQkJICAgIHR5cGUsIGlwKTsKKwkJCWVsc2UgaWYgKCFhZGRfaG9zdF90b19ob3N0ZmlsZSh1c2VyX2hvc3RmaWxlc1swXSwgaXAsCisJCQkgICAgaG9zdF9rZXksIG9wdGlvbnMuaGFzaF9rbm93bl9ob3N0cykpCisJCQkJbG9naXQoIkZhaWxlZCB0byBhZGQgdGhlICVzIGhvc3Qga2V5IGZvciBJUCAiCisJCQkJICAgICJhZGRyZXNzICclLjEyOHMnIHRvIHRoZSBsaXN0IG9mIGtub3duICIKKwkJCQkgICAgImhvc3RzICglLjMwcykuIiwgdHlwZSwgaXAsCisJCQkJICAgIHVzZXJfaG9zdGZpbGVzWzBdKTsKKwkJCWVsc2UKKwkJCQlsb2dpdCgiV2FybmluZzogUGVybWFuZW50bHkgYWRkZWQgdGhlICVzIGhvc3QgIgorCQkJCSAgICAia2V5IGZvciBJUCBhZGRyZXNzICclLjEyOHMnIHRvIHRoZSBsaXN0ICIKKwkJCQkgICAgIm9mIGtub3duIGhvc3RzLiIsIHR5cGUsIGlwKTsKKwkJfSBlbHNlIGlmIChvcHRpb25zLnZpc3VhbF9ob3N0X2tleSkgeworCQkJZnAgPSBrZXlfZmluZ2VycHJpbnQoaG9zdF9rZXksIFNTSF9GUF9NRDUsIFNTSF9GUF9IRVgpOworCQkJcmEgPSBrZXlfZmluZ2VycHJpbnQoaG9zdF9rZXksIFNTSF9GUF9NRDUsCisJCQkgICAgU1NIX0ZQX1JBTkRPTUFSVCk7CisJCQlsb2dpdCgiSG9zdCBrZXkgZmluZ2VycHJpbnQgaXMgJXNcbiVzXG4iLCBmcCwgcmEpOworCQkJeGZyZWUocmEpOworCQkJeGZyZWUoZnApOworCQl9CisJCWJyZWFrOworCWNhc2UgSE9TVF9ORVc6CisJCWlmIChvcHRpb25zLmhvc3Rfa2V5X2FsaWFzID09IE5VTEwgJiYgcG9ydCAhPSAwICYmCisJCSAgICBwb3J0ICE9IFNTSF9ERUZBVUxUX1BPUlQpIHsKKwkJCWRlYnVnKCJjaGVja2luZyB3aXRob3V0IHBvcnQgaWRlbnRpZmllciIpOworCQkJaWYgKGNoZWNrX2hvc3Rfa2V5KGhvc3RuYW1lLCBob3N0YWRkciwgMCwgaG9zdF9rZXksCisJCQkgICAgUk9RVUlFVCwgdXNlcl9ob3N0ZmlsZXMsIG51bV91c2VyX2hvc3RmaWxlcywKKwkJCSAgICBzeXN0ZW1faG9zdGZpbGVzLCBudW1fc3lzdGVtX2hvc3RmaWxlcykgPT0gMCkgeworCQkJCWRlYnVnKCJmb3VuZCBtYXRjaGluZyBrZXkgdy9vdXQgcG9ydCIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChyZWFkb25seSB8fCB3YW50X2NlcnQpCisJCQlnb3RvIGZhaWw7CisJCS8qIFRoZSBob3N0IGlzIG5ldy4gKi8KKwkJaWYgKG9wdGlvbnMuc3RyaWN0X2hvc3Rfa2V5X2NoZWNraW5nID09IDEpIHsKKwkJCS8qCisJCQkgKiBVc2VyIGhhcyByZXF1ZXN0ZWQgc3RyaWN0IGhvc3Qga2V5IGNoZWNraW5nLiAgV2UKKwkJCSAqIHdpbGwgbm90IGFkZCB0aGUgaG9zdCBrZXkgYXV0b21hdGljYWxseS4gIFRoZSBvbmx5CisJCQkgKiBhbHRlcm5hdGl2ZSBsZWZ0IGlzIHRvIGFib3J0LgorCQkJICovCisJCQllcnJvcigiTm8gJXMgaG9zdCBrZXkgaXMga25vd24gZm9yICUuMjAwcyBhbmQgeW91ICIKKwkJCSAgICAiaGF2ZSByZXF1ZXN0ZWQgc3RyaWN0IGNoZWNraW5nLiIsIHR5cGUsIGhvc3QpOworCQkJZ290byBmYWlsOworCQl9IGVsc2UgaWYgKG9wdGlvbnMuc3RyaWN0X2hvc3Rfa2V5X2NoZWNraW5nID09IDIpIHsKKwkJCWNoYXIgbXNnMVsxMDI0XSwgbXNnMlsxMDI0XTsKKworCQkJaWYgKHNob3dfb3RoZXJfa2V5cyhob3N0X2hvc3RrZXlzLCBob3N0X2tleSkpCisJCQkJc25wcmludGYobXNnMSwgc2l6ZW9mKG1zZzEpLAorCQkJCSAgICAiXG5idXQga2V5cyBvZiBkaWZmZXJlbnQgdHlwZSBhcmUgYWxyZWFkeSIKKwkJCQkgICAgIiBrbm93biBmb3IgdGhpcyBob3N0LiIpOworCQkJZWxzZQorCQkJCXNucHJpbnRmKG1zZzEsIHNpemVvZihtc2cxKSwgIi4iKTsKKwkJCS8qIFRoZSBkZWZhdWx0ICovCisJCQlmcCA9IGtleV9maW5nZXJwcmludChob3N0X2tleSwgU1NIX0ZQX01ENSwgU1NIX0ZQX0hFWCk7CisJCQlyYSA9IGtleV9maW5nZXJwcmludChob3N0X2tleSwgU1NIX0ZQX01ENSwKKwkJCSAgICBTU0hfRlBfUkFORE9NQVJUKTsKKwkJCW1zZzJbMF0gPSAnXDAnOworCQkJaWYgKG9wdGlvbnMudmVyaWZ5X2hvc3Rfa2V5X2RucykgeworCQkJCWlmIChtYXRjaGluZ19ob3N0X2tleV9kbnMpCisJCQkJCXNucHJpbnRmKG1zZzIsIHNpemVvZihtc2cyKSwKKwkJCQkJICAgICJNYXRjaGluZyBob3N0IGtleSBmaW5nZXJwcmludCIKKwkJCQkJICAgICIgZm91bmQgaW4gRE5TLlxuIik7CisJCQkJZWxzZQorCQkJCQlzbnByaW50Zihtc2cyLCBzaXplb2YobXNnMiksCisJCQkJCSAgICAiTm8gbWF0Y2hpbmcgaG9zdCBrZXkgZmluZ2VycHJpbnQiCisJCQkJCSAgICAiIGZvdW5kIGluIEROUy5cbiIpOworCQkJfQorCQkJc25wcmludGYobXNnLCBzaXplb2YobXNnKSwKKwkJCSAgICAiVGhlIGF1dGhlbnRpY2l0eSBvZiBob3N0ICclLjIwMHMgKCVzKScgY2FuJ3QgYmUgIgorCQkJICAgICJlc3RhYmxpc2hlZCVzXG4iCisJCQkgICAgIiVzIGtleSBmaW5nZXJwcmludCBpcyAlcy4lcyVzXG4lcyIKKwkJCSAgICAiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlIGNvbm5lY3RpbmcgIgorCQkJICAgICIoeWVzL25vKT8gIiwKKwkJCSAgICBob3N0LCBpcCwgbXNnMSwgdHlwZSwgZnAsCisJCQkgICAgb3B0aW9ucy52aXN1YWxfaG9zdF9rZXkgPyAiXG4iIDogIiIsCisJCQkgICAgb3B0aW9ucy52aXN1YWxfaG9zdF9rZXkgPyByYSA6ICIiLAorCQkJICAgIG1zZzIpOworCQkJeGZyZWUocmEpOworCQkJeGZyZWUoZnApOworCQkJaWYgKCFjb25maXJtKG1zZykpCisJCQkJZ290byBmYWlsOworCQl9CisJCS8qCisJCSAqIElmIG5vdCBpbiBzdHJpY3QgbW9kZSwgYWRkIHRoZSBrZXkgYXV0b21hdGljYWxseSB0byB0aGUKKwkJICogbG9jYWwga25vd25faG9zdHMgZmlsZS4KKwkJICovCisJCWlmIChvcHRpb25zLmNoZWNrX2hvc3RfaXAgJiYgaXBfc3RhdHVzID09IEhPU1RfTkVXKSB7CisJCQlzbnByaW50Zihob3N0bGluZSwgc2l6ZW9mKGhvc3RsaW5lKSwgIiVzLCVzIiwgaG9zdCwgaXApOworCQkJaG9zdHAgPSBob3N0bGluZTsKKwkJCWlmIChvcHRpb25zLmhhc2hfa25vd25faG9zdHMpIHsKKwkJCQkvKiBBZGQgaGFzaCBvZiBob3N0IGFuZCBJUCBzZXBhcmF0ZWx5ICovCisJCQkJciA9IGFkZF9ob3N0X3RvX2hvc3RmaWxlKHVzZXJfaG9zdGZpbGVzWzBdLAorCQkJCSAgICBob3N0LCBob3N0X2tleSwgb3B0aW9ucy5oYXNoX2tub3duX2hvc3RzKSAmJgorCQkJCSAgICBhZGRfaG9zdF90b19ob3N0ZmlsZSh1c2VyX2hvc3RmaWxlc1swXSwgaXAsCisJCQkJICAgIGhvc3Rfa2V5LCBvcHRpb25zLmhhc2hfa25vd25faG9zdHMpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBBZGQgdW5oYXNoZWQgImhvc3QsaXAiICovCisJCQkJciA9IGFkZF9ob3N0X3RvX2hvc3RmaWxlKHVzZXJfaG9zdGZpbGVzWzBdLAorCQkJCSAgICBob3N0bGluZSwgaG9zdF9rZXksCisJCQkJICAgIG9wdGlvbnMuaGFzaF9rbm93bl9ob3N0cyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyID0gYWRkX2hvc3RfdG9faG9zdGZpbGUodXNlcl9ob3N0ZmlsZXNbMF0sIGhvc3QsCisJCQkgICAgaG9zdF9rZXksIG9wdGlvbnMuaGFzaF9rbm93bl9ob3N0cyk7CisJCQlob3N0cCA9IGhvc3Q7CisJCX0KKworCQlpZiAoIXIpCisJCQlsb2dpdCgiRmFpbGVkIHRvIGFkZCB0aGUgaG9zdCB0byB0aGUgbGlzdCBvZiBrbm93biAiCisJCQkgICAgImhvc3RzICglLjUwMHMpLiIsIHVzZXJfaG9zdGZpbGVzWzBdKTsKKwkJZWxzZQorCQkJbG9naXQoIldhcm5pbmc6IFBlcm1hbmVudGx5IGFkZGVkICclLjIwMHMnICglcykgdG8gdGhlICIKKwkJCSAgICAibGlzdCBvZiBrbm93biBob3N0cy4iLCBob3N0cCwgdHlwZSk7CisJCWJyZWFrOworCWNhc2UgSE9TVF9SRVZPS0VEOgorCQllcnJvcigiQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAiKTsKKwkJZXJyb3IoIkAgICAgICAgV0FSTklORzogUkVWT0tFRCBIT1NUIEtFWSBERVRFQ1RFRCEgICAgICAgICAgICAgICBAIik7CisJCWVycm9yKCJAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCIpOworCQllcnJvcigiVGhlICVzIGhvc3Qga2V5IGZvciAlcyBpcyBtYXJrZWQgYXMgcmV2b2tlZC4iLCB0eXBlLCBob3N0KTsKKwkJZXJyb3IoIlRoaXMgY291bGQgbWVhbiB0aGF0IGEgc3RvbGVuIGtleSBpcyBiZWluZyB1c2VkIHRvIik7CisJCWVycm9yKCJpbXBlcnNvbmF0ZSB0aGlzIGhvc3QuIik7CisKKwkJLyoKKwkJICogSWYgc3RyaWN0IGhvc3Qga2V5IGNoZWNraW5nIGlzIGluIHVzZSwgdGhlIHVzZXIgd2lsbCBoYXZlCisJCSAqIHRvIGVkaXQgdGhlIGtleSBtYW51YWxseSBhbmQgd2UgY2FuIG9ubHkgYWJvcnQuCisJCSAqLworCQlpZiAob3B0aW9ucy5zdHJpY3RfaG9zdF9rZXlfY2hlY2tpbmcpIHsKKwkJCWVycm9yKCIlcyBob3N0IGtleSBmb3IgJS4yMDBzIHdhcyByZXZva2VkIGFuZCB5b3UgaGF2ZSAiCisJCQkgICAgInJlcXVlc3RlZCBzdHJpY3QgY2hlY2tpbmcuIiwgdHlwZSwgaG9zdCk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJZ290byBjb250aW51ZV91bnNhZmU7CisKKwljYXNlIEhPU1RfQ0hBTkdFRDoKKwkJaWYgKHdhbnRfY2VydCkgeworCQkJLyoKKwkJCSAqIFRoaXMgaXMgb25seSBhIGRlYnVnKCkgc2luY2UgaXQgaXMgdmFsaWQgdG8gaGF2ZQorCQkJICogQ0FzIHdpdGggd2lsZGNhcmQgRE5TIG1hdGNoZXMgdGhhdCBkb24ndCBtYXRjaAorCQkJICogYWxsIGhvc3RzIHRoYXQgb25lIG1pZ2h0IHZpc2l0LgorCQkJICovCisJCQlkZWJ1ZygiSG9zdCBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkgZG9lcyBub3QgIgorCQkJICAgICJtYXRjaCAlcyBpbiAlczolbHUiLCBDQV9NQVJLRVIsCisJCQkgICAgaG9zdF9mb3VuZC0+ZmlsZSwgaG9zdF9mb3VuZC0+bGluZSk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJaWYgKHJlYWRvbmx5ID09IFJPUVVJRVQpCisJCQlnb3RvIGZhaWw7CisJCWlmIChvcHRpb25zLmNoZWNrX2hvc3RfaXAgJiYgaG9zdF9pcF9kaWZmZXIpIHsKKwkJCWNoYXIgKmtleV9tc2c7CisJCQlpZiAoaXBfc3RhdHVzID09IEhPU1RfTkVXKQorCQkJCWtleV9tc2cgPSAiaXMgdW5rbm93biI7CisJCQllbHNlIGlmIChpcF9zdGF0dXMgPT0gSE9TVF9PSykKKwkJCQlrZXlfbXNnID0gImlzIHVuY2hhbmdlZCI7CisJCQllbHNlCisJCQkJa2V5X21zZyA9ICJoYXMgYSBkaWZmZXJlbnQgdmFsdWUiOworCQkJZXJyb3IoIkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIik7CisJCQllcnJvcigiQCAgICAgICBXQVJOSU5HOiBQT1NTSUJMRSBETlMgU1BPT0ZJTkcgREVURUNURUQhICAgICAgICAgIEAiKTsKKwkJCWVycm9yKCJAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCIpOworCQkJZXJyb3IoIlRoZSAlcyBob3N0IGtleSBmb3IgJXMgaGFzIGNoYW5nZWQsIiwgdHlwZSwgaG9zdCk7CisJCQllcnJvcigiYW5kIHRoZSBrZXkgZm9yIHRoZSBjb3JyZXNwb25kaW5nIElQIGFkZHJlc3MgJXMiLCBpcCk7CisJCQllcnJvcigiJXMuIFRoaXMgY291bGQgZWl0aGVyIG1lYW4gdGhhdCIsIGtleV9tc2cpOworCQkJZXJyb3IoIkROUyBTUE9PRklORyBpcyBoYXBwZW5pbmcgb3IgdGhlIElQIGFkZHJlc3MgZm9yIHRoZSBob3N0Iik7CisJCQllcnJvcigiYW5kIGl0cyBob3N0IGtleSBoYXZlIGNoYW5nZWQgYXQgdGhlIHNhbWUgdGltZS4iKTsKKwkJCWlmIChpcF9zdGF0dXMgIT0gSE9TVF9ORVcpCisJCQkJZXJyb3IoIk9mZmVuZGluZyBrZXkgZm9yIElQIGluICVzOiVsdSIsCisJCQkJICAgIGlwX2ZvdW5kLT5maWxlLCBpcF9mb3VuZC0+bGluZSk7CisJCX0KKwkJLyogVGhlIGhvc3Qga2V5IGhhcyBjaGFuZ2VkLiAqLworCQl3YXJuX2NoYW5nZWRfa2V5KGhvc3Rfa2V5KTsKKwkJZXJyb3IoIkFkZCBjb3JyZWN0IGhvc3Qga2V5IGluICUuMTAwcyB0byBnZXQgcmlkIG9mIHRoaXMgbWVzc2FnZS4iLAorCQkgICAgdXNlcl9ob3N0ZmlsZXNbMF0pOworCQllcnJvcigiT2ZmZW5kaW5nICVzIGtleSBpbiAlczolbHUiLCBrZXlfdHlwZShob3N0X2ZvdW5kLT5rZXkpLAorCQkgICAgaG9zdF9mb3VuZC0+ZmlsZSwgaG9zdF9mb3VuZC0+bGluZSk7CisKKwkJLyoKKwkJICogSWYgc3RyaWN0IGhvc3Qga2V5IGNoZWNraW5nIGlzIGluIHVzZSwgdGhlIHVzZXIgd2lsbCBoYXZlCisJCSAqIHRvIGVkaXQgdGhlIGtleSBtYW51YWxseSBhbmQgd2UgY2FuIG9ubHkgYWJvcnQuCisJCSAqLworCQlpZiAob3B0aW9ucy5zdHJpY3RfaG9zdF9rZXlfY2hlY2tpbmcpIHsKKwkJCWVycm9yKCIlcyBob3N0IGtleSBmb3IgJS4yMDBzIGhhcyBjaGFuZ2VkIGFuZCB5b3UgaGF2ZSAiCisJCQkgICAgInJlcXVlc3RlZCBzdHJpY3QgY2hlY2tpbmcuIiwgdHlwZSwgaG9zdCk7CisJCQlnb3RvIGZhaWw7CisJCX0KKworIGNvbnRpbnVlX3Vuc2FmZToKKwkJLyoKKwkJICogSWYgc3RyaWN0IGhvc3Qga2V5IGNoZWNraW5nIGhhcyBub3QgYmVlbiByZXF1ZXN0ZWQsIGFsbG93CisJCSAqIHRoZSBjb25uZWN0aW9uIGJ1dCB3aXRob3V0IE1JVE0tYWJsZSBhdXRoZW50aWNhdGlvbiBvcgorCQkgKiBmb3J3YXJkaW5nLgorCQkgKi8KKwkJaWYgKG9wdGlvbnMucGFzc3dvcmRfYXV0aGVudGljYXRpb24pIHsKKwkJCWVycm9yKCJQYXNzd29yZCBhdXRoZW50aWNhdGlvbiBpcyBkaXNhYmxlZCB0byBhdm9pZCAiCisJCQkgICAgIm1hbi1pbi10aGUtbWlkZGxlIGF0dGFja3MuIik7CisJCQlvcHRpb25zLnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uID0gMDsKKwkJCWNhbmNlbGxlZF9mb3J3YXJkaW5nID0gMTsKKwkJfQorCQlpZiAob3B0aW9ucy5rYmRfaW50ZXJhY3RpdmVfYXV0aGVudGljYXRpb24pIHsKKwkJCWVycm9yKCJLZXlib2FyZC1pbnRlcmFjdGl2ZSBhdXRoZW50aWNhdGlvbiBpcyBkaXNhYmxlZCIKKwkJCSAgICAiIHRvIGF2b2lkIG1hbi1pbi10aGUtbWlkZGxlIGF0dGFja3MuIik7CisJCQlvcHRpb25zLmtiZF9pbnRlcmFjdGl2ZV9hdXRoZW50aWNhdGlvbiA9IDA7CisJCQlvcHRpb25zLmNoYWxsZW5nZV9yZXNwb25zZV9hdXRoZW50aWNhdGlvbiA9IDA7CisJCQljYW5jZWxsZWRfZm9yd2FyZGluZyA9IDE7CisJCX0KKwkJaWYgKG9wdGlvbnMuY2hhbGxlbmdlX3Jlc3BvbnNlX2F1dGhlbnRpY2F0aW9uKSB7CisJCQllcnJvcigiQ2hhbGxlbmdlL3Jlc3BvbnNlIGF1dGhlbnRpY2F0aW9uIGlzIGRpc2FibGVkIgorCQkJICAgICIgdG8gYXZvaWQgbWFuLWluLXRoZS1taWRkbGUgYXR0YWNrcy4iKTsKKwkJCW9wdGlvbnMuY2hhbGxlbmdlX3Jlc3BvbnNlX2F1dGhlbnRpY2F0aW9uID0gMDsKKwkJCWNhbmNlbGxlZF9mb3J3YXJkaW5nID0gMTsKKwkJfQorCQlpZiAob3B0aW9ucy5mb3J3YXJkX2FnZW50KSB7CisJCQllcnJvcigiQWdlbnQgZm9yd2FyZGluZyBpcyBkaXNhYmxlZCB0byBhdm9pZCAiCisJCQkgICAgIm1hbi1pbi10aGUtbWlkZGxlIGF0dGFja3MuIik7CisJCQlvcHRpb25zLmZvcndhcmRfYWdlbnQgPSAwOworCQkJY2FuY2VsbGVkX2ZvcndhcmRpbmcgPSAxOworCQl9CisJCWlmIChvcHRpb25zLmZvcndhcmRfeDExKSB7CisJCQllcnJvcigiWDExIGZvcndhcmRpbmcgaXMgZGlzYWJsZWQgdG8gYXZvaWQgIgorCQkJICAgICJtYW4taW4tdGhlLW1pZGRsZSBhdHRhY2tzLiIpOworCQkJb3B0aW9ucy5mb3J3YXJkX3gxMSA9IDA7CisJCQljYW5jZWxsZWRfZm9yd2FyZGluZyA9IDE7CisJCX0KKwkJaWYgKG9wdGlvbnMubnVtX2xvY2FsX2ZvcndhcmRzID4gMCB8fAorCQkgICAgb3B0aW9ucy5udW1fcmVtb3RlX2ZvcndhcmRzID4gMCkgeworCQkJZXJyb3IoIlBvcnQgZm9yd2FyZGluZyBpcyBkaXNhYmxlZCB0byBhdm9pZCAiCisJCQkgICAgIm1hbi1pbi10aGUtbWlkZGxlIGF0dGFja3MuIik7CisJCQlvcHRpb25zLm51bV9sb2NhbF9mb3J3YXJkcyA9CisJCQkgICAgb3B0aW9ucy5udW1fcmVtb3RlX2ZvcndhcmRzID0gMDsKKwkJCWNhbmNlbGxlZF9mb3J3YXJkaW5nID0gMTsKKwkJfQorCQlpZiAob3B0aW9ucy50dW5fb3BlbiAhPSBTU0hfVFVOTU9ERV9OTykgeworCQkJZXJyb3IoIlR1bm5lbCBmb3J3YXJkaW5nIGlzIGRpc2FibGVkIHRvIGF2b2lkICIKKwkJCSAgICAibWFuLWluLXRoZS1taWRkbGUgYXR0YWNrcy4iKTsKKwkJCW9wdGlvbnMudHVuX29wZW4gPSBTU0hfVFVOTU9ERV9OTzsKKwkJCWNhbmNlbGxlZF9mb3J3YXJkaW5nID0gMTsKKwkJfQorCQlpZiAob3B0aW9ucy5leGl0X29uX2ZvcndhcmRfZmFpbHVyZSAmJiBjYW5jZWxsZWRfZm9yd2FyZGluZykKKwkJCWZhdGFsKCJFcnJvcjogZm9yd2FyZGluZyBkaXNhYmxlZCBkdWUgdG8gaG9zdCBrZXkgIgorCQkJICAgICJjaGVjayBmYWlsdXJlIik7CisJCQorCQkvKgorCQkgKiBYWFggU2hvdWxkIHBlcm1pdCB0aGUgdXNlciB0byBjaGFuZ2UgdG8gdXNlIHRoZSBuZXcgaWQuCisJCSAqIFRoaXMgY291bGQgYmUgZG9uZSBieSBjb252ZXJ0aW5nIHRoZSBob3N0IGtleSB0byBhbgorCQkgKiBpZGVudGlmeWluZyBzZW50ZW5jZSwgdGVsbCB0aGF0IHRoZSBob3N0IGlkZW50aWZpZXMgaXRzZWxmCisJCSAqIGJ5IHRoYXQgc2VudGVuY2UsIGFuZCBhc2sgdGhlIHVzZXIgaWYgaGUvc2hlIHdpc2hlcyB0bworCQkgKiBhY2NlcHQgdGhlIGF1dGhlbnRpY2F0aW9uLgorCQkgKi8KKwkJYnJlYWs7CisJY2FzZSBIT1NUX0ZPVU5EOgorCQlmYXRhbCgiaW50ZXJuYWwgZXJyb3IiKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKG9wdGlvbnMuY2hlY2tfaG9zdF9pcCAmJiBob3N0X3N0YXR1cyAhPSBIT1NUX0NIQU5HRUQgJiYKKwkgICAgaXBfc3RhdHVzID09IEhPU1RfQ0hBTkdFRCkgeworCQlzbnByaW50Zihtc2csIHNpemVvZihtc2cpLAorCQkgICAgIldhcm5pbmc6IHRoZSAlcyBob3N0IGtleSBmb3IgJyUuMjAwcycgIgorCQkgICAgImRpZmZlcnMgZnJvbSB0aGUga2V5IGZvciB0aGUgSVAgYWRkcmVzcyAnJS4xMjhzJyIKKwkJICAgICJcbk9mZmVuZGluZyBrZXkgZm9yIElQIGluICVzOiVsdSIsCisJCSAgICB0eXBlLCBob3N0LCBpcCwgaXBfZm91bmQtPmZpbGUsIGlwX2ZvdW5kLT5saW5lKTsKKwkJaWYgKGhvc3Rfc3RhdHVzID09IEhPU1RfT0spIHsKKwkJCWxlbiA9IHN0cmxlbihtc2cpOworCQkJc25wcmludGYobXNnICsgbGVuLCBzaXplb2YobXNnKSAtIGxlbiwKKwkJCSAgICAiXG5NYXRjaGluZyBob3N0IGtleSBpbiAlczolbHUiLAorCQkJICAgIGhvc3RfZm91bmQtPmZpbGUsIGhvc3RfZm91bmQtPmxpbmUpOworCQl9CisJCWlmIChvcHRpb25zLnN0cmljdF9ob3N0X2tleV9jaGVja2luZyA9PSAxKSB7CisJCQlsb2dpdCgiJXMiLCBtc2cpOworCQkJZXJyb3IoIkV4aXRpbmcsIHlvdSBoYXZlIHJlcXVlc3RlZCBzdHJpY3QgY2hlY2tpbmcuIik7CisJCQlnb3RvIGZhaWw7CisJCX0gZWxzZSBpZiAob3B0aW9ucy5zdHJpY3RfaG9zdF9rZXlfY2hlY2tpbmcgPT0gMikgeworCQkJc3RybGNhdChtc2csICJcbkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCAiCisJCQkgICAgInRvIGNvbnRpbnVlIGNvbm5lY3RpbmcgKHllcy9ubyk/ICIsIHNpemVvZihtc2cpKTsKKwkJCWlmICghY29uZmlybShtc2cpKQorCQkJCWdvdG8gZmFpbDsKKwkJfSBlbHNlIHsKKwkJCWxvZ2l0KCIlcyIsIG1zZyk7CisJCX0KKwl9CisKKwl4ZnJlZShpcCk7CisJeGZyZWUoaG9zdCk7CisJaWYgKGhvc3RfaG9zdGtleXMgIT0gTlVMTCkKKwkJZnJlZV9ob3N0a2V5cyhob3N0X2hvc3RrZXlzKTsKKwlpZiAoaXBfaG9zdGtleXMgIT0gTlVMTCkKKwkJZnJlZV9ob3N0a2V5cyhpcF9ob3N0a2V5cyk7CisJcmV0dXJuIDA7CisKK2ZhaWw6CisJaWYgKHdhbnRfY2VydCAmJiBob3N0X3N0YXR1cyAhPSBIT1NUX1JFVk9LRUQpIHsKKwkJLyoKKwkJICogTm8gbWF0Y2hpbmcgY2VydGlmaWNhdGUuIERvd25ncmFkZSBjZXJ0IHRvIHJhdyBrZXkgYW5kCisJCSAqIHNlYXJjaCBub3JtYWxseS4KKwkJICovCisJCWRlYnVnKCJObyBtYXRjaGluZyBDQSBmb3VuZC4gUmV0cnkgd2l0aCBwbGFpbiBrZXkiKTsKKwkJcmF3X2tleSA9IGtleV9mcm9tX3ByaXZhdGUoaG9zdF9rZXkpOworCQlpZiAoa2V5X2Ryb3BfY2VydChyYXdfa2V5KSAhPSAwKQorCQkJZmF0YWwoIkNvdWxkbid0IGRyb3AgY2VydGlmaWNhdGUiKTsKKwkJaG9zdF9rZXkgPSByYXdfa2V5OworCQlnb3RvIHJldHJ5OworCX0KKwlpZiAocmF3X2tleSAhPSBOVUxMKQorCQlrZXlfZnJlZShyYXdfa2V5KTsKKwl4ZnJlZShpcCk7CisJeGZyZWUoaG9zdCk7CisJaWYgKGhvc3RfaG9zdGtleXMgIT0gTlVMTCkKKwkJZnJlZV9ob3N0a2V5cyhob3N0X2hvc3RrZXlzKTsKKwlpZiAoaXBfaG9zdGtleXMgIT0gTlVMTCkKKwkJZnJlZV9ob3N0a2V5cyhpcF9ob3N0a2V5cyk7CisJcmV0dXJuIC0xOworfQorCisvKiByZXR1cm5zIDAgaWYga2V5IHZlcmlmaWVzIG9yIC0xIGlmIGtleSBkb2VzIE5PVCB2ZXJpZnkgKi8KK2ludAordmVyaWZ5X2hvc3Rfa2V5KGNoYXIgKmhvc3QsIHN0cnVjdCBzb2NrYWRkciAqaG9zdGFkZHIsIEtleSAqaG9zdF9rZXkpCit7CisJaW50IGZsYWdzID0gMDsKKwljaGFyICpmcDsKKworCWZwID0ga2V5X2ZpbmdlcnByaW50KGhvc3Rfa2V5LCBTU0hfRlBfTUQ1LCBTU0hfRlBfSEVYKTsKKwlkZWJ1ZygiU2VydmVyIGhvc3Qga2V5OiAlcyAlcyIsIGtleV90eXBlKGhvc3Rfa2V5KSwgZnApOworCXhmcmVlKGZwKTsKKworCS8qIFhYWCBjZXJ0cyBhcmUgbm90IHlldCBzdXBwb3J0ZWQgZm9yIEROUyAqLworCWlmICgha2V5X2lzX2NlcnQoaG9zdF9rZXkpICYmIG9wdGlvbnMudmVyaWZ5X2hvc3Rfa2V5X2RucyAmJgorCSAgICB2ZXJpZnlfaG9zdF9rZXlfZG5zKGhvc3QsIGhvc3RhZGRyLCBob3N0X2tleSwgJmZsYWdzKSA9PSAwKSB7CisJCWlmIChmbGFncyAmIEROU19WRVJJRllfRk9VTkQpIHsKKworCQkJaWYgKG9wdGlvbnMudmVyaWZ5X2hvc3Rfa2V5X2RucyA9PSAxICYmCisJCQkgICAgZmxhZ3MgJiBETlNfVkVSSUZZX01BVENIICYmCisJCQkgICAgZmxhZ3MgJiBETlNfVkVSSUZZX1NFQ1VSRSkKKwkJCQlyZXR1cm4gMDsKKworCQkJaWYgKGZsYWdzICYgRE5TX1ZFUklGWV9NQVRDSCkgeworCQkJCW1hdGNoaW5nX2hvc3Rfa2V5X2RucyA9IDE7CisJCQl9IGVsc2UgeworCQkJCXdhcm5fY2hhbmdlZF9rZXkoaG9zdF9rZXkpOworCQkJCWVycm9yKCJVcGRhdGUgdGhlIFNTSEZQIFJSIGluIEROUyB3aXRoIHRoZSBuZXcgIgorCQkJCSAgICAiaG9zdCBrZXkgdG8gZ2V0IHJpZCBvZiB0aGlzIG1lc3NhZ2UuIik7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gY2hlY2tfaG9zdF9rZXkoaG9zdCwgaG9zdGFkZHIsIG9wdGlvbnMucG9ydCwgaG9zdF9rZXksIFJEUlcsCisJICAgIG9wdGlvbnMudXNlcl9ob3N0ZmlsZXMsIG9wdGlvbnMubnVtX3VzZXJfaG9zdGZpbGVzLAorCSAgICBvcHRpb25zLnN5c3RlbV9ob3N0ZmlsZXMsIG9wdGlvbnMubnVtX3N5c3RlbV9ob3N0ZmlsZXMpOworfQorCisvKgorICogU3RhcnRzIGEgZGlhbG9nIHdpdGggdGhlIHNlcnZlciwgYW5kIGF1dGhlbnRpY2F0ZXMgdGhlIGN1cnJlbnQgdXNlciBvbiB0aGUKKyAqIHNlcnZlci4gIFRoaXMgZG9lcyBub3QgbmVlZCBhbnkgZXh0cmEgcHJpdmlsZWdlcy4gIFRoZSBiYXNpYyBjb25uZWN0aW9uCisgKiB0byB0aGUgc2VydmVyIG11c3QgYWxyZWFkeSBoYXZlIGJlZW4gZXN0YWJsaXNoZWQgYmVmb3JlIHRoaXMgaXMgY2FsbGVkLgorICogSWYgbG9naW4gZmFpbHMsIHRoaXMgZnVuY3Rpb24gcHJpbnRzIGFuIGVycm9yIGFuZCBuZXZlciByZXR1cm5zLgorICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXF1aXJlIHN1cGVyLXVzZXIgcHJpdmlsZWdlcy4KKyAqLwordm9pZAorc3NoX2xvZ2luKFNlbnNpdGl2ZSAqc2Vuc2l0aXZlLCBjb25zdCBjaGFyICpvcmlnaG9zdCwKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgKmhvc3RhZGRyLCB1X3Nob3J0IHBvcnQsIHN0cnVjdCBwYXNzd2QgKnB3LCBpbnQgdGltZW91dF9tcykKK3sKKwljaGFyICpob3N0LCAqY3A7CisJY2hhciAqc2VydmVyX3VzZXIsICpsb2NhbF91c2VyOworCisJbG9jYWxfdXNlciA9IHhzdHJkdXAocHctPnB3X25hbWUpOworCXNlcnZlcl91c2VyID0gb3B0aW9ucy51c2VyID8gb3B0aW9ucy51c2VyIDogbG9jYWxfdXNlcjsKKworCS8qIENvbnZlcnQgdGhlIHVzZXItc3VwcGxpZWQgaG9zdG5hbWUgaW50byBhbGwgbG93ZXJjYXNlLiAqLworCWhvc3QgPSB4c3RyZHVwKG9yaWdob3N0KTsKKwlmb3IgKGNwID0gaG9zdDsgKmNwOyBjcCsrKQorCQlpZiAoaXN1cHBlcigqY3ApKQorCQkJKmNwID0gKGNoYXIpdG9sb3dlcigqY3ApOworCisJLyogRXhjaGFuZ2UgcHJvdG9jb2wgdmVyc2lvbiBpZGVudGlmaWNhdGlvbiBzdHJpbmdzIHdpdGggdGhlIHNlcnZlci4gKi8KKwlzc2hfZXhjaGFuZ2VfaWRlbnRpZmljYXRpb24odGltZW91dF9tcyk7CisKKwkvKiBQdXQgdGhlIGNvbm5lY3Rpb24gaW50byBub24tYmxvY2tpbmcgbW9kZS4gKi8KKwlwYWNrZXRfc2V0X25vbmJsb2NraW5nKCk7CisKKwkvKiBrZXkgZXhjaGFuZ2UgKi8KKwkvKiBhdXRoZW50aWNhdGUgdXNlciAqLworCWlmIChjb21wYXQyMCkgeworCQlzc2hfa2V4Mihob3N0LCBob3N0YWRkciwgcG9ydCk7CisJCXNzaF91c2VyYXV0aDIobG9jYWxfdXNlciwgc2VydmVyX3VzZXIsIGhvc3QsIHNlbnNpdGl2ZSk7CisJfSBlbHNlIHsKKwkJc3NoX2tleChob3N0LCBob3N0YWRkcik7CisJCXNzaF91c2VyYXV0aDEobG9jYWxfdXNlciwgc2VydmVyX3VzZXIsIGhvc3QsIHNlbnNpdGl2ZSk7CisJfQorCXhmcmVlKGxvY2FsX3VzZXIpOworfQorCit2b2lkCitzc2hfcHV0X3Bhc3N3b3JkKGNoYXIgKnBhc3N3b3JkKQoreworCWludCBzaXplOworCWNoYXIgKnBhZGRlZDsKKworCWlmIChkYXRhZmVsbG93cyAmIFNTSF9CVUdfUEFTU1dPUkRQQUQpIHsKKwkJcGFja2V0X3B1dF9jc3RyaW5nKHBhc3N3b3JkKTsKKwkJcmV0dXJuOworCX0KKwlzaXplID0gcm91bmR1cChzdHJsZW4ocGFzc3dvcmQpICsgMSwgMzIpOworCXBhZGRlZCA9IHhjYWxsb2MoMSwgc2l6ZSk7CisJc3RybGNweShwYWRkZWQsIHBhc3N3b3JkLCBzaXplKTsKKwlwYWNrZXRfcHV0X3N0cmluZyhwYWRkZWQsIHNpemUpOworCW1lbXNldChwYWRkZWQsIDAsIHNpemUpOworCXhmcmVlKHBhZGRlZCk7Cit9CisKKy8qIHByaW50IGFsbCBrbm93biBob3N0IGtleXMgZm9yIGEgZ2l2ZW4gaG9zdCwgYnV0IHNraXAga2V5cyBvZiBnaXZlbiB0eXBlICovCitzdGF0aWMgaW50CitzaG93X290aGVyX2tleXMoc3RydWN0IGhvc3RrZXlzICpob3N0a2V5cywgS2V5ICprZXkpCit7CisJaW50IHR5cGVbXSA9IHsgS0VZX1JTQTEsIEtFWV9SU0EsIEtFWV9EU0EsIEtFWV9FQ0RTQSwgLTF9OworCWludCBpLCByZXQgPSAwOworCWNoYXIgKmZwLCAqcmE7CisJY29uc3Qgc3RydWN0IGhvc3RrZXlfZW50cnkgKmZvdW5kOworCisJZm9yIChpID0gMDsgdHlwZVtpXSAhPSAtMTsgaSsrKSB7CisJCWlmICh0eXBlW2ldID09IGtleS0+dHlwZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWxvb2t1cF9rZXlfaW5faG9zdGtleXNfYnlfdHlwZShob3N0a2V5cywgdHlwZVtpXSwgJmZvdW5kKSkKKwkJCWNvbnRpbnVlOworCQlmcCA9IGtleV9maW5nZXJwcmludChmb3VuZC0+a2V5LCBTU0hfRlBfTUQ1LCBTU0hfRlBfSEVYKTsKKwkJcmEgPSBrZXlfZmluZ2VycHJpbnQoZm91bmQtPmtleSwgU1NIX0ZQX01ENSwgU1NIX0ZQX1JBTkRPTUFSVCk7CisJCWxvZ2l0KCJXQVJOSU5HOiAlcyBrZXkgZm91bmQgZm9yIGhvc3QgJXNcbiIKKwkJICAgICJpbiAlczolbHVcbiIKKwkJICAgICIlcyBrZXkgZmluZ2VycHJpbnQgJXMuIiwKKwkJICAgIGtleV90eXBlKGZvdW5kLT5rZXkpLAorCQkgICAgZm91bmQtPmhvc3QsIGZvdW5kLT5maWxlLCBmb3VuZC0+bGluZSwKKwkJICAgIGtleV90eXBlKGZvdW5kLT5rZXkpLCBmcCk7CisJCWlmIChvcHRpb25zLnZpc3VhbF9ob3N0X2tleSkKKwkJCWxvZ2l0KCIlcyIsIHJhKTsKKwkJeGZyZWUocmEpOworCQl4ZnJlZShmcCk7CisJCXJldCA9IDE7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCit3YXJuX2NoYW5nZWRfa2V5KEtleSAqaG9zdF9rZXkpCit7CisJY2hhciAqZnA7CisKKwlmcCA9IGtleV9maW5nZXJwcmludChob3N0X2tleSwgU1NIX0ZQX01ENSwgU1NIX0ZQX0hFWCk7CisKKwllcnJvcigiQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAiKTsKKwllcnJvcigiQCAgICBXQVJOSU5HOiBSRU1PVEUgSE9TVCBJREVOVElGSUNBVElPTiBIQVMgQ0hBTkdFRCEgICAgIEAiKTsKKwllcnJvcigiQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAiKTsKKwllcnJvcigiSVQgSVMgUE9TU0lCTEUgVEhBVCBTT01FT05FIElTIERPSU5HIFNPTUVUSElORyBOQVNUWSEiKTsKKwllcnJvcigiU29tZW9uZSBjb3VsZCBiZSBlYXZlc2Ryb3BwaW5nIG9uIHlvdSByaWdodCBub3cgKG1hbi1pbi10aGUtbWlkZGxlIGF0dGFjaykhIik7CisJZXJyb3IoIkl0IGlzIGFsc28gcG9zc2libGUgdGhhdCBhIGhvc3Qga2V5IGhhcyBqdXN0IGJlZW4gY2hhbmdlZC4iKTsKKwllcnJvcigiVGhlIGZpbmdlcnByaW50IGZvciB0aGUgJXMga2V5IHNlbnQgYnkgdGhlIHJlbW90ZSBob3N0IGlzXG4lcy4iLAorCSAgICBrZXlfdHlwZShob3N0X2tleSksIGZwKTsKKwllcnJvcigiUGxlYXNlIGNvbnRhY3QgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvci4iKTsKKworCXhmcmVlKGZwKTsKK30KKworLyoKKyAqIEV4ZWN1dGUgYSBsb2NhbCBjb21tYW5kCisgKi8KK2ludAorc3NoX2xvY2FsX2NtZChjb25zdCBjaGFyICphcmdzKQoreworCWNoYXIgKnNoZWxsOworCXBpZF90IHBpZDsKKwlpbnQgc3RhdHVzOworCXZvaWQgKCpvc2lnaGFuZCkoaW50KTsKKworCWlmICghb3B0aW9ucy5wZXJtaXRfbG9jYWxfY29tbWFuZCB8fAorCSAgICBhcmdzID09IE5VTEwgfHwgISphcmdzKQorCQlyZXR1cm4gKDEpOworCisJaWYgKChzaGVsbCA9IGdldGVudigiU0hFTEwiKSkgPT0gTlVMTCB8fCAqc2hlbGwgPT0gJ1wwJykKKwkJc2hlbGwgPSBfUEFUSF9CU0hFTEw7CisKKwlvc2lnaGFuZCA9IHNpZ25hbChTSUdDSExELCBTSUdfREZMKTsKKwlwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA9PSAwKSB7CisJCXNpZ25hbChTSUdQSVBFLCBTSUdfREZMKTsKKwkJZGVidWczKCJFeGVjdXRpbmcgJXMgLWMgXCIlc1wiIiwgc2hlbGwsIGFyZ3MpOworCQlleGVjbChzaGVsbCwgc2hlbGwsICItYyIsIGFyZ3MsIChjaGFyICopTlVMTCk7CisJCWVycm9yKCJDb3VsZG4ndCBleGVjdXRlICVzIC1jIFwiJXNcIjogJXMiLAorCQkgICAgc2hlbGwsIGFyZ3MsIHN0cmVycm9yKGVycm5vKSk7CisJCV9leGl0KDEpOworCX0gZWxzZSBpZiAocGlkID09IC0xKQorCQlmYXRhbCgiZm9yayBmYWlsZWQ6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7CisJd2hpbGUgKHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKSA9PSAtMSkKKwkJaWYgKGVycm5vICE9IEVJTlRSKQorCQkJZmF0YWwoIkNvdWxkbid0IHdhaXQgZm9yIGNoaWxkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJc2lnbmFsKFNJR0NITEQsIG9zaWdoYW5kKTsKKworCWlmICghV0lGRVhJVEVEKHN0YXR1cykpCisJCXJldHVybiAoMSk7CisKKwlyZXR1cm4gKFdFWElUU1RBVFVTKHN0YXR1cykpOworfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zc2hjb25uZWN0LmggYi9vcGVuc3NoLTYuMHAxL3NzaGNvbm5lY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDdmN2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zc2hjb25uZWN0LmgKQEAgLTAsMCArMSw3NSBAQAorLyogJE9wZW5CU0Q6IHNzaGNvbm5lY3QuaCx2IDEuMjcgMjAxMC8xMS8yOSAyMzo0NTo1MSBkam0gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgU2Vuc2l0aXZlIFNlbnNpdGl2ZTsKK3N0cnVjdCBTZW5zaXRpdmUgeworCUtleQkqKmtleXM7CisJaW50CW5rZXlzOworCWludAlleHRlcm5hbF9rZXlzaWduOworfTsKKworaW50Citzc2hfY29ubmVjdChjb25zdCBjaGFyICosIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICosIHVfc2hvcnQsIGludCwgaW50LAorICAgIGludCAqLCBpbnQsIGludCwgY29uc3QgY2hhciAqKTsKK3ZvaWQJIHNzaF9raWxsX3Byb3h5X2NvbW1hbmQodm9pZCk7CisKK3ZvaWQJIHNzaF9sb2dpbihTZW5zaXRpdmUgKiwgY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc29ja2FkZHIgKiwgdV9zaG9ydCwKKyAgICBzdHJ1Y3QgcGFzc3dkICosIGludCk7CisKK3ZvaWQJIHNzaF9leGNoYW5nZV9pZGVudGlmaWNhdGlvbihpbnQpOworCitpbnQJIHZlcmlmeV9ob3N0X2tleShjaGFyICosIHN0cnVjdCBzb2NrYWRkciAqLCBLZXkgKik7CisKK3ZvaWQJIGdldF9ob3N0ZmlsZV9ob3N0bmFtZV9pcGFkZHIoY2hhciAqLCBzdHJ1Y3Qgc29ja2FkZHIgKiwgdV9zaG9ydCwKKyAgICBjaGFyICoqLCBjaGFyICoqKTsKKwordm9pZAkgc3NoX2tleChjaGFyICosIHN0cnVjdCBzb2NrYWRkciAqKTsKK3ZvaWQJIHNzaF9rZXgyKGNoYXIgKiwgc3RydWN0IHNvY2thZGRyICosIHVfc2hvcnQpOworCit2b2lkCSBzc2hfdXNlcmF1dGgxKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjaGFyICosIFNlbnNpdGl2ZSAqKTsKK3ZvaWQJIHNzaF91c2VyYXV0aDIoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNoYXIgKiwgU2Vuc2l0aXZlICopOworCit2b2lkCSBzc2hfcHV0X3Bhc3N3b3JkKGNoYXIgKik7CitpbnQJIHNzaF9sb2NhbF9jbWQoY29uc3QgY2hhciAqKTsKKworLyoKKyAqIE1hY3JvcyB0byByYWlzZS9sb3dlciBwZXJtaXNzaW9ucy4KKyAqLworI2RlZmluZSBQUklWX1NUQVJUIGRvIHsJCQkJCVwKKwlpbnQgc2F2ZV9lcnJubyA9IGVycm5vOwkJCQlcCisJaWYgKHNldGV1aWQob3JpZ2luYWxfZWZmZWN0aXZlX3VpZCkgIT0gMCkJXAorCQlmYXRhbCgiUFJJVl9TVEFSVDogc2V0ZXVpZDogJXMiLAlcCisJCSAgICBzdHJlcnJvcihlcnJubykpOwkJCVwKKwllcnJubyA9IHNhdmVfZXJybm87CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUFJJVl9FTkQgZG8gewkJCQkJXAorCWludCBzYXZlX2Vycm5vID0gZXJybm87CQkJCVwKKwlpZiAoc2V0ZXVpZChvcmlnaW5hbF9yZWFsX3VpZCkgIT0gMCkJCVwKKwkJZmF0YWwoIlBSSVZfRU5EOiBzZXRldWlkOiAlcyIsCQlcCisJCSAgICBzdHJlcnJvcihlcnJubykpOwkJCVwKKwllcnJubyA9IHNhdmVfZXJybm87CQkJCVwKK30gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NzaGNvbm5lY3QxLmMgYi9vcGVuc3NoLTYuMHAxL3NzaGNvbm5lY3QxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQwN2JiZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc3NoY29ubmVjdDEuYwpAQCAtMCwwICsxLDc1MyBAQAorLyogJE9wZW5CU0Q6IHNzaGNvbm5lY3QxLmMsdiAxLjcwIDIwMDYvMTEvMDYgMjE6MjU6MjggbWFya3VzIEV4cCAkICovCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICogQ29kZSB0byBjb25uZWN0IHRvIGEgcmVtb3RlIGhvc3QsIGFuZCB0byBwZXJmb3JtIHRoZSBjbGllbnQgc2lkZSBvZiB0aGUKKyAqIGxvZ2luIChhdXRoZW50aWNhdGlvbikgZGlhbG9nLgorICoKKyAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKKyAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCisgKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCisgKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCisgKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8cHdkLmg+CisKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAic3NoLmgiCisjaW5jbHVkZSAic3NoMS5oIgorI2luY2x1ZGUgInJzYS5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgInBhY2tldC5oIgorI2luY2x1ZGUgImtleS5oIgorI2luY2x1ZGUgImNpcGhlci5oIgorI2luY2x1ZGUgImtleC5oIgorI2luY2x1ZGUgInVpZHN3YXAuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJyZWFkY29uZi5oIgorI2luY2x1ZGUgImF1dGhmZC5oIgorI2luY2x1ZGUgInNzaGNvbm5lY3QuaCIKKyNpbmNsdWRlICJhdXRoZmlsZS5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJjYW5vaG9zdC5oIgorI2luY2x1ZGUgImhvc3RmaWxlLmgiCisjaW5jbHVkZSAiYXV0aC5oIgorCisvKiBTZXNzaW9uIGlkIGZvciB0aGUgY3VycmVudCBzZXNzaW9uLiAqLwordV9jaGFyIHNlc3Npb25faWRbMTZdOwordV9pbnQgc3VwcG9ydGVkX2F1dGhlbnRpY2F0aW9ucyA9IDA7CisKK2V4dGVybiBPcHRpb25zIG9wdGlvbnM7CitleHRlcm4gY2hhciAqX19wcm9nbmFtZTsKKworLyoKKyAqIENoZWNrcyBpZiB0aGUgdXNlciBoYXMgYW4gYXV0aGVudGljYXRpb24gYWdlbnQsIGFuZCBpZiBzbywgdHJpZXMgdG8KKyAqIGF1dGhlbnRpY2F0ZSB1c2luZyB0aGUgYWdlbnQuCisgKi8KK3N0YXRpYyBpbnQKK3RyeV9hZ2VudF9hdXRoZW50aWNhdGlvbih2b2lkKQoreworCWludCB0eXBlOworCWNoYXIgKmNvbW1lbnQ7CisJQXV0aGVudGljYXRpb25Db25uZWN0aW9uICphdXRoOworCXVfY2hhciByZXNwb25zZVsxNl07CisJdV9pbnQgaTsKKwlLZXkgKmtleTsKKwlCSUdOVU0gKmNoYWxsZW5nZTsKKworCS8qIEdldCBjb25uZWN0aW9uIHRvIHRoZSBhZ2VudC4gKi8KKwlhdXRoID0gc3NoX2dldF9hdXRoZW50aWNhdGlvbl9jb25uZWN0aW9uKCk7CisJaWYgKCFhdXRoKQorCQlyZXR1cm4gMDsKKworCWlmICgoY2hhbGxlbmdlID0gQk5fbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCJ0cnlfYWdlbnRfYXV0aGVudGljYXRpb246IEJOX25ldyBmYWlsZWQiKTsKKwkvKiBMb29wIHRocm91Z2ggaWRlbnRpdGllcyBzZXJ2ZWQgYnkgdGhlIGFnZW50LiAqLworCWZvciAoa2V5ID0gc3NoX2dldF9maXJzdF9pZGVudGl0eShhdXRoLCAmY29tbWVudCwgMSk7CisJICAgIGtleSAhPSBOVUxMOworCSAgICBrZXkgPSBzc2hfZ2V0X25leHRfaWRlbnRpdHkoYXV0aCwgJmNvbW1lbnQsIDEpKSB7CisKKwkJLyogVHJ5IHRoaXMgaWRlbnRpdHkuICovCisJCWRlYnVnKCJUcnlpbmcgUlNBIGF1dGhlbnRpY2F0aW9uIHZpYSBhZ2VudCB3aXRoICclLjEwMHMnIiwgY29tbWVudCk7CisJCXhmcmVlKGNvbW1lbnQpOworCisJCS8qIFRlbGwgdGhlIHNlcnZlciB0aGF0IHdlIGFyZSB3aWxsaW5nIHRvIGF1dGhlbnRpY2F0ZSB1c2luZyB0aGlzIGtleS4gKi8KKwkJcGFja2V0X3N0YXJ0KFNTSF9DTVNHX0FVVEhfUlNBKTsKKwkJcGFja2V0X3B1dF9iaWdudW0oa2V5LT5yc2EtPm4pOworCQlwYWNrZXRfc2VuZCgpOworCQlwYWNrZXRfd3JpdGVfd2FpdCgpOworCisJCS8qIFdhaXQgZm9yIHNlcnZlcidzIHJlc3BvbnNlLiAqLworCQl0eXBlID0gcGFja2V0X3JlYWQoKTsKKworCQkvKiBUaGUgc2VydmVyIHNlbmRzIGZhaWx1cmUgaWYgaXQgZG9lc24ndCBsaWtlIG91ciBrZXkgb3IKKwkJICAgZG9lcyBub3Qgc3VwcG9ydCBSU0EgYXV0aGVudGljYXRpb24uICovCisJCWlmICh0eXBlID09IFNTSF9TTVNHX0ZBSUxVUkUpIHsKKwkJCWRlYnVnKCJTZXJ2ZXIgcmVmdXNlZCBvdXIga2V5LiIpOworCQkJa2V5X2ZyZWUoa2V5KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIE90aGVyd2lzZSBpdCBzaG91bGQgaGF2ZSBzZW50IGEgY2hhbGxlbmdlLiAqLworCQlpZiAodHlwZSAhPSBTU0hfU01TR19BVVRIX1JTQV9DSEFMTEVOR0UpCisJCQlwYWNrZXRfZGlzY29ubmVjdCgiUHJvdG9jb2wgZXJyb3IgZHVyaW5nIFJTQSBhdXRoZW50aWNhdGlvbjogJWQiLAorCQkJCQkgIHR5cGUpOworCisJCXBhY2tldF9nZXRfYmlnbnVtKGNoYWxsZW5nZSk7CisJCXBhY2tldF9jaGVja19lb20oKTsKKworCQlkZWJ1ZygiUmVjZWl2ZWQgUlNBIGNoYWxsZW5nZSBmcm9tIHNlcnZlci4iKTsKKworCQkvKiBBc2sgdGhlIGFnZW50IHRvIGRlY3J5cHQgdGhlIGNoYWxsZW5nZS4gKi8KKwkJaWYgKCFzc2hfZGVjcnlwdF9jaGFsbGVuZ2UoYXV0aCwga2V5LCBjaGFsbGVuZ2UsIHNlc3Npb25faWQsIDEsIHJlc3BvbnNlKSkgeworCQkJLyoKKwkJCSAqIFRoZSBhZ2VudCBmYWlsZWQgdG8gYXV0aGVudGljYXRlIHRoaXMgaWRlbnRpZmllcgorCQkJICogYWx0aG91Z2ggaXQgYWR2ZXJ0aXNlZCBpdCBzdXBwb3J0cyB0aGlzLiAgSnVzdAorCQkJICogcmV0dXJuIGEgd3JvbmcgdmFsdWUuCisJCQkgKi8KKwkJCWxvZ2l0KCJBdXRoZW50aWNhdGlvbiBhZ2VudCBmYWlsZWQgdG8gZGVjcnlwdCBjaGFsbGVuZ2UuIik7CisJCQltZW1zZXQocmVzcG9uc2UsIDAsIHNpemVvZihyZXNwb25zZSkpOworCQl9CisJCWtleV9mcmVlKGtleSk7CisJCWRlYnVnKCJTZW5kaW5nIHJlc3BvbnNlIHRvIFJTQSBjaGFsbGVuZ2UuIik7CisKKwkJLyogU2VuZCB0aGUgZGVjcnlwdGVkIGNoYWxsZW5nZSBiYWNrIHRvIHRoZSBzZXJ2ZXIuICovCisJCXBhY2tldF9zdGFydChTU0hfQ01TR19BVVRIX1JTQV9SRVNQT05TRSk7CisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQkJcGFja2V0X3B1dF9jaGFyKHJlc3BvbnNlW2ldKTsKKwkJcGFja2V0X3NlbmQoKTsKKwkJcGFja2V0X3dyaXRlX3dhaXQoKTsKKworCQkvKiBXYWl0IGZvciByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuICovCisJCXR5cGUgPSBwYWNrZXRfcmVhZCgpOworCisJCS8qIFRoZSBzZXJ2ZXIgcmV0dXJucyBzdWNjZXNzIGlmIGl0IGFjY2VwdGVkIHRoZSBhdXRoZW50aWNhdGlvbi4gKi8KKwkJaWYgKHR5cGUgPT0gU1NIX1NNU0dfU1VDQ0VTUykgeworCQkJc3NoX2Nsb3NlX2F1dGhlbnRpY2F0aW9uX2Nvbm5lY3Rpb24oYXV0aCk7CisJCQlCTl9jbGVhcl9mcmVlKGNoYWxsZW5nZSk7CisJCQlkZWJ1ZygiUlNBIGF1dGhlbnRpY2F0aW9uIGFjY2VwdGVkIGJ5IHNlcnZlci4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCS8qIE90aGVyd2lzZSBpdCBzaG91bGQgcmV0dXJuIGZhaWx1cmUuICovCisJCWlmICh0eXBlICE9IFNTSF9TTVNHX0ZBSUxVUkUpCisJCQlwYWNrZXRfZGlzY29ubmVjdCgiUHJvdG9jb2wgZXJyb3Igd2FpdGluZyBSU0EgYXV0aCByZXNwb25zZTogJWQiLAorCQkJCQkgIHR5cGUpOworCX0KKwlzc2hfY2xvc2VfYXV0aGVudGljYXRpb25fY29ubmVjdGlvbihhdXRoKTsKKwlCTl9jbGVhcl9mcmVlKGNoYWxsZW5nZSk7CisJZGVidWcoIlJTQSBhdXRoZW50aWNhdGlvbiB1c2luZyBhZ2VudCByZWZ1c2VkLiIpOworCXJldHVybiAwOworfQorCisvKgorICogQ29tcHV0ZXMgdGhlIHByb3BlciByZXNwb25zZSB0byBhIFJTQSBjaGFsbGVuZ2UsIGFuZCBzZW5kcyB0aGUgcmVzcG9uc2UgdG8KKyAqIHRoZSBzZXJ2ZXIuCisgKi8KK3N0YXRpYyB2b2lkCityZXNwb25kX3RvX3JzYV9jaGFsbGVuZ2UoQklHTlVNICogY2hhbGxlbmdlLCBSU0EgKiBwcnYpCit7CisJdV9jaGFyIGJ1ZlszMl0sIHJlc3BvbnNlWzE2XTsKKwlNRDVfQ1RYIG1kOworCWludCBpLCBsZW47CisKKwkvKiBEZWNyeXB0IHRoZSBjaGFsbGVuZ2UgdXNpbmcgdGhlIHByaXZhdGUga2V5LiAqLworCS8qIFhYWCB0aGluayBhYm91dCBCbGVpY2hlbmJhY2hlciwgdG9vICovCisJaWYgKHJzYV9wcml2YXRlX2RlY3J5cHQoY2hhbGxlbmdlLCBjaGFsbGVuZ2UsIHBydikgPD0gMCkKKwkJcGFja2V0X2Rpc2Nvbm5lY3QoCisJCSAgICAicmVzcG9uZF90b19yc2FfY2hhbGxlbmdlOiByc2FfcHJpdmF0ZV9kZWNyeXB0IGZhaWxlZCIpOworCisJLyogQ29tcHV0ZSB0aGUgcmVzcG9uc2UuICovCisJLyogVGhlIHJlc3BvbnNlIGlzIE1ENSBvZiBkZWNyeXB0ZWQgY2hhbGxlbmdlIHBsdXMgc2Vzc2lvbiBpZC4gKi8KKwlsZW4gPSBCTl9udW1fYnl0ZXMoY2hhbGxlbmdlKTsKKwlpZiAobGVuIDw9IDAgfHwgKHVfaW50KWxlbiA+IHNpemVvZihidWYpKQorCQlwYWNrZXRfZGlzY29ubmVjdCgKKwkJICAgICJyZXNwb25kX3RvX3JzYV9jaGFsbGVuZ2U6IGJhZCBjaGFsbGVuZ2UgbGVuZ3RoICVkIiwgbGVuKTsKKworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwlCTl9ibjJiaW4oY2hhbGxlbmdlLCBidWYgKyBzaXplb2YoYnVmKSAtIGxlbik7CisJTUQ1X0luaXQoJm1kKTsKKwlNRDVfVXBkYXRlKCZtZCwgYnVmLCAzMik7CisJTUQ1X1VwZGF0ZSgmbWQsIHNlc3Npb25faWQsIDE2KTsKKwlNRDVfRmluYWwocmVzcG9uc2UsICZtZCk7CisKKwlkZWJ1ZygiU2VuZGluZyByZXNwb25zZSB0byBob3N0IGtleSBSU0EgY2hhbGxlbmdlLiIpOworCisJLyogU2VuZCB0aGUgcmVzcG9uc2UgYmFjayB0byB0aGUgc2VydmVyLiAqLworCXBhY2tldF9zdGFydChTU0hfQ01TR19BVVRIX1JTQV9SRVNQT05TRSk7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCXBhY2tldF9wdXRfY2hhcihyZXNwb25zZVtpXSk7CisJcGFja2V0X3NlbmQoKTsKKwlwYWNrZXRfd3JpdGVfd2FpdCgpOworCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCW1lbXNldChyZXNwb25zZSwgMCwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJbWVtc2V0KCZtZCwgMCwgc2l6ZW9mKG1kKSk7Cit9CisKKy8qCisgKiBDaGVja3MgaWYgdGhlIHVzZXIgaGFzIGF1dGhlbnRpY2F0aW9uIGZpbGUsIGFuZCBpZiBzbywgdHJpZXMgdG8gYXV0aGVudGljYXRlCisgKiB0aGUgdXNlciB1c2luZyBpdC4KKyAqLworc3RhdGljIGludAordHJ5X3JzYV9hdXRoZW50aWNhdGlvbihpbnQgaWR4KQoreworCUJJR05VTSAqY2hhbGxlbmdlOworCUtleSAqcHVibGljLCAqcHJpdmF0ZTsKKwljaGFyIGJ1ZlszMDBdLCAqcGFzc3BocmFzZSwgKmNvbW1lbnQsICphdXRoZmlsZTsKKwlpbnQgaSwgcGVybV9vayA9IDEsIHR5cGUsIHF1aXQ7CisKKwlwdWJsaWMgPSBvcHRpb25zLmlkZW50aXR5X2tleXNbaWR4XTsKKwlhdXRoZmlsZSA9IG9wdGlvbnMuaWRlbnRpdHlfZmlsZXNbaWR4XTsKKwljb21tZW50ID0geHN0cmR1cChhdXRoZmlsZSk7CisKKwlkZWJ1ZygiVHJ5aW5nIFJTQSBhdXRoZW50aWNhdGlvbiB3aXRoIGtleSAnJS4xMDBzJyIsIGNvbW1lbnQpOworCisJLyogVGVsbCB0aGUgc2VydmVyIHRoYXQgd2UgYXJlIHdpbGxpbmcgdG8gYXV0aGVudGljYXRlIHVzaW5nIHRoaXMga2V5LiAqLworCXBhY2tldF9zdGFydChTU0hfQ01TR19BVVRIX1JTQSk7CisJcGFja2V0X3B1dF9iaWdudW0ocHVibGljLT5yc2EtPm4pOworCXBhY2tldF9zZW5kKCk7CisJcGFja2V0X3dyaXRlX3dhaXQoKTsKKworCS8qIFdhaXQgZm9yIHNlcnZlcidzIHJlc3BvbnNlLiAqLworCXR5cGUgPSBwYWNrZXRfcmVhZCgpOworCisJLyoKKwkgKiBUaGUgc2VydmVyIHJlc3BvbmRzIHdpdGggZmFpbHVyZSBpZiBpdCBkb2Vzbid0IGxpa2Ugb3VyIGtleSBvcgorCSAqIGRvZXNuJ3Qgc3VwcG9ydCBSU0EgYXV0aGVudGljYXRpb24uCisJICovCisJaWYgKHR5cGUgPT0gU1NIX1NNU0dfRkFJTFVSRSkgeworCQlkZWJ1ZygiU2VydmVyIHJlZnVzZWQgb3VyIGtleS4iKTsKKwkJeGZyZWUoY29tbWVudCk7CisJCXJldHVybiAwOworCX0KKwkvKiBPdGhlcndpc2UsIHRoZSBzZXJ2ZXIgc2hvdWxkIHJlc3BvbmQgd2l0aCBhIGNoYWxsZW5nZS4gKi8KKwlpZiAodHlwZSAhPSBTU0hfU01TR19BVVRIX1JTQV9DSEFMTEVOR0UpCisJCXBhY2tldF9kaXNjb25uZWN0KCJQcm90b2NvbCBlcnJvciBkdXJpbmcgUlNBIGF1dGhlbnRpY2F0aW9uOiAlZCIsIHR5cGUpOworCisJLyogR2V0IHRoZSBjaGFsbGVuZ2UgZnJvbSB0aGUgcGFja2V0LiAqLworCWlmICgoY2hhbGxlbmdlID0gQk5fbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCJ0cnlfcnNhX2F1dGhlbnRpY2F0aW9uOiBCTl9uZXcgZmFpbGVkIik7CisJcGFja2V0X2dldF9iaWdudW0oY2hhbGxlbmdlKTsKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisKKwlkZWJ1ZygiUmVjZWl2ZWQgUlNBIGNoYWxsZW5nZSBmcm9tIHNlcnZlci4iKTsKKworCS8qCisJICogSWYgdGhlIGtleSBpcyBub3Qgc3RvcmVkIGluIGV4dGVybmFsIGhhcmR3YXJlLCB3ZSBoYXZlIHRvCisJICogbG9hZCB0aGUgcHJpdmF0ZSBrZXkuICBUcnkgZmlyc3Qgd2l0aCBlbXB0eSBwYXNzcGhyYXNlOyBpZiBpdAorCSAqIGZhaWxzLCBhc2sgZm9yIGEgcGFzc3BocmFzZS4KKwkgKi8KKwlpZiAocHVibGljLT5mbGFncyAmIEtFWV9GTEFHX0VYVCkKKwkJcHJpdmF0ZSA9IHB1YmxpYzsKKwllbHNlCisJCXByaXZhdGUgPSBrZXlfbG9hZF9wcml2YXRlX3R5cGUoS0VZX1JTQTEsIGF1dGhmaWxlLCAiIiwgTlVMTCwKKwkJICAgICZwZXJtX29rKTsKKwlpZiAocHJpdmF0ZSA9PSBOVUxMICYmICFvcHRpb25zLmJhdGNoX21vZGUgJiYgcGVybV9vaykgeworCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLAorCQkgICAgIkVudGVyIHBhc3NwaHJhc2UgZm9yIFJTQSBrZXkgJyUuMTAwcyc6ICIsIGNvbW1lbnQpOworCQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1iZXJfb2ZfcGFzc3dvcmRfcHJvbXB0czsgaSsrKSB7CisJCQlwYXNzcGhyYXNlID0gcmVhZF9wYXNzcGhyYXNlKGJ1ZiwgMCk7CisJCQlpZiAoc3RyY21wKHBhc3NwaHJhc2UsICIiKSAhPSAwKSB7CisJCQkJcHJpdmF0ZSA9IGtleV9sb2FkX3ByaXZhdGVfdHlwZShLRVlfUlNBMSwKKwkJCQkgICAgYXV0aGZpbGUsIHBhc3NwaHJhc2UsIE5VTEwsIE5VTEwpOworCQkJCXF1aXQgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlkZWJ1ZzIoIm5vIHBhc3NwaHJhc2UgZ2l2ZW4sIHRyeSBuZXh0IGtleSIpOworCQkJCXF1aXQgPSAxOworCQkJfQorCQkJbWVtc2V0KHBhc3NwaHJhc2UsIDAsIHN0cmxlbihwYXNzcGhyYXNlKSk7CisJCQl4ZnJlZShwYXNzcGhyYXNlKTsKKwkJCWlmIChwcml2YXRlICE9IE5VTEwgfHwgcXVpdCkKKwkJCQlicmVhazsKKwkJCWRlYnVnMigiYmFkIHBhc3NwaHJhc2UgZ2l2ZW4sIHRyeSBhZ2Fpbi4uLiIpOworCQl9CisJfQorCS8qIFdlIG5vIGxvbmdlciBuZWVkIHRoZSBjb21tZW50LiAqLworCXhmcmVlKGNvbW1lbnQpOworCisJaWYgKHByaXZhdGUgPT0gTlVMTCkgeworCQlpZiAoIW9wdGlvbnMuYmF0Y2hfbW9kZSAmJiBwZXJtX29rKQorCQkJZXJyb3IoIkJhZCBwYXNzcGhyYXNlLiIpOworCisJCS8qIFNlbmQgYSBkdW1teSByZXNwb25zZSBwYWNrZXQgdG8gYXZvaWQgcHJvdG9jb2wgZXJyb3IuICovCisJCXBhY2tldF9zdGFydChTU0hfQ01TR19BVVRIX1JTQV9SRVNQT05TRSk7CisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQkJcGFja2V0X3B1dF9jaGFyKDApOworCQlwYWNrZXRfc2VuZCgpOworCQlwYWNrZXRfd3JpdGVfd2FpdCgpOworCisJCS8qIEV4cGVjdCB0aGUgc2VydmVyIHRvIHJlamVjdCBpdC4uLiAqLworCQlwYWNrZXRfcmVhZF9leHBlY3QoU1NIX1NNU0dfRkFJTFVSRSk7CisJCUJOX2NsZWFyX2ZyZWUoY2hhbGxlbmdlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ29tcHV0ZSBhbmQgc2VuZCBhIHJlc3BvbnNlIHRvIHRoZSBjaGFsbGVuZ2UuICovCisJcmVzcG9uZF90b19yc2FfY2hhbGxlbmdlKGNoYWxsZW5nZSwgcHJpdmF0ZS0+cnNhKTsKKworCS8qIERlc3Ryb3kgdGhlIHByaXZhdGUga2V5IHVubGVzcyBpdCBpbiBleHRlcm5hbCBoYXJkd2FyZS4gKi8KKwlpZiAoIShwcml2YXRlLT5mbGFncyAmIEtFWV9GTEFHX0VYVCkpCisJCWtleV9mcmVlKHByaXZhdGUpOworCisJLyogV2Ugbm8gbG9uZ2VyIG5lZWQgdGhlIGNoYWxsZW5nZS4gKi8KKwlCTl9jbGVhcl9mcmVlKGNoYWxsZW5nZSk7CisKKwkvKiBXYWl0IGZvciByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuICovCisJdHlwZSA9IHBhY2tldF9yZWFkKCk7CisJaWYgKHR5cGUgPT0gU1NIX1NNU0dfU1VDQ0VTUykgeworCQlkZWJ1ZygiUlNBIGF1dGhlbnRpY2F0aW9uIGFjY2VwdGVkIGJ5IHNlcnZlci4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmICh0eXBlICE9IFNTSF9TTVNHX0ZBSUxVUkUpCisJCXBhY2tldF9kaXNjb25uZWN0KCJQcm90b2NvbCBlcnJvciB3YWl0aW5nIFJTQSBhdXRoIHJlc3BvbnNlOiAlZCIsIHR5cGUpOworCWRlYnVnKCJSU0EgYXV0aGVudGljYXRpb24gcmVmdXNlZC4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRyaWVzIHRvIGF1dGhlbnRpY2F0ZSB0aGUgdXNlciB1c2luZyBjb21iaW5lZCByaG9zdHMgb3IgL2V0Yy9ob3N0cy5lcXVpdgorICogYXV0aGVudGljYXRpb24gYW5kIFJTQSBob3N0IGF1dGhlbnRpY2F0aW9uLgorICovCitzdGF0aWMgaW50Cit0cnlfcmhvc3RzX3JzYV9hdXRoZW50aWNhdGlvbihjb25zdCBjaGFyICpsb2NhbF91c2VyLCBLZXkgKiBob3N0X2tleSkKK3sKKwlpbnQgdHlwZTsKKwlCSUdOVU0gKmNoYWxsZW5nZTsKKworCWRlYnVnKCJUcnlpbmcgcmhvc3RzIG9yIC9ldGMvaG9zdHMuZXF1aXYgd2l0aCBSU0EgaG9zdCBhdXRoZW50aWNhdGlvbi4iKTsKKworCS8qIFRlbGwgdGhlIHNlcnZlciB0aGF0IHdlIGFyZSB3aWxsaW5nIHRvIGF1dGhlbnRpY2F0ZSB1c2luZyB0aGlzIGtleS4gKi8KKwlwYWNrZXRfc3RhcnQoU1NIX0NNU0dfQVVUSF9SSE9TVFNfUlNBKTsKKwlwYWNrZXRfcHV0X2NzdHJpbmcobG9jYWxfdXNlcik7CisJcGFja2V0X3B1dF9pbnQoQk5fbnVtX2JpdHMoaG9zdF9rZXktPnJzYS0+bikpOworCXBhY2tldF9wdXRfYmlnbnVtKGhvc3Rfa2V5LT5yc2EtPmUpOworCXBhY2tldF9wdXRfYmlnbnVtKGhvc3Rfa2V5LT5yc2EtPm4pOworCXBhY2tldF9zZW5kKCk7CisJcGFja2V0X3dyaXRlX3dhaXQoKTsKKworCS8qIFdhaXQgZm9yIHNlcnZlcidzIHJlc3BvbnNlLiAqLworCXR5cGUgPSBwYWNrZXRfcmVhZCgpOworCisJLyogVGhlIHNlcnZlciByZXNwb25kcyB3aXRoIGZhaWx1cmUgaWYgaXQgZG9lc24ndCBhZG1pdCBvdXIKKwkgICAucmhvc3RzIGF1dGhlbnRpY2F0aW9uIG9yIGRvZXNuJ3Qga25vdyBvdXIgaG9zdCBrZXkuICovCisJaWYgKHR5cGUgPT0gU1NIX1NNU0dfRkFJTFVSRSkgeworCQlkZWJ1ZygiU2VydmVyIHJlZnVzZWQgb3VyIHJob3N0cyBhdXRoZW50aWNhdGlvbiBvciBob3N0IGtleS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIE90aGVyd2lzZSwgdGhlIHNlcnZlciBzaG91bGQgcmVzcG9uZCB3aXRoIGEgY2hhbGxlbmdlLiAqLworCWlmICh0eXBlICE9IFNTSF9TTVNHX0FVVEhfUlNBX0NIQUxMRU5HRSkKKwkJcGFja2V0X2Rpc2Nvbm5lY3QoIlByb3RvY29sIGVycm9yIGR1cmluZyBSU0EgYXV0aGVudGljYXRpb246ICVkIiwgdHlwZSk7CisKKwkvKiBHZXQgdGhlIGNoYWxsZW5nZSBmcm9tIHRoZSBwYWNrZXQuICovCisJaWYgKChjaGFsbGVuZ2UgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoInRyeV9yaG9zdHNfcnNhX2F1dGhlbnRpY2F0aW9uOiBCTl9uZXcgZmFpbGVkIik7CisJcGFja2V0X2dldF9iaWdudW0oY2hhbGxlbmdlKTsKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisKKwlkZWJ1ZygiUmVjZWl2ZWQgUlNBIGNoYWxsZW5nZSBmb3IgaG9zdCBrZXkgZnJvbSBzZXJ2ZXIuIik7CisKKwkvKiBDb21wdXRlIGEgcmVzcG9uc2UgdG8gdGhlIGNoYWxsZW5nZS4gKi8KKwlyZXNwb25kX3RvX3JzYV9jaGFsbGVuZ2UoY2hhbGxlbmdlLCBob3N0X2tleS0+cnNhKTsKKworCS8qIFdlIG5vIGxvbmdlciBuZWVkIHRoZSBjaGFsbGVuZ2UuICovCisJQk5fY2xlYXJfZnJlZShjaGFsbGVuZ2UpOworCisJLyogV2FpdCBmb3IgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiAqLworCXR5cGUgPSBwYWNrZXRfcmVhZCgpOworCWlmICh0eXBlID09IFNTSF9TTVNHX1NVQ0NFU1MpIHsKKwkJZGVidWcoIlJob3N0cyBvciAvZXRjL2hvc3RzLmVxdWl2IHdpdGggUlNBIGhvc3QgYXV0aGVudGljYXRpb24gYWNjZXB0ZWQgYnkgc2VydmVyLiIpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKHR5cGUgIT0gU1NIX1NNU0dfRkFJTFVSRSkKKwkJcGFja2V0X2Rpc2Nvbm5lY3QoIlByb3RvY29sIGVycm9yIHdhaXRpbmcgUlNBIGF1dGggcmVzcG9uc2U6ICVkIiwgdHlwZSk7CisJZGVidWcoIlJob3N0cyBvciAvZXRjL2hvc3RzLmVxdWl2IHdpdGggUlNBIGhvc3QgYXV0aGVudGljYXRpb24gcmVmdXNlZC4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRyaWVzIHRvIGF1dGhlbnRpY2F0ZSB3aXRoIGFueSBzdHJpbmctYmFzZWQgY2hhbGxlbmdlL3Jlc3BvbnNlIHN5c3RlbS4KKyAqIE5vdGUgdGhhdCB0aGUgY2xpZW50IGNvZGUgaXMgbm90IHRpZWQgdG8gcy9rZXkgb3IgVElTLgorICovCitzdGF0aWMgaW50Cit0cnlfY2hhbGxlbmdlX3Jlc3BvbnNlX2F1dGhlbnRpY2F0aW9uKHZvaWQpCit7CisJaW50IHR5cGUsIGk7CisJdV9pbnQgY2xlbjsKKwljaGFyIHByb21wdFsxMDI0XTsKKwljaGFyICpjaGFsbGVuZ2UsICpyZXNwb25zZTsKKworCWRlYnVnKCJEb2luZyBjaGFsbGVuZ2UgcmVzcG9uc2UgYXV0aGVudGljYXRpb24uIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1iZXJfb2ZfcGFzc3dvcmRfcHJvbXB0czsgaSsrKSB7CisJCS8qIHJlcXVlc3QgYSBjaGFsbGVuZ2UgKi8KKwkJcGFja2V0X3N0YXJ0KFNTSF9DTVNHX0FVVEhfVElTKTsKKwkJcGFja2V0X3NlbmQoKTsKKwkJcGFja2V0X3dyaXRlX3dhaXQoKTsKKworCQl0eXBlID0gcGFja2V0X3JlYWQoKTsKKwkJaWYgKHR5cGUgIT0gU1NIX1NNU0dfRkFJTFVSRSAmJgorCQkgICAgdHlwZSAhPSBTU0hfU01TR19BVVRIX1RJU19DSEFMTEVOR0UpIHsKKwkJCXBhY2tldF9kaXNjb25uZWN0KCJQcm90b2NvbCBlcnJvcjogZ290ICVkIGluIHJlc3BvbnNlICIKKwkJCSAgICAidG8gU1NIX0NNU0dfQVVUSF9USVMiLCB0eXBlKTsKKwkJfQorCQlpZiAodHlwZSAhPSBTU0hfU01TR19BVVRIX1RJU19DSEFMTEVOR0UpIHsKKwkJCWRlYnVnKCJObyBjaGFsbGVuZ2UuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljaGFsbGVuZ2UgPSBwYWNrZXRfZ2V0X3N0cmluZygmY2xlbik7CisJCXBhY2tldF9jaGVja19lb20oKTsKKwkJc25wcmludGYocHJvbXB0LCBzaXplb2YgcHJvbXB0LCAiJXMlcyIsIGNoYWxsZW5nZSwKKwkJICAgIHN0cmNocihjaGFsbGVuZ2UsICdcbicpID8gIiIgOiAiXG5SZXNwb25zZTogIik7CisJCXhmcmVlKGNoYWxsZW5nZSk7CisJCWlmIChpICE9IDApCisJCQllcnJvcigiUGVybWlzc2lvbiBkZW5pZWQsIHBsZWFzZSB0cnkgYWdhaW4uIik7CisJCWlmIChvcHRpb25zLmNpcGhlciA9PSBTU0hfQ0lQSEVSX05PTkUpCisJCQlsb2dpdCgiV0FSTklORzogRW5jcnlwdGlvbiBpcyBkaXNhYmxlZCEgIgorCQkJICAgICJSZXNwb25zZSB3aWxsIGJlIHRyYW5zbWl0dGVkIGluIGNsZWFyIHRleHQuIik7CisJCXJlc3BvbnNlID0gcmVhZF9wYXNzcGhyYXNlKHByb21wdCwgMCk7CisJCWlmIChzdHJjbXAocmVzcG9uc2UsICIiKSA9PSAwKSB7CisJCQl4ZnJlZShyZXNwb25zZSk7CisJCQlicmVhazsKKwkJfQorCQlwYWNrZXRfc3RhcnQoU1NIX0NNU0dfQVVUSF9USVNfUkVTUE9OU0UpOworCQlzc2hfcHV0X3Bhc3N3b3JkKHJlc3BvbnNlKTsKKwkJbWVtc2V0KHJlc3BvbnNlLCAwLCBzdHJsZW4ocmVzcG9uc2UpKTsKKwkJeGZyZWUocmVzcG9uc2UpOworCQlwYWNrZXRfc2VuZCgpOworCQlwYWNrZXRfd3JpdGVfd2FpdCgpOworCQl0eXBlID0gcGFja2V0X3JlYWQoKTsKKwkJaWYgKHR5cGUgPT0gU1NIX1NNU0dfU1VDQ0VTUykKKwkJCXJldHVybiAxOworCQlpZiAodHlwZSAhPSBTU0hfU01TR19GQUlMVVJFKQorCQkJcGFja2V0X2Rpc2Nvbm5lY3QoIlByb3RvY29sIGVycm9yOiBnb3QgJWQgaW4gcmVzcG9uc2UgIgorCQkJICAgICJ0byBTU0hfQ01TR19BVVRIX1RJU19SRVNQT05TRSIsIHR5cGUpOworCX0KKwkvKiBmYWlsdXJlICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUcmllcyB0byBhdXRoZW50aWNhdGUgd2l0aCBwbGFpbiBwYXNzd2QgYXV0aGVudGljYXRpb24uCisgKi8KK3N0YXRpYyBpbnQKK3RyeV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbihjaGFyICpwcm9tcHQpCit7CisJaW50IHR5cGUsIGk7CisJY2hhciAqcGFzc3dvcmQ7CisKKwlkZWJ1ZygiRG9pbmcgcGFzc3dvcmQgYXV0aGVudGljYXRpb24uIik7CisJaWYgKG9wdGlvbnMuY2lwaGVyID09IFNTSF9DSVBIRVJfTk9ORSkKKwkJbG9naXQoIldBUk5JTkc6IEVuY3J5cHRpb24gaXMgZGlzYWJsZWQhIFBhc3N3b3JkIHdpbGwgYmUgdHJhbnNtaXR0ZWQgaW4gY2xlYXIgdGV4dC4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1iZXJfb2ZfcGFzc3dvcmRfcHJvbXB0czsgaSsrKSB7CisJCWlmIChpICE9IDApCisJCQllcnJvcigiUGVybWlzc2lvbiBkZW5pZWQsIHBsZWFzZSB0cnkgYWdhaW4uIik7CisJCXBhc3N3b3JkID0gcmVhZF9wYXNzcGhyYXNlKHByb21wdCwgMCk7CisJCXBhY2tldF9zdGFydChTU0hfQ01TR19BVVRIX1BBU1NXT1JEKTsKKwkJc3NoX3B1dF9wYXNzd29yZChwYXNzd29yZCk7CisJCW1lbXNldChwYXNzd29yZCwgMCwgc3RybGVuKHBhc3N3b3JkKSk7CisJCXhmcmVlKHBhc3N3b3JkKTsKKwkJcGFja2V0X3NlbmQoKTsKKwkJcGFja2V0X3dyaXRlX3dhaXQoKTsKKworCQl0eXBlID0gcGFja2V0X3JlYWQoKTsKKwkJaWYgKHR5cGUgPT0gU1NIX1NNU0dfU1VDQ0VTUykKKwkJCXJldHVybiAxOworCQlpZiAodHlwZSAhPSBTU0hfU01TR19GQUlMVVJFKQorCQkJcGFja2V0X2Rpc2Nvbm5lY3QoIlByb3RvY29sIGVycm9yOiBnb3QgJWQgaW4gcmVzcG9uc2UgdG8gcGFzc3dkIGF1dGgiLCB0eXBlKTsKKwl9CisJLyogZmFpbHVyZSAqLworCXJldHVybiAwOworfQorCisvKgorICogU1NIMSBrZXkgZXhjaGFuZ2UKKyAqLwordm9pZAorc3NoX2tleChjaGFyICpob3N0LCBzdHJ1Y3Qgc29ja2FkZHIgKmhvc3RhZGRyKQoreworCWludCBpOworCUJJR05VTSAqa2V5OworCUtleSAqaG9zdF9rZXksICpzZXJ2ZXJfa2V5OworCWludCBiaXRzLCByYml0czsKKwlpbnQgc3NoX2NpcGhlcl9kZWZhdWx0ID0gU1NIX0NJUEhFUl8zREVTOworCXVfY2hhciBzZXNzaW9uX2tleVtTU0hfU0VTU0lPTl9LRVlfTEVOR1RIXTsKKwl1X2NoYXIgY29va2llWzhdOworCXVfaW50IHN1cHBvcnRlZF9jaXBoZXJzOworCXVfaW50IHNlcnZlcl9mbGFncywgY2xpZW50X2ZsYWdzOworCXVfaW50MzJfdCBybmQgPSAwOworCisJZGVidWcoIldhaXRpbmcgZm9yIHNlcnZlciBwdWJsaWMga2V5LiIpOworCisJLyogV2FpdCBmb3IgYSBwdWJsaWMga2V5IHBhY2tldCBmcm9tIHRoZSBzZXJ2ZXIuICovCisJcGFja2V0X3JlYWRfZXhwZWN0KFNTSF9TTVNHX1BVQkxJQ19LRVkpOworCisJLyogR2V0IGNvb2tpZSBmcm9tIHRoZSBwYWNrZXQuICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJY29va2llW2ldID0gcGFja2V0X2dldF9jaGFyKCk7CisKKwkvKiBHZXQgdGhlIHB1YmxpYyBrZXkuICovCisJc2VydmVyX2tleSA9IGtleV9uZXcoS0VZX1JTQTEpOworCWJpdHMgPSBwYWNrZXRfZ2V0X2ludCgpOworCXBhY2tldF9nZXRfYmlnbnVtKHNlcnZlcl9rZXktPnJzYS0+ZSk7CisJcGFja2V0X2dldF9iaWdudW0oc2VydmVyX2tleS0+cnNhLT5uKTsKKworCXJiaXRzID0gQk5fbnVtX2JpdHMoc2VydmVyX2tleS0+cnNhLT5uKTsKKwlpZiAoYml0cyAhPSByYml0cykgeworCQlsb2dpdCgiV2FybmluZzogU2VydmVyIGxpZXMgYWJvdXQgc2l6ZSBvZiBzZXJ2ZXIgcHVibGljIGtleTogIgorCQkgICAgImFjdHVhbCBzaXplIGlzICVkIGJpdHMgdnMuIGFubm91bmNlZCAlZC4iLCByYml0cywgYml0cyk7CisJCWxvZ2l0KCJXYXJuaW5nOiBUaGlzIG1heSBiZSBkdWUgdG8gYW4gb2xkIGltcGxlbWVudGF0aW9uIG9mIHNzaC4iKTsKKwl9CisJLyogR2V0IHRoZSBob3N0IGtleS4gKi8KKwlob3N0X2tleSA9IGtleV9uZXcoS0VZX1JTQTEpOworCWJpdHMgPSBwYWNrZXRfZ2V0X2ludCgpOworCXBhY2tldF9nZXRfYmlnbnVtKGhvc3Rfa2V5LT5yc2EtPmUpOworCXBhY2tldF9nZXRfYmlnbnVtKGhvc3Rfa2V5LT5yc2EtPm4pOworCisJcmJpdHMgPSBCTl9udW1fYml0cyhob3N0X2tleS0+cnNhLT5uKTsKKwlpZiAoYml0cyAhPSByYml0cykgeworCQlsb2dpdCgiV2FybmluZzogU2VydmVyIGxpZXMgYWJvdXQgc2l6ZSBvZiBzZXJ2ZXIgaG9zdCBrZXk6ICIKKwkJICAgICJhY3R1YWwgc2l6ZSBpcyAlZCBiaXRzIHZzLiBhbm5vdW5jZWQgJWQuIiwgcmJpdHMsIGJpdHMpOworCQlsb2dpdCgiV2FybmluZzogVGhpcyBtYXkgYmUgZHVlIHRvIGFuIG9sZCBpbXBsZW1lbnRhdGlvbiBvZiBzc2guIik7CisJfQorCisJLyogR2V0IHByb3RvY29sIGZsYWdzLiAqLworCXNlcnZlcl9mbGFncyA9IHBhY2tldF9nZXRfaW50KCk7CisJcGFja2V0X3NldF9wcm90b2NvbF9mbGFncyhzZXJ2ZXJfZmxhZ3MpOworCisJc3VwcG9ydGVkX2NpcGhlcnMgPSBwYWNrZXRfZ2V0X2ludCgpOworCXN1cHBvcnRlZF9hdXRoZW50aWNhdGlvbnMgPSBwYWNrZXRfZ2V0X2ludCgpOworCXBhY2tldF9jaGVja19lb20oKTsKKworCWRlYnVnKCJSZWNlaXZlZCBzZXJ2ZXIgcHVibGljIGtleSAoJWQgYml0cykgYW5kIGhvc3Qga2V5ICglZCBiaXRzKS4iLAorCSAgICBCTl9udW1fYml0cyhzZXJ2ZXJfa2V5LT5yc2EtPm4pLCBCTl9udW1fYml0cyhob3N0X2tleS0+cnNhLT5uKSk7CisKKwlpZiAodmVyaWZ5X2hvc3Rfa2V5KGhvc3QsIGhvc3RhZGRyLCBob3N0X2tleSkgPT0gLTEpCisJCWZhdGFsKCJIb3N0IGtleSB2ZXJpZmljYXRpb24gZmFpbGVkLiIpOworCisJY2xpZW50X2ZsYWdzID0gU1NIX1BST1RPRkxBR19TQ1JFRU5fTlVNQkVSIHwgU1NIX1BST1RPRkxBR19IT1NUX0lOX0ZXRF9PUEVOOworCisJZGVyaXZlX3NzaDFfc2Vzc2lvbl9pZChob3N0X2tleS0+cnNhLT5uLCBzZXJ2ZXJfa2V5LT5yc2EtPm4sIGNvb2tpZSwgc2Vzc2lvbl9pZCk7CisKKwkvKiBHZW5lcmF0ZSBhIHNlc3Npb24ga2V5LiAqLworCWFyYzRyYW5kb21fc3RpcigpOworCisJLyoKKwkgKiBHZW5lcmF0ZSBhbiBlbmNyeXB0aW9uIGtleSBmb3IgdGhlIHNlc3Npb24uICAgVGhlIGtleSBpcyBhIDI1NiBiaXQKKwkgKiByYW5kb20gbnVtYmVyLCBpbnRlcnByZXRlZCBhcyBhIDMyLWJ5dGUga2V5LCB3aXRoIHRoZSBsZWFzdAorCSAqIHNpZ25pZmljYW50IDggYml0cyBiZWluZyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUga2V5LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCWlmIChpICUgNCA9PSAwKQorCQkJcm5kID0gYXJjNHJhbmRvbSgpOworCQlzZXNzaW9uX2tleVtpXSA9IHJuZCAmIDB4ZmY7CisJCXJuZCA+Pj0gODsKKwl9CisKKwkvKgorCSAqIEFjY29yZGluZyB0byB0aGUgcHJvdG9jb2wgc3BlYywgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHNlc3Npb24ga2V5CisJICogaXMgdGhlIGhpZ2hlc3QgYnl0ZSBvZiB0aGUgaW50ZWdlci4gIFRoZSBzZXNzaW9uIGtleSBpcyB4b3JlZCB3aXRoCisJICogdGhlIGZpcnN0IDE2IGJ5dGVzIG9mIHRoZSBzZXNzaW9uIGlkLgorCSAqLworCWlmICgoa2V5ID0gQk5fbmV3KCkpID09IE5VTEwpCisJCWZhdGFsKCJzc2hfa2V4OiBCTl9uZXcgZmFpbGVkIik7CisJaWYgKEJOX3NldF93b3JkKGtleSwgMCkgPT0gMCkKKwkJZmF0YWwoInNzaF9rZXg6IEJOX3NldF93b3JkIGZhaWxlZCIpOworCWZvciAoaSA9IDA7IGkgPCBTU0hfU0VTU0lPTl9LRVlfTEVOR1RIOyBpKyspIHsKKwkJaWYgKEJOX2xzaGlmdChrZXksIGtleSwgOCkgPT0gMCkKKwkJCWZhdGFsKCJzc2hfa2V4OiBCTl9sc2hpZnQgZmFpbGVkIik7CisJCWlmIChpIDwgMTYpIHsKKwkJCWlmIChCTl9hZGRfd29yZChrZXksIHNlc3Npb25fa2V5W2ldIF4gc2Vzc2lvbl9pZFtpXSkKKwkJCSAgICA9PSAwKQorCQkJCWZhdGFsKCJzc2hfa2V4OiBCTl9hZGRfd29yZCBmYWlsZWQiKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChCTl9hZGRfd29yZChrZXksIHNlc3Npb25fa2V5W2ldKSA9PSAwKQorCQkJCWZhdGFsKCJzc2hfa2V4OiBCTl9hZGRfd29yZCBmYWlsZWQiKTsKKwkJfQorCX0KKworCS8qCisJICogRW5jcnlwdCB0aGUgaW50ZWdlciB1c2luZyB0aGUgcHVibGljIGtleSBhbmQgaG9zdCBrZXkgb2YgdGhlCisJICogc2VydmVyIChrZXkgd2l0aCBzbWFsbGVyIG1vZHVsdXMgZmlyc3QpLgorCSAqLworCWlmIChCTl9jbXAoc2VydmVyX2tleS0+cnNhLT5uLCBob3N0X2tleS0+cnNhLT5uKSA8IDApIHsKKwkJLyogUHVibGljIGtleSBoYXMgc21hbGxlciBtb2R1bHVzLiAqLworCQlpZiAoQk5fbnVtX2JpdHMoaG9zdF9rZXktPnJzYS0+bikgPAorCQkgICAgQk5fbnVtX2JpdHMoc2VydmVyX2tleS0+cnNhLT5uKSArIFNTSF9LRVlfQklUU19SRVNFUlZFRCkgeworCQkJZmF0YWwoInJlc3BvbmRfdG9fcnNhX2NoYWxsZW5nZTogaG9zdF9rZXkgJWQgPCBzZXJ2ZXJfa2V5ICVkICsgIgorCQkJICAgICJTU0hfS0VZX0JJVFNfUkVTRVJWRUQgJWQiLAorCQkJICAgIEJOX251bV9iaXRzKGhvc3Rfa2V5LT5yc2EtPm4pLAorCQkJICAgIEJOX251bV9iaXRzKHNlcnZlcl9rZXktPnJzYS0+biksCisJCQkgICAgU1NIX0tFWV9CSVRTX1JFU0VSVkVEKTsKKwkJfQorCQlyc2FfcHVibGljX2VuY3J5cHQoa2V5LCBrZXksIHNlcnZlcl9rZXktPnJzYSk7CisJCXJzYV9wdWJsaWNfZW5jcnlwdChrZXksIGtleSwgaG9zdF9rZXktPnJzYSk7CisJfSBlbHNlIHsKKwkJLyogSG9zdCBrZXkgaGFzIHNtYWxsZXIgbW9kdWx1cyAob3IgdGhleSBhcmUgZXF1YWwpLiAqLworCQlpZiAoQk5fbnVtX2JpdHMoc2VydmVyX2tleS0+cnNhLT5uKSA8CisJCSAgICBCTl9udW1fYml0cyhob3N0X2tleS0+cnNhLT5uKSArIFNTSF9LRVlfQklUU19SRVNFUlZFRCkgeworCQkJZmF0YWwoInJlc3BvbmRfdG9fcnNhX2NoYWxsZW5nZTogc2VydmVyX2tleSAlZCA8IGhvc3Rfa2V5ICVkICsgIgorCQkJICAgICJTU0hfS0VZX0JJVFNfUkVTRVJWRUQgJWQiLAorCQkJICAgIEJOX251bV9iaXRzKHNlcnZlcl9rZXktPnJzYS0+biksCisJCQkgICAgQk5fbnVtX2JpdHMoaG9zdF9rZXktPnJzYS0+biksCisJCQkgICAgU1NIX0tFWV9CSVRTX1JFU0VSVkVEKTsKKwkJfQorCQlyc2FfcHVibGljX2VuY3J5cHQoa2V5LCBrZXksIGhvc3Rfa2V5LT5yc2EpOworCQlyc2FfcHVibGljX2VuY3J5cHQoa2V5LCBrZXksIHNlcnZlcl9rZXktPnJzYSk7CisJfQorCisJLyogRGVzdHJveSB0aGUgcHVibGljIGtleXMgc2luY2Ugd2Ugbm8gbG9uZ2VyIG5lZWQgdGhlbS4gKi8KKwlrZXlfZnJlZShzZXJ2ZXJfa2V5KTsKKwlrZXlfZnJlZShob3N0X2tleSk7CisKKwlpZiAob3B0aW9ucy5jaXBoZXIgPT0gU1NIX0NJUEhFUl9OT1RfU0VUKSB7CisJCWlmIChjaXBoZXJfbWFza19zc2gxKDEpICYgc3VwcG9ydGVkX2NpcGhlcnMgJiAoMSA8PCBzc2hfY2lwaGVyX2RlZmF1bHQpKQorCQkJb3B0aW9ucy5jaXBoZXIgPSBzc2hfY2lwaGVyX2RlZmF1bHQ7CisJfSBlbHNlIGlmIChvcHRpb25zLmNpcGhlciA9PSBTU0hfQ0lQSEVSX0lOVkFMSUQgfHwKKwkgICAgIShjaXBoZXJfbWFza19zc2gxKDEpICYgKDEgPDwgb3B0aW9ucy5jaXBoZXIpKSkgeworCQlsb2dpdCgiTm8gdmFsaWQgU1NIMSBjaXBoZXIsIHVzaW5nICUuMTAwcyBpbnN0ZWFkLiIsCisJCSAgICBjaXBoZXJfbmFtZShzc2hfY2lwaGVyX2RlZmF1bHQpKTsKKwkJb3B0aW9ucy5jaXBoZXIgPSBzc2hfY2lwaGVyX2RlZmF1bHQ7CisJfQorCS8qIENoZWNrIHRoYXQgdGhlIHNlbGVjdGVkIGNpcGhlciBpcyBzdXBwb3J0ZWQuICovCisJaWYgKCEoc3VwcG9ydGVkX2NpcGhlcnMgJiAoMSA8PCBvcHRpb25zLmNpcGhlcikpKQorCQlmYXRhbCgiU2VsZWN0ZWQgY2lwaGVyIHR5cGUgJS4xMDBzIG5vdCBzdXBwb3J0ZWQgYnkgc2VydmVyLiIsCisJCSAgICBjaXBoZXJfbmFtZShvcHRpb25zLmNpcGhlcikpOworCisJZGVidWcoIkVuY3J5cHRpb24gdHlwZTogJS4xMDBzIiwgY2lwaGVyX25hbWUob3B0aW9ucy5jaXBoZXIpKTsKKworCS8qIFNlbmQgdGhlIGVuY3J5cHRlZCBzZXNzaW9uIGtleSB0byB0aGUgc2VydmVyLiAqLworCXBhY2tldF9zdGFydChTU0hfQ01TR19TRVNTSU9OX0tFWSk7CisJcGFja2V0X3B1dF9jaGFyKG9wdGlvbnMuY2lwaGVyKTsKKworCS8qIFNlbmQgdGhlIGNvb2tpZSBiYWNrIHRvIHRoZSBzZXJ2ZXIuICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJcGFja2V0X3B1dF9jaGFyKGNvb2tpZVtpXSk7CisKKwkvKiBTZW5kIGFuZCBkZXN0cm95IHRoZSBlbmNyeXB0ZWQgZW5jcnlwdGlvbiBrZXkgaW50ZWdlci4gKi8KKwlwYWNrZXRfcHV0X2JpZ251bShrZXkpOworCUJOX2NsZWFyX2ZyZWUoa2V5KTsKKworCS8qIFNlbmQgcHJvdG9jb2wgZmxhZ3MuICovCisJcGFja2V0X3B1dF9pbnQoY2xpZW50X2ZsYWdzKTsKKworCS8qIFNlbmQgdGhlIHBhY2tldCBub3cuICovCisJcGFja2V0X3NlbmQoKTsKKwlwYWNrZXRfd3JpdGVfd2FpdCgpOworCisJZGVidWcoIlNlbnQgZW5jcnlwdGVkIHNlc3Npb24ga2V5LiIpOworCisJLyogU2V0IHRoZSBlbmNyeXB0aW9uIGtleS4gKi8KKwlwYWNrZXRfc2V0X2VuY3J5cHRpb25fa2V5KHNlc3Npb25fa2V5LCBTU0hfU0VTU0lPTl9LRVlfTEVOR1RILCBvcHRpb25zLmNpcGhlcik7CisKKwkvKiBXZSB3aWxsIG5vIGxvbmdlciBuZWVkIHRoZSBzZXNzaW9uIGtleSBoZXJlLiAgRGVzdHJveSBhbnkgZXh0cmEgY29waWVzLiAqLworCW1lbXNldChzZXNzaW9uX2tleSwgMCwgc2l6ZW9mKHNlc3Npb25fa2V5KSk7CisKKwkvKgorCSAqIEV4cGVjdCBhIHN1Y2Nlc3MgbWVzc2FnZSBmcm9tIHRoZSBzZXJ2ZXIuICBOb3RlIHRoYXQgdGhpcyBtZXNzYWdlCisJICogd2lsbCBiZSByZWNlaXZlZCBpbiBlbmNyeXB0ZWQgZm9ybS4KKwkgKi8KKwlwYWNrZXRfcmVhZF9leHBlY3QoU1NIX1NNU0dfU1VDQ0VTUyk7CisKKwlkZWJ1ZygiUmVjZWl2ZWQgZW5jcnlwdGVkIGNvbmZpcm1hdGlvbi4iKTsKK30KKworLyoKKyAqIEF1dGhlbnRpY2F0ZSB1c2VyCisgKi8KK3ZvaWQKK3NzaF91c2VyYXV0aDEoY29uc3QgY2hhciAqbG9jYWxfdXNlciwgY29uc3QgY2hhciAqc2VydmVyX3VzZXIsIGNoYXIgKmhvc3QsCisgICAgU2Vuc2l0aXZlICpzZW5zaXRpdmUpCit7CisJaW50IGksIHR5cGU7CisKKwlpZiAoc3VwcG9ydGVkX2F1dGhlbnRpY2F0aW9ucyA9PSAwKQorCQlmYXRhbCgic3NoX3VzZXJhdXRoMTogc2VydmVyIHN1cHBvcnRzIG5vIGF1dGggbWV0aG9kcyIpOworCisJLyogU2VuZCB0aGUgbmFtZSBvZiB0aGUgdXNlciB0byBsb2cgaW4gYXMgb24gdGhlIHNlcnZlci4gKi8KKwlwYWNrZXRfc3RhcnQoU1NIX0NNU0dfVVNFUik7CisJcGFja2V0X3B1dF9jc3RyaW5nKHNlcnZlcl91c2VyKTsKKwlwYWNrZXRfc2VuZCgpOworCXBhY2tldF93cml0ZV93YWl0KCk7CisKKwkvKgorCSAqIFRoZSBzZXJ2ZXIgc2hvdWxkIHJlc3BvbmQgd2l0aCBzdWNjZXNzIGlmIG5vIGF1dGhlbnRpY2F0aW9uIGlzCisJICogbmVlZGVkICh0aGUgdXNlciBoYXMgbm8gcGFzc3dvcmQpLiAgT3RoZXJ3aXNlIHRoZSBzZXJ2ZXIgcmVzcG9uZHMKKwkgKiB3aXRoIGZhaWx1cmUuCisJICovCisJdHlwZSA9IHBhY2tldF9yZWFkKCk7CisKKwkvKiBjaGVjayB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIHdhcyBhY2NlcHRlZCB3aXRob3V0IGF1dGhlbnRpY2F0aW9uLiAqLworCWlmICh0eXBlID09IFNTSF9TTVNHX1NVQ0NFU1MpCisJCWdvdG8gc3VjY2VzczsKKwlpZiAodHlwZSAhPSBTU0hfU01TR19GQUlMVVJFKQorCQlwYWNrZXRfZGlzY29ubmVjdCgiUHJvdG9jb2wgZXJyb3I6IGdvdCAlZCBpbiByZXNwb25zZSB0byBTU0hfQ01TR19VU0VSIiwgdHlwZSk7CisKKwkvKgorCSAqIFRyeSAucmhvc3RzIG9yIC9ldGMvaG9zdHMuZXF1aXYgYXV0aGVudGljYXRpb24gd2l0aCBSU0EgaG9zdAorCSAqIGF1dGhlbnRpY2F0aW9uLgorCSAqLworCWlmICgoc3VwcG9ydGVkX2F1dGhlbnRpY2F0aW9ucyAmICgxIDw8IFNTSF9BVVRIX1JIT1NUU19SU0EpKSAmJgorCSAgICBvcHRpb25zLnJob3N0c19yc2FfYXV0aGVudGljYXRpb24pIHsKKwkJZm9yIChpID0gMDsgaSA8IHNlbnNpdGl2ZS0+bmtleXM7IGkrKykgeworCQkJaWYgKHNlbnNpdGl2ZS0+a2V5c1tpXSAhPSBOVUxMICYmCisJCQkgICAgc2Vuc2l0aXZlLT5rZXlzW2ldLT50eXBlID09IEtFWV9SU0ExICYmCisJCQkgICAgdHJ5X3Job3N0c19yc2FfYXV0aGVudGljYXRpb24obG9jYWxfdXNlciwKKwkJCSAgICBzZW5zaXRpdmUtPmtleXNbaV0pKQorCQkJCWdvdG8gc3VjY2VzczsKKwkJfQorCX0KKwkvKiBUcnkgUlNBIGF1dGhlbnRpY2F0aW9uIGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgaXQuICovCisJaWYgKChzdXBwb3J0ZWRfYXV0aGVudGljYXRpb25zICYgKDEgPDwgU1NIX0FVVEhfUlNBKSkgJiYKKwkgICAgb3B0aW9ucy5yc2FfYXV0aGVudGljYXRpb24pIHsKKwkJLyoKKwkJICogVHJ5IFJTQSBhdXRoZW50aWNhdGlvbiB1c2luZyB0aGUgYXV0aGVudGljYXRpb24gYWdlbnQuIFRoZQorCQkgKiBhZ2VudCBpcyB0cmllZCBmaXJzdCBiZWNhdXNlIG5vIHBhc3NwaHJhc2UgaXMgbmVlZGVkIGZvcgorCQkgKiBpdCwgd2hlcmVhcyBpZGVudGl0eSBmaWxlcyBtYXkgcmVxdWlyZSBwYXNzcGhyYXNlcy4KKwkJICovCisJCWlmICh0cnlfYWdlbnRfYXV0aGVudGljYXRpb24oKSkKKwkJCWdvdG8gc3VjY2VzczsKKworCQkvKiBUcnkgUlNBIGF1dGhlbnRpY2F0aW9uIGZvciBlYWNoIGlkZW50aXR5LiAqLworCQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1faWRlbnRpdHlfZmlsZXM7IGkrKykKKwkJCWlmIChvcHRpb25zLmlkZW50aXR5X2tleXNbaV0gIT0gTlVMTCAmJgorCQkJICAgIG9wdGlvbnMuaWRlbnRpdHlfa2V5c1tpXS0+dHlwZSA9PSBLRVlfUlNBMSAmJgorCQkJICAgIHRyeV9yc2FfYXV0aGVudGljYXRpb24oaSkpCisJCQkJZ290byBzdWNjZXNzOworCX0KKwkvKiBUcnkgY2hhbGxlbmdlIHJlc3BvbnNlIGF1dGhlbnRpY2F0aW9uIGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgaXQuICovCisJaWYgKChzdXBwb3J0ZWRfYXV0aGVudGljYXRpb25zICYgKDEgPDwgU1NIX0FVVEhfVElTKSkgJiYKKwkgICAgb3B0aW9ucy5jaGFsbGVuZ2VfcmVzcG9uc2VfYXV0aGVudGljYXRpb24gJiYgIW9wdGlvbnMuYmF0Y2hfbW9kZSkgeworCQlpZiAodHJ5X2NoYWxsZW5nZV9yZXNwb25zZV9hdXRoZW50aWNhdGlvbigpKQorCQkJZ290byBzdWNjZXNzOworCX0KKwkvKiBUcnkgcGFzc3dvcmQgYXV0aGVudGljYXRpb24gaWYgdGhlIHNlcnZlciBzdXBwb3J0cyBpdC4gKi8KKwlpZiAoKHN1cHBvcnRlZF9hdXRoZW50aWNhdGlvbnMgJiAoMSA8PCBTU0hfQVVUSF9QQVNTV09SRCkpICYmCisJICAgIG9wdGlvbnMucGFzc3dvcmRfYXV0aGVudGljYXRpb24gJiYgIW9wdGlvbnMuYmF0Y2hfbW9kZSkgeworCQljaGFyIHByb21wdFs4MF07CisKKwkJc25wcmludGYocHJvbXB0LCBzaXplb2YocHJvbXB0KSwgIiUuMzBzQCUuMTI4cydzIHBhc3N3b3JkOiAiLAorCQkgICAgc2VydmVyX3VzZXIsIGhvc3QpOworCQlpZiAodHJ5X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uKHByb21wdCkpCisJCQlnb3RvIHN1Y2Nlc3M7CisJfQorCS8qIEFsbCBhdXRoZW50aWNhdGlvbiBtZXRob2RzIGhhdmUgZmFpbGVkLiAgRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuICovCisJZmF0YWwoIlBlcm1pc3Npb24gZGVuaWVkLiIpOworCS8qIE5PVFJFQUNIRUQgKi8KKworIHN1Y2Nlc3M6CisJcmV0dXJuOwkvKiBuZWVkIHN0YXRlbWVudCBhZnRlciBsYWJlbCAqLworfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zc2hjb25uZWN0Mi5jIGIvb3BlbnNzaC02LjBwMS9zc2hjb25uZWN0Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNGIyMDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NzaGNvbm5lY3QyLmMKQEAgLTAsMCArMSwxOTIwIEBACisvKiAkT3BlbkJTRDogc3NoY29ubmVjdDIuYyx2IDEuMTg4IDIwMTEvMDUvMjQgMDc6MTU6NDcgZGptIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA4IERhbWllbiBNaWxsZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2lmIGRlZmluZWQoSEFWRV9TVFJOVklTKSAmJiBkZWZpbmVkKEhBVkVfVklTX0gpCisjaW5jbHVkZSA8dmlzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L3N5cy1xdWV1ZS5oIgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgInNzaC5oIgorI2luY2x1ZGUgInNzaDIuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJwYWNrZXQuaCIKKyNpbmNsdWRlICJjb21wYXQuaCIKKyNpbmNsdWRlICJjaXBoZXIuaCIKKyNpbmNsdWRlICJrZXkuaCIKKyNpbmNsdWRlICJrZXguaCIKKyNpbmNsdWRlICJteXByb3Bvc2FsLmgiCisjaW5jbHVkZSAic3NoY29ubmVjdC5oIgorI2luY2x1ZGUgImF1dGhmaWxlLmgiCisjaW5jbHVkZSAiZGguaCIKKyNpbmNsdWRlICJhdXRoZmQuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJyZWFkY29uZi5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJtYXRjaC5oIgorI2luY2x1ZGUgImRpc3BhdGNoLmgiCisjaW5jbHVkZSAiY2Fub2hvc3QuaCIKKyNpbmNsdWRlICJtc2cuaCIKKyNpbmNsdWRlICJwYXRobmFtZXMuaCIKKyNpbmNsdWRlICJ1aWRzd2FwLmgiCisjaW5jbHVkZSAiaG9zdGZpbGUuaCIKKyNpbmNsdWRlICJzY2hub3JyLmgiCisjaW5jbHVkZSAianBha2UuaCIKKworI2lmZGVmIEdTU0FQSQorI2luY2x1ZGUgInNzaC1nc3MuaCIKKyNlbmRpZgorCisvKiBpbXBvcnQgKi8KK2V4dGVybiBjaGFyICpjbGllbnRfdmVyc2lvbl9zdHJpbmc7CitleHRlcm4gY2hhciAqc2VydmVyX3ZlcnNpb25fc3RyaW5nOworZXh0ZXJuIE9wdGlvbnMgb3B0aW9uczsKKworLyoKKyAqIFNTSDIga2V5IGV4Y2hhbmdlCisgKi8KKwordV9jaGFyICpzZXNzaW9uX2lkMiA9IE5VTEw7Cit1X2ludCBzZXNzaW9uX2lkMl9sZW4gPSAwOworCitjaGFyICp4eHhfaG9zdDsKK3N0cnVjdCBzb2NrYWRkciAqeHh4X2hvc3RhZGRyOworCitLZXggKnh4eF9rZXggPSBOVUxMOworCitzdGF0aWMgaW50Cit2ZXJpZnlfaG9zdF9rZXlfY2FsbGJhY2soS2V5ICpob3N0a2V5KQoreworCWlmICh2ZXJpZnlfaG9zdF9rZXkoeHh4X2hvc3QsIHh4eF9ob3N0YWRkciwgaG9zdGtleSkgPT0gLTEpCisJCWZhdGFsKCJIb3N0IGtleSB2ZXJpZmljYXRpb24gZmFpbGVkLiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY2hhciAqCitvcmRlcl9ob3N0a2V5YWxncyhjaGFyICpob3N0LCBzdHJ1Y3Qgc29ja2FkZHIgKmhvc3RhZGRyLCB1X3Nob3J0IHBvcnQpCit7CisJY2hhciAqb2F2YWlsLCAqYXZhaWwsICpmaXJzdCwgKmxhc3QsICphbGcsICpob3N0bmFtZSwgKnJldDsKKwlzaXplX3QgbWF4bGVuOworCXN0cnVjdCBob3N0a2V5cyAqaG9zdGtleXM7CisJaW50IGt0eXBlOworCXVfaW50IGk7CisKKwkvKiBGaW5kIGFsbCBob3N0a2V5cyBmb3IgdGhpcyBob3N0bmFtZSAqLworCWdldF9ob3N0ZmlsZV9ob3N0bmFtZV9pcGFkZHIoaG9zdCwgaG9zdGFkZHIsIHBvcnQsICZob3N0bmFtZSwgTlVMTCk7CisJaG9zdGtleXMgPSBpbml0X2hvc3RrZXlzKCk7CisJZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubnVtX3VzZXJfaG9zdGZpbGVzOyBpKyspCisJCWxvYWRfaG9zdGtleXMoaG9zdGtleXMsIGhvc3RuYW1lLCBvcHRpb25zLnVzZXJfaG9zdGZpbGVzW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1fc3lzdGVtX2hvc3RmaWxlczsgaSsrKQorCQlsb2FkX2hvc3RrZXlzKGhvc3RrZXlzLCBob3N0bmFtZSwgb3B0aW9ucy5zeXN0ZW1faG9zdGZpbGVzW2ldKTsKKworCW9hdmFpbCA9IGF2YWlsID0geHN0cmR1cChLRVhfREVGQVVMVF9QS19BTEcpOworCW1heGxlbiA9IHN0cmxlbihhdmFpbCkgKyAxOworCWZpcnN0ID0geG1hbGxvYyhtYXhsZW4pOworCWxhc3QgPSB4bWFsbG9jKG1heGxlbik7CisJKmZpcnN0ID0gKmxhc3QgPSAnXDAnOworCisjZGVmaW5lIEFMR19BUFBFTkQodG8sIGZyb20pIFwKKwlkbyB7IFwKKwkJaWYgKCp0byAhPSAnXDAnKSBcCisJCQlzdHJsY2F0KHRvLCAiLCIsIG1heGxlbik7IFwKKwkJc3RybGNhdCh0bywgZnJvbSwgbWF4bGVuKTsgXAorCX0gd2hpbGUgKDApCisKKwl3aGlsZSAoKGFsZyA9IHN0cnNlcCgmYXZhaWwsICIsIikpICYmICphbGcgIT0gJ1wwJykgeworCQlpZiAoKGt0eXBlID0ga2V5X3R5cGVfZnJvbV9uYW1lKGFsZykpID09IEtFWV9VTlNQRUMpCisJCQlmYXRhbCgiJXM6IHVua25vd24gYWxnICVzIiwgX19mdW5jX18sIGFsZyk7CisJCWlmIChsb29rdXBfa2V5X2luX2hvc3RrZXlzX2J5X3R5cGUoaG9zdGtleXMsCisJCSAgICBrZXlfdHlwZV9wbGFpbihrdHlwZSksIE5VTEwpKQorCQkJQUxHX0FQUEVORChmaXJzdCwgYWxnKTsKKwkJZWxzZQorCQkJQUxHX0FQUEVORChsYXN0LCBhbGcpOworCX0KKyN1bmRlZiBBTEdfQVBQRU5ECisJeGFzcHJpbnRmKCZyZXQsICIlcyVzJXMiLCBmaXJzdCwgKmZpcnN0ID09ICdcMCcgPyAiIiA6ICIsIiwgbGFzdCk7CisJaWYgKCpmaXJzdCAhPSAnXDAnKQorCQlkZWJ1ZzMoIiVzOiBwcmVmZXIgaG9zdGtleWFsZ3M6ICVzIiwgX19mdW5jX18sIGZpcnN0KTsKKworCXhmcmVlKGZpcnN0KTsKKwl4ZnJlZShsYXN0KTsKKwl4ZnJlZShob3N0bmFtZSk7CisJeGZyZWUob2F2YWlsKTsKKwlmcmVlX2hvc3RrZXlzKGhvc3RrZXlzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK3NzaF9rZXgyKGNoYXIgKmhvc3QsIHN0cnVjdCBzb2NrYWRkciAqaG9zdGFkZHIsIHVfc2hvcnQgcG9ydCkKK3sKKwlLZXggKmtleDsKKworCXh4eF9ob3N0ID0gaG9zdDsKKwl4eHhfaG9zdGFkZHIgPSBob3N0YWRkcjsKKworCWlmIChvcHRpb25zLmNpcGhlcnMgPT0gKGNoYXIgKiktMSkgeworCQlsb2dpdCgiTm8gdmFsaWQgY2lwaGVycyBmb3IgcHJvdG9jb2wgdmVyc2lvbiAyIGdpdmVuLCB1c2luZyBkZWZhdWx0cy4iKTsKKwkJb3B0aW9ucy5jaXBoZXJzID0gTlVMTDsKKwl9CisJaWYgKG9wdGlvbnMuY2lwaGVycyAhPSBOVUxMKSB7CisJCW15cHJvcG9zYWxbUFJPUE9TQUxfRU5DX0FMR1NfQ1RPU10gPQorCQlteXByb3Bvc2FsW1BST1BPU0FMX0VOQ19BTEdTX1NUT0NdID0gb3B0aW9ucy5jaXBoZXJzOworCX0KKwlteXByb3Bvc2FsW1BST1BPU0FMX0VOQ19BTEdTX0NUT1NdID0KKwkgICAgY29tcGF0X2NpcGhlcl9wcm9wb3NhbChteXByb3Bvc2FsW1BST1BPU0FMX0VOQ19BTEdTX0NUT1NdKTsKKwlteXByb3Bvc2FsW1BST1BPU0FMX0VOQ19BTEdTX1NUT0NdID0KKwkgICAgY29tcGF0X2NpcGhlcl9wcm9wb3NhbChteXByb3Bvc2FsW1BST1BPU0FMX0VOQ19BTEdTX1NUT0NdKTsKKwlpZiAob3B0aW9ucy5jb21wcmVzc2lvbikgeworCQlteXByb3Bvc2FsW1BST1BPU0FMX0NPTVBfQUxHU19DVE9TXSA9CisJCW15cHJvcG9zYWxbUFJPUE9TQUxfQ09NUF9BTEdTX1NUT0NdID0gInpsaWJAb3BlbnNzaC5jb20semxpYixub25lIjsKKwl9IGVsc2UgeworCQlteXByb3Bvc2FsW1BST1BPU0FMX0NPTVBfQUxHU19DVE9TXSA9CisJCW15cHJvcG9zYWxbUFJPUE9TQUxfQ09NUF9BTEdTX1NUT0NdID0gIm5vbmUsemxpYkBvcGVuc3NoLmNvbSx6bGliIjsKKwl9CisJaWYgKG9wdGlvbnMubWFjcyAhPSBOVUxMKSB7CisJCW15cHJvcG9zYWxbUFJPUE9TQUxfTUFDX0FMR1NfQ1RPU10gPQorCQlteXByb3Bvc2FsW1BST1BPU0FMX01BQ19BTEdTX1NUT0NdID0gb3B0aW9ucy5tYWNzOworCX0KKwlpZiAob3B0aW9ucy5ob3N0a2V5YWxnb3JpdGhtcyAhPSBOVUxMKQorCQlteXByb3Bvc2FsW1BST1BPU0FMX1NFUlZFUl9IT1NUX0tFWV9BTEdTXSA9CisJCSAgICBvcHRpb25zLmhvc3RrZXlhbGdvcml0aG1zOworCWVsc2UgeworCQkvKiBQcmVmZXIgYWxnb3JpdGhtcyB0aGF0IHdlIGFscmVhZHkgaGF2ZSBrZXlzIGZvciAqLworCQlteXByb3Bvc2FsW1BST1BPU0FMX1NFUlZFUl9IT1NUX0tFWV9BTEdTXSA9CisJCSAgICBvcmRlcl9ob3N0a2V5YWxncyhob3N0LCBob3N0YWRkciwgcG9ydCk7CisJfQorCWlmIChvcHRpb25zLmtleF9hbGdvcml0aG1zICE9IE5VTEwpCisJCW15cHJvcG9zYWxbUFJPUE9TQUxfS0VYX0FMR1NdID0gb3B0aW9ucy5rZXhfYWxnb3JpdGhtczsKKworCWlmIChvcHRpb25zLnJla2V5X2xpbWl0KQorCQlwYWNrZXRfc2V0X3Jla2V5X2xpbWl0KCh1X2ludDMyX3Qpb3B0aW9ucy5yZWtleV9saW1pdCk7CisKKwkvKiBzdGFydCBrZXkgZXhjaGFuZ2UgKi8KKwlrZXggPSBrZXhfc2V0dXAobXlwcm9wb3NhbCk7CisJa2V4LT5rZXhbS0VYX0RIX0dSUDFfU0hBMV0gPSBrZXhkaF9jbGllbnQ7CisJa2V4LT5rZXhbS0VYX0RIX0dSUDE0X1NIQTFdID0ga2V4ZGhfY2xpZW50OworCWtleC0+a2V4W0tFWF9ESF9HRVhfU0hBMV0gPSBrZXhnZXhfY2xpZW50OworCWtleC0+a2V4W0tFWF9ESF9HRVhfU0hBMjU2XSA9IGtleGdleF9jbGllbnQ7CisJa2V4LT5rZXhbS0VYX0VDREhfU0hBMl0gPSBrZXhlY2RoX2NsaWVudDsKKwlrZXgtPmNsaWVudF92ZXJzaW9uX3N0cmluZz1jbGllbnRfdmVyc2lvbl9zdHJpbmc7CisJa2V4LT5zZXJ2ZXJfdmVyc2lvbl9zdHJpbmc9c2VydmVyX3ZlcnNpb25fc3RyaW5nOworCWtleC0+dmVyaWZ5X2hvc3Rfa2V5PSZ2ZXJpZnlfaG9zdF9rZXlfY2FsbGJhY2s7CisKKwl4eHhfa2V4ID0ga2V4OworCisJZGlzcGF0Y2hfcnVuKERJU1BBVENIX0JMT0NLLCAma2V4LT5kb25lLCBrZXgpOworCisJaWYgKG9wdGlvbnMudXNlX3JvYW1pbmcgJiYgIWtleC0+cm9hbWluZykgeworCQlkZWJ1ZygiUm9hbWluZyBub3QgYWxsb3dlZCBieSBzZXJ2ZXIiKTsKKwkJb3B0aW9ucy51c2Vfcm9hbWluZyA9IDA7CisJfQorCisJc2Vzc2lvbl9pZDIgPSBrZXgtPnNlc3Npb25faWQ7CisJc2Vzc2lvbl9pZDJfbGVuID0ga2V4LT5zZXNzaW9uX2lkX2xlbjsKKworI2lmZGVmIERFQlVHX0tFWERICisJLyogc2VuZCAxc3QgZW5jcnlwdGVkL21hY2VkL2NvbXByZXNzZWQgbWVzc2FnZSAqLworCXBhY2tldF9zdGFydChTU0gyX01TR19JR05PUkUpOworCXBhY2tldF9wdXRfY3N0cmluZygibWFya3VzIik7CisJcGFja2V0X3NlbmQoKTsKKwlwYWNrZXRfd3JpdGVfd2FpdCgpOworI2VuZGlmCit9CisKKy8qCisgKiBBdXRoZW50aWNhdGUgdXNlcgorICovCisKK3R5cGVkZWYgc3RydWN0IEF1dGhjdHh0IEF1dGhjdHh0OwordHlwZWRlZiBzdHJ1Y3QgQXV0aG1ldGhvZCBBdXRobWV0aG9kOwordHlwZWRlZiBzdHJ1Y3QgaWRlbnRpdHkgSWRlbnRpdHk7Cit0eXBlZGVmIHN0cnVjdCBpZGxpc3QgSWRsaXN0OworCitzdHJ1Y3QgaWRlbnRpdHkgeworCVRBSUxRX0VOVFJZKGlkZW50aXR5KSBuZXh0OworCUF1dGhlbnRpY2F0aW9uQ29ubmVjdGlvbiAqYWM7CS8qIHNldCBpZiBhZ2VudCBzdXBwb3J0cyBrZXkgKi8KKwlLZXkJKmtleTsJCQkvKiBwdWJsaWMvcHJpdmF0ZSBrZXkgKi8KKwljaGFyCSpmaWxlbmFtZTsJCS8qIGNvbW1lbnQgZm9yIGFnZW50LW9ubHkga2V5cyAqLworCWludAl0cmllZDsKKwlpbnQJaXNwcml2YXRlOwkJLyoga2V5IHBvaW50cyB0byB0aGUgcHJpdmF0ZSBrZXkgKi8KK307CitUQUlMUV9IRUFEKGlkbGlzdCwgaWRlbnRpdHkpOworCitzdHJ1Y3QgQXV0aGN0eHQgeworCWNvbnN0IGNoYXIgKnNlcnZlcl91c2VyOworCWNvbnN0IGNoYXIgKmxvY2FsX3VzZXI7CisJY29uc3QgY2hhciAqaG9zdDsKKwljb25zdCBjaGFyICpzZXJ2aWNlOworCUF1dGhtZXRob2QgKm1ldGhvZDsKKwlzaWdfYXRvbWljX3Qgc3VjY2VzczsKKwljaGFyICphdXRobGlzdDsKKwkvKiBwdWJrZXkgKi8KKwlJZGxpc3Qga2V5czsKKwlBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKmFnZW50OworCS8qIGhvc3RiYXNlZCAqLworCVNlbnNpdGl2ZSAqc2Vuc2l0aXZlOworCS8qIGtiZC1pbnRlcmFjdGl2ZSAqLworCWludCBpbmZvX3JlcV9zZWVuOworCS8qIGdlbmVyaWMgKi8KKwl2b2lkICptZXRob2RkYXRhOworfTsKK3N0cnVjdCBBdXRobWV0aG9kIHsKKwljaGFyCSpuYW1lOwkJLyogc3RyaW5nIHRvIGNvbXBhcmUgYWdhaW5zdCBzZXJ2ZXIncyBsaXN0ICovCisJaW50CSgqdXNlcmF1dGgpKEF1dGhjdHh0ICphdXRoY3R4dCk7CisJdm9pZAkoKmNsZWFudXApKEF1dGhjdHh0ICphdXRoY3R4dCk7CisJaW50CSplbmFibGVkOwkvKiBmbGFnIGluIG9wdGlvbiBzdHJ1Y3QgdGhhdCBlbmFibGVzIG1ldGhvZCAqLworCWludAkqYmF0Y2hfZmxhZzsJLyogZmxhZyBpbiBvcHRpb24gc3RydWN0IHRoYXQgZGlzYWJsZXMgbWV0aG9kICovCit9OworCit2b2lkCWlucHV0X3VzZXJhdXRoX3N1Y2Nlc3MoaW50LCB1X2ludDMyX3QsIHZvaWQgKik7Cit2b2lkCWlucHV0X3VzZXJhdXRoX3N1Y2Nlc3NfdW5leHBlY3RlZChpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKK3ZvaWQJaW5wdXRfdXNlcmF1dGhfZmFpbHVyZShpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKK3ZvaWQJaW5wdXRfdXNlcmF1dGhfYmFubmVyKGludCwgdV9pbnQzMl90LCB2b2lkICopOwordm9pZAlpbnB1dF91c2VyYXV0aF9lcnJvcihpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKK3ZvaWQJaW5wdXRfdXNlcmF1dGhfaW5mb19yZXEoaW50LCB1X2ludDMyX3QsIHZvaWQgKik7Cit2b2lkCWlucHV0X3VzZXJhdXRoX3BrX29rKGludCwgdV9pbnQzMl90LCB2b2lkICopOwordm9pZAlpbnB1dF91c2VyYXV0aF9wYXNzd2RfY2hhbmdlcmVxKGludCwgdV9pbnQzMl90LCB2b2lkICopOwordm9pZAlpbnB1dF91c2VyYXV0aF9qcGFrZV9zZXJ2ZXJfc3RlcDEoaW50LCB1X2ludDMyX3QsIHZvaWQgKik7Cit2b2lkCWlucHV0X3VzZXJhdXRoX2pwYWtlX3NlcnZlcl9zdGVwMihpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKK3ZvaWQJaW5wdXRfdXNlcmF1dGhfanBha2Vfc2VydmVyX2NvbmZpcm0oaW50LCB1X2ludDMyX3QsIHZvaWQgKik7CisKK2ludAl1c2VyYXV0aF9ub25lKEF1dGhjdHh0ICopOworaW50CXVzZXJhdXRoX3B1YmtleShBdXRoY3R4dCAqKTsKK2ludAl1c2VyYXV0aF9wYXNzd2QoQXV0aGN0eHQgKik7CitpbnQJdXNlcmF1dGhfa2JkaW50KEF1dGhjdHh0ICopOworaW50CXVzZXJhdXRoX2hvc3RiYXNlZChBdXRoY3R4dCAqKTsKK2ludAl1c2VyYXV0aF9qcGFrZShBdXRoY3R4dCAqKTsKKwordm9pZAl1c2VyYXV0aF9qcGFrZV9jbGVhbnVwKEF1dGhjdHh0ICopOworCisjaWZkZWYgR1NTQVBJCitpbnQJdXNlcmF1dGhfZ3NzYXBpKEF1dGhjdHh0ICphdXRoY3R4dCk7Cit2b2lkCWlucHV0X2dzc2FwaV9yZXNwb25zZShpbnQgdHlwZSwgdV9pbnQzMl90LCB2b2lkICopOwordm9pZAlpbnB1dF9nc3NhcGlfdG9rZW4oaW50IHR5cGUsIHVfaW50MzJfdCwgdm9pZCAqKTsKK3ZvaWQJaW5wdXRfZ3NzYXBpX2hhc2goaW50IHR5cGUsIHVfaW50MzJfdCwgdm9pZCAqKTsKK3ZvaWQJaW5wdXRfZ3NzYXBpX2Vycm9yKGludCwgdV9pbnQzMl90LCB2b2lkICopOwordm9pZAlpbnB1dF9nc3NhcGlfZXJydG9rKGludCwgdV9pbnQzMl90LCB2b2lkICopOworI2VuZGlmCisKK3ZvaWQJdXNlcmF1dGgoQXV0aGN0eHQgKiwgY2hhciAqKTsKKworc3RhdGljIGludCBzaWduX2FuZF9zZW5kX3B1YmtleShBdXRoY3R4dCAqLCBJZGVudGl0eSAqKTsKK3N0YXRpYyB2b2lkIHB1YmtleV9wcmVwYXJlKEF1dGhjdHh0ICopOworc3RhdGljIHZvaWQgcHVia2V5X2NsZWFudXAoQXV0aGN0eHQgKik7CitzdGF0aWMgS2V5ICpsb2FkX2lkZW50aXR5X2ZpbGUoY2hhciAqKTsKKworc3RhdGljIEF1dGhtZXRob2QgKmF1dGhtZXRob2RfZ2V0KGNoYXIgKmF1dGhsaXN0KTsKK3N0YXRpYyBBdXRobWV0aG9kICphdXRobWV0aG9kX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKTsKK3N0YXRpYyBjaGFyICphdXRobWV0aG9kc19nZXQodm9pZCk7CisKK0F1dGhtZXRob2QgYXV0aG1ldGhvZHNbXSA9IHsKKyNpZmRlZiBHU1NBUEkKKwl7Imdzc2FwaS13aXRoLW1pYyIsCisJCXVzZXJhdXRoX2dzc2FwaSwKKwkJTlVMTCwKKwkJJm9wdGlvbnMuZ3NzX2F1dGhlbnRpY2F0aW9uLAorCQlOVUxMfSwKKyNlbmRpZgorCXsiaG9zdGJhc2VkIiwKKwkJdXNlcmF1dGhfaG9zdGJhc2VkLAorCQlOVUxMLAorCQkmb3B0aW9ucy5ob3N0YmFzZWRfYXV0aGVudGljYXRpb24sCisJCU5VTEx9LAorCXsicHVibGlja2V5IiwKKwkJdXNlcmF1dGhfcHVia2V5LAorCQlOVUxMLAorCQkmb3B0aW9ucy5wdWJrZXlfYXV0aGVudGljYXRpb24sCisJCU5VTEx9LAorI2lmZGVmIEpQQUtFCisJeyJqcGFrZS0wMUBvcGVuc3NoLmNvbSIsCisJCXVzZXJhdXRoX2pwYWtlLAorCQl1c2VyYXV0aF9qcGFrZV9jbGVhbnVwLAorCQkmb3B0aW9ucy56ZXJvX2tub3dsZWRnZV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbiwKKwkJJm9wdGlvbnMuYmF0Y2hfbW9kZX0sCisjZW5kaWYKKwl7ImtleWJvYXJkLWludGVyYWN0aXZlIiwKKwkJdXNlcmF1dGhfa2JkaW50LAorCQlOVUxMLAorCQkmb3B0aW9ucy5rYmRfaW50ZXJhY3RpdmVfYXV0aGVudGljYXRpb24sCisJCSZvcHRpb25zLmJhdGNoX21vZGV9LAorCXsicGFzc3dvcmQiLAorCQl1c2VyYXV0aF9wYXNzd2QsCisJCU5VTEwsCisJCSZvcHRpb25zLnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uLAorCQkmb3B0aW9ucy5iYXRjaF9tb2RlfSwKKwl7Im5vbmUiLAorCQl1c2VyYXV0aF9ub25lLAorCQlOVUxMLAorCQlOVUxMLAorCQlOVUxMfSwKKwl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0KK307CisKK3ZvaWQKK3NzaF91c2VyYXV0aDIoY29uc3QgY2hhciAqbG9jYWxfdXNlciwgY29uc3QgY2hhciAqc2VydmVyX3VzZXIsIGNoYXIgKmhvc3QsCisgICAgU2Vuc2l0aXZlICpzZW5zaXRpdmUpCit7CisJQXV0aGN0eHQgYXV0aGN0eHQ7CisJaW50IHR5cGU7CisKKwlpZiAob3B0aW9ucy5jaGFsbGVuZ2VfcmVzcG9uc2VfYXV0aGVudGljYXRpb24pCisJCW9wdGlvbnMua2JkX2ludGVyYWN0aXZlX2F1dGhlbnRpY2F0aW9uID0gMTsKKworCXBhY2tldF9zdGFydChTU0gyX01TR19TRVJWSUNFX1JFUVVFU1QpOworCXBhY2tldF9wdXRfY3N0cmluZygic3NoLXVzZXJhdXRoIik7CisJcGFja2V0X3NlbmQoKTsKKwlkZWJ1ZygiU1NIMl9NU0dfU0VSVklDRV9SRVFVRVNUIHNlbnQiKTsKKwlwYWNrZXRfd3JpdGVfd2FpdCgpOworCXR5cGUgPSBwYWNrZXRfcmVhZCgpOworCWlmICh0eXBlICE9IFNTSDJfTVNHX1NFUlZJQ0VfQUNDRVBUKQorCQlmYXRhbCgiU2VydmVyIGRlbmllZCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0OiAlZCIsIHR5cGUpOworCWlmIChwYWNrZXRfcmVtYWluaW5nKCkgPiAwKSB7CisJCWNoYXIgKnJlcGx5ID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7CisJCWRlYnVnMigic2VydmljZV9hY2NlcHQ6ICVzIiwgcmVwbHkpOworCQl4ZnJlZShyZXBseSk7CisJfSBlbHNlIHsKKwkJZGVidWcyKCJidWdneSBzZXJ2ZXI6IHNlcnZpY2VfYWNjZXB0IHcvbyBzZXJ2aWNlIik7CisJfQorCXBhY2tldF9jaGVja19lb20oKTsKKwlkZWJ1ZygiU1NIMl9NU0dfU0VSVklDRV9BQ0NFUFQgcmVjZWl2ZWQiKTsKKworCWlmIChvcHRpb25zLnByZWZlcnJlZF9hdXRoZW50aWNhdGlvbnMgPT0gTlVMTCkKKwkJb3B0aW9ucy5wcmVmZXJyZWRfYXV0aGVudGljYXRpb25zID0gYXV0aG1ldGhvZHNfZ2V0KCk7CisKKwkvKiBzZXR1cCBhdXRoZW50aWNhdGlvbiBjb250ZXh0ICovCisJbWVtc2V0KCZhdXRoY3R4dCwgMCwgc2l6ZW9mKGF1dGhjdHh0KSk7CisJcHVia2V5X3ByZXBhcmUoJmF1dGhjdHh0KTsKKwlhdXRoY3R4dC5zZXJ2ZXJfdXNlciA9IHNlcnZlcl91c2VyOworCWF1dGhjdHh0LmxvY2FsX3VzZXIgPSBsb2NhbF91c2VyOworCWF1dGhjdHh0Lmhvc3QgPSBob3N0OworCWF1dGhjdHh0LnNlcnZpY2UgPSAic3NoLWNvbm5lY3Rpb24iOwkJLyogc2VydmljZSBuYW1lICovCisJYXV0aGN0eHQuc3VjY2VzcyA9IDA7CisJYXV0aGN0eHQubWV0aG9kID0gYXV0aG1ldGhvZF9sb29rdXAoIm5vbmUiKTsKKwlhdXRoY3R4dC5hdXRobGlzdCA9IE5VTEw7CisJYXV0aGN0eHQubWV0aG9kZGF0YSA9IE5VTEw7CisJYXV0aGN0eHQuc2Vuc2l0aXZlID0gc2Vuc2l0aXZlOworCWF1dGhjdHh0LmluZm9fcmVxX3NlZW4gPSAwOworCWlmIChhdXRoY3R4dC5tZXRob2QgPT0gTlVMTCkKKwkJZmF0YWwoInNzaF91c2VyYXV0aDI6IGludGVybmFsIGVycm9yOiBjYW5ub3Qgc2VuZCB1c2VyYXV0aCBub25lIHJlcXVlc3QiKTsKKworCS8qIGluaXRpYWwgdXNlcmF1dGggcmVxdWVzdCAqLworCXVzZXJhdXRoX25vbmUoJmF1dGhjdHh0KTsKKworCWRpc3BhdGNoX2luaXQoJmlucHV0X3VzZXJhdXRoX2Vycm9yKTsKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfU1VDQ0VTUywgJmlucHV0X3VzZXJhdXRoX3N1Y2Nlc3MpOworCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9GQUlMVVJFLCAmaW5wdXRfdXNlcmF1dGhfZmFpbHVyZSk7CisJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0JBTk5FUiwgJmlucHV0X3VzZXJhdXRoX2Jhbm5lcik7CisJZGlzcGF0Y2hfcnVuKERJU1BBVENIX0JMT0NLLCAmYXV0aGN0eHQuc3VjY2VzcywgJmF1dGhjdHh0KTsJLyogbG9vcCB1bnRpbCBzdWNjZXNzICovCisKKwlwdWJrZXlfY2xlYW51cCgmYXV0aGN0eHQpOworCWRpc3BhdGNoX3JhbmdlKFNTSDJfTVNHX1VTRVJBVVRIX01JTiwgU1NIMl9NU0dfVVNFUkFVVEhfTUFYLCBOVUxMKTsKKworCWRlYnVnKCJBdXRoZW50aWNhdGlvbiBzdWNjZWVkZWQgKCVzKS4iLCBhdXRoY3R4dC5tZXRob2QtPm5hbWUpOworfQorCit2b2lkCit1c2VyYXV0aChBdXRoY3R4dCAqYXV0aGN0eHQsIGNoYXIgKmF1dGhsaXN0KQoreworCWlmIChhdXRoY3R4dC0+bWV0aG9kICE9IE5VTEwgJiYgYXV0aGN0eHQtPm1ldGhvZC0+Y2xlYW51cCAhPSBOVUxMKQorCQlhdXRoY3R4dC0+bWV0aG9kLT5jbGVhbnVwKGF1dGhjdHh0KTsKKworCWlmIChhdXRoY3R4dC0+bWV0aG9kZGF0YSkgeworCQl4ZnJlZShhdXRoY3R4dC0+bWV0aG9kZGF0YSk7CisJCWF1dGhjdHh0LT5tZXRob2RkYXRhID0gTlVMTDsKKwl9CisJaWYgKGF1dGhsaXN0ID09IE5VTEwpIHsKKwkJYXV0aGxpc3QgPSBhdXRoY3R4dC0+YXV0aGxpc3Q7CisJfSBlbHNlIHsKKwkJaWYgKGF1dGhjdHh0LT5hdXRobGlzdCkKKwkJCXhmcmVlKGF1dGhjdHh0LT5hdXRobGlzdCk7CisJCWF1dGhjdHh0LT5hdXRobGlzdCA9IGF1dGhsaXN0OworCX0KKwlmb3IgKDs7KSB7CisJCUF1dGhtZXRob2QgKm1ldGhvZCA9IGF1dGhtZXRob2RfZ2V0KGF1dGhsaXN0KTsKKwkJaWYgKG1ldGhvZCA9PSBOVUxMKQorCQkJZmF0YWwoIlBlcm1pc3Npb24gZGVuaWVkICglcykuIiwgYXV0aGxpc3QpOworCQlhdXRoY3R4dC0+bWV0aG9kID0gbWV0aG9kOworCisJCS8qIHJlc2V0IHRoZSBwZXIgbWV0aG9kIGhhbmRsZXIgKi8KKwkJZGlzcGF0Y2hfcmFuZ2UoU1NIMl9NU0dfVVNFUkFVVEhfUEVSX01FVEhPRF9NSU4sCisJCSAgICBTU0gyX01TR19VU0VSQVVUSF9QRVJfTUVUSE9EX01BWCwgTlVMTCk7CisKKwkJLyogYW5kIHRyeSBuZXcgbWV0aG9kICovCisJCWlmIChtZXRob2QtPnVzZXJhdXRoKGF1dGhjdHh0KSAhPSAwKSB7CisJCQlkZWJ1ZzIoIndlIHNlbnQgYSAlcyBwYWNrZXQsIHdhaXQgZm9yIHJlcGx5IiwgbWV0aG9kLT5uYW1lKTsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJZGVidWcyKCJ3ZSBkaWQgbm90IHNlbmQgYSBwYWNrZXQsIGRpc2FibGUgbWV0aG9kIik7CisJCQltZXRob2QtPmVuYWJsZWQgPSBOVUxMOworCQl9CisJfQorfQorCisvKiBBUkdTVVNFRCAqLwordm9pZAoraW5wdXRfdXNlcmF1dGhfZXJyb3IoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCit7CisJZmF0YWwoImlucHV0X3VzZXJhdXRoX2Vycm9yOiBiYWQgbWVzc2FnZSBkdXJpbmcgYXV0aGVudGljYXRpb246ICIKKwkgICAgInR5cGUgJWQiLCB0eXBlKTsKK30KKworLyogQVJHU1VTRUQgKi8KK3ZvaWQKK2lucHV0X3VzZXJhdXRoX2Jhbm5lcihpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKK3sKKwljaGFyICptc2csICpyYXcsICpsYW5nOworCXVfaW50IGxlbjsKKworCWRlYnVnMygiaW5wdXRfdXNlcmF1dGhfYmFubmVyIik7CisJcmF3ID0gcGFja2V0X2dldF9zdHJpbmcoJmxlbik7CisJbGFuZyA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOworCWlmIChsZW4gPiAwICYmIG9wdGlvbnMubG9nX2xldmVsID49IFNZU0xPR19MRVZFTF9JTkZPKSB7CisJCWlmIChsZW4gPiA2NTUzNikKKwkJCWxlbiA9IDY1NTM2OworCQltc2cgPSB4bWFsbG9jKGxlbiAqIDQgKyAxKTsgLyogbWF4IGV4cGFuc2lvbiBmcm9tIHN0cm52aXMoKSAqLworCQlzdHJudmlzKG1zZywgcmF3LCBsZW4gKiA0ICsgMSwgVklTX1NBRkV8VklTX09DVEFMfFZJU19OT1NMQVNIKTsKKwkJZnByaW50ZihzdGRlcnIsICIlcyIsIG1zZyk7CisJCXhmcmVlKG1zZyk7CisJfQorCXhmcmVlKHJhdyk7CisJeGZyZWUobGFuZyk7Cit9CisKKy8qIEFSR1NVU0VEICovCit2b2lkCitpbnB1dF91c2VyYXV0aF9zdWNjZXNzKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQoreworCUF1dGhjdHh0ICphdXRoY3R4dCA9IGN0eHQ7CisKKwlpZiAoYXV0aGN0eHQgPT0gTlVMTCkKKwkJZmF0YWwoImlucHV0X3VzZXJhdXRoX3N1Y2Nlc3M6IG5vIGF1dGhlbnRpY2F0aW9uIGNvbnRleHQiKTsKKwlpZiAoYXV0aGN0eHQtPmF1dGhsaXN0KSB7CisJCXhmcmVlKGF1dGhjdHh0LT5hdXRobGlzdCk7CisJCWF1dGhjdHh0LT5hdXRobGlzdCA9IE5VTEw7CisJfQorCWlmIChhdXRoY3R4dC0+bWV0aG9kICE9IE5VTEwgJiYgYXV0aGN0eHQtPm1ldGhvZC0+Y2xlYW51cCAhPSBOVUxMKQorCQlhdXRoY3R4dC0+bWV0aG9kLT5jbGVhbnVwKGF1dGhjdHh0KTsKKwlpZiAoYXV0aGN0eHQtPm1ldGhvZGRhdGEpIHsKKwkJeGZyZWUoYXV0aGN0eHQtPm1ldGhvZGRhdGEpOworCQlhdXRoY3R4dC0+bWV0aG9kZGF0YSA9IE5VTEw7CisJfQorCWF1dGhjdHh0LT5zdWNjZXNzID0gMTsJCQkvKiBicmVhayBvdXQgKi8KK30KKwordm9pZAoraW5wdXRfdXNlcmF1dGhfc3VjY2Vzc191bmV4cGVjdGVkKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQoreworCUF1dGhjdHh0ICphdXRoY3R4dCA9IGN0eHQ7CisKKwlpZiAoYXV0aGN0eHQgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBubyBhdXRoZW50aWNhdGlvbiBjb250ZXh0IiwgX19mdW5jX18pOworCisJZmF0YWwoIlVuZXhwZWN0ZWQgYXV0aGVudGljYXRpb24gc3VjY2VzcyBkdXJpbmcgJXMuIiwKKwkgICAgYXV0aGN0eHQtPm1ldGhvZC0+bmFtZSk7Cit9CisKKy8qIEFSR1NVU0VEICovCit2b2lkCitpbnB1dF91c2VyYXV0aF9mYWlsdXJlKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQoreworCUF1dGhjdHh0ICphdXRoY3R4dCA9IGN0eHQ7CisJY2hhciAqYXV0aGxpc3QgPSBOVUxMOworCWludCBwYXJ0aWFsOworCisJaWYgKGF1dGhjdHh0ID09IE5VTEwpCisJCWZhdGFsKCJpbnB1dF91c2VyYXV0aF9mYWlsdXJlOiBubyBhdXRoZW50aWNhdGlvbiBjb250ZXh0Iik7CisKKwlhdXRobGlzdCA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOworCXBhcnRpYWwgPSBwYWNrZXRfZ2V0X2NoYXIoKTsKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisKKwlpZiAocGFydGlhbCAhPSAwKQorCQlsb2dpdCgiQXV0aGVudGljYXRlZCB3aXRoIHBhcnRpYWwgc3VjY2Vzcy4iKTsKKwlkZWJ1ZygiQXV0aGVudGljYXRpb25zIHRoYXQgY2FuIGNvbnRpbnVlOiAlcyIsIGF1dGhsaXN0KTsKKworCXVzZXJhdXRoKGF1dGhjdHh0LCBhdXRobGlzdCk7Cit9CisKKy8qIEFSR1NVU0VEICovCit2b2lkCitpbnB1dF91c2VyYXV0aF9wa19vayhpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKK3sKKwlBdXRoY3R4dCAqYXV0aGN0eHQgPSBjdHh0OworCUtleSAqa2V5ID0gTlVMTDsKKwlJZGVudGl0eSAqaWQgPSBOVUxMOworCUJ1ZmZlciBiOworCWludCBwa3R5cGUsIHNlbnQgPSAwOworCXVfaW50IGFsZW4sIGJsZW47CisJY2hhciAqcGthbGcsICpmcDsKKwl1X2NoYXIgKnBrYmxvYjsKKworCWlmIChhdXRoY3R4dCA9PSBOVUxMKQorCQlmYXRhbCgiaW5wdXRfdXNlcmF1dGhfcGtfb2s6IG5vIGF1dGhlbnRpY2F0aW9uIGNvbnRleHQiKTsKKwlpZiAoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX1BLT0spIHsKKwkJLyogdGhpcyBpcyBzaW1pbGFyIHRvIFNTSF9CVUdfUEtBVVRIICovCisJCWRlYnVnMigiaW5wdXRfdXNlcmF1dGhfcGtfb2s6IFNTSF9CVUdfUEtPSyIpOworCQlwa2Jsb2IgPSBwYWNrZXRfZ2V0X3N0cmluZygmYmxlbik7CisJCWJ1ZmZlcl9pbml0KCZiKTsKKwkJYnVmZmVyX2FwcGVuZCgmYiwgcGtibG9iLCBibGVuKTsKKwkJcGthbGcgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgJmFsZW4pOworCQlidWZmZXJfZnJlZSgmYik7CisJfSBlbHNlIHsKKwkJcGthbGcgPSBwYWNrZXRfZ2V0X3N0cmluZygmYWxlbik7CisJCXBrYmxvYiA9IHBhY2tldF9nZXRfc3RyaW5nKCZibGVuKTsKKwl9CisJcGFja2V0X2NoZWNrX2VvbSgpOworCisJZGVidWcoIlNlcnZlciBhY2NlcHRzIGtleTogcGthbGcgJXMgYmxlbiAldSIsIHBrYWxnLCBibGVuKTsKKworCWlmICgocGt0eXBlID0ga2V5X3R5cGVfZnJvbV9uYW1lKHBrYWxnKSkgPT0gS0VZX1VOU1BFQykgeworCQlkZWJ1ZygidW5rbm93biBwa2FsZyAlcyIsIHBrYWxnKTsKKwkJZ290byBkb25lOworCX0KKwlpZiAoKGtleSA9IGtleV9mcm9tX2Jsb2IocGtibG9iLCBibGVuKSkgPT0gTlVMTCkgeworCQlkZWJ1Zygibm8ga2V5IGZyb20gYmxvYi4gcGthbGcgJXMiLCBwa2FsZyk7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKGtleS0+dHlwZSAhPSBwa3R5cGUpIHsKKwkJZXJyb3IoImlucHV0X3VzZXJhdXRoX3BrX29rOiB0eXBlIG1pc21hdGNoICIKKwkJICAgICJmb3IgZGVjb2RlZCBrZXkgKHJlY2VpdmVkICVkLCBleHBlY3RlZCAlZCkiLAorCQkgICAga2V5LT50eXBlLCBwa3R5cGUpOworCQlnb3RvIGRvbmU7CisJfQorCWZwID0ga2V5X2ZpbmdlcnByaW50KGtleSwgU1NIX0ZQX01ENSwgU1NIX0ZQX0hFWCk7CisJZGVidWcyKCJpbnB1dF91c2VyYXV0aF9wa19vazogZnAgJXMiLCBmcCk7CisJeGZyZWUoZnApOworCisJLyoKKwkgKiBzZWFyY2gga2V5cyBpbiB0aGUgcmV2ZXJzZSBvcmRlciwgYmVjYXVzZSBsYXN0IGNhbmRpZGF0ZSBoYXMgYmVlbgorCSAqIG1vdmVkIHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlLiAgdGhpcyBhbHNvIGF2b2lkcyBjb25mdXNpb24gYnkKKwkgKiBkdXBsaWNhdGUga2V5cworCSAqLworCVRBSUxRX0ZPUkVBQ0hfUkVWRVJTRShpZCwgJmF1dGhjdHh0LT5rZXlzLCBpZGxpc3QsIG5leHQpIHsKKwkJaWYgKGtleV9lcXVhbChrZXksIGlkLT5rZXkpKSB7CisJCQlzZW50ID0gc2lnbl9hbmRfc2VuZF9wdWJrZXkoYXV0aGN0eHQsIGlkKTsKKwkJCWJyZWFrOworCQl9CisJfQorZG9uZToKKwlpZiAoa2V5ICE9IE5VTEwpCisJCWtleV9mcmVlKGtleSk7CisJeGZyZWUocGthbGcpOworCXhmcmVlKHBrYmxvYik7CisKKwkvKiB0cnkgYW5vdGhlciBtZXRob2QgaWYgd2UgZGlkIG5vdCBzZW5kIGEgcGFja2V0ICovCisJaWYgKHNlbnQgPT0gMCkKKwkJdXNlcmF1dGgoYXV0aGN0eHQsIE5VTEwpOworfQorCisjaWZkZWYgR1NTQVBJCitpbnQKK3VzZXJhdXRoX2dzc2FwaShBdXRoY3R4dCAqYXV0aGN0eHQpCit7CisJR3NzY3R4dCAqZ3NzY3R4dCA9IE5VTEw7CisJc3RhdGljIGdzc19PSURfc2V0IGdzc19zdXBwb3J0ZWQgPSBOVUxMOworCXN0YXRpYyB1X2ludCBtZWNoID0gMDsKKwlPTV91aW50MzIgbWluOworCWludCBvayA9IDA7CisKKwkvKiBUcnkgb25lIEdTU0FQSSBtZXRob2QgYXQgYSB0aW1lLCByYXRoZXIgdGhhbiBzZW5kaW5nIHRoZW0gYWxsIGF0CisJICogb25jZS4gKi8KKworCWlmIChnc3Nfc3VwcG9ydGVkID09IE5VTEwpCisJCWdzc19pbmRpY2F0ZV9tZWNocygmbWluLCAmZ3NzX3N1cHBvcnRlZCk7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgdGhlIG1lY2hhbmlzbSBpcyB1c2FibGUgYmVmb3JlIHdlIG9mZmVyIGl0ICovCisJd2hpbGUgKG1lY2ggPCBnc3Nfc3VwcG9ydGVkLT5jb3VudCAmJiAhb2spIHsKKwkJLyogTXkgREVSIGVuY29kaW5nIHJlcXVpcmVzIGxlbmd0aDwxMjggKi8KKwkJaWYgKGdzc19zdXBwb3J0ZWQtPmVsZW1lbnRzW21lY2hdLmxlbmd0aCA8IDEyOCAmJgorCQkgICAgc3NoX2dzc2FwaV9jaGVja19tZWNoYW5pc20oJmdzc2N0eHQsIAorCQkgICAgJmdzc19zdXBwb3J0ZWQtPmVsZW1lbnRzW21lY2hdLCBhdXRoY3R4dC0+aG9zdCkpIHsKKwkJCW9rID0gMTsgLyogTWVjaGFuaXNtIHdvcmtzICovCisJCX0gZWxzZSB7CisJCQltZWNoKys7CisJCX0KKwl9CisKKwlpZiAoIW9rKQorCQlyZXR1cm4gMDsKKworCWF1dGhjdHh0LT5tZXRob2RkYXRhPSh2b2lkICopZ3NzY3R4dDsKKworCXBhY2tldF9zdGFydChTU0gyX01TR19VU0VSQVVUSF9SRVFVRVNUKTsKKwlwYWNrZXRfcHV0X2NzdHJpbmcoYXV0aGN0eHQtPnNlcnZlcl91c2VyKTsKKwlwYWNrZXRfcHV0X2NzdHJpbmcoYXV0aGN0eHQtPnNlcnZpY2UpOworCXBhY2tldF9wdXRfY3N0cmluZyhhdXRoY3R4dC0+bWV0aG9kLT5uYW1lKTsKKworCXBhY2tldF9wdXRfaW50KDEpOworCisJcGFja2V0X3B1dF9pbnQoKGdzc19zdXBwb3J0ZWQtPmVsZW1lbnRzW21lY2hdLmxlbmd0aCkgKyAyKTsKKwlwYWNrZXRfcHV0X2NoYXIoU1NIX0dTU19PSURUWVBFKTsKKwlwYWNrZXRfcHV0X2NoYXIoZ3NzX3N1cHBvcnRlZC0+ZWxlbWVudHNbbWVjaF0ubGVuZ3RoKTsKKwlwYWNrZXRfcHV0X3Jhdyhnc3Nfc3VwcG9ydGVkLT5lbGVtZW50c1ttZWNoXS5lbGVtZW50cywKKwkgICAgZ3NzX3N1cHBvcnRlZC0+ZWxlbWVudHNbbWVjaF0ubGVuZ3RoKTsKKworCXBhY2tldF9zZW5kKCk7CisKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfR1NTQVBJX1JFU1BPTlNFLCAmaW5wdXRfZ3NzYXBpX3Jlc3BvbnNlKTsKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfR1NTQVBJX1RPS0VOLCAmaW5wdXRfZ3NzYXBpX3Rva2VuKTsKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfR1NTQVBJX0VSUk9SLCAmaW5wdXRfZ3NzYXBpX2Vycm9yKTsKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfR1NTQVBJX0VSUlRPSywgJmlucHV0X2dzc2FwaV9lcnJ0b2spOworCisJbWVjaCsrOyAvKiBNb3ZlIGFsb25nIHRvIG5leHQgY2FuZGlkYXRlICovCisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIE9NX3VpbnQzMgorcHJvY2Vzc19nc3NhcGlfdG9rZW4odm9pZCAqY3R4dCwgZ3NzX2J1ZmZlcl90IHJlY3ZfdG9rKQoreworCUF1dGhjdHh0ICphdXRoY3R4dCA9IGN0eHQ7CisJR3NzY3R4dCAqZ3NzY3R4dCA9IGF1dGhjdHh0LT5tZXRob2RkYXRhOworCWdzc19idWZmZXJfZGVzYyBzZW5kX3RvayA9IEdTU19DX0VNUFRZX0JVRkZFUjsKKwlnc3NfYnVmZmVyX2Rlc2MgbWljID0gR1NTX0NfRU1QVFlfQlVGRkVSOworCWdzc19idWZmZXJfZGVzYyBnc3NidWY7CisJT01fdWludDMyIHN0YXR1cywgbXMsIGZsYWdzOworCUJ1ZmZlciBiOworCisJc3RhdHVzID0gc3NoX2dzc2FwaV9pbml0X2N0eChnc3NjdHh0LCBvcHRpb25zLmdzc19kZWxlZ19jcmVkcywKKwkgICAgcmVjdl90b2ssICZzZW5kX3RvaywgJmZsYWdzKTsKKworCWlmIChzZW5kX3Rvay5sZW5ndGggPiAwKSB7CisJCWlmIChHU1NfRVJST1Ioc3RhdHVzKSkKKwkJCXBhY2tldF9zdGFydChTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfRVJSVE9LKTsKKwkJZWxzZQorCQkJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9UT0tFTik7CisKKwkJcGFja2V0X3B1dF9zdHJpbmcoc2VuZF90b2sudmFsdWUsIHNlbmRfdG9rLmxlbmd0aCk7CisJCXBhY2tldF9zZW5kKCk7CisJCWdzc19yZWxlYXNlX2J1ZmZlcigmbXMsICZzZW5kX3Rvayk7CisJfQorCisJaWYgKHN0YXR1cyA9PSBHU1NfU19DT01QTEVURSkgeworCQkvKiBzZW5kIGVpdGhlciBjb21wbGV0ZSBvciBNSUMsIGRlcGVuZGluZyBvbiBtZWNoYW5pc20gKi8KKwkJaWYgKCEoZmxhZ3MgJiBHU1NfQ19JTlRFR19GTEFHKSkgeworCQkJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9FWENIQU5HRV9DT01QTEVURSk7CisJCQlwYWNrZXRfc2VuZCgpOworCQl9IGVsc2UgeworCQkJc3NoX2dzc2FwaV9idWlsZG1pYygmYiwgYXV0aGN0eHQtPnNlcnZlcl91c2VyLAorCQkJICAgIGF1dGhjdHh0LT5zZXJ2aWNlLCAiZ3NzYXBpLXdpdGgtbWljIik7CisKKwkJCWdzc2J1Zi52YWx1ZSA9IGJ1ZmZlcl9wdHIoJmIpOworCQkJZ3NzYnVmLmxlbmd0aCA9IGJ1ZmZlcl9sZW4oJmIpOworCisJCQlzdGF0dXMgPSBzc2hfZ3NzYXBpX3NpZ24oZ3NzY3R4dCwgJmdzc2J1ZiwgJm1pYyk7CisKKwkJCWlmICghR1NTX0VSUk9SKHN0YXR1cykpIHsKKwkJCQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfVVNFUkFVVEhfR1NTQVBJX01JQyk7CisJCQkJcGFja2V0X3B1dF9zdHJpbmcobWljLnZhbHVlLCBtaWMubGVuZ3RoKTsKKworCQkJCXBhY2tldF9zZW5kKCk7CisJCQl9CisKKwkJCWJ1ZmZlcl9mcmVlKCZiKTsKKwkJCWdzc19yZWxlYXNlX2J1ZmZlcigmbXMsICZtaWMpOworCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogQVJHU1VTRUQgKi8KK3ZvaWQKK2lucHV0X2dzc2FwaV9yZXNwb25zZShpbnQgdHlwZSwgdV9pbnQzMl90IHBsZW4sIHZvaWQgKmN0eHQpCit7CisJQXV0aGN0eHQgKmF1dGhjdHh0ID0gY3R4dDsKKwlHc3NjdHh0ICpnc3NjdHh0OworCWludCBvaWRsZW47CisJY2hhciAqb2lkdjsKKworCWlmIChhdXRoY3R4dCA9PSBOVUxMKQorCQlmYXRhbCgiaW5wdXRfZ3NzYXBpX3Jlc3BvbnNlOiBubyBhdXRoZW50aWNhdGlvbiBjb250ZXh0Iik7CisJZ3NzY3R4dCA9IGF1dGhjdHh0LT5tZXRob2RkYXRhOworCisJLyogU2V0dXAgb3VyIE9JRCAqLworCW9pZHYgPSBwYWNrZXRfZ2V0X3N0cmluZygmb2lkbGVuKTsKKworCWlmIChvaWRsZW4gPD0gMiB8fAorCSAgICBvaWR2WzBdICE9IFNTSF9HU1NfT0lEVFlQRSB8fAorCSAgICBvaWR2WzFdICE9IG9pZGxlbiAtIDIpIHsKKwkJeGZyZWUob2lkdik7CisJCWRlYnVnKCJCYWRseSBlbmNvZGVkIG1lY2hhbmlzbSBPSUQgcmVjZWl2ZWQiKTsKKwkJdXNlcmF1dGgoYXV0aGN0eHQsIE5VTEwpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFzc2hfZ3NzYXBpX2NoZWNrX29pZChnc3NjdHh0LCBvaWR2ICsgMiwgb2lkbGVuIC0gMikpCisJCWZhdGFsKCJTZXJ2ZXIgcmV0dXJuZWQgZGlmZmVyZW50IE9JRCB0aGFuIGV4cGVjdGVkIik7CisKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisKKwl4ZnJlZShvaWR2KTsKKworCWlmIChHU1NfRVJST1IocHJvY2Vzc19nc3NhcGlfdG9rZW4oY3R4dCwgR1NTX0NfTk9fQlVGRkVSKSkpIHsKKwkJLyogU3RhcnQgYWdhaW4gd2l0aCBuZXh0IG1ldGhvZCBvbiBsaXN0ICovCisJCWRlYnVnKCJUcnlpbmcgdG8gc3RhcnQgYWdhaW4iKTsKKwkJdXNlcmF1dGgoYXV0aGN0eHQsIE5VTEwpOworCQlyZXR1cm47CisJfQorfQorCisvKiBBUkdTVVNFRCAqLwordm9pZAoraW5wdXRfZ3NzYXBpX3Rva2VuKGludCB0eXBlLCB1X2ludDMyX3QgcGxlbiwgdm9pZCAqY3R4dCkKK3sKKwlBdXRoY3R4dCAqYXV0aGN0eHQgPSBjdHh0OworCWdzc19idWZmZXJfZGVzYyByZWN2X3RvazsKKwlPTV91aW50MzIgc3RhdHVzOworCXVfaW50IHNsZW47CisKKwlpZiAoYXV0aGN0eHQgPT0gTlVMTCkKKwkJZmF0YWwoImlucHV0X2dzc2FwaV9yZXNwb25zZTogbm8gYXV0aGVudGljYXRpb24gY29udGV4dCIpOworCisJcmVjdl90b2sudmFsdWUgPSBwYWNrZXRfZ2V0X3N0cmluZygmc2xlbik7CisJcmVjdl90b2subGVuZ3RoID0gc2xlbjsJLyogc2FmZSB0eXBlY2FzdCAqLworCisJcGFja2V0X2NoZWNrX2VvbSgpOworCisJc3RhdHVzID0gcHJvY2Vzc19nc3NhcGlfdG9rZW4oY3R4dCwgJnJlY3ZfdG9rKTsKKworCXhmcmVlKHJlY3ZfdG9rLnZhbHVlKTsKKworCWlmIChHU1NfRVJST1Ioc3RhdHVzKSkgeworCQkvKiBTdGFydCBhZ2FpbiB3aXRoIHRoZSBuZXh0IG1ldGhvZCBpbiB0aGUgbGlzdCAqLworCQl1c2VyYXV0aChhdXRoY3R4dCwgTlVMTCk7CisJCXJldHVybjsKKwl9Cit9CisKKy8qIEFSR1NVU0VEICovCit2b2lkCitpbnB1dF9nc3NhcGlfZXJydG9rKGludCB0eXBlLCB1X2ludDMyX3QgcGxlbiwgdm9pZCAqY3R4dCkKK3sKKwlBdXRoY3R4dCAqYXV0aGN0eHQgPSBjdHh0OworCUdzc2N0eHQgKmdzc2N0eHQ7CisJZ3NzX2J1ZmZlcl9kZXNjIHNlbmRfdG9rID0gR1NTX0NfRU1QVFlfQlVGRkVSOworCWdzc19idWZmZXJfZGVzYyByZWN2X3RvazsKKwlPTV91aW50MzIgc3RhdHVzLCBtczsKKwl1X2ludCBsZW47CisKKwlpZiAoYXV0aGN0eHQgPT0gTlVMTCkKKwkJZmF0YWwoImlucHV0X2dzc2FwaV9yZXNwb25zZTogbm8gYXV0aGVudGljYXRpb24gY29udGV4dCIpOworCWdzc2N0eHQgPSBhdXRoY3R4dC0+bWV0aG9kZGF0YTsKKworCXJlY3ZfdG9rLnZhbHVlID0gcGFja2V0X2dldF9zdHJpbmcoJmxlbik7CisJcmVjdl90b2subGVuZ3RoID0gbGVuOworCisJcGFja2V0X2NoZWNrX2VvbSgpOworCisJLyogU3RpY2sgaXQgaW50byBHU1NBUEkgYW5kIHNlZSB3aGF0IGl0IHNheXMgKi8KKwlzdGF0dXMgPSBzc2hfZ3NzYXBpX2luaXRfY3R4KGdzc2N0eHQsIG9wdGlvbnMuZ3NzX2RlbGVnX2NyZWRzLAorCSAgICAmcmVjdl90b2ssICZzZW5kX3RvaywgTlVMTCk7CisKKwl4ZnJlZShyZWN2X3Rvay52YWx1ZSk7CisJZ3NzX3JlbGVhc2VfYnVmZmVyKCZtcywgJnNlbmRfdG9rKTsKKworCS8qIFNlcnZlciB3aWxsIGJlIHJldHVybmluZyBhIGZhaWxlZCBwYWNrZXQgYWZ0ZXIgdGhpcyBvbmUgKi8KK30KKworLyogQVJHU1VTRUQgKi8KK3ZvaWQKK2lucHV0X2dzc2FwaV9lcnJvcihpbnQgdHlwZSwgdV9pbnQzMl90IHBsZW4sIHZvaWQgKmN0eHQpCit7CisJT01fdWludDMyIG1haiwgbWluOworCWNoYXIgKm1zZzsKKwljaGFyICpsYW5nOworCisJbWFqPXBhY2tldF9nZXRfaW50KCk7CisJbWluPXBhY2tldF9nZXRfaW50KCk7CisJbXNnPXBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOworCWxhbmc9cGFja2V0X2dldF9zdHJpbmcoTlVMTCk7CisKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisKKwlkZWJ1ZygiU2VydmVyIEdTU0FQSSBFcnJvcjpcbiVzIiwgbXNnKTsKKwl4ZnJlZShtc2cpOworCXhmcmVlKGxhbmcpOworfQorI2VuZGlmIC8qIEdTU0FQSSAqLworCitpbnQKK3VzZXJhdXRoX25vbmUoQXV0aGN0eHQgKmF1dGhjdHh0KQoreworCS8qIGluaXRpYWwgdXNlcmF1dGggcmVxdWVzdCAqLworCXBhY2tldF9zdGFydChTU0gyX01TR19VU0VSQVVUSF9SRVFVRVNUKTsKKwlwYWNrZXRfcHV0X2NzdHJpbmcoYXV0aGN0eHQtPnNlcnZlcl91c2VyKTsKKwlwYWNrZXRfcHV0X2NzdHJpbmcoYXV0aGN0eHQtPnNlcnZpY2UpOworCXBhY2tldF9wdXRfY3N0cmluZyhhdXRoY3R4dC0+bWV0aG9kLT5uYW1lKTsKKwlwYWNrZXRfc2VuZCgpOworCXJldHVybiAxOworfQorCitpbnQKK3VzZXJhdXRoX3Bhc3N3ZChBdXRoY3R4dCAqYXV0aGN0eHQpCit7CisJc3RhdGljIGludCBhdHRlbXB0ID0gMDsKKwljaGFyIHByb21wdFsxNTBdOworCWNoYXIgKnBhc3N3b3JkOworCWNvbnN0IGNoYXIgKmhvc3QgPSBvcHRpb25zLmhvc3Rfa2V5X2FsaWFzID8gIG9wdGlvbnMuaG9zdF9rZXlfYWxpYXMgOgorCSAgICBhdXRoY3R4dC0+aG9zdDsKKworCWlmIChhdHRlbXB0KysgPj0gb3B0aW9ucy5udW1iZXJfb2ZfcGFzc3dvcmRfcHJvbXB0cykKKwkJcmV0dXJuIDA7CisKKwlpZiAoYXR0ZW1wdCAhPSAxKQorCQllcnJvcigiUGVybWlzc2lvbiBkZW5pZWQsIHBsZWFzZSB0cnkgYWdhaW4uIik7CisKKwlzbnByaW50Zihwcm9tcHQsIHNpemVvZihwcm9tcHQpLCAiJS4zMHNAJS4xMjhzJ3MgcGFzc3dvcmQ6ICIsCisJICAgIGF1dGhjdHh0LT5zZXJ2ZXJfdXNlciwgaG9zdCk7CisJcGFzc3dvcmQgPSByZWFkX3Bhc3NwaHJhc2UocHJvbXB0LCAwKTsKKwlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfVVNFUkFVVEhfUkVRVUVTVCk7CisJcGFja2V0X3B1dF9jc3RyaW5nKGF1dGhjdHh0LT5zZXJ2ZXJfdXNlcik7CisJcGFja2V0X3B1dF9jc3RyaW5nKGF1dGhjdHh0LT5zZXJ2aWNlKTsKKwlwYWNrZXRfcHV0X2NzdHJpbmcoYXV0aGN0eHQtPm1ldGhvZC0+bmFtZSk7CisJcGFja2V0X3B1dF9jaGFyKDApOworCXBhY2tldF9wdXRfY3N0cmluZyhwYXNzd29yZCk7CisJbWVtc2V0KHBhc3N3b3JkLCAwLCBzdHJsZW4ocGFzc3dvcmQpKTsKKwl4ZnJlZShwYXNzd29yZCk7CisJcGFja2V0X2FkZF9wYWRkaW5nKDY0KTsKKwlwYWNrZXRfc2VuZCgpOworCisJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX1BBU1NXRF9DSEFOR0VSRVEsCisJICAgICZpbnB1dF91c2VyYXV0aF9wYXNzd2RfY2hhbmdlcmVxKTsKKworCXJldHVybiAxOworfQorCisvKgorICogcGFyc2UgUEFTU1dEX0NIQU5HRVJFUSwgcHJvbXB0IHVzZXIgYW5kIHNlbmQgU1NIMl9NU0dfVVNFUkFVVEhfUkVRVUVTVAorICovCisvKiBBUkdTVVNFRCAqLwordm9pZAoraW5wdXRfdXNlcmF1dGhfcGFzc3dkX2NoYW5nZXJlcShpbnQgdHlwZSwgdV9pbnQzMl90IHNlcW5yLCB2b2lkICpjdHh0KQoreworCUF1dGhjdHh0ICphdXRoY3R4dCA9IGN0eHQ7CisJY2hhciAqaW5mbywgKmxhbmcsICpwYXNzd29yZCA9IE5VTEwsICpyZXR5cGUgPSBOVUxMOworCWNoYXIgcHJvbXB0WzE1MF07CisJY29uc3QgY2hhciAqaG9zdCA9IG9wdGlvbnMuaG9zdF9rZXlfYWxpYXMgPyBvcHRpb25zLmhvc3Rfa2V5X2FsaWFzIDoKKwkgICAgYXV0aGN0eHQtPmhvc3Q7CisKKwlkZWJ1ZzIoImlucHV0X3VzZXJhdXRoX3Bhc3N3ZF9jaGFuZ2VyZXEiKTsKKworCWlmIChhdXRoY3R4dCA9PSBOVUxMKQorCQlmYXRhbCgiaW5wdXRfdXNlcmF1dGhfcGFzc3dkX2NoYW5nZXJlcTogIgorCQkgICAgIm5vIGF1dGhlbnRpY2F0aW9uIGNvbnRleHQiKTsKKworCWluZm8gPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKKwlsYW5nID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7CisJaWYgKHN0cmxlbihpbmZvKSA+IDApCisJCWxvZ2l0KCIlcyIsIGluZm8pOworCXhmcmVlKGluZm8pOworCXhmcmVlKGxhbmcpOworCXBhY2tldF9zdGFydChTU0gyX01TR19VU0VSQVVUSF9SRVFVRVNUKTsKKwlwYWNrZXRfcHV0X2NzdHJpbmcoYXV0aGN0eHQtPnNlcnZlcl91c2VyKTsKKwlwYWNrZXRfcHV0X2NzdHJpbmcoYXV0aGN0eHQtPnNlcnZpY2UpOworCXBhY2tldF9wdXRfY3N0cmluZyhhdXRoY3R4dC0+bWV0aG9kLT5uYW1lKTsKKwlwYWNrZXRfcHV0X2NoYXIoMSk7CQkJLyogYWRkaXRpb25hbCBpbmZvICovCisJc25wcmludGYocHJvbXB0LCBzaXplb2YocHJvbXB0KSwKKwkgICAgIkVudGVyICUuMzBzQCUuMTI4cydzIG9sZCBwYXNzd29yZDogIiwKKwkgICAgYXV0aGN0eHQtPnNlcnZlcl91c2VyLCBob3N0KTsKKwlwYXNzd29yZCA9IHJlYWRfcGFzc3BocmFzZShwcm9tcHQsIDApOworCXBhY2tldF9wdXRfY3N0cmluZyhwYXNzd29yZCk7CisJbWVtc2V0KHBhc3N3b3JkLCAwLCBzdHJsZW4ocGFzc3dvcmQpKTsKKwl4ZnJlZShwYXNzd29yZCk7CisJcGFzc3dvcmQgPSBOVUxMOworCXdoaWxlIChwYXNzd29yZCA9PSBOVUxMKSB7CisJCXNucHJpbnRmKHByb21wdCwgc2l6ZW9mKHByb21wdCksCisJCSAgICAiRW50ZXIgJS4zMHNAJS4xMjhzJ3MgbmV3IHBhc3N3b3JkOiAiLAorCQkgICAgYXV0aGN0eHQtPnNlcnZlcl91c2VyLCBob3N0KTsKKwkJcGFzc3dvcmQgPSByZWFkX3Bhc3NwaHJhc2UocHJvbXB0LCBSUF9BTExPV19FT0YpOworCQlpZiAocGFzc3dvcmQgPT0gTlVMTCkgeworCQkJLyogYmFpbCBvdXQgKi8KKwkJCXJldHVybjsKKwkJfQorCQlzbnByaW50Zihwcm9tcHQsIHNpemVvZihwcm9tcHQpLAorCQkgICAgIlJldHlwZSAlLjMwc0AlLjEyOHMncyBuZXcgcGFzc3dvcmQ6ICIsCisJCSAgICBhdXRoY3R4dC0+c2VydmVyX3VzZXIsIGhvc3QpOworCQlyZXR5cGUgPSByZWFkX3Bhc3NwaHJhc2UocHJvbXB0LCAwKTsKKwkJaWYgKHN0cmNtcChwYXNzd29yZCwgcmV0eXBlKSAhPSAwKSB7CisJCQltZW1zZXQocGFzc3dvcmQsIDAsIHN0cmxlbihwYXNzd29yZCkpOworCQkJeGZyZWUocGFzc3dvcmQpOworCQkJbG9naXQoIk1pc21hdGNoOyB0cnkgYWdhaW4sIEVPRiB0byBxdWl0LiIpOworCQkJcGFzc3dvcmQgPSBOVUxMOworCQl9CisJCW1lbXNldChyZXR5cGUsIDAsIHN0cmxlbihyZXR5cGUpKTsKKwkJeGZyZWUocmV0eXBlKTsKKwl9CisJcGFja2V0X3B1dF9jc3RyaW5nKHBhc3N3b3JkKTsKKwltZW1zZXQocGFzc3dvcmQsIDAsIHN0cmxlbihwYXNzd29yZCkpOworCXhmcmVlKHBhc3N3b3JkKTsKKwlwYWNrZXRfYWRkX3BhZGRpbmcoNjQpOworCXBhY2tldF9zZW5kKCk7CisKKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfUEFTU1dEX0NIQU5HRVJFUSwKKwkgICAgJmlucHV0X3VzZXJhdXRoX3Bhc3N3ZF9jaGFuZ2VyZXEpOworfQorCisjaWZkZWYgSlBBS0UKK3N0YXRpYyBjaGFyICoKK3B3X2VuY3J5cHQoY29uc3QgY2hhciAqcGFzc3dvcmQsIGNvbnN0IGNoYXIgKmNyeXB0X3NjaGVtZSwgY29uc3QgY2hhciAqc2FsdCkKK3sKKwkvKiBPcGVuQlNEIGNyeXB0KDMpIGhhbmRsZXMgYWxsIG9mIHRoZXNlICovCisJaWYgKHN0cmNtcChjcnlwdF9zY2hlbWUsICJjcnlwdCIpID09IDAgfHwKKwkgICAgc3RyY21wKGNyeXB0X3NjaGVtZSwgImJjcnlwdCIpID09IDAgfHwKKwkgICAgc3RyY21wKGNyeXB0X3NjaGVtZSwgIm1kNWNyeXB0IikgPT0gMCB8fAorCSAgICBzdHJjbXAoY3J5cHRfc2NoZW1lLCAiY3J5cHQtZXh0ZW5kZWQiKSA9PSAwKQorCQlyZXR1cm4geHN0cmR1cChjcnlwdChwYXNzd29yZCwgc2FsdCkpOworCWVycm9yKCIlczogdW5zdXBwb3J0ZWQgcGFzc3dvcmQgZW5jcnlwdGlvbiBzY2hlbWUgXCIlLjEwMHNcIiIsCisJICAgIF9fZnVuY19fLCBjcnlwdF9zY2hlbWUpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgQklHTlVNICoKK2pwYWtlX3Bhc3N3b3JkX3RvX3NlY3JldChBdXRoY3R4dCAqYXV0aGN0eHQsIGNvbnN0IGNoYXIgKmNyeXB0X3NjaGVtZSwKKyAgICBjb25zdCBjaGFyICpzYWx0KQoreworCWNoYXIgcHJvbXB0WzI1Nl0sICpwYXNzd29yZCwgKmNyeXB0ZWQ7CisJdV9jaGFyICpzZWNyZXQ7CisJdV9pbnQgc2VjcmV0X2xlbjsKKwlCSUdOVU0gKnJldDsKKworCXNucHJpbnRmKHByb21wdCwgc2l6ZW9mKHByb21wdCksICIlLjMwc0AlLjEyOHMncyBwYXNzd29yZCAoSlBBS0UpOiAiLAorCSAgICBhdXRoY3R4dC0+c2VydmVyX3VzZXIsIGF1dGhjdHh0LT5ob3N0KTsKKwlwYXNzd29yZCA9IHJlYWRfcGFzc3BocmFzZShwcm9tcHQsIDApOworCisJaWYgKChjcnlwdGVkID0gcHdfZW5jcnlwdChwYXNzd29yZCwgY3J5cHRfc2NoZW1lLCBzYWx0KSkgPT0gTlVMTCkgeworCQlsb2dpdCgiRGlzYWJsaW5nICVzIGF1dGhlbnRpY2F0aW9uIiwgYXV0aGN0eHQtPm1ldGhvZC0+bmFtZSk7CisJCWF1dGhjdHh0LT5tZXRob2QtPmVuYWJsZWQgPSBOVUxMOworCQkvKiBDb250aW51ZSB3aXRoIGFuIGVtcHR5IHBhc3N3b3JkIHRvIGZhaWwgZ3JhY2VmdWxseSAqLworCQljcnlwdGVkID0geHN0cmR1cCgiIik7CisJfQorCisjaWZkZWYgSlBBS0VfREVCVUcKKwlkZWJ1ZzMoIiVzOiBzYWx0ID0gJXMiLCBfX2Z1bmNfXywgc2FsdCk7CisJZGVidWczKCIlczogc2NoZW1lID0gJXMiLCBfX2Z1bmNfXywgY3J5cHRfc2NoZW1lKTsKKwlkZWJ1ZzMoIiVzOiBjcnlwdGVkID0gJXMiLCBfX2Z1bmNfXywgY3J5cHRlZCk7CisjZW5kaWYKKworCWlmIChoYXNoX2J1ZmZlcihjcnlwdGVkLCBzdHJsZW4oY3J5cHRlZCksIEVWUF9zaGEyNTYoKSwKKwkgICAgJnNlY3JldCwgJnNlY3JldF9sZW4pICE9IDApCisJCWZhdGFsKCIlczogaGFzaF9idWZmZXIiLCBfX2Z1bmNfXyk7CisKKwliemVybyhwYXNzd29yZCwgc3RybGVuKHBhc3N3b3JkKSk7CisJYnplcm8oY3J5cHRlZCwgc3RybGVuKGNyeXB0ZWQpKTsKKwl4ZnJlZShwYXNzd29yZCk7CisJeGZyZWUoY3J5cHRlZCk7CisKKwlpZiAoKHJldCA9IEJOX2JpbjJibihzZWNyZXQsIHNlY3JldF9sZW4sIE5VTEwpKSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IEJOX2JpbjJibiAoc2VjcmV0KSIsIF9fZnVuY19fKTsKKwliemVybyhzZWNyZXQsIHNlY3JldF9sZW4pOworCXhmcmVlKHNlY3JldCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBBUkdTVVNFRCAqLwordm9pZAoraW5wdXRfdXNlcmF1dGhfanBha2Vfc2VydmVyX3N0ZXAxKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQoreworCUF1dGhjdHh0ICphdXRoY3R4dCA9IGN0eHQ7CisJc3RydWN0IGpwYWtlX2N0eCAqcGN0eCA9IGF1dGhjdHh0LT5tZXRob2RkYXRhOworCXVfY2hhciAqeDNfcHJvb2YsICp4NF9wcm9vZiwgKngyX3NfcHJvb2Y7CisJdV9pbnQgeDNfcHJvb2ZfbGVuLCB4NF9wcm9vZl9sZW4sIHgyX3NfcHJvb2ZfbGVuOworCWNoYXIgKmNyeXB0X3NjaGVtZSwgKnNhbHQ7CisKKwkvKiBEaXNhYmxlIHRoaXMgbWVzc2FnZSAqLworCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9KUEFLRV9TRVJWRVJfU1RFUDEsIE5VTEwpOworCisJaWYgKChwY3R4LT5nX3gzID0gQk5fbmV3KCkpID09IE5VTEwgfHwKKwkgICAgKHBjdHgtPmdfeDQgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBCTl9uZXciLCBfX2Z1bmNfXyk7CisKKwkvKiBGZXRjaCBzdGVwIDEgdmFsdWVzICovCisJY3J5cHRfc2NoZW1lID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7CisJc2FsdCA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOworCXBjdHgtPnNlcnZlcl9pZCA9IHBhY2tldF9nZXRfc3RyaW5nKCZwY3R4LT5zZXJ2ZXJfaWRfbGVuKTsKKwlwYWNrZXRfZ2V0X2JpZ251bTIocGN0eC0+Z194Myk7CisJcGFja2V0X2dldF9iaWdudW0yKHBjdHgtPmdfeDQpOworCXgzX3Byb29mID0gcGFja2V0X2dldF9zdHJpbmcoJngzX3Byb29mX2xlbik7CisJeDRfcHJvb2YgPSBwYWNrZXRfZ2V0X3N0cmluZygmeDRfcHJvb2ZfbGVuKTsKKwlwYWNrZXRfY2hlY2tfZW9tKCk7CisKKwlKUEFLRV9ERUJVR19DVFgoKHBjdHgsICJzdGVwIDEgcmVjZWl2ZWQgaW4gJXMiLCBfX2Z1bmNfXykpOworCisJLyogT2J0YWluIHBhc3N3b3JkIGFuZCBkZXJpdmUgc2VjcmV0ICovCisJcGN0eC0+cyA9IGpwYWtlX3Bhc3N3b3JkX3RvX3NlY3JldChhdXRoY3R4dCwgY3J5cHRfc2NoZW1lLCBzYWx0KTsKKwliemVybyhjcnlwdF9zY2hlbWUsIHN0cmxlbihjcnlwdF9zY2hlbWUpKTsKKwliemVybyhzYWx0LCBzdHJsZW4oc2FsdCkpOworCXhmcmVlKGNyeXB0X3NjaGVtZSk7CisJeGZyZWUoc2FsdCk7CisJSlBBS0VfREVCVUdfQk4oKHBjdHgtPnMsICIlczogcyA9ICIsIF9fZnVuY19fKSk7CisKKwkvKiBDYWxjdWxhdGUgc3RlcCAyIHZhbHVlcyAqLworCWpwYWtlX3N0ZXAyKHBjdHgtPmdycCwgcGN0eC0+cywgcGN0eC0+Z194MSwKKwkgICAgcGN0eC0+Z194MywgcGN0eC0+Z194NCwgcGN0eC0+eDIsCisJICAgIHBjdHgtPnNlcnZlcl9pZCwgcGN0eC0+c2VydmVyX2lkX2xlbiwKKwkgICAgcGN0eC0+Y2xpZW50X2lkLCBwY3R4LT5jbGllbnRfaWRfbGVuLAorCSAgICB4M19wcm9vZiwgeDNfcHJvb2ZfbGVuLAorCSAgICB4NF9wcm9vZiwgeDRfcHJvb2ZfbGVuLAorCSAgICAmcGN0eC0+YSwKKwkgICAgJngyX3NfcHJvb2YsICZ4Ml9zX3Byb29mX2xlbik7CisKKwliemVybyh4M19wcm9vZiwgeDNfcHJvb2ZfbGVuKTsKKwliemVybyh4NF9wcm9vZiwgeDRfcHJvb2ZfbGVuKTsKKwl4ZnJlZSh4M19wcm9vZik7CisJeGZyZWUoeDRfcHJvb2YpOworCisJSlBBS0VfREVCVUdfQ1RYKChwY3R4LCAic3RlcCAyIHNlbmRpbmcgaW4gJXMiLCBfX2Z1bmNfXykpOworCisJLyogU2VuZCB2YWx1ZXMgZm9yIHN0ZXAgMiAqLworCXBhY2tldF9zdGFydChTU0gyX01TR19VU0VSQVVUSF9KUEFLRV9DTElFTlRfU1RFUDIpOworCXBhY2tldF9wdXRfYmlnbnVtMihwY3R4LT5hKTsKKwlwYWNrZXRfcHV0X3N0cmluZyh4Ml9zX3Byb29mLCB4Ml9zX3Byb29mX2xlbik7CisJcGFja2V0X3NlbmQoKTsKKworCWJ6ZXJvKHgyX3NfcHJvb2YsIHgyX3NfcHJvb2ZfbGVuKTsKKwl4ZnJlZSh4Ml9zX3Byb29mKTsKKworCS8qIEV4cGVjdCBzdGVwIDIgcGFja2V0IGZyb20gcGVlciAqLworCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9KUEFLRV9TRVJWRVJfU1RFUDIsCisJICAgIGlucHV0X3VzZXJhdXRoX2pwYWtlX3NlcnZlcl9zdGVwMik7Cit9CisKKy8qIEFSR1NVU0VEICovCit2b2lkCitpbnB1dF91c2VyYXV0aF9qcGFrZV9zZXJ2ZXJfc3RlcDIoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCit7CisJQXV0aGN0eHQgKmF1dGhjdHh0ID0gY3R4dDsKKwlzdHJ1Y3QganBha2VfY3R4ICpwY3R4ID0gYXV0aGN0eHQtPm1ldGhvZGRhdGE7CisJdV9jaGFyICp4NF9zX3Byb29mOworCXVfaW50IHg0X3NfcHJvb2ZfbGVuOworCisJLyogRGlzYWJsZSB0aGlzIG1lc3NhZ2UgKi8KKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfSlBBS0VfU0VSVkVSX1NURVAyLCBOVUxMKTsKKworCWlmICgocGN0eC0+YiA9IEJOX25ldygpKSA9PSBOVUxMKQorCQlmYXRhbCgiJXM6IEJOX25ldyIsIF9fZnVuY19fKTsKKworCS8qIEZldGNoIHN0ZXAgMiB2YWx1ZXMgKi8KKwlwYWNrZXRfZ2V0X2JpZ251bTIocGN0eC0+Yik7CisJeDRfc19wcm9vZiA9IHBhY2tldF9nZXRfc3RyaW5nKCZ4NF9zX3Byb29mX2xlbik7CisJcGFja2V0X2NoZWNrX2VvbSgpOworCisJSlBBS0VfREVCVUdfQ1RYKChwY3R4LCAic3RlcCAyIHJlY2VpdmVkIGluICVzIiwgX19mdW5jX18pKTsKKworCS8qIERlcml2ZSBzaGFyZWQga2V5IGFuZCBjYWxjdWxhdGUgY29uZmlybWF0aW9uIGhhc2ggKi8KKwlqcGFrZV9rZXlfY29uZmlybShwY3R4LT5ncnAsIHBjdHgtPnMsIHBjdHgtPmIsCisJICAgIHBjdHgtPngyLCBwY3R4LT5nX3gxLCBwY3R4LT5nX3gyLCBwY3R4LT5nX3gzLCBwY3R4LT5nX3g0LAorCSAgICBwY3R4LT5jbGllbnRfaWQsIHBjdHgtPmNsaWVudF9pZF9sZW4sCisJICAgIHBjdHgtPnNlcnZlcl9pZCwgcGN0eC0+c2VydmVyX2lkX2xlbiwKKwkgICAgc2Vzc2lvbl9pZDIsIHNlc3Npb25faWQyX2xlbiwKKwkgICAgeDRfc19wcm9vZiwgeDRfc19wcm9vZl9sZW4sCisJICAgICZwY3R4LT5rLAorCSAgICAmcGN0eC0+aF9rX2NpZF9zZXNzaWQsICZwY3R4LT5oX2tfY2lkX3Nlc3NpZF9sZW4pOworCisJYnplcm8oeDRfc19wcm9vZiwgeDRfc19wcm9vZl9sZW4pOworCXhmcmVlKHg0X3NfcHJvb2YpOworCisJSlBBS0VfREVCVUdfQ1RYKChwY3R4LCAiY29uZmlybSBzZW5kaW5nIGluICVzIiwgX19mdW5jX18pKTsKKworCS8qIFNlbmQga2V5IGNvbmZpcm1hdGlvbiBwcm9vZiAqLworCXBhY2tldF9zdGFydChTU0gyX01TR19VU0VSQVVUSF9KUEFLRV9DTElFTlRfQ09ORklSTSk7CisJcGFja2V0X3B1dF9zdHJpbmcocGN0eC0+aF9rX2NpZF9zZXNzaWQsIHBjdHgtPmhfa19jaWRfc2Vzc2lkX2xlbik7CisJcGFja2V0X3NlbmQoKTsKKworCS8qIEV4cGVjdCBjb25maXJtYXRpb24gZnJvbSBwZWVyICovCisJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0pQQUtFX1NFUlZFUl9DT05GSVJNLAorCSAgICBpbnB1dF91c2VyYXV0aF9qcGFrZV9zZXJ2ZXJfY29uZmlybSk7Cit9CisKKy8qIEFSR1NVU0VEICovCit2b2lkCitpbnB1dF91c2VyYXV0aF9qcGFrZV9zZXJ2ZXJfY29uZmlybShpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKK3sKKwlBdXRoY3R4dCAqYXV0aGN0eHQgPSBjdHh0OworCXN0cnVjdCBqcGFrZV9jdHggKnBjdHggPSBhdXRoY3R4dC0+bWV0aG9kZGF0YTsKKworCS8qIERpc2FibGUgdGhpcyBtZXNzYWdlICovCisJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0pQQUtFX1NFUlZFUl9DT05GSVJNLCBOVUxMKTsKKworCXBjdHgtPmhfa19zaWRfc2Vzc2lkID0gcGFja2V0X2dldF9zdHJpbmcoJnBjdHgtPmhfa19zaWRfc2Vzc2lkX2xlbik7CisJcGFja2V0X2NoZWNrX2VvbSgpOworCisJSlBBS0VfREVCVUdfQ1RYKChwY3R4LCAiY29uZmlybSByZWNlaXZlZCBpbiAlcyIsIF9fZnVuY19fKSk7CisKKwkvKiBWZXJpZnkgZXhwZWN0ZWQgY29uZmlybWF0aW9uIGhhc2ggKi8KKwlpZiAoanBha2VfY2hlY2tfY29uZmlybShwY3R4LT5rLAorCSAgICBwY3R4LT5zZXJ2ZXJfaWQsIHBjdHgtPnNlcnZlcl9pZF9sZW4sCisJICAgIHNlc3Npb25faWQyLCBzZXNzaW9uX2lkMl9sZW4sCisJICAgIHBjdHgtPmhfa19zaWRfc2Vzc2lkLCBwY3R4LT5oX2tfc2lkX3Nlc3NpZF9sZW4pID09IDEpCisJCWRlYnVnKCIlczogJXMgc3VjY2VzcyIsIF9fZnVuY19fLCBhdXRoY3R4dC0+bWV0aG9kLT5uYW1lKTsKKwllbHNlIHsKKwkJZGVidWcoIiVzOiBjb25maXJtYXRpb24gbWlzbWF0Y2giLCBfX2Z1bmNfXyk7CisJCS8qIFhYWCBzdGFzaCB0aGlzIHNvIGlmIGF1dGggc3VjY2VlZHMgdGhlbiB3ZSBjYW4gd2Fybi9raWxsICovCisJfQorCisJdXNlcmF1dGhfanBha2VfY2xlYW51cChhdXRoY3R4dCk7Cit9CisjZW5kaWYgLyogSlBBS0UgKi8KKworc3RhdGljIGludAoraWRlbnRpdHlfc2lnbihJZGVudGl0eSAqaWQsIHVfY2hhciAqKnNpZ3AsIHVfaW50ICpsZW5wLAorICAgIHVfY2hhciAqZGF0YSwgdV9pbnQgZGF0YWxlbikKK3sKKwlLZXkgKnBydjsKKwlpbnQgcmV0OworCisJLyogdGhlIGFnZW50IHN1cHBvcnRzIHRoaXMga2V5ICovCisJaWYgKGlkLT5hYykKKwkJcmV0dXJuIChzc2hfYWdlbnRfc2lnbihpZC0+YWMsIGlkLT5rZXksIHNpZ3AsIGxlbnAsCisJCSAgICBkYXRhLCBkYXRhbGVuKSk7CisJLyoKKwkgKiB3ZSBoYXZlIGFscmVhZHkgbG9hZGVkIHRoZSBwcml2YXRlIGtleSBvcgorCSAqIHRoZSBwcml2YXRlIGtleSBpcyBzdG9yZWQgaW4gZXh0ZXJuYWwgaGFyZHdhcmUKKwkgKi8KKwlpZiAoaWQtPmlzcHJpdmF0ZSB8fCAoaWQtPmtleS0+ZmxhZ3MgJiBLRVlfRkxBR19FWFQpKQorCQlyZXR1cm4gKGtleV9zaWduKGlkLT5rZXksIHNpZ3AsIGxlbnAsIGRhdGEsIGRhdGFsZW4pKTsKKwkvKiBsb2FkIHRoZSBwcml2YXRlIGtleSBmcm9tIHRoZSBmaWxlICovCisJaWYgKChwcnYgPSBsb2FkX2lkZW50aXR5X2ZpbGUoaWQtPmZpbGVuYW1lKSkgPT0gTlVMTCkKKwkJcmV0dXJuICgtMSk7CisJcmV0ID0ga2V5X3NpZ24ocHJ2LCBzaWdwLCBsZW5wLCBkYXRhLCBkYXRhbGVuKTsKKwlrZXlfZnJlZShwcnYpOworCXJldHVybiAocmV0KTsKK30KKworc3RhdGljIGludAorc2lnbl9hbmRfc2VuZF9wdWJrZXkoQXV0aGN0eHQgKmF1dGhjdHh0LCBJZGVudGl0eSAqaWQpCit7CisJQnVmZmVyIGI7CisJdV9jaGFyICpibG9iLCAqc2lnbmF0dXJlOworCXVfaW50IGJsb2JsZW4sIHNsZW47CisJdV9pbnQgc2tpcCA9IDA7CisJaW50IHJldCA9IC0xOworCWludCBoYXZlX3NpZyA9IDE7CisJY2hhciAqZnA7CisKKwlmcCA9IGtleV9maW5nZXJwcmludChpZC0+a2V5LCBTU0hfRlBfTUQ1LCBTU0hfRlBfSEVYKTsKKwlkZWJ1ZzMoInNpZ25fYW5kX3NlbmRfcHVia2V5OiAlcyAlcyIsIGtleV90eXBlKGlkLT5rZXkpLCBmcCk7CisJeGZyZWUoZnApOworCisJaWYgKGtleV90b19ibG9iKGlkLT5rZXksICZibG9iLCAmYmxvYmxlbikgPT0gMCkgeworCQkvKiB3ZSBjYW5ub3QgaGFuZGxlIHRoaXMga2V5ICovCisJCWRlYnVnMygic2lnbl9hbmRfc2VuZF9wdWJrZXk6IGNhbm5vdCBoYW5kbGUga2V5Iik7CisJCXJldHVybiAwOworCX0KKwkvKiBkYXRhIHRvIGJlIHNpZ25lZCAqLworCWJ1ZmZlcl9pbml0KCZiKTsKKwlpZiAoZGF0YWZlbGxvd3MgJiBTU0hfT0xEX1NFU1NJT05JRCkgeworCQlidWZmZXJfYXBwZW5kKCZiLCBzZXNzaW9uX2lkMiwgc2Vzc2lvbl9pZDJfbGVuKTsKKwkJc2tpcCA9IHNlc3Npb25faWQyX2xlbjsKKwl9IGVsc2UgeworCQlidWZmZXJfcHV0X3N0cmluZygmYiwgc2Vzc2lvbl9pZDIsIHNlc3Npb25faWQyX2xlbik7CisJCXNraXAgPSBidWZmZXJfbGVuKCZiKTsKKwl9CisJYnVmZmVyX3B1dF9jaGFyKCZiLCBTU0gyX01TR19VU0VSQVVUSF9SRVFVRVNUKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIGF1dGhjdHh0LT5zZXJ2ZXJfdXNlcik7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZiLAorCSAgICBkYXRhZmVsbG93cyAmIFNTSF9CVUdfUEtTRVJWSUNFID8KKwkgICAgInNzaC11c2VyYXV0aCIgOgorCSAgICBhdXRoY3R4dC0+c2VydmljZSk7CisJaWYgKGRhdGFmZWxsb3dzICYgU1NIX0JVR19QS0FVVEgpIHsKKwkJYnVmZmVyX3B1dF9jaGFyKCZiLCBoYXZlX3NpZyk7CisJfSBlbHNlIHsKKwkJYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBhdXRoY3R4dC0+bWV0aG9kLT5uYW1lKTsKKwkJYnVmZmVyX3B1dF9jaGFyKCZiLCBoYXZlX3NpZyk7CisJCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwga2V5X3NzaF9uYW1lKGlkLT5rZXkpKTsKKwl9CisJYnVmZmVyX3B1dF9zdHJpbmcoJmIsIGJsb2IsIGJsb2JsZW4pOworCisJLyogZ2VuZXJhdGUgc2lnbmF0dXJlICovCisJcmV0ID0gaWRlbnRpdHlfc2lnbihpZCwgJnNpZ25hdHVyZSwgJnNsZW4sCisJICAgIGJ1ZmZlcl9wdHIoJmIpLCBidWZmZXJfbGVuKCZiKSk7CisJaWYgKHJldCA9PSAtMSkgeworCQl4ZnJlZShibG9iKTsKKwkJYnVmZmVyX2ZyZWUoJmIpOworCQlyZXR1cm4gMDsKKwl9CisjaWZkZWYgREVCVUdfUEsKKwlidWZmZXJfZHVtcCgmYik7CisjZW5kaWYKKwlpZiAoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX1BLU0VSVklDRSkgeworCQlidWZmZXJfY2xlYXIoJmIpOworCQlidWZmZXJfYXBwZW5kKCZiLCBzZXNzaW9uX2lkMiwgc2Vzc2lvbl9pZDJfbGVuKTsKKwkJc2tpcCA9IHNlc3Npb25faWQyX2xlbjsKKwkJYnVmZmVyX3B1dF9jaGFyKCZiLCBTU0gyX01TR19VU0VSQVVUSF9SRVFVRVNUKTsKKwkJYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBhdXRoY3R4dC0+c2VydmVyX3VzZXIpOworCQlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIGF1dGhjdHh0LT5zZXJ2aWNlKTsKKwkJYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBhdXRoY3R4dC0+bWV0aG9kLT5uYW1lKTsKKwkJYnVmZmVyX3B1dF9jaGFyKCZiLCBoYXZlX3NpZyk7CisJCWlmICghKGRhdGFmZWxsb3dzICYgU1NIX0JVR19QS0FVVEgpKQorCQkJYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBrZXlfc3NoX25hbWUoaWQtPmtleSkpOworCQlidWZmZXJfcHV0X3N0cmluZygmYiwgYmxvYiwgYmxvYmxlbik7CisJfQorCXhmcmVlKGJsb2IpOworCisJLyogYXBwZW5kIHNpZ25hdHVyZSAqLworCWJ1ZmZlcl9wdXRfc3RyaW5nKCZiLCBzaWduYXR1cmUsIHNsZW4pOworCXhmcmVlKHNpZ25hdHVyZSk7CisKKwkvKiBza2lwIHNlc3Npb24gaWQgYW5kIHBhY2tldCB0eXBlICovCisJaWYgKGJ1ZmZlcl9sZW4oJmIpIDwgc2tpcCArIDEpCisJCWZhdGFsKCJ1c2VyYXV0aF9wdWJrZXk6IGludGVybmFsIGVycm9yIik7CisJYnVmZmVyX2NvbnN1bWUoJmIsIHNraXAgKyAxKTsKKworCS8qIHB1dCByZW1haW5pbmcgZGF0YSBmcm9tIGJ1ZmZlciBpbnRvIHBhY2tldCAqLworCXBhY2tldF9zdGFydChTU0gyX01TR19VU0VSQVVUSF9SRVFVRVNUKTsKKwlwYWNrZXRfcHV0X3JhdyhidWZmZXJfcHRyKCZiKSwgYnVmZmVyX2xlbigmYikpOworCWJ1ZmZlcl9mcmVlKCZiKTsKKwlwYWNrZXRfc2VuZCgpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK3NlbmRfcHVia2V5X3Rlc3QoQXV0aGN0eHQgKmF1dGhjdHh0LCBJZGVudGl0eSAqaWQpCit7CisJdV9jaGFyICpibG9iOworCXVfaW50IGJsb2JsZW4sIGhhdmVfc2lnID0gMDsKKworCWRlYnVnMygic2VuZF9wdWJrZXlfdGVzdCIpOworCisJaWYgKGtleV90b19ibG9iKGlkLT5rZXksICZibG9iLCAmYmxvYmxlbikgPT0gMCkgeworCQkvKiB3ZSBjYW5ub3QgaGFuZGxlIHRoaXMga2V5ICovCisJCWRlYnVnMygic2VuZF9wdWJrZXlfdGVzdDogY2Fubm90IGhhbmRsZSBrZXkiKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIHJlZ2lzdGVyIGNhbGxiYWNrIGZvciBVU0VSQVVUSF9QS19PSyBtZXNzYWdlICovCisJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX1BLX09LLCAmaW5wdXRfdXNlcmF1dGhfcGtfb2spOworCisJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX1VTRVJBVVRIX1JFUVVFU1QpOworCXBhY2tldF9wdXRfY3N0cmluZyhhdXRoY3R4dC0+c2VydmVyX3VzZXIpOworCXBhY2tldF9wdXRfY3N0cmluZyhhdXRoY3R4dC0+c2VydmljZSk7CisJcGFja2V0X3B1dF9jc3RyaW5nKGF1dGhjdHh0LT5tZXRob2QtPm5hbWUpOworCXBhY2tldF9wdXRfY2hhcihoYXZlX3NpZyk7CisJaWYgKCEoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX1BLQVVUSCkpCisJCXBhY2tldF9wdXRfY3N0cmluZyhrZXlfc3NoX25hbWUoaWQtPmtleSkpOworCXBhY2tldF9wdXRfc3RyaW5nKGJsb2IsIGJsb2JsZW4pOworCXhmcmVlKGJsb2IpOworCXBhY2tldF9zZW5kKCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBLZXkgKgorbG9hZF9pZGVudGl0eV9maWxlKGNoYXIgKmZpbGVuYW1lKQoreworCUtleSAqcHJpdmF0ZTsKKwljaGFyIHByb21wdFszMDBdLCAqcGFzc3BocmFzZTsKKwlpbnQgcGVybV9vayA9IDAsIHF1aXQsIGk7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAoc3RhdChmaWxlbmFtZSwgJnN0KSA8IDApIHsKKwkJZGVidWczKCJubyBzdWNoIGlkZW50aXR5OiAlcyIsIGZpbGVuYW1lKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXByaXZhdGUgPSBrZXlfbG9hZF9wcml2YXRlX3R5cGUoS0VZX1VOU1BFQywgZmlsZW5hbWUsICIiLCBOVUxMLCAmcGVybV9vayk7CisJaWYgKCFwZXJtX29rKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAocHJpdmF0ZSA9PSBOVUxMKSB7CisJCWlmIChvcHRpb25zLmJhdGNoX21vZGUpCisJCQlyZXR1cm4gTlVMTDsKKwkJc25wcmludGYocHJvbXB0LCBzaXplb2YgcHJvbXB0LAorCQkgICAgIkVudGVyIHBhc3NwaHJhc2UgZm9yIGtleSAnJS4xMDBzJzogIiwgZmlsZW5hbWUpOworCQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1iZXJfb2ZfcGFzc3dvcmRfcHJvbXB0czsgaSsrKSB7CisJCQlwYXNzcGhyYXNlID0gcmVhZF9wYXNzcGhyYXNlKHByb21wdCwgMCk7CisJCQlpZiAoc3RyY21wKHBhc3NwaHJhc2UsICIiKSAhPSAwKSB7CisJCQkJcHJpdmF0ZSA9IGtleV9sb2FkX3ByaXZhdGVfdHlwZShLRVlfVU5TUEVDLAorCQkJCSAgICBmaWxlbmFtZSwgcGFzc3BocmFzZSwgTlVMTCwgTlVMTCk7CisJCQkJcXVpdCA9IDA7CisJCQl9IGVsc2UgeworCQkJCWRlYnVnMigibm8gcGFzc3BocmFzZSBnaXZlbiwgdHJ5IG5leHQga2V5Iik7CisJCQkJcXVpdCA9IDE7CisJCQl9CisJCQltZW1zZXQocGFzc3BocmFzZSwgMCwgc3RybGVuKHBhc3NwaHJhc2UpKTsKKwkJCXhmcmVlKHBhc3NwaHJhc2UpOworCQkJaWYgKHByaXZhdGUgIT0gTlVMTCB8fCBxdWl0KQorCQkJCWJyZWFrOworCQkJZGVidWcyKCJiYWQgcGFzc3BocmFzZSBnaXZlbiwgdHJ5IGFnYWluLi4uIik7CisJCX0KKwl9CisJcmV0dXJuIHByaXZhdGU7Cit9CisKKy8qCisgKiB0cnkga2V5cyBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorICoJMS4gYWdlbnQga2V5cyB0aGF0IGFyZSBmb3VuZCBpbiB0aGUgY29uZmlnIGZpbGUKKyAqCTIuIG90aGVyIGFnZW50IGtleXMKKyAqCTMuIGtleXMgdGhhdCBhcmUgb25seSBsaXN0ZWQgaW4gdGhlIGNvbmZpZyBmaWxlCisgKi8KK3N0YXRpYyB2b2lkCitwdWJrZXlfcHJlcGFyZShBdXRoY3R4dCAqYXV0aGN0eHQpCit7CisJSWRlbnRpdHkgKmlkOworCUlkbGlzdCBhZ2VudCwgZmlsZXMsICpwcmVmZXJyZWQ7CisJS2V5ICprZXk7CisJQXV0aGVudGljYXRpb25Db25uZWN0aW9uICphYzsKKwljaGFyICpjb21tZW50OworCWludCBpLCBmb3VuZDsKKworCVRBSUxRX0lOSVQoJmFnZW50KTsJLyoga2V5cyBmcm9tIHRoZSBhZ2VudCAqLworCVRBSUxRX0lOSVQoJmZpbGVzKTsJLyoga2V5cyBmcm9tIHRoZSBjb25maWcgZmlsZSAqLworCXByZWZlcnJlZCA9ICZhdXRoY3R4dC0+a2V5czsKKwlUQUlMUV9JTklUKHByZWZlcnJlZCk7CS8qIHByZWZlcnJlZCBvcmRlciBvZiBrZXlzICovCisKKwkvKiBsaXN0IG9mIGtleXMgc3RvcmVkIGluIHRoZSBmaWxlc3lzdGVtICovCisJZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubnVtX2lkZW50aXR5X2ZpbGVzOyBpKyspIHsKKwkJa2V5ID0gb3B0aW9ucy5pZGVudGl0eV9rZXlzW2ldOworCQlpZiAoa2V5ICYmIGtleS0+dHlwZSA9PSBLRVlfUlNBMSkKKwkJCWNvbnRpbnVlOworCQlpZiAoa2V5ICYmIGtleS0+Y2VydCAmJiBrZXktPmNlcnQtPnR5cGUgIT0gU1NIMl9DRVJUX1RZUEVfVVNFUikKKwkJCWNvbnRpbnVlOworCQlvcHRpb25zLmlkZW50aXR5X2tleXNbaV0gPSBOVUxMOworCQlpZCA9IHhjYWxsb2MoMSwgc2l6ZW9mKCppZCkpOworCQlpZC0+a2V5ID0ga2V5OworCQlpZC0+ZmlsZW5hbWUgPSB4c3RyZHVwKG9wdGlvbnMuaWRlbnRpdHlfZmlsZXNbaV0pOworCQlUQUlMUV9JTlNFUlRfVEFJTCgmZmlsZXMsIGlkLCBuZXh0KTsKKwl9CisJLyogbGlzdCBvZiBrZXlzIHN1cHBvcnRlZCBieSB0aGUgYWdlbnQgKi8KKwlpZiAoKGFjID0gc3NoX2dldF9hdXRoZW50aWNhdGlvbl9jb25uZWN0aW9uKCkpKSB7CisJCWZvciAoa2V5ID0gc3NoX2dldF9maXJzdF9pZGVudGl0eShhYywgJmNvbW1lbnQsIDIpOworCQkgICAga2V5ICE9IE5VTEw7CisJCSAgICBrZXkgPSBzc2hfZ2V0X25leHRfaWRlbnRpdHkoYWMsICZjb21tZW50LCAyKSkgeworCQkJZm91bmQgPSAwOworCQkJVEFJTFFfRk9SRUFDSChpZCwgJmZpbGVzLCBuZXh0KSB7CisJCQkJLyogYWdlbnQga2V5cyBmcm9tIHRoZSBjb25maWcgZmlsZSBhcmUgcHJlZmVycmVkICovCisJCQkJaWYgKGtleV9lcXVhbChrZXksIGlkLT5rZXkpKSB7CisJCQkJCWtleV9mcmVlKGtleSk7CisJCQkJCXhmcmVlKGNvbW1lbnQpOworCQkJCQlUQUlMUV9SRU1PVkUoJmZpbGVzLCBpZCwgbmV4dCk7CisJCQkJCVRBSUxRX0lOU0VSVF9UQUlMKHByZWZlcnJlZCwgaWQsIG5leHQpOworCQkJCQlpZC0+YWMgPSBhYzsKKwkJCQkJZm91bmQgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoIWZvdW5kICYmICFvcHRpb25zLmlkZW50aXRpZXNfb25seSkgeworCQkJCWlkID0geGNhbGxvYygxLCBzaXplb2YoKmlkKSk7CisJCQkJaWQtPmtleSA9IGtleTsKKwkJCQlpZC0+ZmlsZW5hbWUgPSBjb21tZW50OworCQkJCWlkLT5hYyA9IGFjOworCQkJCVRBSUxRX0lOU0VSVF9UQUlMKCZhZ2VudCwgaWQsIG5leHQpOworCQkJfQorCQl9CisJCS8qIGFwcGVuZCByZW1haW5pbmcgYWdlbnQga2V5cyAqLworCQlmb3IgKGlkID0gVEFJTFFfRklSU1QoJmFnZW50KTsgaWQ7IGlkID0gVEFJTFFfRklSU1QoJmFnZW50KSkgeworCQkJVEFJTFFfUkVNT1ZFKCZhZ2VudCwgaWQsIG5leHQpOworCQkJVEFJTFFfSU5TRVJUX1RBSUwocHJlZmVycmVkLCBpZCwgbmV4dCk7CisJCX0KKwkJYXV0aGN0eHQtPmFnZW50ID0gYWM7CisJfQorCS8qIGFwcGVuZCByZW1haW5pbmcga2V5cyBmcm9tIHRoZSBjb25maWcgZmlsZSAqLworCWZvciAoaWQgPSBUQUlMUV9GSVJTVCgmZmlsZXMpOyBpZDsgaWQgPSBUQUlMUV9GSVJTVCgmZmlsZXMpKSB7CisJCVRBSUxRX1JFTU9WRSgmZmlsZXMsIGlkLCBuZXh0KTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwocHJlZmVycmVkLCBpZCwgbmV4dCk7CisJfQorCVRBSUxRX0ZPUkVBQ0goaWQsIHByZWZlcnJlZCwgbmV4dCkgeworCQlkZWJ1ZzIoImtleTogJXMgKCVwKSIsIGlkLT5maWxlbmFtZSwgaWQtPmtleSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorcHVia2V5X2NsZWFudXAoQXV0aGN0eHQgKmF1dGhjdHh0KQoreworCUlkZW50aXR5ICppZDsKKworCWlmIChhdXRoY3R4dC0+YWdlbnQgIT0gTlVMTCkKKwkJc3NoX2Nsb3NlX2F1dGhlbnRpY2F0aW9uX2Nvbm5lY3Rpb24oYXV0aGN0eHQtPmFnZW50KTsKKwlmb3IgKGlkID0gVEFJTFFfRklSU1QoJmF1dGhjdHh0LT5rZXlzKTsgaWQ7CisJICAgIGlkID0gVEFJTFFfRklSU1QoJmF1dGhjdHh0LT5rZXlzKSkgeworCQlUQUlMUV9SRU1PVkUoJmF1dGhjdHh0LT5rZXlzLCBpZCwgbmV4dCk7CisJCWlmIChpZC0+a2V5KQorCQkJa2V5X2ZyZWUoaWQtPmtleSk7CisJCWlmIChpZC0+ZmlsZW5hbWUpCisJCQl4ZnJlZShpZC0+ZmlsZW5hbWUpOworCQl4ZnJlZShpZCk7CisJfQorfQorCitpbnQKK3VzZXJhdXRoX3B1YmtleShBdXRoY3R4dCAqYXV0aGN0eHQpCit7CisJSWRlbnRpdHkgKmlkOworCWludCBzZW50ID0gMDsKKworCXdoaWxlICgoaWQgPSBUQUlMUV9GSVJTVCgmYXV0aGN0eHQtPmtleXMpKSkgeworCQlpZiAoaWQtPnRyaWVkKyspCisJCQlyZXR1cm4gKDApOworCQkvKiBtb3ZlIGtleSB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZSAqLworCQlUQUlMUV9SRU1PVkUoJmF1dGhjdHh0LT5rZXlzLCBpZCwgbmV4dCk7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZhdXRoY3R4dC0+a2V5cywgaWQsIG5leHQpOworCQkvKgorCQkgKiBzZW5kIGEgdGVzdCBtZXNzYWdlIGlmIHdlIGhhdmUgdGhlIHB1YmxpYyBrZXkuIGZvcgorCQkgKiBlbmNyeXB0ZWQga2V5cyB3ZSBjYW5ub3QgZG8gdGhpcyBhbmQgaGF2ZSB0byBsb2FkIHRoZQorCQkgKiBwcml2YXRlIGtleSBpbnN0ZWFkCisJCSAqLworCQlpZiAoaWQtPmtleSAmJiBpZC0+a2V5LT50eXBlICE9IEtFWV9SU0ExKSB7CisJCQlkZWJ1ZygiT2ZmZXJpbmcgJXMgcHVibGljIGtleTogJXMiLCBrZXlfdHlwZShpZC0+a2V5KSwKKwkJCSAgICBpZC0+ZmlsZW5hbWUpOworCQkJc2VudCA9IHNlbmRfcHVia2V5X3Rlc3QoYXV0aGN0eHQsIGlkKTsKKwkJfSBlbHNlIGlmIChpZC0+a2V5ID09IE5VTEwpIHsKKwkJCWRlYnVnKCJUcnlpbmcgcHJpdmF0ZSBrZXk6ICVzIiwgaWQtPmZpbGVuYW1lKTsKKwkJCWlkLT5rZXkgPSBsb2FkX2lkZW50aXR5X2ZpbGUoaWQtPmZpbGVuYW1lKTsKKwkJCWlmIChpZC0+a2V5ICE9IE5VTEwpIHsKKwkJCQlpZC0+aXNwcml2YXRlID0gMTsKKwkJCQlzZW50ID0gc2lnbl9hbmRfc2VuZF9wdWJrZXkoYXV0aGN0eHQsIGlkKTsKKwkJCQlrZXlfZnJlZShpZC0+a2V5KTsKKwkJCQlpZC0+a2V5ID0gTlVMTDsKKwkJCX0KKwkJfQorCQlpZiAoc2VudCkKKwkJCXJldHVybiAoc2VudCk7CisJfQorCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBTZW5kIHVzZXJhdXRoIHJlcXVlc3QgbWVzc2FnZSBzcGVjaWZ5aW5nIGtleWJvYXJkLWludGVyYWN0aXZlIG1ldGhvZC4KKyAqLworaW50Cit1c2VyYXV0aF9rYmRpbnQoQXV0aGN0eHQgKmF1dGhjdHh0KQoreworCXN0YXRpYyBpbnQgYXR0ZW1wdCA9IDA7CisKKwlpZiAoYXR0ZW1wdCsrID49IG9wdGlvbnMubnVtYmVyX29mX3Bhc3N3b3JkX3Byb21wdHMpCisJCXJldHVybiAwOworCS8qIGRpc2FibGUgaWYgbm8gU1NIMl9NU0dfVVNFUkFVVEhfSU5GT19SRVFVRVNUIGhhcyBiZWVuIHNlZW4gKi8KKwlpZiAoYXR0ZW1wdCA+IDEgJiYgIWF1dGhjdHh0LT5pbmZvX3JlcV9zZWVuKSB7CisJCWRlYnVnMygidXNlcmF1dGhfa2JkaW50OiBkaXNhYmxlOiBubyBpbmZvX3JlcV9zZWVuIik7CisJCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9JTkZPX1JFUVVFU1QsIE5VTEwpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZWJ1ZzIoInVzZXJhdXRoX2tiZGludCIpOworCXBhY2tldF9zdGFydChTU0gyX01TR19VU0VSQVVUSF9SRVFVRVNUKTsKKwlwYWNrZXRfcHV0X2NzdHJpbmcoYXV0aGN0eHQtPnNlcnZlcl91c2VyKTsKKwlwYWNrZXRfcHV0X2NzdHJpbmcoYXV0aGN0eHQtPnNlcnZpY2UpOworCXBhY2tldF9wdXRfY3N0cmluZyhhdXRoY3R4dC0+bWV0aG9kLT5uYW1lKTsKKwlwYWNrZXRfcHV0X2NzdHJpbmcoIiIpOwkJCQkJLyogbGFuZyAqLworCXBhY2tldF9wdXRfY3N0cmluZyhvcHRpb25zLmtiZF9pbnRlcmFjdGl2ZV9kZXZpY2VzID8KKwkgICAgb3B0aW9ucy5rYmRfaW50ZXJhY3RpdmVfZGV2aWNlcyA6ICIiKTsKKwlwYWNrZXRfc2VuZCgpOworCisJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0lORk9fUkVRVUVTVCwgJmlucHV0X3VzZXJhdXRoX2luZm9fcmVxKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIHBhcnNlIElORk9fUkVRVUVTVCwgcHJvbXB0IHVzZXIgYW5kIHNlbmQgSU5GT19SRVNQT05TRQorICovCit2b2lkCitpbnB1dF91c2VyYXV0aF9pbmZvX3JlcShpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKK3sKKwlBdXRoY3R4dCAqYXV0aGN0eHQgPSBjdHh0OworCWNoYXIgKm5hbWUsICppbnN0LCAqbGFuZywgKnByb21wdCwgKnJlc3BvbnNlOworCXVfaW50IG51bV9wcm9tcHRzLCBpOworCWludCBlY2hvID0gMDsKKworCWRlYnVnMigiaW5wdXRfdXNlcmF1dGhfaW5mb19yZXEiKTsKKworCWlmIChhdXRoY3R4dCA9PSBOVUxMKQorCQlmYXRhbCgiaW5wdXRfdXNlcmF1dGhfaW5mb19yZXE6IG5vIGF1dGhlbnRpY2F0aW9uIGNvbnRleHQiKTsKKworCWF1dGhjdHh0LT5pbmZvX3JlcV9zZWVuID0gMTsKKworCW5hbWUgPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKKwlpbnN0ID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7CisJbGFuZyA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOworCWlmIChzdHJsZW4obmFtZSkgPiAwKQorCQlsb2dpdCgiJXMiLCBuYW1lKTsKKwlpZiAoc3RybGVuKGluc3QpID4gMCkKKwkJbG9naXQoIiVzIiwgaW5zdCk7CisJeGZyZWUobmFtZSk7CisJeGZyZWUoaW5zdCk7CisJeGZyZWUobGFuZyk7CisKKwludW1fcHJvbXB0cyA9IHBhY2tldF9nZXRfaW50KCk7CisJLyoKKwkgKiBCZWdpbiB0byBidWlsZCBpbmZvIHJlc3BvbnNlIHBhY2tldCBiYXNlZCBvbiBwcm9tcHRzIHJlcXVlc3RlZC4KKwkgKiBXZSBjb21taXQgdG8gcHJvdmlkaW5nIHRoZSBjb3JyZWN0IG51bWJlciBvZiByZXNwb25zZXMsIHNvIGlmCisJICogZnVydGhlciBvbiB3ZSBydW4gaW50byBhIHByb2JsZW0gdGhhdCBwcmV2ZW50cyB0aGlzLCB3ZSBoYXZlIHRvCisJICogYmUgc3VyZSBhbmQgY2xlYW4gdGhpcyB1cCBhbmQgc2VuZCBhIGNvcnJlY3QgZXJyb3IgcmVzcG9uc2UuCisJICovCisJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX1VTRVJBVVRIX0lORk9fUkVTUE9OU0UpOworCXBhY2tldF9wdXRfaW50KG51bV9wcm9tcHRzKTsKKworCWRlYnVnMigiaW5wdXRfdXNlcmF1dGhfaW5mb19yZXE6IG51bV9wcm9tcHRzICVkIiwgbnVtX3Byb21wdHMpOworCWZvciAoaSA9IDA7IGkgPCBudW1fcHJvbXB0czsgaSsrKSB7CisJCXByb21wdCA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOworCQllY2hvID0gcGFja2V0X2dldF9jaGFyKCk7CisKKwkJcmVzcG9uc2UgPSByZWFkX3Bhc3NwaHJhc2UocHJvbXB0LCBlY2hvID8gUlBfRUNITyA6IDApOworCisJCXBhY2tldF9wdXRfY3N0cmluZyhyZXNwb25zZSk7CisJCW1lbXNldChyZXNwb25zZSwgMCwgc3RybGVuKHJlc3BvbnNlKSk7CisJCXhmcmVlKHJlc3BvbnNlKTsKKwkJeGZyZWUocHJvbXB0KTsKKwl9CisJcGFja2V0X2NoZWNrX2VvbSgpOyAvKiBkb25lIHdpdGggcGFyc2luZyBpbmNvbWluZyBtZXNzYWdlLiAqLworCisJcGFja2V0X2FkZF9wYWRkaW5nKDY0KTsKKwlwYWNrZXRfc2VuZCgpOworfQorCitzdGF0aWMgaW50Citzc2hfa2V5c2lnbihLZXkgKmtleSwgdV9jaGFyICoqc2lncCwgdV9pbnQgKmxlbnAsCisgICAgdV9jaGFyICpkYXRhLCB1X2ludCBkYXRhbGVuKQoreworCUJ1ZmZlciBiOworCXN0cnVjdCBzdGF0IHN0OworCXBpZF90IHBpZDsKKwlpbnQgdG9bMl0sIGZyb21bMl0sIHN0YXR1cywgdmVyc2lvbiA9IDI7CisKKwlkZWJ1ZzIoInNzaF9rZXlzaWduIGNhbGxlZCIpOworCisJaWYgKHN0YXQoX1BBVEhfU1NIX0tFWV9TSUdOLCAmc3QpIDwgMCkgeworCQllcnJvcigic3NoX2tleXNpZ246IG5vdCBpbnN0YWxsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoZmZsdXNoKHN0ZG91dCkgIT0gMCkKKwkJZXJyb3IoInNzaF9rZXlzaWduOiBmZmx1c2g6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlpZiAocGlwZSh0bykgPCAwKSB7CisJCWVycm9yKCJzc2hfa2V5c2lnbjogcGlwZTogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChwaXBlKGZyb20pIDwgMCkgeworCQllcnJvcigic3NoX2tleXNpZ246IHBpcGU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoKHBpZCA9IGZvcmsoKSkgPCAwKSB7CisJCWVycm9yKCJzc2hfa2V5c2lnbjogZm9yazogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChwaWQgPT0gMCkgeworCQkvKiBrZWVwIHRoZSBzb2NrZXQgb24gZXhlYyAqLworCQlmY250bChwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25faW4oKSwgRl9TRVRGRCwgMCk7CisJCXBlcm1hbmVudGx5X2Ryb3Bfc3VpZChnZXR1aWQoKSk7CisJCWNsb3NlKGZyb21bMF0pOworCQlpZiAoZHVwMihmcm9tWzFdLCBTVERPVVRfRklMRU5PKSA8IDApCisJCQlmYXRhbCgic3NoX2tleXNpZ246IGR1cDI6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UodG9bMV0pOworCQlpZiAoZHVwMih0b1swXSwgU1RESU5fRklMRU5PKSA8IDApCisJCQlmYXRhbCgic3NoX2tleXNpZ246IGR1cDI6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UoZnJvbVsxXSk7CisJCWNsb3NlKHRvWzBdKTsKKwkJZXhlY2woX1BBVEhfU1NIX0tFWV9TSUdOLCBfUEFUSF9TU0hfS0VZX1NJR04sIChjaGFyICopIDApOworCQlmYXRhbCgic3NoX2tleXNpZ246IGV4ZWMoJXMpOiAlcyIsIF9QQVRIX1NTSF9LRVlfU0lHTiwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJfQorCWNsb3NlKGZyb21bMV0pOworCWNsb3NlKHRvWzBdKTsKKworCWJ1ZmZlcl9pbml0KCZiKTsKKwlidWZmZXJfcHV0X2ludCgmYiwgcGFja2V0X2dldF9jb25uZWN0aW9uX2luKCkpOyAvKiBzZW5kICMgb2Ygc29ja2V0ICovCisJYnVmZmVyX3B1dF9zdHJpbmcoJmIsIGRhdGEsIGRhdGFsZW4pOworCWlmIChzc2hfbXNnX3NlbmQodG9bMV0sIHZlcnNpb24sICZiKSA9PSAtMSkKKwkJZmF0YWwoInNzaF9rZXlzaWduOiBjb3VsZG4ndCBzZW5kIHJlcXVlc3QiKTsKKworCWlmIChzc2hfbXNnX3JlY3YoZnJvbVswXSwgJmIpIDwgMCkgeworCQllcnJvcigic3NoX2tleXNpZ246IG5vIHJlcGx5Iik7CisJCWJ1ZmZlcl9mcmVlKCZiKTsKKwkJcmV0dXJuIC0xOworCX0KKwljbG9zZShmcm9tWzBdKTsKKwljbG9zZSh0b1sxXSk7CisKKwl3aGlsZSAod2FpdHBpZChwaWQsICZzdGF0dXMsIDApIDwgMCkKKwkJaWYgKGVycm5vICE9IEVJTlRSKQorCQkJYnJlYWs7CisKKwlpZiAoYnVmZmVyX2dldF9jaGFyKCZiKSAhPSB2ZXJzaW9uKSB7CisJCWVycm9yKCJzc2hfa2V5c2lnbjogYmFkIHZlcnNpb24iKTsKKwkJYnVmZmVyX2ZyZWUoJmIpOworCQlyZXR1cm4gLTE7CisJfQorCSpzaWdwID0gYnVmZmVyX2dldF9zdHJpbmcoJmIsIGxlbnApOworCWJ1ZmZlcl9mcmVlKCZiKTsKKworCXJldHVybiAwOworfQorCitpbnQKK3VzZXJhdXRoX2hvc3RiYXNlZChBdXRoY3R4dCAqYXV0aGN0eHQpCit7CisJS2V5ICpwcml2YXRlID0gTlVMTDsKKwlTZW5zaXRpdmUgKnNlbnNpdGl2ZSA9IGF1dGhjdHh0LT5zZW5zaXRpdmU7CisJQnVmZmVyIGI7CisJdV9jaGFyICpzaWduYXR1cmUsICpibG9iOworCWNoYXIgKmNob3N0LCAqcGthbGcsICpwOworCWNvbnN0IGNoYXIgKnNlcnZpY2U7CisJdV9pbnQgYmxlbiwgc2xlbjsKKwlpbnQgb2ssIGksIGZvdW5kID0gMDsKKworCS8qIGNoZWNrIGZvciBhIHVzZWZ1bCBrZXkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2Vuc2l0aXZlLT5ua2V5czsgaSsrKSB7CisJCXByaXZhdGUgPSBzZW5zaXRpdmUtPmtleXNbaV07CisJCWlmIChwcml2YXRlICYmIHByaXZhdGUtPnR5cGUgIT0gS0VZX1JTQTEpIHsKKwkJCWZvdW5kID0gMTsKKwkJCS8qIHdlIHRha2UgYW5kIGZyZWUgdGhlIGtleSAqLworCQkJc2Vuc2l0aXZlLT5rZXlzW2ldID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghZm91bmQpIHsKKwkJZGVidWcoIk5vIG1vcmUgY2xpZW50IGhvc3RrZXlzIGZvciBob3N0YmFzZWQgYXV0aGVudGljYXRpb24uIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoa2V5X3RvX2Jsb2IocHJpdmF0ZSwgJmJsb2IsICZibGVuKSA9PSAwKSB7CisJCWtleV9mcmVlKHByaXZhdGUpOworCQlyZXR1cm4gMDsKKwl9CisJLyogZmlndXJlIG91dCBhIG5hbWUgZm9yIHRoZSBjbGllbnQgaG9zdCAqLworCXAgPSBnZXRfbG9jYWxfbmFtZShwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25faW4oKSk7CisJaWYgKHAgPT0gTlVMTCkgeworCQllcnJvcigidXNlcmF1dGhfaG9zdGJhc2VkOiBjYW5ub3QgZ2V0IGxvY2FsIGlwYWRkci9uYW1lIik7CisJCWtleV9mcmVlKHByaXZhdGUpOworCQl4ZnJlZShibG9iKTsKKwkJcmV0dXJuIDA7CisJfQorCXhhc3ByaW50ZigmY2hvc3QsICIlcy4iLCBwKTsKKwlkZWJ1ZzIoInVzZXJhdXRoX2hvc3RiYXNlZDogY2hvc3QgJXMiLCBjaG9zdCk7CisJeGZyZWUocCk7CisKKwlzZXJ2aWNlID0gZGF0YWZlbGxvd3MgJiBTU0hfQlVHX0hCU0VSVklDRSA/ICJzc2gtdXNlcmF1dGgiIDoKKwkgICAgYXV0aGN0eHQtPnNlcnZpY2U7CisJcGthbGcgPSB4c3RyZHVwKGtleV9zc2hfbmFtZShwcml2YXRlKSk7CisJYnVmZmVyX2luaXQoJmIpOworCS8qIGNvbnN0cnVjdCBkYXRhICovCisJYnVmZmVyX3B1dF9zdHJpbmcoJmIsIHNlc3Npb25faWQyLCBzZXNzaW9uX2lkMl9sZW4pOworCWJ1ZmZlcl9wdXRfY2hhcigmYiwgU1NIMl9NU0dfVVNFUkFVVEhfUkVRVUVTVCk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBhdXRoY3R4dC0+c2VydmVyX3VzZXIpOworCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwgc2VydmljZSk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBhdXRoY3R4dC0+bWV0aG9kLT5uYW1lKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIHBrYWxnKTsKKwlidWZmZXJfcHV0X3N0cmluZygmYiwgYmxvYiwgYmxlbik7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBjaG9zdCk7CisJYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBhdXRoY3R4dC0+bG9jYWxfdXNlcik7CisjaWZkZWYgREVCVUdfUEsKKwlidWZmZXJfZHVtcCgmYik7CisjZW5kaWYKKwlpZiAoc2Vuc2l0aXZlLT5leHRlcm5hbF9rZXlzaWduKQorCQlvayA9IHNzaF9rZXlzaWduKHByaXZhdGUsICZzaWduYXR1cmUsICZzbGVuLAorCQkgICAgYnVmZmVyX3B0cigmYiksIGJ1ZmZlcl9sZW4oJmIpKTsKKwllbHNlCisJCW9rID0ga2V5X3NpZ24ocHJpdmF0ZSwgJnNpZ25hdHVyZSwgJnNsZW4sCisJCSAgICBidWZmZXJfcHRyKCZiKSwgYnVmZmVyX2xlbigmYikpOworCWtleV9mcmVlKHByaXZhdGUpOworCWJ1ZmZlcl9mcmVlKCZiKTsKKwlpZiAob2sgIT0gMCkgeworCQllcnJvcigia2V5X3NpZ24gZmFpbGVkIik7CisJCXhmcmVlKGNob3N0KTsKKwkJeGZyZWUocGthbGcpOworCQl4ZnJlZShibG9iKTsKKwkJcmV0dXJuIDA7CisJfQorCXBhY2tldF9zdGFydChTU0gyX01TR19VU0VSQVVUSF9SRVFVRVNUKTsKKwlwYWNrZXRfcHV0X2NzdHJpbmcoYXV0aGN0eHQtPnNlcnZlcl91c2VyKTsKKwlwYWNrZXRfcHV0X2NzdHJpbmcoYXV0aGN0eHQtPnNlcnZpY2UpOworCXBhY2tldF9wdXRfY3N0cmluZyhhdXRoY3R4dC0+bWV0aG9kLT5uYW1lKTsKKwlwYWNrZXRfcHV0X2NzdHJpbmcocGthbGcpOworCXBhY2tldF9wdXRfc3RyaW5nKGJsb2IsIGJsZW4pOworCXBhY2tldF9wdXRfY3N0cmluZyhjaG9zdCk7CisJcGFja2V0X3B1dF9jc3RyaW5nKGF1dGhjdHh0LT5sb2NhbF91c2VyKTsKKwlwYWNrZXRfcHV0X3N0cmluZyhzaWduYXR1cmUsIHNsZW4pOworCW1lbXNldChzaWduYXR1cmUsICdzJywgc2xlbik7CisJeGZyZWUoc2lnbmF0dXJlKTsKKwl4ZnJlZShjaG9zdCk7CisJeGZyZWUocGthbGcpOworCXhmcmVlKGJsb2IpOworCisJcGFja2V0X3NlbmQoKTsKKwlyZXR1cm4gMTsKK30KKworI2lmZGVmIEpQQUtFCitpbnQKK3VzZXJhdXRoX2pwYWtlKEF1dGhjdHh0ICphdXRoY3R4dCkKK3sKKwlzdHJ1Y3QganBha2VfY3R4ICpwY3R4OworCXVfY2hhciAqeDFfcHJvb2YsICp4Ml9wcm9vZjsKKwl1X2ludCB4MV9wcm9vZl9sZW4sIHgyX3Byb29mX2xlbjsKKwlzdGF0aWMgaW50IGF0dGVtcHQgPSAwOyAvKiBYWFggc2hhcmUgd2l0aCB1c2VyYXV0aF9wYXNzd29yZCdzPyAqLworCisJaWYgKGF0dGVtcHQrKyA+PSBvcHRpb25zLm51bWJlcl9vZl9wYXNzd29yZF9wcm9tcHRzKQorCQlyZXR1cm4gMDsKKwlpZiAoYXR0ZW1wdCAhPSAxKQorCQllcnJvcigiUGVybWlzc2lvbiBkZW5pZWQsIHBsZWFzZSB0cnkgYWdhaW4uIik7CisKKwlpZiAoYXV0aGN0eHQtPm1ldGhvZGRhdGEgIT0gTlVMTCkKKwkJZmF0YWwoIiVzOiBhdXRoY3R4dC0+bWV0aG9kZGF0YSBhbHJlYWR5IHNldCAoJXApIiwKKwkJICAgIF9fZnVuY19fLCBhdXRoY3R4dC0+bWV0aG9kZGF0YSk7CisKKwlhdXRoY3R4dC0+bWV0aG9kZGF0YSA9IHBjdHggPSBqcGFrZV9uZXcoKTsKKworCS8qCisJICogU2VuZCByZXF1ZXN0IGltbWVkaWF0ZWx5LCB0byBnZXQgdGhlIHByb3RvY29sIGdvaW5nIHdoaWxlCisJICogd2UgZG8gdGhlIGluaXRpYWwgY29tcHV0YXRpb25zLgorCSAqLworCXBhY2tldF9zdGFydChTU0gyX01TR19VU0VSQVVUSF9SRVFVRVNUKTsKKwlwYWNrZXRfcHV0X2NzdHJpbmcoYXV0aGN0eHQtPnNlcnZlcl91c2VyKTsKKwlwYWNrZXRfcHV0X2NzdHJpbmcoYXV0aGN0eHQtPnNlcnZpY2UpOworCXBhY2tldF9wdXRfY3N0cmluZyhhdXRoY3R4dC0+bWV0aG9kLT5uYW1lKTsKKwlwYWNrZXRfc2VuZCgpOworCXBhY2tldF93cml0ZV93YWl0KCk7CisKKwlqcGFrZV9zdGVwMShwY3R4LT5ncnAsCisJICAgICZwY3R4LT5jbGllbnRfaWQsICZwY3R4LT5jbGllbnRfaWRfbGVuLAorCSAgICAmcGN0eC0+eDEsICZwY3R4LT54MiwgJnBjdHgtPmdfeDEsICZwY3R4LT5nX3gyLAorCSAgICAmeDFfcHJvb2YsICZ4MV9wcm9vZl9sZW4sCisJICAgICZ4Ml9wcm9vZiwgJngyX3Byb29mX2xlbik7CisKKwlKUEFLRV9ERUJVR19DVFgoKHBjdHgsICJzdGVwIDEgc2VuZGluZyBpbiAlcyIsIF9fZnVuY19fKSk7CisKKwlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfVVNFUkFVVEhfSlBBS0VfQ0xJRU5UX1NURVAxKTsKKwlwYWNrZXRfcHV0X3N0cmluZyhwY3R4LT5jbGllbnRfaWQsIHBjdHgtPmNsaWVudF9pZF9sZW4pOworCXBhY2tldF9wdXRfYmlnbnVtMihwY3R4LT5nX3gxKTsKKwlwYWNrZXRfcHV0X2JpZ251bTIocGN0eC0+Z194Mik7CisJcGFja2V0X3B1dF9zdHJpbmcoeDFfcHJvb2YsIHgxX3Byb29mX2xlbik7CisJcGFja2V0X3B1dF9zdHJpbmcoeDJfcHJvb2YsIHgyX3Byb29mX2xlbik7CisJcGFja2V0X3NlbmQoKTsKKworCWJ6ZXJvKHgxX3Byb29mLCB4MV9wcm9vZl9sZW4pOworCWJ6ZXJvKHgyX3Byb29mLCB4Ml9wcm9vZl9sZW4pOworCXhmcmVlKHgxX3Byb29mKTsKKwl4ZnJlZSh4Ml9wcm9vZik7CisKKwkvKiBFeHBlY3Qgc3RlcCAxIHBhY2tldCBmcm9tIHBlZXIgKi8KKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfSlBBS0VfU0VSVkVSX1NURVAxLAorCSAgICBpbnB1dF91c2VyYXV0aF9qcGFrZV9zZXJ2ZXJfc3RlcDEpOworCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9TVUNDRVNTLAorCSAgICAmaW5wdXRfdXNlcmF1dGhfc3VjY2Vzc191bmV4cGVjdGVkKTsKKworCXJldHVybiAxOworfQorCit2b2lkCit1c2VyYXV0aF9qcGFrZV9jbGVhbnVwKEF1dGhjdHh0ICphdXRoY3R4dCkKK3sKKwlkZWJ1ZzMoIiVzOiBjbGVhbiB1cCIsIF9fZnVuY19fKTsKKwlpZiAoYXV0aGN0eHQtPm1ldGhvZGRhdGEgIT0gTlVMTCkgeworCQlqcGFrZV9mcmVlKGF1dGhjdHh0LT5tZXRob2RkYXRhKTsKKwkJYXV0aGN0eHQtPm1ldGhvZGRhdGEgPSBOVUxMOworCX0KKwlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfU1VDQ0VTUywgJmlucHV0X3VzZXJhdXRoX3N1Y2Nlc3MpOworfQorI2VuZGlmIC8qIEpQQUtFICovCisKKy8qIGZpbmQgYXV0aCBtZXRob2QgKi8KKworLyoKKyAqIGdpdmVuIGF1dGggbWV0aG9kIG5hbWUsIGlmIGNvbmZpZ3VyYWJsZSBvcHRpb25zIHBlcm1pdCB0aGlzIG1ldGhvZCBmaWxsCisgKiBpbiBhdXRoX2lkZW50IGZpZWxkIGFuZCByZXR1cm4gdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4KKyAqLworc3RhdGljIGludAorYXV0aG1ldGhvZF9pc19lbmFibGVkKEF1dGhtZXRob2QgKm1ldGhvZCkKK3sKKwlpZiAobWV0aG9kID09IE5VTEwpCisJCXJldHVybiAwOworCS8qIHJldHVybiBmYWxzZSBpZiBvcHRpb25zIGluZGljYXRlIHRoaXMgbWV0aG9kIGlzIGRpc2FibGVkICovCisJaWYgIChtZXRob2QtPmVuYWJsZWQgPT0gTlVMTCB8fCAqbWV0aG9kLT5lbmFibGVkID09IDApCisJCXJldHVybiAwOworCS8qIHJldHVybiBmYWxzZSBpZiBiYXRjaCBtb2RlIGlzIGVuYWJsZWQgYnV0IG1ldGhvZCBuZWVkcyBpbnRlcmFjdGl2ZSBtb2RlICovCisJaWYgIChtZXRob2QtPmJhdGNoX2ZsYWcgIT0gTlVMTCAmJiAqbWV0aG9kLT5iYXRjaF9mbGFnICE9IDApCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgQXV0aG1ldGhvZCAqCithdXRobWV0aG9kX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQoreworCUF1dGhtZXRob2QgKm1ldGhvZCA9IE5VTEw7CisJaWYgKG5hbWUgIT0gTlVMTCkKKwkJZm9yIChtZXRob2QgPSBhdXRobWV0aG9kczsgbWV0aG9kLT5uYW1lICE9IE5VTEw7IG1ldGhvZCsrKQorCQkJaWYgKHN0cmNtcChuYW1lLCBtZXRob2QtPm5hbWUpID09IDApCisJCQkJcmV0dXJuIG1ldGhvZDsKKwlkZWJ1ZzIoIlVucmVjb2duaXplZCBhdXRoZW50aWNhdGlvbiBtZXRob2QgbmFtZTogJXMiLCBuYW1lID8gbmFtZSA6ICJOVUxMIik7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFhYWCBpbnRlcm5hbCBzdGF0ZSAqLworc3RhdGljIEF1dGhtZXRob2QgKmN1cnJlbnQgPSBOVUxMOworc3RhdGljIGNoYXIgKnN1cHBvcnRlZCA9IE5VTEw7CitzdGF0aWMgY2hhciAqcHJlZmVycmVkID0gTlVMTDsKKworLyoKKyAqIEdpdmVuIHRoZSBhdXRoZW50aWNhdGlvbiBtZXRob2QgbGlzdCBzZW50IGJ5IHRoZSBzZXJ2ZXIsIHJldHVybiB0aGUKKyAqIG5leHQgbWV0aG9kIHdlIHNob3VsZCB0cnkuICBJZiB0aGUgc2VydmVyIGluaXRpYWxseSBzZW5kcyBhIG5pbCBsaXN0LAorICogdXNlIGEgYnVpbHQtaW4gZGVmYXVsdCBsaXN0LgorICovCitzdGF0aWMgQXV0aG1ldGhvZCAqCithdXRobWV0aG9kX2dldChjaGFyICphdXRobGlzdCkKK3sKKwljaGFyICpuYW1lID0gTlVMTDsKKwl1X2ludCBuZXh0OworCisJLyogVXNlIGEgc3VpdGFibGUgZGVmYXVsdCBpZiB3ZSdyZSBwYXNzZWQgYSBuaWwgbGlzdC4gICovCisJaWYgKGF1dGhsaXN0ID09IE5VTEwgfHwgc3RybGVuKGF1dGhsaXN0KSA9PSAwKQorCQlhdXRobGlzdCA9IG9wdGlvbnMucHJlZmVycmVkX2F1dGhlbnRpY2F0aW9uczsKKworCWlmIChzdXBwb3J0ZWQgPT0gTlVMTCB8fCBzdHJjbXAoYXV0aGxpc3QsIHN1cHBvcnRlZCkgIT0gMCkgeworCQlkZWJ1ZzMoInN0YXJ0IG92ZXIsIHBhc3NlZCBhIGRpZmZlcmVudCBsaXN0ICVzIiwgYXV0aGxpc3QpOworCQlpZiAoc3VwcG9ydGVkICE9IE5VTEwpCisJCQl4ZnJlZShzdXBwb3J0ZWQpOworCQlzdXBwb3J0ZWQgPSB4c3RyZHVwKGF1dGhsaXN0KTsKKwkJcHJlZmVycmVkID0gb3B0aW9ucy5wcmVmZXJyZWRfYXV0aGVudGljYXRpb25zOworCQlkZWJ1ZzMoInByZWZlcnJlZCAlcyIsIHByZWZlcnJlZCk7CisJCWN1cnJlbnQgPSBOVUxMOworCX0gZWxzZSBpZiAoY3VycmVudCAhPSBOVUxMICYmIGF1dGhtZXRob2RfaXNfZW5hYmxlZChjdXJyZW50KSkKKwkJcmV0dXJuIGN1cnJlbnQ7CisKKwlmb3IgKDs7KSB7CisJCWlmICgobmFtZSA9IG1hdGNoX2xpc3QocHJlZmVycmVkLCBzdXBwb3J0ZWQsICZuZXh0KSkgPT0gTlVMTCkgeworCQkJZGVidWcoIk5vIG1vcmUgYXV0aGVudGljYXRpb24gbWV0aG9kcyB0byB0cnkuIik7CisJCQljdXJyZW50ID0gTlVMTDsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXByZWZlcnJlZCArPSBuZXh0OworCQlkZWJ1ZzMoImF1dGhtZXRob2RfbG9va3VwICVzIiwgbmFtZSk7CisJCWRlYnVnMygicmVtYWluaW5nIHByZWZlcnJlZDogJXMiLCBwcmVmZXJyZWQpOworCQlpZiAoKGN1cnJlbnQgPSBhdXRobWV0aG9kX2xvb2t1cChuYW1lKSkgIT0gTlVMTCAmJgorCQkgICAgYXV0aG1ldGhvZF9pc19lbmFibGVkKGN1cnJlbnQpKSB7CisJCQlkZWJ1ZzMoImF1dGhtZXRob2RfaXNfZW5hYmxlZCAlcyIsIG5hbWUpOworCQkJZGVidWcoIk5leHQgYXV0aGVudGljYXRpb24gbWV0aG9kOiAlcyIsIG5hbWUpOworCQkJeGZyZWUobmFtZSk7CisJCQlyZXR1cm4gY3VycmVudDsKKwkJfQorCX0KKwlpZiAobmFtZSAhPSBOVUxMKQorCQl4ZnJlZShuYW1lKTsKK30KKworc3RhdGljIGNoYXIgKgorYXV0aG1ldGhvZHNfZ2V0KHZvaWQpCit7CisJQXV0aG1ldGhvZCAqbWV0aG9kID0gTlVMTDsKKwlCdWZmZXIgYjsKKwljaGFyICpsaXN0OworCisJYnVmZmVyX2luaXQoJmIpOworCWZvciAobWV0aG9kID0gYXV0aG1ldGhvZHM7IG1ldGhvZC0+bmFtZSAhPSBOVUxMOyBtZXRob2QrKykgeworCQlpZiAoYXV0aG1ldGhvZF9pc19lbmFibGVkKG1ldGhvZCkpIHsKKwkJCWlmIChidWZmZXJfbGVuKCZiKSA+IDApCisJCQkJYnVmZmVyX2FwcGVuZCgmYiwgIiwiLCAxKTsKKwkJCWJ1ZmZlcl9hcHBlbmQoJmIsIG1ldGhvZC0+bmFtZSwgc3RybGVuKG1ldGhvZC0+bmFtZSkpOworCQl9CisJfQorCWJ1ZmZlcl9hcHBlbmQoJmIsICJcMCIsIDEpOworCWxpc3QgPSB4c3RyZHVwKGJ1ZmZlcl9wdHIoJmIpKTsKKwlidWZmZXJfZnJlZSgmYik7CisJcmV0dXJuIGxpc3Q7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc3NoZC4wIGIvb3BlbnNzaC02LjBwMS9zc2hkLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRjYTgxOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc3NoZC4wCkBAIC0wLDAgKzEsNjM2IEBACitTU0hEKDgpICAgICAgICAgICAgICAgICBPcGVuQlNEIFN5c3RlbSBNYW5hZ2VyJ3MgTWFudWFsICAgICAgICAgICAgICAgIFNTSEQoOCkKKworTkFNRQorICAgICBzc2hkIC0gT3BlblNTSCBTU0ggZGFlbW9uCisKK1NZTk9QU0lTCisgICAgIHNzaGQgWy00NkRkZWlxVHRdIFstYiBiaXRzXSBbLUMgY29ubmVjdGlvbl9zcGVjXQorICAgICAgICAgIFstYyBob3N0X2NlcnRpZmljYXRlX2ZpbGVdIFstZiBjb25maWdfZmlsZV0gWy1nIGxvZ2luX2dyYWNlX3RpbWVdCisgICAgICAgICAgWy1oIGhvc3Rfa2V5X2ZpbGVdIFstayBrZXlfZ2VuX3RpbWVdIFstbyBvcHRpb25dIFstcCBwb3J0XSBbLXUgbGVuXQorCitERVNDUklQVElPTgorICAgICBzc2hkIChPcGVuU1NIIERhZW1vbikgaXMgdGhlIGRhZW1vbiBwcm9ncmFtIGZvciBzc2goMSkuICBUb2dldGhlciB0aGVzZQorICAgICBwcm9ncmFtcyByZXBsYWNlIHJsb2dpbigxKSBhbmQgcnNoKDEpLCBhbmQgcHJvdmlkZSBzZWN1cmUgZW5jcnlwdGVkCisgICAgIGNvbW11bmljYXRpb25zIGJldHdlZW4gdHdvIHVudHJ1c3RlZCBob3N0cyBvdmVyIGFuIGluc2VjdXJlIG5ldHdvcmsuCisKKyAgICAgc3NoZCBsaXN0ZW5zIGZvciBjb25uZWN0aW9ucyBmcm9tIGNsaWVudHMuICBJdCBpcyBub3JtYWxseSBzdGFydGVkIGF0CisgICAgIGJvb3QgZnJvbSAvZXRjL3JjLiAgSXQgZm9ya3MgYSBuZXcgZGFlbW9uIGZvciBlYWNoIGluY29taW5nIGNvbm5lY3Rpb24uCisgICAgIFRoZSBmb3JrZWQgZGFlbW9ucyBoYW5kbGUga2V5IGV4Y2hhbmdlLCBlbmNyeXB0aW9uLCBhdXRoZW50aWNhdGlvbiwKKyAgICAgY29tbWFuZCBleGVjdXRpb24sIGFuZCBkYXRhIGV4Y2hhbmdlLgorCisgICAgIHNzaGQgY2FuIGJlIGNvbmZpZ3VyZWQgdXNpbmcgY29tbWFuZC1saW5lIG9wdGlvbnMgb3IgYSBjb25maWd1cmF0aW9uIGZpbGUKKyAgICAgKGJ5IGRlZmF1bHQgc3NoZF9jb25maWcoNSkpOyBjb21tYW5kLWxpbmUgb3B0aW9ucyBvdmVycmlkZSB2YWx1ZXMKKyAgICAgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuICBzc2hkIHJlcmVhZHMgaXRzIGNvbmZpZ3VyYXRpb24gZmlsZQorICAgICB3aGVuIGl0IHJlY2VpdmVzIGEgaGFuZ3VwIHNpZ25hbCwgU0lHSFVQLCBieSBleGVjdXRpbmcgaXRzZWxmIHdpdGggdGhlCisgICAgIG5hbWUgYW5kIG9wdGlvbnMgaXQgd2FzIHN0YXJ0ZWQgd2l0aCwgZS5nLiAvdXNyL3NiaW4vc3NoZC4KKworICAgICBUaGUgb3B0aW9ucyBhcmUgYXMgZm9sbG93czoKKworICAgICAtNCAgICAgIEZvcmNlcyBzc2hkIHRvIHVzZSBJUHY0IGFkZHJlc3NlcyBvbmx5LgorCisgICAgIC02ICAgICAgRm9yY2VzIHNzaGQgdG8gdXNlIElQdjYgYWRkcmVzc2VzIG9ubHkuCisKKyAgICAgLWIgYml0cworICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGVwaGVtZXJhbCBwcm90b2NvbCB2ZXJzaW9uIDEKKyAgICAgICAgICAgICBzZXJ2ZXIga2V5IChkZWZhdWx0IDEwMjQpLgorCisgICAgIC1DIGNvbm5lY3Rpb25fc3BlYworICAgICAgICAgICAgIFNwZWNpZnkgdGhlIGNvbm5lY3Rpb24gcGFyYW1ldGVycyB0byB1c2UgZm9yIHRoZSAtVCBleHRlbmRlZCB0ZXN0CisgICAgICAgICAgICAgbW9kZS4gIElmIHByb3ZpZGVkLCBhbnkgTWF0Y2ggZGlyZWN0aXZlcyBpbiB0aGUgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgIGZpbGUgdGhhdCB3b3VsZCBhcHBseSB0byB0aGUgc3BlY2lmaWVkIHVzZXIsIGhvc3QsIGFuZCBhZGRyZXNzCisgICAgICAgICAgICAgd2lsbCBiZSBzZXQgYmVmb3JlIHRoZSBjb25maWd1cmF0aW9uIGlzIHdyaXR0ZW4gdG8gc3RhbmRhcmQKKyAgICAgICAgICAgICBvdXRwdXQuICBUaGUgY29ubmVjdGlvbiBwYXJhbWV0ZXJzIGFyZSBzdXBwbGllZCBhcyBrZXl3b3JkPXZhbHVlCisgICAgICAgICAgICAgcGFpcnMuICBUaGUga2V5d29yZHMgYXJlIGBgdXNlcicnLCBgYGhvc3QnJywgYW5kIGBgYWRkcicnLiAgQWxsCisgICAgICAgICAgICAgYXJlIHJlcXVpcmVkIGFuZCBtYXkgYmUgc3VwcGxpZWQgaW4gYW55IG9yZGVyLCBlaXRoZXIgd2l0aAorICAgICAgICAgICAgIG11bHRpcGxlIC1DIG9wdGlvbnMgb3IgYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdC4KKworICAgICAtYyBob3N0X2NlcnRpZmljYXRlX2ZpbGUKKyAgICAgICAgICAgICBTcGVjaWZpZXMgYSBwYXRoIHRvIGEgY2VydGlmaWNhdGUgZmlsZSB0byBpZGVudGlmeSBzc2hkIGR1cmluZworICAgICAgICAgICAgIGtleSBleGNoYW5nZS4gIFRoZSBjZXJ0aWZpY2F0ZSBmaWxlIG11c3QgbWF0Y2ggYSBob3N0IGtleSBmaWxlCisgICAgICAgICAgICAgc3BlY2lmaWVkIHVzaW5nIHRoZSAtaCBvcHRpb24gb3IgdGhlIEhvc3RLZXkgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgIGRpcmVjdGl2ZS4KKworICAgICAtRCAgICAgIFdoZW4gdGhpcyBvcHRpb24gaXMgc3BlY2lmaWVkLCBzc2hkIHdpbGwgbm90IGRldGFjaCBhbmQgZG9lcyBub3QKKyAgICAgICAgICAgICBiZWNvbWUgYSBkYWVtb24uICBUaGlzIGFsbG93cyBlYXN5IG1vbml0b3Jpbmcgb2Ygc3NoZC4KKworICAgICAtZCAgICAgIERlYnVnIG1vZGUuICBUaGUgc2VydmVyIHNlbmRzIHZlcmJvc2UgZGVidWcgb3V0cHV0IHRvIHN0YW5kYXJkCisgICAgICAgICAgICAgZXJyb3IsIGFuZCBkb2VzIG5vdCBwdXQgaXRzZWxmIGluIHRoZSBiYWNrZ3JvdW5kLiAgVGhlIHNlcnZlcgorICAgICAgICAgICAgIGFsc28gd2lsbCBub3QgZm9yayBhbmQgd2lsbCBvbmx5IHByb2Nlc3Mgb25lIGNvbm5lY3Rpb24uICBUaGlzCisgICAgICAgICAgICAgb3B0aW9uIGlzIG9ubHkgaW50ZW5kZWQgZm9yIGRlYnVnZ2luZyBmb3IgdGhlIHNlcnZlci4gIE11bHRpcGxlCisgICAgICAgICAgICAgLWQgb3B0aW9ucyBpbmNyZWFzZSB0aGUgZGVidWdnaW5nIGxldmVsLiAgTWF4aW11bSBpcyAzLgorCisgICAgIC1lICAgICAgV2hlbiB0aGlzIG9wdGlvbiBpcyBzcGVjaWZpZWQsIHNzaGQgd2lsbCBzZW5kIHRoZSBvdXRwdXQgdG8gdGhlCisgICAgICAgICAgICAgc3RhbmRhcmQgZXJyb3IgaW5zdGVhZCBvZiB0aGUgc3lzdGVtIGxvZy4KKworICAgICAtZiBjb25maWdfZmlsZQorICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiAgVGhlIGRlZmF1bHQgaXMKKyAgICAgICAgICAgICAvZXRjL3NzaC9zc2hkX2NvbmZpZy4gIHNzaGQgcmVmdXNlcyB0byBzdGFydCBpZiB0aGVyZSBpcyBubworICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZS4KKworICAgICAtZyBsb2dpbl9ncmFjZV90aW1lCisgICAgICAgICAgICAgR2l2ZXMgdGhlIGdyYWNlIHRpbWUgZm9yIGNsaWVudHMgdG8gYXV0aGVudGljYXRlIHRoZW1zZWx2ZXMKKyAgICAgICAgICAgICAoZGVmYXVsdCAxMjAgc2Vjb25kcykuICBJZiB0aGUgY2xpZW50IGZhaWxzIHRvIGF1dGhlbnRpY2F0ZSB0aGUKKyAgICAgICAgICAgICB1c2VyIHdpdGhpbiB0aGlzIG1hbnkgc2Vjb25kcywgdGhlIHNlcnZlciBkaXNjb25uZWN0cyBhbmQgZXhpdHMuCisgICAgICAgICAgICAgQSB2YWx1ZSBvZiB6ZXJvIGluZGljYXRlcyBubyBsaW1pdC4KKworICAgICAtaCBob3N0X2tleV9maWxlCisgICAgICAgICAgICAgU3BlY2lmaWVzIGEgZmlsZSBmcm9tIHdoaWNoIGEgaG9zdCBrZXkgaXMgcmVhZC4gIFRoaXMgb3B0aW9uIG11c3QKKyAgICAgICAgICAgICBiZSBnaXZlbiBpZiBzc2hkIGlzIG5vdCBydW4gYXMgcm9vdCAoYXMgdGhlIG5vcm1hbCBob3N0IGtleSBmaWxlcworICAgICAgICAgICAgIGFyZSBub3JtYWxseSBub3QgcmVhZGFibGUgYnkgYW55b25lIGJ1dCByb290KS4gIFRoZSBkZWZhdWx0IGlzCisgICAgICAgICAgICAgL2V0Yy9zc2gvc3NoX2hvc3Rfa2V5IGZvciBwcm90b2NvbCB2ZXJzaW9uIDEsIGFuZAorICAgICAgICAgICAgIC9ldGMvc3NoL3NzaF9ob3N0X2RzYV9rZXksIC9ldGMvc3NoL3NzaF9ob3N0X2VjZHNhX2tleSBhbmQKKyAgICAgICAgICAgICAvZXRjL3NzaC9zc2hfaG9zdF9yc2Ffa2V5IGZvciBwcm90b2NvbCB2ZXJzaW9uIDIuICBJdCBpcyBwb3NzaWJsZQorICAgICAgICAgICAgIHRvIGhhdmUgbXVsdGlwbGUgaG9zdCBrZXkgZmlsZXMgZm9yIHRoZSBkaWZmZXJlbnQgcHJvdG9jb2wKKyAgICAgICAgICAgICB2ZXJzaW9ucyBhbmQgaG9zdCBrZXkgYWxnb3JpdGhtcy4KKworICAgICAtaSAgICAgIFNwZWNpZmllcyB0aGF0IHNzaGQgaXMgYmVpbmcgcnVuIGZyb20gaW5ldGQoOCkuICBzc2hkIGlzIG5vcm1hbGx5CisgICAgICAgICAgICAgbm90IHJ1biBmcm9tIGluZXRkIGJlY2F1c2UgaXQgbmVlZHMgdG8gZ2VuZXJhdGUgdGhlIHNlcnZlciBrZXkKKyAgICAgICAgICAgICBiZWZvcmUgaXQgY2FuIHJlc3BvbmQgdG8gdGhlIGNsaWVudCwgYW5kIHRoaXMgbWF5IHRha2UgdGVucyBvZgorICAgICAgICAgICAgIHNlY29uZHMuICBDbGllbnRzIHdvdWxkIGhhdmUgdG8gd2FpdCB0b28gbG9uZyBpZiB0aGUga2V5IHdhcworICAgICAgICAgICAgIHJlZ2VuZXJhdGVkIGV2ZXJ5IHRpbWUuICBIb3dldmVyLCB3aXRoIHNtYWxsIGtleSBzaXplcyAoZS5nLiA1MTIpCisgICAgICAgICAgICAgdXNpbmcgc3NoZCBmcm9tIGluZXRkIG1heSBiZSBmZWFzaWJsZS4KKworICAgICAtayBrZXlfZ2VuX3RpbWUKKyAgICAgICAgICAgICBTcGVjaWZpZXMgaG93IG9mdGVuIHRoZSBlcGhlbWVyYWwgcHJvdG9jb2wgdmVyc2lvbiAxIHNlcnZlciBrZXkKKyAgICAgICAgICAgICBpcyByZWdlbmVyYXRlZCAoZGVmYXVsdCAzNjAwIHNlY29uZHMsIG9yIG9uZSBob3VyKS4gIFRoZQorICAgICAgICAgICAgIG1vdGl2YXRpb24gZm9yIHJlZ2VuZXJhdGluZyB0aGUga2V5IGZhaXJseSBvZnRlbiBpcyB0aGF0IHRoZSBrZXkKKyAgICAgICAgICAgICBpcyBub3Qgc3RvcmVkIGFueXdoZXJlLCBhbmQgYWZ0ZXIgYWJvdXQgYW4gaG91ciBpdCBiZWNvbWVzCisgICAgICAgICAgICAgaW1wb3NzaWJsZSB0byByZWNvdmVyIHRoZSBrZXkgZm9yIGRlY3J5cHRpbmcgaW50ZXJjZXB0ZWQKKyAgICAgICAgICAgICBjb21tdW5pY2F0aW9ucyBldmVuIGlmIHRoZSBtYWNoaW5lIGlzIGNyYWNrZWQgaW50byBvciBwaHlzaWNhbGx5CisgICAgICAgICAgICAgc2VpemVkLiAgQSB2YWx1ZSBvZiB6ZXJvIGluZGljYXRlcyB0aGF0IHRoZSBrZXkgd2lsbCBuZXZlciBiZQorICAgICAgICAgICAgIHJlZ2VuZXJhdGVkLgorCisgICAgIC1vIG9wdGlvbgorICAgICAgICAgICAgIENhbiBiZSB1c2VkIHRvIGdpdmUgb3B0aW9ucyBpbiB0aGUgZm9ybWF0IHVzZWQgaW4gdGhlCisgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHNwZWNpZnlpbmcgb3B0aW9ucyBmb3IKKyAgICAgICAgICAgICB3aGljaCB0aGVyZSBpcyBubyBzZXBhcmF0ZSBjb21tYW5kLWxpbmUgZmxhZy4gIEZvciBmdWxsIGRldGFpbHMKKyAgICAgICAgICAgICBvZiB0aGUgb3B0aW9ucywgYW5kIHRoZWlyIHZhbHVlcywgc2VlIHNzaGRfY29uZmlnKDUpLgorCisgICAgIC1wIHBvcnQKKyAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHBvcnQgb24gd2hpY2ggdGhlIHNlcnZlciBsaXN0ZW5zIGZvciBjb25uZWN0aW9ucworICAgICAgICAgICAgIChkZWZhdWx0IDIyKS4gIE11bHRpcGxlIHBvcnQgb3B0aW9ucyBhcmUgcGVybWl0dGVkLiAgUG9ydHMKKyAgICAgICAgICAgICBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB3aXRoIHRoZSBQb3J0IG9wdGlvbiBhcmUKKyAgICAgICAgICAgICBpZ25vcmVkIHdoZW4gYSBjb21tYW5kLWxpbmUgcG9ydCBpcyBzcGVjaWZpZWQuICBQb3J0cyBzcGVjaWZpZWQKKyAgICAgICAgICAgICB1c2luZyB0aGUgTGlzdGVuQWRkcmVzcyBvcHRpb24gb3ZlcnJpZGUgY29tbWFuZC1saW5lIHBvcnRzLgorCisgICAgIC1xICAgICAgUXVpZXQgbW9kZS4gIE5vdGhpbmcgaXMgc2VudCB0byB0aGUgc3lzdGVtIGxvZy4gIE5vcm1hbGx5IHRoZQorICAgICAgICAgICAgIGJlZ2lubmluZywgYXV0aGVudGljYXRpb24sIGFuZCB0ZXJtaW5hdGlvbiBvZiBlYWNoIGNvbm5lY3Rpb24gaXMKKyAgICAgICAgICAgICBsb2dnZWQuCisKKyAgICAgLVQgICAgICBFeHRlbmRlZCB0ZXN0IG1vZGUuICBDaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICBmaWxlLCBvdXRwdXQgdGhlIGVmZmVjdGl2ZSBjb25maWd1cmF0aW9uIHRvIHN0ZG91dCBhbmQgdGhlbiBleGl0LgorICAgICAgICAgICAgIE9wdGlvbmFsbHksIE1hdGNoIHJ1bGVzIG1heSBiZSBhcHBsaWVkIGJ5IHNwZWNpZnlpbmcgdGhlCisgICAgICAgICAgICAgY29ubmVjdGlvbiBwYXJhbWV0ZXJzIHVzaW5nIG9uZSBvciBtb3JlIC1DIG9wdGlvbnMuCisKKyAgICAgLXQgICAgICBUZXN0IG1vZGUuICBPbmx5IGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGFuZAorICAgICAgICAgICAgIHNhbml0eSBvZiB0aGUga2V5cy4gIFRoaXMgaXMgdXNlZnVsIGZvciB1cGRhdGluZyBzc2hkIHJlbGlhYmx5IGFzCisgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBvcHRpb25zIG1heSBjaGFuZ2UuCisKKyAgICAgLXUgbGVuICBUaGlzIG9wdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHNpemUgb2YgdGhlIGZpZWxkIGluIHRoZSB1dG1wCisgICAgICAgICAgICAgc3RydWN0dXJlIHRoYXQgaG9sZHMgdGhlIHJlbW90ZSBob3N0IG5hbWUuICBJZiB0aGUgcmVzb2x2ZWQgaG9zdAorICAgICAgICAgICAgIG5hbWUgaXMgbG9uZ2VyIHRoYW4gbGVuLCB0aGUgZG90dGVkIGRlY2ltYWwgdmFsdWUgd2lsbCBiZSB1c2VkCisgICAgICAgICAgICAgaW5zdGVhZC4gIFRoaXMgYWxsb3dzIGhvc3RzIHdpdGggdmVyeSBsb25nIGhvc3QgbmFtZXMgdGhhdAorICAgICAgICAgICAgIG92ZXJmbG93IHRoaXMgZmllbGQgdG8gc3RpbGwgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4gIFNwZWNpZnlpbmcKKyAgICAgICAgICAgICAtdTAgaW5kaWNhdGVzIHRoYXQgb25seSBkb3R0ZWQgZGVjaW1hbCBhZGRyZXNzZXMgc2hvdWxkIGJlIHB1dAorICAgICAgICAgICAgIGludG8gdGhlIHV0bXAgZmlsZS4gIC11MCBtYXkgYWxzbyBiZSB1c2VkIHRvIHByZXZlbnQgc3NoZCBmcm9tCisgICAgICAgICAgICAgbWFraW5nIEROUyByZXF1ZXN0cyB1bmxlc3MgdGhlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSBvcgorICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gcmVxdWlyZXMgaXQuICBBdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHRoYXQgbWF5CisgICAgICAgICAgICAgcmVxdWlyZSBETlMgaW5jbHVkZSBSaG9zdHNSU0FBdXRoZW50aWNhdGlvbiwKKyAgICAgICAgICAgICBIb3N0YmFzZWRBdXRoZW50aWNhdGlvbiwgYW5kIHVzaW5nIGEgZnJvbT0icGF0dGVybi1saXN0IiBvcHRpb24KKyAgICAgICAgICAgICBpbiBhIGtleSBmaWxlLiAgQ29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgcmVxdWlyZSBETlMgaW5jbHVkZQorICAgICAgICAgICAgIHVzaW5nIGEgVVNFUkBIT1NUIHBhdHRlcm4gaW4gQWxsb3dVc2VycyBvciBEZW55VXNlcnMuCisKK0FVVEhFTlRJQ0FUSU9OCisgICAgIFRoZSBPcGVuU1NIIFNTSCBkYWVtb24gc3VwcG9ydHMgU1NIIHByb3RvY29scyAxIGFuZCAyLiAgVGhlIGRlZmF1bHQgaXMgdG8KKyAgICAgdXNlIHByb3RvY29sIDIgb25seSwgdGhvdWdoIHRoaXMgY2FuIGJlIGNoYW5nZWQgdmlhIHRoZSBQcm90b2NvbCBvcHRpb24KKyAgICAgaW4gc3NoZF9jb25maWcoNSkuICBQcm90b2NvbCAyIHN1cHBvcnRzIERTQSwgRUNEU0EgYW5kIFJTQSBrZXlzOyBwcm90b2NvbAorICAgICAxIG9ubHkgc3VwcG9ydHMgUlNBIGtleXMuICBGb3IgYm90aCBwcm90b2NvbHMsIGVhY2ggaG9zdCBoYXMgYSBob3N0LQorICAgICBzcGVjaWZpYyBrZXksIG5vcm1hbGx5IDIwNDggYml0cywgdXNlZCB0byBpZGVudGlmeSB0aGUgaG9zdC4KKworICAgICBGb3J3YXJkIHNlY3VyaXR5IGZvciBwcm90b2NvbCAxIGlzIHByb3ZpZGVkIHRocm91Z2ggYW4gYWRkaXRpb25hbCBzZXJ2ZXIKKyAgICAga2V5LCBub3JtYWxseSA3NjggYml0cywgZ2VuZXJhdGVkIHdoZW4gdGhlIHNlcnZlciBzdGFydHMuICBUaGlzIGtleSBpcworICAgICBub3JtYWxseSByZWdlbmVyYXRlZCBldmVyeSBob3VyIGlmIGl0IGhhcyBiZWVuIHVzZWQsIGFuZCBpcyBuZXZlciBzdG9yZWQKKyAgICAgb24gZGlzay4gIFdoZW5ldmVyIGEgY2xpZW50IGNvbm5lY3RzLCB0aGUgZGFlbW9uIHJlc3BvbmRzIHdpdGggaXRzIHB1YmxpYworICAgICBob3N0IGFuZCBzZXJ2ZXIga2V5cy4gIFRoZSBjbGllbnQgY29tcGFyZXMgdGhlIFJTQSBob3N0IGtleSBhZ2FpbnN0IGl0cworICAgICBvd24gZGF0YWJhc2UgdG8gdmVyaWZ5IHRoYXQgaXQgaGFzIG5vdCBjaGFuZ2VkLiAgVGhlIGNsaWVudCB0aGVuCisgICAgIGdlbmVyYXRlcyBhIDI1Ni1iaXQgcmFuZG9tIG51bWJlci4gIEl0IGVuY3J5cHRzIHRoaXMgcmFuZG9tIG51bWJlciB1c2luZworICAgICBib3RoIHRoZSBob3N0IGtleSBhbmQgdGhlIHNlcnZlciBrZXksIGFuZCBzZW5kcyB0aGUgZW5jcnlwdGVkIG51bWJlciB0bworICAgICB0aGUgc2VydmVyLiAgQm90aCBzaWRlcyB0aGVuIHVzZSB0aGlzIHJhbmRvbSBudW1iZXIgYXMgYSBzZXNzaW9uIGtleQorICAgICB3aGljaCBpcyB1c2VkIHRvIGVuY3J5cHQgYWxsIGZ1cnRoZXIgY29tbXVuaWNhdGlvbnMgaW4gdGhlIHNlc3Npb24uICBUaGUKKyAgICAgcmVzdCBvZiB0aGUgc2Vzc2lvbiBpcyBlbmNyeXB0ZWQgdXNpbmcgYSBjb252ZW50aW9uYWwgY2lwaGVyLCBjdXJyZW50bHkKKyAgICAgQmxvd2Zpc2ggb3IgM0RFUywgd2l0aCAzREVTIGJlaW5nIHVzZWQgYnkgZGVmYXVsdC4gIFRoZSBjbGllbnQgc2VsZWN0cworICAgICB0aGUgZW5jcnlwdGlvbiBhbGdvcml0aG0gdG8gdXNlIGZyb20gdGhvc2Ugb2ZmZXJlZCBieSB0aGUgc2VydmVyLgorCisgICAgIEZvciBwcm90b2NvbCAyLCBmb3J3YXJkIHNlY3VyaXR5IGlzIHByb3ZpZGVkIHRocm91Z2ggYSBEaWZmaWUtSGVsbG1hbiBrZXkKKyAgICAgYWdyZWVtZW50LiAgVGhpcyBrZXkgYWdyZWVtZW50IHJlc3VsdHMgaW4gYSBzaGFyZWQgc2Vzc2lvbiBrZXkuICBUaGUgcmVzdAorICAgICBvZiB0aGUgc2Vzc2lvbiBpcyBlbmNyeXB0ZWQgdXNpbmcgYSBzeW1tZXRyaWMgY2lwaGVyLCBjdXJyZW50bHkgMTI4LWJpdAorICAgICBBRVMsIEJsb3dmaXNoLCAzREVTLCBDQVNUMTI4LCBBcmNmb3VyLCAxOTItYml0IEFFUywgb3IgMjU2LWJpdCBBRVMuICBUaGUKKyAgICAgY2xpZW50IHNlbGVjdHMgdGhlIGVuY3J5cHRpb24gYWxnb3JpdGhtIHRvIHVzZSBmcm9tIHRob3NlIG9mZmVyZWQgYnkgdGhlCisgICAgIHNlcnZlci4gIEFkZGl0aW9uYWxseSwgc2Vzc2lvbiBpbnRlZ3JpdHkgaXMgcHJvdmlkZWQgdGhyb3VnaCBhCisgICAgIGNyeXB0b2dyYXBoaWMgbWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlIChobWFjLW1kNSwgaG1hYy1zaGExLCB1bWFjLTY0LAorICAgICBobWFjLXJpcGVtZDE2MCwgaG1hYy1zaGEyLTI1NiBvciBobWFjLXNoYTItNTEyKS4KKworICAgICBGaW5hbGx5LCB0aGUgc2VydmVyIGFuZCB0aGUgY2xpZW50IGVudGVyIGFuIGF1dGhlbnRpY2F0aW9uIGRpYWxvZy4gIFRoZQorICAgICBjbGllbnQgdHJpZXMgdG8gYXV0aGVudGljYXRlIGl0c2VsZiB1c2luZyBob3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uLAorICAgICBwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uLCBjaGFsbGVuZ2UtcmVzcG9uc2UgYXV0aGVudGljYXRpb24sIG9yIHBhc3N3b3JkCisgICAgIGF1dGhlbnRpY2F0aW9uLgorCisgICAgIFJlZ2FyZGxlc3Mgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUsIHRoZSBhY2NvdW50IGlzIGNoZWNrZWQgdG8gZW5zdXJlCisgICAgIHRoYXQgaXQgaXMgYWNjZXNzaWJsZS4gIEFuIGFjY291bnQgaXMgbm90IGFjY2Vzc2libGUgaWYgaXQgaXMgbG9ja2VkLAorICAgICBsaXN0ZWQgaW4gRGVueVVzZXJzIG9yIGl0cyBncm91cCBpcyBsaXN0ZWQgaW4gRGVueUdyb3VwcyAuICBUaGUKKyAgICAgZGVmaW5pdGlvbiBvZiBhIGxvY2tlZCBhY2NvdW50IGlzIHN5c3RlbSBkZXBlbmRhbnQuIFNvbWUgcGxhdGZvcm1zIGhhdmUKKyAgICAgdGhlaXIgb3duIGFjY291bnQgZGF0YWJhc2UgKGVnIEFJWCkgYW5kIHNvbWUgbW9kaWZ5IHRoZSBwYXNzd2QgZmllbGQgKAorICAgICBgKkxLKicgb24gU29sYXJpcyBhbmQgVW5peFdhcmUsIGAqJyBvbiBIUC1VWCwgY29udGFpbmluZyBgTm9sb2dpbicgb24KKyAgICAgVHJ1NjQsIGEgbGVhZGluZyBgKkxPQ0tFRConIG9uIEZyZWVCU0QgYW5kIGEgbGVhZGluZyBgIScgb24gbW9zdAorICAgICBMaW51eGVzKS4gIElmIHRoZXJlIGlzIGEgcmVxdWlyZW1lbnQgdG8gZGlzYWJsZSBwYXNzd29yZCBhdXRoZW50aWNhdGlvbgorICAgICBmb3IgdGhlIGFjY291bnQgd2hpbGUgYWxsb3dpbmcgc3RpbGwgcHVibGljLWtleSwgdGhlbiB0aGUgcGFzc3dkIGZpZWxkCisgICAgIHNob3VsZCBiZSBzZXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlc2UgdmFsdWVzIChlZyBgTlAnIG9yIGAqTlAqJyApLgorCisgICAgIElmIHRoZSBjbGllbnQgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZXMgaXRzZWxmLCBhIGRpYWxvZyBmb3IgcHJlcGFyaW5nCisgICAgIHRoZSBzZXNzaW9uIGlzIGVudGVyZWQuICBBdCB0aGlzIHRpbWUgdGhlIGNsaWVudCBtYXkgcmVxdWVzdCB0aGluZ3MgbGlrZQorICAgICBhbGxvY2F0aW5nIGEgcHNldWRvLXR0eSwgZm9yd2FyZGluZyBYMTEgY29ubmVjdGlvbnMsIGZvcndhcmRpbmcgVENQCisgICAgIGNvbm5lY3Rpb25zLCBvciBmb3J3YXJkaW5nIHRoZSBhdXRoZW50aWNhdGlvbiBhZ2VudCBjb25uZWN0aW9uIG92ZXIgdGhlCisgICAgIHNlY3VyZSBjaGFubmVsLgorCisgICAgIEFmdGVyIHRoaXMsIHRoZSBjbGllbnQgZWl0aGVyIHJlcXVlc3RzIGEgc2hlbGwgb3IgZXhlY3V0aW9uIG9mIGEgY29tbWFuZC4KKyAgICAgVGhlIHNpZGVzIHRoZW4gZW50ZXIgc2Vzc2lvbiBtb2RlLiAgSW4gdGhpcyBtb2RlLCBlaXRoZXIgc2lkZSBtYXkgc2VuZAorICAgICBkYXRhIGF0IGFueSB0aW1lLCBhbmQgc3VjaCBkYXRhIGlzIGZvcndhcmRlZCB0by9mcm9tIHRoZSBzaGVsbCBvciBjb21tYW5kCisgICAgIG9uIHRoZSBzZXJ2ZXIgc2lkZSwgYW5kIHRoZSB1c2VyIHRlcm1pbmFsIGluIHRoZSBjbGllbnQgc2lkZS4KKworICAgICBXaGVuIHRoZSB1c2VyIHByb2dyYW0gdGVybWluYXRlcyBhbmQgYWxsIGZvcndhcmRlZCBYMTEgYW5kIG90aGVyCisgICAgIGNvbm5lY3Rpb25zIGhhdmUgYmVlbiBjbG9zZWQsIHRoZSBzZXJ2ZXIgc2VuZHMgY29tbWFuZCBleGl0IHN0YXR1cyB0byB0aGUKKyAgICAgY2xpZW50LCBhbmQgYm90aCBzaWRlcyBleGl0LgorCitMT0dJTiBQUk9DRVNTCisgICAgIFdoZW4gYSB1c2VyIHN1Y2Nlc3NmdWxseSBsb2dzIGluLCBzc2hkIGRvZXMgdGhlIGZvbGxvd2luZzoKKworICAgICAgICAgICAxLiAgIElmIHRoZSBsb2dpbiBpcyBvbiBhIHR0eSwgYW5kIG5vIGNvbW1hbmQgaGFzIGJlZW4gc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgIHByaW50cyBsYXN0IGxvZ2luIHRpbWUgYW5kIC9ldGMvbW90ZCAodW5sZXNzIHByZXZlbnRlZCBpbiB0aGUKKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGZpbGUgb3IgYnkgfi8uaHVzaGxvZ2luOyBzZWUgdGhlIEZJTEVTIHNlY3Rpb24pLgorCisgICAgICAgICAgIDIuICAgSWYgdGhlIGxvZ2luIGlzIG9uIGEgdHR5LCByZWNvcmRzIGxvZ2luIHRpbWUuCisKKyAgICAgICAgICAgMy4gICBDaGVja3MgL2V0Yy9ub2xvZ2luOyBpZiBpdCBleGlzdHMsIHByaW50cyBjb250ZW50cyBhbmQgcXVpdHMKKyAgICAgICAgICAgICAgICAodW5sZXNzIHJvb3QpLgorCisgICAgICAgICAgIDQuICAgQ2hhbmdlcyB0byBydW4gd2l0aCBub3JtYWwgdXNlciBwcml2aWxlZ2VzLgorCisgICAgICAgICAgIDUuICAgU2V0cyB1cCBiYXNpYyBlbnZpcm9ubWVudC4KKworICAgICAgICAgICA2LiAgIFJlYWRzIHRoZSBmaWxlIH4vLnNzaC9lbnZpcm9ubWVudCwgaWYgaXQgZXhpc3RzLCBhbmQgdXNlcnMgYXJlCisgICAgICAgICAgICAgICAgYWxsb3dlZCB0byBjaGFuZ2UgdGhlaXIgZW52aXJvbm1lbnQuICBTZWUgdGhlCisgICAgICAgICAgICAgICAgUGVybWl0VXNlckVudmlyb25tZW50IG9wdGlvbiBpbiBzc2hkX2NvbmZpZyg1KS4KKworICAgICAgICAgICA3LiAgIENoYW5nZXMgdG8gdXNlcidzIGhvbWUgZGlyZWN0b3J5LgorCisgICAgICAgICAgIDguICAgSWYgfi8uc3NoL3JjIGV4aXN0cywgcnVucyBpdDsgZWxzZSBpZiAvZXRjL3NzaC9zc2hyYyBleGlzdHMsCisgICAgICAgICAgICAgICAgcnVucyBpdDsgb3RoZXJ3aXNlIHJ1bnMgeGF1dGguICBUaGUgYGByYycnIGZpbGVzIGFyZSBnaXZlbiB0aGUKKyAgICAgICAgICAgICAgICBYMTEgYXV0aGVudGljYXRpb24gcHJvdG9jb2wgYW5kIGNvb2tpZSBpbiBzdGFuZGFyZCBpbnB1dC4gIFNlZQorICAgICAgICAgICAgICAgIFNTSFJDLCBiZWxvdy4KKworICAgICAgICAgICA5LiAgIFJ1bnMgdXNlcidzIHNoZWxsIG9yIGNvbW1hbmQuCisKK1NTSFJDCisgICAgIElmIHRoZSBmaWxlIH4vLnNzaC9yYyBleGlzdHMsIHNoKDEpIHJ1bnMgaXQgYWZ0ZXIgcmVhZGluZyB0aGUgZW52aXJvbm1lbnQKKyAgICAgZmlsZXMgYnV0IGJlZm9yZSBzdGFydGluZyB0aGUgdXNlcidzIHNoZWxsIG9yIGNvbW1hbmQuICBJdCBtdXN0IG5vdAorICAgICBwcm9kdWNlIGFueSBvdXRwdXQgb24gc3Rkb3V0OyBzdGRlcnIgbXVzdCBiZSB1c2VkIGluc3RlYWQuICBJZiBYMTEKKyAgICAgZm9yd2FyZGluZyBpcyBpbiB1c2UsIGl0IHdpbGwgcmVjZWl2ZSB0aGUgInByb3RvIGNvb2tpZSIgcGFpciBpbiBpdHMKKyAgICAgc3RhbmRhcmQgaW5wdXQgKGFuZCBESVNQTEFZIGluIGl0cyBlbnZpcm9ubWVudCkuICBUaGUgc2NyaXB0IG11c3QgY2FsbAorICAgICB4YXV0aCgxKSBiZWNhdXNlIHNzaGQgd2lsbCBub3QgcnVuIHhhdXRoIGF1dG9tYXRpY2FsbHkgdG8gYWRkIFgxMQorICAgICBjb29raWVzLgorCisgICAgIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBmaWxlIGlzIHRvIHJ1biBhbnkgaW5pdGlhbGl6YXRpb24gcm91dGluZXMKKyAgICAgd2hpY2ggbWF5IGJlIG5lZWRlZCBiZWZvcmUgdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSBiZWNvbWVzIGFjY2Vzc2libGU7CisgICAgIEFGUyBpcyBhIHBhcnRpY3VsYXIgZXhhbXBsZSBvZiBzdWNoIGFuIGVudmlyb25tZW50LgorCisgICAgIFRoaXMgZmlsZSB3aWxsIHByb2JhYmx5IGNvbnRhaW4gc29tZSBpbml0aWFsaXphdGlvbiBjb2RlIGZvbGxvd2VkIGJ5CisgICAgIHNvbWV0aGluZyBzaW1pbGFyIHRvOgorCisgICAgICAgIGlmIHJlYWQgcHJvdG8gY29va2llICYmIFsgLW4gIiRESVNQTEFZIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgaWYgWyBgZWNobyAkRElTUExBWSB8IGN1dCAtYzEtMTBgID0gJ2xvY2FsaG9zdDonIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICMgWDExVXNlTG9jYWxob3N0PXllcworICAgICAgICAgICAgICAgICAgICAgICAgZWNobyBhZGQgdW5peDpgZWNobyAkRElTUExBWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3V0IC1jMTEtYCAkcHJvdG8gJGNvb2tpZQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICMgWDExVXNlTG9jYWxob3N0PW5vCisgICAgICAgICAgICAgICAgICAgICAgICBlY2hvIGFkZCAkRElTUExBWSAkcHJvdG8gJGNvb2tpZQorICAgICAgICAgICAgICAgIGZpIHwgeGF1dGggLXEgLQorICAgICAgICBmaQorCisgICAgIElmIHRoaXMgZmlsZSBkb2VzIG5vdCBleGlzdCwgL2V0Yy9zc2gvc3NocmMgaXMgcnVuLCBhbmQgaWYgdGhhdCBkb2VzIG5vdAorICAgICBleGlzdCBlaXRoZXIsIHhhdXRoIGlzIHVzZWQgdG8gYWRkIHRoZSBjb29raWUuCisKK0FVVEhPUklaRURfS0VZUyBGSUxFIEZPUk1BVAorICAgICBBdXRob3JpemVkS2V5c0ZpbGUgc3BlY2lmaWVzIHRoZSBmaWxlcyBjb250YWluaW5nIHB1YmxpYyBrZXlzIGZvciBwdWJsaWMKKyAgICAga2V5IGF1dGhlbnRpY2F0aW9uOyBpZiBub25lIGlzIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgaXMKKyAgICAgfi8uc3NoL2F1dGhvcml6ZWRfa2V5cyBhbmQgfi8uc3NoL2F1dGhvcml6ZWRfa2V5czIuICBFYWNoIGxpbmUgb2YgdGhlCisgICAgIGZpbGUgY29udGFpbnMgb25lIGtleSAoZW1wdHkgbGluZXMgYW5kIGxpbmVzIHN0YXJ0aW5nIHdpdGggYSBgIycgYXJlCisgICAgIGlnbm9yZWQgYXMgY29tbWVudHMpLiAgUHJvdG9jb2wgMSBwdWJsaWMga2V5cyBjb25zaXN0IG9mIHRoZSBmb2xsb3dpbmcKKyAgICAgc3BhY2Utc2VwYXJhdGVkIGZpZWxkczogb3B0aW9ucywgYml0cywgZXhwb25lbnQsIG1vZHVsdXMsIGNvbW1lbnQuCisgICAgIFByb3RvY29sIDIgcHVibGljIGtleSBjb25zaXN0IG9mOiBvcHRpb25zLCBrZXl0eXBlLCBiYXNlNjQtZW5jb2RlZCBrZXksCisgICAgIGNvbW1lbnQuICBUaGUgb3B0aW9ucyBmaWVsZCBpcyBvcHRpb25hbDsgaXRzIHByZXNlbmNlIGlzIGRldGVybWluZWQgYnkKKyAgICAgd2hldGhlciB0aGUgbGluZSBzdGFydHMgd2l0aCBhIG51bWJlciBvciBub3QgKHRoZSBvcHRpb25zIGZpZWxkIG5ldmVyCisgICAgIHN0YXJ0cyB3aXRoIGEgbnVtYmVyKS4gIFRoZSBiaXRzLCBleHBvbmVudCwgbW9kdWx1cywgYW5kIGNvbW1lbnQgZmllbGRzCisgICAgIGdpdmUgdGhlIFJTQSBrZXkgZm9yIHByb3RvY29sIHZlcnNpb24gMTsgdGhlIGNvbW1lbnQgZmllbGQgaXMgbm90IHVzZWQKKyAgICAgZm9yIGFueXRoaW5nIChidXQgbWF5IGJlIGNvbnZlbmllbnQgZm9yIHRoZSB1c2VyIHRvIGlkZW50aWZ5IHRoZSBrZXkpLgorICAgICBGb3IgcHJvdG9jb2wgdmVyc2lvbiAyIHRoZSBrZXl0eXBlIGlzIGBgZWNkc2Etc2hhMi1uaXN0cDI1NicnLAorICAgICBgYGVjZHNhLXNoYTItbmlzdHAzODQnJywgYGBlY2RzYS1zaGEyLW5pc3RwNTIxJycsIGBgc3NoLWRzcycnIG9yCisgICAgIGBgc3NoLXJzYScnLgorCisgICAgIE5vdGUgdGhhdCBsaW5lcyBpbiB0aGlzIGZpbGUgYXJlIHVzdWFsbHkgc2V2ZXJhbCBodW5kcmVkIGJ5dGVzIGxvbmcKKyAgICAgKGJlY2F1c2Ugb2YgdGhlIHNpemUgb2YgdGhlIHB1YmxpYyBrZXkgZW5jb2RpbmcpIHVwIHRvIGEgbGltaXQgb2YgOAorICAgICBraWxvYnl0ZXMsIHdoaWNoIHBlcm1pdHMgRFNBIGtleXMgdXAgdG8gOCBraWxvYml0cyBhbmQgUlNBIGtleXMgdXAgdG8gMTYKKyAgICAga2lsb2JpdHMuICBZb3UgZG9uJ3Qgd2FudCB0byB0eXBlIHRoZW0gaW47IGluc3RlYWQsIGNvcHkgdGhlCisgICAgIGlkZW50aXR5LnB1YiwgaWRfZHNhLnB1YiwgaWRfZWNkc2EucHViLCBvciB0aGUgaWRfcnNhLnB1YiBmaWxlIGFuZCBlZGl0CisgICAgIGl0LgorCisgICAgIHNzaGQgZW5mb3JjZXMgYSBtaW5pbXVtIFJTQSBrZXkgbW9kdWx1cyBzaXplIGZvciBwcm90b2NvbCAxIGFuZCBwcm90b2NvbAorICAgICAyIGtleXMgb2YgNzY4IGJpdHMuCisKKyAgICAgVGhlIG9wdGlvbnMgKGlmIHByZXNlbnQpIGNvbnNpc3Qgb2YgY29tbWEtc2VwYXJhdGVkIG9wdGlvbgorICAgICBzcGVjaWZpY2F0aW9ucy4gIE5vIHNwYWNlcyBhcmUgcGVybWl0dGVkLCBleGNlcHQgd2l0aGluIGRvdWJsZSBxdW90ZXMuCisgICAgIFRoZSBmb2xsb3dpbmcgb3B0aW9uIHNwZWNpZmljYXRpb25zIGFyZSBzdXBwb3J0ZWQgKG5vdGUgdGhhdCBvcHRpb24KKyAgICAga2V5d29yZHMgYXJlIGNhc2UtaW5zZW5zaXRpdmUpOgorCisgICAgIGNlcnQtYXV0aG9yaXR5CisgICAgICAgICAgICAgU3BlY2lmaWVzIHRoYXQgdGhlIGxpc3RlZCBrZXkgaXMgYSBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eSAoQ0EpCisgICAgICAgICAgICAgdGhhdCBpcyB0cnVzdGVkIHRvIHZhbGlkYXRlIHNpZ25lZCBjZXJ0aWZpY2F0ZXMgZm9yIHVzZXIKKyAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi4KKworICAgICAgICAgICAgIENlcnRpZmljYXRlcyBtYXkgZW5jb2RlIGFjY2VzcyByZXN0cmljdGlvbnMgc2ltaWxhciB0byB0aGVzZSBrZXkKKyAgICAgICAgICAgICBvcHRpb25zLiAgSWYgYm90aCBjZXJ0aWZpY2F0ZSByZXN0cmljdGlvbnMgYW5kIGtleSBvcHRpb25zIGFyZQorICAgICAgICAgICAgIHByZXNlbnQsIHRoZSBtb3N0IHJlc3RyaWN0aXZlIHVuaW9uIG9mIHRoZSB0d28gaXMgYXBwbGllZC4KKworICAgICBjb21tYW5kPSJjb21tYW5kIgorICAgICAgICAgICAgIFNwZWNpZmllcyB0aGF0IHRoZSBjb21tYW5kIGlzIGV4ZWN1dGVkIHdoZW5ldmVyIHRoaXMga2V5IGlzIHVzZWQKKyAgICAgICAgICAgICBmb3IgYXV0aGVudGljYXRpb24uICBUaGUgY29tbWFuZCBzdXBwbGllZCBieSB0aGUgdXNlciAoaWYgYW55KSBpcworICAgICAgICAgICAgIGlnbm9yZWQuICBUaGUgY29tbWFuZCBpcyBydW4gb24gYSBwdHkgaWYgdGhlIGNsaWVudCByZXF1ZXN0cyBhCisgICAgICAgICAgICAgcHR5OyBvdGhlcndpc2UgaXQgaXMgcnVuIHdpdGhvdXQgYSB0dHkuICBJZiBhbiA4LWJpdCBjbGVhbgorICAgICAgICAgICAgIGNoYW5uZWwgaXMgcmVxdWlyZWQsIG9uZSBtdXN0IG5vdCByZXF1ZXN0IGEgcHR5IG9yIHNob3VsZCBzcGVjaWZ5CisgICAgICAgICAgICAgbm8tcHR5LiAgQSBxdW90ZSBtYXkgYmUgaW5jbHVkZWQgaW4gdGhlIGNvbW1hbmQgYnkgcXVvdGluZyBpdAorICAgICAgICAgICAgIHdpdGggYSBiYWNrc2xhc2guICBUaGlzIG9wdGlvbiBtaWdodCBiZSB1c2VmdWwgdG8gcmVzdHJpY3QKKyAgICAgICAgICAgICBjZXJ0YWluIHB1YmxpYyBrZXlzIHRvIHBlcmZvcm0ganVzdCBhIHNwZWNpZmljIG9wZXJhdGlvbi4gIEFuCisgICAgICAgICAgICAgZXhhbXBsZSBtaWdodCBiZSBhIGtleSB0aGF0IHBlcm1pdHMgcmVtb3RlIGJhY2t1cHMgYnV0IG5vdGhpbmcKKyAgICAgICAgICAgICBlbHNlLiAgTm90ZSB0aGF0IHRoZSBjbGllbnQgbWF5IHNwZWNpZnkgVENQIGFuZC9vciBYMTEgZm9yd2FyZGluZworICAgICAgICAgICAgIHVubGVzcyB0aGV5IGFyZSBleHBsaWNpdGx5IHByb2hpYml0ZWQuICBUaGUgY29tbWFuZCBvcmlnaW5hbGx5CisgICAgICAgICAgICAgc3VwcGxpZWQgYnkgdGhlIGNsaWVudCBpcyBhdmFpbGFibGUgaW4gdGhlIFNTSF9PUklHSU5BTF9DT01NQU5ECisgICAgICAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGUuICBOb3RlIHRoYXQgdGhpcyBvcHRpb24gYXBwbGllcyB0byBzaGVsbCwKKyAgICAgICAgICAgICBjb21tYW5kIG9yIHN1YnN5c3RlbSBleGVjdXRpb24uICBBbHNvIG5vdGUgdGhhdCB0aGlzIGNvbW1hbmQgbWF5CisgICAgICAgICAgICAgYmUgc3VwZXJzZWRlZCBieSBlaXRoZXIgYSBzc2hkX2NvbmZpZyg1KSBGb3JjZUNvbW1hbmQgZGlyZWN0aXZlCisgICAgICAgICAgICAgb3IgYSBjb21tYW5kIGVtYmVkZGVkIGluIGEgY2VydGlmaWNhdGUuCisKKyAgICAgZW52aXJvbm1lbnQ9Ik5BTUU9dmFsdWUiCisgICAgICAgICAgICAgU3BlY2lmaWVzIHRoYXQgdGhlIHN0cmluZyBpcyB0byBiZSBhZGRlZCB0byB0aGUgZW52aXJvbm1lbnQgd2hlbgorICAgICAgICAgICAgIGxvZ2dpbmcgaW4gdXNpbmcgdGhpcyBrZXkuICBFbnZpcm9ubWVudCB2YXJpYWJsZXMgc2V0IHRoaXMgd2F5CisgICAgICAgICAgICAgb3ZlcnJpZGUgb3RoZXIgZGVmYXVsdCBlbnZpcm9ubWVudCB2YWx1ZXMuICBNdWx0aXBsZSBvcHRpb25zIG9mCisgICAgICAgICAgICAgdGhpcyB0eXBlIGFyZSBwZXJtaXR0ZWQuICBFbnZpcm9ubWVudCBwcm9jZXNzaW5nIGlzIGRpc2FibGVkIGJ5CisgICAgICAgICAgICAgZGVmYXVsdCBhbmQgaXMgY29udHJvbGxlZCB2aWEgdGhlIFBlcm1pdFVzZXJFbnZpcm9ubWVudCBvcHRpb24uCisgICAgICAgICAgICAgVGhpcyBvcHRpb24gaXMgYXV0b21hdGljYWxseSBkaXNhYmxlZCBpZiBVc2VMb2dpbiBpcyBlbmFibGVkLgorCisgICAgIGZyb209InBhdHRlcm4tbGlzdCIKKyAgICAgICAgICAgICBTcGVjaWZpZXMgdGhhdCBpbiBhZGRpdGlvbiB0byBwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uLCBlaXRoZXIKKyAgICAgICAgICAgICB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlIHJlbW90ZSBob3N0IG9yIGl0cyBJUCBhZGRyZXNzIG11c3QgYmUKKyAgICAgICAgICAgICBwcmVzZW50IGluIHRoZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucy4gIFNlZSBQQVRURVJOUyBpbgorICAgICAgICAgICAgIHNzaF9jb25maWcoNSkgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcGF0dGVybnMuCisKKyAgICAgICAgICAgICBJbiBhZGRpdGlvbiB0byB0aGUgd2lsZGNhcmQgbWF0Y2hpbmcgdGhhdCBtYXkgYmUgYXBwbGllZCB0bworICAgICAgICAgICAgIGhvc3RuYW1lcyBvciBhZGRyZXNzZXMsIGEgZnJvbSBzdGFuemEgbWF5IG1hdGNoIElQIGFkZHJlc3NlcworICAgICAgICAgICAgIHVzaW5nIENJRFIgYWRkcmVzcy9tYXNrbGVuIG5vdGF0aW9uLgorCisgICAgICAgICAgICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBvcHRpb24gaXMgdG8gb3B0aW9uYWxseSBpbmNyZWFzZSBzZWN1cml0eToKKyAgICAgICAgICAgICBwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uIGJ5IGl0c2VsZiBkb2VzIG5vdCB0cnVzdCB0aGUgbmV0d29yayBvcgorICAgICAgICAgICAgIG5hbWUgc2VydmVycyBvciBhbnl0aGluZyAoYnV0IHRoZSBrZXkpOyBob3dldmVyLCBpZiBzb21lYm9keQorICAgICAgICAgICAgIHNvbWVob3cgc3RlYWxzIHRoZSBrZXksIHRoZSBrZXkgcGVybWl0cyBhbiBpbnRydWRlciB0byBsb2cgaW4KKyAgICAgICAgICAgICBmcm9tIGFueXdoZXJlIGluIHRoZSB3b3JsZC4gIFRoaXMgYWRkaXRpb25hbCBvcHRpb24gbWFrZXMgdXNpbmcgYQorICAgICAgICAgICAgIHN0b2xlbiBrZXkgbW9yZSBkaWZmaWN1bHQgKG5hbWUgc2VydmVycyBhbmQvb3Igcm91dGVycyB3b3VsZCBoYXZlCisgICAgICAgICAgICAgdG8gYmUgY29tcHJvbWlzZWQgaW4gYWRkaXRpb24gdG8ganVzdCB0aGUga2V5KS4KKworICAgICBuby1hZ2VudC1mb3J3YXJkaW5nCisgICAgICAgICAgICAgRm9yYmlkcyBhdXRoZW50aWNhdGlvbiBhZ2VudCBmb3J3YXJkaW5nIHdoZW4gdGhpcyBrZXkgaXMgdXNlZCBmb3IKKyAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi4KKworICAgICBuby1wb3J0LWZvcndhcmRpbmcKKyAgICAgICAgICAgICBGb3JiaWRzIFRDUCBmb3J3YXJkaW5nIHdoZW4gdGhpcyBrZXkgaXMgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uCisgICAgICAgICAgICAgQW55IHBvcnQgZm9yd2FyZCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLgorICAgICAgICAgICAgIFRoaXMgbWlnaHQgYmUgdXNlZCwgZS5nLiBpbiBjb25uZWN0aW9uIHdpdGggdGhlIGNvbW1hbmQgb3B0aW9uLgorCisgICAgIG5vLXB0eSAgUHJldmVudHMgdHR5IGFsbG9jYXRpb24gKGEgcmVxdWVzdCB0byBhbGxvY2F0ZSBhIHB0eSB3aWxsIGZhaWwpLgorCisgICAgIG5vLXVzZXItcmMKKyAgICAgICAgICAgICBEaXNhYmxlcyBleGVjdXRpb24gb2Ygfi8uc3NoL3JjLgorCisgICAgIG5vLVgxMS1mb3J3YXJkaW5nCisgICAgICAgICAgICAgRm9yYmlkcyBYMTEgZm9yd2FyZGluZyB3aGVuIHRoaXMga2V5IGlzIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLgorICAgICAgICAgICAgIEFueSBYMTEgZm9yd2FyZCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLgorCisgICAgIHBlcm1pdG9wZW49Imhvc3Q6cG9ydCIKKyAgICAgICAgICAgICBMaW1pdCBsb2NhbCBgYHNzaCAtTCcnIHBvcnQgZm9yd2FyZGluZyBzdWNoIHRoYXQgaXQgbWF5IG9ubHkKKyAgICAgICAgICAgICBjb25uZWN0IHRvIHRoZSBzcGVjaWZpZWQgaG9zdCBhbmQgcG9ydC4gIElQdjYgYWRkcmVzc2VzIGNhbiBiZQorICAgICAgICAgICAgIHNwZWNpZmllZCBieSBlbmNsb3NpbmcgdGhlIGFkZHJlc3MgaW4gc3F1YXJlIGJyYWNrZXRzLiAgTXVsdGlwbGUKKyAgICAgICAgICAgICBwZXJtaXRvcGVuIG9wdGlvbnMgbWF5IGJlIGFwcGxpZWQgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIE5vCisgICAgICAgICAgICAgcGF0dGVybiBtYXRjaGluZyBpcyBwZXJmb3JtZWQgb24gdGhlIHNwZWNpZmllZCBob3N0bmFtZXMsIHRoZXkKKyAgICAgICAgICAgICBtdXN0IGJlIGxpdGVyYWwgZG9tYWlucyBvciBhZGRyZXNzZXMuICBBIHBvcnQgc3BlY2lmaWNhdGlvbiBvZiAqCisgICAgICAgICAgICAgbWF0Y2hlcyBhbnkgcG9ydC4KKworICAgICBwcmluY2lwYWxzPSJwcmluY2lwYWxzIgorICAgICAgICAgICAgIE9uIGEgY2VydC1hdXRob3JpdHkgbGluZSwgc3BlY2lmaWVzIGFsbG93ZWQgcHJpbmNpcGFscyBmb3IKKyAgICAgICAgICAgICBjZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LiAgQXQgbGVhc3QKKyAgICAgICAgICAgICBvbmUgbmFtZSBmcm9tIHRoZSBsaXN0IG11c3QgYXBwZWFyIGluIHRoZSBjZXJ0aWZpY2F0ZSdzIGxpc3Qgb2YKKyAgICAgICAgICAgICBwcmluY2lwYWxzIGZvciB0aGUgY2VydGlmaWNhdGUgdG8gYmUgYWNjZXB0ZWQuICBUaGlzIG9wdGlvbiBpcworICAgICAgICAgICAgIGlnbm9yZWQgZm9yIGtleXMgdGhhdCBhcmUgbm90IG1hcmtlZCBhcyB0cnVzdGVkIGNlcnRpZmljYXRlCisgICAgICAgICAgICAgc2lnbmVycyB1c2luZyB0aGUgY2VydC1hdXRob3JpdHkgb3B0aW9uLgorCisgICAgIHR1bm5lbD0ibiIKKyAgICAgICAgICAgICBGb3JjZSBhIHR1big0KSBkZXZpY2Ugb24gdGhlIHNlcnZlci4gIFdpdGhvdXQgdGhpcyBvcHRpb24sIHRoZQorICAgICAgICAgICAgIG5leHQgYXZhaWxhYmxlIGRldmljZSB3aWxsIGJlIHVzZWQgaWYgdGhlIGNsaWVudCByZXF1ZXN0cyBhCisgICAgICAgICAgICAgdHVubmVsLgorCisgICAgIEFuIGV4YW1wbGUgYXV0aG9yaXplZF9rZXlzIGZpbGU6CisKKyAgICAgICAgIyBDb21tZW50cyBhbGxvd2VkIGF0IHN0YXJ0IG9mIGxpbmUKKyAgICAgICAgc3NoLXJzYSBBQUFBQjNOemEuLi5MaVBrPT0gdXNlckBleGFtcGxlLm5ldAorICAgICAgICBmcm9tPSIqLnNhbGVzLmV4YW1wbGUubmV0LCFwYy5zYWxlcy5leGFtcGxlLm5ldCIgc3NoLXJzYQorICAgICAgICBBQUFBQjIuLi4xOVE9PSBqb2huQGV4YW1wbGUubmV0CisgICAgICAgIGNvbW1hbmQ9ImR1bXAgL2hvbWUiLG5vLXB0eSxuby1wb3J0LWZvcndhcmRpbmcgc3NoLWRzcworICAgICAgICBBQUFBQzMuLi41MVI9PSBleGFtcGxlLm5ldAorICAgICAgICBwZXJtaXRvcGVuPSIxOTIuMC4yLjE6ODAiLHBlcm1pdG9wZW49IjE5Mi4wLjIuMjoyNSIgc3NoLWRzcworICAgICAgICBBQUFBQjUuLi4yMVM9PQorICAgICAgICB0dW5uZWw9IjAiLGNvbW1hbmQ9InNoIC9ldGMvbmV0c3RhcnQgdHVuMCIgc3NoLXJzYSBBQUFBLi4uPT0KKyAgICAgICAgamFuZUBleGFtcGxlLm5ldAorCitTU0hfS05PV05fSE9TVFMgRklMRSBGT1JNQVQKKyAgICAgVGhlIC9ldGMvc3NoL3NzaF9rbm93bl9ob3N0cyBhbmQgfi8uc3NoL2tub3duX2hvc3RzIGZpbGVzIGNvbnRhaW4gaG9zdAorICAgICBwdWJsaWMga2V5cyBmb3IgYWxsIGtub3duIGhvc3RzLiAgVGhlIGdsb2JhbCBmaWxlIHNob3VsZCBiZSBwcmVwYXJlZCBieQorICAgICB0aGUgYWRtaW5pc3RyYXRvciAob3B0aW9uYWwpLCBhbmQgdGhlIHBlci11c2VyIGZpbGUgaXMgbWFpbnRhaW5lZAorICAgICBhdXRvbWF0aWNhbGx5OiB3aGVuZXZlciB0aGUgdXNlciBjb25uZWN0cyBmcm9tIGFuIHVua25vd24gaG9zdCwgaXRzIGtleQorICAgICBpcyBhZGRlZCB0byB0aGUgcGVyLXVzZXIgZmlsZS4KKworICAgICBFYWNoIGxpbmUgaW4gdGhlc2UgZmlsZXMgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHM6IG1hcmtlcnMKKyAgICAgKG9wdGlvbmFsKSwgaG9zdG5hbWVzLCBiaXRzLCBleHBvbmVudCwgbW9kdWx1cywgY29tbWVudC4gIFRoZSBmaWVsZHMgYXJlCisgICAgIHNlcGFyYXRlZCBieSBzcGFjZXMuCisKKyAgICAgVGhlIG1hcmtlciBpcyBvcHRpb25hbCwgYnV0IGlmIGl0IGlzIHByZXNlbnQgdGhlbiBpdCBtdXN0IGJlIG9uZSBvZgorICAgICBgYEBjZXJ0LWF1dGhvcml0eScnLCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBsaW5lIGNvbnRhaW5zIGEgY2VydGlmaWNhdGlvbgorICAgICBhdXRob3JpdHkgKENBKSBrZXksIG9yIGBgQHJldm9rZWQnJywgdG8gaW5kaWNhdGUgdGhhdCB0aGUga2V5IGNvbnRhaW5lZAorICAgICBvbiB0aGUgbGluZSBpcyByZXZva2VkIGFuZCBtdXN0IG5vdCBldmVyIGJlIGFjY2VwdGVkLiAgT25seSBvbmUgbWFya2VyCisgICAgIHNob3VsZCBiZSB1c2VkIG9uIGEga2V5IGxpbmUuCisKKyAgICAgSG9zdG5hbWVzIGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgKGAqJyBhbmQgYD8nIGFjdCBhcworICAgICB3aWxkY2FyZHMpOyBlYWNoIHBhdHRlcm4gaW4gdHVybiBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIGNhbm9uaWNhbCBob3N0CisgICAgIG5hbWUgKHdoZW4gYXV0aGVudGljYXRpbmcgYSBjbGllbnQpIG9yIGFnYWluc3QgdGhlIHVzZXItc3VwcGxpZWQgbmFtZQorICAgICAod2hlbiBhdXRoZW50aWNhdGluZyBhIHNlcnZlcikuICBBIHBhdHRlcm4gbWF5IGFsc28gYmUgcHJlY2VkZWQgYnkgYCEnIHRvCisgICAgIGluZGljYXRlIG5lZ2F0aW9uOiBpZiB0aGUgaG9zdCBuYW1lIG1hdGNoZXMgYSBuZWdhdGVkIHBhdHRlcm4sIGl0IGlzIG5vdAorICAgICBhY2NlcHRlZCAoYnkgdGhhdCBsaW5lKSBldmVuIGlmIGl0IG1hdGNoZWQgYW5vdGhlciBwYXR0ZXJuIG9uIHRoZSBsaW5lLgorICAgICBBIGhvc3RuYW1lIG9yIGFkZHJlc3MgbWF5IG9wdGlvbmFsbHkgYmUgZW5jbG9zZWQgd2l0aGluIGBbJyBhbmQgYF0nCisgICAgIGJyYWNrZXRzIHRoZW4gZm9sbG93ZWQgYnkgYDonIGFuZCBhIG5vbi1zdGFuZGFyZCBwb3J0IG51bWJlci4KKworICAgICBBbHRlcm5hdGVseSwgaG9zdG5hbWVzIG1heSBiZSBzdG9yZWQgaW4gYSBoYXNoZWQgZm9ybSB3aGljaCBoaWRlcyBob3N0CisgICAgIG5hbWVzIGFuZCBhZGRyZXNzZXMgc2hvdWxkIHRoZSBmaWxlJ3MgY29udGVudHMgYmUgZGlzY2xvc2VkLiAgSGFzaGVkCisgICAgIGhvc3RuYW1lcyBzdGFydCB3aXRoIGEgYHwnIGNoYXJhY3Rlci4gIE9ubHkgb25lIGhhc2hlZCBob3N0bmFtZSBtYXkKKyAgICAgYXBwZWFyIG9uIGEgc2luZ2xlIGxpbmUgYW5kIG5vbmUgb2YgdGhlIGFib3ZlIG5lZ2F0aW9uIG9yIHdpbGRjYXJkCisgICAgIG9wZXJhdG9ycyBtYXkgYmUgYXBwbGllZC4KKworICAgICBCaXRzLCBleHBvbmVudCwgYW5kIG1vZHVsdXMgYXJlIHRha2VuIGRpcmVjdGx5IGZyb20gdGhlIFJTQSBob3N0IGtleTsKKyAgICAgdGhleSBjYW4gYmUgb2J0YWluZWQsIGZvciBleGFtcGxlLCBmcm9tIC9ldGMvc3NoL3NzaF9ob3N0X2tleS5wdWIuICBUaGUKKyAgICAgb3B0aW9uYWwgY29tbWVudCBmaWVsZCBjb250aW51ZXMgdG8gdGhlIGVuZCBvZiB0aGUgbGluZSwgYW5kIGlzIG5vdCB1c2VkLgorCisgICAgIExpbmVzIHN0YXJ0aW5nIHdpdGggYCMnIGFuZCBlbXB0eSBsaW5lcyBhcmUgaWdub3JlZCBhcyBjb21tZW50cy4KKworICAgICBXaGVuIHBlcmZvcm1pbmcgaG9zdCBhdXRoZW50aWNhdGlvbiwgYXV0aGVudGljYXRpb24gaXMgYWNjZXB0ZWQgaWYgYW55CisgICAgIG1hdGNoaW5nIGxpbmUgaGFzIHRoZSBwcm9wZXIga2V5OyBlaXRoZXIgb25lIHRoYXQgbWF0Y2hlcyBleGFjdGx5IG9yLCBpZgorICAgICB0aGUgc2VydmVyIGhhcyBwcmVzZW50ZWQgYSBjZXJ0aWZpY2F0ZSBmb3IgYXV0aGVudGljYXRpb24sIHRoZSBrZXkgb2YgdGhlCisgICAgIGNlcnRpZmljYXRpb24gYXV0aG9yaXR5IHRoYXQgc2lnbmVkIHRoZSBjZXJ0aWZpY2F0ZS4gIEZvciBhIGtleSB0byBiZQorICAgICB0cnVzdGVkIGFzIGEgY2VydGlmaWNhdGlvbiBhdXRob3JpdHksIGl0IG11c3QgdXNlIHRoZSBgYEBjZXJ0LWF1dGhvcml0eScnCisgICAgIG1hcmtlciBkZXNjcmliZWQgYWJvdmUuCisKKyAgICAgVGhlIGtub3duIGhvc3RzIGZpbGUgYWxzbyBwcm92aWRlcyBhIGZhY2lsaXR5IHRvIG1hcmsga2V5cyBhcyByZXZva2VkLAorICAgICBmb3IgZXhhbXBsZSB3aGVuIGl0IGlzIGtub3duIHRoYXQgdGhlIGFzc29jaWF0ZWQgcHJpdmF0ZSBrZXkgaGFzIGJlZW4KKyAgICAgc3RvbGVuLiAgUmV2b2tlZCBrZXlzIGFyZSBzcGVjaWZpZWQgYnkgaW5jbHVkaW5nIHRoZSBgYEByZXZva2VkJycgbWFya2VyCisgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGtleSBsaW5lLCBhbmQgYXJlIG5ldmVyIGFjY2VwdGVkIGZvcgorICAgICBhdXRoZW50aWNhdGlvbiBvciBhcyBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0aWVzLCBidXQgaW5zdGVhZCB3aWxsIHByb2R1Y2UKKyAgICAgYSB3YXJuaW5nIGZyb20gc3NoKDEpIHdoZW4gdGhleSBhcmUgZW5jb3VudGVyZWQuCisKKyAgICAgSXQgaXMgcGVybWlzc2libGUgKGJ1dCBub3QgcmVjb21tZW5kZWQpIHRvIGhhdmUgc2V2ZXJhbCBsaW5lcyBvcgorICAgICBkaWZmZXJlbnQgaG9zdCBrZXlzIGZvciB0aGUgc2FtZSBuYW1lcy4gIFRoaXMgd2lsbCBpbmV2aXRhYmx5IGhhcHBlbiB3aGVuCisgICAgIHNob3J0IGZvcm1zIG9mIGhvc3QgbmFtZXMgZnJvbSBkaWZmZXJlbnQgZG9tYWlucyBhcmUgcHV0IGluIHRoZSBmaWxlLiAgSXQKKyAgICAgaXMgcG9zc2libGUgdGhhdCB0aGUgZmlsZXMgY29udGFpbiBjb25mbGljdGluZyBpbmZvcm1hdGlvbjsKKyAgICAgYXV0aGVudGljYXRpb24gaXMgYWNjZXB0ZWQgaWYgdmFsaWQgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGZyb20gZWl0aGVyCisgICAgIGZpbGUuCisKKyAgICAgTm90ZSB0aGF0IHRoZSBsaW5lcyBpbiB0aGVzZSBmaWxlcyBhcmUgdHlwaWNhbGx5IGh1bmRyZWRzIG9mIGNoYXJhY3RlcnMKKyAgICAgbG9uZywgYW5kIHlvdSBkZWZpbml0ZWx5IGRvbid0IHdhbnQgdG8gdHlwZSBpbiB0aGUgaG9zdCBrZXlzIGJ5IGhhbmQuCisgICAgIFJhdGhlciwgZ2VuZXJhdGUgdGhlbSBieSBhIHNjcmlwdCwgc3NoLWtleXNjYW4oMSkgb3IgYnkgdGFraW5nCisgICAgIC9ldGMvc3NoL3NzaF9ob3N0X2tleS5wdWIgYW5kIGFkZGluZyB0aGUgaG9zdCBuYW1lcyBhdCB0aGUgZnJvbnQuCisgICAgIHNzaC1rZXlnZW4oMSkgYWxzbyBvZmZlcnMgc29tZSBiYXNpYyBhdXRvbWF0ZWQgZWRpdGluZyBmb3IKKyAgICAgfi8uc3NoL2tub3duX2hvc3RzIGluY2x1ZGluZyByZW1vdmluZyBob3N0cyBtYXRjaGluZyBhIGhvc3QgbmFtZSBhbmQKKyAgICAgY29udmVydGluZyBhbGwgaG9zdCBuYW1lcyB0byB0aGVpciBoYXNoZWQgcmVwcmVzZW50YXRpb25zLgorCisgICAgIEFuIGV4YW1wbGUgc3NoX2tub3duX2hvc3RzIGZpbGU6CisKKyAgICAgICAgIyBDb21tZW50cyBhbGxvd2VkIGF0IHN0YXJ0IG9mIGxpbmUKKyAgICAgICAgY2xvc2VuZXQsLi4uLDE5Mi4wLjIuNTMgMTAyNCAzNyAxNTkuLi45MyBjbG9zZW5ldC5leGFtcGxlLm5ldAorICAgICAgICBjdnMuZXhhbXBsZS5uZXQsMTkyLjAuMi4xMCBzc2gtcnNhIEFBQUExMjM0Li4uLi49CisgICAgICAgICMgQSBoYXNoZWQgaG9zdG5hbWUKKyAgICAgICAgfDF8SmZLVGRCaDdyTmJYa1ZBUUNScDRPUW9QZm1JPXxVU0VDcjNTV2YxSlVQc21zNUFxZkQ1UWZ4a009IHNzaC1yc2EKKyAgICAgICAgQUFBQTEyMzQuLi4uLj0KKyAgICAgICAgIyBBIHJldm9rZWQga2V5CisgICAgICAgIEByZXZva2VkICogc3NoLXJzYSBBQUFBQjVXLi4uCisgICAgICAgICMgQSBDQSBrZXksIGFjY2VwdGVkIGZvciBhbnkgaG9zdCBpbiAqLm15ZG9tYWluLmNvbSBvciAqLm15ZG9tYWluLm9yZworICAgICAgICBAY2VydC1hdXRob3JpdHkgKi5teWRvbWFpbi5vcmcsKi5teWRvbWFpbi5jb20gc3NoLXJzYSBBQUFBQjVXLi4uCisKK0ZJTEVTCisgICAgIH4vLmh1c2hsb2dpbgorICAgICAgICAgICAgIFRoaXMgZmlsZSBpcyB1c2VkIHRvIHN1cHByZXNzIHByaW50aW5nIHRoZSBsYXN0IGxvZ2luIHRpbWUgYW5kCisgICAgICAgICAgICAgL2V0Yy9tb3RkLCBpZiBQcmludExhc3RMb2cgYW5kIFByaW50TW90ZCwgcmVzcGVjdGl2ZWx5LCBhcmUKKyAgICAgICAgICAgICBlbmFibGVkLiAgSXQgZG9lcyBub3Qgc3VwcHJlc3MgcHJpbnRpbmcgb2YgdGhlIGJhbm5lciBzcGVjaWZpZWQKKyAgICAgICAgICAgICBieSBCYW5uZXIuCisKKyAgICAgfi8ucmhvc3RzCisgICAgICAgICAgICAgVGhpcyBmaWxlIGlzIHVzZWQgZm9yIGhvc3QtYmFzZWQgYXV0aGVudGljYXRpb24gKHNlZSBzc2goMSkgZm9yCisgICAgICAgICAgICAgbW9yZSBpbmZvcm1hdGlvbikuICBPbiBzb21lIG1hY2hpbmVzIHRoaXMgZmlsZSBtYXkgbmVlZCB0byBiZQorICAgICAgICAgICAgIHdvcmxkLXJlYWRhYmxlIGlmIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgaXMgb24gYW4gTkZTCisgICAgICAgICAgICAgcGFydGl0aW9uLCBiZWNhdXNlIHNzaGQgcmVhZHMgaXQgYXMgcm9vdC4gIEFkZGl0aW9uYWxseSwgdGhpcworICAgICAgICAgICAgIGZpbGUgbXVzdCBiZSBvd25lZCBieSB0aGUgdXNlciwgYW5kIG11c3Qgbm90IGhhdmUgd3JpdGUKKyAgICAgICAgICAgICBwZXJtaXNzaW9ucyBmb3IgYW55b25lIGVsc2UuICBUaGUgcmVjb21tZW5kZWQgcGVybWlzc2lvbiBmb3IgbW9zdAorICAgICAgICAgICAgIG1hY2hpbmVzIGlzIHJlYWQvd3JpdGUgZm9yIHRoZSB1c2VyLCBhbmQgbm90IGFjY2Vzc2libGUgYnkKKyAgICAgICAgICAgICBvdGhlcnMuCisKKyAgICAgfi8uc2hvc3RzCisgICAgICAgICAgICAgVGhpcyBmaWxlIGlzIHVzZWQgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgLnJob3N0cywgYnV0IGFsbG93cworICAgICAgICAgICAgIGhvc3QtYmFzZWQgYXV0aGVudGljYXRpb24gd2l0aG91dCBwZXJtaXR0aW5nIGxvZ2luIHdpdGgKKyAgICAgICAgICAgICBybG9naW4vcnNoLgorCisgICAgIH4vLnNzaC8KKyAgICAgICAgICAgICBUaGlzIGRpcmVjdG9yeSBpcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBmb3IgYWxsIHVzZXItc3BlY2lmaWMKKyAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGFuZCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbi4gIFRoZXJlIGlzIG5vCisgICAgICAgICAgICAgZ2VuZXJhbCByZXF1aXJlbWVudCB0byBrZWVwIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhpcyBkaXJlY3RvcnkKKyAgICAgICAgICAgICBzZWNyZXQsIGJ1dCB0aGUgcmVjb21tZW5kZWQgcGVybWlzc2lvbnMgYXJlIHJlYWQvd3JpdGUvZXhlY3V0ZQorICAgICAgICAgICAgIGZvciB0aGUgdXNlciwgYW5kIG5vdCBhY2Nlc3NpYmxlIGJ5IG90aGVycy4KKworICAgICB+Ly5zc2gvYXV0aG9yaXplZF9rZXlzCisgICAgICAgICAgICAgTGlzdHMgdGhlIHB1YmxpYyBrZXlzIChEU0EvRUNEU0EvUlNBKSB0aGF0IGNhbiBiZSB1c2VkIGZvcgorICAgICAgICAgICAgIGxvZ2dpbmcgaW4gYXMgdGhpcyB1c2VyLiAgVGhlIGZvcm1hdCBvZiB0aGlzIGZpbGUgaXMgZGVzY3JpYmVkCisgICAgICAgICAgICAgYWJvdmUuICBUaGUgY29udGVudCBvZiB0aGUgZmlsZSBpcyBub3QgaGlnaGx5IHNlbnNpdGl2ZSwgYnV0IHRoZQorICAgICAgICAgICAgIHJlY29tbWVuZGVkIHBlcm1pc3Npb25zIGFyZSByZWFkL3dyaXRlIGZvciB0aGUgdXNlciwgYW5kIG5vdAorICAgICAgICAgICAgIGFjY2Vzc2libGUgYnkgb3RoZXJzLgorCisgICAgICAgICAgICAgSWYgdGhpcyBmaWxlLCB0aGUgfi8uc3NoIGRpcmVjdG9yeSwgb3IgdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeQorICAgICAgICAgICAgIGFyZSB3cml0YWJsZSBieSBvdGhlciB1c2VycywgdGhlbiB0aGUgZmlsZSBjb3VsZCBiZSBtb2RpZmllZCBvcgorICAgICAgICAgICAgIHJlcGxhY2VkIGJ5IHVuYXV0aG9yaXplZCB1c2Vycy4gIEluIHRoaXMgY2FzZSwgc3NoZCB3aWxsIG5vdAorICAgICAgICAgICAgIGFsbG93IGl0IHRvIGJlIHVzZWQgdW5sZXNzIHRoZSBTdHJpY3RNb2RlcyBvcHRpb24gaGFzIGJlZW4gc2V0IHRvCisgICAgICAgICAgICAgYGBubycnLgorCisgICAgIH4vLnNzaC9lbnZpcm9ubWVudAorICAgICAgICAgICAgIFRoaXMgZmlsZSBpcyByZWFkIGludG8gdGhlIGVudmlyb25tZW50IGF0IGxvZ2luIChpZiBpdCBleGlzdHMpLgorICAgICAgICAgICAgIEl0IGNhbiBvbmx5IGNvbnRhaW4gZW1wdHkgbGluZXMsIGNvbW1lbnQgbGluZXMgKHRoYXQgc3RhcnQgd2l0aAorICAgICAgICAgICAgIGAjJyksIGFuZCBhc3NpZ25tZW50IGxpbmVzIG9mIHRoZSBmb3JtIG5hbWU9dmFsdWUuICBUaGUgZmlsZQorICAgICAgICAgICAgIHNob3VsZCBiZSB3cml0YWJsZSBvbmx5IGJ5IHRoZSB1c2VyOyBpdCBuZWVkIG5vdCBiZSByZWFkYWJsZSBieQorICAgICAgICAgICAgIGFueW9uZSBlbHNlLiAgRW52aXJvbm1lbnQgcHJvY2Vzc2luZyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGFuZAorICAgICAgICAgICAgIGlzIGNvbnRyb2xsZWQgdmlhIHRoZSBQZXJtaXRVc2VyRW52aXJvbm1lbnQgb3B0aW9uLgorCisgICAgIH4vLnNzaC9rbm93bl9ob3N0cworICAgICAgICAgICAgIENvbnRhaW5zIGEgbGlzdCBvZiBob3N0IGtleXMgZm9yIGFsbCBob3N0cyB0aGUgdXNlciBoYXMgbG9nZ2VkCisgICAgICAgICAgICAgaW50byB0aGF0IGFyZSBub3QgYWxyZWFkeSBpbiB0aGUgc3lzdGVtd2lkZSBsaXN0IG9mIGtub3duIGhvc3QKKyAgICAgICAgICAgICBrZXlzLiAgVGhlIGZvcm1hdCBvZiB0aGlzIGZpbGUgaXMgZGVzY3JpYmVkIGFib3ZlLiAgVGhpcyBmaWxlCisgICAgICAgICAgICAgc2hvdWxkIGJlIHdyaXRhYmxlIG9ubHkgYnkgcm9vdC90aGUgb3duZXIgYW5kIGNhbiwgYnV0IG5lZWQgbm90CisgICAgICAgICAgICAgYmUsIHdvcmxkLXJlYWRhYmxlLgorCisgICAgIH4vLnNzaC9yYworICAgICAgICAgICAgIENvbnRhaW5zIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzIHRvIGJlIHJ1biBiZWZvcmUgdGhlIHVzZXIncyBob21lCisgICAgICAgICAgICAgZGlyZWN0b3J5IGJlY29tZXMgYWNjZXNzaWJsZS4gIFRoaXMgZmlsZSBzaG91bGQgYmUgd3JpdGFibGUgb25seQorICAgICAgICAgICAgIGJ5IHRoZSB1c2VyLCBhbmQgbmVlZCBub3QgYmUgcmVhZGFibGUgYnkgYW55b25lIGVsc2UuCisKKyAgICAgL2V0Yy9ob3N0cy5hbGxvdworICAgICAvZXRjL2hvc3RzLmRlbnkKKyAgICAgICAgICAgICBBY2Nlc3MgY29udHJvbHMgdGhhdCBzaG91bGQgYmUgZW5mb3JjZWQgYnkgdGNwLXdyYXBwZXJzIGFyZQorICAgICAgICAgICAgIGRlZmluZWQgaGVyZS4gIEZ1cnRoZXIgZGV0YWlscyBhcmUgZGVzY3JpYmVkIGluIGhvc3RzX2FjY2Vzcyg1KS4KKworICAgICAvZXRjL2hvc3RzLmVxdWl2CisgICAgICAgICAgICAgVGhpcyBmaWxlIGlzIGZvciBob3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uIChzZWUgc3NoKDEpKS4gIEl0CisgICAgICAgICAgICAgc2hvdWxkIG9ubHkgYmUgd3JpdGFibGUgYnkgcm9vdC4KKworICAgICAvZXRjL21vZHVsaQorICAgICAgICAgICAgIENvbnRhaW5zIERpZmZpZS1IZWxsbWFuIGdyb3VwcyB1c2VkIGZvciB0aGUgIkRpZmZpZS1IZWxsbWFuIEdyb3VwCisgICAgICAgICAgICAgRXhjaGFuZ2UiLiAgVGhlIGZpbGUgZm9ybWF0IGlzIGRlc2NyaWJlZCBpbiBtb2R1bGkoNSkuCisKKyAgICAgL2V0Yy9tb3RkCisgICAgICAgICAgICAgU2VlIG1vdGQoNSkuCisKKyAgICAgL2V0Yy9ub2xvZ2luCisgICAgICAgICAgICAgSWYgdGhpcyBmaWxlIGV4aXN0cywgc3NoZCByZWZ1c2VzIHRvIGxldCBhbnlvbmUgZXhjZXB0IHJvb3QgbG9nCisgICAgICAgICAgICAgaW4uICBUaGUgY29udGVudHMgb2YgdGhlIGZpbGUgYXJlIGRpc3BsYXllZCB0byBhbnlvbmUgdHJ5aW5nIHRvCisgICAgICAgICAgICAgbG9nIGluLCBhbmQgbm9uLXJvb3QgY29ubmVjdGlvbnMgYXJlIHJlZnVzZWQuICBUaGUgZmlsZSBzaG91bGQgYmUKKyAgICAgICAgICAgICB3b3JsZC1yZWFkYWJsZS4KKworICAgICAvZXRjL3Nob3N0cy5lcXVpdgorICAgICAgICAgICAgIFRoaXMgZmlsZSBpcyB1c2VkIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5IGFzIGhvc3RzLmVxdWl2LCBidXQKKyAgICAgICAgICAgICBhbGxvd3MgaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbiB3aXRob3V0IHBlcm1pdHRpbmcgbG9naW4gd2l0aAorICAgICAgICAgICAgIHJsb2dpbi9yc2guCisKKyAgICAgL2V0Yy9zc2gvc3NoX2hvc3Rfa2V5CisgICAgIC9ldGMvc3NoL3NzaF9ob3N0X2RzYV9rZXkKKyAgICAgL2V0Yy9zc2gvc3NoX2hvc3RfZWNkc2Ffa2V5CisgICAgIC9ldGMvc3NoL3NzaF9ob3N0X3JzYV9rZXkKKyAgICAgICAgICAgICBUaGVzZSB0aHJlZSBmaWxlcyBjb250YWluIHRoZSBwcml2YXRlIHBhcnRzIG9mIHRoZSBob3N0IGtleXMuCisgICAgICAgICAgICAgVGhlc2UgZmlsZXMgc2hvdWxkIG9ubHkgYmUgb3duZWQgYnkgcm9vdCwgcmVhZGFibGUgb25seSBieSByb290LAorICAgICAgICAgICAgIGFuZCBub3QgYWNjZXNzaWJsZSB0byBvdGhlcnMuICBOb3RlIHRoYXQgc3NoZCBkb2VzIG5vdCBzdGFydCBpZgorICAgICAgICAgICAgIHRoZXNlIGZpbGVzIGFyZSBncm91cC93b3JsZC1hY2Nlc3NpYmxlLgorCisgICAgIC9ldGMvc3NoL3NzaF9ob3N0X2tleS5wdWIKKyAgICAgL2V0Yy9zc2gvc3NoX2hvc3RfZHNhX2tleS5wdWIKKyAgICAgL2V0Yy9zc2gvc3NoX2hvc3RfZWNkc2Ffa2V5LnB1YgorICAgICAvZXRjL3NzaC9zc2hfaG9zdF9yc2Ffa2V5LnB1YgorICAgICAgICAgICAgIFRoZXNlIHRocmVlIGZpbGVzIGNvbnRhaW4gdGhlIHB1YmxpYyBwYXJ0cyBvZiB0aGUgaG9zdCBrZXlzLgorICAgICAgICAgICAgIFRoZXNlIGZpbGVzIHNob3VsZCBiZSB3b3JsZC1yZWFkYWJsZSBidXQgd3JpdGFibGUgb25seSBieSByb290LgorICAgICAgICAgICAgIFRoZWlyIGNvbnRlbnRzIHNob3VsZCBtYXRjaCB0aGUgcmVzcGVjdGl2ZSBwcml2YXRlIHBhcnRzLiAgVGhlc2UKKyAgICAgICAgICAgICBmaWxlcyBhcmUgbm90IHJlYWxseSB1c2VkIGZvciBhbnl0aGluZzsgdGhleSBhcmUgcHJvdmlkZWQgZm9yIHRoZQorICAgICAgICAgICAgIGNvbnZlbmllbmNlIG9mIHRoZSB1c2VyIHNvIHRoZWlyIGNvbnRlbnRzIGNhbiBiZSBjb3BpZWQgdG8ga25vd24KKyAgICAgICAgICAgICBob3N0cyBmaWxlcy4gIFRoZXNlIGZpbGVzIGFyZSBjcmVhdGVkIHVzaW5nIHNzaC1rZXlnZW4oMSkuCisKKyAgICAgL2V0Yy9zc2gvc3NoX2tub3duX2hvc3RzCisgICAgICAgICAgICAgU3lzdGVtd2lkZSBsaXN0IG9mIGtub3duIGhvc3Qga2V5cy4gIFRoaXMgZmlsZSBzaG91bGQgYmUgcHJlcGFyZWQKKyAgICAgICAgICAgICBieSB0aGUgc3lzdGVtIGFkbWluaXN0cmF0b3IgdG8gY29udGFpbiB0aGUgcHVibGljIGhvc3Qga2V5cyBvZgorICAgICAgICAgICAgIGFsbCBtYWNoaW5lcyBpbiB0aGUgb3JnYW5pemF0aW9uLiAgVGhlIGZvcm1hdCBvZiB0aGlzIGZpbGUgaXMKKyAgICAgICAgICAgICBkZXNjcmliZWQgYWJvdmUuICBUaGlzIGZpbGUgc2hvdWxkIGJlIHdyaXRhYmxlIG9ubHkgYnkgcm9vdC90aGUKKyAgICAgICAgICAgICBvd25lciBhbmQgc2hvdWxkIGJlIHdvcmxkLXJlYWRhYmxlLgorCisgICAgIC9ldGMvc3NoL3NzaGRfY29uZmlnCisgICAgICAgICAgICAgQ29udGFpbnMgY29uZmlndXJhdGlvbiBkYXRhIGZvciBzc2hkLiAgVGhlIGZpbGUgZm9ybWF0IGFuZAorICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgZGVzY3JpYmVkIGluIHNzaGRfY29uZmlnKDUpLgorCisgICAgIC9ldGMvc3NoL3NzaHJjCisgICAgICAgICAgICAgU2ltaWxhciB0byB+Ly5zc2gvcmMsIGl0IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgbWFjaGluZS1zcGVjaWZpYworICAgICAgICAgICAgIGxvZ2luLXRpbWUgaW5pdGlhbGl6YXRpb25zIGdsb2JhbGx5LiAgVGhpcyBmaWxlIHNob3VsZCBiZQorICAgICAgICAgICAgIHdyaXRhYmxlIG9ubHkgYnkgcm9vdCwgYW5kIHNob3VsZCBiZSB3b3JsZC1yZWFkYWJsZS4KKworICAgICAvdmFyL2VtcHR5CisgICAgICAgICAgICAgY2hyb290KDIpIGRpcmVjdG9yeSB1c2VkIGJ5IHNzaGQgZHVyaW5nIHByaXZpbGVnZSBzZXBhcmF0aW9uIGluCisgICAgICAgICAgICAgdGhlIHByZS1hdXRoZW50aWNhdGlvbiBwaGFzZS4gIFRoZSBkaXJlY3Rvcnkgc2hvdWxkIG5vdCBjb250YWluCisgICAgICAgICAgICAgYW55IGZpbGVzIGFuZCBtdXN0IGJlIG93bmVkIGJ5IHJvb3QgYW5kIG5vdCBncm91cCBvciB3b3JsZC0KKyAgICAgICAgICAgICB3cml0YWJsZS4KKworICAgICAvdmFyL3J1bi9zc2hkLnBpZAorICAgICAgICAgICAgIENvbnRhaW5zIHRoZSBwcm9jZXNzIElEIG9mIHRoZSBzc2hkIGxpc3RlbmluZyBmb3IgY29ubmVjdGlvbnMgKGlmCisgICAgICAgICAgICAgdGhlcmUgYXJlIHNldmVyYWwgZGFlbW9ucyBydW5uaW5nIGNvbmN1cnJlbnRseSBmb3IgZGlmZmVyZW50CisgICAgICAgICAgICAgcG9ydHMsIHRoaXMgY29udGFpbnMgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIG9uZSBzdGFydGVkIGxhc3QpLgorICAgICAgICAgICAgIFRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBpcyBub3Qgc2Vuc2l0aXZlOyBpdCBjYW4gYmUgd29ybGQtCisgICAgICAgICAgICAgcmVhZGFibGUuCisKK1NFRSBBTFNPCisgICAgIHNjcCgxKSwgc2Z0cCgxKSwgc3NoKDEpLCBzc2gtYWRkKDEpLCBzc2gtYWdlbnQoMSksIHNzaC1rZXlnZW4oMSksCisgICAgIHNzaC1rZXlzY2FuKDEpLCBjaHJvb3QoMiksIGhvc3RzX2FjY2Vzcyg1KSwgbG9naW4uY29uZig1KSwgbW9kdWxpKDUpLAorICAgICBzc2hkX2NvbmZpZyg1KSwgaW5ldGQoOCksIHNmdHAtc2VydmVyKDgpCisKK0FVVEhPUlMKKyAgICAgT3BlblNTSCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGFuZCBmcmVlIHNzaCAxLjIuMTIgcmVsZWFzZSBieQorICAgICBUYXR1IFlsb25lbi4gIEFhcm9uIENhbXBiZWxsLCBCb2IgQmVjaywgTWFya3VzIEZyaWVkbCwgTmllbHMgUHJvdm9zLCBUaGVvCisgICAgIGRlIFJhYWR0IGFuZCBEdWcgU29uZyByZW1vdmVkIG1hbnkgYnVncywgcmUtYWRkZWQgbmV3ZXIgZmVhdHVyZXMgYW5kCisgICAgIGNyZWF0ZWQgT3BlblNTSC4gIE1hcmt1cyBGcmllZGwgY29udHJpYnV0ZWQgdGhlIHN1cHBvcnQgZm9yIFNTSCBwcm90b2NvbAorICAgICB2ZXJzaW9ucyAxLjUgYW5kIDIuMC4gIE5pZWxzIFByb3ZvcyBhbmQgTWFya3VzIEZyaWVkbCBjb250cmlidXRlZCBzdXBwb3J0CisgICAgIGZvciBwcml2aWxlZ2Ugc2VwYXJhdGlvbi4KKworQ0FWRUFUUworICAgICBTeXN0ZW0gc2VjdXJpdHkgaXMgbm90IGltcHJvdmVkIHVubGVzcyByc2hkLCBybG9naW5kLCBhbmQgcmV4ZWNkIGFyZQorICAgICBkaXNhYmxlZCAodGh1cyBjb21wbGV0ZWx5IGRpc2FibGluZyBybG9naW4gYW5kIHJzaCBpbnRvIHRoZSBtYWNoaW5lKS4KKworT3BlbkJTRCA1LjAgICAgICAgICAgICAgICAgICAgU2VwdGVtYmVyIDIzLCAyMDExICAgICAgICAgICAgICAgICAgIE9wZW5CU0QgNS4wCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NzaGQuOCBiL29wZW5zc2gtNi4wcDEvc3NoZC44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMTAxNTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NzaGQuOApAQCAtMCwwICsxLDk4MiBAQAorLlwiCisuXCIgQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAorLlwiICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisuXCIKKy5cIiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisuXCIgY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKy5cIiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCisuXCIgaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorLlwiIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5OSwyMDAwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiIENvcHlyaWdodCAoYykgMTk5OSBBYXJvbiBDYW1wYmVsbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIgQ29weXJpZ2h0IChjKSAxOTk5IFRoZW8gZGUgUmFhZHQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisuXCIgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy5cIiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisuXCIgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisuXCIgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLlwiIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLlwiIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy5cIiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy5cIiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgJE9wZW5CU0Q6IHNzaGQuOCx2IDEuMjY0IDIwMTEvMDkvMjMgMDA6MjI6MDQgZHR1Y2tlciBFeHAgJAorLkRkICRNZG9jZGF0ZTogU2VwdGVtYmVyIDIzIDIwMTEgJAorLkR0IFNTSEQgOAorLk9zCisuU2ggTkFNRQorLk5tIHNzaGQKKy5OZCBPcGVuU1NIIFNTSCBkYWVtb24KKy5TaCBTWU5PUFNJUworLk5tIHNzaGQKKy5CayAtd29yZHMKKy5PcCBGbCA0NkRkZWlxVHQKKy5PcCBGbCBiIEFyIGJpdHMKKy5PcCBGbCBDIEFyIGNvbm5lY3Rpb25fc3BlYworLk9wIEZsIGMgQXIgaG9zdF9jZXJ0aWZpY2F0ZV9maWxlCisuT3AgRmwgZiBBciBjb25maWdfZmlsZQorLk9wIEZsIGcgQXIgbG9naW5fZ3JhY2VfdGltZQorLk9wIEZsIGggQXIgaG9zdF9rZXlfZmlsZQorLk9wIEZsIGsgQXIga2V5X2dlbl90aW1lCisuT3AgRmwgbyBBciBvcHRpb24KKy5PcCBGbCBwIEFyIHBvcnQKKy5PcCBGbCB1IEFyIGxlbgorLkVrCisuU2ggREVTQ1JJUFRJT04KKy5ObQorKE9wZW5TU0ggRGFlbW9uKSBpcyB0aGUgZGFlbW9uIHByb2dyYW0gZm9yCisuWHIgc3NoIDEgLgorVG9nZXRoZXIgdGhlc2UgcHJvZ3JhbXMgcmVwbGFjZQorLlhyIHJsb2dpbiAxCithbmQKKy5YciByc2ggMSAsCithbmQgcHJvdmlkZSBzZWN1cmUgZW5jcnlwdGVkIGNvbW11bmljYXRpb25zIGJldHdlZW4gdHdvIHVudHJ1c3RlZCBob3N0cworb3ZlciBhbiBpbnNlY3VyZSBuZXR3b3JrLgorLlBwCisuTm0KK2xpc3RlbnMgZm9yIGNvbm5lY3Rpb25zIGZyb20gY2xpZW50cy4KK0l0IGlzIG5vcm1hbGx5IHN0YXJ0ZWQgYXQgYm9vdCBmcm9tCisuUGEgL2V0Yy9yYyAuCitJdCBmb3JrcyBhIG5ldworZGFlbW9uIGZvciBlYWNoIGluY29taW5nIGNvbm5lY3Rpb24uCitUaGUgZm9ya2VkIGRhZW1vbnMgaGFuZGxlCitrZXkgZXhjaGFuZ2UsIGVuY3J5cHRpb24sIGF1dGhlbnRpY2F0aW9uLCBjb21tYW5kIGV4ZWN1dGlvbiwKK2FuZCBkYXRhIGV4Y2hhbmdlLgorLlBwCisuTm0KK2NhbiBiZSBjb25maWd1cmVkIHVzaW5nIGNvbW1hbmQtbGluZSBvcHRpb25zIG9yIGEgY29uZmlndXJhdGlvbiBmaWxlCisoYnkgZGVmYXVsdAorLlhyIHNzaGRfY29uZmlnIDUgKSA7Citjb21tYW5kLWxpbmUgb3B0aW9ucyBvdmVycmlkZSB2YWx1ZXMgc3BlY2lmaWVkIGluIHRoZQorY29uZmlndXJhdGlvbiBmaWxlLgorLk5tCityZXJlYWRzIGl0cyBjb25maWd1cmF0aW9uIGZpbGUgd2hlbiBpdCByZWNlaXZlcyBhIGhhbmd1cCBzaWduYWwsCisuRHYgU0lHSFVQICwKK2J5IGV4ZWN1dGluZyBpdHNlbGYgd2l0aCB0aGUgbmFtZSBhbmQgb3B0aW9ucyBpdCB3YXMgc3RhcnRlZCB3aXRoLCBlLmcuXCYKKy5QYSAvdXNyL3NiaW4vc3NoZCAuCisuUHAKK1RoZSBvcHRpb25zIGFyZSBhcyBmb2xsb3dzOgorLkJsIC10YWcgLXdpZHRoIERzCisuSXQgRmwgNAorRm9yY2VzCisuTm0KK3RvIHVzZSBJUHY0IGFkZHJlc3NlcyBvbmx5LgorLkl0IEZsIDYKK0ZvcmNlcworLk5tCit0byB1c2UgSVB2NiBhZGRyZXNzZXMgb25seS4KKy5JdCBGbCBiIEFyIGJpdHMKK1NwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGVwaGVtZXJhbCBwcm90b2NvbCB2ZXJzaW9uIDEKK3NlcnZlciBrZXkgKGRlZmF1bHQgMTAyNCkuCisuSXQgRmwgQyBBciBjb25uZWN0aW9uX3NwZWMKK1NwZWNpZnkgdGhlIGNvbm5lY3Rpb24gcGFyYW1ldGVycyB0byB1c2UgZm9yIHRoZQorLkZsIFQKK2V4dGVuZGVkIHRlc3QgbW9kZS4KK0lmIHByb3ZpZGVkLCBhbnkKKy5DbSBNYXRjaAorZGlyZWN0aXZlcyBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlCit0aGF0IHdvdWxkIGFwcGx5IHRvIHRoZSBzcGVjaWZpZWQgdXNlciwgaG9zdCwgYW5kIGFkZHJlc3Mgd2lsbCBiZSBzZXQgYmVmb3JlCit0aGUgY29uZmlndXJhdGlvbiBpcyB3cml0dGVuIHRvIHN0YW5kYXJkIG91dHB1dC4KK1RoZSBjb25uZWN0aW9uIHBhcmFtZXRlcnMgYXJlIHN1cHBsaWVkIGFzIGtleXdvcmQ9dmFsdWUgcGFpcnMuCitUaGUga2V5d29yZHMgYXJlCisuRHEgdXNlciAsCisuRHEgaG9zdCAsCithbmQKKy5EcSBhZGRyIC4KK0FsbCBhcmUgcmVxdWlyZWQgYW5kIG1heSBiZSBzdXBwbGllZCBpbiBhbnkgb3JkZXIsIGVpdGhlciB3aXRoIG11bHRpcGxlCisuRmwgQworb3B0aW9ucyBvciBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LgorLkl0IEZsIGMgQXIgaG9zdF9jZXJ0aWZpY2F0ZV9maWxlCitTcGVjaWZpZXMgYSBwYXRoIHRvIGEgY2VydGlmaWNhdGUgZmlsZSB0byBpZGVudGlmeQorLk5tCitkdXJpbmcga2V5IGV4Y2hhbmdlLgorVGhlIGNlcnRpZmljYXRlIGZpbGUgbXVzdCBtYXRjaCBhIGhvc3Qga2V5IGZpbGUgc3BlY2lmaWVkIHVzaW5nIHRoZQorLkZsIGgKK29wdGlvbiBvciB0aGUKKy5DbSBIb3N0S2V5Citjb25maWd1cmF0aW9uIGRpcmVjdGl2ZS4KKy5JdCBGbCBECitXaGVuIHRoaXMgb3B0aW9uIGlzIHNwZWNpZmllZCwKKy5ObQord2lsbCBub3QgZGV0YWNoIGFuZCBkb2VzIG5vdCBiZWNvbWUgYSBkYWVtb24uCitUaGlzIGFsbG93cyBlYXN5IG1vbml0b3Jpbmcgb2YKKy5ObSBzc2hkIC4KKy5JdCBGbCBkCitEZWJ1ZyBtb2RlLgorVGhlIHNlcnZlciBzZW5kcyB2ZXJib3NlIGRlYnVnIG91dHB1dCB0byBzdGFuZGFyZCBlcnJvciwKK2FuZCBkb2VzIG5vdCBwdXQgaXRzZWxmIGluIHRoZSBiYWNrZ3JvdW5kLgorVGhlIHNlcnZlciBhbHNvIHdpbGwgbm90IGZvcmsgYW5kIHdpbGwgb25seSBwcm9jZXNzIG9uZSBjb25uZWN0aW9uLgorVGhpcyBvcHRpb24gaXMgb25seSBpbnRlbmRlZCBmb3IgZGVidWdnaW5nIGZvciB0aGUgc2VydmVyLgorTXVsdGlwbGUKKy5GbCBkCitvcHRpb25zIGluY3JlYXNlIHRoZSBkZWJ1Z2dpbmcgbGV2ZWwuCitNYXhpbXVtIGlzIDMuCisuSXQgRmwgZQorV2hlbiB0aGlzIG9wdGlvbiBpcyBzcGVjaWZpZWQsCisuTm0KK3dpbGwgc2VuZCB0aGUgb3V0cHV0IHRvIHRoZSBzdGFuZGFyZCBlcnJvciBpbnN0ZWFkIG9mIHRoZSBzeXN0ZW0gbG9nLgorLkl0IEZsIGYgQXIgY29uZmlnX2ZpbGUKK1NwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorVGhlIGRlZmF1bHQgaXMKKy5QYSAvZXRjL3NzaC9zc2hkX2NvbmZpZyAuCisuTm0KK3JlZnVzZXMgdG8gc3RhcnQgaWYgdGhlcmUgaXMgbm8gY29uZmlndXJhdGlvbiBmaWxlLgorLkl0IEZsIGcgQXIgbG9naW5fZ3JhY2VfdGltZQorR2l2ZXMgdGhlIGdyYWNlIHRpbWUgZm9yIGNsaWVudHMgdG8gYXV0aGVudGljYXRlIHRoZW1zZWx2ZXMgKGRlZmF1bHQKKzEyMCBzZWNvbmRzKS4KK0lmIHRoZSBjbGllbnQgZmFpbHMgdG8gYXV0aGVudGljYXRlIHRoZSB1c2VyIHdpdGhpbgordGhpcyBtYW55IHNlY29uZHMsIHRoZSBzZXJ2ZXIgZGlzY29ubmVjdHMgYW5kIGV4aXRzLgorQSB2YWx1ZSBvZiB6ZXJvIGluZGljYXRlcyBubyBsaW1pdC4KKy5JdCBGbCBoIEFyIGhvc3Rfa2V5X2ZpbGUKK1NwZWNpZmllcyBhIGZpbGUgZnJvbSB3aGljaCBhIGhvc3Qga2V5IGlzIHJlYWQuCitUaGlzIG9wdGlvbiBtdXN0IGJlIGdpdmVuIGlmCisuTm0KK2lzIG5vdCBydW4gYXMgcm9vdCAoYXMgdGhlIG5vcm1hbAoraG9zdCBrZXkgZmlsZXMgYXJlIG5vcm1hbGx5IG5vdCByZWFkYWJsZSBieSBhbnlvbmUgYnV0IHJvb3QpLgorVGhlIGRlZmF1bHQgaXMKKy5QYSAvZXRjL3NzaC9zc2hfaG9zdF9rZXkKK2ZvciBwcm90b2NvbCB2ZXJzaW9uIDEsIGFuZAorLlBhIC9ldGMvc3NoL3NzaF9ob3N0X2RzYV9rZXkgLAorLlBhIC9ldGMvc3NoL3NzaF9ob3N0X2VjZHNhX2tleQorYW5kCisuUGEgL2V0Yy9zc2gvc3NoX2hvc3RfcnNhX2tleQorZm9yIHByb3RvY29sIHZlcnNpb24gMi4KK0l0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgaG9zdCBrZXkgZmlsZXMgZm9yCit0aGUgZGlmZmVyZW50IHByb3RvY29sIHZlcnNpb25zIGFuZCBob3N0IGtleSBhbGdvcml0aG1zLgorLkl0IEZsIGkKK1NwZWNpZmllcyB0aGF0CisuTm0KK2lzIGJlaW5nIHJ1biBmcm9tCisuWHIgaW5ldGQgOCAuCisuTm0KK2lzIG5vcm1hbGx5IG5vdCBydW4KK2Zyb20gaW5ldGQgYmVjYXVzZSBpdCBuZWVkcyB0byBnZW5lcmF0ZSB0aGUgc2VydmVyIGtleSBiZWZvcmUgaXQgY2FuCityZXNwb25kIHRvIHRoZSBjbGllbnQsIGFuZCB0aGlzIG1heSB0YWtlIHRlbnMgb2Ygc2Vjb25kcy4KK0NsaWVudHMgd291bGQgaGF2ZSB0byB3YWl0IHRvbyBsb25nIGlmIHRoZSBrZXkgd2FzIHJlZ2VuZXJhdGVkIGV2ZXJ5IHRpbWUuCitIb3dldmVyLCB3aXRoIHNtYWxsIGtleSBzaXplcyAoZS5nLiA1MTIpIHVzaW5nCisuTm0KK2Zyb20gaW5ldGQgbWF5CitiZSBmZWFzaWJsZS4KKy5JdCBGbCBrIEFyIGtleV9nZW5fdGltZQorU3BlY2lmaWVzIGhvdyBvZnRlbiB0aGUgZXBoZW1lcmFsIHByb3RvY29sIHZlcnNpb24gMSBzZXJ2ZXIga2V5IGlzCityZWdlbmVyYXRlZCAoZGVmYXVsdCAzNjAwIHNlY29uZHMsIG9yIG9uZSBob3VyKS4KK1RoZSBtb3RpdmF0aW9uIGZvciByZWdlbmVyYXRpbmcgdGhlIGtleSBmYWlybHkKK29mdGVuIGlzIHRoYXQgdGhlIGtleSBpcyBub3Qgc3RvcmVkIGFueXdoZXJlLCBhbmQgYWZ0ZXIgYWJvdXQgYW4gaG91cgoraXQgYmVjb21lcyBpbXBvc3NpYmxlIHRvIHJlY292ZXIgdGhlIGtleSBmb3IgZGVjcnlwdGluZyBpbnRlcmNlcHRlZAorY29tbXVuaWNhdGlvbnMgZXZlbiBpZiB0aGUgbWFjaGluZSBpcyBjcmFja2VkIGludG8gb3IgcGh5c2ljYWxseQorc2VpemVkLgorQSB2YWx1ZSBvZiB6ZXJvIGluZGljYXRlcyB0aGF0IHRoZSBrZXkgd2lsbCBuZXZlciBiZSByZWdlbmVyYXRlZC4KKy5JdCBGbCBvIEFyIG9wdGlvbgorQ2FuIGJlIHVzZWQgdG8gZ2l2ZSBvcHRpb25zIGluIHRoZSBmb3JtYXQgdXNlZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorVGhpcyBpcyB1c2VmdWwgZm9yIHNwZWNpZnlpbmcgb3B0aW9ucyBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gc2VwYXJhdGUKK2NvbW1hbmQtbGluZSBmbGFnLgorRm9yIGZ1bGwgZGV0YWlscyBvZiB0aGUgb3B0aW9ucywgYW5kIHRoZWlyIHZhbHVlcywgc2VlCisuWHIgc3NoZF9jb25maWcgNSAuCisuSXQgRmwgcCBBciBwb3J0CitTcGVjaWZpZXMgdGhlIHBvcnQgb24gd2hpY2ggdGhlIHNlcnZlciBsaXN0ZW5zIGZvciBjb25uZWN0aW9ucworKGRlZmF1bHQgMjIpLgorTXVsdGlwbGUgcG9ydCBvcHRpb25zIGFyZSBwZXJtaXR0ZWQuCitQb3J0cyBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB3aXRoIHRoZQorLkNtIFBvcnQKK29wdGlvbiBhcmUgaWdub3JlZCB3aGVuIGEgY29tbWFuZC1saW5lIHBvcnQgaXMgc3BlY2lmaWVkLgorUG9ydHMgc3BlY2lmaWVkIHVzaW5nIHRoZQorLkNtIExpc3RlbkFkZHJlc3MKK29wdGlvbiBvdmVycmlkZSBjb21tYW5kLWxpbmUgcG9ydHMuCisuSXQgRmwgcQorUXVpZXQgbW9kZS4KK05vdGhpbmcgaXMgc2VudCB0byB0aGUgc3lzdGVtIGxvZy4KK05vcm1hbGx5IHRoZSBiZWdpbm5pbmcsCithdXRoZW50aWNhdGlvbiwgYW5kIHRlcm1pbmF0aW9uIG9mIGVhY2ggY29ubmVjdGlvbiBpcyBsb2dnZWQuCisuSXQgRmwgVAorRXh0ZW5kZWQgdGVzdCBtb2RlLgorQ2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUsIG91dHB1dCB0aGUgZWZmZWN0aXZlIGNvbmZpZ3VyYXRpb24KK3RvIHN0ZG91dCBhbmQgdGhlbiBleGl0LgorT3B0aW9uYWxseSwKKy5DbSBNYXRjaAorcnVsZXMgbWF5IGJlIGFwcGxpZWQgYnkgc3BlY2lmeWluZyB0aGUgY29ubmVjdGlvbiBwYXJhbWV0ZXJzIHVzaW5nIG9uZSBvciBtb3JlCisuRmwgQworb3B0aW9ucy4KKy5JdCBGbCB0CitUZXN0IG1vZGUuCitPbmx5IGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGFuZCBzYW5pdHkgb2YgdGhlIGtleXMuCitUaGlzIGlzIHVzZWZ1bCBmb3IgdXBkYXRpbmcKKy5ObQorcmVsaWFibHkgYXMgY29uZmlndXJhdGlvbiBvcHRpb25zIG1heSBjaGFuZ2UuCisuSXQgRmwgdSBBciBsZW4KK1RoaXMgb3B0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgc2l6ZSBvZiB0aGUgZmllbGQKK2luIHRoZQorLkxpIHV0bXAKK3N0cnVjdHVyZSB0aGF0IGhvbGRzIHRoZSByZW1vdGUgaG9zdCBuYW1lLgorSWYgdGhlIHJlc29sdmVkIGhvc3QgbmFtZSBpcyBsb25nZXIgdGhhbgorLkFyIGxlbiAsCit0aGUgZG90dGVkIGRlY2ltYWwgdmFsdWUgd2lsbCBiZSB1c2VkIGluc3RlYWQuCitUaGlzIGFsbG93cyBob3N0cyB3aXRoIHZlcnkgbG9uZyBob3N0IG5hbWVzIHRoYXQKK292ZXJmbG93IHRoaXMgZmllbGQgdG8gc3RpbGwgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KK1NwZWNpZnlpbmcKKy5GbCB1MAoraW5kaWNhdGVzIHRoYXQgb25seSBkb3R0ZWQgZGVjaW1hbCBhZGRyZXNzZXMKK3Nob3VsZCBiZSBwdXQgaW50byB0aGUKKy5QYSB1dG1wCitmaWxlLgorLkZsIHUwCittYXkgYWxzbyBiZSB1c2VkIHRvIHByZXZlbnQKKy5ObQorZnJvbSBtYWtpbmcgRE5TIHJlcXVlc3RzIHVubGVzcyB0aGUgYXV0aGVudGljYXRpb24KK21lY2hhbmlzbSBvciBjb25maWd1cmF0aW9uIHJlcXVpcmVzIGl0LgorQXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyB0aGF0IG1heSByZXF1aXJlIEROUyBpbmNsdWRlCisuQ20gUmhvc3RzUlNBQXV0aGVudGljYXRpb24gLAorLkNtIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uICwKK2FuZCB1c2luZyBhCisuQ20gZnJvbT0icGF0dGVybi1saXN0Igorb3B0aW9uIGluIGEga2V5IGZpbGUuCitDb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCByZXF1aXJlIEROUyBpbmNsdWRlIHVzaW5nIGEKK1VTRVJASE9TVCBwYXR0ZXJuIGluCisuQ20gQWxsb3dVc2Vycworb3IKKy5DbSBEZW55VXNlcnMgLgorLkVsCisuU2ggQVVUSEVOVElDQVRJT04KK1RoZSBPcGVuU1NIIFNTSCBkYWVtb24gc3VwcG9ydHMgU1NIIHByb3RvY29scyAxIGFuZCAyLgorVGhlIGRlZmF1bHQgaXMgdG8gdXNlIHByb3RvY29sIDIgb25seSwKK3Rob3VnaCB0aGlzIGNhbiBiZSBjaGFuZ2VkIHZpYSB0aGUKKy5DbSBQcm90b2NvbAorb3B0aW9uIGluCisuWHIgc3NoZF9jb25maWcgNSAuCitQcm90b2NvbCAyIHN1cHBvcnRzIERTQSwgRUNEU0EgYW5kIFJTQSBrZXlzOworcHJvdG9jb2wgMSBvbmx5IHN1cHBvcnRzIFJTQSBrZXlzLgorRm9yIGJvdGggcHJvdG9jb2xzLAorZWFjaCBob3N0IGhhcyBhIGhvc3Qtc3BlY2lmaWMga2V5LAorbm9ybWFsbHkgMjA0OCBiaXRzLAordXNlZCB0byBpZGVudGlmeSB0aGUgaG9zdC4KKy5QcAorRm9yd2FyZCBzZWN1cml0eSBmb3IgcHJvdG9jb2wgMSBpcyBwcm92aWRlZCB0aHJvdWdoCithbiBhZGRpdGlvbmFsIHNlcnZlciBrZXksCitub3JtYWxseSA3NjggYml0cywKK2dlbmVyYXRlZCB3aGVuIHRoZSBzZXJ2ZXIgc3RhcnRzLgorVGhpcyBrZXkgaXMgbm9ybWFsbHkgcmVnZW5lcmF0ZWQgZXZlcnkgaG91ciBpZiBpdCBoYXMgYmVlbiB1c2VkLCBhbmQKK2lzIG5ldmVyIHN0b3JlZCBvbiBkaXNrLgorV2hlbmV2ZXIgYSBjbGllbnQgY29ubmVjdHMsIHRoZSBkYWVtb24gcmVzcG9uZHMgd2l0aCBpdHMgcHVibGljCitob3N0IGFuZCBzZXJ2ZXIga2V5cy4KK1RoZSBjbGllbnQgY29tcGFyZXMgdGhlCitSU0EgaG9zdCBrZXkgYWdhaW5zdCBpdHMgb3duIGRhdGFiYXNlIHRvIHZlcmlmeSB0aGF0IGl0IGhhcyBub3QgY2hhbmdlZC4KK1RoZSBjbGllbnQgdGhlbiBnZW5lcmF0ZXMgYSAyNTYtYml0IHJhbmRvbSBudW1iZXIuCitJdCBlbmNyeXB0cyB0aGlzCityYW5kb20gbnVtYmVyIHVzaW5nIGJvdGggdGhlIGhvc3Qga2V5IGFuZCB0aGUgc2VydmVyIGtleSwgYW5kIHNlbmRzCit0aGUgZW5jcnlwdGVkIG51bWJlciB0byB0aGUgc2VydmVyLgorQm90aCBzaWRlcyB0aGVuIHVzZSB0aGlzCityYW5kb20gbnVtYmVyIGFzIGEgc2Vzc2lvbiBrZXkgd2hpY2ggaXMgdXNlZCB0byBlbmNyeXB0IGFsbCBmdXJ0aGVyCitjb21tdW5pY2F0aW9ucyBpbiB0aGUgc2Vzc2lvbi4KK1RoZSByZXN0IG9mIHRoZSBzZXNzaW9uIGlzIGVuY3J5cHRlZAordXNpbmcgYSBjb252ZW50aW9uYWwgY2lwaGVyLCBjdXJyZW50bHkgQmxvd2Zpc2ggb3IgM0RFUywgd2l0aCAzREVTCitiZWluZyB1c2VkIGJ5IGRlZmF1bHQuCitUaGUgY2xpZW50IHNlbGVjdHMgdGhlIGVuY3J5cHRpb24gYWxnb3JpdGhtCit0byB1c2UgZnJvbSB0aG9zZSBvZmZlcmVkIGJ5IHRoZSBzZXJ2ZXIuCisuUHAKK0ZvciBwcm90b2NvbCAyLAorZm9yd2FyZCBzZWN1cml0eSBpcyBwcm92aWRlZCB0aHJvdWdoIGEgRGlmZmllLUhlbGxtYW4ga2V5IGFncmVlbWVudC4KK1RoaXMga2V5IGFncmVlbWVudCByZXN1bHRzIGluIGEgc2hhcmVkIHNlc3Npb24ga2V5LgorVGhlIHJlc3Qgb2YgdGhlIHNlc3Npb24gaXMgZW5jcnlwdGVkIHVzaW5nIGEgc3ltbWV0cmljIGNpcGhlciwgY3VycmVudGx5CisxMjgtYml0IEFFUywgQmxvd2Zpc2gsIDNERVMsIENBU1QxMjgsIEFyY2ZvdXIsIDE5Mi1iaXQgQUVTLCBvciAyNTYtYml0IEFFUy4KK1RoZSBjbGllbnQgc2VsZWN0cyB0aGUgZW5jcnlwdGlvbiBhbGdvcml0aG0KK3RvIHVzZSBmcm9tIHRob3NlIG9mZmVyZWQgYnkgdGhlIHNlcnZlci4KK0FkZGl0aW9uYWxseSwgc2Vzc2lvbiBpbnRlZ3JpdHkgaXMgcHJvdmlkZWQKK3Rocm91Z2ggYSBjcnlwdG9ncmFwaGljIG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZQorKGhtYWMtbWQ1LCBobWFjLXNoYTEsIHVtYWMtNjQsIGhtYWMtcmlwZW1kMTYwLAoraG1hYy1zaGEyLTI1NiBvciBobWFjLXNoYTItNTEyKS4KKy5QcAorRmluYWxseSwgdGhlIHNlcnZlciBhbmQgdGhlIGNsaWVudCBlbnRlciBhbiBhdXRoZW50aWNhdGlvbiBkaWFsb2cuCitUaGUgY2xpZW50IHRyaWVzIHRvIGF1dGhlbnRpY2F0ZSBpdHNlbGYgdXNpbmcKK2hvc3QtYmFzZWQgYXV0aGVudGljYXRpb24sCitwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uLAorY2hhbGxlbmdlLXJlc3BvbnNlIGF1dGhlbnRpY2F0aW9uLAorb3IgcGFzc3dvcmQgYXV0aGVudGljYXRpb24uCisuUHAKK1JlZ2FyZGxlc3Mgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUsIHRoZSBhY2NvdW50IGlzIGNoZWNrZWQgdG8KK2Vuc3VyZSB0aGF0IGl0IGlzIGFjY2Vzc2libGUuICBBbiBhY2NvdW50IGlzIG5vdCBhY2Nlc3NpYmxlIGlmIGl0IGlzCitsb2NrZWQsIGxpc3RlZCBpbgorLkNtIERlbnlVc2Vycworb3IgaXRzIGdyb3VwIGlzIGxpc3RlZCBpbgorLkNtIERlbnlHcm91cHMKK1wmLiAgVGhlIGRlZmluaXRpb24gb2YgYSBsb2NrZWQgYWNjb3VudCBpcyBzeXN0ZW0gZGVwZW5kYW50LiBTb21lIHBsYXRmb3JtcworaGF2ZSB0aGVpciBvd24gYWNjb3VudCBkYXRhYmFzZSAoZWcgQUlYKSBhbmQgc29tZSBtb2RpZnkgdGhlIHBhc3N3ZCBmaWVsZCAoCisuUWwgXCYqTEtcJioKK29uIFNvbGFyaXMgYW5kIFVuaXhXYXJlLAorLlFsIFwmKgorb24gSFAtVVgsIGNvbnRhaW5pbmcKKy5RbCBOb2xvZ2luCitvbiBUcnU2NCwKK2EgbGVhZGluZworLlFsIFwmKkxPQ0tFRFwmKgorb24gRnJlZUJTRCBhbmQgYSBsZWFkaW5nCisuUWwgXCYhCitvbiBtb3N0IExpbnV4ZXMpLgorSWYgdGhlcmUgaXMgYSByZXF1aXJlbWVudCB0byBkaXNhYmxlIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uCitmb3IgdGhlIGFjY291bnQgd2hpbGUgYWxsb3dpbmcgc3RpbGwgcHVibGljLWtleSwgdGhlbiB0aGUgcGFzc3dkIGZpZWxkCitzaG91bGQgYmUgc2V0IHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZXNlIHZhbHVlcyAoZWcKKy5RbCBOUAorb3IKKy5RbCBcJipOUFwmKgorKS4KKy5QcAorSWYgdGhlIGNsaWVudCBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlcyBpdHNlbGYsIGEgZGlhbG9nIGZvcgorcHJlcGFyaW5nIHRoZSBzZXNzaW9uIGlzIGVudGVyZWQuCitBdCB0aGlzIHRpbWUgdGhlIGNsaWVudCBtYXkgcmVxdWVzdAordGhpbmdzIGxpa2UgYWxsb2NhdGluZyBhIHBzZXVkby10dHksIGZvcndhcmRpbmcgWDExIGNvbm5lY3Rpb25zLAorZm9yd2FyZGluZyBUQ1AgY29ubmVjdGlvbnMsIG9yIGZvcndhcmRpbmcgdGhlIGF1dGhlbnRpY2F0aW9uIGFnZW50Citjb25uZWN0aW9uIG92ZXIgdGhlIHNlY3VyZSBjaGFubmVsLgorLlBwCitBZnRlciB0aGlzLCB0aGUgY2xpZW50IGVpdGhlciByZXF1ZXN0cyBhIHNoZWxsIG9yIGV4ZWN1dGlvbiBvZiBhIGNvbW1hbmQuCitUaGUgc2lkZXMgdGhlbiBlbnRlciBzZXNzaW9uIG1vZGUuCitJbiB0aGlzIG1vZGUsIGVpdGhlciBzaWRlIG1heSBzZW5kCitkYXRhIGF0IGFueSB0aW1lLCBhbmQgc3VjaCBkYXRhIGlzIGZvcndhcmRlZCB0by9mcm9tIHRoZSBzaGVsbCBvcgorY29tbWFuZCBvbiB0aGUgc2VydmVyIHNpZGUsIGFuZCB0aGUgdXNlciB0ZXJtaW5hbCBpbiB0aGUgY2xpZW50IHNpZGUuCisuUHAKK1doZW4gdGhlIHVzZXIgcHJvZ3JhbSB0ZXJtaW5hdGVzIGFuZCBhbGwgZm9yd2FyZGVkIFgxMSBhbmQgb3RoZXIKK2Nvbm5lY3Rpb25zIGhhdmUgYmVlbiBjbG9zZWQsIHRoZSBzZXJ2ZXIgc2VuZHMgY29tbWFuZCBleGl0IHN0YXR1cyB0bwordGhlIGNsaWVudCwgYW5kIGJvdGggc2lkZXMgZXhpdC4KKy5TaCBMT0dJTiBQUk9DRVNTCitXaGVuIGEgdXNlciBzdWNjZXNzZnVsbHkgbG9ncyBpbiwKKy5ObQorZG9lcyB0aGUgZm9sbG93aW5nOgorLkJsIC1lbnVtIC1vZmZzZXQgaW5kZW50CisuSXQKK0lmIHRoZSBsb2dpbiBpcyBvbiBhIHR0eSwgYW5kIG5vIGNvbW1hbmQgaGFzIGJlZW4gc3BlY2lmaWVkLAorcHJpbnRzIGxhc3QgbG9naW4gdGltZSBhbmQKKy5QYSAvZXRjL21vdGQKKyh1bmxlc3MgcHJldmVudGVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgb3IgYnkKKy5QYSB+Ly5odXNobG9naW4gOworc2VlIHRoZQorLlN4IEZJTEVTCitzZWN0aW9uKS4KKy5JdAorSWYgdGhlIGxvZ2luIGlzIG9uIGEgdHR5LCByZWNvcmRzIGxvZ2luIHRpbWUuCisuSXQKK0NoZWNrcworLlBhIC9ldGMvbm9sb2dpbiA7CitpZiBpdCBleGlzdHMsIHByaW50cyBjb250ZW50cyBhbmQgcXVpdHMKKyh1bmxlc3Mgcm9vdCkuCisuSXQKK0NoYW5nZXMgdG8gcnVuIHdpdGggbm9ybWFsIHVzZXIgcHJpdmlsZWdlcy4KKy5JdAorU2V0cyB1cCBiYXNpYyBlbnZpcm9ubWVudC4KKy5JdAorUmVhZHMgdGhlIGZpbGUKKy5QYSB+Ly5zc2gvZW52aXJvbm1lbnQgLAoraWYgaXQgZXhpc3RzLCBhbmQgdXNlcnMgYXJlIGFsbG93ZWQgdG8gY2hhbmdlIHRoZWlyIGVudmlyb25tZW50LgorU2VlIHRoZQorLkNtIFBlcm1pdFVzZXJFbnZpcm9ubWVudAorb3B0aW9uIGluCisuWHIgc3NoZF9jb25maWcgNSAuCisuSXQKK0NoYW5nZXMgdG8gdXNlcidzIGhvbWUgZGlyZWN0b3J5LgorLkl0CitJZgorLlBhIH4vLnNzaC9yYworZXhpc3RzLCBydW5zIGl0OyBlbHNlIGlmCisuUGEgL2V0Yy9zc2gvc3NocmMKK2V4aXN0cywgcnVucworaXQ7IG90aGVyd2lzZSBydW5zIHhhdXRoLgorVGhlCisuRHEgcmMKK2ZpbGVzIGFyZSBnaXZlbiB0aGUgWDExCithdXRoZW50aWNhdGlvbiBwcm90b2NvbCBhbmQgY29va2llIGluIHN0YW5kYXJkIGlucHV0LgorU2VlCisuU3ggU1NIUkMgLAorYmVsb3cuCisuSXQKK1J1bnMgdXNlcidzIHNoZWxsIG9yIGNvbW1hbmQuCisuRWwKKy5TaCBTU0hSQworSWYgdGhlIGZpbGUKKy5QYSB+Ly5zc2gvcmMKK2V4aXN0cywKKy5YciBzaCAxCitydW5zIGl0IGFmdGVyIHJlYWRpbmcgdGhlCitlbnZpcm9ubWVudCBmaWxlcyBidXQgYmVmb3JlIHN0YXJ0aW5nIHRoZSB1c2VyJ3Mgc2hlbGwgb3IgY29tbWFuZC4KK0l0IG11c3Qgbm90IHByb2R1Y2UgYW55IG91dHB1dCBvbiBzdGRvdXQ7IHN0ZGVyciBtdXN0IGJlIHVzZWQKK2luc3RlYWQuCitJZiBYMTEgZm9yd2FyZGluZyBpcyBpbiB1c2UsIGl0IHdpbGwgcmVjZWl2ZSB0aGUgInByb3RvIGNvb2tpZSIgcGFpciBpbgoraXRzIHN0YW5kYXJkIGlucHV0IChhbmQKKy5FdiBESVNQTEFZCitpbiBpdHMgZW52aXJvbm1lbnQpLgorVGhlIHNjcmlwdCBtdXN0IGNhbGwKKy5YciB4YXV0aCAxCitiZWNhdXNlCisuTm0KK3dpbGwgbm90IHJ1biB4YXV0aCBhdXRvbWF0aWNhbGx5IHRvIGFkZCBYMTEgY29va2llcy4KKy5QcAorVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzIGZpbGUgaXMgdG8gcnVuIGFueSBpbml0aWFsaXphdGlvbiByb3V0aW5lcword2hpY2ggbWF5IGJlIG5lZWRlZCBiZWZvcmUgdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSBiZWNvbWVzCithY2Nlc3NpYmxlOyBBRlMgaXMgYSBwYXJ0aWN1bGFyIGV4YW1wbGUgb2Ygc3VjaCBhbiBlbnZpcm9ubWVudC4KKy5QcAorVGhpcyBmaWxlIHdpbGwgcHJvYmFibHkgY29udGFpbiBzb21lIGluaXRpYWxpemF0aW9uIGNvZGUgZm9sbG93ZWQgYnkKK3NvbWV0aGluZyBzaW1pbGFyIHRvOgorLkJkIC1saXRlcmFsIC1vZmZzZXQgM24KK2lmIHJlYWQgcHJvdG8gY29va2llICYmIFsgLW4gIiRESVNQTEFZIiBdOyB0aGVuCisJaWYgWyBgZWNobyAkRElTUExBWSB8IGN1dCAtYzEtMTBgID0gJ2xvY2FsaG9zdDonIF07IHRoZW4KKwkJIyBYMTFVc2VMb2NhbGhvc3Q9eWVzCisJCWVjaG8gYWRkIHVuaXg6YGVjaG8gJERJU1BMQVkgfAorCQkgICAgY3V0IC1jMTEtYCAkcHJvdG8gJGNvb2tpZQorCWVsc2UKKwkJIyBYMTFVc2VMb2NhbGhvc3Q9bm8KKwkJZWNobyBhZGQgJERJU1BMQVkgJHByb3RvICRjb29raWUKKwlmaSB8IHhhdXRoIC1xIC0KK2ZpCisuRWQKKy5QcAorSWYgdGhpcyBmaWxlIGRvZXMgbm90IGV4aXN0LAorLlBhIC9ldGMvc3NoL3NzaHJjCitpcyBydW4sIGFuZCBpZiB0aGF0Citkb2VzIG5vdCBleGlzdCBlaXRoZXIsIHhhdXRoIGlzIHVzZWQgdG8gYWRkIHRoZSBjb29raWUuCisuU2ggQVVUSE9SSVpFRF9LRVlTIEZJTEUgRk9STUFUCisuQ20gQXV0aG9yaXplZEtleXNGaWxlCitzcGVjaWZpZXMgdGhlIGZpbGVzIGNvbnRhaW5pbmcgcHVibGljIGtleXMgZm9yCitwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uOworaWYgbm9uZSBpcyBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGlzCisuUGEgfi8uc3NoL2F1dGhvcml6ZWRfa2V5cworYW5kCisuUGEgfi8uc3NoL2F1dGhvcml6ZWRfa2V5czIgLgorRWFjaCBsaW5lIG9mIHRoZSBmaWxlIGNvbnRhaW5zIG9uZQora2V5IChlbXB0eSBsaW5lcyBhbmQgbGluZXMgc3RhcnRpbmcgd2l0aCBhCisuUWwgIworYXJlIGlnbm9yZWQgYXMKK2NvbW1lbnRzKS4KK1Byb3RvY29sIDEgcHVibGljIGtleXMgY29uc2lzdCBvZiB0aGUgZm9sbG93aW5nIHNwYWNlLXNlcGFyYXRlZCBmaWVsZHM6CitvcHRpb25zLCBiaXRzLCBleHBvbmVudCwgbW9kdWx1cywgY29tbWVudC4KK1Byb3RvY29sIDIgcHVibGljIGtleSBjb25zaXN0IG9mOgorb3B0aW9ucywga2V5dHlwZSwgYmFzZTY0LWVuY29kZWQga2V5LCBjb21tZW50LgorVGhlIG9wdGlvbnMgZmllbGQgaXMgb3B0aW9uYWw7CitpdHMgcHJlc2VuY2UgaXMgZGV0ZXJtaW5lZCBieSB3aGV0aGVyIHRoZSBsaW5lIHN0YXJ0cword2l0aCBhIG51bWJlciBvciBub3QgKHRoZSBvcHRpb25zIGZpZWxkIG5ldmVyIHN0YXJ0cyB3aXRoIGEgbnVtYmVyKS4KK1RoZSBiaXRzLCBleHBvbmVudCwgbW9kdWx1cywgYW5kIGNvbW1lbnQgZmllbGRzIGdpdmUgdGhlIFJTQSBrZXkgZm9yCitwcm90b2NvbCB2ZXJzaW9uIDE7IHRoZQorY29tbWVudCBmaWVsZCBpcyBub3QgdXNlZCBmb3IgYW55dGhpbmcgKGJ1dCBtYXkgYmUgY29udmVuaWVudCBmb3IgdGhlCit1c2VyIHRvIGlkZW50aWZ5IHRoZSBrZXkpLgorRm9yIHByb3RvY29sIHZlcnNpb24gMiB0aGUga2V5dHlwZSBpcworLkRxIGVjZHNhLXNoYTItbmlzdHAyNTYgLAorLkRxIGVjZHNhLXNoYTItbmlzdHAzODQgLAorLkRxIGVjZHNhLXNoYTItbmlzdHA1MjEgLAorLkRxIHNzaC1kc3MKK29yCisuRHEgc3NoLXJzYSAuCisuUHAKK05vdGUgdGhhdCBsaW5lcyBpbiB0aGlzIGZpbGUgYXJlIHVzdWFsbHkgc2V2ZXJhbCBodW5kcmVkIGJ5dGVzIGxvbmcKKyhiZWNhdXNlIG9mIHRoZSBzaXplIG9mIHRoZSBwdWJsaWMga2V5IGVuY29kaW5nKSB1cCB0byBhIGxpbWl0IG9mCis4IGtpbG9ieXRlcywgd2hpY2ggcGVybWl0cyBEU0Ega2V5cyB1cCB0byA4IGtpbG9iaXRzIGFuZCBSU0EKK2tleXMgdXAgdG8gMTYga2lsb2JpdHMuCitZb3UgZG9uJ3Qgd2FudCB0byB0eXBlIHRoZW0gaW47IGluc3RlYWQsIGNvcHkgdGhlCisuUGEgaWRlbnRpdHkucHViICwKKy5QYSBpZF9kc2EucHViICwKKy5QYSBpZF9lY2RzYS5wdWIgLAorb3IgdGhlCisuUGEgaWRfcnNhLnB1YgorZmlsZSBhbmQgZWRpdCBpdC4KKy5QcAorLk5tCitlbmZvcmNlcyBhIG1pbmltdW0gUlNBIGtleSBtb2R1bHVzIHNpemUgZm9yIHByb3RvY29sIDEKK2FuZCBwcm90b2NvbCAyIGtleXMgb2YgNzY4IGJpdHMuCisuUHAKK1RoZSBvcHRpb25zIChpZiBwcmVzZW50KSBjb25zaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCBvcHRpb24KK3NwZWNpZmljYXRpb25zLgorTm8gc3BhY2VzIGFyZSBwZXJtaXR0ZWQsIGV4Y2VwdCB3aXRoaW4gZG91YmxlIHF1b3Rlcy4KK1RoZSBmb2xsb3dpbmcgb3B0aW9uIHNwZWNpZmljYXRpb25zIGFyZSBzdXBwb3J0ZWQgKG5vdGUKK3RoYXQgb3B0aW9uIGtleXdvcmRzIGFyZSBjYXNlLWluc2Vuc2l0aXZlKToKKy5CbCAtdGFnIC13aWR0aCBEcworLkl0IENtIGNlcnQtYXV0aG9yaXR5CitTcGVjaWZpZXMgdGhhdCB0aGUgbGlzdGVkIGtleSBpcyBhIGNlcnRpZmljYXRpb24gYXV0aG9yaXR5IChDQSkgdGhhdCBpcwordHJ1c3RlZCB0byB2YWxpZGF0ZSBzaWduZWQgY2VydGlmaWNhdGVzIGZvciB1c2VyIGF1dGhlbnRpY2F0aW9uLgorLlBwCitDZXJ0aWZpY2F0ZXMgbWF5IGVuY29kZSBhY2Nlc3MgcmVzdHJpY3Rpb25zIHNpbWlsYXIgdG8gdGhlc2Uga2V5IG9wdGlvbnMuCitJZiBib3RoIGNlcnRpZmljYXRlIHJlc3RyaWN0aW9ucyBhbmQga2V5IG9wdGlvbnMgYXJlIHByZXNlbnQsIHRoZSBtb3N0CityZXN0cmljdGl2ZSB1bmlvbiBvZiB0aGUgdHdvIGlzIGFwcGxpZWQuCisuSXQgQ20gY29tbWFuZD0iY29tbWFuZCIKK1NwZWNpZmllcyB0aGF0IHRoZSBjb21tYW5kIGlzIGV4ZWN1dGVkIHdoZW5ldmVyIHRoaXMga2V5IGlzIHVzZWQgZm9yCithdXRoZW50aWNhdGlvbi4KK1RoZSBjb21tYW5kIHN1cHBsaWVkIGJ5IHRoZSB1c2VyIChpZiBhbnkpIGlzIGlnbm9yZWQuCitUaGUgY29tbWFuZCBpcyBydW4gb24gYSBwdHkgaWYgdGhlIGNsaWVudCByZXF1ZXN0cyBhIHB0eTsKK290aGVyd2lzZSBpdCBpcyBydW4gd2l0aG91dCBhIHR0eS4KK0lmIGFuIDgtYml0IGNsZWFuIGNoYW5uZWwgaXMgcmVxdWlyZWQsCitvbmUgbXVzdCBub3QgcmVxdWVzdCBhIHB0eSBvciBzaG91bGQgc3BlY2lmeQorLkNtIG5vLXB0eSAuCitBIHF1b3RlIG1heSBiZSBpbmNsdWRlZCBpbiB0aGUgY29tbWFuZCBieSBxdW90aW5nIGl0IHdpdGggYSBiYWNrc2xhc2guCitUaGlzIG9wdGlvbiBtaWdodCBiZSB1c2VmdWwKK3RvIHJlc3RyaWN0IGNlcnRhaW4gcHVibGljIGtleXMgdG8gcGVyZm9ybSBqdXN0IGEgc3BlY2lmaWMgb3BlcmF0aW9uLgorQW4gZXhhbXBsZSBtaWdodCBiZSBhIGtleSB0aGF0IHBlcm1pdHMgcmVtb3RlIGJhY2t1cHMgYnV0IG5vdGhpbmcgZWxzZS4KK05vdGUgdGhhdCB0aGUgY2xpZW50IG1heSBzcGVjaWZ5IFRDUCBhbmQvb3IgWDExCitmb3J3YXJkaW5nIHVubGVzcyB0aGV5IGFyZSBleHBsaWNpdGx5IHByb2hpYml0ZWQuCitUaGUgY29tbWFuZCBvcmlnaW5hbGx5IHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQgaXMgYXZhaWxhYmxlIGluIHRoZQorLkV2IFNTSF9PUklHSU5BTF9DT01NQU5ECitlbnZpcm9ubWVudCB2YXJpYWJsZS4KK05vdGUgdGhhdCB0aGlzIG9wdGlvbiBhcHBsaWVzIHRvIHNoZWxsLCBjb21tYW5kIG9yIHN1YnN5c3RlbSBleGVjdXRpb24uCitBbHNvIG5vdGUgdGhhdCB0aGlzIGNvbW1hbmQgbWF5IGJlIHN1cGVyc2VkZWQgYnkgZWl0aGVyIGEKKy5YciBzc2hkX2NvbmZpZyA1CisuQ20gRm9yY2VDb21tYW5kCitkaXJlY3RpdmUgb3IgYSBjb21tYW5kIGVtYmVkZGVkIGluIGEgY2VydGlmaWNhdGUuCisuSXQgQ20gZW52aXJvbm1lbnQ9Ik5BTUU9dmFsdWUiCitTcGVjaWZpZXMgdGhhdCB0aGUgc3RyaW5nIGlzIHRvIGJlIGFkZGVkIHRvIHRoZSBlbnZpcm9ubWVudCB3aGVuCitsb2dnaW5nIGluIHVzaW5nIHRoaXMga2V5LgorRW52aXJvbm1lbnQgdmFyaWFibGVzIHNldCB0aGlzIHdheQorb3ZlcnJpZGUgb3RoZXIgZGVmYXVsdCBlbnZpcm9ubWVudCB2YWx1ZXMuCitNdWx0aXBsZSBvcHRpb25zIG9mIHRoaXMgdHlwZSBhcmUgcGVybWl0dGVkLgorRW52aXJvbm1lbnQgcHJvY2Vzc2luZyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGFuZCBpcworY29udHJvbGxlZCB2aWEgdGhlCisuQ20gUGVybWl0VXNlckVudmlyb25tZW50CitvcHRpb24uCitUaGlzIG9wdGlvbiBpcyBhdXRvbWF0aWNhbGx5IGRpc2FibGVkIGlmCisuQ20gVXNlTG9naW4KK2lzIGVuYWJsZWQuCisuSXQgQ20gZnJvbT0icGF0dGVybi1saXN0IgorU3BlY2lmaWVzIHRoYXQgaW4gYWRkaXRpb24gdG8gcHVibGljIGtleSBhdXRoZW50aWNhdGlvbiwgZWl0aGVyIHRoZSBjYW5vbmljYWwKK25hbWUgb2YgdGhlIHJlbW90ZSBob3N0IG9yIGl0cyBJUCBhZGRyZXNzIG11c3QgYmUgcHJlc2VudCBpbiB0aGUKK2NvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zLgorU2VlCisuU3ggUEFUVEVSTlMKK2luCisuWHIgc3NoX2NvbmZpZyA1Citmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwYXR0ZXJucy4KKy5QcAorSW4gYWRkaXRpb24gdG8gdGhlIHdpbGRjYXJkIG1hdGNoaW5nIHRoYXQgbWF5IGJlIGFwcGxpZWQgdG8gaG9zdG5hbWVzIG9yCithZGRyZXNzZXMsIGEKKy5DbSBmcm9tCitzdGFuemEgbWF5IG1hdGNoIElQIGFkZHJlc3NlcyB1c2luZyBDSURSIGFkZHJlc3MvbWFza2xlbiBub3RhdGlvbi4KKy5QcAorVGhlIHB1cnBvc2Ugb2YgdGhpcyBvcHRpb24gaXMgdG8gb3B0aW9uYWxseSBpbmNyZWFzZSBzZWN1cml0eTogcHVibGljIGtleQorYXV0aGVudGljYXRpb24gYnkgaXRzZWxmIGRvZXMgbm90IHRydXN0IHRoZSBuZXR3b3JrIG9yIG5hbWUgc2VydmVycyBvcgorYW55dGhpbmcgKGJ1dCB0aGUga2V5KTsgaG93ZXZlciwgaWYgc29tZWJvZHkgc29tZWhvdyBzdGVhbHMgdGhlIGtleSwgdGhlIGtleQorcGVybWl0cyBhbiBpbnRydWRlciB0byBsb2cgaW4gZnJvbSBhbnl3aGVyZSBpbiB0aGUgd29ybGQuCitUaGlzIGFkZGl0aW9uYWwgb3B0aW9uIG1ha2VzIHVzaW5nIGEgc3RvbGVuIGtleSBtb3JlIGRpZmZpY3VsdCAobmFtZQorc2VydmVycyBhbmQvb3Igcm91dGVycyB3b3VsZCBoYXZlIHRvIGJlIGNvbXByb21pc2VkIGluIGFkZGl0aW9uIHRvCitqdXN0IHRoZSBrZXkpLgorLkl0IENtIG5vLWFnZW50LWZvcndhcmRpbmcKK0ZvcmJpZHMgYXV0aGVudGljYXRpb24gYWdlbnQgZm9yd2FyZGluZyB3aGVuIHRoaXMga2V5IGlzIHVzZWQgZm9yCithdXRoZW50aWNhdGlvbi4KKy5JdCBDbSBuby1wb3J0LWZvcndhcmRpbmcKK0ZvcmJpZHMgVENQIGZvcndhcmRpbmcgd2hlbiB0aGlzIGtleSBpcyB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi4KK0FueSBwb3J0IGZvcndhcmQgcmVxdWVzdHMgYnkgdGhlIGNsaWVudCB3aWxsIHJldHVybiBhbiBlcnJvci4KK1RoaXMgbWlnaHQgYmUgdXNlZCwgZS5nLiBpbiBjb25uZWN0aW9uIHdpdGggdGhlCisuQ20gY29tbWFuZAorb3B0aW9uLgorLkl0IENtIG5vLXB0eQorUHJldmVudHMgdHR5IGFsbG9jYXRpb24gKGEgcmVxdWVzdCB0byBhbGxvY2F0ZSBhIHB0eSB3aWxsIGZhaWwpLgorLkl0IENtIG5vLXVzZXItcmMKK0Rpc2FibGVzIGV4ZWN1dGlvbiBvZgorLlBhIH4vLnNzaC9yYyAuCisuSXQgQ20gbm8tWDExLWZvcndhcmRpbmcKK0ZvcmJpZHMgWDExIGZvcndhcmRpbmcgd2hlbiB0aGlzIGtleSBpcyB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi4KK0FueSBYMTEgZm9yd2FyZCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLgorLkl0IENtIHBlcm1pdG9wZW49Imhvc3Q6cG9ydCIKK0xpbWl0IGxvY2FsCisuTGkgYGBzc2ggLUwnJworcG9ydCBmb3J3YXJkaW5nIHN1Y2ggdGhhdCBpdCBtYXkgb25seSBjb25uZWN0IHRvIHRoZSBzcGVjaWZpZWQgaG9zdCBhbmQKK3BvcnQuCitJUHY2IGFkZHJlc3NlcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IGVuY2xvc2luZyB0aGUgYWRkcmVzcyBpbiBzcXVhcmUgYnJhY2tldHMuCitNdWx0aXBsZQorLkNtIHBlcm1pdG9wZW4KK29wdGlvbnMgbWF5IGJlIGFwcGxpZWQgc2VwYXJhdGVkIGJ5IGNvbW1hcy4KK05vIHBhdHRlcm4gbWF0Y2hpbmcgaXMgcGVyZm9ybWVkIG9uIHRoZSBzcGVjaWZpZWQgaG9zdG5hbWVzLAordGhleSBtdXN0IGJlIGxpdGVyYWwgZG9tYWlucyBvciBhZGRyZXNzZXMuCitBIHBvcnQgc3BlY2lmaWNhdGlvbiBvZgorLkNtICoKK21hdGNoZXMgYW55IHBvcnQuCisuSXQgQ20gcHJpbmNpcGFscz0icHJpbmNpcGFscyIKK09uIGEKKy5DbSBjZXJ0LWF1dGhvcml0eQorbGluZSwgc3BlY2lmaWVzIGFsbG93ZWQgcHJpbmNpcGFscyBmb3IgY2VydGlmaWNhdGUgYXV0aGVudGljYXRpb24gYXMgYQorY29tbWEtc2VwYXJhdGVkIGxpc3QuCitBdCBsZWFzdCBvbmUgbmFtZSBmcm9tIHRoZSBsaXN0IG11c3QgYXBwZWFyIGluIHRoZSBjZXJ0aWZpY2F0ZSdzCitsaXN0IG9mIHByaW5jaXBhbHMgZm9yIHRoZSBjZXJ0aWZpY2F0ZSB0byBiZSBhY2NlcHRlZC4KK1RoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIGtleXMgdGhhdCBhcmUgbm90IG1hcmtlZCBhcyB0cnVzdGVkIGNlcnRpZmljYXRlCitzaWduZXJzIHVzaW5nIHRoZQorLkNtIGNlcnQtYXV0aG9yaXR5CitvcHRpb24uCisuSXQgQ20gdHVubmVsPSJuIgorRm9yY2UgYQorLlhyIHR1biA0CitkZXZpY2Ugb24gdGhlIHNlcnZlci4KK1dpdGhvdXQgdGhpcyBvcHRpb24sIHRoZSBuZXh0IGF2YWlsYWJsZSBkZXZpY2Ugd2lsbCBiZSB1c2VkIGlmCit0aGUgY2xpZW50IHJlcXVlc3RzIGEgdHVubmVsLgorLkVsCisuUHAKK0FuIGV4YW1wbGUgYXV0aG9yaXplZF9rZXlzIGZpbGU6CisuQmQgLWxpdGVyYWwgLW9mZnNldCAzbgorIyBDb21tZW50cyBhbGxvd2VkIGF0IHN0YXJ0IG9mIGxpbmUKK3NzaC1yc2EgQUFBQUIzTnphLi4uTGlQaz09IHVzZXJAZXhhbXBsZS5uZXQKK2Zyb209Iiouc2FsZXMuZXhhbXBsZS5uZXQsIXBjLnNhbGVzLmV4YW1wbGUubmV0IiBzc2gtcnNhCitBQUFBQjIuLi4xOVE9PSBqb2huQGV4YW1wbGUubmV0Citjb21tYW5kPSJkdW1wIC9ob21lIixuby1wdHksbm8tcG9ydC1mb3J3YXJkaW5nIHNzaC1kc3MKK0FBQUFDMy4uLjUxUj09IGV4YW1wbGUubmV0CitwZXJtaXRvcGVuPSIxOTIuMC4yLjE6ODAiLHBlcm1pdG9wZW49IjE5Mi4wLjIuMjoyNSIgc3NoLWRzcworQUFBQUI1Li4uMjFTPT0KK3R1bm5lbD0iMCIsY29tbWFuZD0ic2ggL2V0Yy9uZXRzdGFydCB0dW4wIiBzc2gtcnNhIEFBQUEuLi49PQoramFuZUBleGFtcGxlLm5ldAorLkVkCisuU2ggU1NIX0tOT1dOX0hPU1RTIEZJTEUgRk9STUFUCitUaGUKKy5QYSAvZXRjL3NzaC9zc2hfa25vd25faG9zdHMKK2FuZAorLlBhIH4vLnNzaC9rbm93bl9ob3N0cworZmlsZXMgY29udGFpbiBob3N0IHB1YmxpYyBrZXlzIGZvciBhbGwga25vd24gaG9zdHMuCitUaGUgZ2xvYmFsIGZpbGUgc2hvdWxkCitiZSBwcmVwYXJlZCBieSB0aGUgYWRtaW5pc3RyYXRvciAob3B0aW9uYWwpLCBhbmQgdGhlIHBlci11c2VyIGZpbGUgaXMKK21haW50YWluZWQgYXV0b21hdGljYWxseTogd2hlbmV2ZXIgdGhlIHVzZXIgY29ubmVjdHMgZnJvbSBhbiB1bmtub3duIGhvc3QsCitpdHMga2V5IGlzIGFkZGVkIHRvIHRoZSBwZXItdXNlciBmaWxlLgorLlBwCitFYWNoIGxpbmUgaW4gdGhlc2UgZmlsZXMgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHM6IG1hcmtlcnMgKG9wdGlvbmFsKSwKK2hvc3RuYW1lcywgYml0cywgZXhwb25lbnQsIG1vZHVsdXMsIGNvbW1lbnQuCitUaGUgZmllbGRzIGFyZSBzZXBhcmF0ZWQgYnkgc3BhY2VzLgorLlBwCitUaGUgbWFya2VyIGlzIG9wdGlvbmFsLCBidXQgaWYgaXQgaXMgcHJlc2VudCB0aGVuIGl0IG11c3QgYmUgb25lIG9mCisuRHEgQGNlcnQtYXV0aG9yaXR5ICwKK3RvIGluZGljYXRlIHRoYXQgdGhlIGxpbmUgY29udGFpbnMgYSBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eSAoQ0EpIGtleSwKK29yCisuRHEgQHJldm9rZWQgLAordG8gaW5kaWNhdGUgdGhhdCB0aGUga2V5IGNvbnRhaW5lZCBvbiB0aGUgbGluZSBpcyByZXZva2VkIGFuZCBtdXN0IG5vdCBldmVyCitiZSBhY2NlcHRlZC4KK09ubHkgb25lIG1hcmtlciBzaG91bGQgYmUgdXNlZCBvbiBhIGtleSBsaW5lLgorLlBwCitIb3N0bmFtZXMgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucworLlBmICggUWwgKgorYW5kCisuUWwgXCY/CithY3QgYXMKK3dpbGRjYXJkcyk7IGVhY2ggcGF0dGVybiBpbiB0dXJuIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgY2Fub25pY2FsIGhvc3QKK25hbWUgKHdoZW4gYXV0aGVudGljYXRpbmcgYSBjbGllbnQpIG9yIGFnYWluc3QgdGhlIHVzZXItc3VwcGxpZWQKK25hbWUgKHdoZW4gYXV0aGVudGljYXRpbmcgYSBzZXJ2ZXIpLgorQSBwYXR0ZXJuIG1heSBhbHNvIGJlIHByZWNlZGVkIGJ5CisuUWwgXCYhCit0byBpbmRpY2F0ZSBuZWdhdGlvbjogaWYgdGhlIGhvc3QgbmFtZSBtYXRjaGVzIGEgbmVnYXRlZAorcGF0dGVybiwgaXQgaXMgbm90IGFjY2VwdGVkIChieSB0aGF0IGxpbmUpIGV2ZW4gaWYgaXQgbWF0Y2hlZCBhbm90aGVyCitwYXR0ZXJuIG9uIHRoZSBsaW5lLgorQSBob3N0bmFtZSBvciBhZGRyZXNzIG1heSBvcHRpb25hbGx5IGJlIGVuY2xvc2VkIHdpdGhpbgorLlFsIFwmWworYW5kCisuUWwgXCZdCiticmFja2V0cyB0aGVuIGZvbGxvd2VkIGJ5CisuUWwgXCY6CithbmQgYSBub24tc3RhbmRhcmQgcG9ydCBudW1iZXIuCisuUHAKK0FsdGVybmF0ZWx5LCBob3N0bmFtZXMgbWF5IGJlIHN0b3JlZCBpbiBhIGhhc2hlZCBmb3JtIHdoaWNoIGhpZGVzIGhvc3QgbmFtZXMKK2FuZCBhZGRyZXNzZXMgc2hvdWxkIHRoZSBmaWxlJ3MgY29udGVudHMgYmUgZGlzY2xvc2VkLgorSGFzaGVkIGhvc3RuYW1lcyBzdGFydCB3aXRoIGEKKy5RbCB8CitjaGFyYWN0ZXIuCitPbmx5IG9uZSBoYXNoZWQgaG9zdG5hbWUgbWF5IGFwcGVhciBvbiBhIHNpbmdsZSBsaW5lIGFuZCBub25lIG9mIHRoZSBhYm92ZQorbmVnYXRpb24gb3Igd2lsZGNhcmQgb3BlcmF0b3JzIG1heSBiZSBhcHBsaWVkLgorLlBwCitCaXRzLCBleHBvbmVudCwgYW5kIG1vZHVsdXMgYXJlIHRha2VuIGRpcmVjdGx5IGZyb20gdGhlIFJTQSBob3N0IGtleTsgdGhleQorY2FuIGJlIG9idGFpbmVkLCBmb3IgZXhhbXBsZSwgZnJvbQorLlBhIC9ldGMvc3NoL3NzaF9ob3N0X2tleS5wdWIgLgorVGhlIG9wdGlvbmFsIGNvbW1lbnQgZmllbGQgY29udGludWVzIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUsIGFuZCBpcyBub3QgdXNlZC4KKy5QcAorTGluZXMgc3RhcnRpbmcgd2l0aAorLlFsICMKK2FuZCBlbXB0eSBsaW5lcyBhcmUgaWdub3JlZCBhcyBjb21tZW50cy4KKy5QcAorV2hlbiBwZXJmb3JtaW5nIGhvc3QgYXV0aGVudGljYXRpb24sIGF1dGhlbnRpY2F0aW9uIGlzIGFjY2VwdGVkIGlmIGFueQorbWF0Y2hpbmcgbGluZSBoYXMgdGhlIHByb3BlciBrZXk7IGVpdGhlciBvbmUgdGhhdCBtYXRjaGVzIGV4YWN0bHkgb3IsCitpZiB0aGUgc2VydmVyIGhhcyBwcmVzZW50ZWQgYSBjZXJ0aWZpY2F0ZSBmb3IgYXV0aGVudGljYXRpb24sIHRoZSBrZXkKK29mIHRoZSBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eSB0aGF0IHNpZ25lZCB0aGUgY2VydGlmaWNhdGUuCitGb3IgYSBrZXkgdG8gYmUgdHJ1c3RlZCBhcyBhIGNlcnRpZmljYXRpb24gYXV0aG9yaXR5LCBpdCBtdXN0IHVzZSB0aGUKKy5EcSBAY2VydC1hdXRob3JpdHkKK21hcmtlciBkZXNjcmliZWQgYWJvdmUuCisuUHAKK1RoZSBrbm93biBob3N0cyBmaWxlIGFsc28gcHJvdmlkZXMgYSBmYWNpbGl0eSB0byBtYXJrIGtleXMgYXMgcmV2b2tlZCwKK2ZvciBleGFtcGxlIHdoZW4gaXQgaXMga25vd24gdGhhdCB0aGUgYXNzb2NpYXRlZCBwcml2YXRlIGtleSBoYXMgYmVlbgorc3RvbGVuLgorUmV2b2tlZCBrZXlzIGFyZSBzcGVjaWZpZWQgYnkgaW5jbHVkaW5nIHRoZQorLkRxIEByZXZva2VkCittYXJrZXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUga2V5IGxpbmUsIGFuZCBhcmUgbmV2ZXIgYWNjZXB0ZWQgZm9yCithdXRoZW50aWNhdGlvbiBvciBhcyBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0aWVzLCBidXQgaW5zdGVhZCB3aWxsCitwcm9kdWNlIGEgd2FybmluZyBmcm9tCisuWHIgc3NoIDEKK3doZW4gdGhleSBhcmUgZW5jb3VudGVyZWQuCisuUHAKK0l0IGlzIHBlcm1pc3NpYmxlIChidXQgbm90CityZWNvbW1lbmRlZCkgdG8gaGF2ZSBzZXZlcmFsIGxpbmVzIG9yIGRpZmZlcmVudCBob3N0IGtleXMgZm9yIHRoZSBzYW1lCituYW1lcy4KK1RoaXMgd2lsbCBpbmV2aXRhYmx5IGhhcHBlbiB3aGVuIHNob3J0IGZvcm1zIG9mIGhvc3QgbmFtZXMKK2Zyb20gZGlmZmVyZW50IGRvbWFpbnMgYXJlIHB1dCBpbiB0aGUgZmlsZS4KK0l0IGlzIHBvc3NpYmxlCit0aGF0IHRoZSBmaWxlcyBjb250YWluIGNvbmZsaWN0aW5nIGluZm9ybWF0aW9uOyBhdXRoZW50aWNhdGlvbiBpcworYWNjZXB0ZWQgaWYgdmFsaWQgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGZyb20gZWl0aGVyIGZpbGUuCisuUHAKK05vdGUgdGhhdCB0aGUgbGluZXMgaW4gdGhlc2UgZmlsZXMgYXJlIHR5cGljYWxseSBodW5kcmVkcyBvZiBjaGFyYWN0ZXJzCitsb25nLCBhbmQgeW91IGRlZmluaXRlbHkgZG9uJ3Qgd2FudCB0byB0eXBlIGluIHRoZSBob3N0IGtleXMgYnkgaGFuZC4KK1JhdGhlciwgZ2VuZXJhdGUgdGhlbSBieSBhIHNjcmlwdCwKKy5YciBzc2gta2V5c2NhbiAxCitvciBieSB0YWtpbmcKKy5QYSAvZXRjL3NzaC9zc2hfaG9zdF9rZXkucHViCithbmQgYWRkaW5nIHRoZSBob3N0IG5hbWVzIGF0IHRoZSBmcm9udC4KKy5YciBzc2gta2V5Z2VuIDEKK2Fsc28gb2ZmZXJzIHNvbWUgYmFzaWMgYXV0b21hdGVkIGVkaXRpbmcgZm9yCisuUGEgfi8uc3NoL2tub3duX2hvc3RzCitpbmNsdWRpbmcgcmVtb3ZpbmcgaG9zdHMgbWF0Y2hpbmcgYSBob3N0IG5hbWUgYW5kIGNvbnZlcnRpbmcgYWxsIGhvc3QKK25hbWVzIHRvIHRoZWlyIGhhc2hlZCByZXByZXNlbnRhdGlvbnMuCisuUHAKK0FuIGV4YW1wbGUgc3NoX2tub3duX2hvc3RzIGZpbGU6CisuQmQgLWxpdGVyYWwgLW9mZnNldCAzbgorIyBDb21tZW50cyBhbGxvd2VkIGF0IHN0YXJ0IG9mIGxpbmUKK2Nsb3NlbmV0LC4uLiwxOTIuMC4yLjUzIDEwMjQgMzcgMTU5Li4uOTMgY2xvc2VuZXQuZXhhbXBsZS5uZXQKK2N2cy5leGFtcGxlLm5ldCwxOTIuMC4yLjEwIHNzaC1yc2EgQUFBQTEyMzQuLi4uLj0KKyMgQSBoYXNoZWQgaG9zdG5hbWUKK3wxfEpmS1RkQmg3ck5iWGtWQVFDUnA0T1FvUGZtST18VVNFQ3IzU1dmMUpVUHNtczVBcWZENVFmeGtNPSBzc2gtcnNhCitBQUFBMTIzNC4uLi4uPQorIyBBIHJldm9rZWQga2V5CitAcmV2b2tlZCAqIHNzaC1yc2EgQUFBQUI1Vy4uLgorIyBBIENBIGtleSwgYWNjZXB0ZWQgZm9yIGFueSBob3N0IGluICoubXlkb21haW4uY29tIG9yICoubXlkb21haW4ub3JnCitAY2VydC1hdXRob3JpdHkgKi5teWRvbWFpbi5vcmcsKi5teWRvbWFpbi5jb20gc3NoLXJzYSBBQUFBQjVXLi4uCisuRWQKKy5TaCBGSUxFUworLkJsIC10YWcgLXdpZHRoIERzIC1jb21wYWN0CisuSXQgUGEgfi8uaHVzaGxvZ2luCitUaGlzIGZpbGUgaXMgdXNlZCB0byBzdXBwcmVzcyBwcmludGluZyB0aGUgbGFzdCBsb2dpbiB0aW1lIGFuZAorLlBhIC9ldGMvbW90ZCAsCitpZgorLkNtIFByaW50TGFzdExvZworYW5kCisuQ20gUHJpbnRNb3RkICwKK3Jlc3BlY3RpdmVseSwKK2FyZSBlbmFibGVkLgorSXQgZG9lcyBub3Qgc3VwcHJlc3MgcHJpbnRpbmcgb2YgdGhlIGJhbm5lciBzcGVjaWZpZWQgYnkKKy5DbSBCYW5uZXIgLgorLlBwCisuSXQgUGEgfi8ucmhvc3RzCitUaGlzIGZpbGUgaXMgdXNlZCBmb3IgaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbiAoc2VlCisuWHIgc3NoIDEKK2ZvciBtb3JlIGluZm9ybWF0aW9uKS4KK09uIHNvbWUgbWFjaGluZXMgdGhpcyBmaWxlIG1heSBuZWVkIHRvIGJlCit3b3JsZC1yZWFkYWJsZSBpZiB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5IGlzIG9uIGFuIE5GUyBwYXJ0aXRpb24sCitiZWNhdXNlCisuTm0KK3JlYWRzIGl0IGFzIHJvb3QuCitBZGRpdGlvbmFsbHksIHRoaXMgZmlsZSBtdXN0IGJlIG93bmVkIGJ5IHRoZSB1c2VyLAorYW5kIG11c3Qgbm90IGhhdmUgd3JpdGUgcGVybWlzc2lvbnMgZm9yIGFueW9uZSBlbHNlLgorVGhlIHJlY29tbWVuZGVkCitwZXJtaXNzaW9uIGZvciBtb3N0IG1hY2hpbmVzIGlzIHJlYWQvd3JpdGUgZm9yIHRoZSB1c2VyLCBhbmQgbm90CithY2Nlc3NpYmxlIGJ5IG90aGVycy4KKy5QcAorLkl0IFBhIH4vLnNob3N0cworVGhpcyBmaWxlIGlzIHVzZWQgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMKKy5QYSAucmhvc3RzICwKK2J1dCBhbGxvd3MgaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbiB3aXRob3V0IHBlcm1pdHRpbmcgbG9naW4gd2l0aAorcmxvZ2luL3JzaC4KKy5QcAorLkl0IFBhIH4vLnNzaC8KK1RoaXMgZGlyZWN0b3J5IGlzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIGZvciBhbGwgdXNlci1zcGVjaWZpYyBjb25maWd1cmF0aW9uCithbmQgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24uCitUaGVyZSBpcyBubyBnZW5lcmFsIHJlcXVpcmVtZW50IHRvIGtlZXAgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGlzIGRpcmVjdG9yeQorc2VjcmV0LCBidXQgdGhlIHJlY29tbWVuZGVkIHBlcm1pc3Npb25zIGFyZSByZWFkL3dyaXRlL2V4ZWN1dGUgZm9yIHRoZSB1c2VyLAorYW5kIG5vdCBhY2Nlc3NpYmxlIGJ5IG90aGVycy4KKy5QcAorLkl0IFBhIH4vLnNzaC9hdXRob3JpemVkX2tleXMKK0xpc3RzIHRoZSBwdWJsaWMga2V5cyAoRFNBL0VDRFNBL1JTQSkgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbG9nZ2luZyBpbgorYXMgdGhpcyB1c2VyLgorVGhlIGZvcm1hdCBvZiB0aGlzIGZpbGUgaXMgZGVzY3JpYmVkIGFib3ZlLgorVGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgaXMgbm90IGhpZ2hseSBzZW5zaXRpdmUsIGJ1dCB0aGUgcmVjb21tZW5kZWQKK3Blcm1pc3Npb25zIGFyZSByZWFkL3dyaXRlIGZvciB0aGUgdXNlciwgYW5kIG5vdCBhY2Nlc3NpYmxlIGJ5IG90aGVycy4KKy5QcAorSWYgdGhpcyBmaWxlLCB0aGUKKy5QYSB+Ly5zc2gKK2RpcmVjdG9yeSwgb3IgdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSBhcmUgd3JpdGFibGUKK2J5IG90aGVyIHVzZXJzLCB0aGVuIHRoZSBmaWxlIGNvdWxkIGJlIG1vZGlmaWVkIG9yIHJlcGxhY2VkIGJ5IHVuYXV0aG9yaXplZAordXNlcnMuCitJbiB0aGlzIGNhc2UsCisuTm0KK3dpbGwgbm90IGFsbG93IGl0IHRvIGJlIHVzZWQgdW5sZXNzIHRoZQorLkNtIFN0cmljdE1vZGVzCitvcHRpb24gaGFzIGJlZW4gc2V0IHRvCisuRHEgbm8gLgorLlBwCisuSXQgUGEgfi8uc3NoL2Vudmlyb25tZW50CitUaGlzIGZpbGUgaXMgcmVhZCBpbnRvIHRoZSBlbnZpcm9ubWVudCBhdCBsb2dpbiAoaWYgaXQgZXhpc3RzKS4KK0l0IGNhbiBvbmx5IGNvbnRhaW4gZW1wdHkgbGluZXMsIGNvbW1lbnQgbGluZXMgKHRoYXQgc3RhcnQgd2l0aAorLlFsICMgKSAsCithbmQgYXNzaWdubWVudCBsaW5lcyBvZiB0aGUgZm9ybSBuYW1lPXZhbHVlLgorVGhlIGZpbGUgc2hvdWxkIGJlIHdyaXRhYmxlCitvbmx5IGJ5IHRoZSB1c2VyOyBpdCBuZWVkIG5vdCBiZSByZWFkYWJsZSBieSBhbnlvbmUgZWxzZS4KK0Vudmlyb25tZW50IHByb2Nlc3NpbmcgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgaXMKK2NvbnRyb2xsZWQgdmlhIHRoZQorLkNtIFBlcm1pdFVzZXJFbnZpcm9ubWVudAorb3B0aW9uLgorLlBwCisuSXQgUGEgfi8uc3NoL2tub3duX2hvc3RzCitDb250YWlucyBhIGxpc3Qgb2YgaG9zdCBrZXlzIGZvciBhbGwgaG9zdHMgdGhlIHVzZXIgaGFzIGxvZ2dlZCBpbnRvCit0aGF0IGFyZSBub3QgYWxyZWFkeSBpbiB0aGUgc3lzdGVtd2lkZSBsaXN0IG9mIGtub3duIGhvc3Qga2V5cy4KK1RoZSBmb3JtYXQgb2YgdGhpcyBmaWxlIGlzIGRlc2NyaWJlZCBhYm92ZS4KK1RoaXMgZmlsZSBzaG91bGQgYmUgd3JpdGFibGUgb25seSBieSByb290L3RoZSBvd25lciBhbmQKK2NhbiwgYnV0IG5lZWQgbm90IGJlLCB3b3JsZC1yZWFkYWJsZS4KKy5QcAorLkl0IFBhIH4vLnNzaC9yYworQ29udGFpbnMgaW5pdGlhbGl6YXRpb24gcm91dGluZXMgdG8gYmUgcnVuIGJlZm9yZQordGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSBiZWNvbWVzIGFjY2Vzc2libGUuCitUaGlzIGZpbGUgc2hvdWxkIGJlIHdyaXRhYmxlIG9ubHkgYnkgdGhlIHVzZXIsIGFuZCBuZWVkIG5vdCBiZQorcmVhZGFibGUgYnkgYW55b25lIGVsc2UuCisuUHAKKy5JdCBQYSAvZXRjL2hvc3RzLmFsbG93CisuSXQgUGEgL2V0Yy9ob3N0cy5kZW55CitBY2Nlc3MgY29udHJvbHMgdGhhdCBzaG91bGQgYmUgZW5mb3JjZWQgYnkgdGNwLXdyYXBwZXJzIGFyZSBkZWZpbmVkIGhlcmUuCitGdXJ0aGVyIGRldGFpbHMgYXJlIGRlc2NyaWJlZCBpbgorLlhyIGhvc3RzX2FjY2VzcyA1IC4KKy5QcAorLkl0IFBhIC9ldGMvaG9zdHMuZXF1aXYKK1RoaXMgZmlsZSBpcyBmb3IgaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbiAoc2VlCisuWHIgc3NoIDEgKSAuCitJdCBzaG91bGQgb25seSBiZSB3cml0YWJsZSBieSByb290LgorLlBwCisuSXQgUGEgL2V0Yy9tb2R1bGkKK0NvbnRhaW5zIERpZmZpZS1IZWxsbWFuIGdyb3VwcyB1c2VkIGZvciB0aGUgIkRpZmZpZS1IZWxsbWFuIEdyb3VwIEV4Y2hhbmdlIi4KK1RoZSBmaWxlIGZvcm1hdCBpcyBkZXNjcmliZWQgaW4KKy5YciBtb2R1bGkgNSAuCisuUHAKKy5JdCBQYSAvZXRjL21vdGQKK1NlZQorLlhyIG1vdGQgNSAuCisuUHAKKy5JdCBQYSAvZXRjL25vbG9naW4KK0lmIHRoaXMgZmlsZSBleGlzdHMsCisuTm0KK3JlZnVzZXMgdG8gbGV0IGFueW9uZSBleGNlcHQgcm9vdCBsb2cgaW4uCitUaGUgY29udGVudHMgb2YgdGhlIGZpbGUKK2FyZSBkaXNwbGF5ZWQgdG8gYW55b25lIHRyeWluZyB0byBsb2cgaW4sIGFuZCBub24tcm9vdCBjb25uZWN0aW9ucyBhcmUKK3JlZnVzZWQuCitUaGUgZmlsZSBzaG91bGQgYmUgd29ybGQtcmVhZGFibGUuCisuUHAKKy5JdCBQYSAvZXRjL3Nob3N0cy5lcXVpdgorVGhpcyBmaWxlIGlzIHVzZWQgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMKKy5QYSBob3N0cy5lcXVpdiAsCitidXQgYWxsb3dzIGhvc3QtYmFzZWQgYXV0aGVudGljYXRpb24gd2l0aG91dCBwZXJtaXR0aW5nIGxvZ2luIHdpdGgKK3Jsb2dpbi9yc2guCisuUHAKKy5JdCBQYSAvZXRjL3NzaC9zc2hfaG9zdF9rZXkKKy5JdCBQYSAvZXRjL3NzaC9zc2hfaG9zdF9kc2Ffa2V5CisuSXQgUGEgL2V0Yy9zc2gvc3NoX2hvc3RfZWNkc2Ffa2V5CisuSXQgUGEgL2V0Yy9zc2gvc3NoX2hvc3RfcnNhX2tleQorVGhlc2UgdGhyZWUgZmlsZXMgY29udGFpbiB0aGUgcHJpdmF0ZSBwYXJ0cyBvZiB0aGUgaG9zdCBrZXlzLgorVGhlc2UgZmlsZXMgc2hvdWxkIG9ubHkgYmUgb3duZWQgYnkgcm9vdCwgcmVhZGFibGUgb25seSBieSByb290LCBhbmQgbm90CithY2Nlc3NpYmxlIHRvIG90aGVycy4KK05vdGUgdGhhdAorLk5tCitkb2VzIG5vdCBzdGFydCBpZiB0aGVzZSBmaWxlcyBhcmUgZ3JvdXAvd29ybGQtYWNjZXNzaWJsZS4KKy5QcAorLkl0IFBhIC9ldGMvc3NoL3NzaF9ob3N0X2tleS5wdWIKKy5JdCBQYSAvZXRjL3NzaC9zc2hfaG9zdF9kc2Ffa2V5LnB1YgorLkl0IFBhIC9ldGMvc3NoL3NzaF9ob3N0X2VjZHNhX2tleS5wdWIKKy5JdCBQYSAvZXRjL3NzaC9zc2hfaG9zdF9yc2Ffa2V5LnB1YgorVGhlc2UgdGhyZWUgZmlsZXMgY29udGFpbiB0aGUgcHVibGljIHBhcnRzIG9mIHRoZSBob3N0IGtleXMuCitUaGVzZSBmaWxlcyBzaG91bGQgYmUgd29ybGQtcmVhZGFibGUgYnV0IHdyaXRhYmxlIG9ubHkgYnkKK3Jvb3QuCitUaGVpciBjb250ZW50cyBzaG91bGQgbWF0Y2ggdGhlIHJlc3BlY3RpdmUgcHJpdmF0ZSBwYXJ0cy4KK1RoZXNlIGZpbGVzIGFyZSBub3QKK3JlYWxseSB1c2VkIGZvciBhbnl0aGluZzsgdGhleSBhcmUgcHJvdmlkZWQgZm9yIHRoZSBjb252ZW5pZW5jZSBvZgordGhlIHVzZXIgc28gdGhlaXIgY29udGVudHMgY2FuIGJlIGNvcGllZCB0byBrbm93biBob3N0cyBmaWxlcy4KK1RoZXNlIGZpbGVzIGFyZSBjcmVhdGVkIHVzaW5nCisuWHIgc3NoLWtleWdlbiAxIC4KKy5QcAorLkl0IFBhIC9ldGMvc3NoL3NzaF9rbm93bl9ob3N0cworU3lzdGVtd2lkZSBsaXN0IG9mIGtub3duIGhvc3Qga2V5cy4KK1RoaXMgZmlsZSBzaG91bGQgYmUgcHJlcGFyZWQgYnkgdGhlCitzeXN0ZW0gYWRtaW5pc3RyYXRvciB0byBjb250YWluIHRoZSBwdWJsaWMgaG9zdCBrZXlzIG9mIGFsbCBtYWNoaW5lcyBpbiB0aGUKK29yZ2FuaXphdGlvbi4KK1RoZSBmb3JtYXQgb2YgdGhpcyBmaWxlIGlzIGRlc2NyaWJlZCBhYm92ZS4KK1RoaXMgZmlsZSBzaG91bGQgYmUgd3JpdGFibGUgb25seSBieSByb290L3RoZSBvd25lciBhbmQKK3Nob3VsZCBiZSB3b3JsZC1yZWFkYWJsZS4KKy5QcAorLkl0IFBhIC9ldGMvc3NoL3NzaGRfY29uZmlnCitDb250YWlucyBjb25maWd1cmF0aW9uIGRhdGEgZm9yCisuTm0gc3NoZCAuCitUaGUgZmlsZSBmb3JtYXQgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgZGVzY3JpYmVkIGluCisuWHIgc3NoZF9jb25maWcgNSAuCisuUHAKKy5JdCBQYSAvZXRjL3NzaC9zc2hyYworU2ltaWxhciB0bworLlBhIH4vLnNzaC9yYyAsCitpdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5CittYWNoaW5lLXNwZWNpZmljIGxvZ2luLXRpbWUgaW5pdGlhbGl6YXRpb25zIGdsb2JhbGx5LgorVGhpcyBmaWxlIHNob3VsZCBiZSB3cml0YWJsZSBvbmx5IGJ5IHJvb3QsIGFuZCBzaG91bGQgYmUgd29ybGQtcmVhZGFibGUuCisuUHAKKy5JdCBQYSAvdmFyL2VtcHR5CisuWHIgY2hyb290IDIKK2RpcmVjdG9yeSB1c2VkIGJ5CisuTm0KK2R1cmluZyBwcml2aWxlZ2Ugc2VwYXJhdGlvbiBpbiB0aGUgcHJlLWF1dGhlbnRpY2F0aW9uIHBoYXNlLgorVGhlIGRpcmVjdG9yeSBzaG91bGQgbm90IGNvbnRhaW4gYW55IGZpbGVzIGFuZCBtdXN0IGJlIG93bmVkIGJ5IHJvb3QKK2FuZCBub3QgZ3JvdXAgb3Igd29ybGQtd3JpdGFibGUuCisuUHAKKy5JdCBQYSAvdmFyL3J1bi9zc2hkLnBpZAorQ29udGFpbnMgdGhlIHByb2Nlc3MgSUQgb2YgdGhlCisuTm0KK2xpc3RlbmluZyBmb3IgY29ubmVjdGlvbnMgKGlmIHRoZXJlIGFyZSBzZXZlcmFsIGRhZW1vbnMgcnVubmluZworY29uY3VycmVudGx5IGZvciBkaWZmZXJlbnQgcG9ydHMsIHRoaXMgY29udGFpbnMgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIG9uZQorc3RhcnRlZCBsYXN0KS4KK1RoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBpcyBub3Qgc2Vuc2l0aXZlOyBpdCBjYW4gYmUgd29ybGQtcmVhZGFibGUuCisuRWwKKy5TaCBTRUUgQUxTTworLlhyIHNjcCAxICwKKy5YciBzZnRwIDEgLAorLlhyIHNzaCAxICwKKy5YciBzc2gtYWRkIDEgLAorLlhyIHNzaC1hZ2VudCAxICwKKy5YciBzc2gta2V5Z2VuIDEgLAorLlhyIHNzaC1rZXlzY2FuIDEgLAorLlhyIGNocm9vdCAyICwKKy5YciBob3N0c19hY2Nlc3MgNSAsCisuWHIgbG9naW4uY29uZiA1ICwKKy5YciBtb2R1bGkgNSAsCisuWHIgc3NoZF9jb25maWcgNSAsCisuWHIgaW5ldGQgOCAsCisuWHIgc2Z0cC1zZXJ2ZXIgOAorLlNoIEFVVEhPUlMKK09wZW5TU0ggaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBhbmQgZnJlZQorc3NoIDEuMi4xMiByZWxlYXNlIGJ5IFRhdHUgWWxvbmVuLgorQWFyb24gQ2FtcGJlbGwsIEJvYiBCZWNrLCBNYXJrdXMgRnJpZWRsLCBOaWVscyBQcm92b3MsCitUaGVvIGRlIFJhYWR0IGFuZCBEdWcgU29uZworcmVtb3ZlZCBtYW55IGJ1Z3MsIHJlLWFkZGVkIG5ld2VyIGZlYXR1cmVzIGFuZAorY3JlYXRlZCBPcGVuU1NILgorTWFya3VzIEZyaWVkbCBjb250cmlidXRlZCB0aGUgc3VwcG9ydCBmb3IgU1NICitwcm90b2NvbCB2ZXJzaW9ucyAxLjUgYW5kIDIuMC4KK05pZWxzIFByb3ZvcyBhbmQgTWFya3VzIEZyaWVkbCBjb250cmlidXRlZCBzdXBwb3J0Citmb3IgcHJpdmlsZWdlIHNlcGFyYXRpb24uCisuU2ggQ0FWRUFUUworU3lzdGVtIHNlY3VyaXR5IGlzIG5vdCBpbXByb3ZlZCB1bmxlc3MKKy5ObSByc2hkICwKKy5ObSBybG9naW5kICwKK2FuZAorLk5tIHJleGVjZAorYXJlIGRpc2FibGVkICh0aHVzIGNvbXBsZXRlbHkgZGlzYWJsaW5nCisuWHIgcmxvZ2luCithbmQKKy5YciByc2gKK2ludG8gdGhlIG1hY2hpbmUpLgpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zc2hkLmMgYi9vcGVuc3NoLTYuMHAxL3NzaGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjNhYWE0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zc2hkLmMKQEAgLTAsMCArMSwyMzgzIEBACisvKiAkT3BlbkJTRDogc3NoZC5jLHYgMS4zODggMjAxMS8wOS8zMCAyMToyMjo0OSBkam0gRXhwICQgKi8KKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiBUaGlzIHByb2dyYW0gaXMgdGhlIHNzaCBkYWVtb24uICBJdCBsaXN0ZW5zIGZvciBjb25uZWN0aW9ucyBmcm9tIGNsaWVudHMsCisgKiBhbmQgcGVyZm9ybXMgYXV0aGVudGljYXRpb24sIGV4ZWN1dGVzIHVzZSBjb21tYW5kcyBvciBzaGVsbCwgYW5kIGZvcndhcmRzCisgKiBpbmZvcm1hdGlvbiB0by9mcm9tIHRoZSBhcHBsaWNhdGlvbiB0byB0aGUgdXNlciBjbGllbnQgb3ZlciBhbiBlbmNyeXB0ZWQKKyAqIGNvbm5lY3Rpb24uICBUaGlzIGNhbiBhbHNvIGhhbmRsZSBmb3J3YXJkaW5nIG9mIFgxMSwgVENQL0lQLCBhbmQKKyAqIGF1dGhlbnRpY2F0aW9uIGFnZW50IGNvbm5lY3Rpb25zLgorICoKKyAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKKyAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCisgKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCisgKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCisgKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCisgKgorICogU1NIMiBpbXBsZW1lbnRhdGlvbjoKKyAqIFByaXZpbGVnZSBTZXBhcmF0aW9uOgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMiBOaWVscyBQcm92b3MuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorIyBpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisjaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvc3lzLXRyZWUuaCIKKyNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9zeXMtcXVldWUuaCIKKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaWZkZWYgSEFWRV9QQVRIU19ICisjaW5jbHVkZSA8cGF0aHMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGdycC5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQuaCIKKworI2lmZGVmIEhBVkVfU0VDVVJFV0FSRQorI2luY2x1ZGUgPHN5cy9zZWN1cml0eS5oPgorI2luY2x1ZGUgPHByb3QuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgInNzaC5oIgorI2luY2x1ZGUgInNzaDEuaCIKKyNpbmNsdWRlICJzc2gyLmgiCisjaW5jbHVkZSAicnNhLmgiCisjaW5jbHVkZSAic3NocHR5LmgiCisjaW5jbHVkZSAicGFja2V0LmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAic2VydmNvbmYuaCIKKyNpbmNsdWRlICJ1aWRzd2FwLmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisjaW5jbHVkZSAiY2lwaGVyLmgiCisjaW5jbHVkZSAia2V5LmgiCisjaW5jbHVkZSAia2V4LmgiCisjaW5jbHVkZSAiZGguaCIKKyNpbmNsdWRlICJteXByb3Bvc2FsLmgiCisjaW5jbHVkZSAiYXV0aGZpbGUuaCIKKyNpbmNsdWRlICJwYXRobmFtZXMuaCIKKyNpbmNsdWRlICJhdG9taWNpby5oIgorI2luY2x1ZGUgImNhbm9ob3N0LmgiCisjaW5jbHVkZSAiaG9zdGZpbGUuaCIKKyNpbmNsdWRlICJhdXRoLmgiCisjaW5jbHVkZSAibWlzYy5oIgorI2luY2x1ZGUgIm1zZy5oIgorI2luY2x1ZGUgImRpc3BhdGNoLmgiCisjaW5jbHVkZSAiY2hhbm5lbHMuaCIKKyNpbmNsdWRlICJzZXNzaW9uLmgiCisjaW5jbHVkZSAibW9uaXRvcl9tbS5oIgorI2luY2x1ZGUgIm1vbml0b3IuaCIKKyNpZmRlZiBHU1NBUEkKKyNpbmNsdWRlICJzc2gtZ3NzLmgiCisjZW5kaWYKKyNpbmNsdWRlICJtb25pdG9yX3dyYXAuaCIKKyNpbmNsdWRlICJyb2FtaW5nLmgiCisjaW5jbHVkZSAic3NoLXNhbmRib3guaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKyNpZmRlZiBMSUJXUkFQCisjaW5jbHVkZSA8dGNwZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgoraW50IGFsbG93X3NldmVyaXR5OworaW50IGRlbnlfc2V2ZXJpdHk7CisjZW5kaWYgLyogTElCV1JBUCAqLworCisjaWZuZGVmIE9fTk9DVFRZCisjZGVmaW5lIE9fTk9DVFRZCTAKKyNlbmRpZgorCisvKiBSZS1leGVjIGZkcyAqLworI2RlZmluZSBSRUVYRUNfREVWQ1JZUFRPX1JFU0VSVkVEX0ZECShTVERFUlJfRklMRU5PICsgMSkKKyNkZWZpbmUgUkVFWEVDX1NUQVJUVVBfUElQRV9GRAkJKFNUREVSUl9GSUxFTk8gKyAyKQorI2RlZmluZSBSRUVYRUNfQ09ORklHX1BBU1NfRkQJCShTVERFUlJfRklMRU5PICsgMykKKyNkZWZpbmUgUkVFWEVDX01JTl9GUkVFX0ZECQkoU1RERVJSX0ZJTEVOTyArIDQpCisKK2V4dGVybiBjaGFyICpfX3Byb2duYW1lOworCisvKiBTZXJ2ZXIgY29uZmlndXJhdGlvbiBvcHRpb25zLiAqLworU2VydmVyT3B0aW9ucyBvcHRpb25zOworCisvKiBOYW1lIG9mIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlLiAqLworY2hhciAqY29uZmlnX2ZpbGVfbmFtZSA9IF9QQVRIX1NFUlZFUl9DT05GSUdfRklMRTsKKworLyoKKyAqIERlYnVnIG1vZGUgZmxhZy4gIFRoaXMgY2FuIGJlIHNldCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgSWYgZGVidWcKKyAqIG1vZGUgaXMgZW5hYmxlZCwgZXh0cmEgZGVidWdnaW5nIG91dHB1dCB3aWxsIGJlIHNlbnQgdG8gdGhlIHN5c3RlbQorICogbG9nLCB0aGUgZGFlbW9uIHdpbGwgbm90IGdvIHRvIGJhY2tncm91bmQsIGFuZCB3aWxsIGV4aXQgYWZ0ZXIgcHJvY2Vzc2luZworICogdGhlIGZpcnN0IGNvbm5lY3Rpb24uCisgKi8KK2ludCBkZWJ1Z19mbGFnID0gMDsKKworLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIGRhZW1vbiBzaG91bGQgb25seSB0ZXN0IHRoZSBjb25maWd1cmF0aW9uIGFuZCBrZXlzLiAqLworaW50IHRlc3RfZmxhZyA9IDA7CisKKy8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBkYWVtb24gaXMgYmVpbmcgc3RhcnRlZCBmcm9tIGluZXRkLiAqLworaW50IGluZXRkX2ZsYWcgPSAwOworCisvKiBGbGFnIGluZGljYXRpbmcgdGhhdCBzc2hkIHNob3VsZCBub3QgZGV0YWNoIGFuZCBiZWNvbWUgYSBkYWVtb24uICovCitpbnQgbm9fZGFlbW9uX2ZsYWcgPSAwOworCisvKiBkZWJ1ZyBnb2VzIHRvIHN0ZGVyciB1bmxlc3MgaW5ldGRfZmxhZyBpcyBzZXQgKi8KK2ludCBsb2dfc3RkZXJyID0gMDsKKworLyogU2F2ZWQgYXJndW1lbnRzIHRvIG1haW4oKS4gKi8KK2NoYXIgKipzYXZlZF9hcmd2OworaW50IHNhdmVkX2FyZ2M7CisKKy8qIHJlLWV4ZWMgKi8KK2ludCByZXhlY2VkX2ZsYWcgPSAwOworaW50IHJleGVjX2ZsYWcgPSAxOworaW50IHJleGVjX2FyZ2MgPSAwOworY2hhciAqKnJleGVjX2FyZ3Y7CisKKy8qCisgKiBUaGUgc29ja2V0cyB0aGF0IHRoZSBzZXJ2ZXIgaXMgbGlzdGVuaW5nOyB0aGlzIGlzIHVzZWQgaW4gdGhlIFNJR0hVUAorICogc2lnbmFsIGhhbmRsZXIuCisgKi8KKyNkZWZpbmUJTUFYX0xJU1RFTl9TT0NLUwkxNgoraW50IGxpc3Rlbl9zb2Nrc1tNQVhfTElTVEVOX1NPQ0tTXTsKK2ludCBudW1fbGlzdGVuX3NvY2tzID0gMDsKKworLyoKKyAqIHRoZSBjbGllbnQncyB2ZXJzaW9uIHN0cmluZywgcGFzc2VkIGJ5IHNzaGQyIGluIGNvbXBhdCBtb2RlLiBpZiAhPSBOVUxMLAorICogc3NoZCB3aWxsIHNraXAgdGhlIHZlcnNpb24tbnVtYmVyIGV4Y2hhbmdlCisgKi8KK2NoYXIgKmNsaWVudF92ZXJzaW9uX3N0cmluZyA9IE5VTEw7CitjaGFyICpzZXJ2ZXJfdmVyc2lvbl9zdHJpbmcgPSBOVUxMOworCisvKiBmb3IgcmVrZXlpbmcgWFhYIGZpeG1lICovCitLZXggKnh4eF9rZXg7CisKKy8qCisgKiBBbnkgcmVhbGx5IHNlbnNpdGl2ZSBkYXRhIGluIHRoZSBhcHBsaWNhdGlvbiBpcyBjb250YWluZWQgaW4gdGhpcworICogc3RydWN0dXJlLiBUaGUgaWRlYSBpcyB0aGF0IHRoaXMgc3RydWN0dXJlIGNvdWxkIGJlIGxvY2tlZCBpbnRvIG1lbW9yeSBzbworICogdGhhdCB0aGUgcGFnZXMgZG8gbm90IGdldCB3cml0dGVuIGludG8gc3dhcC4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBzb21lCisgKiBwcm9ibGVtcy4gVGhlIHByaXZhdGUga2V5IGNvbnRhaW5zIEJJR05VTXMsIGFuZCB3ZSBkbyBub3QgKGluIHByaW5jaXBsZSkKKyAqIGhhdmUgYWNjZXNzIHRvIHRoZSBpbnRlcm5hbHMgb2YgdGhlbSwgYW5kIGxvY2tpbmcganVzdCB0aGUgc3RydWN0dXJlIGlzCisgKiBub3QgdmVyeSB1c2VmdWwuICBDdXJyZW50bHksIG1lbW9yeSBsb2NraW5nIGlzIG5vdCBpbXBsZW1lbnRlZC4KKyAqLworc3RydWN0IHsKKwlLZXkJKnNlcnZlcl9rZXk7CQkvKiBlcGhlbWVyYWwgc2VydmVyIGtleSAqLworCUtleQkqc3NoMV9ob3N0X2tleTsJCS8qIHNzaDEgaG9zdCBrZXkgKi8KKwlLZXkJKipob3N0X2tleXM7CQkvKiBhbGwgcHJpdmF0ZSBob3N0IGtleXMgKi8KKwlLZXkJKipob3N0X2NlcnRpZmljYXRlczsJLyogYWxsIHB1YmxpYyBob3N0IGNlcnRpZmljYXRlcyAqLworCWludAloYXZlX3NzaDFfa2V5OworCWludAloYXZlX3NzaDJfa2V5OworCXVfY2hhcglzc2gxX2Nvb2tpZVtTU0hfU0VTU0lPTl9LRVlfTEVOR1RIXTsKK30gc2Vuc2l0aXZlX2RhdGE7CisKKy8qCisgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgUlNBIHNlcnZlciBrZXkgbmVlZHMgdG8gYmUgcmVnZW5lcmF0ZWQuCisgKiBJcyBzZXQgaW4gdGhlIFNJR0FMUk0gaGFuZGxlciBhbmQgY2xlYXJlZCB3aGVuIHRoZSBrZXkgaXMgcmVnZW5lcmF0ZWQuCisgKi8KK3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3Qga2V5X2RvX3JlZ2VuID0gMDsKKworLyogVGhpcyBpcyBzZXQgdG8gdHJ1ZSB3aGVuIGEgc2lnbmFsIGlzIHJlY2VpdmVkLiAqLworc3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCByZWNlaXZlZF9zaWdodXAgPSAwOworc3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCByZWNlaXZlZF9zaWd0ZXJtID0gMDsKKworLyogc2Vzc2lvbiBpZGVudGlmaWVyLCB1c2VkIGJ5IFJTQS1hdXRoICovCit1X2NoYXIgc2Vzc2lvbl9pZFsxNl07CisKKy8qIHNhbWUgZm9yIHNzaDIgKi8KK3VfY2hhciAqc2Vzc2lvbl9pZDIgPSBOVUxMOwordV9pbnQgc2Vzc2lvbl9pZDJfbGVuID0gMDsKKworLyogcmVjb3JkIHJlbW90ZSBob3N0bmFtZSBvciBpcCAqLwordV9pbnQgdXRtcF9sZW4gPSBNQVhIT1NUTkFNRUxFTjsKKworLyogb3B0aW9ucy5tYXhfc3RhcnR1cCBzaXplZCBhcnJheSBvZiBmZCBpbnRzICovCitpbnQgKnN0YXJ0dXBfcGlwZXMgPSBOVUxMOworaW50IHN0YXJ0dXBfcGlwZTsJCS8qIGluIGNoaWxkICovCisKKy8qIHZhcmlhYmxlcyB1c2VkIGZvciBwcml2aWxlZ2Ugc2VwYXJhdGlvbiAqLworaW50IHVzZV9wcml2c2VwID0gLTE7CitzdHJ1Y3QgbW9uaXRvciAqcG1vbml0b3IgPSBOVUxMOworaW50IHByaXZzZXBfaXNfcHJlYXV0aCA9IDE7CisKKy8qIGdsb2JhbCBhdXRoZW50aWNhdGlvbiBjb250ZXh0ICovCitBdXRoY3R4dCAqdGhlX2F1dGhjdHh0ID0gTlVMTDsKKworLyogc3NoZF9jb25maWcgYnVmZmVyICovCitCdWZmZXIgY2ZnOworCisvKiBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZCBhZnRlciBsb2dpbiAqLworQnVmZmVyIGxvZ2lubXNnOworCisvKiBVbnByaXZpbGVnZWQgdXNlciAqLworc3RydWN0IHBhc3N3ZCAqcHJpdnNlcF9wdyA9IE5VTEw7CisKKy8qIFByb3RvdHlwZXMgZm9yIHZhcmlvdXMgZnVuY3Rpb25zIGRlZmluZWQgbGF0ZXIgaW4gdGhpcyBmaWxlLiAqLwordm9pZCBkZXN0cm95X3NlbnNpdGl2ZV9kYXRhKHZvaWQpOwordm9pZCBkZW1vdGVfc2Vuc2l0aXZlX2RhdGEodm9pZCk7CisKK3N0YXRpYyB2b2lkIGRvX3NzaDFfa2V4KHZvaWQpOworc3RhdGljIHZvaWQgZG9fc3NoMl9rZXgodm9pZCk7CisKKy8qCisgKiBDbG9zZSBhbGwgbGlzdGVuaW5nIHNvY2tldHMKKyAqLworc3RhdGljIHZvaWQKK2Nsb3NlX2xpc3Rlbl9zb2Nrcyh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9saXN0ZW5fc29ja3M7IGkrKykKKwkJY2xvc2UobGlzdGVuX3NvY2tzW2ldKTsKKwludW1fbGlzdGVuX3NvY2tzID0gLTE7Cit9CisKK3N0YXRpYyB2b2lkCitjbG9zZV9zdGFydHVwX3BpcGVzKHZvaWQpCit7CisJaW50IGk7CisKKwlpZiAoc3RhcnR1cF9waXBlcykKKwkJZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubWF4X3N0YXJ0dXBzOyBpKyspCisJCQlpZiAoc3RhcnR1cF9waXBlc1tpXSAhPSAtMSkKKwkJCQljbG9zZShzdGFydHVwX3BpcGVzW2ldKTsKK30KKworLyoKKyAqIFNpZ25hbCBoYW5kbGVyIGZvciBTSUdIVVAuICBTc2hkIGV4ZWNzIGl0c2VsZiB3aGVuIGl0IHJlY2VpdmVzIFNJR0hVUDsKKyAqIHRoZSBlZmZlY3QgaXMgdG8gcmVyZWFkIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKGFuZCB0byByZWdlbmVyYXRlCisgKiB0aGUgc2VydmVyIGtleSkuCisgKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgdm9pZAorc2lnaHVwX2hhbmRsZXIoaW50IHNpZykKK3sKKwlpbnQgc2F2ZV9lcnJubyA9IGVycm5vOworCisJcmVjZWl2ZWRfc2lnaHVwID0gMTsKKwlzaWduYWwoU0lHSFVQLCBzaWdodXBfaGFuZGxlcik7CisJZXJybm8gPSBzYXZlX2Vycm5vOworfQorCisvKgorICogQ2FsbGVkIGZyb20gdGhlIG1haW4gcHJvZ3JhbSBhZnRlciByZWNlaXZpbmcgU0lHSFVQLgorICogUmVzdGFydHMgdGhlIHNlcnZlci4KKyAqLworc3RhdGljIHZvaWQKK3NpZ2h1cF9yZXN0YXJ0KHZvaWQpCit7CisJbG9naXQoIlJlY2VpdmVkIFNJR0hVUDsgcmVzdGFydGluZy4iKTsKKwljbG9zZV9saXN0ZW5fc29ja3MoKTsKKwljbG9zZV9zdGFydHVwX3BpcGVzKCk7CisJYWxhcm0oMCk7ICAvKiBhbGFybSB0aW1lciBwZXJzaXN0cyBhY3Jvc3MgZXhlYyAqLworCXNpZ25hbChTSUdIVVAsIFNJR19JR04pOyAvKiB3aWxsIGJlIHJlc3RvcmVkIGFmdGVyIGV4ZWMgKi8KKwlleGVjdihzYXZlZF9hcmd2WzBdLCBzYXZlZF9hcmd2KTsKKwlsb2dpdCgiUkVTVEFSVCBGQUlMRUQ6IGF2WzBdPSclLjEwMHMnLCBlcnJvcjogJS4xMDBzLiIsIHNhdmVkX2FyZ3ZbMF0sCisJICAgIHN0cmVycm9yKGVycm5vKSk7CisJZXhpdCgxKTsKK30KKworLyoKKyAqIEdlbmVyaWMgc2lnbmFsIGhhbmRsZXIgZm9yIHRlcm1pbmF0aW5nIHNpZ25hbHMgaW4gdGhlIG1hc3RlciBkYWVtb24uCisgKi8KKy8qQVJHU1VTRUQqLworc3RhdGljIHZvaWQKK3NpZ3Rlcm1faGFuZGxlcihpbnQgc2lnKQoreworCXJlY2VpdmVkX3NpZ3Rlcm0gPSBzaWc7Cit9CisKKy8qCisgKiBTSUdDSExEIGhhbmRsZXIuICBUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciBhIGNoaWxkIGRpZXMuICBUaGlzIHdpbGwgdGhlbgorICogcmVhcCBhbnkgem9tYmllcyBsZWZ0IGJ5IGV4aXRlZCBjaGlsZHJlbi4KKyAqLworLypBUkdTVVNFRCovCitzdGF0aWMgdm9pZAorbWFpbl9zaWdjaGxkX2hhbmRsZXIoaW50IHNpZykKK3sKKwlpbnQgc2F2ZV9lcnJubyA9IGVycm5vOworCXBpZF90IHBpZDsKKwlpbnQgc3RhdHVzOworCisJd2hpbGUgKChwaWQgPSB3YWl0cGlkKC0xLCAmc3RhdHVzLCBXTk9IQU5HKSkgPiAwIHx8CisJICAgIChwaWQgPCAwICYmIGVycm5vID09IEVJTlRSKSkKKwkJOworCisJc2lnbmFsKFNJR0NITEQsIG1haW5fc2lnY2hsZF9oYW5kbGVyKTsKKwllcnJubyA9IHNhdmVfZXJybm87Cit9CisKKy8qCisgKiBTaWduYWwgaGFuZGxlciBmb3IgdGhlIGFsYXJtIGFmdGVyIHRoZSBsb2dpbiBncmFjZSBwZXJpb2QgaGFzIGV4cGlyZWQuCisgKi8KKy8qQVJHU1VTRUQqLworc3RhdGljIHZvaWQKK2dyYWNlX2FsYXJtX2hhbmRsZXIoaW50IHNpZykKK3sKKwlpZiAodXNlX3ByaXZzZXAgJiYgcG1vbml0b3IgIT0gTlVMTCAmJiBwbW9uaXRvci0+bV9waWQgPiAwKQorCQlraWxsKHBtb25pdG9yLT5tX3BpZCwgU0lHQUxSTSk7CisKKwkvKiBMb2cgZXJyb3IgYW5kIGV4aXQuICovCisJc2lnZGllKCJUaW1lb3V0IGJlZm9yZSBhdXRoZW50aWNhdGlvbiBmb3IgJXMiLCBnZXRfcmVtb3RlX2lwYWRkcigpKTsKK30KKworLyoKKyAqIFNpZ25hbCBoYW5kbGVyIGZvciB0aGUga2V5IHJlZ2VuZXJhdGlvbiBhbGFybS4gIE5vdGUgdGhhdCB0aGlzCisgKiBhbGFybSBvbmx5IG9jY3VycyBpbiB0aGUgZGFlbW9uIHdhaXRpbmcgZm9yIGNvbm5lY3Rpb25zLCBhbmQgaXQgZG9lcyBub3QKKyAqIGRvIGFueXRoaW5nIHdpdGggdGhlIHByaXZhdGUga2V5IG9yIHJhbmRvbSBzdGF0ZSBiZWZvcmUgZm9ya2luZy4KKyAqIFRodXMgdGhlcmUgc2hvdWxkIGJlIG5vIGNvbmN1cnJlbmN5IGNvbnRyb2wvYXN5bmNocm9ub3VzIGV4ZWN1dGlvbgorICogcHJvYmxlbXMuCisgKi8KK3N0YXRpYyB2b2lkCitnZW5lcmF0ZV9lcGhlbWVyYWxfc2VydmVyX2tleSh2b2lkKQoreworCXZlcmJvc2UoIkdlbmVyYXRpbmcgJXMlZCBiaXQgUlNBIGtleS4iLAorCSAgICBzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5ID8gIm5ldyAiIDogIiIsIG9wdGlvbnMuc2VydmVyX2tleV9iaXRzKTsKKwlpZiAoc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleSAhPSBOVUxMKQorCQlrZXlfZnJlZShzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5KTsKKwlzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5ID0ga2V5X2dlbmVyYXRlKEtFWV9SU0ExLAorCSAgICBvcHRpb25zLnNlcnZlcl9rZXlfYml0cyk7CisJdmVyYm9zZSgiUlNBIGtleSBnZW5lcmF0aW9uIGNvbXBsZXRlLiIpOworCisJYXJjNHJhbmRvbV9idWYoc2Vuc2l0aXZlX2RhdGEuc3NoMV9jb29raWUsIFNTSF9TRVNTSU9OX0tFWV9MRU5HVEgpOworCWFyYzRyYW5kb21fc3RpcigpOworfQorCisvKkFSR1NVU0VEKi8KK3N0YXRpYyB2b2lkCitrZXlfcmVnZW5lcmF0aW9uX2FsYXJtKGludCBzaWcpCit7CisJaW50IHNhdmVfZXJybm8gPSBlcnJubzsKKworCXNpZ25hbChTSUdBTFJNLCBTSUdfREZMKTsKKwllcnJubyA9IHNhdmVfZXJybm87CisJa2V5X2RvX3JlZ2VuID0gMTsKK30KKworc3RhdGljIHZvaWQKK3NzaGRfZXhjaGFuZ2VfaWRlbnRpZmljYXRpb24oaW50IHNvY2tfaW4sIGludCBzb2NrX291dCkKK3sKKwl1X2ludCBpOworCWludCBtaXNtYXRjaDsKKwlpbnQgcmVtb3RlX21ham9yLCByZW1vdGVfbWlub3I7CisJaW50IG1ham9yLCBtaW5vcjsKKwljaGFyICpzLCAqbmV3bGluZSA9ICJcbiI7CisJY2hhciBidWZbMjU2XTsJCQkvKiBNdXN0IG5vdCBiZSBsYXJnZXIgdGhhbiByZW1vdGVfdmVyc2lvbi4gKi8KKwljaGFyIHJlbW90ZV92ZXJzaW9uWzI1Nl07CS8qIE11c3QgYmUgYXQgbGVhc3QgYXMgYmlnIGFzIGJ1Zi4gKi8KKworCWlmICgob3B0aW9ucy5wcm90b2NvbCAmIFNTSF9QUk9UT18xKSAmJgorCSAgICAob3B0aW9ucy5wcm90b2NvbCAmIFNTSF9QUk9UT18yKSkgeworCQltYWpvciA9IFBST1RPQ09MX01BSk9SXzE7CisJCW1pbm9yID0gOTk7CisJfSBlbHNlIGlmIChvcHRpb25zLnByb3RvY29sICYgU1NIX1BST1RPXzIpIHsKKwkJbWFqb3IgPSBQUk9UT0NPTF9NQUpPUl8yOworCQltaW5vciA9IFBST1RPQ09MX01JTk9SXzI7CisJCW5ld2xpbmUgPSAiXHJcbiI7CisJfSBlbHNlIHsKKwkJbWFqb3IgPSBQUk9UT0NPTF9NQUpPUl8xOworCQltaW5vciA9IFBST1RPQ09MX01JTk9SXzE7CisJfQorCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIlNTSC0lZC4lZC0lLjEwMHMlcyIsIG1ham9yLCBtaW5vciwKKwkgICAgU1NIX1ZFUlNJT04sIG5ld2xpbmUpOworCXNlcnZlcl92ZXJzaW9uX3N0cmluZyA9IHhzdHJkdXAoYnVmKTsKKworCS8qIFNlbmQgb3VyIHByb3RvY29sIHZlcnNpb24gaWRlbnRpZmljYXRpb24uICovCisJaWYgKHJvYW1pbmdfYXRvbWljaW8odndyaXRlLCBzb2NrX291dCwgc2VydmVyX3ZlcnNpb25fc3RyaW5nLAorCSAgICBzdHJsZW4oc2VydmVyX3ZlcnNpb25fc3RyaW5nKSkKKwkgICAgIT0gc3RybGVuKHNlcnZlcl92ZXJzaW9uX3N0cmluZykpIHsKKwkJbG9naXQoIkNvdWxkIG5vdCB3cml0ZSBpZGVudCBzdHJpbmcgdG8gJXMiLCBnZXRfcmVtb3RlX2lwYWRkcigpKTsKKwkJY2xlYW51cF9leGl0KDI1NSk7CisJfQorCisJLyogUmVhZCBvdGhlciBzaWRlcyB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uLiAqLworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGJ1ZikgLSAxOyBpKyspIHsKKwkJaWYgKHJvYW1pbmdfYXRvbWljaW8ocmVhZCwgc29ja19pbiwgJmJ1ZltpXSwgMSkgIT0gMSkgeworCQkJbG9naXQoIkRpZCBub3QgcmVjZWl2ZSBpZGVudGlmaWNhdGlvbiBzdHJpbmcgZnJvbSAlcyIsCisJCQkgICAgZ2V0X3JlbW90ZV9pcGFkZHIoKSk7CisJCQljbGVhbnVwX2V4aXQoMjU1KTsKKwkJfQorCQlpZiAoYnVmW2ldID09ICdccicpIHsKKwkJCWJ1ZltpXSA9IDA7CisJCQkvKiBLbHVkZ2UgZm9yIEYtU2VjdXJlIE1hY2ludG9zaCA8IDEuMC4yICovCisJCQlpZiAoaSA9PSAxMiAmJgorCQkJICAgIHN0cm5jbXAoYnVmLCAiU1NILTEuNS1XMS4wIiwgMTIpID09IDApCisJCQkJYnJlYWs7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYnVmW2ldID09ICdcbicpIHsKKwkJCWJ1ZltpXSA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwlidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9IDA7CisJY2xpZW50X3ZlcnNpb25fc3RyaW5nID0geHN0cmR1cChidWYpOworCisJLyoKKwkgKiBDaGVjayB0aGF0IHRoZSB2ZXJzaW9ucyBtYXRjaC4gIEluIGZ1dHVyZSB0aGlzIG1pZ2h0IGFjY2VwdAorCSAqIHNldmVyYWwgdmVyc2lvbnMgYW5kIHNldCBhcHByb3ByaWF0ZSBmbGFncyB0byBoYW5kbGUgdGhlbS4KKwkgKi8KKwlpZiAoc3NjYW5mKGNsaWVudF92ZXJzaW9uX3N0cmluZywgIlNTSC0lZC4lZC0lW15cbl1cbiIsCisJICAgICZyZW1vdGVfbWFqb3IsICZyZW1vdGVfbWlub3IsIHJlbW90ZV92ZXJzaW9uKSAhPSAzKSB7CisJCXMgPSAiUHJvdG9jb2wgbWlzbWF0Y2guXG4iOworCQkodm9pZCkgYXRvbWljaW8odndyaXRlLCBzb2NrX291dCwgcywgc3RybGVuKHMpKTsKKwkJY2xvc2Uoc29ja19pbik7CisJCWNsb3NlKHNvY2tfb3V0KTsKKwkJbG9naXQoIkJhZCBwcm90b2NvbCB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uICclLjEwMHMnIGZyb20gJXMiLAorCQkgICAgY2xpZW50X3ZlcnNpb25fc3RyaW5nLCBnZXRfcmVtb3RlX2lwYWRkcigpKTsKKwkJY2xlYW51cF9leGl0KDI1NSk7CisJfQorCWRlYnVnKCJDbGllbnQgcHJvdG9jb2wgdmVyc2lvbiAlZC4lZDsgY2xpZW50IHNvZnR3YXJlIHZlcnNpb24gJS4xMDBzIiwKKwkgICAgcmVtb3RlX21ham9yLCByZW1vdGVfbWlub3IsIHJlbW90ZV92ZXJzaW9uKTsKKworCWNvbXBhdF9kYXRhZmVsbG93cyhyZW1vdGVfdmVyc2lvbik7CisKKwlpZiAoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX1BST0JFKSB7CisJCWxvZ2l0KCJwcm9iZWQgZnJvbSAlcyB3aXRoICVzLiAgRG9uJ3QgcGFuaWMuIiwKKwkJICAgIGdldF9yZW1vdGVfaXBhZGRyKCksIGNsaWVudF92ZXJzaW9uX3N0cmluZyk7CisJCWNsZWFudXBfZXhpdCgyNTUpOworCX0KKworCWlmIChkYXRhZmVsbG93cyAmIFNTSF9CVUdfU0NBTk5FUikgeworCQlsb2dpdCgic2Nhbm5lZCBmcm9tICVzIHdpdGggJXMuICBEb24ndCBwYW5pYy4iLAorCQkgICAgZ2V0X3JlbW90ZV9pcGFkZHIoKSwgY2xpZW50X3ZlcnNpb25fc3RyaW5nKTsKKwkJY2xlYW51cF9leGl0KDI1NSk7CisJfQorCisJbWlzbWF0Y2ggPSAwOworCXN3aXRjaCAocmVtb3RlX21ham9yKSB7CisJY2FzZSAxOgorCQlpZiAocmVtb3RlX21pbm9yID09IDk5KSB7CisJCQlpZiAob3B0aW9ucy5wcm90b2NvbCAmIFNTSF9QUk9UT18yKQorCQkJCWVuYWJsZV9jb21wYXQyMCgpOworCQkJZWxzZQorCQkJCW1pc21hdGNoID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWlmICghKG9wdGlvbnMucHJvdG9jb2wgJiBTU0hfUFJPVE9fMSkpIHsKKwkJCW1pc21hdGNoID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChyZW1vdGVfbWlub3IgPCAzKSB7CisJCQlwYWNrZXRfZGlzY29ubmVjdCgiWW91ciBzc2ggdmVyc2lvbiBpcyB0b28gb2xkIGFuZCAiCisJCQkgICAgImlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuICBQbGVhc2UgaW5zdGFsbCBhIG5ld2VyIHZlcnNpb24uIik7CisJCX0gZWxzZSBpZiAocmVtb3RlX21pbm9yID09IDMpIHsKKwkJCS8qIG5vdGUgdGhhdCB0aGlzIGRpc2FibGVzIGFnZW50LWZvcndhcmRpbmcgKi8KKwkJCWVuYWJsZV9jb21wYXQxMygpOworCQl9CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaWYgKG9wdGlvbnMucHJvdG9jb2wgJiBTU0hfUFJPVE9fMikgeworCQkJZW5hYmxlX2NvbXBhdDIwKCk7CisJCQlicmVhazsKKwkJfQorCQkvKiBGQUxMVEhST1VHSCAqLworCWRlZmF1bHQ6CisJCW1pc21hdGNoID0gMTsKKwkJYnJlYWs7CisJfQorCWNob3Aoc2VydmVyX3ZlcnNpb25fc3RyaW5nKTsKKwlkZWJ1ZygiTG9jYWwgdmVyc2lvbiBzdHJpbmcgJS4yMDBzIiwgc2VydmVyX3ZlcnNpb25fc3RyaW5nKTsKKworCWlmIChtaXNtYXRjaCkgeworCQlzID0gIlByb3RvY29sIG1ham9yIHZlcnNpb25zIGRpZmZlci5cbiI7CisJCSh2b2lkKSBhdG9taWNpbyh2d3JpdGUsIHNvY2tfb3V0LCBzLCBzdHJsZW4ocykpOworCQljbG9zZShzb2NrX2luKTsKKwkJY2xvc2Uoc29ja19vdXQpOworCQlsb2dpdCgiUHJvdG9jb2wgbWFqb3IgdmVyc2lvbnMgZGlmZmVyIGZvciAlczogJS4yMDBzIHZzLiAlLjIwMHMiLAorCQkgICAgZ2V0X3JlbW90ZV9pcGFkZHIoKSwKKwkJICAgIHNlcnZlcl92ZXJzaW9uX3N0cmluZywgY2xpZW50X3ZlcnNpb25fc3RyaW5nKTsKKwkJY2xlYW51cF9leGl0KDI1NSk7CisJfQorfQorCisvKiBEZXN0cm95IHRoZSBob3N0IGFuZCBzZXJ2ZXIga2V5cy4gIFRoZXkgd2lsbCBubyBsb25nZXIgYmUgbmVlZGVkLiAqLwordm9pZAorZGVzdHJveV9zZW5zaXRpdmVfZGF0YSh2b2lkKQoreworCWludCBpOworCisJaWYgKHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXkpIHsKKwkJa2V5X2ZyZWUoc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleSk7CisJCXNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXkgPSBOVUxMOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1faG9zdF9rZXlfZmlsZXM7IGkrKykgeworCQlpZiAoc2Vuc2l0aXZlX2RhdGEuaG9zdF9rZXlzW2ldKSB7CisJCQlrZXlfZnJlZShzZW5zaXRpdmVfZGF0YS5ob3N0X2tleXNbaV0pOworCQkJc2Vuc2l0aXZlX2RhdGEuaG9zdF9rZXlzW2ldID0gTlVMTDsKKwkJfQorCQlpZiAoc2Vuc2l0aXZlX2RhdGEuaG9zdF9jZXJ0aWZpY2F0ZXNbaV0pIHsKKwkJCWtleV9mcmVlKHNlbnNpdGl2ZV9kYXRhLmhvc3RfY2VydGlmaWNhdGVzW2ldKTsKKwkJCXNlbnNpdGl2ZV9kYXRhLmhvc3RfY2VydGlmaWNhdGVzW2ldID0gTlVMTDsKKwkJfQorCX0KKwlzZW5zaXRpdmVfZGF0YS5zc2gxX2hvc3Rfa2V5ID0gTlVMTDsKKwltZW1zZXQoc2Vuc2l0aXZlX2RhdGEuc3NoMV9jb29raWUsIDAsIFNTSF9TRVNTSU9OX0tFWV9MRU5HVEgpOworfQorCisvKiBEZW1vdGUgcHJpdmF0ZSB0byBwdWJsaWMga2V5cyBmb3IgbmV0d29yayBjaGlsZCAqLwordm9pZAorZGVtb3RlX3NlbnNpdGl2ZV9kYXRhKHZvaWQpCit7CisJS2V5ICp0bXA7CisJaW50IGk7CisKKwlpZiAoc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleSkgeworCQl0bXAgPSBrZXlfZGVtb3RlKHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXkpOworCQlrZXlfZnJlZShzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5KTsKKwkJc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleSA9IHRtcDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1faG9zdF9rZXlfZmlsZXM7IGkrKykgeworCQlpZiAoc2Vuc2l0aXZlX2RhdGEuaG9zdF9rZXlzW2ldKSB7CisJCQl0bXAgPSBrZXlfZGVtb3RlKHNlbnNpdGl2ZV9kYXRhLmhvc3Rfa2V5c1tpXSk7CisJCQlrZXlfZnJlZShzZW5zaXRpdmVfZGF0YS5ob3N0X2tleXNbaV0pOworCQkJc2Vuc2l0aXZlX2RhdGEuaG9zdF9rZXlzW2ldID0gdG1wOworCQkJaWYgKHRtcC0+dHlwZSA9PSBLRVlfUlNBMSkKKwkJCQlzZW5zaXRpdmVfZGF0YS5zc2gxX2hvc3Rfa2V5ID0gdG1wOworCQl9CisJCS8qIENlcnRzIGRvIG5vdCBuZWVkIGRlbW90aW9uICovCisJfQorCisJLyogV2UgZG8gbm90IGNsZWFyIHNzaDFfaG9zdCBrZXkgYW5kIGNvb2tpZS4gIFhYWCAtIE9rYXkgTmllbHM/ICovCit9CisKK3N0YXRpYyB2b2lkCitwcml2c2VwX3ByZWF1dGhfY2hpbGQodm9pZCkKK3sKKwl1X2ludDMyX3Qgcm5kWzI1Nl07CisJZ2lkX3QgZ2lkc2V0WzFdOworCisJLyogRW5hYmxlIGNoYWxsZW5nZS1yZXNwb25zZSBhdXRoZW50aWNhdGlvbiBmb3IgcHJpdmlsZWdlIHNlcGFyYXRpb24gKi8KKwlwcml2c2VwX2NoYWxsZW5nZV9lbmFibGUoKTsKKworCWFyYzRyYW5kb21fc3RpcigpOworCWFyYzRyYW5kb21fYnVmKHJuZCwgc2l6ZW9mKHJuZCkpOworCVJBTkRfc2VlZChybmQsIHNpemVvZihybmQpKTsKKworCS8qIERlbW90ZSB0aGUgcHJpdmF0ZSBrZXlzIHRvIHB1YmxpYyBrZXlzLiAqLworCWRlbW90ZV9zZW5zaXRpdmVfZGF0YSgpOworCisJLyogQ2hhbmdlIG91ciByb290IGRpcmVjdG9yeSAqLworCWlmIChjaHJvb3QoX1BBVEhfUFJJVlNFUF9DSFJPT1RfRElSKSA9PSAtMSkKKwkJZmF0YWwoImNocm9vdChcIiVzXCIpOiAlcyIsIF9QQVRIX1BSSVZTRVBfQ0hST09UX0RJUiwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKGNoZGlyKCIvIikgPT0gLTEpCisJCWZhdGFsKCJjaGRpcihcIi9cIik6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKworCS8qIERyb3Agb3VyIHByaXZpbGVnZXMgKi8KKwlkZWJ1ZzMoInByaXZzZXAgdXNlcjpncm91cCAldToldSIsICh1X2ludClwcml2c2VwX3B3LT5wd191aWQsCisJICAgICh1X2ludClwcml2c2VwX3B3LT5wd19naWQpOworI2lmIDAKKwkvKiBYWFggbm90IHJlYWR5LCB0b28gaGVhdnkgYWZ0ZXIgY2hyb290ICovCisJZG9fc2V0dXNlcmNvbnRleHQocHJpdnNlcF9wdyk7CisjZWxzZQorCWdpZHNldFswXSA9IHByaXZzZXBfcHctPnB3X2dpZDsKKwlpZiAoc2V0Z3JvdXBzKDEsIGdpZHNldCkgPCAwKQorCQlmYXRhbCgic2V0Z3JvdXBzOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCXBlcm1hbmVudGx5X3NldF91aWQocHJpdnNlcF9wdyk7CisjZW5kaWYKK30KKworc3RhdGljIGludAorcHJpdnNlcF9wcmVhdXRoKEF1dGhjdHh0ICphdXRoY3R4dCkKK3sKKwlpbnQgc3RhdHVzOworCXBpZF90IHBpZDsKKwlzdHJ1Y3Qgc3NoX3NhbmRib3ggKmJveCA9IE5VTEw7CisKKwkvKiBTZXQgdXAgdW5wcml2aWxlZ2VkIGNoaWxkIHByb2Nlc3MgdG8gZGVhbCB3aXRoIG5ldHdvcmsgZGF0YSAqLworCXBtb25pdG9yID0gbW9uaXRvcl9pbml0KCk7CisJLyogU3RvcmUgYSBwb2ludGVyIHRvIHRoZSBrZXggZm9yIGxhdGVyIHJla2V5aW5nICovCisJcG1vbml0b3ItPm1fcGtleCA9ICZ4eHhfa2V4OworCisJaWYgKHVzZV9wcml2c2VwID09IFBSSVZTRVBfU0FOREJPWCkKKwkJYm94ID0gc3NoX3NhbmRib3hfaW5pdCgpOworCXBpZCA9IGZvcmsoKTsKKwlpZiAocGlkID09IC0xKSB7CisJCWZhdGFsKCJmb3JrIG9mIHVucHJpdmlsZWdlZCBjaGlsZCBmYWlsZWQiKTsKKwl9IGVsc2UgaWYgKHBpZCAhPSAwKSB7CisJCWRlYnVnMigiTmV0d29yayBjaGlsZCBpcyBvbiBwaWQgJWxkIiwgKGxvbmcpcGlkKTsKKworCQlpZiAoYm94ICE9IE5VTEwpCisJCQlzc2hfc2FuZGJveF9wYXJlbnRfcHJlYXV0aChib3gsIHBpZCk7CisJCXBtb25pdG9yLT5tX3BpZCA9IHBpZDsKKwkJbW9uaXRvcl9jaGlsZF9wcmVhdXRoKGF1dGhjdHh0LCBwbW9uaXRvcik7CisKKwkJLyogU3luYyBtZW1vcnkgKi8KKwkJbW9uaXRvcl9zeW5jKHBtb25pdG9yKTsKKworCQkvKiBXYWl0IGZvciB0aGUgY2hpbGQncyBleGl0IHN0YXR1cyAqLworCQl3aGlsZSAod2FpdHBpZChwaWQsICZzdGF0dXMsIDApIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJCWNvbnRpbnVlOworCQkJcG1vbml0b3ItPm1fcGlkID0gLTE7CisJCQlmYXRhbCgiJXM6IHdhaXRwaWQ6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJCX0KKwkJcHJpdnNlcF9pc19wcmVhdXRoID0gMDsKKwkJcG1vbml0b3ItPm1fcGlkID0gLTE7CisJCWlmIChXSUZFWElURUQoc3RhdHVzKSkgeworCQkJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gMCkKKwkJCQlmYXRhbCgiJXM6IHByZWF1dGggY2hpbGQgZXhpdGVkIHdpdGggc3RhdHVzICVkIiwKKwkJCQkgICAgX19mdW5jX18sIFdFWElUU1RBVFVTKHN0YXR1cykpOworCQl9IGVsc2UgaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpCisJCQlmYXRhbCgiJXM6IHByZWF1dGggY2hpbGQgdGVybWluYXRlZCBieSBzaWduYWwgJWQiLAorCQkJICAgIF9fZnVuY19fLCBXVEVSTVNJRyhzdGF0dXMpKTsKKwkJaWYgKGJveCAhPSBOVUxMKQorCQkJc3NoX3NhbmRib3hfcGFyZW50X2ZpbmlzaChib3gpOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQkvKiBjaGlsZCAqLworCQljbG9zZShwbW9uaXRvci0+bV9zZW5kZmQpOworCQljbG9zZShwbW9uaXRvci0+bV9sb2dfcmVjdmZkKTsKKworCQkvKiBBcnJhbmdlIGZvciBsb2dnaW5nIHRvIGJlIHNlbnQgdG8gdGhlIG1vbml0b3IgKi8KKwkJc2V0X2xvZ19oYW5kbGVyKG1tX2xvZ19oYW5kbGVyLCBwbW9uaXRvcik7CisKKwkJLyogRGVtb3RlIHRoZSBjaGlsZCAqLworCQlpZiAoZ2V0dWlkKCkgPT0gMCB8fCBnZXRldWlkKCkgPT0gMCkKKwkJCXByaXZzZXBfcHJlYXV0aF9jaGlsZCgpOworCQlzZXRwcm9jdGl0bGUoIiVzIiwgIltuZXRdIik7CisJCWlmIChib3ggIT0gTlVMTCkKKwkJCXNzaF9zYW5kYm94X2NoaWxkKGJveCk7CisKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgdm9pZAorcHJpdnNlcF9wb3N0YXV0aChBdXRoY3R4dCAqYXV0aGN0eHQpCit7CisJdV9pbnQzMl90IHJuZFsyNTZdOworCisjaWZkZWYgRElTQUJMRV9GRF9QQVNTSU5HCisJaWYgKDEpIHsKKyNlbHNlCisJaWYgKGF1dGhjdHh0LT5wdy0+cHdfdWlkID09IDAgfHwgb3B0aW9ucy51c2VfbG9naW4pIHsKKyNlbmRpZgorCQkvKiBGaWxlIGRlc2NyaXB0b3IgcGFzc2luZyBpcyBicm9rZW4gb3Igcm9vdCBsb2dpbiAqLworCQl1c2VfcHJpdnNlcCA9IDA7CisJCWdvdG8gc2tpcDsKKwl9CisKKwkvKiBOZXcgc29ja2V0IHBhaXIgKi8KKwltb25pdG9yX3JlaW5pdChwbW9uaXRvcik7CisKKwlwbW9uaXRvci0+bV9waWQgPSBmb3JrKCk7CisJaWYgKHBtb25pdG9yLT5tX3BpZCA9PSAtMSkKKwkJZmF0YWwoImZvcmsgb2YgdW5wcml2aWxlZ2VkIGNoaWxkIGZhaWxlZCIpOworCWVsc2UgaWYgKHBtb25pdG9yLT5tX3BpZCAhPSAwKSB7CisJCXZlcmJvc2UoIlVzZXIgY2hpbGQgaXMgb24gcGlkICVsZCIsIChsb25nKXBtb25pdG9yLT5tX3BpZCk7CisJCWJ1ZmZlcl9jbGVhcigmbG9naW5tc2cpOworCQltb25pdG9yX2NoaWxkX3Bvc3RhdXRoKHBtb25pdG9yKTsKKworCQkvKiBORVZFUlJFQUNIRUQgKi8KKwkJZXhpdCgwKTsKKwl9CisKKwkvKiBjaGlsZCAqLworCisJY2xvc2UocG1vbml0b3ItPm1fc2VuZGZkKTsKKwlwbW9uaXRvci0+bV9zZW5kZmQgPSAtMTsKKworCS8qIERlbW90ZSB0aGUgcHJpdmF0ZSBrZXlzIHRvIHB1YmxpYyBrZXlzLiAqLworCWRlbW90ZV9zZW5zaXRpdmVfZGF0YSgpOworCisJYXJjNHJhbmRvbV9zdGlyKCk7CisJYXJjNHJhbmRvbV9idWYocm5kLCBzaXplb2Yocm5kKSk7CisJUkFORF9zZWVkKHJuZCwgc2l6ZW9mKHJuZCkpOworCisJLyogRHJvcCBwcml2aWxlZ2VzICovCisJZG9fc2V0dXNlcmNvbnRleHQoYXV0aGN0eHQtPnB3KTsKKworIHNraXA6CisJLyogSXQgaXMgc2FmZSBub3cgdG8gYXBwbHkgdGhlIGtleSBzdGF0ZSAqLworCW1vbml0b3JfYXBwbHlfa2V5c3RhdGUocG1vbml0b3IpOworCisJLyoKKwkgKiBUZWxsIHRoZSBwYWNrZXQgbGF5ZXIgdGhhdCBhdXRoZW50aWNhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgc2luY2UKKwkgKiB0aGlzIGluZm9ybWF0aW9uIGlzIG5vdCBwYXJ0IG9mIHRoZSBrZXkgc3RhdGUuCisJICovCisJcGFja2V0X3NldF9hdXRoZW50aWNhdGVkKCk7Cit9CisKK3N0YXRpYyBjaGFyICoKK2xpc3RfaG9zdGtleV90eXBlcyh2b2lkKQoreworCUJ1ZmZlciBiOworCWNvbnN0IGNoYXIgKnA7CisJY2hhciAqcmV0OworCWludCBpOworCUtleSAqa2V5OworCisJYnVmZmVyX2luaXQoJmIpOworCWZvciAoaSA9IDA7IGkgPCBvcHRpb25zLm51bV9ob3N0X2tleV9maWxlczsgaSsrKSB7CisJCWtleSA9IHNlbnNpdGl2ZV9kYXRhLmhvc3Rfa2V5c1tpXTsKKwkJaWYgKGtleSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCXN3aXRjaCAoa2V5LT50eXBlKSB7CisJCWNhc2UgS0VZX1JTQToKKwkJY2FzZSBLRVlfRFNBOgorCQljYXNlIEtFWV9FQ0RTQToKKwkJCWlmIChidWZmZXJfbGVuKCZiKSA+IDApCisJCQkJYnVmZmVyX2FwcGVuZCgmYiwgIiwiLCAxKTsKKwkJCXAgPSBrZXlfc3NoX25hbWUoa2V5KTsKKwkJCWJ1ZmZlcl9hcHBlbmQoJmIsIHAsIHN0cmxlbihwKSk7CisJCQlicmVhazsKKwkJfQorCQkvKiBJZiB0aGUgcHJpdmF0ZSBrZXkgaGFzIGEgY2VydCBwZWVyLCB0aGVuIGxpc3QgdGhhdCB0b28gKi8KKwkJa2V5ID0gc2Vuc2l0aXZlX2RhdGEuaG9zdF9jZXJ0aWZpY2F0ZXNbaV07CisJCWlmIChrZXkgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlzd2l0Y2ggKGtleS0+dHlwZSkgeworCQljYXNlIEtFWV9SU0FfQ0VSVF9WMDA6CisJCWNhc2UgS0VZX0RTQV9DRVJUX1YwMDoKKwkJY2FzZSBLRVlfUlNBX0NFUlQ6CisJCWNhc2UgS0VZX0RTQV9DRVJUOgorCQljYXNlIEtFWV9FQ0RTQV9DRVJUOgorCQkJaWYgKGJ1ZmZlcl9sZW4oJmIpID4gMCkKKwkJCQlidWZmZXJfYXBwZW5kKCZiLCAiLCIsIDEpOworCQkJcCA9IGtleV9zc2hfbmFtZShrZXkpOworCQkJYnVmZmVyX2FwcGVuZCgmYiwgcCwgc3RybGVuKHApKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWJ1ZmZlcl9hcHBlbmQoJmIsICJcMCIsIDEpOworCXJldCA9IHhzdHJkdXAoYnVmZmVyX3B0cigmYikpOworCWJ1ZmZlcl9mcmVlKCZiKTsKKwlkZWJ1ZygibGlzdF9ob3N0a2V5X3R5cGVzOiAlcyIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIEtleSAqCitnZXRfaG9zdGtleV9ieV90eXBlKGludCB0eXBlLCBpbnQgbmVlZF9wcml2YXRlKQoreworCWludCBpOworCUtleSAqa2V5OworCisJZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubnVtX2hvc3Rfa2V5X2ZpbGVzOyBpKyspIHsKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKKwkJY2FzZSBLRVlfRFNBX0NFUlRfVjAwOgorCQljYXNlIEtFWV9SU0FfQ0VSVDoKKwkJY2FzZSBLRVlfRFNBX0NFUlQ6CisJCWNhc2UgS0VZX0VDRFNBX0NFUlQ6CisJCQlrZXkgPSBzZW5zaXRpdmVfZGF0YS5ob3N0X2NlcnRpZmljYXRlc1tpXTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJa2V5ID0gc2Vuc2l0aXZlX2RhdGEuaG9zdF9rZXlzW2ldOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGtleSAhPSBOVUxMICYmIGtleS0+dHlwZSA9PSB0eXBlKQorCQkJcmV0dXJuIG5lZWRfcHJpdmF0ZSA/CisJCQkgICAgc2Vuc2l0aXZlX2RhdGEuaG9zdF9rZXlzW2ldIDoga2V5OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworS2V5ICoKK2dldF9ob3N0a2V5X3B1YmxpY19ieV90eXBlKGludCB0eXBlKQoreworCXJldHVybiBnZXRfaG9zdGtleV9ieV90eXBlKHR5cGUsIDApOworfQorCitLZXkgKgorZ2V0X2hvc3RrZXlfcHJpdmF0ZV9ieV90eXBlKGludCB0eXBlKQoreworCXJldHVybiBnZXRfaG9zdGtleV9ieV90eXBlKHR5cGUsIDEpOworfQorCitLZXkgKgorZ2V0X2hvc3RrZXlfYnlfaW5kZXgoaW50IGluZCkKK3sKKwlpZiAoaW5kIDwgMCB8fCBpbmQgPj0gb3B0aW9ucy5udW1faG9zdF9rZXlfZmlsZXMpCisJCXJldHVybiAoTlVMTCk7CisJcmV0dXJuIChzZW5zaXRpdmVfZGF0YS5ob3N0X2tleXNbaW5kXSk7Cit9CisKK2ludAorZ2V0X2hvc3RrZXlfaW5kZXgoS2V5ICprZXkpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1faG9zdF9rZXlfZmlsZXM7IGkrKykgeworCQlpZiAoa2V5X2lzX2NlcnQoa2V5KSkgeworCQkJaWYgKGtleSA9PSBzZW5zaXRpdmVfZGF0YS5ob3N0X2NlcnRpZmljYXRlc1tpXSkKKwkJCQlyZXR1cm4gKGkpOworCQl9IGVsc2UgeworCQkJaWYgKGtleSA9PSBzZW5zaXRpdmVfZGF0YS5ob3N0X2tleXNbaV0pCisJCQkJcmV0dXJuIChpKTsKKwkJfQorCX0KKwlyZXR1cm4gKC0xKTsKK30KKworLyoKKyAqIHJldHVybnMgMSBpZiBjb25uZWN0aW9uIHNob3VsZCBiZSBkcm9wcGVkLCAwIG90aGVyd2lzZS4KKyAqIGRyb3BwaW5nIHN0YXJ0cyBhdCBjb25uZWN0aW9uICNtYXhfc3RhcnR1cHNfYmVnaW4gd2l0aCBhIHByb2JhYmlsaXR5CisgKiBvZiAobWF4X3N0YXJ0dXBzX3JhdGUvMTAwKS4gdGhlIHByb2JhYmlsaXR5IGluY3JlYXNlcyBsaW5lYXJseSB1bnRpbAorICogYWxsIGNvbm5lY3Rpb25zIGFyZSBkcm9wcGVkIGZvciBzdGFydHVwcyA+IG1heF9zdGFydHVwcworICovCitzdGF0aWMgaW50Citkcm9wX2Nvbm5lY3Rpb24oaW50IHN0YXJ0dXBzKQoreworCWludCBwLCByOworCisJaWYgKHN0YXJ0dXBzIDwgb3B0aW9ucy5tYXhfc3RhcnR1cHNfYmVnaW4pCisJCXJldHVybiAwOworCWlmIChzdGFydHVwcyA+PSBvcHRpb25zLm1heF9zdGFydHVwcykKKwkJcmV0dXJuIDE7CisJaWYgKG9wdGlvbnMubWF4X3N0YXJ0dXBzX3JhdGUgPT0gMTAwKQorCQlyZXR1cm4gMTsKKworCXAgID0gMTAwIC0gb3B0aW9ucy5tYXhfc3RhcnR1cHNfcmF0ZTsKKwlwICo9IHN0YXJ0dXBzIC0gb3B0aW9ucy5tYXhfc3RhcnR1cHNfYmVnaW47CisJcCAvPSBvcHRpb25zLm1heF9zdGFydHVwcyAtIG9wdGlvbnMubWF4X3N0YXJ0dXBzX2JlZ2luOworCXAgKz0gb3B0aW9ucy5tYXhfc3RhcnR1cHNfcmF0ZTsKKwlyID0gYXJjNHJhbmRvbV91bmlmb3JtKDEwMCk7CisKKwlkZWJ1ZygiZHJvcF9jb25uZWN0aW9uOiBwICVkLCByICVkIiwgcCwgcik7CisJcmV0dXJuIChyIDwgcCkgPyAxIDogMDsKK30KKworc3RhdGljIHZvaWQKK3VzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICIlcywgJXNcbiIsCisJICAgIFNTSF9SRUxFQVNFLCBTU0xlYXlfdmVyc2lvbihTU0xFQVlfVkVSU0lPTikpOworCWZwcmludGYoc3RkZXJyLAorInVzYWdlOiBzc2hkIFstNDZEZGVpcVR0XSBbLWIgYml0c10gWy1DIGNvbm5lY3Rpb25fc3BlY10gWy1jIGhvc3RfY2VydF9maWxlXVxuIgorIiAgICAgICAgICAgIFstZiBjb25maWdfZmlsZV0gWy1nIGxvZ2luX2dyYWNlX3RpbWVdIFstaCBob3N0X2tleV9maWxlXVxuIgorIiAgICAgICAgICAgIFstayBrZXlfZ2VuX3RpbWVdIFstbyBvcHRpb25dIFstcCBwb3J0XSBbLXUgbGVuXVxuIgorCSk7CisJZXhpdCgxKTsKK30KKworc3RhdGljIHZvaWQKK3NlbmRfcmV4ZWNfc3RhdGUoaW50IGZkLCBCdWZmZXIgKmNvbmYpCit7CisJQnVmZmVyIG07CisKKwlkZWJ1ZzMoIiVzOiBlbnRlcmluZyBmZCA9ICVkIGNvbmZpZyBsZW4gJWQiLCBfX2Z1bmNfXywgZmQsCisJICAgIGJ1ZmZlcl9sZW4oY29uZikpOworCisJLyoKKwkgKiBQcm90b2NvbCBmcm9tIHJlZXhlYyBtYXN0ZXIgdG8gY2hpbGQ6CisJICoJc3RyaW5nCWNvbmZpZ3VyYXRpb24KKwkgKgl1X2ludAllcGhlbWVyYWxfa2V5X2ZvbGxvd3MKKwkgKgliaWdudW0JZQkJKG9ubHkgaWYgZXBoZW1lcmFsX2tleV9mb2xsb3dzID09IDEpCisJICoJYmlnbnVtCW4JCQkiCisJICoJYmlnbnVtCWQJCQkiCisJICoJYmlnbnVtCWlxbXAJCQkiCisJICoJYmlnbnVtCXAJCQkiCisJICoJYmlnbnVtCXEJCQkiCisJICoJc3RyaW5nIHJuZ3NlZWQJCShvbmx5IGlmIE9wZW5TU0wgaXMgbm90IHNlbGYtc2VlZGVkKQorCSAqLworCWJ1ZmZlcl9pbml0KCZtKTsKKwlidWZmZXJfcHV0X2NzdHJpbmcoJm0sIGJ1ZmZlcl9wdHIoY29uZikpOworCisJaWYgKHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXkgIT0gTlVMTCAmJgorCSAgICBzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5LT50eXBlID09IEtFWV9SU0ExKSB7CisJCWJ1ZmZlcl9wdXRfaW50KCZtLCAxKTsKKwkJYnVmZmVyX3B1dF9iaWdudW0oJm0sIHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXktPnJzYS0+ZSk7CisJCWJ1ZmZlcl9wdXRfYmlnbnVtKCZtLCBzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5LT5yc2EtPm4pOworCQlidWZmZXJfcHV0X2JpZ251bSgmbSwgc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleS0+cnNhLT5kKTsKKwkJYnVmZmVyX3B1dF9iaWdudW0oJm0sIHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXktPnJzYS0+aXFtcCk7CisJCWJ1ZmZlcl9wdXRfYmlnbnVtKCZtLCBzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5LT5yc2EtPnApOworCQlidWZmZXJfcHV0X2JpZ251bSgmbSwgc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleS0+cnNhLT5xKTsKKwl9IGVsc2UKKwkJYnVmZmVyX3B1dF9pbnQoJm0sIDApOworCisjaWZuZGVmIE9QRU5TU0xfUFJOR19PTkxZCisJcmV4ZWNfc2VuZF9ybmdfc2VlZCgmbSk7CisjZW5kaWYKKworCWlmIChzc2hfbXNnX3NlbmQoZmQsIDAsICZtKSA9PSAtMSkKKwkJZmF0YWwoIiVzOiBzc2hfbXNnX3NlbmQgZmFpbGVkIiwgX19mdW5jX18pOworCisJYnVmZmVyX2ZyZWUoJm0pOworCisJZGVidWczKCIlczogZG9uZSIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIHZvaWQKK3JlY3ZfcmV4ZWNfc3RhdGUoaW50IGZkLCBCdWZmZXIgKmNvbmYpCit7CisJQnVmZmVyIG07CisJY2hhciAqY3A7CisJdV9pbnQgbGVuOworCisJZGVidWczKCIlczogZW50ZXJpbmcgZmQgPSAlZCIsIF9fZnVuY19fLCBmZCk7CisKKwlidWZmZXJfaW5pdCgmbSk7CisKKwlpZiAoc3NoX21zZ19yZWN2KGZkLCAmbSkgPT0gLTEpCisJCWZhdGFsKCIlczogc3NoX21zZ19yZWN2IGZhaWxlZCIsIF9fZnVuY19fKTsKKwlpZiAoYnVmZmVyX2dldF9jaGFyKCZtKSAhPSAwKQorCQlmYXRhbCgiJXM6IHJleGVjIHZlcnNpb24gbWlzbWF0Y2giLCBfX2Z1bmNfXyk7CisKKwljcCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCAmbGVuKTsKKwlpZiAoY29uZiAhPSBOVUxMKQorCQlidWZmZXJfYXBwZW5kKGNvbmYsIGNwLCBsZW4gKyAxKTsKKwl4ZnJlZShjcCk7CisKKwlpZiAoYnVmZmVyX2dldF9pbnQoJm0pKSB7CisJCWlmIChzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5ICE9IE5VTEwpCisJCQlrZXlfZnJlZShzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5KTsKKwkJc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleSA9IGtleV9uZXdfcHJpdmF0ZShLRVlfUlNBMSk7CisJCWJ1ZmZlcl9nZXRfYmlnbnVtKCZtLCBzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5LT5yc2EtPmUpOworCQlidWZmZXJfZ2V0X2JpZ251bSgmbSwgc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleS0+cnNhLT5uKTsKKwkJYnVmZmVyX2dldF9iaWdudW0oJm0sIHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXktPnJzYS0+ZCk7CisJCWJ1ZmZlcl9nZXRfYmlnbnVtKCZtLCBzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5LT5yc2EtPmlxbXApOworCQlidWZmZXJfZ2V0X2JpZ251bSgmbSwgc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleS0+cnNhLT5wKTsKKwkJYnVmZmVyX2dldF9iaWdudW0oJm0sIHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXktPnJzYS0+cSk7CisJCXJzYV9nZW5lcmF0ZV9hZGRpdGlvbmFsX3BhcmFtZXRlcnMoCisJCSAgICBzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5LT5yc2EpOworCX0KKworI2lmbmRlZiBPUEVOU1NMX1BSTkdfT05MWQorCXJleGVjX3JlY3Zfcm5nX3NlZWQoJm0pOworI2VuZGlmCisKKwlidWZmZXJfZnJlZSgmbSk7CisKKwlkZWJ1ZzMoIiVzOiBkb25lIiwgX19mdW5jX18pOworfQorCisvKiBBY2NlcHQgYSBjb25uZWN0aW9uIGZyb20gaW5ldGQgKi8KK3N0YXRpYyB2b2lkCitzZXJ2ZXJfYWNjZXB0X2luZXRkKGludCAqc29ja19pbiwgaW50ICpzb2NrX291dCkKK3sKKwlpbnQgZmQ7CisKKwlzdGFydHVwX3BpcGUgPSAtMTsKKwlpZiAocmV4ZWNlZF9mbGFnKSB7CisJCWNsb3NlKFJFRVhFQ19DT05GSUdfUEFTU19GRCk7CisJCSpzb2NrX2luID0gKnNvY2tfb3V0ID0gZHVwKFNURElOX0ZJTEVOTyk7CisJCWlmICghZGVidWdfZmxhZykgeworCQkJc3RhcnR1cF9waXBlID0gZHVwKFJFRVhFQ19TVEFSVFVQX1BJUEVfRkQpOworCQkJY2xvc2UoUkVFWEVDX1NUQVJUVVBfUElQRV9GRCk7CisJCX0KKwl9IGVsc2UgeworCQkqc29ja19pbiA9IGR1cChTVERJTl9GSUxFTk8pOworCQkqc29ja19vdXQgPSBkdXAoU1RET1VUX0ZJTEVOTyk7CisJfQorCS8qCisJICogV2UgaW50ZW50aW9uYWxseSBkbyBub3QgY2xvc2UgdGhlIGRlc2NyaXB0b3JzIDAsIDEsIGFuZCAyCisJICogYXMgb3VyIGNvZGUgZm9yIHNldHRpbmcgdGhlIGRlc2NyaXB0b3JzIHdvbid0IHdvcmsgaWYKKwkgKiB0dHlmZCBoYXBwZW5zIHRvIGJlIG9uZSBvZiB0aG9zZS4KKwkgKi8KKwlpZiAoKGZkID0gb3BlbihfUEFUSF9ERVZOVUxMLCBPX1JEV1IsIDApKSAhPSAtMSkgeworCQlkdXAyKGZkLCBTVERJTl9GSUxFTk8pOworCQlkdXAyKGZkLCBTVERPVVRfRklMRU5PKTsKKwkJaWYgKGZkID4gU1RET1VUX0ZJTEVOTykKKwkJCWNsb3NlKGZkKTsKKwl9CisJZGVidWcoImluZXRkIHNvY2tldHMgYWZ0ZXIgZHVwcGluZzogJWQsICVkIiwgKnNvY2tfaW4sICpzb2NrX291dCk7Cit9CisKKy8qCisgKiBMaXN0ZW4gZm9yIFRDUCBjb25uZWN0aW9ucworICovCitzdGF0aWMgdm9pZAorc2VydmVyX2xpc3Rlbih2b2lkKQoreworCWludCByZXQsIGxpc3Rlbl9zb2NrLCBvbiA9IDE7CisJc3RydWN0IGFkZHJpbmZvICphaTsKKwljaGFyIG50b3BbTklfTUFYSE9TVF0sIHN0cnBvcnRbTklfTUFYU0VSVl07CisKKwlmb3IgKGFpID0gb3B0aW9ucy5saXN0ZW5fYWRkcnM7IGFpOyBhaSA9IGFpLT5haV9uZXh0KSB7CisJCWlmIChhaS0+YWlfZmFtaWx5ICE9IEFGX0lORVQgJiYgYWktPmFpX2ZhbWlseSAhPSBBRl9JTkVUNikKKwkJCWNvbnRpbnVlOworCQlpZiAobnVtX2xpc3Rlbl9zb2NrcyA+PSBNQVhfTElTVEVOX1NPQ0tTKQorCQkJZmF0YWwoIlRvbyBtYW55IGxpc3RlbiBzb2NrZXRzLiAiCisJCQkgICAgIkVubGFyZ2UgTUFYX0xJU1RFTl9TT0NLUyIpOworCQlpZiAoKHJldCA9IGdldG5hbWVpbmZvKGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbiwKKwkJICAgIG50b3AsIHNpemVvZihudG9wKSwgc3RycG9ydCwgc2l6ZW9mKHN0cnBvcnQpLAorCQkgICAgTklfTlVNRVJJQ0hPU1R8TklfTlVNRVJJQ1NFUlYpKSAhPSAwKSB7CisJCQllcnJvcigiZ2V0bmFtZWluZm8gZmFpbGVkOiAlLjEwMHMiLAorCQkJICAgIHNzaF9nYWlfc3RyZXJyb3IocmV0KSk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBDcmVhdGUgc29ja2V0IGZvciBsaXN0ZW5pbmcuICovCisJCWxpc3Rlbl9zb2NrID0gc29ja2V0KGFpLT5haV9mYW1pbHksIGFpLT5haV9zb2NrdHlwZSwKKwkJICAgIGFpLT5haV9wcm90b2NvbCk7CisJCWlmIChsaXN0ZW5fc29jayA8IDApIHsKKwkJCS8qIGtlcm5lbCBtYXkgbm90IHN1cHBvcnQgaXB2NiAqLworCQkJdmVyYm9zZSgic29ja2V0OiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHNldF9ub25ibG9jayhsaXN0ZW5fc29jaykgPT0gLTEpIHsKKwkJCWNsb3NlKGxpc3Rlbl9zb2NrKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIFNldCBzb2NrZXQgb3B0aW9ucy4KKwkJICogQWxsb3cgbG9jYWwgcG9ydCByZXVzZSBpbiBUSU1FX1dBSVQuCisJCSAqLworCQlpZiAoc2V0c29ja29wdChsaXN0ZW5fc29jaywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLAorCQkgICAgJm9uLCBzaXplb2Yob24pKSA9PSAtMSkKKwkJCWVycm9yKCJzZXRzb2Nrb3B0IFNPX1JFVVNFQUREUjogJXMiLCBzdHJlcnJvcihlcnJubykpOworCisJCS8qIE9ubHkgY29tbXVuaWNhdGUgaW4gSVB2NiBvdmVyIEFGX0lORVQ2IHNvY2tldHMuICovCisJCWlmIChhaS0+YWlfZmFtaWx5ID09IEFGX0lORVQ2KQorCQkJc29ja19zZXRfdjZvbmx5KGxpc3Rlbl9zb2NrKTsKKworCQlkZWJ1ZygiQmluZCB0byBwb3J0ICVzIG9uICVzLiIsIHN0cnBvcnQsIG50b3ApOworCisJCS8qIEJpbmQgdGhlIHNvY2tldCB0byB0aGUgZGVzaXJlZCBwb3J0LiAqLworCQlpZiAoYmluZChsaXN0ZW5fc29jaywgYWktPmFpX2FkZHIsIGFpLT5haV9hZGRybGVuKSA8IDApIHsKKwkJCWVycm9yKCJCaW5kIHRvIHBvcnQgJXMgb24gJXMgZmFpbGVkOiAlLjIwMHMuIiwKKwkJCSAgICBzdHJwb3J0LCBudG9wLCBzdHJlcnJvcihlcnJubykpOworCQkJY2xvc2UobGlzdGVuX3NvY2spOworCQkJY29udGludWU7CisJCX0KKwkJbGlzdGVuX3NvY2tzW251bV9saXN0ZW5fc29ja3NdID0gbGlzdGVuX3NvY2s7CisJCW51bV9saXN0ZW5fc29ja3MrKzsKKworCQkvKiBTdGFydCBsaXN0ZW5pbmcgb24gdGhlIHBvcnQuICovCisJCWlmIChsaXN0ZW4obGlzdGVuX3NvY2ssIFNTSF9MSVNURU5fQkFDS0xPRykgPCAwKQorCQkJZmF0YWwoImxpc3RlbiBvbiBbJXNdOiVzOiAlLjEwMHMiLAorCQkJICAgIG50b3AsIHN0cnBvcnQsIHN0cmVycm9yKGVycm5vKSk7CisJCWxvZ2l0KCJTZXJ2ZXIgbGlzdGVuaW5nIG9uICVzIHBvcnQgJXMuIiwgbnRvcCwgc3RycG9ydCk7CisJfQorCWZyZWVhZGRyaW5mbyhvcHRpb25zLmxpc3Rlbl9hZGRycyk7CisKKwlpZiAoIW51bV9saXN0ZW5fc29ja3MpCisJCWZhdGFsKCJDYW5ub3QgYmluZCBhbnkgYWRkcmVzcy4iKTsKK30KKworLyoKKyAqIFRoZSBtYWluIFRDUCBhY2NlcHQgbG9vcC4gTm90ZSB0aGF0LCBmb3IgdGhlIG5vbi1kZWJ1ZyBjYXNlLCByZXR1cm5zCisgKiBmcm9tIHRoaXMgZnVuY3Rpb24gYXJlIGluIGEgZm9ya2VkIHN1YnByb2Nlc3MuCisgKi8KK3N0YXRpYyB2b2lkCitzZXJ2ZXJfYWNjZXB0X2xvb3AoaW50ICpzb2NrX2luLCBpbnQgKnNvY2tfb3V0LCBpbnQgKm5ld3NvY2ssIGludCAqY29uZmlnX3MpCit7CisJZmRfc2V0ICpmZHNldDsKKwlpbnQgaSwgaiwgcmV0LCBtYXhmZDsKKwlpbnQga2V5X3VzZWQgPSAwLCBzdGFydHVwcyA9IDA7CisJaW50IHN0YXJ0dXBfcFsyXSA9IHsgLTEgLCAtMSB9OworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGZyb207CisJc29ja2xlbl90IGZyb21sZW47CisJcGlkX3QgcGlkOworCisJLyogc2V0dXAgZmQgc2V0IGZvciBhY2NlcHQgKi8KKwlmZHNldCA9IE5VTEw7CisJbWF4ZmQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1fbGlzdGVuX3NvY2tzOyBpKyspCisJCWlmIChsaXN0ZW5fc29ja3NbaV0gPiBtYXhmZCkKKwkJCW1heGZkID0gbGlzdGVuX3NvY2tzW2ldOworCS8qIHBpcGVzIGNvbm5lY3RlZCB0byB1bmF1dGhlbnRpY2F0ZWQgY2hpbGRzICovCisJc3RhcnR1cF9waXBlcyA9IHhjYWxsb2Mob3B0aW9ucy5tYXhfc3RhcnR1cHMsIHNpemVvZihpbnQpKTsKKwlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5tYXhfc3RhcnR1cHM7IGkrKykKKwkJc3RhcnR1cF9waXBlc1tpXSA9IC0xOworCisJLyoKKwkgKiBTdGF5IGxpc3RlbmluZyBmb3IgY29ubmVjdGlvbnMgdW50aWwgdGhlIHN5c3RlbSBjcmFzaGVzIG9yCisJICogdGhlIGRhZW1vbiBpcyBraWxsZWQgd2l0aCBhIHNpZ25hbC4KKwkgKi8KKwlmb3IgKDs7KSB7CisJCWlmIChyZWNlaXZlZF9zaWdodXApCisJCQlzaWdodXBfcmVzdGFydCgpOworCQlpZiAoZmRzZXQgIT0gTlVMTCkKKwkJCXhmcmVlKGZkc2V0KTsKKwkJZmRzZXQgPSAoZmRfc2V0ICopeGNhbGxvYyhob3dtYW55KG1heGZkICsgMSwgTkZEQklUUyksCisJCSAgICBzaXplb2YoZmRfbWFzaykpOworCisJCWZvciAoaSA9IDA7IGkgPCBudW1fbGlzdGVuX3NvY2tzOyBpKyspCisJCQlGRF9TRVQobGlzdGVuX3NvY2tzW2ldLCBmZHNldCk7CisJCWZvciAoaSA9IDA7IGkgPCBvcHRpb25zLm1heF9zdGFydHVwczsgaSsrKQorCQkJaWYgKHN0YXJ0dXBfcGlwZXNbaV0gIT0gLTEpCisJCQkJRkRfU0VUKHN0YXJ0dXBfcGlwZXNbaV0sIGZkc2V0KTsKKworCQkvKiBXYWl0IGluIHNlbGVjdCB1bnRpbCB0aGVyZSBpcyBhIGNvbm5lY3Rpb24uICovCisJCXJldCA9IHNlbGVjdChtYXhmZCsxLCBmZHNldCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCWlmIChyZXQgPCAwICYmIGVycm5vICE9IEVJTlRSKQorCQkJZXJyb3IoInNlbGVjdDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJaWYgKHJlY2VpdmVkX3NpZ3Rlcm0pIHsKKwkJCWxvZ2l0KCJSZWNlaXZlZCBzaWduYWwgJWQ7IHRlcm1pbmF0aW5nLiIsCisJCQkgICAgKGludCkgcmVjZWl2ZWRfc2lndGVybSk7CisJCQljbG9zZV9saXN0ZW5fc29ja3MoKTsKKwkJCXVubGluayhvcHRpb25zLnBpZF9maWxlKTsKKwkJCWV4aXQocmVjZWl2ZWRfc2lndGVybSA9PSBTSUdURVJNID8gMCA6IDI1NSk7CisJCX0KKwkJaWYgKGtleV91c2VkICYmIGtleV9kb19yZWdlbikgeworCQkJZ2VuZXJhdGVfZXBoZW1lcmFsX3NlcnZlcl9rZXkoKTsKKwkJCWtleV91c2VkID0gMDsKKwkJCWtleV9kb19yZWdlbiA9IDA7CisJCX0KKwkJaWYgKHJldCA8IDApCisJCQljb250aW51ZTsKKworCQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5tYXhfc3RhcnR1cHM7IGkrKykKKwkJCWlmIChzdGFydHVwX3BpcGVzW2ldICE9IC0xICYmCisJCQkgICAgRkRfSVNTRVQoc3RhcnR1cF9waXBlc1tpXSwgZmRzZXQpKSB7CisJCQkJLyoKKwkJCQkgKiB0aGUgcmVhZCBlbmQgb2YgdGhlIHBpcGUgaXMgcmVhZHkKKwkJCQkgKiBpZiB0aGUgY2hpbGQgaGFzIGNsb3NlZCB0aGUgcGlwZQorCQkJCSAqIGFmdGVyIHN1Y2Nlc3NmdWwgYXV0aGVudGljYXRpb24KKwkJCQkgKiBvciBpZiB0aGUgY2hpbGQgaGFzIGRpZWQKKwkJCQkgKi8KKwkJCQljbG9zZShzdGFydHVwX3BpcGVzW2ldKTsKKwkJCQlzdGFydHVwX3BpcGVzW2ldID0gLTE7CisJCQkJc3RhcnR1cHMtLTsKKwkJCX0KKwkJZm9yIChpID0gMDsgaSA8IG51bV9saXN0ZW5fc29ja3M7IGkrKykgeworCQkJaWYgKCFGRF9JU1NFVChsaXN0ZW5fc29ja3NbaV0sIGZkc2V0KSkKKwkJCQljb250aW51ZTsKKwkJCWZyb21sZW4gPSBzaXplb2YoZnJvbSk7CisJCQkqbmV3c29jayA9IGFjY2VwdChsaXN0ZW5fc29ja3NbaV0sCisJCQkgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZmcm9tLCAmZnJvbWxlbik7CisJCQlpZiAoKm5ld3NvY2sgPCAwKSB7CisJCQkJaWYgKGVycm5vICE9IEVJTlRSICYmIGVycm5vICE9IEVBR0FJTiAmJgorCQkJCSAgICBlcnJubyAhPSBFV09VTERCTE9DSykKKwkJCQkJZXJyb3IoImFjY2VwdDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICh1bnNldF9ub25ibG9jaygqbmV3c29jaykgPT0gLTEpIHsKKwkJCQljbG9zZSgqbmV3c29jayk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoZHJvcF9jb25uZWN0aW9uKHN0YXJ0dXBzKSA9PSAxKSB7CisJCQkJZGVidWcoImRyb3AgY29ubmVjdGlvbiAjJWQiLCBzdGFydHVwcyk7CisJCQkJY2xvc2UoKm5ld3NvY2spOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHBpcGUoc3RhcnR1cF9wKSA9PSAtMSkgeworCQkJCWNsb3NlKCpuZXdzb2NrKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKHJleGVjX2ZsYWcgJiYgc29ja2V0cGFpcihBRl9VTklYLAorCQkJICAgIFNPQ0tfU1RSRUFNLCAwLCBjb25maWdfcykgPT0gLTEpIHsKKwkJCQllcnJvcigicmVleGVjIHNvY2tldHBhaXI6ICVzIiwKKwkJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQljbG9zZSgqbmV3c29jayk7CisJCQkJY2xvc2Uoc3RhcnR1cF9wWzBdKTsKKwkJCQljbG9zZShzdGFydHVwX3BbMV0pOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlmb3IgKGogPSAwOyBqIDwgb3B0aW9ucy5tYXhfc3RhcnR1cHM7IGorKykKKwkJCQlpZiAoc3RhcnR1cF9waXBlc1tqXSA9PSAtMSkgeworCQkJCQlzdGFydHVwX3BpcGVzW2pdID0gc3RhcnR1cF9wWzBdOworCQkJCQlpZiAobWF4ZmQgPCBzdGFydHVwX3BbMF0pCisJCQkJCQltYXhmZCA9IHN0YXJ0dXBfcFswXTsKKwkJCQkJc3RhcnR1cHMrKzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkvKgorCQkJICogR290IGNvbm5lY3Rpb24uICBGb3JrIGEgY2hpbGQgdG8gaGFuZGxlIGl0LCB1bmxlc3MKKwkJCSAqIHdlIGFyZSBpbiBkZWJ1Z2dpbmcgbW9kZS4KKwkJCSAqLworCQkJaWYgKGRlYnVnX2ZsYWcpIHsKKwkJCQkvKgorCQkJCSAqIEluIGRlYnVnZ2luZyBtb2RlLiAgQ2xvc2UgdGhlIGxpc3RlbmluZworCQkJCSAqIHNvY2tldCwgYW5kIHN0YXJ0IHByb2Nlc3NpbmcgdGhlCisJCQkJICogY29ubmVjdGlvbiB3aXRob3V0IGZvcmtpbmcuCisJCQkJICovCisJCQkJZGVidWcoIlNlcnZlciB3aWxsIG5vdCBmb3JrIHdoZW4gcnVubmluZyBpbiBkZWJ1Z2dpbmcgbW9kZS4iKTsKKwkJCQljbG9zZV9saXN0ZW5fc29ja3MoKTsKKwkJCQkqc29ja19pbiA9ICpuZXdzb2NrOworCQkJCSpzb2NrX291dCA9ICpuZXdzb2NrOworCQkJCWNsb3NlKHN0YXJ0dXBfcFswXSk7CisJCQkJY2xvc2Uoc3RhcnR1cF9wWzFdKTsKKwkJCQlzdGFydHVwX3BpcGUgPSAtMTsKKwkJCQlwaWQgPSBnZXRwaWQoKTsKKwkJCQlpZiAocmV4ZWNfZmxhZykgeworCQkJCQlzZW5kX3JleGVjX3N0YXRlKGNvbmZpZ19zWzBdLAorCQkJCQkgICAgJmNmZyk7CisJCQkJCWNsb3NlKGNvbmZpZ19zWzBdKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qCisJCQkgKiBOb3JtYWwgcHJvZHVjdGlvbiBkYWVtb24uICBGb3JrLCBhbmQgaGF2ZQorCQkJICogdGhlIGNoaWxkIHByb2Nlc3MgdGhlIGNvbm5lY3Rpb24uIFRoZQorCQkJICogcGFyZW50IGNvbnRpbnVlcyBsaXN0ZW5pbmcuCisJCQkgKi8KKwkJCXBsYXRmb3JtX3ByZV9mb3JrKCk7CisJCQlpZiAoKHBpZCA9IGZvcmsoKSkgPT0gMCkgeworCQkJCS8qCisJCQkJICogQ2hpbGQuICBDbG9zZSB0aGUgbGlzdGVuaW5nIGFuZAorCQkJCSAqIG1heF9zdGFydHVwIHNvY2tldHMuICBTdGFydCB1c2luZworCQkJCSAqIHRoZSBhY2NlcHRlZCBzb2NrZXQuIFJlaW5pdGlhbGl6ZQorCQkJCSAqIGxvZ2dpbmcgKHNpbmNlIG91ciBwaWQgaGFzIGNoYW5nZWQpLgorCQkJCSAqIFdlIGJyZWFrIG91dCBvZiB0aGUgbG9vcCB0byBoYW5kbGUKKwkJCQkgKiB0aGUgY29ubmVjdGlvbi4KKwkJCQkgKi8KKwkJCQlwbGF0Zm9ybV9wb3N0X2ZvcmtfY2hpbGQoKTsKKwkJCQlzdGFydHVwX3BpcGUgPSBzdGFydHVwX3BbMV07CisJCQkJY2xvc2Vfc3RhcnR1cF9waXBlcygpOworCQkJCWNsb3NlX2xpc3Rlbl9zb2NrcygpOworCQkJCSpzb2NrX2luID0gKm5ld3NvY2s7CisJCQkJKnNvY2tfb3V0ID0gKm5ld3NvY2s7CisJCQkJbG9nX2luaXQoX19wcm9nbmFtZSwKKwkJCQkgICAgb3B0aW9ucy5sb2dfbGV2ZWwsCisJCQkJICAgIG9wdGlvbnMubG9nX2ZhY2lsaXR5LAorCQkJCSAgICBsb2dfc3RkZXJyKTsKKwkJCQlpZiAocmV4ZWNfZmxhZykKKwkJCQkJY2xvc2UoY29uZmlnX3NbMF0pOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBQYXJlbnQuICBTdGF5IGluIHRoZSBsb29wLiAqLworCQkJcGxhdGZvcm1fcG9zdF9mb3JrX3BhcmVudChwaWQpOworCQkJaWYgKHBpZCA8IDApCisJCQkJZXJyb3IoImZvcms6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQllbHNlCisJCQkJZGVidWcoIkZvcmtlZCBjaGlsZCAlbGQuIiwgKGxvbmcpcGlkKTsKKworCQkJY2xvc2Uoc3RhcnR1cF9wWzFdKTsKKworCQkJaWYgKHJleGVjX2ZsYWcpIHsKKwkJCQlzZW5kX3JleGVjX3N0YXRlKGNvbmZpZ19zWzBdLCAmY2ZnKTsKKwkJCQljbG9zZShjb25maWdfc1swXSk7CisJCQkJY2xvc2UoY29uZmlnX3NbMV0pOworCQkJfQorCisJCQkvKgorCQkJICogTWFyayB0aGF0IHRoZSBrZXkgaGFzIGJlZW4gdXNlZCAoaXQKKwkJCSAqIHdhcyAiZ2l2ZW4iIHRvIHRoZSBjaGlsZCkuCisJCQkgKi8KKwkJCWlmICgob3B0aW9ucy5wcm90b2NvbCAmIFNTSF9QUk9UT18xKSAmJgorCQkJICAgIGtleV91c2VkID09IDApIHsKKwkJCQkvKiBTY2hlZHVsZSBzZXJ2ZXIga2V5IHJlZ2VuZXJhdGlvbiBhbGFybS4gKi8KKwkJCQlzaWduYWwoU0lHQUxSTSwga2V5X3JlZ2VuZXJhdGlvbl9hbGFybSk7CisJCQkJYWxhcm0ob3B0aW9ucy5rZXlfcmVnZW5lcmF0aW9uX3RpbWUpOworCQkJCWtleV91c2VkID0gMTsKKwkJCX0KKworCQkJY2xvc2UoKm5ld3NvY2spOworCisJCQkvKgorCQkJICogRW5zdXJlIHRoYXQgb3VyIHJhbmRvbSBzdGF0ZSBkaWZmZXJzCisJCQkgKiBmcm9tIHRoYXQgb2YgdGhlIGNoaWxkCisJCQkgKi8KKwkJCWFyYzRyYW5kb21fc3RpcigpOworCQl9CisKKwkJLyogY2hpbGQgcHJvY2VzcyBjaGVjayAob3IgZGVidWcgbW9kZSkgKi8KKwkJaWYgKG51bV9saXN0ZW5fc29ja3MgPCAwKQorCQkJYnJlYWs7CisJfQorfQorCisKKy8qCisgKiBNYWluIHByb2dyYW0gZm9yIHRoZSBkYWVtb24uCisgKi8KK2ludAorbWFpbihpbnQgYWMsIGNoYXIgKiphdikKK3sKKwlleHRlcm4gY2hhciAqb3B0YXJnOworCWV4dGVybiBpbnQgb3B0aW5kOworCWludCBvcHQsIGksIGosIG9uID0gMTsKKwlpbnQgc29ja19pbiA9IC0xLCBzb2NrX291dCA9IC0xLCBuZXdzb2NrID0gLTE7CisJY29uc3QgY2hhciAqcmVtb3RlX2lwOworCWNoYXIgKnRlc3RfdXNlciA9IE5VTEwsICp0ZXN0X2hvc3QgPSBOVUxMLCAqdGVzdF9hZGRyID0gTlVMTDsKKwlpbnQgcmVtb3RlX3BvcnQ7CisJY2hhciAqbGluZSwgKnAsICpjcDsKKwlpbnQgY29uZmlnX3NbMl0gPSB7IC0xICwgLTEgfTsKKwl1X2ludDY0X3QgaWJ5dGVzLCBvYnl0ZXM7CisJbW9kZV90IG5ld191bWFzazsKKwlLZXkgKmtleTsKKwlBdXRoY3R4dCAqYXV0aGN0eHQ7CisKKyNpZmRlZiBIQVZFX1NFQ1VSRVdBUkUKKwkodm9pZClzZXRfYXV0aF9wYXJhbWV0ZXJzKGFjLCBhdik7CisjZW5kaWYKKwlfX3Byb2duYW1lID0gc3NoX2dldF9wcm9nbmFtZShhdlswXSk7CisKKwkvKiBTYXZlIGFyZ3YuIER1cGxpY2F0ZSBzbyBzZXRwcm9jdGl0bGUgZW11bGF0aW9uIGRvZXNuJ3QgY2xvYmJlciBpdCAqLworCXNhdmVkX2FyZ2MgPSBhYzsKKwlyZXhlY19hcmdjID0gYWM7CisJc2F2ZWRfYXJndiA9IHhjYWxsb2MoYWMgKyAxLCBzaXplb2YoKnNhdmVkX2FyZ3YpKTsKKwlmb3IgKGkgPSAwOyBpIDwgYWM7IGkrKykKKwkJc2F2ZWRfYXJndltpXSA9IHhzdHJkdXAoYXZbaV0pOworCXNhdmVkX2FyZ3ZbaV0gPSBOVUxMOworCisjaWZuZGVmIEhBVkVfU0VUUFJPQ1RJVExFCisJLyogUHJlcGFyZSBmb3IgbGF0ZXIgc2V0cHJvY3RpdGxlIGVtdWxhdGlvbiAqLworCWNvbXBhdF9pbml0X3NldHByb2N0aXRsZShhYywgYXYpOworCWF2ID0gc2F2ZWRfYXJndjsKKyNlbmRpZgorCisJaWYgKGdldGV1aWQoKSA9PSAwICYmIHNldGdyb3VwcygwLCBOVUxMKSA9PSAtMSkKKwkJZGVidWcoInNldGdyb3VwcygpOiAlLjIwMHMiLCBzdHJlcnJvcihlcnJubykpOworCisJLyogRW5zdXJlIHRoYXQgZmRzIDAsIDEgYW5kIDIgYXJlIG9wZW4gb3IgZGlyZWN0ZWQgdG8gL2Rldi9udWxsICovCisJc2FuaXRpc2Vfc3RkZmQoKTsKKworCS8qIEluaXRpYWxpemUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLiAqLworCWluaXRpYWxpemVfc2VydmVyX29wdGlvbnMoJm9wdGlvbnMpOworCisJLyogUGFyc2UgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4gKi8KKwl3aGlsZSAoKG9wdCA9IGdldG9wdChhYywgYXYsICJmOnA6YjprOmg6Zzp1Om86QzpkRGVpcXJ0UVJUNDYiKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChvcHQpIHsKKwkJY2FzZSAnNCc6CisJCQlvcHRpb25zLmFkZHJlc3NfZmFtaWx5ID0gQUZfSU5FVDsKKwkJCWJyZWFrOworCQljYXNlICc2JzoKKwkJCW9wdGlvbnMuYWRkcmVzc19mYW1pbHkgPSBBRl9JTkVUNjsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCWNvbmZpZ19maWxlX25hbWUgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQlpZiAob3B0aW9ucy5udW1faG9zdF9jZXJ0X2ZpbGVzID49IE1BWF9IT1NUQ0VSVFMpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgInRvbyBtYW55IGhvc3QgY2VydGlmaWNhdGVzLlxuIik7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCW9wdGlvbnMuaG9zdF9jZXJ0X2ZpbGVzW29wdGlvbnMubnVtX2hvc3RfY2VydF9maWxlcysrXSA9CisJCQkgICBkZXJlbGF0aXZpc2VfcGF0aChvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJaWYgKGRlYnVnX2ZsYWcgPT0gMCkgeworCQkJCWRlYnVnX2ZsYWcgPSAxOworCQkJCW9wdGlvbnMubG9nX2xldmVsID0gU1lTTE9HX0xFVkVMX0RFQlVHMTsKKwkJCX0gZWxzZSBpZiAob3B0aW9ucy5sb2dfbGV2ZWwgPCBTWVNMT0dfTEVWRUxfREVCVUczKQorCQkJCW9wdGlvbnMubG9nX2xldmVsKys7CisJCQlicmVhazsKKwkJY2FzZSAnRCc6CisJCQlub19kYWVtb25fZmxhZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnZSc6CisJCQlsb2dfc3RkZXJyID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdpJzoKKwkJCWluZXRkX2ZsYWcgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJcmV4ZWNfZmxhZyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAnUic6CisJCQlyZXhlY2VkX2ZsYWcgPSAxOworCQkJaW5ldGRfZmxhZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnUSc6CisJCQkvKiBpZ25vcmVkICovCisJCQlicmVhazsKKwkJY2FzZSAncSc6CisJCQlvcHRpb25zLmxvZ19sZXZlbCA9IFNZU0xPR19MRVZFTF9RVUlFVDsKKwkJCWJyZWFrOworCQljYXNlICdiJzoKKwkJCW9wdGlvbnMuc2VydmVyX2tleV9iaXRzID0gKGludClzdHJ0b251bShvcHRhcmcsIDI1NiwKKwkJCSAgICAzMjc2OCwgTlVMTCk7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlvcHRpb25zLnBvcnRzX2Zyb21fY21kbGluZSA9IDE7CisJCQlpZiAob3B0aW9ucy5udW1fcG9ydHMgPj0gTUFYX1BPUlRTKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJ0b28gbWFueSBwb3J0cy5cbiIpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlvcHRpb25zLnBvcnRzW29wdGlvbnMubnVtX3BvcnRzKytdID0gYTJwb3J0KG9wdGFyZyk7CisJCQlpZiAob3B0aW9ucy5wb3J0c1tvcHRpb25zLm51bV9wb3J0cy0xXSA8PSAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJCYWQgcG9ydCBudW1iZXIuXG4iKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ2cnOgorCQkJaWYgKChvcHRpb25zLmxvZ2luX2dyYWNlX3RpbWUgPSBjb252dGltZShvcHRhcmcpKSA9PSAtMSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBsb2dpbiBncmFjZSB0aW1lLlxuIik7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdrJzoKKwkJCWlmICgob3B0aW9ucy5rZXlfcmVnZW5lcmF0aW9uX3RpbWUgPSBjb252dGltZShvcHRhcmcpKSA9PSAtMSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBrZXkgcmVnZW5lcmF0aW9uIGludGVydmFsLlxuIik7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdoJzoKKwkJCWlmIChvcHRpb25zLm51bV9ob3N0X2tleV9maWxlcyA+PSBNQVhfSE9TVEtFWVMpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgInRvbyBtYW55IGhvc3Qga2V5cy5cbiIpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlvcHRpb25zLmhvc3Rfa2V5X2ZpbGVzW29wdGlvbnMubnVtX2hvc3Rfa2V5X2ZpbGVzKytdID0gCisJCQkgICBkZXJlbGF0aXZpc2VfcGF0aChvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJdGVzdF9mbGFnID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdUJzoKKwkJCXRlc3RfZmxhZyA9IDI7CisJCQlicmVhazsKKwkJY2FzZSAnQyc6CisJCQljcCA9IG9wdGFyZzsKKwkJCXdoaWxlICgocCA9IHN0cnNlcCgmY3AsICIsIikpICYmICpwICE9ICdcMCcpIHsKKwkJCQlpZiAoc3RybmNtcChwLCAiYWRkcj0iLCA1KSA9PSAwKQorCQkJCQl0ZXN0X2FkZHIgPSB4c3RyZHVwKHAgKyA1KTsKKwkJCQllbHNlIGlmIChzdHJuY21wKHAsICJob3N0PSIsIDUpID09IDApCisJCQkJCXRlc3RfaG9zdCA9IHhzdHJkdXAocCArIDUpOworCQkJCWVsc2UgaWYgKHN0cm5jbXAocCwgInVzZXI9IiwgNSkgPT0gMCkKKwkJCQkJdGVzdF91c2VyID0geHN0cmR1cChwICsgNSk7CisJCQkJZWxzZSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCB0ZXN0ICIKKwkJCQkJICAgICJtb2RlIHNwZWNpZmljYXRpb24gJXNcbiIsIHApOworCQkJCQlleGl0KDEpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICd1JzoKKwkJCXV0bXBfbGVuID0gKHVfaW50KXN0cnRvbnVtKG9wdGFyZywgMCwgTUFYSE9TVE5BTUVMRU4rMSwgTlVMTCk7CisJCQlpZiAodXRtcF9sZW4gPiBNQVhIT1NUTkFNRUxFTikgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCB1dG1wIGxlbmd0aC5cbiIpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnbyc6CisJCQlsaW5lID0geHN0cmR1cChvcHRhcmcpOworCQkJaWYgKHByb2Nlc3Nfc2VydmVyX2NvbmZpZ19saW5lKCZvcHRpb25zLCBsaW5lLAorCQkJICAgICJjb21tYW5kLWxpbmUiLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSAhPSAwKQorCQkJCWV4aXQoMSk7CisJCQl4ZnJlZShsaW5lKTsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAocmV4ZWNlZF9mbGFnIHx8IGluZXRkX2ZsYWcpCisJCXJleGVjX2ZsYWcgPSAwOworCWlmICghdGVzdF9mbGFnICYmIChyZXhlY19mbGFnICYmIChhdlswXSA9PSBOVUxMIHx8ICphdlswXSAhPSAnLycpKSkKKwkJZmF0YWwoInNzaGQgcmUtZXhlYyByZXF1aXJlcyBleGVjdXRpb24gd2l0aCBhbiBhYnNvbHV0ZSBwYXRoIik7CisJaWYgKHJleGVjZWRfZmxhZykKKwkJY2xvc2Vmcm9tKFJFRVhFQ19NSU5fRlJFRV9GRCk7CisJZWxzZQorCQljbG9zZWZyb20oUkVFWEVDX0RFVkNSWVBUT19SRVNFUlZFRF9GRCk7CisKKwlPcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcygpOworCisJLyoKKwkgKiBGb3JjZSBsb2dnaW5nIHRvIHN0ZGVyciB1bnRpbCB3ZSBoYXZlIGxvYWRlZCB0aGUgcHJpdmF0ZSBob3N0CisJICoga2V5ICh1bmxlc3Mgc3RhcnRlZCBmcm9tIGluZXRkKQorCSAqLworCWxvZ19pbml0KF9fcHJvZ25hbWUsCisJICAgIG9wdGlvbnMubG9nX2xldmVsID09IFNZU0xPR19MRVZFTF9OT1RfU0VUID8KKwkgICAgU1lTTE9HX0xFVkVMX0lORk8gOiBvcHRpb25zLmxvZ19sZXZlbCwKKwkgICAgb3B0aW9ucy5sb2dfZmFjaWxpdHkgPT0gU1lTTE9HX0ZBQ0lMSVRZX05PVF9TRVQgPworCSAgICBTWVNMT0dfRkFDSUxJVFlfQVVUSCA6IG9wdGlvbnMubG9nX2ZhY2lsaXR5LAorCSAgICBsb2dfc3RkZXJyIHx8ICFpbmV0ZF9mbGFnKTsKKworCS8qCisJICogVW5zZXQgS1JCNUNDTkFNRSwgb3RoZXJ3aXNlIHRoZSB1c2VyJ3Mgc2Vzc2lvbiBtYXkgaW5oZXJpdCBpdCBmcm9tCisJICogcm9vdCdzIGVudmlyb25tZW50CisJICovCisJaWYgKGdldGVudigiS1JCNUNDTkFNRSIpICE9IE5VTEwpCisJCSh2b2lkKSB1bnNldGVudigiS1JCNUNDTkFNRSIpOworCisjaWZkZWYgX1VOSUNPUworCS8qIENyYXkgY2FuIGRlZmluZSB1c2VyIHByaXZzIGRyb3AgYWxsIHByaXZzIG5vdyEKKwkgKiBOb3QgbmVlZGVkIG9uIFBSSVZfU1Ugc3lzdGVtcyEKKwkgKi8KKwlkcm9wX2NyYXlfcHJpdnMoKTsKKyNlbmRpZgorCisJc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleSA9IE5VTEw7CisJc2Vuc2l0aXZlX2RhdGEuc3NoMV9ob3N0X2tleSA9IE5VTEw7CisJc2Vuc2l0aXZlX2RhdGEuaGF2ZV9zc2gxX2tleSA9IDA7CisJc2Vuc2l0aXZlX2RhdGEuaGF2ZV9zc2gyX2tleSA9IDA7CisKKwkvKgorCSAqIElmIHdlJ3JlIGRvaW5nIGFuIGV4dGVuZGVkIGNvbmZpZyB0ZXN0LCBtYWtlIHN1cmUgd2UgaGF2ZSBhbGwgb2YKKwkgKiB0aGUgcGFyYW1ldGVycyB3ZSBuZWVkLiAgSWYgd2UncmUgbm90IGRvaW5nIGFuIGV4dGVuZGVkIHRlc3QsCisJICogZG8gbm90IHNpbGVudGx5IGlnbm9yZSBjb25uZWN0aW9uIHRlc3QgcGFyYW1zLgorCSAqLworCWlmICh0ZXN0X2ZsYWcgPj0gMiAmJgorCSAgICh0ZXN0X3VzZXIgIT0gTlVMTCB8fCB0ZXN0X2hvc3QgIT0gTlVMTCB8fCB0ZXN0X2FkZHIgIT0gTlVMTCkKKwkgICAgJiYgKHRlc3RfdXNlciA9PSBOVUxMIHx8IHRlc3RfaG9zdCA9PSBOVUxMIHx8IHRlc3RfYWRkciA9PSBOVUxMKSkKKwkJZmF0YWwoInVzZXIsIGhvc3QgYW5kIGFkZHIgYXJlIGFsbCByZXF1aXJlZCB3aGVuIHRlc3RpbmcgIgorCQkgICAiTWF0Y2ggY29uZmlncyIpOworCWlmICh0ZXN0X2ZsYWcgPCAyICYmICh0ZXN0X3VzZXIgIT0gTlVMTCB8fCB0ZXN0X2hvc3QgIT0gTlVMTCB8fAorCSAgICB0ZXN0X2FkZHIgIT0gTlVMTCkpCisJCWZhdGFsKCJDb25maWcgdGVzdCBjb25uZWN0aW9uIHBhcmFtZXRlciAoLUMpIHByb3ZpZGVkIHdpdGhvdXQgIgorCQkgICAidGVzdCBtb2RlICgtVCkiKTsKKworCS8qIEZldGNoIG91ciBjb25maWd1cmF0aW9uICovCisJYnVmZmVyX2luaXQoJmNmZyk7CisJaWYgKHJleGVjZWRfZmxhZykKKwkJcmVjdl9yZXhlY19zdGF0ZShSRUVYRUNfQ09ORklHX1BBU1NfRkQsICZjZmcpOworCWVsc2UKKwkJbG9hZF9zZXJ2ZXJfY29uZmlnKGNvbmZpZ19maWxlX25hbWUsICZjZmcpOworCisJcGFyc2Vfc2VydmVyX2NvbmZpZygmb3B0aW9ucywgcmV4ZWNlZF9mbGFnID8gInJleGVjIiA6IGNvbmZpZ19maWxlX25hbWUsCisJICAgICZjZmcsIE5VTEwsIE5VTEwsIE5VTEwpOworCisJc2VlZF9ybmcoKTsKKworCS8qIEZpbGwgaW4gZGVmYXVsdCB2YWx1ZXMgZm9yIHRob3NlIG9wdGlvbnMgbm90IGV4cGxpY2l0bHkgc2V0LiAqLworCWZpbGxfZGVmYXVsdF9zZXJ2ZXJfb3B0aW9ucygmb3B0aW9ucyk7CisKKwkvKiBjaGFsbGVuZ2UtcmVzcG9uc2UgaXMgaW1wbGVtZW50ZWQgdmlhIGtleWJvYXJkIGludGVyYWN0aXZlICovCisJaWYgKG9wdGlvbnMuY2hhbGxlbmdlX3Jlc3BvbnNlX2F1dGhlbnRpY2F0aW9uKQorCQlvcHRpb25zLmtiZF9pbnRlcmFjdGl2ZV9hdXRoZW50aWNhdGlvbiA9IDE7CisKKwkvKiBzZXQgZGVmYXVsdCBjaGFubmVsIEFGICovCisJY2hhbm5lbF9zZXRfYWYob3B0aW9ucy5hZGRyZXNzX2ZhbWlseSk7CisKKwkvKiBDaGVjayB0aGF0IHRoZXJlIGFyZSBubyByZW1haW5pbmcgYXJndW1lbnRzLiAqLworCWlmIChvcHRpbmQgPCBhYykgeworCQlmcHJpbnRmKHN0ZGVyciwgIkV4dHJhIGFyZ3VtZW50ICVzLlxuIiwgYXZbb3B0aW5kXSk7CisJCWV4aXQoMSk7CisJfQorCisJZGVidWcoInNzaGQgdmVyc2lvbiAlLjEwMHMiLCBTU0hfUkVMRUFTRSk7CisKKwkvKiBTdG9yZSBwcml2aWxlZ2Ugc2VwYXJhdGlvbiB1c2VyIGZvciBsYXRlciB1c2UgaWYgcmVxdWlyZWQuICovCisJaWYgKChwcml2c2VwX3B3ID0gZ2V0cHduYW0oU1NIX1BSSVZTRVBfVVNFUikpID09IE5VTEwpIHsKKwkJaWYgKHVzZV9wcml2c2VwIHx8IG9wdGlvbnMua2VyYmVyb3NfYXV0aGVudGljYXRpb24pCisJCQlmYXRhbCgiUHJpdmlsZWdlIHNlcGFyYXRpb24gdXNlciAlcyBkb2VzIG5vdCBleGlzdCIsCisJCQkgICAgU1NIX1BSSVZTRVBfVVNFUik7CisJfSBlbHNlIHsKKwkJbWVtc2V0KHByaXZzZXBfcHctPnB3X3Bhc3N3ZCwgMCwgc3RybGVuKHByaXZzZXBfcHctPnB3X3Bhc3N3ZCkpOworCQlwcml2c2VwX3B3ID0gcHdjb3B5KHByaXZzZXBfcHcpOworCQl4ZnJlZShwcml2c2VwX3B3LT5wd19wYXNzd2QpOworCQlwcml2c2VwX3B3LT5wd19wYXNzd2QgPSB4c3RyZHVwKCIqIik7CisJfQorCWVuZHB3ZW50KCk7CisKKwkvKiBsb2FkIHByaXZhdGUgaG9zdCBrZXlzICovCisJc2Vuc2l0aXZlX2RhdGEuaG9zdF9rZXlzID0geGNhbGxvYyhvcHRpb25zLm51bV9ob3N0X2tleV9maWxlcywKKwkgICAgc2l6ZW9mKEtleSAqKSk7CisJZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubnVtX2hvc3Rfa2V5X2ZpbGVzOyBpKyspCisJCXNlbnNpdGl2ZV9kYXRhLmhvc3Rfa2V5c1tpXSA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1faG9zdF9rZXlfZmlsZXM7IGkrKykgeworCQlrZXkgPSBrZXlfbG9hZF9wcml2YXRlKG9wdGlvbnMuaG9zdF9rZXlfZmlsZXNbaV0sICIiLCBOVUxMKTsKKwkJc2Vuc2l0aXZlX2RhdGEuaG9zdF9rZXlzW2ldID0ga2V5OworCQlpZiAoa2V5ID09IE5VTEwpIHsKKwkJCWVycm9yKCJDb3VsZCBub3QgbG9hZCBob3N0IGtleTogJXMiLAorCQkJICAgIG9wdGlvbnMuaG9zdF9rZXlfZmlsZXNbaV0pOworCQkJc2Vuc2l0aXZlX2RhdGEuaG9zdF9rZXlzW2ldID0gTlVMTDsKKwkJCWNvbnRpbnVlOworCQl9CisJCXN3aXRjaCAoa2V5LT50eXBlKSB7CisJCWNhc2UgS0VZX1JTQTE6CisJCQlzZW5zaXRpdmVfZGF0YS5zc2gxX2hvc3Rfa2V5ID0ga2V5OworCQkJc2Vuc2l0aXZlX2RhdGEuaGF2ZV9zc2gxX2tleSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBLRVlfUlNBOgorCQljYXNlIEtFWV9EU0E6CisJCWNhc2UgS0VZX0VDRFNBOgorCQkJc2Vuc2l0aXZlX2RhdGEuaGF2ZV9zc2gyX2tleSA9IDE7CisJCQlicmVhazsKKwkJfQorCQlkZWJ1ZygicHJpdmF0ZSBob3N0IGtleTogIyVkIHR5cGUgJWQgJXMiLCBpLCBrZXktPnR5cGUsCisJCSAgICBrZXlfdHlwZShrZXkpKTsKKwl9CisJaWYgKChvcHRpb25zLnByb3RvY29sICYgU1NIX1BST1RPXzEpICYmICFzZW5zaXRpdmVfZGF0YS5oYXZlX3NzaDFfa2V5KSB7CisJCWxvZ2l0KCJEaXNhYmxpbmcgcHJvdG9jb2wgdmVyc2lvbiAxLiBDb3VsZCBub3QgbG9hZCBob3N0IGtleSIpOworCQlvcHRpb25zLnByb3RvY29sICY9IH5TU0hfUFJPVE9fMTsKKwl9CisJaWYgKChvcHRpb25zLnByb3RvY29sICYgU1NIX1BST1RPXzIpICYmICFzZW5zaXRpdmVfZGF0YS5oYXZlX3NzaDJfa2V5KSB7CisJCWxvZ2l0KCJEaXNhYmxpbmcgcHJvdG9jb2wgdmVyc2lvbiAyLiBDb3VsZCBub3QgbG9hZCBob3N0IGtleSIpOworCQlvcHRpb25zLnByb3RvY29sICY9IH5TU0hfUFJPVE9fMjsKKwl9CisJaWYgKCEob3B0aW9ucy5wcm90b2NvbCAmIChTU0hfUFJPVE9fMXxTU0hfUFJPVE9fMikpKSB7CisJCWxvZ2l0KCJzc2hkOiBubyBob3N0a2V5cyBhdmFpbGFibGUgLS0gZXhpdGluZy4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKgorCSAqIExvYWQgY2VydGlmaWNhdGVzLiBUaGV5IGFyZSBzdG9yZWQgaW4gYW4gYXJyYXkgYXQgaWRlbnRpY2FsCisJICogaW5kaWNlcyB0byB0aGUgcHVibGljIGtleXMgdGhhdCB0aGV5IHJlbGF0ZSB0by4KKwkgKi8KKwlzZW5zaXRpdmVfZGF0YS5ob3N0X2NlcnRpZmljYXRlcyA9IHhjYWxsb2Mob3B0aW9ucy5udW1faG9zdF9rZXlfZmlsZXMsCisJICAgIHNpemVvZihLZXkgKikpOworCWZvciAoaSA9IDA7IGkgPCBvcHRpb25zLm51bV9ob3N0X2tleV9maWxlczsgaSsrKQorCQlzZW5zaXRpdmVfZGF0YS5ob3N0X2NlcnRpZmljYXRlc1tpXSA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1faG9zdF9jZXJ0X2ZpbGVzOyBpKyspIHsKKwkJa2V5ID0ga2V5X2xvYWRfcHVibGljKG9wdGlvbnMuaG9zdF9jZXJ0X2ZpbGVzW2ldLCBOVUxMKTsKKwkJaWYgKGtleSA9PSBOVUxMKSB7CisJCQllcnJvcigiQ291bGQgbm90IGxvYWQgaG9zdCBjZXJ0aWZpY2F0ZTogJXMiLAorCQkJICAgIG9wdGlvbnMuaG9zdF9jZXJ0X2ZpbGVzW2ldKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgha2V5X2lzX2NlcnQoa2V5KSkgeworCQkJZXJyb3IoIkNlcnRpZmljYXRlIGZpbGUgaXMgbm90IGEgY2VydGlmaWNhdGU6ICVzIiwKKwkJCSAgICBvcHRpb25zLmhvc3RfY2VydF9maWxlc1tpXSk7CisJCQlrZXlfZnJlZShrZXkpOworCQkJY29udGludWU7CisJCX0KKwkJLyogRmluZCBtYXRjaGluZyBwcml2YXRlIGtleSAqLworCQlmb3IgKGogPSAwOyBqIDwgb3B0aW9ucy5udW1faG9zdF9rZXlfZmlsZXM7IGorKykgeworCQkJaWYgKGtleV9lcXVhbF9wdWJsaWMoa2V5LAorCQkJICAgIHNlbnNpdGl2ZV9kYXRhLmhvc3Rfa2V5c1tqXSkpIHsKKwkJCQlzZW5zaXRpdmVfZGF0YS5ob3N0X2NlcnRpZmljYXRlc1tqXSA9IGtleTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoaiA+PSBvcHRpb25zLm51bV9ob3N0X2tleV9maWxlcykgeworCQkJZXJyb3IoIk5vIG1hdGNoaW5nIHByaXZhdGUga2V5IGZvciBjZXJ0aWZpY2F0ZTogJXMiLAorCQkJICAgIG9wdGlvbnMuaG9zdF9jZXJ0X2ZpbGVzW2ldKTsKKwkJCWtleV9mcmVlKGtleSk7CisJCQljb250aW51ZTsKKwkJfQorCQlzZW5zaXRpdmVfZGF0YS5ob3N0X2NlcnRpZmljYXRlc1tqXSA9IGtleTsKKwkJZGVidWcoImhvc3QgY2VydGlmaWNhdGU6ICMlZCB0eXBlICVkICVzIiwgaiwga2V5LT50eXBlLAorCQkgICAga2V5X3R5cGUoa2V5KSk7CisJfQorCS8qIENoZWNrIGNlcnRhaW4gdmFsdWVzIGZvciBzYW5pdHkuICovCisJaWYgKG9wdGlvbnMucHJvdG9jb2wgJiBTU0hfUFJPVE9fMSkgeworCQlpZiAob3B0aW9ucy5zZXJ2ZXJfa2V5X2JpdHMgPCA1MTIgfHwKKwkJICAgIG9wdGlvbnMuc2VydmVyX2tleV9iaXRzID4gMzI3NjgpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQmFkIHNlcnZlciBrZXkgc2l6ZS5cbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCQkvKgorCQkgKiBDaGVjayB0aGF0IHNlcnZlciBhbmQgaG9zdCBrZXkgbGVuZ3RocyBkaWZmZXIgc3VmZmljaWVudGx5LiBUaGlzCisJCSAqIGlzIG5lY2Vzc2FyeSB0byBtYWtlIGRvdWJsZSBlbmNyeXB0aW9uIHdvcmsgd2l0aCByc2FyZWYuIE9oLCBJCisJCSAqIGhhdGUgc29mdHdhcmUgcGF0ZW50cy4gSSBkb250IGtub3cgaWYgdGhpcyBjYW4gZ28/IE5pZWxzCisJCSAqLworCQlpZiAob3B0aW9ucy5zZXJ2ZXJfa2V5X2JpdHMgPgorCQkgICAgQk5fbnVtX2JpdHMoc2Vuc2l0aXZlX2RhdGEuc3NoMV9ob3N0X2tleS0+cnNhLT5uKSAtCisJCSAgICBTU0hfS0VZX0JJVFNfUkVTRVJWRUQgJiYgb3B0aW9ucy5zZXJ2ZXJfa2V5X2JpdHMgPAorCQkgICAgQk5fbnVtX2JpdHMoc2Vuc2l0aXZlX2RhdGEuc3NoMV9ob3N0X2tleS0+cnNhLT5uKSArCisJCSAgICBTU0hfS0VZX0JJVFNfUkVTRVJWRUQpIHsKKwkJCW9wdGlvbnMuc2VydmVyX2tleV9iaXRzID0KKwkJCSAgICBCTl9udW1fYml0cyhzZW5zaXRpdmVfZGF0YS5zc2gxX2hvc3Rfa2V5LT5yc2EtPm4pICsKKwkJCSAgICBTU0hfS0VZX0JJVFNfUkVTRVJWRUQ7CisJCQlkZWJ1ZygiRm9yY2luZyBzZXJ2ZXIga2V5IHRvICVkIGJpdHMgdG8gbWFrZSBpdCBkaWZmZXIgZnJvbSBob3N0IGtleS4iLAorCQkJICAgIG9wdGlvbnMuc2VydmVyX2tleV9iaXRzKTsKKwkJfQorCX0KKworCWlmICh1c2VfcHJpdnNlcCkgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKworCQlpZiAoKHN0YXQoX1BBVEhfUFJJVlNFUF9DSFJPT1RfRElSLCAmc3QpID09IC0xKSB8fAorCQkgICAgKFNfSVNESVIoc3Quc3RfbW9kZSkgPT0gMCkpCisJCQlmYXRhbCgiTWlzc2luZyBwcml2aWxlZ2Ugc2VwYXJhdGlvbiBkaXJlY3Rvcnk6ICVzIiwKKwkJCSAgICBfUEFUSF9QUklWU0VQX0NIUk9PVF9ESVIpOworCisjaWZkZWYgSEFWRV9DWUdXSU4KKwkJaWYgKGNoZWNrX250c2VjKF9QQVRIX1BSSVZTRVBfQ0hST09UX0RJUikgJiYKKwkJICAgIChzdC5zdF91aWQgIT0gZ2V0dWlkICgpIHx8CisJCSAgICAoc3Quc3RfbW9kZSAmIChTX0lXR1JQfFNfSVdPVEgpKSAhPSAwKSkKKyNlbHNlCisJCWlmIChzdC5zdF91aWQgIT0gMCB8fCAoc3Quc3RfbW9kZSAmIChTX0lXR1JQfFNfSVdPVEgpKSAhPSAwKQorI2VuZGlmCisJCQlmYXRhbCgiJXMgbXVzdCBiZSBvd25lZCBieSByb290IGFuZCBub3QgZ3JvdXAgb3IgIgorCQkJICAgICJ3b3JsZC13cml0YWJsZS4iLCBfUEFUSF9QUklWU0VQX0NIUk9PVF9ESVIpOworCX0KKworCWlmICh0ZXN0X2ZsYWcgPiAxKSB7CisJCWlmICh0ZXN0X3VzZXIgIT0gTlVMTCAmJiB0ZXN0X2FkZHIgIT0gTlVMTCAmJiB0ZXN0X2hvc3QgIT0gTlVMTCkKKwkJCXBhcnNlX3NlcnZlcl9tYXRjaF9jb25maWcoJm9wdGlvbnMsIHRlc3RfdXNlciwKKwkJCSAgICB0ZXN0X2hvc3QsIHRlc3RfYWRkcik7CisJCWR1bXBfY29uZmlnKCZvcHRpb25zKTsKKwl9CisKKwkvKiBDb25maWd1cmF0aW9uIGxvb2tzIGdvb2QsIHNvIGV4aXQgaWYgaW4gdGVzdCBtb2RlLiAqLworCWlmICh0ZXN0X2ZsYWcpCisJCWV4aXQoMCk7CisKKwkvKgorCSAqIENsZWFyIG91dCBhbnkgc3VwcGxlbWVudGFsIGdyb3VwcyB3ZSBtYXkgaGF2ZSBpbmhlcml0ZWQuICBUaGlzCisJICogcHJldmVudHMgaW5hZHZlcnRlbnQgY3JlYXRpb24gb2YgZmlsZXMgd2l0aCBiYWQgbW9kZXMgKGluIHRoZQorCSAqIHBvcnRhYmxlIHZlcnNpb24gYXQgbGVhc3QsIGl0J3MgY2VydGFpbmx5IHBvc3NpYmxlIGZvciBQQU0KKwkgKiB0byBjcmVhdGUgYSBmaWxlLCBhbmQgd2UgY2FuJ3QgY29udHJvbCB0aGUgY29kZSBpbiBldmVyeQorCSAqIG1vZHVsZSB3aGljaCBtaWdodCBiZSB1c2VkKS4KKwkgKi8KKwlpZiAoc2V0Z3JvdXBzKDAsIE5VTEwpIDwgMCkKKwkJZGVidWcoInNldGdyb3VwcygpIGZhaWxlZDogJS4yMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKKworCWlmIChyZXhlY19mbGFnKSB7CisJCXJleGVjX2FyZ3YgPSB4Y2FsbG9jKHJleGVjX2FyZ2MgKyAyLCBzaXplb2YoY2hhciAqKSk7CisJCWZvciAoaSA9IDA7IGkgPCByZXhlY19hcmdjOyBpKyspIHsKKwkJCWRlYnVnKCJyZXhlY19hcmd2WyVkXT0nJXMnIiwgaSwgc2F2ZWRfYXJndltpXSk7CisJCQlyZXhlY19hcmd2W2ldID0gc2F2ZWRfYXJndltpXTsKKwkJfQorCQlyZXhlY19hcmd2W3JleGVjX2FyZ2NdID0gIi1SIjsKKwkJcmV4ZWNfYXJndltyZXhlY19hcmdjICsgMV0gPSBOVUxMOworCX0KKworCS8qIEVuc3VyZSB0aGF0IHVtYXNrIGRpc2FsbG93cyBhdCBsZWFzdCBncm91cCBhbmQgd29ybGQgd3JpdGUgKi8KKwluZXdfdW1hc2sgPSB1bWFzaygwMDc3KSB8IDAwMjI7CisJKHZvaWQpIHVtYXNrKG5ld191bWFzayk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBsb2cgKGl0IGlzIHJlaW5pdGlhbGl6ZWQgYmVsb3cgaW4gY2FzZSB3ZSBmb3JrZWQpLiAqLworCWlmIChkZWJ1Z19mbGFnICYmICghaW5ldGRfZmxhZyB8fCByZXhlY2VkX2ZsYWcpKQorCQlsb2dfc3RkZXJyID0gMTsKKwlsb2dfaW5pdChfX3Byb2duYW1lLCBvcHRpb25zLmxvZ19sZXZlbCwgb3B0aW9ucy5sb2dfZmFjaWxpdHksIGxvZ19zdGRlcnIpOworCisJLyoKKwkgKiBJZiBub3QgaW4gZGVidWdnaW5nIG1vZGUsIGFuZCBub3Qgc3RhcnRlZCBmcm9tIGluZXRkLCBkaXNjb25uZWN0CisJICogZnJvbSB0aGUgY29udHJvbGxpbmcgdGVybWluYWwsIGFuZCBmb3JrLiAgVGhlIG9yaWdpbmFsIHByb2Nlc3MKKwkgKiBleGl0cy4KKwkgKi8KKwlpZiAoIShkZWJ1Z19mbGFnIHx8IGluZXRkX2ZsYWcgfHwgbm9fZGFlbW9uX2ZsYWcpKSB7CisjaWZkZWYgVElPQ05PVFRZCisJCWludCBmZDsKKyNlbmRpZiAvKiBUSU9DTk9UVFkgKi8KKwkJaWYgKGRhZW1vbigwLCAwKSA8IDApCisJCQlmYXRhbCgiZGFlbW9uKCkgZmFpbGVkOiAlLjIwMHMiLCBzdHJlcnJvcihlcnJubykpOworCisJCS8qIERpc2Nvbm5lY3QgZnJvbSB0aGUgY29udHJvbGxpbmcgdHR5LiAqLworI2lmZGVmIFRJT0NOT1RUWQorCQlmZCA9IG9wZW4oX1BBVEhfVFRZLCBPX1JEV1IgfCBPX05PQ1RUWSk7CisJCWlmIChmZCA+PSAwKSB7CisJCQkodm9pZCkgaW9jdGwoZmQsIFRJT0NOT1RUWSwgTlVMTCk7CisJCQljbG9zZShmZCk7CisJCX0KKyNlbmRpZiAvKiBUSU9DTk9UVFkgKi8KKwl9CisJLyogUmVpbml0aWFsaXplIHRoZSBsb2cgKGJlY2F1c2Ugb2YgdGhlIGZvcmsgYWJvdmUpLiAqLworCWxvZ19pbml0KF9fcHJvZ25hbWUsIG9wdGlvbnMubG9nX2xldmVsLCBvcHRpb25zLmxvZ19mYWNpbGl0eSwgbG9nX3N0ZGVycik7CisKKwkvKiBJbml0aWFsaXplIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4gKi8KKwlhcmM0cmFuZG9tX3N0aXIoKTsKKworCS8qIENoZGlyIHRvIHRoZSByb290IGRpcmVjdG9yeSBzbyB0aGF0IHRoZSBjdXJyZW50IGRpc2sgY2FuIGJlCisJICAgdW5tb3VudGVkIGlmIGRlc2lyZWQuICovCisJY2hkaXIoIi8iKTsKKworCS8qIGlnbm9yZSBTSUdQSVBFICovCisJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCisJLyogR2V0IGEgY29ubmVjdGlvbiwgZWl0aGVyIGZyb20gaW5ldGQgb3IgYSBsaXN0ZW5pbmcgVENQIHNvY2tldCAqLworCWlmIChpbmV0ZF9mbGFnKSB7CisJCXNlcnZlcl9hY2NlcHRfaW5ldGQoJnNvY2tfaW4sICZzb2NrX291dCk7CisJfSBlbHNlIHsKKwkJcGxhdGZvcm1fcHJlX2xpc3RlbigpOworCQlzZXJ2ZXJfbGlzdGVuKCk7CisKKwkJaWYgKG9wdGlvbnMucHJvdG9jb2wgJiBTU0hfUFJPVE9fMSkKKwkJCWdlbmVyYXRlX2VwaGVtZXJhbF9zZXJ2ZXJfa2V5KCk7CisKKwkJc2lnbmFsKFNJR0hVUCwgc2lnaHVwX2hhbmRsZXIpOworCQlzaWduYWwoU0lHQ0hMRCwgbWFpbl9zaWdjaGxkX2hhbmRsZXIpOworCQlzaWduYWwoU0lHVEVSTSwgc2lndGVybV9oYW5kbGVyKTsKKwkJc2lnbmFsKFNJR1FVSVQsIHNpZ3Rlcm1faGFuZGxlcik7CisKKwkJLyoKKwkJICogV3JpdGUgb3V0IHRoZSBwaWQgZmlsZSBhZnRlciB0aGUgc2lndGVybSBoYW5kbGVyCisJCSAqIGlzIHNldHVwIGFuZCB0aGUgbGlzdGVuIHNvY2tldHMgYXJlIGJvdW5kCisJCSAqLworCQlpZiAoIWRlYnVnX2ZsYWcpIHsKKwkJCUZJTEUgKmYgPSBmb3BlbihvcHRpb25zLnBpZF9maWxlLCAidyIpOworCisJCQlpZiAoZiA9PSBOVUxMKSB7CisJCQkJZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBwaWQgZmlsZSBcIiVzXCI6ICVzIiwKKwkJCQkgICAgb3B0aW9ucy5waWRfZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50ZihmLCAiJWxkXG4iLCAobG9uZykgZ2V0cGlkKCkpOworCQkJCWZjbG9zZShmKTsKKwkJCX0KKwkJfQorCisJCS8qIEFjY2VwdCBhIGNvbm5lY3Rpb24gYW5kIHJldHVybiBpbiBhIGZvcmtlZCBjaGlsZCAqLworCQlzZXJ2ZXJfYWNjZXB0X2xvb3AoJnNvY2tfaW4sICZzb2NrX291dCwKKwkJICAgICZuZXdzb2NrLCBjb25maWdfcyk7CisJfQorCisJLyogVGhpcyBpcyB0aGUgY2hpbGQgcHJvY2Vzc2luZyBhIG5ldyBjb25uZWN0aW9uLiAqLworCXNldHByb2N0aXRsZSgiJXMiLCAiW2FjY2VwdGVkXSIpOworCisJLyoKKwkgKiBDcmVhdGUgYSBuZXcgc2Vzc2lvbiBhbmQgcHJvY2VzcyBncm91cCBzaW5jZSB0aGUgNC40QlNECisJICogc2V0bG9naW4oKSBhZmZlY3RzIHRoZSBlbnRpcmUgcHJvY2VzcyBncm91cC4gIFdlIGRvbid0CisJICogd2FudCB0aGUgY2hpbGQgdG8gYmUgYWJsZSB0byBhZmZlY3QgdGhlIHBhcmVudC4KKwkgKi8KKyNpZiAhZGVmaW5lZChTU0hEX0FDUVVJUkVTX0NUVFkpCisJLyoKKwkgKiBJZiBzZXRzaWQgaXMgY2FsbGVkLCBvbiBzb21lIHBsYXRmb3JtcyBzc2hkIHdpbGwgbGF0ZXIgYWNxdWlyZSBhCisJICogY29udHJvbGxpbmcgdGVybWluYWwgd2hpY2ggd2lsbCByZXN1bHQgaW4gImNvdWxkIG5vdCBzZXQKKwkgKiBjb250cm9sbGluZyB0dHkiIGVycm9ycy4KKwkgKi8KKwlpZiAoIWRlYnVnX2ZsYWcgJiYgIWluZXRkX2ZsYWcgJiYgc2V0c2lkKCkgPCAwKQorCQllcnJvcigic2V0c2lkOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworI2VuZGlmCisKKwlpZiAocmV4ZWNfZmxhZykgeworCQlpbnQgZmQ7CisKKwkJZGVidWcoInJleGVjIHN0YXJ0IGluICVkIG91dCAlZCBuZXdzb2NrICVkIHBpcGUgJWQgc29jayAlZCIsCisJCSAgICBzb2NrX2luLCBzb2NrX291dCwgbmV3c29jaywgc3RhcnR1cF9waXBlLCBjb25maWdfc1swXSk7CisJCWR1cDIobmV3c29jaywgU1RESU5fRklMRU5PKTsKKwkJZHVwMihTVERJTl9GSUxFTk8sIFNURE9VVF9GSUxFTk8pOworCQlpZiAoc3RhcnR1cF9waXBlID09IC0xKQorCQkJY2xvc2UoUkVFWEVDX1NUQVJUVVBfUElQRV9GRCk7CisJCWVsc2UKKwkJCWR1cDIoc3RhcnR1cF9waXBlLCBSRUVYRUNfU1RBUlRVUF9QSVBFX0ZEKTsKKworCQlkdXAyKGNvbmZpZ19zWzFdLCBSRUVYRUNfQ09ORklHX1BBU1NfRkQpOworCQljbG9zZShjb25maWdfc1sxXSk7CisJCWlmIChzdGFydHVwX3BpcGUgIT0gLTEpCisJCQljbG9zZShzdGFydHVwX3BpcGUpOworCisJCWV4ZWN2KHJleGVjX2FyZ3ZbMF0sIHJleGVjX2FyZ3YpOworCisJCS8qIFJlZXhlYyBoYXMgZmFpbGVkLCBmYWxsIGJhY2sgYW5kIGNvbnRpbnVlICovCisJCWVycm9yKCJyZXhlYyBvZiAlcyBmYWlsZWQ6ICVzIiwgcmV4ZWNfYXJndlswXSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmVjdl9yZXhlY19zdGF0ZShSRUVYRUNfQ09ORklHX1BBU1NfRkQsIE5VTEwpOworCQlsb2dfaW5pdChfX3Byb2duYW1lLCBvcHRpb25zLmxvZ19sZXZlbCwKKwkJICAgIG9wdGlvbnMubG9nX2ZhY2lsaXR5LCBsb2dfc3RkZXJyKTsKKworCQkvKiBDbGVhbiB1cCBmZHMgKi8KKwkJc3RhcnR1cF9waXBlID0gUkVFWEVDX1NUQVJUVVBfUElQRV9GRDsKKwkJY2xvc2UoY29uZmlnX3NbMV0pOworCQljbG9zZShSRUVYRUNfQ09ORklHX1BBU1NfRkQpOworCQluZXdzb2NrID0gc29ja19vdXQgPSBzb2NrX2luID0gZHVwKFNURElOX0ZJTEVOTyk7CisJCWlmICgoZmQgPSBvcGVuKF9QQVRIX0RFVk5VTEwsIE9fUkRXUiwgMCkpICE9IC0xKSB7CisJCQlkdXAyKGZkLCBTVERJTl9GSUxFTk8pOworCQkJZHVwMihmZCwgU1RET1VUX0ZJTEVOTyk7CisJCQlpZiAoZmQgPiBTVERFUlJfRklMRU5PKQorCQkJCWNsb3NlKGZkKTsKKwkJfQorCQlkZWJ1ZygicmV4ZWMgY2xlYW51cCBpbiAlZCBvdXQgJWQgbmV3c29jayAlZCBwaXBlICVkIHNvY2sgJWQiLAorCQkgICAgc29ja19pbiwgc29ja19vdXQsIG5ld3NvY2ssIHN0YXJ0dXBfcGlwZSwgY29uZmlnX3NbMF0pOworCX0KKworCS8qIEV4ZWN1dGVkIGNoaWxkIHByb2Nlc3NlcyBkb24ndCBuZWVkIHRoZXNlLiAqLworCWZjbnRsKHNvY2tfb3V0LCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKwlmY250bChzb2NrX2luLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKworCS8qCisJICogRGlzYWJsZSB0aGUga2V5IHJlZ2VuZXJhdGlvbiBhbGFybS4gIFdlIHdpbGwgbm90IHJlZ2VuZXJhdGUgdGhlCisJICoga2V5IHNpbmNlIHdlIGFyZSBubyBsb25nZXIgaW4gYSBwb3NpdGlvbiB0byBnaXZlIGl0IHRvIGFueW9uZS4gV2UKKwkgKiB3aWxsIG5vdCByZXN0YXJ0IG9uIFNJR0hVUCBzaW5jZSBpdCBubyBsb25nZXIgbWFrZXMgc2Vuc2UuCisJICovCisJYWxhcm0oMCk7CisJc2lnbmFsKFNJR0FMUk0sIFNJR19ERkwpOworCXNpZ25hbChTSUdIVVAsIFNJR19ERkwpOworCXNpZ25hbChTSUdURVJNLCBTSUdfREZMKTsKKwlzaWduYWwoU0lHUVVJVCwgU0lHX0RGTCk7CisJc2lnbmFsKFNJR0NITEQsIFNJR19ERkwpOworCXNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworCisJLyoKKwkgKiBSZWdpc3RlciBvdXIgY29ubmVjdGlvbi4gIFRoaXMgdHVybnMgZW5jcnlwdGlvbiBvZmYgYmVjYXVzZSB3ZSBkbworCSAqIG5vdCBoYXZlIGEga2V5LgorCSAqLworCXBhY2tldF9zZXRfY29ubmVjdGlvbihzb2NrX2luLCBzb2NrX291dCk7CisJcGFja2V0X3NldF9zZXJ2ZXIoKTsKKworCS8qIFNldCBTT19LRUVQQUxJVkUgaWYgcmVxdWVzdGVkLiAqLworCWlmIChvcHRpb25zLnRjcF9rZWVwX2FsaXZlICYmIHBhY2tldF9jb25uZWN0aW9uX2lzX29uX3NvY2tldCgpICYmCisJICAgIHNldHNvY2tvcHQoc29ja19pbiwgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAmb24sIHNpemVvZihvbikpIDwgMCkKKwkJZXJyb3IoInNldHNvY2tvcHQgU09fS0VFUEFMSVZFOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCisJaWYgKChyZW1vdGVfcG9ydCA9IGdldF9yZW1vdGVfcG9ydCgpKSA8IDApIHsKKwkJZGVidWcoImdldF9yZW1vdGVfcG9ydCBmYWlsZWQiKTsKKwkJY2xlYW51cF9leGl0KDI1NSk7CisJfQorCisJLyoKKwkgKiBXZSB1c2UgZ2V0X2Nhbm9uaWNhbF9ob3N0bmFtZSB3aXRoIHVzZWRucyA9IDAgaW5zdGVhZCBvZgorCSAqIGdldF9yZW1vdGVfaXBhZGRyIGhlcmUgc28gSVAgb3B0aW9ucyB3aWxsIGJlIGNoZWNrZWQuCisJICovCisJKHZvaWQpIGdldF9jYW5vbmljYWxfaG9zdG5hbWUoMCk7CisJLyoKKwkgKiBUaGUgcmVzdCBvZiB0aGUgY29kZSBkZXBlbmRzIG9uIHRoZSBmYWN0IHRoYXQKKwkgKiBnZXRfcmVtb3RlX2lwYWRkcigpIGNhY2hlcyB0aGUgcmVtb3RlIGlwLCBldmVuIGlmCisJICogdGhlIHNvY2tldCBnb2VzIGF3YXkuCisJICovCisJcmVtb3RlX2lwID0gZ2V0X3JlbW90ZV9pcGFkZHIoKTsKKworI2lmZGVmIFNTSF9BVURJVF9FVkVOVFMKKwlhdWRpdF9jb25uZWN0aW9uX2Zyb20ocmVtb3RlX2lwLCByZW1vdGVfcG9ydCk7CisjZW5kaWYKKyNpZmRlZiBMSUJXUkFQCisJYWxsb3dfc2V2ZXJpdHkgPSBvcHRpb25zLmxvZ19mYWNpbGl0eXxMT0dfSU5GTzsKKwlkZW55X3NldmVyaXR5ID0gb3B0aW9ucy5sb2dfZmFjaWxpdHl8TE9HX1dBUk5JTkc7CisJLyogQ2hlY2sgd2hldGhlciBsb2dpbnMgYXJlIGRlbmllZCBmcm9tIHRoaXMgaG9zdC4gKi8KKwlpZiAocGFja2V0X2Nvbm5lY3Rpb25faXNfb25fc29ja2V0KCkpIHsKKwkJc3RydWN0IHJlcXVlc3RfaW5mbyByZXE7CisKKwkJcmVxdWVzdF9pbml0KCZyZXEsIFJRX0RBRU1PTiwgX19wcm9nbmFtZSwgUlFfRklMRSwgc29ja19pbiwgMCk7CisJCWZyb21ob3N0KCZyZXEpOworCisJCWlmICghaG9zdHNfYWNjZXNzKCZyZXEpKSB7CisJCQlkZWJ1ZygiQ29ubmVjdGlvbiByZWZ1c2VkIGJ5IHRjcCB3cmFwcGVyIik7CisJCQlyZWZ1c2UoJnJlcSk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCQlmYXRhbCgibGlid3JhcCByZWZ1c2UgcmV0dXJucyIpOworCQl9CisJfQorI2VuZGlmIC8qIExJQldSQVAgKi8KKworCS8qIExvZyB0aGUgY29ubmVjdGlvbi4gKi8KKwl2ZXJib3NlKCJDb25uZWN0aW9uIGZyb20gJS41MDBzIHBvcnQgJWQiLCByZW1vdGVfaXAsIHJlbW90ZV9wb3J0KTsKKworCS8qCisJICogV2UgZG9uJ3Qgd2FudCB0byBsaXN0ZW4gZm9yZXZlciB1bmxlc3MgdGhlIG90aGVyIHNpZGUKKwkgKiBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlcyBpdHNlbGYuICBTbyB3ZSBzZXQgdXAgYW4gYWxhcm0gd2hpY2ggaXMKKwkgKiBjbGVhcmVkIGFmdGVyIHN1Y2Nlc3NmdWwgYXV0aGVudGljYXRpb24uICBBIGxpbWl0IG9mIHplcm8KKwkgKiBpbmRpY2F0ZXMgbm8gbGltaXQuIE5vdGUgdGhhdCB3ZSBkb24ndCBzZXQgdGhlIGFsYXJtIGluIGRlYnVnZ2luZworCSAqIG1vZGU7IGl0IGlzIGp1c3QgYW5ub3lpbmcgdG8gaGF2ZSB0aGUgc2VydmVyIGV4aXQganVzdCB3aGVuIHlvdQorCSAqIGFyZSBhYm91dCB0byBkaXNjb3ZlciB0aGUgYnVnLgorCSAqLworCXNpZ25hbChTSUdBTFJNLCBncmFjZV9hbGFybV9oYW5kbGVyKTsKKwlpZiAoIWRlYnVnX2ZsYWcpCisJCWFsYXJtKG9wdGlvbnMubG9naW5fZ3JhY2VfdGltZSk7CisKKwlzc2hkX2V4Y2hhbmdlX2lkZW50aWZpY2F0aW9uKHNvY2tfaW4sIHNvY2tfb3V0KTsKKworCS8qIEluIGluZXRkIG1vZGUsIGdlbmVyYXRlIGVwaGVtZXJhbCBrZXkgb25seSBmb3IgcHJvdG8gMSBjb25uZWN0aW9ucyAqLworCWlmICghY29tcGF0MjAgJiYgaW5ldGRfZmxhZyAmJiBzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5ID09IE5VTEwpCisJCWdlbmVyYXRlX2VwaGVtZXJhbF9zZXJ2ZXJfa2V5KCk7CisKKwlwYWNrZXRfc2V0X25vbmJsb2NraW5nKCk7CisKKwkvKiBhbGxvY2F0ZSBhdXRoZW50aWNhdGlvbiBjb250ZXh0ICovCisJYXV0aGN0eHQgPSB4Y2FsbG9jKDEsIHNpemVvZigqYXV0aGN0eHQpKTsKKworCWF1dGhjdHh0LT5sb2dpbm1zZyA9ICZsb2dpbm1zZzsKKworCS8qIFhYWCBnbG9iYWwgZm9yIGNsZWFudXAsIGFjY2VzcyBmcm9tIG90aGVyIG1vZHVsZXMgKi8KKwl0aGVfYXV0aGN0eHQgPSBhdXRoY3R4dDsKKworCS8qIHByZXBhcmUgYnVmZmVyIHRvIGNvbGxlY3QgbWVzc2FnZXMgdG8gZGlzcGxheSB0byB1c2VyIGFmdGVyIGxvZ2luICovCisJYnVmZmVyX2luaXQoJmxvZ2lubXNnKTsKKwlhdXRoX2RlYnVnX3Jlc2V0KCk7CisKKwlpZiAodXNlX3ByaXZzZXApCisJCWlmIChwcml2c2VwX3ByZWF1dGgoYXV0aGN0eHQpID09IDEpCisJCQlnb3RvIGF1dGhlbnRpY2F0ZWQ7CisKKwkvKiBwZXJmb3JtIHRoZSBrZXkgZXhjaGFuZ2UgKi8KKwkvKiBhdXRoZW50aWNhdGUgdXNlciBhbmQgc3RhcnQgc2Vzc2lvbiAqLworCWlmIChjb21wYXQyMCkgeworCQlkb19zc2gyX2tleCgpOworCQlkb19hdXRoZW50aWNhdGlvbjIoYXV0aGN0eHQpOworCX0gZWxzZSB7CisJCWRvX3NzaDFfa2V4KCk7CisJCWRvX2F1dGhlbnRpY2F0aW9uKGF1dGhjdHh0KTsKKwl9CisJLyoKKwkgKiBJZiB3ZSB1c2UgcHJpdmlsZWdlIHNlcGFyYXRpb24sIHRoZSB1bnByaXZpbGVnZWQgY2hpbGQgdHJhbnNmZXJzCisJICogdGhlIGN1cnJlbnQga2V5c3RhdGUgYW5kIGV4aXRzCisJICovCisJaWYgKHVzZV9wcml2c2VwKSB7CisJCW1tX3NlbmRfa2V5c3RhdGUocG1vbml0b3IpOworCQlleGl0KDApOworCX0KKworIGF1dGhlbnRpY2F0ZWQ6CisJLyoKKwkgKiBDYW5jZWwgdGhlIGFsYXJtIHdlIHNldCB0byBsaW1pdCB0aGUgdGltZSB0YWtlbiBmb3IKKwkgKiBhdXRoZW50aWNhdGlvbi4KKwkgKi8KKwlhbGFybSgwKTsKKwlzaWduYWwoU0lHQUxSTSwgU0lHX0RGTCk7CisJYXV0aGN0eHQtPmF1dGhlbnRpY2F0ZWQgPSAxOworCWlmIChzdGFydHVwX3BpcGUgIT0gLTEpIHsKKwkJY2xvc2Uoc3RhcnR1cF9waXBlKTsKKwkJc3RhcnR1cF9waXBlID0gLTE7CisJfQorCisjaWZkZWYgU1NIX0FVRElUX0VWRU5UUworCWF1ZGl0X2V2ZW50KFNTSF9BVVRIX1NVQ0NFU1MpOworI2VuZGlmCisKKyNpZmRlZiBHU1NBUEkKKwlpZiAob3B0aW9ucy5nc3NfYXV0aGVudGljYXRpb24pIHsKKwkJdGVtcG9yYXJpbHlfdXNlX3VpZChhdXRoY3R4dC0+cHcpOworCQlzc2hfZ3NzYXBpX3N0b3JlY3JlZHMoKTsKKwkJcmVzdG9yZV91aWQoKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBVU0VfUEFNCisJaWYgKG9wdGlvbnMudXNlX3BhbSkgeworCQlkb19wYW1fc2V0Y3JlZCgxKTsKKwkJZG9fcGFtX3Nlc3Npb24oKTsKKwl9CisjZW5kaWYKKworCS8qCisJICogSW4gcHJpdmlsZWdlIHNlcGFyYXRpb24sIHdlIGZvcmsgYW5vdGhlciBjaGlsZCBhbmQgcHJlcGFyZQorCSAqIGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nLgorCSAqLworCWlmICh1c2VfcHJpdnNlcCkgeworCQlwcml2c2VwX3Bvc3RhdXRoKGF1dGhjdHh0KTsKKwkJLyogdGhlIG1vbml0b3IgcHJvY2VzcyBbcHJpdl0gd2lsbCBub3QgcmV0dXJuICovCisJCWlmICghY29tcGF0MjApCisJCQlkZXN0cm95X3NlbnNpdGl2ZV9kYXRhKCk7CisJfQorCisJcGFja2V0X3NldF90aW1lb3V0KG9wdGlvbnMuY2xpZW50X2FsaXZlX2ludGVydmFsLAorCSAgICBvcHRpb25zLmNsaWVudF9hbGl2ZV9jb3VudF9tYXgpOworCisJLyogU3RhcnQgc2Vzc2lvbi4gKi8KKwlkb19hdXRoZW50aWNhdGVkKGF1dGhjdHh0KTsKKworCS8qIFRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIHRlcm1pbmF0ZWQuICovCisJcGFja2V0X2dldF9zdGF0ZShNT0RFX0lOLCBOVUxMLCBOVUxMLCBOVUxMLCAmaWJ5dGVzKTsKKwlwYWNrZXRfZ2V0X3N0YXRlKE1PREVfT1VULCBOVUxMLCBOVUxMLCBOVUxMLCAmb2J5dGVzKTsKKwl2ZXJib3NlKCJUcmFuc2ZlcnJlZDogc2VudCAlbGx1LCByZWNlaXZlZCAlbGx1IGJ5dGVzIiwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvYnl0ZXMsICh1bnNpZ25lZCBsb25nIGxvbmcpaWJ5dGVzKTsKKworCXZlcmJvc2UoIkNsb3NpbmcgY29ubmVjdGlvbiB0byAlLjUwMHMgcG9ydCAlZCIsIHJlbW90ZV9pcCwgcmVtb3RlX3BvcnQpOworCisjaWZkZWYgVVNFX1BBTQorCWlmIChvcHRpb25zLnVzZV9wYW0pCisJCWZpbmlzaF9wYW0oKTsKKyNlbmRpZiAvKiBVU0VfUEFNICovCisKKyNpZmRlZiBTU0hfQVVESVRfRVZFTlRTCisJUFJJVlNFUChhdWRpdF9ldmVudChTU0hfQ09OTkVDVElPTl9DTE9TRSkpOworI2VuZGlmCisKKwlwYWNrZXRfY2xvc2UoKTsKKworCWlmICh1c2VfcHJpdnNlcCkKKwkJbW1fdGVybWluYXRlKCk7CisKKwlleGl0KDApOworfQorCisvKgorICogRGVjcnlwdCBzZXNzaW9uX2tleV9pbnQgdXNpbmcgb3VyIHByaXZhdGUgc2VydmVyIGtleSBhbmQgcHJpdmF0ZSBob3N0IGtleQorICogKGtleSB3aXRoIGxhcmdlciBtb2R1bHVzIGZpcnN0KS4KKyAqLworaW50Citzc2gxX3Nlc3Npb25fa2V5KEJJR05VTSAqc2Vzc2lvbl9rZXlfaW50KQoreworCWludCByc2FmYWlsID0gMDsKKworCWlmIChCTl9jbXAoc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleS0+cnNhLT5uLAorCSAgICBzZW5zaXRpdmVfZGF0YS5zc2gxX2hvc3Rfa2V5LT5yc2EtPm4pID4gMCkgeworCQkvKiBTZXJ2ZXIga2V5IGhhcyBiaWdnZXIgbW9kdWx1cy4gKi8KKwkJaWYgKEJOX251bV9iaXRzKHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXktPnJzYS0+bikgPAorCQkgICAgQk5fbnVtX2JpdHMoc2Vuc2l0aXZlX2RhdGEuc3NoMV9ob3N0X2tleS0+cnNhLT5uKSArCisJCSAgICBTU0hfS0VZX0JJVFNfUkVTRVJWRUQpIHsKKwkJCWZhdGFsKCJkb19jb25uZWN0aW9uOiAlczogIgorCQkJICAgICJzZXJ2ZXJfa2V5ICVkIDwgaG9zdF9rZXkgJWQgKyBTU0hfS0VZX0JJVFNfUkVTRVJWRUQgJWQiLAorCQkJICAgIGdldF9yZW1vdGVfaXBhZGRyKCksCisJCQkgICAgQk5fbnVtX2JpdHMoc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleS0+cnNhLT5uKSwKKwkJCSAgICBCTl9udW1fYml0cyhzZW5zaXRpdmVfZGF0YS5zc2gxX2hvc3Rfa2V5LT5yc2EtPm4pLAorCQkJICAgIFNTSF9LRVlfQklUU19SRVNFUlZFRCk7CisJCX0KKwkJaWYgKHJzYV9wcml2YXRlX2RlY3J5cHQoc2Vzc2lvbl9rZXlfaW50LCBzZXNzaW9uX2tleV9pbnQsCisJCSAgICBzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5LT5yc2EpIDw9IDApCisJCQlyc2FmYWlsKys7CisJCWlmIChyc2FfcHJpdmF0ZV9kZWNyeXB0KHNlc3Npb25fa2V5X2ludCwgc2Vzc2lvbl9rZXlfaW50LAorCQkgICAgc2Vuc2l0aXZlX2RhdGEuc3NoMV9ob3N0X2tleS0+cnNhKSA8PSAwKQorCQkJcnNhZmFpbCsrOworCX0gZWxzZSB7CisJCS8qIEhvc3Qga2V5IGhhcyBiaWdnZXIgbW9kdWx1cyAob3IgdGhleSBhcmUgZXF1YWwpLiAqLworCQlpZiAoQk5fbnVtX2JpdHMoc2Vuc2l0aXZlX2RhdGEuc3NoMV9ob3N0X2tleS0+cnNhLT5uKSA8CisJCSAgICBCTl9udW1fYml0cyhzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5LT5yc2EtPm4pICsKKwkJICAgIFNTSF9LRVlfQklUU19SRVNFUlZFRCkgeworCQkJZmF0YWwoImRvX2Nvbm5lY3Rpb246ICVzOiAiCisJCQkgICAgImhvc3Rfa2V5ICVkIDwgc2VydmVyX2tleSAlZCArIFNTSF9LRVlfQklUU19SRVNFUlZFRCAlZCIsCisJCQkgICAgZ2V0X3JlbW90ZV9pcGFkZHIoKSwKKwkJCSAgICBCTl9udW1fYml0cyhzZW5zaXRpdmVfZGF0YS5zc2gxX2hvc3Rfa2V5LT5yc2EtPm4pLAorCQkJICAgIEJOX251bV9iaXRzKHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXktPnJzYS0+biksCisJCQkgICAgU1NIX0tFWV9CSVRTX1JFU0VSVkVEKTsKKwkJfQorCQlpZiAocnNhX3ByaXZhdGVfZGVjcnlwdChzZXNzaW9uX2tleV9pbnQsIHNlc3Npb25fa2V5X2ludCwKKwkJICAgIHNlbnNpdGl2ZV9kYXRhLnNzaDFfaG9zdF9rZXktPnJzYSkgPCAwKQorCQkJcnNhZmFpbCsrOworCQlpZiAocnNhX3ByaXZhdGVfZGVjcnlwdChzZXNzaW9uX2tleV9pbnQsIHNlc3Npb25fa2V5X2ludCwKKwkJICAgIHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXktPnJzYSkgPCAwKQorCQkJcnNhZmFpbCsrOworCX0KKwlyZXR1cm4gKHJzYWZhaWwpOworfQorLyoKKyAqIFNTSDEga2V5IGV4Y2hhbmdlCisgKi8KK3N0YXRpYyB2b2lkCitkb19zc2gxX2tleCh2b2lkKQoreworCWludCBpLCBsZW47CisJaW50IHJzYWZhaWwgPSAwOworCUJJR05VTSAqc2Vzc2lvbl9rZXlfaW50OworCXVfY2hhciBzZXNzaW9uX2tleVtTU0hfU0VTU0lPTl9LRVlfTEVOR1RIXTsKKwl1X2NoYXIgY29va2llWzhdOworCXVfaW50IGNpcGhlcl90eXBlLCBhdXRoX21hc2ssIHByb3RvY29sX2ZsYWdzOworCisJLyoKKwkgKiBHZW5lcmF0ZSBjaGVjayBieXRlcyB0aGF0IHRoZSBjbGllbnQgbXVzdCBzZW5kIGJhY2sgaW4gdGhlIHVzZXIKKwkgKiBwYWNrZXQgaW4gb3JkZXIgZm9yIGl0IHRvIGJlIGFjY2VwdGVkOyB0aGlzIGlzIHVzZWQgdG8gZGVmeSBpcAorCSAqIHNwb29maW5nIGF0dGFja3MuICBOb3RlIHRoYXQgdGhpcyBvbmx5IHdvcmtzIGFnYWluc3Qgc29tZWJvZHkKKwkgKiBkb2luZyBJUCBzcG9vZmluZyBmcm9tIGEgcmVtb3RlIG1hY2hpbmU7IGFueSBtYWNoaW5lIG9uIHRoZSBsb2NhbAorCSAqIG5ldHdvcmsgY2FuIHN0aWxsIHNlZSBvdXRnb2luZyBwYWNrZXRzIGFuZCBjYXRjaCB0aGUgcmFuZG9tCisJICogY29va2llLiAgVGhpcyBvbmx5IGFmZmVjdHMgcmhvc3RzIGF1dGhlbnRpY2F0aW9uLCBhbmQgdGhpcyBpcyBvbmUKKwkgKiBvZiB0aGUgcmVhc29ucyB3aHkgaXQgaXMgaW5oZXJlbnRseSBpbnNlY3VyZS4KKwkgKi8KKwlhcmM0cmFuZG9tX2J1Zihjb29raWUsIHNpemVvZihjb29raWUpKTsKKworCS8qCisJICogU2VuZCBvdXIgcHVibGljIGtleS4gIFdlIGluY2x1ZGUgaW4gdGhlIHBhY2tldCA2NCBiaXRzIG9mIHJhbmRvbQorCSAqIGRhdGEgdGhhdCBtdXN0IGJlIG1hdGNoZWQgaW4gdGhlIHJlcGx5IGluIG9yZGVyIHRvIHByZXZlbnQgSVAKKwkgKiBzcG9vZmluZy4KKwkgKi8KKwlwYWNrZXRfc3RhcnQoU1NIX1NNU0dfUFVCTElDX0tFWSk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJcGFja2V0X3B1dF9jaGFyKGNvb2tpZVtpXSk7CisKKwkvKiBTdG9yZSBvdXIgcHVibGljIHNlcnZlciBSU0Ega2V5LiAqLworCXBhY2tldF9wdXRfaW50KEJOX251bV9iaXRzKHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXktPnJzYS0+bikpOworCXBhY2tldF9wdXRfYmlnbnVtKHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXktPnJzYS0+ZSk7CisJcGFja2V0X3B1dF9iaWdudW0oc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleS0+cnNhLT5uKTsKKworCS8qIFN0b3JlIG91ciBwdWJsaWMgaG9zdCBSU0Ega2V5LiAqLworCXBhY2tldF9wdXRfaW50KEJOX251bV9iaXRzKHNlbnNpdGl2ZV9kYXRhLnNzaDFfaG9zdF9rZXktPnJzYS0+bikpOworCXBhY2tldF9wdXRfYmlnbnVtKHNlbnNpdGl2ZV9kYXRhLnNzaDFfaG9zdF9rZXktPnJzYS0+ZSk7CisJcGFja2V0X3B1dF9iaWdudW0oc2Vuc2l0aXZlX2RhdGEuc3NoMV9ob3N0X2tleS0+cnNhLT5uKTsKKworCS8qIFB1dCBwcm90b2NvbCBmbGFncy4gKi8KKwlwYWNrZXRfcHV0X2ludChTU0hfUFJPVE9GTEFHX0hPU1RfSU5fRldEX09QRU4pOworCisJLyogRGVjbGFyZSB3aGljaCBjaXBoZXJzIHdlIHN1cHBvcnQuICovCisJcGFja2V0X3B1dF9pbnQoY2lwaGVyX21hc2tfc3NoMSgwKSk7CisKKwkvKiBEZWNsYXJlIHN1cHBvcnRlZCBhdXRoZW50aWNhdGlvbiB0eXBlcy4gKi8KKwlhdXRoX21hc2sgPSAwOworCWlmIChvcHRpb25zLnJob3N0c19yc2FfYXV0aGVudGljYXRpb24pCisJCWF1dGhfbWFzayB8PSAxIDw8IFNTSF9BVVRIX1JIT1NUU19SU0E7CisJaWYgKG9wdGlvbnMucnNhX2F1dGhlbnRpY2F0aW9uKQorCQlhdXRoX21hc2sgfD0gMSA8PCBTU0hfQVVUSF9SU0E7CisJaWYgKG9wdGlvbnMuY2hhbGxlbmdlX3Jlc3BvbnNlX2F1dGhlbnRpY2F0aW9uID09IDEpCisJCWF1dGhfbWFzayB8PSAxIDw8IFNTSF9BVVRIX1RJUzsKKwlpZiAob3B0aW9ucy5wYXNzd29yZF9hdXRoZW50aWNhdGlvbikKKwkJYXV0aF9tYXNrIHw9IDEgPDwgU1NIX0FVVEhfUEFTU1dPUkQ7CisJcGFja2V0X3B1dF9pbnQoYXV0aF9tYXNrKTsKKworCS8qIFNlbmQgdGhlIHBhY2tldCBhbmQgd2FpdCBmb3IgaXQgdG8gYmUgc2VudC4gKi8KKwlwYWNrZXRfc2VuZCgpOworCXBhY2tldF93cml0ZV93YWl0KCk7CisKKwlkZWJ1ZygiU2VudCAlZCBiaXQgc2VydmVyIGtleSBhbmQgJWQgYml0IGhvc3Qga2V5LiIsCisJICAgIEJOX251bV9iaXRzKHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXktPnJzYS0+biksCisJICAgIEJOX251bV9iaXRzKHNlbnNpdGl2ZV9kYXRhLnNzaDFfaG9zdF9rZXktPnJzYS0+bikpOworCisJLyogUmVhZCBjbGllbnRzIHJlcGx5IChjaXBoZXIgdHlwZSBhbmQgc2Vzc2lvbiBrZXkpLiAqLworCXBhY2tldF9yZWFkX2V4cGVjdChTU0hfQ01TR19TRVNTSU9OX0tFWSk7CisKKwkvKiBHZXQgY2lwaGVyIHR5cGUgYW5kIGNoZWNrIHdoZXRoZXIgd2UgYWNjZXB0IHRoaXMuICovCisJY2lwaGVyX3R5cGUgPSBwYWNrZXRfZ2V0X2NoYXIoKTsKKworCWlmICghKGNpcGhlcl9tYXNrX3NzaDEoMCkgJiAoMSA8PCBjaXBoZXJfdHlwZSkpKQorCQlwYWNrZXRfZGlzY29ubmVjdCgiV2FybmluZzogY2xpZW50IHNlbGVjdHMgdW5zdXBwb3J0ZWQgY2lwaGVyLiIpOworCisJLyogR2V0IGNoZWNrIGJ5dGVzIGZyb20gdGhlIHBhY2tldC4gIFRoZXNlIG11c3QgbWF0Y2ggdGhvc2Ugd2UKKwkgICBzZW50IGVhcmxpZXIgd2l0aCB0aGUgcHVibGljIGtleSBwYWNrZXQuICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJaWYgKGNvb2tpZVtpXSAhPSBwYWNrZXRfZ2V0X2NoYXIoKSkKKwkJCXBhY2tldF9kaXNjb25uZWN0KCJJUCBTcG9vZmluZyBjaGVjayBieXRlcyBkbyBub3QgbWF0Y2guIik7CisKKwlkZWJ1ZygiRW5jcnlwdGlvbiB0eXBlOiAlLjIwMHMiLCBjaXBoZXJfbmFtZShjaXBoZXJfdHlwZSkpOworCisJLyogR2V0IHRoZSBlbmNyeXB0ZWQgaW50ZWdlci4gKi8KKwlpZiAoKHNlc3Npb25fa2V5X2ludCA9IEJOX25ldygpKSA9PSBOVUxMKQorCQlmYXRhbCgiZG9fc3NoMV9rZXg6IEJOX25ldyBmYWlsZWQiKTsKKwlwYWNrZXRfZ2V0X2JpZ251bShzZXNzaW9uX2tleV9pbnQpOworCisJcHJvdG9jb2xfZmxhZ3MgPSBwYWNrZXRfZ2V0X2ludCgpOworCXBhY2tldF9zZXRfcHJvdG9jb2xfZmxhZ3MocHJvdG9jb2xfZmxhZ3MpOworCXBhY2tldF9jaGVja19lb20oKTsKKworCS8qIERlY3J5cHQgc2Vzc2lvbl9rZXlfaW50IHVzaW5nIGhvc3Qvc2VydmVyIGtleXMgKi8KKwlyc2FmYWlsID0gUFJJVlNFUChzc2gxX3Nlc3Npb25fa2V5KHNlc3Npb25fa2V5X2ludCkpOworCisJLyoKKwkgKiBFeHRyYWN0IHNlc3Npb24ga2V5IGZyb20gdGhlIGRlY3J5cHRlZCBpbnRlZ2VyLiAgVGhlIGtleSBpcyBpbiB0aGUKKwkgKiBsZWFzdCBzaWduaWZpY2FudCAyNTYgYml0cyBvZiB0aGUgaW50ZWdlcjsgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlCisJICoga2V5IGlzIGluIHRoZSBoaWdoZXN0IGJpdHMuCisJICovCisJaWYgKCFyc2FmYWlsKSB7CisJCSh2b2lkKSBCTl9tYXNrX2JpdHMoc2Vzc2lvbl9rZXlfaW50LCBzaXplb2Yoc2Vzc2lvbl9rZXkpICogOCk7CisJCWxlbiA9IEJOX251bV9ieXRlcyhzZXNzaW9uX2tleV9pbnQpOworCQlpZiAobGVuIDwgMCB8fCAodV9pbnQpbGVuID4gc2l6ZW9mKHNlc3Npb25fa2V5KSkgeworCQkJZXJyb3IoImRvX3NzaDFfa2V4OiBiYWQgc2Vzc2lvbiBrZXkgbGVuIGZyb20gJXM6ICIKKwkJCSAgICAic2Vzc2lvbl9rZXlfaW50ICVkID4gc2l6ZW9mKHNlc3Npb25fa2V5KSAlbHUiLAorCQkJICAgIGdldF9yZW1vdGVfaXBhZGRyKCksIGxlbiwgKHVfbG9uZylzaXplb2Yoc2Vzc2lvbl9rZXkpKTsKKwkJCXJzYWZhaWwrKzsKKwkJfSBlbHNlIHsKKwkJCW1lbXNldChzZXNzaW9uX2tleSwgMCwgc2l6ZW9mKHNlc3Npb25fa2V5KSk7CisJCQlCTl9ibjJiaW4oc2Vzc2lvbl9rZXlfaW50LAorCQkJICAgIHNlc3Npb25fa2V5ICsgc2l6ZW9mKHNlc3Npb25fa2V5KSAtIGxlbik7CisKKwkJCWRlcml2ZV9zc2gxX3Nlc3Npb25faWQoCisJCQkgICAgc2Vuc2l0aXZlX2RhdGEuc3NoMV9ob3N0X2tleS0+cnNhLT5uLAorCQkJICAgIHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXktPnJzYS0+biwKKwkJCSAgICBjb29raWUsIHNlc3Npb25faWQpOworCQkJLyoKKwkJCSAqIFhvciB0aGUgZmlyc3QgMTYgYnl0ZXMgb2YgdGhlIHNlc3Npb24ga2V5IHdpdGggdGhlCisJCQkgKiBzZXNzaW9uIGlkLgorCQkJICovCisJCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJCQlzZXNzaW9uX2tleVtpXSBePSBzZXNzaW9uX2lkW2ldOworCQl9CisJfQorCWlmIChyc2FmYWlsKSB7CisJCWludCBieXRlcyA9IEJOX251bV9ieXRlcyhzZXNzaW9uX2tleV9pbnQpOworCQl1X2NoYXIgKmJ1ZiA9IHhtYWxsb2MoYnl0ZXMpOworCQlNRDVfQ1RYIG1kOworCisJCWxvZ2l0KCJkb19jb25uZWN0aW9uOiBnZW5lcmF0aW5nIGEgZmFrZSBlbmNyeXB0aW9uIGtleSIpOworCQlCTl9ibjJiaW4oc2Vzc2lvbl9rZXlfaW50LCBidWYpOworCQlNRDVfSW5pdCgmbWQpOworCQlNRDVfVXBkYXRlKCZtZCwgYnVmLCBieXRlcyk7CisJCU1ENV9VcGRhdGUoJm1kLCBzZW5zaXRpdmVfZGF0YS5zc2gxX2Nvb2tpZSwgU1NIX1NFU1NJT05fS0VZX0xFTkdUSCk7CisJCU1ENV9GaW5hbChzZXNzaW9uX2tleSwgJm1kKTsKKwkJTUQ1X0luaXQoJm1kKTsKKwkJTUQ1X1VwZGF0ZSgmbWQsIHNlc3Npb25fa2V5LCAxNik7CisJCU1ENV9VcGRhdGUoJm1kLCBidWYsIGJ5dGVzKTsKKwkJTUQ1X1VwZGF0ZSgmbWQsIHNlbnNpdGl2ZV9kYXRhLnNzaDFfY29va2llLCBTU0hfU0VTU0lPTl9LRVlfTEVOR1RIKTsKKwkJTUQ1X0ZpbmFsKHNlc3Npb25fa2V5ICsgMTYsICZtZCk7CisJCW1lbXNldChidWYsIDAsIGJ5dGVzKTsKKwkJeGZyZWUoYnVmKTsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQlzZXNzaW9uX2lkW2ldID0gc2Vzc2lvbl9rZXlbaV0gXiBzZXNzaW9uX2tleVtpICsgMTZdOworCX0KKwkvKiBEZXN0cm95IHRoZSBwcml2YXRlIGFuZCBwdWJsaWMga2V5cy4gTm8gbG9uZ2VyLiAqLworCWRlc3Ryb3lfc2Vuc2l0aXZlX2RhdGEoKTsKKworCWlmICh1c2VfcHJpdnNlcCkKKwkJbW1fc3NoMV9zZXNzaW9uX2lkKHNlc3Npb25faWQpOworCisJLyogRGVzdHJveSB0aGUgZGVjcnlwdGVkIGludGVnZXIuICBJdCBpcyBubyBsb25nZXIgbmVlZGVkLiAqLworCUJOX2NsZWFyX2ZyZWUoc2Vzc2lvbl9rZXlfaW50KTsKKworCS8qIFNldCB0aGUgc2Vzc2lvbiBrZXkuICBGcm9tIHRoaXMgb24gYWxsIGNvbW11bmljYXRpb25zIHdpbGwgYmUgZW5jcnlwdGVkLiAqLworCXBhY2tldF9zZXRfZW5jcnlwdGlvbl9rZXkoc2Vzc2lvbl9rZXksIFNTSF9TRVNTSU9OX0tFWV9MRU5HVEgsIGNpcGhlcl90eXBlKTsKKworCS8qIERlc3Ryb3kgb3VyIGNvcHkgb2YgdGhlIHNlc3Npb24ga2V5LiAgSXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gKi8KKwltZW1zZXQoc2Vzc2lvbl9rZXksIDAsIHNpemVvZihzZXNzaW9uX2tleSkpOworCisJZGVidWcoIlJlY2VpdmVkIHNlc3Npb24ga2V5OyBlbmNyeXB0aW9uIHR1cm5lZCBvbi4iKTsKKworCS8qIFNlbmQgYW4gYWNrbm93bGVkZ21lbnQgcGFja2V0LiAgTm90ZSB0aGF0IHRoaXMgcGFja2V0IGlzIHNlbnQgZW5jcnlwdGVkLiAqLworCXBhY2tldF9zdGFydChTU0hfU01TR19TVUNDRVNTKTsKKwlwYWNrZXRfc2VuZCgpOworCXBhY2tldF93cml0ZV93YWl0KCk7Cit9CisKKy8qCisgKiBTU0gyIGtleSBleGNoYW5nZTogZGlmZmllLWhlbGxtYW4tZ3JvdXAxLXNoYTEKKyAqLworc3RhdGljIHZvaWQKK2RvX3NzaDJfa2V4KHZvaWQpCit7CisJS2V4ICprZXg7CisKKwlpZiAob3B0aW9ucy5jaXBoZXJzICE9IE5VTEwpIHsKKwkJbXlwcm9wb3NhbFtQUk9QT1NBTF9FTkNfQUxHU19DVE9TXSA9CisJCW15cHJvcG9zYWxbUFJPUE9TQUxfRU5DX0FMR1NfU1RPQ10gPSBvcHRpb25zLmNpcGhlcnM7CisJfQorCW15cHJvcG9zYWxbUFJPUE9TQUxfRU5DX0FMR1NfQ1RPU10gPQorCSAgICBjb21wYXRfY2lwaGVyX3Byb3Bvc2FsKG15cHJvcG9zYWxbUFJPUE9TQUxfRU5DX0FMR1NfQ1RPU10pOworCW15cHJvcG9zYWxbUFJPUE9TQUxfRU5DX0FMR1NfU1RPQ10gPQorCSAgICBjb21wYXRfY2lwaGVyX3Byb3Bvc2FsKG15cHJvcG9zYWxbUFJPUE9TQUxfRU5DX0FMR1NfU1RPQ10pOworCisJaWYgKG9wdGlvbnMubWFjcyAhPSBOVUxMKSB7CisJCW15cHJvcG9zYWxbUFJPUE9TQUxfTUFDX0FMR1NfQ1RPU10gPQorCQlteXByb3Bvc2FsW1BST1BPU0FMX01BQ19BTEdTX1NUT0NdID0gb3B0aW9ucy5tYWNzOworCX0KKwlpZiAob3B0aW9ucy5jb21wcmVzc2lvbiA9PSBDT01QX05PTkUpIHsKKwkJbXlwcm9wb3NhbFtQUk9QT1NBTF9DT01QX0FMR1NfQ1RPU10gPQorCQlteXByb3Bvc2FsW1BST1BPU0FMX0NPTVBfQUxHU19TVE9DXSA9ICJub25lIjsKKwl9IGVsc2UgaWYgKG9wdGlvbnMuY29tcHJlc3Npb24gPT0gQ09NUF9ERUxBWUVEKSB7CisJCW15cHJvcG9zYWxbUFJPUE9TQUxfQ09NUF9BTEdTX0NUT1NdID0KKwkJbXlwcm9wb3NhbFtQUk9QT1NBTF9DT01QX0FMR1NfU1RPQ10gPSAibm9uZSx6bGliQG9wZW5zc2guY29tIjsKKwl9CisJaWYgKG9wdGlvbnMua2V4X2FsZ29yaXRobXMgIT0gTlVMTCkKKwkJbXlwcm9wb3NhbFtQUk9QT1NBTF9LRVhfQUxHU10gPSBvcHRpb25zLmtleF9hbGdvcml0aG1zOworCisJbXlwcm9wb3NhbFtQUk9QT1NBTF9TRVJWRVJfSE9TVF9LRVlfQUxHU10gPSBsaXN0X2hvc3RrZXlfdHlwZXMoKTsKKworCS8qIHN0YXJ0IGtleSBleGNoYW5nZSAqLworCWtleCA9IGtleF9zZXR1cChteXByb3Bvc2FsKTsKKwlrZXgtPmtleFtLRVhfREhfR1JQMV9TSEExXSA9IGtleGRoX3NlcnZlcjsKKwlrZXgtPmtleFtLRVhfREhfR1JQMTRfU0hBMV0gPSBrZXhkaF9zZXJ2ZXI7CisJa2V4LT5rZXhbS0VYX0RIX0dFWF9TSEExXSA9IGtleGdleF9zZXJ2ZXI7CisJa2V4LT5rZXhbS0VYX0RIX0dFWF9TSEEyNTZdID0ga2V4Z2V4X3NlcnZlcjsKKwlrZXgtPmtleFtLRVhfRUNESF9TSEEyXSA9IGtleGVjZGhfc2VydmVyOworCWtleC0+c2VydmVyID0gMTsKKwlrZXgtPmNsaWVudF92ZXJzaW9uX3N0cmluZz1jbGllbnRfdmVyc2lvbl9zdHJpbmc7CisJa2V4LT5zZXJ2ZXJfdmVyc2lvbl9zdHJpbmc9c2VydmVyX3ZlcnNpb25fc3RyaW5nOworCWtleC0+bG9hZF9ob3N0X3B1YmxpY19rZXk9JmdldF9ob3N0a2V5X3B1YmxpY19ieV90eXBlOworCWtleC0+bG9hZF9ob3N0X3ByaXZhdGVfa2V5PSZnZXRfaG9zdGtleV9wcml2YXRlX2J5X3R5cGU7CisJa2V4LT5ob3N0X2tleV9pbmRleD0mZ2V0X2hvc3RrZXlfaW5kZXg7CisKKwl4eHhfa2V4ID0ga2V4OworCisJZGlzcGF0Y2hfcnVuKERJU1BBVENIX0JMT0NLLCAma2V4LT5kb25lLCBrZXgpOworCisJc2Vzc2lvbl9pZDIgPSBrZXgtPnNlc3Npb25faWQ7CisJc2Vzc2lvbl9pZDJfbGVuID0ga2V4LT5zZXNzaW9uX2lkX2xlbjsKKworI2lmZGVmIERFQlVHX0tFWERICisJLyogc2VuZCAxc3QgZW5jcnlwdGVkL21hY2VkL2NvbXByZXNzZWQgbWVzc2FnZSAqLworCXBhY2tldF9zdGFydChTU0gyX01TR19JR05PUkUpOworCXBhY2tldF9wdXRfY3N0cmluZygibWFya3VzIik7CisJcGFja2V0X3NlbmQoKTsKKwlwYWNrZXRfd3JpdGVfd2FpdCgpOworI2VuZGlmCisJZGVidWcoIktFWCBkb25lIik7Cit9CisKKy8qIHNlcnZlciBzcGVjaWZpYyBmYXRhbCBjbGVhbnVwICovCit2b2lkCitjbGVhbnVwX2V4aXQoaW50IGkpCit7CisJaWYgKHRoZV9hdXRoY3R4dCkgeworCQlkb19jbGVhbnVwKHRoZV9hdXRoY3R4dCk7CisJCWlmICh1c2VfcHJpdnNlcCAmJiBwcml2c2VwX2lzX3ByZWF1dGggJiYgcG1vbml0b3ItPm1fcGlkID4gMSkgeworCQkJZGVidWcoIktpbGxpbmcgcHJpdnNlcCBjaGlsZCAlZCIsIHBtb25pdG9yLT5tX3BpZCk7CisJCQlpZiAoa2lsbChwbW9uaXRvci0+bV9waWQsIFNJR0tJTEwpICE9IDAgJiYKKwkJCSAgICBlcnJubyAhPSBFU1JDSCkKKwkJCQllcnJvcigiJXM6IGtpbGwoJWQpOiAlcyIsIF9fZnVuY19fLAorCQkJCSAgICBwbW9uaXRvci0+bV9waWQsIHN0cmVycm9yKGVycm5vKSk7CisJCX0KKwl9CisjaWZkZWYgU1NIX0FVRElUX0VWRU5UUworCS8qIGRvbmUgYWZ0ZXIgZG9fY2xlYW51cCBzbyBpdCBjYW4gY2FuY2VsIHRoZSBQQU0gYXV0aCAndGhyZWFkJyAqLworCWlmICghdXNlX3ByaXZzZXAgfHwgbW1faXNfbW9uaXRvcigpKQorCQlhdWRpdF9ldmVudChTU0hfQ09OTkVDVElPTl9BQkFORE9OKTsKKyNlbmRpZgorCV9leGl0KGkpOworfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zc2hkX2NvbmZpZyBiL29wZW5zc2gtNi4wcDEvc3NoZF9jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczZTg2NgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc3NoZF9jb25maWcKQEAgLTAsMCArMSwxMjEgQEAKKyMJJE9wZW5CU0Q6IHNzaGRfY29uZmlnLHYgMS44NCAyMDExLzA1LzIzIDAzOjMwOjA3IGRqbSBFeHAgJAorCisjIFRoaXMgaXMgdGhlIHNzaGQgc2VydmVyIHN5c3RlbS13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFNlZQorIyBzc2hkX2NvbmZpZyg1KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworIyBUaGlzIHNzaGQgd2FzIGNvbXBpbGVkIHdpdGggUEFUSD0vdXNyL2JpbjovYmluOi91c3Ivc2Jpbjovc2JpbgorCisjIFRoZSBzdHJhdGVneSB1c2VkIGZvciBvcHRpb25zIGluIHRoZSBkZWZhdWx0IHNzaGRfY29uZmlnIHNoaXBwZWQgd2l0aAorIyBPcGVuU1NIIGlzIHRvIHNwZWNpZnkgb3B0aW9ucyB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWUgd2hlcmUKKyMgcG9zc2libGUsIGJ1dCBsZWF2ZSB0aGVtIGNvbW1lbnRlZC4gIFVuY29tbWVudGVkIG9wdGlvbnMgb3ZlcnJpZGUgdGhlCisjIGRlZmF1bHQgdmFsdWUuCisKKyNQb3J0IDIyCisjQWRkcmVzc0ZhbWlseSBhbnkKKyNMaXN0ZW5BZGRyZXNzIDAuMC4wLjAKKyNMaXN0ZW5BZGRyZXNzIDo6CisKKyMgVGhlIGRlZmF1bHQgcmVxdWlyZXMgZXhwbGljaXQgYWN0aXZhdGlvbiBvZiBwcm90b2NvbCAxCisjUHJvdG9jb2wgMgorCisjIEhvc3RLZXkgZm9yIHByb3RvY29sIHZlcnNpb24gMQorI0hvc3RLZXkgL2V0Yy9zc2gvc3NoX2hvc3Rfa2V5CisjIEhvc3RLZXlzIGZvciBwcm90b2NvbCB2ZXJzaW9uIDIKKyNIb3N0S2V5IC9ldGMvc3NoL3NzaF9ob3N0X3JzYV9rZXkKKyNIb3N0S2V5IC9ldGMvc3NoL3NzaF9ob3N0X2RzYV9rZXkKKyNIb3N0S2V5IC9ldGMvc3NoL3NzaF9ob3N0X2VjZHNhX2tleQorCisjIExpZmV0aW1lIGFuZCBzaXplIG9mIGVwaGVtZXJhbCB2ZXJzaW9uIDEgc2VydmVyIGtleQorI0tleVJlZ2VuZXJhdGlvbkludGVydmFsIDFoCisjU2VydmVyS2V5Qml0cyAxMDI0CisKKyMgTG9nZ2luZworIyBvYnNvbGV0ZXMgUXVpZXRNb2RlIGFuZCBGYXNjaXN0TG9nZ2luZworI1N5c2xvZ0ZhY2lsaXR5IEFVVEgKKyNMb2dMZXZlbCBJTkZPCisKKyMgQXV0aGVudGljYXRpb246CisKKyNMb2dpbkdyYWNlVGltZSAybQorI1Blcm1pdFJvb3RMb2dpbiB5ZXMKKyNTdHJpY3RNb2RlcyB5ZXMKKyNNYXhBdXRoVHJpZXMgNgorI01heFNlc3Npb25zIDEwCisKKyNSU0FBdXRoZW50aWNhdGlvbiB5ZXMKKyNQdWJrZXlBdXRoZW50aWNhdGlvbiB5ZXMKKworIyBUaGUgZGVmYXVsdCBpcyB0byBjaGVjayBib3RoIC5zc2gvYXV0aG9yaXplZF9rZXlzIGFuZCAuc3NoL2F1dGhvcml6ZWRfa2V5czIKKyMgYnV0IHRoaXMgaXMgb3ZlcnJpZGRlbiBzbyBpbnN0YWxsYXRpb25zIHdpbGwgb25seSBjaGVjayAuc3NoL2F1dGhvcml6ZWRfa2V5cworQXV0aG9yaXplZEtleXNGaWxlCS5zc2gvYXV0aG9yaXplZF9rZXlzCisKKyMgRm9yIHRoaXMgdG8gd29yayB5b3Ugd2lsbCBhbHNvIG5lZWQgaG9zdCBrZXlzIGluIC9ldGMvc3NoL3NzaF9rbm93bl9ob3N0cworI1Job3N0c1JTQUF1dGhlbnRpY2F0aW9uIG5vCisjIHNpbWlsYXIgZm9yIHByb3RvY29sIHZlcnNpb24gMgorI0hvc3RiYXNlZEF1dGhlbnRpY2F0aW9uIG5vCisjIENoYW5nZSB0byB5ZXMgaWYgeW91IGRvbid0IHRydXN0IH4vLnNzaC9rbm93bl9ob3N0cyBmb3IKKyMgUmhvc3RzUlNBQXV0aGVudGljYXRpb24gYW5kIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uCisjSWdub3JlVXNlcktub3duSG9zdHMgbm8KKyMgRG9uJ3QgcmVhZCB0aGUgdXNlcidzIH4vLnJob3N0cyBhbmQgfi8uc2hvc3RzIGZpbGVzCisjSWdub3JlUmhvc3RzIHllcworCisjIFRvIGRpc2FibGUgdHVubmVsZWQgY2xlYXIgdGV4dCBwYXNzd29yZHMsIGNoYW5nZSB0byBubyBoZXJlIQorI1Bhc3N3b3JkQXV0aGVudGljYXRpb24geWVzCisjUGVybWl0RW1wdHlQYXNzd29yZHMgbm8KKworIyBDaGFuZ2UgdG8gbm8gdG8gZGlzYWJsZSBzL2tleSBwYXNzd29yZHMKKyNDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIHllcworCisjIEtlcmJlcm9zIG9wdGlvbnMKKyNLZXJiZXJvc0F1dGhlbnRpY2F0aW9uIG5vCisjS2VyYmVyb3NPckxvY2FsUGFzc3dkIHllcworI0tlcmJlcm9zVGlja2V0Q2xlYW51cCB5ZXMKKyNLZXJiZXJvc0dldEFGU1Rva2VuIG5vCisKKyMgR1NTQVBJIG9wdGlvbnMKKyNHU1NBUElBdXRoZW50aWNhdGlvbiBubworI0dTU0FQSUNsZWFudXBDcmVkZW50aWFscyB5ZXMKKworIyBTZXQgdGhpcyB0byAneWVzJyB0byBlbmFibGUgUEFNIGF1dGhlbnRpY2F0aW9uLCBhY2NvdW50IHByb2Nlc3NpbmcsIAorIyBhbmQgc2Vzc2lvbiBwcm9jZXNzaW5nLiBJZiB0aGlzIGlzIGVuYWJsZWQsIFBBTSBhdXRoZW50aWNhdGlvbiB3aWxsIAorIyBiZSBhbGxvd2VkIHRocm91Z2ggdGhlIENoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24gYW5kCisjIFBhc3N3b3JkQXV0aGVudGljYXRpb24uICBEZXBlbmRpbmcgb24geW91ciBQQU0gY29uZmlndXJhdGlvbiwKKyMgUEFNIGF1dGhlbnRpY2F0aW9uIHZpYSBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIG1heSBieXBhc3MKKyMgdGhlIHNldHRpbmcgb2YgIlBlcm1pdFJvb3RMb2dpbiB3aXRob3V0LXBhc3N3b3JkIi4KKyMgSWYgeW91IGp1c3Qgd2FudCB0aGUgUEFNIGFjY291bnQgYW5kIHNlc3Npb24gY2hlY2tzIHRvIHJ1biB3aXRob3V0CisjIFBBTSBhdXRoZW50aWNhdGlvbiwgdGhlbiBlbmFibGUgdGhpcyBidXQgc2V0IFBhc3N3b3JkQXV0aGVudGljYXRpb24KKyMgYW5kIENoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24gdG8gJ25vJy4KKyNVc2VQQU0gbm8KKworI0FsbG93QWdlbnRGb3J3YXJkaW5nIHllcworI0FsbG93VGNwRm9yd2FyZGluZyB5ZXMKKyNHYXRld2F5UG9ydHMgbm8KKyNYMTFGb3J3YXJkaW5nIG5vCisjWDExRGlzcGxheU9mZnNldCAxMAorI1gxMVVzZUxvY2FsaG9zdCB5ZXMKKyNQcmludE1vdGQgeWVzCisjUHJpbnRMYXN0TG9nIHllcworI1RDUEtlZXBBbGl2ZSB5ZXMKKyNVc2VMb2dpbiBubworI1VzZVByaXZpbGVnZVNlcGFyYXRpb24geWVzCisjUGVybWl0VXNlckVudmlyb25tZW50IG5vCisjQ29tcHJlc3Npb24gZGVsYXllZAorI0NsaWVudEFsaXZlSW50ZXJ2YWwgMAorI0NsaWVudEFsaXZlQ291bnRNYXggMworI1VzZUROUyB5ZXMKKyNQaWRGaWxlIC92YXIvcnVuL3NzaGQucGlkCisjTWF4U3RhcnR1cHMgMTAKKyNQZXJtaXRUdW5uZWwgbm8KKyNDaHJvb3REaXJlY3Rvcnkgbm9uZQorCisjIG5vIGRlZmF1bHQgYmFubmVyIHBhdGgKKyNCYW5uZXIgbm9uZQorCisjIG92ZXJyaWRlIGRlZmF1bHQgb2Ygbm8gc3Vic3lzdGVtcworU3Vic3lzdGVtCXNmdHAJL3Vzci9saWJleGVjL3NmdHAtc2VydmVyCisKKyMgRXhhbXBsZSBvZiBvdmVycmlkaW5nIHNldHRpbmdzIG9uIGEgcGVyLXVzZXIgYmFzaXMKKyNNYXRjaCBVc2VyIGFub25jdnMKKyMJWDExRm9yd2FyZGluZyBubworIwlBbGxvd1RjcEZvcndhcmRpbmcgbm8KKyMJRm9yY2VDb21tYW5kIGN2cyBzZXJ2ZXIKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc3NoZF9jb25maWcuMCBiL29wZW5zc2gtNi4wcDEvc3NoZF9jb25maWcuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDIyZjg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zc2hkX2NvbmZpZy4wCkBAIC0wLDAgKzEsNzE4IEBACitTU0hEX0NPTkZJRyg1KSAgICAgICAgICAgIE9wZW5CU0QgUHJvZ3JhbW1lcidzIE1hbnVhbCAgICAgICAgICAgU1NIRF9DT05GSUcoNSkKKworTkFNRQorICAgICBzc2hkX2NvbmZpZyAtIE9wZW5TU0ggU1NIIGRhZW1vbiBjb25maWd1cmF0aW9uIGZpbGUKKworU1lOT1BTSVMKKyAgICAgL2V0Yy9zc2gvc3NoZF9jb25maWcKKworREVTQ1JJUFRJT04KKyAgICAgc3NoZCg4KSByZWFkcyBjb25maWd1cmF0aW9uIGRhdGEgZnJvbSAvZXRjL3NzaC9zc2hkX2NvbmZpZyAob3IgdGhlIGZpbGUKKyAgICAgc3BlY2lmaWVkIHdpdGggLWYgb24gdGhlIGNvbW1hbmQgbGluZSkuICBUaGUgZmlsZSBjb250YWlucyBrZXl3b3JkLQorICAgICBhcmd1bWVudCBwYWlycywgb25lIHBlciBsaW5lLiAgTGluZXMgc3RhcnRpbmcgd2l0aCBgIycgYW5kIGVtcHR5IGxpbmVzCisgICAgIGFyZSBpbnRlcnByZXRlZCBhcyBjb21tZW50cy4gIEFyZ3VtZW50cyBtYXkgb3B0aW9uYWxseSBiZSBlbmNsb3NlZCBpbgorICAgICBkb3VibGUgcXVvdGVzICgiKSBpbiBvcmRlciB0byByZXByZXNlbnQgYXJndW1lbnRzIGNvbnRhaW5pbmcgc3BhY2VzLgorCisgICAgIFRoZSBwb3NzaWJsZSBrZXl3b3JkcyBhbmQgdGhlaXIgbWVhbmluZ3MgYXJlIGFzIGZvbGxvd3MgKG5vdGUgdGhhdAorICAgICBrZXl3b3JkcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgYXJndW1lbnRzIGFyZSBjYXNlLXNlbnNpdGl2ZSk6CisKKyAgICAgQWNjZXB0RW52CisgICAgICAgICAgICAgU3BlY2lmaWVzIHdoYXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNlbnQgYnkgdGhlIGNsaWVudCB3aWxsIGJlCisgICAgICAgICAgICAgY29waWVkIGludG8gdGhlIHNlc3Npb24ncyBlbnZpcm9uKDcpLiAgU2VlIFNlbmRFbnYgaW4KKyAgICAgICAgICAgICBzc2hfY29uZmlnKDUpIGZvciBob3cgdG8gY29uZmlndXJlIHRoZSBjbGllbnQuICBOb3RlIHRoYXQKKyAgICAgICAgICAgICBlbnZpcm9ubWVudCBwYXNzaW5nIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBwcm90b2NvbCAyLiAgVmFyaWFibGVzCisgICAgICAgICAgICAgYXJlIHNwZWNpZmllZCBieSBuYW1lLCB3aGljaCBtYXkgY29udGFpbiB0aGUgd2lsZGNhcmQgY2hhcmFjdGVycworICAgICAgICAgICAgIGAqJyBhbmQgYD8nLiAgTXVsdGlwbGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIG1heSBiZSBzZXBhcmF0ZWQgYnkKKyAgICAgICAgICAgICB3aGl0ZXNwYWNlIG9yIHNwcmVhZCBhY3Jvc3MgbXVsdGlwbGUgQWNjZXB0RW52IGRpcmVjdGl2ZXMuICBCZQorICAgICAgICAgICAgIHdhcm5lZCB0aGF0IHNvbWUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGNvdWxkIGJlIHVzZWQgdG8gYnlwYXNzCisgICAgICAgICAgICAgcmVzdHJpY3RlZCB1c2VyIGVudmlyb25tZW50cy4gIEZvciB0aGlzIHJlYXNvbiwgY2FyZSBzaG91bGQgYmUKKyAgICAgICAgICAgICB0YWtlbiBpbiB0aGUgdXNlIG9mIHRoaXMgZGlyZWN0aXZlLiAgVGhlIGRlZmF1bHQgaXMgbm90IHRvIGFjY2VwdAorICAgICAgICAgICAgIGFueSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisKKyAgICAgQWRkcmVzc0ZhbWlseQorICAgICAgICAgICAgIFNwZWNpZmllcyB3aGljaCBhZGRyZXNzIGZhbWlseSBzaG91bGQgYmUgdXNlZCBieSBzc2hkKDgpLiAgVmFsaWQKKyAgICAgICAgICAgICBhcmd1bWVudHMgYXJlIGBgYW55JycsIGBgaW5ldCcnICh1c2UgSVB2NCBvbmx5KSwgb3IgYGBpbmV0NicnCisgICAgICAgICAgICAgKHVzZSBJUHY2IG9ubHkpLiAgVGhlIGRlZmF1bHQgaXMgYGBhbnknJy4KKworICAgICBBbGxvd0FnZW50Rm9yd2FyZGluZworICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHNzaC1hZ2VudCgxKSBmb3J3YXJkaW5nIGlzIHBlcm1pdHRlZC4gIFRoZQorICAgICAgICAgICAgIGRlZmF1bHQgaXMgYGB5ZXMnJy4gIE5vdGUgdGhhdCBkaXNhYmxpbmcgYWdlbnQgZm9yd2FyZGluZyBkb2VzCisgICAgICAgICAgICAgbm90IGltcHJvdmUgc2VjdXJpdHkgdW5sZXNzIHVzZXJzIGFyZSBhbHNvIGRlbmllZCBzaGVsbCBhY2Nlc3MsCisgICAgICAgICAgICAgYXMgdGhleSBjYW4gYWx3YXlzIGluc3RhbGwgdGhlaXIgb3duIGZvcndhcmRlcnMuCisKKyAgICAgQWxsb3dHcm91cHMKKyAgICAgICAgICAgICBUaGlzIGtleXdvcmQgY2FuIGJlIGZvbGxvd2VkIGJ5IGEgbGlzdCBvZiBncm91cCBuYW1lIHBhdHRlcm5zLAorICAgICAgICAgICAgIHNlcGFyYXRlZCBieSBzcGFjZXMuICBJZiBzcGVjaWZpZWQsIGxvZ2luIGlzIGFsbG93ZWQgb25seSBmb3IKKyAgICAgICAgICAgICB1c2VycyB3aG9zZSBwcmltYXJ5IGdyb3VwIG9yIHN1cHBsZW1lbnRhcnkgZ3JvdXAgbGlzdCBtYXRjaGVzIG9uZQorICAgICAgICAgICAgIG9mIHRoZSBwYXR0ZXJucy4gIE9ubHkgZ3JvdXAgbmFtZXMgYXJlIHZhbGlkOyBhIG51bWVyaWNhbCBncm91cAorICAgICAgICAgICAgIElEIGlzIG5vdCByZWNvZ25pemVkLiAgQnkgZGVmYXVsdCwgbG9naW4gaXMgYWxsb3dlZCBmb3IgYWxsCisgICAgICAgICAgICAgZ3JvdXBzLiAgVGhlIGFsbG93L2RlbnkgZGlyZWN0aXZlcyBhcmUgcHJvY2Vzc2VkIGluIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgICBvcmRlcjogRGVueVVzZXJzLCBBbGxvd1VzZXJzLCBEZW55R3JvdXBzLCBhbmQgZmluYWxseQorICAgICAgICAgICAgIEFsbG93R3JvdXBzLgorCisgICAgICAgICAgICAgU2VlIFBBVFRFUk5TIGluIHNzaF9jb25maWcoNSkgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcGF0dGVybnMuCisKKyAgICAgQWxsb3dUY3BGb3J3YXJkaW5nCisgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgVENQIGZvcndhcmRpbmcgaXMgcGVybWl0dGVkLiAgVGhlIGRlZmF1bHQgaXMKKyAgICAgICAgICAgICBgYHllcycnLiAgTm90ZSB0aGF0IGRpc2FibGluZyBUQ1AgZm9yd2FyZGluZyBkb2VzIG5vdCBpbXByb3ZlCisgICAgICAgICAgICAgc2VjdXJpdHkgdW5sZXNzIHVzZXJzIGFyZSBhbHNvIGRlbmllZCBzaGVsbCBhY2Nlc3MsIGFzIHRoZXkgY2FuCisgICAgICAgICAgICAgYWx3YXlzIGluc3RhbGwgdGhlaXIgb3duIGZvcndhcmRlcnMuCisKKyAgICAgQWxsb3dVc2VycworICAgICAgICAgICAgIFRoaXMga2V5d29yZCBjYW4gYmUgZm9sbG93ZWQgYnkgYSBsaXN0IG9mIHVzZXIgbmFtZSBwYXR0ZXJucywKKyAgICAgICAgICAgICBzZXBhcmF0ZWQgYnkgc3BhY2VzLiAgSWYgc3BlY2lmaWVkLCBsb2dpbiBpcyBhbGxvd2VkIG9ubHkgZm9yCisgICAgICAgICAgICAgdXNlciBuYW1lcyB0aGF0IG1hdGNoIG9uZSBvZiB0aGUgcGF0dGVybnMuICBPbmx5IHVzZXIgbmFtZXMgYXJlCisgICAgICAgICAgICAgdmFsaWQ7IGEgbnVtZXJpY2FsIHVzZXIgSUQgaXMgbm90IHJlY29nbml6ZWQuICBCeSBkZWZhdWx0LCBsb2dpbgorICAgICAgICAgICAgIGlzIGFsbG93ZWQgZm9yIGFsbCB1c2Vycy4gIElmIHRoZSBwYXR0ZXJuIHRha2VzIHRoZSBmb3JtCisgICAgICAgICAgICAgVVNFUkBIT1NUIHRoZW4gVVNFUiBhbmQgSE9TVCBhcmUgc2VwYXJhdGVseSBjaGVja2VkLCByZXN0cmljdGluZworICAgICAgICAgICAgIGxvZ2lucyB0byBwYXJ0aWN1bGFyIHVzZXJzIGZyb20gcGFydGljdWxhciBob3N0cy4gIFRoZSBhbGxvdy9kZW55CisgICAgICAgICAgICAgZGlyZWN0aXZlcyBhcmUgcHJvY2Vzc2VkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6IERlbnlVc2VycywKKyAgICAgICAgICAgICBBbGxvd1VzZXJzLCBEZW55R3JvdXBzLCBhbmQgZmluYWxseSBBbGxvd0dyb3Vwcy4KKworICAgICAgICAgICAgIFNlZSBQQVRURVJOUyBpbiBzc2hfY29uZmlnKDUpIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHBhdHRlcm5zLgorCisgICAgIEF1dGhvcml6ZWRLZXlzRmlsZQorICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBwdWJsaWMga2V5cyB0aGF0IGNhbiBiZSB1c2VkCisgICAgICAgICAgICAgZm9yIHVzZXIgYXV0aGVudGljYXRpb24uICBUaGUgZm9ybWF0IGlzIGRlc2NyaWJlZCBpbiB0aGUKKyAgICAgICAgICAgICBBVVRIT1JJWkVEX0tFWVMgRklMRSBGT1JNQVQgc2VjdGlvbiBvZiBzc2hkKDgpLgorICAgICAgICAgICAgIEF1dGhvcml6ZWRLZXlzRmlsZSBtYXkgY29udGFpbiB0b2tlbnMgb2YgdGhlIGZvcm0gJVQgd2hpY2ggYXJlCisgICAgICAgICAgICAgc3Vic3RpdHV0ZWQgZHVyaW5nIGNvbm5lY3Rpb24gc2V0dXAuICBUaGUgZm9sbG93aW5nIHRva2VucyBhcmUKKyAgICAgICAgICAgICBkZWZpbmVkOiAlJSBpcyByZXBsYWNlZCBieSBhIGxpdGVyYWwgJyUnLCAlaCBpcyByZXBsYWNlZCBieSB0aGUKKyAgICAgICAgICAgICBob21lIGRpcmVjdG9yeSBvZiB0aGUgdXNlciBiZWluZyBhdXRoZW50aWNhdGVkLCBhbmQgJXUgaXMKKyAgICAgICAgICAgICByZXBsYWNlZCBieSB0aGUgdXNlcm5hbWUgb2YgdGhhdCB1c2VyLiAgQWZ0ZXIgZXhwYW5zaW9uLAorICAgICAgICAgICAgIEF1dGhvcml6ZWRLZXlzRmlsZSBpcyB0YWtlbiB0byBiZSBhbiBhYnNvbHV0ZSBwYXRoIG9yIG9uZQorICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuICBNdWx0aXBsZSBmaWxlcyBtYXkgYmUKKyAgICAgICAgICAgICBsaXN0ZWQsIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLiAgVGhlIGRlZmF1bHQgaXMKKyAgICAgICAgICAgICBgYC5zc2gvYXV0aG9yaXplZF9rZXlzIC5zc2gvYXV0aG9yaXplZF9rZXlzMicnLgorCisgICAgIEF1dGhvcml6ZWRQcmluY2lwYWxzRmlsZQorICAgICAgICAgICAgIFNwZWNpZmllcyBhIGZpbGUgdGhhdCBsaXN0cyBwcmluY2lwYWwgbmFtZXMgdGhhdCBhcmUgYWNjZXB0ZWQgZm9yCisgICAgICAgICAgICAgY2VydGlmaWNhdGUgYXV0aGVudGljYXRpb24uICBXaGVuIHVzaW5nIGNlcnRpZmljYXRlcyBzaWduZWQgYnkgYQorICAgICAgICAgICAgIGtleSBsaXN0ZWQgaW4gVHJ1c3RlZFVzZXJDQUtleXMsIHRoaXMgZmlsZSBsaXN0cyBuYW1lcywgb25lIG9mCisgICAgICAgICAgICAgd2hpY2ggbXVzdCBhcHBlYXIgaW4gdGhlIGNlcnRpZmljYXRlIGZvciBpdCB0byBiZSBhY2NlcHRlZCBmb3IKKyAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi4gIE5hbWVzIGFyZSBsaXN0ZWQgb25lIHBlciBsaW5lIHByZWNlZGVkIGJ5IGtleQorICAgICAgICAgICAgIG9wdGlvbnMgKGFzIGRlc2NyaWJlZCBpbiBBVVRIT1JJWkVEX0tFWVMgRklMRSBGT1JNQVQgaW4gc3NoZCg4KSkuCisgICAgICAgICAgICAgRW1wdHkgbGluZXMgYW5kIGNvbW1lbnRzIHN0YXJ0aW5nIHdpdGggYCMnIGFyZSBpZ25vcmVkLgorCisgICAgICAgICAgICAgQXV0aG9yaXplZFByaW5jaXBhbHNGaWxlIG1heSBjb250YWluIHRva2VucyBvZiB0aGUgZm9ybSAlVCB3aGljaAorICAgICAgICAgICAgIGFyZSBzdWJzdGl0dXRlZCBkdXJpbmcgY29ubmVjdGlvbiBzZXR1cC4gIFRoZSBmb2xsb3dpbmcgdG9rZW5zCisgICAgICAgICAgICAgYXJlIGRlZmluZWQ6ICUlIGlzIHJlcGxhY2VkIGJ5IGEgbGl0ZXJhbCAnJScsICVoIGlzIHJlcGxhY2VkIGJ5CisgICAgICAgICAgICAgdGhlIGhvbWUgZGlyZWN0b3J5IG9mIHRoZSB1c2VyIGJlaW5nIGF1dGhlbnRpY2F0ZWQsIGFuZCAldSBpcworICAgICAgICAgICAgIHJlcGxhY2VkIGJ5IHRoZSB1c2VybmFtZSBvZiB0aGF0IHVzZXIuICBBZnRlciBleHBhbnNpb24sCisgICAgICAgICAgICAgQXV0aG9yaXplZFByaW5jaXBhbHNGaWxlIGlzIHRha2VuIHRvIGJlIGFuIGFic29sdXRlIHBhdGggb3Igb25lCisgICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeS4KKworICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIG5vdCB0byB1c2UgYSBwcmluY2lwYWxzIGZpbGUgLSBpbiB0aGlzIGNhc2UsIHRoZQorICAgICAgICAgICAgIHVzZXJuYW1lIG9mIHRoZSB1c2VyIG11c3QgYXBwZWFyIGluIGEgY2VydGlmaWNhdGUncyBwcmluY2lwYWxzCisgICAgICAgICAgICAgbGlzdCBmb3IgaXQgdG8gYmUgYWNjZXB0ZWQuICBOb3RlIHRoYXQgQXV0aG9yaXplZFByaW5jaXBhbHNGaWxlCisgICAgICAgICAgICAgaXMgb25seSB1c2VkIHdoZW4gYXV0aGVudGljYXRpb24gcHJvY2VlZHMgdXNpbmcgYSBDQSBsaXN0ZWQgaW4KKyAgICAgICAgICAgICBUcnVzdGVkVXNlckNBS2V5cyBhbmQgaXMgbm90IGNvbnN1bHRlZCBmb3IgY2VydGlmaWNhdGlvbgorICAgICAgICAgICAgIGF1dGhvcml0aWVzIHRydXN0ZWQgdmlhIH4vLnNzaC9hdXRob3JpemVkX2tleXMsIHRob3VnaCB0aGUKKyAgICAgICAgICAgICBwcmluY2lwYWxzPSBrZXkgb3B0aW9uIG9mZmVycyBhIHNpbWlsYXIgZmFjaWxpdHkgKHNlZSBzc2hkKDgpIGZvcgorICAgICAgICAgICAgIGRldGFpbHMpLgorCisgICAgIEJhbm5lciAgVGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgZmlsZSBhcmUgc2VudCB0byB0aGUgcmVtb3RlIHVzZXIKKyAgICAgICAgICAgICBiZWZvcmUgYXV0aGVudGljYXRpb24gaXMgYWxsb3dlZC4gIElmIHRoZSBhcmd1bWVudCBpcyBgYG5vbmUnJworICAgICAgICAgICAgIHRoZW4gbm8gYmFubmVyIGlzIGRpc3BsYXllZC4gIFRoaXMgb3B0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIGZvcgorICAgICAgICAgICAgIHByb3RvY29sIHZlcnNpb24gMi4gIEJ5IGRlZmF1bHQsIG5vIGJhbm5lciBpcyBkaXNwbGF5ZWQuCisKKyAgICAgQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIGNoYWxsZW5nZS1yZXNwb25zZSBhdXRoZW50aWNhdGlvbiBpcyBhbGxvd2VkCisgICAgICAgICAgICAgKGUuZy4gdmlhIFBBTSBvciB0aG91Z2ggYXV0aGVudGljYXRpb24gc3R5bGVzIHN1cHBvcnRlZCBpbgorICAgICAgICAgICAgIGxvZ2luLmNvbmYoNSkpIFRoZSBkZWZhdWx0IGlzIGBgeWVzJycuCisKKyAgICAgQ2hyb290RGlyZWN0b3J5CisgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBwYXRobmFtZSBvZiBhIGRpcmVjdG9yeSB0byBjaHJvb3QoMikgdG8gYWZ0ZXIKKyAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi4gIEFsbCBjb21wb25lbnRzIG9mIHRoZSBwYXRobmFtZSBtdXN0IGJlIHJvb3QtCisgICAgICAgICAgICAgb3duZWQgZGlyZWN0b3JpZXMgdGhhdCBhcmUgbm90IHdyaXRhYmxlIGJ5IGFueSBvdGhlciB1c2VyIG9yCisgICAgICAgICAgICAgZ3JvdXAuICBBZnRlciB0aGUgY2hyb290LCBzc2hkKDgpIGNoYW5nZXMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5CisgICAgICAgICAgICAgdG8gdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeS4KKworICAgICAgICAgICAgIFRoZSBwYXRobmFtZSBtYXkgY29udGFpbiB0aGUgZm9sbG93aW5nIHRva2VucyB0aGF0IGFyZSBleHBhbmRlZAorICAgICAgICAgICAgIGF0IHJ1bnRpbWUgb25jZSB0aGUgY29ubmVjdGluZyB1c2VyIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQ6ICUlIGlzCisgICAgICAgICAgICAgcmVwbGFjZWQgYnkgYSBsaXRlcmFsICclJywgJWggaXMgcmVwbGFjZWQgYnkgdGhlIGhvbWUgZGlyZWN0b3J5CisgICAgICAgICAgICAgb2YgdGhlIHVzZXIgYmVpbmcgYXV0aGVudGljYXRlZCwgYW5kICV1IGlzIHJlcGxhY2VkIGJ5IHRoZQorICAgICAgICAgICAgIHVzZXJuYW1lIG9mIHRoYXQgdXNlci4KKworICAgICAgICAgICAgIFRoZSBDaHJvb3REaXJlY3RvcnkgbXVzdCBjb250YWluIHRoZSBuZWNlc3NhcnkgZmlsZXMgYW5kCisgICAgICAgICAgICAgZGlyZWN0b3JpZXMgdG8gc3VwcG9ydCB0aGUgdXNlcidzIHNlc3Npb24uICBGb3IgYW4gaW50ZXJhY3RpdmUKKyAgICAgICAgICAgICBzZXNzaW9uIHRoaXMgcmVxdWlyZXMgYXQgbGVhc3QgYSBzaGVsbCwgdHlwaWNhbGx5IHNoKDEpLCBhbmQKKyAgICAgICAgICAgICBiYXNpYyAvZGV2IG5vZGVzIHN1Y2ggYXMgbnVsbCg0KSwgemVybyg0KSwgc3RkaW4oNCksIHN0ZG91dCg0KSwKKyAgICAgICAgICAgICBzdGRlcnIoNCksIGFyYW5kb20oNCkgYW5kIHR0eSg0KSBkZXZpY2VzLiAgRm9yIGZpbGUgdHJhbnNmZXIKKyAgICAgICAgICAgICBzZXNzaW9ucyB1c2luZyBgYHNmdHAnJywgbm8gYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIG9mIHRoZQorICAgICAgICAgICAgIGVudmlyb25tZW50IGlzIG5lY2Vzc2FyeSBpZiB0aGUgaW4tcHJvY2VzcyBzZnRwIHNlcnZlciBpcyB1c2VkLAorICAgICAgICAgICAgIHRob3VnaCBzZXNzaW9ucyB3aGljaCB1c2UgbG9nZ2luZyBkbyByZXF1aXJlIC9kZXYvbG9nIGluc2lkZSB0aGUKKyAgICAgICAgICAgICBjaHJvb3QgZGlyZWN0b3J5IChzZWUgc2Z0cC1zZXJ2ZXIoOCkgZm9yIGRldGFpbHMpLgorCisgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgbm90IHRvIGNocm9vdCgyKS4KKworICAgICBDaXBoZXJzCisgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBjaXBoZXJzIGFsbG93ZWQgZm9yIHByb3RvY29sIHZlcnNpb24gMi4gIE11bHRpcGxlCisgICAgICAgICAgICAgY2lwaGVycyBtdXN0IGJlIGNvbW1hLXNlcGFyYXRlZC4gIFRoZSBzdXBwb3J0ZWQgY2lwaGVycyBhcmUKKyAgICAgICAgICAgICBgYDNkZXMtY2JjJycsIGBgYWVzMTI4LWNiYycnLCBgYGFlczE5Mi1jYmMnJywgYGBhZXMyNTYtY2JjJycsCisgICAgICAgICAgICAgYGBhZXMxMjgtY3RyJycsIGBgYWVzMTkyLWN0cicnLCBgYGFlczI1Ni1jdHInJywgYGBhcmNmb3VyMTI4JycsCisgICAgICAgICAgICAgYGBhcmNmb3VyMjU2JycsIGBgYXJjZm91cicnLCBgYGJsb3dmaXNoLWNiYycnLCBhbmQKKyAgICAgICAgICAgICBgYGNhc3QxMjgtY2JjJycuICBUaGUgZGVmYXVsdCBpczoKKworICAgICAgICAgICAgICAgIGFlczEyOC1jdHIsYWVzMTkyLWN0cixhZXMyNTYtY3RyLGFyY2ZvdXIyNTYsYXJjZm91cjEyOCwKKyAgICAgICAgICAgICAgICBhZXMxMjgtY2JjLDNkZXMtY2JjLGJsb3dmaXNoLWNiYyxjYXN0MTI4LWNiYyxhZXMxOTItY2JjLAorICAgICAgICAgICAgICAgIGFlczI1Ni1jYmMsYXJjZm91cgorCisgICAgIENsaWVudEFsaXZlQ291bnRNYXgKKyAgICAgICAgICAgICBTZXRzIHRoZSBudW1iZXIgb2YgY2xpZW50IGFsaXZlIG1lc3NhZ2VzIChzZWUgYmVsb3cpIHdoaWNoIG1heSBiZQorICAgICAgICAgICAgIHNlbnQgd2l0aG91dCBzc2hkKDgpIHJlY2VpdmluZyBhbnkgbWVzc2FnZXMgYmFjayBmcm9tIHRoZSBjbGllbnQuCisgICAgICAgICAgICAgSWYgdGhpcyB0aHJlc2hvbGQgaXMgcmVhY2hlZCB3aGlsZSBjbGllbnQgYWxpdmUgbWVzc2FnZXMgYXJlCisgICAgICAgICAgICAgYmVpbmcgc2VudCwgc3NoZCB3aWxsIGRpc2Nvbm5lY3QgdGhlIGNsaWVudCwgdGVybWluYXRpbmcgdGhlCisgICAgICAgICAgICAgc2Vzc2lvbi4gIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIHVzZSBvZiBjbGllbnQgYWxpdmUKKyAgICAgICAgICAgICBtZXNzYWdlcyBpcyB2ZXJ5IGRpZmZlcmVudCBmcm9tIFRDUEtlZXBBbGl2ZSAoYmVsb3cpLiAgVGhlIGNsaWVudAorICAgICAgICAgICAgIGFsaXZlIG1lc3NhZ2VzIGFyZSBzZW50IHRocm91Z2ggdGhlIGVuY3J5cHRlZCBjaGFubmVsIGFuZAorICAgICAgICAgICAgIHRoZXJlZm9yZSB3aWxsIG5vdCBiZSBzcG9vZmFibGUuICBUaGUgVENQIGtlZXBhbGl2ZSBvcHRpb24KKyAgICAgICAgICAgICBlbmFibGVkIGJ5IFRDUEtlZXBBbGl2ZSBpcyBzcG9vZmFibGUuICBUaGUgY2xpZW50IGFsaXZlIG1lY2hhbmlzbQorICAgICAgICAgICAgIGlzIHZhbHVhYmxlIHdoZW4gdGhlIGNsaWVudCBvciBzZXJ2ZXIgZGVwZW5kIG9uIGtub3dpbmcgd2hlbiBhCisgICAgICAgICAgICAgY29ubmVjdGlvbiBoYXMgYmVjb21lIGluYWN0aXZlLgorCisgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgMy4gIElmIENsaWVudEFsaXZlSW50ZXJ2YWwgKHNlZSBiZWxvdykgaXMKKyAgICAgICAgICAgICBzZXQgdG8gMTUsIGFuZCBDbGllbnRBbGl2ZUNvdW50TWF4IGlzIGxlZnQgYXQgdGhlIGRlZmF1bHQsCisgICAgICAgICAgICAgdW5yZXNwb25zaXZlIFNTSCBjbGllbnRzIHdpbGwgYmUgZGlzY29ubmVjdGVkIGFmdGVyIGFwcHJveGltYXRlbHkKKyAgICAgICAgICAgICA0NSBzZWNvbmRzLiAgVGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDIgb25seS4KKworICAgICBDbGllbnRBbGl2ZUludGVydmFsCisgICAgICAgICAgICAgU2V0cyBhIHRpbWVvdXQgaW50ZXJ2YWwgaW4gc2Vjb25kcyBhZnRlciB3aGljaCBpZiBubyBkYXRhIGhhcworICAgICAgICAgICAgIGJlZW4gcmVjZWl2ZWQgZnJvbSB0aGUgY2xpZW50LCBzc2hkKDgpIHdpbGwgc2VuZCBhIG1lc3NhZ2UKKyAgICAgICAgICAgICB0aHJvdWdoIHRoZSBlbmNyeXB0ZWQgY2hhbm5lbCB0byByZXF1ZXN0IGEgcmVzcG9uc2UgZnJvbSB0aGUKKyAgICAgICAgICAgICBjbGllbnQuICBUaGUgZGVmYXVsdCBpcyAwLCBpbmRpY2F0aW5nIHRoYXQgdGhlc2UgbWVzc2FnZXMgd2lsbAorICAgICAgICAgICAgIG5vdCBiZSBzZW50IHRvIHRoZSBjbGllbnQuICBUaGlzIG9wdGlvbiBhcHBsaWVzIHRvIHByb3RvY29sCisgICAgICAgICAgICAgdmVyc2lvbiAyIG9ubHkuCisKKyAgICAgQ29tcHJlc3Npb24KKyAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBjb21wcmVzc2lvbiBpcyBhbGxvd2VkLCBvciBkZWxheWVkIHVudGlsIHRoZQorICAgICAgICAgICAgIHVzZXIgaGFzIGF1dGhlbnRpY2F0ZWQgc3VjY2Vzc2Z1bGx5LiAgVGhlIGFyZ3VtZW50IG11c3QgYmUKKyAgICAgICAgICAgICBgYHllcycnLCBgYGRlbGF5ZWQnJywgb3IgYGBubycnLiAgVGhlIGRlZmF1bHQgaXMgYGBkZWxheWVkJycuCisKKyAgICAgRGVueUdyb3VwcworICAgICAgICAgICAgIFRoaXMga2V5d29yZCBjYW4gYmUgZm9sbG93ZWQgYnkgYSBsaXN0IG9mIGdyb3VwIG5hbWUgcGF0dGVybnMsCisgICAgICAgICAgICAgc2VwYXJhdGVkIGJ5IHNwYWNlcy4gIExvZ2luIGlzIGRpc2FsbG93ZWQgZm9yIHVzZXJzIHdob3NlIHByaW1hcnkKKyAgICAgICAgICAgICBncm91cCBvciBzdXBwbGVtZW50YXJ5IGdyb3VwIGxpc3QgbWF0Y2hlcyBvbmUgb2YgdGhlIHBhdHRlcm5zLgorICAgICAgICAgICAgIE9ubHkgZ3JvdXAgbmFtZXMgYXJlIHZhbGlkOyBhIG51bWVyaWNhbCBncm91cCBJRCBpcyBub3QKKyAgICAgICAgICAgICByZWNvZ25pemVkLiAgQnkgZGVmYXVsdCwgbG9naW4gaXMgYWxsb3dlZCBmb3IgYWxsIGdyb3Vwcy4gIFRoZQorICAgICAgICAgICAgIGFsbG93L2RlbnkgZGlyZWN0aXZlcyBhcmUgcHJvY2Vzc2VkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisgICAgICAgICAgICAgRGVueVVzZXJzLCBBbGxvd1VzZXJzLCBEZW55R3JvdXBzLCBhbmQgZmluYWxseSBBbGxvd0dyb3Vwcy4KKworICAgICAgICAgICAgIFNlZSBQQVRURVJOUyBpbiBzc2hfY29uZmlnKDUpIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHBhdHRlcm5zLgorCisgICAgIERlbnlVc2VycworICAgICAgICAgICAgIFRoaXMga2V5d29yZCBjYW4gYmUgZm9sbG93ZWQgYnkgYSBsaXN0IG9mIHVzZXIgbmFtZSBwYXR0ZXJucywKKyAgICAgICAgICAgICBzZXBhcmF0ZWQgYnkgc3BhY2VzLiAgTG9naW4gaXMgZGlzYWxsb3dlZCBmb3IgdXNlciBuYW1lcyB0aGF0CisgICAgICAgICAgICAgbWF0Y2ggb25lIG9mIHRoZSBwYXR0ZXJucy4gIE9ubHkgdXNlciBuYW1lcyBhcmUgdmFsaWQ7IGEKKyAgICAgICAgICAgICBudW1lcmljYWwgdXNlciBJRCBpcyBub3QgcmVjb2duaXplZC4gIEJ5IGRlZmF1bHQsIGxvZ2luIGlzCisgICAgICAgICAgICAgYWxsb3dlZCBmb3IgYWxsIHVzZXJzLiAgSWYgdGhlIHBhdHRlcm4gdGFrZXMgdGhlIGZvcm0gVVNFUkBIT1NUCisgICAgICAgICAgICAgdGhlbiBVU0VSIGFuZCBIT1NUIGFyZSBzZXBhcmF0ZWx5IGNoZWNrZWQsIHJlc3RyaWN0aW5nIGxvZ2lucyB0bworICAgICAgICAgICAgIHBhcnRpY3VsYXIgdXNlcnMgZnJvbSBwYXJ0aWN1bGFyIGhvc3RzLiAgVGhlIGFsbG93L2RlbnkKKyAgICAgICAgICAgICBkaXJlY3RpdmVzIGFyZSBwcm9jZXNzZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogRGVueVVzZXJzLAorICAgICAgICAgICAgIEFsbG93VXNlcnMsIERlbnlHcm91cHMsIGFuZCBmaW5hbGx5IEFsbG93R3JvdXBzLgorCisgICAgICAgICAgICAgU2VlIFBBVFRFUk5TIGluIHNzaF9jb25maWcoNSkgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcGF0dGVybnMuCisKKyAgICAgRm9yY2VDb21tYW5kCisgICAgICAgICAgICAgRm9yY2VzIHRoZSBleGVjdXRpb24gb2YgdGhlIGNvbW1hbmQgc3BlY2lmaWVkIGJ5IEZvcmNlQ29tbWFuZCwKKyAgICAgICAgICAgICBpZ25vcmluZyBhbnkgY29tbWFuZCBzdXBwbGllZCBieSB0aGUgY2xpZW50IGFuZCB+Ly5zc2gvcmMgaWYKKyAgICAgICAgICAgICBwcmVzZW50LiAgVGhlIGNvbW1hbmQgaXMgaW52b2tlZCBieSB1c2luZyB0aGUgdXNlcidzIGxvZ2luIHNoZWxsCisgICAgICAgICAgICAgd2l0aCB0aGUgLWMgb3B0aW9uLiAgVGhpcyBhcHBsaWVzIHRvIHNoZWxsLCBjb21tYW5kLCBvciBzdWJzeXN0ZW0KKyAgICAgICAgICAgICBleGVjdXRpb24uICBJdCBpcyBtb3N0IHVzZWZ1bCBpbnNpZGUgYSBNYXRjaCBibG9jay4gIFRoZSBjb21tYW5kCisgICAgICAgICAgICAgb3JpZ2luYWxseSBzdXBwbGllZCBieSB0aGUgY2xpZW50IGlzIGF2YWlsYWJsZSBpbiB0aGUKKyAgICAgICAgICAgICBTU0hfT1JJR0lOQUxfQ09NTUFORCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIFNwZWNpZnlpbmcgYSBjb21tYW5kCisgICAgICAgICAgICAgb2YgYGBpbnRlcm5hbC1zZnRwJycgd2lsbCBmb3JjZSB0aGUgdXNlIG9mIGFuIGluLXByb2Nlc3Mgc2Z0cAorICAgICAgICAgICAgIHNlcnZlciB0aGF0IHJlcXVpcmVzIG5vIHN1cHBvcnQgZmlsZXMgd2hlbiB1c2VkIHdpdGgKKyAgICAgICAgICAgICBDaHJvb3REaXJlY3RvcnkuCisKKyAgICAgR2F0ZXdheVBvcnRzCisgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgcmVtb3RlIGhvc3RzIGFyZSBhbGxvd2VkIHRvIGNvbm5lY3QgdG8gcG9ydHMKKyAgICAgICAgICAgICBmb3J3YXJkZWQgZm9yIHRoZSBjbGllbnQuICBCeSBkZWZhdWx0LCBzc2hkKDgpIGJpbmRzIHJlbW90ZSBwb3J0CisgICAgICAgICAgICAgZm9yd2FyZGluZ3MgdG8gdGhlIGxvb3BiYWNrIGFkZHJlc3MuICBUaGlzIHByZXZlbnRzIG90aGVyIHJlbW90ZQorICAgICAgICAgICAgIGhvc3RzIGZyb20gY29ubmVjdGluZyB0byBmb3J3YXJkZWQgcG9ydHMuICBHYXRld2F5UG9ydHMgY2FuIGJlCisgICAgICAgICAgICAgdXNlZCB0byBzcGVjaWZ5IHRoYXQgc3NoZCBzaG91bGQgYWxsb3cgcmVtb3RlIHBvcnQgZm9yd2FyZGluZ3MgdG8KKyAgICAgICAgICAgICBiaW5kIHRvIG5vbi1sb29wYmFjayBhZGRyZXNzZXMsIHRodXMgYWxsb3dpbmcgb3RoZXIgaG9zdHMgdG8KKyAgICAgICAgICAgICBjb25uZWN0LiAgVGhlIGFyZ3VtZW50IG1heSBiZSBgYG5vJycgdG8gZm9yY2UgcmVtb3RlIHBvcnQKKyAgICAgICAgICAgICBmb3J3YXJkaW5ncyB0byBiZSBhdmFpbGFibGUgdG8gdGhlIGxvY2FsIGhvc3Qgb25seSwgYGB5ZXMnJyB0bworICAgICAgICAgICAgIGZvcmNlIHJlbW90ZSBwb3J0IGZvcndhcmRpbmdzIHRvIGJpbmQgdG8gdGhlIHdpbGRjYXJkIGFkZHJlc3MsIG9yCisgICAgICAgICAgICAgYGBjbGllbnRzcGVjaWZpZWQnJyB0byBhbGxvdyB0aGUgY2xpZW50IHRvIHNlbGVjdCB0aGUgYWRkcmVzcyB0bworICAgICAgICAgICAgIHdoaWNoIHRoZSBmb3J3YXJkaW5nIGlzIGJvdW5kLiAgVGhlIGRlZmF1bHQgaXMgYGBubycnLgorCisgICAgIEdTU0FQSUF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgdXNlciBhdXRoZW50aWNhdGlvbiBiYXNlZCBvbiBHU1NBUEkgaXMgYWxsb3dlZC4KKyAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyBgYG5vJycuICBOb3RlIHRoYXQgdGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbAorICAgICAgICAgICAgIHZlcnNpb24gMiBvbmx5LgorCisgICAgIEdTU0FQSUNsZWFudXBDcmVkZW50aWFscworICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgZGVzdHJveSB0aGUgdXNlcidzIGNyZWRlbnRpYWxzCisgICAgICAgICAgICAgY2FjaGUgb24gbG9nb3V0LiAgVGhlIGRlZmF1bHQgaXMgYGB5ZXMnJy4gIE5vdGUgdGhhdCB0aGlzIG9wdGlvbgorICAgICAgICAgICAgIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAyIG9ubHkuCisKKyAgICAgSG9zdGJhc2VkQXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciByaG9zdHMgb3IgL2V0Yy9ob3N0cy5lcXVpdiBhdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgIHRvZ2V0aGVyIHdpdGggc3VjY2Vzc2Z1bCBwdWJsaWMga2V5IGNsaWVudCBob3N0IGF1dGhlbnRpY2F0aW9uIGlzCisgICAgICAgICAgICAgYWxsb3dlZCAoaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbikuICBUaGlzIG9wdGlvbiBpcyBzaW1pbGFyIHRvCisgICAgICAgICAgICAgUmhvc3RzUlNBQXV0aGVudGljYXRpb24gYW5kIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAyIG9ubHkuCisgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgYGBubycnLgorCisgICAgIEhvc3RiYXNlZFVzZXNOYW1lRnJvbVBhY2tldE9ubHkKKyAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIHNlcnZlciB3aWxsIGF0dGVtcHQgdG8gcGVyZm9ybSBhCisgICAgICAgICAgICAgcmV2ZXJzZSBuYW1lIGxvb2t1cCB3aGVuIG1hdGNoaW5nIHRoZSBuYW1lIGluIHRoZSB+Ly5zaG9zdHMsCisgICAgICAgICAgICAgfi8ucmhvc3RzLCBhbmQgL2V0Yy9ob3N0cy5lcXVpdiBmaWxlcyBkdXJpbmcKKyAgICAgICAgICAgICBIb3N0YmFzZWRBdXRoZW50aWNhdGlvbi4gIEEgc2V0dGluZyBvZiBgYHllcycnIG1lYW5zIHRoYXQgc3NoZCg4KQorICAgICAgICAgICAgIHVzZXMgdGhlIG5hbWUgc3VwcGxpZWQgYnkgdGhlIGNsaWVudCByYXRoZXIgdGhhbiBhdHRlbXB0aW5nIHRvCisgICAgICAgICAgICAgcmVzb2x2ZSB0aGUgbmFtZSBmcm9tIHRoZSBUQ1AgY29ubmVjdGlvbiBpdHNlbGYuICBUaGUgZGVmYXVsdCBpcworICAgICAgICAgICAgIGBgbm8nJy4KKworICAgICBIb3N0Q2VydGlmaWNhdGUKKyAgICAgICAgICAgICBTcGVjaWZpZXMgYSBmaWxlIGNvbnRhaW5pbmcgYSBwdWJsaWMgaG9zdCBjZXJ0aWZpY2F0ZS4gIFRoZQorICAgICAgICAgICAgIGNlcnRpZmljYXRlJ3MgcHVibGljIGtleSBtdXN0IG1hdGNoIGEgcHJpdmF0ZSBob3N0IGtleSBhbHJlYWR5CisgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IEhvc3RLZXkuICBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgb2Ygc3NoZCg4KSBpcyBub3QgdG8KKyAgICAgICAgICAgICBsb2FkIGFueSBjZXJ0aWZpY2F0ZXMuCisKKyAgICAgSG9zdEtleQorICAgICAgICAgICAgIFNwZWNpZmllcyBhIGZpbGUgY29udGFpbmluZyBhIHByaXZhdGUgaG9zdCBrZXkgdXNlZCBieSBTU0guICBUaGUKKyAgICAgICAgICAgICBkZWZhdWx0IGlzIC9ldGMvc3NoL3NzaF9ob3N0X2tleSBmb3IgcHJvdG9jb2wgdmVyc2lvbiAxLCBhbmQKKyAgICAgICAgICAgICAvZXRjL3NzaC9zc2hfaG9zdF9kc2Ffa2V5LCAvZXRjL3NzaC9zc2hfaG9zdF9lY2RzYV9rZXkgYW5kCisgICAgICAgICAgICAgL2V0Yy9zc2gvc3NoX2hvc3RfcnNhX2tleSBmb3IgcHJvdG9jb2wgdmVyc2lvbiAyLiAgTm90ZSB0aGF0CisgICAgICAgICAgICAgc3NoZCg4KSB3aWxsIHJlZnVzZSB0byB1c2UgYSBmaWxlIGlmIGl0IGlzIGdyb3VwL3dvcmxkLQorICAgICAgICAgICAgIGFjY2Vzc2libGUuICBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGhvc3Qga2V5IGZpbGVzLgorICAgICAgICAgICAgIGBgcnNhMScnIGtleXMgYXJlIHVzZWQgZm9yIHZlcnNpb24gMSBhbmQgYGBkc2EnJywgYGBlY2RzYScnIG9yCisgICAgICAgICAgICAgYGByc2EnJyBhcmUgdXNlZCBmb3IgdmVyc2lvbiAyIG9mIHRoZSBTU0ggcHJvdG9jb2wuCisKKyAgICAgSWdub3JlUmhvc3RzCisgICAgICAgICAgICAgU3BlY2lmaWVzIHRoYXQgLnJob3N0cyBhbmQgLnNob3N0cyBmaWxlcyB3aWxsIG5vdCBiZSB1c2VkIGluCisgICAgICAgICAgICAgUmhvc3RzUlNBQXV0aGVudGljYXRpb24gb3IgSG9zdGJhc2VkQXV0aGVudGljYXRpb24uCisKKyAgICAgICAgICAgICAvZXRjL2hvc3RzLmVxdWl2IGFuZCAvZXRjL3Nob3N0cy5lcXVpdiBhcmUgc3RpbGwgdXNlZC4gIFRoZQorICAgICAgICAgICAgIGRlZmF1bHQgaXMgYGB5ZXMnJy4KKworICAgICBJZ25vcmVVc2VyS25vd25Ib3N0cworICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHNzaGQoOCkgc2hvdWxkIGlnbm9yZSB0aGUgdXNlcidzCisgICAgICAgICAgICAgfi8uc3NoL2tub3duX2hvc3RzIGR1cmluZyBSaG9zdHNSU0FBdXRoZW50aWNhdGlvbiBvcgorICAgICAgICAgICAgIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uLiAgVGhlIGRlZmF1bHQgaXMgYGBubycnLgorCisgICAgIElQUW9TICAgU3BlY2lmaWVzIHRoZSBJUHY0IHR5cGUtb2Ytc2VydmljZSBvciBEU0NQIGNsYXNzIGZvciB0aGUKKyAgICAgICAgICAgICBjb25uZWN0aW9uLiAgQWNjZXB0ZWQgdmFsdWVzIGFyZSBgYGFmMTEnJywgYGBhZjEyJycsIGBgYWYxMycnLAorICAgICAgICAgICAgIGBgYWYyMScnLCBgYGFmMjInJywgYGBhZjIzJycsIGBgYWYzMScnLCBgYGFmMzInJywgYGBhZjMzJycsCisgICAgICAgICAgICAgYGBhZjQxJycsIGBgYWY0MicnLCBgYGFmNDMnJywgYGBjczAnJywgYGBjczEnJywgYGBjczInJywgYGBjczMnJywKKyAgICAgICAgICAgICBgYGNzNCcnLCBgYGNzNScnLCBgYGNzNicnLCBgYGNzNycnLCBgYGVmJycsIGBgbG93ZGVsYXknJywKKyAgICAgICAgICAgICBgYHRocm91Z2hwdXQnJywgYGByZWxpYWJpbGl0eScnLCBvciBhIG51bWVyaWMgdmFsdWUuICBUaGlzIG9wdGlvbgorICAgICAgICAgICAgIG1heSB0YWtlIG9uZSBvciB0d28gYXJndW1lbnRzLCBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4gIElmIG9uZQorICAgICAgICAgICAgIGFyZ3VtZW50IGlzIHNwZWNpZmllZCwgaXQgaXMgdXNlZCBhcyB0aGUgcGFja2V0IGNsYXNzCisgICAgICAgICAgICAgdW5jb25kaXRpb25hbGx5LiAgSWYgdHdvIHZhbHVlcyBhcmUgc3BlY2lmaWVkLCB0aGUgZmlyc3QgaXMKKyAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIGZvciBpbnRlcmFjdGl2ZSBzZXNzaW9ucyBhbmQgdGhlIHNlY29uZAorICAgICAgICAgICAgIGZvciBub24taW50ZXJhY3RpdmUgc2Vzc2lvbnMuICBUaGUgZGVmYXVsdCBpcyBgYGxvd2RlbGF5JycgZm9yCisgICAgICAgICAgICAgaW50ZXJhY3RpdmUgc2Vzc2lvbnMgYW5kIGBgdGhyb3VnaHB1dCcnIGZvciBub24taW50ZXJhY3RpdmUKKyAgICAgICAgICAgICBzZXNzaW9ucy4KKworICAgICBLZXJiZXJvc0F1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHBhc3N3b3JkIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIGZvcgorICAgICAgICAgICAgIFBhc3N3b3JkQXV0aGVudGljYXRpb24gd2lsbCBiZSB2YWxpZGF0ZWQgdGhyb3VnaCB0aGUgS2VyYmVyb3MKKyAgICAgICAgICAgICBLREMuICBUbyB1c2UgdGhpcyBvcHRpb24sIHRoZSBzZXJ2ZXIgbmVlZHMgYSBLZXJiZXJvcyBzZXJ2dGFiCisgICAgICAgICAgICAgd2hpY2ggYWxsb3dzIHRoZSB2ZXJpZmljYXRpb24gb2YgdGhlIEtEQydzIGlkZW50aXR5LiAgVGhlIGRlZmF1bHQKKyAgICAgICAgICAgICBpcyBgYG5vJycuCisKKyAgICAgS2VyYmVyb3NHZXRBRlNUb2tlbgorICAgICAgICAgICAgIElmIEFGUyBpcyBhY3RpdmUgYW5kIHRoZSB1c2VyIGhhcyBhIEtlcmJlcm9zIDUgVEdULCBhdHRlbXB0IHRvCisgICAgICAgICAgICAgYWNxdWlyZSBhbiBBRlMgdG9rZW4gYmVmb3JlIGFjY2Vzc2luZyB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LgorICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIGBgbm8nJy4KKworICAgICBLZXJiZXJvc09yTG9jYWxQYXNzd2QKKyAgICAgICAgICAgICBJZiBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiB0aHJvdWdoIEtlcmJlcm9zIGZhaWxzIHRoZW4gdGhlCisgICAgICAgICAgICAgcGFzc3dvcmQgd2lsbCBiZSB2YWxpZGF0ZWQgdmlhIGFueSBhZGRpdGlvbmFsIGxvY2FsIG1lY2hhbmlzbQorICAgICAgICAgICAgIHN1Y2ggYXMgL2V0Yy9wYXNzd2QuICBUaGUgZGVmYXVsdCBpcyBgYHllcycnLgorCisgICAgIEtlcmJlcm9zVGlja2V0Q2xlYW51cAorICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgZGVzdHJveSB0aGUgdXNlcidzIHRpY2tldAorICAgICAgICAgICAgIGNhY2hlIGZpbGUgb24gbG9nb3V0LiAgVGhlIGRlZmF1bHQgaXMgYGB5ZXMnJy4KKworICAgICBLZXhBbGdvcml0aG1zCisgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBhdmFpbGFibGUgS0VYIChLZXkgRXhjaGFuZ2UpIGFsZ29yaXRobXMuICBNdWx0aXBsZQorICAgICAgICAgICAgIGFsZ29yaXRobXMgbXVzdCBiZSBjb21tYS1zZXBhcmF0ZWQuICBUaGUgZGVmYXVsdCBpcworICAgICAgICAgICAgIGBgZWNkaC1zaGEyLW5pc3RwMjU2JycsIGBgZWNkaC1zaGEyLW5pc3RwMzg0JycsCisgICAgICAgICAgICAgYGBlY2RoLXNoYTItbmlzdHA1MjEnJywgYGBkaWZmaWUtaGVsbG1hbi1ncm91cC1leGNoYW5nZS1zaGEyNTYnJywKKyAgICAgICAgICAgICBgYGRpZmZpZS1oZWxsbWFuLWdyb3VwLWV4Y2hhbmdlLXNoYTEnJywKKyAgICAgICAgICAgICBgYGRpZmZpZS1oZWxsbWFuLWdyb3VwMTQtc2hhMScnLCBgYGRpZmZpZS1oZWxsbWFuLWdyb3VwMS1zaGExJycuCisKKyAgICAgS2V5UmVnZW5lcmF0aW9uSW50ZXJ2YWwKKyAgICAgICAgICAgICBJbiBwcm90b2NvbCB2ZXJzaW9uIDEsIHRoZSBlcGhlbWVyYWwgc2VydmVyIGtleSBpcyBhdXRvbWF0aWNhbGx5CisgICAgICAgICAgICAgcmVnZW5lcmF0ZWQgYWZ0ZXIgdGhpcyBtYW55IHNlY29uZHMgKGlmIGl0IGhhcyBiZWVuIHVzZWQpLiAgVGhlCisgICAgICAgICAgICAgcHVycG9zZSBvZiByZWdlbmVyYXRpb24gaXMgdG8gcHJldmVudCBkZWNyeXB0aW5nIGNhcHR1cmVkCisgICAgICAgICAgICAgc2Vzc2lvbnMgYnkgbGF0ZXIgYnJlYWtpbmcgaW50byB0aGUgbWFjaGluZSBhbmQgc3RlYWxpbmcgdGhlCisgICAgICAgICAgICAga2V5cy4gIFRoZSBrZXkgaXMgbmV2ZXIgc3RvcmVkIGFueXdoZXJlLiAgSWYgdGhlIHZhbHVlIGlzIDAsIHRoZQorICAgICAgICAgICAgIGtleSBpcyBuZXZlciByZWdlbmVyYXRlZC4gIFRoZSBkZWZhdWx0IGlzIDM2MDAgKHNlY29uZHMpLgorCisgICAgIExpc3RlbkFkZHJlc3MKKyAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGxvY2FsIGFkZHJlc3NlcyBzc2hkKDgpIHNob3VsZCBsaXN0ZW4gb24uICBUaGUKKyAgICAgICAgICAgICBmb2xsb3dpbmcgZm9ybXMgbWF5IGJlIHVzZWQ6CisKKyAgICAgICAgICAgICAgICAgICBMaXN0ZW5BZGRyZXNzIGhvc3R8SVB2NF9hZGRyfElQdjZfYWRkcgorICAgICAgICAgICAgICAgICAgIExpc3RlbkFkZHJlc3MgaG9zdHxJUHY0X2FkZHI6cG9ydAorICAgICAgICAgICAgICAgICAgIExpc3RlbkFkZHJlc3MgW2hvc3R8SVB2Nl9hZGRyXTpwb3J0CisKKyAgICAgICAgICAgICBJZiBwb3J0IGlzIG5vdCBzcGVjaWZpZWQsIHNzaGQgd2lsbCBsaXN0ZW4gb24gdGhlIGFkZHJlc3MgYW5kIGFsbAorICAgICAgICAgICAgIHByaW9yIFBvcnQgb3B0aW9ucyBzcGVjaWZpZWQuICBUaGUgZGVmYXVsdCBpcyB0byBsaXN0ZW4gb24gYWxsCisgICAgICAgICAgICAgbG9jYWwgYWRkcmVzc2VzLiAgTXVsdGlwbGUgTGlzdGVuQWRkcmVzcyBvcHRpb25zIGFyZSBwZXJtaXR0ZWQuCisgICAgICAgICAgICAgQWRkaXRpb25hbGx5LCBhbnkgUG9ydCBvcHRpb25zIG11c3QgcHJlY2VkZSB0aGlzIG9wdGlvbiBmb3Igbm9uLQorICAgICAgICAgICAgIHBvcnQgcXVhbGlmaWVkIGFkZHJlc3Nlcy4KKworICAgICBMb2dpbkdyYWNlVGltZQorICAgICAgICAgICAgIFRoZSBzZXJ2ZXIgZGlzY29ubmVjdHMgYWZ0ZXIgdGhpcyB0aW1lIGlmIHRoZSB1c2VyIGhhcyBub3QKKyAgICAgICAgICAgICBzdWNjZXNzZnVsbHkgbG9nZ2VkIGluLiAgSWYgdGhlIHZhbHVlIGlzIDAsIHRoZXJlIGlzIG5vIHRpbWUKKyAgICAgICAgICAgICBsaW1pdC4gIFRoZSBkZWZhdWx0IGlzIDEyMCBzZWNvbmRzLgorCisgICAgIExvZ0xldmVsCisgICAgICAgICAgICAgR2l2ZXMgdGhlIHZlcmJvc2l0eSBsZXZlbCB0aGF0IGlzIHVzZWQgd2hlbiBsb2dnaW5nIG1lc3NhZ2VzIGZyb20KKyAgICAgICAgICAgICBzc2hkKDgpLiAgVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6IFFVSUVULCBGQVRBTCwgRVJST1IsIElORk8sCisgICAgICAgICAgICAgVkVSQk9TRSwgREVCVUcsIERFQlVHMSwgREVCVUcyLCBhbmQgREVCVUczLiAgVGhlIGRlZmF1bHQgaXMgSU5GTy4KKyAgICAgICAgICAgICBERUJVRyBhbmQgREVCVUcxIGFyZSBlcXVpdmFsZW50LiAgREVCVUcyIGFuZCBERUJVRzMgZWFjaCBzcGVjaWZ5CisgICAgICAgICAgICAgaGlnaGVyIGxldmVscyBvZiBkZWJ1Z2dpbmcgb3V0cHV0LiAgTG9nZ2luZyB3aXRoIGEgREVCVUcgbGV2ZWwKKyAgICAgICAgICAgICB2aW9sYXRlcyB0aGUgcHJpdmFjeSBvZiB1c2VycyBhbmQgaXMgbm90IHJlY29tbWVuZGVkLgorCisgICAgIE1BQ3MgICAgU3BlY2lmaWVzIHRoZSBhdmFpbGFibGUgTUFDIChtZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGNvZGUpCisgICAgICAgICAgICAgYWxnb3JpdGhtcy4gIFRoZSBNQUMgYWxnb3JpdGhtIGlzIHVzZWQgaW4gcHJvdG9jb2wgdmVyc2lvbiAyIGZvcgorICAgICAgICAgICAgIGRhdGEgaW50ZWdyaXR5IHByb3RlY3Rpb24uICBNdWx0aXBsZSBhbGdvcml0aG1zIG11c3QgYmUgY29tbWEtCisgICAgICAgICAgICAgc2VwYXJhdGVkLiAgVGhlIGRlZmF1bHQgaXM6CisKKyAgICAgICAgICAgICAgICAgICBobWFjLW1kNSxobWFjLXNoYTEsdW1hYy02NEBvcGVuc3NoLmNvbSwKKyAgICAgICAgICAgICAgICAgICBobWFjLXJpcGVtZDE2MCxobWFjLXNoYTEtOTYsaG1hYy1tZDUtOTYsCisgICAgICAgICAgICAgICAgICAgaG1hYy1zaGEyLTI1NixobWFjLXNoYTI1Ni05NixobWFjLXNoYTItNTEyLAorICAgICAgICAgICAgICAgICAgIGhtYWMtc2hhMi01MTItOTYKKworICAgICBNYXRjaCAgIEludHJvZHVjZXMgYSBjb25kaXRpb25hbCBibG9jay4gIElmIGFsbCBvZiB0aGUgY3JpdGVyaWEgb24gdGhlCisgICAgICAgICAgICAgTWF0Y2ggbGluZSBhcmUgc2F0aXNmaWVkLCB0aGUga2V5d29yZHMgb24gdGhlIGZvbGxvd2luZyBsaW5lcworICAgICAgICAgICAgIG92ZXJyaWRlIHRob3NlIHNldCBpbiB0aGUgZ2xvYmFsIHNlY3Rpb24gb2YgdGhlIGNvbmZpZyBmaWxlLAorICAgICAgICAgICAgIHVudGlsIGVpdGhlciBhbm90aGVyIE1hdGNoIGxpbmUgb3IgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKworICAgICAgICAgICAgIFRoZSBhcmd1bWVudHMgdG8gTWF0Y2ggYXJlIG9uZSBvciBtb3JlIGNyaXRlcmlhLXBhdHRlcm4gcGFpcnMuCisgICAgICAgICAgICAgVGhlIGF2YWlsYWJsZSBjcml0ZXJpYSBhcmUgVXNlciwgR3JvdXAsIEhvc3QsIGFuZCBBZGRyZXNzLiAgVGhlCisgICAgICAgICAgICAgbWF0Y2ggcGF0dGVybnMgbWF5IGNvbnNpc3Qgb2Ygc2luZ2xlIGVudHJpZXMgb3IgY29tbWEtc2VwYXJhdGVkCisgICAgICAgICAgICAgbGlzdHMgYW5kIG1heSB1c2UgdGhlIHdpbGRjYXJkIGFuZCBuZWdhdGlvbiBvcGVyYXRvcnMgZGVzY3JpYmVkCisgICAgICAgICAgICAgaW4gdGhlIFBBVFRFUk5TIHNlY3Rpb24gb2Ygc3NoX2NvbmZpZyg1KS4KKworICAgICAgICAgICAgIFRoZSBwYXR0ZXJucyBpbiBhbiBBZGRyZXNzIGNyaXRlcmlhIG1heSBhZGRpdGlvbmFsbHkgY29udGFpbgorICAgICAgICAgICAgIGFkZHJlc3NlcyB0byBtYXRjaCBpbiBDSURSIGFkZHJlc3MvbWFza2xlbiBmb3JtYXQsIGUuZy4KKyAgICAgICAgICAgICBgYDE5Mi4wLjIuMC8yNCcnIG9yIGBgM2ZmZTpmZmZmOjovMzInJy4gIE5vdGUgdGhhdCB0aGUgbWFzaworICAgICAgICAgICAgIGxlbmd0aCBwcm92aWRlZCBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgYWRkcmVzcyAtIGl0IGlzIGFuCisgICAgICAgICAgICAgZXJyb3IgdG8gc3BlY2lmeSBhIG1hc2sgbGVuZ3RoIHRoYXQgaXMgdG9vIGxvbmcgZm9yIHRoZSBhZGRyZXNzCisgICAgICAgICAgICAgb3Igb25lIHdpdGggYml0cyBzZXQgaW4gdGhpcyBob3N0IHBvcnRpb24gb2YgdGhlIGFkZHJlc3MuICBGb3IKKyAgICAgICAgICAgICBleGFtcGxlLCBgYDE5Mi4wLjIuMC8zMycnIGFuZCBgYDE5Mi4wLjIuMC84JycgcmVzcGVjdGl2ZWx5LgorCisgICAgICAgICAgICAgT25seSBhIHN1YnNldCBvZiBrZXl3b3JkcyBtYXkgYmUgdXNlZCBvbiB0aGUgbGluZXMgZm9sbG93aW5nIGEKKyAgICAgICAgICAgICBNYXRjaCBrZXl3b3JkLiAgQXZhaWxhYmxlIGtleXdvcmRzIGFyZSBBbGxvd0FnZW50Rm9yd2FyZGluZywKKyAgICAgICAgICAgICBBbGxvd1RjcEZvcndhcmRpbmcsIEF1dGhvcml6ZWRLZXlzRmlsZSwgQXV0aG9yaXplZFByaW5jaXBhbHNGaWxlLAorICAgICAgICAgICAgIEJhbm5lciwgQ2hyb290RGlyZWN0b3J5LCBGb3JjZUNvbW1hbmQsIEdhdGV3YXlQb3J0cywKKyAgICAgICAgICAgICBHU1NBUElBdXRoZW50aWNhdGlvbiwgSG9zdGJhc2VkQXV0aGVudGljYXRpb24sCisgICAgICAgICAgICAgSG9zdGJhc2VkVXNlc05hbWVGcm9tUGFja2V0T25seSwgS2JkSW50ZXJhY3RpdmVBdXRoZW50aWNhdGlvbiwKKyAgICAgICAgICAgICBLZXJiZXJvc0F1dGhlbnRpY2F0aW9uLCBNYXhBdXRoVHJpZXMsIE1heFNlc3Npb25zLAorICAgICAgICAgICAgIFBhc3N3b3JkQXV0aGVudGljYXRpb24sIFBlcm1pdEVtcHR5UGFzc3dvcmRzLCBQZXJtaXRPcGVuLAorICAgICAgICAgICAgIFBlcm1pdFJvb3RMb2dpbiwgUGVybWl0VHVubmVsLCBQdWJrZXlBdXRoZW50aWNhdGlvbiwKKyAgICAgICAgICAgICBSaG9zdHNSU0FBdXRoZW50aWNhdGlvbiwgUlNBQXV0aGVudGljYXRpb24sIFgxMURpc3BsYXlPZmZzZXQsCisgICAgICAgICAgICAgWDExRm9yd2FyZGluZyBhbmQgWDExVXNlTG9jYWxIb3N0LgorCisgICAgIE1heEF1dGhUcmllcworICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgcGVybWl0dGVkCisgICAgICAgICAgICAgcGVyIGNvbm5lY3Rpb24uICBPbmNlIHRoZSBudW1iZXIgb2YgZmFpbHVyZXMgcmVhY2hlcyBoYWxmIHRoaXMKKyAgICAgICAgICAgICB2YWx1ZSwgYWRkaXRpb25hbCBmYWlsdXJlcyBhcmUgbG9nZ2VkLiAgVGhlIGRlZmF1bHQgaXMgNi4KKworICAgICBNYXhTZXNzaW9ucworICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb3BlbiBzZXNzaW9ucyBwZXJtaXR0ZWQgcGVyCisgICAgICAgICAgICAgbmV0d29yayBjb25uZWN0aW9uLiAgVGhlIGRlZmF1bHQgaXMgMTAuCisKKyAgICAgTWF4U3RhcnR1cHMKKyAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgdW5hdXRoZW50aWNhdGVkCisgICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gdGhlIFNTSCBkYWVtb24uICBBZGRpdGlvbmFsIGNvbm5lY3Rpb25zIHdpbGwgYmUKKyAgICAgICAgICAgICBkcm9wcGVkIHVudGlsIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRzIG9yIHRoZSBMb2dpbkdyYWNlVGltZQorICAgICAgICAgICAgIGV4cGlyZXMgZm9yIGEgY29ubmVjdGlvbi4gIFRoZSBkZWZhdWx0IGlzIDEwLgorCisgICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgcmFuZG9tIGVhcmx5IGRyb3AgY2FuIGJlIGVuYWJsZWQgYnkgc3BlY2lmeWluZyB0aGUKKyAgICAgICAgICAgICB0aHJlZSBjb2xvbiBzZXBhcmF0ZWQgdmFsdWVzIGBgc3RhcnQ6cmF0ZTpmdWxsJycgKGUuZy4KKyAgICAgICAgICAgICAiMTA6MzA6NjAiKS4gIHNzaGQoOCkgd2lsbCByZWZ1c2UgY29ubmVjdGlvbiBhdHRlbXB0cyB3aXRoIGEKKyAgICAgICAgICAgICBwcm9iYWJpbGl0eSBvZiBgYHJhdGUvMTAwJycgKDMwJSkgaWYgdGhlcmUgYXJlIGN1cnJlbnRseQorICAgICAgICAgICAgIGBgc3RhcnQnJyAoMTApIHVuYXV0aGVudGljYXRlZCBjb25uZWN0aW9ucy4gIFRoZSBwcm9iYWJpbGl0eQorICAgICAgICAgICAgIGluY3JlYXNlcyBsaW5lYXJseSBhbmQgYWxsIGNvbm5lY3Rpb24gYXR0ZW1wdHMgYXJlIHJlZnVzZWQgaWYgdGhlCisgICAgICAgICAgICAgbnVtYmVyIG9mIHVuYXV0aGVudGljYXRlZCBjb25uZWN0aW9ucyByZWFjaGVzIGBgZnVsbCcnICg2MCkuCisKKyAgICAgUGFzc3dvcmRBdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIGlzIGFsbG93ZWQuICBUaGUKKyAgICAgICAgICAgICBkZWZhdWx0IGlzIGBgeWVzJycuCisKKyAgICAgUGVybWl0RW1wdHlQYXNzd29yZHMKKyAgICAgICAgICAgICBXaGVuIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIGlzIGFsbG93ZWQsIGl0IHNwZWNpZmllcyB3aGV0aGVyIHRoZQorICAgICAgICAgICAgIHNlcnZlciBhbGxvd3MgbG9naW4gdG8gYWNjb3VudHMgd2l0aCBlbXB0eSBwYXNzd29yZCBzdHJpbmdzLiAgVGhlCisgICAgICAgICAgICAgZGVmYXVsdCBpcyBgYG5vJycuCisKKyAgICAgUGVybWl0T3BlbgorICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgZGVzdGluYXRpb25zIHRvIHdoaWNoIFRDUCBwb3J0IGZvcndhcmRpbmcgaXMKKyAgICAgICAgICAgICBwZXJtaXR0ZWQuICBUaGUgZm9yd2FyZGluZyBzcGVjaWZpY2F0aW9uIG11c3QgYmUgb25lIG9mIHRoZQorICAgICAgICAgICAgIGZvbGxvd2luZyBmb3JtczoKKworICAgICAgICAgICAgICAgICAgIFBlcm1pdE9wZW4gaG9zdDpwb3J0CisgICAgICAgICAgICAgICAgICAgUGVybWl0T3BlbiBJUHY0X2FkZHI6cG9ydAorICAgICAgICAgICAgICAgICAgIFBlcm1pdE9wZW4gW0lQdjZfYWRkcl06cG9ydAorCisgICAgICAgICAgICAgTXVsdGlwbGUgZm9yd2FyZHMgbWF5IGJlIHNwZWNpZmllZCBieSBzZXBhcmF0aW5nIHRoZW0gd2l0aAorICAgICAgICAgICAgIHdoaXRlc3BhY2UuICBBbiBhcmd1bWVudCBvZiBgYGFueScnIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSBhbGwKKyAgICAgICAgICAgICByZXN0cmljdGlvbnMgYW5kIHBlcm1pdCBhbnkgZm9yd2FyZGluZyByZXF1ZXN0cy4gIEJ5IGRlZmF1bHQgYWxsCisgICAgICAgICAgICAgcG9ydCBmb3J3YXJkaW5nIHJlcXVlc3RzIGFyZSBwZXJtaXR0ZWQuCisKKyAgICAgUGVybWl0Um9vdExvZ2luCisgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgcm9vdCBjYW4gbG9nIGluIHVzaW5nIHNzaCgxKS4gIFRoZSBhcmd1bWVudAorICAgICAgICAgICAgIG11c3QgYmUgYGB5ZXMnJywgYGB3aXRob3V0LXBhc3N3b3JkJycsIGBgZm9yY2VkLWNvbW1hbmRzLW9ubHknJywKKyAgICAgICAgICAgICBvciBgYG5vJycuICBUaGUgZGVmYXVsdCBpcyBgYHllcycnLgorCisgICAgICAgICAgICAgSWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvIGBgd2l0aG91dC1wYXNzd29yZCcnLCBwYXNzd29yZAorICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uIGlzIGRpc2FibGVkIGZvciByb290LgorCisgICAgICAgICAgICAgSWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvIGBgZm9yY2VkLWNvbW1hbmRzLW9ubHknJywgcm9vdCBsb2dpbgorICAgICAgICAgICAgIHdpdGggcHVibGljIGtleSBhdXRoZW50aWNhdGlvbiB3aWxsIGJlIGFsbG93ZWQsIGJ1dCBvbmx5IGlmIHRoZQorICAgICAgICAgICAgIGNvbW1hbmQgb3B0aW9uIGhhcyBiZWVuIHNwZWNpZmllZCAod2hpY2ggbWF5IGJlIHVzZWZ1bCBmb3IgdGFraW5nCisgICAgICAgICAgICAgcmVtb3RlIGJhY2t1cHMgZXZlbiBpZiByb290IGxvZ2luIGlzIG5vcm1hbGx5IG5vdCBhbGxvd2VkKS4gIEFsbAorICAgICAgICAgICAgIG90aGVyIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgYXJlIGRpc2FibGVkIGZvciByb290LgorCisgICAgICAgICAgICAgSWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvIGBgbm8nJywgcm9vdCBpcyBub3QgYWxsb3dlZCB0byBsb2cgaW4uCisKKyAgICAgUGVybWl0VHVubmVsCisgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgdHVuKDQpIGRldmljZSBmb3J3YXJkaW5nIGlzIGFsbG93ZWQuICBUaGUKKyAgICAgICAgICAgICBhcmd1bWVudCBtdXN0IGJlIGBgeWVzJycsIGBgcG9pbnQtdG8tcG9pbnQnJyAobGF5ZXIgMyksCisgICAgICAgICAgICAgYGBldGhlcm5ldCcnIChsYXllciAyKSwgb3IgYGBubycnLiAgU3BlY2lmeWluZyBgYHllcycnIHBlcm1pdHMKKyAgICAgICAgICAgICBib3RoIGBgcG9pbnQtdG8tcG9pbnQnJyBhbmQgYGBldGhlcm5ldCcnLiAgVGhlIGRlZmF1bHQgaXMgYGBubycnLgorCisgICAgIFBlcm1pdFVzZXJFbnZpcm9ubWVudAorICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIH4vLnNzaC9lbnZpcm9ubWVudCBhbmQgZW52aXJvbm1lbnQ9IG9wdGlvbnMgaW4KKyAgICAgICAgICAgICB+Ly5zc2gvYXV0aG9yaXplZF9rZXlzIGFyZSBwcm9jZXNzZWQgYnkgc3NoZCg4KS4gIFRoZSBkZWZhdWx0IGlzCisgICAgICAgICAgICAgYGBubycnLiAgRW5hYmxpbmcgZW52aXJvbm1lbnQgcHJvY2Vzc2luZyBtYXkgZW5hYmxlIHVzZXJzIHRvCisgICAgICAgICAgICAgYnlwYXNzIGFjY2VzcyByZXN0cmljdGlvbnMgaW4gc29tZSBjb25maWd1cmF0aW9ucyB1c2luZworICAgICAgICAgICAgIG1lY2hhbmlzbXMgc3VjaCBhcyBMRF9QUkVMT0FELgorCisgICAgIFBpZEZpbGUKKyAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgU1NICisgICAgICAgICAgICAgZGFlbW9uLiAgVGhlIGRlZmF1bHQgaXMgL3Zhci9ydW4vc3NoZC5waWQuCisKKyAgICAgUG9ydCAgICBTcGVjaWZpZXMgdGhlIHBvcnQgbnVtYmVyIHRoYXQgc3NoZCg4KSBsaXN0ZW5zIG9uLiAgVGhlIGRlZmF1bHQKKyAgICAgICAgICAgICBpcyAyMi4gIE11bHRpcGxlIG9wdGlvbnMgb2YgdGhpcyB0eXBlIGFyZSBwZXJtaXR0ZWQuICBTZWUgYWxzbworICAgICAgICAgICAgIExpc3RlbkFkZHJlc3MuCisKKyAgICAgUHJpbnRMYXN0TG9nCisgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgc3NoZCg4KSBzaG91bGQgcHJpbnQgdGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlCisgICAgICAgICAgICAgbGFzdCB1c2VyIGxvZ2luIHdoZW4gYSB1c2VyIGxvZ3MgaW4gaW50ZXJhY3RpdmVseS4gIFRoZSBkZWZhdWx0CisgICAgICAgICAgICAgaXMgYGB5ZXMnJy4KKworICAgICBQcmludE1vdGQKKyAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBzc2hkKDgpIHNob3VsZCBwcmludCAvZXRjL21vdGQgd2hlbiBhIHVzZXIgbG9ncworICAgICAgICAgICAgIGluIGludGVyYWN0aXZlbHkuICAoT24gc29tZSBzeXN0ZW1zIGl0IGlzIGFsc28gcHJpbnRlZCBieSB0aGUKKyAgICAgICAgICAgICBzaGVsbCwgL2V0Yy9wcm9maWxlLCBvciBlcXVpdmFsZW50LikgIFRoZSBkZWZhdWx0IGlzIGBgeWVzJycuCisKKyAgICAgUHJvdG9jb2wKKyAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHByb3RvY29sIHZlcnNpb25zIHNzaGQoOCkgc3VwcG9ydHMuICBUaGUgcG9zc2libGUKKyAgICAgICAgICAgICB2YWx1ZXMgYXJlIGAxJyBhbmQgYDInLiAgTXVsdGlwbGUgdmVyc2lvbnMgbXVzdCBiZSBjb21tYS0KKyAgICAgICAgICAgICBzZXBhcmF0ZWQuICBUaGUgZGVmYXVsdCBpcyBgMicuICBOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIHRoZQorICAgICAgICAgICAgIHByb3RvY29sIGxpc3QgZG9lcyBub3QgaW5kaWNhdGUgcHJlZmVyZW5jZSwgYmVjYXVzZSB0aGUgY2xpZW50CisgICAgICAgICAgICAgc2VsZWN0cyBhbW9uZyBtdWx0aXBsZSBwcm90b2NvbCB2ZXJzaW9ucyBvZmZlcmVkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICAgICAgICAgU3BlY2lmeWluZyBgYDIsMScnIGlzIGlkZW50aWNhbCB0byBgYDEsMicnLgorCisgICAgIFB1YmtleUF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgcHVibGljIGtleSBhdXRoZW50aWNhdGlvbiBpcyBhbGxvd2VkLiAgVGhlCisgICAgICAgICAgICAgZGVmYXVsdCBpcyBgYHllcycnLiAgTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wKKyAgICAgICAgICAgICB2ZXJzaW9uIDIgb25seS4KKworICAgICBSZXZva2VkS2V5cworICAgICAgICAgICAgIFNwZWNpZmllcyBhIGxpc3Qgb2YgcmV2b2tlZCBwdWJsaWMga2V5cy4gIEtleXMgbGlzdGVkIGluIHRoaXMKKyAgICAgICAgICAgICBmaWxlIHdpbGwgYmUgcmVmdXNlZCBmb3IgcHVibGljIGtleSBhdXRoZW50aWNhdGlvbi4gIE5vdGUgdGhhdCBpZgorICAgICAgICAgICAgIHRoaXMgZmlsZSBpcyBub3QgcmVhZGFibGUsIHRoZW4gcHVibGljIGtleSBhdXRoZW50aWNhdGlvbiB3aWxsIGJlCisgICAgICAgICAgICAgcmVmdXNlZCBmb3IgYWxsIHVzZXJzLgorCisgICAgIFJob3N0c1JTQUF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgcmhvc3RzIG9yIC9ldGMvaG9zdHMuZXF1aXYgYXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICB0b2dldGhlciB3aXRoIHN1Y2Nlc3NmdWwgUlNBIGhvc3QgYXV0aGVudGljYXRpb24gaXMgYWxsb3dlZC4gIFRoZQorICAgICAgICAgICAgIGRlZmF1bHQgaXMgYGBubycnLiAgVGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDEKKyAgICAgICAgICAgICBvbmx5LgorCisgICAgIFJTQUF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgcHVyZSBSU0EgYXV0aGVudGljYXRpb24gaXMgYWxsb3dlZC4gIFRoZQorICAgICAgICAgICAgIGRlZmF1bHQgaXMgYGB5ZXMnJy4gIFRoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAxCisgICAgICAgICAgICAgb25seS4KKworICAgICBTZXJ2ZXJLZXlCaXRzCisgICAgICAgICAgICAgRGVmaW5lcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGVwaGVtZXJhbCBwcm90b2NvbCB2ZXJzaW9uIDEKKyAgICAgICAgICAgICBzZXJ2ZXIga2V5LiAgVGhlIG1pbmltdW0gdmFsdWUgaXMgNTEyLCBhbmQgdGhlIGRlZmF1bHQgaXMgMTAyNC4KKworICAgICBTdHJpY3RNb2RlcworICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHNzaGQoOCkgc2hvdWxkIGNoZWNrIGZpbGUgbW9kZXMgYW5kIG93bmVyc2hpcAorICAgICAgICAgICAgIG9mIHRoZSB1c2VyJ3MgZmlsZXMgYW5kIGhvbWUgZGlyZWN0b3J5IGJlZm9yZSBhY2NlcHRpbmcgbG9naW4uCisgICAgICAgICAgICAgVGhpcyBpcyBub3JtYWxseSBkZXNpcmFibGUgYmVjYXVzZSBub3ZpY2VzIHNvbWV0aW1lcyBhY2NpZGVudGFsbHkKKyAgICAgICAgICAgICBsZWF2ZSB0aGVpciBkaXJlY3Rvcnkgb3IgZmlsZXMgd29ybGQtd3JpdGFibGUuICBUaGUgZGVmYXVsdCBpcworICAgICAgICAgICAgIGBgeWVzJycuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhcHBseSB0byBDaHJvb3REaXJlY3RvcnksIHdob3NlCisgICAgICAgICAgICAgcGVybWlzc2lvbnMgYW5kIG93bmVyc2hpcCBhcmUgY2hlY2tlZCB1bmNvbmRpdGlvbmFsbHkuCisKKyAgICAgU3Vic3lzdGVtCisgICAgICAgICAgICAgQ29uZmlndXJlcyBhbiBleHRlcm5hbCBzdWJzeXN0ZW0gKGUuZy4gZmlsZSB0cmFuc2ZlciBkYWVtb24pLgorICAgICAgICAgICAgIEFyZ3VtZW50cyBzaG91bGQgYmUgYSBzdWJzeXN0ZW0gbmFtZSBhbmQgYSBjb21tYW5kICh3aXRoIG9wdGlvbmFsCisgICAgICAgICAgICAgYXJndW1lbnRzKSB0byBleGVjdXRlIHVwb24gc3Vic3lzdGVtIHJlcXVlc3QuCisKKyAgICAgICAgICAgICBUaGUgY29tbWFuZCBzZnRwLXNlcnZlcig4KSBpbXBsZW1lbnRzIHRoZSBgYHNmdHAnJyBmaWxlIHRyYW5zZmVyCisgICAgICAgICAgICAgc3Vic3lzdGVtLgorCisgICAgICAgICAgICAgQWx0ZXJuYXRlbHkgdGhlIG5hbWUgYGBpbnRlcm5hbC1zZnRwJycgaW1wbGVtZW50cyBhbiBpbi1wcm9jZXNzCisgICAgICAgICAgICAgYGBzZnRwJycgc2VydmVyLiAgVGhpcyBtYXkgc2ltcGxpZnkgY29uZmlndXJhdGlvbnMgdXNpbmcKKyAgICAgICAgICAgICBDaHJvb3REaXJlY3RvcnkgdG8gZm9yY2UgYSBkaWZmZXJlbnQgZmlsZXN5c3RlbSByb290IG9uIGNsaWVudHMuCisKKyAgICAgICAgICAgICBCeSBkZWZhdWx0IG5vIHN1YnN5c3RlbXMgYXJlIGRlZmluZWQuICBOb3RlIHRoYXQgdGhpcyBvcHRpb24KKyAgICAgICAgICAgICBhcHBsaWVzIHRvIHByb3RvY29sIHZlcnNpb24gMiBvbmx5LgorCisgICAgIFN5c2xvZ0ZhY2lsaXR5CisgICAgICAgICAgICAgR2l2ZXMgdGhlIGZhY2lsaXR5IGNvZGUgdGhhdCBpcyB1c2VkIHdoZW4gbG9nZ2luZyBtZXNzYWdlcyBmcm9tCisgICAgICAgICAgICAgc3NoZCg4KS4gIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOiBEQUVNT04sIFVTRVIsIEFVVEgsIExPQ0FMMCwKKyAgICAgICAgICAgICBMT0NBTDEsIExPQ0FMMiwgTE9DQUwzLCBMT0NBTDQsIExPQ0FMNSwgTE9DQUw2LCBMT0NBTDcuICBUaGUKKyAgICAgICAgICAgICBkZWZhdWx0IGlzIEFVVEguCisKKyAgICAgVENQS2VlcEFsaXZlCisgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHN5c3RlbSBzaG91bGQgc2VuZCBUQ1Aga2VlcGFsaXZlIG1lc3NhZ2VzCisgICAgICAgICAgICAgdG8gdGhlIG90aGVyIHNpZGUuICBJZiB0aGV5IGFyZSBzZW50LCBkZWF0aCBvZiB0aGUgY29ubmVjdGlvbiBvcgorICAgICAgICAgICAgIGNyYXNoIG9mIG9uZSBvZiB0aGUgbWFjaGluZXMgd2lsbCBiZSBwcm9wZXJseSBub3RpY2VkLiAgSG93ZXZlciwKKyAgICAgICAgICAgICB0aGlzIG1lYW5zIHRoYXQgY29ubmVjdGlvbnMgd2lsbCBkaWUgaWYgdGhlIHJvdXRlIGlzIGRvd24KKyAgICAgICAgICAgICB0ZW1wb3JhcmlseSwgYW5kIHNvbWUgcGVvcGxlIGZpbmQgaXQgYW5ub3lpbmcuICBPbiB0aGUgb3RoZXIKKyAgICAgICAgICAgICBoYW5kLCBpZiBUQ1Aga2VlcGFsaXZlcyBhcmUgbm90IHNlbnQsIHNlc3Npb25zIG1heSBoYW5nCisgICAgICAgICAgICAgaW5kZWZpbml0ZWx5IG9uIHRoZSBzZXJ2ZXIsIGxlYXZpbmcgYGBnaG9zdCcnIHVzZXJzIGFuZCBjb25zdW1pbmcKKyAgICAgICAgICAgICBzZXJ2ZXIgcmVzb3VyY2VzLgorCisgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgYGB5ZXMnJyAodG8gc2VuZCBUQ1Aga2VlcGFsaXZlIG1lc3NhZ2VzKSwgYW5kIHRoZQorICAgICAgICAgICAgIHNlcnZlciB3aWxsIG5vdGljZSBpZiB0aGUgbmV0d29yayBnb2VzIGRvd24gb3IgdGhlIGNsaWVudCBob3N0CisgICAgICAgICAgICAgY3Jhc2hlcy4gIFRoaXMgYXZvaWRzIGluZmluaXRlbHkgaGFuZ2luZyBzZXNzaW9ucy4KKworICAgICAgICAgICAgIFRvIGRpc2FibGUgVENQIGtlZXBhbGl2ZSBtZXNzYWdlcywgdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8KKyAgICAgICAgICAgICBgYG5vJycuCisKKyAgICAgVHJ1c3RlZFVzZXJDQUtleXMKKyAgICAgICAgICAgICBTcGVjaWZpZXMgYSBmaWxlIGNvbnRhaW5pbmcgcHVibGljIGtleXMgb2YgY2VydGlmaWNhdGUKKyAgICAgICAgICAgICBhdXRob3JpdGllcyB0aGF0IGFyZSB0cnVzdGVkIHRvIHNpZ24gdXNlciBjZXJ0aWZpY2F0ZXMgZm9yCisgICAgICAgICAgICAgYXV0aGVudGljYXRpb24uICBLZXlzIGFyZSBsaXN0ZWQgb25lIHBlciBsaW5lOyBlbXB0eSBsaW5lcyBhbmQKKyAgICAgICAgICAgICBjb21tZW50cyBzdGFydGluZyB3aXRoIGAjJyBhcmUgYWxsb3dlZC4gIElmIGEgY2VydGlmaWNhdGUgaXMKKyAgICAgICAgICAgICBwcmVzZW50ZWQgZm9yIGF1dGhlbnRpY2F0aW9uIGFuZCBoYXMgaXRzIHNpZ25pbmcgQ0Ega2V5IGxpc3RlZCBpbgorICAgICAgICAgICAgIHRoaXMgZmlsZSwgdGhlbiBpdCBtYXkgYmUgdXNlZCBmb3IgYXV0aGVudGljYXRpb24gZm9yIGFueSB1c2VyCisgICAgICAgICAgICAgbGlzdGVkIGluIHRoZSBjZXJ0aWZpY2F0ZSdzIHByaW5jaXBhbHMgbGlzdC4gIE5vdGUgdGhhdAorICAgICAgICAgICAgIGNlcnRpZmljYXRlcyB0aGF0IGxhY2sgYSBsaXN0IG9mIHByaW5jaXBhbHMgd2lsbCBub3QgYmUgcGVybWl0dGVkCisgICAgICAgICAgICAgZm9yIGF1dGhlbnRpY2F0aW9uIHVzaW5nIFRydXN0ZWRVc2VyQ0FLZXlzLiAgRm9yIG1vcmUgZGV0YWlscyBvbgorICAgICAgICAgICAgIGNlcnRpZmljYXRlcywgc2VlIHRoZSBDRVJUSUZJQ0FURVMgc2VjdGlvbiBpbiBzc2gta2V5Z2VuKDEpLgorCisgICAgIFVzZUROUyAgU3BlY2lmaWVzIHdoZXRoZXIgc3NoZCg4KSBzaG91bGQgbG9vayB1cCB0aGUgcmVtb3RlIGhvc3QgbmFtZSBhbmQKKyAgICAgICAgICAgICBjaGVjayB0aGF0IHRoZSByZXNvbHZlZCBob3N0IG5hbWUgZm9yIHRoZSByZW1vdGUgSVAgYWRkcmVzcyBtYXBzCisgICAgICAgICAgICAgYmFjayB0byB0aGUgdmVyeSBzYW1lIElQIGFkZHJlc3MuICBUaGUgZGVmYXVsdCBpcyBgYHllcycnLgorCisgICAgIFVzZUxvZ2luCisgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgbG9naW4oMSkgaXMgdXNlZCBmb3IgaW50ZXJhY3RpdmUgbG9naW4KKyAgICAgICAgICAgICBzZXNzaW9ucy4gIFRoZSBkZWZhdWx0IGlzIGBgbm8nJy4gIE5vdGUgdGhhdCBsb2dpbigxKSBpcyBuZXZlcgorICAgICAgICAgICAgIHVzZWQgZm9yIHJlbW90ZSBjb21tYW5kIGV4ZWN1dGlvbi4gIE5vdGUgYWxzbywgdGhhdCBpZiB0aGlzIGlzCisgICAgICAgICAgICAgZW5hYmxlZCwgWDExRm9yd2FyZGluZyB3aWxsIGJlIGRpc2FibGVkIGJlY2F1c2UgbG9naW4oMSkgZG9lcyBub3QKKyAgICAgICAgICAgICBrbm93IGhvdyB0byBoYW5kbGUgeGF1dGgoMSkgY29va2llcy4gIElmIFVzZVByaXZpbGVnZVNlcGFyYXRpb24KKyAgICAgICAgICAgICBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgZGlzYWJsZWQgYWZ0ZXIgYXV0aGVudGljYXRpb24uCisKKyAgICAgVXNlUEFNICBFbmFibGVzIHRoZSBQbHVnZ2FibGUgQXV0aGVudGljYXRpb24gTW9kdWxlIGludGVyZmFjZS4gIElmIHNldCB0bworICAgICAgICAgICAgIGBgeWVzJycgdGhpcyB3aWxsIGVuYWJsZSBQQU0gYXV0aGVudGljYXRpb24gdXNpbmcKKyAgICAgICAgICAgICBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIGFuZCBQYXNzd29yZEF1dGhlbnRpY2F0aW9uIGluCisgICAgICAgICAgICAgYWRkaXRpb24gdG8gUEFNIGFjY291bnQgYW5kIHNlc3Npb24gbW9kdWxlIHByb2Nlc3NpbmcgZm9yIGFsbAorICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uIHR5cGVzLgorCisgICAgICAgICAgICAgQmVjYXVzZSBQQU0gY2hhbGxlbmdlLXJlc3BvbnNlIGF1dGhlbnRpY2F0aW9uIHVzdWFsbHkgc2VydmVzIGFuCisgICAgICAgICAgICAgZXF1aXZhbGVudCByb2xlIHRvIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uLCB5b3Ugc2hvdWxkIGRpc2FibGUKKyAgICAgICAgICAgICBlaXRoZXIgUGFzc3dvcmRBdXRoZW50aWNhdGlvbiBvciBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uLgorCisgICAgICAgICAgICAgSWYgVXNlUEFNIGlzIGVuYWJsZWQsIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIHJ1biBzc2hkKDgpIGFzIGEKKyAgICAgICAgICAgICBub24tcm9vdCB1c2VyLiAgVGhlIGRlZmF1bHQgaXMgYGBubycnLgorCisgICAgIFVzZVByaXZpbGVnZVNlcGFyYXRpb24KKyAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBzc2hkKDgpIHNlcGFyYXRlcyBwcml2aWxlZ2VzIGJ5IGNyZWF0aW5nIGFuCisgICAgICAgICAgICAgdW5wcml2aWxlZ2VkIGNoaWxkIHByb2Nlc3MgdG8gZGVhbCB3aXRoIGluY29taW5nIG5ldHdvcmsgdHJhZmZpYy4KKyAgICAgICAgICAgICBBZnRlciBzdWNjZXNzZnVsIGF1dGhlbnRpY2F0aW9uLCBhbm90aGVyIHByb2Nlc3Mgd2lsbCBiZSBjcmVhdGVkCisgICAgICAgICAgICAgdGhhdCBoYXMgdGhlIHByaXZpbGVnZSBvZiB0aGUgYXV0aGVudGljYXRlZCB1c2VyLiAgVGhlIGdvYWwgb2YKKyAgICAgICAgICAgICBwcml2aWxlZ2Ugc2VwYXJhdGlvbiBpcyB0byBwcmV2ZW50IHByaXZpbGVnZSBlc2NhbGF0aW9uIGJ5CisgICAgICAgICAgICAgY29udGFpbmluZyBhbnkgY29ycnVwdGlvbiB3aXRoaW4gdGhlIHVucHJpdmlsZWdlZCBwcm9jZXNzZXMuICBUaGUKKyAgICAgICAgICAgICBkZWZhdWx0IGlzIGBgeWVzJycuICBJZiBVc2VQcml2aWxlZ2VTZXBhcmF0aW9uIGlzIHNldCB0bworICAgICAgICAgICAgIGBgc2FuZGJveCcnIHRoZW4gdGhlIHByZS1hdXRoZW50aWNhdGlvbiB1bnByaXZpbGVnZWQgcHJvY2VzcyBpcworICAgICAgICAgICAgIHN1YmplY3QgdG8gYWRkaXRpb25hbCByZXN0cmljdGlvbnMuCisKKyAgICAgWDExRGlzcGxheU9mZnNldAorICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgZmlyc3QgZGlzcGxheSBudW1iZXIgYXZhaWxhYmxlIGZvciBzc2hkKDgpJ3MgWDExCisgICAgICAgICAgICAgZm9yd2FyZGluZy4gIFRoaXMgcHJldmVudHMgc3NoZCBmcm9tIGludGVyZmVyaW5nIHdpdGggcmVhbCBYMTEKKyAgICAgICAgICAgICBzZXJ2ZXJzLiAgVGhlIGRlZmF1bHQgaXMgMTAuCisKKyAgICAgWDExRm9yd2FyZGluZworICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIFgxMSBmb3J3YXJkaW5nIGlzIHBlcm1pdHRlZC4gIFRoZSBhcmd1bWVudCBtdXN0CisgICAgICAgICAgICAgYmUgYGB5ZXMnJyBvciBgYG5vJycuICBUaGUgZGVmYXVsdCBpcyBgYG5vJycuCisKKyAgICAgICAgICAgICBXaGVuIFgxMSBmb3J3YXJkaW5nIGlzIGVuYWJsZWQsIHRoZXJlIG1heSBiZSBhZGRpdGlvbmFsIGV4cG9zdXJlCisgICAgICAgICAgICAgdG8gdGhlIHNlcnZlciBhbmQgdG8gY2xpZW50IGRpc3BsYXlzIGlmIHRoZSBzc2hkKDgpIHByb3h5IGRpc3BsYXkKKyAgICAgICAgICAgICBpcyBjb25maWd1cmVkIHRvIGxpc3RlbiBvbiB0aGUgd2lsZGNhcmQgYWRkcmVzcyAoc2VlCisgICAgICAgICAgICAgWDExVXNlTG9jYWxob3N0IGJlbG93KSwgdGhvdWdoIHRoaXMgaXMgbm90IHRoZSBkZWZhdWx0LgorICAgICAgICAgICAgIEFkZGl0aW9uYWxseSwgdGhlIGF1dGhlbnRpY2F0aW9uIHNwb29maW5nIGFuZCBhdXRoZW50aWNhdGlvbiBkYXRhCisgICAgICAgICAgICAgdmVyaWZpY2F0aW9uIGFuZCBzdWJzdGl0dXRpb24gb2NjdXIgb24gdGhlIGNsaWVudCBzaWRlLiAgVGhlCisgICAgICAgICAgICAgc2VjdXJpdHkgcmlzayBvZiB1c2luZyBYMTEgZm9yd2FyZGluZyBpcyB0aGF0IHRoZSBjbGllbnQncyBYMTEKKyAgICAgICAgICAgICBkaXNwbGF5IHNlcnZlciBtYXkgYmUgZXhwb3NlZCB0byBhdHRhY2sgd2hlbiB0aGUgU1NIIGNsaWVudAorICAgICAgICAgICAgIHJlcXVlc3RzIGZvcndhcmRpbmcgKHNlZSB0aGUgd2FybmluZ3MgZm9yIEZvcndhcmRYMTEgaW4KKyAgICAgICAgICAgICBzc2hfY29uZmlnKDUpKS4gIEEgc3lzdGVtIGFkbWluaXN0cmF0b3IgbWF5IGhhdmUgYSBzdGFuY2UgaW4KKyAgICAgICAgICAgICB3aGljaCB0aGV5IHdhbnQgdG8gcHJvdGVjdCBjbGllbnRzIHRoYXQgbWF5IGV4cG9zZSB0aGVtc2VsdmVzIHRvCisgICAgICAgICAgICAgYXR0YWNrIGJ5IHVud2l0dGluZ2x5IHJlcXVlc3RpbmcgWDExIGZvcndhcmRpbmcsIHdoaWNoIGNhbgorICAgICAgICAgICAgIHdhcnJhbnQgYSBgYG5vJycgc2V0dGluZy4KKworICAgICAgICAgICAgIE5vdGUgdGhhdCBkaXNhYmxpbmcgWDExIGZvcndhcmRpbmcgZG9lcyBub3QgcHJldmVudCB1c2VycyBmcm9tCisgICAgICAgICAgICAgZm9yd2FyZGluZyBYMTEgdHJhZmZpYywgYXMgdXNlcnMgY2FuIGFsd2F5cyBpbnN0YWxsIHRoZWlyIG93bgorICAgICAgICAgICAgIGZvcndhcmRlcnMuICBYMTEgZm9yd2FyZGluZyBpcyBhdXRvbWF0aWNhbGx5IGRpc2FibGVkIGlmIFVzZUxvZ2luCisgICAgICAgICAgICAgaXMgZW5hYmxlZC4KKworICAgICBYMTFVc2VMb2NhbGhvc3QKKyAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBzc2hkKDgpIHNob3VsZCBiaW5kIHRoZSBYMTEgZm9yd2FyZGluZyBzZXJ2ZXIKKyAgICAgICAgICAgICB0byB0aGUgbG9vcGJhY2sgYWRkcmVzcyBvciB0byB0aGUgd2lsZGNhcmQgYWRkcmVzcy4gIEJ5IGRlZmF1bHQsCisgICAgICAgICAgICAgc3NoZCBiaW5kcyB0aGUgZm9yd2FyZGluZyBzZXJ2ZXIgdG8gdGhlIGxvb3BiYWNrIGFkZHJlc3MgYW5kIHNldHMKKyAgICAgICAgICAgICB0aGUgaG9zdG5hbWUgcGFydCBvZiB0aGUgRElTUExBWSBlbnZpcm9ubWVudCB2YXJpYWJsZSB0bworICAgICAgICAgICAgIGBgbG9jYWxob3N0JycuICBUaGlzIHByZXZlbnRzIHJlbW90ZSBob3N0cyBmcm9tIGNvbm5lY3RpbmcgdG8gdGhlCisgICAgICAgICAgICAgcHJveHkgZGlzcGxheS4gIEhvd2V2ZXIsIHNvbWUgb2xkZXIgWDExIGNsaWVudHMgbWF5IG5vdCBmdW5jdGlvbgorICAgICAgICAgICAgIHdpdGggdGhpcyBjb25maWd1cmF0aW9uLiAgWDExVXNlTG9jYWxob3N0IG1heSBiZSBzZXQgdG8gYGBubycnIHRvCisgICAgICAgICAgICAgc3BlY2lmeSB0aGF0IHRoZSBmb3J3YXJkaW5nIHNlcnZlciBzaG91bGQgYmUgYm91bmQgdG8gdGhlCisgICAgICAgICAgICAgd2lsZGNhcmQgYWRkcmVzcy4gIFRoZSBhcmd1bWVudCBtdXN0IGJlIGBgeWVzJycgb3IgYGBubycnLiAgVGhlCisgICAgICAgICAgICAgZGVmYXVsdCBpcyBgYHllcycnLgorCisgICAgIFhBdXRoTG9jYXRpb24KKyAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIHhhdXRoKDEpIHByb2dyYW0uICBUaGUgZGVmYXVsdAorICAgICAgICAgICAgIGlzIC91c3IvWDExUjYvYmluL3hhdXRoLgorCitUSU1FIEZPUk1BVFMKKyAgICAgc3NoZCg4KSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGFuZCBjb25maWd1cmF0aW9uIGZpbGUgb3B0aW9ucyB0aGF0CisgICAgIHNwZWNpZnkgdGltZSBtYXkgYmUgZXhwcmVzc2VkIHVzaW5nIGEgc2VxdWVuY2Ugb2YgdGhlIGZvcm06CisgICAgIHRpbWVbcXVhbGlmaWVyXSwgd2hlcmUgdGltZSBpcyBhIHBvc2l0aXZlIGludGVnZXIgdmFsdWUgYW5kIHF1YWxpZmllciBpcworICAgICBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgICAgICAgICA8bm9uZT4gIHNlY29uZHMKKyAgICAgICAgICAgcyB8IFMgICBzZWNvbmRzCisgICAgICAgICAgIG0gfCBNICAgbWludXRlcworICAgICAgICAgICBoIHwgSCAgIGhvdXJzCisgICAgICAgICAgIGQgfCBEICAgZGF5cworICAgICAgICAgICB3IHwgVyAgIHdlZWtzCisKKyAgICAgRWFjaCBtZW1iZXIgb2YgdGhlIHNlcXVlbmNlIGlzIGFkZGVkIHRvZ2V0aGVyIHRvIGNhbGN1bGF0ZSB0aGUgdG90YWwgdGltZQorICAgICB2YWx1ZS4KKworICAgICBUaW1lIGZvcm1hdCBleGFtcGxlczoKKworICAgICAgICAgICA2MDAgICAgIDYwMCBzZWNvbmRzICgxMCBtaW51dGVzKQorICAgICAgICAgICAxMG0gICAgIDEwIG1pbnV0ZXMKKyAgICAgICAgICAgMWgzMG0gICAxIGhvdXIgMzAgbWludXRlcyAoOTAgbWludXRlcykKKworRklMRVMKKyAgICAgL2V0Yy9zc2gvc3NoZF9jb25maWcKKyAgICAgICAgICAgICBDb250YWlucyBjb25maWd1cmF0aW9uIGRhdGEgZm9yIHNzaGQoOCkuICBUaGlzIGZpbGUgc2hvdWxkIGJlCisgICAgICAgICAgICAgd3JpdGFibGUgYnkgcm9vdCBvbmx5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgKHRob3VnaCBub3QKKyAgICAgICAgICAgICBuZWNlc3NhcnkpIHRoYXQgaXQgYmUgd29ybGQtcmVhZGFibGUuCisKK1NFRSBBTFNPCisgICAgIHNzaGQoOCkKKworQVVUSE9SUworICAgICBPcGVuU1NIIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgYW5kIGZyZWUgc3NoIDEuMi4xMiByZWxlYXNlIGJ5CisgICAgIFRhdHUgWWxvbmVuLiAgQWFyb24gQ2FtcGJlbGwsIEJvYiBCZWNrLCBNYXJrdXMgRnJpZWRsLCBOaWVscyBQcm92b3MsIFRoZW8KKyAgICAgZGUgUmFhZHQgYW5kIER1ZyBTb25nIHJlbW92ZWQgbWFueSBidWdzLCByZS1hZGRlZCBuZXdlciBmZWF0dXJlcyBhbmQKKyAgICAgY3JlYXRlZCBPcGVuU1NILiAgTWFya3VzIEZyaWVkbCBjb250cmlidXRlZCB0aGUgc3VwcG9ydCBmb3IgU1NIIHByb3RvY29sCisgICAgIHZlcnNpb25zIDEuNSBhbmQgMi4wLiAgTmllbHMgUHJvdm9zIGFuZCBNYXJrdXMgRnJpZWRsIGNvbnRyaWJ1dGVkIHN1cHBvcnQKKyAgICAgZm9yIHByaXZpbGVnZSBzZXBhcmF0aW9uLgorCitPcGVuQlNEIDUuMCAgICAgICAgICAgICAgICAgICAgU2VwdGVtYmVyIDksIDIwMTEgICAgICAgICAgICAgICAgICAgT3BlbkJTRCA1LjAKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc3NoZF9jb25maWcuNSBiL29wZW5zc2gtNi4wcDEvc3NoZF9jb25maWcuNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWY4YjllCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zc2hkX2NvbmZpZy41CkBAIC0wLDAgKzEsMTIxNSBAQAorLlwiCisuXCIgQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAorLlwiICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisuXCIKKy5cIiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisuXCIgY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKy5cIiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCisuXCIgaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorLlwiIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5OSwyMDAwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiIENvcHlyaWdodCAoYykgMTk5OSBBYXJvbiBDYW1wYmVsbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIgQ29weXJpZ2h0IChjKSAxOTk5IFRoZW8gZGUgUmFhZHQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisuXCIgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy5cIiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisuXCIgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisuXCIgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLlwiIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLlwiIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy5cIiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy5cIiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgJE9wZW5CU0Q6IHNzaGRfY29uZmlnLjUsdiAxLjEzNiAyMDExLzA5LzA5IDAwOjQzOjAwIGRqbSBFeHAgJAorLkRkICRNZG9jZGF0ZTogU2VwdGVtYmVyIDkgMjAxMSAkCisuRHQgU1NIRF9DT05GSUcgNQorLk9zCisuU2ggTkFNRQorLk5tIHNzaGRfY29uZmlnCisuTmQgT3BlblNTSCBTU0ggZGFlbW9uIGNvbmZpZ3VyYXRpb24gZmlsZQorLlNoIFNZTk9QU0lTCisuTm0gL2V0Yy9zc2gvc3NoZF9jb25maWcKKy5TaCBERVNDUklQVElPTgorLlhyIHNzaGQgOAorcmVhZHMgY29uZmlndXJhdGlvbiBkYXRhIGZyb20KKy5QYSAvZXRjL3NzaC9zc2hkX2NvbmZpZworKG9yIHRoZSBmaWxlIHNwZWNpZmllZCB3aXRoCisuRmwgZgorb24gdGhlIGNvbW1hbmQgbGluZSkuCitUaGUgZmlsZSBjb250YWlucyBrZXl3b3JkLWFyZ3VtZW50IHBhaXJzLCBvbmUgcGVyIGxpbmUuCitMaW5lcyBzdGFydGluZyB3aXRoCisuUWwgIworYW5kIGVtcHR5IGxpbmVzIGFyZSBpbnRlcnByZXRlZCBhcyBjb21tZW50cy4KK0FyZ3VtZW50cyBtYXkgb3B0aW9uYWxseSBiZSBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzCisuUHEgXCYiCitpbiBvcmRlciB0byByZXByZXNlbnQgYXJndW1lbnRzIGNvbnRhaW5pbmcgc3BhY2VzLgorLlBwCitUaGUgcG9zc2libGUKK2tleXdvcmRzIGFuZCB0aGVpciBtZWFuaW5ncyBhcmUgYXMgZm9sbG93cyAobm90ZSB0aGF0CitrZXl3b3JkcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgYXJndW1lbnRzIGFyZSBjYXNlLXNlbnNpdGl2ZSk6CisuQmwgLXRhZyAtd2lkdGggRHMKKy5JdCBDbSBBY2NlcHRFbnYKK1NwZWNpZmllcyB3aGF0IGVudmlyb25tZW50IHZhcmlhYmxlcyBzZW50IGJ5IHRoZSBjbGllbnQgd2lsbCBiZSBjb3BpZWQgaW50bwordGhlIHNlc3Npb24ncworLlhyIGVudmlyb24gNyAuCitTZWUKKy5DbSBTZW5kRW52CitpbgorLlhyIHNzaF9jb25maWcgNQorZm9yIGhvdyB0byBjb25maWd1cmUgdGhlIGNsaWVudC4KK05vdGUgdGhhdCBlbnZpcm9ubWVudCBwYXNzaW5nIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBwcm90b2NvbCAyLgorVmFyaWFibGVzIGFyZSBzcGVjaWZpZWQgYnkgbmFtZSwgd2hpY2ggbWF5IGNvbnRhaW4gdGhlIHdpbGRjYXJkIGNoYXJhY3RlcnMKKy5RbCAqCithbmQKKy5RbCBcJj8gLgorTXVsdGlwbGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIG1heSBiZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSBvciBzcHJlYWQKK2Fjcm9zcyBtdWx0aXBsZQorLkNtIEFjY2VwdEVudgorZGlyZWN0aXZlcy4KK0JlIHdhcm5lZCB0aGF0IHNvbWUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGNvdWxkIGJlIHVzZWQgdG8gYnlwYXNzIHJlc3RyaWN0ZWQKK3VzZXIgZW52aXJvbm1lbnRzLgorRm9yIHRoaXMgcmVhc29uLCBjYXJlIHNob3VsZCBiZSB0YWtlbiBpbiB0aGUgdXNlIG9mIHRoaXMgZGlyZWN0aXZlLgorVGhlIGRlZmF1bHQgaXMgbm90IHRvIGFjY2VwdCBhbnkgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorLkl0IENtIEFkZHJlc3NGYW1pbHkKK1NwZWNpZmllcyB3aGljaCBhZGRyZXNzIGZhbWlseSBzaG91bGQgYmUgdXNlZCBieQorLlhyIHNzaGQgOCAuCitWYWxpZCBhcmd1bWVudHMgYXJlCisuRHEgYW55ICwKKy5EcSBpbmV0CisodXNlIElQdjQgb25seSksIG9yCisuRHEgaW5ldDYKKyh1c2UgSVB2NiBvbmx5KS4KK1RoZSBkZWZhdWx0IGlzCisuRHEgYW55IC4KKy5JdCBDbSBBbGxvd0FnZW50Rm9yd2FyZGluZworU3BlY2lmaWVzIHdoZXRoZXIKKy5YciBzc2gtYWdlbnQgMQorZm9yd2FyZGluZyBpcyBwZXJtaXR0ZWQuCitUaGUgZGVmYXVsdCBpcworLkRxIHllcyAuCitOb3RlIHRoYXQgZGlzYWJsaW5nIGFnZW50IGZvcndhcmRpbmcgZG9lcyBub3QgaW1wcm92ZSBzZWN1cml0eQordW5sZXNzIHVzZXJzIGFyZSBhbHNvIGRlbmllZCBzaGVsbCBhY2Nlc3MsIGFzIHRoZXkgY2FuIGFsd2F5cyBpbnN0YWxsCit0aGVpciBvd24gZm9yd2FyZGVycy4KKy5JdCBDbSBBbGxvd0dyb3VwcworVGhpcyBrZXl3b3JkIGNhbiBiZSBmb2xsb3dlZCBieSBhIGxpc3Qgb2YgZ3JvdXAgbmFtZSBwYXR0ZXJucywgc2VwYXJhdGVkCitieSBzcGFjZXMuCitJZiBzcGVjaWZpZWQsIGxvZ2luIGlzIGFsbG93ZWQgb25seSBmb3IgdXNlcnMgd2hvc2UgcHJpbWFyeQorZ3JvdXAgb3Igc3VwcGxlbWVudGFyeSBncm91cCBsaXN0IG1hdGNoZXMgb25lIG9mIHRoZSBwYXR0ZXJucy4KK09ubHkgZ3JvdXAgbmFtZXMgYXJlIHZhbGlkOyBhIG51bWVyaWNhbCBncm91cCBJRCBpcyBub3QgcmVjb2duaXplZC4KK0J5IGRlZmF1bHQsIGxvZ2luIGlzIGFsbG93ZWQgZm9yIGFsbCBncm91cHMuCitUaGUgYWxsb3cvZGVueSBkaXJlY3RpdmVzIGFyZSBwcm9jZXNzZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKy5DbSBEZW55VXNlcnMgLAorLkNtIEFsbG93VXNlcnMgLAorLkNtIERlbnlHcm91cHMgLAorYW5kIGZpbmFsbHkKKy5DbSBBbGxvd0dyb3VwcyAuCisuUHAKK1NlZQorLlN4IFBBVFRFUk5TCitpbgorLlhyIHNzaF9jb25maWcgNQorZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcGF0dGVybnMuCisuSXQgQ20gQWxsb3dUY3BGb3J3YXJkaW5nCitTcGVjaWZpZXMgd2hldGhlciBUQ1AgZm9yd2FyZGluZyBpcyBwZXJtaXR0ZWQuCitUaGUgZGVmYXVsdCBpcworLkRxIHllcyAuCitOb3RlIHRoYXQgZGlzYWJsaW5nIFRDUCBmb3J3YXJkaW5nIGRvZXMgbm90IGltcHJvdmUgc2VjdXJpdHkgdW5sZXNzCit1c2VycyBhcmUgYWxzbyBkZW5pZWQgc2hlbGwgYWNjZXNzLCBhcyB0aGV5IGNhbiBhbHdheXMgaW5zdGFsbCB0aGVpcgorb3duIGZvcndhcmRlcnMuCisuSXQgQ20gQWxsb3dVc2VycworVGhpcyBrZXl3b3JkIGNhbiBiZSBmb2xsb3dlZCBieSBhIGxpc3Qgb2YgdXNlciBuYW1lIHBhdHRlcm5zLCBzZXBhcmF0ZWQKK2J5IHNwYWNlcy4KK0lmIHNwZWNpZmllZCwgbG9naW4gaXMgYWxsb3dlZCBvbmx5IGZvciB1c2VyIG5hbWVzIHRoYXQKK21hdGNoIG9uZSBvZiB0aGUgcGF0dGVybnMuCitPbmx5IHVzZXIgbmFtZXMgYXJlIHZhbGlkOyBhIG51bWVyaWNhbCB1c2VyIElEIGlzIG5vdCByZWNvZ25pemVkLgorQnkgZGVmYXVsdCwgbG9naW4gaXMgYWxsb3dlZCBmb3IgYWxsIHVzZXJzLgorSWYgdGhlIHBhdHRlcm4gdGFrZXMgdGhlIGZvcm0gVVNFUkBIT1NUIHRoZW4gVVNFUiBhbmQgSE9TVAorYXJlIHNlcGFyYXRlbHkgY2hlY2tlZCwgcmVzdHJpY3RpbmcgbG9naW5zIHRvIHBhcnRpY3VsYXIKK3VzZXJzIGZyb20gcGFydGljdWxhciBob3N0cy4KK1RoZSBhbGxvdy9kZW55IGRpcmVjdGl2ZXMgYXJlIHByb2Nlc3NlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorLkNtIERlbnlVc2VycyAsCisuQ20gQWxsb3dVc2VycyAsCisuQ20gRGVueUdyb3VwcyAsCithbmQgZmluYWxseQorLkNtIEFsbG93R3JvdXBzIC4KKy5QcAorU2VlCisuU3ggUEFUVEVSTlMKK2luCisuWHIgc3NoX2NvbmZpZyA1Citmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwYXR0ZXJucy4KKy5JdCBDbSBBdXRob3JpemVkS2V5c0ZpbGUKK1NwZWNpZmllcyB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBwdWJsaWMga2V5cyB0aGF0IGNhbiBiZSB1c2VkCitmb3IgdXNlciBhdXRoZW50aWNhdGlvbi4KK1RoZSBmb3JtYXQgaXMgZGVzY3JpYmVkIGluIHRoZQorLlN4IEFVVEhPUklaRURfS0VZUyBGSUxFIEZPUk1BVAorc2VjdGlvbiBvZgorLlhyIHNzaGQgOCAuCisuQ20gQXV0aG9yaXplZEtleXNGaWxlCittYXkgY29udGFpbiB0b2tlbnMgb2YgdGhlIGZvcm0gJVQgd2hpY2ggYXJlIHN1YnN0aXR1dGVkIGR1cmluZyBjb25uZWN0aW9uCitzZXR1cC4KK1RoZSBmb2xsb3dpbmcgdG9rZW5zIGFyZSBkZWZpbmVkOiAlJSBpcyByZXBsYWNlZCBieSBhIGxpdGVyYWwgJyUnLAorJWggaXMgcmVwbGFjZWQgYnkgdGhlIGhvbWUgZGlyZWN0b3J5IG9mIHRoZSB1c2VyIGJlaW5nIGF1dGhlbnRpY2F0ZWQsIGFuZAorJXUgaXMgcmVwbGFjZWQgYnkgdGhlIHVzZXJuYW1lIG9mIHRoYXQgdXNlci4KK0FmdGVyIGV4cGFuc2lvbiwKKy5DbSBBdXRob3JpemVkS2V5c0ZpbGUKK2lzIHRha2VuIHRvIGJlIGFuIGFic29sdXRlIHBhdGggb3Igb25lIHJlbGF0aXZlIHRvIHRoZSB1c2VyJ3MgaG9tZQorZGlyZWN0b3J5LgorTXVsdGlwbGUgZmlsZXMgbWF5IGJlIGxpc3RlZCwgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuCitUaGUgZGVmYXVsdCBpcworLkRxIC5zc2gvYXV0aG9yaXplZF9rZXlzIC5zc2gvYXV0aG9yaXplZF9rZXlzMiAuCisuSXQgQ20gQXV0aG9yaXplZFByaW5jaXBhbHNGaWxlCitTcGVjaWZpZXMgYSBmaWxlIHRoYXQgbGlzdHMgcHJpbmNpcGFsIG5hbWVzIHRoYXQgYXJlIGFjY2VwdGVkIGZvcgorY2VydGlmaWNhdGUgYXV0aGVudGljYXRpb24uCitXaGVuIHVzaW5nIGNlcnRpZmljYXRlcyBzaWduZWQgYnkgYSBrZXkgbGlzdGVkIGluCisuQ20gVHJ1c3RlZFVzZXJDQUtleXMgLAordGhpcyBmaWxlIGxpc3RzIG5hbWVzLCBvbmUgb2Ygd2hpY2ggbXVzdCBhcHBlYXIgaW4gdGhlIGNlcnRpZmljYXRlIGZvciBpdAordG8gYmUgYWNjZXB0ZWQgZm9yIGF1dGhlbnRpY2F0aW9uLgorTmFtZXMgYXJlIGxpc3RlZCBvbmUgcGVyIGxpbmUgcHJlY2VkZWQgYnkga2V5IG9wdGlvbnMgKGFzIGRlc2NyaWJlZAoraW4KKy5TeCBBVVRIT1JJWkVEX0tFWVMgRklMRSBGT1JNQVQKK2luCisuWHIgc3NoZCA4ICkgLgorRW1wdHkgbGluZXMgYW5kIGNvbW1lbnRzIHN0YXJ0aW5nIHdpdGgKKy5RbCAjCithcmUgaWdub3JlZC4KKy5QcAorLkNtIEF1dGhvcml6ZWRQcmluY2lwYWxzRmlsZQorbWF5IGNvbnRhaW4gdG9rZW5zIG9mIHRoZSBmb3JtICVUIHdoaWNoIGFyZSBzdWJzdGl0dXRlZCBkdXJpbmcgY29ubmVjdGlvbgorc2V0dXAuCitUaGUgZm9sbG93aW5nIHRva2VucyBhcmUgZGVmaW5lZDogJSUgaXMgcmVwbGFjZWQgYnkgYSBsaXRlcmFsICclJywKKyVoIGlzIHJlcGxhY2VkIGJ5IHRoZSBob21lIGRpcmVjdG9yeSBvZiB0aGUgdXNlciBiZWluZyBhdXRoZW50aWNhdGVkLCBhbmQKKyV1IGlzIHJlcGxhY2VkIGJ5IHRoZSB1c2VybmFtZSBvZiB0aGF0IHVzZXIuCitBZnRlciBleHBhbnNpb24sCisuQ20gQXV0aG9yaXplZFByaW5jaXBhbHNGaWxlCitpcyB0YWtlbiB0byBiZSBhbiBhYnNvbHV0ZSBwYXRoIG9yIG9uZSByZWxhdGl2ZSB0byB0aGUgdXNlcidzIGhvbWUKK2RpcmVjdG9yeS4KKy5QcAorVGhlIGRlZmF1bHQgaXMgbm90IHRvIHVzZSBhIHByaW5jaXBhbHMgZmlsZSBcKGVuIGluIHRoaXMgY2FzZSwgdGhlIHVzZXJuYW1lCitvZiB0aGUgdXNlciBtdXN0IGFwcGVhciBpbiBhIGNlcnRpZmljYXRlJ3MgcHJpbmNpcGFscyBsaXN0IGZvciBpdCB0byBiZQorYWNjZXB0ZWQuCitOb3RlIHRoYXQKKy5DbSBBdXRob3JpemVkUHJpbmNpcGFsc0ZpbGUKK2lzIG9ubHkgdXNlZCB3aGVuIGF1dGhlbnRpY2F0aW9uIHByb2NlZWRzIHVzaW5nIGEgQ0EgbGlzdGVkIGluCisuQ20gVHJ1c3RlZFVzZXJDQUtleXMKK2FuZCBpcyBub3QgY29uc3VsdGVkIGZvciBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0aWVzIHRydXN0ZWQgdmlhCisuUGEgfi8uc3NoL2F1dGhvcml6ZWRfa2V5cyAsCit0aG91Z2ggdGhlCisuQ20gcHJpbmNpcGFscz0KK2tleSBvcHRpb24gb2ZmZXJzIGEgc2ltaWxhciBmYWNpbGl0eSAoc2VlCisuWHIgc3NoZCA4Citmb3IgZGV0YWlscykuCisuSXQgQ20gQmFubmVyCitUaGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBmaWxlIGFyZSBzZW50IHRvIHRoZSByZW1vdGUgdXNlciBiZWZvcmUKK2F1dGhlbnRpY2F0aW9uIGlzIGFsbG93ZWQuCitJZiB0aGUgYXJndW1lbnQgaXMKKy5EcSBub25lCit0aGVuIG5vIGJhbm5lciBpcyBkaXNwbGF5ZWQuCitUaGlzIG9wdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgcHJvdG9jb2wgdmVyc2lvbiAyLgorQnkgZGVmYXVsdCwgbm8gYmFubmVyIGlzIGRpc3BsYXllZC4KKy5JdCBDbSBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uCitTcGVjaWZpZXMgd2hldGhlciBjaGFsbGVuZ2UtcmVzcG9uc2UgYXV0aGVudGljYXRpb24gaXMgYWxsb3dlZCAoZS5nLiB2aWEKK1BBTSBvciB0aG91Z2ggYXV0aGVudGljYXRpb24gc3R5bGVzIHN1cHBvcnRlZCBpbgorLlhyIGxvZ2luLmNvbmYgNSApCitUaGUgZGVmYXVsdCBpcworLkRxIHllcyAuCisuSXQgQ20gQ2hyb290RGlyZWN0b3J5CitTcGVjaWZpZXMgdGhlIHBhdGhuYW1lIG9mIGEgZGlyZWN0b3J5IHRvCisuWHIgY2hyb290IDIKK3RvIGFmdGVyIGF1dGhlbnRpY2F0aW9uLgorQWxsIGNvbXBvbmVudHMgb2YgdGhlIHBhdGhuYW1lIG11c3QgYmUgcm9vdC1vd25lZCBkaXJlY3RvcmllcyB0aGF0IGFyZQorbm90IHdyaXRhYmxlIGJ5IGFueSBvdGhlciB1c2VyIG9yIGdyb3VwLgorQWZ0ZXIgdGhlIGNocm9vdCwKKy5YciBzc2hkIDgKK2NoYW5nZXMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuCisuUHAKK1RoZSBwYXRobmFtZSBtYXkgY29udGFpbiB0aGUgZm9sbG93aW5nIHRva2VucyB0aGF0IGFyZSBleHBhbmRlZCBhdCBydW50aW1lIG9uY2UKK3RoZSBjb25uZWN0aW5nIHVzZXIgaGFzIGJlZW4gYXV0aGVudGljYXRlZDogJSUgaXMgcmVwbGFjZWQgYnkgYSBsaXRlcmFsICclJywKKyVoIGlzIHJlcGxhY2VkIGJ5IHRoZSBob21lIGRpcmVjdG9yeSBvZiB0aGUgdXNlciBiZWluZyBhdXRoZW50aWNhdGVkLCBhbmQKKyV1IGlzIHJlcGxhY2VkIGJ5IHRoZSB1c2VybmFtZSBvZiB0aGF0IHVzZXIuCisuUHAKK1RoZQorLkNtIENocm9vdERpcmVjdG9yeQorbXVzdCBjb250YWluIHRoZSBuZWNlc3NhcnkgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHRvIHN1cHBvcnQgdGhlCit1c2VyJ3Mgc2Vzc2lvbi4KK0ZvciBhbiBpbnRlcmFjdGl2ZSBzZXNzaW9uIHRoaXMgcmVxdWlyZXMgYXQgbGVhc3QgYSBzaGVsbCwgdHlwaWNhbGx5CisuWHIgc2ggMSAsCithbmQgYmFzaWMKKy5QYSAvZGV2Citub2RlcyBzdWNoIGFzCisuWHIgbnVsbCA0ICwKKy5YciB6ZXJvIDQgLAorLlhyIHN0ZGluIDQgLAorLlhyIHN0ZG91dCA0ICwKKy5YciBzdGRlcnIgNCAsCisuWHIgYXJhbmRvbSA0CithbmQKKy5YciB0dHkgNAorZGV2aWNlcy4KK0ZvciBmaWxlIHRyYW5zZmVyIHNlc3Npb25zIHVzaW5nCisuRHEgc2Z0cCAsCitubyBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGVudmlyb25tZW50IGlzIG5lY2Vzc2FyeSBpZiB0aGUKK2luLXByb2Nlc3Mgc2Z0cCBzZXJ2ZXIgaXMgdXNlZCwKK3Rob3VnaCBzZXNzaW9ucyB3aGljaCB1c2UgbG9nZ2luZyBkbyByZXF1aXJlCisuUGEgL2Rldi9sb2cKK2luc2lkZSB0aGUgY2hyb290IGRpcmVjdG9yeSAoc2VlCisuWHIgc2Z0cC1zZXJ2ZXIgOAorZm9yIGRldGFpbHMpLgorLlBwCitUaGUgZGVmYXVsdCBpcyBub3QgdG8KKy5YciBjaHJvb3QgMiAuCisuSXQgQ20gQ2lwaGVycworU3BlY2lmaWVzIHRoZSBjaXBoZXJzIGFsbG93ZWQgZm9yIHByb3RvY29sIHZlcnNpb24gMi4KK011bHRpcGxlIGNpcGhlcnMgbXVzdCBiZSBjb21tYS1zZXBhcmF0ZWQuCitUaGUgc3VwcG9ydGVkIGNpcGhlcnMgYXJlCisuRHEgM2Rlcy1jYmMgLAorLkRxIGFlczEyOC1jYmMgLAorLkRxIGFlczE5Mi1jYmMgLAorLkRxIGFlczI1Ni1jYmMgLAorLkRxIGFlczEyOC1jdHIgLAorLkRxIGFlczE5Mi1jdHIgLAorLkRxIGFlczI1Ni1jdHIgLAorLkRxIGFyY2ZvdXIxMjggLAorLkRxIGFyY2ZvdXIyNTYgLAorLkRxIGFyY2ZvdXIgLAorLkRxIGJsb3dmaXNoLWNiYyAsCithbmQKKy5EcSBjYXN0MTI4LWNiYyAuCitUaGUgZGVmYXVsdCBpczoKKy5CZCAtbGl0ZXJhbCAtb2Zmc2V0IDNuCithZXMxMjgtY3RyLGFlczE5Mi1jdHIsYWVzMjU2LWN0cixhcmNmb3VyMjU2LGFyY2ZvdXIxMjgsCithZXMxMjgtY2JjLDNkZXMtY2JjLGJsb3dmaXNoLWNiYyxjYXN0MTI4LWNiYyxhZXMxOTItY2JjLAorYWVzMjU2LWNiYyxhcmNmb3VyCisuRWQKKy5JdCBDbSBDbGllbnRBbGl2ZUNvdW50TWF4CitTZXRzIHRoZSBudW1iZXIgb2YgY2xpZW50IGFsaXZlIG1lc3NhZ2VzIChzZWUgYmVsb3cpIHdoaWNoIG1heSBiZQorc2VudCB3aXRob3V0CisuWHIgc3NoZCA4CityZWNlaXZpbmcgYW55IG1lc3NhZ2VzIGJhY2sgZnJvbSB0aGUgY2xpZW50LgorSWYgdGhpcyB0aHJlc2hvbGQgaXMgcmVhY2hlZCB3aGlsZSBjbGllbnQgYWxpdmUgbWVzc2FnZXMgYXJlIGJlaW5nIHNlbnQsCitzc2hkIHdpbGwgZGlzY29ubmVjdCB0aGUgY2xpZW50LCB0ZXJtaW5hdGluZyB0aGUgc2Vzc2lvbi4KK0l0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIHVzZSBvZiBjbGllbnQgYWxpdmUgbWVzc2FnZXMgaXMgdmVyeQorZGlmZmVyZW50IGZyb20KKy5DbSBUQ1BLZWVwQWxpdmUKKyhiZWxvdykuCitUaGUgY2xpZW50IGFsaXZlIG1lc3NhZ2VzIGFyZSBzZW50IHRocm91Z2ggdGhlIGVuY3J5cHRlZCBjaGFubmVsCithbmQgdGhlcmVmb3JlIHdpbGwgbm90IGJlIHNwb29mYWJsZS4KK1RoZSBUQ1Aga2VlcGFsaXZlIG9wdGlvbiBlbmFibGVkIGJ5CisuQ20gVENQS2VlcEFsaXZlCitpcyBzcG9vZmFibGUuCitUaGUgY2xpZW50IGFsaXZlIG1lY2hhbmlzbSBpcyB2YWx1YWJsZSB3aGVuIHRoZSBjbGllbnQgb3IKK3NlcnZlciBkZXBlbmQgb24ga25vd2luZyB3aGVuIGEgY29ubmVjdGlvbiBoYXMgYmVjb21lIGluYWN0aXZlLgorLlBwCitUaGUgZGVmYXVsdCB2YWx1ZSBpcyAzLgorSWYKKy5DbSBDbGllbnRBbGl2ZUludGVydmFsCisoc2VlIGJlbG93KSBpcyBzZXQgdG8gMTUsIGFuZAorLkNtIENsaWVudEFsaXZlQ291bnRNYXgKK2lzIGxlZnQgYXQgdGhlIGRlZmF1bHQsIHVucmVzcG9uc2l2ZSBTU0ggY2xpZW50cword2lsbCBiZSBkaXNjb25uZWN0ZWQgYWZ0ZXIgYXBwcm94aW1hdGVseSA0NSBzZWNvbmRzLgorVGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDIgb25seS4KKy5JdCBDbSBDbGllbnRBbGl2ZUludGVydmFsCitTZXRzIGEgdGltZW91dCBpbnRlcnZhbCBpbiBzZWNvbmRzIGFmdGVyIHdoaWNoIGlmIG5vIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQKK2Zyb20gdGhlIGNsaWVudCwKKy5YciBzc2hkIDgKK3dpbGwgc2VuZCBhIG1lc3NhZ2UgdGhyb3VnaCB0aGUgZW5jcnlwdGVkCitjaGFubmVsIHRvIHJlcXVlc3QgYSByZXNwb25zZSBmcm9tIHRoZSBjbGllbnQuCitUaGUgZGVmYXVsdAoraXMgMCwgaW5kaWNhdGluZyB0aGF0IHRoZXNlIG1lc3NhZ2VzIHdpbGwgbm90IGJlIHNlbnQgdG8gdGhlIGNsaWVudC4KK1RoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAyIG9ubHkuCisuSXQgQ20gQ29tcHJlc3Npb24KK1NwZWNpZmllcyB3aGV0aGVyIGNvbXByZXNzaW9uIGlzIGFsbG93ZWQsIG9yIGRlbGF5ZWQgdW50aWwKK3RoZSB1c2VyIGhhcyBhdXRoZW50aWNhdGVkIHN1Y2Nlc3NmdWxseS4KK1RoZSBhcmd1bWVudCBtdXN0IGJlCisuRHEgeWVzICwKKy5EcSBkZWxheWVkICwKK29yCisuRHEgbm8gLgorVGhlIGRlZmF1bHQgaXMKKy5EcSBkZWxheWVkIC4KKy5JdCBDbSBEZW55R3JvdXBzCitUaGlzIGtleXdvcmQgY2FuIGJlIGZvbGxvd2VkIGJ5IGEgbGlzdCBvZiBncm91cCBuYW1lIHBhdHRlcm5zLCBzZXBhcmF0ZWQKK2J5IHNwYWNlcy4KK0xvZ2luIGlzIGRpc2FsbG93ZWQgZm9yIHVzZXJzIHdob3NlIHByaW1hcnkgZ3JvdXAgb3Igc3VwcGxlbWVudGFyeQorZ3JvdXAgbGlzdCBtYXRjaGVzIG9uZSBvZiB0aGUgcGF0dGVybnMuCitPbmx5IGdyb3VwIG5hbWVzIGFyZSB2YWxpZDsgYSBudW1lcmljYWwgZ3JvdXAgSUQgaXMgbm90IHJlY29nbml6ZWQuCitCeSBkZWZhdWx0LCBsb2dpbiBpcyBhbGxvd2VkIGZvciBhbGwgZ3JvdXBzLgorVGhlIGFsbG93L2RlbnkgZGlyZWN0aXZlcyBhcmUgcHJvY2Vzc2VkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisuQ20gRGVueVVzZXJzICwKKy5DbSBBbGxvd1VzZXJzICwKKy5DbSBEZW55R3JvdXBzICwKK2FuZCBmaW5hbGx5CisuQ20gQWxsb3dHcm91cHMgLgorLlBwCitTZWUKKy5TeCBQQVRURVJOUworaW4KKy5YciBzc2hfY29uZmlnIDUKK2ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHBhdHRlcm5zLgorLkl0IENtIERlbnlVc2VycworVGhpcyBrZXl3b3JkIGNhbiBiZSBmb2xsb3dlZCBieSBhIGxpc3Qgb2YgdXNlciBuYW1lIHBhdHRlcm5zLCBzZXBhcmF0ZWQKK2J5IHNwYWNlcy4KK0xvZ2luIGlzIGRpc2FsbG93ZWQgZm9yIHVzZXIgbmFtZXMgdGhhdCBtYXRjaCBvbmUgb2YgdGhlIHBhdHRlcm5zLgorT25seSB1c2VyIG5hbWVzIGFyZSB2YWxpZDsgYSBudW1lcmljYWwgdXNlciBJRCBpcyBub3QgcmVjb2duaXplZC4KK0J5IGRlZmF1bHQsIGxvZ2luIGlzIGFsbG93ZWQgZm9yIGFsbCB1c2Vycy4KK0lmIHRoZSBwYXR0ZXJuIHRha2VzIHRoZSBmb3JtIFVTRVJASE9TVCB0aGVuIFVTRVIgYW5kIEhPU1QKK2FyZSBzZXBhcmF0ZWx5IGNoZWNrZWQsIHJlc3RyaWN0aW5nIGxvZ2lucyB0byBwYXJ0aWN1bGFyCit1c2VycyBmcm9tIHBhcnRpY3VsYXIgaG9zdHMuCitUaGUgYWxsb3cvZGVueSBkaXJlY3RpdmVzIGFyZSBwcm9jZXNzZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKy5DbSBEZW55VXNlcnMgLAorLkNtIEFsbG93VXNlcnMgLAorLkNtIERlbnlHcm91cHMgLAorYW5kIGZpbmFsbHkKKy5DbSBBbGxvd0dyb3VwcyAuCisuUHAKK1NlZQorLlN4IFBBVFRFUk5TCitpbgorLlhyIHNzaF9jb25maWcgNQorZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcGF0dGVybnMuCisuSXQgQ20gRm9yY2VDb21tYW5kCitGb3JjZXMgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgY29tbWFuZCBzcGVjaWZpZWQgYnkKKy5DbSBGb3JjZUNvbW1hbmQgLAoraWdub3JpbmcgYW55IGNvbW1hbmQgc3VwcGxpZWQgYnkgdGhlIGNsaWVudCBhbmQKKy5QYSB+Ly5zc2gvcmMKK2lmIHByZXNlbnQuCitUaGUgY29tbWFuZCBpcyBpbnZva2VkIGJ5IHVzaW5nIHRoZSB1c2VyJ3MgbG9naW4gc2hlbGwgd2l0aCB0aGUgLWMgb3B0aW9uLgorVGhpcyBhcHBsaWVzIHRvIHNoZWxsLCBjb21tYW5kLCBvciBzdWJzeXN0ZW0gZXhlY3V0aW9uLgorSXQgaXMgbW9zdCB1c2VmdWwgaW5zaWRlIGEKKy5DbSBNYXRjaAorYmxvY2suCitUaGUgY29tbWFuZCBvcmlnaW5hbGx5IHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQgaXMgYXZhaWxhYmxlIGluIHRoZQorLkV2IFNTSF9PUklHSU5BTF9DT01NQU5ECitlbnZpcm9ubWVudCB2YXJpYWJsZS4KK1NwZWNpZnlpbmcgYSBjb21tYW5kIG9mCisuRHEgaW50ZXJuYWwtc2Z0cAord2lsbCBmb3JjZSB0aGUgdXNlIG9mIGFuIGluLXByb2Nlc3Mgc2Z0cCBzZXJ2ZXIgdGhhdCByZXF1aXJlcyBubyBzdXBwb3J0CitmaWxlcyB3aGVuIHVzZWQgd2l0aAorLkNtIENocm9vdERpcmVjdG9yeSAuCisuSXQgQ20gR2F0ZXdheVBvcnRzCitTcGVjaWZpZXMgd2hldGhlciByZW1vdGUgaG9zdHMgYXJlIGFsbG93ZWQgdG8gY29ubmVjdCB0byBwb3J0cworZm9yd2FyZGVkIGZvciB0aGUgY2xpZW50LgorQnkgZGVmYXVsdCwKKy5YciBzc2hkIDgKK2JpbmRzIHJlbW90ZSBwb3J0IGZvcndhcmRpbmdzIHRvIHRoZSBsb29wYmFjayBhZGRyZXNzLgorVGhpcyBwcmV2ZW50cyBvdGhlciByZW1vdGUgaG9zdHMgZnJvbSBjb25uZWN0aW5nIHRvIGZvcndhcmRlZCBwb3J0cy4KKy5DbSBHYXRld2F5UG9ydHMKK2NhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhhdCBzc2hkCitzaG91bGQgYWxsb3cgcmVtb3RlIHBvcnQgZm9yd2FyZGluZ3MgdG8gYmluZCB0byBub24tbG9vcGJhY2sgYWRkcmVzc2VzLCB0aHVzCithbGxvd2luZyBvdGhlciBob3N0cyB0byBjb25uZWN0LgorVGhlIGFyZ3VtZW50IG1heSBiZQorLkRxIG5vCit0byBmb3JjZSByZW1vdGUgcG9ydCBmb3J3YXJkaW5ncyB0byBiZSBhdmFpbGFibGUgdG8gdGhlIGxvY2FsIGhvc3Qgb25seSwKKy5EcSB5ZXMKK3RvIGZvcmNlIHJlbW90ZSBwb3J0IGZvcndhcmRpbmdzIHRvIGJpbmQgdG8gdGhlIHdpbGRjYXJkIGFkZHJlc3MsIG9yCisuRHEgY2xpZW50c3BlY2lmaWVkCit0byBhbGxvdyB0aGUgY2xpZW50IHRvIHNlbGVjdCB0aGUgYWRkcmVzcyB0byB3aGljaCB0aGUgZm9yd2FyZGluZyBpcyBib3VuZC4KK1RoZSBkZWZhdWx0IGlzCisuRHEgbm8gLgorLkl0IENtIEdTU0FQSUF1dGhlbnRpY2F0aW9uCitTcGVjaWZpZXMgd2hldGhlciB1c2VyIGF1dGhlbnRpY2F0aW9uIGJhc2VkIG9uIEdTU0FQSSBpcyBhbGxvd2VkLgorVGhlIGRlZmF1bHQgaXMKKy5EcSBubyAuCitOb3RlIHRoYXQgdGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDIgb25seS4KKy5JdCBDbSBHU1NBUElDbGVhbnVwQ3JlZGVudGlhbHMKK1NwZWNpZmllcyB3aGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgZGVzdHJveSB0aGUgdXNlcidzIGNyZWRlbnRpYWxzIGNhY2hlCitvbiBsb2dvdXQuCitUaGUgZGVmYXVsdCBpcworLkRxIHllcyAuCitOb3RlIHRoYXQgdGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDIgb25seS4KKy5JdCBDbSBIb3N0YmFzZWRBdXRoZW50aWNhdGlvbgorU3BlY2lmaWVzIHdoZXRoZXIgcmhvc3RzIG9yIC9ldGMvaG9zdHMuZXF1aXYgYXV0aGVudGljYXRpb24gdG9nZXRoZXIKK3dpdGggc3VjY2Vzc2Z1bCBwdWJsaWMga2V5IGNsaWVudCBob3N0IGF1dGhlbnRpY2F0aW9uIGlzIGFsbG93ZWQKKyhob3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uKS4KK1RoaXMgb3B0aW9uIGlzIHNpbWlsYXIgdG8KKy5DbSBSaG9zdHNSU0FBdXRoZW50aWNhdGlvbgorYW5kIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAyIG9ubHkuCitUaGUgZGVmYXVsdCBpcworLkRxIG5vIC4KKy5JdCBDbSBIb3N0YmFzZWRVc2VzTmFtZUZyb21QYWNrZXRPbmx5CitTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIHNlcnZlciB3aWxsIGF0dGVtcHQgdG8gcGVyZm9ybSBhIHJldmVyc2UKK25hbWUgbG9va3VwIHdoZW4gbWF0Y2hpbmcgdGhlIG5hbWUgaW4gdGhlCisuUGEgfi8uc2hvc3RzICwKKy5QYSB+Ly5yaG9zdHMgLAorYW5kCisuUGEgL2V0Yy9ob3N0cy5lcXVpdgorZmlsZXMgZHVyaW5nCisuQ20gSG9zdGJhc2VkQXV0aGVudGljYXRpb24gLgorQSBzZXR0aW5nIG9mCisuRHEgeWVzCittZWFucyB0aGF0CisuWHIgc3NoZCA4Cit1c2VzIHRoZSBuYW1lIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQgcmF0aGVyIHRoYW4KK2F0dGVtcHRpbmcgdG8gcmVzb2x2ZSB0aGUgbmFtZSBmcm9tIHRoZSBUQ1AgY29ubmVjdGlvbiBpdHNlbGYuCitUaGUgZGVmYXVsdCBpcworLkRxIG5vIC4KKy5JdCBDbSBIb3N0Q2VydGlmaWNhdGUKK1NwZWNpZmllcyBhIGZpbGUgY29udGFpbmluZyBhIHB1YmxpYyBob3N0IGNlcnRpZmljYXRlLgorVGhlIGNlcnRpZmljYXRlJ3MgcHVibGljIGtleSBtdXN0IG1hdGNoIGEgcHJpdmF0ZSBob3N0IGtleSBhbHJlYWR5IHNwZWNpZmllZAorYnkKKy5DbSBIb3N0S2V5IC4KK1RoZSBkZWZhdWx0IGJlaGF2aW91ciBvZgorLlhyIHNzaGQgOAoraXMgbm90IHRvIGxvYWQgYW55IGNlcnRpZmljYXRlcy4KKy5JdCBDbSBIb3N0S2V5CitTcGVjaWZpZXMgYSBmaWxlIGNvbnRhaW5pbmcgYSBwcml2YXRlIGhvc3Qga2V5Cit1c2VkIGJ5IFNTSC4KK1RoZSBkZWZhdWx0IGlzCisuUGEgL2V0Yy9zc2gvc3NoX2hvc3Rfa2V5Citmb3IgcHJvdG9jb2wgdmVyc2lvbiAxLCBhbmQKKy5QYSAvZXRjL3NzaC9zc2hfaG9zdF9kc2Ffa2V5ICwKKy5QYSAvZXRjL3NzaC9zc2hfaG9zdF9lY2RzYV9rZXkKK2FuZAorLlBhIC9ldGMvc3NoL3NzaF9ob3N0X3JzYV9rZXkKK2ZvciBwcm90b2NvbCB2ZXJzaW9uIDIuCitOb3RlIHRoYXQKKy5YciBzc2hkIDgKK3dpbGwgcmVmdXNlIHRvIHVzZSBhIGZpbGUgaWYgaXQgaXMgZ3JvdXAvd29ybGQtYWNjZXNzaWJsZS4KK0l0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgaG9zdCBrZXkgZmlsZXMuCisuRHEgcnNhMQora2V5cyBhcmUgdXNlZCBmb3IgdmVyc2lvbiAxIGFuZAorLkRxIGRzYSAsCisuRHEgZWNkc2EKK29yCisuRHEgcnNhCithcmUgdXNlZCBmb3IgdmVyc2lvbiAyIG9mIHRoZSBTU0ggcHJvdG9jb2wuCisuSXQgQ20gSWdub3JlUmhvc3RzCitTcGVjaWZpZXMgdGhhdAorLlBhIC5yaG9zdHMKK2FuZAorLlBhIC5zaG9zdHMKK2ZpbGVzIHdpbGwgbm90IGJlIHVzZWQgaW4KKy5DbSBSaG9zdHNSU0FBdXRoZW50aWNhdGlvbgorb3IKKy5DbSBIb3N0YmFzZWRBdXRoZW50aWNhdGlvbiAuCisuUHAKKy5QYSAvZXRjL2hvc3RzLmVxdWl2CithbmQKKy5QYSAvZXRjL3Nob3N0cy5lcXVpdgorYXJlIHN0aWxsIHVzZWQuCitUaGUgZGVmYXVsdCBpcworLkRxIHllcyAuCisuSXQgQ20gSWdub3JlVXNlcktub3duSG9zdHMKK1NwZWNpZmllcyB3aGV0aGVyCisuWHIgc3NoZCA4CitzaG91bGQgaWdub3JlIHRoZSB1c2VyJ3MKKy5QYSB+Ly5zc2gva25vd25faG9zdHMKK2R1cmluZworLkNtIFJob3N0c1JTQUF1dGhlbnRpY2F0aW9uCitvcgorLkNtIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uIC4KK1RoZSBkZWZhdWx0IGlzCisuRHEgbm8gLgorLkl0IENtIElQUW9TCitTcGVjaWZpZXMgdGhlIElQdjQgdHlwZS1vZi1zZXJ2aWNlIG9yIERTQ1AgY2xhc3MgZm9yIHRoZSBjb25uZWN0aW9uLgorQWNjZXB0ZWQgdmFsdWVzIGFyZQorLkRxIGFmMTEgLAorLkRxIGFmMTIgLAorLkRxIGFmMTMgLAorLkRxIGFmMjEgLAorLkRxIGFmMjIgLAorLkRxIGFmMjMgLAorLkRxIGFmMzEgLAorLkRxIGFmMzIgLAorLkRxIGFmMzMgLAorLkRxIGFmNDEgLAorLkRxIGFmNDIgLAorLkRxIGFmNDMgLAorLkRxIGNzMCAsCisuRHEgY3MxICwKKy5EcSBjczIgLAorLkRxIGNzMyAsCisuRHEgY3M0ICwKKy5EcSBjczUgLAorLkRxIGNzNiAsCisuRHEgY3M3ICwKKy5EcSBlZiAsCisuRHEgbG93ZGVsYXkgLAorLkRxIHRocm91Z2hwdXQgLAorLkRxIHJlbGlhYmlsaXR5ICwKK29yIGEgbnVtZXJpYyB2YWx1ZS4KK1RoaXMgb3B0aW9uIG1heSB0YWtlIG9uZSBvciB0d28gYXJndW1lbnRzLCBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4KK0lmIG9uZSBhcmd1bWVudCBpcyBzcGVjaWZpZWQsIGl0IGlzIHVzZWQgYXMgdGhlIHBhY2tldCBjbGFzcyB1bmNvbmRpdGlvbmFsbHkuCitJZiB0d28gdmFsdWVzIGFyZSBzcGVjaWZpZWQsIHRoZSBmaXJzdCBpcyBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIGZvcgoraW50ZXJhY3RpdmUgc2Vzc2lvbnMgYW5kIHRoZSBzZWNvbmQgZm9yIG5vbi1pbnRlcmFjdGl2ZSBzZXNzaW9ucy4KK1RoZSBkZWZhdWx0IGlzCisuRHEgbG93ZGVsYXkKK2ZvciBpbnRlcmFjdGl2ZSBzZXNzaW9ucyBhbmQKKy5EcSB0aHJvdWdocHV0Citmb3Igbm9uLWludGVyYWN0aXZlIHNlc3Npb25zLgorLkl0IENtIEtlcmJlcm9zQXV0aGVudGljYXRpb24KK1NwZWNpZmllcyB3aGV0aGVyIHRoZSBwYXNzd29yZCBwcm92aWRlZCBieSB0aGUgdXNlciBmb3IKKy5DbSBQYXNzd29yZEF1dGhlbnRpY2F0aW9uCit3aWxsIGJlIHZhbGlkYXRlZCB0aHJvdWdoIHRoZSBLZXJiZXJvcyBLREMuCitUbyB1c2UgdGhpcyBvcHRpb24sIHRoZSBzZXJ2ZXIgbmVlZHMgYQorS2VyYmVyb3Mgc2VydnRhYiB3aGljaCBhbGxvd3MgdGhlIHZlcmlmaWNhdGlvbiBvZiB0aGUgS0RDJ3MgaWRlbnRpdHkuCitUaGUgZGVmYXVsdCBpcworLkRxIG5vIC4KKy5JdCBDbSBLZXJiZXJvc0dldEFGU1Rva2VuCitJZiBBRlMgaXMgYWN0aXZlIGFuZCB0aGUgdXNlciBoYXMgYSBLZXJiZXJvcyA1IFRHVCwgYXR0ZW1wdCB0byBhY3F1aXJlCithbiBBRlMgdG9rZW4gYmVmb3JlIGFjY2Vzc2luZyB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LgorVGhlIGRlZmF1bHQgaXMKKy5EcSBubyAuCisuSXQgQ20gS2VyYmVyb3NPckxvY2FsUGFzc3dkCitJZiBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiB0aHJvdWdoIEtlcmJlcm9zIGZhaWxzIHRoZW4KK3RoZSBwYXNzd29yZCB3aWxsIGJlIHZhbGlkYXRlZCB2aWEgYW55IGFkZGl0aW9uYWwgbG9jYWwgbWVjaGFuaXNtCitzdWNoIGFzCisuUGEgL2V0Yy9wYXNzd2QgLgorVGhlIGRlZmF1bHQgaXMKKy5EcSB5ZXMgLgorLkl0IENtIEtlcmJlcm9zVGlja2V0Q2xlYW51cAorU3BlY2lmaWVzIHdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBkZXN0cm95IHRoZSB1c2VyJ3MgdGlja2V0IGNhY2hlCitmaWxlIG9uIGxvZ291dC4KK1RoZSBkZWZhdWx0IGlzCisuRHEgeWVzIC4KKy5JdCBDbSBLZXhBbGdvcml0aG1zCitTcGVjaWZpZXMgdGhlIGF2YWlsYWJsZSBLRVggKEtleSBFeGNoYW5nZSkgYWxnb3JpdGhtcy4KK011bHRpcGxlIGFsZ29yaXRobXMgbXVzdCBiZSBjb21tYS1zZXBhcmF0ZWQuCitUaGUgZGVmYXVsdCBpcworLkRxIGVjZGgtc2hhMi1uaXN0cDI1NiAsCisuRHEgZWNkaC1zaGEyLW5pc3RwMzg0ICwKKy5EcSBlY2RoLXNoYTItbmlzdHA1MjEgLAorLkRxIGRpZmZpZS1oZWxsbWFuLWdyb3VwLWV4Y2hhbmdlLXNoYTI1NiAsCisuRHEgZGlmZmllLWhlbGxtYW4tZ3JvdXAtZXhjaGFuZ2Utc2hhMSAsCisuRHEgZGlmZmllLWhlbGxtYW4tZ3JvdXAxNC1zaGExICwKKy5EcSBkaWZmaWUtaGVsbG1hbi1ncm91cDEtc2hhMSAuCisuSXQgQ20gS2V5UmVnZW5lcmF0aW9uSW50ZXJ2YWwKK0luIHByb3RvY29sIHZlcnNpb24gMSwgdGhlIGVwaGVtZXJhbCBzZXJ2ZXIga2V5IGlzIGF1dG9tYXRpY2FsbHkgcmVnZW5lcmF0ZWQKK2FmdGVyIHRoaXMgbWFueSBzZWNvbmRzIChpZiBpdCBoYXMgYmVlbiB1c2VkKS4KK1RoZSBwdXJwb3NlIG9mIHJlZ2VuZXJhdGlvbiBpcyB0byBwcmV2ZW50CitkZWNyeXB0aW5nIGNhcHR1cmVkIHNlc3Npb25zIGJ5IGxhdGVyIGJyZWFraW5nIGludG8gdGhlIG1hY2hpbmUgYW5kCitzdGVhbGluZyB0aGUga2V5cy4KK1RoZSBrZXkgaXMgbmV2ZXIgc3RvcmVkIGFueXdoZXJlLgorSWYgdGhlIHZhbHVlIGlzIDAsIHRoZSBrZXkgaXMgbmV2ZXIgcmVnZW5lcmF0ZWQuCitUaGUgZGVmYXVsdCBpcyAzNjAwIChzZWNvbmRzKS4KKy5JdCBDbSBMaXN0ZW5BZGRyZXNzCitTcGVjaWZpZXMgdGhlIGxvY2FsIGFkZHJlc3NlcworLlhyIHNzaGQgOAorc2hvdWxkIGxpc3RlbiBvbi4KK1RoZSBmb2xsb3dpbmcgZm9ybXMgbWF5IGJlIHVzZWQ6CisuUHAKKy5CbCAtaXRlbSAtb2Zmc2V0IGluZGVudCAtY29tcGFjdAorLkl0CisuQ20gTGlzdGVuQWRkcmVzcworLlNtIG9mZgorLkFyIGhvc3QgTm8gfCBBciBJUHY0X2FkZHIgTm8gfCBBciBJUHY2X2FkZHIKKy5TbSBvbgorLkl0CisuQ20gTGlzdGVuQWRkcmVzcworLlNtIG9mZgorLkFyIGhvc3QgTm8gfCBBciBJUHY0X2FkZHIgTm8gOiBBciBwb3J0CisuU20gb24KKy5JdAorLkNtIExpc3RlbkFkZHJlc3MKKy5TbSBvZmYKKy5PbworLkFyIGhvc3QgTm8gfCBBciBJUHY2X2FkZHIgT2MgOiBBciBwb3J0CisuU20gb24KKy5FbAorLlBwCitJZgorLkFyIHBvcnQKK2lzIG5vdCBzcGVjaWZpZWQsCitzc2hkIHdpbGwgbGlzdGVuIG9uIHRoZSBhZGRyZXNzIGFuZCBhbGwgcHJpb3IKKy5DbSBQb3J0CitvcHRpb25zIHNwZWNpZmllZC4KK1RoZSBkZWZhdWx0IGlzIHRvIGxpc3RlbiBvbiBhbGwgbG9jYWwgYWRkcmVzc2VzLgorTXVsdGlwbGUKKy5DbSBMaXN0ZW5BZGRyZXNzCitvcHRpb25zIGFyZSBwZXJtaXR0ZWQuCitBZGRpdGlvbmFsbHksIGFueQorLkNtIFBvcnQKK29wdGlvbnMgbXVzdCBwcmVjZWRlIHRoaXMgb3B0aW9uIGZvciBub24tcG9ydCBxdWFsaWZpZWQgYWRkcmVzc2VzLgorLkl0IENtIExvZ2luR3JhY2VUaW1lCitUaGUgc2VydmVyIGRpc2Nvbm5lY3RzIGFmdGVyIHRoaXMgdGltZSBpZiB0aGUgdXNlciBoYXMgbm90CitzdWNjZXNzZnVsbHkgbG9nZ2VkIGluLgorSWYgdGhlIHZhbHVlIGlzIDAsIHRoZXJlIGlzIG5vIHRpbWUgbGltaXQuCitUaGUgZGVmYXVsdCBpcyAxMjAgc2Vjb25kcy4KKy5JdCBDbSBMb2dMZXZlbAorR2l2ZXMgdGhlIHZlcmJvc2l0eSBsZXZlbCB0aGF0IGlzIHVzZWQgd2hlbiBsb2dnaW5nIG1lc3NhZ2VzIGZyb20KKy5YciBzc2hkIDggLgorVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6CitRVUlFVCwgRkFUQUwsIEVSUk9SLCBJTkZPLCBWRVJCT1NFLCBERUJVRywgREVCVUcxLCBERUJVRzIsIGFuZCBERUJVRzMuCitUaGUgZGVmYXVsdCBpcyBJTkZPLgorREVCVUcgYW5kIERFQlVHMSBhcmUgZXF1aXZhbGVudC4KK0RFQlVHMiBhbmQgREVCVUczIGVhY2ggc3BlY2lmeSBoaWdoZXIgbGV2ZWxzIG9mIGRlYnVnZ2luZyBvdXRwdXQuCitMb2dnaW5nIHdpdGggYSBERUJVRyBsZXZlbCB2aW9sYXRlcyB0aGUgcHJpdmFjeSBvZiB1c2VycyBhbmQgaXMgbm90IHJlY29tbWVuZGVkLgorLkl0IENtIE1BQ3MKK1NwZWNpZmllcyB0aGUgYXZhaWxhYmxlIE1BQyAobWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlKSBhbGdvcml0aG1zLgorVGhlIE1BQyBhbGdvcml0aG0gaXMgdXNlZCBpbiBwcm90b2NvbCB2ZXJzaW9uIDIKK2ZvciBkYXRhIGludGVncml0eSBwcm90ZWN0aW9uLgorTXVsdGlwbGUgYWxnb3JpdGhtcyBtdXN0IGJlIGNvbW1hLXNlcGFyYXRlZC4KK1RoZSBkZWZhdWx0IGlzOgorLkJkIC1saXRlcmFsIC1vZmZzZXQgaW5kZW50CitobWFjLW1kNSxobWFjLXNoYTEsdW1hYy02NEBvcGVuc3NoLmNvbSwKK2htYWMtcmlwZW1kMTYwLGhtYWMtc2hhMS05NixobWFjLW1kNS05NiwKK2htYWMtc2hhMi0yNTYsaG1hYy1zaGEyNTYtOTYsaG1hYy1zaGEyLTUxMiwKK2htYWMtc2hhMi01MTItOTYKKy5FZAorLkl0IENtIE1hdGNoCitJbnRyb2R1Y2VzIGEgY29uZGl0aW9uYWwgYmxvY2suCitJZiBhbGwgb2YgdGhlIGNyaXRlcmlhIG9uIHRoZQorLkNtIE1hdGNoCitsaW5lIGFyZSBzYXRpc2ZpZWQsIHRoZSBrZXl3b3JkcyBvbiB0aGUgZm9sbG93aW5nIGxpbmVzIG92ZXJyaWRlIHRob3NlCitzZXQgaW4gdGhlIGdsb2JhbCBzZWN0aW9uIG9mIHRoZSBjb25maWcgZmlsZSwgdW50aWwgZWl0aGVyIGFub3RoZXIKKy5DbSBNYXRjaAorbGluZSBvciB0aGUgZW5kIG9mIHRoZSBmaWxlLgorLlBwCitUaGUgYXJndW1lbnRzIHRvCisuQ20gTWF0Y2gKK2FyZSBvbmUgb3IgbW9yZSBjcml0ZXJpYS1wYXR0ZXJuIHBhaXJzLgorVGhlIGF2YWlsYWJsZSBjcml0ZXJpYSBhcmUKKy5DbSBVc2VyICwKKy5DbSBHcm91cCAsCisuQ20gSG9zdCAsCithbmQKKy5DbSBBZGRyZXNzIC4KK1RoZSBtYXRjaCBwYXR0ZXJucyBtYXkgY29uc2lzdCBvZiBzaW5nbGUgZW50cmllcyBvciBjb21tYS1zZXBhcmF0ZWQKK2xpc3RzIGFuZCBtYXkgdXNlIHRoZSB3aWxkY2FyZCBhbmQgbmVnYXRpb24gb3BlcmF0b3JzIGRlc2NyaWJlZCBpbiB0aGUKKy5TeCBQQVRURVJOUworc2VjdGlvbiBvZgorLlhyIHNzaF9jb25maWcgNSAuCisuUHAKK1RoZSBwYXR0ZXJucyBpbiBhbgorLkNtIEFkZHJlc3MKK2NyaXRlcmlhIG1heSBhZGRpdGlvbmFsbHkgY29udGFpbiBhZGRyZXNzZXMgdG8gbWF0Y2ggaW4gQ0lEUgorYWRkcmVzcy9tYXNrbGVuIGZvcm1hdCwgZS5nLlwmCisuRHEgMTkyLjAuMi4wLzI0CitvcgorLkRxIDNmZmU6ZmZmZjo6LzMyIC4KK05vdGUgdGhhdCB0aGUgbWFzayBsZW5ndGggcHJvdmlkZWQgbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGFkZHJlc3MgLQoraXQgaXMgYW4gZXJyb3IgdG8gc3BlY2lmeSBhIG1hc2sgbGVuZ3RoIHRoYXQgaXMgdG9vIGxvbmcgZm9yIHRoZSBhZGRyZXNzCitvciBvbmUgd2l0aCBiaXRzIHNldCBpbiB0aGlzIGhvc3QgcG9ydGlvbiBvZiB0aGUgYWRkcmVzcy4KK0ZvciBleGFtcGxlLAorLkRxIDE5Mi4wLjIuMC8zMworYW5kCisuRHEgMTkyLjAuMi4wLzgKK3Jlc3BlY3RpdmVseS4KKy5QcAorT25seSBhIHN1YnNldCBvZiBrZXl3b3JkcyBtYXkgYmUgdXNlZCBvbiB0aGUgbGluZXMgZm9sbG93aW5nIGEKKy5DbSBNYXRjaAora2V5d29yZC4KK0F2YWlsYWJsZSBrZXl3b3JkcyBhcmUKKy5DbSBBbGxvd0FnZW50Rm9yd2FyZGluZyAsCisuQ20gQWxsb3dUY3BGb3J3YXJkaW5nICwKKy5DbSBBdXRob3JpemVkS2V5c0ZpbGUgLAorLkNtIEF1dGhvcml6ZWRQcmluY2lwYWxzRmlsZSAsCisuQ20gQmFubmVyICwKKy5DbSBDaHJvb3REaXJlY3RvcnkgLAorLkNtIEZvcmNlQ29tbWFuZCAsCisuQ20gR2F0ZXdheVBvcnRzICwKKy5DbSBHU1NBUElBdXRoZW50aWNhdGlvbiAsCisuQ20gSG9zdGJhc2VkQXV0aGVudGljYXRpb24gLAorLkNtIEhvc3RiYXNlZFVzZXNOYW1lRnJvbVBhY2tldE9ubHkgLAorLkNtIEtiZEludGVyYWN0aXZlQXV0aGVudGljYXRpb24gLAorLkNtIEtlcmJlcm9zQXV0aGVudGljYXRpb24gLAorLkNtIE1heEF1dGhUcmllcyAsCisuQ20gTWF4U2Vzc2lvbnMgLAorLkNtIFBhc3N3b3JkQXV0aGVudGljYXRpb24gLAorLkNtIFBlcm1pdEVtcHR5UGFzc3dvcmRzICwKKy5DbSBQZXJtaXRPcGVuICwKKy5DbSBQZXJtaXRSb290TG9naW4gLAorLkNtIFBlcm1pdFR1bm5lbCAsCisuQ20gUHVia2V5QXV0aGVudGljYXRpb24gLAorLkNtIFJob3N0c1JTQUF1dGhlbnRpY2F0aW9uICwKKy5DbSBSU0FBdXRoZW50aWNhdGlvbiAsCisuQ20gWDExRGlzcGxheU9mZnNldCAsCisuQ20gWDExRm9yd2FyZGluZworYW5kCisuQ20gWDExVXNlTG9jYWxIb3N0IC4KKy5JdCBDbSBNYXhBdXRoVHJpZXMKK1NwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgcGVybWl0dGVkIHBlcgorY29ubmVjdGlvbi4KK09uY2UgdGhlIG51bWJlciBvZiBmYWlsdXJlcyByZWFjaGVzIGhhbGYgdGhpcyB2YWx1ZSwKK2FkZGl0aW9uYWwgZmFpbHVyZXMgYXJlIGxvZ2dlZC4KK1RoZSBkZWZhdWx0IGlzIDYuCisuSXQgQ20gTWF4U2Vzc2lvbnMKK1NwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb3BlbiBzZXNzaW9ucyBwZXJtaXR0ZWQgcGVyIG5ldHdvcmsgY29ubmVjdGlvbi4KK1RoZSBkZWZhdWx0IGlzIDEwLgorLkl0IENtIE1heFN0YXJ0dXBzCitTcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgdW5hdXRoZW50aWNhdGVkIGNvbm5lY3Rpb25zIHRvIHRoZQorU1NIIGRhZW1vbi4KK0FkZGl0aW9uYWwgY29ubmVjdGlvbnMgd2lsbCBiZSBkcm9wcGVkIHVudGlsIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRzIG9yIHRoZQorLkNtIExvZ2luR3JhY2VUaW1lCitleHBpcmVzIGZvciBhIGNvbm5lY3Rpb24uCitUaGUgZGVmYXVsdCBpcyAxMC4KKy5QcAorQWx0ZXJuYXRpdmVseSwgcmFuZG9tIGVhcmx5IGRyb3AgY2FuIGJlIGVuYWJsZWQgYnkgc3BlY2lmeWluZwordGhlIHRocmVlIGNvbG9uIHNlcGFyYXRlZCB2YWx1ZXMKKy5EcSBzdGFydDpyYXRlOmZ1bGwKKyhlLmcuICIxMDozMDo2MCIpLgorLlhyIHNzaGQgOAord2lsbCByZWZ1c2UgY29ubmVjdGlvbiBhdHRlbXB0cyB3aXRoIGEgcHJvYmFiaWxpdHkgb2YKKy5EcSByYXRlLzEwMAorKDMwJSkKK2lmIHRoZXJlIGFyZSBjdXJyZW50bHkKKy5EcSBzdGFydAorKDEwKQordW5hdXRoZW50aWNhdGVkIGNvbm5lY3Rpb25zLgorVGhlIHByb2JhYmlsaXR5IGluY3JlYXNlcyBsaW5lYXJseSBhbmQgYWxsIGNvbm5lY3Rpb24gYXR0ZW1wdHMKK2FyZSByZWZ1c2VkIGlmIHRoZSBudW1iZXIgb2YgdW5hdXRoZW50aWNhdGVkIGNvbm5lY3Rpb25zIHJlYWNoZXMKKy5EcSBmdWxsCisoNjApLgorLkl0IENtIFBhc3N3b3JkQXV0aGVudGljYXRpb24KK1NwZWNpZmllcyB3aGV0aGVyIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIGlzIGFsbG93ZWQuCitUaGUgZGVmYXVsdCBpcworLkRxIHllcyAuCisuSXQgQ20gUGVybWl0RW1wdHlQYXNzd29yZHMKK1doZW4gcGFzc3dvcmQgYXV0aGVudGljYXRpb24gaXMgYWxsb3dlZCwgaXQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlCitzZXJ2ZXIgYWxsb3dzIGxvZ2luIHRvIGFjY291bnRzIHdpdGggZW1wdHkgcGFzc3dvcmQgc3RyaW5ncy4KK1RoZSBkZWZhdWx0IGlzCisuRHEgbm8gLgorLkl0IENtIFBlcm1pdE9wZW4KK1NwZWNpZmllcyB0aGUgZGVzdGluYXRpb25zIHRvIHdoaWNoIFRDUCBwb3J0IGZvcndhcmRpbmcgaXMgcGVybWl0dGVkLgorVGhlIGZvcndhcmRpbmcgc3BlY2lmaWNhdGlvbiBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOgorLlBwCisuQmwgLWl0ZW0gLW9mZnNldCBpbmRlbnQgLWNvbXBhY3QKKy5JdAorLkNtIFBlcm1pdE9wZW4KKy5TbSBvZmYKKy5BciBob3N0IDogcG9ydAorLlNtIG9uCisuSXQKKy5DbSBQZXJtaXRPcGVuCisuU20gb2ZmCisuQXIgSVB2NF9hZGRyIDogcG9ydAorLlNtIG9uCisuSXQKKy5DbSBQZXJtaXRPcGVuCisuU20gb2ZmCisuQXIgXCZbIElQdjZfYWRkciBcJl0gOiBwb3J0CisuU20gb24KKy5FbAorLlBwCitNdWx0aXBsZSBmb3J3YXJkcyBtYXkgYmUgc3BlY2lmaWVkIGJ5IHNlcGFyYXRpbmcgdGhlbSB3aXRoIHdoaXRlc3BhY2UuCitBbiBhcmd1bWVudCBvZgorLkRxIGFueQorY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIGFsbCByZXN0cmljdGlvbnMgYW5kIHBlcm1pdCBhbnkgZm9yd2FyZGluZyByZXF1ZXN0cy4KK0J5IGRlZmF1bHQgYWxsIHBvcnQgZm9yd2FyZGluZyByZXF1ZXN0cyBhcmUgcGVybWl0dGVkLgorLkl0IENtIFBlcm1pdFJvb3RMb2dpbgorU3BlY2lmaWVzIHdoZXRoZXIgcm9vdCBjYW4gbG9nIGluIHVzaW5nCisuWHIgc3NoIDEgLgorVGhlIGFyZ3VtZW50IG11c3QgYmUKKy5EcSB5ZXMgLAorLkRxIHdpdGhvdXQtcGFzc3dvcmQgLAorLkRxIGZvcmNlZC1jb21tYW5kcy1vbmx5ICwKK29yCisuRHEgbm8gLgorVGhlIGRlZmF1bHQgaXMKKy5EcSB5ZXMgLgorLlBwCitJZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8KKy5EcSB3aXRob3V0LXBhc3N3b3JkICwKK3Bhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIGlzIGRpc2FibGVkIGZvciByb290LgorLlBwCitJZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8KKy5EcSBmb3JjZWQtY29tbWFuZHMtb25seSAsCityb290IGxvZ2luIHdpdGggcHVibGljIGtleSBhdXRoZW50aWNhdGlvbiB3aWxsIGJlIGFsbG93ZWQsCitidXQgb25seSBpZiB0aGUKKy5BciBjb21tYW5kCitvcHRpb24gaGFzIGJlZW4gc3BlY2lmaWVkCisod2hpY2ggbWF5IGJlIHVzZWZ1bCBmb3IgdGFraW5nIHJlbW90ZSBiYWNrdXBzIGV2ZW4gaWYgcm9vdCBsb2dpbiBpcworbm9ybWFsbHkgbm90IGFsbG93ZWQpLgorQWxsIG90aGVyIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgYXJlIGRpc2FibGVkIGZvciByb290LgorLlBwCitJZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8KKy5EcSBubyAsCityb290IGlzIG5vdCBhbGxvd2VkIHRvIGxvZyBpbi4KKy5JdCBDbSBQZXJtaXRUdW5uZWwKK1NwZWNpZmllcyB3aGV0aGVyCisuWHIgdHVuIDQKK2RldmljZSBmb3J3YXJkaW5nIGlzIGFsbG93ZWQuCitUaGUgYXJndW1lbnQgbXVzdCBiZQorLkRxIHllcyAsCisuRHEgcG9pbnQtdG8tcG9pbnQKKyhsYXllciAzKSwKKy5EcSBldGhlcm5ldAorKGxheWVyIDIpLCBvcgorLkRxIG5vIC4KK1NwZWNpZnlpbmcKKy5EcSB5ZXMKK3Blcm1pdHMgYm90aAorLkRxIHBvaW50LXRvLXBvaW50CithbmQKKy5EcSBldGhlcm5ldCAuCitUaGUgZGVmYXVsdCBpcworLkRxIG5vIC4KKy5JdCBDbSBQZXJtaXRVc2VyRW52aXJvbm1lbnQKK1NwZWNpZmllcyB3aGV0aGVyCisuUGEgfi8uc3NoL2Vudmlyb25tZW50CithbmQKKy5DbSBlbnZpcm9ubWVudD0KK29wdGlvbnMgaW4KKy5QYSB+Ly5zc2gvYXV0aG9yaXplZF9rZXlzCithcmUgcHJvY2Vzc2VkIGJ5CisuWHIgc3NoZCA4IC4KK1RoZSBkZWZhdWx0IGlzCisuRHEgbm8gLgorRW5hYmxpbmcgZW52aXJvbm1lbnQgcHJvY2Vzc2luZyBtYXkgZW5hYmxlIHVzZXJzIHRvIGJ5cGFzcyBhY2Nlc3MKK3Jlc3RyaWN0aW9ucyBpbiBzb21lIGNvbmZpZ3VyYXRpb25zIHVzaW5nIG1lY2hhbmlzbXMgc3VjaCBhcworLkV2IExEX1BSRUxPQUQgLgorLkl0IENtIFBpZEZpbGUKK1NwZWNpZmllcyB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBwcm9jZXNzIElEIG9mIHRoZQorU1NIIGRhZW1vbi4KK1RoZSBkZWZhdWx0IGlzCisuUGEgL3Zhci9ydW4vc3NoZC5waWQgLgorLkl0IENtIFBvcnQKK1NwZWNpZmllcyB0aGUgcG9ydCBudW1iZXIgdGhhdAorLlhyIHNzaGQgOAorbGlzdGVucyBvbi4KK1RoZSBkZWZhdWx0IGlzIDIyLgorTXVsdGlwbGUgb3B0aW9ucyBvZiB0aGlzIHR5cGUgYXJlIHBlcm1pdHRlZC4KK1NlZSBhbHNvCisuQ20gTGlzdGVuQWRkcmVzcyAuCisuSXQgQ20gUHJpbnRMYXN0TG9nCitTcGVjaWZpZXMgd2hldGhlcgorLlhyIHNzaGQgOAorc2hvdWxkIHByaW50IHRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBsYXN0IHVzZXIgbG9naW4gd2hlbiBhIHVzZXIgbG9ncworaW4gaW50ZXJhY3RpdmVseS4KK1RoZSBkZWZhdWx0IGlzCisuRHEgeWVzIC4KKy5JdCBDbSBQcmludE1vdGQKK1NwZWNpZmllcyB3aGV0aGVyCisuWHIgc3NoZCA4CitzaG91bGQgcHJpbnQKKy5QYSAvZXRjL21vdGQKK3doZW4gYSB1c2VyIGxvZ3MgaW4gaW50ZXJhY3RpdmVseS4KKyhPbiBzb21lIHN5c3RlbXMgaXQgaXMgYWxzbyBwcmludGVkIGJ5IHRoZSBzaGVsbCwKKy5QYSAvZXRjL3Byb2ZpbGUgLAorb3IgZXF1aXZhbGVudC4pCitUaGUgZGVmYXVsdCBpcworLkRxIHllcyAuCisuSXQgQ20gUHJvdG9jb2wKK1NwZWNpZmllcyB0aGUgcHJvdG9jb2wgdmVyc2lvbnMKKy5YciBzc2hkIDgKK3N1cHBvcnRzLgorVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmUKKy5TcSAxCithbmQKKy5TcSAyIC4KK011bHRpcGxlIHZlcnNpb25zIG11c3QgYmUgY29tbWEtc2VwYXJhdGVkLgorVGhlIGRlZmF1bHQgaXMKKy5TcSAyIC4KK05vdGUgdGhhdCB0aGUgb3JkZXIgb2YgdGhlIHByb3RvY29sIGxpc3QgZG9lcyBub3QgaW5kaWNhdGUgcHJlZmVyZW5jZSwKK2JlY2F1c2UgdGhlIGNsaWVudCBzZWxlY3RzIGFtb25nIG11bHRpcGxlIHByb3RvY29sIHZlcnNpb25zIG9mZmVyZWQKK2J5IHRoZSBzZXJ2ZXIuCitTcGVjaWZ5aW5nCisuRHEgMiwxCitpcyBpZGVudGljYWwgdG8KKy5EcSAxLDIgLgorLkl0IENtIFB1YmtleUF1dGhlbnRpY2F0aW9uCitTcGVjaWZpZXMgd2hldGhlciBwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uIGlzIGFsbG93ZWQuCitUaGUgZGVmYXVsdCBpcworLkRxIHllcyAuCitOb3RlIHRoYXQgdGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDIgb25seS4KKy5JdCBDbSBSZXZva2VkS2V5cworU3BlY2lmaWVzIGEgbGlzdCBvZiByZXZva2VkIHB1YmxpYyBrZXlzLgorS2V5cyBsaXN0ZWQgaW4gdGhpcyBmaWxlIHdpbGwgYmUgcmVmdXNlZCBmb3IgcHVibGljIGtleSBhdXRoZW50aWNhdGlvbi4KK05vdGUgdGhhdCBpZiB0aGlzIGZpbGUgaXMgbm90IHJlYWRhYmxlLCB0aGVuIHB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24gd2lsbAorYmUgcmVmdXNlZCBmb3IgYWxsIHVzZXJzLgorLkl0IENtIFJob3N0c1JTQUF1dGhlbnRpY2F0aW9uCitTcGVjaWZpZXMgd2hldGhlciByaG9zdHMgb3IgL2V0Yy9ob3N0cy5lcXVpdiBhdXRoZW50aWNhdGlvbiB0b2dldGhlcgord2l0aCBzdWNjZXNzZnVsIFJTQSBob3N0IGF1dGhlbnRpY2F0aW9uIGlzIGFsbG93ZWQuCitUaGUgZGVmYXVsdCBpcworLkRxIG5vIC4KK1RoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAxIG9ubHkuCisuSXQgQ20gUlNBQXV0aGVudGljYXRpb24KK1NwZWNpZmllcyB3aGV0aGVyIHB1cmUgUlNBIGF1dGhlbnRpY2F0aW9uIGlzIGFsbG93ZWQuCitUaGUgZGVmYXVsdCBpcworLkRxIHllcyAuCitUaGlzIG9wdGlvbiBhcHBsaWVzIHRvIHByb3RvY29sIHZlcnNpb24gMSBvbmx5LgorLkl0IENtIFNlcnZlcktleUJpdHMKK0RlZmluZXMgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBlcGhlbWVyYWwgcHJvdG9jb2wgdmVyc2lvbiAxIHNlcnZlciBrZXkuCitUaGUgbWluaW11bSB2YWx1ZSBpcyA1MTIsIGFuZCB0aGUgZGVmYXVsdCBpcyAxMDI0LgorLkl0IENtIFN0cmljdE1vZGVzCitTcGVjaWZpZXMgd2hldGhlcgorLlhyIHNzaGQgOAorc2hvdWxkIGNoZWNrIGZpbGUgbW9kZXMgYW5kIG93bmVyc2hpcCBvZiB0aGUKK3VzZXIncyBmaWxlcyBhbmQgaG9tZSBkaXJlY3RvcnkgYmVmb3JlIGFjY2VwdGluZyBsb2dpbi4KK1RoaXMgaXMgbm9ybWFsbHkgZGVzaXJhYmxlIGJlY2F1c2Ugbm92aWNlcyBzb21ldGltZXMgYWNjaWRlbnRhbGx5IGxlYXZlIHRoZWlyCitkaXJlY3Rvcnkgb3IgZmlsZXMgd29ybGQtd3JpdGFibGUuCitUaGUgZGVmYXVsdCBpcworLkRxIHllcyAuCitOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhcHBseSB0bworLkNtIENocm9vdERpcmVjdG9yeSAsCit3aG9zZSBwZXJtaXNzaW9ucyBhbmQgb3duZXJzaGlwIGFyZSBjaGVja2VkIHVuY29uZGl0aW9uYWxseS4KKy5JdCBDbSBTdWJzeXN0ZW0KK0NvbmZpZ3VyZXMgYW4gZXh0ZXJuYWwgc3Vic3lzdGVtIChlLmcuIGZpbGUgdHJhbnNmZXIgZGFlbW9uKS4KK0FyZ3VtZW50cyBzaG91bGQgYmUgYSBzdWJzeXN0ZW0gbmFtZSBhbmQgYSBjb21tYW5kICh3aXRoIG9wdGlvbmFsIGFyZ3VtZW50cykKK3RvIGV4ZWN1dGUgdXBvbiBzdWJzeXN0ZW0gcmVxdWVzdC4KKy5QcAorVGhlIGNvbW1hbmQKKy5YciBzZnRwLXNlcnZlciA4CitpbXBsZW1lbnRzIHRoZQorLkRxIHNmdHAKK2ZpbGUgdHJhbnNmZXIgc3Vic3lzdGVtLgorLlBwCitBbHRlcm5hdGVseSB0aGUgbmFtZQorLkRxIGludGVybmFsLXNmdHAKK2ltcGxlbWVudHMgYW4gaW4tcHJvY2VzcworLkRxIHNmdHAKK3NlcnZlci4KK1RoaXMgbWF5IHNpbXBsaWZ5IGNvbmZpZ3VyYXRpb25zIHVzaW5nCisuQ20gQ2hyb290RGlyZWN0b3J5Cit0byBmb3JjZSBhIGRpZmZlcmVudCBmaWxlc3lzdGVtIHJvb3Qgb24gY2xpZW50cy4KKy5QcAorQnkgZGVmYXVsdCBubyBzdWJzeXN0ZW1zIGFyZSBkZWZpbmVkLgorTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAyIG9ubHkuCisuSXQgQ20gU3lzbG9nRmFjaWxpdHkKK0dpdmVzIHRoZSBmYWNpbGl0eSBjb2RlIHRoYXQgaXMgdXNlZCB3aGVuIGxvZ2dpbmcgbWVzc2FnZXMgZnJvbQorLlhyIHNzaGQgOCAuCitUaGUgcG9zc2libGUgdmFsdWVzIGFyZTogREFFTU9OLCBVU0VSLCBBVVRILCBMT0NBTDAsIExPQ0FMMSwgTE9DQUwyLAorTE9DQUwzLCBMT0NBTDQsIExPQ0FMNSwgTE9DQUw2LCBMT0NBTDcuCitUaGUgZGVmYXVsdCBpcyBBVVRILgorLkl0IENtIFRDUEtlZXBBbGl2ZQorU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHN5c3RlbSBzaG91bGQgc2VuZCBUQ1Aga2VlcGFsaXZlIG1lc3NhZ2VzIHRvIHRoZQorb3RoZXIgc2lkZS4KK0lmIHRoZXkgYXJlIHNlbnQsIGRlYXRoIG9mIHRoZSBjb25uZWN0aW9uIG9yIGNyYXNoIG9mIG9uZQorb2YgdGhlIG1hY2hpbmVzIHdpbGwgYmUgcHJvcGVybHkgbm90aWNlZC4KK0hvd2V2ZXIsIHRoaXMgbWVhbnMgdGhhdAorY29ubmVjdGlvbnMgd2lsbCBkaWUgaWYgdGhlIHJvdXRlIGlzIGRvd24gdGVtcG9yYXJpbHksIGFuZCBzb21lIHBlb3BsZQorZmluZCBpdCBhbm5veWluZy4KK09uIHRoZSBvdGhlciBoYW5kLCBpZiBUQ1Aga2VlcGFsaXZlcyBhcmUgbm90IHNlbnQsCitzZXNzaW9ucyBtYXkgaGFuZyBpbmRlZmluaXRlbHkgb24gdGhlIHNlcnZlciwgbGVhdmluZworLkRxIGdob3N0Cit1c2VycyBhbmQgY29uc3VtaW5nIHNlcnZlciByZXNvdXJjZXMuCisuUHAKK1RoZSBkZWZhdWx0IGlzCisuRHEgeWVzCisodG8gc2VuZCBUQ1Aga2VlcGFsaXZlIG1lc3NhZ2VzKSwgYW5kIHRoZSBzZXJ2ZXIgd2lsbCBub3RpY2UKK2lmIHRoZSBuZXR3b3JrIGdvZXMgZG93biBvciB0aGUgY2xpZW50IGhvc3QgY3Jhc2hlcy4KK1RoaXMgYXZvaWRzIGluZmluaXRlbHkgaGFuZ2luZyBzZXNzaW9ucy4KKy5QcAorVG8gZGlzYWJsZSBUQ1Aga2VlcGFsaXZlIG1lc3NhZ2VzLCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCB0bworLkRxIG5vIC4KKy5JdCBDbSBUcnVzdGVkVXNlckNBS2V5cworU3BlY2lmaWVzIGEgZmlsZSBjb250YWluaW5nIHB1YmxpYyBrZXlzIG9mIGNlcnRpZmljYXRlIGF1dGhvcml0aWVzIHRoYXQgYXJlCit0cnVzdGVkIHRvIHNpZ24gdXNlciBjZXJ0aWZpY2F0ZXMgZm9yIGF1dGhlbnRpY2F0aW9uLgorS2V5cyBhcmUgbGlzdGVkIG9uZSBwZXIgbGluZTsgZW1wdHkgbGluZXMgYW5kIGNvbW1lbnRzIHN0YXJ0aW5nIHdpdGgKKy5RbCAjCithcmUgYWxsb3dlZC4KK0lmIGEgY2VydGlmaWNhdGUgaXMgcHJlc2VudGVkIGZvciBhdXRoZW50aWNhdGlvbiBhbmQgaGFzIGl0cyBzaWduaW5nIENBIGtleQorbGlzdGVkIGluIHRoaXMgZmlsZSwgdGhlbiBpdCBtYXkgYmUgdXNlZCBmb3IgYXV0aGVudGljYXRpb24gZm9yIGFueSB1c2VyCitsaXN0ZWQgaW4gdGhlIGNlcnRpZmljYXRlJ3MgcHJpbmNpcGFscyBsaXN0LgorTm90ZSB0aGF0IGNlcnRpZmljYXRlcyB0aGF0IGxhY2sgYSBsaXN0IG9mIHByaW5jaXBhbHMgd2lsbCBub3QgYmUgcGVybWl0dGVkCitmb3IgYXV0aGVudGljYXRpb24gdXNpbmcKKy5DbSBUcnVzdGVkVXNlckNBS2V5cyAuCitGb3IgbW9yZSBkZXRhaWxzIG9uIGNlcnRpZmljYXRlcywgc2VlIHRoZQorLlN4IENFUlRJRklDQVRFUworc2VjdGlvbiBpbgorLlhyIHNzaC1rZXlnZW4gMSAuCisuSXQgQ20gVXNlRE5TCitTcGVjaWZpZXMgd2hldGhlcgorLlhyIHNzaGQgOAorc2hvdWxkIGxvb2sgdXAgdGhlIHJlbW90ZSBob3N0IG5hbWUgYW5kIGNoZWNrIHRoYXQKK3RoZSByZXNvbHZlZCBob3N0IG5hbWUgZm9yIHRoZSByZW1vdGUgSVAgYWRkcmVzcyBtYXBzIGJhY2sgdG8gdGhlCit2ZXJ5IHNhbWUgSVAgYWRkcmVzcy4KK1RoZSBkZWZhdWx0IGlzCisuRHEgeWVzIC4KKy5JdCBDbSBVc2VMb2dpbgorU3BlY2lmaWVzIHdoZXRoZXIKKy5YciBsb2dpbiAxCitpcyB1c2VkIGZvciBpbnRlcmFjdGl2ZSBsb2dpbiBzZXNzaW9ucy4KK1RoZSBkZWZhdWx0IGlzCisuRHEgbm8gLgorTm90ZSB0aGF0CisuWHIgbG9naW4gMQoraXMgbmV2ZXIgdXNlZCBmb3IgcmVtb3RlIGNvbW1hbmQgZXhlY3V0aW9uLgorTm90ZSBhbHNvLCB0aGF0IGlmIHRoaXMgaXMgZW5hYmxlZCwKKy5DbSBYMTFGb3J3YXJkaW5nCit3aWxsIGJlIGRpc2FibGVkIGJlY2F1c2UKKy5YciBsb2dpbiAxCitkb2VzIG5vdCBrbm93IGhvdyB0byBoYW5kbGUKKy5YciB4YXV0aCAxCitjb29raWVzLgorSWYKKy5DbSBVc2VQcml2aWxlZ2VTZXBhcmF0aW9uCitpcyBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgZGlzYWJsZWQgYWZ0ZXIgYXV0aGVudGljYXRpb24uCisuSXQgQ20gVXNlUEFNCitFbmFibGVzIHRoZSBQbHVnZ2FibGUgQXV0aGVudGljYXRpb24gTW9kdWxlIGludGVyZmFjZS4KK0lmIHNldCB0bworLkRxIHllcwordGhpcyB3aWxsIGVuYWJsZSBQQU0gYXV0aGVudGljYXRpb24gdXNpbmcKKy5DbSBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uCithbmQKKy5DbSBQYXNzd29yZEF1dGhlbnRpY2F0aW9uCitpbiBhZGRpdGlvbiB0byBQQU0gYWNjb3VudCBhbmQgc2Vzc2lvbiBtb2R1bGUgcHJvY2Vzc2luZyBmb3IgYWxsCithdXRoZW50aWNhdGlvbiB0eXBlcy4KKy5QcAorQmVjYXVzZSBQQU0gY2hhbGxlbmdlLXJlc3BvbnNlIGF1dGhlbnRpY2F0aW9uIHVzdWFsbHkgc2VydmVzIGFuIGVxdWl2YWxlbnQKK3JvbGUgdG8gcGFzc3dvcmQgYXV0aGVudGljYXRpb24sIHlvdSBzaG91bGQgZGlzYWJsZSBlaXRoZXIKKy5DbSBQYXNzd29yZEF1dGhlbnRpY2F0aW9uCitvcgorLkNtIENoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24uCisuUHAKK0lmCisuQ20gVXNlUEFNCitpcyBlbmFibGVkLCB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBydW4KKy5YciBzc2hkIDgKK2FzIGEgbm9uLXJvb3QgdXNlci4KK1RoZSBkZWZhdWx0IGlzCisuRHEgbm8gLgorLkl0IENtIFVzZVByaXZpbGVnZVNlcGFyYXRpb24KK1NwZWNpZmllcyB3aGV0aGVyCisuWHIgc3NoZCA4CitzZXBhcmF0ZXMgcHJpdmlsZWdlcyBieSBjcmVhdGluZyBhbiB1bnByaXZpbGVnZWQgY2hpbGQgcHJvY2VzcwordG8gZGVhbCB3aXRoIGluY29taW5nIG5ldHdvcmsgdHJhZmZpYy4KK0FmdGVyIHN1Y2Nlc3NmdWwgYXV0aGVudGljYXRpb24sIGFub3RoZXIgcHJvY2VzcyB3aWxsIGJlIGNyZWF0ZWQgdGhhdCBoYXMKK3RoZSBwcml2aWxlZ2Ugb2YgdGhlIGF1dGhlbnRpY2F0ZWQgdXNlci4KK1RoZSBnb2FsIG9mIHByaXZpbGVnZSBzZXBhcmF0aW9uIGlzIHRvIHByZXZlbnQgcHJpdmlsZWdlCitlc2NhbGF0aW9uIGJ5IGNvbnRhaW5pbmcgYW55IGNvcnJ1cHRpb24gd2l0aGluIHRoZSB1bnByaXZpbGVnZWQgcHJvY2Vzc2VzLgorVGhlIGRlZmF1bHQgaXMKKy5EcSB5ZXMgLgorSWYKKy5DbSBVc2VQcml2aWxlZ2VTZXBhcmF0aW9uCitpcyBzZXQgdG8KKy5EcSBzYW5kYm94Cit0aGVuIHRoZSBwcmUtYXV0aGVudGljYXRpb24gdW5wcml2aWxlZ2VkIHByb2Nlc3MgaXMgc3ViamVjdCB0byBhZGRpdGlvbmFsCityZXN0cmljdGlvbnMuCisuSXQgQ20gWDExRGlzcGxheU9mZnNldAorU3BlY2lmaWVzIHRoZSBmaXJzdCBkaXNwbGF5IG51bWJlciBhdmFpbGFibGUgZm9yCisuWHIgc3NoZCA4IE5zICdzCitYMTEgZm9yd2FyZGluZy4KK1RoaXMgcHJldmVudHMgc3NoZCBmcm9tIGludGVyZmVyaW5nIHdpdGggcmVhbCBYMTEgc2VydmVycy4KK1RoZSBkZWZhdWx0IGlzIDEwLgorLkl0IENtIFgxMUZvcndhcmRpbmcKK1NwZWNpZmllcyB3aGV0aGVyIFgxMSBmb3J3YXJkaW5nIGlzIHBlcm1pdHRlZC4KK1RoZSBhcmd1bWVudCBtdXN0IGJlCisuRHEgeWVzCitvcgorLkRxIG5vIC4KK1RoZSBkZWZhdWx0IGlzCisuRHEgbm8gLgorLlBwCitXaGVuIFgxMSBmb3J3YXJkaW5nIGlzIGVuYWJsZWQsIHRoZXJlIG1heSBiZSBhZGRpdGlvbmFsIGV4cG9zdXJlIHRvCit0aGUgc2VydmVyIGFuZCB0byBjbGllbnQgZGlzcGxheXMgaWYgdGhlCisuWHIgc3NoZCA4Citwcm94eSBkaXNwbGF5IGlzIGNvbmZpZ3VyZWQgdG8gbGlzdGVuIG9uIHRoZSB3aWxkY2FyZCBhZGRyZXNzIChzZWUKKy5DbSBYMTFVc2VMb2NhbGhvc3QKK2JlbG93KSwgdGhvdWdoIHRoaXMgaXMgbm90IHRoZSBkZWZhdWx0LgorQWRkaXRpb25hbGx5LCB0aGUgYXV0aGVudGljYXRpb24gc3Bvb2ZpbmcgYW5kIGF1dGhlbnRpY2F0aW9uIGRhdGEKK3ZlcmlmaWNhdGlvbiBhbmQgc3Vic3RpdHV0aW9uIG9jY3VyIG9uIHRoZSBjbGllbnQgc2lkZS4KK1RoZSBzZWN1cml0eSByaXNrIG9mIHVzaW5nIFgxMSBmb3J3YXJkaW5nIGlzIHRoYXQgdGhlIGNsaWVudCdzIFgxMQorZGlzcGxheSBzZXJ2ZXIgbWF5IGJlIGV4cG9zZWQgdG8gYXR0YWNrIHdoZW4gdGhlIFNTSCBjbGllbnQgcmVxdWVzdHMKK2ZvcndhcmRpbmcgKHNlZSB0aGUgd2FybmluZ3MgZm9yCisuQ20gRm9yd2FyZFgxMQoraW4KKy5YciBzc2hfY29uZmlnIDUgKSAuCitBIHN5c3RlbSBhZG1pbmlzdHJhdG9yIG1heSBoYXZlIGEgc3RhbmNlIGluIHdoaWNoIHRoZXkgd2FudCB0bworcHJvdGVjdCBjbGllbnRzIHRoYXQgbWF5IGV4cG9zZSB0aGVtc2VsdmVzIHRvIGF0dGFjayBieSB1bndpdHRpbmdseQorcmVxdWVzdGluZyBYMTEgZm9yd2FyZGluZywgd2hpY2ggY2FuIHdhcnJhbnQgYQorLkRxIG5vCitzZXR0aW5nLgorLlBwCitOb3RlIHRoYXQgZGlzYWJsaW5nIFgxMSBmb3J3YXJkaW5nIGRvZXMgbm90IHByZXZlbnQgdXNlcnMgZnJvbQorZm9yd2FyZGluZyBYMTEgdHJhZmZpYywgYXMgdXNlcnMgY2FuIGFsd2F5cyBpbnN0YWxsIHRoZWlyIG93biBmb3J3YXJkZXJzLgorWDExIGZvcndhcmRpbmcgaXMgYXV0b21hdGljYWxseSBkaXNhYmxlZCBpZgorLkNtIFVzZUxvZ2luCitpcyBlbmFibGVkLgorLkl0IENtIFgxMVVzZUxvY2FsaG9zdAorU3BlY2lmaWVzIHdoZXRoZXIKKy5YciBzc2hkIDgKK3Nob3VsZCBiaW5kIHRoZSBYMTEgZm9yd2FyZGluZyBzZXJ2ZXIgdG8gdGhlIGxvb3BiYWNrIGFkZHJlc3Mgb3IgdG8KK3RoZSB3aWxkY2FyZCBhZGRyZXNzLgorQnkgZGVmYXVsdCwKK3NzaGQgYmluZHMgdGhlIGZvcndhcmRpbmcgc2VydmVyIHRvIHRoZSBsb29wYmFjayBhZGRyZXNzIGFuZCBzZXRzIHRoZQoraG9zdG5hbWUgcGFydCBvZiB0aGUKKy5FdiBESVNQTEFZCitlbnZpcm9ubWVudCB2YXJpYWJsZSB0bworLkRxIGxvY2FsaG9zdCAuCitUaGlzIHByZXZlbnRzIHJlbW90ZSBob3N0cyBmcm9tIGNvbm5lY3RpbmcgdG8gdGhlIHByb3h5IGRpc3BsYXkuCitIb3dldmVyLCBzb21lIG9sZGVyIFgxMSBjbGllbnRzIG1heSBub3QgZnVuY3Rpb24gd2l0aCB0aGlzCitjb25maWd1cmF0aW9uLgorLkNtIFgxMVVzZUxvY2FsaG9zdAorbWF5IGJlIHNldCB0bworLkRxIG5vCit0byBzcGVjaWZ5IHRoYXQgdGhlIGZvcndhcmRpbmcgc2VydmVyIHNob3VsZCBiZSBib3VuZCB0byB0aGUgd2lsZGNhcmQKK2FkZHJlc3MuCitUaGUgYXJndW1lbnQgbXVzdCBiZQorLkRxIHllcworb3IKKy5EcSBubyAuCitUaGUgZGVmYXVsdCBpcworLkRxIHllcyAuCisuSXQgQ20gWEF1dGhMb2NhdGlvbgorU3BlY2lmaWVzIHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZQorLlhyIHhhdXRoIDEKK3Byb2dyYW0uCitUaGUgZGVmYXVsdCBpcworLlBhIC91c3IvWDExUjYvYmluL3hhdXRoIC4KKy5FbAorLlNoIFRJTUUgRk9STUFUUworLlhyIHNzaGQgOAorY29tbWFuZC1saW5lIGFyZ3VtZW50cyBhbmQgY29uZmlndXJhdGlvbiBmaWxlIG9wdGlvbnMgdGhhdCBzcGVjaWZ5IHRpbWUKK21heSBiZSBleHByZXNzZWQgdXNpbmcgYSBzZXF1ZW5jZSBvZiB0aGUgZm9ybToKKy5TbSBvZmYKKy5BciB0aW1lIE9wIEFyIHF1YWxpZmllciAsCisuU20gb24KK3doZXJlCisuQXIgdGltZQoraXMgYSBwb3NpdGl2ZSBpbnRlZ2VyIHZhbHVlIGFuZAorLkFyIHF1YWxpZmllcgoraXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisuUHAKKy5CbCAtdGFnIC13aWR0aCBEcyAtY29tcGFjdCAtb2Zmc2V0IGluZGVudAorLkl0IEFxIENtIG5vbmUKK3NlY29uZHMKKy5JdCBDbSBzIHwgQ20gUworc2Vjb25kcworLkl0IENtIG0gfCBDbSBNCittaW51dGVzCisuSXQgQ20gaCB8IENtIEgKK2hvdXJzCisuSXQgQ20gZCB8IENtIEQKK2RheXMKKy5JdCBDbSB3IHwgQ20gVword2Vla3MKKy5FbAorLlBwCitFYWNoIG1lbWJlciBvZiB0aGUgc2VxdWVuY2UgaXMgYWRkZWQgdG9nZXRoZXIgdG8gY2FsY3VsYXRlCit0aGUgdG90YWwgdGltZSB2YWx1ZS4KKy5QcAorVGltZSBmb3JtYXQgZXhhbXBsZXM6CisuUHAKKy5CbCAtdGFnIC13aWR0aCBEcyAtY29tcGFjdCAtb2Zmc2V0IGluZGVudAorLkl0IDYwMAorNjAwIHNlY29uZHMgKDEwIG1pbnV0ZXMpCisuSXQgMTBtCisxMCBtaW51dGVzCisuSXQgMWgzMG0KKzEgaG91ciAzMCBtaW51dGVzICg5MCBtaW51dGVzKQorLkVsCisuU2ggRklMRVMKKy5CbCAtdGFnIC13aWR0aCBEcworLkl0IFBhIC9ldGMvc3NoL3NzaGRfY29uZmlnCitDb250YWlucyBjb25maWd1cmF0aW9uIGRhdGEgZm9yCisuWHIgc3NoZCA4IC4KK1RoaXMgZmlsZSBzaG91bGQgYmUgd3JpdGFibGUgYnkgcm9vdCBvbmx5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQKKyh0aG91Z2ggbm90IG5lY2Vzc2FyeSkgdGhhdCBpdCBiZSB3b3JsZC1yZWFkYWJsZS4KKy5FbAorLlNoIFNFRSBBTFNPCisuWHIgc3NoZCA4CisuU2ggQVVUSE9SUworT3BlblNTSCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGFuZCBmcmVlCitzc2ggMS4yLjEyIHJlbGVhc2UgYnkgVGF0dSBZbG9uZW4uCitBYXJvbiBDYW1wYmVsbCwgQm9iIEJlY2ssIE1hcmt1cyBGcmllZGwsIE5pZWxzIFByb3ZvcywKK1RoZW8gZGUgUmFhZHQgYW5kIER1ZyBTb25nCityZW1vdmVkIG1hbnkgYnVncywgcmUtYWRkZWQgbmV3ZXIgZmVhdHVyZXMgYW5kCitjcmVhdGVkIE9wZW5TU0guCitNYXJrdXMgRnJpZWRsIGNvbnRyaWJ1dGVkIHRoZSBzdXBwb3J0IGZvciBTU0gKK3Byb3RvY29sIHZlcnNpb25zIDEuNSBhbmQgMi4wLgorTmllbHMgUHJvdm9zIGFuZCBNYXJrdXMgRnJpZWRsIGNvbnRyaWJ1dGVkIHN1cHBvcnQKK2ZvciBwcml2aWxlZ2Ugc2VwYXJhdGlvbi4KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc3NobG9naW4uYyBiL29wZW5zc2gtNi4wcDEvc3NobG9naW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDYyOWY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zc2hsb2dpbi5jCkBAIC0wLDAgKzEsMTYzIEBACisvKiAkT3BlbkJTRDogc3NobG9naW4uYyx2IDEuMjcgMjAxMS8wMS8xMSAwNjowNjowOSBkam0gRXhwICQgKi8KKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiBUaGlzIGZpbGUgcGVyZm9ybXMgc29tZSBvZiB0aGUgdGhpbmdzIGxvZ2luKDEpIG5vcm1hbGx5IGRvZXMuICBXZSBjYW5ub3QKKyAqIGVhc2lseSB1c2Ugc29tZXRoaW5nIGxpa2UgbG9naW4gLXAgLWggaG9zdCAtZiB1c2VyLCBiZWNhdXNlIHRoZXJlIGFyZQorICogc2V2ZXJhbCBkaWZmZXJlbnQgbG9naW5zIGFyb3VuZCwgYW5kIGl0IGlzIGhhcmQgdG8gZGV0ZXJtaW5lZCB3aGF0IGtpbmQgb2YKKyAqIGxvZ2luIHRoZSBjdXJyZW50IHN5c3RlbSBoYXMuICBBbHNvLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gZXhlY3V0ZSBjb21tYW5kcworICogb24gYSB0dHkuCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlbyBkZSBSYWFkdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAibG9naW5yZWMuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJzZXJ2Y29uZi5oIgorCitleHRlcm4gQnVmZmVyIGxvZ2lubXNnOworZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKKworLyoKKyAqIFJldHVybnMgdGhlIHRpbWUgd2hlbiB0aGUgdXNlciBsYXN0IGxvZ2dlZCBpbi4gIFJldHVybnMgMCBpZiB0aGUKKyAqIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuICBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSByZWNvcmRfbG9naW4uCisgKiBUaGUgaG9zdCB0aGUgdXNlciBsb2dnZWQgaW4gZnJvbSB3aWxsIGJlIHJldHVybmVkIGluIGJ1Zi4KKyAqLwordGltZV90CitnZXRfbGFzdF9sb2dpbl90aW1lKHVpZF90IHVpZCwgY29uc3QgY2hhciAqbG9nbmFtZSwKKyAgICBjaGFyICpidWYsIHNpemVfdCBidWZzaXplKQoreworCXN0cnVjdCBsb2dpbmluZm8gbGk7CisKKwlsb2dpbl9nZXRfbGFzdGxvZygmbGksIHVpZCk7CisJc3RybGNweShidWYsIGxpLmhvc3RuYW1lLCBidWZzaXplKTsKKwlyZXR1cm4gKHRpbWVfdClsaS50dl9zZWM7Cit9CisKKy8qCisgKiBHZW5lcmF0ZSBhbmQgc3RvcmUgbGFzdCBsb2dpbiBtZXNzYWdlLiAgVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlCisgKiBsb2dpbl9sb2dpbigpIGlzIGNhbGxlZCBhbmQgbGFzdGxvZyBpcyB1cGRhdGVkLgorICovCitzdGF0aWMgdm9pZAorc3RvcmVfbGFzdGxvZ19tZXNzYWdlKGNvbnN0IGNoYXIgKnVzZXIsIHVpZF90IHVpZCkKK3sKKyNpZm5kZWYgTk9fU1NIX0xBU1RMT0cKKwljaGFyICp0aW1lX3N0cmluZywgaG9zdG5hbWVbTUFYSE9TVE5BTUVMRU5dID0gIiIsIGJ1Zls1MTJdOworCXRpbWVfdCBsYXN0X2xvZ2luX3RpbWU7CisKKwlpZiAoIW9wdGlvbnMucHJpbnRfbGFzdGxvZykKKwkJcmV0dXJuOworCisjIGlmZGVmIENVU1RPTV9TWVNfQVVUSF9HRVRfTEFTVExPR0lOX01TRworCXRpbWVfc3RyaW5nID0gc3lzX2F1dGhfZ2V0X2xhc3Rsb2dpbl9tc2codXNlciwgdWlkKTsKKwlpZiAodGltZV9zdHJpbmcgIT0gTlVMTCkgeworCQlidWZmZXJfYXBwZW5kKCZsb2dpbm1zZywgdGltZV9zdHJpbmcsIHN0cmxlbih0aW1lX3N0cmluZykpOworCQl4ZnJlZSh0aW1lX3N0cmluZyk7CisJfQorIyBlbHNlCisJbGFzdF9sb2dpbl90aW1lID0gZ2V0X2xhc3RfbG9naW5fdGltZSh1aWQsIHVzZXIsIGhvc3RuYW1lLAorCSAgICBzaXplb2YoaG9zdG5hbWUpKTsKKworCWlmIChsYXN0X2xvZ2luX3RpbWUgIT0gMCkgeworCQl0aW1lX3N0cmluZyA9IGN0aW1lKCZsYXN0X2xvZ2luX3RpbWUpOworCQl0aW1lX3N0cmluZ1tzdHJjc3BuKHRpbWVfc3RyaW5nLCAiXG4iKV0gPSAnXDAnOworCQlpZiAoc3RyY21wKGhvc3RuYW1lLCAiIikgPT0gMCkKKwkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJMYXN0IGxvZ2luOiAlc1xyXG4iLAorCQkJICAgIHRpbWVfc3RyaW5nKTsKKwkJZWxzZQorCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkxhc3QgbG9naW46ICVzIGZyb20gJXNcclxuIiwKKwkJCSAgICB0aW1lX3N0cmluZywgaG9zdG5hbWUpOworCQlidWZmZXJfYXBwZW5kKCZsb2dpbm1zZywgYnVmLCBzdHJsZW4oYnVmKSk7CisJfQorIyBlbmRpZiAvKiBDVVNUT01fU1lTX0FVVEhfR0VUX0xBU1RMT0dJTl9NU0cgKi8KKyNlbmRpZiAvKiBOT19TU0hfTEFTVExPRyAqLworfQorCisvKgorICogUmVjb3JkcyB0aGF0IHRoZSB1c2VyIGhhcyBsb2dnZWQgaW4uICBJIHdpc2ggdGhlc2UgcGFydHMgb2Ygb3BlcmF0aW5nCisgKiBzeXN0ZW1zIHdlcmUgbW9yZSBzdGFuZGFyZGl6ZWQuCisgKi8KK3ZvaWQKK3JlY29yZF9sb2dpbihwaWRfdCBwaWQsIGNvbnN0IGNoYXIgKnR0eSwgY29uc3QgY2hhciAqdXNlciwgdWlkX3QgdWlkLAorICAgIGNvbnN0IGNoYXIgKmhvc3QsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgc29ja2xlbl90IGFkZHJsZW4pCit7CisJc3RydWN0IGxvZ2luaW5mbyAqbGk7CisKKwkvKiBzYXZlIHByZXZpb3VzIGxvZ2luIGRldGFpbHMgYmVmb3JlIHdyaXRpbmcgbmV3ICovCisJc3RvcmVfbGFzdGxvZ19tZXNzYWdlKHVzZXIsIHVpZCk7CisKKwlsaSA9IGxvZ2luX2FsbG9jX2VudHJ5KHBpZCwgdXNlciwgaG9zdCwgdHR5KTsKKwlsb2dpbl9zZXRfYWRkcihsaSwgYWRkciwgYWRkcmxlbik7CisJbG9naW5fbG9naW4obGkpOworCWxvZ2luX2ZyZWVfZW50cnkobGkpOworfQorCisjaWZkZWYgTE9HSU5fTkVFRFNfVVRNUFgKK3ZvaWQKK3JlY29yZF91dG1wX29ubHkocGlkX3QgcGlkLCBjb25zdCBjaGFyICp0dHluYW1lLCBjb25zdCBjaGFyICp1c2VyLAorCQkgY29uc3QgY2hhciAqaG9zdCwgc3RydWN0IHNvY2thZGRyICphZGRyLCBzb2NrbGVuX3QgYWRkcmxlbikKK3sKKwlzdHJ1Y3QgbG9naW5pbmZvICpsaTsKKworCWxpID0gbG9naW5fYWxsb2NfZW50cnkocGlkLCB1c2VyLCBob3N0LCB0dHluYW1lKTsKKwlsb2dpbl9zZXRfYWRkcihsaSwgYWRkciwgYWRkcmxlbik7CisJbG9naW5fdXRtcF9vbmx5KGxpKTsKKwlsb2dpbl9mcmVlX2VudHJ5KGxpKTsKK30KKyNlbmRpZgorCisvKiBSZWNvcmRzIHRoYXQgdGhlIHVzZXIgaGFzIGxvZ2dlZCBvdXQuICovCit2b2lkCityZWNvcmRfbG9nb3V0KHBpZF90IHBpZCwgY29uc3QgY2hhciAqdHR5LCBjb25zdCBjaGFyICp1c2VyKQoreworCXN0cnVjdCBsb2dpbmluZm8gKmxpOworCisJbGkgPSBsb2dpbl9hbGxvY19lbnRyeShwaWQsIHVzZXIsIE5VTEwsIHR0eSk7CisJbG9naW5fbG9nb3V0KGxpKTsKKwlsb2dpbl9mcmVlX2VudHJ5KGxpKTsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc3NobG9naW4uaCBiL29wZW5zc2gtNi4wcDEvc3NobG9naW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDBkM2ZlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zc2hsb2dpbi5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qICRPcGVuQlNEOiBzc2hsb2dpbi5oLHYgMS44IDIwMDYvMDgvMDMgMDM6MzQ6NDIgZGVyYWFkdCBFeHAgJCAqLworCisvKgorICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCisgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKKyAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCisgKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCisgKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCisgKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCisgKi8KKwordm9pZAlyZWNvcmRfbG9naW4ocGlkX3QsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB1aWRfdCwKKyAgICBjb25zdCBjaGFyICosIHN0cnVjdCBzb2NrYWRkciAqLCBzb2NrbGVuX3QpOwordm9pZCAgIHJlY29yZF9sb2dvdXQocGlkX3QsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK3RpbWVfdAlnZXRfbGFzdF9sb2dpbl90aW1lKHVpZF90LCBjb25zdCBjaGFyICosIGNoYXIgKiwgdV9pbnQpOworCisjaWZkZWYgTE9HSU5fTkVFRFNfVVRNUFgKK3ZvaWQJcmVjb3JkX3V0bXBfb25seShwaWRfdCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKKwkJc3RydWN0IHNvY2thZGRyICosIHNvY2tsZW5fdCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc3NocHR5LmMgYi9vcGVuc3NoLTYuMHAxL3NzaHB0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYmMwZmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3NzaHB0eS5jCkBAIC0wLDAgKzEsMjU4IEBACisvKiAkT3BlbkJTRDogc3NocHR5LmMsdiAxLjI4IDIwMDcvMDkvMTEgMjM6NDk6MDkgc3RldmVzayBFeHAgJCAqLworLyoKKyAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAorICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIEFsbG9jYXRpbmcgYSBwc2V1ZG8tdGVybWluYWwsIGFuZCBtYWtpbmcgaXQgdGhlIGNvbnRyb2xsaW5nIHR0eS4KKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxncnAuaD4KKyNpZmRlZiBIQVZFX1BBVEhTX0gKKyMgaW5jbHVkZSA8cGF0aHMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpZmRlZiBIQVZFX1VUSUxfSAorIyBpbmNsdWRlIDx1dGlsLmg+CisjZW5kaWYKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgInNzaHB0eS5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKworI2lmZGVmIEhBVkVfUFRZX0gKKyMgaW5jbHVkZSA8cHR5Lmg+CisjZW5kaWYKKworI2lmbmRlZiBPX05PQ1RUWQorI2RlZmluZSBPX05PQ1RUWSAwCisjZW5kaWYKKworI2lmZGVmIF9fQVBQTEVfXworIyBpbmNsdWRlIDxBdmFpbGFiaWxpdHlNYWNyb3MuaD4KKyMgaWYgKE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQgPj0gTUFDX09TX1hfVkVSU0lPTl8xMF81KQorIyAgZGVmaW5lIF9fQVBQTEVfUFJJVlBUWV9fCisjIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIEFsbG9jYXRlcyBhbmQgb3BlbnMgYSBwdHkuICBSZXR1cm5zIDAgaWYgbm8gcHR5IGNvdWxkIGJlIGFsbG9jYXRlZCwgb3IKKyAqIG5vbnplcm8gaWYgYSBwdHkgd2FzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuICBPbiBzdWNjZXNzLCBvcGVuIGZpbGUKKyAqIGRlc2NyaXB0b3JzIGZvciB0aGUgcHR5IGFuZCB0dHkgc2lkZXMgYW5kIHRoZSBuYW1lIG9mIHRoZSB0dHkgc2lkZSBhcmUKKyAqIHJldHVybmVkICh0aGUgYnVmZmVyIG11c3QgYmUgYWJsZSB0byBob2xkIGF0IGxlYXN0IDY0IGNoYXJhY3RlcnMpLgorICovCisKK2ludAorcHR5X2FsbG9jYXRlKGludCAqcHR5ZmQsIGludCAqdHR5ZmQsIGNoYXIgKm5hbWVidWYsIHNpemVfdCBuYW1lYnVmbGVuKQoreworCS8qIG9wZW5wdHkoMykgZXhpc3RzIGluIE9TRi8xIGFuZCBzb21lIG90aGVyIG9zJ2VzICovCisJY2hhciAqbmFtZTsKKwlpbnQgaTsKKworCWkgPSBvcGVucHR5KHB0eWZkLCB0dHlmZCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKGkgPCAwKSB7CisJCWVycm9yKCJvcGVucHR5OiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gMDsKKwl9CisJbmFtZSA9IHR0eW5hbWUoKnR0eWZkKTsKKwlpZiAoIW5hbWUpCisJCWZhdGFsKCJvcGVucHR5IHJldHVybnMgZGV2aWNlIGZvciB3aGljaCB0dHluYW1lIGZhaWxzLiIpOworCisJc3RybGNweShuYW1lYnVmLCBuYW1lLCBuYW1lYnVmbGVuKTsJLyogcG9zc2libGUgdHJ1bmNhdGlvbiAqLworCXJldHVybiAxOworfQorCisvKiBSZWxlYXNlcyB0aGUgdHR5LiAgSXRzIG93bmVyc2hpcCBpcyByZXR1cm5lZCB0byByb290LCBhbmQgcGVybWlzc2lvbnMgdG8gMDY2Ni4gKi8KKwordm9pZAorcHR5X3JlbGVhc2UoY29uc3QgY2hhciAqdHR5KQoreworI2lmbmRlZiBfX0FQUExFX1BSSVZQVFlfXworCWlmIChjaG93bih0dHksICh1aWRfdCkgMCwgKGdpZF90KSAwKSA8IDApCisJCWVycm9yKCJjaG93biAlLjEwMHMgMCAwIGZhaWxlZDogJS4xMDBzIiwgdHR5LCBzdHJlcnJvcihlcnJubykpOworCWlmIChjaG1vZCh0dHksIChtb2RlX3QpIDA2NjYpIDwgMCkKKwkJZXJyb3IoImNobW9kICUuMTAwcyAwNjY2IGZhaWxlZDogJS4xMDBzIiwgdHR5LCBzdHJlcnJvcihlcnJubykpOworI2VuZGlmIC8qIF9fQVBQTEVfUFJJVlBUWV9fICovCit9CisKKy8qIE1ha2VzIHRoZSB0dHkgdGhlIHByb2Nlc3MncyBjb250cm9sbGluZyB0dHkgYW5kIHNldHMgaXQgdG8gc2FuZSBtb2Rlcy4gKi8KKwordm9pZAorcHR5X21ha2VfY29udHJvbGxpbmdfdHR5KGludCAqdHR5ZmQsIGNvbnN0IGNoYXIgKnR0eSkKK3sKKwlpbnQgZmQ7CisjaWZkZWYgVVNFX1ZIQU5HVVAKKwl2b2lkICpvbGQ7CisjZW5kaWYgLyogVVNFX1ZIQU5HVVAgKi8KKworI2lmZGVmIF9VTklDT1MKKwlpZiAoc2V0c2lkKCkgPCAwKQorCQllcnJvcigic2V0c2lkOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCisJZmQgPSBvcGVuKHR0eSwgT19SRFdSfE9fTk9DVFRZKTsKKwlpZiAoZmQgIT0gLTEpIHsKKwkJc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7CisJCWlvY3RsKGZkLCBUQ1ZIVVAsIChjaGFyICopTlVMTCk7CisJCXNpZ25hbChTSUdIVVAsIFNJR19ERkwpOworCQlzZXRwZ2lkKDAsIDApOworCQljbG9zZShmZCk7CisJfSBlbHNlIHsKKwkJZXJyb3IoIkZhaWxlZCB0byBkaXNjb25uZWN0IGZyb20gY29udHJvbGxpbmcgdHR5LiIpOworCX0KKworCWRlYnVnKCJTZXR0aW5nIGNvbnRyb2xsaW5nIHR0eSB1c2luZyBUQ1NFVENUVFkuIik7CisJaW9jdGwoKnR0eWZkLCBUQ1NFVENUVFksIE5VTEwpOworCWZkID0gb3BlbigiL2Rldi90dHkiLCBPX1JEV1IpOworCWlmIChmZCA8IDApCisJCWVycm9yKCIlLjEwMHM6ICUuMTAwcyIsIHR0eSwgc3RyZXJyb3IoZXJybm8pKTsKKwljbG9zZSgqdHR5ZmQpOworCSp0dHlmZCA9IGZkOworI2Vsc2UgLyogX1VOSUNPUyAqLworCisJLyogRmlyc3QgZGlzY29ubmVjdCBmcm9tIHRoZSBvbGQgY29udHJvbGxpbmcgdHR5LiAqLworI2lmZGVmIFRJT0NOT1RUWQorCWZkID0gb3BlbihfUEFUSF9UVFksIE9fUkRXUiB8IE9fTk9DVFRZKTsKKwlpZiAoZmQgPj0gMCkgeworCQkodm9pZCkgaW9jdGwoZmQsIFRJT0NOT1RUWSwgTlVMTCk7CisJCWNsb3NlKGZkKTsKKwl9CisjZW5kaWYgLyogVElPQ05PVFRZICovCisJaWYgKHNldHNpZCgpIDwgMCkKKwkJZXJyb3IoInNldHNpZDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKKworCS8qCisJICogVmVyaWZ5IHRoYXQgd2UgYXJlIHN1Y2Nlc3NmdWxseSBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY29udHJvbGxpbmcKKwkgKiB0dHkuCisJICovCisJZmQgPSBvcGVuKF9QQVRIX1RUWSwgT19SRFdSIHwgT19OT0NUVFkpOworCWlmIChmZCA+PSAwKSB7CisJCWVycm9yKCJGYWlsZWQgdG8gZGlzY29ubmVjdCBmcm9tIGNvbnRyb2xsaW5nIHR0eS4iKTsKKwkJY2xvc2UoZmQpOworCX0KKwkvKiBNYWtlIGl0IG91ciBjb250cm9sbGluZyB0dHkuICovCisjaWZkZWYgVElPQ1NDVFRZCisJZGVidWcoIlNldHRpbmcgY29udHJvbGxpbmcgdHR5IHVzaW5nIFRJT0NTQ1RUWS4iKTsKKwlpZiAoaW9jdGwoKnR0eWZkLCBUSU9DU0NUVFksIE5VTEwpIDwgMCkKKwkJZXJyb3IoImlvY3RsKFRJT0NTQ1RUWSk6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7CisjZW5kaWYgLyogVElPQ1NDVFRZICovCisjaWZkZWYgTkVFRF9TRVRQR1JQCisJaWYgKHNldHBncnAoMCwwKSA8IDApCisJCWVycm9yKCJTRVRQR1JQICVzIixzdHJlcnJvcihlcnJubykpOworI2VuZGlmIC8qIE5FRURfU0VUUEdSUCAqLworI2lmZGVmIFVTRV9WSEFOR1VQCisJb2xkID0gc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7CisJdmhhbmd1cCgpOworCXNpZ25hbChTSUdIVVAsIG9sZCk7CisjZW5kaWYgLyogVVNFX1ZIQU5HVVAgKi8KKwlmZCA9IG9wZW4odHR5LCBPX1JEV1IpOworCWlmIChmZCA8IDApIHsKKwkJZXJyb3IoIiUuMTAwczogJS4xMDBzIiwgdHR5LCBzdHJlcnJvcihlcnJubykpOworCX0gZWxzZSB7CisjaWZkZWYgVVNFX1ZIQU5HVVAKKwkJY2xvc2UoKnR0eWZkKTsKKwkJKnR0eWZkID0gZmQ7CisjZWxzZSAvKiBVU0VfVkhBTkdVUCAqLworCQljbG9zZShmZCk7CisjZW5kaWYgLyogVVNFX1ZIQU5HVVAgKi8KKwl9CisJLyogVmVyaWZ5IHRoYXQgd2Ugbm93IGhhdmUgYSBjb250cm9sbGluZyB0dHkuICovCisJZmQgPSBvcGVuKF9QQVRIX1RUWSwgT19XUk9OTFkpOworCWlmIChmZCA8IDApCisJCWVycm9yKCJvcGVuIC9kZXYvdHR5IGZhaWxlZCAtIGNvdWxkIG5vdCBzZXQgY29udHJvbGxpbmcgdHR5OiAlLjEwMHMiLAorCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwllbHNlCisJCWNsb3NlKGZkKTsKKyNlbmRpZiAvKiBfVU5JQ09TICovCit9CisKKy8qIENoYW5nZXMgdGhlIHdpbmRvdyBzaXplIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHR5LiAqLworCit2b2lkCitwdHlfY2hhbmdlX3dpbmRvd19zaXplKGludCBwdHlmZCwgdV9pbnQgcm93LCB1X2ludCBjb2wsCisJdV9pbnQgeHBpeGVsLCB1X2ludCB5cGl4ZWwpCit7CisJc3RydWN0IHdpbnNpemUgdzsKKworCS8qIG1heSB0cnVuY2F0ZSB1X2ludCAtPiB1X3Nob3J0ICovCisJdy53c19yb3cgPSByb3c7CisJdy53c19jb2wgPSBjb2w7CisJdy53c194cGl4ZWwgPSB4cGl4ZWw7CisJdy53c195cGl4ZWwgPSB5cGl4ZWw7CisJKHZvaWQpIGlvY3RsKHB0eWZkLCBUSU9DU1dJTlNaLCAmdyk7Cit9CisKK3ZvaWQKK3B0eV9zZXRvd25lcihzdHJ1Y3QgcGFzc3dkICpwdywgY29uc3QgY2hhciAqdHR5KQoreworCXN0cnVjdCBncm91cCAqZ3JwOworCWdpZF90IGdpZDsKKwltb2RlX3QgbW9kZTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCS8qIERldGVybWluZSB0aGUgZ3JvdXAgdG8gbWFrZSB0aGUgb3duZXIgb2YgdGhlIHR0eS4gKi8KKwlncnAgPSBnZXRncm5hbSgidHR5Iik7CisJaWYgKGdycCkgeworCQlnaWQgPSBncnAtPmdyX2dpZDsKKwkJbW9kZSA9IFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JV0dSUDsKKwl9IGVsc2UgeworCQlnaWQgPSBwdy0+cHdfZ2lkOworCQltb2RlID0gU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lXR1JQIHwgU19JV09USDsKKwl9CisKKwkvKgorCSAqIENoYW5nZSBvd25lciBhbmQgbW9kZSBvZiB0aGUgdHR5IGFzIHJlcXVpcmVkLgorCSAqIFdhcm4gYnV0IGNvbnRpbnVlIGlmIGZpbGVzeXN0ZW0gaXMgcmVhZC1vbmx5IGFuZCB0aGUgdWlkcyBtYXRjaC8KKwkgKiB0dHkgaXMgb3duZWQgYnkgcm9vdC4KKwkgKi8KKwlpZiAoc3RhdCh0dHksICZzdCkpCisJCWZhdGFsKCJzdGF0KCUuMTAwcykgZmFpbGVkOiAlLjEwMHMiLCB0dHksCisJCSAgICBzdHJlcnJvcihlcnJubykpOworCisjaWZkZWYgV0lUSF9TRUxJTlVYCisJc3NoX3NlbGludXhfc2V0dXBfcHR5KHB3LT5wd19uYW1lLCB0dHkpOworI2VuZGlmCisKKwlpZiAoc3Quc3RfdWlkICE9IHB3LT5wd191aWQgfHwgc3Quc3RfZ2lkICE9IGdpZCkgeworCQlpZiAoY2hvd24odHR5LCBwdy0+cHdfdWlkLCBnaWQpIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVST0ZTICYmCisJCQkgICAgKHN0LnN0X3VpZCA9PSBwdy0+cHdfdWlkIHx8IHN0LnN0X3VpZCA9PSAwKSkKKwkJCQlkZWJ1ZygiY2hvd24oJS4xMDBzLCAldSwgJXUpIGZhaWxlZDogJS4xMDBzIiwKKwkJCQkgICAgdHR5LCAodV9pbnQpcHctPnB3X3VpZCwgKHVfaW50KWdpZCwKKwkJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWVsc2UKKwkJCQlmYXRhbCgiY2hvd24oJS4xMDBzLCAldSwgJXUpIGZhaWxlZDogJS4xMDBzIiwKKwkJCQkgICAgdHR5LCAodV9pbnQpcHctPnB3X3VpZCwgKHVfaW50KWdpZCwKKwkJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCX0KKworCWlmICgoc3Quc3RfbW9kZSAmIChTX0lSV1hVfFNfSVJXWEd8U19JUldYTykpICE9IG1vZGUpIHsKKwkJaWYgKGNobW9kKHR0eSwgbW9kZSkgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRVJPRlMgJiYKKwkJCSAgICAoc3Quc3RfbW9kZSAmIChTX0lSR1JQIHwgU19JUk9USCkpID09IDApCisJCQkJZGVidWcoImNobW9kKCUuMTAwcywgMCVvKSBmYWlsZWQ6ICUuMTAwcyIsCisJCQkJICAgIHR0eSwgKHVfaW50KW1vZGUsIHN0cmVycm9yKGVycm5vKSk7CisJCQllbHNlCisJCQkJZmF0YWwoImNobW9kKCUuMTAwcywgMCVvKSBmYWlsZWQ6ICUuMTAwcyIsCisJCQkJICAgIHR0eSwgKHVfaW50KW1vZGUsIHN0cmVycm9yKGVycm5vKSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3NzaHB0eS5oIGIvb3BlbnNzaC02LjBwMS9zc2hwdHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmEzMjI0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS9zc2hwdHkuaApAQCAtMCwwICsxLDI3IEBACisvKiAkT3BlbkJTRDogc3NocHR5LmgsdiAxLjEyIDIwMTAvMDEvMDkgMDU6MDQ6MjQgZGptIEV4cCAkICovCisKKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiBGdW5jdGlvbnMgZm9yIGFsbG9jYXRpbmcgYSBwc2V1ZG8tdGVybWluYWwgYW5kIG1ha2luZyBpdCB0aGUgY29udHJvbGxpbmcKKyAqIHR0eS4KKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICovCisKKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisKK3N0cnVjdCB0ZXJtaW9zICpnZXRfc2F2ZWRfdGlvKHZvaWQpOwordm9pZAkgbGVhdmVfcmF3X21vZGUoaW50KTsKK3ZvaWQJIGVudGVyX3Jhd19tb2RlKGludCk7CisKK2ludAkgcHR5X2FsbG9jYXRlKGludCAqLCBpbnQgKiwgY2hhciAqLCBzaXplX3QpOwordm9pZAkgcHR5X3JlbGVhc2UoY29uc3QgY2hhciAqKTsKK3ZvaWQJIHB0eV9tYWtlX2NvbnRyb2xsaW5nX3R0eShpbnQgKiwgY29uc3QgY2hhciAqKTsKK3ZvaWQJIHB0eV9jaGFuZ2Vfd2luZG93X3NpemUoaW50LCB1X2ludCwgdV9pbnQsIHVfaW50LCB1X2ludCk7Cit2b2lkCSBwdHlfc2V0b3duZXIoc3RydWN0IHBhc3N3ZCAqLCBjb25zdCBjaGFyICopOwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS9zc2h0dHkuYyBiL29wZW5zc2gtNi4wcDEvc3NodHR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIxNGNlMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc3NodHR5LmMKQEAgLTAsMCArMSw5NiBAQAorLyogJE9wZW5CU0Q6IHNzaHR0eS5jLHYgMS4xNCAyMDEwLzAxLzA5IDA1OjA0OjI0IGRqbSBFeHAgJCAqLworLyoKKyAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAorICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAxIEtldmluIFN0ZXZlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8cHdkLmg+CisKKyNpbmNsdWRlICJzc2hwdHkuaCIKKworc3RhdGljIHN0cnVjdCB0ZXJtaW9zIF9zYXZlZF90aW87CitzdGF0aWMgaW50IF9pbl9yYXdfbW9kZSA9IDA7CisKK3N0cnVjdCB0ZXJtaW9zICoKK2dldF9zYXZlZF90aW8odm9pZCkKK3sKKwlyZXR1cm4gX2luX3Jhd19tb2RlID8gJl9zYXZlZF90aW8gOiBOVUxMOworfQorCit2b2lkCitsZWF2ZV9yYXdfbW9kZShpbnQgcXVpZXQpCit7CisJaWYgKCFfaW5fcmF3X21vZGUpCisJCXJldHVybjsKKwlpZiAodGNzZXRhdHRyKGZpbGVubyhzdGRpbiksIFRDU0FEUkFJTiwgJl9zYXZlZF90aW8pID09IC0xKSB7CisJCWlmICghcXVpZXQpCisJCQlwZXJyb3IoInRjc2V0YXR0ciIpOworCX0gZWxzZQorCQlfaW5fcmF3X21vZGUgPSAwOworfQorCit2b2lkCitlbnRlcl9yYXdfbW9kZShpbnQgcXVpZXQpCit7CisJc3RydWN0IHRlcm1pb3MgdGlvOworCisJaWYgKHRjZ2V0YXR0cihmaWxlbm8oc3RkaW4pLCAmdGlvKSA9PSAtMSkgeworCQlpZiAoIXF1aWV0KQorCQkJcGVycm9yKCJ0Y2dldGF0dHIiKTsKKwkJcmV0dXJuOworCX0KKwlfc2F2ZWRfdGlvID0gdGlvOworCXRpby5jX2lmbGFnIHw9IElHTlBBUjsKKwl0aW8uY19pZmxhZyAmPSB+KElTVFJJUCB8IElOTENSIHwgSUdOQ1IgfCBJQ1JOTCB8IElYT04gfCBJWEFOWSB8IElYT0ZGKTsKKyNpZmRlZiBJVUNMQworCXRpby5jX2lmbGFnICY9IH5JVUNMQzsKKyNlbmRpZgorCXRpby5jX2xmbGFnICY9IH4oSVNJRyB8IElDQU5PTiB8IEVDSE8gfCBFQ0hPRSB8IEVDSE9LIHwgRUNIT05MKTsKKyNpZmRlZiBJRVhURU4KKwl0aW8uY19sZmxhZyAmPSB+SUVYVEVOOworI2VuZGlmCisJdGlvLmNfb2ZsYWcgJj0gfk9QT1NUOworCXRpby5jX2NjW1ZNSU5dID0gMTsKKwl0aW8uY19jY1tWVElNRV0gPSAwOworCWlmICh0Y3NldGF0dHIoZmlsZW5vKHN0ZGluKSwgVENTQURSQUlOLCAmdGlvKSA9PSAtMSkgeworCQlpZiAoIXF1aWV0KQorCQkJcGVycm9yKCJ0Y3NldGF0dHIiKTsKKwl9IGVsc2UKKwkJX2luX3Jhd19tb2RlID0gMTsKK30KZGlmZiAtLWdpdCBhL29wZW5zc2gtNi4wcDEvc3VydmV5LnNoLmluIGIvb3BlbnNzaC02LjBwMS9zdXJ2ZXkuc2guaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwNzVhNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvc3VydmV5LnNoLmluCkBAIC0wLDAgKzEsNjkgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgRGFycmVuIFR1Y2tlcgorIworIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyMgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorIyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorIyBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisjIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorIyBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorIyBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCitob3N0PSJAaG9zdEAiCitBV0s9IkBBV0tAIgorQ0M9IkBDQ0AiCitDUFA9IkBDUFBAIgorQ0ZMQUdTPSJAQ0ZMQUdTQCIKK0NQUEZMQUdTPSJAQ1BQRkxBR1NAIgorTERGTEFHUz0iQExERkxBR1NAIgorTElCUz0iQExJQlNAIgorCisjIE5vdGUgZm9ybWF0OgorIyBpZGVudGlmaWVyOiBbZGF0YV0gQ1JDUgorCitlY2hvICJvcGVuc3NoLXN1cnZleS12ZXJzaW9uOiAxIgorZWNobworZWNobyAib3BlbnNzaC12ZXJzaW9uOiBgLi9zc2ggLVYgMj4mMWAiCitlY2hvCitjb25maWdpbnY9YCRBV0sgJy9eICBcXFwkLipjb25maWd1cmUvJyBjb25maWcubG9nIHwgc2VkICdzL14gIFxcXCQgLy9nJ2AKK2VjaG8gImNvbmZpZ3VyZS1pbnZvY2F0aW9uOiAkY29uZmlnaW52IgorZWNobworZWNobyAiaG9zdDogJGhvc3QiCitlY2hvCitlY2hvICJ1bmFtZTogYHVuYW1lYCIKK2VjaG8KK2VjaG8gInVuYW1lLXI6IGB1bmFtZSAtcmAiCitlY2hvCitlY2hvICJ1bmFtZS1tOiBgdW5hbWUgLW1gIgorZWNobworZWNobyAidW5hbWUtcDogYHVuYW1lIC1wYCIKK2VjaG8KK2VjaG8gIm9zbGV2ZWw6IGBvc2xldmVsIDI+L2Rldi9udWxsYCIKK2VjaG8KK2VjaG8gIm9zbGV2ZWwtcjogYG9zbGV2ZWwgLXIgMj4vZGV2L251bGxgIgorZWNobworZWNobyAiY2M6ICRDQyIKK2VjaG8KK2VjaG8gImNmbGFnczogJENGTEFHUyIKK2VjaG8KK2VjaG8gImNwcGZsYWdzOiAkQ1BQRkxBR1MiCitlY2hvCitlY2hvICJsZGZsYWdzOiAkTERGTEFHUyIKK2VjaG8KK2VjaG8gImxpYnM6ICRMSUJTIgorZWNobworZWNobyAiY2N2ZXItdjogYCRDQyAtdiAyPiYxIHwgc2VkICcvXlsgXHRdKiQvZCdgIgorZWNobworZWNobyAiY2N2ZXItVjogYCRDQyAtViAyPiYxIHwgc2VkICcvXlsgXHRdKiQvZCdgIgorZWNobworZWNobyAiY3BwZGVmaW5lczoiCiske0NQUH0gLWRNIC0gPC9kZXYvbnVsbAorZWNobworZWNobyAiY29uZmlnLmg6IgorZWdyZXAgJyNkZWZpbmV8I3VuZGVmJyBjb25maWcuaAorZWNobwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS90dHltb2Rlcy5jIGIvb3BlbnNzaC02LjBwMS90dHltb2Rlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNTFiOGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3R0eW1vZGVzLmMKQEAgLTAsMCArMSw0OTAgQEAKKy8qICRPcGVuQlNEOiB0dHltb2Rlcy5jLHYgMS4yOSAyMDA4LzExLzAyIDAwOjE2OjE2IHN0ZXZlc2sgRXhwICQgKi8KKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqLworCisvKgorICogU1NIMiB0dHkgbW9kZXMgc3VwcG9ydCBieSBLZXZpbiBTdGV2ZXMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgS2V2aW4gU3RldmVzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIEVuY29kaW5nIGFuZCBkZWNvZGluZyBvZiB0ZXJtaW5hbCBtb2RlcyBpbiBhIHBvcnRhYmxlIHdheS4KKyAqIE11Y2ggb2YgdGhlIGZvcm1hdCBpcyBkZWZpbmVkIGluIHR0eW1vZGVzLmg7IGl0IGlzIGluY2x1ZGVkIG11bHRpcGxlIHRpbWVzCisgKiBpbnRvIHRoaXMgZmlsZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBtYWNybyBkZWZpbml0aW9ucyB0byBnZW5lcmF0ZSB0aGUKKyAqIHN1aXRhYmxlIGNvZGUuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSAicGFja2V0LmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAic3NoMS5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorCisjZGVmaW5lIFRUWV9PUF9FTkQJCTAKKy8qCisgKiB1aW50MzIgKHVfaW50KSBmb2xsb3dzIHNwZWVkIGluIFNTSDEgYW5kIFNTSDIKKyAqLworI2RlZmluZSBUVFlfT1BfSVNQRUVEX1BST1RPMQkxOTIKKyNkZWZpbmUgVFRZX09QX09TUEVFRF9QUk9UTzEJMTkzCisjZGVmaW5lIFRUWV9PUF9JU1BFRURfUFJPVE8yCTEyOAorI2RlZmluZSBUVFlfT1BfT1NQRUVEX1BST1RPMgkxMjkKKworLyoKKyAqIENvbnZlcnRzIFBPU0lYIHNwZWVkX3QgdG8gYSBiYXVkIHJhdGUuICBUaGUgdmFsdWVzIG9mIHRoZQorICogY29uc3RhbnRzIGZvciBzcGVlZF90IGFyZSBub3QgdGhlbXNlbHZlcyBwb3J0YWJsZS4KKyAqLworc3RhdGljIGludAorc3BlZWRfdG9fYmF1ZChzcGVlZF90IHNwZWVkKQoreworCXN3aXRjaCAoc3BlZWQpIHsKKwljYXNlIEIwOgorCQlyZXR1cm4gMDsKKwljYXNlIEI1MDoKKwkJcmV0dXJuIDUwOworCWNhc2UgQjc1OgorCQlyZXR1cm4gNzU7CisJY2FzZSBCMTEwOgorCQlyZXR1cm4gMTEwOworCWNhc2UgQjEzNDoKKwkJcmV0dXJuIDEzNDsKKwljYXNlIEIxNTA6CisJCXJldHVybiAxNTA7CisJY2FzZSBCMjAwOgorCQlyZXR1cm4gMjAwOworCWNhc2UgQjMwMDoKKwkJcmV0dXJuIDMwMDsKKwljYXNlIEI2MDA6CisJCXJldHVybiA2MDA7CisJY2FzZSBCMTIwMDoKKwkJcmV0dXJuIDEyMDA7CisJY2FzZSBCMTgwMDoKKwkJcmV0dXJuIDE4MDA7CisJY2FzZSBCMjQwMDoKKwkJcmV0dXJuIDI0MDA7CisJY2FzZSBCNDgwMDoKKwkJcmV0dXJuIDQ4MDA7CisJY2FzZSBCOTYwMDoKKwkJcmV0dXJuIDk2MDA7CisKKyNpZmRlZiBCMTkyMDAKKwljYXNlIEIxOTIwMDoKKwkJcmV0dXJuIDE5MjAwOworI2Vsc2UgLyogQjE5MjAwICovCisjaWZkZWYgRVhUQQorCWNhc2UgRVhUQToKKwkJcmV0dXJuIDE5MjAwOworI2VuZGlmIC8qIEVYVEEgKi8KKyNlbmRpZiAvKiBCMTkyMDAgKi8KKworI2lmZGVmIEIzODQwMAorCWNhc2UgQjM4NDAwOgorCQlyZXR1cm4gMzg0MDA7CisjZWxzZSAvKiBCMzg0MDAgKi8KKyNpZmRlZiBFWFRCCisJY2FzZSBFWFRCOgorCQlyZXR1cm4gMzg0MDA7CisjZW5kaWYgLyogRVhUQiAqLworI2VuZGlmIC8qIEIzODQwMCAqLworCisjaWZkZWYgQjcyMDAKKwljYXNlIEI3MjAwOgorCQlyZXR1cm4gNzIwMDsKKyNlbmRpZiAvKiBCNzIwMCAqLworI2lmZGVmIEIxNDQwMAorCWNhc2UgQjE0NDAwOgorCQlyZXR1cm4gMTQ0MDA7CisjZW5kaWYgLyogQjE0NDAwICovCisjaWZkZWYgQjI4ODAwCisJY2FzZSBCMjg4MDA6CisJCXJldHVybiAyODgwMDsKKyNlbmRpZiAvKiBCMjg4MDAgKi8KKyNpZmRlZiBCNTc2MDAKKwljYXNlIEI1NzYwMDoKKwkJcmV0dXJuIDU3NjAwOworI2VuZGlmIC8qIEI1NzYwMCAqLworI2lmZGVmIEI3NjgwMAorCWNhc2UgQjc2ODAwOgorCQlyZXR1cm4gNzY4MDA7CisjZW5kaWYgLyogQjc2ODAwICovCisjaWZkZWYgQjExNTIwMAorCWNhc2UgQjExNTIwMDoKKwkJcmV0dXJuIDExNTIwMDsKKyNlbmRpZiAvKiBCMTE1MjAwICovCisjaWZkZWYgQjIzMDQwMAorCWNhc2UgQjIzMDQwMDoKKwkJcmV0dXJuIDIzMDQwMDsKKyNlbmRpZiAvKiBCMjMwNDAwICovCisJZGVmYXVsdDoKKwkJcmV0dXJuIDk2MDA7CisJfQorfQorCisvKgorICogQ29udmVydHMgYSBudW1lcmljIGJhdWQgcmF0ZSB0byBhIFBPU0lYIHNwZWVkX3QuCisgKi8KK3N0YXRpYyBzcGVlZF90CitiYXVkX3RvX3NwZWVkKGludCBiYXVkKQoreworCXN3aXRjaCAoYmF1ZCkgeworCWNhc2UgMDoKKwkJcmV0dXJuIEIwOworCWNhc2UgNTA6CisJCXJldHVybiBCNTA7CisJY2FzZSA3NToKKwkJcmV0dXJuIEI3NTsKKwljYXNlIDExMDoKKwkJcmV0dXJuIEIxMTA7CisJY2FzZSAxMzQ6CisJCXJldHVybiBCMTM0OworCWNhc2UgMTUwOgorCQlyZXR1cm4gQjE1MDsKKwljYXNlIDIwMDoKKwkJcmV0dXJuIEIyMDA7CisJY2FzZSAzMDA6CisJCXJldHVybiBCMzAwOworCWNhc2UgNjAwOgorCQlyZXR1cm4gQjYwMDsKKwljYXNlIDEyMDA6CisJCXJldHVybiBCMTIwMDsKKwljYXNlIDE4MDA6CisJCXJldHVybiBCMTgwMDsKKwljYXNlIDI0MDA6CisJCXJldHVybiBCMjQwMDsKKwljYXNlIDQ4MDA6CisJCXJldHVybiBCNDgwMDsKKwljYXNlIDk2MDA6CisJCXJldHVybiBCOTYwMDsKKworI2lmZGVmIEIxOTIwMAorCWNhc2UgMTkyMDA6CisJCXJldHVybiBCMTkyMDA7CisjZWxzZSAvKiBCMTkyMDAgKi8KKyNpZmRlZiBFWFRBCisJY2FzZSAxOTIwMDoKKwkJcmV0dXJuIEVYVEE7CisjZW5kaWYgLyogRVhUQSAqLworI2VuZGlmIC8qIEIxOTIwMCAqLworCisjaWZkZWYgQjM4NDAwCisJY2FzZSAzODQwMDoKKwkJcmV0dXJuIEIzODQwMDsKKyNlbHNlIC8qIEIzODQwMCAqLworI2lmZGVmIEVYVEIKKwljYXNlIDM4NDAwOgorCQlyZXR1cm4gRVhUQjsKKyNlbmRpZiAvKiBFWFRCICovCisjZW5kaWYgLyogQjM4NDAwICovCisKKyNpZmRlZiBCNzIwMAorCWNhc2UgNzIwMDoKKwkJcmV0dXJuIEI3MjAwOworI2VuZGlmIC8qIEI3MjAwICovCisjaWZkZWYgQjE0NDAwCisJY2FzZSAxNDQwMDoKKwkJcmV0dXJuIEIxNDQwMDsKKyNlbmRpZiAvKiBCMTQ0MDAgKi8KKyNpZmRlZiBCMjg4MDAKKwljYXNlIDI4ODAwOgorCQlyZXR1cm4gQjI4ODAwOworI2VuZGlmIC8qIEIyODgwMCAqLworI2lmZGVmIEI1NzYwMAorCWNhc2UgNTc2MDA6CisJCXJldHVybiBCNTc2MDA7CisjZW5kaWYgLyogQjU3NjAwICovCisjaWZkZWYgQjc2ODAwCisJY2FzZSA3NjgwMDoKKwkJcmV0dXJuIEI3NjgwMDsKKyNlbmRpZiAvKiBCNzY4MDAgKi8KKyNpZmRlZiBCMTE1MjAwCisJY2FzZSAxMTUyMDA6CisJCXJldHVybiBCMTE1MjAwOworI2VuZGlmIC8qIEIxMTUyMDAgKi8KKyNpZmRlZiBCMjMwNDAwCisJY2FzZSAyMzA0MDA6CisJCXJldHVybiBCMjMwNDAwOworI2VuZGlmIC8qIEIyMzA0MDAgKi8KKwlkZWZhdWx0OgorCQlyZXR1cm4gQjk2MDA7CisJfQorfQorCisvKgorICogRW5jb2RlIGEgc3BlY2lhbCBjaGFyYWN0ZXIgaW50byBTU0ggbGluZSBmb3JtYXQuCisgKi8KK3N0YXRpYyB1X2ludAorc3BlY2lhbF9jaGFyX2VuY29kZShjY190IGMpCit7CisjaWZkZWYgX1BPU0lYX1ZESVNBQkxFCisJaWYgKGMgPT0gX1BPU0lYX1ZESVNBQkxFKQorCQlyZXR1cm4gMjU1OworI2VuZGlmIC8qIF9QT1NJWF9WRElTQUJMRSAqLworCXJldHVybiBjOworfQorCisvKgorICogRGVjb2RlIGEgc3BlY2lhbCBjaGFyYWN0ZXIgZnJvbSBTU0ggbGluZSBmb3JtYXQuCisgKi8KK3N0YXRpYyBjY190CitzcGVjaWFsX2NoYXJfZGVjb2RlKHVfaW50IGMpCit7CisjaWZkZWYgX1BPU0lYX1ZESVNBQkxFCisJaWYgKGMgPT0gMjU1KQorCQlyZXR1cm4gX1BPU0lYX1ZESVNBQkxFOworI2VuZGlmIC8qIF9QT1NJWF9WRElTQUJMRSAqLworCXJldHVybiBjOworfQorCisvKgorICogRW5jb2RlcyB0ZXJtaW5hbCBtb2RlcyBmb3IgdGhlIHRlcm1pbmFsIHJlZmVyZW5jZWQgYnkgZmQKKyAqIG9yIHRpb3AgaW4gYSBwb3J0YWJsZSBtYW5uZXIsIGFuZCBhcHBlbmRzIHRoZSBtb2RlcyB0byBhIHBhY2tldAorICogYmVpbmcgY29uc3RydWN0ZWQuCisgKi8KK3ZvaWQKK3R0eV9tYWtlX21vZGVzKGludCBmZCwgc3RydWN0IHRlcm1pb3MgKnRpb3ApCit7CisJc3RydWN0IHRlcm1pb3MgdGlvOworCWludCBiYXVkOworCUJ1ZmZlciBidWY7CisJaW50IHR0eV9vcF9vc3BlZWQsIHR0eV9vcF9pc3BlZWQ7CisJdm9pZCAoKnB1dF9hcmcpKEJ1ZmZlciAqLCB1X2ludCk7CisKKwlidWZmZXJfaW5pdCgmYnVmKTsKKwlpZiAoY29tcGF0MjApIHsKKwkJdHR5X29wX29zcGVlZCA9IFRUWV9PUF9PU1BFRURfUFJPVE8yOworCQl0dHlfb3BfaXNwZWVkID0gVFRZX09QX0lTUEVFRF9QUk9UTzI7CisJCXB1dF9hcmcgPSBidWZmZXJfcHV0X2ludDsKKwl9IGVsc2UgeworCQl0dHlfb3Bfb3NwZWVkID0gVFRZX09QX09TUEVFRF9QUk9UTzE7CisJCXR0eV9vcF9pc3BlZWQgPSBUVFlfT1BfSVNQRUVEX1BST1RPMTsKKwkJcHV0X2FyZyA9ICh2b2lkICgqKShCdWZmZXIgKiwgdV9pbnQpKSBidWZmZXJfcHV0X2NoYXI7CisJfQorCisJaWYgKHRpb3AgPT0gTlVMTCkgeworCQlpZiAoZmQgPT0gLTEpIHsKKwkJCWRlYnVnKCJ0dHlfbWFrZV9tb2Rlczogbm8gZmQgb3IgdGlvIik7CisJCQlnb3RvIGVuZDsKKwkJfQorCQlpZiAodGNnZXRhdHRyKGZkLCAmdGlvKSA9PSAtMSkgeworCQkJbG9naXQoInRjZ2V0YXR0cjogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWdvdG8gZW5kOworCQl9CisJfSBlbHNlCisJCXRpbyA9ICp0aW9wOworCisJLyogU3RvcmUgaW5wdXQgYW5kIG91dHB1dCBiYXVkIHJhdGVzLiAqLworCWJhdWQgPSBzcGVlZF90b19iYXVkKGNmZ2V0b3NwZWVkKCZ0aW8pKTsKKwlidWZmZXJfcHV0X2NoYXIoJmJ1ZiwgdHR5X29wX29zcGVlZCk7CisJYnVmZmVyX3B1dF9pbnQoJmJ1ZiwgYmF1ZCk7CisJYmF1ZCA9IHNwZWVkX3RvX2JhdWQoY2ZnZXRpc3BlZWQoJnRpbykpOworCWJ1ZmZlcl9wdXRfY2hhcigmYnVmLCB0dHlfb3BfaXNwZWVkKTsKKwlidWZmZXJfcHV0X2ludCgmYnVmLCBiYXVkKTsKKworCS8qIFN0b3JlIHZhbHVlcyBvZiBtb2RlIGZsYWdzLiAqLworI2RlZmluZSBUVFlDSEFSKE5BTUUsIE9QKSBcCisJYnVmZmVyX3B1dF9jaGFyKCZidWYsIE9QKTsgXAorCXB1dF9hcmcoJmJ1Ziwgc3BlY2lhbF9jaGFyX2VuY29kZSh0aW8uY19jY1tOQU1FXSkpOworCisjZGVmaW5lIFRUWU1PREUoTkFNRSwgRklFTEQsIE9QKSBcCisJYnVmZmVyX3B1dF9jaGFyKCZidWYsIE9QKTsgXAorCXB1dF9hcmcoJmJ1ZiwgKCh0aW8uRklFTEQgJiBOQU1FKSAhPSAwKSk7CisKKyNpbmNsdWRlICJ0dHltb2Rlcy5oIgorCisjdW5kZWYgVFRZQ0hBUgorI3VuZGVmIFRUWU1PREUKKworZW5kOgorCS8qIE1hcmsgZW5kIG9mIG1vZGUgZGF0YS4gKi8KKwlidWZmZXJfcHV0X2NoYXIoJmJ1ZiwgVFRZX09QX0VORCk7CisJaWYgKGNvbXBhdDIwKQorCQlwYWNrZXRfcHV0X3N0cmluZyhidWZmZXJfcHRyKCZidWYpLCBidWZmZXJfbGVuKCZidWYpKTsKKwllbHNlCisJCXBhY2tldF9wdXRfcmF3KGJ1ZmZlcl9wdHIoJmJ1ZiksIGJ1ZmZlcl9sZW4oJmJ1ZikpOworCWJ1ZmZlcl9mcmVlKCZidWYpOworfQorCisvKgorICogRGVjb2RlcyB0ZXJtaW5hbCBtb2RlcyBmb3IgdGhlIHRlcm1pbmFsIHJlZmVyZW5jZWQgYnkgZmQgaW4gYSBwb3J0YWJsZQorICogbWFubmVyIGZyb20gYSBwYWNrZXQgYmVpbmcgcmVhZC4KKyAqLwordm9pZAordHR5X3BhcnNlX21vZGVzKGludCBmZCwgaW50ICpuX2J5dGVzX3B0cikKK3sKKwlzdHJ1Y3QgdGVybWlvcyB0aW87CisJaW50IG9wY29kZSwgYmF1ZDsKKwlpbnQgbl9ieXRlcyA9IDA7CisJaW50IGZhaWx1cmUgPSAwOworCXVfaW50ICgqZ2V0X2FyZykodm9pZCk7CisJaW50IGFyZ19zaXplOworCisJaWYgKGNvbXBhdDIwKSB7CisJCSpuX2J5dGVzX3B0ciA9IHBhY2tldF9nZXRfaW50KCk7CisJCWlmICgqbl9ieXRlc19wdHIgPT0gMCkKKwkJCXJldHVybjsKKwkJZ2V0X2FyZyA9IHBhY2tldF9nZXRfaW50OworCQlhcmdfc2l6ZSA9IDQ7CisJfSBlbHNlIHsKKwkJZ2V0X2FyZyA9IHBhY2tldF9nZXRfY2hhcjsKKwkJYXJnX3NpemUgPSAxOworCX0KKworCS8qCisJICogR2V0IG9sZCBhdHRyaWJ1dGVzIGZvciB0aGUgdGVybWluYWwuICBXZSB3aWxsIG1vZGlmeSB0aGVzZQorCSAqIGZsYWdzLiBJIGFtIGhvcGluZyB0aGF0IGlmIHRoZXJlIGFyZSBhbnkgbWFjaGluZS1zcGVjaWZpYworCSAqIG1vZGVzLCB0aGV5IHdpbGwgaW5pdGlhbGx5IGhhdmUgcmVhc29uYWJsZSB2YWx1ZXMuCisJICovCisJaWYgKHRjZ2V0YXR0cihmZCwgJnRpbykgPT0gLTEpIHsKKwkJbG9naXQoInRjZ2V0YXR0cjogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZmFpbHVyZSA9IC0xOworCX0KKworCWZvciAoOzspIHsKKwkJbl9ieXRlcyArPSAxOworCQlvcGNvZGUgPSBwYWNrZXRfZ2V0X2NoYXIoKTsKKwkJc3dpdGNoIChvcGNvZGUpIHsKKwkJY2FzZSBUVFlfT1BfRU5EOgorCQkJZ290byBzZXQ7CisKKwkJLyogWFhYOiBmdXR1cmUgY29uZmxpY3QgcG9zc2libGUgKi8KKwkJY2FzZSBUVFlfT1BfSVNQRUVEX1BST1RPMToKKwkJY2FzZSBUVFlfT1BfSVNQRUVEX1BST1RPMjoKKwkJCW5fYnl0ZXMgKz0gNDsKKwkJCWJhdWQgPSBwYWNrZXRfZ2V0X2ludCgpOworCQkJaWYgKGZhaWx1cmUgIT0gLTEgJiYKKwkJCSAgICBjZnNldGlzcGVlZCgmdGlvLCBiYXVkX3RvX3NwZWVkKGJhdWQpKSA9PSAtMSkKKwkJCQllcnJvcigiY2ZzZXRpc3BlZWQgZmFpbGVkIGZvciAlZCIsIGJhdWQpOworCQkJYnJlYWs7CisKKwkJLyogWFhYOiBmdXR1cmUgY29uZmxpY3QgcG9zc2libGUgKi8KKwkJY2FzZSBUVFlfT1BfT1NQRUVEX1BST1RPMToKKwkJY2FzZSBUVFlfT1BfT1NQRUVEX1BST1RPMjoKKwkJCW5fYnl0ZXMgKz0gNDsKKwkJCWJhdWQgPSBwYWNrZXRfZ2V0X2ludCgpOworCQkJaWYgKGZhaWx1cmUgIT0gLTEgJiYKKwkJCSAgICBjZnNldG9zcGVlZCgmdGlvLCBiYXVkX3RvX3NwZWVkKGJhdWQpKSA9PSAtMSkKKwkJCQllcnJvcigiY2ZzZXRvc3BlZWQgZmFpbGVkIGZvciAlZCIsIGJhdWQpOworCQkJYnJlYWs7CisKKyNkZWZpbmUgVFRZQ0hBUihOQU1FLCBPUCkgXAorCWNhc2UgT1A6IFwKKwkgIG5fYnl0ZXMgKz0gYXJnX3NpemU7IFwKKwkgIHRpby5jX2NjW05BTUVdID0gc3BlY2lhbF9jaGFyX2RlY29kZShnZXRfYXJnKCkpOyBcCisJICBicmVhazsKKyNkZWZpbmUgVFRZTU9ERShOQU1FLCBGSUVMRCwgT1ApIFwKKwljYXNlIE9QOiBcCisJICBuX2J5dGVzICs9IGFyZ19zaXplOyBcCisJICBpZiAoZ2V0X2FyZygpKSBcCisJICAgIHRpby5GSUVMRCB8PSBOQU1FOyBcCisJICBlbHNlIFwKKwkgICAgdGlvLkZJRUxEICY9IH5OQU1FOwlcCisJICBicmVhazsKKworI2luY2x1ZGUgInR0eW1vZGVzLmgiCisKKyN1bmRlZiBUVFlDSEFSCisjdW5kZWYgVFRZTU9ERQorCisJCWRlZmF1bHQ6CisJCQlkZWJ1ZygiSWdub3JpbmcgdW5zdXBwb3J0ZWQgdHR5IG1vZGUgb3Bjb2RlICVkICgweCV4KSIsCisJCQkgICAgb3Bjb2RlLCBvcGNvZGUpOworCQkJaWYgKCFjb21wYXQyMCkgeworCQkJCS8qCisJCQkJICogU1NIMToKKwkJCQkgKiBPcGNvZGVzIDEgdG8gMTI3IGFyZSBkZWZpbmVkIHRvIGhhdmUKKwkJCQkgKiBhIG9uZS1ieXRlIGFyZ3VtZW50LgorCQkJCSAqIE9wY29kZXMgMTI4IHRvIDE1OSBhcmUgZGVmaW5lZCB0byBoYXZlCisJCQkJICogYW4gaW50ZWdlciBhcmd1bWVudC4KKwkJCQkgKi8KKwkJCQlpZiAob3Bjb2RlID4gMCAmJiBvcGNvZGUgPCAxMjgpIHsKKwkJCQkJbl9ieXRlcyArPSAxOworCQkJCQkodm9pZCkgcGFja2V0X2dldF9jaGFyKCk7CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSBpZiAob3Bjb2RlID49IDEyOCAmJiBvcGNvZGUgPCAxNjApIHsKKwkJCQkJbl9ieXRlcyArPSA0OworCQkJCQkodm9pZCkgcGFja2V0X2dldF9pbnQoKTsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyoKKwkJCQkJICogSXQgaXMgYSB0cnVseSB1bmRlZmluZWQgb3Bjb2RlICgxNjAgdG8gMjU1KS4KKwkJCQkJICogV2UgaGF2ZSBubyBpZGVhIGFib3V0IGl0cyBhcmd1bWVudHMuICBTbyB3ZQorCQkJCQkgKiBtdXN0IHN0b3AgcGFyc2luZy4gIE5vdGUgdGhhdCBzb21lIGRhdGEKKwkJCQkJICogbWF5IGJlIGxlZnQgaW4gdGhlIHBhY2tldDsgaG9wZWZ1bGx5IHRoZXJlCisJCQkJCSAqIGlzIG5vdGhpbmcgbW9yZSBjb21pbmcgYWZ0ZXIgdGhlIG1vZGUgZGF0YS4KKwkJCQkJICovCisJCQkJCWxvZ2l0KCJwYXJzZV90dHlfbW9kZXM6IHVua25vd24gb3Bjb2RlICVkIiwKKwkJCQkJICAgIG9wY29kZSk7CisJCQkJCWdvdG8gc2V0OworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBTU0gyOgorCQkJCSAqIE9wY29kZXMgMSB0byAxNTkgYXJlIGRlZmluZWQgdG8gaGF2ZQorCQkJCSAqIGEgdWludDMyIGFyZ3VtZW50LgorCQkJCSAqIE9wY29kZXMgMTYwIHRvIDI1NSBhcmUgdW5kZWZpbmVkIGFuZAorCQkJCSAqIGNhdXNlIHBhcnNpbmcgdG8gc3RvcC4KKwkJCQkgKi8KKwkJCQlpZiAob3Bjb2RlID4gMCAmJiBvcGNvZGUgPCAxNjApIHsKKwkJCQkJbl9ieXRlcyArPSA0OworCQkJCQkodm9pZCkgcGFja2V0X2dldF9pbnQoKTsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9naXQoInBhcnNlX3R0eV9tb2RlczogdW5rbm93biBvcGNvZGUgJWQiLAorCQkJCQkgICAgb3Bjb2RlKTsKKwkJCQkJZ290byBzZXQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorCitzZXQ6CisJaWYgKCpuX2J5dGVzX3B0ciAhPSBuX2J5dGVzKSB7CisJCSpuX2J5dGVzX3B0ciA9IG5fYnl0ZXM7CisJCWxvZ2l0KCJwYXJzZV90dHlfbW9kZXM6IG5fYnl0ZXNfcHRyICE9IG5fYnl0ZXM6ICVkICVkIiwKKwkJICAgICpuX2J5dGVzX3B0ciwgbl9ieXRlcyk7CisJCXJldHVybjsJCS8qIERvbid0IHByb2Nlc3MgYnl0ZXMgcGFzc2VkICovCisJfQorCWlmIChmYWlsdXJlID09IC0xKQorCQlyZXR1cm47CQkvKiBQYWNrZXQgcGFyc2VkIG9rIGJ1dCB0Y2dldGF0dHIoKSBmYWlsZWQgKi8KKworCS8qIFNldCB0aGUgbmV3IG1vZGVzIGZvciB0aGUgdGVybWluYWwuICovCisJaWYgKHRjc2V0YXR0cihmZCwgVENTQU5PVywgJnRpbykgPT0gLTEpCisJCWxvZ2l0KCJTZXR0aW5nIHR0eSBtb2RlcyBmYWlsZWQ6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3R0eW1vZGVzLmggYi9vcGVuc3NoLTYuMHAxL3R0eW1vZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ4NDhmZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvdHR5bW9kZXMuaApAQCAtMCwwICsxLDE3NSBAQAorLyogJE9wZW5CU0Q6IHR0eW1vZGVzLmgsdiAxLjE0IDIwMDYvMDMvMjUgMjI6MjI6NDMgZGptIEV4cCAkICovCisKKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqLworCisvKgorICogU1NIMiB0dHkgbW9kZXMgc3VwcG9ydCBieSBLZXZpbiBTdGV2ZXMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgS2V2aW4gU3RldmVzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFNTSDE6CisgKiBUaGUgdHR5IG1vZGUgZGVzY3JpcHRpb24gaXMgYSBzdHJlYW0gb2YgYnl0ZXMuICBUaGUgc3RyZWFtIGNvbnNpc3RzIG9mCisgKiBvcGNvZGUtYXJndW1lbnRzIHBhaXJzLiAgSXQgaXMgdGVybWluYXRlZCBieSBvcGNvZGUgVFRZX09QX0VORCAoMCkuCisgKiBPcGNvZGVzIDEtMTI3IGhhdmUgb25lLWJ5dGUgYXJndW1lbnRzLiAgT3Bjb2RlcyAxMjgtMTU5IGhhdmUgaW50ZWdlcgorICogYXJndW1lbnRzLiAgT3Bjb2RlcyAxNjAtMjU1IGFyZSBub3QgeWV0IGRlZmluZWQsIGFuZCBjYXVzZSBwYXJzaW5nIHRvCisgKiBzdG9wICh0aGV5IHNob3VsZCBvbmx5IGJlIHVzZWQgYWZ0ZXIgYW55IG90aGVyIGRhdGEpLgorICoKKyAqIFNTSDI6CisgKiBEaWZmZXJlbmNlcyBiZXR3ZWVuIFNTSDEgYW5kIFNTSDIgdGVybWluYWwgbW9kZSBlbmNvZGluZyBpbmNsdWRlOgorICogMS4gRW5jb2RlZCB0ZXJtaW5hbCBtb2RlcyBhcmUgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcsIGFuZCBhIHN0cmVhbQorICogICAgb2YgYnl0ZXMgd2l0aGluIHRoYXQgc3RyaW5nLgorICogMi4gT3Bjb2RlIGFyZ3VtZW50cyBhcmUgdWludDMyICgxLTE1OSk7IDE2MC0yNTUgcmVtYWluIHVuZGVmaW5lZC4KKyAqIDMuIFRoZSB2YWx1ZXMgZm9yIFRUWV9PUF9JU1BFRUQgYW5kIFRUWV9PUF9PU1BFRUQgYXJlIGRpZmZlcmVudDsKKyAqICAgIDEyOCBhbmQgMTI5IHZzLiAxOTIgYW5kIDE5MyByZXNwZWN0aXZlbHkuCisgKgorICogVGhlIGNsaWVudCBwdXRzIGluIHRoZSBzdHJlYW0gYW55IG1vZGVzIGl0IGtub3dzIGFib3V0LCBhbmQgdGhlCisgKiBzZXJ2ZXIgaWdub3JlcyBhbnkgbW9kZXMgaXQgZG9lcyBub3Qga25vdyBhYm91dC4gIFRoaXMgYWxsb3dzIHNvbWUgZGVncmVlCisgKiBvZiBtYWNoaW5lLWluZGVwZW5kZW5jZSwgYXQgbGVhc3QgYmV0d2VlbiBzeXN0ZW1zIHRoYXQgdXNlIGEgcG9zaXgtbGlrZQorICogdHR5IGludGVyZmFjZS4gIFRoZSBwcm90b2NvbCBjYW4gc3VwcG9ydCBvdGhlciBzeXN0ZW1zIGFzIHdlbGwsIGJ1dCBtaWdodAorICogcmVxdWlyZSByZWltcGxlbWVudGluZyBhcyBtb2RlIG5hbWVzIHdvdWxkIGxpa2VseSBiZSBkaWZmZXJlbnQuCisgKi8KKworLyoKKyAqIFNvbWUgY29uc3RhbnRzIGFuZCBwcm90b3R5cGVzIGFyZSBkZWZpbmVkIGluIHBhY2tldC5oOyB0aGlzIGZpbGUKKyAqIGlzIG9ubHkgaW50ZW5kZWQgZm9yIGluY2x1ZGluZyBmcm9tIHR0eW1vZGVzLmMuCisgKi8KKworLyogdGVybWlvcyBtYWNybyAqLworLyogbmFtZSwgb3AgKi8KK1RUWUNIQVIoVklOVFIsIDEpCitUVFlDSEFSKFZRVUlULCAyKQorVFRZQ0hBUihWRVJBU0UsIDMpCisjaWYgZGVmaW5lZChWS0lMTCkKK1RUWUNIQVIoVktJTEwsIDQpCisjZW5kaWYgLyogVktJTEwgKi8KK1RUWUNIQVIoVkVPRiwgNSkKKyNpZiBkZWZpbmVkKFZFT0wpCitUVFlDSEFSKFZFT0wsIDYpCisjZW5kaWYgLyogVkVPTCAqLworI2lmZGVmIFZFT0wyCitUVFlDSEFSKFZFT0wyLCA3KQorI2VuZGlmIC8qIFZFT0wyICovCitUVFlDSEFSKFZTVEFSVCwgOCkKK1RUWUNIQVIoVlNUT1AsIDkpCisjaWYgZGVmaW5lZChWU1VTUCkKK1RUWUNIQVIoVlNVU1AsIDEwKQorI2VuZGlmIC8qIFZTVVNQICovCisjaWYgZGVmaW5lZChWRFNVU1ApCitUVFlDSEFSKFZEU1VTUCwgMTEpCisjZW5kaWYgLyogVkRTVVNQICovCisjaWYgZGVmaW5lZChWUkVQUklOVCkKK1RUWUNIQVIoVlJFUFJJTlQsIDEyKQorI2VuZGlmIC8qIFZSRVBSSU5UICovCisjaWYgZGVmaW5lZChWV0VSQVNFKQorVFRZQ0hBUihWV0VSQVNFLCAxMykKKyNlbmRpZiAvKiBWV0VSQVNFICovCisjaWYgZGVmaW5lZChWTE5FWFQpCitUVFlDSEFSKFZMTkVYVCwgMTQpCisjZW5kaWYgLyogVkxORVhUICovCisjaWYgZGVmaW5lZChWRkxVU0gpCitUVFlDSEFSKFZGTFVTSCwgMTUpCisjZW5kaWYgLyogVkZMVVNIICovCisjaWZkZWYgVlNXVENICitUVFlDSEFSKFZTV1RDSCwgMTYpCisjZW5kaWYgLyogVlNXVENIICovCisjaWYgZGVmaW5lZChWU1RBVFVTKQorVFRZQ0hBUihWU1RBVFVTLCAxNykKKyNlbmRpZiAvKiBWU1RBVFVTICovCisjaWZkZWYgVkRJU0NBUkQKK1RUWUNIQVIoVkRJU0NBUkQsIDE4KQorI2VuZGlmIC8qIFZESVNDQVJEICovCisKKy8qIG5hbWUsIGZpZWxkLCBvcCAqLworVFRZTU9ERShJR05QQVIsCWNfaWZsYWcsIDMwKQorVFRZTU9ERShQQVJNUkssCWNfaWZsYWcsIDMxKQorVFRZTU9ERShJTlBDSywJY19pZmxhZywgMzIpCitUVFlNT0RFKElTVFJJUCwJY19pZmxhZywgMzMpCitUVFlNT0RFKElOTENSLAljX2lmbGFnLCAzNCkKK1RUWU1PREUoSUdOQ1IsCWNfaWZsYWcsIDM1KQorVFRZTU9ERShJQ1JOTCwJY19pZmxhZywgMzYpCisjaWYgZGVmaW5lZChJVUNMQykKK1RUWU1PREUoSVVDTEMsCWNfaWZsYWcsIDM3KQorI2VuZGlmCitUVFlNT0RFKElYT04sCWNfaWZsYWcsIDM4KQorVFRZTU9ERShJWEFOWSwJY19pZmxhZywgMzkpCitUVFlNT0RFKElYT0ZGLAljX2lmbGFnLCA0MCkKKyNpZmRlZiBJTUFYQkVMCitUVFlNT0RFKElNQVhCRUwsY19pZmxhZywgNDEpCisjZW5kaWYgLyogSU1BWEJFTCAqLworCitUVFlNT0RFKElTSUcsCWNfbGZsYWcsIDUwKQorVFRZTU9ERShJQ0FOT04sCWNfbGZsYWcsIDUxKQorI2lmZGVmIFhDQVNFCitUVFlNT0RFKFhDQVNFLAljX2xmbGFnLCA1MikKKyNlbmRpZgorVFRZTU9ERShFQ0hPLAljX2xmbGFnLCA1MykKK1RUWU1PREUoRUNIT0UsCWNfbGZsYWcsIDU0KQorVFRZTU9ERShFQ0hPSywJY19sZmxhZywgNTUpCitUVFlNT0RFKEVDSE9OTCwJY19sZmxhZywgNTYpCitUVFlNT0RFKE5PRkxTSCwJY19sZmxhZywgNTcpCitUVFlNT0RFKFRPU1RPUCwJY19sZmxhZywgNTgpCisjaWZkZWYgSUVYVEVOCitUVFlNT0RFKElFWFRFTiwgY19sZmxhZywgNTkpCisjZW5kaWYgLyogSUVYVEVOICovCisjaWYgZGVmaW5lZChFQ0hPQ1RMKQorVFRZTU9ERShFQ0hPQ1RMLGNfbGZsYWcsIDYwKQorI2VuZGlmIC8qIEVDSE9DVEwgKi8KKyNpZmRlZiBFQ0hPS0UKK1RUWU1PREUoRUNIT0tFLAljX2xmbGFnLCA2MSkKKyNlbmRpZiAvKiBFQ0hPS0UgKi8KKyNpZiBkZWZpbmVkKFBFTkRJTikKK1RUWU1PREUoUEVORElOLAljX2xmbGFnLCA2MikKKyNlbmRpZiAvKiBQRU5ESU4gKi8KKworVFRZTU9ERShPUE9TVCwJY19vZmxhZywgNzApCisjaWYgZGVmaW5lZChPTENVQykKK1RUWU1PREUoT0xDVUMsCWNfb2ZsYWcsIDcxKQorI2VuZGlmCisjaWZkZWYgT05MQ1IKK1RUWU1PREUoT05MQ1IsCWNfb2ZsYWcsIDcyKQorI2VuZGlmCisjaWZkZWYgT0NSTkwKK1RUWU1PREUoT0NSTkwsCWNfb2ZsYWcsIDczKQorI2VuZGlmCisjaWZkZWYgT05PQ1IKK1RUWU1PREUoT05PQ1IsCWNfb2ZsYWcsIDc0KQorI2VuZGlmCisjaWZkZWYgT05MUkVUCitUVFlNT0RFKE9OTFJFVCwJY19vZmxhZywgNzUpCisjZW5kaWYKKworVFRZTU9ERShDUzcsCWNfY2ZsYWcsIDkwKQorVFRZTU9ERShDUzgsCWNfY2ZsYWcsIDkxKQorVFRZTU9ERShQQVJFTkIsCWNfY2ZsYWcsIDkyKQorVFRZTU9ERShQQVJPREQsCWNfY2ZsYWcsIDkzKQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS91aWRzd2FwLmMgYi9vcGVuc3NoLTYuMHAxL3VpZHN3YXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzc2NDgzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS91aWRzd2FwLmMKQEAgLTAsMCArMSwyODggQEAKKy8qICRPcGVuQlNEOiB1aWRzd2FwLmMsdiAxLjM1IDIwMDYvMDgvMDMgMDM6MzQ6NDIgZGVyYWFkdCBFeHAgJCAqLworLyoKKyAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAorICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIENvZGUgZm9yIHVpZC1zd2FwcGluZy4KKyAqCisgKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCisgKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcworICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcworICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQorICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgPGdycC5oPgorCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAidWlkc3dhcC5oIgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKworLyoKKyAqIE5vdGU6IGFsbCB0aGVzZSBmdW5jdGlvbnMgbXVzdCB3b3JrIGluIGFsbCBvZiB0aGUgZm9sbG93aW5nIGNhc2VzOgorICogICAgMS4gZXVpZD0wLCBydWlkPTAKKyAqICAgIDIuIGV1aWQ9MCwgcnVpZCE9MAorICogICAgMy4gZXVpZCE9MCwgcnVpZCE9MAorICogQWRkaXRpb25hbGx5LCB0aGV5IG11c3Qgd29yayByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHN5c3RlbSBoYXMKKyAqIFBPU0lYIHNhdmVkIHVpZHMgb3Igbm90LgorICovCisKKyNpZiBkZWZpbmVkKF9QT1NJWF9TQVZFRF9JRFMpICYmICFkZWZpbmVkKEJST0tFTl9TQVZFRF9VSURTKQorLyogTGV0cyBhc3N1bWUgdGhhdCBwb3NpeCBzYXZlZCBpZHMgYWxzbyB3b3JrIHdpdGggc2V0ZXVpZCwgZXZlbiB0aG91Z2ggdGhhdAorICAgaXMgbm90IHBhcnQgb2YgdGhlIHBvc2l4IHNwZWNpZmljYXRpb24uICovCisjZGVmaW5lIFNBVkVEX0lEU19XT1JLX1dJVEhfU0VURVVJRAorLyogU2F2ZWQgZWZmZWN0aXZlIHVpZC4gKi8KK3N0YXRpYyB1aWRfdCAJc2F2ZWRfZXVpZCA9IDA7CitzdGF0aWMgZ2lkX3QJc2F2ZWRfZWdpZCA9IDA7CisjZW5kaWYKKworLyogU2F2ZWQgZWZmZWN0aXZlIHVpZC4gKi8KK3N0YXRpYyBpbnQJcHJpdmlsZWdlZCA9IDA7CitzdGF0aWMgaW50CXRlbXBvcmFyaWx5X3VzZV91aWRfZWZmZWN0aXZlID0gMDsKK3N0YXRpYyBnaWRfdAkqc2F2ZWRfZWdyb3VwcyA9IE5VTEwsICp1c2VyX2dyb3VwcyA9IE5VTEw7CitzdGF0aWMgaW50CXNhdmVkX2Vncm91cHNsZW4gPSAtMSwgdXNlcl9ncm91cHNsZW4gPSAtMTsKKworLyoKKyAqIFRlbXBvcmFyaWx5IGNoYW5nZXMgdG8gdGhlIGdpdmVuIHVpZC4gIElmIHRoZSBlZmZlY3RpdmUgdXNlcgorICogaWQgaXMgbm90IHJvb3QsIHRoaXMgZG9lcyBub3RoaW5nLiAgVGhpcyBjYWxsIGNhbm5vdCBiZSBuZXN0ZWQuCisgKi8KK3ZvaWQKK3RlbXBvcmFyaWx5X3VzZV91aWQoc3RydWN0IHBhc3N3ZCAqcHcpCit7CisJLyogU2F2ZSB0aGUgY3VycmVudCBldWlkLCBhbmQgZWdyb3Vwcy4gKi8KKyNpZmRlZiBTQVZFRF9JRFNfV09SS19XSVRIX1NFVEVVSUQKKwlzYXZlZF9ldWlkID0gZ2V0ZXVpZCgpOworCXNhdmVkX2VnaWQgPSBnZXRlZ2lkKCk7CisJZGVidWcoInRlbXBvcmFyaWx5X3VzZV91aWQ6ICV1LyV1IChlPSV1LyV1KSIsCisJICAgICh1X2ludClwdy0+cHdfdWlkLCAodV9pbnQpcHctPnB3X2dpZCwKKwkgICAgKHVfaW50KXNhdmVkX2V1aWQsICh1X2ludClzYXZlZF9lZ2lkKTsKKyNpZm5kZWYgSEFWRV9DWUdXSU4KKwlpZiAoc2F2ZWRfZXVpZCAhPSAwKSB7CisJCXByaXZpbGVnZWQgPSAwOworCQlyZXR1cm47CisJfQorI2VuZGlmCisjZWxzZQorCWlmIChnZXRldWlkKCkgIT0gMCkgeworCQlwcml2aWxlZ2VkID0gMDsKKwkJcmV0dXJuOworCX0KKyNlbmRpZiAvKiBTQVZFRF9JRFNfV09SS19XSVRIX1NFVEVVSUQgKi8KKworCXByaXZpbGVnZWQgPSAxOworCXRlbXBvcmFyaWx5X3VzZV91aWRfZWZmZWN0aXZlID0gMTsKKworCXNhdmVkX2Vncm91cHNsZW4gPSBnZXRncm91cHMoMCwgTlVMTCk7CisJaWYgKHNhdmVkX2Vncm91cHNsZW4gPCAwKQorCQlmYXRhbCgiZ2V0Z3JvdXBzOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCWlmIChzYXZlZF9lZ3JvdXBzbGVuID4gMCkgeworCQlzYXZlZF9lZ3JvdXBzID0geHJlYWxsb2Moc2F2ZWRfZWdyb3VwcywKKwkJICAgIHNhdmVkX2Vncm91cHNsZW4sIHNpemVvZihnaWRfdCkpOworCQlpZiAoZ2V0Z3JvdXBzKHNhdmVkX2Vncm91cHNsZW4sIHNhdmVkX2Vncm91cHMpIDwgMCkKKwkJCWZhdGFsKCJnZXRncm91cHM6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7CisJfSBlbHNlIHsgLyogc2F2ZWRfZWdyb3Vwc2xlbiA9PSAwICovCisJCWlmIChzYXZlZF9lZ3JvdXBzICE9IE5VTEwpCisJCQl4ZnJlZShzYXZlZF9lZ3JvdXBzKTsKKwl9CisKKwkvKiBzZXQgYW5kIHNhdmUgdGhlIHVzZXIncyBncm91cHMgKi8KKwlpZiAodXNlcl9ncm91cHNsZW4gPT0gLTEpIHsKKwkJaWYgKGluaXRncm91cHMocHctPnB3X25hbWUsIHB3LT5wd19naWQpIDwgMCkKKwkJCWZhdGFsKCJpbml0Z3JvdXBzOiAlczogJS4xMDBzIiwgcHctPnB3X25hbWUsCisJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKworCQl1c2VyX2dyb3Vwc2xlbiA9IGdldGdyb3VwcygwLCBOVUxMKTsKKwkJaWYgKHVzZXJfZ3JvdXBzbGVuIDwgMCkKKwkJCWZhdGFsKCJnZXRncm91cHM6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWlmICh1c2VyX2dyb3Vwc2xlbiA+IDApIHsKKwkJCXVzZXJfZ3JvdXBzID0geHJlYWxsb2ModXNlcl9ncm91cHMsCisJCQkgICAgdXNlcl9ncm91cHNsZW4sIHNpemVvZihnaWRfdCkpOworCQkJaWYgKGdldGdyb3Vwcyh1c2VyX2dyb3Vwc2xlbiwgdXNlcl9ncm91cHMpIDwgMCkKKwkJCQlmYXRhbCgiZ2V0Z3JvdXBzOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCQl9IGVsc2UgeyAvKiB1c2VyX2dyb3Vwc2xlbiA9PSAwICovCisJCQlpZiAodXNlcl9ncm91cHMpCisJCQkJeGZyZWUodXNlcl9ncm91cHMpOworCQl9CisJfQorCS8qIFNldCB0aGUgZWZmZWN0aXZlIHVpZCB0byB0aGUgZ2l2ZW4gKHVucHJpdmlsZWdlZCkgdWlkLiAqLworCWlmIChzZXRncm91cHModXNlcl9ncm91cHNsZW4sIHVzZXJfZ3JvdXBzKSA8IDApCisJCWZhdGFsKCJzZXRncm91cHM6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7CisjaWZuZGVmIFNBVkVEX0lEU19XT1JLX1dJVEhfU0VURVVJRAorCS8qIFByb3BhZ2F0ZSB0aGUgcHJpdmlsZWdlZCBnaWQgdG8gYWxsIG9mIG91ciBnaWRzLiAqLworCWlmIChzZXRnaWQoZ2V0ZWdpZCgpKSA8IDApCisJCWRlYnVnKCJzZXRnaWQgJXU6ICUuMTAwcyIsICh1X2ludCkgZ2V0ZWdpZCgpLCBzdHJlcnJvcihlcnJubykpOworCS8qIFByb3BhZ2F0ZSB0aGUgcHJpdmlsZWdlZCB1aWQgdG8gYWxsIG9mIG91ciB1aWRzLiAqLworCWlmIChzZXR1aWQoZ2V0ZXVpZCgpKSA8IDApCisJCWRlYnVnKCJzZXR1aWQgJXU6ICUuMTAwcyIsICh1X2ludCkgZ2V0ZXVpZCgpLCBzdHJlcnJvcihlcnJubykpOworI2VuZGlmIC8qIFNBVkVEX0lEU19XT1JLX1dJVEhfU0VURVVJRCAqLworCWlmIChzZXRlZ2lkKHB3LT5wd19naWQpIDwgMCkKKwkJZmF0YWwoInNldGVnaWQgJXU6ICUuMTAwcyIsICh1X2ludClwdy0+cHdfZ2lkLAorCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwlpZiAoc2V0ZXVpZChwdy0+cHdfdWlkKSA9PSAtMSkKKwkJZmF0YWwoInNldGV1aWQgJXU6ICUuMTAwcyIsICh1X2ludClwdy0+cHdfdWlkLAorCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKK30KKwordm9pZAorcGVybWFuZW50bHlfZHJvcF9zdWlkKHVpZF90IHVpZCkKK3sKKwl1aWRfdCBvbGRfdWlkID0gZ2V0dWlkKCk7CisKKwlkZWJ1ZygicGVybWFuZW50bHlfZHJvcF9zdWlkOiAldSIsICh1X2ludCl1aWQpOworI2lmIGRlZmluZWQoSEFWRV9TRVRSRVNVSUQpICYmICFkZWZpbmVkKEJST0tFTl9TRVRSRVNVSUQpCisJaWYgKHNldHJlc3VpZCh1aWQsIHVpZCwgdWlkKSA8IDApCisJCWZhdGFsKCJzZXRyZXN1aWQgJXU6ICUuMTAwcyIsICh1X2ludCl1aWQsIHN0cmVycm9yKGVycm5vKSk7CisjZWxpZiBkZWZpbmVkKEhBVkVfU0VUUkVVSUQpICYmICFkZWZpbmVkKEJST0tFTl9TRVRSRVVJRCkKKwlpZiAoc2V0cmV1aWQodWlkLCB1aWQpIDwgMCkKKwkJZmF0YWwoInNldHJldWlkICV1OiAlLjEwMHMiLCAodV9pbnQpdWlkLCBzdHJlcnJvcihlcnJubykpOworI2Vsc2UKKyMgaWZuZGVmIFNFVEVVSURfQlJFQUtTX1NFVFVJRAorCWlmIChzZXRldWlkKHVpZCkgPCAwKQorCQlmYXRhbCgic2V0ZXVpZCAldTogJS4xMDBzIiwgKHVfaW50KXVpZCwgc3RyZXJyb3IoZXJybm8pKTsKKyMgZW5kaWYKKwlpZiAoc2V0dWlkKHVpZCkgPCAwKQorCQlmYXRhbCgic2V0dWlkICV1OiAlLjEwMHMiLCAodV9pbnQpdWlkLCBzdHJlcnJvcihlcnJubykpOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9DWUdXSU4KKwkvKiBUcnkgcmVzdG9yYXRpb24gb2YgVUlEIGlmIGNoYW5nZWQgKHRlc3QgY2xlYXJpbmcgb2Ygc2F2ZWQgdWlkKSAqLworCWlmIChvbGRfdWlkICE9IHVpZCAmJgorCSAgICAoc2V0dWlkKG9sZF91aWQpICE9IC0xIHx8IHNldGV1aWQob2xkX3VpZCkgIT0gLTEpKQorCQlmYXRhbCgiJXM6IHdhcyBhYmxlIHRvIHJlc3RvcmUgb2xkIFtlXXVpZCIsIF9fZnVuY19fKTsKKyNlbmRpZgorCisJLyogVmVyaWZ5IFVJRCBkcm9wIHdhcyBzdWNjZXNzZnVsICovCisJaWYgKGdldHVpZCgpICE9IHVpZCB8fCBnZXRldWlkKCkgIT0gdWlkKSB7CisJCWZhdGFsKCIlczogZXVpZCBpbmNvcnJlY3QgdWlkOiV1IGV1aWQ6JXUgKHNob3VsZCBiZSAldSkiLAorCQkgICAgX19mdW5jX18sICh1X2ludClnZXR1aWQoKSwgKHVfaW50KWdldGV1aWQoKSwgKHVfaW50KXVpZCk7CisJfQorfQorCisvKgorICogUmVzdG9yZXMgdG8gdGhlIG9yaWdpbmFsIChwcml2aWxlZ2VkKSB1aWQuCisgKi8KK3ZvaWQKK3Jlc3RvcmVfdWlkKHZvaWQpCit7CisJLyogaXQncyBhIG5vLW9wIHVubGVzcyBwcml2aWxlZ2VkICovCisJaWYgKCFwcml2aWxlZ2VkKSB7CisJCWRlYnVnKCJyZXN0b3JlX3VpZDogKHVucHJpdmlsZWdlZCkiKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIXRlbXBvcmFyaWx5X3VzZV91aWRfZWZmZWN0aXZlKQorCQlmYXRhbCgicmVzdG9yZV91aWQ6IHRlbXBvcmFyaWx5X3VzZV91aWQgbm90IGVmZmVjdGl2ZSIpOworCisjaWZkZWYgU0FWRURfSURTX1dPUktfV0lUSF9TRVRFVUlECisJZGVidWcoInJlc3RvcmVfdWlkOiAldS8ldSIsICh1X2ludClzYXZlZF9ldWlkLCAodV9pbnQpc2F2ZWRfZWdpZCk7CisJLyogU2V0IHRoZSBlZmZlY3RpdmUgdWlkIGJhY2sgdG8gdGhlIHNhdmVkIHByaXZpbGVnZWQgdWlkLiAqLworCWlmIChzZXRldWlkKHNhdmVkX2V1aWQpIDwgMCkKKwkJZmF0YWwoInNldGV1aWQgJXU6ICUuMTAwcyIsICh1X2ludClzYXZlZF9ldWlkLCBzdHJlcnJvcihlcnJubykpOworCWlmIChzZXRlZ2lkKHNhdmVkX2VnaWQpIDwgMCkKKwkJZmF0YWwoInNldGVnaWQgJXU6ICUuMTAwcyIsICh1X2ludClzYXZlZF9lZ2lkLCBzdHJlcnJvcihlcnJubykpOworI2Vsc2UgLyogU0FWRURfSURTX1dPUktfV0lUSF9TRVRFVUlEICovCisJLyoKKwkgKiBXZSBhcmUgdW5hYmxlIHRvIHJlc3RvcmUgdGhlIHJlYWwgdWlkIHRvIGl0cyB1bnByaXZpbGVnZWQgdmFsdWUuCisJICogUHJvcGFnYXRlIHRoZSByZWFsIHVpZCAodXN1YWxseSBtb3JlIHByaXZpbGVnZWQpIHRvIGVmZmVjdGl2ZSB1aWQKKwkgKiBhcyB3ZWxsLgorCSAqLworCXNldHVpZChnZXR1aWQoKSk7CisJc2V0Z2lkKGdldGdpZCgpKTsKKyNlbmRpZiAvKiBTQVZFRF9JRFNfV09SS19XSVRIX1NFVEVVSUQgKi8KKworCWlmIChzZXRncm91cHMoc2F2ZWRfZWdyb3Vwc2xlbiwgc2F2ZWRfZWdyb3VwcykgPCAwKQorCQlmYXRhbCgic2V0Z3JvdXBzOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOworCXRlbXBvcmFyaWx5X3VzZV91aWRfZWZmZWN0aXZlID0gMDsKK30KKworLyoKKyAqIFBlcm1hbmVudGx5IHNldHMgYWxsIHVpZHMgdG8gdGhlIGdpdmVuIHVpZC4gIFRoaXMgY2Fubm90IGJlCisgKiBjYWxsZWQgd2hpbGUgdGVtcG9yYXJpbHlfdXNlX3VpZCBpcyBlZmZlY3RpdmUuCisgKi8KK3ZvaWQKK3Blcm1hbmVudGx5X3NldF91aWQoc3RydWN0IHBhc3N3ZCAqcHcpCit7CisJdWlkX3Qgb2xkX3VpZCA9IGdldHVpZCgpOworCWdpZF90IG9sZF9naWQgPSBnZXRnaWQoKTsKKworCWlmIChwdyA9PSBOVUxMKQorCQlmYXRhbCgicGVybWFuZW50bHlfc2V0X3VpZDogbm8gdXNlciBnaXZlbiIpOworCWlmICh0ZW1wb3JhcmlseV91c2VfdWlkX2VmZmVjdGl2ZSkKKwkJZmF0YWwoInBlcm1hbmVudGx5X3NldF91aWQ6IHRlbXBvcmFyaWx5X3VzZV91aWQgZWZmZWN0aXZlIik7CisJZGVidWcoInBlcm1hbmVudGx5X3NldF91aWQ6ICV1LyV1IiwgKHVfaW50KXB3LT5wd191aWQsCisJICAgICh1X2ludClwdy0+cHdfZ2lkKTsKKworI2lmIGRlZmluZWQoSEFWRV9TRVRSRVNHSUQpICYmICFkZWZpbmVkKEJST0tFTl9TRVRSRVNHSUQpCisJaWYgKHNldHJlc2dpZChwdy0+cHdfZ2lkLCBwdy0+cHdfZ2lkLCBwdy0+cHdfZ2lkKSA8IDApCisJCWZhdGFsKCJzZXRyZXNnaWQgJXU6ICUuMTAwcyIsICh1X2ludClwdy0+cHdfZ2lkLCBzdHJlcnJvcihlcnJubykpOworI2VsaWYgZGVmaW5lZChIQVZFX1NFVFJFR0lEKSAmJiAhZGVmaW5lZChCUk9LRU5fU0VUUkVHSUQpCisJaWYgKHNldHJlZ2lkKHB3LT5wd19naWQsIHB3LT5wd19naWQpIDwgMCkKKwkJZmF0YWwoInNldHJlZ2lkICV1OiAlLjEwMHMiLCAodV9pbnQpcHctPnB3X2dpZCwgc3RyZXJyb3IoZXJybm8pKTsKKyNlbHNlCisJaWYgKHNldGVnaWQocHctPnB3X2dpZCkgPCAwKQorCQlmYXRhbCgic2V0ZWdpZCAldTogJS4xMDBzIiwgKHVfaW50KXB3LT5wd19naWQsIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKHNldGdpZChwdy0+cHdfZ2lkKSA8IDApCisJCWZhdGFsKCJzZXRnaWQgJXU6ICUuMTAwcyIsICh1X2ludClwdy0+cHdfZ2lkLCBzdHJlcnJvcihlcnJubykpOworI2VuZGlmCisKKyNpZmRlZiBfX0FQUExFX18KKwkvKgorCSAqIE9TIFggcmVxdWlyZXMgaW5pdGdyb3VwcyBhZnRlciBzZXRnaWQgdG8gb3B0IGJhY2sgaW50bworCSAqIG1lbWJlcmQgc3VwcG9ydCBmb3IgPjE2IHN1cHBsZW1lbnRhbCBncm91cHMuCisJICovCisJaWYgKGluaXRncm91cHMocHctPnB3X25hbWUsIHB3LT5wd19naWQpIDwgMCkKKwkJZmF0YWwoImluaXRncm91cHMgJS4xMDBzICV1OiAlLjEwMHMiLAorCQkgICAgcHctPnB3X25hbWUsICh1X2ludClwdy0+cHdfZ2lkLCBzdHJlcnJvcihlcnJubykpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhBVkVfU0VUUkVTVUlEKSAmJiAhZGVmaW5lZChCUk9LRU5fU0VUUkVTVUlEKQorCWlmIChzZXRyZXN1aWQocHctPnB3X3VpZCwgcHctPnB3X3VpZCwgcHctPnB3X3VpZCkgPCAwKQorCQlmYXRhbCgic2V0cmVzdWlkICV1OiAlLjEwMHMiLCAodV9pbnQpcHctPnB3X3VpZCwgc3RyZXJyb3IoZXJybm8pKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9TRVRSRVVJRCkgJiYgIWRlZmluZWQoQlJPS0VOX1NFVFJFVUlEKQorCWlmIChzZXRyZXVpZChwdy0+cHdfdWlkLCBwdy0+cHdfdWlkKSA8IDApCisJCWZhdGFsKCJzZXRyZXVpZCAldTogJS4xMDBzIiwgKHVfaW50KXB3LT5wd191aWQsIHN0cmVycm9yKGVycm5vKSk7CisjZWxzZQorIyBpZm5kZWYgU0VURVVJRF9CUkVBS1NfU0VUVUlECisJaWYgKHNldGV1aWQocHctPnB3X3VpZCkgPCAwKQorCQlmYXRhbCgic2V0ZXVpZCAldTogJS4xMDBzIiwgKHVfaW50KXB3LT5wd191aWQsIHN0cmVycm9yKGVycm5vKSk7CisjIGVuZGlmCisJaWYgKHNldHVpZChwdy0+cHdfdWlkKSA8IDApCisJCWZhdGFsKCJzZXR1aWQgJXU6ICUuMTAwcyIsICh1X2ludClwdy0+cHdfdWlkLCBzdHJlcnJvcihlcnJubykpOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9DWUdXSU4KKwkvKiBUcnkgcmVzdG9yYXRpb24gb2YgR0lEIGlmIGNoYW5nZWQgKHRlc3QgY2xlYXJpbmcgb2Ygc2F2ZWQgZ2lkKSAqLworCWlmIChvbGRfZ2lkICE9IHB3LT5wd19naWQgJiYgcHctPnB3X3VpZCAhPSAwICYmCisJICAgIChzZXRnaWQob2xkX2dpZCkgIT0gLTEgfHwgc2V0ZWdpZChvbGRfZ2lkKSAhPSAtMSkpCisJCWZhdGFsKCIlczogd2FzIGFibGUgdG8gcmVzdG9yZSBvbGQgW2VdZ2lkIiwgX19mdW5jX18pOworI2VuZGlmCisKKwkvKiBWZXJpZnkgR0lEIGRyb3Agd2FzIHN1Y2Nlc3NmdWwgKi8KKwlpZiAoZ2V0Z2lkKCkgIT0gcHctPnB3X2dpZCB8fCBnZXRlZ2lkKCkgIT0gcHctPnB3X2dpZCkgeworCQlmYXRhbCgiJXM6IGVnaWQgaW5jb3JyZWN0IGdpZDoldSBlZ2lkOiV1IChzaG91bGQgYmUgJXUpIiwKKwkJICAgIF9fZnVuY19fLCAodV9pbnQpZ2V0Z2lkKCksICh1X2ludClnZXRlZ2lkKCksCisJCSAgICAodV9pbnQpcHctPnB3X2dpZCk7CisJfQorCisjaWZuZGVmIEhBVkVfQ1lHV0lOCisJLyogVHJ5IHJlc3RvcmF0aW9uIG9mIFVJRCBpZiBjaGFuZ2VkICh0ZXN0IGNsZWFyaW5nIG9mIHNhdmVkIHVpZCkgKi8KKwlpZiAob2xkX3VpZCAhPSBwdy0+cHdfdWlkICYmCisJICAgIChzZXR1aWQob2xkX3VpZCkgIT0gLTEgfHwgc2V0ZXVpZChvbGRfdWlkKSAhPSAtMSkpCisJCWZhdGFsKCIlczogd2FzIGFibGUgdG8gcmVzdG9yZSBvbGQgW2VddWlkIiwgX19mdW5jX18pOworI2VuZGlmCisKKwkvKiBWZXJpZnkgVUlEIGRyb3Agd2FzIHN1Y2Nlc3NmdWwgKi8KKwlpZiAoZ2V0dWlkKCkgIT0gcHctPnB3X3VpZCB8fCBnZXRldWlkKCkgIT0gcHctPnB3X3VpZCkgeworCQlmYXRhbCgiJXM6IGV1aWQgaW5jb3JyZWN0IHVpZDoldSBldWlkOiV1IChzaG91bGQgYmUgJXUpIiwKKwkJICAgIF9fZnVuY19fLCAodV9pbnQpZ2V0dWlkKCksICh1X2ludClnZXRldWlkKCksCisJCSAgICAodV9pbnQpcHctPnB3X3VpZCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS91aWRzd2FwLmggYi9vcGVuc3NoLTYuMHAxL3VpZHN3YXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzExNjNkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS91aWRzd2FwLmgKQEAgLTAsMCArMSwxOCBAQAorLyogJE9wZW5CU0Q6IHVpZHN3YXAuaCx2IDEuMTMgMjAwNi8wOC8wMyAwMzozNDo0MiBkZXJhYWR0IEV4cCAkICovCisKKy8qCisgKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKKyAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqLworCit2b2lkCSB0ZW1wb3JhcmlseV91c2VfdWlkKHN0cnVjdCBwYXNzd2QgKik7Cit2b2lkCSByZXN0b3JlX3VpZCh2b2lkKTsKK3ZvaWQJIHBlcm1hbmVudGx5X3NldF91aWQoc3RydWN0IHBhc3N3ZCAqKTsKK3ZvaWQJIHBlcm1hbmVudGx5X2Ryb3Bfc3VpZCh1aWRfdCk7CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3VtYWMuYyBiL29wZW5zc2gtNi4wcDEvdW1hYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OGQyY2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3VtYWMuYwpAQCAtMCwwICsxLDEyNzcgQEAKKy8qICRPcGVuQlNEOiB1bWFjLmMsdiAxLjQgMjAxMS8xMC8xOSAxMDozOTo0OCBkam0gRXhwICQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAKKyAqIHVtYWMuYyAtLSBDIEltcGxlbWVudGF0aW9uIFVNQUMgTWVzc2FnZSBBdXRoZW50aWNhdGlvbgorICoKKyAqIFZlcnNpb24gMC45M2Igb2YgcmZjNDQxOC50eHQgLS0gMjAwNiBKdWx5IDE4CisgKgorICogRm9yIGEgZnVsbCBkZXNjcmlwdGlvbiBvZiBVTUFDIG1lc3NhZ2UgYXV0aGVudGljYXRpb24gc2VlIHRoZSBVTUFDCisgKiB3b3JsZC13aWRlLXdlYiBwYWdlIGF0IGh0dHA6Ly93d3cuY3MudWNkYXZpcy5lZHUvfnJvZ2F3YXkvdW1hYworICogUGxlYXNlIHJlcG9ydCBidWdzIGFuZCBzdWdnZXN0aW9ucyB0byB0aGUgVU1BQyB3ZWJwYWdlLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA2IFRlZCBLcm92ZXR6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRoIG9yIHdpdGhvdXQgZmVlLCBpcyBoZXJlYnkKKyAqIGdyYW50ZWQgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMKKyAqIGFuZCBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQKKyAqIGhvbGRlciBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0bworICogZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisgKgorICogQ29tbWVudHMgc2hvdWxkIGJlIGRpcmVjdGVkIHRvIFRlZCBLcm92ZXR6ICh0ZGtAYWNtLm9yZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAKKyAvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vIElNUE9SVEFOVCBOT1RFUyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgKgorICAqIDEpIFRoaXMgdmVyc2lvbiBkb2VzIG5vdCB3b3JrIHByb3Blcmx5IG9uIG1lc3NhZ2VzIGxhcmdlciB0aGFuIDE2TUIKKyAgKgorICAqIDIpIElmIHlvdSBzZXQgdGhlIHN3aXRjaCB0byB1c2UgU1NFMiwgdGhlbiBhbGwgZGF0YSBtdXN0IGJlIDE2LWJ5dGUKKyAgKiAgICBhbGlnbmVkCisgICoKKyAgKiAzKSBXaGVuIGNhbGxpbmcgdGhlIGZ1bmN0aW9uIHVtYWMoKSwgaXQgaXMgYXNzdW1lZCB0aGF0IG1zZyBpcyBpbgorICAqIGEgd3JpdGFibGUgYnVmZmVyIG9mIGxlbmd0aCBkaXZpc2libGUgYnkgMzIgYnl0ZXMuIFRoZSBtZXNzYWdlIGl0c2VsZgorICAqIGRvZXMgbm90IGhhdmUgdG8gZmlsbCB0aGUgZW50aXJlIGJ1ZmZlciwgYnV0IGJ5dGVzIGJleW9uZCBtc2cgbWF5IGJlCisgICogemVyb2VkLgorICAqCisgICogNCkgVGhyZWUgZnJlZSBBRVMgaW1wbGVtZW50YXRpb25zIGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbiBvZgorICAqIFVNQUMuIFBhdWxvIEJhcnJldG8ncyB2ZXJzaW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluIGFuZCBjYW4gYmUgZm91bmQKKyAgKiBhdCBodHRwOi8vd3d3LmVzYXQua3VsZXV2ZW4uYWMuYmUvfnJpam1lbi9yaWpuZGFlbC8gKHNlYXJjaCBmb3IKKyAgKiAiQmFycmV0byIpLiBUaGUgb25seSB0d28gZmlsZXMgbmVlZGVkIGFyZSByaWpuZGFlbC1hbGctZnN0LmMgYW5kCisgICogcmlqbmRhZWwtYWxnLWZzdC5oLiBCcmlhbiBHbGFkbWFuJ3MgdmVyc2lvbiBpcyBkaXN0cmlidXRlZCB3aXRoIHRoZSBHTlUKKyAgKiBQdWJsaWMgbGlzZW5jZSBhdCBodHRwOi8vZnAuZ2xhZG1hbi5wbHVzLmNvbS9BRVMvaW5kZXguaHRtLiBJdAorICAqIGluY2x1ZGVzIGEgZmFzdCBJQS0zMiBhc3NlbWJseSB2ZXJzaW9uLiBUaGUgT3BlblNTTCBjcnlwbyBsaWJyYXJ5IGlzCisgICogdGhlIHRoaXJkLgorICAqCisgICogNSkgV2l0aCBGT1JDRV9DX09OTFkgZmxhZ3Mgc2V0IHRvIDAsIGluY29ycmVjdCByZXN1bHRzIGFyZSBzb21ldGltZXMKKyAgKiBwcm9kdWNlZCB1bmRlciBnY2Mgd2l0aCBvcHRpbWl6YXRpb25zIHNldCAtTzMgb3IgaGlnaGVyLiBEdW5ubyB3aHkuCisgICoKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKyAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLSBVc2VyIFN3aXRjaGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBVTUFDX09VVFBVVF9MRU4gICAgIDggIC8qIEFsb3dhYmxlOiA0LCA4LCAxMiwgMTYgICAgICAgICAgICAgICAgICAqLworLyogI2RlZmluZSBGT1JDRV9DX09OTFkgICAgICAgIDEgIEFOU0kgQyBhbmQgNjQtYml0IGludGVnZXJzIHJlcSdkICAgICAgICAqLworLyogI2RlZmluZSBBRVNfSU1QTEVNRU5UQUlPTiAgIDEgIDEgPSBPcGVuU1NMLCAyID0gQmFycmV0bywgMyA9IEdsYWRtYW4gICAqLworLyogI2RlZmluZSBTU0UyICAgICAgICAgICAgICAgIDAgIElzIFNTRTIgaXMgYXZhaWxhYmxlPyAgICAgICAgICAgICAgICAgICAqLworLyogI2RlZmluZSBSVU5fVEVTVFMgICAgICAgICAgIDAgIFJ1biBiYXNpYyBjb3JyZWN0bmVzcy9zcGVlZCB0ZXN0cyAgICAgICAqLworLyogI2RlZmluZSBVTUFDX0FFX1NVUFBPUlQgICAgIDAgIEVuYWJsZSBhdWh0aGVudGljYXRlZCBlbmNyeXRpb24gICAgICAgICAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLSBHbG9iYWwgSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgInVtYWMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tIFByaW1pdGl2ZSBEYXRhIFR5cGVzIC0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBUaGUgZm9sbG93aW5nIGFzc3VtcHRpb25zIG1heSBuZWVkIGNoYW5nZSBvbiB5b3VyIHN5c3RlbSAqLwordHlwZWRlZiB1X2ludDhfdAlVSU5UODsgIC8qIDEgYnl0ZSAgICovCit0eXBlZGVmIHVfaW50MTZfdAlVSU5UMTY7IC8qIDIgYnl0ZSAgICovCit0eXBlZGVmIHVfaW50MzJfdAlVSU5UMzI7IC8qIDQgYnl0ZSAgICovCit0eXBlZGVmIHVfaW50NjRfdAlVSU5UNjQ7IC8qIDggYnl0ZXMgICovCit0eXBlZGVmIHVuc2lnbmVkIGludAlVV09SRDsgIC8qIFJlZ2lzdGVyICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLSBDb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBVTUFDX0tFWV9MRU4gICAgICAgICAgIDE2ICAvKiBVTUFDIHRha2VzIDE2IGJ5dGVzIG9mIGV4dGVybmFsIGtleSAqLworCisvKiBNZXNzYWdlICJ3b3JkcyIgYXJlIHJlYWQgZnJvbSBtZW1vcnkgaW4gYW4gZW5kaWFuLXNwZWNpZmljIG1hbm5lci4gICAgICovCisvKiBGb3IgdGhpcyBpbXBsZW1lbnRhdGlvbiB0byBiZWhhdmUgY29ycmVjdGx5LCBfX0xJVFRMRV9FTkRJQU5fXyBtdXN0ICAgICovCisvKiBiZSBzZXQgdHJ1ZSBpZiB0aGUgaG9zdCBjb21wdXRlciBpcyBsaXR0bGUtZW5kaWFuLiAgICAgICAgICAgICAgICAgICAgICovCisKKyNpZiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4KKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOX18gMQorI2Vsc2UKKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOX18gMAorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tIEFyY2hpdGVjdHVyZSBTcGVjaWZpYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLSBQcmltaXRpdmUgUm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tIDMyLWJpdCBieSAzMi1iaXQgdG8gNjQtYml0IE11bHRpcGxpY2F0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE1VTDY0KGEsYikgKChVSU5UNjQpKChVSU5UNjQpKFVJTlQzMikoYSkgKiAoVUlOVDY0KShVSU5UMzIpKGIpKSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tIEVuZGlhbiBDb252ZXJzaW9uIC0tLSBGb3JjaW5nIGFzc2VtYmx5IG9uIHNvbWUgcGxhdGZvcm1zICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgSEFWRV9TV0FQMzIKKyNkZWZpbmUgTE9BRF9VSU5UMzJfUkVWRVJTRUQocCkJCShzd2FwMzIoKihVSU5UMzIgKikocCkpKQorI2RlZmluZSBTVE9SRV9VSU5UMzJfUkVWRVJTRUQocCx2KSAJKCooVUlOVDMyICopKHApID0gc3dhcDMyKHYpKQorI2Vsc2UgLyogSEFWRV9TV0FQMzIgKi8KKworc3RhdGljIFVJTlQzMiBMT0FEX1VJTlQzMl9SRVZFUlNFRCh2b2lkICpwdHIpCit7CisgICAgVUlOVDMyIHRlbXAgPSAqKFVJTlQzMiAqKXB0cjsKKyAgICB0ZW1wID0gKHRlbXAgPj4gMjQpIHwgKCh0ZW1wICYgMHgwMEZGMDAwMCkgPj4gOCApCisgICAgICAgICB8ICgodGVtcCAmIDB4MDAwMEZGMDApIDw8IDggKSB8ICh0ZW1wIDw8IDI0KTsKKyAgICByZXR1cm4gKFVJTlQzMil0ZW1wOworfQorCisjIGlmIChfX0xJVFRMRV9FTkRJQU5fXykKK3N0YXRpYyB2b2lkIFNUT1JFX1VJTlQzMl9SRVZFUlNFRCh2b2lkICpwdHIsIFVJTlQzMiB4KQoreworICAgIFVJTlQzMiBpID0gKFVJTlQzMil4OworICAgICooVUlOVDMyICopcHRyID0gKGkgPj4gMjQpIHwgKChpICYgMHgwMEZGMDAwMCkgPj4gOCApCisgICAgICAgICAgICAgICAgICAgfCAoKGkgJiAweDAwMDBGRjAwKSA8PCA4ICkgfCAoaSA8PCAyNCk7Cit9CisjIGVuZGlmIC8qIF9fTElUVExFX0VORElBTiAqLworI2VuZGlmIC8qIEhBVkVfU1dBUDMyICovCisKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgdXNlIHRoZSBhYm92ZSByZXZlcnNhbC1wcmltaXRpdmVzIHRvIGRvIHRoZSByaWdodAorICogdGhpbmcgb24gZW5kaWFuIHNwZWNpZmljIGxvYWQgYW5kIHN0b3Jlcy4KKyAqLworCisjaWYgKF9fTElUVExFX0VORElBTl9fKQorI2RlZmluZSBMT0FEX1VJTlQzMl9MSVRUTEUocHRyKSAgICAgKCooVUlOVDMyICopKHB0cikpCisjZGVmaW5lIFNUT1JFX1VJTlQzMl9CSUcocHRyLHgpICAgICBTVE9SRV9VSU5UMzJfUkVWRVJTRUQocHRyLHgpCisjZWxzZQorI2RlZmluZSBMT0FEX1VJTlQzMl9MSVRUTEUocHRyKSAgICAgTE9BRF9VSU5UMzJfUkVWRVJTRUQocHRyKQorI2RlZmluZSBTVE9SRV9VSU5UMzJfQklHKHB0cix4KSAgICAgKCooVUlOVDMyICopKHB0cikgPSAoVUlOVDMyKSh4KSkKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLSBCZWdpbiBLREYgJiBQREYgU2VjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFVNQUMgdXNlcyBBRVMgd2l0aCAxNiBieXRlIGJsb2NrIGFuZCBrZXkgbGVuZ3RocyAqLworI2RlZmluZSBBRVNfQkxPQ0tfTEVOICAxNgorCisvKiBPcGVuU1NMJ3MgQUVTICovCisjaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQuaCIKKyNpZm5kZWYgVVNFX0JVSUxUSU5fUklKTkRBRUwKKyMgaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KKyNlbmRpZgordHlwZWRlZiBBRVNfS0VZIGFlc19pbnRfa2V5WzFdOworI2RlZmluZSBhZXNfZW5jcnlwdGlvbihpbixvdXQsaW50X2tleSkgICAgICAgICAgICAgICAgICBcCisgIEFFU19lbmNyeXB0KCh1X2NoYXIgKikoaW4pLCh1X2NoYXIgKikob3V0KSwoQUVTX0tFWSAqKWludF9rZXkpCisjZGVmaW5lIGFlc19rZXlfc2V0dXAoa2V5LGludF9rZXkpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQUVTX3NldF9lbmNyeXB0X2tleSgodV9jaGFyICopKGtleSksVU1BQ19LRVlfTEVOKjgsaW50X2tleSkKKworLyogVGhlIHVzZXItc3VwcGxpZWQgVU1BQyBrZXkgaXMgc3RyZXRjaGVkIHVzaW5nIEFFUyBpbiBhIGNvdW50ZXIKKyAqIG1vZGUgdG8gc3VwcGx5IGFsbCByYW5kb20gYml0cyBuZWVkZWQgYnkgVU1BQy4gVGhlIGtkZiBmdW5jdGlvbiB0YWtlcworICogYW4gQUVTIGludGVybmFsIGtleSByZXByZXNlbnRhdGlvbiAna2V5JyBhbmQgd3JpdGVzIGEgc3RyZWFtIG9mCisgKiAnbmJ5dGVzJyBieXRlcyB0byB0aGUgbWVtb3J5IHBvaW50ZWQgYXQgYnkgJ2J1ZnAnLiBFYWNoIGRpc3RpbmN0CisgKiAnbmR4JyBjYXVzZXMgYSBkaXN0aW5jdCBieXRlIHN0cmVhbS4KKyAqLworc3RhdGljIHZvaWQga2RmKHZvaWQgKmJ1ZnAsIGFlc19pbnRfa2V5IGtleSwgVUlOVDggbmR4LCBpbnQgbmJ5dGVzKQoreworICAgIFVJTlQ4IGluX2J1ZltBRVNfQkxPQ0tfTEVOXSA9IHswfTsKKyAgICBVSU5UOCBvdXRfYnVmW0FFU19CTE9DS19MRU5dOworICAgIFVJTlQ4ICpkc3RfYnVmID0gKFVJTlQ4ICopYnVmcDsKKyAgICBpbnQgaTsKKyAgICAKKyAgICAvKiBTZXR1cCB0aGUgaW5pdGlhbCB2YWx1ZSAqLworICAgIGluX2J1ZltBRVNfQkxPQ0tfTEVOLTldID0gbmR4OworICAgIGluX2J1ZltBRVNfQkxPQ0tfTEVOLTFdID0gaSA9IDE7CisgICAgICAgIAorICAgIHdoaWxlIChuYnl0ZXMgPj0gQUVTX0JMT0NLX0xFTikgeworICAgICAgICBhZXNfZW5jcnlwdGlvbihpbl9idWYsIG91dF9idWYsIGtleSk7CisgICAgICAgIG1lbWNweShkc3RfYnVmLG91dF9idWYsQUVTX0JMT0NLX0xFTik7CisgICAgICAgIGluX2J1ZltBRVNfQkxPQ0tfTEVOLTFdID0gKytpOworICAgICAgICBuYnl0ZXMgLT0gQUVTX0JMT0NLX0xFTjsKKyAgICAgICAgZHN0X2J1ZiArPSBBRVNfQkxPQ0tfTEVOOworICAgIH0KKyAgICBpZiAobmJ5dGVzKSB7CisgICAgICAgIGFlc19lbmNyeXB0aW9uKGluX2J1Ziwgb3V0X2J1Ziwga2V5KTsKKyAgICAgICAgbWVtY3B5KGRzdF9idWYsb3V0X2J1ZixuYnl0ZXMpOworICAgIH0KK30KKworLyogVGhlIGZpbmFsIFVIQVNIIHJlc3VsdCBpcyBYT1InZCB3aXRoIHRoZSBvdXRwdXQgb2YgYSBwc2V1ZG9yYW5kb20KKyAqIGZ1bmN0aW9uLiBIZXJlLCB3ZSB1c2UgQUVTIHRvIGdlbmVyYXRlIHJhbmRvbSBvdXRwdXQgYW5kIAorICogeG9yIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBkZXBlbmRpbmcgb24gdGhlIGxhc3QgYml0cyBvZiBub25jZS4KKyAqIFRoaXMgc2NoZW1lIGlzIG9wdGltaXplZCBmb3Igc2VxdWVudGlhbCwgaW5jcmVhc2luZyBiaWctZW5kaWFuIG5vbmNlcy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDggY2FjaGVbQUVTX0JMT0NLX0xFTl07ICAvKiBQcmV2aW91cyBBRVMgb3V0cHV0IGlzIHNhdmVkICAgICAgKi8KKyAgICBVSU5UOCBub25jZVtBRVNfQkxPQ0tfTEVOXTsgIC8qIFRoZSBBRVMgaW5wdXQgbWFraW5nIGFib3ZlIGNhY2hlICAqLworICAgIGFlc19pbnRfa2V5IHByZl9rZXk7ICAgICAgICAgLyogRXhwYW5kZWQgQUVTIGtleSBmb3IgUERGICAgICAgICAgICovCit9IHBkZl9jdHg7CisKK3N0YXRpYyB2b2lkIHBkZl9pbml0KHBkZl9jdHggKnBjLCBhZXNfaW50X2tleSBwcmZfa2V5KQoreworICAgIFVJTlQ4IGJ1ZltVTUFDX0tFWV9MRU5dOworICAgIAorICAgIGtkZihidWYsIHByZl9rZXksIDAsIFVNQUNfS0VZX0xFTik7CisgICAgYWVzX2tleV9zZXR1cChidWYsIHBjLT5wcmZfa2V5KTsKKyAgICAKKyAgICAvKiBJbml0aWFsaXplIHBkZiBhbmQgY2FjaGUgKi8KKyAgICBtZW1zZXQocGMtPm5vbmNlLCAwLCBzaXplb2YocGMtPm5vbmNlKSk7CisgICAgYWVzX2VuY3J5cHRpb24ocGMtPm5vbmNlLCBwYy0+Y2FjaGUsIHBjLT5wcmZfa2V5KTsKK30KKworc3RhdGljIHZvaWQgcGRmX2dlbl94b3IocGRmX2N0eCAqcGMsIFVJTlQ4IG5vbmNlWzhdLCBVSU5UOCBidWZbOF0pCit7CisgICAgLyogJ25keCcgaW5kaWNhdGVzIHRoYXQgd2UnbGwgYmUgdXNpbmcgdGhlIDB0aCBvciAxc3QgZWlnaHQgYnl0ZXMKKyAgICAgKiBvZiB0aGUgQUVTIG91dHB1dC4gSWYgbGFzdCB0aW1lIGFyb3VuZCB3ZSByZXR1cm5lZCB0aGUgbmR4LTFzdAorICAgICAqIGVsZW1lbnQsIHRoZW4gd2UgbWF5IGhhdmUgdGhlIHJlc3VsdCBpbiB0aGUgY2FjaGUgYWxyZWFkeS4KKyAgICAgKi8KKyAgICAgCisjaWYgKFVNQUNfT1VUUFVUX0xFTiA9PSA0KQorI2RlZmluZSBMT1dfQklUX01BU0sgMworI2VsaWYgKFVNQUNfT1VUUFVUX0xFTiA9PSA4KQorI2RlZmluZSBMT1dfQklUX01BU0sgMQorI2VsaWYgKFVNQUNfT1VUUFVUX0xFTiA+IDgpCisjZGVmaW5lIExPV19CSVRfTUFTSyAwCisjZW5kaWYKKworICAgIFVJTlQ4IHRtcF9ub25jZV9sb1s0XTsKKyNpZiBMT1dfQklUX01BU0sgIT0gMAorICAgIGludCBuZHggPSBub25jZVs3XSAmIExPV19CSVRfTUFTSzsKKyNlbmRpZgorICAgICooVUlOVDMyICopdG1wX25vbmNlX2xvID0gKChVSU5UMzIgKilub25jZSlbMV07CisgICAgdG1wX25vbmNlX2xvWzNdICY9IH5MT1dfQklUX01BU0s7IC8qIHplcm8gbGFzdCBiaXQgKi8KKyAgICAKKyAgICBpZiAoICgoKFVJTlQzMiAqKXRtcF9ub25jZV9sbylbMF0gIT0gKChVSU5UMzIgKilwYy0+bm9uY2UpWzFdKSB8fAorICAgICAgICAgKCgoVUlOVDMyICopbm9uY2UpWzBdICE9ICgoVUlOVDMyICopcGMtPm5vbmNlKVswXSkgKQorICAgIHsKKyAgICAgICAgKChVSU5UMzIgKilwYy0+bm9uY2UpWzBdID0gKChVSU5UMzIgKilub25jZSlbMF07CisgICAgICAgICgoVUlOVDMyICopcGMtPm5vbmNlKVsxXSA9ICgoVUlOVDMyICopdG1wX25vbmNlX2xvKVswXTsKKyAgICAgICAgYWVzX2VuY3J5cHRpb24ocGMtPm5vbmNlLCBwYy0+Y2FjaGUsIHBjLT5wcmZfa2V5KTsKKyAgICB9CisgICAgCisjaWYgKFVNQUNfT1VUUFVUX0xFTiA9PSA0KQorICAgICooKFVJTlQzMiAqKWJ1ZikgXj0gKChVSU5UMzIgKilwYy0+Y2FjaGUpW25keF07CisjZWxpZiAoVU1BQ19PVVRQVVRfTEVOID09IDgpCisgICAgKigoVUlOVDY0ICopYnVmKSBePSAoKFVJTlQ2NCAqKXBjLT5jYWNoZSlbbmR4XTsKKyNlbGlmIChVTUFDX09VVFBVVF9MRU4gPT0gMTIpCisgICAgKChVSU5UNjQgKilidWYpWzBdIF49ICgoVUlOVDY0ICopcGMtPmNhY2hlKVswXTsKKyAgICAoKFVJTlQzMiAqKWJ1ZilbMl0gXj0gKChVSU5UMzIgKilwYy0+Y2FjaGUpWzJdOworI2VsaWYgKFVNQUNfT1VUUFVUX0xFTiA9PSAxNikKKyAgICAoKFVJTlQ2NCAqKWJ1ZilbMF0gXj0gKChVSU5UNjQgKilwYy0+Y2FjaGUpWzBdOworICAgICgoVUlOVDY0ICopYnVmKVsxXSBePSAoKFVJTlQ2NCAqKXBjLT5jYWNoZSlbMV07CisjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0gQmVnaW4gTkggSGFzaCBTZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBUaGUgTkgtYmFzZWQgaGFzaCBmdW5jdGlvbnMgdXNlZCBpbiBVTUFDIGFyZSBkZXNjcmliZWQgaW4gdGhlIFVNQUMgcGFwZXIKKyAqIGFuZCBzcGVjaWZpY2F0aW9uLCBib3RoIG9mIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgVU1BQyB3ZWJzaXRlLiAgICAgCisgKiBUaGUgaW50ZXJmYWNlIHRvIHRoaXMgaW1wbGVtZW50YXRpb24gaGFzIHR3byAgICAgICAgIAorICogdmVyc2lvbnMsIG9uZSBleHBlY3RzIHRoZSBlbnRpcmUgbWVzc2FnZSBiZWluZyBoYXNoZWQgdG8gYmUgcGFzc2VkCisgKiBpbiBhIHNpbmdsZSBidWZmZXIgYW5kIHJldHVybnMgdGhlIGhhc2ggcmVzdWx0IGltbWVkaWF0ZWx5LiBUaGUgc2Vjb25kCisgKiBhbGxvd3MgdGhlIG1lc3NhZ2UgdG8gYmUgcGFzc2VkIGluIGEgc2VxdWVuY2Ugb2YgYnVmZmVycy4gSW4gdGhlICAgICAgICAgIAorICogbXVsaXBsZS1idWZmZXIgaW50ZXJmYWNlLCB0aGUgY2xpZW50IGNhbGxzIHRoZSByb3V0aW5lIG5oX3VwZGF0ZSgpIGFzICAgICAKKyAqIG1hbnkgdGltZXMgYXMgbmVjZXNzYXJ5LiBXaGVuIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSB0byBiZSBmZWQgdG8gdGhlICAgCisgKiBoYXNoLCB0aGUgY2xpZW50IGNhbGxzIG5oX2ZpbmFsKCkgd2hpY2ggY2FsY3VsYXRlcyB0aGUgaGFzaCBvdXRwdXQuICAgIAorICogQmVmb3JlIGJlZ2lubmluZyBhbm90aGVyIGhhc2ggY2FsY3VsYXRpb24gdGhlIG5oX3Jlc2V0KCkgcm91dGluZSAgICAgICAKKyAqIG11c3QgYmUgY2FsbGVkLiBUaGUgc2luZ2xlLWJ1ZmZlciByb3V0aW5lLCBuaCgpLCBpcyBlcXVpdmFsZW50IHRvICAKKyAqIHRoZSBzZXF1ZW5jZSBvZiBjYWxscyBuaF91cGRhdGUoKSBhbmQgbmhfZmluYWwoKTsgaG93ZXZlciBpdCBpcyAgICAgICAgCisgKiBvcHRpbWl6ZWQgYW5kIHNob3VsZCBiZSBwcmVmZXJlZCB3aGVuZXZlciB0aGUgbXVsdGlwbGUtYnVmZmVyIGludGVyZmFjZQorICogaXMgbm90IG5lY2Vzc2FyeS4gV2hlbiB1c2luZyBlaXRoZXIgaW50ZXJmYWNlLCBpdCBpcyB0aGUgY2xpZW50J3MgICAgICAgICAKKyAqIHJlc3BvbnNhYmlsaXR5IHRvIHBhc3Mgbm8gbW9yZSB0aGFuIEwxX0tFWV9MRU4gYnl0ZXMgcGVyIGhhc2ggcmVzdWx0LiAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRoZSByb3V0aW5lIG5oX2luaXQoKSBpbml0aWFsaXplcyB0aGUgbmhfY3R4IGRhdGEgc3RydWN0dXJlIGFuZCAgICAgICAgCisgKiBtdXN0IGJlIGNhbGxlZCBvbmNlLCBiZWZvcmUgYW55IG90aGVyIFBERiByb3V0aW5lLiAgICAgICAgICAgICAgICAgICAgIAorICovCisgCisgLyogVGhlICJuaF9hdXgiIHJvdXRpbmVzIGRvIHRoZSBhY3R1YWwgTkggaGFzaGluZyB3b3JrLiBUaGV5CisgICogZXhwZWN0IGJ1ZmZlcnMgdG8gYmUgbXVsdGlwbGVzIG9mIEwxX1BBRF9CT1VOREFSWS4gVGhlc2Ugcm91dGluZXMKKyAgKiBwcm9kdWNlIG91dHB1dCBmb3IgYWxsIFNUUkVBTVMgTkggaXRlcmF0aW9ucyBpbiBvbmUgY2FsbCwgCisgICogYWxsb3dpbmcgdGhlIHBhcmFsbGVsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzdHJlYW1zLgorICAqLworCisjZGVmaW5lIFNUUkVBTVMgKFVNQUNfT1VUUFVUX0xFTiAvIDQpIC8qIE51bWJlciBvZiB0aW1lcyBoYXNoIGlzIGFwcGxpZWQgICovCisjZGVmaW5lIEwxX0tFWV9MRU4gICAgICAgICAxMDI0ICAgICAvKiBJbnRlcm5hbCBrZXkgYnl0ZXMgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEwxX0tFWV9TSElGVCAgICAgICAgIDE2ICAgICAvKiBUb2VwbGl0eiBrZXkgc2hpZnQgYmV0d2VlbiBzdHJlYW1zICovCisjZGVmaW5lIEwxX1BBRF9CT1VOREFSWSAgICAgIDMyICAgICAvKiBwYWQgbWVzc2FnZSB0byBib3VuZGFyeSBtdWx0aXBsZSAgICovCisjZGVmaW5lIEFMTE9DX0JPVU5EQVJZICAgICAgIDE2ICAgICAvKiBLZWVwIGJ1ZmZlcnMgYWxpZ25lZCB0byB0aGlzICAgICAgICovCisjZGVmaW5lIEhBU0hfQlVGX0JZVEVTICAgICAgIDY0ICAgICAvKiBuaF9hdXhfaGIgYnVmZmVyIG11bHRpcGxlICAgICAgICAgICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCAgbmhfa2V5IFtMMV9LRVlfTEVOICsgTDFfS0VZX1NISUZUICogKFNUUkVBTVMgLSAxKV07IC8qIE5IIEtleSAqLworICAgIFVJTlQ4ICBkYXRhICAgW0hBU0hfQlVGX0JZVEVTXTsgICAgLyogSW5jb21pbmcgZGF0YSBidWZmZXIgICAgICAgICAgICovCisgICAgaW50IG5leHRfZGF0YV9lbXB0eTsgICAgLyogQm9va2VlcGluZyB2YXJpYWJsZSBmb3IgZGF0YSBidWZmZXIuICAgICAgICovCisgICAgaW50IGJ5dGVzX2hhc2hlZDsgICAgICAgIC8qIEJ5dGVzIChvdXQgb2YgTDFfS0VZX0xFTikgaW5jb3JwZXJhdGVkLiAgICovCisgICAgVUlOVDY0IHN0YXRlW1NUUkVBTVNdOyAgICAgICAgICAgICAgIC8qIG9uLWxpbmUgc3RhdGUgICAgICovCit9IG5oX2N0eDsKKworCisjaWYgKFVNQUNfT1VUUFVUX0xFTiA9PSA0KQorCitzdGF0aWMgdm9pZCBuaF9hdXgodm9pZCAqa3AsIHZvaWQgKmRwLCB2b2lkICpocCwgVUlOVDMyIGRsZW4pCisvKiBOSCBoYXNoaW5nIHByaW1pdGl2ZS4gUHJldmlvdXMgKHBhcnRpYWwpIGhhc2ggcmVzdWx0IGlzIGxvYWRlZCBhbmQgICAgIAorKiB0aGVuIHN0b3JlZCB2aWEgaHAgcG9pbnRlci4gVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBwb2ludGVkIGF0IGJ5ICJkcCIsCisqICJkbGVuIiwgaXMgZ3VhcmFudGVlZCB0byBiZSBkaXZpc2libGUgYnkgTDFfUEFEX0JPVU5EQVJZICgzMikuICBLZXkKKyogaXMgZXhwZWN0ZWQgdG8gYmUgZW5kaWFuIGNvbXBlbnNhdGVkIGluIG1lbW9yeSBhdCBrZXkgc2V0dXAuICAgIAorKi8KK3sKKyAgICBVSU5UNjQgaDsKKyAgICBVV09SRCBjID0gZGxlbiAvIDMyOworICAgIFVJTlQzMiAqayA9IChVSU5UMzIgKilrcDsKKyAgICBVSU5UMzIgKmQgPSAoVUlOVDMyICopZHA7CisgICAgVUlOVDMyIGQwLGQxLGQyLGQzLGQ0LGQ1LGQ2LGQ3OworICAgIFVJTlQzMiBrMCxrMSxrMixrMyxrNCxrNSxrNixrNzsKKyAgICAKKyAgICBoID0gKigoVUlOVDY0ICopaHApOworICAgIGRvIHsKKyAgICAgICAgZDAgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCswKTsgZDEgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCsxKTsKKyAgICAgICAgZDIgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCsyKTsgZDMgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCszKTsKKyAgICAgICAgZDQgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCs0KTsgZDUgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCs1KTsKKyAgICAgICAgZDYgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCs2KTsgZDcgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCs3KTsKKyAgICAgICAgazAgPSAqKGsrMCk7IGsxID0gKihrKzEpOyBrMiA9ICooaysyKTsgazMgPSAqKGsrMyk7CisgICAgICAgIGs0ID0gKihrKzQpOyBrNSA9ICooays1KTsgazYgPSAqKGsrNik7IGs3ID0gKihrKzcpOworICAgICAgICBoICs9IE1VTDY0KChrMCArIGQwKSwgKGs0ICsgZDQpKTsKKyAgICAgICAgaCArPSBNVUw2NCgoazEgKyBkMSksIChrNSArIGQ1KSk7CisgICAgICAgIGggKz0gTVVMNjQoKGsyICsgZDIpLCAoazYgKyBkNikpOworICAgICAgICBoICs9IE1VTDY0KChrMyArIGQzKSwgKGs3ICsgZDcpKTsKKyAgICAgICAgCisgICAgICAgIGQgKz0gODsKKyAgICAgICAgayArPSA4OworICAgIH0gd2hpbGUgKC0tYyk7CisgICooKFVJTlQ2NCAqKWhwKSA9IGg7Cit9CisKKyNlbGlmIChVTUFDX09VVFBVVF9MRU4gPT0gOCkKKworc3RhdGljIHZvaWQgbmhfYXV4KHZvaWQgKmtwLCB2b2lkICpkcCwgdm9pZCAqaHAsIFVJTlQzMiBkbGVuKQorLyogU2FtZSBhcyBwcmV2aW91cyBuaF9hdXgsIGJ1dCB0d28gc3RyZWFtcyBhcmUgaGFuZGxlZCBpbiBvbmUgcGFzcywKKyAqIHJlYWRpbmcgYW5kIHdyaXRpbmcgMTYgYnl0ZXMgb2YgaGFzaC1zdGF0ZSBwZXIgY2FsbC4KKyAqLworeworICBVSU5UNjQgaDEsaDI7CisgIFVXT1JEIGMgPSBkbGVuIC8gMzI7CisgIFVJTlQzMiAqayA9IChVSU5UMzIgKilrcDsKKyAgVUlOVDMyICpkID0gKFVJTlQzMiAqKWRwOworICBVSU5UMzIgZDAsZDEsZDIsZDMsZDQsZDUsZDYsZDc7CisgIFVJTlQzMiBrMCxrMSxrMixrMyxrNCxrNSxrNixrNywKKyAgICAgICAgazgsazksazEwLGsxMTsKKworICBoMSA9ICooKFVJTlQ2NCAqKWhwKTsKKyAgaDIgPSAqKChVSU5UNjQgKilocCArIDEpOworICBrMCA9ICooayswKTsgazEgPSAqKGsrMSk7IGsyID0gKihrKzIpOyBrMyA9ICooayszKTsKKyAgZG8geworICAgIGQwID0gTE9BRF9VSU5UMzJfTElUVExFKGQrMCk7IGQxID0gTE9BRF9VSU5UMzJfTElUVExFKGQrMSk7CisgICAgZDIgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCsyKTsgZDMgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCszKTsKKyAgICBkNCA9IExPQURfVUlOVDMyX0xJVFRMRShkKzQpOyBkNSA9IExPQURfVUlOVDMyX0xJVFRMRShkKzUpOworICAgIGQ2ID0gTE9BRF9VSU5UMzJfTElUVExFKGQrNik7IGQ3ID0gTE9BRF9VSU5UMzJfTElUVExFKGQrNyk7CisgICAgazQgPSAqKGsrNCk7IGs1ID0gKihrKzUpOyBrNiA9ICooays2KTsgazcgPSAqKGsrNyk7CisgICAgazggPSAqKGsrOCk7IGs5ID0gKihrKzkpOyBrMTAgPSAqKGsrMTApOyBrMTEgPSAqKGsrMTEpOworCisgICAgaDEgKz0gTVVMNjQoKGswICsgZDApLCAoazQgKyBkNCkpOworICAgIGgyICs9IE1VTDY0KChrNCArIGQwKSwgKGs4ICsgZDQpKTsKKworICAgIGgxICs9IE1VTDY0KChrMSArIGQxKSwgKGs1ICsgZDUpKTsKKyAgICBoMiArPSBNVUw2NCgoazUgKyBkMSksIChrOSArIGQ1KSk7CisKKyAgICBoMSArPSBNVUw2NCgoazIgKyBkMiksIChrNiArIGQ2KSk7CisgICAgaDIgKz0gTVVMNjQoKGs2ICsgZDIpLCAoazEwICsgZDYpKTsKKworICAgIGgxICs9IE1VTDY0KChrMyArIGQzKSwgKGs3ICsgZDcpKTsKKyAgICBoMiArPSBNVUw2NCgoazcgKyBkMyksIChrMTEgKyBkNykpOworCisgICAgazAgPSBrODsgazEgPSBrOTsgazIgPSBrMTA7IGszID0gazExOworCisgICAgZCArPSA4OworICAgIGsgKz0gODsKKyAgfSB3aGlsZSAoLS1jKTsKKyAgKChVSU5UNjQgKilocClbMF0gPSBoMTsKKyAgKChVSU5UNjQgKilocClbMV0gPSBoMjsKK30KKworI2VsaWYgKFVNQUNfT1VUUFVUX0xFTiA9PSAxMikKKworc3RhdGljIHZvaWQgbmhfYXV4KHZvaWQgKmtwLCB2b2lkICpkcCwgdm9pZCAqaHAsIFVJTlQzMiBkbGVuKQorLyogU2FtZSBhcyBwcmV2aW91cyBuaF9hdXgsIGJ1dCB0d28gc3RyZWFtcyBhcmUgaGFuZGxlZCBpbiBvbmUgcGFzcywKKyAqIHJlYWRpbmcgYW5kIHdyaXRpbmcgMjQgYnl0ZXMgb2YgaGFzaC1zdGF0ZSBwZXIgY2FsbC4KKyovCit7CisgICAgVUlOVDY0IGgxLGgyLGgzOworICAgIFVXT1JEIGMgPSBkbGVuIC8gMzI7CisgICAgVUlOVDMyICprID0gKFVJTlQzMiAqKWtwOworICAgIFVJTlQzMiAqZCA9IChVSU5UMzIgKilkcDsKKyAgICBVSU5UMzIgZDAsZDEsZDIsZDMsZDQsZDUsZDYsZDc7CisgICAgVUlOVDMyIGswLGsxLGsyLGszLGs0LGs1LGs2LGs3LAorICAgICAgICBrOCxrOSxrMTAsazExLGsxMixrMTMsazE0LGsxNTsKKyAgICAKKyAgICBoMSA9ICooKFVJTlQ2NCAqKWhwKTsKKyAgICBoMiA9ICooKFVJTlQ2NCAqKWhwICsgMSk7CisgICAgaDMgPSAqKChVSU5UNjQgKilocCArIDIpOworICAgIGswID0gKihrKzApOyBrMSA9ICooaysxKTsgazIgPSAqKGsrMik7IGszID0gKihrKzMpOworICAgIGs0ID0gKihrKzQpOyBrNSA9ICooays1KTsgazYgPSAqKGsrNik7IGs3ID0gKihrKzcpOworICAgIGRvIHsKKyAgICAgICAgZDAgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCswKTsgZDEgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCsxKTsKKyAgICAgICAgZDIgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCsyKTsgZDMgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCszKTsKKyAgICAgICAgZDQgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCs0KTsgZDUgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCs1KTsKKyAgICAgICAgZDYgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCs2KTsgZDcgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCs3KTsKKyAgICAgICAgazggPSAqKGsrOCk7IGs5ID0gKihrKzkpOyBrMTAgPSAqKGsrMTApOyBrMTEgPSAqKGsrMTEpOworICAgICAgICBrMTIgPSAqKGsrMTIpOyBrMTMgPSAqKGsrMTMpOyBrMTQgPSAqKGsrMTQpOyBrMTUgPSAqKGsrMTUpOworICAgICAgICAKKyAgICAgICAgaDEgKz0gTVVMNjQoKGswICsgZDApLCAoazQgKyBkNCkpOworICAgICAgICBoMiArPSBNVUw2NCgoazQgKyBkMCksIChrOCArIGQ0KSk7CisgICAgICAgIGgzICs9IE1VTDY0KChrOCArIGQwKSwgKGsxMiArIGQ0KSk7CisgICAgICAgIAorICAgICAgICBoMSArPSBNVUw2NCgoazEgKyBkMSksIChrNSArIGQ1KSk7CisgICAgICAgIGgyICs9IE1VTDY0KChrNSArIGQxKSwgKGs5ICsgZDUpKTsKKyAgICAgICAgaDMgKz0gTVVMNjQoKGs5ICsgZDEpLCAoazEzICsgZDUpKTsKKyAgICAgICAgCisgICAgICAgIGgxICs9IE1VTDY0KChrMiArIGQyKSwgKGs2ICsgZDYpKTsKKyAgICAgICAgaDIgKz0gTVVMNjQoKGs2ICsgZDIpLCAoazEwICsgZDYpKTsKKyAgICAgICAgaDMgKz0gTVVMNjQoKGsxMCArIGQyKSwgKGsxNCArIGQ2KSk7CisgICAgICAgIAorICAgICAgICBoMSArPSBNVUw2NCgoazMgKyBkMyksIChrNyArIGQ3KSk7CisgICAgICAgIGgyICs9IE1VTDY0KChrNyArIGQzKSwgKGsxMSArIGQ3KSk7CisgICAgICAgIGgzICs9IE1VTDY0KChrMTEgKyBkMyksIChrMTUgKyBkNykpOworICAgICAgICAKKyAgICAgICAgazAgPSBrODsgazEgPSBrOTsgazIgPSBrMTA7IGszID0gazExOworICAgICAgICBrNCA9IGsxMjsgazUgPSBrMTM7IGs2ID0gazE0OyBrNyA9IGsxNTsKKyAgICAgICAgCisgICAgICAgIGQgKz0gODsKKyAgICAgICAgayArPSA4OworICAgIH0gd2hpbGUgKC0tYyk7CisgICAgKChVSU5UNjQgKilocClbMF0gPSBoMTsKKyAgICAoKFVJTlQ2NCAqKWhwKVsxXSA9IGgyOworICAgICgoVUlOVDY0ICopaHApWzJdID0gaDM7Cit9CisKKyNlbGlmIChVTUFDX09VVFBVVF9MRU4gPT0gMTYpCisKK3N0YXRpYyB2b2lkIG5oX2F1eCh2b2lkICprcCwgdm9pZCAqZHAsIHZvaWQgKmhwLCBVSU5UMzIgZGxlbikKKy8qIFNhbWUgYXMgcHJldmlvdXMgbmhfYXV4LCBidXQgdHdvIHN0cmVhbXMgYXJlIGhhbmRsZWQgaW4gb25lIHBhc3MsCisgKiByZWFkaW5nIGFuZCB3cml0aW5nIDI0IGJ5dGVzIG9mIGhhc2gtc3RhdGUgcGVyIGNhbGwuCisqLworeworICAgIFVJTlQ2NCBoMSxoMixoMyxoNDsKKyAgICBVV09SRCBjID0gZGxlbiAvIDMyOworICAgIFVJTlQzMiAqayA9IChVSU5UMzIgKilrcDsKKyAgICBVSU5UMzIgKmQgPSAoVUlOVDMyICopZHA7CisgICAgVUlOVDMyIGQwLGQxLGQyLGQzLGQ0LGQ1LGQ2LGQ3OworICAgIFVJTlQzMiBrMCxrMSxrMixrMyxrNCxrNSxrNixrNywKKyAgICAgICAgazgsazksazEwLGsxMSxrMTIsazEzLGsxNCxrMTUsCisgICAgICAgIGsxNixrMTcsazE4LGsxOTsKKyAgICAKKyAgICBoMSA9ICooKFVJTlQ2NCAqKWhwKTsKKyAgICBoMiA9ICooKFVJTlQ2NCAqKWhwICsgMSk7CisgICAgaDMgPSAqKChVSU5UNjQgKilocCArIDIpOworICAgIGg0ID0gKigoVUlOVDY0ICopaHAgKyAzKTsKKyAgICBrMCA9ICooayswKTsgazEgPSAqKGsrMSk7IGsyID0gKihrKzIpOyBrMyA9ICooayszKTsKKyAgICBrNCA9ICooays0KTsgazUgPSAqKGsrNSk7IGs2ID0gKihrKzYpOyBrNyA9ICooays3KTsKKyAgICBkbyB7CisgICAgICAgIGQwID0gTE9BRF9VSU5UMzJfTElUVExFKGQrMCk7IGQxID0gTE9BRF9VSU5UMzJfTElUVExFKGQrMSk7CisgICAgICAgIGQyID0gTE9BRF9VSU5UMzJfTElUVExFKGQrMik7IGQzID0gTE9BRF9VSU5UMzJfTElUVExFKGQrMyk7CisgICAgICAgIGQ0ID0gTE9BRF9VSU5UMzJfTElUVExFKGQrNCk7IGQ1ID0gTE9BRF9VSU5UMzJfTElUVExFKGQrNSk7CisgICAgICAgIGQ2ID0gTE9BRF9VSU5UMzJfTElUVExFKGQrNik7IGQ3ID0gTE9BRF9VSU5UMzJfTElUVExFKGQrNyk7CisgICAgICAgIGs4ID0gKihrKzgpOyBrOSA9ICooays5KTsgazEwID0gKihrKzEwKTsgazExID0gKihrKzExKTsKKyAgICAgICAgazEyID0gKihrKzEyKTsgazEzID0gKihrKzEzKTsgazE0ID0gKihrKzE0KTsgazE1ID0gKihrKzE1KTsKKyAgICAgICAgazE2ID0gKihrKzE2KTsgazE3ID0gKihrKzE3KTsgazE4ID0gKihrKzE4KTsgazE5ID0gKihrKzE5KTsKKyAgICAgICAgCisgICAgICAgIGgxICs9IE1VTDY0KChrMCArIGQwKSwgKGs0ICsgZDQpKTsKKyAgICAgICAgaDIgKz0gTVVMNjQoKGs0ICsgZDApLCAoazggKyBkNCkpOworICAgICAgICBoMyArPSBNVUw2NCgoazggKyBkMCksIChrMTIgKyBkNCkpOworICAgICAgICBoNCArPSBNVUw2NCgoazEyICsgZDApLCAoazE2ICsgZDQpKTsKKyAgICAgICAgCisgICAgICAgIGgxICs9IE1VTDY0KChrMSArIGQxKSwgKGs1ICsgZDUpKTsKKyAgICAgICAgaDIgKz0gTVVMNjQoKGs1ICsgZDEpLCAoazkgKyBkNSkpOworICAgICAgICBoMyArPSBNVUw2NCgoazkgKyBkMSksIChrMTMgKyBkNSkpOworICAgICAgICBoNCArPSBNVUw2NCgoazEzICsgZDEpLCAoazE3ICsgZDUpKTsKKyAgICAgICAgCisgICAgICAgIGgxICs9IE1VTDY0KChrMiArIGQyKSwgKGs2ICsgZDYpKTsKKyAgICAgICAgaDIgKz0gTVVMNjQoKGs2ICsgZDIpLCAoazEwICsgZDYpKTsKKyAgICAgICAgaDMgKz0gTVVMNjQoKGsxMCArIGQyKSwgKGsxNCArIGQ2KSk7CisgICAgICAgIGg0ICs9IE1VTDY0KChrMTQgKyBkMiksIChrMTggKyBkNikpOworICAgICAgICAKKyAgICAgICAgaDEgKz0gTVVMNjQoKGszICsgZDMpLCAoazcgKyBkNykpOworICAgICAgICBoMiArPSBNVUw2NCgoazcgKyBkMyksIChrMTEgKyBkNykpOworICAgICAgICBoMyArPSBNVUw2NCgoazExICsgZDMpLCAoazE1ICsgZDcpKTsKKyAgICAgICAgaDQgKz0gTVVMNjQoKGsxNSArIGQzKSwgKGsxOSArIGQ3KSk7CisgICAgICAgIAorICAgICAgICBrMCA9IGs4OyBrMSA9IGs5OyBrMiA9IGsxMDsgazMgPSBrMTE7CisgICAgICAgIGs0ID0gazEyOyBrNSA9IGsxMzsgazYgPSBrMTQ7IGs3ID0gazE1OworICAgICAgICBrOCA9IGsxNjsgazkgPSBrMTc7IGsxMCA9IGsxODsgazExID0gazE5OworICAgICAgICAKKyAgICAgICAgZCArPSA4OworICAgICAgICBrICs9IDg7CisgICAgfSB3aGlsZSAoLS1jKTsKKyAgICAoKFVJTlQ2NCAqKWhwKVswXSA9IGgxOworICAgICgoVUlOVDY0ICopaHApWzFdID0gaDI7CisgICAgKChVSU5UNjQgKilocClbMl0gPSBoMzsKKyAgICAoKFVJTlQ2NCAqKWhwKVszXSA9IGg0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZW5kaWYgIC8qIFVNQUNfT1VUUFVUX0xFTkdUSCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgbmhfdHJhbnNmb3JtKG5oX2N0eCAqaGMsIFVJTlQ4ICpidWYsIFVJTlQzMiBuYnl0ZXMpCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBmb3IgdGhlIHByaW1pdGl2ZSBOSCBoYXNoIGZ1bmN0aW9ucy4gSXQgdGFrZXMKKyAqIGFzIGFyZ3VtZW50ICJoYyIgdGhlIGN1cnJlbnQgaGFzaCBjb250ZXh0IGFuZCBhIGJ1ZmZlciB3aGljaCBtdXN0IGJlIGEKKyAqIG11bHRpcGxlIG9mIEwxX1BBRF9CT1VOREFSWS4gVGhlIGtleSBwYXNzZWQgdG8gbmhfYXV4IGlzIG9mZnNldAorICogYXBwcm9wcmlhdGVseSBhY2NvcmRpbmcgdG8gaG93IG11Y2ggbWVzc2FnZSBoYXMgYmVlbiBoYXNoZWQgYWxyZWFkeS4KKyAqLworeworICAgIFVJTlQ4ICprZXk7CisgIAorICAgIGtleSA9IGhjLT5uaF9rZXkgKyBoYy0+Ynl0ZXNfaGFzaGVkOworICAgIG5oX2F1eChrZXksIGJ1ZiwgaGMtPnN0YXRlLCBuYnl0ZXMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiAoX19MSVRUTEVfRU5ESUFOX18pCitzdGF0aWMgdm9pZCBlbmRpYW5fY29udmVydCh2b2lkICpidWYsIFVXT1JEIGJwdywgVUlOVDMyIG51bV9ieXRlcykKKy8qIFdlIGVuZGlhbiBjb252ZXJ0IHRoZSBrZXlzIG9uIGxpdHRsZS1lbmRpYW4gY29tcHV0ZXJzIHRvICAgICAgICAgICAgICAgKi8KKy8qIGNvbXBlbnNhdGUgZm9yIHRoZSBsYWNrIG9mIGJpZy1lbmRpYW4gbWVtb3J5IHJlYWRzIGR1cmluZyBoYXNoaW5nLiAgICAgKi8KK3sKKyAgICBVV09SRCBpdGVycyA9IG51bV9ieXRlcyAvIGJwdzsKKyAgICBpZiAoYnB3ID09IDQpIHsKKyAgICAgICAgVUlOVDMyICpwID0gKFVJTlQzMiAqKWJ1ZjsKKyAgICAgICAgZG8geworICAgICAgICAgICAgKnAgPSBMT0FEX1VJTlQzMl9SRVZFUlNFRChwKTsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgfSB3aGlsZSAoLS1pdGVycyk7CisgICAgfSBlbHNlIGlmIChicHcgPT0gOCkgeworICAgICAgICBVSU5UMzIgKnAgPSAoVUlOVDMyICopYnVmOworICAgICAgICBVSU5UMzIgdDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgdCA9IExPQURfVUlOVDMyX1JFVkVSU0VEKHArMSk7CisgICAgICAgICAgICBwWzFdID0gTE9BRF9VSU5UMzJfUkVWRVJTRUQocCk7CisgICAgICAgICAgICBwWzBdID0gdDsKKyAgICAgICAgICAgIHAgKz0gMjsKKyAgICAgICAgfSB3aGlsZSAoLS1pdGVycyk7CisgICAgfQorfQorI2RlZmluZSBlbmRpYW5fY29udmVydF9pZl9sZSh4LHkseikgZW5kaWFuX2NvbnZlcnQoKHgpLCh5KSwoeikpCisjZWxzZQorI2RlZmluZSBlbmRpYW5fY29udmVydF9pZl9sZSh4LHkseikgZG97fXdoaWxlKDApICAvKiBEbyBub3RoaW5nICovCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBuaF9yZXNldChuaF9jdHggKmhjKQorLyogUmVzZXQgbmhfY3R4IHRvIHJlYWR5IGZvciBoYXNoaW5nIG9mIG5ldyBkYXRhICovCit7CisgICAgaGMtPmJ5dGVzX2hhc2hlZCA9IDA7CisgICAgaGMtPm5leHRfZGF0YV9lbXB0eSA9IDA7CisgICAgaGMtPnN0YXRlWzBdID0gMDsKKyNpZiAoVU1BQ19PVVRQVVRfTEVOID49IDgpCisgICAgaGMtPnN0YXRlWzFdID0gMDsKKyNlbmRpZgorI2lmIChVTUFDX09VVFBVVF9MRU4gPj0gMTIpCisgICAgaGMtPnN0YXRlWzJdID0gMDsKKyNlbmRpZgorI2lmIChVTUFDX09VVFBVVF9MRU4gPT0gMTYpCisgICAgaGMtPnN0YXRlWzNdID0gMDsKKyNlbmRpZgorCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgbmhfaW5pdChuaF9jdHggKmhjLCBhZXNfaW50X2tleSBwcmZfa2V5KQorLyogR2VuZXJhdGUgbmhfa2V5LCBlbmRpYW4gY29udmVydCBhbmQgcmVzZXQgdG8gYmUgcmVhZHkgZm9yIGhhc2hpbmcuICAgKi8KK3sKKyAgICBrZGYoaGMtPm5oX2tleSwgcHJmX2tleSwgMSwgc2l6ZW9mKGhjLT5uaF9rZXkpKTsKKyAgICBlbmRpYW5fY29udmVydF9pZl9sZShoYy0+bmhfa2V5LCA0LCBzaXplb2YoaGMtPm5oX2tleSkpOworICAgIG5oX3Jlc2V0KGhjKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBuaF91cGRhdGUobmhfY3R4ICpoYywgVUlOVDggKmJ1ZiwgVUlOVDMyIG5ieXRlcykKKy8qIEluY29ycG9yYXRlIG5ieXRlcyBvZiBkYXRhIGludG8gYSBuaF9jdHgsIGJ1ZmZlciB3aGF0ZXZlciBpcyBub3QgYW4gICAgKi8KKy8qIGV2ZW4gbXVsdGlwbGUgb2YgSEFTSF9CVUZfQllURVMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgICBVSU5UMzIgaSxqOworICAgIAorICAgIGogPSBoYy0+bmV4dF9kYXRhX2VtcHR5OworICAgIGlmICgoaiArIG5ieXRlcykgPj0gSEFTSF9CVUZfQllURVMpIHsKKyAgICAgICAgaWYgKGopIHsKKyAgICAgICAgICAgIGkgPSBIQVNIX0JVRl9CWVRFUyAtIGo7CisgICAgICAgICAgICBtZW1jcHkoaGMtPmRhdGEraiwgYnVmLCBpKTsKKyAgICAgICAgICAgIG5oX3RyYW5zZm9ybShoYyxoYy0+ZGF0YSxIQVNIX0JVRl9CWVRFUyk7CisgICAgICAgICAgICBuYnl0ZXMgLT0gaTsKKyAgICAgICAgICAgIGJ1ZiArPSBpOworICAgICAgICAgICAgaGMtPmJ5dGVzX2hhc2hlZCArPSBIQVNIX0JVRl9CWVRFUzsKKyAgICAgICAgfQorICAgICAgICBpZiAobmJ5dGVzID49IEhBU0hfQlVGX0JZVEVTKSB7CisgICAgICAgICAgICBpID0gbmJ5dGVzICYgfihIQVNIX0JVRl9CWVRFUyAtIDEpOworICAgICAgICAgICAgbmhfdHJhbnNmb3JtKGhjLCBidWYsIGkpOworICAgICAgICAgICAgbmJ5dGVzIC09IGk7CisgICAgICAgICAgICBidWYgKz0gaTsKKyAgICAgICAgICAgIGhjLT5ieXRlc19oYXNoZWQgKz0gaTsKKyAgICAgICAgfQorICAgICAgICBqID0gMDsKKyAgICB9CisgICAgbWVtY3B5KGhjLT5kYXRhICsgaiwgYnVmLCBuYnl0ZXMpOworICAgIGhjLT5uZXh0X2RhdGFfZW1wdHkgPSBqICsgbmJ5dGVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHplcm9fcGFkKFVJTlQ4ICpwLCBpbnQgbmJ5dGVzKQoreworLyogV3JpdGUgIm5ieXRlcyIgb2YgemVyb2VzLCBiZWdpbm5pbmcgYXQgInAiICovCisgICAgaWYgKG5ieXRlcyA+PSAoaW50KXNpemVvZihVV09SRCkpIHsKKyAgICAgICAgd2hpbGUgKChwdHJkaWZmX3QpcCAlIHNpemVvZihVV09SRCkpIHsKKyAgICAgICAgICAgICpwID0gMDsKKyAgICAgICAgICAgIG5ieXRlcy0tOworICAgICAgICAgICAgcCsrOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChuYnl0ZXMgPj0gKGludClzaXplb2YoVVdPUkQpKSB7CisgICAgICAgICAgICAqKFVXT1JEICopcCA9IDA7CisgICAgICAgICAgICBuYnl0ZXMgLT0gc2l6ZW9mKFVXT1JEKTsKKyAgICAgICAgICAgIHAgKz0gc2l6ZW9mKFVXT1JEKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAobmJ5dGVzKSB7CisgICAgICAgICpwID0gMDsKKyAgICAgICAgbmJ5dGVzLS07CisgICAgICAgIHArKzsKKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgbmhfZmluYWwobmhfY3R4ICpoYywgVUlOVDggKnJlc3VsdCkKKy8qIEFmdGVyIHBhc3Npbmcgc29tZSBudW1iZXIgb2YgZGF0YSBidWZmZXJzIHRvIG5oX3VwZGF0ZSgpIGZvciBpbnRlZ3JhdGlvbgorICogaW50byBhbiBOSCBjb250ZXh0LCBuaF9maW5hbCBpcyBjYWxsZWQgdG8gcHJvZHVjZSBhIGhhc2ggcmVzdWx0LiBJZiBhbnkKKyAqIGJ5dGVzIGFyZSBpbiB0aGUgYnVmZmVyIGhjLT5kYXRhLCBpbmNvcnBvcmF0ZSB0aGVtIGludG8gdGhlCisgKiBOSCBjb250ZXh0LiBGaW5hbGx5LCBhZGQgaW50byB0aGUgTkggYWNjdW11bGF0aW9uICJzdGF0ZSIgdGhlIHRvdGFsIG51bWJlcgorICogb2YgYml0cyBoYXNoZWQuIFRoZSByZXN1bHRpbmcgbnVtYmVycyBhcmUgd3JpdHRlbiB0byB0aGUgYnVmZmVyICJyZXN1bHQiLgorICogSWYgbmhfdXBkYXRlIHdhcyBuZXZlciBjYWxsZWQsIEwxX1BBRF9CT1VOREFSWSB6ZXJvZXMgYXJlIGluY29ycG9yYXRlZC4KKyAqLworeworICAgIGludCBuaF9sZW4sIG5iaXRzOworCisgICAgaWYgKGhjLT5uZXh0X2RhdGFfZW1wdHkgIT0gMCkgeworICAgICAgICBuaF9sZW4gPSAoKGhjLT5uZXh0X2RhdGFfZW1wdHkgKyAoTDFfUEFEX0JPVU5EQVJZIC0gMSkpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oTDFfUEFEX0JPVU5EQVJZIC0gMSkpOworICAgICAgICB6ZXJvX3BhZChoYy0+ZGF0YSArIGhjLT5uZXh0X2RhdGFfZW1wdHksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmhfbGVuIC0gaGMtPm5leHRfZGF0YV9lbXB0eSk7CisgICAgICAgIG5oX3RyYW5zZm9ybShoYywgaGMtPmRhdGEsIG5oX2xlbik7CisgICAgICAgIGhjLT5ieXRlc19oYXNoZWQgKz0gaGMtPm5leHRfZGF0YV9lbXB0eTsKKyAgICB9IGVsc2UgaWYgKGhjLT5ieXRlc19oYXNoZWQgPT0gMCkgeworICAgIAluaF9sZW4gPSBMMV9QQURfQk9VTkRBUlk7CisgICAgICAgIHplcm9fcGFkKGhjLT5kYXRhLCBMMV9QQURfQk9VTkRBUlkpOworICAgICAgICBuaF90cmFuc2Zvcm0oaGMsIGhjLT5kYXRhLCBuaF9sZW4pOworICAgIH0KKworICAgIG5iaXRzID0gKGhjLT5ieXRlc19oYXNoZWQgPDwgMyk7CisgICAgKChVSU5UNjQgKilyZXN1bHQpWzBdID0gKChVSU5UNjQgKiloYy0+c3RhdGUpWzBdICsgbmJpdHM7CisjaWYgKFVNQUNfT1VUUFVUX0xFTiA+PSA4KQorICAgICgoVUlOVDY0ICopcmVzdWx0KVsxXSA9ICgoVUlOVDY0ICopaGMtPnN0YXRlKVsxXSArIG5iaXRzOworI2VuZGlmCisjaWYgKFVNQUNfT1VUUFVUX0xFTiA+PSAxMikKKyAgICAoKFVJTlQ2NCAqKXJlc3VsdClbMl0gPSAoKFVJTlQ2NCAqKWhjLT5zdGF0ZSlbMl0gKyBuYml0czsKKyNlbmRpZgorI2lmIChVTUFDX09VVFBVVF9MRU4gPT0gMTYpCisgICAgKChVSU5UNjQgKilyZXN1bHQpWzNdID0gKChVSU5UNjQgKiloYy0+c3RhdGUpWzNdICsgbmJpdHM7CisjZW5kaWYKKyAgICBuaF9yZXNldChoYyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgbmgobmhfY3R4ICpoYywgVUlOVDggKmJ1ZiwgVUlOVDMyIHBhZGRlZF9sZW4sCisgICAgICAgICAgICAgICBVSU5UMzIgdW5wYWRkZWRfbGVuLCBVSU5UOCAqcmVzdWx0KQorLyogQWxsLWluLW9uZSBuaF91cGRhdGUoKSBhbmQgbmhfZmluYWwoKSBlcXVpdmFsZW50LgorICogQXNzdW1lcyB0aGF0IHBhZGRlZF9sZW4gaXMgZGl2aXNpYmxlIGJ5IEwxX1BBRF9CT1VOREFSWSBhbmQgcmVzdWx0IGlzCisgKiB3ZWxsIGFsaWduZWQKKyAqLworeworICAgIFVJTlQzMiBuYml0czsKKyAgICAKKyAgICAvKiBJbml0aWFsaXplIHRoZSBoYXNoIHN0YXRlICovCisgICAgbmJpdHMgPSAodW5wYWRkZWRfbGVuIDw8IDMpOworICAgIAorICAgICgoVUlOVDY0ICopcmVzdWx0KVswXSA9IG5iaXRzOworI2lmIChVTUFDX09VVFBVVF9MRU4gPj0gOCkKKyAgICAoKFVJTlQ2NCAqKXJlc3VsdClbMV0gPSBuYml0czsKKyNlbmRpZgorI2lmIChVTUFDX09VVFBVVF9MRU4gPj0gMTIpCisgICAgKChVSU5UNjQgKilyZXN1bHQpWzJdID0gbmJpdHM7CisjZW5kaWYKKyNpZiAoVU1BQ19PVVRQVVRfTEVOID09IDE2KQorICAgICgoVUlOVDY0ICopcmVzdWx0KVszXSA9IG5iaXRzOworI2VuZGlmCisgICAgCisgICAgbmhfYXV4KGhjLT5uaF9rZXksIGJ1ZiwgcmVzdWx0LCBwYWRkZWRfbGVuKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0gQmVnaW4gVUhBU0ggU2VjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBVSEFTSCBpcyBhIG11bHRpLWxheWVyZWQgYWxnb3JpdGhtLiBEYXRhIHByZXNlbnRlZCB0byBVSEFTSCBpcyBmaXJzdAorICogaGFzaGVkIGJ5IE5ILiBUaGUgTkggb3V0cHV0IGlzIHRoZW4gaGFzaGVkIGJ5IGEgcG9seW5vbWlhbC1oYXNoIGxheWVyCisgKiB1bmxlc3MgdGhlIGluaXRpYWwgZGF0YSB0byBiZSBoYXNoZWQgaXMgc2hvcnQuIEFmdGVyIHRoZSBwb2x5bm9taWFsLQorICogbGF5ZXIsIGFuIGlubmVyLXByb2R1Y3QgaGFzaCBpcyB1c2VkIHRvIHByb2R1Y2UgdGhlIGZpbmFsIFVIQVNIIG91dHB1dC4KKyAqCisgKiBVSEFTSCBwcm92aWRlcyB0d28gaW50ZXJmYWNlcywgb25lIGFsbC1hdC1vbmNlIGFuZCBhbm90aGVyIHdoZXJlIGRhdGEKKyAqIGJ1ZmZlcnMgYXJlIHByZXNlbnRlZCBzZXF1ZW50aWFsbHkuIEluIHRoZSBzZXF1ZW50aWFsIGludGVyZmFjZSwgdGhlCisgKiBVSEFTSCBjbGllbnQgY2FsbHMgdGhlIHJvdXRpbmUgdWhhc2hfdXBkYXRlKCkgYXMgbWFueSB0aW1lcyBhcyBuZWNlc3NhcnkuCisgKiBXaGVuIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSB0byBiZSBmZWQgdG8gVUhBU0gsIHRoZSBjbGllbnQgY2FsbHMKKyAqIHVoYXNoX2ZpbmFsKCkgd2hpY2ggICAgICAgICAgCisgKiBjYWxjdWxhdGVzIHRoZSBVSEFTSCBvdXRwdXQuIEJlZm9yZSBiZWdpbm5pbmcgYW5vdGhlciBVSEFTSCBjYWxjdWxhdGlvbiAgICAKKyAqIHRoZSB1aGFzaF9yZXNldCgpIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQuIFRoZSBhbGwtYXQtb25jZSBVSEFTSCByb3V0aW5lLCAgIAorICogdWhhc2goKSwgaXMgZXF1aXZhbGVudCB0byB0aGUgc2VxdWVuY2Ugb2YgY2FsbHMgdWhhc2hfdXBkYXRlKCkgYW5kICAgICAgICAgCisgKiB1aGFzaF9maW5hbCgpOyBob3dldmVyIGl0IGlzIG9wdGltaXplZCBhbmQgc2hvdWxkIGJlICAgICAgICAgICAgICAgICAgICAgCisgKiB1c2VkIHdoZW5ldmVyIHRoZSBzZXF1ZW50aWFsIGludGVyZmFjZSBpcyBub3QgbmVjZXNzYXJ5LiAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVGhlIHJvdXRpbmUgdWhhc2hfaW5pdCgpIGluaXRpYWxpemVzIHRoZSB1aGFzaF9jdHggZGF0YSBzdHJ1Y3R1cmUgYW5kICAgIAorICogbXVzdCBiZSBjYWxsZWQgb25jZSwgYmVmb3JlIGFueSBvdGhlciBVSEFTSCByb3V0aW5lLgorICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0gQ29uc3RhbnRzIGFuZCB1aGFzaF9jdHggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLSBQb2x5IGhhc2ggYW5kIElubmVyLVByb2R1Y3QgaGFzaCBDb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFByaW1lcyBhbmQgbWFza3MgKi8KKyNkZWZpbmUgcDM2ICAgICgoVUlOVDY0KTB4MDAwMDAwMEZGRkZGRkZGQnVsbCkgICAgICAgICAgICAgIC8qIDJeMzYgLSAgNSAqLworI2RlZmluZSBwNjQgICAgKChVSU5UNjQpMHhGRkZGRkZGRkZGRkZGRkM1dWxsKSAgICAgICAgICAgICAgLyogMl42NCAtIDU5ICovCisjZGVmaW5lIG0zNiAgICAoKFVJTlQ2NCkweDAwMDAwMDBGRkZGRkZGRkZ1bGwpICAvKiBUaGUgbG93IDM2IG9mIDY0IGJpdHMgKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3R5cGVkZWYgc3RydWN0IHVoYXNoX2N0eCB7CisgICAgbmhfY3R4IGhhc2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIYXNoIGNvbnRleHQgZm9yIEwxIE5IIGhhc2ggICovCisgICAgVUlOVDY0IHBvbHlfa2V5XzhbU1RSRUFNU107ICAgICAgICAgICAvKiBwNjQgcG9seSBrZXlzICAgICAgICAgICAgICAgICovCisgICAgVUlOVDY0IHBvbHlfYWNjdW1bU1RSRUFNU107ICAgICAgICAgICAvKiBwb2x5IGhhc2ggcmVzdWx0ICAgICAgICAgICAgICovCisgICAgVUlOVDY0IGlwX2tleXNbU1RSRUFNUyo0XTsgICAgICAgICAgICAvKiBJbm5lci1wcm9kdWN0IGtleXMgICAgICAgICAgICovCisgICAgVUlOVDMyIGlwX3RyYW5zW1NUUkVBTVNdOyAgICAgICAgICAgICAvKiBJbm5lci1wcm9kdWN0IHRyYW5zbGF0aW9uICAgICovCisgICAgVUlOVDMyIG1zZ19sZW47ICAgICAgICAgICAgICAgICAgICAgICAvKiBUb3RhbCBsZW5ndGggb2YgZGF0YSBwYXNzZWQgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0byB1aGFzaCAqLworfSB1aGFzaF9jdHg7Cit0eXBlZGVmIHN0cnVjdCB1aGFzaF9jdHggKnVoYXNoX2N0eF90OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogVGhlIHBvbHlub21pYWwgaGFzaGVzIHVzZSBIb3JuZXIncyBydWxlIHRvIGV2YWx1YXRlIGEgcG9seW5vbWlhbCBvbmUKKyAqIHdvcmQgYXQgYSB0aW1lLiBBcyBkZXNjcmliZWQgaW4gdGhlIHNwZWNpZmljYXRpb24sIHBvbHkzMiBhbmQgcG9seTY0CisgKiByZXF1aXJlIGtleXMgZnJvbSBzcGVjaWFsIGRvbWFpbnMuIFRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb25zIGV4cGxvaXQKKyAqIHRoZSBzcGVjaWFsIGRvbWFpbnMgdG8gYXZvaWQgb3ZlcmZsb3cuIFRoZSByZXN1bHRzIGFyZSBub3QgZ3VhcmFudGVlZCB0bworICogYmUgd2l0aGluIFpfcDMyIGFuZCBaX3A2NCwgYnV0IHRoZSBJbm5lci1Qcm9kdWN0IGhhc2ggaW1wbGVtZW50YXRpb24KKyAqIHBhdGNoZXMgYW55IGVycmFudCB2YWx1ZXMuCisgKi8KKworc3RhdGljIFVJTlQ2NCBwb2x5NjQoVUlOVDY0IGN1ciwgVUlOVDY0IGtleSwgVUlOVDY0IGRhdGEpCit7CisgICAgVUlOVDMyIGtleV9oaSA9IChVSU5UMzIpKGtleSA+PiAzMiksCisgICAgICAgICAgIGtleV9sbyA9IChVSU5UMzIpa2V5LAorICAgICAgICAgICBjdXJfaGkgPSAoVUlOVDMyKShjdXIgPj4gMzIpLAorICAgICAgICAgICBjdXJfbG8gPSAoVUlOVDMyKWN1ciwKKyAgICAgICAgICAgeF9sbywKKyAgICAgICAgICAgeF9oaTsKKyAgICBVSU5UNjQgWCxULHJlczsKKyAgICAKKyAgICBYID0gIE1VTDY0KGtleV9oaSwgY3VyX2xvKSArIE1VTDY0KGN1cl9oaSwga2V5X2xvKTsKKyAgICB4X2xvID0gKFVJTlQzMilYOworICAgIHhfaGkgPSAoVUlOVDMyKShYID4+IDMyKTsKKyAgICAKKyAgICByZXMgPSAoTVVMNjQoa2V5X2hpLCBjdXJfaGkpICsgeF9oaSkgKiA1OSArIE1VTDY0KGtleV9sbywgY3VyX2xvKTsKKyAgICAgCisgICAgVCA9ICgoVUlOVDY0KXhfbG8gPDwgMzIpOworICAgIHJlcyArPSBUOworICAgIGlmIChyZXMgPCBUKQorICAgICAgICByZXMgKz0gNTk7CisKKyAgICByZXMgKz0gZGF0YTsKKyAgICBpZiAocmVzIDwgZGF0YSkKKyAgICAgICAgcmVzICs9IDU5OworCisgICAgcmV0dXJuIHJlczsKK30KKworCisvKiBBbHRob3VnaCBVTUFDIGlzIHNwZWNpZmllZCB0byB1c2UgYSByYW1wZWQgcG9seW5vbWlhbCBoYXNoIHNjaGVtZSwgdGhpcworICogaW1wbGVtZW50YXRpb24gZG9lcyBub3QgaGFuZGxlIGFsbCByYW1wIGxldmVscy4gQmVjYXVzZSB3ZSBkb24ndCBoYW5kbGUKKyAqIHRoZSByYW1wIHVwIHRvIHAxMjggbW9kdWx1cyBpbiB0aGlzIGltcGxlbWVudGF0aW9uLCB3ZSBhcmUgbGltaXRlZCB0bworICogMl4xNCBwb2x5X2hhc2goKSBpbnZvY2F0aW9ucyBwZXIgc3RyZWFtIChmb3IgYSB0b3RhbCBjYXBhY2l0eSBvZiAyXjI0CisgKiBieXRlcyBpbnB1dCB0byBVTUFDIHBlciB0YWcsIGllLiAxNk1CKS4KKyAqLworc3RhdGljIHZvaWQgcG9seV9oYXNoKHVoYXNoX2N0eF90IGhjLCBVSU5UMzIgZGF0YV9pbltdKQoreworICAgIGludCBpOworICAgIFVJTlQ2NCAqZGF0YT0oVUlOVDY0KilkYXRhX2luOworICAgIAorICAgIGZvciAoaSA9IDA7IGkgPCBTVFJFQU1TOyBpKyspIHsKKyAgICAgICAgaWYgKChVSU5UMzIpKGRhdGFbaV0gPj4gMzIpID09IDB4ZmZmZmZmZmZ1bCkgeworICAgICAgICAgICAgaGMtPnBvbHlfYWNjdW1baV0gPSBwb2x5NjQoaGMtPnBvbHlfYWNjdW1baV0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGMtPnBvbHlfa2V5XzhbaV0sIHA2NCAtIDEpOworICAgICAgICAgICAgaGMtPnBvbHlfYWNjdW1baV0gPSBwb2x5NjQoaGMtPnBvbHlfYWNjdW1baV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYy0+cG9seV9rZXlfOFtpXSwgKGRhdGFbaV0gLSA1OSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGMtPnBvbHlfYWNjdW1baV0gPSBwb2x5NjQoaGMtPnBvbHlfYWNjdW1baV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYy0+cG9seV9rZXlfOFtpXSwgZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIFRoZSBmaW5hbCBzdGVwIGluIFVIQVNIIGlzIGFuIGlubmVyLXByb2R1Y3QgaGFzaC4gVGhlIHBvbHkgaGFzaAorICogcHJvZHVjZXMgYSByZXN1bHQgbm90IG5lY2Nlc2FyaWx5IFdPUkRfTEVOIGJ5dGVzIGxvbmcuIFRoZSBpbm5lci0KKyAqIHByb2R1Y3QgaGFzaCBicmVha3MgdGhlIHBvbHloYXNoIG91dHB1dCBpbnRvIDE2LWJpdCBjaHVua3MgYW5kCisgKiBtdWx0aXBsaWVzIGVhY2ggd2l0aCBhIDM2IGJpdCBrZXkuCisgKi8KKworc3RhdGljIFVJTlQ2NCBpcF9hdXgoVUlOVDY0IHQsIFVJTlQ2NCAqaXBrcCwgVUlOVDY0IGRhdGEpCit7CisgICAgdCA9IHQgKyBpcGtwWzBdICogKFVJTlQ2NCkoVUlOVDE2KShkYXRhID4+IDQ4KTsKKyAgICB0ID0gdCArIGlwa3BbMV0gKiAoVUlOVDY0KShVSU5UMTYpKGRhdGEgPj4gMzIpOworICAgIHQgPSB0ICsgaXBrcFsyXSAqIChVSU5UNjQpKFVJTlQxNikoZGF0YSA+PiAxNik7CisgICAgdCA9IHQgKyBpcGtwWzNdICogKFVJTlQ2NCkoVUlOVDE2KShkYXRhKTsKKyAgICAKKyAgICByZXR1cm4gdDsKK30KKworc3RhdGljIFVJTlQzMiBpcF9yZWR1Y2VfcDM2KFVJTlQ2NCB0KQoreworLyogRGl2aXNpb25sZXNzIG1vZHVsYXIgcmVkdWN0aW9uICovCisgICAgVUlOVDY0IHJldDsKKyAgICAKKyAgICByZXQgPSAodCAmIG0zNikgKyA1ICogKHQgPj4gMzYpOworICAgIGlmIChyZXQgPj0gcDM2KQorICAgICAgICByZXQgLT0gcDM2OworCisgICAgLyogcmV0dXJuIGxlYXN0IHNpZ25pZmljYW50IDMyIGJpdHMgKi8KKyAgICByZXR1cm4gKFVJTlQzMikocmV0KTsKK30KKworCisvKiBJZiB0aGUgZGF0YSBiZWluZyBoYXNoZWQgYnkgVUhBU0ggaXMgbm8gbG9uZ2VyIHRoYW4gTDFfS0VZX0xFTiwgdGhlbgorICogdGhlIHBvbHloYXNoIHN0YWdlIGlzIHNraXBwZWQgYW5kIGlwX3Nob3J0IGlzIGFwcGxpZWQgZGlyZWN0bHkgdG8gdGhlCisgKiBOSCBvdXRwdXQuCisgKi8KK3N0YXRpYyB2b2lkIGlwX3Nob3J0KHVoYXNoX2N0eF90IGFoYywgVUlOVDggKm5oX3JlcywgdV9jaGFyICpyZXMpCit7CisgICAgVUlOVDY0IHQ7CisgICAgVUlOVDY0ICpuaHAgPSAoVUlOVDY0ICopbmhfcmVzOworICAgIAorICAgIHQgID0gaXBfYXV4KDAsYWhjLT5pcF9rZXlzLCBuaHBbMF0pOworICAgIFNUT1JFX1VJTlQzMl9CSUcoKFVJTlQzMiAqKXJlcyswLCBpcF9yZWR1Y2VfcDM2KHQpIF4gYWhjLT5pcF90cmFuc1swXSk7CisjaWYgKFVNQUNfT1VUUFVUX0xFTiA+PSA4KQorICAgIHQgID0gaXBfYXV4KDAsYWhjLT5pcF9rZXlzKzQsIG5ocFsxXSk7CisgICAgU1RPUkVfVUlOVDMyX0JJRygoVUlOVDMyICopcmVzKzEsIGlwX3JlZHVjZV9wMzYodCkgXiBhaGMtPmlwX3RyYW5zWzFdKTsKKyNlbmRpZgorI2lmIChVTUFDX09VVFBVVF9MRU4gPj0gMTIpCisgICAgdCAgPSBpcF9hdXgoMCxhaGMtPmlwX2tleXMrOCwgbmhwWzJdKTsKKyAgICBTVE9SRV9VSU5UMzJfQklHKChVSU5UMzIgKilyZXMrMiwgaXBfcmVkdWNlX3AzNih0KSBeIGFoYy0+aXBfdHJhbnNbMl0pOworI2VuZGlmCisjaWYgKFVNQUNfT1VUUFVUX0xFTiA9PSAxNikKKyAgICB0ICA9IGlwX2F1eCgwLGFoYy0+aXBfa2V5cysxMiwgbmhwWzNdKTsKKyAgICBTVE9SRV9VSU5UMzJfQklHKChVSU5UMzIgKilyZXMrMywgaXBfcmVkdWNlX3AzNih0KSBeIGFoYy0+aXBfdHJhbnNbM10pOworI2VuZGlmCit9CisKKy8qIElmIHRoZSBkYXRhIGJlaW5nIGhhc2hlZCBieSBVSEFTSCBpcyBsb25nZXIgdGhhbiBMMV9LRVlfTEVOLCB0aGVuCisgKiB0aGUgcG9seWhhc2ggc3RhZ2UgaXMgbm90IHNraXBwZWQgYW5kIGlwX2xvbmcgaXMgYXBwbGllZCB0byB0aGUKKyAqIHBvbHloYXNoIG91dHB1dC4KKyAqLworc3RhdGljIHZvaWQgaXBfbG9uZyh1aGFzaF9jdHhfdCBhaGMsIHVfY2hhciAqcmVzKQoreworICAgIGludCBpOworICAgIFVJTlQ2NCB0OworCisgICAgZm9yIChpID0gMDsgaSA8IFNUUkVBTVM7IGkrKykgeworICAgICAgICAvKiBmaXggcG9seWhhc2ggb3V0cHV0IG5vdCBpbiBaX3A2NCAqLworICAgICAgICBpZiAoYWhjLT5wb2x5X2FjY3VtW2ldID49IHA2NCkKKyAgICAgICAgICAgIGFoYy0+cG9seV9hY2N1bVtpXSAtPSBwNjQ7CisgICAgICAgIHQgID0gaXBfYXV4KDAsYWhjLT5pcF9rZXlzKyhpKjQpLCBhaGMtPnBvbHlfYWNjdW1baV0pOworICAgICAgICBTVE9SRV9VSU5UMzJfQklHKChVSU5UMzIgKilyZXMraSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgaXBfcmVkdWNlX3AzNih0KSBeIGFoYy0+aXBfdHJhbnNbaV0pOworICAgIH0KK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogUmVzZXQgdWhhc2ggY29udGV4dCBmb3IgbmV4dCBoYXNoIHNlc3Npb24gKi8KK3N0YXRpYyBpbnQgdWhhc2hfcmVzZXQodWhhc2hfY3R4X3QgcGMpCit7CisgICAgbmhfcmVzZXQoJnBjLT5oYXNoKTsKKyAgICBwYy0+bXNnX2xlbiA9IDA7CisgICAgcGMtPnBvbHlfYWNjdW1bMF0gPSAxOworI2lmIChVTUFDX09VVFBVVF9MRU4gPj0gOCkKKyAgICBwYy0+cG9seV9hY2N1bVsxXSA9IDE7CisjZW5kaWYKKyNpZiAoVU1BQ19PVVRQVVRfTEVOID49IDEyKQorICAgIHBjLT5wb2x5X2FjY3VtWzJdID0gMTsKKyNlbmRpZgorI2lmIChVTUFDX09VVFBVVF9MRU4gPT0gMTYpCisgICAgcGMtPnBvbHlfYWNjdW1bM10gPSAxOworI2VuZGlmCisgICAgcmV0dXJuIDE7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogR2l2ZW4gYSBwb2ludGVyIHRvIHRoZSBpbnRlcm5hbCBrZXkgbmVlZGVkIGJ5IGtkZigpIGFuZCBhIHVoYXNoIGNvbnRleHQsCisgKiBpbml0aWFsaXplIHRoZSBOSCBjb250ZXh0IGFuZCBnZW5lcmF0ZSBrZXlzIG5lZWRlZCBmb3IgcG9seSBhbmQgaW5uZXItCisgKiBwcm9kdWN0IGhhc2hpbmcuIEFsbCBrZXlzIGFyZSBlbmRpYW4gYWRqdXN0ZWQgaW4gbWVtb3J5IHNvIHRoYXQgbmF0aXZlCisgKiBsb2FkcyBjYXVzZSBjb3JyZWN0IGtleXMgdG8gYmUgaW4gcmVnaXN0ZXJzIGR1cmluZyBjYWxjdWxhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgdWhhc2hfaW5pdCh1aGFzaF9jdHhfdCBhaGMsIGFlc19pbnRfa2V5IHByZl9rZXkpCit7CisgICAgaW50IGk7CisgICAgVUlOVDggYnVmWyg4KlNUUkVBTVMrNCkqc2l6ZW9mKFVJTlQ2NCldOworICAgIAorICAgIC8qIFplcm8gdGhlIGVudGlyZSB1aGFzaCBjb250ZXh0ICovCisgICAgbWVtc2V0KGFoYywgMCwgc2l6ZW9mKHVoYXNoX2N0eCkpOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgTDEgaGFzaCAqLworICAgIG5oX2luaXQoJmFoYy0+aGFzaCwgcHJmX2tleSk7CisgICAgCisgICAgLyogU2V0dXAgTDIgaGFzaCB2YXJpYWJsZXMgKi8KKyAgICBrZGYoYnVmLCBwcmZfa2V5LCAyLCBzaXplb2YoYnVmKSk7ICAgIC8qIEZpbGwgYnVmZmVyIHdpdGggaW5kZXggMSBrZXkgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgU1RSRUFNUzsgaSsrKSB7CisgICAgICAgIC8qIEZpbGwga2V5cyBmcm9tIHRoZSBidWZmZXIsIHNraXBwaW5nIGJ5dGVzIGluIHRoZSBidWZmZXIgbm90CisgICAgICAgICAqIHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbi4gRW5kaWFuIHJldmVyc2UgdGhlIGtleXMgaWYgb24gYQorICAgICAgICAgKiBsaXR0bGUtZW5kaWFuIGNvbXB1dGVyLgorICAgICAgICAgKi8KKyAgICAgICAgbWVtY3B5KGFoYy0+cG9seV9rZXlfOCtpLCBidWYrMjQqaSwgOCk7CisgICAgICAgIGVuZGlhbl9jb252ZXJ0X2lmX2xlKGFoYy0+cG9seV9rZXlfOCtpLCA4LCA4KTsKKyAgICAgICAgLyogTWFzayB0aGUgNjQtYml0IGtleXMgdG8gdGhlaXIgc3BlY2lhbCBkb21haW4gKi8KKyAgICAgICAgYWhjLT5wb2x5X2tleV84W2ldICY9ICgoVUlOVDY0KTB4MDFmZmZmZmZ1IDw8IDMyKSArIDB4MDFmZmZmZmZ1OworICAgICAgICBhaGMtPnBvbHlfYWNjdW1baV0gPSAxOyAgLyogT3VyIHBvbHloYXNoIHByZXBlbmRzIGEgbm9uLXplcm8gd29yZCAqLworICAgIH0KKyAgICAKKyAgICAvKiBTZXR1cCBMMy0xIGhhc2ggdmFyaWFibGVzICovCisgICAga2RmKGJ1ZiwgcHJmX2tleSwgMywgc2l6ZW9mKGJ1ZikpOyAvKiBGaWxsIGJ1ZmZlciB3aXRoIGluZGV4IDIga2V5ICovCisgICAgZm9yIChpID0gMDsgaSA8IFNUUkVBTVM7IGkrKykKKyAgICAgICAgICBtZW1jcHkoYWhjLT5pcF9rZXlzKzQqaSwgYnVmKyg4KmkrNCkqc2l6ZW9mKFVJTlQ2NCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCpzaXplb2YoVUlOVDY0KSk7CisgICAgZW5kaWFuX2NvbnZlcnRfaWZfbGUoYWhjLT5pcF9rZXlzLCBzaXplb2YoVUlOVDY0KSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhaGMtPmlwX2tleXMpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgU1RSRUFNUyo0OyBpKyspCisgICAgICAgIGFoYy0+aXBfa2V5c1tpXSAlPSBwMzY7ICAvKiBCcmluZyBpbnRvIFpfcDM2ICovCisgICAgCisgICAgLyogU2V0dXAgTDMtMiBoYXNoIHZhcmlhYmxlcyAgICAqLworICAgIC8qIEZpbGwgYnVmZmVyIHdpdGggaW5kZXggNCBrZXkgKi8KKyAgICBrZGYoYWhjLT5pcF90cmFucywgcHJmX2tleSwgNCwgU1RSRUFNUyAqIHNpemVvZihVSU5UMzIpKTsKKyAgICBlbmRpYW5fY29udmVydF9pZl9sZShhaGMtPmlwX3RyYW5zLCBzaXplb2YoVUlOVDMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTVFJFQU1TICogc2l6ZW9mKFVJTlQzMikpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiAwCitzdGF0aWMgdWhhc2hfY3R4X3QgdWhhc2hfYWxsb2ModV9jaGFyIGtleVtdKQoreworLyogQWxsb2NhdGUgbWVtb3J5IGFuZCBmb3JjZSB0byBhIDE2LWJ5dGUgYm91bmRhcnkuICovCisgICAgdWhhc2hfY3R4X3QgY3R4OworICAgIHVfY2hhciBieXRlc190b19hZGQ7CisgICAgYWVzX2ludF9rZXkgcHJmX2tleTsKKyAgICAKKyAgICBjdHggPSAodWhhc2hfY3R4X3QpbWFsbG9jKHNpemVvZih1aGFzaF9jdHgpK0FMTE9DX0JPVU5EQVJZKTsKKyAgICBpZiAoY3R4KSB7CisgICAgICAgIGlmIChBTExPQ19CT1VOREFSWSkgeworICAgICAgICAgICAgYnl0ZXNfdG9fYWRkID0gQUxMT0NfQk9VTkRBUlkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwdHJkaWZmX3QpY3R4ICYgKEFMTE9DX0JPVU5EQVJZIC0xKSk7CisgICAgICAgICAgICBjdHggPSAodWhhc2hfY3R4X3QpKCh1X2NoYXIgKiljdHggKyBieXRlc190b19hZGQpOworICAgICAgICAgICAgKigodV9jaGFyICopY3R4IC0gMSkgPSBieXRlc190b19hZGQ7CisgICAgICAgIH0KKyAgICAgICAgYWVzX2tleV9zZXR1cChrZXkscHJmX2tleSk7CisgICAgICAgIHVoYXNoX2luaXQoY3R4LCBwcmZfa2V5KTsKKyAgICB9CisgICAgcmV0dXJuIChjdHgpOworfQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIDAKK3N0YXRpYyBpbnQgdWhhc2hfZnJlZSh1aGFzaF9jdHhfdCBjdHgpCit7CisvKiBGcmVlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdWhhc2hfYWxsb2MgKi8KKyAgICB1X2NoYXIgYnl0ZXNfdG9fc3ViOworICAgIAorICAgIGlmIChjdHgpIHsKKyAgICAgICAgaWYgKEFMTE9DX0JPVU5EQVJZKSB7CisgICAgICAgICAgICBieXRlc190b19zdWIgPSAqKCh1X2NoYXIgKiljdHggLSAxKTsKKyAgICAgICAgICAgIGN0eCA9ICh1aGFzaF9jdHhfdCkoKHVfY2hhciAqKWN0eCAtIGJ5dGVzX3RvX3N1Yik7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShjdHgpOworICAgIH0KKyAgICByZXR1cm4gKDEpOworfQorI2VuZGlmCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgdWhhc2hfdXBkYXRlKHVoYXNoX2N0eF90IGN0eCwgdV9jaGFyICppbnB1dCwgbG9uZyBsZW4pCisvKiBHaXZlbiBsZW4gYnl0ZXMgb2YgZGF0YSwgd2UgcGFyc2UgaXQgaW50byBMMV9LRVlfTEVOIGNodW5rcyBhbmQKKyAqIGhhc2ggZWFjaCBvbmUgd2l0aCBOSCwgY2FsbGluZyB0aGUgcG9seWhhc2ggb24gZWFjaCBOSCBvdXRwdXQuCisgKi8KK3sKKyAgICBVV09SRCBieXRlc19oYXNoZWQsIGJ5dGVzX3JlbWFpbmluZzsKKyAgICBVSU5UNjQgcmVzdWx0X2J1ZltTVFJFQU1TXTsKKyAgICBVSU5UOCAqbmhfcmVzdWx0ID0gKFVJTlQ4ICopJnJlc3VsdF9idWY7CisgICAgCisgICAgaWYgKGN0eC0+bXNnX2xlbiArIGxlbiA8PSBMMV9LRVlfTEVOKSB7CisgICAgICAgIG5oX3VwZGF0ZSgmY3R4LT5oYXNoLCAoVUlOVDggKilpbnB1dCwgbGVuKTsKKyAgICAgICAgY3R4LT5tc2dfbGVuICs9IGxlbjsKKyAgICB9IGVsc2UgeworICAgIAorICAgICAgICAgYnl0ZXNfaGFzaGVkID0gY3R4LT5tc2dfbGVuICUgTDFfS0VZX0xFTjsKKyAgICAgICAgIGlmIChjdHgtPm1zZ19sZW4gPT0gTDFfS0VZX0xFTikKKyAgICAgICAgICAgICBieXRlc19oYXNoZWQgPSBMMV9LRVlfTEVOOworCisgICAgICAgICBpZiAoYnl0ZXNfaGFzaGVkICsgbGVuID49IEwxX0tFWV9MRU4pIHsKKworICAgICAgICAgICAgIC8qIElmIHNvbWUgYnl0ZXMgaGF2ZSBiZWVuIHBhc3NlZCB0byB0aGUgaGFzaCBmdW5jdGlvbiAgICAgICovCisgICAgICAgICAgICAgLyogdGhlbiB3ZSB3YW50IHRvIHBhc3MgYXQgbW9zdCAoTDFfS0VZX0xFTiAtIGJ5dGVzX2hhc2hlZCkgKi8KKyAgICAgICAgICAgICAvKiBieXRlcyB0byBjb21wbGV0ZSB0aGUgY3VycmVudCBuaF9ibG9jay4gICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgIGlmIChieXRlc19oYXNoZWQpIHsKKyAgICAgICAgICAgICAgICAgYnl0ZXNfcmVtYWluaW5nID0gKEwxX0tFWV9MRU4gLSBieXRlc19oYXNoZWQpOworICAgICAgICAgICAgICAgICBuaF91cGRhdGUoJmN0eC0+aGFzaCwgKFVJTlQ4ICopaW5wdXQsIGJ5dGVzX3JlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgIG5oX2ZpbmFsKCZjdHgtPmhhc2gsIG5oX3Jlc3VsdCk7CisgICAgICAgICAgICAgICAgIGN0eC0+bXNnX2xlbiArPSBieXRlc19yZW1haW5pbmc7CisgICAgICAgICAgICAgICAgIHBvbHlfaGFzaChjdHgsKFVJTlQzMiAqKW5oX3Jlc3VsdCk7CisgICAgICAgICAgICAgICAgIGxlbiAtPSBieXRlc19yZW1haW5pbmc7CisgICAgICAgICAgICAgICAgIGlucHV0ICs9IGJ5dGVzX3JlbWFpbmluZzsKKyAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAvKiBIYXNoIGRpcmVjdGx5IGZyb20gaW5wdXQgc3RyZWFtIGlmIGVub3VnaCBieXRlcyAqLworICAgICAgICAgICAgIHdoaWxlIChsZW4gPj0gTDFfS0VZX0xFTikgeworICAgICAgICAgICAgICAgICBuaCgmY3R4LT5oYXNoLCAoVUlOVDggKilpbnB1dCwgTDFfS0VZX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTDFfS0VZX0xFTiwgbmhfcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgY3R4LT5tc2dfbGVuICs9IEwxX0tFWV9MRU47CisgICAgICAgICAgICAgICAgIGxlbiAtPSBMMV9LRVlfTEVOOworICAgICAgICAgICAgICAgICBpbnB1dCArPSBMMV9LRVlfTEVOOworICAgICAgICAgICAgICAgICBwb2x5X2hhc2goY3R4LChVSU5UMzIgKiluaF9yZXN1bHQpOworICAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgLyogcGFzcyByZW1haW5pbmcgPCBMMV9LRVlfTEVOIGJ5dGVzIG9mIGlucHV0IGRhdGEgdG8gTkggKi8KKyAgICAgICAgIGlmIChsZW4pIHsKKyAgICAgICAgICAgICBuaF91cGRhdGUoJmN0eC0+aGFzaCwgKFVJTlQ4ICopaW5wdXQsIGxlbik7CisgICAgICAgICAgICAgY3R4LT5tc2dfbGVuICs9IGxlbjsKKyAgICAgICAgIH0KKyAgICAgfQorCisgICAgcmV0dXJuICgxKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHVoYXNoX2ZpbmFsKHVoYXNoX2N0eF90IGN0eCwgdV9jaGFyICpyZXMpCisvKiBJbmNvcnBvcmF0ZSBhbnkgcGVuZGluZyBkYXRhLCBwYWQsIGFuZCBnZW5lcmF0ZSB0YWcgKi8KK3sKKyAgICBVSU5UNjQgcmVzdWx0X2J1ZltTVFJFQU1TXTsKKyAgICBVSU5UOCAqbmhfcmVzdWx0ID0gKFVJTlQ4ICopJnJlc3VsdF9idWY7CisKKyAgICBpZiAoY3R4LT5tc2dfbGVuID4gTDFfS0VZX0xFTikgeworICAgICAgICBpZiAoY3R4LT5tc2dfbGVuICUgTDFfS0VZX0xFTikgeworICAgICAgICAgICAgbmhfZmluYWwoJmN0eC0+aGFzaCwgbmhfcmVzdWx0KTsKKyAgICAgICAgICAgIHBvbHlfaGFzaChjdHgsKFVJTlQzMiAqKW5oX3Jlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgaXBfbG9uZyhjdHgsIHJlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbmhfZmluYWwoJmN0eC0+aGFzaCwgbmhfcmVzdWx0KTsKKyAgICAgICAgaXBfc2hvcnQoY3R4LG5oX3Jlc3VsdCwgcmVzKTsKKyAgICB9CisgICAgdWhhc2hfcmVzZXQoY3R4KTsKKyAgICByZXR1cm4gKDEpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiAwCitzdGF0aWMgaW50IHVoYXNoKHVoYXNoX2N0eF90IGFoYywgdV9jaGFyICptc2csIGxvbmcgbGVuLCB1X2NoYXIgKnJlcykKKy8qIGFzc3VtZXMgdGhhdCBtc2cgaXMgaW4gYSB3cml0YWJsZSBidWZmZXIgb2YgbGVuZ3RoIGRpdmlzaWJsZSBieSAqLworLyogTDFfUEFEX0JPVU5EQVJZLiBCeXRlcyBiZXlvbmQgbXNnW2xlbl0gbWF5IGJlIHplcm9lZC4gICAgICAgICAgICovCit7CisgICAgVUlOVDggbmhfcmVzdWx0W1NUUkVBTVMqc2l6ZW9mKFVJTlQ2NCldOworICAgIFVJTlQzMiBuaF9sZW47CisgICAgaW50IGV4dHJhX3plcm9lc19uZWVkZWQ7CisgICAgICAgIAorICAgIC8qIElmIHRoZSBtZXNzYWdlIHRvIGJlIGhhc2hlZCBpcyBubyBsb25nZXIgdGhhbiBMMV9IQVNIX0xFTiwgd2Ugc2tpcAorICAgICAqIHRoZSBwb2x5aGFzaC4KKyAgICAgKi8KKyAgICBpZiAobGVuIDw9IEwxX0tFWV9MRU4pIHsKKyAgICAJaWYgKGxlbiA9PSAwKSAgICAgICAgICAgICAgICAgIC8qIElmIHplcm8gbGVuZ3RoIG1lc3NhZ2VzIHdpbGwgbm90ICovCisgICAgCQluaF9sZW4gPSBMMV9QQURfQk9VTkRBUlk7ICAvKiBiZSBzZWVuLCBjb21tZW50IG91dCB0aGlzIGNhc2UgICAqLyAKKyAgICAJZWxzZQorICAgICAgICAJbmhfbGVuID0gKChsZW4gKyAoTDFfUEFEX0JPVU5EQVJZIC0gMSkpICYgfihMMV9QQURfQk9VTkRBUlkgLSAxKSk7CisgICAgICAgIGV4dHJhX3plcm9lc19uZWVkZWQgPSBuaF9sZW4gLSBsZW47CisgICAgICAgIHplcm9fcGFkKChVSU5UOCAqKW1zZyArIGxlbiwgZXh0cmFfemVyb2VzX25lZWRlZCk7CisgICAgICAgIG5oKCZhaGMtPmhhc2gsIChVSU5UOCAqKW1zZywgbmhfbGVuLCBsZW4sIG5oX3Jlc3VsdCk7CisgICAgICAgIGlwX3Nob3J0KGFoYyxuaF9yZXN1bHQsIHJlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogT3RoZXJ3aXNlLCB3ZSBoYXNoIGVhY2ggTDFfS0VZX0xFTiBjaHVuayB3aXRoIE5ILCBwYXNzaW5nIHRoZSBOSAorICAgICAgICAgKiBvdXRwdXQgdG8gcG9seV9oYXNoKCkuCisgICAgICAgICAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBuaCgmYWhjLT5oYXNoLCAoVUlOVDggKiltc2csIEwxX0tFWV9MRU4sIEwxX0tFWV9MRU4sIG5oX3Jlc3VsdCk7CisgICAgICAgICAgICBwb2x5X2hhc2goYWhjLChVSU5UMzIgKiluaF9yZXN1bHQpOworICAgICAgICAgICAgbGVuIC09IEwxX0tFWV9MRU47CisgICAgICAgICAgICBtc2cgKz0gTDFfS0VZX0xFTjsKKyAgICAgICAgfSB3aGlsZSAobGVuID49IEwxX0tFWV9MRU4pOworICAgICAgICBpZiAobGVuKSB7CisgICAgICAgICAgICBuaF9sZW4gPSAoKGxlbiArIChMMV9QQURfQk9VTkRBUlkgLSAxKSkgJiB+KEwxX1BBRF9CT1VOREFSWSAtIDEpKTsKKyAgICAgICAgICAgIGV4dHJhX3plcm9lc19uZWVkZWQgPSBuaF9sZW4gLSBsZW47CisgICAgICAgICAgICB6ZXJvX3BhZCgoVUlOVDggKiltc2cgKyBsZW4sIGV4dHJhX3plcm9lc19uZWVkZWQpOworICAgICAgICAgICAgbmgoJmFoYy0+aGFzaCwgKFVJTlQ4ICopbXNnLCBuaF9sZW4sIGxlbiwgbmhfcmVzdWx0KTsKKyAgICAgICAgICAgIHBvbHlfaGFzaChhaGMsKFVJTlQzMiAqKW5oX3Jlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBpcF9sb25nKGFoYywgcmVzKTsKKyAgICB9CisgICAgCisgICAgdWhhc2hfcmVzZXQoYWhjKTsKKyAgICByZXR1cm4gMTsKK30KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLSBCZWdpbiBVTUFDIFNlY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFRoZSBVTUFDIGludGVyZmFjZSBoYXMgdHdvIGludGVyZmFjZXMsIGFuIGFsbC1hdC1vbmNlIGludGVyZmFjZSB3aGVyZQorICogdGhlIGVudGlyZSBtZXNzYWdlIHRvIGJlIGF1dGhlbnRpY2F0ZWQgaXMgcGFzc2VkIHRvIFVNQUMgaW4gb25lIGJ1ZmZlciwKKyAqIGFuZCBhIHNlcXVlbnRpYWwgaW50ZXJmYWNlIHdoZXJlIHRoZSBtZXNzYWdlIGlzIHByZXNlbnRlZCBhIGxpdHRsZSBhdCBhICAgCisgKiB0aW1lLiBUaGUgYWxsLWF0LW9uY2UgaXMgbW9yZSBvcHRpbWFpemVkIHRoYW4gdGhlIHNlcXVlbnRpYWwgdmVyc2lvbiBhbmQKKyAqIHNob3VsZCBiZSBwcmVmZXJyZWQgd2hlbiB0aGUgc2VxdWVudGlhbCBpbnRlcmZhY2UgaXMgbm90IHJlcXVpcmVkLiAKKyAqLworc3RydWN0IHVtYWNfY3R4IHsKKyAgICB1aGFzaF9jdHggaGFzaDsgICAgICAgICAgLyogSGFzaCBmdW5jdGlvbiBmb3IgbWVzc2FnZSBjb21wcmVzc2lvbiAgICAqLworICAgIHBkZl9jdHggcGRmOyAgICAgICAgICAgICAvKiBQREYgZm9yIGhhc2hlZCBvdXRwdXQgICAgICAgICAgICAgICAgICAgICovCisgICAgdm9pZCAqZnJlZV9wdHI7ICAgICAgICAgIC8qIEFkZHJlc3MgdG8gZnJlZSB0aGlzIHN0cnVjdCB2aWEgICAgICAgICAgKi8KK30gdW1hY19jdHg7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIDAKK2ludCB1bWFjX3Jlc2V0KHN0cnVjdCB1bWFjX2N0eCAqY3R4KQorLyogUmVzZXQgdGhlIGhhc2ggZnVuY3Rpb24gdG8gYmVnaW4gYSBuZXcgYXV0aGVudGljYXRpb24uICAgICAgICAqLworeworICAgIHVoYXNoX3Jlc2V0KCZjdHgtPmhhc2gpOworICAgIHJldHVybiAoMSk7Cit9CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgdW1hY19kZWxldGUoc3RydWN0IHVtYWNfY3R4ICpjdHgpCisvKiBEZWFsbG9jYXRlIHRoZSBjdHggc3RydWN0dXJlICovCit7CisgICAgaWYgKGN0eCkgeworICAgICAgICBpZiAoQUxMT0NfQk9VTkRBUlkpCisgICAgICAgICAgICBjdHggPSAoc3RydWN0IHVtYWNfY3R4ICopY3R4LT5mcmVlX3B0cjsKKyAgICAgICAgeGZyZWUoY3R4KTsKKyAgICB9CisgICAgcmV0dXJuICgxKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgdW1hY19jdHggKnVtYWNfbmV3KHVfY2hhciBrZXlbXSkKKy8qIER5bmFtaWNhbGx5IGFsbG9jYXRlIGEgdW1hY19jdHggc3RydWN0LCBpbml0aWFsaXplIHZhcmlhYmxlcywgCisgKiBnZW5lcmF0ZSBzdWJrZXlzIGZyb20ga2V5LiBBbGlnbiB0byAxNi1ieXRlIGJvdW5kYXJ5LgorICovCit7CisgICAgc3RydWN0IHVtYWNfY3R4ICpjdHgsICpvY3R4OworICAgIHNpemVfdCBieXRlc190b19hZGQ7CisgICAgYWVzX2ludF9rZXkgcHJmX2tleTsKKyAgICAKKyAgICBvY3R4ID0gY3R4ID0geG1hbGxvYyhzaXplb2YoKmN0eCkgKyBBTExPQ19CT1VOREFSWSk7CisgICAgaWYgKGN0eCkgeworICAgICAgICBpZiAoQUxMT0NfQk9VTkRBUlkpIHsKKyAgICAgICAgICAgIGJ5dGVzX3RvX2FkZCA9IEFMTE9DX0JPVU5EQVJZIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocHRyZGlmZl90KWN0eCAmIChBTExPQ19CT1VOREFSWSAtIDEpKTsKKyAgICAgICAgICAgIGN0eCA9IChzdHJ1Y3QgdW1hY19jdHggKikoKHVfY2hhciAqKWN0eCArIGJ5dGVzX3RvX2FkZCk7CisgICAgICAgIH0KKyAgICAgICAgY3R4LT5mcmVlX3B0ciA9IG9jdHg7CisgICAgICAgIGFlc19rZXlfc2V0dXAoa2V5LHByZl9rZXkpOworICAgICAgICBwZGZfaW5pdCgmY3R4LT5wZGYsIHByZl9rZXkpOworICAgICAgICB1aGFzaF9pbml0KCZjdHgtPmhhc2gsIHByZl9rZXkpOworICAgIH0KKyAgICAgICAgCisgICAgcmV0dXJuIChjdHgpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludCB1bWFjX2ZpbmFsKHN0cnVjdCB1bWFjX2N0eCAqY3R4LCB1X2NoYXIgdGFnW10sIHVfY2hhciBub25jZVs4XSkKKy8qIEluY29ycG9yYXRlIGFueSBwZW5kaW5nIGRhdGEsIHBhZCwgYW5kIGdlbmVyYXRlIHRhZyAqLworeworICAgIHVoYXNoX2ZpbmFsKCZjdHgtPmhhc2gsICh1X2NoYXIgKil0YWcpOworICAgIHBkZl9nZW5feG9yKCZjdHgtPnBkZiwgKFVJTlQ4ICopbm9uY2UsIChVSU5UOCAqKXRhZyk7CisgICAgCisgICAgcmV0dXJuICgxKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgdW1hY191cGRhdGUoc3RydWN0IHVtYWNfY3R4ICpjdHgsIHVfY2hhciAqaW5wdXQsIGxvbmcgbGVuKQorLyogR2l2ZW4gbGVuIGJ5dGVzIG9mIGRhdGEsIHdlIHBhcnNlIGl0IGludG8gTDFfS0VZX0xFTiBjaHVua3MgYW5kICAgKi8KKy8qIGhhc2ggZWFjaCBvbmUsIGNhbGxpbmcgdGhlIFBERiBvbiB0aGUgaGFzaGVkIG91dHB1dCB3aGVuZXZlciB0aGUgaGFzaC0gKi8KKy8qIG91dHB1dCBidWZmZXIgaXMgZnVsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgICB1aGFzaF91cGRhdGUoJmN0eC0+aGFzaCwgaW5wdXQsIGxlbik7CisgICAgcmV0dXJuICgxKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgMAoraW50IHVtYWMoc3RydWN0IHVtYWNfY3R4ICpjdHgsIHVfY2hhciAqaW5wdXQsIAorICAgICAgICAgbG9uZyBsZW4sIHVfY2hhciB0YWdbXSwKKyAgICAgICAgIHVfY2hhciBub25jZVs4XSkKKy8qIEFsbC1pbi1vbmUgdmVyc2lvbiBzaW1wbHkgY2FsbHMgdW1hY191cGRhdGUoKSBhbmQgdW1hY19maW5hbCgpLiAgICAgICAgKi8KK3sKKyAgICB1aGFzaCgmY3R4LT5oYXNoLCBpbnB1dCwgbGVuLCAodV9jaGFyICopdGFnKTsKKyAgICBwZGZfZ2VuX3hvcigmY3R4LT5wZGYsIChVSU5UOCAqKW5vbmNlLCAoVUlOVDggKil0YWcpOworICAgIAorICAgIHJldHVybiAoMSk7Cit9CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0gRW5kIFVNQUMgU2VjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS91bWFjLmggYi9vcGVuc3NoLTYuMHAxL3VtYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTVjNzA1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS91bWFjLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qICRPcGVuQlNEOiB1bWFjLmgsdiAxLjEgMjAwNy8wNi8wNyAxOTozNzozNCBwdmFsY2hldiBFeHAgJCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIAorICogdW1hYy5oIC0tIEMgSW1wbGVtZW50YXRpb24gVU1BQyBNZXNzYWdlIEF1dGhlbnRpY2F0aW9uCisgKgorICogVmVyc2lvbiAwLjkzYSBvZiByZmM0NDE4LnR4dCAtLSAyMDA2IEp1bHkgMTQKKyAqCisgKiBGb3IgYSBmdWxsIGRlc2NyaXB0aW9uIG9mIFVNQUMgbWVzc2FnZSBhdXRoZW50aWNhdGlvbiBzZWUgdGhlIFVNQUMKKyAqIHdvcmxkLXdpZGUtd2ViIHBhZ2UgYXQgaHR0cDovL3d3dy5jcy51Y2RhdmlzLmVkdS9+cm9nYXdheS91bWFjCisgKiBQbGVhc2UgcmVwb3J0IGJ1Z3MgYW5kIHN1Z2dlc3Rpb25zIHRvIHRoZSBVTUFDIHdlYnBhZ2UuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDQgVGVkIEtyb3ZldHoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGggb3Igd2l0aG91dCBmZWUsIGlzIGhlcmVieQorICogZ3JhbnRlZCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcworICogYW5kIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodAorICogaG9sZGVyIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvCisgKiBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKyAqCisgKiBDb21tZW50cyBzaG91bGQgYmUgZGlyZWN0ZWQgdG8gVGVkIEtyb3ZldHogKHRka0BhY20ub3JnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworIAorIC8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSU1QT1JUQU5UIE5PVEVTIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAqCisgICogMSkgVGhpcyB2ZXJzaW9uIGRvZXMgbm90IHdvcmsgcHJvcGVybHkgb24gbWVzc2FnZXMgbGFyZ2VyIHRoYW4gMTZNQgorICAqCisgICogMikgSWYgeW91IHNldCB0aGUgc3dpdGNoIHRvIHVzZSBTU0UyLCB0aGVuIGFsbCBkYXRhIG11c3QgYmUgMTYtYnl0ZQorICAqICAgIGFsaWduZWQKKyAgKgorICAqIDMpIFdoZW4gY2FsbGluZyB0aGUgZnVuY3Rpb24gdW1hYygpLCBpdCBpcyBhc3N1bWVkIHRoYXQgbXNnIGlzIGluCisgICogYSB3cml0YWJsZSBidWZmZXIgb2YgbGVuZ3RoIGRpdmlzaWJsZSBieSAzMiBieXRlcy4gVGhlIG1lc3NhZ2UgaXRzZWxmCisgICogZG9lcyBub3QgaGF2ZSB0byBmaWxsIHRoZSBlbnRpcmUgYnVmZmVyLCBidXQgYnl0ZXMgYmV5b25kIG1zZyBtYXkgYmUKKyAgKiB6ZXJvZWQuCisgICoKKyAgKiA0KSBUd28gZnJlZSBBRVMgaW1wbGVtZW50YXRpb25zIGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbiBvZgorICAqIFVNQUMuIFBhdWxvIEJhcnJldG8ncyB2ZXJzaW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluIGFuZCBjYW4gYmUgZm91bmQKKyAgKiBhdCBodHRwOi8vd3d3LmVzYXQua3VsZXV2ZW4uYWMuYmUvfnJpam1lbi9yaWpuZGFlbC8gKHNlYXJjaCBmb3IKKyAgKiAiQmFycmV0byIpLiBUaGUgb25seSB0d28gZmlsZXMgbmVlZGVkIGFyZSByaWpuZGFlbC1hbGctZnN0LmMgYW5kCisgICogcmlqbmRhZWwtYWxnLWZzdC5oLgorICAqIEJyaWFuIEdsYWRtYW4ncyB2ZXJzaW9uIGlzIGRpc3RyaWJ1dGVkIHdpdGggR05VIFB1YmxpYyBsaXNlbmNlCisgICogYW5kIGNhbiBiZSBmb3VuZCBhdCBodHRwOi8vZnAuZ2xhZG1hbi5wbHVzLmNvbS9BRVMvaW5kZXguaHRtLiBJdAorICAqIGluY2x1ZGVzIGEgZmFzdCBJQS0zMiBhc3NlbWJseSB2ZXJzaW9uLgorICAqCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisjaWZuZGVmIEhFQURFUl9VTUFDX0gKKyNkZWZpbmUgSEVBREVSX1VNQUNfSAorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCB1bWFjX2N0eCAqdW1hY19uZXcodV9jaGFyIGtleVtdKTsKKy8qIER5bmFtaWNhbGx5IGFsbG9jYXRlIGEgdW1hY19jdHggc3RydWN0LCBpbml0aWFsaXplIHZhcmlhYmxlcywgCisgKiBnZW5lcmF0ZSBzdWJrZXlzIGZyb20ga2V5LgorICovCisKKyNpZiAwCitpbnQgdW1hY19yZXNldChzdHJ1Y3QgdW1hY19jdHggKmN0eCk7CisvKiBSZXNldCBhIHVtYWNfY3R4IHRvIGJlZ2luIGF1dGhlbmljYXRpbmcgYSBuZXcgbWVzc2FnZSAqLworI2VuZGlmCisKK2ludCB1bWFjX3VwZGF0ZShzdHJ1Y3QgdW1hY19jdHggKmN0eCwgdV9jaGFyICppbnB1dCwgbG9uZyBsZW4pOworLyogSW5jb3Jwb3JhdGUgbGVuIGJ5dGVzIHBvaW50ZWQgdG8gYnkgaW5wdXQgaW50byBjb250ZXh0IGN0eCAqLworCitpbnQgdW1hY19maW5hbChzdHJ1Y3QgdW1hY19jdHggKmN0eCwgdV9jaGFyIHRhZ1tdLCB1X2NoYXIgbm9uY2VbOF0pOworLyogSW5jb3Jwb3JhdGUgYW55IHBlbmRpbmcgZGF0YSBhbmQgdGhlIGN0ciB2YWx1ZSwgYW5kIHJldHVybiB0YWcuIAorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGVycm9yIGNvZGUgaWYgY3RyIDwgMC4gCisgKi8KKworaW50IHVtYWNfZGVsZXRlKHN0cnVjdCB1bWFjX2N0eCAqY3R4KTsKKy8qIERlYWxsb2NhdGUgdGhlIGNvbnRleHQgc3RydWN0dXJlICovCisKKyNpZiAwCitpbnQgdW1hYyhzdHJ1Y3QgdW1hY19jdHggKmN0eCwgdV9jaGFyICppbnB1dCwgCisgICAgICAgICBsb25nIGxlbiwgdV9jaGFyIHRhZ1tdLAorICAgICAgICAgdV9jaGFyIG5vbmNlWzhdKTsKKy8qIEFsbC1pbi1vbmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGZ1bmN0aW9ucyBSZXNldCwgVXBkYXRlIGFuZCBGaW5hbCAqLworI2VuZGlmCisKKy8qIHVoYXNoLmggKi8KKworCisjaWYgMAordHlwZWRlZiBzdHJ1Y3QgdWhhc2hfY3R4ICp1aGFzaF9jdHhfdDsKKyAgLyogVGhlIHVoYXNoX2N0eCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBieSB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlICAgICovCisgIC8qIFVIQVNIIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIAordWhhc2hfY3R4X3QgdWhhc2hfYWxsb2ModV9jaGFyIGtleVsxNl0pOworICAvKiBEeW5hbWljYWxseSBhbGxvY2F0ZSBhIHVoYXNoX2N0eCBzdHJ1Y3QgYW5kIGdlbmVyYXRlIHN1YmtleXMgdXNpbmcgKi8KKyAgLyogdGhlIGtkZiBhbmQga2RmX2tleSBwYXNzZWQgaW4uIElmIGtkZl9rZXlfbGVuIGlzIDAgdGhlbiBSQzYgaXMgICAgICovCisgIC8qIHVzZWQgdG8gZ2VuZXJhdGUga2V5IHdpdGggYSBmaXhlZCBrZXkuIElmIGtkZl9rZXlfbGVuID4gMCBidXQga2RmICAqLworICAvKiBpcyBOVUxMIHRoZW4gdGhlIGZpcnN0IDE2IGJ5dGVzIHBvaW50ZWQgYXQgYnkga2RmX2tleSBpcyB1c2VkIGFzIGEgKi8KKyAgLyoga2V5IGZvciBhbiBSQzYgYmFzZWQgS0RGLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIAoraW50IHVoYXNoX2ZyZWUodWhhc2hfY3R4X3QgY3R4KTsKKworaW50IHVoYXNoX3NldF9wYXJhbXModWhhc2hfY3R4X3QgY3R4LAorICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgKnBhcmFtcyk7CisKK2ludCB1aGFzaF9yZXNldCh1aGFzaF9jdHhfdCBjdHgpOworCitpbnQgdWhhc2hfdXBkYXRlKHVoYXNoX2N0eF90IGN0eCwKKyAgICAgICAgICAgICAgIHVfY2hhciAgICAgICAqaW5wdXQsCisgICAgICAgICAgICAgICBsb25nICAgICAgICBsZW4pOworCitpbnQgdWhhc2hfZmluYWwodWhhc2hfY3R4X3QgY3R4LAorICAgICAgICAgICAgICB1X2NoYXIgICAgICAgIG91cHV0W10pOworCitpbnQgdWhhc2godWhhc2hfY3R4X3QgY3R4LAorICAgICAgICB1X2NoYXIgICAgICAgKmlucHV0LAorICAgICAgICBsb25nICAgICAgICBsZW4sCisgICAgICAgIHVfY2hhciAgICAgICAgb3V0cHV0W10pOworCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfQorI2VuZGlmCisKKyNlbmRpZiAvKiBIRUFERVJfVU1BQ19IICovCmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3V1ZW5jb2RlLmMgYi9vcGVuc3NoLTYuMHAxL3V1ZW5jb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlkODBkMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gtNi4wcDEvdXVlbmNvZGUuYwpAQCAtMCwwICsxLDk0IEBACisvKiAkT3BlbkJTRDogdXVlbmNvZGUuYyx2IDEuMjYgMjAxMC8wOC8zMSAxMTo1NDo0NSBkam0gRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHJlc29sdi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAidXVlbmNvZGUuaCIKKworLyoKKyAqIEVuY29kZSBiaW5hcnkgJ3NyYycgb2YgbGVuZ3RoICdzcmNsZW5ndGgnLCB3cml0aW5nIGJhc2U2NC1lbmNvZGVkIHRleHQKKyAqIHRvICd0YXJnZXQnIG9mIHNpemUgJ3RhcmdzaXplJy4gV2lsbCBhbHdheXMgbnVsLXRlcm1pbmF0ZSAndGFyZ2V0Jy4KKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBzdG9yZWQgaW4gJ3RhcmdldCcgb3IgLTEgb24gZXJyb3IgKGluYy4KKyAqICd0YXJnc2l6ZScgdG9vIHNtYWxsKS4KKyAqLworaW50Cit1dWVuY29kZShjb25zdCB1X2NoYXIgKnNyYywgdV9pbnQgc3JjbGVuZ3RoLAorICAgIGNoYXIgKnRhcmdldCwgc2l6ZV90IHRhcmdzaXplKQoreworCXJldHVybiBfX2I2NF9udG9wKHNyYywgc3JjbGVuZ3RoLCB0YXJnZXQsIHRhcmdzaXplKTsKK30KKworLyoKKyAqIERlY29kZSBiYXNlNjQtZW5jb2RlZCAnc3JjJyBpbnRvIGJ1ZmZlciAndGFyZ2V0JyBvZiAndGFyZ3NpemUnIGJ5dGVzLgorICogV2lsbCBza2lwIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcworICogc3RvcmVkIGluICd0YXJnZXQnIG9yIC0xIG9uIGVycm9yIChpbmMuIHRhcmdzaXplIHRvbyBzbWFsbCkuCisgKi8KK2ludAordXVkZWNvZGUoY29uc3QgY2hhciAqc3JjLCB1X2NoYXIgKnRhcmdldCwgc2l6ZV90IHRhcmdzaXplKQoreworCWludCBsZW47CisJY2hhciAqZW5jb2RlZCwgKnA7CisKKwkvKiBjb3B5IHRoZSAncmVhZG9ubHknIHNvdXJjZSAqLworCWVuY29kZWQgPSB4c3RyZHVwKHNyYyk7CisJLyogc2tpcCB3aGl0ZXNwYWNlIGFuZCBkYXRhICovCisJZm9yIChwID0gZW5jb2RlZDsgKnAgPT0gJyAnIHx8ICpwID09ICdcdCc7IHArKykKKwkJOworCWZvciAoOyAqcCAhPSAnXDAnICYmICpwICE9ICcgJyAmJiAqcCAhPSAnXHQnOyBwKyspCisJCTsKKwkvKiBhbmQgcmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2UgYmVjYXVzZSBfX2I2NF9wdG9uIG5lZWRzIHRoaXMgKi8KKwkqcCA9ICdcMCc7CisJbGVuID0gX19iNjRfcHRvbihlbmNvZGVkLCB0YXJnZXQsIHRhcmdzaXplKTsKKwl4ZnJlZShlbmNvZGVkKTsKKwlyZXR1cm4gbGVuOworfQorCit2b2lkCitkdW1wX2Jhc2U2NChGSUxFICpmcCwgY29uc3QgdV9jaGFyICpkYXRhLCB1X2ludCBsZW4pCit7CisJY2hhciAqYnVmOworCWludCBpLCBuOworCisJaWYgKGxlbiA+IDY1NTM2KSB7CisJCWZwcmludGYoZnAsICJkdW1wX2Jhc2U2NDogbGVuID4gNjU1MzZcbiIpOworCQlyZXR1cm47CisJfQorCWJ1ZiA9IHhtYWxsb2MoMipsZW4pOworCW4gPSB1dWVuY29kZShkYXRhLCBsZW4sIGJ1ZiwgMipsZW4pOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJZnByaW50ZihmcCwgIiVjIiwgYnVmW2ldKTsKKwkJaWYgKGkgJSA3MCA9PSA2OSkKKwkJCWZwcmludGYoZnAsICJcbiIpOworCX0KKwlpZiAoaSAlIDcwICE9IDY5KQorCQlmcHJpbnRmKGZwLCAiXG4iKTsKKwl4ZnJlZShidWYpOworfQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS91dWVuY29kZS5oIGIvb3BlbnNzaC02LjBwMS91dWVuY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOTg4ODEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3V1ZW5jb2RlLmgKQEAgLTAsMCArMSwyOSBAQAorLyogJE9wZW5CU0Q6IHV1ZW5jb2RlLmgsdiAxLjE0IDIwMTAvMDgvMzEgMTE6NTQ6NDUgZGptIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK2ludAkgdXVlbmNvZGUoY29uc3QgdV9jaGFyICosIHVfaW50LCBjaGFyICosIHNpemVfdCk7CitpbnQJIHV1ZGVjb2RlKGNvbnN0IGNoYXIgKiwgdV9jaGFyICosIHNpemVfdCk7Cit2b2lkCSBkdW1wX2Jhc2U2NChGSUxFICosIGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3ZlcnNpb24uaCBiL29wZW5zc2gtNi4wcDEvdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OTgzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3ZlcnNpb24uaApAQCAtMCwwICsxLDYgQEAKKy8qICRPcGVuQlNEOiB2ZXJzaW9uLmgsdiAxLjY0IDIwMTIvMDIvMDkgMjA6MDA6MTggbWFya3VzIEV4cCAkICovCisKKyNkZWZpbmUgU1NIX1ZFUlNJT04JIk9wZW5TU0hfNi4wIgorCisjZGVmaW5lIFNTSF9QT1JUQUJMRQkicDEiCisjZGVmaW5lIFNTSF9SRUxFQVNFCVNTSF9WRVJTSU9OIFNTSF9QT1JUQUJMRQpkaWZmIC0tZ2l0IGEvb3BlbnNzaC02LjBwMS94bWFsbG9jLmMgYi9vcGVuc3NoLTYuMHAxL3htYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTg1YjRjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnNzaC02LjBwMS94bWFsbG9jLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qICRPcGVuQlNEOiB4bWFsbG9jLmMsdiAxLjI3IDIwMDYvMDgvMDMgMDM6MzQ6NDIgZGVyYWFkdCBFeHAgJCAqLworLyoKKyAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAorICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIFZlcnNpb25zIG9mIG1hbGxvYyBhbmQgZnJpZW5kcyB0aGF0IGNoZWNrIHRoZWlyIHJlc3VsdHMsIGFuZCBuZXZlciByZXR1cm4KKyAqIGZhaWx1cmUgKHRoZXkgY2FsbCBmYXRhbCBpZiB0aGV5IGVuY291bnRlciBhbiBlcnJvcikuCisgKgorICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQorICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKKyAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAibG9nLmgiCisKK3ZvaWQgKgoreG1hbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKwl2b2lkICpwdHI7CisKKwlpZiAoc2l6ZSA9PSAwKQorCQlmYXRhbCgieG1hbGxvYzogemVybyBzaXplIik7CisJcHRyID0gbWFsbG9jKHNpemUpOworCWlmIChwdHIgPT0gTlVMTCkKKwkJZmF0YWwoInhtYWxsb2M6IG91dCBvZiBtZW1vcnkgKGFsbG9jYXRpbmcgJWx1IGJ5dGVzKSIsICh1X2xvbmcpIHNpemUpOworCXJldHVybiBwdHI7Cit9CisKK3ZvaWQgKgoreGNhbGxvYyhzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplKQoreworCXZvaWQgKnB0cjsKKworCWlmIChzaXplID09IDAgfHwgbm1lbWIgPT0gMCkKKwkJZmF0YWwoInhjYWxsb2M6IHplcm8gc2l6ZSIpOworCWlmIChTSVpFX1RfTUFYIC8gbm1lbWIgPCBzaXplKQorCQlmYXRhbCgieGNhbGxvYzogbm1lbWIgKiBzaXplID4gU0laRV9UX01BWCIpOworCXB0ciA9IGNhbGxvYyhubWVtYiwgc2l6ZSk7CisJaWYgKHB0ciA9PSBOVUxMKQorCQlmYXRhbCgieGNhbGxvYzogb3V0IG9mIG1lbW9yeSAoYWxsb2NhdGluZyAlbHUgYnl0ZXMpIiwKKwkJICAgICh1X2xvbmcpKHNpemUgKiBubWVtYikpOworCXJldHVybiBwdHI7Cit9CisKK3ZvaWQgKgoreHJlYWxsb2Modm9pZCAqcHRyLCBzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplKQoreworCXZvaWQgKm5ld19wdHI7CisJc2l6ZV90IG5ld19zaXplID0gbm1lbWIgKiBzaXplOworCisJaWYgKG5ld19zaXplID09IDApCisJCWZhdGFsKCJ4cmVhbGxvYzogemVybyBzaXplIik7CisJaWYgKFNJWkVfVF9NQVggLyBubWVtYiA8IHNpemUpCisJCWZhdGFsKCJ4cmVhbGxvYzogbm1lbWIgKiBzaXplID4gU0laRV9UX01BWCIpOworCWlmIChwdHIgPT0gTlVMTCkKKwkJbmV3X3B0ciA9IG1hbGxvYyhuZXdfc2l6ZSk7CisJZWxzZQorCQluZXdfcHRyID0gcmVhbGxvYyhwdHIsIG5ld19zaXplKTsKKwlpZiAobmV3X3B0ciA9PSBOVUxMKQorCQlmYXRhbCgieHJlYWxsb2M6IG91dCBvZiBtZW1vcnkgKG5ld19zaXplICVsdSBieXRlcykiLAorCQkgICAgKHVfbG9uZykgbmV3X3NpemUpOworCXJldHVybiBuZXdfcHRyOworfQorCit2b2lkCit4ZnJlZSh2b2lkICpwdHIpCit7CisJaWYgKHB0ciA9PSBOVUxMKQorCQlmYXRhbCgieGZyZWU6IE5VTEwgcG9pbnRlciBnaXZlbiBhcyBhcmd1bWVudCIpOworCWZyZWUocHRyKTsKK30KKworY2hhciAqCit4c3RyZHVwKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlzaXplX3QgbGVuOworCWNoYXIgKmNwOworCisJbGVuID0gc3RybGVuKHN0cikgKyAxOworCWNwID0geG1hbGxvYyhsZW4pOworCXN0cmxjcHkoY3AsIHN0ciwgbGVuKTsKKwlyZXR1cm4gY3A7Cit9CisKK2ludAoreGFzcHJpbnRmKGNoYXIgKipyZXQsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJaW50IGk7CisKKwl2YV9zdGFydChhcCwgZm10KTsKKwlpID0gdmFzcHJpbnRmKHJldCwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKworCWlmIChpIDwgMCB8fCAqcmV0ID09IE5VTEwpCisJCWZhdGFsKCJ4YXNwcmludGY6IGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkiKTsKKworCXJldHVybiAoaSk7Cit9CmRpZmYgLS1naXQgYS9vcGVuc3NoLTYuMHAxL3htYWxsb2MuaCBiL29wZW5zc2gtNi4wcDEveG1hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMjE3YTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuc3NoLTYuMHAxL3htYWxsb2MuaApAQCAtMCwwICsxLDI2IEBACisvKiAkT3BlbkJTRDogeG1hbGxvYy5oLHYgMS4xMyAyMDA2LzA4LzAzIDAzOjM0OjQyIGRlcmFhZHQgRXhwICQgKi8KKworLyoKKyAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAorICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIENyZWF0ZWQ6IE1vbiBNYXIgMjAgMjI6MDk6MTcgMTk5NSB5bG8KKyAqCisgKiBWZXJzaW9ucyBvZiBtYWxsb2MgYW5kIGZyaWVuZHMgdGhhdCBjaGVjayB0aGVpciByZXN1bHRzLCBhbmQgbmV2ZXIgcmV0dXJuCisgKiBmYWlsdXJlICh0aGV5IGNhbGwgZmF0YWwgaWYgdGhleSBlbmNvdW50ZXIgYW4gZXJyb3IpLgorICoKKyAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKKyAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCisgKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCisgKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCisgKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCisgKi8KKwordm9pZAkqeG1hbGxvYyhzaXplX3QpOwordm9pZAkqeGNhbGxvYyhzaXplX3QsIHNpemVfdCk7Cit2b2lkCSp4cmVhbGxvYyh2b2lkICosIHNpemVfdCwgc2l6ZV90KTsKK3ZvaWQgICAgIHhmcmVlKHZvaWQgKik7CitjaGFyCSp4c3RyZHVwKGNvbnN0IGNoYXIgKik7CitpbnQJIHhhc3ByaW50ZihjaGFyICoqLCBjb25zdCBjaGFyICosIC4uLikKKyAgICAgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fKChfX2Zvcm1hdF9fIChwcmludGYsIDIsIDMpKSkKKyAgICAgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fKChfX25vbm51bGxfXyAoMikpKTsKZGlmZiAtLWdpdCBhL29wZW5zc2gudGFyLmd6IGIvb3BlbnNzaC50YXIuZ3oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFkMzkwNwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gudGFyLmd6CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29wZW5zc2gudXJsIGIvb3BlbnNzaC51cmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFkMGRiMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gudXJsCkBAIC0wLDAgKzEgQEAKK2Z0cDovL2Z0cC5vcGVuYnNkLm9yZy9wdWIvT3BlbkJTRC9PcGVuU1NIL3BvcnRhYmxlL29wZW5zc2gtNi4wcDEudGFyLmd6CmRpZmYgLS1naXQgYS9vcGVuc3NoLnZlcnNpb24gYi9vcGVuc3NoLnZlcnNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1ZDg3YwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5zc2gudmVyc2lvbgpAQCAtMCwwICsxIEBACis2LjBwMQo=